caracms 0.0.0-stage → 0.2.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 (281) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -2
  3. package/bin/caracms.mjs +174 -0
  4. package/bin/gate.mjs +275 -0
  5. package/bin/init.mjs +712 -0
  6. package/bin/media.mjs +662 -0
  7. package/bin/site-runner.mjs +61 -0
  8. package/bin/templates/Page.astro.txt +31 -0
  9. package/bin/templates/TextBlock.astro.txt +13 -0
  10. package/bin/templates/caracms.config.ts.txt +22 -0
  11. package/bin/templates/catch-all.astro.txt +25 -0
  12. package/bin/templates/health.ts.txt +6 -0
  13. package/bin/templates/railway.ts.txt +147 -0
  14. package/package.json +66 -4
  15. package/skills/caracms-adopt/SKILL.md +508 -0
  16. package/skills/caracms-adopt/look-same.mjs +957 -0
  17. package/skills/caracms-blocks/SKILL.md +376 -0
  18. package/skills/caracms-content/SKILL.md +201 -0
  19. package/skills/caracms-tina/SKILL.md +427 -0
  20. package/skills/caracms-tina/field-kinds.md +88 -0
  21. package/skills/caracms-tina/tina-to-caracms.mjs +1011 -0
  22. package/src/block-runs.ts +84 -0
  23. package/src/cards.ts +158 -0
  24. package/src/cli/schemas.ts +122 -0
  25. package/src/cli/site.ts +66 -0
  26. package/src/cli/validate.ts +471 -0
  27. package/src/code-routes-disk.ts +67 -0
  28. package/src/code-routes.ts +134 -0
  29. package/src/columns.ts +39 -0
  30. package/src/components/Block.astro +46 -0
  31. package/src/components/BlockRunTree.astro +45 -0
  32. package/src/components/Blocks.astro +139 -0
  33. package/src/components/Buttons.astro +116 -0
  34. package/src/components/Fonts.astro +14 -0
  35. package/src/components/Form.astro +221 -0
  36. package/src/components/Head.astro +62 -0
  37. package/src/components/Link.astro +68 -0
  38. package/src/components/Lockup.astro +116 -0
  39. package/src/components/Media.astro +124 -0
  40. package/src/components/MediaPlayer.astro +102 -0
  41. package/src/components/RenderDocument.astro +64 -0
  42. package/src/components/RichText.astro +59 -0
  43. package/src/components/Text.astro +81 -0
  44. package/src/components/attributes.ts +33 -0
  45. package/src/components/descriptor.ts +45 -0
  46. package/src/components/form-client.ts +182 -0
  47. package/src/components/media-player.ts +46 -0
  48. package/src/components/media-props.ts +35 -0
  49. package/src/components/sitemap.xml.ts +36 -0
  50. package/src/config.ts +825 -0
  51. package/src/content-schema.ts +166 -0
  52. package/src/content.ts +422 -0
  53. package/src/document.ts +579 -0
  54. package/src/editor/README.md +405 -0
  55. package/src/editor/addresses.ts +61 -0
  56. package/src/editor/brand.ts +118 -0
  57. package/src/editor/client/block-list/BlockList.tsx +342 -0
  58. package/src/editor/client/block-list/Picker.tsx +105 -0
  59. package/src/editor/client/block-list/UnknownBlock.tsx +119 -0
  60. package/src/editor/client/block-list/insert-points.ts +56 -0
  61. package/src/editor/client/block-list/link.ts +71 -0
  62. package/src/editor/client/block-list/reorder.ts +105 -0
  63. package/src/editor/client/block-list/summary.ts +118 -0
  64. package/src/editor/client/collections/CollectionGrid.tsx +143 -0
  65. package/src/editor/client/collections/CollectionTable.tsx +406 -0
  66. package/src/editor/client/collections/table.ts +270 -0
  67. package/src/editor/client/context.tsx +27 -0
  68. package/src/editor/client/documents/DocMenu.tsx +154 -0
  69. package/src/editor/client/documents/actions.ts +192 -0
  70. package/src/editor/client/documents/dialogs.tsx +687 -0
  71. package/src/editor/client/editor.ts +995 -0
  72. package/src/editor/client/fields/ButtonsField.tsx +87 -0
  73. package/src/editor/client/fields/DateField.tsx +200 -0
  74. package/src/editor/client/fields/FieldControl.tsx +61 -0
  75. package/src/editor/client/fields/FieldFrame.tsx +109 -0
  76. package/src/editor/client/fields/GroupField.tsx +113 -0
  77. package/src/editor/client/fields/HiddenToggle.tsx +51 -0
  78. package/src/editor/client/fields/LinkField.tsx +307 -0
  79. package/src/editor/client/fields/ListField.tsx +642 -0
  80. package/src/editor/client/fields/LockupField.tsx +365 -0
  81. package/src/editor/client/fields/MediaField.tsx +823 -0
  82. package/src/editor/client/fields/PageFields.tsx +82 -0
  83. package/src/editor/client/fields/ReferenceField.tsx +209 -0
  84. package/src/editor/client/fields/RichTextField.tsx +306 -0
  85. package/src/editor/client/fields/SelectField.tsx +63 -0
  86. package/src/editor/client/fields/SeoGroup.tsx +282 -0
  87. package/src/editor/client/fields/SimpleFields.tsx +89 -0
  88. package/src/editor/client/fields/TextField.tsx +51 -0
  89. package/src/editor/client/fields/date.ts +73 -0
  90. package/src/editor/client/fields/host.tsx +172 -0
  91. package/src/editor/client/fields/list-summary.ts +85 -0
  92. package/src/editor/client/fields/lockup-rules.ts +181 -0
  93. package/src/editor/client/fields/parts.tsx +458 -0
  94. package/src/editor/client/fields/rich-text-commands.ts +183 -0
  95. package/src/editor/client/fields/rich-text-doc.ts +156 -0
  96. package/src/editor/client/fields/rich-text-schema.ts +224 -0
  97. package/src/editor/client/fields/stale.ts +58 -0
  98. package/src/editor/client/inbox/InboxStage.tsx +272 -0
  99. package/src/editor/client/inbox/store.ts +311 -0
  100. package/src/editor/client/live/format.ts +77 -0
  101. package/src/editor/client/live/marks.tsx +90 -0
  102. package/src/editor/client/live/notices.tsx +213 -0
  103. package/src/editor/client/live/publish.tsx +617 -0
  104. package/src/editor/client/live/session.tsx +162 -0
  105. package/src/editor/client/main.tsx +12 -0
  106. package/src/editor/client/media/LibraryStage.tsx +75 -0
  107. package/src/editor/client/media/ReplaceDialog.tsx +355 -0
  108. package/src/editor/client/media/store.ts +618 -0
  109. package/src/editor/client/nav/DocRow.tsx +122 -0
  110. package/src/editor/client/nav/search.ts +71 -0
  111. package/src/editor/client/nav/tree.ts +93 -0
  112. package/src/editor/client/overlays/OverlayMount.tsx +26 -0
  113. package/src/editor/client/overlays/editor-marks.ts +159 -0
  114. package/src/editor/client/overlays/index.ts +50 -0
  115. package/src/editor/client/overlays/layer.ts +437 -0
  116. package/src/editor/client/overlays/overlay-css.ts +177 -0
  117. package/src/editor/client/overlays/rich-text-bar.ts +717 -0
  118. package/src/editor/client/pane/Pane.tsx +91 -0
  119. package/src/editor/client/pane/levels/BlockLevel.tsx +123 -0
  120. package/src/editor/client/pane/levels/CollectionLevel.tsx +115 -0
  121. package/src/editor/client/pane/levels/DocumentLevel.tsx +93 -0
  122. package/src/editor/client/pane/levels/DocumentsLevel.tsx +390 -0
  123. package/src/editor/client/pane/levels/FileLevel.tsx +132 -0
  124. package/src/editor/client/pane/levels/FormLevel.tsx +550 -0
  125. package/src/editor/client/pane/levels/MediaLevel.tsx +657 -0
  126. package/src/editor/client/pane/levels/SettingsM6.tsx +299 -0
  127. package/src/editor/client/pane/levels/SubmissionsLevel.tsx +185 -0
  128. package/src/editor/client/pane/parts.tsx +179 -0
  129. package/src/editor/client/pane/switcher.tsx +165 -0
  130. package/src/editor/client/preview/driver.ts +640 -0
  131. package/src/editor/client/preview/field-text.ts +71 -0
  132. package/src/editor/client/preview/follow-links.ts +234 -0
  133. package/src/editor/client/preview/layout.ts +37 -0
  134. package/src/editor/client/preview/link-target.ts +50 -0
  135. package/src/editor/client/preview/markers.ts +86 -0
  136. package/src/editor/client/preview/page-edit.ts +632 -0
  137. package/src/editor/client/preview/page-editor-registry.ts +63 -0
  138. package/src/editor/client/preview/page-editor.ts +235 -0
  139. package/src/editor/client/preview/render-sequencer.ts +113 -0
  140. package/src/editor/client/preview/selection.ts +116 -0
  141. package/src/editor/client/preview/warnings.ts +61 -0
  142. package/src/editor/client/shell/App.tsx +101 -0
  143. package/src/editor/client/shell/Bar.tsx +197 -0
  144. package/src/editor/client/shell/Brand.tsx +33 -0
  145. package/src/editor/client/shell/Icons.tsx +87 -0
  146. package/src/editor/client/shell/NarrowNote.tsx +47 -0
  147. package/src/editor/client/shell/Popovers.tsx +47 -0
  148. package/src/editor/client/shell/Stage.tsx +132 -0
  149. package/src/editor/client/shell/Toast.tsx +61 -0
  150. package/src/editor/client/state/document-store.ts +465 -0
  151. package/src/editor/client/state/keeper.ts +713 -0
  152. package/src/editor/client/state/live.ts +257 -0
  153. package/src/editor/client/state/schema.ts +42 -0
  154. package/src/editor/client/state/store.ts +39 -0
  155. package/src/editor/fonts/OFL-GeistMono.txt +93 -0
  156. package/src/editor/fonts/OFL-InstrumentSans.txt +93 -0
  157. package/src/editor/fonts/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  158. package/src/editor/fonts/geist-mono-latin-wght-normal.woff2 +0 -0
  159. package/src/editor/fonts/instrument-sans-latin-ext-wght-normal.woff2 +0 -0
  160. package/src/editor/fonts/instrument-sans-latin-wght-normal.woff2 +0 -0
  161. package/src/editor/middleware.ts +62 -0
  162. package/src/editor/routes/_live.ts +26 -0
  163. package/src/editor/routes/admin.astro +80 -0
  164. package/src/editor/routes/create.ts +19 -0
  165. package/src/editor/routes/delete.ts +19 -0
  166. package/src/editor/routes/document.ts +39 -0
  167. package/src/editor/routes/documents.ts +30 -0
  168. package/src/editor/routes/github.ts +23 -0
  169. package/src/editor/routes/history.ts +9 -0
  170. package/src/editor/routes/lock.ts +9 -0
  171. package/src/editor/routes/login/assets.d.ts +10 -0
  172. package/src/editor/routes/login/login.ts +43 -0
  173. package/src/editor/routes/media.ts +16 -0
  174. package/src/editor/routes/move.ts +17 -0
  175. package/src/editor/routes/notice.ts +9 -0
  176. package/src/editor/routes/preview.astro +77 -0
  177. package/src/editor/routes/publish.ts +9 -0
  178. package/src/editor/routes/status.ts +9 -0
  179. package/src/editor/routes/submissions.ts +16 -0
  180. package/src/editor/routes/try-again.ts +9 -0
  181. package/src/editor/routes/write.ts +18 -0
  182. package/src/editor/server/admin-props.ts +151 -0
  183. package/src/editor/server/cards.ts +61 -0
  184. package/src/editor/server/create.ts +414 -0
  185. package/src/editor/server/drafts-store.ts +127 -0
  186. package/src/editor/server/media/alt.ts +107 -0
  187. package/src/editor/server/media/bucket.ts +295 -0
  188. package/src/editor/server/media/config.ts +78 -0
  189. package/src/editor/server/media/handler.ts +221 -0
  190. package/src/editor/server/media/library.ts +254 -0
  191. package/src/editor/server/media/memory.ts +184 -0
  192. package/src/editor/server/media/mux.ts +241 -0
  193. package/src/editor/server/media/sniff.ts +599 -0
  194. package/src/editor/server/media/upload.ts +175 -0
  195. package/src/editor/server/mode.ts +63 -0
  196. package/src/editor/server/move.ts +295 -0
  197. package/src/editor/server/render.tsx +9 -0
  198. package/src/editor/server/replace.ts +72 -0
  199. package/src/editor/server/settings.ts +35 -0
  200. package/src/editor/server/write.ts +366 -0
  201. package/src/editor/styles/editor.css +502 -0
  202. package/src/editor/styles/fonts.css +40 -0
  203. package/src/editor/styles/levels/README.md +4 -0
  204. package/src/editor/styles/levels/collections.css +99 -0
  205. package/src/editor/styles/levels/document-level.css +10 -0
  206. package/src/editor/styles/levels/documents.css +9 -0
  207. package/src/editor/styles/levels/fields.css +171 -0
  208. package/src/editor/styles/levels/files.css +95 -0
  209. package/src/editor/styles/levels/live.css +10 -0
  210. package/src/editor/styles/levels/m5a-documents.css +51 -0
  211. package/src/editor/styles/levels/m6.css +82 -0
  212. package/src/editor/styles/levels/media.css +175 -0
  213. package/src/editor/styles/levels/switcher.css +3 -0
  214. package/src/editor/styles/tokens.css +114 -0
  215. package/src/editor/tsconfig.json +16 -0
  216. package/src/editor/types.ts +881 -0
  217. package/src/editor/ui-state.ts +113 -0
  218. package/src/email.ts +67 -0
  219. package/src/fields.ts +1129 -0
  220. package/src/files-route.ts +201 -0
  221. package/src/files.ts +116 -0
  222. package/src/forms/email.ts +149 -0
  223. package/src/forms/endpoint.ts +347 -0
  224. package/src/forms/inbox.ts +273 -0
  225. package/src/forms/rate-limit.ts +130 -0
  226. package/src/forms/route.ts +24 -0
  227. package/src/forms/rules.ts +278 -0
  228. package/src/forms/store.ts +486 -0
  229. package/src/head.ts +125 -0
  230. package/src/index.ts +434 -0
  231. package/src/json-source.ts +116 -0
  232. package/src/links.ts +121 -0
  233. package/src/live/README.md +43 -0
  234. package/src/live/auth/allow-rules.ts +70 -0
  235. package/src/live/auth/allow.ts +128 -0
  236. package/src/live/auth/auth.ts +155 -0
  237. package/src/live/auth/email.ts +84 -0
  238. package/src/live/auth/guard.ts +111 -0
  239. package/src/live/auth/index.ts +68 -0
  240. package/src/live/auth/links.ts +101 -0
  241. package/src/live/auth/login.ts +245 -0
  242. package/src/live/auth/middleware.ts +53 -0
  243. package/src/live/auth/request.ts +56 -0
  244. package/src/live/auth/routes.ts +9 -0
  245. package/src/live/auth/session.ts +181 -0
  246. package/src/live/auth/views.ts +355 -0
  247. package/src/live/autosaves.ts +306 -0
  248. package/src/live/backend.ts +652 -0
  249. package/src/live/branches.ts +19 -0
  250. package/src/live/drafts-store.ts +591 -0
  251. package/src/live/editor.ts +465 -0
  252. package/src/live/git.ts +1021 -0
  253. package/src/live/github.ts +271 -0
  254. package/src/live/locals.ts +24 -0
  255. package/src/live/locks.ts +273 -0
  256. package/src/live/merge.ts +197 -0
  257. package/src/live/messages.ts +151 -0
  258. package/src/live/mode.ts +210 -0
  259. package/src/live/redis.ts +533 -0
  260. package/src/live/runtime.ts +164 -0
  261. package/src/live/status.ts +109 -0
  262. package/src/live/sweep.ts +228 -0
  263. package/src/live/timings.ts +47 -0
  264. package/src/live/webhook.ts +39 -0
  265. package/src/lockup-css.ts +58 -0
  266. package/src/measure.ts +145 -0
  267. package/src/media-value.ts +239 -0
  268. package/src/media.ts +255 -0
  269. package/src/read.ts +256 -0
  270. package/src/redirect-middleware.ts +49 -0
  271. package/src/redirects.ts +76 -0
  272. package/src/relink.ts +293 -0
  273. package/src/reserved.ts +24 -0
  274. package/src/rich-text.ts +690 -0
  275. package/src/schema-key.ts +63 -0
  276. package/src/seo.ts +124 -0
  277. package/src/serialize.ts +697 -0
  278. package/src/skipped.ts +35 -0
  279. package/src/slug.ts +121 -0
  280. package/src/text-styles.ts +62 -0
  281. package/src/virtual.d.ts +28 -0
@@ -0,0 +1,99 @@
1
+ /* ══ A flat collection as a table over the stage (pre-M7 polish; collections/CollectionTable.tsx) ══
2
+ In the editor's own language: the sidebar's rows (wash on hover, the open one a wash with a ring,
3
+ no side rails), its find box and inputs, its chips; light, over the stage, full width. */
4
+ .stage-table{position:absolute;inset:0;z-index:3;display:none;flex-direction:column;min-height:0;background:var(--surface);color:var(--text)}
5
+ .stage.is-table .stage-table{display:flex;animation:fade-in var(--dur-base) var(--ease-out)}
6
+ .stage.is-table .frame{visibility:hidden}
7
+ .ctable{display:flex;flex-direction:column;flex:1;min-height:0}
8
+ .ct-head{flex:none;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--space-3);padding:var(--space-4) var(--space-6) var(--space-3);border-bottom:1px solid var(--border)}
9
+ .ct-head>.ct-title{display:flex;align-items:baseline;gap:var(--space-2);min-width:0}
10
+ .ct-head>.ct-title>.i{align-self:center;color:var(--icon)}
11
+ .ct-head>.ct-title h2{margin:0;font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);white-space:nowrap}
12
+ .ct-head>.ct-title .n-chip{font-size:var(--text-sm);font-weight:var(--weight-medium);color:var(--text-subtle);white-space:nowrap}
13
+ .ct-sub{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-xs);color:var(--text-subtle)}
14
+ .ct-tools{grid-column:1 / -1;display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap}
15
+ .ct-tools .find{width:240px;margin:0}
16
+ .ct-filter{width:auto;max-width:200px;height:var(--control-h-sm);padding-top:0;padding-bottom:0;font-size:var(--text-sm)}
17
+ .ct-filter.is-set{border-color:var(--select);background-color:var(--select-wash)}
18
+ .ct-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;padding:var(--space-2) var(--space-4) var(--space-6);scrollbar-width:thin;scrollbar-color:var(--border-hover) transparent}
19
+ .ct{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--text-base);font-variant-numeric:tabular-nums}
20
+ .ct thead th{position:sticky;top:calc(-1 * var(--space-2));z-index:1;padding:0;background:var(--surface);border-bottom:1px solid var(--border);text-align:left;font-weight:var(--weight-medium)}
21
+ .ct-sort{display:inline-flex;align-items:center;gap:var(--space-1);height:32px;padding:0 var(--space-2);border:0;border-radius:var(--radius-sm);background:none;color:var(--text-subtle);font-size:var(--text-xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase;white-space:nowrap}
22
+ .ct-sort:hover{color:var(--text)}
23
+ .ct-sort .i{opacity:0;transition:opacity var(--dur-fast)}
24
+ .ct-sort:hover .i,.ct-sort.on .i{opacity:1}
25
+ .ct-sort.on{color:var(--text)}
26
+ .ct tbody tr{cursor:pointer}
27
+ .ct tbody th,.ct tbody td{height:var(--row-h);padding:var(--space-1-5) var(--space-2);border-bottom:1px solid var(--border);text-align:left;font-weight:var(--weight-regular);vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}
28
+ .ct tbody th:first-child,.ct tbody td:first-child{border-radius:var(--radius-md) 0 0 var(--radius-md)}
29
+ .ct tbody th:last-child,.ct tbody td:last-child{border-radius:0 var(--radius-md) var(--radius-md) 0}
30
+ .ct tbody tr:hover>*{background:var(--surface-hover)}
31
+ .ct tbody tr.is-current>*{background:var(--select-wash);color:var(--select-strong);border-bottom-color:transparent;box-shadow:inset 0 1px 0 var(--select),inset 0 -1px 0 var(--select)}
32
+ .ct tbody tr.is-current>:first-child{box-shadow:inset 1px 0 0 var(--select),inset 0 1px 0 var(--select),inset 0 -1px 0 var(--select)}
33
+ .ct tbody tr.is-current>:last-child{box-shadow:inset -1px 0 0 var(--select),inset 0 1px 0 var(--select),inset 0 -1px 0 var(--select)}
34
+ .ct-title-cell{max-width:none!important;width:34%}
35
+ .ct-title-cell>*{vertical-align:middle}
36
+ .ct-open{display:inline;max-width:100%;padding:0;border:0;background:none;color:var(--text);font-weight:var(--weight-medium);text-align:left;overflow:hidden;text-overflow:ellipsis}
37
+ .ct-open:focus-visible{outline:2px solid var(--select);outline-offset:2px;border-radius:var(--radius-xs)}
38
+ .ct-title-cell .meta{display:inline-flex;align-items:center;gap:var(--space-1);margin-left:var(--space-1-5)}
39
+ .ct-title-cell .meta:empty{display:none}
40
+ .ct-extra{margin-left:var(--space-2);font-size:var(--text-xs);color:var(--text-subtle)}
41
+ .ct tr.is-warned .ct-open{color:var(--text-muted)}
42
+ .ct tr.is-current .ct-open{color:var(--select-strong);font-weight:var(--weight-semibold)}
43
+ .ct-address{font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-muted)}
44
+ .ct-edited{color:var(--text-muted)}
45
+ .ct-number{text-align:right!important}
46
+ .ct-toggle .i{color:var(--select)}
47
+ .ct-nil{color:var(--border-hover)}
48
+ .ct-none{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-4) var(--space-2)}
49
+ .ct-empty{margin:var(--space-8) auto;max-width:360px}
50
+ @container app (max-width:1100px){.ct-tools .find{width:180px}.ct-sub{display:none}}
51
+
52
+ /* ══ M6c (G5) · the List / Grid switch: the editor's mini segmented control, at the end of the tools row ══ */
53
+ .ct-view{margin:0 0 0 auto;flex:none}
54
+ .ct-view button{flex:none;padding:0 var(--space-2-5)}
55
+ /* In Grid there are no column headers to sort by, so the order is a select beside the filters (the same view's sort) */
56
+ .ct-order{max-width:240px}
57
+
58
+ /* ══ M6c (G5) · the grid (collections/CollectionGrid.tsx): cards, as many as the stage fits. A card is the sidebar's
59
+ row grown up: a wash on hover, the open one a wash with a full ring (never a side rail) ══ */
60
+ .cgrid{--card-ratio:4/3;display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--card-min),1fr));gap:var(--card-gap-y) var(--card-gap-x);padding:var(--space-2) 0 0}
61
+ .card{position:relative;display:flex;flex-direction:column;gap:var(--space-2);min-width:0;padding:var(--card-pad) var(--card-pad) var(--space-2);border:1px solid transparent;border-radius:var(--radius-lg);background:none;color:var(--text);text-align:left;font:inherit;cursor:pointer;transition:background var(--dur-fast),border-color var(--dur-fast)}
62
+ .card:hover{background:var(--surface-hover)}
63
+ .card:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
64
+ .card.is-current{background:var(--select-wash);border-color:var(--select)}
65
+ .card-pic{position:relative;display:block}
66
+ .card .ph{display:block;width:100%;aspect-ratio:var(--card-ratio);border-radius:var(--radius-md);background:var(--card-loading-bg)}
67
+ /* A hairline inside every picture, so a pale one still has an edge */
68
+ .card .ph::after{content:"";position:absolute;inset:0;z-index:2;border-radius:inherit;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--text) 9%,transparent);pointer-events:none}
69
+ /* The picture lands already cropped (cards.ts); it fades in once it has loaded, and is simply there when it already had */
70
+ .card-img{opacity:0;transition:opacity var(--dur-base) var(--ease-out)}
71
+ .card-img.in{opacity:1}
72
+ .card-img.now{transition:none}
73
+ .card-txt{display:flex;flex-direction:column;gap:1px;min-width:0;padding:0 var(--space-0-5)}
74
+ .card-t{display:flex;align-items:center;gap:var(--space-1-5);min-width:0;font-size:var(--text-base);font-weight:var(--weight-medium);line-height:1.35}
75
+ .card-t .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
76
+ .card-t .meta{display:inline-flex;align-items:center;gap:var(--space-1);flex:none}
77
+ .card-t .meta:empty{display:none}
78
+ .card.is-current .card-t{color:var(--select-strong);font-weight:var(--weight-semibold)}
79
+ .card.is-warned .card-t .nm{color:var(--text-muted)}
80
+ .card-cs{display:flex;flex-direction:column;gap:1px;min-width:0}
81
+ .card-c{font-size:var(--text-xs);color:var(--text-subtle);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.45}
82
+ .card-c.mono{font-family:var(--font-mono);font-size:var(--text-2xs)}
83
+ .card.is-current .card-c{color:color-mix(in srgb,var(--select-strong) 70%,var(--text-subtle))}
84
+ /* Someone's lock, said on the picture's top right (clear of a text card's title and a clip's badge): the lock chip,
85
+ raised so it reads on any picture */
86
+ .card-lock{position:absolute;right:var(--space-1-5);top:var(--space-1-5);z-index:3;display:inline-flex;align-items:center;gap:var(--space-1);height:22px;padding:0 var(--space-2) 0 2px;box-shadow:inset 0 0 0 1px var(--status-locked-border),var(--shadow-raised)}
87
+ /* A clip's poster: the library's duration badge, with a play mark */
88
+ .card .pbadge{right:var(--space-1-5);bottom:var(--space-1-5);z-index:3;height:18px;padding:0 5px 0 4px}
89
+ .card .pbadge .i{width:9px;height:9px;fill:currentColor;stroke:none}
90
+ /* The text card: no image, so the title is set in the picture's place, on paper, like a plain book cover.
91
+ It's never empty-looking: a type size of its own, the collection's icon, and the same hairline as a picture */
92
+ .card .ph.tcard{position:relative;display:flex;flex-direction:column;justify-content:space-between;gap:var(--space-2);padding:var(--space-3);background:var(--card-text-bg);container-type:normal}
93
+ .tcard>.i{color:var(--icon);opacity:.8}
94
+ .tcard .tc-t{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden;font-size:var(--text-xl);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);line-height:1.18;color:var(--text);text-wrap:balance}
95
+ .card.is-current .tcard{background:color-mix(in srgb,var(--select) 9%,var(--surface))}
96
+ /* Posts and tags (Decision 13): a reference that's gone, and a list of references' header, which doesn't sort. */
97
+ .ct-missing{color:var(--status-warning-strong);font-weight:var(--weight-medium)}
98
+ .ct-label{cursor:default}
99
+ .ct-label:hover{color:var(--text-subtle)}
@@ -0,0 +1,10 @@
1
+ /* The document level: the block list, the add-block picker, the empty page (Phase 4), beyond ../editor.css.
2
+ Tokens only (M2 Decision 7); no side rails (M2 Decision 10). */
3
+
4
+ .ptype:focus-visible{border-color:var(--select)}
5
+
6
+ /* An unknown block's "What's kept" (Decision 21): each top-level key with a short preview. */
7
+ .panel .kept{display:grid;gap:var(--space-1);margin:var(--space-2) 0 0;font-size:var(--text-sm)}
8
+ .panel .kept>div{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.6fr);gap:var(--space-2)}
9
+ .panel .kept dt{color:var(--text);font-weight:var(--weight-medium)}
10
+ .panel .kept dd{margin:0;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@@ -0,0 +1,9 @@
1
+ /* The documents level and a collection's level (Phase 4), beyond the mockup's CSS in ../editor.css.
2
+ Tokens only (M2 Decision 7); no side rails (M2 Decision 10): a warned row is an icon, not a stripe. */
3
+
4
+ /* A file that can't be opened (Decisions 8–9): listed, muted, with its warning mark; clicking says why. */
5
+ .drow.is-warned{cursor:default}
6
+ .drow.is-warned .nm{color:var(--text-muted)}
7
+ .drow.is-warned:hover{background:var(--surface-hover)}
8
+ .doc-why{margin:var(--space-1) 0 var(--space-2)}
9
+ .doc-why p{overflow-wrap:anywhere}
@@ -0,0 +1,171 @@
1
+ /* M5a's fields (Phase 4): rich text, link, buttons, toggle, number, date, list and reference, in the field
2
+ frame. Lifted as is from the mockup's revision (notes/mockups/m2-editor.html, its M5a field CSS), then the
3
+ few rules the real components need beyond it, at the end. Tokens only (M2 Decision 7); no side rails
4
+ (M2 Decision 10): a warned row or link is a wash and a full border. The date is the browser's own input
5
+ (M5a Decision 2), so the mockup's calendar isn't here. */
6
+
7
+ /* Rich text, the one `richText` field (M5a): paragraphs, bold, italic, links, lists, line breaks; H2/H3 only when
8
+ the block's author switched headings on. Never an H1, no slash menu. Enter: new paragraph (in a list, a new item);
9
+ Shift+Enter: a line break inside the paragraph, heading or item. */
10
+ .prose-wrap{position:relative;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);transition:border-color var(--dur-fast),box-shadow var(--dur-fast)}
11
+ .prose-wrap:focus-within{border-color:var(--select);box-shadow:0 0 0 3px var(--select-halo)}
12
+ .tb{position:relative;display:flex;align-items:center;gap:2px;padding:3px;border-bottom:1px solid var(--border)}
13
+ .tb>button{display:inline-grid;place-items:center;width:26px;height:24px;padding:0;border:0;border-radius:var(--radius-sm);background:none;color:var(--text-muted);font-size:var(--text-sm);font-weight:var(--weight-semibold)}
14
+ .tb>button:hover:not(:disabled){background:var(--surface-hover);color:var(--text)}
15
+ .tb>button[aria-pressed="true"],.tb>button[aria-expanded="true"]{background:var(--surface-pressed);color:var(--text)}
16
+ .tb>.tb-style{display:inline-flex;gap:var(--space-1);width:auto;padding:0 var(--space-1-5) 0 var(--space-2);color:var(--text);font-weight:var(--weight-medium)}
17
+ .tb .sep{width:1px;height:16px;margin:0 var(--space-1);background:var(--border)}
18
+ .tb .menu{left:2px;top:calc(100% + 2px);min-width:180px}
19
+ .tb .menu .st-p{font-size:var(--text-base)}
20
+ .tb .menu .st-h2{font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}
21
+ .tb .menu .st-h3{font-size:var(--text-md);font-weight:var(--weight-semibold)}
22
+ .tb .menu button[aria-checked="true"]{background:var(--select-wash);color:var(--select-strong)}
23
+ .prose{min-height:70px;padding:8px 10px;outline:0;line-height:var(--leading-loose)}
24
+ .prose p+p{margin-top:8px}
25
+ .rt{min-height:120px}
26
+ .rt>*+*{margin-top:var(--space-2)}
27
+ .rt h2,.rt h3{margin:var(--space-3) 0 0;font-weight:var(--weight-semibold);line-height:var(--leading-tight);letter-spacing:var(--tracking-tight)}
28
+ .rt>h2:first-child,.rt>h3:first-child{margin-top:0}
29
+ .rt h2{font-size:var(--text-lg)}
30
+ .rt h3{font-size:var(--text-md)}
31
+ .rt ul,.rt ol{margin-bottom:0;padding-left:var(--space-5)}
32
+ .rt li+li{margin-top:var(--space-0-5)}
33
+ .rt a{color:var(--select-strong);text-decoration:underline;text-decoration-color:color-mix(in srgb,currentColor 45%,transparent);text-underline-offset:2px}
34
+ .rt .rt-sel{background:var(--select-halo);border-radius:2px;box-shadow:0 0 0 1px var(--select-halo)}
35
+ .rt .is-caret{background:var(--surface-sunken);border-radius:var(--radius-xs);box-shadow:0 0 0 4px var(--surface-sunken)}
36
+ /* Field messages that never block anything (amber), beside .field-err, which is for what does (red, Decision 12) */
37
+ .field-warn{display:flex;align-items:flex-start;gap:var(--space-1-5);margin-top:var(--space-1-5);font-size:var(--text-sm);color:var(--status-warning);font-weight:var(--weight-medium)}
38
+ .field-warn .i{margin-top:2px;color:var(--status-warning-dot)}
39
+ .field-warn.quiet{font-weight:var(--weight-regular);color:var(--text-muted)}
40
+ /* Repeatable list (M5a): repeatable groups of fields. A collapsed item shows a one-line summary; one opens at a time.
41
+ Add, remove (with Undo), reorder by drag and ⌥↑/⌥↓, as blocks are. No lists inside lists. */
42
+ .items{display:flex;flex-direction:column;gap:var(--space-1)}
43
+ .item{position:relative;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);transition:border-color var(--dur-fast),box-shadow var(--dur-fast)}
44
+ .item:hover{border-color:var(--border-hover)}
45
+ .item.is-open{border-color:var(--border-strong);box-shadow:var(--shadow-control)}
46
+ .item.is-warn{background:var(--status-warning-wash);border-color:var(--status-warning-border)}
47
+ .item-h{display:flex;align-items:center;gap:var(--space-0-5);min-height:32px;padding:0 var(--space-0-5) 0 var(--space-1)}
48
+ .item-h .grip{display:inline-flex;opacity:1}
49
+ .item-sum{flex:1;min-width:0;display:flex;align-items:center;gap:var(--space-1-5);height:30px;padding:0 var(--space-1);border:0;border-radius:var(--radius-sm);background:none;text-align:left;font-size:var(--text-base);white-space:nowrap}
50
+ .item-sum:focus-visible{outline-offset:-2px}
51
+ .item-sum .s{min-width:0;overflow:hidden;text-overflow:ellipsis}
52
+ .item-sum .s span{color:var(--text-muted)}
53
+ .item-sum .s em{font-style:normal;color:var(--text-subtle)}
54
+ .item-sum .wmark{flex:none}
55
+ .item-sum>.i:last-child{margin-left:auto;color:var(--icon);transition:rotate var(--dur-fast) var(--ease-out)}
56
+ .item.is-open .item-sum>.i:last-child{rotate:90deg}
57
+ .item .ib{width:26px;height:26px}
58
+ /* An open row's fields take its full width, the same inset each side: no indent under the drag handle, as its image never had one */
59
+ .item-b{padding:0 var(--space-2-5) var(--space-2-5)}
60
+ .item-b .sub-label:first-child{margin-top:var(--space-0-5)}
61
+ .item .menu{right:2px;top:30px}
62
+ .list-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-top:var(--space-2)}
63
+ .list-empty{padding:var(--space-2-5) var(--space-3);border:1px dashed var(--border-strong);border-radius:var(--radius-md);font-size:var(--text-sm);color:var(--text-muted)}
64
+ /* M7: a list inside a list, one level (Decisions 14–15). The inner list sits inside its open outer row, on a sunken wash
65
+ with its own label, count, Add and drag hint. Its rows are the same rows. Nesting reads from the inset and the wash,
66
+ never a side rail. */
67
+ .sublist{margin-top:var(--space-2-5);padding:var(--space-2) var(--space-2) var(--space-1-5);border-radius:var(--radius-md);background:var(--surface-sunken)}
68
+ .sublist-h{display:flex;align-items:baseline;gap:var(--space-2);margin:0 var(--space-0-5) var(--space-1-5)}
69
+ .sublist-h .sub-label{margin:0}
70
+ .sublist-h .field-meta{margin-left:auto}
71
+ .sublist>.field-help{margin:0 var(--space-0-5) var(--space-1-5)}
72
+ .sublist .list-foot{margin-top:var(--space-1-5);padding:0 var(--space-0-5)}
73
+ .sublist .list-empty{background:var(--surface);padding:var(--space-2) var(--space-2-5)}
74
+ /* Reference (M5a): picks a document from another collection. A list of them reorders like any list. */
75
+ .refs{display:flex;flex-direction:column;gap:var(--space-1)}
76
+ .ref{position:relative;display:flex;align-items:center;gap:var(--space-2);min-height:42px;padding:var(--space-1) var(--space-0-5) var(--space-1) var(--space-1);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}
77
+ .ref:hover{border-color:var(--border-hover)}
78
+ .ref .grip{display:inline-flex;opacity:1}
79
+ .ref>.i{color:var(--icon)}
80
+ .ref .t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
81
+ .ref .t b{font-weight:var(--weight-medium);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
82
+ .ref .t small{font:var(--text-xs)/1.35 var(--font-mono);color:var(--text-subtle);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
83
+ .ref .yr{font-size:var(--text-xs);color:var(--text-subtle);font-variant-numeric:tabular-nums}
84
+ .ref .ib{width:26px;height:26px}
85
+ .ref.is-missing{background:var(--status-warning-wash);border-color:var(--status-warning-border)}
86
+ .ref.is-missing>.i{color:var(--status-warning-dot)}
87
+ .ref.is-missing .t b{color:var(--status-warning-strong)}
88
+ .ref.is-missing .t small{color:var(--status-warning)}
89
+ /* Pickers that drop from a field: documents for a link or a reference */
90
+ .lpop{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:6;padding:var(--space-1);background:var(--surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-pop);animation:pop-in var(--dur-base) var(--ease-out)}
91
+ .lpop .find{margin:0 0 var(--space-1)}
92
+ .lpop .find .input{min-height:30px}
93
+ .lpop .sw-h{padding:var(--space-1-5) var(--space-2) var(--space-1)}
94
+ .lpop .drow{min-height:32px}
95
+ .lpop .drow .meta .mono{font-size:var(--text-2xs)}
96
+ .lpop .drow.is-active{background:var(--surface-hover)}
97
+ .lpop .drow:disabled{cursor:default;background:none;color:var(--text-subtle)}
98
+ .lpop .drow:disabled .i{color:var(--border-hover)}
99
+ .lpop-foot{margin-top:var(--space-1);padding:var(--space-2) var(--space-2) var(--space-1);border-top:1px solid var(--border);font-size:var(--text-xs);color:var(--text-subtle);line-height:1.5}
100
+ /* Link (M5a): a label and where it goes — a document picked from the site, or a typed /path, https://, mailto:, tel: or #anchor */
101
+ .lnk{position:relative}
102
+ .lnk-box{display:flex;align-items:center;gap:var(--space-1-5);min-height:var(--control-h);padding:0 var(--space-0-5) 0 var(--space-2-5);border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--surface);transition:border-color var(--dur-fast),box-shadow var(--dur-fast)}
103
+ .lnk-box:hover{border-color:var(--border-hover)}
104
+ .lnk-box:focus-within{border-color:var(--select);box-shadow:0 0 0 3px var(--select-halo)}
105
+ .lnk-box>.i,.lnk-glyph{flex:none;color:var(--icon)}
106
+ .lnk-glyph{width:16px;text-align:center;font:var(--weight-semibold) var(--text-sm)/1 var(--font-mono)}
107
+ .lnk-box input{flex:1;min-width:0;height:30px;padding:0;border:0;outline:0;background:none}
108
+ .lnk-box input::placeholder{color:var(--text-subtle)}
109
+ .lnk-box .ib{width:26px;height:26px}
110
+ .lnk-doc{flex:1;min-width:0;display:flex;align-items:baseline;gap:var(--space-1-5);white-space:nowrap;overflow:hidden}
111
+ .lnk-doc b{font-weight:var(--weight-medium)}
112
+ .lnk-doc .mono{font-size:var(--text-xs);color:var(--text-subtle);overflow:hidden;text-overflow:ellipsis}
113
+ .lnk.is-missing .lnk-box{background:var(--status-warning-wash);border-color:var(--status-warning-border)}
114
+ .lnk.is-missing .lnk-box>.i{color:var(--status-warning-dot)}
115
+ .lnk.is-missing .lnk-doc b{color:var(--status-warning-strong)}
116
+ .lnk.is-missing .lnk-doc span{color:var(--status-warning)}
117
+ .lnk.is-bad .lnk-box{border-color:var(--status-warning-dot)}
118
+ /* Buttons (M5a): up to two, each a label, a link and one of the site's styles */
119
+ .btnf{padding:var(--space-2) var(--space-2-5) var(--space-2-5);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-sunken)}
120
+ .btnf+.btnf{margin-top:var(--space-1-5)}
121
+ .btnf.is-half{border-color:var(--status-warning-border)}
122
+ .btnf-h{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-1-5)}
123
+ .btnf-h .t{font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--text-muted)}
124
+ .btnf-h .ib{width:24px;height:24px;margin-left:auto}
125
+ .btnf .mini-seg{margin:0 0 var(--space-1-5)}
126
+ .btnf .mini-seg button{height:24px;padding:0 var(--space-2);font-size:var(--text-xs);white-space:nowrap}
127
+ .btnf>.input{margin-bottom:var(--space-1-5)}
128
+ /* Number: an optional min and max */
129
+ .numf{display:flex;align-items:center;gap:var(--space-2)}
130
+ .numf .input{width:96px}
131
+ .numf .rng{font-size:var(--text-xs);color:var(--text-subtle)}
132
+ .numf .input[aria-invalid="true"]{border-color:var(--status-warning-dot);box-shadow:0 0 0 3px var(--status-warning-wash)}
133
+ .datef{position:relative}
134
+ .datef .lnk-box{padding-left:var(--space-2-5)}
135
+
136
+ /* ── Beyond the mockup ── */
137
+ /* Tiptap mounts the editable element itself inside this wrapper; ProseMirror needs whitespace kept. */
138
+ .rt-mount{display:block}
139
+ .prose.rt{white-space:pre-wrap;word-wrap:break-word;font-variant-ligatures:none}
140
+ .prose.rt[contenteditable="false"]{background:var(--surface-sunken);color:var(--text-muted);cursor:not-allowed}
141
+ .tb-i{font-family:Georgia,serif}
142
+ .tb>button:disabled{opacity:.5;cursor:not-allowed}
143
+ .lpop .field-warn{margin:var(--space-1) var(--space-2) var(--space-1-5)}
144
+ /* The date: typed in the link box, or picked from the mockup's calendar (react-day-picker's table, drawn as .cal's grid) */
145
+ .datef .lnk-box:has(input[aria-invalid="true"]){border-color:var(--status-warning-dot);box-shadow:0 0 0 3px var(--status-warning-wash)}
146
+ .cal{position:absolute;left:0;top:calc(100% + 4px);z-index:6;width:252px;padding:var(--space-3);background:var(--surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-pop);animation:pop-in var(--dur-base) var(--ease-out)}
147
+ .cal-m{display:grid;grid-template-columns:auto 1fr auto;align-items:center;row-gap:var(--space-1)}
148
+ .cal-cap{text-align:center;font-weight:var(--weight-semibold)}
149
+ .cal .cal-nav{width:26px;height:26px}
150
+ .cal-nav[aria-disabled="true"]{color:var(--border-hover);cursor:not-allowed;background:none}
151
+ .cal-g{grid-column:1 / -1;width:100%;border-collapse:separate;border-spacing:2px;table-layout:fixed;margin:-2px 0}
152
+ .cal-g .wd{padding:var(--space-1) 0;font-size:var(--text-2xs);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase;color:var(--text-subtle)}
153
+ .cal-d{padding:0;text-align:center}
154
+ .cal-db{width:100%;height:30px;padding:0;border:0;border-radius:var(--radius-sm);background:none;color:var(--text);font-size:var(--text-sm);font-variant-numeric:tabular-nums;transition:background var(--dur-fast)}
155
+ .cal-db:hover{background:var(--surface-hover)}
156
+ .cal-db:focus-visible{outline:2px solid var(--select);outline-offset:1px}
157
+ .cal-d.out .cal-db{color:var(--text-subtle)}
158
+ .cal-d.is-today .cal-db{box-shadow:inset 0 0 0 1px var(--border-hover)}
159
+ .cal-d.is-sel .cal-db{background:var(--select);color:var(--on-fill);font-weight:var(--weight-semibold);box-shadow:none}
160
+ .cal-f{display:flex;align-items:center;justify-content:space-between;margin-top:var(--space-2);padding-top:var(--space-2);border-top:1px solid var(--border)}
161
+ /* Reordering list rows and references: the block list's ghost and full-width drop line */
162
+ .item,.refs>[data-row]{position:relative}
163
+ .refs>[data-row]{border-radius:var(--radius-md)}
164
+ .refs>[data-row]:focus-visible{outline:2px solid var(--focus);outline-offset:1px}
165
+ .item.is-ghost,.refs>.ref.is-ghost{background:none;border:1px dashed var(--border-strong);box-shadow:none}
166
+ .item.is-ghost>*,.refs>.ref.is-ghost>*{visibility:hidden}
167
+ .item.drop-before::before,.item.drop-after::after,.refs>.drop-before::before,.refs>.drop-after::after{content:"";position:absolute;left:6px;right:6px;height:2px;border-radius:2px;background:var(--select);box-shadow:0 0 0 2px var(--surface)}
168
+ .item.drop-before::before,.refs>.drop-before::before{top:-4px}
169
+ .item.drop-after::after,.refs>.drop-after::after{bottom:-4px}
170
+ /* M6c (G8): a block's help, at the top of its level (a field's sits under its label, .field-help) */
171
+ .field-help.block-help{margin:0 0 var(--space-4)}
@@ -0,0 +1,95 @@
1
+ /* M6c G4: files in the library and in links (notes/mockups/m6c-downloads-grid.html → #library-files,
2
+ #file, #link-pdf, #link-docx, #rt-link-file, #link-missing, #replace…). No side rails: the file in this
3
+ link is a wash with a full ring, as every picked row. */
4
+ :root {
5
+ --ftype-w: 28px;
6
+ --ftype-h: 34px;
7
+ --ftype-fold: 8px;
8
+ --file-row-h: 48px;
9
+ }
10
+
11
+ /* The type tile: a page with its corner folded and three ruled lines. Neutral for every type (red, green and blue
12
+ are status colours here); the type's label is text beside it. The large tile carries the label itself. */
13
+ .ftype{position:relative;display:grid;place-items:end center;width:var(--ftype-w);height:var(--ftype-h);flex:none;padding-bottom:5px;border:1px solid var(--border-strong);border-radius:var(--radius-xs);background:var(--surface);color:var(--text-muted);font:var(--weight-semibold) 8.5px/1 var(--font-mono);letter-spacing:.02em;clip-path:polygon(0 0,calc(100% - var(--ftype-fold)) 0,100% var(--ftype-fold),100% 100%,0 100%)}
14
+ .ftype:not(.lg){background:linear-gradient(var(--border-strong),var(--border-strong)) 6px 11px/calc(100% - 12px) 1px no-repeat,linear-gradient(var(--border-strong),var(--border-strong)) 6px 15px/calc(100% - 12px) 1px no-repeat,linear-gradient(var(--border-strong),var(--border-strong)) 6px 19px/calc(100% - 16px) 1px no-repeat,var(--surface)}
15
+ .ftype.sm{background:linear-gradient(var(--border-strong),var(--border-strong)) 4px 8px/calc(100% - 8px) 1px no-repeat,linear-gradient(var(--border-strong),var(--border-strong)) 4px 11px/calc(100% - 8px) 1px no-repeat,var(--surface)}
16
+ .ftype::before{content:"";position:absolute;right:-1px;top:-1px;width:var(--ftype-fold);height:var(--ftype-fold);background:var(--surface-pressed);border-bottom-left-radius:2px;box-shadow:-1px 1px 0 var(--border-strong)}
17
+ .ftype.sm{--ftype-w:18px;--ftype-h:22px;--ftype-fold:6px;padding-bottom:3px;font-size:6.5px}
18
+ .ftype.lg{--ftype-w:104px;--ftype-h:130px;--ftype-fold:24px;padding-bottom:18px;font:var(--weight-semibold) var(--text-md)/1 var(--font-ui);letter-spacing:0;border-radius:var(--radius-sm)}
19
+
20
+ /* A file row: the tile, the name, then type · size · date · use */
21
+ .flist{display:flex;flex-direction:column;gap:2px}
22
+ .frow{display:flex;align-items:center;gap:var(--space-2-5);width:100%;min-height:var(--file-row-h);padding:var(--space-1-5) var(--space-2);border:1px solid transparent;border-radius:var(--radius-md);background:none;color:var(--text);text-align:left;font:inherit;transition:background var(--dur-fast)}
23
+ button.frow{cursor:pointer}
24
+ .frow:hover{background:var(--surface-hover)}
25
+ div.frow{cursor:default}
26
+ div.frow:hover{background:none}
27
+ .frow.is-current{background:var(--select-wash);border-color:var(--select)}
28
+ .frow.is-current .ft b{color:var(--select-strong)}
29
+ .frow .ft{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;line-height:1.35}
30
+ .frow .ft b{font-weight:var(--weight-medium);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
31
+ .frow .ft small{font-size:var(--text-xs);color:var(--text-subtle);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
32
+ .frow .ft small .ty{color:var(--text-muted);font-weight:var(--weight-semibold)}
33
+ .frow .ft small .new{color:var(--status-live);font-weight:var(--weight-semibold)}
34
+ .frow .ft .mbar{position:relative;inset:auto;margin-top:5px}
35
+ .frow .pcheck{position:static;display:grid;place-items:center;width:18px;height:18px;flex:none;border-radius:50%;background:var(--select);color:var(--on-fill)}
36
+ .frow.mfailed .ft small{color:var(--status-danger);white-space:normal}
37
+
38
+ /* A file's own level */
39
+ .kv .addr{display:flex;align-items:flex-start;gap:var(--space-1)}
40
+ .kv .addr .ib{width:22px;height:22px;margin-top:-3px;flex:none}
41
+ .uses .drow .meta{max-width:52%;overflow:hidden;text-overflow:ellipsis}
42
+ .file-acts{display:flex;gap:var(--space-2);margin-top:var(--space-4)}
43
+ .stage-lb .ftype{margin-bottom:var(--space-3);border-color:var(--bar-border-hover)}
44
+ .stage-lb h2{margin:0;font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight);color:var(--bar-text);overflow-wrap:anywhere;text-align:center}
45
+ .stage-lb .fine{color:var(--bar-muted);font-size:var(--text-xs)}
46
+ .stage-lb .btn{margin-top:var(--space-3);background:var(--bar-control);border-color:var(--bar-control);color:var(--bar-control-text)}
47
+
48
+ /* A file in a link: what was picked, then how it opens. A PDF gets the toggle; anything else says it downloads */
49
+ .lnk-row{display:flex;gap:var(--space-1-5);align-items:flex-start}
50
+ .lnk-row>.lnk{flex:1;min-width:0}
51
+ .lnk-file{display:flex;align-items:center;gap:var(--space-2);flex:1;min-width:0;padding:var(--space-1-5) 0}
52
+ .lnk-doc.two{flex-direction:column;align-items:flex-start;gap:0;line-height:1.35;padding:var(--space-1) 0}
53
+ .lnk-doc.two b{max-width:100%;overflow:hidden;text-overflow:ellipsis}
54
+ .opens{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-2)}
55
+ .opens .lbl{flex:none;font-size:var(--text-xs);font-weight:var(--weight-semibold);color:var(--text-muted)}
56
+ .opens .mini-seg{flex:1;margin:0}
57
+ .opens .mini-seg .i{width:13px;height:13px}
58
+ .dl-note{display:flex;align-items:center;gap:var(--space-1-5);margin-top:var(--space-2);padding:var(--space-1-5) var(--space-2);border-radius:var(--radius-md);background:var(--surface-sunken);font-size:var(--text-xs);color:var(--text-muted)}
59
+ .dl-note .i{color:var(--icon);flex:none}
60
+ .dl-note b{color:var(--text);font-weight:var(--weight-semibold)}
61
+
62
+ /* Rich text's popover with a file picked */
63
+ .lpop .top{display:flex;gap:var(--space-1);margin-bottom:var(--space-1)}
64
+ .lpop .top .find{flex:1;margin:0}
65
+ .lpop .picked{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-1-5) var(--space-1) var(--space-1-5) var(--space-2);border-radius:var(--radius-md);background:var(--surface-sunken)}
66
+ .lpop .picked .ft{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.35}
67
+ .lpop .picked b{font-weight:var(--weight-medium);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
68
+ .lpop .picked small{font-size:var(--text-xs);color:var(--text-subtle)}
69
+ .lpop .opens{padding:0 var(--space-1)}
70
+ .lpop .picked + .opens + .lpop-foot,.lpop .picked + .lpop-foot{margin-top:var(--space-2)}
71
+
72
+ /* Replace: the old file → the new one, then what it changes */
73
+ .swap{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-1);margin-top:var(--space-4)}
74
+ .swap .frow{min-height:44px;border-color:var(--border);background:var(--surface)}
75
+ .swap .frow.old .ft b{color:var(--text-muted)}
76
+ .swap .frow.new{border-color:var(--border-strong)}
77
+ .swap .arrow{display:flex;align-items:center;gap:var(--space-1-5);padding:0 var(--space-3);font-size:var(--text-xs);color:var(--text-subtle)}
78
+ .swap .mdrop{cursor:pointer;font:inherit;font-size:var(--text-sm)}
79
+ .swap .mdrop:hover,.swap .mdrop.is-over{border-color:var(--border-hover)}
80
+ .affects{margin-top:var(--space-4);padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--surface-sunken)}
81
+ .affects>b{display:block;font-weight:var(--weight-semibold)}
82
+ .affects>p{margin-top:2px;font-size:var(--text-sm);color:var(--text-muted)}
83
+ .affects ul{list-style:none;margin:var(--space-2) 0 0;padding:0;display:flex;flex-direction:column;gap:2px}
84
+ .affects li{display:flex;align-items:center;gap:var(--space-2);min-height:28px;padding:0 var(--space-2);border-radius:var(--radius-sm);background:var(--surface);font-size:var(--text-sm)}
85
+ .affects li .i{color:var(--icon)}
86
+ .affects li .nm{font-weight:var(--weight-medium)}
87
+ .affects li .meta{margin-left:auto;font-size:var(--text-xs);color:var(--text-subtle);white-space:nowrap}
88
+ .affects li .dot{width:7px;height:7px;flex:none;border-radius:50%;background:var(--status-waiting)}
89
+ .keeps{display:flex;gap:var(--space-2);margin-top:var(--space-3);font-size:var(--text-sm);color:var(--text-muted)}
90
+ .keeps .i{margin-top:2px;color:var(--icon);flex:none}
91
+
92
+ /* Three tabs (Images, Clips, Files) leave the sidebar too narrow for Show unused beside them: it goes under, whole */
93
+ .lib-bar{flex-wrap:wrap;row-gap:var(--space-2)}
94
+ .lib-bar>.switch{white-space:nowrap}
95
+ a.btn{text-decoration:none}
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Live mode's pieces (M4 Phase 4) beyond the mockup's CSS (all in ../editor.css):
3
+ * a mark's wrapper that lays out as its children, and the read-only fields' fieldset,
4
+ * which disables every control in it and takes no room of its own. Tokens only.
5
+ */
6
+ .mk{display:contents}
7
+ fieldset.ro-fields{display:contents;margin:0;padding:0;border:0;min-width:0}
8
+ .note .acts .why{flex-basis:100%;margin:0;font-size:var(--text-xs);color:var(--text-subtle)}
9
+ /* Failed with no Railway token (a state M4 adds): Publish is off, so it takes the off ink, not the failure's red (1.9:1 on the off fill). */
10
+ .pub.fail .pb.off{color:var(--bar-off-text)}
@@ -0,0 +1,51 @@
1
+ /* M5a Phase 5's screens, lifted as is from the mockup (notes/mockups/m2-editor.html): the
2
+ shared-block panel's list, New shared block's type grid, the in-use dialog's list, Site
3
+ Settings' form, and the stage's dimmed aside while a document with no page of its own
4
+ (Site Settings) is open. Tokens only (M2 Decision 7). */
5
+ .used{display:flex;flex-wrap:wrap;gap:var(--space-1);margin-top:var(--space-2)}
6
+ .used-in{margin-top:2px}
7
+ .used-in .linkbtn{color:var(--select-strong)}
8
+ /* A block type picked in a dialog (New shared block) */
9
+ .tgrid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-1-5)}
10
+ .ptype.sm{flex-direction:row;align-items:center;gap:var(--space-2);padding:var(--space-1-5) var(--space-2)}
11
+ .ptype.sm .i{color:var(--icon)}
12
+ .ptype[aria-checked="true"]{border-color:var(--select);background:var(--select-wash)}
13
+ .ptype[aria-checked="true"] b,.ptype[aria-checked="true"] .i{color:var(--select-strong)}
14
+ .dlg-list{display:flex;flex-direction:column;gap:2px;margin-top:var(--space-3);padding:var(--space-1);border:1px solid var(--border);border-radius:var(--radius-md)}
15
+ /* Site Settings (M5a): a fixed form with no page of its own */
16
+ .set-sec{margin:0 calc(-1 * var(--space-4));padding:var(--space-4) var(--space-4) var(--space-1);border-top:1px solid var(--border)}
17
+ .set-sec:first-child{padding-top:var(--space-1);border-top:0}
18
+ .set-sec h3{margin:0 0 var(--space-1);font-size:var(--text-md);font-weight:var(--weight-semibold)}
19
+ .set-sec .lead{margin-bottom:var(--space-3);font-size:var(--text-sm);color:var(--text-muted)}
20
+ .eds{border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}
21
+ .ed{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);min-height:44px;padding:var(--space-1-5) var(--space-1) var(--space-1-5) var(--space-2)}
22
+ .ed+.ed{border-top:1px solid var(--border)}
23
+ .ed .tile{display:grid;place-items:center;width:24px;height:24px;flex:none;border-radius:var(--radius-sm);background:var(--surface-sunken);color:var(--icon);font:var(--weight-semibold) var(--text-sm)/1 var(--font-mono)}
24
+ .ed .t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
25
+ .ed .t b{font:var(--weight-medium) var(--text-sm)/1.35 var(--font-mono);overflow-wrap:anywhere}
26
+ .ed .t small{font-size:var(--text-xs);color:var(--text-subtle)}
27
+ .ed .ib{width:26px;height:26px}
28
+ .ed.is-confirm{background:var(--status-warning-wash)}
29
+ .ed-q{flex-basis:100%;padding:0 var(--space-1) var(--space-1) 32px;font-size:var(--text-sm);color:var(--status-warning-strong)}
30
+ .ed-q .acts{display:flex;flex-wrap:wrap;gap:var(--space-1-5);margin-top:var(--space-2)}
31
+ .ed-add{display:flex;gap:var(--space-1-5);margin-top:var(--space-2)}
32
+ .ed-add .input{flex:1;min-width:0}
33
+ .ed-add .input[aria-invalid="true"]{border-color:var(--status-danger);box-shadow:0 0 0 3px var(--status-danger-halo)}
34
+ .fixed-line{display:grid;grid-template-columns:16px minmax(0,1fr);gap:var(--space-2);margin-top:var(--space-3);padding:var(--space-2) var(--space-2-5);border-radius:var(--radius-md);background:var(--surface-sunken);font-size:var(--text-sm);color:var(--text-muted)}
35
+ .fixed-line .i{margin-top:2px;color:var(--icon)}
36
+ .swatch-in{display:flex;align-items:center;gap:var(--space-2)}
37
+ .swatch-in .input{width:120px;font-family:var(--font-mono);text-transform:uppercase}
38
+ .swatch{position:relative;width:var(--control-h);height:var(--control-h);flex:none;border:1px solid var(--accent-edge);border-radius:var(--radius-md);background:var(--accent);box-shadow:inset 0 0 0 2px var(--surface)}
39
+ .swatch input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
40
+ .swatch:focus-within{outline:2px solid var(--focus);outline-offset:2px}
41
+ .accent-try{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-2);padding:var(--space-2) var(--space-2-5);border-radius:var(--radius-md);background:var(--bar-bg);color:var(--bar-muted);font-size:var(--text-xs)}
42
+ .accent-try .pub{pointer-events:none;margin-left:auto}
43
+ /* A document with no page of its own (Site Settings): the last page stays, dimmed, with a way back (M5a) */
44
+ .stage-aside{position:absolute;inset:0;z-index:3;display:none;place-items:center;padding:var(--space-6);background:var(--stage-dim);color:var(--bar-text);text-align:center}
45
+ .stage.is-aside .stage-aside{display:grid;animation:fade-in var(--dur-base) var(--ease-out)}
46
+ .stage-aside .in{max-width:340px}
47
+ .stage-aside .in>.i{width:22px;height:22px;margin-bottom:var(--space-3);color:var(--bar-muted)}
48
+ .stage-aside h2{margin:0 0 var(--space-1-5);font-size:var(--text-lg);font-weight:var(--weight-semibold);letter-spacing:var(--tracking-tight)}
49
+ .stage-aside p{color:var(--bar-muted);font-size:var(--text-sm)}
50
+ .stage-aside .btn{margin-top:var(--space-4);background:var(--bar-control);border-color:var(--bar-control);color:var(--bar-control-text)}
51
+ .stage-aside :focus-visible{outline-color:var(--focus-on-dark)}
@@ -0,0 +1,82 @@
1
+ /* M6: the inbox (Site-wide → Submissions, a submission on a sheet over the dimmed page), Search and sharing, and
2
+ Site Settings' publish-time fields (notes/mockups/m2-editor.html, lifted from its M6 CSS as is). */
3
+ /* ── M6: Submissions. A level of its own under Site-wide; a submission opens in the stage, on a sheet over the dimmed
4
+ page. Unread is a dot and a heavier name; the open one is the selection's wash and ring. Never a side rail. ── */
5
+ .drow .ucnt{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:var(--radius-pill);background:var(--select-wash);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--select) 40%,transparent);color:var(--select-strong);font-size:var(--text-2xs);font-weight:var(--weight-semibold);font-variant-numeric:tabular-nums}
6
+ .srows{display:flex;flex-direction:column;gap:2px;margin:0 calc(-1 * var(--space-1))}
7
+ .srow{display:grid;grid-template-columns:8px minmax(0,1fr);gap:var(--space-2);width:100%;padding:var(--space-2) var(--space-2) var(--space-2) var(--space-1-5);border:1px solid transparent;border-radius:var(--radius-md);background:none;color:var(--text);text-align:left;transition:background var(--dur-fast)}
8
+ .srow:hover{background:var(--surface-hover)}
9
+ .srow .ud{width:7px;height:7px;margin-top:6px;border-radius:50%}
10
+ .srow.is-unread .ud{background:var(--unread)}
11
+ .srow.is-current{background:var(--select-wash);border-color:var(--select)}
12
+ .srow .l1{display:flex;align-items:baseline;gap:var(--space-2);min-width:0}
13
+ .srow .who{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:var(--weight-medium)}
14
+ .srow.is-unread .who{font-weight:var(--weight-semibold)}
15
+ .srow .tm{flex:none;font-size:var(--text-xs);color:var(--text-subtle);font-variant-numeric:tabular-nums}
16
+ .srow.is-unread .tm{color:var(--select-strong);font-weight:var(--weight-medium)}
17
+ .srow .sn{display:block;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm);color:var(--text-muted)}
18
+ .srow .l3{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);margin-top:var(--space-1);font-size:var(--text-xs);color:var(--text-subtle)}
19
+ .srow .l3 .i{width:12px;height:12px}
20
+ .srow .l3 span{display:inline-flex;align-items:center;gap:3px}
21
+ .srow .chip{height:18px;font-size:var(--text-2xs)}
22
+ .subs-foot{display:flex;flex-direction:column;align-items:stretch;gap:var(--space-1-5);margin-top:var(--space-3)}
23
+ .subs-foot .kb-hint{margin:0;text-align:center}
24
+ .note.warn .mono,.note .mono{font-size:.95em}
25
+ /* The sheet: a light page on the dimmed stage. It resets what .stage-aside sets for the dark */
26
+ .stage-aside .sub-sheet{display:flex;flex-direction:column;width:min(var(--sub-sheet-w),100%);max-height:calc(100cqh - 2 * var(--space-6));overflow:hidden;border-radius:var(--radius-xl);background:var(--surface);color:var(--text);text-align:left;box-shadow:var(--shadow-frame);animation:pop-in var(--dur-base) var(--ease-out)}
27
+ .stage-aside .sub-sheet :focus-visible{outline-color:var(--focus)}
28
+ .stage-aside .sub-sheet p{color:inherit;font-size:inherit}
29
+ .stage-aside .sub-sheet .btn{margin-top:0;background:var(--surface);border-color:var(--border-strong);color:var(--text)}
30
+ .stage-aside .sub-sheet .btn:hover{background:var(--surface-hover);border-color:var(--border-hover)}
31
+ .stage-aside .sub-sheet .btn.ink{background:var(--text);border-color:var(--text);color:var(--surface)}
32
+ .stage-aside .sub-sheet .btn.ink:hover{background:var(--ink-hover);border-color:var(--ink-hover)}
33
+ .stage-aside .sub-sheet .btn.quiet-danger{border-color:transparent;background:none;color:var(--status-danger)}
34
+ .stage-aside .sub-sheet .btn.quiet-danger:hover{background:var(--status-danger-wash);border-color:var(--status-danger-border)}
35
+ .sub-head{padding:var(--space-5) var(--space-6) var(--space-4);border-bottom:1px solid var(--border)}
36
+ .sub-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1-5) var(--space-2);font-size:var(--text-sm);color:var(--text-muted)}
37
+ .sub-meta .chip{height:20px}
38
+ .stage-aside .sub-head h2{margin:var(--space-2) 0 0;font-size:var(--text-2xl);line-height:1.2;color:var(--text);overflow-wrap:anywhere}
39
+ .sub-head .from{margin-top:2px;font:var(--text-sm)/1.4 var(--font-mono);color:var(--text-muted);overflow-wrap:anywhere}
40
+ .sub-acts{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);margin-top:var(--space-4)}
41
+ .sub-acts .end{margin-left:auto}
42
+ .sub-acts a.btn{text-decoration:none}
43
+ .sub-body{min-height:0;overflow:auto;overscroll-behavior:contain;padding:var(--space-4) var(--space-6) var(--space-6)}
44
+ .sub-mail{display:flex;align-items:flex-start;gap:var(--space-2);margin-bottom:var(--space-4);font-size:var(--text-sm);color:var(--text-muted)}
45
+ .sub-mail .i{margin-top:1px}
46
+ .sub-mail.sent .i{color:var(--status-live)}
47
+ .sub-mail .mono{color:var(--text)}
48
+ .sub-body .note{margin-bottom:var(--space-4)}
49
+ .sub-body .note q{display:block;margin-top:var(--space-1-5);padding:var(--space-1-5) var(--space-2);border-radius:var(--radius-sm);background:var(--surface);font:var(--text-xs)/1.5 var(--font-mono);color:var(--status-danger-strong);quotes:none;overflow-wrap:anywhere}
50
+ .sub-fields{display:grid;grid-template-columns:var(--sub-label-w) minmax(0,1fr);gap:var(--space-3) var(--space-4);margin:0}
51
+ .sub-fields dt{padding-top:2px;font-size:var(--text-sm);color:var(--text-muted)}
52
+ .sub-fields dd{margin:0;min-width:0;font-size:var(--text-md);line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}
53
+ .sub-fields dd.none{color:var(--text-subtle);font-size:var(--text-sm)}
54
+ .sub-fields+.sub-fields{margin-top:var(--space-3);padding-top:var(--space-3);border-top:1px solid var(--border)}
55
+ .sub-files{display:flex;flex-direction:column;gap:var(--space-1-5);white-space:normal}
56
+ .frow{display:flex;align-items:center;gap:var(--space-2-5);min-height:44px;padding:var(--space-1-5) var(--space-2-5) var(--space-1-5) var(--space-1-5);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);text-decoration:none;transition:background var(--dur-fast),border-color var(--dur-fast)}
57
+ .frow:hover{background:var(--surface-hover);border-color:var(--border-hover)}
58
+ .frow .ext{display:grid;place-items:center;width:30px;height:30px;flex:none;border-radius:var(--radius-sm);background:var(--surface-sunken);font:var(--weight-semibold) 9.5px/1 var(--font-mono);color:var(--text-muted);text-transform:uppercase}
59
+ .frow .t{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
60
+ .frow .t b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-base);font-weight:var(--weight-medium)}
61
+ .frow .t small{font-size:var(--text-xs);color:var(--text-subtle)}
62
+ .frow>.i{color:var(--icon)}
63
+ .frow:hover>.i{color:var(--text)}
64
+ @container (max-width:600px){.sub-fields{grid-template-columns:1fr;gap:var(--space-0-5) 0}.sub-fields dd{margin-bottom:var(--space-2-5)}.sub-head,.sub-body{padding-left:var(--space-4);padding-right:var(--space-4)}}
65
+
66
+ /* ── M6: Search and sharing, and Site Settings' publish-time fields. A soft limit is amber and blocks nothing ── */
67
+ .field-meta.soft-over{color:var(--status-warning);font-weight:var(--weight-semibold)}
68
+ .field-ok{display:flex;align-items:center;gap:var(--space-1);margin-top:var(--space-1-5);font-size:var(--text-xs);color:var(--text-muted)}
69
+ .field-ok .i{color:var(--status-live)}
70
+ .input.mono{font-family:var(--font-mono);font-size:var(--text-sm)}
71
+ .gtag .input[aria-invalid="true"]{border-color:var(--status-warning-dot);box-shadow:0 0 0 3px var(--status-warning-wash)}
72
+ .gtag .field-warn .linkbtn{margin-top:var(--space-1);font-family:var(--font-mono)}
73
+ .gtag .field-warn>span{display:flex;flex-direction:column;align-items:flex-start}
74
+ .rcpt .ed.is-confirm .tile{background:var(--surface);color:var(--status-warning-dot)}
75
+ details.fgroup.seo{margin-top:var(--space-5)}
76
+ /* M6c (G2): a section builder's page fields, above Search and sharing */
77
+ details.fgroup.page-fields{margin-top:var(--space-5)}
78
+ details.fgroup.page-fields+details.fgroup.seo{margin-top:0}
79
+ details.fgroup.seo>.in{padding-top:var(--space-1)}
80
+ details.fgroup.seo>summary{white-space:nowrap}
81
+ details.fgroup.seo>summary .s{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
82
+