@jant/core 0.2.16 → 0.2.18
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/app.d.ts +5 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +332 -119
- package/dist/i18n/context.d.ts +2 -2
- package/dist/i18n/context.js +1 -1
- package/dist/i18n/i18n.d.ts +1 -1
- package/dist/i18n/i18n.js +1 -1
- package/dist/i18n/index.d.ts +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +1 -1
- package/dist/i18n/locales/zh-Hans.d.ts.map +1 -1
- package/dist/i18n/locales/zh-Hans.js +1 -1
- package/dist/i18n/locales/zh-Hant.d.ts.map +1 -1
- package/dist/i18n/locales/zh-Hant.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/config.d.ts +83 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +104 -0
- package/dist/lib/constants.d.ts +2 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +5 -2
- package/dist/lib/sse.d.ts +15 -0
- package/dist/lib/sse.d.ts.map +1 -1
- package/dist/lib/sse.js +13 -0
- package/dist/lib/theme.d.ts +44 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +65 -0
- package/dist/routes/dash/appearance.d.ts +13 -0
- package/dist/routes/dash/appearance.d.ts.map +1 -0
- package/dist/routes/dash/appearance.js +164 -0
- package/dist/routes/dash/collections.d.ts.map +1 -1
- package/dist/routes/dash/collections.js +5 -4
- package/dist/routes/dash/index.d.ts.map +1 -1
- package/dist/routes/dash/index.js +2 -1
- package/dist/routes/dash/media.d.ts.map +1 -1
- package/dist/routes/dash/media.js +3 -2
- package/dist/routes/dash/pages.d.ts.map +1 -1
- package/dist/routes/dash/pages.js +5 -4
- package/dist/routes/dash/posts.d.ts.map +1 -1
- package/dist/routes/dash/posts.js +5 -4
- package/dist/routes/dash/redirects.d.ts.map +1 -1
- package/dist/routes/dash/redirects.js +3 -2
- package/dist/routes/dash/settings.d.ts.map +1 -1
- package/dist/routes/dash/settings.js +39 -38
- package/dist/routes/pages/archive.d.ts.map +1 -1
- package/dist/routes/pages/archive.js +2 -1
- package/dist/routes/pages/collection.d.ts.map +1 -1
- package/dist/routes/pages/collection.js +2 -1
- package/dist/routes/pages/home.d.ts.map +1 -1
- package/dist/routes/pages/home.js +2 -1
- package/dist/routes/pages/page.d.ts.map +1 -1
- package/dist/routes/pages/page.js +2 -1
- package/dist/routes/pages/post.d.ts.map +1 -1
- package/dist/routes/pages/post.js +2 -1
- package/dist/routes/pages/search.d.ts.map +1 -1
- package/dist/routes/pages/search.js +2 -1
- package/dist/services/settings.d.ts +1 -0
- package/dist/services/settings.d.ts.map +1 -1
- package/dist/services/settings.js +3 -0
- package/dist/theme/color-themes.d.ts +30 -0
- package/dist/theme/color-themes.d.ts.map +1 -0
- package/dist/theme/color-themes.js +268 -0
- package/dist/theme/layouts/BaseLayout.d.ts +5 -0
- package/dist/theme/layouts/BaseLayout.d.ts.map +1 -1
- package/dist/theme/layouts/BaseLayout.js +70 -3
- package/dist/theme/layouts/DashLayout.d.ts +2 -0
- package/dist/theme/layouts/DashLayout.d.ts.map +1 -1
- package/dist/theme/layouts/DashLayout.js +10 -1
- package/dist/theme/layouts/index.d.ts +1 -1
- package/dist/theme/layouts/index.d.ts.map +1 -1
- package/dist/types.d.ts +64 -32
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +52 -0
- package/package.json +1 -1
- package/src/app.tsx +286 -59
- package/src/db/migrations/{0000_solid_moon_knight.sql → 0000_square_wallflower.sql} +3 -3
- package/src/db/migrations/meta/0000_snapshot.json +9 -9
- package/src/db/migrations/meta/_journal.json +2 -30
- package/src/i18n/context.tsx +2 -2
- package/src/i18n/i18n.ts +1 -1
- package/src/i18n/index.ts +1 -1
- package/src/i18n/locales/en.po +328 -252
- package/src/i18n/locales/en.ts +1 -1
- package/src/i18n/locales/zh-Hans.po +315 -278
- package/src/i18n/locales/zh-Hans.ts +1 -1
- package/src/i18n/locales/zh-Hant.po +315 -278
- package/src/i18n/locales/zh-Hant.ts +1 -1
- package/src/index.ts +0 -2
- package/src/lib/config.ts +120 -0
- package/src/lib/constants.ts +3 -0
- package/src/lib/sse.ts +38 -0
- package/src/lib/theme.ts +86 -0
- package/src/preset.css +9 -0
- package/src/routes/dash/appearance.tsx +180 -0
- package/src/routes/dash/collections.tsx +5 -4
- package/src/routes/dash/index.tsx +2 -1
- package/src/routes/dash/media.tsx +3 -2
- package/src/routes/dash/pages.tsx +5 -4
- package/src/routes/dash/posts.tsx +5 -4
- package/src/routes/dash/redirects.tsx +3 -2
- package/src/routes/dash/settings.tsx +51 -49
- package/src/routes/pages/archive.tsx +2 -1
- package/src/routes/pages/collection.tsx +2 -1
- package/src/routes/pages/home.tsx +2 -1
- package/src/routes/pages/page.tsx +2 -1
- package/src/routes/pages/post.tsx +2 -1
- package/src/routes/pages/search.tsx +2 -1
- package/src/services/settings.ts +5 -0
- package/src/styles/components.css +93 -0
- package/src/theme/color-themes.ts +321 -0
- package/src/theme/layouts/BaseLayout.tsx +61 -1
- package/src/theme/layouts/DashLayout.tsx +13 -2
- package/src/theme/layouts/index.ts +5 -1
- package/src/types.ts +74 -34
- package/src/db/migrations/0001_add_search_fts.sql +0 -40
- package/src/db/migrations/0002_collection_path.sql +0 -2
- package/src/db/migrations/0003_collection_path_nullable.sql +0 -21
- package/src/db/migrations/0004_media_uuid.sql +0 -35
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard Appearance Routes
|
|
4
|
+
*/ import { Hono } from "hono";
|
|
5
|
+
import { useLingui as $_useLingui } from "@jant/core/i18n";
|
|
6
|
+
import { DashLayout } from "../../theme/layouts/index.js";
|
|
7
|
+
import { sse } from "../../lib/sse.js";
|
|
8
|
+
import { getSiteName } from "../../lib/config.js";
|
|
9
|
+
import { SETTINGS_KEYS } from "../../lib/constants.js";
|
|
10
|
+
import { getAvailableThemes } from "../../lib/theme.js";
|
|
11
|
+
export const appearanceRoutes = new Hono();
|
|
12
|
+
function ThemeCard({ theme, selected }) {
|
|
13
|
+
const expr = `$theme === '${theme.id}'`;
|
|
14
|
+
const { preview } = theme;
|
|
15
|
+
return /*#__PURE__*/ _jsx("label", {
|
|
16
|
+
class: `block cursor-pointer rounded-lg border overflow-hidden transition-colors ${selected ? "border-primary" : "border-border"}`,
|
|
17
|
+
"data-class:border-primary": expr,
|
|
18
|
+
"data-class:border-border": `$theme !== '${theme.id}'`,
|
|
19
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
20
|
+
class: "grid grid-cols-2",
|
|
21
|
+
children: [
|
|
22
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
23
|
+
class: "p-5",
|
|
24
|
+
style: `background-color:${preview.lightBg};color:${preview.lightText}`,
|
|
25
|
+
children: [
|
|
26
|
+
/*#__PURE__*/ _jsx("input", {
|
|
27
|
+
type: "radio",
|
|
28
|
+
name: "theme",
|
|
29
|
+
value: theme.id,
|
|
30
|
+
"data-bind": "theme",
|
|
31
|
+
checked: selected || undefined,
|
|
32
|
+
class: "mb-1"
|
|
33
|
+
}),
|
|
34
|
+
/*#__PURE__*/ _jsx("h3", {
|
|
35
|
+
class: "font-bold text-lg",
|
|
36
|
+
children: theme.name
|
|
37
|
+
}),
|
|
38
|
+
/*#__PURE__*/ _jsxs("p", {
|
|
39
|
+
class: "text-sm mt-2 leading-relaxed",
|
|
40
|
+
children: [
|
|
41
|
+
"This is the ",
|
|
42
|
+
theme.name,
|
|
43
|
+
" theme in light mode. Links",
|
|
44
|
+
" ",
|
|
45
|
+
/*#__PURE__*/ _jsx("a", {
|
|
46
|
+
tabIndex: -1,
|
|
47
|
+
class: "underline",
|
|
48
|
+
style: `color:${preview.lightLink}`,
|
|
49
|
+
children: "look like this"
|
|
50
|
+
}),
|
|
51
|
+
". We'll show the correct light or dark mode based on your visitor's settings."
|
|
52
|
+
]
|
|
53
|
+
})
|
|
54
|
+
]
|
|
55
|
+
}),
|
|
56
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
57
|
+
class: "p-5",
|
|
58
|
+
style: `background-color:${preview.darkBg};color:${preview.darkText}`,
|
|
59
|
+
children: [
|
|
60
|
+
/*#__PURE__*/ _jsx("h3", {
|
|
61
|
+
class: "font-bold text-lg",
|
|
62
|
+
children: theme.name
|
|
63
|
+
}),
|
|
64
|
+
/*#__PURE__*/ _jsxs("p", {
|
|
65
|
+
class: "text-sm mt-2 leading-relaxed",
|
|
66
|
+
children: [
|
|
67
|
+
"This is the ",
|
|
68
|
+
theme.name,
|
|
69
|
+
" theme in dark mode. Links",
|
|
70
|
+
" ",
|
|
71
|
+
/*#__PURE__*/ _jsx("a", {
|
|
72
|
+
tabIndex: -1,
|
|
73
|
+
class: "underline",
|
|
74
|
+
style: `color:${preview.darkLink}`,
|
|
75
|
+
children: "look like this"
|
|
76
|
+
}),
|
|
77
|
+
". We'll show the correct light or dark mode based on your visitor's settings."
|
|
78
|
+
]
|
|
79
|
+
})
|
|
80
|
+
]
|
|
81
|
+
})
|
|
82
|
+
]
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function AppearanceContent({ themes, currentThemeId }) {
|
|
87
|
+
const { i18n: $__i18n, _: $__ } = $_useLingui();
|
|
88
|
+
const signals = JSON.stringify({
|
|
89
|
+
theme: currentThemeId
|
|
90
|
+
}).replace(/</g, "\\u003c");
|
|
91
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
92
|
+
"data-signals": signals,
|
|
93
|
+
"data-on:change": "@post('/dash/appearance')",
|
|
94
|
+
class: "max-w-3xl",
|
|
95
|
+
children: /*#__PURE__*/ _jsxs("fieldset", {
|
|
96
|
+
children: [
|
|
97
|
+
/*#__PURE__*/ _jsx("legend", {
|
|
98
|
+
class: "text-lg font-semibold",
|
|
99
|
+
children: $__i18n._({
|
|
100
|
+
id: "rFmBG3",
|
|
101
|
+
message: "Color theme"
|
|
102
|
+
})
|
|
103
|
+
}),
|
|
104
|
+
/*#__PURE__*/ _jsx("p", {
|
|
105
|
+
class: "text-sm text-muted-foreground mb-4",
|
|
106
|
+
children: $__i18n._({
|
|
107
|
+
id: "07Epll",
|
|
108
|
+
message: "This will theme both your site and your dashboard. All color themes support dark mode."
|
|
109
|
+
})
|
|
110
|
+
}),
|
|
111
|
+
/*#__PURE__*/ _jsx("div", {
|
|
112
|
+
class: "flex flex-col gap-4",
|
|
113
|
+
children: themes.map((theme)=>/*#__PURE__*/ _jsx(ThemeCard, {
|
|
114
|
+
theme: theme,
|
|
115
|
+
selected: theme.id === currentThemeId
|
|
116
|
+
}, theme.id))
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
})
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Appearance page
|
|
123
|
+
appearanceRoutes.get("/", async (c)=>{
|
|
124
|
+
const { settings } = c.var.services;
|
|
125
|
+
const siteName = await getSiteName(c);
|
|
126
|
+
const currentThemeId = await settings.get(SETTINGS_KEYS.THEME) ?? "default";
|
|
127
|
+
const themes = getAvailableThemes(c.var.config);
|
|
128
|
+
const saved = c.req.query("saved") !== undefined;
|
|
129
|
+
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
130
|
+
c: c,
|
|
131
|
+
title: "Appearance",
|
|
132
|
+
siteName: siteName,
|
|
133
|
+
currentPath: "/dash/appearance",
|
|
134
|
+
toast: saved ? {
|
|
135
|
+
message: "Theme saved successfully."
|
|
136
|
+
} : undefined,
|
|
137
|
+
children: /*#__PURE__*/ _jsx(AppearanceContent, {
|
|
138
|
+
themes: themes,
|
|
139
|
+
currentThemeId: currentThemeId
|
|
140
|
+
})
|
|
141
|
+
}));
|
|
142
|
+
});
|
|
143
|
+
// Save theme
|
|
144
|
+
appearanceRoutes.post("/", async (c)=>{
|
|
145
|
+
const body = await c.req.json();
|
|
146
|
+
const { settings } = c.var.services;
|
|
147
|
+
const themes = getAvailableThemes(c.var.config);
|
|
148
|
+
// Validate theme ID
|
|
149
|
+
const validTheme = themes.find((t)=>t.id === body.theme);
|
|
150
|
+
if (!validTheme) {
|
|
151
|
+
return sse(c, async (stream)=>{
|
|
152
|
+
await stream.toast("Invalid theme selected.", "error");
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (validTheme.id === "default") {
|
|
156
|
+
await settings.remove(SETTINGS_KEYS.THEME);
|
|
157
|
+
} else {
|
|
158
|
+
await settings.set(SETTINGS_KEYS.THEME, validTheme.id);
|
|
159
|
+
}
|
|
160
|
+
// Full page reload to apply the new theme CSS
|
|
161
|
+
return sse(c, async (stream)=>{
|
|
162
|
+
await stream.redirect("/dash/appearance?saved");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/collections.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/collections.tsx"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAYjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,iBAAiB,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Dashboard Collections Routes
|
|
4
5
|
*/ import { Hono } from "hono";
|
|
@@ -396,7 +397,7 @@ function EditCollectionContent({ collection }) {
|
|
|
396
397
|
}
|
|
397
398
|
// List collections
|
|
398
399
|
collectionsRoutes.get("/", async (c)=>{
|
|
399
|
-
const siteName = await c
|
|
400
|
+
const siteName = await getSiteName(c);
|
|
400
401
|
const collections = await c.var.services.collections.list();
|
|
401
402
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
402
403
|
c: c,
|
|
@@ -410,7 +411,7 @@ collectionsRoutes.get("/", async (c)=>{
|
|
|
410
411
|
});
|
|
411
412
|
// New collection form
|
|
412
413
|
collectionsRoutes.get("/new", async (c)=>{
|
|
413
|
-
const siteName = await c
|
|
414
|
+
const siteName = await getSiteName(c);
|
|
414
415
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
415
416
|
c: c,
|
|
416
417
|
title: "New Collection",
|
|
@@ -438,7 +439,7 @@ collectionsRoutes.get("/:id", async (c)=>{
|
|
|
438
439
|
const collection = await c.var.services.collections.getById(id);
|
|
439
440
|
if (!collection) return c.notFound();
|
|
440
441
|
const posts = await c.var.services.collections.getPosts(id);
|
|
441
|
-
const siteName = await c
|
|
442
|
+
const siteName = await getSiteName(c);
|
|
442
443
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
443
444
|
c: c,
|
|
444
445
|
title: collection.title,
|
|
@@ -456,7 +457,7 @@ collectionsRoutes.get("/:id/edit", async (c)=>{
|
|
|
456
457
|
if (isNaN(id)) return c.notFound();
|
|
457
458
|
const collection = await c.var.services.collections.getById(id);
|
|
458
459
|
if (!collection) return c.notFound();
|
|
459
|
-
const siteName = await c
|
|
460
|
+
const siteName = await getSiteName(c);
|
|
460
461
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
461
462
|
c: c,
|
|
462
463
|
title: `Edit: ${collection.title}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,eAAe,kDAAkB,CAAC"}
|
|
@@ -7,6 +7,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
|
|
|
7
7
|
import { useLingui as $_useLingui } from "@jant/core/i18n";
|
|
8
8
|
import { Trans as Trans_ } from "@jant/core/i18n";
|
|
9
9
|
import { DashLayout } from "../../theme/layouts/index.js";
|
|
10
|
+
import { getSiteName } from "../../lib/config.js";
|
|
10
11
|
export const dashIndexRoutes = new Hono();
|
|
11
12
|
/**
|
|
12
13
|
* Dashboard content component
|
|
@@ -97,7 +98,7 @@ export const dashIndexRoutes = new Hono();
|
|
|
97
98
|
});
|
|
98
99
|
}
|
|
99
100
|
dashIndexRoutes.get("/", async (c)=>{
|
|
100
|
-
const siteName = await c
|
|
101
|
+
const siteName = await getSiteName(c);
|
|
101
102
|
// Get some stats
|
|
102
103
|
const allPosts = await c.var.services.posts.list({
|
|
103
104
|
limit: 1000
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/media.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/media.tsx"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAOjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,WAAW,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Dashboard Media Routes
|
|
4
5
|
*
|
|
@@ -530,7 +531,7 @@ function processSSEEvent(event) {
|
|
|
530
531
|
// List media
|
|
531
532
|
mediaRoutes.get("/", async (c)=>{
|
|
532
533
|
const mediaList = await c.var.services.media.list(100);
|
|
533
|
-
const siteName = await c
|
|
534
|
+
const siteName = await getSiteName(c);
|
|
534
535
|
const r2PublicUrl = c.env.R2_PUBLIC_URL;
|
|
535
536
|
const imageTransformUrl = c.env.IMAGE_TRANSFORM_URL;
|
|
536
537
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
@@ -550,7 +551,7 @@ mediaRoutes.get("/:id", async (c)=>{
|
|
|
550
551
|
const id = c.req.param("id");
|
|
551
552
|
const media = await c.var.services.media.getById(id);
|
|
552
553
|
if (!media) return c.notFound();
|
|
553
|
-
const siteName = await c
|
|
554
|
+
const siteName = await getSiteName(c);
|
|
554
555
|
const r2PublicUrl = c.env.R2_PUBLIC_URL;
|
|
555
556
|
const imageTransformUrl = c.env.IMAGE_TRANSFORM_URL;
|
|
556
557
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/pages.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/pages.tsx"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAejD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,WAAW,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Dashboard Pages Routes
|
|
4
5
|
*
|
|
@@ -191,7 +192,7 @@ pagesRoutes.get("/", async (c)=>{
|
|
|
191
192
|
],
|
|
192
193
|
limit: 100
|
|
193
194
|
});
|
|
194
|
-
const siteName = await c
|
|
195
|
+
const siteName = await getSiteName(c);
|
|
195
196
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
196
197
|
c: c,
|
|
197
198
|
title: "Pages",
|
|
@@ -204,7 +205,7 @@ pagesRoutes.get("/", async (c)=>{
|
|
|
204
205
|
});
|
|
205
206
|
// New page form
|
|
206
207
|
pagesRoutes.get("/new", async (c)=>{
|
|
207
|
-
const siteName = await c
|
|
208
|
+
const siteName = await getSiteName(c);
|
|
208
209
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
209
210
|
c: c,
|
|
210
211
|
title: "New Page",
|
|
@@ -233,7 +234,7 @@ pagesRoutes.get("/:id", async (c)=>{
|
|
|
233
234
|
if (!id) return c.notFound();
|
|
234
235
|
const page = await c.var.services.posts.getById(id);
|
|
235
236
|
if (!page || page.type !== "page") return c.notFound();
|
|
236
|
-
const siteName = await c
|
|
237
|
+
const siteName = await getSiteName(c);
|
|
237
238
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
238
239
|
c: c,
|
|
239
240
|
title: page.title || "Page",
|
|
@@ -250,7 +251,7 @@ pagesRoutes.get("/:id/edit", async (c)=>{
|
|
|
250
251
|
if (!id) return c.notFound();
|
|
251
252
|
const page = await c.var.services.posts.getById(id);
|
|
252
253
|
if (!page || page.type !== "page") return c.notFound();
|
|
253
|
-
const siteName = await c
|
|
254
|
+
const siteName = await getSiteName(c);
|
|
254
255
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
255
256
|
c: c,
|
|
256
257
|
title: `Edit: ${page.title || "Page"}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/posts.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/posts.tsx"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAWjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,WAAW,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Dashboard Posts Routes
|
|
4
5
|
*/ import { Hono } from "hono";
|
|
@@ -56,7 +57,7 @@ postsRoutes.get("/", async (c)=>{
|
|
|
56
57
|
"draft"
|
|
57
58
|
]
|
|
58
59
|
});
|
|
59
|
-
const siteName = await c
|
|
60
|
+
const siteName = await getSiteName(c);
|
|
60
61
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
61
62
|
c: c,
|
|
62
63
|
title: "Posts",
|
|
@@ -69,7 +70,7 @@ postsRoutes.get("/", async (c)=>{
|
|
|
69
70
|
});
|
|
70
71
|
// New post form
|
|
71
72
|
postsRoutes.get("/new", async (c)=>{
|
|
72
|
-
const siteName = await c
|
|
73
|
+
const siteName = await getSiteName(c);
|
|
73
74
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
74
75
|
c: c,
|
|
75
76
|
title: "New Post",
|
|
@@ -160,7 +161,7 @@ postsRoutes.get("/:id", async (c)=>{
|
|
|
160
161
|
if (!id) return c.notFound();
|
|
161
162
|
const post = await c.var.services.posts.getById(id);
|
|
162
163
|
if (!post) return c.notFound();
|
|
163
|
-
const siteName = await c
|
|
164
|
+
const siteName = await getSiteName(c);
|
|
164
165
|
const pageTitle = post.title || "Post";
|
|
165
166
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
166
167
|
c: c,
|
|
@@ -178,7 +179,7 @@ postsRoutes.get("/:id/edit", async (c)=>{
|
|
|
178
179
|
if (!id) return c.notFound();
|
|
179
180
|
const post = await c.var.services.posts.getById(id);
|
|
180
181
|
if (!post) return c.notFound();
|
|
181
|
-
const siteName = await c
|
|
182
|
+
const siteName = await getSiteName(c);
|
|
182
183
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
183
184
|
c: c,
|
|
184
185
|
title: `Edit: ${post.title || "Post"}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/redirects.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/redirects.tsx"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAUjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,eAAe,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Dashboard Redirects Routes
|
|
4
5
|
*/ import { Hono } from "hono";
|
|
@@ -196,7 +197,7 @@ function NewRedirectContent() {
|
|
|
196
197
|
}
|
|
197
198
|
// List redirects
|
|
198
199
|
redirectsRoutes.get("/", async (c)=>{
|
|
199
|
-
const siteName = await c
|
|
200
|
+
const siteName = await getSiteName(c);
|
|
200
201
|
const redirects = await c.var.services.redirects.list();
|
|
201
202
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
202
203
|
c: c,
|
|
@@ -210,7 +211,7 @@ redirectsRoutes.get("/", async (c)=>{
|
|
|
210
211
|
});
|
|
211
212
|
// New redirect form
|
|
212
213
|
redirectsRoutes.get("/new", async (c)=>{
|
|
213
|
-
const siteName = await c
|
|
214
|
+
const siteName = await getSiteName(c);
|
|
214
215
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
215
216
|
c: c,
|
|
216
217
|
title: "New Redirect",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/settings.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/dash/settings.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,cAAc,kDAAkB,CAAC"}
|
|
@@ -5,8 +5,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-
|
|
|
5
5
|
import { useLingui as $_useLingui } from "@jant/core/i18n";
|
|
6
6
|
import { DashLayout } from "../../theme/layouts/index.js";
|
|
7
7
|
import { sse } from "../../lib/sse.js";
|
|
8
|
+
import { getSiteLanguage, getConfigFallback } from "../../lib/config.js";
|
|
8
9
|
export const settingsRoutes = new Hono();
|
|
9
|
-
function SettingsContent({ siteName, siteDescription, siteLanguage,
|
|
10
|
+
function SettingsContent({ siteName, siteDescription, siteLanguage, siteNameFallback, siteDescriptionFallback }) {
|
|
10
11
|
const { i18n: $__i18n, _: $__ } = $_useLingui();
|
|
11
12
|
const generalSignals = JSON.stringify({
|
|
12
13
|
siteName,
|
|
@@ -22,17 +23,6 @@ function SettingsContent({ siteName, siteDescription, siteLanguage, saved }) {
|
|
|
22
23
|
message: "Settings"
|
|
23
24
|
})
|
|
24
25
|
}),
|
|
25
|
-
saved && /*#__PURE__*/ _jsx("div", {
|
|
26
|
-
id: "settings-saved-toast",
|
|
27
|
-
class: "alert mb-4 max-w-lg transition-opacity duration-300",
|
|
28
|
-
"data-init": `console.log('[toast] init fired at', Date.now()); history.replaceState({}, '', '/dash/settings'); setTimeout(() => { console.log('[toast] hiding at', Date.now()); const el = document.getElementById('settings-saved-toast'); if (el) { el.style.opacity = '0'; setTimeout(() => el.remove(), 300) } }, 3000)`,
|
|
29
|
-
children: /*#__PURE__*/ _jsx("h2", {
|
|
30
|
-
children: $__i18n._({
|
|
31
|
-
id: "T0bsor",
|
|
32
|
-
message: "Settings saved successfully."
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
}),
|
|
36
26
|
/*#__PURE__*/ _jsxs("div", {
|
|
37
27
|
class: "flex flex-col gap-6 max-w-lg",
|
|
38
28
|
children: [
|
|
@@ -40,9 +30,6 @@ function SettingsContent({ siteName, siteDescription, siteLanguage, saved }) {
|
|
|
40
30
|
"data-signals": generalSignals,
|
|
41
31
|
"data-on:submit__prevent": "@post('/dash/settings')",
|
|
42
32
|
children: [
|
|
43
|
-
/*#__PURE__*/ _jsx("div", {
|
|
44
|
-
id: "settings-message"
|
|
45
|
-
}),
|
|
46
33
|
/*#__PURE__*/ _jsxs("div", {
|
|
47
34
|
class: "card",
|
|
48
35
|
children: [
|
|
@@ -71,7 +58,7 @@ function SettingsContent({ siteName, siteDescription, siteLanguage, saved }) {
|
|
|
71
58
|
type: "text",
|
|
72
59
|
"data-bind": "siteName",
|
|
73
60
|
class: "input",
|
|
74
|
-
|
|
61
|
+
placeholder: siteNameFallback
|
|
75
62
|
})
|
|
76
63
|
]
|
|
77
64
|
}),
|
|
@@ -89,6 +76,7 @@ function SettingsContent({ siteName, siteDescription, siteLanguage, saved }) {
|
|
|
89
76
|
"data-bind": "siteDescription",
|
|
90
77
|
class: "textarea",
|
|
91
78
|
rows: 3,
|
|
79
|
+
placeholder: siteDescriptionFallback,
|
|
92
80
|
children: siteDescription
|
|
93
81
|
})
|
|
94
82
|
]
|
|
@@ -144,9 +132,6 @@ function SettingsContent({ siteName, siteDescription, siteLanguage, saved }) {
|
|
|
144
132
|
"data-signals": "{currentPassword: '', newPassword: '', confirmPassword: ''}",
|
|
145
133
|
"data-on:submit__prevent": "@post('/dash/settings/password')",
|
|
146
134
|
children: [
|
|
147
|
-
/*#__PURE__*/ _jsx("div", {
|
|
148
|
-
id: "password-message"
|
|
149
|
-
}),
|
|
150
135
|
/*#__PURE__*/ _jsxs("div", {
|
|
151
136
|
class: "card",
|
|
152
137
|
children: [
|
|
@@ -241,41 +226,57 @@ function SettingsContent({ siteName, siteDescription, siteLanguage, saved }) {
|
|
|
241
226
|
}
|
|
242
227
|
// Settings page
|
|
243
228
|
settingsRoutes.get("/", async (c)=>{
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
const
|
|
247
|
-
const
|
|
229
|
+
const { settings } = c.var.services;
|
|
230
|
+
// Fetch raw DB values (null if not set)
|
|
231
|
+
const dbSiteName = await settings.get("SITE_NAME");
|
|
232
|
+
const dbSiteDescription = await settings.get("SITE_DESCRIPTION");
|
|
233
|
+
const siteLanguage = await getSiteLanguage(c);
|
|
234
|
+
// Fallback values (ENV > Default) for placeholders
|
|
235
|
+
const siteNameFallback = getConfigFallback(c, "SITE_NAME");
|
|
236
|
+
const siteDescriptionFallback = getConfigFallback(c, "SITE_DESCRIPTION");
|
|
248
237
|
const saved = c.req.query("saved") !== undefined;
|
|
249
238
|
return c.html(/*#__PURE__*/ _jsx(DashLayout, {
|
|
250
239
|
c: c,
|
|
251
240
|
title: "Settings",
|
|
252
|
-
siteName:
|
|
241
|
+
siteName: dbSiteName || siteNameFallback,
|
|
253
242
|
currentPath: "/dash/settings",
|
|
243
|
+
toast: saved ? {
|
|
244
|
+
message: "Settings saved successfully."
|
|
245
|
+
} : undefined,
|
|
254
246
|
children: /*#__PURE__*/ _jsx(SettingsContent, {
|
|
255
|
-
siteName:
|
|
256
|
-
siteDescription:
|
|
247
|
+
siteName: dbSiteName || "",
|
|
248
|
+
siteDescription: dbSiteDescription || "",
|
|
257
249
|
siteLanguage: siteLanguage,
|
|
258
|
-
|
|
250
|
+
siteNameFallback: siteNameFallback,
|
|
251
|
+
siteDescriptionFallback: siteDescriptionFallback
|
|
259
252
|
})
|
|
260
253
|
}));
|
|
261
254
|
});
|
|
262
255
|
// Update settings
|
|
263
256
|
settingsRoutes.post("/", async (c)=>{
|
|
264
257
|
const body = await c.req.json();
|
|
265
|
-
const
|
|
266
|
-
await
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
258
|
+
const { settings } = c.var.services;
|
|
259
|
+
const oldLanguage = await settings.get("SITE_LANGUAGE") ?? "en";
|
|
260
|
+
// For text fields: empty = remove from DB (fall back to ENV > Default)
|
|
261
|
+
if (body.siteName.trim()) {
|
|
262
|
+
await settings.set("SITE_NAME", body.siteName.trim());
|
|
263
|
+
} else {
|
|
264
|
+
await settings.remove("SITE_NAME");
|
|
265
|
+
}
|
|
266
|
+
if (body.siteDescription.trim()) {
|
|
267
|
+
await settings.set("SITE_DESCRIPTION", body.siteDescription.trim());
|
|
268
|
+
} else {
|
|
269
|
+
await settings.remove("SITE_DESCRIPTION");
|
|
270
|
+
}
|
|
271
|
+
// Language always has a value from the select
|
|
272
|
+
await settings.set("SITE_LANGUAGE", body.siteLanguage);
|
|
271
273
|
const languageChanged = oldLanguage !== body.siteLanguage;
|
|
272
274
|
return sse(c, async (stream)=>{
|
|
273
275
|
if (languageChanged) {
|
|
274
276
|
// Language changed - full reload needed to update all UI text
|
|
275
277
|
await stream.redirect("/dash/settings?saved");
|
|
276
278
|
} else {
|
|
277
|
-
|
|
278
|
-
await stream.patchElements('<div id="settings-message"><div class="alert mb-4 transition-opacity duration-300" data-init="setTimeout(() => { el.style.opacity = \'0\'; setTimeout(() => el.remove(), 300) }, 3000)"><h2>Settings saved successfully.</h2></div></div>');
|
|
279
|
+
await stream.toast("Settings saved successfully.");
|
|
279
280
|
}
|
|
280
281
|
});
|
|
281
282
|
});
|
|
@@ -284,7 +285,7 @@ settingsRoutes.post("/password", async (c)=>{
|
|
|
284
285
|
const body = await c.req.json();
|
|
285
286
|
if (body.newPassword !== body.confirmPassword) {
|
|
286
287
|
return sse(c, async (stream)=>{
|
|
287
|
-
await stream.
|
|
288
|
+
await stream.toast("Passwords do not match.", "error");
|
|
288
289
|
});
|
|
289
290
|
}
|
|
290
291
|
try {
|
|
@@ -298,11 +299,11 @@ settingsRoutes.post("/password", async (c)=>{
|
|
|
298
299
|
});
|
|
299
300
|
} catch {
|
|
300
301
|
return sse(c, async (stream)=>{
|
|
301
|
-
await stream.
|
|
302
|
+
await stream.toast("Current password is incorrect.", "error");
|
|
302
303
|
});
|
|
303
304
|
}
|
|
304
305
|
return sse(c, async (stream)=>{
|
|
305
|
-
await stream.
|
|
306
|
+
await stream.toast("Password changed successfully.");
|
|
306
307
|
await stream.patchSignals({
|
|
307
308
|
currentPassword: "",
|
|
308
309
|
newPassword: "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/archive.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/archive.tsx"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAOjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAI3D,eAAO,MAAM,aAAa,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Archive Page Route
|
|
4
5
|
*
|
|
@@ -208,7 +209,7 @@ archiveRoutes.get("/", async (c)=>{
|
|
|
208
209
|
// Parse cursor
|
|
209
210
|
const cursorParam = c.req.query("cursor");
|
|
210
211
|
const cursor = cursorParam ? parseInt(cursorParam, 10) : undefined;
|
|
211
|
-
const siteName = await c
|
|
212
|
+
const siteName = await getSiteName(c);
|
|
212
213
|
// Fetch one extra to check for more
|
|
213
214
|
const posts = await c.var.services.posts.list({
|
|
214
215
|
type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/collection.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/collection.tsx"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,gBAAgB,kDAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { getSiteName } from "../../lib/config.js";
|
|
2
3
|
/**
|
|
3
4
|
* Collection Page Route
|
|
4
5
|
*/ import { Hono } from "hono";
|
|
@@ -80,7 +81,7 @@ collectionRoutes.get("/:path", async (c)=>{
|
|
|
80
81
|
const collection = await c.var.services.collections.getByPath(path);
|
|
81
82
|
if (!collection) return c.notFound();
|
|
82
83
|
const posts = await c.var.services.collections.getPosts(collection.id);
|
|
83
|
-
const siteName = await c
|
|
84
|
+
const siteName = await getSiteName(c);
|
|
84
85
|
return c.html(/*#__PURE__*/ _jsx(BaseLayout, {
|
|
85
86
|
title: `${collection.title} - ${siteName}`,
|
|
86
87
|
description: collection.description ?? undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/home.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/home.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,UAAU,kDAAkB,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { useLingui as $_useLingui } from "@jant/core/i18n";
|
|
|
6
6
|
import { BaseLayout } from "../../theme/layouts/index.js";
|
|
7
7
|
import * as sqid from "../../lib/sqid.js";
|
|
8
8
|
import * as time from "../../lib/time.js";
|
|
9
|
+
import { getSiteName } from "../../lib/config.js";
|
|
9
10
|
export const homeRoutes = new Hono();
|
|
10
11
|
function HomeContent({ siteName, posts }) {
|
|
11
12
|
const { i18n: $__i18n, _: $__ } = $_useLingui();
|
|
@@ -103,7 +104,7 @@ homeRoutes.get("/", async (c)=>{
|
|
|
103
104
|
if (!isComplete) {
|
|
104
105
|
return c.redirect("/setup");
|
|
105
106
|
}
|
|
106
|
-
const siteName = await c
|
|
107
|
+
const siteName = await getSiteName(c);
|
|
107
108
|
const posts = await c.var.services.posts.list({
|
|
108
109
|
visibility: [
|
|
109
110
|
"featured",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../src/routes/pages/page.tsx"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAQ,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,UAAU,kDAAkB,CAAC"}
|