# Bricks

Bricks are reviewed code for the geometry a design can't safely describe: the cam lock that holds a part on the wall, joints between printed parts, labels. A design uses a brick by its id and major version, sets its settings, and builds around its parts.

- In `uses`, give each brick an instance name, its `brick` (like `cam-lock-mount@1`) and its `settings`. A setting can be a number or a formula, like `=settings.width`.
- Use a brick's parts as "instance.part" in `shapes` and `parts`.
- Attach your own shapes to a brick's anchors with `attach` ("instance.anchor"), so they follow the brick on every wall.
- A brick with states (unlocked and locked) is built in each one by the full check.
- A formula reads the design's settings, the wall (`wall.*`), the printer fit (`fit.*`) and each brick's readouts, as "instance.readout" (each brick below lists its readouts). A readout is how a shape follows the brick's own positions on every wall: the cam-lock mounts' key axis, for one (see R8 in [rules-and-fixes.md](rules-and-fixes.md)).
- A formula can't read a brick's settings. When a shape must match a brick setting you set by a formula (the mount's width, say), repeat that formula in the shape. Pick your own settings' ranges so the brick setting stays inside the brick's range at every corner, rather than clamping the formula with the brick's own min and max.

Only mount bricks touch the wall: `cam-lock-mount`, `hook-arm`, `cradle`, `shelf-bracket`, `multi-slot-lock`, `clip-label`, `label-clip`, `press-in-label`, `press-in-holder`, `calibration`, `cam-tuning` and `top-wedge`. `list_bricks` marks them `mount: true`. Any other part must stay in front of the slat face (R2).

## Joints: drop-in or slide

Two bricks join a printed piece to a cam-lock mount. Both cut a socket into a hub on the mount's spine and give the piece a tapered tail, and both take the mount's width, spine and lever length.

- `drop-dovetail` is for swappable heads: hooks, holders and bins. The mount stays locked on the wall as a permanent base. A head lowers straight down into the socket, which is open at the top, and sits on its stop floor by its own weight. It lifts off without touching the lock, so one mount takes any head built on the same joint, and you design heads only. Turn on its detent when a knock upward mustn't lift the head out. Build the head at its `head_back` anchor, with a back plate that covers the tail.
  Three rules for every head:
  1. Put the head's back flush on `head_back` (x = 0, no clearance). The head bears on the hub's face, and the tail's 0.3 mm into the head joins them.
  2. Keep head material out of the space above the hub's top and behind its face (x below 0). Material there fuses the detent's finger, so the head can't click in or lift out.
  3. Keep the head above the hub's bottom (`hubBot`). The key's handle stands proud below the hub, and a head reaching down there stops the mount unlocking.
- `dovetail-slide` is for wide pieces, like a rail or a cradle wider than the mount. The piece slides on sideways, along the slat, to a closed end. Build the piece at its `bar_back` anchor.

Each joint's tail is part of the piece, and its hub and socket are part of the mount: print them as two parts.

## Which walls each brick takes

A design claims a wall only when every brick it uses takes that wall. This is the one fit rule, read from each brick's own requirements:

| Brick             | `vevor` | `storewall` | `handiwall` | `trusscore` | `mdf` | `flowwall` | `gladiator` |
| ----------------- | ------- | ----------- | ----------- | ----------- | ----- | ---------- | ----------- |
| `calibration`     | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `cam-lock-mount`  | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `cam-tuning`      | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `clip-label`      | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `cradle`          | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `dovetail-slide`  | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `drop-dovetail`   | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `hook-arm`        | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `label-clip`      | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `lattice-infill`  | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `multi-slot-lock` | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `press-in-holder` | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `press-in-label`  | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `screw-hole`      | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `shelf-bracket`   | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |
| `text`            | fits    | fits        | fits        | fits        | fits  | fits       | fits        |
| `top-wedge`       | fits    | fits        | fits        | fits        | fits  | fits       | won't fit   |

- `calibration` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the calibration kit needs a slot opening from 8.5 to 11 mm.
- `cam-lock-mount` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the cam-lock mount needs a slot opening from 8.5 to 11 mm.
- `cam-tuning` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the cam-lock tuning plate needs a slot opening from 8.5 to 11 mm.
- `cradle` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the wide cradle needs a slot opening from 8.5 to 11 mm.
- `dovetail-slide` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the dovetail slide needs a slot opening from 8.5 to 11 mm.
- `drop-dovetail` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the drop-in dovetail needs a slot opening from 8.5 to 11 mm.
- `hook-arm` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the hook arm needs a slot opening from 8.5 to 11 mm.
- `multi-slot-lock` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the multi-slot lock needs a slot opening from 8.5 to 11 mm.
- `shelf-bracket` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the shelf bracket needs a slot opening from 8.5 to 11 mm.
- `top-wedge` on Gladiator GearWall: Won't fit this wall: its slot opening is 17 mm, and the top wedge needs a slot opening from 8.5 to 11 mm.

## Every brick

Bricks with an example design: `cam-lock-mount`, `dovetail-slide`, `drop-dovetail`, `label-clip`, `lattice-infill`, `multi-slot-lock`, `press-in-holder`, `screw-hole`, `text` and `top-wedge`. `get_brick` returns the example; start from it and change one thing at a time. `get_brick` also has each setting's help text and group.

### `calibration`: Calibration kit

`calibration@1`, tier core, a mount brick (it engages the wall). A slot gauge for your wall, the print-tested cam lock on its own, and a fit coupon with dovetails and print-in-place pins at Tight, Standard and Loose.

- Parts: `slot_gauge`, `lock_body`, `lock_key`, `coupon`, `coupon_pins` and `coupon_tongues`.
- Anchors: none.
- States: `unlocked` and `locked`.
- Readouts: `minWidth`, `YK`, `ZC`, `heightCurve`, `lockStopDeg` and `coupon`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting | Label           | Level  | Range                   | Default |
| ------- | --------------- | ------ | ----------------------- | ------- |
| `width` | Lock test width | simple | 14.4–50.8 mm (step 0.1) | 19.05   |

### `cam-lock-mount`: Cam-lock mount

`cam-lock-mount@1`, tier core, a mount brick (it engages the wall). The bin hook's mount: a top L that rolls into the slot, a spine, and a foot with a print-in-place quarter-turn key, lever, guide and internal stops. Optional latch tab and top wedge.

- Parts: `body`, `key` and `wedge`.
- Anchors: `arm_root`.
- States: `unlocked` and `locked`.
- Readouts: `minWidth`, `YK`, `ZC`, `key_z`, `slot_top`, `slot_floor`, `latch`, `latchAbove`, `keyTip`, `heightCurve`, `lockStopDeg`, `unlockStopDeg`, `topWedge`, `wedgeTravel` and `wedgeGrip`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting          | Label                  | Level    | Range                    | Default |
| ---------------- | ---------------------- | -------- | ------------------------ | ------- |
| `width`          | Hook width             | simple   | 14.4–101.6 mm (step 0.1) | 25.4    |
| `spine`          | Spine thickness        | advanced | 3–12 mm (step 0.1)       | 4.4     |
| `latch`          | Add latch tab          | simple   | on or off                | false   |
| `wall_vs_lip`    | Slat wall thickness    | advanced | -2.7–2.3 mm (step 0.01)  | -0.62   |
| `latch_len`      | Latch length           | advanced | 6–14 mm (step 0.1)       | 9.5     |
| `latch_t`        | Latch thickness        | advanced | 1.5–5 mm (step 0.1)      | 2.5     |
| `latch_gap`      | Gap behind the wall    | advanced | 0.2–1 mm (step 0.05)     | 0.4     |
| `latch_chamfer`  | Latch ramp             | advanced | 0–2 mm (step 0.1)        | 1       |
| `top_wedge`      | Add top wedge          | simple   | on or off                | false   |
| `wedge_reach`    | Wedge reach into slot  | advanced | 2–6 mm (step 0.1)        | 3.5     |
| `wedge_interf`   | Wedge tightness        | advanced | 0–0.6 mm (step 0.05)     | 0.2     |
| `wedge_travel`   | Slide travel           | advanced | 2.5–8 mm (step 0.1)      | 3.8     |
| `wedge_cap_r`    | Button corner rounding | advanced | 0.5–4.5 mm (step 0.1)    | 3       |
| `wedge_base_w`   | Base plate width       | advanced | 10–30 mm (step 0.1)      | 15      |
| `wedge_pocket_d` | Base plate depth       | advanced | 1–2.6 mm (step 0.1)      | 2       |
| `wedge_dovetail` | Slide rail grip        | advanced | 0.3–1.5 mm (step 0.1)    | 1       |
| `lever_len`      | Lever length           | advanced | 10–35 mm (step 0.5)      | 18      |
| `lever_w`        | Lever width            | advanced | 6–14 mm (step 0.1)       | 9.8     |
| `lever_t`        | Lever thickness        | advanced | 2–6 mm (step 0.1)        | 3.5     |
| `reach`          | Reach into the slot    | advanced | 5–14 mm (step 0.1)       | 9.5     |
| `L_thick`        | Top hook thickness     | advanced | 3–6 mm (step 0.1)        | 4.4     |
| `lip_h`          | Top hook lip height    | advanced | 10–20 mm (step 0.1)      | 14.32   |
| `foot_depth`     | Foot depth             | advanced | 7–14 mm (step 0.1)       | 9       |
| `foot_below`     | Foot below the slot    | advanced | 2–10 mm (step 0.1)       | 5.06    |
| `foot_above`     | Foot above the key     | advanced | 9–18 mm (step 0.1)       | 12.15   |

Clearances (R6): `latch_gap`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

Expert lock tuning, print-tested at its defaults (change one only when an engagement fix names it; see [core.md](core.md)): `unlock_vs_slot`, `lock_vs_slot`, `peak_vs_slot`, `peak_angle`, `flat_half`, `guide_vs_slot`, `guide_gap`, `side_skin`, `lug_r`, `lug_half`, `lug_len`, `lock_overtravel` and `unlock_overtravel`.

### `cam-tuning`: Cam-lock tuning plate

`cam-tuning@1`, tier core, a mount brick (it engages the wall). Five lock tests in a row, from Tight to beyond Loose, each with its bore gap and end gap printed on top. The one that turns best gives your printer fit's bore and end gaps.

- Parts: `piece_1_body`, `piece_1_key`, `piece_2_body`, `piece_2_key`, `piece_3_body`, `piece_3_key`, `piece_4_body`, `piece_4_key`, `piece_5_body` and `piece_5_key`.
- Anchors: none.
- States: `unlocked` and `locked`.
- Readouts: `pieces`, `pitch`, `YK`, `ZC`, `lockStopDeg` and `unlockStopDeg`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting | Label       | Level  | Range                   | Default |
| ------- | ----------- | ------ | ----------------------- | ------- |
| `width` | Piece width | simple | 14.4–50.8 mm (step 0.1) | 19.05   |

### `clip-label`: Clip label

`clip-label@1`, tier core, a mount brick (it engages the wall). A face-up label plate with inlaid or raised letters, held by two clips that slide into hooked dovetail sockets, with optional wedges.

- Parts: `label`, `text`, `clip_left`, `clip_right`, `wedge_left` and `wedge_right`.
- Anchors: none.
- States: none.
- Readouts: `textScale`, `textH`, `lines`, `textWidth`, `y_top`, `y_pn`, `y_bot`, `zb`, `pitch`, `bandFull`, `bottomNote`, `wedges` and `wedgeSqueeze`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 6–20 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting          | Label                       | Level    | Range                     | Default      |
| ---------------- | --------------------------- | -------- | ------------------------- | ------------ |
| `text`           | Text                        | simple   | text, up to 81 characters | GARDEN TOOLS |
| `font`           | Font                        | simple   | a font                    | oswald-600   |
| `text_h`         | Letter height               | simple   | 4–40 mm (step 0.5)        | 14           |
| `auto_fit`       | Fit text                    | advanced | on or off                 | true         |
| `align`          | Alignment                   | advanced | left, center, right       | center       |
| `text_mode`      | Lettering                   | advanced | inlay, emboss             | inlay        |
| `text_depth`     | Inlay depth / raised height | advanced | 0.2–2 mm (step 0.1)       | 0.6          |
| `line_gap`       | Line spacing                | advanced | 1.1–2.5 (step 0.05)       | 1.45         |
| `letter_spacing` | Letter spacing              | advanced | 0.8–1.6 (step 0.01)       | 1            |
| `text_margin`    | Margin                      | advanced | 2–20 mm (step 0.5)        | 6            |
| `width`          | Width                       | simple   | 40–300 mm (step 1)        | 120          |
| `height`         | Height                      | simple   | 20–300 mm (step 0.1)      | 32.9         |
| `plate_t`        | Plate thickness             | advanced | 1.6–4 mm (step 0.1)       | 2            |
| `band_t`         | Top band thickness          | advanced | 3.5–14 mm (step 0.1)      | 9            |
| `band_h`         | Top band height             | advanced | 3–15 mm (step 0.5)        | 6            |
| `band_full`      | Band across the full width  | advanced | on or off                 | false        |
| `band_past`      | Pad runs past the clip      | advanced | 1–20 mm (step 0.5)        | 1.5          |
| `corner_r`       | Bottom corner radius        | advanced | 0–10 mm (step 0.5)        | 2            |
| `clip_w`         | Clip width                  | advanced | 6–25 mm (step 0.5)        | 10           |
| `sock_mouth`     | Socket opening              | advanced | 3–7 mm (step 0.1)         | 4.5          |
| `sock_neck`      | Neck depth                  | advanced | 0.8–3 mm (step 0.1)       | 1.5          |
| `sock_foot`      | Foot reach                  | advanced | 1–4 mm (step 0.1)         | 2.5          |
| `sock_foot_h`    | Foot height                 | advanced | 1.5–4 mm (step 0.1)       | 2.5          |
| `sock_back`      | Wall behind the foot        | advanced | 0.6–2 mm (step 0.1)       | 1            |
| `arm_t`          | Arm thickness               | advanced | 1.2–6 mm (step 0.1)       | 4.5          |
| `lip_t`          | Lip thickness               | advanced | 1.2–6 mm (step 0.1)       | 4.5          |
| `lip_rise`       | Lip rise behind the slat    | advanced | 2–8 mm (step 0.1)         | 4            |
| `back_r`         | Back corner radius          | advanced | 0–3 mm (step 0.1)         | 2            |
| `wedges`         | Add wedges                  | simple   | on or off                 | true         |
| `wedge_squeeze`  | Squeeze                     | advanced | 0–0.6 mm (step 0.05)      | 0.2          |
| `wedge_lead`     | Lead-in                     | advanced | 0–1.5 mm (step 0.05)      | 0.6          |
| `wedge_recess`   | Set back in the slot        | advanced | 0–3 mm (step 0.1)         | 0.5          |
| `wedge_d`        | Wedge depth                 | advanced | 3–7 mm (step 0.1)         | 6.3          |
| `groove_d`       | Groove depth                | advanced | 0.6–2.5 mm (step 0.1)     | 1.6          |
| `groove_mouth`   | Groove opening              | advanced | 1.6–3.5 mm (step 0.1)     | 2.4          |
| `skin_gap`       | Gap behind the skin         | advanced | 0.2–1.5 mm (step 0.05)    | 0.5          |

Clearances (R6): `skin_gap`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

### `cradle`: Wide cradle

`cradle@1`, tier core, a mount brick (it engages the wall). A wide two-arm cradle that slides sideways onto the cam-lock mount on a tapered dovetail and prints flat.

- Parts: `body`, `key`, `wedge` and `cradle`.
- Anchors: `arm_root`.
- States: `unlocked` and `locked`.
- Readouts: `minWidth`, `YK`, `ZC`, `key_z`, `slot_top`, `slot_floor`, `latch`, `latchAbove`, `keyTip`, `heightCurve`, `lockStopDeg`, `unlockStopDeg`, `topWedge`, `wedgeTravel`, `wedgeGrip`, `capacityKg`, `perArmKg`, `tipX`, `hubTop`, `hubBot`, `dtEntry`, `dtTaperMm`, `dtLen` and `ratedSections`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting          | Label                  | Level    | Range                    | Default  |
| ---------------- | ---------------------- | -------- | ------------------------ | -------- |
| `span`           | Span                   | simple   | 60–250 mm (step 1)       | 200      |
| `c_reach`        | Reach                  | simple   | 30–180 mm (step 1)       | 80       |
| `cradle_drop`    | Top below the seat     | advanced | 0–40 mm (step 0.5)       | 6        |
| `c_t`            | Thickness              | advanced | 5–20 mm (step 0.5)       | 10       |
| `c_arm_w`        | Arm width              | simple   | 8–40 mm (step 0.5)       | 14       |
| `c_bar_d`        | Bar depth              | advanced | 8–40 mm (step 0.5)       | 16       |
| `c_tip_h`        | Tip height             | simple   | 0–40 mm (step 0.5)       | 16       |
| `c_tip_t`        | Tip thickness          | advanced | 3–15 mm (step 0.5)       | 7        |
| `c_round`        | Arm corner rounding    | advanced | 0–8 mm (step 0.5)        | 3        |
| `dt_entry`       | Slides in from         | advanced | far_side, key_side       | far_side |
| `dt_depth`       | Dovetail depth         | advanced | 4–14 mm (step 0.1)       | 8        |
| `dt_neck`        | Neck height            | advanced | 3–16 mm (step 0.1)       | 7        |
| `dt_angle`       | Flank angle            | advanced | 8–35 ° (step 1)          | 20       |
| `dt_taper`       | Taper                  | advanced | 0–4 ° (step 0.1)         | 1.5      |
| `dt_stop`        | Stop wall              | advanced | 1.2–6 mm (step 0.1)      | 2.5      |
| `width`          | Mount width            | simple   | 14.4–101.6 mm (step 0.1) | 25.4     |
| `spine`          | Spine thickness        | advanced | 3–12 mm (step 0.1)       | 4.4      |
| `latch`          | Add latch tab          | advanced | on or off                | false    |
| `wall_vs_lip`    | Slat wall thickness    | advanced | -2.7–2.3 mm (step 0.01)  | -0.62    |
| `latch_len`      | Latch length           | advanced | 6–14 mm (step 0.1)       | 9.5      |
| `latch_t`        | Latch thickness        | advanced | 1.5–5 mm (step 0.1)      | 2.5      |
| `latch_gap`      | Gap behind the wall    | advanced | 0.2–1 mm (step 0.05)     | 0.4      |
| `latch_chamfer`  | Latch ramp             | advanced | 0–2 mm (step 0.1)        | 1        |
| `top_wedge`      | Add top wedge          | advanced | on or off                | false    |
| `wedge_reach`    | Wedge reach into slot  | advanced | 2–6 mm (step 0.1)        | 3.5      |
| `wedge_interf`   | Wedge tightness        | advanced | 0–0.6 mm (step 0.05)     | 0.2      |
| `wedge_travel`   | Slide travel           | advanced | 2.5–8 mm (step 0.1)      | 3.8      |
| `wedge_cap_r`    | Button corner rounding | advanced | 0.5–4.5 mm (step 0.1)    | 3        |
| `wedge_base_w`   | Base plate width       | advanced | 10–30 mm (step 0.1)      | 15       |
| `wedge_pocket_d` | Base plate depth       | advanced | 1–2.6 mm (step 0.1)      | 2        |
| `wedge_dovetail` | Slide rail grip        | advanced | 0.3–1.5 mm (step 0.1)    | 1        |
| `lever_len`      | Lever length           | advanced | 10–35 mm (step 0.5)      | 18       |
| `lever_w`        | Lever width            | advanced | 6–14 mm (step 0.1)       | 9.8      |
| `lever_t`        | Lever thickness        | advanced | 2–6 mm (step 0.1)        | 3.5      |
| `reach`          | Reach into the slot    | advanced | 5–14 mm (step 0.1)       | 9.5      |
| `L_thick`        | Top hook thickness     | advanced | 3–6 mm (step 0.1)        | 4.4      |
| `lip_h`          | Top hook lip height    | advanced | 10–20 mm (step 0.1)      | 14.32    |
| `foot_depth`     | Foot depth             | advanced | 7–14 mm (step 0.1)       | 9        |
| `foot_below`     | Foot below the slot    | advanced | 2–10 mm (step 0.1)       | 5.06     |
| `foot_above`     | Foot above the key     | advanced | 9–18 mm (step 0.1)       | 12.15    |

Clearances (R6): `latch_gap`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

Expert lock tuning, print-tested at its defaults (change one only when an engagement fix names it; see [core.md](core.md)): `unlock_vs_slot`, `lock_vs_slot`, `peak_vs_slot`, `peak_angle`, `flat_half`, `guide_vs_slot`, `guide_gap`, `side_skin`, `lug_r`, `lug_half`, `lug_len`, `lock_overtravel` and `unlock_overtravel`.

### `dovetail-slide`: Dovetail slide

`dovetail-slide@1`, tier core. A sliding half-dovetail that joins a wide piece to a cam-lock mount. Union `hub` with the mount body and subtract `socket`; union `tail` with the piece that slides on. The bar of that piece starts at the `bar_back` anchor. The tail tapers so gravity seats it against a closed end. Set width, spine and lever length to the mount's.

- Parts: `tail`, `socket` and `hub`.
- Anchors: `bar_back`.
- States: none.
- Readouts: `taperMm`, `length`, `hubTop` and `hubBot`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting       | Label              | Level    | Range                    | Default  |
| ------------- | ------------------ | -------- | ------------------------ | -------- |
| `width`       | Mount width        | simple   | 14.4–101.6 mm (step 0.1) | 25.4     |
| `spine`       | Spine thickness    | advanced | 3–12 mm (step 0.1)       | 4.4      |
| `c_t`         | Bar thickness      | advanced | 5–20 mm (step 0.5)       | 10       |
| `cradle_drop` | Top below the seat | advanced | 0–40 mm (step 0.5)       | 6        |
| `dt_entry`    | Slides in from     | advanced | far_side, key_side       | far_side |
| `dt_depth`    | Dovetail depth     | advanced | 4–14 mm (step 0.1)       | 8        |
| `dt_neck`     | Neck height        | advanced | 3–16 mm (step 0.1)       | 7        |
| `dt_angle`    | Flank angle        | advanced | 8–35 ° (step 1)          | 20       |
| `dt_taper`    | Taper              | advanced | 0–4 ° (step 0.1)         | 1.5      |
| `dt_stop`     | Stop wall          | advanced | 1.2–6 mm (step 0.1)      | 2.5      |
| `lever_len`   | Lever length       | advanced | 10–35 mm (step 0.5)      | 18       |

### `drop-dovetail`: Drop-in dovetail

`drop-dovetail@1`, tier core. A vertical drop-in dovetail that joins a swappable head to a cam-lock mount: the mount stays on the wall and heads lower straight down onto it. Union `hub` with the mount body and subtract `socket` (it opens upward and has a stop floor); union `tail` with the head, whose back starts at the `head_back` anchor (the top of the tail). The tail tapers so gravity seats it; an optional detent stops a knock lifting it out. Set width, spine and lever length to the mount's.

- Parts: `tail`, `socket` and `hub`.
- Anchors: `head_back`.
- States: none.
- Readouts: `dropHeight`, `taperMm`, `hubTop`, `hubBot` and `ratedSections`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting       | Label              | Level    | Range                    | Default |
| ------------- | ------------------ | -------- | ------------------------ | ------- |
| `width`       | Mount width        | simple   | 22.8–101.6 mm (step 0.1) | 25.4    |
| `spine`       | Spine thickness    | advanced | 3–12 mm (step 0.1)       | 4.4     |
| `drop_len`    | Drop length        | simple   | 10–45 mm (step 0.5)      | 30      |
| `top_drop`    | Top below the seat | advanced | 0.5–30 mm (step 0.5)     | 2       |
| `dt_depth`    | Dovetail depth     | advanced | 3–10 mm (step 0.1)       | 5       |
| `dt_neck`     | Neck width         | advanced | 4–16 mm (step 0.1)       | 8       |
| `dt_angle`    | Flank angle        | advanced | 30–60 ° (step 1)         | 45      |
| `dt_taper`    | Taper              | advanced | 0–4 ° (step 0.1)         | 1.5     |
| `dt_stop`     | Stop floor         | advanced | 1.2–6 mm (step 0.1)      | 3       |
| `detent`      | Detent             | simple   | none, bump               | none    |
| `detent_grip` | Detent grip        | advanced | 0.1–0.5 mm (step 0.05)   | 0.3     |
| `lever_len`   | Lever length       | advanced | 10–35 mm (step 0.5)      | 18      |

### `hook-arm`: Hook arm

`hook-arm@1`, tier core, a mount brick (it engages the wall). A J-hook, peg or deep-J arm in one piece with the cam-lock mount, printed on its side.

- Parts: `body`, `key` and `wedge`.
- Anchors: `arm_root` and `arm_top`.
- States: `unlocked` and `locked`.
- Readouts: `minWidth`, `YK`, `ZC`, `key_z`, `slot_top`, `slot_floor`, `latch`, `latchAbove`, `keyTip`, `heightCurve`, `lockStopDeg`, `unlockStopDeg`, `topWedge`, `wedgeTravel`, `wedgeGrip`, `capacityKg`, `tipX`, `lowY`, `loadX` and `ratedSections`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting          | Label                  | Level    | Range                    | Default |
| ---------------- | ---------------------- | -------- | ------------------------ | ------- |
| `arm_len`        | Arm length             | simple   | 10–150 mm (step 0.5)     | 45      |
| `arm_drop`       | Arm below the seat     | advanced | 0–45 mm (step 0.5)       | 16      |
| `arm_tilt`       | Arm tilt               | simple   | -5–30 ° (step 1)         | 5       |
| `arm_t`          | Arm thickness          | advanced | 4–16 mm (step 0.1)       | 8       |
| `tip_turn`       | Tip turn               | simple   | 0–120 ° (step 1)         | 90      |
| `tip_len`        | Tip length             | simple   | 0–60 mm (step 0.5)       | 14      |
| `bend_r`         | Inside bend radius     | simple   | 2–30 mm (step 0.5)       | 8       |
| `brace`          | Brace under the arm    | advanced | 0–40 mm (step 0.5)       | 18      |
| `width`          | Mount width            | simple   | 14.4–101.6 mm (step 0.1) | 25.4    |
| `spine`          | Spine thickness        | advanced | 3–12 mm (step 0.1)       | 4.4     |
| `latch`          | Add latch tab          | advanced | on or off                | false   |
| `wall_vs_lip`    | Slat wall thickness    | advanced | -2.7–2.3 mm (step 0.01)  | -0.62   |
| `latch_len`      | Latch length           | advanced | 6–14 mm (step 0.1)       | 9.5     |
| `latch_t`        | Latch thickness        | advanced | 1.5–5 mm (step 0.1)      | 2.5     |
| `latch_gap`      | Gap behind the wall    | advanced | 0.2–1 mm (step 0.05)     | 0.4     |
| `latch_chamfer`  | Latch ramp             | advanced | 0–2 mm (step 0.1)        | 1       |
| `top_wedge`      | Add top wedge          | advanced | on or off                | false   |
| `wedge_reach`    | Wedge reach into slot  | advanced | 2–6 mm (step 0.1)        | 3.5     |
| `wedge_interf`   | Wedge tightness        | advanced | 0–0.6 mm (step 0.05)     | 0.2     |
| `wedge_travel`   | Slide travel           | advanced | 2.5–8 mm (step 0.1)      | 3.8     |
| `wedge_cap_r`    | Button corner rounding | advanced | 0.5–4.5 mm (step 0.1)    | 3       |
| `wedge_base_w`   | Base plate width       | advanced | 10–30 mm (step 0.1)      | 15      |
| `wedge_pocket_d` | Base plate depth       | advanced | 1–2.6 mm (step 0.1)      | 2       |
| `wedge_dovetail` | Slide rail grip        | advanced | 0.3–1.5 mm (step 0.1)    | 1       |
| `lever_len`      | Lever length           | advanced | 10–35 mm (step 0.5)      | 18      |
| `lever_w`        | Lever width            | advanced | 6–14 mm (step 0.1)       | 9.8     |
| `lever_t`        | Lever thickness        | advanced | 2–6 mm (step 0.1)        | 3.5     |
| `reach`          | Reach into the slot    | advanced | 5–14 mm (step 0.1)       | 9.5     |
| `L_thick`        | Top hook thickness     | advanced | 3–6 mm (step 0.1)        | 4.4     |
| `lip_h`          | Top hook lip height    | advanced | 10–20 mm (step 0.1)      | 14.32   |
| `foot_depth`     | Foot depth             | advanced | 7–14 mm (step 0.1)       | 9       |
| `foot_below`     | Foot below the slot    | advanced | 2–10 mm (step 0.1)       | 5.06    |
| `foot_above`     | Foot above the key     | advanced | 9–18 mm (step 0.1)       | 12.15   |

Clearances (R6): `latch_gap`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

Expert lock tuning, print-tested at its defaults (change one only when an engagement fix names it; see [core.md](core.md)): `unlock_vs_slot`, `lock_vs_slot`, `peak_vs_slot`, `peak_angle`, `flat_half`, `guide_vs_slot`, `guide_gap`, `side_skin`, `lug_r`, `lug_half`, `lug_len`, `lock_overtravel` and `unlock_overtravel`.

### `label-clip`: Label clips

`label-clip@1`, tier core, a mount brick (it engages the wall). Slide-on clips that hang a face-up label from the slot above it, joined by a hooked dovetail in pads on the label's top edge, with optional wedges that lock the clips in the slot. Label coordinates: x along the label (0 to width), y up (0 = the slot floor, the label hangs below), z out of the wall (the plate's back at z = 0). Union `pads` with your plate, subtract `socket_cut`. It draws no plate: give it your plate's `height` and `plate_t`, which it only checks the pads and sockets against.

- Parts: `pads`, `socket_cut`, `clip_left`, `clip_right`, `wedge_left` and `wedge_right`.
- Anchors: `plate_top_left`.
- States: none.
- Readouts: `wedgeSqueeze`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 6–20 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting         | Label                        | Level    | Range                 | Default |
| --------------- | ---------------------------- | -------- | --------------------- | ------- |
| `width`         | Label width                  | simple   | 40–300 mm (step 1)    | 120     |
| `height`        | Label height                 | simple   | 20–300 mm (step 0.1)  | 32.9    |
| `plate_t`       | Plate thickness              | advanced | 1.6–4 mm (step 0.1)   | 2       |
| `band_t`        | Pad thickness                | advanced | 3.5–14 mm (step 0.1)  | 9       |
| `band_h`        | Pad height                   | advanced | 3–15 mm (step 0.5)    | 6       |
| `band_full`     | Pad along the whole top edge | advanced | on or off             | false   |
| `band_past`     | Pad past the clip            | advanced | 1–20 mm (step 0.5)    | 1.5     |
| `clip_w`        | Clip width                   | advanced | 6–25 mm (step 0.5)    | 10      |
| `sock_mouth`    | Socket opening               | advanced | 3–7 mm (step 0.1)     | 4.5     |
| `sock_neck`     | Socket neck                  | advanced | 0.8–3 mm (step 0.1)   | 1.5     |
| `sock_foot`     | Socket foot                  | advanced | 1–4 mm (step 0.1)     | 2.5     |
| `sock_foot_h`   | Socket foot height           | advanced | 1.5–4 mm (step 0.1)   | 2.5     |
| `sock_back`     | Wall behind the socket       | advanced | 0.6–2 mm (step 0.1)   | 1       |
| `arm_t`         | Clip arm                     | advanced | 1.2–6 mm (step 0.1)   | 4.5     |
| `lip_t`         | Clip lip                     | advanced | 1.2–6 mm (step 0.1)   | 4.5     |
| `lip_rise`      | Lip rise                     | advanced | 2–8 mm (step 0.1)     | 4       |
| `back_r`        | Back corner radius           | advanced | 0–3 mm (step 0.1)     | 2       |
| `wedges`        | Wedges                       | simple   | on or off             | true    |
| `wedge_recess`  | Wedge recess                 | advanced | 0–3 mm (step 0.1)     | 0.5     |
| `wedge_squeeze` | Wedge squeeze                | advanced | 0–0.6 mm (step 0.05)  | 0.2     |
| `wedge_lead`    | Wedge lead-in                | advanced | 0–1.5 mm (step 0.05)  | 0.6     |
| `groove_mouth`  | Wedge groove opening         | advanced | 1.6–3.5 mm (step 0.1) | 2.4     |

### `lattice-infill`: Lattice infill

`lattice-infill@1`, tier helper. A flat web with an infill pattern, the shelf bracket's infill as a brick. Give it a rectangle (a = lower-left, b = upper-right) or a triangle (a, b, c) in the x-y plane; it extrudes `thickness` along +z from z = 0. Union `web` into a part, or subtract `holes` from your own solid. Triangles keep the most strength for the plastic used.

- Parts: `web` and `holes`.
- Anchors: `origin`.
- States: none.
- Readouts: `patternNote` and `fill`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot wall (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting     | Label           | Level    | Range                                | Default  |
| ----------- | --------------- | -------- | ------------------------------------ | -------- |
| `region`    | Region          | advanced | rect, triangle                       | triangle |
| `ax`        | Point a, x      | advanced | -500–500 mm (step 0.1)               | 0        |
| `ay`        | Point a, y      | advanced | -500–500 mm (step 0.1)               | 0        |
| `bx`        | Point b, x      | advanced | -500–500 mm (step 0.1)               | 120      |
| `by`        | Point b, y      | advanced | -500–500 mm (step 0.1)               | 0        |
| `cx`        | Point c, x      | advanced | -500–500 mm (step 0.1)               | 0        |
| `cy`        | Point c, y      | advanced | -500–500 mm (step 0.1)               | -90      |
| `thickness` | Thickness       | simple   | 2–100 mm (step 0.1)                  | 12       |
| `pattern`   | Pattern         | simple   | truss, hex, grid, holes, open, solid | truss    |
| `cell`      | Cell size       | advanced | 8–80 mm (step 0.1)                   | 30       |
| `rib`       | Rib width       | advanced | 1.2–10 mm (step 0.1)                 | 3        |
| `fillet`    | Corner rounding | advanced | 0–8 mm (step 0.1)                    | 2        |

### `multi-slot-lock`: Multi-slot lock

`multi-slot-lock@1`, tier core, a mount brick (it engages the wall). A lock column that hangs from the top slat and reaches 1 to 3 slats down: the cam-lock mount's top L and spine, with its foot, cam key and lever in the bottom slot and, optionally, in every slot in between. Union `column` with your piece and print each key in place with it. The column runs from z = 0 to the `width` readout (it widens itself when a slot's key needs more room for its lever); each lever turns in front of its foot and inside the column, so keep other geometry beside the column or behind the feet (x below the `column_front` anchor). It is the shelf bracket's lock column, which has never been printed.

- Parts: `column`, `key_1`, `key_2` and `key_3`.
- Anchors: `top` and `column_front`.
- States: `unlocked` and `locked`.
- Readouts: `width`, `slots` and `keyHeights`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting     | Label                  | Level    | Range                  | Default |
| ----------- | ---------------------- | -------- | ---------------------- | ------- |
| `width`     | Lock column width      | simple   | 20–101.6 mm (step 0.1) | 25.4    |
| `slots`     | Spans                  | simple   | 1, 2, 3                | 2       |
| `mid_locks` | Cam lock in every slot | advanced | on or off              | true    |

### `press-in-holder`: Press-in label holders

`press-in-holder@1`, tier core, a mount brick (it engages the wall). Two end holders that press straight into a slot and hold a plain plate by its ends, with friction prongs or snap barbs, so the plate needs nothing on its back. Label coordinates: x along the plate (0 to width), y up (0 = the slot opening's bottom edge), z out of the wall. It draws no plate: build one with the same width, height and thickness and attach it to the `plate` anchor (its back, bottom-left corner). The holders are software-tested, awaiting a print.

- Parts: `holder_left` and `holder_right`.
- Anchors: `plate`.
- States: none.
- Readouts: `grip`, `strain`, `clearAbove` and `clearBelow`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 6–20 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting     | Label                    | Level    | Range                  | Default  |
| ----------- | ------------------------ | -------- | ---------------------- | -------- |
| `width`     | Label width              | simple   | 40–300 mm (step 1)     | 120      |
| `height`    | Label height             | simple   | 15–200 mm (step 0.1)   | 32.9     |
| `offset`    | Up or down from the slot | advanced | -30–30 mm (step 0.5)   | 0        |
| `plate_t`   | Plate thickness          | advanced | 1.2–4 mm (step 0.1)    | 2        |
| `grip`      | Grip in the slot         | simple   | friction, snap         | friction |
| `squeeze`   | Tongue squeeze           | advanced | 0–0.8 mm (step 0.05)   | 0.3      |
| `barb_h`    | Barb height              | advanced | 0.2–1 mm (step 0.05)   | 0.4      |
| `tongue_d`  | Tongue depth             | advanced | 3–8 mm (step 0.1)      | 6        |
| `prong_t`   | Prong thickness          | advanced | 1.4–4 mm (step 0.1)    | 2.2      |
| `plate_fit` | Tray clearance           | advanced | 0.1–0.6 mm (step 0.05) | 0.15     |
| `pinch`     | Rib height               | advanced | 0–0.9 mm (step 0.05)   | 0.35     |
| `hold_w`    | Holder width             | advanced | 8–25 mm (step 0.5)     | 12       |
| `lip_over`  | Lip overlap              | advanced | 2–10 mm (step 0.5)     | 4        |
| `lip_t`     | Lip thickness            | advanced | 1–3 mm (step 0.1)      | 1.6      |
| `back_t`    | Back thickness           | advanced | 1.6–4 mm (step 0.1)    | 2        |
| `floor_t`   | Tray floor               | advanced | 1.2–4 mm (step 0.1)    | 2        |
| `end_t`     | End stop                 | advanced | 1.2–4 mm (step 0.1)    | 2        |
| `end_fit`   | End clearance            | advanced | 0.1–1 mm (step 0.05)   | 0.3      |

Clearances (R6): `plate_fit` and `end_fit`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

### `press-in-label`: Press-in label

`press-in-label@1`, tier core, a mount brick (it engages the wall). A plain label plate held at each end by a holder that presses straight into the slot, with friction prongs or snap barbs. The friction values (tongue squeeze, rib height) are calculated, not print-tested.

- Parts: `plate`, `text`, `holder_left` and `holder_right`.
- Anchors: none.
- States: none.
- Readouts: `textScale`, `textH`, `lines`, `yb`, `yt`, `yc`, `ys`, `plateZ`, `front`, `pitch`, `tongueD`, `tongueH`, `squeeze`, `snap`, `grip`, `cover`, `span`, `above`, `below`, `clearAbove`, `clearBelow` and `strain`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 6–20 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting          | Label                       | Level    | Range                     | Default      |
| ---------------- | --------------------------- | -------- | ------------------------- | ------------ |
| `text`           | Text                        | simple   | text, up to 81 characters | GARDEN TOOLS |
| `font`           | Font                        | simple   | a font                    | oswald-600   |
| `text_h`         | Letter height               | simple   | 4–40 mm (step 0.5)        | 14           |
| `auto_fit`       | Fit text                    | advanced | on or off                 | true         |
| `align`          | Alignment                   | advanced | left, center, right       | center       |
| `text_mode`      | Lettering                   | simple   | inlay, emboss             | inlay        |
| `text_depth`     | Inlay depth / raised height | advanced | 0.2–2 mm (step 0.1)       | 0.6          |
| `line_gap`       | Line spacing                | advanced | 1.1–2.5 (step 0.05)       | 1.45         |
| `letter_spacing` | Letter spacing              | advanced | 0.8–1.6 (step 0.01)       | 1            |
| `text_margin`    | Margin                      | advanced | 1–20 mm (step 0.5)        | 3            |
| `width`          | Length                      | simple   | 40–300 mm (step 1)        | 120          |
| `height`         | Height                      | advanced | 15–200 mm (step 0.1)      | 32.9         |
| `offset`         | Up or down from the slot    | advanced | -30–30 mm (step 0.5)      | 0            |
| `plate_t`        | Plate thickness             | advanced | 1.2–4 mm (step 0.1)       | 2            |
| `corner_r`       | Corner radius               | advanced | 0–8 mm (step 0.5)         | 1            |
| `grip`           | Grip in the slot            | simple   | friction, snap            | friction     |
| `squeeze`        | Tongue squeeze              | advanced | 0–0.8 mm (step 0.05)      | 0.3          |
| `barb_h`         | Barb height                 | advanced | 0.2–1 mm (step 0.05)      | 0.4          |
| `tongue_d`       | Tongue depth                | advanced | 3–8 mm (step 0.1)         | 6            |
| `prong_t`        | Prong thickness             | advanced | 1.4–4 mm (step 0.1)       | 2.2          |
| `plate_fit`      | Tray clearance              | advanced | 0.1–0.6 mm (step 0.05)    | 0.15         |
| `pinch`          | Rib height                  | advanced | 0–0.9 mm (step 0.05)      | 0.35         |
| `hold_w`         | Holder width                | advanced | 8–25 mm (step 0.5)        | 12           |
| `lip_over`       | Lip overlap                 | advanced | 2–10 mm (step 0.5)        | 4            |
| `lip_t`          | Lip thickness               | advanced | 1–3 mm (step 0.1)         | 1.6          |
| `back_t`         | Back thickness              | advanced | 1.6–4 mm (step 0.1)       | 2            |
| `floor_t`        | Tray floor                  | advanced | 1.2–4 mm (step 0.1)       | 2            |
| `end_t`          | End stop                    | advanced | 1.2–4 mm (step 0.1)       | 2            |
| `end_fit`        | End clearance               | advanced | 0.1–1 mm (step 0.05)      | 0.3          |

Clearances (R6): `plate_fit` and `end_fit`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

### `screw-hole`: Screw hole

`screw-hole@1`, tier helper. A cutter for a screw hole with a counterbore, shaped as a teardrop so it prints on its side. The hole runs along +y from y = 0 (the head side) through `length`; the teardrop points +z, which should be up as printed. Subtract `cut` from your solid after placing it with move/rotate in a shape.

- Parts: `cut`.
- Anchors: `head` and `tip`.
- States: none.
- Readouts: `remaining`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot wall (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting   | Label               | Level    | Range                | Default |
| --------- | ------------------- | -------- | -------------------- | ------- |
| `screw_d` | Screw hole diameter | simple   | 2–8 mm (step 0.1)    | 4.5     |
| `cbore_d` | Head diameter       | advanced | 4–16 mm (step 0.1)   | 9       |
| `cbore_h` | Head recess depth   | advanced | 0.5–10 mm (step 0.1) | 3       |
| `length`  | Material thickness  | simple   | 1–100 mm (step 0.1)  | 12      |

### `shelf-bracket`: Shelf bracket

`shelf-bracket@1`, tier core, a mount brick (it engages the wall). A shelf bracket spanning 1 to 3 slats, with a cam lock in every slot it crosses, infill patterns, three ways to hold the shelf and a mirrored option.

- Parts: `body`, `key_1`, `key_2`, `key_3`, `partner_body`, `partner_key_1`, `partner_key_2` and `partner_key_3`.
- Anchors: none.
- States: `unlocked` and `locked`.
- Readouts: `capacityKg`, `limiter`, `thickness`, `YKs`, `ZC`, `lockSign`, `slots`, `midKeys`, `screwX`, `height`, `patternNote`, `hand`, `lockStopDeg` and `ratedSections`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: none.

| Setting         | Label                    | Level    | Range                                | Default |
| --------------- | ------------------------ | -------- | ------------------------------------ | ------- |
| `slots`         | Spans                    | simple   | 1, 2, 3                              | 2       |
| `hand`          | Lock column side         | simple   | left, right, pair                    | left    |
| `mid_locks`     | Cam lock in every slot   | advanced | on or off                            | true    |
| `depth`         | Shelf depth              | simple   | 80–300 mm (step 1)                   | 200     |
| `width`         | Lock column width        | advanced | 20–50 mm (step 0.1)                  | 25.4    |
| `plate_t`       | Bracket plate thickness  | advanced | 4–40 mm (step 0.5)                   | 12      |
| `arm_h`         | Arm depth at the wall    | advanced | 6–30 mm (step 0.5)                   | 12      |
| `arm_tip_h`     | Arm depth at the front   | advanced | 4–30 mm (step 0.5)                   | 8       |
| `brace_at`      | Brace meets the arm at   | advanced | 40–95 % (step 1)                     | 75      |
| `brace_t`       | Brace thickness          | advanced | 4–20 mm (step 0.5)                   | 10      |
| `pattern`       | Pattern                  | simple   | truss, solid, hex, grid, holes, open | truss   |
| `cell`          | Cell size                | advanced | 10–50 mm (step 0.5)                  | 30      |
| `rib`           | Rib thickness            | advanced | 1.6–8 mm (step 0.1)                  | 3       |
| `fillet`        | Corner fillets           | advanced | 0–6 mm (step 0.5)                    | 2       |
| `front`         | Front of the arm         | simple   | lip, jaw, flat                       | lip     |
| `front_lip_h`   | Lip height               | advanced | 2–30 mm (step 0.5)                   | 8       |
| `front_lip_t`   | Lip thickness            | advanced | 3–12 mm (step 0.5)                   | 5       |
| `board_t`       | Shelf board thickness    | advanced | 6–40 mm (step 0.05)                  | 19.05   |
| `board_fit`     | Board clearance          | advanced | 0.1–2 mm (step 0.1)                  | 0.4     |
| `jaw_len`       | Jaw reach over the board | advanced | 5–40 mm (step 0.5)                   | 14      |
| `jaw_t`         | Jaw thickness            | advanced | 2–10 mm (step 0.5)                   | 4       |
| `screws`        | Screw holes              | simple   | 0–4                                  | 2       |
| `screw_d`       | Screw hole               | advanced | 2.5–6 mm (step 0.1)                  | 4.5     |
| `cbore_d`       | Head recess diameter     | advanced | 5–14 mm (step 0.5)                   | 9       |
| `cbore_h`       | Head recess depth        | advanced | 0–8 mm (step 0.5)                    | 3       |
| `latch`         | Add latch tabs           | advanced | on or off                            | false   |
| `wall_vs_lip`   | Slat wall thickness      | advanced | -2.7–2.3 mm (step 0.01)              | -0.62   |
| `latch_len`     | Latch length             | advanced | 6–14 mm (step 0.1)                   | 9.5     |
| `latch_t`       | Latch thickness          | advanced | 1.5–5 mm (step 0.1)                  | 2.5     |
| `latch_gap`     | Gap behind the wall      | advanced | 0.2–1 mm (step 0.05)                 | 0.4     |
| `latch_chamfer` | Latch ramp               | advanced | 0–2 mm (step 0.1)                    | 1       |
| `lever_len`     | Lever length             | advanced | 10–35 mm (step 0.5)                  | 18      |
| `lever_w`       | Lever width              | advanced | 6–14 mm (step 0.1)                   | 9.8     |
| `lever_t`       | Lever thickness          | advanced | 2–6 mm (step 0.1)                    | 3.5     |
| `reach`         | Reach into the slot      | advanced | 5–14 mm (step 0.1)                   | 9.5     |
| `L_thick`       | Top hook thickness       | advanced | 3–6 mm (step 0.1)                    | 4.4     |
| `lip_h`         | Top hook lip height      | advanced | 10–20 mm (step 0.1)                  | 14.32   |
| `foot_depth`    | Foot depth               | advanced | 7–14 mm (step 0.1)                   | 9       |
| `foot_below`    | Foot below the slot      | advanced | 2–10 mm (step 0.1)                   | 5.06    |
| `foot_above`    | Foot above the key       | advanced | 9–18 mm (step 0.1)                   | 12.15   |

Clearances (R6): `board_fit` and `latch_gap`. Leave the default, or bind a `fit.*` formula or a number of at least 0.5 mm.

Expert lock tuning, print-tested at its defaults (change one only when an engagement fix names it; see [core.md](core.md)): `unlock_vs_slot`, `lock_vs_slot`, `peak_vs_slot`, `peak_angle`, `flat_half`, `guide_vs_slot`, `guide_gap`, `side_skin`, `lug_r`, `lug_half`, `lug_len`, `lock_overtravel` and `unlock_overtravel`.

### `text`: Text

`text@1`, tier helper. One or two lines of text in an outline font, laid out in a box in the x-y plane (label coordinates: x along, y up, z out of the wall). The letters stand on `surface_z`: inlay letters fill a pocket you cut with `cut`; emboss (raised) letters sit on top. Every character must be in the font: a letter it lacks is refused, never drawn as a box. Place the text with the box settings, not by moving it in a shape.

- Parts: `text` and `cut`.
- Anchors: `box_centre`.
- States: none.
- Readouts: `textScale`, `textH`, `lines` and `textWidth`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot wall (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting          | Label               | Level    | Range                     | Default      |
| ---------------- | ------------------- | -------- | ------------------------- | ------------ |
| `line1`          | Text                | simple   | text, up to 60 characters | GARDEN TOOLS |
| `line2`          | Second line         | advanced | text, up to 60 characters |              |
| `font`           | Font                | simple   | a font                    | oswald-600   |
| `text_h`         | Letter height       | simple   | 3–80 mm (step 0.1)        | 14           |
| `line_gap`       | Line spacing        | advanced | 1–3 (step 0.05)           | 1.45         |
| `letter_spacing` | Letter spacing      | advanced | 0.8–1.5 (step 0.01)       | 1            |
| `align`          | Align               | advanced | left, center, right       | center       |
| `text_mode`      | Lettering           | advanced | inlay, emboss             | inlay        |
| `text_depth`     | Letter depth        | advanced | 0.2–2 mm (step 0.1)       | 0.6          |
| `auto_fit`       | Fit text            | advanced | on or off                 | true         |
| `box_left`       | Box left            | advanced | -500–500 mm (step 0.1)    | 6            |
| `box_right`      | Box right           | advanced | -500–500 mm (step 0.1)    | 114          |
| `box_mid_y`      | Box middle (height) | advanced | -500–500 mm (step 0.1)    | -19.45       |
| `box_height`     | Box height          | advanced | 2–500 mm (step 0.1)       | 14.9         |
| `surface_z`      | Surface height      | advanced | 0–50 mm (step 0.1)        | 2            |

### `top-wedge`: Top wedge

`top-wedge@1`, tier core, a mount brick (it engages the wall). A push-in wedge with a rounded button, sunk into the top arm of a cam-lock mount. Pushed in, it fills the slot above the arm so the hook can't lift out. It prints in place, pulled out. Build the mount with top_wedge off, subtract `groove` from its body, and print `wedge` in place with the hook. It pairs with a mount at the default top L thickness (L_thick 4.4 mm) and lever width (lever_w 9.8 mm).

- Parts: `wedge` and `groove`.
- Anchors: `button`.
- States: none.
- Readouts: `travel`, `grip` and `minWidth`. A formula reads a number, true/false or text readout as "instance.readout" and an object's field as "instance.readout.field"; lists can't be read.
- Needs a slot opening of 8.5–11 mm and a lip of 4–10 mm (slot walls).
- Example design: yes, `get_brick` returns it.

| Setting          | Label                  | Level    | Range                    | Default |
| ---------------- | ---------------------- | -------- | ------------------------ | ------- |
| `width`          | Hook width             | simple   | 17.4–101.6 mm (step 0.1) | 25.4    |
| `spine`          | Spine thickness        | advanced | 3–12 mm (step 0.1)       | 4.4     |
| `wedge_reach`    | Wedge reach into slot  | advanced | 2–6 mm (step 0.1)        | 3.5     |
| `wedge_interf`   | Wedge tightness        | advanced | 0–0.6 mm (step 0.05)     | 0.2     |
| `wedge_travel`   | Slide travel           | advanced | 2.5–8 mm (step 0.1)      | 3.8     |
| `wedge_cap_r`    | Button corner rounding | advanced | 0.5–4.5 mm (step 0.1)    | 3       |
| `wedge_base_w`   | Base plate width       | advanced | 10–30 mm (step 0.1)      | 15      |
| `wedge_pocket_d` | Base plate depth       | advanced | 1–2.6 mm (step 0.1)      | 2       |
| `wedge_dovetail` | Slide rail grip        | advanced | 0.3–1.5 mm (step 0.1)    | 1       |
