@jant/core 0.1.2 → 0.2.0

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 (288) hide show
  1. package/dist/app.d.ts +34 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +474 -0
  4. package/dist/assets/datastar.min.js +1775 -0
  5. package/dist/auth.d.ts +23 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +34 -0
  8. package/{src/client.ts → dist/client.d.ts} +1 -1
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +4 -0
  11. package/dist/db/index.d.ts +10 -0
  12. package/dist/db/index.d.ts.map +1 -0
  13. package/dist/db/index.js +10 -0
  14. package/dist/db/schema.d.ts +1507 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +183 -0
  17. package/{src/i18n/Trans.tsx → dist/i18n/Trans.d.ts} +4 -10
  18. package/dist/i18n/Trans.d.ts.map +1 -0
  19. package/dist/i18n/Trans.js +24 -0
  20. package/dist/i18n/context.d.ts +69 -0
  21. package/dist/i18n/context.d.ts.map +1 -0
  22. package/dist/i18n/context.js +61 -0
  23. package/dist/i18n/detect.d.ts +31 -0
  24. package/dist/i18n/detect.d.ts.map +1 -0
  25. package/dist/i18n/detect.js +77 -0
  26. package/{src/i18n/i18n.ts → dist/i18n/i18n.d.ts} +5 -25
  27. package/dist/i18n/i18n.d.ts.map +1 -0
  28. package/dist/i18n/i18n.js +55 -0
  29. package/dist/i18n/index.d.ts +41 -0
  30. package/dist/i18n/index.d.ts.map +1 -0
  31. package/{src/i18n/index.ts → dist/i18n/index.js} +3 -24
  32. package/dist/i18n/locales/en.d.ts +3 -0
  33. package/dist/i18n/locales/en.d.ts.map +1 -0
  34. package/dist/i18n/locales/en.js +1 -0
  35. package/dist/i18n/locales/zh-Hans.d.ts +3 -0
  36. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  37. package/dist/i18n/locales/zh-Hans.js +1 -0
  38. package/dist/i18n/locales/zh-Hant.d.ts +3 -0
  39. package/dist/i18n/locales/zh-Hant.d.ts.map +1 -0
  40. package/dist/i18n/locales/zh-Hant.js +1 -0
  41. package/dist/i18n/locales.d.ts +11 -0
  42. package/dist/i18n/locales.d.ts.map +1 -0
  43. package/dist/i18n/locales.js +13 -0
  44. package/dist/i18n/middleware.d.ts +24 -0
  45. package/dist/i18n/middleware.d.ts.map +1 -0
  46. package/dist/i18n/middleware.js +41 -0
  47. package/dist/index.d.ts +16 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/{src/index.ts → dist/index.js} +1 -28
  50. package/dist/lib/assets.d.ts +19 -0
  51. package/dist/lib/assets.d.ts.map +1 -0
  52. package/dist/lib/assets.js +33 -0
  53. package/dist/lib/constants.d.ts +36 -0
  54. package/dist/lib/constants.d.ts.map +1 -0
  55. package/dist/lib/constants.js +50 -0
  56. package/{src/lib/image.ts → dist/lib/image.d.ts} +13 -47
  57. package/dist/lib/image.d.ts.map +1 -0
  58. package/dist/lib/image.js +77 -0
  59. package/{src/lib/index.ts → dist/lib/index.d.ts} +1 -1
  60. package/dist/lib/index.d.ts.map +1 -0
  61. package/dist/lib/index.js +7 -0
  62. package/dist/lib/markdown.d.ts +60 -0
  63. package/dist/lib/markdown.d.ts.map +1 -0
  64. package/{src/lib/markdown.ts → dist/lib/markdown.js} +16 -26
  65. package/dist/lib/schemas.d.ts +113 -0
  66. package/dist/lib/schemas.d.ts.map +1 -0
  67. package/dist/lib/schemas.js +71 -0
  68. package/dist/lib/sqid.d.ts +60 -0
  69. package/dist/lib/sqid.d.ts.map +1 -0
  70. package/{src/lib/sqid.ts → dist/lib/sqid.js} +15 -22
  71. package/dist/lib/sse.d.ts +95 -0
  72. package/dist/lib/sse.d.ts.map +1 -0
  73. package/dist/lib/sse.js +81 -0
  74. package/dist/lib/time.d.ts +90 -0
  75. package/dist/lib/time.d.ts.map +1 -0
  76. package/{src/lib/time.ts → dist/lib/time.js} +20 -33
  77. package/{src/lib/url.ts → dist/lib/url.d.ts} +5 -30
  78. package/dist/lib/url.d.ts.map +1 -0
  79. package/dist/lib/url.js +89 -0
  80. package/dist/middleware/auth.d.ts +24 -0
  81. package/dist/middleware/auth.d.ts.map +1 -0
  82. package/dist/middleware/auth.js +52 -0
  83. package/dist/routes/api/posts.d.ts +13 -0
  84. package/dist/routes/api/posts.d.ts.map +1 -0
  85. package/dist/routes/api/posts.js +124 -0
  86. package/dist/routes/api/search.d.ts +13 -0
  87. package/dist/routes/api/search.d.ts.map +1 -0
  88. package/dist/routes/api/search.js +49 -0
  89. package/dist/routes/api/upload.d.ts +16 -0
  90. package/dist/routes/api/upload.d.ts.map +1 -0
  91. package/dist/routes/api/upload.js +227 -0
  92. package/dist/routes/dash/collections.d.ts +13 -0
  93. package/dist/routes/dash/collections.d.ts.map +1 -0
  94. package/dist/routes/dash/collections.js +512 -0
  95. package/dist/routes/dash/index.d.ts +15 -0
  96. package/dist/routes/dash/index.d.ts.map +1 -0
  97. package/dist/routes/dash/index.js +117 -0
  98. package/dist/routes/dash/media.d.ts +16 -0
  99. package/dist/routes/dash/media.d.ts.map +1 -0
  100. package/dist/routes/dash/media.js +589 -0
  101. package/dist/routes/dash/pages.d.ts +15 -0
  102. package/dist/routes/dash/pages.d.ts.map +1 -0
  103. package/dist/routes/dash/pages.js +290 -0
  104. package/dist/routes/dash/posts.d.ts +13 -0
  105. package/dist/routes/dash/posts.d.ts.map +1 -0
  106. package/dist/routes/dash/posts.js +226 -0
  107. package/dist/routes/dash/redirects.d.ts +13 -0
  108. package/dist/routes/dash/redirects.d.ts.map +1 -0
  109. package/dist/routes/dash/redirects.js +237 -0
  110. package/dist/routes/dash/settings.d.ts +13 -0
  111. package/dist/routes/dash/settings.d.ts.map +1 -0
  112. package/dist/routes/dash/settings.js +154 -0
  113. package/dist/routes/feed/rss.d.ts +13 -0
  114. package/dist/routes/feed/rss.d.ts.map +1 -0
  115. package/dist/routes/feed/rss.js +95 -0
  116. package/dist/routes/feed/sitemap.d.ts +13 -0
  117. package/dist/routes/feed/sitemap.d.ts.map +1 -0
  118. package/dist/routes/feed/sitemap.js +59 -0
  119. package/dist/routes/pages/archive.d.ts +15 -0
  120. package/dist/routes/pages/archive.d.ts.map +1 -0
  121. package/dist/routes/pages/archive.js +255 -0
  122. package/dist/routes/pages/collection.d.ts +13 -0
  123. package/dist/routes/pages/collection.d.ts.map +1 -0
  124. package/dist/routes/pages/collection.js +93 -0
  125. package/dist/routes/pages/home.d.ts +13 -0
  126. package/dist/routes/pages/home.d.ts.map +1 -0
  127. package/dist/routes/pages/home.js +122 -0
  128. package/dist/routes/pages/page.d.ts +15 -0
  129. package/dist/routes/pages/page.d.ts.map +1 -0
  130. package/dist/routes/pages/page.js +69 -0
  131. package/dist/routes/pages/post.d.ts +13 -0
  132. package/dist/routes/pages/post.d.ts.map +1 -0
  133. package/dist/routes/pages/post.js +90 -0
  134. package/dist/routes/pages/search.d.ts +13 -0
  135. package/dist/routes/pages/search.d.ts.map +1 -0
  136. package/dist/routes/pages/search.js +180 -0
  137. package/dist/services/collection.d.ts +31 -0
  138. package/dist/services/collection.d.ts.map +1 -0
  139. package/dist/services/collection.js +108 -0
  140. package/dist/services/index.d.ts +28 -0
  141. package/dist/services/index.d.ts.map +1 -0
  142. package/dist/services/index.js +20 -0
  143. package/dist/services/media.d.ts +27 -0
  144. package/dist/services/media.d.ts.map +1 -0
  145. package/dist/services/media.js +62 -0
  146. package/dist/services/post.d.ts +31 -0
  147. package/dist/services/post.d.ts.map +1 -0
  148. package/dist/services/post.js +191 -0
  149. package/dist/services/redirect.d.ts +15 -0
  150. package/dist/services/redirect.d.ts.map +1 -0
  151. package/dist/services/redirect.js +48 -0
  152. package/dist/services/search.d.ts +26 -0
  153. package/dist/services/search.d.ts.map +1 -0
  154. package/dist/services/search.js +61 -0
  155. package/dist/services/settings.d.ts +17 -0
  156. package/dist/services/settings.d.ts.map +1 -0
  157. package/dist/services/settings.js +65 -0
  158. package/dist/theme/components/ActionButtons.d.ts +43 -0
  159. package/dist/theme/components/ActionButtons.d.ts.map +1 -0
  160. package/dist/theme/components/ActionButtons.js +50 -0
  161. package/dist/theme/components/CrudPageHeader.d.ts +23 -0
  162. package/dist/theme/components/CrudPageHeader.d.ts.map +1 -0
  163. package/dist/theme/components/CrudPageHeader.js +22 -0
  164. package/dist/theme/components/DangerZone.d.ts +36 -0
  165. package/dist/theme/components/DangerZone.d.ts.map +1 -0
  166. package/dist/theme/components/DangerZone.js +39 -0
  167. package/dist/theme/components/EmptyState.d.ts +27 -0
  168. package/dist/theme/components/EmptyState.d.ts.map +1 -0
  169. package/dist/theme/components/EmptyState.js +27 -0
  170. package/dist/theme/components/ListItemRow.d.ts +15 -0
  171. package/dist/theme/components/ListItemRow.d.ts.map +1 -0
  172. package/dist/theme/components/ListItemRow.js +21 -0
  173. package/dist/theme/components/PageForm.d.ts +14 -0
  174. package/dist/theme/components/PageForm.d.ts.map +1 -0
  175. package/dist/theme/components/PageForm.js +173 -0
  176. package/dist/theme/components/Pagination.d.ts +46 -0
  177. package/dist/theme/components/Pagination.d.ts.map +1 -0
  178. package/dist/theme/components/Pagination.js +159 -0
  179. package/dist/theme/components/PostForm.d.ts +12 -0
  180. package/dist/theme/components/PostForm.d.ts.map +1 -0
  181. package/dist/theme/components/PostForm.js +230 -0
  182. package/dist/theme/components/PostList.d.ts +10 -0
  183. package/dist/theme/components/PostList.d.ts.map +1 -0
  184. package/dist/theme/components/PostList.js +73 -0
  185. package/dist/theme/components/ThreadView.d.ts +15 -0
  186. package/dist/theme/components/ThreadView.d.ts.map +1 -0
  187. package/dist/theme/components/ThreadView.js +111 -0
  188. package/dist/theme/components/TypeBadge.d.ts +12 -0
  189. package/dist/theme/components/TypeBadge.d.ts.map +1 -0
  190. package/dist/theme/components/TypeBadge.js +39 -0
  191. package/dist/theme/components/VisibilityBadge.d.ts +12 -0
  192. package/dist/theme/components/VisibilityBadge.d.ts.map +1 -0
  193. package/dist/theme/components/VisibilityBadge.js +37 -0
  194. package/{src/theme/components/index.ts → dist/theme/components/index.d.ts} +1 -0
  195. package/dist/theme/components/index.d.ts.map +1 -0
  196. package/dist/theme/components/index.js +12 -0
  197. package/dist/theme/index.d.ts +21 -0
  198. package/dist/theme/index.d.ts.map +1 -0
  199. package/{src/theme/index.ts → dist/theme/index.js} +1 -4
  200. package/dist/theme/layouts/BaseLayout.d.ts +16 -0
  201. package/dist/theme/layouts/BaseLayout.d.ts.map +1 -0
  202. package/dist/theme/layouts/BaseLayout.js +58 -0
  203. package/dist/theme/layouts/DashLayout.d.ts +15 -0
  204. package/dist/theme/layouts/DashLayout.d.ts.map +1 -0
  205. package/dist/theme/layouts/DashLayout.js +139 -0
  206. package/{src/theme/layouts/index.ts → dist/theme/layouts/index.d.ts} +1 -0
  207. package/dist/theme/layouts/index.d.ts.map +1 -0
  208. package/dist/theme/layouts/index.js +2 -0
  209. package/dist/theme/styles/main.css +2 -0
  210. package/dist/types.d.ts +179 -0
  211. package/dist/types.d.ts.map +1 -0
  212. package/dist/types.js +19 -0
  213. package/package.json +26 -26
  214. package/drizzle.config.ts +0 -10
  215. package/lingui.config.ts +0 -16
  216. package/src/app.tsx +0 -377
  217. package/src/assets/datastar.min.js +0 -8
  218. package/src/auth.ts +0 -38
  219. package/src/db/index.ts +0 -14
  220. package/src/db/migrations/0000_solid_moon_knight.sql +0 -118
  221. package/src/db/migrations/0001_add_search_fts.sql +0 -40
  222. package/src/db/migrations/0002_collection_path.sql +0 -2
  223. package/src/db/migrations/0003_collection_path_nullable.sql +0 -21
  224. package/src/db/migrations/0004_media_uuid.sql +0 -35
  225. package/src/db/migrations/meta/0000_snapshot.json +0 -784
  226. package/src/db/migrations/meta/_journal.json +0 -41
  227. package/src/db/schema.ts +0 -159
  228. package/src/i18n/EXAMPLES.md +0 -235
  229. package/src/i18n/README.md +0 -296
  230. package/src/i18n/context.tsx +0 -101
  231. package/src/i18n/detect.ts +0 -100
  232. package/src/i18n/locales/en.po +0 -875
  233. package/src/i18n/locales/en.ts +0 -1
  234. package/src/i18n/locales/zh-Hans.po +0 -875
  235. package/src/i18n/locales/zh-Hans.ts +0 -1
  236. package/src/i18n/locales/zh-Hant.po +0 -875
  237. package/src/i18n/locales/zh-Hant.ts +0 -1
  238. package/src/i18n/locales.ts +0 -14
  239. package/src/i18n/middleware.ts +0 -59
  240. package/src/lib/assets.ts +0 -47
  241. package/src/lib/constants.ts +0 -67
  242. package/src/lib/schemas.ts +0 -92
  243. package/src/lib/sse.ts +0 -152
  244. package/src/middleware/auth.ts +0 -59
  245. package/src/routes/api/posts.ts +0 -127
  246. package/src/routes/api/search.ts +0 -53
  247. package/src/routes/api/upload.ts +0 -240
  248. package/src/routes/dash/collections.tsx +0 -341
  249. package/src/routes/dash/index.tsx +0 -89
  250. package/src/routes/dash/media.tsx +0 -551
  251. package/src/routes/dash/pages.tsx +0 -245
  252. package/src/routes/dash/posts.tsx +0 -202
  253. package/src/routes/dash/redirects.tsx +0 -155
  254. package/src/routes/dash/settings.tsx +0 -93
  255. package/src/routes/feed/rss.ts +0 -119
  256. package/src/routes/feed/sitemap.ts +0 -75
  257. package/src/routes/pages/archive.tsx +0 -223
  258. package/src/routes/pages/collection.tsx +0 -79
  259. package/src/routes/pages/home.tsx +0 -93
  260. package/src/routes/pages/page.tsx +0 -64
  261. package/src/routes/pages/post.tsx +0 -81
  262. package/src/routes/pages/search.tsx +0 -162
  263. package/src/services/collection.ts +0 -180
  264. package/src/services/index.ts +0 -40
  265. package/src/services/media.ts +0 -97
  266. package/src/services/post.ts +0 -279
  267. package/src/services/redirect.ts +0 -74
  268. package/src/services/search.ts +0 -117
  269. package/src/services/settings.ts +0 -76
  270. package/src/theme/components/ActionButtons.tsx +0 -98
  271. package/src/theme/components/CrudPageHeader.tsx +0 -48
  272. package/src/theme/components/DangerZone.tsx +0 -77
  273. package/src/theme/components/EmptyState.tsx +0 -56
  274. package/src/theme/components/ListItemRow.tsx +0 -24
  275. package/src/theme/components/PageForm.tsx +0 -114
  276. package/src/theme/components/Pagination.tsx +0 -196
  277. package/src/theme/components/PostForm.tsx +0 -122
  278. package/src/theme/components/PostList.tsx +0 -68
  279. package/src/theme/components/ThreadView.tsx +0 -118
  280. package/src/theme/components/TypeBadge.tsx +0 -28
  281. package/src/theme/components/VisibilityBadge.tsx +0 -33
  282. package/src/theme/layouts/BaseLayout.tsx +0 -49
  283. package/src/theme/layouts/DashLayout.tsx +0 -108
  284. package/src/theme/styles/main.css +0 -52
  285. package/src/types.ts +0 -222
  286. package/tsconfig.json +0 -16
  287. package/vite.config.ts +0 -82
  288. package/wrangler.toml +0 -21
@@ -0,0 +1,290 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
+ /**
3
+ * Dashboard Pages Routes
4
+ *
5
+ * Management for custom pages (posts with type="page")
6
+ */ import { Hono } from "hono";
7
+ import { useLingui } from "../../i18n/index.js";
8
+ import { DashLayout } from "../../theme/layouts/index.js";
9
+ import { PageForm, VisibilityBadge, EmptyState, ListItemRow, ActionButtons, CrudPageHeader, DangerZone } from "../../theme/components/index.js";
10
+ import * as sqid from "../../lib/sqid.js";
11
+ import * as time from "../../lib/time.js";
12
+ import { VisibilitySchema, parseFormData } from "../../lib/schemas.js";
13
+ export const pagesRoutes = new Hono();
14
+ function PagesListContent({ pages }) {
15
+ const { t } = useLingui();
16
+ return /*#__PURE__*/ _jsxs(_Fragment, {
17
+ children: [
18
+ /*#__PURE__*/ _jsx(CrudPageHeader, {
19
+ title: t({
20
+ message: "Pages",
21
+ comment: "@context: Pages main heading"
22
+ }),
23
+ ctaLabel: t({
24
+ message: "New Page",
25
+ comment: "@context: Button to create new page"
26
+ }),
27
+ ctaHref: "/dash/pages/new"
28
+ }),
29
+ pages.length === 0 ? /*#__PURE__*/ _jsx(EmptyState, {
30
+ message: t({
31
+ message: "No pages yet.",
32
+ comment: "@context: Empty state message when no pages exist"
33
+ }),
34
+ ctaText: t({
35
+ message: "Create your first page",
36
+ comment: "@context: Button in empty state to create first page"
37
+ }),
38
+ ctaHref: "/dash/pages/new"
39
+ }) : /*#__PURE__*/ _jsx("div", {
40
+ class: "flex flex-col divide-y",
41
+ children: pages.map((page)=>/*#__PURE__*/ _jsxs(ListItemRow, {
42
+ actions: /*#__PURE__*/ _jsx(ActionButtons, {
43
+ editHref: `/dash/pages/${sqid.encode(page.id)}/edit`,
44
+ editLabel: t({
45
+ message: "Edit",
46
+ comment: "@context: Button to edit page"
47
+ }),
48
+ viewHref: page.visibility !== "draft" && page.path ? `/${page.path}` : undefined,
49
+ viewLabel: t({
50
+ message: "View",
51
+ comment: "@context: Button to view page on public site"
52
+ })
53
+ }),
54
+ children: [
55
+ /*#__PURE__*/ _jsxs("div", {
56
+ class: "flex items-center gap-2 mb-1",
57
+ children: [
58
+ /*#__PURE__*/ _jsx(VisibilityBadge, {
59
+ visibility: page.visibility
60
+ }),
61
+ /*#__PURE__*/ _jsx("span", {
62
+ class: "text-xs text-muted-foreground",
63
+ children: time.formatDate(page.updatedAt)
64
+ })
65
+ ]
66
+ }),
67
+ /*#__PURE__*/ _jsx("a", {
68
+ href: `/dash/pages/${sqid.encode(page.id)}`,
69
+ class: "font-medium hover:underline",
70
+ children: page.title || t({
71
+ message: "Untitled",
72
+ comment: "@context: Default title for untitled page"
73
+ })
74
+ }),
75
+ /*#__PURE__*/ _jsxs("p", {
76
+ class: "text-sm text-muted-foreground mt-1",
77
+ children: [
78
+ "/",
79
+ page.path
80
+ ]
81
+ })
82
+ ]
83
+ }, page.id))
84
+ })
85
+ ]
86
+ });
87
+ }
88
+ function NewPageContent() {
89
+ const { t } = useLingui();
90
+ return /*#__PURE__*/ _jsxs(_Fragment, {
91
+ children: [
92
+ /*#__PURE__*/ _jsx("h1", {
93
+ class: "text-2xl font-semibold mb-6",
94
+ children: t({
95
+ message: "New Page",
96
+ comment: "@context: New page main heading"
97
+ })
98
+ }),
99
+ /*#__PURE__*/ _jsx(PageForm, {
100
+ action: "/dash/pages"
101
+ })
102
+ ]
103
+ });
104
+ }
105
+ function ViewPageContent({ page }) {
106
+ const { t } = useLingui();
107
+ return /*#__PURE__*/ _jsxs(_Fragment, {
108
+ children: [
109
+ /*#__PURE__*/ _jsxs("div", {
110
+ class: "flex items-center justify-between mb-6",
111
+ children: [
112
+ /*#__PURE__*/ _jsxs("div", {
113
+ children: [
114
+ /*#__PURE__*/ _jsx("h1", {
115
+ class: "text-2xl font-semibold",
116
+ children: page.title || t({
117
+ message: "Page",
118
+ comment: "@context: Default page heading when untitled"
119
+ })
120
+ }),
121
+ page.path && /*#__PURE__*/ _jsxs("p", {
122
+ class: "text-muted-foreground mt-1",
123
+ children: [
124
+ "/",
125
+ page.path
126
+ ]
127
+ })
128
+ ]
129
+ }),
130
+ /*#__PURE__*/ _jsx(ActionButtons, {
131
+ editHref: `/dash/pages/${sqid.encode(page.id)}/edit`,
132
+ editLabel: t({
133
+ message: "Edit",
134
+ comment: "@context: Button to edit page"
135
+ }),
136
+ viewHref: page.visibility !== "draft" && page.path ? `/${page.path}` : undefined,
137
+ viewLabel: t({
138
+ message: "View",
139
+ comment: "@context: Button to view page on public site"
140
+ })
141
+ })
142
+ ]
143
+ }),
144
+ /*#__PURE__*/ _jsx("div", {
145
+ class: "card",
146
+ children: /*#__PURE__*/ _jsx("section", {
147
+ children: /*#__PURE__*/ _jsx("div", {
148
+ class: "prose",
149
+ dangerouslySetInnerHTML: {
150
+ __html: page.contentHtml || ""
151
+ }
152
+ })
153
+ })
154
+ }),
155
+ /*#__PURE__*/ _jsx(DangerZone, {
156
+ actionLabel: t({
157
+ message: "Delete Page",
158
+ comment: "@context: Button to delete page"
159
+ }),
160
+ formAction: `/dash/pages/${sqid.encode(page.id)}/delete`,
161
+ confirmMessage: "Are you sure you want to delete this page?"
162
+ })
163
+ ]
164
+ });
165
+ }
166
+ function EditPageContent({ page }) {
167
+ const { t } = useLingui();
168
+ return /*#__PURE__*/ _jsxs(_Fragment, {
169
+ children: [
170
+ /*#__PURE__*/ _jsx("h1", {
171
+ class: "text-2xl font-semibold mb-6",
172
+ children: t({
173
+ message: "Edit Page",
174
+ comment: "@context: Edit page main heading"
175
+ })
176
+ }),
177
+ /*#__PURE__*/ _jsx(PageForm, {
178
+ page: page,
179
+ action: `/dash/pages/${sqid.encode(page.id)}`
180
+ })
181
+ ]
182
+ });
183
+ }
184
+ // List pages
185
+ pagesRoutes.get("/", async (c)=>{
186
+ const pages = await c.var.services.posts.list({
187
+ type: "page",
188
+ visibility: [
189
+ "unlisted",
190
+ "draft"
191
+ ],
192
+ limit: 100
193
+ });
194
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
195
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
196
+ c: c,
197
+ title: "Pages",
198
+ siteName: siteName,
199
+ currentPath: "/dash/pages",
200
+ children: /*#__PURE__*/ _jsx(PagesListContent, {
201
+ pages: pages
202
+ })
203
+ }));
204
+ });
205
+ // New page form
206
+ pagesRoutes.get("/new", async (c)=>{
207
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
208
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
209
+ c: c,
210
+ title: "New Page",
211
+ siteName: siteName,
212
+ currentPath: "/dash/pages",
213
+ children: /*#__PURE__*/ _jsx(NewPageContent, {})
214
+ }));
215
+ });
216
+ // Create page
217
+ pagesRoutes.post("/", async (c)=>{
218
+ const formData = await c.req.formData();
219
+ const title = formData.get("title");
220
+ const content = formData.get("content");
221
+ const visibility = parseFormData(formData, "visibility", VisibilitySchema);
222
+ const path = formData.get("path");
223
+ const page = await c.var.services.posts.create({
224
+ type: "page",
225
+ title,
226
+ content,
227
+ visibility,
228
+ path: path.toLowerCase().replace(/[^a-z0-9-]/g, "-")
229
+ });
230
+ return c.redirect(`/dash/pages/${sqid.encode(page.id)}`);
231
+ });
232
+ // View single page
233
+ pagesRoutes.get("/:id", async (c)=>{
234
+ const id = sqid.decode(c.req.param("id"));
235
+ if (!id) return c.notFound();
236
+ const page = await c.var.services.posts.getById(id);
237
+ if (!page || page.type !== "page") return c.notFound();
238
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
239
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
240
+ c: c,
241
+ title: page.title || "Page",
242
+ siteName: siteName,
243
+ currentPath: "/dash/pages",
244
+ children: /*#__PURE__*/ _jsx(ViewPageContent, {
245
+ page: page
246
+ })
247
+ }));
248
+ });
249
+ // Edit page form
250
+ pagesRoutes.get("/:id/edit", async (c)=>{
251
+ const id = sqid.decode(c.req.param("id"));
252
+ if (!id) return c.notFound();
253
+ const page = await c.var.services.posts.getById(id);
254
+ if (!page || page.type !== "page") return c.notFound();
255
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
256
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
257
+ c: c,
258
+ title: `Edit: ${page.title || "Page"}`,
259
+ siteName: siteName,
260
+ currentPath: "/dash/pages",
261
+ children: /*#__PURE__*/ _jsx(EditPageContent, {
262
+ page: page
263
+ })
264
+ }));
265
+ });
266
+ // Update page
267
+ pagesRoutes.post("/:id", async (c)=>{
268
+ const id = sqid.decode(c.req.param("id"));
269
+ if (!id) return c.notFound();
270
+ const formData = await c.req.formData();
271
+ const title = formData.get("title");
272
+ const content = formData.get("content");
273
+ const visibility = parseFormData(formData, "visibility", VisibilitySchema);
274
+ const path = formData.get("path");
275
+ await c.var.services.posts.update(id, {
276
+ type: "page",
277
+ title,
278
+ content,
279
+ visibility,
280
+ path: path.toLowerCase().replace(/[^a-z0-9-]/g, "-")
281
+ });
282
+ return c.redirect(`/dash/pages/${sqid.encode(id)}`);
283
+ });
284
+ // Delete page
285
+ pagesRoutes.post("/:id/delete", async (c)=>{
286
+ const id = sqid.decode(c.req.param("id"));
287
+ if (!id) return c.notFound();
288
+ await c.var.services.posts.delete(id);
289
+ return c.redirect("/dash/pages");
290
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Dashboard Posts Routes
3
+ */
4
+ import { Hono } from "hono";
5
+ import type { Bindings } from "../../types.js";
6
+ import type { AppVariables } from "../../app.js";
7
+ type Env = {
8
+ Bindings: Bindings;
9
+ Variables: AppVariables;
10
+ };
11
+ export declare const postsRoutes: Hono<Env, import("hono/types").BlankSchema, "/">;
12
+ export {};
13
+ //# sourceMappingURL=posts.d.ts.map
@@ -0,0 +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;AAG5B,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"}
@@ -0,0 +1,226 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
+ /**
3
+ * Dashboard Posts Routes
4
+ */ import { Hono } from "hono";
5
+ import { z } from "zod";
6
+ import { useLingui } from "../../i18n/index.js";
7
+ import { DashLayout } from "../../theme/layouts/index.js";
8
+ import { PostForm, PostList, CrudPageHeader, ActionButtons } from "../../theme/components/index.js";
9
+ import * as sqid from "../../lib/sqid.js";
10
+ import { PostTypeSchema, VisibilitySchema, parseFormData, parseFormDataOptional } from "../../lib/schemas.js";
11
+ export const postsRoutes = new Hono();
12
+ function PostsListContent({ posts }) {
13
+ const { t } = useLingui();
14
+ return /*#__PURE__*/ _jsxs(_Fragment, {
15
+ children: [
16
+ /*#__PURE__*/ _jsx(CrudPageHeader, {
17
+ title: t({
18
+ message: "Posts",
19
+ comment: "@context: Dashboard heading"
20
+ }),
21
+ ctaLabel: t({
22
+ message: "New Post",
23
+ comment: "@context: Button to create new post"
24
+ }),
25
+ ctaHref: "/dash/posts/new"
26
+ }),
27
+ /*#__PURE__*/ _jsx(PostList, {
28
+ posts: posts
29
+ })
30
+ ]
31
+ });
32
+ }
33
+ function NewPostContent() {
34
+ const { t } = useLingui();
35
+ return /*#__PURE__*/ _jsxs(_Fragment, {
36
+ children: [
37
+ /*#__PURE__*/ _jsx("h1", {
38
+ class: "text-2xl font-semibold mb-6",
39
+ children: t({
40
+ message: "New Post",
41
+ comment: "@context: Page heading"
42
+ })
43
+ }),
44
+ /*#__PURE__*/ _jsx(PostForm, {
45
+ action: "/dash/posts"
46
+ })
47
+ ]
48
+ });
49
+ }
50
+ // List posts
51
+ postsRoutes.get("/", async (c)=>{
52
+ const posts = await c.var.services.posts.list({
53
+ visibility: [
54
+ "featured",
55
+ "quiet",
56
+ "unlisted",
57
+ "draft"
58
+ ]
59
+ });
60
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
61
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
62
+ c: c,
63
+ title: "Posts",
64
+ siteName: siteName,
65
+ currentPath: "/dash/posts",
66
+ children: /*#__PURE__*/ _jsx(PostsListContent, {
67
+ posts: posts
68
+ })
69
+ }));
70
+ });
71
+ // New post form
72
+ postsRoutes.get("/new", async (c)=>{
73
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
74
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
75
+ c: c,
76
+ title: "New Post",
77
+ siteName: siteName,
78
+ currentPath: "/dash/posts",
79
+ children: /*#__PURE__*/ _jsx(NewPostContent, {})
80
+ }));
81
+ });
82
+ // Create post
83
+ postsRoutes.post("/", async (c)=>{
84
+ const formData = await c.req.formData();
85
+ // Validate and parse form data
86
+ const type = parseFormData(formData, "type", PostTypeSchema);
87
+ const visibility = parseFormData(formData, "visibility", VisibilitySchema);
88
+ const title = parseFormDataOptional(formData, "title", z.string());
89
+ const content = formData.get("content");
90
+ const sourceUrl = parseFormDataOptional(formData, "sourceUrl", z.string());
91
+ const path = parseFormDataOptional(formData, "path", z.string());
92
+ const post = await c.var.services.posts.create({
93
+ type,
94
+ title,
95
+ content,
96
+ visibility,
97
+ sourceUrl,
98
+ path
99
+ });
100
+ return c.redirect(`/dash/posts/${sqid.encode(post.id)}`);
101
+ });
102
+ function ViewPostContent({ post }) {
103
+ const { t } = useLingui();
104
+ const defaultTitle = t({
105
+ message: "Post",
106
+ comment: "@context: Default post title"
107
+ });
108
+ return /*#__PURE__*/ _jsxs(_Fragment, {
109
+ children: [
110
+ /*#__PURE__*/ _jsxs("div", {
111
+ class: "flex items-center justify-between mb-6",
112
+ children: [
113
+ /*#__PURE__*/ _jsx("h1", {
114
+ class: "text-2xl font-semibold",
115
+ children: post.title || defaultTitle
116
+ }),
117
+ /*#__PURE__*/ _jsx(ActionButtons, {
118
+ editHref: `/dash/posts/${sqid.encode(post.id)}/edit`,
119
+ editLabel: t({
120
+ message: "Edit",
121
+ comment: "@context: Button to edit post"
122
+ }),
123
+ viewHref: `/p/${sqid.encode(post.id)}`,
124
+ viewLabel: t({
125
+ message: "View",
126
+ comment: "@context: Button to view post"
127
+ })
128
+ })
129
+ ]
130
+ }),
131
+ /*#__PURE__*/ _jsx("div", {
132
+ class: "card",
133
+ children: /*#__PURE__*/ _jsx("section", {
134
+ children: /*#__PURE__*/ _jsx("div", {
135
+ class: "prose",
136
+ dangerouslySetInnerHTML: {
137
+ __html: post.contentHtml || ""
138
+ }
139
+ })
140
+ })
141
+ })
142
+ ]
143
+ });
144
+ }
145
+ function EditPostContent({ post }) {
146
+ const { t } = useLingui();
147
+ return /*#__PURE__*/ _jsxs(_Fragment, {
148
+ children: [
149
+ /*#__PURE__*/ _jsx("h1", {
150
+ class: "text-2xl font-semibold mb-6",
151
+ children: t({
152
+ message: "Edit Post",
153
+ comment: "@context: Page heading"
154
+ })
155
+ }),
156
+ /*#__PURE__*/ _jsx(PostForm, {
157
+ post: post,
158
+ action: `/dash/posts/${sqid.encode(post.id)}`
159
+ })
160
+ ]
161
+ });
162
+ }
163
+ // View single post
164
+ postsRoutes.get("/:id", async (c)=>{
165
+ const id = sqid.decode(c.req.param("id"));
166
+ if (!id) return c.notFound();
167
+ const post = await c.var.services.posts.getById(id);
168
+ if (!post) return c.notFound();
169
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
170
+ const pageTitle = post.title || "Post";
171
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
172
+ c: c,
173
+ title: pageTitle,
174
+ siteName: siteName,
175
+ currentPath: "/dash/posts",
176
+ children: /*#__PURE__*/ _jsx(ViewPostContent, {
177
+ post: post
178
+ })
179
+ }));
180
+ });
181
+ // Edit post form
182
+ postsRoutes.get("/:id/edit", async (c)=>{
183
+ const id = sqid.decode(c.req.param("id"));
184
+ if (!id) return c.notFound();
185
+ const post = await c.var.services.posts.getById(id);
186
+ if (!post) return c.notFound();
187
+ const siteName = await c.var.services.settings.get("SITE_NAME") ?? "Jant";
188
+ return c.html(/*#__PURE__*/ _jsx(DashLayout, {
189
+ c: c,
190
+ title: `Edit: ${post.title || "Post"}`,
191
+ siteName: siteName,
192
+ currentPath: "/dash/posts",
193
+ children: /*#__PURE__*/ _jsx(EditPostContent, {
194
+ post: post
195
+ })
196
+ }));
197
+ });
198
+ // Update post
199
+ postsRoutes.post("/:id", async (c)=>{
200
+ const id = sqid.decode(c.req.param("id"));
201
+ if (!id) return c.notFound();
202
+ const formData = await c.req.formData();
203
+ // Validate and parse form data
204
+ const type = parseFormData(formData, "type", PostTypeSchema);
205
+ const visibility = parseFormData(formData, "visibility", VisibilitySchema);
206
+ const title = parseFormDataOptional(formData, "title", z.string()) || null;
207
+ const content = parseFormDataOptional(formData, "content", z.string()) || null;
208
+ const sourceUrl = parseFormDataOptional(formData, "sourceUrl", z.string()) || null;
209
+ const path = parseFormDataOptional(formData, "path", z.string()) || null;
210
+ await c.var.services.posts.update(id, {
211
+ type,
212
+ title,
213
+ content,
214
+ visibility,
215
+ sourceUrl,
216
+ path
217
+ });
218
+ return c.redirect(`/dash/posts/${sqid.encode(id)}`);
219
+ });
220
+ // Delete post
221
+ postsRoutes.post("/:id/delete", async (c)=>{
222
+ const id = sqid.decode(c.req.param("id"));
223
+ if (!id) return c.notFound();
224
+ await c.var.services.posts.delete(id);
225
+ return c.redirect("/dash/posts");
226
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Dashboard Redirects Routes
3
+ */
4
+ import { Hono } from "hono";
5
+ import type { Bindings } from "../../types.js";
6
+ import type { AppVariables } from "../../app.js";
7
+ type Env = {
8
+ Bindings: Bindings;
9
+ Variables: AppVariables;
10
+ };
11
+ export declare const redirectsRoutes: Hono<Env, import("hono/types").BlankSchema, "/">;
12
+ export {};
13
+ //# sourceMappingURL=redirects.d.ts.map
@@ -0,0 +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;AAIjD,KAAK,GAAG,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,eAAe,kDAAkB,CAAC"}