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 +4 -4
- data/CHANGELOG.md +16 -0
- data/_includes/page/page-header.html +1 -1
- data/_includes/theme/theme-vars.html +9 -0
- data/assets/css/base.css +8 -10
- data/assets/css/ledger/home.css +15 -20
- data/lib/pandorga/commands/new.rb +1 -1
- data/lib/pandorga/version.rb +1 -1
- data/scripts/test/test-css-structure.rb +38 -0
- data/scripts/test/test-fonts.rb +4 -0
- data/scripts/test/test-hero-16x9.rb +1 -1
- data/scripts/test/test-hero-name.rb +4 -4
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: df6a05990dd61bd1ec65a55988e6ff3c905dac4368c1205bb963b261440adf2c
|
|
4
|
+
data.tar.gz: 4f28891d107c9dd8b19afdef872ae025f82f9106369477214d07ff10576b22a5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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.
|
|
179
|
-
--type-page-lg:
|
|
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.
|
|
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.
|
|
345
|
-
|
|
346
|
-
em
|
|
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%,
|
data/assets/css/ledger/home.css
CHANGED
|
@@ -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).
|
|
155
|
-
is
|
|
156
|
-
|
|
157
|
-
|
|
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 /
|
|
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-
|
|
182
|
-
--mark-2: calc(var(--mark-
|
|
183
|
-
--mark-3: calc(var(--mark-
|
|
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 /
|
|
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 /
|
|
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 /
|
|
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.
|
|
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,
|
|
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.
|
|
27
|
+
# GitHub tag: gem "pandorga", github: "alexandrelheinen/pandorga", tag: "v2.2.0"
|
|
28
28
|
gem "csv"
|
|
29
29
|
gem "base64"
|
|
30
30
|
RUBY
|
data/lib/pandorga/version.rb
CHANGED
|
@@ -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."
|
data/scripts/test/test-fonts.rb
CHANGED
|
@@ -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,
|
|
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 /
|
|
140
|
-
"base name size
|
|
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 /
|
|
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 /
|
|
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) {")
|