@acms-subir/core 0.2.0 → 0.3.1

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 (254) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/cli/common.mjs +35 -0
  3. package/cli/legacy.mjs +317 -0
  4. package/cli/main.mjs +66 -0
  5. package/cli/palette.mjs +4 -0
  6. package/cli/preview.mjs +50 -0
  7. package/cli/remote.mjs +55 -0
  8. package/cli/themes.mjs +127 -0
  9. package/cli.mjs +2 -369
  10. package/deploy/Caddyfile +8 -0
  11. package/deploy/Dockerfile +34 -0
  12. package/deploy/compose.https.yml +21 -0
  13. package/deploy/compose.yml +46 -0
  14. package/docs/live-video.md +91 -0
  15. package/docs/theme-authoring.md +103 -0
  16. package/email-runner.mjs +32 -0
  17. package/integration.mjs +189 -2
  18. package/ops-check.mjs +27 -0
  19. package/package.json +27 -5
  20. package/src/actions/index.ts +578 -49
  21. package/src/components/AiCleaner.tsx +291 -0
  22. package/src/components/AiSettings.tsx +575 -0
  23. package/src/components/CommandPalette.tsx +200 -0
  24. package/src/components/ContentList.astro +246 -0
  25. package/src/components/DesignAccess.tsx +182 -0
  26. package/src/components/DesignManager.tsx +418 -46
  27. package/src/components/EmailSettings.tsx +521 -0
  28. package/src/components/EventPage.astro +178 -0
  29. package/src/components/LegalPage.astro +27 -0
  30. package/src/components/LinksManager.tsx +119 -58
  31. package/src/components/LiveCard.astro +174 -0
  32. package/src/components/LiveManager.tsx +910 -0
  33. package/src/components/NavManager.tsx +42 -43
  34. package/src/components/ThemeScript.astro +50 -0
  35. package/src/components/ThemeSections.astro +58 -0
  36. package/src/components/ThemeSectionsEditor.tsx +513 -0
  37. package/src/components/WidgetRenderer.astro +3 -0
  38. package/src/components/booking/BookingFlow.astro +150 -0
  39. package/src/components/booking/HoursEditor.astro +63 -0
  40. package/src/components/builder/PageBuilder.tsx +10 -2
  41. package/src/components/editor/EventPanel.tsx +401 -0
  42. package/src/components/editor/FormatDock.tsx +81 -0
  43. package/src/components/editor/LivePane.tsx +122 -0
  44. package/src/components/editor/MobileToolbar.tsx +93 -0
  45. package/src/components/editor/PostEditor.tsx +605 -223
  46. package/src/components/editor/PreviewOverlay.tsx +242 -43
  47. package/src/components/editor/extensions/calendar.tsx +51 -7
  48. package/src/components/editor/extensions/events.tsx +153 -0
  49. package/src/components/editor/extensions/slash.tsx +7 -1
  50. package/src/components/site/Pager.astro +24 -0
  51. package/src/components/site/PostCard.astro +64 -0
  52. package/src/components/site/TagLabel.astro +11 -0
  53. package/src/layouts/Admin.astro +289 -49
  54. package/src/layouts/Site.astro +352 -59
  55. package/src/lib/agent-api.ts +13 -0
  56. package/src/lib/agent-discovery.ts +40 -0
  57. package/src/lib/agent.ts +114 -0
  58. package/src/lib/ai-config.ts +58 -0
  59. package/src/lib/ai-schema.ts +22 -0
  60. package/src/lib/ai.ts +90 -0
  61. package/src/lib/api-keys.ts +65 -0
  62. package/src/lib/api.ts +56 -0
  63. package/src/lib/auth.ts +25 -5
  64. package/src/lib/backup/content.ts +36 -0
  65. package/src/lib/backup/unzip.ts +12 -1
  66. package/src/lib/backup/zip.ts +1 -1
  67. package/src/lib/booking/agent.ts +108 -0
  68. package/src/lib/booking/availability.ts +221 -0
  69. package/src/lib/booking/emails.ts +115 -0
  70. package/src/lib/booking/forms.ts +77 -0
  71. package/src/lib/booking/service.ts +277 -0
  72. package/src/lib/booking/view.ts +54 -0
  73. package/src/lib/calendar/agent-schema.ts +48 -0
  74. package/src/lib/calendar/agent.ts +136 -0
  75. package/src/lib/calendar/api.ts +81 -0
  76. package/src/lib/calendar/cards.ts +102 -0
  77. package/src/lib/calendar/config.ts +52 -0
  78. package/src/lib/calendar/data.ts +130 -0
  79. package/src/lib/calendar/events.ts +261 -0
  80. package/src/lib/calendar/feeds.ts +43 -0
  81. package/src/lib/calendar/hooks.ts +38 -0
  82. package/src/lib/calendar/http.ts +30 -0
  83. package/src/lib/calendar/ics-write.ts +120 -0
  84. package/src/lib/calendar/ics.ts +15 -5
  85. package/src/lib/calendar/import.ts +203 -0
  86. package/src/lib/calendar/render.ts +120 -37
  87. package/src/lib/calendar/rrule.ts +149 -0
  88. package/src/lib/calendar/seo.ts +48 -0
  89. package/src/lib/design-service.ts +58 -0
  90. package/src/lib/designDiff.ts +145 -0
  91. package/src/lib/designPreview.ts +110 -12
  92. package/src/lib/documents/cleanup.ts +31 -0
  93. package/src/lib/documents/extract.ts +154 -0
  94. package/src/lib/documents/vendor.d.ts +4 -0
  95. package/src/lib/drafts.ts +60 -6
  96. package/src/lib/dynamicBlocks.ts +40 -8
  97. package/src/lib/email/accounts.ts +55 -0
  98. package/src/lib/email/config.ts +86 -0
  99. package/src/lib/email/migration.ts +24 -0
  100. package/src/lib/email/providers.ts +89 -0
  101. package/src/lib/email/service.ts +78 -0
  102. package/src/lib/email/store.ts +167 -0
  103. package/src/lib/email/templates.ts +18 -0
  104. package/src/lib/email/types.ts +32 -0
  105. package/src/lib/email/webhooks.ts +87 -0
  106. package/src/lib/email.ts +15 -0
  107. package/src/lib/env.ts +1 -1
  108. package/src/lib/legal/index.ts +25 -0
  109. package/src/lib/live/client.ts +88 -0
  110. package/src/lib/live/crypto.ts +28 -0
  111. package/src/lib/live/migration.ts +15 -0
  112. package/src/lib/live/providers.ts +152 -0
  113. package/src/lib/live/service.ts +170 -0
  114. package/src/lib/live/signals.ts +89 -0
  115. package/src/lib/live/store.ts +49 -0
  116. package/src/lib/live/types.ts +52 -0
  117. package/src/lib/live/view.ts +78 -0
  118. package/src/lib/mobile/bookings.ts +73 -0
  119. package/src/lib/mobile/calendar.ts +85 -0
  120. package/src/lib/mobile/content.ts +85 -0
  121. package/src/lib/mobile/http.ts +63 -0
  122. package/src/lib/mobile/route.ts +20 -0
  123. package/src/lib/ops.ts +8 -0
  124. package/src/lib/preview.ts +21 -1
  125. package/src/lib/repo/migrations.ts +221 -0
  126. package/src/lib/repo/sql.ts +907 -68
  127. package/src/lib/repo/types.ts +125 -5
  128. package/src/lib/scheduler.ts +27 -0
  129. package/src/lib/schema.ts +316 -1
  130. package/src/lib/search-i18n.ts +3 -0
  131. package/src/lib/socialIcons.ts +32 -0
  132. package/src/lib/tagColor.ts +11 -0
  133. package/src/lib/theme.ts +59 -40
  134. package/src/lib/themeTokens.ts +183 -0
  135. package/src/lib/umami.ts +108 -0
  136. package/src/lib/webhook-sql.ts +68 -0
  137. package/src/lib/webhooks.ts +147 -0
  138. package/src/lib/widgets.ts +1 -0
  139. package/src/middleware.ts +45 -3
  140. package/src/pages/404.astro +23 -0
  141. package/src/pages/[...slug].astro +14 -5
  142. package/src/pages/account/[action].astro +53 -0
  143. package/src/pages/admin/ai.astro +12 -0
  144. package/src/pages/admin/c/[collection]/[id].astro +4 -1
  145. package/src/pages/admin/c/[collection]/index.astro +127 -92
  146. package/src/pages/admin/calendar/bookings.astro +400 -0
  147. package/src/pages/admin/calendar/calendars.astro +265 -0
  148. package/src/pages/admin/calendar/events/[id].astro +56 -0
  149. package/src/pages/admin/calendar/events/index.astro +408 -0
  150. package/src/pages/admin/calendar/index.ts +4 -0
  151. package/src/pages/admin/calendar/integrations.astro +4 -0
  152. package/src/pages/admin/calendar/resources/[id].astro +180 -0
  153. package/src/pages/admin/calendar/resources/index.astro +106 -0
  154. package/src/pages/admin/calendar/resources/link.astro +196 -0
  155. package/src/pages/admin/design.astro +10 -3
  156. package/src/pages/admin/email.astro +13 -0
  157. package/src/pages/admin/index.astro +232 -85
  158. package/src/pages/admin/integrations.astro +237 -0
  159. package/src/pages/admin/links.astro +3 -3
  160. package/src/pages/admin/live.astro +12 -0
  161. package/src/pages/admin/login.astro +14 -10
  162. package/src/pages/admin/navigation.astro +8 -2
  163. package/src/pages/admin/pages/[id].astro +4 -1
  164. package/src/pages/admin/pages/index.astro +41 -48
  165. package/src/pages/admin/settings.astro +418 -367
  166. package/src/pages/admin/tags.astro +4 -4
  167. package/src/pages/admin/users.astro +38 -28
  168. package/src/pages/api/agent/docs.ts +33 -0
  169. package/src/pages/api/agent/index.ts +21 -0
  170. package/src/pages/api/ai/clean.ts +13 -0
  171. package/src/pages/api/ai/draft.ts +14 -0
  172. package/src/pages/api/ai/settings.ts +53 -0
  173. package/src/pages/api/ai/test.ts +12 -0
  174. package/src/pages/api/backup.ts +8 -21
  175. package/src/pages/api/calendar/availability.ts +35 -0
  176. package/src/pages/api/calendar/bookings/[id].ts +49 -0
  177. package/src/pages/api/calendar/bookings/index.ts +73 -0
  178. package/src/pages/api/calendar/calendars.ts +35 -0
  179. package/src/pages/api/calendar/docs.ts +66 -0
  180. package/src/pages/api/calendar/events/[id].ts +63 -0
  181. package/src/pages/api/calendar/events/index.ts +112 -0
  182. package/src/pages/api/calendar/resources.ts +34 -0
  183. package/src/pages/api/design/capabilities.ts +10 -0
  184. package/src/pages/api/design/index.ts +58 -0
  185. package/src/pages/api/design/keys.ts +24 -0
  186. package/src/pages/api/design/media.ts +32 -0
  187. package/src/pages/api/email/run.ts +11 -0
  188. package/src/pages/api/email/settings.ts +61 -0
  189. package/src/pages/api/email/webhooks/[provider].ts +4 -0
  190. package/src/pages/api/live/oauth/youtube/callback.ts +19 -0
  191. package/src/pages/api/live/settings.ts +45 -0
  192. package/src/pages/api/live/status.ts +7 -0
  193. package/src/pages/api/live/thumb.ts +48 -0
  194. package/src/pages/api/mcp.ts +59 -0
  195. package/src/pages/api/media/upload.ts +2 -2
  196. package/src/pages/api/ops/status.ts +39 -0
  197. package/src/pages/api/restore.ts +27 -37
  198. package/src/pages/api/search.ts +18 -4
  199. package/src/pages/api/v1/availability.ts +7 -0
  200. package/src/pages/api/v1/bookings.ts +17 -0
  201. package/src/pages/api/v1/calendars.ts +7 -0
  202. package/src/pages/api/v1/content/[id].ts +7 -0
  203. package/src/pages/api/v1/content/index.ts +7 -0
  204. package/src/pages/api/v1/events.ts +7 -0
  205. package/src/pages/api/v1/resources.ts +7 -0
  206. package/src/pages/api/webhooks/docs.ts +61 -0
  207. package/src/pages/author/[slug].astro +43 -35
  208. package/src/pages/blog/[slug].astro +137 -66
  209. package/src/pages/blog/index.astro +95 -30
  210. package/src/pages/blog/tag/[slug].astro +45 -40
  211. package/src/pages/book/[resource]/[link].astro +70 -0
  212. package/src/pages/book/[resource]/index.astro +63 -0
  213. package/src/pages/book/[resource].ics.ts +38 -0
  214. package/src/pages/book/index.astro +47 -0
  215. package/src/pages/book/manage/[token].astro +108 -0
  216. package/src/pages/calendar/[slug].ics.ts +27 -0
  217. package/src/pages/calendar/feed.ics.ts +15 -0
  218. package/src/pages/calendar/index.astro +191 -0
  219. package/src/pages/embed/book/[resource]/[link].astro +33 -0
  220. package/src/pages/embed/calendar/[slug].astro +43 -0
  221. package/src/pages/events/[slug].astro +74 -0
  222. package/src/pages/events/[slug].ics.ts +25 -0
  223. package/src/pages/index.astro +12 -3
  224. package/src/pages/legal/privacy.astro +4 -0
  225. package/src/pages/legal/terms.astro +4 -0
  226. package/src/pages/links.astro +29 -3
  227. package/src/pages/llms.txt.ts +4 -0
  228. package/src/pages/preview/[type]/[id].astro +27 -6
  229. package/src/pages/search.astro +40 -20
  230. package/src/pages/sitemap.xml.ts +16 -1
  231. package/src/styles/admin.css +924 -105
  232. package/src/styles/cards.css +92 -74
  233. package/src/styles/editor.css +492 -114
  234. package/src/styles/email-settings.css +117 -0
  235. package/src/styles/live-admin.css +126 -0
  236. package/src/styles/live.css +199 -0
  237. package/src/styles/sections.css +12 -0
  238. package/src/styles/site.css +938 -281
  239. package/src/styles/theme-editor.css +135 -0
  240. package/src/theme-sdk/contract.d.mts +619 -0
  241. package/src/theme-sdk/contract.mjs +81 -0
  242. package/src/theme-sdk/index.ts +15 -0
  243. package/src/theme-sdk/tokens.d.mts +148 -0
  244. package/src/theme-sdk/tokens.mjs +55 -0
  245. package/src/themes/editorial/templates/home.astro +4 -4
  246. package/src/themes/editorial/templates/post-minimal.astro +2 -2
  247. package/src/themes/editorial/theme.css +27 -37
  248. package/src/themes/editorial/theme.json +25 -3
  249. package/src/themes/field/theme.json +27 -9
  250. package/src/themes/ink/theme.json +30 -12
  251. package/src/themes/night/theme.css +4 -7
  252. package/src/themes/night/theme.json +28 -10
  253. package/src/virtual.d.ts +14 -0
  254. package/src/worker.ts +5 -1
@@ -1,16 +1,23 @@
1
- /* Post editor — full-screen Ghost-style writing surface on the Two-Tone Studio
1
+ /* Post editor — full-screen Ghost-style writing surface on the Inset Paper
2
2
  tokens. Relies on :root variables from admin.css. */
3
3
 
4
4
  .pe-shell { height: 100vh; background: var(--bg); display: flex; flex-direction: column; }
5
5
 
6
- /* top bar */
6
+ /* top bar: back + status | Write/Split/Preview | publish + settings */
7
7
  .pe-topbar {
8
- display: flex; align-items: center; justify-content: space-between; gap: 12px;
9
- padding: 10px 18px; border-bottom: 1px solid var(--line);
10
- position: sticky; top: 0; background: rgb(238 240 244 / 88%); backdrop-filter: blur(8px); z-index: 30;
11
- }
12
- .pe-topbar-left, .pe-topbar-right { display: flex; align-items: center; gap: 10px; }
13
- .pe-savestate { font-size: 12.5px; color: var(--faint); }
8
+ display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 12px;
9
+ height: 52px; padding: 0 14px; flex: 0 0 auto;
10
+ position: sticky; top: 0; background: var(--bg); z-index: 30;
11
+ transition: background-color 0.2s;
12
+ }
13
+ .pe-topbar-left, .pe-topbar-right { display: flex; align-items: center; gap: 8px; min-width: 0; }
14
+ .pe-topbar-right { justify-content: flex-end; }
15
+ .pe-savestate { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
16
+ .pe-save-dot { flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%; background: var(--green); transition: background-color 0.2s; }
17
+ .pe-savestate.dirty .pe-save-dot, .pe-savestate.saving .pe-save-dot { background: var(--amber); }
18
+ .pe-savestate.error .pe-save-dot { background: var(--red); }
19
+ .pe-modes button { padding: 4px 11px; }
20
+ .pe-icon-btn { padding: 5px 7px; }
14
21
  .pe-edited-dot { font-style: normal; font-weight: 600; color: var(--amber); }
15
22
  .pe-savestate.dirty { color: var(--muted); }
16
23
  .pe-savestate.saving { color: var(--muted); }
@@ -22,38 +29,41 @@
22
29
  background: var(--panel); color: var(--text);
23
30
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
24
31
  padding: 6px 13px; font-size: 13px; font-weight: 600;
25
- cursor: pointer; font-family: inherit; text-decoration: none;
32
+ cursor: pointer; font-family: inherit; text-decoration: none; white-space: nowrap;
26
33
  box-shadow: var(--shadow-sm);
27
34
  }
28
35
  .pe-btn:hover { border-color: var(--faint); }
29
- .pe-btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
36
+ .pe-btn.primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
30
37
  .pe-btn.primary:hover { background: var(--accent-strong); border-color: var(--accent-strong); }
31
38
  .pe-btn.primary:disabled { opacity: 0.5; cursor: default; }
32
39
  .pe-btn.sm { padding: 3px 10px; font-size: 12.5px; }
33
40
  .pe-btn.ghost { background: transparent; border-color: transparent; color: var(--muted); box-shadow: none; }
34
- .pe-btn.ghost:hover, .pe-btn.ghost.is-active { color: var(--text); background: rgb(26 29 37 / 5%); }
41
+ .pe-btn.ghost:hover, .pe-btn.ghost.is-active { color: var(--text); background: var(--hover); }
35
42
  .pe-btn.danger { color: var(--red); }
36
43
 
37
- /* layout */
38
- .pe-body { flex: 1; display: flex; min-height: 0; }
44
+ /* layout — Write: one full paper page. Split (≥901px): the editor and the
45
+ live site sit on two rounded sheets inside the stone shell. */
46
+ .pe-body { flex: 1; display: flex; min-height: 0; transition: background-color 0.2s; }
47
+ .pe-editor-pane { flex: 1; min-width: 0; display: flex; flex-direction: column; position: relative; background: var(--bg); }
39
48
  .pe-main { flex: 1; overflow-y: auto; min-width: 0; }
40
- .pe-column { max-width: 740px; margin: 0 auto; padding: 40px 20px 120px; position: relative; }
41
- .pe-shell.has-sidebar .pe-main { margin-right: 320px; }
42
- .pe-shell.has-split.has-sidebar .pe-main { margin-right: 0; }
49
+ .pe-column { max-width: 720px; margin: 0 auto; padding: 48px 24px 140px; position: relative; }
50
+ .pe-shell.has-sidebar .pe-body { margin-right: 320px; }
43
51
 
44
- /* side-by-side live preview */
45
- .pe-splitpane {
46
- width: min(46vw, 760px); flex: 0 0 auto; display: flex; flex-direction: column;
47
- border-left: 1px solid var(--line); background: var(--panel-2);
48
- }
49
- .pe-shell.has-sidebar .pe-splitpane { margin-right: 320px; }
52
+ .pe-splitpane { flex: 1; min-width: 0; display: flex; flex-direction: column; background: var(--bg); }
50
53
  .pe-split-bar {
51
- display: flex; align-items: center; justify-content: space-between; gap: 8px;
52
- padding: 5px 10px; border-bottom: 1px solid var(--line);
54
+ display: flex; align-items: center; gap: 8px; height: 42px; flex: 0 0 auto;
55
+ padding: 0 8px 0 14px; border-bottom: 1px solid var(--line);
56
+ }
57
+
58
+ @media (min-width: 901px) {
59
+ .pe-shell.has-split, .pe-shell.has-split .pe-topbar { background: var(--shell); }
60
+ .pe-shell.has-split .pe-body { gap: 8px; padding: 0 8px 8px; }
61
+ .pe-shell.has-split .pe-editor-pane, .pe-shell.has-split .pe-splitpane {
62
+ border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow-card);
63
+ }
64
+ .pe-shell.has-split .pe-column { max-width: 640px; padding: 40px 40px 140px; }
65
+ .pe-shell.has-split .pe-title { font-size: 34px; }
53
66
  }
54
- .pe-split-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); }
55
- .pe-split-actions { display: flex; gap: 2px; }
56
- .pe-splitpane iframe { flex: 1; width: 100%; border: 0; background: #fff; }
57
67
 
58
68
  /* checkbox field (page settings) */
59
69
  .pe-field.pe-check { display: flex; align-items: center; gap: 8px; cursor: pointer; }
@@ -62,17 +72,15 @@
62
72
  .pe-field.pe-check code { background: var(--panel-2); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; font-size: 11.5px; }
63
73
 
64
74
  /* feature image */
65
- .pe-add-feature {
66
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
67
- width: 100%; padding: 26px 16px; margin-bottom: 22px;
68
- background: rgb(26 29 37 / 2%); border: 1.5px dashed var(--line-strong); border-radius: var(--r-lg);
69
- color: var(--faint); font-family: inherit; cursor: pointer; transition: border-color 0.15s, color 0.15s;
70
- }
71
- .pe-add-feature svg { margin-bottom: 4px; }
72
- .pe-add-feature span { font-size: 13.5px; font-weight: 600; color: var(--muted); }
73
- .pe-add-feature em { font-style: normal; font-size: 12px; color: var(--faint); }
74
- .pe-add-feature:hover { border-color: var(--accent); color: var(--accent); }
75
- .pe-add-feature:hover span { color: var(--text); }
75
+ /* quiet "add" links above the title (feature image, excerpt) */
76
+ .pe-addons { display: flex; gap: 2px; margin: 0 0 10px -9px; opacity: 0.75; transition: opacity 0.15s; }
77
+ .pe-column:hover .pe-addons, .pe-addons:focus-within { opacity: 1; }
78
+ .pe-addons button {
79
+ display: inline-flex; align-items: center; gap: 6px; border: 0; background: none; cursor: pointer;
80
+ font: inherit; font-size: 13px; font-weight: 600; color: var(--faint); padding: 5px 9px; border-radius: var(--r-sm);
81
+ }
82
+ .pe-addons button:hover { background: var(--hover); color: var(--text-2); }
83
+ .pe-addons svg { width: 15px; height: 15px; }
76
84
  .pe-feature { position: relative; margin: 0 0 22px; border-radius: var(--r-lg); overflow: hidden; }
77
85
  .pe-feature img {
78
86
  width: 100%; aspect-ratio: 2 / 1; object-fit: cover; display: block; background: var(--panel-2);
@@ -91,24 +99,45 @@
91
99
  .pe-title {
92
100
  width: 100%; background: none; border: none; resize: none; outline: none;
93
101
  color: var(--text); font-family: inherit; font-weight: 700;
94
- font-size: 36px; line-height: 1.2; letter-spacing: -0.02em;
95
- padding: 0; margin: 0 0 14px; overflow: hidden;
102
+ font-size: 40px; line-height: 1.15; letter-spacing: -0.025em;
103
+ padding: 0; margin: 0 0 10px; overflow: hidden;
96
104
  }
97
105
  .pe-title::placeholder { color: var(--faint); }
106
+ .pe-excerpt {
107
+ display: block; width: 100%; background: none; border: none; resize: none; outline: none; overflow: hidden;
108
+ color: var(--muted); font-family: inherit; font-size: 19px; line-height: 1.45; padding: 0; margin: 0 0 14px;
109
+ }
110
+ .pe-excerpt::placeholder { color: var(--faint); }
111
+
112
+ /* byline — author, tags, reading time, like the published post header */
113
+ .pe-byline { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; margin: 2px 0 30px; font-size: 13px; color: var(--muted); }
114
+ .pe-byline-author { display: inline-flex; align-items: center; gap: 7px; font-weight: 600; color: var(--text-2); margin-right: 4px; }
115
+ .pe-byline-author i {
116
+ width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center; font-style: normal;
117
+ font-size: 11px; font-weight: 700; background: var(--sel); color: var(--muted);
118
+ }
119
+ .pe-byline-tag, .pe-byline-add {
120
+ border: 1px solid var(--line); background: var(--panel-2); color: var(--muted); cursor: pointer;
121
+ font: inherit; font-size: 12px; font-weight: 500; padding: 1px 9px; border-radius: var(--r-full);
122
+ }
123
+ .pe-byline-add { background: none; border-style: dashed; color: var(--faint); }
124
+ .pe-byline-tag:hover, .pe-byline-add:hover { color: var(--text); border-color: var(--line-strong); }
125
+ .pe-byline-meta { color: var(--faint); font-size: 12.5px; }
126
+ .pe-byline-meta::before { content: '·'; margin-right: 8px; }
98
127
 
99
128
  /* prose */
100
- .pe-prose { outline: none; color: var(--text); font-size: 16.5px; line-height: 1.72; min-height: 320px; }
129
+ .pe-prose { outline: none; color: var(--text); font-size: 17px; line-height: 1.75; min-height: 320px; }
101
130
  .pe-prose p { margin: 0 0 0.9em; }
102
131
  .pe-prose h1 { font-size: 31px; letter-spacing: -0.02em; margin: 1.3em 0 0.5em; }
103
132
  .pe-prose h2 { font-size: 25px; letter-spacing: -0.015em; margin: 1.4em 0 0.5em; }
104
133
  .pe-prose h3 { font-size: 19px; letter-spacing: -0.01em; margin: 1.3em 0 0.4em; }
105
- .pe-prose a { color: var(--accent-deep); text-decoration: underline; text-decoration-color: rgb(238 93 32 / 35%); }
106
- .pe-prose blockquote { border-left: 3px solid var(--accent); margin: 1.2em 0; padding: 2px 0 2px 18px; color: var(--muted); font-style: italic; }
134
+ .pe-prose a { color: var(--accent-deep); text-decoration: underline; text-decoration-color: var(--accent-ring); }
135
+ .pe-prose blockquote { border-left: 3px solid var(--line-strong); margin: 1.2em 0; padding: 2px 0 2px 18px; color: var(--muted); font-style: italic; }
107
136
  .pe-prose code { background: var(--panel-2); border: 1px solid var(--line); border-radius: 5px; padding: 1px 5px; font-size: 0.88em; font-family: ui-monospace, 'SF Mono', monospace; }
108
137
  .pe-prose pre { background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 14px 16px; overflow-x: auto; margin: 1.2em 0; }
109
138
  .pe-prose pre code { background: none; border: none; padding: 0; font-size: 13.5px; }
110
139
  .pe-prose hr { border: none; border-top: 1px solid var(--line); margin: 2em auto; width: 120px; }
111
- .pe-prose mark { background: #fde58a; border-radius: 3px; padding: 0 2px; }
140
+ .pe-prose mark { background: #fde58a; color: #1a1d25; border-radius: 3px; padding: 0 2px; }
112
141
  .pe-bubble mark { background: #fde58a; border-radius: 3px; padding: 0 4px; color: #1a1d25; }
113
142
 
114
143
  /* ---- code block (extensions/codeBlock.tsx) ---- */
@@ -116,7 +145,7 @@
116
145
  .pe-codeblock pre { margin: 0; }
117
146
  .pe-codeblock-lang {
118
147
  position: absolute; top: 6px; right: 6px; z-index: 3;
119
- background: rgb(255 255 255 / 92%); color: var(--muted); border: 1px solid var(--line);
148
+ background: color-mix(in srgb, var(--panel) 92%, transparent); color: var(--muted); border: 1px solid var(--line);
120
149
  border-radius: 6px; font-size: 11px; font-weight: 600; padding: 2px 6px; font-family: inherit;
121
150
  opacity: 0; transition: opacity 0.12s; cursor: pointer;
122
151
  }
@@ -156,12 +185,27 @@
156
185
  content: ''; position: absolute; inset: 0; background: var(--accent-soft); pointer-events: none;
157
186
  }
158
187
 
159
- .pe-wordcount {
160
- position: fixed; right: 18px; bottom: 14px; font-size: 12px; color: var(--faint);
161
- background: rgb(255 255 255 / 85%); padding: 3px 9px; border-radius: var(--r-full); border: 1px solid var(--line);
162
- pointer-events: none; z-index: 20;
163
- }
164
- .pe-shell.has-sidebar .pe-wordcount { right: 338px; }
188
+ /* format dock — floats at the bottom of the editor sheet, fades while typing */
189
+ .pe-dock {
190
+ position: absolute; left: 50%; bottom: 16px; transform: translateX(-50%); z-index: 20;
191
+ display: flex; align-items: center; gap: 1px; padding: 4px; white-space: nowrap;
192
+ background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-md);
193
+ box-shadow: var(--shadow-pop); transition: opacity 0.25s, transform 0.25s;
194
+ }
195
+ .pe-dock.is-typing { opacity: 0; transform: translate(-50%, 6px); pointer-events: none; }
196
+ .pe-dock button {
197
+ min-width: 30px; height: 30px; display: grid; place-items: center; padding: 0 6px;
198
+ border: 0; background: none; border-radius: 7px; cursor: pointer; color: var(--muted);
199
+ font: 700 13px Inter, system-ui, sans-serif;
200
+ }
201
+ .pe-dock button:hover { background: var(--hover); color: var(--text); }
202
+ .pe-dock button[aria-pressed='true'] { background: var(--accent-soft); color: var(--accent-deep); }
203
+ .pe-dock svg { width: 16px; height: 16px; }
204
+ .pe-dock i { font-size: 14px; }
205
+ .pe-dock-t { font-size: 12px; letter-spacing: -0.01em; }
206
+ .pe-dock-sep { width: 1px; height: 18px; background: var(--line-strong); margin: 0 4px; }
207
+ .pe-dock-count { font-size: 11.5px; color: var(--faint); padding: 0 6px 0 10px; font-variant-numeric: tabular-nums; }
208
+ .pe-dock .pe-dock-kbd { min-width: 0; height: 22px; font: 500 10.5px ui-monospace, monospace; color: var(--faint); border: 1px solid var(--line); margin-right: 2px; }
165
209
 
166
210
  /* cards (editor chrome around .pc-* public styles) */
167
211
  .pe-card { position: relative; margin: 1.2em 0; border-radius: var(--r-md); }
@@ -173,7 +217,7 @@
173
217
  }
174
218
  .pe-card:hover .pe-card-tools, .pe-card.is-selected .pe-card-tools { opacity: 1; }
175
219
  .pe-card-tools button, .pe-card-tools .pe-provider {
176
- background: rgb(255 255 255 / 92%); color: var(--muted); border: 1px solid var(--line);
220
+ background: color-mix(in srgb, var(--panel) 92%, transparent); color: var(--muted); border: 1px solid var(--line);
177
221
  border-radius: 6px; font-size: 11px; font-weight: 700; padding: 3px 8px; cursor: pointer; font-family: inherit;
178
222
  }
179
223
  .pe-card-tools button:hover { color: var(--text); }
@@ -226,17 +270,18 @@
226
270
  background: none; border: none; color: var(--muted); font-family: inherit; font-size: 12.5px;
227
271
  font-weight: 600; padding: 5px 8px; border-radius: 5px; cursor: pointer;
228
272
  }
229
- .pe-bubble button:hover { color: var(--text); background: rgb(26 29 37 / 5%); }
230
- .pe-bubble button.is-active { color: var(--accent-deep); background: var(--accent-soft); }
273
+ .pe-bubble button:hover { color: var(--text); background: var(--hover); }
274
+ .pe-bubble button.is-active { color: var(--text); background: var(--sel); }
231
275
  .pe-bubble-sep { width: 1px; height: 16px; background: var(--line); margin: 0 3px; }
232
276
 
233
- .pe-floating { display: flex; align-items: center; gap: 2px; margin-left: -6px; }
234
- .pe-floating button {
235
- background: none; border: 1px solid var(--line); color: var(--faint); font-family: inherit;
236
- font-size: 11.5px; font-weight: 600; padding: 2px 8px; border-radius: var(--r-full); cursor: pointer;
237
- }
238
- .pe-floating button:hover { color: var(--text); border-color: var(--faint); }
239
- .pe-floating-hint { font-size: 11.5px; color: var(--faint); margin-left: 6px; }
277
+ /* gutter "+" on empty lines — opens the slash menu */
278
+ .pe-gutter-add {
279
+ width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center; cursor: pointer;
280
+ background: var(--bg); border: 1px solid var(--line-strong); color: var(--faint);
281
+ transition: color 0.12s, border-color 0.12s, transform 0.15s;
282
+ }
283
+ .pe-gutter-add:hover { color: var(--text); border-color: var(--faint); transform: rotate(90deg); }
284
+ .pe-gutter-add svg { width: 14px; height: 14px; }
240
285
 
241
286
  /* slash menu */
242
287
  .pe-slash {
@@ -249,7 +294,7 @@
249
294
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
250
295
  background: none; border: none; border-radius: var(--r-md); padding: 7px 10px; cursor: pointer; font-family: inherit;
251
296
  }
252
- .pe-slash-item.is-selected { background: var(--accent-soft); }
297
+ .pe-slash-item.is-selected { background: var(--sel); }
253
298
  .pe-slash-del {
254
299
  margin-left: auto; padding: 2px 7px; border-radius: 6px; color: var(--faint);
255
300
  font-size: 11px; opacity: 0; transition: opacity 0.1s ease;
@@ -258,7 +303,7 @@
258
303
  .pe-slash-del:hover { color: var(--red); background: var(--red-soft); }
259
304
  .pe-slash-icon { width: 30px; height: 30px; flex: 0 0 auto; display: grid; place-items: center; background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-sm); color: var(--muted); }
260
305
  .pe-slash-icon svg { width: 16px; height: 16px; }
261
- .pe-slash-item.is-selected .pe-slash-icon { color: var(--accent-deep); }
306
+ .pe-slash-item.is-selected .pe-slash-icon { color: var(--text); }
262
307
  .pe-slash-title { display: block; font-size: 13px; font-weight: 600; color: var(--text); }
263
308
  .pe-slash-desc { display: block; font-size: 11.5px; color: var(--faint); }
264
309
  .pe-slash-empty { padding: 12px; color: var(--faint); font-size: 12.5px; }
@@ -271,37 +316,125 @@
271
316
  box-shadow: var(--shadow-pop);
272
317
  }
273
318
  .pe-pop-item { display: block; width: 100%; text-align: left; background: none; border: none; border-radius: var(--r-sm); padding: 8px 10px; cursor: pointer; font-family: inherit; }
274
- .pe-pop-item:hover { background: rgb(26 29 37 / 4%); }
319
+ .pe-pop-item:hover { background: var(--hover); }
275
320
  .pe-pop-item b { display: block; font-size: 13px; color: var(--text); }
276
321
  .pe-pop-item span { display: block; font-size: 11.5px; color: var(--faint); }
277
322
  .pe-pop-sep { height: 1px; background: var(--line); margin: 6px 4px; }
278
323
  .pe-pop-note { font-size: 12px; color: var(--amber); padding: 8px 10px 4px; }
279
324
  .pe-pop-schedule { padding: 6px 10px 8px; display: flex; flex-direction: column; gap: 8px; }
280
325
  .pe-pop-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--faint); }
281
- .pe-pop-schedule input { background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px 9px; font-size: 12.5px; font-family: inherit; color-scheme: light; }
326
+ .pe-pop-schedule input { background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 6px 9px; font-size: 12.5px; font-family: inherit; }
282
327
 
283
- /* sidebar */
328
+ /* sidebar — sits under the top bar so Publish stays reachable; a sheet of
329
+ its own in Split mode */
284
330
  .pe-sidebar {
285
- position: fixed; top: 0; right: 0; bottom: 0; width: 320px; z-index: 35;
286
- background: var(--panel); border-left: 1px solid var(--line);
287
- padding: 14px 16px 24px; overflow-y: auto;
331
+ position: fixed; top: 52px; right: 0; bottom: 0; width: 320px; z-index: 35;
332
+ background: var(--bg); border-left: 1px solid var(--line);
333
+ overflow-y: auto; overscroll-behavior: contain;
334
+ }
335
+ .pe-sidebar-head {
336
+ position: sticky; top: 0; z-index: 2; display: flex; align-items: center; justify-content: space-between;
337
+ font-weight: 700; font-size: 14px; padding: 12px 12px 10px 18px; background: inherit;
338
+ }
339
+ .pe-sb-section { padding: 6px 18px 16px; }
340
+ .pe-sb-section + .pe-sb-section { border-top: 1px solid var(--line); padding-top: 16px; }
341
+ .pe-sb-title { margin: 0 0 12px; font-size: 11px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; color: var(--faint); }
342
+ .pe-sb-danger { padding-bottom: 24px; }
343
+ @media (min-width: 901px) {
344
+ .pe-shell.has-split .pe-sidebar {
345
+ right: 8px; bottom: 8px; width: 312px; border: 1px solid var(--line); border-radius: var(--r-lg); box-shadow: var(--shadow-card);
346
+ }
288
347
  }
289
- .pe-sidebar-head { display: flex; align-items: center; justify-content: space-between; font-weight: 700; font-size: 14px; margin-bottom: 14px; }
348
+
349
+ /* publish date: a quiet "when you publish" row until a date is picked */
350
+ .pe-date { display: flex; gap: 6px; align-items: center; }
351
+ .pe-date input { flex: 1; min-width: 0; }
352
+ .pe-date-empty {
353
+ width: 100%; display: flex; justify-content: space-between; align-items: center; cursor: pointer;
354
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 7px 10px;
355
+ font: inherit; font-size: 13px; color: var(--text-2);
356
+ }
357
+ .pe-date-empty em { font-style: normal; font-size: 12px; font-weight: 600; color: var(--accent-deep); }
358
+ .pe-date-empty:hover { border-color: var(--line-strong); }
359
+ :root[data-theme='dark'] .pe-field input[type='datetime-local'] { color-scheme: dark; }
360
+
361
+ /* switch rows (featured, home page) */
362
+ .pe-switch-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; padding: 8px 0 2px; cursor: pointer; }
363
+ .pe-switch-row b { display: block; font-size: 13px; font-weight: 600; color: var(--text); }
364
+ .pe-switch-row small { display: block; font-size: 12px; color: var(--faint); line-height: 1.4; margin-top: 1px; }
365
+ .pe-switch-row code { background: var(--panel-2); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; font-size: 11px; }
366
+ .pe-switch {
367
+ appearance: none; flex: 0 0 auto; width: 32px; height: 19px; margin: 1px 0 0; border-radius: 99px; cursor: pointer;
368
+ background: var(--line-strong); position: relative; transition: background-color 0.15s;
369
+ }
370
+ .pe-switch::after {
371
+ content: ''; position: absolute; top: 2px; left: 2px; width: 15px; height: 15px; border-radius: 50%;
372
+ background: #fff; box-shadow: 0 1px 2px rgb(0 0 0 / 25%); transition: transform 0.15s;
373
+ }
374
+ .pe-switch:checked { background: var(--accent); }
375
+ .pe-switch:checked::after { transform: translateX(13px); }
376
+ .pe-switch:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--accent-ring); }
377
+
378
+ /* feature image row */
379
+ .pe-sb-image { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
380
+ .pe-sb-image img, .pe-sb-image-empty {
381
+ width: 96px; aspect-ratio: 1.91 / 1; flex: 0 0 auto; border-radius: var(--r-sm); object-fit: cover;
382
+ background: var(--panel-2); border: 1px solid var(--line);
383
+ }
384
+ .pe-sb-image-empty { background: repeating-linear-gradient(135deg, var(--panel-2) 0 6px, transparent 6px 12px); }
385
+ .pe-sb-image-actions { display: flex; gap: 4px; flex-wrap: wrap; }
386
+
387
+ /* search card summary → opens the editable preview */
388
+ .pe-sb-serp {
389
+ display: block; width: 100%; text-align: left; cursor: pointer; font: inherit;
390
+ background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 11px 12px;
391
+ }
392
+ .pe-sb-serp:hover { border-color: var(--line-strong); }
393
+ .pe-sb-serp small { display: block; font-size: 11px; color: var(--faint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
394
+ .pe-sb-serp b { display: block; font-size: 14px; font-weight: 600; color: var(--blue); margin: 2px 0; line-height: 1.3; }
395
+ .pe-sb-serp span { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-size: 12px; color: var(--muted); line-height: 1.45; }
396
+ .pe-sb-serp em { display: block; margin-top: 9px; font-style: normal; font-size: 12px; font-weight: 600; color: var(--accent-deep); }
290
397
  .pe-field { display: block; margin-bottom: 14px; }
291
398
  .pe-field > span { display: flex; justify-content: space-between; font-size: 12px; color: var(--muted); margin-bottom: 5px; font-weight: 500; }
292
399
  .pe-field > span em { font-style: normal; color: var(--faint); font-size: 11px; }
293
400
  .pe-field input, .pe-field textarea {
294
401
  width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
295
- padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical; color-scheme: light;
402
+ padding: 7px 10px; font-size: 13px; font-family: inherit; resize: vertical;
296
403
  }
297
404
  .pe-field input:focus, .pe-field textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
298
405
  .pe-slug { display: flex; align-items: center; background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); }
299
406
  .pe-slug:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
300
- .pe-slug-prefix { color: var(--faint); font-size: 13px; padding-left: 10px; }
407
+ .pe-slug-prefix { flex: 0 0 auto; white-space: nowrap; color: var(--faint); font-size: 13px; padding-left: 10px; }
408
+ .pe-slug input { flex: 1; min-width: 0; border: 0 !important; box-shadow: none !important; background: none !important; padding-left: 1px !important; }
301
409
  .pe-slug input { border: none !important; box-shadow: none !important; padding-left: 2px; }
302
- .pe-seo { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 12px; }
303
- .pe-seo summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--muted); margin-bottom: 10px; }
304
- .pe-danger { border-top: 1px solid var(--line); margin-top: 18px; padding-top: 16px; }
410
+ /* editable search / social fields under the preview cards */
411
+ .pe-seo-view { width: min(600px, 100%); display: flex; flex-direction: column; align-items: center; gap: 20px; }
412
+ .pe-seo-edit {
413
+ width: 100%; background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-lg);
414
+ padding: 18px 20px 6px; box-shadow: var(--shadow-card);
415
+ }
416
+ .pe-seo-field { display: block; margin-bottom: 16px; }
417
+ .pe-seo-label { display: flex; justify-content: space-between; font-size: 12.5px; font-weight: 600; color: var(--text-2); margin-bottom: 6px; }
418
+ .pe-seo-label em { font-style: normal; font-weight: 500; color: var(--faint); font-variant-numeric: tabular-nums; }
419
+ .pe-seo-label em.over { color: var(--amber); }
420
+ .pe-seo-field input, .pe-seo-field textarea {
421
+ width: 100%; background: var(--panel); color: var(--text); border: 1px solid var(--line-strong); border-radius: var(--r-md);
422
+ padding: 8px 11px; font: inherit; font-size: 14px; resize: vertical;
423
+ }
424
+ .pe-seo-field input:focus, .pe-seo-field textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
425
+ .pe-seo-field small { display: block; font-size: 12px; color: var(--faint); margin-top: 5px; }
426
+ .pe-meter { display: block; height: 3px; border-radius: 99px; background: var(--sel); margin-top: 6px; overflow: hidden; }
427
+ .pe-meter i { display: block; height: 100%; border-radius: inherit; background: var(--green); transition: width 0.15s; }
428
+ .pe-meter.over i { background: var(--amber); }
429
+ .pe-seo-note { font-size: 12px; color: var(--faint); margin: 0 0 12px; }
430
+ .pe-seo-image { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
431
+ .pe-seo-image img, .pe-seo-image-empty {
432
+ width: 88px; aspect-ratio: 1.91 / 1; border-radius: var(--r-sm); object-fit: cover; flex: 0 0 auto;
433
+ background: repeating-linear-gradient(135deg, var(--panel-2) 0 6px, transparent 6px 12px); border: 1px solid var(--line);
434
+ }
435
+ .pe-seo-image > div { flex: 1; min-width: 0; }
436
+ .pe-seo-image b { display: block; font-size: 13px; }
437
+ .pe-seo-image small { display: block; font-size: 12px; color: var(--faint); }
305
438
 
306
439
  /* tags */
307
440
  .pe-tags {
@@ -311,7 +444,7 @@
311
444
  .pe-tags:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
312
445
  .pe-tag {
313
446
  display: inline-flex; align-items: center; gap: 5px;
314
- background: var(--accent-soft); color: var(--accent-deep); font-size: 12px; font-weight: 600;
447
+ background: var(--sel); color: var(--text-2); font-size: 12px; font-weight: 600;
315
448
  padding: 2px 8px; border-radius: var(--r-full);
316
449
  }
317
450
  .pe-tag button { background: none; border: none; color: inherit; cursor: pointer; font-size: 10px; padding: 0; }
@@ -326,7 +459,7 @@
326
459
  display: block; width: 100%; text-align: left; background: none; border: none;
327
460
  color: var(--text); font: inherit; font-size: 13px; padding: 7px 11px; cursor: pointer;
328
461
  }
329
- .pe-tag-suggest button:hover { background: var(--accent-soft); color: var(--accent-deep); }
462
+ .pe-tag-suggest button:hover { background: var(--hover); }
330
463
 
331
464
  /* ---- media crop modal ---- */
332
465
  .mc-modal { width: min(880px, 94vw); }
@@ -356,19 +489,19 @@
356
489
 
357
490
  /* modal (image picker) */
358
491
  .pe-modal-backdrop {
359
- position: fixed; inset: 0; z-index: 60; background: rgb(20 22 28 / 40%);
492
+ position: fixed; inset: 0; z-index: 75; background: var(--dim);
360
493
  display: grid; place-items: center; padding: 24px; backdrop-filter: blur(2px);
361
494
  }
362
495
  .pe-modal {
363
496
  width: 100%; max-width: 640px; max-height: 80vh; display: flex; flex-direction: column;
364
497
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
365
- box-shadow: 0 24px 60px rgb(26 29 37 / 28%);
498
+ box-shadow: var(--shadow-pop);
366
499
  }
367
500
  .pe-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; border-bottom: 1px solid var(--line); }
368
501
  .pe-tabs { display: flex; gap: 2px; }
369
502
  .pe-tabs button { background: none; border: none; color: var(--muted); font-family: inherit; font-size: 13px; font-weight: 600; padding: 6px 12px; border-radius: var(--r-md); cursor: pointer; }
370
503
  .pe-tabs button:hover { color: var(--text); }
371
- .pe-tabs button.is-active { color: var(--accent-deep); background: var(--accent-soft); }
504
+ .pe-tabs button.is-active { color: var(--text); background: var(--sel); }
372
505
  .pe-modal-close { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 13px; padding: 6px 8px; }
373
506
  .pe-modal-error { color: var(--red); font-size: 12.5px; padding: 10px 16px 0; }
374
507
  .pe-dropzone {
@@ -404,12 +537,12 @@
404
537
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
405
538
  padding: 10px 18px; border-bottom: 1px solid var(--line);
406
539
  }
407
- .pe-devices { display: flex; gap: 2px; background: var(--panel-2); border: 1px solid var(--line); border-radius: 8px; padding: 2px; }
540
+ .pe-devices { display: flex; gap: 1px; background: var(--sel); border-radius: 9px; padding: 2px; }
408
541
  .pe-devices button {
409
542
  background: none; border: none; color: var(--muted); font-family: inherit; font-size: 12.5px;
410
543
  font-weight: 600; padding: 4px 14px; border-radius: 6px; cursor: pointer;
411
544
  }
412
- .pe-devices button.is-active { background: var(--accent-soft); color: var(--text); }
545
+ .pe-devices button.is-active { background: var(--bg); color: var(--text); box-shadow: var(--shadow-sm); }
413
546
  .pe-preview-actions { display: flex; gap: 8px; }
414
547
  .pe-preview-stage { flex: 1; display: flex; justify-content: center; overflow: hidden; padding: 0; background: var(--panel-2); }
415
548
  .pe-preview-stage iframe { height: 100%; border: 0; background: #fff; transition: width 0.2s ease; }
@@ -423,7 +556,7 @@
423
556
  .pe-postlist-config select, .pe-postlist-config input[type='text'] {
424
557
  width: auto; flex: 0 1 auto; background: var(--bg); color: var(--text);
425
558
  border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px;
426
- font-size: 12.5px; font-family: inherit; color-scheme: light;
559
+ font-size: 12.5px; font-family: inherit;
427
560
  }
428
561
  .pe-postlist-config input[type='text'] { width: 120px; }
429
562
  .pe-postlist-config label { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); white-space: nowrap; }
@@ -450,13 +583,13 @@
450
583
  .pe-toast {
451
584
  position: fixed; top: 14px; left: 50%; transform: translateX(-50%); z-index: 90;
452
585
  display: flex; align-items: center; gap: 10px;
453
- background: var(--green-soft); border: 1px solid rgb(18 116 66 / 25%); color: var(--green);
586
+ background: var(--green-soft); border: 1px solid transparent; color: var(--green);
454
587
  border-radius: var(--r-md); padding: 9px 16px; font-size: 13px;
455
588
  box-shadow: var(--shadow-pop);
456
589
  animation: pe-toast-in 0.18s ease-out;
457
590
  }
458
- .pe-toast-check { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%; background: #1c9e5a; color: #fff; font-size: 11px; }
459
- .pe-toast a { color: #0f5c34; font-weight: 600; text-decoration: none; }
591
+ .pe-toast-check { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%; background: var(--green); color: var(--bg); font-size: 11px; }
592
+ .pe-toast a { color: var(--green); font-weight: 600; text-decoration: none; }
460
593
  .pe-toast a:hover { text-decoration: underline; }
461
594
  @keyframes pe-toast-in { from { opacity: 0; transform: translate(-50%, -6px); } to { opacity: 1; transform: translate(-50%, 0); } }
462
595
  .pe-check-hint { display: block; font-style: normal; font-size: 11px; color: var(--faint); margin-top: 1px; }
@@ -471,8 +604,8 @@
471
604
  .pe-filecard input[type='file'] { font-size: 13px; }
472
605
 
473
606
  .pe-gallery-empty {
474
- border: 1.5px dashed var(--border, #d5d2ca); border-radius: 9px; padding: 22px;
475
- text-align: center; font-size: 13.5px; color: var(--muted, #8a8880);
607
+ border: 1.5px dashed var(--line-strong); border-radius: 9px; padding: 22px;
608
+ text-align: center; font-size: 13.5px; color: var(--muted);
476
609
  }
477
610
  .pe-gallery-item { position: relative; display: block; }
478
611
  .pe-gallery-item img {
@@ -492,7 +625,7 @@
492
625
  /* floating link editor (⌘K) */
493
626
  .pe-linkedit {
494
627
  position: sticky; top: 12px; z-index: 60;
495
- background: var(--panel, #fff); border: 1px solid var(--border, #d5d2ca);
628
+ background: var(--panel); border: 1px solid var(--line-strong);
496
629
  border-radius: 10px; padding: 8px 10px; margin: 0 auto 12px;
497
630
  max-width: 560px; box-shadow: 0 10px 30px rgb(0 0 0 / 14%);
498
631
  }
@@ -501,32 +634,26 @@
501
634
  flex: 1; border: 0; outline: none; font-size: 14px; background: none; color: inherit;
502
635
  }
503
636
  .pe-link-results {
504
- border-top: 1px solid var(--line, #e3e5ec); margin-top: 8px; padding-top: 6px;
637
+ border-top: 1px solid var(--line); margin-top: 8px; padding-top: 6px;
505
638
  display: flex; flex-direction: column;
506
639
  }
507
640
  .pe-link-results button {
508
641
  display: flex; align-items: baseline; gap: 8px; border: 0; background: none;
509
642
  text-align: left; padding: 7px 8px; border-radius: 8px; cursor: pointer;
510
- font: inherit; color: var(--text, #1a1d25);
643
+ font: inherit; color: var(--text);
511
644
  }
512
- .pe-link-results button.is-selected { background: var(--panel-2, #f4f5f8); }
645
+ .pe-link-results button.is-selected { background: var(--panel-2); }
513
646
  .pe-link-title { font-size: 13.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
514
- .pe-link-url { font-size: 12px; color: var(--faint, #8f95a3); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
515
- .pe-link-kind { font-size: 10px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--faint, #8f95a3); }
647
+ .pe-link-url { font-size: 12px; color: var(--faint); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
648
+ .pe-link-kind { font-size: 10px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--faint); }
516
649
 
517
650
  /* shortcut cheat-sheet */
518
- .pe-wordcount { display: flex; align-items: center; gap: 10px; }
519
- .pe-shortcuts-btn {
520
- border: 1px solid var(--border, #d5d2ca); background: none; border-radius: 6px;
521
- font-size: 10.5px; padding: 2px 7px; color: var(--muted, #8a8880); cursor: pointer;
522
- }
523
- .pe-shortcuts-btn:hover { color: inherit; }
524
651
  .pe-shortcuts-overlay {
525
652
  position: fixed; inset: 0; z-index: 90; background: rgb(0 0 0 / 40%);
526
653
  display: flex; align-items: center; justify-content: center; padding: 24px;
527
654
  }
528
655
  .pe-shortcuts {
529
- background: var(--panel, #fff); border-radius: 14px; padding: 20px 24px;
656
+ background: var(--panel); border-radius: 14px; padding: 20px 24px;
530
657
  width: min(440px, 100%); max-height: 80vh; overflow-y: auto;
531
658
  box-shadow: 0 24px 60px rgb(0 0 0 / 25%);
532
659
  }
@@ -537,21 +664,36 @@
537
664
  .pe-shortcuts-group { margin-top: 14px; }
538
665
  .pe-shortcuts-title {
539
666
  font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
540
- color: var(--muted, #8a8880); margin-bottom: 6px;
667
+ color: var(--muted); margin-bottom: 6px;
541
668
  }
542
669
  .pe-shortcuts-row { display: flex; align-items: baseline; gap: 12px; padding: 4px 0; font-size: 13.5px; }
543
670
  .pe-shortcuts-row kbd {
544
671
  flex: none; min-width: 108px; font-family: ui-monospace, monospace; font-size: 12px;
545
- color: var(--muted, #6d685e);
672
+ color: var(--muted);
546
673
  }
547
674
 
548
675
  /* multi-author checklist in the sidebar */
549
- .pe-authors {
550
- display: flex; flex-direction: column; gap: 2px;
551
- border: 1px solid var(--border, #d5d2ca); border-radius: 9px; padding: 8px 10px;
552
- max-height: 180px; overflow-y: auto;
553
- }
554
- .pe-author-check { font-size: 13.5px; padding: 3px 0; }
676
+ .pe-authors { display: flex; flex-direction: column; gap: 1px; max-height: 196px; overflow-y: auto; }
677
+ .pe-author {
678
+ display: flex; align-items: center; gap: 9px; padding: 5px 8px; margin: 0 -8px; border-radius: var(--r-sm);
679
+ font-size: 13px; color: var(--muted); cursor: pointer;
680
+ }
681
+ .pe-author:hover { background: var(--hover); }
682
+ .pe-author input { position: absolute; opacity: 0; pointer-events: none; }
683
+ .pe-author i {
684
+ width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center; flex: 0 0 auto;
685
+ font-style: normal; font-size: 11px; font-weight: 700; background: var(--sel); color: var(--faint);
686
+ }
687
+ .pe-author span { flex: 1; }
688
+ .pe-author em { font-style: normal; font-size: 11px; font-weight: 600; color: var(--faint); }
689
+ .pe-author.is-on { color: var(--text); }
690
+ .pe-author.is-on i { background: var(--accent); color: var(--on-accent); }
691
+ .pe-author::after { content: ''; width: 14px; height: 14px; flex: 0 0 auto; }
692
+ .pe-author.is-on::after {
693
+ background: var(--accent-deep);
694
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12l5 5 9-10'/%3E%3C/svg%3E") center / contain no-repeat;
695
+ }
696
+ .pe-author:has(input:focus-visible) { box-shadow: 0 0 0 2px var(--accent-ring); }
555
697
 
556
698
  /* ---- calendar card (dynamic block) ---- */
557
699
  .pe-calcard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 12px 10px; }
@@ -561,7 +703,7 @@
561
703
  .pe-calendar-config select, .pe-calendar-config input[type='text'] {
562
704
  width: auto; flex: 0 1 auto; background: var(--bg); color: var(--text);
563
705
  border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px;
564
- font-size: 12.5px; font-family: inherit; color-scheme: light;
706
+ font-size: 12.5px; font-family: inherit;
565
707
  }
566
708
  .pe-calendar-config input.pe-cal-title { flex: 1 1 180px; }
567
709
  .pe-calendar-config label { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); white-space: nowrap; }
@@ -597,7 +739,7 @@
597
739
  .pe-infocard-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
598
740
  .pe-infocard input[type='text'], .pe-infocard input[type='url'], .pe-infocard select, .pe-infocard textarea {
599
741
  background: var(--panel); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
600
- padding: 5px 8px; font-size: 12.5px; font-family: inherit; color-scheme: light; width: auto;
742
+ padding: 5px 8px; font-size: 12.5px; font-family: inherit; width: auto;
601
743
  }
602
744
  .pe-infocard-title { flex: 1 1 140px; font-weight: 600; }
603
745
  .pe-infocard-badge { flex: 0 1 130px; }
@@ -624,7 +766,7 @@
624
766
  .pe-toggle.is-selected { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
625
767
  .pe-toggle .pe-toggle-head { display: flex; align-items: center; gap: 8px; }
626
768
  .pe-toggle-chevron {
627
- border: 0; background: none; cursor: pointer; color: var(--muted, #666d7c);
769
+ border: 0; background: none; cursor: pointer; color: var(--muted);
628
770
  font-size: 13px; padding: 2px 4px; transition: transform 0.15s ease;
629
771
  }
630
772
  .pe-toggle.is-open .pe-toggle-chevron { transform: rotate(90deg); }
@@ -643,6 +785,242 @@
643
785
  .pe-toc-title {
644
786
  border: 0; outline: none; background: none; text-transform: uppercase;
645
787
  letter-spacing: 0.08em; font-size: 11.5px; font-weight: 700;
646
- color: var(--muted, #666d7c); margin-bottom: 6px; padding: 0;
788
+ color: var(--muted); margin-bottom: 6px; padding: 0;
789
+ }
790
+ .pe-toc-empty { color: var(--faint); font-size: 13.5px; }
791
+
792
+ /* GitHub-dark token palette for code blocks in night mode */
793
+ :root[data-theme='dark'] .pe-prose pre .hljs-comment, :root[data-theme='dark'] .pe-prose pre .hljs-quote { color: #8b949e; }
794
+ :root[data-theme='dark'] .pe-prose pre .hljs-keyword, :root[data-theme='dark'] .pe-prose pre .hljs-selector-tag, :root[data-theme='dark'] .pe-prose pre .hljs-doctag,
795
+ :root[data-theme='dark'] .pe-prose pre .hljs-template-tag, :root[data-theme='dark'] .pe-prose pre .hljs-operator { color: #ff7b72; }
796
+ :root[data-theme='dark'] .pe-prose pre .hljs-string, :root[data-theme='dark'] .pe-prose pre .hljs-regexp, :root[data-theme='dark'] .pe-prose pre .hljs-addition { color: #a5d6ff; }
797
+ :root[data-theme='dark'] .pe-prose pre .hljs-title, :root[data-theme='dark'] .pe-prose pre .hljs-section { color: #d2a8ff; }
798
+ :root[data-theme='dark'] .pe-prose pre .hljs-number, :root[data-theme='dark'] .pe-prose pre .hljs-literal, :root[data-theme='dark'] .pe-prose pre .hljs-attr,
799
+ :root[data-theme='dark'] .pe-prose pre .hljs-variable, :root[data-theme='dark'] .pe-prose pre .hljs-template-variable, :root[data-theme='dark'] .pe-prose pre .hljs-type,
800
+ :root[data-theme='dark'] .pe-prose pre .hljs-selector-class, :root[data-theme='dark'] .pe-prose pre .hljs-selector-id, :root[data-theme='dark'] .pe-prose pre .hljs-meta,
801
+ :root[data-theme='dark'] .pe-prose pre .hljs-attribute, :root[data-theme='dark'] .pe-prose pre .hljs-property { color: #79c0ff; }
802
+ :root[data-theme='dark'] .pe-prose pre .hljs-name, :root[data-theme='dark'] .pe-prose pre .hljs-tag, :root[data-theme='dark'] .pe-prose pre .hljs-bullet { color: #7ee787; }
803
+ :root[data-theme='dark'] .pe-prose pre .hljs-built_in, :root[data-theme='dark'] .pe-prose pre .hljs-symbol { color: #ffa657; }
804
+ :root[data-theme='dark'] .pe-prose pre .hljs-deletion { color: #ffa198; }
805
+
806
+ /* ---- segmented control (island-local mirror of .seg) ---- */
807
+ .pe-seg { display: inline-flex; gap: 1px; padding: 2px; border-radius: 9px; background: var(--sel); }
808
+ .pe-seg button {
809
+ display: inline-flex; align-items: center; justify-content: center; gap: 5px;
810
+ border: 0; background: none; font: inherit; font-size: 12px; font-weight: 600; color: var(--muted);
811
+ padding: 4px 10px; border-radius: 7px; cursor: pointer;
812
+ }
813
+ .pe-seg button:hover { color: var(--text); }
814
+ .pe-seg button[aria-pressed='true'], .pe-seg button[aria-selected='true'] { background: var(--bg); color: var(--text); box-shadow: var(--shadow-sm); }
815
+ :root[data-theme='dark'] .pe-seg button[aria-pressed='true'], :root[data-theme='dark'] .pe-seg button[aria-selected='true'] { background: #3a3632; }
816
+ .pe-seg svg { width: 14px; height: 14px; }
817
+
818
+ /* ---- live pane ---- */
819
+ .pe-live { display: flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 600; color: var(--text); white-space: nowrap; }
820
+ .pe-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--green); }
821
+ .pe-live-path {
822
+ min-width: 0; flex: 0 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
823
+ font: 11.5px ui-monospace, 'SF Mono', monospace; color: var(--muted);
824
+ background: var(--panel-2); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 2px 8px;
825
+ }
826
+ .pe-live-ago { flex: 1; font-size: 12px; color: var(--faint); white-space: nowrap; }
827
+ /* the site sits on its own card with a margin, so a light site never reads
828
+ as a hole in a dark admin */
829
+ .pe-split-stage { flex: 1; min-height: 0; display: flex; justify-content: center; background: var(--panel-2); padding: 10px; }
830
+ .pe-split-stage iframe {
831
+ flex: 1; width: 100%; height: 100%; border: 1px solid var(--line); border-radius: var(--r-md); background: #fff;
832
+ box-shadow: var(--shadow-card);
833
+ }
834
+ .pe-split-stage.phone { padding: 14px 0; }
835
+ .pe-split-stage.phone iframe { flex: 0 0 390px; max-width: 100%; border-radius: 22px; border: 6px solid #1a1917; box-shadow: var(--shadow-pop); }
836
+
837
+ /* ---- preview overlay v2 ---- */
838
+ .pe-preview-bar { display: grid; grid-template-columns: 1fr auto 1fr; }
839
+ .pe-preview-center { display: flex; gap: 8px; align-items: center; }
840
+ .pe-preview-actions { justify-content: flex-end; align-items: center; }
841
+ .pe-preview-body { flex: 1; min-height: 0; display: flex; }
842
+ .pe-preview-stage { flex: 1; min-width: 0; }
843
+ .pe-preview-stage.view-search, .pe-preview-stage.view-social { align-items: flex-start; padding: 48px 24px; overflow-y: auto; }
844
+ .pe-checks { width: 290px; flex: 0 0 auto; border-left: 1px solid var(--line); background: var(--bg); padding: 16px; overflow-y: auto; }
845
+ .pe-checks-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
846
+ .pe-checks-head span { color: var(--muted); font-size: 12px; }
847
+ .pe-check-row { display: flex; gap: 10px; align-items: flex-start; padding: 9px 0; border-bottom: 1px solid var(--line); }
848
+ .pe-check-row:last-child { border-bottom: 0; }
849
+ .pe-check-row > i { width: 18px; height: 18px; flex: 0 0 auto; border-radius: 50%; display: grid; place-items: center; font-style: normal; font-size: 10.5px; font-weight: 800; color: #fff; margin-top: 1px; }
850
+ .pe-check-row > i.ok { background: var(--green); }
851
+ .pe-check-row > i.warn { background: var(--amber); }
852
+ .pe-check-row > div { flex: 1; min-width: 0; font-size: 13px; }
853
+ .pe-check-row small { display: block; color: var(--muted); font-size: 12px; }
854
+ .pe-serp { width: min(600px, 100%); background: #fff; color: #202124; border-radius: 14px; padding: 18px 20px; font-family: Arial, sans-serif; box-shadow: var(--shadow-pop); }
855
+ .pe-serp-site { display: flex; gap: 10px; align-items: center; margin-bottom: 6px; }
856
+ .pe-serp-fav { width: 28px; height: 28px; border-radius: 50%; background: #f1f3f4; display: grid; place-items: center; color: #5f6368; }
857
+ .pe-serp-fav svg { width: 16px; height: 16px; }
858
+ .pe-serp-site b { display: block; font-size: 14px; font-weight: 400; }
859
+ .pe-serp-site small { display: block; font-size: 12px; color: #4d5156; }
860
+ .pe-serp-title { font-size: 20px; color: #1a0dab; line-height: 1.3; margin-bottom: 4px; }
861
+ .pe-serp-desc { font-size: 14px; color: #4d5156; line-height: 1.58; }
862
+ .pe-og { width: min(520px, 100%); background: #fff; color: #0f1419; border: 1px solid #cfd9de; border-radius: 16px; overflow: hidden; box-shadow: var(--shadow-pop); font-family: system-ui, sans-serif; }
863
+ .pe-og img { display: block; width: 100%; aspect-ratio: 1.91 / 1; object-fit: cover; }
864
+ .pe-og-empty { aspect-ratio: 1.91 / 1; display: grid; place-items: center; background: #f7f9f9; color: #536471; font-size: 13px; }
865
+ .pe-og-text { padding: 11px 14px 13px; border-top: 1px solid #cfd9de; }
866
+ .pe-og-text small { display: block; color: #536471; font-size: 13px; }
867
+ .pe-og-text b { display: block; font-size: 15px; margin: 1px 0; }
868
+ .pe-og-text span { color: #536471; font-size: 14px; }
869
+ .pe-share-wrap { position: relative; }
870
+ .pe-share { position: absolute; right: 0; top: calc(100% + 8px); width: 340px; z-index: 5; background: var(--panel); border: 1px solid var(--line-strong); border-radius: var(--r-lg); box-shadow: var(--shadow-pop); padding: 14px; }
871
+ .pe-share b { font-size: 13.5px; }
872
+ .pe-share p { margin: 4px 0 10px; color: var(--muted); font-size: 12.5px; line-height: 1.45; }
873
+ .pe-share-row { display: flex; gap: 6px; }
874
+ .pe-share-row input { flex: 1; min-width: 0; background: var(--bg); color: var(--text-2); border: 1px solid var(--line-strong); border-radius: var(--r-md); padding: 5px 9px; font: 12px ui-monospace, monospace; }
875
+
876
+ /* ---- phone formatting bar ---- */
877
+ .pe-mtoolbar {
878
+ position: fixed; left: 0; right: 0; z-index: 80;
879
+ display: flex; align-items: center; gap: 2px; padding: 5px 6px; overflow-x: auto; scrollbar-width: none;
880
+ background: var(--bg); border-top: 1px solid var(--line); box-shadow: 0 -4px 14px rgb(0 0 0 / 6%);
881
+ }
882
+ .pe-mtoolbar button {
883
+ flex: 0 0 auto; width: 38px; height: 36px; display: grid; place-items: center;
884
+ border: 0; background: none; color: var(--text-2); border-radius: 9px; font: 700 15px Inter, sans-serif;
885
+ }
886
+ .pe-mtoolbar button[aria-pressed='true'] { background: var(--sel); color: var(--text); }
887
+ .pe-mtoolbar svg { width: 19px; height: 19px; }
888
+ .pe-mtoolbar-sep { width: 1px; height: 20px; background: var(--line-strong); flex: 0 0 1px; margin: 0 3px; }
889
+
890
+ @media (max-width: 900px) {
891
+ .pe-mode-split, .pe-modes button:first-child, .pe-splitpane { display: none !important; }
892
+ .pe-checks { display: none; }
893
+ }
894
+ @media (max-width: 767px) {
895
+ .pe-hide-sm { display: none; }
896
+ /* no backdrop-filter: it would become the containing block for the fixed publish sheet */
897
+ .pe-topbar { padding: calc(8px + env(safe-area-inset-top)) 10px 8px; backdrop-filter: none; background: var(--bg); }
898
+ .pe-topbar-left, .pe-topbar-right { gap: 4px; }
899
+ .pe-savestate { font-size: 11.5px; max-width: 42vw; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
900
+ .pe-column { padding: 20px 18px 140px; }
901
+ .pe-title { font-size: 27px; }
902
+ .pe-prose { font-size: 16.5px; }
903
+ .pe-shell.has-sidebar .pe-body { margin-right: 0; }
904
+ .pe-topbar { grid-template-columns: auto 1fr auto; height: auto; }
905
+ .pe-modes { justify-self: center; background: none; }
906
+ .pe-dock { display: none; }
907
+ .pe-modes button { padding: 4px 8px; font-size: 0; gap: 0; }
908
+ .pe-modes svg { width: 15px; height: 15px; }
909
+ .pe-excerpt { font-size: 17px; }
910
+ .pe-byline { margin-bottom: 22px; }
911
+ .pe-imagecard.w-wide, .pe-imagecard.w-full { margin-left: -18px; margin-right: -18px; }
912
+ /* settings sidebar → full-screen sheet */
913
+ .pe-sidebar { width: 100%; top: 0; padding: calc(14px + env(safe-area-inset-top)) 18px 32px; }
914
+ .pe-field input, .pe-field textarea, .pe-tags input { font-size: 16px; }
915
+ /* publish popover → bottom sheet */
916
+ .pe-popover {
917
+ position: fixed; top: auto; left: 0; right: 0; bottom: 0; width: auto; z-index: 90;
918
+ border-radius: var(--r-xl) var(--r-xl) 0 0; padding: 14px 12px calc(18px + env(safe-area-inset-bottom));
919
+ box-shadow: 0 0 0 100vmax var(--dim), var(--shadow-pop);
920
+ }
921
+ .pe-pop-cta { padding: 12px; font-size: 15px; }
922
+ .pe-card-tools { opacity: 1; }
923
+ /* heavy cards: read-only on phones — move/delete still work via their tools */
924
+ .pe-htmlcard, .pe-embedcard, .pe-calcard, .pe-infocards, .pe-postlist { position: relative; }
925
+ .pe-htmlcard > :not(.pe-card-tools), .pe-embedcard > :not(.pe-card-tools), .pe-calcard > :not(.pe-card-tools),
926
+ .pe-infocards > :not(.pe-card-tools), .pe-postlist > :not(.pe-card-tools) { pointer-events: none; opacity: 0.75; }
927
+ .pe-htmlcard::after, .pe-embedcard::after, .pe-calcard::after, .pe-infocards::after, .pe-postlist::after {
928
+ content: 'Edit on desktop'; position: absolute; left: 8px; bottom: 8px; z-index: 2;
929
+ font-size: 11px; font-weight: 600; color: var(--text-2); background: var(--panel); border: 1px solid var(--line-strong);
930
+ border-radius: 99px; padding: 2px 9px;
931
+ }
932
+ .pe-preview-bar { grid-template-columns: auto 1fr auto; padding: calc(8px + env(safe-area-inset-top)) 10px 8px; gap: 6px; }
933
+ .pe-preview-center { justify-content: center; }
934
+ .pe-preview-stage iframe { width: 100% !important; }
935
+ .pe-preview-stage.view-search, .pe-preview-stage.view-social { padding: 20px 12px; }
936
+ .pe-share { position: fixed; left: 0; right: 0; top: auto; bottom: 0; width: auto; border-radius: var(--r-xl) var(--r-xl) 0 0; padding: 18px 16px calc(22px + env(safe-area-inset-bottom)); box-shadow: 0 0 0 100vmax var(--dim), var(--shadow-pop); }
937
+ .pe-share-row input { font-size: 13px; padding: 9px; }
938
+ }
939
+
940
+ /* ---- leave guard dialog ---- */
941
+ .pe-leave-backdrop {
942
+ position: fixed; inset: 0; z-index: 95; background: var(--dim); backdrop-filter: blur(2px);
943
+ display: grid; place-items: center; padding: 20px;
944
+ animation: pe-fade 0.15s ease;
945
+ }
946
+ .pe-leave {
947
+ width: min(400px, 100%); background: var(--panel); border: 1px solid var(--line-strong);
948
+ border-radius: var(--r-xl); box-shadow: var(--shadow-pop); padding: 22px 20px 16px;
949
+ animation: pe-rise 0.18s ease;
950
+ }
951
+ .pe-leave h2 { margin: 0 0 6px; font-size: 17px; letter-spacing: -0.01em; }
952
+ .pe-leave p { margin: 0 0 16px; font-size: 13.5px; color: var(--muted); line-height: 1.5; }
953
+ .pe-leave .pe-leave-error { color: var(--red); margin-top: -8px; }
954
+ .pe-leave-actions { display: flex; flex-direction: column; gap: 4px; }
955
+ .pe-leave-actions .pe-pop-item { padding: 9px 12px; border-radius: var(--r-md); }
956
+ .pe-leave-actions .pe-pop-item:disabled { opacity: 0.5; cursor: default; }
957
+ .pe-leave-danger b { color: var(--red) !important; }
958
+ .pe-leave-cta { justify-content: center; padding: 9px 14px; font-size: 13.5px; }
959
+ .pe-leave-cta.primary { margin-bottom: 6px; }
960
+ .pe-leave-cta.ghost { margin-top: 4px; }
961
+ @keyframes pe-fade { from { opacity: 0; } }
962
+ @keyframes pe-rise { from { opacity: 0; transform: translateY(6px) scale(0.98); } }
963
+ @media (max-width: 767px) {
964
+ .pe-leave-backdrop { place-items: end stretch; padding: 0; }
965
+ .pe-leave { width: 100%; border-radius: var(--r-xl) var(--r-xl) 0 0; padding-bottom: calc(16px + env(safe-area-inset-bottom)); }
647
966
  }
648
- .pe-toc-empty { color: var(--faint, #8f95a3); font-size: 13.5px; }
967
+
968
+ /* ---- event mode (sidebar panel + byline) --------------------------------- */
969
+ .pe-field select {
970
+ width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
971
+ padding: 7px 10px; font-size: 13px; font-family: inherit;
972
+ }
973
+ .pe-field select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
974
+ :root[data-theme='dark'] .pe-field input[type='date'], :root[data-theme='dark'] .pe-field input[type='time'], :root[data-theme='dark'] .pe-ev-choices input[type='date'] { color-scheme: dark; }
975
+ .pe-ev-row { display: flex; gap: 8px; }
976
+ .pe-ev-row > .pe-field { flex: 1 1 0; min-width: 0; }
977
+ .pe-ev-row > .pe-ev-time { flex: 0 0 112px; }
978
+ .pe-ev-link { border: 0; background: none; padding: 0; margin: -6px 0 6px; font: inherit; font-size: 12px; font-weight: 600; color: var(--accent-deep); cursor: pointer; }
979
+ .pe-ev-tz { margin-top: 10px; }
980
+ .pe-ev-inline { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-2); margin: -4px 0 12px; }
981
+ .pe-ev-inline input { width: 64px; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px; font: inherit; font-size: 13px; }
982
+ .pe-ev-days { display: flex; gap: 4px; margin: 0 0 12px; }
983
+ .pe-ev-days button {
984
+ flex: 1; height: 30px; border-radius: var(--r-full); border: 1px solid var(--line); background: var(--bg);
985
+ font: inherit; font-size: 12px; font-weight: 600; color: var(--muted); cursor: pointer;
986
+ }
987
+ .pe-ev-days button:hover { color: var(--text); border-color: var(--line-strong); }
988
+ .pe-ev-days button[aria-pressed='true'] { background: var(--sel); color: var(--text); border-color: var(--line-strong); }
989
+ .pe-ev-choices { display: flex; flex-direction: column; gap: 7px; margin: 0 0 14px; font-size: 13px; color: var(--text-2); }
990
+ .pe-ev-choices label { display: flex; align-items: center; gap: 7px; min-height: 28px; flex-wrap: wrap; cursor: pointer; }
991
+ .pe-ev-choices input[type='radio'] { accent-color: var(--accent); margin: 0; }
992
+ .pe-ev-choices input[type='date'], .pe-ev-choices input[type='number'] {
993
+ background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md); padding: 4px 8px; font: inherit; font-size: 12.5px;
994
+ }
995
+ .pe-ev-choices input[type='number'] { width: 64px; }
996
+ .pe-ev-skips { margin-bottom: 8px; }
997
+ .pe-ev-note { font-size: 12.5px; color: var(--muted); margin: 0; line-height: 1.5; }
998
+ .pe-ev-note a { color: var(--accent-deep); }
999
+ .pe-ev-cals { display: flex; flex-direction: column; gap: 2px; }
1000
+ .pe-ev-cals label { display: flex; align-items: center; gap: 9px; padding: 6px 8px; border-radius: var(--r-sm); cursor: pointer; font-size: 13px; color: var(--text-2); }
1001
+ .pe-ev-cals label:hover { background: var(--hover); }
1002
+ .pe-ev-cals label.is-on { background: var(--sel); color: var(--text); font-weight: 600; }
1003
+ .pe-ev-cals input { accent-color: var(--accent); margin: 0; }
1004
+ .pe-ev-cals i { width: 9px; height: 9px; border-radius: 50%; flex: 0 0 auto; }
1005
+ .pe-ev-byline { flex-wrap: wrap; }
1006
+ .pe-ev-when {
1007
+ display: inline-flex; align-items: center; gap: 6px; border: 0; background: var(--panel-2); color: var(--text);
1008
+ border-radius: var(--r-full); padding: 3px 11px 3px 9px; font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer;
1009
+ }
1010
+ .pe-ev-when:hover { background: var(--sel); }
1011
+ .pe-ev-when svg { width: 14px; height: 14px; color: var(--muted); }
1012
+ .pe-ev-when.is-cancelled { text-decoration: line-through; color: var(--muted); }
1013
+ .pe-ev-when.is-cancelled b { text-decoration: none; color: var(--red); }
1014
+ .pe-ev-cal { display: inline-flex; align-items: center; gap: 6px; }
1015
+ .pe-ev-cal i { width: 8px; height: 8px; border-radius: 50%; }
1016
+ .pe-field input.mono, .pe-ev input.mono { font-family: ui-monospace, 'SF Mono', monospace; font-size: 12px; }
1017
+
1018
+ /* calendar card: site calendars; event card */
1019
+ .pe-cal-site { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; width: 100%; margin-top: 8px; font-size: 12.5px; color: var(--muted); }
1020
+ .pe-cal-site .pe-btn i { width: 8px; height: 8px; border-radius: 50%; }
1021
+ .pe-cal-sitepick { border: 1px dashed var(--line-strong); background: var(--bg); color: var(--text-2); border-radius: var(--r-sm); padding: 3px 8px; font: inherit; font-size: 12.5px; cursor: pointer; }
1022
+ .pe-evcard-one { display: flex; gap: 14px; align-items: center; width: 100%; }
1023
+ .pe-evcard-one img, .pe-evcard-one .g-img { width: 120px; height: 72px; object-fit: cover; border-radius: var(--r-sm); flex: 0 0 auto; }
1024
+ .pe-evcard-one small { display: block; font-size: 11.5px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--accent-deep); }
1025
+ .pe-evcard-one b { display: block; font-size: 15px; color: var(--text); margin-top: 2px; }
1026
+ .pe-evcard-one em { display: block; font-style: normal; font-size: 12px; color: var(--amber); margin-top: 3px; }