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,200 @@
1
+ # Studio fragment for the CV template (jobs, products, profile data).
2
+ # Refs: PLT-AC-3, docs/spec.md §5.5
3
+ group: curriculum
4
+ group_label: Curriculum
5
+ needs_media: false
6
+ collections:
7
+ jobs:
8
+ label: Jobs
9
+ type: collection
10
+ format: yaml-frontmatter
11
+ filename: "{primary}.md"
12
+ operations:
13
+ delete: false
14
+ view:
15
+ primary: position
16
+ fields: [company, position, department, engagement, start, end]
17
+ list_meta_fields: [company, engagement, start, end]
18
+ fields:
19
+ - name: position
20
+ label: Position
21
+ type: string
22
+ required: true
23
+ - name: company
24
+ label: Company
25
+ type: string
26
+ required: true
27
+ - name: location
28
+ label: Location
29
+ type: string
30
+ - name: start
31
+ label: Start
32
+ type: string
33
+ - name: end
34
+ label: End
35
+ type: string
36
+ - name: department
37
+ label: Department
38
+ type: string
39
+ - name: engagement
40
+ label: Engagement
41
+ type: select
42
+ required: true
43
+ options:
44
+ values: [permanent, fixed_term, founding, internship, research]
45
+ - name: products
46
+ label: Products
47
+ type: reference
48
+ description: "Products listed under this job."
49
+ options:
50
+ collection: products
51
+ multiple: true
52
+ search: "product,title,company"
53
+ value: "{primary}"
54
+ label: "{product} ({company})"
55
+ - name: body_public
56
+ component: markdown_body
57
+ label: Public body
58
+ description: "The only body that reaches the public CV page."
59
+ - name: body_extended
60
+ component: markdown_body
61
+ label: Extended body
62
+ description: "Extended CV only; not exported to the public site."
63
+ products:
64
+ label: Products
65
+ type: collection
66
+ format: yaml-frontmatter
67
+ filename: "{key}.md"
68
+ operations:
69
+ delete: false
70
+ view:
71
+ primary: product
72
+ fields: [company, product, start_date, end_date, key]
73
+ list_meta_fields: [company, start_date, end_date]
74
+ fields:
75
+ - name: layout
76
+ label: Layout
77
+ type: string
78
+ hidden: true
79
+ default: product
80
+ - name: key
81
+ label: Key
82
+ type: string
83
+ required: true
84
+ description: "URL slug (/products/key/) and citation handle."
85
+ - name: title
86
+ label: Title
87
+ type: string
88
+ required: true
89
+ - name: product
90
+ label: Product name
91
+ type: string
92
+ required: true
93
+ - name: company
94
+ label: Company
95
+ type: string
96
+ required: true
97
+ - name: start_date
98
+ label: Start date
99
+ type: string
100
+ - name: end_date
101
+ label: End date
102
+ type: string
103
+ - name: external_url
104
+ label: External URL
105
+ type: string
106
+ - name: redirects
107
+ label: Redirects
108
+ type: string
109
+ list: true
110
+ - name: body
111
+ component: markdown_body
112
+ profile:
113
+ group: profile
114
+ group_label: Profile
115
+ files:
116
+ - name: contacts
117
+ label: Contact
118
+ type: file
119
+ path: content/collections/data/contacts.yml
120
+ format: yaml
121
+ list: true
122
+ fields:
123
+ - name: name
124
+ label: Name
125
+ type: string
126
+ required: true
127
+ - name: badge
128
+ label: Badge
129
+ type: string
130
+ - name: href
131
+ label: Link
132
+ type: string
133
+ required: true
134
+ description: "Full URL, or mailto:… for an address."
135
+ - name: icon
136
+ label: Icon
137
+ type: string
138
+ - name: education
139
+ label: Education
140
+ type: file
141
+ path: content/collections/data/education.yml
142
+ format: yaml
143
+ list: true
144
+ fields:
145
+ - name: degree
146
+ label: Degree
147
+ type: string
148
+ required: true
149
+ - name: institution
150
+ label: Institution
151
+ type: string
152
+ required: true
153
+ - name: location
154
+ label: Location
155
+ type: string
156
+ - name: start
157
+ label: Start
158
+ type: string
159
+ - name: end
160
+ label: End
161
+ type: string
162
+ - name: detail
163
+ label: Detail
164
+ type: text
165
+ - name: languages
166
+ label: Languages
167
+ type: file
168
+ path: content/collections/data/languages.yml
169
+ format: yaml
170
+ list: true
171
+ fields:
172
+ - name: name
173
+ label: Name
174
+ type: string
175
+ required: true
176
+ - name: level
177
+ label: Level
178
+ type: string
179
+ - name: skills
180
+ label: Skills
181
+ type: file
182
+ path: content/collections/data/skills.yml
183
+ format: yaml
184
+ fields:
185
+ - name: leadership
186
+ label: Leadership
187
+ type: string
188
+ list: true
189
+ - name: technical
190
+ label: Technical
191
+ type: object
192
+ list: true
193
+ fields:
194
+ - name: group
195
+ label: Group
196
+ type: string
197
+ - name: skills
198
+ label: Skills
199
+ type: string
200
+ list: true
@@ -0,0 +1,25 @@
1
+ name: cv
2
+ collection_slots:
3
+ - name: jobs
4
+ required: true
5
+ contract: job
6
+ - name: products
7
+ required: true
8
+ contract: product
9
+ - name: profile
10
+ required: false
11
+ contract: data
12
+ nav:
13
+ group: Profile
14
+ home:
15
+ band: hero
16
+ export_fields:
17
+ - title
18
+ - key
19
+ - company
20
+ - role
21
+ - start
22
+ - end
23
+ - location
24
+ - summary
25
+ - body_public
@@ -0,0 +1,38 @@
1
+ # Template: media
2
+
3
+ Catalogue of external sources and media links (the site label is often
4
+ Sources). One collection of resource entries; detail is query-based
5
+ (`?resource=`).
6
+
7
+ ## Required registry keys
8
+
9
+ | Key | Role |
10
+ |---|---|
11
+ | `key` | Page id |
12
+ | `template` | Must be `media` |
13
+ | `collection` | Resources folder under `content/collections/` |
14
+ | `path` | Listing URL |
15
+
16
+ Optional: `title`, `nav`, `home` (default is a references index panel).
17
+
18
+ ## Collection contract
19
+
20
+ `title`, `key`, `link`, `medium`, `category`, optional body.
21
+
22
+ ## Configuration
23
+
24
+ ```yaml
25
+ - key: resources
26
+ template: media
27
+ title: Sources
28
+ collection: resources
29
+ path: /pages/sources/
30
+ nav: { group: References, icon: media_link }
31
+ home: { band: index, group: references }
32
+ ```
33
+
34
+ ## Package layout
35
+
36
+ - `template.yml` — slots and home defaults
37
+ - `fixtures/` — minimal sample front matter
38
+ - `screenshots/` — capture notes (manual or CI later)
@@ -0,0 +1,7 @@
1
+ ---
2
+ title: Example Style Guide
3
+ key: style-guide
4
+ link: https://example.org/style
5
+ medium: web
6
+ category: reference
7
+ ---
@@ -0,0 +1,6 @@
1
+ # Screenshots
2
+
3
+ Capture the media / sources listing manually or in CI visual inspection.
4
+ PLT-AC-4 requires a screenshot for this template; place PNG or WebP files
5
+ here when available. This directory fulfills the package contract until
6
+ automated capture lands.
@@ -0,0 +1,58 @@
1
+ # Studio fragment for the media (sources) template.
2
+ # Refs: PLT-AC-3, docs/spec.md §5.5
3
+ group: references
4
+ group_label: References
5
+ needs_media: true
6
+ collection:
7
+ label: Sources
8
+ type: collection
9
+ format: yaml-frontmatter
10
+ filename: "{primary}.md"
11
+ operations:
12
+ delete: false
13
+ view:
14
+ primary: name
15
+ fields: [name, category, type, language]
16
+ list_meta_fields: [category, type, language]
17
+ fields:
18
+ - name: key
19
+ label: Citation key
20
+ type: string
21
+ description: "Only when writing cites this source."
22
+ - name: name
23
+ label: Name
24
+ type: string
25
+ required: true
26
+ - name: link
27
+ label: Link
28
+ type: string
29
+ required: true
30
+ description: "Public URL for the source."
31
+ - name: category
32
+ label: Category
33
+ type: select
34
+ options:
35
+ values: [Academic, Communication, Humor, Music, Professional]
36
+ - name: type
37
+ label: Type
38
+ type: select
39
+ options:
40
+ values: [document, podcast, website, youtube]
41
+ - name: language
42
+ label: Language
43
+ type: select
44
+ description: "Studio sorting only."
45
+ options:
46
+ values: [en_us, en_gb, pt_br, fr_fr]
47
+ - name: thumbnail
48
+ label: Thumbnail
49
+ type: image
50
+ description: "HTTPS URL or /media/… path."
51
+ options:
52
+ media: images
53
+ path: content/media/images/covers/sources
54
+ rename: safe
55
+ - name: description
56
+ component: markdown_body
57
+ label: Description
58
+ required: true
@@ -0,0 +1,17 @@
1
+ name: media
2
+ collection_slots:
3
+ - name: collection
4
+ required: true
5
+ contract: resource
6
+ nav:
7
+ group: References
8
+ home:
9
+ band: index
10
+ group: references
11
+ export_fields:
12
+ - title
13
+ - key
14
+ - link
15
+ - medium
16
+ - category
17
+ - body
@@ -0,0 +1,34 @@
1
+ # Template: network
2
+
3
+ Graph of writing connections derived from other registry pages. No collection
4
+ slot of its own; `sources` lists the page keys (or writing collections) whose
5
+ entries feed the graph.
6
+
7
+ ## Required registry keys
8
+
9
+ | Key | Role |
10
+ |---|---|
11
+ | `key` | Page id |
12
+ | `template` | Must be `network` |
13
+ | `sources` | Array of page keys or writing collections to read |
14
+ | `path` | Listing URL |
15
+
16
+ Optional: `title`, `nav`, `home` (default is a references index panel).
17
+
18
+ ## Configuration
19
+
20
+ ```yaml
21
+ - key: network
22
+ template: network
23
+ title: Network
24
+ sources: [articles, blog]
25
+ path: /pages/network/
26
+ nav: { group: References, icon: flowchart }
27
+ home: { band: index, group: references }
28
+ ```
29
+
30
+ ## Package layout
31
+
32
+ - `template.yml` — sources contract and home defaults
33
+ - `fixtures/` — minimal sample JSON describing expected source keys
34
+ - `screenshots/` — capture notes (manual or CI later)
@@ -0,0 +1,3 @@
1
+ {
2
+ "sources": ["articles", "blog"]
3
+ }
@@ -0,0 +1,6 @@
1
+ # Screenshots
2
+
3
+ Capture the network graph page manually or in CI visual inspection.
4
+ PLT-AC-4 requires a screenshot for this template; place PNG or WebP files
5
+ here when available. This directory fulfills the package contract until
6
+ automated capture lands.
@@ -0,0 +1,28 @@
1
+ # Studio fragment for the network template.
2
+ # Network derives from pages listed under `sources`; there is no collection
3
+ # to edit. A page-chrome file keeps Studio aware the page is registered.
4
+ # Refs: PLT-AC-3, docs/spec.md §5.5
5
+ group: pages
6
+ group_label: Pages
7
+ view_only: true
8
+ files:
9
+ - name: page_network
10
+ label: Network
11
+ type: file
12
+ path: content/pages/headers.yml
13
+ format: yaml
14
+ root_key: network
15
+ description: "Listing page chrome. The graph itself is derived from sources."
16
+ fields:
17
+ - name: title
18
+ label: Title
19
+ type: string
20
+ - name: accent
21
+ label: Accent
22
+ type: select
23
+ options:
24
+ values: [green, ochre, blue, slate]
25
+ - name: tags
26
+ label: Tags
27
+ type: string
28
+ list: true
@@ -0,0 +1,10 @@
1
+ name: network
2
+ collection_slots: []
3
+ sources:
4
+ required: true
5
+ description: Page keys or writing collections that feed the graph
6
+ nav:
7
+ group: References
8
+ home:
9
+ band: index
10
+ group: references
@@ -0,0 +1,39 @@
1
+ # Template: portfolio
2
+
3
+ Project catalogue rendered as a grid of system cards. One collection of
4
+ project entries with optional detail pages.
5
+
6
+ ## Required registry keys
7
+
8
+ | Key | Role |
9
+ |---|---|
10
+ | `key` | Page id |
11
+ | `template` | Must be `portfolio` |
12
+ | `collection` | Projects folder under `content/collections/` |
13
+ | `path` | Listing URL |
14
+ | `detail` | Detail route pattern, for example `/projects/:slug/` |
15
+
16
+ Optional: `title`, `nav`, `home` (default limit 4).
17
+
18
+ ## Collection contract
19
+
20
+ `title`, `key`, `sort_order`, `start_date`, `status`, `tags`, Markdown body.
21
+
22
+ ## Configuration
23
+
24
+ ```yaml
25
+ - key: projects
26
+ template: portfolio
27
+ title: Projects
28
+ collection: projects
29
+ path: /pages/projects/
30
+ detail: /projects/:slug/
31
+ nav: { group: Profile, icon: terminal }
32
+ home: { limit: 4 }
33
+ ```
34
+
35
+ ## Package layout
36
+
37
+ - `template.yml` — slots, detail route, export fields
38
+ - `fixtures/` — minimal sample front matter
39
+ - `screenshots/` — capture notes (manual or CI later)
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: Demo Kit
3
+ key: demo-kit
4
+ sort_order: 1
5
+ start_date: 2025-01-01
6
+ status: ongoing
7
+ tags: [tools]
8
+ ---
9
+
10
+ A fictional portfolio project for the template fixture.
@@ -0,0 +1,6 @@
1
+ # Screenshots
2
+
3
+ Capture the portfolio / projects grid manually or in CI visual inspection.
4
+ PLT-AC-4 requires a screenshot for this template; place PNG or WebP files
5
+ here when available. This directory fulfills the package contract until
6
+ automated capture lands.
@@ -0,0 +1,89 @@
1
+ # Studio fragment for the portfolio (projects) template.
2
+ # Refs: PLT-AC-3, docs/spec.md §5.5
3
+ group: portfolio
4
+ group_label: Portfolio
5
+ needs_media: true
6
+ collection:
7
+ label: Projects
8
+ type: collection
9
+ format: yaml-frontmatter
10
+ filename: "{key}.md"
11
+ operations:
12
+ delete: false
13
+ view:
14
+ primary: project
15
+ fields: [thumbnail, project, start_date, end_date, icon, key, status, sort_order]
16
+ list_meta_fields: [status, start_date, end_date]
17
+ fields:
18
+ - name: layout
19
+ label: Layout
20
+ type: string
21
+ hidden: true
22
+ default: project
23
+ - name: key
24
+ label: Key
25
+ type: string
26
+ required: true
27
+ description: "URL slug (/projects/key/) and citation handle."
28
+ - name: title
29
+ label: Title
30
+ type: string
31
+ required: true
32
+ - name: project
33
+ label: Project name
34
+ type: string
35
+ required: true
36
+ - name: tagline
37
+ label: Tagline
38
+ type: text
39
+ - name: start_date
40
+ label: Start date
41
+ type: string
42
+ - name: end_date
43
+ label: End date
44
+ type: string
45
+ - name: status
46
+ label: Status
47
+ type: select
48
+ options:
49
+ values: [ongoing, completed]
50
+ - name: label
51
+ label: Label
52
+ type: string
53
+ description: "Small caps line above the project name."
54
+ - name: icon
55
+ label: Icon
56
+ type: string
57
+ description: "Material Symbols name (e.g. memory, forest)."
58
+ - name: tags
59
+ label: Tags
60
+ type: string
61
+ list: true
62
+ description: "Chips on the card; free text."
63
+ - name: thumbnail
64
+ label: Thumbnail
65
+ type: image
66
+ description: "HTTPS URL or /media/… path."
67
+ options:
68
+ media: images
69
+ path: content/media/images/covers/projects
70
+ rename: safe
71
+ - name: external_url
72
+ label: External URL
73
+ type: string
74
+ - name: article_url
75
+ label: Article URL
76
+ type: string
77
+ - name: github
78
+ label: GitHub URL
79
+ type: string
80
+ - name: sort_order
81
+ label: Sort order
82
+ type: number
83
+ description: "Lowest first in the listing."
84
+ - name: redirects
85
+ label: Redirects
86
+ type: string
87
+ list: true
88
+ - name: body
89
+ component: markdown_body
@@ -0,0 +1,18 @@
1
+ name: portfolio
2
+ collection_slots:
3
+ - name: collection
4
+ required: true
5
+ contract: project
6
+ detail: /projects/:slug/
7
+ nav:
8
+ group: Profile
9
+ home:
10
+ limit: 4
11
+ export_fields:
12
+ - title
13
+ - key
14
+ - sort_order
15
+ - start_date
16
+ - status
17
+ - tags
18
+ - body