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,8 @@
1
+ // Progress: `progress:60` → a labelled native <progress> plus the value as text.
2
+ @include mt-layer(components) {
3
+ .mt-progress { display: inline-flex; align-items: center; gap: .5rem; vertical-align: middle; font-size: .875rem; color: mt(muted-foreground); }
4
+ .mt-progress progress { appearance: none; width: 8rem; height: .5rem; border: 0; border-radius: 999px; background: mt(muted); overflow: hidden; accent-color: mt(primary); }
5
+ .mt-progress progress::-webkit-progress-bar { background: mt(muted); }
6
+ .mt-progress progress::-webkit-progress-value { background: mt(primary); }
7
+ .mt-progress progress::-moz-progress-bar { background: mt(primary); }
8
+ }
@@ -0,0 +1,10 @@
1
+ // Page actions (details.mt-menu.mt-page-actions): a small menu at the inline end above the article.
2
+ @include mt-layer(components) {
3
+ .mt-page-actions { position: relative; float: inline-end; margin-inline-start: 1rem; z-index: 5; margin-block-end: var(--mt-p-space-4); }
4
+ // Any block that clears the float (hero, wide figure/card rows) sits below its margin box: one gap rule for all of them.
5
+ @media (min-width: 48rem) { .mt-page-actions { margin-block-end: var(--mt-p-space-6); } }
6
+ .mt-page-actions > summary { border: 1px solid mt(border); }
7
+ .mt-page-actions > ul { inset-inline: auto 0; }
8
+ .mt-page-actions button { width: 100%; padding: .35rem .6rem; border: 0; border-radius: mt(radius); background: none; color: inherit; font: inherit; text-align: start; cursor: pointer; }
9
+ .mt-page-actions button:hover { background: mt(accent); }
10
+ }
@@ -0,0 +1,31 @@
1
+ // Doc sidebar from grouped nav: a sticky column from 64rem (aside.mt-doc-nav), a collapsed <details> below it. The sticky column rule is shared with the TOC in layout/_shell.scss.
2
+ // With a sidebar the header drops the inline copies of group links (.mt-nav-flat), so narrow headers stay short.
3
+ @include mt-layer(components) {
4
+ .mt-sidebar { font-size: .9rem; }
5
+ .mt-sidebar ul { list-style: none; margin: 0; padding: 0; }
6
+ .mt-sidebar a { display: block; padding: .3rem .6rem; border-radius: mt(radius); color: mt(muted-foreground); text-decoration: none; }
7
+ .mt-sidebar a:hover, .mt-sidebar [aria-current] { color: mt(foreground); background: mt(accent); }
8
+ .mt-sidebar [aria-current] { font-weight: 600; }
9
+ .mt-sidebar-group { margin-top: 1rem; }
10
+ .mt-sidebar summary { cursor: pointer; }
11
+ .mt-sidebar ul ul summary { padding: .3rem .6rem; color: mt(muted-foreground); }
12
+ .mt-sidebar ul ul { padding-inline-start: .75rem; }
13
+ .mt-sidebar-title { display: list-item; padding: 0 .6rem .3rem; font-size: .75rem; font-weight: 650; letter-spacing: .06em; text-transform: uppercase; }
14
+ .mt-doc-nav, .mt-body:has(.mt-doc-nav) .mt-nav-flat { display: none; }
15
+ .mt-sidebar-mobile { margin: 0 0 1rem; border: 1px solid mt(border); border-radius: mt(radius); background: mt(muted); font-size: .875rem; }
16
+ .mt-sidebar-mobile > summary { cursor: pointer; padding: .55rem .85rem; font-weight: 600; }
17
+ .mt-sidebar-mobile > .mt-sidebar { padding: 0 .5rem .6rem; max-height: 60vh; overflow-y: auto; }
18
+ @media (min-width: 64rem) {
19
+ .mt-sidebar-mobile, .mt-has-sidebar .mt-doc-aside { display: none; }
20
+ .mt-doc-layout.mt-has-sidebar { display: grid; grid-template-columns: 12rem minmax(0, #{mt(measure)}); gap: 3rem; max-width: none; }
21
+ .mt-has-sidebar .mt-doc-nav { display: block; }
22
+ .mt-has-sidebar .mt-toc-mobile { display: block; }
23
+ .mt-doc-layout.mt-has-sidebar ~ * { max-width: mt(measure); margin-inline-start: 15rem; }
24
+ }
25
+ @media (min-width: 80rem) {
26
+ .mt-has-sidebar.mt-has-toc { grid-template-columns: 12rem minmax(0, 1fr) 12rem; gap: 2.5rem; }
27
+ .mt-has-sidebar .mt-doc-aside { display: block; grid-column: 3; grid-row: 1; }
28
+ .mt-has-sidebar .mt-toc-mobile { display: none; }
29
+ .mt-doc-layout.mt-has-sidebar ~ * { margin-inline-start: 14.5rem; }
30
+ }
31
+ }
@@ -0,0 +1,19 @@
1
+ // "On this page": a sticky right column from 64rem (aside > nav.mt-toc), a collapsed <details> below it.
2
+ @include mt-layer(components) {
3
+ .mt-toc { --mt-toc-indent: .85rem; font-size: .875rem; }
4
+ .mt-toc-title { margin: 0 0 .6rem; font-size: .75rem; font-weight: 650; letter-spacing: .06em; text-transform: uppercase; color: mt(foreground); }
5
+ .mt-toc ol, .mt-toc-mobile ol { list-style: none; margin: 0; padding: 0; }
6
+ .mt-toc ol { border-inline-start: 1px solid mt(border); }
7
+ .mt-toc li, .mt-toc-mobile li { margin: 0; }
8
+ .mt-toc .mt-toc-h3, .mt-toc-mobile .mt-toc-h3 { padding-inline-start: var(--mt-toc-indent); }
9
+ .mt-toc a, .mt-toc-mobile a { display: block; min-height: 24px; padding: .2rem 0 .2rem .85rem; line-height: 1.45; color: mt(muted-foreground); text-decoration: none; }
10
+ .mt-toc a { margin-inline-start: -1px; border-inline-start: 1px solid transparent; }
11
+ .mt-toc a:hover, .mt-toc-mobile a:hover { color: mt(foreground); border-inline-start-color: mt(muted-foreground); }
12
+ .mt-toc-mobile { margin: 0 0 1.5rem; border: 1px solid mt(border); border-radius: mt(radius); background: mt(muted); font-size: .875rem; }
13
+ .mt-toc-mobile > summary { cursor: pointer; padding: .55rem .85rem; font-weight: 600; }
14
+ .mt-toc-mobile > ol { padding: 0 .5rem .6rem 0; max-height: 50vh; overflow-y: auto; }
15
+ // The sticky column lists h2 only, so long pages stay scannable; the collapsed mobile list keeps h3 too.
16
+ .mt-doc-aside .mt-toc .mt-toc-h3 { display: none; }
17
+ .mt-doc-aside .mt-toc a { padding-top: .3rem; padding-bottom: .3rem; }
18
+ @media (min-width: 64rem) { .mt-toc-mobile { display: none; } }
19
+ }
@@ -0,0 +1,33 @@
1
+ // Loading and skeleton UI (optional sheet, CSS only): `loading:spinner`, `loading:bar` (thin top bar) and
2
+ // `skeleton:text|card|image|avatar|row` placeholders, plus .mt-ratio-* boxes that reserve space for media.
3
+ // Motion stops under prefers-reduced-motion; forced-colors keeps outlines visible; the shimmer follows dir.
4
+ @include mt-layer(components) {
5
+ .mt-spinner { display: inline-block; width: 1.25rem; height: 1.25rem; vertical-align: middle; border: 2px solid mt(border); border-top-color: mt(primary);
6
+ border-radius: 50%; animation: mt-spin .8s linear infinite; }
7
+ .mt-topbar { position: fixed; inset-block-start: 0; inset-inline: 0; z-index: 200; display: block; height: 3px; overflow: hidden; background: color-mix(in srgb, #{mt(primary)} 20%, transparent); }
8
+ .mt-topbar::before { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; width: 40%; background: mt(primary); animation: mt-bar 1.2s ease-in-out infinite; }
9
+ .mt-skeleton { display: block; margin: 0 0 .75rem; border-radius: mt(radius); background: linear-gradient(90deg, #{mt(muted)} 25%, #{mt(accent)} 50%, #{mt(muted)} 75%);
10
+ background-size: 200% 100%; animation: mt-shimmer 1.4s ease-in-out infinite; }
11
+ [dir="rtl"] .mt-skeleton { animation-direction: reverse; }
12
+ .mt-skeleton-text { height: .9rem; max-width: 36rem; box-shadow: 0 1.4rem 0 -.05rem mt(muted); margin-bottom: 2.1rem; }
13
+ .mt-skeleton-card { height: 9rem; border-radius: mt(radius-lg); }
14
+ .mt-skeleton-image, .mt-ratio-16x9 { aspect-ratio: 16 / 9; }
15
+ .mt-skeleton-image { width: 100%; }
16
+ .mt-skeleton-avatar { width: 2.5rem; height: 2.5rem; border-radius: 50%; }
17
+ .mt-skeleton-row { height: 2.5rem; border-radius: 0; border-bottom: 1px solid mt(border); }
18
+ .mt-ratio-4x3 { aspect-ratio: 4 / 3; }
19
+ .mt-ratio-1x1 { aspect-ratio: 1; }
20
+ .mt-prose img[width][height] { height: auto; }
21
+ @media (prefers-reduced-motion: reduce) {
22
+ .mt-spinner, .mt-skeleton, .mt-topbar::before { animation: none; }
23
+ .mt-topbar::before { width: 100%; opacity: .6; }
24
+ }
25
+ @media (forced-colors: active) {
26
+ .mt-skeleton { background: Canvas; border: 1px solid CanvasText; }
27
+ .mt-spinner { border-color: CanvasText; border-top-color: Highlight; }
28
+ .mt-topbar::before { background: Highlight; }
29
+ }
30
+ }
31
+ @keyframes mt-spin { to { transform: rotate(360deg); } }
32
+ @keyframes mt-bar { 0% { inset-inline-start: -40%; } 100% { inset-inline-start: 100%; } }
33
+ @keyframes mt-shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }
@@ -0,0 +1,36 @@
1
+ // Search box (header) and results list; needs a site /search.json (include modootoday/search.json).
2
+ @include mt-layer(components) {
3
+ .mt-search { position: relative; margin-inline-start: auto; flex: none; }
4
+ // Reserve the box from the first paint when scripting is on (search.js only wires it up), so the header does not jump.
5
+ @media (scripting: enabled) { .mt-search[hidden] { display: block; } }
6
+ .mt-search > .mt-icon { position: absolute; inset-inline-start: .65rem; top: 1.125rem; translate: 0 -50%; color: mt(muted-foreground); pointer-events: none; }
7
+ .mt-search input { font: inherit; font-size: .875rem; height: 2.25rem; padding: 0 .75rem; padding-inline-start: 2.1rem; border: 1px solid mt(border); border-radius: mt(radius);
8
+ background: mt(muted); color: mt(foreground); width: 12rem; transition: border-color .15s, background-color .15s; }
9
+ .mt-search input::placeholder { color: mt(muted-foreground); }
10
+ .mt-search input:hover { border-color: mt(muted-foreground); }
11
+ .mt-search input:focus-visible { outline-offset: 1px; background: mt(background); }
12
+ .mt-search-results { position: absolute; inset-inline-end: 0; z-index: 30; list-style: none; margin: .4rem 0 0; padding: .35rem; width: 22rem; max-width: calc(100vw - 2rem);
13
+ background: mt(card); color: mt(card-foreground); border: 1px solid mt(border); border-radius: mt(radius-lg); box-shadow: mt(shadow); }
14
+ .mt-search-results:empty { display: none; }
15
+ .mt-search-results li + li { margin-top: 0; }
16
+ .mt-search-results a { display: block; padding: .4rem .6rem; border-radius: var(--mt-p-radius-sm); text-decoration: none; font-size: .9rem; }
17
+ .mt-search-results a { color: mt(foreground); }
18
+ .mt-search-title { display: block; font-weight: 600; }
19
+ .mt-search-snippet { display: block; margin-top: .1rem; font-size: .8rem; line-height: 1.45; color: mt(muted-foreground);
20
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
21
+ .mt-search-results a:hover, .mt-search-results a:focus { background: mt(accent); color: mt(accent-foreground); }
22
+ @media (max-width: 47.99rem) { .mt-search { flex: 1 1 0; min-width: 0; } .mt-search input { width: 100%; padding-inline-end: .5rem; } .mt-search { position: static; }
23
+ .mt-search-results { inset-inline: 1rem; top: 2.9rem; width: auto; max-width: none; } }
24
+ // Narrow phones: search takes its own row under the title so the input stays usable next to the header buttons.
25
+ @media (max-width: 29.99rem) { .mt-search { order: 9; flex: 1 0 100%; position: relative; }
26
+ .mt-search-results { inset-inline: 0; top: 100%; } }
27
+ }
28
+ @include mt-layer(components) {
29
+ // 64–80rem: the one-line header is tight; let search shrink so it never overlaps the nav (WCAG 2.2 target-size).
30
+ @media (min-width: 64rem) { .mt-search { flex: 0 1 15rem; min-width: 5rem; } .mt-search input { width: 100%; } }
31
+ }
32
+ // Coarse pointers and forced colors (here, not in core _access, because this sheet loads after core).
33
+ @include mt-layer(components) {
34
+ @media (pointer: coarse) { .mt-search input { height: 2.75rem; font-size: 1rem; } }
35
+ @media (forced-colors: active) { .mt-search input { border: 1px solid ButtonText; } }
36
+ }
@@ -0,0 +1,15 @@
1
+ // Cards: c: features section, list items "- **Title** — description" (the dash is dropped in Liquid).
2
+ @include mt-layer(components) {
3
+ .mt-c-features > ul { --mt-card-padding: 1.25rem;
4
+ list-style: none; padding: 0; margin: 1.5rem 0 0; display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); }
5
+ .mt-c-features > ul > li { margin: 0; border: 1px solid mt(border); border-radius: mt(radius-lg); padding: var(--mt-card-padding);
6
+ background: mt(card); color: mt(muted-foreground); box-shadow: mt(shadow-sm); font-size: .9375rem; line-height: 1.6;
7
+ transition: border-color .15s, box-shadow .15s; }
8
+ .mt-c-features > ul > li code { white-space: nowrap; }
9
+ .mt-c-features > ul > li:hover { border-color: color-mix(in srgb, #{mt(primary)} 40%, #{mt(border)}); box-shadow: mt(shadow); }
10
+ .mt-c-features > ul > li > strong:first-child { display: block; margin-bottom: .35rem; color: mt(card-foreground); font-size: 1rem; }
11
+ @media (min-width: 48rem) {
12
+ .mt-cols-2 > ul { grid-template-columns: repeat(2, minmax(0, 1fr)); }
13
+ .mt-cols-3 > ul { grid-template-columns: repeat(3, minmax(0, 1fr)); }
14
+ }
15
+ }
@@ -0,0 +1,7 @@
1
+ // c: cta sections: a centred, tinted panel around the heading and its action buttons (.mt-actions lives in core).
2
+ @include mt-layer(components) {
3
+ .mt-cta { margin-top: mt(space-section); padding: 2.5rem 2rem; text-align: center; border: 1px solid mt(border); border-radius: mt(radius-lg);
4
+ background: radial-gradient(120% 140% at 50% 0%, color-mix(in srgb, #{mt(primary)} 10%, #{mt(background)}), #{mt(muted)}); }
5
+ .mt-cta > h2 { margin: 0 0 .5rem; }
6
+ .mt-cta > .mt-actions { justify-content: center; margin-top: 1.25rem; }
7
+ }
@@ -0,0 +1,15 @@
1
+ // Gallery: c: gallery, a list of images → thumbnail grid; each opens a no-script :target lightbox with a close link.
2
+ @include mt-layer(components) {
3
+ .mt-c-gallery > ul { list-style: none; padding: 0; margin: 1.5rem 0 0; display: grid; gap: .75rem; grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); }
4
+ .mt-c-gallery > ul > li { margin: 0; }
5
+ .mt-gallery-thumb { display: block; border-radius: mt(radius); overflow: hidden; border: 1px solid mt(border); }
6
+ .mt-gallery-thumb img { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; transition: transform .2s; }
7
+ .mt-gallery-thumb:hover img { transform: scale(1.03); }
8
+ .mt-gallery-thumb:focus-visible { outline: 2px solid mt(ring); outline-offset: 2px; }
9
+ .mt-lightbox { display: none; }
10
+ .mt-lightbox:target { position: fixed; inset: 0; z-index: 100; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1rem;
11
+ padding: 1.5rem; background: rgba(0, 0, 0, .85); }
12
+ .mt-lightbox img { max-width: 100%; max-height: 80vh; border-radius: mt(radius); }
13
+ .mt-lightbox-close { display: inline-flex; align-items: center; min-height: 2.5rem; padding: 0 1rem; border-radius: 999px; background: #fff; color: #111; font-weight: 600; text-decoration: none; }
14
+ @media (prefers-reduced-motion: reduce) { .mt-gallery-thumb img { transition: none; } }
15
+ }
@@ -0,0 +1,12 @@
1
+ // Link cards: c: linkcards, list items "[Title](url) — description"; the whole card is one link target.
2
+ @include mt-layer(components) {
3
+ .mt-c-linkcards > ul { list-style: none; padding: 0; margin: 1.5rem 0 0; display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
4
+ .mt-c-linkcards > ul > li { position: relative; margin: 0; padding: 1.1rem 1.25rem; border: 1px solid mt(border); border-radius: mt(radius-lg);
5
+ background: mt(card); color: mt(muted-foreground); font-size: .9375rem; transition: border-color .15s, box-shadow .15s; }
6
+ .mt-c-linkcards > ul > li > a:first-child { display: block; margin-bottom: .25rem; color: mt(card-foreground); font-weight: 650; text-decoration: none; }
7
+ .mt-c-linkcards > ul > li > a:first-child::before { content: ""; position: absolute; inset: 0; border-radius: inherit; }
8
+ .mt-c-linkcards > ul > li > a:first-child::after { content: " →"; color: mt(primary); }
9
+ [dir="rtl"] .mt-c-linkcards > ul > li > a:first-child::after { content: " ←"; }
10
+ .mt-c-linkcards > ul > li:hover { border-color: mt(primary); box-shadow: mt(shadow); }
11
+ .mt-c-linkcards > ul > li > a:first-child:focus-visible { outline: 2px solid mt(ring); outline-offset: 2px; border-radius: mt(radius); }
12
+ }
@@ -0,0 +1,12 @@
1
+ // Pricing: c: pricing; each ### is a plan card (price, feature list, link). recommended: <n> marks one plan in text.
2
+ @include mt-layer(components) {
3
+ .mt-plans { display: grid; gap: 1rem; margin-top: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); align-items: stretch; }
4
+ .mt-plan { position: relative; display: flex; flex-direction: column; padding: 1.5rem; border: 1px solid mt(border); border-radius: mt(radius-lg); background: mt(card); box-shadow: mt(shadow-sm); }
5
+ .mt-plan h3 { margin: 0 0 .5rem; font-size: 1.0625rem; }
6
+ .mt-plan h3 + p { margin: 0 0 1rem; color: mt(muted-foreground); }
7
+ .mt-plan h3 + p strong { color: mt(card-foreground); font-size: 1.875rem; font-weight: 750; letter-spacing: -.02em; }
8
+ .mt-plan ul { flex: 1; margin: 0 0 1.25rem; padding-inline-start: 1.1rem; color: mt(muted-foreground); font-size: .9375rem; }
9
+ .mt-plan .mt-actions { margin-top: auto; }
10
+ .mt-plan-recommended { border: 2px solid mt(primary); box-shadow: mt(shadow); }
11
+ .mt-plan-flag { align-self: flex-start; margin-bottom: .75rem; padding: .1rem .6rem; border-radius: 999px; background: mt(primary); color: mt(primary-foreground); font-size: .75rem; font-weight: 600; }
12
+ }
@@ -0,0 +1,7 @@
1
+ // Quote: c: quote; a quote whose last paragraph starts with "— " becomes figure > blockquote + figcaption.
2
+ @include mt-layer(components) {
3
+ .mt-quote { margin: 1.5rem 0; padding: 1.5rem 1.75rem; border: 1px solid mt(border); border-radius: mt(radius-lg); background: mt(card); }
4
+ .mt-quote blockquote { margin: 0; padding: 0; border: 0; color: mt(card-foreground); font-size: 1.125rem; line-height: 1.6; }
5
+ .mt-quote blockquote > :last-child { margin-bottom: 0; }
6
+ .mt-quote figcaption { margin-top: 1rem; color: mt(muted-foreground); font-size: .875rem; font-weight: 600; }
7
+ }
@@ -0,0 +1,9 @@
1
+ // Subscribe: c: subscribe; the section text plus a static e-mail form posting to modootoday.subscribe.action.
2
+ @include mt-layer(components) {
3
+ .mt-subscribe { display: flex; flex-wrap: wrap; gap: .5rem; align-items: flex-end; margin-top: 1.25rem; }
4
+ .mt-subscribe label { flex-basis: 100%; font-size: .875rem; font-weight: 600; }
5
+ .mt-subscribe input { flex: 1 1 14rem; min-height: 2.75rem; padding: 0 .9rem; border: 1px solid mt(border); border-radius: mt(radius);
6
+ background: mt(background); color: mt(foreground); font: inherit; }
7
+ .mt-subscribe input:focus-visible, .mt-subscribe button:focus-visible { outline: 2px solid mt(ring); outline-offset: 2px; }
8
+ .mt-subscribe button { min-height: 2.75rem; padding: 0 1.25rem; border: 0; border-radius: mt(radius); background: mt(primary); color: mt(primary-foreground); font: inherit; font-weight: 600; cursor: pointer; }
9
+ }
@@ -0,0 +1,15 @@
1
+ // Accordion: sections with `c: accordion`; each `###` becomes a disclosure (assets/js/modootoday/accordion.js).
2
+ @include mt-layer(components) {
3
+ .mt-c-accordion h3 { margin: 0; border-top: 1px solid mt(border); font-size: 1rem; }
4
+ .mt-c-accordion > h2 + h3 { margin-top: 1.25rem; }
5
+ .mt-accordion-trigger { all: unset; box-sizing: border-box; display: flex; justify-content: space-between; align-items: center; gap: 1rem; width: 100%;
6
+ padding: 1rem 0; cursor: pointer; font-weight: 600; }
7
+ .mt-accordion-trigger:hover { color: mt(primary); }
8
+ .mt-accordion-trigger:focus-visible { outline: 2px solid mt(ring); outline-offset: 2px; }
9
+ .mt-accordion-trigger::after { content: ""; flex: none; width: .5rem; height: .5rem; margin-inline-end: .25rem; border: solid mt(muted-foreground);
10
+ border-width: 0 2px 2px 0; transform: translateY(-25%) rotate(45deg); transition: transform .2s; }
11
+ .mt-accordion-trigger[aria-expanded="true"]::after { transform: translateY(25%) rotate(-135deg); }
12
+ .mt-accordion-panel { padding-bottom: 1rem; color: mt(muted-foreground); }
13
+ .mt-accordion-panel[hidden] { display: none; }
14
+ .mt-c-accordion { border-bottom: 1px solid mt(border); }
15
+ }
@@ -0,0 +1,15 @@
1
+ // Details: c: details (and c: faq); each ### heading becomes a native <details> summary. No script needed.
2
+ @include mt-layer(components) {
3
+ .mt-details { border-top: 1px solid mt(border); }
4
+ .mt-details:last-of-type { border-bottom: 1px solid mt(border); }
5
+ .mt-details > summary { display: flex; justify-content: space-between; align-items: center; gap: 1rem; padding: 1rem 0; cursor: pointer; list-style: none; }
6
+ .mt-details > summary::-webkit-details-marker { display: none; }
7
+ .mt-details > summary h3 { margin: 0; font-size: 1rem; }
8
+ .mt-details > summary:hover { color: mt(primary); }
9
+ .mt-details > summary:focus-visible { outline: 2px solid mt(ring); outline-offset: 2px; }
10
+ .mt-details > summary::after { content: ""; flex: none; width: .5rem; height: .5rem; margin-inline-end: .25rem; border: solid mt(muted-foreground);
11
+ border-width: 0 2px 2px 0; transform: translateY(-25%) rotate(45deg); transition: transform .2s; }
12
+ .mt-details[open] > summary::after { transform: translateY(25%) rotate(-135deg); }
13
+ .mt-details > summary ~ * { color: mt(muted-foreground); }
14
+ .mt-details > :last-child { margin-bottom: 1rem; }
15
+ }
@@ -0,0 +1,5 @@
1
+ // FAQ: c: faq; the details disclosure plus FAQPage structured data (printed by Liquid, not styled).
2
+ @import "details";
3
+ @include mt-layer(components) {
4
+ .mt-c-faq > h2 + .mt-details { margin-top: 1.25rem; }
5
+ }
@@ -0,0 +1,13 @@
1
+ // File tree: c: filetree, a nested list; items with a nested list are folders. Guides drawn with borders.
2
+ @include mt-layer(components) {
3
+ .mt-c-filetree > ul { margin: 1.25rem 0; padding: .75rem 1rem; border: 1px solid mt(border); border-radius: mt(radius-lg); background: mt(muted); font: .875rem/1.7 mt(font-mono); }
4
+ .mt-c-filetree ul { list-style: none; }
5
+ .mt-c-filetree ul ul { margin: 0; padding-inline-start: 1.25rem; border-inline-start: 1px solid mt(border); }
6
+ .mt-c-filetree li { margin: 0; }
7
+ .mt-c-filetree li p { margin: 0; }
8
+ .mt-c-filetree li::before { content: ""; display: inline-block; width: .7rem; height: .85rem; margin-inline-end: .45rem; vertical-align: -.1rem;
9
+ border: 1.5px solid mt(muted-foreground); border-radius: 2px; }
10
+ .mt-c-filetree li:has(> ul)::before { width: .9rem; height: .7rem; border-radius: 2px 4px 2px 2px; background: color-mix(in srgb, #{mt(primary)} 25%, transparent); border-color: mt(primary); }
11
+ .mt-c-filetree li:has(> ul) { font-weight: 600; }
12
+ .mt-c-filetree li li:not(:has(> ul)) { font-weight: 400; }
13
+ }
@@ -0,0 +1,8 @@
1
+ // Parameter table: c: params, a GFM table (name, type, default, description); `required` in a cell becomes a badge.
2
+ @include mt-layer(components) {
3
+ .mt-c-params table { font-size: .9375rem; }
4
+ .mt-c-params td:first-child code { color: mt(primary); font-weight: 600; white-space: nowrap; }
5
+ .mt-c-params td:nth-child(2) { color: mt(muted-foreground); font-family: mt(font-mono); font-size: .8125rem; }
6
+ .mt-param-required { display: inline-block; padding: 0 .45rem; border: 1px solid color-mix(in srgb, #{mt(caution)} 50%, transparent); border-radius: 999px;
7
+ color: mt(caution); font-size: .75rem; font-weight: 600; white-space: nowrap; }
8
+ }
@@ -0,0 +1,13 @@
1
+ // Steps: sections with `c: steps`; the ordered list (or ### headings) get numbered markers on a rail.
2
+ @include mt-layer(components) {
3
+ .mt-c-steps { counter-reset: mt-step; }
4
+ .mt-c-steps > ol { list-style: none; padding: 0; margin-top: 1.5rem; counter-reset: mt-step; }
5
+ .mt-c-steps > ol > li, .mt-c-steps > h3 { counter-increment: mt-step; position: relative; padding-inline-start: 2.75rem; }
6
+ .mt-c-steps > ol > li { margin: 0; padding-bottom: 1.25rem; }
7
+ .mt-c-steps > ol > li:not(:last-child)::after { content: ""; position: absolute; inset-inline-start: .875rem; top: 2rem; bottom: .25rem; width: 1px; background: mt(border); }
8
+ .mt-c-steps > h3 ~ :not(h3) { padding-inline-start: 2.75rem; }
9
+ .mt-c-steps > ol > li::before, .mt-c-steps > h3::before { content: counter(mt-step); position: absolute; inset-inline-start: 0; top: 0;
10
+ width: 1.75rem; height: 1.75rem; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%;
11
+ background: mt(muted); border: 1px solid mt(border); color: mt(foreground); font-size: .8rem; font-weight: 650; }
12
+ .mt-c-steps > h3 { margin-top: 1.5rem; line-height: 1.75rem; }
13
+ }
@@ -0,0 +1,21 @@
1
+ // The tablist scrolls sideways only: no negative margins or outer focus rings that would overflow it vertically.
2
+ // Tabs (assets/js/modootoday/tabs.js): c: tabs, ### name + code block pairs → WAI-ARIA tabs.
3
+ @include mt-layer(components) {
4
+ [role="tablist"] { display: flex; gap: .25rem; overflow: auto hidden; scrollbar-width: thin; box-shadow: inset 0 -1px mt(border); margin: 1.25rem 0 0; }
5
+ [role="tab"] { font: inherit; font-size: .875rem; line-height: 1.5; font-weight: 500; white-space: nowrap; background: none; color: mt(muted-foreground);
6
+ border: 0; border-bottom: 2px solid transparent; padding: .55rem .85rem; cursor: pointer; transition: color .15s; }
7
+ [role="tab"]:hover { color: mt(foreground); }
8
+ [role="tab"][aria-selected="true"] { color: mt(foreground); border-bottom-color: mt(primary); font-weight: 600; }
9
+ [role="tabpanel"] { margin-top: .75rem; }
10
+ [role="tabpanel"] pre { margin-top: 0; }
11
+ }
12
+ // Before tabs.js runs (scripting on): the first "### name" already draws as a tab row of the same height
13
+ // and only its code block shows, so grouping after load moves nothing. Without JS every method stays visible.
14
+ @media (scripting: enabled) {
15
+ @include mt-layer(components) {
16
+ [data-tabs]:not(:has([role="tablist"])) {
17
+ > h3:has(+ div, + pre) { font-size: .875rem; line-height: 1.5; padding: .55rem .85rem; margin: 1.25rem 0 0; border-bottom: 2px solid mt(primary); }
18
+ > h3 ~ h3:has(+ div, + pre), > h3 ~ h3 + * { display: none; }
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,10 @@
1
+ // Timeline: sections with `c: timeline`; each ### heading is a date/milestone, content follows.
2
+ @include mt-layer(components) {
3
+ .mt-c-timeline { --mt-timeline-line: #{mt(border)}; --mt-timeline-dot: #{mt(primary)}; }
4
+ .mt-c-timeline > h3, .mt-c-timeline > h3 ~ * { position: relative; margin-inline-start: .5rem; padding-inline-start: 1.5rem; border-inline-start: 2px solid var(--mt-timeline-line); }
5
+ .mt-c-timeline > h3 { margin-bottom: 0; padding-top: 1.25rem; margin-top: 0; font-size: .8125rem; font-weight: 650; letter-spacing: .02em; color: mt(muted-foreground); font-family: mt(font-mono); }
6
+ .mt-c-timeline > h2 + h3 { margin-top: 1rem; }
7
+ .mt-c-timeline > h3 ~ * { margin-top: 0; margin-bottom: 0; padding-bottom: .5rem; }
8
+ .mt-c-timeline > h3::before { content: ""; position: absolute; inset-inline-start: -.45rem; top: 1.55rem;
9
+ width: .75rem; height: .75rem; border-radius: 50%; background: var(--mt-timeline-dot); box-shadow: 0 0 0 3px #{mt(background)}; }
10
+ }
@@ -0,0 +1,8 @@
1
+ // Detail page partials (separate bundle). Uses the core tokens (--mt-*) already on the page; emits no tokens.
2
+ @import "../settings";
3
+ @import "../tools/functions";
4
+ @import "../tools/mixins";
5
+ @import "../kit/button";
6
+ @import "page";
7
+ @import "../tools/img-dark";
8
+ @include mt-img-dark(".mt-detail-cover img");
@@ -0,0 +1,25 @@
1
+ // Detail pages: header, facts list, media and one call to action. Print drops the call to action.
2
+ @include mt-layer(components) {
3
+ .mt-detail-head { margin-bottom: 1.5rem; }
4
+ .mt-detail-kicker { margin: 0 0 .5rem; color: mt(muted-foreground); font-size: .875rem; font-weight: 600; letter-spacing: .02em; }
5
+ .mt-detail-head h1 { margin: 0; }
6
+ .mt-detail-lead { margin: .75rem 0 0; font-size: 1.125rem; color: mt(muted-foreground); }
7
+ .mt-detail-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); gap: 1rem 1.5rem; margin: 0 0 2rem;
8
+ padding: 1rem 1.25rem; border: 1px solid mt(border); border-radius: mt(radius); }
9
+ .mt-detail-facts dt { color: mt(muted-foreground); font-size: .8125rem; font-weight: 600; }
10
+ .mt-detail-facts dd { margin: .25rem 0 0; overflow-wrap: anywhere; }
11
+ .mt-detail-tags, .mt-detail-links { display: flex; flex-wrap: wrap; gap: .375rem .75rem; margin: 0; padding: 0; list-style: none; }
12
+ :is(.mt-detail-tags, .mt-detail-links) > li { margin: 0; }
13
+ .mt-detail-tags li { padding: 0 .5rem; border-radius: mt(radius); background: mt(muted); font-size: .8125rem; }
14
+ .mt-detail-cover { margin: 0 0 2rem; }
15
+ .mt-detail-cover img { display: block; inline-size: 100%; block-size: auto; aspect-ratio: 4 / 3; object-fit: cover; border-radius: mt(radius-lg); background: mt(muted); }
16
+ @media (min-width: 48rem) { .mt-detail-cover img { aspect-ratio: 21 / 9; } }
17
+ .mt-detail-media { margin: 0 0 2rem; }
18
+ .mt-detail-media audio { display: block; width: 100%; }
19
+ .mt-detail-media figcaption { margin-top: .5rem; font-size: .875rem; }
20
+ .mt-detail-cta { display: flex; flex-wrap: wrap; align-items: center; gap: .75rem 1rem; margin: 2.5rem 0 0; padding-top: 1.5rem;
21
+ border-top: 1px solid mt(border); }
22
+ @include mt-kit-button(".mt-detail-btn");
23
+ .mt-detail-cta .mt-ics { font-size: .875rem; font-weight: 600; }
24
+ @media print { .mt-detail-cta, .mt-detail-media audio { display: none; } }
25
+ }
@@ -0,0 +1,12 @@
1
+ // CSS-only filter: radio i checked hides items without class mt-f<i>. Browsers without :has() show every item.
2
+ @include mt-layer(components) {
3
+ .mt-dir-filter { border: 0; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; }
4
+ .mt-dir-filter > label { display: inline-flex; align-items: center; min-height: 2.75rem; padding: 0 1rem; border: 1px solid mt(border);
5
+ border-radius: 999px; font-size: .875rem; font-weight: 600; cursor: pointer; user-select: none; }
6
+ .mt-dir-filter > input:checked + label { background: mt(foreground); border-color: mt(foreground); color: mt(background); }
7
+ .mt-dir-filter > input:focus-visible + label { outline: 2px solid mt(ring); outline-offset: 2px; }
8
+ @for $i from 1 through 12 {
9
+ .mt-dir:has(.mt-f-r#{$i}:checked) .mt-dir-item:not(.mt-f#{$i}) { display: none; }
10
+ }
11
+ @media (forced-colors: active) { .mt-dir-filter > input:checked + label { forced-color-adjust: none; background: Highlight; color: HighlightText; } }
12
+ }
@@ -0,0 +1,18 @@
1
+ // Card grid shared by every directory preset.
2
+ @include mt-layer(components) {
3
+ .mt-dir-grid { list-style: none; margin: 1.5rem 0 0; padding: 0; display: grid; gap: 1rem;
4
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 16rem), 1fr)); }
5
+ .mt-dir-item { display: flex; flex-direction: column; gap: .75rem; margin: 0; padding: 1rem; border: 1px solid mt(border);
6
+ border-radius: mt(radius); background: mt(background); position: relative; }
7
+ .mt-dir-item:focus-within { outline: 2px solid mt(ring); outline-offset: 2px; }
8
+ .mt-dir-img { width: 100%; height: auto; aspect-ratio: 16 / 10; object-fit: cover; border-radius: calc(#{mt(radius)} - 2px); background: mt(muted); }
9
+ .mt-dir-title { font-size: 1.05rem; margin: 0; line-height: 1.35; }
10
+ .mt-dir-title > a { color: inherit; text-decoration: none; }
11
+ .mt-dir-title > a::after { content: ""; position: absolute; inset: 0; }
12
+ .mt-dir-title > a:focus-visible { outline: none; }
13
+ .mt-dir-meta { margin: .25rem 0 0; font-size: .875rem; color: mt(muted-foreground); }
14
+ .mt-dir-text { margin: .5rem 0 0; font-size: .9375rem; }
15
+ .mt-dir-tags { display: flex; flex-wrap: wrap; gap: .375rem; margin: .75rem 0 0; }
16
+ .mt-dir-tags > span { font-size: .75rem; padding: .125rem .5rem; border-radius: 999px; background: mt(muted); color: mt(muted-foreground); }
17
+ .mt-ics { position: relative; z-index: 1; display: inline-block; margin-top: .75rem; font-size: .875rem; font-weight: 600; }
18
+ }
@@ -0,0 +1,11 @@
1
+ // Directory engine partials (separate bundle): shells and buttons, card grid, CSS-only filter, presets.
2
+ @import "../settings";
3
+ @import "../tools/functions";
4
+ @import "../tools/mixins";
5
+ @import "../pages/shells";
6
+ @import "../pages/actions";
7
+ @import "grid";
8
+ @import "filter";
9
+ @import "presets";
10
+ @import "../tools/img-dark";
11
+ @include mt-img-dark('.mt-dir img:not([src$=".svg"])', '.mt-dir img[src$=".svg"]');
@@ -0,0 +1,16 @@
1
+ // Preset looks: team avatars, events with a date tile, sponsor and integration logos, jobs as rows.
2
+ @include mt-layer(components) {
3
+ .mt-dir-team .mt-dir-item { align-items: center; text-align: center; }
4
+ .mt-dir-team .mt-dir-img { width: 6rem; height: 6rem; aspect-ratio: 1; border-radius: 50%; }
5
+ .mt-dir-events .mt-dir-item, .mt-dir-jobs .mt-dir-item { flex-direction: row; align-items: flex-start; }
6
+ .mt-dir-jobs .mt-dir-grid, .mt-dir-events .mt-dir-grid { grid-template-columns: 1fr; }
7
+ .mt-dir-events .mt-dir-img { flex: none; width: 7rem; aspect-ratio: 4 / 3; }
8
+ @media (max-width: 30rem) { .mt-dir-events .mt-dir-img { width: 4.5rem; } }
9
+ .mt-date-tile { flex: none; display: flex; flex-direction: column; align-items: center; justify-content: center; width: 4rem; height: 4rem;
10
+ border-radius: mt(radius); background: mt(muted); line-height: 1.1; text-transform: uppercase; font-size: .75rem; }
11
+ .mt-date-tile > b { font-size: 1.5rem; }
12
+ .mt-dir-sponsors .mt-dir-img, .mt-dir-integrations .mt-dir-img { width: auto; max-width: 100%; height: 3rem; aspect-ratio: auto;
13
+ object-fit: contain; background: none; }
14
+ .mt-dir-sponsors .mt-dir-item { align-items: center; text-align: center; }
15
+ @media print { .mt-dir-filter { display: none; } .mt-dir-item { break-inside: avoid; } }
16
+ }
@@ -0,0 +1,7 @@
1
+ // Docs-extra partials (separate bundle: reference, changelog, roadmap, glossary, hub, course, book). Uses the core tokens.
2
+ @import "../settings";
3
+ @import "../tools/functions";
4
+ @import "../tools/mixins";
5
+ @import "page";
6
+ @import "../tools/img-dark";
7
+ @include mt-img-dark(".mt-dx-cover");
@@ -0,0 +1,37 @@
1
+ // Shared header and the lists of each docs-extra layout.
2
+ @include mt-layer(components) {
3
+ .mt-dx-head { margin: 1rem 0 1.5rem; }
4
+ .mt-dx-head h1 { margin: 0; }
5
+ .mt-dx-lead { margin: .5rem 0 0; font-size: 1.125rem; color: mt(muted-foreground); }
6
+ .mt-dx-kicker, .mt-dx-meta, .mt-dx-time, .mt-dx-count { color: mt(muted-foreground); font-size: .875rem; }
7
+ .mt-dx-kicker { margin: 0 0 .25rem; font-weight: 600; }
8
+ .mt-dx-toc ul, .mt-dx-letters ul, .mt-dx-cards, .mt-dx-col ul { margin: 0; padding: 0; list-style: none; }
9
+ .mt-dx-toc ul, .mt-dx-letters ul { display: flex; flex-wrap: wrap; gap: .25rem .75rem; margin-bottom: 1.5rem; }
10
+ .mt-dx-toc li, .mt-dx-letters li { margin: 0; }
11
+ .mt-dx-letters a { display: inline-block; min-width: 2rem; padding: .25rem; text-align: center; }
12
+ .mt-dx-member, .mt-dx-release { margin-top: 2rem; padding-top: 1rem; border-top: 1px solid mt(border); scroll-margin-top: 4rem; }
13
+ .mt-dx-member h2, .mt-dx-release h2 { margin-top: 0; }
14
+ .mt-dx-release time { margin-inline-start: .5rem; font-size: .875rem; font-weight: 400; color: mt(muted-foreground); }
15
+ .mt-dx-cat { font-size: .8125rem; text-transform: uppercase; letter-spacing: .04em; }
16
+ .mt-dx-warn { color: mt(caution); }
17
+ .mt-dx-cols, .mt-dx-cards { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); margin-bottom: 2rem; }
18
+ .mt-dx-col { padding: 1rem; border-radius: mt(radius-lg); background: mt(muted); }
19
+ .mt-dx-col h2 { margin: 0 0 .75rem; font-size: 1rem; }
20
+ .mt-dx-col li, .mt-dx-cards li { margin-top: .5rem; padding: .75rem 1rem; border: 1px solid mt(border); border-radius: mt(radius); background: mt(card); }
21
+ .mt-dx-col h3, .mt-dx-cards h2 { margin: 0; font-size: 1rem; }
22
+ .mt-dx-col p, .mt-dx-cards p { margin: .25rem 0 0; color: mt(muted-foreground); font-size: .9375rem; }
23
+ .mt-dx-cards li { position: relative; margin: 0; }
24
+ .mt-dx-cards li:hover { border-color: mt(primary); }
25
+ .mt-dx-cards a::after { content: ""; position: absolute; inset: 0; }
26
+ .mt-dx-letter { scroll-margin-top: 4rem; }
27
+ .mt-dx-terms dt { margin-top: 1rem; font-weight: 600; scroll-margin-top: 4rem; }
28
+ .mt-dx-terms dd { margin: .25rem 0 0; }
29
+ .mt-dx-syllabus > li { margin-bottom: 1rem; }
30
+ .mt-dx-syllabus h3 { margin: 0 0 .25rem; font-size: 1.0625rem; }
31
+ .mt-dx-book { display: grid; gap: 0 2rem; }
32
+ .mt-dx-cover { border-radius: mt(radius); box-shadow: 0 4px 16px rgba(0, 0, 0, .15); }
33
+ @media (min-width: 40rem) { .mt-dx-book { grid-template-columns: 200px 1fr; } .mt-dx-book > :not(.mt-dx-cover, div:first-of-type) { grid-column: 1 / -1; } }
34
+ .mt-dx-chapters ol { padding-inline-start: 0; list-style: none; }
35
+ .mt-dx-chapters li { padding: .5rem 0; border-bottom: 1px solid mt(border); }
36
+ @media print { .mt-dx-toc, .mt-dx-letters { display: none; } .mt-dx-col, .mt-dx-member, .mt-dx-release { break-inside: avoid; } }
37
+ }
@@ -0,0 +1,6 @@
1
+ // Hero showcase partials (separate bundle). Uses the core tokens (--mt-*) already on the page; emits no tokens.
2
+ @import "../settings";
3
+ @import "../tools/functions";
4
+ @import "../tools/mixins";
5
+ @import "layout";
6
+ @import "scene";
@@ -0,0 +1,28 @@
1
+ @import "../tools/img-dark";
2
+ // Showcase hero layout: copy on the left, scene on the right, one image behind both (dark mode via CSS filter only).
3
+ @include mt-layer(components) {
4
+ :where(:root) { --mt-hero-filter-dark: brightness(.42) saturate(.7) contrast(1.08); }
5
+ .mt-hero:has(> .mt-showcase) {
6
+ display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); column-gap: 1.5rem; align-content: center; clear: both;
7
+ position: relative; isolation: isolate; overflow: clip; border-radius: mt(radius-lg); padding: 3rem clamp(1.25rem, 4vw, 3rem); min-height: 28rem;
8
+ }
9
+ .mt-hero:has(> .mt-showcase) > :not(.mt-showcase) { grid-column: 1; }
10
+ .mt-hero:has(> .mt-showcase) :is(h1, p) { word-break: keep-all; }
11
+ .mt-hero:has(> .mt-showcase) h1 { font-size: unquote("clamp(2rem, 1.4rem + 1.6vw, 2.75rem)"); }
12
+ .mt-hero:has(> .mt-showcase) .mt-actions a { min-height: 44px; }
13
+ .mt-showcase { display: contents; }
14
+ .mt-showcase-bg { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; }
15
+ .mt-showcase-art { grid-column: 2; grid-row: 1 / span 9; align-self: center; position: relative; aspect-ratio: 4 / 3; }
16
+ .mt-hero:has(> .mt-showcase)::before {
17
+ content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none;
18
+ background: linear-gradient(100deg, unquote("color-mix(in srgb, var(--mt-background) 70%, transparent)") 0 35%, transparent 80%);
19
+ }
20
+ .mt-showcase-art svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
21
+ .mt-showcase-still { display: none; }
22
+ @media (prefers-reduced-motion: reduce) { .mt-showcase-motion { display: none; } .mt-showcase-still { display: block; } }
23
+ @media (max-width: 48rem) {
24
+ .mt-hero:has(> .mt-showcase) { grid-template-columns: minmax(0, 1fr); padding: 2rem 1.25rem; min-height: 0; }
25
+ .mt-showcase-art { grid-column: 1; grid-row: auto; width: min(100%, 22rem); justify-self: center; margin-top: 1.5rem; }
26
+ }
27
+ }
28
+ @include mt-img-dark(".mt-showcase-bg", $filter: var(--mt-hero-filter-dark, var(--mt-img-filter-dark)));
@@ -0,0 +1,20 @@
1
+ // Showcase SVG scene colours: every fill and stroke is a --mt-* token, so light and dark follow the theme.
2
+ @include mt-layer(components) {
3
+ .mt-showcase-card { filter: drop-shadow(0 6px 10px rgba(31, 35, 40, .18)); }
4
+ .mt-showcase { --mt-sc-win: var(--mt-foreground); --mt-sc-ink: var(--mt-background); }
5
+ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .mt-showcase { --mt-sc-win: var(--mt-card); --mt-sc-ink: var(--mt-foreground); } }
6
+ :root[data-theme="dark"] .mt-showcase { --mt-sc-win: var(--mt-card); --mt-sc-ink: var(--mt-foreground); }
7
+ .mt-showcase-win { fill: var(--mt-sc-win); stroke: var(--mt-border); }
8
+ .mt-showcase-dot1 { fill: var(--mt-caution); } .mt-showcase-dot2 { fill: var(--mt-warning); } .mt-showcase-dot3 { fill: var(--mt-tip); }
9
+ .mt-showcase-c1 { stroke: var(--mt-code-keyword); } .mt-showcase-c2 { stroke: var(--mt-code-string); }
10
+ .mt-showcase-c3 { stroke: var(--mt-code-function); } .mt-showcase-c4 { stroke: var(--mt-code-comment); }
11
+ .mt-showcase-caret { fill: var(--mt-sc-ink); }
12
+ .mt-showcase-panel { fill: var(--mt-card); stroke: var(--mt-border); }
13
+ .mt-showcase-skel { fill: var(--mt-muted-foreground); opacity: .35; }
14
+ .mt-showcase-s1 { stop-color: var(--mt-primary); } .mt-showcase-s2 { stop-color: var(--mt-brand); stop-opacity: .6; }
15
+ .mt-showcase-trail { fill: none; stroke: var(--mt-brand); stroke-width: 1.5; stroke-dasharray: 4 6; opacity: .5; }
16
+ .mt-showcase-chip { fill: var(--mt-primary); }
17
+ .mt-showcase-chipt { fill: var(--mt-primary-foreground); font: 600 12px mt(font-mono); }
18
+ .mt-showcase-cursor { fill: var(--mt-foreground); stroke: var(--mt-background); stroke-width: 1.2; }
19
+ .mt-showcase-sparks { fill: var(--mt-brand); }
20
+ }
@@ -0,0 +1,8 @@
1
+ // Shared link-button look for the optional layout bundles (same as the core CTA): @include mt-kit-button(".sel").
2
+ @mixin mt-kit-button($sel, $primary: true) {
3
+ #{$sel} { display: inline-flex; align-items: center; gap: .5rem; min-height: 2.75rem; padding: 0 1.25rem; border-radius: mt(radius);
4
+ border: 1px solid mt(border); background: mt(background); color: mt(foreground); font: inherit; font-size: .9375rem;
5
+ font-weight: 600; text-decoration: none; cursor: pointer; }
6
+ @if $primary { #{$sel}:first-child { background: mt(primary); border-color: mt(primary); color: mt(primary-foreground); } }
7
+ #{$sel}:focus-visible { outline: 2px solid mt(ring); outline-offset: 2px; }
8
+ }
@@ -0,0 +1,9 @@
1
+ // Page meta line: last updated date and "Edit this page" link (modootoday/page-meta.html).
2
+ @include mt-layer(layout) {
3
+ .mt-page-meta { display: flex; flex-wrap: wrap; align-items: center; gap: .25rem .5rem; margin: mt(space-section) 0 0; padding-top: 1.25rem;
4
+ border-top: 1px solid mt(border); font-size: .875rem; color: mt(muted-foreground); }
5
+ .mt-page-meta time { font-variant-numeric: tabular-nums; color: mt(foreground); }
6
+ .mt-page-meta a { color: mt(muted-foreground); text-decoration: none; display: inline-flex; align-items: center; gap: .35rem; border-radius: mt(radius); }
7
+ .mt-page-meta a:hover { color: mt(primary); text-decoration: underline; text-underline-offset: .2em; }
8
+ .mt-page-meta + .mt-pagination { margin-top: 1.25rem; padding-top: 0; border-top: 0; }
9
+ }
@@ -0,0 +1,9 @@
1
+ // Safe area (iOS notch, home indicator, rounded corners) with viewport-fit=cover. Insets flow through
2
+ // --mt-safe-* (used by the shell, reset and menus) so sites and tests can override them; --mt-gutter is
3
+ // the page side padding before the inset (1rem below 48rem, in the shell).
4
+ // env() is unquoted for Ruby Sass 3.7 (github-pages).
5
+ @include mt-layer(layout) {
6
+ :root { --mt-gutter: 1.5rem;
7
+ --mt-safe-top: #{unquote("env(safe-area-inset-top)")}; --mt-safe-right: #{unquote("env(safe-area-inset-right)")};
8
+ --mt-safe-bottom: #{unquote("env(safe-area-inset-bottom)")}; --mt-safe-left: #{unquote("env(safe-area-inset-left)")}; }
9
+ }