@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,27 @@
1
+ /**
2
+ * Empty State Component
3
+ *
4
+ * Displays a message when a list or collection has no items,
5
+ * optionally with a call-to-action button
6
+ */
7
+ import type { FC } from "hono/jsx";
8
+ export interface EmptyStateProps {
9
+ /**
10
+ * Message to display when empty
11
+ */
12
+ message: string;
13
+ /**
14
+ * Optional call-to-action button text
15
+ */
16
+ ctaText?: string;
17
+ /**
18
+ * Optional call-to-action button href
19
+ */
20
+ ctaHref?: string;
21
+ /**
22
+ * Whether to center the content with padding (default: true)
23
+ */
24
+ centered?: boolean;
25
+ }
26
+ export declare const EmptyState: FC<EmptyStateProps>;
27
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../src/theme/components/EmptyState.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAwB1C,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Empty State Component
3
+ *
4
+ * Displays a message when a list or collection has no items,
5
+ * optionally with a call-to-action button
6
+ */ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
7
+ export const EmptyState = ({ message, ctaText, ctaHref, centered = true })=>{
8
+ if (!centered) {
9
+ return /*#__PURE__*/ _jsx("p", {
10
+ class: "text-muted-foreground",
11
+ children: message
12
+ });
13
+ }
14
+ return /*#__PURE__*/ _jsxs("div", {
15
+ class: "text-center py-12 text-muted-foreground",
16
+ children: [
17
+ /*#__PURE__*/ _jsx("p", {
18
+ children: message
19
+ }),
20
+ ctaText && ctaHref && /*#__PURE__*/ _jsx("a", {
21
+ href: ctaHref,
22
+ class: "btn mt-4",
23
+ children: ctaText
24
+ })
25
+ ]
26
+ });
27
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * List Item Row Component
3
+ *
4
+ * Provides consistent layout for list items in dashboard CRUD pages.
5
+ * Handles responsive spacing, overflow, and action button placement.
6
+ */
7
+ import type { FC, PropsWithChildren } from "hono/jsx";
8
+ export interface ListItemRowProps extends PropsWithChildren {
9
+ /**
10
+ * Action buttons to display on the right side
11
+ */
12
+ actions?: unknown;
13
+ }
14
+ export declare const ListItemRow: FC<ListItemRowProps>;
15
+ //# sourceMappingURL=ListItemRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListItemRow.d.ts","sourceRoot":"","sources":["../../../src/theme/components/ListItemRow.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAO5C,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * List Item Row Component
3
+ *
4
+ * Provides consistent layout for list items in dashboard CRUD pages.
5
+ * Handles responsive spacing, overflow, and action button placement.
6
+ */ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
7
+ export const ListItemRow = ({ children, actions })=>{
8
+ return /*#__PURE__*/ _jsxs("div", {
9
+ class: "py-4 flex items-start gap-4",
10
+ children: [
11
+ /*#__PURE__*/ _jsx("div", {
12
+ class: "flex-1 min-w-0",
13
+ children: children
14
+ }),
15
+ actions && /*#__PURE__*/ _jsx("div", {
16
+ class: "flex items-center gap-2",
17
+ children: actions
18
+ })
19
+ ]
20
+ });
21
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Page Creation/Edit Form
3
+ *
4
+ * For managing custom pages (posts with type="page")
5
+ */
6
+ import type { FC } from "hono/jsx";
7
+ import type { Post } from "../../types.js";
8
+ export interface PageFormProps {
9
+ page?: Post;
10
+ action: string;
11
+ cancelUrl?: string;
12
+ }
13
+ export declare const PageForm: FC<PageFormProps>;
14
+ //# sourceMappingURL=PageForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageForm.d.ts","sourceRoot":"","sources":["../../../src/theme/components/PageForm.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAiGtC,CAAC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Page Creation/Edit Form
3
+ *
4
+ * For managing custom pages (posts with type="page")
5
+ */ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
6
+ import { useLingui } from "../../i18n/index.js";
7
+ export const PageForm = ({ page, action, cancelUrl = "/dash/pages" })=>{
8
+ const { t } = useLingui();
9
+ const isEdit = !!page;
10
+ return /*#__PURE__*/ _jsxs("form", {
11
+ method: "post",
12
+ action: action,
13
+ class: "flex flex-col gap-4",
14
+ children: [
15
+ /*#__PURE__*/ _jsx("input", {
16
+ type: "hidden",
17
+ name: "type",
18
+ value: "page"
19
+ }),
20
+ /*#__PURE__*/ _jsxs("div", {
21
+ class: "field",
22
+ children: [
23
+ /*#__PURE__*/ _jsx("label", {
24
+ class: "label",
25
+ children: t({
26
+ message: "Title",
27
+ comment: "@context: Page form field label - title"
28
+ })
29
+ }),
30
+ /*#__PURE__*/ _jsx("input", {
31
+ type: "text",
32
+ name: "title",
33
+ class: "input",
34
+ placeholder: t({
35
+ message: "Page title...",
36
+ comment: "@context: Page title placeholder"
37
+ }),
38
+ value: page?.title ?? "",
39
+ required: true
40
+ })
41
+ ]
42
+ }),
43
+ /*#__PURE__*/ _jsxs("div", {
44
+ class: "field",
45
+ children: [
46
+ /*#__PURE__*/ _jsx("label", {
47
+ class: "label",
48
+ children: t({
49
+ message: "Path",
50
+ comment: "@context: Page form field label - URL path"
51
+ })
52
+ }),
53
+ /*#__PURE__*/ _jsxs("div", {
54
+ class: "flex items-center gap-2",
55
+ children: [
56
+ /*#__PURE__*/ _jsx("span", {
57
+ class: "text-muted-foreground",
58
+ children: "/"
59
+ }),
60
+ /*#__PURE__*/ _jsx("input", {
61
+ type: "text",
62
+ name: "path",
63
+ class: "input flex-1",
64
+ placeholder: "about",
65
+ value: page?.path ?? "",
66
+ pattern: "[a-z0-9\\-]+",
67
+ title: t({
68
+ message: "Lowercase letters, numbers, and hyphens only",
69
+ comment: "@context: Page path validation message"
70
+ }),
71
+ required: true
72
+ })
73
+ ]
74
+ }),
75
+ /*#__PURE__*/ _jsx("p", {
76
+ class: "text-xs text-muted-foreground mt-1",
77
+ children: t({
78
+ message: "The URL path for this page. Use lowercase letters, numbers, and hyphens.",
79
+ comment: "@context: Page path helper text"
80
+ })
81
+ })
82
+ ]
83
+ }),
84
+ /*#__PURE__*/ _jsxs("div", {
85
+ class: "field",
86
+ children: [
87
+ /*#__PURE__*/ _jsx("label", {
88
+ class: "label",
89
+ children: t({
90
+ message: "Content",
91
+ comment: "@context: Page form field label - content"
92
+ })
93
+ }),
94
+ /*#__PURE__*/ _jsx("textarea", {
95
+ name: "content",
96
+ class: "textarea min-h-48",
97
+ placeholder: t({
98
+ message: "Page content (Markdown supported)...",
99
+ comment: "@context: Page content placeholder"
100
+ }),
101
+ required: true,
102
+ children: page?.content ?? ""
103
+ })
104
+ ]
105
+ }),
106
+ /*#__PURE__*/ _jsxs("div", {
107
+ class: "field",
108
+ children: [
109
+ /*#__PURE__*/ _jsx("label", {
110
+ class: "label",
111
+ children: t({
112
+ message: "Status",
113
+ comment: "@context: Page form field label - publish status"
114
+ })
115
+ }),
116
+ /*#__PURE__*/ _jsxs("select", {
117
+ name: "visibility",
118
+ class: "select",
119
+ children: [
120
+ /*#__PURE__*/ _jsx("option", {
121
+ value: "unlisted",
122
+ selected: page?.visibility === "unlisted" || !page,
123
+ children: t({
124
+ message: "Published",
125
+ comment: "@context: Page status option - published"
126
+ })
127
+ }),
128
+ /*#__PURE__*/ _jsx("option", {
129
+ value: "draft",
130
+ selected: page?.visibility === "draft",
131
+ children: t({
132
+ message: "Draft",
133
+ comment: "@context: Page status option - draft"
134
+ })
135
+ })
136
+ ]
137
+ }),
138
+ /*#__PURE__*/ _jsx("p", {
139
+ class: "text-xs text-muted-foreground mt-1",
140
+ children: t({
141
+ message: "Published pages are accessible via their path. Drafts are not visible.",
142
+ comment: "@context: Page status helper text"
143
+ })
144
+ })
145
+ ]
146
+ }),
147
+ /*#__PURE__*/ _jsxs("div", {
148
+ class: "flex gap-2",
149
+ children: [
150
+ /*#__PURE__*/ _jsx("button", {
151
+ type: "submit",
152
+ class: "btn",
153
+ children: isEdit ? t({
154
+ message: "Update Page",
155
+ comment: "@context: Button to update existing page"
156
+ }) : t({
157
+ message: "Create Page",
158
+ comment: "@context: Button to create new page"
159
+ })
160
+ }),
161
+ /*#__PURE__*/ _jsx("a", {
162
+ href: cancelUrl,
163
+ class: "btn-outline",
164
+ children: t({
165
+ message: "Cancel",
166
+ comment: "@context: Button to cancel and go back"
167
+ })
168
+ })
169
+ ]
170
+ })
171
+ ]
172
+ });
173
+ };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Pagination Component
3
+ *
4
+ * Cursor-based pagination for post lists
5
+ */
6
+ import type { FC } from "hono/jsx";
7
+ export interface PaginationProps {
8
+ /** Base URL for pagination links (e.g., "/archive", "/search?q=test") */
9
+ baseUrl: string;
10
+ /** Whether there are more items after the current page */
11
+ hasMore: boolean;
12
+ /** Cursor for the next page (typically the last item's ID) */
13
+ nextCursor?: number | string;
14
+ /** Cursor for the previous page */
15
+ prevCursor?: number | string;
16
+ /** Parameter name for cursor (default: "cursor") */
17
+ cursorParam?: string;
18
+ }
19
+ export declare const Pagination: FC<PaginationProps>;
20
+ /**
21
+ * Simple "Load More" style pagination
22
+ */
23
+ export interface LoadMoreProps {
24
+ /** URL for loading more items */
25
+ href: string;
26
+ /** Whether there are more items to load */
27
+ hasMore: boolean;
28
+ /** Button text */
29
+ text?: string;
30
+ }
31
+ export declare const LoadMore: FC<LoadMoreProps>;
32
+ /**
33
+ * Page-based pagination (for search results etc.)
34
+ */
35
+ export interface PagePaginationProps {
36
+ /** Base URL (query params will be added) */
37
+ baseUrl: string;
38
+ /** Current page (1-indexed) */
39
+ currentPage: number;
40
+ /** Whether there are more pages */
41
+ hasMore: boolean;
42
+ /** Page parameter name (default: "page") */
43
+ pageParam?: string;
44
+ }
45
+ export declare const PagePagination: FC<PagePaginationProps>;
46
+ //# sourceMappingURL=Pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/theme/components/Pagination.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAGnC,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA0D1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAmBtC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAkElD,CAAC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Pagination Component
3
+ *
4
+ * Cursor-based pagination for post lists
5
+ */ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
6
+ import { useLingui } from "../../i18n/index.js";
7
+ export const Pagination = ({ baseUrl, hasMore, nextCursor, prevCursor, cursorParam = "cursor" })=>{
8
+ const { t } = useLingui();
9
+ const hasPrev = prevCursor !== undefined;
10
+ const hasNext = hasMore && nextCursor !== undefined;
11
+ if (!hasPrev && !hasNext) {
12
+ return null;
13
+ }
14
+ // Build URL with cursor parameter
15
+ const buildUrl = (cursor)=>{
16
+ const url = new URL(baseUrl, "http://localhost");
17
+ url.searchParams.set(cursorParam, String(cursor));
18
+ return `${url.pathname}${url.search}`;
19
+ };
20
+ const prevText = t({
21
+ message: "Previous",
22
+ comment: "@context: Pagination button - previous page"
23
+ });
24
+ const nextText = t({
25
+ message: "Next",
26
+ comment: "@context: Pagination button - next page"
27
+ });
28
+ return /*#__PURE__*/ _jsxs("nav", {
29
+ class: "flex items-center justify-between py-4",
30
+ "aria-label": "Pagination",
31
+ children: [
32
+ /*#__PURE__*/ _jsx("div", {
33
+ children: hasPrev ? /*#__PURE__*/ _jsxs("a", {
34
+ href: buildUrl(prevCursor),
35
+ class: "btn-outline text-sm",
36
+ children: [
37
+ "← ",
38
+ prevText
39
+ ]
40
+ }) : /*#__PURE__*/ _jsxs("span", {
41
+ class: "btn-outline text-sm opacity-50 cursor-not-allowed",
42
+ children: [
43
+ "← ",
44
+ prevText
45
+ ]
46
+ })
47
+ }),
48
+ /*#__PURE__*/ _jsx("div", {
49
+ children: hasNext ? /*#__PURE__*/ _jsxs("a", {
50
+ href: buildUrl(nextCursor),
51
+ class: "btn-outline text-sm",
52
+ children: [
53
+ nextText,
54
+ " →"
55
+ ]
56
+ }) : /*#__PURE__*/ _jsxs("span", {
57
+ class: "btn-outline text-sm opacity-50 cursor-not-allowed",
58
+ children: [
59
+ nextText,
60
+ " →"
61
+ ]
62
+ })
63
+ })
64
+ ]
65
+ });
66
+ };
67
+ export const LoadMore = ({ href, hasMore, text })=>{
68
+ const { t } = useLingui();
69
+ if (!hasMore) {
70
+ return null;
71
+ }
72
+ const buttonText = text ?? t({
73
+ message: "Load more",
74
+ comment: "@context: Pagination button - load more items"
75
+ });
76
+ return /*#__PURE__*/ _jsx("div", {
77
+ class: "text-center py-4",
78
+ children: /*#__PURE__*/ _jsx("a", {
79
+ href: href,
80
+ class: "btn-outline",
81
+ children: buttonText
82
+ })
83
+ });
84
+ };
85
+ export const PagePagination = ({ baseUrl, currentPage, hasMore, pageParam = "page" })=>{
86
+ const { t } = useLingui();
87
+ const hasPrev = currentPage > 1;
88
+ const hasNext = hasMore;
89
+ if (!hasPrev && !hasNext) {
90
+ return null;
91
+ }
92
+ // Build URL with page parameter
93
+ const buildUrl = (page)=>{
94
+ const url = new URL(baseUrl, "http://localhost");
95
+ if (page > 1) {
96
+ url.searchParams.set(pageParam, String(page));
97
+ } else {
98
+ url.searchParams.delete(pageParam);
99
+ }
100
+ return `${url.pathname}${url.search}`;
101
+ };
102
+ const prevText = t({
103
+ message: "Previous",
104
+ comment: "@context: Pagination button - previous page"
105
+ });
106
+ const nextText = t({
107
+ message: "Next",
108
+ comment: "@context: Pagination button - next page"
109
+ });
110
+ const pageText = t({
111
+ message: "Page {page}",
112
+ comment: "@context: Pagination - current page indicator",
113
+ values: {
114
+ page: String(currentPage)
115
+ }
116
+ });
117
+ return /*#__PURE__*/ _jsxs("nav", {
118
+ class: "flex items-center justify-between py-4",
119
+ "aria-label": "Pagination",
120
+ children: [
121
+ /*#__PURE__*/ _jsx("div", {
122
+ children: hasPrev ? /*#__PURE__*/ _jsxs("a", {
123
+ href: buildUrl(currentPage - 1),
124
+ class: "btn-outline text-sm",
125
+ children: [
126
+ "← ",
127
+ prevText
128
+ ]
129
+ }) : /*#__PURE__*/ _jsxs("span", {
130
+ class: "btn-outline text-sm opacity-50 cursor-not-allowed",
131
+ children: [
132
+ "← ",
133
+ prevText
134
+ ]
135
+ })
136
+ }),
137
+ /*#__PURE__*/ _jsx("span", {
138
+ class: "text-sm text-muted-foreground",
139
+ children: pageText
140
+ }),
141
+ /*#__PURE__*/ _jsx("div", {
142
+ children: hasNext ? /*#__PURE__*/ _jsxs("a", {
143
+ href: buildUrl(currentPage + 1),
144
+ class: "btn-outline text-sm",
145
+ children: [
146
+ nextText,
147
+ " →"
148
+ ]
149
+ }) : /*#__PURE__*/ _jsxs("span", {
150
+ class: "btn-outline text-sm opacity-50 cursor-not-allowed",
151
+ children: [
152
+ nextText,
153
+ " →"
154
+ ]
155
+ })
156
+ })
157
+ ]
158
+ });
159
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Post Creation/Edit Form
3
+ */
4
+ import type { FC } from "hono/jsx";
5
+ import type { Post } from "../../types.js";
6
+ export interface PostFormProps {
7
+ post?: Post;
8
+ action: string;
9
+ method?: "get" | "post";
10
+ }
11
+ export declare const PostForm: FC<PostFormProps>;
12
+ //# sourceMappingURL=PostForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostForm.d.ts","sourceRoot":"","sources":["../../../src/theme/components/PostForm.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CA2GtC,CAAC"}