org-template-editor.component.ts carried an eslint-disable for max-lines,
padded by a dead sample-letter constant, 13 label inputs that were never
bindable, and two self-contained mutation clusters. Split all three out:
- SAMPLE_LETTER_BRIEF moves to brief/domain/sample-letter.ts. It is
production content (the letter the admin previews), not a test fixture,
so it stays out of brief.testing.ts (no-testing-in-production forbids
production code from reaching a *.testing.ts file).
- 11 of the 13 label inputs become inline i18n template text. The two
that interpolate MARGIN_MIN_MM/MARGIN_MAX_MM (marginsLegend,
invalidHint) stay in TS, because moving an interpolated $localize call
into a template renames the xlf placeholder and breaks the translation
merge. Every id is preserved; messages.en.xlf is unchanged.
- logo-upload.component.ts and version-history.component.ts each take
one output cluster. The parent still declares and re-emits all 11
outputs — org-template.page.ts binds them directly on
<app-org-template-editor> and is out of this ticket's file scope, so
the parent's public surface cannot shrink.
Correction to the ticket while executing it: its acceptance check for
"= output" on the parent read "MUST be 7", copying decision 4's cluster
count instead of decision 5's (and the ticket's own Risks section's)
explicit requirement that the parent keep all 11 declarations. Fixed the
ticket's acceptance section to the correct number.
npm run ci --full is green.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>