Repository navigation
Lids for bins (F16): flat cover lid for every placed bin STL - #160
Conversation
Bin options gains a Lids switch. When on, every placed bin gains a flat 3 mm cover lid as its own STL in the Download files zip, one per distinct bin footprint shared across heights, counted in the Print plan card and estimates, with its own 3MF lid plates. The lid sits on the stacking lip; it has no snap lip, hinge, or handle. Persisted as gridfinity_lids, local-only, not in share links. Estimates include the lid volume; the Download files README notes the lid and its limits. Feature map: F16 not present to partial, parity 50.0% to 51.0%.
✅ Deploy Preview for gridfinity-drawer-planner ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
PR Quality Report 📊
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #160 +/- ##
=======================================
Coverage ? 94.05%
=======================================
Files ? 72
Lines ? 3684
Branches ? 1076
=======================================
Hits ? 3465
Misses ? 198
Partials ? 21
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Lane B PASS on the deploy preview (https://deploy-preview-160--gridfinity-drawer-planner.netlify.app, head be5e979) — all 8 steps, no page errors:
Merge gates: CI 31/31 green, perf no-regression (two pairs), independent review SHIP IT + docs-delta SHIP IT, scoreboard updated, RUNLOG trail present. No claude-review check on this head (no exception needed). |
Lids for bins (F16): flat cover lid for every placed bin STL
Bin options gains a "Lids for bins" switch. When on, every placed bin gains a
flat 3 mm cover lid as its own STL in the Download files zip: one lid per
distinct bin footprint, shared across heights, counted in the Print plan
card and in the print estimates, with its own 3MF lid plates. The lid sits
on the stacking lip; it has no snap lip, hinge, or handle. Persisted as
gridfinity_lids, local-only, not in share links (same precedent aslabelTabs, dividers, and testFit).
Geometry
(
binOuterSize, the same dims the bin part itself uses), 3 mm thick(
LID_THICKNESS_MM). 12 triangles, bounds exactly[0, 0, 0]–[width, depth, 3], signed volume exactlywidth × depth × 3.face, outside the lid footprint (they touch only at the front plane), so
a lid laid on the stacking lip sits flat and does not intersect a tab,
and the tab still rises above the lid. Lids are separate STLs, not merged
into bin meshes, so tabs and dividers are undisturbed.
lid:<cellSize>:<w>x<d>),so the same footprint at different heights shares one lid with summed
counts. Skipped bins get no lid; counts multiply by the drawer count.
Half-grid lids stay distinct (
half-gridqualifier in key, stem, label).Wiring
useGridfinitySettingsaddsgridfinity_lids(new key only, defaultfalse; legacy migration untouched).
GridfinityCalculatordrillslidsto
BinOptions,DownloadButton(→createPrintFiles), andPrintPlanCard(→collectPrintParts→ part rows +estimatePrint).exportFilesroutes lids to their own3mf/plate-N-lids.3mfplates(never mixed into bin/baseplate plates) and adds the README lid note
plus the lid size line. Test-fit logic is untouched (baseplate/spacer
stems only). Share format untouched (
shareLayout.tsnot modified).Tests (repo config:
vitest --config vite.config.test.js)lidMeshbounds/volume/triangle-count/rejection (5),printPartslid grouping/counts/skipped/multi-drawer (4),printEstimateslid volume == lid mesh volume (1),exportFileslidSTL + lid 3MF plate + README note/line (1),
BinOptionsswitch (1),PrintPlanCardlid row on/off (1).--max-warnings 0),tsc --noEmitclean, build green(index chunk 237,001 → 237,798 B, +0.3%; lazy export chunk
22,830 → 23,535 B, +3.1%).
Perf vs trunk (same box/day, local preview,
node scripts/measure.mjs --n=15 --lh=3, two pairs)Verdict: no credible regression. Pair 1's load gap did not reproduce in
the reversed-order pair; within-side swings exceed any branch-trunk gap.
Pair 2's trunk interaction outliers (186.5 / 795 ms) ran while the
reviewer's test run shared the box, and they favor the branch anyway.
The diff touches no measured code path.
Live verification (Lane B — run on the deploy preview)
Core tasks 1–3, plus the lids feature, exact steps:
bin gets a flat 3 mm cover lid that sits on the stacking lip. Lids
have no snap lip, hinge, or handle." Confirm OFF persists across
reload.
with lids OFF, then turn lids ON: the estimate must increase by
exactly the lid volume — footprint × 3 mm per lid (for a 4 × 3 bin:
167.5 × 125.5 × 3 = 63,064 mm³ → about +2 h 11 min, +78 g PLA,
+$1.56 at the default PLA/$20/kg/~8 mm³/s assumptions, for one bin
in one drawer). Confirm ON persists across reload.
otherwise unchanged, and Download files reports the lid STL in the
toast (e.g.
lid-4x3-x1.stl).Trunk expectations: everything above except step 4–6 (no lids switch,
no lid STL, no lid row); the estimate line must not change when the
switch is absent.
Review trail
blocker (missing scoreboard entry), fixed by a docs-only amend.
all four perf JSONs; feature-map line 12 corrected). One reviewer
wording nit (Lighthouse "wider" phrasing) fixed with a docs-only prose
amend after the verdict; no numbers changed.
updated ("separate flat cover lids; no scoops or magnets yet").
Parity 50.0% → 51.0%.
divider counts and positions; half-grid lid stem distinctness test
(behavior verified by construction, no dedicated test yet).