feat(#65): IMP-36 fit/rotation generalization (u1~u8)
Generalize Phase Z frame partial responsive fit / rotation to four canonical
F13/F14/F20/F8 family partials. Surface = 13 canonical partials; 19
builder-only contracts remain explicitly out of scope.
u1 test_imp17_comment_anchor: re-pin L570->L578 (restructure+IMP-17),
L571->L579 (IMP-29 -> IMP-47B supersession). Stage 1 red baseline gate.
u2 frame_contracts.yaml: add rotation_eligible (P1) + body_fit_pattern2 (P2)
bool axes on 13 partial-backed contracts. P1 True: F13/F14/F20/F8 (4).
P2 True: F23 + P1_set (5). F29 columns[1].body_parser column_plain ->
column_with_transform (P3 parity).
u3 test_imp36_fit_rotation_generalization (NEW, 166 lines): static
parametrized assertions for P1 metadata + CQ presence, P1 opt-out
absence, P2 --max-body-lines + clamp + cqh, P2 opt-out absence, 19
builder-only exclusion.
u4 three_parallel_requirements (F13): introduce f13b-root container-name +
container-type:size + @container (aspect-ratio<1.5) rotation;
add inline --max-body-lines + body line-height clamp/cqh/calc.
u5 three_persona_benefits (F14): f14b-root P1 + P2 cqh/jinja body fit.
Persona colors (#285b4a/#445a2f/#743002) and circle SVG aspect 1/1
preserved.
u6 dx_sw_necessity_three_perspectives (F20): f20b-root P1 + P2 cqh/jinja
body fit under IMP-49 partial-fidelity lock.
u7 info_management_what_how_when (F8): f8b-root P1 + P2 cqh/jinja body fit.
u8 test_imp36_overflow_chain_self_fire (NEW, 299 lines): Selenium self-fire
harness for F13/F14/F20/F8 at aspect 1.78 vs 1.0. Asserts line-height
changes, font-size invariance across all 4 frames (no per-frame exempt),
grid columns rotate 3 -> 1, OVERFLOW_CASCADE_ORDER remains 4-tuple.
Stage 4 verification (HEAD 6f1c736 pre-commit baseline):
u1 2/2 PASS, u3 33/33 PASS, u8 9/9 PASS (live Chrome).
Regression sweep tests/phase_z2 + tests/orchestrator_unit 335/335 PASS.
font-size mutations introduced: 0.
Pre-existing red (test_imp47b_step12_ai_wiring x3, ai_fallback_master_flag
default_off x1) verified unchanged via stash swap -> not introduced.
Guardrails honored:
- cqh / clamp / container query only (no shared margin/padding/gap shrink).
- font-size invariant under aspect change (P2 mutates line-height +
--max-body-lines only).
- No cross-frame .fNb__ class borrowing (IMP-49 partial-fidelity lock).
- F14 circle SVG aspect 1/1 untouched; persona colors preserved.
- AI isolation: no HTML structure generation; AI calls remain zone-content.
- 1 turn = 1 step; commit excludes .claude/settings.json and all
out-of-scope untracked worktree per Stage 4 binding contract.
source_comment_ids: Stage 1 #13/#14; Stage 2 #21/#22; Stage 3 #4 + Codex #4
YES; Stage 4 Claude #1 + Codex #3 PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -70,6 +70,13 @@ Asset path runtime resolution :
|
||||
gap: 6px;
|
||||
font-family: 'Noto Sans KR', 'Pretendard', sans-serif;
|
||||
word-break: keep-all;
|
||||
/* IMP-36 (Gitea #65 u5) P1 — partial-side container query root.
|
||||
container-type: size 로 aspect-ratio 측정 가능 (cqh / cqi / cqw 도
|
||||
동일 root 기준). container-name: f14b-root 는 frame_contracts.yaml
|
||||
rotation_eligible: true 와 짝. Circle badge (.f14b__badge aspect-ratio
|
||||
1/1) 는 별도 element — 본 root 의 aspect-ratio 측정 대상 아님. */
|
||||
container-type: size;
|
||||
container-name: f14b-root;
|
||||
}
|
||||
.f14b__title {
|
||||
font-size: var(--font-zone-title);
|
||||
@@ -176,6 +183,22 @@ Asset path runtime resolution :
|
||||
position: relative;
|
||||
padding-left: 14px;
|
||||
}
|
||||
/* IMP-36 (Gitea #65 u5) P2 — body fit via cqh + clamp + --max-body-lines.
|
||||
persona.body 의 bullet 개수가 늘면 line-height 가 비례로 축소. font-size
|
||||
미변경 (사용자 룰). --max-body-lines fallback = 7 (Figma 원본 frame 평균
|
||||
bullet 수, file header L8 참조). 60cqh = .f14b__body 영역 비율 근사치
|
||||
(title ≈ 15cqh + badge ≈ 18cqh + photo ≈ 7cqh → body ≈ 60cqh). 본 clamp
|
||||
은 .text-line 의 var(--lh-body) 를 override (cascade 우선순위). */
|
||||
.f14b__body .text-line {
|
||||
line-height: clamp(1.15em, calc(60cqh / var(--max-body-lines, 7)), 1.6em);
|
||||
}
|
||||
/* IMP-36 (Gitea #65 u5) P1 — aspect-ratio < 1.5 rotation rule. zone 의
|
||||
가로:세로 비가 1.5 미만으로 좁아지면 3-col grid 가 1-col stack 으로
|
||||
회전. Circle badge (.f14b__badge aspect-ratio 1/1) 는 col 내부 element
|
||||
이므로 회전 후에도 원형 유지. */
|
||||
@container f14b-root (aspect-ratio < 1.5) {
|
||||
.f14b__cols { grid-template-columns: 1fr; }
|
||||
}
|
||||
.f14b__body .text-line--bullet::before {
|
||||
content: "\2713";
|
||||
position: absolute;
|
||||
@@ -226,7 +249,7 @@ Asset path runtime resolution :
|
||||
</div>
|
||||
|
||||
{# body — bullets with CSS check marker #}
|
||||
<div class="f14b__body">
|
||||
<div class="f14b__body" style="--max-body-lines: {{ (persona.body | length) if persona.body else 7 }};">
|
||||
{% if persona.body %}
|
||||
{% for line in persona.body %}<div class="text-line text-line--bullet{% if line.indent > 0 %} text-line--indent-{{ line.indent }}{% endif %}">{{ line.text | safe }}</div>{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
Reference in New Issue
Block a user