@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.
Files changed (120) hide show
  1. package/dist/app.d.ts +5 -1
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +332 -119
  4. package/dist/i18n/context.d.ts +2 -2
  5. package/dist/i18n/context.js +1 -1
  6. package/dist/i18n/i18n.d.ts +1 -1
  7. package/dist/i18n/i18n.js +1 -1
  8. package/dist/i18n/index.d.ts +1 -1
  9. package/dist/i18n/index.js +1 -1
  10. package/dist/i18n/locales/en.d.ts.map +1 -1
  11. package/dist/i18n/locales/en.js +1 -1
  12. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -1
  13. package/dist/i18n/locales/zh-Hans.js +1 -1
  14. package/dist/i18n/locales/zh-Hant.d.ts.map +1 -1
  15. package/dist/i18n/locales/zh-Hant.js +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/lib/config.d.ts +83 -0
  19. package/dist/lib/config.d.ts.map +1 -0
  20. package/dist/lib/config.js +104 -0
  21. package/dist/lib/constants.d.ts +2 -1
  22. package/dist/lib/constants.d.ts.map +1 -1
  23. package/dist/lib/constants.js +5 -2
  24. package/dist/lib/sse.d.ts +15 -0
  25. package/dist/lib/sse.d.ts.map +1 -1
  26. package/dist/lib/sse.js +13 -0
  27. package/dist/lib/theme.d.ts +44 -0
  28. package/dist/lib/theme.d.ts.map +1 -0
  29. package/dist/lib/theme.js +65 -0
  30. package/dist/routes/dash/appearance.d.ts +13 -0
  31. package/dist/routes/dash/appearance.d.ts.map +1 -0
  32. package/dist/routes/dash/appearance.js +164 -0
  33. package/dist/routes/dash/collections.d.ts.map +1 -1
  34. package/dist/routes/dash/collections.js +5 -4
  35. package/dist/routes/dash/index.d.ts.map +1 -1
  36. package/dist/routes/dash/index.js +2 -1
  37. package/dist/routes/dash/media.d.ts.map +1 -1
  38. package/dist/routes/dash/media.js +3 -2
  39. package/dist/routes/dash/pages.d.ts.map +1 -1
  40. package/dist/routes/dash/pages.js +5 -4
  41. package/dist/routes/dash/posts.d.ts.map +1 -1
  42. package/dist/routes/dash/posts.js +5 -4
  43. package/dist/routes/dash/redirects.d.ts.map +1 -1
  44. package/dist/routes/dash/redirects.js +3 -2
  45. package/dist/routes/dash/settings.d.ts.map +1 -1
  46. package/dist/routes/dash/settings.js +39 -38
  47. package/dist/routes/pages/archive.d.ts.map +1 -1
  48. package/dist/routes/pages/archive.js +2 -1
  49. package/dist/routes/pages/collection.d.ts.map +1 -1
  50. package/dist/routes/pages/collection.js +2 -1
  51. package/dist/routes/pages/home.d.ts.map +1 -1
  52. package/dist/routes/pages/home.js +2 -1
  53. package/dist/routes/pages/page.d.ts.map +1 -1
  54. package/dist/routes/pages/page.js +2 -1
  55. package/dist/routes/pages/post.d.ts.map +1 -1
  56. package/dist/routes/pages/post.js +2 -1
  57. package/dist/routes/pages/search.d.ts.map +1 -1
  58. package/dist/routes/pages/search.js +2 -1
  59. package/dist/services/settings.d.ts +1 -0
  60. package/dist/services/settings.d.ts.map +1 -1
  61. package/dist/services/settings.js +3 -0
  62. package/dist/theme/color-themes.d.ts +30 -0
  63. package/dist/theme/color-themes.d.ts.map +1 -0
  64. package/dist/theme/color-themes.js +268 -0
  65. package/dist/theme/layouts/BaseLayout.d.ts +5 -0
  66. package/dist/theme/layouts/BaseLayout.d.ts.map +1 -1
  67. package/dist/theme/layouts/BaseLayout.js +70 -3
  68. package/dist/theme/layouts/DashLayout.d.ts +2 -0
  69. package/dist/theme/layouts/DashLayout.d.ts.map +1 -1
  70. package/dist/theme/layouts/DashLayout.js +10 -1
  71. package/dist/theme/layouts/index.d.ts +1 -1
  72. package/dist/theme/layouts/index.d.ts.map +1 -1
  73. package/dist/types.d.ts +64 -32
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js +52 -0
  76. package/package.json +1 -1
  77. package/src/app.tsx +286 -59
  78. package/src/db/migrations/{0000_solid_moon_knight.sql → 0000_square_wallflower.sql} +3 -3
  79. package/src/db/migrations/meta/0000_snapshot.json +9 -9
  80. package/src/db/migrations/meta/_journal.json +2 -30
  81. package/src/i18n/context.tsx +2 -2
  82. package/src/i18n/i18n.ts +1 -1
  83. package/src/i18n/index.ts +1 -1
  84. package/src/i18n/locales/en.po +328 -252
  85. package/src/i18n/locales/en.ts +1 -1
  86. package/src/i18n/locales/zh-Hans.po +315 -278
  87. package/src/i18n/locales/zh-Hans.ts +1 -1
  88. package/src/i18n/locales/zh-Hant.po +315 -278
  89. package/src/i18n/locales/zh-Hant.ts +1 -1
  90. package/src/index.ts +0 -2
  91. package/src/lib/config.ts +120 -0
  92. package/src/lib/constants.ts +3 -0
  93. package/src/lib/sse.ts +38 -0
  94. package/src/lib/theme.ts +86 -0
  95. package/src/preset.css +9 -0
  96. package/src/routes/dash/appearance.tsx +180 -0
  97. package/src/routes/dash/collections.tsx +5 -4
  98. package/src/routes/dash/index.tsx +2 -1
  99. package/src/routes/dash/media.tsx +3 -2
  100. package/src/routes/dash/pages.tsx +5 -4
  101. package/src/routes/dash/posts.tsx +5 -4
  102. package/src/routes/dash/redirects.tsx +3 -2
  103. package/src/routes/dash/settings.tsx +51 -49
  104. package/src/routes/pages/archive.tsx +2 -1
  105. package/src/routes/pages/collection.tsx +2 -1
  106. package/src/routes/pages/home.tsx +2 -1
  107. package/src/routes/pages/page.tsx +2 -1
  108. package/src/routes/pages/post.tsx +2 -1
  109. package/src/routes/pages/search.tsx +2 -1
  110. package/src/services/settings.ts +5 -0
  111. package/src/styles/components.css +93 -0
  112. package/src/theme/color-themes.ts +321 -0
  113. package/src/theme/layouts/BaseLayout.tsx +61 -1
  114. package/src/theme/layouts/DashLayout.tsx +13 -2
  115. package/src/theme/layouts/index.ts +5 -1
  116. package/src/types.ts +74 -34
  117. package/src/db/migrations/0001_add_search_fts.sql +0 -40
  118. package/src/db/migrations/0002_collection_path.sql +0 -2
  119. package/src/db/migrations/0003_collection_path_nullable.sql +0 -21
  120. 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":"AAAA;;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
+ {"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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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;AAGjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,eAAe,kDAAkB,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.var.services.settings.get("SITE_NAME") ?? "Jant";
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":"AAAA;;;;;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
+ {"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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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":"AAAA;;;;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
+ {"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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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":"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;AAWjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,WAAW,kDAAkB,CAAC"}
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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":"AAAA;;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
+ {"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.var.services.settings.get("SITE_NAME") ?? "Jant";
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.var.services.settings.get("SITE_NAME") ?? "Jant";
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;AAIjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,cAAc,kDAAkB,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, saved }) {
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
- required: true
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 all = await c.var.services.settings.getAll();
245
- const siteName = all["SITE_NAME"] ?? "Jant";
246
- const siteDescription = all["SITE_DESCRIPTION"] ?? "";
247
- const siteLanguage = all["SITE_LANGUAGE"] ?? "en";
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: 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: siteName,
256
- siteDescription: siteDescription,
247
+ siteName: dbSiteName || "",
248
+ siteDescription: dbSiteDescription || "",
257
249
  siteLanguage: siteLanguage,
258
- saved: saved
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 oldLanguage = await c.var.services.settings.get("SITE_LANGUAGE") ?? "en";
266
- await c.var.services.settings.setMany({
267
- SITE_NAME: body.siteName,
268
- SITE_DESCRIPTION: body.siteDescription,
269
- SITE_LANGUAGE: body.siteLanguage
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
- // No language change - show inline success message
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.patchElements('<div id="password-message"><div class="alert-destructive mb-4"><h2>Passwords do not match.</h2></div></div>');
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.patchElements('<div id="password-message"><div class="alert-destructive mb-4"><h2>Current password is incorrect.</h2></div></div>');
302
+ await stream.toast("Current password is incorrect.", "error");
302
303
  });
303
304
  }
304
305
  return sse(c, async (stream)=>{
305
- await stream.patchElements('<div id="password-message"><div class="alert mb-4"><h2>Password changed successfully.</h2></div></div>');
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":"AAAA;;;;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
+ {"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.var.services.settings.get("SITE_NAME") ?? "Jant";
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":"AAAA;;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
+ {"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.var.services.settings.get("SITE_NAME") ?? "Jant";
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;AAKjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,UAAU,kDAAkB,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.var.services.settings.get("SITE_NAME") ?? "Jant";
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":"AAAA;;;;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"}
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"}