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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 497fb07373c85ca822bcf41f91d4d0703a01209ecaa819b9b7ac7ed98471e1cd
4
- data.tar.gz: b71c8b2a29a3b01a081330e0d09c0db0233b3a6f2d53224ffa5bad8f65f6c167
3
+ metadata.gz: '09f05d5325d994791567a94eafd99eac00aa56e8eb114d931f8cd621fabed7fb'
4
+ data.tar.gz: c155b58111fa8bd0028a1293fd1600642283c34ac41315e19334fc223f4bf5b1
5
5
  SHA512:
6
- metadata.gz: ed3f80481897f18f963d7cc0bc3874bb9c80aaa2d5cb4e2cb75a2ffd9150cae1cd276d14f50239a380206c5eb1c9815a58353087cdc58ebe087de17f8ad5ae4b
7
- data.tar.gz: 036c0ae7ee9ed578162fda1812f2ff3e51dacb39619d56e6e006278ac351597f0f47d78da59e95aeb7b4756f33049f6bc5c292f46e947bb55b565313a1c9faa6
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.1.1...HEAD
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.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.1.1
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.1"\n' > Gemfile
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.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.1.1
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.1"\n' > Gemfile
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
- <div class="mt-section-in"><div class="mt-section-body"><h2 {{ _body }}</div>{% if _s.visual %}<div class="mt-section-visual">{% include sections/{{ _s.visual }}.html section=_s %}</div>{% endif %}</div>{% if _s.decor %}<div class="mt-section-decor" aria-hidden="true">{% include sections/{{ _s.decor }}.html section=_s %}</div>{% endif %}</section>
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
- visuals(ctx, r, secs, hero.is_a?(Hash) ? hero : nil)
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
- def visuals(ctx, r, secs, hero)
31
- items = secs.each_with_index.map { |s, i| [s, "sections[#{i}]"] }
32
- items << [hero, "hero"] if hero
33
- items.each do |s, where|
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.1.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-30 00:00:00.000000000 Z
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