jekyll-theme-modootoday 1.0.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 (352) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +182 -0
  3. data/LICENSE +21 -0
  4. data/README.ko.md +115 -0
  5. data/README.md +112 -0
  6. data/RULES.md +120 -0
  7. data/_includes/footer-custom.html +5 -0
  8. data/_includes/head-custom.html +1 -0
  9. data/_includes/modootoday/actions.html +17 -0
  10. data/_includes/modootoday/archive-years.html +30 -0
  11. data/_includes/modootoday/archive.html +44 -0
  12. data/_includes/modootoday/blog/card.html +23 -0
  13. data/_includes/modootoday/blog/config.html +17 -0
  14. data/_includes/modootoday/blog/list.html +13 -0
  15. data/_includes/modootoday/blog/pager.html +15 -0
  16. data/_includes/modootoday/blog/reading-time.html +10 -0
  17. data/_includes/modootoday/blog/select.html +18 -0
  18. data/_includes/modootoday/brand/icon.html +39 -0
  19. data/_includes/modootoday/brand/logo.html +7 -0
  20. data/_includes/modootoday/breadcrumb.html +22 -0
  21. data/_includes/modootoday/config.html +41 -0
  22. data/_includes/modootoday/detail/cover.html +5 -0
  23. data/_includes/modootoday/detail/cta.html +13 -0
  24. data/_includes/modootoday/detail/facts.html +31 -0
  25. data/_includes/modootoday/detail/jsonld.html +34 -0
  26. data/_includes/modootoday/directory/date-tile.html +2 -0
  27. data/_includes/modootoday/directory/filter.html +7 -0
  28. data/_includes/modootoday/directory/ics.html +17 -0
  29. data/_includes/modootoday/directory/item.html +18 -0
  30. data/_includes/modootoday/directory/items.html +4 -0
  31. data/_includes/modootoday/directory/jsonld.html +5 -0
  32. data/_includes/modootoday/directory/list.html +16 -0
  33. data/_includes/modootoday/directory/values.html +6 -0
  34. data/_includes/modootoday/doc/page-actions.html +15 -0
  35. data/_includes/modootoday/doc/pagination.html +24 -0
  36. data/_includes/modootoday/doc/sidebar-item.html +11 -0
  37. data/_includes/modootoday/doc/sidebar.html +28 -0
  38. data/_includes/modootoday/doc/twin.html +8 -0
  39. data/_includes/modootoday/docs-extra/head.html +7 -0
  40. data/_includes/modootoday/docs-extra/jsonld.html +19 -0
  41. data/_includes/modootoday/head-meta.html +90 -0
  42. data/_includes/modootoday/home-url.html +4 -0
  43. data/_includes/modootoday/i18n/ar.html +2 -0
  44. data/_includes/modootoday/i18n/de.html +2 -0
  45. data/_includes/modootoday/i18n/el.html +2 -0
  46. data/_includes/modootoday/i18n/es.html +2 -0
  47. data/_includes/modootoday/i18n/fa.html +2 -0
  48. data/_includes/modootoday/i18n/fr.html +2 -0
  49. data/_includes/modootoday/i18n/id.html +2 -0
  50. data/_includes/modootoday/i18n/it.html +2 -0
  51. data/_includes/modootoday/i18n/ja.html +2 -0
  52. data/_includes/modootoday/i18n/ko.html +2 -0
  53. data/_includes/modootoday/i18n/ml.html +2 -0
  54. data/_includes/modootoday/i18n/name.html +2 -0
  55. data/_includes/modootoday/i18n/pl.html +2 -0
  56. data/_includes/modootoday/i18n/pt-BR.html +2 -0
  57. data/_includes/modootoday/i18n/ro.html +2 -0
  58. data/_includes/modootoday/i18n/ru.html +2 -0
  59. data/_includes/modootoday/i18n/th.html +2 -0
  60. data/_includes/modootoday/i18n/tr.html +2 -0
  61. data/_includes/modootoday/i18n/uk.html +2 -0
  62. data/_includes/modootoday/i18n/ur-Latn.html +2 -0
  63. data/_includes/modootoday/i18n/vi.html +2 -0
  64. data/_includes/modootoday/i18n/zh-CN.html +2 -0
  65. data/_includes/modootoday/i18n/zh-TW.html +2 -0
  66. data/_includes/modootoday/i18n.html +163 -0
  67. data/_includes/modootoday/jsonld/article.html +15 -0
  68. data/_includes/modootoday/jsonld/author.html +8 -0
  69. data/_includes/modootoday/jsonld/breadcrumb.html +17 -0
  70. data/_includes/modootoday/jsonld/entity.html +16 -0
  71. data/_includes/modootoday/jsonld/graph.html +24 -0
  72. data/_includes/modootoday/jsonld/profile.html +20 -0
  73. data/_includes/modootoday/jsonld/props.html +13 -0
  74. data/_includes/modootoday/jsonld/publisher.html +11 -0
  75. data/_includes/modootoday/jsonld/type.html +29 -0
  76. data/_includes/modootoday/jsonld/webpage.html +17 -0
  77. data/_includes/modootoday/jsonld/website.html +9 -0
  78. data/_includes/modootoday/lang-switch.html +31 -0
  79. data/_includes/modootoday/link.html +3 -0
  80. data/_includes/modootoday/links/attrs.html +9 -0
  81. data/_includes/modootoday/links/content.html +16 -0
  82. data/_includes/modootoday/markdown/c/details.html +6 -0
  83. data/_includes/modootoday/markdown/c/faq.html +2 -0
  84. data/_includes/modootoday/markdown/c/filetree.html +3 -0
  85. data/_includes/modootoday/markdown/c/gallery.html +5 -0
  86. data/_includes/modootoday/markdown/c/linkcards.html +2 -0
  87. data/_includes/modootoday/markdown/c/params.html +3 -0
  88. data/_includes/modootoday/markdown/c/pricing.html +10 -0
  89. data/_includes/modootoday/markdown/c/quote.html +6 -0
  90. data/_includes/modootoday/markdown/c/subscribe.html +6 -0
  91. data/_includes/modootoday/markdown/components.html +114 -0
  92. data/_includes/modootoday/markdown/inline.html +46 -0
  93. data/_includes/modootoday/markdown/llms-pages.html +14 -0
  94. data/_includes/modootoday/markdown/raw-body.html +6 -0
  95. data/_includes/modootoday/markdown/sections.html +43 -0
  96. data/_includes/modootoday/marketing/head.html +6 -0
  97. data/_includes/modootoday/meta/byline.html +24 -0
  98. data/_includes/modootoday/meta/post-nav.html +16 -0
  99. data/_includes/modootoday/meta/related.html +20 -0
  100. data/_includes/modootoday/meta/series.html +11 -0
  101. data/_includes/modootoday/meta/share.html +4 -0
  102. data/_includes/modootoday/nav.html +19 -0
  103. data/_includes/modootoday/news/badge.html +4 -0
  104. data/_includes/modootoday/news/front.html +30 -0
  105. data/_includes/modootoday/news/notes.html +10 -0
  106. data/_includes/modootoday/page-meta.html +16 -0
  107. data/_includes/modootoday/pages/error.html +13 -0
  108. data/_includes/modootoday/pages/hero/scene.html +27 -0
  109. data/_includes/modootoday/pages/hero/sparks.html +6 -0
  110. data/_includes/modootoday/pages/hero.html +11 -0
  111. data/_includes/modootoday/pages/search-form.html +14 -0
  112. data/_includes/modootoday/search.json +11 -0
  113. data/_includes/modootoday/stylesheets.html +36 -0
  114. data/_includes/modootoday/t.html +7 -0
  115. data/_includes/modootoday/theme-color.html +19 -0
  116. data/_includes/modootoday/toc.html +17 -0
  117. data/_includes/modootoday/tokens.html +11 -0
  118. data/_includes/sections/showcase.html +18 -0
  119. data/_layouts/archive.html +6 -0
  120. data/_layouts/author.html +19 -0
  121. data/_layouts/blog.html +28 -0
  122. data/_layouts/book.html +21 -0
  123. data/_layouts/brand.html +21 -0
  124. data/_layouts/case-study.html +5 -0
  125. data/_layouts/changelog.html +24 -0
  126. data/_layouts/contact.html +27 -0
  127. data/_layouts/course.html +21 -0
  128. data/_layouts/default.html +87 -0
  129. data/_layouts/detail.html +31 -0
  130. data/_layouts/directory.html +12 -0
  131. data/_layouts/doc.html +27 -0
  132. data/_layouts/download.html +21 -0
  133. data/_layouts/episode.html +5 -0
  134. data/_layouts/error.html +7 -0
  135. data/_layouts/event.html +5 -0
  136. data/_layouts/events.html +6 -0
  137. data/_layouts/feature.html +18 -0
  138. data/_layouts/feed.html +35 -0
  139. data/_layouts/glossary.html +24 -0
  140. data/_layouts/home.html +7 -0
  141. data/_layouts/hub.html +16 -0
  142. data/_layouts/integrations.html +7 -0
  143. data/_layouts/job.html +5 -0
  144. data/_layouts/jobs.html +7 -0
  145. data/_layouts/legal.html +21 -0
  146. data/_layouts/links.html +18 -0
  147. data/_layouts/llms-full.html +8 -0
  148. data/_layouts/llms.html +32 -0
  149. data/_layouts/minimal.html +8 -0
  150. data/_layouts/news-article.html +6 -0
  151. data/_layouts/news.html +22 -0
  152. data/_layouts/portfolio.html +7 -0
  153. data/_layouts/post.html +54 -0
  154. data/_layouts/pricing.html +32 -0
  155. data/_layouts/project.html +5 -0
  156. data/_layouts/redirect.html +21 -0
  157. data/_layouts/reference.html +24 -0
  158. data/_layouts/resume.html +50 -0
  159. data/_layouts/roadmap.html +22 -0
  160. data/_layouts/search.html +8 -0
  161. data/_layouts/sponsors.html +7 -0
  162. data/_layouts/team.html +7 -0
  163. data/_layouts/twin.html +2 -0
  164. data/_layouts/wide.html +7 -0
  165. data/_sass/modootoday/_access.scss +12 -0
  166. data/_sass/modootoday/_core.scss +18 -0
  167. data/_sass/modootoday/_settings.scss +5 -0
  168. data/_sass/modootoday/_sheet.scss +6 -0
  169. data/_sass/modootoday/base/_bidi.scss +8 -0
  170. data/_sass/modootoday/base/_code.scss +18 -0
  171. data/_sass/modootoday/base/_interaction.scss +6 -0
  172. data/_sass/modootoday/base/_prose.scss +32 -0
  173. data/_sass/modootoday/base/_reset.scss +14 -0
  174. data/_sass/modootoday/base/_table.scss +8 -0
  175. data/_sass/modootoday/blog/_article.scss +27 -0
  176. data/_sass/modootoday/blog/_cards.scss +36 -0
  177. data/_sass/modootoday/blog/_index.scss +10 -0
  178. data/_sass/modootoday/blog/_news.scss +26 -0
  179. data/_sass/modootoday/blog/_post.scss +9 -0
  180. data/_sass/modootoday/components/core/chrome/_banner.scss +7 -0
  181. data/_sass/modootoday/components/core/chrome/_breadcrumb.scss +10 -0
  182. data/_sass/modootoday/components/core/chrome/_nav.scss +39 -0
  183. data/_sass/modootoday/components/core/chrome/_pagination.scss +10 -0
  184. data/_sass/modootoday/components/core/chrome/_theme-toggle.scss +16 -0
  185. data/_sass/modootoday/components/core/inline/_badge.scss +15 -0
  186. data/_sass/modootoday/components/core/inline/_callout.scss +14 -0
  187. data/_sass/modootoday/components/core/inline/_code-copy.scss +11 -0
  188. data/_sass/modootoday/components/core/inline/_code.scss +11 -0
  189. data/_sass/modootoday/components/core/inline/_cta.scss +11 -0
  190. data/_sass/modootoday/components/core/inline/_embed.scss +6 -0
  191. data/_sass/modootoday/components/core/inline/_figure.scss +9 -0
  192. data/_sass/modootoday/components/core/inline/_footnotes.scss +6 -0
  193. data/_sass/modootoday/components/core/inline/_hero.scss +8 -0
  194. data/_sass/modootoday/components/core/inline/_kbd.scss +6 -0
  195. data/_sass/modootoday/components/core/inline/_progress.scss +8 -0
  196. data/_sass/modootoday/components/doc/_page-actions.scss +10 -0
  197. data/_sass/modootoday/components/doc/_sidebar.scss +31 -0
  198. data/_sass/modootoday/components/doc/_toc.scss +19 -0
  199. data/_sass/modootoday/components/loading/_loading.scss +33 -0
  200. data/_sass/modootoday/components/search/_search.scss +36 -0
  201. data/_sass/modootoday/components/section/showcase/_card.scss +15 -0
  202. data/_sass/modootoday/components/section/showcase/_cta.scss +7 -0
  203. data/_sass/modootoday/components/section/showcase/_gallery.scss +15 -0
  204. data/_sass/modootoday/components/section/showcase/_linkcards.scss +12 -0
  205. data/_sass/modootoday/components/section/showcase/_pricing.scss +12 -0
  206. data/_sass/modootoday/components/section/showcase/_quote.scss +7 -0
  207. data/_sass/modootoday/components/section/showcase/_subscribe.scss +9 -0
  208. data/_sass/modootoday/components/section/structure/_accordion.scss +15 -0
  209. data/_sass/modootoday/components/section/structure/_details.scss +15 -0
  210. data/_sass/modootoday/components/section/structure/_faq.scss +5 -0
  211. data/_sass/modootoday/components/section/structure/_filetree.scss +13 -0
  212. data/_sass/modootoday/components/section/structure/_params.scss +8 -0
  213. data/_sass/modootoday/components/section/structure/_steps.scss +13 -0
  214. data/_sass/modootoday/components/section/structure/_tabs.scss +21 -0
  215. data/_sass/modootoday/components/section/structure/_timeline.scss +10 -0
  216. data/_sass/modootoday/detail/_index.scss +8 -0
  217. data/_sass/modootoday/detail/_page.scss +25 -0
  218. data/_sass/modootoday/directory/_filter.scss +12 -0
  219. data/_sass/modootoday/directory/_grid.scss +18 -0
  220. data/_sass/modootoday/directory/_index.scss +11 -0
  221. data/_sass/modootoday/directory/_presets.scss +16 -0
  222. data/_sass/modootoday/docs-extra/_index.scss +7 -0
  223. data/_sass/modootoday/docs-extra/_page.scss +37 -0
  224. data/_sass/modootoday/hero/_index.scss +6 -0
  225. data/_sass/modootoday/hero/_layout.scss +28 -0
  226. data/_sass/modootoday/hero/_scene.scss +20 -0
  227. data/_sass/modootoday/kit/_button.scss +8 -0
  228. data/_sass/modootoday/layout/_page-meta.scss +9 -0
  229. data/_sass/modootoday/layout/_safe-area.scss +9 -0
  230. data/_sass/modootoday/layout/_shell.scss +56 -0
  231. data/_sass/modootoday/marketing/_forms.scss +11 -0
  232. data/_sass/modootoday/marketing/_index.scss +10 -0
  233. data/_sass/modootoday/marketing/_page.scss +31 -0
  234. data/_sass/modootoday/marketing/_pricing.scss +15 -0
  235. data/_sass/modootoday/pages/_actions.scss +11 -0
  236. data/_sass/modootoday/pages/_error.scss +7 -0
  237. data/_sass/modootoday/pages/_index.scss +11 -0
  238. data/_sass/modootoday/pages/_legal.scss +17 -0
  239. data/_sass/modootoday/pages/_search.scss +9 -0
  240. data/_sass/modootoday/pages/_shells.scss +11 -0
  241. data/_sass/modootoday/resume/_index.scss +5 -0
  242. data/_sass/modootoday/resume/_page.scss +27 -0
  243. data/_sass/modootoday/tokens/_emit.scss +15 -0
  244. data/_sass/modootoday/tokens/_primitive.scss +18 -0
  245. data/_sass/modootoday/tokens/_semantic.scss +37 -0
  246. data/_sass/modootoday/tools/_functions.scss +2 -0
  247. data/_sass/modootoday/tools/_img-dark.scss +12 -0
  248. data/_sass/modootoday/tools/_mixins.scss +8 -0
  249. data/_sass/modootoday.scss +40 -0
  250. data/assets/css/modootoday/doc.scss +10 -0
  251. data/assets/css/modootoday/loading.scss +8 -0
  252. data/assets/css/modootoday/search.scss +8 -0
  253. data/assets/css/modootoday/showcase/card.scss +7 -0
  254. data/assets/css/modootoday/showcase/cta.scss +7 -0
  255. data/assets/css/modootoday/showcase/gallery.scss +7 -0
  256. data/assets/css/modootoday/showcase/linkcards.scss +7 -0
  257. data/assets/css/modootoday/showcase/pricing.scss +7 -0
  258. data/assets/css/modootoday/showcase/quote.scss +7 -0
  259. data/assets/css/modootoday/showcase/subscribe.scss +7 -0
  260. data/assets/css/modootoday/structure/accordion.scss +7 -0
  261. data/assets/css/modootoday/structure/details.scss +7 -0
  262. data/assets/css/modootoday/structure/faq.scss +7 -0
  263. data/assets/css/modootoday/structure/filetree.scss +7 -0
  264. data/assets/css/modootoday/structure/params.scss +7 -0
  265. data/assets/css/modootoday/structure/steps.scss +7 -0
  266. data/assets/css/modootoday/structure/tabs.scss +7 -0
  267. data/assets/css/modootoday/structure/timeline.scss +7 -0
  268. data/assets/css/modootoday-blog.scss +7 -0
  269. data/assets/css/modootoday-detail.scss +7 -0
  270. data/assets/css/modootoday-directory.scss +7 -0
  271. data/assets/css/modootoday-docs-extra.scss +7 -0
  272. data/assets/css/modootoday-hero.scss +7 -0
  273. data/assets/css/modootoday-marketing.scss +7 -0
  274. data/assets/css/modootoday-pages.scss +7 -0
  275. data/assets/css/modootoday-resume.scss +7 -0
  276. data/assets/css/modootoday.scss +17 -0
  277. data/assets/js/modootoday/accordion.js +13 -0
  278. data/assets/js/modootoday/code-copy.js +29 -0
  279. data/assets/js/modootoday/menu.js +19 -0
  280. data/assets/js/modootoday/scroll-region.js +14 -0
  281. data/assets/js/modootoday/search-keys.js +18 -0
  282. data/assets/js/modootoday/search.js +31 -0
  283. data/assets/js/modootoday/share.js +16 -0
  284. data/assets/js/modootoday/tabs.js +26 -0
  285. data/assets/js/modootoday/theme-init.js +2 -0
  286. data/assets/js/modootoday/theme-toggle.js +17 -0
  287. data/assets/modootoday/apple-touch-icon.png +0 -0
  288. data/assets/modootoday/favicon-32.png +0 -0
  289. data/assets/modootoday/favicon.svg +1 -0
  290. data/assets/modootoday/hero/dawn-1280.webp +0 -0
  291. data/assets/modootoday/hero/dawn-640.webp +0 -0
  292. data/assets/modootoday/hero/dawn-960.webp +0 -0
  293. data/exe/modootoday-check +7 -0
  294. data/i18n/ar.yml +130 -0
  295. data/i18n/de.yml +130 -0
  296. data/i18n/el.yml +130 -0
  297. data/i18n/en.yml +131 -0
  298. data/i18n/es.yml +130 -0
  299. data/i18n/fa.yml +130 -0
  300. data/i18n/fr.yml +130 -0
  301. data/i18n/glossary.yml +61 -0
  302. data/i18n/id.yml +130 -0
  303. data/i18n/it.yml +130 -0
  304. data/i18n/ja.yml +130 -0
  305. data/i18n/ko.yml +130 -0
  306. data/i18n/languages.yml +25 -0
  307. data/i18n/ml.yml +130 -0
  308. data/i18n/pl.yml +130 -0
  309. data/i18n/pt-BR.yml +130 -0
  310. data/i18n/ro.yml +130 -0
  311. data/i18n/ru.yml +130 -0
  312. data/i18n/th.yml +130 -0
  313. data/i18n/tr.yml +130 -0
  314. data/i18n/uk.yml +130 -0
  315. data/i18n/ur-Latn.yml +130 -0
  316. data/i18n/vi.yml +130 -0
  317. data/i18n/zh-CN.yml +130 -0
  318. data/i18n/zh-TW.yml +130 -0
  319. data/lib/jekyll-theme-modootoday.rb +59 -0
  320. data/lib/modootoday/check/a11y/content.rb +57 -0
  321. data/lib/modootoday/check/a11y/new_window.rb +64 -0
  322. data/lib/modootoday/check/blog.rb +72 -0
  323. data/lib/modootoday/check/build_output.rb +39 -0
  324. data/lib/modootoday/check/built_parts.rb +40 -0
  325. data/lib/modootoday/check/cli.rb +61 -0
  326. data/lib/modootoday/check/component_rules.rb +54 -0
  327. data/lib/modootoday/check/context.rb +41 -0
  328. data/lib/modootoday/check/gh_render.rb +21 -0
  329. data/lib/modootoday/check/github_pages.rb +23 -0
  330. data/lib/modootoday/check/i18n.rb +92 -0
  331. data/lib/modootoday/check/layouts/detail.rb +52 -0
  332. data/lib/modootoday/check/layouts/directory.rb +36 -0
  333. data/lib/modootoday/check/layouts/docs_extra.rb +84 -0
  334. data/lib/modootoday/check/layouts/marketing.rb +64 -0
  335. data/lib/modootoday/check/layouts/shape.rb +38 -0
  336. data/lib/modootoday/check/layouts/shells.rb +47 -0
  337. data/lib/modootoday/check/layouts.rb +37 -0
  338. data/lib/modootoday/check/markdown.rb +39 -0
  339. data/lib/modootoday/check/page_sections.rb +72 -0
  340. data/lib/modootoday/check/page_syntax.rb +104 -0
  341. data/lib/modootoday/check/page_values.rb +30 -0
  342. data/lib/modootoday/check/pages.rb +31 -0
  343. data/lib/modootoday/check/registry.rb +69 -0
  344. data/lib/modootoday/check/site_config.rb +74 -0
  345. data/lib/modootoday/check/slots.rb +50 -0
  346. data/lib/modootoday/check/structured_data.rb +97 -0
  347. data/lib/modootoday/check/stylesheets.rb +28 -0
  348. data/lib/modootoday/check/twins.rb +69 -0
  349. data/lib/modootoday/check.rb +22 -0
  350. data/lib/modootoday/schema/rules.rb +49 -0
  351. data/lib/modootoday/schema/vocab.txt +2478 -0
  352. metadata +420 -0
@@ -0,0 +1,5 @@
1
+ {%- comment -%}Override this file in your site to add a footer before </body> (e.g. <footer class="mt-footer"><div class="mt-footer-inner">…</div></footer>).
2
+ With modootoday.language_switcher: footer and no override, the theme renders a small footer with the language switcher.{%- endcomment -%}
3
+ {%- if site.modootoday.language_switcher == "footer" and site.modootoday.languages %}
4
+ <footer class="mt-footer"><div class="mt-footer-inner">{% include modootoday/lang-switch.html %}</div></footer>
5
+ {%- endif %}
@@ -0,0 +1 @@
1
+ {%- comment -%}Override this file in your site to add tags to <head> (fonts, analytics, extra CSS).{%- endcomment -%}
@@ -0,0 +1,17 @@
1
+ {%- comment -%}Marks top-level paragraphs that hold only links (and whitespace) as action rows:
2
+ <p> → <p class="mt-actions">. Paragraphs with any other text, and paragraphs nested in alerts,
3
+ lists or quotes (indented by kramdown), are left alone. Usage: include modootoday/actions.html with html=HTML{%- endcomment -%}
4
+ {%- assign _anl = "
5
+ " -%}
6
+ {%- assign _ap = include.html | prepend: _anl | split: "
7
+ <p>" -%}
8
+ {%- capture _aout -%}{{ _ap[0] }}{%- for _x in _ap offset: 1 -%}
9
+ {%- assign _body = _x | split: "</p>" | first -%}{%- assign _ok = false -%}
10
+ {%- assign _b = _body | strip -%}
11
+ {%- assign _b1 = _b | slice: 0, 3 -%}{%- assign _blen = _b | size | minus: 4 -%}{%- assign _b2 = _b | slice: _blen, 4 -%}
12
+ {%- if _b1 == "<a " and _b2 == "</a>" -%}{%- assign _ok = true -%}
13
+ {%- assign _segs = _b | split: "</a>" -%}
14
+ {%- for _sg in _segs -%}{%- assign _pre = _sg | split: "<a " | first | strip -%}{%- if _pre != "" -%}{%- assign _ok = false -%}{%- endif -%}{%- endfor -%}
15
+ {%- endif %}
16
+ <p{% if _ok %} class="mt-actions"{% endif %}>{{ _x }}{%- endfor -%}{%- endcapture -%}
17
+ {{- _aout | remove_first: _anl -}}
@@ -0,0 +1,30 @@
1
+ {%- comment -%}md-components v1 — yearly archive (Liquid only): a year index, then one section per year (id="year-YYYY"), newest first.
2
+ {% include modootoday/archive-years.html lang="ko" %} lang: as in archive.html (default page.lang or site.lang; "all" lists every post).{%- endcomment -%}
3
+ {%- assign _al = include.lang | default: page.lang | default: site.lang | default: "en" -%}
4
+ {%- assign _site_lang = site.lang | default: "en" -%}
5
+ {%- if _al == "all" -%}{%- include modootoday/i18n.html lang=_site_lang -%}{%- else -%}{%- include modootoday/i18n.html lang=_al -%}{%- endif -%}
6
+ {%- assign _afmt = mt_t_post_date_format -%}
7
+ {%- assign _aps = "" | split: "" -%}
8
+ {%- for _p in site.posts -%}{%- assign _pl = _p.lang | default: _site_lang -%}{%- if _al == "all" or _pl == _al -%}{%- assign _aps = _aps | push: _p -%}{%- endif -%}{%- endfor -%}
9
+ {%- assign _ays = _aps | group_by_exp: "p", "p.date | date: '%Y'" -%}
10
+ <div class="mt-archive" data-by="years">
11
+ {%- if _ays.size == 0 %}
12
+ <p class="mt-archive-empty">{{ mt_t_archive_empty }}</p>
13
+ {%- else %}
14
+ <nav class="mt-archive-index" aria-label="{{ mt_t_archive_years }}"><ul>
15
+ {%- for _y in _ays %}
16
+ <li><a class="mt-badge mt-badge-tag" data-variant="tag" href="#year-{{ _y.name }}">{{ _y.name }} <span class="mt-archive-count">{{ _y.size }}<span class="mt-sr-only"> {{ mt_t_archive_posts }}</span></span></a></li>
17
+ {%- endfor %}
18
+ </ul></nav>
19
+ {%- for _y in _ays %}
20
+ <section class="mt-archive-group" aria-labelledby="year-{{ _y.name }}">
21
+ <h2 id="year-{{ _y.name }}">{{ _y.name }}</h2>
22
+ <ul class="mt-archive-list">
23
+ {%- for _p in _y.items %}
24
+ <li><time datetime="{{ _p.date | date_to_xmlschema }}">{{ _p.date | date: _afmt }}</time> <a href="{{ _p.url | relative_url }}">{{ _p.title | escape }}</a></li>
25
+ {%- endfor %}
26
+ </ul>
27
+ </section>
28
+ {%- endfor %}
29
+ {%- endif %}
30
+ </div>
@@ -0,0 +1,44 @@
1
+ {%- comment -%}md-components v1 — tag/category archive (Liquid only; github-pages and Jekyll 4, no plugin).
2
+ {% include modootoday/archive.html by="tags" %} (by: tags | categories; default tags)
3
+ lang: posts of this language only (default page.lang or site.lang; a post's language is post.lang or site.lang); lang="all" lists every post.
4
+ Output: an index of terms with counts, then one section per term (id="<by>-<slugified term>") listing its posts, newest first.
5
+ One page per archive with anchors: classic GitHub Pages cannot generate a page per term.{%- endcomment -%}
6
+ {%- assign _ab = include.by | default: "tags" -%}
7
+ {%- if _ab != "categories" -%}{%- assign _ab = "tags" -%}{%- endif -%}
8
+ {%- assign _al = include.lang | default: page.lang | default: site.lang | default: "en" -%}
9
+ {%- assign _site_lang = site.lang | default: "en" -%}
10
+ {%- if _al == "all" -%}{%- include modootoday/i18n.html lang=_site_lang -%}{%- else -%}{%- include modootoday/i18n.html lang=_al -%}{%- endif -%}
11
+ {%- assign _afmt = mt_t_post_date_format -%}
12
+ {%- if _ab == "tags" -%}{%- assign _alabel = mt_t_archive_tags -%}{%- else -%}{%- assign _alabel = mt_t_archive_categories -%}{%- endif -%}
13
+ {%- assign _aunit = mt_t_archive_posts -%}
14
+ {%- assign _anames = "" | split: "" -%}
15
+ {%- for _t in site[_ab] -%}
16
+ {%- assign _n = 0 -%}
17
+ {%- for _p in _t[1] -%}{%- assign _pl = _p.lang | default: _site_lang -%}{%- if _al == "all" or _pl == _al -%}{%- assign _n = _n | plus: 1 -%}{%- endif -%}{%- endfor -%}
18
+ {%- if _n > 0 -%}{%- assign _anames = _anames | push: _t[0] -%}{%- endif -%}
19
+ {%- endfor -%}
20
+ {%- assign _anames = _anames | sort_natural -%}
21
+ <div class="mt-archive" data-by="{{ _ab }}">
22
+ {%- if _anames.size == 0 %}
23
+ <p class="mt-archive-empty">{{ mt_t_archive_empty }}</p>
24
+ {%- else %}
25
+ <nav class="mt-archive-index" aria-label="{{ _alabel }}"><ul>
26
+ {%- for _name in _anames -%}
27
+ {%- assign _n = 0 -%}
28
+ {%- for _p in site[_ab][_name] -%}{%- assign _pl = _p.lang | default: _site_lang -%}{%- if _al == "all" or _pl == _al -%}{%- assign _n = _n | plus: 1 -%}{%- endif -%}{%- endfor -%}
29
+ <li><a class="mt-badge mt-badge-tag" data-variant="tag" href="#{{ _ab }}-{{ _name | slugify }}">{% if _ab == "tags" %}{% include modootoday/brand/icon.html name="tag" size=12 %}{% else %}{% include modootoday/brand/icon.html name="folder" size=12 %}{% endif %}{{ _name }} <span class="mt-archive-count">{{ _n }}<span class="mt-sr-only"> {{ _aunit }}</span></span></a></li>
30
+ {%- endfor -%}
31
+ </ul></nav>
32
+ {%- for _name in _anames %}
33
+ {%- assign _id = _name | slugify | prepend: "-" | prepend: _ab %}
34
+ <section class="mt-archive-group" aria-labelledby="{{ _id }}">
35
+ <h2 id="{{ _id }}">{{ _name }}</h2>
36
+ <ul class="mt-archive-list">
37
+ {%- for _p in site[_ab][_name] -%}{%- assign _pl = _p.lang | default: _site_lang -%}{%- if _al == "all" or _pl == _al %}
38
+ <li><time datetime="{{ _p.date | date_to_xmlschema }}">{{ _p.date | date: _afmt }}</time> <a href="{{ _p.url | relative_url }}">{{ _p.title | escape }}</a></li>
39
+ {%- endif -%}{%- endfor %}
40
+ </ul>
41
+ </section>
42
+ {%- endfor %}
43
+ {%- endif %}
44
+ </div>
@@ -0,0 +1,23 @@
1
+ {%- comment -%}One post card (shadow _includes/modootoday/blog/card.html to restyle). Parts: data-part="cover|meta|title|excerpt|terms".
2
+ post: the post. featured: true marks the lead card. heading: h2 (default) or h3. Needs modootoday/i18n.html and blog/config.html first.{%- endcomment -%}
3
+ {%- assign _c = include.post -%}{%- assign _h = include.heading | default: "h2" -%}
4
+ {%- assign _cimg = _c.image.path | default: _c.image -%}
5
+ <article class="mt-card-post{% if include.featured %} mt-card-post-featured{% endif %}" data-part="card"{% if _c.kind == "news" or _c.layout == "news-article" %} data-kind="news"{% endif %}>
6
+ {%- if _cimg %}
7
+ <a class="mt-card-post-cover" data-part="cover" href="{{ _c.url | relative_url }}" tabindex="-1" aria-hidden="true"><img src="{{ _cimg | relative_url }}" alt=""{% if _c.image.width %} width="{{ _c.image.width }}" height="{{ _c.image.height }}"{% endif %} loading="lazy" decoding="async"></a>
8
+ {%- endif %}
9
+ <div class="mt-card-post-body">
10
+ <p class="mt-card-post-meta" data-part="meta">
11
+ {%- if include.featured %}<span class="mt-badge" data-variant="featured">{{ mt_t_blog_featured }}</span> {% endif -%}
12
+ {%- if _c.breaking %}{% include modootoday/news/badge.html kind="breaking" %} {% elsif _c.live %}{% include modootoday/news/badge.html kind="live" %} {% endif -%}
13
+ {%- if _c.categories.size > 0 %}<span class="mt-card-post-kicker">{{ _c.categories | first }}</span>{% endif -%}
14
+ <time datetime="{{ _c.date | date_to_xmlschema }}">{{ _c.date | date: mt_t_post_date_format }}</time>
15
+ {%- if mt_blog_rt %}{% include modootoday/blog/reading-time.html post=_c %}<span class="mt-card-post-rt">{{ mt_t_blog_reading_time | replace: "[n]", mt_rt }}</span>{% endif -%}
16
+ </p>
17
+ <{{ _h }} class="mt-card-post-title" data-part="title"><a href="{{ _c.url | relative_url }}">{{ _c.title | escape }}</a></{{ _h }}>
18
+ {%- if mt_blog_excerpt and include.excerpt != false %}
19
+ {%- assign _ce = _c.description | default: _c.excerpt | strip_html | normalize_whitespace | truncate: 180 -%}
20
+ {%- if _ce != "" %}<p class="mt-card-post-excerpt" data-part="excerpt">{{ _ce }}</p>{% endif -%}
21
+ {%- endif %}
22
+ </div>
23
+ </article>
@@ -0,0 +1,17 @@
1
+ {%- comment -%}Blog and news settings with defaults (Liquid only). Sets mt_blog_* variables.
2
+ site.modootoday.blog.per_page posts per list page when jekyll-paginate is off (default 10)
3
+ site.modootoday.blog.variant list | grid | magazine (default list; front matter variant: wins)
4
+ site.modootoday.blog.excerpt false hides card excerpts (default true)
5
+ site.modootoday.blog.reading_time false hides reading time (default true)
6
+ site.modootoday.blog.related number of related posts, 0 hides them (default 3)
7
+ site.modootoday.blog.share false hides the copy-link button (default true)
8
+ site.modootoday.authors false hides bylines; author data lives in _data/authors.yml
9
+ site.modootoday.news.sections category names shown as sections on a news front page{%- endcomment -%}
10
+ {%- assign _mb = site.modootoday.blog -%}
11
+ {%- assign mt_blog_per_page = _mb.per_page | default: 10 -%}
12
+ {%- assign mt_blog_variant = page.variant | default: _mb.variant | default: "list" -%}
13
+ {%- unless "list grid magazine" contains mt_blog_variant -%}{%- assign mt_blog_variant = "list" -%}{%- endunless -%}
14
+ {%- if _mb.excerpt == false -%}{%- assign mt_blog_excerpt = false -%}{%- else -%}{%- assign mt_blog_excerpt = true -%}{%- endif -%}
15
+ {%- if _mb.reading_time == false -%}{%- assign mt_blog_rt = false -%}{%- else -%}{%- assign mt_blog_rt = true -%}{%- endif -%}
16
+ {%- if _mb.share == false -%}{%- assign mt_blog_share = false -%}{%- else -%}{%- assign mt_blog_share = true -%}{%- endif -%}
17
+ {%- assign mt_blog_related = 3 -%}{%- if _mb.related != nil -%}{%- assign mt_blog_related = _mb.related -%}{%- endif -%}
@@ -0,0 +1,13 @@
1
+ {%- comment -%}A list of post cards: {% include modootoday/blog/list.html posts=mt_posts variant="grid" limit=6 offset=0 featured=true %}
2
+ variant: list | grid | magazine (default mt_blog_variant). featured: the first card is the lead. heading: card heading level.
3
+ Shadow modootoday/blog/card.html to change every card.{%- endcomment -%}
4
+ {%- assign _lv = include.variant | default: mt_blog_variant | default: "list" -%}
5
+ {%- assign _ll = include.limit | default: include.posts.size -%}{%- assign _lo = include.offset | default: 0 -%}
6
+ {%- if include.posts.size > _lo %}
7
+ <div class="mt-post-list" data-variant="{{ _lv }}">
8
+ {%- for _lp in include.posts limit: _ll offset: _lo -%}
9
+ {%- assign _lf = false -%}{%- if include.featured and forloop.first -%}{%- assign _lf = true -%}{%- endif -%}
10
+ {% include modootoday/blog/card.html post=_lp featured=_lf heading=include.heading excerpt=include.excerpt %}
11
+ {%- endfor %}
12
+ </div>
13
+ {%- endif -%}
@@ -0,0 +1,15 @@
1
+ {%- comment -%}Newer/older links for a blog index. Uses jekyll-paginate's paginator when the page is paginated
2
+ (GitHub Pages: paginate: N and paginate_path in _config.yml, index.html only); otherwise links the archive when posts were cut.{%- endcomment -%}
3
+ {%- if paginator.total_pages > 1 %}
4
+ <nav class="mt-pagination mt-pager" aria-label="{{ mt_t_pagination_label }}">
5
+ {%- if paginator.previous_page %}
6
+ <a rel="prev" href="{{ paginator.previous_page_path | relative_url }}"><small>{% include modootoday/brand/icon.html name="prev" size=14 %} {{ mt_t_blog_newer }}</small></a>
7
+ {%- endif -%}
8
+ <span class="mt-pager-count">{{ paginator.page }} / {{ paginator.total_pages }}</span>
9
+ {%- if paginator.next_page %}
10
+ <a rel="next" href="{{ paginator.next_page_path | relative_url }}"><small>{{ mt_t_blog_older }} {% include modootoday/brand/icon.html name="next" size=14 %}</small></a>
11
+ {%- endif %}
12
+ </nav>
13
+ {%- elsif include.more and include.url %}
14
+ <nav class="mt-pagination mt-pager" aria-label="{{ mt_t_pagination_label }}"><a rel="next" href="{{ include.url | relative_url }}"><small>{{ mt_t_blog_older }} {% include modootoday/brand/icon.html name="next" size=14 %}</small></a></nav>
15
+ {%- endif -%}
@@ -0,0 +1,10 @@
1
+ {%- comment -%}Sets mt_rt to the minutes needed to read include.post (front matter reading_time: wins).
2
+ Spaced scripts count words (200 a minute); ja, zh and th count characters (500 a minute).{%- endcomment -%}
3
+ {%- assign _rp = include.post -%}
4
+ {%- if _rp.reading_time -%}{%- assign mt_rt = _rp.reading_time -%}{%- else -%}
5
+ {%- assign _rtxt = _rp.content | strip_html -%}
6
+ {%- assign _rl = _rp.lang | default: site.lang | default: "en" | split: "-" | first -%}
7
+ {%- if _rl == "ja" or _rl == "zh" or _rl == "th" -%}{%- assign mt_rt = _rtxt | strip | size | divided_by: 500 -%}
8
+ {%- else -%}{%- assign mt_rt = _rtxt | number_of_words | divided_by: 200 -%}{%- endif -%}
9
+ {%- assign mt_rt = mt_rt | plus: 1 -%}
10
+ {%- endif -%}
@@ -0,0 +1,18 @@
1
+ {%- comment -%}Selects posts into mt_posts (newest first). Liquid only.
2
+ lang: language filter (default page.lang or site.lang; "all" keeps every post). A post's language is post.lang or site.lang.
3
+ category / tag / author / series: keep posts that have it. kind: news keeps posts with layout news-article or kind: news.
4
+ Drafts-like front matter hidden: true and list: false are skipped.{%- endcomment -%}
5
+ {%- assign _sl = include.lang | default: page.lang | default: site.lang | default: "en" -%}
6
+ {%- assign _sd = site.lang | default: "en" -%}
7
+ {%- assign mt_posts = "" | split: "" -%}
8
+ {%- for _p in site.posts -%}
9
+ {%- if _p.hidden == true or _p.list == false -%}{%- continue -%}{%- endif -%}
10
+ {%- assign _pl = _p.lang | default: _sd -%}
11
+ {%- if _sl != "all" and _pl != _sl -%}{%- continue -%}{%- endif -%}
12
+ {%- if include.category -%}{%- unless _p.categories contains include.category -%}{%- continue -%}{%- endunless -%}{%- endif -%}
13
+ {%- if include.tag -%}{%- unless _p.tags contains include.tag -%}{%- continue -%}{%- endunless -%}{%- endif -%}
14
+ {%- if include.series and _p.series != include.series -%}{%- continue -%}{%- endif -%}
15
+ {%- if include.author -%}{%- assign _pa = _p.authors | default: _p.author -%}{%- unless _pa contains include.author -%}{%- continue -%}{%- endunless -%}{%- endif -%}
16
+ {%- if include.kind == "news" -%}{%- unless _p.layout == "news-article" or _p.kind == "news" -%}{%- continue -%}{%- endunless -%}{%- endif -%}
17
+ {%- assign mt_posts = mt_posts | push: _p -%}
18
+ {%- endfor -%}
@@ -0,0 +1,39 @@
1
+ {%- comment -%}md-components v1 — inline SVG icon (Liquid only, no requests, CSP-safe; github-pages and Jekyll 4).
2
+ {% include modootoday/brand/icon.html name="search" %} decorative: aria-hidden="true"
3
+ {% include modootoday/brand/icon.html name="rss" label="Feed" %} labelled: role="img" + aria-label
4
+ size (default 18) sets width/height; colour is currentColor (stroke icons; "brand" is filled).
5
+ Names: globe sun moon search menu copy check external prev next chevron-right chevron-down
6
+ note tip important warning caution info danger edit rss tag folder brand
7
+ prev, next, chevron-right and external mirror in right-to-left pages (class mt-icon-flip).
8
+ Shadow this file to change or add icons.
9
+ {%- endcomment -%}
10
+ {%- assign _in = include.name -%}{%- assign _isz = include["size"] | default: 18 -%}{%- assign _ivb = "0 0 24 24" -%}{%- assign _ifill = false -%}{%- assign _iflip = false -%}
11
+ {%- capture _id -%}
12
+ {%- case _in -%}
13
+ {%- when "globe" -%}<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c2.5 2.6 3.8 5.6 3.8 9s-1.3 6.4-3.8 9c-2.5-2.6-3.8-5.6-3.8-9S9.5 5.6 12 3z"/>
14
+ {%- when "sun" -%}<circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/>
15
+ {%- when "moon" -%}<path d="M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5Z"/>
16
+ {%- when "search" -%}<circle cx="11" cy="11" r="7"/><path d="m20 20-4-4"/>
17
+ {%- when "menu" -%}<path d="M4 6h16M4 12h16M4 18h16"/>
18
+ {%- when "copy" -%}<rect x="9" y="9" width="12" height="12" rx="2"/><path d="M15 9V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h4"/>
19
+ {%- when "check" -%}<path d="m5 12 5 5 9-10"/>
20
+ {%- when "external" -%}<path d="M14 4h6v6M20 4l-9 9M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5"/>{%- assign _iflip = true -%}
21
+ {%- when "prev" -%}<path d="M19 12H5m6-6-6 6 6 6"/>{%- assign _iflip = true -%}
22
+ {%- when "next" -%}<path d="M5 12h14m-6-6 6 6-6 6"/>{%- assign _iflip = true -%}
23
+ {%- when "chevron-right" -%}<path d="m9 6 6 6-6 6"/>{%- assign _iflip = true -%}
24
+ {%- when "chevron-down" -%}<path d="m6 9 6 6 6-6"/>
25
+ {%- when "note", "info" -%}<circle cx="12" cy="12" r="9"/><path d="M12 11v5M12 8h.01"/>
26
+ {%- when "tip" -%}<path d="M9 18h6M10 21h4M12 3a6 6 0 0 0-3.5 10.9c.6.5 1 1.2 1 2V16h5v-.1c0-.8.4-1.5 1-2A6 6 0 0 0 12 3Z"/>
27
+ {%- when "important" -%}<path d="M4 4h16v12H9l-5 4ZM12 7v4M12 13.5h.01"/>
28
+ {%- when "warning" -%}<path d="M12 3 2 20h20ZM12 9v5M12 17h.01"/>
29
+ {%- when "caution", "danger" -%}<path d="M8 3h8l5 5v8l-5 5H8l-5-5V8ZM12 7.5v5M12 16h.01"/>
30
+ {%- when "edit" -%}<path d="M4 20h4L19 9l-4-4L4 16ZM13.5 6.5l4 4"/>
31
+ {%- when "rss" -%}<path d="M5 11a8 8 0 0 1 8 8M5 5a14 14 0 0 1 14 14"/><circle cx="6" cy="18" r="1"/>
32
+ {%- when "tag" -%}<path d="M3 12V4a1 1 0 0 1 1-1h8l9 9-9 9Z"/><circle cx="7.5" cy="7.5" r="1.5"/>
33
+ {%- when "folder" -%}<path d="M3 6a1 1 0 0 1 1-1h5l2 2h9a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1Z"/>
34
+ {%- when "brand" -%}<path fill-rule="evenodd" d="M256 76 412 166v180l-156 90-156-90V166Zm0 30-130 75v150l130 75 130-75V181Z"/><path fill-rule="evenodd" d="M142 247v-62h12l10 28 10-28h12v62h-11v-34l-8 24h-6l-8-24v34Zm69-63c-14 0-21 10-21 32s7 32 21 32 21-10 21-32-7-32-21-32Zm0 11c7 0 10 6 10 21s-3 21-10 21-10-6-10-21 3-21 10-21Zm26-10h18c17 0 25 10 25 31s-8 31-25 31h-18Zm11 11v40h7c9 0 14-6 14-20s-5-20-14-20Zm58-12c-14 0-21 10-21 32s7 32 21 32 21-10 21-32-7-32-21-32Zm0 11c7 0 10 6 10 21s-3 21-10 21-10-6-10-21 3-21 10-21Zm47-11c-14 0-21 10-21 32s7 32 21 32 21-10 21-32-7-32-21-32Zm0 11c7 0 10 6 10 21s-3 21-10 21-10-6-10-21 3-21 10-21ZM141 267h43v11h-16v51h-11v-51h-16Zm65-1c-14 0-21 10-21 32s7 32 21 32 21-10 21-32-7-32-21-32Zm0 11c7 0 10 6 10 21s-3 21-10 21-10-6-10-21 3-21 10-21Zm26-10h18c17 0 25 10 25 31s-8 31-25 31h-18Zm11 11v40h7c9 0 14-6 14-20s-5-20-14-20Zm52-11h13l18 62h-12l-4-15h-18l-4 15h-12Zm6 13-7 24h14Zm19-13h13l12 24 12-24h13l-19 37v25h-12v-25Z"/>{%- assign _ivb = "48 48 416 416" -%}{%- assign _ifill = true -%}
35
+ {%- endcase -%}
36
+ {%- endcapture -%}
37
+ {%- if _id != "" -%}
38
+ <svg class="mt-icon mt-icon-{{ _in }}{% if _iflip %} mt-icon-flip{% endif %}{% if include.class %} {{ include.class }}{% endif %}" viewBox="{{ _ivb }}" width="{{ _isz }}" height="{{ _isz }}"{% if _ifill %} fill="currentColor"{% else %} fill="none" stroke="currentColor" stroke-width="{{ include.stroke | default: 1.6 }}" stroke-linecap="round" stroke-linejoin="round"{% endif %}{% if include.label %} role="img" aria-label="{{ include.label | escape }}"{% else %} aria-hidden="true"{% endif %} focusable="false">{{ _id }}</svg>
39
+ {%- endif -%}
@@ -0,0 +1,7 @@
1
+ {%- comment -%}Site logo for the header (and your footers): modootoday.logo: brand (the theme's modootoday mark, in
2
+ currentColor = the brand token, so it follows light/dark) or a path to your own image (decorative, alt=""). Unset: the
3
+ header keeps its CSS square. Shadow this file to draw your own logo.{%- endcomment -%}
4
+ {%- assign _lg = site.modootoday.logo -%}{%- assign _lgs = include["size"] | default: 28 -%}
5
+ {%- if _lg == "brand" -%}{% include modootoday/brand/icon.html name="brand" size=_lgs class="mt-logo" %}
6
+ {%- elsif _lg -%}<img class="mt-logo" src="{{ _lg | relative_url }}" alt="" width="{{ _lgs }}" height="{{ _lgs }}">
7
+ {%- endif -%}
@@ -0,0 +1,22 @@
1
+ {%- comment -%}Breadcrumb from the page URL: each parent directory that is a page becomes a link.
2
+ The home crumb uses the home page short_title, then its title. Hidden on the home page (or a /<lang>/ home) and with front matter breadcrumb: false.{%- endcomment -%}
3
+ {%- if mt_components contains "breadcrumb" and page.breadcrumb != false -%}
4
+ {%- assign _segs = page.url | split: "/" -%}
5
+ {%- assign _home = "/" -%}{%- assign _start = 0 -%}
6
+ {%- if _segs[1] == _lang and _lang != site.lang -%}{%- assign _home = "/" | append: _lang | append: "/" -%}{%- assign _start = 1 -%}{%- endif -%}
7
+ {%- if page.url != _home and page.url != "/" -%}
8
+ {%- assign _hp = site.pages | where: "url", _home | first -%}
9
+ <nav class="mt-breadcrumb" aria-label="{% include modootoday/i18n.html lang=_lang %}{{ mt_t_breadcrumb_label }}"><ol>
10
+ <li><a href="{{ _home | relative_url }}">{{ _hp.short_title | default: _hp.title | default: site.title | default: "Home" }}</a></li>
11
+ {%- assign _acc = _home -%}
12
+ {%- for _s in _segs offset: 1 -%}{%- if forloop.index > _start and _s != "" and _s != "index.html" -%}
13
+ {%- assign _acc = _acc | append: _s | append: "/" -%}
14
+ {%- if _acc == page.url or forloop.last -%}
15
+ <li>{% include modootoday/brand/icon.html name="chevron-right" size=12 %}<span aria-current="page">{{ page.title | default: _s }}</span></li>
16
+ {%- else -%}{%- assign _pp = site.pages | where: "url", _acc | first -%}{%- if _pp -%}
17
+ <li>{% include modootoday/brand/icon.html name="chevron-right" size=12 %}<a href="{{ _acc | relative_url }}">{{ _pp.title | default: _s }}</a></li>
18
+ {%- endif -%}{%- endif -%}
19
+ {%- endif -%}{%- endfor %}
20
+ </ol></nav>
21
+ {%- endif -%}
22
+ {%- endif -%}
@@ -0,0 +1,41 @@
1
+ {%- comment -%}
2
+ jekyll-theme-modootoday settings with defaults. A gem theme's _config.yml is not merged on
3
+ Jekyll 3.10 / GitHub Pages, so every default lives here (Liquid). Sets mt_* variables only.
4
+ site.modootoday.color_scheme auto | light | dark | auto-dark | auto-light (default auto)
5
+ auto*: toggle shown; auto follows the system, auto-dark/auto-light start in that scheme
6
+ site.modootoday.css_layers true | false (default false)
7
+ site.modootoday.components list of component names (default: all)
8
+ site.modootoday.css split | bundle: split (default) links the core sheet plus only the sheets a page uses; bundle links one file with everything
9
+ site.modootoday.nav _data/nav/<name>.yml or _data/nav.yml (default main); _data/nav/<name>-<lang>.yml wins for that page.lang
10
+ site.modootoday.tokens / tokens_dark semantic token overrides, inline :root CSS
11
+ site.modootoday.sidebar auto | true | false: doc-page sidebar from the nav (default auto: on when the nav has a group)
12
+ site.modootoday.badges false disables status badges (default true)
13
+ {%- endcomment -%}
14
+ {%- assign mt = site.modootoday -%}
15
+ {%- assign mt_all_components = "callout,badge,hero,cta,card,tabs,code-copy,nav,sidebar,page-actions,pagination,theme-toggle,breadcrumb,toc,accordion,steps,figure,timeline,kbd,search,code,footnotes,progress,embed,banner,filetree,details,faq,params,linkcards,quote,gallery,pricing,subscribe,loading" | split: "," -%}
16
+ {%- comment -%}Sass partials by context (components/<group>/_<name>.scss). Core: always in assets/css/modootoday.css.
17
+ Section sheets: assets/css/modootoday/<group>/<name>.css, linked when a page's sections: use c (c:sheet).
18
+ Context sheets: assets/css/modootoday/<name>.css, linked by layout front matter mt_sheets (doc; blog layouts also get assets/css/modootoday-blog.css).{%- endcomment -%}
19
+ {%- assign mt_core_partials = "core/inline/callout,core/inline/badge,core/inline/kbd,core/inline/figure,core/inline/code-copy,core/inline/hero,core/inline/cta,core/inline/code,core/inline/footnotes,core/inline/progress,core/inline/embed,core/chrome/nav,core/chrome/theme-toggle,core/chrome/breadcrumb,core/chrome/pagination,core/chrome/banner" | split: "," -%}
20
+ {%- assign mt_section_sheets = "cta:showcase/cta,features:showcase/card,linkcards:showcase/linkcards,quote:showcase/quote,gallery:showcase/gallery,pricing:showcase/pricing,subscribe:showcase/subscribe,tabs:structure/tabs,accordion:structure/accordion,steps:structure/steps,timeline:structure/timeline,filetree:structure/filetree,details:structure/details,faq:structure/faq,params:structure/params" | split: "," -%}
21
+ {%- assign mt_context_sheets = "doc:sidebar|toc|page-actions,search:search,loading:loading" | split: "," -%}
22
+ {%- assign mt_components = mt_all_components -%}
23
+ {%- if mt.components -%}{%- assign mt_components = mt.components -%}{%- endif -%}
24
+ {%- assign mt_color_scheme = "auto" -%}
25
+ {%- assign _mt_cs = "light dark auto-dark auto-light" | split: " " -%}
26
+ {%- if _mt_cs contains mt.color_scheme -%}{%- assign mt_color_scheme = mt.color_scheme -%}{%- endif -%}
27
+ {%- comment -%}mt_theme_toggle: the visitor can switch; mt_theme_start: data-theme printed on <html> (none for auto).{%- endcomment -%}
28
+ {%- assign mt_theme_toggle = false -%}{%- assign mt_theme_start = mt_color_scheme | remove: "auto-" -%}
29
+ {%- if mt_color_scheme contains "auto" -%}{%- assign mt_theme_toggle = true -%}{%- endif -%}
30
+ {%- if mt_color_scheme == "auto" -%}{%- assign mt_theme_start = nil -%}{%- endif -%}
31
+ {%- if mt.css_layers == true -%}{%- assign mt_css_layers = "true" -%}{%- else -%}{%- assign mt_css_layers = "false" -%}{%- endif -%}
32
+ {%- if mt.badges == false -%}{%- assign mt_badges = false -%}{%- else -%}{%- assign mt_badges = true -%}{%- endif -%}
33
+ {%- assign mt_nav_name = mt.nav | default: "main" -%}
34
+ {%- assign mt_nav = site.data.nav[mt_nav_name] -%}
35
+ {%- assign _mt_nav_l = mt_nav_name | append: "-" | append: page.lang -%}
36
+ {%- if page.lang and site.data.nav[_mt_nav_l] -%}{%- assign mt_nav = site.data.nav[_mt_nav_l] -%}{%- endif -%}
37
+ {%- if mt_nav == nil and site.data.nav.first.url -%}{%- assign mt_nav = site.data.nav -%}{%- endif -%}
38
+ {%- assign mt_sidebar = false -%}
39
+ {%- if mt_nav and mt_components contains "sidebar" and mt.sidebar != false and page.sidebar != false -%}
40
+ {%- if mt.sidebar == true -%}{%- assign mt_sidebar = true -%}{%- else -%}{%- for _it in mt_nav -%}{%- if _it.items -%}{%- assign mt_sidebar = true -%}{%- endif -%}{%- endfor -%}{%- endif -%}
41
+ {%- endif -%}
@@ -0,0 +1,5 @@
1
+ {%- comment -%}detail cover: front matter image: <path> or {path, alt, width, height}. Above the fold, so no lazy loading.{%- endcomment -%}
2
+ {%- assign _ci = page.image.path | default: page.image -%}
3
+ {%- if _ci %}
4
+ <figure class="mt-detail-cover"><img src="{{ _ci | relative_url }}" alt="{{ page.image.alt | default: '' | escape }}"{% if page.image.width %} width="{{ page.image.width }}" height="{{ page.image.height }}"{% endif %} decoding="async" fetchpriority="high"></figure>
5
+ {%- endif %}
@@ -0,0 +1,13 @@
1
+ {%- comment -%}One call to action after the body: job apply, event tickets and calendar, or page.cta {label, url} on any kind.{%- endcomment -%}
2
+ {%- capture _a -%}
3
+ {%- if include.kind == "job" and page.apply %}<a class="mt-detail-btn" href="{{ page.apply | relative_url }}">{{ mt_t_layouts_apply }}<span class="mt-sr-only">: {{ page.title | escape }}</span></a>{% endif -%}
4
+ {%- if include.kind == "event" -%}
5
+ {%- if page.tickets %}<a class="mt-detail-btn" href="{{ page.tickets | relative_url }}">{{ mt_t_layouts_tickets }}<span class="mt-sr-only">: {{ page.title | escape }}</span></a>{% endif -%}
6
+ {%- if page.starts %}{% include modootoday/directory/ics.html title=page.title start=page.starts end=page.ends location=page.venue url=page.url %}{% endif -%}
7
+ {%- endif -%}
8
+ {%- if page.cta.url %}<a class="mt-detail-btn" href="{{ page.cta.url | relative_url }}">{{ page.cta.label }}</a>{% endif -%}
9
+ {%- endcapture -%}
10
+ {%- assign _a = _a | strip -%}
11
+ {%- if _a != "" %}
12
+ <p class="mt-detail-cta">{{ _a }}</p>
13
+ {%- endif -%}
@@ -0,0 +1,31 @@
1
+ {%- comment -%}Facts of a detail page as a description list. include.kind: project | case-study | job | event | episode.
2
+ Dates use the language's post date format; times print when the value has one.{%- endcomment -%}
3
+ {%- assign _df = mt_t_post_date_format | default: "%Y-%m-%d" -%}
4
+ {%- capture _f -%}
5
+ {%- case include.kind -%}
6
+ {%- when "project", "case-study" -%}
7
+ {%- if page.client %}<div><dt>{{ mt_t_layouts_client }}</dt><dd>{{ page.client }}</dd></div>{% endif -%}
8
+ {%- if page.role %}<div><dt>{{ mt_t_layouts_role }}</dt><dd>{{ page.role }}</dd></div>{% endif -%}
9
+ {%- if page.year %}<div><dt>{{ mt_t_layouts_year }}</dt><dd>{{ page.year }}</dd></div>{% endif -%}
10
+ {%- if page.stack %}<div><dt>{{ mt_t_layouts_stack }}</dt><dd><ul class="mt-detail-tags">{% for _s in page.stack %}<li>{{ _s }}</li>{% endfor %}</ul></dd></div>{% endif -%}
11
+ {%- if page.links %}<div><dt>{{ mt_t_layouts_links }}</dt><dd><ul class="mt-detail-links">{% for _l in page.links %}<li><a href="{% include modootoday/link.html url=_l.url %}"{% include modootoday/links/attrs.html on=_l.new_window target=_l.target url=_l.url %}>{{ _l.label }}</a></li>{% endfor %}</ul></dd></div>{% endif -%}
12
+ {%- when "job" -%}
13
+ {%- if page.location %}<div><dt>{{ mt_t_layouts_location }}</dt><dd>{{ page.location }}</dd></div>{% endif -%}
14
+ {%- if page.employment %}<div><dt>{{ mt_t_layouts_employment }}</dt><dd>{{ page.employment }}</dd></div>{% endif -%}
15
+ {%- if page.salary %}<div><dt>{{ mt_t_layouts_salary }}</dt><dd>{% if page.salary.min %}{{ page.salary.min }}{% if page.salary.max %}–{{ page.salary.max }}{% endif %} {{ page.salary.currency }}{% if page.salary.unit %} / {{ page.salary.unit | downcase }}{% endif %}{% else %}{{ page.salary }}{% endif %}</dd></div>{% endif -%}
16
+ {%- if page.date %}<div><dt>{{ mt_t_layouts_posted }}</dt><dd><time datetime="{{ page.date | date: '%Y-%m-%d' }}">{{ page.date | date: _df }}</time></dd></div>{% endif -%}
17
+ {%- if page.deadline %}<div><dt>{{ mt_t_layouts_deadline }}</dt><dd><time datetime="{{ page.deadline | date: '%Y-%m-%d' }}">{{ page.deadline | date: _df }}</time></dd></div>{% endif -%}
18
+ {%- when "event" -%}
19
+ {%- if page.starts %}<div><dt>{{ mt_t_layouts_starts }}</dt><dd><time datetime="{{ page.starts | date_to_xmlschema }}">{{ page.starts | date: _df }} {{ page.starts | date: "%H:%M" }}</time></dd></div>{% endif -%}
20
+ {%- if page.ends %}<div><dt>{{ mt_t_layouts_ends }}</dt><dd><time datetime="{{ page.ends | date_to_xmlschema }}">{{ page.ends | date: _df }} {{ page.ends | date: "%H:%M" }}</time></dd></div>{% endif -%}
21
+ {%- if page.venue %}<div><dt>{{ mt_t_layouts_venue }}</dt><dd>{{ page.venue }}{% if page.address %}<br>{{ page.address }}{% endif %}</dd></div>{% endif -%}
22
+ {%- if page.online %}<div><dt>{{ mt_t_layouts_online }}</dt><dd><a href="{{ page.online }}">{{ page.online | remove: "https://" }}</a></dd></div>{% endif -%}
23
+ {%- when "episode" -%}
24
+ {%- if page.date %}<div><dt>{{ mt_t_layouts_posted }}</dt><dd><time datetime="{{ page.date | date: '%Y-%m-%d' }}">{{ page.date | date: _df }}</time></dd></div>{% endif -%}
25
+ {%- if page.duration %}<div><dt>{{ mt_t_layouts_duration }}</dt><dd>{{ mt_t_layouts_minutes | replace: "[n]", page.duration }}</dd></div>{% endif -%}
26
+ {%- endcase -%}
27
+ {%- endcapture -%}
28
+ {%- assign _f = _f | strip -%}
29
+ {%- if _f != "" %}
30
+ <dl class="mt-detail-facts">{{ _f }}</dl>
31
+ {%- endif -%}
@@ -0,0 +1,34 @@
1
+ {%- comment -%}Main-entity properties of the detail layouts from their front matter (inside jsonld/entity.html; _ld_type set).
2
+ Each is skipped when the page's schema: map sets the same property. JobPosting: hiringOrganization (#publisher), employmentType,
3
+ validThrough, jobLocation or remote (TELECOMMUTE + applicantLocationRequirements), baseSalary. Event: startDate, endDate,
4
+ location (Place or VirtualLocation), offers. PodcastEpisode: episodeNumber, partOfSeason, datePublished, associatedMedia.
5
+ CreativeWork (project): keywords.{%- endcomment -%}
6
+ {%- assign _sc = page.schema -%}
7
+ {%- case _ld_type -%}
8
+ {%- when "JobPosting" -%}
9
+ {%- unless _sc.hiringOrganization %},"hiringOrganization":{"@id":{{ _ld_root | append: "#publisher" | jsonify }}}{% endunless -%}
10
+ {%- if page.employment and _sc.employmentType == nil %},"employmentType":{{ page.employment | upcase | replace: "-", "_" | replace: " ", "_" | jsonify }}{% endif -%}
11
+ {%- if page.deadline and _sc.validThrough == nil %},"validThrough":{{ page.deadline | date_to_xmlschema | jsonify }}{% endif -%}
12
+ {%- if page.remote -%}
13
+ {%- unless _sc.jobLocationType %},"jobLocationType":"TELECOMMUTE"{% endunless -%}
14
+ {%- unless _sc.applicantLocationRequirements %},"applicantLocationRequirements":{"@type":"Country","name":{{ page.remote | jsonify }}}{% endunless -%}
15
+ {%- elsif page.location and _sc.jobLocation == nil %},"jobLocation":{"@type":"Place","address":{{ page.address | default: page.location | jsonify }}}{% endif -%}
16
+ {%- if page.salary.min and _sc.baseSalary == nil %},"baseSalary":{"@type":"MonetaryAmount","currency":{{ page.salary.currency | jsonify }},"value":{"@type":"QuantitativeValue","minValue":{{ page.salary.min | jsonify }}{% if page.salary.max %},"maxValue":{{ page.salary.max | jsonify }}{% endif %},"unitText":{{ page.salary.unit | default: "YEAR" | upcase | jsonify }}}}{% endif -%}
17
+ {%- when "Event" -%}
18
+ {%- if page.starts and _sc.startDate == nil %},"startDate":{{ page.starts | date_to_xmlschema | jsonify }}{% endif -%}
19
+ {%- if page.ends and _sc.endDate == nil %},"endDate":{{ page.ends | date_to_xmlschema | jsonify }}{% endif -%}
20
+ {%- unless _sc.location -%}
21
+ {%- if page.venue and page.online %},"eventAttendanceMode":"https://schema.org/MixedEventAttendanceMode"{% elsif page.online %},"eventAttendanceMode":"https://schema.org/OnlineEventAttendanceMode"{% elsif page.venue %},"eventAttendanceMode":"https://schema.org/OfflineEventAttendanceMode"{% endif -%}
22
+ {%- if page.venue and page.online %},"location":[{"@type":"Place","name":{{ page.venue | jsonify }},"address":{{ page.address | default: page.venue | jsonify }}},{"@type":"VirtualLocation","url":"{% include modootoday/link.html url=page.online absolute=true %}"}]
23
+ {%- elsif page.venue %},"location":{"@type":"Place","name":{{ page.venue | jsonify }},"address":{{ page.address | default: page.venue | jsonify }}}
24
+ {%- elsif page.online %},"location":{"@type":"VirtualLocation","url":"{% include modootoday/link.html url=page.online absolute=true %}"}{% endif -%}
25
+ {%- endunless -%}
26
+ {%- if page.tickets and _sc.offers == nil %},"offers":{"@type":"Offer","url":{{ page.tickets | absolute_url | jsonify }}}{% endif -%}
27
+ {%- when "PodcastEpisode" -%}
28
+ {%- if page.episode and _sc.episodeNumber == nil %},"episodeNumber":{{ page.episode | jsonify }}{% endif -%}
29
+ {%- if page.season and _sc.partOfSeason == nil %},"partOfSeason":{"@type":"PodcastSeason","seasonNumber":{{ page.season | jsonify }}}{% endif -%}
30
+ {%- if page.date and _sc.datePublished == nil %},"datePublished":{{ page.date | date_to_xmlschema | jsonify }}{% endif -%}
31
+ {%- if page.audio and _sc.associatedMedia == nil %},"associatedMedia":{"@type":"AudioObject","contentUrl":{{ page.audio | absolute_url | jsonify }}{% if page.duration %},"duration":"PT{{ page.duration }}M"{% endif %}}{% endif -%}
32
+ {%- when "CreativeWork" -%}
33
+ {%- if page.stack and _sc.keywords == nil %},"keywords":{{ page.stack | join: ", " | jsonify }}{% endif -%}
34
+ {%- endcase -%}
@@ -0,0 +1,2 @@
1
+ {%- comment -%}Date tile for include.date: month abbreviation over the day number, with a machine-readable time.{%- endcomment -%}
2
+ <time class="mt-date-tile" datetime="{{ include.date | date_to_xmlschema }}"><span>{{ include.date | date: "%b" }}</span><b>{{ include.date | date: "%-d" }}</b><span class="mt-sr-only"> {{ include.date | date: "%Y" }}</span></time>
@@ -0,0 +1,7 @@
1
+ {%- comment -%}CSS-only filter: radio i checks show only items with class mt-f<i> (directory bundle, :has()). Works with keyboard arrows; without :has() every item stays visible.{%- endcomment -%}
2
+ <fieldset class="mt-dir-filter"><legend class="mt-sr-only">{{ mt_t_layouts_filter }}</legend>
3
+ <input class="mt-sr-only mt-f-r0" type="radio" name="{{ include.uid }}" id="{{ include.uid }}-0" checked><label for="{{ include.uid }}-0">{{ mt_t_layouts_all }}</label>
4
+ {%- for _v in include.values %}
5
+ <input class="mt-sr-only mt-f-r{{ forloop.index }}" type="radio" name="{{ include.uid }}" id="{{ include.uid }}-{{ forloop.index }}"><label for="{{ include.uid }}-{{ forloop.index }}">{{ _v }}</label>
6
+ {%- endfor %}
7
+ </fieldset>
@@ -0,0 +1,17 @@
1
+ {%- comment -%}"Add to calendar" link: an iCalendar file as a data: URL (no script, no server). include.title, start, end, location, url.{%- endcomment -%}
2
+ {%- assign _s = include.start | date: "%Y%m%dT%H%M%S" -%}{%- assign _e = include.end | default: include.start | date: "%Y%m%dT%H%M%S" -%}
3
+ {%- assign _tz = "" -%}{%- if site.timezone -%}{%- assign _tz = ";TZID=" | append: site.timezone -%}{%- endif -%}
4
+ {%- capture _ics %}BEGIN:VCALENDAR
5
+ VERSION:2.0
6
+ PRODID:-//modootoday//layouts//EN
7
+ BEGIN:VEVENT
8
+ UID:{{ _s }}-{{ include.title | slugify }}@{{ site.url | default: "localhost" | remove: "https://" | remove: "http://" }}
9
+ DTSTAMP:{{ _s }}
10
+ DTSTART{{ _tz }}:{{ _s }}
11
+ DTEND{{ _tz }}:{{ _e }}
12
+ SUMMARY:{{ include.title | strip_html | replace: ",", "\," }}
13
+ {% if include.location %}LOCATION:{{ include.location | replace: ",", "\," }}
14
+ {% endif %}{% if include.url %}URL:{% include modootoday/link.html url=include.url absolute=true %}
15
+ {% endif %}END:VEVENT
16
+ END:VCALENDAR{% endcapture -%}
17
+ <a class="mt-ics" download="{{ include.title | slugify | default: 'event' }}.ics" href="data:text/calendar;charset=utf-8,{{ _ics | strip | url_encode | replace: '+', '%20' | replace: '%0A', '%0D%0A' }}">{{ mt_t_layouts_calendar }}<span class="mt-sr-only">: {{ include.title }}</span></a>
@@ -0,0 +1,18 @@
1
+ {%- comment -%}One directory card. include.it: title|name, url, text, image, alt, plus preset fields (role; location, type; date, end, location; tier; category). include.cls: filter classes.{%- endcomment -%}
2
+ {%- assign _it = include.it -%}{%- assign _p = include.preset -%}{%- assign _name = _it.title | default: _it.name -%}
3
+ <li class="mt-dir-item{{ include.cls }}">
4
+ {%- if _p == "events" and _it.date %}{% include modootoday/directory/date-tile.html date=_it.date %}{% endif %}
5
+ {%- if _it.image %}<img class="mt-dir-img" src="{% include modootoday/link.html url=_it.image %}" alt="{{ _it.alt | default: '' }}"{% if _it.width %} width="{{ _it.width }}" height="{{ _it.height }}"{% endif %} loading="lazy" decoding="async">{% endif %}
6
+ <div class="mt-dir-body">
7
+ <h2 class="mt-dir-title">{% if _it.url %}<a href="{% include modootoday/link.html url=_it.url %}"{% include modootoday/links/attrs.html on=_it.new_window target=_it.target url=_it.url %}>{{ _name }}</a>{% else %}{{ _name }}{% endif %}</h2>
8
+ {%- assign _meta = _it.role | default: _it.subtitle -%}
9
+ {%- if _p == "jobs" %}{% assign _meta = _it.location %}{% if _it.type %}{% if _meta %}{% assign _meta = _meta | append: " · " | append: _it.type %}{% else %}{% assign _meta = _it.type %}{% endif %}{% endif %}{% endif %}
10
+ {%- if _p == "events" %}{% assign _meta = _it.location %}{% endif %}
11
+ {%- if _p == "sponsors" %}{% assign _meta = _it.tier %}{% endif %}
12
+ {%- if _p == "integrations" %}{% assign _meta = _it.category %}{% endif %}
13
+ {%- if _meta and _meta != "" %}<p class="mt-dir-meta">{{ _meta }}</p>{% endif %}
14
+ {%- if _it.text %}<p class="mt-dir-text">{{ _it.text }}</p>{% endif %}
15
+ {%- if _it.tags and _p != "sponsors" %}<p class="mt-dir-tags">{% for t in _it.tags %}<span>{{ t }}</span>{% endfor %}</p>{% endif %}
16
+ {%- if _p == "events" and _it.date %}{% include modootoday/directory/ics.html title=_name start=_it.date end=_it.end location=_it.location url=_it.url %}{% endif %}
17
+ </div>
18
+ </li>
@@ -0,0 +1,4 @@
1
+ {%- comment -%}Sets mt_items for a directory page: front matter items:, else site.data[<data:>] (a list, or a map with an items list).{%- endcomment -%}
2
+ {%- assign mt_items = include.page.items -%}
3
+ {%- if mt_items == nil and include.page.data -%}{%- assign _d = site.data[include.page.data] -%}{%- assign mt_items = _d.items | default: _d -%}{%- endif -%}
4
+ {%- assign mt_items = mt_items | default: "" -%}
@@ -0,0 +1,5 @@
1
+ {%- comment -%}itemListElement of the #main ItemList node on directory pages (included by jsonld/entity.html): team items are
2
+ Person, events are Event (VirtualLocation when online), the rest are ListItems with name and url.{%- endcomment -%}
3
+ {%- include modootoday/directory/items.html page=page -%}
4
+ {%- assign _pre = page.preset | default: include.preset -%}{%- if _pre == "directory" -%}{%- assign _pre = "cards" -%}{%- endif -%}
5
+ ,"numberOfItems":{{ mt_items.size | default: 0 }},"itemListElement":[{% for _it in mt_items %}{% assign _n = _it.title | default: _it.name %}{"@type":"ListItem","position":{{ forloop.index }}{% if _pre == "team" %},"item":{"@type":"Person","name":{{ _n | jsonify }}{% if _it.role %},"jobTitle":{{ _it.role | jsonify }}{% endif %}{% if _it.image %},"image":"{% include modootoday/link.html url=_it.image absolute=true %}"{% endif %}{% if _it.url %},"url":"{% include modootoday/link.html url=_it.url absolute=true %}"{% endif %}}{% elsif _pre == "events" and _it.date %},"item":{"@type":"Event","name":{{ _n | jsonify }},"startDate":{{ _it.date | date_to_xmlschema | jsonify }}{% if _it.end %},"endDate":{{ _it.end | date_to_xmlschema | jsonify }}{% endif %}{% if _it.online %},"eventAttendanceMode":"https://schema.org/OnlineEventAttendanceMode","location":{"@type":"VirtualLocation","url":"{% include modootoday/link.html url=_it.url absolute=true %}"}{% elsif _it.location %},"eventAttendanceMode":"https://schema.org/OfflineEventAttendanceMode","location":{"@type":"Place","name":{{ _it.location | jsonify }}}{% endif %}{% if _it.url %},"url":"{% include modootoday/link.html url=_it.url absolute=true %}"{% endif %}}{% else %},"name":{{ _n | jsonify }}{% if _it.url %},"url":"{% include modootoday/link.html url=_it.url absolute=true %}"{% endif %}{% endif %}}{% unless forloop.last %},{% endunless %}{% endfor %}]
@@ -0,0 +1,16 @@
1
+ {%- comment -%}Directory engine: card grid for include.items with preset include.preset (cards, portfolio, team, jobs, events, sponsors,
2
+ integrations) and an optional CSS-only filter on include.filter (an item field). Order is the data order.{%- endcomment -%}
3
+ {%- include modootoday/i18n.html -%}
4
+ {%- assign _uid = "mt-f-" | append: page.url | slugify -%}
5
+ {%- if include.filter -%}{%- include modootoday/directory/values.html items=include.items field=include.filter -%}{%- endif -%}
6
+ <div class="mt-dir mt-dir-{{ include.preset }}">
7
+ {%- if include.filter and mt_fvals.size > 1 %}{% include modootoday/directory/filter.html uid=_uid values=mt_fvals %}{% endif %}
8
+ <ul class="mt-dir-grid" role="list">
9
+ {%- for _it in include.items -%}
10
+ {%- assign _cls = "" -%}
11
+ {%- if include.filter and _it[include.filter] -%}{%- assign _vs = _it[include.filter] | join: "|" | split: "|" -%}
12
+ {%- for _v in mt_fvals -%}{%- if _vs contains _v -%}{%- assign _cls = _cls | append: " mt-f" | append: forloop.index -%}{%- endif -%}{%- endfor -%}{%- endif -%}
13
+ {% include modootoday/directory/item.html it=_it preset=include.preset cls=_cls %}
14
+ {%- endfor %}
15
+ </ul>
16
+ </div>
@@ -0,0 +1,6 @@
1
+ {%- comment -%}Sets mt_fvals: the distinct values of field include.field over include.items (string or list values), first-seen order, at most 12.{%- endcomment -%}
2
+ {%- assign mt_fvals = "" | split: "" -%}
3
+ {%- for _it in include.items -%}{%- assign _v = _it[include.field] -%}
4
+ {%- if _v -%}{%- assign _vs = _v | join: "|" | split: "|" -%}{%- for _x in _vs -%}{%- unless mt_fvals contains _x -%}{%- assign mt_fvals = mt_fvals | push: _x -%}{%- endunless -%}{%- endfor -%}{%- endif -%}
5
+ {%- endfor -%}
6
+ {%- assign mt_fvals = mt_fvals | slice: 0, 12 -%}
@@ -0,0 +1,15 @@
1
+ {%- comment -%}Page actions menu for pages with a Markdown twin (needs modootoday/config.html): view the twin, and with
2
+ code-copy.js copy it ("Copy page") or copy it with its source URL ("Copy for AI"). Hidden with front matter
3
+ page_actions: false. Labels: i18n keys page_actions.*.{%- endcomment -%}
4
+ {%- if mt_components contains "page-actions" and page.page_actions != false and site.modootoday.page_actions != false -%}
5
+ {%- include modootoday/doc/twin.html -%}
6
+ {%- if mt_twin -%}
7
+ {%- assign _lang = page.lang | default: site.lang | default: "en" -%}
8
+ {%- include modootoday/i18n.html lang=_lang -%}
9
+ <details class="mt-menu mt-page-actions" data-mt-twin="{{ mt_twin | relative_url }}" data-mt-source="{{ mt_t_page_actions_source }}" data-mt-url="{{ page.url | absolute_url }}"><summary>{{ mt_t_page_actions_label }}</summary><ul>
10
+ <li hidden><button type="button" data-mt-act="copy">{{ mt_t_page_actions_copy }}</button></li>
11
+ <li hidden><button type="button" data-mt-act="ai">{{ mt_t_page_actions_copy_ai }}</button></li>
12
+ <li><a href="{{ mt_twin | relative_url }}" type="text/markdown">{{ mt_t_page_actions_view }}</a></li>
13
+ </ul></details>
14
+ {%- endif -%}
15
+ {%- endif -%}
@@ -0,0 +1,24 @@
1
+ {%- comment -%}Previous / next in docs order: the nav flattened, a group's own page first, then its items (and their sub-items) (only for pages listed in the nav; front matter pagination: false hides it).{%- endcomment -%}
2
+ {%- if mt_nav and mt_components contains "pagination" and page.pagination != false -%}
3
+ {%- assign _flat = "" | split: "" -%}
4
+ {%- for it in mt_nav -%}
5
+ {%- if it.url -%}{%- assign _one = mt_nav | where: "url", it.url -%}{%- assign _flat = _flat | concat: _one -%}{%- endif -%}
6
+ {%- for sub in it.items -%}{%- assign _one = it.items | where: "url", sub.url -%}{%- assign _flat = _flat | concat: _one -%}{%- if sub.items -%}{%- assign _flat = _flat | concat: sub.items -%}{%- endif -%}{%- endfor -%}
7
+ {%- endfor -%}
8
+ {%- assign _ix = -1 -%}
9
+ {%- for it in _flat -%}{%- if it.url == page.url and _ix < 0 -%}{%- assign _ix = forloop.index0 -%}{%- endif -%}{%- endfor -%}
10
+ {%- if _ix >= 0 -%}
11
+ {%- assign _pi = _ix | minus: 1 -%}{%- assign _ni = _ix | plus: 1 -%}
12
+ {%- include modootoday/i18n.html lang=_lang -%}
13
+ {%- if _pi >= 0 or _ni < _flat.size %}
14
+ <nav class="mt-pagination" aria-label="{{ mt_t_pagination_label }}">
15
+ {%- if _pi >= 0 %}{% assign _p = _flat[_pi] %}
16
+ <a rel="prev" href="{{ _p.url | relative_url }}"><small>{% include modootoday/brand/icon.html name="prev" size=14 %} {{ mt_t_pagination_prev }}</small> {{ _p.title }}</a>
17
+ {%- endif -%}
18
+ {%- if _ni < _flat.size %}{% assign _n = _flat[_ni] %}
19
+ <a rel="next" href="{{ _n.url | relative_url }}"><small>{{ mt_t_pagination_next }} {% include modootoday/brand/icon.html name="next" size=14 %}</small> {{ _n.title }}</a>
20
+ {%- endif %}
21
+ </nav>
22
+ {%- endif -%}
23
+ {%- endif -%}
24
+ {%- endif -%}
@@ -0,0 +1,11 @@
1
+ {%- comment -%}One sidebar link; an item with `items:` becomes a nested <details> whose summary is plain text (a link inside <summary> is nested-interactive) and whose first entry links the item (open when it holds the current page).{%- endcomment -%}
2
+ {%- assign _si = include.it -%}
3
+ {%- if _si.items -%}
4
+ {%- assign _sh = _si.items | where: "url", page.url | first -%}
5
+ <details{% if _sh or _si.url == page.url %} open{% endif %}><summary>{{ _si.title }}</summary><ul>
6
+ {%- if _si.url %}<li><a href="{% include modootoday/link.html url=_si.url %}"{% include modootoday/links/attrs.html on=_si.new_window target=_si.target url=_si.url %}{% if _si.url == page.url %} aria-current="page"{% endif %}>{{ _si.title }}</a></li>{% endif -%}
7
+ {%- for _ss in _si.items %}<li><a href="{% include modootoday/link.html url=_ss.url %}"{% include modootoday/links/attrs.html on=_ss.new_window target=_ss.target url=_ss.url %}{% if _ss.url == page.url %} aria-current="page"{% endif %}>{{ _ss.title }}</a></li>{% endfor -%}
8
+ </ul></details>
9
+ {%- else -%}
10
+ <a href="{% include modootoday/link.html url=_si.url %}"{% include modootoday/links/attrs.html on=_si.new_window target=_si.target url=_si.url %}{% if _si.url == page.url %} aria-current="page"{% endif %}>{{ _si.title }}</a>
11
+ {%- endif -%}