@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
@@ -1,272 +0,0 @@
1
- // @vitest-environment happy-dom
2
-
3
- import { describe, it, expect, beforeEach } from "vitest";
4
- import type { ComposeLabels } from "../compose-types.js";
5
- import "../jant-compose-editor.js";
6
- import type { JantComposeEditor } from "../jant-compose-editor.js";
7
-
8
- function requireElement<T extends globalThis.Element>(
9
- element: T | null,
10
- message: string,
11
- ): T {
12
- if (!element) {
13
- throw new Error(message);
14
- }
15
- return element;
16
- }
17
-
18
- function requireItem<T extends globalThis.Element>(
19
- collection: globalThis.NodeListOf<T>,
20
- index: number,
21
- message: string,
22
- ): T {
23
- const item = collection.item(index);
24
- if (!item) {
25
- throw new Error(message);
26
- }
27
- return item;
28
- }
29
-
30
- const labels: ComposeLabels = {
31
- cancel: "Cancel",
32
- note: "Note",
33
- link: "Link",
34
- quote: "Quote",
35
- saveDraft: "Save as Draft",
36
- saveAsDraft: "Save as draft",
37
- discard: "Discard",
38
- titlePlaceholder: "Title",
39
- bodyPlaceholder: "What's on your mind...",
40
- urlPlaceholder: "Paste a URL...",
41
- linkTitlePlaceholder: "Give it a title...",
42
- thoughtsPlaceholder: "Your thoughts (optional)",
43
- quotePlaceholder: "Type the quote...",
44
- authorPlaceholder: "Author (optional)",
45
- sourcePlaceholder: "Source link (optional)",
46
- attachedText: "Attached Text",
47
- attachedTextPlaceholder: "Paste text...",
48
- attachedTextHint: "Supplementary content",
49
- done: "Done",
50
- media: "Media",
51
- score: "Score",
52
- title: "Title",
53
- collection: "Collection",
54
- searchCollections: "Search...",
55
- noCollections: "No collections found.",
56
- post: "Post",
57
- addAlt: "+ ALT",
58
- addAltTitle: "Add alt text",
59
- altPlaceholder: "Describe this...",
60
- altHint: "Alt text improves accessibility",
61
- addMore: "Add",
62
- uploading: "Uploading...",
63
- published: "Published!",
64
- };
65
-
66
- async function createElement(
67
- format: string = "note",
68
- ): Promise<JantComposeEditor> {
69
- const el = document.createElement("jant-compose-editor") as JantComposeEditor;
70
- el.format = format as "note" | "link" | "quote";
71
- el.labels = labels;
72
- document.body.appendChild(el);
73
- await el.updateComplete;
74
- return el;
75
- }
76
-
77
- describe("JantComposeEditor", () => {
78
- beforeEach(() => {
79
- document.body.innerHTML = "";
80
- });
81
-
82
- it("renders note fields by default", async () => {
83
- const el = await createElement("note");
84
- const textarea = requireElement(
85
- el.querySelector<HTMLTextAreaElement>(".compose-body-input"),
86
- "expected compose body textarea",
87
- );
88
- expect(textarea.placeholder).toBe("What's on your mind...");
89
- });
90
-
91
- it("renders link fields when format is link", async () => {
92
- const el = await createElement("link");
93
- const urlInput = requireElement(
94
- el.querySelector<HTMLInputElement>('input[type="url"]'),
95
- "expected url input",
96
- );
97
- expect(urlInput.placeholder).toBe("Paste a URL...");
98
-
99
- const titleInput = el.querySelector<HTMLInputElement>(
100
- ".compose-link-title",
101
- );
102
- expect(titleInput).not.toBeNull();
103
- });
104
-
105
- it("renders quote fields when format is quote", async () => {
106
- const el = await createElement("quote");
107
- const quoteTextarea = el.querySelector<HTMLTextAreaElement>(
108
- ".compose-quote-text",
109
- );
110
- expect(quoteTextarea).not.toBeNull();
111
-
112
- const authorInput = el.querySelector<HTMLInputElement>(
113
- ".compose-quote-author",
114
- );
115
- expect(authorInput).not.toBeNull();
116
- });
117
-
118
- it("toggles star rating visibility", async () => {
119
- const el = await createElement("note");
120
-
121
- // Rating not visible initially
122
- expect(el.querySelector(".compose-star-rating")).toBeNull();
123
-
124
- // Click score button to show rating
125
- const toolButtons =
126
- el.querySelectorAll<HTMLButtonElement>(".compose-tool-btn");
127
- const scoreBtnEl = requireItem(
128
- toolButtons,
129
- 2,
130
- "expected score tool button",
131
- );
132
- scoreBtnEl.click();
133
- await el.updateComplete;
134
-
135
- expect(el.querySelector(".compose-star-rating")).not.toBeNull();
136
- });
137
-
138
- it("sets rating on star click and deselects on same star", async () => {
139
- const el = await createElement("note");
140
- el._showRating = true;
141
- await el.updateComplete;
142
-
143
- const stars = el.querySelectorAll<HTMLButtonElement>(".compose-star");
144
- expect(stars.length).toBe(5);
145
-
146
- // Click third star
147
- stars[2].click();
148
- await el.updateComplete;
149
- expect(el._rating).toBe(3);
150
-
151
- // Rating label shows
152
- const label = el.querySelector(".compose-star-label");
153
- expect(label?.textContent).toContain("3/5");
154
-
155
- // Click third star again to deselect
156
- stars[2].click();
157
- await el.updateComplete;
158
- expect(el._rating).toBe(0);
159
- });
160
-
161
- it("toggles attached text panel", async () => {
162
- const el = await createElement("note");
163
-
164
- // Click attached text tool button
165
- const toolBtns =
166
- el.querySelectorAll<HTMLButtonElement>(".compose-tool-btn");
167
- const attachedBtn = requireItem(
168
- toolBtns,
169
- 1,
170
- "expected attached text button",
171
- );
172
- attachedBtn.click();
173
- await el.updateComplete;
174
-
175
- expect(el.querySelector(".compose-attached-panel")).not.toBeNull();
176
-
177
- // Click done button to close
178
- const doneBtn = el.querySelector<HTMLButtonElement>(
179
- ".compose-attached-panel .compose-post-btn",
180
- );
181
- doneBtn?.click();
182
- await el.updateComplete;
183
-
184
- expect(el.querySelector(".compose-attached-panel")).toBeNull();
185
- });
186
-
187
- it("shows title toggle only in note mode", async () => {
188
- const el = await createElement("note");
189
- const toolSep = el.querySelector(".compose-tool-sep");
190
- expect(toolSep).not.toBeNull();
191
-
192
- el.format = "link";
193
- await el.updateComplete;
194
- expect(el.querySelector(".compose-tool-sep")).toBeNull();
195
- });
196
-
197
- it("getData returns current field values", async () => {
198
- const el = await createElement("note");
199
- el._title = "Test Title";
200
- el._body = "Test Body";
201
- el._rating = 4;
202
- el._attachedText = "Some attached text";
203
-
204
- const data = el.getData();
205
- expect(data.title).toBe("Test Title");
206
- expect(data.body).toBe("Test Body");
207
- expect(data.rating).toBe(4);
208
- expect(data.attachedText).toBe("Some attached text");
209
- expect(data.url).toBe("");
210
- expect(data.quoteText).toBe("");
211
- expect(data.quoteAuthor).toBe("");
212
- });
213
-
214
- it("reset clears all fields", async () => {
215
- const el = await createElement("note");
216
- el._title = "Test";
217
- el._body = "Body";
218
- el._rating = 3;
219
- el._showRating = true;
220
- el._attachedText = "text";
221
- el._showAttachedText = true;
222
-
223
- el.reset();
224
-
225
- expect(el._title).toBe("");
226
- expect(el._body).toBe("");
227
- expect(el._rating).toBe(0);
228
- expect(el._showRating).toBe(false);
229
- expect(el._attachedText).toBe("");
230
- expect(el._showAttachedText).toBe(false);
231
- });
232
-
233
- it("shows attached text badge when text is present", async () => {
234
- const el = await createElement("note");
235
- el._attachedText = "Some content here";
236
- await el.updateComplete;
237
-
238
- const badge = el.querySelector(".compose-attached-badge");
239
- expect(badge).not.toBeNull();
240
- expect(badge?.textContent).toContain("chars");
241
- });
242
-
243
- it("media button highlights when attachments are present", async () => {
244
- const el = await createElement("note");
245
-
246
- // Media button should not be active initially
247
- const mediaBtn = el.querySelector<HTMLButtonElement>(".compose-tool-btn");
248
- expect(mediaBtn?.classList.contains("compose-tool-btn-active")).toBe(false);
249
-
250
- // Add an attachment
251
- const blob = new Blob(["fake"], { type: "image/png" });
252
- const file = new File([blob], "test.png", { type: "image/png" });
253
- el._attachments = [
254
- {
255
- clientId: "test-1",
256
- file,
257
- previewUrl: URL.createObjectURL(blob),
258
- status: "done",
259
- mediaId: "m1",
260
- alt: "",
261
- error: null,
262
- },
263
- ];
264
- await el.updateComplete;
265
-
266
- const mediaBtnAfter =
267
- el.querySelector<HTMLButtonElement>(".compose-tool-btn");
268
- expect(mediaBtnAfter?.classList.contains("compose-tool-btn-active")).toBe(
269
- true,
270
- );
271
- });
272
- });
@@ -1,75 +0,0 @@
1
- /**
2
- * Compose Dialog Types
3
- *
4
- * Shared type definitions for jant-compose-dialog and jant-compose-editor
5
- * Lit Web Components, and the compose bridge script.
6
- */
7
-
8
- export type ComposeFormat = "note" | "link" | "quote";
9
-
10
- export interface ComposeAttachment {
11
- clientId: string;
12
- file: File;
13
- previewUrl: string;
14
- status: "pending" | "uploading" | "done" | "error";
15
- mediaId: string | null;
16
- alt: string;
17
- error: string | null;
18
- }
19
-
20
- export interface ComposeLabels {
21
- cancel: string;
22
- note: string;
23
- link: string;
24
- quote: string;
25
- saveDraft: string;
26
- saveAsDraft: string;
27
- discard: string;
28
- titlePlaceholder: string;
29
- bodyPlaceholder: string;
30
- urlPlaceholder: string;
31
- linkTitlePlaceholder: string;
32
- thoughtsPlaceholder: string;
33
- quotePlaceholder: string;
34
- authorPlaceholder: string;
35
- sourcePlaceholder: string;
36
- attachedText: string;
37
- attachedTextPlaceholder: string;
38
- attachedTextHint: string;
39
- done: string;
40
- media: string;
41
- score: string;
42
- title: string;
43
- collection: string;
44
- searchCollections: string;
45
- noCollections: string;
46
- post: string;
47
- addAlt: string;
48
- addAltTitle: string;
49
- altPlaceholder: string;
50
- altHint: string;
51
- addMore: string;
52
- uploading: string;
53
- published: string;
54
- }
55
-
56
- export interface ComposeSubmitDetail {
57
- format: ComposeFormat;
58
- title: string;
59
- body: string;
60
- url: string;
61
- quoteText: string;
62
- quoteAuthor: string;
63
- status: "published" | "draft";
64
- rating: number;
65
- collectionIds: number[];
66
- mediaIds: string[];
67
- mediaAlts: Record<string, string>;
68
- attachedText: string;
69
- }
70
-
71
- export interface ComposeCollection {
72
- id: number;
73
- title: string;
74
- iconHtml: string;
75
- }