@jant/core 0.3.24 → 0.3.26

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 (277) hide show
  1. package/dist/app.js +101 -571
  2. package/dist/client.js +1 -0
  3. package/dist/db/schema.js +1 -1
  4. package/dist/i18n/locales/en.js +1 -1
  5. package/dist/i18n/locales/zh-Hans.js +1 -1
  6. package/dist/i18n/locales/zh-Hant.js +1 -1
  7. package/dist/index.js +3 -9
  8. package/dist/lib/avatar-upload.js +134 -0
  9. package/dist/lib/config.js +39 -0
  10. package/dist/lib/constants.js +10 -9
  11. package/dist/lib/favicon.js +102 -0
  12. package/dist/lib/image.js +13 -17
  13. package/dist/lib/media-helpers.js +2 -2
  14. package/dist/lib/nav-reorder.js +1 -1
  15. package/dist/lib/navigation.js +48 -3
  16. package/dist/lib/pagination.js +44 -0
  17. package/dist/lib/render.js +16 -11
  18. package/dist/lib/schemas.js +34 -3
  19. package/dist/lib/theme.js +4 -4
  20. package/dist/lib/timeline.js +24 -48
  21. package/dist/lib/timezones.js +388 -0
  22. package/dist/lib/view.js +3 -3
  23. package/dist/routes/api/collections.js +124 -0
  24. package/dist/routes/api/nav-items.js +104 -0
  25. package/dist/routes/api/pages.js +91 -0
  26. package/dist/routes/api/posts.js +3 -3
  27. package/dist/routes/api/search.js +2 -2
  28. package/dist/routes/api/settings.js +68 -0
  29. package/dist/routes/api/upload.js +3 -3
  30. package/dist/routes/auth/reset.js +221 -0
  31. package/dist/routes/auth/setup.js +194 -0
  32. package/dist/routes/auth/signin.js +176 -0
  33. package/dist/routes/compose.js +48 -0
  34. package/dist/routes/dash/collections.js +24 -416
  35. package/dist/routes/dash/index.js +1 -1
  36. package/dist/routes/dash/media.js +13 -393
  37. package/dist/routes/dash/pages.js +112 -86
  38. package/dist/routes/dash/posts.js +3 -5
  39. package/dist/routes/dash/redirects.js +20 -14
  40. package/dist/routes/dash/settings.js +213 -518
  41. package/dist/routes/feed/rss.js +4 -3
  42. package/dist/routes/feed/sitemap.js +5 -3
  43. package/dist/routes/pages/archive.js +3 -6
  44. package/dist/routes/pages/collection.js +3 -6
  45. package/dist/routes/pages/collections.js +28 -0
  46. package/dist/routes/pages/featured.js +36 -0
  47. package/dist/routes/pages/home.js +33 -49
  48. package/dist/routes/pages/latest.js +45 -0
  49. package/dist/routes/pages/page.js +29 -32
  50. package/dist/routes/pages/post.js +3 -6
  51. package/dist/routes/pages/search.js +3 -6
  52. package/dist/services/page.js +5 -1
  53. package/dist/services/post.js +45 -31
  54. package/dist/services/search.js +1 -1
  55. package/dist/types/bindings.js +3 -0
  56. package/dist/types/config.js +147 -0
  57. package/dist/types/constants.js +27 -0
  58. package/dist/types/entities.js +3 -0
  59. package/dist/types/operations.js +3 -0
  60. package/dist/types/props.js +3 -0
  61. package/dist/types/views.js +5 -0
  62. package/dist/types.js +8 -111
  63. package/dist/{theme → ui}/color-themes.js +33 -33
  64. package/dist/ui/compose/ComposeDialog.js +467 -0
  65. package/dist/ui/compose/ComposePrompt.js +55 -0
  66. package/dist/{theme/components/TypeBadge.js → ui/dash/FormatBadge.js} +1 -2
  67. package/dist/{theme/components → ui/dash}/PageForm.js +21 -15
  68. package/dist/{theme/components → ui/dash}/PostForm.js +22 -43
  69. package/dist/{theme/components → ui/dash}/PostList.js +6 -6
  70. package/dist/{theme/components/VisibilityBadge.js → ui/dash/StatusBadge.js} +1 -2
  71. package/dist/ui/dash/collections/CollectionForm.js +152 -0
  72. package/dist/ui/dash/collections/CollectionsListContent.js +68 -0
  73. package/dist/ui/dash/collections/ViewCollectionContent.js +96 -0
  74. package/dist/{theme/components → ui/dash}/index.js +3 -6
  75. package/dist/ui/dash/media/MediaListContent.js +166 -0
  76. package/dist/ui/dash/media/ViewMediaContent.js +212 -0
  77. package/dist/ui/dash/pages/LinkFormContent.js +130 -0
  78. package/dist/ui/dash/pages/UnifiedPagesContent.js +193 -0
  79. package/dist/ui/dash/settings/AccountContent.js +209 -0
  80. package/dist/ui/dash/settings/AppearanceContent.js +259 -0
  81. package/dist/ui/dash/settings/GeneralContent.js +536 -0
  82. package/dist/ui/dash/settings/SettingsNav.js +41 -0
  83. package/dist/{themes/threads/timeline → ui/feed}/LinkCard.js +6 -2
  84. package/dist/{themes/threads/timeline → ui/feed}/NoteCard.js +11 -6
  85. package/dist/{themes/threads/timeline → ui/feed}/QuoteCard.js +10 -6
  86. package/dist/{themes/threads/timeline → ui/feed}/ThreadPreview.js +7 -9
  87. package/dist/ui/feed/TimelineFeed.js +41 -0
  88. package/dist/ui/feed/TimelineItem.js +27 -0
  89. package/dist/ui/font-themes.js +36 -0
  90. package/dist/{theme → ui}/layouts/BaseLayout.js +34 -2
  91. package/dist/{theme → ui}/layouts/DashLayout.js +0 -8
  92. package/dist/ui/layouts/SiteLayout.js +169 -0
  93. package/dist/{themes/threads → ui}/pages/ArchivePage.js +16 -14
  94. package/dist/{themes/threads → ui}/pages/CollectionPage.js +6 -1
  95. package/dist/ui/pages/CollectionsPage.js +76 -0
  96. package/dist/ui/pages/FeaturedPage.js +24 -0
  97. package/dist/ui/pages/HomePage.js +24 -0
  98. package/dist/{themes/threads → ui}/pages/PostPage.js +13 -8
  99. package/dist/{themes/threads → ui}/pages/SearchPage.js +9 -7
  100. package/dist/{themes/threads → ui}/pages/SinglePage.js +3 -2
  101. package/dist/{theme/components → ui/shared}/MediaGallery.js +1 -1
  102. package/dist/{theme/components → ui/shared}/Pagination.js +41 -2
  103. package/dist/{theme/components → ui/shared}/ThreadView.js +2 -2
  104. package/dist/ui/shared/index.js +5 -0
  105. package/package.json +1 -9
  106. package/src/__tests__/helpers/db.ts +3 -0
  107. package/src/app.tsx +131 -561
  108. package/src/client.ts +1 -0
  109. package/src/db/migrations/0006_rename_slug_to_path.sql +5 -0
  110. package/src/db/migrations/meta/_journal.json +7 -0
  111. package/src/db/schema.ts +1 -1
  112. package/src/i18n/locales/en.po +477 -261
  113. package/src/i18n/locales/en.ts +1 -1
  114. package/src/i18n/locales/zh-Hans.po +477 -261
  115. package/src/i18n/locales/zh-Hans.ts +1 -1
  116. package/src/i18n/locales/zh-Hant.po +477 -261
  117. package/src/i18n/locales/zh-Hant.ts +1 -1
  118. package/src/index.ts +7 -36
  119. package/src/lib/__tests__/config.test.ts +192 -0
  120. package/src/lib/__tests__/favicon.test.ts +151 -0
  121. package/src/lib/__tests__/image.test.ts +2 -6
  122. package/src/lib/__tests__/schemas.test.ts +60 -19
  123. package/src/lib/__tests__/timeline.test.ts +45 -81
  124. package/src/lib/__tests__/timezones.test.ts +61 -0
  125. package/src/lib/__tests__/view.test.ts +15 -9
  126. package/src/lib/avatar-upload.ts +165 -0
  127. package/src/lib/config.ts +47 -0
  128. package/src/lib/constants.ts +19 -10
  129. package/src/lib/favicon.ts +115 -0
  130. package/src/lib/image.ts +13 -21
  131. package/src/lib/media-helpers.ts +2 -2
  132. package/src/lib/nav-reorder.ts +1 -1
  133. package/src/lib/navigation.ts +73 -4
  134. package/src/lib/pagination.ts +50 -0
  135. package/src/lib/render.tsx +22 -15
  136. package/src/lib/schemas.ts +47 -6
  137. package/src/lib/theme.ts +5 -5
  138. package/src/lib/timeline.ts +28 -57
  139. package/src/lib/timezones.ts +325 -0
  140. package/src/lib/view.ts +3 -3
  141. package/src/preset.css +2 -1
  142. package/src/routes/__tests__/compose.test.ts +199 -0
  143. package/src/routes/api/__tests__/collections.test.ts +249 -0
  144. package/src/routes/api/__tests__/nav-items.test.ts +222 -0
  145. package/src/routes/api/__tests__/pages.test.ts +218 -0
  146. package/src/routes/api/__tests__/settings.test.ts +132 -0
  147. package/src/routes/api/collections.ts +143 -0
  148. package/src/routes/api/nav-items.ts +115 -0
  149. package/src/routes/api/pages.ts +101 -0
  150. package/src/routes/api/posts.ts +3 -3
  151. package/src/routes/api/search.ts +2 -2
  152. package/src/routes/api/settings.ts +91 -0
  153. package/src/routes/api/upload.ts +2 -3
  154. package/src/routes/auth/reset.tsx +239 -0
  155. package/src/routes/auth/setup.tsx +189 -0
  156. package/src/routes/auth/signin.tsx +163 -0
  157. package/src/routes/compose.ts +63 -0
  158. package/src/routes/dash/__tests__/pages.test.ts +225 -0
  159. package/src/routes/dash/__tests__/settings-avatar.test.ts +89 -0
  160. package/src/routes/dash/collections.tsx +18 -367
  161. package/src/routes/dash/index.tsx +1 -1
  162. package/src/routes/dash/media.tsx +13 -415
  163. package/src/routes/dash/pages.tsx +131 -98
  164. package/src/routes/dash/posts.tsx +3 -7
  165. package/src/routes/dash/redirects.tsx +22 -16
  166. package/src/routes/dash/settings.tsx +265 -478
  167. package/src/routes/feed/__tests__/rss.test.ts +141 -0
  168. package/src/routes/feed/rss.ts +5 -3
  169. package/src/routes/feed/sitemap.ts +5 -3
  170. package/src/routes/pages/__tests__/collections.test.ts +94 -0
  171. package/src/routes/pages/__tests__/featured.test.ts +94 -0
  172. package/src/routes/pages/archive.tsx +2 -6
  173. package/src/routes/pages/collection.tsx +2 -6
  174. package/src/routes/pages/collections.tsx +36 -0
  175. package/src/routes/pages/featured.tsx +44 -0
  176. package/src/routes/pages/home.tsx +30 -53
  177. package/src/routes/pages/latest.tsx +59 -0
  178. package/src/routes/pages/page.tsx +28 -30
  179. package/src/routes/pages/post.tsx +2 -5
  180. package/src/routes/pages/search.tsx +2 -6
  181. package/src/services/__tests__/page.test.ts +106 -0
  182. package/src/services/__tests__/post.test.ts +114 -15
  183. package/src/services/page.ts +13 -1
  184. package/src/services/post.ts +58 -40
  185. package/src/services/search.ts +2 -2
  186. package/src/styles/components.css +0 -65
  187. package/src/styles/tokens.css +47 -0
  188. package/src/styles/ui.css +475 -0
  189. package/src/types/bindings.ts +30 -0
  190. package/src/types/config.ts +183 -0
  191. package/src/types/constants.ts +26 -0
  192. package/src/types/entities.ts +109 -0
  193. package/src/types/operations.ts +88 -0
  194. package/src/types/props.ts +115 -0
  195. package/src/types/views.ts +172 -0
  196. package/src/types.ts +8 -774
  197. package/src/ui/__tests__/font-themes.test.ts +34 -0
  198. package/src/{theme → ui}/color-themes.ts +34 -34
  199. package/src/ui/compose/ComposeDialog.tsx +414 -0
  200. package/src/ui/compose/ComposePrompt.tsx +55 -0
  201. package/src/{theme/components/TypeBadge.tsx → ui/dash/FormatBadge.tsx} +2 -3
  202. package/src/{theme/components → ui/dash}/PageForm.tsx +25 -19
  203. package/src/{theme/components → ui/dash}/PostForm.tsx +26 -45
  204. package/src/{theme/components → ui/dash}/PostList.tsx +7 -7
  205. package/src/{theme/components/VisibilityBadge.tsx → ui/dash/StatusBadge.tsx} +2 -3
  206. package/src/ui/dash/collections/CollectionForm.tsx +153 -0
  207. package/src/ui/dash/collections/CollectionsListContent.tsx +85 -0
  208. package/src/ui/dash/collections/ViewCollectionContent.tsx +92 -0
  209. package/src/ui/dash/index.ts +10 -0
  210. package/src/ui/dash/media/MediaListContent.tsx +201 -0
  211. package/src/ui/dash/media/ViewMediaContent.tsx +208 -0
  212. package/src/ui/dash/pages/LinkFormContent.tsx +119 -0
  213. package/src/ui/dash/pages/UnifiedPagesContent.tsx +203 -0
  214. package/src/ui/dash/settings/AccountContent.tsx +176 -0
  215. package/src/ui/dash/settings/AppearanceContent.tsx +254 -0
  216. package/src/ui/dash/settings/GeneralContent.tsx +533 -0
  217. package/src/ui/dash/settings/SettingsNav.tsx +56 -0
  218. package/src/{themes/threads/timeline → ui/feed}/LinkCard.tsx +9 -4
  219. package/src/{themes/threads/timeline → ui/feed}/NoteCard.tsx +13 -8
  220. package/src/{themes/threads/timeline → ui/feed}/QuoteCard.tsx +13 -8
  221. package/src/{themes/threads/timeline → ui/feed}/ThreadPreview.tsx +7 -8
  222. package/src/ui/feed/TimelineFeed.tsx +49 -0
  223. package/src/ui/feed/TimelineItem.tsx +45 -0
  224. package/src/ui/font-themes.ts +54 -0
  225. package/src/{theme → ui}/layouts/BaseLayout.tsx +28 -1
  226. package/src/{theme → ui}/layouts/DashLayout.tsx +0 -10
  227. package/src/ui/layouts/SiteLayout.tsx +164 -0
  228. package/src/{themes/threads → ui}/pages/ArchivePage.tsx +22 -17
  229. package/src/{themes/threads → ui}/pages/CollectionPage.tsx +14 -5
  230. package/src/ui/pages/CollectionsPage.tsx +73 -0
  231. package/src/ui/pages/FeaturedPage.tsx +31 -0
  232. package/src/{themes/threads → ui}/pages/HomePage.tsx +11 -15
  233. package/src/{themes/threads → ui}/pages/PostPage.tsx +23 -14
  234. package/src/{themes/threads → ui}/pages/SearchPage.tsx +13 -11
  235. package/src/{themes/threads → ui}/pages/SinglePage.tsx +4 -4
  236. package/src/{theme/components → ui/shared}/MediaGallery.tsx +1 -1
  237. package/src/{theme/components → ui/shared}/Pagination.tsx +67 -4
  238. package/src/{theme/components → ui/shared}/ThreadView.tsx +2 -2
  239. package/src/ui/shared/__tests__/pagination.test.ts +46 -0
  240. package/src/ui/shared/index.ts +12 -0
  241. package/bin/jant.js +0 -185
  242. package/dist/lib/theme-components.js +0 -46
  243. package/dist/routes/dash/navigation.js +0 -289
  244. package/dist/theme/index.js +0 -18
  245. package/dist/theme/layouts/index.js +0 -2
  246. package/dist/themes/threads/ThreadsSiteLayout.js +0 -172
  247. package/dist/themes/threads/index.js +0 -81
  248. package/dist/themes/threads/pages/HomePage.js +0 -25
  249. package/dist/themes/threads/timeline/TimelineFeed.js +0 -58
  250. package/dist/themes/threads/timeline/TimelineItem.js +0 -36
  251. package/dist/themes/threads/timeline/TimelineLoadMore.js +0 -23
  252. package/dist/themes/threads/timeline/groupByDate.js +0 -22
  253. package/dist/themes/threads/timeline/timelineMore.js +0 -107
  254. package/src/lib/__tests__/theme-components.test.ts +0 -105
  255. package/src/lib/theme-components.ts +0 -65
  256. package/src/routes/dash/navigation.tsx +0 -317
  257. package/src/theme/components/index.ts +0 -23
  258. package/src/theme/index.ts +0 -22
  259. package/src/theme/layouts/index.ts +0 -7
  260. package/src/themes/threads/ThreadsSiteLayout.tsx +0 -194
  261. package/src/themes/threads/index.ts +0 -100
  262. package/src/themes/threads/style.css +0 -336
  263. package/src/themes/threads/timeline/TimelineFeed.tsx +0 -62
  264. package/src/themes/threads/timeline/TimelineItem.tsx +0 -67
  265. package/src/themes/threads/timeline/TimelineLoadMore.tsx +0 -35
  266. package/src/themes/threads/timeline/groupByDate.ts +0 -30
  267. package/src/themes/threads/timeline/timelineMore.tsx +0 -130
  268. /package/dist/{theme/components → ui/dash}/ActionButtons.js +0 -0
  269. /package/dist/{theme/components → ui/dash}/CrudPageHeader.js +0 -0
  270. /package/dist/{theme/components → ui/dash}/DangerZone.js +0 -0
  271. /package/dist/{theme/components → ui/dash}/ListItemRow.js +0 -0
  272. /package/dist/{theme/components → ui/shared}/EmptyState.js +0 -0
  273. /package/src/{theme/components → ui/dash}/ActionButtons.tsx +0 -0
  274. /package/src/{theme/components → ui/dash}/CrudPageHeader.tsx +0 -0
  275. /package/src/{theme/components → ui/dash}/DangerZone.tsx +0 -0
  276. /package/src/{theme/components → ui/dash}/ListItemRow.tsx +0 -0
  277. /package/src/{theme/components → ui/shared}/EmptyState.tsx +0 -0
@@ -1,417 +1,16 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "hono/jsx/jsx-runtime";
2
- import { getSiteName } from "../../lib/config.js";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
3
2
  /**
4
3
  * Dashboard Collections Routes
5
4
  */ import { Hono } from "hono";
6
- import { useLingui as $_useLingui } from "@jant/core/i18n";
7
- import { DashLayout } from "../../theme/layouts/index.js";
8
- import { EmptyState, ListItemRow, ActionButtons, CrudPageHeader, DangerZone } from "../../theme/components/index.js";
9
- import * as sqid from "../../lib/sqid.js";
5
+ import { DashLayout } from "../../ui/layouts/DashLayout.js";
6
+ import { DangerZone } from "../../ui/dash/index.js";
10
7
  import { dsRedirect } from "../../lib/sse.js";
8
+ import { getSiteName } from "../../lib/config.js";
9
+ import { createMediaContext, toPostViewsFromPosts } from "../../lib/view.js";
10
+ import { CollectionsListContent } from "../../ui/dash/collections/CollectionsListContent.js";
11
+ import { CollectionForm } from "../../ui/dash/collections/CollectionForm.js";
12
+ import { ViewCollectionContent } from "../../ui/dash/collections/ViewCollectionContent.js";
11
13
  export const collectionsRoutes = new Hono();
12
- function CollectionsListContent({ collections }) {
13
- const { i18n: $__i18n, _: $__ } = $_useLingui();
14
- return /*#__PURE__*/ _jsxs(_Fragment, {
15
- children: [
16
- /*#__PURE__*/ _jsx(CrudPageHeader, {
17
- title: $__i18n._({
18
- id: "DoJzLz",
19
- message: "Collections"
20
- }),
21
- ctaLabel: $__i18n._({
22
- id: "vzU4k9",
23
- message: "New Collection"
24
- }),
25
- ctaHref: "/dash/collections/new"
26
- }),
27
- collections.length === 0 ? /*#__PURE__*/ _jsx(EmptyState, {
28
- message: $__i18n._({
29
- id: "+MACwa",
30
- message: "No collections yet."
31
- }),
32
- ctaText: $__i18n._({
33
- id: "vzU4k9",
34
- message: "New Collection"
35
- }),
36
- ctaHref: "/dash/collections/new"
37
- }) : /*#__PURE__*/ _jsx("div", {
38
- class: "flex flex-col divide-y",
39
- children: collections.map((col)=>/*#__PURE__*/ _jsxs(ListItemRow, {
40
- actions: /*#__PURE__*/ _jsx(ActionButtons, {
41
- editHref: `/dash/collections/${col.id}/edit`,
42
- editLabel: $__i18n._({
43
- id: "ePK91l",
44
- message: "Edit"
45
- }),
46
- viewHref: `/c/${col.slug}`,
47
- viewLabel: $__i18n._({
48
- id: "jpctdh",
49
- message: "View"
50
- })
51
- }),
52
- children: [
53
- /*#__PURE__*/ _jsx("a", {
54
- href: `/dash/collections/${col.id}`,
55
- class: "font-medium hover:underline",
56
- children: col.title
57
- }),
58
- /*#__PURE__*/ _jsxs("p", {
59
- class: "text-sm text-muted-foreground",
60
- children: [
61
- "/",
62
- col.slug
63
- ]
64
- }),
65
- col.description && /*#__PURE__*/ _jsx("p", {
66
- class: "text-sm text-muted-foreground mt-1",
67
- children: col.description
68
- })
69
- ]
70
- }, col.id))
71
- })
72
- ]
73
- });
74
- }
75
- function NewCollectionContent() {
76
- const { i18n: $__i18n, _: $__ } = $_useLingui();
77
- return /*#__PURE__*/ _jsxs(_Fragment, {
78
- children: [
79
- /*#__PURE__*/ _jsx("h1", {
80
- class: "text-2xl font-semibold mb-6",
81
- children: $__i18n._({
82
- id: "vzU4k9",
83
- message: "New Collection"
84
- })
85
- }),
86
- /*#__PURE__*/ _jsxs("form", {
87
- "data-signals": "{title: '', slug: '', description: ''}",
88
- "data-on:submit__prevent": "@post('/dash/collections')",
89
- "data-indicator": "_loading",
90
- class: "flex flex-col gap-4 max-w-lg",
91
- children: [
92
- /*#__PURE__*/ _jsxs("div", {
93
- class: "field",
94
- children: [
95
- /*#__PURE__*/ _jsx("label", {
96
- class: "label",
97
- children: $__i18n._({
98
- id: "MHrjPM",
99
- message: "Title"
100
- })
101
- }),
102
- /*#__PURE__*/ _jsx("input", {
103
- type: "text",
104
- "data-bind": "title",
105
- class: "input",
106
- required: true,
107
- placeholder: $__i18n._({
108
- id: "fttd2R",
109
- message: "My Collection"
110
- })
111
- })
112
- ]
113
- }),
114
- /*#__PURE__*/ _jsxs("div", {
115
- class: "field",
116
- children: [
117
- /*#__PURE__*/ _jsx("label", {
118
- class: "label",
119
- children: $__i18n._({
120
- id: "L85WcV",
121
- message: "Slug"
122
- })
123
- }),
124
- /*#__PURE__*/ _jsx("input", {
125
- type: "text",
126
- "data-bind": "slug",
127
- class: "input",
128
- required: true,
129
- placeholder: "my-collection",
130
- pattern: "[a-z0-9-]+"
131
- }),
132
- /*#__PURE__*/ _jsx("p", {
133
- class: "text-xs text-muted-foreground mt-1",
134
- children: $__i18n._({
135
- id: "1CU1Td",
136
- message: "URL-safe identifier (lowercase, numbers, hyphens)"
137
- })
138
- })
139
- ]
140
- }),
141
- /*#__PURE__*/ _jsxs("div", {
142
- class: "field",
143
- children: [
144
- /*#__PURE__*/ _jsx("label", {
145
- class: "label",
146
- children: $__i18n._({
147
- id: "Fxf4jq",
148
- message: "Description (optional)"
149
- })
150
- }),
151
- /*#__PURE__*/ _jsx("textarea", {
152
- "data-bind": "description",
153
- class: "textarea",
154
- rows: 3,
155
- placeholder: $__i18n._({
156
- id: "AyHO4m",
157
- message: "What's this collection about?"
158
- })
159
- })
160
- ]
161
- }),
162
- /*#__PURE__*/ _jsxs("div", {
163
- class: "flex gap-2",
164
- children: [
165
- /*#__PURE__*/ _jsxs("button", {
166
- type: "submit",
167
- class: "btn",
168
- "data-attr-disabled": "$_loading",
169
- children: [
170
- /*#__PURE__*/ _jsx("span", {
171
- "data-show": "!$_loading",
172
- children: $__i18n._({
173
- id: "Pbm2/N",
174
- message: "Create Collection"
175
- })
176
- }),
177
- /*#__PURE__*/ _jsx("span", {
178
- "data-show": "$_loading",
179
- children: $__i18n._({
180
- id: "k1ifdL",
181
- message: "Processing..."
182
- })
183
- })
184
- ]
185
- }),
186
- /*#__PURE__*/ _jsx("a", {
187
- href: "/dash/collections",
188
- class: "btn-outline",
189
- children: $__i18n._({
190
- id: "dEgA5A",
191
- message: "Cancel"
192
- })
193
- })
194
- ]
195
- })
196
- ]
197
- })
198
- ]
199
- });
200
- }
201
- function ViewCollectionContent({ collection, posts }) {
202
- const { i18n: $__i18n, _: $__ } = $_useLingui();
203
- const postsHeader = $__i18n._({
204
- id: "pRhYH2",
205
- message: "Posts in Collection ({count})"
206
- });
207
- return /*#__PURE__*/ _jsxs(_Fragment, {
208
- children: [
209
- /*#__PURE__*/ _jsxs("div", {
210
- class: "flex items-center justify-between mb-6",
211
- children: [
212
- /*#__PURE__*/ _jsxs("div", {
213
- children: [
214
- /*#__PURE__*/ _jsx("h1", {
215
- class: "text-2xl font-semibold",
216
- children: collection.title
217
- }),
218
- /*#__PURE__*/ _jsxs("p", {
219
- class: "text-sm text-muted-foreground",
220
- children: [
221
- "/",
222
- collection.slug
223
- ]
224
- })
225
- ]
226
- }),
227
- /*#__PURE__*/ _jsx(ActionButtons, {
228
- editHref: `/dash/collections/${collection.id}/edit`,
229
- editLabel: $__i18n._({
230
- id: "ePK91l",
231
- message: "Edit"
232
- }),
233
- viewHref: `/c/${collection.slug}`,
234
- viewLabel: $__i18n._({
235
- id: "jpctdh",
236
- message: "View"
237
- })
238
- })
239
- ]
240
- }),
241
- collection.description && /*#__PURE__*/ _jsx("p", {
242
- class: "text-muted-foreground mb-6",
243
- children: collection.description
244
- }),
245
- /*#__PURE__*/ _jsxs("div", {
246
- class: "card",
247
- children: [
248
- /*#__PURE__*/ _jsx("header", {
249
- children: /*#__PURE__*/ _jsx("h2", {
250
- children: postsHeader
251
- })
252
- }),
253
- /*#__PURE__*/ _jsx("section", {
254
- children: posts.length === 0 ? /*#__PURE__*/ _jsx("p", {
255
- class: "text-muted-foreground",
256
- children: $__i18n._({
257
- id: "J4FNfC",
258
- message: "No posts in this collection."
259
- })
260
- }) : /*#__PURE__*/ _jsx("div", {
261
- class: "flex flex-col divide-y",
262
- children: posts.map((post)=>/*#__PURE__*/ _jsx("div", {
263
- class: "py-3 flex items-center gap-4",
264
- children: /*#__PURE__*/ _jsx("div", {
265
- class: "flex-1 min-w-0",
266
- children: /*#__PURE__*/ _jsx("a", {
267
- href: `/dash/posts/${sqid.encode(post.id)}`,
268
- class: "font-medium hover:underline",
269
- children: post.title || post.body?.slice(0, 50) || `Post #${post.id}`
270
- })
271
- })
272
- }, post.id))
273
- })
274
- })
275
- ]
276
- }),
277
- /*#__PURE__*/ _jsx("div", {
278
- class: "mt-6",
279
- children: /*#__PURE__*/ _jsx("a", {
280
- href: "/dash/collections",
281
- class: "text-sm hover:underline",
282
- children: $__i18n._({
283
- id: "e6Jr7Q",
284
- message: "← Back to Collections"
285
- })
286
- })
287
- })
288
- ]
289
- });
290
- }
291
- function EditCollectionContent({ collection }) {
292
- const { i18n: $__i18n, _: $__ } = $_useLingui();
293
- const signals = JSON.stringify({
294
- title: collection.title,
295
- slug: collection.slug ?? "",
296
- description: collection.description ?? ""
297
- }).replace(/</g, "\\u003c");
298
- return /*#__PURE__*/ _jsxs(_Fragment, {
299
- children: [
300
- /*#__PURE__*/ _jsx("h1", {
301
- class: "text-2xl font-semibold mb-6",
302
- children: $__i18n._({
303
- id: "/0D1Xp",
304
- message: "Edit Collection"
305
- })
306
- }),
307
- /*#__PURE__*/ _jsxs("form", {
308
- "data-signals": signals,
309
- "data-on:submit__prevent": `@post('/dash/collections/${collection.id}')`,
310
- "data-indicator": "_loading",
311
- class: "flex flex-col gap-4 max-w-lg",
312
- children: [
313
- /*#__PURE__*/ _jsxs("div", {
314
- class: "field",
315
- children: [
316
- /*#__PURE__*/ _jsx("label", {
317
- class: "label",
318
- children: $__i18n._({
319
- id: "MHrjPM",
320
- message: "Title"
321
- })
322
- }),
323
- /*#__PURE__*/ _jsx("input", {
324
- type: "text",
325
- "data-bind": "title",
326
- class: "input",
327
- required: true
328
- })
329
- ]
330
- }),
331
- /*#__PURE__*/ _jsxs("div", {
332
- class: "field",
333
- children: [
334
- /*#__PURE__*/ _jsx("label", {
335
- class: "label",
336
- children: $__i18n._({
337
- id: "L85WcV",
338
- message: "Slug"
339
- })
340
- }),
341
- /*#__PURE__*/ _jsx("input", {
342
- type: "text",
343
- "data-bind": "slug",
344
- class: "input",
345
- required: true,
346
- pattern: "[a-z0-9-]+"
347
- })
348
- ]
349
- }),
350
- /*#__PURE__*/ _jsxs("div", {
351
- class: "field",
352
- children: [
353
- /*#__PURE__*/ _jsx("label", {
354
- class: "label",
355
- children: $__i18n._({
356
- id: "Fxf4jq",
357
- message: "Description (optional)"
358
- })
359
- }),
360
- /*#__PURE__*/ _jsx("textarea", {
361
- "data-bind": "description",
362
- class: "textarea",
363
- rows: 3,
364
- children: collection.description ?? ""
365
- })
366
- ]
367
- }),
368
- /*#__PURE__*/ _jsxs("div", {
369
- class: "flex gap-2",
370
- children: [
371
- /*#__PURE__*/ _jsxs("button", {
372
- type: "submit",
373
- class: "btn",
374
- "data-attr-disabled": "$_loading",
375
- children: [
376
- /*#__PURE__*/ _jsx("span", {
377
- "data-show": "!$_loading",
378
- children: $__i18n._({
379
- id: "7Mk+/h",
380
- message: "Update Collection"
381
- })
382
- }),
383
- /*#__PURE__*/ _jsx("span", {
384
- "data-show": "$_loading",
385
- children: $__i18n._({
386
- id: "k1ifdL",
387
- message: "Processing..."
388
- })
389
- })
390
- ]
391
- }),
392
- /*#__PURE__*/ _jsx("a", {
393
- href: `/dash/collections/${collection.id}`,
394
- class: "btn-outline",
395
- children: $__i18n._({
396
- id: "dEgA5A",
397
- message: "Cancel"
398
- })
399
- })
400
- ]
401
- })
402
- ]
403
- }),
404
- /*#__PURE__*/ _jsx(DangerZone, {
405
- actionLabel: $__i18n._({
406
- id: "GA5A5H",
407
- message: "Delete Collection"
408
- }),
409
- formAction: `/dash/collections/${collection.id}/delete`,
410
- confirmMessage: "Are you sure you want to delete this collection?"
411
- })
412
- ]
413
- });
414
- }
415
14
  // List collections
416
15
  collectionsRoutes.get("/", async (c)=>{
417
16
  const siteName = await getSiteName(c);
@@ -434,7 +33,7 @@ collectionsRoutes.get("/new", async (c)=>{
434
33
  title: "New Collection",
435
34
  siteName: siteName,
436
35
  currentPath: "/dash/collections",
437
- children: /*#__PURE__*/ _jsx(NewCollectionContent, {})
36
+ children: /*#__PURE__*/ _jsx(CollectionForm, {})
438
37
  }));
439
38
  });
440
39
  // Create collection
@@ -453,10 +52,11 @@ collectionsRoutes.get("/:id", async (c)=>{
453
52
  if (isNaN(id)) return c.notFound();
454
53
  const collection = await c.var.services.collections.getById(id);
455
54
  if (!collection) return c.notFound();
456
- // Fetch posts in this collection via post service
457
- const posts = await c.var.services.posts.list({
55
+ const rawPosts = await c.var.services.posts.list({
458
56
  collectionId: id
459
57
  });
58
+ const ctx = createMediaContext(c);
59
+ const posts = toPostViewsFromPosts(rawPosts, ctx);
460
60
  const siteName = await getSiteName(c);
461
61
  return c.html(/*#__PURE__*/ _jsx(DashLayout, {
462
62
  c: c,
@@ -476,14 +76,22 @@ collectionsRoutes.get("/:id/edit", async (c)=>{
476
76
  const collection = await c.var.services.collections.getById(id);
477
77
  if (!collection) return c.notFound();
478
78
  const siteName = await getSiteName(c);
479
- return c.html(/*#__PURE__*/ _jsx(DashLayout, {
79
+ return c.html(/*#__PURE__*/ _jsxs(DashLayout, {
480
80
  c: c,
481
81
  title: `Edit: ${collection.title}`,
482
82
  siteName: siteName,
483
83
  currentPath: "/dash/collections",
484
- children: /*#__PURE__*/ _jsx(EditCollectionContent, {
485
- collection: collection
486
- })
84
+ children: [
85
+ /*#__PURE__*/ _jsx(CollectionForm, {
86
+ collection: collection,
87
+ isEdit: true
88
+ }),
89
+ /*#__PURE__*/ _jsx(DangerZone, {
90
+ actionLabel: "Delete Collection",
91
+ formAction: `/dash/collections/${collection.id}/delete`,
92
+ confirmMessage: "Are you sure you want to delete this collection?"
93
+ })
94
+ ]
487
95
  }));
488
96
  });
489
97
  // Update collection
@@ -6,7 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
6
6
  */ import { Hono } from "hono";
7
7
  import { useLingui as $_useLingui } from "@jant/core/i18n";
8
8
  import { Trans as Trans_ } from "@jant/core/i18n";
9
- import { DashLayout } from "../../theme/layouts/index.js";
9
+ import { DashLayout } from "../../ui/layouts/DashLayout.js";
10
10
  import { getSiteName } from "../../lib/config.js";
11
11
  export const dashIndexRoutes = new Hono();
12
12
  /**