jekyll-theme-modootoday 1.1.1 → 1.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -1
- data/README.ko.md +3 -3
- data/README.md +3 -3
- data/RULES.md +3 -0
- data/_includes/modootoday/config.html +2 -2
- data/_includes/modootoday/markdown/sections.html +7 -4
- data/_includes/modootoday/markdown/split.html +19 -0
- data/_includes/modootoday/stylesheets.html +3 -1
- data/_sass/modootoday/components/bleed/_bleed.scss +19 -0
- data/_sass/modootoday/components/lists/_lists.scss +3 -3
- data/_sass/modootoday/components/section/structure/_split.scss +3 -1
- data/_sass/modootoday/components/terminal/_terminal.scss +9 -0
- data/assets/css/modootoday/bleed.scss +8 -0
- data/assets/css/modootoday/terminal.scss +8 -0
- data/lib/modootoday/check/page_sections.rb +26 -7
- data/lib/modootoday/check/site_config.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '09f05d5325d994791567a94eafd99eac00aa56e8eb114d931f8cd621fabed7fb'
|
|
4
|
+
data.tar.gz: c155b58111fa8bd0028a1293fd1600642283c34ac41315e19334fc223f4bf5b1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 84cae773eae8a56dbf7059a82a0b28c12cd3fcd927adbf9fc724130ce295e1d1c064b3de7725d85a1ce69f6da2f76e3205c7e07ff6b4c7ff59a8b262d205f873
|
|
7
|
+
data.tar.gz: 1fc8d20f8e70289b9c551e838107e94e34863adeaeec9a2bb88d0db336b142844818960228c66422a84b424c1b20bb4dc9bca05226b4f54140f23dfb4a15604d
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,14 @@ The content rules have their own version header (`md-components v1`) in [RULES.m
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.2.0] - 2026-10-31
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `bleed: true` / `bleed: wide` on `hero:` or a section item (`.mt-bleed`, `.mt-bleed-wide`): a full-width background band in `--mt-bleed-bg` with the content kept in its column (`wide` widens it up to the container); no wrapper, so existing markup and selectors are unchanged and the default is as before; its own optional `bleed` sheet. `modootoday-check` accepts only true, false or wide.
|
|
14
|
+
- `hero: {c: split, visual: <name>, side: start|end, ratio: "1:1"|"5:7"}`: the hero in the split wrappers (`.mt-c-split`, `.mt-section-in`, `.mt-section-body`, `.mt-section-visual`), with the title, lead (`.mt-hero-lead`), check row and actions in the text column; heroes without `c:` render as before. Split sheet only; `modootoday-check` checks `c`, `visual:`, `side` and `ratio` on `hero:`.
|
|
15
|
+
- `visual: code` on a `c: split` section or a split hero: the first fenced block (with its `file:` title) moves into `.mt-section-visual.mt-split-code`, keeping the code styles, copy button and focusable `pre`; optional `chrome: terminal` adds a border and a decorative `aria-hidden` bar from a terminal sheet linked only by pages that use it. No include needed; elsewhere `visual: code` still names `_includes/sections/code.html`. `modootoday-check` requires a fence and checks `chrome`.
|
|
16
|
+
|
|
9
17
|
## [1.1.1] - 2026-10-31
|
|
10
18
|
|
|
11
19
|
### Added
|
|
@@ -227,7 +235,8 @@ Internal development milestones, never released. They are all part of 1.0.0.
|
|
|
227
235
|
- Example: `sass.silence_deprecations: [import]` for Dart Sass; `llms.txt` per language generated instead of hand-written.
|
|
228
236
|
- Raw `<name>.md` copies in `_site` on GitHub Pages: caused by content files without front matter (rendered by `jekyll-optional-front-matter` and also copied). Front matter is now required and checked.
|
|
229
237
|
|
|
230
|
-
[Unreleased]: https://github.com/modootoday/jekyll-theme-modootoday/compare/v1.
|
|
238
|
+
[Unreleased]: https://github.com/modootoday/jekyll-theme-modootoday/compare/v1.2.0...HEAD
|
|
239
|
+
[1.2.0]: https://github.com/modootoday/jekyll-theme-modootoday/releases/tag/v1.2.0
|
|
231
240
|
[1.1.1]: https://github.com/modootoday/jekyll-theme-modootoday/releases/tag/v1.1.1
|
|
232
241
|
[1.1.0]: https://github.com/modootoday/jekyll-theme-modootoday/releases/tag/v1.1.0
|
|
233
242
|
[1.0.0]: https://github.com/modootoday/jekyll-theme-modootoday/releases/tag/v1.0.0
|
data/README.ko.md
CHANGED
|
@@ -26,7 +26,7 @@ gem 방식(`theme:`):
|
|
|
26
26
|
|
|
27
27
|
```ruby
|
|
28
28
|
# Gemfile
|
|
29
|
-
gem "jekyll-theme-modootoday", "~> 1.
|
|
29
|
+
gem "jekyll-theme-modootoday", "~> 1.2"
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
```yaml
|
|
@@ -38,7 +38,7 @@ Gemfile 없이 GitHub Pages에서(`remote_theme:`):
|
|
|
38
38
|
|
|
39
39
|
```yaml
|
|
40
40
|
# _config.yml
|
|
41
|
-
remote_theme: modootoday/jekyll-theme-modootoday@v1.
|
|
41
|
+
remote_theme: modootoday/jekyll-theme-modootoday@v1.2.0
|
|
42
42
|
plugins:
|
|
43
43
|
- jekyll-remote-theme
|
|
44
44
|
```
|
|
@@ -49,7 +49,7 @@ plugins:
|
|
|
49
49
|
|
|
50
50
|
```sh
|
|
51
51
|
mkdir my-docs && cd my-docs
|
|
52
|
-
printf 'source "https://rubygems.org"\ngem "jekyll", "~> 4.4"\ngem "jekyll-theme-modootoday", "~> 1.
|
|
52
|
+
printf 'source "https://rubygems.org"\ngem "jekyll", "~> 4.4"\ngem "jekyll-theme-modootoday", "~> 1.2"\n' > Gemfile
|
|
53
53
|
printf 'theme: jekyll-theme-modootoday\nmarkdown: kramdown\nkramdown: {input: GFM}\nsass: {style: compressed, silence_deprecations: [import, global-builtin]}\n' > _config.yml
|
|
54
54
|
printf -- '---\nlayout: doc\ntitle: Home\n---\n# Hello\n\n> [!TIP]\n> Plain Markdown, styled.\n' > index.md
|
|
55
55
|
bundle install && bundle exec jekyll build
|
data/README.md
CHANGED
|
@@ -23,7 +23,7 @@ As a gem (`theme:`):
|
|
|
23
23
|
|
|
24
24
|
```ruby
|
|
25
25
|
# Gemfile
|
|
26
|
-
gem "jekyll-theme-modootoday", "~> 1.
|
|
26
|
+
gem "jekyll-theme-modootoday", "~> 1.2"
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
```yaml
|
|
@@ -35,7 +35,7 @@ On GitHub Pages without a Gemfile (`remote_theme:`):
|
|
|
35
35
|
|
|
36
36
|
```yaml
|
|
37
37
|
# _config.yml
|
|
38
|
-
remote_theme: modootoday/jekyll-theme-modootoday@v1.
|
|
38
|
+
remote_theme: modootoday/jekyll-theme-modootoday@v1.2.0
|
|
39
39
|
plugins:
|
|
40
40
|
- jekyll-remote-theme
|
|
41
41
|
```
|
|
@@ -46,7 +46,7 @@ Pin a tag or a commit. More options: [Install guide](https://modootoday.github.i
|
|
|
46
46
|
|
|
47
47
|
```sh
|
|
48
48
|
mkdir my-docs && cd my-docs
|
|
49
|
-
printf 'source "https://rubygems.org"\ngem "jekyll", "~> 4.4"\ngem "jekyll-theme-modootoday", "~> 1.
|
|
49
|
+
printf 'source "https://rubygems.org"\ngem "jekyll", "~> 4.4"\ngem "jekyll-theme-modootoday", "~> 1.2"\n' > Gemfile
|
|
50
50
|
printf 'theme: jekyll-theme-modootoday\nmarkdown: kramdown\nkramdown: {input: GFM}\nsass: {style: compressed, silence_deprecations: [import, global-builtin]}\n' > _config.yml
|
|
51
51
|
printf -- '---\nlayout: doc\ntitle: Home\n---\n# Hello\n\n> [!TIP]\n> Plain Markdown, styled.\n' > index.md
|
|
52
52
|
bundle install && bundle exec jekyll build
|
data/RULES.md
CHANGED
|
@@ -16,7 +16,10 @@ Every content page starts with front matter; an empty block (`---` then `---`) i
|
|
|
16
16
|
| Sections | `# Title`, lead paragraph, link-only paragraph (CTA), then `## Section`; front matter `sections:` | `doc` layout → `_includes/modootoday/markdown/sections.html`: with `sections:` the part before the first `##` is `section.mt-hero` and item *i* wraps the *i*-th **top-level** `##` in `section.mt-section` (an `h2` nested in a quote, list or alert never splits); without it, one `div.mt-prose` | plain document |
|
|
17
17
|
| Section decor | front matter `decor: <include>` on `hero:` or a section item | the include inside `div.mt-section-decor[aria-hidden=true]` at the end of the section, which gets `.mt-has-decor` | not shown |
|
|
18
18
|
| List styles (optional) | `modootoday.lists: {link_chips, titled_items}`; `hero: {checks: true}` | plain sections and pages: link-only list → `ul.mt-chips`, `- **Title**: text` → `strong.mt-item-title` + `span.mt-item-sep`; hero: `.mt-hero-checks`; first `p` after the `h1` → `p.mt-hero-lead` | plain lists |
|
|
19
|
+
| Split hero | front matter `hero: {c: split, visual: <name>, side: start\|end, ratio: "1:1"\|"5:7"}` | `section.mt-hero.mt-c-split` > `.mt-section-in` > `.mt-section-body` (h1, lead, checks, actions) + `.mt-section-visual`; split sheet | other `c`, a missing `visual:`, other side/ratio values are checker errors |
|
|
20
|
+
| Split code | `visual: code` on `c: split` or a split hero (optional `chrome: terminal`) | the first code block moves into `div.mt-section-visual.mt-split-code` (`.mt-split-terminal` + `div.mt-split-bar[aria-hidden]`); split sheet, plus the terminal sheet only with `chrome: terminal` | no fence in that item, or `chrome:` without split + `visual: code`, are checker errors |
|
|
19
21
|
| Scroll reveal | front matter `reveal: true` on `hero:` or a section item | `.mt-reveal` on the section; CSS-only fade-in on scroll inside `@supports (animation-timeline: view())` and `prefers-reduced-motion: no-preference` | shown as is |
|
|
22
|
+
| Full-width band | front matter `bleed: true` or `bleed: wide` on `hero:` or a section item | `.mt-bleed` (plus `.mt-bleed-wide`) on the section, no wrapper; the optional `bleed` sheet paints `--mt-bleed-bg` to the viewport edges, `wide` widens the content up to the container | other values are checker errors |
|
|
20
23
|
| Card badge at the bottom | `badge: bottom` on a `c: features` item | `.mt-badge-bottom` on the section; a `.mt-badge` that is a direct child of a card sits at its bottom edge | badge after the text |
|
|
21
24
|
| Section mapping | each `sections:` item is a string `name` or `{c: component, name: key, ...params}`. No implicit mapping. Item count ≠ top-level `## ` count is a checker error; setext `---` headings, `##` in quotes/alerts/list items, `##` indented 1–3 spaces and `##` inside HTML comments are checker errors | `data-section`=name, `data-c`=c, class `mt-c-<c>` | none |
|
|
22
25
|
| Card grid | under `##`, list items `- **Title** — text` or `- **Title**: text` | CSS only | list |
|
|
@@ -13,13 +13,13 @@ Jekyll 3.10 / GitHub Pages, so every default lives here (Liquid). Sets mt_* vari
|
|
|
13
13
|
site.modootoday.lists {link_chips: true, titled_items: true}: optional list markup (markdown/lists.html, lists sheet)
|
|
14
14
|
{%- endcomment -%}
|
|
15
15
|
{%- assign mt = site.modootoday -%}
|
|
16
|
-
{%- assign mt_all_components = "callout,badge,hero,cta,card,tabs,code-copy,nav,sidebar,page-actions,pagination,theme-toggle,breadcrumb,toc,accordion,steps,figure,timeline,kbd,search,code,footnotes,progress,embed,banner,filetree,details,faq,params,linkcards,quote,gallery,pricing,subscribe,split,loading,figure-svg,lists,reveal" | split: "," -%}
|
|
16
|
+
{%- assign mt_all_components = "callout,badge,hero,cta,card,tabs,code-copy,nav,sidebar,page-actions,pagination,theme-toggle,breadcrumb,toc,accordion,steps,figure,timeline,kbd,search,code,footnotes,progress,embed,banner,filetree,details,faq,params,linkcards,quote,gallery,pricing,subscribe,split,loading,figure-svg,lists,reveal,bleed,terminal" | split: "," -%}
|
|
17
17
|
{%- comment -%}Sass partials by context (components/<group>/_<name>.scss). Core: always in assets/css/modootoday.css.
|
|
18
18
|
Section sheets: assets/css/modootoday/<group>/<name>.css, linked when a page's sections: use c (c:sheet).
|
|
19
19
|
Context sheets: assets/css/modootoday/<name>.css, linked by layout front matter mt_sheets (doc; blog layouts also get assets/css/modootoday-blog.css).{%- endcomment -%}
|
|
20
20
|
{%- assign mt_core_partials = "core/inline/callout,core/inline/badge,core/inline/kbd,core/inline/figure,core/inline/code-copy,core/inline/hero,core/inline/reveal,core/inline/cta,core/inline/code,core/inline/footnotes,core/inline/progress,core/inline/embed,core/chrome/nav,core/chrome/theme-toggle,core/chrome/breadcrumb,core/chrome/pagination,core/chrome/banner" | split: "," -%}
|
|
21
21
|
{%- assign mt_section_sheets = "cta:showcase/cta,features:showcase/card,linkcards:showcase/linkcards,quote:showcase/quote,gallery:showcase/gallery,pricing:showcase/pricing,subscribe:showcase/subscribe,tabs:structure/tabs,accordion:structure/accordion,steps:structure/steps,timeline:structure/timeline,filetree:structure/filetree,details:structure/details,faq:structure/faq,params:structure/params,split:structure/split" | split: "," -%}
|
|
22
|
-
{%- assign mt_context_sheets = "doc:sidebar|toc|page-actions,search:search,loading:loading,figure:figure-svg,lists:lists" | split: "," -%}
|
|
22
|
+
{%- assign mt_context_sheets = "doc:sidebar|toc|page-actions,search:search,loading:loading,figure:figure-svg,lists:lists,bleed:bleed,terminal:terminal" | split: "," -%}
|
|
23
23
|
{%- assign mt_components = mt_all_components -%}
|
|
24
24
|
{%- if mt.components -%}{%- assign mt_components = mt.components -%}{%- endif -%}
|
|
25
25
|
{%- assign mt_color_scheme = "auto" -%}
|
|
@@ -11,9 +11,12 @@ _includes/sections/<name>.html at the end of that section, called with section=<
|
|
|
11
11
|
on the item (e.g. scene: 2) reaches the include as include.section.<key>.
|
|
12
12
|
c: split wraps the section in div.mt-section-in > div.mt-section-body (h2 and text) + div.mt-section-visual (the visual
|
|
13
13
|
include): two columns from 48rem (side: start|end puts the visual first or last, ratio: "1:1"|"5:7" text:visual), one below.
|
|
14
|
-
Only split gets the wrappers, so child selectors of the other components keep working.
|
|
14
|
+
Only split gets the wrappers, so child selectors of the other components keep working (markdown/split.html).
|
|
15
|
+
hero: {c: split, visual: <name>, side, ratio} wraps the hero the same way: h1, lead, checks and actions stay in the text column.
|
|
15
16
|
decor: <name> (item or hero) adds _includes/sections/<name>.html in div.mt-section-decor[aria-hidden=true], placed in
|
|
16
17
|
the section's top end corner (section gets .mt-has-decor); for ornaments only, never content.
|
|
18
|
+
bleed: true (item or hero) adds .mt-bleed: a full-width background band (--mt-bleed-bg) while the content keeps its column;
|
|
19
|
+
bleed: wide also adds .mt-bleed-wide, which widens the content box up to the container. No wrappers; bleed sheet.
|
|
17
20
|
The hero's first p after the h1 gets .mt-hero-lead; hero checks: true adds .mt-hero-checks (its first ul is a ✓ row, lists sheet).
|
|
18
21
|
site.modootoday.lists (link_chips, titled_items) runs markdown/lists.html on the hero, plain sections and section-less pages.
|
|
19
22
|
modootoday-check fails when the item count differs from the h2 count.
|
|
@@ -33,7 +36,7 @@ modootoday-check fails when the item count differs from the h2 count.
|
|
|
33
36
|
{%- assign mt_c_transforms = "|filetree|linkcards|details|faq|params|quote|gallery|pricing|subscribe|" -%}
|
|
34
37
|
{%- assign _p0 = _parts[0] -%}{%- if site.modootoday.lists -%}{%- capture _p0 %}{% include modootoday/markdown/lists.html html=_p0 %}{% endcapture -%}{%- endif -%}
|
|
35
38
|
{%- capture _hero %}{% include modootoday/actions.html html=_p0 %}{% endcapture -%}{%- assign _hl = "</h1>" | append: _nl | append: _nl -%}{%- assign _hlp = _hl | append: "<p>" -%}{%- assign _hlc = _hl | append: '<p class="mt-hero-lead">' -%}{%- assign _hero = _hero | replace_first: _hlp, _hlc -%}
|
|
36
|
-
<section class="mt-hero{% if include.hero.checks == true %} mt-hero-checks{% endif %}{% if include.hero.decor %} mt-has-decor{% endif %}{% if include.hero.reveal == true %} mt-reveal{% endif %}">{{ _hero }}{% if include.hero.visual %}{% include sections/{{ include.hero.visual }}.html section=include.hero %}{% endif %}{% if include.hero.decor %}<div class="mt-section-decor" aria-hidden="true">{% include sections/{{ include.hero.decor }}.html section=include.hero %}</div>{% endif %}</section>
|
|
39
|
+
<section class="mt-hero{% if include.hero.checks == true %} mt-hero-checks{% endif %}{% if include.hero.decor %} mt-has-decor{% endif %}{% if include.hero.reveal == true %} mt-reveal{% endif %}{% if include.hero.c == 'split' %} mt-c-split{% if include.hero.side == 'start' %} mt-split-start{% endif %}{% if include.hero.ratio == '5:7' %} mt-split-5-7{% endif %}{% endif %}{% if include.hero.bleed %} mt-bleed{% if include.hero.bleed == 'wide' %} mt-bleed-wide{% endif %}{% endif %}">{% if include.hero.c == 'split' %}{% include modootoday/markdown/split.html body=_hero s=include.hero %}{% else %}{{ _hero }}{% if include.hero.visual %}{% include sections/{{ include.hero.visual }}.html section=include.hero %}{% endif %}{% endif %}{% if include.hero.decor %}<div class="mt-section-decor" aria-hidden="true">{% include sections/{{ include.hero.decor }}.html section=include.hero %}</div>{% endif %}</section>
|
|
37
40
|
{%- for _p in _parts offset:1 -%}
|
|
38
41
|
{%- assign _s = include.sections[forloop.index0] -%}
|
|
39
42
|
{%- if _s.name or _s.c -%}{%- assign _n = _s.name -%}{%- assign _cc = _s.c -%}{%- else -%}{%- assign _n = _s -%}{%- assign _cc = nil -%}{%- endif -%}
|
|
@@ -42,9 +45,9 @@ modootoday-check fails when the item count differs from the h2 count.
|
|
|
42
45
|
{%- if _cc == 'cta' -%}{%- capture _body %}{% include modootoday/actions.html html=_p %}{% endcapture -%}{%- endif -%}
|
|
43
46
|
{%- if _cc == 'features' -%}{%- assign _body = _body | replace: "</strong> — ", "</strong> " | replace: "</strong> – ", "</strong> " | replace: "</strong> - ", "</strong> " -%}{%- endif -%}
|
|
44
47
|
{%- 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 -%}
|
|
45
|
-
<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 %}{% if _s.decor %} mt-has-decor{% endif %}{% if _s.reveal == true %} mt-reveal{% endif %}{% if _cc == 'features' and _s.badge == 'bottom' %} mt-badge-bottom{% endif %}{% if _cc == 'split' %}{% if _s.side == 'start' %} mt-split-start{% endif %}{% if _s.ratio == '5:7' %} mt-split-5-7{% endif %}{% endif %}" data-section="{{ _n | default: forloop.index0 }}"{% if _cc %} data-c="{{ _cc }}"{% endif %}{% if _cc == 'tabs' %} data-tabs data-tabs-label="{{ _tl }}"{% endif %}>
|
|
48
|
+
<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 %}{% if _s.decor %} mt-has-decor{% endif %}{% if _s.reveal == true %} mt-reveal{% endif %}{% if _s.bleed %} mt-bleed{% if _s.bleed == 'wide' %} mt-bleed-wide{% endif %}{% endif %}{% if _cc == 'features' and _s.badge == 'bottom' %} mt-badge-bottom{% endif %}{% if _cc == 'split' %}{% if _s.side == 'start' %} mt-split-start{% endif %}{% if _s.ratio == '5:7' %} mt-split-5-7{% endif %}{% endif %}" data-section="{{ _n | default: forloop.index0 }}"{% if _cc %} data-c="{{ _cc }}"{% endif %}{% if _cc == 'tabs' %} data-tabs data-tabs-label="{{ _tl }}"{% endif %}>
|
|
46
49
|
{%- if _cc == 'split' %}
|
|
47
|
-
|
|
50
|
+
{%- assign _sb = "<h2 " | append: _body -%}{% include modootoday/markdown/split.html body=_sb s=_s %}{% if _s.decor %}<div class="mt-section-decor" aria-hidden="true">{% include sections/{{ _s.decor }}.html section=_s %}</div>{% endif %}</section>
|
|
48
51
|
{%- else %}
|
|
49
52
|
<h2 {{ _body }}{% if _s.visual %}{% include sections/{{ _s.visual }}.html section=_s %}{% endif %}{% if _s.decor %}<div class="mt-section-decor" aria-hidden="true">{% include sections/{{ _s.decor }}.html section=_s %}</div>{% endif %}</section>
|
|
50
53
|
{%- endif -%}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{%- comment -%}md-components v1 — split inner wrappers (called by sections.html for c: split on a section item or on hero:).
|
|
2
|
+
body = the section's HTML (h2 or h1, text, actions), s = the item. Prints div.mt-section-in > div.mt-section-body (body)
|
|
3
|
+
+ div.mt-section-visual (the visual: include, called with section=s).
|
|
4
|
+
visual: code is built in: the body's first code block (with its file: title, if any) moves into div.mt-section-visual.mt-split-code,
|
|
5
|
+
keeping the code styles and the copy button; chrome: terminal adds .mt-split-terminal and a decorative bar (aria-hidden).{%- endcomment -%}
|
|
6
|
+
{%- assign _b = include.body -%}{%- assign _code = nil -%}
|
|
7
|
+
{%- if include.s.visual == "code" -%}
|
|
8
|
+
{%- assign _pt = _b | split: '<div class="mt-code">' | first | default: "" -%}
|
|
9
|
+
{%- assign _pl = _b | split: '<div class="language-' | first | default: "" -%}
|
|
10
|
+
{%- if _pt.size < _pl.size -%}{%- assign _pre = _pt -%}{%- assign _end = '</code></pre></div></div></div>' -%}
|
|
11
|
+
{%- else -%}{%- assign _pre = _pl -%}{%- assign _end = '</code></pre></div></div>' -%}{%- endif -%}
|
|
12
|
+
{%- if _pre.size < _b.size -%}
|
|
13
|
+
{%- assign _rest = _b | slice: _pre.size, _b.size -%}
|
|
14
|
+
{%- assign _code = _rest | split: _end | first | append: _end -%}
|
|
15
|
+
{%- assign _after = _rest | slice: _code.size, _rest.size -%}
|
|
16
|
+
{%- assign _b = _pre | append: _after -%}
|
|
17
|
+
{%- endif -%}
|
|
18
|
+
{%- endif -%}
|
|
19
|
+
<div class="mt-section-in"><div class="mt-section-body">{{ _b }}</div>{% if _code %}<div class="mt-section-visual mt-split-code{% if include.s.chrome == 'terminal' %} mt-split-terminal{% endif %}">{% if include.s.chrome == 'terminal' %}<div class="mt-split-bar" aria-hidden="true"><span></span><span></span><span></span></div>{% endif %}{{ _code }}</div>{% elsif include.s.visual and include.s.visual != "code" %}<div class="mt-section-visual">{% include sections/{{ include.s.visual }}.html section=include.s %}</div>{% endif %}</div>
|
|
@@ -5,7 +5,9 @@ Stylesheet links (needs modootoday/config.html first). Sets mt_page_c ("|tabs|fa
|
|
|
5
5
|
modootoday.css: bundle — only the core sheet, which then holds everything.
|
|
6
6
|
{%- endcomment -%}
|
|
7
7
|
{%- assign mt_page_c = "|" -%}
|
|
8
|
-
{%- for _s in page.sections -%}{%- if _s.c -%}{%- assign mt_page_c = mt_page_c | append: _s.c | append: "|" -%}{%- endif -%}{%- endfor -%}
|
|
8
|
+
{%- for _s in page.sections -%}{%- if _s.c -%}{%- assign mt_page_c = mt_page_c | append: _s.c | append: "|" -%}{%- endif -%}{%- if _s.bleed -%}{%- assign mt_page_c = mt_page_c | append: "bleed|" -%}{%- endif -%}{%- if _s.chrome == "terminal" -%}{%- assign mt_page_c = mt_page_c | append: "terminal|" -%}{%- endif -%}{%- endfor -%}
|
|
9
|
+
{%- if page.hero.c -%}{%- assign mt_page_c = mt_page_c | append: page.hero.c | append: "|" -%}{%- endif -%}
|
|
10
|
+
{%- if page.hero.bleed -%}{%- assign mt_page_c = mt_page_c | append: "bleed|" -%}{%- endif -%}{%- if page.hero.chrome == "terminal" -%}{%- assign mt_page_c = mt_page_c | append: "terminal|" -%}{%- endif -%}
|
|
9
11
|
{%- assign mt_search_index = site.pages | where: "url", "/search.json" | first -%}
|
|
10
12
|
{%- if mt_components contains "search" and mt_search_index -%}{%- assign mt_page_c = mt_page_c | append: "search|" -%}{%- endif -%}
|
|
11
13
|
{%- if site.modootoday.loading or content contains 'class="mt-spinner' or content contains 'class="mt-skeleton' or content contains 'class="mt-topbar' -%}{%- assign mt_page_c = mt_page_c | append: "loading|" -%}{%- endif -%}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Full-width sections (bleed sheet): bleed: true on a section item or hero: adds .mt-bleed, a background band
|
|
2
|
+
// (--mt-bleed-bg, default the muted surface) painted out to the viewport edges with border-image, which does not
|
|
3
|
+
// add scrollable overflow; the content keeps its column and no wrapper is added. bleed: wide (.mt-bleed-wide) also
|
|
4
|
+
// widens the content box symmetrically up to the container width, minus the safe areas. Logical properties, so RTL
|
|
5
|
+
// needs nothing. With a sidebar or table of contents the band stays inside the main column.
|
|
6
|
+
@include mt-layer(components) {
|
|
7
|
+
:where(:root) { --mt-bleed-bg: #{mt(muted)}; }
|
|
8
|
+
.mt-bleed {
|
|
9
|
+
--mt-bleed-pad: 3rem;
|
|
10
|
+
padding-block: var(--mt-bleed-pad);
|
|
11
|
+
border-image: conic-gradient(var(--mt-bleed-bg) 0 0) fill 0 / / 0 100vw;
|
|
12
|
+
}
|
|
13
|
+
.mt-section.mt-bleed { margin-block-start: mt(space-section); }
|
|
14
|
+
.mt-bleed + .mt-section.mt-bleed { margin-block-start: 0; }
|
|
15
|
+
.mt-bleed-wide { margin-inline: unquote("min(0px, calc((100% - min(100vw - 2rem - var(--mt-safe-left, 0px) - var(--mt-safe-right, 0px), #{mt(container)})) / 2))"); }
|
|
16
|
+
:is(.mt-has-sidebar, .mt-has-toc) .mt-bleed { border-image-outset: 0; padding-inline: 1.25rem; }
|
|
17
|
+
:is(.mt-has-sidebar, .mt-has-toc) .mt-bleed-wide { margin-inline: 0; }
|
|
18
|
+
@media (forced-colors: active) { .mt-bleed { border-image: none; border-block: 1px solid CanvasText; } }
|
|
19
|
+
}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
// .mt-item-title: **Title**: items get a bold title and a muted separator.
|
|
4
4
|
@include mt-layer(components) {
|
|
5
5
|
:where(:root) { --mt-ok: #{mt(status-available)}; }
|
|
6
|
-
.mt-hero-checks > ul:first-of-type, ul.mt-chips { display: flex; flex-wrap: wrap; gap: .5rem; padding: 0; list-style: none; }
|
|
7
|
-
.mt-hero-checks > ul:first-of-type > li { display: inline-flex; align-items: center; gap: .375rem; margin: 0; padding: .25rem .75rem; border: 1px solid mt(border); border-radius: 999px; }
|
|
8
|
-
.mt-hero-checks > ul:first-of-type > li::before { content: "✓" / ""; color: var(--mt-ok); font-weight: 700; }
|
|
6
|
+
.mt-hero-checks > ul:first-of-type, .mt-hero-checks .mt-section-body > ul:first-of-type, ul.mt-chips { display: flex; flex-wrap: wrap; gap: .5rem; padding: 0; list-style: none; }
|
|
7
|
+
:is(.mt-hero-checks, .mt-hero-checks .mt-section-body) > ul:first-of-type > li { display: inline-flex; align-items: center; gap: .375rem; margin: 0; padding: .25rem .75rem; border: 1px solid mt(border); border-radius: 999px; }
|
|
8
|
+
:is(.mt-hero-checks, .mt-hero-checks .mt-section-body) > ul:first-of-type > li::before { content: "✓" / ""; color: var(--mt-ok); font-weight: 700; }
|
|
9
9
|
ul.mt-chips > li { margin: 0; }
|
|
10
10
|
ul.mt-chips a { display: inline-flex; align-items: center; gap: .375rem; min-height: 44px; padding: 0 1rem; border: 1px solid mt(border); border-radius: 999px; color: mt(foreground); text-decoration: none; }
|
|
11
11
|
ul.mt-chips a::after { content: "→" / ""; color: mt(muted-foreground); }
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
// Split: c: split; text (.mt-section-body) and the visual: include (.mt-section-visual) side by side from 48rem,
|
|
2
|
-
// stacked below. Grid columns follow the writing direction, so start/end flip in RTL. DOM order stays text first.
|
|
2
|
+
// stacked below. hero: {c: split} uses the same wrappers; its lead keeps the core hero lead style. Grid columns follow the writing direction, so start/end flip in RTL. DOM order stays text first.
|
|
3
3
|
@include mt-layer(components) {
|
|
4
4
|
.mt-section-in { display: grid; gap: 2rem; }
|
|
5
5
|
.mt-section-in > * { min-width: 0; }
|
|
6
6
|
.mt-section-body > :last-child, .mt-section-visual > :last-child { margin-bottom: 0; }
|
|
7
|
+
.mt-hero .mt-section-body > .mt-hero-lead { font-size: 1.2rem; line-height: 1.6; color: mt(muted-foreground); max-width: 40rem; }
|
|
7
8
|
.mt-section-visual img, .mt-section-visual svg { display: block; max-width: 100%; height: auto; }
|
|
9
|
+
.mt-split-code > * { margin: 0; }
|
|
8
10
|
@media (min-width: 48rem) {
|
|
9
11
|
.mt-c-split > .mt-section-in { grid-template-columns: var(--mt-split-body, 1fr) var(--mt-split-visual, 1fr); align-items: center; }
|
|
10
12
|
.mt-split-5-7 { --mt-split-body: 5fr; --mt-split-visual: 7fr; }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Terminal chrome: chrome: terminal on a split visual: code item. A bordered box with a decorative bar (aria-hidden,
|
|
2
|
+
// dots in currentColor at reduced opacity); the code block inside drops its own margin, border and radius.
|
|
3
|
+
@include mt-layer(components) {
|
|
4
|
+
.mt-split-terminal { border: 1px solid mt(border); border-radius: mt(radius-lg); overflow: hidden; }
|
|
5
|
+
.mt-split-terminal :is(pre, .mt-code, .mt-code-title) { margin: 0; border: 0; border-radius: 0; }
|
|
6
|
+
.mt-split-bar { display: flex; gap: .375rem; padding: .5rem .75rem; background: mt(muted); color: mt(muted-foreground); }
|
|
7
|
+
.mt-split-bar span { width: .625rem; height: .625rem; border-radius: 50%; background: currentColor; opacity: .5; }
|
|
8
|
+
@media (forced-colors: active) { .mt-split-bar span { background: CanvasText; } }
|
|
9
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
# md-components v1 — jekyll-theme-modootoday optional sheet (bleed: full-width section bands). Linked only by pages that use it.
|
|
3
|
+
---
|
|
4
|
+
{%- include modootoday/config.html -%}
|
|
5
|
+
$mt-css-layers: {{ mt_css_layers }};
|
|
6
|
+
@import "modootoday/sheet";
|
|
7
|
+
{% if mt_components contains "bleed" %}@import "modootoday/components/bleed/bleed";
|
|
8
|
+
{% endif %}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
# md-components v1 — jekyll-theme-modootoday optional sheet (terminal: chrome: terminal on split code). Linked only by pages that use it.
|
|
3
|
+
---
|
|
4
|
+
{%- include modootoday/config.html -%}
|
|
5
|
+
$mt-css-layers: {{ mt_css_layers }};
|
|
6
|
+
@import "modootoday/sheet";
|
|
7
|
+
{% if mt_components contains "terminal" %}@import "modootoday/components/terminal/terminal";
|
|
8
|
+
{% endif %}
|
|
@@ -23,19 +23,38 @@ module Modootoday
|
|
|
23
23
|
hero = meta["hero"]
|
|
24
24
|
errs << "#{r}: hero: must be a map such as {visual: name}" if hero && !hero.is_a?(Hash)
|
|
25
25
|
errs << "#{r}: hero.checks must be true or false" if hero.is_a?(Hash) && hero.key?("checks") && ![true, false].include?(hero["checks"])
|
|
26
|
-
|
|
26
|
+
split_hero(errs, r, hero) if hero.is_a?(Hash) && hero.key?("c")
|
|
27
|
+
cl = code.lines
|
|
28
|
+
hero_md = b.lines[0...(cl.index { |l| l =~ /^##(?: |$)/ } || cl.size)].to_a.join
|
|
29
|
+
visuals(ctx, r, secs, hero.is_a?(Hash) ? hero : nil, sec_md.map { |m| m && m[1] }, hero_md)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# hero: {c: split, visual: <name>, side: start|end, ratio: "1:1"|"5:7"}: split is the only hero component.
|
|
33
|
+
def split_hero(errs, r, hero)
|
|
34
|
+
return errs << "#{r}: hero.c must be split (got #{hero['c'].inspect})" unless hero["c"] == "split"
|
|
35
|
+
errs << "#{r}: hero split: needs visual: <name> (the _includes/sections/<name>.html shown beside the text)" unless hero["visual"].is_a?(String) && !hero["visual"].strip.empty?
|
|
36
|
+
errs << "#{r}: hero.side=#{hero['side'].inspect} not in [\"start\", \"end\"]" if hero.key?("side") && !%w[start end].include?(hero["side"])
|
|
37
|
+
errs << "#{r}: hero.ratio=#{hero['ratio'].inspect} not in [\"1:1\", \"5:7\"]" if hero.key?("ratio") && !%w[1:1 5:7].include?(hero["ratio"])
|
|
27
38
|
end
|
|
28
39
|
|
|
29
|
-
# reveal: is a boolean. visual: <name> and decor: <name> on a section item or on hero: needs _includes/sections/<name>.html in the site or the theme (showcase).
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
items.
|
|
40
|
+
# reveal: is a boolean, bleed: is true, false or wide. visual: <name> and decor: <name> on a section item or on hero: needs _includes/sections/<name>.html in the site or the theme (showcase).
|
|
41
|
+
# visual: code under c: split is built in: it moves the item's first fenced block into the visual column,
|
|
42
|
+
# so it needs a fence in that item's markdown and no include; chrome: terminal is its only option.
|
|
43
|
+
def visuals(ctx, r, secs, hero, mds = [], hero_md = "")
|
|
44
|
+
items = secs.each_with_index.map { |s, i| [s, "sections[#{i}]", mds[i].to_s] }
|
|
45
|
+
items << [hero, "hero", hero_md] if hero
|
|
46
|
+
items.each do |s, where, md|
|
|
34
47
|
next unless s.is_a?(Hash)
|
|
35
48
|
ctx.errs << "#{r}: #{where}.reveal must be true or false" if s.key?("reveal") && ![true, false].include?(s["reveal"])
|
|
49
|
+
ctx.errs << "#{r}: #{where}.bleed must be true, false or wide" if s.key?("bleed") && ![true, false, "wide"].include?(s["bleed"])
|
|
50
|
+
ctx.errs << "#{r}: #{where}.chrome=#{s['chrome'].inspect} not in [\"terminal\"] (chrome: needs c: split with visual: code)" if s.key?("chrome") && !(s["chrome"] == "terminal" && s["visual"] == "code" && s["c"] == "split")
|
|
36
51
|
%w[visual decor].each do |key|
|
|
37
52
|
next unless s.key?(key)
|
|
38
53
|
v = s[key].to_s
|
|
54
|
+
if key == "visual" && v == "code" && s["c"] == "split"
|
|
55
|
+
ctx.errs << "#{r}: #{where} visual: code needs a fenced code block (``` or ~~~) in its markdown" unless md =~ /^ {0,3}(```|~~~)/
|
|
56
|
+
next
|
|
57
|
+
end
|
|
39
58
|
next ctx.errs << "#{r}: #{where}.#{key} must be an include name [a-z0-9_-] (got #{s[key].inspect})" unless v =~ /\A[a-z0-9][a-z0-9_-]*\z/
|
|
40
59
|
ctx.errs << "#{r}: #{where}.#{key}: _includes/sections/#{v}.html not found" unless [ctx.src, THEME].any? { |d| File.exist?(File.join(d, "_includes/sections/#{v}.html")) }
|
|
41
60
|
end
|
|
@@ -62,7 +81,7 @@ module Modootoday
|
|
|
62
81
|
params = spec["params"] || {}
|
|
63
82
|
Slots.check_section(errs, r, i, s["c"], spec["slots"], sec_md[i])
|
|
64
83
|
(ctx.part_uses[s["c"]] ||= []) << r if spec.is_a?(Hash) && spec["parts"].is_a?(Array)
|
|
65
|
-
(s.keys - %w[c name visual decor reveal]).each do |k|
|
|
84
|
+
(s.keys - %w[c name visual decor reveal bleed]).each do |k|
|
|
66
85
|
# with visual:, other keys are the visual include's own params (include.section.<key>)
|
|
67
86
|
next if !params.key?(k) && s.key?("visual")
|
|
68
87
|
next errs << "#{r}: sections[#{i}] #{s['c']}: unknown param '#{k}'" unless params.key?(k)
|
|
@@ -4,7 +4,7 @@ module Modootoday
|
|
|
4
4
|
module Check
|
|
5
5
|
# The modootoday: settings in the site's _config.yml.
|
|
6
6
|
module SiteConfig
|
|
7
|
-
COMPONENTS = %w[callout badge hero cta card tabs code-copy nav sidebar page-actions pagination theme-toggle breadcrumb toc accordion steps figure timeline kbd search code footnotes progress embed banner filetree details faq params linkcards quote gallery pricing subscribe split loading lists reveal].freeze
|
|
7
|
+
COMPONENTS = %w[callout badge hero cta card tabs code-copy nav sidebar page-actions pagination theme-toggle breadcrumb toc accordion steps figure timeline kbd search code footnotes progress embed banner filetree details faq params linkcards quote gallery pricing subscribe split loading lists reveal bleed terminal].freeze
|
|
8
8
|
SEMANTIC = %w[background foreground muted muted-foreground card card-foreground primary primary-foreground brand accent
|
|
9
9
|
accent-foreground border ring note tip important warning caution status-available status-partial
|
|
10
10
|
status-planned font-sans font-mono font-size line-height measure space radius].freeze
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jekyll-theme-modootoday
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- modootoday
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-10-
|
|
11
|
+
date: 2026-10-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jekyll
|
|
@@ -133,6 +133,7 @@ files:
|
|
|
133
133
|
- _includes/modootoday/markdown/llms-pages.html
|
|
134
134
|
- _includes/modootoday/markdown/raw-body.html
|
|
135
135
|
- _includes/modootoday/markdown/sections.html
|
|
136
|
+
- _includes/modootoday/markdown/split.html
|
|
136
137
|
- _includes/modootoday/marketing/head.html
|
|
137
138
|
- _includes/modootoday/meta/byline.html
|
|
138
139
|
- _includes/modootoday/meta/post-nav.html
|
|
@@ -222,6 +223,7 @@ files:
|
|
|
222
223
|
- _sass/modootoday/blog/_index.scss
|
|
223
224
|
- _sass/modootoday/blog/_news.scss
|
|
224
225
|
- _sass/modootoday/blog/_post.scss
|
|
226
|
+
- _sass/modootoday/components/bleed/_bleed.scss
|
|
225
227
|
- _sass/modootoday/components/core/chrome/_banner.scss
|
|
226
228
|
- _sass/modootoday/components/core/chrome/_breadcrumb.scss
|
|
227
229
|
- _sass/modootoday/components/core/chrome/_nav.scss
|
|
@@ -262,6 +264,7 @@ files:
|
|
|
262
264
|
- _sass/modootoday/components/section/structure/_steps.scss
|
|
263
265
|
- _sass/modootoday/components/section/structure/_tabs.scss
|
|
264
266
|
- _sass/modootoday/components/section/structure/_timeline.scss
|
|
267
|
+
- _sass/modootoday/components/terminal/_terminal.scss
|
|
265
268
|
- _sass/modootoday/detail/_index.scss
|
|
266
269
|
- _sass/modootoday/detail/_page.scss
|
|
267
270
|
- _sass/modootoday/directory/_filter.scss
|
|
@@ -304,6 +307,7 @@ files:
|
|
|
304
307
|
- assets/css/modootoday-pages.scss
|
|
305
308
|
- assets/css/modootoday-resume.scss
|
|
306
309
|
- assets/css/modootoday.scss
|
|
310
|
+
- assets/css/modootoday/bleed.scss
|
|
307
311
|
- assets/css/modootoday/doc.scss
|
|
308
312
|
- assets/css/modootoday/figure.scss
|
|
309
313
|
- assets/css/modootoday/lists.scss
|
|
@@ -325,6 +329,7 @@ files:
|
|
|
325
329
|
- assets/css/modootoday/structure/steps.scss
|
|
326
330
|
- assets/css/modootoday/structure/tabs.scss
|
|
327
331
|
- assets/css/modootoday/structure/timeline.scss
|
|
332
|
+
- assets/css/modootoday/terminal.scss
|
|
328
333
|
- assets/js/modootoday-math.js
|
|
329
334
|
- assets/js/modootoday-mermaid.js
|
|
330
335
|
- assets/js/modootoday/accordion.js
|