pandorga 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +77 -0
  3. data/DESIGN.md +1434 -0
  4. data/LICENSE +21 -0
  5. data/README.md +81 -0
  6. data/_data/themes/dark.yml +97 -0
  7. data/_data/themes/light.yml +120 -0
  8. data/_data/themes/shared.yml +37 -0
  9. data/_data/translations.yml +85 -0
  10. data/_includes/chord-tab.html +38 -0
  11. data/_includes/content-runtime/00-config.html +22 -0
  12. data/_includes/content-runtime/10-utils.html +176 -0
  13. data/_includes/content-runtime/20-markdown.html +264 -0
  14. data/_includes/content-runtime/25-code-blocks.html +315 -0
  15. data/_includes/content-runtime/30-includes-bib.html +190 -0
  16. data/_includes/content-runtime/30-includes-xcite.html +122 -0
  17. data/_includes/content-runtime/30-includes.html +365 -0
  18. data/_includes/content-runtime/40-listing.html +225 -0
  19. data/_includes/content-runtime/41-listing-helpers.html +71 -0
  20. data/_includes/content-runtime/42-listing-filter.html +208 -0
  21. data/_includes/content-runtime/43-blocks.html +379 -0
  22. data/_includes/content-runtime/50-detail.html +861 -0
  23. data/_includes/content-runtime/55-toc.html +176 -0
  24. data/_includes/content-runtime/60-fragments.html +567 -0
  25. data/_includes/content-runtime/90-bootstrap.html +76 -0
  26. data/_includes/cut-in.html +10 -0
  27. data/_includes/cv/cv-box.html +18 -0
  28. data/_includes/dict-card.html +24 -0
  29. data/_includes/figure.html +36 -0
  30. data/_includes/home/band-index.html +43 -0
  31. data/_includes/home/band-listing.html +49 -0
  32. data/_includes/mathjax.html +10 -0
  33. data/_includes/ongoing-product.html +1 -0
  34. data/_includes/page/content-runtime.html +20 -0
  35. data/_includes/page/date_evolution.html +19 -0
  36. data/_includes/page/figure-lightbox.html +102 -0
  37. data/_includes/page/formatted_date.html +15 -0
  38. data/_includes/page/hero-default.html +18 -0
  39. data/_includes/page/listing-runtime-attrs.html +8 -0
  40. data/_includes/page/mermaid.html +101 -0
  41. data/_includes/page/network-graph.html +1253 -0
  42. data/_includes/page/page-header.html +41 -0
  43. data/_includes/page/professional-connections.html +2 -0
  44. data/_includes/page/site-footer.html +101 -0
  45. data/_includes/page/timeline-section.html +868 -0
  46. data/_includes/plotly.html +22 -0
  47. data/_includes/theme/dev-reexport.html +100 -0
  48. data/_includes/theme/favicons.html +4 -0
  49. data/_includes/theme/font-loader.html +55 -0
  50. data/_includes/theme/shell-theme-boot.html +115 -0
  51. data/_includes/theme/site-logo.html +6 -0
  52. data/_includes/theme/tailwind-theme-colors.json.liquid +65 -0
  53. data/_includes/theme/tailwind-theme-fonts.json.liquid +6 -0
  54. data/_includes/theme/theme-context.liquid +20 -0
  55. data/_includes/theme/theme-toggle.html +94 -0
  56. data/_includes/theme/theme-vars-block.liquid +161 -0
  57. data/_includes/theme/theme-vars.html +16 -0
  58. data/_includes/transcription.html +80 -0
  59. data/_includes/tweet.html +22 -0
  60. data/_includes/video.html +11 -0
  61. data/_includes/xcite.html +3 -0
  62. data/_includes/youtube-short.html +26 -0
  63. data/_includes/youtube.html +12 -0
  64. data/_layouts/article.html +27 -0
  65. data/_layouts/articles.html +534 -0
  66. data/_layouts/bibliography.html +417 -0
  67. data/_layouts/blog.html +544 -0
  68. data/_layouts/cv.html +393 -0
  69. data/_layouts/home.html +319 -0
  70. data/_layouts/network.html +9 -0
  71. data/_layouts/pandorga/articles.html +4 -0
  72. data/_layouts/pandorga/bibliography.html +4 -0
  73. data/_layouts/pandorga/blog.html +4 -0
  74. data/_layouts/pandorga/cv.html +4 -0
  75. data/_layouts/pandorga/media.html +4 -0
  76. data/_layouts/pandorga/network.html +4 -0
  77. data/_layouts/pandorga/portfolio.html +4 -0
  78. data/_layouts/post.html +7 -0
  79. data/_layouts/product.html +5 -0
  80. data/_layouts/project.html +27 -0
  81. data/_layouts/projects.html +534 -0
  82. data/_layouts/resources.html +387 -0
  83. data/_layouts/shell.html +203 -0
  84. data/_layouts/text.html +246 -0
  85. data/_plugins/bibliography_artifact.rb +57 -0
  86. data/_plugins/content_backend.rb +37 -0
  87. data/_plugins/content_collections.rb +51 -0
  88. data/_plugins/content_detail_paths.rb +58 -0
  89. data/_plugins/content_headers.rb +73 -0
  90. data/_plugins/content_keys.rb +310 -0
  91. data/_plugins/content_local_serve.rb +168 -0
  92. data/_plugins/content_site_adapter.rb +159 -0
  93. data/_plugins/content_validators_hook.rb +20 -0
  94. data/_plugins/content_writing_index.rb +52 -0
  95. data/_plugins/content_writing_paths.rb +55 -0
  96. data/_plugins/force_utf8_encoding.rb +13 -0
  97. data/_plugins/git_chronology.rb +211 -0
  98. data/_plugins/git_metadata.rb +43 -0
  99. data/_plugins/job_sections.rb +25 -0
  100. data/_plugins/lib/content_validators.rb +27 -0
  101. data/_plugins/lib/resource_validator.rb +56 -0
  102. data/_plugins/lib/tag_validator.rb +153 -0
  103. data/_plugins/lib/text_excerpt.rb +56 -0
  104. data/_plugins/lib/writing_entry.rb +107 -0
  105. data/_plugins/local_detail_rewrites.rb +194 -0
  106. data/_plugins/timeline.rb +507 -0
  107. data/_plugins/writing_slug_limits.rb +70 -0
  108. data/assets/css/article.css +1330 -0
  109. data/assets/css/base.css +1432 -0
  110. data/assets/css/cv.css +13 -0
  111. data/assets/css/global-link.css +94 -0
  112. data/assets/css/ledger/bibliography.css +307 -0
  113. data/assets/css/ledger/chrome.css +118 -0
  114. data/assets/css/ledger/cv.css +836 -0
  115. data/assets/css/ledger/detail.css +1270 -0
  116. data/assets/css/ledger/footer.css +298 -0
  117. data/assets/css/ledger/home.css +1490 -0
  118. data/assets/css/ledger/network.css +106 -0
  119. data/assets/css/ledger/projects.css +716 -0
  120. data/assets/css/ledger/rascunhos.css +379 -0
  121. data/assets/css/ledger/sources.css +327 -0
  122. data/assets/css/ledger/writing.css +754 -0
  123. data/assets/tailwind-play.js +15 -0
  124. data/examples/full/Gemfile +7 -0
  125. data/examples/full/_config.yml +92 -0
  126. data/examples/full/_redirects +3 -0
  127. data/examples/full/content/collections/articles/2026-01-01-welcome.md +9 -0
  128. data/examples/full/content/collections/data/contacts.yml +3 -0
  129. data/examples/full/content/collections/data/education.yml +4 -0
  130. data/examples/full/content/collections/jobs/research-fellow.md +12 -0
  131. data/examples/full/content/collections/posts/2026-01-02-note.md +9 -0
  132. data/examples/full/content/collections/products/ledger-tool.md +6 -0
  133. data/examples/full/content/collections/projects/demo-kit.md +10 -0
  134. data/examples/full/content/collections/resources/style-guide.md +7 -0
  135. data/examples/full/content/pages/cv/summary.md +1 -0
  136. data/examples/full/content/pages/headers.yml +20 -0
  137. data/examples/full/index.html +4 -0
  138. data/examples/minimal/Gemfile +7 -0
  139. data/examples/minimal/_config.yml +47 -0
  140. data/examples/minimal/_redirects +3 -0
  141. data/examples/minimal/content/collections/articles/2026-01-01-hello.md +10 -0
  142. data/examples/minimal/content/collections/articles/2026-01-02-second.md +9 -0
  143. data/examples/minimal/content/pages/headers.yml +6 -0
  144. data/examples/minimal/index.html +4 -0
  145. data/exe/pandorga +7 -0
  146. data/functions/api/studio/[[path]].js +562 -0
  147. data/functions/api/studio/_lib/auth.js +131 -0
  148. data/functions/api/studio/_lib/blocks.js +156 -0
  149. data/functions/api/studio/_lib/gemini.js +62 -0
  150. data/functions/api/studio/_lib/github.js +278 -0
  151. data/functions/api/studio/_lib/guidelines.js +143 -0
  152. data/functions/api/studio/_lib/paths.js +76 -0
  153. data/functions/api/studio/_lib/prompts.js +165 -0
  154. data/functions/api/studio/_lib/rate-limit.js +40 -0
  155. data/functions/api/studio/_lib/rewrite.js +136 -0
  156. data/functions/api/studio/_lib/sanitize.js +143 -0
  157. data/lib/pandorga/cli.rb +66 -0
  158. data/lib/pandorga/commands/doctor.rb +66 -0
  159. data/lib/pandorga/commands/export.rb +30 -0
  160. data/lib/pandorga/commands/install_functions.rb +41 -0
  161. data/lib/pandorga/commands/new.rb +113 -0
  162. data/lib/pandorga/commands/publish.rb +53 -0
  163. data/lib/pandorga/commands/serve.rb +34 -0
  164. data/lib/pandorga/commands/studio_schema.rb +309 -0
  165. data/lib/pandorga/jekyll/generator.rb +74 -0
  166. data/lib/pandorga/jekyll/plugins/bibliography_artifact.rb +57 -0
  167. data/lib/pandorga/jekyll/plugins/content_backend.rb +37 -0
  168. data/lib/pandorga/jekyll/plugins/content_collections.rb +51 -0
  169. data/lib/pandorga/jekyll/plugins/content_detail_paths.rb +58 -0
  170. data/lib/pandorga/jekyll/plugins/content_headers.rb +73 -0
  171. data/lib/pandorga/jekyll/plugins/content_keys.rb +310 -0
  172. data/lib/pandorga/jekyll/plugins/content_local_serve.rb +168 -0
  173. data/lib/pandorga/jekyll/plugins/content_site_adapter.rb +159 -0
  174. data/lib/pandorga/jekyll/plugins/content_validators_hook.rb +20 -0
  175. data/lib/pandorga/jekyll/plugins/content_writing_index.rb +52 -0
  176. data/lib/pandorga/jekyll/plugins/content_writing_paths.rb +55 -0
  177. data/lib/pandorga/jekyll/plugins/force_utf8_encoding.rb +13 -0
  178. data/lib/pandorga/jekyll/plugins/git_chronology.rb +211 -0
  179. data/lib/pandorga/jekyll/plugins/git_metadata.rb +43 -0
  180. data/lib/pandorga/jekyll/plugins/job_sections.rb +25 -0
  181. data/lib/pandorga/jekyll/plugins/lib/content_validators.rb +27 -0
  182. data/lib/pandorga/jekyll/plugins/lib/resource_validator.rb +56 -0
  183. data/lib/pandorga/jekyll/plugins/lib/tag_validator.rb +153 -0
  184. data/lib/pandorga/jekyll/plugins/lib/text_excerpt.rb +56 -0
  185. data/lib/pandorga/jekyll/plugins/lib/writing_entry.rb +107 -0
  186. data/lib/pandorga/jekyll/plugins/local_detail_rewrites.rb +194 -0
  187. data/lib/pandorga/jekyll/plugins/timeline.rb +507 -0
  188. data/lib/pandorga/jekyll/plugins/writing_slug_limits.rb +70 -0
  189. data/lib/pandorga/jekyll.rb +15 -0
  190. data/lib/pandorga/object_store_env.rb +51 -0
  191. data/lib/pandorga/registry/schema.yml +115 -0
  192. data/lib/pandorga/registry.rb +279 -0
  193. data/lib/pandorga/version.rb +5 -0
  194. data/lib/pandorga.rb +19 -0
  195. data/scripts/cdn-allowlist.json +19 -0
  196. data/scripts/content/backfill-content-keys.rb +99 -0
  197. data/scripts/content/band_art.rb +362 -0
  198. data/scripts/content/export-content-json.rb +741 -0
  199. data/scripts/content/flatten-ansi-capture.mjs +153 -0
  200. data/scripts/content/hero_portraits.rb +28 -0
  201. data/scripts/content/publish-content-to-object-store.sh +78 -0
  202. data/scripts/content/publish-content-to-r2.sh +5 -0
  203. data/scripts/content/sync-content-json-to-r2.rb +167 -0
  204. data/scripts/content/sync-content-redirects.rb +12 -0
  205. data/scripts/generate-configuration-doc.rb +127 -0
  206. data/scripts/lib/content_license.rb +50 -0
  207. data/scripts/lib/content_storage_config.rb +70 -0
  208. data/scripts/lib/normalize-display-math.mjs +52 -0
  209. data/scripts/lib/r2_json_sync.rb +76 -0
  210. data/scripts/lib/withdrawn_public_objects.rb +23 -0
  211. data/scripts/lib/writing_index_contract.rb +61 -0
  212. data/scripts/pdf/md-to-pdf.mjs +1400 -0
  213. data/scripts/pdf/md-to-pdf.sh +27 -0
  214. data/scripts/test/fixtures/dual-template/_config.yml +32 -0
  215. data/scripts/test/fixtures/dual-template/index.html +4 -0
  216. data/scripts/test/render-parity/article-note.json +5 -0
  217. data/scripts/test/render-parity/blockquote.json +5 -0
  218. data/scripts/test/render-parity/blocks/ansi-basic.json +7 -0
  219. data/scripts/test/render-parity/blocks/ansi-bold-is-bright.json +7 -0
  220. data/scripts/test/render-parity/blocks/ansi-drops-cursor-moves.json +7 -0
  221. data/scripts/test/render-parity/blocks/ansi-escapes-markup.json +7 -0
  222. data/scripts/test/render-parity/blocks/ansi-extended-colour.json +7 -0
  223. data/scripts/test/render-parity/blocks/ansi-real-control-byte.json +7 -0
  224. data/scripts/test/render-parity/blocks/archive-card-date-once.json +19 -0
  225. data/scripts/test/render-parity/blocks/archive-card-empty-foot.json +7 -0
  226. data/scripts/test/render-parity/blocks/archive-card-footer-dates.json +22 -0
  227. data/scripts/test/render-parity/blocks/archive-card-meta-parts.json +26 -0
  228. data/scripts/test/render-parity/blocks/archive-card.json +32 -0
  229. data/scripts/test/render-parity/blocks/cta-link.json +13 -0
  230. data/scripts/test/render-parity/blocks/lang-pill-pt.json +8 -0
  231. data/scripts/test/render-parity/blocks/lang-pill.json +8 -0
  232. data/scripts/test/render-parity/blocks/ledger-row-meta-parts.json +29 -0
  233. data/scripts/test/render-parity/blocks/ledger-row.json +35 -0
  234. data/scripts/test/render-parity/blocks/meta-strip.json +27 -0
  235. data/scripts/test/render-parity/blocks/poster-media-image.json +8 -0
  236. data/scripts/test/render-parity/blocks/poster-media-video.json +9 -0
  237. data/scripts/test/render-parity/blocks/section-banner.json +13 -0
  238. data/scripts/test/render-parity/blocks/system-card-custom-meta.json +22 -0
  239. data/scripts/test/render-parity/blocks/system-card.json +48 -0
  240. data/scripts/test/render-parity/blocks/tag-chips-links.json +12 -0
  241. data/scripts/test/render-parity/blocks/tag-chips.json +9 -0
  242. data/scripts/test/render-parity/cut-in-blank-line.json +9 -0
  243. data/scripts/test/render-parity/cut-in-right.json +9 -0
  244. data/scripts/test/render-parity/cut-in.json +8 -0
  245. data/scripts/test/render-parity/figure.json +5 -0
  246. data/scripts/test/render-parity/load-runtime.mjs +337 -0
  247. data/scripts/test/render-parity/ongoing-product.json +5 -0
  248. data/scripts/test/render-parity/plotly.json +5 -0
  249. data/scripts/test/render-parity/poem.json +5 -0
  250. data/scripts/test/render-parity/run-absent-field-checks.mjs +232 -0
  251. data/scripts/test/render-parity/run-block-fixture.mjs +86 -0
  252. data/scripts/test/render-parity/run-detail-parity-checks.mjs +123 -0
  253. data/scripts/test/render-parity/run-field-flow-checks.mjs +227 -0
  254. data/scripts/test/render-parity/run-fixture.mjs +159 -0
  255. data/scripts/test/render-parity/selectors.mjs +43 -0
  256. data/scripts/test/render-parity/video.json +5 -0
  257. data/scripts/test/render-parity/youtube-short.json +10 -0
  258. data/scripts/test/render-parity/youtube.json +8 -0
  259. data/scripts/test/test-absent-field-absent-element.rb +43 -0
  260. data/scripts/test/test-cdn-pins.rb +44 -0
  261. data/scripts/test/test-cloudflare-watch-paths-doc.rb +31 -0
  262. data/scripts/test/test-configuration-doc.rb +36 -0
  263. data/scripts/test/test-content-detail-urls.rb +346 -0
  264. data/scripts/test/test-content-keys.rb +110 -0
  265. data/scripts/test/test-content-license.rb +45 -0
  266. data/scripts/test/test-content-render-parity.rb +38 -0
  267. data/scripts/test/test-content-validators.rb +12 -0
  268. data/scripts/test/test-css-structure.rb +72 -0
  269. data/scripts/test/test-cv-export-contract.rb +158 -0
  270. data/scripts/test/test-detail-render-parity.rb +40 -0
  271. data/scripts/test/test-dev-reexport.rb +122 -0
  272. data/scripts/test/test-doctor.rb +39 -0
  273. data/scripts/test/test-dual-template-instances.rb +87 -0
  274. data/scripts/test/test-dual-template-runtime.rb +167 -0
  275. data/scripts/test/test-examples-build.rb +60 -0
  276. data/scripts/test/test-export-content-json-incremental.rb +138 -0
  277. data/scripts/test/test-export.rb +53 -0
  278. data/scripts/test/test-exported-fields-reach-the-view.rb +60 -0
  279. data/scripts/test/test-form-control-theming.rb +143 -0
  280. data/scripts/test/test-git-chronology.rb +414 -0
  281. data/scripts/test/test-hero-portraits.mjs +97 -0
  282. data/scripts/test/test-hero-portraits.rb +162 -0
  283. data/scripts/test/test-home-band-art.rb +135 -0
  284. data/scripts/test/test-install-functions.rb +39 -0
  285. data/scripts/test/test-language-export.rb +79 -0
  286. data/scripts/test/test-listing-filter-contract.rb +119 -0
  287. data/scripts/test/test-math-row-breaks.mjs +79 -0
  288. data/scripts/test/test-math-row-breaks.rb +18 -0
  289. data/scripts/test/test-new.rb +113 -0
  290. data/scripts/test/test-no-personal-data.rb +85 -0
  291. data/scripts/test/test-public-cv-export.rb +164 -0
  292. data/scripts/test/test-r2-config-consistency.rb +57 -0
  293. data/scripts/test/test-r2-json-sync.rb +193 -0
  294. data/scripts/test/test-registry-home.rb +34 -0
  295. data/scripts/test/test-runtime-js-syntax.rb +64 -0
  296. data/scripts/test/test-slim-writing-index.rb +126 -0
  297. data/scripts/test/test-studio-api-contract.rb +99 -0
  298. data/scripts/test/test-studio-content-files.rb +79 -0
  299. data/scripts/test/test-studio-liquid-roundtrip.mjs +179 -0
  300. data/scripts/test/test-studio-rate-limit.mjs +70 -0
  301. data/scripts/test/test-studio-rewrite-api-contract.rb +59 -0
  302. data/scripts/test/test-studio-rewrite-sanitize.mjs +210 -0
  303. data/scripts/test/test-studio-schema-composition.rb +126 -0
  304. data/scripts/test/test-studio-slug-config.rb +167 -0
  305. data/scripts/test/test-template-packages.rb +51 -0
  306. data/scripts/test/test-text-excerpt.rb +51 -0
  307. data/scripts/test/test-unwrap-media-src.mjs +39 -0
  308. data/scripts/test/test-unwrap-media-src.rb +19 -0
  309. data/scripts/test/test-withdrawn-content-export.rb +69 -0
  310. data/scripts/test/test-writing-index-export-slugs.rb +84 -0
  311. data/scripts/test/test-writing-slug-limits.rb +61 -0
  312. data/scripts/test/test-xcite-chronology.rb +106 -0
  313. data/scripts/validate.sh +74 -0
  314. data/scripts/visual/build-cv-pages-json.js +33 -0
  315. data/scripts/visual/build-site-pages-json.js +94 -0
  316. data/scripts/visual/publish-visual-inspection-to-r2.sh +42 -0
  317. data/scripts/visual/take-screenshots.js +88 -0
  318. data/scripts/visual/visual-inspection-pages.json +113 -0
  319. data/studio/assets/index-B_j0pMD5.css +1 -0
  320. data/studio/assets/index-Ch4YEv9g.js +285 -0
  321. data/studio/index.html +27 -0
  322. data/studio/schema.yml +869 -0
  323. data/studio-app/README.md +27 -0
  324. data/studio-app/index.html +26 -0
  325. data/studio-app/package-lock.json +2499 -0
  326. data/studio-app/package.json +26 -0
  327. data/studio-app/skills-lock.json +47 -0
  328. data/studio-app/src/api/client.js +71 -0
  329. data/studio-app/src/editor/body-editor.js +70 -0
  330. data/studio-app/src/editor/liquid-core.js +382 -0
  331. data/studio-app/src/editor/liquid.js +77 -0
  332. data/studio-app/src/lib/document.js +207 -0
  333. data/studio-app/src/lib/list-controls.js +317 -0
  334. data/studio-app/src/lib/schema.js +66 -0
  335. data/studio-app/src/lib/yaml-doc.js +100 -0
  336. data/studio-app/src/main.js +3693 -0
  337. data/studio-app/src/media/browser.js +578 -0
  338. data/studio-app/src/preview/render.js +430 -0
  339. data/studio-app/src/styles/studio.css +2826 -0
  340. data/studio-app/vite.config.js +25 -0
  341. data/templates/articles/README.md +40 -0
  342. data/templates/articles/fixtures/article.md +9 -0
  343. data/templates/articles/screenshots/README.md +6 -0
  344. data/templates/articles/studio.yml +73 -0
  345. data/templates/articles/template.yml +21 -0
  346. data/templates/bibliography/README.md +41 -0
  347. data/templates/bibliography/fixtures/references.json +9 -0
  348. data/templates/bibliography/screenshots/README.md +6 -0
  349. data/templates/bibliography/studio.yml +66 -0
  350. data/templates/bibliography/template.yml +18 -0
  351. data/templates/blog/README.md +38 -0
  352. data/templates/blog/fixtures/post.md +9 -0
  353. data/templates/blog/screenshots/README.md +6 -0
  354. data/templates/blog/studio.yml +69 -0
  355. data/templates/blog/template.yml +20 -0
  356. data/templates/cv/README.md +34 -0
  357. data/templates/cv/fixtures/job.md +12 -0
  358. data/templates/cv/screenshots/README.md +6 -0
  359. data/templates/cv/studio.yml +200 -0
  360. data/templates/cv/template.yml +25 -0
  361. data/templates/media/README.md +38 -0
  362. data/templates/media/fixtures/resource.md +7 -0
  363. data/templates/media/screenshots/README.md +6 -0
  364. data/templates/media/studio.yml +58 -0
  365. data/templates/media/template.yml +17 -0
  366. data/templates/network/README.md +34 -0
  367. data/templates/network/fixtures/sources.json +3 -0
  368. data/templates/network/screenshots/README.md +6 -0
  369. data/templates/network/studio.yml +28 -0
  370. data/templates/network/template.yml +10 -0
  371. data/templates/portfolio/README.md +39 -0
  372. data/templates/portfolio/fixtures/project.md +10 -0
  373. data/templates/portfolio/screenshots/README.md +6 -0
  374. data/templates/portfolio/studio.yml +89 -0
  375. data/templates/portfolio/template.yml +18 -0
  376. metadata +505 -0
@@ -0,0 +1,2826 @@
1
+ /* Brazilian Ledger tokens for Studio — mirrors _data/themes/{light,dark}.yml. */
2
+ :root,
3
+ [data-theme="light"] {
4
+ color-scheme: light;
5
+ --primary: #1c5a7a;
6
+ --secondary: #287445;
7
+ --tertiary: #746f30;
8
+ --background: #ffffff;
9
+ --panel: #f4f4f4;
10
+ --surface-high: #ebebeb;
11
+ --surface-card: #ffffff;
12
+ --on-surface: #000000;
13
+ --on-surface-variant: #5e5d59;
14
+ --outline: #5c5c5c;
15
+ --outline-variant: #b8b8b8;
16
+ --error: #ba1a1a;
17
+ --scrollbar-track: var(--panel);
18
+ --scrollbar-thumb: color-mix(in srgb, var(--outline-variant) 75%, var(--panel));
19
+ --scrollbar-thumb-hover: color-mix(in srgb, var(--outline) 70%, var(--panel));
20
+ --cubist-shard-opacity: 18%;
21
+ --cubist-shard-opacity-strong: 26%;
22
+ --shard-alpha: polygon(26% 0, 100% 0, 78% 100%, 0 68%);
23
+ --shard-beta: polygon(0 0, 74% 18%, 100% 100%, 18% 84%);
24
+ --font-body: "Newsreader", Georgia, serif;
25
+ --font-display: "Newsreader", Georgia, serif;
26
+ --font-title: "Cinzel Decorative", "Times New Roman", serif;
27
+ --font-label: "Marcellus SC", "Newsreader", Georgia, serif;
28
+ --font-mono: "Courier Prime", ui-monospace, monospace;
29
+ /*
30
+ * Type ladder (readable, not decorative). Body is the reading size;
31
+ * chrome sits one step under it; micro chrome stays legible but quiet.
32
+ */
33
+ --studio-font-size: 18px;
34
+ --studio-type-display: 1.55rem; /* page / collection title */
35
+ --studio-type-title: 1.15rem; /* brand, map section heads */
36
+ --studio-type-body: 1rem; /* entry titles, form values, nav entries */
37
+ --studio-type-ui: 0.9rem; /* control text */
38
+ --studio-type-meta: 0.8rem; /* meta lines, crumbs, counts */
39
+ --studio-type-micro: 0.72rem; /* pills, tags, captions */
40
+ --studio-brand-title: calc(var(--studio-type-title) + 3pt);
41
+ --studio-nav-label: calc(var(--studio-type-body) - 0.5pt);
42
+ --studio-nav-item: var(--studio-type-body);
43
+ --studio-ledger-title: var(--studio-type-body);
44
+ --studio-ledger-meta: var(--studio-type-meta);
45
+ --studio-list-control-height: 2.25rem;
46
+ --studio-ledger-thumb-w: 4rem;
47
+ --studio-ledger-thumb-h: 3rem;
48
+ /* Spacing rhythm — readable chrome, clearer list blocks. */
49
+ --studio-space-2xs: 0.25rem;
50
+ --studio-space-xs: 0.4rem;
51
+ --studio-space-sm: 0.65rem;
52
+ --studio-space-md: 0.95rem;
53
+ --studio-space-lg: 1.35rem;
54
+ --studio-pane-pad: 1.15rem 1.35rem;
55
+ /* Tall enough that pane-scroll-to-end shows editor + metrics only. */
56
+ --studio-editor-min-height: max(24rem, calc(100dvh - 7.5rem));
57
+ }
58
+
59
+ [data-theme="dark"] {
60
+ color-scheme: dark;
61
+ --primary: #a4c8da;
62
+ --secondary: #95c8a6;
63
+ --tertiary: #ddd8a8;
64
+ --background: #0c0c0e;
65
+ --panel: #141418;
66
+ --surface-high: #26262b;
67
+ --surface-card: #0c0c0e;
68
+ --on-surface: #ffffff;
69
+ --on-surface-variant: #b8b7ae;
70
+ --outline: #93938d;
71
+ --outline-variant: #45454c;
72
+ --error: #ffb4ab;
73
+ --scrollbar-track: var(--panel);
74
+ --scrollbar-thumb: color-mix(in srgb, var(--outline-variant) 85%, var(--surface-high));
75
+ --scrollbar-thumb-hover: color-mix(in srgb, var(--outline) 55%, var(--surface-high));
76
+ --cubist-shard-opacity: 10%;
77
+ --cubist-shard-opacity-strong: 14%;
78
+ }
79
+
80
+ *,
81
+ *::before,
82
+ *::after {
83
+ box-sizing: border-box;
84
+ }
85
+
86
+ html,
87
+ body {
88
+ margin: 0;
89
+ min-height: 100%;
90
+ height: 100%;
91
+ background-color: var(--background);
92
+ /* Quiet square grid — same apparatus as the public site (assets/css/base.css). */
93
+ background-image:
94
+ linear-gradient(color-mix(in srgb, var(--outline) 4%, transparent) 1px, transparent 1px),
95
+ linear-gradient(90deg, color-mix(in srgb, var(--outline) 4%, transparent) 1px, transparent 1px);
96
+ background-size: 1.25rem 1.25rem;
97
+ background-attachment: fixed;
98
+ color: var(--on-surface);
99
+ font-family: var(--font-body);
100
+ font-size: var(--studio-font-size);
101
+ line-height: 1.5;
102
+ /* Firefox + Chromium overlay scrollbars follow color-scheme + these. */
103
+ scrollbar-width: thin;
104
+ scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
105
+ }
106
+
107
+ /* Theme-aware scrollbars for Studio chrome (nav, lists, editor, preview). */
108
+ *::-webkit-scrollbar {
109
+ width: 10px;
110
+ height: 10px;
111
+ }
112
+
113
+ *::-webkit-scrollbar-track {
114
+ background: var(--scrollbar-track);
115
+ }
116
+
117
+ *::-webkit-scrollbar-thumb {
118
+ background: var(--scrollbar-thumb);
119
+ border: 2px solid var(--scrollbar-track);
120
+ background-clip: padding-box;
121
+ }
122
+
123
+ *::-webkit-scrollbar-thumb:hover {
124
+ background: var(--scrollbar-thumb-hover);
125
+ border: 2px solid var(--scrollbar-track);
126
+ background-clip: padding-box;
127
+ }
128
+
129
+ *::-webkit-scrollbar-corner {
130
+ background: var(--scrollbar-track);
131
+ }
132
+
133
+ button,
134
+ input,
135
+ select,
136
+ textarea {
137
+ font: inherit;
138
+ color: inherit;
139
+ }
140
+
141
+ a {
142
+ color: var(--primary);
143
+ }
144
+
145
+ #app {
146
+ min-height: 100vh;
147
+ height: 100%;
148
+ }
149
+
150
+ .studio-shell {
151
+ display: grid;
152
+ grid-template-columns: 16.5rem minmax(0, 1fr);
153
+ min-height: 100vh;
154
+ height: 100%;
155
+ background: transparent;
156
+ }
157
+
158
+ .studio-nav {
159
+ background: var(--panel);
160
+ border-right: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
161
+ padding: var(--studio-space-md) var(--studio-space-sm);
162
+ display: flex;
163
+ flex-direction: column;
164
+ gap: var(--studio-space-sm);
165
+ overflow: auto;
166
+ }
167
+
168
+ .studio-nav-bar {
169
+ display: flex;
170
+ flex-direction: column;
171
+ gap: 0.35rem;
172
+ }
173
+
174
+ .studio-nav-menu-toggle {
175
+ display: none;
176
+ width: 100%;
177
+ align-items: center;
178
+ justify-content: space-between;
179
+ gap: 0.5rem;
180
+ margin: 0;
181
+ padding: 0.55rem 0.65rem;
182
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
183
+ border-radius: 0;
184
+ background: var(--background);
185
+ cursor: pointer;
186
+ color: var(--on-surface);
187
+ font: inherit;
188
+ text-align: left;
189
+ }
190
+
191
+ .studio-nav-menu-toggle:hover {
192
+ background: var(--surface-high);
193
+ }
194
+
195
+ .studio-nav-menu-toggle .studio-nav-menu-label {
196
+ flex: 1;
197
+ min-width: 0;
198
+ overflow: hidden;
199
+ text-overflow: ellipsis;
200
+ white-space: nowrap;
201
+ font-family: var(--font-label);
202
+ font-size: var(--studio-nav-label);
203
+ letter-spacing: 0.04em;
204
+ font-weight: 400;
205
+ }
206
+
207
+ .studio-nav-menu-toggle .material-symbols-outlined {
208
+ flex-shrink: 0;
209
+ font-size: 1.25rem;
210
+ line-height: 1;
211
+ }
212
+
213
+ .studio-nav-panel {
214
+ display: flex;
215
+ flex-direction: column;
216
+ gap: var(--studio-space-xs);
217
+ min-height: 0;
218
+ }
219
+
220
+ .studio-brand {
221
+ display: grid;
222
+ grid-template-columns: 2.5rem minmax(0, 1fr);
223
+ align-items: center;
224
+ column-gap: var(--studio-space-sm);
225
+ padding: var(--studio-space-sm) var(--studio-space-xs) var(--studio-space-md);
226
+ margin-bottom: var(--studio-space-xs);
227
+ border-bottom: 1px solid var(--outline-variant);
228
+ }
229
+
230
+ .studio-brand-copy {
231
+ display: flex;
232
+ flex-direction: column;
233
+ justify-content: center;
234
+ text-align: left;
235
+ min-width: 0;
236
+ }
237
+
238
+ .studio-brand-name {
239
+ font-family: var(--font-title);
240
+ font-size: var(--studio-brand-title);
241
+ font-weight: 400;
242
+ font-synthesis: none;
243
+ line-height: 1.15;
244
+ letter-spacing: 0.02em;
245
+ }
246
+
247
+ .studio-brand strong {
248
+ font-family: var(--font-title);
249
+ font-size: var(--studio-brand-title);
250
+ font-weight: 400;
251
+ font-synthesis: none;
252
+ line-height: 1.15;
253
+ letter-spacing: 0.02em;
254
+ }
255
+
256
+ button.studio-brand-home {
257
+ width: 100%;
258
+ margin: 0;
259
+ border: 0;
260
+ border-radius: 0;
261
+ background: transparent;
262
+ cursor: pointer;
263
+ text-align: left;
264
+ color: inherit;
265
+ font: inherit;
266
+ }
267
+
268
+ button.studio-brand-home:hover,
269
+ button.studio-brand-home[aria-current="page"] {
270
+ background: var(--surface-high);
271
+ }
272
+
273
+ .studio-brand .studio-mark {
274
+ display: block;
275
+ width: 2.5rem;
276
+ height: 2.5rem;
277
+ justify-self: center;
278
+ /* Optical nudge: logo glyph sits a hair high in its viewBox. */
279
+ transform: translateY(0.5px);
280
+ }
281
+
282
+ .studio-mark-svg {
283
+ display: block;
284
+ width: 100%;
285
+ height: 100%;
286
+ }
287
+
288
+ /*
289
+ * Same theme swap as the public site stamp (assets/css/base.css):
290
+ * light page → pastel triad; dark page → production triad.
291
+ */
292
+ :root .studio-mark-primary,
293
+ [data-theme="light"] .studio-mark-primary {
294
+ fill: #a4c8da;
295
+ }
296
+
297
+ :root .studio-mark-secondary,
298
+ [data-theme="light"] .studio-mark-secondary {
299
+ fill: #95c8a6;
300
+ }
301
+
302
+ :root .studio-mark-tertiary,
303
+ [data-theme="light"] .studio-mark-tertiary {
304
+ fill: #ddd8a8;
305
+ }
306
+
307
+ [data-theme="dark"] .studio-mark-primary {
308
+ fill: #1c5a7a;
309
+ }
310
+
311
+ [data-theme="dark"] .studio-mark-secondary {
312
+ fill: #287445;
313
+ }
314
+
315
+ [data-theme="dark"] .studio-mark-tertiary {
316
+ fill: #746f30;
317
+ }
318
+
319
+ .studio-mark-frame {
320
+ fill: none;
321
+ stroke: var(--on-surface-variant);
322
+ stroke-width: 1;
323
+ stroke-linejoin: miter;
324
+ vector-effect: non-scaling-stroke;
325
+ }
326
+
327
+ .auth-gate .studio-mark {
328
+ width: 2rem;
329
+ height: 2rem;
330
+ }
331
+
332
+ .studio-nav-group {
333
+ margin-top: var(--studio-space-2xs);
334
+ }
335
+
336
+ .studio-nav-group-toggle {
337
+ width: 100%;
338
+ display: flex;
339
+ align-items: center;
340
+ gap: var(--studio-space-xs);
341
+ margin: 0;
342
+ padding: var(--studio-space-sm) var(--studio-space-xs);
343
+ border: 0;
344
+ border-radius: 0;
345
+ background: transparent;
346
+ cursor: pointer;
347
+ color: var(--on-surface-variant);
348
+ text-align: left;
349
+ font-family: var(--font-label);
350
+ font-size: var(--studio-nav-label);
351
+ text-transform: none;
352
+ letter-spacing: 0.04em;
353
+ font-weight: 400;
354
+ }
355
+
356
+ .studio-nav-group-toggle:hover {
357
+ background: var(--surface-high);
358
+ color: var(--on-surface);
359
+ }
360
+
361
+ .studio-nav-group-toggle .material-symbols-outlined {
362
+ font-size: 1.25rem;
363
+ line-height: 1;
364
+ flex-shrink: 0;
365
+ font-variation-settings: "FILL" 0, "wght" 500, "GRAD" 0, "opsz" 24;
366
+ }
367
+
368
+ .studio-nav-group-toggle .nav-group-label {
369
+ flex: 1;
370
+ min-width: 0;
371
+ font-family: var(--font-label);
372
+ font-size: inherit;
373
+ letter-spacing: inherit;
374
+ border-bottom: 1px solid var(--outline-variant);
375
+ padding-bottom: 0.2rem;
376
+ text-align: left;
377
+ }
378
+
379
+ .studio-nav-group-items {
380
+ display: flex;
381
+ flex-direction: column;
382
+ gap: 0.15rem;
383
+ padding: 0.2rem 0 var(--studio-space-sm);
384
+ }
385
+
386
+ .studio-nav-group-items[hidden] {
387
+ display: none;
388
+ }
389
+
390
+ .studio-nav button.nav-item {
391
+ width: 100%;
392
+ display: flex;
393
+ align-items: baseline;
394
+ justify-content: space-between;
395
+ gap: var(--studio-space-sm);
396
+ text-align: left;
397
+ background: transparent;
398
+ border: 0;
399
+ border-radius: 0;
400
+ padding: 0.4rem 0.5rem 0.4rem 1.7rem;
401
+ cursor: pointer;
402
+ color: var(--on-surface);
403
+ font-family: var(--font-body);
404
+ font-size: var(--studio-nav-item);
405
+ line-height: 1.35;
406
+ letter-spacing: 0.01em;
407
+ }
408
+
409
+ .studio-nav button.nav-item:hover,
410
+ .studio-nav button.nav-item[aria-current="page"] {
411
+ background: var(--surface-high);
412
+ }
413
+
414
+ .nav-item-label {
415
+ min-width: 0;
416
+ }
417
+
418
+ .nav-item-count {
419
+ flex: 0 0 auto;
420
+ font-family: var(--font-body);
421
+ font-size: var(--studio-type-meta);
422
+ color: var(--on-surface-variant);
423
+ }
424
+
425
+ .studio-main {
426
+ display: grid;
427
+ grid-template-rows: auto auto minmax(0, 1fr);
428
+ min-width: 0;
429
+ min-height: 0;
430
+ height: 100%;
431
+ overflow: hidden;
432
+ background: transparent;
433
+ }
434
+
435
+ .studio-breadcrumb {
436
+ display: flex;
437
+ flex-wrap: wrap;
438
+ align-items: center;
439
+ gap: 0.25rem 0.4rem;
440
+ padding: var(--studio-space-xs) var(--studio-space-md);
441
+ border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
442
+ font-family: var(--font-mono);
443
+ font-size: var(--studio-type-micro);
444
+ letter-spacing: 0.04em;
445
+ text-transform: uppercase;
446
+ color: var(--on-surface-variant);
447
+ background: var(--background);
448
+ }
449
+
450
+ .studio-crumb-sep {
451
+ color: var(--outline-variant);
452
+ }
453
+
454
+ .studio-crumb.is-current {
455
+ color: var(--on-surface);
456
+ text-transform: none;
457
+ letter-spacing: 0.02em;
458
+ }
459
+
460
+ .studio-toolbar {
461
+ display: flex;
462
+ align-items: center;
463
+ gap: var(--studio-space-sm);
464
+ padding: var(--studio-space-xs) var(--studio-space-md);
465
+ border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
466
+ background: var(--background);
467
+ min-width: 0;
468
+ }
469
+
470
+ .studio-toolbar .status-pill {
471
+ flex: 1 1 auto;
472
+ min-width: 0;
473
+ overflow: hidden;
474
+ text-overflow: ellipsis;
475
+ white-space: nowrap;
476
+ }
477
+
478
+ .studio-toolbar .spacer {
479
+ flex: 1 1 auto;
480
+ min-width: 0;
481
+ }
482
+
483
+ .studio-toolbar .btn {
484
+ flex-shrink: 0;
485
+ position: relative;
486
+ z-index: 1;
487
+ }
488
+
489
+ .btn {
490
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
491
+ background: var(--background);
492
+ padding: 0.25rem 0.6rem;
493
+ cursor: pointer;
494
+ min-height: var(--studio-list-control-height);
495
+ box-sizing: border-box;
496
+ display: inline-flex;
497
+ align-items: center;
498
+ justify-content: center;
499
+ font-family: var(--font-mono);
500
+ font-size: var(--studio-type-ui);
501
+ letter-spacing: 0.01em;
502
+ }
503
+
504
+ .btn-nav {
505
+ gap: 0.15rem;
506
+ }
507
+
508
+ .btn-nav-icon {
509
+ font-size: 1.25rem !important;
510
+ line-height: 1;
511
+ font-variation-settings: "FILL" 0, "wght" 500, "GRAD" 0, "opsz" 24;
512
+ }
513
+
514
+ .btn:hover {
515
+ background: var(--surface-high);
516
+ }
517
+
518
+ .btn-primary {
519
+ background: var(--primary);
520
+ color: #fff;
521
+ border-color: var(--primary);
522
+ }
523
+
524
+ [data-theme="dark"] .btn-primary {
525
+ color: #0f1a22;
526
+ }
527
+
528
+ .btn-primary:hover {
529
+ filter: brightness(1.05);
530
+ }
531
+
532
+ .btn:disabled {
533
+ opacity: 0.5;
534
+ cursor: not-allowed;
535
+ }
536
+
537
+ .studio-body {
538
+ display: grid;
539
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
540
+ min-height: 0;
541
+ height: 100%;
542
+ overflow: hidden;
543
+ background: transparent;
544
+ }
545
+
546
+ .studio-body.list-only {
547
+ grid-template-columns: minmax(0, 1fr);
548
+ }
549
+
550
+ .pane {
551
+ min-width: 0;
552
+ min-height: 0;
553
+ overflow: auto;
554
+ padding: var(--studio-pane-pad);
555
+ display: flex;
556
+ flex-direction: column;
557
+ gap: 0;
558
+ background: transparent;
559
+ }
560
+
561
+ .pane-preview {
562
+ border-left: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
563
+ background: var(--panel);
564
+ min-height: 0;
565
+ }
566
+
567
+ .ledger-list {
568
+ display: flex;
569
+ flex-direction: column;
570
+ gap: 0;
571
+ }
572
+
573
+ .ledger-columns {
574
+ display: none;
575
+ }
576
+
577
+ .ledger-row {
578
+ display: grid;
579
+ grid-template-columns: var(--studio-ledger-thumb-w) minmax(0, 1fr);
580
+ gap: var(--studio-space-md);
581
+ align-items: start;
582
+ padding: var(--studio-space-md) var(--studio-space-md);
583
+ margin: 0 0 var(--studio-space-xs);
584
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 60%, transparent);
585
+ border-radius: 0;
586
+ cursor: pointer;
587
+ background: var(--background);
588
+ text-align: left;
589
+ width: 100%;
590
+ font: inherit;
591
+ color: inherit;
592
+ }
593
+
594
+ .ledger-row--writing {
595
+ grid-template-columns: var(--studio-ledger-thumb-w) minmax(0, 1fr);
596
+ }
597
+
598
+ .ledger-row:hover {
599
+ background: var(--surface-high);
600
+ }
601
+
602
+ .ledger-copy {
603
+ min-width: 0;
604
+ display: flex;
605
+ flex-direction: column;
606
+ gap: 0.4rem;
607
+ padding-top: 0.1rem;
608
+ }
609
+
610
+ .ledger-title-row {
611
+ display: flex;
612
+ align-items: center;
613
+ flex-wrap: wrap;
614
+ gap: var(--studio-space-xs) var(--studio-space-sm);
615
+ min-width: 0;
616
+ }
617
+
618
+ .ledger-title {
619
+ font-family: var(--font-body);
620
+ font-size: var(--studio-ledger-title);
621
+ font-weight: 400;
622
+ line-height: 1.3;
623
+ min-width: 0;
624
+ }
625
+
626
+ /* Fixed-width so Published/Draft columns align across the list. */
627
+ .ledger-status {
628
+ display: inline-flex;
629
+ align-items: center;
630
+ justify-content: center;
631
+ box-sizing: border-box;
632
+ width: 5.25rem;
633
+ flex: 0 0 5.25rem;
634
+ padding: 0.1rem 0.3rem;
635
+ border: 1px solid transparent;
636
+ font-family: var(--font-mono);
637
+ font-size: var(--studio-type-micro);
638
+ font-weight: 600;
639
+ letter-spacing: 0.04em;
640
+ text-transform: uppercase;
641
+ line-height: 1.2;
642
+ white-space: nowrap;
643
+ }
644
+
645
+ .ledger-lang {
646
+ display: inline-flex;
647
+ align-items: center;
648
+ justify-content: center;
649
+ box-sizing: border-box;
650
+ padding: 0.1rem 0.3rem;
651
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
652
+ background: var(--surface-high);
653
+ font-family: var(--font-mono);
654
+ font-size: var(--studio-type-micro);
655
+ letter-spacing: 0.04em;
656
+ text-transform: uppercase;
657
+ color: var(--on-surface-variant);
658
+ line-height: 1.2;
659
+ }
660
+
661
+ .ledger-taxonomy {
662
+ display: none;
663
+ flex-wrap: wrap;
664
+ gap: 0.25rem;
665
+ align-content: flex-start;
666
+ min-width: 0;
667
+ }
668
+
669
+ .ledger-tag {
670
+ display: inline-flex;
671
+ align-items: center;
672
+ padding: 0.08rem 0.35rem;
673
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 65%, transparent);
674
+ background: var(--background);
675
+ font-family: var(--font-mono);
676
+ font-size: var(--studio-type-micro);
677
+ color: var(--on-surface-variant);
678
+ line-height: 1.25;
679
+ }
680
+
681
+ .ledger-ops {
682
+ display: none;
683
+ align-items: center;
684
+ justify-content: flex-end;
685
+ gap: 0.2rem;
686
+ font-family: var(--font-mono);
687
+ font-size: var(--studio-type-meta);
688
+ color: var(--on-surface-variant);
689
+ white-space: nowrap;
690
+ padding-top: 0.1rem;
691
+ }
692
+
693
+ .ledger-ops-icon {
694
+ font-size: 0.95rem !important;
695
+ line-height: 1;
696
+ }
697
+
698
+ .ledger-row--writing:hover .ledger-ops {
699
+ color: var(--on-surface);
700
+ }
701
+
702
+ @media (min-width: 720px) {
703
+ .ledger-columns {
704
+ display: grid;
705
+ grid-template-columns: var(--studio-ledger-thumb-w) minmax(0, 1fr) minmax(6.5rem, 10rem) 4.75rem;
706
+ gap: var(--studio-space-sm);
707
+ align-items: end;
708
+ padding: var(--studio-space-xs) var(--studio-space-md);
709
+ margin: 0 0 var(--studio-space-2xs);
710
+ font-family: var(--font-mono);
711
+ font-size: var(--studio-type-micro);
712
+ letter-spacing: 0.05em;
713
+ text-transform: uppercase;
714
+ color: var(--on-surface-variant);
715
+ background: var(--background);
716
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
717
+ border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
718
+ }
719
+
720
+ .ledger-col-ops {
721
+ text-align: right;
722
+ }
723
+
724
+ .ledger-row--writing {
725
+ grid-template-columns: var(--studio-ledger-thumb-w) minmax(0, 1fr) minmax(6.5rem, 10rem) 4.75rem;
726
+ align-items: center;
727
+ }
728
+
729
+ .ledger-row--writing .ledger-taxonomy {
730
+ display: flex;
731
+ }
732
+
733
+ .ledger-row--writing .ledger-ops {
734
+ display: inline-flex;
735
+ }
736
+ }
737
+
738
+ .ledger-status--published {
739
+ color: color-mix(in srgb, #1b6b3a 88%, var(--on-surface));
740
+ background: color-mix(in srgb, #1b6b3a 14%, transparent);
741
+ border-color: color-mix(in srgb, #1b6b3a 35%, transparent);
742
+ }
743
+
744
+ .ledger-status--draft {
745
+ color: color-mix(in srgb, #a12828 90%, var(--on-surface));
746
+ background: color-mix(in srgb, #a12828 14%, transparent);
747
+ border-color: color-mix(in srgb, #a12828 35%, transparent);
748
+ }
749
+
750
+ .ledger-thumb {
751
+ width: var(--studio-ledger-thumb-w);
752
+ height: var(--studio-ledger-thumb-h);
753
+ object-fit: cover;
754
+ background: var(--surface-high);
755
+ display: block;
756
+ flex-shrink: 0;
757
+ }
758
+
759
+ .ledger-thumb.placeholder {
760
+ display: flex;
761
+ align-items: center;
762
+ justify-content: center;
763
+ color: var(--on-surface-variant);
764
+ border: 1px dashed color-mix(in srgb, var(--outline-variant) 70%, transparent);
765
+ }
766
+
767
+ .ledger-thumb.placeholder .material-symbols-outlined {
768
+ font-size: 1.5rem;
769
+ line-height: 1;
770
+ font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24;
771
+ }
772
+
773
+ .ledger-meta {
774
+ margin-top: 0;
775
+ font-size: var(--studio-ledger-meta);
776
+ color: var(--on-surface-variant);
777
+ font-family: var(--font-mono);
778
+ letter-spacing: 0.015em;
779
+ line-height: 1.4;
780
+ word-break: break-word;
781
+ }
782
+
783
+ .list-controls {
784
+ display: flex;
785
+ flex-wrap: wrap;
786
+ align-items: center;
787
+ gap: var(--studio-space-xs);
788
+ margin: 0 0 var(--studio-space-sm);
789
+ padding: var(--studio-space-sm) var(--studio-space-md);
790
+ background: var(--background);
791
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
792
+ }
793
+
794
+ .list-search-input {
795
+ flex: 1 1 14rem;
796
+ min-width: 10rem;
797
+ height: var(--studio-list-control-height);
798
+ box-sizing: border-box;
799
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
800
+ background: var(--background);
801
+ padding: 0 var(--studio-space-sm);
802
+ font-family: var(--font-mono);
803
+ font-size: var(--studio-type-ui);
804
+ line-height: 1.2;
805
+ letter-spacing: 0.01em;
806
+ }
807
+
808
+ .list-sort-label {
809
+ display: flex;
810
+ align-items: center;
811
+ gap: var(--studio-space-xs);
812
+ flex: 0 1 auto;
813
+ margin: 0;
814
+ font-family: var(--font-mono);
815
+ font-size: var(--studio-type-ui);
816
+ color: var(--on-surface-variant);
817
+ text-transform: none;
818
+ letter-spacing: 0;
819
+ }
820
+
821
+ .list-sort-caption {
822
+ font-family: var(--font-mono);
823
+ text-transform: uppercase;
824
+ letter-spacing: 0.06em;
825
+ font-size: var(--studio-type-micro);
826
+ font-weight: 600;
827
+ white-space: nowrap;
828
+ }
829
+
830
+ .list-sort-select,
831
+ .list-page-size-select {
832
+ height: var(--studio-list-control-height);
833
+ box-sizing: border-box;
834
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
835
+ background: var(--background);
836
+ padding: 0 var(--studio-space-sm);
837
+ font-family: var(--font-mono);
838
+ font-size: var(--studio-type-ui);
839
+ min-width: 10rem;
840
+ max-width: 100%;
841
+ }
842
+
843
+ .list-page-size-select {
844
+ min-width: 4rem;
845
+ }
846
+
847
+ .list-count {
848
+ margin: 0 0 var(--studio-space-xs);
849
+ font-family: var(--font-mono);
850
+ font-size: var(--studio-type-meta);
851
+ color: var(--on-surface-variant);
852
+ min-height: 1em;
853
+ }
854
+
855
+ .list-pager {
856
+ display: flex;
857
+ align-items: center;
858
+ justify-content: center;
859
+ gap: var(--studio-space-sm);
860
+ margin: var(--studio-space-md) 0 var(--studio-space-xs);
861
+ flex-wrap: wrap;
862
+ }
863
+
864
+ .list-pager-btn:disabled {
865
+ opacity: 0.45;
866
+ cursor: not-allowed;
867
+ }
868
+
869
+ .list-pager-status {
870
+ font-family: var(--font-mono);
871
+ font-size: var(--studio-type-meta);
872
+ color: var(--on-surface-variant);
873
+ min-width: 7rem;
874
+ text-align: center;
875
+ }
876
+
877
+ .pane-editor > .btn {
878
+ flex-shrink: 0;
879
+ align-self: flex-start;
880
+ margin-bottom: var(--studio-space-sm);
881
+ }
882
+
883
+ .list-register {
884
+ display: flex;
885
+ flex-direction: column;
886
+ gap: var(--studio-space-sm);
887
+ margin-bottom: var(--studio-space-lg);
888
+ padding: var(--studio-space-sm) var(--studio-space-md);
889
+ background: var(--background);
890
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
891
+ }
892
+
893
+ .list-register-kicker {
894
+ display: flex;
895
+ flex-wrap: wrap;
896
+ align-items: center;
897
+ gap: var(--studio-space-xs) var(--studio-space-sm);
898
+ margin: 0;
899
+ font-family: var(--font-mono);
900
+ font-size: var(--studio-type-meta);
901
+ color: var(--on-surface-variant);
902
+ text-transform: uppercase;
903
+ letter-spacing: 0.05em;
904
+ }
905
+
906
+ .list-register-mark {
907
+ width: 5px;
908
+ height: 5px;
909
+ background: var(--primary);
910
+ flex: 0 0 auto;
911
+ }
912
+
913
+ .list-register-sep {
914
+ color: var(--outline-variant);
915
+ }
916
+
917
+ .list-pane-title {
918
+ font-family: var(--font-display);
919
+ font-size: var(--studio-type-display);
920
+ font-weight: 600;
921
+ line-height: 1.15;
922
+ margin: 0 0 var(--studio-space-sm);
923
+ }
924
+
925
+ .list-register .list-pane-title {
926
+ margin: 0;
927
+ }
928
+
929
+ .list-register-title-row {
930
+ display: flex;
931
+ flex-wrap: wrap;
932
+ align-items: baseline;
933
+ gap: var(--studio-space-xs) var(--studio-space-md);
934
+ margin-top: var(--studio-space-2xs);
935
+ }
936
+
937
+ .list-pane-count {
938
+ font-family: var(--font-mono);
939
+ font-size: var(--studio-type-meta);
940
+ color: var(--on-surface-variant);
941
+ letter-spacing: 0.02em;
942
+ }
943
+
944
+ .list-tag-filters {
945
+ display: flex;
946
+ flex-wrap: wrap;
947
+ gap: var(--studio-space-2xs) var(--studio-space-xs);
948
+ margin: 0 0 var(--studio-space-sm);
949
+ padding: var(--studio-space-sm) var(--studio-space-md);
950
+ background: var(--background);
951
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
952
+ }
953
+
954
+ .list-tag-chip {
955
+ margin: 0;
956
+ padding: 0.15rem 0.45rem;
957
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
958
+ background: var(--background);
959
+ font-family: var(--font-mono);
960
+ font-size: var(--studio-type-micro);
961
+ letter-spacing: 0.03em;
962
+ text-transform: uppercase;
963
+ color: var(--on-surface-variant);
964
+ cursor: pointer;
965
+ }
966
+
967
+ .list-tag-chip:hover {
968
+ background: var(--surface-high);
969
+ color: var(--on-surface);
970
+ }
971
+
972
+ .list-tag-chip.is-active {
973
+ border-color: color-mix(in srgb, var(--primary) 55%, var(--outline-variant));
974
+ background: color-mix(in srgb, var(--primary) 12%, transparent);
975
+ color: var(--on-surface);
976
+ }
977
+
978
+ .front-matter {
979
+ flex: 0 0 auto;
980
+ margin: 0 0 var(--studio-space-sm);
981
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
982
+ background: var(--background);
983
+ max-width: 52rem;
984
+ }
985
+
986
+ .front-matter-summary {
987
+ display: flex;
988
+ flex-wrap: wrap;
989
+ align-items: baseline;
990
+ justify-content: space-between;
991
+ gap: var(--studio-space-xs) var(--studio-space-md);
992
+ margin: 0;
993
+ padding: 0.45rem 0.65rem;
994
+ cursor: pointer;
995
+ list-style: none;
996
+ font-family: var(--font-mono);
997
+ font-size: var(--studio-type-micro);
998
+ letter-spacing: 0.06em;
999
+ text-transform: uppercase;
1000
+ color: var(--on-surface-variant);
1001
+ user-select: none;
1002
+ }
1003
+
1004
+ .front-matter-summary::-webkit-details-marker {
1005
+ display: none;
1006
+ }
1007
+
1008
+ .front-matter-summary::before {
1009
+ content: "▸";
1010
+ margin-right: 0.45rem;
1011
+ color: var(--outline-variant);
1012
+ }
1013
+
1014
+ .front-matter[open] > .front-matter-summary::before {
1015
+ content: "▾";
1016
+ }
1017
+
1018
+ .front-matter[open] > .front-matter-summary {
1019
+ border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1020
+ }
1021
+
1022
+ .front-matter-summary-label {
1023
+ color: var(--on-surface);
1024
+ font-weight: 600;
1025
+ }
1026
+
1027
+ .front-matter-summary-hint {
1028
+ color: var(--outline-variant);
1029
+ letter-spacing: 0.04em;
1030
+ }
1031
+
1032
+ .front-matter > .form-grid {
1033
+ padding: 0.15rem 0.65rem 0.75rem;
1034
+ max-width: none;
1035
+ }
1036
+
1037
+ .editor-mast {
1038
+ display: flex;
1039
+ flex-wrap: wrap;
1040
+ justify-content: space-between;
1041
+ align-items: flex-start;
1042
+ gap: 0.65rem 1.25rem;
1043
+ margin-bottom: 0.85rem;
1044
+ padding: var(--studio-space-sm) var(--studio-space-md);
1045
+ background: var(--background);
1046
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1047
+ }
1048
+
1049
+ .editor-mast-lead {
1050
+ display: flex;
1051
+ flex-wrap: wrap;
1052
+ align-items: center;
1053
+ gap: 0.55rem 0.75rem;
1054
+ min-width: 0;
1055
+ }
1056
+
1057
+ .editor-mast-pills {
1058
+ display: flex;
1059
+ flex-wrap: wrap;
1060
+ align-items: center;
1061
+ gap: 0.35rem;
1062
+ }
1063
+
1064
+ .editor-mast > .btn,
1065
+ .editor-mast-lead > .btn {
1066
+ flex: 0 0 auto;
1067
+ align-self: center;
1068
+ margin-bottom: 0;
1069
+ }
1070
+
1071
+ .editor-mast-lead > .btn-back {
1072
+ min-width: 2.25rem;
1073
+ padding-left: 0.4rem;
1074
+ padding-right: 0.4rem;
1075
+ gap: 0;
1076
+ }
1077
+
1078
+ .editor-mast-lead > .btn-back .btn-nav-icon {
1079
+ font-size: 1.35rem !important;
1080
+ }
1081
+
1082
+ .editor-body-stats {
1083
+ display: flex;
1084
+ flex-wrap: wrap;
1085
+ align-items: center;
1086
+ flex: 0 0 auto;
1087
+ gap: var(--studio-space-xs) var(--studio-space-sm);
1088
+ margin-top: var(--studio-space-sm);
1089
+ padding: var(--studio-space-sm) var(--studio-space-md);
1090
+ background: var(--background);
1091
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1092
+ font-family: var(--font-mono);
1093
+ font-size: var(--studio-type-micro);
1094
+ letter-spacing: 0.03em;
1095
+ text-transform: uppercase;
1096
+ color: var(--on-surface-variant);
1097
+ }
1098
+
1099
+ .editor-body-stats-sep {
1100
+ color: var(--outline-variant);
1101
+ }
1102
+
1103
+ .preview-pane-head {
1104
+ display: flex;
1105
+ flex-wrap: wrap;
1106
+ align-items: baseline;
1107
+ gap: var(--studio-space-xs) var(--studio-space-sm);
1108
+ margin: 0 0 var(--studio-space-sm);
1109
+ font-family: var(--font-mono);
1110
+ font-size: var(--studio-type-micro);
1111
+ letter-spacing: 0.05em;
1112
+ text-transform: uppercase;
1113
+ color: var(--on-surface-variant);
1114
+ }
1115
+
1116
+ .preview-pane-label {
1117
+ color: var(--on-surface-variant);
1118
+ }
1119
+
1120
+ .preview-pane-sep {
1121
+ color: var(--outline-variant);
1122
+ }
1123
+
1124
+ .preview-pane-meta {
1125
+ text-transform: none;
1126
+ letter-spacing: 0.02em;
1127
+ }
1128
+
1129
+ .preview-folio {
1130
+ flex: 1 1 auto;
1131
+ min-height: 0;
1132
+ display: flex;
1133
+ flex-direction: column;
1134
+ padding: 0.35rem;
1135
+ background: var(--background);
1136
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1137
+ }
1138
+
1139
+ .preview-folio > .preview-frame {
1140
+ flex: 1 1 auto;
1141
+ min-height: 12rem;
1142
+ border-color: color-mix(in srgb, var(--outline-variant) 40%, transparent);
1143
+ }
1144
+
1145
+ .loading-msg {
1146
+ margin: 1rem 0;
1147
+ padding: var(--studio-space-sm) var(--studio-space-md);
1148
+ background: var(--background);
1149
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1150
+ color: var(--on-surface-variant);
1151
+ font-size: 1rem;
1152
+ }
1153
+
1154
+ .list-empty {
1155
+ margin: 1rem 0;
1156
+ padding: var(--studio-space-sm) var(--studio-space-md);
1157
+ background: var(--background);
1158
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1159
+ color: var(--on-surface-variant);
1160
+ }
1161
+
1162
+ .list-error {
1163
+ margin: 0.75rem 0;
1164
+ padding: 0.85rem 0.9rem;
1165
+ border: 1px solid color-mix(in srgb, var(--error) 45%, transparent);
1166
+ background: color-mix(in srgb, var(--error) 8%, var(--background));
1167
+ }
1168
+
1169
+ .list-error-title {
1170
+ margin: 0 0 0.35rem;
1171
+ font-weight: 600;
1172
+ color: var(--error);
1173
+ }
1174
+
1175
+ .list-error-message {
1176
+ margin: 0;
1177
+ font-family: var(--font-mono);
1178
+ font-size: 0.9rem;
1179
+ color: var(--on-surface);
1180
+ word-break: break-word;
1181
+ }
1182
+
1183
+ .list-error-detail {
1184
+ margin: 0.65rem 0 0;
1185
+ padding: 0.55rem 0.65rem;
1186
+ max-height: 10rem;
1187
+ overflow: auto;
1188
+ font-family: var(--font-mono);
1189
+ font-size: 0.78rem;
1190
+ line-height: 1.4;
1191
+ color: var(--on-surface-variant);
1192
+ background: var(--panel);
1193
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1194
+ white-space: pre-wrap;
1195
+ }
1196
+
1197
+ .studio-map {
1198
+ gap: var(--studio-space-lg);
1199
+ max-width: 72rem;
1200
+ position: relative;
1201
+ }
1202
+
1203
+ /* Decorative shards — same polygons/opacity as the public site. */
1204
+ .studio-shard {
1205
+ content: "";
1206
+ position: absolute;
1207
+ pointer-events: none;
1208
+ z-index: 0;
1209
+ clip-path: var(--shard-alpha);
1210
+ opacity: var(--cubist-shard-opacity);
1211
+ background: color-mix(in srgb, var(--primary) 55%, var(--secondary));
1212
+ }
1213
+
1214
+ .studio-shard--beta {
1215
+ clip-path: var(--shard-beta);
1216
+ background: color-mix(in srgb, var(--tertiary) 50%, var(--primary));
1217
+ opacity: var(--cubist-shard-opacity-strong);
1218
+ }
1219
+
1220
+ .studio-map > .studio-shard--lead {
1221
+ width: min(18rem, 42vw);
1222
+ height: min(14rem, 32vw);
1223
+ top: -1rem;
1224
+ right: 4%;
1225
+ }
1226
+
1227
+ .studio-map > .studio-shard--trail {
1228
+ width: min(12rem, 28vw);
1229
+ height: min(10rem, 22vw);
1230
+ bottom: 8%;
1231
+ left: 2%;
1232
+ }
1233
+
1234
+ @media (max-width: 639px) {
1235
+ .studio-shard {
1236
+ display: none;
1237
+ }
1238
+ }
1239
+
1240
+ .studio-map-header {
1241
+ display: flex;
1242
+ flex-direction: column;
1243
+ gap: var(--studio-space-xs);
1244
+ max-width: 28rem;
1245
+ padding: var(--studio-space-md);
1246
+ background: var(--background);
1247
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1248
+ position: relative;
1249
+ z-index: 1;
1250
+ }
1251
+
1252
+ .studio-map-board {
1253
+ display: flex;
1254
+ flex-direction: column;
1255
+ gap: var(--studio-space-lg);
1256
+ min-width: 0;
1257
+ position: relative;
1258
+ z-index: 1;
1259
+ }
1260
+
1261
+ .studio-map-kicker {
1262
+ margin: 0;
1263
+ font-family: var(--font-label);
1264
+ font-size: var(--studio-type-meta);
1265
+ letter-spacing: 0.04em;
1266
+ color: var(--on-surface-variant);
1267
+ }
1268
+
1269
+ .studio-map-header h1 {
1270
+ font-family: var(--font-display);
1271
+ font-weight: 600;
1272
+ font-size: var(--studio-type-display);
1273
+ margin: 0;
1274
+ line-height: 1.15;
1275
+ }
1276
+
1277
+ .studio-map-lede,
1278
+ .studio-map-header p {
1279
+ margin: 0;
1280
+ color: var(--on-surface-variant);
1281
+ font-size: var(--studio-type-body);
1282
+ line-height: 1.45;
1283
+ }
1284
+
1285
+ .studio-map-col {
1286
+ display: flex;
1287
+ flex-direction: column;
1288
+ gap: var(--studio-space-lg);
1289
+ min-width: 0;
1290
+ }
1291
+
1292
+ .studio-map-group {
1293
+ display: flex;
1294
+ flex-direction: column;
1295
+ gap: var(--studio-space-sm);
1296
+ padding: var(--studio-space-md);
1297
+ background: var(--background);
1298
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1299
+ }
1300
+
1301
+ .studio-map-group-head {
1302
+ display: flex;
1303
+ align-items: baseline;
1304
+ gap: var(--studio-space-sm);
1305
+ }
1306
+
1307
+ .studio-map-group-icon {
1308
+ position: relative;
1309
+ top: 0.1rem;
1310
+ color: var(--primary);
1311
+ font-size: 1.15rem;
1312
+ font-variation-settings: "FILL" 0, "wght" 500, "GRAD" 0, "opsz" 24;
1313
+ }
1314
+
1315
+ .studio-map-group-label {
1316
+ margin: 0;
1317
+ font-family: var(--font-label);
1318
+ font-size: var(--studio-type-title);
1319
+ font-weight: 400;
1320
+ letter-spacing: 0.03em;
1321
+ line-height: 1.2;
1322
+ }
1323
+
1324
+ .studio-map-grid {
1325
+ display: grid;
1326
+ grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr));
1327
+ gap: var(--studio-space-sm);
1328
+ }
1329
+
1330
+ .studio-map-card {
1331
+ display: flex;
1332
+ align-items: flex-start;
1333
+ gap: var(--studio-space-sm);
1334
+ text-align: left;
1335
+ margin: 0;
1336
+ padding: var(--studio-space-sm) var(--studio-space-md);
1337
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 60%, transparent);
1338
+ background: var(--background);
1339
+ cursor: pointer;
1340
+ color: inherit;
1341
+ font: inherit;
1342
+ min-height: 3.5rem;
1343
+ }
1344
+
1345
+ .studio-map-card:hover {
1346
+ background: var(--surface-high);
1347
+ border-color: color-mix(in srgb, var(--primary) 45%, var(--outline-variant));
1348
+ }
1349
+
1350
+ .studio-map-card-icon {
1351
+ color: var(--on-surface-variant);
1352
+ font-size: 1.25rem;
1353
+ line-height: 1;
1354
+ margin-top: 0.1rem;
1355
+ font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24;
1356
+ }
1357
+
1358
+ .studio-map-card-body {
1359
+ display: flex;
1360
+ flex-direction: column;
1361
+ gap: 0.25rem;
1362
+ min-width: 0;
1363
+ }
1364
+
1365
+ .studio-map-card-title {
1366
+ font-family: var(--font-body);
1367
+ font-weight: 600;
1368
+ font-size: var(--studio-type-body);
1369
+ line-height: 1.3;
1370
+ }
1371
+
1372
+ .studio-map-card-meta {
1373
+ font-family: var(--font-mono);
1374
+ font-size: var(--studio-type-meta);
1375
+ color: var(--on-surface-variant);
1376
+ word-break: break-word;
1377
+ }
1378
+
1379
+ /* Medium+: two collection columns fill the board. */
1380
+ @media (min-width: 56rem) {
1381
+ .studio-map-board {
1382
+ display: grid;
1383
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1384
+ gap: var(--studio-space-lg) var(--studio-space-md);
1385
+ align-items: start;
1386
+ }
1387
+ }
1388
+
1389
+ /* Wide: intro rail + board, so the home is a composition, not a thin stack. */
1390
+ @media (min-width: 72rem) {
1391
+ .studio-map {
1392
+ display: grid;
1393
+ grid-template-columns: minmax(14rem, 18rem) minmax(0, 1fr);
1394
+ column-gap: clamp(1.5rem, 3vw, 2.75rem);
1395
+ row-gap: var(--studio-space-lg);
1396
+ align-items: start;
1397
+ max-width: none;
1398
+ }
1399
+
1400
+ .studio-map-header {
1401
+ position: sticky;
1402
+ top: var(--studio-space-md);
1403
+ max-width: none;
1404
+ padding-right: var(--studio-space-sm);
1405
+ }
1406
+
1407
+ .studio-map-board {
1408
+ padding-left: var(--studio-space-md);
1409
+ border-left: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1410
+ }
1411
+ }
1412
+
1413
+ .form-grid {
1414
+ display: flex;
1415
+ flex-direction: column;
1416
+ gap: var(--studio-space-md);
1417
+ max-width: 52rem;
1418
+ flex-shrink: 0;
1419
+ }
1420
+
1421
+ .field label,
1422
+ .field .field-heading {
1423
+ display: block;
1424
+ font-family: var(--font-mono);
1425
+ font-size: var(--studio-type-micro);
1426
+ text-transform: uppercase;
1427
+ letter-spacing: 0.08em;
1428
+ color: var(--on-surface-variant);
1429
+ margin-bottom: var(--studio-space-2xs);
1430
+ }
1431
+
1432
+ .field--title {
1433
+ padding-bottom: var(--studio-space-md);
1434
+ border-bottom: 1px solid var(--outline-variant);
1435
+ }
1436
+
1437
+ /* Entry metadata controls: mono, one step under body. */
1438
+ .form-grid .field input:not([type="checkbox"]):not([type="radio"]),
1439
+ .form-grid .field select,
1440
+ .form-grid .field textarea {
1441
+ font-family: var(--font-mono);
1442
+ font-size: var(--studio-type-ui);
1443
+ }
1444
+
1445
+ .field input,
1446
+ .field select,
1447
+ .field textarea {
1448
+ width: 100%;
1449
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1450
+ background: var(--background);
1451
+ padding: 0.4rem 0.55rem;
1452
+ }
1453
+
1454
+ /* Checkboxes must not inherit width:100% — that made a full-row box whose
1455
+ clickable hit target was only the tiny native control (felt "broken"). */
1456
+ .field--boolean .field-checkbox,
1457
+ .field input.field-checkbox,
1458
+ .field input[type="checkbox"] {
1459
+ width: auto;
1460
+ max-width: none;
1461
+ margin: 0;
1462
+ padding: 0;
1463
+ border: 0;
1464
+ background: transparent;
1465
+ flex: 0 0 auto;
1466
+ accent-color: var(--primary);
1467
+ }
1468
+
1469
+ /* Boolean: section title on its own line; checkbox + help below, centered. */
1470
+ .field--boolean .field-check-row {
1471
+ display: flex;
1472
+ align-items: center;
1473
+ gap: 0.55rem;
1474
+ margin: 0;
1475
+ text-transform: none;
1476
+ letter-spacing: normal;
1477
+ font-size: 0.92rem;
1478
+ color: var(--on-surface);
1479
+ cursor: pointer;
1480
+ user-select: none;
1481
+ line-height: 1.35;
1482
+ }
1483
+
1484
+ .field--boolean .field-check-text {
1485
+ line-height: 1.35;
1486
+ }
1487
+
1488
+ .field textarea {
1489
+ min-height: 6rem;
1490
+ line-height: 1.45;
1491
+ }
1492
+
1493
+ .field .hint {
1494
+ margin: var(--studio-space-2xs) 0 0;
1495
+ font-size: var(--studio-type-meta);
1496
+ color: var(--on-surface-variant);
1497
+ line-height: 1.35;
1498
+ }
1499
+
1500
+ .body-editor-stack {
1501
+ display: flex;
1502
+ flex-direction: column;
1503
+ /* Tall floor so pane-scroll-to-end is editor + metrics; overflow hidden
1504
+ keeps TipTap inside the plate (it used to paint past the border when
1505
+ the pane flexed this stack below chrome + surface). */
1506
+ flex: 1 1 auto;
1507
+ min-height: var(--studio-editor-min-height);
1508
+ margin-top: 0.35rem;
1509
+ padding: var(--studio-space-sm) var(--studio-space-md);
1510
+ background: var(--background);
1511
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1512
+ overflow: hidden;
1513
+ }
1514
+
1515
+ .editor-chrome {
1516
+ display: flex;
1517
+ flex-direction: column;
1518
+ gap: 0.45rem;
1519
+ margin-bottom: 0.5rem;
1520
+ flex-shrink: 0;
1521
+ }
1522
+
1523
+ .editor-chrome-row {
1524
+ display: flex;
1525
+ flex-wrap: wrap;
1526
+ align-items: center;
1527
+ gap: 0.55rem;
1528
+ }
1529
+
1530
+ .editor-chrome-actions {
1531
+ display: inline-flex;
1532
+ flex-wrap: wrap;
1533
+ align-items: center;
1534
+ gap: 0.45rem;
1535
+ }
1536
+
1537
+ .editor-ai-proof {
1538
+ display: inline-flex;
1539
+ flex-wrap: wrap;
1540
+ align-items: center;
1541
+ gap: 0.35rem;
1542
+ }
1543
+
1544
+ .ai-proof-hint {
1545
+ margin: 0;
1546
+ font-family: var(--font-mono);
1547
+ font-size: var(--studio-type-micro);
1548
+ letter-spacing: 0.02em;
1549
+ color: var(--on-surface-variant);
1550
+ }
1551
+
1552
+ .ai-proof-hint[hidden] {
1553
+ display: none !important;
1554
+ }
1555
+
1556
+ .editor-mode-tabs {
1557
+ display: inline-flex;
1558
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1559
+ background: var(--panel);
1560
+ }
1561
+
1562
+ .editor-mode-tab {
1563
+ margin: 0;
1564
+ border: 0;
1565
+ border-radius: 0;
1566
+ background: transparent;
1567
+ padding: 0.4rem 0.9rem;
1568
+ cursor: pointer;
1569
+ color: var(--on-surface-variant);
1570
+ font: inherit;
1571
+ font-size: 0.92rem;
1572
+ }
1573
+
1574
+ .editor-mode-tab + .editor-mode-tab {
1575
+ border-left: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1576
+ }
1577
+
1578
+ .editor-mode-tab[aria-selected="true"] {
1579
+ background: var(--background);
1580
+ color: var(--on-surface);
1581
+ font-weight: 600;
1582
+ }
1583
+
1584
+ .editor-mode-tab:hover {
1585
+ background: var(--surface-high);
1586
+ color: var(--on-surface);
1587
+ }
1588
+
1589
+ .editor-insert {
1590
+ position: relative;
1591
+ }
1592
+
1593
+ .editor-insert-btn {
1594
+ display: inline-flex;
1595
+ align-items: center;
1596
+ gap: 0.3rem;
1597
+ }
1598
+
1599
+ .editor-insert-btn .material-symbols-outlined {
1600
+ font-size: 1.1rem;
1601
+ line-height: 1;
1602
+ }
1603
+
1604
+ .editor-insert-caret {
1605
+ font-size: 1rem !important;
1606
+ opacity: 0.75;
1607
+ }
1608
+
1609
+ .editor-insert-menu {
1610
+ position: absolute;
1611
+ top: calc(100% + 0.25rem);
1612
+ left: 0;
1613
+ z-index: 20;
1614
+ min-width: 12rem;
1615
+ max-height: 16rem;
1616
+ overflow: auto;
1617
+ display: flex;
1618
+ flex-direction: column;
1619
+ gap: 0;
1620
+ padding: 0.25rem;
1621
+ background: var(--background);
1622
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1623
+ box-shadow: 0 8px 20px color-mix(in srgb, var(--on-surface) 12%, transparent);
1624
+ }
1625
+
1626
+ .editor-insert-menu[hidden] {
1627
+ display: none !important;
1628
+ }
1629
+
1630
+ .editor-insert-item {
1631
+ display: flex;
1632
+ align-items: center;
1633
+ gap: 0.55rem;
1634
+ width: 100%;
1635
+ margin: 0;
1636
+ padding: 0.45rem 0.55rem;
1637
+ border: 0;
1638
+ background: transparent;
1639
+ cursor: pointer;
1640
+ text-align: left;
1641
+ color: inherit;
1642
+ font: inherit;
1643
+ font-size: 0.92rem;
1644
+ }
1645
+
1646
+ .editor-insert-item:hover {
1647
+ background: var(--surface-high);
1648
+ }
1649
+
1650
+ .editor-insert-icon {
1651
+ font-size: 1.15rem;
1652
+ color: var(--on-surface-variant);
1653
+ font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24;
1654
+ }
1655
+
1656
+ .editor-format-toolbar {
1657
+ display: flex;
1658
+ flex-wrap: wrap;
1659
+ align-items: center;
1660
+ gap: 0.2rem;
1661
+ padding: 0.35rem 0.4rem;
1662
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1663
+ background: var(--panel);
1664
+ }
1665
+
1666
+ .editor-toolbar-btn {
1667
+ display: inline-flex;
1668
+ align-items: center;
1669
+ justify-content: center;
1670
+ min-width: 2rem;
1671
+ height: 2rem;
1672
+ margin: 0;
1673
+ padding: 0 0.35rem;
1674
+ border: 0;
1675
+ border-radius: 0;
1676
+ background: transparent;
1677
+ cursor: pointer;
1678
+ color: var(--on-surface);
1679
+ font: inherit;
1680
+ font-size: 0.82rem;
1681
+ font-weight: 600;
1682
+ }
1683
+
1684
+ .editor-toolbar-btn:hover {
1685
+ background: var(--surface-high);
1686
+ }
1687
+
1688
+ .editor-toolbar-btn .material-symbols-outlined {
1689
+ font-size: 1.15rem;
1690
+ line-height: 1;
1691
+ font-variation-settings: "FILL" 0, "wght" 500, "GRAD" 0, "opsz" 24;
1692
+ }
1693
+
1694
+ .editor-toolbar-sep {
1695
+ width: 1px;
1696
+ align-self: stretch;
1697
+ margin: 0.2rem 0.3rem;
1698
+ background: color-mix(in srgb, var(--outline-variant) 70%, transparent);
1699
+ }
1700
+
1701
+ .editor-toolbar-select {
1702
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1703
+ background: var(--background);
1704
+ padding: 0.25rem 0.4rem;
1705
+ font-size: 0.82rem;
1706
+ max-width: 8.5rem;
1707
+ }
1708
+
1709
+ .editor-pane-fill {
1710
+ position: relative;
1711
+ flex: 1 1 auto;
1712
+ min-height: 0;
1713
+ display: flex;
1714
+ flex-direction: column;
1715
+ overflow: hidden;
1716
+ }
1717
+
1718
+ .editor-surface {
1719
+ flex: 1 1 auto;
1720
+ width: 100%;
1721
+ min-height: 0;
1722
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1723
+ background: var(--background);
1724
+ overflow: auto;
1725
+ }
1726
+
1727
+ .tiptap.editor-surface {
1728
+ padding: 0.85rem;
1729
+ }
1730
+
1731
+ .tiptap .ProseMirror {
1732
+ outline: none;
1733
+ min-height: 12rem;
1734
+ }
1735
+
1736
+ .tiptap .ProseMirror p {
1737
+ margin: 0.4rem 0;
1738
+ }
1739
+
1740
+ textarea.body-source.editor-surface {
1741
+ display: block;
1742
+ resize: none;
1743
+ padding: 0.85rem;
1744
+ font-family: var(--font-mono);
1745
+ font-size: 0.8759rem;
1746
+ line-height: 1.5;
1747
+ color: inherit;
1748
+ box-sizing: border-box;
1749
+ min-height: 0;
1750
+ flex: 1 1 auto;
1751
+ width: 100%;
1752
+ overflow: auto;
1753
+ }
1754
+
1755
+ .editor-surface[hidden] {
1756
+ display: none !important;
1757
+ }
1758
+
1759
+ .liquid-block {
1760
+ border: 1px dashed color-mix(in srgb, var(--outline) 50%, transparent);
1761
+ background: var(--panel);
1762
+ padding: 0.5rem 0.65rem;
1763
+ margin: 0.5rem 0;
1764
+ font-family: var(--font-mono);
1765
+ font-size: 0.86rem;
1766
+ }
1767
+
1768
+ .liquid-block--inline {
1769
+ display: inline;
1770
+ margin: 0;
1771
+ padding: 0.05rem 0.35rem;
1772
+ white-space: normal;
1773
+ }
1774
+
1775
+ .liquid-block strong {
1776
+ font-family: var(--font-body);
1777
+ text-transform: uppercase;
1778
+ letter-spacing: 0.05em;
1779
+ font-size: 0.78rem;
1780
+ color: var(--on-surface-variant);
1781
+ }
1782
+
1783
+ .preview-frame {
1784
+ background: var(--background);
1785
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1786
+ padding: 1rem;
1787
+ min-height: 12rem;
1788
+ flex: 1;
1789
+ overflow: auto;
1790
+ font-family: var(--font-body);
1791
+ font-size: 0.95rem;
1792
+ line-height: 1.6;
1793
+ color: var(--on-surface);
1794
+ }
1795
+
1796
+ .preview-frame figure {
1797
+ margin: 1rem auto;
1798
+ text-align: center;
1799
+ }
1800
+
1801
+ .preview-frame img,
1802
+ .preview-frame video,
1803
+ .preview-frame iframe {
1804
+ max-width: 100%;
1805
+ }
1806
+
1807
+ .preview-frame .studio-embed-placeholder {
1808
+ width: 100%;
1809
+ }
1810
+
1811
+ .preview-frame .studio-embed-placeholder__box {
1812
+ display: flex;
1813
+ align-items: center;
1814
+ justify-content: center;
1815
+ box-sizing: border-box;
1816
+ width: 100%;
1817
+ min-height: inherit;
1818
+ height: 100%;
1819
+ padding: 1rem 1.1rem;
1820
+ border: 1px dashed color-mix(in srgb, var(--outline) 55%, transparent);
1821
+ background: color-mix(in srgb, var(--surface-high) 88%, transparent);
1822
+ color: var(--on-surface-variant);
1823
+ }
1824
+
1825
+ .preview-frame .studio-embed-placeholder__label {
1826
+ font-family: var(--font-mono);
1827
+ font-size: 0.8759rem;
1828
+ line-height: 1.35;
1829
+ word-break: break-word;
1830
+ background: transparent;
1831
+ border: 0;
1832
+ padding: 0;
1833
+ }
1834
+
1835
+ .preview-frame .studio-mermaid,
1836
+ .preview-frame .mermaid {
1837
+ margin: 1rem 0;
1838
+ overflow-x: auto;
1839
+ }
1840
+
1841
+ .preview-frame .studio-mermaid-fallback {
1842
+ margin: 1rem 0;
1843
+ }
1844
+
1845
+ .preview-frame .studio-mermaid-fallback__pre {
1846
+ margin: 0;
1847
+ white-space: pre-wrap;
1848
+ word-break: break-word;
1849
+ font-family: var(--font-mono);
1850
+ font-size: 0.8019rem;
1851
+ padding: 0.65rem 0.75rem;
1852
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1853
+ background: color-mix(in srgb, var(--surface-high) 90%, transparent);
1854
+ color: var(--on-surface-variant);
1855
+ }
1856
+
1857
+ /* Side-preview code only: −2pt vs inherited preview body size. */
1858
+ .preview-frame pre,
1859
+ .preview-frame pre code,
1860
+ .preview-frame :not(pre) > code {
1861
+ font-size: 0.8019rem;
1862
+ }
1863
+
1864
+ .preview-frame pre {
1865
+ overflow-x: auto;
1866
+ padding: 0.65rem 0.75rem;
1867
+ background: color-mix(in srgb, var(--surface-high) 90%, transparent);
1868
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1869
+ }
1870
+
1871
+ .preview-frame pre code {
1872
+ font-size: inherit;
1873
+ background: transparent;
1874
+ border: 0;
1875
+ padding: 0;
1876
+ }
1877
+
1878
+ .preview-frame :not(pre) > code {
1879
+ font-family: var(--font-mono);
1880
+ padding: 0.05em 0.3em;
1881
+ background: color-mix(in srgb, var(--surface-high) 90%, transparent);
1882
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent);
1883
+ }
1884
+
1885
+ /* Shared pill shell for cite / xcite / latex — one box, variants only recolor. */
1886
+ .preview-frame .studio-ref-pill {
1887
+ display: inline-flex;
1888
+ align-items: center;
1889
+ vertical-align: middle;
1890
+ max-width: 100%;
1891
+ margin: 0 0.12em;
1892
+ padding: 0.05em 0.4em;
1893
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
1894
+ border-radius: 0;
1895
+ background: color-mix(in srgb, var(--surface-high) 85%, transparent);
1896
+ color: var(--on-surface-variant);
1897
+ font-family: var(--font-mono);
1898
+ font-size: 0.85em;
1899
+ line-height: 1.2;
1900
+ white-space: nowrap;
1901
+ box-sizing: border-box;
1902
+ transition: color 120ms ease, background 120ms ease, border-color 120ms ease;
1903
+ }
1904
+
1905
+ .preview-frame .studio-ref-pill--ok {
1906
+ color: color-mix(in srgb, #1b6b3a 88%, var(--on-surface));
1907
+ background: color-mix(in srgb, #1b6b3a 14%, transparent);
1908
+ border-color: color-mix(in srgb, #1b6b3a 40%, transparent);
1909
+ }
1910
+
1911
+ .preview-frame .studio-ref-pill--missing {
1912
+ color: color-mix(in srgb, #a12828 90%, var(--on-surface));
1913
+ background: color-mix(in srgb, #a12828 14%, transparent);
1914
+ border-color: color-mix(in srgb, #a12828 40%, transparent);
1915
+ }
1916
+
1917
+ .preview-frame .studio-ref-pill--latex {
1918
+ color: var(--on-surface);
1919
+ background: color-mix(in srgb, var(--surface-high) 90%, transparent);
1920
+ border-color: color-mix(in srgb, var(--outline-variant) 65%, transparent);
1921
+ white-space: pre-wrap;
1922
+ word-break: break-word;
1923
+ }
1924
+
1925
+ .preview-frame .studio-ref-pill--display {
1926
+ display: flex;
1927
+ margin: 0.75rem auto;
1928
+ padding: 0.55rem 0.75rem;
1929
+ overflow-x: auto;
1930
+ white-space: pre-wrap;
1931
+ word-break: break-word;
1932
+ }
1933
+
1934
+ .preview-frame .article-note {
1935
+ background: color-mix(in srgb, var(--surface-high) 88%, transparent);
1936
+ border-left: 3px solid color-mix(in srgb, var(--outline-variant) 80%, transparent);
1937
+ padding: 0.85rem 1.1rem;
1938
+ margin: 1.1rem 0;
1939
+ font-size: 0.9em;
1940
+ }
1941
+
1942
+ .preview-frame .article-note > :first-child {
1943
+ margin-top: 0;
1944
+ }
1945
+
1946
+ .preview-frame .article-note > :last-child {
1947
+ margin-bottom: 0;
1948
+ }
1949
+
1950
+ .preview-frame :is(.sov-tweet, .article-tweet) {
1951
+ max-width: 34rem;
1952
+ margin: 1rem 0 1.25rem;
1953
+ padding: 0.85rem 1rem;
1954
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
1955
+ background: color-mix(in srgb, var(--surface-high) 70%, transparent);
1956
+ }
1957
+
1958
+ .preview-frame :is(.sov-tweet, .article-tweet) p {
1959
+ margin: 0;
1960
+ }
1961
+
1962
+ .preview-frame :is(.sov-tweet__head, .article-tweet__head) {
1963
+ display: flex;
1964
+ align-items: center;
1965
+ gap: 0.5rem;
1966
+ margin-bottom: 0.7rem;
1967
+ }
1968
+
1969
+ .preview-frame :is(.sov-tweet__avatar, .article-tweet__avatar) {
1970
+ width: 2rem;
1971
+ height: 2rem;
1972
+ display: inline-flex;
1973
+ align-items: center;
1974
+ justify-content: center;
1975
+ background: color-mix(in srgb, var(--outline-variant) 35%, transparent);
1976
+ font-size: 1.1rem;
1977
+ }
1978
+
1979
+ .preview-frame :is(.sov-tweet__id, .article-tweet__id) {
1980
+ display: flex;
1981
+ flex-direction: column;
1982
+ line-height: 1.2;
1983
+ }
1984
+
1985
+ .preview-frame :is(.sov-tweet__name, .article-tweet__name) {
1986
+ font-weight: 700;
1987
+ font-size: 0.92rem;
1988
+ }
1989
+
1990
+ .preview-frame :is(.sov-tweet__handle, .article-tweet__handle) {
1991
+ font-size: 0.8rem;
1992
+ opacity: 0.75;
1993
+ }
1994
+
1995
+ .preview-frame :is(.sov-tweet__body, .article-tweet__body) {
1996
+ margin: 0 0 0.45rem !important;
1997
+ line-height: 1.55;
1998
+ }
1999
+
2000
+ .preview-frame :is(.sov-tweet__cite, .article-tweet__cite) {
2001
+ margin: 0 0 0.45rem !important;
2002
+ font-size: 0.8rem;
2003
+ opacity: 0.8;
2004
+ }
2005
+
2006
+ .preview-frame :is(.sov-tweet__note, .article-tweet__note) {
2007
+ margin: 0 !important;
2008
+ font-size: 0.85rem;
2009
+ opacity: 0.9;
2010
+ }
2011
+
2012
+ .preview-frame .studio-unknown-include {
2013
+ display: none;
2014
+ }
2015
+
2016
+ /* GFM tables in side preview — gentle structure, preview-scoped only. */
2017
+ .preview-frame table {
2018
+ width: 100%;
2019
+ border-collapse: collapse;
2020
+ margin: 1rem 0 1.25rem;
2021
+ font-size: 0.9em;
2022
+ line-height: 1.45;
2023
+ overflow-x: auto;
2024
+ display: block;
2025
+ max-width: 100%;
2026
+ }
2027
+
2028
+ .preview-frame thead,
2029
+ .preview-frame tbody,
2030
+ .preview-frame tr {
2031
+ display: table;
2032
+ width: 100%;
2033
+ table-layout: auto;
2034
+ }
2035
+
2036
+ .preview-frame th,
2037
+ .preview-frame td {
2038
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 70%, transparent);
2039
+ padding: 0.4rem 0.55rem;
2040
+ text-align: left;
2041
+ vertical-align: top;
2042
+ }
2043
+
2044
+ .preview-frame th {
2045
+ font-weight: 600;
2046
+ background: color-mix(in srgb, var(--surface-high) 88%, transparent);
2047
+ }
2048
+
2049
+ .preview-frame .sov-grid {
2050
+ display: grid;
2051
+ grid-template-columns: 1fr;
2052
+ gap: 0.85rem;
2053
+ margin: 1rem 0 1.35rem;
2054
+ }
2055
+
2056
+ @media (min-width: 720px) {
2057
+ .preview-frame .sov-grid {
2058
+ grid-template-columns: 1fr 1fr;
2059
+ }
2060
+ }
2061
+
2062
+ .preview-frame .sov-card {
2063
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2064
+ border-left: 3px solid var(--sov-accent, var(--primary));
2065
+ background: color-mix(in srgb, var(--surface-high) 70%, transparent);
2066
+ padding: 0.65rem 0.8rem 0.75rem;
2067
+ display: flex;
2068
+ flex-direction: column;
2069
+ gap: 0.45rem;
2070
+ min-width: 0;
2071
+ }
2072
+
2073
+ .preview-frame .sov-card p {
2074
+ margin: 0;
2075
+ }
2076
+
2077
+ .preview-frame .sov-card__head {
2078
+ display: flex;
2079
+ align-items: center;
2080
+ gap: 0.5rem;
2081
+ flex-wrap: wrap;
2082
+ }
2083
+
2084
+ .preview-frame .sov-card__flag {
2085
+ display: inline-flex;
2086
+ align-items: center;
2087
+ justify-content: center;
2088
+ height: 1.5rem;
2089
+ padding: 0 0.35rem;
2090
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 65%, transparent);
2091
+ line-height: 1;
2092
+ }
2093
+
2094
+ .preview-frame .sov-card__flag .fi {
2095
+ font-size: 1rem;
2096
+ }
2097
+
2098
+ .preview-frame .sov-card__meta {
2099
+ font-size: 0.72rem;
2100
+ letter-spacing: 0.04em;
2101
+ text-transform: uppercase;
2102
+ opacity: 0.8;
2103
+ font-weight: 600;
2104
+ }
2105
+
2106
+ .preview-frame .sov-card__lemma {
2107
+ font-style: italic;
2108
+ font-size: 1.02rem;
2109
+ color: var(--on-surface);
2110
+ }
2111
+
2112
+ .preview-frame .sov-card__def {
2113
+ margin: 0;
2114
+ padding: 0.45rem 0.6rem;
2115
+ border-left: 2px solid color-mix(in srgb, var(--sov-accent, var(--primary)) 55%, transparent);
2116
+ background: color-mix(in srgb, var(--sov-accent, var(--primary)) 8%, transparent);
2117
+ font-size: 0.86rem;
2118
+ line-height: 1.6;
2119
+ }
2120
+
2121
+ .preview-frame .sov-card__note {
2122
+ font-size: 0.82rem;
2123
+ line-height: 1.5;
2124
+ opacity: 0.9;
2125
+ }
2126
+
2127
+ .preview-frame .sov-card__cite {
2128
+ font-size: 0.76rem;
2129
+ line-height: 1.45;
2130
+ opacity: 0.75;
2131
+ }
2132
+
2133
+ .preview-frame .sov-card__cite a {
2134
+ color: inherit;
2135
+ text-decoration: underline;
2136
+ text-underline-offset: 2px;
2137
+ }
2138
+
2139
+ .preview-frame .sov-card--us {
2140
+ --sov-accent: #003494;
2141
+ }
2142
+
2143
+ .preview-frame .sov-card--gb {
2144
+ --sov-accent: #797300;
2145
+ }
2146
+
2147
+ .preview-frame .sov-card--br {
2148
+ --sov-accent: #118826;
2149
+ }
2150
+
2151
+ .preview-frame .sov-card--fr {
2152
+ --sov-accent: #9f020a;
2153
+ }
2154
+
2155
+ /* Preview tab: hidden on wide layouts (side panel is always visible). */
2156
+ .editor-mode-tab--preview {
2157
+ display: none;
2158
+ }
2159
+
2160
+ .auth-gate {
2161
+ max-width: 28rem;
2162
+ margin: 4rem auto;
2163
+ padding: 1.5rem;
2164
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2165
+ background: var(--background);
2166
+ }
2167
+
2168
+ .auth-gate h1 {
2169
+ font-family: var(--font-display);
2170
+ font-size: 1.6rem;
2171
+ margin: 0 0 0.5rem;
2172
+ }
2173
+
2174
+ .auth-gate--pending .pending-copy {
2175
+ font-family: var(--font-body);
2176
+ line-height: 1.55;
2177
+ color: var(--on-surface);
2178
+ margin: 0 0 1rem;
2179
+ }
2180
+
2181
+ .auth-gate--pending .pending-copy strong {
2182
+ font-weight: 600;
2183
+ }
2184
+
2185
+ .auth-gate--pending .pending-signoff {
2186
+ font-family: var(--font-body);
2187
+ margin: 0 0 1.25rem;
2188
+ color: var(--on-surface-variant);
2189
+ }
2190
+
2191
+ .status-pill {
2192
+ font-family: var(--font-mono);
2193
+ font-size: var(--studio-type-meta);
2194
+ color: var(--on-surface-variant);
2195
+ }
2196
+
2197
+ .status-pill.error {
2198
+ color: var(--error);
2199
+ }
2200
+
2201
+ .studio-error-banner {
2202
+ display: flex;
2203
+ flex-direction: column;
2204
+ align-items: flex-start;
2205
+ gap: 0.55rem;
2206
+ padding: 0.75rem var(--studio-space-md);
2207
+ border-bottom: 1px solid color-mix(in srgb, var(--error) 45%, transparent);
2208
+ background: color-mix(in srgb, var(--error) 8%, var(--background));
2209
+ }
2210
+
2211
+ .studio-error-message {
2212
+ margin: 0;
2213
+ color: var(--on-surface);
2214
+ font-size: var(--studio-type-body);
2215
+ line-height: 1.45;
2216
+ white-space: normal;
2217
+ overflow-wrap: anywhere;
2218
+ }
2219
+
2220
+ .studio-error-actions {
2221
+ display: flex;
2222
+ flex-wrap: wrap;
2223
+ gap: 0.45rem;
2224
+ }
2225
+
2226
+ @media (max-width: 719px) {
2227
+ /* Writing lists: status | title | meta as three stacked lines. */
2228
+ .ledger-row--writing .ledger-title-row {
2229
+ flex-direction: column;
2230
+ align-items: flex-start;
2231
+ gap: 0.2rem;
2232
+ }
2233
+
2234
+ .ledger-row--writing .ledger-status {
2235
+ width: auto;
2236
+ flex: 0 0 auto;
2237
+ }
2238
+
2239
+ .ledger-row--writing .ledger-taxonomy {
2240
+ display: flex;
2241
+ grid-column: 2 / -1;
2242
+ }
2243
+
2244
+ .ledger-row--writing .ledger-ops {
2245
+ display: inline-flex;
2246
+ grid-column: 1 / -1;
2247
+ justify-content: flex-end;
2248
+ padding-top: 0.45rem;
2249
+ margin-top: 0.15rem;
2250
+ border-top: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent);
2251
+ }
2252
+ }
2253
+
2254
+ @media (max-width: 960px) {
2255
+ .studio-shell {
2256
+ grid-template-columns: 1fr;
2257
+ height: auto;
2258
+ min-height: 100vh;
2259
+ }
2260
+
2261
+ .ledger-row {
2262
+ align-items: start;
2263
+ }
2264
+
2265
+ .studio-nav {
2266
+ border-right: 0;
2267
+ border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2268
+ overflow: visible;
2269
+ gap: 0.35rem;
2270
+ padding: 0.65rem 0.75rem;
2271
+ }
2272
+
2273
+ .studio-nav-bar {
2274
+ flex-direction: row;
2275
+ align-items: center;
2276
+ gap: 0.5rem;
2277
+ }
2278
+
2279
+ .studio-nav-bar .studio-brand {
2280
+ flex: 0 0 auto;
2281
+ width: auto;
2282
+ padding: 0.2rem 0.35rem;
2283
+ border-bottom: 0;
2284
+ }
2285
+
2286
+ button.studio-brand-home {
2287
+ width: auto;
2288
+ }
2289
+
2290
+ .studio-nav-menu-toggle {
2291
+ display: inline-flex;
2292
+ flex: 1 1 auto;
2293
+ min-width: 0;
2294
+ }
2295
+
2296
+ .studio-nav-panel {
2297
+ display: none;
2298
+ margin-top: 0.35rem;
2299
+ padding-top: 0.35rem;
2300
+ border-top: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2301
+ max-height: min(70vh, 28rem);
2302
+ overflow: auto;
2303
+ }
2304
+
2305
+ .studio-nav.is-open .studio-nav-panel {
2306
+ display: flex;
2307
+ }
2308
+
2309
+ .studio-main {
2310
+ height: auto;
2311
+ overflow: visible;
2312
+ }
2313
+
2314
+ .studio-body {
2315
+ grid-template-columns: 1fr;
2316
+ height: auto;
2317
+ overflow: visible;
2318
+ }
2319
+
2320
+ /* Third tab: Visual | Source | Preview — one pane at a time. */
2321
+ .editor-mode-tab--preview {
2322
+ display: inline-flex;
2323
+ }
2324
+
2325
+ .studio-body.view-preview .pane-editor > .btn,
2326
+ .studio-body.view-preview .pane-editor .editor-mast,
2327
+ .studio-body.view-preview .pane-editor .front-matter,
2328
+ .studio-body.view-preview .pane-editor .form-grid,
2329
+ .studio-body.view-preview .pane-editor .editor-pane-fill,
2330
+ .studio-body.view-preview .pane-editor .editor-format-toolbar,
2331
+ .studio-body.view-preview .pane-editor .editor-chrome-row > :not(.editor-mode-tabs),
2332
+ .studio-body.view-preview .pane-editor .body-editor-stack > label {
2333
+ display: none;
2334
+ }
2335
+
2336
+ .studio-body.view-preview .pane-editor {
2337
+ padding-bottom: 0.35rem;
2338
+ overflow: visible;
2339
+ flex: 0 0 auto;
2340
+ }
2341
+
2342
+ .studio-body.view-preview .pane-editor .editor-chrome {
2343
+ margin-bottom: 0;
2344
+ }
2345
+
2346
+ .studio-body:not(.view-preview) .pane-preview {
2347
+ display: none;
2348
+ }
2349
+
2350
+ .studio-body.view-preview .pane-preview {
2351
+ display: flex;
2352
+ border-left: 0;
2353
+ border-top: 0;
2354
+ flex: 1 1 auto;
2355
+ }
2356
+
2357
+ .pane-preview {
2358
+ border-left: 0;
2359
+ border-top: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2360
+ }
2361
+ }
2362
+
2363
+ /* —— YAML editor (dedicated; not TipTap) —— */
2364
+ .pane-yaml .yaml-editor-header {
2365
+ margin: 0.65rem 0 0.35rem;
2366
+ }
2367
+
2368
+ .yaml-editor-title {
2369
+ margin: 0;
2370
+ font-family: var(--font-display);
2371
+ font-size: 1.35rem;
2372
+ font-weight: 500;
2373
+ color: var(--on-surface);
2374
+ }
2375
+
2376
+ .yaml-editor-path {
2377
+ margin: 0.2rem 0 0;
2378
+ font-size: 0.82rem;
2379
+ color: var(--on-surface-variant);
2380
+ word-break: break-word;
2381
+ }
2382
+
2383
+ .yaml-chrome {
2384
+ margin-bottom: 0.65rem;
2385
+ }
2386
+
2387
+ .yaml-chrome-hint {
2388
+ margin: 0.45rem 0 0;
2389
+ font-size: 0.82rem;
2390
+ color: var(--on-surface-variant);
2391
+ }
2392
+
2393
+ .yaml-editor-body {
2394
+ display: flex;
2395
+ flex-direction: column;
2396
+ gap: 0.85rem;
2397
+ flex: 1 1 auto;
2398
+ min-height: 0;
2399
+ }
2400
+
2401
+ .yaml-list,
2402
+ .yaml-object-list {
2403
+ display: flex;
2404
+ flex-direction: column;
2405
+ gap: 0.85rem;
2406
+ }
2407
+
2408
+ .yaml-list-item {
2409
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 65%, transparent);
2410
+ background: var(--panel);
2411
+ padding: 0.75rem 0.85rem;
2412
+ }
2413
+
2414
+ .yaml-list-item-head {
2415
+ display: flex;
2416
+ align-items: center;
2417
+ justify-content: space-between;
2418
+ gap: 0.75rem;
2419
+ margin-bottom: 0.65rem;
2420
+ }
2421
+
2422
+ .yaml-list-item-index {
2423
+ font-size: 0.82rem;
2424
+ text-transform: uppercase;
2425
+ letter-spacing: 0.06em;
2426
+ color: var(--on-surface-variant);
2427
+ min-width: 0;
2428
+ overflow: hidden;
2429
+ text-overflow: ellipsis;
2430
+ white-space: nowrap;
2431
+ }
2432
+
2433
+ .yaml-list-item-actions {
2434
+ display: flex;
2435
+ flex-wrap: wrap;
2436
+ gap: 0.35rem;
2437
+ flex-shrink: 0;
2438
+ }
2439
+
2440
+ .yaml-list-btn {
2441
+ padding: 0.25rem 0.45rem;
2442
+ font-size: 0.78rem;
2443
+ }
2444
+
2445
+ .yaml-list-item-fields {
2446
+ max-width: none;
2447
+ }
2448
+
2449
+ .yaml-empty {
2450
+ margin: 0;
2451
+ color: var(--on-surface-variant);
2452
+ font-size: 0.92rem;
2453
+ }
2454
+
2455
+ .yaml-source-stack {
2456
+ display: flex;
2457
+ flex-direction: column;
2458
+ flex: 1 1 auto;
2459
+ min-height: var(--studio-editor-min-height);
2460
+ }
2461
+
2462
+ textarea.yaml-source.editor-surface {
2463
+ display: block;
2464
+ resize: none;
2465
+ padding: 0.85rem;
2466
+ font-family: var(--font-mono);
2467
+ font-size: 0.95rem;
2468
+ line-height: 1.45;
2469
+ color: inherit;
2470
+ box-sizing: border-box;
2471
+ min-height: var(--studio-editor-min-height);
2472
+ flex: 1 1 auto;
2473
+ width: 100%;
2474
+ overflow: auto;
2475
+ tab-size: 2;
2476
+ }
2477
+
2478
+ .yaml-preview-pre {
2479
+ margin: 0;
2480
+ padding: 0.75rem 0.85rem;
2481
+ font-family: var(--font-mono);
2482
+ font-size: 0.86rem;
2483
+ line-height: 1.45;
2484
+ white-space: pre-wrap;
2485
+ word-break: break-word;
2486
+ background: color-mix(in srgb, var(--surface-high) 70%, transparent);
2487
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2488
+ overflow: auto;
2489
+ }
2490
+
2491
+ .yaml-preview-error {
2492
+ margin: 0;
2493
+ color: var(--error);
2494
+ font-size: 0.9rem;
2495
+ }
2496
+
2497
+ /* —— Media library —— */
2498
+
2499
+ .media-pane {
2500
+ display: flex;
2501
+ flex-direction: column;
2502
+ gap: 0.85rem;
2503
+ padding: 1rem 1.25rem 1.5rem;
2504
+ overflow: auto;
2505
+ min-height: 0;
2506
+ }
2507
+
2508
+ .media-header h1.media-title {
2509
+ margin: 0 0 0.35rem;
2510
+ font-family: var(--font-display);
2511
+ font-size: 1.55rem;
2512
+ font-weight: 600;
2513
+ }
2514
+
2515
+ .media-breadcrumb {
2516
+ display: flex;
2517
+ flex-wrap: wrap;
2518
+ align-items: center;
2519
+ gap: 0.25rem;
2520
+ font-family: var(--font-mono);
2521
+ font-size: 0.82rem;
2522
+ color: var(--on-surface-variant);
2523
+ }
2524
+
2525
+ .media-breadcrumb-sep {
2526
+ opacity: 0.55;
2527
+ }
2528
+
2529
+ .media-breadcrumb-link {
2530
+ margin: 0;
2531
+ padding: 0.1rem 0.25rem;
2532
+ border: 0;
2533
+ border-radius: 0;
2534
+ background: transparent;
2535
+ color: var(--primary);
2536
+ cursor: pointer;
2537
+ font: inherit;
2538
+ }
2539
+
2540
+ .media-breadcrumb-link:hover {
2541
+ background: var(--surface-high);
2542
+ }
2543
+
2544
+ .media-breadcrumb-current {
2545
+ color: var(--on-surface);
2546
+ font-weight: 600;
2547
+ }
2548
+
2549
+ .media-hint {
2550
+ margin: 0.55rem 0 0;
2551
+ color: var(--on-surface-variant);
2552
+ font-size: 0.9rem;
2553
+ max-width: 42rem;
2554
+ }
2555
+
2556
+ .media-toolbar {
2557
+ display: flex;
2558
+ flex-wrap: wrap;
2559
+ align-items: center;
2560
+ gap: 0.55rem;
2561
+ }
2562
+
2563
+ .media-toolbar .spacer {
2564
+ flex: 1;
2565
+ }
2566
+
2567
+ .media-file-input {
2568
+ position: absolute;
2569
+ width: 1px;
2570
+ height: 1px;
2571
+ opacity: 0;
2572
+ pointer-events: none;
2573
+ }
2574
+
2575
+ .media-grid {
2576
+ display: flex;
2577
+ flex-direction: column;
2578
+ gap: 0.35rem;
2579
+ border-top: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2580
+ padding-top: 0.5rem;
2581
+ }
2582
+
2583
+ .media-row {
2584
+ display: grid;
2585
+ grid-template-columns: minmax(0, 1fr) auto;
2586
+ gap: 0.5rem;
2587
+ align-items: center;
2588
+ padding: 0.25rem 0;
2589
+ border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent);
2590
+ }
2591
+
2592
+ .media-row-main {
2593
+ display: flex;
2594
+ align-items: center;
2595
+ gap: 0.75rem;
2596
+ min-width: 0;
2597
+ margin: 0;
2598
+ padding: 0.35rem 0.4rem;
2599
+ border: 0;
2600
+ border-radius: 0;
2601
+ background: transparent;
2602
+ color: inherit;
2603
+ font: inherit;
2604
+ text-align: left;
2605
+ cursor: pointer;
2606
+ }
2607
+
2608
+ .media-row-main:hover {
2609
+ background: var(--surface-high);
2610
+ }
2611
+
2612
+ .media-thumb {
2613
+ width: 52px;
2614
+ height: 52px;
2615
+ flex-shrink: 0;
2616
+ display: grid;
2617
+ place-items: center;
2618
+ background: var(--surface-high);
2619
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 55%, transparent);
2620
+ overflow: hidden;
2621
+ }
2622
+
2623
+ .media-thumb--image {
2624
+ padding: 0;
2625
+ }
2626
+
2627
+ .media-thumb-img {
2628
+ width: 100%;
2629
+ height: 100%;
2630
+ object-fit: cover;
2631
+ display: block;
2632
+ }
2633
+
2634
+ .media-thumb-icon {
2635
+ font-size: 1.45rem;
2636
+ color: var(--on-surface-variant);
2637
+ }
2638
+
2639
+ .media-row-body {
2640
+ display: flex;
2641
+ flex-direction: column;
2642
+ gap: 0.15rem;
2643
+ min-width: 0;
2644
+ }
2645
+
2646
+ .media-row-name {
2647
+ font-weight: 600;
2648
+ overflow: hidden;
2649
+ text-overflow: ellipsis;
2650
+ white-space: nowrap;
2651
+ }
2652
+
2653
+ .media-row-meta {
2654
+ font-family: var(--font-mono);
2655
+ font-size: 0.78rem;
2656
+ color: var(--on-surface-variant);
2657
+ overflow: hidden;
2658
+ text-overflow: ellipsis;
2659
+ white-space: nowrap;
2660
+ }
2661
+
2662
+ .media-copy-btn {
2663
+ flex-shrink: 0;
2664
+ white-space: nowrap;
2665
+ }
2666
+
2667
+ .media-row-main--preview {
2668
+ cursor: zoom-in;
2669
+ }
2670
+
2671
+ .media-row-main--preview:focus-visible {
2672
+ outline: 2px solid var(--primary);
2673
+ outline-offset: 3px;
2674
+ }
2675
+
2676
+ /* Same overlay as the public figure lightbox (`assets/css/article.css`).
2677
+ Studio does not load that sheet, so the chrome is repeated here with
2678
+ Studio tokens. Video and HTML use the same plate. */
2679
+ html.figure-lightbox-open,
2680
+ body.figure-lightbox-open {
2681
+ overflow: hidden;
2682
+ }
2683
+
2684
+ .figure-lightbox {
2685
+ --motion-duration-fast: 0.15s;
2686
+ --motion-ease-out: ease-out;
2687
+ --motion-ease-default: ease;
2688
+ position: fixed;
2689
+ inset: 0;
2690
+ z-index: 80;
2691
+ display: flex;
2692
+ align-items: center;
2693
+ justify-content: center;
2694
+ padding: 1.25rem;
2695
+ box-sizing: border-box;
2696
+ }
2697
+
2698
+ .figure-lightbox[hidden] {
2699
+ display: none;
2700
+ }
2701
+
2702
+ .figure-lightbox [hidden] {
2703
+ display: none !important;
2704
+ }
2705
+
2706
+ .figure-lightbox-backdrop {
2707
+ position: absolute;
2708
+ inset: 0;
2709
+ background: rgba(0, 0, 0, 0.85);
2710
+ cursor: zoom-out;
2711
+ animation: figure-lightbox-fade-in var(--motion-duration-fast) var(--motion-ease-out);
2712
+ }
2713
+
2714
+ .figure-lightbox-panel {
2715
+ position: relative;
2716
+ z-index: 1;
2717
+ display: flex;
2718
+ flex-direction: column;
2719
+ align-items: center;
2720
+ max-width: min(92vw, 72rem);
2721
+ max-height: 92vh;
2722
+ animation: figure-lightbox-scale-in var(--motion-duration-fast) var(--motion-ease-out);
2723
+ }
2724
+
2725
+ .figure-lightbox-img,
2726
+ .figure-lightbox-video {
2727
+ display: block;
2728
+ max-width: 92vw;
2729
+ max-height: 85vh;
2730
+ width: auto;
2731
+ height: auto;
2732
+ object-fit: contain;
2733
+ background: var(--background);
2734
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 40%, transparent);
2735
+ border-radius: 0;
2736
+ }
2737
+
2738
+ .figure-lightbox-video {
2739
+ background: #000;
2740
+ }
2741
+
2742
+ .figure-lightbox-frame {
2743
+ display: block;
2744
+ width: min(92vw, 72rem);
2745
+ height: min(78vh, 52rem);
2746
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 40%, transparent);
2747
+ border-radius: 0;
2748
+ background: var(--background);
2749
+ }
2750
+
2751
+ .figure-lightbox-caption {
2752
+ margin: 0.75rem 0 0;
2753
+ max-width: min(40rem, 90vw);
2754
+ font-family: var(--font-body);
2755
+ font-size: 0.95rem;
2756
+ line-height: 1.45;
2757
+ text-align: center;
2758
+ color: rgba(255, 255, 255, 0.92);
2759
+ }
2760
+
2761
+ .figure-lightbox-close {
2762
+ position: fixed;
2763
+ top: 1rem;
2764
+ right: 1rem;
2765
+ z-index: 2;
2766
+ display: inline-flex;
2767
+ align-items: center;
2768
+ justify-content: center;
2769
+ width: 2.75rem;
2770
+ height: 2.75rem;
2771
+ padding: 0;
2772
+ border: 1px solid color-mix(in srgb, var(--outline-variant) 50%, transparent);
2773
+ border-radius: 0;
2774
+ background: var(--background);
2775
+ color: var(--on-surface);
2776
+ cursor: pointer;
2777
+ transition: color var(--motion-duration-fast) var(--motion-ease-default),
2778
+ background-color var(--motion-duration-fast) var(--motion-ease-default);
2779
+ }
2780
+
2781
+ .figure-lightbox-close:hover,
2782
+ .figure-lightbox-close:focus-visible {
2783
+ color: var(--primary);
2784
+ background: var(--surface-high);
2785
+ outline: none;
2786
+ }
2787
+
2788
+ .figure-lightbox-close:focus-visible {
2789
+ outline: 2px solid var(--primary);
2790
+ outline-offset: 2px;
2791
+ }
2792
+
2793
+ .figure-lightbox-close .material-symbols-outlined {
2794
+ font-size: 1.5rem;
2795
+ line-height: 1;
2796
+ }
2797
+
2798
+ @keyframes figure-lightbox-fade-in {
2799
+ from {
2800
+ opacity: 0;
2801
+ }
2802
+
2803
+ to {
2804
+ opacity: 1;
2805
+ }
2806
+ }
2807
+
2808
+ @keyframes figure-lightbox-scale-in {
2809
+ from {
2810
+ opacity: 0;
2811
+ transform: scale(0.97);
2812
+ }
2813
+
2814
+ to {
2815
+ opacity: 1;
2816
+ transform: scale(1);
2817
+ }
2818
+ }
2819
+
2820
+ @media (prefers-reduced-motion: reduce) {
2821
+ .figure-lightbox-backdrop,
2822
+ .figure-lightbox-panel {
2823
+ animation: none;
2824
+ }
2825
+ }
2826
+