pandorga 2.1.0 → 2.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: 3dd3df9d18ed1ac1a99e07aecfe17e5776ccf46e35ca30cb4c87dc8e9ec6a00f
4
- data.tar.gz: c87fa62d1dcdd8ddc1b1f00671b83558e0114b4d28a2de376eb653251740a7a4
3
+ metadata.gz: df6a05990dd61bd1ec65a55988e6ff3c905dac4368c1205bb963b261440adf2c
4
+ data.tar.gz: 4f28891d107c9dd8b19afdef872ae025f82f9106369477214d07ff10576b22a5
5
5
  SHA512:
6
- metadata.gz: f75cd5a291e0678b90997a207a73bdd3401e76e3de3d4bcbd732323f46e87f11b4aa0075a46a61e35378a49d79ae7acb97d521793ca04a5705e5fe4a5d6d7381
7
- data.tar.gz: 279e4ed500471c6b7a74129bb9a18648c4c21054aa9b02af7f2794f9eada23afe7249c23b2de2f6555301d3d520b4caba60c7c30e3620eae8aaf8409905900d2
6
+ metadata.gz: 755cc712729fdde1c7c04fa76ce617b4045dd0da9e73e88c8aa945e823c5db21e1c8da95c9b2240cb46d28328ecf25bf9d37fc129317715e13ed52c111188131
7
+ data.tar.gz: fc897b6820e06bf5b87bed93001605b5ac744025564427ad1b4cb9637d0ff9b9002d6a67e136f56363b762422bf5cb25017145f7226c31ea9c5309ccdd739e9d
data/CHANGELOG.md CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.2.0] — 2026-10-28
6
+
7
+ ### Added
8
+
9
+ - CR-10: Recalculated `.home-hero-title` cqi divisors for Ancizar Serif at -0.02em tracking (~5.55em phone family-line width, ~10.81em desktop full-name cap) (PLT-AC-62).
10
+ - CR-11: Fixed/list page titles (`.page-header-title`) default to upright by removing hardcoded `class="italic"` on `[data-content-header-title]`. Inline emphasis and marker wash apply only via `<em>` elements. `--type-page` and `--type-page-lg` tokens bumped so list titles are noticeably larger while detail titles remain unchanged (PLT-AC-63).
11
+ - CR-12: `.home-hero-family` drops `font-style: italic`, keeping primary color and raising marker strength to ~0.88× section alpha levels (PLT-AC-64).
12
+ - CR-13: Home hierarchy ladder adjusted so section titles dominate specimen names on mobile and desktop viewports. Raised `--type-section-sm` to 1.72rem and removed `.home-specimen-title` override to `var(--type-section)` at desktop breakpoints (PLT-AC-65).
13
+ - CR-14: Grouped title role marker selector in `assets/css/base.css` ensures `em` elements inside `.section-title`, `.page-header-title`, `.home-index-title`, `.card-title`, and `.ledger-card-title` receive the primary-color felt-marker wash (PLT-AC-66).
14
+
15
+ ## [2.1.1] — 2026-10-28
16
+
17
+ ### Fixed
18
+
19
+ - Mobile body weight (`body_weight_mobile` / `--weight-body-mobile`) now wins on viewports under 768px. The rebind lives in `theme-vars.html` after the theme token block so it is not overridden by the desktop `--weight-body` declaration (PLT-AC-57).
20
+
5
21
  ## [2.1.0] — 2026-10-28
6
22
 
7
23
  ### Added
@@ -8,7 +8,7 @@
8
8
  <span data-content-header-eyebrow class="{{ include.eyebrow_class | default: 'font-label text-sm text-secondary block mb-4 hidden' }}" hidden></span>
9
9
 
10
10
  <h1 class="page-header-title font-title{% if include.title_class %} {{ include.title_class }}{% endif %}">
11
- <span data-content-header-title class="italic"{% if _header_title != blank %} data-content-static{% endif %}>{% if _header_title contains "*" %}{% assign _header_bits = _header_title | split: "*" %}{% for _header_bit in _header_bits %}{% assign _header_em = forloop.index0 | modulo: 2 %}{% if _header_em == 1 %}<em>{{ _header_bit | escape }}</em>{% else %}{{ _header_bit | escape }}{% endif %}{% endfor %}{% else %}{{ _header_title | escape }}{% endif %}</span>
11
+ <span data-content-header-title{% if _header_record.title != nil %} data-content-static{% endif %}>{% if _header_title contains "*" %}{% assign _header_bits = _header_title | split: "*" %}{% for _header_bit in _header_bits %}{% assign _header_em = forloop.index0 | modulo: 2 %}{% if _header_em == 1 %}<em>{{ _header_bit | escape }}</em>{% else %}{{ _header_bit | escape }}{% endif %}{% endfor %}{% else %}{{ _header_title | escape }}{% endif %}</span>
12
12
  </h1>
13
13
 
14
14
  <span data-content-header-tags class="{{ include.tags_class | default: 'page-header-tags font-label text-tertiary mt-4 block hidden' }}" hidden></span>
@@ -13,4 +13,13 @@
13
13
  --motion-duration-slow: 0s;
14
14
  }
15
15
  }
16
+
17
+ /* After theme-vars-block sets --weight-body (desktop), rebind on small
18
+ viewports. Must live in this style tag: an earlier base.css media
19
+ query loses to the block's later --weight-body declaration (PLT-AC-57). */
20
+ @media (max-width: 767px) {
21
+ :root, [data-theme] {
22
+ --weight-body: var(--weight-body-mobile, 350);
23
+ }
24
+ }
16
25
  </style>
data/assets/css/base.css CHANGED
@@ -175,12 +175,12 @@ html {
175
175
  /* Display — Ancizar Serif */
176
176
  --type-display: 2.9015rem;
177
177
  --type-display-lg: 3.6515rem;
178
- --type-page: 2.4015rem;
179
- --type-page-lg: 2.9015rem;
178
+ --type-page: 2.75rem;
179
+ --type-page-lg: 3.35rem;
180
180
  --type-section: 1.9015rem;
181
181
  --type-section-lg: 2.1515rem;
182
182
  /* Phone steps for home band titles and card titles (PLT-AC-49). */
183
- --type-section-sm: 1.375rem;
183
+ --type-section-sm: 1.72rem;
184
184
 
185
185
  /* Content titles — Ancizar Serif */
186
186
  --type-title: 2.20165rem;
@@ -341,11 +341,10 @@ html body {
341
341
 
342
342
  /* The italicized second half of a section or page title ("Articles & Notes",
343
343
  "Personal Projects & Experiments") carries the page's accent colour plus a
344
- marker highlight — felt-pen underlay, not invented copy. Same wash on home
345
- band titles (`.section-title em`) and listing mastheads (`.page-header-title
346
- em`) so the two never diverge. */
347
- .section-title em,
348
- .page-header-title em {
344
+ marker highlight — felt-pen underlay, not invented copy. Unified wash on all
345
+ title roles (.section-title, .page-header-title, .home-index-title,
346
+ .card-title, .ledger-card-title em) so marker highlights never diverge. */
347
+ .section-title em, .page-header-title em, .home-index-title em, .card-title em, .ledger-card-title em {
349
348
  font-style: italic;
350
349
  color: var(--color-primary);
351
350
  background: linear-gradient(104deg,
@@ -359,8 +358,7 @@ html body {
359
358
  }
360
359
 
361
360
  /* Dark ink paper: dim the felt wash so primary/ochre highlighter does not glow. */
362
- [data-theme="dark"] .section-title em,
363
- [data-theme="dark"] .page-header-title em {
361
+ [data-theme="dark"] .section-title em, [data-theme="dark"] .page-header-title em, [data-theme="dark"] .home-index-title em, [data-theme="dark"] .card-title em, [data-theme="dark"] .ledger-card-title em {
364
362
  background: linear-gradient(104deg,
365
363
  transparent 0.9%,
366
364
  color-mix(in srgb, var(--color-primary) 9%, transparent) 2.4%,
@@ -151,15 +151,14 @@
151
151
  min-height: calc(var(--type-body) * 1.35);
152
152
  }
153
153
 
154
- /* Name spans the copy column (container query on .home-hero-copy). The floor
155
- is the band-title step — Articles, Rascunhos, Projects — so a phone does
156
- not drop the name to the card size to keep it on one line. From 640px the
157
- floor follows `.section-title` up to `--type-section-lg`. Wider columns
158
- still grow toward `--type-page-lg`. */
154
+ /* Name spans the copy column (container query on .home-hero-copy). Divisor
155
+ is calculated for Ancizar Serif at -0.02em tracking (~5.55em phone
156
+ family-line width). From 640px the floor follows `.section-title` up to
157
+ `--type-section-lg`. Wider columns still grow toward `--type-page-lg`. */
159
158
  .home-hero-title {
160
159
  font-family: var(--font-title);
161
160
  font-weight: 400;
162
- font-size: clamp(var(--type-section), calc(100cqi * 0.92 / 14.5), var(--type-page-lg));
161
+ font-size: clamp(var(--type-section), calc(100cqi * 0.92 / 5.55), var(--type-page-lg));
163
162
  line-height: 1.05;
164
163
  letter-spacing: -0.02em;
165
164
  color: var(--color-on-surface);
@@ -175,12 +174,11 @@
175
174
 
176
175
  .home-hero-family {
177
176
  display: inline;
178
- font-style: italic;
179
177
  color: var(--color-primary);
180
178
  --mark-ink: var(--color-primary);
181
- --mark-1: calc(var(--mark-quiet-a) * 0.4);
182
- --mark-2: calc(var(--mark-quiet-b) * 0.4);
183
- --mark-3: calc(var(--mark-quiet-c) * 0.4);
179
+ --mark-1: calc(var(--mark-a) * 0.88);
180
+ --mark-2: calc(var(--mark-b) * 0.88);
181
+ --mark-3: calc(var(--mark-c) * 0.88);
184
182
  background: linear-gradient(var(--mk-angle, 104deg), transparent var(--mk-s0, 0.9%), color-mix(in srgb, var(--mark-ink) var(--mark-1), transparent) var(--mk-s1, 2.6%), color-mix(in srgb, var(--mark-ink) var(--mark-2), transparent) var(--mk-mid, 58%), color-mix(in srgb, var(--mark-ink) var(--mark-3), transparent) var(--mk-end, 98%), transparent 100%) 0 var(--mk-y, 50%) / 100% var(--mk-h, 100%) no-repeat;
185
183
  -webkit-box-decoration-break: clone;
186
184
  box-decoration-break: clone;
@@ -189,7 +187,7 @@
189
187
 
190
188
  @media (min-width: 640px) {
191
189
  .home-hero-title {
192
- font-size: clamp(var(--type-section-lg), calc(100cqi * 0.92 / 14.5), var(--type-page-lg));
190
+ font-size: clamp(var(--type-section-lg), calc(100cqi * 0.92 / 5.55), var(--type-page-lg));
193
191
  }
194
192
  }
195
193
 
@@ -198,14 +196,14 @@
198
196
  @media (max-width: 639px) {
199
197
  .home-hero-title {
200
198
  white-space: normal;
201
- font-size: calc(clamp(var(--type-section), calc(100cqi * 0.92 / 14.5), var(--type-page-lg)) + 3pt);
199
+ font-size: calc(clamp(var(--type-section), calc(100cqi * 0.92 / 5.55), var(--type-page-lg)) + 3pt);
202
200
  }
203
201
  }
204
202
 
205
203
  @media (min-width: 640px) and (max-width: 767px) {
206
204
  .home-hero-title {
207
205
  white-space: normal;
208
- font-size: calc(clamp(var(--type-section-lg), calc(100cqi * 0.92 / 14.5), var(--type-page-lg)) + 3pt);
206
+ font-size: calc(clamp(var(--type-section-lg), calc(100cqi * 0.92 / 5.55), var(--type-page-lg)) + 3pt);
209
207
  }
210
208
  }
211
209
 
@@ -409,12 +407,12 @@ html[data-theme="light"] .home-hero-plate {
409
407
  object-position: center;
410
408
  }
411
409
 
412
- /* --hero-name-fit is the longer name part in em at the title's tracking;
413
- a site with a longer word raises it. The selector outranks a site's
414
- one-line size written as .home-ledger .home-hero-title. */
410
+ /* --hero-name-fit is the longer name part in em at the title's tracking
411
+ (Ancizar full-name default ~10.81em); a site with a longer word raises it.
412
+ The selector outranks a site's one-line size written as .home-ledger .home-hero-title. */
415
413
  .home-ledger .home-hero-title {
416
414
  white-space: normal;
417
- font-size: min(calc(100cqi / var(--hero-name-fit, 8.4)), var(--hero-name-max, 4.5rem));
415
+ font-size: min(calc(100cqi / var(--hero-name-fit, 10.81)), var(--hero-name-max, 4.5rem));
418
416
  }
419
417
 
420
418
  .home-hero-given,
@@ -1370,9 +1368,6 @@ button.home-project-inventory-row {
1370
1368
  background: var(--color-panel-contrast);
1371
1369
  }
1372
1370
 
1373
- .home-project-specimen .home-specimen-title {
1374
- font-size: var(--type-section);
1375
- }
1376
1371
 
1377
1372
  .home-project-inventory-row {
1378
1373
  flex: 1 1 0;
@@ -24,7 +24,7 @@ module Pandorga
24
24
 
25
25
  gem "pandorga", "~> 2.0"
26
26
  # Local checkout: gem "pandorga", path: "../pandorga"
27
- # GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v2.1.0"
27
+ # GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v2.2.0"
28
28
  gem "csv"
29
29
  gem "base64"
30
30
  RUBY
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pandorga
4
- VERSION = "2.1.0"
4
+ VERSION = "2.2.0"
5
5
  end
@@ -300,6 +300,44 @@ if declaration_bodies(home_sheet, ".home-hero-summary").any? { |body| declaratio
300
300
  errors << "assets/css/ledger/home.css: .home-hero-summary must use --color-legend (PLT-AC-23)"
301
301
  end
302
302
 
303
+ # PLT-AC-62. Hero cqi clamp divisors calculated for Ancizar at -0.02em tracking (~5.55 / ~10.81). Cinzel comments removed.
304
+ if home_sheet.match?(/Cinzel/i)
305
+ errors << "assets/css/ledger/home.css must not contain Cinzel comments or references (PLT-AC-62)"
306
+ end
307
+ if home_sheet.include?("14.5") || home_sheet.include?("8.4")
308
+ errors << "assets/css/ledger/home.css: hero clamp divisors must use Ancizar factors (~5.55 / ~10.81) instead of Cinzel (PLT-AC-62)"
309
+ end
310
+
311
+ # PLT-AC-63. Page header markup must not hardcode class="italic" on title span.
312
+ page_header_html = File.read(REPO_ROOT.join("_includes/page/page-header.html"))
313
+ if page_header_html.include?('data-content-header-title class="italic"') || page_header_html.include?('class="italic" data-content-header-title')
314
+ errors << "_includes/page/page-header.html: data-content-header-title must not hardcode class=\"italic\" (PLT-AC-63)"
315
+ end
316
+
317
+ # PLT-AC-64. Hero family drops italic.
318
+ hero_family_body = declaration_bodies(home_sheet, ".home-hero-family").join(";")
319
+ if declarations(hero_family_body).include?("font-style:italic")
320
+ errors << "assets/css/ledger/home.css: .home-hero-family must remove font-style: italic (PLT-AC-64)"
321
+ end
322
+
323
+ # PLT-AC-65. Home specimen title must not be set to var(--type-section) at >=900px.
324
+ if home_sheet.include?(".home-project-specimen .home-specimen-title {\n font-size: var(--type-section);\n }") ||
325
+ home_sheet.match?(/\.home-specimen-title\s*\{[^}]*font-size\s*:\s*var\(--type-section\)/)
326
+ errors << "assets/css/ledger/home.css: .home-specimen-title must not be set to var(--type-section) at 900px (PLT-AC-65)"
327
+ end
328
+
329
+ # PLT-AC-66. Grouped selector for title role em felt-marker wash.
330
+ base_sheet = strip_comments(File.read(CSS_ROOT.join("base.css")))
331
+ required_marker_selector = ".section-title em, .page-header-title em, .home-index-title em, .card-title em, .ledger-card-title em"
332
+ unless base_sheet.include?(required_marker_selector)
333
+ errors << "assets/css/base.css: missing grouped title marker selector '#{required_marker_selector}' (PLT-AC-66)"
334
+ end
335
+
336
+ dark_marker_selector = "[data-theme=\"dark\"] .section-title em, [data-theme=\"dark\"] .page-header-title em, [data-theme=\"dark\"] .home-index-title em, [data-theme=\"dark\"] .card-title em, [data-theme=\"dark\"] .ledger-card-title em"
337
+ unless base_sheet.include?(dark_marker_selector)
338
+ errors << "assets/css/base.css: missing grouped dark title marker selector '#{dark_marker_selector}' (PLT-AC-66)"
339
+ end
340
+
303
341
  fail!("CSS structure problems:\n - #{errors.join("\n - ")}") unless errors.empty?
304
342
 
305
343
  puts " #{sheets.size} stylesheet(s) balanced, no conflict markers."
@@ -104,3 +104,7 @@ fail!("spec is missing PLT-AC-30") unless spec.include?("PLT-AC-30")
104
104
  fail!("configuration reference omits pandorga.fonts") unless ROOT.join("docs/configuration.md").read.include?("pandorga.fonts")
105
105
 
106
106
  puts "PASS test-fonts"
107
+
108
+ theme_vars = File.read(File.expand_path("../../_includes/theme/theme-vars.html", __dir__))
109
+ fail!("theme-vars.html missing mobile --weight-body rebind (PLT-AC-57 cascade)") unless theme_vars.match?(/@media\s*\(max-width:\s*767px\)[\s\S]*--weight-body:\s*var\(--weight-body-mobile/)
110
+
@@ -224,7 +224,7 @@ item(6) do
224
224
  title = ".home-ledger .home-hero-title"
225
225
  expect_decl(title, "white-space", "normal", media: DESKTOP)
226
226
  expect_decl(title, "font-size",
227
- "min(calc(100cqi / var(--hero-name-fit, 8.4)), var(--hero-name-max, 4.5rem))",
227
+ "min(calc(100cqi / var(--hero-name-fit, 10.81)), var(--hero-name-max, 4.5rem))",
228
228
  media: DESKTOP)
229
229
  %w[.home-hero-given .home-hero-family].each do |sel|
230
230
  expect_decl(sel, "display", "inline-block", media: DESKTOP)
@@ -136,14 +136,14 @@ check!(symbols["family"] == "Rivera Santos", "symbol keys work, got #{symbols.in
136
136
 
137
137
  hero = css[/\.home-hero-title \{.*?(?=\.home-hero-summary)/m]
138
138
  check!(hero, "missing hero title block")
139
- check!(hero.include?("font-size: clamp(var(--type-section), calc(100cqi * 0.92 / 14.5), var(--type-page-lg));"),
140
- "base name size stays the 1.4.9 clamp")
139
+ check!(hero.include?("font-size: clamp(var(--type-section), calc(100cqi * 0.92 / 5.55), var(--type-page-lg));"),
140
+ "base name size uses Ancizar clamp")
141
141
  check!(hero.include?("@media (max-width: 639px)"), "missing phone size query")
142
- check!(hero.include?("calc(clamp(var(--type-section), calc(100cqi * 0.92 / 14.5), var(--type-page-lg)) + 3pt)"),
142
+ check!(hero.include?("calc(clamp(var(--type-section), calc(100cqi * 0.92 / 5.55), var(--type-page-lg)) + 3pt)"),
143
143
  "below 640px the name must be the current clamp plus 3pt")
144
144
  check!(hero.include?("@media (min-width: 640px) and (max-width: 767px)"),
145
145
  "missing 640-767 size query")
146
- check!(hero.include?("calc(clamp(var(--type-section-lg), calc(100cqi * 0.92 / 14.5), var(--type-page-lg)) + 3pt)"),
146
+ check!(hero.include?("calc(clamp(var(--type-section-lg), calc(100cqi * 0.92 / 5.55), var(--type-page-lg)) + 3pt)"),
147
147
  "from 640px to 767px the name must be the section-lg clamp plus 3pt")
148
148
 
149
149
  plain = hero.index("@media (min-width: 640px) {")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pandorga
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Pandorga contributors