diff --git a/.fallowrc.jsonc b/.fallowrc.jsonc
index d81e22f1d..e60956e65 100644
--- a/.fallowrc.jsonc
+++ b/.fallowrc.jsonc
@@ -108,4 +108,20 @@
// scripts/*.mjs are correct by npm semantics; triage, do not relocate.
"dev-dependencies-in-production": "warn",
},
+
+ "health": {
+ // Per-file ceilings for findings that are reviewed and deliberately
+ // kept whole. PageStrip grid cell (assessed 2026-09-18): the 54-line
+ // pageGrid snippet's branches (grabbed/insertion/active/drop-target
+ // states x a11y/dnd bindings) are inherent to a page grid cell;
+ // extracting the button into a child snippet relocates identical
+ // branchiness behind prop indirection for zero clarity gain.
+ "thresholdOverrides": [
+ {
+ "files": ["apps/web/src/lib/image-editor/components/page-strip.svelte"],
+ "maxCognitive": 25,
+ "reason": "Page grid cell states are inherent to the template; extraction relocates identical branchiness.",
+ },
+ ],
+ },
}
diff --git a/AGENTS.md b/AGENTS.md
index e154fde98..4e1be6918 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -96,6 +96,7 @@ Each social network has one self-hosting integration guide. Keep shared credenti
- Image layers without `color_grade_version` retain legacy Fabric adjustments. Version 1 routes layer and page-output grading through the shared editor color pipeline and the Fabric preview/export adapter. Never migrate legacy layers implicitly.
- Image Editor controller mutations preserve unchanged document, page, and layer references; shared undo entries depend on those objects remaining immutable. Apply document edits through the controller, and defer page-strip rendering until a color gesture ends.
- Image and Video Editors share wheel and curve controls, scope presentation, and curve math under `lib/components/editor-color-*` and `lib/editor-color-grade`. Each editor owns its gestures, selection, persistence, and sampled frames.
+- Editor workstation controls (scrub field, slider row, disclosure, menu, knob, toolbar group, status line) live in `lib/components/editor-density/` on theme tokens at 22px fields, 25px menus and bars, and 32px primary actions. Scope 44px minimums to coarse pointers with `[@media(pointer:coarse)]`; the `[(pointer:coarse)]` form is not a valid variant. Every new production file needs a production importer or the knip reachability gate fails.
- A Video Editor sequence grade is one `sequenceColorGrade` adjustment item on its dedicated locked track. The timeline store keeps it over the full sequence range, and preview/export apply it once after compositing. Never treat it as an item-scoped adjustment layer.
- Keep secrets out of code and logs. Stored provider tokens remain encrypted.
- Provider certification identifies output profiles. Hash all of an output's authoring formats into its contract, and use the same production requirements when recording and evaluating evidence.
diff --git a/apps/web/src/lib/components/editor-density/disclosure.svelte b/apps/web/src/lib/components/editor-density/disclosure.svelte
new file mode 100644
index 000000000..c7bd8aafe
--- /dev/null
+++ b/apps/web/src/lib/components/editor-density/disclosure.svelte
@@ -0,0 +1,62 @@
+
+
+
+