@acms-subir/core 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/CHANGELOG.md +106 -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 -315
  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/theme-authoring.md +103 -0
  15. package/email-runner.mjs +32 -0
  16. package/integration.mjs +193 -2
  17. package/ops-check.mjs +27 -0
  18. package/package.json +35 -12
  19. package/src/actions/index.ts +744 -38
  20. package/src/components/AiCleaner.tsx +291 -0
  21. package/src/components/AiSettings.tsx +575 -0
  22. package/src/components/CommandPalette.tsx +200 -0
  23. package/src/components/ContentList.astro +246 -0
  24. package/src/components/DesignAccess.tsx +182 -0
  25. package/src/components/DesignManager.tsx +455 -47
  26. package/src/components/EmailSettings.tsx +521 -0
  27. package/src/components/EventPage.astro +178 -0
  28. package/src/components/LegalPage.astro +27 -0
  29. package/src/components/LinksManager.tsx +216 -97
  30. package/src/components/NavManager.tsx +83 -38
  31. package/src/components/ThemeScript.astro +50 -0
  32. package/src/components/ThemeSections.astro +57 -0
  33. package/src/components/ThemeSectionsEditor.tsx +513 -0
  34. package/src/components/booking/BookingFlow.astro +150 -0
  35. package/src/components/booking/HoursEditor.astro +63 -0
  36. package/src/components/builder/PageBuilder.tsx +10 -2
  37. package/src/components/editor/EventPanel.tsx +401 -0
  38. package/src/components/editor/FormatDock.tsx +81 -0
  39. package/src/components/editor/LivePane.tsx +122 -0
  40. package/src/components/editor/MobileToolbar.tsx +93 -0
  41. package/src/components/editor/PostEditor.tsx +826 -271
  42. package/src/components/editor/PreviewOverlay.tsx +242 -43
  43. package/src/components/editor/extensions/calendar.tsx +51 -7
  44. package/src/components/editor/extensions/cards.tsx +17 -1
  45. package/src/components/editor/extensions/codeBlock.tsx +1 -1
  46. package/src/components/editor/extensions/events.tsx +153 -0
  47. package/src/components/editor/extensions/infoCards.tsx +16 -1
  48. package/src/components/editor/extensions/mediaCards.tsx +36 -2
  49. package/src/components/editor/extensions/slash.tsx +77 -9
  50. package/src/components/editor/extensions/toc.tsx +89 -0
  51. package/src/components/editor/extensions/toggle.tsx +70 -0
  52. package/src/components/site/Pager.astro +24 -0
  53. package/src/components/site/PostCard.astro +64 -0
  54. package/src/components/site/TagLabel.astro +11 -0
  55. package/src/layouts/Admin.astro +289 -49
  56. package/src/layouts/Site.astro +331 -57
  57. package/src/lib/agent-api.ts +13 -0
  58. package/src/lib/agent-discovery.ts +40 -0
  59. package/src/lib/agent.ts +114 -0
  60. package/src/lib/ai-config.ts +58 -0
  61. package/src/lib/ai-schema.ts +22 -0
  62. package/src/lib/ai.ts +90 -0
  63. package/src/lib/analytics.ts +121 -0
  64. package/src/lib/api-keys.ts +65 -0
  65. package/src/lib/api.ts +52 -0
  66. package/src/lib/auth.ts +25 -5
  67. package/src/lib/backup/content.ts +36 -0
  68. package/src/lib/backup/unzip.ts +12 -1
  69. package/src/lib/backup/zip.ts +1 -1
  70. package/src/lib/booking/agent.ts +108 -0
  71. package/src/lib/booking/availability.ts +221 -0
  72. package/src/lib/booking/emails.ts +115 -0
  73. package/src/lib/booking/forms.ts +77 -0
  74. package/src/lib/booking/service.ts +277 -0
  75. package/src/lib/booking/view.ts +54 -0
  76. package/src/lib/calendar/agent-schema.ts +48 -0
  77. package/src/lib/calendar/agent.ts +136 -0
  78. package/src/lib/calendar/api.ts +81 -0
  79. package/src/lib/calendar/cards.ts +102 -0
  80. package/src/lib/calendar/config.ts +52 -0
  81. package/src/lib/calendar/data.ts +130 -0
  82. package/src/lib/calendar/events.ts +261 -0
  83. package/src/lib/calendar/feeds.ts +43 -0
  84. package/src/lib/calendar/hooks.ts +38 -0
  85. package/src/lib/calendar/http.ts +30 -0
  86. package/src/lib/calendar/ics-write.ts +120 -0
  87. package/src/lib/calendar/ics.ts +15 -5
  88. package/src/lib/calendar/import.ts +203 -0
  89. package/src/lib/calendar/render.ts +120 -37
  90. package/src/lib/calendar/rrule.ts +149 -0
  91. package/src/lib/calendar/seo.ts +48 -0
  92. package/src/lib/design-service.ts +58 -0
  93. package/src/lib/designDiff.ts +145 -0
  94. package/src/lib/designPreview.ts +112 -0
  95. package/src/lib/documents/cleanup.ts +31 -0
  96. package/src/lib/documents/extract.ts +154 -0
  97. package/src/lib/documents/vendor.d.ts +4 -0
  98. package/src/lib/drafts.ts +131 -0
  99. package/src/lib/dynamicBlocks.ts +79 -7
  100. package/src/lib/email/accounts.ts +55 -0
  101. package/src/lib/email/config.ts +86 -0
  102. package/src/lib/email/migration.ts +24 -0
  103. package/src/lib/email/providers.ts +89 -0
  104. package/src/lib/email/service.ts +78 -0
  105. package/src/lib/email/store.ts +167 -0
  106. package/src/lib/email/templates.ts +18 -0
  107. package/src/lib/email/types.ts +32 -0
  108. package/src/lib/email/webhooks.ts +87 -0
  109. package/src/lib/email.ts +15 -0
  110. package/src/lib/env.ts +1 -1
  111. package/src/lib/legal/index.ts +25 -0
  112. package/src/lib/mobile/bookings.ts +73 -0
  113. package/src/lib/mobile/calendar.ts +85 -0
  114. package/src/lib/mobile/content.ts +85 -0
  115. package/src/lib/mobile/http.ts +63 -0
  116. package/src/lib/mobile/route.ts +20 -0
  117. package/src/lib/ops.ts +8 -0
  118. package/src/lib/preview.ts +21 -1
  119. package/src/lib/repo/migrations.ts +254 -0
  120. package/src/lib/repo/sql.ts +956 -46
  121. package/src/lib/repo/types.ts +140 -3
  122. package/src/lib/scheduler.ts +25 -0
  123. package/src/lib/schema.ts +362 -0
  124. package/src/lib/search-i18n.ts +3 -0
  125. package/src/lib/socialIcons.ts +32 -0
  126. package/src/lib/tagColor.ts +11 -0
  127. package/src/lib/theme.ts +59 -40
  128. package/src/lib/themeTokens.ts +174 -0
  129. package/src/lib/umami.ts +108 -0
  130. package/src/lib/webhooks.ts +139 -0
  131. package/src/middleware.ts +36 -3
  132. package/src/pages/404.astro +23 -0
  133. package/src/pages/[...slug].astro +10 -5
  134. package/src/pages/account/[action].astro +53 -0
  135. package/src/pages/admin/ai.astro +12 -0
  136. package/src/pages/admin/c/[collection]/[id].astro +14 -4
  137. package/src/pages/admin/c/[collection]/index.astro +127 -91
  138. package/src/pages/admin/calendar/bookings.astro +400 -0
  139. package/src/pages/admin/calendar/calendars.astro +265 -0
  140. package/src/pages/admin/calendar/events/[id].astro +56 -0
  141. package/src/pages/admin/calendar/events/index.astro +408 -0
  142. package/src/pages/admin/calendar/index.ts +4 -0
  143. package/src/pages/admin/calendar/integrations.astro +221 -0
  144. package/src/pages/admin/calendar/resources/[id].astro +180 -0
  145. package/src/pages/admin/calendar/resources/index.astro +106 -0
  146. package/src/pages/admin/calendar/resources/link.astro +196 -0
  147. package/src/pages/admin/design.astro +16 -4
  148. package/src/pages/admin/email.astro +13 -0
  149. package/src/pages/admin/index.astro +237 -87
  150. package/src/pages/admin/links.astro +3 -3
  151. package/src/pages/admin/login.astro +14 -10
  152. package/src/pages/admin/navigation.astro +8 -2
  153. package/src/pages/admin/pages/[id].astro +14 -3
  154. package/src/pages/admin/pages/index.astro +41 -47
  155. package/src/pages/admin/settings.astro +475 -276
  156. package/src/pages/admin/tags.astro +4 -4
  157. package/src/pages/admin/users.astro +38 -28
  158. package/src/pages/api/agent/docs.ts +33 -0
  159. package/src/pages/api/agent/index.ts +21 -0
  160. package/src/pages/api/ai/clean.ts +13 -0
  161. package/src/pages/api/ai/draft.ts +14 -0
  162. package/src/pages/api/ai/settings.ts +53 -0
  163. package/src/pages/api/ai/test.ts +12 -0
  164. package/src/pages/api/backup.ts +8 -21
  165. package/src/pages/api/calendar/availability.ts +35 -0
  166. package/src/pages/api/calendar/bookings/[id].ts +49 -0
  167. package/src/pages/api/calendar/bookings/index.ts +73 -0
  168. package/src/pages/api/calendar/calendars.ts +35 -0
  169. package/src/pages/api/calendar/docs.ts +64 -0
  170. package/src/pages/api/calendar/events/[id].ts +63 -0
  171. package/src/pages/api/calendar/events/index.ts +112 -0
  172. package/src/pages/api/calendar/resources.ts +34 -0
  173. package/src/pages/api/design/capabilities.ts +10 -0
  174. package/src/pages/api/design/index.ts +58 -0
  175. package/src/pages/api/design/keys.ts +24 -0
  176. package/src/pages/api/design/media.ts +32 -0
  177. package/src/pages/api/email/run.ts +11 -0
  178. package/src/pages/api/email/settings.ts +61 -0
  179. package/src/pages/api/email/webhooks/[provider].ts +4 -0
  180. package/src/pages/api/mcp.ts +59 -0
  181. package/src/pages/api/media/upload.ts +2 -2
  182. package/src/pages/api/ops/status.ts +39 -0
  183. package/src/pages/api/restore.ts +27 -37
  184. package/src/pages/api/search.ts +18 -4
  185. package/src/pages/api/v1/availability.ts +7 -0
  186. package/src/pages/api/v1/bookings.ts +17 -0
  187. package/src/pages/api/v1/calendars.ts +7 -0
  188. package/src/pages/api/v1/content/[id].ts +7 -0
  189. package/src/pages/api/v1/content/index.ts +7 -0
  190. package/src/pages/api/v1/events.ts +7 -0
  191. package/src/pages/api/v1/resources.ts +7 -0
  192. package/src/pages/author/[slug].astro +43 -35
  193. package/src/pages/blog/[slug].astro +140 -66
  194. package/src/pages/blog/index.astro +95 -30
  195. package/src/pages/blog/tag/[slug].astro +45 -40
  196. package/src/pages/book/[resource]/[link].astro +70 -0
  197. package/src/pages/book/[resource]/index.astro +63 -0
  198. package/src/pages/book/[resource].ics.ts +38 -0
  199. package/src/pages/book/index.astro +47 -0
  200. package/src/pages/book/manage/[token].astro +108 -0
  201. package/src/pages/calendar/[slug].ics.ts +27 -0
  202. package/src/pages/calendar/feed.ics.ts +15 -0
  203. package/src/pages/calendar/index.astro +191 -0
  204. package/src/pages/embed/book/[resource]/[link].astro +33 -0
  205. package/src/pages/embed/calendar/[slug].astro +43 -0
  206. package/src/pages/events/[slug].astro +74 -0
  207. package/src/pages/events/[slug].ics.ts +25 -0
  208. package/src/pages/index.astro +9 -3
  209. package/src/pages/legal/privacy.astro +4 -0
  210. package/src/pages/legal/terms.astro +4 -0
  211. package/src/pages/links.astro +33 -7
  212. package/src/pages/llms.txt.ts +4 -0
  213. package/src/pages/preview/[type]/[id].astro +34 -8
  214. package/src/pages/search.astro +40 -20
  215. package/src/pages/sitemap.xml.ts +16 -1
  216. package/src/styles/admin.css +928 -105
  217. package/src/styles/cards.css +101 -60
  218. package/src/styles/editor.css +532 -102
  219. package/src/styles/email-settings.css +117 -0
  220. package/src/styles/sections.css +12 -0
  221. package/src/styles/site.css +938 -278
  222. package/src/styles/theme-editor.css +135 -0
  223. package/src/theme-sdk/contract.d.mts +619 -0
  224. package/src/theme-sdk/contract.mjs +80 -0
  225. package/src/theme-sdk/index.ts +15 -0
  226. package/src/theme-sdk/tokens.d.mts +148 -0
  227. package/src/theme-sdk/tokens.mjs +52 -0
  228. package/src/themes/editorial/templates/home.astro +4 -4
  229. package/src/themes/editorial/templates/post-minimal.astro +2 -2
  230. package/src/themes/editorial/theme.css +22 -37
  231. package/src/themes/editorial/theme.json +23 -3
  232. package/src/themes/field/theme.json +26 -9
  233. package/src/themes/ink/theme.json +30 -12
  234. package/src/themes/night/theme.css +4 -7
  235. package/src/themes/night/theme.json +27 -10
  236. package/src/virtual.d.ts +14 -0
  237. package/src/worker.ts +5 -1
@@ -1,16 +1,24 @@
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;
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;
11
12
  }
12
- .pe-topbar-left, .pe-topbar-right { display: flex; align-items: center; gap: 10px; }
13
- .pe-savestate { font-size: 12.5px; color: var(--faint); }
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; }
21
+ .pe-edited-dot { font-style: normal; font-weight: 600; color: var(--amber); }
14
22
  .pe-savestate.dirty { color: var(--muted); }
15
23
  .pe-savestate.saving { color: var(--muted); }
16
24
  .pe-savestate.error { color: var(--red); }
@@ -21,38 +29,41 @@
21
29
  background: var(--panel); color: var(--text);
22
30
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
23
31
  padding: 6px 13px; font-size: 13px; font-weight: 600;
24
- cursor: pointer; font-family: inherit; text-decoration: none;
32
+ cursor: pointer; font-family: inherit; text-decoration: none; white-space: nowrap;
25
33
  box-shadow: var(--shadow-sm);
26
34
  }
27
35
  .pe-btn:hover { border-color: var(--faint); }
28
- .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); }
29
37
  .pe-btn.primary:hover { background: var(--accent-strong); border-color: var(--accent-strong); }
30
38
  .pe-btn.primary:disabled { opacity: 0.5; cursor: default; }
31
39
  .pe-btn.sm { padding: 3px 10px; font-size: 12.5px; }
32
40
  .pe-btn.ghost { background: transparent; border-color: transparent; color: var(--muted); box-shadow: none; }
33
- .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); }
34
42
  .pe-btn.danger { color: var(--red); }
35
43
 
36
- /* layout */
37
- .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); }
38
48
  .pe-main { flex: 1; overflow-y: auto; min-width: 0; }
39
- .pe-column { max-width: 740px; margin: 0 auto; padding: 40px 20px 120px; position: relative; }
40
- .pe-shell.has-sidebar .pe-main { margin-right: 320px; }
41
- .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; }
42
51
 
43
- /* side-by-side live preview */
44
- .pe-splitpane {
45
- width: min(46vw, 760px); flex: 0 0 auto; display: flex; flex-direction: column;
46
- border-left: 1px solid var(--line); background: var(--panel-2);
47
- }
48
- .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); }
49
53
  .pe-split-bar {
50
- display: flex; align-items: center; justify-content: space-between; gap: 8px;
51
- 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; }
52
66
  }
53
- .pe-split-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--faint); }
54
- .pe-split-actions { display: flex; gap: 2px; }
55
- .pe-splitpane iframe { flex: 1; width: 100%; border: 0; background: #fff; }
56
67
 
57
68
  /* checkbox field (page settings) */
58
69
  .pe-field.pe-check { display: flex; align-items: center; gap: 8px; cursor: pointer; }
@@ -61,17 +72,15 @@
61
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; }
62
73
 
63
74
  /* feature image */
64
- .pe-add-feature {
65
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
66
- width: 100%; padding: 26px 16px; margin-bottom: 22px;
67
- background: rgb(26 29 37 / 2%); border: 1.5px dashed var(--line-strong); border-radius: var(--r-lg);
68
- color: var(--faint); font-family: inherit; cursor: pointer; transition: border-color 0.15s, color 0.15s;
69
- }
70
- .pe-add-feature svg { margin-bottom: 4px; }
71
- .pe-add-feature span { font-size: 13.5px; font-weight: 600; color: var(--muted); }
72
- .pe-add-feature em { font-style: normal; font-size: 12px; color: var(--faint); }
73
- .pe-add-feature:hover { border-color: var(--accent); color: var(--accent); }
74
- .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; }
75
84
  .pe-feature { position: relative; margin: 0 0 22px; border-radius: var(--r-lg); overflow: hidden; }
76
85
  .pe-feature img {
77
86
  width: 100%; aspect-ratio: 2 / 1; object-fit: cover; display: block; background: var(--panel-2);
@@ -90,29 +99,53 @@
90
99
  .pe-title {
91
100
  width: 100%; background: none; border: none; resize: none; outline: none;
92
101
  color: var(--text); font-family: inherit; font-weight: 700;
93
- font-size: 36px; line-height: 1.2; letter-spacing: -0.02em;
94
- 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;
95
104
  }
96
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; }
97
127
 
98
128
  /* prose */
99
- .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; }
100
130
  .pe-prose p { margin: 0 0 0.9em; }
131
+ .pe-prose h1 { font-size: 31px; letter-spacing: -0.02em; margin: 1.3em 0 0.5em; }
101
132
  .pe-prose h2 { font-size: 25px; letter-spacing: -0.015em; margin: 1.4em 0 0.5em; }
102
133
  .pe-prose h3 { font-size: 19px; letter-spacing: -0.01em; margin: 1.3em 0 0.4em; }
103
- .pe-prose a { color: var(--accent-deep); text-decoration: underline; text-decoration-color: rgb(238 93 32 / 35%); }
104
- .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; }
105
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; }
106
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; }
107
138
  .pe-prose pre code { background: none; border: none; padding: 0; font-size: 13.5px; }
108
139
  .pe-prose hr { border: none; border-top: 1px solid var(--line); margin: 2em auto; width: 120px; }
140
+ .pe-prose mark { background: #fde58a; color: #1a1d25; border-radius: 3px; padding: 0 2px; }
141
+ .pe-bubble mark { background: #fde58a; border-radius: 3px; padding: 0 4px; color: #1a1d25; }
109
142
 
110
143
  /* ---- code block (extensions/codeBlock.tsx) ---- */
111
144
  .pe-codeblock { position: relative; margin: 1.2em 0; }
112
145
  .pe-codeblock pre { margin: 0; }
113
146
  .pe-codeblock-lang {
114
147
  position: absolute; top: 6px; right: 6px; z-index: 3;
115
- 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);
116
149
  border-radius: 6px; font-size: 11px; font-weight: 600; padding: 2px 6px; font-family: inherit;
117
150
  opacity: 0; transition: opacity 0.12s; cursor: pointer;
118
151
  }
@@ -152,12 +185,27 @@
152
185
  content: ''; position: absolute; inset: 0; background: var(--accent-soft); pointer-events: none;
153
186
  }
154
187
 
155
- .pe-wordcount {
156
- position: fixed; right: 18px; bottom: 14px; font-size: 12px; color: var(--faint);
157
- background: rgb(255 255 255 / 85%); padding: 3px 9px; border-radius: var(--r-full); border: 1px solid var(--line);
158
- pointer-events: none; z-index: 20;
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;
159
194
  }
160
- .pe-shell.has-sidebar .pe-wordcount { right: 338px; }
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; }
161
209
 
162
210
  /* cards (editor chrome around .pc-* public styles) */
163
211
  .pe-card { position: relative; margin: 1.2em 0; border-radius: var(--r-md); }
@@ -169,7 +217,7 @@
169
217
  }
170
218
  .pe-card:hover .pe-card-tools, .pe-card.is-selected .pe-card-tools { opacity: 1; }
171
219
  .pe-card-tools button, .pe-card-tools .pe-provider {
172
- 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);
173
221
  border-radius: 6px; font-size: 11px; font-weight: 700; padding: 3px 8px; cursor: pointer; font-family: inherit;
174
222
  }
175
223
  .pe-card-tools button:hover { color: var(--text); }
@@ -222,17 +270,18 @@
222
270
  background: none; border: none; color: var(--muted); font-family: inherit; font-size: 12.5px;
223
271
  font-weight: 600; padding: 5px 8px; border-radius: 5px; cursor: pointer;
224
272
  }
225
- .pe-bubble button:hover { color: var(--text); background: rgb(26 29 37 / 5%); }
226
- .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); }
227
275
  .pe-bubble-sep { width: 1px; height: 16px; background: var(--line); margin: 0 3px; }
228
276
 
229
- .pe-floating { display: flex; align-items: center; gap: 2px; margin-left: -6px; }
230
- .pe-floating button {
231
- background: none; border: 1px solid var(--line); color: var(--faint); font-family: inherit;
232
- font-size: 11.5px; font-weight: 600; padding: 2px 8px; border-radius: var(--r-full); cursor: pointer;
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;
233
282
  }
234
- .pe-floating button:hover { color: var(--text); border-color: var(--faint); }
235
- .pe-floating-hint { font-size: 11.5px; color: var(--faint); margin-left: 6px; }
283
+ .pe-gutter-add:hover { color: var(--text); border-color: var(--faint); transform: rotate(90deg); }
284
+ .pe-gutter-add svg { width: 14px; height: 14px; }
236
285
 
237
286
  /* slash menu */
238
287
  .pe-slash {
@@ -245,10 +294,16 @@
245
294
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
246
295
  background: none; border: none; border-radius: var(--r-md); padding: 7px 10px; cursor: pointer; font-family: inherit;
247
296
  }
248
- .pe-slash-item.is-selected { background: var(--accent-soft); }
297
+ .pe-slash-item.is-selected { background: var(--sel); }
298
+ .pe-slash-del {
299
+ margin-left: auto; padding: 2px 7px; border-radius: 6px; color: var(--faint);
300
+ font-size: 11px; opacity: 0; transition: opacity 0.1s ease;
301
+ }
302
+ .pe-slash-item:hover .pe-slash-del, .pe-slash-item.is-selected .pe-slash-del { opacity: 1; }
303
+ .pe-slash-del:hover { color: var(--red); background: var(--red-soft); }
249
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); }
250
305
  .pe-slash-icon svg { width: 16px; height: 16px; }
251
- .pe-slash-item.is-selected .pe-slash-icon { color: var(--accent-deep); }
306
+ .pe-slash-item.is-selected .pe-slash-icon { color: var(--text); }
252
307
  .pe-slash-title { display: block; font-size: 13px; font-weight: 600; color: var(--text); }
253
308
  .pe-slash-desc { display: block; font-size: 11.5px; color: var(--faint); }
254
309
  .pe-slash-empty { padding: 12px; color: var(--faint); font-size: 12.5px; }
@@ -261,37 +316,125 @@
261
316
  box-shadow: var(--shadow-pop);
262
317
  }
263
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; }
264
- .pe-pop-item:hover { background: rgb(26 29 37 / 4%); }
319
+ .pe-pop-item:hover { background: var(--hover); }
265
320
  .pe-pop-item b { display: block; font-size: 13px; color: var(--text); }
266
321
  .pe-pop-item span { display: block; font-size: 11.5px; color: var(--faint); }
267
322
  .pe-pop-sep { height: 1px; background: var(--line); margin: 6px 4px; }
268
323
  .pe-pop-note { font-size: 12px; color: var(--amber); padding: 8px 10px 4px; }
269
324
  .pe-pop-schedule { padding: 6px 10px 8px; display: flex; flex-direction: column; gap: 8px; }
270
325
  .pe-pop-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--faint); }
271
- .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; }
272
327
 
273
- /* sidebar */
328
+ /* sidebar — sits under the top bar so Publish stays reachable; a sheet of
329
+ its own in Split mode */
274
330
  .pe-sidebar {
275
- position: fixed; top: 0; right: 0; bottom: 0; width: 320px; z-index: 35;
276
- background: var(--panel); border-left: 1px solid var(--line);
277
- 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
+ }
347
+ }
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);
278
356
  }
279
- .pe-sidebar-head { display: flex; align-items: center; justify-content: space-between; font-weight: 700; font-size: 14px; margin-bottom: 14px; }
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); }
280
397
  .pe-field { display: block; margin-bottom: 14px; }
281
398
  .pe-field > span { display: flex; justify-content: space-between; font-size: 12px; color: var(--muted); margin-bottom: 5px; font-weight: 500; }
282
399
  .pe-field > span em { font-style: normal; color: var(--faint); font-size: 11px; }
283
400
  .pe-field input, .pe-field textarea {
284
401
  width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
285
- 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;
286
403
  }
287
404
  .pe-field input:focus, .pe-field textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
288
405
  .pe-slug { display: flex; align-items: center; background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); }
289
406
  .pe-slug:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
290
- .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; }
291
409
  .pe-slug input { border: none !important; box-shadow: none !important; padding-left: 2px; }
292
- .pe-seo { border-top: 1px solid var(--line); margin-top: 4px; padding-top: 12px; }
293
- .pe-seo summary { cursor: pointer; font-size: 13px; font-weight: 600; color: var(--muted); margin-bottom: 10px; }
294
- .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); }
295
438
 
296
439
  /* tags */
297
440
  .pe-tags {
@@ -301,7 +444,7 @@
301
444
  .pe-tags:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
302
445
  .pe-tag {
303
446
  display: inline-flex; align-items: center; gap: 5px;
304
- 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;
305
448
  padding: 2px 8px; border-radius: var(--r-full);
306
449
  }
307
450
  .pe-tag button { background: none; border: none; color: inherit; cursor: pointer; font-size: 10px; padding: 0; }
@@ -316,7 +459,7 @@
316
459
  display: block; width: 100%; text-align: left; background: none; border: none;
317
460
  color: var(--text); font: inherit; font-size: 13px; padding: 7px 11px; cursor: pointer;
318
461
  }
319
- .pe-tag-suggest button:hover { background: var(--accent-soft); color: var(--accent-deep); }
462
+ .pe-tag-suggest button:hover { background: var(--hover); }
320
463
 
321
464
  /* ---- media crop modal ---- */
322
465
  .mc-modal { width: min(880px, 94vw); }
@@ -346,19 +489,19 @@
346
489
 
347
490
  /* modal (image picker) */
348
491
  .pe-modal-backdrop {
349
- position: fixed; inset: 0; z-index: 60; background: rgb(20 22 28 / 40%);
492
+ position: fixed; inset: 0; z-index: 75; background: var(--dim);
350
493
  display: grid; place-items: center; padding: 24px; backdrop-filter: blur(2px);
351
494
  }
352
495
  .pe-modal {
353
496
  width: 100%; max-width: 640px; max-height: 80vh; display: flex; flex-direction: column;
354
497
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
355
- box-shadow: 0 24px 60px rgb(26 29 37 / 28%);
498
+ box-shadow: var(--shadow-pop);
356
499
  }
357
500
  .pe-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; border-bottom: 1px solid var(--line); }
358
501
  .pe-tabs { display: flex; gap: 2px; }
359
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; }
360
503
  .pe-tabs button:hover { color: var(--text); }
361
- .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); }
362
505
  .pe-modal-close { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 13px; padding: 6px 8px; }
363
506
  .pe-modal-error { color: var(--red); font-size: 12.5px; padding: 10px 16px 0; }
364
507
  .pe-dropzone {
@@ -394,12 +537,12 @@
394
537
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
395
538
  padding: 10px 18px; border-bottom: 1px solid var(--line);
396
539
  }
397
- .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; }
398
541
  .pe-devices button {
399
542
  background: none; border: none; color: var(--muted); font-family: inherit; font-size: 12.5px;
400
543
  font-weight: 600; padding: 4px 14px; border-radius: 6px; cursor: pointer;
401
544
  }
402
- .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); }
403
546
  .pe-preview-actions { display: flex; gap: 8px; }
404
547
  .pe-preview-stage { flex: 1; display: flex; justify-content: center; overflow: hidden; padding: 0; background: var(--panel-2); }
405
548
  .pe-preview-stage iframe { height: 100%; border: 0; background: #fff; transition: width 0.2s ease; }
@@ -413,7 +556,7 @@
413
556
  .pe-postlist-config select, .pe-postlist-config input[type='text'] {
414
557
  width: auto; flex: 0 1 auto; background: var(--bg); color: var(--text);
415
558
  border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px;
416
- font-size: 12.5px; font-family: inherit; color-scheme: light;
559
+ font-size: 12.5px; font-family: inherit;
417
560
  }
418
561
  .pe-postlist-config input[type='text'] { width: 120px; }
419
562
  .pe-postlist-config label { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); white-space: nowrap; }
@@ -440,13 +583,13 @@
440
583
  .pe-toast {
441
584
  position: fixed; top: 14px; left: 50%; transform: translateX(-50%); z-index: 90;
442
585
  display: flex; align-items: center; gap: 10px;
443
- 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);
444
587
  border-radius: var(--r-md); padding: 9px 16px; font-size: 13px;
445
588
  box-shadow: var(--shadow-pop);
446
589
  animation: pe-toast-in 0.18s ease-out;
447
590
  }
448
- .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; }
449
- .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; }
450
593
  .pe-toast a:hover { text-decoration: underline; }
451
594
  @keyframes pe-toast-in { from { opacity: 0; transform: translate(-50%, -6px); } to { opacity: 1; transform: translate(-50%, 0); } }
452
595
  .pe-check-hint { display: block; font-style: normal; font-size: 11px; color: var(--faint); margin-top: 1px; }
@@ -461,8 +604,8 @@
461
604
  .pe-filecard input[type='file'] { font-size: 13px; }
462
605
 
463
606
  .pe-gallery-empty {
464
- border: 1.5px dashed var(--border, #d5d2ca); border-radius: 9px; padding: 22px;
465
- 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);
466
609
  }
467
610
  .pe-gallery-item { position: relative; display: block; }
468
611
  .pe-gallery-item img {
@@ -482,28 +625,35 @@
482
625
  /* floating link editor (⌘K) */
483
626
  .pe-linkedit {
484
627
  position: sticky; top: 12px; z-index: 60;
485
- display: flex; gap: 8px; align-items: center;
486
- background: var(--panel, #fff); border: 1px solid var(--border, #d5d2ca);
628
+ background: var(--panel); border: 1px solid var(--line-strong);
487
629
  border-radius: 10px; padding: 8px 10px; margin: 0 auto 12px;
488
630
  max-width: 560px; box-shadow: 0 10px 30px rgb(0 0 0 / 14%);
489
631
  }
632
+ .pe-linkedit-row { display: flex; gap: 8px; align-items: center; }
490
633
  .pe-linkedit input {
491
634
  flex: 1; border: 0; outline: none; font-size: 14px; background: none; color: inherit;
492
635
  }
636
+ .pe-link-results {
637
+ border-top: 1px solid var(--line); margin-top: 8px; padding-top: 6px;
638
+ display: flex; flex-direction: column;
639
+ }
640
+ .pe-link-results button {
641
+ display: flex; align-items: baseline; gap: 8px; border: 0; background: none;
642
+ text-align: left; padding: 7px 8px; border-radius: 8px; cursor: pointer;
643
+ font: inherit; color: var(--text);
644
+ }
645
+ .pe-link-results button.is-selected { background: var(--panel-2); }
646
+ .pe-link-title { font-size: 13.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
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); }
493
649
 
494
650
  /* shortcut cheat-sheet */
495
- .pe-wordcount { display: flex; align-items: center; gap: 10px; }
496
- .pe-shortcuts-btn {
497
- border: 1px solid var(--border, #d5d2ca); background: none; border-radius: 6px;
498
- font-size: 10.5px; padding: 2px 7px; color: var(--muted, #8a8880); cursor: pointer;
499
- }
500
- .pe-shortcuts-btn:hover { color: inherit; }
501
651
  .pe-shortcuts-overlay {
502
652
  position: fixed; inset: 0; z-index: 90; background: rgb(0 0 0 / 40%);
503
653
  display: flex; align-items: center; justify-content: center; padding: 24px;
504
654
  }
505
655
  .pe-shortcuts {
506
- background: var(--panel, #fff); border-radius: 14px; padding: 20px 24px;
656
+ background: var(--panel); border-radius: 14px; padding: 20px 24px;
507
657
  width: min(440px, 100%); max-height: 80vh; overflow-y: auto;
508
658
  box-shadow: 0 24px 60px rgb(0 0 0 / 25%);
509
659
  }
@@ -514,21 +664,36 @@
514
664
  .pe-shortcuts-group { margin-top: 14px; }
515
665
  .pe-shortcuts-title {
516
666
  font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
517
- color: var(--muted, #8a8880); margin-bottom: 6px;
667
+ color: var(--muted); margin-bottom: 6px;
518
668
  }
519
669
  .pe-shortcuts-row { display: flex; align-items: baseline; gap: 12px; padding: 4px 0; font-size: 13.5px; }
520
670
  .pe-shortcuts-row kbd {
521
671
  flex: none; min-width: 108px; font-family: ui-monospace, monospace; font-size: 12px;
522
- color: var(--muted, #6d685e);
672
+ color: var(--muted);
523
673
  }
524
674
 
525
675
  /* multi-author checklist in the sidebar */
526
- .pe-authors {
527
- display: flex; flex-direction: column; gap: 2px;
528
- border: 1px solid var(--border, #d5d2ca); border-radius: 9px; padding: 8px 10px;
529
- max-height: 180px; overflow-y: auto;
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);
530
686
  }
531
- .pe-author-check { font-size: 13.5px; padding: 3px 0; }
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); }
532
697
 
533
698
  /* ---- calendar card (dynamic block) ---- */
534
699
  .pe-calcard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 12px 10px; }
@@ -538,7 +703,7 @@
538
703
  .pe-calendar-config select, .pe-calendar-config input[type='text'] {
539
704
  width: auto; flex: 0 1 auto; background: var(--bg); color: var(--text);
540
705
  border: 1px solid var(--line); border-radius: var(--r-md); padding: 5px 8px;
541
- font-size: 12.5px; font-family: inherit; color-scheme: light;
706
+ font-size: 12.5px; font-family: inherit;
542
707
  }
543
708
  .pe-calendar-config input.pe-cal-title { flex: 1 1 180px; }
544
709
  .pe-calendar-config label { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); white-space: nowrap; }
@@ -574,7 +739,7 @@
574
739
  .pe-infocard-row { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
575
740
  .pe-infocard input[type='text'], .pe-infocard input[type='url'], .pe-infocard select, .pe-infocard textarea {
576
741
  background: var(--panel); color: var(--text); border: 1px solid var(--line); border-radius: var(--r-md);
577
- 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;
578
743
  }
579
744
  .pe-infocard-title { flex: 1 1 140px; font-weight: 600; }
580
745
  .pe-infocard-badge { flex: 0 1 130px; }
@@ -594,3 +759,268 @@
594
759
  .pe-infocard-icon svg { width: 14px; height: 14px; }
595
760
  .pe-infocard-foot { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
596
761
  .pe-infocard-href { flex: 1; }
762
+
763
+ /* toggle card (editor) — cards.css isn't loaded in the admin, so the box
764
+ look is restated here on the editor tokens */
765
+ .pe-toggle { border: 1px solid var(--line); border-radius: var(--r-md); padding: 12px 16px; margin: 1.2em 0; }
766
+ .pe-toggle.is-selected { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-ring); }
767
+ .pe-toggle .pe-toggle-head { display: flex; align-items: center; gap: 8px; }
768
+ .pe-toggle-chevron {
769
+ border: 0; background: none; cursor: pointer; color: var(--muted);
770
+ font-size: 13px; padding: 2px 4px; transition: transform 0.15s ease;
771
+ }
772
+ .pe-toggle.is-open .pe-toggle-chevron { transform: rotate(90deg); }
773
+ .pe-toggle-summary { flex: 1; border: 0; outline: none; background: none; font: inherit; font-weight: 600; color: inherit; }
774
+ .pe-toggle .pc-toggle-body { margin-top: 10px; }
775
+
776
+ /* toc card (editor) */
777
+ .pe-toc .pc-toc {
778
+ display: flex; flex-direction: column; gap: 2px; margin: 0;
779
+ border-left: 3px solid var(--accent); background: var(--panel-2);
780
+ border-radius: 0 var(--r-md) var(--r-md) 0; padding: 14px 18px;
781
+ }
782
+ .pe-toc .pc-toc-link { padding: 2px 0; font-size: 14.5px; }
783
+ .pe-toc .pc-toc-link[data-depth='1'] { padding-left: 16px; }
784
+ .pe-toc .pc-toc-link[data-depth='2'] { padding-left: 32px; }
785
+ .pe-toc-title {
786
+ border: 0; outline: none; background: none; text-transform: uppercase;
787
+ letter-spacing: 0.08em; font-size: 11.5px; font-weight: 700;
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)); }
966
+ }
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; }