67 lines
2.7 KiB
JavaScript
67 lines
2.7 KiB
JavaScript
|
|
// task #164: guard against .stream flex-column collapsing non-scrolling
|
||
|
|
// children (approval / exit_plan_mode / steer cards) to ~16px. The fix in
|
||
|
|
// style.css relies on two rules:
|
||
|
|
// 1. `.stream { min-height: 0; ... }` — lets stream itself scroll instead
|
||
|
|
// of overflowing its column-flex parent (.pane / .main).
|
||
|
|
// 2. `.stream > * { flex-shrink: 0; }` — each direct child renders at its
|
||
|
|
// intrinsic height so interaction cards with fixed textarea+buttons do
|
||
|
|
// not get squashed when the total body is taller than the viewport.
|
||
|
|
// Both regressed silently before because CSS isn't in the unit test loop; this
|
||
|
|
// file adds a source-string assertion so the ratchet catches removals.
|
||
|
|
|
||
|
|
const test = require('node:test');
|
||
|
|
const assert = require('node:assert/strict');
|
||
|
|
const fs = require('node:fs');
|
||
|
|
const path = require('node:path');
|
||
|
|
|
||
|
|
const CSS = fs.readFileSync(
|
||
|
|
path.join(__dirname, '..', 'src', 'renderer', 'style.css'),
|
||
|
|
'utf8',
|
||
|
|
);
|
||
|
|
|
||
|
|
test('#164: .stream declares min-height:0 so it can scroll inside column-flex parent', () => {
|
||
|
|
// find the first `.stream {` block (line 289 region) — the layout rule, not
|
||
|
|
// the theme rebase rule further down that only tweaks padding.
|
||
|
|
const idx = CSS.indexOf('.stream {');
|
||
|
|
assert.ok(idx >= 0, '.stream rule must exist');
|
||
|
|
const block = CSS.slice(idx, CSS.indexOf('}', idx) + 1);
|
||
|
|
assert.match(
|
||
|
|
block,
|
||
|
|
/min-height:\s*0\b/,
|
||
|
|
'.stream must set min-height:0 to allow internal scroll under flex parent',
|
||
|
|
);
|
||
|
|
assert.match(
|
||
|
|
block,
|
||
|
|
/flex-direction:\s*column/,
|
||
|
|
'sanity: the guarded block is still the column-flex stream rule',
|
||
|
|
);
|
||
|
|
assert.match(
|
||
|
|
block,
|
||
|
|
/overflow-y:\s*auto/,
|
||
|
|
'sanity: stream is still the scroll container',
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('#164: .stream > * has flex-shrink:0 so intrinsic-height children do not collapse', () => {
|
||
|
|
// The rule appears on its own line as `.stream > * { flex-shrink: 0; ... }`.
|
||
|
|
// Assert directly on that shape so a rewrite that reorders declarations
|
||
|
|
// still passes as long as the intent stays.
|
||
|
|
const re = /^\.stream\s*>\s*\*\s*\{[^}]*flex-shrink:\s*0/m;
|
||
|
|
assert.match(
|
||
|
|
CSS,
|
||
|
|
re,
|
||
|
|
'.stream > * must set flex-shrink:0 to keep interaction cards / rows from collapsing',
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('#164: guarded rules are documented in-place so future edits know why', () => {
|
||
|
|
// Both rules should carry a "#164" reference in a nearby comment so a
|
||
|
|
// subsequent editor sees the bug id before deleting them. The comment
|
||
|
|
// preceding `.stream > *` is the primary docstring for the fix.
|
||
|
|
const bookmark = CSS.match(/task #164:[\s\S]{0,600}\.stream > \*/);
|
||
|
|
assert.ok(
|
||
|
|
bookmark,
|
||
|
|
'a task #164 comment must sit adjacent to the .stream > * rule so the intent survives future refactors',
|
||
|
|
);
|
||
|
|
});
|