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,17 @@
1
+ {%- comment -%}BreadcrumbList (#breadcrumb) from the page URL, like modootoday/breadcrumb.html: home, each parent directory that
2
+ is a page, then the page. Not printed on the home page or a /<lang>/ home.{%- endcomment -%}
3
+ {%- assign _ld_segs = page.url | split: "/" -%}{%- assign _ld_home = "/" -%}{%- assign _ld_start = 0 -%}
4
+ {%- if _ld_segs[1] == _ld_lang and _ld_lang != site.lang -%}{%- assign _ld_home = "/" | append: _ld_lang | append: "/" -%}{%- assign _ld_start = 1 -%}{%- endif -%}
5
+ {%- if page.url != _ld_home and page.url != "/" -%}
6
+ {%- assign _ld_hp = site.pages | where: "url", _ld_home | first -%}{%- assign _ld_n = 1 -%}
7
+ ,{"@type":"BreadcrumbList","@id":{{ _ld_url | append: "#breadcrumb" | jsonify }},"itemListElement":[{"@type":"ListItem","position":1,"name":{{ _ld_hp.short_title | default: _ld_hp.title | default: site.title | default: "Home" | strip_html | jsonify }},"item":{{ _ld_home | absolute_url | jsonify }}}
8
+ {%- assign _ld_acc = _ld_home -%}
9
+ {%- for _s in _ld_segs offset: 1 -%}{%- if forloop.index > _ld_start and _s != "" and _s != "index.html" -%}
10
+ {%- assign _ld_acc = _ld_acc | append: _s | append: "/" -%}
11
+ {%- if _ld_acc == page.url or forloop.last -%}{%- assign _ld_n = _ld_n | plus: 1 -%}
12
+ ,{"@type":"ListItem","position":{{ _ld_n }},"name":{{ _ld_title | jsonify }},"item":{{ _ld_url | jsonify }}}
13
+ {%- else -%}{%- assign _ld_pp = site.pages | where: "url", _ld_acc | first -%}{%- if _ld_pp -%}{%- assign _ld_n = _ld_n | plus: 1 -%}
14
+ ,{"@type":"ListItem","position":{{ _ld_n }},"name":{{ _ld_pp.title | default: _s | strip_html | jsonify }},"item":{{ _ld_acc | absolute_url | jsonify }}}
15
+ {%- endif -%}{%- endif -%}
16
+ {%- endif -%}{%- endfor -%}]}
17
+ {%- endif -%}
@@ -0,0 +1,16 @@
1
+ {%- comment -%}Main entity node (#main) for every other type (JobPosting, Event, Course, PodcastEpisode, SoftwareApplication,
2
+ DefinedTermSet, ItemList, Person, Organization, Product, ...). Prefills name (title for JobPosting), description, url, inLanguage;
3
+ the front matter schema: map adds the rest (schema.org property names, nested maps with type: become typed nodes).{%- endcomment -%}
4
+ ,{"@type":{{ _ld_type | jsonify }},"@id":{{ _ld_url | append: "#main" | jsonify }}
5
+ {%- unless page.schema.name or page.schema.title -%}
6
+ {%- if _ld_type == "JobPosting" %},"title":{{ _ld_title | jsonify }}{% else %},"name":{{ _ld_title | jsonify }}{% endif -%}
7
+ {%- endunless -%}
8
+ {%- if _ld_desc != "" and page.schema.description == nil %},"description":{{ _ld_desc | jsonify }}{% endif -%}
9
+ ,"url":{{ _ld_url | jsonify }}
10
+ {%- if _ld_type == "JobPosting" and page.schema.datePosted == nil and page.date %},"datePosted":{{ page.date | date_to_xmlschema | jsonify }}{% endif -%}
11
+ {%- if _ld_img and page.schema.image == nil %},"image":{{ _ld_img | absolute_url | jsonify }}{% endif -%}
12
+ {%- if _ld_type == "ItemList" -%}{%- include modootoday/directory/jsonld.html preset=page.layout -%}{%- endif -%}
13
+ {%- include modootoday/detail/jsonld.html -%}
14
+ {%- include modootoday/docs-extra/jsonld.html -%}
15
+ {%- include modootoday/jsonld/props.html -%}
16
+ }
@@ -0,0 +1,24 @@
1
+ {%- comment -%}schema.org JSON-LD: one <script type="application/ld+json"> with one @graph per page (needs modootoday/config.html).
2
+ Nodes: WebSite (#website), the publisher (#publisher), the page (#webpage, typed by jsonld/type.html), the main entity (#main:
3
+ an Article type or a front matter entity), BreadcrumbList (#breadcrumb). Absolute URLs only, so nothing is printed without site.url.
4
+ site.modootoday.schema: false no JSON-LD (also when modootoday.seo is false)
5
+ front matter schema: false no JSON-LD on that page
6
+ "<" is printed as \u003c, so the block never closes the script element early (CSP-safe: data, not script).{%- endcomment -%}
7
+ {%- assign _ld = site.modootoday.schema -%}
8
+ {%- unless site.modootoday.seo == false or _ld == false or _ld.enabled == false or page.schema == false or page.jsonld == false or site.url == nil -%}
9
+ {%- include modootoday/jsonld/type.html -%}
10
+ {%- assign _ld_root = "/" | absolute_url -%}
11
+ {%- assign _ld_url = page.url | absolute_url -%}
12
+ {%- assign _ld_lang = page.lang | default: site.lang | default: "en" -%}
13
+ {%- assign _ld_title = page.title | default: site.title | strip_html | normalize_whitespace -%}
14
+ {%- assign _ld_desc = page.description | default: page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 300 -%}
15
+ {%- assign _ld_img = page.image.path | default: page.image | default: site.modootoday.og_image -%}
16
+ {%- capture _ld_g -%}
17
+ {%- include modootoday/jsonld/website.html -%}
18
+ {%- include modootoday/jsonld/publisher.html -%}
19
+ {%- include modootoday/jsonld/webpage.html -%}
20
+ {%- if _ld_kind == "article" -%}{%- include modootoday/jsonld/article.html -%}{%- elsif _ld_kind == "entity" -%}{%- include modootoday/jsonld/entity.html -%}{%- endif -%}
21
+ {%- include modootoday/jsonld/breadcrumb.html -%}
22
+ {%- endcapture %}
23
+ <script type="application/ld+json">{"@context":"https://schema.org","@graph":[{{ _ld_g | strip | replace: "<", "\u003c" }}]}</script>
24
+ {%- endunless -%}
@@ -0,0 +1,20 @@
1
+ {%- comment -%}mainEntity of a links or resume ProfilePage (inside jsonld/webpage.html), unless schema: sets mainEntity:
2
+ a Person (or profile: organization) named page.name or the title, with image, jobTitle (page.headline), email and sameAs from
3
+ page.links / page.profiles urls that are absolute.{%- endcomment -%}
4
+ {%- unless page.schema.mainEntity -%}
5
+ {%- assign _pf = page.links | default: page.profiles -%}
6
+ {%- assign _pn = page.name | default: _ld_title -%}
7
+ ,"mainEntity":{"@type":{% if page.profile == "organization" %}"Organization"{% else %}"Person"{% endif %},"@id":{{ _ld_url | append: "#main" | jsonify }},"name":{{ _pn | jsonify }}
8
+ {%- if page.image %},"image":{{ page.image | absolute_url | jsonify }}{% endif -%}
9
+ {%- if page.headline %},"jobTitle":{{ page.headline | jsonify }}{% endif -%}
10
+ {%- if page.email %},"email":{{ page.email | prepend: "mailto:" | replace: "mailto:mailto:", "mailto:" | jsonify }}{% endif -%}
11
+ {%- if page.phone %},"telephone":{{ page.phone | jsonify }}{% endif -%}
12
+ {%- if page.location %},"address":{"@type":"PostalAddress","addressLocality":{{ page.location | jsonify }}}{% endif -%}
13
+ {%- assign _now = page.experience | where_exp: "e", "e.end == nil" | first -%}
14
+ {%- if _now.org %},"worksFor":{"@type":"Organization","name":{{ _now.org | jsonify }}}{% endif -%}
15
+ {%- if page.education %},"alumniOf":[{% for e in page.education %}{% unless forloop.first %},{% endunless %}{"@type":"EducationalOrganization","name":{{ e.school | jsonify }}}{% endfor %}]{% endif -%}
16
+ {%- if page.skills %}{% assign _ka = "" %}{% for s in page.skills %}{% for i in s.items %}{% assign _ka = _ka | append: "|" | append: i %}{% endfor %}{% endfor %},"knowsAbout":{{ _ka | remove_first: "|" | split: "|" | jsonify }}{% endif -%}
17
+ {%- assign _sa = "" -%}{%- for l in _pf -%}{%- if l.url contains "://" -%}{%- assign _sa = _sa | append: "|" | append: l.url -%}{%- endif -%}{%- endfor -%}
18
+ {%- if _sa != "" %},"sameAs":{{ _sa | remove_first: "|" | split: "|" | jsonify }}{% endif -%}
19
+ }
20
+ {%- endunless -%}
@@ -0,0 +1,13 @@
1
+ {%- comment -%}Front matter schema: map printed as properties (skips type, page_type). Keys are schema.org property names;
2
+ values go through jsonify; nested type: keys print as @type; date keys with a time print as ISO 8601. Use absolute URLs or site paths starting with / (printed absolute) for url, image, logo, sameAs.{%- endcomment -%}
3
+ {%- assign _ld_urlkeys = "url image logo sameAs item contentUrl embedUrl applicationUrl downloadUrl" | split: " " -%}
4
+ {%- assign _ld_datekeys = "datePosted validThrough startDate endDate datePublished dateModified dateCreated uploadDate" | split: " " -%}
5
+ {%- for _ld_kv in page.schema -%}{%- assign _ld_k = _ld_kv[0] -%}
6
+ {%- unless _ld_k == "type" or _ld_k == "page_type" -%}
7
+ {%- assign _ld_v = _ld_kv[1] -%}
8
+ {%- assign _ld_s = _ld_v | append: "" -%}{%- assign _ld_c = _ld_s | slice: 0, 1 -%}{%- assign _ld_c2 = _ld_s | slice: 0, 2 -%}
9
+ {%- if _ld_urlkeys contains _ld_k and _ld_c == "/" and _ld_c2 != "//" -%}{%- assign _ld_v = _ld_v | absolute_url -%}
10
+ {%- elsif _ld_datekeys contains _ld_k and _ld_s.size > 10 -%}{%- assign _ld_v = _ld_v | date_to_xmlschema -%}{%- endif -%}
11
+ ,{{ _ld_k | jsonify }}:{{ _ld_v | jsonify | replace: '"type":', '"@type":' }}
12
+ {%- endunless -%}
13
+ {%- endfor -%}
@@ -0,0 +1,11 @@
1
+ {%- comment -%}Publisher node (#publisher): site.modootoday.schema.publisher {type: Organization | Person, name, url, logo, same_as: [...]}.
2
+ Defaults: Organization named site.title; logo from publisher.logo, or the brand mark's 180px PNG when modootoday.logo is brand.{%- endcomment -%}
3
+ {%- assign _ld_p = _ld.publisher -%}
4
+ {%- assign _ld_pt = _ld_p.type | default: "Organization" -%}
5
+ {%- assign _ld_pl = _ld_p.logo -%}{%- if _ld_pl == nil and site.modootoday.logo == "brand" -%}{%- assign _ld_pl = "/assets/modootoday/apple-touch-icon.png" -%}{%- elsif _ld_pl == nil -%}{%- assign _ld_pl = site.modootoday.logo -%}{%- endif -%}
6
+ ,{"@type":{{ _ld_pt | jsonify }},"@id":{{ _ld_root | append: "#publisher" | jsonify }},"name":{{ _ld_p.name | default: site.title | default: _ld_title | jsonify }},"url":{{ _ld_p.url | default: "/" | absolute_url | jsonify }}
7
+ {%- if _ld_pl -%}{%- assign _ld_plu = _ld_pl | absolute_url -%}
8
+ {%- if _ld_pt == "Person" %},"image":{{ _ld_plu | jsonify }}{% else %},"logo":{"@type":"ImageObject","url":{{ _ld_plu | jsonify }}}{% endif -%}
9
+ {%- endif -%}
10
+ {%- if _ld_p.same_as %},"sameAs":[{% for _s in _ld_p.same_as %}{{ _s | jsonify }}{% unless forloop.last %},{% endunless %}{% endfor %}]{% endif -%}
11
+ }
@@ -0,0 +1,29 @@
1
+ {%- comment -%}Resolves the page's schema.org type into _ld_type and its kind into _ld_kind (page | article | entity).
2
+ Order: front matter schema.type, then site.modootoday.schema.layouts[<layout>], then the theme's layout map, then WebPage.{%- endcomment -%}
3
+ {%- assign _ld_type = page.schema.type | default: site.modootoday.schema.layouts[page.layout] -%}
4
+ {%- unless _ld_type -%}
5
+ {%- case page.layout -%}
6
+ {%- when "post" -%}{%- assign _ld_type = "BlogPosting" -%}
7
+ {%- when "news-article" -%}{%- assign _ld_type = "NewsArticle" -%}
8
+ {%- when "project" -%}{%- assign _ld_type = "CreativeWork" -%}
9
+ {%- when "case-study" -%}{%- assign _ld_type = "Article" -%}
10
+ {%- when "job" -%}{%- assign _ld_type = "JobPosting" -%}
11
+ {%- when "event" -%}{%- assign _ld_type = "Event" -%}
12
+ {%- when "episode" -%}{%- assign _ld_type = "PodcastEpisode" -%}
13
+ {%- when "doc", "reference" -%}{%- assign _ld_type = "TechArticle" -%}
14
+ {%- when "glossary" -%}{%- assign _ld_type = "DefinedTermSet" -%}
15
+ {%- when "course" -%}{%- assign _ld_type = "Course" -%}
16
+ {%- when "book" -%}{%- assign _ld_type = "Book" -%}
17
+ {%- when "archive", "blog", "news", "hub" -%}{%- assign _ld_type = "CollectionPage" -%}
18
+ {%- when "author", "profile", "resume", "links" -%}{%- assign _ld_type = "ProfilePage" -%}
19
+ {%- when "contact" -%}{%- assign _ld_type = "ContactPage" -%}
20
+ {%- when "search" -%}{%- assign _ld_type = "SearchResultsPage" -%}
21
+ {%- when "faq" -%}{%- assign _ld_type = "FAQPage" -%}
22
+ {%- when "directory", "portfolio", "team", "jobs", "events", "sponsors", "integrations" -%}{%- assign _ld_type = "ItemList" -%}
23
+ {%- else -%}{%- assign _ld_type = "WebPage" -%}
24
+ {%- endcase -%}
25
+ {%- if page.kind == "news" -%}{%- assign _ld_type = "NewsArticle" -%}{%- endif -%}
26
+ {%- endunless -%}
27
+ {%- assign _ld_pages = "WebPage AboutPage CollectionPage ContactPage FAQPage ProfilePage SearchResultsPage ItemPage CheckoutPage MedicalWebPage QAPage RealEstateListing" | split: " " -%}
28
+ {%- assign _ld_articles = "Article BlogPosting NewsArticle TechArticle Report ScholarlyArticle SocialMediaPosting AnalysisNewsArticle OpinionNewsArticle ReviewNewsArticle" | split: " " -%}
29
+ {%- if _ld_pages contains _ld_type -%}{%- assign _ld_kind = "page" -%}{%- elsif _ld_articles contains _ld_type -%}{%- assign _ld_kind = "article" -%}{%- else -%}{%- assign _ld_kind = "entity" -%}{%- endif -%}
@@ -0,0 +1,17 @@
1
+ {%- comment -%}The page node (#webpage): WebPage or the page type from jsonld/type.html (CollectionPage, ProfilePage, ...).
2
+ name, url, description, image and inLanguage mirror the Open Graph tags; mainEntity points at #main for articles and entities.{%- endcomment -%}
3
+ {%- if _ld_kind == "page" -%}{%- assign _ld_wt = _ld_type -%}{%- else -%}{%- assign _ld_wt = page.schema.page_type | default: "WebPage" -%}{%- if _ld_type == "ItemList" and page.schema.page_type == nil -%}{%- assign _ld_wt = "CollectionPage" -%}{%- endif -%}{%- endif -%}
4
+ ,{"@type":{{ _ld_wt | jsonify }},"@id":{{ _ld_url | append: "#webpage" | jsonify }},"url":{{ _ld_url | jsonify }},"name":{{ _ld_title | jsonify }}
5
+ {%- if _ld_desc != "" %},"description":{{ _ld_desc | jsonify }}{% endif -%}
6
+ ,"inLanguage":{{ _ld_lang | jsonify }},"isPartOf":{"@id":{{ _ld_root | append: "#website" | jsonify }}}
7
+ {%- if _ld_img %},"primaryImageOfPage":{"@type":"ImageObject","url":{{ _ld_img | absolute_url | jsonify }}}{% endif -%}
8
+ {%- if page.url != "/" %},"breadcrumb":{"@id":{{ _ld_url | append: "#breadcrumb" | jsonify }}}{% endif -%}
9
+ {%- if _ld_kind != "page" %},"mainEntity":{"@id":{{ _ld_url | append: "#main" | jsonify }}}{% endif -%}
10
+ {%- if _ld_type == "ProfilePage" and page.layout == "links" or _ld_type == "ProfilePage" and page.layout == "resume" -%}{%- include modootoday/jsonld/profile.html -%}{%- endif -%}
11
+ {%- if page.layout == "hub" and page.cards and page.schema.hasPart == nil %},"hasPart":[{% for c in page.cards %}{% unless forloop.first %},{% endunless %}{"@type":"WebPage","name":{{ c.title | jsonify }},"url":{{ c.url | absolute_url | jsonify }}}{% endfor %}]{% endif -%}
12
+ {%- if page.layout == "legal" -%}
13
+ {%- if page.effective and page.schema.datePublished == nil %},"datePublished":{{ page.effective | date_to_xmlschema | jsonify }}{% endif -%}
14
+ {%- if page.updated and page.schema.dateModified == nil %},"dateModified":{{ page.updated | date_to_xmlschema | jsonify }}{% endif -%}
15
+ {%- endif -%}
16
+ {%- if _ld_kind == "page" and page.schema -%}{%- include modootoday/jsonld/props.html -%}{%- endif -%}
17
+ }
@@ -0,0 +1,9 @@
1
+ {%- comment -%}WebSite node (#website). site.modootoday.schema.search_url (a URL with {search_term_string}) adds a SearchAction.{%- endcomment -%}
2
+ {"@type":"WebSite","@id":{{ _ld_root | append: "#website" | jsonify }},"url":{{ _ld_root | jsonify }},"name":{{ site.title | default: _ld_title | jsonify }}
3
+ {%- if site.description %},"description":{{ site.description | strip_html | normalize_whitespace | jsonify }}{% endif -%}
4
+ ,"inLanguage":{{ site.lang | default: "en" | jsonify }},"publisher":{"@id":{{ _ld_root | append: "#publisher" | jsonify }}}
5
+ {%- if _ld.search_url -%}
6
+ {%- assign _ld_q = _ld.search_url | absolute_url | replace: "%7B", "{" | replace: "%7D", "}" -%}
7
+ ,"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":{{ _ld_q | jsonify }}},"query-input":"required name=search_term_string"}
8
+ {%- endif -%}
9
+ }
@@ -0,0 +1,31 @@
1
+ {%- comment -%}
2
+ Language switcher, built from modootoday.languages (the same alternates as the hreflang links).
3
+ Each language links to this page's translation when it exists, else to that language's home page.
4
+ Opt in with modootoday.language_switcher: header | footer, or include it in your own footer-custom.html.
5
+ Label text: language (the language's own name) and languages.label (modootoday/i18n.html: site _data/i18n, theme catalog, English).
6
+ include.style: "menu" renders a globe button with a <details> dropdown (fixed width however many languages); otherwise a list.
7
+ Renders nothing with fewer than two languages.
8
+ {%- endcomment -%}
9
+ {%- if site.modootoday.languages.size > 1 -%}
10
+ {%- assign _ls_def = site.lang | default: "en" -%}
11
+ {%- assign _ls_cur = page.lang | default: _ls_def -%}
12
+ {%- assign _ls_base = page.url -%}
13
+ {%- if _ls_cur != _ls_def -%}{%- assign _ls_pre = "/" | append: _ls_cur -%}{%- assign _ls_base = page.url | remove_first: _ls_pre -%}{%- endif -%}
14
+ {%- include modootoday/i18n.html lang=_ls_cur -%}{%- assign _ls_label = mt_t_languages_label -%}
15
+ {%- capture _ls_curname -%}{%- include modootoday/i18n/name.html code=_ls_cur -%}{%- endcapture -%}{%- assign _ls_curname = site.data.i18n[_ls_cur].language | default: _ls_curname -%}
16
+ {%- unless mt_page_urls -%}{%- assign mt_page_urls = site.pages | map: "url" | join: "|" | prepend: "|" | append: "|" -%}{%- endunless -%}
17
+ {%- capture _ls_items -%}
18
+ {%- for _l in site.modootoday.languages -%}
19
+ {%- if _l == _ls_def -%}{%- assign _ls_alt = _ls_base -%}{%- else -%}{%- assign _ls_alt = "/" | append: _l | append: _ls_base -%}{%- endif -%}
20
+ {%- assign _ls_key = "|" | append: _ls_alt | append: "|" -%}
21
+ {%- unless mt_page_urls contains _ls_key -%}{%- if _l == _ls_def -%}{%- assign _ls_alt = "/" -%}{%- else -%}{%- assign _ls_alt = "/" | append: _l | append: "/" -%}{%- endif -%}{%- endunless -%}
22
+ {%- capture _ls_name -%}{%- include modootoday/i18n/name.html code=_l -%}{%- endcapture -%}{%- assign _ls_name = site.data.i18n[_l].language | default: _ls_name -%}
23
+ <li><a href="{{ _ls_alt | relative_url }}" lang="{{ _l }}" hreflang="{{ _l }}"{% if _l == _ls_cur %} aria-current="true"{% endif %}>{{ _ls_name }}</a></li>
24
+ {%- endfor -%}
25
+ {%- endcapture -%}
26
+ {%- if include.style == "menu" -%}
27
+ <details class="mt-lang mt-menu"><summary aria-label="{{ _ls_label }}: {{ _ls_curname }}" title="{{ _ls_label }}">{% include modootoday/brand/icon.html name="globe" %}</summary><ul>{{ _ls_items }}</ul></details>
28
+ {%- else -%}
29
+ <nav class="mt-lang" aria-label="{{ _ls_label }}"><ul>{{ _ls_items }}</ul></nav>
30
+ {%- endif -%}
31
+ {%- endif -%}
@@ -0,0 +1,3 @@
1
+ {%- comment -%}URL for include.url: full URLs as they are, site paths through relative_url (absolute=true: absolute_url).
2
+ A bare "#" sample link stays "#" (absolute=true: this page's absolute URL, for JSON-LD).{%- endcomment -%}
3
+ {%- if include.url == "#" and include.absolute -%}{{ page.url | absolute_url }}{%- elsif include.url == "#" or include.url contains "://" or include.url contains "mailto:" or include.url contains "tel:" -%}{{ include.url }}{%- elsif include.absolute -%}{{ include.url | absolute_url }}{%- else -%}{{ include.url | relative_url }}{%- endif -%}
@@ -0,0 +1,9 @@
1
+ {%- comment -%}Link attributes for opening in a new window. on=true (an item's new_window or target: _blank), or url= an external URL
2
+ while site.modootoday.external_links.new_window is true. Adds target, rel="noopener noreferrer", data-mt-new-window and
3
+ aria-describedby="mt-new-window-hint" (the localized hint printed once by the default layout).{%- endcomment -%}
4
+ {%- assign _nwo = include.on -%}{%- if include.target == "_blank" -%}{%- assign _nwo = true -%}{%- endif -%}
5
+ {%- if include.on == false -%}{%- assign _nwo = false -%}
6
+ {%- elsif _nwo != true and site.modootoday.external_links.new_window and include.url contains "://" -%}
7
+ {%- assign _nwh = site.url | default: "::none::" -%}{%- unless include.url contains _nwh -%}{%- assign _nwo = true -%}{%- endunless -%}
8
+ {%- endif -%}
9
+ {%- if _nwo == true %} target="_blank" rel="noopener noreferrer" data-mt-new-window aria-describedby="mt-new-window-hint"{% endif -%}
@@ -0,0 +1,16 @@
1
+ {%- comment -%}Filters rendered page content (include.html): bare "#" sample links stay "#" instead of baseurl + "/#";
2
+ Markdown links titled "new-window" ([text](url "new-window"), portable), or with kramdown {: .mt-new-window} or target="_blank", get rel, the data hook and the hint; with
3
+ site.modootoday.external_links.new_window, external links (not starting with site.url) open in a new window too.{%- endcomment -%}
4
+ {%- assign _hash = "#" | relative_url | prepend: 'href="' | append: '"' -%}
5
+ {%- assign _nwa = ' target="_blank" rel="noopener noreferrer" data-mt-new-window aria-describedby="mt-new-window-hint"' -%}
6
+ {%- assign _h = include.html -%}{%- if _hash contains "#" -%}{%- assign _h = _h | replace: _hash, 'href="#"' -%}{%- endif -%}
7
+ {%- assign _nwc = _nwa | prepend: 'class="mt-new-window"' -%}{%- assign _nwt = _nwa | append: ">" -%}
8
+ {%- if _h contains 'target="_blank">' -%}{%- assign _h = _h | replace: ' target="_blank">', _nwt -%}{%- endif -%}
9
+ {%- if _h contains ' title="new-window"' -%}{%- assign _h = _h | replace: ' title="new-window"', _nwa -%}{%- endif -%}
10
+ {%- if _h contains 'class="mt-new-window"' -%}{%- assign _h = _h | replace: 'class="mt-new-window"', _nwc -%}{%- endif -%}
11
+ {%- if site.modootoday.external_links.new_window -%}
12
+ {%- assign _ext = _nwa | prepend: "<a" | append: ' href="http' -%}
13
+ {%- assign _h = _h | replace: '<a href="http', _ext -%}
14
+ {%- if site.url -%}{%- assign _own = _nwa | prepend: "<a" | append: ' href="' | append: site.url -%}{%- assign _ownr = '<a href="' | append: site.url -%}{%- assign _h = _h | replace: _own, _ownr -%}{%- endif -%}
15
+ {%- endif -%}
16
+ {{ _h }}
@@ -0,0 +1,6 @@
1
+ {%- comment -%}c: details (and faq) — every ### heading and the content up to the next one become
2
+ details.mt-details > summary > h3 + content. Text before the first ### stays as it is.{%- endcomment -%}
3
+ {%- assign _ds = "
4
+ <h3 " -%}{%- assign _dp = include.html | split: _ds -%}
5
+ {{ _dp[0] }}{% for _q in _dp offset: 1 %}{% assign _qh = _q | split: "</h3>" | first %}
6
+ <details class="mt-details"><summary><h3 {{ _qh }}</h3></summary>{{ _q | remove_first: _qh | remove_first: "</h3>" }}</details>{% endfor %}
@@ -0,0 +1,2 @@
1
+ {%- comment -%}c: faq — the details transform. FAQPage structured data comes from the page's single JSON-LD graph (a schema: block in front matter).{%- endcomment -%}
2
+ {%- include modootoday/markdown/c/details.html html=include.html -%}
@@ -0,0 +1,3 @@
1
+ {%- comment -%}c: filetree — the first list gets aria-label filetree.label (folders are items with a nested list).{%- endcomment -%}
2
+ {%- capture _ul %}<ul aria-label="{{ mt_t_filetree_label }}">{% endcapture -%}
3
+ {{ include.html | replace_first: "<ul>", _ul }}
@@ -0,0 +1,5 @@
1
+ {%- comment -%}c: gallery — a tight list of images. Each becomes a thumbnail link to a :target lightbox
2
+ (#<section>-<n>); the lightbox links back to its thumbnail and is labelled gallery.close. No script.{%- endcomment -%}
3
+ {%- assign _gp = include.html | split: "<li><img " -%}
4
+ {%- assign _gid = include.id | default: "gallery" | slugify -%}
5
+ {{ _gp[0] }}{% for _g in _gp offset: 1 %}{% assign _im = _g | split: " />" | first %}{% assign _id = _gid | append: "-" | append: forloop.index %}<li><a class="mt-gallery-thumb" id="{{ _id }}-thumb" href="#{{ _id }}"><img {{ _im }} loading="lazy" decoding="async" /></a><a class="mt-lightbox" id="{{ _id }}" href="#{{ _id }}-thumb" aria-label="{{ mt_t_gallery_close }}"><img {{ _im }} loading="lazy" decoding="async" /><span class="mt-lightbox-close" aria-hidden="true">{{ mt_t_gallery_close }}</span></a>{{ _g | remove_first: _im | remove_first: " />" }}{% endfor %}
@@ -0,0 +1,2 @@
1
+ {%- comment -%}c: linkcards — "[Title](url) — text" list items; the dash after the link is dropped (the card shows it).{%- endcomment -%}
2
+ {{ include.html | replace: "</a> — ", "</a> " | replace: "</a> – ", "</a> " | replace: "</a> - ", "</a> " }}
@@ -0,0 +1,3 @@
1
+ {%- comment -%}c: params — header cells get scope="col"; a cell holding `required` shows the params.required badge.{%- endcomment -%}
2
+ {%- capture _rq %}<span class="mt-param-required">{{ mt_t_params_required }}</span>{% endcapture -%}
3
+ {{ include.html | replace: "<th>", '<th scope="col">' | replace: '<code class="language-plaintext highlighter-rouge">required</code>', _rq | replace: "<code>required</code>", _rq }}
@@ -0,0 +1,10 @@
1
+ {%- comment -%}c: pricing — every ### heading and the content up to the next one become a div.mt-plan inside
2
+ div.mt-plans; link-only paragraphs become buttons. Section param recommended: <n> (1-based) marks a plan
3
+ with the pricing.recommended flag (text, so colour is never the only cue).{%- endcomment -%}
4
+ {%- assign _ds = "
5
+ <h3 " -%}{%- assign _pp = include.html | split: _ds -%}
6
+ {%- assign _rec = include.s.recommended | plus: 0 -%}
7
+ {{ _pp[0] }}{% if _pp.size > 1 %}
8
+ <div class="mt-plans">{% for _q in _pp offset: 1 %}{% assign _qh = _q | split: "</h3>" | first %}{% capture _qb %}{% include modootoday/actions.html html=_q %}{% endcapture %}
9
+ <div class="mt-plan{% if forloop.index == _rec %} mt-plan-recommended{% endif %}">{% if forloop.index == _rec %}<p class="mt-plan-flag">{{ mt_t_pricing_recommended }}</p>{% endif %}<h3 {{ _qh }}</h3>{{ _qb | remove_first: _qh | remove_first: "</h3>" }}</div>{% endfor %}
10
+ </div>{% endif %}
@@ -0,0 +1,6 @@
1
+ {%- comment -%}c: quote — a blockquote whose last paragraph starts with "— " becomes
2
+ figure.mt-quote > blockquote + figcaption (the attribution). Other quotes stay as they are.{%- endcomment -%}
3
+ {%- assign _qb = include.html | split: "<blockquote>" -%}
4
+ {{ _qb[0] }}{% for _b in _qb offset: 1 %}{% assign _in = _b | split: "</blockquote>" | first %}{% assign _cp = _in | split: "<p>— " %}{% if _cp.size > 1 and _in != _b %}{% assign _cap = _cp | last | split: "</p>" | first %}{% capture _cf %}<p>— {{ _cap }}</p>{% endcapture %}
5
+ <figure class="mt-quote"><blockquote>{{ _in | remove: _cf | rstrip }}
6
+ </blockquote><figcaption>— {{ _cap }}</figcaption></figure>{{ _b | remove_first: _in | remove_first: "</blockquote>" }}{% else %}<blockquote>{{ _b }}{% endif %}{% endfor %}
@@ -0,0 +1,6 @@
1
+ {%- comment -%}c: subscribe — the section text plus a static e-mail form. _config.yml:
2
+ modootoday.subscribe: {action: <https URL>, method: post, field: email}. Without action no form is printed
3
+ (modootoday-check warns). Labels: subscribe.email, subscribe.submit.{%- endcomment -%}
4
+ {%- assign _sb = site.modootoday.subscribe -%}
5
+ {{ include.html }}{% if _sb.action %}{% assign _fid = "mt-subscribe-" | append: include.i %}
6
+ <form class="mt-subscribe" action="{{ _sb.action }}" method="{{ _sb.method | default: 'post' }}"><label for="{{ _fid }}">{{ mt_t_subscribe_email }}</label><input id="{{ _fid }}" type="email" name="{{ _sb.field | default: 'email' }}" autocomplete="email" required><button type="submit">{{ mt_t_subscribe_submit }}</button></form>{% endif %}
@@ -0,0 +1,114 @@
1
+ {%- comment -%}
2
+ md-components v1 — jekyll-theme-modootoday
3
+ Usage: {% include modootoday/markdown/components.html content=content lang=page.lang badges=true %}
4
+ 1) GitHub alerts (> [!NOTE|TIP|IMPORTANT|WARNING|CAUTION], any case) → blockquote.mt-callout.
5
+ Handles kramdown's "<p>[!TYPE]\nbody", standalone "<p>[!TYPE]</p>" (blank > line, or body
6
+ starting with code/list/heading) and "[!TYPE]<br />" (trailing spaces). Text after the marker,
7
+ unknown types and nested/list/table alerts stay unconverted and fail modootoday-check.
8
+ 2) Optional (badges=true): code span `status:available|partial|planned` → span.mt-badge.mt-badge-<v>.
9
+ Unregistered values are a modootoday-check error. Labels: i18n status.<v>.
10
+ kbd=true: `kbd:Ctrl+K` -> kbd.mt-kbd > kbd + kbd (keys joined by '+', no spaces).
11
+ Also `tag:<word>` → span.mt-badge.mt-badge-tag; values must be one token (checker: [A-Za-z0-9._-]+).
12
+ `since:` is not rendered in 1.0 (checker error).
13
+ 3) figure=true: a paragraph that is only an image, followed by a paragraph that is only *emphasis*
14
+ → figure.mt-figure with figcaption. Images need alt text (checker).
15
+ 4) Always: `file:`, `progress:`, `embed:` and footnote labels (modootoday/markdown/inline.html).
16
+ Titles/labels: modootoday/i18n.html (site _data/i18n, theme catalog, English).
17
+ {%- endcomment -%}
18
+ {%- assign _c = include.content -%}
19
+ {%- assign _lang = include.lang | default: site.lang | default: "en" -%}
20
+ {%- include modootoday/i18n.html lang=_lang -%}
21
+ {%- assign _types = "note,tip,important,warning,caution" | split: "," -%}
22
+ {%- assign _sep = "<blockquote>
23
+ <p>[!" -%}
24
+ {%- assign _nl = "
25
+ " -%}
26
+ {%- assign _chunks = _c | split: _sep -%}
27
+ {%- if _chunks.size > 1 -%}
28
+ {%- capture _c -%}{{ _chunks[0] }}{%- for _ch in _chunks offset:1 -%}
29
+ {%- assign _ty = _ch | split: "]" | first | downcase -%}
30
+ {%- assign _rest = _ch | slice: _ty.size, 1000000 | remove_first: "]" -%}
31
+ {%- assign _l1 = _rest | split: _nl | first | strip -%}
32
+ {%- assign _after = _rest | remove_first: _l1 | lstrip -%}
33
+ {%- assign _ok = false -%}{%- assign _body = "" -%}
34
+ {%- if _types contains _ty -%}
35
+ {%- if _l1 == "</p>" -%}{%- assign _ok = true -%}{%- assign _body = _after | prepend: " " | prepend: _nl -%}
36
+ {%- elsif _l1 == "<br />" or _l1 == "" -%}{%- assign _ok = true -%}{%- assign _body = _after | prepend: "<p>" -%}
37
+ {%- endif -%}
38
+ {%- endif -%}
39
+ {%- if _ok -%}
40
+ {%- case _ty -%}{%- when "note" -%}{%- assign _title = mt_t_callout_note -%}{%- when "tip" -%}{%- assign _title = mt_t_callout_tip -%}{%- when "important" -%}{%- assign _title = mt_t_callout_important -%}{%- when "warning" -%}{%- assign _title = mt_t_callout_warning -%}{%- else -%}{%- assign _title = mt_t_callout_caution -%}{%- endcase -%}
41
+ <blockquote class="mt-callout mt-callout-{{ _ty }}" data-variant="{{ _ty }}" role="note">
42
+ <p class="mt-callout-title">{% include modootoday/brand/icon.html name=_ty size=16 %}{{ _title }}</p>{{ _body }}
43
+ {%- else -%}{{ _sep }}{{ _ch }}{%- endif -%}
44
+ {%- endfor -%}{%- endcapture -%}
45
+ {%- endif -%}
46
+ {%- if include.badges -%}
47
+ {%- assign _st = "available:●,partial:◐,planned:○" | split: "," -%}
48
+ {%- for _pair in _st -%}
49
+ {%- assign _kv = _pair | split: ":" -%}
50
+ {%- assign _k = _kv[0] -%}
51
+ {%- case _k -%}{%- when "available" -%}{%- assign _label = mt_t_status_available -%}{%- when "partial" -%}{%- assign _label = mt_t_status_partial -%}{%- else -%}{%- assign _label = mt_t_status_planned -%}{%- endcase -%}
52
+ {%- capture _to %}<span class="mt-badge mt-badge-{{ _kv[0] }}" data-variant="{{ _kv[0] }}"><span aria-hidden="true">{{ _kv[1] }}</span> {{ _label }}</span>{% endcapture -%}
53
+ {%- capture _from %}<code class="language-plaintext highlighter-rouge">status:{{ _kv[0] }}</code>{% endcapture -%}
54
+ {%- capture _from2 %}<code>status:{{ _kv[0] }}</code>{% endcapture -%}
55
+ {%- assign _c = _c | replace: _from, _to | replace: _from2, _to -%}
56
+ {%- endfor -%}
57
+ {%- endif -%}
58
+ {%- if include.badges -%}
59
+ {%- assign _opens = '<code class="language-plaintext highlighter-rouge">|<code>' | split: "|" -%}
60
+ {%- for _o in _opens -%}
61
+ {%- assign _px = "tag:" -%}
62
+ {%- assign _key = _o | append: _px -%}
63
+ {%- if _c contains _key -%}
64
+ {%- assign _bits = _c | split: _key -%}
65
+ {%- capture _c -%}{{ _bits[0] }}{%- for _b in _bits offset: 1 -%}
66
+ {%- assign _v = _b | split: "</code>" | first -%}
67
+ {%- if _v contains "<" or _v contains " " or _v == "" or _v == _b -%}{{ _key }}{{ _b }}
68
+ {%- else -%}{%- assign _tail = _b | remove_first: _v | remove_first: "</code>" -%}
69
+ <span class="mt-badge mt-badge-tag" data-variant="tag">{{ _v }}</span>{{ _tail }}
70
+ {%- endif -%}
71
+ {%- endfor -%}{%- endcapture -%}
72
+ {%- endif -%}
73
+ {%- endfor -%}
74
+ {%- endif -%}
75
+ {%- if include.kbd -%}
76
+ {%- assign _opens = '<code class="language-plaintext highlighter-rouge">kbd:|<code>kbd:' | split: "|" -%}
77
+ {%- for _key in _opens -%}{%- if _c contains _key -%}
78
+ {%- assign _bits = _c | split: _key -%}
79
+ {%- capture _c -%}{{ _bits[0] }}{%- for _b in _bits offset: 1 -%}
80
+ {%- assign _v = _b | split: "</code>" | first -%}
81
+ {%- if _v contains "<" or _v contains " " or _v == "" or _v == _b -%}{{ _key }}{{ _b }}
82
+ {%- else -%}{%- assign _keys = _v | split: "+" -%}<kbd class="mt-kbd">{% for _k in _keys %}{% unless forloop.first %}+{% endunless %}<kbd>{{ _k }}</kbd>{% endfor %}</kbd>{{ _b | remove_first: _v | remove_first: "</code>" }}
83
+ {%- endif -%}
84
+ {%- endfor -%}{%- endcapture -%}
85
+ {%- endif -%}{%- endfor -%}
86
+ {%- endif -%}
87
+ {%- if include.figure and _c contains "<p><img " -%}
88
+ {%- assign _bits = _c | split: "<p><img " -%}
89
+ {%- capture _c -%}{{ _bits[0] }}{%- for _b in _bits offset: 1 -%}
90
+ {%- assign _im = _b | split: "</p>" | first -%}
91
+ {%- assign _after = _b | remove_first: _im | remove_first: "</p>" -%}
92
+ {%- assign _gts = _im | split: ">" | size -%}
93
+ {%- assign _a2 = _after | lstrip -%}
94
+ {%- assign _cap = "" -%}
95
+ {%- if _gts == 1 and _a2 contains "<p><em>" -%}
96
+ {%- assign _head = _a2 | slice: 0, 7 -%}
97
+ {%- if _head == "<p><em>" -%}
98
+ {%- assign _cap = _a2 | remove_first: "<p><em>" | split: "</em></p>" | first -%}
99
+ {%- if _cap contains "<p" or _cap contains "</em>" -%}{%- assign _cap = "" -%}{%- endif -%}
100
+ {%- endif -%}
101
+ {%- endif -%}
102
+ {%- if _cap != "" -%}{%- assign _rest = _a2 | remove_first: "<p><em>" | remove_first: _cap | remove_first: "</em></p>" -%}
103
+ <figure class="mt-figure"><img {{ _im }}<figcaption>{{ _cap }}</figcaption></figure>{{ _rest }}
104
+ {%- else -%}<p><img {{ _b }}{%- endif -%}
105
+ {%- endfor -%}{%- endcapture -%}
106
+ {%- endif -%}
107
+ {%- capture _c %}{% include modootoday/markdown/inline.html html=_c %}{% endcapture -%}
108
+ {%- comment -%}3) Accessibility fix-ups of kramdown output (found by qa/qa.mjs + axe): focusable scrolling code
109
+ blocks, labelled task-list checkboxes, and no deprecated role="doc-endnote" on footnote items.{%- endcomment -%}
110
+ {%- assign _td = mt_t_task_done -%}{%- assign _topen = mt_t_task_open -%}
111
+ {%- capture _cbd %}class="task-list-item-checkbox" disabled="disabled" checked="checked" aria-label="{{ _td }}" />{% endcapture -%}
112
+ {%- capture _cbo %}class="task-list-item-checkbox" disabled="disabled" aria-label="{{ _topen }}" />{% endcapture -%}
113
+ {%- assign _c = _c | replace: '<pre class="highlight">', '<pre class="highlight" tabindex="0">' | replace: 'class="task-list-item-checkbox" disabled="disabled" checked="checked" />', _cbd | replace: 'class="task-list-item-checkbox" disabled="disabled" />', _cbo | replace: ' role="doc-endnote">', '>' -%}
114
+ {{ _c }}
@@ -0,0 +1,46 @@
1
+ {%- comment -%}md-components v1 — inline transforms (called by components.html; needs modootoday/i18n.html first).
2
+ `file:<name>` alone in a paragraph right before a fenced block → div.mt-code > p.mt-code-title + the block.
3
+ `progress:<0-100>` → span.mt-progress > progress[max=100] labelled progress.label, plus "N%" as text.
4
+ `embed:https://… Title` alone in a paragraph → div.mt-embed > iframe (lazy; title = the words after the URL,
5
+ else embed.title). `loading:spinner|bar` and `skeleton:text|card|image|avatar|row` → role=status
6
+ placeholders labelled loading.label (optional loading sheet). Footnote back-links get aria-label footnote.back. modootoday-check validates the values.{%- endcomment -%}
7
+ {%- assign _x = include.html -%}
8
+ {%- assign _ops = '<code class="language-plaintext highlighter-rouge">|<code>' | split: "|" -%}
9
+ {%- for _o in _ops -%}
10
+ {%- assign _key = "<p>" | append: _o | append: "file:" -%}
11
+ {%- if _x contains _key -%}{%- assign _bits = _x | split: _key -%}
12
+ {%- capture _x -%}{{ _bits[0] }}{%- for _b in _bits offset: 1 -%}
13
+ {%- assign _v = _b | split: "</code></p>" | first -%}{%- assign _r = _b | remove_first: _v | remove_first: "</code></p>" | lstrip -%}
14
+ {%- assign _h = _r | slice: 0, 16 -%}
15
+ {%- if _v contains "<" or _v == _b or _h != '<div class="lang' -%}{{ _key }}{{ _b }}
16
+ {%- else -%}{%- assign _blk = _r | split: "</code></pre></div></div>" | first -%}
17
+ <div class="mt-code"><p class="mt-code-title"><span class="mt-sr-only">{{ mt_t_code_file }}: </span>{{ _v }}</p>{{ _blk }}</code></pre></div></div></div>{{ _r | remove_first: _blk | remove_first: "</code></pre></div></div>" }}
18
+ {%- endif -%}{%- endfor -%}{%- endcapture -%}{%- endif -%}
19
+ {%- assign _key = _o | append: "progress:" -%}
20
+ {%- if _x contains _key -%}{%- assign _bits = _x | split: _key -%}
21
+ {%- capture _x -%}{{ _bits[0] }}{%- for _b in _bits offset: 1 -%}
22
+ {%- assign _v = _b | split: "</code>" | first -%}{%- assign _n = _v | plus: 0 -%}{%- assign _ns = _n | append: "" -%}
23
+ {%- if _ns != _v or _n < 0 or _n > 100 -%}{{ _key }}{{ _b }}
24
+ {%- else -%}<span class="mt-progress"><progress max="100" value="{{ _n }}" aria-label="{{ mt_t_progress_label }}">{{ _n }}%</progress> {{ _n }}%</span>{{ _b | remove_first: _v | remove_first: "</code>" }}
25
+ {%- endif -%}{%- endfor -%}{%- endcapture -%}{%- endif -%}
26
+ {%- assign _key = "<p>" | append: _o | append: "embed:https://" -%}
27
+ {%- if _x contains _key -%}{%- assign _bits = _x | split: _key -%}
28
+ {%- capture _x -%}{{ _bits[0] }}{%- for _b in _bits offset: 1 -%}
29
+ {%- assign _v = _b | split: "</code></p>" | first -%}
30
+ {%- if _v contains "<" or _v contains '"' or _v == _b -%}{{ _key }}{{ _b }}
31
+ {%- else -%}{%- assign _u = _v | split: " " | first -%}{%- assign _t = _v | remove_first: _u | strip | default: mt_t_embed_title -%}
32
+ <div class="mt-embed"><iframe src="https://{{ _u }}" title="{{ _t }}" loading="lazy" allowfullscreen referrerpolicy="strict-origin-when-cross-origin"></iframe></div>{{ _b | remove_first: _v | remove_first: "</code></p>" }}
33
+ {%- endif -%}{%- endfor -%}{%- endcapture -%}{%- endif -%}
34
+ {%- assign _key = _o | append: "loading:" -%}
35
+ {%- capture _ld %}<span class="mt-sr-only">{{ mt_t_loading_label }}</span>{% endcapture -%}
36
+ {%- capture _sp %}<span class="mt-spinner" role="status">{{ _ld }}</span>{% endcapture -%}
37
+ {%- capture _tb %}<span class="mt-topbar" role="status">{{ _ld }}</span>{% endcapture -%}
38
+ {%- assign _f1 = _key | append: "spinner</code>" -%}{%- assign _f2 = _key | append: "bar</code>" -%}
39
+ {%- assign _x = _x | replace: _f1, _sp | replace: _f2, _tb -%}
40
+ {%- assign _sks = "text,card,image,avatar,row" | split: "," -%}
41
+ {%- for _sk in _sks -%}{%- capture _sf %}{{ _o }}skeleton:{{ _sk }}</code>{% endcapture -%}
42
+ {%- capture _st %}<span class="mt-skeleton mt-skeleton-{{ _sk }}" role="status" aria-busy="true">{{ _ld }}</span>{% endcapture -%}
43
+ {%- assign _x = _x | replace: _sf, _st -%}{%- endfor -%}
44
+ {%- endfor -%}
45
+ {%- capture _fb %}class="reversefootnote" role="doc-backlink" aria-label="{{ mt_t_footnote_back }}"{% endcapture -%}
46
+ {{ _x | replace: 'class="reversefootnote" role="doc-backlink"', _fb }}
@@ -0,0 +1,14 @@
1
+ {%- comment -%}md-components v1: assigns _llms_pages = Markdown pages in the current page's directory tree and language (twin: false and README.md excluded), sorted by url.{%- endcomment -%}
2
+ {%- assign _llms_lang = page.lang | default: site.lang | default: "en" -%}
3
+ {%- assign _llms_dir = page.path | split: "/" | pop | join: "/" -%}
4
+ {%- if _llms_dir != "" -%}{%- assign _llms_dir = _llms_dir | append: "/" -%}{%- endif -%}
5
+ {%- assign _llms_pages = "" | split: "" -%}
6
+ {%- assign _llms_sorted = site.pages | sort: "url" -%}
7
+ {%- for _p in _llms_sorted -%}
8
+ {%- assign _pext = _p.path | split: "." | last -%}
9
+ {%- assign _plang = _p.lang | default: site.lang | default: "en" -%}
10
+ {%- assign _pstart = _p.path | slice: 0, _llms_dir.size -%}
11
+ {%- if _pext == "md" and _p.name != "README.md" and _p.twin != false and _plang == _llms_lang and _pstart == _llms_dir -%}
12
+ {%- assign _llms_pages = _llms_pages | push: _p -%}
13
+ {%- endif -%}
14
+ {%- endfor -%}
@@ -0,0 +1,6 @@
1
+ {%- comment -%}md-components v1: the source body of include.file (path relative to the current page), front matter removed. Used by the twin and llms-full layouts.{%- endcomment -%}
2
+ {%- capture _raw -%}{% include_relative {{ include.file }} %}{%- endcapture -%}
3
+ {%- assign _fm = _raw | split: "---" -%}
4
+ {%- assign _front = "---" | append: _fm[1] | append: "---
5
+ " -%}
6
+ {{- _raw | remove_first: _front -}}
@@ -0,0 +1,43 @@
1
+ {%- comment -%}
2
+ md-components v1 — jekyll-theme-modootoday
3
+ Usage (doc layout): {% include modootoday/markdown/sections.html content=html sections=page.sections %}
4
+ No sections: whole body in one div.mt-prose (no implicit split).
5
+ With sections: part 0 (before the first h2) is section.mt-hero; item i maps to the i-th top-level h2.
6
+ Only top-level h2 split: kramdown prints them at column 0 ("\n<h2 "), nested ones (quote, list,
7
+ alert) are indented and stay inside their section. modootoday-check rejects nested/setext/indented ##.
8
+ Item: "name" or {c: component, name: key, ...params}. c: tabs → data-tabs, c: cta → (on the section, or on its [data-mt-result] element when it holds one, so a showcase box only frames the result).
9
+ visual: <name> on an item (or include.hero.visual for the hero) appends the site's
10
+ _includes/sections/<name>.html at the end of that section, called with section=<item> (hero=<hero>).
11
+ modootoday-check fails when the item count differs from the h2 count.
12
+ {%- endcomment -%}
13
+ {%- assign _lang = include.lang | default: site.lang | default: "en" -%}
14
+ {%- include modootoday/i18n.html lang=_lang -%}{%- assign _tl = mt_t_tabs_label -%}
15
+ {%- if include.sections -%}
16
+ {%- assign _nl = "
17
+ " -%}
18
+ {%- assign _sep = _nl | append: "<h2 " -%}
19
+ {%- comment -%}kramdown appends footnotes at column 0 after the last block; keep them out of the last section (e.g. a CTA card).{%- endcomment -%}
20
+ {%- assign _fsep = _nl | append: '<div class="footnotes"' -%}
21
+ {%- assign _fparts = include.content | split: _fsep -%}
22
+ {%- assign _main = _fparts[0] -%}{%- assign _notes = "" -%}
23
+ {%- if _fparts.size > 1 -%}{%- assign _notes = include.content | remove_first: _main | strip -%}{%- endif -%}
24
+ {%- assign _parts = _main | prepend: _nl | split: _sep -%}
25
+ {%- assign mt_c_transforms = "|filetree|linkcards|details|faq|params|quote|gallery|pricing|subscribe|" -%}
26
+ {%- assign _p0 = _parts[0] -%}{%- capture _hero %}{% include modootoday/actions.html html=_p0 %}{% endcapture -%}
27
+ <section class="mt-hero">{{ _hero }}{% if include.hero.visual %}{% include sections/{{ include.hero.visual }}.html section=include.hero %}{% endif %}</section>
28
+ {%- for _p in _parts offset:1 -%}
29
+ {%- assign _s = include.sections[forloop.index0] -%}
30
+ {%- if _s.name or _s.c -%}{%- assign _n = _s.name -%}{%- assign _cc = _s.c -%}{%- else -%}{%- assign _n = _s -%}{%- assign _cc = nil -%}{%- endif -%}
31
+ {%- assign _body = _p -%}
32
+ {%- if _cc == 'cta' -%}{%- capture _body %}{% include modootoday/actions.html html=_p %}{% endcapture -%}{%- endif -%}
33
+ {%- if _cc == 'features' -%}{%- assign _body = _body | replace: "</strong> — ", "</strong> " | replace: "</strong> – ", "</strong> " | replace: "</strong> - ", "</strong> " -%}{%- endif -%}
34
+ {%- if _cc and mt_c_transforms contains _cc -%}{%- capture _body %}{% include modootoday/markdown/c/{{ _cc }}.html html=_body s=_s i=forloop.index id=_n %}{% endcapture -%}{%- endif -%}
35
+ <section class="mt-section{% if _cc %} mt-c-{{ _cc }}{% endif %}{% if _cc == 'cta' %}{% unless _body contains 'data-mt-result' %} mt-cta{% endunless %}{% endif %}{% if _s.cols %} mt-cols-{{ _s.cols }}{% endif %}" data-section="{{ _n | default: forloop.index0 }}"{% if _cc %} data-c="{{ _cc }}"{% endif %}{% if _cc == 'tabs' %} data-tabs data-tabs-label="{{ _tl }}"{% endif %}>
36
+ <h2 {{ _body }}{% if _s.visual %}{% include sections/{{ _s.visual }}.html section=_s %}{% endif %}</section>
37
+ {%- endfor -%}
38
+ {%- if _notes != "" %}
39
+ <div class="mt-endnotes">{{ _notes }}</div>
40
+ {%- endif -%}
41
+ {%- else -%}
42
+ <div class="mt-prose">{{ include.content }}</div>
43
+ {%- endif -%}
@@ -0,0 +1,6 @@
1
+ {%- comment -%}Marketing page header: title (h1, id mt-mk-title), description as the lead, page.actions [{label, url}] as buttons.{%- endcomment -%}
2
+ <header class="mt-mk-head">
3
+ <h1 id="mt-mk-title">{{ page.title }}</h1>
4
+ {%- if page.description %}<p class="mt-mk-lead">{{ page.description }}</p>{% endif %}
5
+ {%- if page.actions %}<p class="mt-mk-actions">{% for a in page.actions %}<a class="mt-mk-btn" href="{% include modootoday/link.html url=a.url %}"{% include modootoday/links/attrs.html on=a.new_window target=a.target url=a.url %}>{{ a.label }}</a>{% endfor %}</p>{% endif %}
6
+ </header>
@@ -0,0 +1,24 @@
1
+ {%- comment -%}Byline for a post: authors (front matter author: id or authors: [ids]; names, links and avatars from
2
+ _data/authors.yml: {id: {name, url, avatar, bio}}; unknown ids print as written), published and updated <time>, reading time.
3
+ dateline: a news place line ("SEOUL —"). Parts: data-part="byline|authors|dates".{%- endcomment -%}
4
+ {%- assign _bp = include.post | default: page -%}
5
+ {%- assign _ba = _bp.authors | default: _bp.author -%}
6
+ {%- if _ba and _ba.first == nil -%}{%- assign _ba = _ba | split: "," -%}{%- endif -%}
7
+ <div class="mt-byline" data-part="byline">
8
+ {%- if _ba and site.modootoday.authors != false %}
9
+ <p class="mt-byline-authors" data-part="authors"><span>{{ mt_t_blog_by }}</span>
10
+ {%- for _id in _ba -%}{%- assign _id = _id | strip -%}{%- assign _au = site.data.authors[_id] -%}
11
+ {%- if _au.avatar %} <img class="mt-avatar" src="{{ _au.avatar | relative_url }}" alt="" width="24" height="24" loading="lazy">{% endif %}
12
+ {%- assign _aurl = _au.page | default: _au.url -%}
13
+ {% if _aurl %}<a class="mt-post-author" rel="author" href="{{ _aurl | relative_url }}">{{ _au.name | default: _id }}</a>{% else %}<span class="mt-post-author">{{ _au.name | default: _id }}</span>{% endif %}{% unless forloop.last %},{% endunless %}
14
+ {%- endfor -%}
15
+ </p>
16
+ {%- endif %}
17
+ <p class="mt-byline-dates" data-part="dates">
18
+ {%- if _bp.dateline %}<span class="mt-dateline">{{ _bp.dateline }}</span> {% endif -%}
19
+ <time datetime="{{ _bp.date | date_to_xmlschema }}">{{ _bp.date | date: mt_t_post_date_format }}</time>
20
+ {%- assign _bu = _bp.last_modified_at | default: _bp.updated -%}
21
+ {%- if _bu %} · <span class="mt-byline-updated">{{ mt_t_blog_updated }} <time datetime="{{ _bu | date_to_xmlschema }}">{{ _bu | date: mt_t_post_date_format }}</time></span>{% endif -%}
22
+ {%- if mt_blog_rt %}{% include modootoday/blog/reading-time.html post=_bp %} · <span>{{ mt_t_blog_reading_time | replace: "[n]", mt_rt }}</span>{% endif -%}
23
+ </p>
24
+ </div>
@@ -0,0 +1,16 @@
1
+ {%- comment -%}Previous / next post in the same language (newer = next). front matter post_nav: false hides it.{%- endcomment -%}
2
+ {%- unless page.post_nav == false -%}
3
+ {%- include modootoday/blog/select.html -%}
4
+ {%- for _p in mt_posts -%}{%- if _p.url == page.url -%}{%- assign _mpi = forloop.index0 -%}{%- endif -%}{%- endfor -%}
5
+ {%- if _mpi -%}
6
+ {%- assign _mpn = _mpi | minus: 1 -%}{%- assign _mpv = _mpi | plus: 1 -%}
7
+ {%- if _mpn >= 0 or _mpv < mt_posts.size %}
8
+ <nav class="mt-pagination mt-post-nav" aria-label="{{ mt_t_pagination_label }}">
9
+ {%- if _mpv < mt_posts.size %}{% assign _p = mt_posts[_mpv] %}
10
+ <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 | escape }}</a>
11
+ {%- endif -%}
12
+ {%- if _mpn >= 0 %}{% assign _p = mt_posts[_mpn] %}
13
+ <a rel="next" href="{{ _p.url | relative_url }}"><small>{{ mt_t_pagination_next }} {% include modootoday/brand/icon.html name="next" size=14 %}</small> {{ _p.title | escape }}</a>
14
+ {%- endif %}
15
+ </nav>
16
+ {%- endif -%}{%- endif -%}{%- endunless -%}