@leadertechie/personal-site-kit 0.0.0 → 0.1.0-alpha.10
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/dist/api/__tests__/info.test.d.ts +2 -0
- package/dist/api/__tests__/info.test.d.ts.map +1 -0
- package/dist/api/__tests__/utils.test.d.ts +2 -0
- package/dist/api/__tests__/utils.test.d.ts.map +1 -0
- package/dist/api/content-utils.d.ts +27 -0
- package/dist/api/content-utils.d.ts.map +1 -0
- package/dist/api/handlers/{aboutme.d.ts → about-me.d.ts} +1 -1
- package/dist/api/handlers/about-me.d.ts.map +1 -0
- 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/{staticdetails.d.ts → static-details.d.ts} +1 -1
- package/dist/api/handlers/static-details.d.ts.map +1 -0
- package/dist/api/index.d.ts +7 -8
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/website-api.d.ts +10 -0
- package/dist/api/website-api.d.ts.map +1 -0
- package/dist/api.d.ts +2 -0
- package/dist/api.js +19 -589
- package/dist/assets/logo-placeholder.svg +21 -0
- package/dist/chunks/index-CGvOrVf8.js +213 -0
- package/dist/chunks/index-_AMi6ort.js +2690 -0
- package/dist/chunks/site-store-Vqmjjz9c.js +86 -0
- package/dist/chunks/template-C1tMqlPY.js +597 -0
- package/dist/chunks/website-api-CuyeBej-.js +920 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -352
- package/dist/prerender/__tests__/page-content.test.d.ts +2 -0
- package/dist/prerender/__tests__/page-content.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/template.test.d.ts +2 -0
- package/dist/prerender/__tests__/template.test.d.ts.map +1 -0
- package/dist/prerender/data-fetcher.d.ts +19 -0
- package/dist/prerender/data-fetcher.d.ts.map +1 -0
- package/dist/prerender/index.d.ts +5 -4
- package/dist/prerender/index.d.ts.map +1 -1
- package/dist/prerender/{pageContent.d.ts → page-content.d.ts} +1 -1
- package/dist/prerender/page-content.d.ts.map +1 -0
- 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 +26 -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/website-prerender.d.ts +22 -0
- package/dist/prerender/website-prerender.d.ts.map +1 -0
- package/dist/prerender.d.ts +2 -0
- package/dist/prerender.js +163 -151
- package/dist/shared/config/index.d.ts +1 -0
- package/dist/shared/config/index.d.ts.map +1 -1
- package/dist/shared/core/__tests__/theme-toggle.test.d.ts +2 -0
- package/dist/shared/core/__tests__/theme-toggle.test.d.ts.map +1 -0
- package/dist/shared/core/site-store.d.ts +1 -0
- package/dist/shared/core/site-store.d.ts.map +1 -1
- package/dist/shared/index.d.ts +5 -3
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/interfaces/{iFooterLink.d.ts → ifooter-link.d.ts} +1 -1
- package/dist/shared/interfaces/ifooter-link.d.ts.map +1 -0
- package/dist/shared/interfaces/{iRoute.d.ts → iroute.d.ts} +1 -1
- package/dist/shared/interfaces/iroute.d.ts.map +1 -0
- package/dist/shared/{pageContent.d.ts → page-content.d.ts} +4 -3
- package/dist/shared/page-content.d.ts.map +1 -0
- package/dist/shared/router.d.ts +23 -0
- package/dist/shared/router.d.ts.map +1 -0
- package/dist/shared/runtime.d.ts +6 -6
- package/dist/shared/runtime.d.ts.map +1 -1
- package/dist/shared/website-ui.d.ts +32 -0
- package/dist/shared/website-ui.d.ts.map +1 -0
- package/dist/shared.js +13 -8
- package/dist/ui/about-me/api.d.ts.map +1 -0
- package/dist/ui/{aboutme → about-me}/index.d.ts +2 -10
- package/dist/ui/about-me/index.d.ts.map +1 -0
- package/dist/ui/about-me/styles.d.ts.map +1 -0
- 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/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 +1 -1
- 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 +7 -0
- package/dist/ui/index.d.ts.map +1 -0
- 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.d.ts +1 -1
- package/dist/ui.js +17 -818
- package/package.json +35 -12
- package/public/assets/logo-placeholder.svg +21 -0
- package/dist/api/handlers/aboutme.d.ts.map +0 -1
- package/dist/api/handlers/staticdetails.d.ts.map +0 -1
- package/dist/prerender/pageContent.d.ts.map +0 -1
- package/dist/shared/interfaces/iFooterLink.d.ts.map +0 -1
- package/dist/shared/interfaces/iRoute.d.ts.map +0 -1
- package/dist/shared/pageContent.d.ts.map +0 -1
- package/dist/ui/aboutme/api.d.ts.map +0 -1
- package/dist/ui/aboutme/index.d.ts.map +0 -1
- package/dist/ui/aboutme/renderer.d.ts +0 -5
- package/dist/ui/aboutme/renderer.d.ts.map +0 -1
- package/dist/ui/aboutme/styles.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/aboutme.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/staticdetails.ts +0 -48
- package/src/api/index.ts +0 -125
- package/src/api/utils.ts +0 -16
- package/src/prerender/__tests__/pageContent.test.ts +0 -54
- package/src/prerender/__tests__/template.test.ts +0 -54
- package/src/prerender/index.ts +0 -138
- package/src/prerender/pageContent.ts +0 -263
- package/src/prerender/prerender.ts +0 -25
- package/src/prerender/template.ts +0 -65
- 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 -15
- package/src/shared/interfaces/iFooterLink.ts +0 -4
- package/src/shared/interfaces/iRoute.ts +0 -4
- package/src/shared/models/theme-variables.css +0 -25
- package/src/shared/pageContent.ts +0 -209
- package/src/shared/runtime.ts +0 -11
- package/src/shared/template.ts +0 -35
- package/src/styles/markdown.css +0 -129
- package/src/ui/aboutme/api.ts +0 -12
- package/src/ui/aboutme/index.ts +0 -155
- package/src/ui/aboutme/renderer.ts +0 -7
- package/src/ui/aboutme/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/shared → dist}/styles/markdown.css +0 -0
- /package/{src → dist}/styles/theme.css +0 -0
- /package/dist/ui/{aboutme → about-me}/api.d.ts +0 -0
- /package/dist/ui/{aboutme → about-me}/styles.d.ts +0 -0
|
@@ -0,0 +1,2690 @@
|
|
|
1
|
+
import { css, html, LitElement } from "lit";
|
|
2
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
+
import { S as SiteStore } from "./site-store-Vqmjjz9c.js";
|
|
4
|
+
import { MarkdownPipeline } from "@leadertechie/r2tohtml";
|
|
5
|
+
const aboutmeStyles = css`
|
|
6
|
+
:host {
|
|
7
|
+
display: block;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.aboutme {
|
|
11
|
+
display: block;
|
|
12
|
+
padding: 20px;
|
|
13
|
+
max-width: 800px;
|
|
14
|
+
margin: 0 auto;
|
|
15
|
+
line-height: 1.6;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.aboutme h2 {
|
|
19
|
+
color: var(--link-color);
|
|
20
|
+
margin-bottom: 15px;
|
|
21
|
+
font-size: 2em;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.aboutme h3 {
|
|
25
|
+
color: var(--link-color);
|
|
26
|
+
margin-bottom: 10px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.aboutme p {
|
|
30
|
+
margin-bottom: 10px;
|
|
31
|
+
text-align: left;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.aboutme ul {
|
|
35
|
+
list-style-type: disc;
|
|
36
|
+
margin-left: 20px;
|
|
37
|
+
text-align: left;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.aboutme li {
|
|
41
|
+
margin-bottom: 5px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.aboutme .profile-picture {
|
|
45
|
+
width: 150px;
|
|
46
|
+
height: 150px;
|
|
47
|
+
border-radius: 50%;
|
|
48
|
+
object-fit: cover;
|
|
49
|
+
margin-bottom: 20px;
|
|
50
|
+
border: 3px solid var(--link-color);
|
|
51
|
+
box-shadow:
|
|
52
|
+
0 0 0 4px var(--link-color),
|
|
53
|
+
0 8px 16px rgba(0, 0, 0, 0.2),
|
|
54
|
+
0 12px 24px rgba(0, 0, 0, 0.15);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.aboutme .profile-section {
|
|
58
|
+
text-align: center;
|
|
59
|
+
background: var(--card-bg, var(--background-color, #fff));
|
|
60
|
+
border-radius: 16px;
|
|
61
|
+
padding: 2rem;
|
|
62
|
+
box-shadow:
|
|
63
|
+
0 4px 6px rgba(0, 0, 0, 0.07),
|
|
64
|
+
0 10px 20px rgba(0, 0, 0, 0.05);
|
|
65
|
+
margin-bottom: 2rem;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.aboutme .profile-title {
|
|
69
|
+
color: var(--secondary-text, #666);
|
|
70
|
+
margin-bottom: 0;
|
|
71
|
+
text-align: center;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.aboutme h1 {
|
|
75
|
+
margin-bottom: 0.5rem;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.aboutme .loading {
|
|
79
|
+
text-align: center;
|
|
80
|
+
padding: 20px;
|
|
81
|
+
color: var(--text-color);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.aboutme .content-section {
|
|
85
|
+
font-family: Arial, sans-serif;
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
async function fetchAboutMe(url) {
|
|
89
|
+
const res = await fetch(`${url}/api/aboutme`);
|
|
90
|
+
if (!res.ok) throw new Error("Failed to fetch");
|
|
91
|
+
return res.json();
|
|
92
|
+
}
|
|
93
|
+
var __create$f = Object.create;
|
|
94
|
+
var __defProp$f = Object.defineProperty;
|
|
95
|
+
var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
|
|
96
|
+
var __knownSymbol$f = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
97
|
+
var __typeError$f = (msg) => {
|
|
98
|
+
throw TypeError(msg);
|
|
99
|
+
};
|
|
100
|
+
var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
101
|
+
var __name$e = (target, value) => __defProp$f(target, "name", { value, configurable: true });
|
|
102
|
+
var __decoratorStart$f = (base) => [, , , __create$f(base?.[__knownSymbol$f("metadata")] ?? null)];
|
|
103
|
+
var __decoratorStrings$f = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
104
|
+
var __expectFn$f = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$f("Function expected") : fn;
|
|
105
|
+
var __decoratorContext$f = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$f[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$f("Already initialized") : fns.push(__expectFn$f(fn || null)) });
|
|
106
|
+
var __decoratorMetadata$f = (array, target) => __defNormalProp$f(target, __knownSymbol$f("metadata"), array[3]);
|
|
107
|
+
var __runInitializers$f = (array, flags, self, value) => {
|
|
108
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
109
|
+
return value;
|
|
110
|
+
};
|
|
111
|
+
var __decorateElement$f = (array, flags, name, decorators, target, extra) => {
|
|
112
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
113
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings$f[k + 5];
|
|
114
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
115
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc$f(k < 4 ? target : { get [name]() {
|
|
116
|
+
return __privateGet$7(this, extra);
|
|
117
|
+
}, set [name](x) {
|
|
118
|
+
return __privateSet$7(this, extra, x);
|
|
119
|
+
} }, name));
|
|
120
|
+
k ? p && k < 4 && __name$e(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name$e(target, name);
|
|
121
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
122
|
+
ctx = __decoratorContext$f(k, name, done = {}, array[3], extraInitializers);
|
|
123
|
+
if (k) {
|
|
124
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn$6(target, x) : (x) => name in x };
|
|
125
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet$7 : __privateMethod$6)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
126
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet$7(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
127
|
+
}
|
|
128
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
129
|
+
if (k ^ 4 || it === void 0) __expectFn$f(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
130
|
+
else if (typeof it !== "object" || it === null) __typeError$f("Object expected");
|
|
131
|
+
else __expectFn$f(fn = it.get) && (desc.get = fn), __expectFn$f(fn = it.set) && (desc.set = fn), __expectFn$f(fn = it.init) && initializers.unshift(fn);
|
|
132
|
+
}
|
|
133
|
+
return k || __decoratorMetadata$f(array, target), desc && __defProp$f(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
134
|
+
};
|
|
135
|
+
var __accessCheck$7 = (obj, member, msg) => member.has(obj) || __typeError$f("Cannot " + msg);
|
|
136
|
+
var __privateIn$6 = (member, obj) => Object(obj) !== obj ? __typeError$f('Cannot use the "in" operator on this value') : member.has(obj);
|
|
137
|
+
var __privateGet$7 = (obj, member, getter) => (__accessCheck$7(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
138
|
+
var __privateAdd$7 = (obj, member, value) => member.has(obj) ? __typeError$f("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
139
|
+
var __privateSet$7 = (obj, member, value, setter) => (__accessCheck$7(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
140
|
+
var __privateMethod$6 = (obj, member, method) => (__accessCheck$7(obj, member, "access private method"), method);
|
|
141
|
+
var _loading_dec$2, _htmlContent_dec, _profile_dec, _baseUrl_dec, _a$f, _MyAboutme_decorators, _init$f, _baseUrl, _profile, _htmlContent, _loading$2;
|
|
142
|
+
_MyAboutme_decorators = [customElement("my-aboutme")];
|
|
143
|
+
class MyAboutme extends (_a$f = LitElement, _baseUrl_dec = [property({ type: String })], _profile_dec = [state()], _htmlContent_dec = [state()], _loading_dec$2 = [state()], _a$f) {
|
|
144
|
+
constructor() {
|
|
145
|
+
super();
|
|
146
|
+
__privateAdd$7(this, _baseUrl, __runInitializers$f(_init$f, 8, this, "")), __runInitializers$f(_init$f, 11, this);
|
|
147
|
+
__privateAdd$7(this, _profile, __runInitializers$f(_init$f, 12, this, null)), __runInitializers$f(_init$f, 15, this);
|
|
148
|
+
__privateAdd$7(this, _htmlContent, __runInitializers$f(_init$f, 16, this, "")), __runInitializers$f(_init$f, 19, this);
|
|
149
|
+
__privateAdd$7(this, _loading$2, __runInitializers$f(_init$f, 20, this, true)), __runInitializers$f(_init$f, 23, this);
|
|
150
|
+
this.fetcher = fetchAboutMe;
|
|
151
|
+
}
|
|
152
|
+
get apiBaseUrl() {
|
|
153
|
+
return this.baseUrl || this.getAttribute("base-url") || "";
|
|
154
|
+
}
|
|
155
|
+
async connectedCallback() {
|
|
156
|
+
super.connectedCallback();
|
|
157
|
+
if (typeof window !== "undefined" && window.__HYDRATION_DATA__) {
|
|
158
|
+
const hydrationData = window.__HYDRATION_DATA__;
|
|
159
|
+
this.profile = hydrationData.profile;
|
|
160
|
+
this.htmlContent = hydrationData.processedMarkdown;
|
|
161
|
+
this.loading = false;
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.loadContent();
|
|
165
|
+
}
|
|
166
|
+
updated(changedProperties) {
|
|
167
|
+
super.updated(changedProperties);
|
|
168
|
+
if (this.loading === false && this.profile && this.htmlContent) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (changedProperties.has("baseUrl") || changedProperties.has("base-url")) {
|
|
172
|
+
this.loadContent();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async loadContent() {
|
|
176
|
+
const url = this.apiBaseUrl;
|
|
177
|
+
if (!url) {
|
|
178
|
+
this.loading = false;
|
|
179
|
+
this.setFallbackContent();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
this.loading = true;
|
|
184
|
+
const data = await this.fetcher(url);
|
|
185
|
+
this.profile = data.profile;
|
|
186
|
+
this.htmlContent = data.processedMarkdown;
|
|
187
|
+
this.loading = false;
|
|
188
|
+
await this.updateComplete;
|
|
189
|
+
} catch (error) {
|
|
190
|
+
this.loading = false;
|
|
191
|
+
this.setFallbackContent();
|
|
192
|
+
await this.updateComplete;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
setFallbackContent() {
|
|
196
|
+
this.profile = null;
|
|
197
|
+
this.htmlContent = `
|
|
198
|
+
<h2>Profile Not Found</h2>
|
|
199
|
+
<p>Your about-me profile has not been initialized yet. Please run the seed command to get started:</p>
|
|
200
|
+
<pre>npm run seed -- <username> '<password>'</pre>
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
203
|
+
render() {
|
|
204
|
+
if (this.loading) {
|
|
205
|
+
return html`<div class="aboutme"><div class="loading">Loading...</div></div>`;
|
|
206
|
+
}
|
|
207
|
+
if (!this.profile) {
|
|
208
|
+
return html`<div class="aboutme"><div class="content-section" .innerHTML="${this.htmlContent}"></div></div>`;
|
|
209
|
+
}
|
|
210
|
+
const profileImageUrl = this.profile.profileImageUrl ? this.profile.profileImageUrl.startsWith("http") || this.profile.profileImageUrl.startsWith("/") ? this.profile.profileImageUrl : `${this.apiBaseUrl}/api/images/${this.profile.profileImageUrl}` : "";
|
|
211
|
+
return html`
|
|
212
|
+
<div class="aboutme">
|
|
213
|
+
<div class="profile-section">
|
|
214
|
+
${profileImageUrl ? html`
|
|
215
|
+
<img src="${profileImageUrl}" alt="${this.profile.name}"
|
|
216
|
+
class="profile-picture">
|
|
217
|
+
` : ""}
|
|
218
|
+
<h1>${this.profile.name}</h1>
|
|
219
|
+
<p class="profile-title">${this.profile.title} • ${this.profile.experience}</p>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="content-section" .innerHTML="${this.htmlContent}"></div>
|
|
222
|
+
</div>
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
_init$f = __decoratorStart$f(_a$f);
|
|
227
|
+
_baseUrl = /* @__PURE__ */ new WeakMap();
|
|
228
|
+
_profile = /* @__PURE__ */ new WeakMap();
|
|
229
|
+
_htmlContent = /* @__PURE__ */ new WeakMap();
|
|
230
|
+
_loading$2 = /* @__PURE__ */ new WeakMap();
|
|
231
|
+
__decorateElement$f(_init$f, 4, "baseUrl", _baseUrl_dec, MyAboutme, _baseUrl);
|
|
232
|
+
__decorateElement$f(_init$f, 4, "profile", _profile_dec, MyAboutme, _profile);
|
|
233
|
+
__decorateElement$f(_init$f, 4, "htmlContent", _htmlContent_dec, MyAboutme, _htmlContent);
|
|
234
|
+
__decorateElement$f(_init$f, 4, "loading", _loading_dec$2, MyAboutme, _loading$2);
|
|
235
|
+
MyAboutme = __decorateElement$f(_init$f, 0, "MyAboutme", _MyAboutme_decorators, MyAboutme);
|
|
236
|
+
MyAboutme.styles = aboutmeStyles;
|
|
237
|
+
__runInitializers$f(_init$f, 1, MyAboutme);
|
|
238
|
+
const adminStyles = css`
|
|
239
|
+
:host {
|
|
240
|
+
display: block;
|
|
241
|
+
width: 100%;
|
|
242
|
+
max-width: 100%;
|
|
243
|
+
padding: 20px;
|
|
244
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
245
|
+
color: var(--text-color, #213547);
|
|
246
|
+
background-color: var(--background-color, #fff);
|
|
247
|
+
min-height: 100vh;
|
|
248
|
+
box-sizing: border-box;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
*, *::before, *::after {
|
|
252
|
+
box-sizing: border-box;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.container {
|
|
256
|
+
width: 100%;
|
|
257
|
+
max-width: 900px;
|
|
258
|
+
margin: 0 auto;
|
|
259
|
+
padding: 1rem;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.login-box {
|
|
263
|
+
border: 1px solid var(--border-color, #e0e0e0);
|
|
264
|
+
padding: 3rem 2.5rem;
|
|
265
|
+
border-radius: 16px;
|
|
266
|
+
width: 100%;
|
|
267
|
+
max-width: 420px;
|
|
268
|
+
margin: 80px auto;
|
|
269
|
+
text-align: center;
|
|
270
|
+
background: var(--card-bg, #fff);
|
|
271
|
+
box-shadow: 0 4px 6px rgba(0,0,0,0.07), 0 10px 20px rgba(0,0,0,0.05);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.login-box h2 {
|
|
275
|
+
margin: 0 0 0.5rem 0;
|
|
276
|
+
font-size: 1.75rem;
|
|
277
|
+
font-weight: 600;
|
|
278
|
+
color: var(--text-color, #213547);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.login-box p {
|
|
282
|
+
color: var(--secondary-text, #666);
|
|
283
|
+
margin-bottom: 1.5rem;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.nav-tabs {
|
|
287
|
+
display: flex;
|
|
288
|
+
gap: 8px;
|
|
289
|
+
margin-bottom: 24px;
|
|
290
|
+
flex-wrap: wrap;
|
|
291
|
+
padding: 0.5rem;
|
|
292
|
+
background: var(--card-bg, #fff);
|
|
293
|
+
border-radius: 12px;
|
|
294
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
|
|
295
|
+
width: 100%;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.nav-tab {
|
|
299
|
+
padding: 0.6rem 1.25rem;
|
|
300
|
+
border: none;
|
|
301
|
+
border-radius: 8px;
|
|
302
|
+
cursor: pointer;
|
|
303
|
+
background: transparent;
|
|
304
|
+
color: var(--text-color, #213547);
|
|
305
|
+
font-size: 0.95rem;
|
|
306
|
+
font-weight: 500;
|
|
307
|
+
transition: all 0.2s ease;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.nav-tab:hover {
|
|
311
|
+
background: var(--nav-link-hover-bg, #f0f0f0);
|
|
312
|
+
color: var(--link-color, #646cff);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.nav-tab.active {
|
|
316
|
+
background: var(--link-color, #646cff);
|
|
317
|
+
color: white;
|
|
318
|
+
box-shadow: 0 2px 8px rgba(100, 108, 255, 0.3);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.section {
|
|
322
|
+
width: 100%;
|
|
323
|
+
border: none;
|
|
324
|
+
padding: 24px;
|
|
325
|
+
border-radius: 16px;
|
|
326
|
+
background: var(--card-bg, #fff);
|
|
327
|
+
box-shadow: 0 4px 6px rgba(0,0,0,0.07), 0 10px 20px rgba(0,0,0,0.05);
|
|
328
|
+
margin-bottom: 20px;
|
|
329
|
+
min-height: 450px;
|
|
330
|
+
box-sizing: border-box;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.section h3 {
|
|
334
|
+
margin: 0 0 0.5rem 0;
|
|
335
|
+
font-size: 1.25rem;
|
|
336
|
+
font-weight: 600;
|
|
337
|
+
color: var(--text-color, #213547);
|
|
338
|
+
display: flex;
|
|
339
|
+
align-items: center;
|
|
340
|
+
gap: 0.5rem;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.file-list {
|
|
344
|
+
margin-top: 20px;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.file-item {
|
|
348
|
+
display: flex;
|
|
349
|
+
justify-content: space-between;
|
|
350
|
+
align-items: center;
|
|
351
|
+
padding: 12px 16px;
|
|
352
|
+
border-bottom: 1px solid var(--border-color, #eee);
|
|
353
|
+
border-radius: 8px;
|
|
354
|
+
transition: background 0.15s ease;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.file-item:hover {
|
|
358
|
+
background: var(--nav-link-hover-bg, #f8f9fa);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.file-item:last-child {
|
|
362
|
+
border-bottom: none;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
button {
|
|
366
|
+
cursor: pointer;
|
|
367
|
+
padding: 10px 20px;
|
|
368
|
+
border-radius: 8px;
|
|
369
|
+
font-weight: 500;
|
|
370
|
+
font-size: 0.95rem;
|
|
371
|
+
transition: all 0.2s ease;
|
|
372
|
+
border: none;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.btn-primary {
|
|
376
|
+
background: var(--link-color, #646cff);
|
|
377
|
+
color: white;
|
|
378
|
+
box-shadow: 0 2px 4px rgba(100, 108, 255, 0.25);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.btn-primary:hover {
|
|
382
|
+
background: var(--link-hover-color, #535bf2);
|
|
383
|
+
transform: translateY(-1px);
|
|
384
|
+
box-shadow: 0 4px 8px rgba(100, 108, 255, 0.3);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.btn-danger {
|
|
388
|
+
color: #dc3545;
|
|
389
|
+
background: transparent;
|
|
390
|
+
border: 1px solid #dc3545;
|
|
391
|
+
padding: 6px 12px;
|
|
392
|
+
font-size: 0.85rem;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.btn-danger:hover {
|
|
396
|
+
background: #dc3545;
|
|
397
|
+
color: white;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.btn-secondary {
|
|
401
|
+
background: var(--nav-link-hover-bg, #f0f0f0);
|
|
402
|
+
color: var(--text-color, #333);
|
|
403
|
+
border: none;
|
|
404
|
+
font-size: 0.85rem;
|
|
405
|
+
padding: 8px 16px;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
.btn-secondary:hover {
|
|
409
|
+
background: #e0e0e0;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
input[type="text"], input[type="password"], input[type="file"] {
|
|
413
|
+
padding: 12px 14px;
|
|
414
|
+
width: 100%;
|
|
415
|
+
box-sizing: border-box;
|
|
416
|
+
margin-bottom: 12px;
|
|
417
|
+
border: 2px solid var(--border-color, #e0e0e0);
|
|
418
|
+
border-radius: 10px;
|
|
419
|
+
background-color: var(--background-color, #fff);
|
|
420
|
+
color: var(--text-color, #213547);
|
|
421
|
+
font-size: 0.95rem;
|
|
422
|
+
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
input[type="text"]:focus, input[type="password"]:focus {
|
|
426
|
+
outline: none;
|
|
427
|
+
border-color: var(--link-color, #646cff);
|
|
428
|
+
box-shadow: 0 0 0 3px rgba(100, 108, 255, 0.15);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
input[type="file"] {
|
|
432
|
+
padding: 10px;
|
|
433
|
+
border-style: dashed;
|
|
434
|
+
cursor: pointer;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
input[type="file"]:hover {
|
|
438
|
+
border-color: var(--link-color, #646cff);
|
|
439
|
+
background: rgba(100, 108, 255, 0.03);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.help-text {
|
|
443
|
+
color: var(--secondary-text, #666);
|
|
444
|
+
font-size: 0.9rem;
|
|
445
|
+
margin-bottom: 16px;
|
|
446
|
+
line-height: 1.5;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.status-message {
|
|
450
|
+
padding: 12px 16px;
|
|
451
|
+
border-radius: 8px;
|
|
452
|
+
margin-bottom: 16px;
|
|
453
|
+
font-size: 0.9rem;
|
|
454
|
+
background: var(--nav-link-hover-bg, #f5f5f5);
|
|
455
|
+
color: var(--text-color, #333);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.status-message.success {
|
|
459
|
+
background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
|
|
460
|
+
color: #2e7d32;
|
|
461
|
+
border: 1px solid #a5d6a7;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.status-message.error {
|
|
465
|
+
background: linear-gradient(135deg, #ffebee, #ffcdd2);
|
|
466
|
+
color: #c62828;
|
|
467
|
+
border: 1px solid #ef9a9a;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
.header {
|
|
471
|
+
display: flex;
|
|
472
|
+
justify-content: space-between;
|
|
473
|
+
align-items: center;
|
|
474
|
+
margin-bottom: 24px;
|
|
475
|
+
padding-bottom: 16px;
|
|
476
|
+
border-bottom: 2px solid var(--border-color, #eee);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.header h1 {
|
|
480
|
+
margin: 0;
|
|
481
|
+
font-size: 1.5rem;
|
|
482
|
+
font-weight: 600;
|
|
483
|
+
color: var(--text-color, #213547);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.mt-1 { margin-top: 12px; }
|
|
487
|
+
.mb-1 { margin-bottom: 1rem; }
|
|
488
|
+
|
|
489
|
+
@media (max-width: 600px) {
|
|
490
|
+
.container {
|
|
491
|
+
padding: 0.5rem;
|
|
492
|
+
}
|
|
493
|
+
.section {
|
|
494
|
+
padding: 16px;
|
|
495
|
+
}
|
|
496
|
+
.nav-tabs {
|
|
497
|
+
gap: 4px;
|
|
498
|
+
padding: 8px;
|
|
499
|
+
}
|
|
500
|
+
.nav-tab {
|
|
501
|
+
padding: 8px 12px;
|
|
502
|
+
font-size: 0.85rem;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
`;
|
|
506
|
+
class AdminApiService {
|
|
507
|
+
constructor(apiUrl) {
|
|
508
|
+
this.apiUrl = apiUrl;
|
|
509
|
+
}
|
|
510
|
+
async checkAuthStatus() {
|
|
511
|
+
const res = await fetch(`${this.apiUrl}/api/auth/status`);
|
|
512
|
+
if (!res.ok) throw new Error("Auth status check failed");
|
|
513
|
+
return res.json();
|
|
514
|
+
}
|
|
515
|
+
async tryAutoLogin() {
|
|
516
|
+
const res = await fetch(`${this.apiUrl}/api/content`, {
|
|
517
|
+
credentials: "include"
|
|
518
|
+
});
|
|
519
|
+
if (!res.ok) throw new Error("Auto login failed");
|
|
520
|
+
return res.json();
|
|
521
|
+
}
|
|
522
|
+
async login(username, password) {
|
|
523
|
+
const res = await fetch(`${this.apiUrl}/api/auth/login`, {
|
|
524
|
+
method: "POST",
|
|
525
|
+
credentials: "include",
|
|
526
|
+
headers: { "Content-Type": "application/json" },
|
|
527
|
+
body: JSON.stringify({ username, password })
|
|
528
|
+
});
|
|
529
|
+
if (!res.ok) {
|
|
530
|
+
const data = await res.json();
|
|
531
|
+
throw new Error(data.error || "Login failed");
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
async setup(username, password) {
|
|
535
|
+
const res = await fetch(`${this.apiUrl}/api/auth/setup`, {
|
|
536
|
+
method: "POST",
|
|
537
|
+
credentials: "include",
|
|
538
|
+
headers: { "Content-Type": "application/json" },
|
|
539
|
+
body: JSON.stringify({ username, password })
|
|
540
|
+
});
|
|
541
|
+
if (!res.ok) {
|
|
542
|
+
const data = await res.json();
|
|
543
|
+
throw new Error(data.error || "Setup failed");
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
async logout() {
|
|
547
|
+
await fetch(`${this.apiUrl}/api/auth/logout`, {
|
|
548
|
+
method: "POST",
|
|
549
|
+
credentials: "include"
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
async fetchContent() {
|
|
553
|
+
const res = await fetch(`${this.apiUrl}/api/content`, {
|
|
554
|
+
credentials: "include"
|
|
555
|
+
});
|
|
556
|
+
if (!res.ok) throw new Error("Failed to fetch content");
|
|
557
|
+
return res.json();
|
|
558
|
+
}
|
|
559
|
+
async fetchStaticDetails() {
|
|
560
|
+
const res = await fetch(`${this.apiUrl}/api/static`, {
|
|
561
|
+
credentials: "include"
|
|
562
|
+
});
|
|
563
|
+
if (!res.ok) throw new Error("Failed to fetch static details");
|
|
564
|
+
return res.json();
|
|
565
|
+
}
|
|
566
|
+
async uploadContent(key, file) {
|
|
567
|
+
const res = await fetch(`${this.apiUrl}/api/content/${key}`, {
|
|
568
|
+
method: "PUT",
|
|
569
|
+
credentials: "include",
|
|
570
|
+
body: file
|
|
571
|
+
});
|
|
572
|
+
if (!res.ok) throw new Error("Upload failed");
|
|
573
|
+
}
|
|
574
|
+
async deleteContent(key) {
|
|
575
|
+
const res = await fetch(`${this.apiUrl}/api/content/${key}`, {
|
|
576
|
+
method: "DELETE",
|
|
577
|
+
credentials: "include"
|
|
578
|
+
});
|
|
579
|
+
if (!res.ok) throw new Error("Delete failed");
|
|
580
|
+
}
|
|
581
|
+
async clearCache() {
|
|
582
|
+
const res = await fetch(`${this.apiUrl}/api/cache-clear`, {
|
|
583
|
+
method: "POST",
|
|
584
|
+
credentials: "include"
|
|
585
|
+
});
|
|
586
|
+
if (!res.ok) throw new Error("Failed to clear cache");
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
var __create$e = Object.create;
|
|
590
|
+
var __defProp$e = Object.defineProperty;
|
|
591
|
+
var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
|
|
592
|
+
var __knownSymbol$e = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
593
|
+
var __typeError$e = (msg) => {
|
|
594
|
+
throw TypeError(msg);
|
|
595
|
+
};
|
|
596
|
+
var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
597
|
+
var __decoratorStart$e = (base) => [, , , __create$e(base?.[__knownSymbol$e("metadata")] ?? null)];
|
|
598
|
+
var __decoratorStrings$e = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
599
|
+
var __expectFn$e = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$e("Function expected") : fn;
|
|
600
|
+
var __decoratorContext$e = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$e[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$e("Already initialized") : fns.push(__expectFn$e(fn || null)) });
|
|
601
|
+
var __decoratorMetadata$e = (array, target) => __defNormalProp$e(target, __knownSymbol$e("metadata"), array[3]);
|
|
602
|
+
var __runInitializers$e = (array, flags, self, value) => {
|
|
603
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
604
|
+
return value;
|
|
605
|
+
};
|
|
606
|
+
var __decorateElement$e = (array, flags, name, decorators, target, extra) => {
|
|
607
|
+
var fn, it, done, ctx, access, k = flags & 7, s = false, p = false;
|
|
608
|
+
var j = array.length + 1, key = __decoratorStrings$e[k + 5];
|
|
609
|
+
var initializers = array[j - 1] = [], extraInitializers = array[j] || (array[j] = []);
|
|
610
|
+
var desc = (target = target.prototype, __getOwnPropDesc$e({ get [name]() {
|
|
611
|
+
return __privateGet$6(this, extra);
|
|
612
|
+
}, set [name](x) {
|
|
613
|
+
return __privateSet$6(this, extra, x);
|
|
614
|
+
} }, name));
|
|
615
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
616
|
+
ctx = __decoratorContext$e(k, name, done = {}, array[3], extraInitializers);
|
|
617
|
+
{
|
|
618
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: (x) => name in x };
|
|
619
|
+
access.get = (x) => x[name];
|
|
620
|
+
access.set = (x, y) => x[name] = y;
|
|
621
|
+
}
|
|
622
|
+
it = (0, decorators[i])({ get: desc.get, set: desc.set }, ctx), done._ = 1;
|
|
623
|
+
if (it === void 0) __expectFn$e(it) && (desc[key] = it);
|
|
624
|
+
else if (typeof it !== "object" || it === null) __typeError$e("Object expected");
|
|
625
|
+
else __expectFn$e(fn = it.get) && (desc.get = fn), __expectFn$e(fn = it.set) && (desc.set = fn), __expectFn$e(fn = it.init) && initializers.unshift(fn);
|
|
626
|
+
}
|
|
627
|
+
return desc && __defProp$e(target, name, desc), target;
|
|
628
|
+
};
|
|
629
|
+
var __accessCheck$6 = (obj, member, msg) => member.has(obj) || __typeError$e("Cannot " + msg);
|
|
630
|
+
var __privateGet$6 = (obj, member, getter) => (__accessCheck$6(obj, member, "read from private field"), member.get(obj));
|
|
631
|
+
var __privateAdd$6 = (obj, member, value) => member.has(obj) ? __typeError$e("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
632
|
+
var __privateSet$6 = (obj, member, value, setter) => (__accessCheck$6(obj, member, "write to private field"), member.set(obj, value), value);
|
|
633
|
+
var _onStatusMessage_dec, _onDelete_dec, _onUpload_dec, _staticDetails_dec$1, _contentList_dec$1, _a$e, _init$e, _contentList$1, _staticDetails$1, _onUpload, _onDelete, _onStatusMessage;
|
|
634
|
+
class AdminSection extends (_a$e = LitElement, _contentList_dec$1 = [property({ type: Array })], _staticDetails_dec$1 = [property({ type: Object })], _onUpload_dec = [property({ type: Function })], _onDelete_dec = [property({ type: Function })], _onStatusMessage_dec = [property({ type: Function })], _a$e) {
|
|
635
|
+
constructor() {
|
|
636
|
+
super(...arguments);
|
|
637
|
+
__privateAdd$6(this, _contentList$1, __runInitializers$e(_init$e, 8, this, [])), __runInitializers$e(_init$e, 11, this);
|
|
638
|
+
__privateAdd$6(this, _staticDetails$1, __runInitializers$e(_init$e, 12, this, {})), __runInitializers$e(_init$e, 15, this);
|
|
639
|
+
__privateAdd$6(this, _onUpload, __runInitializers$e(_init$e, 16, this, async () => {
|
|
640
|
+
})), __runInitializers$e(_init$e, 19, this);
|
|
641
|
+
__privateAdd$6(this, _onDelete, __runInitializers$e(_init$e, 20, this, async () => {
|
|
642
|
+
})), __runInitializers$e(_init$e, 23, this);
|
|
643
|
+
__privateAdd$6(this, _onStatusMessage, __runInitializers$e(_init$e, 24, this, () => {
|
|
644
|
+
})), __runInitializers$e(_init$e, 27, this);
|
|
645
|
+
}
|
|
646
|
+
getContent(key) {
|
|
647
|
+
return this.contentList.find((c) => c.key === key);
|
|
648
|
+
}
|
|
649
|
+
getSectionFiles(prefix) {
|
|
650
|
+
return this.contentList.filter((c) => c.key.startsWith(prefix));
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
_init$e = __decoratorStart$e(_a$e);
|
|
654
|
+
_contentList$1 = /* @__PURE__ */ new WeakMap();
|
|
655
|
+
_staticDetails$1 = /* @__PURE__ */ new WeakMap();
|
|
656
|
+
_onUpload = /* @__PURE__ */ new WeakMap();
|
|
657
|
+
_onDelete = /* @__PURE__ */ new WeakMap();
|
|
658
|
+
_onStatusMessage = /* @__PURE__ */ new WeakMap();
|
|
659
|
+
__decorateElement$e(_init$e, 4, "contentList", _contentList_dec$1, AdminSection, _contentList$1);
|
|
660
|
+
__decorateElement$e(_init$e, 4, "staticDetails", _staticDetails_dec$1, AdminSection, _staticDetails$1);
|
|
661
|
+
__decorateElement$e(_init$e, 4, "onUpload", _onUpload_dec, AdminSection, _onUpload);
|
|
662
|
+
__decorateElement$e(_init$e, 4, "onDelete", _onDelete_dec, AdminSection, _onDelete);
|
|
663
|
+
__decorateElement$e(_init$e, 4, "onStatusMessage", _onStatusMessage_dec, AdminSection, _onStatusMessage);
|
|
664
|
+
__decoratorMetadata$e(_init$e, AdminSection);
|
|
665
|
+
AdminSection.styles = css`
|
|
666
|
+
:host {
|
|
667
|
+
display: block;
|
|
668
|
+
width: 100%;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
.section {
|
|
672
|
+
width: 100%;
|
|
673
|
+
border: none;
|
|
674
|
+
padding: 24px;
|
|
675
|
+
border-radius: 16px;
|
|
676
|
+
background: var(--card-bg, #fff);
|
|
677
|
+
box-shadow: 0 4px 6px rgba(0,0,0,0.07), 0 10px 20px rgba(0,0,0,0.05);
|
|
678
|
+
margin-bottom: 20px;
|
|
679
|
+
min-height: 450px;
|
|
680
|
+
box-sizing: border-box;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
.section h3 {
|
|
684
|
+
margin: 0 0 0.5rem 0;
|
|
685
|
+
font-size: 1.25rem;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.help-text {
|
|
689
|
+
color: var(--secondary-text, #666);
|
|
690
|
+
margin-bottom: 1rem;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.current-file {
|
|
694
|
+
margin-bottom: 1rem;
|
|
695
|
+
padding: 1rem;
|
|
696
|
+
background: var(--nav-link-hover-bg, #f5f5f5);
|
|
697
|
+
border-radius: 8px;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
input[type="text"],
|
|
701
|
+
input[type="file"] {
|
|
702
|
+
width: 100%;
|
|
703
|
+
padding: 10px;
|
|
704
|
+
margin-bottom: 1rem;
|
|
705
|
+
border: 1px solid var(--border-color);
|
|
706
|
+
border-radius: 4px;
|
|
707
|
+
background: var(--background-color);
|
|
708
|
+
color: var(--text-color);
|
|
709
|
+
box-sizing: border-box;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
input[type="file"] {
|
|
713
|
+
margin-bottom: 1rem;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
button {
|
|
717
|
+
padding: 10px 20px;
|
|
718
|
+
border: none;
|
|
719
|
+
border-radius: 4px;
|
|
720
|
+
cursor: pointer;
|
|
721
|
+
font-size: 1rem;
|
|
722
|
+
transition: background-color 0.3s ease;
|
|
723
|
+
margin-right: 10px;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
.btn-primary {
|
|
727
|
+
background: var(--link-color, #646cff);
|
|
728
|
+
color: white;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
.btn-primary:hover {
|
|
732
|
+
background: var(--link-hover-color, #535bf2);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
.btn-secondary {
|
|
736
|
+
background: var(--nav-link-hover-bg, #f0f0f0);
|
|
737
|
+
color: var(--text-color, #213547);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
.btn-secondary:hover {
|
|
741
|
+
background: var(--border-color, #e0e0e0);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
.btn-danger {
|
|
745
|
+
background: #dc3545;
|
|
746
|
+
color: white;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
.btn-danger:hover {
|
|
750
|
+
background: #c82333;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
.file-list {
|
|
754
|
+
margin-top: 1rem;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
.file-item {
|
|
758
|
+
display: flex;
|
|
759
|
+
justify-content: space-between;
|
|
760
|
+
align-items: center;
|
|
761
|
+
padding: 0.5rem;
|
|
762
|
+
border-bottom: 1px solid var(--border-color, #eee);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
.file-item:last-child {
|
|
766
|
+
border-bottom: none;
|
|
767
|
+
}
|
|
768
|
+
`;
|
|
769
|
+
var __create$d = Object.create;
|
|
770
|
+
var __defProp$d = Object.defineProperty;
|
|
771
|
+
var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
|
|
772
|
+
var __knownSymbol$d = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
773
|
+
var __typeError$d = (msg) => {
|
|
774
|
+
throw TypeError(msg);
|
|
775
|
+
};
|
|
776
|
+
var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
777
|
+
var __name$d = (target, value) => __defProp$d(target, "name", { value, configurable: true });
|
|
778
|
+
var __decoratorStart$d = (base) => [, , , __create$d(base?.[__knownSymbol$d("metadata")] ?? null)];
|
|
779
|
+
var __decoratorStrings$d = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
780
|
+
var __expectFn$d = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$d("Function expected") : fn;
|
|
781
|
+
var __decoratorContext$d = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$d[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$d("Already initialized") : fns.push(__expectFn$d(fn || null)) });
|
|
782
|
+
var __decoratorMetadata$d = (array, target) => __defNormalProp$d(target, __knownSymbol$d("metadata"), array[3]);
|
|
783
|
+
var __runInitializers$d = (array, flags, self, value) => {
|
|
784
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
785
|
+
return value;
|
|
786
|
+
};
|
|
787
|
+
var __decorateElement$d = (array, flags, name, decorators, target, extra) => {
|
|
788
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
789
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings$d[k + 5];
|
|
790
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
791
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc$d(k < 4 ? target : { get [name]() {
|
|
792
|
+
return __privateGet$5(this, extra);
|
|
793
|
+
}, set [name](x) {
|
|
794
|
+
return __privateSet$5(this, extra, x);
|
|
795
|
+
} }, name));
|
|
796
|
+
k ? p && k < 4 && __name$d(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name$d(target, name);
|
|
797
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
798
|
+
ctx = __decoratorContext$d(k, name, done = {}, array[3], extraInitializers);
|
|
799
|
+
if (k) {
|
|
800
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn$5(target, x) : (x) => name in x };
|
|
801
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet$5 : __privateMethod$5)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
802
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet$5(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
803
|
+
}
|
|
804
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
805
|
+
if (k ^ 4 || it === void 0) __expectFn$d(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
806
|
+
else if (typeof it !== "object" || it === null) __typeError$d("Object expected");
|
|
807
|
+
else __expectFn$d(fn = it.get) && (desc.get = fn), __expectFn$d(fn = it.set) && (desc.set = fn), __expectFn$d(fn = it.init) && initializers.unshift(fn);
|
|
808
|
+
}
|
|
809
|
+
return k || __decoratorMetadata$d(array, target), desc && __defProp$d(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
810
|
+
};
|
|
811
|
+
var __accessCheck$5 = (obj, member, msg) => member.has(obj) || __typeError$d("Cannot " + msg);
|
|
812
|
+
var __privateIn$5 = (member, obj) => Object(obj) !== obj ? __typeError$d('Cannot use the "in" operator on this value') : member.has(obj);
|
|
813
|
+
var __privateGet$5 = (obj, member, getter) => (__accessCheck$5(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
814
|
+
var __privateAdd$5 = (obj, member, value) => member.has(obj) ? __typeError$d("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
815
|
+
var __privateSet$5 = (obj, member, value, setter) => (__accessCheck$5(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
816
|
+
var __privateMethod$5 = (obj, member, method) => (__accessCheck$5(obj, member, "access private method"), method);
|
|
817
|
+
var _isSetup_dec$1, _errorMessage_dec, _a$d, _AdminLoginForm_decorators, _init$d, _errorMessage, _isSetup$1;
|
|
818
|
+
_AdminLoginForm_decorators = [customElement("admin-login-form")];
|
|
819
|
+
class AdminLoginForm extends (_a$d = LitElement, _errorMessage_dec = [property({ type: String })], _isSetup_dec$1 = [property({ type: Boolean })], _a$d) {
|
|
820
|
+
constructor() {
|
|
821
|
+
super(...arguments);
|
|
822
|
+
__privateAdd$5(this, _errorMessage, __runInitializers$d(_init$d, 8, this, "")), __runInitializers$d(_init$d, 11, this);
|
|
823
|
+
__privateAdd$5(this, _isSetup$1, __runInitializers$d(_init$d, 12, this, false)), __runInitializers$d(_init$d, 15, this);
|
|
824
|
+
}
|
|
825
|
+
handleSubmit(e) {
|
|
826
|
+
e.preventDefault();
|
|
827
|
+
const formData = new FormData(e.target);
|
|
828
|
+
const username = formData.get("username");
|
|
829
|
+
const password = formData.get("password");
|
|
830
|
+
const confirmPassword = formData.get("confirmPassword");
|
|
831
|
+
this.dispatchEvent(new CustomEvent("login-submit", {
|
|
832
|
+
detail: { username, password, confirmPassword },
|
|
833
|
+
bubbles: true,
|
|
834
|
+
composed: true
|
|
835
|
+
}));
|
|
836
|
+
}
|
|
837
|
+
render() {
|
|
838
|
+
return html`
|
|
839
|
+
<div class="container">
|
|
840
|
+
<div class="login-box">
|
|
841
|
+
<h2>${this.isSetup ? "Admin Login" : "Admin Setup"}</h2>
|
|
842
|
+
<p>${this.isSetup ? "Enter your credentials" : "Create your admin credentials"}</p>
|
|
843
|
+
<form @submit=${this.handleSubmit}>
|
|
844
|
+
<input type="text" name="username" placeholder="Username${this.isSetup ? "" : " (3+ chars)"}" autocomplete="username" required />
|
|
845
|
+
<input type="password" name="password" placeholder="Password${this.isSetup ? "" : " (8+ chars)"}" autocomplete="current-password" required />
|
|
846
|
+
${!this.isSetup ? html`<input type="password" name="confirmPassword" placeholder="Confirm Password" required />` : ""}
|
|
847
|
+
${this.errorMessage ? html`<div class="error-message">${this.errorMessage}</div>` : ""}
|
|
848
|
+
<button type="submit" class="btn-primary">${this.isSetup ? "Login" : "Create Account"}</button>
|
|
849
|
+
</form>
|
|
850
|
+
</div>
|
|
851
|
+
</div>
|
|
852
|
+
`;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
_init$d = __decoratorStart$d(_a$d);
|
|
856
|
+
_errorMessage = /* @__PURE__ */ new WeakMap();
|
|
857
|
+
_isSetup$1 = /* @__PURE__ */ new WeakMap();
|
|
858
|
+
__decorateElement$d(_init$d, 4, "errorMessage", _errorMessage_dec, AdminLoginForm, _errorMessage);
|
|
859
|
+
__decorateElement$d(_init$d, 4, "isSetup", _isSetup_dec$1, AdminLoginForm, _isSetup$1);
|
|
860
|
+
AdminLoginForm = __decorateElement$d(_init$d, 0, "AdminLoginForm", _AdminLoginForm_decorators, AdminLoginForm);
|
|
861
|
+
AdminLoginForm.styles = css`
|
|
862
|
+
:host {
|
|
863
|
+
display: block;
|
|
864
|
+
width: 100%;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
.container {
|
|
868
|
+
width: 100%;
|
|
869
|
+
max-width: 900px;
|
|
870
|
+
margin: 0 auto;
|
|
871
|
+
padding: 1rem;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
.login-box {
|
|
875
|
+
border: 1px solid var(--border-color, #e0e0e0);
|
|
876
|
+
padding: 3rem 2.5rem;
|
|
877
|
+
border-radius: 16px;
|
|
878
|
+
width: 100%;
|
|
879
|
+
max-width: 420px;
|
|
880
|
+
margin: 80px auto;
|
|
881
|
+
text-align: center;
|
|
882
|
+
background: var(--card-bg, #fff);
|
|
883
|
+
box-shadow: 0 4px 6px rgba(0,0,0,0.07), 0 10px 20px rgba(0,0,0,0.05);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
.login-box h2 {
|
|
887
|
+
margin: 0 0 0.5rem 0;
|
|
888
|
+
font-size: 1.75rem;
|
|
889
|
+
font-weight: 600;
|
|
890
|
+
color: var(--text-color, #213547);
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
.login-box p {
|
|
894
|
+
color: var(--secondary-text, #666);
|
|
895
|
+
margin-bottom: 1.5rem;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
input {
|
|
899
|
+
width: 100%;
|
|
900
|
+
padding: 10px;
|
|
901
|
+
margin-bottom: 20px;
|
|
902
|
+
border: 1px solid var(--border-color);
|
|
903
|
+
border-radius: 4px;
|
|
904
|
+
background: var(--background-color);
|
|
905
|
+
color: var(--text-color);
|
|
906
|
+
box-sizing: border-box;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
button {
|
|
910
|
+
padding: 10px 20px;
|
|
911
|
+
border: none;
|
|
912
|
+
border-radius: 4px;
|
|
913
|
+
cursor: pointer;
|
|
914
|
+
font-size: 1rem;
|
|
915
|
+
transition: background-color 0.3s ease;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
.btn-primary {
|
|
919
|
+
background: var(--link-color, #646cff);
|
|
920
|
+
color: white;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
.btn-primary:hover {
|
|
924
|
+
background: var(--link-hover-color, #535bf2);
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
.error-message {
|
|
928
|
+
color: red;
|
|
929
|
+
margin-bottom: 10px;
|
|
930
|
+
}
|
|
931
|
+
`;
|
|
932
|
+
__runInitializers$d(_init$d, 1, AdminLoginForm);
|
|
933
|
+
var __create$c = Object.create;
|
|
934
|
+
var __defProp$c = Object.defineProperty;
|
|
935
|
+
var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
|
|
936
|
+
var __knownSymbol$c = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
937
|
+
var __typeError$c = (msg) => {
|
|
938
|
+
throw TypeError(msg);
|
|
939
|
+
};
|
|
940
|
+
var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
941
|
+
var __name$c = (target, value) => __defProp$c(target, "name", { value, configurable: true });
|
|
942
|
+
var __decoratorStart$c = (base) => [, , , __create$c(base?.[__knownSymbol$c("metadata")] ?? null)];
|
|
943
|
+
var __decoratorStrings$c = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
944
|
+
var __expectFn$c = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$c("Function expected") : fn;
|
|
945
|
+
var __decoratorContext$c = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$c[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$c("Already initialized") : fns.push(__expectFn$c(fn || null)) });
|
|
946
|
+
var __decoratorMetadata$c = (array, target) => __defNormalProp$c(target, __knownSymbol$c("metadata"), array[3]);
|
|
947
|
+
var __runInitializers$c = (array, flags, self, value) => {
|
|
948
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
949
|
+
return value;
|
|
950
|
+
};
|
|
951
|
+
var __decorateElement$c = (array, flags, name, decorators, target, extra) => {
|
|
952
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
953
|
+
var j = 0;
|
|
954
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
955
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$c(target, name));
|
|
956
|
+
__name$c(target, name);
|
|
957
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
958
|
+
ctx = __decoratorContext$c(k, name, done = {}, array[3], extraInitializers);
|
|
959
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
960
|
+
__expectFn$c(it) && (target = it);
|
|
961
|
+
}
|
|
962
|
+
return __decoratorMetadata$c(array, target), desc && __defProp$c(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
963
|
+
};
|
|
964
|
+
var _AdminHomeSection_decorators, _init$c, _a$c;
|
|
965
|
+
_AdminHomeSection_decorators = [customElement("admin-home-section")];
|
|
966
|
+
class AdminHomeSection extends (_a$c = AdminSection) {
|
|
967
|
+
async handleUpload() {
|
|
968
|
+
const input = this.shadowRoot?.querySelector("#homeFile");
|
|
969
|
+
if (input.files?.[0]) {
|
|
970
|
+
try {
|
|
971
|
+
await this.onUpload("pages/home.md", input.files[0]);
|
|
972
|
+
this.onStatusMessage("Upload successful!");
|
|
973
|
+
} catch (e) {
|
|
974
|
+
this.onStatusMessage("Upload failed.");
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
async handleDelete() {
|
|
979
|
+
if (!confirm("Delete pages/home.md?")) return;
|
|
980
|
+
try {
|
|
981
|
+
await this.onDelete("pages/home.md");
|
|
982
|
+
} catch (e) {
|
|
983
|
+
this.onStatusMessage("Delete failed.");
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
render() {
|
|
987
|
+
const home = this.getContent("pages/home.md");
|
|
988
|
+
return html`
|
|
989
|
+
<div class="section">
|
|
990
|
+
<h3>Home Page</h3>
|
|
991
|
+
<p class="help-text">Content for your home page. Upload home.md with your main content.</p>
|
|
992
|
+
|
|
993
|
+
${home ? html`
|
|
994
|
+
<div class="current-file">
|
|
995
|
+
<strong>Current:</strong> pages/home.md (${home.size} bytes)
|
|
996
|
+
<button class="btn-danger" @click=${this.handleDelete}>Delete</button>
|
|
997
|
+
</div>
|
|
998
|
+
` : ""}
|
|
999
|
+
|
|
1000
|
+
<input type="file" id="homeFile" accept=".md" />
|
|
1001
|
+
<button class="btn-primary" @click=${this.handleUpload}>Upload home.md</button>
|
|
1002
|
+
</div>
|
|
1003
|
+
`;
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
_init$c = __decoratorStart$c(_a$c);
|
|
1007
|
+
AdminHomeSection = __decorateElement$c(_init$c, 0, "AdminHomeSection", _AdminHomeSection_decorators, AdminHomeSection);
|
|
1008
|
+
__runInitializers$c(_init$c, 1, AdminHomeSection);
|
|
1009
|
+
var __create$b = Object.create;
|
|
1010
|
+
var __defProp$b = Object.defineProperty;
|
|
1011
|
+
var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
|
|
1012
|
+
var __knownSymbol$b = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1013
|
+
var __typeError$b = (msg) => {
|
|
1014
|
+
throw TypeError(msg);
|
|
1015
|
+
};
|
|
1016
|
+
var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1017
|
+
var __name$b = (target, value) => __defProp$b(target, "name", { value, configurable: true });
|
|
1018
|
+
var __decoratorStart$b = (base) => [, , , __create$b(base?.[__knownSymbol$b("metadata")] ?? null)];
|
|
1019
|
+
var __decoratorStrings$b = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1020
|
+
var __expectFn$b = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$b("Function expected") : fn;
|
|
1021
|
+
var __decoratorContext$b = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$b[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$b("Already initialized") : fns.push(__expectFn$b(fn || null)) });
|
|
1022
|
+
var __decoratorMetadata$b = (array, target) => __defNormalProp$b(target, __knownSymbol$b("metadata"), array[3]);
|
|
1023
|
+
var __runInitializers$b = (array, flags, self, value) => {
|
|
1024
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
1025
|
+
return value;
|
|
1026
|
+
};
|
|
1027
|
+
var __decorateElement$b = (array, flags, name, decorators, target, extra) => {
|
|
1028
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
1029
|
+
var j = 0;
|
|
1030
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
1031
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$b(target, name));
|
|
1032
|
+
__name$b(target, name);
|
|
1033
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1034
|
+
ctx = __decoratorContext$b(k, name, done = {}, array[3], extraInitializers);
|
|
1035
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
1036
|
+
__expectFn$b(it) && (target = it);
|
|
1037
|
+
}
|
|
1038
|
+
return __decoratorMetadata$b(array, target), desc && __defProp$b(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1039
|
+
};
|
|
1040
|
+
var _AdminProfileSection_decorators, _init$b, _a$b;
|
|
1041
|
+
_AdminProfileSection_decorators = [customElement("admin-profile-section")];
|
|
1042
|
+
class AdminProfileSection extends (_a$b = AdminSection) {
|
|
1043
|
+
async handleUpload() {
|
|
1044
|
+
const input = this.shadowRoot?.querySelector("#profileFile");
|
|
1045
|
+
if (input.files?.[0]) {
|
|
1046
|
+
try {
|
|
1047
|
+
await this.onUpload("profile.json", input.files[0]);
|
|
1048
|
+
this.onStatusMessage("Upload successful!");
|
|
1049
|
+
} catch (e) {
|
|
1050
|
+
this.onStatusMessage("Upload failed.");
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
async handleDelete() {
|
|
1055
|
+
if (!confirm("Delete profile.json?")) return;
|
|
1056
|
+
try {
|
|
1057
|
+
await this.onDelete("profile.json");
|
|
1058
|
+
} catch (e) {
|
|
1059
|
+
this.onStatusMessage("Delete failed.");
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
render() {
|
|
1063
|
+
const profile = this.getContent("profile.json");
|
|
1064
|
+
return html`
|
|
1065
|
+
<div class="section">
|
|
1066
|
+
<h3>Profile <span class="required-badge">Required</span></h3>
|
|
1067
|
+
<p class="help-text">This file contains your profile information (name, title, experience).</p>
|
|
1068
|
+
|
|
1069
|
+
${profile ? html`
|
|
1070
|
+
<div class="current-file">
|
|
1071
|
+
<strong>Current:</strong> profile.json (${profile.size} bytes)
|
|
1072
|
+
<button class="btn-danger" @click=${this.handleDelete}>Delete</button>
|
|
1073
|
+
</div>
|
|
1074
|
+
` : ""}
|
|
1075
|
+
|
|
1076
|
+
<input type="file" id="profileFile" accept=".json" />
|
|
1077
|
+
<button class="btn-primary" @click=${this.handleUpload}>Upload profile.json</button>
|
|
1078
|
+
</div>
|
|
1079
|
+
`;
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
_init$b = __decoratorStart$b(_a$b);
|
|
1083
|
+
AdminProfileSection = __decorateElement$b(_init$b, 0, "AdminProfileSection", _AdminProfileSection_decorators, AdminProfileSection);
|
|
1084
|
+
__runInitializers$b(_init$b, 1, AdminProfileSection);
|
|
1085
|
+
var __create$a = Object.create;
|
|
1086
|
+
var __defProp$a = Object.defineProperty;
|
|
1087
|
+
var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
|
|
1088
|
+
var __knownSymbol$a = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1089
|
+
var __typeError$a = (msg) => {
|
|
1090
|
+
throw TypeError(msg);
|
|
1091
|
+
};
|
|
1092
|
+
var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1093
|
+
var __name$a = (target, value) => __defProp$a(target, "name", { value, configurable: true });
|
|
1094
|
+
var __decoratorStart$a = (base) => [, , , __create$a(base?.[__knownSymbol$a("metadata")] ?? null)];
|
|
1095
|
+
var __decoratorStrings$a = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1096
|
+
var __expectFn$a = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$a("Function expected") : fn;
|
|
1097
|
+
var __decoratorContext$a = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$a[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$a("Already initialized") : fns.push(__expectFn$a(fn || null)) });
|
|
1098
|
+
var __decoratorMetadata$a = (array, target) => __defNormalProp$a(target, __knownSymbol$a("metadata"), array[3]);
|
|
1099
|
+
var __runInitializers$a = (array, flags, self, value) => {
|
|
1100
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
1101
|
+
return value;
|
|
1102
|
+
};
|
|
1103
|
+
var __decorateElement$a = (array, flags, name, decorators, target, extra) => {
|
|
1104
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
1105
|
+
var j = 0;
|
|
1106
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
1107
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$a(target, name));
|
|
1108
|
+
__name$a(target, name);
|
|
1109
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1110
|
+
ctx = __decoratorContext$a(k, name, done = {}, array[3], extraInitializers);
|
|
1111
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
1112
|
+
__expectFn$a(it) && (target = it);
|
|
1113
|
+
}
|
|
1114
|
+
return __decoratorMetadata$a(array, target), desc && __defProp$a(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1115
|
+
};
|
|
1116
|
+
var _AdminAboutMeSection_decorators, _init$a, _a$a;
|
|
1117
|
+
_AdminAboutMeSection_decorators = [customElement("admin-about-me-section")];
|
|
1118
|
+
class AdminAboutMeSection extends (_a$a = AdminSection) {
|
|
1119
|
+
async handleUpload() {
|
|
1120
|
+
const input = this.shadowRoot?.querySelector("#aboutFile");
|
|
1121
|
+
if (input.files?.[0]) {
|
|
1122
|
+
try {
|
|
1123
|
+
await this.onUpload("about-me.md", input.files[0]);
|
|
1124
|
+
this.onStatusMessage("Upload successful!");
|
|
1125
|
+
} catch (e) {
|
|
1126
|
+
this.onStatusMessage("Upload failed.");
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
async handleDelete() {
|
|
1131
|
+
if (!confirm("Delete about-me.md?")) return;
|
|
1132
|
+
try {
|
|
1133
|
+
await this.onDelete("about-me.md");
|
|
1134
|
+
} catch (e) {
|
|
1135
|
+
this.onStatusMessage("Delete failed.");
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
render() {
|
|
1139
|
+
const aboutMe = this.getContent("about-me.md");
|
|
1140
|
+
return html`
|
|
1141
|
+
<div class="section">
|
|
1142
|
+
<h3>About Me Page <span class="required-badge">Required</span></h3>
|
|
1143
|
+
<p class="help-text">Content for your About Me page. Supports Markdown with frontmatter.</p>
|
|
1144
|
+
|
|
1145
|
+
${aboutMe ? html`
|
|
1146
|
+
<div class="current-file">
|
|
1147
|
+
<strong>Current:</strong> about-me.md (${aboutMe.size} bytes)
|
|
1148
|
+
<button class="btn-danger" @click=${this.handleDelete}>Delete</button>
|
|
1149
|
+
</div>
|
|
1150
|
+
` : ""}
|
|
1151
|
+
|
|
1152
|
+
<input type="file" id="aboutFile" accept=".md" />
|
|
1153
|
+
<button class="btn-primary" @click=${this.handleUpload}>Upload about-me.md</button>
|
|
1154
|
+
</div>
|
|
1155
|
+
`;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
_init$a = __decoratorStart$a(_a$a);
|
|
1159
|
+
AdminAboutMeSection = __decorateElement$a(_init$a, 0, "AdminAboutMeSection", _AdminAboutMeSection_decorators, AdminAboutMeSection);
|
|
1160
|
+
__runInitializers$a(_init$a, 1, AdminAboutMeSection);
|
|
1161
|
+
var __create$9 = Object.create;
|
|
1162
|
+
var __defProp$9 = Object.defineProperty;
|
|
1163
|
+
var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
|
|
1164
|
+
var __knownSymbol$9 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1165
|
+
var __typeError$9 = (msg) => {
|
|
1166
|
+
throw TypeError(msg);
|
|
1167
|
+
};
|
|
1168
|
+
var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1169
|
+
var __name$9 = (target, value) => __defProp$9(target, "name", { value, configurable: true });
|
|
1170
|
+
var __decoratorStart$9 = (base) => [, , , __create$9(base?.[__knownSymbol$9("metadata")] ?? null)];
|
|
1171
|
+
var __decoratorStrings$9 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1172
|
+
var __expectFn$9 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$9("Function expected") : fn;
|
|
1173
|
+
var __decoratorContext$9 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$9[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$9("Already initialized") : fns.push(__expectFn$9(fn || null)) });
|
|
1174
|
+
var __decoratorMetadata$9 = (array, target) => __defNormalProp$9(target, __knownSymbol$9("metadata"), array[3]);
|
|
1175
|
+
var __runInitializers$9 = (array, flags, self, value) => {
|
|
1176
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
1177
|
+
return value;
|
|
1178
|
+
};
|
|
1179
|
+
var __decorateElement$9 = (array, flags, name, decorators, target, extra) => {
|
|
1180
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
1181
|
+
var j = 0;
|
|
1182
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
1183
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$9(target, name));
|
|
1184
|
+
__name$9(target, name);
|
|
1185
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1186
|
+
ctx = __decoratorContext$9(k, name, done = {}, array[3], extraInitializers);
|
|
1187
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
1188
|
+
__expectFn$9(it) && (target = it);
|
|
1189
|
+
}
|
|
1190
|
+
return __decoratorMetadata$9(array, target), desc && __defProp$9(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1191
|
+
};
|
|
1192
|
+
var _AdminBlogsSection_decorators, _init$9, _a$9;
|
|
1193
|
+
_AdminBlogsSection_decorators = [customElement("admin-blogs-section")];
|
|
1194
|
+
class AdminBlogsSection extends (_a$9 = AdminSection) {
|
|
1195
|
+
async handleUpload() {
|
|
1196
|
+
const metaInput = this.shadowRoot?.querySelector("#blogMetaFile");
|
|
1197
|
+
const contentInput = this.shadowRoot?.querySelector("#blogContentFile");
|
|
1198
|
+
const slugInput = this.shadowRoot?.querySelector("#blogSlug");
|
|
1199
|
+
if (metaInput.files?.[0] && contentInput.files?.[0] && slugInput.value) {
|
|
1200
|
+
const slug = slugInput.value.toLowerCase().trim().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
|
|
1201
|
+
try {
|
|
1202
|
+
await this.onUpload(`blogs/${slug}.json`, metaInput.files[0]);
|
|
1203
|
+
await this.onUpload(`blogs/${slug}.md`, contentInput.files[0]);
|
|
1204
|
+
this.onStatusMessage("Upload successful!");
|
|
1205
|
+
} catch (e) {
|
|
1206
|
+
this.onStatusMessage("Upload failed.");
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
async handleDelete(slug) {
|
|
1211
|
+
if (!confirm(`Delete blog ${slug}?`)) return;
|
|
1212
|
+
try {
|
|
1213
|
+
await this.onDelete(`blogs/${slug}.json`);
|
|
1214
|
+
await this.onDelete(`blogs/${slug}.md`);
|
|
1215
|
+
} catch (e) {
|
|
1216
|
+
this.onStatusMessage("Delete failed.");
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
render() {
|
|
1220
|
+
const blogs = this.getSectionFiles("blogs/").filter((b) => b.key.endsWith(".json"));
|
|
1221
|
+
return html`
|
|
1222
|
+
<div class="section">
|
|
1223
|
+
<h3>Blog Posts</h3>
|
|
1224
|
+
<p class="help-text">Each blog needs 2 files: a JSON (metadata) and MD (content) file.</p>
|
|
1225
|
+
|
|
1226
|
+
<h4>Upload New Blog</h4>
|
|
1227
|
+
<div class="mb-1">
|
|
1228
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Metadata (JSON)</label>
|
|
1229
|
+
<input type="file" id="blogMetaFile" accept=".json" />
|
|
1230
|
+
</div>
|
|
1231
|
+
<div class="mb-1">
|
|
1232
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Content (Markdown)</label>
|
|
1233
|
+
<input type="file" id="blogContentFile" accept=".md" />
|
|
1234
|
+
</div>
|
|
1235
|
+
<div class="mb-1">
|
|
1236
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">URL Slug</label>
|
|
1237
|
+
<input type="text" id="blogSlug" placeholder="Slug (e.g., my-new-post)" />
|
|
1238
|
+
</div>
|
|
1239
|
+
<button class="btn-primary" @click=${this.handleUpload}>Upload Blog (JSON + MD)</button>
|
|
1240
|
+
|
|
1241
|
+
<div class="file-list">
|
|
1242
|
+
<h4>Current Blogs (${blogs.length})</h4>
|
|
1243
|
+
${blogs.map((b) => {
|
|
1244
|
+
const slug = b.key.replace("blogs/", "").replace(".json", "");
|
|
1245
|
+
return html`
|
|
1246
|
+
<div class="file-item">
|
|
1247
|
+
<span>${b.key.replace(".json", "")}</span>
|
|
1248
|
+
<button class="btn-danger" @click=${() => this.handleDelete(slug)}>Delete</button>
|
|
1249
|
+
</div>
|
|
1250
|
+
`;
|
|
1251
|
+
})}
|
|
1252
|
+
${blogs.length === 0 ? html`<p>No blogs yet.</p>` : ""}
|
|
1253
|
+
</div>
|
|
1254
|
+
</div>
|
|
1255
|
+
`;
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
_init$9 = __decoratorStart$9(_a$9);
|
|
1259
|
+
AdminBlogsSection = __decorateElement$9(_init$9, 0, "AdminBlogsSection", _AdminBlogsSection_decorators, AdminBlogsSection);
|
|
1260
|
+
__runInitializers$9(_init$9, 1, AdminBlogsSection);
|
|
1261
|
+
var __create$8 = Object.create;
|
|
1262
|
+
var __defProp$8 = Object.defineProperty;
|
|
1263
|
+
var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
|
|
1264
|
+
var __knownSymbol$8 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1265
|
+
var __typeError$8 = (msg) => {
|
|
1266
|
+
throw TypeError(msg);
|
|
1267
|
+
};
|
|
1268
|
+
var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1269
|
+
var __name$8 = (target, value) => __defProp$8(target, "name", { value, configurable: true });
|
|
1270
|
+
var __decoratorStart$8 = (base) => [, , , __create$8(base?.[__knownSymbol$8("metadata")] ?? null)];
|
|
1271
|
+
var __decoratorStrings$8 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1272
|
+
var __expectFn$8 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$8("Function expected") : fn;
|
|
1273
|
+
var __decoratorContext$8 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$8[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$8("Already initialized") : fns.push(__expectFn$8(fn || null)) });
|
|
1274
|
+
var __decoratorMetadata$8 = (array, target) => __defNormalProp$8(target, __knownSymbol$8("metadata"), array[3]);
|
|
1275
|
+
var __runInitializers$8 = (array, flags, self, value) => {
|
|
1276
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
1277
|
+
return value;
|
|
1278
|
+
};
|
|
1279
|
+
var __decorateElement$8 = (array, flags, name, decorators, target, extra) => {
|
|
1280
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
1281
|
+
var j = 0;
|
|
1282
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
1283
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$8(target, name));
|
|
1284
|
+
__name$8(target, name);
|
|
1285
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1286
|
+
ctx = __decoratorContext$8(k, name, done = {}, array[3], extraInitializers);
|
|
1287
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
1288
|
+
__expectFn$8(it) && (target = it);
|
|
1289
|
+
}
|
|
1290
|
+
return __decoratorMetadata$8(array, target), desc && __defProp$8(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1291
|
+
};
|
|
1292
|
+
var _AdminStoriesSection_decorators, _init$8, _a$8;
|
|
1293
|
+
_AdminStoriesSection_decorators = [customElement("admin-stories-section")];
|
|
1294
|
+
class AdminStoriesSection extends (_a$8 = AdminSection) {
|
|
1295
|
+
async handleUpload() {
|
|
1296
|
+
const metaInput = this.shadowRoot?.querySelector("#storyMetaFile");
|
|
1297
|
+
const contentInput = this.shadowRoot?.querySelector("#storyContentFile");
|
|
1298
|
+
const slugInput = this.shadowRoot?.querySelector("#storySlug");
|
|
1299
|
+
if (metaInput.files?.[0] && contentInput.files?.[0] && slugInput.value) {
|
|
1300
|
+
const slug = slugInput.value.toLowerCase().trim().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
|
|
1301
|
+
try {
|
|
1302
|
+
await this.onUpload(`stories/${slug}.json`, metaInput.files[0]);
|
|
1303
|
+
await this.onUpload(`stories/${slug}.md`, contentInput.files[0]);
|
|
1304
|
+
this.onStatusMessage("Upload successful!");
|
|
1305
|
+
} catch (e) {
|
|
1306
|
+
this.onStatusMessage("Upload failed.");
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
async handleDelete(slug) {
|
|
1311
|
+
if (!confirm(`Delete story ${slug}?`)) return;
|
|
1312
|
+
try {
|
|
1313
|
+
await this.onDelete(`stories/${slug}.json`);
|
|
1314
|
+
await this.onDelete(`stories/${slug}.md`);
|
|
1315
|
+
} catch (e) {
|
|
1316
|
+
this.onStatusMessage("Delete failed.");
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
render() {
|
|
1320
|
+
const stories = this.getSectionFiles("stories/").filter((s) => s.key.endsWith(".json"));
|
|
1321
|
+
return html`
|
|
1322
|
+
<div class="section">
|
|
1323
|
+
<h3>Stories</h3>
|
|
1324
|
+
<p class="help-text">Each story needs 2 files: a JSON (metadata) and MD (content) file.</p>
|
|
1325
|
+
|
|
1326
|
+
<h4>Upload New Story</h4>
|
|
1327
|
+
<div class="mb-1">
|
|
1328
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Metadata (JSON)</label>
|
|
1329
|
+
<input type="file" id="storyMetaFile" accept=".json" />
|
|
1330
|
+
</div>
|
|
1331
|
+
<div class="mb-1">
|
|
1332
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Content (Markdown)</label>
|
|
1333
|
+
<input type="file" id="storyContentFile" accept=".md" />
|
|
1334
|
+
</div>
|
|
1335
|
+
<div class="mb-1">
|
|
1336
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">URL Slug</label>
|
|
1337
|
+
<input type="text" id="storySlug" placeholder="Slug (e.g., my-story)" />
|
|
1338
|
+
</div>
|
|
1339
|
+
<button class="btn-primary" @click=${this.handleUpload}>Upload Story (JSON + MD)</button>
|
|
1340
|
+
|
|
1341
|
+
<div class="file-list">
|
|
1342
|
+
<h4>Current Stories (${stories.length})</h4>
|
|
1343
|
+
${stories.map((s) => {
|
|
1344
|
+
const slug = s.key.replace("stories/", "").replace(".json", "");
|
|
1345
|
+
return html`
|
|
1346
|
+
<div class="file-item">
|
|
1347
|
+
<span>${s.key.replace(".json", "")}</span>
|
|
1348
|
+
<button class="btn-danger" @click=${() => this.handleDelete(slug)}>Delete</button>
|
|
1349
|
+
</div>
|
|
1350
|
+
`;
|
|
1351
|
+
})}
|
|
1352
|
+
${stories.length === 0 ? html`<p>No stories yet.</p>` : ""}
|
|
1353
|
+
</div>
|
|
1354
|
+
</div>
|
|
1355
|
+
`;
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
_init$8 = __decoratorStart$8(_a$8);
|
|
1359
|
+
AdminStoriesSection = __decorateElement$8(_init$8, 0, "AdminStoriesSection", _AdminStoriesSection_decorators, AdminStoriesSection);
|
|
1360
|
+
__runInitializers$8(_init$8, 1, AdminStoriesSection);
|
|
1361
|
+
var __create$7 = Object.create;
|
|
1362
|
+
var __defProp$7 = Object.defineProperty;
|
|
1363
|
+
var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
|
|
1364
|
+
var __knownSymbol$7 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1365
|
+
var __typeError$7 = (msg) => {
|
|
1366
|
+
throw TypeError(msg);
|
|
1367
|
+
};
|
|
1368
|
+
var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1369
|
+
var __name$7 = (target, value) => __defProp$7(target, "name", { value, configurable: true });
|
|
1370
|
+
var __decoratorStart$7 = (base) => [, , , __create$7(base?.[__knownSymbol$7("metadata")] ?? null)];
|
|
1371
|
+
var __decoratorStrings$7 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1372
|
+
var __expectFn$7 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$7("Function expected") : fn;
|
|
1373
|
+
var __decoratorContext$7 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$7[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$7("Already initialized") : fns.push(__expectFn$7(fn || null)) });
|
|
1374
|
+
var __decoratorMetadata$7 = (array, target) => __defNormalProp$7(target, __knownSymbol$7("metadata"), array[3]);
|
|
1375
|
+
var __runInitializers$7 = (array, flags, self, value) => {
|
|
1376
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
1377
|
+
return value;
|
|
1378
|
+
};
|
|
1379
|
+
var __decorateElement$7 = (array, flags, name, decorators, target, extra) => {
|
|
1380
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
1381
|
+
var j = 0;
|
|
1382
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
1383
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$7(target, name));
|
|
1384
|
+
__name$7(target, name);
|
|
1385
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1386
|
+
ctx = __decoratorContext$7(k, name, done = {}, array[3], extraInitializers);
|
|
1387
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
1388
|
+
__expectFn$7(it) && (target = it);
|
|
1389
|
+
}
|
|
1390
|
+
return __decoratorMetadata$7(array, target), desc && __defProp$7(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1391
|
+
};
|
|
1392
|
+
var _AdminImagesSection_decorators, _init$7, _a$7;
|
|
1393
|
+
_AdminImagesSection_decorators = [customElement("admin-images-section")];
|
|
1394
|
+
class AdminImagesSection extends (_a$7 = AdminSection) {
|
|
1395
|
+
async handleUpload() {
|
|
1396
|
+
const fileInput = this.shadowRoot?.querySelector("#imageFile");
|
|
1397
|
+
const pathInput = this.shadowRoot?.querySelector("#imagePath");
|
|
1398
|
+
if (fileInput.files?.[0] && pathInput.value) {
|
|
1399
|
+
try {
|
|
1400
|
+
await this.onUpload(`images/${pathInput.value}`, fileInput.files[0]);
|
|
1401
|
+
this.onStatusMessage("Upload successful!");
|
|
1402
|
+
} catch (e) {
|
|
1403
|
+
this.onStatusMessage("Upload failed.");
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
async handleDelete(key) {
|
|
1408
|
+
if (!confirm(`Delete ${key}?`)) return;
|
|
1409
|
+
try {
|
|
1410
|
+
await this.onDelete(key);
|
|
1411
|
+
} catch (e) {
|
|
1412
|
+
this.onStatusMessage("Delete failed.");
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
render() {
|
|
1416
|
+
const images = this.getSectionFiles("images/");
|
|
1417
|
+
return html`
|
|
1418
|
+
<div class="section">
|
|
1419
|
+
<h3>Images</h3>
|
|
1420
|
+
<p class="help-text">Upload images for use in your content. In markdown, reference images by filename only (e.g., use <code>my-photo.jpg</code> not <code>/images/my-photo.jpg</code>). The renderer automatically prepends <code>images/</code>.</p>
|
|
1421
|
+
|
|
1422
|
+
<input type="file" id="imageFile" accept="image/*" />
|
|
1423
|
+
<input type="text" id="imagePath" placeholder="Image name (e.g., profile-photo.jpg)" class="mt-1" />
|
|
1424
|
+
<button class="btn-primary" @click=${this.handleUpload}>Upload to images/</button>
|
|
1425
|
+
|
|
1426
|
+
<div class="file-list">
|
|
1427
|
+
<h4>Current Images (${images.length})</h4>
|
|
1428
|
+
${images.map((img) => html`
|
|
1429
|
+
<div class="file-item">
|
|
1430
|
+
<span>${img.key} (${img.size} bytes)</span>
|
|
1431
|
+
<button class="btn-danger" @click=${() => this.handleDelete(img.key)}>Delete</button>
|
|
1432
|
+
</div>
|
|
1433
|
+
`)}
|
|
1434
|
+
${images.length === 0 ? html`<p>No images yet.</p>` : ""}
|
|
1435
|
+
</div>
|
|
1436
|
+
</div>
|
|
1437
|
+
`;
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
_init$7 = __decoratorStart$7(_a$7);
|
|
1441
|
+
AdminImagesSection = __decorateElement$7(_init$7, 0, "AdminImagesSection", _AdminImagesSection_decorators, AdminImagesSection);
|
|
1442
|
+
__runInitializers$7(_init$7, 1, AdminImagesSection);
|
|
1443
|
+
var __create$6 = Object.create;
|
|
1444
|
+
var __defProp$6 = Object.defineProperty;
|
|
1445
|
+
var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
|
|
1446
|
+
var __knownSymbol$6 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1447
|
+
var __typeError$6 = (msg) => {
|
|
1448
|
+
throw TypeError(msg);
|
|
1449
|
+
};
|
|
1450
|
+
var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1451
|
+
var __name$6 = (target, value) => __defProp$6(target, "name", { value, configurable: true });
|
|
1452
|
+
var __decoratorStart$6 = (base) => [, , , __create$6(base?.[__knownSymbol$6("metadata")] ?? null)];
|
|
1453
|
+
var __decoratorStrings$6 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1454
|
+
var __expectFn$6 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$6("Function expected") : fn;
|
|
1455
|
+
var __decoratorContext$6 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$6[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$6("Already initialized") : fns.push(__expectFn$6(fn || null)) });
|
|
1456
|
+
var __decoratorMetadata$6 = (array, target) => __defNormalProp$6(target, __knownSymbol$6("metadata"), array[3]);
|
|
1457
|
+
var __runInitializers$6 = (array, flags, self, value) => {
|
|
1458
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
1459
|
+
return value;
|
|
1460
|
+
};
|
|
1461
|
+
var __decorateElement$6 = (array, flags, name, decorators, target, extra) => {
|
|
1462
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
1463
|
+
var j = 0;
|
|
1464
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
1465
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$6(target, name));
|
|
1466
|
+
__name$6(target, name);
|
|
1467
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1468
|
+
ctx = __decoratorContext$6(k, name, done = {}, array[3], extraInitializers);
|
|
1469
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
1470
|
+
__expectFn$6(it) && (target = it);
|
|
1471
|
+
}
|
|
1472
|
+
return __decoratorMetadata$6(array, target), desc && __defProp$6(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1473
|
+
};
|
|
1474
|
+
var _AdminLogoSection_decorators, _init$6, _a$6;
|
|
1475
|
+
_AdminLogoSection_decorators = [customElement("admin-logo-section")];
|
|
1476
|
+
class AdminLogoSection extends (_a$6 = AdminSection) {
|
|
1477
|
+
async handleUpload() {
|
|
1478
|
+
const input = this.shadowRoot?.querySelector("#logoFile");
|
|
1479
|
+
if (input.files?.[0]) {
|
|
1480
|
+
try {
|
|
1481
|
+
await this.onUpload("logo.svg", input.files[0]);
|
|
1482
|
+
this.onStatusMessage("Upload successful!");
|
|
1483
|
+
} catch (e) {
|
|
1484
|
+
this.onStatusMessage("Upload failed.");
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
async handleDelete() {
|
|
1489
|
+
if (!confirm("Delete logo.svg?")) return;
|
|
1490
|
+
try {
|
|
1491
|
+
await this.onDelete("logo.svg");
|
|
1492
|
+
} catch (e) {
|
|
1493
|
+
this.onStatusMessage("Delete failed.");
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
render() {
|
|
1497
|
+
const logo = this.getContent("logo.svg");
|
|
1498
|
+
const logoUrl = `/api/logo?t=${Date.now()}`;
|
|
1499
|
+
return html`
|
|
1500
|
+
<div class="section">
|
|
1501
|
+
<h3>Site Logo</h3>
|
|
1502
|
+
<p class="help-text">Upload your site logo (SVG format recommended). This appears in the header of your site.</p>
|
|
1503
|
+
|
|
1504
|
+
${logo ? html`
|
|
1505
|
+
<div class="current-file">
|
|
1506
|
+
<div class="mb-1">
|
|
1507
|
+
<strong>Current:</strong> logo.svg (${logo.size} bytes)
|
|
1508
|
+
</div>
|
|
1509
|
+
<div style="background: #f0f0f0; padding: 10px; border-radius: 8px; margin-bottom: 10px; display: inline-block;">
|
|
1510
|
+
<img src="${logoUrl}" alt="Current Logo" style="max-height: 100px; display: block;" />
|
|
1511
|
+
</div>
|
|
1512
|
+
<br/>
|
|
1513
|
+
<button class="btn-danger" @click=${this.handleDelete}>Delete</button>
|
|
1514
|
+
</div>
|
|
1515
|
+
` : ""}
|
|
1516
|
+
|
|
1517
|
+
<input type="file" id="logoFile" accept=".svg,image/svg+xml" />
|
|
1518
|
+
<button class="btn-primary mt-1 mb-1" @click=${this.handleUpload}>Upload logo.svg</button>
|
|
1519
|
+
|
|
1520
|
+
<div class="info-box">
|
|
1521
|
+
<strong>Tip:</strong> Use an SVG with transparent background. The logo will automatically adapt to light/dark themes.
|
|
1522
|
+
</div>
|
|
1523
|
+
</div>
|
|
1524
|
+
`;
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
_init$6 = __decoratorStart$6(_a$6);
|
|
1528
|
+
AdminLogoSection = __decorateElement$6(_init$6, 0, "AdminLogoSection", _AdminLogoSection_decorators, AdminLogoSection);
|
|
1529
|
+
__runInitializers$6(_init$6, 1, AdminLogoSection);
|
|
1530
|
+
var __create$5 = Object.create;
|
|
1531
|
+
var __defProp$5 = Object.defineProperty;
|
|
1532
|
+
var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
|
|
1533
|
+
var __knownSymbol$5 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1534
|
+
var __typeError$5 = (msg) => {
|
|
1535
|
+
throw TypeError(msg);
|
|
1536
|
+
};
|
|
1537
|
+
var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1538
|
+
var __name$5 = (target, value) => __defProp$5(target, "name", { value, configurable: true });
|
|
1539
|
+
var __decoratorStart$5 = (base) => [, , , __create$5(base?.[__knownSymbol$5("metadata")] ?? null)];
|
|
1540
|
+
var __decoratorStrings$5 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1541
|
+
var __expectFn$5 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$5("Function expected") : fn;
|
|
1542
|
+
var __decoratorContext$5 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$5[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$5("Already initialized") : fns.push(__expectFn$5(fn || null)) });
|
|
1543
|
+
var __decoratorMetadata$5 = (array, target) => __defNormalProp$5(target, __knownSymbol$5("metadata"), array[3]);
|
|
1544
|
+
var __runInitializers$5 = (array, flags, self, value) => {
|
|
1545
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
1546
|
+
return value;
|
|
1547
|
+
};
|
|
1548
|
+
var __decorateElement$5 = (array, flags, name, decorators, target, extra) => {
|
|
1549
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
1550
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings$5[k + 5];
|
|
1551
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
1552
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc$5(k < 4 ? target : { get [name]() {
|
|
1553
|
+
return __privateGet$4(this, extra);
|
|
1554
|
+
}, set [name](x) {
|
|
1555
|
+
return __privateSet$4(this, extra, x);
|
|
1556
|
+
} }, name));
|
|
1557
|
+
k ? p && k < 4 && __name$5(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name$5(target, name);
|
|
1558
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1559
|
+
ctx = __decoratorContext$5(k, name, done = {}, array[3], extraInitializers);
|
|
1560
|
+
if (k) {
|
|
1561
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn$4(target, x) : (x) => name in x };
|
|
1562
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet$4 : __privateMethod$4)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
1563
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet$4(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
1564
|
+
}
|
|
1565
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
1566
|
+
if (k ^ 4 || it === void 0) __expectFn$5(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
1567
|
+
else if (typeof it !== "object" || it === null) __typeError$5("Object expected");
|
|
1568
|
+
else __expectFn$5(fn = it.get) && (desc.get = fn), __expectFn$5(fn = it.set) && (desc.set = fn), __expectFn$5(fn = it.init) && initializers.unshift(fn);
|
|
1569
|
+
}
|
|
1570
|
+
return k || __decoratorMetadata$5(array, target), desc && __defProp$5(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1571
|
+
};
|
|
1572
|
+
var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$5("Cannot " + msg);
|
|
1573
|
+
var __privateIn$4 = (member, obj) => Object(obj) !== obj ? __typeError$5('Cannot use the "in" operator on this value') : member.has(obj);
|
|
1574
|
+
var __privateGet$4 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
1575
|
+
var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$5("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
1576
|
+
var __privateSet$4 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
1577
|
+
var __privateMethod$4 = (obj, member, method) => (__accessCheck$4(obj, member, "access private method"), method);
|
|
1578
|
+
var _localDetails_dec, _a$5, _AdminStaticSection_decorators, _init$5, _localDetails;
|
|
1579
|
+
_AdminStaticSection_decorators = [customElement("admin-static-section")];
|
|
1580
|
+
class AdminStaticSection extends (_a$5 = AdminSection, _localDetails_dec = [state()], _a$5) {
|
|
1581
|
+
constructor() {
|
|
1582
|
+
super(...arguments);
|
|
1583
|
+
__privateAdd$4(this, _localDetails, __runInitializers$5(_init$5, 8, this, {})), __runInitializers$5(_init$5, 11, this);
|
|
1584
|
+
}
|
|
1585
|
+
willUpdate(changedProperties) {
|
|
1586
|
+
if (changedProperties.has("staticDetails")) {
|
|
1587
|
+
this.localDetails = { ...this.staticDetails };
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
async handleSave() {
|
|
1591
|
+
const siteTitle = this.shadowRoot?.querySelector("#siteTitle")?.value;
|
|
1592
|
+
const copyright = this.shadowRoot?.querySelector("#copyright")?.value;
|
|
1593
|
+
const linkedin = this.shadowRoot?.querySelector("#linkedin")?.value;
|
|
1594
|
+
const github = this.shadowRoot?.querySelector("#github")?.value;
|
|
1595
|
+
const email = this.shadowRoot?.querySelector("#email")?.value;
|
|
1596
|
+
const data = {
|
|
1597
|
+
siteTitle: siteTitle || "",
|
|
1598
|
+
copyright: copyright || "",
|
|
1599
|
+
linkedin: linkedin || "",
|
|
1600
|
+
github: github || "",
|
|
1601
|
+
email: email || ""
|
|
1602
|
+
};
|
|
1603
|
+
try {
|
|
1604
|
+
await this.onUpload("static-details.json", new File([JSON.stringify(data)], "static-details.json", { type: "application/json" }));
|
|
1605
|
+
this.onStatusMessage("Settings saved!");
|
|
1606
|
+
} catch (e) {
|
|
1607
|
+
this.onStatusMessage("Failed to save settings.");
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
render() {
|
|
1611
|
+
return html`
|
|
1612
|
+
<div class="section">
|
|
1613
|
+
<h3>Site Settings</h3>
|
|
1614
|
+
<p class="help-text">Manage your site's static details like title, footer links, etc.</p>
|
|
1615
|
+
|
|
1616
|
+
<div class="mb-1">
|
|
1617
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Site Title</label>
|
|
1618
|
+
<input type="text" id="siteTitle" .value=${this.localDetails?.siteTitle || ""} />
|
|
1619
|
+
</div>
|
|
1620
|
+
|
|
1621
|
+
<div class="mb-1">
|
|
1622
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Copyright Text</label>
|
|
1623
|
+
<input type="text" id="copyright" .value=${this.localDetails?.copyright || ""} />
|
|
1624
|
+
</div>
|
|
1625
|
+
|
|
1626
|
+
<div class="mb-1">
|
|
1627
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">LinkedIn URL</label>
|
|
1628
|
+
<input type="text" id="linkedin" .value=${this.localDetails?.linkedin || ""} />
|
|
1629
|
+
</div>
|
|
1630
|
+
|
|
1631
|
+
<div class="mb-1">
|
|
1632
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">GitHub URL</label>
|
|
1633
|
+
<input type="text" id="github" .value=${this.localDetails?.github || ""} />
|
|
1634
|
+
</div>
|
|
1635
|
+
|
|
1636
|
+
<div class="mb-1">
|
|
1637
|
+
<label style="display:block;margin-bottom:4px;font-weight:500">Email</label>
|
|
1638
|
+
<input type="text" id="email" .value=${this.localDetails?.email || ""} />
|
|
1639
|
+
</div>
|
|
1640
|
+
|
|
1641
|
+
<button class="btn-primary" @click=${this.handleSave}>Save Settings</button>
|
|
1642
|
+
</div>
|
|
1643
|
+
`;
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
_init$5 = __decoratorStart$5(_a$5);
|
|
1647
|
+
_localDetails = /* @__PURE__ */ new WeakMap();
|
|
1648
|
+
__decorateElement$5(_init$5, 4, "localDetails", _localDetails_dec, AdminStaticSection, _localDetails);
|
|
1649
|
+
AdminStaticSection = __decorateElement$5(_init$5, 0, "AdminStaticSection", _AdminStaticSection_decorators, AdminStaticSection);
|
|
1650
|
+
__runInitializers$5(_init$5, 1, AdminStaticSection);
|
|
1651
|
+
var __create$4 = Object.create;
|
|
1652
|
+
var __defProp$4 = Object.defineProperty;
|
|
1653
|
+
var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
|
|
1654
|
+
var __knownSymbol$4 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
1655
|
+
var __typeError$4 = (msg) => {
|
|
1656
|
+
throw TypeError(msg);
|
|
1657
|
+
};
|
|
1658
|
+
var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1659
|
+
var __name$4 = (target, value) => __defProp$4(target, "name", { value, configurable: true });
|
|
1660
|
+
var __decoratorStart$4 = (base) => [, , , __create$4(base?.[__knownSymbol$4("metadata")] ?? null)];
|
|
1661
|
+
var __decoratorStrings$4 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
1662
|
+
var __expectFn$4 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$4("Function expected") : fn;
|
|
1663
|
+
var __decoratorContext$4 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$4[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$4("Already initialized") : fns.push(__expectFn$4(fn || null)) });
|
|
1664
|
+
var __decoratorMetadata$4 = (array, target) => __defNormalProp$4(target, __knownSymbol$4("metadata"), array[3]);
|
|
1665
|
+
var __runInitializers$4 = (array, flags, self, value) => {
|
|
1666
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
1667
|
+
return value;
|
|
1668
|
+
};
|
|
1669
|
+
var __decorateElement$4 = (array, flags, name, decorators, target, extra) => {
|
|
1670
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
1671
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings$4[k + 5];
|
|
1672
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
1673
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc$4(k < 4 ? target : { get [name]() {
|
|
1674
|
+
return __privateGet$3(this, extra);
|
|
1675
|
+
}, set [name](x) {
|
|
1676
|
+
return __privateSet$3(this, extra, x);
|
|
1677
|
+
} }, name));
|
|
1678
|
+
k ? p && k < 4 && __name$4(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name$4(target, name);
|
|
1679
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1680
|
+
ctx = __decoratorContext$4(k, name, done = {}, array[3], extraInitializers);
|
|
1681
|
+
if (k) {
|
|
1682
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn$3(target, x) : (x) => name in x };
|
|
1683
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet$3 : __privateMethod$3)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
1684
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet$3(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
1685
|
+
}
|
|
1686
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
1687
|
+
if (k ^ 4 || it === void 0) __expectFn$4(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
1688
|
+
else if (typeof it !== "object" || it === null) __typeError$4("Object expected");
|
|
1689
|
+
else __expectFn$4(fn = it.get) && (desc.get = fn), __expectFn$4(fn = it.set) && (desc.set = fn), __expectFn$4(fn = it.init) && initializers.unshift(fn);
|
|
1690
|
+
}
|
|
1691
|
+
return k || __decoratorMetadata$4(array, target), desc && __defProp$4(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
1692
|
+
};
|
|
1693
|
+
var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$4("Cannot " + msg);
|
|
1694
|
+
var __privateIn$3 = (member, obj) => Object(obj) !== obj ? __typeError$4('Cannot use the "in" operator on this value') : member.has(obj);
|
|
1695
|
+
var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
1696
|
+
var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
1697
|
+
var __privateSet$3 = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
1698
|
+
var __privateMethod$3 = (obj, member, method) => (__accessCheck$3(obj, member, "access private method"), method);
|
|
1699
|
+
var _loginError_dec, _staticDetails_dec, _activeSection_dec, _statusMessage_dec, _contentList_dec, _isLoading_dec, _isSetup_dec, _isAuthenticated_dec, _a$4, _AdminPortal_decorators, _init$4, _isAuthenticated, _isSetup, _isLoading, _contentList, _statusMessage, _activeSection, _staticDetails, _loginError;
|
|
1700
|
+
_AdminPortal_decorators = [customElement("admin-portal")];
|
|
1701
|
+
class AdminPortal extends (_a$4 = LitElement, _isAuthenticated_dec = [state()], _isSetup_dec = [state()], _isLoading_dec = [state()], _contentList_dec = [state()], _statusMessage_dec = [state()], _activeSection_dec = [state()], _staticDetails_dec = [state()], _loginError_dec = [state()], _a$4) {
|
|
1702
|
+
constructor() {
|
|
1703
|
+
super();
|
|
1704
|
+
__privateAdd$3(this, _isAuthenticated, __runInitializers$4(_init$4, 8, this, false)), __runInitializers$4(_init$4, 11, this);
|
|
1705
|
+
__privateAdd$3(this, _isSetup, __runInitializers$4(_init$4, 12, this, false)), __runInitializers$4(_init$4, 15, this);
|
|
1706
|
+
__privateAdd$3(this, _isLoading, __runInitializers$4(_init$4, 16, this, true)), __runInitializers$4(_init$4, 19, this);
|
|
1707
|
+
__privateAdd$3(this, _contentList, __runInitializers$4(_init$4, 20, this, [])), __runInitializers$4(_init$4, 23, this);
|
|
1708
|
+
__privateAdd$3(this, _statusMessage, __runInitializers$4(_init$4, 24, this, "")), __runInitializers$4(_init$4, 27, this);
|
|
1709
|
+
__privateAdd$3(this, _activeSection, __runInitializers$4(_init$4, 28, this, "profile")), __runInitializers$4(_init$4, 31, this);
|
|
1710
|
+
__privateAdd$3(this, _staticDetails, __runInitializers$4(_init$4, 32, this, {})), __runInitializers$4(_init$4, 35, this);
|
|
1711
|
+
__privateAdd$3(this, _loginError, __runInitializers$4(_init$4, 36, this, "")), __runInitializers$4(_init$4, 39, this);
|
|
1712
|
+
this.apiService = void 0;
|
|
1713
|
+
const apiUrl = window.location.origin;
|
|
1714
|
+
this.apiService = new AdminApiService(apiUrl);
|
|
1715
|
+
}
|
|
1716
|
+
hasSessionCookie() {
|
|
1717
|
+
return document.cookie.includes("session=");
|
|
1718
|
+
}
|
|
1719
|
+
async connectedCallback() {
|
|
1720
|
+
super.connectedCallback();
|
|
1721
|
+
await this.checkAuthStatus();
|
|
1722
|
+
this.requestUpdate();
|
|
1723
|
+
}
|
|
1724
|
+
async checkAuthStatus() {
|
|
1725
|
+
try {
|
|
1726
|
+
const status = await this.apiService.checkAuthStatus();
|
|
1727
|
+
this.isSetup = status.configured;
|
|
1728
|
+
if (status.configured && this.hasSessionCookie()) {
|
|
1729
|
+
await this.tryAutoLogin();
|
|
1730
|
+
}
|
|
1731
|
+
} catch (e) {
|
|
1732
|
+
console.error("Auth status check failed:", e);
|
|
1733
|
+
} finally {
|
|
1734
|
+
this.isLoading = false;
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
async tryAutoLogin() {
|
|
1738
|
+
try {
|
|
1739
|
+
this.contentList = await this.apiService.tryAutoLogin();
|
|
1740
|
+
this.isAuthenticated = true;
|
|
1741
|
+
} catch (e) {
|
|
1742
|
+
console.error("Auto login failed:", e);
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
async handleLogin(e) {
|
|
1746
|
+
const { username, password } = e.detail;
|
|
1747
|
+
this.loginError = "";
|
|
1748
|
+
if (!username || !password) {
|
|
1749
|
+
this.loginError = "Username and password required";
|
|
1750
|
+
return;
|
|
1751
|
+
}
|
|
1752
|
+
try {
|
|
1753
|
+
await this.apiService.login(username, password);
|
|
1754
|
+
this.isAuthenticated = true;
|
|
1755
|
+
await this.fetchContent();
|
|
1756
|
+
} catch (e2) {
|
|
1757
|
+
this.loginError = e2.message;
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
async handleSetup(e) {
|
|
1761
|
+
const { username, password, confirmPassword } = e.detail;
|
|
1762
|
+
this.loginError = "";
|
|
1763
|
+
if (!username || !password) {
|
|
1764
|
+
this.loginError = "Username and password required";
|
|
1765
|
+
return;
|
|
1766
|
+
}
|
|
1767
|
+
if (username.length < 3) {
|
|
1768
|
+
this.loginError = "Username must be at least 3 characters";
|
|
1769
|
+
return;
|
|
1770
|
+
}
|
|
1771
|
+
if (password.length < 8) {
|
|
1772
|
+
this.loginError = "Password must be at least 8 characters";
|
|
1773
|
+
return;
|
|
1774
|
+
}
|
|
1775
|
+
if (password !== confirmPassword) {
|
|
1776
|
+
this.loginError = "Passwords do not match";
|
|
1777
|
+
return;
|
|
1778
|
+
}
|
|
1779
|
+
try {
|
|
1780
|
+
await this.apiService.setup(username, password);
|
|
1781
|
+
this.isAuthenticated = true;
|
|
1782
|
+
this.isSetup = true;
|
|
1783
|
+
await this.fetchContent();
|
|
1784
|
+
} catch (e2) {
|
|
1785
|
+
this.loginError = e2.message;
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
async handleLogout() {
|
|
1789
|
+
try {
|
|
1790
|
+
await this.apiService.logout();
|
|
1791
|
+
} catch (e) {
|
|
1792
|
+
}
|
|
1793
|
+
this.isAuthenticated = false;
|
|
1794
|
+
this.contentList = [];
|
|
1795
|
+
}
|
|
1796
|
+
async fetchContent() {
|
|
1797
|
+
try {
|
|
1798
|
+
this.contentList = await this.apiService.fetchContent();
|
|
1799
|
+
} catch (e) {
|
|
1800
|
+
this.statusMessage = "Error fetching content.";
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
async fetchStaticDetails() {
|
|
1804
|
+
try {
|
|
1805
|
+
this.staticDetails = await this.apiService.fetchStaticDetails();
|
|
1806
|
+
} catch (e) {
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
async handleUpload(key, file) {
|
|
1810
|
+
try {
|
|
1811
|
+
this.statusMessage = "Uploading...";
|
|
1812
|
+
await this.apiService.uploadContent(key, file);
|
|
1813
|
+
this.statusMessage = "Upload successful!";
|
|
1814
|
+
await this.fetchContent();
|
|
1815
|
+
if (key === "static-details.json") {
|
|
1816
|
+
const store = SiteStore.getInstance();
|
|
1817
|
+
await store.refresh();
|
|
1818
|
+
}
|
|
1819
|
+
} catch (e) {
|
|
1820
|
+
this.statusMessage = "Error uploading.";
|
|
1821
|
+
throw e;
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
async handleClearCache() {
|
|
1825
|
+
try {
|
|
1826
|
+
this.statusMessage = "Clearing cache...";
|
|
1827
|
+
await this.apiService.clearCache();
|
|
1828
|
+
this.statusMessage = "Cache cleared!";
|
|
1829
|
+
} catch (e) {
|
|
1830
|
+
this.statusMessage = "Error clearing cache.";
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
async handleDelete(key) {
|
|
1834
|
+
try {
|
|
1835
|
+
await this.apiService.deleteContent(key);
|
|
1836
|
+
await this.fetchContent();
|
|
1837
|
+
} catch (e) {
|
|
1838
|
+
this.statusMessage = "Error deleting.";
|
|
1839
|
+
}
|
|
1840
|
+
}
|
|
1841
|
+
handleStatusMessage(message) {
|
|
1842
|
+
this.statusMessage = message;
|
|
1843
|
+
}
|
|
1844
|
+
renderHomeSection() {
|
|
1845
|
+
return html`
|
|
1846
|
+
<admin-home-section
|
|
1847
|
+
.contentList=${this.contentList}
|
|
1848
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1849
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1850
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1851
|
+
></admin-home-section>
|
|
1852
|
+
`;
|
|
1853
|
+
}
|
|
1854
|
+
renderProfileSection() {
|
|
1855
|
+
return html`
|
|
1856
|
+
<admin-profile-section
|
|
1857
|
+
.contentList=${this.contentList}
|
|
1858
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1859
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1860
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1861
|
+
></admin-profile-section>
|
|
1862
|
+
`;
|
|
1863
|
+
}
|
|
1864
|
+
renderAboutMeSection() {
|
|
1865
|
+
return html`
|
|
1866
|
+
<admin-about-me-section
|
|
1867
|
+
.contentList=${this.contentList}
|
|
1868
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1869
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1870
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1871
|
+
></admin-about-me-section>
|
|
1872
|
+
`;
|
|
1873
|
+
}
|
|
1874
|
+
renderBlogsSection() {
|
|
1875
|
+
return html`
|
|
1876
|
+
<admin-blogs-section
|
|
1877
|
+
.contentList=${this.contentList}
|
|
1878
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1879
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1880
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1881
|
+
></admin-blogs-section>
|
|
1882
|
+
`;
|
|
1883
|
+
}
|
|
1884
|
+
renderStoriesSection() {
|
|
1885
|
+
return html`
|
|
1886
|
+
<admin-stories-section
|
|
1887
|
+
.contentList=${this.contentList}
|
|
1888
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1889
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1890
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1891
|
+
></admin-stories-section>
|
|
1892
|
+
`;
|
|
1893
|
+
}
|
|
1894
|
+
renderImagesSection() {
|
|
1895
|
+
return html`
|
|
1896
|
+
<admin-images-section
|
|
1897
|
+
.contentList=${this.contentList}
|
|
1898
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1899
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1900
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1901
|
+
></admin-images-section>
|
|
1902
|
+
`;
|
|
1903
|
+
}
|
|
1904
|
+
renderLogoSection() {
|
|
1905
|
+
return html`
|
|
1906
|
+
<admin-logo-section
|
|
1907
|
+
.contentList=${this.contentList}
|
|
1908
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1909
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1910
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1911
|
+
></admin-logo-section>
|
|
1912
|
+
`;
|
|
1913
|
+
}
|
|
1914
|
+
renderStaticSection() {
|
|
1915
|
+
return html`
|
|
1916
|
+
<admin-static-section
|
|
1917
|
+
.contentList=${this.contentList}
|
|
1918
|
+
.staticDetails=${this.staticDetails}
|
|
1919
|
+
.onUpload=${this.handleUpload.bind(this)}
|
|
1920
|
+
.onDelete=${this.handleDelete.bind(this)}
|
|
1921
|
+
.onStatusMessage=${this.handleStatusMessage.bind(this)}
|
|
1922
|
+
></admin-static-section>
|
|
1923
|
+
`;
|
|
1924
|
+
}
|
|
1925
|
+
renderLoginForm() {
|
|
1926
|
+
return html`
|
|
1927
|
+
<admin-login-form
|
|
1928
|
+
.errorMessage=${this.loginError}
|
|
1929
|
+
.isSetup=${false}
|
|
1930
|
+
@login-submit=${this.handleSetup}
|
|
1931
|
+
></admin-login-form>
|
|
1932
|
+
`;
|
|
1933
|
+
}
|
|
1934
|
+
renderLogin() {
|
|
1935
|
+
return html`
|
|
1936
|
+
<admin-login-form
|
|
1937
|
+
.errorMessage=${this.loginError}
|
|
1938
|
+
.isSetup=${true}
|
|
1939
|
+
@login-submit=${this.handleLogin}
|
|
1940
|
+
></admin-login-form>
|
|
1941
|
+
`;
|
|
1942
|
+
}
|
|
1943
|
+
render() {
|
|
1944
|
+
if (this.isLoading) {
|
|
1945
|
+
return html`<div class="container"><div class="loading">Loading...</div></div>`;
|
|
1946
|
+
}
|
|
1947
|
+
if (!this.isSetup) {
|
|
1948
|
+
return this.renderLoginForm();
|
|
1949
|
+
}
|
|
1950
|
+
if (!this.isAuthenticated) {
|
|
1951
|
+
return this.renderLogin();
|
|
1952
|
+
}
|
|
1953
|
+
return html`
|
|
1954
|
+
<div class="container">
|
|
1955
|
+
<div class="header">
|
|
1956
|
+
<h1>Content Manager</h1>
|
|
1957
|
+
<button class="btn-secondary" @click=${() => this.handleLogout()}>Logout</button>
|
|
1958
|
+
<button class="btn-secondary" @click=${() => this.handleClearCache()}>Clear Cache</button>
|
|
1959
|
+
</div>
|
|
1960
|
+
|
|
1961
|
+
<div class="nav-tabs">
|
|
1962
|
+
<button class="nav-tab ${this.activeSection === "home" ? "active" : ""}"
|
|
1963
|
+
@click=${() => this.activeSection = "home"}>Home</button>
|
|
1964
|
+
<button class="nav-tab ${this.activeSection === "profile" ? "active" : ""}"
|
|
1965
|
+
@click=${() => this.activeSection = "profile"}>Profile</button>
|
|
1966
|
+
<button class="nav-tab ${this.activeSection === "aboutme" ? "active" : ""}"
|
|
1967
|
+
@click=${() => this.activeSection = "aboutme"}>About Me</button>
|
|
1968
|
+
<button class="nav-tab ${this.activeSection === "blogs" ? "active" : ""}"
|
|
1969
|
+
@click=${() => this.activeSection = "blogs"}>Blogs</button>
|
|
1970
|
+
<button class="nav-tab ${this.activeSection === "stories" ? "active" : ""}"
|
|
1971
|
+
@click=${() => this.activeSection = "stories"}>Stories</button>
|
|
1972
|
+
<button class="nav-tab ${this.activeSection === "images" ? "active" : ""}"
|
|
1973
|
+
@click=${() => this.activeSection = "images"}>Images</button>
|
|
1974
|
+
<button class="nav-tab ${this.activeSection === "logo" ? "active" : ""}"
|
|
1975
|
+
@click=${() => this.activeSection = "logo"}>Logo</button>
|
|
1976
|
+
<button class="nav-tab ${this.activeSection === "static" ? "active" : ""}"
|
|
1977
|
+
@click=${() => {
|
|
1978
|
+
this.activeSection = "static";
|
|
1979
|
+
this.fetchStaticDetails();
|
|
1980
|
+
}}>Site Settings</button>
|
|
1981
|
+
</div>
|
|
1982
|
+
|
|
1983
|
+
${this.statusMessage ? html`
|
|
1984
|
+
<div class="status-message ${this.statusMessage.includes("successful") || this.statusMessage.includes("cleared") ? "success" : this.statusMessage.includes("failed") || this.statusMessage.includes("Error") ? "error" : ""}">
|
|
1985
|
+
${this.statusMessage}
|
|
1986
|
+
</div>
|
|
1987
|
+
` : ""}
|
|
1988
|
+
|
|
1989
|
+
${this.activeSection === "home" ? this.renderHomeSection() : ""}
|
|
1990
|
+
${this.activeSection === "profile" ? this.renderProfileSection() : ""}
|
|
1991
|
+
${this.activeSection === "aboutme" ? this.renderAboutMeSection() : ""}
|
|
1992
|
+
${this.activeSection === "blogs" ? this.renderBlogsSection() : ""}
|
|
1993
|
+
${this.activeSection === "stories" ? this.renderStoriesSection() : ""}
|
|
1994
|
+
${this.activeSection === "images" ? this.renderImagesSection() : ""}
|
|
1995
|
+
${this.activeSection === "logo" ? this.renderLogoSection() : ""}
|
|
1996
|
+
${this.activeSection === "static" ? this.renderStaticSection() : ""}
|
|
1997
|
+
</div>
|
|
1998
|
+
`;
|
|
1999
|
+
}
|
|
2000
|
+
}
|
|
2001
|
+
_init$4 = __decoratorStart$4(_a$4);
|
|
2002
|
+
_isAuthenticated = /* @__PURE__ */ new WeakMap();
|
|
2003
|
+
_isSetup = /* @__PURE__ */ new WeakMap();
|
|
2004
|
+
_isLoading = /* @__PURE__ */ new WeakMap();
|
|
2005
|
+
_contentList = /* @__PURE__ */ new WeakMap();
|
|
2006
|
+
_statusMessage = /* @__PURE__ */ new WeakMap();
|
|
2007
|
+
_activeSection = /* @__PURE__ */ new WeakMap();
|
|
2008
|
+
_staticDetails = /* @__PURE__ */ new WeakMap();
|
|
2009
|
+
_loginError = /* @__PURE__ */ new WeakMap();
|
|
2010
|
+
__decorateElement$4(_init$4, 4, "isAuthenticated", _isAuthenticated_dec, AdminPortal, _isAuthenticated);
|
|
2011
|
+
__decorateElement$4(_init$4, 4, "isSetup", _isSetup_dec, AdminPortal, _isSetup);
|
|
2012
|
+
__decorateElement$4(_init$4, 4, "isLoading", _isLoading_dec, AdminPortal, _isLoading);
|
|
2013
|
+
__decorateElement$4(_init$4, 4, "contentList", _contentList_dec, AdminPortal, _contentList);
|
|
2014
|
+
__decorateElement$4(_init$4, 4, "statusMessage", _statusMessage_dec, AdminPortal, _statusMessage);
|
|
2015
|
+
__decorateElement$4(_init$4, 4, "activeSection", _activeSection_dec, AdminPortal, _activeSection);
|
|
2016
|
+
__decorateElement$4(_init$4, 4, "staticDetails", _staticDetails_dec, AdminPortal, _staticDetails);
|
|
2017
|
+
__decorateElement$4(_init$4, 4, "loginError", _loginError_dec, AdminPortal, _loginError);
|
|
2018
|
+
AdminPortal = __decorateElement$4(_init$4, 0, "AdminPortal", _AdminPortal_decorators, AdminPortal);
|
|
2019
|
+
AdminPortal.styles = adminStyles;
|
|
2020
|
+
__runInitializers$4(_init$4, 1, AdminPortal);
|
|
2021
|
+
const adminLoaded = true;
|
|
2022
|
+
const bannerStyles = css`
|
|
2023
|
+
:host {
|
|
2024
|
+
display: block;
|
|
2025
|
+
width: 100%;
|
|
2026
|
+
box-sizing: border-box;
|
|
2027
|
+
font-family: Arial, sans-serif;
|
|
2028
|
+
color: var(--text-color);
|
|
2029
|
+
background-color: var(--background-color);
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
.banner,
|
|
2033
|
+
.banner-component {
|
|
2034
|
+
display: flex;
|
|
2035
|
+
flex-direction: row;
|
|
2036
|
+
justify-content: space-between;
|
|
2037
|
+
align-items: center;
|
|
2038
|
+
padding: 1rem 2rem;
|
|
2039
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
2040
|
+
transition: background-color 0.3s, color 0.3s;
|
|
2041
|
+
background-color: var(--background-color);
|
|
2042
|
+
color: var(--text-color);
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
.header-content {
|
|
2046
|
+
display: flex;
|
|
2047
|
+
align-items: center;
|
|
2048
|
+
margin-bottom: 0;
|
|
2049
|
+
margin-right: auto;
|
|
2050
|
+
}
|
|
2051
|
+
|
|
2052
|
+
.logo {
|
|
2053
|
+
height: 50px;
|
|
2054
|
+
margin-right: 1rem;
|
|
2055
|
+
width: auto;
|
|
2056
|
+
}
|
|
2057
|
+
|
|
2058
|
+
/* Logo dark mode - invert colors for better contrast */
|
|
2059
|
+
[data-theme="dark"] .logo {
|
|
2060
|
+
filter: brightness(0.85) invert(1);
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2063
|
+
h1 {
|
|
2064
|
+
margin: 0;
|
|
2065
|
+
font-size: 1.8em;
|
|
2066
|
+
font-weight: 600;
|
|
2067
|
+
color: var(--text-color);
|
|
2068
|
+
}
|
|
2069
|
+
|
|
2070
|
+
.nav-and-theme {
|
|
2071
|
+
display: flex;
|
|
2072
|
+
align-items: center;
|
|
2073
|
+
gap: 1rem;
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
nav {
|
|
2077
|
+
display: flex;
|
|
2078
|
+
align-items: center;
|
|
2079
|
+
padding: 0 1rem;
|
|
2080
|
+
gap: 10px;
|
|
2081
|
+
}
|
|
2082
|
+
|
|
2083
|
+
nav a {
|
|
2084
|
+
text-decoration: none;
|
|
2085
|
+
color: var(--nav-link-color, #333);
|
|
2086
|
+
padding: 0.5rem 1rem;
|
|
2087
|
+
border-radius: 5px;
|
|
2088
|
+
transition: background-color 0.3s ease, color 0.3s ease;
|
|
2089
|
+
}
|
|
2090
|
+
|
|
2091
|
+
nav a:hover {
|
|
2092
|
+
background-color: var(--nav-link-hover-bg, #e2e6ea);
|
|
2093
|
+
text-decoration: none;
|
|
2094
|
+
}
|
|
2095
|
+
|
|
2096
|
+
@media (max-width: 768px) {
|
|
2097
|
+
.banner,
|
|
2098
|
+
.banner-component {
|
|
2099
|
+
flex-direction: column;
|
|
2100
|
+
gap: 1rem;
|
|
2101
|
+
padding: 1rem;
|
|
2102
|
+
}
|
|
2103
|
+
|
|
2104
|
+
.header-content {
|
|
2105
|
+
margin-right: 0;
|
|
2106
|
+
justify-content: center;
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
nav {
|
|
2110
|
+
flex-wrap: wrap;
|
|
2111
|
+
justify-content: center;
|
|
2112
|
+
}
|
|
2113
|
+
}
|
|
2114
|
+
`;
|
|
2115
|
+
var __create$3 = Object.create;
|
|
2116
|
+
var __defProp$3 = Object.defineProperty;
|
|
2117
|
+
var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
|
|
2118
|
+
var __knownSymbol$3 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
2119
|
+
var __typeError$3 = (msg) => {
|
|
2120
|
+
throw TypeError(msg);
|
|
2121
|
+
};
|
|
2122
|
+
var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2123
|
+
var __name$3 = (target, value) => __defProp$3(target, "name", { value, configurable: true });
|
|
2124
|
+
var __decoratorStart$3 = (base) => [, , , __create$3(base?.[__knownSymbol$3("metadata")] ?? null)];
|
|
2125
|
+
var __decoratorStrings$3 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
2126
|
+
var __expectFn$3 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$3("Function expected") : fn;
|
|
2127
|
+
var __decoratorContext$3 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$3[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$3("Already initialized") : fns.push(__expectFn$3(fn || null)) });
|
|
2128
|
+
var __decoratorMetadata$3 = (array, target) => __defNormalProp$3(target, __knownSymbol$3("metadata"), array[3]);
|
|
2129
|
+
var __runInitializers$3 = (array, flags, self, value) => {
|
|
2130
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self);
|
|
2131
|
+
return value;
|
|
2132
|
+
};
|
|
2133
|
+
var __decorateElement$3 = (array, flags, name, decorators, target, extra) => {
|
|
2134
|
+
var it, done, ctx, k = flags & 7, p = false;
|
|
2135
|
+
var j = 0;
|
|
2136
|
+
var extraInitializers = array[j] || (array[j] = []);
|
|
2137
|
+
var desc = k && (target = target.prototype, k < 5 && (k > 3 || !p) && __getOwnPropDesc$3(target, name));
|
|
2138
|
+
__name$3(target, name);
|
|
2139
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
2140
|
+
ctx = __decoratorContext$3(k, name, done = {}, array[3], extraInitializers);
|
|
2141
|
+
it = (0, decorators[i])(target, ctx), done._ = 1;
|
|
2142
|
+
__expectFn$3(it) && (target = it);
|
|
2143
|
+
}
|
|
2144
|
+
return __decoratorMetadata$3(array, target), desc && __defProp$3(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
2145
|
+
};
|
|
2146
|
+
var _MyBanner_decorators, _init$3, _a$3;
|
|
2147
|
+
_MyBanner_decorators = [customElement("my-banner")];
|
|
2148
|
+
const _MyBanner = class _MyBanner extends (_a$3 = LitElement) {
|
|
2149
|
+
constructor() {
|
|
2150
|
+
super();
|
|
2151
|
+
this.header = "My App";
|
|
2152
|
+
this.logo = "";
|
|
2153
|
+
}
|
|
2154
|
+
render() {
|
|
2155
|
+
return html`
|
|
2156
|
+
<header class="banner banner-component">
|
|
2157
|
+
<div class="header-content">
|
|
2158
|
+
${this.logo ? html`<img src="${this.logo}" alt="Logo" class="logo" />` : ""}
|
|
2159
|
+
<h1>${this.header}</h1>
|
|
2160
|
+
</div>
|
|
2161
|
+
<div class="nav-and-theme">
|
|
2162
|
+
<slot name="nav-links"></slot>
|
|
2163
|
+
<slot name="theme-switcher"></slot>
|
|
2164
|
+
</div>
|
|
2165
|
+
</header>
|
|
2166
|
+
`;
|
|
2167
|
+
}
|
|
2168
|
+
};
|
|
2169
|
+
_MyBanner.styles = bannerStyles;
|
|
2170
|
+
_MyBanner.properties = {
|
|
2171
|
+
header: { type: String },
|
|
2172
|
+
logo: { type: String }
|
|
2173
|
+
};
|
|
2174
|
+
let MyBanner = _MyBanner;
|
|
2175
|
+
_init$3 = __decoratorStart$3(_a$3);
|
|
2176
|
+
MyBanner = __decorateElement$3(_init$3, 0, "MyBanner", _MyBanner_decorators, MyBanner);
|
|
2177
|
+
__runInitializers$3(_init$3, 1, MyBanner);
|
|
2178
|
+
const footerStyles = css`
|
|
2179
|
+
:host {
|
|
2180
|
+
display: flex;
|
|
2181
|
+
align-items: center;
|
|
2182
|
+
justify-content: space-between;
|
|
2183
|
+
padding: 1rem 2rem;
|
|
2184
|
+
background: var(--background-color);
|
|
2185
|
+
color: var(--text-color);
|
|
2186
|
+
border-top: 1px solid var(--nav-link-hover-bg);
|
|
2187
|
+
flex-wrap: wrap;
|
|
2188
|
+
}
|
|
2189
|
+
|
|
2190
|
+
.footer-content {
|
|
2191
|
+
display: flex;
|
|
2192
|
+
flex-direction: column;
|
|
2193
|
+
align-items: flex-start;
|
|
2194
|
+
}
|
|
2195
|
+
|
|
2196
|
+
.links {
|
|
2197
|
+
display: flex;
|
|
2198
|
+
gap: 1rem;
|
|
2199
|
+
margin-top: 0.5rem;
|
|
2200
|
+
}
|
|
2201
|
+
|
|
2202
|
+
.links a {
|
|
2203
|
+
color: inherit;
|
|
2204
|
+
text-decoration: none;
|
|
2205
|
+
padding: 0.25rem 0.5rem;
|
|
2206
|
+
border-radius: 4px;
|
|
2207
|
+
transition: background-color 0.3s ease;
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
.links a:hover {
|
|
2211
|
+
background-color: rgba(0, 0, 0, 0.1);
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2214
|
+
@media (min-width: 768px) {
|
|
2215
|
+
.footer-content {
|
|
2216
|
+
flex-direction: row;
|
|
2217
|
+
align-items: center;
|
|
2218
|
+
width: 100%;
|
|
2219
|
+
justify-content: space-between;
|
|
2220
|
+
}
|
|
2221
|
+
.links {
|
|
2222
|
+
margin-top: 0;
|
|
2223
|
+
}
|
|
2224
|
+
}
|
|
2225
|
+
`;
|
|
2226
|
+
var __create$2 = Object.create;
|
|
2227
|
+
var __defProp$2 = Object.defineProperty;
|
|
2228
|
+
var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
|
|
2229
|
+
var __knownSymbol$2 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
2230
|
+
var __typeError$2 = (msg) => {
|
|
2231
|
+
throw TypeError(msg);
|
|
2232
|
+
};
|
|
2233
|
+
var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2234
|
+
var __name$2 = (target, value) => __defProp$2(target, "name", { value, configurable: true });
|
|
2235
|
+
var __decoratorStart$2 = (base) => [, , , __create$2(base?.[__knownSymbol$2("metadata")] ?? null)];
|
|
2236
|
+
var __decoratorStrings$2 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
2237
|
+
var __expectFn$2 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$2("Function expected") : fn;
|
|
2238
|
+
var __decoratorContext$2 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$2[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$2("Already initialized") : fns.push(__expectFn$2(fn || null)) });
|
|
2239
|
+
var __decoratorMetadata$2 = (array, target) => __defNormalProp$2(target, __knownSymbol$2("metadata"), array[3]);
|
|
2240
|
+
var __runInitializers$2 = (array, flags, self, value) => {
|
|
2241
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
2242
|
+
return value;
|
|
2243
|
+
};
|
|
2244
|
+
var __decorateElement$2 = (array, flags, name, decorators, target, extra) => {
|
|
2245
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
2246
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings$2[k + 5];
|
|
2247
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
2248
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc$2(k < 4 ? target : { get [name]() {
|
|
2249
|
+
return __privateGet$2(this, extra);
|
|
2250
|
+
}, set [name](x) {
|
|
2251
|
+
return __privateSet$2(this, extra, x);
|
|
2252
|
+
} }, name));
|
|
2253
|
+
k ? p && k < 4 && __name$2(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name$2(target, name);
|
|
2254
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
2255
|
+
ctx = __decoratorContext$2(k, name, done = {}, array[3], extraInitializers);
|
|
2256
|
+
if (k) {
|
|
2257
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn$2(target, x) : (x) => name in x };
|
|
2258
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet$2 : __privateMethod$2)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
2259
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet$2(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
2260
|
+
}
|
|
2261
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
2262
|
+
if (k ^ 4 || it === void 0) __expectFn$2(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
2263
|
+
else if (typeof it !== "object" || it === null) __typeError$2("Object expected");
|
|
2264
|
+
else __expectFn$2(fn = it.get) && (desc.get = fn), __expectFn$2(fn = it.set) && (desc.set = fn), __expectFn$2(fn = it.init) && initializers.unshift(fn);
|
|
2265
|
+
}
|
|
2266
|
+
return k || __decoratorMetadata$2(array, target), desc && __defProp$2(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
2267
|
+
};
|
|
2268
|
+
var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
|
|
2269
|
+
var __privateIn$2 = (member, obj) => Object(obj) !== obj ? __typeError$2('Cannot use the "in" operator on this value') : member.has(obj);
|
|
2270
|
+
var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
2271
|
+
var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
2272
|
+
var __privateSet$2 = (obj, member, value, setter) => (__accessCheck$2(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
2273
|
+
var __privateMethod$2 = (obj, member, method) => (__accessCheck$2(obj, member, "access private method"), method);
|
|
2274
|
+
var _footerLinks_dec, _copyright_dec, _a$2, _FooterComponent_decorators, _init$2, _copyright, _footerLinks;
|
|
2275
|
+
_FooterComponent_decorators = [customElement("my-footer")];
|
|
2276
|
+
class FooterComponent extends (_a$2 = LitElement, _copyright_dec = [property({ type: String })], _footerLinks_dec = [property({ type: Array, attribute: "footer-links" })], _a$2) {
|
|
2277
|
+
constructor() {
|
|
2278
|
+
super(...arguments);
|
|
2279
|
+
__privateAdd$2(this, _copyright, __runInitializers$2(_init$2, 8, this, "")), __runInitializers$2(_init$2, 11, this);
|
|
2280
|
+
__privateAdd$2(this, _footerLinks, __runInitializers$2(_init$2, 12, this, [])), __runInitializers$2(_init$2, 15, this);
|
|
2281
|
+
}
|
|
2282
|
+
render() {
|
|
2283
|
+
return html`
|
|
2284
|
+
<div class="footer-content">
|
|
2285
|
+
<span>© ${this.copyright}</span>
|
|
2286
|
+
<span class="links">
|
|
2287
|
+
${(this.footerLinks || []).map(
|
|
2288
|
+
(link) => {
|
|
2289
|
+
const isExternal = link.link.startsWith("http") || link.link.startsWith("mailto:");
|
|
2290
|
+
return html`<a
|
|
2291
|
+
href="${link.link}"
|
|
2292
|
+
target="${isExternal ? "_blank" : "_self"}"
|
|
2293
|
+
rel="${isExternal ? "noopener noreferrer" : ""}"
|
|
2294
|
+
>${link.text}</a>`;
|
|
2295
|
+
}
|
|
2296
|
+
)}
|
|
2297
|
+
</span>
|
|
2298
|
+
</div>
|
|
2299
|
+
`;
|
|
2300
|
+
}
|
|
2301
|
+
}
|
|
2302
|
+
_init$2 = __decoratorStart$2(_a$2);
|
|
2303
|
+
_copyright = /* @__PURE__ */ new WeakMap();
|
|
2304
|
+
_footerLinks = /* @__PURE__ */ new WeakMap();
|
|
2305
|
+
__decorateElement$2(_init$2, 4, "copyright", _copyright_dec, FooterComponent, _copyright);
|
|
2306
|
+
__decorateElement$2(_init$2, 4, "footerLinks", _footerLinks_dec, FooterComponent, _footerLinks);
|
|
2307
|
+
FooterComponent = __decorateElement$2(_init$2, 0, "FooterComponent", _FooterComponent_decorators, FooterComponent);
|
|
2308
|
+
FooterComponent.styles = footerStyles;
|
|
2309
|
+
__runInitializers$2(_init$2, 1, FooterComponent);
|
|
2310
|
+
const blogviewerStyles = css`
|
|
2311
|
+
:host {
|
|
2312
|
+
display: block;
|
|
2313
|
+
}
|
|
2314
|
+
|
|
2315
|
+
.tags {
|
|
2316
|
+
display: flex;
|
|
2317
|
+
gap: 0.5rem;
|
|
2318
|
+
flex-wrap: wrap;
|
|
2319
|
+
margin-top: 1rem;
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
.tag {
|
|
2323
|
+
background: var(--nav-link-hover-bg, #f0f0f0);
|
|
2324
|
+
color: var(--text-color, #333);
|
|
2325
|
+
padding: 0.25rem 0.5rem;
|
|
2326
|
+
border-radius: 4px;
|
|
2327
|
+
font-size: 0.875rem;
|
|
2328
|
+
border: 1px solid var(--border-color, transparent);
|
|
2329
|
+
}
|
|
2330
|
+
`;
|
|
2331
|
+
const __vite_import_meta_env__ = {};
|
|
2332
|
+
var __create$1 = Object.create;
|
|
2333
|
+
var __defProp$1 = Object.defineProperty;
|
|
2334
|
+
var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
|
|
2335
|
+
var __knownSymbol$1 = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
2336
|
+
var __typeError$1 = (msg) => {
|
|
2337
|
+
throw TypeError(msg);
|
|
2338
|
+
};
|
|
2339
|
+
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2340
|
+
var __name$1 = (target, value) => __defProp$1(target, "name", { value, configurable: true });
|
|
2341
|
+
var __decoratorStart$1 = (base) => [, , , __create$1(base?.[__knownSymbol$1("metadata")] ?? null)];
|
|
2342
|
+
var __decoratorStrings$1 = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
2343
|
+
var __expectFn$1 = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError$1("Function expected") : fn;
|
|
2344
|
+
var __decoratorContext$1 = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings$1[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError$1("Already initialized") : fns.push(__expectFn$1(fn || null)) });
|
|
2345
|
+
var __decoratorMetadata$1 = (array, target) => __defNormalProp$1(target, __knownSymbol$1("metadata"), array[3]);
|
|
2346
|
+
var __runInitializers$1 = (array, flags, self, value) => {
|
|
2347
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
2348
|
+
return value;
|
|
2349
|
+
};
|
|
2350
|
+
var __decorateElement$1 = (array, flags, name, decorators, target, extra) => {
|
|
2351
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
2352
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings$1[k + 5];
|
|
2353
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
2354
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc$1(k < 4 ? target : { get [name]() {
|
|
2355
|
+
return __privateGet$1(this, extra);
|
|
2356
|
+
}, set [name](x) {
|
|
2357
|
+
return __privateSet$1(this, extra, x);
|
|
2358
|
+
} }, name));
|
|
2359
|
+
k ? p && k < 4 && __name$1(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name$1(target, name);
|
|
2360
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
2361
|
+
ctx = __decoratorContext$1(k, name, done = {}, array[3], extraInitializers);
|
|
2362
|
+
if (k) {
|
|
2363
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn$1(target, x) : (x) => name in x };
|
|
2364
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet$1 : __privateMethod$1)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
2365
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet$1(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
2366
|
+
}
|
|
2367
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
2368
|
+
if (k ^ 4 || it === void 0) __expectFn$1(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
2369
|
+
else if (typeof it !== "object" || it === null) __typeError$1("Object expected");
|
|
2370
|
+
else __expectFn$1(fn = it.get) && (desc.get = fn), __expectFn$1(fn = it.set) && (desc.set = fn), __expectFn$1(fn = it.init) && initializers.unshift(fn);
|
|
2371
|
+
}
|
|
2372
|
+
return k || __decoratorMetadata$1(array, target), desc && __defProp$1(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
2373
|
+
};
|
|
2374
|
+
var __accessCheck$1 = (obj, member, msg) => member.has(obj) || __typeError$1("Cannot " + msg);
|
|
2375
|
+
var __privateIn$1 = (member, obj) => Object(obj) !== obj ? __typeError$1('Cannot use the "in" operator on this value') : member.has(obj);
|
|
2376
|
+
var __privateGet$1 = (obj, member, getter) => (__accessCheck$1(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
2377
|
+
var __privateAdd$1 = (obj, member, value) => member.has(obj) ? __typeError$1("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
2378
|
+
var __privateSet$1 = (obj, member, value, setter) => (__accessCheck$1(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
2379
|
+
var __privateMethod$1 = (obj, member, method) => (__accessCheck$1(obj, member, "access private method"), method);
|
|
2380
|
+
var _error_dec$1, _loading_dec$1, _blogPost_dec, _slug_dec$1, _a$1, _BlogViewer_decorators, _init$1, _slug$1, _blogPost, _loading$1, _error$1;
|
|
2381
|
+
const pipeline$1 = new MarkdownPipeline({
|
|
2382
|
+
imagePathPrefix: "images/",
|
|
2383
|
+
styleOptions: {
|
|
2384
|
+
classPrefix: "md-",
|
|
2385
|
+
addHeadingIds: true
|
|
2386
|
+
}
|
|
2387
|
+
});
|
|
2388
|
+
_BlogViewer_decorators = [customElement("my-blog-viewer")];
|
|
2389
|
+
class BlogViewer extends (_a$1 = LitElement, _slug_dec$1 = [property({ type: String })], _blogPost_dec = [state()], _loading_dec$1 = [state()], _error_dec$1 = [state()], _a$1) {
|
|
2390
|
+
constructor() {
|
|
2391
|
+
super(...arguments);
|
|
2392
|
+
__privateAdd$1(this, _slug$1, __runInitializers$1(_init$1, 8, this, "")), __runInitializers$1(_init$1, 11, this);
|
|
2393
|
+
__privateAdd$1(this, _blogPost, __runInitializers$1(_init$1, 12, this, null)), __runInitializers$1(_init$1, 15, this);
|
|
2394
|
+
__privateAdd$1(this, _loading$1, __runInitializers$1(_init$1, 16, this, true)), __runInitializers$1(_init$1, 19, this);
|
|
2395
|
+
__privateAdd$1(this, _error$1, __runInitializers$1(_init$1, 20, this, "")), __runInitializers$1(_init$1, 23, this);
|
|
2396
|
+
}
|
|
2397
|
+
get apiBaseUrl() {
|
|
2398
|
+
return this.getAttribute("api-url") || this.getAttribute("base-url") || window.__VITE_API_URL__ || __vite_import_meta_env__?.VITE_API_URL || (typeof window !== "undefined" ? window.location.origin : "");
|
|
2399
|
+
}
|
|
2400
|
+
connectedCallback() {
|
|
2401
|
+
super.connectedCallback();
|
|
2402
|
+
if (this.slug) {
|
|
2403
|
+
this.loadBlog();
|
|
2404
|
+
}
|
|
2405
|
+
}
|
|
2406
|
+
updated(changedProperties) {
|
|
2407
|
+
if (changedProperties.has("slug") && this.slug) {
|
|
2408
|
+
this.loadBlog();
|
|
2409
|
+
}
|
|
2410
|
+
}
|
|
2411
|
+
loadBlog() {
|
|
2412
|
+
this.loading = true;
|
|
2413
|
+
this.error = "";
|
|
2414
|
+
console.log("[BlogViewer] Loading blog:", this.slug);
|
|
2415
|
+
const url = `${this.apiBaseUrl}/api/blogs/${this.slug}`;
|
|
2416
|
+
fetch(url).then((res) => {
|
|
2417
|
+
console.log("[BlogViewer] Response status:", res.status, "from:", url);
|
|
2418
|
+
if (res.ok) return res.json();
|
|
2419
|
+
throw new Error(`Failed to load blog: ${res.statusText}`);
|
|
2420
|
+
}).then((blog) => {
|
|
2421
|
+
console.log("[BlogViewer] Found blog:", blog?.title, "slug:", blog?.slug);
|
|
2422
|
+
if (blog && blog.content) {
|
|
2423
|
+
this.blogPost = blog;
|
|
2424
|
+
} else {
|
|
2425
|
+
this.error = "Blog content not found";
|
|
2426
|
+
}
|
|
2427
|
+
this.loading = false;
|
|
2428
|
+
}).catch((e) => {
|
|
2429
|
+
console.error("[BlogViewer] Failed to load blog:", e);
|
|
2430
|
+
this.error = "Failed to load blog";
|
|
2431
|
+
this.loading = false;
|
|
2432
|
+
});
|
|
2433
|
+
}
|
|
2434
|
+
render() {
|
|
2435
|
+
if (this.loading) {
|
|
2436
|
+
return html`<div class="blog-viewer"><div class="loading">Loading...</div></div>`;
|
|
2437
|
+
}
|
|
2438
|
+
if (this.error) {
|
|
2439
|
+
return html`<div class="blog-viewer"><div class="error">${this.error}</div></div>`;
|
|
2440
|
+
}
|
|
2441
|
+
if (!this.blogPost) {
|
|
2442
|
+
return html`<div class="blog-viewer"><div class="error">Blog not found</div></div>`;
|
|
2443
|
+
}
|
|
2444
|
+
const { title, date, tags, content } = this.blogPost;
|
|
2445
|
+
return html`
|
|
2446
|
+
<article class="blog-viewer">
|
|
2447
|
+
<h1>${title}</h1>
|
|
2448
|
+
<div class="meta">
|
|
2449
|
+
<span>${date}</span>
|
|
2450
|
+
</div>
|
|
2451
|
+
${tags?.length ? html`
|
|
2452
|
+
<div class="tags">
|
|
2453
|
+
${tags.map((tag) => html`<span class="tag">${tag}</span>`)}
|
|
2454
|
+
</div>
|
|
2455
|
+
` : ""}
|
|
2456
|
+
<div class="content" .innerHTML=${this.renderMarkdown(content)}></div>
|
|
2457
|
+
</article>
|
|
2458
|
+
`;
|
|
2459
|
+
}
|
|
2460
|
+
renderMarkdown(content) {
|
|
2461
|
+
if (!content) return "";
|
|
2462
|
+
const nodes = pipeline$1.parse(content);
|
|
2463
|
+
return pipeline$1.render(nodes);
|
|
2464
|
+
}
|
|
2465
|
+
}
|
|
2466
|
+
_init$1 = __decoratorStart$1(_a$1);
|
|
2467
|
+
_slug$1 = /* @__PURE__ */ new WeakMap();
|
|
2468
|
+
_blogPost = /* @__PURE__ */ new WeakMap();
|
|
2469
|
+
_loading$1 = /* @__PURE__ */ new WeakMap();
|
|
2470
|
+
_error$1 = /* @__PURE__ */ new WeakMap();
|
|
2471
|
+
__decorateElement$1(_init$1, 4, "slug", _slug_dec$1, BlogViewer, _slug$1);
|
|
2472
|
+
__decorateElement$1(_init$1, 4, "blogPost", _blogPost_dec, BlogViewer, _blogPost);
|
|
2473
|
+
__decorateElement$1(_init$1, 4, "loading", _loading_dec$1, BlogViewer, _loading$1);
|
|
2474
|
+
__decorateElement$1(_init$1, 4, "error", _error_dec$1, BlogViewer, _error$1);
|
|
2475
|
+
BlogViewer = __decorateElement$1(_init$1, 0, "BlogViewer", _BlogViewer_decorators, BlogViewer);
|
|
2476
|
+
BlogViewer.styles = blogviewerStyles;
|
|
2477
|
+
__runInitializers$1(_init$1, 1, BlogViewer);
|
|
2478
|
+
const storyviewerStyles = css`
|
|
2479
|
+
:host {
|
|
2480
|
+
display: block;
|
|
2481
|
+
max-width: 800px;
|
|
2482
|
+
margin: 0 auto;
|
|
2483
|
+
}
|
|
2484
|
+
|
|
2485
|
+
.loading {
|
|
2486
|
+
text-align: center;
|
|
2487
|
+
padding: 2rem;
|
|
2488
|
+
}
|
|
2489
|
+
|
|
2490
|
+
.error {
|
|
2491
|
+
color: red;
|
|
2492
|
+
text-align: center;
|
|
2493
|
+
padding: 2rem;
|
|
2494
|
+
}
|
|
2495
|
+
|
|
2496
|
+
h1 {
|
|
2497
|
+
margin-bottom: 0.5rem;
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
.meta {
|
|
2501
|
+
color: #666;
|
|
2502
|
+
margin-bottom: 2rem;
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
.tags {
|
|
2506
|
+
display: flex;
|
|
2507
|
+
gap: 0.5rem;
|
|
2508
|
+
flex-wrap: wrap;
|
|
2509
|
+
margin-top: 1rem;
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2512
|
+
.tag {
|
|
2513
|
+
background: var(--nav-link-hover-bg, #f0f0f0);
|
|
2514
|
+
color: var(--text-color, #333);
|
|
2515
|
+
padding: 0.25rem 0.5rem;
|
|
2516
|
+
border-radius: 4px;
|
|
2517
|
+
font-size: 0.875rem;
|
|
2518
|
+
border: 1px solid var(--border-color, transparent);
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2521
|
+
.content {
|
|
2522
|
+
line-height: 1.8;
|
|
2523
|
+
text-align: left;
|
|
2524
|
+
}
|
|
2525
|
+
|
|
2526
|
+
.content h1, .content h2, .content h3 {
|
|
2527
|
+
margin-top: 1.5rem;
|
|
2528
|
+
}
|
|
2529
|
+
`;
|
|
2530
|
+
var __create = Object.create;
|
|
2531
|
+
var __defProp = Object.defineProperty;
|
|
2532
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
2533
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
2534
|
+
var __typeError = (msg) => {
|
|
2535
|
+
throw TypeError(msg);
|
|
2536
|
+
};
|
|
2537
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2538
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
2539
|
+
var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
|
|
2540
|
+
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
|
|
2541
|
+
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
|
|
2542
|
+
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
|
|
2543
|
+
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
|
|
2544
|
+
var __runInitializers = (array, flags, self, value) => {
|
|
2545
|
+
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
|
|
2546
|
+
return value;
|
|
2547
|
+
};
|
|
2548
|
+
var __decorateElement = (array, flags, name, decorators, target, extra) => {
|
|
2549
|
+
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
|
|
2550
|
+
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
|
|
2551
|
+
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
|
|
2552
|
+
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
|
|
2553
|
+
return __privateGet(this, extra);
|
|
2554
|
+
}, set [name](x) {
|
|
2555
|
+
return __privateSet(this, extra, x);
|
|
2556
|
+
} }, name));
|
|
2557
|
+
k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
|
|
2558
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
2559
|
+
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
|
|
2560
|
+
if (k) {
|
|
2561
|
+
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
|
|
2562
|
+
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
|
|
2563
|
+
if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
|
|
2564
|
+
}
|
|
2565
|
+
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
|
|
2566
|
+
if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
|
|
2567
|
+
else if (typeof it !== "object" || it === null) __typeError("Object expected");
|
|
2568
|
+
else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
|
|
2569
|
+
}
|
|
2570
|
+
return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
|
|
2571
|
+
};
|
|
2572
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
2573
|
+
var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
|
|
2574
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
2575
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
2576
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
2577
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
2578
|
+
var _error_dec, _loading_dec, _storyPost_dec, _slug_dec, _a, _StoryViewer_decorators, _init, _slug, _storyPost, _loading, _error;
|
|
2579
|
+
const pipeline = new MarkdownPipeline({
|
|
2580
|
+
imagePathPrefix: "images/",
|
|
2581
|
+
styleOptions: {
|
|
2582
|
+
classPrefix: "md-",
|
|
2583
|
+
addHeadingIds: true
|
|
2584
|
+
}
|
|
2585
|
+
});
|
|
2586
|
+
_StoryViewer_decorators = [customElement("my-story-viewer")];
|
|
2587
|
+
class StoryViewer extends (_a = LitElement, _slug_dec = [property({ type: String })], _storyPost_dec = [state()], _loading_dec = [state()], _error_dec = [state()], _a) {
|
|
2588
|
+
constructor() {
|
|
2589
|
+
super(...arguments);
|
|
2590
|
+
__privateAdd(this, _slug, __runInitializers(_init, 8, this, "")), __runInitializers(_init, 11, this);
|
|
2591
|
+
__privateAdd(this, _storyPost, __runInitializers(_init, 12, this, null)), __runInitializers(_init, 15, this);
|
|
2592
|
+
__privateAdd(this, _loading, __runInitializers(_init, 16, this, true)), __runInitializers(_init, 19, this);
|
|
2593
|
+
__privateAdd(this, _error, __runInitializers(_init, 20, this, "")), __runInitializers(_init, 23, this);
|
|
2594
|
+
}
|
|
2595
|
+
get apiBaseUrl() {
|
|
2596
|
+
return this.getAttribute("api-url") || window.__VITE_API_URL__ || void 0 || "https://api.exampledomain.com";
|
|
2597
|
+
}
|
|
2598
|
+
async connectedCallback() {
|
|
2599
|
+
super.connectedCallback();
|
|
2600
|
+
if (this.slug) {
|
|
2601
|
+
await this.loadStory();
|
|
2602
|
+
}
|
|
2603
|
+
}
|
|
2604
|
+
updated(changedProperties) {
|
|
2605
|
+
if (changedProperties.has("slug") && this.slug) {
|
|
2606
|
+
this.loadStory();
|
|
2607
|
+
}
|
|
2608
|
+
}
|
|
2609
|
+
async loadStory() {
|
|
2610
|
+
this.loading = true;
|
|
2611
|
+
this.error = "";
|
|
2612
|
+
try {
|
|
2613
|
+
const res = await fetch(`${this.apiBaseUrl}/api/stories/${this.slug}`);
|
|
2614
|
+
if (res.ok) {
|
|
2615
|
+
const story = await res.json();
|
|
2616
|
+
if (story && story.content) {
|
|
2617
|
+
this.storyPost = story;
|
|
2618
|
+
} else {
|
|
2619
|
+
this.error = "Story content not found";
|
|
2620
|
+
}
|
|
2621
|
+
} else {
|
|
2622
|
+
this.error = "Story not found";
|
|
2623
|
+
}
|
|
2624
|
+
} catch (e) {
|
|
2625
|
+
this.error = "Failed to load story";
|
|
2626
|
+
}
|
|
2627
|
+
this.loading = false;
|
|
2628
|
+
}
|
|
2629
|
+
render() {
|
|
2630
|
+
if (this.loading) {
|
|
2631
|
+
return html`<div class="loading">Loading...</div>`;
|
|
2632
|
+
}
|
|
2633
|
+
if (this.error) {
|
|
2634
|
+
return html`<div class="error">${this.error}</div>`;
|
|
2635
|
+
}
|
|
2636
|
+
if (!this.storyPost) {
|
|
2637
|
+
return html`<div class="error">Story not found</div>`;
|
|
2638
|
+
}
|
|
2639
|
+
const { title, date, tags, content } = this.storyPost;
|
|
2640
|
+
return html`
|
|
2641
|
+
<article>
|
|
2642
|
+
<h1>${title}</h1>
|
|
2643
|
+
<div class="meta">
|
|
2644
|
+
<span>${date}</span>
|
|
2645
|
+
</div>
|
|
2646
|
+
${tags?.length ? html`
|
|
2647
|
+
<div class="tags">
|
|
2648
|
+
${tags.map((tag) => html`<span class="tag">${tag}</span>`)}
|
|
2649
|
+
</div>
|
|
2650
|
+
` : ""}
|
|
2651
|
+
<div class="content" .innerHTML=${this.renderMarkdown(content)}></div>
|
|
2652
|
+
</article>
|
|
2653
|
+
`;
|
|
2654
|
+
}
|
|
2655
|
+
renderMarkdown(content) {
|
|
2656
|
+
if (!content) return "";
|
|
2657
|
+
const nodes = pipeline.parse(content);
|
|
2658
|
+
return pipeline.render(nodes);
|
|
2659
|
+
}
|
|
2660
|
+
}
|
|
2661
|
+
_init = __decoratorStart(_a);
|
|
2662
|
+
_slug = /* @__PURE__ */ new WeakMap();
|
|
2663
|
+
_storyPost = /* @__PURE__ */ new WeakMap();
|
|
2664
|
+
_loading = /* @__PURE__ */ new WeakMap();
|
|
2665
|
+
_error = /* @__PURE__ */ new WeakMap();
|
|
2666
|
+
__decorateElement(_init, 4, "slug", _slug_dec, StoryViewer, _slug);
|
|
2667
|
+
__decorateElement(_init, 4, "storyPost", _storyPost_dec, StoryViewer, _storyPost);
|
|
2668
|
+
__decorateElement(_init, 4, "loading", _loading_dec, StoryViewer, _loading);
|
|
2669
|
+
__decorateElement(_init, 4, "error", _error_dec, StoryViewer, _error);
|
|
2670
|
+
StoryViewer = __decorateElement(_init, 0, "StoryViewer", _StoryViewer_decorators, StoryViewer);
|
|
2671
|
+
StoryViewer.styles = storyviewerStyles;
|
|
2672
|
+
__runInitializers(_init, 1, StoryViewer);
|
|
2673
|
+
export {
|
|
2674
|
+
AdminAboutMeSection as A,
|
|
2675
|
+
BlogViewer as B,
|
|
2676
|
+
FooterComponent as F,
|
|
2677
|
+
MyAboutme as M,
|
|
2678
|
+
StoryViewer as S,
|
|
2679
|
+
AdminBlogsSection as a,
|
|
2680
|
+
AdminHomeSection as b,
|
|
2681
|
+
AdminImagesSection as c,
|
|
2682
|
+
AdminLoginForm as d,
|
|
2683
|
+
AdminLogoSection as e,
|
|
2684
|
+
AdminPortal as f,
|
|
2685
|
+
AdminProfileSection as g,
|
|
2686
|
+
AdminStaticSection as h,
|
|
2687
|
+
AdminStoriesSection as i,
|
|
2688
|
+
MyBanner as j,
|
|
2689
|
+
adminLoaded as k
|
|
2690
|
+
};
|