@jant/core 0.3.35 → 0.3.37

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 (307) hide show
  1. package/bin/commands/export.js +1 -1
  2. package/bin/commands/import-site.js +529 -0
  3. package/bin/commands/reset-password.js +3 -2
  4. package/dist/client/assets/heic-to-DIRPI3VF.js +1 -0
  5. package/dist/client/assets/module-RjUF93sV.js +716 -0
  6. package/dist/client/assets/native-48B9X9Wg.js +1 -0
  7. package/dist/client/assets/url-FWFqPJPb.js +1 -0
  8. package/dist/client/client.css +1 -1
  9. package/dist/client/client.js +4564 -3013
  10. package/dist/index.js +12885 -8161
  11. package/package.json +23 -6
  12. package/src/__tests__/helpers/app.ts +10 -10
  13. package/src/__tests__/helpers/db.ts +91 -87
  14. package/src/app.tsx +157 -31
  15. package/src/auth.ts +20 -2
  16. package/src/client/archive-nav.js +187 -0
  17. package/src/client/audio-player.ts +478 -0
  18. package/src/client/audio-processor.ts +84 -0
  19. package/src/{lib → client}/avatar-upload.ts +4 -3
  20. package/src/{lib → client}/collection-form-bridge.ts +2 -2
  21. package/src/{ui → client}/components/__tests__/jant-collection-form.test.ts +26 -9
  22. package/src/client/components/__tests__/jant-compose-dialog.test.ts +1140 -0
  23. package/src/client/components/__tests__/jant-compose-editor.test.ts +504 -0
  24. package/src/{ui → client}/components/__tests__/jant-post-form.test.ts +37 -17
  25. package/src/{ui → client}/components/__tests__/jant-settings-avatar.test.ts +2 -2
  26. package/src/{ui → client}/components/__tests__/jant-settings-general.test.ts +3 -3
  27. package/src/client/components/collection-sidebar-types.ts +43 -0
  28. package/src/{ui → client}/components/collection-types.ts +3 -4
  29. package/src/client/components/compose-types.ts +174 -0
  30. package/src/client/components/jant-collection-form.ts +667 -0
  31. package/src/client/components/jant-collection-sidebar.ts +805 -0
  32. package/src/client/components/jant-compose-dialog.ts +2161 -0
  33. package/src/client/components/jant-compose-editor.ts +1813 -0
  34. package/src/client/components/jant-compose-fullscreen.ts +283 -0
  35. package/src/client/components/jant-media-lightbox.ts +259 -0
  36. package/src/{ui → client}/components/jant-nav-manager.ts +97 -298
  37. package/src/{ui → client}/components/jant-post-form.ts +141 -12
  38. package/src/client/components/jant-post-menu.ts +1019 -0
  39. package/src/{ui → client}/components/jant-settings-avatar.ts +3 -3
  40. package/src/{ui → client}/components/jant-settings-general.ts +38 -4
  41. package/src/client/components/jant-text-preview.ts +232 -0
  42. package/src/{ui → client}/components/nav-manager-types.ts +6 -18
  43. package/src/{ui → client}/components/post-form-template.ts +137 -38
  44. package/src/{ui → client}/components/post-form-types.ts +15 -4
  45. package/src/client/compose-bridge.ts +583 -0
  46. package/src/{lib → client}/image-processor.ts +26 -8
  47. package/src/client/lazy-slugify.ts +51 -0
  48. package/src/client/media-metadata.ts +247 -0
  49. package/src/client/multipart-upload.ts +160 -0
  50. package/src/{lib → client}/nav-manager-bridge.ts +1 -1
  51. package/src/{lib → client}/post-form-bridge.ts +53 -2
  52. package/src/{lib → client}/settings-bridge.ts +3 -15
  53. package/src/client/thread-context.ts +140 -0
  54. package/src/client/tiptap/bubble-menu.ts +205 -0
  55. package/src/client/tiptap/create-editor.ts +86 -0
  56. package/src/client/tiptap/exitable-marks.ts +73 -0
  57. package/src/client/tiptap/extensions.ts +65 -0
  58. package/src/client/tiptap/image-node.ts +482 -0
  59. package/src/client/tiptap/link-toolbar.ts +371 -0
  60. package/src/client/tiptap/more-break.ts +50 -0
  61. package/src/client/tiptap/paste-image.ts +129 -0
  62. package/src/client/tiptap/slash-commands.ts +438 -0
  63. package/src/{lib → client}/toast.ts +101 -3
  64. package/src/client/types/sortablejs.d.ts +44 -0
  65. package/src/client/upload-with-metadata.ts +54 -0
  66. package/src/client/video-processor.ts +207 -0
  67. package/src/client.ts +27 -17
  68. package/src/db/__tests__/migrations.test.ts +118 -0
  69. package/src/db/index.ts +52 -0
  70. package/src/db/migrations/0000_baseline.sql +269 -0
  71. package/src/db/migrations/0001_fts_setup.sql +31 -0
  72. package/src/db/migrations/meta/0000_snapshot.json +703 -119
  73. package/src/db/migrations/meta/0001_snapshot.json +1337 -0
  74. package/src/db/migrations/meta/_journal.json +4 -39
  75. package/src/db/schema.ts +409 -140
  76. package/src/i18n/__tests__/detect.test.ts +115 -0
  77. package/src/i18n/context.tsx +2 -2
  78. package/src/i18n/detect.ts +85 -1
  79. package/src/i18n/i18n.ts +1 -1
  80. package/src/i18n/index.ts +2 -1
  81. package/src/i18n/locales/en.po +783 -1087
  82. package/src/i18n/locales/en.ts +1 -1
  83. package/src/i18n/locales/zh-Hans.po +867 -812
  84. package/src/i18n/locales/zh-Hans.ts +1 -1
  85. package/src/i18n/locales/zh-Hant.po +878 -823
  86. package/src/i18n/locales/zh-Hant.ts +1 -1
  87. package/src/i18n/middleware.ts +6 -0
  88. package/src/index.ts +5 -7
  89. package/src/lib/__tests__/blurhash-placeholder.test.ts +75 -0
  90. package/src/lib/__tests__/constants.test.ts +0 -1
  91. package/src/lib/__tests__/markdown-to-tiptap.test.ts +358 -0
  92. package/src/lib/__tests__/nanoid.test.ts +26 -0
  93. package/src/lib/__tests__/resolve-config.test.ts +2 -2
  94. package/src/lib/__tests__/schemas.test.ts +186 -65
  95. package/src/lib/__tests__/slug.test.ts +126 -0
  96. package/src/lib/__tests__/sse.test.ts +6 -6
  97. package/src/lib/__tests__/summary.test.ts +264 -0
  98. package/src/lib/__tests__/theme.test.ts +1 -1
  99. package/src/lib/__tests__/timeline.test.ts +33 -30
  100. package/src/lib/__tests__/tiptap-to-markdown.test.ts +346 -0
  101. package/src/lib/__tests__/url.test.ts +2 -2
  102. package/src/lib/__tests__/view.test.ts +140 -65
  103. package/src/lib/blurhash-placeholder.ts +102 -0
  104. package/src/lib/constants.ts +3 -1
  105. package/src/lib/emoji-catalog.ts +963 -0
  106. package/src/lib/errors.ts +11 -8
  107. package/src/lib/feed.ts +77 -31
  108. package/src/lib/html.ts +2 -1
  109. package/src/lib/icon-catalog.ts +5033 -1
  110. package/src/lib/icons.ts +3 -2
  111. package/src/lib/index.ts +0 -1
  112. package/src/lib/markdown-to-tiptap.ts +286 -0
  113. package/src/lib/media-helpers.ts +22 -12
  114. package/src/lib/nanoid.ts +29 -0
  115. package/src/lib/navigation.ts +1 -1
  116. package/src/lib/render.tsx +24 -5
  117. package/src/lib/resolve-config.ts +13 -2
  118. package/src/lib/schemas.ts +226 -58
  119. package/src/lib/search-snippet.ts +34 -0
  120. package/src/lib/slug.ts +96 -0
  121. package/src/lib/sse.ts +6 -6
  122. package/src/lib/storage.ts +115 -7
  123. package/src/lib/summary.ts +158 -0
  124. package/src/lib/theme.ts +11 -8
  125. package/src/lib/timeline.ts +76 -34
  126. package/src/lib/tiptap-render.ts +191 -0
  127. package/src/lib/tiptap-to-markdown.ts +305 -0
  128. package/src/lib/upload.ts +263 -14
  129. package/src/lib/url.ts +37 -22
  130. package/src/lib/view.ts +236 -55
  131. package/src/middleware/__tests__/auth.test.ts +191 -11
  132. package/src/middleware/__tests__/onboarding.test.ts +12 -10
  133. package/src/middleware/auth.ts +63 -9
  134. package/src/middleware/error-handler.ts +3 -3
  135. package/src/middleware/onboarding.ts +1 -1
  136. package/src/middleware/secure-headers.ts +40 -0
  137. package/src/preset.css +83 -2
  138. package/src/routes/__tests__/compose.test.ts +17 -24
  139. package/src/routes/api/__tests__/collections.test.ts +109 -61
  140. package/src/routes/api/__tests__/nav-items.test.ts +46 -29
  141. package/src/routes/api/__tests__/posts.test.ts +132 -68
  142. package/src/routes/api/__tests__/search.test.ts +15 -2
  143. package/src/routes/api/__tests__/upload-multipart.test.ts +534 -0
  144. package/src/routes/api/collections.ts +57 -31
  145. package/src/routes/api/custom-urls.ts +80 -0
  146. package/src/routes/api/export.ts +31 -0
  147. package/src/routes/api/nav-items.ts +23 -19
  148. package/src/routes/api/posts.ts +81 -62
  149. package/src/routes/api/search.ts +3 -4
  150. package/src/routes/api/upload-multipart.ts +245 -0
  151. package/src/routes/api/upload.ts +92 -24
  152. package/src/routes/auth/__tests__/setup.test.ts +20 -60
  153. package/src/routes/auth/reset.tsx +5 -4
  154. package/src/routes/auth/setup.tsx +39 -31
  155. package/src/routes/auth/signin.tsx +13 -14
  156. package/src/routes/compose.tsx +27 -63
  157. package/src/routes/dash/__tests__/settings-avatar.test.ts +44 -9
  158. package/src/routes/dash/custom-urls.tsx +414 -0
  159. package/src/routes/dash/settings.tsx +475 -99
  160. package/src/routes/feed/__tests__/rss.test.ts +22 -23
  161. package/src/routes/feed/rss.ts +6 -2
  162. package/src/routes/feed/sitemap.ts +2 -12
  163. package/src/routes/pages/__tests__/collections.test.ts +5 -6
  164. package/src/routes/pages/__tests__/featured.test.ts +36 -18
  165. package/src/routes/pages/archive.tsx +177 -37
  166. package/src/routes/pages/collection.tsx +43 -14
  167. package/src/routes/pages/collections.tsx +11 -2
  168. package/src/routes/pages/featured.tsx +27 -3
  169. package/src/routes/pages/home.tsx +15 -14
  170. package/src/routes/pages/latest.tsx +1 -11
  171. package/src/routes/pages/new.tsx +39 -0
  172. package/src/routes/pages/page.tsx +95 -49
  173. package/src/routes/pages/search.tsx +1 -1
  174. package/src/services/__tests__/api-token.test.ts +135 -0
  175. package/src/services/__tests__/collection.test.ts +275 -227
  176. package/src/services/__tests__/custom-url.test.ts +213 -0
  177. package/src/services/__tests__/media.test.ts +162 -22
  178. package/src/services/__tests__/navigation.test.ts +109 -68
  179. package/src/services/__tests__/post-timeline.test.ts +205 -32
  180. package/src/services/__tests__/post.test.ts +800 -230
  181. package/src/services/__tests__/search.test.ts +67 -10
  182. package/src/services/__tests__/settings.test.ts +3 -3
  183. package/src/services/api-token.ts +166 -0
  184. package/src/services/auth.ts +17 -2
  185. package/src/services/collection.ts +397 -131
  186. package/src/services/custom-url.ts +188 -0
  187. package/src/services/export.ts +802 -0
  188. package/src/services/index.ts +26 -19
  189. package/src/services/media.ts +100 -22
  190. package/src/services/navigation.ts +158 -47
  191. package/src/services/path.ts +339 -0
  192. package/src/services/post.ts +764 -172
  193. package/src/services/search.ts +161 -74
  194. package/src/services/settings.ts +6 -2
  195. package/src/styles/components.css +293 -62
  196. package/src/styles/tokens.css +93 -5
  197. package/src/styles/ui.css +4349 -766
  198. package/src/types/bindings.ts +8 -0
  199. package/src/types/config.ts +34 -4
  200. package/src/types/constants.ts +17 -2
  201. package/src/types/entities.ts +83 -37
  202. package/src/types/operations.ts +20 -27
  203. package/src/types/props.ts +52 -17
  204. package/src/types/views.ts +48 -24
  205. package/src/ui/color-themes.ts +133 -23
  206. package/src/ui/compose/ComposeDialog.tsx +255 -16
  207. package/src/ui/compose/ComposePrompt.tsx +1 -1
  208. package/src/ui/dash/CrudPageHeader.tsx +1 -1
  209. package/src/ui/dash/ListItemRow.tsx +1 -1
  210. package/src/ui/dash/StatusBadge.tsx +12 -2
  211. package/src/ui/dash/appearance/AdvancedContent.tsx +71 -59
  212. package/src/ui/dash/appearance/ColorThemeContent.tsx +48 -33
  213. package/src/ui/dash/appearance/FontThemeContent.tsx +65 -73
  214. package/src/ui/dash/appearance/NavigationContent.tsx +106 -135
  215. package/src/ui/dash/index.ts +0 -3
  216. package/src/ui/dash/settings/AccountContent.tsx +87 -146
  217. package/src/ui/dash/settings/AccountMenuContent.tsx +147 -0
  218. package/src/ui/dash/settings/ApiTokensContent.tsx +232 -0
  219. package/src/ui/dash/settings/AvatarContent.tsx +78 -0
  220. package/src/ui/dash/settings/GeneralContent.tsx +3 -62
  221. package/src/ui/dash/settings/SessionsContent.tsx +159 -0
  222. package/src/ui/dash/settings/SettingsRootContent.tsx +266 -0
  223. package/src/ui/feed/LinkCard.tsx +89 -40
  224. package/src/ui/feed/NoteCard.tsx +39 -25
  225. package/src/ui/feed/PostStatusBadges.tsx +67 -0
  226. package/src/ui/feed/QuoteCard.tsx +38 -23
  227. package/src/ui/feed/ThreadPreview.tsx +90 -26
  228. package/src/ui/feed/TimelineFeed.tsx +3 -2
  229. package/src/ui/feed/TimelineItem.tsx +15 -6
  230. package/src/ui/feed/__tests__/thread-preview.test.ts +107 -0
  231. package/src/ui/feed/thread-preview-state.ts +61 -0
  232. package/src/ui/font-themes.ts +2 -2
  233. package/src/ui/layouts/BaseLayout.tsx +2 -2
  234. package/src/ui/layouts/SiteLayout.tsx +116 -103
  235. package/src/ui/pages/ArchivePage.tsx +923 -95
  236. package/src/ui/pages/CollectionPage.tsx +6 -35
  237. package/src/ui/pages/CollectionsPage.tsx +2 -1
  238. package/src/ui/pages/ComposePage.tsx +54 -0
  239. package/src/ui/pages/FeaturedPage.tsx +2 -1
  240. package/src/ui/pages/HomePage.tsx +1 -1
  241. package/src/ui/pages/PostPage.tsx +30 -45
  242. package/src/ui/pages/SearchPage.tsx +182 -38
  243. package/src/ui/shared/AdminBreadcrumb.tsx +29 -0
  244. package/src/ui/shared/CollectionsSidebar.tsx +239 -4
  245. package/src/ui/shared/MediaGallery.tsx +475 -41
  246. package/src/ui/shared/PostFooter.tsx +204 -0
  247. package/src/ui/shared/StarRating.tsx +27 -0
  248. package/src/ui/shared/__tests__/format-chars.test.ts +35 -0
  249. package/src/ui/shared/index.ts +0 -1
  250. package/src/db/migrations/0000_square_wallflower.sql +0 -118
  251. package/src/db/migrations/0001_add_search_fts.sql +0 -34
  252. package/src/db/migrations/0002_add_media_attachments.sql +0 -3
  253. package/src/db/migrations/0003_add_navigation_links.sql +0 -8
  254. package/src/db/migrations/0004_add_storage_provider.sql +0 -3
  255. package/src/db/migrations/0005_v2_schema_migration.sql +0 -268
  256. package/src/db/migrations/0006_rename_slug_to_path.sql +0 -5
  257. package/src/db/migrations/0007_post_collections_m2m.sql +0 -94
  258. package/src/db/migrations/0008_add_collection_dividers.sql +0 -8
  259. package/src/db/migrations/0009_drop_collection_show_divider.sql +0 -2
  260. package/src/db/migrations/0010_add_performance_indexes.sql +0 -16
  261. package/src/db/migrations/0011_add_path_registry.sql +0 -23
  262. package/src/db/migrations/meta/0003_snapshot.json +0 -821
  263. package/src/lib/__tests__/sqid.test.ts +0 -65
  264. package/src/lib/collections-reorder.ts +0 -28
  265. package/src/lib/compose-bridge.ts +0 -280
  266. package/src/lib/media-upload.ts +0 -148
  267. package/src/lib/sqid.ts +0 -79
  268. package/src/routes/api/__tests__/pages.test.ts +0 -218
  269. package/src/routes/api/pages.ts +0 -73
  270. package/src/routes/dash/__tests__/pages.test.ts +0 -226
  271. package/src/routes/dash/appearance.tsx +0 -240
  272. package/src/routes/dash/collections.tsx +0 -211
  273. package/src/routes/dash/index.tsx +0 -103
  274. package/src/routes/dash/media.tsx +0 -132
  275. package/src/routes/dash/pages.tsx +0 -239
  276. package/src/routes/dash/posts.tsx +0 -334
  277. package/src/routes/dash/redirects.tsx +0 -257
  278. package/src/routes/pages/post.tsx +0 -59
  279. package/src/services/__tests__/page.test.ts +0 -298
  280. package/src/services/__tests__/path-registry.test.ts +0 -165
  281. package/src/services/__tests__/redirect.test.ts +0 -159
  282. package/src/services/page.ts +0 -203
  283. package/src/services/path-registry.ts +0 -160
  284. package/src/services/redirect.ts +0 -97
  285. package/src/types/sortablejs.d.ts +0 -29
  286. package/src/ui/components/__tests__/jant-compose-dialog.test.ts +0 -512
  287. package/src/ui/components/__tests__/jant-compose-editor.test.ts +0 -272
  288. package/src/ui/components/compose-types.ts +0 -75
  289. package/src/ui/components/jant-collection-form.ts +0 -512
  290. package/src/ui/components/jant-compose-dialog.ts +0 -495
  291. package/src/ui/components/jant-compose-editor.ts +0 -814
  292. package/src/ui/dash/PageForm.tsx +0 -185
  293. package/src/ui/dash/PostList.tsx +0 -95
  294. package/src/ui/dash/appearance/AppearanceNav.tsx +0 -60
  295. package/src/ui/dash/collections/CollectionForm.tsx +0 -166
  296. package/src/ui/dash/collections/CollectionsListContent.tsx +0 -146
  297. package/src/ui/dash/collections/IconPickerGrid.tsx +0 -50
  298. package/src/ui/dash/collections/ViewCollectionContent.tsx +0 -103
  299. package/src/ui/dash/media/MediaListContent.tsx +0 -201
  300. package/src/ui/dash/media/ViewMediaContent.tsx +0 -208
  301. package/src/ui/dash/pages/PagesContent.tsx +0 -74
  302. package/src/ui/dash/posts/PostForm.tsx +0 -248
  303. package/src/ui/dash/settings/SettingsNav.tsx +0 -52
  304. package/src/ui/layouts/DashLayout.tsx +0 -165
  305. package/src/ui/pages/SinglePage.tsx +0 -23
  306. package/src/ui/shared/ThreadView.tsx +0 -136
  307. /package/src/{ui → client}/components/settings-types.ts +0 -0
@@ -4,7 +4,6 @@
4
4
 
5
5
  import { useLingui } from "@lingui/react/macro";
6
6
  import type { FontTheme } from "../../font-themes.js";
7
- import { AppearanceNav } from "./AppearanceNav.js";
8
7
 
9
8
  export function FontThemeContent({
10
9
  fontThemes,
@@ -16,80 +15,73 @@ export function FontThemeContent({
16
15
  const { t } = useLingui();
17
16
 
18
17
  return (
19
- <>
20
- <AppearanceNav currentTab="fonts" />
21
-
22
- <div
23
- data-signals={JSON.stringify({ fontTheme: currentFontThemeId }).replace(
24
- /</g,
25
- "\\u003c",
26
- )}
27
- data-on:change="@post('/dash/appearance/font-theme')"
28
- class="max-w-3xl"
29
- >
30
- <fieldset>
31
- <legend class="text-lg font-semibold">
32
- {t({
33
- message: "Font theme",
34
- comment: "@context: Appearance settings heading for font theme",
35
- })}
36
- </legend>
37
- <p class="text-sm text-muted-foreground mb-4">
38
- {t({
39
- message:
40
- "Choose a font pairing for your site. All options use system fonts for fast loading.",
41
- comment: "@context: Font theme settings description",
42
- })}
43
- </p>
44
- <div class="flex flex-col gap-2">
45
- {fontThemes.map((ft) => (
46
- <label
47
- key={ft.id}
48
- class={`flex items-start gap-3 p-3 rounded-lg border cursor-pointer transition-colors ${ft.id === currentFontThemeId ? "border-primary" : "border-border"}`}
49
- data-class:border-primary={`$fontTheme === '${ft.id}'`}
50
- data-class:border-border={`$fontTheme !== '${ft.id}'`}
51
- >
52
- <input
53
- type="radio"
54
- name="fontTheme"
55
- value={ft.id}
56
- data-bind="fontTheme"
57
- checked={ft.id === currentFontThemeId || undefined}
58
- class="mt-1"
59
- />
60
- <div>
61
- <div class="font-medium">{t(ft.name)}</div>
62
- <div class="text-sm text-muted-foreground">
63
- {t(ft.description)}
18
+ <div
19
+ data-signals={JSON.stringify({ fontTheme: currentFontThemeId }).replace(
20
+ /</g,
21
+ "\\u003c",
22
+ )}
23
+ data-on:change="@post('/settings/font-theme')"
24
+ class="max-w-3xl"
25
+ >
26
+ <fieldset>
27
+ <legend class="text-lg font-semibold">
28
+ {t({
29
+ message: "Font theme",
30
+ comment: "@context: Appearance settings heading for font theme",
31
+ })}
32
+ </legend>
33
+ <p class="text-sm text-muted-foreground mb-4">
34
+ {t({
35
+ message:
36
+ "Choose a font pairing for your site. All options use system fonts for fast loading.",
37
+ comment: "@context: Font theme settings description",
38
+ })}
39
+ </p>
40
+ <div class="flex flex-col gap-2">
41
+ {fontThemes.map((ft) => (
42
+ <label
43
+ key={ft.id}
44
+ class={`flex items-start gap-3 p-3 rounded-lg border cursor-pointer transition-colors ${ft.id === currentFontThemeId ? "border-primary" : "border-border"}`}
45
+ data-class:border-primary={`$fontTheme === '${ft.id}'`}
46
+ data-class:border-border={`$fontTheme !== '${ft.id}'`}
47
+ >
48
+ <input
49
+ type="radio"
50
+ name="fontTheme"
51
+ value={ft.id}
52
+ data-bind="fontTheme"
53
+ checked={ft.id === currentFontThemeId || undefined}
54
+ class="mt-1"
55
+ />
56
+ <div>
57
+ <div class="font-medium">{t(ft.name)}</div>
58
+ <div class="text-sm text-muted-foreground">
59
+ {t(ft.description)}
60
+ </div>
61
+ <div class="mt-1 text-sm leading-relaxed">
62
+ <div
63
+ class="font-semibold"
64
+ style={`font-family:${ft.headingFontFamily}`}
65
+ >
66
+ {t({
67
+ message: "The quick brown fox jumps over the lazy dog.",
68
+ comment:
69
+ "@context: Font theme preview sentence for headings",
70
+ })}
64
71
  </div>
65
- <div class="mt-1 text-sm leading-relaxed">
66
- <div
67
- class="font-semibold"
68
- style={`font-family:${ft.headingFontFamily}`}
69
- >
70
- {t({
71
- message: "The quick brown fox jumps over the lazy dog.",
72
- comment:
73
- "@context: Font theme preview sentence for headings",
74
- })}
75
- </div>
76
- <div
77
- class="mt-2"
78
- style={`font-family:${ft.bodyFontFamily}`}
79
- >
80
- {t({
81
- message: "The quick brown fox jumps over the lazy dog.",
82
- comment:
83
- "@context: Font theme preview sentence for body text",
84
- })}
85
- </div>
72
+ <div class="mt-2" style={`font-family:${ft.bodyFontFamily}`}>
73
+ {t({
74
+ message: "The quick brown fox jumps over the lazy dog.",
75
+ comment:
76
+ "@context: Font theme preview sentence for body text",
77
+ })}
86
78
  </div>
87
79
  </div>
88
- </label>
89
- ))}
90
- </div>
91
- </fieldset>
92
- </div>
93
- </>
80
+ </div>
81
+ </label>
82
+ ))}
83
+ </div>
84
+ </fieldset>
85
+ </div>
94
86
  );
95
87
  }
@@ -3,21 +3,19 @@
3
3
  */
4
4
 
5
5
  import { useLingui } from "@lingui/react/macro";
6
- import type { NavItem, Page, SystemNavKey } from "../../../types.js";
6
+ import type { NavItem, SystemNavKey } from "../../../types.js";
7
7
  import { SYSTEM_NAV_KEYS } from "../../../types.js";
8
8
  import type {
9
9
  NavManagerLabels,
10
10
  SystemNavConfig,
11
- } from "../../components/nav-manager-types.js";
12
- import { AppearanceNav } from "./AppearanceNav.js";
13
-
11
+ } from "../../../client/components/nav-manager-types.js";
14
12
  // =============================================================================
15
13
  // System descriptions (used to build the config passed to the Lit component)
16
14
  // =============================================================================
17
15
 
18
16
  const SYSTEM_DESCRIPTIONS: Record<SystemNavKey, string> = {
19
17
  rss: "Add a link to your RSS feed",
20
- dashboard: "Shows 'Dashboard' when logged in, 'Sign in' when logged out",
18
+ settings: "Shows 'Settings' when logged in, 'Sign in' when logged out",
21
19
  collections: "Link to your collections page",
22
20
  archive: "Link to the post archive",
23
21
  };
@@ -28,13 +26,11 @@ const SYSTEM_DESCRIPTIONS: Record<SystemNavKey, string> = {
28
26
 
29
27
  export function NavigationContent({
30
28
  navItems,
31
- availablePages,
32
29
  headerNavMaxVisible,
33
30
  homeDefaultView,
34
31
  siteName,
35
32
  }: {
36
33
  navItems: NavItem[];
37
- availablePages: Page[];
38
34
  headerNavMaxVisible: number;
39
35
  homeDefaultView: string;
40
36
  siteName: string;
@@ -47,7 +43,6 @@ export function NavigationContent({
47
43
  type: item.type,
48
44
  label: item.label,
49
45
  url: item.url,
50
- pageId: item.pageId,
51
46
  }));
52
47
 
53
48
  // Build system nav config array for the Lit component
@@ -60,16 +55,9 @@ export function NavigationContent({
60
55
  description: SYSTEM_DESCRIPTIONS[key],
61
56
  }));
62
57
 
63
- // Serialize available pages for the Lit component
64
- const pagesData = availablePages.map((page) => ({
65
- id: page.id,
66
- title: page.title,
67
- slug: page.slug,
68
- }));
69
-
70
58
  const labels: NavManagerLabels = {
71
59
  preview: t({
72
- message: "Preview",
60
+ message: "Navigation Preview",
73
61
  comment: "@context: Label for nav preview section",
74
62
  }),
75
63
  navigationItems: t({
@@ -78,10 +66,9 @@ export function NavigationContent({
78
66
  }),
79
67
  emptyState: t({
80
68
  message:
81
- "No navigation items yet. Add pages, links, or enable system items below.",
69
+ "No navigation items yet. Add links or enable system items below.",
82
70
  comment: "@context: Empty state for navigation items",
83
71
  }),
84
- page: t({ message: "page", comment: "@context: Nav item type badge" }),
85
72
  link: t({ message: "link", comment: "@context: Nav item type badge" }),
86
73
  system: t({
87
74
  message: "system",
@@ -104,13 +91,9 @@ export function NavigationContent({
104
91
  message: "Delete",
105
92
  comment: "@context: Delete nav item",
106
93
  }),
107
- editPage: t({
108
- message: "Edit Page",
109
- comment: "@context: Link to edit the page",
110
- }),
111
94
  remove: t({
112
95
  message: "Remove",
113
- comment: "@context: Remove page from navigation",
96
+ comment: "@context: Remove system item from navigation",
114
97
  }),
115
98
  orderSaved: t({
116
99
  message: "Order saved",
@@ -121,11 +104,11 @@ export function NavigationContent({
121
104
  comment: "@context: Error toast when nav label is empty",
122
105
  }),
123
106
  saveFailed: t({
124
- message: "Failed to save. Please try again.",
107
+ message: "Couldn't save. Try again in a moment.",
125
108
  comment: "@context: Error toast when nav save fails",
126
109
  }),
127
110
  deleteFailed: t({
128
- message: "Failed to delete. Please try again.",
111
+ message: "Couldn't delete. Try again in a moment.",
129
112
  comment: "@context: Error toast when nav delete fails",
130
113
  }),
131
114
  systemLinks: t({
@@ -134,29 +117,13 @@ export function NavigationContent({
134
117
  }),
135
118
  systemLinksDescription: t({
136
119
  message:
137
- "Toggle built-in navigation items. Enabled items appear in your navigation alongside pages and links.",
120
+ "Toggle built-in navigation items. Enabled items appear in your navigation alongside links.",
138
121
  comment: "@context: Description for system nav toggles",
139
122
  }),
140
- addPageToNavigation: t({
141
- message: "Add page to navigation",
142
- comment: "@context: Section heading for adding page to nav",
143
- }),
144
123
  addCustomLinkToNavigation: t({
145
124
  message: "Add custom link to navigation",
146
125
  comment: "@context: Section heading for adding custom link to nav",
147
126
  }),
148
- choosePage: t({
149
- message: "Choose a page…",
150
- comment: "@context: Placeholder for page select combobox trigger",
151
- }),
152
- searchPages: t({
153
- message: "Search pages…",
154
- comment: "@context: Placeholder for page search input in combobox",
155
- }),
156
- noPagesFound: t({
157
- message: "No pages found.",
158
- comment: "@context: Empty state when page search has no results",
159
- }),
160
127
  addLink: t({
161
128
  message: "Add Link",
162
129
  comment: "@context: Button and heading for adding custom link",
@@ -165,24 +132,30 @@ export function NavigationContent({
165
132
  message: "Add a custom link to any URL",
166
133
  comment: "@context: Description in link popover form",
167
134
  }),
168
- allPagesInNav: t({
169
- message: "All pages are already in navigation.",
170
- comment: "@context: Message when no pages available to add",
171
- }),
172
135
  urlPlaceholder: "/archive or https://...",
173
136
  maxVisibleLinks: t({
174
- message: "Max visible links",
137
+ message: "Links shown in header",
175
138
  comment: "@context: Label for max visible nav links number input",
176
139
  }),
140
+ maxVisibleLinksDescription: t({
141
+ message: "The rest will be tucked into a ··· menu",
142
+ comment:
143
+ "@context: Description for max visible nav links, explains overflow behavior",
144
+ }),
177
145
  maxVisibleSaved: t({
178
146
  message: "Max visible links saved",
179
147
  comment: "@context: Toast after saving max visible nav links setting",
180
148
  }),
181
149
  useFeaturedAsDefault: t({
182
- message: "Use Featured as default home view",
150
+ message: "Open with Featured posts",
183
151
  comment:
184
152
  "@context: Switch label for setting featured posts as default homepage",
185
153
  }),
154
+ useFeaturedAsDefaultDescription: t({
155
+ message: "When off, visitors see your latest posts first",
156
+ comment:
157
+ "@context: Description for featured default toggle, explains what happens when off",
158
+ }),
186
159
  homeViewSaved: t({
187
160
  message: "Home view saved",
188
161
  comment: "@context: Toast after saving home default view setting",
@@ -205,98 +178,96 @@ export function NavigationContent({
205
178
  JSON.stringify(data).replace(/</g, "\\u003c");
206
179
 
207
180
  return (
208
- <>
209
- <AppearanceNav currentTab="navigation" />
210
-
211
- <div class="max-w-3xl flex flex-col gap-8">
212
- <jant-nav-manager
213
- items={escapeJson(itemsData)}
214
- labels={escapeJson(labels)}
215
- system-nav-items={escapeJson(systemNavData)}
216
- available-pages={escapeJson(pagesData)}
217
- site-name={siteName}
218
- max-visible={headerNavMaxVisible}
219
- home-default-view={homeDefaultView}
220
- >
221
- {/* SSR fallback: static preview until JS hydrates */}
222
- <div class="border rounded-lg">
223
- <p class="text-xs text-muted-foreground px-4 pt-3">
181
+ <div class="max-w-3xl flex flex-col gap-8">
182
+ <jant-nav-manager
183
+ items={escapeJson(itemsData)}
184
+ labels={escapeJson(labels)}
185
+ system-nav-items={escapeJson(systemNavData)}
186
+ site-name={siteName}
187
+ max-visible={headerNavMaxVisible}
188
+ home-default-view={homeDefaultView}
189
+ >
190
+ {/* SSR fallback: static preview until JS hydrates */}
191
+ <div class="nav-preview">
192
+ <div class="nav-preview-chrome">
193
+ <div class="nav-preview-dots">
194
+ <span />
195
+ <span />
196
+ <span />
197
+ </div>
198
+ <span class="nav-preview-label">
224
199
  {t({
225
- message: "Preview",
200
+ message: "Navigation Preview",
226
201
  comment: "@context: Label for nav preview section",
227
202
  })}
228
- </p>
229
- <div class="px-5 py-3">
230
- <div class="site-header-top">
231
- <a href="/" class="site-logo">
232
- {siteName}
233
- </a>
234
- <div class="site-header-right">
235
- {navItems.length > 0 && (
236
- <nav class="site-header-nav">
237
- {navItems.slice(0, headerNavMaxVisible).map((item) => (
238
- <a
239
- key={item.id}
240
- href={item.url}
241
- class="site-header-link"
242
- >
243
- {item.label}
244
- </a>
245
- ))}
246
- {navItems.length > headerNavMaxVisible && (
247
- <span class="text-muted-foreground">…</span>
248
- )}
249
- </nav>
250
- )}
251
- <span class="site-header-search" aria-hidden="true">
252
- <svg
253
- xmlns="http://www.w3.org/2000/svg"
254
- width="16"
255
- height="16"
256
- viewBox="0 0 24 24"
257
- fill="none"
258
- stroke="currentColor"
259
- stroke-width="2"
260
- stroke-linecap="round"
261
- stroke-linejoin="round"
262
- >
263
- <circle cx="11" cy="11" r="8" />
264
- <path d="m21 21-4.35-4.35" />
265
- </svg>
266
- </span>
267
- </div>
268
- </div>
269
- <nav class="site-browse-nav">
270
- <span class="site-browse-link site-browse-link-active">
271
- {homeDefaultView === "featured"
272
- ? t({
273
- message: "Featured",
274
- comment: "@context: Browse filter label",
275
- })
276
- : t({
277
- message: "Latest",
278
- comment: "@context: Browse filter label",
279
- })}
280
- </span>
281
- <span class="site-browse-sep" aria-hidden="true">
282
- /
283
- </span>
284
- <span class="site-browse-link">
285
- {homeDefaultView === "featured"
286
- ? t({
287
- message: "Latest",
288
- comment: "@context: Browse filter label",
289
- })
290
- : t({
291
- message: "Featured",
292
- comment: "@context: Browse filter label",
293
- })}
203
+ </span>
204
+ </div>
205
+ <div class="nav-preview-content">
206
+ <div class="site-header-top">
207
+ <a href="/" class="site-logo">
208
+ {siteName}
209
+ </a>
210
+ <div class="site-header-right">
211
+ {navItems.length > 0 && (
212
+ <nav class="site-header-nav">
213
+ {navItems.slice(0, headerNavMaxVisible).map((item) => (
214
+ <a key={item.id} href={item.url} class="site-header-link">
215
+ {item.label}
216
+ </a>
217
+ ))}
218
+ {navItems.length > headerNavMaxVisible && (
219
+ <span class="text-muted-foreground">…</span>
220
+ )}
221
+ </nav>
222
+ )}
223
+ <span class="site-header-search" aria-hidden="true">
224
+ <svg
225
+ xmlns="http://www.w3.org/2000/svg"
226
+ width="16"
227
+ height="16"
228
+ viewBox="0 0 24 24"
229
+ fill="none"
230
+ stroke="currentColor"
231
+ stroke-width="2"
232
+ stroke-linecap="round"
233
+ stroke-linejoin="round"
234
+ >
235
+ <circle cx="11" cy="11" r="8" />
236
+ <path d="m21 21-4.35-4.35" />
237
+ </svg>
294
238
  </span>
295
- </nav>
239
+ </div>
296
240
  </div>
241
+ <nav class="site-browse-nav">
242
+ <span class="site-browse-link site-browse-link-active">
243
+ {homeDefaultView === "featured"
244
+ ? t({
245
+ message: "Featured",
246
+ comment: "@context: Browse filter label",
247
+ })
248
+ : t({
249
+ message: "Latest",
250
+ comment: "@context: Browse filter label",
251
+ })}
252
+ </span>
253
+ <span class="site-browse-sep" aria-hidden="true">
254
+ /
255
+ </span>
256
+ <span class="site-browse-link">
257
+ {homeDefaultView === "featured"
258
+ ? t({
259
+ message: "Latest",
260
+ comment: "@context: Browse filter label",
261
+ })
262
+ : t({
263
+ message: "Featured",
264
+ comment: "@context: Browse filter label",
265
+ })}
266
+ </span>
267
+ </nav>
297
268
  </div>
298
- </jant-nav-manager>
299
- </div>
300
- </>
269
+ </div>
270
+ </jant-nav-manager>
271
+ </div>
301
272
  );
302
273
  }
@@ -4,7 +4,4 @@ export { DangerZone, type DangerZoneProps } from "./DangerZone.js";
4
4
  export { EmptyState, type EmptyStateProps } from "../shared/EmptyState.js";
5
5
  export { FormatBadge, type FormatBadgeProps } from "./FormatBadge.js";
6
6
  export { ListItemRow, type ListItemRowProps } from "./ListItemRow.js";
7
- export { PageForm, type PageFormProps } from "./PageForm.js";
8
- export { PostForm, type PostFormProps } from "./posts/PostForm.js";
9
- export { PostList, type PostListProps } from "./PostList.js";
10
7
  export { StatusBadge, type StatusBadgeProps } from "./StatusBadge.js";