@jant/core 0.3.36 → 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 (271) 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/url-FWFqPJPb.js +1 -0
  6. package/dist/client/client.css +1 -1
  7. package/dist/client/client.js +4012 -3276
  8. package/dist/index.js +10285 -5809
  9. package/package.json +11 -3
  10. package/src/__tests__/helpers/app.ts +9 -9
  11. package/src/__tests__/helpers/db.ts +91 -93
  12. package/src/app.tsx +157 -27
  13. package/src/auth.ts +20 -2
  14. package/src/client/archive-nav.js +187 -0
  15. package/src/client/audio-player.ts +478 -0
  16. package/src/client/audio-processor.ts +84 -0
  17. package/src/client/avatar-upload.ts +3 -2
  18. package/src/client/components/__tests__/jant-compose-dialog.test.ts +645 -49
  19. package/src/client/components/__tests__/jant-compose-editor.test.ts +208 -16
  20. package/src/client/components/__tests__/jant-post-form.test.ts +19 -9
  21. package/src/client/components/__tests__/jant-settings-avatar.test.ts +2 -2
  22. package/src/client/components/__tests__/jant-settings-general.test.ts +3 -3
  23. package/src/client/components/collection-sidebar-types.ts +7 -9
  24. package/src/client/components/compose-types.ts +101 -4
  25. package/src/client/components/jant-collection-form.ts +43 -7
  26. package/src/client/components/jant-collection-sidebar.ts +88 -84
  27. package/src/client/components/jant-compose-dialog.ts +1655 -219
  28. package/src/client/components/jant-compose-editor.ts +732 -168
  29. package/src/client/components/jant-compose-fullscreen.ts +23 -78
  30. package/src/client/components/jant-media-lightbox.ts +2 -0
  31. package/src/client/components/jant-nav-manager.ts +24 -284
  32. package/src/client/components/jant-post-form.ts +89 -9
  33. package/src/client/components/jant-post-menu.ts +1019 -0
  34. package/src/client/components/jant-settings-avatar.ts +3 -3
  35. package/src/client/components/jant-settings-general.ts +38 -4
  36. package/src/client/components/jant-text-preview.ts +232 -0
  37. package/src/client/components/nav-manager-types.ts +4 -19
  38. package/src/client/components/post-form-template.ts +107 -12
  39. package/src/client/components/post-form-types.ts +11 -4
  40. package/src/client/compose-bridge.ts +410 -109
  41. package/src/client/image-processor.ts +26 -8
  42. package/src/client/media-metadata.ts +247 -0
  43. package/src/client/multipart-upload.ts +160 -0
  44. package/src/client/post-form-bridge.ts +52 -1
  45. package/src/client/settings-bridge.ts +0 -12
  46. package/src/client/thread-context.ts +140 -0
  47. package/src/client/tiptap/create-editor.ts +46 -0
  48. package/src/client/tiptap/extensions.ts +5 -0
  49. package/src/client/tiptap/image-node.ts +2 -8
  50. package/src/client/tiptap/paste-image.ts +2 -13
  51. package/src/client/tiptap/slash-commands.ts +173 -63
  52. package/src/client/toast.ts +101 -3
  53. package/src/client/types/sortablejs.d.ts +15 -0
  54. package/src/client/upload-with-metadata.ts +54 -0
  55. package/src/client/video-processor.ts +207 -0
  56. package/src/client.ts +5 -2
  57. package/src/db/__tests__/migrations.test.ts +118 -0
  58. package/src/db/index.ts +52 -0
  59. package/src/db/migrations/0000_baseline.sql +269 -0
  60. package/src/db/migrations/0001_fts_setup.sql +31 -0
  61. package/src/db/migrations/meta/0000_snapshot.json +703 -119
  62. package/src/db/migrations/meta/0001_snapshot.json +1337 -0
  63. package/src/db/migrations/meta/_journal.json +4 -39
  64. package/src/db/schema.ts +409 -145
  65. package/src/i18n/__tests__/detect.test.ts +115 -0
  66. package/src/i18n/context.tsx +2 -2
  67. package/src/i18n/detect.ts +85 -1
  68. package/src/i18n/i18n.ts +1 -1
  69. package/src/i18n/index.ts +2 -1
  70. package/src/i18n/locales/en.po +487 -1217
  71. package/src/i18n/locales/en.ts +1 -1
  72. package/src/i18n/locales/zh-Hans.po +613 -996
  73. package/src/i18n/locales/zh-Hans.ts +1 -1
  74. package/src/i18n/locales/zh-Hant.po +624 -1007
  75. package/src/i18n/locales/zh-Hant.ts +1 -1
  76. package/src/i18n/middleware.ts +6 -0
  77. package/src/index.ts +5 -7
  78. package/src/lib/__tests__/blurhash-placeholder.test.ts +75 -0
  79. package/src/lib/__tests__/constants.test.ts +0 -1
  80. package/src/lib/__tests__/markdown-to-tiptap.test.ts +358 -0
  81. package/src/lib/__tests__/nanoid.test.ts +26 -0
  82. package/src/lib/__tests__/schemas.test.ts +181 -63
  83. package/src/lib/__tests__/slug.test.ts +126 -0
  84. package/src/lib/__tests__/sse.test.ts +6 -6
  85. package/src/lib/__tests__/summary.test.ts +264 -0
  86. package/src/lib/__tests__/theme.test.ts +1 -1
  87. package/src/lib/__tests__/timeline.test.ts +33 -30
  88. package/src/lib/__tests__/tiptap-to-markdown.test.ts +346 -0
  89. package/src/lib/__tests__/view.test.ts +141 -66
  90. package/src/lib/blurhash-placeholder.ts +102 -0
  91. package/src/lib/constants.ts +3 -1
  92. package/src/lib/emoji-catalog.ts +885 -68
  93. package/src/lib/errors.ts +11 -8
  94. package/src/lib/feed.ts +78 -32
  95. package/src/lib/html.ts +2 -1
  96. package/src/lib/icon-catalog.ts +5033 -1
  97. package/src/lib/icons.ts +3 -2
  98. package/src/lib/index.ts +0 -1
  99. package/src/lib/markdown-to-tiptap.ts +286 -0
  100. package/src/lib/media-helpers.ts +12 -3
  101. package/src/lib/nanoid.ts +29 -0
  102. package/src/lib/navigation.ts +1 -1
  103. package/src/lib/render.tsx +20 -2
  104. package/src/lib/resolve-config.ts +6 -2
  105. package/src/lib/schemas.ts +224 -55
  106. package/src/lib/search-snippet.ts +34 -0
  107. package/src/lib/slug.ts +96 -0
  108. package/src/lib/sse.ts +6 -6
  109. package/src/lib/storage.ts +115 -7
  110. package/src/lib/summary.ts +66 -0
  111. package/src/lib/theme.ts +11 -8
  112. package/src/lib/timeline.ts +74 -34
  113. package/src/lib/tiptap-render.ts +5 -10
  114. package/src/lib/tiptap-to-markdown.ts +305 -0
  115. package/src/lib/upload.ts +190 -29
  116. package/src/lib/url.ts +31 -0
  117. package/src/lib/view.ts +204 -37
  118. package/src/middleware/__tests__/auth.test.ts +191 -11
  119. package/src/middleware/__tests__/onboarding.test.ts +12 -10
  120. package/src/middleware/auth.ts +63 -9
  121. package/src/middleware/onboarding.ts +1 -1
  122. package/src/middleware/secure-headers.ts +40 -0
  123. package/src/preset.css +45 -2
  124. package/src/routes/__tests__/compose.test.ts +17 -24
  125. package/src/routes/api/__tests__/collections.test.ts +109 -61
  126. package/src/routes/api/__tests__/nav-items.test.ts +46 -29
  127. package/src/routes/api/__tests__/posts.test.ts +132 -68
  128. package/src/routes/api/__tests__/search.test.ts +15 -2
  129. package/src/routes/api/__tests__/upload-multipart.test.ts +534 -0
  130. package/src/routes/api/collections.ts +51 -42
  131. package/src/routes/api/custom-urls.ts +80 -0
  132. package/src/routes/api/export.ts +31 -0
  133. package/src/routes/api/nav-items.ts +23 -19
  134. package/src/routes/api/posts.ts +43 -39
  135. package/src/routes/api/search.ts +3 -4
  136. package/src/routes/api/upload-multipart.ts +245 -0
  137. package/src/routes/api/upload.ts +85 -19
  138. package/src/routes/auth/__tests__/setup.test.ts +20 -60
  139. package/src/routes/auth/setup.tsx +26 -33
  140. package/src/routes/auth/signin.tsx +3 -7
  141. package/src/routes/compose.tsx +10 -55
  142. package/src/routes/dash/__tests__/settings-avatar.test.ts +1 -1
  143. package/src/routes/dash/custom-urls.tsx +414 -0
  144. package/src/routes/dash/settings.tsx +304 -232
  145. package/src/routes/feed/__tests__/rss.test.ts +27 -28
  146. package/src/routes/feed/rss.ts +6 -4
  147. package/src/routes/feed/sitemap.ts +2 -12
  148. package/src/routes/pages/__tests__/collections.test.ts +5 -6
  149. package/src/routes/pages/__tests__/featured.test.ts +41 -22
  150. package/src/routes/pages/archive.tsx +175 -39
  151. package/src/routes/pages/collection.tsx +22 -10
  152. package/src/routes/pages/collections.tsx +3 -3
  153. package/src/routes/pages/featured.tsx +28 -4
  154. package/src/routes/pages/home.tsx +16 -15
  155. package/src/routes/pages/latest.tsx +1 -11
  156. package/src/routes/pages/new.tsx +39 -0
  157. package/src/routes/pages/page.tsx +95 -49
  158. package/src/routes/pages/search.tsx +1 -1
  159. package/src/services/__tests__/api-token.test.ts +135 -0
  160. package/src/services/__tests__/collection.test.ts +275 -227
  161. package/src/services/__tests__/custom-url.test.ts +213 -0
  162. package/src/services/__tests__/media.test.ts +162 -22
  163. package/src/services/__tests__/navigation.test.ts +109 -68
  164. package/src/services/__tests__/post-timeline.test.ts +205 -32
  165. package/src/services/__tests__/post.test.ts +713 -234
  166. package/src/services/__tests__/search.test.ts +67 -10
  167. package/src/services/api-token.ts +166 -0
  168. package/src/services/auth.ts +17 -2
  169. package/src/services/collection.ts +397 -131
  170. package/src/services/custom-url.ts +188 -0
  171. package/src/services/export.ts +802 -0
  172. package/src/services/index.ts +26 -19
  173. package/src/services/media.ts +100 -22
  174. package/src/services/navigation.ts +158 -47
  175. package/src/services/path.ts +339 -0
  176. package/src/services/post.ts +687 -154
  177. package/src/services/search.ts +160 -75
  178. package/src/styles/components.css +58 -7
  179. package/src/styles/tokens.css +84 -6
  180. package/src/styles/ui.css +2964 -457
  181. package/src/types/bindings.ts +4 -1
  182. package/src/types/config.ts +12 -4
  183. package/src/types/constants.ts +15 -3
  184. package/src/types/entities.ts +74 -35
  185. package/src/types/operations.ts +11 -24
  186. package/src/types/props.ts +51 -16
  187. package/src/types/views.ts +45 -22
  188. package/src/ui/color-themes.ts +133 -23
  189. package/src/ui/compose/ComposeDialog.tsx +239 -17
  190. package/src/ui/compose/ComposePrompt.tsx +1 -1
  191. package/src/ui/dash/CrudPageHeader.tsx +1 -1
  192. package/src/ui/dash/ListItemRow.tsx +1 -1
  193. package/src/ui/dash/StatusBadge.tsx +3 -1
  194. package/src/ui/dash/appearance/AdvancedContent.tsx +22 -1
  195. package/src/ui/dash/appearance/ColorThemeContent.tsx +22 -2
  196. package/src/ui/dash/appearance/FontThemeContent.tsx +1 -1
  197. package/src/ui/dash/appearance/NavigationContent.tsx +5 -45
  198. package/src/ui/dash/index.ts +0 -3
  199. package/src/ui/dash/settings/AccountContent.tsx +3 -57
  200. package/src/ui/dash/settings/AccountMenuContent.tsx +147 -0
  201. package/src/ui/dash/settings/ApiTokensContent.tsx +232 -0
  202. package/src/ui/dash/settings/AvatarContent.tsx +8 -0
  203. package/src/ui/dash/settings/SessionsContent.tsx +159 -0
  204. package/src/ui/dash/settings/SettingsRootContent.tsx +45 -15
  205. package/src/ui/feed/LinkCard.tsx +89 -40
  206. package/src/ui/feed/NoteCard.tsx +39 -25
  207. package/src/ui/feed/PostStatusBadges.tsx +67 -0
  208. package/src/ui/feed/QuoteCard.tsx +38 -23
  209. package/src/ui/feed/ThreadPreview.tsx +90 -26
  210. package/src/ui/feed/TimelineFeed.tsx +3 -2
  211. package/src/ui/feed/TimelineItem.tsx +15 -6
  212. package/src/ui/feed/__tests__/thread-preview.test.ts +107 -0
  213. package/src/ui/feed/thread-preview-state.ts +61 -0
  214. package/src/ui/font-themes.ts +2 -2
  215. package/src/ui/layouts/BaseLayout.tsx +2 -2
  216. package/src/ui/layouts/SiteLayout.tsx +105 -92
  217. package/src/ui/pages/ArchivePage.tsx +923 -98
  218. package/src/ui/pages/ComposePage.tsx +54 -0
  219. package/src/ui/pages/PostPage.tsx +30 -45
  220. package/src/ui/pages/SearchPage.tsx +181 -37
  221. package/src/ui/shared/AdminBreadcrumb.tsx +29 -0
  222. package/src/ui/shared/CollectionsSidebar.tsx +47 -37
  223. package/src/ui/shared/MediaGallery.tsx +445 -149
  224. package/src/ui/shared/PostFooter.tsx +204 -0
  225. package/src/ui/shared/StarRating.tsx +27 -0
  226. package/src/ui/shared/__tests__/format-chars.test.ts +35 -0
  227. package/src/ui/shared/index.ts +0 -1
  228. package/dist/client/assets/url-8Dj-5CLW.js +0 -1
  229. package/src/client/media-upload.ts +0 -161
  230. package/src/client/page-slug-bridge.ts +0 -42
  231. package/src/db/migrations/0000_square_wallflower.sql +0 -118
  232. package/src/db/migrations/0001_add_search_fts.sql +0 -34
  233. package/src/db/migrations/0002_add_media_attachments.sql +0 -3
  234. package/src/db/migrations/0003_add_navigation_links.sql +0 -8
  235. package/src/db/migrations/0004_add_storage_provider.sql +0 -3
  236. package/src/db/migrations/0005_v2_schema_migration.sql +0 -268
  237. package/src/db/migrations/0006_rename_slug_to_path.sql +0 -5
  238. package/src/db/migrations/0007_post_collections_m2m.sql +0 -94
  239. package/src/db/migrations/0008_add_collection_dividers.sql +0 -8
  240. package/src/db/migrations/0009_drop_collection_show_divider.sql +0 -2
  241. package/src/db/migrations/0010_add_performance_indexes.sql +0 -16
  242. package/src/db/migrations/0011_add_path_registry.sql +0 -23
  243. package/src/db/migrations/0012_add_tiptap_columns.sql +0 -2
  244. package/src/db/migrations/0013_replace_featured_with_visibility.sql +0 -8
  245. package/src/db/migrations/meta/0003_snapshot.json +0 -821
  246. package/src/lib/__tests__/sqid.test.ts +0 -65
  247. package/src/lib/sqid.ts +0 -79
  248. package/src/routes/api/__tests__/pages.test.ts +0 -218
  249. package/src/routes/api/pages.ts +0 -73
  250. package/src/routes/dash/__tests__/pages.test.ts +0 -226
  251. package/src/routes/dash/index.tsx +0 -109
  252. package/src/routes/dash/media.tsx +0 -135
  253. package/src/routes/dash/pages.tsx +0 -245
  254. package/src/routes/dash/posts.tsx +0 -338
  255. package/src/routes/dash/redirects.tsx +0 -263
  256. package/src/routes/pages/post.tsx +0 -59
  257. package/src/services/__tests__/page.test.ts +0 -298
  258. package/src/services/__tests__/path-registry.test.ts +0 -165
  259. package/src/services/__tests__/redirect.test.ts +0 -159
  260. package/src/services/page.ts +0 -216
  261. package/src/services/path-registry.ts +0 -160
  262. package/src/services/redirect.ts +0 -97
  263. package/src/ui/dash/PageForm.tsx +0 -187
  264. package/src/ui/dash/PostList.tsx +0 -95
  265. package/src/ui/dash/media/MediaListContent.tsx +0 -206
  266. package/src/ui/dash/media/ViewMediaContent.tsx +0 -208
  267. package/src/ui/dash/pages/PagesContent.tsx +0 -75
  268. package/src/ui/dash/posts/PostForm.tsx +0 -260
  269. package/src/ui/layouts/DashLayout.tsx +0 -247
  270. package/src/ui/pages/SinglePage.tsx +0 -23
  271. package/src/ui/shared/ThreadView.tsx +0 -136
package/src/styles/ui.css CHANGED
@@ -90,7 +90,7 @@
90
90
  align-items: center;
91
91
  gap: 8px;
92
92
  font-size: 1.125rem;
93
- font-weight: 800;
93
+ font-weight: var(--fw-extrabold);
94
94
  font-family: var(--font-heading);
95
95
  color: var(--site-text-primary);
96
96
  text-decoration: none;
@@ -153,10 +153,19 @@
153
153
  background-color: var(--site-nav-hover-bg);
154
154
  }
155
155
 
156
+ .site-header-more-btn-active {
157
+ color: var(--site-text-primary);
158
+ }
159
+
156
160
  .site-header-more [data-popover] {
157
161
  min-width: 170px;
158
162
  }
159
163
 
164
+ .site-header-menuitem-active {
165
+ color: var(--site-text-primary);
166
+ font-weight: 500;
167
+ }
168
+
160
169
  /* --- Browse filter tabs ------------------------------------------------- */
161
170
 
162
171
  .site-browse-nav {
@@ -175,7 +184,7 @@
175
184
 
176
185
  .site-browse-link {
177
186
  font-size: var(--text-base);
178
- font-weight: 400;
187
+ font-weight: var(--fw-regular);
179
188
  color: var(--site-text-primary);
180
189
  text-decoration: none;
181
190
  opacity: 0.28;
@@ -188,7 +197,7 @@
188
197
 
189
198
  .site-browse-link-active {
190
199
  opacity: 1;
191
- font-weight: 500;
200
+ font-weight: var(--fw-medium);
192
201
  }
193
202
 
194
203
  /* --- Home header wrapper (compose-prompt + browse-nav) ------------------ */
@@ -261,285 +270,1524 @@
261
270
  * Timeline & Post Components
262
271
  * ========================================================================= */
263
272
 
264
- /* Post divider */
265
273
  .site-content hr.feed-divider {
266
274
  border: none;
267
- height: 10px;
268
- width: 32px;
275
+ width: 30px;
276
+ height: 9px;
269
277
  margin: 2.5rem auto;
270
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 45 13'%3E%3Cpath fill='%23ccc' transform='translate(0,0) rotate(90 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='%23ccc' transform='translate(16,0) rotate(100 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='%23ccc' transform='translate(32,0) rotate(80 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3C/svg%3E");
271
- background-repeat: no-repeat;
272
- background-position: center;
278
+ color: var(--site-feed-divider-color);
279
+ background-color: currentColor;
280
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 45 13'%3E%3Cpath fill='black' transform='translate(0,0) rotate(90 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(16,0) rotate(100 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(32,0) rotate(80 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3C/svg%3E");
281
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 45 13'%3E%3Cpath fill='black' transform='translate(0,0) rotate(90 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(16,0) rotate(100 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3Cpath fill='black' transform='translate(32,0) rotate(80 6 6.5)' d='M6.765.5.177 6.093l2.61 5.966 8.39-3.17L6.765.5Z'/%3E%3C/svg%3E");
282
+ -webkit-mask-repeat: no-repeat;
283
+ mask-repeat: no-repeat;
284
+ -webkit-mask-position: center;
285
+ mask-position: center;
286
+ -webkit-mask-size: contain;
287
+ mask-size: contain;
288
+ }
289
+
290
+ .feed-card {
291
+ position: relative;
292
+ padding: 1rem 1.1rem 0.95rem;
293
+ border: 1px solid var(--site-feed-card-border);
294
+ border-radius: 18px;
295
+ background:
296
+ linear-gradient(
297
+ 180deg,
298
+ var(--site-feed-card-tint, transparent),
299
+ transparent 58%
300
+ ),
301
+ var(--site-feed-card-bg);
302
+ box-shadow: 0 20px 40px -36px var(--site-feed-card-shadow);
303
+ transition:
304
+ border-color 0.18s ease,
305
+ box-shadow 0.18s ease,
306
+ background-color 0.18s ease;
307
+ }
308
+
309
+ .feed-card:hover {
310
+ border-color: color-mix(
311
+ in srgb,
312
+ var(--site-accent) 20%,
313
+ var(--site-divider)
314
+ );
315
+ box-shadow: 0 24px 48px -38px var(--site-feed-card-shadow);
316
+ }
317
+
318
+ .feed-card-link {
319
+ --site-feed-card-tint: transparent;
320
+ --feed-link-domain-size: 0.625rem;
321
+ --feed-link-title-size: 0.93rem;
322
+ --feed-link-title-leading: 1.22;
323
+ --feed-link-summary-size: 0.875rem;
324
+ --feed-link-summary-leading: 1.55;
325
+ --feed-link-summary-gap: 0.48rem;
326
+ background: color-mix(
327
+ in srgb,
328
+ var(--site-page-bg) 88%,
329
+ var(--site-nav-hover-bg) 12%
330
+ );
331
+ border-color: color-mix(
332
+ in srgb,
333
+ var(--site-divider) 82%,
334
+ var(--site-nav-hover-bg)
335
+ );
336
+ border-radius: 14px;
337
+ box-shadow:
338
+ 0 14px 28px -40px var(--site-feed-card-shadow),
339
+ inset 0 1px 0 color-mix(in srgb, var(--site-page-bg) 78%, transparent);
273
340
  }
274
341
 
275
- /* Thread reply container with vertical connector line */
276
- .feed-replies {
277
- position: relative;
278
- margin-left: 16px;
279
- padding-left: 16px;
280
- margin-top: 8px;
342
+ .feed-card-link:hover {
343
+ border-color: color-mix(
344
+ in srgb,
345
+ var(--site-divider) 70%,
346
+ var(--site-nav-hover-bg) 30%
347
+ );
281
348
  }
282
349
 
283
- .feed-replies::before {
284
- content: "";
285
- position: absolute;
286
- left: 0;
287
- top: 0;
288
- bottom: 0;
289
- width: 2px;
290
- background-color: var(--site-threadline);
350
+ .feed-link-domain {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ gap: 0.25rem;
354
+ max-width: 100%;
355
+ margin-bottom: 0.65rem;
356
+ padding: 0;
357
+ border-radius: 0;
358
+ background: none;
359
+ color: var(--site-text-secondary);
360
+ font-size: 0.6875rem;
361
+ font-weight: var(--fw-medium);
362
+ line-height: 1;
363
+ letter-spacing: 0.04em;
364
+ text-transform: uppercase;
365
+ text-decoration: none;
366
+ transition: color 0.18s ease;
291
367
  }
292
368
 
293
- /* Individual reply in thread */
294
- .feed-reply {
295
- padding: 12px 0;
369
+ .feed-link-domain:hover {
370
+ color: var(--site-text-primary);
296
371
  }
297
372
 
298
- .feed-reply + .feed-reply {
299
- border-top: var(--card-border-width) solid var(--site-divider);
373
+ .feed-link-domain-icon {
374
+ width: 0.72rem;
375
+ height: 0.72rem;
376
+ flex-shrink: 0;
300
377
  }
301
378
 
302
- /* Compact text for thread replies */
303
- .feed-compact {
304
- @apply text-sm;
379
+ .feed-link-title {
380
+ font-size: 0.98rem;
381
+ line-height: 1.26;
382
+ letter-spacing: -0.015em;
305
383
  }
306
384
 
307
- /* Quote block styling */
308
- .feed-quote {
309
- padding-left: 12px;
310
- border-left: 2px solid var(--site-text-secondary);
385
+ .feed-link-title-link {
386
+ text-decoration: none;
311
387
  }
312
388
 
313
- /* =========================================================================
314
- * Compose Prompt Bar ("What's new?" at top of content)
315
- * ========================================================================= */
389
+ .feed-link-title-link:hover {
390
+ text-decoration: underline;
391
+ text-underline-offset: 3px;
392
+ }
316
393
 
317
- .compose-prompt {
318
- display: flex;
319
- align-items: center;
320
- gap: 12px;
321
- padding: 16px 0;
322
- margin: 10px 0;
323
- border-bottom: 0.5px solid oklch(from var(--site-divider) l c h / 0.5);
324
- transition: border-color 0.15s;
394
+ .feed-link-summary {
395
+ margin-top: 0.75rem;
325
396
  }
326
397
 
327
- .compose-prompt:hover {
328
- border-bottom-color: var(--site-divider);
398
+ .feed-card-link .feed-link-domain {
399
+ margin-bottom: 0.55rem;
400
+ font-size: var(--feed-link-domain-size);
329
401
  }
330
402
 
331
- .compose-prompt-trigger {
332
- display: flex;
333
- align-items: center;
334
- gap: 10px;
335
- flex: 1;
336
- min-width: 0;
337
- padding: 0;
338
- border: none;
339
- outline: none;
340
- background: none;
341
- cursor: pointer;
342
- text-align: left;
343
- color: var(--site-text-primary);
344
- opacity: 0.5;
345
- transition: opacity 0.15s;
403
+ .feed-card-link .feed-link-title {
404
+ margin-bottom: 0;
405
+ font-size: var(--feed-link-title-size);
406
+ line-height: var(--feed-link-title-leading);
346
407
  }
347
408
 
348
- .compose-prompt-trigger:hover {
349
- opacity: 0.7;
409
+ .feed-card-link .feed-link-summary.prose {
410
+ max-width: 35rem;
411
+ margin-top: 0.55rem;
412
+ font-size: var(--feed-link-summary-size);
413
+ line-height: var(--feed-link-summary-leading);
350
414
  }
351
415
 
352
- .compose-prompt-avatar {
353
- display: flex;
354
- align-items: center;
355
- justify-content: center;
356
- flex-shrink: 0;
416
+ .feed-card-link .feed-link-summary.prose > :first-child {
417
+ margin-top: 0;
357
418
  }
358
419
 
359
- .compose-prompt-text {
360
- font-size: var(--text-base);
420
+ .feed-card-link .feed-link-summary.prose > :last-child {
421
+ margin-bottom: 0;
361
422
  }
362
423
 
363
- .compose-prompt-post-btn {
364
- flex-shrink: 0;
365
- padding: 6px 16px;
366
- border-radius: 10px;
367
- border: 1px solid var(--site-column-outline);
368
- background: none;
369
- color: var(--site-text-secondary);
370
- font-size: 0.875rem;
371
- font-weight: 600;
372
- cursor: pointer;
373
- transition:
374
- border-color 0.15s,
375
- color 0.15s;
424
+ article.feed-card-link .feed-link-summary.prose p,
425
+ article.feed-card-link .feed-link-summary.prose ul,
426
+ article.feed-card-link .feed-link-summary.prose ol,
427
+ article.feed-card-link .feed-link-summary.prose blockquote,
428
+ article.feed-card-link .feed-link-summary.prose pre {
429
+ font-size: var(--feed-link-summary-size);
430
+ line-height: var(--feed-link-summary-leading);
376
431
  }
377
432
 
378
- .compose-prompt-post-btn:hover {
379
- color: var(--site-text-primary);
380
- border-color: var(--site-text-secondary);
433
+ .feed-card-link .feed-link-summary.prose p {
434
+ margin: 0;
381
435
  }
382
436
 
383
- /* =========================================================================
384
- * Compose Dialog
385
- * ========================================================================= */
437
+ .feed-card-link .feed-link-summary.prose p + p,
438
+ .feed-card-link .feed-link-summary.prose ul,
439
+ .feed-card-link .feed-link-summary.prose ol,
440
+ .feed-card-link .feed-link-summary.prose blockquote,
441
+ .feed-card-link .feed-link-summary.prose pre {
442
+ margin-top: var(--feed-link-summary-gap);
443
+ }
386
444
 
387
- @keyframes compose-fade-up {
388
- from {
389
- opacity: 0;
390
- transform: translateY(6px);
391
- }
392
- to {
393
- opacity: 1;
394
- transform: translateY(0);
395
- }
445
+ .feed-card-link .feed-link-summary.prose ul,
446
+ .feed-card-link .feed-link-summary.prose ol {
447
+ padding-left: 1.15rem;
396
448
  }
397
449
 
398
- @keyframes compose-modal-in {
399
- from {
400
- opacity: 0;
401
- transform: scale(0.97) translateY(8px);
402
- }
403
- to {
404
- opacity: 1;
405
- transform: scale(1) translateY(0);
406
- }
450
+ .feed-card-link .feed-link-summary.prose li {
451
+ margin: 0.18rem 0;
407
452
  }
408
453
 
409
- /* --- Dialog shell ------------------------------------------------------- */
454
+ .feed-card-link .feed-link-summary.prose blockquote {
455
+ padding-left: 0.85rem;
456
+ border-left: 2px solid
457
+ color-mix(in srgb, var(--site-divider) 75%, transparent);
458
+ color: var(--site-text-secondary);
459
+ }
410
460
 
411
- /* Prevent body scroll when any compose dialog is open */
412
- body:has(.compose-dialog[open]),
413
- body:has(.compose-fullscreen-dialog[open]) {
414
- overflow: hidden;
461
+ .feed-card-link .feed-link-summary.prose :is(h1, h2, h3, h4) {
462
+ margin: 0.7rem 0 0.2rem;
463
+ font-size: 0.92em;
464
+ line-height: 1.35;
415
465
  }
416
466
 
417
- .compose-dialog {
418
- --compose-margin-top: max(80px, 10vh);
467
+ /* Thread group: timeline layout — vertical line with dot markers */
468
+ .thread-group {
469
+ position: relative;
470
+ padding-left: 24px;
471
+ }
419
472
 
420
- padding: 0;
421
- outline: none;
422
- border: none;
423
- border-radius: 10px;
424
- width: calc(100% - 20px);
425
- max-width: calc(var(--site-width) - var(--site-padding) * 2 - 20px);
426
- max-height: calc(100dvh - var(--compose-margin-top) - 20px);
427
- margin: var(--compose-margin-top) auto auto;
428
- background-color: var(--site-elevated-bg);
429
- color: var(--site-text-primary);
430
- box-shadow:
431
- 0 8px 40px rgba(0, 0, 0, 0.08),
432
- 0 1px 3px rgba(0, 0, 0, 0.04);
433
- border: 1px solid var(--site-column-outline);
434
- overflow: visible;
473
+ /* Continuous vertical line through dot centers */
474
+ .thread-group::before {
475
+ content: "";
476
+ position: absolute;
477
+ left: 5px;
478
+ top: 0;
479
+ bottom: 0;
480
+ width: 2px;
481
+ background-color: var(--site-threadline);
435
482
  }
436
483
 
437
- .compose-dialog[open] {
438
- animation: compose-modal-in 0.32s cubic-bezier(0.22, 1, 0.36, 1) both;
484
+ /* Individual post in a thread group */
485
+ .thread-item {
486
+ position: relative;
487
+ padding: 8px 0;
439
488
  }
440
489
 
441
- .compose-dialog::backdrop {
442
- background-color: rgba(0, 0, 0, 0.3);
490
+ .thread-item:first-child {
491
+ padding-top: 0;
443
492
  }
444
493
 
445
- .compose-dialog-inner {
446
- display: flex;
447
- flex-direction: column;
448
- max-height: calc(100dvh - var(--compose-margin-top) - 20px);
449
- position: relative;
450
- border-radius: inherit;
451
- overflow: hidden;
494
+ .thread-item:last-child {
495
+ padding-bottom: 0;
452
496
  }
453
497
 
454
- .compose-dialog-inner > jant-compose-editor {
455
- flex: 1;
456
- min-height: 0;
457
- display: flex;
458
- flex-direction: column;
459
- overflow: hidden;
460
- position: relative;
498
+ /* Dot marker at each post position */
499
+ .thread-item::before {
500
+ content: "";
501
+ position: absolute;
502
+ left: -24px;
503
+ top: 50%;
504
+ transform: translateY(-50%);
505
+ width: 12px;
506
+ height: 12px;
507
+ border-radius: 50%;
508
+ background-color: var(--site-threadline);
509
+ z-index: 1;
461
510
  }
462
511
 
463
- /* --- Header ------------------------------------------------------------- */
512
+ .thread-group-preview,
513
+ .thread-group-detail {
514
+ padding-left: 30px;
515
+ }
464
516
 
465
- .compose-dialog-header {
466
- display: flex;
467
- align-items: center;
468
- justify-content: space-between;
469
- padding: 10px 12px;
470
- position: relative;
517
+ .thread-group-preview::before,
518
+ .thread-group-detail::before {
519
+ left: 10px;
520
+ width: 1px;
521
+ background: linear-gradient(
522
+ 180deg,
523
+ transparent 0,
524
+ color-mix(in srgb, var(--site-threadline) 85%, transparent) 8%,
525
+ color-mix(in srgb, var(--site-threadline) 55%, transparent) 100%
526
+ );
471
527
  }
472
528
 
473
- @media (min-width: 700px) {
474
- .compose-dialog-header {
475
- padding: 12px 16px;
476
- }
529
+ .thread-group-preview .thread-item,
530
+ .thread-group-detail .thread-item {
531
+ padding: var(--site-thread-item-spacing) 0;
477
532
  }
478
533
 
479
- .compose-dialog-cancel {
480
- padding: 4px 8px;
481
- border: none;
482
- background: none;
483
- border-radius: 6px;
484
- color: var(--site-text-secondary);
485
- font-size: var(--text-sm);
486
- cursor: pointer;
487
- transition: color 0.15s ease-out;
488
- flex-shrink: 0;
489
- min-width: 60px;
490
- text-align: left;
534
+ .thread-group-preview .thread-item::before,
535
+ .thread-group-detail .thread-item::before {
536
+ left: -20px;
537
+ width: 10px;
538
+ height: 10px;
539
+ border: 2px solid var(--site-page-bg);
540
+ background-color: var(--site-threadline);
541
+ box-shadow: 0 0 0 2px var(--site-thread-dot-ring);
491
542
  }
492
543
 
493
- .compose-dialog-cancel:hover {
494
- color: var(--site-text-primary);
544
+ .thread-context-shell {
545
+ position: relative;
546
+ display: grid;
547
+ gap: 0.7rem;
548
+ padding-bottom: 0.35rem;
495
549
  }
496
550
 
497
- .compose-dialog-header-center {
498
- position: absolute;
499
- left: 50%;
500
- transform: translateX(-50%);
551
+ .thread-item-gap {
552
+ padding-top: 0.15rem;
553
+ padding-bottom: 0.35rem;
501
554
  }
502
555
 
503
- .compose-dialog-header-btn {
504
- display: flex;
556
+ .thread-gap-link {
557
+ display: inline-flex;
505
558
  align-items: center;
506
- justify-content: center;
507
- width: 32px;
508
- height: 32px;
509
- border-radius: 8px;
510
- border: none;
511
- background: none;
559
+ gap: 0.35rem;
560
+ padding: 0.38rem 0.78rem;
561
+ border: 1px dashed var(--site-thread-context-border);
562
+ border-radius: 999px;
563
+ background: var(--site-thread-gap-bg);
512
564
  color: var(--site-text-secondary);
513
- cursor: pointer;
565
+ font-size: 0.78rem;
566
+ line-height: 1.15;
567
+ text-decoration: none;
514
568
  transition:
515
- background-color 0.15s ease-out,
516
- color 0.15s ease-out;
569
+ border-color 0.18s ease,
570
+ color 0.18s ease,
571
+ background-color 0.18s ease;
517
572
  }
518
573
 
519
- .compose-dialog-header-btn:hover {
574
+ .thread-gap-link:hover {
575
+ border-color: color-mix(
576
+ in srgb,
577
+ var(--site-accent) 22%,
578
+ var(--site-divider)
579
+ );
520
580
  color: var(--site-text-primary);
521
- background-color: var(--site-nav-hover-bg);
522
581
  }
523
582
 
524
- .compose-dialog-header-btn:disabled {
525
- opacity: 0.3;
526
- cursor: not-allowed;
583
+ .thread-item-hero {
584
+ padding-top: 0.95rem;
527
585
  }
528
586
 
529
- /* --- Format switcher with animated pill --------------------------------- */
587
+ .thread-group-preview .thread-item-hero::before {
588
+ left: -22px;
589
+ width: 14px;
590
+ height: 14px;
591
+ border: 3px solid var(--site-page-bg);
592
+ background-color: var(--site-accent);
593
+ box-shadow: 0 0 0 2px var(--site-thread-dot-ring);
594
+ }
530
595
 
531
- .compose-segmented {
532
- display: inline-flex;
533
- background-color: var(--site-nav-hover-bg);
534
- border-radius: 10px;
535
- padding: 3px;
596
+ /* Compact text for thread replies */
597
+ .feed-compact {
598
+ @apply text-sm;
599
+ }
600
+
601
+ /* Faded thread ancestor context */
602
+ .thread-context-collapsed {
536
603
  position: relative;
604
+ max-height: var(--site-thread-context-max-height);
605
+ overflow: hidden;
606
+ transition: max-height 0.3s ease;
537
607
  }
538
608
 
539
- .compose-format-pill {
540
- position: absolute;
541
- top: 3px;
542
- left: 3px;
609
+ .thread-context-collapsed.expanded {
610
+ max-height: none;
611
+ overflow: visible;
612
+ }
613
+
614
+ .thread-context-fade {
615
+ display: none;
616
+ position: absolute;
617
+ bottom: 0;
618
+ left: 0;
619
+ right: 0;
620
+ height: 52px;
621
+ background: linear-gradient(
622
+ transparent,
623
+ color-mix(in srgb, var(--site-page-bg) 76%, var(--site-feed-card-bg))
624
+ );
625
+ pointer-events: none;
626
+ }
627
+
628
+ .thread-context-faded .thread-context-fade {
629
+ display: block;
630
+ }
631
+
632
+ .thread-context-collapsed.expanded .thread-context-fade {
633
+ display: none;
634
+ }
635
+
636
+ .thread-context-toggle {
637
+ display: inline-flex;
638
+ align-items: center;
639
+ padding: 0.35rem 0.78rem;
640
+ margin-bottom: 4px;
641
+ cursor: pointer;
642
+ background: var(--site-thread-gap-bg);
643
+ border: 1px solid var(--site-thread-context-border);
644
+ border-radius: 999px;
645
+ line-height: 1.1;
646
+ transition:
647
+ border-color 0.18s ease,
648
+ color 0.18s ease,
649
+ background-color 0.18s ease;
650
+ }
651
+
652
+ .thread-context-toggle.hidden {
653
+ display: none;
654
+ }
655
+
656
+ .thread-context-toggle:hover {
657
+ border-color: color-mix(
658
+ in srgb,
659
+ var(--site-accent) 22%,
660
+ var(--site-divider)
661
+ );
662
+ }
663
+
664
+ /* Thread detail: current post anchor + dot-only highlight */
665
+ .thread-detail-item {
666
+ scroll-margin-top: 80px;
667
+ }
668
+
669
+ .thread-group-detail .thread-item-current::before {
670
+ background-color: var(--site-accent);
671
+ box-shadow:
672
+ 0 0 0 2px var(--site-page-bg),
673
+ 0 0 0 4px color-mix(in srgb, var(--site-accent) 18%, var(--site-page-bg));
674
+ }
675
+
676
+ /* Quote block styling */
677
+ .feed-quote {
678
+ margin: 0;
679
+ padding-left: 12px;
680
+ border-left: 2px solid var(--site-text-secondary);
681
+ }
682
+
683
+ .feed-quote-post {
684
+ position: relative;
685
+ padding: 0.45rem 0 0.35rem;
686
+ }
687
+
688
+ .feed-quote-post .post-status-badges {
689
+ margin-bottom: 0.8rem;
690
+ }
691
+
692
+ .feed-quote-card {
693
+ padding-left: 0;
694
+ border-left: none;
695
+ }
696
+
697
+ .feed-quote-card::before {
698
+ content: none;
699
+ }
700
+
701
+ .feed-quote-content {
702
+ position: relative;
703
+ padding-left: 0;
704
+ font-family: var(--font-serif);
705
+ color: var(--site-text-primary);
706
+ font-size: clamp(1.3rem, 1.2rem + 0.42vw, 1.52rem);
707
+ line-height: 1.36;
708
+ letter-spacing: -0.02em;
709
+ text-wrap: pretty;
710
+ }
711
+
712
+ .feed-quote-post .feed-quote {
713
+ padding-left: 0;
714
+ border-left: none;
715
+ }
716
+
717
+ .feed-quote-post .feed-quote-card {
718
+ position: relative;
719
+ padding-top: 0.85rem;
720
+ }
721
+
722
+ .feed-quote-post .feed-quote-card::after {
723
+ content: "\201C";
724
+ position: absolute;
725
+ top: -0.16em;
726
+ left: -0.04em;
727
+ color: color-mix(in srgb, var(--site-accent) 14%, var(--site-divider));
728
+ font-family: var(--font-serif);
729
+ font-size: clamp(2.9rem, 2.7rem + 0.9vw, 3.8rem);
730
+ line-height: 1;
731
+ pointer-events: none;
732
+ opacity: 0.95;
733
+ }
734
+
735
+ .feed-quote-attribution {
736
+ display: flex;
737
+ align-items: center;
738
+ gap: 0.45rem;
739
+ flex-wrap: wrap;
740
+ margin-top: 0.95rem;
741
+ color: var(--site-text-secondary);
742
+ font-size: 0.68rem;
743
+ letter-spacing: 0.08em;
744
+ line-height: 1.4;
745
+ text-transform: uppercase;
746
+ }
747
+
748
+ .feed-quote-attribution::before {
749
+ content: "";
750
+ width: 0.9rem;
751
+ height: 1px;
752
+ background: color-mix(in srgb, var(--site-divider) 86%, transparent);
753
+ }
754
+
755
+ .feed-quote-source {
756
+ color: inherit;
757
+ text-decoration: underline;
758
+ text-decoration-color: color-mix(
759
+ in srgb,
760
+ var(--site-text-secondary) 55%,
761
+ transparent
762
+ );
763
+ text-underline-offset: 3px;
764
+ }
765
+
766
+ .feed-quote-source:hover {
767
+ color: var(--site-text-primary);
768
+ text-decoration-color: currentColor;
769
+ }
770
+
771
+ .feed-quote-commentary {
772
+ position: relative;
773
+ max-width: 34rem;
774
+ margin-top: 1.1rem;
775
+ padding-top: 0.95rem;
776
+ color: color-mix(
777
+ in srgb,
778
+ var(--site-text-secondary) 84%,
779
+ var(--site-text-primary)
780
+ );
781
+ text-wrap: pretty;
782
+ }
783
+
784
+ .feed-quote-commentary::before {
785
+ content: "";
786
+ position: absolute;
787
+ left: 0;
788
+ right: 0;
789
+ top: 0;
790
+ height: 1px;
791
+ background: linear-gradient(
792
+ 90deg,
793
+ transparent 0%,
794
+ color-mix(in srgb, var(--site-divider) 48%, transparent) 16%,
795
+ color-mix(in srgb, var(--site-divider) 78%, transparent) 50%,
796
+ color-mix(in srgb, var(--site-divider) 48%, transparent) 84%,
797
+ transparent 100%
798
+ );
799
+ }
800
+
801
+ .feed-quote-post .feed-quote-commentary {
802
+ font-size: 0.94rem;
803
+ line-height: 1.68;
804
+ }
805
+
806
+ .feed-quote-commentary.prose > :first-child {
807
+ margin-top: 0;
808
+ }
809
+
810
+ .feed-quote-commentary.prose > :last-child {
811
+ margin-bottom: 0;
812
+ }
813
+
814
+ .feed-quote-commentary.prose p {
815
+ margin: 0;
816
+ }
817
+
818
+ .feed-quote-commentary.prose p + p,
819
+ .feed-quote-commentary.prose ul,
820
+ .feed-quote-commentary.prose ol,
821
+ .feed-quote-commentary.prose blockquote,
822
+ .feed-quote-commentary.prose pre {
823
+ margin-top: 0.55rem;
824
+ }
825
+
826
+ .feed-quote-commentary.prose :is(h1, h2, h3, h4) {
827
+ margin-top: 0.85rem;
828
+ margin-bottom: 0.2rem;
829
+ font-size: 0.92em;
830
+ line-height: 1.4;
831
+ }
832
+
833
+ .feed-quote-post [data-post-meta] {
834
+ margin-top: 0.9rem;
835
+ opacity: 0.72;
836
+ }
837
+
838
+ .feed-quote-post [data-post-meta] .post-footer-meta,
839
+ .feed-quote-post [data-post-meta] a,
840
+ .feed-quote-post [data-post-meta] time {
841
+ color: var(--site-text-secondary);
842
+ }
843
+
844
+ .feed-quote-post [data-post-meta] .post-menu-actions {
845
+ opacity: 0.65;
846
+ }
847
+
848
+ @media (max-width: 640px) {
849
+ .feed-quote-content {
850
+ font-size: clamp(1.24rem, 1.16rem + 0.7vw, 1.46rem);
851
+ line-height: 1.42;
852
+ }
853
+
854
+ .feed-quote-post .feed-quote-card::after {
855
+ left: -0.03em;
856
+ font-size: clamp(2.45rem, 2.28rem + 0.8vw, 3.05rem);
857
+ }
858
+ }
859
+
860
+ /* =========================================================================
861
+ * Post Menu (More button + dropdown)
862
+ * ========================================================================= */
863
+
864
+ .post-menu-target {
865
+ position: relative;
866
+ }
867
+
868
+ /* --- Post status badges (pinned / featured) ----------------------------- */
869
+ /* Visibility driven by parent article's data attributes so the post menu
870
+ can toggle badges instantly without a page reload. */
871
+
872
+ .post-status-badges {
873
+ display: none;
874
+ align-items: center;
875
+ gap: 6px;
876
+ margin-bottom: 4px;
877
+ font-size: 11px;
878
+ font-weight: 500;
879
+ letter-spacing: 0.05em;
880
+ text-transform: uppercase;
881
+ color: var(--site-text-placeholder);
882
+ }
883
+
884
+ /* Show the container when at least one status is active */
885
+ article[data-post-pinned] .post-status-badges,
886
+ article[data-post-featured] .post-status-badges,
887
+ article[data-post-visibility="private"] .post-status-badges {
888
+ display: flex;
889
+ }
890
+
891
+ .post-status-badge {
892
+ display: none;
893
+ align-items: center;
894
+ gap: 4px;
895
+ }
896
+
897
+ article[data-post-pinned] .post-status-pinned {
898
+ display: inline-flex;
899
+ }
900
+
901
+ article[data-post-featured] .post-status-featured {
902
+ display: inline-flex;
903
+ }
904
+
905
+ article[data-post-visibility="private"] .post-status-private {
906
+ display: inline-flex;
907
+ }
908
+
909
+ .post-status-badge svg {
910
+ width: 12px;
911
+ height: 12px;
912
+ flex-shrink: 0;
913
+ }
914
+
915
+ /* Dot separator — only visible when pinned AND (featured or private) */
916
+ .post-status-separator {
917
+ display: none;
918
+ user-select: none;
919
+ }
920
+
921
+ article[data-post-pinned][data-post-featured] .post-status-separator {
922
+ display: inline;
923
+ }
924
+
925
+ article[data-post-pinned][data-post-visibility="private"]
926
+ .post-status-separator {
927
+ display: inline;
928
+ }
929
+
930
+ .post-menu-footer {
931
+ display: flex;
932
+ justify-content: space-between;
933
+ align-items: center;
934
+ margin-top: 4px;
935
+ }
936
+
937
+ .post-footer-detail {
938
+ margin-top: 24px;
939
+ padding-top: 16px;
940
+ border-top: 1px solid var(--site-divider);
941
+ font-size: 14px;
942
+ color: var(--site-text-secondary);
943
+ }
944
+
945
+ .post-footer-meta {
946
+ display: flex;
947
+ align-items: center;
948
+ gap: 4px;
949
+ flex-wrap: wrap;
950
+ min-width: 0;
951
+ }
952
+
953
+ .post-footer-external-link {
954
+ display: inline-flex;
955
+ align-items: center;
956
+ justify-content: center;
957
+ width: 0.9rem;
958
+ height: 0.9rem;
959
+ color: var(--site-text-secondary);
960
+ text-decoration: none;
961
+ transition: color 0.18s ease;
962
+ }
963
+
964
+ .post-footer-external-link:hover {
965
+ color: var(--site-text-primary);
966
+ }
967
+
968
+ .post-footer-external-link svg {
969
+ width: 0.82rem;
970
+ height: 0.82rem;
971
+ }
972
+
973
+ .post-collection-tags {
974
+ display: inline-flex;
975
+ align-items: center;
976
+ gap: 4px;
977
+ font-size: 12px;
978
+ position: relative;
979
+ }
980
+
981
+ .post-footer-detail .post-collection-tags {
982
+ font-size: 14px;
983
+ }
984
+
985
+ .post-collection-sep {
986
+ color: var(--site-text-secondary);
987
+ user-select: none;
988
+ }
989
+
990
+ .post-collection-icon {
991
+ display: inline-flex;
992
+ align-items: center;
993
+ vertical-align: middle;
994
+ }
995
+
996
+ .post-collection-tag {
997
+ display: inline-flex;
998
+ align-items: center;
999
+ gap: 3px;
1000
+ color: var(--site-text-secondary);
1001
+ text-decoration: none;
1002
+ }
1003
+
1004
+ .post-collection-tag:hover {
1005
+ color: var(--site-text-primary);
1006
+ }
1007
+
1008
+ .post-collection-more-wrap {
1009
+ position: relative;
1010
+ }
1011
+
1012
+ .post-collection-more {
1013
+ background: none;
1014
+ border: none;
1015
+ padding: 0;
1016
+ font: inherit;
1017
+ font-size: inherit;
1018
+ color: var(--site-text-secondary);
1019
+ text-decoration: underline dotted;
1020
+ text-underline-offset: 2px;
1021
+ cursor: pointer;
1022
+ }
1023
+
1024
+ .post-collection-more:hover {
1025
+ color: var(--site-text-primary);
1026
+ }
1027
+
1028
+ .post-collection-popover {
1029
+ display: none;
1030
+ position: absolute;
1031
+ top: calc(100% + 4px);
1032
+ left: 0;
1033
+ z-index: 50;
1034
+ flex-direction: column;
1035
+ min-width: 160px;
1036
+ padding: 4px;
1037
+ border-radius: 6px;
1038
+ background: var(--site-elevated-bg);
1039
+ border: 1px solid var(--site-divider);
1040
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
1041
+ }
1042
+
1043
+ .post-collection-popover.open {
1044
+ display: flex;
1045
+ }
1046
+
1047
+ .post-collection-popover-item {
1048
+ display: flex;
1049
+ align-items: center;
1050
+ gap: 6px;
1051
+ padding: 6px 8px;
1052
+ border-radius: 4px;
1053
+ font-size: 12px;
1054
+ color: var(--site-text-secondary);
1055
+ text-decoration: none;
1056
+ }
1057
+
1058
+ .post-collection-popover-item:hover {
1059
+ background: var(--site-nav-hover-bg);
1060
+ color: var(--site-text-primary);
1061
+ }
1062
+
1063
+ /* --- Post star rating (read-only) -------------------------------------- */
1064
+
1065
+ .post-rating {
1066
+ display: flex;
1067
+ gap: 1px;
1068
+ margin-top: 6px;
1069
+ font-size: 14px;
1070
+ line-height: 1;
1071
+ }
1072
+
1073
+ .post-star-filled {
1074
+ color: oklch(0.75 0.15 70);
1075
+ }
1076
+
1077
+ .post-star-empty {
1078
+ color: var(--site-divider);
1079
+ }
1080
+
1081
+ .post-menu-trigger {
1082
+ display: none;
1083
+ align-items: center;
1084
+ justify-content: center;
1085
+ width: 32px;
1086
+ height: 32px;
1087
+ padding: 0;
1088
+ border: none;
1089
+ border-radius: 999px;
1090
+ background: transparent;
1091
+ color: var(--site-text-secondary);
1092
+ cursor: pointer;
1093
+ transition:
1094
+ background-color 0.12s,
1095
+ color 0.12s;
1096
+ flex-shrink: 0;
1097
+ }
1098
+
1099
+ .post-menu-trigger:hover {
1100
+ background-color: var(--site-nav-hover-bg);
1101
+ color: var(--site-text-primary);
1102
+ }
1103
+
1104
+ /* Always visible for authenticated users */
1105
+ body[data-authenticated] .post-menu-trigger {
1106
+ display: flex;
1107
+ }
1108
+
1109
+ .post-menu-actions {
1110
+ display: flex;
1111
+ align-items: center;
1112
+ gap: 0;
1113
+ }
1114
+
1115
+ .reply-trigger {
1116
+ display: none;
1117
+ align-items: center;
1118
+ justify-content: center;
1119
+ width: 24px;
1120
+ height: 24px;
1121
+ padding: 0;
1122
+ border: none;
1123
+ border-radius: 999px;
1124
+ background: transparent;
1125
+ color: var(--site-text-secondary);
1126
+ cursor: pointer;
1127
+ transition:
1128
+ background-color 0.12s,
1129
+ color 0.12s;
1130
+ flex-shrink: 0;
1131
+ opacity: 0.6;
1132
+ }
1133
+
1134
+ .reply-trigger:hover {
1135
+ background-color: var(--site-nav-hover-bg);
1136
+ color: var(--site-text-primary);
1137
+ opacity: 1;
1138
+ }
1139
+
1140
+ body[data-authenticated] .reply-trigger {
1141
+ display: flex;
1142
+ }
1143
+
1144
+ .post-menu-backdrop {
1145
+ position: fixed;
1146
+ inset: 0;
1147
+ z-index: 99;
1148
+ }
1149
+
1150
+ /* --- Collection Picker (replaces menu when "Add to collection" is clicked) --- */
1151
+
1152
+ .post-menu-collection-picker {
1153
+ min-width: 220px;
1154
+ max-width: 280px;
1155
+ }
1156
+
1157
+ .post-menu-picker-header {
1158
+ display: flex;
1159
+ align-items: center;
1160
+ gap: 6px;
1161
+ padding: 10px 12px 6px;
1162
+ font-size: var(--text-sm);
1163
+ font-weight: var(--fw-medium);
1164
+ color: var(--site-text-primary);
1165
+ }
1166
+
1167
+ .post-menu-picker-search {
1168
+ display: flex;
1169
+ align-items: center;
1170
+ gap: 6px;
1171
+ margin: 0 8px 4px;
1172
+ padding: 6px 8px;
1173
+ border-radius: 6px;
1174
+ background-color: var(--site-nav-hover-bg);
1175
+ color: var(--site-text-secondary);
1176
+ }
1177
+
1178
+ .post-menu-picker-search input {
1179
+ flex: 1;
1180
+ border: none;
1181
+ background: transparent;
1182
+ outline: none;
1183
+ font-size: var(--text-sm);
1184
+ color: var(--site-text-primary);
1185
+ min-width: 0;
1186
+ }
1187
+
1188
+ .post-menu-picker-search input::placeholder {
1189
+ color: var(--site-text-secondary);
1190
+ }
1191
+
1192
+ .post-menu-picker-list {
1193
+ max-height: 240px;
1194
+ overflow-y: auto;
1195
+ padding: 2px 0;
1196
+ }
1197
+
1198
+ .post-menu-picker-option {
1199
+ display: flex;
1200
+ align-items: center;
1201
+ gap: 8px;
1202
+ padding: 7px 12px;
1203
+ cursor: pointer;
1204
+ font-size: var(--text-sm);
1205
+ color: var(--site-text-primary);
1206
+ transition: background-color 0.12s ease;
1207
+ }
1208
+
1209
+ .post-menu-picker-option:hover {
1210
+ background-color: var(--site-nav-hover-bg);
1211
+ }
1212
+
1213
+ .post-menu-picker-icon {
1214
+ display: inline-flex;
1215
+ align-items: center;
1216
+ justify-content: center;
1217
+ width: 16px;
1218
+ height: 16px;
1219
+ flex-shrink: 0;
1220
+ }
1221
+
1222
+ .post-menu-picker-title {
1223
+ flex: 1;
1224
+ min-width: 0;
1225
+ overflow: hidden;
1226
+ text-overflow: ellipsis;
1227
+ white-space: nowrap;
1228
+ }
1229
+
1230
+ .post-menu-picker-check {
1231
+ flex-shrink: 0;
1232
+ color: var(--site-text-primary);
1233
+ }
1234
+
1235
+ .post-menu-picker-empty {
1236
+ padding: 12px;
1237
+ text-align: center;
1238
+ font-size: var(--text-sm);
1239
+ color: var(--site-text-secondary);
1240
+ }
1241
+
1242
+ .post-menu-picker-add {
1243
+ display: flex;
1244
+ align-items: center;
1245
+ gap: 8px;
1246
+ padding: 8px 12px;
1247
+ border-top: 1px solid var(--site-border-light);
1248
+ cursor: pointer;
1249
+ font-size: var(--text-sm);
1250
+ color: var(--site-text-secondary);
1251
+ transition: color 0.15s ease;
1252
+ }
1253
+
1254
+ .post-menu-picker-add:hover {
1255
+ color: var(--site-text-primary);
1256
+ }
1257
+
1258
+ /* --- Add Collection Panel (replaces picker when creating new collection) --- */
1259
+
1260
+ .post-menu-add-collection-panel {
1261
+ min-width: 300px;
1262
+ }
1263
+
1264
+ .post-menu-panel-back {
1265
+ display: flex;
1266
+ align-items: center;
1267
+ justify-content: center;
1268
+ border: none;
1269
+ background: transparent;
1270
+ padding: 2px;
1271
+ cursor: pointer;
1272
+ color: var(--site-text-secondary);
1273
+ border-radius: 4px;
1274
+ transition: color 0.15s ease;
1275
+ }
1276
+
1277
+ .post-menu-panel-back:hover {
1278
+ color: var(--site-text-primary);
1279
+ }
1280
+
1281
+ .post-menu-panel-done {
1282
+ margin-left: auto;
1283
+ font-size: var(--text-sm);
1284
+ font-weight: var(--fw-medium);
1285
+ color: var(--site-text-primary);
1286
+ border: none;
1287
+ background: transparent;
1288
+ padding: 4px 8px;
1289
+ cursor: pointer;
1290
+ border-radius: 6px;
1291
+ transition: background-color 0.15s ease;
1292
+ }
1293
+
1294
+ .post-menu-panel-done:hover {
1295
+ background-color: var(--site-nav-hover-bg);
1296
+ }
1297
+
1298
+ .post-menu-panel-body {
1299
+ max-height: 420px;
1300
+ overflow-y: auto;
1301
+ }
1302
+
1303
+ .post-menu-collection-form form {
1304
+ padding: 8px 12px;
1305
+ }
1306
+
1307
+ /* Hide the form's built-in submit/cancel row — header has Done button */
1308
+ .post-menu-collection-form form > :last-child:not(.field) {
1309
+ display: none !important;
1310
+ }
1311
+
1312
+ /* =========================================================================
1313
+ * Compose Prompt Bar ("What's new?" at top of content)
1314
+ * ========================================================================= */
1315
+
1316
+ .compose-prompt {
1317
+ display: flex;
1318
+ align-items: center;
1319
+ gap: 12px;
1320
+ padding: 16px 0;
1321
+ margin: 10px 0;
1322
+ border-bottom: 0.5px solid oklch(from var(--site-divider) l c h / 0.5);
1323
+ transition: border-color 0.15s;
1324
+ }
1325
+
1326
+ .compose-prompt:hover {
1327
+ border-bottom-color: var(--site-divider);
1328
+ }
1329
+
1330
+ .compose-prompt-trigger {
1331
+ display: flex;
1332
+ align-items: center;
1333
+ gap: 10px;
1334
+ flex: 1;
1335
+ min-width: 0;
1336
+ padding: 0;
1337
+ border: none;
1338
+ outline: none;
1339
+ background: none;
1340
+ cursor: pointer;
1341
+ text-align: left;
1342
+ color: var(--site-text-primary);
1343
+ opacity: 0.5;
1344
+ transition: opacity 0.15s;
1345
+ }
1346
+
1347
+ .compose-prompt-trigger:hover {
1348
+ opacity: 0.7;
1349
+ }
1350
+
1351
+ .compose-prompt-avatar {
1352
+ display: flex;
1353
+ align-items: center;
1354
+ justify-content: center;
1355
+ flex-shrink: 0;
1356
+ }
1357
+
1358
+ .compose-prompt-text {
1359
+ font-size: var(--text-base);
1360
+ }
1361
+
1362
+ .compose-prompt-post-btn {
1363
+ flex-shrink: 0;
1364
+ padding: 6px 16px;
1365
+ border-radius: 10px;
1366
+ border: 1px solid var(--site-column-outline);
1367
+ background: none;
1368
+ color: var(--site-text-secondary);
1369
+ font-size: 0.875rem;
1370
+ font-weight: var(--fw-semibold);
1371
+ cursor: pointer;
1372
+ transition:
1373
+ border-color 0.15s,
1374
+ color 0.15s;
1375
+ }
1376
+
1377
+ .compose-prompt-post-btn:hover {
1378
+ color: var(--site-text-primary);
1379
+ border-color: var(--site-text-secondary);
1380
+ }
1381
+
1382
+ /* =========================================================================
1383
+ * Compose Dialog
1384
+ * ========================================================================= */
1385
+
1386
+ @keyframes compose-fade-up {
1387
+ from {
1388
+ opacity: 0;
1389
+ transform: translateY(6px);
1390
+ }
1391
+ to {
1392
+ opacity: 1;
1393
+ transform: translateY(0);
1394
+ }
1395
+ }
1396
+
1397
+ @keyframes compose-modal-in {
1398
+ from {
1399
+ opacity: 0;
1400
+ transform: scale(0.97) translateY(8px);
1401
+ }
1402
+ to {
1403
+ opacity: 1;
1404
+ transform: scale(1) translateY(0);
1405
+ }
1406
+ }
1407
+
1408
+ .compose-page {
1409
+ margin-inline: calc(var(--site-padding) * -1);
1410
+ margin-bottom: calc(var(--space-xl) * -1);
1411
+ min-height: 100dvh;
1412
+ }
1413
+
1414
+ .compose-page-shell {
1415
+ --compose-margin-top: 0px;
1416
+
1417
+ width: 100%;
1418
+ background-color: var(--site-elevated-bg);
1419
+ }
1420
+
1421
+ .compose-page-intro {
1422
+ display: none;
1423
+ }
1424
+
1425
+ .compose-page-title {
1426
+ margin: 0;
1427
+ font-family: var(--font-heading);
1428
+ font-size: clamp(1.75rem, 3vw, 2.4rem);
1429
+ font-weight: var(--fw-regular);
1430
+ letter-spacing: -0.03em;
1431
+ line-height: 1.05;
1432
+ color: var(--site-text-primary);
1433
+ }
1434
+
1435
+ .compose-page-intro-row {
1436
+ display: flex;
1437
+ align-items: baseline;
1438
+ justify-content: flex-start;
1439
+ gap: 12px;
1440
+ flex-wrap: wrap;
1441
+ }
1442
+
1443
+ .compose-page-back-link {
1444
+ display: inline-flex;
1445
+ align-items: center;
1446
+ border: none;
1447
+ background: none;
1448
+ padding: 0;
1449
+ margin-inline-start: 8px;
1450
+ color: var(--site-text-secondary);
1451
+ font-size: var(--text-sm);
1452
+ line-height: 1;
1453
+ text-decoration: underline;
1454
+ text-decoration-thickness: 1px;
1455
+ text-underline-offset: 0.18em;
1456
+ cursor: pointer;
1457
+ transition: color 0.18s ease;
1458
+ flex-shrink: 0;
1459
+ }
1460
+
1461
+ .compose-page-back-link:hover {
1462
+ color: var(--site-text-primary);
1463
+ }
1464
+
1465
+ .compose-page-shell > jant-compose-dialog {
1466
+ display: block;
1467
+ }
1468
+
1469
+ .compose-page-shell .compose-dialog-inner {
1470
+ min-height: 0;
1471
+ max-height: none;
1472
+ border-radius: inherit;
1473
+ }
1474
+
1475
+ .compose-page-shell .compose-dialog-inner > jant-compose-editor,
1476
+ .compose-page-shell .compose-thread-layout,
1477
+ .compose-page-shell .compose-editor-row,
1478
+ .compose-page-shell .compose-editor-row > jant-compose-editor {
1479
+ flex: 0 1 auto;
1480
+ min-height: 0;
1481
+ }
1482
+
1483
+ .compose-page-shell .compose-body {
1484
+ flex: 0 1 auto;
1485
+ min-height: clamp(8rem, 22vh, 12rem);
1486
+ }
1487
+
1488
+ @media (min-width: 701px) and (min-height: 761px) {
1489
+ .compose-page {
1490
+ margin-inline: 0;
1491
+ margin-bottom: 0;
1492
+ padding: 32px 0 44px;
1493
+ }
1494
+
1495
+ .compose-page-shell {
1496
+ max-width: min(760px, calc(100vw - var(--site-padding) * 2));
1497
+ margin: 0 auto;
1498
+ background: transparent;
1499
+ }
1500
+
1501
+ .compose-page-intro {
1502
+ display: block;
1503
+ margin-bottom: 20px;
1504
+ padding-inline: 4px;
1505
+ }
1506
+
1507
+ .compose-page-shell .compose-dialog-inner-page {
1508
+ padding: 20px 24px 16px;
1509
+ background-color: color-mix(
1510
+ in srgb,
1511
+ var(--site-elevated-bg) 96%,
1512
+ var(--site-page-bg) 4%
1513
+ );
1514
+ border: 1px solid
1515
+ color-mix(in srgb, var(--site-column-outline) 48%, transparent);
1516
+ border-radius: 12px;
1517
+ box-shadow:
1518
+ 0 10px 28px oklch(0 0 0 / 0.028),
1519
+ 0 1px 2px oklch(0 0 0 / 0.018);
1520
+ overflow: visible;
1521
+ }
1522
+
1523
+ .compose-page-shell .compose-dialog-inner-page .compose-dialog-header {
1524
+ display: grid;
1525
+ grid-template-columns: 1fr auto;
1526
+ align-items: center;
1527
+ gap: 12px;
1528
+ padding: 0 0 16px;
1529
+ }
1530
+
1531
+ .compose-page-shell
1532
+ .compose-dialog-inner-page
1533
+ .compose-dialog-header-center {
1534
+ position: static;
1535
+ transform: none;
1536
+ justify-self: start;
1537
+ min-width: 0;
1538
+ }
1539
+
1540
+ .compose-page-shell .compose-dialog-inner-page .compose-dialog-cancel {
1541
+ display: none;
1542
+ }
1543
+
1544
+ .compose-page-shell .compose-dialog-inner-page .compose-body {
1545
+ padding: 22px 0 12px;
1546
+ min-height: clamp(16rem, 36vh, 24rem);
1547
+ }
1548
+
1549
+ .compose-page-shell .compose-dialog-inner-page .compose-tools-row {
1550
+ padding-inline: 0;
1551
+ background: transparent;
1552
+ }
1553
+
1554
+ .compose-page-shell .compose-dialog-inner-page .compose-action-row {
1555
+ position: sticky;
1556
+ bottom: 0;
1557
+ z-index: 5;
1558
+ margin-inline: 0;
1559
+ padding: 14px 0 0;
1560
+ background-color: inherit;
1561
+ }
1562
+
1563
+ .compose-page-shell .compose-dialog-inner-page .compose-thread-layout,
1564
+ .compose-page-shell .compose-dialog-inner-page .compose-editor-row,
1565
+ .compose-page-shell .compose-dialog-inner-page .compose-reply-row,
1566
+ .compose-page-shell .compose-dialog-inner-page .compose-reply-meta {
1567
+ padding-inline: 0;
1568
+ }
1569
+
1570
+ .compose-page-shell
1571
+ .compose-dialog-inner-page
1572
+ .compose-add-collection-panel,
1573
+ .compose-page-shell .compose-dialog-inner-page .compose-confirm-panel {
1574
+ border-radius: 12px;
1575
+ }
1576
+ }
1577
+
1578
+ /* --- Dialog shell ------------------------------------------------------- */
1579
+
1580
+ /* Prevent body scroll when any compose dialog is open */
1581
+ body:has(.compose-dialog[open]),
1582
+ body:has(.compose-fullscreen-dialog[open]) {
1583
+ overflow: hidden;
1584
+ }
1585
+
1586
+ .compose-dialog {
1587
+ --compose-margin-top: max(80px, 10vh);
1588
+
1589
+ padding: 0;
1590
+ outline: none;
1591
+ border: none;
1592
+ border-radius: 10px;
1593
+ width: calc(100% - 20px);
1594
+ max-width: calc(var(--site-width) - var(--site-padding) * 2 - 20px);
1595
+ max-height: calc(100dvh - var(--compose-margin-top) - 20px);
1596
+ margin: var(--compose-margin-top) auto auto;
1597
+ background-color: var(--site-elevated-bg);
1598
+ color: var(--site-text-primary);
1599
+ box-shadow:
1600
+ 0 8px 40px rgba(0, 0, 0, 0.08),
1601
+ 0 1px 3px rgba(0, 0, 0, 0.04);
1602
+ border: 1px solid var(--site-column-outline);
1603
+ overflow: visible;
1604
+ }
1605
+
1606
+ .compose-dialog[open] {
1607
+ animation: compose-modal-in 0.32s cubic-bezier(0.22, 1, 0.36, 1) both;
1608
+ }
1609
+
1610
+ .compose-dialog::backdrop {
1611
+ background-color: rgba(0, 0, 0, 0.3);
1612
+ }
1613
+
1614
+ .compose-dialog jant-compose-dialog {
1615
+ display: block;
1616
+ position: relative;
1617
+ }
1618
+
1619
+ .compose-dialog-inner {
1620
+ display: flex;
1621
+ flex-direction: column;
1622
+ max-height: calc(100dvh - var(--compose-margin-top) - 20px);
1623
+ position: relative;
1624
+ border-radius: inherit;
1625
+ overflow: hidden;
1626
+ }
1627
+
1628
+ .compose-dialog-inner > jant-compose-editor {
1629
+ flex: 1;
1630
+ min-height: 0;
1631
+ display: flex;
1632
+ flex-direction: column;
1633
+ overflow: hidden;
1634
+ position: relative;
1635
+ }
1636
+
1637
+ /* --- Header ------------------------------------------------------------- */
1638
+
1639
+ .compose-dialog-header {
1640
+ display: flex;
1641
+ align-items: center;
1642
+ justify-content: space-between;
1643
+ padding: 10px 12px;
1644
+ position: relative;
1645
+ }
1646
+
1647
+ @media (min-width: 700px) {
1648
+ .compose-dialog-header {
1649
+ padding: 12px 16px;
1650
+ }
1651
+ }
1652
+
1653
+ .compose-dialog-cancel {
1654
+ padding: 4px 8px;
1655
+ border: none;
1656
+ background: none;
1657
+ border-radius: 6px;
1658
+ color: var(--site-text-secondary);
1659
+ font-size: var(--text-sm);
1660
+ cursor: pointer;
1661
+ transition: color 0.15s ease-out;
1662
+ flex-shrink: 0;
1663
+ min-width: 60px;
1664
+ text-align: left;
1665
+ }
1666
+
1667
+ .compose-dialog-cancel:hover {
1668
+ color: var(--site-text-primary);
1669
+ }
1670
+
1671
+ .compose-dialog-header-center {
1672
+ position: absolute;
1673
+ left: 50%;
1674
+ transform: translateX(-50%);
1675
+ }
1676
+
1677
+ .compose-dialog-title {
1678
+ font-weight: var(--fw-semibold);
1679
+ font-size: var(--text-base);
1680
+ }
1681
+
1682
+ .compose-dialog-header-btn {
1683
+ display: flex;
1684
+ align-items: center;
1685
+ justify-content: center;
1686
+ width: 32px;
1687
+ height: 32px;
1688
+ border-radius: 8px;
1689
+ border: none;
1690
+ background: none;
1691
+ color: var(--site-text-secondary);
1692
+ cursor: pointer;
1693
+ transition:
1694
+ background-color 0.15s ease-out,
1695
+ color 0.15s ease-out;
1696
+ }
1697
+
1698
+ .compose-dialog-header-btn:hover {
1699
+ color: var(--site-text-primary);
1700
+ background-color: var(--site-nav-hover-bg);
1701
+ }
1702
+
1703
+ .compose-dialog-header-btn:disabled {
1704
+ opacity: 0.3;
1705
+ cursor: not-allowed;
1706
+ }
1707
+
1708
+ @media (max-width: 700px), (max-height: 760px) {
1709
+ .compose-dialog {
1710
+ --compose-margin-top: 0px;
1711
+
1712
+ width: 100vw;
1713
+ max-width: 100vw;
1714
+ height: 100dvh;
1715
+ max-height: 100dvh;
1716
+ margin: 0;
1717
+ border: none;
1718
+ border-radius: 0;
1719
+ box-shadow: none;
1720
+ }
1721
+
1722
+ .compose-dialog-inner {
1723
+ min-height: 100dvh;
1724
+ max-height: 100dvh;
1725
+ border-radius: 0;
1726
+ }
1727
+
1728
+ .compose-dialog-inner > jant-compose-editor,
1729
+ .compose-thread-layout,
1730
+ .compose-editor-row,
1731
+ .compose-editor-row > jant-compose-editor {
1732
+ flex: 0 1 auto;
1733
+ }
1734
+
1735
+ .compose-dialog-inner > jant-compose-editor,
1736
+ .compose-editor-row > jant-compose-editor {
1737
+ max-height: calc(
1738
+ 100dvh - 13rem - env(safe-area-inset-top) - env(safe-area-inset-bottom)
1739
+ );
1740
+ }
1741
+
1742
+ .compose-dialog-header {
1743
+ padding-top: calc(10px + env(safe-area-inset-top));
1744
+ padding-right: calc(12px + env(safe-area-inset-right));
1745
+ padding-left: calc(12px + env(safe-area-inset-left));
1746
+ }
1747
+
1748
+ .compose-body {
1749
+ flex: 0 1 auto;
1750
+ min-height: clamp(8rem, 22vh, 12rem);
1751
+ padding-right: calc(20px + env(safe-area-inset-right));
1752
+ padding-left: calc(20px + env(safe-area-inset-left));
1753
+ }
1754
+
1755
+ .compose-reply-row,
1756
+ .compose-editor-row {
1757
+ padding-right: calc(16px + env(safe-area-inset-right));
1758
+ padding-left: calc(16px + env(safe-area-inset-left));
1759
+ }
1760
+
1761
+ .compose-action-row {
1762
+ padding-right: calc(10px + env(safe-area-inset-right));
1763
+ padding-bottom: calc(12px + env(safe-area-inset-bottom));
1764
+ padding-left: calc(10px + env(safe-area-inset-left));
1765
+ }
1766
+
1767
+ .compose-add-collection-panel,
1768
+ .compose-confirm-panel {
1769
+ border-radius: 0;
1770
+ }
1771
+
1772
+ .compose-add-collection-panel {
1773
+ max-height: 100dvh;
1774
+ }
1775
+ }
1776
+
1777
+ /* --- Format switcher with animated pill --------------------------------- */
1778
+
1779
+ .compose-segmented {
1780
+ display: inline-flex;
1781
+ background-color: var(--site-nav-hover-bg);
1782
+ border-radius: 10px;
1783
+ padding: 3px;
1784
+ position: relative;
1785
+ }
1786
+
1787
+ .compose-format-pill {
1788
+ position: absolute;
1789
+ top: 3px;
1790
+ left: 3px;
543
1791
  width: calc((100% - 6px) / 3);
544
1792
  height: calc(100% - 6px);
545
1793
  background-color: var(--site-elevated-bg);
@@ -567,7 +1815,7 @@
567
1815
  background: transparent;
568
1816
  color: var(--site-text-secondary);
569
1817
  font-size: var(--text-sm);
570
- font-weight: 400;
1818
+ font-weight: var(--fw-regular);
571
1819
  cursor: pointer;
572
1820
  transition: color 0.2s ease;
573
1821
  letter-spacing: 0.01em;
@@ -575,7 +1823,7 @@
575
1823
 
576
1824
  .compose-segmented-item-active {
577
1825
  color: var(--site-text-primary);
578
- font-weight: 500;
1826
+ font-weight: var(--fw-medium);
579
1827
  }
580
1828
 
581
1829
  /* --- Body --------------------------------------------------------------- */
@@ -639,7 +1887,7 @@
639
1887
  flex: 1;
640
1888
  font-family: var(--font-heading);
641
1889
  font-size: 1.125rem;
642
- font-weight: 400;
1890
+ font-weight: var(--fw-regular);
643
1891
  letter-spacing: -0.01em;
644
1892
  line-height: 1.3;
645
1893
  }
@@ -701,7 +1949,7 @@
701
1949
  .compose-link-title {
702
1950
  font-family: var(--font-heading);
703
1951
  font-size: 1.03rem;
704
- font-weight: 400;
1952
+ font-weight: var(--fw-regular);
705
1953
  letter-spacing: -0.005em;
706
1954
  margin-bottom: 14px;
707
1955
  padding-left: 2px;
@@ -772,7 +2020,7 @@
772
2020
 
773
2021
  .compose-quote-author {
774
2022
  font-size: var(--text-sm);
775
- font-weight: 500;
2023
+ font-weight: var(--fw-medium);
776
2024
  letter-spacing: 0.01em;
777
2025
  }
778
2026
 
@@ -834,41 +2082,6 @@
834
2082
  margin-left: 4px;
835
2083
  }
836
2084
 
837
- /* --- Attached text badge ------------------------------------------------ */
838
-
839
- .compose-attached-badge {
840
- display: flex;
841
- align-items: center;
842
- gap: 8px;
843
- margin-top: 14px;
844
- background-color: var(--site-nav-hover-bg);
845
- border-radius: 10px;
846
- padding: 8px 12px;
847
- cursor: pointer;
848
- animation: compose-fade-up 0.28s cubic-bezier(0.22, 1, 0.36, 1) both;
849
- transition: opacity 0.15s ease;
850
- }
851
-
852
- .compose-attached-badge:hover {
853
- opacity: 0.85;
854
- }
855
-
856
- .compose-attached-badge-dismiss {
857
- border: none;
858
- background: transparent;
859
- color: var(--site-text-secondary);
860
- cursor: pointer;
861
- font-size: 0.75rem;
862
- padding: 0 2px;
863
- line-height: 1;
864
- opacity: 0.6;
865
- transition: opacity 0.15s ease;
866
- }
867
-
868
- .compose-attached-badge-dismiss:hover {
869
- opacity: 1;
870
- }
871
-
872
2085
  /* --- Attached text overlay panel ---------------------------------------- */
873
2086
 
874
2087
  .compose-attached-panel {
@@ -882,47 +2095,32 @@
882
2095
  animation: compose-fade-up 0.28s cubic-bezier(0.22, 1, 0.36, 1) both;
883
2096
  }
884
2097
 
885
- .compose-attached-charcount {
886
- position: absolute;
887
- right: 12px;
888
- }
889
-
890
- @media (min-width: 700px) {
891
- .compose-attached-charcount {
892
- right: 16px;
893
- }
894
- }
895
-
896
- .compose-attached-panel-back {
2098
+ .compose-attached-cancel {
897
2099
  border: none;
898
2100
  background: transparent;
899
- display: flex;
900
- align-items: center;
901
- justify-content: center;
902
- width: 32px;
903
- height: 32px;
904
- border-radius: 8px;
905
2101
  cursor: pointer;
2102
+ font-size: var(--text-sm);
2103
+ font-weight: var(--fw-medium);
906
2104
  color: var(--site-text-secondary);
2105
+ padding: 4px 8px;
2106
+ border-radius: 6px;
907
2107
  transition: color 0.15s ease;
908
2108
  }
909
2109
 
910
- .compose-attached-panel-back:hover {
2110
+ .compose-attached-cancel:hover {
911
2111
  color: var(--site-text-primary);
912
2112
  }
913
2113
 
914
- .compose-attached-textarea {
2114
+ .compose-attached-tiptap {
915
2115
  flex: 1;
916
- font-size: 0.84rem;
917
- line-height: 1.65;
918
- letter-spacing: 0.005em;
2116
+ min-height: 0;
919
2117
  overflow-y: auto;
920
2118
  }
921
2119
 
922
- .compose-attached-textarea::-webkit-scrollbar {
2120
+ .compose-attached-tiptap::-webkit-scrollbar {
923
2121
  width: 3px;
924
2122
  }
925
- .compose-attached-textarea::-webkit-scrollbar-thumb {
2123
+ .compose-attached-tiptap::-webkit-scrollbar-thumb {
926
2124
  background-color: var(--site-divider);
927
2125
  border-radius: 4px;
928
2126
  }
@@ -977,7 +2175,7 @@
977
2175
 
978
2176
  .compose-tool-label {
979
2177
  font-size: 0.8125rem;
980
- font-weight: 500;
2178
+ font-weight: var(--fw-medium);
981
2179
  white-space: nowrap;
982
2180
  }
983
2181
 
@@ -1040,12 +2238,11 @@
1040
2238
  background-color: var(--site-nav-hover-bg);
1041
2239
  }
1042
2240
 
1043
- .compose-collection-badge {
1044
- font-size: 0.6875rem;
1045
- min-width: 1.125rem;
1046
- height: 1.125rem;
1047
- padding: 0 4px;
1048
- line-height: 1.125rem;
2241
+ .compose-collection-label {
2242
+ overflow: hidden;
2243
+ text-overflow: ellipsis;
2244
+ white-space: nowrap;
2245
+ max-width: 160px;
1049
2246
  }
1050
2247
 
1051
2248
  .compose-collection-select [data-popover] {
@@ -1059,9 +2256,57 @@
1059
2256
  overflow-y: auto;
1060
2257
  }
1061
2258
 
2259
+ .compose-collection-select [data-popover] [role="option"] {
2260
+ cursor: pointer;
2261
+ }
2262
+
2263
+ .compose-collection-select [data-popover] [role="option"]:hover {
2264
+ background-color: var(--site-nav-hover-bg);
2265
+ }
2266
+
2267
+ .compose-collection-add-action {
2268
+ display: flex;
2269
+ align-items: center;
2270
+ gap: 8px;
2271
+ padding: 8px 12px;
2272
+ border-top: 1px solid var(--site-border-light);
2273
+ cursor: pointer;
2274
+ font-size: var(--text-sm);
2275
+ color: var(--site-text-secondary);
2276
+ transition: color 0.15s ease;
2277
+ }
2278
+
2279
+ .compose-collection-add-action:hover {
2280
+ color: var(--site-text-primary);
2281
+ }
2282
+
2283
+ .compose-add-collection-panel {
2284
+ position: absolute;
2285
+ inset: 0;
2286
+ z-index: 50;
2287
+ background-color: var(--site-elevated-bg);
2288
+ display: flex;
2289
+ flex-direction: column;
2290
+ border-radius: 10px;
2291
+ animation: compose-fade-up 0.28s cubic-bezier(0.22, 1, 0.36, 1) both;
2292
+ /* Size to fit the collection form — not constrained by compose-dialog-inner */
2293
+ min-height: 480px;
2294
+ max-height: calc(100dvh - var(--compose-margin-top) - 20px);
2295
+ }
2296
+
2297
+ .compose-add-collection-form form {
2298
+ padding: 16px;
2299
+ }
2300
+
2301
+ /* Hide the form's built-in submit/cancel row — header has Done button.
2302
+ !important needed to override Tailwind utility-layer `flex` on the element. */
2303
+ .compose-add-collection-form form > :last-child:not(.field) {
2304
+ display: none !important;
2305
+ }
2306
+
1062
2307
  .compose-post-btn {
1063
2308
  font-size: 0.84rem;
1064
- font-weight: 500;
2309
+ font-weight: var(--fw-medium);
1065
2310
  letter-spacing: 0.02em;
1066
2311
  color: var(--site-elevated-bg);
1067
2312
  background-color: var(--site-text-primary);
@@ -1082,11 +2327,76 @@
1082
2327
  .compose-post-btn:hover {
1083
2328
  opacity: 0.85;
1084
2329
  }
1085
- .compose-post-btn:disabled {
2330
+ .compose-post-btn:disabled {
2331
+ opacity: 0.5;
2332
+ cursor: not-allowed;
2333
+ }
2334
+
2335
+ .compose-publish-group {
2336
+ position: relative;
2337
+ display: inline-flex;
2338
+ flex-shrink: 0;
2339
+ }
2340
+
2341
+ .compose-publish-main {
2342
+ font-size: 0.84rem;
2343
+ font-weight: var(--fw-medium);
2344
+ letter-spacing: 0.02em;
2345
+ color: var(--site-elevated-bg);
2346
+ background-color: var(--site-text-primary);
2347
+ border: none;
2348
+ border-radius: 10px 0 0 10px;
2349
+ padding: 8px 16px;
2350
+ cursor: pointer;
2351
+ transition: opacity 0.2s ease;
2352
+ display: inline-flex;
2353
+ align-items: center;
2354
+ gap: 6px;
2355
+ }
2356
+
2357
+ @media (min-width: 700px) {
2358
+ .compose-publish-main {
2359
+ padding: 8px 20px;
2360
+ }
2361
+ }
2362
+
2363
+ .compose-publish-main:hover {
2364
+ opacity: 0.85;
2365
+ }
2366
+ .compose-publish-main:disabled {
2367
+ opacity: 0.5;
2368
+ cursor: not-allowed;
2369
+ }
2370
+
2371
+ .compose-publish-toggle {
2372
+ display: inline-flex;
2373
+ align-items: center;
2374
+ justify-content: center;
2375
+ color: var(--site-elevated-bg);
2376
+ background-color: var(--site-text-primary);
2377
+ border: none;
2378
+ border-left: 1px solid
2379
+ color-mix(in srgb, var(--site-elevated-bg) 20%, transparent);
2380
+ border-radius: 0 10px 10px 0;
2381
+ padding: 8px 6px;
2382
+ cursor: pointer;
2383
+ transition: opacity 0.2s ease;
2384
+ }
2385
+
2386
+ .compose-publish-toggle:hover {
2387
+ opacity: 0.85;
2388
+ }
2389
+ .compose-publish-toggle:disabled {
1086
2390
  opacity: 0.5;
1087
2391
  cursor: not-allowed;
1088
2392
  }
1089
2393
 
2394
+ .compose-publish-group .compose-dropdown {
2395
+ bottom: calc(100% + 6px);
2396
+ top: auto;
2397
+ right: 0;
2398
+ }
2399
+
1090
2400
  /* --- Dropdowns ---------------------------------------------------------- */
1091
2401
 
1092
2402
  .compose-dropdown-backdrop {
@@ -1161,6 +2471,11 @@
1161
2471
  animation: compose-fade-up 0.28s cubic-bezier(0.22, 1, 0.36, 1) both;
1162
2472
  }
1163
2473
 
2474
+ .compose-attachments[data-dragging="true"] {
2475
+ scroll-snap-type: none;
2476
+ cursor: grabbing;
2477
+ }
2478
+
1164
2479
  .compose-attachments::-webkit-scrollbar {
1165
2480
  display: none;
1166
2481
  }
@@ -1187,6 +2502,35 @@
1187
2502
  background-color: var(--site-nav-hover-bg);
1188
2503
  }
1189
2504
 
2505
+ .compose-attachment-sortable {
2506
+ display: block;
2507
+ cursor: grab;
2508
+ user-select: none;
2509
+ -webkit-user-drag: none;
2510
+ }
2511
+
2512
+ .compose-attachment-sortable:active {
2513
+ cursor: grabbing;
2514
+ }
2515
+
2516
+ .compose-attachment-sortable:focus-visible {
2517
+ outline: 2px solid var(--color-primary);
2518
+ outline-offset: 3px;
2519
+ }
2520
+
2521
+ .compose-attachment-chosen {
2522
+ z-index: 2;
2523
+ }
2524
+
2525
+ .compose-attachment-ghost {
2526
+ opacity: 0.32;
2527
+ }
2528
+
2529
+ .compose-attachment-drag {
2530
+ opacity: 0.98;
2531
+ transform: scale(1.02);
2532
+ }
2533
+
1190
2534
  .compose-attachment-img {
1191
2535
  display: block;
1192
2536
  border-radius: var(--media-radius, 0.5rem);
@@ -1194,162 +2538,434 @@
1194
2538
  object-fit: contain;
1195
2539
  }
1196
2540
 
1197
- /* Single image: constrain to container width */
1198
- .compose-attachment:only-child .compose-attachment-img {
1199
- max-width: 100%;
1200
- max-height: 384px;
2541
+ .compose-attachment-processing {
2542
+ display: flex;
2543
+ align-items: center;
2544
+ justify-content: center;
2545
+ width: 120px;
2546
+ height: 120px;
2547
+ color: var(--site-text-secondary);
2548
+ }
2549
+
2550
+ /* Single image: constrain to container width */
2551
+ .compose-attachment:only-child .compose-attachment-img {
2552
+ max-width: 100%;
2553
+ max-height: 384px;
2554
+ }
2555
+
2556
+ /* Multiple images: fixed height, cover */
2557
+ .compose-attachment:not(:only-child) .compose-attachment-img {
2558
+ height: 200px;
2559
+ width: auto;
2560
+ min-width: 120px;
2561
+ object-fit: cover;
2562
+ }
2563
+
2564
+ .compose-attachment-overlay {
2565
+ position: absolute;
2566
+ inset: 0;
2567
+ display: flex;
2568
+ align-items: center;
2569
+ justify-content: center;
2570
+ background-color: rgba(0, 0, 0, 0.35);
2571
+ color: white;
2572
+ border-radius: var(--media-radius, 0.5rem);
2573
+ }
2574
+
2575
+ .compose-attachment-retry {
2576
+ background-color: rgba(0, 0, 0, 0.5);
2577
+ cursor: pointer;
2578
+ border: none;
2579
+ padding: 8px;
2580
+ transition: background-color 0.15s;
2581
+ }
2582
+
2583
+ .compose-attachment-retry:hover {
2584
+ background-color: rgba(0, 0, 0, 0.6);
2585
+ }
2586
+
2587
+ .compose-retry-content {
2588
+ display: flex;
2589
+ flex-direction: column;
2590
+ align-items: center;
2591
+ gap: 6px;
2592
+ }
2593
+
2594
+ .compose-retry-content svg {
2595
+ opacity: 0.85;
2596
+ transition: opacity 0.15s;
2597
+ }
2598
+
2599
+ .compose-attachment-retry:hover .compose-retry-content svg {
2600
+ opacity: 1;
2601
+ }
2602
+
2603
+ .compose-retry-label {
2604
+ font-size: 11px;
2605
+ line-height: 1.3;
2606
+ text-align: center;
2607
+ opacity: 0.9;
2608
+ }
2609
+
2610
+ .compose-attachment-remove {
2611
+ position: absolute;
2612
+ top: 6px;
2613
+ right: 6px;
2614
+ width: 24px;
2615
+ height: 24px;
2616
+ border-radius: 50%;
2617
+ border: none;
2618
+ background-color: rgba(0, 0, 0, 0.55);
2619
+ color: white;
2620
+ font-size: 11px;
2621
+ line-height: 1;
2622
+ cursor: pointer;
2623
+ display: flex;
2624
+ align-items: center;
2625
+ justify-content: center;
2626
+ opacity: 0;
2627
+ transition: opacity 0.15s ease;
2628
+ }
2629
+
2630
+ .compose-attachment-thumb:hover .compose-attachment-remove {
2631
+ opacity: 1;
2632
+ }
2633
+
2634
+ /* Always show on touch devices */
2635
+ @media (hover: none) {
2636
+ .compose-attachment-remove {
2637
+ opacity: 1;
2638
+ }
2639
+ }
2640
+
2641
+ .compose-attachment-alt {
2642
+ border: none;
2643
+ background: transparent;
2644
+ cursor: pointer;
2645
+ font-size: 0.625rem;
2646
+ font-weight: var(--fw-semibold);
2647
+ letter-spacing: 0.04em;
2648
+ color: var(--site-text-secondary);
2649
+ padding: 2px 4px;
2650
+ border-radius: 4px;
2651
+ transition: color 0.15s ease;
2652
+ }
2653
+
2654
+ .compose-attachment-alt:hover {
2655
+ color: var(--site-text-primary);
2656
+ }
2657
+
2658
+ .compose-attachment-alt-set {
2659
+ color: oklch(0.6 0.15 155);
2660
+ }
2661
+
2662
+ .compose-attachment-alt-set:hover {
2663
+ color: oklch(0.6 0.15 155);
2664
+ opacity: 0.8;
2665
+ }
2666
+
2667
+ /* --- Video play icon overlay (compose) ----------------------------------- */
2668
+
2669
+ .compose-attachment-play-icon {
2670
+ position: absolute;
2671
+ inset: 0;
2672
+ display: flex;
2673
+ align-items: center;
2674
+ justify-content: center;
2675
+ pointer-events: none;
2676
+ }
2677
+
2678
+ .compose-attachment-play-icon svg {
2679
+ filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.4));
2680
+ opacity: 0.85;
2681
+ }
2682
+
2683
+ /* --- File card (compose: audio + PDF) ----------------------------------- */
2684
+
2685
+ .compose-attachment-file-card {
2686
+ display: flex;
2687
+ flex-direction: column;
2688
+ align-items: center;
2689
+ justify-content: center;
2690
+ gap: 8px;
2691
+ width: 120px;
2692
+ height: 160px;
2693
+ padding: 16px 12px;
2694
+ background-color: var(--site-nav-hover-bg);
2695
+ border: 1px solid var(--site-divider);
2696
+ border-radius: var(--media-radius, 0.5rem);
2697
+ text-align: center;
2698
+ }
2699
+
2700
+ .compose-attachment:not(:only-child) .compose-attachment-file-card {
2701
+ width: 150px;
2702
+ height: 200px;
2703
+ }
2704
+
2705
+ .compose-attachment-file-icon {
2706
+ color: var(--site-text-secondary);
2707
+ opacity: 0.6;
2708
+ }
2709
+
2710
+ .compose-attachment-file-name {
2711
+ font-size: 0.6875rem;
2712
+ font-weight: var(--fw-medium);
2713
+ color: var(--site-text-primary);
2714
+ max-width: 100%;
2715
+ overflow: hidden;
2716
+ text-overflow: ellipsis;
2717
+ white-space: nowrap;
2718
+ }
2719
+
2720
+ .compose-attachment-file-size {
2721
+ font-size: 0.625rem;
2722
+ color: var(--site-text-secondary);
2723
+ }
2724
+
2725
+ /* --- Attached text card (compose: inline text attachment) ----------------- */
2726
+
2727
+ .compose-attachment-text-card {
2728
+ display: flex;
2729
+ flex-direction: column;
2730
+ align-items: center;
2731
+ justify-content: center;
2732
+ gap: 8px;
2733
+ width: 120px;
2734
+ height: 160px;
2735
+ padding: 12px;
2736
+ background-color: var(--site-nav-hover-bg);
2737
+ border: 1px solid var(--site-divider);
2738
+ border-radius: var(--media-radius, 0.5rem);
2739
+ text-align: center;
2740
+ cursor: pointer;
2741
+ }
2742
+
2743
+ .compose-attachment:not(:only-child) .compose-attachment-text-card {
2744
+ width: 150px;
2745
+ height: 200px;
2746
+ }
2747
+
2748
+ .compose-attachment-text-summary {
2749
+ font-size: 0.6875rem;
2750
+ line-height: 1.45;
2751
+ color: var(--site-text-secondary);
2752
+ display: -webkit-box;
2753
+ -webkit-line-clamp: 3;
2754
+ -webkit-box-orient: vertical;
2755
+ overflow: hidden;
2756
+ word-break: break-word;
2757
+ }
2758
+
2759
+ /* --- Close confirmation action sheet (Threads-style) -------------------- */
2760
+
2761
+ .compose-confirm-panel {
2762
+ position: absolute;
2763
+ inset: 0;
2764
+ z-index: 60;
2765
+ background-color: oklch(from var(--site-text-primary) l c h / 0.25);
2766
+ display: flex;
2767
+ align-items: center;
2768
+ justify-content: center;
2769
+ border-radius: 10px;
2770
+ animation: compose-fade-up 0.28s cubic-bezier(0.22, 1, 0.36, 1) both;
2771
+ }
2772
+
2773
+ .compose-confirm-sheet {
2774
+ width: min(300px, calc(100% - 48px));
2775
+ background-color: var(--site-elevated-bg);
2776
+ border-radius: 14px;
2777
+ overflow: hidden;
2778
+ box-shadow: 0 8px 32px oklch(0 0 0 / 0.12);
2779
+ }
2780
+
2781
+ .compose-confirm-header {
2782
+ padding: 24px 20px 16px;
2783
+ text-align: center;
2784
+ }
2785
+
2786
+ .compose-confirm-title {
2787
+ font-size: var(--text-base);
2788
+ font-weight: var(--fw-bold);
2789
+ color: var(--site-text-primary);
2790
+ letter-spacing: -0.01em;
2791
+ }
2792
+
2793
+ .compose-confirm-subtitle {
2794
+ margin-top: 8px;
2795
+ font-size: var(--text-sm);
2796
+ color: var(--site-text-secondary);
2797
+ line-height: var(--leading);
2798
+ }
2799
+
2800
+ .compose-confirm-action {
2801
+ display: block;
2802
+ width: 100%;
2803
+ padding: 14px 20px;
2804
+ border: none;
2805
+ border-top: 1px solid var(--site-divider);
2806
+ background: transparent;
2807
+ font-size: var(--text-base);
2808
+ font-family: inherit;
2809
+ text-align: center;
2810
+ cursor: pointer;
2811
+ transition: background-color 0.12s;
2812
+ }
2813
+
2814
+ .compose-confirm-action:hover {
2815
+ background-color: var(--site-nav-hover-bg);
2816
+ }
2817
+
2818
+ .compose-confirm-save {
2819
+ font-weight: var(--fw-semibold);
2820
+ color: var(--site-text-primary);
2821
+ }
2822
+
2823
+ .compose-confirm-discard {
2824
+ color: var(--color-destructive, #ef4444);
1201
2825
  }
1202
2826
 
1203
- /* Multiple images: fixed height, cover */
1204
- .compose-attachment:not(:only-child) .compose-attachment-img {
1205
- height: 200px;
1206
- width: auto;
1207
- min-width: 120px;
1208
- object-fit: cover;
2827
+ .compose-confirm-cancel {
2828
+ color: var(--site-text-secondary);
1209
2829
  }
1210
2830
 
1211
- .compose-attachment-overlay {
1212
- position: absolute;
1213
- inset: 0;
2831
+ /* --- Reply context in compose dialog ----------------------------------- */
2832
+
2833
+ /* Thread layout: wraps reply context + editor with a continuous thread line */
2834
+ .compose-thread-layout {
1214
2835
  display: flex;
1215
- align-items: center;
1216
- justify-content: center;
1217
- background-color: rgba(0, 0, 0, 0.35);
1218
- color: white;
1219
- border-radius: var(--media-radius, 0.5rem);
2836
+ flex-direction: column;
2837
+ flex: 1;
2838
+ min-height: 0;
2839
+ overflow: hidden;
2840
+ position: relative;
1220
2841
  }
1221
2842
 
1222
- .compose-attachment-retry {
1223
- background-color: rgba(0, 0, 0, 0.5);
1224
- cursor: pointer;
1225
- border: none;
1226
- padding: 0;
1227
- transition: background-color 0.15s;
2843
+ /* Continuous vertical line through the rail */
2844
+ .compose-thread-layout::before {
2845
+ content: "";
2846
+ position: absolute;
2847
+ left: 21px; /* 16px padding + 5px to center in 12px dot */
2848
+ top: 0;
2849
+ bottom: 0;
2850
+ width: 2px;
2851
+ background-color: var(--site-threadline);
2852
+ z-index: 0;
1228
2853
  }
1229
2854
 
1230
- .compose-attachment-retry:hover {
1231
- background-color: rgba(0, 0, 0, 0.6);
2855
+ /* Row containing dot + reply context */
2856
+ .compose-reply-row {
2857
+ display: flex;
2858
+ gap: 12px;
2859
+ padding: 0 16px;
1232
2860
  }
1233
2861
 
1234
- .compose-attachment-retry svg {
1235
- opacity: 0.85;
1236
- transition: opacity 0.15s;
2862
+ /* Row containing dot + editor */
2863
+ .compose-editor-row {
2864
+ display: flex;
2865
+ gap: 12px;
2866
+ padding: 0 16px;
2867
+ flex: 1;
2868
+ min-height: 0;
2869
+ overflow: hidden;
1237
2870
  }
1238
2871
 
1239
- .compose-attachment-retry:hover svg {
1240
- opacity: 1;
2872
+ .compose-editor-row > jant-compose-editor {
2873
+ flex: 1;
2874
+ min-height: 0;
2875
+ display: flex;
2876
+ flex-direction: column;
2877
+ overflow: hidden;
2878
+ position: relative;
1241
2879
  }
1242
2880
 
1243
- .compose-attachment-remove {
1244
- position: absolute;
1245
- top: 6px;
1246
- right: 6px;
1247
- width: 24px;
1248
- height: 24px;
2881
+ /* Reduce editor body left padding — the thread rail already provides indent */
2882
+ .compose-editor-row .compose-body {
2883
+ padding-left: 0;
2884
+ }
2885
+
2886
+ /* Dot marker for thread positions */
2887
+ .compose-thread-dot {
2888
+ width: 12px;
2889
+ height: 12px;
1249
2890
  border-radius: 50%;
1250
- border: none;
1251
- background-color: rgba(0, 0, 0, 0.55);
1252
- color: white;
1253
- font-size: 11px;
1254
- line-height: 1;
1255
- cursor: pointer;
1256
- display: flex;
1257
- align-items: center;
1258
- justify-content: center;
1259
- opacity: 0;
1260
- transition: opacity 0.15s ease;
2891
+ background-color: var(--site-threadline);
2892
+ flex-shrink: 0;
2893
+ align-self: center;
2894
+ z-index: 1;
1261
2895
  }
1262
2896
 
1263
- .compose-attachment-thumb:hover .compose-attachment-remove {
1264
- opacity: 1;
2897
+ .compose-reply-context {
2898
+ flex: 1;
2899
+ min-width: 0;
2900
+ max-height: 140px;
2901
+ overflow: hidden;
2902
+ position: relative;
2903
+ transition: max-height 0.3s ease;
1265
2904
  }
1266
2905
 
1267
- /* Always show on touch devices */
1268
- @media (hover: none) {
1269
- .compose-attachment-remove {
1270
- opacity: 1;
1271
- }
2906
+ .compose-reply-context.expanded {
2907
+ max-height: 400px;
2908
+ overflow-y: auto;
1272
2909
  }
1273
2910
 
1274
- .compose-attachment-alt {
1275
- border: none;
1276
- background: transparent;
1277
- cursor: pointer;
1278
- font-size: 0.625rem;
1279
- font-weight: 600;
1280
- letter-spacing: 0.04em;
2911
+ .compose-reply-context-body {
2912
+ font-size: var(--text-xs);
1281
2913
  color: var(--site-text-secondary);
1282
- padding: 2px 4px;
1283
- border-radius: 4px;
1284
- transition: color 0.15s ease;
2914
+ line-height: 1.5;
1285
2915
  }
1286
2916
 
1287
- .compose-attachment-alt:hover {
1288
- color: var(--site-text-primary);
2917
+ /* Scale down cloned card content to be smaller than the compose editor */
2918
+ .compose-reply-context-body h2 {
2919
+ font-size: var(--text-sm);
2920
+ margin-bottom: 2px;
1289
2921
  }
1290
2922
 
1291
- .compose-attachment-alt-set {
1292
- color: oklch(0.6 0.15 155);
2923
+ .compose-reply-context-body .prose,
2924
+ .compose-reply-context-body .e-content {
2925
+ font-size: inherit;
1293
2926
  }
1294
2927
 
1295
- .compose-attachment-alt-set:hover {
1296
- color: oklch(0.6 0.15 155);
1297
- opacity: 0.8;
2928
+ .compose-reply-context-body .feed-quote {
2929
+ font-size: inherit;
1298
2930
  }
1299
2931
 
1300
- /* --- Video play icon overlay (compose) ----------------------------------- */
2932
+ .compose-reply-context-body img,
2933
+ .compose-reply-context-body video {
2934
+ max-height: 120px;
2935
+ border-radius: 6px;
2936
+ }
1301
2937
 
1302
- .compose-attachment-play-icon {
2938
+ .compose-reply-fade {
1303
2939
  position: absolute;
1304
- inset: 0;
1305
- display: flex;
1306
- align-items: center;
1307
- justify-content: center;
2940
+ bottom: 0;
2941
+ left: 0;
2942
+ right: 0;
2943
+ height: 32px;
2944
+ background: linear-gradient(transparent, var(--site-elevated-bg));
1308
2945
  pointer-events: none;
1309
2946
  }
1310
2947
 
1311
- .compose-attachment-play-icon svg {
1312
- filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.4));
1313
- opacity: 0.85;
1314
- }
1315
-
1316
- /* --- File card (compose: audio + PDF) ----------------------------------- */
1317
-
1318
- .compose-attachment-file-card {
2948
+ .compose-reply-meta {
1319
2949
  display: flex;
1320
- flex-direction: column;
1321
2950
  align-items: center;
1322
- justify-content: center;
1323
- gap: 6px;
1324
- min-width: 120px;
1325
- min-height: 100px;
1326
- padding: 16px 12px;
1327
- background-color: var(--site-nav-hover-bg);
1328
- border-radius: var(--media-radius, 0.5rem);
1329
- text-align: center;
1330
- }
1331
-
1332
- .compose-attachment:not(:only-child) .compose-attachment-file-card {
1333
- min-height: 200px;
2951
+ gap: 8px;
2952
+ padding: 4px 16px 0 40px;
2953
+ font-size: var(--text-xs);
2954
+ color: var(--site-text-secondary);
1334
2955
  }
1335
2956
 
1336
- .compose-attachment-file-icon {
2957
+ .compose-reply-toggle {
2958
+ border: none;
2959
+ background: transparent;
1337
2960
  color: var(--site-text-secondary);
2961
+ cursor: pointer;
2962
+ font-size: var(--text-xs);
2963
+ padding: 0;
2964
+ font-family: inherit;
1338
2965
  }
1339
2966
 
1340
- .compose-attachment-file-name {
1341
- font-size: 0.6875rem;
1342
- font-weight: 500;
2967
+ .compose-reply-toggle:hover {
1343
2968
  color: var(--site-text-primary);
1344
- max-width: 100%;
1345
- overflow: hidden;
1346
- text-overflow: ellipsis;
1347
- white-space: nowrap;
1348
- }
1349
-
1350
- .compose-attachment-file-size {
1351
- font-size: 0.625rem;
1352
- color: var(--site-text-secondary);
1353
2969
  }
1354
2970
 
1355
2971
  /* --- Alt text overlay panel (Threads-style, covers entire dialog) ------- */
@@ -1385,7 +3001,7 @@
1385
3001
  left: 50%;
1386
3002
  transform: translateX(-50%);
1387
3003
  font-size: var(--text-sm);
1388
- font-weight: 600;
3004
+ font-weight: var(--fw-semibold);
1389
3005
  letter-spacing: -0.005em;
1390
3006
  white-space: nowrap;
1391
3007
  }
@@ -1432,10 +3048,138 @@
1432
3048
  border-top: 1px solid var(--site-divider);
1433
3049
  }
1434
3050
 
1435
- @media (min-width: 700px) {
1436
- .compose-alt-footer {
1437
- padding: 8px 16px 12px;
1438
- }
3051
+ @media (min-width: 700px) {
3052
+ .compose-alt-footer {
3053
+ padding: 8px 16px 12px;
3054
+ }
3055
+ }
3056
+
3057
+ /* --- Drafts panel (browse saved drafts) --------------------------------- */
3058
+
3059
+ .compose-drafts-panel {
3060
+ position: absolute;
3061
+ inset: 0;
3062
+ z-index: 50;
3063
+ background-color: var(--site-elevated-bg);
3064
+ display: flex;
3065
+ flex-direction: column;
3066
+ border-radius: 10px;
3067
+ animation: compose-fade-up 0.28s cubic-bezier(0.22, 1, 0.36, 1) both;
3068
+ }
3069
+
3070
+ .compose-drafts-list {
3071
+ flex: 1;
3072
+ overflow-y: auto;
3073
+ }
3074
+
3075
+ .compose-drafts-list::-webkit-scrollbar {
3076
+ width: 3px;
3077
+ }
3078
+
3079
+ .compose-drafts-list::-webkit-scrollbar-thumb {
3080
+ background-color: var(--site-divider);
3081
+ border-radius: 3px;
3082
+ }
3083
+
3084
+ .compose-drafts-loading {
3085
+ display: flex;
3086
+ align-items: center;
3087
+ justify-content: center;
3088
+ padding: 48px 16px;
3089
+ color: var(--site-text-secondary);
3090
+ }
3091
+
3092
+ .compose-drafts-empty {
3093
+ display: flex;
3094
+ align-items: center;
3095
+ justify-content: center;
3096
+ padding: 48px 16px;
3097
+ color: var(--site-text-secondary);
3098
+ font-size: var(--text-sm);
3099
+ text-align: center;
3100
+ }
3101
+
3102
+ .compose-drafts-divider {
3103
+ height: 1px;
3104
+ background-color: var(--site-divider);
3105
+ margin: 0 16px;
3106
+ }
3107
+
3108
+ .compose-draft-item {
3109
+ display: flex;
3110
+ align-items: center;
3111
+ gap: 8px;
3112
+ padding: 12px 16px;
3113
+ cursor: pointer;
3114
+ transition: background-color 0.12s;
3115
+ }
3116
+
3117
+ .compose-draft-item:hover {
3118
+ background-color: var(--site-nav-hover-bg);
3119
+ }
3120
+
3121
+ .compose-draft-content {
3122
+ flex: 1;
3123
+ min-width: 0;
3124
+ }
3125
+
3126
+ .compose-draft-preview {
3127
+ font-size: var(--text-sm);
3128
+ color: var(--site-text-primary);
3129
+ display: -webkit-box;
3130
+ -webkit-line-clamp: 2;
3131
+ -webkit-box-orient: vertical;
3132
+ overflow: hidden;
3133
+ word-break: break-word;
3134
+ }
3135
+
3136
+ .compose-draft-preview-empty {
3137
+ font-style: italic;
3138
+ color: var(--site-text-secondary);
3139
+ }
3140
+
3141
+ .compose-draft-meta {
3142
+ font-size: var(--text-xs);
3143
+ color: var(--site-text-secondary);
3144
+ margin-top: 4px;
3145
+ }
3146
+
3147
+ .compose-draft-more {
3148
+ width: 32px;
3149
+ height: 32px;
3150
+ display: flex;
3151
+ align-items: center;
3152
+ justify-content: center;
3153
+ border: none;
3154
+ background: transparent;
3155
+ border-radius: 9999px;
3156
+ color: var(--site-text-secondary);
3157
+ cursor: pointer;
3158
+ flex-shrink: 0;
3159
+ transition: background-color 0.12s;
3160
+ }
3161
+
3162
+ .compose-draft-more:hover {
3163
+ background-color: var(--site-nav-hover-bg);
3164
+ }
3165
+
3166
+ .compose-attached-panel-back {
3167
+ width: 32px;
3168
+ height: 32px;
3169
+ display: flex;
3170
+ align-items: center;
3171
+ justify-content: center;
3172
+ border: none;
3173
+ background: transparent;
3174
+ border-radius: 9999px;
3175
+ color: var(--site-text-secondary);
3176
+ cursor: pointer;
3177
+ flex-shrink: 0;
3178
+ transition: background-color 0.12s;
3179
+ }
3180
+
3181
+ .compose-attached-panel-back:hover {
3182
+ background-color: var(--site-nav-hover-bg);
1439
3183
  }
1440
3184
 
1441
3185
  /* =========================================================================
@@ -1635,85 +3379,292 @@
1635
3379
  opacity: 0.85;
1636
3380
  }
1637
3381
 
1638
- /* --- Audio card (feed) -------------------------------------------------- */
3382
+ /* --- Audio card (Apple Music mini-player in 3:4 gallery card) ---------- */
3383
+ /* Compound selector overrides .media-gallery-card { display: block } */
3384
+
3385
+ .media-gallery-card.media-audio-card {
3386
+ display: flex;
3387
+ flex-direction: column;
3388
+ }
3389
+
3390
+ /* Hidden audio element */
3391
+ .media-audio-card .media-audio-el {
3392
+ position: absolute;
3393
+ width: 0;
3394
+ height: 0;
3395
+ opacity: 0;
3396
+ pointer-events: none;
3397
+ }
1639
3398
 
1640
- .media-audio-card {
3399
+ /* Artwork area — fills most of the card */
3400
+ .media-audio-card .media-audio-artwork {
3401
+ flex: 1;
3402
+ width: 100%;
1641
3403
  display: flex;
1642
3404
  align-items: center;
1643
- gap: 12px;
1644
- padding: 12px 16px;
1645
- background-color: var(--site-nav-hover-bg);
1646
- border-radius: var(--media-radius, 0.5rem);
1647
- margin-top: 0.75rem;
3405
+ justify-content: center;
3406
+ background: linear-gradient(
3407
+ 160deg,
3408
+ rgba(128, 128, 128, 0.12) 0%,
3409
+ rgba(128, 128, 128, 0.03) 100%
3410
+ );
3411
+ min-height: 0;
1648
3412
  }
1649
3413
 
1650
- .media-audio-icon {
1651
- flex-shrink: 0;
3414
+ .media-audio-card .media-audio-artwork svg {
3415
+ width: 32px;
3416
+ height: 32px;
1652
3417
  color: var(--site-text-secondary);
3418
+ opacity: 0.3;
1653
3419
  }
1654
3420
 
1655
- .media-audio-name {
1656
- font-size: var(--text-sm);
1657
- font-weight: 500;
1658
- color: var(--site-text-primary);
1659
- min-width: 0;
3421
+ /* Waveform canvas — replaces range slider in controls area */
3422
+ .media-audio-card .media-audio-waveform {
3423
+ display: none;
3424
+ width: 100%;
3425
+ height: 24px;
3426
+ cursor: pointer;
3427
+ touch-action: none;
3428
+ }
3429
+
3430
+ .media-audio-card.has-waveform .media-audio-waveform {
3431
+ display: block;
3432
+ }
3433
+
3434
+ /* Hide range slider when waveform is active (keep for screen readers) */
3435
+ .media-audio-card.has-waveform .media-audio-range {
3436
+ position: absolute;
3437
+ width: 1px;
3438
+ height: 1px;
1660
3439
  overflow: hidden;
1661
- text-overflow: ellipsis;
3440
+ clip: rect(0, 0, 0, 0);
1662
3441
  white-space: nowrap;
3442
+ border: 0;
3443
+ padding: 0;
3444
+ margin: -1px;
3445
+ }
3446
+
3447
+ /* Bottom control strip — compact, Apple Music style */
3448
+ .media-audio-card .media-audio-controls {
3449
+ flex-shrink: 0;
3450
+ display: flex;
3451
+ flex-direction: column;
3452
+ padding: 0 0 6px;
3453
+ }
3454
+
3455
+ /* Progress — native range input styled as thin track */
3456
+ .media-audio-card .media-audio-range {
3457
+ -webkit-appearance: none;
3458
+ appearance: none;
3459
+ width: 100%;
3460
+ height: 20px;
3461
+ background: transparent;
3462
+ cursor: pointer;
3463
+ margin: 0;
3464
+ padding: 0;
3465
+ touch-action: none;
3466
+ }
3467
+
3468
+ /* Track (WebKit / Blink) */
3469
+ .media-audio-card .media-audio-range::-webkit-slider-runnable-track {
3470
+ height: 3px;
3471
+ border-radius: 1.5px;
3472
+ background: rgba(128, 128, 128, 0.15);
3473
+ }
3474
+
3475
+ /* Track (Firefox) */
3476
+ .media-audio-card .media-audio-range::-moz-range-track {
3477
+ height: 3px;
3478
+ border-radius: 1.5px;
3479
+ background: rgba(128, 128, 128, 0.15);
3480
+ border: none;
3481
+ }
3482
+
3483
+ /* Filled portion (Firefox only — WebKit uses JS) */
3484
+ .media-audio-card .media-audio-range::-moz-range-progress {
3485
+ height: 3px;
3486
+ border-radius: 1.5px;
3487
+ background: var(--site-text-primary);
3488
+ }
3489
+
3490
+ /* Thumb (WebKit / Blink) */
3491
+ .media-audio-card .media-audio-range::-webkit-slider-thumb {
3492
+ -webkit-appearance: none;
3493
+ width: 10px;
3494
+ height: 10px;
3495
+ border-radius: 50%;
3496
+ background: var(--site-text-primary);
3497
+ margin-top: -3.5px;
3498
+ border: none;
3499
+ opacity: 0;
3500
+ transition: opacity 0.15s;
3501
+ }
3502
+
3503
+ .media-audio-card .media-audio-range:hover::-webkit-slider-thumb,
3504
+ .media-audio-card.is-playing .media-audio-range::-webkit-slider-thumb {
3505
+ opacity: 1;
3506
+ }
3507
+
3508
+ /* Thumb (Firefox) */
3509
+ .media-audio-card .media-audio-range::-moz-range-thumb {
3510
+ width: 10px;
3511
+ height: 10px;
3512
+ border-radius: 50%;
3513
+ background: var(--site-text-primary);
3514
+ border: none;
3515
+ opacity: 0;
3516
+ transition: opacity 0.15s;
3517
+ }
3518
+
3519
+ .media-audio-card .media-audio-range:hover::-moz-range-thumb,
3520
+ .media-audio-card.is-playing .media-audio-range::-moz-range-thumb {
3521
+ opacity: 1;
3522
+ }
3523
+
3524
+ /* Focus ring */
3525
+ .media-audio-card .media-audio-range:focus-visible {
3526
+ outline: 2px solid var(--site-text-primary);
3527
+ outline-offset: 2px;
3528
+ border-radius: 2px;
3529
+ }
3530
+
3531
+ /* Title + play button row */
3532
+ .media-audio-card .media-audio-row {
3533
+ display: flex;
3534
+ align-items: center;
3535
+ gap: 6px;
3536
+ padding: 6px 8px 0;
3537
+ min-width: 0;
1663
3538
  }
1664
3539
 
1665
- .media-audio-player {
3540
+ /* Left side: title + time stacked */
3541
+ .media-audio-card .media-audio-info {
1666
3542
  flex: 1;
1667
3543
  min-width: 0;
1668
- height: 32px;
3544
+ display: flex;
3545
+ flex-direction: column;
3546
+ gap: 1px;
1669
3547
  }
1670
3548
 
1671
- .media-audio-player audio {
1672
- width: 100%;
1673
- height: 32px;
3549
+ .media-audio-card .media-audio-title {
3550
+ font-size: 0.625rem;
3551
+ font-weight: var(--fw-medium, 500);
3552
+ color: var(--site-text-primary);
3553
+ overflow: hidden;
3554
+ text-overflow: ellipsis;
3555
+ white-space: nowrap;
3556
+ line-height: 1.3;
1674
3557
  }
1675
3558
 
1676
- /* --- PDF card (feed) ---------------------------------------------------- */
3559
+ .media-audio-card .media-audio-time {
3560
+ font-size: 0.5625rem;
3561
+ color: var(--site-text-secondary);
3562
+ line-height: 1;
3563
+ font-variant-numeric: tabular-nums;
3564
+ }
1677
3565
 
1678
- .media-pdf-card {
3566
+ /* Play / Pause — circular button on the right */
3567
+ .media-audio-card .media-audio-play-btn {
3568
+ width: 28px;
3569
+ height: 28px;
3570
+ border-radius: 50%;
3571
+ border: none;
3572
+ cursor: pointer;
1679
3573
  display: flex;
1680
3574
  align-items: center;
1681
- gap: 12px;
1682
- padding: 12px 16px;
1683
- background-color: var(--site-nav-hover-bg);
1684
- border-radius: var(--media-radius, 0.5rem);
1685
- margin-top: 0.75rem;
3575
+ justify-content: center;
3576
+ background: var(--site-text-primary);
3577
+ color: var(--background, #fff);
3578
+ flex-shrink: 0;
3579
+ transition: transform 0.12s ease;
3580
+ }
3581
+
3582
+ .media-audio-card .media-audio-play-btn:hover {
3583
+ transform: scale(1.1);
3584
+ }
3585
+
3586
+ .media-audio-card .media-audio-play-btn:active {
3587
+ transform: scale(0.92);
3588
+ }
3589
+
3590
+ .media-audio-card .media-audio-play-btn svg {
3591
+ width: 14px;
3592
+ height: 14px;
3593
+ }
3594
+
3595
+ /* Nudge play triangle right for optical centering */
3596
+ .media-audio-card .media-audio-icon-play {
3597
+ margin-left: 2px;
3598
+ }
3599
+
3600
+ /* Toggle: show play, hide pause by default */
3601
+ .media-audio-card .media-audio-icon-pause {
3602
+ display: none;
3603
+ }
3604
+
3605
+ .media-audio-card.is-playing .media-audio-icon-play {
3606
+ display: none;
3607
+ }
3608
+
3609
+ .media-audio-card.is-playing .media-audio-icon-pause {
3610
+ display: block;
3611
+ }
3612
+
3613
+ /* --- Gallery card tile (documents + texts in unified row) --------------- */
3614
+
3615
+ .media-gallery-card {
3616
+ display: block;
1686
3617
  text-decoration: none;
1687
3618
  color: var(--site-text-primary);
1688
- transition:
1689
- background-color 0.15s,
1690
- border-color 0.15s;
1691
- border: 1px solid transparent;
3619
+ border-radius: var(--media-radius, 0.5rem);
3620
+ overflow: hidden;
3621
+ background-color: var(--site-nav-hover-bg);
3622
+ border: 1px solid var(--site-divider);
3623
+ transition: background-color 0.15s;
1692
3624
  }
1693
3625
 
1694
- .media-pdf-card:hover {
1695
- border-color: var(--site-divider);
3626
+ a.media-gallery-card:hover,
3627
+ button.media-gallery-card:hover {
3628
+ background-color: var(--site-divider);
1696
3629
  }
1697
3630
 
1698
- .media-pdf-icon {
1699
- flex-shrink: 0;
3631
+ button.media-gallery-card {
3632
+ cursor: pointer;
3633
+ font: inherit;
3634
+ text-align: inherit;
3635
+ }
3636
+
3637
+ .media-gallery-card-inner {
3638
+ display: flex;
3639
+ flex-direction: column;
3640
+ align-items: center;
3641
+ justify-content: center;
3642
+ gap: 8px;
3643
+ width: 100%;
3644
+ height: 100%;
3645
+ padding: 16px 12px;
3646
+ text-align: center;
3647
+ }
3648
+
3649
+ .media-gallery-card-icon {
1700
3650
  color: var(--site-text-secondary);
3651
+ opacity: 0.6;
1701
3652
  }
1702
3653
 
1703
- .media-pdf-name {
1704
- font-size: var(--text-sm);
1705
- font-weight: 500;
1706
- min-width: 0;
3654
+ .media-gallery-card-summary {
3655
+ font-size: 0.6875rem;
3656
+ line-height: 1.4;
3657
+ color: var(--site-text-secondary);
1707
3658
  overflow: hidden;
1708
- text-overflow: ellipsis;
1709
- white-space: nowrap;
3659
+ display: -webkit-box;
3660
+ -webkit-line-clamp: 2;
3661
+ -webkit-box-orient: vertical;
3662
+ word-break: break-word;
1710
3663
  }
1711
3664
 
1712
- .media-pdf-size {
3665
+ .media-gallery-card-meta {
1713
3666
  font-size: 0.6875rem;
1714
3667
  color: var(--site-text-secondary);
1715
- flex-shrink: 0;
1716
- margin-left: auto;
1717
3668
  }
1718
3669
 
1719
3670
  /* --- Lightbox video ----------------------------------------------------- */
@@ -1734,6 +3685,115 @@
1734
3685
  }
1735
3686
  }
1736
3687
 
3688
+ /* --- Text preview dialog ------------------------------------------------ */
3689
+
3690
+ .text-preview-dialog {
3691
+ position: fixed;
3692
+ inset: 0;
3693
+ width: 100%;
3694
+ height: 100%;
3695
+ max-width: 100%;
3696
+ max-height: 100%;
3697
+ margin: 0;
3698
+ padding: 0;
3699
+ border: none;
3700
+ background: transparent;
3701
+ display: flex;
3702
+ align-items: center;
3703
+ justify-content: center;
3704
+ }
3705
+
3706
+ .text-preview-dialog[open] {
3707
+ animation: lightbox-fade-in 0.2s ease-out both;
3708
+ }
3709
+
3710
+ .text-preview-dialog::backdrop {
3711
+ background-color: rgba(0, 0, 0, 0.6);
3712
+ }
3713
+
3714
+ .text-preview-content {
3715
+ position: relative;
3716
+ background-color: var(--color-background);
3717
+ border-radius: var(--radius-lg);
3718
+ width: min(560px, 88vw);
3719
+ aspect-ratio: 3 / 4;
3720
+ max-height: 80vh;
3721
+ overflow-y: auto;
3722
+ padding: var(--space-xl);
3723
+ box-shadow: var(--shadow-lg);
3724
+ }
3725
+
3726
+ .text-preview-toolbar {
3727
+ position: sticky;
3728
+ top: 0;
3729
+ z-index: 1;
3730
+ display: flex;
3731
+ align-items: center;
3732
+ justify-content: flex-end;
3733
+ gap: 4px;
3734
+ padding-bottom: var(--space-sm);
3735
+ }
3736
+
3737
+ .text-preview-btn {
3738
+ display: flex;
3739
+ align-items: center;
3740
+ justify-content: center;
3741
+ width: 32px;
3742
+ height: 32px;
3743
+ border-radius: var(--radius-full);
3744
+ background-color: var(--color-muted);
3745
+ color: var(--color-muted-foreground);
3746
+ border: none;
3747
+ cursor: pointer;
3748
+ transition:
3749
+ background-color 0.15s,
3750
+ color 0.15s;
3751
+ }
3752
+
3753
+ .text-preview-btn:hover {
3754
+ background-color: var(--color-accent);
3755
+ color: var(--color-accent-foreground);
3756
+ }
3757
+
3758
+ .text-preview-btn:disabled {
3759
+ opacity: 0.4;
3760
+ cursor: default;
3761
+ }
3762
+
3763
+ .text-preview-loading {
3764
+ display: flex;
3765
+ align-items: center;
3766
+ justify-content: center;
3767
+ padding: var(--space-xl) 0;
3768
+ color: var(--color-muted-foreground);
3769
+ }
3770
+
3771
+ .text-preview-body {
3772
+ padding-top: var(--space-sm);
3773
+ line-height: 1.7;
3774
+ color: var(--color-foreground);
3775
+ }
3776
+
3777
+ @media (max-width: 640px) {
3778
+ .text-preview-content {
3779
+ width: 100vw;
3780
+ aspect-ratio: auto;
3781
+ max-height: 85vh;
3782
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
3783
+ margin-top: auto;
3784
+ }
3785
+
3786
+ .text-preview-dialog {
3787
+ align-items: flex-end;
3788
+ }
3789
+ }
3790
+
3791
+ /* --- Blurhash placeholder: loaded image covers background -------------- */
3792
+
3793
+ [data-post-media] img {
3794
+ background: transparent;
3795
+ }
3796
+
1737
3797
  /* =========================================================================
1738
3798
  * Site Footer
1739
3799
  * ========================================================================= */
@@ -1788,7 +3848,7 @@
1788
3848
  .compose-tiptap-body .tiptap h1 {
1789
3849
  font-family: var(--font-heading);
1790
3850
  font-size: 1.5rem;
1791
- font-weight: 600;
3851
+ font-weight: var(--fw-semibold);
1792
3852
  line-height: 1.3;
1793
3853
  margin: 0.75em 0 0.25em;
1794
3854
  }
@@ -1796,7 +3856,7 @@
1796
3856
  .compose-tiptap-body .tiptap h2 {
1797
3857
  font-family: var(--font-heading);
1798
3858
  font-size: 1.25rem;
1799
- font-weight: 600;
3859
+ font-weight: var(--fw-semibold);
1800
3860
  line-height: 1.35;
1801
3861
  margin: 0.75em 0 0.25em;
1802
3862
  }
@@ -1804,7 +3864,7 @@
1804
3864
  .compose-tiptap-body .tiptap h3 {
1805
3865
  font-family: var(--font-heading);
1806
3866
  font-size: 1.1rem;
1807
- font-weight: 600;
3867
+ font-weight: var(--fw-semibold);
1808
3868
  line-height: 1.4;
1809
3869
  margin: 0.75em 0 0.25em;
1810
3870
  }
@@ -1884,7 +3944,7 @@
1884
3944
  }
1885
3945
 
1886
3946
  .compose-tiptap-body .tiptap th {
1887
- font-weight: 600;
3947
+ font-weight: var(--fw-semibold);
1888
3948
  background: var(--site-elevated-bg);
1889
3949
  }
1890
3950
 
@@ -1906,8 +3966,10 @@
1906
3966
  --_img-toolbar-sep: oklch(1 0 0 / 0.15);
1907
3967
  }
1908
3968
 
1909
- :is(.dark, [data-theme="dark"]) .tiptap-image-figure {
1910
- --_img-toolbar-bg: oklch(0.32 0.01 260 / 0.88);
3969
+ @media (prefers-color-scheme: dark) {
3970
+ .tiptap-image-figure {
3971
+ --_img-toolbar-bg: oklch(0.32 0.01 260 / 0.88);
3972
+ }
1911
3973
  }
1912
3974
 
1913
3975
  .tiptap-image-container {
@@ -2049,7 +4111,7 @@
2049
4111
 
2050
4112
  .tiptap-image-alt-btn {
2051
4113
  font-size: 0.7rem;
2052
- font-weight: 600;
4114
+ font-weight: var(--fw-semibold);
2053
4115
  padding: 2px 6px;
2054
4116
  border-radius: 4px;
2055
4117
  border: 1px solid var(--site-divider);
@@ -2118,16 +4180,17 @@
2118
4180
  border-radius: 8px;
2119
4181
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
2120
4182
  padding: 4px;
2121
- min-width: 200px;
4183
+ min-width: 220px;
2122
4184
  max-height: 320px;
2123
4185
  overflow-y: auto;
4186
+ overscroll-behavior: contain;
2124
4187
  }
2125
4188
 
2126
4189
  .tiptap-slash-item {
2127
4190
  display: flex;
2128
4191
  align-items: center;
2129
4192
  gap: 10px;
2130
- padding: 8px 12px;
4193
+ padding: 6px 10px;
2131
4194
  border-radius: 6px;
2132
4195
  cursor: pointer;
2133
4196
  font-size: 0.875rem;
@@ -2144,13 +4207,25 @@
2144
4207
  display: flex;
2145
4208
  align-items: center;
2146
4209
  justify-content: center;
2147
- width: 24px;
2148
- height: 24px;
2149
- font-size: 0.8rem;
4210
+ width: 32px;
4211
+ height: 32px;
4212
+ border-radius: 6px;
4213
+ background: var(--site-nav-hover-bg);
2150
4214
  color: var(--site-text-secondary);
2151
4215
  flex-shrink: 0;
2152
4216
  }
2153
4217
 
4218
+ .tiptap-slash-item-icon svg {
4219
+ width: 18px;
4220
+ height: 18px;
4221
+ }
4222
+
4223
+ .tiptap-slash-item.is-selected .tiptap-slash-item-icon,
4224
+ .tiptap-slash-item:hover .tiptap-slash-item-icon {
4225
+ background: var(--site-divider);
4226
+ color: var(--site-text-primary);
4227
+ }
4228
+
2154
4229
  .tiptap-slash-item-label {
2155
4230
  flex: 1;
2156
4231
  }
@@ -2397,7 +4472,7 @@
2397
4472
  width: 100%;
2398
4473
  font-family: var(--font-heading);
2399
4474
  font-size: 1.5rem;
2400
- font-weight: 500;
4475
+ font-weight: var(--fw-medium);
2401
4476
  color: var(--site-text-primary);
2402
4477
  line-height: 1.3;
2403
4478
  }
@@ -2409,16 +4484,448 @@
2409
4484
 
2410
4485
  .compose-fullscreen .compose-tiptap-body .tiptap {
2411
4486
  min-height: 400px;
4487
+ padding-bottom: calc(100dvh - 150px);
4488
+ }
4489
+
4490
+ /* =========================================================================
4491
+ * Archive Page
4492
+ * ========================================================================= */
4493
+
4494
+ /* --- Filter bar (single row of BaseCoat selects) ----------------------- */
4495
+
4496
+ .archive-filters {
4497
+ display: flex;
4498
+ align-items: center;
4499
+ gap: 12px;
4500
+ }
4501
+
4502
+ .archive-filters-chips {
4503
+ display: flex;
4504
+ flex-wrap: wrap;
4505
+ align-items: center;
4506
+ gap: 6px;
4507
+ flex: 1;
4508
+ min-width: 0;
4509
+ }
4510
+
4511
+ /* --- Chip select -------------------------------------------------------- */
4512
+
4513
+ .archive-chip-select {
4514
+ position: relative;
4515
+ display: inline-flex;
4516
+ align-items: center;
4517
+ }
4518
+
4519
+ .archive-chip {
4520
+ display: inline-flex;
4521
+ align-items: center;
4522
+ gap: 5px;
4523
+ height: 2rem;
4524
+ padding: 0 10px;
4525
+ border: 1px solid var(--border);
4526
+ border-radius: 9999px;
4527
+ background: var(--background);
4528
+ color: var(--site-text-primary);
4529
+ font-size: var(--text-sm);
4530
+ cursor: pointer;
4531
+ transition:
4532
+ background 0.15s ease,
4533
+ border-color 0.15s ease;
4534
+ white-space: nowrap;
4535
+ }
4536
+
4537
+ .archive-chip:hover {
4538
+ background: var(--secondary);
4539
+ }
4540
+
4541
+ .archive-chip-active {
4542
+ padding-right: 6px;
4543
+ }
4544
+
4545
+ .archive-chip-label {
4546
+ max-width: 120px;
4547
+ overflow: hidden;
4548
+ text-overflow: ellipsis;
4549
+ white-space: nowrap;
4550
+ font-size: var(--text-sm);
4551
+ }
4552
+
4553
+ .archive-chip-clear {
4554
+ display: inline-flex;
4555
+ align-items: center;
4556
+ justify-content: center;
4557
+ width: 18px;
4558
+ height: 18px;
4559
+ border-radius: 9999px;
4560
+ color: var(--muted-foreground);
4561
+ transition:
4562
+ background 0.15s ease,
4563
+ color 0.15s ease;
4564
+ }
4565
+
4566
+ .archive-chip-clear:hover {
4567
+ background: var(--destructive);
4568
+ color: var(--destructive-foreground);
4569
+ }
4570
+
4571
+ .archive-chip-select.select [data-popover] [role="option"] {
4572
+ cursor: pointer;
4573
+ }
4574
+
4575
+ .archive-chip-sep {
4576
+ border: none;
4577
+ border-top: 1px solid var(--border);
4578
+ margin: 4px -4px;
4579
+ }
4580
+
4581
+ /* --- View toggle -------------------------------------------------------- */
4582
+
4583
+ .archive-view-toggle {
4584
+ display: flex;
4585
+ align-items: center;
4586
+ background: var(--secondary);
4587
+ border-radius: 9999px;
4588
+ padding: 3px;
4589
+ flex-shrink: 0;
4590
+ }
4591
+
4592
+ .archive-view-btn {
4593
+ display: inline-flex;
4594
+ align-items: center;
4595
+ justify-content: center;
4596
+ width: 2rem;
4597
+ height: 2rem;
4598
+ border-radius: 9999px;
4599
+ color: var(--muted-foreground);
4600
+ transition:
4601
+ background 0.15s ease,
4602
+ color 0.15s ease;
4603
+ }
4604
+
4605
+ .archive-view-btn:hover {
4606
+ color: var(--site-text-primary);
4607
+ }
4608
+
4609
+ .archive-view-btn-active {
4610
+ background: var(--background);
4611
+ color: var(--site-text-primary);
4612
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
4613
+ }
4614
+
4615
+ /* --- Grid --------------------------------------------------------------- */
4616
+
4617
+ .archive-grid-wrapper {
4618
+ width: 100vw;
4619
+ position: relative;
4620
+ left: 50%;
4621
+ margin-left: -50vw;
4622
+ padding: 16px var(--site-padding);
2412
4623
  }
2413
4624
 
2414
- .compose-fullscreen-plus-menu {
4625
+ .archive-grid {
4626
+ display: grid;
4627
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
4628
+ gap: 8px;
4629
+ }
4630
+
4631
+ @media (min-width: 700px) {
4632
+ .archive-grid {
4633
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
4634
+ gap: 10px;
4635
+ }
4636
+ }
4637
+
4638
+ /* --- Tiles -------------------------------------------------------------- */
4639
+
4640
+ .archive-tile {
2415
4641
  position: relative;
4642
+ aspect-ratio: 1;
4643
+ overflow: hidden;
4644
+ border-radius: 6px;
4645
+ transition:
4646
+ border-color 0.2s ease,
4647
+ opacity 0.15s ease;
4648
+ display: block;
4649
+ text-decoration: none;
4650
+ color: inherit;
4651
+ background: var(--secondary);
4652
+ border: 1px solid oklch(from var(--border) l c h / 0.5);
4653
+ }
4654
+
4655
+ .archive-tile:hover {
4656
+ border-color: var(--border);
2416
4657
  }
2417
4658
 
2418
- .compose-fullscreen-plus-dropdown {
4659
+ /* Hover date label (bottom-left) */
4660
+ .archive-tile-date {
2419
4661
  position: absolute;
2420
- top: 100%;
2421
- left: 0;
2422
- margin-top: 4px;
4662
+ bottom: 6px;
4663
+ right: 6px;
4664
+ z-index: 1;
4665
+ font-size: 0.625rem;
4666
+ font-weight: var(--fw-medium);
4667
+ padding: 2px 6px;
4668
+ border-radius: 3px;
4669
+ background: var(--background);
4670
+ color: var(--site-text-secondary);
4671
+ opacity: 0;
4672
+ transition: opacity 0.15s ease;
4673
+ pointer-events: none;
4674
+ }
4675
+
4676
+ .archive-tile:hover .archive-tile-date {
4677
+ opacity: 1;
4678
+ }
4679
+
4680
+ .archive-tile-mixed .archive-tile-date,
4681
+ .archive-tile-image .archive-tile-date {
4682
+ background: rgba(0, 0, 0, 0.6);
4683
+ color: #fff;
4684
+ }
4685
+
4686
+ /* Inline link format indicator (before title text) */
4687
+ .archive-tile-link-indicator {
4688
+ display: inline;
4689
+ vertical-align: middle;
4690
+ margin-right: 3px;
4691
+ color: var(--muted-foreground);
4692
+ }
4693
+
4694
+ .archive-tile-link-indicator > svg {
4695
+ display: inline;
4696
+ width: 11px;
4697
+ height: 11px;
4698
+ vertical-align: -1px;
4699
+ }
4700
+
4701
+ .archive-tile-mixed .archive-tile-link-indicator {
4702
+ color: rgba(255, 255, 255, 0.7);
4703
+ }
4704
+
4705
+ /* Centered video play overlay */
4706
+ .archive-tile-badge {
4707
+ position: absolute;
4708
+ z-index: 1;
4709
+ line-height: 0;
4710
+ pointer-events: none;
4711
+ }
4712
+
4713
+ .archive-tile-badge > svg {
4714
+ display: block;
4715
+ }
4716
+
4717
+ .archive-tile-badge-center {
4718
+ inset: 0;
4719
+ display: flex;
4720
+ align-items: center;
4721
+ justify-content: center;
4722
+ color: #fff;
4723
+ filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.5));
4724
+ }
4725
+
4726
+ .archive-tile-badge-center > svg {
4727
+ width: 36px;
4728
+ height: 36px;
4729
+ }
4730
+
4731
+ /* Badge row pinned to bottom-right of content */
4732
+ .archive-tile-badge-row {
4733
+ flex-shrink: 0;
4734
+ margin-top: auto;
4735
+ align-self: flex-start;
4736
+ line-height: 0;
4737
+ color: var(--muted-foreground);
4738
+ }
4739
+
4740
+ .archive-tile-badge-row > svg {
4741
+ width: 14px;
4742
+ height: 14px;
4743
+ }
4744
+
4745
+ /* Badge row on image-bg tiles: white */
4746
+ .archive-tile-mixed .archive-tile-badge-row,
4747
+ .archive-tile-image .archive-tile-badge-row {
4748
+ position: relative;
4749
+ color: rgba(255, 255, 255, 0.8);
4750
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.4));
4751
+ }
4752
+
4753
+ .archive-tile-bg {
4754
+ position: absolute;
4755
+ inset: 0;
4756
+ object-fit: cover;
4757
+ width: 100%;
4758
+ height: 100%;
4759
+ }
4760
+
4761
+ .archive-tile-content {
4762
+ position: relative;
4763
+ display: flex;
4764
+ flex-direction: column;
4765
+ justify-content: flex-end;
4766
+ height: 100%;
4767
+ padding: 10px;
4768
+ overflow: hidden;
4769
+ }
4770
+
4771
+ .archive-tile-title {
4772
+ display: -webkit-box;
4773
+ -webkit-line-clamp: 2;
4774
+ -webkit-box-orient: vertical;
4775
+ overflow: hidden;
4776
+ flex-shrink: 0;
4777
+ font-size: 0.75rem;
4778
+ font-weight: var(--fw-semibold);
4779
+ line-height: 1.4;
4780
+ margin-bottom: 2px;
4781
+ }
4782
+
4783
+ .archive-tile-summary {
4784
+ flex: 1;
4785
+ min-height: 0;
4786
+ overflow: hidden;
4787
+ font-size: 0.75rem;
4788
+ line-height: 1.45;
4789
+ mask-image: linear-gradient(
4790
+ to bottom,
4791
+ #000 calc(100% - 1.2em),
4792
+ transparent
4793
+ );
4794
+ -webkit-mask-image: linear-gradient(
4795
+ to bottom,
4796
+ #000 calc(100% - 1.2em),
4797
+ transparent
4798
+ );
4799
+ }
4800
+
4801
+ /* Muted summary when title is present */
4802
+ .archive-tile-title + .archive-tile-summary {
4803
+ color: var(--muted-foreground);
4804
+ }
4805
+
4806
+ /* --- Text tile ---------------------------------------------------------- */
4807
+
4808
+ .archive-tile-text {
4809
+ background: var(--card);
4810
+ }
4811
+
4812
+ .archive-tile-text .archive-tile-content {
4813
+ justify-content: flex-start;
4814
+ padding: 12px;
4815
+ }
4816
+
4817
+ .archive-tile-text .archive-tile-title {
4818
+ color: var(--site-text-primary);
4819
+ }
4820
+
4821
+ .archive-tile-text .archive-tile-summary {
4822
+ color: var(--site-text-primary);
4823
+ }
4824
+
4825
+ /* --- Image tile: badge row only, pinned to bottom ----------------------- */
4826
+
4827
+ .archive-tile-image .archive-tile-content {
4828
+ justify-content: flex-end;
4829
+ padding: 8px;
4830
+ }
4831
+
4832
+ /* --- Mixed tile: image bg + gradient + white text ----------------------- */
4833
+
4834
+ .archive-tile-mixed .archive-tile-content::before {
4835
+ content: "";
4836
+ position: absolute;
4837
+ inset: 0;
4838
+ background: linear-gradient(
4839
+ to top,
4840
+ rgba(0, 0, 0, 0.65) 0%,
4841
+ transparent 60%
4842
+ );
4843
+ pointer-events: none;
4844
+ }
4845
+
4846
+ .archive-tile-mixed .archive-tile-title,
4847
+ .archive-tile-mixed .archive-tile-summary {
4848
+ position: relative;
4849
+ color: #fff;
4850
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
4851
+ /* Override flex-fill: fixed 2 lines on image bg */
4852
+ flex: none;
4853
+ display: -webkit-box;
4854
+ -webkit-line-clamp: 2;
4855
+ -webkit-box-orient: vertical;
4856
+ mask-image: none;
4857
+ -webkit-mask-image: none;
4858
+ }
4859
+
4860
+ .archive-tile-mixed .archive-tile-title + .archive-tile-summary {
4861
+ color: rgba(255, 255, 255, 0.8);
4862
+ }
4863
+
4864
+ /* --- Quote tile: centered italic text ----------------------------------- */
4865
+
4866
+ .archive-tile-quote {
4867
+ background: var(--accent);
4868
+ }
4869
+
4870
+ .archive-tile-quote .archive-tile-content {
4871
+ justify-content: center;
4872
+ align-items: center;
4873
+ text-align: center;
4874
+ padding: 14px;
4875
+ }
4876
+
4877
+ .archive-tile-quote .archive-tile-summary {
4878
+ flex: unset;
4879
+ font-style: italic;
4880
+ font-family: var(--font-heading);
4881
+ color: var(--site-text-primary);
4882
+ }
4883
+
4884
+ /* --- Month header in grid ------------------------------------------------ */
4885
+
4886
+ .archive-month-header {
4887
+ grid-column: 1 / -1;
4888
+ font-size: 0.6875rem;
4889
+ font-weight: var(--fw-semibold);
4890
+ color: var(--site-text-secondary);
4891
+ text-transform: uppercase;
4892
+ letter-spacing: 0.06em;
4893
+ padding: 20px 2px 4px;
4894
+ }
4895
+
4896
+ .archive-month-header:first-child {
4897
+ padding-top: 4px;
4898
+ }
4899
+
4900
+ /* --- List view month headers --------------------------------------------- */
4901
+
4902
+ .archive-list-groups {
4903
+ display: flex;
4904
+ flex-direction: column;
4905
+ gap: 2.75rem;
4906
+ }
4907
+
4908
+ .archive-list-month-header {
4909
+ display: flex;
4910
+ align-items: center;
4911
+ gap: 10px;
4912
+ font-size: 0.75rem;
4913
+ font-weight: var(--fw-semibold);
4914
+ color: var(--site-text-secondary);
4915
+ text-transform: uppercase;
4916
+ letter-spacing: 0.06em;
4917
+ padding: 0;
4918
+ margin-bottom: 16px;
4919
+ white-space: nowrap;
4920
+ }
4921
+
4922
+ .archive-list-month-header::before {
4923
+ content: "";
4924
+ width: 6px;
4925
+ height: 6px;
4926
+ border-radius: 9999px;
4927
+ background: var(--site-text-secondary);
4928
+ flex-shrink: 0;
4929
+ opacity: 0.4;
2423
4930
  }
2424
4931
  }