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
data/studio/schema.yml ADDED
@@ -0,0 +1,869 @@
1
+ # Studio content schema (live CMS model for /studio/).
2
+ # Spec: docs/features/studio.md
3
+ # Hosted editor: https://example.com/studio/
4
+ #
5
+ # Field notes:
6
+ # - Body fields use TipTap with autolink:false and atomic Liquid include blocks.
7
+ # - Thumbnail / image fields accept HTTPS URLs or /media/… paths (hotlink OK).
8
+ # - Calendar days use type date with format yyyy-MM-dd
9
+ # - Form order: identity (key, title, description) → options → body last
10
+
11
+ media:
12
+ name: media
13
+ label: Media
14
+ input: content/media
15
+ output: /media
16
+ categories: [image, video, plot]
17
+ rename: safe
18
+
19
+ components:
20
+ markdown_body:
21
+ type: code
22
+ label: Body
23
+ description: "Markdown source (code editor). Paste Liquid {% include %} markers as-is — figures, citations, embeds. Do not use rich-text: its Editor mode rewrites URLs inside includes."
24
+ options:
25
+ format: markdown
26
+
27
+ content:
28
+ - name: writing
29
+ label: Writing
30
+ type: group
31
+ items:
32
+ - name: posts
33
+ label: Rascunhos
34
+ type: collection
35
+ path: content/collections/posts
36
+ format: yaml-frontmatter
37
+ filename: "{year}-{month}-{day}-{key}.md"
38
+ operations:
39
+ delete: false
40
+ view:
41
+ primary: title
42
+ fields: [thumbnail, title, date, published, language, key]
43
+ list_meta_fields: [date, language]
44
+ fields:
45
+ - name: layout
46
+ label: Layout
47
+ type: string
48
+ hidden: true
49
+ default: post
50
+ - name: key
51
+ label: Key
52
+ type: string
53
+ required: true
54
+ description: "URL slug and Cite/Xcite handle. Also the filename stem: YYYY-MM-DD-key.md. ASCII kebab-case."
55
+ - name: title
56
+ label: Title
57
+ type: string
58
+ required: true
59
+ description: "Also becomes the deck title. The filename uses Key as YYYY-MM-DD-key (44 characters total for the key segment is a good ceiling)."
60
+ - name: date
61
+ label: Date
62
+ type: date
63
+ required: true
64
+ description: "Publication date, and the first half of the URL. Must match the YYYY-MM-DD in the filename. The Updated date is read from Git, never set here."
65
+ options:
66
+ format: yyyy-MM-dd
67
+ time: false
68
+ - name: tags
69
+ label: Tags
70
+ type: select
71
+ description: "Up to three, and none is a valid answer: only tag what the entry really is about."
72
+ options:
73
+ multiple: true
74
+ max: 3
75
+ values:
76
+ [
77
+ arte,
78
+ brasilidade,
79
+ carme,
80
+ devaneio,
81
+ engraçadinho,
82
+ música,
83
+ pesquisa,
84
+ provocação,
85
+ técnico,
86
+ trabalho,
87
+ ]
88
+ - name: language
89
+ label: Language
90
+ type: select
91
+ description: "Language of the page furniture only. Empty reads as Portuguese."
92
+ options:
93
+ values: [ptbr, enus, frfr, eses]
94
+ - name: thumbnail
95
+ label: Thumbnail
96
+ type: image
97
+ description: "Listing card, sidebar, and link previews. HTTPS URL or /media/… path. Optional upload under covers/posts/."
98
+ options:
99
+ media: images
100
+ path: content/media/images/covers/posts
101
+ rename: safe
102
+ - name: tab
103
+ label: Chord sheet
104
+ type: string
105
+ description: "Name of a file in content/collections/data/tabs without .yml."
106
+ - name: transcription
107
+ label: Transcription
108
+ type: string
109
+ description: "Name of a file in content/collections/data/transcriptions without .yml."
110
+ - name: published
111
+ label: Published
112
+ type: boolean
113
+ default: true
114
+ description: "Off keeps the rascunho out of the export altogether."
115
+ - name: drop_cap
116
+ label: Drop cap
117
+ type: boolean
118
+ description: "On draws the first letter of the opening paragraph large, across the line count in site config (drop_cap_lines)."
119
+ - name: redirects
120
+ label: Redirects
121
+ type: string
122
+ list: true
123
+ description: "Old paths that should 301 here (e.g. /posts/2026-03-02-mcmc)."
124
+ - name: body
125
+ component: markdown_body
126
+
127
+ - name: articles
128
+ label: Articles
129
+ type: collection
130
+ path: content/collections/articles
131
+ format: yaml-frontmatter
132
+ filename: "{year}-{month}-{day}-{key}.md"
133
+ operations:
134
+ delete: false
135
+ view:
136
+ primary: title
137
+ fields: [thumbnail, title, date, published, language, key]
138
+ list_meta_fields: [date, language]
139
+ fields:
140
+ - name: layout
141
+ label: Layout
142
+ type: string
143
+ hidden: true
144
+ default: article
145
+ - name: key
146
+ label: Key
147
+ type: string
148
+ required: true
149
+ description: "URL slug and Cite/Xcite handle. Also the filename stem: YYYY-MM-DD-key.md. ASCII kebab-case."
150
+ - name: title
151
+ label: Title
152
+ type: string
153
+ required: true
154
+ description: "Display title. The filename uses Key as YYYY-MM-DD-key."
155
+ - name: description
156
+ label: Description
157
+ type: text
158
+ description: "Deck under the title, card preview text, and OG description."
159
+ - name: date
160
+ label: Date
161
+ type: date
162
+ required: true
163
+ description: "Publication date; must match the YYYY-MM-DD in the filename."
164
+ options:
165
+ format: yyyy-MM-dd
166
+ time: false
167
+ - name: tags
168
+ label: Tags
169
+ type: select
170
+ description: "One to three."
171
+ options:
172
+ multiple: true
173
+ min: 1
174
+ max: 3
175
+ values:
176
+ [Aesthetics, AI, Data, DevOps, Mathematics, Robotics, Social]
177
+ - name: language
178
+ label: Language
179
+ type: select
180
+ description: "Language of the page furniture only. Empty reads as English."
181
+ options:
182
+ values: [ptbr, enus, frfr, eses]
183
+ - name: thumbnail
184
+ label: Thumbnail
185
+ type: image
186
+ description: "Portrait image, 3:4. HTTPS URL or /media/… path. Optional upload under covers/articles/."
187
+ options:
188
+ media: images
189
+ path: content/media/images/covers/articles
190
+ rename: safe
191
+ - name: mermaid
192
+ label: Has Mermaid diagrams
193
+ type: boolean
194
+ description: "On loads the diagram renderer for this page."
195
+ - name: drop_cap
196
+ label: Drop cap
197
+ type: boolean
198
+ description: "On draws the first letter of the opening paragraph large, across the line count in site config (drop_cap_lines)."
199
+ - name: published
200
+ label: Published
201
+ type: boolean
202
+ default: true
203
+ description: "Off keeps the article out of the export altogether."
204
+ - name: redirects
205
+ label: Redirects
206
+ type: string
207
+ list: true
208
+ - name: body
209
+ component: markdown_body
210
+
211
+ - name: sources_refs
212
+ label: References
213
+ type: group
214
+ items:
215
+ - name: resources
216
+ label: Sources
217
+ type: collection
218
+ path: content/collections/resources
219
+ format: yaml-frontmatter
220
+ filename: "{primary}.md"
221
+ operations:
222
+ delete: false
223
+ view:
224
+ primary: name
225
+ fields: [name, category, type, language]
226
+ list_meta_fields: [category, type, language]
227
+ fields:
228
+ - name: key
229
+ label: Citation key
230
+ type: string
231
+ description: "Only when an article cites this source through Cite/Xcite."
232
+ - name: name
233
+ label: Name
234
+ type: string
235
+ required: true
236
+ - name: link
237
+ label: Link
238
+ type: string
239
+ required: true
240
+ description: "youtube → youtube.com/youtu.be; spotify → open.spotify.com; pdf → ends in .pdf."
241
+ - name: category
242
+ label: Category
243
+ type: select
244
+ options:
245
+ values: [Academic, Communication, Humor, Music, Professional]
246
+ - name: type
247
+ label: Type
248
+ type: select
249
+ options:
250
+ values: [document, podcast, website, youtube]
251
+ - name: language
252
+ label: Language
253
+ type: select
254
+ description: "Studio sorting only; not shown on the site."
255
+ options:
256
+ values:
257
+ [en_au, en_ch, en_gb, en_hk, en_hu, en_it, en_us, fr_fr, pt_br]
258
+ - name: thumbnail
259
+ label: Thumbnail
260
+ type: image
261
+ description: "Source card image. HTTPS URL or /media/… path (hotlink OK in Studio list)."
262
+ options:
263
+ media: images
264
+ path: content/media/images/covers/sources
265
+ rename: safe
266
+ - name: description
267
+ component: markdown_body
268
+ label: Description
269
+ required: true
270
+ description: "The whole body of the card."
271
+
272
+ - name: bibliography
273
+ label: Bibliography
274
+ type: collection
275
+ path: content/collections/bibliography
276
+ format: yaml
277
+ filename: "{primary}.yml"
278
+ operations:
279
+ delete: false
280
+ view:
281
+ primary: title
282
+ fields: [type, title, author, year]
283
+ list_meta_fields: [key]
284
+ fields:
285
+ - name: type
286
+ label: Type
287
+ type: select
288
+ default: misc
289
+ options:
290
+ values: [article, book, incollection, misc, techreport]
291
+ - name: title
292
+ label: Title
293
+ type: string
294
+ - name: author
295
+ label: Author
296
+ type: string
297
+ description: "Lastname, Firstname and Lastname2, Firstname2"
298
+ - name: year
299
+ label: Year
300
+ type: string
301
+ - name: url
302
+ label: URL
303
+ type: string
304
+ - name: doi
305
+ label: DOI
306
+ type: string
307
+ description: "Without URL prefix."
308
+ - name: journal
309
+ label: Journal
310
+ type: string
311
+ - name: publisher
312
+ label: Publisher
313
+ type: string
314
+ - name: institution
315
+ label: Institution
316
+ type: string
317
+ - name: howpublished
318
+ label: How published
319
+ type: string
320
+ - name: volume
321
+ label: Volume
322
+ type: string
323
+ - name: number
324
+ label: Number
325
+ type: string
326
+ - name: pages
327
+ label: Pages
328
+ type: string
329
+ - name: month
330
+ label: Month
331
+ type: string
332
+ - name: note
333
+ label: Note
334
+ type: text
335
+
336
+ - name: portfolio
337
+ label: Portfolio
338
+ type: group
339
+ items:
340
+ - name: products
341
+ label: Products
342
+ type: collection
343
+ path: content/collections/products
344
+ format: yaml-frontmatter
345
+ filename: "{key}.md"
346
+ operations:
347
+ delete: false
348
+ view:
349
+ primary: product
350
+ fields: [company, product, start_date, end_date, key]
351
+ list_meta_fields: [company, start_date, end_date]
352
+ fields:
353
+ - name: layout
354
+ label: Layout
355
+ type: string
356
+ hidden: true
357
+ default: product
358
+ - name: key
359
+ label: Key
360
+ type: string
361
+ required: true
362
+ description: "URL slug (/products/key/) and Cite/Xcite handle. Also the filename: key.md. ASCII kebab-case."
363
+ - name: title
364
+ label: Title
365
+ type: string
366
+ required: true
367
+ - name: product
368
+ label: Product name
369
+ type: string
370
+ required: true
371
+ description: "Name on the CV card."
372
+ - name: company
373
+ label: Company
374
+ type: string
375
+ required: true
376
+ - name: start_date
377
+ label: Start date
378
+ type: string
379
+ - name: end_date
380
+ label: End date
381
+ type: string
382
+ - name: external_url
383
+ label: External URL
384
+ type: string
385
+ - name: redirects
386
+ label: Redirects
387
+ type: string
388
+ list: true
389
+ - name: drop_cap
390
+ label: Drop cap
391
+ type: boolean
392
+ description: "On draws the first letter of the opening paragraph large, across the line count in site config (drop_cap_lines)."
393
+ - name: body
394
+ component: markdown_body
395
+
396
+ - name: projects
397
+ label: Projects
398
+ type: collection
399
+ path: content/collections/projects
400
+ format: yaml-frontmatter
401
+ filename: "{key}.md"
402
+ operations:
403
+ delete: false
404
+ view:
405
+ primary: project
406
+ fields: [thumbnail, project, start_date, end_date, icon, key, status, sort_order]
407
+ list_meta_fields: [status, start_date, end_date]
408
+ fields:
409
+ - name: layout
410
+ label: Layout
411
+ type: string
412
+ hidden: true
413
+ default: project
414
+ - name: key
415
+ label: Key
416
+ type: string
417
+ required: true
418
+ description: "URL slug (/projects/key/) and Cite/Xcite handle. Also the filename: key.md. ASCII kebab-case."
419
+ - name: title
420
+ label: Title
421
+ type: string
422
+ required: true
423
+ - name: project
424
+ label: Project name
425
+ type: string
426
+ required: true
427
+ - name: tagline
428
+ label: Tagline
429
+ type: text
430
+ - name: start_date
431
+ label: Start date
432
+ type: string
433
+ - name: end_date
434
+ label: End date
435
+ type: string
436
+ - name: status
437
+ label: Status
438
+ type: select
439
+ options:
440
+ values: [ongoing, completed]
441
+ - name: label
442
+ label: Label
443
+ type: string
444
+ description: "Small caps line above the project name (e.g. Robotics)."
445
+ - name: icon
446
+ label: Icon
447
+ type: string
448
+ description: "Material Symbols name (e.g. memory, forest)."
449
+ - name: tags
450
+ label: Tags
451
+ type: string
452
+ list: true
453
+ description: "Chips along the bottom of the card; free text."
454
+ - name: thumbnail
455
+ label: Thumbnail
456
+ type: image
457
+ description: "Project card image. HTTPS URL or /media/… path. Optional upload under covers/projects/."
458
+ options:
459
+ media: images
460
+ path: content/media/images/covers/projects
461
+ rename: safe
462
+ - name: external_url
463
+ label: External URL
464
+ type: string
465
+ - name: article_url
466
+ label: Article URL
467
+ type: string
468
+ - name: github
469
+ label: GitHub URL
470
+ type: string
471
+ - name: sort_order
472
+ label: Sort order
473
+ type: number
474
+ description: "Lowest first in the listing."
475
+ - name: mermaid
476
+ label: Has Mermaid diagrams
477
+ type: boolean
478
+ - name: drop_cap
479
+ label: Drop cap
480
+ type: boolean
481
+ description: "On draws the first letter of the opening paragraph large, across the line count in site config (drop_cap_lines)."
482
+ - name: redirects
483
+ label: Redirects
484
+ type: string
485
+ list: true
486
+ - name: body
487
+ component: markdown_body
488
+
489
+ - name: jobs
490
+ label: Jobs
491
+ type: collection
492
+ path: content/collections/jobs
493
+ format: yaml-frontmatter
494
+ filename: "{primary}.md"
495
+ operations:
496
+ delete: false
497
+ view:
498
+ primary: position
499
+ fields: [company, position, department, engagement, start, end]
500
+ list_meta_fields: [company, engagement, start, end]
501
+ fields:
502
+ - name: position
503
+ label: Position
504
+ type: string
505
+ required: true
506
+ - name: company
507
+ label: Company
508
+ type: string
509
+ required: true
510
+ - name: location
511
+ label: Location
512
+ type: string
513
+ - name: start
514
+ label: Start
515
+ type: string
516
+ - name: end
517
+ label: End
518
+ type: string
519
+ - name: department
520
+ label: Department
521
+ type: string
522
+ - name: engagement
523
+ label: Engagement
524
+ type: select
525
+ required: true
526
+ description: "Classification only. Printed CV keeps permanent, fixed_term, and founding; internship and research stay on the site timeline."
527
+ options:
528
+ values: [permanent, fixed_term, founding, internship, research]
529
+ - name: products
530
+ label: Products
531
+ type: reference
532
+ description: "Products listed under this job on the CV."
533
+ options:
534
+ collection: products
535
+ multiple: true
536
+ search: "product,title,company"
537
+ value: "{primary}"
538
+ label: "{product} ({company})"
539
+ - name: body_public
540
+ component: markdown_body
541
+ label: Public body
542
+ description: "The only body that reaches the public CV page."
543
+ - name: body_extended
544
+ component: markdown_body
545
+ label: Extended body
546
+ description: "Extended CV PDF only; stripped from the public export."
547
+ - name: body_single_page
548
+ component: markdown_body
549
+ label: Single-page body
550
+ description: "Single-page CV PDF only; stripped from the public export."
551
+
552
+ - name: pages
553
+ label: Pages
554
+ type: group
555
+ items:
556
+ - name: page_home
557
+ label: Home
558
+ type: file
559
+ path: content/pages/headers.yml
560
+ format: yaml
561
+ root_key: index
562
+ description: "Home page detail, including how Sources, Network, and Bibliography are presented on the index band."
563
+ fields:
564
+ - name: title
565
+ label: Title
566
+ type: string
567
+ - name: kicker
568
+ label: Kicker
569
+ type: string
570
+ - name: note
571
+ label: Description
572
+ type: string
573
+ description: "Home band covering Sources, Network, and Bibliography presentation."
574
+ - name: page_cv
575
+ label: CV
576
+ type: file
577
+ path: content/pages/headers.yml
578
+ format: yaml
579
+ root_key: cv
580
+ fields:
581
+ - name: title
582
+ label: Title
583
+ type: string
584
+ - name: accent
585
+ label: Accent
586
+ type: select
587
+ options:
588
+ values: [green, ochre, blue, slate]
589
+ - name: tags
590
+ label: Tags
591
+ type: string
592
+ list: true
593
+ - name: page_articles
594
+ label: Articles
595
+ type: file
596
+ path: content/pages/headers.yml
597
+ format: yaml
598
+ root_key: articles
599
+ description: "Articles listing page chrome (title, kicker, note). Article entries live under Writing."
600
+ fields:
601
+ - name: title
602
+ label: Title
603
+ type: string
604
+ description: "Wrap words in *asterisks* for italic emphasis."
605
+ - name: kicker
606
+ label: Kicker
607
+ type: string
608
+ - name: note
609
+ label: Description
610
+ type: string
611
+ - name: accent
612
+ label: Accent
613
+ type: select
614
+ options:
615
+ values: [green, ochre, blue, slate]
616
+ - name: tags
617
+ label: Tags
618
+ type: string
619
+ list: true
620
+ - name: page_rascunhos
621
+ label: Rascunhos
622
+ type: file
623
+ path: content/pages/headers.yml
624
+ format: yaml
625
+ root_key: blog
626
+ description: "Rascunhos listing page chrome. Write these fields in Portuguese. Entries live under Writing."
627
+ fields:
628
+ - name: title
629
+ label: Title
630
+ type: string
631
+ - name: kicker
632
+ label: Kicker
633
+ type: string
634
+ - name: note
635
+ label: Description
636
+ type: string
637
+ - name: accent
638
+ label: Accent
639
+ type: select
640
+ options:
641
+ values: [green, ochre, blue, slate]
642
+ - name: tags
643
+ label: Tags
644
+ type: string
645
+ list: true
646
+ - name: page_sources
647
+ label: Sources
648
+ type: file
649
+ path: content/pages/headers.yml
650
+ format: yaml
651
+ root_key: resources
652
+ description: "Sources listing page chrome. Source cards live under References. Index-band copy is under Home."
653
+ fields:
654
+ - name: title
655
+ label: Title
656
+ type: string
657
+ - name: accent
658
+ label: Accent
659
+ type: select
660
+ options:
661
+ values: [green, ochre, blue, slate]
662
+ - name: tags
663
+ label: Tags
664
+ type: string
665
+ list: true
666
+ - name: page_network
667
+ label: Network
668
+ type: file
669
+ path: content/pages/headers.yml
670
+ format: yaml
671
+ root_key: network
672
+ description: "Network of Ideas page chrome. Index-band copy is under Home."
673
+ fields:
674
+ - name: title
675
+ label: Title
676
+ type: string
677
+ - name: accent
678
+ label: Accent
679
+ type: select
680
+ options:
681
+ values: [green, ochre, blue, slate]
682
+ - name: tags
683
+ label: Tags
684
+ type: string
685
+ list: true
686
+ - name: page_bibliography
687
+ label: Bibliography
688
+ type: file
689
+ path: content/pages/headers.yml
690
+ format: yaml
691
+ root_key: bibliography
692
+ description: "Bibliography listing page chrome. Cite keys live under References. Index-band copy is under Home."
693
+ fields:
694
+ - name: title
695
+ label: Title
696
+ type: string
697
+ - name: note
698
+ label: Description
699
+ type: string
700
+ - name: accent
701
+ label: Accent
702
+ type: select
703
+ options:
704
+ values: [green, ochre, blue, slate]
705
+ - name: tags
706
+ label: Tags
707
+ type: string
708
+ list: true
709
+
710
+ - name: cv_summary
711
+ label: CV Summary
712
+ type: group
713
+ items:
714
+ - name: cv_summary_public
715
+ label: Public
716
+ type: file
717
+ path: content/pages/cv/summary.md
718
+ format: raw
719
+ fields:
720
+ - name: body
721
+ component: markdown_body
722
+
723
+ - name: cv_summary_extended
724
+ label: Extended PDF
725
+ type: file
726
+ path: content/pages/cv/summary-extended.md
727
+ format: raw
728
+ fields:
729
+ - name: body
730
+ component: markdown_body
731
+
732
+ - name: cv_summary_single_page
733
+ label: Single-page PDF
734
+ type: file
735
+ path: content/pages/cv/summary-single-page.md
736
+ format: raw
737
+ fields:
738
+ - name: body
739
+ component: markdown_body
740
+
741
+ - name: presentation
742
+ label: Presentation
743
+ type: group
744
+ items:
745
+ - name: home_subtitle
746
+ label: Catch phrase
747
+ type: file
748
+ path: content/pages/home/subtitle.md
749
+ format: raw
750
+ fields:
751
+ - name: body
752
+ component: markdown_body
753
+
754
+ - name: cv_ai_practice
755
+ label: AI practice
756
+ type: file
757
+ path: content/pages/cv/ai-practice.md
758
+ format: raw
759
+ description: "Shared AI practice copy for both Extended PDF and Single-page PDF."
760
+ fields:
761
+ - name: body
762
+ component: markdown_body
763
+
764
+ - name: cv_disclaimer
765
+ label: Disclaimer
766
+ type: file
767
+ path: content/pages/cv/disclaimer.md
768
+ format: raw
769
+ fields:
770
+ - name: body
771
+ component: markdown_body
772
+
773
+ - name: profile
774
+ label: Profile
775
+ type: group
776
+ items:
777
+ - name: contacts
778
+ label: Contact
779
+ type: file
780
+ path: content/collections/data/contacts.yml
781
+ format: yaml
782
+ list: true
783
+ fields:
784
+ - name: name
785
+ label: Name
786
+ type: string
787
+ required: true
788
+ - name: badge
789
+ label: Badge
790
+ type: string
791
+ description: "Small caps line above the name."
792
+ - name: href
793
+ label: Link
794
+ type: string
795
+ required: true
796
+ description: "Full URL, or mailto:… for an address."
797
+ - name: icon
798
+ label: Icon
799
+ type: string
800
+ description: "Material Symbols name (e.g. group, code)."
801
+
802
+ - name: education
803
+ label: Education
804
+ type: file
805
+ path: content/collections/data/education.yml
806
+ format: yaml
807
+ list: true
808
+ fields:
809
+ - name: degree
810
+ label: Degree
811
+ type: string
812
+ required: true
813
+ - name: institution
814
+ label: Institution
815
+ type: string
816
+ required: true
817
+ - name: location
818
+ label: Location
819
+ type: string
820
+ - name: start
821
+ label: Start
822
+ type: string
823
+ - name: end
824
+ label: End
825
+ type: string
826
+ - name: detail
827
+ label: Detail
828
+ type: text
829
+
830
+ - name: languages
831
+ label: Languages
832
+ type: file
833
+ path: content/collections/data/languages.yml
834
+ format: yaml
835
+ list: true
836
+ fields:
837
+ - name: name
838
+ label: Name
839
+ type: string
840
+ required: true
841
+ - name: level
842
+ label: Level
843
+ type: string
844
+ description: "Printed in italics (e.g. Native, C1)."
845
+
846
+ - name: skills
847
+ label: Skills
848
+ type: file
849
+ path: content/collections/data/skills.yml
850
+ format: yaml
851
+ fields:
852
+ - name: leadership
853
+ label: Leadership
854
+ type: string
855
+ list: true
856
+ description: "Private CV PDF sidebar only."
857
+ - name: technical
858
+ label: Technical
859
+ type: object
860
+ list: true
861
+ description: "Private CV PDF sidebar only."
862
+ fields:
863
+ - name: group
864
+ label: Group
865
+ type: string
866
+ - name: skills
867
+ label: Skills
868
+ type: string
869
+ list: true