QuickScreen slat screening and gates BOM (Bill of Materials) generator for The Glass Outlet. Use when a user needs to configure a fence, screen, or gate using QuickScreen/XPRESS aluminium slat screening products. Guides users through system selection, dimensions, colours, post mounting, gate placement, and generates a complete priced BOM with all required components. Trigger phrases: fence quote, screening quote, slat fence, QuickScreen, BOM, bill of materials, gate quote, sliding gate, pedestrian gate, equipment enclosure, POSTA letterbox.
Use this skill when the user needs to:
Load these as needed — do NOT load all at once. Load on first use for that system.
| File | When to Load |
|---|---|
references/calculation_rules.md | First time you need to calculate any quantities — contains ALL formulas for ALL systems |
references/system_details.md | When user asks technical questions about a system's specs/capabilities |
Note: product_list.csv and product_mapping.json do NOT exist in this folder. Product codes and prices are embedded in const P inside QuickScreen-BOM-Generator.html in the project folder. For detailed spreadsheet analysis see analysis_slat_frames.md in the project folder.
There are multiple QuickScreen systems:
| # | System | Key Use | Max Dimensions | Notes |
|---|---|---|---|---|
| 1 | QSHS — Horizontal Slat (Side Frame) | Privacy/feature screens, boundary fences | Height: ~2700mm, Width: ~6000mm per panel | Standard system — in app ✓ |
| 2 | Vertical Slat (VS) | Decorative vertical screens, dividers | Same frame, slats rotated 90° | In app ✓ |
| 3 | XPress Plus Premium (XPL) | Insert-based premium system, 65mm slat ONLY | Height up to ~2700mm | Not yet in HTML app |
| 4 | BAYG — Buy As You Go | Same side frame as XPL, spacers sold separately | 65mm or 90mm slats | Not yet in HTML app |
| 5 | Pedestrian Gate (XP hinged) | Swing gates for foot traffic | Max ~1200mm W × 2100mm H | In app ✓ |
| 6 | QSG Pedestrian Gate | QuickScreen Gate system hinged gates | Similar to XP but different frame | In app (partial) |
| 7 | Sliding Gate | Driveway/wide opening gates | Up to ~6150mm wide | In app ✓ |
| 8 | Equipment Enclosure | AC units, pool pumps, bins | Custom to equipment size | |
| 9 | POSTA Letterbox | Fence-mounted letterbox | Between 50mm posts at 600mm centres |
Start conversational and friendly. Ask what they're building. Present systems as choices.
Ask: "What are you looking to build today?"
Key discovery questions (ask naturally, not as a checklist dump):
For each selected system, gather dimensions through natural conversation. Use multiple-choice questions and calculators to make it easy.
CRITICAL: Display the BOM as a table after each significant addition. The user must be able to see what's being added in real-time and correct mistakes immediately.
Gather these inputs (in order of importance):
Colour — ask first, affects all product codes
Slat size: 65mm or 90mm
Slat spacing/gap: 5mm, 9mm, or 20mm
Screen height (in mm)
calculation_rules.md:
num_slats = lookup from height table
actual_height = ROUND(num_slats × (slat_width + gap) - gap + 3, 0)
Total fence run length (mm or metres)
Panel layout:
num_panels = CEIL(run_length / max_panel_width)panel_width = run_length / num_panels (distribute evenly)Termination at each end: Post, Wall, or Existing structure
90° turns: Each turn = 1 corner post + independent panels each side
Louvre mode: Slats angled? (adds louvre brackets, changes width deduction)
Ask: "How will the posts be mounted?"
Post size selection (recommend automatically):
Similar to XP gates but uses QSG frame system:
Auto-add for every sliding gate:
Read references/calculation_rules.md for exact formulas.
When calculating slat counts, show the user a mini calculator:
╔═══════════════════════════════════════════╗
║ SLAT CALCULATOR ║
║ Slat: 90mm | Gap: 9mm | Colour: B ║
╠═══════════════════════════════════════════╣
║ Target Height: 1800mm ║
║ ───────────────────────────── ║
║ Calculated Slats: 18 ║
║ Actual Height: 1782mm ← closest match ║
║ Next option: 19 slats = 1881mm ║
╚═══════════════════════════════════════════╝
Let the user pick which slat count they want if the target falls between two options.
After each calculation step, display the BOM table so far:
| Qty | Code | Description | Unit $ | Line $ |
|-----|------|-------------|--------|--------|
| 18 | QS-6100-S90-B | 90mm Slat Black 6100mm | $50.49 | $908.82 |
| ← just added ↑ |
Keep appending rows as new items are calculated. This lets the user catch errors early.
CRITICAL: These must be added automatically whenever their parent product appears. Never leave a BOM without these.
Load the full auto-add rules from references/calculation_rules.md Section 9.
Key auto-adds:
All extrusions are sold in fixed stock lengths. Calculate how many stock lengths to order:
pieces_per_stock = ROUNDDOWN(stock_length / cut_length, 0)
stocks_to_order = ROUNDUP(total_pieces / pieces_per_stock, 0)
Stock lengths:
Before presenting the final BOM, verify:
Flag these if detected:
| Gotcha | Warning |
|---|---|
| Panel > 2600mm wide | "Panel exceeds recommended max. Consider splitting into 2 panels." |
| Panel > 2000mm without CSR | "Centre support rail required for panels over 2000mm." |
| Gate > 1200mm wide (pedestrian) | "Exceeds max recommended pedestrian gate width. Consider sliding gate." |
| Gate > 2100mm high | "Exceeds max gate height for standard hardware." |
| Missing gate hardware | "No hinges/latch selected for gate — these are required." |
| 6000mm post without cap | "6000mm posts don't include caps — must order separately or cut 2400mm post." |
| Louvre mode with wide panels | "Louvre brackets add 42mm to width deduction per side." |
| Mixed post sizes | "Mixing 50mm and 65mm posts — verify this is intentional." |
| No track anchors with track | "Track anchors needed to secure track to concrete." |
Display the complete BOM grouped by category:
1. Screening Materials | Qty | Code | Description | Unit $ | Line $ |
2. Frames & Fixings | Qty | Code | Description | Unit $ | Line $ |
3. Posts & Mounting | Qty | Code | Description | Unit $ | Line $ |
4. Gate Components (if applicable) | Qty | Code | Description | Unit $ | Line $ |
5. Gate Hardware (if applicable) | Qty | Code | Description | Unit $ | Line $ |
6. Accessories & Consumables | Qty | Code | Description | Unit $ | Line $ |
TOTAL: $X,XXX.XX
The price list has 3 tiers:
Ask the user which applies. Default to Tier 1 if not specified.
| Colour | Suffix | Notes |
|---|---|---|
| Black Satin | B | Most popular |
| Monument Matt | MN | Popular dark grey |
| Woodland Grey Matt | G | Mid grey-green |
| Surfmist Matt | SM | Light grey |
| Pearl White Gloss | W | White |
| Basalt Satin | BS | Dark charcoal |
| Dune Satin | D | Sandy/beige |
| Mill (raw aluminium) | M | Cheapest, no coating |
| Primrose | P | Limited availability |
| Paperbark | PB | Limited availability |
| Palladium Silver Pearl | S | Silver metallic |
Slats: XP-6100-S65-{col} or QS-6100-S90-{col}
Side Frame: QS-5800-SF-{col}
CFC Cover: QS-5800-CFC-{col}
F-Section: QS-5800-F-{col}
CSR: XP-5800-CSR-{col}
50mm Post 2400: XP-2400-FP-{col}
50mm Post 6000: XP-6000-FP-{col}
65mm Post 2400: XP-2400-65HD-{col}
65mm Post 5800: XP-5800-65HD-{col}
Base Plate 50mm: XP-BP-SET-{col}
Base Plate 65mm: XP-65BP-SET-{col}
Domical 50mm: XP-DC-2P-{col}
Domical 65mm: XP-65DC-2P-{col}
Dress Ring 50mm: XP-DR-{col}
Dress Ring 65mm: XP-65DR-{col}
SF Cap: QS-SFC-B ← individual (not a 2-pack), only available in Black, 2 per frame
CSR Cap: XP-CSRC-{col} ← has colour suffix (B, G, MN, S, SM, W)
Spacers: XPL-SB-50PK-05MM / XPL-SB-50PK-09MM / XPL-SB-50PK-20MM
Screws (screening): XP-SCREWS-{col} ← 100-pack (not 50)
Screws (gate frame):XP-SCREWSGF-10PK ← 12G×65mm, 10-pack, separate from screening screws
Gate Blade 65mm: XP-6100-GB65-{col} ← only gate blade in catalogue (no 90mm gate blade)
Gate Kit (9mm): XP-GKIT-LSET09-{col}
Gate Kit (20mm): XP-GKIT-LSET20-{col}
HD Rail (ped gate): XP-6100-HD6545-{col} ← top + bottom rail for pedestrian gate
SG Top Rail: XPSG-6100-TR-{col} ← 65×82mm, for SLIDING gates only
SG Bottom Rail: XPSG-6100-BR-{col} ← 120×45mm, for SLIDING gates only
Gate Stop: XP-4200-GSTOP-{col}
Steel Post: XPSG-2700-ST65-{col}
Top Rollers: XPSG-TOPROLL-2PK
Track 3m: XPSG-3000-TRACK-ST
Track 6m: XPSG-6000-TRACK-ST
Wheel: XPSG-WHEEL
Wheel Clamp: XPSG-WHEEL-CS ← 2-pack, 1 per wheel
Slide Guide: XPSG-GUIDE
Gate Stop (SG): XPSG-STOP
U-Catch: XPSG-CATCH-U
F-Catch: XPSG-CATCH-F
Track Anchors: XPSG-ANCHOR
Latch+Hinge combo: ML-TL-KF-H-FT (Magna Latch + Kwik Fit fixed tension)
Latch only: ML-TL
Hinge only: TC-H-AT-2L-B (TruClose adjustable pair)
These catalogue items could not be matched to price list SKUs. Flag for manual pricing:
| Code | Description | Recommendation |
|---|---|---|
| QS-135DEG | 135° Adapter | Custom/special order |
| QSG-4800-RAIL65/90 | QSG Gate Rails | May use XP-6100-HD6545 cut to length |
| QSG-JBLOCK-50/65 | QSG Joiner Blocks | May be included in gate kits |
| QSG-RS-10PK | QSG Rail Screws | Check FIXINGS & TOOLS group |
| QSG-SC-10PK | QSG Screw Covers | May be included in gate kits |
| QSG-FTC-65 | 65mm Gate Frame Cap | Check warehouse for HD gate caps |
| QSG-HINGE-BT/ADJ | QSG Gate Hinges | Source D&D Technologies (KF/TruClose) |
| QSG-DLATCH | QSG D-Latch | Use XP-LBOX-DL + Lockwood 001 latch |
| QSG-S-STOP | Sliding Gate Stop | May use XPSG-STOP |
| POSTA | Letterbox | Third-party product — check availability |
quickscreen_bom_ai_intake.htmlThis section documents every fix applied to the BOM generator app. Update this immediately after any change.
fence-mapper.js — complete rewrite
S.nodes[] → S.runs[]; single click places node, double-click finishes run; next click starts a new independent runconfig overrides (height, slat size, gap, colour, post mount, terminations, max panel)window.fmSetPostPositions(runIdx, positions) draws gold/red squares on plan after BOM generationS.mapImage; opacity slider; API key stored in localStorage qs_gmaps_keywindow.applyFenceLayout() now writes window.fmRuns array with per-run totals, gates, corners, config overridesfmGetState/fmLoadState now serialise full S.runs arrayQuickScreen-BOM-Generator.html — targeted changes
localStorage('qs_gmaps_key'))addGate() now captures postSize from selectorgenerateSwingGateBOM() and generateSlidingGateBOM() read gate.postSize to select correct post code; 75+mm posts flag "confirm with supplier"generateRunBOM(runCfg, sectionPrefix) helper — generates BOM sections for one run with given configgenerateBOM() now checks window.fmRuns; if set, iterates runs using per-run config overrides (falling back to form values for nulls), generates one BOM block per run, and processes mapper gates per run. Manual gate list is only added when mapper gates aren't present.Colour dropdown
night_sky, jasper, manor_red (none exist in catalogue)Fence BOM — complete rewrite
QS-SLAT-65, QS-TRK-3M, QS-POST-1800, QS-BP-100, QS-CAP-3M, QS-FIX-BAG, QS-END-CAP) — all removedround(N × (slat_width + gap) - gap + 3) formula (§1.3)ROUNDDOWN/ROUNDUP (§1.6)XP-6100-S65-{col} ($37.29) / QS-6100-S90-{col} ($50.49)QS-5800-SF-{col} ($24.35) now added with correct stock-length calcQS-5800-CFC-{col} ($16.92) now mandatory 1:1 with side framesQS-SFC-B ($0.86 ea) now added — 2 per frame, sold individually, black onlyXPL-SB-50PK-09MM ($3.01/pk) now added — qty: 2×(slats+1) per panel in 50-packsXP-SCREWS-{col} ($6.06/100-pk) now added — qty: slats×2×1.01 + CSR_screws in 100-packsXP-5800-CSR-{col} ($43.48) now auto-added for panels ≥ 2000mm, with caps (XP-CSRC-B, $1.03) and base/top plates (XP-BTP-{col}, $4.64 × 2)XP-2400-FP-{col} ($38.55) for ≤1800mm; XP-2400-65HD-{col} ($56.71) for >1800mmXP-BP-SET-{col} ($9.79) + XP-DC-2P-{col} ($5.11) or 65mm equivalentsproduct_list.csv)Sliding gate — fixes
XPSG-6100-TR-{col} + XPSG-6100-BR-{col} ($147.48 each) — old code wrongly used XP-6100-HD6545 (pedestrian gate product)XPSG-TOPROLL-2PK ($37.96)XPSG-WHEEL-CS ($6.00) — old code used non-existent QSG-S-WHEEL-CS-2PKXPSG-FILO-400 ($726.55, verify flag)Pedestrian gate — fixes
XP-GKIT-LSET09-{col} ($157.41 / $132.00 mill) as the correct foundation kitXP-6100-GB65-{col} ($55.36) — all gates use 65mm blade (only type in catalogue)XP-6100-HD6545-{col} ($124.56) — real price, correct for pedestrian gateML-TL-KF-H-FT ($61.48) replaces fake XP-HINGE-TC + XP-LATCH-ML codesXP-SCREWSGF-10PK ($3.02) — correct product (12G×65mm)XP-4200-GSTOP removed from pedestrian gate — now covered by gate kitNew Gates card in QuickScreen-BOM-Generator.html
Single/Double Swing Gate logic (XP pedestrian gate)
XP-GKIT-LSET{09|20}-{col} (frame, inserts, stops, rubber, caps, stop screws) — 1 per leafXP-6100-GB65-{col} — always 65mm regardless of fence slat size; count = slatCount(height−130, 65, gap)XP-6100-HD6545-{col} — 2 per leaf (top + bottom), stock-optimised from 6100mmML-TL-KF-H-FT (Magna Latch + Kwik Fit hinges) — 1 per leafXP-LBOX-LSET-{col} — 1 per gateXP-SCREWSGF-10PK — 2 packs per leafXP-2400-65HD-{col} — 2 for single swing, 3 for double swingSS-0300DB-ZP drop bolt (passive leaf)Sliding Gate logic
XP-6100-S65-{col} or QS-6100-S90-{col} — regular fence slats, gate panel = opening + 200mm overlapXPSG-6100-TR-{col} — 1 per gate, cut to panel widthXPSG-6100-BR-{col} — 1 per gateXPSG-WHEEL, 2× XPSG-WHEEL-CS, 1× XPSG-TOPROLL-2PK, 1× XPSG-GUIDE, 1× XPSG-STOP, 1× XPSG-CATCH-UXPSG-3000-TRACK-ST / XPSG-6000-TRACK-ST; XPSG-ANCHOR = 22 per 3m, 42 per 6mXPSG-2700-ST65-{col} (galv. steel)XPSG-2700-ST65-B not in catalogue — priced same as other coloursAI parse updated for gates
gates[] array from description: type, openingWidth, height, gap, colour, qtyApps merged into single file
QuickScreen-BOM-Generator.html is now the definitive app — combines:
P{}, F-section/dress ring/CSR cap support, 3-tier pricing, print/CSV/copy/Ask Claude exportclaude-sonnet-4-20250514, falls back to regex parser)fence-mapper.js + fence-mapper.css)quickscreen_bom_ai_intake.html preserved as-is for referencefence-mapper.js — full rewrite (v2)
w2s(wx,wy) world→screen, s2w(sx,sy) screen→world applied throughout all render and hit-test functionsS.scale updates → all segment labels recalculate; grid adjusts to matchfm-reset-view): restores zoom=1, pan=0,0applyToCalculator(): writes to runLength (mm) and corners — Generator field IDs (not AI intake IDs)QuickScreen-BOM-Generator.html — merged structure
localStorage('qs_anthropic_key')parseWithAI(): injects stored key as x-api-key + anthropic-version headers; falls back to parseNL() on errorfmGetSitePlanDataURL()runLength, corners, targetHeight, etc.)New files added
Desktop/fence-mapper.js — FM module: canvas-based node/segment polyline, gate placement, run summary, apply-to-calculator, site plan export, serialisationDesktop/fence-mapper.css — all mapper styles matching app CSS variable schemeChanges to quickscreen_bom_ai_intake.html
f_length, f_corners, prepends layout note to jobDesc, adds gates, shows toast; warns before overwriting existing valuesf_corners field to step2 Job & system card (90° corners count)generateBOM() now reads f_corners — adds 1 extra post per corner: numPosts = numPanels + 1 + numCorners"corners" fieldapplyParsed() now sets f_corners from parsed JSONresetGates() helper (clears gate list before re-populating from mapper)<div id="bom-site-plan"> in step3 — populated with mapper PNG on BOM generation<div id="fm-toast"> for toast notifications| Constant | Value | Notes |
|---|---|---|
| Wslot | 66.5mm | Insert blade width |
| Gs (9mm nominal) | 8mm actual | Actual gap at 9mm setting |
| Gs (20mm nominal) | 20mm actual | Actual gap at 20mm setting |
| Blade_cc (9mm) | 74.5mm | = Wslot + Gs |
| Blade_cc (20mm) | 86.5mm | = Wslot + Gs |
| Ht_EndCap | 3mm | End cap height |
| Cut_Allowance | 2mm | Saw kerf |
XPL uses blade_cc to determine slat count (different from QSHS height formula):
Blade_cc = Wslot + Gs # 74.5mm (9mm gap) or 86.5mm (20mm gap)
num_blades = INT(available_height / Blade_cc)
available_height = screen_height - 2 × Ht_EndCap = screen_height - 6
XPL is 65mm slat ONLY. No 90mm option exists.
BAYG uses its own lookup table (BAYG_ScrHts) for height → slat count. Programmatic approximation (same formula as QSHS):
num_slats = largest N where N × (slat_width + gap) - gap + 3 ≤ target_height
BAYG spacers = 2 × (num_slats + 1) per panel, sold in 50-packs.
num_slats = ROUNDDOWN((panel_width - 8 + slat_spacing) / (slat_spacing + slat_size), 0)
Where 8 = frame channel depth (4mm each side). Overhang = ROUND((panel_width - 8 - num_slats × (slat_spacing + slat_size) + slat_spacing) / 2, 1) Slat cut length = panel HEIGHT (slats run vertically). Top/bottom rails = side frames cut to panel WIDTH.
T2 = T1 × 0.85 (15% discount from T1) T3 ≈ T1 × 0.80 (approx — varies by product)