unaltraweb 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/Makefile +412 -0
  4. data/README.md +226 -0
  5. data/_config.yml +842 -0
  6. data/_data/i18n/ca.yml +278 -0
  7. data/_data/i18n/en.yml +278 -0
  8. data/_data/i18n/es.yml +278 -0
  9. data/_includes/audio.liquid +30 -0
  10. data/_includes/bib_search.liquid +5 -0
  11. data/_includes/blog-list.liquid +66 -0
  12. data/_includes/book-citation.liquid +33 -0
  13. data/_includes/citation.liquid +26 -0
  14. data/_includes/custom_head.liquid +3 -0
  15. data/_includes/custom_scripts.liquid +5 -0
  16. data/_includes/cv/list.liquid +5 -0
  17. data/_includes/cv/list_groups.liquid +51 -0
  18. data/_includes/cv/map.liquid +29 -0
  19. data/_includes/cv/nested_list.liquid +16 -0
  20. data/_includes/cv/time_table.liquid +118 -0
  21. data/_includes/cv-download-card.liquid +26 -0
  22. data/_includes/developer-mode-switcher.liquid +24 -0
  23. data/_includes/disqus.liquid +13 -0
  24. data/_includes/distill_scripts.liquid +298 -0
  25. data/_includes/documentation-download-detail.liquid +76 -0
  26. data/_includes/documentation-downloads.liquid +71 -0
  27. data/_includes/documentation-profile-attributes.liquid +4 -0
  28. data/_includes/documentation-section-toc.liquid +9 -0
  29. data/_includes/documentation-sidebar.liquid +112 -0
  30. data/_includes/figure.liquid +87 -0
  31. data/_includes/footer.liquid +66 -0
  32. data/_includes/giscus.liquid +25 -0
  33. data/_includes/head.liquid +220 -0
  34. data/_includes/header.liquid +544 -0
  35. data/_includes/latest_posts.liquid +61 -0
  36. data/_includes/localized-date.liquid +5 -0
  37. data/_includes/manual-bibliography.liquid +2 -0
  38. data/_includes/manual-featured-readings.liquid +12 -0
  39. data/_includes/manual-other-readings.liquid +12 -0
  40. data/_includes/manual-page-toc.liquid +11 -0
  41. data/_includes/manual-sidebar.liquid +58 -0
  42. data/_includes/manual-teachers.liquid +74 -0
  43. data/_includes/metadata.liquid +278 -0
  44. data/_includes/news.liquid +48 -0
  45. data/_includes/newsletter.liquid +68 -0
  46. data/_includes/page-hero.liquid +96 -0
  47. data/_includes/page-link.liquid +8 -0
  48. data/_includes/pagination.liquid +22 -0
  49. data/_includes/post-reading-time.liquid +29 -0
  50. data/_includes/previous-next.liquid +37 -0
  51. data/_includes/profile-card.liquid +49 -0
  52. data/_includes/profile-feature-matrix.liquid +75 -0
  53. data/_includes/profile-highlights.liquid +122 -0
  54. data/_includes/project-grid.liquid +26 -0
  55. data/_includes/project-resource-link.liquid +45 -0
  56. data/_includes/project-resources.liquid +21 -0
  57. data/_includes/projects.liquid +38 -0
  58. data/_includes/projects_horizontal.liquid +37 -0
  59. data/_includes/publications-metrics-summary.liquid +69 -0
  60. data/_includes/publications-summary.liquid +127 -0
  61. data/_includes/reading-biblio-controls.liquid +65 -0
  62. data/_includes/reading-cover-card.liquid +93 -0
  63. data/_includes/reading-rating.liquid +11 -0
  64. data/_includes/recommended-readings.liquid +30 -0
  65. data/_includes/related_posts.liquid +39 -0
  66. data/_includes/repository/repo.liquid +48 -0
  67. data/_includes/repository/repo_trophies.liquid +44 -0
  68. data/_includes/repository/repo_user.liquid +35 -0
  69. data/_includes/resume/awards.liquid +19 -0
  70. data/_includes/resume/basics.liquid +28 -0
  71. data/_includes/resume/certificates.liquid +35 -0
  72. data/_includes/resume/education.liquid +54 -0
  73. data/_includes/resume/interests.liquid +34 -0
  74. data/_includes/resume/languages.liquid +31 -0
  75. data/_includes/resume/projects.liquid +32 -0
  76. data/_includes/resume/publications.liquid +28 -0
  77. data/_includes/resume/references.liquid +31 -0
  78. data/_includes/resume/skills.liquid +33 -0
  79. data/_includes/resume/volunteer.liquid +52 -0
  80. data/_includes/resume/work.liquid +52 -0
  81. data/_includes/scripts.liquid +364 -0
  82. data/_includes/search-data.js.liquid +341 -0
  83. data/_includes/selected_papers.liquid +3 -0
  84. data/_includes/t.liquid +31 -0
  85. data/_includes/team-grid.liquid +172 -0
  86. data/_includes/video.liquid +97 -0
  87. data/_layouts/about.liquid +93 -0
  88. data/_layouts/archive.liquid +45 -0
  89. data/_layouts/bib.liquid +677 -0
  90. data/_layouts/book-review.liquid +225 -0
  91. data/_layouts/book-shelf.liquid +66 -0
  92. data/_layouts/cv.liquid +127 -0
  93. data/_layouts/default.liquid +70 -0
  94. data/_layouts/distill.liquid +132 -0
  95. data/_layouts/documentation-download-detail.liquid +5 -0
  96. data/_layouts/documentation-home.liquid +100 -0
  97. data/_layouts/documentation-page.liquid +45 -0
  98. data/_layouts/manual-bib.liquid +73 -0
  99. data/_layouts/manual-chapter.liquid +99 -0
  100. data/_layouts/manual-featured-bib.liquid +100 -0
  101. data/_layouts/manual-home.liquid +120 -0
  102. data/_layouts/none.liquid +1 -0
  103. data/_layouts/outputs.liquid +29 -0
  104. data/_layouts/page.liquid +52 -0
  105. data/_layouts/post.liquid +95 -0
  106. data/_layouts/profile.liquid +36 -0
  107. data/_layouts/profiles.liquid +36 -0
  108. data/_layouts/project.liquid +7 -0
  109. data/_layouts/repositories.liquid +58 -0
  110. data/_layouts/theses.liquid +126 -0
  111. data/_plugins/bibliography_profiles.rb +164 -0
  112. data/_plugins/callouts.rb +104 -0
  113. data/_plugins/code_blocks.rb +277 -0
  114. data/_plugins/computation_figure_images.rb +266 -0
  115. data/_plugins/computation_sources.rb +42 -0
  116. data/_plugins/content_search_index.rb +210 -0
  117. data/_plugins/details.rb +23 -0
  118. data/_plugins/external-posts.rb +124 -0
  119. data/_plugins/figure_captions.rb +800 -0
  120. data/_plugins/file-exists.rb +22 -0
  121. data/_plugins/google-scholar-citations.rb +86 -0
  122. data/_plugins/hide-custom-bibtex.rb +18 -0
  123. data/_plugins/inspirehep-citations.rb +57 -0
  124. data/_plugins/localized_visual_sources.rb +145 -0
  125. data/_plugins/manual_release_metadata.rb +47 -0
  126. data/_plugins/mermaid_mmd_images.rb +233 -0
  127. data/_plugins/profile-pages.rb +28 -0
  128. data/_plugins/remove-accents.rb +32 -0
  129. data/_plugins/reproducible_build_time.rb +55 -0
  130. data/_plugins/search-data.rb +83 -0
  131. data/_plugins/theme-cache-bust.rb +56 -0
  132. data/_plugins/vega_visual_images.rb +290 -0
  133. data/_plugins/web_capture_images.rb +154 -0
  134. data/_sass/_base.scss +2133 -0
  135. data/_sass/_blog.scss +67 -0
  136. data/_sass/_callouts.scss +100 -0
  137. data/_sass/_custom.scss +437 -0
  138. data/_sass/_cv.scss +274 -0
  139. data/_sass/_developer.scss +97 -0
  140. data/_sass/_distill.scss +185 -0
  141. data/_sass/_documentation.scss +2220 -0
  142. data/_sass/_layout.scss +218 -0
  143. data/_sass/_manual.scss +2691 -0
  144. data/_sass/_profile.scss +323 -0
  145. data/_sass/_projects.scss +163 -0
  146. data/_sass/_reading.scss +465 -0
  147. data/_sass/_site-custom.scss +3 -0
  148. data/_sass/_tabs.scss +48 -0
  149. data/_sass/_team.scss +230 -0
  150. data/_sass/_themes.scss +254 -0
  151. data/_sass/_typograms.scss +132 -0
  152. data/_sass/_variables.scss +52 -0
  153. data/_sass/font-awesome/_animated.scss +152 -0
  154. data/_sass/font-awesome/_bordered-pulled.scss +20 -0
  155. data/_sass/font-awesome/_core.scss +49 -0
  156. data/_sass/font-awesome/_fixed-width.scss +7 -0
  157. data/_sass/font-awesome/_functions.scss +57 -0
  158. data/_sass/font-awesome/_icons.scss +13 -0
  159. data/_sass/font-awesome/_list.scss +18 -0
  160. data/_sass/font-awesome/_mixins.scss +65 -0
  161. data/_sass/font-awesome/_rotated-flipped.scss +31 -0
  162. data/_sass/font-awesome/_screen-reader.scss +14 -0
  163. data/_sass/font-awesome/_shims.scss +1578 -0
  164. data/_sass/font-awesome/_sizing.scss +16 -0
  165. data/_sass/font-awesome/_stacked.scss +32 -0
  166. data/_sass/font-awesome/_variables.scss +5044 -0
  167. data/_sass/font-awesome/brands.scss +30 -0
  168. data/_sass/font-awesome/fontawesome.scss +21 -0
  169. data/_sass/font-awesome/regular.scss +27 -0
  170. data/_sass/font-awesome/solid.scss +27 -0
  171. data/_sass/font-awesome/v4-shims.scss +11 -0
  172. data/_sass/tabler-icons/tabler-icons-filled.scss +1646 -0
  173. data/_sass/tabler-icons/tabler-icons-outline.scss +9859 -0
  174. data/_sass/tabler-icons/tabler-icons.scss +11463 -0
  175. data/_scripts/cronitor-analytics-setup.js +9 -0
  176. data/_scripts/giscus-setup.js +48 -0
  177. data/_scripts/google-analytics-setup.js +9 -0
  178. data/_scripts/open-panel-analytics-setup.js +14 -0
  179. data/_scripts/photoswipe-setup.js +11 -0
  180. data/assets/audio/epicaly-short-113909.mp3 +0 -0
  181. data/assets/bibliography/2018-12-22-distill.bib +7 -0
  182. data/assets/css/academicons.min.css +1 -0
  183. data/assets/css/bootstrap-toc.min.css +4 -0
  184. data/assets/css/bootstrap.min.css +7 -0
  185. data/assets/css/bootstrap.min.css.map +1 -0
  186. data/assets/css/jekyll-pygments-themes-github.css +209 -0
  187. data/assets/css/jekyll-pygments-themes-native.css +232 -0
  188. data/assets/css/jupyter-grade3.css +3758 -0
  189. data/assets/css/jupyter-monokai.css +3758 -0
  190. data/assets/css/jupyter.css +383 -0
  191. data/assets/css/main.scss +36 -0
  192. data/assets/css/mdb.min.css +48 -0
  193. data/assets/css/mdb.min.css.map +1 -0
  194. data/assets/css/scholar-icons.css +386 -0
  195. data/assets/fonts/academicons.ttf +0 -0
  196. data/assets/fonts/academicons.woff +0 -0
  197. data/assets/fonts/scholar-icons.ttf +0 -0
  198. data/assets/fonts/scholar-icons.woff +0 -0
  199. data/assets/fonts/tabler-icons-filled.ttf +0 -0
  200. data/assets/fonts/tabler-icons-filled.woff +0 -0
  201. data/assets/fonts/tabler-icons-filled.woff2 +0 -0
  202. data/assets/fonts/tabler-icons-outline.ttf +0 -0
  203. data/assets/fonts/tabler-icons-outline.woff +0 -0
  204. data/assets/fonts/tabler-icons-outline.woff2 +0 -0
  205. data/assets/fonts/tabler-icons.ttf +0 -0
  206. data/assets/fonts/tabler-icons.woff +0 -0
  207. data/assets/fonts/tabler-icons.woff2 +0 -0
  208. data/assets/html/relativity.html +15 -0
  209. data/assets/img/1.jpg +0 -0
  210. data/assets/img/10.jpg +0 -0
  211. data/assets/img/11.jpg +0 -0
  212. data/assets/img/12.jpg +0 -0
  213. data/assets/img/2.jpg +0 -0
  214. data/assets/img/3.jpg +0 -0
  215. data/assets/img/4.jpg +0 -0
  216. data/assets/img/5.jpg +0 -0
  217. data/assets/img/6.jpg +0 -0
  218. data/assets/img/7.jpg +0 -0
  219. data/assets/img/8.jpg +0 -0
  220. data/assets/img/9.jpg +0 -0
  221. data/assets/img/book_covers/the_godfather.jpg +0 -0
  222. data/assets/img/brand/dosquartsdedocs-logo-cafe.svg +31 -0
  223. data/assets/img/brand/dosquartsdedocs-logo-footer-cafe.svg +31 -0
  224. data/assets/img/brand/dosquartsdedocs-logo-white.svg +31 -0
  225. data/assets/img/brand/dosquartsdedocs-logo.svg +31 -0
  226. data/assets/img/prof_pic.jpg +0 -0
  227. data/assets/img/prof_pic_color.png +0 -0
  228. data/assets/img/profile-placeholder.svg +8 -0
  229. data/assets/img/publication_preview/brownian-motion.gif +0 -0
  230. data/assets/img/publication_preview/goodchild1992-gis-cover.jpg +0 -0
  231. data/assets/img/publication_preview/gutierrez2020-jtrg-preview.jpg +0 -0
  232. data/assets/img/publication_preview/harvey1989-postmodernity-cover.jpg +0 -0
  233. data/assets/img/publication_preview/tobler1970-economic-geography-cover.jpg +0 -0
  234. data/assets/img/publication_preview/tuan1977-space-place-cover.jpg +0 -0
  235. data/assets/img/publication_preview/wave-mechanics.gif +0 -0
  236. data/assets/img/publication_preview/zaragozi2025-rooftop-pv-preview.jpg +0 -0
  237. data/assets/img/rhino.png +0 -0
  238. data/assets/img/team/aaron-gutierrez.png +0 -0
  239. data/assets/img/team/alba-font.png +0 -0
  240. data/assets/img/team/alba-viana.png +0 -0
  241. data/assets/img/team/alejandro-gonzalez.png +0 -0
  242. data/assets/img/team/ana-pastor.png +0 -0
  243. data/assets/img/team/antoni-domenech.png +0 -0
  244. data/assets/img/team/benito-zaragozi.png +0 -0
  245. data/assets/img/team/cinta-sanz.png +0 -0
  246. data/assets/img/team/daniel-miravet.png +0 -0
  247. data/assets/img/team/eugenia-altamirano.png +0 -0
  248. data/assets/img/team/fiammetta-brandajs.png +0 -0
  249. data/assets/img/team/francesc-gonzalez.png +0 -0
  250. data/assets/img/team/isabel-paulino.png +0 -0
  251. data/assets/img/team/joan-borras.png +0 -0
  252. data/assets/img/team/julie-wilson.png +0 -0
  253. data/assets/img/team/liliana-sole.png +0 -0
  254. data/assets/img/team/maria-casado.png +0 -0
  255. data/assets/img/team/maria-medina.png +0 -0
  256. data/assets/img/team/marta-nello.png +0 -0
  257. data/assets/img/team/mogrify +1 -0
  258. data/assets/img/team/oscar-saladie.png +0 -0
  259. data/assets/img/team/paolo-russo.png +0 -0
  260. data/assets/img/team/raquel-santos.png +0 -0
  261. data/assets/img/team/salvador-anton.png +0 -0
  262. data/assets/img/team/sunsi-huertas.png +0 -0
  263. data/assets/img/team/user-placeholder.png +0 -0
  264. data/assets/img/team/wilbert-den-hoed.png +0 -0
  265. data/assets/img/team/xavier-delclos.png +0 -0
  266. data/assets/img/template_error.png +0 -0
  267. data/assets/js/bibsearch.js +70 -0
  268. data/assets/js/bootstrap-toc.min.js +5 -0
  269. data/assets/js/bootstrap.bundle.min.js +7 -0
  270. data/assets/js/bootstrap.bundle.min.js.map +1 -0
  271. data/assets/js/callouts.js +115 -0
  272. data/assets/js/chartjs-setup.js +14 -0
  273. data/assets/js/common.js +117 -0
  274. data/assets/js/content-search-match.js +159 -0
  275. data/assets/js/content-search.js +441 -0
  276. data/assets/js/copy_code.js +60 -0
  277. data/assets/js/custom.js +6 -0
  278. data/assets/js/developer-mode.js +103 -0
  279. data/assets/js/diff2html-setup.js +20 -0
  280. data/assets/js/distillpub/overrides.js +27 -0
  281. data/assets/js/distillpub/template.v2.js +9616 -0
  282. data/assets/js/distillpub/template.v2.js.map +1 -0
  283. data/assets/js/distillpub/transforms.v2.js +14557 -0
  284. data/assets/js/distillpub/transforms.v2.js.map +1 -0
  285. data/assets/js/documentation.js +435 -0
  286. data/assets/js/echarts-setup.js +29 -0
  287. data/assets/js/highlight-search-term.js +110 -0
  288. data/assets/js/jupyter_new_tab.js +18 -0
  289. data/assets/js/leaflet-setup.js +22 -0
  290. data/assets/js/manual.js +308 -0
  291. data/assets/js/masonry.js +12 -0
  292. data/assets/js/mathjax-setup.js +46 -0
  293. data/assets/js/mermaid-setup.js +37 -0
  294. data/assets/js/newsletter.js +105 -0
  295. data/assets/js/no_defer.js +24 -0
  296. data/assets/js/plotly-setup.js +52 -0
  297. data/assets/js/profile-nav.js +92 -0
  298. data/assets/js/progress-bar.js +73 -0
  299. data/assets/js/pseudocode-setup.js +18 -0
  300. data/assets/js/search/base-styles.min.js +286 -0
  301. data/assets/js/search/command-score.min.js +7 -0
  302. data/assets/js/search/hotkeys-js/hotkeys.esm.min.js +18 -0
  303. data/assets/js/search/lit/decorators.min.js +7 -0
  304. data/assets/js/search/lit/directives/class-map.min.js +7 -0
  305. data/assets/js/search/lit/directives/join.min.js +7 -0
  306. data/assets/js/search/lit/directives/live.min.js +7 -0
  307. data/assets/js/search/lit/directives/ref.min.js +7 -0
  308. data/assets/js/search/lit/directives/repeat.min.js +7 -0
  309. data/assets/js/search/lit/directives/unsafe-html.min.js +7 -0
  310. data/assets/js/search/lit/index.min.js +7 -0
  311. data/assets/js/search/lit-element/lit-element.min.js +12 -0
  312. data/assets/js/search/lit-html/directives/class-map.min.js +22 -0
  313. data/assets/js/search/lit-html/directives/join.min.js +12 -0
  314. data/assets/js/search/lit-html/directives/live.min.js +28 -0
  315. data/assets/js/search/lit-html/directives/ref.min.js +32 -0
  316. data/assets/js/search/lit-html/directives/repeat.min.js +27 -0
  317. data/assets/js/search/lit-html/directives/unsafe-html.min.js +22 -0
  318. data/assets/js/search/lit-html/is-server.min.js +12 -0
  319. data/assets/js/search/lit-html/lit-html.min.js +12 -0
  320. data/assets/js/search/ninja-action.min.js +101 -0
  321. data/assets/js/search/ninja-footer.min.js +62 -0
  322. data/assets/js/search/ninja-header.min.js +78 -0
  323. data/assets/js/search/ninja-keys.min.js +39 -0
  324. data/assets/js/search/reactive-element/decorators/custom-element.min.js +12 -0
  325. data/assets/js/search/reactive-element/decorators/event-options.min.js +12 -0
  326. data/assets/js/search/reactive-element/decorators/property.min.js +22 -0
  327. data/assets/js/search/reactive-element/decorators/query-all.min.js +17 -0
  328. data/assets/js/search/reactive-element/decorators/query-assigned-elements.min.js +17 -0
  329. data/assets/js/search/reactive-element/decorators/query-assigned-nodes.min.js +17 -0
  330. data/assets/js/search/reactive-element/decorators/query-async.min.js +17 -0
  331. data/assets/js/search/reactive-element/decorators/query.min.js +17 -0
  332. data/assets/js/search/reactive-element/decorators/state.min.js +27 -0
  333. data/assets/js/search/reactive-element/reactive-element.min.js +17 -0
  334. data/assets/js/search-setup.js +17 -0
  335. data/assets/js/shortcut-key.js +11 -0
  336. data/assets/js/tabs.min.js +5 -0
  337. data/assets/js/theme.js +314 -0
  338. data/assets/js/tooltips-setup.js +3 -0
  339. data/assets/js/typograms.js +1341 -0
  340. data/assets/js/vanilla-back-to-top.min.js +1 -0
  341. data/assets/js/vega-setup.js +24 -0
  342. data/assets/js/venobox-setup.js +5 -0
  343. data/assets/js/wechat.js +14 -0
  344. data/assets/js/zoom.js +15 -0
  345. data/assets/json/resume.json +98 -0
  346. data/assets/json/table_data.json +128 -0
  347. data/assets/jupyter/blog.ipynb +48 -0
  348. data/assets/pdf/example_pdf.pdf +0 -0
  349. data/assets/plotly/demo.html +72 -0
  350. data/assets/video/pexels-engin-akyurt-6069112-960x540-30fps.mp4 +0 -0
  351. data/assets/webfonts/fa-brands-400.ttf +0 -0
  352. data/assets/webfonts/fa-brands-400.woff2 +0 -0
  353. data/assets/webfonts/fa-regular-400.ttf +0 -0
  354. data/assets/webfonts/fa-regular-400.woff2 +0 -0
  355. data/assets/webfonts/fa-solid-900.ttf +0 -0
  356. data/assets/webfonts/fa-solid-900.woff2 +0 -0
  357. data/assets/webfonts/fa-v4compatibility.ttf +0 -0
  358. data/assets/webfonts/fa-v4compatibility.woff2 +0 -0
  359. data/docs/Gemfile +5 -0
  360. data/docs/_config.yml +83 -0
  361. data/docs/_documentation/en/01-quick-start.md +115 -0
  362. data/docs/_documentation/en/02-tools.md +146 -0
  363. data/docs/_documentation/en/03-usage.md +107 -0
  364. data/docs/_documentation/en/04-jekyll-basics.md +51 -0
  365. data/docs/_documentation/en/05-pages-collections.md +68 -0
  366. data/docs/_documentation/en/06-github-web-editing.md +92 -0
  367. data/docs/_documentation/en/10-profiles.md +125 -0
  368. data/docs/_documentation/en/11-unaltreselfie.md +39 -0
  369. data/docs/_documentation/en/12-unaltreprojecte.md +38 -0
  370. data/docs/_documentation/en/13-unaltremanual.md +237 -0
  371. data/docs/_documentation/en/14-unaltredocs.md +92 -0
  372. data/docs/_documentation/en/15-profile-checklist.md +39 -0
  373. data/docs/_documentation/en/20-syntax.md +353 -0
  374. data/docs/_documentation/en/21-themes.md +103 -0
  375. data/docs/_documentation/en/22-feature-reference.md +56 -0
  376. data/docs/_documentation/en/23-front-matter.md +51 -0
  377. data/docs/_documentation/en/24-data-files.md +28 -0
  378. data/docs/_documentation/en/30-customization.md +448 -0
  379. data/docs/_documentation/en/31-template.md +55 -0
  380. data/docs/_documentation/en/32-development.md +108 -0
  381. data/docs/_documentation/en/33-reusable-workflows.md +136 -0
  382. data/docs/_documentation/en/40-distribution.md +164 -0
  383. data/docs/_documentation/en/41-bibliometrics.md +137 -0
  384. data/docs/_documentation/en/42-docker-image.md +185 -0
  385. data/docs/_documentation/en/50-faq.md +33 -0
  386. data/docs/_pages/ca/index.md +35 -0
  387. data/docs/_pages/en/index.md +35 -0
  388. data/docs/_pages/es/index.md +35 -0
  389. data/docs/agents/action-prompts/00-start-site-session.txt +10 -0
  390. data/docs/agents/action-prompts/05-create-new-web.txt +5 -0
  391. data/docs/agents/action-prompts/10-content-update.txt +9 -0
  392. data/docs/agents/action-prompts/15-edit-default-content.txt +8 -0
  393. data/docs/agents/action-prompts/20-manual-teaching-materials.txt +18 -0
  394. data/docs/agents/action-prompts/22-manual-style-audit.txt +14 -0
  395. data/docs/agents/action-prompts/23-manual-structure-audit.txt +17 -0
  396. data/docs/agents/action-prompts/25-translation-prepublish.txt +8 -0
  397. data/docs/agents/action-prompts/30-project-site-update.txt +7 -0
  398. data/docs/agents/action-prompts/40-documentation-update.txt +7 -0
  399. data/docs/agents/action-prompts/50-bibliography-entry.txt +7 -0
  400. data/docs/agents/action-prompts/60-bibliometrics-refresh.txt +7 -0
  401. data/docs/agents/action-prompts/70-build-and-review.txt +12 -0
  402. data/docs/agents/manual-authoring-components.md +255 -0
  403. data/docs/agents/mcp-contract.md +162 -0
  404. data/docs/agents/quarto-computation-adoption.md +102 -0
  405. data/docs/assets/img/unaltraweb-docs-hero.svg +36 -0
  406. data/lib/unaltraweb/version.rb +8 -0
  407. data/lib/unaltraweb.rb +31 -0
  408. data/requirements.txt +5 -0
  409. data/scripts/biblio/fetch_scimago_csv.sh +126 -0
  410. data/scripts/biblio/metrics_common.py +154 -0
  411. data/scripts/biblio/metrics_merge_meta.py +73 -0
  412. data/scripts/biblio/metrics_update.py +826 -0
  413. data/scripts/computations/python/Dockerfile +37 -0
  414. data/scripts/computations/r/Dockerfile +31 -0
  415. data/scripts/computations/render.py +1267 -0
  416. data/scripts/cv/render_pdf_preview.sh +36 -0
  417. data/scripts/deploy/publish_branch.sh +80 -0
  418. data/scripts/generate_logo_variants.py +47 -0
  419. data/scripts/manual/Dockerfile +31 -0
  420. data/scripts/manual/build_pdf.py +1780 -0
  421. data/scripts/manual/filters/bibliography.lua +164 -0
  422. data/scripts/manual/filters/code-blocks.lua +102 -0
  423. data/scripts/manual/filters/figure-captions.lua +35 -0
  424. data/scripts/manual/publish_release.sh +281 -0
  425. data/scripts/manual/templates/manual.tex +494 -0
  426. data/scripts/manual/verify_release_assets.py +650 -0
  427. data/scripts/test_gem_build.py +128 -0
  428. data/scripts/test_reproducible_jekyll_build.py +191 -0
  429. data/scripts/test_wheel_install.py +282 -0
  430. data/scripts/unaltraweb-docker-mount.sh +36 -0
  431. data/scripts/unaltraweb-mcp-bootstrap.sh +105 -0
  432. data/scripts/unaltraweb-mcp-cleanup.sh +73 -0
  433. data/scripts/unaltraweb-mcp-project-id.sh +34 -0
  434. data/scripts/validate_distribution.py +563 -0
  435. data/scripts/validate_workflows.py +1285 -0
  436. data/scripts/web_captures/Dockerfile +31 -0
  437. data/scripts/web_captures/capture.mjs +157 -0
  438. data/scripts/web_captures/package-lock.json +56 -0
  439. data/scripts/web_captures/package.json +9 -0
  440. data/scripts/web_captures/render.py +867 -0
  441. data/src/unaltraweb_mcp/component-contract.json +153 -0
  442. data/src/unaltraweb_mcp/component-contract.schema.json +87 -0
  443. data/src/unaltraweb_mcp/docker_mount.py +19 -0
  444. metadata +861 -0
@@ -0,0 +1,544 @@
1
+ {% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
2
+ {% assign default_lang = site.default_lang | default: site.lang %}
3
+ {% assign current_profile = site.unaltraweb.site_profile | default: 'unaltreprojecte' | slugify %}
4
+ {% assign documentation_profile = false %}
5
+ {% if current_profile == 'unaltredocs' %}
6
+ {% assign documentation_profile = true %}
7
+ {% endif %}
8
+ {% assign manual_profile = false %}
9
+ {% if current_profile == 'unaltremanual' %}
10
+ {% assign manual_profile = true %}
11
+ {% endif %}
12
+ {% assign unaltraweb_navbar_fixed = site.navbar_fixed %}
13
+ {% assign documentation_config = site.unaltraweb.documentation %}
14
+ {% assign documentation_logo = documentation_config.logo %}
15
+ {% assign documentation_logo_inverse = documentation_config.logo_inverse | default: documentation_logo %}
16
+ {% assign documentation_logo_cafe = documentation_config.logo_cafe | default: documentation_config.logo_sepia | default: documentation_logo %}
17
+ {% assign documentation_nav_title = documentation_config.nav_title | default: documentation_config.short_title | default: site.short_title | default: site.acronym | default: site.title %}
18
+ {% assign manual_config = site.unaltraweb.manual %}
19
+ {% assign manual_logo = manual_config.logo %}
20
+ {% assign manual_logo_inverse = manual_config.logo_inverse | default: manual_logo %}
21
+ {% assign manual_logo_cafe = manual_config.logo_cafe | default: manual_config.logo_sepia | default: manual_logo %}
22
+ {% assign manual_nav_title = manual_config.nav_title | default: manual_config.short_title | default: site.short_title | default: site.acronym | default: site.title %}
23
+ {% assign home_candidates = site.pages | where: 'ref', 'home' | where: 'lang', current_lang %}
24
+ {% assign home_page = home_candidates | where_exp: 'candidate', 'candidate.profiles contains current_profile' | first %}
25
+ {% if home_page == nil %}
26
+ {% assign home_page = home_candidates | where_exp: 'candidate', 'candidate.profiles == nil' | first %}
27
+ {% endif %}
28
+
29
+ {% if home_page %}
30
+ {% assign home_title = home_page.title %}
31
+ {% assign home_nav_title = home_page.nav_title | default: home_page.nav_label %}
32
+ {% assign home_url = home_page.url %}
33
+ {% else %}
34
+ {% assign home_title = site.title %}
35
+ {% assign home_url = '/' | append: current_lang | append: '/' %}
36
+ {% endif %}
37
+
38
+ {% capture home_default_text %}{% include t.liquid key='header.home' default='Home' %}{% endcapture %}
39
+ {% capture toggle_navigation_text %}{% include t.liquid key='header.toggle_navigation' default='Toggle navigation' %}{% endcapture %}
40
+ {% capture current_text %}{% include t.liquid key='header.current' default='current' %}{% endcapture %}
41
+ {% capture search_text %}{% include t.liquid key='header.search' default='Search' %}{% endcapture %}
42
+ {% capture content_search_text %}{% include t.liquid key='search.content_placeholder' default='Search content' %}{% endcapture %}
43
+ {% capture content_search_results_text %}{% include t.liquid key='search.content_results' default='Search results' %}{% endcapture %}
44
+ {% capture content_search_empty_text %}{% include t.liquid key='search.content_no_results' default='No results' %}{% endcapture %}
45
+ {% capture content_search_match_text %}{% include t.liquid key='search.content_match' default='Match {current} of {total}' %}{% endcapture %}
46
+ {% capture content_search_previous_text %}{% include t.liquid key='search.content_previous' default='Previous match' %}{% endcapture %}
47
+ {% capture content_search_next_text %}{% include t.liquid key='search.content_next' default='Next match' %}{% endcapture %}
48
+ {% capture change_theme_text %}{% include t.liquid key='header.change_theme' default='Change theme' %}{% endcapture %}
49
+ {% capture language_text %}{% include t.liquid key='header.language' default='Language' %}{% endcapture %}
50
+ {% capture default_language_text %}{% include t.liquid key='header.default_language' default='default' %}{% endcapture %}
51
+ {% if documentation_profile %}
52
+ {% capture documentation_toggle_contents_text %}{% include t.liquid key='documentation.toggle_contents' default='Show or hide table of contents' %}{% endcapture %}
53
+ {% endif %}
54
+ {% if manual_profile %}
55
+ {% capture manual_toggle_contents_text %}{% include t.liquid key='manual.toggle_sidebar' default='Toggle contents' %}{% endcapture %}
56
+ {% endif %}
57
+ {% if home_nav_title == nil or home_nav_title == '' %}
58
+ {% assign home_nav_title = home_default_text | strip %}
59
+ {% endif %}
60
+ {% assign home_in_sorted_nav = false %}
61
+ {% if home_page and home_page.nav == true %}
62
+ {% assign home_in_sorted_nav = true %}
63
+ {% endif %}
64
+
65
+ <header>
66
+ <nav id="navbar" class="navbar navbar-light navbar-expand-sm {% if unaltraweb_navbar_fixed %}fixed-top{% else %}sticky-top{% endif %}" role="navigation">
67
+ <div class="container">
68
+ {% if page.ref == 'home' and site.enable_navbar_social %}
69
+ <div class="navbar-brand social">{% social_links %}</div>
70
+ {% else %}
71
+ <a class="navbar-brand title font-weight-lighter" href="{{ home_url | relative_url }}">
72
+ {% if documentation_profile and documentation_logo %}
73
+ <span class="documentation-navbar-logo-stack" aria-hidden="true">
74
+ <img class="navbar-brand-logo documentation-navbar-logo documentation-navbar-logo-light" src="{{ documentation_logo | relative_url }}" alt="">
75
+ <img class="navbar-brand-logo documentation-navbar-logo documentation-navbar-logo-dark" src="{{ documentation_logo_inverse | relative_url }}" alt="">
76
+ <img class="navbar-brand-logo documentation-navbar-logo documentation-navbar-logo-cafe" src="{{ documentation_logo_cafe | relative_url }}" alt="">
77
+ </span>
78
+ <span class="documentation-navbar-title">{{ documentation_nav_title }}</span>
79
+ {% elsif manual_profile and manual_logo %}
80
+ <span class="manual-navbar-logo-stack" aria-hidden="true">
81
+ <img class="navbar-brand-logo manual-navbar-logo manual-navbar-logo-light" src="{{ manual_logo | relative_url }}" alt="">
82
+ <img class="navbar-brand-logo manual-navbar-logo manual-navbar-logo-dark" src="{{ manual_logo_inverse | relative_url }}" alt="">
83
+ <img class="navbar-brand-logo manual-navbar-logo manual-navbar-logo-cafe" src="{{ manual_logo_cafe | relative_url }}" alt="">
84
+ </span>
85
+ <span class="manual-navbar-title">{{ manual_nav_title }}</span>
86
+ {% elsif site.title == 'blank' %}
87
+ {% if site.first_name %}
88
+ <span class="font-weight-bold">
89
+ {{- site.first_name -}}
90
+ </span>
91
+ {% endif %}
92
+ {% if site.middle_name %}
93
+ {{- site.middle_name -}}
94
+ {% endif %}
95
+ {% if site.last_name %}
96
+ {{- site.last_name -}}
97
+ {% endif %}
98
+ {% else %}
99
+ {{- site.title -}}
100
+ {% endif %}
101
+ </a>
102
+ {% endif %}
103
+
104
+ <button
105
+ class="navbar-toggler collapsed ml-auto{% if documentation_profile %} documentation-navbar-toc-toggle{% elsif manual_profile %} manual-navbar-toc-toggle{% endif %}"
106
+ type="button"
107
+ {% if documentation_profile %}
108
+ data-documentation-sidebar-toggle
109
+ aria-controls="documentation-nav"
110
+ {% elsif manual_profile %}
111
+ data-manual-sidebar-toggle
112
+ aria-controls="manual-sidebar manual-page-toc"
113
+ {% else %}
114
+ data-toggle="collapse"
115
+ data-target="#navbarNav"
116
+ aria-controls="navbarNav"
117
+ {% endif %}
118
+ aria-expanded="false"
119
+ aria-label="{% if documentation_profile %}{{ documentation_toggle_contents_text | strip }}{% elsif manual_profile %}{{ manual_toggle_contents_text | strip }}{% else %}{{ toggle_navigation_text | strip }}{% endif %}"
120
+ >
121
+ <span class="sr-only">{% if documentation_profile %}{{ documentation_toggle_contents_text | strip }}{% elsif manual_profile %}{{ manual_toggle_contents_text | strip }}{% else %}{{ toggle_navigation_text | strip }}{% endif %}</span>
122
+ <span class="icon-bar top-bar"></span>
123
+ <span class="icon-bar middle-bar"></span>
124
+ <span class="icon-bar bottom-bar"></span>
125
+ </button>
126
+
127
+ <div class="collapse navbar-collapse text-right" id="navbarNav">
128
+ <ul class="navbar-nav ml-auto flex-nowrap">
129
+ {% unless documentation_profile %}
130
+ {% unless current_profile == 'unaltremanual' or home_in_sorted_nav %}
131
+ <li class="nav-item {% if page.ref == 'home' %}active{% endif %}">
132
+ <a class="nav-link" href="{{ home_url | relative_url }}">
133
+ {{- home_nav_title -}}
134
+ {% if page.ref == 'home' %}
135
+ <span class="sr-only">({{ current_text | strip }})</span>
136
+ {% endif %}
137
+ </a>
138
+ </li>
139
+ {% endunless %}
140
+
141
+ {% assign sorted_pages = site.pages | where: 'lang', current_lang | sort: 'nav_order' %}
142
+ {% for p in sorted_pages %}
143
+ {% assign nav_feature = p.feature | default: p.ref %}
144
+ {% assign show_nav_item = true %}
145
+ {% assign nav_profiles = p.profiles | default: p.site_profiles %}
146
+ {% if nav_profiles %}
147
+ {% assign show_nav_item = false %}
148
+ {% if nav_profiles contains current_profile %}
149
+ {% assign show_nav_item = true %}
150
+ {% endif %}
151
+ {% endif %}
152
+ {% if site.unaltraweb and site.unaltraweb.features and nav_feature %}
153
+ {% assign feature_setting = site.unaltraweb.features[nav_feature] %}
154
+ {% if feature_setting == false %}
155
+ {% assign show_nav_item = false %}
156
+ {% endif %}
157
+ {% endif %}
158
+ {% if p.nav and show_nav_item and p.autogen == null %}
159
+ {% assign nav_label = p.nav_title | default: p.nav_label | default: p.title %}
160
+ {% if p.dropdown %}
161
+ {% assign has_active_child = false %}
162
+ {% for child in p.children %}
163
+ {% if page.title == child.title or page.url == child.permalink %}
164
+ {% assign has_active_child = true %}
165
+ {% endif %}
166
+ {% endfor %}
167
+ <li class="nav-item dropdown {% if page.title == p.title or has_active_child %}active{% endif %}">
168
+ <a
169
+ class="nav-link dropdown-toggle"
170
+ href="#"
171
+ id="navbarDropdown"
172
+ role="button"
173
+ data-toggle="dropdown"
174
+ aria-haspopup="true"
175
+ aria-expanded="false"
176
+ >
177
+ {{- nav_label -}}
178
+ {% if page.title == p.title or has_active_child %}
179
+ <span class="sr-only">({{ current_text | strip }})</span>
180
+ {% endif %}
181
+ </a>
182
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
183
+ {% for child in p.children %}
184
+ {% if child.title == 'divider' %}
185
+ {% unless forloop.first or forloop.last %}
186
+ <div class="dropdown-divider"></div>
187
+ {% endunless %}
188
+ {% else %}
189
+ <a
190
+ class="dropdown-item {% if page.title == child.title or page.url == child.permalink %}active{% endif %}"
191
+ href="{% if child.permalink contains '://' %}{{ child.permalink }}{% else %}{{ child.permalink | relative_url }}{% endif %}"
192
+ >
193
+ {{- child.title -}}
194
+ </a>
195
+ {% endif %}
196
+ {% endfor %}
197
+ </div>
198
+ </li>
199
+ {% else %}
200
+ {% assign parent_link = p.url | remove: 'index.html' %}
201
+ {% assign is_active = false %}
202
+ {% if page.url == p.url %}
203
+ {% assign is_active = true %}
204
+ {% elsif parent_link != '/' and page.url contains parent_link %}
205
+ {% assign is_active = true %}
206
+ {% elsif p.ref == 'blog' and page.url contains '/blog/' %}
207
+ {% assign is_active = true %}
208
+ {% endif %}
209
+
210
+ <li class="nav-item {% if is_active %}active{% endif %}">
211
+ {% if p.permalink contains '://' %}
212
+ {% assign url = p.permalink %}
213
+ {% else %}
214
+ {% assign url = p.url | remove: 'index.html' %}
215
+ {% endif %}
216
+
217
+ <a class="nav-link" href="{{ url | relative_url }}">
218
+ {{- nav_label -}}
219
+ {% if is_active %}
220
+ <span class="sr-only">({{ current_text | strip }})</span>
221
+ {% endif %}
222
+ </a>
223
+ </li>
224
+ {% endif %}
225
+ {% endif %}
226
+ {% endfor %}
227
+ {% endunless %}
228
+
229
+ {% unless current_profile == 'unaltreprojecte' or current_profile == 'unaltreselfie' %}
230
+ {% if site.search_enabled and documentation_profile == false and manual_profile == false %}
231
+ <li class="nav-item">
232
+ <button id="search-toggle" title="{{ search_text | strip }}" onclick="openSearchModal()">
233
+ <span class="nav-link">ctrl k <i class="ti ti-search"></i></span>
234
+ </button>
235
+ </li>
236
+ {% endif %}
237
+
238
+ {% if current_profile == 'unaltremanual' %}
239
+ {% capture manual_search_text %}{% include t.liquid key='manual.search_placeholder' default='Type to search' %}{% endcapture %}
240
+ {% capture manual_search_results_text %}{% include t.liquid key='manual.search_results' default='Search results' %}{% endcapture %}
241
+ {% capture manual_search_empty_text %}{% include t.liquid key='manual.search_no_results' default='No results' %}{% endcapture %}
242
+ {% capture manual_font_decrease_text %}{% include t.liquid key='manual.font_decrease' default='Decrease text size' %}{% endcapture %}
243
+ {% capture manual_font_increase_text %}{% include t.liquid key='manual.font_increase' default='Increase text size' %}{% endcapture %}
244
+ {% capture manual_font_reset_text %}{% include t.liquid key='manual.font_reset' default='Reset text size' %}{% endcapture %}
245
+ <li class="nav-item content-navbar-search documentation-navbar-search manual-navbar-search" role="search" data-content-search-box>
246
+ <label class="sr-only" for="manual-navbar-search-input">{{ manual_search_text | strip }}</label>
247
+ <span class="manual-navbar-search-icon" aria-hidden="true"><i class="ti ti-search"></i></span>
248
+ <input id="manual-navbar-search-input" class="content-search-input documentation-search-input manual-navbar-search-input" type="search" data-content-search data-content-search-url="{{ '/assets/js/content-search-index.json' | relative_url }}" data-content-search-target=".manual-main" data-content-search-empty="{{ manual_search_empty_text | strip | escape }}" data-content-search-match="{{ content_search_match_text | strip | escape }}" data-content-search-previous="{{ content_search_previous_text | strip | escape }}" data-content-search-next="{{ content_search_next_text | strip | escape }}" data-content-search-results-label="{{ manual_search_results_text | strip | escape }}" placeholder="{{ manual_search_text | strip }}" autocomplete="off" aria-controls="manual-navbar-search-results" aria-expanded="false">
249
+ <div id="manual-navbar-search-results" class="content-search-results documentation-search-results manual-navbar-search-results" data-content-search-results data-content-search-empty="{{ manual_search_empty_text | strip | escape }}" aria-live="polite" hidden>
250
+ <h2>{{ manual_search_results_text | strip }}</h2>
251
+ <ol data-content-search-list></ol>
252
+ </div>
253
+ </li>
254
+ <li class="nav-item dropdown manual-font-nav">
255
+ <a
256
+ class="nav-link dropdown-toggle manual-font-nav-toggle"
257
+ href="#"
258
+ id="navbarManualFontDropdown"
259
+ role="button"
260
+ data-toggle="dropdown"
261
+ aria-haspopup="true"
262
+ aria-expanded="false"
263
+ title="{{ manual_font_increase_text | strip }}"
264
+ >
265
+ <span aria-hidden="true">A</span>
266
+ <span class="sr-only">{{ manual_font_increase_text | strip }}</span>
267
+ </a>
268
+ <div class="dropdown-menu dropdown-menu-right manual-font-menu" aria-labelledby="navbarManualFontDropdown">
269
+ <button class="dropdown-item" type="button" data-manual-font="decrease">A- <span>{{ manual_font_decrease_text | strip }}</span></button>
270
+ <button class="dropdown-item" type="button" data-manual-font="reset">A <span>{{ manual_font_reset_text | strip }}</span></button>
271
+ <button class="dropdown-item" type="button" data-manual-font="increase">A+ <span>{{ manual_font_increase_text | strip }}</span></button>
272
+ </div>
273
+ </li>
274
+ {% endif %}
275
+
276
+ {% if documentation_profile %}
277
+ {% capture docs_search_text %}{% include t.liquid key='documentation.search_placeholder' default='Search documentation' %}{% endcapture %}
278
+ {% capture docs_search_results_text %}{% include t.liquid key='documentation.search_results' default='Search results' %}{% endcapture %}
279
+ {% capture docs_search_empty_text %}{% include t.liquid key='documentation.search_no_results' default='No results' %}{% endcapture %}
280
+ {% capture docs_font_size_text %}{% include t.liquid key='documentation.font_size' default='Text size' %}{% endcapture %}
281
+ {% capture docs_font_decrease_text %}{% include t.liquid key='documentation.font_decrease' default='Decrease text size' %}{% endcapture %}
282
+ {% capture docs_font_increase_text %}{% include t.liquid key='documentation.font_increase' default='Increase text size' %}{% endcapture %}
283
+ {% capture docs_font_reset_text %}{% include t.liquid key='documentation.font_reset' default='Reset text size' %}{% endcapture %}
284
+ <li class="nav-item content-navbar-search documentation-navbar-search" role="search" data-content-search-box>
285
+ <label class="sr-only" for="documentation-navbar-search-input">{{ docs_search_text | strip }}</label>
286
+ <span class="documentation-navbar-search-icon" aria-hidden="true"><i class="ti ti-search"></i></span>
287
+ <input id="documentation-navbar-search-input" class="content-search-input documentation-search-input" type="search" data-content-search data-content-search-url="{{ '/assets/js/content-search-index.json' | relative_url }}" data-content-search-target=".documentation-main" data-content-search-empty="{{ docs_search_empty_text | strip | escape }}" data-content-search-match="{{ content_search_match_text | strip | escape }}" data-content-search-previous="{{ content_search_previous_text | strip | escape }}" data-content-search-next="{{ content_search_next_text | strip | escape }}" data-content-search-results-label="{{ docs_search_results_text | strip | escape }}" placeholder="{{ docs_search_text | strip }}" autocomplete="off" aria-controls="documentation-navbar-search-results" aria-expanded="false">
288
+ <div id="documentation-navbar-search-results" class="content-search-results documentation-search-results" data-content-search-results data-content-search-empty="{{ docs_search_empty_text | strip | escape }}" aria-live="polite" hidden>
289
+ <h2>{{ docs_search_results_text | strip }}</h2>
290
+ <ol data-content-search-list></ol>
291
+ </div>
292
+ </li>
293
+ <li class="nav-item dropdown documentation-font-nav documentation-font-dropdown">
294
+ <a
295
+ class="nav-link dropdown-toggle documentation-font-nav-toggle"
296
+ href="#"
297
+ id="documentationFontDropdown"
298
+ role="button"
299
+ data-toggle="dropdown"
300
+ aria-haspopup="true"
301
+ aria-expanded="false"
302
+ title="{{ docs_font_size_text | strip }}"
303
+ >
304
+ <span aria-hidden="true">A</span>
305
+ <span class="sr-only">{{ docs_font_size_text | strip }}</span>
306
+ </a>
307
+ <div class="dropdown-menu dropdown-menu-right documentation-font-menu" aria-labelledby="documentationFontDropdown">
308
+ <button class="dropdown-item documentation-font-menu-item" type="button" data-documentation-font="decrease">A- <span>{{ docs_font_decrease_text | strip }}</span></button>
309
+ <button class="dropdown-item documentation-font-menu-item" type="button" data-documentation-font="reset">A <span>{{ docs_font_reset_text | strip }}</span></button>
310
+ <button class="dropdown-item documentation-font-menu-item" type="button" data-documentation-font="increase">A+ <span>{{ docs_font_increase_text | strip }}</span></button>
311
+ </div>
312
+ </li>
313
+ {% endif %}
314
+
315
+ {% if site.languages and site.languages.size > 1 %}
316
+ {% assign current_ref = page.ref | default: 'home' %}
317
+ {% assign current_lang_flag = '🏳️' %}
318
+ {% case current_lang %}
319
+ {% when 'en' %}
320
+ {% assign current_lang_flag = '🇬🇧' %}
321
+ {% when 'es' %}
322
+ {% assign current_lang_flag = '🇪🇸' %}
323
+ {% when 'ca' %}
324
+ {% assign current_lang_flag = '🇦🇩' %}
325
+ {% endcase %}
326
+ <li class="nav-item dropdown">
327
+ <a
328
+ class="nav-link dropdown-toggle"
329
+ href="#"
330
+ id="navbarLangDropdown"
331
+ role="button"
332
+ data-toggle="dropdown"
333
+ aria-haspopup="true"
334
+ aria-expanded="false"
335
+ title="{{ language_text | strip }}"
336
+ >
337
+ <span aria-hidden="true">{{ current_lang_flag }}</span>
338
+ <span class="sr-only">{{ language_text | strip }}: {{ current_lang | upcase }}</span>
339
+ </a>
340
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarLangDropdown">
341
+ {% for lang_code in site.languages %}
342
+ {% assign localized_candidates = site.pages | where: 'ref', current_ref | where: 'lang', lang_code %}
343
+ {% assign localized_page = localized_candidates | where_exp: 'candidate', 'candidate.profiles contains current_profile' | first %}
344
+ {% if localized_page == nil %}
345
+ {% assign localized_page = localized_candidates | where_exp: 'candidate', 'candidate.profiles == nil' | first %}
346
+ {% endif %}
347
+ {% if localized_page == nil %}
348
+ {% assign localized_page = site.documents | where: 'ref', current_ref | where: 'lang', lang_code | first %}
349
+ {% endif %}
350
+ {% if localized_page %}
351
+ {% assign lang_url = localized_page.url | remove: 'index.html' %}
352
+ {% else %}
353
+ {% assign fallback_home = site.pages | where: 'ref', 'home' | where: 'lang', lang_code | first %}
354
+ {% if fallback_home %}
355
+ {% assign lang_url = fallback_home.url %}
356
+ {% else %}
357
+ {% assign lang_url = '/' | append: lang_code | append: '/' %}
358
+ {% endif %}
359
+ {% endif %}
360
+
361
+ {% assign lang_label = nil %}
362
+ {% if site.data.i18n[current_lang] and site.data.i18n[current_lang].languages %}
363
+ {% assign lang_label = site.data.i18n[current_lang].languages[lang_code] %}
364
+ {% endif %}
365
+ {% if lang_label == nil and site.data.i18n[default_lang] and site.data.i18n[default_lang].languages %}
366
+ {% assign lang_label = site.data.i18n[default_lang].languages[lang_code] %}
367
+ {% endif %}
368
+ {% if lang_label == nil %}
369
+ {% assign lang_label = lang_code | upcase %}
370
+ {% endif %}
371
+
372
+ {% assign lang_flag = '🏳️' %}
373
+ {% case lang_code %}
374
+ {% when 'en' %}
375
+ {% assign lang_flag = '🇬🇧' %}
376
+ {% when 'es' %}
377
+ {% assign lang_flag = '🇪🇸' %}
378
+ {% when 'ca' %}
379
+ {% assign lang_flag = '🇦🇩' %}
380
+ {% endcase %}
381
+
382
+ <a
383
+ class="dropdown-item language-option {% if current_lang == lang_code %}active{% endif %}"
384
+ href="{{ lang_url | relative_url }}"
385
+ hreflang="{{ lang_code }}"
386
+ lang="{{ lang_code }}"
387
+ {% if current_lang == lang_code %}aria-current="page"{% endif %}
388
+ {% if default_lang == lang_code %}data-default-language="true"{% endif %}
389
+ >
390
+ <span aria-hidden="true">{{ lang_flag }}</span>
391
+ <span class="language-option-label">{{ lang_label }}</span>
392
+ {% if default_lang == lang_code %}<span class="language-default-badge">{{ default_language_text | strip }}</span>{% endif %}
393
+ </a>
394
+ {% endfor %}
395
+ </div>
396
+ </li>
397
+ {% endif %}
398
+
399
+ {% if site.enable_darkmode %}
400
+ {% if documentation_profile %}
401
+ {% capture theme_system_text %}{% include t.liquid key='documentation.theme_system' default='System' %}{% endcapture %}
402
+ {% capture theme_light_text %}{% include t.liquid key='documentation.theme_light' default='Light' %}{% endcapture %}
403
+ {% capture theme_dark_text %}{% include t.liquid key='documentation.theme_dark' default='Dark' %}{% endcapture %}
404
+ {% capture theme_cafe_text %}{% include t.liquid key='documentation.theme_cafe' default='Coffee' %}{% endcapture %}
405
+ {% endif %}
406
+ <li class="toggle-container">
407
+ <button id="light-toggle" title="{{ change_theme_text | strip }}"{% if documentation_profile %} data-theme-label-system="{{ theme_system_text | strip | escape }}" data-theme-label-light="{{ theme_light_text | strip | escape }}" data-theme-label-dark="{{ theme_dark_text | strip | escape }}" data-theme-label-cafe="{{ theme_cafe_text | strip | escape }}"{% endif %}>
408
+ <i class="ti ti-sun-moon" id="light-toggle-system"></i>
409
+ <i class="ti ti-moon-filled" id="light-toggle-dark"></i>
410
+ <i class="ti ti-sun-filled" id="light-toggle-light"></i>
411
+ <i class="ti ti-coffee" id="light-toggle-cafe"></i>
412
+ {% if documentation_profile %}<span class="sr-only" data-documentation-theme-label>{{ theme_system_text | strip }}</span>{% endif %}
413
+ </button>
414
+ </li>
415
+ {% endif %}
416
+ {% endunless %}
417
+ </ul>
418
+ </div>
419
+ {% if current_profile == 'unaltreprojecte' or current_profile == 'unaltreselfie' %}
420
+ <ul class="navbar-nav profile-navbar-utilities flex-nowrap">
421
+ <li class="nav-item content-navbar-search profile-navbar-content-search" role="search" data-content-search-box>
422
+ <label class="sr-only" for="profile-navbar-content-search-input">{{ content_search_text | strip }}</label>
423
+ <span class="content-navbar-search-icon" aria-hidden="true"><i class="ti ti-search"></i></span>
424
+ <input id="profile-navbar-content-search-input" class="content-search-input" type="search" data-content-search data-content-search-url="{{ '/assets/js/content-search-index.json' | relative_url }}" data-content-search-target="[data-content-search-root]" data-content-search-empty="{{ content_search_empty_text | strip | escape }}" data-content-search-match="{{ content_search_match_text | strip | escape }}" data-content-search-previous="{{ content_search_previous_text | strip | escape }}" data-content-search-next="{{ content_search_next_text | strip | escape }}" data-content-search-results-label="{{ content_search_results_text | strip | escape }}" placeholder="{{ content_search_text | strip }}" autocomplete="off" aria-controls="profile-navbar-content-search-results" aria-expanded="false">
425
+ <div id="profile-navbar-content-search-results" class="content-search-results" data-content-search-results data-content-search-empty="{{ content_search_empty_text | strip | escape }}" aria-live="polite" hidden>
426
+ <h2>{{ content_search_results_text | strip }}</h2>
427
+ <ol data-content-search-list></ol>
428
+ </div>
429
+ </li>
430
+ {% if site.search_enabled %}
431
+ <li class="nav-item profile-navbar-search-item">
432
+ <button id="search-toggle" title="{{ search_text | strip }}" onclick="openSearchModal()">
433
+ <span class="nav-link"><i class="ti ti-search" aria-hidden="true"></i><span class="sr-only">{{ search_text | strip }}</span></span>
434
+ </button>
435
+ </li>
436
+ {% endif %}
437
+
438
+ {% if site.languages and site.languages.size > 1 %}
439
+ {% assign current_ref = page.ref | default: 'home' %}
440
+ {% assign current_lang_flag = '🏳️' %}
441
+ {% case current_lang %}
442
+ {% when 'en' %}
443
+ {% assign current_lang_flag = '🇬🇧' %}
444
+ {% when 'es' %}
445
+ {% assign current_lang_flag = '🇪🇸' %}
446
+ {% when 'ca' %}
447
+ {% assign current_lang_flag = '🇦🇩' %}
448
+ {% endcase %}
449
+ <li class="nav-item dropdown">
450
+ <a
451
+ class="nav-link dropdown-toggle"
452
+ href="#"
453
+ id="navbarLangDropdown"
454
+ role="button"
455
+ data-toggle="dropdown"
456
+ aria-haspopup="true"
457
+ aria-expanded="false"
458
+ title="{{ language_text | strip }}"
459
+ >
460
+ <span aria-hidden="true">{{ current_lang_flag }}</span>
461
+ <span class="sr-only">{{ language_text | strip }}: {{ current_lang | upcase }}</span>
462
+ </a>
463
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarLangDropdown">
464
+ {% for lang_code in site.languages %}
465
+ {% assign localized_candidates = site.pages | where: 'ref', current_ref | where: 'lang', lang_code %}
466
+ {% assign localized_page = localized_candidates | where_exp: 'candidate', 'candidate.profiles contains current_profile' | first %}
467
+ {% if localized_page == nil %}
468
+ {% assign localized_page = localized_candidates | where_exp: 'candidate', 'candidate.profiles == nil' | first %}
469
+ {% endif %}
470
+ {% if localized_page == nil %}
471
+ {% assign localized_page = site.documents | where: 'ref', current_ref | where: 'lang', lang_code | first %}
472
+ {% endif %}
473
+ {% if localized_page %}
474
+ {% assign lang_url = localized_page.url | remove: 'index.html' %}
475
+ {% else %}
476
+ {% assign fallback_home = site.pages | where: 'ref', 'home' | where: 'lang', lang_code | first %}
477
+ {% if fallback_home %}
478
+ {% assign lang_url = fallback_home.url %}
479
+ {% else %}
480
+ {% assign lang_url = '/' | append: lang_code | append: '/' %}
481
+ {% endif %}
482
+ {% endif %}
483
+
484
+ {% assign lang_label = nil %}
485
+ {% if site.data.i18n[current_lang] and site.data.i18n[current_lang].languages %}
486
+ {% assign lang_label = site.data.i18n[current_lang].languages[lang_code] %}
487
+ {% endif %}
488
+ {% if lang_label == nil and site.data.i18n[default_lang] and site.data.i18n[default_lang].languages %}
489
+ {% assign lang_label = site.data.i18n[default_lang].languages[lang_code] %}
490
+ {% endif %}
491
+ {% if lang_label == nil %}
492
+ {% assign lang_label = lang_code | upcase %}
493
+ {% endif %}
494
+
495
+ {% assign lang_flag = '🏳️' %}
496
+ {% case lang_code %}
497
+ {% when 'en' %}
498
+ {% assign lang_flag = '🇬🇧' %}
499
+ {% when 'es' %}
500
+ {% assign lang_flag = '🇪🇸' %}
501
+ {% when 'ca' %}
502
+ {% assign lang_flag = '🇦🇩' %}
503
+ {% endcase %}
504
+
505
+ <a
506
+ class="dropdown-item language-option {% if current_lang == lang_code %}active{% endif %}"
507
+ href="{{ lang_url | relative_url }}"
508
+ hreflang="{{ lang_code }}"
509
+ lang="{{ lang_code }}"
510
+ {% if current_lang == lang_code %}aria-current="page"{% endif %}
511
+ {% if default_lang == lang_code %}data-default-language="true"{% endif %}
512
+ >
513
+ <span aria-hidden="true">{{ lang_flag }}</span>
514
+ <span class="language-option-label">{{ lang_label }}</span>
515
+ {% if default_lang == lang_code %}<span class="language-default-badge">{{ default_language_text | strip }}</span>{% endif %}
516
+ </a>
517
+ {% endfor %}
518
+ </div>
519
+ </li>
520
+ {% endif %}
521
+
522
+ {% if site.enable_darkmode %}
523
+ <li class="toggle-container">
524
+ <button id="light-toggle" title="{{ change_theme_text | strip }}">
525
+ <i class="ti ti-sun-moon" id="light-toggle-system"></i>
526
+ <i class="ti ti-moon-filled" id="light-toggle-dark"></i>
527
+ <i class="ti ti-sun-filled" id="light-toggle-light"></i>
528
+ <i class="ti ti-coffee" id="light-toggle-cafe"></i>
529
+ </button>
530
+ </li>
531
+ {% endif %}
532
+ </ul>
533
+ {% endif %}
534
+ </div>
535
+ </nav>
536
+
537
+ {% if site.enable_progressbar %}
538
+ <progress id="progress" value="0">
539
+ <div class="progress-container">
540
+ <span class="progress-bar"></span>
541
+ </div>
542
+ </progress>
543
+ {% endif %}
544
+ </header>
@@ -0,0 +1,61 @@
1
+ {% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
2
+ {% assign default_lang = site.default_lang | default: site.lang %}
3
+
4
+ {% assign localized_posts = site.posts | where: 'lang', current_lang %}
5
+ {% assign fallback_posts = site.posts | where_exp: 'post', 'post.lang == nil' %}
6
+ {% assign localized_posts = localized_posts | concat: fallback_posts %}
7
+ {% if current_lang != default_lang and localized_posts.size == fallback_posts.size %}
8
+ {% assign default_lang_posts = site.posts | where: 'lang', default_lang %}
9
+ {% assign localized_posts = default_lang_posts | concat: fallback_posts %}
10
+ {% endif %}
11
+
12
+ {% assign latest_posts = localized_posts | sort: 'date' | reverse %}
13
+ {% assign latest_posts_size = latest_posts | size %}
14
+
15
+ <div class="news">
16
+ {% if latest_posts_size > 0 %}
17
+ <div
18
+ class="table-responsive"
19
+ {% if page.latest_posts.scrollable and latest_posts_size > 3 %}
20
+ style="max-height: 60vw"
21
+ {% endif %}
22
+ >
23
+ <table class="table table-sm table-borderless">
24
+ {% if page.latest_posts.limit %}
25
+ {% assign latest_posts_limit = page.latest_posts.limit %}
26
+ {% else %}
27
+ {% assign latest_posts_limit = latest_posts_size %}
28
+ {% endif %}
29
+
30
+ {% for item in latest_posts limit: latest_posts_limit %}
31
+ <tr>
32
+ <th scope="row" style="width: 20%">{% include localized-date.liquid date=item.date format_key='date.formats.short' default_format='%Y-%m-%d' %}</th>
33
+ <td>
34
+ {% if item.redirect == blank %}
35
+ <a class="news-title" href="{{ item.url | relative_url }}">{{ item.title }}</a>
36
+ {% elsif item.redirect contains '://' %}
37
+ <a class="news-title" href="{{ item.redirect }}" target="_blank">{{ item.title }}</a>
38
+ <svg width="2rem" height="2rem" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
39
+ <path
40
+ d="M17 13.5v6H5v-12h6m3-3h6v6m0-6-9 9"
41
+ class="icon_svg-stroke"
42
+ stroke="#999"
43
+ stroke-width="1.5"
44
+ fill="none"
45
+ fill-rule="evenodd"
46
+ stroke-linecap="round"
47
+ stroke-linejoin="round"
48
+ ></path>
49
+ </svg>
50
+ {% else %}
51
+ <a class="news-title" href="{{ item.redirect | relative_url }}">{{ item.title }}</a>
52
+ {% endif %}
53
+ </td>
54
+ </tr>
55
+ {% endfor %}
56
+ </table>
57
+ </div>
58
+ {% else %}
59
+ <p>{% include t.liquid key='latest_posts.empty' default='No posts so far...' %}</p>
60
+ {% endif %}
61
+ </div>
@@ -0,0 +1,5 @@
1
+ {%- assign date_value = include.date -%}
2
+ {%- assign format_key = include.format_key | default: 'date.formats.default' -%}
3
+ {%- assign default_format = include.default_format | default: '%Y-%m-%d' -%}
4
+ {%- capture localized_date_format -%}{%- include t.liquid key=format_key default=default_format -%}{%- endcapture -%}
5
+ {{- date_value | date: localized_date_format | strip -}}
@@ -0,0 +1,2 @@
1
+ {% include manual-featured-readings.liquid %}
2
+ {% include manual-other-readings.liquid %}
@@ -0,0 +1,12 @@
1
+ {% capture manual_selected_text %}{% include t.liquid key='manual.selected_readings' default='Selected readings' %}{% endcapture %}
2
+ {% capture manual_selected_count_raw %}{% bibliography_count --query @*[manual=true && manual_selected=true] %}{% endcapture %}
3
+ {% assign manual_selected_count = manual_selected_count_raw | strip | plus: 0 %}
4
+
5
+ {% if manual_selected_count > 0 %}
6
+ <section class="manual-bibliography-section manual-featured-bibliography" aria-labelledby="manual-selected-readings-title">
7
+ <h2 id="manual-selected-readings-title">{{ manual_selected_text | strip }}</h2>
8
+ <div class="manual-bibliography publications manual-featured-bibliography-list">
9
+ {% bibliography --query @*[manual=true && manual_selected=true] --template manual-featured-bib --group_by none %}
10
+ </div>
11
+ </section>
12
+ {% endif %}
@@ -0,0 +1,12 @@
1
+ {% capture manual_more_text %}{% include t.liquid key='manual.more_readings' default='More readings' %}{% endcapture %}
2
+ {% capture manual_more_count_raw %}{% bibliography_count --query @*[manual=true && manual_selected=false] %}{% endcapture %}
3
+ {% assign manual_more_count = manual_more_count_raw | strip | plus: 0 %}
4
+
5
+ {% if manual_more_count > 0 %}
6
+ <section class="manual-bibliography-section manual-more-bibliography" aria-labelledby="manual-more-readings-title">
7
+ <h2 id="manual-more-readings-title">{{ manual_more_text | strip }}</h2>
8
+ <div class="manual-bibliography publications manual-other-bibliography">
9
+ {% bibliography --query @*[manual=true && manual_selected=false] --template manual-bib --group_by none %}
10
+ </div>
11
+ </section>
12
+ {% endif %}