{
  "version": 3,
  "sources": ["/cdn/shop/t/23/assets/ub-cabinet-lab-v2.js?b=x1790885966"],
  "sourcesContent": ["/* Uniboards Cabinet Lab v2 \u2014 \u0441\u043E\u0431\u0440\u0430\u043D\u043E \u0438\u0437 v2/src (tools/build-v2.mjs). \u0420\u0443\u043A\u0430\u043C\u0438 \u043D\u0435 \u043F\u0440\u0430\u0432\u0438\u0442\u044C.\n   \u0441\u043B\u043E\u0438: render:\u0435\u0441\u0442\u044C interact:\u0435\u0441\u0442\u044C ui:\u0435\u0441\u0442\u044C */\n(function () {\nvar __UbCabinetLabV2 = (() => {\n  var __defProp = Object.defineProperty;\n  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n  var __getOwnPropNames = Object.getOwnPropertyNames;\n  var __hasOwnProp = Object.prototype.hasOwnProperty;\n  var __export = (target, all) => {\n    for (var name2 in all)\n      __defProp(target, name2, { get: all[name2], enumerable: true });\n  };\n  var __copyProps = (to, from, except, desc) => {\n    if (from && typeof from === \"object\" || typeof from === \"function\") {\n      for (let key of __getOwnPropNames(from))\n        if (!__hasOwnProp.call(to, key) && key !== except)\n          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n    }\n    return to;\n  };\n  var __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n  // v2/src/api/boot.js\n  var boot_exports = {};\n  __export(boot_exports, {\n    getLegacyExports: () => getLegacyExports\n  });\n\n  // v2/src/render/surface.js\n  var surface_exports = {};\n  __export(surface_exports, {\n    afterFrame: () => afterFrame,\n    attach: () => attach,\n    legacyExports: () => legacyExports,\n    pictureCamera: () => pictureCamera,\n    wireFrame: () => wireFrame\n  });\n\n  // v2/src/model/constants.js\n  var T = 18;\n  var LEG_H = 150;\n  var RAIL_D = 100;\n  var VOID_REAR = 50;\n  var SHELF_FRONT_SETBACK = 22;\n  var SHELF_SIDE_GAP = 1;\n  var EPS = 0.25;\n  var PIN_R = 2.5;\n  var PIN_PITCH = 32;\n  var PIN_INSET = 37;\n  var PIN_DEPTH_NOTE = 12;\n  var SHELF_PIN_FRONT_CNC = 27;\n  var SHELF_MIN_DEPTH = SHELF_PIN_FRONT_CNC + PIN_INSET + 2 * PIN_R;\n  var HINGE_R = 2.5;\n  var HINGE_INSET = 37;\n  var HINGE_PAIR = 32;\n  var CABINET_MIN_W = 250;\n  var WIDTH_MIN = CABINET_MIN_W;\n  var WIDTH_MAX = 2100;\n  var DRAWER_MIN_W = 200;\n  var APPLIANCE_MIN_W = 600;\n  var LIMITS = { w: [WIDTH_MIN, WIDTH_MAX], h: [600, 900], d: [300, 650] };\n  var WALL = {\n    limits: { w: [WIDTH_MIN, WIDTH_MAX], h: [300, 900], d: [200, 400] },\n    defaultW: 600,\n    defaultH: 720,\n    defaultD: 300,\n    mountY: 1400\n  };\n  var ISLAND = {\n    limits: { w: [836, 4036], h: [600, 900], d: [318, 668] },\n    defaultW: 1836,\n    defaultH: 720,\n    defaultD: 578,\n    /* ready-made starting points, all built from ordinary\n       cabinet widths; the body figure is derived, never typed in */\n    presets: [\n      {\n        id: \"compact\",\n        label: \"Compact\",\n        bays: [600, 600],\n        kinds: [\"drawers\", \"doors\"]\n      },\n      {\n        id: \"standard\",\n        label: \"Standard\",\n        bays: [600, 600, 600],\n        kinds: [\"drawers\", \"doors\", \"drawers\"]\n      },\n      {\n        id: \"large\",\n        label: \"Large\",\n        bays: [800, 800, 800],\n        kinds: [\"drawers\", \"doors\", \"drawers\"]\n      },\n      {\n        id: \"four\",\n        label: \"Four\",\n        bays: [600, 600, 600, 600],\n        kinds: [\"drawers\", \"doors\", \"doors\", \"drawers\"]\n      }\n    ]\n  };\n  var ARM_CEIL = 3e3;\n  var DRW = {\n    frontH: 193.5,\n    // drawer front height  (lab)\n    boxH: 90,\n    // box side/front/back height (lab)\n    sideGap: 5,\n    // carcass internal -> box OUTER, each side (see note below)\n    boxBackSet: 79.5,\n    // box length = D - this     (derived 560-480.5)\n    bottomT: 3,\n    // the lab's HDF bottom - NOT our box: Drawer Box Model 1 has an 18 mm base (model/drawer-construction.js)\n    frontGapSide: 3,\n    // 600-594 = 6 total          (lab)\n    doorGapSide: 2,\n    // 600-596 = 4 total          (lab)\n    gapTotal: 8,\n    // 720-(193.5+518.5)          (lab)\n    openBy: 420,\n    // travel shown when open (illustrative)\n    runnerT: 12\n    // illustrative runner rail\n  };\n  var DRW4 = {\n    n: 4,\n    ratios: [1, 1, 1, 1.5],\n    names: [\"Top drawer\", \"Second drawer\", \"Third drawer\", \"Bottom drawer\"],\n    revealTop: 2,\n    revealBottom: 2,\n    gap: 4,\n    boxRatio: 90 / 193.5,\n    // lab 193.5 front -> 90 box\n    boxLift: 18\n    // lab: box bottom sits 18 mm above the front bottom\n  };\n  var SNAP = { on: 28, off: 42, cue: null };\n  var DEFAULTS = { w: 600, h: 720, d: 560, finish: \"white\", yaw: -0.62, pitch: 0.3 };\n  var PRICING = {\n    floorInc: 82,\n    // BASE only, provisional owner figure\n    fixedInc: 22.5538,\n    // BASE fixed items (incl. 12 Cabineo + 4 legs)\n    wallFixedInc: 15.5608,\n    // WALL fixed items (8 Cabineo, NO legs) - see table below\n    perSqmLabourInc: 13.9222,\n    perEdgeMetreInc: 0.7259,\n    perSqmBack3mmInc: 6.8853,\n    // 3 mm white-faced MDF back, sourced (see table below)\n    /* CORNER fixed items, ex VAT. Same list as the base cabinet, with the\n       connector count re-counted for the larger carcass and the legs increased:\n         glue 0.30 + Cabineo x20 5.96080 + legs x6 4.74 + caps/pins 1.50\n         + packing 6.00 + tool wear 1.50 = 20.00080 x 1.6068 = 32.1373 inc.\n       Cabineo 20: bottom->2 sides 4, back(s)->sides 4, rails->sides 8,\n       blanking panel / inner L joints 4. Legs 6 at GBP 0.79 each (the base\n       cabinet's GBP 3.16 for 4). Packing raised from GBP 4.00 to GBP 6.00 for a\n       1200 carton - a PROVISIONAL assumption, see the note file. */\n    cornerFixedInc: 32.1373\n  };\n  var MATERIALS = {\n    white: {\n      label: \"Egger W1000 ST9 Premium White\",\n      short: \"White\",\n      perSqmBoardInc: 19.3345,\n      quoteOnly: false\n    },\n    oak: {\n      label: \"Egger H1385 ST40 Natural Casella Oak\",\n      short: \"Natural Casella Oak\",\n      perSqmBoardInc: 32.571,\n      quoteOnly: false\n    },\n    /* PURE WHITE (task 1790948486103, owner 02.10.2026: \u00ABW1100 Egger ST9\u00BB). Board cost from OUR purchase records,\n       the same rule as W1000 above (cost ex VAT / 5.796 m2 sheet / 0.7965 yield x 1.6068 uplift):\n         Meyer Timber 1430/W1100ST9 \u00AB2800X2070 18mm W1100St9 Alpine White Egger MFC\u00BB, GBP 62.66 ex per board -\n         parsed invoice on our order UB10877 (08/06/2026) and Meyer sales order 1622378 on UB11605 (25/09/2026).\n         62.66 / 5.796 / 0.7965 x 1.6068 = GBP 21.8091 / m2 inc.\n       W1000 stays on its James Latham cost (GBP 55.55). Shop product: \u00ABMFC EGGER W1100 ST9 Alpine White\u00BB. */\n    w1100: {\n      label: \"Egger W1100 ST9 Alpine White\",\n      short: \"W1100 Egger ST9\",\n      perSqmBoardInc: 21.8091,\n      quoteOnly: false\n    }\n  };\n  var REVEAL = 2;\n  var DOOR_OPEN_DEG = 100;\n  var EXPLODE_MM = 150;\n  var EXPLODE_MAX = 320;\n  var EXPLODE_FIXED = { \"Shelf\": 1, \"Shelf A\": 1, \"Shelf B\": 1 };\n\n  // v2/src/model/index.js\n  var model_exports = {};\n  __export(model_exports, {\n    ALIGN: () => ALIGN,\n    ALONG_SIGN: () => ALONG_SIGN,\n    ANGLED_WALL_SAY: () => ANGLED_WALL_SAY,\n    APPLIANCE_MIN_W: () => APPLIANCE_MIN_W,\n    ARM_CEIL: () => ARM_CEIL,\n    BOX_MIN_H: () => BOX_MIN_H,\n    BOX_RUNNER_CLEAR: () => BOX_RUNNER_CLEAR,\n    CABINET_MIN_W: () => CABINET_MIN_W,\n    CORNER: () => CORNER,\n    CORNER_SHELF: () => CORNER_SHELF,\n    CORNER_SHELF_SUPPORT_NOTE: () => CORNER_SHELF_SUPPORT_NOTE,\n    CORNER_TALL: () => CORNER_TALL,\n    CORNER_TALL_SHELVES: () => CORNER_TALL_SHELVES,\n    DEFAULTS: () => DEFAULTS,\n    DIVIDER_CENTRE_SNAP: () => DIVIDER_CENTRE_SNAP,\n    DIVIDER_MIN_DEPTH: () => DIVIDER_MIN_DEPTH2,\n    DOOR_OPEN_DEG: () => DOOR_OPEN_DEG,\n    DRAWER_MIN_W: () => DRAWER_MIN_W,\n    DRW: () => DRW,\n    DRW4: () => DRW4,\n    END_SPEC: () => END_SPEC,\n    EPS: () => EPS,\n    EXPLODE_FIXED: () => EXPLODE_FIXED,\n    EXPLODE_MAX: () => EXPLODE_MAX,\n    EXPLODE_MM: () => EXPLODE_MM,\n    FINISH_KEYS: () => FINISH_KEYS,\n    FINISH_KIT: () => FINISH_KIT,\n    FIT_MIN: () => FIT_MIN,\n    FIT_TOL: () => FIT_TOL,\n    HINGE_INSET: () => HINGE_INSET,\n    HINGE_PAIR: () => HINGE_PAIR,\n    HINGE_R: () => HINGE_R,\n    HUG_ROT: () => HUG_ROT,\n    INTERIOR: () => INTERIOR,\n    ISLAND: () => ISLAND,\n    ISLAND_BAY_LIMITS: () => ISLAND_BAY_LIMITS,\n    ISLAND_GAP: () => ISLAND_GAP,\n    ISLAND_SECTIONS: () => ISLAND_SECTIONS,\n    LEGACY_GLASS: () => LEGACY_GLASS,\n    LEG_FRONT_INSET: () => LEG_FRONT_INSET,\n    LEG_H: () => LEG_H,\n    LIMITS: () => LIMITS,\n    MAIN_WALL: () => MAIN_WALL,\n    MATERIALS: () => MATERIALS,\n    NARROW_MIN: () => NARROW_MIN,\n    NUDGE_DIRS: () => NUDGE_DIRS,\n    ONE_DOOR_MAX: () => ONE_DOOR_MAX,\n    PART_KIND_LABEL: () => PART_KIND_LABEL,\n    PIN_DEPTH_NOTE: () => PIN_DEPTH_NOTE,\n    PIN_INSET: () => PIN_INSET,\n    PIN_PITCH: () => PIN_PITCH,\n    PIN_R: () => PIN_R,\n    PRICING: () => PRICING,\n    RAIL_D: () => RAIL_D,\n    RESIZE_SNAP: () => RESIZE_SNAP,\n    REVEAL: () => REVEAL,\n    ROOM: () => ROOM,\n    ROOM_DEFAULT: () => ROOM_DEFAULT,\n    ROOM_LIMITS: () => ROOM_LIMITS,\n    RUN_ACQ: () => RUN_ACQ,\n    RUN_GAP: () => RUN_GAP,\n    SEAT_NEAR: () => SEAT_NEAR,\n    SEAT_TOL: () => SEAT_TOL,\n    SHELF_CLEAR: () => SHELF_CLEAR,\n    SHELF_FRONT_SETBACK: () => SHELF_FRONT_SETBACK,\n    SHELF_MIN_DEPTH: () => SHELF_MIN_DEPTH,\n    SHELF_PIN_FRONT_CNC: () => SHELF_PIN_FRONT_CNC,\n    SHELF_SIDE_GAP: () => SHELF_SIDE_GAP,\n    SNAP: () => SNAP,\n    STEP_MM: () => STEP_MM,\n    T: () => T,\n    TALL: () => TALL,\n    THIN_MAX: () => THIN_MAX,\n    TYPE_NAME: () => TYPE_NAME2,\n    UB_SCENE: () => UB_SCENE,\n    UID: () => UID,\n    UL_NEAR: () => UL_NEAR,\n    UL_SNAP: () => UL_SNAP,\n    UL_TOL: () => UL_TOL,\n    VOID_REAR: () => VOID_REAR,\n    WALL: () => WALL,\n    WALL_HIT: () => WALL_HIT,\n    WALL_ROT: () => WALL_ROT,\n    WIDTH_MAX: () => WIDTH_MAX,\n    WIDTH_MIN: () => WIDTH_MIN,\n    adjoinGap: () => adjoinGap,\n    alignCues: () => alignCues,\n    alignGroups: () => alignGroups,\n    allJoints: () => allJoints,\n    alongAxisForWall: () => alongAxisForWall,\n    alongAxisForYaw: () => alongAxisForYaw,\n    alongWall: () => alongWall,\n    anchorWalls: () => anchorWalls,\n    angledWalls: () => angledWalls,\n    anyFrontsOn: () => anyFrontsOn,\n    applyRunDim: () => applyRunDim,\n    applySpread: () => applySpread,\n    armA: () => armA,\n    armB: () => armB,\n    armB2: () => armB2,\n    armRoomMax: () => armRoomMax,\n    atomicRoomOp: () => atomicRoomOp,\n    attachToRoomWall: () => attachToRoomWall,\n    backOnWall: () => backOnWall,\n    backSeatOf: () => backSeatOf,\n    backWallOf: () => backWallOf,\n    bands: () => bands,\n    baselineInteriorExtras: () => baselineInteriorExtras,\n    baselineShelves: () => baselineShelves,\n    behindWall: () => behindWall,\n    besideAdapted: () => besideAdapted,\n    besideDir: () => besideDir,\n    besideFrame: () => besideFrame,\n    besideFree: () => besideFree,\n    besideSide: () => besideSide,\n    blindSplit: () => blindSplit,\n    blockedAt: () => blockedAt,\n    boardAreaM2: () => boardAreaM2,\n    boardAreaSplit: () => boardAreaSplit,\n    bodyMidY: () => bodyMidY,\n    boxHit: () => boxHit,\n    buildParts: () => buildParts,\n    buildParts4: () => buildParts4,\n    cabinetParts: () => cabinetParts,\n    canAddDivider: () => canAddDivider,\n    canAddHDivider: () => canAddHDivider,\n    canFinishing: () => canFinishing,\n    canInterior: () => canInterior,\n    carcassPartsFor: () => carcassPartsFor,\n    carcassRawFor: () => carcassRawFor,\n    carrySetbacks: () => carrySetbacks,\n    cells: () => cells,\n    cellsAcross: () => cellsAcross,\n    centreAlong: () => centreAlong,\n    clamp: () => clamp4,\n    clearRoomSide: () => clearRoomSide,\n    cloneCornerShelves: () => cloneCornerShelves,\n    cloneShelfList: () => cloneShelfList,\n    compartments: () => compartments,\n    composeXf: () => composeXf,\n    connectedRun: () => connectedRun,\n    cornerArmMax: () => cornerArmMax,\n    cornerArmMin: () => cornerArmMin,\n    cornerArmSearch: () => cornerArmSearch,\n    cornerArmSides: () => cornerArmSides,\n    cornerArmsFit: () => cornerArmsFit,\n    cornerAtRoomCorner: () => cornerAtRoomCorner,\n    cornerBlindDoor: () => cornerBlindDoor,\n    cornerBlindParts: () => cornerBlindParts,\n    cornerCanTransfer: () => cornerCanTransfer,\n    cornerDestinations: () => cornerDestinations,\n    cornerDoorSlabs: () => cornerDoorSlabs,\n    cornerEnvelope: () => cornerEnvelope,\n    cornerInteriorParts: () => cornerInteriorParts,\n    cornerLDoors: () => cornerLDoors,\n    cornerLParts: () => cornerLParts,\n    cornerLTallParts: () => cornerLTallParts,\n    cornerLWallParts: () => cornerLWallParts,\n    cornerLegCentres: () => cornerLegCentres,\n    cornerLegWorld: () => cornerLegWorld,\n    cornerMoveOK: () => cornerMoveOK,\n    cornerOwnsWall: () => cornerOwnsWall,\n    cornerPlusTile: () => cornerPlusTile,\n    cornerShelfBoards: () => cornerShelfBoards,\n    cornerShelfBoardsIn: () => cornerShelfBoardsIn,\n    cornerShelfEdges: () => cornerShelfEdges,\n    cornerShelfExtras: () => cornerShelfExtras,\n    cornerShelfFrame: () => cornerShelfFrame,\n    cornerShelfFrameOf: () => cornerShelfFrameOf,\n    cornerShelfFrontMm: () => cornerShelfFrontMm,\n    cornerShelfGaps: () => cornerShelfGaps,\n    cornerShelfLimits: () => cornerShelfLimits,\n    cornerShelfList: () => cornerShelfList,\n    cornerShelfMoveTo: () => cornerShelfMoveTo,\n    cornerShelfName: () => cornerShelfName,\n    cornerShelfRange: () => cornerShelfRange,\n    cornerShelfSetEdges: () => cornerShelfSetEdges,\n    cornerShelfSnap: () => cornerShelfSnap,\n    cornerShelfStockExtras: () => cornerShelfStockExtras,\n    cornerStockY: () => cornerStockY,\n    cornerStockYs: () => cornerStockYs,\n    cornerTargetFirstThatFits: () => cornerTargetFirstThatFits,\n    cornerTargetFor: () => cornerTargetFor,\n    cornerTransferPreview: () => cornerTransferPreview,\n    cueText: () => cueText,\n    decideAttach: () => decideAttach,\n    displayName: () => displayName,\n    dividerBoxLocal: () => dividerBoxLocal,\n    dividerFrontZ: () => dividerFrontZ,\n    dividerGaps: () => dividerGaps,\n    dividerIndexOf: () => dividerIndexOf,\n    dividerPlace: () => dividerPlace,\n    dividerPlacement: () => dividerPlacement,\n    dividerRange: () => dividerRange,\n    dividerRemoveAt: () => dividerRemoveAt,\n    dividerSetbackLimits: () => dividerSetbackLimits,\n    doorLeaves: () => doorLeaves,\n    doorSwingRad: () => doorSwingRad,\n    doorSwingXf: () => doorSwingXf,\n    doorTransform: () => doorTransform,\n    drawer4Parts: () => drawer4Parts,\n    drawerFrontsOn: () => drawerFrontsOn,\n    drawerParts: () => drawerParts,\n    duplicateDivider: () => duplicateDivider,\n    duplicateHDivider: () => duplicateHDivider,\n    duplicateShelf: () => duplicateShelf,\n    edgeMetres: () => edgeMetres,\n    edgeMetres4: () => edgeMetres4,\n    editHandles: () => editHandles,\n    effCarcass: () => effCarcass,\n    effFrontMat: () => effFrontMat,\n    effFronts: () => effFronts,\n    effStyle: () => effStyle,\n    elevationOf: () => elevationOf,\n    endKeyOf: () => endKeyOf,\n    endMatChoice: () => endMatChoice,\n    endPanelSpec: () => endPanelSpec,\n    estimate: () => estimate,\n    exOff: () => exOff,\n    explodeMM: () => explodeMM,\n    facesJoin: () => facesJoin,\n    familyOf: () => familyOf,\n    finishLabel: () => finishLabel,\n    finishShort: () => finishShort,\n    finishingExtras: () => finishingExtras,\n    finishingOf: () => finishingOf,\n    finishingParts: () => finishingParts,\n    finishingReach: () => finishingReach,\n    finishingText: () => finishingText,\n    finishingWhy: () => finishingWhy,\n    fitCornerArms: () => fitCornerArms,\n    fitsHere: () => fitsHere,\n    flipUnit: () => flipUnit,\n    flushRoomWallOf: () => flushRoomWallOf,\n    flushToReturn: () => flushToReturn,\n    flushToRun: () => flushToRun,\n    foot: () => foot,\n    footBoxes: () => footBoxes,\n    freeOutline: () => freeOutline,\n    fridgeSplitY: () => fridgeSplitY,\n    frontDir: () => frontDir,\n    frontFaces: () => frontFaces,\n    frontPlane: () => frontPlane,\n    frontSign: () => frontSign,\n    frontSnap: () => frontSnap,\n    frontsKeyOf: () => frontsKeyOf,\n    gapBeside: () => gapBeside,\n    gapContiguousRun: () => gapContiguousRun,\n    gapEligible: () => gapEligible,\n    gapFillExtend: () => gapFillExtend,\n    gapFillShare: () => gapFillShare,\n    gapOffer: () => gapOffer,\n    gapRunOf: () => gapRunOf,\n    gapToWall: () => gapToWall,\n    gapWidthLimits: () => gapWidthLimits,\n    grabAlongForWall: () => grabAlongForWall,\n    grabLocalFrom: () => grabLocalFrom,\n    hDivDragTo: () => hDivDragTo,\n    hDividerBoxLocal: () => hDividerBoxLocal,\n    hDividerGaps: () => hDividerGaps,\n    hDividerIndexOf: () => hDividerIndexOf,\n    hDividerMoveTo: () => hDividerMoveTo,\n    hDividerPlace: () => hDividerPlace,\n    hDividerPlacement: () => hDividerPlacement,\n    hDividerRange: () => hDividerRange,\n    hDividerRangeOf: () => hDividerRangeOf,\n    hDividerRemoveAt: () => hDividerRemoveAt,\n    handleInset: () => handleInset,\n    hasFinishing: () => hasFinishing,\n    hingeSideBlocked: () => hingeSideBlocked,\n    hugCornerOf: () => hugCornerOf,\n    hugPointOf: () => hugPointOf,\n    inPartition: () => inPartition,\n    inheritRunDims: () => inheritRunDims,\n    interiorBounds: () => interiorBounds,\n    interiorCounts: () => interiorCounts,\n    interiorExtras: () => interiorExtras,\n    interiorOf: () => interiorOf,\n    interiorParts: () => interiorParts,\n    interiorRayHit: () => interiorRayHit,\n    interiorTarget: () => interiorTarget,\n    interiorText: () => interiorText,\n    interiorWhy: () => interiorWhy,\n    isCornerShelfUnit: () => isCornerShelfUnit,\n    isCornerUnit: () => isCornerUnit,\n    isCustom: () => isCustom,\n    isHousing: () => isHousing,\n    isIntentionalGlass: () => isIntentionalGlass,\n    isIsland: () => isIsland,\n    isLPlan: () => isLPlan,\n    isTall: () => isTall,\n    islandAisle: () => islandAisle,\n    islandAisleText: () => islandAisleText,\n    islandBayD: () => islandBayD,\n    islandBayDoorsOn: () => islandBayDoorsOn,\n    islandBayKinds: () => islandBayKinds,\n    islandBayList: () => islandBayList,\n    islandBayW: () => islandBayW,\n    islandBayWidths: () => islandBayWidths,\n    islandBays: () => islandBays,\n    islandBodyW: () => islandBodyW,\n    islandChildOrigin: () => islandChildOrigin,\n    islandIntIndex: () => islandIntIndex,\n    islandIntTarget: () => islandIntTarget,\n    islandSkinParts: () => islandSkinParts,\n    islandSync: () => islandSync,\n    jpullBlocked: () => jpullBlocked,\n    keepEdges: () => keepEdges,\n    lCornerIdOf: () => lCornerIdOf,\n    leafPlan: () => leafPlan,\n    legCentres: () => legCentres,\n    legacyShelfYs: () => legacyShelfYs,\n    levelKey: () => levelKey,\n    limitsFor: () => limitsFor,\n    localToWorld: () => localToWorld,\n    matchingProbe: () => matchingProbe,\n    materialOf: () => materialOf,\n    materialiseShelves: () => materialiseShelves2,\n    maxCornerDepth: () => maxCornerDepth,\n    maxShelvesFor: () => maxShelvesFor,\n    migrateFinishes: () => migrateFinishes,\n    mirrorPartsX: () => mirrorPartsX,\n    moveClamped: () => moveClamped,\n    nearAngledWall: () => nearAngledWall,\n    nearAngledWallBox: () => nearAngledWallBox,\n    nearbyUnits: () => nearbyUnits,\n    nearestRoomCorner: () => nearestRoomCorner,\n    newUnit: () => newUnit,\n    nextShelfId: () => nextShelfId,\n    nextUid: () => nextUid,\n    nudgeClear: () => nudgeClear,\n    nudgeDir: () => nudgeDir,\n    nudgeLimit: () => nudgeLimit,\n    okEndMat: () => okEndMat,\n    okFinish: () => okFinish,\n    onReturnWall: () => onReturnWall,\n    openFrontBox: () => openFrontBox,\n    openFrontParts: () => openFrontParts,\n    orientForRun: () => orientForRun,\n    ovenNiche: () => ovenNiche,\n    overallWidth: () => overallWidth,\n    overlaps: () => overlaps,\n    ownFrontH: () => ownFrontH,\n    ownsInterior: () => ownsInterior,\n    partById: () => partById,\n    partMaterialOf: () => partMaterialOf,\n    partReadout: () => partReadout,\n    partWorldBox: () => partWorldBox,\n    partsById: () => partsById,\n    pickPartIn: () => pickPartIn,\n    placeAlongWall: () => placeAlongWall,\n    placeBeside: () => placeBeside,\n    placeByAnchor: () => placeByAnchor,\n    placeFreeFloor: () => placeFreeFloor,\n    placeIsland: () => placeIsland,\n    placeLCorner: () => placeLCorner,\n    placeNearestLegal: () => placeNearestLegal,\n    placeNew: () => placeNew,\n    placeReturn: () => placeReturn,\n    placeWhy: () => placeWhy,\n    planXf: () => planXf,\n    pointWallDist: () => pointWallDist,\n    priceKey: () => priceKey,\n    protrusion: () => protrusion,\n    pushChain: () => pushChain,\n    pushIntoRoom: () => pushIntoRoom,\n    quickAddable: () => quickAddable,\n    rayHitsOpenFront: () => rayHitsOpenFront,\n    rayToLocal: () => rayToLocal,\n    reconcileShelfCount: () => reconcileShelfCount,\n    relayoutRow: () => relayoutRow,\n    reseatOnWall: () => reseatOnWall,\n    resizeApply: () => resizeApply,\n    resizeAxisOf: () => resizeAxisOf,\n    resizeBase: () => resizeBase,\n    resizeClamp: () => resizeClamp,\n    resizeFromEdge: () => resizeFromEdge,\n    resizeLegal: () => resizeLegal,\n    resizeLimits: () => resizeLimits,\n    resizeSnap: () => resizeSnap,\n    resizeSnapTargets: () => resizeSnapTargets,\n    resizeWithPush: () => resizeWithPush,\n    resolveFinishes: () => resolveFinishes,\n    retWall: () => retWall,\n    returnRot: () => returnRot,\n    revalidateRoom: () => revalidateRoom,\n    roomCornerSeatedBy: () => roomCornerSeatedBy,\n    roomCorners: () => roomCorners,\n    roomHeight: () => roomHeight,\n    roomOn: () => roomOn,\n    roomSize: () => roomSize,\n    roomWallById: () => roomWallById,\n    roomWallList: () => roomWallList,\n    roomWallPlane: () => roomWallPlane,\n    roomWalls: () => roomWalls,\n    rowGroup: () => rowGroup,\n    rowNeighbour: () => rowNeighbour,\n    runAxisOf: () => runAxisOf,\n    runDepthBlock: () => runDepthBlock,\n    runDimsMatch: () => runDimsMatch,\n    runDonorFor: () => runDonorFor,\n    runElevation: () => runElevation,\n    runExtent: () => runExtent,\n    runFreeSpans: () => runFreeSpans,\n    runInheritCue: () => runInheritCue,\n    runInheritEligible: () => runInheritEligible,\n    runMembers: () => runMembers,\n    runRange: () => runRange,\n    runRot: () => runRot,\n    runSibling: () => runSibling,\n    runTier: () => runTier,\n    runValue: () => runValue,\n    runWallDist: () => runWallDist,\n    sameLevel: () => sameLevel,\n    sameTierAs: () => sameTierAs,\n    sceneValid: () => sceneValid,\n    seatAtInferredCorner: () => seatAtInferredCorner,\n    seatCornerAutomatically: () => seatCornerAutomatically,\n    seatEligible: () => seatEligible,\n    seatOnTouchedWall: () => seatOnTouchedWall,\n    seatSharingCorner: () => seatSharingCorner,\n    seatWallById: () => seatWallById,\n    seatWallName: () => seatWallName,\n    seatWalls: () => seatWalls,\n    setInterior: () => setInterior,\n    setUid: () => setUid,\n    settleNearWall: () => settleNearWall,\n    shelfAdd: () => shelfAdd,\n    shelfBoxLocal: () => shelfBoxLocal,\n    shelfCellKey: () => shelfCellKey,\n    shelfCellOf: () => shelfCellOf,\n    shelfDepthLimits: () => shelfDepthLimits,\n    shelfEdgesOf: () => shelfEdgesOf,\n    shelfGaps: () => shelfGaps,\n    shelfListOf: () => shelfListOf,\n    shelfMoveTo: () => shelfMoveTo,\n    shelfPins: () => shelfPins,\n    shelfPlace: () => shelfPlace,\n    shelfPlacement: () => shelfPlacement,\n    shelfRangeIn: () => shelfRangeIn,\n    shelfRemove: () => shelfRemove,\n    shelfSetEdges: () => shelfSetEdges,\n    shelfSnapLegal: () => shelfSnapLegal,\n    shelfYLegal: () => shelfYLegal,\n    shelvesPerCell: () => shelvesPerCell,\n    sideContacts: () => sideContacts,\n    sideDir: () => sideDir,\n    singleFrontH: () => singleFrontH,\n    snapDim: () => snapDim,\n    snapUnit: () => snapUnit,\n    spreadAxisFor: () => spreadAxisFor,\n    storedBoxH: () => storedBoxH,\n    stripStockShelves: () => stripStockShelves,\n    structuralWidthMin: () => structuralWidthMin,\n    swapUnits: () => swapUnits,\n    sweepWall: () => sweepWall,\n    swingXf: () => swingXf,\n    syncRoom: () => syncRoom,\n    system32Snap: () => system32Snap,\n    tallLeaves: () => tallLeaves,\n    tallParts: () => tallParts,\n    tallProvisos: () => tallProvisos,\n    tallShelves: () => tallShelves,\n    topY: () => topY,\n    touchedRoomWalls: () => touchedRoomWalls,\n    touchedWalls: () => touchedWalls,\n    tryLArm: () => tryLArm,\n    turnUnit: () => turnUnit,\n    typeName: () => typeName,\n    ulAxis: () => ulAxis,\n    ulEdges: () => ulEdges,\n    ulPlaneFor: () => ulPlaneFor,\n    ulSnapAlong: () => ulSnapAlong,\n    ulTier: () => ulTier,\n    ulWallKey: () => ulWallKey,\n    unitAlongAxis: () => unitAlongAxis,\n    unitById: () => unitById,\n    unitEnvelope: () => unitEnvelope,\n    unitLabel: () => unitLabel,\n    unitXf: () => unitXf,\n    upperLowerGuides: () => upperLowerGuides,\n    useScene: () => useScene,\n    vDivDragTo: () => vDivDragTo,\n    vSpan: () => vSpan,\n    validCues: () => validCues,\n    validateShelfList: () => validateShelfList,\n    walkAxis: () => walkAxis,\n    wallFace: () => wallFace,\n    wallFlushOf: () => wallFlushOf,\n    wallFreeSpans: () => wallFreeSpans,\n    wallOffWall: () => wallOffWall,\n    wallParts: () => wallParts,\n    wallPush: () => wallPush,\n    wallSeatOK: () => wallSeatOK,\n    wallsByDistance: () => wallsByDistance,\n    withFinishing: () => withFinishing,\n    withInterior: () => withInterior,\n    worldToLocal: () => worldToLocal,\n    yawOf: () => yawOf,\n    zonesHeld: () => zonesHeld\n  });\n\n  // v2/src/model/context.js\n  var UID = 1;\n  function nextUid() {\n    return UID++;\n  }\n  function setUid(n) {\n    UID = n;\n    return UID;\n  }\n  var UB_SCENE = null;\n  function useScene(sc) {\n    UB_SCENE = sc;\n    return sc;\n  }\n  var ROOM = { wallZ: 0, minX: -900, maxX: 6600, wallTop: 2400, ret: null };\n  var WALL_HIT = { id: \"__wall\", type: \"room-wall\", family: \"room\" };\n  var MAIN_WALL = { axis: \"z\", at: 0, dir: -1 };\n\n  // v2/src/model/plan.js\n  function armA(u) {\n    return u.w;\n  }\n  function armB(u) {\n    return (u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\") && u.w2 != null ? u.w2 : u.w;\n  }\n  function planXf(u, LX, LZ) {\n    const k = ((u.rot || 0) % 4 + 4) % 4;\n    const OX = (u.x || 0) + (u.dispX || 0), OY = (u.y || 0) + (u.dispY || 0), OZ = (u.z || 0) + (u.dispZ || 0);\n    function pt(p) {\n      const x = p[0], z = p[2];\n      let rx, rz;\n      if (k === 0) {\n        rx = x;\n        rz = z;\n      } else if (k === 1) {\n        rx = LZ - z;\n        rz = x;\n      } else if (k === 2) {\n        rx = LX - x;\n        rz = LZ - z;\n      } else {\n        rx = z;\n        rz = LX - x;\n      }\n      return [rx + OX, p[1] + OY, rz + OZ];\n    }\n    function nrm(n) {\n      const nx = n[0], nz = n[2];\n      if (k === 0) return [nx, n[1], nz];\n      if (k === 1) return [-nz, n[1], nx];\n      if (k === 2) return [-nx, n[1], -nz];\n      return [nz, n[1], -nx];\n    }\n    return { p: pt, n: nrm, spanX: k % 2 ? LZ : LX, spanZ: k % 2 ? LX : LZ };\n  }\n  function swingXf(hx, hz, ang) {\n    const c = Math.cos(ang), sn = Math.sin(ang);\n    return {\n      p: function(p) {\n        const dx = p[0] - hx, dz = p[2] - hz;\n        return [hx + dx * c - dz * sn, p[1], hz + dx * sn + dz * c];\n      },\n      n: function(n) {\n        return [n[0] * c - n[2] * sn, n[1], n[0] * sn + n[2] * c];\n      }\n    };\n  }\n  function composeXf(outer, inner) {\n    return {\n      p: function(p) {\n        return outer.p(inner.p(p));\n      },\n      n: function(n) {\n        return outer.n(inner.n(n));\n      }\n    };\n  }\n  function isLPlan(u) {\n    return u && (u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\");\n  }\n  function unitEnvelope(u) {\n    if (isLPlan(u)) return { LX: armA(u), LZ: armB(u) };\n    return u.family === \"corner\" ? cornerEnvelope(u) : { LX: u.w, LZ: u.d };\n  }\n  function unitXf(u) {\n    const E = unitEnvelope(u);\n    return planXf(u, E.LX, E.LZ);\n  }\n  function cornerEnvelope(u) {\n    if (u.type === \"corner-l\" || u.type === \"corner-tall\") return { LX: armA(u), LZ: armB(u) };\n    return { LX: u.w, LZ: u.d };\n  }\n\n  // v2/src/model/corner-shelves.js\n  var CORNER_SHELF = { sb: SHELF_FRONT_SETBACK, gap: SHELF_SIDE_GAP, minDepth: SHELF_MIN_DEPTH };\n  var CORNER_SHELF_SUPPORT_NOTE = \"Corner shelf supports are not specified yet - the workshop confirms how an L shelf is carried; no shelf-pin holes are drilled for it.\";\n  function isCornerShelfUnit(u) {\n    return !!u && (u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\");\n  }\n  var clampN = (v, lo, hi) => v < lo ? lo : v > hi ? hi : v;\n  var num = (v) => {\n    const n = Number(v);\n    return v != null && v !== \"\" && isFinite(n) ? n : null;\n  };\n  function cornerShelfFrameOf(A1, A2, H2, D2) {\n    const G = SHELF_SIDE_GAP;\n    return {\n      A1,\n      A2,\n      H: H2,\n      D: D2,\n      ix: A1 - D2,\n      y0: T,\n      y1: H2 - T,\n      // the inside: bottom board's top .. top board / rails' underside\n      rearA: T,\n      rearB: A1 - T,\n      // the backs' inside faces\n      endA: T + G,\n      endB: A2 - T - G,\n      // 1 mm side play off each end panel\n      maxSb: Math.max(0, D2 - T - SHELF_MIN_DEPTH)\n    };\n  }\n  function cornerShelfFrame(u) {\n    return isCornerShelfUnit(u) ? cornerShelfFrameOf(u.w, u.w2 != null ? u.w2 : u.w, u.h, u.d) : null;\n  }\n  function cornerStockY(H2) {\n    return Math.round((H2 - T) / 2) - T;\n  }\n  var CORNER_TALL_SHELVES = 5;\n  function cornerStockYs(H2, tall) {\n    if (!tall) return [cornerStockY(H2)];\n    const out = [];\n    for (let i = 1; i <= CORNER_TALL_SHELVES; i++) out.push(Math.round(T + (H2 - 2 * T) * i / (CORNER_TALL_SHELVES + 1)) - T);\n    return out;\n  }\n  function cornerShelfBoardsIn(F, s, names) {\n    const sbA = clampN(num(s && s.sbA) != null ? num(s.sbA) : CORNER_SHELF.sb, 0, F.maxSb);\n    const sbB = clampN(num(s && s.sbB) != null ? num(s.sbB) : CORNER_SHELF.sb, 0, F.maxSb);\n    const y = F.y0 + (num(s && s.y) != null ? num(s.y) : cornerStockY(F.H));\n    const zA = F.D - sbA, xB = F.ix + sbB;\n    const nA = names && names[0] || \"Shelf A\", nB = names && names[1] || \"Shelf B\";\n    return [\n      {\n        name: nA,\n        arm: \"A\",\n        x0: F.endA,\n        x1: xB,\n        y0: y,\n        y1: y + T,\n        z0: F.rearA,\n        z1: zA,\n        ex: [0, 0, 1],\n        role: \"board\",\n        front: { axis: \"z\", sign: 1, at: zA, from: F.endA, to: xB, mid: [(F.endA + xB) / 2, y + T, zA] }\n      },\n      {\n        name: nB,\n        arm: \"B\",\n        x0: xB,\n        x1: F.rearB,\n        y0: y,\n        y1: y + T,\n        z0: F.rearA,\n        z1: F.endB,\n        ex: [0, 0, 1],\n        role: \"board\",\n        front: { axis: \"x\", sign: -1, at: xB, from: zA, to: F.endB, mid: [xB, y + T, (zA + F.endB) / 2] }\n      }\n    ];\n  }\n  function cornerShelfFrontMm(boards) {\n    return boards.reduce((t, b) => t + Math.max(0, b.front.to - b.front.from), 0);\n  }\n  function cornerShelfList(u) {\n    const F = cornerShelfFrame(u);\n    if (!F) return [];\n    const src = Array.isArray(u.cornerShelves) ? u.cornerShelves : cornerStockYs(F.H, u.type === \"corner-tall\").map((y, i) => ({ id: \"S\" + (i + 1), y }));\n    const maxY = Math.max(0, F.y1 - F.y0 - T), out = [];\n    src.forEach((s, i) => {\n      if (!s) return;\n      const y = Math.round(clampN(num(s.y) != null ? num(s.y) : cornerStockY(F.H), 0, maxY));\n      if (out.some((o) => Math.abs(o.y - y) < T - 1e-3)) return;\n      const rec = { id: s.id != null ? String(s.id) : \"S\" + (i + 1), cell: \"0.0\", y, corner: true };\n      if (num(s.sbA) != null) rec.sbA = Math.round(clampN(num(s.sbA), 0, F.maxSb));\n      if (num(s.sbB) != null) rec.sbB = Math.round(clampN(num(s.sbB), 0, F.maxSb));\n      out.push(rec);\n    });\n    return out;\n  }\n  function cornerShelfName(u, entry) {\n    const L = cornerShelfList(u).slice().sort((a, b) => a.y - b.y);\n    const k = L.findIndex((s) => s.id === String(entry && entry.id));\n    if (k < 0) return null;\n    return L.length > 1 ? \"Shelf \" + (k + 1) : \"Shelf\";\n  }\n  function cornerShelfBoards(u, entry) {\n    const F = cornerShelfFrame(u), nm = cornerShelfName(u, entry);\n    if (!F || !nm) return [];\n    return cornerShelfBoardsIn(F, entry, [nm + \" A\", nm + \" B\"]).map((b) => Object.assign(b, { kind: \"shelf\", sid: entry.id, cell: \"0.0\", corner: true, pidName: nm }));\n  }\n  function cornerInteriorParts(u) {\n    return cornerShelfList(u).slice().sort((a, b) => a.y - b.y).reduce((o, s) => o.concat(cornerShelfBoards(u, s)), []);\n  }\n  function cornerShelfEdges(u, s) {\n    const F = cornerShelfFrame(u);\n    if (!F || !s) return null;\n    const B = cornerShelfBoardsIn(F, s);\n    const sbA = Math.round(F.D - B[0].z1), sbB = Math.round(B[1].x0 - F.ix);\n    return {\n      sbA,\n      sbB,\n      depthA: Math.round(B[0].z1 - B[0].z0),\n      depthB: Math.round(B[1].x1 - B[1].x0),\n      /* the shared names the straight shelf's readouts use: arm A's */\n      setback: sbA,\n      depth: Math.round(B[0].z1 - B[0].z0),\n      z0: B[0].z0,\n      z1: B[0].z1,\n      custom: s.sbA != null || s.sbB != null,\n      corner: true\n    };\n  }\n  function cornerShelfLimits(u) {\n    const F = cornerShelfFrame(u);\n    if (!F) return null;\n    return {\n      D: F.D,\n      corner: true,\n      minSetback: 0,\n      maxSetback: Math.round(F.maxSb),\n      minDepth: SHELF_MIN_DEPTH,\n      maxDepth: Math.round(F.D - T),\n      std: { setback: CORNER_SHELF.sb, z0: F.rearA, z1: F.D - CORNER_SHELF.sb },\n      whyFront: \"The front edge stops flush with the carcass front - the door shuts against it.\",\n      whyMin: \"A corner shelf is kept at least \" + SHELF_MIN_DEPTH + \" mm deep, the shallowest shelf the planner makes.\",\n      whyRear: \"A corner shelf's rear edges stay on the two backs - drag a front edge to change its depth.\"\n    };\n  }\n  function writeList(u, list) {\n    u.cornerShelves = list.map((s) => {\n      const r = { id: s.id, y: s.y };\n      if (s.sbA != null) r.sbA = s.sbA;\n      if (s.sbB != null) r.sbB = s.sbB;\n      return r;\n    });\n  }\n  function cornerShelfRange(u, id) {\n    const F = cornerShelfFrame(u);\n    if (!F) return null;\n    return { min: 0, max: Math.max(0, F.y1 - F.y0 - T), others: cornerShelfList(u).filter((s) => s.id !== String(id)) };\n  }\n  function legalY(R4, y) {\n    if (y < R4.min - 1e-3 || y > R4.max + 1e-3) return false;\n    return !R4.others.some((o) => Math.abs(o.y - y) < T - 1e-3);\n  }\n  function cornerShelfSnap(R4, want) {\n    const w = clampN(want, R4.min, R4.max);\n    const grid = (v) => PIN_INSET + Math.max(0, Math.round((v - PIN_INSET) / PIN_PITCH)) * PIN_PITCH;\n    const tries = [];\n    for (let k = -64; k <= 64; k++) {\n      const g2 = grid(w) + k * PIN_PITCH;\n      if (g2 >= PIN_INSET && g2 >= R4.min - 1e-3 && g2 <= R4.max + 1e-3) tries.push(g2);\n    }\n    tries.sort((a, b) => Math.abs(a - w) - Math.abs(b - w));\n    for (const g2 of tries) if (legalY(R4, g2)) return Math.round(g2);\n    return null;\n  }\n  function cornerShelfMoveTo(u, id, wantY) {\n    if (!isCornerShelfUnit(u)) return { ok: false, why: \"Not a corner cabinet.\" };\n    const list = cornerShelfList(u), at = list.findIndex((s) => s.id === String(id));\n    if (at < 0) return { ok: false, why: \"That shelf is not there any more.\" };\n    const R4 = cornerShelfRange(u, id), y = cornerShelfSnap(R4, Number(wantY));\n    if (y == null) return { ok: false, why: \"No shelf height there leaves room above and below.\" };\n    list[at] = Object.assign({}, list[at], { y });\n    writeList(u, list);\n    return { ok: true, id: list[at].id, y, min: R4.min, max: R4.max };\n  }\n  function cornerShelfSetEdges(u, id, want, mode) {\n    if (!isCornerShelfUnit(u)) return { ok: false, why: \"Not a corner cabinet.\" };\n    const F = cornerShelfFrame(u), Lm = cornerShelfLimits(u);\n    const list = cornerShelfList(u), at = list.findIndex((s) => s.id === String(id));\n    if (at < 0) return { ok: false, why: \"That shelf is not there any more.\" };\n    const arm = want && (want.arm === \"A\" || want.arm === \"B\") ? want.arm : \"both\";\n    let sb;\n    if (mode === \"depth\") {\n      const d = num(want && want.depth);\n      if (d == null) return { ok: false, why: \"Type the shelf depth in millimetres.\" };\n      sb = F.D - T - d;\n    } else {\n      const v = num(want && want.setback);\n      if (v == null) return { ok: false, why: \"Type the front setback in millimetres.\" };\n      sb = v;\n    }\n    let clamped = null;\n    if (sb < -1e-3) {\n      sb = 0;\n      clamped = Lm.whyFront;\n    }\n    if (sb > F.maxSb + 1e-3) {\n      sb = F.maxSb;\n      clamped = Lm.whyMin;\n    }\n    sb = Math.round(sb);\n    const rec = Object.assign({}, list[at]);\n    for (const a of arm === \"both\" ? [\"A\", \"B\"] : [arm]) {\n      if (sb === CORNER_SHELF.sb) delete rec[\"sb\" + a];\n      else rec[\"sb\" + a] = sb;\n    }\n    list[at] = rec;\n    writeList(u, list);\n    const E = cornerShelfEdges(u, rec);\n    return {\n      ok: true,\n      id: rec.id,\n      arm,\n      setback: arm === \"B\" ? E.sbB : E.sbA,\n      depth: arm === \"B\" ? E.depthB : E.depthA,\n      sbA: E.sbA,\n      sbB: E.sbB,\n      depthA: E.depthA,\n      depthB: E.depthB,\n      clamped,\n      min: { setback: 0, depth: SHELF_MIN_DEPTH },\n      max: { setback: Lm.maxSetback, depth: Lm.maxDepth }\n    };\n  }\n  function cornerShelfGaps(u, y, selfId) {\n    const F = cornerShelfFrame(u);\n    if (!F) return null;\n    const y0 = F.y0 + y, y1 = y0 + T;\n    let floor = F.y0, ceil = F.y1;\n    for (const s of cornerShelfList(u)) {\n      if (s.id === String(selfId)) continue;\n      const a = F.y0 + s.y, b = a + T;\n      if (b <= y0 + 1e-3 && b > floor) floor = b;\n      if (a >= y1 - 1e-3 && a < ceil) ceil = a;\n    }\n    const B = cornerShelfBoardsIn(F, cornerShelfList(u).filter((s) => s.id === String(selfId))[0] || { y });\n    return { below: y0 - floor, above: ceil - y1, floor, ceil, y0, y1, x: (B[0].x0 + B[0].x1) / 2, corner: true };\n  }\n  function extrasOf(boards) {\n    return {\n      a18: boards.reduce((t, b) => t + (b.x1 - b.x0) * (b.z1 - b.z0), 0) / 1e6,\n      edgeM: cornerShelfFrontMm(boards) / 1e3\n    };\n  }\n  function cornerShelfExtras(u) {\n    if (!isCornerShelfUnit(u)) return { a18: 0, edgeM: 0 };\n    const F = cornerShelfFrame(u);\n    return extrasOf(cornerShelfList(u).reduce((o, s) => o.concat(cornerShelfBoardsIn(F, s)), []));\n  }\n  function cornerShelfStockExtras(u) {\n    if (!isCornerShelfUnit(u)) return { a18: 0, edgeM: 0 };\n    const F = cornerShelfFrame(u);\n    return extrasOf(cornerStockYs(F.H, u.type === \"corner-tall\").reduce((o, y) => o.concat(cornerShelfBoardsIn(F, { y })), []));\n  }\n  function cloneCornerShelves(list) {\n    return (list || []).filter(Boolean).map((s, i) => {\n      const r = { id: \"S\" + (i + 1), y: s.y };\n      if (s.sbA != null) r.sbA = s.sbA;\n      if (s.sbB != null) r.sbB = s.sbB;\n      return r;\n    });\n  }\n\n  // v2/src/model/corners.js\n  var CORNER = {\n    limits: { w: [900, 1500], h: [600, 900], d: [450, 700] },\n    // BLIND corner\n    lLimits: { w: [900, ARM_CEIL], w2: [900, ARM_CEIL], h: [600, 900], d: [450, 700] },\n    /* the L WALL corner: wall-unit heights and depths, but ARM lengths that\n       are a run, not a single front */\n    wallArmLimits: { w: [300, ARM_CEIL], w2: [300, ARM_CEIL], h: [300, 900], d: [200, 400] },\n    defaultW: 1200,\n    defaultH: 720,\n    defaultD: 600,\n    // #16923\n    blindLen: 680,\n    // partition front edge from the blind end (#16923)\n    doorGap: 3,\n    // reveal, #16923 drawer/door convention\n    innerGap: 24,\n    // L: inner-corner clearance between the two doors\n    minOpening: 300\n    // each arm must leave this much door beyond the depth\n  };\n  var CORNER_TALL = { limits: { w: [900, ARM_CEIL], w2: [900, ARM_CEIL], h: [1970, 2150], d: [450, 650] } };\n  function cornerLegCentres(u) {\n    const W2 = u.w, D2 = u.d;\n    if (u.type === \"corner-l\" || u.type === \"corner-tall\") {\n      const A1 = armA(u), A2 = armB(u), ix = A1 - D2, IN = LEG_FRONT_INSET;\n      return [\n        [75, 75],\n        [A1 - 75, 75],\n        [A1 - 75, A2 - 75],\n        [ix + IN, A2 - 75],\n        [ix + IN, D2 - IN],\n        [75, D2 - IN]\n      ];\n    }\n    let c = [[75, 55 + T], [W2 - 75, 55 + T], [75, D2 - LEG_FRONT_INSET], [W2 - 75, D2 - LEG_FRONT_INSET]];\n    if (u.hand === \"right\") c = c.map(function(p) {\n      return [W2 - p[0], p[1]];\n    });\n    return c;\n  }\n  function cornerLegWorld(u) {\n    const E = cornerEnvelope(u), xf = planXf(u, E.LX, E.LZ);\n    return cornerLegCentres(u).map(function(p) {\n      const q = xf.p([p[0], 0, p[1]]);\n      return [q[0], q[2]];\n    });\n  }\n  function cornerDoorSlabs(u) {\n    const W2 = u.w, H2 = u.h, D2 = u.d, g2 = CORNER.doorGap, out = [];\n    if (u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\") {\n      const LD = cornerLDoors(armA(u), armB(u), H2, D2);\n      out.push({\n        name: \"Door A\",\n        x0: LD.a.x0,\n        x1: LD.a.x1,\n        y0: g2,\n        y1: H2 - g2,\n        z0: LD.a.z,\n        z1: LD.a.z + T,\n        hx: LD.a.x0,\n        hz: LD.a.z,\n        sign: 1\n      });\n      out.push({\n        name: \"Door B\",\n        x0: LD.b.x - T,\n        x1: LD.b.x,\n        y0: g2,\n        y1: H2 - g2,\n        z0: LD.b.z0,\n        z1: LD.b.z1,\n        hx: LD.b.x,\n        hz: LD.b.z1,\n        sign: -1\n      });\n      return out;\n    }\n    const BD = cornerBlindDoor(W2, H2, D2);\n    if (u.hand === \"right\") {\n      out.push({\n        name: \"Door\",\n        x0: W2 - BD.x1,\n        x1: W2 - BD.x0,\n        y0: BD.y0,\n        y1: BD.y1,\n        z0: BD.z,\n        z1: BD.z + T,\n        hx: W2 - BD.x1,\n        hz: BD.z,\n        sign: 1\n      });\n    } else {\n      out.push({\n        name: \"Door\",\n        x0: BD.x0,\n        x1: BD.x1,\n        y0: BD.y0,\n        y1: BD.y1,\n        z0: BD.z,\n        z1: BD.z + T,\n        hx: BD.x1,\n        hz: BD.z,\n        sign: -1\n      });\n    }\n    return out;\n  }\n  function cornerLParts(A1, A2, H2, D2) {\n    const p = [];\n    function box3(n, x0, x1, y0, y1, z0, z1, ex, role) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: role || \"board\" });\n    }\n    const ix = A1 - D2;\n    box3(\"End A\", 0, T, 0, H2, 0, D2, [-1, 0, 0]);\n    box3(\"End B\", ix, A1, 0, H2, A2 - T, A2, [0, 0, 1]);\n    box3(\"Back A\", T, A1, 0, H2, 0, T, [0, 0, -1]);\n    box3(\"Back B\", A1 - T, A1, 0, H2, T, A2 - T, [1, 0, 0]);\n    box3(\"Bottom A\", T, A1 - T, 0, T, T, D2, [0, -1, 0]);\n    box3(\"Bottom B\", ix, A1 - T, 0, T, D2, A2 - T, [0, -1, 0]);\n    box3(\"Rail rear A\", T, A1 - T, H2 - T, H2, T, T + RAIL_D, [0, 1, -0.6]);\n    box3(\"Rail rear B\", A1 - T - RAIL_D, A1 - T, H2 - T, H2, T + RAIL_D, A2 - T, [0.6, 1, 0]);\n    box3(\"Rail front A\", T, ix, H2 - T, H2, D2 - RAIL_D, D2, [0, 1, 0.6]);\n    box3(\"Rail front B\", ix, ix + RAIL_D, H2 - T, H2, D2, A2 - T, [-0.6, 1, 0]);\n    cornerShelfBoardsIn(cornerShelfFrameOf(A1, A2, H2, D2), { y: cornerStockY(H2) }).forEach(function(b) {\n      box3(b.name, b.x0, b.x1, b.y0, b.y1, b.z0, b.z1, b.ex);\n    });\n    return p;\n  }\n  function doorLeaves(u) {\n    if (!u || !u.door) return 0;\n    if (u.type !== \"base\" && u.type !== \"wall\") return 1;\n    return u.doors === 2 ? 2 : 1;\n  }\n  function leafPlan(u, W2, H2) {\n    const gap = REVEAL;\n    const half = (W2 - 2 * REVEAL - gap) / 2;\n    return [\n      { x0: REVEAL, x1: REVEAL + half, hx: REVEAL, sign: 1 },\n      // hinged left\n      { x0: W2 - REVEAL - half, x1: W2 - REVEAL, hx: W2 - REVEAL, sign: -1 }\n      // hinged right\n    ];\n  }\n  function cornerLWallParts(A1, A2, H2, D2) {\n    const p = [];\n    function box3(n, x0, x1, y0, y1, z0, z1, ex, role) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: role || \"board\" });\n    }\n    const ix = A1 - D2;\n    box3(\"End A\", 0, T, 0, H2, 0, D2, [-1, 0, 0]);\n    box3(\"End B\", ix, A1, 0, H2, A2 - T, A2, [0, 0, 1]);\n    box3(\"Back A\", T, A1, 0, H2, 0, T, [0, 0, -1]);\n    box3(\"Back B\", A1 - T, A1, 0, H2, T, A2 - T, [1, 0, 0]);\n    box3(\"Bottom A\", T, A1 - T, 0, T, T, D2, [0, -1, 0]);\n    box3(\"Bottom B\", ix, A1 - T, 0, T, D2, A2 - T, [0, -1, 0]);\n    box3(\"Top A\", T, A1 - T, H2 - T, H2, T, D2, [0, 1, 0]);\n    box3(\"Top B\", ix, A1 - T, H2 - T, H2, D2, A2 - T, [0, 1, 0]);\n    cornerShelfBoardsIn(cornerShelfFrameOf(A1, A2, H2, D2), { y: cornerStockY(H2) }).forEach(function(b) {\n      box3(b.name, b.x0, b.x1, b.y0, b.y1, b.z0, b.z1, b.ex);\n    });\n    return p;\n  }\n  function cornerLTallParts(A1, A2, H2, D2, shelves) {\n    const p = cornerLWallParts(A1, A2, H2, D2).filter(function(b) {\n      return !/^Shelf/.test(b.name);\n    });\n    const F = cornerShelfFrameOf(A1, A2, H2, D2), ys = shelves || cornerStockYs(H2, true);\n    ys.forEach(function(y, k) {\n      const nm = ys.length > 1 ? \"Shelf \" + (k + 1) : \"Shelf\";\n      cornerShelfBoardsIn(F, { y }, [nm + \" A\", nm + \" B\"]).forEach(function(b) {\n        p.push({ name: b.name, x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1, z0: b.z0, z1: b.z1, ex: b.ex, role: \"board\" });\n      });\n    });\n    return p;\n  }\n  function cornerLDoors(A1, A2, H2, D2) {\n    const g2 = CORNER.doorGap, ic = CORNER.innerGap, ix = A1 - D2;\n    return {\n      h: H2 - 2 * g2,\n      a: { w: A1 - D2 - ic - g2, x0: g2, x1: ix - ic, z: D2 },\n      // faces +Z\n      b: { w: A2 - D2 - ic - g2, z0: D2 + ic, z1: A2 - g2, x: ix }\n      // faces -X\n    };\n  }\n  function mirrorPartsX(parts, W2) {\n    return parts.map(function(b) {\n      return {\n        name: b.name,\n        x0: W2 - b.x1,\n        x1: W2 - b.x0,\n        y0: b.y0,\n        y1: b.y1,\n        z0: b.z0,\n        z1: b.z1,\n        ex: [-b.ex[0], b.ex[1], b.ex[2]],\n        role: b.role\n      };\n    });\n  }\n  function cornerBlindParts(W2, H2, D2) {\n    const p = [];\n    function box3(n, x0, x1, y0, y1, z0, z1, ex, role) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: role || \"board\" });\n    }\n    const bl = Math.min(CORNER.blindLen, W2 - 300);\n    box3(\"Side blind end\", 0, T, 0, H2, 0, D2, [-1, 0, 0]);\n    box3(\"Side open end\", W2 - T, W2, 0, H2, 0, D2, [1, 0, 0]);\n    box3(\"Back\", T, W2 - T, 0, H2, 0, T, [0, 0, -1]);\n    box3(\"Bottom\", T, W2 - T, 0, T, T, D2, [0, -1, 0]);\n    box3(\"Blanking panel\", T, bl, T, H2 - T, D2 - T, D2, [0, 0, 1]);\n    box3(\"Rail rear\", T, W2 - T, H2 - T, H2, T, T + RAIL_D, [0, 1, -0.6]);\n    box3(\"Rail front\", bl, W2 - T, H2 - T, H2, D2 - RAIL_D, D2, [0, 1, 0.6]);\n    return p;\n  }\n  function cornerBlindDoor(W2, H2, D2) {\n    const bl = Math.min(CORNER.blindLen, W2 - 300), g2 = CORNER.doorGap;\n    return { x0: bl + g2, x1: W2 - g2, y0: g2, y1: H2 - g2, z: D2, w: W2 - bl - 2 * g2 };\n  }\n  function blindSplit(W2, H2, D2) {\n    const bl = Math.min(CORNER.blindLen, W2 - 300);\n    return {\n      blindLen: bl,\n      openingW: W2 - bl - 2 * CORNER.doorGap,\n      blindVolumeL: bl * (D2 - T) * (H2 - 2 * T) / 1e6,\n      openVolumeL: (W2 - bl - T) * (D2 - T) * (H2 - 2 * T) / 1e6\n    };\n  }\n  var LEG_FRONT_INSET = 105;\n  function legCentres(W2, D2, innerZ0) {\n    const zr = innerZ0 + 55, zf = D2 - LEG_FRONT_INSET;\n    return [[75, zr], [W2 - 75, zr], [75, zf], [W2 - 75, zf]];\n  }\n\n  // v2/src/model/workshop.js\n  var workshop_exports = {};\n  __export(workshop_exports, {\n    WORKSHOP_SCHEMA: () => WORKSHOP_SCHEMA,\n    buildWorkshopScene: () => buildWorkshopScene,\n    resizeWorkshopScene: () => resizeWorkshopScene,\n    workshopProject: () => workshopProject,\n    workshopScene: () => workshopScene\n  });\n\n  // v2/vendor/cabinet-core.mjs\n  var SHAKER_PASSES = Object.freeze([{ \"suffix\": \"rough\", \"tool\": \"40mm\", \"diameter\": 40, \"overlap\": 80 }, { \"suffix\": \"clean6\", \"tool\": \"6MMCOMPR\", \"diameter\": 6, \"overlap\": 0 }, { \"suffix\": \"clean3\", \"tool\": \"3MM\", \"diameter\": 3, \"overlap\": 0 }]);\n  function shakerPockets(door, opts = {}) {\n    const round3 = (v) => Math.round(Number(v) * 1e3) / 1e3;\n    const nope = (why) => ({ pockets: null, error: `Shaker door: ${why}` });\n    const L = Number(door && door.length);\n    const W2 = Number(door && door.width);\n    if (!(L > 0) || !(W2 > 0)) return nope(\"the door has no size.\");\n    const frame2 = Number(opts.frame) > 0 ? Number(opts.frame) : 80;\n    const panels = Math.max(1, Math.round(Number(opts.panels) || 1));\n    const rail = Number(opts.rail) > 0 ? Number(opts.rail) : frame2;\n    const depth = Number(opts.depth) > 0 ? Number(opts.depth) : 6;\n    const radius = Number(opts.radius) >= 0 ? Number(opts.radius) : 0;\n    const roughOverlap = Number(opts.overlap) > 0 ? Number(opts.overlap) : null;\n    const passes = Array.isArray(opts.passes) && opts.passes.length ? opts.passes : SHAKER_PASSES;\n    for (let k = 0; k < passes.length; k += 1) {\n      const ps = passes[k] || {};\n      const ov = Number(ps.overlap);\n      if (!String(ps.tool || \"\").trim() || !(Number(ps.diameter) > 0) || ps.overlap === void 0 || ps.overlap === null || ps.overlap === \"\" || !Number.isFinite(ov) || ov < 0 || ov >= 100) {\n        return nope(`pass ${k + 1} needs a tool name, its diameter and an overlap of 0-99%.`);\n      }\n    }\n    const inner = W2 - 2 * frame2;\n    if (inner <= 0) {\n      return nope(`a ${frame2} mm frame on both sides leaves nothing of a ${W2} mm door. Make the frame narrower, or the door wider.`);\n    }\n    const spare = L - 2 * frame2 - (panels - 1) * rail;\n    if (spare <= 0) {\n      return nope(`a ${frame2} mm frame and ${panels - 1} rail(s) of ${rail} mm leave nothing of a ${L} mm door. Reduce the frame, the rail, or the number of panels.`);\n    }\n    const edges = [];\n    if (panels === 2 && Number(opts.railAt) !== 0) {\n      const at = Number(opts.railAt) > 0 ? Number(opts.railAt) : 900;\n      const lo = frame2;\n      const hi = L - frame2;\n      const a = at - rail / 2;\n      const b = at + rail / 2;\n      if (a <= lo || b >= hi) {\n        return nope(`the rail at ${at} mm does not fit between the ${frame2} mm frames of a ${L} mm door. Move it, or make the frame narrower.`);\n      }\n      edges.push([lo, a], [b, hi]);\n    } else {\n      const each = spare / panels;\n      let at = frame2;\n      for (let i = 0; i < panels; i += 1) {\n        edges.push([at, at + each]);\n        at += each + rail;\n      }\n    }\n    const widest = Math.max(...passes.map((ps) => Number(ps.diameter)));\n    for (let i = 0; i < edges.length; i += 1) {\n      const short = Math.min(edges[i][1] - edges[i][0], inner);\n      if (!(short > widest)) {\n        return nope(`panel ${i + 1} is ${round3(short)} mm across \\u2014 not enough for the \\u2300${widest} mm cutter. Make the frame or the rail narrower, or use fewer panels.`);\n      }\n    }\n    const pockets = [];\n    edges.forEach(([a, b], i) => {\n      passes.forEach((ps, k) => {\n        const dia = Number(ps.diameter);\n        const ov = Number(ps.overlap);\n        pockets.push({\n          kind: \"pocket\",\n          id: `shaker-${i + 1}-${String(ps.suffix || `pass${k + 1}`)}`,\n          x: round3((a + b) / 2),\n          y: round3(frame2 + inner / 2),\n          length: round3(b - a),\n          width: round3(inner),\n          // \u0423\u0413\u041E\u041B \u041D\u0415 \u041E\u0421\u0422\u0420\u0415\u0415 \u0424\u0420\u0415\u0417\u042B (pocketCutterRadiusFault): \u0440\u0430\u0434\u0438\u0443\u0441 8 \u0443 \u230040 \u2014 \u043E\u0442\u043A\u0430\u0437 \u0444\u0430\u0439\u043B\u0430. \u0427\u0435\u0440\u043D\u043E\u0432\u043E\u0439\n          // \u043F\u0440\u043E\u0445\u043E\u0434 \u0431\u0435\u0440\u0451\u0442 \u0441\u0432\u043E\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u0444\u0440\u0435\u0437\u044B, \u0447\u0438\u0441\u0442\u043E\u0432\u044B\u0435 \u2014 \u043D\u0430\u0437\u0432\u0430\u043D\u043D\u044B\u0439; \u043D\u043E\u043B\u044C \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043D\u0443\u043B\u0451\u043C (\u00AB\u0443\u0433\u043E\u043B\n          // \u043A\u0430\u043A \u0443 \u0444\u0440\u0435\u0437\u044B\u00BB) \u0443 \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445.\n          radius: radius > 0 ? Math.max(radius, dia / 2) : 0,\n          depth,\n          overlap: ov > 0 && roughOverlap !== null ? roughOverlap : ov,\n          tool: String(ps.tool).trim(),\n          diameter: dia\n        });\n      });\n    });\n    return { pockets, panels: edges.length, error: null };\n  }\n  var MATERIALS2 = [\n    { id: \"mfc-white-18\", name: \"MFC White 18 mm\", thickness: 18, color: \"#e9e7e0\", texture: \"plain\", grain: false, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    // A SECOND WHITE, NOT THE SAME BOARD. The Shopify Cabinet Lab sells Egger W1000 ST9 Premium White\n    // (its \"white\", made here as MFC White) and Egger W1100 ST9 Alpine White (its \"w1100\"); two decors\n    // must not be nested onto one sheet, so the second has its own board (labConvert.js, 03.10.2026).\n    { id: \"mfc-w1100-18\", name: \"MFC Alpine White W1100 18 mm\", thickness: 18, color: \"#f3f3f0\", texture: \"plain\", grain: false, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    { id: \"mfc-white-16\", name: \"MFC White 16 mm\", thickness: 16, color: \"#e9e7e0\", texture: \"plain\", grain: false, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    { id: \"mfc-grey-18\", name: \"MFC Light Grey 18 mm\", thickness: 18, color: \"#c2c5c8\", texture: \"plain\", grain: false, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    { id: \"mfc-anthracite-18\", name: \"MFC Anthracite 18 mm\", thickness: 18, color: \"#3e4245\", texture: \"plain\", grain: false, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    { id: \"mfc-oak-18\", name: \"MFC Natural Oak 18 mm\", thickness: 18, color: \"#c9a97a\", texture: \"wood\", grain: true, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    { id: \"mfc-walnut-18\", name: \"MFC Walnut 18 mm\", thickness: 18, color: \"#6b4a33\", texture: \"wood\", grain: true, sheet: { length: 2800, width: 2070 }, group: \"MFC\" },\n    { id: \"mdf-18\", name: \"MDF 18 mm\", thickness: 18, color: \"#b9946a\", texture: \"plain\", grain: false, sheet: { length: 2440, width: 1220 }, group: \"MDF\" },\n    { id: \"mdf-22\", name: \"MDF 22 mm\", thickness: 22, color: \"#b9946a\", texture: \"plain\", grain: false, sheet: { length: 2440, width: 1220 }, group: \"MDF\" },\n    { id: \"mdf-25\", name: \"MDF 25 mm\", thickness: 25, color: \"#b9946a\", texture: \"plain\", grain: false, sheet: { length: 2440, width: 1220 }, group: \"MDF\" },\n    { id: \"mrmdf-18\", name: \"Moisture Resistant MDF 18 mm\", thickness: 18, color: \"#9fb08a\", texture: \"plain\", grain: false, sheet: { length: 2440, width: 1220 }, group: \"MDF\" },\n    { id: \"ply-18\", name: \"Birch Plywood 18 mm\", thickness: 18, color: \"#e3c99a\", texture: \"wood\", grain: true, sheet: { length: 2440, width: 1220 }, group: \"Plywood\" },\n    { id: \"ply-12\", name: \"Birch Plywood 12 mm\", thickness: 12, color: \"#e3c99a\", texture: \"wood\", grain: true, sheet: { length: 2440, width: 1220 }, group: \"Plywood\" },\n    { id: \"hdf-3-white\", name: \"HDF 3 mm White (back)\", thickness: 3, color: \"#eeeee9\", texture: \"plain\", grain: false, sheet: { length: 2440, width: 1220 }, group: \"Backs\" },\n    { id: \"mdf-6\", name: \"MDF 6 mm (back)\", thickness: 6, color: \"#c2a27a\", texture: \"plain\", grain: false, sheet: { length: 2440, width: 1220 }, group: \"Backs\" },\n    { id: \"ply-6\", name: \"Plywood 6 mm (back)\", thickness: 6, color: \"#e8d3a8\", texture: \"wood\", grain: true, sheet: { length: 2440, width: 1220 }, group: \"Backs\" },\n    // Worktops are their own boards: thick, long, narrow blanks, never cut from a carcass sheet.\n    // A 38 mm laminate blank is 3000 \u00D7 600 (4100 exists but is not stocked here); solid oak 40 mm\n    // comes 3000 \u00D7 620. The audit of 14.09.2026 found the old `worktop.thickness` field dead \u2014 the\n    // thickness always came from the board \u2014 so the board now IS the thickness.\n    // A worktop is bought 650 wide and cut to length: 600 of cabinet, the overhang at the front, and\n    // the saw's own trim off both edges. At 600 wide the board could not hold a 596 mm worktop once\n    // the 10 mm trim came off each side, and the part fell out of the nesting (found 15.09.2026).\n    { id: \"worktop-lam-38\", name: \"Laminate worktop 38 mm\", thickness: 38, color: \"#8d8478\", texture: \"plain\", grain: false, sheet: { length: 3e3, width: 650 }, group: \"Worktops\" },\n    { id: \"worktop-oak-40\", name: \"Solid oak worktop 40 mm\", thickness: 40, color: \"#c69a62\", texture: \"wood\", grain: true, sheet: { length: 3e3, width: 650 }, group: \"Worktops\" }\n  ];\n  var BY_ID = new Map(MATERIALS2.map((m) => [m.id, m]));\n  var DECOR_ID = /^egger-([a-z])(\\d{3,4})-([a-z]{2}\\d{0,2})-18(-g)?$/;\n  function decorMaterial(id) {\n    const m = DECOR_ID.exec(String(id || \"\"));\n    if (!m) return null;\n    const grain = !!m[4];\n    return {\n      id,\n      name: `Egger ${(m[1] + m[2]).toUpperCase()} ${m[3].toUpperCase()} 18 mm`,\n      thickness: 18,\n      color: \"#d8d3cb\",\n      texture: grain ? \"wood\" : \"plain\",\n      grain,\n      sheet: { length: 2800, width: 2070 },\n      group: \"MFC\",\n      decor: true\n    };\n  }\n  function materialById(id) {\n    if (BY_ID.has(id)) return BY_ID.get(id);\n    const d = decorMaterial(id);\n    if (d) {\n      BY_ID.set(id, d);\n      return d;\n    }\n    return MATERIALS2[0];\n  }\n  function worktopMaterials() {\n    return MATERIALS2.filter((m) => m.group === \"Worktops\" || m.thickness >= 22 && m.group !== \"Backs\");\n  }\n  var HINGES = {\n    // THE DEFAULT, and the reason it exists: this is exactly what the prototype drilled before the\n    // catalogue, so every project made until today builds byte for byte. It is a generic 35 mm\n    // pattern \u2014 true of most hinges, exact for none \u2014 and it is named as such rather than being\n    // passed off as somebody's product.\n    \"generic-35\": {\n      id: \"generic-35\",\n      name: \"Concealed hinge, generic 35 mm cup\",\n      source: \"what this prototype drilled before the catalogue; a generic 32 mm-system pattern\",\n      cupDia: 35,\n      cupDepth: 12.5,\n      cupInset: 21.5,\n      dowels: null,\n      // none: the cup is screwed, not dowelled\n      plateDia: 5,\n      plateDepth: 12,\n      plateInset: 37,\n      plateSpacing: 32,\n      openingAngle: 110\n    },\n    // Blum CLIP top, the hinge a British kitchen shop reaches for by default.\n    // Cup \u00D835 at 12.5 deep and a boring distance of 22.5 mm are from the CLIP top drilling data;\n    // \"45/9.5\" is Blum's own shorthand on that sheet for the pre-mounted dowels \u2014 45 mm between\n    // them, 9.5 mm from the cup's centre line towards the door edge \u2014 and that is how it is read\n    // here. The mounting plate is the standard cross plate on System 32: two \u00D85 holes 32 mm apart,\n    // 37 mm back from the front edge.\n    \"blum-clip-top\": {\n      id: \"blum-clip-top\",\n      name: \"Blum CLIP top 110\\xB0\",\n      source: \"Blum CLIP top drilling data (cup \\xD835 \\xD7 12.5, boring distance 22.5, dowels 45/9.5)\",\n      cupDia: 35,\n      cupDepth: 12.5,\n      cupInset: 22.5,\n      dowels: { dia: 8, depth: 12, spacing: 45, offset: 9.5 },\n      plateDia: 5,\n      plateDepth: 12,\n      plateInset: 37,\n      plateSpacing: 32,\n      openingAngle: 110\n    },\n    // A plain Euro hinge \u2014 the unbranded 35 mm hinge sold by the box. Cup \u00D835 \u00D7 13.5 at 22 mm and\n    // the two \u00D82.5 screw holes are the common pattern for these; the 48 mm between the screw\n    // holes is a GUESS (the cheap hinges vary, and no data sheet comes in the box). Anyone cutting\n    // for a real box of these should measure one first.\n    \"euro-35\": {\n      id: \"euro-35\",\n      name: \"Euro hinge 35 mm\",\n      source: \"generic 35 mm Euro hinge; screw-hole spacing is a GUESS\",\n      cupDia: 35,\n      cupDepth: 13.5,\n      cupInset: 22,\n      dowels: { dia: 2.5, depth: 10, spacing: 48, offset: 0, guess: true },\n      plateDia: 5,\n      plateDepth: 12,\n      plateInset: 37,\n      plateSpacing: 32,\n      openingAngle: 100\n    }\n  };\n  var RUNNERS = {\n    // THE DEFAULT: the side-mounted runner this prototype has always drilled \u2014 two \u00D85 holes in the\n    // upright, 37 mm in from each end of the box, on the box's centre line, and 13 mm of clearance\n    // each side for the runner's own thickness.\n    \"side-mount\": {\n      id: \"side-mount\",\n      name: \"Side-mounted runner\",\n      source: \"what this prototype drilled before the catalogue; 13 mm a side is the usual ball-bearing runner\",\n      mount: \"side\",\n      holeDia: 5,\n      holeDepth: 12,\n      frontInset: 37,\n      backInset: 37,\n      sideClearance: 13,\n      // per side: the box is 26 mm narrower than its opening\n      heightRef: \"box-centre\",\n      boxBack: null\n    },\n    // Undermount \u2014 the British norm in a fitted kitchen, and the reason this catalogue was asked\n    // for. The runner lies UNDER the box, so the box is only 10 mm narrower than the opening\n    // (5 mm a side) instead of 26, and the cabinet holes sit near the bottom of the box rather\n    // than on its centre line. The two \u00D85 holes 37 mm from the front are System 32, as on the\n    // side-mounted runner. GUESSED, and marked as such: the 9.5 mm from the box's underside to\n    // the hole line, and the locking-device holes in the drawer back (\u00D810, 37 mm in from each\n    // side). Blum's Tandem sheet gives these per runner length and per box height; without the\n    // sheet in front of me they are a starting point to check against a real runner, not a\n    // schedule to cut from.\n    //\n    // The locking holes' HEIGHT is not given as a number from the bottom edge, and deliberately.\n    // Drawn that way (9.5 mm, the same as the cabinet holes) the first drawing showed a \u00D810 hole\n    // sitting astride the drawer-bottom groove \u2014 a hole that would break out into the groove and\n    // ruin the back. The height is stated instead as a clearance ABOVE the groove, so it follows\n    // the bottom thickness and the groove height of whatever project is being cut, and can never\n    // land in the groove. The 2 mm of clearance is itself a guess; the safety is not.\n    undermount: {\n      id: \"undermount\",\n      name: \"Undermount runner (soft close)\",\n      source: \"undermount practice; hole height and locking-device holes are GUESSES\",\n      mount: \"under\",\n      holeDia: 5,\n      holeDepth: 12,\n      frontInset: 37,\n      backInset: 37,\n      sideClearance: 5,\n      // per side: the box is 10 mm narrower than its opening\n      heightRef: \"box-bottom\",\n      heightAboveBottom: 9.5,\n      // GUESS\n      // `clearGroove`: gap from the TOP of the drawer-bottom groove to the hole's rim. GUESS.\n      boxBack: { dia: 10, depth: 12, insetFromSide: 37, clearGroove: 2, guess: true }\n    }\n  };\n  var DEFAULT_FITTINGS = Object.freeze({ hinge: \"generic-35\", runner: \"side-mount\" });\n  var hingeById = (id) => HINGES[id] || HINGES[DEFAULT_FITTINGS.hinge];\n  var runnerById = (id) => RUNNERS[id] || RUNNERS[DEFAULT_FITTINGS.runner];\n  var CUTOUT_PANELS = [\"side-left\", \"side-right\", \"back\", \"bottom\", \"top\"];\n  var MAX_CUTOUTS = 12;\n  var MAX_POINTS = 64;\n  var ON_EDGE_MM = 0.5;\n  var r1 = (v) => Math.round(v * 10) / 10;\n  var num2 = (v) => {\n    const n = Number(v);\n    return Number.isFinite(n) ? n : null;\n  };\n  function normaliseCutouts(list) {\n    if (!Array.isArray(list)) return [];\n    const out = [];\n    list.slice(0, MAX_CUTOUTS).forEach((c, i) => {\n      if (!c || typeof c !== \"object\" || !CUTOUT_PANELS.includes(c.panel)) return;\n      const pts = (Array.isArray(c.pts) ? c.pts : []).slice(0, MAX_POINTS).map((p) => Array.isArray(p) ? [num2(p[0]), num2(p[1])] : [num2(p && p.x), num2(p && p.y)]).filter(([x, y]) => x != null && y != null).map(([x, y]) => [r1(x), r1(y)]);\n      if (pts.length > 1 && pts[0][0] === pts[pts.length - 1][0] && pts[0][1] === pts[pts.length - 1][1]) pts.pop();\n      if (pts.length < 3) return;\n      const depth = num2(c.depth);\n      const through = c.through !== false || !(depth > 0);\n      out.push({\n        id: String(c.id || `cut-${i + 1}`).slice(0, 40),\n        panel: c.panel,\n        pts,\n        through,\n        ...through ? {} : { depth: r1(depth) },\n        label: String(c.label || `cut-out ${i + 1}`).slice(0, 60)\n      });\n    });\n    return out;\n  }\n  function applyCutouts(panels, cutouts, warnings, { depth, underside = 0 }) {\n    (cutouts || []).forEach((c) => {\n      const p = panels.find((q) => q.role === c.panel);\n      if (!p) {\n        warnings.push(`${c.label}: this cabinet has no ${c.panel.replace(\"-\", \" \")} panel, so it is not cut.`);\n        return;\n      }\n      const b = p.box;\n      const cx = (b.min.x + b.max.x) / 2;\n      const cy = (b.min.y + b.max.y) / 2;\n      const cz = (b.min.z + b.max.z) / 2;\n      const at = c.panel === \"back\" ? ([x, y]) => ({ x, y: underside + y, z: cz }) : c.panel === \"bottom\" || c.panel === \"top\" ? ([x, y]) => ({ x, y: cy, z: depth - y }) : ([x, y]) => ({ x: cx, y: underside + y, z: depth - x });\n      p.features.push({ type: \"cutout\", id: c.id, pts: c.pts.map(at), through: c.through, depth: c.through ? null : c.depth, label: c.label });\n    });\n  }\n  var area2 = (pts) => pts.reduce((a, p, i) => {\n    const q = pts[(i + 1) % pts.length];\n    return a + p.u * q.v - q.u * p.v;\n  }, 0);\n  function sidesOf(p, L, W2) {\n    const s = [];\n    if (Math.abs(p.v) <= ON_EDGE_MM) s.push(0);\n    if (Math.abs(p.u - L) <= ON_EDGE_MM) s.push(1);\n    if (Math.abs(p.v - W2) <= ON_EDGE_MM) s.push(2);\n    if (Math.abs(p.u) <= ON_EDGE_MM) s.push(3);\n    return s;\n  }\n  function snap(p, L, W2) {\n    const s = sidesOf(p, L, W2);\n    return { u: s.includes(3) ? 0 : s.includes(1) ? L : p.u, v: s.includes(0) ? 0 : s.includes(2) ? W2 : p.v };\n  }\n  function perim(p, L, W2) {\n    if (p.v === 0) return p.u;\n    if (p.u === L) return L + p.v;\n    if (p.v === W2) return L + W2 + (L - p.u);\n    return 2 * L + W2 + (W2 - p.v);\n  }\n  function segmentsCross(a, b, c, d) {\n    const o = (p, q, r) => Math.sign((q.u - p.u) * (r.v - p.v) - (q.v - p.v) * (r.u - p.u));\n    return o(a, b, c) * o(a, b, d) < 0 && o(c, d, a) * o(c, d, b) < 0;\n  }\n  function cutoutShape(rawPts, L, W2) {\n    if (!(L > 0 && W2 > 0) || !Array.isArray(rawPts) || rawPts.length < 3) return { fault: \"the cut-out has fewer than three corners\" };\n    const out = rawPts.filter((p) => p.u < -ON_EDGE_MM || p.u > L + ON_EDGE_MM || p.v < -ON_EDGE_MM || p.v > W2 + ON_EDGE_MM);\n    if (out.length) return { fault: `a corner of the cut-out lies outside the ${r1(L)} x ${r1(W2)} mm part` };\n    let pts = rawPts.map((p) => snap(p, L, W2));\n    const n = pts.length;\n    for (let i = 0; i < n; i += 1) {\n      for (let j = i + 2; j < n; j += 1) {\n        if (i === 0 && j === n - 1) continue;\n        if (segmentsCross(pts[i], pts[(i + 1) % n], pts[j], pts[(j + 1) % n])) return { fault: \"the cut-out's outline crosses itself\" };\n      }\n    }\n    if (Math.abs(area2(pts)) / 2 < 1) return { fault: \"the cut-out encloses no area\" };\n    if (area2(pts) < 0) pts = pts.slice().reverse();\n    const on = pts.map((p) => sidesOf(p, L, W2));\n    if (!on.some((s) => s.length)) return { kind: \"hole\", pts };\n    const along2 = pts.map((p, i) => on[i].some((s) => on[(i + 1) % n].includes(s)));\n    const runs = along2.reduce((k, a2, i) => k + (!a2 && along2[(i + n - 1) % n] ? 1 : 0), 0);\n    if (!along2.some(Boolean)) return { fault: \"the cut-out touches the edge of the part without opening onto it - move it in, or draw it open onto the edge\" };\n    if (along2.every(Boolean)) return { fault: \"the cut-out runs only along the edge of the part\" };\n    if (runs !== 1) return { fault: \"the cut-out opens onto the edge of the part in more than one place - draw each opening as its own cut-out\" };\n    let start2 = along2.findIndex((a2, i) => !a2 && along2[(i + n - 1) % n]);\n    const chain = [];\n    for (let k = 0, i = start2; k <= n; k += 1, i = (i + 1) % n) {\n      chain.push(pts[i]);\n      if (along2[i] && k > 0) break;\n    }\n    const a = chain[0];\n    const b = chain[chain.length - 1];\n    if (chain.slice(1, -1).some((p) => sidesOf(p, L, W2).length)) return { fault: \"the cut-out meets the edge of the part again part-way along - draw each opening as its own cut-out\" };\n    const P2 = 2 * (L + W2);\n    const sa = perim(a, L, W2);\n    const sb = perim(b, L, W2);\n    const corners = [{ u: 0, v: 0 }, { u: L, v: 0 }, { u: L, v: W2 }, { u: 0, v: W2 }].map((c) => ({ c, s: perim(c, L, W2) }));\n    const span2 = ((sb - sa) % P2 + P2) % P2;\n    const keep = corners.map(({ c, s }) => ({ c, d: ((s - sa) % P2 + P2) % P2 })).filter(({ d }) => d > 1e-6 && d < span2 - 1e-6).sort((x, y) => x.d - y.d).map(({ c }) => c);\n    const outline2 = [a, ...keep, b, ...chain.slice(1, -1).reverse()].map((p) => ({ u: r1(p.u), v: r1(p.v) }));\n    const clean = outline2.filter((p, i) => {\n      const q = outline2[(i + 1) % outline2.length];\n      return Math.abs(p.u - q.u) > 1e-6 || Math.abs(p.v - q.v) > 1e-6;\n    });\n    if (Math.abs(area2(clean)) / 2 < 1) return { fault: \"the cut-out removes the whole part\" };\n    return { kind: \"notch\", outline: area2(clean) < 0 ? clean.reverse() : clean };\n  }\n  function cutoutKey(pts) {\n    let q = (pts || []).map((p) => ({ u: r1(p.u), v: r1(p.v) }));\n    if (area2(q) < 0) q = q.reverse();\n    let k = 0;\n    q.forEach((p, i) => {\n      if (p.u < q[k].u || p.u === q[k].u && p.v < q[k].v) k = i;\n    });\n    return q.slice(k).concat(q.slice(0, k)).map((p) => `${p.u},${p.v}`).join(\";\");\n  }\n  var DEFAULT_CABINET = Object.freeze({\n    name: \"Base unit\",\n    width: 600,\n    height: 720,\n    depth: 560,\n    materialId: \"mfc-white-18\",\n    backMaterialId: \"hdf-3-white\",\n    // 'sides-overlay': sides run the full height, top and bottom sit between them.\n    // 'tops-overlay':  top and bottom run the full width, sides sit between them.\n    // It is a shortcut: what actually decides each corner is `corners` below.\n    construction: \"sides-overlay\",\n    // EACH CORNER ON ITS OWN. A cabinet maker decides corner by corner which panel runs through and\n    // what holds it \u2014 TrunCAD puts a marker on every corner for exactly that, and the owner asked\n    // for the same (14.09.2026: \u00AB\u043D\u0430 \u0443\u0433\u043B\u0430\u0445 \u043A\u0430\u043A\u0438\u0435-\u0442\u043E \u0444\u0438\u043A\u0441\u0438\u043D\u0433\u0438 \u043C\u043E\u0436\u043D\u043E \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C\u2026 \u0432 \u0443\u0433\u043B\u0430\u0445 \u043C\u043E\u0436\u043D\u043E \u0441\u043A\u0430\u0437\u0430\u0442\u044C,\n    // \u043A\u0430\u043A \u043B\u044F\u0436\u0435\u0442 \u0441\u0432\u0435\u0440\u0445\u0443 \u0438\u043B\u0438 \u0441\u0431\u043E\u043A\u0443, \u0447\u0442\u043E \u043D\u0430 \u0447\u0442\u043E \u043B\u044F\u0436\u0435\u0442\u00BB). `over` names the panel that runs through and\n    // covers its neighbour's end: 'side' or 'top'. An empty `fixing` means \"whatever the cabinet says\".\n    corners: { tl: {}, tr: {}, bl: {}, br: {} },\n    // WHERE THE CABINET STANDS, when it is not simply next in the row.\n    //\n    // Partner, 14.09.2026: \u00AB\u0432\u0430\u0436\u043D\u043E, \u0447\u0442\u043E\u0431\u044B \u044D\u0442\u0438 \u0443\u0433\u043B\u044B \u043C\u0430\u0433\u043D\u0438\u0442\u043D\u044B\u0435 \u0442\u0430\u043A \u0436\u0435 \u043C\u0430\u0433\u043D\u0438\u0442\u0438\u043B\u0438 \u0431\u044B \u0434\u0440\u0443\u0433 \u043A \u0434\u0440\u0443\u0433\u0443\n    // \u0442\u0443\u043C\u0431\u043E\u0447\u043A\u0438\u2026 \u043A\u0443\u0445\u043D\u044F \u0441\u0440\u0430\u0437\u0443 \u0442\u0440\u0438, \u0447\u0435\u0442\u044B\u0440\u0435, \u043F\u044F\u0442\u044C, \u0448\u0435\u0441\u0442\u044C \u0442\u0443\u043C\u0431\u043E\u0447\u0435\u043A \u043F\u043E\u0434\u0440\u044F\u0434\u2026 \u044D\u0442\u043E\u0442 \u043C\u043E\u043C\u0435\u043D\u0442 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F\n    // \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0432\u043E\u0442 \u0441 \u0442\u0430\u043A\u0438\u043C\u0438 \u043C\u0430\u0433\u043D\u0438\u0442\u0438\u043A\u0430\u043C\u0438\u00BB. `null` means \"wherever the row puts me\", and the\n    // owner's caution (\u00AB\u0447\u0442\u043E\u0431\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u043D\u0435 \u0441\u043B\u043E\u043C\u0430\u0442\u044C\u2026 \u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442\u044B\u00BB) is honoured literally: with no\n    // position the build is byte-for-byte what it always was.\n    //   x \u2014 the left face of the carcass, mm from the origin (the row cursor when null)\n    //   y \u2014 the underside of the cabinet above the floor (a wall unit sits at 1400)\n    //   z \u2014 how far back it stands (0 = the front where a single cabinet stands today)\n    //   rotation \u2014 0, 90, 180 or 270. A QUARTER turn maps an axis-aligned box onto another\n    //   axis-aligned box, so it is one post-pass over the finished build (see rotateBuild); any\n    //   other angle would leave the model's whole geometry, and is refused rather than faked.\n    position: null,\n    // A board for one kind of panel, where it differs from the carcass: shelves in birch, say.\n    // Only the SHELVES may be thicker or thinner than the carcass (a 25 mm shelf in an 18 mm box\n    // is ordinary); every other role keeps the carcass thickness, because the corners, the grooves\n    // and the sections are all computed from one T. A different-thickness board on another role\n    // falls back to the carcass board with a warning rather than lying in the parts list.\n    materials: {},\n    back: { mode: \"groove\", grooveDepth: 8, grooveOffset: 16, rabbetWidth: 10, clearance: 0.5 },\n    // The top of the carcass: one full panel, or the kitchen base's TWO RAILS (Cabinet Lab's base: a rear rail right in\n    // front of the back and a front rail, each `railDepth` deep). `bottom.toBack`: with an inset back the bottom runs\n    // from the back's inside face to the front, as Cabinet Lab draws it (owner 05.10.2026: the 3D and the workshop agree).\n    top: { mode: \"full\", railDepth: 100 },\n    bottom: { toBack: false },\n    shelves: { count: 1, mode: \"even\", positions: [], setback: 10, fixing: \"pins\" },\n    dividers: { count: 0, mode: \"even\", positions: [] },\n    plinth: { type: \"recessed\", height: 100, recess: 30 },\n    doors: { count: 0, gap: 2, hinge: \"left\" },\n    // Fronts (doors and drawer faces) may be a different board from the carcass \u2014 an oak front on a\n    // white box is the normal order, not the exception. Empty means \"the same as the carcass\".\n    frontMaterialId: \"\",\n    frontStyle: \"slab\",\n    shaker: { panels: 1, frame: 80, rail: 80, railAt: 0, depth: 6 },\n    // Handles: what a person actually touches, and the two holes a front carries because of it.\n    handles: { type: \"bar\", centres: 128, dia: 5, inset: 50, position: \"auto\" },\n    // A worktop over a base unit: a separate board, overhanging at the front. Its thickness is\n    // the board's (materials.js, group Worktops).\n    worktop: { on: false, overhangFront: 20, overhangSide: 0, overhangBack: 0, materialId: \"worktop-lam-38\" },\n    // What is INSIDE each section, left to right. An absent entry inherits the cabinet's own\n    // shelves and has no drawers, so a project written before sections existed still builds.\n    // A section may also carry its own `doors: { count, hinge }` \u2014 a door per bay of a record\n    // cabinet, say; once ANY bay has its own doors, the cabinet-wide `doors` no longer applies and\n    // a bay without doors of its own is open.\n    sections: [],\n    // Drawer defaults, used by any section that asks for drawers.\n    drawer: { height: 150, gap: 3, boxHeight: 90, sideClearance: 13, backGap: 50, bottomId: \"hdf-3-white\", grooveUp: 12 },\n    joints: { type: \"confirmat\" },\n    // WHICH FITTINGS, BY NAME. A cup at 21.5 mm and two plate holes is the shape of every European\n    // hinge and the drilling of none of them; a workshop buys a named product and bores for that\n    // one. The defaults are the generic patterns this prototype has always drilled, so a project\n    // made before the catalogue builds byte for byte. See fittings.js.\n    fittings: { hinge: DEFAULT_FITTINGS.hinge, runner: DEFAULT_FITTINGS.runner },\n    edging: { front: 2, door: 2, other: 0 }\n  });\n  var LIMITS2 = {\n    width: [200, 3e3],\n    height: [200, 3e3],\n    depth: [100, 1200],\n    grooveDepth: [4, 12],\n    grooveOffset: [6, 40],\n    rabbetWidth: [6, 20],\n    setback: [0, 60],\n    backVoid: [0, 120],\n    railDepth: [40, 300],\n    plinthHeight: [40, 250],\n    recess: [0, 100],\n    gap: [1, 6],\n    shelves: [0, 12],\n    dividers: [0, 6],\n    doors: [0, 2],\n    drawers: [0, 6],\n    drawerHeight: [80, 400],\n    handleCentres: [32, 480],\n    overhang: [0, 100]\n  };\n  var clamp = (v, [lo, hi]) => Math.min(hi, Math.max(lo, Number(v) || 0));\n  var JOINTS = [\"confirmat\", \"dowel\", \"cam\", \"cabineo\", \"none\"];\n  var FRONTS_OPEN = Object.freeze({\n    glass: \"Glass door: a one-piece frame with the aperture cut through, and the glass, are not in the files and not in this cut list (quoted with the fronts, as Cabinet Lab keeps them): the glass type, thickness, safety class and how it is held (beading, clips or a rebate) are the workshop's to decide, and the aperture's machining follows from that.\",\n    jpull: \"J-pull fronts: cut flat here; the J-pull profile is not in the files - its cutter and toolpath are not approved by the workshop (Cabinet Lab marks the profile nominal).\"\n  });\n  var GLASS_MIN = { h: 300, w: 250, aperture: 120 };\n  var RAILS_UNDRILLED = \"The two top rails are not drilled yet: how many connectors join a 100 mm rail to a side, and where, is not on record (the two-per-joint rule, 63.25 mm in from each end, is for long joints and would cross on a rail).\";\n  var CABINEO = Object.freeze({\n    // LAMELLO'S DRAWING IS THE REFERENCE (owner 05.10.2026: Cabineo 12; the official machining is the reference, a\n    // workshop preset that differs from it is not an equal option). Read from cut-optimiser\n    // docs/reference/lamello-cabineo-operating-instructions-2024.pdf p.2, \"Option 1, drill \u00D815\": the same in all three\n    // installation variants \u2014 three \u00D815 at 11.2, the first centre 3.6 mm from the joining edge; the \u00D85 pin X = 12 deep\n    // for Cabineo 12. (The workshop preset #20601 had 4.5 mm and the pin on the joint line.)\n    seat: { dia: 15, count: 3, pitch: 11.2, firstFromEdge: 3.6 },\n    pin: { dia: 5, depth: 12 },\n    fromEnds: 63.25,\n    // What the VARIANT sets (same page): seat depth from the cup face, and the \u00D85 axis from the cup face (D\u22125 / D\u22125.8 /\n    // D\u22127.1 from the other face), and the recess for the flange or cap.\n    variants: Object.freeze({\n      surface: Object.freeze({ seatDepth: 11, pinFromCupFace: 5, recess: 0, recessWidth: 0 }),\n      flush: Object.freeze({ seatDepth: 11.5, pinFromCupFace: 5.8, recess: 0.8, recessWidth: 16.7 }),\n      coverCap: Object.freeze({ seatDepth: 13, pinFromCupFace: 7.1, recess: 2.1, recessWidth: 18.8 })\n    }),\n    // WHICH VARIANT THIS SHOP FITS, FROM ITS OWN RECORD (knowledge/presets/ironmongery/cabineo.md, owner 13.09.2026,\n    // project #20601): the male gets \"a 0.9 mm cup \u2014 a rounded slot wrapping the oval\", half-width 8.5 (17 mm wide). Of\n    // Lamello's three, only \"flush with the surface\" has such a recess (0.8 mm, a 16.7 mm slot round the three bores);\n    // \"on the surface\" has none and \"flush cover cap\" a 2.1 mm, 18.8 mm one. So the shop fits FLUSH; Lamello's own\n    // numbers for it are the reference (0.8 / 16.7 / seat 11.5 / pin 5.8), not the shop's 0.9 / 17 (owner 05.10.2026).\n    reference: \"flush\",\n    // The recess for the collar (flush: 0.8 deep, a 16.7 mm slot round the three bores) is a milled PATH, which this\n    // model's export cannot carry yet: it is modelled on every seat and named as missing, so nothing is ready without it.\n    recessWhy: 'the 0.8 mm recess for the Cabineo collar (Lamello \"flush with the surface\": a 16.7 mm wide slot round the three \\xD815 bores) is a milled path this export cannot carry yet, so it is not in the file',\n    // A RAIL END TAKES ONE CABINEO (owner's itemised base, 18.09.2026: \"Cabineo 12\" per 600 base = 2 per bottom joint,\n    // 2 per back joint, 1 per end of each 100 mm rail), in the middle of the joint: the preset's \"mirror-symmetric,\n    // equal distance from each edge\", 50 mm from each edge of the rail - Lamello's \"min. 20 mm\" from an edge holds.\n    railPerEnd: 1,\n    // HOW THE RECESS IS MILLED. From the owner's own machined reference program (cut-optimiser\n    // docs/machine-samples/withGrooves.BPP, parts of project #20601, ROUT \"P3\" and its twins): ONE closed contour on tool\n    // 5MMDOWN, run clockwise on the machined face (Y up), a slot round the three bores - an arc centred on the third bore,\n    // straight sides, closed 3.3 mm beyond the joining edge. Width and depth are Lamello's for the variant (flush: 16.7 mm,\n    // 0.8 mm; the program had the shop's 17 / 0.9). The tool's diameter is the shop library's (cut-optimiser\n    // src/engine/tools.js: 5MMDOWN \u00D85, read from the shop's own files).\n    // THE CUTTER RUNS ON ITS CENTRE LINE, 2.5 mm inside the outline (correction 'central'): the reference row's\n    // correction field reads 2, which in a ROUT row is LEFT (cut-optimiser bpp.js field 51, verified by the owner's own\n    // BiesseWorks edit 04.09.2026: 2 = Left, 1 = Right) - with a clockwise contour that is OUTSIDE a 17 mm outline, a\n    // ~27 mm recess, which a 16.5 mm Cabineo body cannot be meant to have; the shop's note calls the same code \"right\".\n    // A centre-line path cuts exactly the slot on any machine and in both formats, whatever that code means; the\n    // contradiction is the workshop's to settle on the prototype.\n    recessMill: Object.freeze({ tool: \"5MMDOWN\", toolDia: 5, correction: \"central\", clockwise: true, runOut: 3.3 }),\n    source: \"Lamello Cabineo operating instructions 2024, p.2 (Cabineo 12, Option 1: drill \\xD815)\",\n    pendingWhy: \"a Lamello Cabineo whose installation variant is not confirmed: its seat depth and the place of its \\xD85 pin depend on the variant (Lamello drawing p.2), so it is not in the file\",\n    unresolved: `Cabineo without an installation variant: Lamello's drawing sets the seat depth (11 / 11.5 / 13 mm) and where the \\xD85 pin goes (5 / 5.8 / 7.1 mm from the cup face) by variant - on the surface / flush / flush cover cap - so these Cabineos are modelled but not in the CNC files. (The shop's own record is \"flush\": see CABINEO.reference.)`\n  });\n  var CORNERS = [\"tl\", \"tr\", \"bl\", \"br\"];\n  var round1 = (v) => Math.round(v * 10) / 10;\n  function placements(project) {\n    const gap = Number(project && project.gap || 0);\n    let x = 0;\n    return (project && project.cabinets || []).map((c) => {\n      const pos = normalisePosition(c && c.position);\n      if (pos) return { offsetX: pos.x, offsetY: pos.y, offsetZ: pos.z, rotation: pos.rotation, placed: true };\n      const at = { offsetX: x, offsetY: 0, offsetZ: 0, rotation: 0, placed: false };\n      const w = c && c.width === void 0 ? DEFAULT_CABINET.width : c && c.width;\n      x += clamp(w, LIMITS2.width) + gap;\n      return at;\n    });\n  }\n  function normalisePosition(input) {\n    if (!input || typeof input !== \"object\") return null;\n    const x = Number(input.x);\n    if (!Number.isFinite(x)) return null;\n    const n = (v) => Number.isFinite(Number(v)) ? Number(v) : 0;\n    const q = Math.round(n(input.rotation) / 90) * 90;\n    return { x: round1(x), y: round1(Math.max(0, n(input.y))), z: round1(n(input.z)), rotation: (q % 360 + 360) % 360 };\n  }\n  var DIVIDER_MIN_DEPTH = 60;\n  var rowList = (v) => Array.isArray(v) ? v.map((x) => x === null || x === void 0 || x === \"\" || !Number.isFinite(Number(x)) ? null : Math.round(Number(x) * 10) / 10) : [];\n  function normaliseCabinet(input = {}) {\n    const d = DEFAULT_CABINET;\n    const c = {\n      ...d,\n      ...input,\n      back: { ...d.back, ...input.back || {} },\n      top: { ...d.top, ...input.top || {} },\n      bottom: { ...d.bottom, ...input.bottom || {} },\n      shelves: { ...d.shelves, ...input.shelves || {} },\n      dividers: { ...d.dividers, ...input.dividers || {} },\n      plinth: { ...d.plinth, ...input.plinth || {} },\n      doors: { ...d.doors, ...input.doors || {} },\n      frontStyle: input.frontStyle === \"shaker\" ? \"shaker\" : \"slab\",\n      shaker: { ...d.shaker, ...input.shaker || {} },\n      joints: { ...d.joints, ...input.joints || {} },\n      fittings: { ...d.fittings, ...input.fittings || {} },\n      edging: { ...d.edging, ...input.edging || {} },\n      drawer: { ...d.drawer, ...input.drawer || {} },\n      corners: { tl: {}, tr: {}, bl: {}, br: {}, ...input.corners || {} },\n      materials: { ...input.materials || {} },\n      handles: { ...d.handles, ...input.handles || {} },\n      worktop: { ...d.worktop, ...input.worktop || {} },\n      sections: Array.isArray(input.sections) ? input.sections.map((sp) => sp && typeof sp === \"object\" ? { ...sp } : {}) : [],\n      position: normalisePosition(input.position)\n    };\n    c.width = clamp(c.width, LIMITS2.width);\n    c.height = clamp(c.height, LIMITS2.height);\n    c.depth = clamp(c.depth, LIMITS2.depth);\n    c.back.grooveDepth = clamp(c.back.grooveDepth, LIMITS2.grooveDepth);\n    c.back.grooveOffset = clamp(c.back.grooveOffset, LIMITS2.grooveOffset);\n    c.back.rabbetWidth = clamp(c.back.rabbetWidth, LIMITS2.rabbetWidth);\n    c.back.void = clamp(c.back.void === void 0 ? 50 : c.back.void, LIMITS2.backVoid);\n    c.joints.variant = Object.prototype.hasOwnProperty.call(CABINEO.variants, c.joints.variant) ? c.joints.variant : null;\n    c.top.mode = c.top.mode === \"rails\" ? \"rails\" : \"full\";\n    c.top.railDepth = clamp(c.top.railDepth, LIMITS2.railDepth);\n    c.bottom.toBack = !!c.bottom.toBack;\n    c.shelves.count = Math.round(clamp(c.shelves.count, LIMITS2.shelves));\n    c.shelves.setback = clamp(c.shelves.setback, LIMITS2.setback);\n    c.dividers.count = Math.round(clamp(c.dividers.count, LIMITS2.dividers));\n    c.plinth.height = clamp(c.plinth.height, LIMITS2.plinthHeight);\n    c.plinth.recess = clamp(c.plinth.recess, LIMITS2.recess);\n    c.doors.count = Math.round(clamp(c.doors.count, LIMITS2.doors));\n    c.doors.gap = clamp(c.doors.gap, LIMITS2.gap);\n    if (c.doors.split !== void 0) {\n      const sp = Number(c.doors.split);\n      if (Number.isFinite(sp) && sp > 0) c.doors.split = round1(sp);\n      else delete c.doors.split;\n    }\n    c.shelves.positions = (c.shelves.positions || []).map(Number).filter(Number.isFinite);\n    [\"setbacks\", \"depths\"].forEach((k) => {\n      if (c.shelves[k] !== void 0) c.shelves[k] = rowList(c.shelves[k]);\n    });\n    c.dividers.positions = (c.dividers.positions || []).map(Number).filter(Number.isFinite);\n    if (c.dividers.setbacks !== void 0) c.dividers.setbacks = rowList(c.dividers.setbacks);\n    c.drawer.height = clamp(c.drawer.height, LIMITS2.drawerHeight);\n    c.fittings.hinge = hingeById(c.fittings.hinge).id;\n    c.fittings.runner = runnerById(c.fittings.runner).id;\n    const fallbackOver = c.construction === \"sides-overlay\" ? \"side\" : \"top\";\n    CORNERS.forEach((k) => {\n      const spec = c.corners[k] || {};\n      c.corners[k] = {\n        over: spec.over === \"side\" || spec.over === \"top\" ? spec.over : fallbackOver,\n        fixing: JOINTS.includes(spec.fixing) ? spec.fixing : \"\"\n      };\n    });\n    c.handles.centres = clamp(c.handles.centres, LIMITS2.handleCentres);\n    c.worktop.overhangFront = clamp(c.worktop.overhangFront, LIMITS2.overhang);\n    c.worktop.overhangSide = clamp(c.worktop.overhangSide, LIMITS2.overhang);\n    c.drawer.gap = clamp(c.drawer.gap, LIMITS2.gap);\n    const wanted2 = Math.round(clamp(c.dividers.count, LIMITS2.dividers)) + 1;\n    const secs = [];\n    for (let i = 0; i < wanted2; i += 1) {\n      const sp = c.sections[i] || {};\n      secs.push({\n        shelves: sp.shelves ? { ...c.shelves, ...sp.shelves } : null,\n        drawers: {\n          count: Math.round(clamp(sp.drawers && sp.drawers.count || 0, LIMITS2.drawers)),\n          heights: (sp.drawers && sp.drawers.heights || []).map(Number).filter(Number.isFinite),\n          // A stack hung from the top (see buildCabinet); absent means from the bottom, as always.\n          ...sp.drawers && sp.drawers.from === \"top\" ? { from: \"top\" } : {},\n          ...sp.drawers && sp.drawers.fill === true ? { fill: true } : {},\n          // each drawer's own box height (a Cabinet Lab drawer sized by hand); a hole means the cabinet's box\n          ...sp.drawers && Array.isArray(sp.drawers.boxHeights) ? { boxHeights: sp.drawers.boxHeights.map((v) => Number(v) > 0 ? Number(v) : null) } : {}\n        },\n        rail: !!sp.rail,\n        frontStyle: [\"slab\", \"shaker\"].includes(sp.frontStyle) ? sp.frontStyle : null,\n        shaker: sp.shaker ? { ...c.shaker, ...sp.shaker } : null,\n        doors: sp.doors && typeof sp.doors === \"object\" ? { count: Math.round(clamp(sp.doors.count || 0, LIMITS2.doors)), hinge: sp.doors.hinge === \"right\" ? \"right\" : \"left\" } : null\n      });\n      if (secs[i].shelves) {\n        secs[i].shelves.count = Math.round(clamp(secs[i].shelves.count, LIMITS2.shelves));\n        secs[i].shelves.positions = (secs[i].shelves.positions || []).map(Number).filter(Number.isFinite);\n        [\"setbacks\", \"depths\"].forEach((k) => {\n          if (c.sections[i] && c.sections[i].shelves && c.sections[i].shelves[k] !== void 0) secs[i].shelves[k] = rowList(c.sections[i].shelves[k]);\n          else delete secs[i].shelves[k];\n        });\n      }\n    }\n    c.sections = secs;\n    c.cutouts = normaliseCutouts(input.cutouts);\n    return c;\n  }\n  var V = (x, y, z) => ({ x, y, z });\n  var AX = { x: V(1, 0, 0), y: V(0, 1, 0), z: V(0, 0, 1) };\n  var neg = (a) => V(-a.x, -a.y, -a.z);\n  var dot = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z;\n  var cross = (a, b) => V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n  var sub = (a, b) => V(a.x - b.x, a.y - b.y, a.z - b.z);\n  var box = (x0, x1, y0, y1, z0, z1) => ({ min: V(Math.min(x0, x1), Math.min(y0, y1), Math.min(z0, z1)), max: V(Math.max(x0, x1), Math.max(y0, y1), Math.max(z0, z1)) });\n  var size = (b) => V(b.max.x - b.min.x, b.max.y - b.min.y, b.max.z - b.min.z);\n  var centre = (b) => V((b.min.x + b.max.x) / 2, (b.min.y + b.max.y) / 2, (b.min.z + b.max.z) / 2);\n  function turnSide(dir, front) {\n    if (!front || Math.abs(front.z - 1) < 0.01) return dir;\n    if (Math.abs(front.x - 1) < 0.01) return V(dir.z, dir.y, -dir.x);\n    if (Math.abs(front.z + 1) < 0.01) return V(-dir.x, dir.y, -dir.z);\n    return V(-dir.z, dir.y, dir.x);\n  }\n  var SIDES = {\n    front: V(0, 0, 1),\n    back: V(0, 0, -1),\n    top: V(0, 1, 0),\n    bottom: V(0, -1, 0),\n    left: V(-1, 0, 0),\n    right: V(1, 0, 0)\n  };\n  function buildCabinet(params, ctx = {}) {\n    const c = normaliseCabinet(params);\n    const id = ctx.id || \"c1\";\n    const ox = ctx.offsetX || 0;\n    const oy = ctx.offsetY || 0;\n    const oz = ctx.offsetZ || 0;\n    const mat = materialById(c.materialId);\n    const bmat = materialById(c.backMaterialId);\n    const frontMat = c.frontMaterialId ? materialById(c.frontMaterialId) : mat;\n    const T3 = mat.thickness;\n    const Tb = bmat.thickness;\n    const { width: W2, height: H2, depth: D2 } = c;\n    const warnings = [];\n    const panels = [];\n    const hardware = [];\n    let n = 0;\n    const naturalMat = (role) => role === \"back\" ? bmat : role === \"drawer-bottom\" ? materialById(c.drawer.bottomId) : mat;\n    const matFor = (role) => {\n      const m = c.materials && c.materials[role] ? materialById(c.materials[role]) : null;\n      if (!m) return null;\n      const base = naturalMat(role);\n      if (role === \"shelf\" || m.thickness === base.thickness) return m;\n      const w = `${m.name} is ${m.thickness} mm; only shelves may differ in thickness \\u2014 ${role} stays in ${base.name} (${base.thickness} mm).`;\n      if (!warnings.includes(w)) warnings.push(w);\n      return null;\n    };\n    const add = (role, name2, b, opts) => {\n      n += 1;\n      const p = {\n        key: `${id}:${role}:${n}`,\n        cabinetId: id,\n        index: n,\n        role,\n        name: name2,\n        mat: matFor(role) || opts.mat || mat,\n        box: b,\n        thin: opts.thin,\n        grainAxis: opts.grainAxis || null,\n        faceUp: opts.faceUp,\n        front: AX.z,\n        edging: opts.edging || {},\n        features: [],\n        side: opts.side || null\n      };\n      panels.push(p);\n      return p;\n    };\n    const legs2 = c.plinth.type === \"legs\";\n    const recessed = c.plinth.type === \"recessed\";\n    const yBase = legs2 ? c.plinth.height : 0;\n    const yTop = H2;\n    const yBot = recessed ? c.plinth.height : yBase;\n    const cor = c.corners;\n    const sidesFull = c.construction === \"sides-overlay\";\n    if (yTop - yBot < 3 * T3) warnings.push(\"The carcass is too low for its own panels.\");\n    let zBackFace = 0;\n    let backBox = null;\n    let backExtX = null;\n    let backExtY = null;\n    const gd = c.back.grooveDepth;\n    const go = c.back.grooveOffset;\n    const rw = c.back.rabbetWidth;\n    const cl = c.back.clearance;\n    const yIn0 = yBot + T3;\n    const yIn1 = yTop - T3;\n    const xIn0 = T3;\n    const xIn1 = W2 - T3;\n    if (c.back.mode === \"groove\") {\n      if (go + Tb + cl > D2 - 20) warnings.push(\"The back groove sits too far forward for this depth.\");\n      backBox = box(xIn0 - gd + cl, xIn1 + gd - cl, yIn0 - gd + cl, yIn1 + gd - cl, go, go + Tb);\n      backExtX = [xIn0 - gd, xIn1 + gd];\n      backExtY = [yIn0 - gd, yIn1 + gd];\n      zBackFace = go + Tb;\n    } else if (c.back.mode === \"rabbet\") {\n      backBox = box(xIn0 - rw + cl, xIn1 + rw - cl, yIn0 - rw + cl, yIn1 + rw - cl, 0, Tb);\n      backExtX = [xIn0 - rw, xIn1 + rw];\n      backExtY = [yIn0 - rw, yIn1 + rw];\n      zBackFace = Tb;\n    } else if (c.back.mode === \"inset\") {\n      const vd = c.back.void;\n      if (Tb !== T3) warnings.push(`An inset back is a carcass board: ${bmat.name} is ${Tb} mm, the carcass ${T3} mm.`);\n      if (vd + Tb > D2 - 100) warnings.push(\"The inset back sits too far forward for this depth.\");\n      backBox = box(xIn0, xIn1, yIn0, yIn1, vd, vd + Tb);\n      zBackFace = vd + Tb;\n    } else {\n      backBox = box(1, W2 - 1, yBot + 1, yTop - 1, -Tb, 0);\n      zBackFace = 0;\n    }\n    const eF = c.edging.front;\n    const eO = c.edging.other;\n    const sideL = [cor.bl.over === \"side\" ? yBase : yIn0, cor.tl.over === \"side\" ? yTop : yIn1];\n    const sideR = [cor.br.over === \"side\" ? yBase : yIn0, cor.tr.over === \"side\" ? yTop : yIn1];\n    const botX = [cor.bl.over === \"top\" ? 0 : xIn0, cor.br.over === \"top\" ? W2 : xIn1];\n    const topX = [cor.tl.over === \"top\" ? 0 : xIn0, cor.tr.over === \"top\" ? W2 : xIn1];\n    const left = add(\n      \"side-left\",\n      \"Left Side\",\n      box(0, T3, sideL[0], sideL[1], 0, D2),\n      { thin: \"x\", grainAxis: \"y\", faceUp: AX.x, side: \"left\", edging: { front: eF, top: cor.tl.over === \"side\" ? eO : 0, bottom: cor.bl.over === \"side\" ? eO : 0 } }\n    );\n    const right = add(\n      \"side-right\",\n      \"Right Side\",\n      box(W2 - T3, W2, sideR[0], sideR[1], 0, D2),\n      { thin: \"x\", grainAxis: \"y\", faceUp: neg(AX.x), side: \"right\", edging: { front: eF, top: cor.tr.over === \"side\" ? eO : 0, bottom: cor.br.over === \"side\" ? eO : 0 } }\n    );\n    const bottomZ0 = c.bottom.toBack && c.back.mode === \"inset\" ? zBackFace : 0;\n    const bottom = add(\n      \"bottom\",\n      \"Bottom\",\n      box(botX[0], botX[1], yBot, yBot + T3, bottomZ0, D2),\n      { thin: \"y\", grainAxis: \"x\", faceUp: AX.y, edging: { front: eF, left: cor.bl.over === \"top\" ? eO : 0, right: cor.br.over === \"top\" ? eO : 0 } }\n    );\n    let top = null;\n    const rails = [];\n    if (c.top.mode === \"rails\") {\n      const rd = c.top.railDepth;\n      const rz0 = c.back.mode === \"inset\" ? zBackFace : 0;\n      if (rz0 + rd > D2 - rd) warnings.push(\"The two top rails overlap at this depth.\");\n      rails.push(add(\n        \"top-rail\",\n        \"Rear Rail\",\n        box(topX[0], topX[1], yTop - T3, yTop, rz0, rz0 + rd),\n        { thin: \"y\", grainAxis: \"x\", faceUp: neg(AX.y), edging: {} }\n      ));\n      rails.push(add(\n        \"top-rail\",\n        \"Front Rail\",\n        box(topX[0], topX[1], yTop - T3, yTop, D2 - rd, D2),\n        { thin: \"y\", grainAxis: \"x\", faceUp: neg(AX.y), edging: { front: eF } }\n      ));\n    } else {\n      top = add(\n        \"top\",\n        \"Top\",\n        box(topX[0], topX[1], yTop - T3, yTop, 0, D2),\n        { thin: \"y\", grainAxis: \"x\", faceUp: neg(AX.y), edging: { front: eF, left: cor.tl.over === \"top\" ? eO : 0, right: cor.tr.over === \"top\" ? eO : 0 } }\n      );\n    }\n    const carcass2 = [left, right, bottom, ...top ? [top] : rails];\n    const back = add(\"back\", \"Back\", backBox, { mat: bmat, thin: \"z\", grainAxis: null, faceUp: AX.z, edging: {} });\n    if (c.back.mode === \"groove\" || c.back.mode === \"rabbet\") {\n      const isG = c.back.mode === \"groove\";\n      const label = isG ? \"back groove\" : \"back rabbet\";\n      const z0 = isG ? go - cl / 2 : 0;\n      const z1 = isG ? go + Tb + cl / 2 : Tb;\n      const dep = isG ? gd : rw;\n      const yrL = [Math.max(sideL[0], backExtY[0]), Math.min(sideL[1], backExtY[1])];\n      const yrR = [Math.max(sideR[0], backExtY[0]), Math.min(sideR[1], backExtY[1])];\n      const xrB = [Math.max(botX[0], backExtX[0]), Math.min(botX[1], backExtX[1])];\n      const xrT = [Math.max(topX[0], backExtX[0]), Math.min(topX[1], backExtX[1])];\n      left.features.push({ type: isG ? \"groove\" : \"pocket\", box: box(T3 - dep, T3, yrL[0], yrL[1], z0, z1), depth: dep, label });\n      right.features.push({ type: isG ? \"groove\" : \"pocket\", box: box(W2 - T3, W2 - T3 + dep, yrR[0], yrR[1], z0, z1), depth: dep, label });\n      bottom.features.push({ type: isG ? \"groove\" : \"pocket\", box: box(xrB[0], xrB[1], yBot + T3 - dep, yBot + T3, z0, z1), depth: dep, label });\n      if (top) top.features.push({ type: isG ? \"groove\" : \"pocket\", box: box(xrT[0], xrT[1], yTop - T3, yTop - T3 + dep, z0, z1), depth: dep, label });\n      else warnings.push(\"A back in a groove or rebate needs a full top; with top rails the back is set in (back mode inset).\");\n    }\n    const innerW = xIn1 - xIn0;\n    const innerH = yIn1 - yIn0;\n    const nd = c.dividers.count;\n    let dividerX = [];\n    if (nd > 0) {\n      let dividerSb = [];\n      if (c.dividers.mode === \"custom\" && c.dividers.positions.length >= nd) {\n        const sbs = Array.isArray(c.dividers.setbacks) ? c.dividers.setbacks : [];\n        const pairs = c.dividers.positions.slice(0, nd).map((p, i) => ({ x: xIn0 + p, sb: sbs[i] != null ? sbs[i] : null })).sort((a, b) => a.x - b.x);\n        dividerX = pairs.map((q) => q.x);\n        dividerSb = pairs.map((q) => q.sb);\n      } else {\n        const sec = (innerW - nd * T3) / (nd + 1);\n        for (let k = 1; k <= nd; k += 1) dividerX.push(xIn0 + k * sec + (k - 1) * T3);\n      }\n      dividerX.forEach((x0, i) => {\n        if (x0 < xIn0 || x0 + T3 > xIn1) warnings.push(`Divider ${i + 1} falls outside the carcass.`);\n        const sb = dividerSb[i] != null ? Math.max(0, Math.min(dividerSb[i], D2 - (zBackFace + cl) - DIVIDER_MIN_DEPTH)) : 0;\n        const dv = add(\n          \"divider\",\n          \"Divider\",\n          box(x0, x0 + T3, yIn0, yIn1, zBackFace + cl, D2 - sb),\n          { thin: \"x\", grainAxis: \"y\", faceUp: AX.x, edging: { front: eF } }\n        );\n        dv.section = i;\n        dv.slot = i;\n      });\n    }\n    const sections = [];\n    let sx = xIn0;\n    dividerX.forEach((x0) => {\n      sections.push([sx, x0]);\n      sx = x0 + T3;\n    });\n    sections.push([sx, xIn1]);\n    const zs0 = zBackFace + cl;\n    const shelfRef = /* @__PURE__ */ new Map();\n    const pinBearing = /* @__PURE__ */ new Set();\n    const shelfMat = matFor(\"shelf\") || mat;\n    const Ts = shelfMat.thickness;\n    const dr = c.drawer;\n    const runner = runnerById(c.fittings.runner);\n    const bottomMat = materialById(dr.bottomId);\n    const sectionInfo = [];\n    sections.forEach(([s0, s1], si) => {\n      const spec = c.sections[si] || { shelves: null, drawers: { count: 0, heights: [] }, rail: false, doors: null };\n      const shelfSpec = spec.shelves || c.shelves;\n      const pins = shelfSpec.fixing === \"pins\";\n      const sp = Number(shelfSpec.sidePlay);\n      const play = pins ? Number.isFinite(sp) && sp >= 0 ? sp : 0.5 : 0;\n      const secW = s1 - s0;\n      const info = { index: si, x0: s0 + ox, x1: s1 + ox, width: round1(secW), shelves: [], drawers: [], drawerTop: yIn0, rail: !!spec.rail };\n      const nDr = spec.drawers && spec.drawers.count || 0;\n      const fromTop = !!(spec.drawers && spec.drawers.from === \"top\");\n      const fill = !fromTop && !!(spec.drawers && spec.drawers.fill);\n      let yCursor = fromTop ? yIn1 : yIn0;\n      for (let k = 0; k < nDr; k += 1) {\n        const stored = (spec.drawers.heights || [])[k];\n        const h = Number.isFinite(Number(stored)) && Number(stored) > 0 ? Number(stored) : dr.height;\n        const slot0 = fromTop ? yCursor - h : yCursor;\n        const frontTop = slot0 + h;\n        if (fromTop ? slot0 < yIn0 + 20 : frontTop > yIn1 - (fill ? -0.01 : 20)) {\n          warnings.push(`Drawer ${k + 1} does not fit in section ${si + 1}.`);\n          break;\n        }\n        const g2 = dr.gap;\n        const fx0 = si === 0 ? 0 + g2 : s0 - T3 / 2 + g2 / 2;\n        const fx1 = si === sections.length - 1 ? W2 - g2 : s1 + T3 / 2 - g2 / 2;\n        const fy0 = fromTop ? slot0 + g2 / 2 : k === 0 ? yBot + g2 : yCursor + g2 / 2;\n        const fy1 = fromTop && k === 0 || fill && k === nDr - 1 ? yTop - g2 : frontTop - g2 / 2;\n        const front = add(\n          \"drawer-front\",\n          \"Drawer Front\",\n          box(fx0, fx1, fy0, fy1, D2, D2 + T3),\n          { mat: frontMat, thin: \"z\", grainAxis: \"y\", faceUp: neg(AX.z), edging: { top: c.edging.door, bottom: c.edging.door, left: c.edging.door, right: c.edging.door } }\n        );\n        front.section = si;\n        front.drawer = k;\n        const ownBox = Number((spec.drawers.boxHeights || [])[k]);\n        const wantBh = Number.isFinite(ownBox) && ownBox > 0 ? ownBox : dr.boxHeight;\n        const bh = Math.min(wantBh, h - 2 * g2);\n        if (wantBh !== dr.boxHeight && bh < wantBh) warnings.push(`Drawer ${k + 1} in section ${si + 1}: its ${round1(wantBh)} mm box does not fit the drawer's ${round1(h - 2 * g2)} mm, so it is cut ${round1(bh)} mm.`);\n        const clearance = dr.sideClearance === DEFAULT_CABINET.drawer.sideClearance ? runner.sideClearance : dr.sideClearance;\n        const bw = secW - 2 * clearance;\n        const bx0 = s0 + clearance;\n        const by0 = slot0 + (h - bh) / 2;\n        const bz0 = zBackFace + cl + 10;\n        const bd = D2 - dr.backGap - bz0;\n        if (bw > 80 && bh > 40 && bd > 120) {\n          const sideL2 = add(\n            \"drawer-side\",\n            \"Drawer Side\",\n            box(bx0, bx0 + T3, by0, by0 + bh, bz0, bz0 + bd),\n            { thin: \"x\", grainAxis: \"z\", faceUp: AX.x, edging: { top: c.edging.other } }\n          );\n          const sideR2 = add(\n            \"drawer-side\",\n            \"Drawer Side\",\n            box(bx0 + bw - T3, bx0 + bw, by0, by0 + bh, bz0, bz0 + bd),\n            { thin: \"x\", grainAxis: \"z\", faceUp: neg(AX.x), edging: { top: c.edging.other } }\n          );\n          const bf = add(\n            \"drawer-box-front\",\n            \"Drawer Box Front\",\n            box(bx0 + T3, bx0 + bw - T3, by0, by0 + bh, bz0 + bd - T3, bz0 + bd),\n            { thin: \"z\", grainAxis: \"x\", faceUp: neg(AX.z), edging: { top: c.edging.other } }\n          );\n          const bb = add(\n            \"drawer-box-back\",\n            \"Drawer Box Back\",\n            box(bx0 + T3, bx0 + bw - T3, by0, by0 + bh, bz0, bz0 + T3),\n            { thin: \"z\", grainAxis: \"x\", faceUp: AX.z, edging: { top: c.edging.other } }\n          );\n          [sideL2, sideR2, bf, bb].forEach((pnl) => {\n            pnl.section = si;\n            pnl.drawer = k;\n          });\n          const gd2 = 6;\n          const inG = gd2 - 1;\n          const bot = add(\n            \"drawer-bottom\",\n            \"Drawer Bottom\",\n            box(bx0 + T3 - inG, bx0 + bw - T3 + inG, by0 + dr.grooveUp, by0 + dr.grooveUp + bottomMat.thickness, bz0 + T3 - inG, bz0 + bd - T3 + inG),\n            { mat: bottomMat, thin: \"y\", grainAxis: \"x\", faceUp: AX.y, edging: {} }\n          );\n          bot.section = si;\n          bot.drawer = k;\n          [sideL2, sideR2, bf, bb].forEach((pnl) => {\n            const isSide = pnl.role === \"drawer-side\";\n            const b2 = pnl.box;\n            const z0g = isSide ? b2.min.z + T3 : b2.min.z;\n            const z1g = isSide ? b2.max.z - T3 : b2.max.z;\n            const gy = by0 + dr.grooveUp - 0.5;\n            const inner = isSide ? pnl === sideL2 ? [b2.max.x - gd2, b2.max.x] : [b2.min.x, b2.min.x + gd2] : [b2.min.x, b2.max.x];\n            const gz = isSide ? [z0g, z1g] : pnl === bf ? [b2.min.z, b2.min.z + gd2] : [b2.max.z - gd2, b2.max.z];\n            pnl.features.push({\n              type: \"groove\",\n              box: box(inner[0], inner[1], gy, gy + bottomMat.thickness + 1, gz[0], gz[1]),\n              depth: gd2,\n              label: \"drawer bottom groove\"\n            });\n          });\n          const runnerY = runner.heightRef === \"box-bottom\" ? by0 + (runner.heightAboveBottom || 0) : by0 + bh / 2;\n          [[s0, AX.x], [s1, neg(AX.x)]].forEach(([xEdge, nrm]) => {\n            const holder = panels.find((pp) => pp.role === \"side-left\" && Math.abs(pp.box.max.x - xEdge) < 0.01 || pp.role === \"side-right\" && Math.abs(pp.box.min.x - xEdge) < 0.01 || pp.role === \"divider\" && (Math.abs(pp.box.max.x - xEdge) < 0.01 || Math.abs(pp.box.min.x - xEdge) < 0.01));\n            if (!holder) return;\n            [bz0 + bd - runner.frontInset, bz0 + runner.backInset].forEach((z) => holder.features.push({\n              type: \"hole\",\n              p: V(xEdge, runnerY, z),\n              normal: nrm,\n              dia: runner.holeDia,\n              depth: runner.holeDepth,\n              through: false,\n              label: \"drawer runner\",\n              fitting: runner.id\n            }));\n          });\n          if (runner.boxBack) {\n            const inset = runner.boxBack.insetFromSide;\n            const grooveTop = by0 + dr.grooveUp - 0.5 + bottomMat.thickness + 1;\n            const lockY = grooveTop + runner.boxBack.dia / 2 + (runner.boxBack.clearGroove || 0);\n            if (lockY + runner.boxBack.dia / 2 < by0 + bh) {\n              [bx0 + T3 + inset, bx0 + bw - T3 - inset].forEach((x) => bb.features.push({\n                type: \"hole\",\n                p: V(x, lockY, bz0 + T3),\n                normal: AX.z,\n                dia: runner.boxBack.dia,\n                depth: runner.boxBack.depth,\n                through: false,\n                label: \"runner locking device\",\n                fitting: runner.id\n              }));\n            } else {\n              warnings.push(`Drawer ${k + 1} in section ${si + 1} is too shallow for the ${runner.name} locking device; its holes are left out.`);\n            }\n          }\n          hardware.push({ type: \"note\", text: `${runner.name}, ${Math.round(bd)} mm, section ${si + 1}` });\n        } else {\n          warnings.push(`Drawer ${k + 1} in section ${si + 1} is too small for a box.`);\n        }\n        info.drawers.push({ index: k, y0: slot0, height: h, top: frontTop });\n        yCursor = fromTop ? slot0 : frontTop;\n      }\n      info.drawerTop = fromTop ? yIn0 : yCursor;\n      if (fromTop) {\n        info.drawersFrom = \"top\";\n        info.shelfTop = yCursor;\n      }\n      const shelfCeil = fromTop ? yCursor : yIn1;\n      const ns = shelfSpec.count;\n      const base = info.drawerTop;\n      const room = shelfCeil - base;\n      const rows = [];\n      const rowSpec = [];\n      if (ns > 0 && room > Ts + 2) {\n        const own2 = (list, k) => Array.isArray(list) && list[k] !== null && list[k] !== void 0 && Number.isFinite(Number(list[k])) ? Number(list[k]) : null;\n        if (shelfSpec.mode === \"custom\" && shelfSpec.positions.length >= ns) {\n          shelfSpec.positions.slice(0, ns).forEach((p, k) => rowSpec.push({\n            y0: base + p,\n            setback: own2(shelfSpec.setbacks, k),\n            depth: own2(shelfSpec.depths, k)\n          }));\n        } else {\n          const gap = (room - ns * Ts) / (ns + 1);\n          for (let k = 1; k <= ns; k += 1) rowSpec.push({ y0: base + k * gap + (k - 1) * Ts, setback: null, depth: null });\n        }\n        rowSpec.sort((a, b) => a.y0 - b.y0);\n        rowSpec.forEach((r, k) => {\n          const y0 = r.y0;\n          rows.push(y0);\n          if (y0 < base || y0 + Ts > shelfCeil) warnings.push(`Shelf ${k + 1} in section ${si + 1} falls outside the carcass.`);\n          const zs1 = D2 - (r.setback !== null ? Math.max(0, r.setback) : shelfSpec.setback);\n          let z0 = zs0;\n          if (r.depth !== null && r.depth > 0) {\n            z0 = zs1 - r.depth;\n            if (z0 < zs0 - 0.01) {\n              warnings.push(`Shelf ${k + 1} in section ${si + 1} was ${round1(r.depth)} mm deep; this construction's back leaves ${round1(zs1 - zs0)} mm, so it is cut ${round1(zs1 - zs0)} mm deep.`);\n              z0 = zs0;\n            }\n          }\n          const sh = add(\n            \"shelf\",\n            \"Shelf\",\n            box(s0 + play, s1 - play, y0, y0 + Ts, z0, zs1),\n            { thin: \"y\", grainAxis: \"x\", faceUp: AX.y, edging: { front: eF } }\n          );\n          sh.section = si;\n          sh.row = k;\n          sh.pins = pins;\n          shelfRef.set(sh, { front: D2 - shelfSpec.setback, rear: zs0 });\n        });\n      }\n      info.shelves = rows;\n      if (spec.rail) {\n        hardware.push({ type: \"rail\", x0: s0 + ox, x1: s1 + ox, z0: (zs0 + D2) / 2, z1: (zs0 + D2) / 2, y: yIn1 - 60, z: (zs0 + D2) / 2, dia: 25 });\n        hardware.push({ type: \"note\", text: `Hanging rail ${Math.round(secW)} mm, section ${si + 1}` });\n      }\n      sectionInfo.push(info);\n    });\n    const shelfY = sectionInfo.length ? sectionInfo[0].shelves : [];\n    if (recessed) {\n      const ph = c.plinth.height;\n      const zr = D2 - c.plinth.recess;\n      add(\"plinth\", \"Plinth\", box(xIn0, xIn1, 0, ph, zr - T3, zr), { thin: \"z\", grainAxis: \"x\", faceUp: neg(AX.z), edging: { top: 0 } });\n      if (!sidesFull) {\n        add(\"plinth-side\", \"Plinth Side\", box(0, T3, 0, ph, 0, zr - T3), { thin: \"x\", grainAxis: \"z\", faceUp: AX.x, edging: {} });\n        add(\"plinth-side\", \"Plinth Side\", box(W2 - T3, W2, 0, ph, 0, zr - T3), { thin: \"x\", grainAxis: \"z\", faceUp: neg(AX.x), edging: {} });\n      }\n    } else if (legs2) {\n      const lh = c.plinth.height;\n      [[50, 50], [W2 - 50, 50], [50, D2 - 50], [W2 - 50, D2 - 50]].forEach(([x, z]) => hardware.push({ type: \"leg\", x: x + ox, y: 0, z, height: lh, dia: 50 }));\n      hardware.push({ type: \"note\", text: `4 adjustable legs ${lh} mm` });\n    }\n    const doors = [];\n    const gD = c.doors.gap;\n    const gDr = dr.gap;\n    const doorBottom = (bayFrom, bayTo) => {\n      const tops = sectionInfo.slice(bayFrom, bayTo + 1).filter((s) => s.drawers.length && s.drawersFrom !== \"top\").map((s) => s.drawerTop);\n      return tops.length ? Math.max(...tops) + gDr / 2 : yBot + gD;\n    };\n    const doorTop = (bayFrom, bayTo) => {\n      const lows = sectionInfo.slice(bayFrom, bayTo + 1).filter((s) => s.drawers.length && s.drawersFrom === \"top\").map((s) => s.shelfTop);\n      return lows.length ? Math.min(...lows) - gDr / 2 : yTop - gD;\n    };\n    const hangDoors = (x0, x1, y0, count, hinge2, section, y1 = yTop - gD) => {\n      const dh = y1 - y0;\n      if (dh < 100) {\n        warnings.push(`${section == null ? \"The doors\" : `Bay ${section + 1}'s door`} would be only ${Math.round(dh)} mm high above the drawers.`);\n        return;\n      }\n      const dw = (x1 - x0 - (count - 1) * gD) / count;\n      for (let k = 0; k < count; k += 1) {\n        const dx0 = x0 + k * (dw + gD);\n        const hingeLeft = count === 2 ? k === 0 : hinge2 !== \"right\";\n        const door = add(\n          \"door\",\n          \"Door\",\n          box(dx0, dx0 + dw, y0, y0 + dh, D2, D2 + frontMat.thickness),\n          { mat: frontMat, thin: \"z\", grainAxis: \"y\", faceUp: neg(AX.z), edging: { top: c.edging.door, bottom: c.edging.door, left: c.edging.door, right: c.edging.door } }\n        );\n        door.hingeLeft = hingeLeft;\n        if (section != null) door.section = section;\n        doors.push(door);\n      }\n    };\n    const bayDoors = c.sections.some((sp) => sp && sp.doors);\n    if (bayDoors) {\n      c.sections.forEach((sp, si) => {\n        if (!sp.doors || !sp.doors.count || !sections[si]) return;\n        const [s0, s1] = sections[si];\n        const x0 = si === 0 ? gD : s0 - T3 / 2 + gD / 2;\n        const x1 = si === sections.length - 1 ? W2 - gD : s1 + T3 / 2 - gD / 2;\n        hangDoors(x0, x1, doorBottom(si, si), sp.doors.count, sp.doors.hinge, si, doorTop(si, si));\n      });\n    } else if (c.doors.count > 0) {\n      const nD = c.doors.count;\n      const allBays = sections.length - 1;\n      const split = Number(c.doors.split);\n      if (nD === 1 && split > 0) {\n        const ySplit = yBot + split;\n        const lo = doorBottom(0, allBays);\n        const hi = doorTop(0, allBays);\n        if (ySplit - gD / 2 - lo < 100 || hi - (ySplit + gD / 2) < 100) {\n          warnings.push(`The door split at ${Math.round(split)} mm leaves a leaf under 100 mm; one door is hung instead.`);\n          hangDoors(gD, W2 - gD, lo, 1, c.doors.hinge, null, hi);\n        } else {\n          hangDoors(gD, W2 - gD, lo, 1, c.doors.hinge, null, ySplit - gD / 2);\n          hangDoors(gD, W2 - gD, ySplit + gD / 2, 1, c.doors.hinge, null, hi);\n        }\n      } else if (nD === 1) {\n        hangDoors(gD, W2 - gD, doorBottom(0, allBays), 1, c.doors.hinge, null, doorTop(0, allBays));\n      } else {\n        const mid = W2 / 2;\n        const leftBays = sections.map((s, i) => s[0] < mid ? i : -1).filter((i) => i >= 0);\n        const rightBays = sections.map((s, i) => s[1] > mid ? i : -1).filter((i) => i >= 0);\n        const yL = leftBays.length ? doorBottom(leftBays[0], leftBays.at(-1)) : yBot + gD;\n        const yR = rightBays.length ? doorBottom(rightBays[0], rightBays.at(-1)) : yBot + gD;\n        const tL = leftBays.length ? doorTop(leftBays[0], leftBays.at(-1)) : yTop - gD;\n        const tR = rightBays.length ? doorTop(rightBays[0], rightBays.at(-1)) : yTop - gD;\n        const dw = (W2 - 3 * gD) / 2;\n        const hang = (x0, y0, hingeLeft, y1) => {\n          const dh = y1 - y0;\n          if (dh < 100) {\n            warnings.push(`A door would be only ${Math.round(dh)} mm high above the drawers.`);\n            return;\n          }\n          const door = add(\n            \"door\",\n            \"Door\",\n            box(x0, x0 + dw, y0, y0 + dh, D2, D2 + frontMat.thickness),\n            { mat: frontMat, thin: \"z\", grainAxis: \"y\", faceUp: neg(AX.z), edging: { top: c.edging.door, bottom: c.edging.door, left: c.edging.door, right: c.edging.door } }\n          );\n          door.hingeLeft = hingeLeft;\n          doors.push(door);\n        };\n        hang(gD, yL, true, tL);\n        hang(gD + dw + gD, yR, false, tR);\n      }\n    }\n    const hasFronts = () => panels.some((pnl) => pnl.role === \"door\" || pnl.role === \"drawer-front\");\n    const hd = c.handles;\n    const fronts = panels.filter((pnl) => pnl.role === \"door\" || pnl.role === \"drawer-front\");\n    if (hd.type !== \"none\") {\n      const half = hd.centres / 2;\n      const reach = (hd.type === \"knob\" ? 0 : half) + 20;\n      const TALL2 = 900;\n      const heightOf = (pnl) => pnl.box.max.y - pnl.box.min.y;\n      const natural = (pnl) => heightOf(pnl) >= TALL2 ? pnl.box.min.y + heightOf(pnl) * 0.62 : (pnl.box.min.y + pnl.box.max.y) / 2;\n      const bandOf2 = (pnl) => [pnl.box.min.y + reach, pnl.box.max.y - reach];\n      const lineFor = (group) => {\n        if (group.length < 2) return null;\n        const lo = Math.max(...group.map((pnl) => bandOf2(pnl)[0]));\n        const hi = Math.min(...group.map((pnl) => bandOf2(pnl)[1]));\n        if (lo > hi) return null;\n        const tightest = group.reduce((a, pnl) => heightOf(pnl) < heightOf(a) ? pnl : a);\n        return Math.min(hi, Math.max(lo, natural(tightest)));\n      };\n      const doorPanels = fronts.filter((pnl) => pnl.role === \"door\");\n      const tallLine = lineFor(doorPanels.filter((pnl) => heightOf(pnl) >= TALL2));\n      const shortLine = lineFor(doorPanels.filter((pnl) => heightOf(pnl) < TALL2));\n      const drawerDrop = /* @__PURE__ */ new Map();\n      fronts.filter((pnl) => pnl.role === \"drawer-front\").forEach((pnl) => {\n        const bay = pnl.section == null ? -1 : pnl.section;\n        const want = Math.min(drawerDrop.has(bay) ? drawerDrop.get(bay) : Infinity, heightOf(pnl) / 2);\n        drawerDrop.set(bay, want);\n      });\n      fronts.forEach((pnl) => {\n        const bx2 = pnl.box;\n        const zFace = bx2.max.z;\n        const isDoor = pnl.role === \"door\";\n        if (isDoor) {\n          const openLeft = !pnl.hingeLeft;\n          const x = openLeft ? bx2.min.x + hd.inset : bx2.max.x - hd.inset;\n          const [lo, hi] = bandOf2(pnl);\n          const line = heightOf(pnl) >= TALL2 ? tallLine : shortLine;\n          const y = line != null && line >= lo - 0.01 && line <= hi + 0.01 ? line : natural(pnl);\n          const pts = hd.type === \"knob\" ? [V(x, y, zFace)] : [V(x, y - half, zFace), V(x, y + half, zFace)];\n          pts.forEach((pt) => pnl.features.push({ type: \"hole\", p: pt, normal: AX.z, dia: hd.dia, depth: pnl.mat.thickness, through: true, label: \"handle\" }));\n          hardware.push({ type: \"handle\", style: hd.type, x, y, z: zFace, along: \"y\", out: AX.z, centres: hd.centres, panel: pnl.key });\n        } else {\n          const x = (bx2.min.x + bx2.max.x) / 2;\n          const h = heightOf(pnl);\n          const drop = Math.min(Math.max(drawerDrop.get(pnl.section == null ? -1 : pnl.section) || h / 2, 20), Math.max(20, h - 20));\n          const y = bx2.max.y - drop;\n          const pts = hd.type === \"knob\" ? [V(x, y, zFace)] : [V(x - half, y, zFace), V(x + half, y, zFace)];\n          pts.forEach((pt) => pnl.features.push({ type: \"hole\", p: pt, normal: AX.z, dia: hd.dia, depth: pnl.mat.thickness, through: true, label: \"handle\" }));\n          hardware.push({ type: \"handle\", style: hd.type, x, y, z: zFace, along: \"x\", out: AX.z, centres: hd.centres, panel: pnl.key });\n        }\n      });\n      if (fronts.length) hardware.push({ type: \"note\", text: `${fronts.length} ${hd.type === \"knob\" ? \"knobs\" : `bar handles, ${hd.centres} mm centres`}` });\n    }\n    const wt = c.worktop;\n    if (wt.on) {\n      const wmat = materialById(wt.materialId);\n      const frontZ = D2 + (fronts.length ? frontMat.thickness : 0) + wt.overhangFront;\n      add(\n        \"worktop\",\n        \"Worktop\",\n        box(-wt.overhangSide, W2 + wt.overhangSide, yTop, yTop + wmat.thickness, -wt.overhangBack, frontZ),\n        { mat: wmat, thin: \"y\", grainAxis: \"x\", faceUp: AX.y, edging: { front: c.edging.door } }\n      );\n    }\n    const joint = c.joints.type;\n    const holeZ = D2 > 500 ? [50, D2 / 2, D2 - 50] : [50, D2 - 50];\n    const jointAt = (fix, a0, len, old) => fix === \"cabineo\" ? [a0 + CABINEO.fromEnds, a0 + len - CABINEO.fromEnds] : old;\n    const OUTSIDE = { bottom: neg(AX.y), top: AX.y, \"top-rail\": AX.y, back: neg(AX.z), \"side-left\": neg(AX.x), \"side-right\": AX.x };\n    let cabineoUsed = false;\n    let cabineoCount = 0;\n    const faceHole = (panel, p, normal, dia, depth, through, label, extra) => panel.features.push({ type: \"hole\", p, normal, dia, depth, through, label, ...extra || null });\n    const jointHoles = (outer, inner, outerFaceNormal, points, kind) => {\n      const use = kind || joint;\n      if (use === \"none\") return;\n      points.forEach((p) => {\n        if (use === \"confirmat\") {\n          faceHole(outer, p, outerFaceNormal, 7, outer.mat.thickness, true, \"confirmat\");\n          inner.features.push({ type: \"hole\", p, normal: neg(outerFaceNormal), dia: 5, depth: 40, through: false, label: \"confirmat pilot\", face: \"edge\" });\n        } else if (use === \"cabineo\") {\n          const out = OUTSIDE[inner.role];\n          if (!out) {\n            warnings.push(`A Cabineo on the ${inner.name.toLowerCase()} has no outside face for its cup; not drilled.`);\n            return;\n          }\n          const vr = CABINEO.variants[c.joints.variant] || null;\n          const pend = vr ? null : { pending: \"cabineo-variant\", pendingWhy: CABINEO.pendingWhy };\n          const pin = V(p.x, p.y, p.z);\n          if (vr) {\n            if (out.x) pin.x = (out.x > 0 ? inner.box.max.x : inner.box.min.x) - out.x * vr.pinFromCupFace;\n            if (out.y) pin.y = (out.y > 0 ? inner.box.max.y : inner.box.min.y) - out.y * vr.pinFromCupFace;\n            if (out.z) pin.z = (out.z > 0 ? inner.box.max.z : inner.box.min.z) - out.z * vr.pinFromCupFace;\n          }\n          faceHole(outer, pin, outerFaceNormal, CABINEO.pin.dia, CABINEO.pin.depth, false, \"cabineo pin\", pend);\n          for (let k = 0; k < CABINEO.seat.count; k += 1) {\n            const d = CABINEO.seat.firstFromEdge + k * CABINEO.seat.pitch;\n            const q = V(p.x + d * outerFaceNormal.x, p.y + d * outerFaceNormal.y, p.z + d * outerFaceNormal.z);\n            if (out.x) q.x = out.x > 0 ? inner.box.max.x : inner.box.min.x;\n            if (out.y) q.y = out.y > 0 ? inner.box.max.y : inner.box.min.y;\n            if (out.z) q.z = out.z > 0 ? inner.box.max.z : inner.box.min.z;\n            faceHole(inner, q, out, CABINEO.seat.dia, vr ? vr.seatDepth : null, false, \"cabineo seat\", { ...k === 0 ? { breakout: true } : {}, ...pend || {} });\n          }\n          if (vr && vr.recess > 0) {\n            const e = V(p.x, p.y, p.z);\n            if (out.x) e.x = out.x > 0 ? inner.box.max.x : inner.box.min.x;\n            if (out.y) e.y = out.y > 0 ? inner.box.max.y : inner.box.min.y;\n            if (out.z) e.z = out.z > 0 ? inner.box.max.z : inner.box.min.z;\n            const m = CABINEO.recessMill;\n            inner.features.push({\n              type: \"recess\",\n              p: e,\n              inward: outerFaceNormal,\n              normal: out,\n              label: \"cabineo collar recess\",\n              halfWidth: vr.recessWidth / 2,\n              centre: CABINEO.seat.firstFromEdge + (CABINEO.seat.count - 1) * CABINEO.seat.pitch,\n              depth: vr.recess,\n              tool: m.tool,\n              toolDia: m.toolDia,\n              correction: m.correction,\n              clockwise: m.clockwise,\n              runOut: m.runOut\n            });\n          }\n          cabineoUsed = true;\n          cabineoCount += 1;\n        } else if (use === \"cam\") {\n          faceHole(outer, p, outerFaceNormal, 8, 11, false, \"cam bolt\");\n          inner.features.push({ type: \"hole\", p, normal: neg(outerFaceNormal), dia: 8, depth: 34, through: false, label: \"cam bolt\", face: \"edge\" });\n          const fu = inner.faceUp;\n          const q = V(p.x + 34 * outerFaceNormal.x, p.y + 34 * outerFaceNormal.y, p.z + 34 * outerFaceNormal.z);\n          if (fu.x) q.x = fu.x > 0 ? inner.box.max.x : inner.box.min.x;\n          if (fu.y) q.y = fu.y > 0 ? inner.box.max.y : inner.box.min.y;\n          if (fu.z) q.z = fu.z > 0 ? inner.box.max.z : inner.box.min.z;\n          faceHole(inner, q, fu, 15, 12.5, false, \"cam housing\");\n        } else {\n          faceHole(outer, p, outerFaceNormal, 8, 12, false, \"dowel\");\n          inner.features.push({ type: \"hole\", p, normal: neg(outerFaceNormal), dia: 8, depth: 25, through: false, label: \"dowel\", face: \"edge\" });\n        }\n      });\n    };\n    const cornerSpec = [\n      ...top ? [\n        { k: \"tl\", side: left, hor: top, sideX: T3, sideN: AX.x, horY: yTop - T3, horN: neg(AX.y) },\n        { k: \"tr\", side: right, hor: top, sideX: W2 - T3, sideN: neg(AX.x), horY: yTop - T3, horN: neg(AX.y) }\n      ] : rails.flatMap((rail) => [\n        { k: \"tl\", side: left, hor: rail, rail: true },\n        { k: \"tr\", side: right, hor: rail, rail: true }\n      ]),\n      { k: \"bl\", side: left, hor: bottom, sideX: T3, sideN: AX.x, horY: yBot + T3, horN: AX.y },\n      { k: \"br\", side: right, hor: bottom, sideX: W2 - T3, sideN: neg(AX.x), horY: yBot + T3, horN: AX.y }\n    ];\n    let railsUndrilled = false;\n    cornerSpec.forEach((cs) => {\n      const spec = cor[cs.k];\n      const fix = spec.fixing || joint;\n      if (cs.rail) {\n        if (fix === \"cabineo\") {\n          const r = cs.hor;\n          const zc = (r.box.min.z + r.box.max.z) / 2;\n          const x = cs.side === left ? T3 : W2 - T3;\n          jointHoles(cs.side, r, cs.side === left ? AX.x : neg(AX.x), [V(x, (r.box.min.y + r.box.max.y) / 2, zc)], fix);\n        } else if (fix !== \"none\") railsUndrilled = true;\n        return;\n      }\n      if (spec.over === \"side\") {\n        const y = (cs.hor.box.min.y + cs.hor.box.max.y) / 2;\n        jointHoles(cs.side, cs.hor, cs.sideN, jointAt(fix, cs.hor.box.min.z, cs.hor.box.max.z - cs.hor.box.min.z, holeZ).map((z) => V(cs.sideX, y, z)), fix);\n      } else {\n        const x = (cs.side.box.min.x + cs.side.box.max.x) / 2;\n        jointHoles(cs.hor, cs.side, cs.horN, jointAt(fix, cs.side.box.min.z, cs.side.box.max.z - cs.side.box.min.z, holeZ).map((z) => V(x, cs.horY, z)), fix);\n      }\n    });\n    panels.filter((p) => p.role === \"divider\").forEach((dv) => {\n      const x = (dv.box.min.x + dv.box.max.x) / 2;\n      const zs = holeZ.map((z) => Math.min(Math.max(z, dv.box.min.z + 30), dv.box.max.z - 30)).sort((a, b) => a - b).filter((z, k, a) => k === 0 || z - a[k - 1] >= 32);\n      jointHoles(bottom, dv, AX.y, zs.map((z) => V(x, yBot + T3, z)));\n      if (top) jointHoles(top, dv, neg(AX.y), zs.map((z) => V(x, yTop - T3, z)));\n      else railsUndrilled = true;\n    });\n    if (c.back.mode === \"inset\") {\n      const zc = (back.box.min.z + back.box.max.z) / 2;\n      const y0 = back.box.min.y;\n      const len = back.box.max.y - y0;\n      const ys = jointAt(joint, y0, len, [y0 + 50, y0 + len - 50]);\n      jointHoles(left, back, AX.x, ys.map((y) => V(T3, y, zc)));\n      jointHoles(right, back, neg(AX.x), ys.map((y) => V(W2 - T3, y, zc)));\n    }\n    if (cabineoUsed && !CABINEO.variants[c.joints.variant] && !warnings.includes(CABINEO.unresolved)) warnings.push(CABINEO.unresolved);\n    if (railsUndrilled) warnings.push(RAILS_UNDRILLED);\n    const fo = c.frontsOpen && typeof c.frontsOpen === \"object\" ? c.frontsOpen : null;\n    if (fo && FRONTS_OPEN[fo.style]) {\n      warnings.push(FRONTS_OPEN[fo.style]);\n      if (fo.style === \"glass\") {\n        const fr = Number(fo.frame) > 0 ? Number(fo.frame) : 80;\n        const rl = Number(fo.rail) > 0 ? Number(fo.rail) : fr;\n        doors.forEach((dr2) => {\n          const w = dr2.box.max.x - dr2.box.min.x;\n          const h = dr2.box.max.y - dr2.box.min.y;\n          if (h >= GLASS_MIN.h && w >= GLASS_MIN.w && w - 2 * fr >= GLASS_MIN.aperture && h - 2 * rl >= GLASS_MIN.aperture) dr2.quoted = \"glass\";\n        });\n      }\n    }\n    if (cabineoCount) hardware.push({ type: \"note\", text: `${cabineoCount} \\xD7 Lamello Cabineo 12 connector`, item: \"cabineo-12\", qty: cabineoCount });\n    const uprightsBySection = sections.map(([s0, s1]) => {\n      const l = panels.find((p) => p.role === \"side-left\" && s0 === xIn0 || p.role === \"divider\" && Math.abs(p.box.max.x - s0) < 1e-6);\n      const r = panels.find((p) => p.role === \"side-right\" && s1 === xIn1 || p.role === \"divider\" && Math.abs(p.box.min.x - s1) < 1e-6);\n      return [l, r];\n    });\n    const onBoard = (u, z) => z >= u.box.min.z + 8 && z <= u.box.max.z - 8;\n    const offWarned = /* @__PURE__ */ new Set();\n    const offBoard = (sh, u, z) => {\n      const key = sh.key + \"|\" + u.key;\n      if (offWarned.has(key)) return;\n      offWarned.add(key);\n      warnings.push(`Shelf ${sh.row + 1} in section ${sh.section + 1} reaches past the front edge of ${u.name}${u.role === \"divider\" ? \" \" + (u.slot + 1) : \"\"} (set back): its pin row at ${round1(z)} mm is not drilled into it - set the shelf back as far, or the divider forward.`);\n    };\n    panels.filter((p) => p.role === \"shelf\").forEach((sh) => {\n      const [l, r] = uprightsBySection[sh.section] || [];\n      if (!l || !r) return;\n      const y = (sh.box.min.y + sh.box.max.y) / 2;\n      if (sh.pins) {\n        const ref = shelfRef.get(sh) || { front: D2 - c.shelves.setback, rear: zs0 };\n        const front = Math.abs(sh.box.max.z - ref.front) < 1e-6 ? D2 - 37 : sh.box.max.z + (D2 - 37 - ref.front);\n        const rear = Math.abs(sh.box.min.z - ref.rear) < 1e-6 ? zBackFace + 37 : sh.box.min.z + (zBackFace + 37 - ref.rear);\n        const rows = front - rear >= 5 ? [front, rear] : [];\n        if (!rows.length) warnings.push(`Shelf ${sh.row + 1} in section ${sh.section + 1} is too shallow for its front and rear pin rows (${round1(sh.box.max.z - sh.box.min.z)} mm); no pin holes are drilled for it.`);\n        [-2, -1, 0, 1, 2].forEach((k) => {\n          const yy = sh.box.min.y + k * 32;\n          if (yy < yIn0 + 10 || yy > yIn1 - 10) return;\n          rows.forEach((z) => {\n            if (onBoard(l, z)) {\n              faceHole(l, V(l.box.max.x, yy, z), AX.x, 5, 12, false, \"shelf pin\");\n              if (k === 0) pinBearing.add(l.features[l.features.length - 1]);\n            } else if (k === 0) offBoard(sh, l, z);\n            if (onBoard(r, z)) {\n              faceHole(r, V(r.box.min.x, yy, z), neg(AX.x), 5, 12, false, \"shelf pin\");\n              if (k === 0) pinBearing.add(r.features[r.features.length - 1]);\n            } else if (k === 0) offBoard(sh, r, z);\n          });\n        });\n      } else {\n        const zIn = (u) => holeZ.map((z) => Math.min(Math.max(z, sh.box.min.z + 30, u.box.min.z + 30), sh.box.max.z - 30, u.box.max.z - 30)).sort((a, b) => a - b).filter((z, k, a) => k === 0 || z - a[k - 1] >= 32);\n        jointHoles(l, sh, AX.x, zIn(l).map((z) => V(l.box.max.x, y, z)));\n        jointHoles(r, sh, neg(AX.x), zIn(r).map((z) => V(r.box.min.x, y, z)));\n      }\n    });\n    const CUP_END = 100;\n    const hinge = hingeById(c.fittings.hinge);\n    doors.forEach((dr2) => {\n      const dh = dr2.box.max.y - dr2.box.min.y;\n      const count = dh > 2e3 ? 5 : dh > 1600 ? 4 : dh > 900 ? 3 : 2;\n      const yTopCup = dr2.box.max.y - CUP_END;\n      const yBotCup = dr2.box.min.y + CUP_END;\n      const ys = [];\n      for (let i = 0; i < count; i += 1) ys.push(yBotCup + (yTopCup - yBotCup) * (count === 1 ? 0.5 : i / (count - 1)));\n      const hx = dr2.hingeLeft ? dr2.box.min.x + hinge.cupInset : dr2.box.max.x - hinge.cupInset;\n      const bayUprights = dr2.section != null ? uprightsBySection[dr2.section] : null;\n      const carrier = bayUprights && bayUprights[dr2.hingeLeft ? 0 : 1] || (dr2.hingeLeft ? left : right);\n      const cx = dr2.hingeLeft ? carrier.box.max.x : carrier.box.min.x;\n      const cn = dr2.hingeLeft ? AX.x : neg(AX.x);\n      dr2.hinge = V(dr2.hingeLeft ? dr2.box.min.x : dr2.box.max.x, 0, dr2.box.min.z);\n      dr2.swingSign = dr2.hingeLeft ? -1 : 1;\n      const half = hinge.plateSpacing / 2;\n      ys.forEach((y) => {\n        faceHole(dr2, V(hx, y, D2), neg(AX.z), hinge.cupDia, hinge.cupDepth, false, \"hinge cup\", { fitting: hinge.id });\n        if (hinge.dowels) {\n          const dx = dr2.hingeLeft ? hx - hinge.dowels.offset : hx + hinge.dowels.offset;\n          [-1, 1].forEach((sgn) => faceHole(\n            dr2,\n            V(dx, y + sgn * hinge.dowels.spacing / 2, D2),\n            neg(AX.z),\n            hinge.dowels.dia,\n            hinge.dowels.depth,\n            false,\n            \"hinge dowel\",\n            { fitting: hinge.id }\n          ));\n        }\n        [-half, half].forEach((dy) => faceHole(\n          carrier,\n          V(cx, y + dy, D2 - hinge.plateInset),\n          cn,\n          hinge.plateDia,\n          hinge.plateDepth,\n          false,\n          \"hinge plate\",\n          { fitting: hinge.id }\n        ));\n      });\n      hardware.push({ type: \"note\", text: `${count} \\xD7 ${hinge.name} per door` });\n    });\n    panels.filter((p) => [\"door\", \"drawer-front\"].includes(p.role)).forEach((p) => {\n      const spec = p.section == null ? null : c.sections[p.section];\n      const style2 = spec && spec.frontStyle || c.frontStyle;\n      if (style2 !== \"shaker\") return;\n      const opts = { ...c.shaker, ...spec && spec.shaker || {} };\n      const b = p.box;\n      if (![1, 2, 4].includes(Number(opts.panels)) || ![\"frame\", \"rail\", \"railAt\", \"depth\"].every((key) => Number.isFinite(Number(opts[key]))) || Number(opts.frame) <= 0 || Number(opts.rail) <= 0 || Number(opts.railAt) < 0) {\n        warnings.push(p.name + \": Shaker parameters are invalid. Choose 1, 2 or 4 panels and finite positive dimensions.\");\n        p.shakerError = true;\n        return;\n      }\n      if (Number(opts.panels) === 1 && Number(opts.frame) <= 150) {\n        const fit = Math.floor(Math.min(b.max.y - b.min.y, b.max.x - b.min.x) / 2 - 40 / 2);\n        if (fit < Number(opts.frame) && fit >= 30) {\n          opts.frame = fit;\n          opts.rail = Math.min(Number(opts.rail), fit);\n        }\n      }\n      const result = shakerPockets({ length: b.max.y - b.min.y, width: b.max.x - b.min.x }, opts);\n      if (result.error || !(Number(opts.depth) > 0 && Number(opts.depth) < p.mat.thickness)) {\n        warnings.push(p.name + \": \" + (result.error || \"Shaker depth must be smaller than the board thickness.\"));\n        p.shakerError = true;\n        return;\n      }\n      p.frontStyle = \"shaker\";\n      const perPanel = result.panels > 0 ? Math.max(1, Math.round(result.pockets.length / result.panels)) : 1;\n      result.pockets.filter((r, j) => j % perPanel === 0).forEach((r, i) => p.features.push({\n        type: \"pocket\",\n        shaker: true,\n        depth: r.depth,\n        label: \"Shaker panel \" + (i + 1),\n        passes: result.pockets.slice(i * perPanel, (i + 1) * perPanel).map((q) => ({ id: q.id, tool: q.tool, diameter: q.diameter, overlap: q.overlap, radius: q.radius })),\n        box: box(\n          b.min.x + r.y - r.width / 2,\n          b.min.x + r.y + r.width / 2,\n          b.min.y + r.x - r.length / 2,\n          b.min.y + r.x + r.length / 2,\n          b.max.z - r.depth,\n          b.max.z\n        )\n      }));\n    });\n    applyCutouts(panels, c.cutouts, warnings, { depth: D2, underside: yBase });\n    if (ox) {\n      panels.forEach((p) => {\n        p.box = box(p.box.min.x + ox, p.box.max.x + ox, p.box.min.y, p.box.max.y, p.box.min.z, p.box.max.z);\n        p.features.forEach((f) => {\n          if (f.box) f.box = box(f.box.min.x + ox, f.box.max.x + ox, f.box.min.y, f.box.max.y, f.box.min.z, f.box.max.z);\n          if (f.p) f.p = V(f.p.x + ox, f.p.y, f.p.z);\n          if (f.pts) f.pts = f.pts.map((q) => V(q.x + ox, q.y, q.z));\n        });\n      });\n    }\n    const dims = {\n      width: W2 + (c.worktop.on ? 2 * c.worktop.overhangSide : 0),\n      height: H2 + (c.worktop.on ? materialById(c.worktop.materialId).thickness : 0),\n      depth: D2 + (c.back.mode === \"overlay\" ? Tb : 0) + (hasFronts() ? frontMat.thickness : 0) + (c.worktop.on ? c.worktop.overhangFront : 0),\n      carcassDepth: D2,\n      innerWidth: innerW,\n      innerHeight: innerH,\n      thickness: T3,\n      backThickness: Tb,\n      zBackFace,\n      sections: sections.map(([a, b]) => round1(b - a)),\n      offsetX: ox,\n      innerX: [xIn0 + ox, xIn1 + ox],\n      innerY: [yIn0, yIn1],\n      innerZ: [zBackFace + cl, D2],\n      shelfRows: shelfY.slice(),\n      // absolute Y of section 1's rows (kept for the overall view)\n      sectionInfo,\n      // per section: x range, its shelves, its drawers\n      dividerXs: dividerX.map((x) => x + ox),\n      // absolute X of the LEFT face of each divider\n      sectionRanges: sections.map(([a, b]) => [a + ox, b + ox]),\n      bounds: box(\n        ox - (c.worktop.on ? c.worktop.overhangSide : 0),\n        ox + W2 + (c.worktop.on ? c.worktop.overhangSide : 0),\n        0,\n        H2 + (c.worktop.on ? materialById(c.worktop.materialId).thickness : 0),\n        c.back.mode === \"overlay\" ? -Tb : 0,\n        D2 + (hasFronts() ? frontMat.thickness : 0) + (c.worktop.on ? c.worktop.overhangFront : 0)\n      )\n    };\n    dims.local = {\n      innerX: [xIn0 + ox, xIn1 + ox],\n      innerZ: [zBackFace + cl, D2],\n      dividerXs: dividerX.map((x) => x + ox),\n      sectionRanges: sections.map(([a2, b2]) => [a2 + ox, b2 + ox]),\n      sectionX: sectionInfo.map((info) => [info.x0, info.x1])\n    };\n    if (oy || oz) shiftBuild({ panels, hardware, dims }, oy, oz);\n    dims.offsetY = oy;\n    dims.offsetZ = oz;\n    const quarter2 = (Math.round((ctx.rotation || 0) / 90) % 4 + 4) % 4;\n    (dims.sectionInfo || []).forEach((info) => {\n      if (info.z0 == null) {\n        info.z0 = round1(dims.innerZ[0]);\n        info.z1 = round1(dims.innerZ[1]);\n      }\n    });\n    dims.rotation = quarter2 * 90;\n    dims.anchor = { x: ox, z: oz };\n    dims.axes = AXES_AT[quarter2];\n    if (quarter2) rotateBuild({ panels, hardware, dims }, quarter2, ox, oz, W2, D2);\n    panels.forEach((p) => {\n      const pins = p.features.filter((f) => f.type === \"hole\" && f.label === \"shelf pin\");\n      if (!pins.length) return;\n      p.features.forEach((f) => {\n        if (f.type !== \"hole\" || f.label !== \"hinge plate\") return;\n        let best = null;\n        let bestD = Infinity;\n        pins.forEach((q) => {\n          if (Math.abs(q.dia - f.dia) > 0.01) return;\n          if (!q.normal || !f.normal || Math.abs(q.normal.x - f.normal.x) + Math.abs(q.normal.y - f.normal.y) + Math.abs(q.normal.z - f.normal.z) > 0.01) return;\n          if (Math.hypot(q.p.x - f.p.x, q.p.z - f.p.z) > 0.5) return;\n          const d = Math.hypot(q.p.x - f.p.x, q.p.y - f.p.y, q.p.z - f.p.z);\n          if (d < bestD) {\n            bestD = d;\n            best = q;\n          }\n        });\n        if (best && bestD <= 16) {\n          f.p = { x: best.p.x, y: best.p.y, z: best.p.z };\n          f.depth = Math.max(f.depth, best.depth);\n          f.label = \"shelf pin / hinge plate\";\n          best.merged = true;\n        }\n      });\n      p.features = p.features.filter((f) => !f.merged);\n    });\n    const sameFace = (a, b) => a.normal && b.normal && Math.abs(a.normal.x - b.normal.x) + Math.abs(a.normal.y - b.normal.y) + Math.abs(a.normal.z - b.normal.z) <= 0.01;\n    panels.forEach((p) => {\n      if (!p.features.some((f) => f.type === \"hole\" && f.label === \"shelf pin\")) return;\n      const kept = [];\n      p.features.forEach((f) => {\n        if (f.type !== \"hole\" || f.label !== \"shelf pin\") {\n          kept.push(f);\n          return;\n        }\n        const twin = kept.find((g2) => g2.type === \"hole\" && g2.label === \"shelf pin\" && sameFace(f, g2) && Math.hypot(g2.p.x - f.p.x, g2.p.y - f.p.y, g2.p.z - f.p.z) < 0.01);\n        if (twin) {\n          if (pinBearing.has(f)) pinBearing.add(twin);\n          return;\n        }\n        kept.push(f);\n      });\n      const clash = (f, g2) => g2 !== f && g2.type === \"hole\" && g2.p && sameFace(f, g2) && Math.hypot(g2.p.x - f.p.x, g2.p.y - f.p.y, g2.p.z - f.p.z) < (f.dia + g2.dia) / 2;\n      const out = kept.filter((f) => {\n        if (f.type !== \"hole\" || f.label !== \"shelf pin\" || pinBearing.has(f)) return true;\n        return !kept.some((g2) => clash(f, g2) && (g2.label !== \"shelf pin\" || pinBearing.has(g2)));\n      });\n      const fin = [];\n      out.forEach((f) => {\n        if (f.type === \"hole\" && f.label === \"shelf pin\" && !pinBearing.has(f) && fin.some((g2) => clash(f, g2))) return;\n        fin.push(f);\n      });\n      fin.forEach((f) => {\n        if (f.type === \"hole\" && f.label === \"shelf pin\" && pinBearing.has(f) && fin.some((g2) => clash(f, g2)))\n          warnings.push(`${p.name}: a shelf-pin hole a shelf rests on runs into another hole at ${round1(f.p.y)} mm high.`);\n      });\n      p.features = fin;\n    });\n    panels.filter((p) => p.role === \"divider\").forEach((dv) => {\n      const out = (dv.features || []).filter((h) => h && h.p && Number.isFinite(h.p.z) && (h.p.z > dv.box.max.z + 0.01 || h.p.z < dv.box.min.z - 0.01));\n      if (!out.length) return;\n      dv.features = dv.features.filter((h) => !out.includes(h));\n      warnings.push(`Divider ${dv.slot + 1} is set back: ${out.length} hole(s) for the parts beside it would fall outside its board and are not drilled (${[...new Set(out.map((h) => h.label || h.type))].join(\", \")}).`);\n    });\n    return { panels, hardware, dims, warnings, cabinet: c };\n  }\n  var AXES_AT = [\n    { along: \"x\", alongSign: 1, depth: \"z\", depthSign: 1, facing: \"front\" },\n    { along: \"z\", alongSign: -1, depth: \"x\", depthSign: 1, facing: \"right\" },\n    { along: \"x\", alongSign: -1, depth: \"z\", depthSign: -1, facing: \"back\" },\n    { along: \"z\", alongSign: 1, depth: \"x\", depthSign: -1, facing: \"left\" }\n  ];\n  function turnXZ(quarter2, x, z, W2, D2) {\n    if (quarter2 === 1) return [z, W2 - x];\n    if (quarter2 === 2) return [W2 - x, D2 - z];\n    if (quarter2 === 3) return [D2 - z, x];\n    return [x, z];\n  }\n  function turnDir(quarter2, dx, dz) {\n    if (quarter2 === 1) return [dz, -dx];\n    if (quarter2 === 2) return [-dx, -dz];\n    if (quarter2 === 3) return [-dz, dx];\n    return [dx, dz];\n  }\n  var SWAP_AXIS = { x: \"z\", z: \"x\", y: \"y\" };\n  function rotateBuild({ panels, hardware, dims }, quarter2, ax, az, W2, D2) {\n    const pt = (x, z) => {\n      const [u, w] = turnXZ(quarter2, x - ax, z - az, W2, D2);\n      return [u + ax, w + az];\n    };\n    const dir = (x, z) => turnDir(quarter2, x, z);\n    const mvBox = (bx2) => {\n      const [x0, z0] = pt(bx2.min.x, bx2.min.z);\n      const [x1, z1] = pt(bx2.max.x, bx2.max.z);\n      return box(x0, x1, bx2.min.y, bx2.max.y, z0, z1);\n    };\n    const mvVec = (v) => {\n      const [x, z] = dir(v.x, v.z);\n      return V(x, v.y, z);\n    };\n    const mvPoint = (v) => {\n      const [x, z] = pt(v.x, v.z);\n      return V(x, v.y, z);\n    };\n    const swapName = quarter2 % 2 ? ((n2) => SWAP_AXIS[n2] || n2) : ((n2) => n2);\n    panels.forEach((p) => {\n      p.box = mvBox(p.box);\n      if (p.thin) p.thin = swapName(p.thin);\n      if (p.grainAxis) p.grainAxis = swapName(p.grainAxis);\n      if (p.faceUp) p.faceUp = mvVec(p.faceUp);\n      if (p.front) p.front = mvVec(p.front);\n      if (p.hinge) p.hinge = mvPoint(p.hinge);\n      (p.features || []).forEach((f) => {\n        if (f.box) f.box = mvBox(f.box);\n        if (f.p) f.p = mvPoint(f.p);\n        if (f.pts) f.pts = f.pts.map(mvPoint);\n        if (f.normal) f.normal = mvVec(f.normal);\n      });\n    });\n    hardware.forEach((h) => {\n      if (h.type === \"rail\") {\n        const [x0, z0] = pt(h.x0, h.z0 == null ? h.z : h.z0);\n        const [x1, z1] = pt(h.x1, h.z1 == null ? h.z : h.z1);\n        h.x0 = round1(x0);\n        h.z0 = round1(z0);\n        h.x1 = round1(x1);\n        h.z1 = round1(z1);\n        h.z = round1((z0 + z1) / 2);\n      } else if (Number.isFinite(h.x) && Number.isFinite(h.z)) {\n        const [x, z] = pt(h.x, h.z);\n        h.x = round1(x);\n        h.z = round1(z);\n        if (h.out) h.out = mvVec(h.out);\n      }\n    });\n    const range = (xs, zs) => {\n      const a1 = pt(xs[0], zs[0]);\n      const b1 = pt(xs[1], zs[1]);\n      return { x: [Math.min(a1[0], b1[0]), Math.max(a1[0], b1[0])], z: [Math.min(a1[1], b1[1]), Math.max(a1[1], b1[1])] };\n    };\n    const inner = range(dims.innerX, dims.innerZ);\n    dims.innerX = inner.x.map(round1);\n    dims.innerZ = inner.z.map(round1);\n    dims.zBackFace = round1(pt(dims.innerX[0], dims.zBackFace)[1]);\n    dims.bounds = mvBox(dims.bounds);\n    const zMid = (dims.innerZ[0] + dims.innerZ[1]) / 2;\n    dims.dividerXs = (dims.dividerXs || []).map((x) => round1(pt(x, zMid)[0]));\n    dims.sectionRanges = (dims.sectionRanges || []).map(([a1, b1]) => [round1(pt(a1, zMid)[0]), round1(pt(b1, zMid)[0])].sort((m, n2) => m - n2));\n    const zIn = dims.local.innerZ;\n    (dims.sectionInfo || []).forEach((info, i) => {\n      const r = dims.local.sectionX[i] || [info.x0, info.x1];\n      const p0 = pt(r[0], zIn[0]);\n      const p1 = pt(r[1], zIn[1]);\n      info.x0 = round1(Math.min(p0[0], p1[0]));\n      info.x1 = round1(Math.max(p0[0], p1[0]));\n      info.z0 = round1(Math.min(p0[1], p1[1]));\n      info.z1 = round1(Math.max(p0[1], p1[1]));\n    });\n    if (quarter2 % 2) {\n      const w = dims.width;\n      dims.width = dims.depth;\n      dims.depth = w;\n    }\n  }\n  function shiftBuild({ panels, hardware, dims }, oy, oz) {\n    const mv = (bx2) => box(bx2.min.x, bx2.max.x, bx2.min.y + oy, bx2.max.y + oy, bx2.min.z + oz, bx2.max.z + oz);\n    panels.forEach((p) => {\n      p.box = mv(p.box);\n      (p.features || []).forEach((f) => {\n        if (f.box) f.box = mv(f.box);\n        if (f.p) f.p = V(f.p.x, f.p.y + oy, f.p.z + oz);\n        if (f.pts) f.pts = f.pts.map((q) => V(q.x, q.y + oy, q.z + oz));\n      });\n    });\n    hardware.forEach((h) => {\n      if (Number.isFinite(h.y)) h.y += oy;\n      if (Number.isFinite(h.z)) h.z += oz;\n    });\n    dims.zBackFace += oz;\n    dims.innerY = dims.innerY.map((v) => v + oy);\n    dims.innerZ = dims.innerZ.map((v) => v + oz);\n    dims.shelfRows = dims.shelfRows.map((v) => v + oy);\n    (dims.sectionInfo || []).forEach((info) => {\n      info.drawerTop += oy;\n      if (info.shelfTop != null) info.shelfTop += oy;\n      info.shelves = info.shelves.map((v) => v + oy);\n      (info.drawers || []).forEach((d) => {\n        d.y0 += oy;\n        d.top += oy;\n      });\n    });\n    dims.bounds = mv(dims.bounds);\n  }\n  function panelFrame(panel) {\n    const s = size(panel.box);\n    const n = panel.faceUp;\n    const faceAxes = [\"x\", \"y\", \"z\"].filter((a) => a !== panel.thin);\n    let uAxis = panel.grainAxis && faceAxes.includes(panel.grainAxis) ? panel.grainAxis : null;\n    if (!uAxis) uAxis = s[faceAxes[0]] >= s[faceAxes[1]] ? faceAxes[0] : faceAxes[1];\n    let u = AX[uAxis];\n    let v = cross(n, u);\n    const front = panel.front || AX.z;\n    const upish = dot(v, AX.y);\n    if (upish < -0.5 || Math.abs(upish) < 0.5 && dot(v, front) < -0.5) {\n      u = neg(u);\n      v = neg(v);\n    }\n    const c = centre(panel.box);\n    const r2 = (x) => Math.round(x * 100) / 100;\n    const length = r2(s[uAxis]);\n    const width = r2(Math.abs(dot(V(s.x, s.y, s.z), V(Math.abs(v.x), Math.abs(v.y), Math.abs(v.z)))));\n    const thickness = r2(s[panel.thin]);\n    const origin = V(\n      c.x - length / 2 * u.x - width / 2 * v.x - thickness / 2 * n.x,\n      c.y - length / 2 * u.y - width / 2 * v.y - thickness / 2 * n.y,\n      c.z - length / 2 * u.z - width / 2 * v.z - thickness / 2 * n.z\n    );\n    return { u, v, n, origin, length, width, thickness };\n  }\n  function toLocal(frame2, p) {\n    const d = sub(p, frame2.origin);\n    return { u: dot(d, frame2.u), v: dot(d, frame2.v), w: dot(d, frame2.n) };\n  }\n  function sideCode(frame2, sideName, front) {\n    const dir = turnSide(SIDES[sideName], front);\n    const du = dot(frame2.u, dir);\n    const dv = dot(frame2.v, dir);\n    if (du > 0.5) return \"W2\";\n    if (du < -0.5) return \"W1\";\n    if (dv > 0.5) return \"L1\";\n    if (dv < -0.5) return \"L2\";\n    return null;\n  }\n  function localFeatures(panel, frame2) {\n    const out = [];\n    let notched = false;\n    panel.features.forEach((f) => {\n      if (f.type === \"groove\" || f.type === \"pocket\") {\n        const corners = [];\n        [f.box.min.x, f.box.max.x].forEach((x) => [f.box.min.y, f.box.max.y].forEach((y) => [f.box.min.z, f.box.max.z].forEach((z) => corners.push(toLocal(frame2, V(x, y, z))))));\n        const us = corners.map((c) => c.u);\n        const vs = corners.map((c) => c.v);\n        const ws = corners.map((c) => c.w);\n        const onUp = Math.max(...ws) > frame2.thickness - 1e-6;\n        out.push({ type: f.type, u0: round1(Math.min(...us)), u1: round1(Math.max(...us)), v0: round1(Math.min(...vs)), v1: round1(Math.max(...vs)), depth: f.depth, face: onUp ? \"up\" : \"down\", label: f.label, ...f.shaker ? { shaker: true } : {}, ...Array.isArray(f.passes) && f.passes.length ? { passes: f.passes.map((q) => ({ ...q })) } : {} });\n      } else if (f.type === \"hole\") {\n        const l = toLocal(frame2, f.p);\n        const along2 = dot(f.normal, frame2.n);\n        const face2 = f.face === \"edge\" ? \"edge\" : f.through ? \"up\" : along2 > 0.5 ? \"up\" : along2 < -0.5 ? \"down\" : \"edge\";\n        out.push({ type: \"hole\", u: round1(l.u), v: round1(l.v), ...face2 === \"edge\" ? { w: round1(l.w) } : {}, dia: f.dia, depth: f.depth, through: !!f.through, face: face2, label: f.label, ...f.breakout ? { breakout: true } : {}, ...f.pending ? { pending: f.pending, pendingWhy: f.pendingWhy } : {} });\n      } else if (f.type === \"recess\") {\n        const l = toLocal(frame2, f.p);\n        const along2 = dot(f.normal, frame2.n);\n        out.push({\n          type: \"recess\",\n          u: round1(l.u),\n          v: round1(l.v),\n          du: round1(dot(f.inward, frame2.u) * 1e3) / 1e3,\n          dv: round1(dot(f.inward, frame2.v) * 1e3) / 1e3,\n          face: along2 > 0.5 ? \"up\" : \"down\",\n          halfWidth: f.halfWidth,\n          centre: f.centre,\n          depth: f.depth,\n          label: f.label,\n          tool: f.tool,\n          toolDia: f.toolDia,\n          correction: f.correction,\n          clockwise: f.clockwise,\n          runOut: f.runOut\n        });\n      } else if (f.type === \"cutout\") {\n        const pts = f.pts.map((q) => {\n          const l = toLocal(frame2, q);\n          return { u: round1(l.u), v: round1(l.v) };\n        });\n        const shape2 = cutoutShape(pts, frame2.length, frame2.width);\n        const base = { type: \"cutout\", id: f.id, face: \"up\", through: !!f.through, depth: f.through ? frame2.thickness : f.depth, label: f.label };\n        if (shape2.fault) out.push({ ...base, pts, pending: \"cutout-shape\", pendingWhy: shape2.fault });\n        else if (shape2.kind === \"hole\") out.push({ ...base, kind: \"hole\", pts: shape2.pts });\n        else if (!f.through) out.push({ ...base, pts, pending: \"cutout-shape\", pendingWhy: \"a cut-out open onto the edge of the part must go through the board\" });\n        else if (notched) out.push({ ...base, pts, pending: \"cutout-second-notch\", pendingWhy: \"one cut-out per part may open onto its edge; this second one is not cut\" });\n        else {\n          notched = true;\n          out.push({ ...base, kind: \"notch\", pts, outline: shape2.outline });\n        }\n      }\n    });\n    return out;\n  }\n  var _internal = { box, size, centre, V, AX };\n  function mergeWorktops(builds, maxGap = 100) {\n    const tops = builds.map((b) => (b.panels || []).find((p) => p.role === \"worktop\") || null);\n    const runs = [];\n    const splits = [];\n    let current = null;\n    const same = (a, b) => a && b && a.mat.id === b.mat.id && Math.abs(dot(a.front || AX.z, b.front || AX.z) - 1) < 0.01 && Math.abs(a.box.max.y - a.box.min.y - (b.box.max.y - b.box.min.y)) < 0.01 && Math.abs(a.box.min.y - b.box.min.y) < 0.01 && Math.min(a.box.max.z, b.box.max.z) - Math.max(a.box.min.z, b.box.min.z) > 1 && b.box.min.x - a.box.max.x <= maxGap + 0.01;\n    const order = tops.map((top, i) => i).filter((i) => tops[i]).sort((i, j) => tops[i].box.min.x - tops[j].box.min.x);\n    order.forEach((i) => {\n      const top = tops[i];\n      if (current && same(tops[current.at(-1)], top)) {\n        const sheetLength = top.mat.sheet && top.mat.sheet.length || Infinity;\n        const runStart = tops[current[0]].box.min.x;\n        if (top.box.max.x - runStart <= sheetLength + 0.01) {\n          current.push(i);\n          return;\n        }\n        splits.push({ atCabinet: i, x: round1(top.box.min.x), sheetLength });\n        const w = `The worktop is split at the left of this cabinet: a ${sheetLength} mm ${top.mat.name} board runs out.`;\n        if (builds[i].warnings && !builds[i].warnings.includes(w)) builds[i].warnings.push(w);\n      }\n      current = [i];\n      runs.push(current);\n    });\n    const welded = [];\n    runs.forEach((idx, n) => {\n      if (idx.length < 2) return;\n      const parts = idx.map((i) => tops[i]);\n      const first = parts[0];\n      const merged = {\n        ...first,\n        key: `${first.cabinetId}:worktop-run:${n + 1}`,\n        box: box(\n          Math.min(...parts.map((p) => p.box.min.x)),\n          Math.max(...parts.map((p) => p.box.max.x)),\n          first.box.min.y,\n          first.box.max.y,\n          Math.min(...parts.map((p) => p.box.min.z)),\n          Math.max(...parts.map((p) => p.box.max.z))\n        ),\n        features: [],\n        run: idx.length\n      };\n      idx.forEach((i) => {\n        builds[i].panels = builds[i].panels.filter((p) => p.role !== \"worktop\");\n      });\n      builds[idx[0]].panels.push(merged);\n      welded.push({ key: merged.key, cabinets: idx.length, length: round1(merged.box.max.x - merged.box.min.x) });\n    });\n    welded.splits = splits;\n    return welded;\n  }\n  var { box: box2, V: V2, AX: AX2 } = _internal;\n  var r12 = (v) => Math.round(v * 10) / 10;\n  var neg2 = (v) => V2(-v.x, -v.y, -v.z);\n  var DEFAULT_KITCHEN = Object.freeze({\n    // Fillers and end panels a person put there, each with its own place.\n    items: [],\n    // One plinth board across neighbouring cabinets instead of a piece each. A cabinet on legs\n    // joins the run too: legs plus a clip-on plinth is how a kitchen is actually built, and the\n    // board then needs a notch where a leg stands in its way.\n    plinthRun: false,\n    plinthSetback: 30,\n    plinthHeight: 0,\n    // 0 = take it from the cabinets\n    // A strip over the wall units and one under them, by the run.\n    cornice: null,\n    // { height, projection }\n    lightRail: null,\n    // { height, projection }\n    materialId: \"\"\n    // the board these are cut from; empty = each cabinet's front board\n  });\n  var KITCHEN_LIMITS = {\n    fillerWidth: [10, 600],\n    scribe: [0, 60],\n    panelOverhang: [0, 100],\n    corniceHeight: [20, 200],\n    projection: [0, 120],\n    plinthSetback: [0, 150],\n    plinthHeight: [40, 250]\n  };\n  var clamp2 = (v, [lo, hi], dflt = lo) => {\n    const n = Number(v);\n    return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : dflt;\n  };\n  function normaliseKitchen(input) {\n    const d = DEFAULT_KITCHEN;\n    const k = { ...d, ...input && typeof input === \"object\" ? input : {} };\n    k.items = (Array.isArray(k.items) ? k.items : []).map((raw, i) => {\n      const it = { ...raw && typeof raw === \"object\" ? raw : {} };\n      it.id = it.id || `k${i + 1}`;\n      if (it.kind === \"filler\") {\n        it.x = Number(it.x) || 0;\n        it.width = clamp2(it.width, KITCHEN_LIMITS.fillerWidth, 50);\n        it.scribe = clamp2(it.scribe, KITCHEN_LIMITS.scribe, 0);\n        return it;\n      }\n      if (it.kind === \"end-panel\") {\n        it.side = it.side === \"right\" ? \"right\" : \"left\";\n        it.overhangFront = clamp2(it.overhangFront, KITCHEN_LIMITS.panelOverhang, 0);\n        return it;\n      }\n      return it;\n    }).filter((it) => it.kind === \"filler\" || it.kind === \"end-panel\");\n    k.plinthRun = !!k.plinthRun;\n    k.plinthSetback = clamp2(k.plinthSetback, KITCHEN_LIMITS.plinthSetback, 30);\n    k.plinthHeight = k.plinthHeight ? clamp2(k.plinthHeight, KITCHEN_LIMITS.plinthHeight, 150) : 0;\n    const strip = (s, dh) => s && typeof s === \"object\" ? { height: clamp2(s.height, KITCHEN_LIMITS.corniceHeight, dh), projection: clamp2(s.projection, KITCHEN_LIMITS.projection, 0) } : null;\n    k.cornice = strip(k.cornice, 60);\n    k.lightRail = strip(k.lightRail, 60);\n    return k;\n  }\n  function kitchenIsEmpty(k) {\n    const n = normaliseKitchen(k);\n    return !n.items.length && !n.plinthRun && !n.cornice && !n.lightRail;\n  }\n  var boxOfPanels = (ps) => {\n    if (!ps.length) return null;\n    const xs = ps.flatMap((p) => [p.box.min.x, p.box.max.x]);\n    const ys = ps.flatMap((p) => [p.box.min.y, p.box.max.y]);\n    const zs = ps.flatMap((p) => [p.box.min.z, p.box.max.z]);\n    return box2(Math.min(...xs), Math.max(...xs), Math.min(...ys), Math.max(...ys), Math.min(...zs), Math.max(...zs));\n  };\n  var FRONT_ROLES = [\"door\", \"drawer-front\"];\n  function carcassOf(build3) {\n    return boxOfPanels((build3.panels || []).filter((p) => p.role !== \"worktop\" && !FRONT_ROLES.includes(p.role)));\n  }\n  function outerOf(build3) {\n    return boxOfPanels((build3.panels || []).filter((p) => p.role !== \"worktop\"));\n  }\n  var frontOf = (build3) => ((build3.panels || [])[0] || {}).front || AX2.z;\n  var facesSame = (a, b) => Math.abs(frontOf(a).x - frontOf(b).x) < 0.01 && Math.abs(frontOf(a).z - frontOf(b).z) < 0.01;\n  function runsOf(builds, { wall = false, maxGap = 100 } = {}) {\n    const items = builds.map((b, i) => ({ b, i, boxOf: carcassOf(b) })).filter((it) => it.boxOf && (wall ? it.boxOf.min.y > 300 : it.boxOf.min.y <= 300)).sort((p, q) => p.boxOf.min.x - q.boxOf.min.x);\n    const runs = [];\n    items.forEach((it) => {\n      const last = runs.length ? runs[runs.length - 1] : null;\n      const prev = last ? last[last.length - 1] : null;\n      const joins = prev && facesSame(prev.b, it.b) && Math.abs(prev.boxOf.min.y - it.boxOf.min.y) < 1 && Math.abs(prev.boxOf.max.y - it.boxOf.max.y) < 1 && it.boxOf.min.x - prev.boxOf.max.x <= maxGap + 0.01 && Math.min(prev.boxOf.max.z, it.boxOf.max.z) - Math.max(prev.boxOf.min.z, it.boxOf.min.z) > 1;\n      if (joins) last.push(it);\n      else runs.push([it]);\n    });\n    return runs;\n  }\n  function overlapWarnings(panels) {\n    const over = (ax0, ax1, bx0, bx1) => Math.min(ax1, bx1) - Math.max(ax0, bx0) > 0.5;\n    const clash = (a, b) => over(a.box.min.x, a.box.max.x, b.box.min.x, b.box.max.x) && over(a.box.min.y, a.box.max.y, b.box.min.y, b.box.max.y) && over(a.box.min.z, a.box.max.z, b.box.min.z, b.box.max.z);\n    const up = panels.map((_, i) => i);\n    const root = (i) => {\n      while (up[i] !== i) {\n        up[i] = up[up[i]];\n        i = up[i];\n      }\n      return i;\n    };\n    panels.forEach((a, i) => panels.slice(i + 1).forEach((b, j) => {\n      if (clash(a, b)) up[root(i + 1 + j)] = root(i);\n    }));\n    const groups = /* @__PURE__ */ new Map();\n    panels.forEach((p, i) => {\n      const r = root(i);\n      if (!groups.has(r)) groups.set(r, []);\n      groups.get(r).push(p);\n    });\n    const out = [];\n    groups.forEach((members) => {\n      if (members.length < 2) return;\n      const kinds = [];\n      members.forEach((p) => {\n        const what = String(p.name || \"part\").toLowerCase();\n        const label = p.where ? `${what} ${p.where}` : what;\n        const k = kinds.find((x) => x.label === label);\n        if (k) k.n += 1;\n        else kinds.push({ label, what, where: p.where, n: 1 });\n      });\n      if (kinds.length === 1) {\n        const k = kinds[0];\n        out.push(`${k.n} ${k.what}s${k.where ? ` ${k.where}` : \"\"} stand in the same place \\u2014 keep one of them.`);\n        return;\n      }\n      const named = kinds.map((k) => k.n > 1 ? `${k.n} ${k.what}s${k.where ? ` ${k.where}` : \"\"}` : `the ${k.label}`);\n      const list = named.length === 2 ? `${named[0]} and ${named[1]}` : `${named.slice(0, -1).join(\", \")} and ${named[named.length - 1]}`;\n      out.push(`${list[0].toUpperCase()}${list.slice(1)} stand in the same place \\u2014 move one of them.`);\n    });\n    return out;\n  }\n  function buildKitchen(project, builds) {\n    const k = normaliseKitchen(project && project.kitchen);\n    if (kitchenIsEmpty(k)) return null;\n    const panels = [];\n    const warnings = [];\n    const notes = [];\n    let n = 0;\n    const boardFor = (own2, build3) => {\n      if (own2) return materialById(own2);\n      if (k.materialId) return materialById(k.materialId);\n      const c = build3 && build3.cabinet || builds[0] && builds[0].cabinet || {};\n      return materialById(c.frontMaterialId || c.materialId || \"mfc-white-18\");\n    };\n    const cabinets = builds.filter((b) => b && b.cabinet && !b.kitchen);\n    const cabName = (build3) => {\n      const c = build3 && build3.cabinet || {};\n      const nm = c.name || c.id || \"the cabinet\";\n      const twins = cabinets.filter((b) => (b.cabinet.name || b.cabinet.id) === nm).length;\n      return twins > 1 ? `${nm} (cabinet ${cabinets.indexOf(build3) + 1})` : nm;\n    };\n    const add = (role, name2, b, opts) => {\n      n += 1;\n      const p = {\n        key: `kitchen:${role}:${n}`,\n        cabinetId: \"kitchen\",\n        index: n,\n        role,\n        name: name2,\n        mat: opts.mat,\n        box: b,\n        thin: opts.thin,\n        grainAxis: opts.grainAxis || null,\n        faceUp: opts.faceUp,\n        front: opts.front || AX2.z,\n        edging: opts.edging || {},\n        features: [],\n        side: null,\n        note: opts.note || null,\n        // Where it stands, in words a person can find it by: \"on the right of Base unit\".\n        where: opts.where || null\n      };\n      panels.push(p);\n      return p;\n    };\n    k.items.filter((it) => it.kind === \"filler\").forEach((it) => {\n      const near2 = nearestBuild(builds, it.x);\n      const cb = near2 ? outerOf(near2) : null;\n      const mat = boardFor(it.materialId, near2);\n      const y0 = Number.isFinite(Number(it.y)) ? Number(it.y) : cb ? cb.min.y : 0;\n      const height = Number(it.height) || (cb ? cb.max.y - cb.min.y : 720);\n      const frontZ = cb ? cb.max.z : 560;\n      const depth = Number(it.depth) || mat.thickness;\n      const p = add(\"filler\", \"Filler\", box2(it.x, it.x + it.width, y0, y0 + height, frontZ - depth, frontZ), {\n        mat,\n        thin: \"z\",\n        grainAxis: \"y\",\n        faceUp: AX2.z,\n        front: near2 ? frontOf(near2) : AX2.z,\n        edging: { top: 0, bottom: 0, left: it.scribe ? 0 : 1, right: 1 },\n        note: it.scribe ? `scribe ${it.scribe} mm, trim on site` : null,\n        where: `at x ${Math.round(it.x)}`\n      });\n      if (it.width < mat.thickness) warnings.push(`A ${it.width} mm filler is thinner than the board it is cut from.`);\n      notes.push(`Filler ${r12(it.width)} \\xD7 ${r12(height)} mm${it.scribe ? `, scribed ${it.scribe} mm` : \"\"}`);\n      p.kitchenItemId = it.id;\n    });\n    k.items.filter((it) => it.kind === \"end-panel\").forEach((it) => {\n      const build3 = builds.find((b2) => b2.cabinet && b2.cabinet.id === it.cabinetId) || builds[0];\n      if (!build3) {\n        warnings.push(`An end panel names cabinet \"${it.cabinetId}\", which is not in this project.`);\n        return;\n      }\n      const cb = outerOf(build3);\n      const mat = boardFor(it.materialId, build3);\n      const front = frontOf(build3);\n      const alongX = Math.abs(front.z) > 0.5;\n      const t = mat.thickness;\n      const frontFace = alongX ? front.z > 0 ? cb.max.z : cb.min.z : front.x > 0 ? cb.max.x : cb.min.x;\n      const overhang = it.overhangFront || 0;\n      const outer = it.side === \"right\";\n      const onFloor = cb.min.y < 300;\n      const toFloor = it.toFloor === void 0 ? onFloor : !!it.toFloor;\n      const y0 = toFloor && onFloor ? 0 : cb.min.y;\n      let b;\n      if (alongX) {\n        const x = outer ? cb.max.x : cb.min.x - t;\n        const zEnd = front.z > 0 ? frontFace + overhang : frontFace - overhang;\n        b = box2(x, x + t, y0, cb.max.y, Math.min(cb.min.z, zEnd), Math.max(cb.max.z, zEnd));\n      } else {\n        const z = outer ? cb.max.z : cb.min.z - t;\n        const xEnd = front.x > 0 ? frontFace + overhang : frontFace - overhang;\n        b = box2(Math.min(cb.min.x, xEnd), Math.max(cb.max.x, xEnd), y0, cb.max.y, z, z + t);\n      }\n      const p = add(\"end-panel\", \"End Panel\", b, {\n        mat,\n        thin: alongX ? \"x\" : \"z\",\n        grainAxis: \"y\",\n        faceUp: alongX ? outer ? AX2.x : neg2(AX2.x) : outer ? AX2.z : neg2(AX2.z),\n        // A PAINTED panel (Cabinet Lab finishing.js endPanelSpec, card 1791235365921): its edges are sprayed, not\n        // banded, so it is cut to its finished size; the spray finish is quoted, not cut.\n        front,\n        edging: it.finish === \"painted\" ? { front: 0, top: 0, bottom: 0, back: 0 } : { front: 2, top: 2, bottom: 0, back: 0 },\n        where: `on the ${it.side} of ${cabName(build3)}`\n      });\n      p.kitchenItemId = it.id;\n      notes.push(`End panel on the ${it.side} of ${build3.cabinet.name || it.cabinetId}${it.finish === \"painted\" ? \" (painted MDF: edges sprayed, cut to the finished size; the spray finish is quoted)\" : \"\"}`);\n    });\n    if (k.plinthRun) {\n      runsOf(builds).forEach((run) => {\n        const legRun = run.filter((it) => (it.b.hardware || []).some((h) => h.type === \"leg\"));\n        if (!legRun.length) return;\n        const first = legRun[0];\n        const cb0 = first.boxOf;\n        const height = k.plinthHeight || r12(cb0.min.y);\n        if (height < 40) return;\n        const mat = boardFor(\"\", first.b);\n        const x0 = Math.min(...legRun.map((it) => it.boxOf.min.x));\n        const x1 = Math.max(...legRun.map((it) => it.boxOf.max.x));\n        const front = frontOf(first.b);\n        const zFront = Math.max(...legRun.map((it) => it.boxOf.max.z));\n        const zr = zFront - k.plinthSetback;\n        const p = add(\"plinth-run\", \"Plinth\", box2(x0, x1, 0, height, zr - mat.thickness, zr), {\n          mat,\n          thin: \"z\",\n          grainAxis: \"x\",\n          faceUp: neg2(AX2.z),\n          front,\n          edging: { top: 1 },\n          where: `under ${cabName(first.b)}${legRun.length > 1 ? ` and ${legRun.length - 1} more` : \"\"}`\n        });\n        let notches = 0;\n        legRun.forEach((it) => (it.b.hardware || []).filter((h) => h.type === \"leg\").forEach((leg) => {\n          const lz0 = leg.z - leg.dia / 2;\n          const lz1 = leg.z + leg.dia / 2;\n          if (lz1 < zr - mat.thickness - 0.01 || lz0 > zr + 0.01) return;\n          notches += 1;\n          p.features.push({\n            type: \"pocket\",\n            through: true,\n            depth: mat.thickness,\n            label: \"leg notch\",\n            box: box2(leg.x - leg.dia / 2 - 2, leg.x + leg.dia / 2 + 2, 0, height, zr - mat.thickness, zr)\n          });\n        }));\n        notes.push(`Plinth ${r12(x1 - x0)} mm over ${legRun.length} cabinet${legRun.length === 1 ? \"\" : \"s\"}${notches ? `, ${notches} leg notches` : \"\"}`);\n      });\n    }\n    const strips = [];\n    if (k.cornice) strips.push([\"cornice\", \"Cornice\", k.cornice, \"top\"]);\n    if (k.lightRail) strips.push([\"light-rail\", \"Light Rail\", k.lightRail, \"bottom\"]);\n    strips.forEach(([role, name2, spec, where]) => {\n      const runs = runsOf(builds, { wall: true });\n      if (!runs.length) {\n        warnings.push(`${name2} was asked for, but there is no wall unit to put it on.`);\n        return;\n      }\n      runs.forEach((run) => {\n        const first = run[0];\n        const mat = boardFor(\"\", first.b);\n        const x0 = Math.min(...run.map((it) => it.boxOf.min.x));\n        const x1 = Math.max(...run.map((it) => it.boxOf.max.x));\n        const zFront = Math.max(...run.map((it) => it.boxOf.max.z));\n        const yTop = Math.max(...run.map((it) => it.boxOf.max.y));\n        const yBot = Math.min(...run.map((it) => it.boxOf.min.y));\n        const z = zFront + (spec.projection || 0);\n        const y = where === \"top\" ? yTop : yBot - spec.height;\n        add(role, name2, box2(x0, x1, y, y + spec.height, z - mat.thickness, z), {\n          mat,\n          thin: \"z\",\n          grainAxis: \"x\",\n          faceUp: AX2.z,\n          front: frontOf(first.b),\n          edging: { top: where === \"top\" ? 2 : 0, bottom: where === \"top\" ? 0 : 2, left: 2, right: 2 },\n          where: `${where === \"top\" ? \"over\" : \"under\"} ${cabName(first.b)}`\n        });\n        notes.push(`${name2} ${r12(x1 - x0)} mm over ${run.length} wall unit${run.length === 1 ? \"\" : \"s\"}`);\n      });\n    });\n    warnings.push(...overlapWarnings(panels));\n    if (k.plinthRun && !panels.some((p) => p.role === \"plinth-run\")) {\n      notes.push(\"the plinth stays one board per cabinet: the sides run to the floor between them\");\n    }\n    if (!panels.length) return null;\n    const xs = panels.flatMap((p) => [p.box.min.x, p.box.max.x]);\n    const ys = panels.flatMap((p) => [p.box.min.y, p.box.max.y]);\n    const zs = panels.flatMap((p) => [p.box.min.z, p.box.max.z]);\n    return {\n      kitchen: true,\n      panels,\n      hardware: [],\n      warnings,\n      notes,\n      cabinet: { id: \"kitchen\", name: \"Kitchen\", width: r12(Math.max(...xs) - Math.min(...xs)), height: 0, depth: 0 },\n      dims: {\n        width: r12(Math.max(...xs) - Math.min(...xs)),\n        height: r12(Math.max(...ys) - Math.min(...ys)),\n        depth: r12(Math.max(...zs) - Math.min(...zs)),\n        thickness: panels[0] ? r12(panels[0].mat.thickness) : 18,\n        sectionInfo: [],\n        shelfRows: [],\n        dividerXs: [],\n        bounds: box2(Math.min(...xs), Math.max(...xs), Math.min(...ys), Math.max(...ys), Math.min(...zs), Math.max(...zs))\n      }\n    };\n  }\n  var nearestBuild = (builds, x) => {\n    let best = null;\n    let d = Infinity;\n    builds.forEach((b) => {\n      const cb = carcassOf(b);\n      if (!cb) return;\n      const dist2 = x < cb.min.x ? cb.min.x - x : x > cb.max.x ? x - cb.max.x : 0;\n      if (dist2 < d) {\n        d = dist2;\n        best = b;\n      }\n    });\n    return best;\n  };\n  function mergePlinths(builds, maxGap = 100) {\n    const welded = [];\n    const byCab = builds.map((b) => (b.panels || []).filter((p) => p.role === \"plinth\"));\n    const idx = builds.map((b, i) => i).filter((i) => byCab[i].length === 1);\n    if (idx.length < 2) return welded;\n    const boxOf3 = (i) => byCab[i][0].box;\n    const order = idx.sort((a, b) => boxOf3(a).min.x - boxOf3(b).min.x);\n    const clearBetween = (pa, pb) => {\n      const x0 = Math.min(pa.box.max.x, pb.box.min.x);\n      const x1 = Math.max(pa.box.max.x, pb.box.min.x);\n      if (x1 - x0 < 0.01) return true;\n      return !builds.some((bb) => (bb.panels || []).some((q) => q.role !== \"plinth\" && q.box.max.x > x0 + 0.01 && q.box.min.x < x1 - 0.01 && q.box.max.y > pa.box.min.y + 0.01 && q.box.min.y < pa.box.max.y - 0.01 && q.box.max.z > pa.box.min.z + 0.01 && q.box.min.z < pa.box.max.z - 0.01));\n    };\n    const same = (a, b) => {\n      const pa = byCab[a][0];\n      const pb = byCab[b][0];\n      return pa.mat.id === pb.mat.id && Math.abs((pa.front || AX2.z).x - (pb.front || AX2.z).x) < 0.01 && Math.abs((pa.front || AX2.z).z - (pb.front || AX2.z).z) < 0.01 && Math.abs(pa.box.min.y - pb.box.min.y) < 0.01 && Math.abs(pa.box.max.y - pb.box.max.y) < 0.01 && Math.abs(pa.box.min.z - pb.box.min.z) < 0.01 && Math.abs(pa.box.max.z - pb.box.max.z) < 0.01 && pb.box.min.x - pa.box.max.x <= maxGap + 0.01 && clearBetween(pa, pb);\n    };\n    const runs = [];\n    order.forEach((i) => {\n      const last = runs.length ? runs[runs.length - 1] : null;\n      if (last && same(last[last.length - 1], i)) last.push(i);\n      else runs.push([i]);\n    });\n    runs.forEach((run, ri) => {\n      if (run.length < 2) return;\n      const parts = run.map((i) => byCab[i][0]);\n      const first = parts[0];\n      const merged = {\n        ...first,\n        key: `${first.cabinetId}:plinth-run:${ri + 1}`,\n        box: box2(\n          Math.min(...parts.map((p) => p.box.min.x)),\n          Math.max(...parts.map((p) => p.box.max.x)),\n          first.box.min.y,\n          first.box.max.y,\n          first.box.min.z,\n          first.box.max.z\n        ),\n        features: [],\n        run: run.length,\n        note: `one board over ${run.length} cabinets`\n      };\n      run.forEach((i) => {\n        builds[i].panels = builds[i].panels.filter((p) => p.role !== \"plinth\");\n      });\n      builds[run[0]].panels.push(merged);\n      welded.push({ key: merged.key, cabinets: run.length, length: r12(merged.box.max.x - merged.box.min.x) });\n    });\n    return welded;\n  }\n  function markWorktopJoints(builds, splits) {\n    if (!splits || !splits.length) return 0;\n    let marked = 0;\n    splits.forEach((s) => {\n      const at = r12(s.x);\n      builds.forEach((b) => (b.panels || []).filter((p) => p.role === \"worktop\" || p.role === \"worktop-run\").forEach((p) => {\n        if (Math.abs(p.box.max.x - at) > 1 && Math.abs(p.box.min.x - at) > 1) return;\n        const which = Math.abs(p.box.min.x - at) <= 1 ? \"left\" : \"right\";\n        const note = `worktop joint on its ${which} end at ${at} mm \\u2014 butt joint, mitre or masons mitre, decided on site`;\n        p.note = p.note ? `${p.note}; ${note}` : note;\n        marked += 1;\n      }));\n    });\n    return marked;\n  }\n  var PRESETS = {\n    base: { name: \"Base unit\", width: 600, height: 720, depth: 560, shelves: { count: 1 }, plinth: { type: \"recessed\", height: 100, recess: 30 } },\n    \"base-doors\": { name: \"Base unit\", width: 600, height: 720, depth: 560, shelves: { count: 1 }, doors: { count: 2, gap: 2 }, plinth: { type: \"recessed\", height: 100, recess: 30 } },\n    wall: { name: \"Wall unit\", width: 600, height: 720, depth: 300, shelves: { count: 2 }, doors: { count: 1, hinge: \"left\" }, plinth: { type: \"none\" }, back: { mode: \"groove\" } },\n    tall: { name: \"Tall larder\", width: 600, height: 2100, depth: 560, shelves: { count: 4 }, doors: { count: 1, hinge: \"left\" }, plinth: { type: \"recessed\", height: 100, recess: 30 } },\n    // Hanging on the left, shelves and drawers on the right \u2014 what a wardrobe actually is, and the\n    // reason bays carry their own contents.\n    wardrobe: {\n      name: \"Wardrobe\",\n      width: 1e3,\n      height: 2200,\n      depth: 600,\n      shelves: { count: 3 },\n      dividers: { count: 1 },\n      doors: { count: 2 },\n      plinth: { type: \"legs\", height: 100 },\n      materialId: \"mfc-oak-18\",\n      sections: [{ shelves: { count: 1 }, rail: true }, { shelves: { count: 3 }, drawers: { count: 2 } }]\n    },\n    \"kitchen-base\": {\n      name: \"Kitchen base\",\n      width: 600,\n      height: 720,\n      depth: 560,\n      shelves: { count: 1 },\n      doors: { count: 2 },\n      plinth: { type: \"recessed\", height: 150, recess: 30 },\n      worktop: { on: true, overhangFront: 20, materialId: \"worktop-lam-38\" },\n      handles: { type: \"bar\", centres: 160 }\n    },\n    \"base-drawers\": {\n      name: \"Drawer base\",\n      width: 600,\n      height: 720,\n      depth: 560,\n      shelves: { count: 0 },\n      plinth: { type: \"recessed\", height: 150, recess: 30 },\n      worktop: { on: true, overhangFront: 20, materialId: \"worktop-lam-38\" },\n      handles: { type: \"bar\", centres: 160 },\n      sections: [{ drawers: { count: 3 } }]\n    },\n    \"kitchen-tall\": {\n      name: \"Tall oven housing\",\n      width: 600,\n      height: 2100,\n      depth: 560,\n      shelves: { count: 2 },\n      plinth: { type: \"recessed\", height: 100, recess: 30 },\n      sections: [{ shelves: { count: 2 }, drawers: { count: 2 } }],\n      frontMaterialId: \"mfc-anthracite-18\",\n      doors: { count: 1, hinge: \"left\" }\n    },\n    // The partner's own test case (call of 14.09.2026): \u00ABvinyl cabinet\u2026 \u0434\u043B\u044F \u043F\u043B\u0430\u0441\u0442\u0438\u043D\u043E\u043A\u2026 \u0434\u0432\u0430 \u0440\u044F\u0434\u0430,\n    // \u0447\u0435\u0442\u044B\u0440\u0435 \u043A\u043E\u043B\u043E\u043D\u043D\u044B, \u0432\u043E\u0441\u0435\u043C\u044C \u044F\u0447\u0435\u0435\u043A \u0441 \u043F\u0435\u0440\u0435\u0433\u043E\u0440\u043E\u0434\u043A\u0430\u043C\u0438\u00BB. A 12-inch sleeve is 315 \u00D7 315 mm, boxed sets\n    // up to ~325, so a cell must clear 330 high and 340 deep, and a column of 340\u2013360 clear holds\n    // 60\u201370 records. 1460 \u00D7 820 \u00D7 380 with 4 columns and 2 rows gives 342.5 wide \u00D7 333 high cells\n    // over 360 mm of inside depth; 1440 \u00D7 780 (the first guess) gave 313 mm cells \u2014 too low.\n    vinyl: {\n      name: \"Vinyl record cabinet\",\n      width: 1460,\n      height: 820,\n      depth: 380,\n      shelves: { count: 1 },\n      dividers: { count: 3 },\n      doors: { count: 0 },\n      plinth: { type: \"legs\", height: 100 },\n      materialId: \"mfc-oak-18\",\n      back: { mode: \"groove\" },\n      handles: { type: \"none\" },\n      joints: { type: \"cam\" }\n    },\n    bookcase: { name: \"Bookcase\", width: 800, height: 1800, depth: 300, shelves: { count: 4, fixing: \"fixed\" }, back: { mode: \"overlay\" }, plinth: { type: \"none\" }, materialId: \"ply-18\", backMaterialId: \"ply-6\" },\n    sideboard: {\n      name: \"Sideboard\",\n      width: 1600,\n      height: 800,\n      depth: 450,\n      shelves: { count: 1 },\n      dividers: { count: 2 },\n      doors: { count: 0 },\n      plinth: { type: \"legs\", height: 150 },\n      materialId: \"mfc-walnut-18\",\n      sections: [{ shelves: { count: 1 } }, { drawers: { count: 3 } }, { shelves: { count: 1 } }]\n    }\n  };\n  function presetCabinet(kind, id) {\n    const p = PRESETS[kind] || PRESETS.base;\n    return JSON.parse(JSON.stringify({ ...p, id }));\n  }\n  var r13 = (v) => Math.round(v * 10) / 10;\n  function edgingCodes(panel, frame2) {\n    const out = { L1: 0, L2: 0, W1: 0, W2: 0 };\n    Object.entries(panel.edging || {}).forEach(([side, band]) => {\n      const code = sideCode(frame2, side, panel.front);\n      if (code && band > 0) out[code] = Number(band);\n    });\n    return out;\n  }\n  var ptsMap = (pts, fn) => Array.isArray(pts) ? pts.map(fn) : pts;\n  var roundFeat = (f) => f.type === \"cutout\" ? { ...f, pts: ptsMap(f.pts, (q) => ({ u: r13(q.u), v: r13(q.v) })), outline: ptsMap(f.outline, (q) => ({ u: r13(q.u), v: r13(q.v) })) } : f.type === \"hole\" ? { ...f, u: r13(f.u), v: r13(f.v) } : { ...f, u0: r13(f.u0), u1: r13(f.u1), v0: r13(f.v0), v1: r13(f.v1) };\n  var mirrorFeatures = (features, length) => (features || []).map((f) => f.type === \"cutout\" ? { ...f, pts: ptsMap(f.pts, (q) => ({ u: r13(length - q.u), v: q.v })).reverse(), outline: Array.isArray(f.outline) ? f.outline.map((q) => ({ u: r13(length - q.u), v: q.v })).reverse() : f.outline } : f.type === \"hole\" ? { ...f, u: r13(length - f.u) } : { ...f, u0: r13(length - f.u1), u1: r13(length - f.u0) });\n  var mirrorEdging = (e) => ({ L1: Number(e.L1) || 0, L2: Number(e.L2) || 0, W1: Number(e.W2) || 0, W2: Number(e.W1) || 0 });\n  var mirrorFeaturesV = (features, width) => (features || []).map((f) => f.type === \"cutout\" ? { ...f, pts: ptsMap(f.pts, (q) => ({ u: q.u, v: r13(width - q.v) })).reverse(), outline: Array.isArray(f.outline) ? f.outline.map((q) => ({ u: q.u, v: r13(width - q.v) })).reverse() : f.outline } : f.type === \"hole\" ? { ...f, v: r13(width - f.v) } : { ...f, v0: r13(width - f.v1), v1: r13(width - f.v0) });\n  var mirrorEdgingV = (e) => ({ L1: Number(e.L2) || 0, L2: Number(e.L1) || 0, W1: Number(e.W1) || 0, W2: Number(e.W2) || 0 });\n  var edgingKey = (e) => JSON.stringify(mirrorEdging(mirrorEdging(e)));\n  var pairName = (n) => String(n || \"\").replace(/^(Left|Right)\\s+/i, \"\");\n  var sideOf = (n) => /^left\\s/i.test(n) ? \"left\" : /^right\\s/i.test(n) ? \"right\" : null;\n  function variantOf(part, n = 1) {\n    if (!part || !part.variants || !part.variants.length) return part;\n    const first = part.variants[0].qty;\n    const v = Number(n) > first ? part.variants[1] : part.variants[0];\n    const opts = part.blankOpts || {};\n    return {\n      ...part,\n      features: v.features,\n      edging: v.edging,\n      panelKeys: v.panelKeys,\n      qty: v.qty,\n      variant: v.label,\n      variantCode: v.code,\n      name: `${part.name} (${v.label})`,\n      ...cutBlank(part.length, part.width, v.edging, { deductEdging: opts.deductEdging !== false, oversize: Number(opts.oversize) || 0 })\n    };\n  }\n  function lineVariants(part) {\n    if (!part || !part.variants || !part.variants.length) return [part];\n    const out = [];\n    let n = 1;\n    part.variants.forEach((v) => {\n      if (v.qty > 0) out.push(variantOf(part, n));\n      n += v.qty;\n    });\n    return out.length ? out : [variantOf(part, 1)];\n  }\n  var MIRROR_SIDES_U = { L1: \"L1\", L2: \"L2\", W1: \"W2\", W2: \"W1\" };\n  var MIRROR_SIDES_V = { L1: \"L2\", L2: \"L1\", W1: \"W1\", W2: \"W2\" };\n  function mirrorEdgingPatch(edging, axis = \"u\") {\n    const m = axis === \"v\" ? MIRROR_SIDES_V : MIRROR_SIDES_U;\n    const out = {};\n    Object.entries(edging || {}).forEach(([side, band]) => {\n      if (m[side]) out[m[side]] = band;\n    });\n    return out;\n  }\n  var PAIR_FIELDS = [\"materialId\", \"length\", \"width\", \"grain\", \"note\"];\n  function mergePairOverrides(first, second, axis = \"u\") {\n    if (!second) return { o: first || null, conflict: false };\n    const mirrored = { ...second };\n    if (second.edging) mirrored.edging = mirrorEdgingPatch(second.edging, axis);\n    if (!first) return { o: mirrored, conflict: false };\n    const o = { ...mirrored, ...first };\n    if (first.edging || mirrored.edging) o.edging = { ...mirrored.edging, ...first.edging };\n    const conflict = PAIR_FIELDS.some((f) => first[f] != null && mirrored[f] != null && String(first[f]) !== String(mirrored[f])) || Object.keys(first.edging || {}).some((s) => mirrored.edging && mirrored.edging[s] != null && Number(mirrored.edging[s]) !== Number(first.edging[s]));\n    return { o, conflict };\n  }\n  var overrideQty = (o) => o && Number.isFinite(Number(o.qty)) ? Math.max(0, Math.round(Number(o.qty))) : null;\n  function splitPairQty(natural, own2, partner) {\n    const a = overrideQty(own2);\n    const b = overrideQty(partner);\n    if (a != null && b != null) return { split: [a, b], odd: false };\n    if (b != null) return { split: [natural[0], b], odd: false };\n    if (a != null) {\n      const first = Math.ceil(a / 2);\n      return { split: [first, a - first], odd: a % 2 === 1 };\n    }\n    return { split: natural, odd: false };\n  }\n  var featureSignature = (features) => features.map((f) => f.type === \"cutout\" ? `c:${f.kind || f.pending || \"\"}:${f.depth}:${f.through ? \"t\" : \"\"}:${cutoutKey(f.pts)}` : f.type === \"hole\" ? `h:${f.face}:${f.u}:${f.v}:${f.dia}:${f.depth}:${f.through ? \"t\" : \"\"}` : `${f.type}:${f.face}:${f.u0}:${f.u1}:${f.v0}:${f.v1}:${f.depth}`).sort().join(\"|\");\n  function cutBlank(length, width, edging, { deductEdging = true, oversize = 0 } = {}) {\n    const e = edging || {};\n    const du = deductEdging ? Number(e.W1) || 0 : 0;\n    const dv = deductEdging ? Number(e.L2) || 0 : 0;\n    const cutLength = r13(length - (deductEdging ? (Number(e.W1) || 0) + (Number(e.W2) || 0) : 0) + oversize);\n    const cutWidth = r13(width - (deductEdging ? (Number(e.L1) || 0) + (Number(e.L2) || 0) : 0) + oversize);\n    return { cutLength, cutWidth, cutOrigin: { u: du, v: dv } };\n  }\n  function partsFromBuilds(builds, opts = {}) {\n    const overrides = opts.overrides || {};\n    const parts = [];\n    builds.forEach((b, bi) => {\n      const cabIndex = bi + 1;\n      const cabName = b.cabinet.name || `Cabinet ${cabIndex}`;\n      const lines = /* @__PURE__ */ new Map();\n      b.panels.forEach((panel) => {\n        if (panel.quoted) return;\n        const frame2 = panelFrame(panel);\n        const edging = edgingCodes(panel, frame2);\n        const features = localFeatures(panel, frame2);\n        const length = r13(frame2.length);\n        const width = r13(frame2.width);\n        const sig = [panel.name, panel.mat.id, length, width, frame2.thickness, JSON.stringify(edging), featureSignature(features)].join(\"#\");\n        let line = lines.get(sig);\n        if (!line) {\n          line = {\n            key: panel.key,\n            cabinetId: panel.cabinetId,\n            cabinet: cabName,\n            role: panel.role,\n            name: panel.name,\n            materialId: panel.mat.id,\n            material: panel.mat.name,\n            thickness: frame2.thickness,\n            length,\n            width,\n            qty: 0,\n            grain: panel.mat.grain ? \"along\" : \"none\",\n            edging,\n            features,\n            panelKeys: [],\n            sourceIndex: panel.index,\n            // What the MODEL wants said about this part \u2014 a scribe to trim on site, a\n            // worktop joint, one board over three cabinets. Not the person's own note\n            // (that is an override and lives in `note`), so it goes to `notes` below.\n            panelNote: panel.note || null\n          };\n          lines.set(sig, line);\n        }\n        line.qty += 1;\n        line.panelKeys.push(panel.key);\n      });\n      const sorted = [...lines.values()].sort((a, b2) => a.sourceIndex - b2.sourceIndex);\n      const taken = /* @__PURE__ */ new Set();\n      const folded = [];\n      sorted.forEach((a, i) => {\n        if (taken.has(a)) return;\n        const sigU = featureSignature(mirrorFeatures(a.features, a.length));\n        const sigV = featureSignature(mirrorFeaturesV(a.features, a.width));\n        const sameBlank = (c) => !taken.has(c) && c.materialId === a.materialId && c.length === a.length && c.width === a.width && c.thickness === a.thickness && c.grain === a.grain && pairName(c.name) === pairName(a.name);\n        let axis = \"u\";\n        let partner = sorted.slice(i + 1).find((c) => sameBlank(c) && edgingKey(c.edging) === edgingKey(mirrorEdging(a.edging)) && featureSignature(c.features.map(roundFeat)) === sigU);\n        if (!partner) {\n          axis = \"v\";\n          partner = sorted.slice(i + 1).find((c) => sameBlank(c) && edgingKey(c.edging) === edgingKey(mirrorEdgingV(a.edging)) && featureSignature(c.features.map(roundFeat)) === sigV);\n        }\n        if (partner) {\n          a.mirrorAxis = axis;\n          taken.add(partner);\n          const sa = sideOf(a.name);\n          const sb = sideOf(partner.name);\n          const la = sa || \"A\";\n          const lb = sb || (sa ? sa === \"left\" ? \"right\" : \"left\" : \"B\");\n          const code = (l) => l === \"left\" ? \"L\" : l === \"right\" ? \"R\" : l;\n          a.variants = [\n            { label: la, code: code(la), panelKeys: a.panelKeys.slice(), qty: a.qty, features: a.features, edging: a.edging },\n            { label: lb, code: code(lb), panelKeys: partner.panelKeys.slice(), qty: partner.qty, features: partner.features, edging: partner.edging }\n          ];\n          a.mirrored = true;\n          a.mirrorKey = partner.key;\n          a.name = pairName(a.name);\n          a.role = String(a.role).replace(/-(left|right)$/, \"\");\n          a.qty += partner.qty;\n          a.panelKeys = a.panelKeys.concat(partner.panelKeys);\n        }\n        folded.push(a);\n      });\n      let k = 0;\n      folded.forEach((line) => {\n        k += 1;\n        line.id = `${cabIndex}_${k}`;\n        parts.push(line);\n      });\n    });\n    (opts.customParts || []).forEach((cp, i) => {\n      const mat = materialById(cp.materialId);\n      parts.push({\n        key: cp.key || `custom:${i + 1}`,\n        cabinetId: \"custom\",\n        cabinet: \"Custom\",\n        role: \"custom\",\n        name: cp.name || `Part ${i + 1}`,\n        materialId: mat.id,\n        material: mat.name,\n        thickness: mat.thickness,\n        length: r13(Number(cp.length) || 0),\n        width: r13(Number(cp.width) || 0),\n        qty: Math.max(0, Math.round(Number(cp.qty) || 0)),\n        grain: cp.grain || (mat.grain ? \"along\" : \"none\"),\n        edging: { L1: 0, L2: 0, W1: 0, W2: 0, ...cp.edging || {} },\n        features: [],\n        panelKeys: [],\n        id: `C_${i + 1}`\n      });\n    });\n    parts.forEach((p) => {\n      const own2 = overrides[p.key];\n      const partner = p.mirrorKey ? overrides[p.mirrorKey] : null;\n      const { o, conflict } = mergePairOverrides(own2, partner, p.mirrorAxis);\n      p.notes = [];\n      if (p.panelNote) p.notes.push(p.panelNote);\n      if (conflict) p.notes.push(`the ${p.variants && p.variants[1].label || \"other\"} half had its own settings`);\n      if (o) {\n        if (o.materialId && o.materialId !== p.materialId) {\n          const m = materialById(o.materialId);\n          p.materialId = m.id;\n          p.material = m.name;\n          p.thickness = m.thickness;\n        }\n        if (Number.isFinite(Number(o.length)) && Number(o.length) > 0) p.length = r13(Number(o.length));\n        if (Number.isFinite(Number(o.width)) && Number(o.width) > 0) p.width = r13(Number(o.width));\n        if (Number.isFinite(Number(o.qty))) p.qty = Math.max(0, Math.round(Number(o.qty)));\n        if (o.grain) p.grain = o.grain;\n        if (o.edging) p.edging = { ...p.edging, ...o.edging };\n        if (o.note != null) p.note = String(o.note);\n        p.overridden = true;\n      }\n      Object.assign(p, cutBlank(p.length, p.width, p.edging, { deductEdging: opts.deductEdging !== false, oversize: Number(opts.oversize) || 0 }));\n      p.blankOpts = { deductEdging: opts.deductEdging !== false, oversize: Number(opts.oversize) || 0 };\n      if (p.variants) {\n        p.variants[0].edging = p.edging;\n        p.variants[1].edging = p.mirrorAxis === \"v\" ? mirrorEdgingV(p.edging) : mirrorEdging(p.edging);\n        const natural = [p.variants[0].qty, p.variants[1].qty];\n        const { split, odd } = splitPairQty(natural, own2, partner);\n        p.variants[0].qty = split[0];\n        p.variants[1].qty = split[1];\n        p.qty = split[0] + split[1];\n        if (odd) p.notes.push(`${p.qty} = ${split[0]} ${p.variants[0].label} + ${split[1]} ${p.variants[1].label}`);\n      }\n    });\n    const byKey = new Map(parts.map((p) => [p.key, p]));\n    parts.forEach((p) => {\n      if (p.mirrorKey && !byKey.has(p.mirrorKey)) byKey.set(p.mirrorKey, p);\n    });\n    return { parts: parts.filter((p) => p.qty > 0), byKey };\n  }\n  function hardwareList(builds, parts) {\n    const rows = /* @__PURE__ */ new Map();\n    const bump = (key, label, n) => {\n      const r = rows.get(key) || { label, qty: 0 };\n      r.qty += n;\n      rows.set(key, r);\n    };\n    builds.forEach((b) => {\n      (b.hardware || []).forEach((h) => {\n        if (h.type === \"leg\") bump(\"leg\", \"Adjustable leg\", 1);\n        if (h.type === \"rail\") bump(\"rail\", `Hanging rail ${h.dia} mm (cut to ${Math.round(h.x1 - h.x0)} mm)`, 1);\n        if (h.type === \"handle\") bump(`handle-${h.style}-${h.centres}`, h.style === \"knob\" ? \"Knob\" : `Bar handle, ${h.centres} mm centres`, 1);\n        if (h.item === \"cabineo-12\") bump(\"cabineo-12\", \"Lamello Cabineo 12 connector\", Number(h.qty) || 0);\n      });\n      b.panels.forEach((p) => {\n        (p.features || []).forEach((f) => {\n          if (f.type !== \"hole\") return;\n          if (f.label === \"hinge cup\") {\n            const h = hingeById(f.fitting);\n            bump(`hinge-${h.id}`, h.name, 1);\n          }\n          if (f.label === \"confirmat\") bump(\"confirmat\", \"Confirmat screw 7 x 50\", 1);\n          if (f.label === \"cam housing\") bump(\"cam\", \"Cam lock with bolt\", 1);\n          if (f.label === \"dowel\" && f.face !== \"edge\") bump(\"dowel\", \"Dowel 8 x 35\", 1);\n        });\n      });\n      b.panels.filter((p) => p.role === \"shelf\").forEach((sh) => {\n        const own2 = b.cabinet.sections && b.cabinet.sections[sh.section] && b.cabinet.sections[sh.section].shelves;\n        const fixing = own2 && own2.fixing || b.cabinet.shelves.fixing;\n        if (fixing === \"pins\") bump(\"pin\", \"Shelf pin 5 mm\", 4);\n      });\n    });\n    builds.forEach((b) => {\n      const r = runnerById(b.cabinet && b.cabinet.fittings && b.cabinet.fittings.runner);\n      const n = b.panels.filter((p) => p.role === \"drawer-front\").length;\n      if (n) bump(`runner-${r.id}`, `${r.name}, pair`, n);\n    });\n    return [...rows.values()].map((r) => ({ ...r, qty: Math.round(r.qty) })).filter((r) => r.qty > 0);\n  }\n  function partsTotals(parts) {\n    let count = 0;\n    let area = 0;\n    const edging = /* @__PURE__ */ new Map();\n    parts.forEach((p) => {\n      count += p.qty;\n      area += p.qty * p.length * p.width;\n      const sides = [[\"L1\", p.length], [\"L2\", p.length], [\"W1\", p.width], [\"W2\", p.width]];\n      sides.forEach(([s, len]) => {\n        const b = Number(p.edging[s]) || 0;\n        if (b > 0) edging.set(b, (edging.get(b) || 0) + len * p.qty);\n      });\n    });\n    return {\n      lines: parts.length,\n      count,\n      areaM2: Math.round(area / 1e6 * 100) / 100,\n      edging: [...edging.entries()].sort((a, b) => b[0] - a[0]).map(([band, mm]) => ({ band, metres: Math.round(mm / 10) / 100 }))\n    };\n  }\n  var MIN_GAP = 30;\n  var SNAP_GRID = 32;\n  var SNAP_TOLERANCE = 6;\n  var r14 = (v) => Math.round(v * 10) / 10;\n  var clamp3 = (v, lo, hi) => Math.min(hi, Math.max(lo, v));\n  var cabinetOf = (project, id) => project.cabinets.find((c) => c.id === id);\n  var effective = (c) => normaliseCabinet(c || {});\n  function buildOne(project, cabinetId) {\n    const at = placements(project);\n    const i = project.cabinets.findIndex((c2) => c2.id === cabinetId);\n    if (i < 0) return null;\n    const c = project.cabinets[i];\n    return buildCabinet(c, { id: c.id, offsetX: at[i].offsetX, offsetY: at[i].offsetY, offsetZ: at[i].offsetZ, rotation: at[i].rotation });\n  }\n  function buildAll(project) {\n    const at = placements(project);\n    return project.cabinets.map((c, i) => buildCabinet(c, { id: c.id, offsetX: at[i].offsetX, offsetY: at[i].offsetY, offsetZ: at[i].offsetZ, rotation: at[i].rotation }));\n  }\n  function shelfThickness(build3, section) {\n    const own2 = build3.panels.filter((x) => x.role === \"shelf\" && x.section === section).map((x) => x.box.max.y - x.box.min.y);\n    if (own2.length) return Math.max(build3.dims.thickness, ...own2);\n    const id = build3.cabinet && build3.cabinet.materials && build3.cabinet.materials.shelf;\n    return id ? Math.max(build3.dims.thickness, materialById(id).thickness) : build3.dims.thickness;\n  }\n  function snapValue(value, magnets = [], opts = {}) {\n    const tol = opts.tolerance == null ? SNAP_TOLERANCE : opts.tolerance;\n    if (opts.enabled === false) return { value: r14(value), snapped: null };\n    let best = null;\n    magnets.forEach((m) => {\n      const d = Math.abs(m.at - value);\n      if (d <= tol && (!best || d < best.d)) best = { d, at: m.at, label: m.label };\n    });\n    if (best) return { value: r14(best.at), snapped: best.label };\n    const grid = opts.grid == null ? SNAP_GRID : opts.grid;\n    if (grid > 0) {\n      const g2 = Math.round(value / grid) * grid;\n      if (Math.abs(g2 - value) <= tol) return { value: r14(g2), snapped: `${grid} mm grid` };\n    }\n    return { value: r14(value), snapped: null };\n  }\n  var sectionOf = (build3, section) => (build3.dims.sectionInfo || [])[section] || null;\n  var localInner = (build3) => build3.dims.local ? build3.dims.local.innerX : build3.dims.innerX;\n  var localDividers = (build3) => build3.dims.local ? build3.dims.local.dividerXs : build3.dims.dividerXs;\n  function sectionBase(build3, section) {\n    const info = sectionOf(build3, section);\n    return info ? info.drawerTop : build3.dims.innerY[0];\n  }\n  function sectionRoom(build3, section) {\n    const info = sectionOf(build3, section);\n    const ceil = info && info.shelfTop != null ? info.shelfTop : build3.dims.innerY[1];\n    return r14(ceil - sectionBase(build3, section));\n  }\n  function shelfPositions(build3, section = 0) {\n    const info = sectionOf(build3, section);\n    const base = sectionBase(build3, section);\n    return (info ? info.shelves : build3.dims.shelfRows).map((y) => r14(y - base));\n  }\n  function sectionSpec(c, section) {\n    if (!Array.isArray(c.sections)) c.sections = [];\n    while (c.sections.length <= section) c.sections.push({});\n    if (!c.sections[section] || typeof c.sections[section] !== \"object\") c.sections[section] = {};\n    return c.sections[section];\n  }\n  function materialiseShelves(project, cabinetId, section = 0) {\n    const build3 = buildOne(project, cabinetId);\n    const c = cabinetOf(project, cabinetId);\n    if (!build3 || !c) return project;\n    const pos = shelfPositions(build3, section);\n    const spec = sectionSpec(c, section);\n    spec.shelves = { ...effective(c).shelves, ...spec.shelves || {}, mode: \"custom\", positions: pos, count: pos.length };\n    return project;\n  }\n  function addShelfAt(project, cabinetId, section, pos, opts = {}) {\n    const build3 = buildOne(project, cabinetId);\n    const c = cabinetOf(project, cabinetId);\n    if (!build3 || !c) return null;\n    const T3 = shelfThickness(build3, section);\n    const room = sectionRoom(build3, section);\n    const existing = shelfPositions(build3, section);\n    if (room - T3 - MIN_GAP < MIN_GAP) return null;\n    const snap22 = snapValue(pos, opts.snap === false ? [] : [{ at: r14((room - T3) / 2), label: \"centre\" }], { enabled: opts.snap !== false });\n    let value = r14(clamp3(snap22.value, MIN_GAP, room - T3 - MIN_GAP));\n    const tooClose = (v) => existing.some((e) => Math.abs(e - v) < T3 + MIN_GAP);\n    if (tooClose(value)) {\n      const free = [];\n      for (let v = MIN_GAP; v <= room - T3 - MIN_GAP; v += 1) if (!tooClose(v)) free.push(v);\n      if (!free.length) return null;\n      value = free.reduce((best, v) => Math.abs(v - snap22.value) < Math.abs(best - snap22.value) ? v : best, free[0]);\n    }\n    materialiseShelves(project, cabinetId, section);\n    const spec = sectionSpec(cabinetOf(project, cabinetId), section);\n    const list = [...spec.shelves.positions, value].sort((a, b) => a - b);\n    spec.shelves = { ...spec.shelves, positions: list, count: list.length };\n    return { value, pos: value, row: list.indexOf(value), section };\n  }\n  function removeShelfRow(project, cabinetId, section, row) {\n    const build3 = buildOne(project, cabinetId);\n    if (!build3) return false;\n    materialiseShelves(project, cabinetId, section);\n    const spec = sectionSpec(cabinetOf(project, cabinetId), section);\n    if (!spec.shelves || row < 0 || row >= spec.shelves.positions.length) return false;\n    const list = spec.shelves.positions.filter((_, i) => i !== row);\n    spec.shelves = { ...spec.shelves, positions: list, count: list.length };\n    return true;\n  }\n  function equaliseShelves(project, cabinetId, section = null) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return false;\n    if (section == null) {\n      c.shelves = { ...effective(c).shelves, mode: \"even\", positions: [] };\n      (c.sections || []).forEach((sp) => {\n        if (sp && sp.shelves) sp.shelves = { ...sp.shelves, mode: \"even\", positions: [] };\n      });\n      return true;\n    }\n    const spec = sectionSpec(c, section);\n    if (spec.shelves) spec.shelves = { ...spec.shelves, mode: \"even\", positions: [] };\n    else c.shelves = { ...effective(c).shelves, mode: \"even\", positions: [] };\n    return true;\n  }\n  function drawerStack(build3, section) {\n    const info = (build3.dims.sectionInfo || [])[section];\n    return info ? info.drawers.map((d) => ({ index: d.index, height: r14(d.height), y0: r14(d.y0) })) : [];\n  }\n  function setDrawers(project, cabinetId, section, count, opts = {}) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const spec = sectionSpec(c, section);\n    const n = Math.max(0, Math.min(6, Math.round(Number(count) || 0)));\n    const before = spec.drawers ? { ...spec.drawers, heights: (spec.drawers.heights || []).slice() } : null;\n    const heights = spec.drawers && spec.drawers.heights || [];\n    spec.drawers = { count: n, heights: heights.slice(0, n) };\n    if (opts.height) spec.drawers.heights = new Array(n).fill(Number(opts.height));\n    const fit = fitContents(project, cabinetId);\n    const build3 = buildOne(project, cabinetId);\n    const stack = drawerStack(build3, section);\n    if (n > 0 && !stack.length) {\n      if (before) spec.drawers = before;\n      else delete spec.drawers;\n      fitContents(project, cabinetId);\n      return null;\n    }\n    return { value: stack.length, count: stack.length, requested: n, heights: stack.map((d) => d.height), note: fit && fit.notes.length ? fit.notes.join(\"; \") : null };\n  }\n  function setDrawerHeight(project, cabinetId, section, index, height) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const spec = sectionSpec(c, section);\n    if (!spec.drawers || !spec.drawers.count) return null;\n    const build3 = buildOne(project, cabinetId);\n    const stack = drawerStack(build3, section);\n    const room = build3.dims.innerY[1] - build3.dims.innerY[0];\n    const others2 = stack.reduce((a, d, i) => a + (i === index ? 0 : d.height), 0);\n    const v = r14(Math.max(80, Math.min(Number(height) || 0, room - others2 - MIN_GAP)));\n    const heights = (spec.drawers.heights || []).slice();\n    while (heights.length < spec.drawers.count) heights.push(null);\n    heights[index] = v;\n    spec.drawers = { ...spec.drawers, heights };\n    fitContents(project, cabinetId);\n    return { value: v, heights };\n  }\n  function setBayDoors(project, cabinetId, section, { count, hinge } = {}) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const spec = sectionSpec(c, section);\n    const cur = spec.doors && typeof spec.doors === \"object\" ? spec.doors : { count: 0, hinge: \"left\" };\n    const n = count == null ? cur.count || 0 : Math.max(0, Math.min(2, Math.round(Number(count) || 0)));\n    spec.doors = { count: n, hinge: hinge === \"right\" ? \"right\" : hinge === \"left\" ? \"left\" : cur.hinge || \"left\" };\n    fitContents(project, cabinetId);\n    return { value: n, count: n, hinge: spec.doors.hinge };\n  }\n  function setRail(project, cabinetId, section, on) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    sectionSpec(c, section).rail = !!on;\n    return { value: !!on };\n  }\n  function dividerPositions(build3) {\n    const x0 = localInner(build3)[0];\n    return localDividers(build3).map((x) => r14(x - x0));\n  }\n  function minBayWidth(build3, section) {\n    const info = (build3.dims.sectionInfo || [])[section];\n    if (!info || !info.drawers.length) return MIN_GAP;\n    const dr = build3.cabinet && build3.cabinet.drawer || {};\n    const clearance = Number(dr.sideClearance) || 13;\n    return r14(2 * clearance + 90);\n  }\n  function materialiseDividers(project, cabinetId) {\n    const build3 = buildOne(project, cabinetId);\n    const c = cabinetOf(project, cabinetId);\n    if (!build3 || !c) return project;\n    c.dividers = { ...effective(c).dividers, mode: \"custom\", positions: dividerPositions(build3), count: localDividers(build3).length };\n    return project;\n  }\n  function addDividerAt(project, cabinetId, pos, opts = {}) {\n    const build3 = buildOne(project, cabinetId);\n    const c = cabinetOf(project, cabinetId);\n    if (!build3 || !c) return null;\n    const T3 = build3.dims.thickness;\n    const inner = localInner(build3)[1] - localInner(build3)[0];\n    const existing = dividerPositions(build3);\n    const snap22 = snapValue(pos, opts.snap === false ? [] : [{ at: r14((inner - T3) / 2), label: \"centre\" }], { enabled: opts.snap !== false });\n    let value = r14(clamp3(snap22.value, MIN_GAP, inner - T3 - MIN_GAP));\n    const bounds = [0, ...existing.map((e) => e), inner].flatMap((v, i, arr) => i < existing.length + 1 ? [[i === 0 ? 0 : arr[i] + T3, i === existing.length ? inner : arr[i + 1]]] : []);\n    const okAt = (v) => {\n      if (existing.some((e) => Math.abs(e - v) < T3 + MIN_GAP)) return false;\n      const bay = bounds.findIndex(([lo2, hi2]) => v >= lo2 - 1e-6 && v + T3 <= hi2 + 1e-6);\n      if (bay < 0) return false;\n      const need = Math.max(MIN_GAP, minBayWidth(build3, bay));\n      const [lo, hi] = bounds[bay];\n      return v - lo >= need - 1e-6 && hi - (v + T3) >= need - 1e-6;\n    };\n    if (!okAt(value)) {\n      const free = [];\n      for (let v = MIN_GAP; v <= inner - T3 - MIN_GAP; v += 1) if (okAt(v)) free.push(v);\n      if (!free.length) return null;\n      value = free.reduce((best, v) => Math.abs(v - snap22.value) < Math.abs(best - snap22.value) ? v : best, free[0]);\n    }\n    materialiseDividers(project, cabinetId);\n    const list = [...cabinetOf(project, cabinetId).dividers.positions, value].sort((a, b) => a - b);\n    const slot = list.indexOf(value);\n    const secs = cabinetOf(project, cabinetId).sections;\n    if (Array.isArray(secs) && secs.length > slot) secs.splice(slot + 1, 0, {});\n    cabinetOf(project, cabinetId).dividers = { ...cabinetOf(project, cabinetId).dividers, positions: list, count: list.length };\n    fitContents(project, cabinetId);\n    return { value, pos: value, slot };\n  }\n  function removeDivider(project, cabinetId, slot) {\n    materialiseDividers(project, cabinetId);\n    const c = cabinetOf(project, cabinetId);\n    if (!c || slot < 0 || slot >= c.dividers.positions.length) return false;\n    const list = c.dividers.positions.filter((_, i) => i !== slot);\n    c.dividers = { ...effective(c).dividers, positions: list, count: list.length };\n    if (Array.isArray(c.sections) && c.sections.length > slot + 1) c.sections.splice(slot + 1, 1);\n    fitContents(project, cabinetId);\n    return true;\n  }\n  function equaliseDividers(project, cabinetId) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return false;\n    c.dividers = { ...effective(c).dividers, mode: \"even\", positions: [] };\n    return true;\n  }\n  var maxEvenShelves = (room, T3) => Math.max(0, Math.floor((room - MIN_GAP) / (T3 + MIN_GAP)));\n  function spreadShelves(positions, room, T3) {\n    const step = T3 + MIN_GAP;\n    const top = room - T3 - MIN_GAP;\n    let list = (positions || []).map(Number).filter(Number.isFinite).sort((a, b) => a - b);\n    for (; ; ) {\n      if (!list.length || top < MIN_GAP) return [];\n      const out = list.map((p) => clamp3(p, MIN_GAP, top));\n      for (let k = 1; k < out.length; k += 1) out[k] = Math.max(out[k], out[k - 1] + step);\n      if (out[out.length - 1] > top) {\n        out[out.length - 1] = top;\n        for (let k = out.length - 2; k >= 0; k -= 1) out[k] = Math.min(out[k], out[k + 1] - step);\n      }\n      if (out[0] >= MIN_GAP - 1e-6) return out.map(r14);\n      list = list.slice(0, -1);\n    }\n  }\n  function fitContents(project, cabinetId) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const notes = [];\n    let now = effective(c);\n    let build3 = buildOne(project, cabinetId);\n    const T3 = build3.dims.thickness;\n    const maxPlinth = now.height - 3 * T3 - MIN_GAP;\n    if (now.plinth.type !== \"none\" && now.plinth.height > maxPlinth) {\n      c.plinth = { ...now.plinth, height: r14(Math.max(LIMITS2.plinthHeight[0], maxPlinth)) };\n      notes.push(`Plinth lowered to ${c.plinth.height} mm to leave room for the carcass`);\n    }\n    if (now.back.mode === \"groove\") {\n      const maxOffset = now.depth - 20 - build3.dims.backThickness - (Number(now.back.clearance) || 0);\n      if (now.back.grooveOffset > maxOffset) {\n        c.back = { ...now.back, grooveOffset: r14(Math.max(LIMITS2.grooveOffset[0], maxOffset)) };\n        notes.push(`Back groove moved to ${c.back.grooveOffset} mm from the rear`);\n      }\n    }\n    now = effective(c);\n    build3 = buildOne(project, cabinetId);\n    const inner = localInner(build3)[1] - localInner(build3)[0];\n    const dropDrawersIn = (i) => {\n      setDrawersRaw(c, i, 0);\n      notes.push(`Bay ${i + 1} is now too narrow for drawers, so they were removed`);\n    };\n    if (now.dividers.mode === \"custom\" && now.dividers.positions.length) {\n      for (let guard = 0; guard < 12; guard += 1) {\n        build3 = buildOne(project, cabinetId);\n        const pos = (c.dividers.positions || []).map(Number).filter(Number.isFinite).sort((a, b) => a - b);\n        const n = pos.length;\n        if (!n) {\n          c.dividers = { ...effective(c).dividers, positions: [], count: 0 };\n          break;\n        }\n        const needs = [];\n        for (let i = 0; i <= n; i += 1) needs.push(Math.max(MIN_GAP, minBayWidth(build3, i)));\n        const total = needs.reduce((a, b) => a + b, 0) + n * T3;\n        if (total > inner + 1e-6) {\n          const heavy = needs.findIndex((v) => v > MIN_GAP);\n          if (heavy >= 0) {\n            dropDrawersIn(heavy);\n            continue;\n          }\n          c.dividers = { ...effective(c).dividers, positions: pos.slice(0, -1), count: n - 1 };\n          notes.push(\"A divider was removed: the cabinet is too narrow for it\");\n          continue;\n        }\n        const out = pos.slice();\n        for (let i = 0; i < n; i += 1) out[i] = Math.max(out[i], (i > 0 ? out[i - 1] + T3 : 0) + needs[i]);\n        for (let i = n - 1; i >= 0; i -= 1) out[i] = Math.min(out[i], (i < n - 1 ? out[i + 1] : inner) - T3 - needs[i + 1]);\n        c.dividers = { ...effective(c).dividers, positions: out.map(r14), count: n };\n        break;\n      }\n    } else if (now.dividers.count > 0) {\n      for (let guard = 0; guard < 12; guard += 1) {\n        build3 = buildOne(project, cabinetId);\n        const n = effective(c).dividers.count;\n        if (!n) break;\n        const bayW = (inner - n * T3) / (n + 1);\n        if (bayW < MIN_GAP) {\n          c.dividers = { ...effective(c).dividers, count: n - 1 };\n          notes.push(\"A divider was removed: the cabinet is too narrow for it\");\n          continue;\n        }\n        const tight = (build3.dims.sectionInfo || []).findIndex((info, i) => info.drawers.length && bayW < minBayWidth(build3, i));\n        if (tight >= 0) {\n          dropDrawersIn(tight);\n          continue;\n        }\n        break;\n      }\n    }\n    now = effective(c);\n    build3 = buildOne(project, cabinetId);\n    const room = build3.dims.innerY[1] - build3.dims.innerY[0];\n    const anyBayDoors = (now.sections || []).some((sp) => sp && sp.doors && sp.doors.count);\n    const doorOver = (i) => anyBayDoors ? !!(now.sections[i] && now.sections[i].doors && now.sections[i].doors.count) : now.doors.count > 0;\n    (now.sections || []).forEach((sp, i) => {\n      if (!sp.drawers || !sp.drawers.count) return;\n      const cap2 = doorOver(i) ? room - 100 - now.doors.gap - now.drawer.gap : room - MIN_GAP;\n      const want = [];\n      for (let k = 0; k < sp.drawers.count; k += 1) {\n        const stored = (sp.drawers.heights || [])[k];\n        want.push(Number.isFinite(Number(stored)) && Number(stored) > 0 ? Number(stored) : now.drawer.height);\n      }\n      let total = want.reduce((a, h) => a + h, 0);\n      let n = want.length;\n      while (n > 0 && total > cap2) {\n        n -= 1;\n        total -= want[n];\n      }\n      if (n !== want.length) {\n        setDrawersRaw(c, i, n);\n        notes.push(n ? `Only ${n} of ${want.length} drawers fit in bay ${i + 1}` : `Bay ${i + 1} is too low for its drawers, so they were removed`);\n      }\n    });\n    now = effective(c);\n    build3 = buildOne(project, cabinetId);\n    const bays = build3.dims.sectionInfo || [];\n    const rooms = bays.map((_, i) => sectionRoom(build3, i));\n    bays.forEach((_, i) => {\n      const sp = (c.sections || [])[i];\n      const own2 = sp && sp.shelves;\n      const src = own2 || now.shelves;\n      const sT = shelfThickness(build3, i);\n      if (src.mode === \"custom\" && (src.positions || []).length) {\n        const fitted = spreadShelves(src.positions, rooms[i], sT);\n        const same = fitted.length === src.positions.length && fitted.every((v, k) => Math.abs(v - src.positions[k]) < 0.05);\n        if (!same) {\n          sectionSpec(c, i).shelves = { ...now.shelves, ...own2 || {}, mode: \"custom\", positions: fitted, count: fitted.length };\n          if (fitted.length < src.positions.length) notes.push(`Bay ${i + 1} holds ${fitted.length} of its ${src.positions.length} shelves`);\n        }\n      } else {\n        const cap2 = maxEvenShelves(rooms[i], sT);\n        if (src.count > cap2) {\n          sectionSpec(c, i).shelves = { ...now.shelves, ...own2 || {}, mode: \"even\", positions: [], count: cap2 };\n          notes.push(`Bay ${i + 1} holds ${cap2} of ${src.count} shelves`);\n        }\n      }\n    });\n    if (now.shelves.mode === \"custom\" && now.shelves.positions.length) {\n      const fitted = spreadShelves(now.shelves.positions, Math.max(...rooms, MIN_GAP), T3);\n      c.shelves = { ...now.shelves, positions: fitted, count: fitted.length };\n    } else if (rooms.length && now.shelves.count > maxEvenShelves(Math.max(...rooms), T3)) {\n      c.shelves = { ...now.shelves, count: maxEvenShelves(Math.max(...rooms), T3) };\n    }\n    for (let round = 0; round < 6; round += 1) {\n      build3 = buildOne(project, cabinetId);\n      if (!build3.warnings.length) break;\n      const w = build3.warnings[0];\n      let m;\n      if (m = /Drawer (\\d+) does not fit in section (\\d+)/.exec(w)) {\n        setDrawersRaw(c, Number(m[2]) - 1, Number(m[1]) - 1);\n        notes.push(`Only ${Number(m[1]) - 1} drawers fit in bay ${m[2]}`);\n        continue;\n      }\n      if (m = /Drawer \\d+ in section (\\d+) is too small for a box/.exec(w)) {\n        dropDrawersIn(Number(m[1]) - 1);\n        continue;\n      }\n      if (m = /Shelf \\d+ in section (\\d+) falls outside/.exec(w)) {\n        const i = Number(m[1]) - 1;\n        const list = shelfPositions(build3, i).slice(0, -1);\n        sectionSpec(c, i).shelves = { ...effective(c).shelves, ...(c.sections[i] || {}).shelves || {}, mode: \"custom\", positions: list, count: list.length };\n        notes.push(`Bay ${i + 1} cannot hold all its shelves`);\n        continue;\n      }\n      if (m = /Bay (\\d+)'s door would be only/.exec(w)) {\n        const i = Number(m[1]) - 1;\n        const have = drawerStack(build3, i).length;\n        if (have) {\n          setDrawersRaw(c, i, have - 1);\n          notes.push(`A drawer was removed from bay ${i + 1} to leave room for its door`);\n        } else {\n          sectionSpec(c, i).doors = { count: 0 };\n          notes.push(`Bay ${i + 1} is too low for a door`);\n        }\n        continue;\n      }\n      if (/would be only \\d+ mm high above the drawers/.test(w)) {\n        const infos = build3.dims.sectionInfo || [];\n        let tallest = -1;\n        let top = -Infinity;\n        infos.forEach((info, i) => {\n          if (info.drawers.length && info.drawerTop > top) {\n            top = info.drawerTop;\n            tallest = i;\n          }\n        });\n        if (tallest >= 0) {\n          setDrawersRaw(c, tallest, infos[tallest].drawers.length - 1);\n          notes.push(`A drawer was removed from bay ${tallest + 1} to leave room for the doors`);\n        } else {\n          c.doors = { ...effective(c).doors, count: 0 };\n          notes.push(\"The cabinet is too low for doors\");\n        }\n        continue;\n      }\n      if (m = /only shelves may differ in thickness \u2014 (\\S+) stays/.exec(w)) {\n        const mats = { ...c.materials || {} };\n        delete mats[m[1]];\n        c.materials = mats;\n        notes.push(`${m[1]} back on the carcass board`);\n        continue;\n      }\n      if (/too low/.test(w)) {\n        c.plinth = { ...effective(c).plinth, height: LIMITS2.plinthHeight[0] };\n        continue;\n      }\n      if (/groove/.test(w)) {\n        c.back = { ...effective(c).back, mode: \"overlay\" };\n        notes.push(\"The back is overlaid: no depth for a groove\");\n        continue;\n      }\n      if (/Divider/.test(w)) {\n        c.dividers = { ...effective(c).dividers, mode: \"even\", positions: [] };\n        continue;\n      }\n      break;\n    }\n    return { notes };\n  }\n  function setDrawersRaw(c, section, n) {\n    const spec = sectionSpec(c, section);\n    const heights = (spec.drawers && spec.drawers.heights || []).slice(0, n);\n    spec.drawers = { count: n, heights };\n  }\n  var SIZE_LIMITS = { width: [200, 3e3], height: [200, 3e3], depth: [100, 1200] };\n  var LIMIT_OF = {\n    \"plinth.height\": LIMITS2.plinthHeight,\n    \"plinth.recess\": LIMITS2.recess,\n    \"back.grooveOffset\": LIMITS2.grooveOffset,\n    \"worktop.overhangFront\": LIMITS2.overhang,\n    \"doors.gap\": LIMITS2.gap,\n    \"shelves.setback\": LIMITS2.setback\n  };\n  function resizeCabinet(project, cabinetId, dim, value, opts = {}) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c || !SIZE_LIMITS[dim]) return null;\n    const [lo, hi] = SIZE_LIMITS[dim];\n    const mag = opts.magnet && opts.snap !== false ? resizeMagnet(project, cabinetId, dim, value, opts.magnet.held) : null;\n    const snap22 = mag ? { value: mag.size, snapped: mag.label } : snapValue(value, [], { enabled: opts.snap !== false, grid: opts.grid == null ? 10 : opts.grid, tolerance: opts.tolerance == null ? 4 : opts.tolerance });\n    const v = Math.round(clamp3(snap22.value, lo, hi));\n    c[dim] = v;\n    const fit = fitContents(project, cabinetId);\n    const note = fit && fit.notes.length ? fit.notes.join(\"; \") : null;\n    const out = { value: v, snapped: snap22.snapped, note };\n    if (mag && v === mag.size) out.magnet = mag;\n    return out;\n  }\n  var RESIZE_MAGNET = { on: 30, off: 60 };\n  function resizeMagnet(project, cabinetId, dim, want, held = null) {\n    const me = buildOne(project, cabinetId);\n    if (!me || !SIZE_LIMITS[dim]) return null;\n    const box3 = carcassBox(me);\n    const axis = dim === \"height\" ? \"y\" : dim === \"width\" !== box3.turned ? \"x\" : \"z\";\n    const base = box3[`${axis}0`];\n    const gap = Number(project.gap) || 0;\n    const idx = project.cabinets.findIndex((c) => c.id === cabinetId);\n    const mePlaced = !!normaliseCabinet(project.cabinets[idx]).position;\n    const [lo, hi] = SIZE_LIMITS[dim];\n    const apart = (a, b, k) => Math.max(a[`${k}0`], b[`${k}0`]) - Math.min(a[`${k}1`], b[`${k}1`]);\n    const near2 = gap + 20;\n    let best = null;\n    project.cabinets.forEach((c, i) => {\n      if (c.id === cabinetId) return;\n      const placed = !!normaliseCabinet(c).position;\n      if (dim === \"width\" && !mePlaced && !placed && i > idx) return;\n      const o = buildOne(project, c.id);\n      if (!o) return;\n      const ob = carcassBox(o);\n      const name2 = c.name || c.id;\n      const targets = [];\n      if (axis === \"y\") {\n        if (!(apart(box3, ob, \"x\") <= near2 && apart(box3, ob, \"z\") <= near2)) return;\n        if (ob.y1 > base) targets.push({ at: ob.y1, label: `top level with ${name2}` });\n        if (ob.y0 > base + 1 && apart(box3, ob, \"x\") < 0 && apart(box3, ob, \"z\") < 0) targets.push({ at: ob.y0, label: `up to the underside of ${name2}` });\n      } else {\n        const other = axis === \"x\" ? \"z\" : \"x\";\n        if (apart(box3, ob, other) > 1) return;\n        const a0 = ob[`${axis}0`];\n        const a1 = ob[`${axis}1`];\n        targets.push({ at: a1, label: `flush with ${name2}` });\n        targets.push({ at: a0, label: `flush with ${name2}` });\n        if (gap && a0 - gap > base) targets.push({ at: a0 - gap, label: `up to ${name2}, gap ${gap}` });\n      }\n      targets.forEach((t) => {\n        const size3 = Math.round(t.at - base);\n        if (size3 < lo || size3 > hi) return;\n        const key = `${dim}:${c.id}:${Math.round(t.at)}`;\n        const d2 = Math.abs(size3 - want);\n        if (d2 > (held === key ? RESIZE_MAGNET.off : RESIZE_MAGNET.on)) return;\n        if (best && best.d <= d2) return;\n        best = { d: d2, size: size3, key, label: t.label, otherId: c.id, guide: { axis, at: t.at, box: ob, mine: box3 } };\n      });\n    });\n    if (!best) return null;\n    const { d, ...out } = best;\n    return out;\n  }\n  function setCorner(project, cabinetId, key, patch = {}) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c || ![\"tl\", \"tr\", \"bl\", \"br\"].includes(key)) return null;\n    const now = effective(c).corners[key];\n    const next = { ...now };\n    if (patch.over === \"side\" || patch.over === \"top\") next.over = patch.over;\n    if (patch.fixing !== void 0) next.fixing = [\"confirmat\", \"dowel\", \"cam\", \"none\"].includes(patch.fixing) ? patch.fixing : \"\";\n    c.corners = { ...c.corners || {}, [key]: next };\n    return { value: next.over, ...next };\n  }\n  function setCornersAll(project, cabinetId, patch = {}) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    [\"tl\", \"tr\", \"bl\", \"br\"].forEach((k) => setCorner(project, cabinetId, k, patch));\n    if (patch.over === \"side\" || patch.over === \"top\") c.construction = patch.over === \"side\" ? \"sides-overlay\" : \"tops-overlay\";\n    return effective(c).corners;\n  }\n  function setShelfProps(project, cabinetId, section, patch = {}) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const eff = effective(c);\n    const own2 = c.sections && c.sections[section] && c.sections[section].shelves;\n    const target = eff.sections.length <= 1 && !own2 ? \"cabinet\" : \"bay\";\n    const base = target === \"cabinet\" ? { ...eff.shelves, ...c.shelves || {} } : { ...own2 || eff.shelves };\n    const next = { ...base };\n    if (patch.setback != null && Number.isFinite(Number(patch.setback))) next.setback = Math.max(0, Math.min(60, Math.round(Number(patch.setback))));\n    if (patch.fixing === \"pins\" || patch.fixing === \"fixed\") next.fixing = patch.fixing;\n    if (target === \"cabinet\") c.shelves = next;\n    else sectionSpec(c, section).shelves = next;\n    return { value: next.setback, setback: next.setback, fixing: next.fixing, target };\n  }\n  function setRoleMaterial(project, cabinetId, role, materialId) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const before = c.materials;\n    if (materialId && role !== \"shelf\") {\n      const eff = effective(c);\n      const baseline = role === \"back\" ? materialById(eff.backMaterialId).thickness : materialById(eff.materialId).thickness;\n      if (Math.abs(materialById(materialId).thickness - baseline) > 0.01) return null;\n    }\n    const mats = { ...c.materials || {} };\n    if (materialId) mats[role] = materialId;\n    else delete mats[role];\n    c.materials = mats;\n    const warn = buildOne(project, cabinetId).warnings.find((w) => /thickness|board/i.test(w));\n    if (warn) {\n      c.materials = before;\n      return null;\n    }\n    return { value: materialId || \"\", role };\n  }\n  var MAGNET_RANGE = 80;\n  function carcassBox(build3) {\n    const d = build3.dims;\n    const c = build3.cabinet;\n    const x0 = d.offsetX || 0;\n    const y0 = d.offsetY || 0;\n    const z0 = d.offsetZ || 0;\n    const turned = (d.rotation || 0) / 90 % 2 !== 0;\n    const fx = turned ? c.depth : c.width;\n    const fz = turned ? c.width : c.depth;\n    return { x0, x1: x0 + fx, y0, y1: y0 + c.height, z0, z1: z0 + fz, turned, rotation: d.rotation || 0 };\n  }\n  function boxOverlap(a, b) {\n    const on = (a0, a1, b0, b1) => Math.min(a1, b1) - Math.max(a0, b0);\n    return { x: on(a.x0, a.x1, b.x0, b.x1), y: on(a.y0, a.y1, b.y0, b.y1), z: on(a.z0, a.z1, b.z0, b.z1) };\n  }\n  function boxesClash(a, b, tol = 0.5) {\n    const o = boxOverlap(a, b);\n    return o.x > tol && o.y > tol && o.z > tol;\n  }\n  function positionOf(project, cabinetId) {\n    const b = buildOne(project, cabinetId);\n    if (!b) return null;\n    return { x: b.dims.offsetX || 0, y: b.dims.offsetY || 0, z: b.dims.offsetZ || 0, rotation: b.dims.rotation || 0 };\n  }\n  function magnetFor(project, cabinetId, wanted2, opts = {}) {\n    const range = opts.range == null ? MAGNET_RANGE : opts.range;\n    const gap = Number(project.gap) || 0;\n    const me = buildOne(project, cabinetId);\n    if (!me) return { ...wanted2, snapped: null, guides: [] };\n    const mine = carcassBox(me);\n    const W2 = mine.x1 - mine.x0;\n    const H2 = me.cabinet.height;\n    const D2 = mine.z1 - mine.z0;\n    const others2 = project.cabinets.filter((c) => c.id !== cabinetId).map((c) => buildOne(project, c.id)).filter(Boolean);\n    const best = { x: null, y: null, z: null };\n    const guides = [];\n    const take = (axis, value, dist2, label, guide) => {\n      if (dist2 > range) return;\n      if (best[axis] && best[axis].dist <= dist2) return;\n      best[axis] = { value, dist: dist2, label, guide };\n    };\n    if (opts.magnets !== false) {\n      others2.forEach((o) => {\n        const ob = carcassBox(o);\n        const name2 = o.cabinet.name || o.cabinet.id;\n        const corner = ob.rotation !== mine.rotation ? `into the corner with ${name2}` : \"\";\n        take(\"x\", ob.x1 + gap, Math.abs(wanted2.x - (ob.x1 + gap)), corner || `side to side with ${name2}${gap ? `, gap ${gap}` : \"\"}`, { kind: \"face\", x: ob.x1, box: ob });\n        take(\"x\", ob.x0 - gap - W2, Math.abs(wanted2.x - (ob.x0 - gap - W2)), corner || `side to side with ${name2}${gap ? `, gap ${gap}` : \"\"}`, { kind: \"face\", x: ob.x0, box: ob });\n        take(\"x\", ob.x0, Math.abs(wanted2.x - ob.x0), `left edge lined up with ${name2}`, { kind: \"line\", x: ob.x0, box: ob });\n        take(\"z\", ob.z0, Math.abs(wanted2.z - ob.z0), `backs aligned with ${name2}`, { kind: \"back\", z: ob.z0, box: ob });\n        take(\"z\", ob.z1 - D2, Math.abs(wanted2.z - (ob.z1 - D2)), `fronts flush with ${name2}`, { kind: \"back\", z: ob.z1, box: ob });\n        const overlap2 = (a0, a1, b0, b1) => Math.min(a1, b1) - Math.max(a0, b0);\n        const onIt = opts.stack !== false && overlap2(wanted2.x, wanted2.x + W2, ob.x0, ob.x1) > 50 && overlap2(wanted2.z, wanted2.z + D2, ob.z0, ob.z1) > 50;\n        const wt = (o.panels || []).find((p) => p.role === \"worktop\");\n        const topY2 = wt ? wt.box.max.y : ob.y1;\n        const topLabel = wt ? `onto the worktop of ${name2}` : `on top of ${name2}`;\n        take(\"y\", topY2, onIt ? 0 : Math.abs(wanted2.y - topY2), topLabel, { kind: \"top\", y: topY2, box: ob });\n      });\n    }\n    if (opts.magnets !== false) take(\"y\", 0, Math.abs(wanted2.y - 0) + 0.01, \"on the floor\", { kind: \"floor\", y: 0 });\n    const out = { x: wanted2.x, y: wanted2.y, z: wanted2.z, snapped: null, guides: [] };\n    const labels = [];\n    [\"x\", \"y\", \"z\"].forEach((axis) => {\n      const b = best[axis];\n      if (!b) return;\n      out[axis] = r14(b.value);\n      if (Math.abs(b.value - wanted2[axis]) > 0.05) {\n        labels.push(b.label);\n        if (b.guide) guides.push({ ...b.guide, label: b.label });\n      }\n    });\n    out.snapped = labels.length ? [...new Set(labels)].join(\" \\xB7 \") : null;\n    out.guides = guides;\n    out.y = Math.max(0, out.y);\n    others2.forEach((o) => {\n      const ob = carcassBox(o);\n      const mineNow = { x0: out.x, x1: out.x + W2, y0: out.y, y1: out.y + H2, z0: out.z, z1: out.z + D2 };\n      if (!boxesClash(mineNow, ob)) return;\n      const ov = boxOverlap(mineNow, ob);\n      const name2 = o.cabinet.name || o.cabinet.id;\n      const ways = [\n        { axis: \"x\", to: ob.x1 + gap, cost: ov.x + gap, label: `clear of ${name2}` },\n        { axis: \"x\", to: ob.x0 - gap - W2, cost: ov.x + gap, label: `clear of ${name2}` },\n        { axis: \"z\", to: ob.z1 + gap, cost: ov.z + gap, label: `clear of ${name2}` },\n        { axis: \"z\", to: ob.z0 - gap - D2, cost: ov.z + gap, label: `clear of ${name2}` },\n        { axis: \"y\", to: ob.y1, cost: ov.y, label: `on top of ${name2}` }\n      ].map((w2) => ({ ...w2, move: Math.abs(w2.to - out[w2.axis]) }));\n      ways.sort((p, q) => p.move - q.move);\n      const w = ways.find((k) => k.axis !== \"y\" || k.to >= 0) || ways[0];\n      out[w.axis] = r14(Math.max(w.axis === \"y\" ? 0 : -1e6, w.to));\n      out.snapped = [.../* @__PURE__ */ new Set([...out.snapped ? out.snapped.split(\" \\xB7 \") : [], w.label])].join(\" \\xB7 \");\n    });\n    out.y = Math.max(0, out.y);\n    return out;\n  }\n  function setCabinetPosition(project, cabinetId, pos) {\n    const c = cabinetOf(project, cabinetId);\n    if (!c) return null;\n    const now = positionOf(project, cabinetId) || { x: 0, y: 0, z: 0, rotation: 0 };\n    const next = {\n      x: Number.isFinite(Number(pos && pos.x)) ? Number(pos.x) : now.x,\n      y: Math.max(0, Number.isFinite(Number(pos && pos.y)) ? Number(pos.y) : now.y),\n      z: Number.isFinite(Number(pos && pos.z)) ? Number(pos.z) : now.z,\n      rotation: Number.isFinite(Number(pos && pos.rotation)) ? Number(pos.rotation) : now.rotation || 0\n    };\n    c.position = { x: r14(next.x), y: r14(next.y), z: r14(next.z), rotation: quarter(next.rotation) };\n    fitContents(project, cabinetId);\n    return { value: c.position.x, ...c.position };\n  }\n  var quarter = (deg) => (Math.round((Number(deg) || 0) / 90) * 90 % 360 + 360) % 360;\n  var FACING = [\"front\", \"right\", \"back\", \"left\"];\n  function clearPositions(project) {\n    let n = 0;\n    project.cabinets.forEach((c) => {\n      if (c.position) {\n        delete c.position;\n        n += 1;\n      }\n    });\n    return { value: n, cleared: n };\n  }\n  var r15 = (v) => Math.round(v * 10) / 10;\n  function emptyProject(name2 = \"New project\") {\n    return {\n      name: name2,\n      gap: 0,\n      cabinets: [],\n      parts: { deductEdging: true, oversize: 0, overrides: {}, custom: [] },\n      nesting: { kerf: 4, trim: 10, spacing: 0, strategy: \"guillotine\", heuristic: \"auto\", grainLock: true, timeBudgetMs: 1500, minOffcut: 100, sheets: {}, stock: {} },\n      machine: { toolDiameter: 8, passDepth: 6, safeZ: 10, feedXY: 3e3, feedZ: 800, plunge: 600, spindle: 18e3, layerStyle: \"plain\" }\n    };\n  }\n  var nextId = (project) => `c${Math.max(0, ...project.cabinets.map((c) => Number(String(c.id).replace(/\\D/g, \"\")) || 0)) + 1}`;\n  var cabinetOf2 = (project, id) => {\n    const c = project.cabinets.find((x) => x.id === id) || (id == null && project.cabinets.length === 1 ? project.cabinets[0] : null);\n    if (!c) throw new Error(project.cabinets.length ? `No cabinet \"${id}\". Cabinets: ${project.cabinets.map((x) => `${x.id} (${x.name || \"Cabinet\"})`).join(\", \")}.` : \"There is no cabinet yet: add_cabinet first.\");\n    return c;\n  };\n  var materialOrThrow = (id, what) => {\n    if (!MATERIALS2.some((m) => m.id === id)) throw new Error(`Unknown ${what} \"${id}\". Boards: ${MATERIALS2.map((m) => m.id).join(\", \")}.`);\n    return id;\n  };\n  var int = (v, lo, hi, what) => {\n    const n = Math.round(Number(v));\n    if (!Number.isFinite(n) || n < lo || n > hi) throw new Error(`${what} must be a whole number from ${lo} to ${hi}, got ${JSON.stringify(v)}.`);\n    return n;\n  };\n  var num22 = (v, [lo, hi], what) => {\n    const n = Number(v);\n    if (!Number.isFinite(n)) throw new Error(`${what} must be a number in mm, got ${JSON.stringify(v)}.`);\n    if (n < lo || n > hi) throw new Error(`${what} ${n} mm is outside ${lo}\\u2013${hi} mm.`);\n    return n;\n  };\n  var bayIndex = (project, c, bay) => {\n    const b = buildOne(project, c.id);\n    const n = (b.dims.sectionInfo || []).length;\n    const i = int(bay == null ? 1 : bay, 1, n, `bay (this cabinet has ${n})`) - 1;\n    return { b, i, n };\n  };\n  var size2 = (c) => `${c.width} \\xD7 ${c.height} \\xD7 ${c.depth}`;\n  var baysWithOwnDoors = (c) => normaliseCabinet(c).sections.map((sp, i) => sp && sp.doors ? i + 1 : 0).filter(Boolean);\n  function clearBayDoors(project, cabinetId, section) {\n    const c = cabinetOf2(project, cabinetId);\n    const spec = c && Array.isArray(c.sections) ? c.sections[section] : null;\n    if (!spec || !spec.doors) return false;\n    delete spec.doors;\n    fitContents(project, cabinetId);\n    return true;\n  }\n  function frontSizes(build3, section) {\n    const cuts = build3.panels.filter((p) => p.role === \"drawer-front\" && (p.section || 0) === section).sort((x, y) => x.box.min.y - y.box.min.y).map((p) => r15(p.box.max.y - p.box.min.y));\n    return drawerStack(build3, section).map((d, k) => ({ pitch: r15(d.height), cut: cuts[k] == null ? null : cuts[k] }));\n  }\n  var frontsText = (build3, section) => {\n    const fs = frontSizes(build3, section).filter((f) => f.cut != null);\n    return fs.length ? `fronts cut ${fs.map((f) => f.cut).join(\" / \")} mm` : \"\";\n  };\n  var FRONT_FIELDS = {\n    frontStyle: { type: \"string\", enum: [\"slab\", \"shaker\"], description: \"Style of doors and drawer fronts. Shaker has real recessed panels, also carried to the cut list as pockets.\" },\n    shaker: {\n      type: \"object\",\n      description: \"Shaker dimensions in mm; panels are stacked vertically. railAt 0 divides equally; a positive height is the centre of the rail of a two-panel front, from its bottom.\",\n      additionalProperties: false,\n      properties: { panels: { type: \"integer\", enum: [1, 2, 4] }, frame: { type: \"number\" }, rail: { type: \"number\" }, railAt: { type: \"number\" }, depth: { type: \"number\" } }\n    }\n  };\n  function applyFront(a, c) {\n    if (a.frontStyle != null) {\n      if (![\"slab\", \"shaker\"].includes(a.frontStyle)) throw new Error(\"frontStyle is slab or shaker\");\n      c.frontStyle = a.frontStyle;\n    }\n    if (a.shaker != null) {\n      if (!a.shaker || typeof a.shaker !== \"object\" || Array.isArray(a.shaker)) throw new Error(\"shaker must be an object\");\n      const next = { ...c.shaker || {} };\n      for (const [key, value] of Object.entries(a.shaker)) {\n        if (key === \"panels\") {\n          if (![1, 2, 4].includes(value)) throw new Error(\"Shaker panels must be 1, 2 or 4\");\n          next.panels = value;\n        } else {\n          const limits = { frame: [10, 200], rail: [10, 200], railAt: [0, 3e3], depth: [1, 30] };\n          if (!limits[key]) throw new Error(\"Unknown Shaker parameter: \" + key);\n          next[key] = num22(value, limits[key], \"Shaker \" + key);\n        }\n      }\n      c.shaker = next;\n    }\n  }\n  var CABINET_FIELDS = {\n    ...FRONT_FIELDS,\n    name: { type: \"string\", description: 'What to call it, e.g. \"Vinyl cabinet\".' },\n    width: { type: \"number\", description: \"Overall width, mm (200\\u20133000).\" },\n    height: { type: \"number\", description: \"Overall height, mm, INCLUDING the plinth or legs (200\\u20133000). A kitchen base unit is height 870 = 720 carcass + 150 plinth.\" },\n    depth: { type: \"number\", description: \"Carcass depth, mm, without doors (100\\u20131200).\" },\n    materialId: { type: \"string\", description: \"Carcass board id from list_materials, e.g. mfc-white-18, mfc-oak-18, ply-18.\" },\n    backMaterialId: { type: \"string\", description: \"Back panel board id, e.g. hdf-3-white, mdf-6, ply-6.\" },\n    frontMaterialId: { type: \"string\", description: 'Board for doors and drawer fronts; omit or \"\" for the carcass board.' },\n    construction: { type: \"string\", enum: [\"sides-overlay\", \"tops-overlay\"], description: \"sides-overlay: sides run full height. tops-overlay: top and bottom run full width. Corners can still differ (set_corner).\" },\n    joints: { type: \"string\", enum: JOINTS, description: \"Carcass fixing: confirmat, dowel, cam (cam lock), none.\" },\n    plinth: { type: \"string\", enum: [\"recessed\", \"legs\", \"none\"], description: \"A recessed plinth, adjustable legs, or nothing under the bottom.\" },\n    plinthHeight: { type: \"number\", description: \"Plinth or leg height, mm (40\\u2013250).\" },\n    doors: { type: \"integer\", description: \"Doors across the whole front: 0, 1 or 2. Refused while any bay has doors of its own, because the model would ignore it \\u2014 clear those bays with set_bay { bay, doors: 0 } or keep setting the doors per bay.\" },\n    hinge: { type: \"string\", enum: [\"left\", \"right\"], description: \"Hinge side of a single door.\" },\n    back: { type: \"string\", enum: [\"groove\", \"rabbet\", \"overlay\", \"inset\"], description: \"How the back panel is fixed: in a groove, in a rabbet, overlaid on the rear, or inset \\u2014 a carcass board set in between the sides with a service void behind it, fixed with the joints (owner 05.10.2026).\" },\n    handles: { type: \"string\", enum: [\"bar\", \"knob\", \"none\"], description: \"Handles on the fronts.\" },\n    // NOT `hinge`: that one is the SIDE a single door swings from, and has been since before the\n    // catalogue existed. These two pick WHICH fitting is drilled for, which changes the holes.\n    hingeType: { type: \"string\", enum: Object.keys(HINGES), description: `Which concealed hinge to drill for: ${Object.values(HINGES).map((h) => `${h.id} (${h.name})`).join(\", \")}. It changes the cup and plate holes.` },\n    runnerType: { type: \"string\", enum: Object.keys(RUNNERS), description: `Which drawer runner to build the boxes for: ${Object.values(RUNNERS).map((r) => `${r.id} (${r.name})`).join(\", \")}. It changes the box width and the holes.` },\n    worktop: { type: \"boolean\", description: \"A worktop over this unit (base units in a kitchen). Neighbouring units at the same height share one slab.\" },\n    worktopMaterialId: { type: \"string\", enum: worktopMaterials().map((m) => m.id), description: \"The worktop board (switches the worktop on): worktop-lam-38, worktop-oak-40, or a thick MDF.\" },\n    columns: { type: \"integer\", description: \"Split the inside into this many equal bays with vertical dividers (1\\u20137). A 4-column record cabinet: columns 4. On set_cabinet this RESETS what every bay held (drawers, rails, doors, own shelves).\" },\n    rows: { type: \"integer\", description: \"Shelves that split every bay into this many equal cells (1\\u201313). Two rows of records: rows 2. Give rows OR shelves, not both.\" },\n    shelves: { type: \"integer\", description: 'Shelves in every bay (0\\u201312). \"rows\" is the same thing said as cells: rows 2 = shelves 1. Give rows OR shelves, not both.' },\n    drawers: { type: \"integer\", description: \"Drawers at the foot of EVERY bay (0\\u20136). As many as fit are kept and the answer says how many. For drawers in one bay only use set_bay.\" },\n    drawerHeight: { type: \"number\", description: \"Drawer PITCH \\u2014 the step of the stack, mm (80\\u2013400). The cut front differs a little: the bottom one is taller (it covers the bottom panel edge), the ones above lose the gap. The answer gives both.\" }\n  };\n  function applyCabinetFields(project, c, a) {\n    const notes = [];\n    if (a.name != null) c.name = String(a.name).slice(0, 80);\n    const bad = [[\"width\", a.width, LIMITS2.width], [\"height\", a.height, LIMITS2.height], [\"depth\", a.depth, LIMITS2.depth]].filter(([, v]) => v != null).map(([what, v, lim]) => Number.isFinite(Number(v)) && Number(v) >= lim[0] && Number(v) <= lim[1] ? null : `${what} ${JSON.stringify(v)} (${lim[0]}\\u2013${lim[1]})`).filter(Boolean);\n    if (bad.length) {\n      const cm = [a.width, a.height, a.depth].filter((v) => Number.isFinite(Number(v)) && Number(v) > 0 && Number(v) < 200).length >= 2;\n      throw new Error(`Outside what can be built, in mm: ${bad.join(\"; \")}.${cm ? \" These look like centimetres \\u2014 sizes are in millimetres (120 cm = 1200).\" : \"\"}`);\n    }\n    applyFront(a, c);\n    if (a.width != null) c.width = num22(a.width, LIMITS2.width, \"width\");\n    if (a.height != null) c.height = num22(a.height, LIMITS2.height, \"height\");\n    if (a.depth != null) c.depth = num22(a.depth, LIMITS2.depth, \"depth\");\n    if (a.materialId != null) c.materialId = materialOrThrow(a.materialId, \"carcass board\");\n    if (a.backMaterialId != null) c.backMaterialId = materialOrThrow(a.backMaterialId, \"back board\");\n    if (a.frontMaterialId != null) c.frontMaterialId = a.frontMaterialId ? materialOrThrow(a.frontMaterialId, \"front board\") : \"\";\n    if (a.construction != null) {\n      if (![\"sides-overlay\", \"tops-overlay\"].includes(a.construction)) throw new Error(\"construction is sides-overlay or tops-overlay\");\n      c.construction = a.construction;\n      c.corners = {};\n    }\n    if (a.joints != null) {\n      if (!JOINTS.includes(a.joints)) throw new Error(`joints is one of ${JOINTS.join(\", \")}`);\n      c.joints = { type: a.joints };\n    }\n    if (a.plinth != null) {\n      if (![\"recessed\", \"legs\", \"none\"].includes(a.plinth)) throw new Error(\"plinth is recessed, legs or none\");\n      c.plinth = { ...c.plinth || {}, type: a.plinth };\n    }\n    if (a.plinthHeight != null) c.plinth = { ...c.plinth || {}, height: num22(a.plinthHeight, LIMITS2.plinthHeight, \"plinthHeight\") };\n    if (a.doors != null || a.hinge != null) {\n      const own2 = baysWithOwnDoors(c);\n      if (own2.length) {\n        throw new Error(`Bay ${own2.join(\" and \")} ${own2.length === 1 ? \"has doors\" : \"have doors\"} of its own, so a cabinet-wide door setting would do nothing. Set the doors per bay (set_bay { bay: 1, doors: 2 }), or give every one of those bays doors: 0 first \\u2014 that hands the cabinet its doors back.`);\n      }\n    }\n    if (a.doors != null) c.doors = { ...c.doors || {}, count: int(a.doors, 0, 2, \"doors\") };\n    if (a.hinge != null) {\n      if (![\"left\", \"right\"].includes(a.hinge)) throw new Error(\"hinge is left or right\");\n      c.doors = { ...c.doors || {}, hinge: a.hinge };\n    }\n    if (a.back != null) {\n      if (![\"groove\", \"rabbet\", \"overlay\", \"inset\"].includes(a.back)) throw new Error(\"back is groove, rabbet, overlay or inset\");\n      c.back = { ...c.back || {}, mode: a.back };\n    }\n    if (a.handles != null) {\n      if (![\"bar\", \"knob\", \"none\"].includes(a.handles)) throw new Error(\"handles is bar, knob or none\");\n      c.handles = { ...c.handles || {}, type: a.handles };\n    }\n    if (a.hingeType != null) {\n      if (!HINGES[a.hingeType]) throw new Error(`hingeType is one of ${Object.keys(HINGES).join(\", \")}`);\n      c.fittings = { ...c.fittings || {}, hinge: a.hingeType };\n      notes.push(`Hinge: ${HINGES[a.hingeType].name}.`);\n    }\n    if (a.runnerType != null) {\n      if (!RUNNERS[a.runnerType]) throw new Error(`runnerType is one of ${Object.keys(RUNNERS).join(\", \")}`);\n      c.fittings = { ...c.fittings || {}, runner: a.runnerType };\n      notes.push(`Runner: ${RUNNERS[a.runnerType].name}.`);\n    }\n    if (a.worktop != null) c.worktop = { ...c.worktop || {}, on: !!a.worktop };\n    if (a.worktopMaterialId != null) c.worktop = { ...c.worktop || {}, on: true, materialId: a.worktopMaterialId };\n    if (a.columns != null) {\n      const n = int(a.columns, 1, LIMITS2.dividers[1] + 1, \"columns\");\n      c.dividers = { count: n - 1, mode: \"even\", positions: [] };\n      c.sections = [];\n    }\n    if (a.rows != null && a.shelves != null) throw new Error(\"Give rows OR shelves, not both: rows 2 means shelves 1.\");\n    let shelves = a.shelves;\n    if (a.rows != null) shelves = int(a.rows, 1, LIMITS2.shelves[1] + 1, \"rows\") - 1;\n    if (shelves != null) {\n      c.shelves = { ...c.shelves || {}, count: int(shelves, 0, LIMITS2.shelves[1], \"shelves\"), mode: \"even\", positions: [] };\n      (c.sections || []).forEach((s) => {\n        if (s && s.shelves) delete s.shelves;\n      });\n    }\n    if (a.drawerHeight != null) c.drawer = { ...c.drawer || {}, height: num22(a.drawerHeight, LIMITS2.drawerHeight, \"drawerHeight\") };\n    if (a.drawers != null) {\n      const n = int(a.drawers, 0, LIMITS2.drawers[1], \"drawers\");\n      const bays = buildCabinet(c, { id: c.id }).dims.sectionInfo.length;\n      for (let i = 0; i < bays; i += 1) {\n        const r = setDrawers(project, c.id, i, n);\n        const d = buildCabinet(c, { id: c.id }).dims;\n        if (n > 0 && r === null) throw new Error(`Bay ${i + 1} cannot hold a drawer: ${Math.round(d.sectionInfo[i].width)} mm wide and ${Math.round(d.innerHeight)} mm high inside.`);\n        if (r && r.count < n) notes.push(`${r.count} of ${n} drawers fit in bay ${i + 1} (${Math.round(d.innerHeight)} mm high inside)`);\n      }\n    }\n    return notes;\n  }\n  var RECORD = { sleeve: 315, clearMin: 330, depthMin: 340, mmPerRecord: 5.5 };\n  var looksLikeRecords = (c) => /vinyl|record|\u043F\u043B\u0430\u0441\u0442\u0438\u043D|\u0432\u0438\u043D\u0438\u043B/i.test(String(c && c.name || \"\"));\n  function recordCells(build3) {\n    const d = build3.dims;\n    const T3 = d.thickness;\n    const depth = r15(d.innerZ[1] - d.innerZ[0]);\n    const bays = (d.sectionInfo || []).map((sec, i) => {\n      const stops = [sec.drawerTop, ...sec.shelves.flatMap((y) => [y, y + shelfT(build3, sec)]), d.innerY[1]];\n      const rows = [];\n      for (let k = 0; k < stops.length; k += 2) rows.push(r15(stops[k + 1] - stops[k]));\n      const width = r15(sec.x1 - sec.x0);\n      return { bay: i + 1, clearWidth: width, rows, records: Math.floor(width / RECORD.mmPerRecord), drawers: sec.drawers.length };\n    });\n    const warnings = [];\n    if (depth < RECORD.depthMin) warnings.push(`the inside depth is ${depth} mm; a 12-inch sleeve needs ${RECORD.depthMin}`);\n    bays.forEach((b) => {\n      if (b.clearWidth < RECORD.clearMin) warnings.push(`bay ${b.bay} is ${b.clearWidth} mm wide; a sleeve needs ${RECORD.clearMin}`);\n      b.rows.forEach((h, k) => {\n        if (h < RECORD.clearMin) warnings.push(`bay ${b.bay} row ${k + 1} is ${h} mm high; a sleeve needs ${RECORD.clearMin}`);\n      });\n    });\n    const cells2 = bays.reduce((a, b) => a + b.rows.length, 0);\n    const total = bays.reduce((a, b) => a + b.records * b.rows.length, 0);\n    const message = `${cells2} cells, inside depth ${depth} mm, about ${total} LPs in all (${RECORD.mmPerRecord} mm per record, loose). ` + bays.map((b) => `bay ${b.bay}: ${b.clearWidth} wide, rows ${b.rows.join(\" / \")} high, ~${b.records} LPs per row${b.drawers ? `, ${b.drawers} drawer${b.drawers === 1 ? \"\" : \"s\"} below` : \"\"}`).join(\"; \") + (warnings.length ? `. TOO SMALL: ${warnings.join(\"; \")}` : \". Every cell clears a 12-inch sleeve.\");\n    return { message, cells: cells2, depth, bays, records: total, warnings, ok: warnings.length === 0 };\n  }\n  function shelfT(build3, sec) {\n    const sh = build3.panels.find((p) => p.role === \"shelf\" && p.section === sec.index);\n    return sh ? sh.box.max.y - sh.box.min.y : build3.dims.thickness;\n  }\n  var TOOLS = [\n    {\n      name: \"list_materials\",\n      description: \"The boards a cabinet can be cut from, with ids to use in other tools.\",\n      parameters: { type: \"object\", properties: {} },\n      run: () => ({ message: MATERIALS2.map((m) => `${m.id}: ${m.name}, ${m.thickness} mm, sheet ${m.sheet.length} \\xD7 ${m.sheet.width}${m.grain ? \", grained\" : \"\"}`).join(\"\\n\"), materials: MATERIALS2.map((m) => ({ id: m.id, name: m.name, thickness: m.thickness, group: m.group })) })\n    },\n    {\n      name: \"list_presets\",\n      description: \"Starting points for add_cabinet: a base unit, a wall unit, a wardrobe, a bookcase and so on.\",\n      parameters: { type: \"object\", properties: {} },\n      run: () => ({ message: Object.entries(PRESETS).map(([k, p]) => `${k}: ${p.name}, ${p.width} \\xD7 ${p.height} \\xD7 ${p.depth}`).join(\"\\n\") })\n    },\n    {\n      name: \"new_project\",\n      description: \"Start an empty project. Not needed when the project passed in is already what to build on.\",\n      parameters: { type: \"object\", properties: { name: { type: \"string\", description: \"Project name.\" } } },\n      run: (project, a) => {\n        const p = emptyProject(a.name || \"New project\");\n        Object.assign(project, p);\n        Object.keys(project).forEach((k) => {\n          if (!(k in p)) delete project[k];\n        });\n        return { message: `Empty project \"${project.name}\".` };\n      }\n    },\n    {\n      name: \"add_cabinet\",\n      description: \"Add a cabinet to the row (left to right). Give the overall size and what is inside; a vinyl cabinet of 8 cells is columns 4, rows 2. Returns the cabinet id for later tools.\",\n      parameters: { type: \"object\", properties: { preset: { type: \"string\", enum: Object.keys(PRESETS), description: \"A starting point from list_presets (default: a plain empty box). For vinyl records use preset vinyl: its cells fit 12-inch sleeves (\\u2265 330 mm clear); columns and rows change the count of cells, and check_records verifies the cell size.\" }, ...CABINET_FIELDS }, required: [\"width\", \"height\", \"depth\"] },\n      run: (project, a) => {\n        const id = nextId(project);\n        if (a.preset && !PRESETS[a.preset]) throw new Error(`Unknown preset \"${a.preset}\". Presets: ${Object.keys(PRESETS).join(\", \")}.`);\n        const c = presetCabinet(a.preset || \"base\", id);\n        if (!a.preset) {\n          c.shelves = { count: 0 };\n          c.doors = { count: 0 };\n          c.plinth = { type: \"none\" };\n          c.name = \"Cabinet\";\n        }\n        project.cabinets.push(c);\n        let notes;\n        try {\n          notes = applyCabinetFields(project, c, a);\n        } catch (e) {\n          project.cabinets = project.cabinets.filter((x) => x !== c);\n          throw e;\n        }\n        const b = buildOne(project, id);\n        return { message: `Added ${c.name} (${id}): ${size2(b.cabinet)} mm, ${b.dims.sectionInfo.length} bay${b.dims.sectionInfo.length === 1 ? \"\" : \"s\"}${notes.length ? \"; \" + notes.join(\"; \") : \"\"}${b.warnings.length ? \". Warnings: \" + b.warnings.join(\" \") : \"\"}`, cabinetId: id };\n      }\n    },\n    {\n      name: \"set_cabinet\",\n      description: \"Change a cabinet: any of the fields of add_cabinet. Only the fields given change.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\", description: \"The id from add_cabinet (may be omitted when there is exactly one cabinet).\" }, ...CABINET_FIELDS } },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const notes = applyCabinetFields(project, c, a);\n        const b = buildOne(project, c.id);\n        return { message: `${c.name || \"Cabinet\"} (${c.id}) is now ${size2(b.cabinet)} mm${notes.length ? \"; \" + notes.join(\"; \") : \"\"}${b.warnings.length ? \". Warnings: \" + b.warnings.join(\" \") : \"\"}` };\n      }\n    },\n    {\n      name: \"set_bay\",\n      description: \"What is inside ONE bay (bays are numbered 1..n, left to right): its shelves, a drawer stack at its foot, a hanging rail.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          cabinetId: { type: \"string\" },\n          bay: { type: \"integer\", description: \"Which bay, from 1 on the left.\" },\n          shelves: { type: \"integer\", description: \"Shelves in this bay (0\\u201312), evenly spaced.\" },\n          shelfHeights: { type: \"array\", items: { type: \"number\" }, description: \"Exact shelf heights in mm above the bay floor, instead of even spacing.\" },\n          drawers: { type: \"integer\", description: \"Drawers at the foot of this bay (0\\u20136). The answer gives the pitch and the cut size of every front.\" },\n          drawerHeights: { type: \"array\", items: { type: \"number\" }, description: \"Pitch of each drawer, bottom first, mm \\u2014 the step of the stack, not the cut size of the front.\" },\n          rail: { type: \"boolean\", description: \"A hanging rail across this bay.\" },\n          setback: { type: \"number\", description: \"Shelves set back from the front, mm (0\\u201360).\" },\n          fixing: { type: \"string\", enum: [\"pins\", \"fixed\"], description: \"Shelf pins or fixed shelves.\" },\n          ...FRONT_FIELDS,\n          doors: { type: \"integer\", description: \"Doors on THIS bay: 0, 1 or 2 (a door per cell of a record cabinet: doors 1 in every bay). Bay doors replace the cabinet-wide doors.\" },\n          hinge: { type: \"string\", enum: [\"left\", \"right\"], description: \"Hinge side of a single door on this bay.\" }\n        },\n        required: [\"bay\"]\n      },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const { i, n } = bayIndex(project, c, a.bay);\n        if (a.frontStyle != null || a.shaker != null) {\n          c.sections = c.sections || [];\n          while (c.sections.length < n) c.sections.push({});\n          c.sections[i] = c.sections[i] || {};\n          applyFront(a, c.sections[i]);\n        }\n        const said = [];\n        if (a.shelves != null || a.shelfHeights) {\n          c.sections = c.sections || [];\n          while (c.sections.length < n) c.sections.push({});\n          const spec = c.sections[i] = c.sections[i] || {};\n          const base = { ...normaliseCabinet(c).shelves, ...spec.shelves || {} };\n          if (a.shelfHeights) {\n            const hs = a.shelfHeights.map((h) => num22(h, [0, 3e3], \"shelf height\")).sort((x, y) => x - y);\n            spec.shelves = { ...base, count: hs.length, mode: \"custom\", positions: hs };\n            said.push(`shelves at ${hs.join(\", \")} mm`);\n          } else {\n            spec.shelves = { ...base, count: int(a.shelves, 0, LIMITS2.shelves[1], \"shelves\"), mode: \"even\", positions: [] };\n            said.push(`${spec.shelves.count} shelves`);\n          }\n        }\n        if (a.drawers != null) {\n          const want = int(a.drawers, 0, LIMITS2.drawers[1], \"drawers\");\n          const r = setDrawers(project, c.id, i, want);\n          const d = buildOne(project, c.id).dims;\n          if (want > 0 && r === null) throw new Error(`Bay ${i + 1} cannot hold a drawer: ${Math.round(d.sectionInfo[i].width)} mm wide, ${Math.round(d.innerHeight)} mm high inside.`);\n          said.push(r && r.count < want ? `${r.count} of ${want} drawers fit (${Math.round(d.innerHeight)} mm high inside)` : `${want} drawers`);\n        }\n        if (a.drawerHeights) {\n          if (!drawerStack(buildOne(project, c.id), i).length) throw new Error(`Bay ${i + 1} has no drawers to give heights to: send drawers: ${a.drawerHeights.length} in the same call.`);\n          a.drawerHeights.forEach((h, k) => {\n            const r = setDrawerHeight(project, c.id, i, k, num22(h, LIMITS2.drawerHeight, \"drawer height\"));\n            if (r) said.push(`drawer ${k + 1} pitch ${r.value} mm`);\n          });\n        }\n        if (a.doors != null || a.hinge != null) {\n          const want = a.doors == null ? void 0 : int(a.doors, 0, 2, \"doors\");\n          const ownBefore = baysWithOwnDoors(c);\n          const cabinetDoors = normaliseCabinet(c).doors.count;\n          if (want === 0 && a.hinge == null) {\n            clearBayDoors(project, c.id, i);\n            said.push(\"no doors of its own\");\n            const ownAfter = baysWithOwnDoors(c);\n            if (!ownAfter.length && cabinetDoors) said.push(`the cabinet's ${cabinetDoors} door${cabinetDoors === 1 ? \"\" : \"s\"} apply again`);\n          } else {\n            const r = setBayDoors(project, c.id, i, { count: want, hinge: a.hinge });\n            said.push(`${r.count} door${r.count === 1 ? \"\" : \"s\"}${r.count === 1 ? ` hinged ${r.hinge}` : \"\"} on this bay`);\n            if (!ownBefore.length && cabinetDoors) said.push(`the cabinet's ${cabinetDoors} door${cabinetDoors === 1 ? \"\" : \"s\"} no longer apply: every bay that needs one now asks for it`);\n          }\n        }\n        if (a.rail != null) {\n          setRail(project, c.id, i, !!a.rail);\n          said.push(a.rail ? \"a hanging rail\" : \"no rail\");\n        }\n        if (a.setback != null || a.fixing != null) {\n          const r = setShelfProps(project, c.id, i, { setback: a.setback, fixing: a.fixing });\n          if (r) said.push(`set back ${r.setback} mm, ${r.fixing}`);\n        }\n        const b = buildOne(project, c.id);\n        if (a.drawers != null || a.drawerHeights) {\n          const cut = frontsText(b, i);\n          if (cut) said.push(cut);\n        }\n        return { message: `Bay ${i + 1} of ${c.name || c.id}: ${said.join(\", \") || \"unchanged\"}${b.warnings.length ? \". Warnings: \" + b.warnings.join(\" \") : \"\"}` };\n      }\n    },\n    {\n      name: \"add_shelf\",\n      description: \"One more shelf in a bay at a given height above the bay floor.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" }, bay: { type: \"integer\" }, height: { type: \"number\", description: \"mm above the bay floor.\" } }, required: [\"height\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const { i } = bayIndex(project, c, a.bay);\n        const r = addShelfAt(project, c.id, i, num22(a.height, [0, 3e3], \"height\"), { snap: false });\n        if (!r) throw new Error(\"No room for another shelf there.\");\n        return { message: `Shelf added at ${r.value} mm in bay ${i + 1}.` };\n      }\n    },\n    {\n      name: \"add_divider\",\n      description: \"One more vertical divider at a position from the inside left, mm.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" }, position: { type: \"number\", description: \"mm from the inside of the left side.\" } }, required: [\"position\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const r = addDividerAt(project, c.id, num22(a.position, [0, 3e3], \"position\"), { snap: false });\n        if (!r) throw new Error(\"No room for another divider there.\");\n        return { message: `Divider added at ${r.value} mm.` };\n      }\n    },\n    {\n      name: \"remove_shelf\",\n      description: \"Take one shelf out of a bay. Shelves are numbered from 1 at the bottom of the bay.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" }, bay: { type: \"integer\" }, shelf: { type: \"integer\", description: \"Which shelf, 1 = lowest.\" } }, required: [\"shelf\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const { b, i } = bayIndex(project, c, a.bay);\n        const count = b.dims.sectionInfo[i].shelves.length;\n        if (!count) throw new Error(`Bay ${i + 1} has no shelves.`);\n        const row = int(a.shelf, 1, count, `shelf (bay ${i + 1} has ${count})`) - 1;\n        if (!removeShelfRow(project, c.id, i, row)) throw new Error(`Bay ${i + 1} has no shelf ${a.shelf}.`);\n        return { message: `Shelf ${a.shelf} removed from bay ${i + 1}.` };\n      }\n    },\n    {\n      name: \"remove_divider\",\n      description: \"Take one vertical divider out; the bay to its right merges into the one on its left. Dividers are numbered from 1 on the left.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" }, divider: { type: \"integer\", description: \"Which divider, 1 = leftmost.\" } }, required: [\"divider\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const count = buildOne(project, c.id).dims.dividerXs.length;\n        if (!count) throw new Error(\"This cabinet has no dividers.\");\n        const slot = int(a.divider, 1, count, `divider (this cabinet has ${count})`) - 1;\n        if (!removeDivider(project, c.id, slot)) throw new Error(`There is no divider ${a.divider}.`);\n        return { message: `Divider ${a.divider} removed; ${buildOne(project, c.id).dims.sectionInfo.length} bays now.` };\n      }\n    },\n    {\n      name: \"parts_list\",\n      description: 'The cut list as the workshop reads it: every part with its cabinet, board, finished and cut size, quantity, edging and grain. Call it to answer \"what parts / what sizes / how much board\".',\n      parameters: { type: \"object\", properties: {\n        cabinetId: { type: \"string\", description: \"Only this cabinet; omit for the whole project.\" },\n        machining: { type: \"boolean\", description: \"Also return each part's machining features \\u2014 holes, grooves and pockets in the part's own coordinates. Ask for it when the parts are going to be CUT; leave it out when you only need sizes.\" }\n      } },\n      run: (project, a) => {\n        const { rows } = partsList(project, a.cabinetId, { machining: !!a.machining });\n        const text = rows.map((r) => `${r.id} ${r.name} (${r.cabinet}) \\u2014 ${r.material} ${r.thickness} mm \\u2014 ${r.length} \\xD7 ${r.width}, cut ${r.cutLength} \\xD7 ${r.cutWidth}, \\xD7${r.qty}, edging L1 ${r.edging.L1} L2 ${r.edging.L2} W1 ${r.edging.W1} W2 ${r.edging.W2}, grain ${r.grain}`).join(\"\\n\");\n        return { message: rows.length ? text : \"No parts: the project has no cabinet.\", rows };\n      }\n    },\n    {\n      name: \"space_evenly\",\n      description: \"Put the shelves of every bay, and the dividers, back to even spacing.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" } } },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        equaliseShelves(project, c.id);\n        equaliseDividers(project, c.id);\n        return { message: \"Shelves and dividers spaced evenly.\" };\n      }\n    },\n    {\n      name: \"set_corner\",\n      description: \"At a carcass corner, which panel runs through and what holds it. corner: tl, tr, bl, br, or all.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" }, corner: { type: \"string\", enum: [...CORNERS, \"all\"] }, over: { type: \"string\", enum: [\"side\", \"top\"], description: \"side: the side covers the end of the top/bottom. top: the top/bottom covers the side.\" }, fixing: { type: \"string\", enum: JOINTS } }, required: [\"corner\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const patch = {};\n        if (a.over) patch.over = a.over;\n        if (a.fixing) patch.fixing = a.fixing;\n        if (a.corner === \"all\") setCornersAll(project, c.id, patch);\n        else if (!setCorner(project, c.id, a.corner, patch)) throw new Error(\"corner is tl, tr, bl, br or all\");\n        return { message: `Corner ${a.corner}: ${[a.over && `${a.over} runs through`, a.fixing].filter(Boolean).join(\", \") || \"unchanged\"}.` };\n      }\n    },\n    {\n      name: \"set_board\",\n      description: \"The board one KIND of panel is cut from \\u2014 shelves in plywood, say. Empty materialId means the carcass board.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" }, role: { type: \"string\", enum: [\"shelf\", \"divider\", \"back\", \"top\", \"bottom\", \"side-left\", \"side-right\", \"plinth\"] }, materialId: { type: \"string\" } }, required: [\"role\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        if (a.materialId) materialOrThrow(a.materialId, \"board\");\n        const r = setRoleMaterial(project, c.id, a.role, a.materialId || \"\");\n        if (!r) throw new Error(`${materialById(a.materialId).name} is ${materialById(a.materialId).thickness} mm: only shelves may take a board of another thickness; ${a.role} stays as it is.`);\n        return { message: `${a.role}: ${a.materialId ? materialById(a.materialId).name : \"the carcass board\"}.` };\n      }\n    },\n    {\n      name: \"remove_cabinet\",\n      description: \"Take a cabinet out of the row.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" } }, required: [\"cabinetId\"] },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        project.cabinets = project.cabinets.filter((x) => x !== c);\n        return { message: `Removed ${c.name || c.id}.` };\n      }\n    },\n    {\n      name: \"set_project\",\n      description: \"The project name and the gap between cabinets in the row.\",\n      parameters: { type: \"object\", properties: { name: { type: \"string\" }, gap: { type: \"number\", description: \"mm between neighbouring cabinets.\" } } },\n      run: (project, a) => {\n        if (a.name != null) project.name = String(a.name).slice(0, 80);\n        if (a.gap != null) project.gap = num22(a.gap, [0, 500], \"gap\");\n        return { message: `Project \"${project.name}\", gap ${project.gap} mm.` };\n      }\n    },\n    {\n      name: \"add_filler\",\n      description: \"A filler strip between a cabinet and the wall, or in a gap two cabinets leave. Give where its left edge stands (x, mm along the row) and how wide it is; a scribe is the extra left on the wall edge for the fitter to trim. It belongs to the row, so moving a cabinet leaves it where the wall is.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          x: { type: \"number\", description: \"Left edge of the filler, mm along the row.\" },\n          width: { type: \"number\", description: \"mm, 10 to 600.\" },\n          scribe: { type: \"number\", description: \"mm left over for trimming against the wall, 0 to 60 (20 is usual).\" },\n          height: { type: \"number\", description: \"mm; by default as tall as the cabinet beside it.\" },\n          materialId: { type: \"string\", description: \"Board id; by default the front board of the cabinet beside it.\" }\n        },\n        required: [\"x\", \"width\"]\n      },\n      run: (project, a) => {\n        const k = kitchenOf(project);\n        const it = { kind: \"filler\", id: nextKitchenId(k), x: num22(a.x, [-1e4, 1e4], \"x\"), width: num22(a.width, KITCHEN_LIMITS.fillerWidth, \"width\") };\n        if (a.scribe != null) it.scribe = num22(a.scribe, KITCHEN_LIMITS.scribe, \"scribe\");\n        if (a.height != null) it.height = num22(a.height, [50, 3e3], \"height\");\n        if (a.materialId) it.materialId = materialOrThrow(a.materialId, \"board\");\n        k.items.push(it);\n        return { message: `Filler ${it.width} mm at x ${it.x}${it.scribe ? `, scribed ${it.scribe} mm` : \"\"}.`, itemId: it.id };\n      }\n    },\n    {\n      name: \"add_end_panel\",\n      description: \"A finished panel covering the exposed side of a cabinet \\u2014 the end of a run. It is anchored to that cabinet, so it follows when the cabinet is moved or turned, and on a base unit it runs to the floor.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          cabinetId: { type: \"string\" },\n          side: { type: \"string\", enum: [\"left\", \"right\"], description: \"Which side of that cabinet is exposed.\" },\n          overhangFront: { type: \"number\", description: \"mm it stands past the doors, 0 to 100 (20 is usual).\" },\n          materialId: { type: \"string\", description: \"Board id; by default that cabinet's front board.\" },\n          toFloor: { type: \"boolean\", description: \"false to stop at the carcass instead of running to the floor.\" }\n        },\n        required: [\"cabinetId\", \"side\"]\n      },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        const k = kitchenOf(project);\n        const it = { kind: \"end-panel\", id: nextKitchenId(k), cabinetId: c.id, side: a.side };\n        if (a.overhangFront != null) it.overhangFront = num22(a.overhangFront, KITCHEN_LIMITS.panelOverhang, \"overhangFront\");\n        if (a.materialId) it.materialId = materialOrThrow(a.materialId, \"board\");\n        if (a.toFloor != null) it.toFloor = !!a.toFloor;\n        k.items.push(it);\n        return { message: `End panel on the ${it.side} of ${c.name || c.id}.`, itemId: it.id };\n      }\n    },\n    {\n      name: \"set_plinth_run\",\n      description: \"One plinth board across the neighbouring cabinets instead of a piece each: welded where they carry their own plinth, and cut in front of the legs (notched where a leg stands) where they stand on legs. It stops at a turn, like a worktop.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          on: { type: \"boolean\" },\n          setback: { type: \"number\", description: \"mm the board sits back from the carcass front, 0 to 150 (30 is usual).\" },\n          height: { type: \"number\", description: \"mm; by default the height the cabinets already stand at.\" }\n        }\n      },\n      run: (project, a) => {\n        const k = kitchenOf(project);\n        k.plinthRun = a.on === void 0 ? true : !!a.on;\n        if (a.setback != null) k.plinthSetback = num22(a.setback, KITCHEN_LIMITS.plinthSetback, \"setback\");\n        if (a.height != null) k.plinthHeight = num22(a.height, KITCHEN_LIMITS.plinthHeight, \"height\");\n        return { message: k.plinthRun ? `One plinth over each run, set back ${k.plinthSetback} mm.` : \"Each cabinet keeps its own plinth.\" };\n      }\n    },\n    {\n      name: \"add_cornice\",\n      description: \"A strip over the wall units (cornice) or under them (light rail), cut to the run. Needs at least one cabinet standing above the floor.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          kind: { type: \"string\", enum: [\"cornice\", \"light-rail\"] },\n          height: { type: \"number\", description: \"mm tall, 20 to 200 (60 is usual).\" },\n          projection: { type: \"number\", description: \"mm it stands proud of the wall unit front, 0 to 120.\" },\n          on: { type: \"boolean\", description: \"false takes it away.\" }\n        },\n        required: [\"kind\"]\n      },\n      run: (project, a) => {\n        const k = kitchenOf(project);\n        const key = a.kind === \"light-rail\" ? \"lightRail\" : \"cornice\";\n        if (a.on === false) {\n          k[key] = null;\n          return { message: `${a.kind} removed.` };\n        }\n        k[key] = { height: a.height == null ? 60 : num22(a.height, KITCHEN_LIMITS.corniceHeight, \"height\"), projection: a.projection == null ? 0 : num22(a.projection, KITCHEN_LIMITS.projection, \"projection\") };\n        const wall = buildAll(project).filter((b) => Math.min(...b.panels.map((pn) => pn.box.min.y)) > 300);\n        return { message: `${a.kind} ${k[key].height} mm over ${wall.length} wall unit${wall.length === 1 ? \"\" : \"s\"}${wall.length ? \"\" : \" \\u2014 there is none yet, so nothing is cut\"}.` };\n      }\n    },\n    {\n      name: \"set_position\",\n      description: \"Stand a cabinet somewhere of its own instead of next in the row: x along the row (the left face), y above the floor (a wall unit at 1400), z back from the front, rotation for an L-shaped run. Magnets are applied, so a value near a neighbour lands exactly against it. `row: true` puts it back in the row.\",\n      parameters: {\n        type: \"object\",\n        properties: {\n          cabinetId: { type: \"string\" },\n          x: { type: \"number\", description: \"Left face of the carcass, mm from the origin.\" },\n          y: { type: \"number\", description: \"Underside above the floor, mm. A wall unit over a 720 base with a 38 worktop sits at about 1400.\" },\n          z: { type: \"number\", description: \"How far back it stands, mm (0 = the front line of the row).\" },\n          rotation: { type: \"integer\", enum: [0, 90, 180, 270], description: \"A QUARTER turn only: 0 faces the front, 90 faces right, 180 faces back, 270 faces left. An L-shaped kitchen is a straight run plus cabinets turned 90 or 270 into the second wall. Any other angle is refused \\u2014 the model is built from square boxes.\" },\n          row: { type: \"boolean\", description: \"true: forget the hand-placed position and stand next in the row again.\" }\n        }\n      },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        if (a.row) {\n          delete c.position;\n          return { message: `${c.name || c.id} stands in the row again.` };\n        }\n        const now = positionOf(project, c.id) || { x: 0, y: 0, z: 0, rotation: 0 };\n        const wanted2 = {\n          x: a.x == null ? now.x : num22(a.x, [-2e4, 2e4], \"x\"),\n          y: a.y == null ? now.y : num22(a.y, [0, 4e3], \"y\"),\n          z: a.z == null ? now.z : num22(a.z, [-5e3, 5e3], \"z\")\n        };\n        if (a.rotation != null) setCabinetPosition(project, c.id, { ...now, rotation: a.rotation });\n        const m = magnetFor(project, c.id, wanted2, { stack: a.y == null });\n        setCabinetPosition(project, c.id, m);\n        const b = buildOne(project, c.id);\n        const turn = b.dims.rotation ? `, turned ${b.dims.rotation}\\xB0 (facing ${FACING[b.dims.rotation / 90]})` : \"\";\n        return { message: `${c.name || c.id} stands at x ${m.x}, ${m.y} mm above the floor, ${m.z} back${turn}${m.snapped ? ` (${m.snapped})` : \"\"}${b.warnings.length ? `. Warnings: ${b.warnings.join(\" \")}` : \"\"}` };\n      }\n    },\n    {\n      name: \"line_up\",\n      description: \"Every cabinet back into one row, left to right, forgetting hand-placed positions.\",\n      parameters: { type: \"object\", properties: {} },\n      run: (project) => {\n        const r = clearPositions(project);\n        return { message: r.cleared ? `${r.cleared} cabinet${r.cleared === 1 ? \"\" : \"s\"} back in the row.` : \"They were all in the row already.\" };\n      }\n    },\n    {\n      name: \"check_records\",\n      description: \"For a record cabinet: per bay the clear width, the clear height of every row, how many 12-inch LPs fit, and a warning for any cell under 330 \\xD7 330 mm clear or an inside depth under 340. Assumes a loose row at 5.5 mm per record.\",\n      parameters: { type: \"object\", properties: { cabinetId: { type: \"string\" } } },\n      run: (project, a) => {\n        const c = cabinetOf2(project, a.cabinetId);\n        return recordCells(buildOne(project, c.id));\n      }\n    },\n    {\n      name: \"describe\",\n      description: \"What the project holds now: every cabinet, its bays, the parts count, the hardware, any warnings. Call it last to tell the person what was built.\",\n      parameters: { type: \"object\", properties: {} },\n      run: (project) => summary(project)\n    }\n  ];\n  var byName = new Map(TOOLS.map((t) => [t.name, t]));\n  function kitchenOf(project) {\n    project.kitchen = normaliseKitchen(project.kitchen);\n    return project.kitchen;\n  }\n  var nextKitchenId = (k) => `k${Math.max(0, ...k.items.map((i) => Number(String(i.id).replace(/\\D/g, \"\")) || 0)) + 1}`;\n  function builtProject(project) {\n    const builds = buildAll(project);\n    const welded = mergeWorktops(builds, 100) || [];\n    markWorktopJoints(builds, welded.splits);\n    const plinthRuns2 = normaliseKitchen(project.kitchen).plinthRun ? mergePlinths(builds, 100) : [];\n    const kitchen = buildKitchen(project, builds);\n    if (kitchen) builds.push(kitchen);\n    const { parts } = partsFromBuilds(builds, { deductEdging: project.parts.deductEdging, oversize: project.parts.oversize, overrides: project.parts.overrides, customParts: project.parts.custom });\n    return { builds, welded, parts, kitchen, plinthRuns: plinthRuns2 };\n  }\n  function partsList(project, cabinetId, opts = {}) {\n    const { parts } = builtProject(project);\n    const withMachining = !!(opts && opts.machining);\n    const rows = parts.filter((p) => !cabinetId || p.cabinetId === cabinetId).map((p) => ({\n      id: p.id,\n      name: p.name,\n      cabinet: p.cabinet || p.cabinetId,\n      material: p.material,\n      thickness: p.thickness,\n      length: p.length,\n      width: p.width,\n      cutLength: p.cutLength,\n      cutWidth: p.cutWidth,\n      qty: p.qty,\n      edging: { L1: p.edging.L1, L2: p.edging.L2, W1: p.edging.W1, W2: p.edging.W2 },\n      grain: p.grain,\n      ...withMachining ? { features: p.features || [] } : {},\n      // \u041E\u0411\u0420\u0410\u0411\u041E\u0422\u041A\u0410 \u0421\u0422\u041E\u0418\u0422 \u041D\u0410 \u0417\u0410\u0413\u041E\u0422\u041E\u0412\u041A\u0415: \u0443\u0433\u043E\u043B \u0437\u0430\u0433\u043E\u0442\u043E\u0432\u043A\u0438 \u0435\u0434\u0435\u0442 \u0441 \u043A\u0430\u0436\u0434\u043E\u0439 \u0434\u0435\u0442\u0430\u043B\u044C\u044E, \u0430 \u043D\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0441 \u0448\u0435\u0439\u043A\u0435\u0440\u043E\u043C \u2014\n      // \u0438\u043D\u0430\u0447\u0435 \u0447\u0430\u0448\u043A\u0438 \u043F\u0435\u0442\u0435\u043B\u044C \u0434\u0432\u0435\u0440\u0438 \u0441 \u043A\u0440\u043E\u043C\u043A\u043E\u0439 2 \u043C\u043C \u0443\u0435\u0437\u0436\u0430\u043B\u0438 \u0432 \u043A\u0430\u043B\u044C\u043A\u0443\u043B\u044F\u0442\u043E\u0440\u0435 \u043D\u0430 2 \u043C\u043C (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 1790943069455).\n      ...withMachining ? { cutOrigin: p.cutOrigin } : {},\n      // \u0417\u0415\u0420\u041A\u0410\u041B\u042C\u041D\u0410\u042F \u041F\u0410\u0420\u0410 \u2014 \u043E\u0431\u0435 \u043F\u043E\u043B\u043E\u0432\u0438\u043D\u044B \u0441\u043E \u0441\u0432\u043E\u0435\u0439 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u043E\u0439. \u0421\u0442\u0440\u043E\u043A\u0430 \u0442\u0435\u043A\u0441\u0442\u0430 \u043E\u0434\u043D\u0430 (\u043F\u0438\u043B\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E), \u0430\n      // \u0441\u0442\u0430\u043D\u043A\u0443 \u043D\u0443\u0436\u043D\u044B \u0434\u0432\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B: \u0431\u0435\u0437 \u044D\u0442\u043E\u0433\u043E \u044F\u0434\u0440\u043E \u043A\u043B\u0430\u043B\u043E \u043F\u0440\u0430\u0432\u043E\u0439 \u0431\u043E\u043A\u043E\u0432\u0438\u043D\u0435 \u043E\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044F \u043B\u0435\u0432\u043E\u0439.\n      ...withMachining && p.variants ? { variants: lineVariants(p).map((v) => ({\n        code: v.variantCode,\n        label: v.variant,\n        qty: v.qty,\n        edging: { ...v.edging },\n        features: v.features || [],\n        cutLength: v.cutLength,\n        cutWidth: v.cutWidth,\n        cutOrigin: v.cutOrigin\n      })) } : {}\n    }));\n    return { rows };\n  }\n  function summary(project) {\n    const { builds, welded, parts, kitchen, plinthRuns: plinthRuns2 } = builtProject(project);\n    const totals = partsTotals(parts);\n    const hardware = hardwareList(builds, parts);\n    const cabinets = builds.filter((b) => !b.kitchen).map((b) => ({\n      id: b.cabinet.id,\n      name: b.cabinet.name || \"Cabinet\",\n      size: size2(b.cabinet),\n      material: materialById(b.cabinet.materialId).name,\n      bays: b.dims.sectionInfo.map((s, i) => ({ bay: i + 1, width: Math.round(s.width), shelves: s.shelves.length, drawers: s.drawers.length, rail: !!s.rail, doors: b.cabinet.sections[i] && b.cabinet.sections[i].doors ? b.cabinet.sections[i].doors.count : 0, fronts: frontSizes(b, i) })),\n      doors: b.cabinet.doors.count,\n      warnings: b.warnings,\n      // What stands on the wall, not what the carcass measures: a worktop raises it.\n      overall: { width: Math.round(b.dims.width), height: Math.round(b.dims.height), depth: Math.round(b.dims.depth) },\n      worktop: !!(b.cabinet.worktop && b.cabinet.worktop.on),\n      doorHeights: [...new Set(b.panels.filter((p) => p.role === \"door\").map((p) => Math.round(p.box.max.y - p.box.min.y)))].sort((x, y) => y - x),\n      at: { x: Math.round(b.dims.offsetX || 0), y: Math.round(b.dims.offsetY || 0), z: Math.round(b.dims.offsetZ || 0), rotation: b.dims.rotation || 0, placed: !!b.cabinet.position }\n    }));\n    const lines = cabinets.map((c) => `${c.name} (${c.id}): ${c.size} mm${c.worktop ? ` (${c.overall.height} mm high with the worktop)` : \"\"}, ${c.material};${c.doorHeights.length > 1 ? ` doors of two heights (${c.doorHeights.join(\" and \")} mm: one clears the drawers below it);` : \"\"} ${c.bays.map((s) => `bay ${s.bay} ${s.width} mm: ${s.shelves} shelves${s.drawers ? `, ${s.drawers} drawers (${s.fronts.map((f) => f.cut).join(\"/\")} cut, pitch ${s.fronts.map((f) => f.pitch).join(\"/\")})` : \"\"}${s.rail ? \", rail\" : \"\"}${s.doors ? `, ${s.doors} door${s.doors === 1 ? \"\" : \"s\"}` : \"\"}`).join(\"; \")}${c.doors && !c.bays.some((s) => s.doors) ? `; ${c.doors} door${c.doors === 1 ? \"\" : \"s\"}` : \"\"}${c.at.placed ? `; stands at x ${c.at.x}${c.at.y ? `, ${c.at.y} mm above the floor` : \"\"}${c.at.z ? `, ${c.at.z} mm back` : \"\"}` : \"\"}${c.at.rotation ? `; turned ${c.at.rotation}\\xB0, facing ${FACING[c.at.rotation / 90]}` : \"\"}${c.warnings.length ? `; WARNINGS: ${c.warnings.join(\" \")}` : \"\"}`);\n    const worktops = builds.flatMap((b) => b.panels.filter((p) => p.role === \"worktop\").map((p) => {\n      const run = welded.find((w) => w.key === p.key);\n      const L = Math.round(Math.max(p.box.max.x - p.box.min.x, p.box.max.z - p.box.min.z));\n      const Wd = Math.round(Math.min(p.box.max.x - p.box.min.x, p.box.max.z - p.box.min.z));\n      return { length: L, width: Wd, material: p.mat.name, cabinets: run ? run.cabinets : 1, over: run ? `${run.cabinets} cabinets from ${b.cabinet.id}` : b.cabinet.id };\n    }));\n    const splits = (welded.splits || []).map((sp) => `worktop split before ${(builds[sp.atCabinet] || {}).cabinet ? builds[sp.atCabinet].cabinet.id : `cabinet ${sp.atCabinet + 1}`}: a ${sp.sheetLength} mm board runs out`);\n    const worktopLine = worktops.length ? `\nWorktops: ${worktops.map((w) => `${w.length} \\xD7 ${w.width} ${w.material} over ${w.over}`).join(\"; \")}${splits.length ? `; ${splits.join(\"; \")}` : \"\"}` : \"\";\n    const recordNotes = builds.filter((b) => looksLikeRecords(b.cabinet)).map((b) => {\n      const r = recordCells(b);\n      return `${b.cabinet.name || b.cabinet.id}: ${r.message}`;\n    });\n    const recordLine = recordNotes.length ? `\nRecords: ${recordNotes.join(\"\\n\")}` : \"\";\n    const placedAny = cabinets.some((c) => c.at.placed);\n    const rowLine = cabinets.length > 1 || cabinets.some((c) => /\\b(wall|\u043D\u0430\u0432\u0435\u0441)/i.test(c.name)) ? `\nCabinets stand in one row on the floor, left to right, unless they are given a place of their own with set_position (x along the row, y above the floor, z back)${placedAny ? '; the ones above that say \"stands at\" were placed that way' : \", so a wall unit must be lifted with set_position to hang over a base unit\"}.` : \"\";\n    const kitchenNotes = (kitchen && kitchen.notes || []).concat((plinthRuns2 || []).map((r) => `Plinth ${r.length} mm welded over ${r.cabinets} cabinets`));\n    const kitchenLine = kitchenNotes.length ? `\nKitchen: ${kitchenNotes.join(\"; \")}` : \"\";\n    const kitchenWarnings = kitchen && kitchen.warnings || [];\n    const message = `${project.name}: ${cabinets.length} cabinet${cabinets.length === 1 ? \"\" : \"s\"}, ${totals.count} parts in ${totals.lines} lines, ${totals.areaM2} m\\xB2 of board.\n${lines.join(\"\\n\")}${worktopLine}${kitchenLine}${recordLine}${rowLine}${hardware.length ? `\nHardware: ${hardware.map((h) => `${h.qty} \\xD7 ${h.label}`).join(\", \")}` : \"\"}`;\n    return { message, cabinets, rows: partsList(project).rows, worktops, worktopSplits: splits, kitchen: kitchenNotes, records: recordNotes, oneRow: !!rowLine, parts: totals.count, lines: totals.lines, areaM2: totals.areaM2, hardware, warnings: cabinets.flatMap((c) => c.warnings.map((w) => `${c.name}: ${w}`)).concat(kitchenWarnings) };\n  }\n  var WORKSHOP_SCHEMA = \"uniboards.construction/1\";\n  var PROJECT_KEYS = /* @__PURE__ */ new Set([\"name\", \"gap\", \"parts\", \"nesting\", \"machine\", \"kitchen\"]);\n  var CABINET_KEYS = /* @__PURE__ */ new Set([...Object.keys(DEFAULT_CABINET), \"id\", \"cutouts\", \"manufacturingPending\"]);\n  var SIZE = { w: \"width\", h: \"height\", d: \"depth\" };\n  var own = (o, k) => Object.prototype.hasOwnProperty.call(o, k);\n  var object = (o) => !!o && typeof o === \"object\" && !Array.isArray(o);\n  var fail = (why) => {\n    throw new TypeError(\"Workshop document: \" + why);\n  };\n  function json(value, depth = 0) {\n    if (depth > 24) fail(\"nesting is too deep\");\n    if (value === null || typeof value === \"boolean\") return value;\n    if (typeof value === \"string\") {\n      if (value.length > 1e4) fail(\"text is too long\");\n      return value;\n    }\n    if (typeof value === \"number\") {\n      if (!Number.isFinite(value)) fail(\"non-finite number\");\n      return value;\n    }\n    if (Array.isArray(value)) {\n      if (value.length > 2e3) fail(\"array is too long\");\n      return value.map((v) => json(v, depth + 1));\n    }\n    if (!object(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) fail(\"plain JSON required\");\n    const out = {};\n    for (const [k, v] of Object.entries(value)) {\n      if ([\"__proto__\", \"constructor\", \"prototype\"].includes(k)) fail(\"invalid field\");\n      out[k] = json(v, depth + 1);\n    }\n    return out;\n  }\n  function keys(value, accepted, label) {\n    if (!object(value)) fail(label + \" must be an object\");\n    for (const k of Object.keys(value)) if (!accepted.has(k)) fail(\"unsupported \" + label + \" field: \" + k);\n  }\n  function dimension(value, key) {\n    const [lo, hi] = LIMITS2[key];\n    if (typeof value !== \"number\" || !Number.isFinite(value) || value < lo || value > hi) fail(key + \" is outside the supported range\");\n    return value;\n  }\n  function material(id) {\n    if (typeof id !== \"string\" || materialById(id).id !== id) fail(\"material is not available: \" + String(id));\n  }\n  function cabinet(c) {\n    keys(c, CABINET_KEYS, \"cabinet\");\n    if (typeof c.id !== \"string\" || !c.id || c.id.length > 100) fail(\"a stable cabinet id is required\");\n    for (const k of Object.values(SIZE)) if (own(c, k)) dimension(c[k], k);\n    const n = normaliseCabinet(c);\n    for (const k of [\"materialId\", \"backMaterialId\"]) material(n[k]);\n    if (n.frontMaterialId) material(n.frontMaterialId);\n    if (n.drawer.bottomId) material(n.drawer.bottomId);\n    if (n.worktop.on) material(n.worktop.materialId);\n    for (const id of Object.values(n.materials)) if (id) material(id);\n    if (c.position != null) {\n      if (!object(c.position) || ![\"x\", \"y\", \"z\", \"rotation\"].every((k) => typeof c.position[k] === \"number\" && Number.isFinite(c.position[k]))) fail(\"explicit finite placement required\");\n      if (![0, 90, 180, 270].includes(c.position.rotation) || c.position.y < 0) fail(\"unsupported placement\");\n    }\n    return c;\n  }\n  function workshopScene(project) {\n    const p = json(project);\n    if (!object(p) || !Array.isArray(p.cabinets) || p.cabinets.length > 200) fail(\"at most 200 cabinets required\");\n    const { cabinets, ...settings } = p;\n    keys(settings, PROJECT_KEYS, \"project\");\n    const ids = /* @__PURE__ */ new Set();\n    const units = cabinets.map((raw) => {\n      const c = cabinet(raw);\n      if (ids.has(c.id)) fail(\"duplicate cabinet id: \" + c.id);\n      ids.add(c.id);\n      const { id, width, height, depth, ...construction } = c;\n      const specified = Object.values(SIZE).filter((k) => own(c, k));\n      return {\n        id,\n        type: \"workshop\",\n        w: width != null ? width : DEFAULT_CABINET.width,\n        h: height != null ? height : DEFAULT_CABINET.height,\n        d: depth != null ? depth : DEFAULT_CABINET.depth,\n        construction,\n        specified\n      };\n    });\n    return { v: 1, units, workshop: { schema: WORKSHOP_SCHEMA, settings } };\n  }\n  function workshopProject(scene) {\n    const s = json(scene);\n    keys(s, /* @__PURE__ */ new Set([\"v\", \"units\", \"workshop\"]), \"scene\");\n    if (s.v !== 1 || !object(s.workshop) || s.workshop.schema !== WORKSHOP_SCHEMA) fail(\"unsupported schema\");\n    keys(s.workshop, /* @__PURE__ */ new Set([\"schema\", \"settings\"]), \"workshop\");\n    keys(s.workshop.settings, PROJECT_KEYS, \"project\");\n    if (!Array.isArray(s.units) || s.units.length > 200) fail(\"at most 200 units required\");\n    const ids = /* @__PURE__ */ new Set();\n    const cabinets = s.units.map((u) => {\n      keys(u, /* @__PURE__ */ new Set([\"id\", \"type\", \"w\", \"h\", \"d\", \"construction\", \"specified\"]), \"unit\");\n      if (u.type !== \"workshop\") fail(\"mixed shop/workshop scenes are not supported yet\");\n      if (!Array.isArray(u.specified) || u.specified.some((k) => !Object.values(SIZE).includes(k))) fail(\"invalid dimension presence\");\n      if (!object(u.construction) || [\"id\", ...Object.values(SIZE)].some((k) => own(u.construction, k))) fail(\"construction cannot shadow identity or dimensions\");\n      const c = { id: u.id, ...u.construction };\n      for (const [k, native] of Object.entries(SIZE)) {\n        dimension(u[k], native);\n        if (u.specified.includes(native) || u[k] !== DEFAULT_CABINET[native]) c[native] = u[k];\n      }\n      cabinet(c);\n      if (ids.has(c.id)) fail(\"duplicate cabinet id: \" + c.id);\n      ids.add(c.id);\n      return c;\n    });\n    return { ...s.workshop.settings, cabinets };\n  }\n  function buildWorkshopScene(scene) {\n    const project = workshopProject(scene);\n    return builtProject({ ...project, parts: project.parts || { deductEdging: true, oversize: 0, overrides: {}, custom: [] } });\n  }\n  function resizeWorkshopScene(scene, id, axis, value) {\n    if (!own(SIZE, axis)) fail(\"unknown size axis\");\n    dimension(value, SIZE[axis]);\n    const project = workshopProject(scene);\n    if (!project.cabinets.some((c) => c.id === id)) fail(\"cabinet not found\");\n    resizeCabinet(project, id, SIZE[axis], value, { snap: false });\n    return workshopScene(project);\n  }\n\n  // v2/src/model/workshop-view.js\n  var AXES = [\"x\", \"y\", \"z\"];\n  var COORD = [[\"x0\", \"x1\"], [\"y0\", \"y1\"], [\"z0\", \"z1\"]];\n  var FRONT = /^(door|drawer-front)$/;\n  function workshopPanelPreview(document2, cabinetId) {\n    const project = workshopProject(document2);\n    if (project.cabinets.length !== 1 || project.cabinets[0].id !== cabinetId)\n      throw new Error(\"The preview accepts one named cabinet at a time.\");\n    if (project.parts && ((project.parts.custom || []).length || Object.keys(project.parts.overrides || {}).length) || project.kitchen)\n      throw new Error(\"Custom parts, row overrides and kitchen-run parts need their own view before this preview can open them.\");\n    const built = buildWorkshopScene(document2);\n    if (built.builds.length !== 1) throw new Error(\"Unexpected additional construction parts.\");\n    const build3 = built.builds[0], ids = /* @__PURE__ */ new Set();\n    const panels = build3.panels.map((panel) => {\n      if (panel.contour || panel.outline || (panel.features || []).some((f) => f.type === \"cutout\" || (f.type === \"pocket\" || f.type === \"path\") && f.through))\n        throw new Error(\"A shaped panel must not be shown as a rectangular board.\");\n      if (!panel.key || ids.has(panel.key)) throw new Error(\"Stable unique panel keys required.\");\n      ids.add(panel.key);\n      const box3 = {};\n      AXES.forEach((axis, i) => {\n        const offset = axis === \"y\" ? -LEG_H : 0;\n        const lo = panel.box.min[axis], hi = panel.box.max[axis];\n        if (!Number.isFinite(lo) || !Number.isFinite(hi) || hi <= lo) throw new Error(\"Invalid physical panel bounds.\");\n        box3[COORD[i][0]] = lo + offset;\n        box3[COORD[i][1]] = hi + offset;\n      });\n      if (!/^#[0-9a-f]{6}$/i.test(panel.mat.color)) throw new Error(\"An explicit material colour is required.\");\n      const rgb4 = [1, 3, 5].map((i) => parseInt(panel.mat.color.slice(i, i + 2), 16) / 255);\n      return {\n        pid: cabinetId + \":workshop:\" + panel.key,\n        nativeKey: panel.key,\n        unitId: cabinetId,\n        name: panel.name,\n        role: panel.role,\n        front: FRONT.test(panel.role),\n        box: box3,\n        material: { id: panel.mat.id, name: panel.mat.name, thickness: panel.mat.thickness, rgb: rgb4 },\n        machiningElements: panel.features.length,\n        pendingElements: panel.features.filter((f) => f.pending).length\n      };\n    });\n    return {\n      cabinetId,\n      readOnly: true,\n      coordinateFrame: \"Cabinet Lab world; native floor shifted by -150 mm\",\n      panels,\n      warnings: [...build3.warnings, \"Panel envelopes only: drilling and blind grooves are retained in the construction document, not sculpted into this preview.\"]\n    };\n  }\n\n  // v2/src/model/workshop-runtime.js\n  var copy = (v) => JSON.parse(JSON.stringify(v));\n  var canonicalUnit = (u) => ({ id: u.id, type: \"workshop\", w: u.w, h: u.h, d: u.d, construction: copy(u.construction), specified: copy(u.specified) });\n  function workshopDocumentOf(scene) {\n    if (!scene.workshop) return null;\n    const document2 = { v: 1, units: scene.units.map(canonicalUnit), workshop: copy(scene.workshop) };\n    workshopProject(document2);\n    return document2;\n  }\n  function workshopRuntime(document2) {\n    const d = workshopScene(workshopProject(document2)), u = d.units[0];\n    workshopPanelPreview(d, u == null ? void 0 : u.id);\n    if (u.construction.position) throw new Error(\"Placed workshop cabinets need their positioning adapter before opening.\");\n    return { workshop: d.workshop, units: [{\n      ...u,\n      workshopSettings: d.workshop.settings,\n      family: \"workshop\",\n      x: 0,\n      y: -LEG_H,\n      z: 0,\n      rot: 0,\n      door: false,\n      doors: 0,\n      doorOpen: false,\n      finish: \"white\",\n      doorFinish: \"white\",\n      frontFinish: \"white\",\n      run: \"main\"\n    }] };\n  }\n  var cache = /* @__PURE__ */ new WeakMap();\n  function workshopRuntimeView(u) {\n    const document2 = { v: 1, units: [canonicalUnit(u)], workshop: { schema: WORKSHOP_SCHEMA, settings: u.workshopSettings } };\n    const key = JSON.stringify(document2), old = cache.get(u);\n    if (old && old.key === key) return old.view;\n    const view = workshopPanelPreview(document2, u.id);\n    cache.set(u, { key, view });\n    return view;\n  }\n  function workshopRuntimeParts(u) {\n    return workshopRuntimeView(u).panels.map((p) => ({\n      pid: p.pid,\n      unitId: u.id,\n      name: p.name,\n      kind: \"workshop\",\n      label: \"Workshop panel\",\n      nativeKey: p.nativeKey,\n      material: p.material.id,\n      materialName: p.material.name,\n      ex: [0, 0, 0],\n      local: { ...p.box, y0: p.box.y0 + LEG_H, y1: p.box.y1 + LEG_H },\n      box: { ...p.box },\n      mm: { w: p.box.x1 - p.box.x0, h: p.box.y1 - p.box.y0, d: p.box.z1 - p.box.z0 },\n      thickness: p.material.thickness\n    }));\n  }\n\n  // v2/src/model/egger-decors.js\n  var DECOR_CDN = \"https://cdn.shopify.com/s/files/1/0541/7071/4281/\";\n  var DECOR_GROUPS = [\n    [\"whites\", \"Whites\"],\n    [\"unicolours\", \"Colours\"],\n    [\"woods\", \"Woods\"],\n    [\"stone\", \"Stone & concrete\"],\n    [\"textiles\", \"Textiles\"],\n    [\"metallics\", \"Metallics\"]\n  ];\n  var DECOR_SURFACES = {\n    /* SATIN DEFAULTS (11.10.2026, task 1791531588544; owner: \u00ABapply this to all dark decors ... each board has sheen\u00BB): grain 0.84 -> 0.72,\n       smooth 0.82 -> 0.72, structured 0.86 -> 0.74. Measured on the stand: a black U999 ST7 door went from mean 7 (all of it crushed)\n       to 15-16 with a sheen across it, dark H3043 ST12 22 -> 28-30, while light and white decors are unchanged by the roughness (only\n       by the light). The DISTINCTIONS stay: PerfectSense matt lacquer the most matt (0.92), PerfectSense gloss shiny (0.18), structured\n       a little more matt than smooth. ART-DIRECTED conservative defaults, NOT EGGER gloss measurements (none on file) - replace\n       per finish code when they exist. */\n    grain: { name: \"wood-grain emboss\", roughness: 0.72, relief: true, approx: \"relief from Egger's H1385 ST40 oak scan, depth approximate\" },\n    smooth: { name: \"smooth matt\", roughness: 0.72, relief: false, approx: \"\" },\n    lacquer: { name: \"PerfectSense matt lacquer\", roughness: 0.92, relief: false, approx: \"\" },\n    gloss: { name: \"PerfectSense gloss\", roughness: 0.18, relief: false, approx: \"\" },\n    structured: { name: \"structured surface\", roughness: 0.74, relief: false, approx: \"surface relief not modelled\" }\n  };\n  var ROWS = [\n    [\"f037-st76\", \"F037\", \"ST76\", \"Taormina Travertine\", \"stone\", \"texture\", \"dcc9b7\", \"files/original_44c85bed-cf2e-4a4d-9929-a1b34e3871b3.jpg?v=1784329486\", \"v\", 1300, 2800, \"board\", \"15460537139585\", \"mfc-egger-f037-st76-taormina-travertine\", [[18, \"55929321456001\"]], [], \"structured\", [\"f037-st76.8e1e13b13a.jpg\", \"ddcab7\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6957c5a071733591-F037-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/709234bb9208c971-F037-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f128-pa\", \"F128\", \"PA\", \"Black Ambiance Granite\", \"stone\", \"texture\", \"4a4947\", \"files/original.jpg?v=1784122359\", \"none\", 1300, 2800, \"board\", \"15455990481281\", \"mfc-egger-f128-pa-black-ambiance-granite-2\", [[19, \"55919680356737\"]], [], \"structured\", [\"f128-pa.0d175aa0e0.jpg\", \"494745\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3eb1dd79817e29f8-F128-PA-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/09a7430ba3189f94-F128-PA-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f129-pa\", \"F129\", \"PA\", \"Beige Ambiance Granite\", \"stone\", \"texture\", \"dfd3c2\", \"files/original_10ec8fc8-0d7c-4b7e-97fb-4a87c99aac45.jpg?v=1784368541\", \"none\", 1300, 2800, \"board\", \"15460742332801\", \"mfc-egger-f129-pa-beige-ambiance-granite\", [[19, \"55930548814209\"]], [], \"structured\", [\"f129-pa.8b7bb96f3a.jpg\", \"dfd3c2\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a36c4b2db66f9e43-F129-PA-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bf972aacfab29fd3-F129-PA-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f186-st9\", \"F186\", \"ST9\", \"Light Grey Chicago Concrete\", \"stone\", \"texture\", \"9a958e\", \"files/F186_9_881x513_a2055bc7-65bb-4001-bc70-22157f0440eb.jpg?v=1694110610\", \"none\", 900, 525, \"assumed\", \"7783312785577\", \"mfc-egger-f186-chicago-grey\", [[8, \"43736011636905\"], [18, \"43736011538601\"]], [], \"smooth\", [\"f186-st9.797e2830cb.jpg\", \"9b9694\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0ce092505ea67fae-F186-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/9007fda694dde0bb-F186-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f187-st9\", \"F187\", \"ST9\", \"Dark Grey Chicago Concrete\", \"stone\", \"texture\", \"5d5346\", \"files/EggerF187ST9.jpg?v=1709562808\", \"none\", 900, 675, \"assumed\", \"7929897255081\", \"mfc-egger-f187-st9-dark-grey-chicago-concrete\", [[18, \"43736019533993\"]], [], \"smooth\", [\"f187-st9.2e03348a10.jpg\", \"605549\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/31b81a55afa91e4e-F187-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/15bec56e58091b22-F187-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f206-st9\", \"F206\", \"ST9\", \"Black Pietra Grigia\", \"stone\", \"texture\", \"373433\", \"files/2_9ce8e1a3-a01b-4f91-b4bc-bb42190ed87c.jpg?v=1707841270\", \"none\", 900, 525, \"assumed\", \"7909606424745\", \"mfc-egger-f206-st9-black-pietra-grigia\", [[18, \"43736014520489\"]], [], \"smooth\", [\"f206-st9.5c9683091d.jpg\", \"322e2f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ea3c802f5e2d02e1-F206-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/247425fed26d8ff2-F206-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f235-st76\", \"F235\", \"ST76\", \"Scivaro Slate\", \"stone\", \"texture\", \"3a3839\", \"files/EggerF235ST76.webp?v=1709726434\", \"none\", 900, 675, \"assumed\", \"7932831596713\", \"mfc-egger-f235-st76-scivaro-slate\", [[18, \"43736026939561\"]], [], \"structured\", [\"f235-st76.261562262d.jpg\", \"464345\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/2e32e67b14aab079-F235-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/af2e88036edd610d-F235-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f237-st76\", \"F237\", \"ST76\", \"Cupria Slate\", \"stone\", \"texture\", \"292423\", \"files/EggerF237ST76.webp?v=1709727088\", \"none\", 900, 675, \"assumed\", \"7932845523113\", \"mfc-egger-f237-st76-cupria-slate\", [[18, \"43736027103401\"]], [], \"structured\", [\"f237-st76.adc769a553.jpg\", \"322b28\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/7a33279af348f326-F237-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/53f619df05858a31-F237-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f243-st76\", \"F243\", \"ST76\", \"Light Grey Candela Marble\", \"stone\", \"texture\", \"a7a39e\", \"files/F243st76.jpg?v=1708700019\", \"none\", 900, 675, \"assumed\", \"7919582871721\", \"mfc-egger-f243-st76-light-grey-candela-marble\", [[18, \"43736016683177\"]], [], \"structured\", [\"f243-st76.ff588f85d0.jpg\", \"aaa4a0\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/1b6e097c56fc3dfd-F243-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c14cc26121ca16f9-F243-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f244-st76\", \"F244\", \"ST76\", \"Anthracite Candela Marble\", \"stone\", \"texture\", \"535251\", \"files/EggerF244ST76.webp?v=1709710497\", \"none\", 900, 675, \"assumed\", \"7932676833449\", \"mfc-egger-f244-st76-anthracite-candela-marble\", [[18, \"43736026349737\"]], [], \"structured\", [\"f244-st76.78731d7a3d.jpg\", \"5b5959\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e548f732e6065061-F244-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/64db98f56ab269ab-F244-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f323-st20\", \"F323\", \"ST20\", \"Cobra Bronze\", \"metallics\", \"texture\", \"816650\", \"files/EggerF323ST20.webp?v=1709701651\", \"none\", 900, 675, \"assumed\", \"7932617556137\", \"mfc-egger-f323-st20-cobra-bronze\", [[18, \"43736025563305\"]], [], \"structured\", [\"f323-st20.0220686285.jpg\", \"896d55\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b6b943eefc9978d8-F323-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/efb02edb07843cb9-F323-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f416-st10\", \"F416\", \"ST10\", \"Beige Textile\", \"textiles\", \"texture\", \"d0bfa2\", \"products/9__25702.jpg?v=1612978769\", \"none\", 900, 525, \"assumed\", \"6449161797801\", \"egger-f416-st10-beige-textile\", [[8, \"43736001183913\"], [18, \"43736001282217\"]], [], \"structured\", [\"f416-st10.a3af630839.jpg\", \"d1c3aa\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/892e7136ca4f9293-F416-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/54d67353cdae834c-F416-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f417-st10\", \"F417\", \"ST10\", \"Grey Textile\", \"textiles\", \"texture\", \"c4baac\", \"products/mzmz__53770.jpg?v=1612978772\", \"none\", 900, 525, \"assumed\", \"6449161830569\", \"egger-f417-st10-grey-textile\", [[8, \"55929263161729\"], [18, \"43736001478825\"]], [], \"structured\", [\"f417-st10.3e93fa00b3.jpg\", \"c6bdaf\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/43ec5fab48580e48-F417-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/072d04cf53360fa2-F417-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f422-st10\", \"F422\", \"ST10\", \"White Linen\", \"textiles\", \"texture\", \"f3f4ed\", \"files/EggerF42ST10.webp?v=1709708232\", \"h\", 900, 675, \"assumed\", \"7932651929769\", \"mfc-egger-f422-st10-white-linen\", [[18, \"43736025989289\"]], [], \"structured\", [\"f422-st10.d99bdb730d.jpg\", \"f3f4eb\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/56d36b2f01dffc2e-F422-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3b937f6d077cadfa-F422-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f424-st10\", \"F424\", \"ST10\", \"Brown Linen\", \"textiles\", \"texture\", \"978879\", \"files/Screenshot_20240918_121013_Chrome.jpg?v=1726658116\", \"h\", 900, 1082, \"assumed\", \"8274583814313\", \"mfc-egger-f424-st10-brown-linen\", [[18, \"44677474484393\"]], [], \"structured\", [\"f424-st10.7674bc2550.jpg\", \"93897a\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/98736682c01ad76f-F424-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/f4b3779de7182faf-F424-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f433-st10\", \"F433\", \"ST10\", \"Anthracite Linen\", \"textiles\", \"texture\", \"7d756e\", \"products/nana__20734.jpg?v=1612978769\", \"v\", 900, 525, \"assumed\", \"6449161928873\", \"egger-f433-st10-anthracite-linen\", [[18, \"43736001577129\"]], [], \"structured\", [\"f433-st10.281f64e8af.jpg\", \"817a75\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/2604d69fddf3665b-F433-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c632f96e86a2166e-F433-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f434-st20\", \"F434\", \"ST20\", \"Cubanite Steelbrush\", \"metallics\", \"texture\", \"5e5350\", \"files/EggerF434ST20.webp?v=1709699635\", \"none\", 900, 675, \"assumed\", \"7932606251177\", \"mfc-egger-f434-st20-cubanite-steelbrush\", [[18, \"43736025170089\"]], [], \"structured\", [\"f434-st20.294a39dff2.jpg\", \"685c54\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/789301c29b765b23-F434-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a82e01105332d667-F434-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f500-st20\", \"F500\", \"ST20\", \"Metallic Inox\", \"metallics\", \"texture\", \"87807a\", \"products/c__18708.jpg?v=1612978778\", \"v\", 900, 525, \"assumed\", \"6449162551465\", \"egger-f500-st20-metallic-inox\", [[18, \"43736002068649\"]], [], \"structured\", [\"f500-st20.de4f32b00a.jpg\", \"8b8480\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/9245bc4821e39238-F500-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/82eb611d10681a2d-F500-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f527-st20\", \"F527\", \"ST20\", \"Golden Brushed Metal\", \"metallics\", \"texture\", \"bc9c6d\", \"files/EggerF527ST20.webp?v=1709700904\", \"h\", 900, 675, \"assumed\", \"7932611887273\", \"mfc-egger-f527-st20-golden-brushed-metal\", [[18, \"43736025465001\"]], [], \"structured\", [\"f527-st20.ed24f40bc9.jpg\", \"c39f6e\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/1e655181ec6ca8de-F527-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c029184ee21f4e4c-F527-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f528-st20\", \"F528\", \"ST20\", \"Bronze Brushed Metal\", \"metallics\", \"texture\", \"644837\", \"files/EggerF528ST20.webp?v=1709702268\", \"h\", 900, 675, \"assumed\", \"7932622241961\", \"mfc-egger-f528-st20-bronze-brushed-metal\", [[18, \"43736025661609\"]], [], \"structured\", [\"f528-st20.c01157cf9f.jpg\", \"6c513d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c5760bc8bffa15fe-F528-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/19d9f85f78f298eb-F528-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f579-st20\", \"F579\", \"ST20\", \"Champagne Crossed Metal\", \"metallics\", \"texture\", \"9f8b7c\", \"files/original_65ebe7f3-cfdc-410d-a1b7-241aec671914.jpg?v=1784366098\", \"v\", 1300, 2800, \"board\", \"15460728537473\", \"mfc-egger-f579-st20-champagne-crossed-metal\", [[18, \"55930478657921\"]], [], \"structured\", [\"f579-st20.2b25e8f87b.jpg\", \"a08c7d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d9fff08d36eb138f-F579-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/7baa0c19eb2db5a7-F579-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f634-st76\", \"F634\", \"ST76\", \"Grey Canvas\", \"textiles\", \"texture\", \"938c8b\", \"files/EggerF634ST76.webp?v=1709707502\", \"none\", 900, 675, \"assumed\", \"7932647964841\", \"mfc-egger-f634-st76-grey-canvas\", [[18, \"43736025792681\"]], [], \"structured\", [\"f634-st76.3a45fcef77.jpg\", \"99938d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0041f3872481fff6-F634-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b7443283db07a104-F634-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f637-st10\", \"F637\", \"ST10\", \"White Chromix\", \"textiles\", \"texture\", \"e1d7c6\", \"files/AR_16_9.webp?v=1718198636\", \"h\", 2311, 1300, \"crop\", \"8162244886697\", \"mfc-egger-f637-st10-white-chromix\", [[18, \"44322943369385\"]], [], \"structured\", [\"f637-st10.a63be73b33.jpg\", \"e1d8c7\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/9cb530e16ee32040-F637-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/f097c770e3da7ccd-F637-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f638-st10\", \"F638\", \"ST10\", \"Chromix Silver\", \"textiles\", \"texture\", \"a79d94\", \"files/EggerF638ST10.webp?v=1709725644\", \"none\", 900, 675, \"assumed\", \"7932817506473\", \"mfc-egger-f638-st10-chromix-silver\", [[18, \"43736026808489\"]], [], \"structured\", [\"f638-st10.ed0a5467d5.jpg\", \"a29a93\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4d6767309eb26d5e-F638-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ad13f4d19f90386c-F638-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f661-st76\", \"F661\", \"ST76\", \"Sand Beige Calcit Stone\", \"stone\", \"texture\", \"d6c4b5\", \"files/original_401a6159-6550-4e1c-b462-a53aca4ec696.jpg?v=1784329753\", \"none\", 1300, 2800, \"board\", \"15460537500033\", \"mfc-egger-f661-st76-sand-beige-calcit-stone\", [[18, \"55929324044673\"]], [], \"structured\", [\"f661-st76.5781f76368.jpg\", \"d8c6b6\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/97668005d9373979-F661-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6c5335bb94dd079f-F661-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f662-st76\", \"F662\", \"ST76\", \"Pebble Grey Calcit Stone\", \"stone\", \"texture\", \"b2a399\", \"files/original_2203860a-97b8-4c00-aeae-300c6085eb5d.jpg?v=1784329759\", \"none\", 1300, 2800, \"board\", \"15460537532801\", \"mfc-egger-f662-st76-pebble-grey-calcit-stone\", [[18, \"55929324274049\"]], [], \"structured\", [\"f662-st76.20ae017854.jpg\", \"b4a49a\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/fcdc0b16dd8a142d-F662-ST76-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/5bbd7534d563291a-F662-ST76-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f765-st20\", \"F765\", \"ST20\", \"Brushed Silvergrey\", \"metallics\", \"texture\", \"a7a6a0\", \"files/original_ec94f2c5-a18f-41a8-ae30-2a1a72458fff.jpg?v=1784366101\", \"v\", 1300, 2800, \"board\", \"15460728570241\", \"mfc-egger-f765-st20-brushed-silvergrey\", [[18, \"55930478887297\"]], [], \"structured\", [\"f765-st20.6425f50197.jpg\", \"a8a69f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c4b4141cb42d9a9d-F765-ST20-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/be6fda7ecb243ce4-F765-ST20-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f800-st9\", \"F800\", \"ST9\", \"Crystal Marble\", \"stone\", \"texture\", \"e9e5e0\", \"files/EggerF800ST9.webp?v=1709708756\", \"v\", 900, 675, \"assumed\", \"7932664774825\", \"mfc-egger-f800-st9-crystal-marble\", [[18, \"43736026153129\"]], [], \"smooth\", [\"f800-st9.cbf0d16937.jpg\", \"eeeae5\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3eb2a4f087cf8de1-F800-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/f1375ac21688c838-F800-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"f812-st9\", \"F812\", \"ST9\", \"White Levanto Marble\", \"stone\", \"texture\", \"ebe8e0\", \"products/x__73256.jpg?v=1612978773\", \"h\", 900, 525, \"assumed\", \"6449162289321\", \"egger-f812-st9-white-levanto-marble\", [[18, \"43736001839273\"]], [], \"smooth\", [\"f812-st9.991dc25b50.jpg\", \"edebe6\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/de7710ba37078c9a-F812-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/cedfddabf0e7209e-F812-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h309-st12\", \"H309\", \"ST12\", \"Brown Tonsberg Oak\", \"woods\", \"texture\", \"694c3b\", \"files/EggerH309ST12.webp?v=1709698961\", \"h\", 900, 675, \"assumed\", \"7932597862569\", \"mfc-egger-h309-st12-brown-tonsberg-oak\", [[18, \"43736025039017\"]], [], \"structured\", [\"h309-st12.d59e0996ea.jpg\", \"71533f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d3667a777665e671-H309-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/84eb7a5c250e02f5-H309-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1142-st36\", \"H1142\", \"ST36\", \"Brown Sacramento Oak\", \"woods\", \"texture\", \"b79673\", \"files/EggerH114ST36.webp?v=1709627019\", \"h\", 900, 675, \"assumed\", \"7930940063913\", \"mfc-egger-h1142-st36-brown-sacramento-oak\", [[18.5, \"43736022646953\"]], [], \"structured\", [\"h1142-st36.2fc896aab0.jpg\", \"bd9b76\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c3a41a0319e0aa6a-H1142-ST36-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/84a0a4fcc9d63923-H1142-ST36-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1143-st36\", \"H1143\", \"ST36\", \"Grey Sacramento Oak\", \"woods\", \"texture\", \"9e8e7f\", \"files/EggerH1143ST36.webp?v=1709653955\", \"h\", 900, 675, \"assumed\", \"7931225997481\", \"mfc-egger-h1143-st36-grey-sacramento-oak\", [[18.5, \"43736022974633\"]], [], \"structured\", [\"h1143-st36.3e6f00f429.jpg\", \"a39180\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a44dc2400b13694a-H1143-ST36-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bf99e7672f2275ae-H1143-ST36-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1145-st10\", \"H1145\", \"ST10\", \"Natural Bardolino Oak\", \"woods\", \"texture\", \"c1a685\", \"products/v__90065.jpg?v=1612978727\", \"v\", 900, 525, \"assumed\", \"6449160290473\", \"egger-h1145-st10-natural-bardolino-oak\", [[18, \"43735997317289\"]], [], \"structured\", [\"h1145-st10.f2859f2151.jpg\", \"c2a485\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/f3c3132ed14a48c8-H1145-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/757bff91454780be-H1145-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1146-st10\", \"H1146\", \"ST10\", \"Grey Bardolino Oak\", \"woods\", \"texture\", \"b0997c\", \"products/m__93187.jpg?v=1612978723\", \"v\", 900, 525, \"assumed\", \"6449160323241\", \"egger-h1146-st10-grey-bardolino-oak\", [[8, \"43735997513897\"], [18, \"43735997415593\"]], [], \"structured\", [\"h1146-st10.9e49f92824.jpg\", \"b19a7f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/848eb1acd14608e7-H1146-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/5172c24a0bb7844a-H1146-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1176-st37\", \"H1176\", \"ST37\", \"White Halifax Oak\", \"woods\", \"texture\", \"cab9a0\", \"products/1__43380.jpg?v=1612978786\", \"v\", 900, 525, \"assumed\", \"6449163042985\", \"egger-h1176-st37-white-halifax-oak\", [[18.5, \"43736002920617\"]], [], \"structured\", [\"h1176-st37.c11701b6c2.jpg\", \"c6b39c\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6100860c8a757870-H1176-ST37-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/119610f15f5369de-H1176-ST37-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1180-st37\", \"H1180\", \"ST37\", \"Natural Halifax Oak\", \"woods\", \"texture\", \"ba9e74\", \"products/j__11979.jpg?v=1612978780\", \"v\", 900, 525, \"assumed\", \"6449163141289\", \"egger-h1180-st37-natural-halifax-oak\", [[8, \"43736003182761\"], [18.5, \"43736003084457\"]], [], \"structured\", [\"h1180-st37.b22e81f4e0.jpg\", \"b59571\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/dacc024316d7365a-H1180-ST37-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b03b1ab84267c970-H1180-ST37-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1181-st37\", \"H1181\", \"ST37\", \"Tobacco Halifax Oak\", \"woods\", \"texture\", \"866b53\", \"products/444__73309.jpg?v=1612978790\", \"h\", 900, 525, \"assumed\", \"6449163206825\", \"egger-h1181-st37-tobacco-halifax-oak\", [[18.5, \"43736003313833\"]], [], \"structured\", [\"h1181-st37.37f3e5501a.jpg\", \"886c51\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b0bb73a1ab2950eb-H1181-ST37-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ff5521cfebb23fed-H1181-ST37-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1186-st37\", \"H1186\", \"ST37\", \"Dark Brown Garrone Oak\", \"woods\", \"texture\", \"42352c\", \"files/lightbox_big_image_1918.webp?v=1784370663\", \"h\", 900, 675, \"assumed\", \"15460750590337\", \"egger-h1186-st37-dark-brown-garrone-oak\", [[18.5, \"55930576798081\"]], [], \"structured\", null, false, null],\n    [\"h1223-st19\", \"H1223\", \"ST19\", \"Sevilla Ash\", \"woods\", \"texture\", \"ebdecd\", \"files/EggerH1223ST19.webp?v=1709665249\", \"h\", 900, 675, \"assumed\", \"7931283603625\", \"mfc-egger-h1223-st19-sevilla-ash\", [[18, \"43736023597225\"]], [], \"grain\", [\"h1223-st19.b596608043.jpg\", \"e9dbca\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/79bbab6678ad5f0a-H1223-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b4b71458bcfda50b-H1223-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1225-st12\", \"H1225\", \"ST12\", \"Trondheim Ash\", \"woods\", \"texture\", \"eeeae7\", \"files/H1225st12.jpg?v=1708040782\", \"h\", 900, 675, \"assumed\", \"7911622607017\", \"mfc-egger-h1225-st12-trondheim-ash\", [[18, \"43736016060585\"]], [], \"structured\", [\"h1225-st12.b6ef0fa7f3.jpg\", \"efebe8\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4c6104ea1cb4d83f-H1225-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6f63c7938aa71488-H1225-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1227-tm12\", \"H1227\", \"TM12\", \"Brown Abano Ash\", \"woods\", \"texture\", \"3d3129\", \"files/lightbox_image_1699.webp?v=1723739837\", \"h\", 900, 675, \"assumed\", \"8231031275689\", \"mfc-egger-h1227-tm12-brown-abano-ash\", [[19, \"44537840533673\"]], [], \"lacquer\", [\"h1227-tm12.e441d2d62f.jpg\", \"44372e\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/472a2a3087430c40-H1227-TM12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/57a4eaedf9419ac5-H1227-TM12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1228-tm12\", \"H1228\", \"TM12\", \"Anthracite Abano Ash\", \"woods\", \"texture\", \"302a2a\", \"files/original_b874af4d-29cd-43fa-a319-98eb7f292d16.jpg?v=1784363541\", \"v\", 1300, 2800, \"board\", \"8237561807017\", \"mfc-egger-u780-tm9-monument-grey-perfect-matt-copy\", [[19, \"44549846007977\"]], [], \"lacquer\", [\"h1228-tm12.32c38f61ba.jpg\", \"322b2b\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a97075e947e57227-H1228-TM12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/33fa90f5fd431b8a-H1228-TM12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1242-st10\", \"H1242\", \"ST10\", \"Natural Sheffield Acacia\", \"woods\", \"texture\", \"c8a681\", \"files/EggerH1242ST10.webp?v=1709695101\", \"h\", 900, 675, \"assumed\", \"7931725676713\", \"mfc-egger-h1242-st10-natural-sheffield-acacia\", [[18, \"43736024580265\"]], [], \"structured\", [\"h1242-st10.013a045c1c.jpg\", \"cba983\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0eedc5aec4f97da6-H1242-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/df6c1a77779bffb6-H1242-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1247-st17\", \"H1247\", \"ST17\", \"Graphite Sheffield Acacia\", \"woods\", \"texture\", \"4e3d37\", \"files/original_ae6b1c63-efbf-4f6a-8dcf-f3dce4a48663.jpg?v=1784365455\", \"v\", 1300, 2800, \"board\", \"15460726866305\", \"mfc-egger-h1247-st17-graphite-sheffield-acacia\", [[18, \"55930471874945\"]], [], \"grain\", [\"h1247-st17.8dc76f3f00.jpg\", \"4f3e37\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b758220ec5f93376-H1247-ST17-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4e27f8a57695e30f-H1247-ST17-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1250-st36\", \"H1250\", \"ST36\", \"Navarra Ash\", \"woods\", \"texture\", \"d3bfa4\", \"products/c__85631.jpg?v=1612978786\", \"v\", 900, 525, \"assumed\", \"6449162780841\", \"egger-h1250-st36-navarra-ash\", [[18.5, \"43736002363561\"]], [], \"structured\", [\"h1250-st36.4888e51a67.jpg\", \"d3bda6\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/67792b17d531dc37-H1250-ST36-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bec3c41cd24923d2-H1250-ST36-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1277-st9\", \"H1277\", \"ST9\", \"Light Lakeland Acacia\", \"woods\", \"texture\", \"e0caab\", \"products/9__49421.jpg?v=1612978719\", \"v\", 900, 525, \"assumed\", \"6449160126633\", \"egger-h1277-st9-light-lakeland-acacia\", [[8, \"43735996170409\"], [18, \"43735996006569\"]], [], \"smooth\", [\"h1277-st9.498386cbe4.jpg\", \"dbc4a9\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/52e201fff4a2de0b-H1277-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/fd3e3df92135c383-H1277-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1303-st12\", \"H1303\", \"ST12\", \"Brown Belmont Oak\", \"woods\", \"texture\", \"866d56\", \"files/lightbox_image_1604.webp?v=1720539395\", \"h\", 900, 675, \"assumed\", \"8195636396201\", \"mfc-egger-h1303-st12-brown-belmont-oak\", [[18, \"44421585338537\"]], [], \"structured\", [\"h1303-st12.2f8b5311e1.jpg\", \"8a6f55\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3ab9ed337f5bc712-H1303-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/048d52a4fea941d3-H1303-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1307-st19\", \"H1307\", \"ST19\", \"Brown Warmia Walnut\", \"woods\", \"texture\", \"583a29\", \"files/EggerH1307ST19.webp?v=1709669124\", \"h\", 900, 675, \"assumed\", \"7931324629161\", \"mfc-egger-h1307-st19-brown-warmia-walnut\", [[18, \"43736024187049\"]], [], \"grain\", [\"h1307-st19.26f53fca35.jpg\", \"62412d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c9d48f67f1e07e92-H1307-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6582b5d5ff669f26-H1307-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1313-st10\", \"H1313\", \"ST10\", \"Grey Brown Whiteriver Oak\", \"woods\", \"texture\", \"7c726b\", \"products/kk__47600.jpg?v=1612978727\", \"v\", 900, 525, \"assumed\", \"6449160421545\", \"egger-h1313-st10-grey-brown-whiteriver-oak\", [[18, \"43735997612201\"]], [], \"structured\", [\"h1313-st10.f91b48e399.jpg\", \"7e736d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/83cafecff46ac98e-H1313-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/26b4b83a2023fdd3-H1313-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1316-st17\", \"H1316\", \"ST17\", \"Bookmatch Oak\", \"woods\", \"texture\", \"c19870\", \"files/original_df613b0e-2915-447a-b873-631b384fd82f.jpg?v=1784366011\", \"v\", 1300, 2800, \"board\", \"15460728209793\", \"mfc-egger-h1316-st17-bookmatch-oak\", [[18, \"55930477412737\"]], [], \"grain\", [\"h1316-st17.17cca952f8.jpg\", \"c29971\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/046589fac16c961d-H1316-ST17-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/111db12bc7593939-H1316-ST17-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1318-st10\", \"H1318\", \"ST10\", \"Natural Wild Oak\", \"woods\", \"texture\", \"bf976c\", \"files/original_c23e1948-571a-4f1b-b6fa-d239df80cfb1.jpg?v=1784363540\", \"v\", 1300, 2800, \"board\", \"14990720893313\", \"mfc-egger-h1318-st10-natural-wild-oak\", [[8, \"54023327744385\"], [18, \"54023327515009\"]], [], \"structured\", [\"h1318-st10.05f4784b71.jpg\", \"bf986c\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/2960be8200779f32-H1318-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/066f4bfc0e6174f5-H1318-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1330-st10\", \"H1330\", \"ST10\", \"Vintage Santa Fe Oak\", \"woods\", \"texture\", \"726048\", \"products/v__39017.jpg?v=1612978760\", \"v\", 900, 525, \"assumed\", \"6449161175209\", \"egger-h1330-st10-vintage-santa-fe-oak\", [[18, \"43736000200873\"]], [], \"structured\", [\"h1330-st10.8b4c8af82a.jpg\", \"7a644e\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e600b202488e3337-H1330-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/98205ee923ce0fb2-H1330-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1331-st10\", \"H1331\", \"ST10\", \"Grey Santa Fe Oak\", \"woods\", \"texture\", \"786b5e\", \"products/a__44852.jpg?v=1612978756\", \"v\", 900, 525, \"assumed\", \"6449161240745\", \"egger-h1331-st10-grey-santa-fe-oak\", [[18, \"43736000331945\"]], [], \"structured\", null, false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/84fc9513b9a623ef-supplier-H1331_10-basecolor.jpg\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/84fc9513b9a623ef-supplier-H1331_10-basecolor.jpg\", 297, 210, \"h\", \"sample\", null, \"Approximate beyond the small measured sample: repeated supplier tile, not the full-board arrangement\"]],\n    [\"h1334-st9\", \"H1334\", \"ST9\", \"Light Sorano Oak\", \"woods\", \"texture\", \"d2ac78\", \"products/la__23246.jpg?v=1738767549\", \"v\", 900, 525, \"assumed\", \"6449159995561\", \"egger-h1334-st9-light-sorano-oak\", [[8, \"44291708190889\"], [18, \"43735995744425\"]], [], \"smooth\", [\"h1334-st9.727bbd4fbe.jpg\", \"d8af80\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/fbd67576dc538f53-H1334-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4df2ac4ed68eaa7d-H1334-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1336-st37\", \"H1336\", \"ST37\", \"Sand Grey Glazed Halifax Oak\", \"woods\", \"texture\", \"c4b8a2\", \"products/da__25712.jpg?v=1612978794\", \"v\", 900, 525, \"assumed\", \"6449163272361\", \"egger-h1336-st37-sand-grey-glazed-halifax-oak\", [[18.5, \"43736003412137\"]], [], \"structured\", null, false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ff6e3cb5337cf54d-supplier-H1336_37-basecolor.jpg\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ff6e3cb5337cf54d-supplier-H1336_37-basecolor.jpg\", 296.9, 209.9, \"h\", \"sample\", null, \"Approximate beyond the small measured sample: repeated supplier tile, not the full-board arrangement\"]],\n    [\"h1357-st10\", \"H1357\", \"ST10\", \"Grey Beige Spree Oak\", \"woods\", \"texture\", \"a9957f\", \"files/EggerH1357ST10.webp?v=1709667229\", \"h\", 900, 675, \"assumed\", \"7931298840745\", \"mfc-egger-h1357-st10-grey-beige-spree-oak\", [[18, \"43736023793833\"]], [], \"structured\", [\"h1357-st10.d06c5df5e2.jpg\", \"ac9781\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4f359a81367f5bad-H1357-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/87d12b57b4268ad1-H1357-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1362-st12\", \"H1362\", \"ST12\", \"Light Baronia Oak\", \"woods\", \"texture\", \"c3a88e\", \"files/original_48348ccb-62e9-487a-a00e-c85e92461fee.jpg?v=1784329764\", \"v\", 1300, 2800, \"board\", \"15460537565569\", \"mfc-egger-h1362-st12-light-baronia-oak\", [[18, \"55929324503425\"]], [], \"structured\", [\"h1362-st12.1c3a647f6b.jpg\", \"c4a98f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ae5e06c53bcfacbf-H1362-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/dedc1bdaba77a34b-H1362-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1367-st40\", \"H1367\", \"ST40\", \"Light Natural Casella Oak\", \"woods\", \"texture\", \"cdaf8c\", \"files/EggerH1367ST40.webp?v=1709616792\", \"h\", 900, 675, \"assumed\", \"7930796605609\", \"mfc-egger-h1367-st40-light-natural-casella-oak\", [[18.5, \"43736022089897\"]], [], \"grain\", [\"h1367-st40.941ea0ebaf.jpg\", \"cfb18d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/46323351d73f8821-H1367-ST40-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0a5a1d53ddcf0a5f-H1367-ST40-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1369-st40\", \"H1369\", \"ST40\", \"Marone Casella Oak\", \"woods\", \"texture\", \"45362e\", \"files/EggerH1369ST40.webp?v=1709617325\", \"h\", 900, 675, \"assumed\", \"7930810630313\", \"mfc-egger-h1369-st40-marone-casella-oak\", [[18.5, \"43736022188201\"]], [], \"grain\", [\"h1369-st40.7acc9f59d7.jpg\", \"4f3d34\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/136e1820aec032ec-H1369-ST40-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/46fd8b5c02e35db4-H1369-ST40-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1371-st19\", \"H1371\", \"ST19\", \"Grey Beige Rift Oak\", \"woods\", \"texture\", \"bbb0a2\", \"files/lightbox_big_image_1921.webp?v=1784368229\", \"h\", 900, 675, \"assumed\", \"15460741054849\", \"mfc-egger-h1371-st19-grey-beige-rift-oak\", [[18, \"55930546782593\"]], [], \"grain\", null, false, null],\n    [\"h1377-st36\", \"H1377\", \"ST36\", \"Sand Orleans Oak\", \"woods\", \"texture\", \"b39c81\", \"products/b__95365.jpg?v=1612978782\", \"v\", 900, 525, \"assumed\", \"6449162879145\", \"egger-h1377-st36-sand-orleans-oak\", [[18.5, \"43736002461865\"]], [], \"structured\", [\"h1377-st36.69237a2ec6.jpg\", \"b8a089\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a1529d075a3d2d71-H1377-ST36-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a8991d7a458211bb-H1377-ST36-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1379-st36\", \"H1379\", \"ST36\", \"Brown Orleans Oak\", \"woods\", \"texture\", \"7f6f5f\", \"products/n__32048.jpg?v=1612978776\", \"v\", 900, 525, \"assumed\", \"6449162944681\", \"egger-h1379-st36-brown-orleans-oak\", [[18.5, \"43736002560169\"]], [], \"structured\", [\"h1379-st36.b8dcb6d726.jpg\", \"7c685b\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b25b960f628284dc-H1379-ST36-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/56a2b5c189b5bd74-H1379-ST36-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1384-st40\", \"H1384\", \"ST40\", \"White Casella Oak\", \"woods\", \"texture\", \"e5d2bf\", \"files/EggerH1384ST40.webp?v=1709619055\", \"h\", 900, 675, \"assumed\", \"7930832355497\", \"mfc-egger-h1384-st40-white-casella-oak\", [[18.5, \"43736022286505\"]], [], \"grain\", [\"h1384-st40.9f4834bee1.jpg\", \"e3d0bd\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/5a0636df77b9f07b-H1384-ST40-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/93289c0da0d0c870-H1384-ST40-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"oak\", \"H1385\", \"ST40\", \"Natural Casella Oak\", \"woods\", \"texture\", \"b28d66\", \"files/EggerH1385ST40.webp?v=1709619563\", \"h\", 900, 675, \"assumed\", \"7930841432233\", \"mfc-egger-h1385-st40-natural-casella-oak\", [[18.5, \"43736022417577\"]], [], \"grain\", [\"h1385-st40.1d5456dedc.jpg\", \"b68f68\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/2ce6e9006a5bc58d-H1385-ST40-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/8e761087ac86f9c1-H1385-ST40-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1386-st40\", \"H1386\", \"ST40\", \"Brown Casella Oak\", \"woods\", \"texture\", \"8a674c\", \"files/EggerH1386ST40.webp?v=1709620146\", \"h\", 900, 675, \"assumed\", \"7930849329321\", \"mfc-egger-h1386-st40-brown-casella-oak\", [[18.5, \"43736022548649\"]], [], \"grain\", [\"h1386-st40.45f26e3553.jpg\", \"906c4d\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b95710a22628d1ac-H1386-ST40-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/cd68f9deee75ca88-H1386-ST40-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1388-st40\", \"H1388\", \"ST40\", \"Sand Casella Oak\", \"woods\", \"texture\", \"d5bba2\", \"files/original_d6f38a3c-99bd-4af6-9a10-a4ba818367e5.jpg?v=1784366016\", \"v\", 1300, 2800, \"board\", \"15460728275329\", \"mfc-egger-h1388-st40-sand-casella-oak\", [[18, \"55930477969793\"]], [], \"grain\", [\"h1388-st40.83d320d92c.jpg\", \"d6bda3\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bf57bf47ed069fef-H1388-ST40-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4a723221c97354df-H1388-ST40-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1399-st10\", \"H1399\", \"ST10\", \"Truffle Brown Denver Oak\", \"woods\", \"texture\", \"897765\", \"products/b__18702.jpg?v=1612978759\", \"v\", 900, 525, \"assumed\", \"6449161339049\", \"egger-h1399-st10-truffle-brown-denver-oak\", [[18, \"43736000430249\"]], [], \"structured\", [\"h1399-st10.3c64f9cd7b.jpg\", \"9a8671\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/eaa72374c37d60fb-H1399-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/75940991d0916d27-H1399-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1486-st36\", \"H1486\", \"ST36\", \"Pasadena Pine\", \"woods\", \"texture\", \"706861\", \"products/mm__00494.jpg?v=1612978784\", \"v\", 900, 525, \"assumed\", \"6449162977449\", \"egger-h1486-st36-pasadena-pine\", [[18.5, \"43736002658473\"]], [], \"structured\", null, false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/22b773e93b6a1c0f-supplier-H1486_36-basecolor.jpg\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/22b773e93b6a1c0f-supplier-H1486_36-basecolor.jpg\", 297.3, 210.3, \"h\", \"sample\", null, \"Approximate beyond the small measured sample: repeated supplier tile, not the full-board arrangement\"]],\n    [\"h1582-st15\", \"H1582\", \"ST15\", \"Ellmau Beech\", \"woods\", \"texture\", \"d8a96f\", \"products/12__05804.jpg?v=1612978723\", \"v\", 900, 525, \"assumed\", \"6449160028329\", \"egger-h1582-st15-ellmau-beech\", [[18, \"43735995875497\"]], [], \"structured\", null, false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/1ccece23d7380034-supplier-H1582_15-basecolor.jpg\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/1ccece23d7380034-supplier-H1582_15-basecolor.jpg\", 297, 210, \"h\", \"sample\", null, \"Approximate beyond the small measured sample: repeated supplier tile, not the full-board arrangement\"]],\n    [\"h1708-st17\", \"H1708\", \"ST17\", \"Brighton Chestnut\", \"woods\", \"texture\", \"b18e73\", \"files/original_9c1716cb-12dc-4b4d-bdd2-c271a86ed893.jpg?v=1784366577\", \"v\", 1300, 2800, \"board\", \"15460730438017\", \"mfc-egger-h1708-st17-brighton-chestnut\", [[18, \"55930486522241\"]], [], \"grain\", [\"h1708-st17.06504370c8.jpg\", \"b28f73\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/1a4957b712b1b967-H1708-ST17-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0905a6e444556a37-H1708-ST17-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1714-st19\", \"H1714\", \"ST19\", \"Lincoln Walnut\", \"woods\", \"texture\", \"674a30\", \"products/nn__97590.jpg?v=1612978760\", \"v\", 900, 525, \"assumed\", \"6449161437353\", \"egger-h1714-st19-lincoln-walnut\", [[8, \"43736000626857\"], [18, \"43736000528553\"]], [], \"grain\", [\"h1714-st19.f399eb2fee.jpg\", \"744f34\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e64a1990f89fb7c9-H1714-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3cc57db5f0f92644-H1714-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1715-st12\", \"H1715\", \"ST12\", \"Parona Walnut\", \"woods\", \"texture\", \"c49773\", \"files/EggerH1715ST12.webp?v=1709695947\", \"h\", 900, 675, \"assumed\", \"7931945091241\", \"mfc-egger-h1715-st12-parona-walnut\", [[18, \"43736024711337\"]], [], \"structured\", [\"h1715-st12.23e713b647.jpg\", \"c59975\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/19aa6de9a93b847b-H1715-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bd5c89c4a7256382-H1715-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h1732-st9\", \"H1732\", \"ST9\", \"Sand Birch\", \"woods\", \"texture\", \"e5ccae\", \"files/H1732-ST9-Sand-Birch1.webp?v=1748010575\", \"h\", 900, 675, \"assumed\", \"15080876835201\", \"mfc-egger-h1732-st9-sand-birch\", [[18, \"54335609536897\"]], [], \"smooth\", [\"h1732-st9.1349d6a8d3.jpg\", \"e8cfb0\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/617bb7a08a328786-H1732-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/be1f30c724eec070-H1732-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h2033-st10\", \"H2033\", \"ST10\", \"Dark Hunton Oak\", \"woods\", \"texture\", \"724b28\", \"files/EggerH2033ST10.webp?v=1709698173\", \"h\", 900, 675, \"assumed\", \"7932546285737\", \"mfc-egger-h2033-st10-dark-hunton-oak\", [[18, \"43736024940713\"]], [], \"structured\", [\"h2033-st10.dcb4642120.jpg\", \"735236\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a9f2b113745c746f-H2033-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e51f9f099cda0354-H2033-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3003-st19\", \"H3003\", \"ST19\", \"Norwich Oak\", \"woods\", \"texture\", \"61564e\", \"files/EggerH3003ST19.webp?v=1709668559\", \"h\", 900, 675, \"assumed\", \"7931314241705\", \"mfc-egger-h3003-st19-norwich-oak\", [[18, \"43736023990441\"]], [], \"grain\", [\"h3003-st19.316e1a8269.jpg\", \"655951\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0c55d8323e180994-H3003-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/aa40550a2b793de0-H3003-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3041-tm12\", \"H3041\", \"TM12\", \"Natural Eucalyptus\", \"woods\", \"texture\", \"544338\", \"files/h3041.png?v=1772644816\", \"h\", 900, 669, \"assumed\", \"15327089918337\", \"mfc-egger-h3041-tm12-natural-eucalyptus\", [[19, \"55385864438145\"]], [], \"lacquer\", [\"h3041-tm12.cb647a26f0.jpg\", \"63483b\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/438e885af60efb7a-H3041-TM12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b04fc3889f12899e-H3041-TM12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3043-st12\", \"H3043\", \"ST12\", \"Dark Brown Eucalyptus\", \"woods\", \"texture\", \"1b1513\", \"files/EggerH3043ST12.webp?v=1709694110\", \"h\", 900, 675, \"assumed\", \"7931482636457\", \"mfc-egger-h3043-st12-dark-brown-eucalyptus\", [[18, \"43736024285353\"]], [], \"structured\", [\"h3043-st12.783187bcce.jpg\", \"251915\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d8b950d290a21ea6-H3043-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/73097a02792a1c26-H3043-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3090-st19\", \"H3090\", \"ST19\", \"Shorewood\", \"woods\", \"texture\", \"8d8474\", \"files/lightbox_big_image_1579.webp?v=1784367769\", \"h\", 900, 675, \"assumed\", \"15460739121537\", \"mfc-egger-h3090-st19-shorewood\", [[18, \"55930540163457\"]], [], \"grain\", null, false, null],\n    [\"h3131-st12\", \"H3131\", \"ST12\", \"Natural Davos Oak\", \"woods\", \"texture\", \"beaa84\", \"products/w__51020.jpg?v=1612978732\", \"v\", 900, 525, \"assumed\", \"6449160585385\", \"egger-h3131-st12-natural-davos-oak\", [[18, \"43735997939881\"]], [], \"structured\", [\"h3131-st12.40ec02f4cc.jpg\", \"c5ae8b\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e0a3f6f669845ae5-H3131-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c7ecbc149b3b2b6c-H3131-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3133-st12\", \"H3133\", \"ST12\", \"Truffle Brown Davos Oak\", \"woods\", \"texture\", \"7e6952\", \"products/t__41440.jpg?v=1612978739\", \"v\", 900, 525, \"assumed\", \"6449160650921\", \"egger-h3133-st12-truffle-brown-davos-oak\", [[18, \"43735998070953\"]], [], \"structured\", [\"h3133-st12.b7851b133b.jpg\", \"876d59\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e4afe43efa9a439e-H3133-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/7778659cc55a7c3c-H3133-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3146-st19\", \"H3146\", \"ST19\", \"Beige Grey Lorenzo Oak\", \"woods\", \"texture\", \"aa9c88\", \"products/lo__94410.jpg?v=1612978757\", \"v\", 900, 525, \"assumed\", \"6449161568425\", \"egger-h3146-st19-beige-grey-lorenzo-oak\", [[18, \"43736000725161\"]], [], \"grain\", [\"h3146-st19.6b6e255d4d.jpg\", \"ab9b89\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d793b177e6831b1c-H3146-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/20f5a755fa1ab6e6-H3146-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3154-st36\", \"H3154\", \"ST36\", \"Dark Brown Charleston Oak\", \"woods\", \"texture\", \"694e37\", \"files/EggerH3154ST36-1.webp?v=1709654504\", \"h\", 900, 675, \"assumed\", \"7931235139753\", \"mfc-egger-h3154-st36-dark-brown-charleston-oak\", [[18.5, \"43736023072937\"]], [], \"structured\", [\"h3154-st36.50a1a9cdf2.jpg\", \"75583f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/cc94540525e4a4a2-H3154-ST36-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0bac2d13bf953e6d-H3154-ST36-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3157-st12\", \"H3157\", \"ST12\", \"Vicenza Oak\", \"woods\", \"texture\", \"ceaf87\", \"files/EggerH3157ST12.webp?v=1709697441\", \"h\", 900, 675, \"assumed\", \"7932254748841\", \"mfc-egger-h3157-st12-vicenza-oak\", [[18, \"43736024809641\"]], [], \"structured\", [\"h3157-st12.0da0254c41.jpg\", \"d2b288\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/61500a9a3c27d5e7-H3157-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0ade37215ee07eff-H3157-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3158-st19\", \"H3158\", \"ST19\", \"Grey Vicenza Oak\", \"woods\", \"texture\", \"8d806e\", \"products/kk__49549.jpg?v=1612978763\", \"v\", 900, 525, \"assumed\", \"6449161601193\", \"egger-h3158-st19-grey-vicenza-oak\", [[18, \"43736000823465\"]], [], \"grain\", [\"h3158-st19.94dc9365ec.jpg\", \"928273\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/63d9cf22867f5519-H3158-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/00d7dd1b62d6826c-H3158-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3170-st12\", \"H3170\", \"ST12\", \"Natural Kendal Oak\", \"woods\", \"texture\", \"b69c79\", \"products/1__69021.jpg?v=1612978735\", \"v\", 900, 525, \"assumed\", \"6449160716457\", \"egger-h3170-st12-natural-kendal-oak\", [[18, \"43735998234793\"]], [], \"structured\", [\"h3170-st12.3d78700fc8.jpg\", \"bda180\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/593f86a31645b879-H3170-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ccdb06a85f630e17-H3170-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3171-st12\", \"H3171\", \"ST12\", \"Oiled Kendal Oak\", \"woods\", \"texture\", \"ae8d62\", \"products/2__57523.jpg?v=1612978742\", \"v\", 900, 525, \"assumed\", \"6449160749225\", \"egger-h3171-st12-oiled-kendal-oak\", [[18, \"43735998365865\"]], [], \"structured\", [\"h3171-st12.293f01c36b.jpg\", \"b69066\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/85854fe7f04d76c9-H3171-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bf51fd815cfb7e9d-H3171-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3176-st37\", \"H3176\", \"ST37\", \"Pewter Halifax Oak\", \"woods\", \"texture\", \"87694e\", \"products/kll__17509.jpg?v=1612978792\", \"h\", 900, 525, \"assumed\", \"6449163305129\", \"egger-h3176-st37-pewter-halifax-oak\", [[18.5, \"43736003543209\"]], [], \"structured\", [\"h3176-st37.d1f2dcac23.jpg\", \"82644b\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b69465e35cc41b79-H3176-ST37-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3aa26caa04e8644a-H3176-ST37-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3180-st37\", \"H3180\", \"ST37\", \"Brown Halifax Oak\", \"woods\", \"texture\", \"64553d\", \"files/H3180.webp?v=1738687565\", \"h\", 900, 675, \"assumed\", \"14989105922433\", \"mfc-egger-h3180-st37-brown-halifax-oak\", [[8, \"54019760718209\"], [18, \"54019760488833\"]], [], \"structured\", [\"h3180-st37.091fda9d2f.jpg\", \"785e44\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d6c568d92f592738-H3180-ST37-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0d5fb2bed100e9c4-H3180-ST37-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3190-st19\", \"H3190\", \"ST19\", \"Anthracite Fineline Metallic\", \"woods\", \"texture\", \"383230\", \"products/gg__97525.jpg?v=1612978768\", \"v\", 900, 525, \"assumed\", \"6449161633961\", \"egger-h3190-st19-anthracite-fineline-metallic\", [[18, \"43736000921769\"]], [], \"grain\", [\"h3190-st19.b7cec6a9f6.jpg\", \"413a37\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/a57883341f1c0a6b-H3190-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c6c5af4cb61eb482-H3190-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3195-st19\", \"H3195\", \"ST19\", \"White Fineline\", \"woods\", \"texture\", \"eae9e3\", \"files/EggerH3195ST19.webp?v=1709666518\", \"h\", 900, 675, \"assumed\", \"7931294285993\", \"mfc-egger-h3195-st19-white-fineline\", [[18, \"43736023695529\"]], [], \"grain\", [\"h3195-st19.065d7e7ff9.jpg\", \"eceae3\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4eb4d5369dd3d9e1-H3195-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b0fa85935d1f9746-H3195-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3198-st19\", \"H3198\", \"ST19\", \"Dark Grey Fineline\", \"woods\", \"texture\", \"5c524a\", \"files/EggerH3198ST19.webp?v=1709667889\", \"h\", 900, 675, \"assumed\", \"7931303526569\", \"mfc-egger-egger-h3198-st19-dark-grey-fineline\", [[18, \"43736023892137\"]], [], \"grain\", [\"h3198-st19.46aa7c2dcc.jpg\", \"635951\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4388fc32a15ff87d-H3198-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/1d5d537197ca3dff-H3198-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3303-st10\", \"H3303\", \"ST10\", \"Natural Hamilton Oak\", \"woods\", \"texture\", \"bda070\", \"products/mz__62197.jpg?v=1612978737\", \"v\", 900, 525, \"assumed\", \"6449160781993\", \"egger-h3303-st10-natural-hamilton-oak\", [[8, \"43735998628009\"], [18, \"43735998496937\"]], [], \"structured\", [\"h3303-st10.4f260c8899.jpg\", \"c09f71\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/64afc552e6c9b6fd-H3303-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d477c282b534d92d-H3303-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3309-st28\", \"H3309\", \"ST28\", \"Sand Gladstone Oak\", \"woods\", \"texture\", \"c6ac87\", \"products/nb__32434.jpg?v=1612978799\", \"v\", 900, 525, \"assumed\", \"6449163468969\", \"egger-h3309-st28-sand-gladstone-oak\", [[18.5, \"43736004198569\"]], [], \"structured\", [\"h3309-st28.d9d97e0ef6.jpg\", \"c7aa89\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/491f7058a9924d10-H3309-ST28-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e670c3bc4b2954c7-H3309-ST28-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3311-st28\", \"H3311\", \"ST28\", \"Bleached Cuneo Oak\", \"woods\", \"texture\", \"cab293\", \"files/EggerH3311ST28.webp?v=1709655283\", \"h\", 900, 675, \"assumed\", \"7931240448169\", \"mfc-egger-h3311-st28-bleached-cuneo-oak\", [[18.5, \"43736023171241\"]], [], \"structured\", [\"h3311-st28.85dabc4da7.jpg\", \"d3b292\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/8d10d1a684e00a18-H3311-ST28-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/95dc74d7df8c680f-H3311-ST28-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3317-st28\", \"H3317\", \"ST28\", \"Brown Cuneo Oak\", \"woods\", \"texture\", \"987c61\", \"files/EggerH3317ST28.webp?v=1709655939\", \"h\", 900, 675, \"assumed\", \"7931244019881\", \"mfc-egger-h3317-st28-brown-cuneo-oak\", [[18.5, \"43736023367849\"]], [], \"structured\", [\"h3317-st28.ddcc0455cb.jpg\", \"af8c69\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e3956da75db9ec27-H3317-ST28-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/9a39432ae1b67a02-H3317-ST28-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3325-st28\", \"H3325\", \"ST28\", \"Tobacco Gladstone Oak\", \"woods\", \"texture\", \"5d4e42\", \"products/uu__80218.jpg?v=1612978795\", \"v\", 900, 525, \"assumed\", \"6449163501737\", \"egger-h3325-st28-tobacco-gladstone-oak\", [[18.5, \"43736004296873\"]], [], \"structured\", [\"h3325-st28.828ea1fba5.jpg\", \"635143\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/4da1ac32d1971d4d-H3325-ST28-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/51e1fa376cf40cb4-H3325-ST28-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3326-st28\", \"H3326\", \"ST28\", \"Grey-Beige Gladstone Oak\", \"woods\", \"texture\", \"b09b7a\", \"products/plm__96274.jpg?v=1612978797\", \"v\", 900, 525, \"assumed\", \"6449163567273\", \"egger-h3326-st28-grey-beige-gladstone-oak\", [[18.5, \"43736004395177\"]], [], \"structured\", [\"h3326-st28.f1d95f8742.jpg\", \"b39a7c\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6d5efad6d18d2bfe-H3326-ST28-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/711ecbfbc07776af-H3326-ST28-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3331-st10\", \"H3331\", \"ST10\", \"Natural Nebraska Oak\", \"woods\", \"texture\", \"c0a67f\", \"products/dd__10882.jpg?v=1612978742\", \"v\", 900, 525, \"assumed\", \"6449160814761\", \"egger-h3331-st10-natural-nebraska-oak\", [[18, \"43735998922921\"]], [], \"structured\", [\"h3331-st10.700a3ee785.jpg\", \"c2a37f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/c31c9999121e84af-H3331-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d1f45b33419ca583-H3331-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3332-st10\", \"H3332\", \"ST10\", \"Grey Nebraska Oak\", \"woods\", \"texture\", \"82715e\", \"products/neb__40806.jpg?v=1612978739\", \"v\", 900, 525, \"assumed\", \"6449160847529\", \"egger-h3332-st10-grey-nebraska-oak\", [[8, \"54105344311681\"], [18, \"43735999185065\"]], [], \"structured\", [\"h3332-st10.56169719f4.jpg\", \"8d7a67\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/0d68356a9cc94503-H3332-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/479de5faec5035ee-H3332-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3335-st28\", \"H3335\", \"ST28\", \"White Gladstone Oak\", \"woods\", \"texture\", \"e8ddcc\", \"products/yt__64313.jpg?v=1612978799\", \"v\", 900, 525, \"assumed\", \"6449163665577\", \"egger-h3335-st28-white-gladstone-oak\", [[18.5, \"43736004493481\"]], [], \"structured\", null, false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bfdd5c8d63646c28-supplier-H3335_28-basecolor.jpg\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bfdd5c8d63646c28-supplier-H3335_28-basecolor.jpg\", 295.7, 208.3, \"h\", \"sample\", null, \"Approximate beyond the small measured sample: repeated supplier tile, not the full-board arrangement\"]],\n    [\"h3349-st19\", \"H3349\", \"ST19\", \"Kaisersberg Oak\", \"woods\", \"texture\", \"d1b88f\", \"products/1__47535.jpg?v=1612978765\", \"v\", 900, 525, \"assumed\", \"6449161699497\", \"egger-h3349-st19-kaisersberg-oak\", [[8, \"55929263260033\"], [18, \"43736001052841\"]], [], \"grain\", [\"h3349-st19.3ea69f0abc.jpg\", \"cfb590\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/bf8c1d5e2a9ea73c-H3349-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/884dce5b08aaafcb-H3349-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3368-st9\", \"H3368\", \"ST9\", \"Natural Lancaster Oak\", \"woods\", \"texture\", \"c09b61\", \"products/h__87915.jpg?v=1612978723\", \"v\", 900, 525, \"assumed\", \"6449160224937\", \"egger-h3368-st9-natural-lancaster-oak\", [[8, \"43735996596393\"], [18, \"43735996694697\"]], [], \"smooth\", [\"h3368-st9.43749986fa.jpg\", \"c59a61\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/6c7fac0191757446-H3368-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/b6d614e0d562ff7e-H3368-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3382-st9\", \"H3382\", \"ST9\", \"Light Winchester Oak\", \"woods\", \"texture\", \"cca278\", \"products/H3382_ST9.jpg?v=1677166583\", \"v\", 900, 518, \"assumed\", \"7708564979881\", \"copy-of-mfc-egger-h3382-st9-light-winchester-oak\", [[8, \"43736009474217\"], [18, \"43736009081001\"]], [], \"smooth\", null, false, null],\n    [\"h3422-st19\", \"H3422\", \"ST19\", \"Brown Grey Lacquered Pine\", \"woods\", \"texture\", \"7e6f60\", \"files/lightbox_big_image_2340.webp?v=1784368231\", \"h\", 900, 675, \"assumed\", \"15460741120385\", \"mfc-egger-h3422-st19-brown-grey-lacquered-pine\", [[18, \"55930547011969\"]], [], \"grain\", null, false, null],\n    [\"h3700-st10\", \"H3700\", \"ST10\", \"Natural Pacific Walnut\", \"woods\", \"texture\", \"ad916d\", \"products/y__15195.jpg?v=1612978746\", \"v\", 900, 525, \"assumed\", \"6449160880297\", \"egger-h3700-st10-natural-pacific-walnut\", [[18, \"43735999283369\"]], [], \"structured\", [\"h3700-st10.21a668ca62.jpg\", \"b39370\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/8b5ff14268bcbcec-H3700-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/3c62187cb8e8f568-H3700-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3702-st10\", \"H3702\", \"ST10\", \"Tobacco Pacific Walnut\", \"woods\", \"texture\", \"5d4b38\", \"products/uu__92160.jpg?v=1612978741\", \"v\", 900, 525, \"assumed\", \"6449160913065\", \"egger-h3702-st10-tobacco-pacific-walnut\", [[18, \"43735999381673\"]], [], \"structured\", [\"h3702-st10.0607df65e1.jpg\", \"624b38\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e498e043cb8caebd-H3702-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/e7f1136277efa855-H3702-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3710-st12\", \"H3710\", \"ST12\", \"Natural Carini Walnut\", \"woods\", \"texture\", \"76624a\", \"products/qqq__89724.jpg?v=1612978747\", \"v\", 900, 525, \"assumed\", \"6449160945833\", \"egger-h3710-st12-natural-carini-walnut\", [[18, \"43735999512745\"]], [], \"structured\", [\"h3710-st12.1de19603de.jpg\", \"7a6049\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/cf16f14c0ea6d776-H3710-ST12-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/669d189ddb789657-H3710-ST12-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3730-st10\", \"H3730\", \"ST10\", \"Natural Hickory\", \"woods\", \"texture\", \"c2a26e\", \"products/saaa__01905.jpg?v=1612978744\", \"v\", 900, 525, \"assumed\", \"6449160978601\", \"egger-h3730-st10-natural-hickory\", [[18, \"43735999611049\"]], [], \"structured\", [\"h3730-st10.0e05f2bf6f.jpg\", \"c5a070\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/2d994a5e91d8f29c-H3730-ST10-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/8199f43cc849ce80-H3730-ST10-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3734-st9\", \"H3734\", \"ST9\", \"Natural Dijon Walnut\", \"woods\", \"texture\", \"845f39\", \"products/d__48793.jpg?v=1612978730\", \"v\", 900, 525, \"assumed\", \"6449160257705\", \"egger-h3734-st9-natural-dijon-walnut\", [[8, \"43735997153449\"], [18, \"43735996858537\"]], [], \"smooth\", [\"h3734-st9.3ce161ee74.jpg\", \"8d613a\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/ead2cd01849389d0-H3734-ST9-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/824803a888784ea6-H3734-ST9-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h3787-st19\", \"H3787\", \"ST19\", \"Brown Bolivar Wood\", \"woods\", \"texture\", \"704f3a\", \"files/original_9427dd19-28e5-4103-8750-79346575ffda.jpg?v=1784366012\", \"v\", 1300, 2800, \"board\", \"15460728242561\", \"mfc-egger-h3787-st19-brown-bolivar-wood-1\", [[18, \"55930477740417\"]], [], \"grain\", [\"h3787-st19.908a311153.jpg\", \"704f3b\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/18d8d403baa82f86-H3787-ST19-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/68dd0f9517435e09-H3787-ST19-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"h7586-st17\", \"H7586\", \"ST17\", \"Tobacco Alba Walnut\", \"woods\", \"texture\", \"65442e\", \"files/original_2fb026d0-a93d-424f-a88c-7e16335c0ac2.jpg?v=1784366581\", \"v\", 1300, 2800, \"board\", \"15460730470785\", \"mfc-egger-h7586-st17-tobacco-alba-walnut\", [[18, \"55930486849921\"]], [], \"grain\", [\"h7586-st17.623ec61680.jpg\", \"65442f\"], false, [\"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/2b0ec966097478fd-H7586-ST17-albedo-standard.webp\", \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-03/d5134824feb18f9a-H7586-ST17-albedo-high.webp\", 1300, 2800, \"v\", \"board\", [150, 300], \"\"]],\n    [\"u104-st9\", \"U104\", \"ST9\", \"Alabaster White\", \"unicolours\", \"solid\", \"fefae1\", \"products/z__72403.jpg?v=1612978703\", \"none\", 900, 525, \"assumed\", \"6449158684841\", \"egger-u104-st9-alabaster-white\", [[8, \"55929260704129\"], [18, \"43735990632617\"]], [], \"smooth\", [\"\", \"fff8e2\"], false, null],\n    [\"u115-st9\", \"U115\", \"ST9\", \"Carat Beige\", \"unicolours\", \"solid\", \"ece2cd\", \"files/EggerU115ST9.jpg?v=1724903465\", \"none\", 900, 675, \"assumed\", \"7929687179433\", \"mfc-egger-u115-st9-carat-beige\", [[18, \"43736019435689\"]], [], \"smooth\", [\"\", \"f0e2c9\"], false, null],\n    [\"u125-st9\", \"U125\", \"ST9\", \"Sand Yellow\", \"unicolours\", \"solid\", \"dfc297\", \"files/EggerU125ST9.jpg?v=1724998930\", \"none\", 900, 675, \"assumed\", \"7930657833129\", \"mfc-egger-u125-st9-sand-yellow\", [[18, \"43736020385961\"]], [], \"smooth\", [\"\", \"e6bf90\"], false, null],\n    [\"u156-st9\", \"U156\", \"ST9\", \"Sand Beige\", \"unicolours\", \"solid\", \"e5d5bc\", \"products/c__76939.jpg?v=1612978700\", \"none\", 900, 525, \"assumed\", \"6449158783145\", \"egger-u156-st9-sand-beige\", [[8, \"43735990730921\"], [18, \"43735990829225\"]], [], \"smooth\", [\"\", \"e7d6c1\"], false, null],\n    [\"u201-st9\", \"U201\", \"ST9\", \"Pebble Grey\", \"unicolours\", \"solid\", \"b3aa99\", \"products/2__91380.jpg?v=1612978704\", \"none\", 900, 525, \"assumed\", \"6449159209129\", \"egger-u201-st9-pebble-grey\", [[8, \"43735992729769\"], [18, \"43735992565929\"]], [], \"smooth\", [\"\", \"b7ad9f\"], false, null],\n    [\"u201-st40\", \"U201\", \"ST40\", \"Pebble Grey\", \"unicolours\", \"solid\", \"b3aa99\", \"products/2__91380.jpg?v=1612978704\", \"none\", 900, 525, \"assumed\", \"15460533666177\", \"mfc-egger-u201-st40-pebble-grey\", [[18.5, \"55929306251649\"]], [], \"grain\", null, false, null],\n    [\"u201-tm9\", \"U201\", \"TM9\", \"Pebble Grey\", \"unicolours\", \"solid\", \"b4ac9d\", \"files/EggerU201TM9.jpg?v=1725001811\", \"none\", 900, 675, \"assumed\", \"7927704092841\", \"mfc-egger-u201-tm9-pebble-grey\", [[19, \"43736016781481\"]], [], \"lacquer\", [\"\", \"b7ad9f\"], false, null],\n    [\"u211-st9\", \"U211\", \"ST9\", \"Almond Beige\", \"unicolours\", \"solid\", \"b1a195\", \"files/EggerU211ST9.jpg?v=1724999690\", \"none\", 900, 675, \"assumed\", \"7929917997225\", \"mfc-egger-u211-st9-almond-beige\", [[18, \"43736019632297\"]], [], \"smooth\", [\"\", \"b6a094\"], false, null],\n    [\"u216-st9\", \"U216\", \"ST9\", \"Cam\\xE8 Beige\", \"unicolours\", \"solid\", \"faf1e6\", \"files/EggerU216ST9.jpg?v=1724999974\", \"none\", 900, 675, \"assumed\", \"7929679052969\", \"mfc-egger-u216-st9-came-beige\", [[18, \"43736019337385\"]], [], \"smooth\", [\"\", \"faf1e0\"], false, null],\n    [\"u220-st9\", \"U220\", \"ST9\", \"Soft Beige\", \"unicolours\", \"solid\", \"efe5da\", \"files/original_03b760b1-3700-4247-acbe-8ef83a7fe98a.jpg?v=1784329732\", \"none\", 1300, 2800, \"board\", \"15460537368961\", \"mfc-egger-u220-st9-soft-beige\", [[18, \"55929323291009\"]], [], \"smooth\", [\"\", \"efe5da\"], false, null],\n    [\"u222-st9\", \"U222\", \"ST9\", \"Crema Beige\", \"unicolours\", \"solid\", \"fff3db\", \"products/z__50990.jpg?v=1612978699\", \"none\", 900, 525, \"assumed\", \"6449158815913\", \"egger-u222-st9-crema-beige\", [[8, \"43735991058601\"], [18, \"43735990927529\"]], [], \"smooth\", [\"\", \"fff2dc\"], false, null],\n    [\"u250-st9\", \"U250\", \"ST9\", \"Caramel Beige\", \"unicolours\", \"solid\", \"a78a6e\", \"files/original_5be01167-82c5-4df4-b4bf-50a937a572c5.jpg?v=1784368769\", \"none\", 900, 1273, \"assumed\", \"15460742955393\", \"mfc-egger-u250-st9-caramel-beige\", [[18, \"55930550419841\"]], [], \"smooth\", null, false, null],\n    [\"u250-tm9\", \"U250\", \"TM9\", \"Caramel Beige\", \"unicolours\", \"solid\", \"a78a6e\", \"files/original_b7426067-1d3f-4e27-aad2-3f8ef4be0e1d.jpg?v=1784368771\", \"none\", 900, 1273, \"assumed\", \"15460743020929\", \"mfc-egger-u250-tm9-caramel-beige\", [[19, \"55930550681985\"]], [], \"lacquer\", [\"\", \"ac8f71\"], false, null],\n    [\"u325-st9\", \"U325\", \"ST9\", \"Antique Rose\", \"unicolours\", \"solid\", \"bc9f97\", \"files/EggerU325ST9.jpg?v=1724996707\", \"none\", 900, 675, \"assumed\", \"7930683424937\", \"mfc-egger-u325-st9-antique-rose\", [[18, \"43736021565609\"]], [], \"smooth\", [\"\", \"c49d96\"], false, null],\n    [\"u335-st9\", \"U335\", \"ST9\", \"Rusty Red\", \"unicolours\", \"solid\", \"855851\", \"files/EggerU335ST9.jpg?v=1724996516\", \"none\", 900, 675, \"assumed\", \"7930685915305\", \"mfc-egger-u335-st9-rusty-red\", [[18, \"43736021663913\"]], [], \"smooth\", [\"\", \"8b574e\"], false, null],\n    [\"u399-st9\", \"U399\", \"ST9\", \"Garnet Red\", \"unicolours\", \"solid\", \"512025\", \"files/EggerU399ST9.jpg?v=1724996384\", \"none\", 900, 675, \"assumed\", \"7930687914153\", \"mfc-egger-u399-st9-garnet-red\", [[18, \"43736021794985\"]], [], \"smooth\", [\"\", \"5e1e22\"], false, null],\n    [\"u444-st9\", \"U444\", \"ST9\", \"Cassis\", \"unicolours\", \"solid\", \"5b3a3d\", \"files/original_ecd011d7-493c-4276-a4b6-a4c90b5425b4.jpg?v=1784329737\", \"none\", 1300, 2800, \"board\", \"15460537401729\", \"mfc-egger-u444-st9-cassis\", [[18, \"55929323520385\"]], [], \"smooth\", [\"\", \"5b3b3c\"], false, null],\n    [\"u502-st9\", \"U502\", \"ST9\", \"Misty Blue\", \"unicolours\", \"solid\", \"5c6f84\", \"files/EggerU502ST9.jpg?v=1724997088\", \"none\", 900, 675, \"assumed\", \"7930677756073\", \"mfc-egger-u502-st9-misty-blue\", [[18, \"43736021336233\"]], [], \"smooth\", [\"\", \"546f84\"], false, null],\n    [\"u502-st40\", \"U502\", \"ST40\", \"Misty Blue\", \"unicolours\", \"solid\", \"5c6f84\", \"files/EggerU502ST9.jpg?v=1724997088\", \"none\", 900, 675, \"assumed\", \"15460535042433\", \"mfc-egger-u502-st40-misty-blue\", [[18.5, \"55929310708097\"]], [], \"grain\", null, false, null],\n    [\"u504-st9\", \"U504\", \"ST9\", \"Tyrolean Blue\", \"unicolours\", \"solid\", \"3c4f64\", \"files/EggerU504ST9.jpg?v=1724996938\", \"none\", 900, 675, \"assumed\", \"7930680377513\", \"mfc-egger-u504-st9-tyrolean-blue\", [[18, \"43736021467305\"]], [], \"smooth\", [\"\", \"39536e\"], false, null],\n    [\"u540-st9\", \"U540\", \"ST9\", \"Denim Blue\", \"unicolours\", \"solid\", \"96a0ab\", \"products/a__08850.jpg?v=1612978711\", \"none\", 900, 525, \"assumed\", \"6449159274665\", \"egger-u540-st9-denim-blue\", [[18, \"43735992828073\"]], [], \"smooth\", [\"\", \"93a5b3\"], false, null],\n    [\"u565-st9\", \"U565\", \"ST9\", \"Ocean Blue\", \"unicolours\", \"solid\", \"324a58\", \"files/EggerU565ST9.jpg?v=1724997237\", \"none\", 900, 675, \"assumed\", \"7930674217129\", \"mfc-egger-u565-st9-ocean-blue\", [[18, \"43736021237929\"]], [], \"smooth\", [\"\", \"244f61\"], false, null],\n    [\"u599-st9\", \"U599\", \"ST9\", \"Indigo Blue\", \"unicolours\", \"solid\", \"232530\", \"products/in_5035897f-8115-4c56-8668-e1ee8109a64d.jpg?v=1674469452\", \"none\", 900, 525, \"assumed\", \"7692104564905\", \"mfc-egger-u599-st9-indigo-blue\", [[8, \"43736008523945\"], [18, \"43736008294569\"]], [], \"smooth\", [\"\", \"282e3a\"], false, null],\n    [\"u599-st40\", \"U599\", \"ST40\", \"Indigo Blue\", \"unicolours\", \"solid\", \"232530\", \"products/in_5035897f-8115-4c56-8668-e1ee8109a64d.jpg?v=1674469452\", \"none\", 900, 525, \"assumed\", \"15460535075201\", \"mfc-egger-u599-st40-indigo-blue\", [[18.5, \"55929310937473\"]], [], \"grain\", null, false, null],\n    [\"u599-tm9\", \"U599\", \"TM9\", \"Indigo Blue Perfect Matt\", \"unicolours\", \"solid\", \"1f2937\", \"files/2_01839c68-de5c-4292-a616-810ce159ab77.jpg?v=1725002098\", \"none\", 900, 675, \"assumed\", \"7917626720425\", \"mfc-egger-u599-tm9-indigo-blue-perfect-matt\", [[19, \"43736016453801\"]], [], \"lacquer\", [\"\", \"282e3a\"], false, null],\n    [\"u604-st9\", \"U604\", \"ST9\", \"Reed Green\", \"unicolours\", \"solid\", \"747e72\", \"files/EggerU604ST9.jpg?v=1724925531\", \"none\", 900, 675, \"assumed\", \"7930664321193\", \"mfc-egger-u604-st9-reed-green\", [[18, \"43736020779177\"]], [], \"smooth\", [\"\", \"757f73\"], false, null],\n    [\"u604-st40\", \"U604\", \"ST40\", \"Reed Green\", \"unicolours\", \"solid\", \"747e72\", \"files/EggerU604ST9.jpg?v=1724925531\", \"none\", 900, 675, \"assumed\", \"15460535107969\", \"mfc-egger-u604-st40-reed-green\", [[18.5, \"55929311265153\"]], [], \"grain\", null, false, null],\n    [\"u604-tm9\", \"U604\", \"TM9\", \"Reed Green\", \"unicolours\", \"solid\", \"747e72\", \"files/EggerU604ST9.jpg?v=1724925531\", \"none\", 900, 675, \"assumed\", \"15460536353153\", \"mfc-egger-u604-tm9-reed-green\", [[19, \"55929319883137\"]], [], \"lacquer\", [\"\", \"757f73\"], false, null],\n    [\"u636-st9\", \"U636\", \"ST9\", \"Fjord Green\", \"unicolours\", \"solid\", \"8f9a98\", \"products/g__17458.jpg?v=1612978707\", \"none\", 900, 525, \"assumed\", \"6449159372969\", \"egger-u636-st9-fjord-green\", [[18, \"43735992991913\"]], [], \"smooth\", [\"\", \"909e9d\"], false, null],\n    [\"u638-st9\", \"U638\", \"ST9\", \"Sage Green\", \"unicolours\", \"solid\", \"c1baa2\", \"files/EggerU638ST9.jpg?v=1724998589\", \"none\", 900, 675, \"assumed\", \"7930661306537\", \"mfc-egger-u638-st9-sage-green\", [[18, \"43736020615337\"]], [], \"smooth\", [\"\", \"c1baa2\"], false, null],\n    [\"u638-st40\", \"U638\", \"ST40\", \"Sage Green\", \"unicolours\", \"solid\", \"c1baa2\", \"files/EggerU638ST9.jpg?v=1724998589\", \"none\", 900, 675, \"assumed\", \"15460535140737\", \"mfc-egger-u638-st40-sage-green\", [[18.5, \"55929311494529\"]], [], \"grain\", null, false, null],\n    [\"u645-st9\", \"U645\", \"ST9\", \"Agave Green\", \"unicolours\", \"solid\", \"646050\", \"files/EggerU645ST9.jpg?v=1724998270\", \"none\", 900, 675, \"assumed\", \"7930667466921\", \"mfc-egger-u645-st9-agave-green\", [[18, \"43736020877481\"]], [], \"smooth\", [\"\", \"6b694f\"], false, null],\n    [\"u665-st9\", \"U665\", \"ST9\", \"Stone Green\", \"unicolours\", \"solid\", \"525a58\", \"files/EggerU665ST9.jpg?v=1724997792\", \"none\", 900, 675, \"assumed\", \"7930669236393\", \"mfc-egger-u665-st9-stone-green\", [[18, \"43736021041321\"]], [], \"smooth\", [\"\", \"516260\"], false, null],\n    [\"u669-st9\", \"U669\", \"ST9\", \"Estate Green\", \"unicolours\", \"solid\", \"808079\", \"files/U669.png?v=1776261933\", \"none\", 900, 902, \"assumed\", \"15363405939073\", \"mfc-egger-u669-st9-estate-green\", [[18, \"55531950670209\"]], [], \"smooth\", null, false, null],\n    [\"u699-st9\", \"U699\", \"ST9\", \"Fir Green\", \"unicolours\", \"solid\", \"1a362b\", \"files/EggerU699ST9.jpg?v=1724997628\", \"none\", 900, 675, \"assumed\", \"7930671661225\", \"mfc-egger-u699-st9-fir-green\", [[18, \"43736021139625\"]], [], \"smooth\", [\"\", \"1c3629\"], false, null],\n    [\"u699-st40\", \"U699\", \"ST40\", \"Fir Green\", \"unicolours\", \"solid\", \"1a362b\", \"files/EggerU699ST9.jpg?v=1724997628\", \"none\", 900, 675, \"assumed\", \"15460535173505\", \"mfc-egger-u699-st40-fir-green\", [[18.5, \"55929311723905\"]], [], \"grain\", null, false, null],\n    [\"u699-tm9\", \"U699\", \"TM9\", \"Fir Green\", \"unicolours\", \"solid\", \"1a362b\", \"files/EggerU699ST9.jpg?v=1724997628\", \"none\", 900, 675, \"assumed\", \"15460536385921\", \"mfc-egger-u699-tm9-fir-green\", [[19, \"55929320112513\"]], [], \"lacquer\", null, false, null],\n    [\"u702-st9\", \"U702\", \"ST9\", \"Cashmere Grey\", \"unicolours\", \"solid\", \"d7cab8\", \"products/cas__22351.jpg?v=1612978718\", \"none\", 900, 525, \"assumed\", \"6449159438505\", \"egger-u702-st9-cashmere-grey\", [[8, \"43735993155753\"], [18, \"43735993319593\"]], [], \"smooth\", [\"\", \"d8cabd\"], false, null],\n    [\"u702-st40\", \"U702\", \"ST40\", \"Cashmere Grey\", \"unicolours\", \"solid\", \"d7cab8\", \"products/cas__22351.jpg?v=1612978718\", \"none\", 900, 525, \"assumed\", \"15460535206273\", \"mfc-egger-u702-st40-cashmere-grey\", [[18.5, \"55929311986049\"]], [], \"grain\", null, false, null],\n    [\"u705-st9\", \"U705\", \"ST9\", \"Angora Grey\", \"unicolours\", \"solid\", \"e1dcd2\", \"files/EggerU705ST9.jpg?v=1709532570\", \"none\", 900, 675, \"assumed\", \"7929625936041\", \"mfc-egger-u705-st9-angora-grey\", [[18, \"43736019140777\"]], [], \"smooth\", [\"\", \"e2dcd0\"], false, null],\n    [\"u707-st9\", \"U707\", \"ST9\", \"Silk Grey\", \"unicolours\", \"solid\", \"e4e0e0\", \"files/EggerU707ST9.jpg?v=1709507188\", \"none\", 900, 675, \"assumed\", \"7929507610793\", \"mfc-egger-u707-st9-silk-grey\", [[18, \"43736018878633\"]], [], \"smooth\", [\"\", \"e4e1dc\"], false, null],\n    [\"u708-st9\", \"U708\", \"ST9\", \"Matt Light Grey\", \"unicolours\", \"solid\", \"d3cdc3\", \"products/z__23193_e084f568-c26b-40b7-bec1-9ebcd6262993.jpg?v=1669209262\", \"none\", 900, 525, \"assumed\", \"7660644991145\", \"mfc-egger-u708-st9-matt-light-grey\", [[8, \"43736007508137\"], [18, \"43736007409833\"]], [], \"smooth\", [\"\", \"d3cec7\"], false, null],\n    [\"u708-st40\", \"U708\", \"ST40\", \"Matt Light Grey\", \"unicolours\", \"solid\", \"d3cdc3\", \"products/z__23193_e084f568-c26b-40b7-bec1-9ebcd6262993.jpg?v=1669209262\", \"none\", 900, 525, \"assumed\", \"15460535730561\", \"mfc-egger-u708-st40-matt-light-grey\", [[18.5, \"55929315361153\"]], [], \"grain\", null, false, null],\n    [\"u717-st9\", \"U717\", \"ST9\", \"Dakar Grey\", \"unicolours\", \"solid\", \"b7ad96\", \"products/9__94964.jpg?v=1612978715\", \"none\", 900, 525, \"assumed\", \"6449159471273\", \"egger-u717-st9-dakar-grey\", [[8, \"55929263358337\"], [18, \"43735993417897\"]], [], \"smooth\", null, false, null],\n    [\"u727-st9\", \"U727\", \"ST9\", \"Stone Grey\", \"unicolours\", \"solid\", \"a29583\", \"products/34__17969.jpg?v=1612978710\", \"none\", 900, 525, \"assumed\", \"6449159504041\", \"egger-u727-st9-stone-grey\", [[8, \"43735993516201\"], [18, \"43735993614505\"]], [], \"smooth\", [\"\", \"a69889\"], false, null],\n    [\"u732-st9\", \"U732\", \"ST9\", \"Dust Grey\", \"unicolours\", \"solid\", \"7b7b79\", \"products/x__91620.jpg?v=1612978703\", \"none\", 900, 525, \"assumed\", \"6449158946985\", \"egger-u732-st9-dust-grey\", [[8, \"43735991648425\"], [16, \"43735991746729\"], [18, \"43735991156905\"]], [], \"smooth\", [\"\", \"838683\"], false, null],\n    [\"u732-st40\", \"U732\", \"ST40\", \"Dust Grey\", \"unicolours\", \"solid\", \"7b7b79\", \"products/x__91620.jpg?v=1612978703\", \"none\", 900, 525, \"assumed\", \"15460535763329\", \"mfc-egger-u732-st40-dust-grey\", [[18.5, \"55929315688833\"]], [], \"grain\", null, false, null],\n    [\"u740-st9\", \"U740\", \"ST9\", \"Dark Taupe\", \"unicolours\", \"solid\", \"888072\", \"files/EggerU740ST9.jpg?v=1724999113\", \"none\", 900, 675, \"assumed\", \"7930036846761\", \"mfc-egger-u740-st9-dark-taupe\", [[18, \"43736019927209\"]], [], \"smooth\", [\"\", \"908679\"], false, null],\n    [\"u740-tm9\", \"U740\", \"TM9\", \"Dark Taupe\", \"unicolours\", \"solid\", \"888072\", \"files/EggerU740ST9.jpg?v=1724999113\", \"none\", 900, 675, \"assumed\", \"15460536418689\", \"mfc-egger-u740-tm9-dark-taupe\", [[19, \"55929320341889\"]], [], \"lacquer\", [\"\", \"908679\"], false, null],\n    [\"u741-st9\", \"U741\", \"ST9\", \"Lava Grey\", \"unicolours\", \"solid\", \"555048\", \"products/lava__39761.jpg?v=1612978715\", \"none\", 900, 525, \"assumed\", \"6449159536809\", \"egger-u741-st9-lava-grey\", [[18, \"43735993745577\"]], [], \"smooth\", [\"\", \"5e5751\"], false, null],\n    [\"u748-st9\", \"U748\", \"ST9\", \"Truffle Brown\", \"unicolours\", \"solid\", \"5e534b\", \"files/EggerU748ST9.jpg?v=1724999517\", \"none\", 900, 675, \"assumed\", \"7930027081897\", \"mfc-egger-u748-st9-truffle-brown\", [[18, \"43736019730601\"]], [], \"smooth\", [\"\", \"695a51\"], false, null],\n    [\"u750-st9\", \"U750\", \"ST9\", \"Taupe Grey\", \"unicolours\", \"solid\", \"cfc6b5\", \"products/c__80803.jpg?v=1612978702\", \"none\", 900, 525, \"assumed\", \"6449158979753\", \"egger-u750-st9-taupe-grey\", [[8, \"44098954821801\"], [18, \"43735991845033\"]], [], \"smooth\", [\"\", \"d2c8ba\"], false, null],\n    [\"u750-tm9\", \"U750\", \"TM9\", \"Taupe Grey\", \"unicolours\", \"solid\", \"cfc6b5\", \"files/EggerU750TM9.jpg?v=1725000675\", \"none\", 900, 675, \"assumed\", \"7927783293097\", \"mfc-egger-u750-tm9-taupe-grey\", [[19, \"43736017043625\"]], [], \"lacquer\", [\"\", \"d2c8ba\"], false, null],\n    [\"u755-st9\", \"U755\", \"ST9\", \"Havanna Grey\", \"unicolours\", \"solid\", \"504547\", \"files/original_913b5954-8a79-443b-8192-acaf114479c1.jpg?v=1784329745\", \"none\", 1300, 2800, \"board\", \"15460537434497\", \"mfc-egger-u755-st9-havanna-grey\", [[18, \"55929323782529\"]], [], \"smooth\", [\"\", \"4e4647\"], false, null],\n    [\"u763-st9\", \"U763\", \"ST9\", \"Pearl Grey\", \"unicolours\", \"solid\", \"c1bcb4\", \"products/pe__31504.jpg?v=1612978720\", \"none\", 900, 525, \"assumed\", \"6449159635113\", \"egger-u763-st9-pearl-grey\", [[8, \"43735993942185\"], [18, \"43735993843881\"]], [], \"smooth\", [\"\", \"c2bfba\"], false, null],\n    [\"u767-st9\", \"U767\", \"ST9\", \"Cubanit Grey\", \"unicolours\", \"solid\", \"837a6f\", \"files/EggerU767ST9.jpg?v=1724999324\", \"none\", 900, 675, \"assumed\", \"7930030522537\", \"mfc-egger-u767-st9-cubanit-grey\", [[18, \"43736019828905\"]], [\"7905549615273\"], \"smooth\", [\"\", \"897f74\"], false, null],\n    [\"u767-st40\", \"U767\", \"ST40\", \"Matt Cubanit Grey\", \"unicolours\", \"solid\", \"837a6f\", \"files/U767.jpg?v=1725003240\", \"none\", 900, 675, \"assumed\", \"15460535828865\", \"mfc-egger-u767-st40-matt-cubanit-grey\", [[18.5, \"55929316278657\"]], [], \"grain\", null, false, null],\n    [\"u775-st9\", \"U775\", \"ST9\", \"White Grey\", \"unicolours\", \"solid\", \"e6e1d7\", \"products/xxx__59328.jpg?v=1612978717\", \"none\", 900, 525, \"assumed\", \"6449159667881\", \"egger-u775-st9-white-grey\", [[8, \"43735994499241\"], [18, \"43735994040489\"]], [], \"smooth\", [\"\", \"e9e4dc\"], false, null],\n    [\"u780-st9\", \"U780\", \"ST9\", \"Monument Grey\", \"unicolours\", \"solid\", \"74777b\", \"products/bbb__05916.jpg?v=1612978713\", \"none\", 900, 525, \"assumed\", \"6449159700649\", \"egger-u780-st9-monument-grey\", [[18, \"43735994597545\"]], [], \"smooth\", [\"\", \"767d83\"], false, null],\n    [\"u780-st40\", \"U780\", \"ST40\", \"Monument Grey\", \"unicolours\", \"solid\", \"74777b\", \"products/bbb__05916.jpg?v=1612978713\", \"none\", 900, 525, \"assumed\", \"15460535861633\", \"mfc-egger-u780-st40-monument-grey\", [[18.5, \"55929316606337\"]], [], \"grain\", null, false, null],\n    [\"u780-tm9\", \"U780\", \"TM9\", \"Monument Grey Perfect Matt\", \"unicolours\", \"solid\", \"747b82\", \"files/original_c4719b32-b430-486a-9fb8-7c105f3fc30a.jpg?v=1784363543\", \"none\", 1300, 2800, \"board\", \"7903289147561\", \"mfc-egger-u780-tm9-monument-grey-perfect-matt-1\", [[19, \"43736014061737\"]], [], \"lacquer\", [\"\", \"767d83\"], false, null],\n    [\"u788-st9\", \"U788\", \"ST9\", \"Arctic Grey\", \"unicolours\", \"solid\", \"949092\", \"files/EggerU788ST9.jpg?v=1709531018\", \"none\", 900, 675, \"assumed\", \"7929620725929\", \"mfc-egger-u788-st9-arctic-grey\", [[18, \"43736018976937\"]], [], \"smooth\", [\"\", \"9a9492\"], false, null],\n    [\"u818-st9\", \"U818\", \"ST9\", \"Dark Brown\", \"unicolours\", \"solid\", \"473328\", \"files/EggerU818ST9.jpg?v=1724998773\", \"none\", 900, 675, \"assumed\", \"7930659897513\", \"mfc-egger-u818-st9-dark-brown\", [[18, \"43736020484265\"]], [], \"smooth\", [\"\", \"55392a\"], false, null],\n    [\"u899-st9\", \"U899\", \"ST9\", \"Soft Black\", \"unicolours\", \"solid\", \"2f2b2b\", \"products/bla__20086.jpg?v=1612978718\", \"none\", 900, 525, \"assumed\", \"6449159733417\", \"egger-u899-st9-soft-black\", [[8, \"43735994794153\"], [18, \"43735994695849\"]], [], \"smooth\", [\"\", \"3b3835\"], false, null],\n    [\"u899-tm9\", \"U899\", \"TM9\", \"Soft Black\", \"unicolours\", \"solid\", \"2f2b2b\", \"products/bla__20086.jpg?v=1612978718\", \"none\", 900, 525, \"assumed\", \"15460536451457\", \"mfc-egger-u899-tm9-soft-black\", [[19, \"55929320571265\"]], [], \"lacquer\", null, false, null],\n    [\"u960-st9\", \"U960\", \"ST9\", \"Onyx Grey\", \"unicolours\", \"solid\", \"5e5c5b\", \"products/z__93598.jpg?v=1612978723\", \"none\", 900, 525, \"assumed\", \"6449159766185\", \"egger-u960-st9-onyx-grey\", [[8, \"55929263456641\"], [16, \"43735994990761\"], [18, \"43735994892457\"]], [], \"smooth\", [\"\", \"6a6867\"], false, null],\n    [\"u960-tm9\", \"U960\", \"TM9\", \"Onyx Grey\", \"unicolours\", \"solid\", \"636264\", \"files/EggerU960TM9.jpg?v=1725000358\", \"none\", 900, 675, \"assumed\", \"7929501253801\", \"mfc-egger-u960-tm9-onyx-grey\", [[19, \"43736018616489\"]], [], \"lacquer\", [\"\", \"6a6867\"], false, null],\n    [\"u961-st7\", \"U961\", \"ST7\", \"Graphite Grey\", \"unicolours\", \"solid\", \"2c2624\", \"products/x__61536.jpg?v=1612978720\", \"none\", 900, 525, \"assumed\", \"6449159831721\", \"egger-u961-st2-graphite-grey\", [[8, \"43735995187369\"], [16, \"54166373532033\"], [18, \"43735995089065\"]], [], \"structured\", [\"\", \"403a38\"], false, null],\n    [\"u961-st40\", \"U961\", \"ST40\", \"Graphite Grey\", \"unicolours\", \"solid\", \"2c2624\", \"products/x__61536.jpg?v=1612978720\", \"none\", 900, 525, \"assumed\", \"15460535894401\", \"mfc-egger-u961-st40-graphite-grey\", [[18.5, \"55929316835713\"]], [], \"grain\", null, false, null],\n    [\"u963-st9\", \"U963\", \"ST9\", \"Diamond Grey\", \"unicolours\", \"solid\", \"414141\", \"files/EggerU963ST9.jpg?v=1709534653\", \"none\", 900, 675, \"assumed\", \"7929628983465\", \"mfc-egger-u963-st9-diamond-grey\", [[18, \"43736019239081\"]], [], \"smooth\", [\"\", \"4a4a4a\"], false, null],\n    [\"u968-st9\", \"U968\", \"ST9\", \"Carbon Grey\", \"unicolours\", \"solid\", \"2e2f35\", \"products/za__82394.jpg?v=1612978716\", \"none\", 900, 525, \"assumed\", \"6449159897257\", \"egger-u968-st9-carbon-grey\", [[8, \"55929263554945\"], [18, \"43735995416745\"]], [], \"smooth\", [\"\", \"37383e\"], false, null],\n    [\"u968-tm9\", \"U968\", \"TM9\", \"Carbon Grey\", \"unicolours\", \"solid\", \"2b2c32\", \"files/EggerU968TM9.jpg?v=1725001630\", \"none\", 900, 675, \"assumed\", \"7927774150825\", \"mfc-egger-u968-tm9-carbon-grey\", [[19, \"43736016945321\"]], [], \"lacquer\", [\"\", \"32353a\"], false, null],\n    [\"u999-pg\", \"U999\", \"PG\", \"Black\", \"unicolours\", \"solid\", \"030204\", \"products/99.jpg?v=1616511994\", \"none\", 900, 525, \"assumed\", \"6628683055273\", \"egger-u999-pg-black\", [[19, \"43736005181609\"]], [], \"gloss\", [\"\", \"040305\"], false, null],\n    [\"u999-st7\", \"U999\", \"ST7\", \"Black\", \"unicolours\", \"solid\", \"000009\", \"files/EggerU999ST7.jpg?v=1725000188\", \"none\", 900, 675, \"assumed\", \"7929503547561\", \"mfc-egger-u999-st7-black\", [[8, \"44470599385257\"], [18, \"43736018747561\"]], [], \"structured\", [\"\", \"040305\"], false, null],\n    [\"u999-st19\", \"U999\", \"ST19\", \"Black\", \"unicolours\", \"solid\", \"030204\", \"files/blackl_eb353642-93b6-4782-972c-01e463601c35.jpg?v=1725004848\", \"none\", 900, 525, \"assumed\", \"7312608592041\", \"egger-u999-st19-black\", [[18, \"43736005607593\"]], [], \"grain\", [\"\", \"040305\"], false, null],\n    [\"u999-st20\", \"U999\", \"ST20\", \"Black\", \"unicolours\", \"solid\", \"000009\", \"files/EggerU999ST20-2.jpg?v=1725000543\", \"none\", 900, 675, \"assumed\", \"7929499222185\", \"mfc-egger-u999-st20-black\", [[18, \"43736017141929\"]], [], \"structured\", [\"\", \"040305\"], false, null],\n    [\"u999-st40\", \"U999\", \"ST40\", \"Black\", \"unicolours\", \"solid\", \"030204\", \"files/blackl_eb353642-93b6-4782-972c-01e463601c35.jpg?v=1725004848\", \"none\", 900, 525, \"assumed\", \"15460535927169\", \"mfc-egger-u999-st40-black\", [[18.5, \"55929317392769\"]], [], \"grain\", null, false, null],\n    [\"u999-tm28\", \"U999\", \"TM28\", \"Black\", \"unicolours\", \"solid\", \"020103\", \"files/original_210d9561-145e-45d3-98dc-377c0ff2d825.jpg?v=1784363541\", \"none\", 1300, 2800, \"board\", \"14879836373377\", \"mfc-egger-u999-tm28-black\", [[19, \"53809759158657\"]], [], \"lacquer\", [\"\", \"040305\"], false, null],\n    [\"w980-sm\", \"W980\", \"SM\", \"Platinum White\", \"whites\", \"solid\", \"fdf9ec\", \"products/w980__41643.jpg?v=1612978697\", \"none\", 900, 525, \"assumed\", \"6449158586537\", \"egger-w980-sm-platinum-white\", [[8, \"43735989846185\"], [18, \"43735989747881\"]], [], \"structured\", [\"\", \"fdfaed\"], false, null],\n    [\"w980-st7\", \"W980\", \"ST7\", \"Platinum White\", \"whites\", \"solid\", \"fdf9ec\", \"products/a__50077.jpg?v=1612978697\", \"none\", 900, 525, \"assumed\", \"6449158619305\", \"egger-w980-st2-platinum-white\", [[8, \"43735990173865\"], [18, \"43735989944489\"]], [], \"structured\", [\"\", \"fdfaed\"], false, null],\n    [\"w980-st40\", \"W980\", \"ST40\", \"Platinum White with grain\", \"whites\", \"solid\", \"fdf9ec\", \"products/a__50077.jpg?v=1612978697\", \"none\", 900, 525, \"assumed\", \"15285707899265\", \"mfc-egger-w980-st40-platinum-white\", [[18, \"55153211965825\"]], [], \"grain\", null, false, null],\n    [\"white\", \"W1000\", \"ST9\", \"Premium White\", \"whites\", \"solid\", \"fcfcf2\", \"products/q__12744.jpg?v=1612978702\", \"none\", 900, 525, \"assumed\", \"6449159012521\", \"egger-w1000-st9-premium-white\", [[8, \"54972304392577\"], [16, \"54913534787969\"], [18, \"54931936313729\"]], [], \"smooth\", null, false, null],\n    [\"w1000-st19\", \"W1000\", \"ST19\", \"Premium White with grain\", \"whites\", \"solid\", \"fcfcf2\", \"products/q__12744_a374d9d0-a988-4078-8817-f9f666d44646.jpg?v=1658591665\", \"none\", 900, 525, \"assumed\", \"7546785464489\", \"mfc-egger-w1000-st19-premium-white-with-grain\", [[18, \"43736006688937\"]], [], \"grain\", [\"\", \"fbfcf3\"], false, null],\n    [\"w1000-st30\", \"W1000\", \"ST30\", \"Gloss Premium White\", \"whites\", \"solid\", \"fcfcf2\", \"products/q__12744.jpg?v=1612978702\", \"none\", 900, 525, \"assumed\", \"14847988433281\", \"mfc-egger-w1000-st30-premium-white\", [[18, \"53676588368257\"]], [], \"structured\", null, false, null],\n    [\"w1000-st40\", \"W1000\", \"ST40\", \"Premium White\", \"whites\", \"solid\", \"fcfcf2\", \"products/q__12744.jpg?v=1612978702\", \"none\", 900, 525, \"assumed\", \"15460536222081\", \"mfc-egger-w1000-st40-premium-white\", [[18, \"55929318474113\"]], [], \"grain\", null, false, null],\n    [\"w1100\", \"W1100\", \"ST9\", \"Alpine White\", \"whites\", \"solid\", \"f9fbee\", \"files/whitegloss_aa598b6c-d140-47e5-924d-ebe36bbb33c0.jpg?v=1709650144\", \"none\", 900, 846, \"assumed\", \"7931179270313\", \"mfc-egger-w1100-st9-premium-white\", [[8, \"43736022876329\"], [18, \"43736022745257\"]], [], \"smooth\", null, false, null],\n    [\"w1100-tm9\", \"W1100\", \"TM9\", \"Alpine White Perfect Matt\", \"whites\", \"solid\", \"f9fbee\", \"files/whitegloss_3bb9479a-413b-4e99-9604-e22753d90965.jpg?v=1725003909\", \"none\", 900, 846, \"assumed\", \"7769040945321\", \"mfc-egger-u780-tm9-monument-grey-perfect-matt\", [[19, \"43736010752169\"]], [], \"lacquer\", [\"\", \"fefff8\"], false, null],\n    [\"w1200-st9\", \"W1200\", \"ST9\", \"Porcelain White\", \"whites\", \"solid\", \"f6f0e2\", \"products/pw__03402.jpg?v=1612978706\", \"none\", 900, 525, \"assumed\", \"6449159110825\", \"egger-w1200-st9-porcelain-white\", [[8, \"43735992336553\"], [18, \"43735992238249\"]], [], \"smooth\", [\"\", \"f6f0e4\"], false, null],\n    [\"w1200-st40\", \"W1200\", \"ST40\", \"Porcelain White\", \"whites\", \"solid\", \"f6f0e2\", \"products/pw__03402.jpg?v=1612978706\", \"none\", 900, 525, \"assumed\", \"15460535959937\", \"mfc-egger-w1200-st40-porcelain-white\", [[18.5, \"55929317687681\"]], [], \"grain\", null, false, null]\n  ];\n  var EGGER_DECORS = ROWS.map(function(r) {\n    return {\n      key: r[0],\n      code: r[1],\n      tex: r[2],\n      name: r[3],\n      group: r[4],\n      kind: r[5],\n      hex: r[17] && r[17][1] ? r[17][1] : r[6],\n      shopHex: r[6],\n      img: r[7],\n      grain: r[8],\n      mm: [r[9], r[10]],\n      scale: r[11],\n      pid: r[12],\n      handle: r[13],\n      variants: r[14],\n      alsoPids: r[15],\n      surface: r[16],\n      rawTex: r[17] ? r[17][0] : \"\",\n      rawHex: r[17] ? r[17][1] : \"\",\n      retired: r[18] === true,\n      pack: r[19] ? {\n        url: r[19][0],\n        high: r[19][1],\n        mm: [r[19][2], r[19][3]],\n        grain: r[19][4],\n        repeat: r[19][5],\n        offsetMm: r[19][6],\n        qual: r[19][7]\n      } : null,\n      label: \"Egger \" + r[1] + \" \" + r[2] + \" \" + r[3]\n    };\n  });\n  var OFFERED_DECORS = EGGER_DECORS.filter(function(d) {\n    return !d.retired;\n  });\n  var DECOR_BY_KEY = {};\n  EGGER_DECORS.forEach(function(d) {\n    DECOR_BY_KEY[d.key] = d;\n  });\n  function decorOf(key) {\n    return Object.prototype.hasOwnProperty.call(DECOR_BY_KEY, key) ? DECOR_BY_KEY[key] : null;\n  }\n  var DECOR_TEXTURE_API = \"https://chat.uniboards.co.uk/api/cabinet-lab/decor/\";\n  var RAW_MM = [1300, 2800];\n  function decorRawUrl(d) {\n    return d && d.rawTex ? DECOR_TEXTURE_API + d.rawTex : null;\n  }\n  function decorImageUrl(d, width) {\n    if (!d || !d.img) return null;\n    const u = /^https?:/.test(d.img) ? d.img : DECOR_CDN + d.img;\n    return u + (u.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + \"width=\" + (width || 1024);\n  }\n  function decorGrained(key) {\n    const d = decorOf(key);\n    if (!d) return false;\n    if (d.kind === \"solid\") return d.surface === \"grain\";\n    return d.group === \"woods\" || d.grain !== \"none\";\n  }\n  function decorSurface(d) {\n    return d && Object.prototype.hasOwnProperty.call(DECOR_SURFACES, d.surface) ? DECOR_SURFACES[d.surface] : DECOR_SURFACES.smooth;\n  }\n  function decorShort(d) {\n    return d ? d.code + \" \" + d.tex + \" \" + d.name : \"\";\n  }\n  function decorBoard(d) {\n    if (!d || !d.variants || !d.variants.length) return null;\n    const v18 = d.variants.find(function(v2) {\n      return v2[0] === 18;\n    });\n    if (v18) return { mm: 18, variant: v18[1], exact: true, note: \"\" };\n    const near2 = d.variants.filter(function(v2) {\n      return v2[0] > 18 && v2[0] <= 19;\n    });\n    if (!near2.length) return null;\n    const v = near2[0];\n    return {\n      mm: v[0],\n      variant: v[1],\n      exact: false,\n      note: \"Sold as a \" + v[0] + \" mm board only: drawn at 18 mm, cut and quoted from the \" + v[0] + \" mm board.\"\n    };\n  }\n\n  // v2/src/model/gola.js\n  var GOLA_SOURCES = {\n    J: \"https://expresskitchenfittings.com/cdn/shop/products/profile_j_dims.jpg?v=1652932508&width=1125\",\n    C: \"https://cdn.shopify.com/s/files/1/0569/4885/0722/products/profile_c_dims.jpg?v=1652932531\"\n  };\n  var GOLA_PROFILES = {\n    J: {\n      key: \"J\",\n      sku: \"05-00097\",\n      role: \"top\",\n      name: \"Gola J profile (top, horizontal)\",\n      down: 56.5,\n      sectionHeight: 56.9,\n      back: 27,\n      barMm: 4100,\n      source: GOLA_SOURCES.J,\n      section: \"https://www.fittingsco.co.uk/cdn/shop/files/GOLAJDIMS.png?v=1785231364\",\n      /* J DATUM CONFLICT (root QA 06.10.2026). The installed schematic (file stamp 1652932508 = 19.05.2022) gives 56.5\n         from the worktop underside to the bottom of the cut-out; the current section of the same SKU (stamp 1785231364 =\n         28.07.2026), turned 90 degrees to the fitted position, is 56.9 overall - 0.4 MORE than that cut-out. Whether\n         this is rounding or a revised extrusion the drawings do not say, so neither is asserted as production fact:\n         the owner's installed nominal (56.5, minus the top in case A) is kept and reported, but the cut starts from the\n         larger envelope - the current 56.9 section (minus the top in case A) - plus the explicit clearance, so it is\n         never under the extrusion and the clearance is a real clearance; every enquiry asks for the\n         supplier / a sample to confirm before cutting. BACK 27 is the installed drawing's alone: the section has no\n         overall-depth dimension (26.4 is the channel, 7.6 the upstand) and none is made up by adding them. */\n      confirm: \"J 05-00097: installed schematic (2022) 56.5 vs current section (2026) 56.9 overall - notch never under the section; confirm the drop and the 27 setback with the supplier or a sample before cutting\"\n    },\n    C: {\n      key: \"C\",\n      sku: \"05-01199\",\n      role: \"mid\",\n      name: \"Gola C profile (between drawers, horizontal)\",\n      installedCut: 73,\n      profileHeight: 73.5,\n      height: 73.5,\n      back: 26,\n      barMm: 4100,\n      source: GOLA_SOURCES.C,\n      section: \"https://www.fittingsco.co.uk/cdn/shop/files/GOLACDIMS.png?v=1785231422\"\n    }\n  };\n  var GOLA_UNVERIFIED = [\n    { sku: \"05-79363\", name: \"Gola wall unit profile (horizontal)\" },\n    { sku: \"05-86675\", name: \"Gola E profile (vertical end)\" },\n    { sku: \"05-18223\", name: \"Gola D profile (vertical central)\" }\n  ];\n  var CONSTRUCTIONS = [\"top-on-sides\", \"top-between-sides\"];\n  var GOLA_THROUGH_OVERRUN = 0.2;\n  var GOLA_DEFAULT = { on: false, wall: false, clearance: 0, topGap: 27, cGap: 27 };\n  var GOLA_LIMITS = { clearance: [0, 3], topGap: [10, 45], cGap: [10, 60] };\n  function num3(v) {\n    const n = Number(v);\n    return v === null || v === \"\" || !isFinite(n) ? null : n;\n  }\n  function clampTo(v, lim) {\n    return Math.min(lim[1], Math.max(lim[0], v));\n  }\n  function normGola(g2) {\n    g2 = g2 && typeof g2 === \"object\" ? g2 : {};\n    const out = { on: g2.on === true, wall: g2.wall === true };\n    for (const k of [\"clearance\", \"topGap\", \"cGap\"]) {\n      const v = num3(g2[k]);\n      out[k] = v == null ? GOLA_DEFAULT[k] : Math.round(clampTo(v, GOLA_LIMITS[k]) * 10) / 10;\n    }\n    return out;\n  }\n  function golaNotchDown(opts) {\n    const o = opts || {};\n    const P2 = GOLA_PROFILES[o.profile || \"J\"];\n    if (!P2 || P2.role !== \"top\") return { ok: false, why: \"Only the J top profile has a verified notch-down rule\" };\n    if (CONSTRUCTIONS.indexOf(o.construction) < 0)\n      return { ok: false, why: \"Say how the top is built - a top cap ON the sides, or a top / rails BETWEEN the sides\" };\n    const t = num3(o.topT), b = num3(o.boardT), c = num3(o.clearance);\n    if (t == null || !(t > 0)) return { ok: false, why: \"The top thickness is needed (in both constructions)\" };\n    if (b == null || !(b > 0)) return { ok: false, why: \"The board thickness of the sides is needed\" };\n    if (c == null || c < 0) return { ok: false, why: \"State the fitting clearance (0 is a valid answer)\" };\n    const onSides = o.construction === \"top-on-sides\";\n    const nominal = onSides ? P2.down - t : P2.down;\n    if (!(nominal > 0)) return { ok: false, why: \"A \" + t + \" mm top is thicker than the profile's \" + P2.down + \" mm drop\" };\n    const env2 = Math.max(P2.down, P2.sectionHeight);\n    const floor = onSides ? env2 - t : env2;\n    const down = floor + c;\n    const raised = floor > nominal + 1e-9;\n    return {\n      ok: true,\n      profile: P2.key,\n      sku: P2.sku,\n      construction: o.construction,\n      topT: t,\n      boardT: b,\n      clearance: c,\n      nominal: round12(nominal),\n      floor: round12(floor),\n      down: round12(down),\n      raised,\n      back: P2.back,\n      confirm: P2.confirm,\n      formula: (onSides ? P2.down + \" - \" + t + \" + \" + c : P2.down + \" + \" + c) + (raised ? \" on the installed drawing; cut from the \" + env2 + \" section: \" + env2 + (onSides ? \" - \" + t : \"\") + \" + \" + c : \"\")\n    };\n  }\n  function golaCRecess(yc, clearance) {\n    const c = num3(clearance);\n    if (c == null || c < 0) return { ok: false, why: \"State the fitting clearance (0 is a valid answer)\" };\n    const h = GOLA_PROFILES.C.height + c;\n    return {\n      ok: true,\n      profile: \"C\",\n      sku: GOLA_PROFILES.C.sku,\n      yc,\n      y0: yc - h / 2,\n      y1: yc + h / 2,\n      height: round12(h),\n      back: GOLA_PROFILES.C.back\n    };\n  }\n  function round12(v) {\n    return Math.round(v * 10) / 10;\n  }\n  function round2(v) {\n    return Math.round(v * 100) / 100;\n  }\n  function wasteSide(start2, seg, waste) {\n    const dx = seg[0] - start2[0], dy = seg[1] - start2[1];\n    const wx = waste[0] - start2[0], wy = waste[1] - start2[1];\n    const cr = dx * wy - dy * wx;\n    return cr > 0 ? \"left\" : \"right\";\n  }\n  function notchPath(n) {\n    const L = n.L, B = n.back, a0 = n.from, a1 = n.from + n.len, rh = n.hand === \"RH\";\n    const X = (x) => round2(rh ? L - x : x);\n    let start2, segs;\n    if (a0 <= 1e-3) {\n      start2 = [X(0), B];\n      segs = [[X(a1), B], [X(a1), 0]];\n    } else {\n      start2 = [X(a0), 0];\n      segs = [[X(a0), B], [X(a1), B], [X(a1), 0]];\n    }\n    const waste = [X((a0 + a1) / 2), B / 2];\n    return {\n      id: n.kind === \"J\" ? \"gola_j_notch\" : \"gola_c_notch\",\n      kind: n.kind,\n      hand: rh ? \"RH\" : \"LH\",\n      frame: \"y-up: x along the length from the panel's top end (LH x=0, RH x=L), y from the front edge\",\n      start: start2,\n      segments: segs.map((p) => ({ type: \"ptpt\", x: p[0], y: p[1] })),\n      correction: wasteSide(start2, segs[0], waste),\n      through: true,\n      depth: GOLA_THROUGH_OVERRUN,\n      rect: { x0: round2(Math.min(X(a0), X(a1))), x1: round2(Math.max(X(a0), X(a1))), y0: 0, y1: B }\n    };\n  }\n  function rect(u0, u1, v0, v1) {\n    return [[u0, v0], [u1, v0], [u1, v1], [u0, v1]];\n  }\n  function arcWall(cu, cv, r0, r111, a0, a1, n) {\n    const out = [];\n    for (let i = 0; i < n; i++) {\n      const t0 = a0 + (a1 - a0) * i / n, t1 = a0 + (a1 - a0) * (i + 1) / n;\n      const p = (r, t) => [cu + r * Math.cos(t), cv + r * Math.sin(t)];\n      out.push([p(r111, t0), p(r111, t1), p(r0, t1), p(r0, t0)]);\n    }\n    return out;\n  }\n  var WALL2 = 1.4;\n  var R = 6.5;\n  function sectionJ(down, back) {\n    const H2 = down, B = back, wu = 6.2;\n    const out = [];\n    const bendV = 4.3 + R;\n    out.push(rect(wu, wu + WALL2, bendV, H2 - WALL2));\n    out.push(rect(0, wu + WALL2, H2 - WALL2, H2));\n    out.push(rect(0, WALL2, H2 - 4, H2 - WALL2));\n    for (const v of [H2 * 0.2, H2 * 0.47]) {\n      out.push(rect(0, wu, v, v + WALL2));\n      out.push(rect(0, wu, v + 5.6, v + 5.6 + WALL2));\n      out.push(rect(0, WALL2, v + WALL2, v + 2.6));\n    }\n    arcWall(wu + R + WALL2 / 2, bendV, R - WALL2 / 2, R + WALL2 / 2, Math.PI, 1.5 * Math.PI, 4).forEach((q) => out.push(q));\n    out.push(rect(wu + R + WALL2 / 2, B - WALL2, 4.3 - WALL2 / 2, 4.3 + WALL2 / 2));\n    out.push(rect(B - WALL2, B, 0, 5));\n    out.push(rect(B - 4.5, B - WALL2, 0, WALL2));\n    return out;\n  }\n  function sectionC(height, back) {\n    const H2 = height, B = back, wu = 5.4, mid = H2 / 2;\n    const out = [];\n    const bLo = 4.3 + R, bHi = H2 - 4.3 - R;\n    out.push(rect(wu, wu + WALL2, bLo, bHi));\n    out.push(rect(0, wu, mid - 8.1, mid - 8.1 + WALL2));\n    out.push(rect(0, wu, mid + 8.1 - WALL2, mid + 8.1));\n    out.push(rect(0, WALL2, mid - 8.1 + WALL2, mid - 2.8));\n    out.push(rect(0, WALL2, mid + 2.8, mid + 8.1 - WALL2));\n    arcWall(wu + R + WALL2 / 2, bLo, R - WALL2 / 2, R + WALL2 / 2, Math.PI, 1.5 * Math.PI, 4).forEach((q) => out.push(q));\n    arcWall(wu + R + WALL2 / 2, bHi, R - WALL2 / 2, R + WALL2 / 2, 0.5 * Math.PI, Math.PI, 4).forEach((q) => out.push(q));\n    out.push(rect(wu + R + WALL2 / 2, B - WALL2, 4.3 - WALL2 / 2, 4.3 + WALL2 / 2));\n    out.push(rect(wu + R + WALL2 / 2, B - WALL2, H2 - 4.3 - WALL2 / 2, H2 - 4.3 + WALL2 / 2));\n    out.push(rect(B - WALL2, B, 0, 5));\n    out.push(rect(B - WALL2, B, H2 - 5, H2));\n    out.push(rect(B - 4.5, B - WALL2, 0, WALL2));\n    out.push(rect(B - 4.5, B - WALL2, H2 - WALL2, H2));\n    return out;\n  }\n  function golaBars(pieces, barMm) {\n    const bar = barMm || 4100;\n    const cuts = [];\n    for (const p of pieces || []) {\n      let left = Math.round(p);\n      while (left > bar) {\n        cuts.push(bar);\n        left -= bar;\n      }\n      if (left > 0) cuts.push(left);\n    }\n    cuts.sort((a, b) => b - a);\n    const bins = [];\n    for (const c of cuts) {\n      const b = bins.find((x) => x + c <= bar + 1e-3);\n      if (b != null) bins[bins.indexOf(b)] = b + c;\n      else bins.push(c);\n    }\n    return { total: cuts.reduce((a, b) => a + b, 0), bars: bins.length, cuts };\n  }\n  var PLANNER_BASE_BUILD = {\n    construction: \"top-between-sides\",\n    topT: T,\n    boardT: T,\n    what: \"sides full height, front and rear rails between the sides (no top cap)\"\n  };\n  var GOLA_TYPES = { base: 1, \"base-drawer\": 1, \"base-4drawer\": 1 };\n  function golaFace(u) {\n    const g2 = u && u.gola;\n    return g2 && g2.on === true && GOLA_TYPES[u.type] ? g2 : null;\n  }\n  function golaJ(u) {\n    const g2 = golaFace(u);\n    if (!g2) return null;\n    const r = golaNotchDown({ profile: \"J\", ...PLANNER_BASE_BUILD, clearance: g2.clearance });\n    return r.ok ? { ...r, y0: u.h - r.down, y1: u.h } : r;\n  }\n\n  // v2/src/model/front-materials.js\n  var rgb = (hex) => [(hex >> 16 & 255) / 255, (hex >> 8 & 255) / 255, (hex & 255) / 255];\n  var FRONT_MATS = [\n    { id: \"mfc\", name: \"Egger MFC\", note: \"Melamine faced board in an Egger decor\" },\n    { id: \"mdf-paint\", name: \"Painted MDF\", note: \"18 mm MDF with a water-based primer only - quoted\" }\n  ];\n  var PAINTED_MDF = \"MDF 18 mm (Standard Medite), water-based primer only\";\n  var PAINT_FINISHES = [\n    { id: \"satin-matt\", name: \"Satin / Matt\", source: \"Spray Finishing - Satin / Matt PU \\u2014 Solid Colour\", gloss: false },\n    { id: \"gloss\", name: \"Gloss\", source: 'Spray Finishing - Gloss \\u2014 Solid Colour (\"gun gloss\")', gloss: true },\n    { id: \"high-gloss\", name: \"High gloss\", source: \"Spray Finishing - High Gloss PU \\u2014 Solid Colour\", gloss: true }\n  ];\n  var PAINT_TONES = [\n    { id: \"white\", name: \"White\", hex: 15855850 },\n    /* a true neutral white #FFFFFF (task 1790948486103, owner: \u00ABBrilliant White\u00BB for painted MDF) - a preview tone\n       like the others, not a paint product: the price of painted MDF does not depend on the tone */\n    { id: \"brilliant-white\", name: \"Brilliant White\", hex: 16777215 },\n    { id: \"light-grey\", name: \"Light grey\", hex: 13159111 },\n    { id: \"dark-grey\", name: \"Dark grey\", hex: 5790815 },\n    { id: \"black\", name: \"Black\", hex: 2829357 }\n  ];\n  var PAINT_RGB = {};\n  for (const f of PAINT_FINISHES) {\n    PAINT_RGB[f.id] = {};\n    for (const t of PAINT_TONES) PAINT_RGB[f.id][t.id] = rgb(t.hex);\n  }\n  var DOOR_STYLES = [\n    { id: \"slab\", name: \"Flat\", long: \"Flat (slab)\", routed: false, planning: false, offered: true },\n    { id: \"shaker\", name: \"Shaker\", long: \"Shaker\", routed: true, planning: false, offered: true },\n    { id: \"jpull\", name: \"J-pull\", long: \"J-pull (integrated finger pull)\", routed: true, planning: true, offered: true, paintedOnly: true },\n    /* FRAMED DOOR WITH A GLASS CENTRE (task 1791491928266, owner 08.10.2026): the door is a frame round a glass pane. The\n       FRAME IS ONE PIECE (owner 09.10.2026, confirmed construction: \u00ABour frame is CNC cut FROM ONE PIECE of board with central\n       aperture ... NO joints/seams/mitres between stiles and rails\u00BB): the finished door blank with its centre cut out, an 80 mm\n       border by default (model/shaker.js glassFrame). ONE CABINET AT A TIME (owner 09.10.2026: \u00ABGlass would NEVER apply to\n       entire kitchen\u00BB): cabinetOnly - never a kitchen-wide style, never inherited by the next cabinet; it is put on a cabinet\n       by dragging the Glass sample onto it (or pressing it with that cabinet selected). The glass is NOT board: its type, thickness, safety\n       class and how it is held are not in the shop's approved catalogue or engineering, so it is always quoted, never priced\n       and never a cut-list board; the 3D pane is a display sheet only. Only fronts big enough for it (doors) take the glass;\n       smaller ones (drawer fronts) stay flat. */\n    { id: \"glass\", name: \"Glass\", long: \"Framed with a glass centre\", routed: true, planning: true, offered: true, cabinetOnly: true },\n    { id: \"groove-v\", name: \"Vertical grooves\", long: \"Grooved, vertical\", routed: true, planning: true, legacy: true },\n    { id: \"groove-h\", name: \"Horizontal grooves\", long: \"Grooved, horizontal\", routed: true, planning: true, legacy: true }\n  ];\n  var STYLE_IDS = DOOR_STYLES.map((s) => s.id);\n  var OFFERED_STYLES = DOOR_STYLES.filter((s) => s.offered).map((s) => s.id);\n  function okStyle(s) {\n    return STYLE_IDS.indexOf(s) >= 0 ? s : null;\n  }\n  function offeredStyle(s) {\n    return OFFERED_STYLES.indexOf(s) >= 0 ? s : null;\n  }\n  function isLegacyStyle(s) {\n    return !!(okStyle(s) && styleOf(s).legacy);\n  }\n  function isPaintedOnly(s) {\n    return !!(okStyle(s) && styleOf(s).paintedOnly);\n  }\n  function isCabinetOnly(s) {\n    return !!(okStyle(s) && styleOf(s).cabinetOnly);\n  }\n  var GLASS_ONE_CABINET = \"Glass doors go on one cabinet at a time - drag Glass onto the cabinet you want, or select it and press Glass\";\n  var NOT_OFFERED = \"Grooved fronts are no longer offered - choose Flat, Shaker or J-pull\";\n  var JPULL_NEEDS_PAINT = \"J-pull fronts are made in painted MDF only\";\n  function styleOf(id) {\n    return DOOR_STYLES.filter((s) => s.id === id)[0] || DOOR_STYLES[0];\n  }\n  function styleWords(id) {\n    const l = styleOf(id).long;\n    return /^J-/.test(l) ? l : l.toLowerCase();\n  }\n  function isRouted(id) {\n    return !!styleOf(id).routed && id !== \"slab\";\n  }\n  var JPULL_BACK_EXTENSION_MM = 10;\n  var JPULL_PROFILE = { path: \"M0 0 H6 V28 C6 32 8 34 10.5 34 C13 34 15 32 15 28 V25 H18\", boardMm: 18, cubicSteps: 16 };\n  var JPULL_PLAN = { stem: 6, lipTip: 25, coveBottom: 34, zone: 34, lip: 3, coveWidth: 9, minFace: 90 };\n  var GROOVE_PLAN = { pitch: 100, width: 10, depth: 4, minFace: 60 };\n  var SHAKER_DEFAULT = { panels: 1, frame: 80, rail: 80, railAt: 0, depth: 6 };\n  var PAINT_DEFAULT = { finish: \"satin-matt\", tone: \"white\", ref: \"\" };\n  var KITCHEN_DEFAULT = { carcass: \"white\", fronts: \"white\", frontMat: \"mfc\", frontStyle: \"slab\" };\n  function okFrontMat(m) {\n    return m === \"mfc\" || m === \"mdf-paint\" ? m : null;\n  }\n  function okPaintFinish(f) {\n    return PAINT_FINISHES.some((x) => x.id === f) ? f : null;\n  }\n  function okTone(t) {\n    return PAINT_TONES.some((x) => x.id === t) ? t : null;\n  }\n  function cleanRef(s) {\n    return String(s == null ? \"\" : s).replace(/[<>{}\\\\]/g, \"\").replace(/\\s+/g, \" \").trim().slice(0, 40);\n  }\n  function normPaint(p) {\n    p = p || {};\n    return {\n      finish: okPaintFinish(p.finish) || PAINT_DEFAULT.finish,\n      tone: okTone(p.tone) || PAINT_DEFAULT.tone,\n      ref: cleanRef(p.ref)\n    };\n  }\n  function kitchenOf2(k) {\n    k = k && typeof k === \"object\" ? k : {};\n    return {\n      carcass: typeof k.carcass === \"string\" && decorOf(k.carcass) ? k.carcass : KITCHEN_DEFAULT.carcass,\n      fronts: typeof k.fronts === \"string\" && decorOf(k.fronts) ? k.fronts : KITCHEN_DEFAULT.fronts,\n      frontMat: okFrontMat(k.frontMat) || KITCHEN_DEFAULT.frontMat,\n      paint: normPaint(k.paint),\n      frontStyle: okStyle(k.frontStyle) || KITCHEN_DEFAULT.frontStyle,\n      shaker: { ...SHAKER_DEFAULT, ...k.shaker || {} },\n      /* GOLA (task 1791235842445): carried only once chosen, so an untouched kitchen reads exactly as before */\n      ...k.gola && typeof k.gola === \"object\" ? { gola: normGola(k.gola) } : {},\n      /* PRIMED MDF FRONTS (card 1791454713907): the shopper chose painted fronts supplied primed - carried only once chosen */\n      ...k.primer === true ? { primer: true } : {},\n      /* WORKTOP (task 1791478310196): carried only once chosen, so a kitchen-wide materials change never drops it\n         (model/worktops.js worktopOf reads and clamps it) */\n      ...k.worktop && typeof k.worktop === \"object\" ? { worktop: { ...k.worktop } } : {},\n      /* the splashback (task 1791557195336): kept whole, like the worktop - a Carcass / Doors change never drops it */\n      ...k.splash && typeof k.splash === \"object\" ? { splash: JSON.parse(JSON.stringify(k.splash)) } : {},\n      /* the pro edition's construction choices (model/build.js, card 1791885434176): kept whole, so a materials change never\n         drops them; absent = the workshop standard */\n      ...k.build && typeof k.build === \"object\" ? { build: { ...k.build } } : {}\n    };\n  }\n  function paintColour(paint) {\n    const p = normPaint(paint);\n    return PAINT_RGB[p.finish][p.tone];\n  }\n  function paintFinishOf(id) {\n    return PAINT_FINISHES.filter((f) => f.id === id)[0] || PAINT_FINISHES[0];\n  }\n  function toneOf(id) {\n    return PAINT_TONES.filter((t) => t.id === id)[0] || PAINT_TONES[0];\n  }\n  function paintText(paint) {\n    const p = normPaint(paint);\n    return \"painted MDF (supplied with a water-based primer only; previewed \" + paintFinishOf(p.finish).name.toLowerCase() + \", \" + (p.ref ? \"colour \" + p.ref : \"in \" + toneOf(p.tone).name.toLowerCase()) + \")\";\n  }\n\n  // v2/src/model/build.js\n  var BUILD_CHOICES = Object.freeze({\n    carcass: Object.freeze([[\"between\", \"Between the sides\"], [\"over\", \"Over the sides\"]]),\n    back: Object.freeze([[\"groove\", \"In a groove\"], [\"rabbet\", \"In a rebate\"], [\"overlay\", \"Applied\"], [\"inset\", \"Set in\"]])\n  });\n  var ok = (k, v) => BUILD_CHOICES[k].some((c) => c[0] === v);\n  function normBuild(b) {\n    const out = {};\n    if (b && typeof b === \"object\") {\n      for (const k of Object.keys(BUILD_CHOICES)) if (ok(k, b[k])) out[k] = b[k];\n    }\n    return out;\n  }\n  function buildOk(k, v) {\n    return Object.prototype.hasOwnProperty.call(BUILD_CHOICES, k) && (v == null || ok(k, v));\n  }\n\n  // v2/src/model/shaker-geometry.js\n  function shakerPockets2(door, opts = {}) {\n    const round3 = (v) => Math.round(Number(v) * 1e3) / 1e3;\n    const nope = (why) => ({ pockets: null, error: `Shaker door: ${why}` });\n    const L = Number(door && door.length);\n    const W2 = Number(door && door.width);\n    if (!(L > 0) || !(W2 > 0)) return nope(\"the door has no size.\");\n    const frame2 = Number(opts.frame) > 0 ? Number(opts.frame) : 80;\n    const panels = Math.max(1, Math.round(Number(opts.panels) || 1));\n    const rail = Number(opts.rail) > 0 ? Number(opts.rail) : frame2;\n    const depth = Number(opts.depth) > 0 ? Number(opts.depth) : 6;\n    const radius = Number(opts.radius) >= 0 ? Number(opts.radius) : 0;\n    const overlap2 = Number(opts.overlap) > 0 ? Number(opts.overlap) : 80;\n    const inner = W2 - 2 * frame2;\n    if (inner <= 0) {\n      return nope(`a ${frame2} mm frame on both sides leaves nothing of a ${W2} mm door. Make the frame narrower, or the door wider.`);\n    }\n    const spare = L - 2 * frame2 - (panels - 1) * rail;\n    if (spare <= 0) {\n      return nope(`a ${frame2} mm frame and ${panels - 1} rail(s) of ${rail} mm leave nothing of a ${L} mm door. Reduce the frame, the rail, or the number of panels.`);\n    }\n    const edges = [];\n    if (panels === 2 && Number(opts.railAt) !== 0) {\n      const at = Number(opts.railAt) > 0 ? Number(opts.railAt) : 900;\n      const lo = frame2;\n      const hi = L - frame2;\n      const a = at - rail / 2;\n      const b = at + rail / 2;\n      if (a <= lo || b >= hi) {\n        return nope(`the rail at ${at} mm does not fit between the ${frame2} mm frames of a ${L} mm door. Move it, or make the frame narrower.`);\n      }\n      edges.push([lo, a], [b, hi]);\n    } else {\n      const each = spare / panels;\n      let at = frame2;\n      for (let i = 0; i < panels; i += 1) {\n        edges.push([at, at + each]);\n        at += each + rail;\n      }\n    }\n    const pockets = edges.map(([a, b], i) => ({\n      kind: \"pocket\",\n      id: `shaker-${i + 1}`,\n      x: round3((a + b) / 2),\n      y: round3(frame2 + inner / 2),\n      length: round3(b - a),\n      width: round3(inner),\n      radius,\n      depth,\n      overlap: overlap2\n    }));\n    return { pockets, error: null };\n  }\n\n  // v2/src/model/plinth-material.js\n  var PAINT_PLINTH = \"mdf-paint\";\n  function isPaintKey(key) {\n    return typeof key === \"string\" && key.indexOf(PAINT_PLINTH + \":\") === 0;\n  }\n  function paintKey(paint) {\n    const p = normPaint(paint);\n    return PAINT_PLINTH + \":\" + p.finish + \":\" + p.tone + \":\" + encodeURIComponent(p.ref || \"\");\n  }\n  function paintOfKey(key) {\n    if (!isPaintKey(key)) return null;\n    const s = key.split(\":\");\n    let ref = \"\";\n    try {\n      ref = decodeURIComponent(s.slice(3).join(\":\") || \"\");\n    } catch {\n      ref = \"\";\n    }\n    return normPaint({ finish: s[1], tone: s[2], ref });\n  }\n  function okPlinthOv(ov) {\n    if (!ov || typeof ov !== \"object\") return null;\n    if (ov.mat === \"mfc\" && typeof ov.decor === \"string\" && decorOf(ov.decor)) return { mat: \"mfc\", decor: ov.decor };\n    if (ov.mat === PAINT_PLINTH) return { mat: PAINT_PLINTH, paint: normPaint(ov.paint) };\n    return null;\n  }\n  function plinthKeyOf(u) {\n    const ov = okPlinthOv(u && u.ovPlinth);\n    if (ov) return ov.mat === \"mfc\" ? ov.decor : paintKey(ov.paint);\n    if (u && u.frontMat === PAINT_PLINTH) return paintKey(u.paint);\n    return u && (u.frontFinish || u.doorFinish || u.finish) || \"white\";\n  }\n  function paintKeyText(key) {\n    const p = paintOfKey(key);\n    return p ? paintText(p) : \"\";\n  }\n  function paintKeyShort(key) {\n    const p = paintOfKey(key);\n    return p ? \"Painted \" + paintFinishOf(p.finish).name.toLowerCase() + \", \" + (p.ref || toneOf(p.tone).name) : \"\";\n  }\n\n  // v2/src/model/finishing.js\n  var FINISH_KIT = {\n    endT: T,\n    endDepthExtra: T,\n    // an applied end runs past the door by a board\n    scribe: { min: 10, max: 150, def: 50 }\n  };\n  var END_SPEC = {\n    edgeMm: 2,\n    // the configurator's end-panel edging (kitchen.js)\n    edges: { front: true, top: true, bottom: false, back: false },\n    grain: \"vertical\",\n    fixing: \"fixing to the cabinet side not specified yet - no holes or connectors are machined in this panel; the workshop approves the fixing\"\n  };\n  function okEndMat(m) {\n    if (m === \"fronts\" || m === \"carcass\") return m;\n    if (typeof m === \"string\" && m.indexOf(\"decor:\") === 0 && decorOf(m.slice(6))) return m;\n    return null;\n  }\n  function finishingOf(u) {\n    const g2 = u && u.finishing || {};\n    const wall = u && u.family === \"wall\";\n    const out = {\n      endL: !!g2.endL,\n      endR: !!g2.endR,\n      /* a wall unit has no legs to clear, so \"down to the floor\" never applies */\n      endDrop: wall ? false : !!g2.endDrop,\n      scribeL: clamp4(Math.round(g2.scribeL || 0), 0, FINISH_KIT.scribe.max),\n      scribeR: clamp4(Math.round(g2.scribeR || 0), 0, FINISH_KIT.scribe.max)\n    };\n    if (g2.dropSet) out.dropSet = true;\n    const m = okEndMat(g2.mat);\n    if (m && m !== \"fronts\") out.mat = m;\n    return out;\n  }\n  function hasFinishing(u) {\n    const g2 = finishingOf(u);\n    return !!(g2.endL || g2.endR || g2.scribeL || g2.scribeR);\n  }\n  function finishingWhy(u) {\n    if (!u) return \"Nothing is selected.\";\n    if (u.type === \"island\")\n      return \"This island already has finished end panels and a finished back built in - they are in its price. Set them to the floor (to hide the legs) in End panels.\";\n    if (u.family === \"corner\" || String(u.type).indexOf(\"corner\") === 0)\n      return \"A corner unit's exposed face is its own end panel, so an applied end would sit on top of it. Ask us and we will specify the corner finishing by hand.\";\n    return null;\n  }\n  function canFinishing(u) {\n    return !!u && finishingWhy(u) === null;\n  }\n  function frontsKeyOf(u) {\n    if (u && u.frontMat === \"mdf-paint\") return paintKey(u.paint);\n    return u && (u.frontFinish || u.doorFinish || u.finish) || \"white\";\n  }\n  function endKeyOf(u) {\n    const m = okEndMat(u && u.finishing && u.finishing.mat) || \"fronts\";\n    if (m === \"carcass\") return u && u.finish || \"white\";\n    if (m.indexOf(\"decor:\") === 0) return m.slice(6);\n    return frontsKeyOf(u);\n  }\n  function endMatChoice(u) {\n    return okEndMat(u && u.finishing && u.finishing.mat) || \"fronts\";\n  }\n  function finishingParts(u) {\n    if (!canFinishing(u) || !hasFinishing(u)) return [];\n    const g2 = finishingOf(u), W2 = u.w, H2 = u.h, D2 = u.d, p = [];\n    const eT = FINISH_KIT.endT;\n    const eZ1 = D2 + FINISH_KIT.endDepthExtra;\n    const eY0 = g2.endDrop ? -LEG_H : 0;\n    const endKey = endKeyOf(u), frontKey = frontsKeyOf(u);\n    function box3(n, x0, x1, y0, y1, z0, z1, ex, side, mat, endPanel) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: \"board\", side, mat, endPanel: !!endPanel });\n    }\n    if (g2.endL) box3(\"End panel left\", -eT, 0, eY0, H2, 0, eZ1, [-1, 0, 0], \"left\", endKey, true);\n    if (g2.endR) box3(\"End panel right\", W2, W2 + eT, eY0, H2, 0, eZ1, [1, 0, 0], \"right\", endKey, true);\n    const offL = g2.endL ? eT : 0, offR = g2.endR ? eT : 0;\n    if (g2.scribeL) box3(\"Scribe left\", -offL - g2.scribeL, -offL, eY0, H2, D2, D2 + eT, [-1, 0, 0], \"left\", frontKey);\n    if (g2.scribeR) box3(\"Scribe right\", W2 + offR, W2 + offR + g2.scribeR, eY0, H2, D2, D2 + eT, [1, 0, 0], \"right\", frontKey);\n    return p;\n  }\n  function endPanelSpec(u) {\n    const out = [];\n    finishingParts(u).forEach(function(q) {\n      if (!q.endPanel) return;\n      const h = Math.round(q.y1 - q.y0), d = Math.round(q.z1 - q.z0), t = Math.round(q.x1 - q.x0);\n      const painted = isPaintKey(q.mat);\n      const e = END_SPEC.edgeMm;\n      const decor = painted ? null : decorOf(q.mat);\n      out.push({\n        name: q.name,\n        side: q.side,\n        material: q.mat,\n        board: painted ? \"MDF 18 mm, water-based primer only\" : decor ? \"Egger \" + decor.label.replace(/^Egger\\s+/i, \"\") + \" MFC 18 mm\" : String(q.mat),\n        paint: painted ? paintOfKey(q.mat) : null,\n        paintText: painted ? paintText(paintOfKey(q.mat)) : \"\",\n        finished: { h, d, t },\n        cut: painted ? { h, d, t } : {\n          h: h - (END_SPEC.edges.top ? e : 0) - (END_SPEC.edges.bottom ? e : 0),\n          d: d - (END_SPEC.edges.front ? e : 0) - (END_SPEC.edges.back ? e : 0),\n          t\n        },\n        edges: painted ? { front: \"sprayed\", top: \"sprayed\", bottom: \"raw\", back: \"raw\" } : { front: e + \" mm edge band\", top: e + \" mm edge band\", bottom: \"raw (on the floor / hidden)\", back: \"raw (against the wall)\" },\n        grain: END_SPEC.grain,\n        toFloor: q.y0 < 0,\n        fixing: END_SPEC.fixing\n      });\n    });\n    return out;\n  }\n  function finishingReach(u) {\n    if (!canFinishing(u)) return { left: 0, right: 0 };\n    const g2 = finishingOf(u);\n    return {\n      left: (g2.endL ? FINISH_KIT.endT : 0) + g2.scribeL,\n      right: (g2.endR ? FINISH_KIT.endT : 0) + g2.scribeR\n    };\n  }\n  function overallWidth(u) {\n    const r = finishingReach(u);\n    return u.w + r.left + r.right;\n  }\n  function finishingExtras(u) {\n    const parts = finishingParts(u);\n    if (!parts.length) return { a18: 0, edgeM: 0, parts, byMat: {} };\n    const A = boardAreaSplit(parts);\n    const byMat = {};\n    parts.forEach(function(q) {\n      const a = boardAreaSplit([q]).a18;\n      byMat[q.mat] = (byMat[q.mat] || 0) + a;\n    });\n    const edge = parts.reduce(function(t, q) {\n      return t + (q.y1 - q.y0) + (q.endPanel && END_SPEC.edges.top ? q.z1 - q.z0 : 0);\n    }, 0) / 1e3;\n    return { a18: A.a18, edgeM: edge, parts, byMat };\n  }\n  function finishingText(u) {\n    const parts = finishingParts(u);\n    if (!parts.length) return \"\";\n    const g2 = finishingOf(u);\n    const spec = endPanelSpec(u);\n    return parts.map(function(q) {\n      const h = Math.round(q.y1 - q.y0), w = Math.round(q.x1 - q.x0);\n      if (q.endPanel) {\n        const s = spec.filter(function(x) {\n          return x.name === q.name;\n        })[0];\n        return q.name.toLowerCase() + \" \" + h + \" \\xD7 \" + Math.round(q.z1 - q.z0) + \" mm\" + (g2.endDrop ? \" (down to the floor)\" : \" (carcass height)\") + (s ? \", \" + (s.paint ? s.paintText : s.board) : \"\");\n      }\n      return q.name.toLowerCase() + \" \" + w + \" mm wide \\xD7 \" + h + \" mm (trim to fit on site)\";\n    }).join(\", \");\n  }\n\n  // v2/src/model/footprint.js\n  function footBoxes(u) {\n    const E = unitEnvelope(u), xf = planXf(u, E.LX, E.LZ), out = [];\n    const rects = isLPlan(u) ? [\n      [0, armA(u), 0, u.d],\n      // arm A, along x\n      [armA(u) - u.d, armA(u), 0, armB(u)]\n    ] : [[0, E.LX, 0, E.LZ]];\n    if (canFinishing(u) && hasFinishing(u)) {\n      const g2 = finishingOf(u), eT = FINISH_KIT.endT;\n      if (g2.endL) rects.push([-eT, 0, 0, E.LZ]);\n      if (g2.endR) rects.push([E.LX, E.LX + eT, 0, E.LZ]);\n      const oL = g2.endL ? eT : 0, oR = g2.endR ? eT : 0;\n      if (g2.scribeL) rects.push([-oL - g2.scribeL, -oL, u.d, u.d + eT]);\n      if (g2.scribeR) rects.push([E.LX + oR, E.LX + oR + g2.scribeR, u.d, u.d + eT]);\n    }\n    rects.forEach(function(r) {\n      const a = xf.p([r[0], 0, r[2]]), b = xf.p([r[1], 0, r[3]]);\n      out.push({\n        x0: Math.min(a[0], b[0]),\n        x1: Math.max(a[0], b[0]),\n        z0: Math.min(a[2], b[2]),\n        z1: Math.max(a[2], b[2])\n      });\n    });\n    return out;\n  }\n  function foot(u) {\n    const B = footBoxes(u);\n    let x0 = 1e9, x1 = -1e9, z0 = 1e9, z1 = -1e9;\n    for (let i = 0; i < B.length; i++) {\n      const b = B[i];\n      x0 = Math.min(x0, b.x0);\n      x1 = Math.max(x1, b.x1);\n      z0 = Math.min(z0, b.z0);\n      z1 = Math.max(z1, b.z1);\n    }\n    return { x0, x1, z0, z1 };\n  }\n  function boxHit(A, B) {\n    return A.x0 < B.x1 - 0.5 && A.x1 > B.x0 + 0.5 && A.z0 < B.z1 - 0.5 && A.z1 > B.z0 + 0.5;\n  }\n  function overlaps(a, b) {\n    const A = footBoxes(a), B = footBoxes(b);\n    for (let i = 0; i < A.length; i++) for (let j = 0; j < B.length; j++) if (boxHit(A[i], B[j])) return true;\n    return false;\n  }\n\n  // v2/src/model/room-outline.js\n  var WALL_MIN = 100;\n  var ANGLE_MIN = 15;\n  var RECT_IDS = [\"back\", \"right\", \"front\", \"left\"];\n  var r16 = (v) => Math.round(v);\n  function rectOutline(width, depth) {\n    return { walls: [{ id: \"back\", x: 0, z: 0 }, { id: \"right\", x: width, z: 0 }, { id: \"front\", x: width, z: depth }, { id: \"left\", x: 0, z: depth }] };\n  }\n  function outlineOf(room, sz) {\n    if (room && room.outline && validateOutline(room.outline).ok) return normalizeOutline(room.outline);\n    const w = room && room.width || sz && sz.width || 3600, d = room && room.depth || sz && sz.depth || 3e3;\n    return rectOutline(w, d);\n  }\n  function isRectOutline(o) {\n    const w = o && o.walls;\n    if (!w || w.length !== 4) return false;\n    const xs = w.map((p) => p.x), zs = w.map((p) => p.z);\n    return w[0].x === Math.min(...xs) && w[0].z === Math.min(...zs) && w[1].z === w[0].z && w[2].x === w[1].x && w[3].z === w[2].z && w[3].x === w[0].x;\n  }\n  function signedArea(w) {\n    let s = 0;\n    for (let i = 0; i < w.length; i++) {\n      const p = w[i], q = w[(i + 1) % w.length];\n      s += p.x * q.z - q.x * p.z;\n    }\n    return s / 2;\n  }\n  function outlineBounds(o) {\n    const xs = o.walls.map((p) => p.x), zs = o.walls.map((p) => p.z);\n    return { x0: Math.min(...xs), x1: Math.max(...xs), z0: Math.min(...zs), z1: Math.max(...zs) };\n  }\n  function segmentFrame(o, id) {\n    const w = o.walls, i = w.findIndex((p) => p.id === id);\n    if (i < 0) return null;\n    const a = w[i], b = w[(i + 1) % w.length], dx = b.x - a.x, dz = b.z - a.z, len = Math.hypot(dx, dz);\n    if (!(len > 0)) return null;\n    const dir = [dx / len, dz / len], inward = [-dir[1], dir[0]];\n    const axis = Math.abs(dz) < 0.5 ? \"z\" : Math.abs(dx) < 0.5 ? \"x\" : null;\n    return {\n      id,\n      index: i,\n      len: r16(len),\n      start: [a.x, a.z],\n      end: [b.x, b.z],\n      dir,\n      inward,\n      axis,\n      at: axis === \"z\" ? a.z : axis === \"x\" ? a.x : null,\n      angle: Math.round(Math.atan2(dz, dx) * 1800 / Math.PI) / 10,\n      pt: (al, dIn) => [a.x + dir[0] * al + inward[0] * dIn, a.z + dir[1] * al + inward[1] * dIn]\n    };\n  }\n  function segments(o) {\n    return o.walls.map((p) => segmentFrame(o, p.id)).filter(Boolean);\n  }\n  function cornerAngle(o, i) {\n    const w = o.walls, n = w.length, p = w[(i - 1 + n) % n], c = w[i], q = w[(i + 1) % n];\n    const a = Math.atan2(p.z - c.z, p.x - c.x), b = Math.atan2(q.z - c.z, q.x - c.x);\n    let d = (a - b) * 180 / Math.PI;\n    while (d < 0) d += 360;\n    while (d >= 360) d -= 360;\n    return Math.round(d * 10) / 10;\n  }\n  function segsCross(p1, p2, p3, p4) {\n    const d = (a, b, c) => (b.x - a.x) * (c.z - a.z) - (b.z - a.z) * (c.x - a.x);\n    const d1 = d(p3, p4, p1), d2 = d(p3, p4, p2), d3 = d(p1, p2, p3), d4 = d(p1, p2, p4);\n    if ((d1 > 0 && d2 < 0 || d1 < 0 && d2 > 0) && (d3 > 0 && d4 < 0 || d3 < 0 && d4 > 0)) return true;\n    const on = (a, b, c) => Math.min(a.x, b.x) - 0.5 <= c.x && c.x <= Math.max(a.x, b.x) + 0.5 && Math.min(a.z, b.z) - 0.5 <= c.z && c.z <= Math.max(a.z, b.z) + 0.5;\n    return Math.abs(d1) < 0.5 && on(p3, p4, p1) || Math.abs(d2) < 0.5 && on(p3, p4, p2) || Math.abs(d3) < 0.5 && on(p1, p2, p3) || Math.abs(d4) < 0.5 && on(p1, p2, p4);\n  }\n  function normalizeOutline(o) {\n    let w = (o.walls || []).map((p) => ({ id: String(p.id), x: r16(p.x), z: r16(p.z) }));\n    if (signedArea(w) < 0) {\n      const n = w.length, ids = w.map((p) => p.id), rev = [];\n      for (let k = 0; k < n; k++) rev.push({ id: ids[(n - 1 - k - 1 + n) % n], x: w[n - 1 - k].x, z: w[n - 1 - k].z });\n      w = rev;\n    }\n    for (let guard = 0; guard < 64 && w.length > 3; guard++) {\n      const n = w.length;\n      let k = -1;\n      for (let i = 0; i < n; i++) {\n        const p = w[(i - 1 + n) % n], c = w[i], q = w[(i + 1) % n];\n        if (Math.abs((c.x - p.x) * (q.z - c.z) - (c.z - p.z) * (q.x - c.x)) < 0.5 && (c.x - p.x) * (q.x - c.x) + (c.z - p.z) * (q.z - c.z) > 0) {\n          k = i;\n          break;\n        }\n      }\n      if (k < 0) break;\n      w.splice(k, 1);\n    }\n    return { walls: w };\n  }\n  function validateOutline(o) {\n    const w = o && o.walls;\n    if (!Array.isArray(w) || w.length < 3) return { ok: false, why: \"A room needs at least three walls\" };\n    if (!w.every((p) => p && isFinite(p.x) && isFinite(p.z) && p.id != null)) return { ok: false, why: \"A corner has no position\" };\n    if (new Set(w.map((p) => String(p.id))).size !== w.length) return { ok: false, why: \"Two walls have the same name\" };\n    const n = w.length;\n    for (let i = 0; i < n; i++) {\n      const a = w[i], b = w[(i + 1) % n], L = Math.hypot(b.x - a.x, b.z - a.z);\n      if (L < WALL_MIN - 0.5) return { ok: false, why: \"A wall is \" + Math.round(L) + \" mm long - every wall must be at least \" + WALL_MIN + \" mm\", wall: a.id };\n    }\n    for (let i = 0; i < n; i++) for (let j = i + 1; j < n; j++) {\n      if (j === i + 1 || i === 0 && j === n - 1) continue;\n      if (segsCross(w[i], w[(i + 1) % n], w[j], w[(j + 1) % n])) return { ok: false, why: \"Two walls cross - a room's outline cannot cross itself\", walls: [w[i].id, w[j].id] };\n    }\n    const N = normalizeOutline(o);\n    if (signedArea(N.walls) <= 0) return { ok: false, why: \"The outline has no inside\" };\n    for (let i = 0; i < N.walls.length; i++) {\n      const ang = cornerAngle(N, i);\n      if (ang < ANGLE_MIN - 0.05 || ang > 360 - ANGLE_MIN + 0.05)\n        return { ok: false, why: \"A corner of \" + Math.round(Math.min(ang, 360 - ang)) + \" degrees is too sharp - at least \" + ANGLE_MIN + \" degrees\", corner: N.walls[i].id };\n    }\n    const B = outlineBounds(N);\n    if (B.x1 - B.x0 > ROOM_LIMITS.width[1] + 0.5 || B.z1 - B.z0 > ROOM_LIMITS.depth[1] + 0.5)\n      return { ok: false, why: \"The room is larger than the planner allows (\" + ROOM_LIMITS.width[1] + \" x \" + ROOM_LIMITS.depth[1] + \" mm)\" };\n    if (B.x1 - B.x0 < ROOM_LIMITS.width[0] - 0.5 || B.z1 - B.z0 < ROOM_LIMITS.depth[0] - 0.5)\n      return { ok: false, why: \"The room is smaller than the planner allows (\" + ROOM_LIMITS.width[0] + \" x \" + ROOM_LIMITS.depth[0] + \" mm)\" };\n    return { ok: true, outline: N };\n  }\n  var copy2 = (o) => ({ walls: o.walls.map((p) => ({ id: p.id, x: p.x, z: p.z })) });\n  function nextWallId(o) {\n    let n = 0;\n    for (const p of o.walls) {\n      const m = /^w(\\d+)$/.exec(String(p.id));\n      if (m) n = Math.max(n, Number(m[1]));\n    }\n    return \"w\" + (n + 1);\n  }\n  function done(o) {\n    const v = validateOutline(o);\n    return v.ok ? { ok: true, outline: v.outline } : v;\n  }\n  function moveCorner(o, id, x, z) {\n    const c = copy2(o), p = c.walls.find((q) => q.id === id);\n    if (!p) return { ok: false, why: \"No such corner\" };\n    p.x = r16(x);\n    p.z = r16(z);\n    return done(c);\n  }\n  function pushWall(o, id, by) {\n    const fr = segmentFrame(o, id);\n    if (!fr) return { ok: false, why: \"No such wall\" };\n    const c = copy2(o), n = c.walls.length, i = fr.index, a = c.walls[i], b = c.walls[(i + 1) % n];\n    const dx = -fr.inward[0] * by, dz = -fr.inward[1] * by;\n    a.x = r16(a.x + dx);\n    a.z = r16(a.z + dz);\n    b.x = r16(b.x + dx);\n    b.z = r16(b.z + dz);\n    return done(c);\n  }\n  function setWallLength(o, id, len) {\n    const fr = segmentFrame(o, id);\n    if (!fr) return { ok: false, why: \"No such wall\" };\n    if (!(len >= WALL_MIN)) return { ok: false, why: \"A wall must be at least \" + WALL_MIN + \" mm\" };\n    const c = copy2(o), n = c.walls.length, i = fr.index, d = len - Math.hypot(fr.end[0] - fr.start[0], fr.end[1] - fr.start[1]);\n    const j = (i + 1) % n, k = (i + 2) % n;\n    for (const q of [c.walls[j], c.walls[k]]) {\n      q.x = r16(q.x + fr.dir[0] * d);\n      q.z = r16(q.z + fr.dir[1] * d);\n    }\n    return done(c);\n  }\n  function setCornerAngle(o, id, deg) {\n    const c = copy2(o), n = c.walls.length, i = c.walls.findIndex((q2) => q2.id === id);\n    if (i < 0) return { ok: false, why: \"No such corner\" };\n    const p = c.walls[(i - 1 + n) % n], v = c.walls[i], q = c.walls[(i + 1) % n];\n    const back = Math.atan2(p.z - v.z, p.x - v.x), L = Math.hypot(q.x - v.x, q.z - v.z);\n    const ang = back - deg * Math.PI / 180;\n    q.x = r16(v.x + Math.cos(ang) * L);\n    q.z = r16(v.z + Math.sin(ang) * L);\n    return done(c);\n  }\n  function notchWall(o, id, a0, a1, depth) {\n    const fr = segmentFrame(o, id);\n    if (!fr) return { ok: false, why: \"No such wall\" };\n    if (!(a1 - a0 >= WALL_MIN) || a0 < WALL_MIN - 0.5 || a1 > fr.len - WALL_MIN + 0.5)\n      return { ok: false, why: \"A recess must be at least \" + WALL_MIN + \" mm wide and leave \" + WALL_MIN + \" mm of wall each side\" };\n    if (!(Math.abs(depth) >= WALL_MIN)) return { ok: false, why: \"A recess must be at least \" + WALL_MIN + \" mm deep\" };\n    const c = copy2(o), i = fr.index, out = -depth;\n    const P2 = (a, d) => {\n      const q = fr.pt(a, d);\n      return { x: r16(q[0]), z: r16(q[1]) };\n    };\n    let nid = nextWallId(c);\n    const take = () => {\n      const k = nid;\n      nid = \"w\" + (Number(nid.slice(1)) + 1);\n      return k;\n    };\n    const add = [Object.assign({ id: take() }, P2(a0, 0)), Object.assign({ id: take() }, P2(a0, out)), Object.assign({ id: take() }, P2(a1, out)), Object.assign({ id: take() }, P2(a1, 0))];\n    c.walls.splice(i + 1, 0, ...add);\n    return done(c);\n  }\n  var axisOf = (a, b) => Math.abs(a.z - b.z) < 0.5 ? \"h\" : Math.abs(a.x - b.x) < 0.5 ? \"v\" : null;\n  function orthoMoveCorner(o, id, x, z) {\n    const c = copy2(o), n = c.walls.length, i = c.walls.findIndex((q2) => q2.id === id);\n    if (i < 0) return { ok: false, why: \"No such corner\" };\n    const p = c.walls[(i - 1 + n) % n], v = c.walls[i], q = c.walls[(i + 1) % n];\n    const ax0 = axisOf(p, v), ax1 = axisOf(v, q);\n    if (!ax0 || !ax1) return moveCorner(o, id, x, z);\n    x = r16(x);\n    z = r16(z);\n    if (ax0 === \"h\") p.z = z;\n    else p.x = x;\n    if (ax1 === \"h\") q.z = z;\n    else q.x = x;\n    v.x = x;\n    v.z = z;\n    return done(c);\n  }\n  function isOrthoOutline(o) {\n    return o.walls.every((p, i) => !!axisOf(p, o.walls[(i + 1) % o.walls.length]));\n  }\n  function stepWall(o, id, at, depth, dir, side) {\n    const fr = segmentFrame(o, id);\n    if (!fr) return { ok: false, why: \"No such wall\" };\n    at = r16(Number(at));\n    depth = r16(Number(depth));\n    if (!(depth >= WALL_MIN)) return { ok: false, why: \"A step must be at least \" + WALL_MIN + \" mm deep\" };\n    if (!(at >= WALL_MIN - 0.5 && at <= fr.len - WALL_MIN + 0.5)) return { ok: false, why: \"The step must be at least \" + WALL_MIN + \" mm from each end of the wall (\" + fr.len + \" mm long)\" };\n    const c = copy2(o), n = c.walls.length, i = fr.index;\n    const off = dir === \"out\" ? -depth : depth;\n    const P2 = (a, d) => {\n      const q = fr.pt(a, d);\n      return { x: r16(q[0]), z: r16(q[1]) };\n    };\n    let nid = nextWallId(c);\n    const take = () => {\n      const k = nid;\n      nid = \"w\" + (Number(nid.slice(1)) + 1);\n      return k;\n    };\n    if (side === \"start\") {\n      const s = c.walls[i], before = c.walls[(i - 1 + n) % n];\n      if (!axisOf(before, s)) return { ok: false, why: \"The wall before this one is at an angle - a square step needs it square\" };\n      const S2 = P2(0, off);\n      if (axisOf(before, s) === \"h\") before.z = S2.z;\n      else before.x = S2.x;\n      s.x = S2.x;\n      s.z = S2.z;\n      c.walls.splice(i + 1, 0, Object.assign({ id: take() }, P2(at, off)), Object.assign({ id: take() }, P2(at, 0)));\n    } else {\n      const e = c.walls[(i + 1) % n], after = c.walls[(i + 2) % n];\n      if (!axisOf(e, after)) return { ok: false, why: \"The wall after this one is at an angle - a square step needs it square\" };\n      const E = P2(fr.len, off);\n      if (axisOf(e, after) === \"h\") after.z = E.z;\n      else after.x = E.x;\n      e.x = E.x;\n      e.z = E.z;\n      c.walls.splice(i + 1, 0, Object.assign({ id: take() }, P2(at, 0)), Object.assign({ id: take() }, P2(at, off)));\n    }\n    return done(c);\n  }\n  function wallFeature(o, id, f) {\n    const fr = segmentFrame(o, id);\n    if (!fr) return { ok: false, why: \"No such wall\" };\n    const w = r16(Number(f && f.width)), d = r16(Number(f && f.depth));\n    if (!(w >= WALL_MIN)) return { ok: false, why: \"Its width must be at least \" + WALL_MIN + \" mm\" };\n    if (!(d >= WALL_MIN)) return { ok: false, why: \"Its depth must be at least \" + WALL_MIN + \" mm\" };\n    const from = f && f.centred !== false && (f.from == null || f.centred) ? Math.round((fr.len - w) / 2) : r16(Number(f.from));\n    const left = from, right = fr.len - from - w;\n    if (!(left >= WALL_MIN - 0.5 && right >= WALL_MIN - 0.5))\n      return { ok: false, why: \"It needs \" + WALL_MIN + \" mm of wall each side - the wall is \" + fr.len + \" mm, so up to \" + Math.max(0, fr.len - 2 * WALL_MIN) + \" mm wide\", left, right };\n    const r = notchWall(o, id, from, from + w, f.kind === \"recess\" ? d : -d);\n    return Object.assign(r, { from, left, right, width: w, depth: d, kind: f.kind === \"recess\" ? \"recess\" : \"breast\" });\n  }\n  function orthoRemoveCorner(o, id) {\n    const c = copy2(o), n = c.walls.length, i = c.walls.findIndex((q2) => q2.id === id);\n    if (i < 0) return { ok: false, why: \"No such corner\" };\n    const p = c.walls[(i - 1 + n) % n], v = c.walls[i], q = c.walls[(i + 1) % n];\n    if (!axisOf(p, v) || !axisOf(v, q) || p.x === q.x || p.z === q.z) return removeCorner(o, id);\n    const opp = v.x === p.x && v.z === q.z ? { x: q.x, z: p.z } : { x: p.x, z: q.z };\n    v.x = opp.x;\n    v.z = opp.z;\n    const r = done(c);\n    if (r.ok || o.__flip) return r;\n    for (const nb of [o.walls[(i + 1) % n], o.walls[(i - 1 + n) % n]]) {\n      const r2 = orthoRemoveCorner(Object.assign({ __flip: true }, o), nb.id);\n      if (r2.ok && r2.outline.walls.length < n) return r2;\n    }\n    if (n >= 8) for (let k = i - 3; k <= i; k++) {\n      const at = (j) => o.walls[(j % n + n) % n], P2 = at(k - 1), A = at(k), D2 = at(k + 3), N = at(k + 4);\n      const line = axisOf(P2, A);\n      if (!line || line !== axisOf(D2, N) || line !== axisOf(A, D2)) continue;\n      if (line === \"h\" ? !(P2.z === A.z && A.z === D2.z && D2.z === N.z) : !(P2.x === A.x && A.x === D2.x && D2.x === N.x)) continue;\n      const drop = /* @__PURE__ */ new Set([A.id, at(k + 1).id, at(k + 2).id, D2.id]);\n      const r3 = done({ walls: o.walls.filter((q2) => !drop.has(q2.id)).map((q2) => ({ id: q2.id, x: q2.x, z: q2.z })) });\n      if (r3.ok) return r3;\n    }\n    return r;\n  }\n  function squareFrom(prev, x, z) {\n    if (!prev) return { x: r16(x), z: r16(z) };\n    return Math.abs(x - prev.x) >= Math.abs(z - prev.z) ? { x: r16(x), z: prev.z } : { x: prev.x, z: r16(z) };\n  }\n  function bendWall(o, id, x, z) {\n    const fr = segmentFrame(o, id);\n    if (!fr) return { ok: false, why: \"No such wall\" };\n    const c = copy2(o);\n    c.walls.splice(fr.index + 1, 0, { id: nextWallId(c), x: r16(x), z: r16(z) });\n    return done(c);\n  }\n  function removeCorner(o, id) {\n    const c = copy2(o), n = c.walls.length, i = c.walls.findIndex((q) => q.id === id);\n    if (i < 0) return { ok: false, why: \"No such corner\" };\n    if (n <= 3) return { ok: false, why: \"A room needs at least three walls\" };\n    c.walls.splice(i, 1);\n    return done(c);\n  }\n  function outlineFromPoints(prev, pts) {\n    if (!Array.isArray(pts) || pts.length < 3) return { ok: false, why: \"Draw at least three corners\" };\n    let o = { walls: pts.map((p, k) => ({ id: \"__\" + k, x: r16(p.x), z: r16(p.z) })) };\n    const v0 = validateOutline(o);\n    if (!v0.ok) return v0;\n    o = v0.outline;\n    if (isRectOutline(o) || isRectOutline(rotateToMin(o))) {\n      return shiftRect(outlineBounds(o));\n    }\n    const old = prev ? segments(prev) : [], used = /* @__PURE__ */ new Set(), mine = { walls: o.walls.map((p) => ({ id: p.id, x: p.x, z: p.z })) };\n    const fresh = { walls: (prev ? prev.walls : []).slice() };\n    const dot6 = (p, q, d) => (p[0] - q[0]) * d[0] + (p[1] - q[1]) * d[1];\n    segments(o).forEach((f, k) => {\n      const hit2 = old.find((g2) => {\n        if (used.has(g2.id) || f.dir[0] * g2.dir[0] + f.dir[1] * g2.dir[1] < 0.9999 || Math.abs(dot6(f.start, g2.start, g2.inward)) >= 1) return false;\n        const s = dot6(f.start, g2.start, g2.dir), e = dot6(f.end, g2.start, g2.dir);\n        return Math.max(0, Math.min(s, e)) < Math.min(g2.len, Math.max(s, e)) - 0.5;\n      });\n      if (hit2) {\n        used.add(hit2.id);\n        mine.walls[k].id = hit2.id;\n      }\n    });\n    for (const p of mine.walls) if (/^__/.test(p.id)) {\n      p.id = nextWallId(fresh);\n      fresh.walls.push({ id: p.id });\n    }\n    return done(mine);\n  }\n  function rotateToMin(o) {\n    const w = o.walls, B = outlineBounds(o), k = w.findIndex((p) => p.x === B.x0 && p.z === B.z0);\n    return k < 0 ? o : { walls: w.slice(k).concat(w.slice(0, k)) };\n  }\n  function shiftRect(B) {\n    const r = rectOutline(B.x1 - B.x0, B.z1 - B.z0);\n    for (const p of r.walls) {\n      p.x += B.x0;\n      p.z += B.z0;\n    }\n    return done(r);\n  }\n  function lShapeOutline(width, depth, cutW, cutD) {\n    return done({ walls: [\n      { id: \"back\", x: 0, z: 0 },\n      { id: \"right\", x: width, z: 0 },\n      { id: \"w1\", x: width, z: depth - cutD },\n      { id: \"w2\", x: width - cutW, z: depth - cutD },\n      { id: \"front\", x: width - cutW, z: depth },\n      { id: \"left\", x: 0, z: depth }\n    ] });\n  }\n  function insideOutline(o, x, z) {\n    const w = o.walls;\n    let inside = false;\n    for (let i = 0, j = w.length - 1; i < w.length; j = i++) {\n      const a = w[i], b = w[j];\n      if (a.z > z !== b.z > z && x < (b.x - a.x) * (z - a.z) / (b.z - a.z) + a.x) inside = !inside;\n    }\n    return inside;\n  }\n  function carryAlong(prev, next, items) {\n    return (items || []).map((q) => {\n      const f0 = segmentFrame(prev, q.wall), f12 = segmentFrame(next, q.wall);\n      if (!f0 || !f12) return q;\n      const p = f0.pt(q.x, 0), x = r16((p[0] - f12.start[0]) * f12.dir[0] + (p[1] - f12.start[1]) * f12.dir[1]);\n      return x === q.x ? q : Object.assign({}, q, { x });\n    });\n  }\n  function outlineIssues(o, boxes, openings, objects) {\n    const out = [];\n    const ids = new Set(o.walls.map((p) => p.id));\n    for (const b of boxes || []) {\n      const pts = [[b.x0 + 1, b.z0 + 1], [b.x1 - 1, b.z0 + 1], [b.x1 - 1, b.z1 - 1], [b.x0 + 1, b.z1 - 1]];\n      if (!pts.every(([x, z]) => insideOutline(o, x, z))) out.push({ kind: \"cabinet\", id: b.id, why: (b.label || \"A cabinet\") + \" would be outside the room\" });\n      else {\n        for (const f of segments(o)) {\n          if (segsCross({ x: f.start[0], z: f.start[1] }, { x: f.end[0], z: f.end[1] }, { x: b.x0 + 1, z: b.z0 + 1 }, { x: b.x1 - 1, z: b.z1 - 1 }) || segsCross({ x: f.start[0], z: f.start[1] }, { x: f.end[0], z: f.end[1] }, { x: b.x1 - 1, z: b.z0 + 1 }, { x: b.x0 + 1, z: b.z1 - 1 })) {\n            out.push({ kind: \"cabinet\", id: b.id, why: (b.label || \"A cabinet\") + \" would stand in a wall\" });\n            break;\n          }\n        }\n      }\n    }\n    for (const it of [].concat((openings || []).map((q) => ({ q, what: q.kind })), (objects || []).map((q) => ({ q, what: q.kind })))) {\n      const q = it.q;\n      if (!ids.has(q.wall)) {\n        out.push({ kind: it.what, id: q.id, why: \"The \" + it.what + \" \" + q.id + \" is on a wall that would no longer exist\" });\n        continue;\n      }\n      const f = segmentFrame(o, q.wall);\n      if (q.x < -0.5 || q.x + q.w > f.len + 0.5) out.push({ kind: it.what, id: q.id, why: \"The \" + it.what + \" \" + q.id + \" would no longer fit on its wall (\" + f.len + \" mm)\" });\n    }\n    return out;\n  }\n  function triangulate(o) {\n    const P2 = o.walls, idx = P2.map((_, i) => i), out = [];\n    const cross5 = (a, b, c) => (P2[b].x - P2[a].x) * (P2[c].z - P2[a].z) - (P2[b].z - P2[a].z) * (P2[c].x - P2[a].x);\n    const inTri = (p, a, b, c) => {\n      const s = (u, v, w) => (P2[v].x - P2[u].x) * (w.z - P2[u].z) - (P2[v].z - P2[u].z) * (w.x - P2[u].x);\n      const q = P2[p], d1 = s(a, b, q), d2 = s(b, c, q), d3 = s(c, a, q);\n      return d1 >= 0 && d2 >= 0 && d3 >= 0 && !(d1 === 0 && d2 === 0 && d3 === 0);\n    };\n    let guard = 0;\n    while (idx.length > 3 && guard++ < 1e4) {\n      let cut = false;\n      for (let k = 0; k < idx.length; k++) {\n        const a = idx[(k - 1 + idx.length) % idx.length], b = idx[k], c = idx[(k + 1) % idx.length];\n        if (cross5(a, b, c) <= 0) continue;\n        if (idx.some((p) => p !== a && p !== b && p !== c && inTri(p, a, b, c))) continue;\n        out.push([a, b, c]);\n        idx.splice(k, 1);\n        cut = true;\n        break;\n      }\n      if (!cut) break;\n    }\n    if (idx.length === 3) out.push([idx[0], idx[1], idx[2]]);\n    return out;\n  }\n\n  // v2/src/model/room-style.js\n  var rgb2 = (hex) => [(hex >> 16 & 255) / 255, (hex >> 8 & 255) / 255, (hex & 255) / 255];\n  var WALL_COLOURS = [\n    { id: \"studio\", name: \"Studio grey\", hex: 12371149 },\n    /* a pure neutral white (task 1790948486103, owner: \u00ABnormal pure white is missing\u00BB); \"white\" below keeps its\n       id so older plans keep their soft white */\n    { id: \"pure-white\", name: \"White\", hex: 16777215 },\n    { id: \"white\", name: \"Soft white\", hex: 15197404 },\n    { id: \"cream\", name: \"Cream\", hex: 15129539 },\n    { id: \"sage\", name: \"Sage green\", hex: 11845800 },\n    { id: \"blue\", name: \"Powder blue\", hex: 11123403 },\n    { id: \"taupe\", name: \"Taupe\", hex: 12562849 },\n    { id: \"terracotta\", name: \"Terracotta\", hex: 13014908 },\n    { id: \"charcoal\", name: \"Charcoal\", hex: 6054246 }\n  ].map((c) => Object.assign(c, { rgb: rgb2(c.hex) }));\n  var FLOOR_FINISHES = [\n    { id: \"plain\", name: \"Plain\", colours: [\n      { id: \"studio\", name: \"Studio grey\", hex: 13357528 },\n      { id: \"stone\", name: \"Stone\", hex: 12170926 },\n      { id: \"sand\", name: \"Sand\", hex: 14077111 },\n      { id: \"slate\", name: \"Slate\", hex: 7765123 }\n    ] },\n    { id: \"wood\", name: \"Wood\", colours: [\n      { id: \"light-oak\", name: \"Light oak\", hex: 13610628 },\n      { id: \"natural-oak\", name: \"Natural oak\", hex: 11831130 },\n      { id: \"walnut\", name: \"Walnut\", hex: 8017465 },\n      { id: \"grey-oak\", name: \"Grey oak\", hex: 10525328 }\n    ] },\n    { id: \"tile\", name: \"Tiles\", colours: [\n      { id: \"white\", name: \"White\", hex: 15066078 },\n      /* task 1791114332883, 04.10.2026: the owner asked for a pink colour for the floor tiles (Room > Floor); a dusty\n         ceramic pink, light enough that the grout of floor-texture.js still reads as tiles. Owner again 04.10.2026 (task\n         1791100473866): \u00ABCome on, it's missing. Add pink color of tiles into menu for the floor\u00BB - it was LAST of six,\n         off the end of a narrow strip: now right after White (the Tiles default stays White, plans keep their ids). */\n      { id: \"pink\", name: \"Pink\", hex: 15248054 },\n      { id: \"grey\", name: \"Grey\", hex: 10988204 },\n      { id: \"terracotta\", name: \"Terracotta\", hex: 11825231 },\n      { id: \"black\", name: \"Black\", hex: 4013890 }\n    ] }\n  ];\n  for (const f of FLOOR_FINISHES) for (const c of f.colours) c.rgb = rgb2(c.hex);\n  var OPENING_COLOURS = {\n    frame: rgb2(15987438),\n    glass: rgb2(13623532),\n    leaf: rgb2(15789801),\n    handle: rgb2(12172738)\n  };\n  var OPENING_KINDS = {\n    window: { name: \"Window\", w: [300, 3e3], h: [300, 2400], y: [0, 2e3], def: { w: 1e3, h: 1100, y: 950 } },\n    door: { name: \"Door\", w: [600, 1800], h: [1800, 2400], y: [0, 0], def: { w: 838, h: 1981, y: 0 } }\n  };\n  var OPENING_MAX = 12;\n  var OPENING_CORNER = 50;\n  var OPENING_GAP = 100;\n  var OPENING_HEAD = 50;\n  var WALL_IDS = [\"back\", \"left\", \"right\", \"front\"];\n  var WALL_NAMES = { back: \"Back wall\", left: \"Left wall\", right: \"Right wall\", front: \"Front wall\" };\n  function roomOutlineOf(room) {\n    room = room === void 0 ? UB_SCENE && UB_SCENE.room : room;\n    if (!room || !room.outline) return null;\n    const v = validateOutline(room.outline);\n    return v.ok && !isRectOutline(v.outline) ? v.outline : null;\n  }\n  function roomWallIds(room) {\n    const o = roomOutlineOf(room);\n    return o ? o.walls.map((p) => p.id) : WALL_IDS;\n  }\n  function isRoomWall(room, id) {\n    return roomWallIds(room).indexOf(id) >= 0;\n  }\n  function wallNameOf(room, id) {\n    if (WALL_NAMES[id]) return WALL_NAMES[id];\n    const o = roomOutlineOf(room), i = o ? o.walls.findIndex((p) => p.id === id) : -1;\n    return i >= 0 ? \"Wall \" + (i + 1) : \"Wall\";\n  }\n  function wallColourOf(room) {\n    const id = room && room.wallColour;\n    return WALL_COLOURS.find((c) => c.id === id) || WALL_COLOURS[0];\n  }\n  function floorFinishOf(room) {\n    const id = room && room.floorFinish;\n    return FLOOR_FINISHES.find((f) => f.id === id) || FLOOR_FINISHES[0];\n  }\n  function floorColourOf(room) {\n    const f = floorFinishOf(room), id = room && room.floorColour;\n    return f.colours.find((c) => c.id === id) || f.colours[0];\n  }\n  function wallIsDefault(room) {\n    return wallColourOf(room).id === WALL_COLOURS[0].id;\n  }\n  function floorIsDefault(room) {\n    return floorFinishOf(room).id === \"plain\" && floorColourOf(room).id === FLOOR_FINISHES[0].colours[0].id;\n  }\n  function openingsOf(room) {\n    if (!room || !Array.isArray(room.openings)) return [];\n    return room.openings.filter((o) => o && OPENING_KINDS[o.kind] && isRoomWall(room, o.wall) && [o.x, o.w, o.h, o.y].every((v) => typeof v === \"number\" && isFinite(v)) && o.w > 0 && o.h > 0);\n  }\n  function wallFrame(wall, sz, room) {\n    const ol = roomOutlineOf(room);\n    if (ol) {\n      const f = segmentFrame(ol, wall);\n      return f ? { len: f.len, axis: f.axis, at: f.at, pt: f.pt, dir: f.dir, inward: f.inward, start: f.start, angled: !f.axis } : null;\n    }\n    sz = sz || roomSize();\n    switch (wall) {\n      case \"back\":\n        return {\n          len: sz.width,\n          axis: \"z\",\n          at: 0,\n          pt: (a, dIn) => [a, dIn],\n          dir: [1, 0],\n          inward: [0, 1]\n        };\n      case \"front\":\n        return {\n          len: sz.width,\n          axis: \"z\",\n          at: sz.depth,\n          pt: (a, dIn) => [sz.width - a, sz.depth - dIn],\n          dir: [-1, 0],\n          inward: [0, -1]\n        };\n      case \"left\":\n        return {\n          len: sz.depth,\n          axis: \"x\",\n          at: 0,\n          pt: (a, dIn) => [dIn, sz.depth - a],\n          dir: [0, -1],\n          inward: [1, 0]\n        };\n      case \"right\":\n        return {\n          len: sz.depth,\n          axis: \"x\",\n          at: sz.width,\n          pt: (a, dIn) => [sz.width - dIn, a],\n          dir: [0, 1],\n          inward: [-1, 0]\n        };\n      default:\n        return null;\n    }\n  }\n  function wallSeenFrom(wall, sz, eye) {\n    const fr = wallFrame(wall, sz);\n    if (!fr || !eye) return true;\n    if (fr.angled) return (eye[0] - fr.start[0]) * fr.inward[0] + (eye[2] - fr.start[1]) * fr.inward[1] > 0;\n    const k = fr.axis === \"x\" ? 0 : 2;\n    const n = fr.axis === \"x\" ? fr.inward[0] : fr.inward[1];\n    return (eye[k] - fr.at) * n > 0;\n  }\n  function wallBox(fr, a0, a1, d0, d1) {\n    const ps = [fr.pt(a0, d0), fr.pt(a1, d1), fr.pt(a0, d1), fr.pt(a1, d0)];\n    return { x0: Math.min(...ps.map((p) => p[0])), x1: Math.max(...ps.map((p) => p[0])), z0: Math.min(...ps.map((p) => p[1])), z1: Math.max(...ps.map((p) => p[1])) };\n  }\n  function openingLimits(kind, sz, wall) {\n    sz = sz || roomSize();\n    const K2 = OPENING_KINDS[kind];\n    const fr = wallFrame(wall || \"back\", sz);\n    const len = fr ? fr.len : sz.width;\n    const wMax = Math.max(K2.w[0], Math.min(K2.w[1], len - 2 * OPENING_CORNER));\n    const hMax = Math.max(K2.h[0], Math.min(K2.h[1], sz.height - OPENING_HEAD));\n    return { w: [K2.w[0], wMax], h: [K2.h[0], hMax], y: [K2.y[0], Math.min(K2.y[1], Math.max(0, sz.height - OPENING_HEAD - K2.h[0]))] };\n  }\n  var DOOR_CLEAR = 900;\n  var DOOR_ARCH = 45;\n  var WINDOW_DEPTH = 300;\n  function openingZone(op, sz) {\n    sz = sz || roomSize();\n    const fr = wallFrame(op.wall, sz);\n    if (!fr) return null;\n    const door = op.kind === \"door\";\n    const a0 = door ? op.x - DOOR_ARCH : op.x, a1 = op.x + op.w + (door ? DOOR_ARCH : 0);\n    return {\n      op,\n      kind: op.kind,\n      box: wallBox(fr, a0, a1, 0, door ? DOOR_CLEAR : WINDOW_DEPTH),\n      v0: door ? 0 : op.y,\n      v1: door ? op.y + op.h + DOOR_ARCH : op.y + op.h\n    };\n  }\n  function unitVSpan(u) {\n    const bot = u.family === \"wall\" ? (u.y || 0) + LEG_H : 0;\n    return [bot, (u.y || 0) + (u.h || 0) + LEG_H];\n  }\n  function unitInZone(u, z, x, zz) {\n    if (!u || !z) return false;\n    const vs = unitVSpan(u);\n    if (vs[1] <= z.v0 + 1 || vs[0] >= z.v1 - 1) return false;\n    const ox = u.x, oz = u.z;\n    if (x != null) u.x = x;\n    if (zz != null) u.z = zz;\n    let hit2 = false;\n    try {\n      for (const b of footBoxes(u)) {\n        if (b.x1 > z.box.x0 + 0.5 && b.x0 < z.box.x1 - 0.5 && b.z1 > z.box.z0 + 0.5 && b.z0 < z.box.z1 - 0.5) {\n          hit2 = true;\n          break;\n        }\n      }\n    } finally {\n      u.x = ox;\n      u.z = oz;\n    }\n    return hit2;\n  }\n  function openingClashes(units, op, sz) {\n    const z = openingZone(op, sz);\n    if (!z) return [];\n    return (units || []).filter((u) => unitInZone(u, z));\n  }\n  function checkOpening(room, op, units, sz, prev) {\n    sz = sz || roomSize();\n    const fr = wallFrame(op.wall, sz);\n    const K2 = OPENING_KINDS[op.kind];\n    if (!fr || !K2) return { ok: false, why: \"That is not a wall of this room\" };\n    const what = K2.name.toLowerCase();\n    if (op.x < OPENING_CORNER - 0.5 || op.x + op.w > fr.len - OPENING_CORNER + 0.5)\n      return { ok: false, why: \"The \" + what + \" must fit on the \" + wallNameOf(room, op.wall).toLowerCase() + \" (\" + fr.len + \" mm) with \" + OPENING_CORNER + \" mm clear of each corner\" };\n    if (op.y + op.h > sz.height - OPENING_HEAD + 0.5)\n      return { ok: false, why: \"The \" + what + \" would reach the ceiling - keep its top \" + OPENING_HEAD + \" mm below \" + sz.height + \" mm\" };\n    for (const o of openingsOf(room)) {\n      if (o.id === op.id || o.wall !== op.wall) continue;\n      if (op.x < o.x + o.w + OPENING_GAP - 0.5 && o.x < op.x + op.w + OPENING_GAP - 0.5)\n        return { ok: false, why: \"It would run into the \" + OPENING_KINDS[o.kind].name.toLowerCase() + \" already on the \" + wallNameOf(room, op.wall).toLowerCase() + \" - keep \" + OPENING_GAP + \" mm between them\" };\n    }\n    for (const b of room && Array.isArray(room.objects) ? room.objects : []) {\n      if (!b || b.wall !== op.wall || ![b.x, b.y, b.w, b.h].every((v) => typeof v === \"number\" && isFinite(v))) continue;\n      const v0 = op.kind === \"door\" ? 0 : op.y, v1 = op.y + op.h;\n      if (op.x < b.x + b.w - 0.5 && b.x < op.x + op.w - 0.5 && v0 < b.y + b.h - 0.5 && b.y < v1 - 0.5)\n        return { ok: false, why: \"It would run into the boiler on the \" + wallNameOf(room, op.wall).toLowerCase() };\n    }\n    const pz = prev ? openingZone(prev, sz) : null;\n    const hit2 = openingClashes(units || [], op, sz).filter((u) => !(pz && unitInZone(u, pz)));\n    if (hit2.length) return { ok: false, why: \"cabinet\", units: hit2 };\n    return { ok: true };\n  }\n  function freeSpotFor(room, kind, units, sz, prefer, only) {\n    sz = sz || roomSize();\n    const K2 = OPENING_KINDS[kind];\n    const ids = roomWallIds(room);\n    const walls = prefer && ids.indexOf(prefer) >= 0 ? only ? [prefer] : [prefer].concat(ids.filter((w) => w !== prefer)) : ids;\n    for (const wall of walls) {\n      const fr = wallFrame(wall, sz), lim = openingLimits(kind, sz, wall);\n      const w = clamp4(K2.def.w, lim.w[0], lim.w[1]);\n      const h = clamp4(K2.def.h, lim.h[0], lim.h[1]);\n      const y = clamp4(K2.def.y, lim.y[0], lim.y[1]);\n      const step = 50, found = [];\n      for (let x2 = OPENING_CORNER; x2 + w <= fr.len - OPENING_CORNER; x2 += step) {\n        const op2 = { id: \"__probe\", kind, wall, x: x2, w, h, y };\n        if (checkOpening(room, op2, units, sz).ok) found.push(x2);\n      }\n      if (!found.length) continue;\n      let best = [found[0], found[0]], cur = [found[0], found[0]];\n      for (let i = 1; i < found.length; i++) {\n        if (found[i] - found[i - 1] <= step + 0.5) cur[1] = found[i];\n        else cur = [found[i], found[i]];\n        if (cur[1] - cur[0] > best[1] - best[0]) best = cur.slice();\n      }\n      const x = Math.round((best[0] + best[1]) / 2 / 10) * 10;\n      const op = { id: \"__probe\", kind, wall, x, w, h, y };\n      if (checkOpening(room, op, units, sz).ok) return { wall, x, w, h, y };\n      return { wall, x: best[0], w, h, y };\n    }\n    return null;\n  }\n  function nextOpeningId(room, kind) {\n    const p = kind === \"door\" ? \"D\" : \"W\";\n    let n = 0;\n    for (const o of openingsOf(room)) {\n      const m = String(o.id || \"\").match(/^[A-Z](\\d+)$/);\n      if (m) n = Math.max(n, Number(m[1]));\n    }\n    return p + (n + 1);\n  }\n  function openingLabel(room, op) {\n    const same = openingsOf(room).filter((o) => o.kind === op.kind);\n    return OPENING_KINDS[op.kind].name + \" \" + (same.findIndex((o) => o.id === op.id) + 1);\n  }\n\n  // v2/src/model/room-partitions.js\n  var PART_KINDS = [\"wall\", \"enclosure\", \"solid\"];\n  var PART_THICK = { def: 100, min: 10, max: 999 };\n  var doorDefault = () => ({ w: OPENING_KINDS.door.def.w, h: OPENING_KINDS.door.def.h });\n  var r17 = (v) => Math.round(v);\n  function partitionsOf(room) {\n    if (!room || !Array.isArray(room.partitions)) return [];\n    return room.partitions.filter((p) => p && PART_KINDS.includes(p.kind) && Array.isArray(p.pts) && p.pts.length >= (p.kind === \"wall\" ? 2 : 3) && p.pts.every((q) => q && isFinite(q.x) && isFinite(q.z)));\n  }\n  var isClosed = (p) => p.kind !== \"wall\";\n  function partSegments(p) {\n    const n = p.pts.length, out = [], m = isClosed(p) ? n : n - 1;\n    for (let i = 0; i < m; i++) {\n      const a = p.pts[i], b = p.pts[(i + 1) % n], dx = b.x - a.x, dz = b.z - a.z, len = Math.hypot(dx, dz);\n      if (!(len > 0)) continue;\n      const dir = [dx / len, dz / len];\n      out.push({ seg: i, a, b, len: r17(len), dir, nrm: [-dir[1], dir[0]], axis: Math.abs(dz) < 0.5 ? \"z\" : Math.abs(dx) < 0.5 ? \"x\" : null });\n    }\n    return out;\n  }\n  function nextPartId(parts) {\n    let n = 0;\n    for (const p of parts || []) {\n      const m = /^p(\\d+)$/.exec(String(p.id));\n      if (m) n = Math.max(n, Number(m[1]));\n    }\n    return \"p\" + (n + 1);\n  }\n  function nextDoorId(parts) {\n    let n = 0;\n    for (const p of parts || []) for (const d of p.doors || []) {\n      const m = /^d(\\d+)$/.exec(String(d.id));\n      if (m) n = Math.max(n, Number(m[1]));\n    }\n    return \"d\" + (n + 1);\n  }\n  var cross2 = (a, b, c) => (b.x - a.x) * (c.z - a.z) - (b.z - a.z) * (c.x - a.x);\n  function segsCross2(p1, p2, p3, p4) {\n    const d1 = cross2(p3, p4, p1), d2 = cross2(p3, p4, p2), d3 = cross2(p1, p2, p3), d4 = cross2(p1, p2, p4);\n    return (d1 > 0.5 && d2 < -0.5 || d1 < -0.5 && d2 > 0.5) && (d3 > 0.5 && d4 < -0.5 || d3 < -0.5 && d4 > 0.5);\n  }\n  function polyArea(pts) {\n    let s = 0;\n    for (let i = 0; i < pts.length; i++) {\n      const p = pts[i], q = pts[(i + 1) % pts.length];\n      s += p.x * q.z - q.x * p.z;\n    }\n    return s / 2;\n  }\n  var onSeg = (p, a, b) => Math.abs(cross2(a, b, p)) < 0.5 * Math.hypot(b.x - a.x, b.z - a.z) && p.x >= Math.min(a.x, b.x) - 0.5 && p.x <= Math.max(a.x, b.x) + 0.5 && p.z >= Math.min(a.z, b.z) - 0.5 && p.z <= Math.max(a.z, b.z) + 0.5;\n  var partHeight = (p, ceil) => p && p.h != null ? p.h : ceil;\n  function validatePartition(p, outline2, ceil) {\n    ceil = ceil || 2400;\n    if (!p || !PART_KINDS.includes(p.kind)) return { ok: false, why: \"Not a kind of internal wall the planner knows\" };\n    const n = p.pts.length, closed2 = isClosed(p);\n    if (n < (closed2 ? 3 : 2)) return { ok: false, why: closed2 ? \"A closed shape needs at least three corners\" : \"A wall needs a start and an end\" };\n    for (const s of partSegments(p)) if (s.len < WALL_MIN - 0.5) return { ok: false, why: \"A wall is \" + s.len + \" mm long - every wall must be at least \" + WALL_MIN + \" mm\" };\n    if (partSegments(p).length !== (closed2 ? n : n - 1)) return { ok: false, why: \"Two corners are on the same spot\" };\n    const S2 = partSegments(p);\n    for (let i = 0; i < S2.length; i++) for (let j = i + 1; j < S2.length; j++) {\n      if (j === i + 1 || closed2 && i === 0 && j === S2.length - 1) continue;\n      if (segsCross2(S2[i].a, S2[i].b, S2[j].a, S2[j].b)) return { ok: false, why: \"The shape crosses itself\" };\n    }\n    if (closed2 && Math.abs(polyArea(p.pts)) < WALL_MIN * WALL_MIN) return { ok: false, why: \"The shape has no inside\" };\n    if (p.kind !== \"solid\") {\n      const t = p.thick == null ? PART_THICK.def : p.thick;\n      if (!(t >= PART_THICK.min && t <= PART_THICK.max)) return { ok: false, why: \"This planner takes a wall \" + PART_THICK.min + \" to \" + PART_THICK.max + \" mm thick (thicker: draw a Solid block)\" };\n    }\n    if (p.h != null && !(p.h >= WALL_MIN && p.h <= ceil + 0.5)) return { ok: false, why: \"Its height must be \" + WALL_MIN + \" mm to the ceiling (\" + ceil + \" mm)\" };\n    const wallH = partHeight(p, ceil);\n    if (outline2) {\n      const edges = segments(outline2).map((f) => ({ a: { x: f.start[0], z: f.start[1] }, b: { x: f.end[0], z: f.end[1] } }));\n      for (const q of p.pts) if (!insideOutline(outline2, q.x, q.z) && !edges.some((e) => onSeg(q, e.a, e.b))) return { ok: false, why: \"It must stand inside the room\" };\n      for (const s of S2) {\n        for (const e of edges) if (segsCross2(s.a, s.b, e.a, e.b)) return { ok: false, why: \"It would run through a wall of the room\" };\n        const m = { x: (s.a.x + s.b.x) / 2, z: (s.a.z + s.b.z) / 2 };\n        if (!insideOutline(outline2, m.x, m.z) && !edges.some((e) => onSeg(m, e.a, e.b))) return { ok: false, why: \"It must stand inside the room\" };\n      }\n    }\n    for (const d of p.doors || []) {\n      if (p.kind === \"solid\") return { ok: false, why: \"A solid block has no door\" };\n      const s = S2.find((q) => q.seg === d.seg);\n      if (!s) return { ok: false, why: \"A door is on a wall that is not there\" };\n      if (!(d.w >= WALL_MIN)) return { ok: false, why: \"This planner takes an opening at least \" + WALL_MIN + \" mm wide\" };\n      if (d.at < -0.5 || d.at + d.w > s.len + 0.5) return { ok: false, why: \"The doorway must fit on its wall (\" + s.len + \" mm) - up to \" + s.len + \" mm wide\" };\n      if (!(d.h >= WALL_MIN && d.h <= wallH + 0.5)) return { ok: false, why: \"A doorway's height is \" + WALL_MIN + \" mm up to the wall's own top (\" + wallH + \" mm)\" };\n    }\n    const D2 = (p.doors || []).slice().sort((u, v) => u.seg - v.seg || u.at - v.at);\n    for (let i = 1; i < D2.length; i++) if (D2[i].seg === D2[i - 1].seg && D2[i].at < D2[i - 1].at + D2[i - 1].w - 0.5) return { ok: false, why: \"Two doorways overlap\" };\n    return { ok: true };\n  }\n  function validatePartitions(parts, outline2, ceil) {\n    for (const p of parts) {\n      const v = validatePartition(p, outline2, ceil);\n      if (!v.ok) return Object.assign({ id: p.id }, v);\n    }\n    for (let i = 0; i < parts.length; i++) for (let j = i + 1; j < parts.length; j++)\n      for (const s of partSegments(parts[i])) for (const t of partSegments(parts[j]))\n        if (segsCross2(s.a, s.b, t.a, t.b)) return { ok: false, id: parts[j].id, why: \"Two internal walls cross - end one on the other instead\" };\n    if (new Set(parts.map((p) => p.id)).size !== parts.length) return { ok: false, why: \"Two internal walls have the same name\" };\n    return { ok: true };\n  }\n  function solidPieces(parts, ceil) {\n    ceil = ceil || 2400;\n    const out = [];\n    for (const p of parts) {\n      const top = partHeight(p, ceil);\n      if (p.kind === \"solid\") {\n        out.push({ id: p.id, kind: \"solid\", poly: p.pts.map((q) => ({ x: q.x, z: q.z })), y0: 0, y1: top });\n        continue;\n      }\n      const h = (p.thick == null ? PART_THICK.def : p.thick) / 2;\n      for (const s of partSegments(p)) {\n        const gaps = (p.doors || []).filter((d) => d.seg === s.seg).sort((u, v) => u.at - v.at);\n        let from = 0;\n        const runs = [];\n        for (const g2 of gaps) {\n          if (g2.at > from) runs.push([from, g2.at]);\n          from = Math.max(from, g2.at + g2.w);\n        }\n        if (from < s.len) runs.push([from, s.len]);\n        for (const [u0, u1] of runs) {\n          const e0 = u0 === 0 && (isClosed(p) || s.seg > 0) ? h : 0, e1 = u1 === s.len && (isClosed(p) || s.seg < p.pts.length - 2) ? h : 0;\n          const P3 = (u, v) => ({ x: s.a.x + s.dir[0] * u + s.nrm[0] * v, z: s.a.z + s.dir[1] * u + s.nrm[1] * v });\n          out.push({ id: p.id, kind: \"wall\", seg: s.seg, from: u0, to: u1, poly: [P3(u0 - e0, -h), P3(u1 + e1, -h), P3(u1 + e1, h), P3(u0 - e0, h)], y0: 0, y1: top });\n        }\n        const P2 = (u, v) => ({ x: s.a.x + s.dir[0] * u + s.nrm[0] * v, z: s.a.z + s.dir[1] * u + s.nrm[1] * v });\n        for (const g2 of gaps) if (g2.h < top - 0.5) out.push({ id: p.id, kind: \"over\", seg: s.seg, door: g2.id, poly: [P2(g2.at, -h), P2(g2.at + g2.w, -h), P2(g2.at + g2.w, h), P2(g2.at, h)], y0: g2.h, y1: top });\n      }\n    }\n    return out;\n  }\n  function boxHitsPiece(b, poly) {\n    const B = [{ x: b.x0, z: b.z0 }, { x: b.x1, z: b.z0 }, { x: b.x1, z: b.z1 }, { x: b.x0, z: b.z1 }];\n    const e = 0.5;\n    const inPoly = (x, z) => {\n      let c = false;\n      for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n        const a = poly[i], q = poly[j];\n        if (a.z > z !== q.z > z && x < (q.x - a.x) * (z - a.z) / (q.z - a.z) + a.x) c = !c;\n      }\n      return c;\n    };\n    if (poly.some((p) => p.x > b.x0 + e && p.x < b.x1 - e && p.z > b.z0 + e && p.z < b.z1 - e)) return true;\n    if (B.some((p) => inPoly(p.x + (p.x === b.x0 ? e : -e), p.z + (p.z === b.z0 ? e : -e)))) return true;\n    for (let i = 0; i < 4; i++) for (let j = 0; j < poly.length; j++)\n      if (segsCross2(B[i], B[(i + 1) % 4], poly[j], poly[(j + 1) % poly.length])) return true;\n    const cx = (b.x0 + b.x1) / 2, cz = (b.z0 + b.z1) / 2;\n    return inPoly(cx, cz);\n  }\n  var spansMeet = (a0, a1, b0, b1) => a0 < b1 - 0.5 && b0 < a1 - 0.5;\n  var copyParts = (parts) => parts.map((p) => Object.assign({}, p, { pts: p.pts.map((q) => ({ x: q.x, z: q.z })), doors: (p.doors || []).map((d) => Object.assign({}, d)) }));\n  var CEIL = 2400;\n  function setCeiling(h) {\n    if (h > 0) CEIL = h;\n  }\n  function doneP(parts, outline2, id) {\n    const v = validatePartitions(parts, outline2, CEIL);\n    return v.ok ? { ok: true, parts, id } : v;\n  }\n  function addPartition(parts, outline2, kind, pts, opts) {\n    if (!PART_KINDS.includes(kind)) return { ok: false, why: \"Choose a wall, an enclosure or a solid block\" };\n    const c = copyParts(parts || []), id = nextPartId(c);\n    const p = { id, kind, pts: pts.map((q) => ({ x: r17(q.x), z: r17(q.z) })) };\n    if (kind !== \"wall\" && p.pts.length > 3) {\n      const a = p.pts[0], z = p.pts[p.pts.length - 1];\n      if (a.x === z.x && a.z === z.z) p.pts.pop();\n    }\n    if (kind !== \"solid\") {\n      p.thick = opts && opts.thick || PART_THICK.def;\n      p.doors = [];\n    }\n    c.push(p);\n    return doneP(c, outline2, id);\n  }\n  function removePartition(parts, id) {\n    const c = copyParts(parts || []), n = c.length, out = c.filter((p) => p.id !== id);\n    return out.length === n ? { ok: false, why: \"No such internal wall\" } : { ok: true, parts: out };\n  }\n  function movePartition(parts, outline2, id, dx, dz) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id);\n    if (!p) return { ok: false, why: \"No such internal wall\" };\n    for (const q of p.pts) {\n      q.x = r17(q.x + dx);\n      q.z = r17(q.z + dz);\n    }\n    return doneP(c, outline2, id);\n  }\n  function movePartPoint(parts, outline2, id, i, x, z, square) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id);\n    if (!p || !p.pts[i]) return { ok: false, why: \"No such corner\" };\n    const n = p.pts.length, closed2 = isClosed(p), v = p.pts[i];\n    x = r17(x);\n    z = r17(z);\n    if (square) for (const j of [i - 1, i + 1]) {\n      if (!closed2 && (j < 0 || j >= n)) continue;\n      const q = p.pts[(j + n) % n];\n      if (Math.abs(q.z - v.z) < 0.5) q.z = z;\n      else if (Math.abs(q.x - v.x) < 0.5) q.x = x;\n    }\n    v.x = x;\n    v.z = z;\n    return doneP(c, outline2, id);\n  }\n  function setPartThick(parts, outline2, id, t) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id);\n    if (!p || p.kind === \"solid\") return { ok: false, why: \"Only walls have a thickness\" };\n    p.thick = r17(Number(t));\n    return doneP(c, outline2, id);\n  }\n  function setPartHeight(parts, outline2, id, h) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id);\n    if (!p) return { ok: false, why: \"No such internal wall\" };\n    if (h == null || h === \"\") delete p.h;\n    else p.h = r17(Number(h));\n    return doneP(c, outline2, id);\n  }\n  function addPartDoor(parts, outline2, id, seg, w, at, h) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id);\n    if (!p) return { ok: false, why: \"No such internal wall\" };\n    if (p.kind === \"solid\") return { ok: false, why: \"A solid block has no door\" };\n    const s = partSegments(p).find((q) => q.seg === seg);\n    if (!s) return { ok: false, why: \"Choose one of its walls\" };\n    const D0 = doorDefault();\n    w = r17(Number(w) || D0.w);\n    const hh = r17(Number(h) || Math.min(D0.h, partHeight(p, CEIL)));\n    const a = at == null ? r17((s.len - w) / 2) : r17(Number(at));\n    const did = nextDoorId(c);\n    p.doors.push({ id: did, seg, at: a, w, h: hh });\n    const r = doneP(c, outline2, id);\n    return r.ok ? Object.assign(r, { door: did }) : r;\n  }\n  function setPartDoor(parts, outline2, id, did, v) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id), d = p && (p.doors || []).find((q) => q.id === did);\n    if (!d) return { ok: false, why: \"No such doorway\" };\n    if (v.w != null && v.w !== \"\") d.w = r17(Number(v.w));\n    if (v.h != null && v.h !== \"\") d.h = r17(Number(v.h));\n    if (v.at != null && v.at !== \"\") d.at = r17(Number(v.at));\n    return doneP(c, outline2, id);\n  }\n  function removePartDoor(parts, id, did) {\n    const c = copyParts(parts || []), p = c.find((q) => q.id === id);\n    if (!p || !(p.doors || []).some((d) => d.id === did)) return { ok: false, why: \"No such doorway\" };\n    p.doors = p.doors.filter((d) => d.id !== did);\n    return { ok: true, parts: c };\n  }\n  function partitionIssues(parts, outline2, boxes, ceil) {\n    const out = [];\n    const v = validatePartitions(parts, outline2, ceil || CEIL);\n    if (!v.ok) out.push({ kind: \"partition\", id: v.id || null, why: v.why });\n    const pieces = solidPieces(parts, ceil || CEIL);\n    for (const b of boxes || []) {\n      const hit2 = pieces.find((pc) => (b.v0 == null || spansMeet(b.v0, b.v1, pc.y0, pc.y1)) && boxHitsPiece(b, pc.poly));\n      if (hit2) out.push({ kind: \"cabinet\", id: b.id, why: (b.label || \"A cabinet\") + \" would stand in \" + (hit2.kind === \"solid\" ? \"a solid block\" : hit2.kind === \"over\" ? \"the wall over a doorway\" : \"an internal wall\") });\n    }\n    return out;\n  }\n  function partAt(parts, x, z, tol) {\n    let best = null;\n    for (const p of parts) {\n      if (p.kind === \"solid\") {\n        let c = false;\n        const P2 = p.pts;\n        for (let i = 0, j = P2.length - 1; i < P2.length; j = i++) {\n          const a = P2[i], q = P2[j];\n          if (a.z > z !== q.z > z && x < (q.x - a.x) * (z - a.z) / (q.z - a.z) + a.x) c = !c;\n        }\n        if (c) return { id: p.id, seg: null, d: 0 };\n      }\n      for (const s of partSegments(p)) {\n        const t = Math.max(0, Math.min(s.len, (x - s.a.x) * s.dir[0] + (z - s.a.z) * s.dir[1]));\n        const d = Math.hypot(x - s.a.x - s.dir[0] * t, z - s.a.z - s.dir[1] * t);\n        if (d <= tol && (!best || d < best.d)) best = { id: p.id, seg: s.seg, d, along: t };\n      }\n    }\n    return best;\n  }\n\n  // v2/src/model/room.js\n  function freeOutline() {\n    const r = UB_SCENE && UB_SCENE.room;\n    if (!r || !r.outline || !roomOn()) return null;\n    const v = validateOutline(r.outline);\n    return v.ok && !isRectOutline(v.outline) ? v.outline : null;\n  }\n  var RECT_FACE = {\n    back: { axis: \"z\", dir: -1, inward: [0, 1] },\n    front: { axis: \"z\", dir: 1, inward: [0, -1] },\n    left: { axis: \"x\", dir: -1, inward: [1, 0] },\n    right: { axis: \"x\", dir: 1, inward: [-1, 0] }\n  };\n  var RECT_CORNER = {\n    \"back>right\": { id: \"back-right\", rot: 0 },\n    \"right>front\": { id: \"front-right\", rot: 1 },\n    \"front>left\": { id: \"front-left\", rot: 2 },\n    \"left>back\": { id: \"back-left\", rot: 3 }\n  };\n  var FACE_BY_INWARD = [[[0, 1], \"back\"], [[-1, 0], \"right\"], [[0, -1], \"front\"], [[1, 0], \"left\"]];\n  function seatWalls(fo) {\n    fo = fo === void 0 ? freeOutline() : fo;\n    if (!fo) return null;\n    const out = [];\n    segments(fo).forEach(function(f, i) {\n      if (!f.axis) return;\n      const hit2 = FACE_BY_INWARD.find(function(e) {\n        return Math.abs(e[0][0] - f.inward[0]) < 1e-6 && Math.abs(e[0][1] - f.inward[1]) < 1e-6;\n      });\n      if (!hit2) return;\n      const face2 = hit2[1], F = RECT_FACE[face2];\n      const lo = f.axis === \"z\" ? Math.min(f.start[0], f.end[0]) : Math.min(f.start[1], f.end[1]);\n      const hi = f.axis === \"z\" ? Math.max(f.start[0], f.end[0]) : Math.max(f.start[1], f.end[1]);\n      out.push({\n        id: f.id,\n        face: face2,\n        axis: F.axis,\n        at: f.at,\n        dir: F.dir,\n        lo,\n        hi,\n        name: RECT_FACE[f.id] ? f.id + \" wall\" : \"wall \" + (i + 1)\n      });\n    });\n    return out;\n  }\n  function seatWallName(id) {\n    const w = seatWallById(id);\n    return w ? w.name : String(id) + \" wall\";\n  }\n  function nearAngledWall(px, pz, within) {\n    const fo = freeOutline();\n    if (!fo) return null;\n    let best = null;\n    for (const f of segments(fo)) {\n      if (f.axis) continue;\n      const t = Math.max(0, Math.min(f.len, (px - f.start[0]) * f.dir[0] + (pz - f.start[1]) * f.dir[1]));\n      const d = Math.hypot(px - (f.start[0] + f.dir[0] * t), pz - (f.start[1] + f.dir[1] * t));\n      if (d <= within && (!best || d < best.d)) best = { id: f.id, angle: f.angle, d: Math.round(d) };\n    }\n    return best;\n  }\n  function nearAngledWallBox(b, within) {\n    let best = null;\n    for (const [x, z] of [[b.x0, b.z0], [b.x1, b.z0], [b.x1, b.z1], [b.x0, b.z1]]) {\n      const r = nearAngledWall(x, z, within);\n      if (r && (!best || r.d < best.d)) best = r;\n    }\n    return best;\n  }\n  var ANGLED_WALL_SAY = \"That wall is at an angle - cabinets stand square to the room, so this one cannot go flat against it; it stays free-standing where it is\";\n  function angledWalls() {\n    const fo = freeOutline();\n    return fo ? segments(fo).filter(function(f) {\n      return !f.axis;\n    }).map(function(f) {\n      return f.id;\n    }) : [];\n  }\n  function seatWallById(id) {\n    const L = seatWalls();\n    return L ? L.find(function(w) {\n      return w.id === id;\n    }) || null : null;\n  }\n  function wallFace(id) {\n    const w = seatWallById(id);\n    return w ? w.face : id;\n  }\n  function gapToWall(b, w) {\n    return w.face === \"back\" ? b.z0 - w.at : w.face === \"front\" ? w.at - b.z1 : w.face === \"left\" ? b.x0 - w.at : w.at - b.x1;\n  }\n  function alongWall(b, w) {\n    if (w.lo == null) return true;\n    const a0 = w.axis === \"z\" ? b.x0 : b.z0, a1 = w.axis === \"z\" ? b.x1 : b.z1;\n    return Math.min(a1, w.hi) - Math.max(a0, w.lo) > 1;\n  }\n  function retWall(units) {\n    let L = null, i;\n    for (i = 0; i < units.length; i++)\n      if (units[i].type === \"corner-l\") {\n        L = units[i];\n        break;\n      }\n    if (!L) {\n      for (i = 0; i < units.length; i++)\n        if (units[i].type === \"corner-wall\") {\n          L = units[i];\n          break;\n        }\n    }\n    if (!L) return null;\n    const E = unitEnvelope(L), xf = planXf(L, E.LX, E.LZ);\n    const p = xf.p([armA(L), 0, 0]);\n    const n = xf.n([1, 0, 0]);\n    const axis = Math.abs(n[0]) > 0.5 ? \"x\" : \"z\";\n    const wall = {\n      axis,\n      at: axis === \"x\" ? p[0] : p[2],\n      dir: axis === \"x\" ? n[0] > 0 ? 1 : -1 : n[2] > 0 ? 1 : -1,\n      ownerId: L.id\n    };\n    if (L.type === \"corner-wall\") {\n      const others2 = units.filter(function(v) {\n        return v.id !== L.id;\n      });\n      const boxes = [];\n      others2.forEach(function(v) {\n        footBoxes(v).forEach(function(q) {\n          boxes.push(q);\n        });\n      });\n      if (boxes.length) {\n        const lo = Math.min.apply(null, boxes.map(function(q) {\n          return axis === \"x\" ? q.x0 : q.z0;\n        }));\n        const hi = Math.max.apply(null, boxes.map(function(q) {\n          return axis === \"x\" ? q.x1 : q.z1;\n        }));\n        const self = footBoxes(L);\n        const sLo = Math.min.apply(null, self.map(function(q) {\n          return axis === \"x\" ? q.x0 : q.z0;\n        }));\n        const sHi = Math.max.apply(null, self.map(function(q) {\n          return axis === \"x\" ? q.x1 : q.z1;\n        }));\n        if (L.roomSide !== 1 && L.roomSide !== -1) {\n          const othersMid = (lo + hi) / 2, selfMid = (sLo + sHi) / 2;\n          L.roomSide = othersMid <= selfMid ? 1 : -1;\n        }\n        wall.dir = L.roomSide;\n        wall.at = wall.dir > 0 ? Math.max(hi, sHi) : Math.min(lo, sLo);\n      }\n    }\n    return wall;\n  }\n  function syncRoom(units) {\n    const sz = roomSize();\n    ROOM.ret = { axis: \"x\", at: sz.width, dir: 1, ownerId: \"__room\" };\n    return ROOM.ret;\n  }\n  var ROOM_LIMITS = { width: [1200, 8e3], depth: [1200, 8e3], height: [2100, 3600] };\n  var ROOM_DEFAULT = { width: 3600, depth: 3e3, height: 2400 };\n  function roomOn() {\n    return true;\n  }\n  function roomHeight() {\n    const r = UB_SCENE && UB_SCENE.room || {};\n    return clamp4(\n      Math.round(r.height || ROOM_DEFAULT.height),\n      ROOM_LIMITS.height[0],\n      ROOM_LIMITS.height[1]\n    );\n  }\n  function roomSize() {\n    const r = UB_SCENE && UB_SCENE.room || {};\n    return {\n      width: clamp4(Math.round(r.width || ROOM_DEFAULT.width), ROOM_LIMITS.width[0], ROOM_LIMITS.width[1]),\n      depth: clamp4(Math.round(r.depth || ROOM_DEFAULT.depth), ROOM_LIMITS.depth[0], ROOM_LIMITS.depth[1]),\n      height: roomHeight()\n    };\n  }\n  function roomWallList() {\n    const fo = freeOutline();\n    if (fo) return seatWalls(fo);\n    const sz = roomSize();\n    return [\n      { id: \"back\", axis: \"z\", at: 0, dir: -1, name: \"back wall\" },\n      { id: \"front\", axis: \"z\", at: sz.depth, dir: 1, name: \"front wall\" },\n      { id: \"left\", axis: \"x\", at: 0, dir: -1, name: \"left wall\" },\n      { id: \"right\", axis: \"x\", at: sz.width, dir: 1, name: \"right wall\" }\n    ];\n  }\n  function roomCorners() {\n    if (!roomOn()) return [];\n    const fo = freeOutline();\n    if (fo) {\n      const out = [], n = fo.walls.length, S2 = seatWalls(fo), face2 = {};\n      for (const w of S2) face2[w.id] = w.face;\n      for (let i = 0; i < n; i++) {\n        const a = fo.walls[i].id, j = (i + 1) % n, b = fo.walls[j].id;\n        if (!face2[a] || !face2[b] || cornerAngle(fo, j) !== 90) continue;\n        const c = RECT_CORNER[face2[a] + \">\" + face2[b]];\n        if (!c) continue;\n        const named = RECT_CORNER[a + \">\" + b];\n        out.push({ id: named ? named.id : \"corner-\" + a + \"-\" + b, x: fo.walls[j].x, z: fo.walls[j].z, walls: [a, b], rot: c.rot });\n      }\n      return out;\n    }\n    const sz = roomSize();\n    return [\n      { id: \"back-left\", x: 0, z: 0, walls: [\"back\", \"left\"], rot: 3 },\n      { id: \"back-right\", x: sz.width, z: 0, walls: [\"back\", \"right\"], rot: 0 },\n      { id: \"front-left\", x: 0, z: sz.depth, walls: [\"front\", \"left\"], rot: 2 },\n      { id: \"front-right\", x: sz.width, z: sz.depth, walls: [\"front\", \"right\"], rot: 1 }\n    ];\n  }\n  function roomWalls() {\n    if (roomOn()) return roomWallList();\n    return ROOM.ret ? [MAIN_WALL, ROOM.ret] : [MAIN_WALL];\n  }\n  function protrusion(b, wall) {\n    if (!alongWall(b, wall)) return 0;\n    if (wall.axis === \"z\")\n      return wall.dir > 0 ? Math.max(0, b.z1 - wall.at) : Math.max(0, wall.at - b.z0);\n    return wall.dir > 0 ? Math.max(0, b.x1 - wall.at) : Math.max(0, wall.at - b.x0);\n  }\n  var partCache = { list: null, ceil: 0, pieces: [] };\n  function partPieces() {\n    const r = UB_SCENE && UB_SCENE.room, list = r && Array.isArray(r.partitions) ? r.partitions : null;\n    if (!list || !list.length) return [];\n    const ceil = roomHeight();\n    if (partCache.list !== list || partCache.ceil !== ceil) partCache = { list, ceil, pieces: solidPieces(partitionsOf(r), ceil) };\n    return partCache.pieces;\n  }\n  function inPartition(u, x, z) {\n    const pcs = partPieces();\n    if (!pcs.length) return false;\n    const v0 = u.family === \"wall\" ? (u.y || 0) + LEG_H : 0, v1 = (u.y || 0) + (u.h || 0) + LEG_H;\n    const live = pcs.filter((pc) => spansMeet(v0, v1, pc.y0, pc.y1));\n    if (!live.length) return false;\n    const ox = u.x, oz = u.z;\n    u.x = x;\n    u.z = z;\n    try {\n      return footBoxes(u).some((b) => live.some((pc) => boxHitsPiece(b, pc.poly)));\n    } finally {\n      u.x = ox;\n      u.z = oz;\n    }\n  }\n  function behindWall(u, x, z) {\n    if (inPartition(u, x, z)) return true;\n    const ox = u.x, oz = u.z;\n    let out = false;\n    u.x = x;\n    u.z = z;\n    const fo = freeOutline();\n    if (fo) {\n      try {\n        for (const b of footBoxes(u)) {\n          const pts = [[b.x0 + 0.5, b.z0 + 0.5], [b.x1 - 0.5, b.z0 + 0.5], [b.x1 - 0.5, b.z1 - 0.5], [b.x0 + 0.5, b.z1 - 0.5]];\n          if (!pts.every(([px, pz]) => insideOutline(fo, px, pz))) {\n            out = true;\n            break;\n          }\n          for (const f of segments(fo)) {\n            const lo = [Math.min(f.start[0], f.end[0]), Math.min(f.start[1], f.end[1])], hi = [Math.max(f.start[0], f.end[0]), Math.max(f.start[1], f.end[1])];\n            if (f.axis && lo[0] < b.x1 - 0.5 && hi[0] > b.x0 + 0.5 && lo[1] < b.z1 - 0.5 && hi[1] > b.z0 + 0.5) {\n              out = true;\n              break;\n            }\n          }\n          if (out) break;\n        }\n      } finally {\n        u.x = ox;\n        u.z = oz;\n      }\n      return out;\n    }\n    const boxes = footBoxes(u), walls = roomWalls();\n    for (let i = 0; i < boxes.length && !out; i++)\n      for (let j = 0; j < walls.length; j++)\n        if (protrusion(boxes[i], walls[j]) > 1e-3) {\n          out = true;\n          break;\n        }\n    u.x = ox;\n    u.z = oz;\n    return out;\n  }\n  function wallPush(u) {\n    let worst = 0;\n    const boxes = footBoxes(u);\n    for (let i = 0; i < boxes.length; i++) {\n      const b = boxes[i];\n      worst = Math.max(worst, protrusion(b, MAIN_WALL));\n    }\n    return worst;\n  }\n  function pushIntoRoom(u) {\n    roomWalls().forEach(function(wall) {\n      let worst = 0;\n      const boxes = footBoxes(u);\n      for (let i = 0; i < boxes.length; i++) {\n        const b = boxes[i];\n        worst = Math.max(worst, protrusion(b, wall));\n      }\n      if (worst <= 0) return;\n      const shift = -wall.dir * worst;\n      if (wall.axis === \"z\") u.z += shift;\n      else u.x += shift;\n    });\n    return u;\n  }\n\n  // v2/src/model/room-objects.js\n  var ROOM_OBJECT_MAX = 6;\n  var BOILER = {\n    name: \"Boiler\",\n    /* a starting box only, to be replaced by the real boiler's sizes (placeholder - not a standard) */\n    def: { w: 400, h: 700, d: 300, y: 1400 },\n    /* guards against a typing slip, not a product range */\n    w: [150, 1200],\n    h: [200, 1500],\n    d: [100, 800],\n    note: \"Planning placeholder - enter your boiler's own sizes; not verified for installation (no service clearances, flue or pipes yet).\"\n  };\n  var ROOM_OBJECT_KINDS = { boiler: BOILER };\n  function roomObjectsOf(room) {\n    if (!room || !Array.isArray(room.objects)) return [];\n    return room.objects.filter((o) => o && ROOM_OBJECT_KINDS[o.kind] && isRoomWall(room, o.wall) && [o.x, o.y, o.w, o.h, o.d].every((v) => typeof v === \"number\" && isFinite(v)) && o.w > 0 && o.h > 0 && o.d > 0);\n  }\n  function objectLimits(kind, sz, wall) {\n    sz = sz || roomSize();\n    const K2 = ROOM_OBJECT_KINDS[kind] || BOILER, fr = wallFrame(wall || \"back\", sz), len = fr ? fr.len : sz.width;\n    return {\n      w: [K2.w[0], Math.max(K2.w[0], Math.min(K2.w[1], len))],\n      h: [K2.h[0], Math.max(K2.h[0], Math.min(K2.h[1], sz.height))],\n      d: K2.d.slice(),\n      y: [0, Math.max(0, sz.height - K2.h[0])]\n    };\n  }\n  function objectZone(o, sz) {\n    sz = sz || roomSize();\n    const fr = wallFrame(o.wall, sz);\n    if (!fr) return null;\n    return { op: o, kind: o.kind, box: wallBox(fr, o.x, o.x + o.w, 0, o.d), v0: o.y, v1: o.y + o.h };\n  }\n  function objectLabel(room, o) {\n    const same = roomObjectsOf(room).filter((q) => q.kind === o.kind);\n    const i = same.findIndex((q) => q.id === o.id);\n    return (ROOM_OBJECT_KINDS[o.kind] || BOILER).name + \" \" + (i >= 0 ? i + 1 : same.length + 1);\n  }\n  function nextObjectId(room) {\n    let n = 0;\n    for (const o of roomObjectsOf(room)) {\n      const m = String(o.id || \"\").match(/^B(\\d+)$/);\n      if (m) n = Math.max(n, Number(m[1]));\n    }\n    return \"B\" + (n + 1);\n  }\n  var overlap1 = (a0, a1, b0, b1) => a0 < b1 - 0.5 && b0 < a1 - 0.5;\n  var boxesMeet = (p, q) => overlap1(p.x0, p.x1, q.x0, q.x1) && overlap1(p.z0, p.z1, q.z0, q.z1);\n  function checkObject(room, o, sz, openings, cabinetsIn) {\n    sz = sz || roomSize();\n    const fr = wallFrame(o.wall, sz), K2 = ROOM_OBJECT_KINDS[o.kind];\n    if (!fr || !K2) return { ok: false, why: \"That is not a wall of this room\" };\n    const what = K2.name.toLowerCase(), wallName = wallNameOf(room, o.wall).toLowerCase();\n    if (o.x < -0.5 || o.x + o.w > fr.len + 0.5) return { ok: false, why: \"The \" + what + \" must fit on the \" + wallName + \" (\" + fr.len + \" mm)\" };\n    if (o.y < -0.5 || o.y + o.h > sz.height + 0.5) return { ok: false, why: \"The \" + what + \" would go through the floor or the ceiling (\" + sz.height + \" mm)\" };\n    for (const op of openings || []) {\n      if (op.wall !== o.wall) continue;\n      const v0 = op.kind === \"door\" ? 0 : op.y, v1 = op.y + op.h;\n      if (overlap1(o.x, o.x + o.w, op.x, op.x + op.w) && overlap1(o.y, o.y + o.h, v0, v1))\n        return { ok: false, why: \"It would cover the \" + op.kind + \" on the \" + wallName };\n    }\n    const z = objectZone(o, sz);\n    for (const q of roomObjectsOf(room)) {\n      if (q.id === o.id) continue;\n      const zq = objectZone(q, sz);\n      if (zq && boxesMeet(z.box, zq.box) && overlap1(z.v0, z.v1, zq.v0, zq.v1)) return { ok: false, why: \"It would run into \" + objectLabel(room, q).toLowerCase() };\n    }\n    const hit2 = cabinetsIn ? cabinetsIn(z) : [];\n    if (hit2.length) return { ok: false, why: \"cabinet\", units: hit2 };\n    return { ok: true };\n  }\n  function freeSpotForObject(room, kind, sz, openings, cabinetsIn, prefer) {\n    sz = sz || roomSize();\n    const K2 = ROOM_OBJECT_KINDS[kind] || BOILER;\n    const ids = roomWallIds(room);\n    const walls = prefer && ids.indexOf(prefer) >= 0 ? [prefer].concat(ids.filter((w) => w !== prefer)) : ids;\n    for (const wall of walls) {\n      const fr = wallFrame(wall, sz), lim = objectLimits(kind, sz, wall);\n      const w = clamp4(K2.def.w, lim.w[0], lim.w[1]), h = clamp4(K2.def.h, lim.h[0], lim.h[1]), d = K2.def.d;\n      const y = clamp4(K2.def.y, 0, Math.max(0, sz.height - h));\n      const step = 50, found = [];\n      for (let x2 = 0; x2 + w <= fr.len; x2 += step)\n        if (checkObject(room, { id: \"__probe\", kind, wall, x: x2, y, w, h, d }, sz, openings, cabinetsIn).ok) found.push(x2);\n      if (!found.length) continue;\n      let best = [found[0], found[0]], cur = [found[0], found[0]];\n      for (let i = 1; i < found.length; i++) {\n        if (found[i] - found[i - 1] <= step + 0.5) cur[1] = found[i];\n        else cur = [found[i], found[i]];\n        if (cur[1] - cur[0] > best[1] - best[0]) best = cur.slice();\n      }\n      let x = Math.round((best[0] + best[1]) / 2 / 10) * 10;\n      if (!checkObject(room, { id: \"__probe\", kind, wall, x, y, w, h, d }, sz, openings, cabinetsIn).ok) x = best[0];\n      return { wall, x, y, w, h, d };\n    }\n    return null;\n  }\n\n  // v2/src/model/opening-zones.js\n  function roomOf() {\n    return UB_SCENE && UB_SCENE.room || null;\n  }\n  function openingZones(room, sz) {\n    const out = [];\n    for (const op of openingsOf(room || roomOf())) {\n      const z = openingZone(op, sz);\n      if (z) out.push(z);\n    }\n    for (const o of roomObjectsOf(room || roomOf())) {\n      const z = objectZone(o, sz);\n      if (z) out.push(z);\n    }\n    return out;\n  }\n  function zonesOf(u, room) {\n    return openingZones(room).filter((zn) => unitInZone(u, zn));\n  }\n  function zonesAt(u, x, z, room) {\n    const zs = openingZones(room);\n    if (!zs.length) return [];\n    return zs.filter((zn) => unitInZone(u, zn, x, z) && !unitInZone(u, zn));\n  }\n  function openingHit(zone, room) {\n    const r = room || roomOf();\n    return {\n      id: \"__opening\",\n      type: \"room-opening\",\n      family: \"room\",\n      kind: zone.kind,\n      opening: zone.op,\n      label: zone.kind === \"boiler\" ? objectLabel(r, zone.op) : openingLabel(r, zone.op)\n    };\n  }\n  function clashingIds(units, room) {\n    const zs = openingZones(room), out = /* @__PURE__ */ new Set();\n    if (!zs.length) return out;\n    for (const u of units || []) if (zs.some((zn) => unitInZone(u, zn))) out.add(u.id);\n    return out;\n  }\n  function newClash(units, before, room) {\n    const zs = openingZones(room);\n    if (!zs.length) return null;\n    for (const u of units || []) {\n      if (before && before.has(u.id)) continue;\n      const zn = zs.find((q) => unitInZone(u, q));\n      if (zn) return { unit: u, zone: zn, hit: openingHit(zn, room) };\n    }\n    return null;\n  }\n  function openingWhy(zone, room) {\n    if (zone.kind === \"boiler\") return \"it would run into \" + objectLabel(room || roomOf(), zone.op).toLowerCase() + \" (its casing on the wall)\";\n    const name2 = openingLabel(room || roomOf(), zone.op);\n    return zone.kind === \"door\" ? \"it would stand in front of \" + name2.toLowerCase() + \" - its doorway and \" + DOOR_CLEAR + \" mm in front stay clear\" : \"it would cover \" + name2.toLowerCase() + \" (only below the sill or above the window)\";\n  }\n\n  // v2/src/model/collision.js\n  var STEP_MM = 12;\n  function blockedAt(units, u, x, z) {\n    if (behindWall(u, x, z)) return WALL_HIT;\n    const zs = zonesAt(u, x, z);\n    if (zs.length) return openingHit(zs[0]);\n    const ox = u.x, oz = u.z;\n    let hit2 = null;\n    u.x = x;\n    u.z = z;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v.id === u.id || !sameLevel(v, u)) continue;\n      if (overlaps(u, v)) {\n        hit2 = v;\n        break;\n      }\n    }\n    u.x = ox;\n    u.z = oz;\n    return hit2;\n  }\n  function walkAxis(units, u, axis, from, to, out) {\n    const d = to - from;\n    if (Math.abs(d) < 1e-6) return from;\n    const steps = Math.max(1, Math.ceil(Math.abs(d) / STEP_MM));\n    let cur = from;\n    for (let i = 1; i <= steps; i++) {\n      const v = from + d * (i / steps);\n      const hit2 = blockedAt(units, u, axis === \"x\" ? v : u.x, axis === \"x\" ? u.z : v);\n      if (hit2) {\n        if (out && !out.hit) out.hit = hit2;\n        if (hit2.type === \"room-opening\") {\n          let lo = cur, hi = v;\n          for (let k = 0; k < 16 && Math.abs(hi - lo) > 0.25; k++) {\n            const m = (lo + hi) / 2;\n            if (blockedAt(units, u, axis === \"x\" ? m : u.x, axis === \"x\" ? u.z : m)) hi = m;\n            else lo = m;\n          }\n          cur = lo;\n        }\n        break;\n      }\n      cur = v;\n    }\n    return cur;\n  }\n  function moveClamped(units, u, tx, tz) {\n    const ox = u.x, oz = u.z, out = { hit: null };\n    const nx = walkAxis(units, u, \"x\", ox, tx, out);\n    u.x = nx;\n    const nz = walkAxis(units, u, \"z\", oz, tz, out);\n    u.x = ox;\n    u.z = oz;\n    return { x: nx, z: nz, blocked: out.hit };\n  }\n  function unitById(list, id) {\n    if (arguments.length === 1) {\n      id = list;\n      list = null;\n    }\n    const arr = list || [];\n    for (let i = 0; i < arr.length; i++) if (arr[i].id === id) return arr[i];\n    return null;\n  }\n  function nudgeClear(units, u) {\n    let guard = 0;\n    while (units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    }) && guard++ < 400) {\n      u.x += 10;\n    }\n    return u;\n  }\n  function levelKey(u) {\n    return u.family === \"wall\" ? \"wall\" : \"floor\";\n  }\n  function vSpan(u) {\n    const y = u.y || 0;\n    return [y, y + (u.h || 0)];\n  }\n  function sameLevel(a, b) {\n    const A = vSpan(a), B = vSpan(b);\n    return A[0] < B[1] - 1 && B[0] < A[1] - 1;\n  }\n\n  // v2/src/model/island.js\n  var ISLAND_BAY_LIMITS = { w: [400, 1e3] };\n  var ISLAND_SECTIONS = [2, 3, 4];\n  function islandBayList(u) {\n    const raw = u && u.bays || [];\n    let out = raw.map(function(b) {\n      if (typeof b === \"string\") return { w: 600, kind: b === \"drawers\" ? \"drawers\" : \"doors\" };\n      const kind = (b && b.kind) === \"drawers\" ? \"drawers\" : \"doors\";\n      return {\n        w: clamp4(Math.round(b && b.w || 600), ISLAND_BAY_LIMITS.w[0], ISLAND_BAY_LIMITS.w[1]),\n        kind,\n        /* a section keeps its own interior through every rebuild; a\n           drawer section can never carry one */\n        interior: kind !== \"drawers\" && b && b.interior ? b.interior : null\n      };\n    });\n    if (out.length < 2 || out.length > 4) {\n      out = [{ w: 600, kind: \"drawers\" }, { w: 600, kind: \"doors\" }, { w: 600, kind: \"drawers\" }];\n    }\n    return out;\n  }\n  function islandBodyW(bays) {\n    return bays.reduce(function(t, b) {\n      return t + b.w;\n    }, 0) + 2 * T;\n  }\n  function islandSync(u) {\n    if (!isIsland(u)) return u;\n    const bays = islandBayList(u);\n    u.bays = bays;\n    u.w = islandBodyW(bays);\n    const open = (u.bayOpen || []).slice(0, bays.length);\n    while (open.length < bays.length) open.push(false);\n    u.bayOpen = open;\n    return u;\n  }\n  function islandBayD(u) {\n    return u.d - T;\n  }\n  function islandBayKinds(u) {\n    return islandBayList(u).map(function(b) {\n      return b.kind;\n    });\n  }\n  function islandBayWidths(u) {\n    return islandBayList(u).map(function(b) {\n      return b.w;\n    });\n  }\n  function islandBayW(u) {\n    const L = islandBayList(u);\n    return L.reduce(function(t, b) {\n      return t + b.w;\n    }, 0) / L.length;\n  }\n  function islandChildOrigin(u, lx, lz, cw, cd) {\n    const k = ((u.rot || 0) % 4 + 4) % 4, LX = islandBodyW(islandBayList(u)), LZ = u.d;\n    const ox = (u.x || 0) + (u.dispX || 0), oz = (u.z || 0) + (u.dispZ || 0);\n    if (k === 0) return [ox + lx, oz + lz];\n    if (k === 1) return [ox + (LZ - lz - cd), oz + lx];\n    if (k === 2) return [ox + (LX - lx - cw), oz + (LZ - lz - cd)];\n    return [ox + lz, oz + (LX - lx - cw)];\n  }\n  function islandBays(u) {\n    const list = islandBayList(u), bd = islandBayD(u), out = [];\n    let run = T;\n    for (let i = 0; i < list.length; i++) {\n      const sec = list[i];\n      const kind = sec.kind, bw = sec.w;\n      const lx = run, lz = T;\n      run += bw;\n      const b = newUnit(kind === \"drawers\" ? \"base-4drawer\" : \"base\");\n      b.id = u.id + \":bay\" + i;\n      b.w = bw;\n      b.h = u.h;\n      b.d = bd;\n      b.rot = ((u.rot || 0) % 4 + 4) % 4;\n      const o = islandChildOrigin(u, lx, lz, bw, bd);\n      b.x = o[0];\n      b.z = o[1];\n      b.y = u.y || 0;\n      b.dispY = u.dispY || 0;\n      b.explode = u.explode;\n      b.finish = u.finish;\n      b.doorFinish = u.doorFinish;\n      b.frontFinish = u.frontFinish;\n      if (u.frontMat) b.frontMat = u.frontMat;\n      if (u.paint) b.paint = { ...u.paint };\n      if (u.frontStyle) b.frontStyle = u.frontStyle;\n      if (u.shaker) b.shaker = { ...u.shaker };\n      b.door = kind !== \"drawers\" && islandBayDoorsOn(u);\n      b.doors = 1;\n      if (kind === \"drawers\" && !drawerFrontsOn(u)) b.drawerFronts = false;\n      const op = !!(u.bayOpen && u.bayOpen[i]);\n      b.doorOpen = kind !== \"drawers\" && op;\n      b.drawers = [op, op, op, op];\n      b.interior = kind !== \"drawers\" && sec.interior ? sec.interior : null;\n      b.island = true;\n      out.push(b);\n    }\n    return out;\n  }\n  function islandSkinParts(u) {\n    const W2 = u.w, H2 = u.h, D2 = u.d, p = [], y0 = u.skinDrop ? -LEG_H : 0;\n    function box3(n, x0, x1, y02, y1, z0, z1, ex) {\n      p.push({ name: n, x0, x1, y0: y02, y1, z0, z1, ex, role: \"board\" });\n    }\n    box3(\"End panel L\", 0, T, y0, H2, T, D2, [-1, 0, 0]);\n    box3(\"End panel R\", W2 - T, W2, y0, H2, T, D2, [1, 0, 0]);\n    box3(\"Finished back\", 0, W2, y0, H2, 0, T, [0, 0, -1]);\n    return p;\n  }\n  function isIsland(u) {\n    return !!u && u.type === \"island\";\n  }\n  function islandAisle(units, u) {\n    if (!isIsland(u) || !units) return null;\n    const A = footBoxes(u);\n    let best = null;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v.id === u.id || !sameLevel(v, u)) continue;\n      const fbs = footBoxes(v);\n      for (let j = 0; j < fbs.length; j++) {\n        const B = fbs[j];\n        for (let k = 0; k < A.length; k++) {\n          const a = A[k];\n          const ox = a.x0 < B.x1 && a.x1 > B.x0;\n          const oz = a.z0 < B.z1 && a.z1 > B.z0;\n          let g2 = null;\n          if (ox && !oz) g2 = a.z0 >= B.z1 ? a.z0 - B.z1 : B.z0 - a.z1;\n          else if (oz && !ox) g2 = a.x0 >= B.x1 ? a.x0 - B.x1 : B.x0 - a.x1;\n          if (g2 === null || g2 < 0) continue;\n          if (best === null || g2 < best) best = g2;\n        }\n      }\n    }\n    return best === null ? null : Math.round(best);\n  }\n  function islandAisleText(units, u) {\n    const g2 = islandAisle(units, u);\n    return g2 === null ? \"\" : \" Nearest gap to another cabinet \" + g2 + \" mm (measured in the plan, not a safety clearance).\";\n  }\n\n  // v2/src/model/shaker.js\n  function jpullEdge(unit2, b) {\n    const u = unit2 || {};\n    if (u.family === \"wall\" || u.type === \"wall\" || u.type === \"corner-wall\") return \"bottom\";\n    if (isTall(u)) return (b.y0 + b.y1) / 2 > (Number(u.h) || 0) / 2 ? \"bottom\" : \"top\";\n    return \"top\";\n  }\n  function svgPathPoints(path2, steps) {\n    const tok = String(path2).match(/[MHVCZ]|-?\\d*\\.?\\d+(?:e-?\\d+)?/gi) || [];\n    const pts = [];\n    let i = 0, x = 0, y = 0;\n    const num6 = () => Number(tok[i++]);\n    while (i < tok.length) {\n      const c = tok[i++].toUpperCase();\n      if (c === \"M\") {\n        x = num6();\n        y = num6();\n        pts.push([x, y]);\n      } else if (c === \"H\") {\n        x = num6();\n        pts.push([x, y]);\n      } else if (c === \"V\") {\n        y = num6();\n        pts.push([x, y]);\n      } else if (c === \"C\") {\n        const p1 = [num6(), num6()], p2 = [num6(), num6()], p3 = [num6(), num6()], p0 = [x, y];\n        for (let k = 1; k <= steps; k++) {\n          const t = k / steps, u = 1 - t;\n          pts.push([u * u * u * p0[0] + 3 * u * u * t * p1[0] + 3 * u * t * t * p2[0] + t * t * t * p3[0], u * u * u * p0[1] + 3 * u * u * t * p1[1] + 3 * u * t * t * p2[1] + t * t * t * p3[1]]);\n        }\n        x = p3[0];\n        y = p3[1];\n      } else if (c === \"Z\") break;\n      else throw new Error(\"J-pull vector: unsupported path command \" + c);\n    }\n    return pts;\n  }\n  function jpullOutline(t, h, V3 = JPULL_PROFILE) {\n    const raw = svgPathPoints(V3.path, V3.cubicSteps), out = [];\n    for (const p of raw) {\n      const q = out[out.length - 1];\n      if (!q || Math.hypot(p[1] - q[0], p[0] - q[1]) > 1e-9) out.push([p[1], p[0]]);\n    }\n    out.push([h, t], [h, 0]);\n    return out;\n  }\n  function jpullSectionMm(V3 = JPULL_PROFILE) {\n    return svgPathPoints(V3.path, V3.cubicSteps).map((p) => [Math.round(p[0] * 1e3) / 1e3, Math.round(p[1] * 1e3) / 1e3]);\n  }\n  function insideOutline2(poly, d, z) {\n    let c = false;\n    for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n      const a = poly[i], b = poly[j];\n      if (a[1] > z !== b[1] > z && d < (b[0] - a[0]) * (z - a[1]) / (b[1] - a[1]) + a[0]) c = !c;\n    }\n    return c;\n  }\n  function jpullProfile(unit2, b) {\n    if (unit2.frontStyle !== \"jpull\") return null;\n    const axis = b.z1 - b.z0 <= b.x1 - b.x0 ? \"z\" : \"x\";\n    const t = b[axis + \"1\"] - b[axis + \"0\"], h = b.y1 - b.y0, P2 = JPULL_PLAN;\n    const B = JPULL_PROFILE.boardMm;\n    if (Math.abs(t - B) > 2 * EPS + 0.01 || h < P2.minFace || h < P2.coveBottom + 20) return null;\n    const edge = jpullEdge(unit2, b);\n    const yOf = (d) => edge === \"top\" ? b.y1 - d : b.y0 + d;\n    const along2 = axis === \"z\" ? [\"x\", b.x0, b.x1] : [\"z\", b.z0, b.z1];\n    const zs = t / B;\n    const at = (d, z, w) => axis === \"z\" ? [w, yOf(d), b.z0 + z * zs] : [b.x1 - z * zs, yOf(d), w];\n    return { edge, axis, t, h, B, zs, outline: jpullOutline(B, h), along: along2, at, zone: P2.coveBottom, lipTip: P2.lipTip };\n  }\n  function jpullBoxes(unit2, b) {\n    if (unit2.frontStyle !== \"jpull\") return { boxes: null, error: null };\n    const pr = jpullProfile(unit2, b);\n    if (!pr) return { boxes: null, error: null };\n    const { edge, axis, t, h, outline: outline2, B, zs } = pr;\n    const face2 = axis === \"z\" ? \"z1\" : \"x0\", back = axis === \"z\" ? \"z0\" : \"x1\", sg = axis === \"z\" ? 1 : -1;\n    const setY = (cell, d0, d1) => {\n      if (edge === \"top\") {\n        cell.y1 = b.y1 - d0;\n        cell.y0 = b.y1 - d1;\n      } else {\n        cell.y0 = b.y0 + d0;\n        cell.y1 = b.y0 + d1;\n      }\n      return cell;\n    };\n    const boxes = [], section = [], STEP = 0.5, zone = pr.zone;\n    for (let d0 = 0; d0 < zone - 1e-9; d0 += STEP) {\n      const dm = d0 + STEP / 2, spans2 = [];\n      let open = null;\n      for (let z = 0.025; z < B; z += 0.05) {\n        const inS = insideOutline2(outline2, dm, z);\n        if (inS && open === null) open = z - 0.025;\n        if (!inS && open !== null) {\n          spans2.push([open, z - 0.025]);\n          open = null;\n        }\n      }\n      if (open !== null) spans2.push([open, B]);\n      for (const sp of spans2) {\n        sp[0] *= zs;\n        sp[1] *= zs;\n      }\n      section.push([d0, d0 + STEP, spans2.length ? spans2[0][1] - spans2[0][0] : 0, spans2.length > 1 ? spans2[spans2.length - 1][1] - spans2[spans2.length - 1][0] : 0]);\n      for (const sp of spans2) {\n        const c = setY({ ...b }, d0, d0 + STEP);\n        c[back] = b[back] + sg * sp[0];\n        c[face2] = b[back] + sg * sp[1];\n        boxes.push(c);\n      }\n    }\n    boxes.push(setY({ ...b }, zone, h));\n    section.push([zone, h, t, 0]);\n    boxes.sort((p, q) => p.y0 - q.y0 || (p[back] - q[back]) * sg);\n    return { boxes, error: null, edge, zone, section, axis, face: face2, back };\n  }\n  var GLASS_MIN2 = { h: 300, w: 250, aperture: 120 };\n  var GLASS_DISPLAY_MM = 2;\n  function glassFrame(unit2, b, canon) {\n    if (!unit2 || unit2.frontStyle !== \"glass\") return null;\n    const c = canon || b;\n    const axis = b.z1 - b.z0 <= b.x1 - b.x0 ? \"z\" : \"x\";\n    const hz = axis === \"z\" ? \"x\" : \"z\";\n    const cw = c[hz + \"1\"] - c[hz + \"0\"], ch = c.y1 - c.y0, t = b[axis + \"1\"] - b[axis + \"0\"];\n    if (ch < GLASS_MIN2.h || cw < GLASS_MIN2.w) return null;\n    const o = unit2.shaker || {};\n    const frame2 = Number(o.frame) > 0 ? Number(o.frame) : 80, rail = Number(o.rail) > 0 ? Number(o.rail) : frame2;\n    if (cw - 2 * frame2 < GLASS_MIN2.aperture || ch - 2 * rail < GLASS_MIN2.aperture) return null;\n    const ax0 = c[hz + \"0\"] + frame2, ax1 = c[hz + \"1\"] - frame2, ay0 = c.y0 + rail, ay1 = c.y1 - rail;\n    const cell = (u0, u1, y0, y1) => {\n      const q = { ...b };\n      q[hz + \"0\"] = u0;\n      q[hz + \"1\"] = u1;\n      q.y0 = y0;\n      q.y1 = y1;\n      return q;\n    };\n    const boxes = [cell(b[hz + \"0\"], ax0, b.y0, b.y1), cell(ax1, b[hz + \"1\"], b.y0, b.y1), cell(ax0, ax1, b.y0, ay0), cell(ax0, ax1, ay1, b.y1)];\n    const nrm = (a, sign) => {\n      const n = [0, 0, 0];\n      n[[\"x\", \"y\", \"z\"].indexOf(a)] = sign;\n      return n;\n    };\n    const H0 = b[hz + \"0\"], H1 = b[hz + \"1\"], cols = [[H0, ax0], [ax0, ax1], [ax1, H1]], rows = [[b.y0, ay0], [ay0, ay1], [ay1, b.y1]];\n    const faces = [];\n    for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) {\n      if (i === 1 && j === 1) continue;\n      const c2 = cell(cols[i][0], cols[i][1], rows[j][0], rows[j][1]);\n      faces.push({ box: c2, normal: nrm(axis, 1) }, { box: c2, normal: nrm(axis, -1) });\n    }\n    faces.push({ box: b, normal: nrm(hz, -1) }, { box: b, normal: nrm(hz, 1) }, { box: b, normal: nrm(\"y\", -1) }, { box: b, normal: nrm(\"y\", 1) });\n    faces.push(\n      { box: cell(H0, ax0, ay0, ay1), normal: nrm(hz, 1) },\n      { box: cell(ax1, H1, ay0, ay1), normal: nrm(hz, -1) },\n      { box: cell(ax0, ax1, b.y0, ay0), normal: nrm(\"y\", 1) },\n      { box: cell(ax0, ax1, ay1, b.y1), normal: nrm(\"y\", -1) }\n    );\n    const mid = (b[axis + \"0\"] + b[axis + \"1\"]) / 2;\n    const pane = cell(ax0, ax1, ay0, ay1);\n    pane[axis + \"0\"] = mid - GLASS_DISPLAY_MM / 2;\n    pane[axis + \"1\"] = mid + GLASS_DISPLAY_MM / 2;\n    return {\n      boxes,\n      faces,\n      pane,\n      onePiece: true,\n      border: { side: frame2, end: rail },\n      frame: frame2,\n      rail,\n      aperture: { w: ax1 - ax0, h: ay1 - ay0 },\n      finished: { w: cw, h: ch },\n      board: t\n    };\n  }\n  function finishedFront(unit2, b) {\n    const W2 = unit2.w, H2 = unit2.h, on = (v, e) => Math.abs(v - e) < 1e-6;\n    return {\n      ...b,\n      x0: on(b.x0, 0) ? REVEAL : b.x0,\n      x1: on(b.x1, W2) ? W2 - REVEAL : b.x1,\n      y0: on(b.y0, 0) ? REVEAL : b.y0,\n      y1: on(b.y1, H2) ? H2 - REVEAL : b.y1\n    };\n  }\n  function canonFrontOf(unit2, b) {\n    const shut = { ...unit2, doorOpen: false, drawerOpen: false, drawers: [], xopen: [] };\n    const cand = cabinetParts(shut).filter((q) => q.kind === \"door\").map((q) => finishedFront(shut, q.local));\n    if (isTall(shut) && shut.door) (tallLeaves(shut) || []).forEach((lf) => cand.push({ x0: REVEAL, x1: shut.w - REVEAL, y0: lf.y0, y1: lf.y1 }));\n    const mx = (b.x0 + b.x1) / 2, my = (b.y0 + b.y1) / 2;\n    return cand.find((q) => mx > q.x0 && mx < q.x1 && my > q.y0 && my < q.y1) || null;\n  }\n  function grooveBoxes(unit2, b) {\n    const style2 = unit2.frontStyle;\n    if (style2 !== \"groove-v\" && style2 !== \"groove-h\") return { boxes: null, error: null };\n    const axis = b.z1 - b.z0 <= b.x1 - b.x0 ? \"z\" : \"x\";\n    const horizontal = axis === \"z\" ? \"x\" : \"z\";\n    const t = b[axis + \"1\"] - b[axis + \"0\"];\n    const along2 = style2 === \"groove-v\" ? horizontal : \"y\";\n    const len = b[along2 + \"1\"] - b[along2 + \"0\"];\n    const P2 = GROOVE_PLAN;\n    if (!(t > P2.depth) || len < P2.minFace) return { boxes: null, error: null };\n    const n = Math.max(1, Math.round(len / P2.pitch) - 1);\n    const cuts = [0];\n    for (let i = 1; i <= n; i++) {\n      const c = len * i / (n + 1);\n      cuts.push(c - P2.width / 2, c + P2.width / 2);\n    }\n    cuts.push(len);\n    const boxes = [];\n    for (let i = 0; i < cuts.length - 1; i++) {\n      const inGroove = i % 2 === 1;\n      const cell = { ...b };\n      cell[along2 + \"0\"] = b[along2 + \"0\"] + cuts[i];\n      cell[along2 + \"1\"] = b[along2 + \"0\"] + cuts[i + 1];\n      const top = t - (inGroove ? P2.depth : 0);\n      if (axis === \"z\") cell.z1 = b.z0 + top;\n      else cell.x0 = b.x1 - top;\n      boxes.push(cell);\n    }\n    return { boxes, error: null };\n  }\n  function styledBoxes(unit2, b) {\n    if (unit2.frontStyle === \"glass\") {\n      const g2 = glassFrame(unit2, b, canonFrontOf(unit2, b));\n      return g2 ? { boxes: g2.boxes, error: null, glass: g2 } : { boxes: null, error: null };\n    }\n    if (unit2.frontStyle === \"shaker\") return shakerBoxes(unit2, b);\n    if (unit2.frontStyle === \"jpull\") return jpullBoxes(unit2, b);\n    return grooveBoxes(unit2, b);\n  }\n  var TALL_FRONT_MM = 950;\n  var POCKET_CHOICES = [1, 2, 4];\n  var MIN_POCKET_MM = 40;\n  var MIN_FRAME_MM = 30;\n  var LOWER_SHARE = 0.4;\n  function isTallFront(h) {\n    return Number(h) >= TALL_FRONT_MM;\n  }\n  function tallPocketChoice(unit2) {\n    const p = Number(unit2 && unit2.pockets);\n    if (POCKET_CHOICES.indexOf(p) >= 0) return p;\n    return Number(unit2 && unit2.shaker && unit2.shaker.panels) === 4 ? 4 : 2;\n  }\n  function frontPockets(unit2, h) {\n    return isTallFront(h) ? tallPocketChoice(unit2) : 1;\n  }\n  function pocketLayout(unit2, h, opts) {\n    const panels = frontPockets(unit2, h);\n    if (panels !== 2) return { panels, railAt: 0 };\n    const frame2 = Number(opts.frame) > 0 ? Number(opts.frame) : 80;\n    const rail = Number(opts.rail) > 0 ? Number(opts.rail) : frame2;\n    const spare = h - 2 * frame2 - rail;\n    return { panels, railAt: Math.round((frame2 + spare * LOWER_SHARE + rail / 2) * 10) / 10 };\n  }\n  function unitFronts(unit2) {\n    if (!unit2) return [];\n    const closed2 = { ...unit2, doorOpen: false, drawerOpen: false, leafOpen: [false, false], drawers: [false, false, false, false], xopen: [] };\n    const out = [];\n    const push = (name2, kind, h) => out.push({ name: name2, kind, h: Math.round(h), pockets: kind === \"door\" ? frontPockets(unit2, h) : 1 });\n    if (isIsland(closed2)) {\n      islandBays(closed2).forEach((bay, i) => unitFronts({ ...bay, pockets: unit2.pockets, shaker: unit2.shaker }).forEach((f) => push(\"Section \" + (i + 1) + \" \" + f.name, f.kind, f.h)));\n      return out;\n    }\n    for (const p of cabinetParts(closed2)) {\n      if (p.kind === \"door\" || p.kind === \"drawer-front\") push(p.name, p.kind, p.local.y1 - p.local.y0);\n    }\n    if (isTall(closed2) && closed2.door) for (const lf of tallLeaves(closed2)) push(lf.name, \"door\", lf.y1 - lf.y0);\n    return out;\n  }\n  function tallFronts(unit2) {\n    return unitFronts(unit2).filter((f) => f.kind === \"door\" && isTallFront(f.h));\n  }\n  function shakerBoxes(unit2, b) {\n    if (unit2.frontStyle !== \"shaker\") return { boxes: null, error: null };\n    const axis = b.z1 - b.z0 <= b.x1 - b.x0 ? \"z\" : \"x\";\n    const horizontal = axis === \"z\" ? \"x\" : \"z\";\n    const w = b[horizontal + \"1\"] - b[horizontal + \"0\"];\n    const h = b.y1 - b.y0;\n    const t = b[axis + \"1\"] - b[axis + \"0\"];\n    const opts = { panels: 1, frame: 80, rail: 80, railAt: 0, depth: 6, ...unit2.shaker || {} };\n    for (const key of Object.keys(opts)) opts[key] = Number(opts[key]);\n    if (![1, 2, 4].includes(Number(opts.panels)) || ![\"frame\", \"rail\", \"railAt\", \"depth\"].every((k) => Number.isFinite(Number(opts[k]))) || opts.frame <= 0 || opts.rail <= 0 || opts.railAt < 0 || opts.depth <= 0 || opts.depth >= t) {\n      return { boxes: null, error: \"Shaker: use 1, 2 or 4 panels, positive frame and rail sizes, and a recess shallower than the board.\" };\n    }\n    const layout = pocketLayout(unit2, h, opts);\n    opts.panels = layout.panels;\n    opts.railAt = layout.railAt;\n    if (opts.panels === 1) {\n      const fit = Math.floor(Math.min(h, w) / 2 - MIN_POCKET_MM / 2);\n      if (fit < opts.frame && fit >= MIN_FRAME_MM) {\n        opts.frame = fit;\n        opts.rail = Math.min(opts.rail, fit);\n      }\n    }\n    const result = shakerPockets2({ length: h, width: w }, opts);\n    if (result.error) return { boxes: null, error: result.error };\n    const pockets = result.pockets;\n    const xs = [0, opts.frame, w - opts.frame, w];\n    const ys = [0, h, ...pockets.flatMap((r) => [r.x - r.length / 2, r.x + r.length / 2])].sort((a, b2) => a - b2);\n    const boxes = [];\n    for (let x = 0; x < xs.length - 1; x++) for (let y = 0; y < ys.length - 1; y++) {\n      const middleX = (xs[x] + xs[x + 1]) / 2;\n      const middleY = (ys[y] + ys[y + 1]) / 2;\n      const inside = pockets.some((r) => middleX > r.y - r.width / 2 && middleX < r.y + r.width / 2 && middleY > r.x - r.length / 2 && middleY < r.x + r.length / 2);\n      const top = t - (inside ? Number(opts.depth) : 0);\n      const cell = { ...b, y0: b.y0 + ys[y], y1: b.y0 + ys[y + 1] };\n      cell[horizontal + \"0\"] = b[horizontal + \"0\"] + xs[x];\n      cell[horizontal + \"1\"] = b[horizontal + \"0\"] + xs[x + 1];\n      if (axis === \"z\") cell.z1 = b.z0 + top;\n      else cell.x0 = b.x1 - top;\n      boxes.push(cell);\n    }\n    return { boxes, error: null, pockets: pockets.length, frame: opts.frame };\n  }\n  function shakerError(unit2) {\n    if (unit2.frontStyle !== \"shaker\") return null;\n    const valid = shakerBoxes(unit2, { x0: 0, x1: 3e3, y0: 0, y1: 3e3, z0: 0, z1: 18 });\n    if (valid.error) return valid.error;\n    const closed2 = { ...unit2, doorOpen: false, drawerOpen: false, leafOpen: [false, false], drawers: [false, false, false, false], xopen: [] };\n    if (isIsland(closed2)) {\n      for (const bay of islandBays(closed2)) {\n        const error = shakerError({ ...bay, frontStyle: unit2.frontStyle, shaker: unit2.shaker });\n        if (error) return error;\n      }\n      return null;\n    }\n    for (const part of cabinetParts(closed2).filter((p) => [\"door\", \"drawer-front\"].includes(p.kind) && p.xn == null && !p.short)) {\n      const result = shakerBoxes(unit2, part.local);\n      if (result.error) return part.name + \": \" + result.error;\n    }\n    if (isTall(closed2) && closed2.door) for (const lf of tallLeaves(closed2).filter((l) => !l.short)) {\n      const result = shakerBoxes(unit2, { x0: 0, x1: closed2.w, y0: lf.y0, y1: lf.y1, z0: 0, z1: 18 });\n      if (result.error) return lf.name + \": \" + result.error;\n    }\n    return null;\n  }\n  function shakerFaces(unit2, box3) {\n    if (unit2 && unit2.frontStyle === \"glass\") {\n      const g2 = glassFrame(unit2, box3, canonFrontOf(unit2, box3));\n      return g2 ? { faces: g2.faces, error: null, glass: g2 } : { faces: null, error: null };\n    }\n    const result = styledBoxes(unit2, box3);\n    if (!result.boxes) return { faces: null, error: result.error };\n    const axis = box3.z1 - box3.z0 <= box3.x1 - box3.x0 ? \"z\" : \"x\";\n    const axes = [\"x\", \"y\", \"z\"];\n    const broad = axes.filter((a) => a !== axis);\n    const faces = [];\n    for (const b of result.boxes) {\n      for (const sign of [-1, 1]) {\n        const normal = [0, 0, 0];\n        normal[axes.indexOf(axis)] = sign;\n        faces.push({ box: b, normal });\n      }\n      for (const a of broad) for (const sign of [-1, 1]) {\n        const side = sign > 0 ? \"1\" : \"0\";\n        const other = sign > 0 ? \"0\" : \"1\";\n        const transverse = broad.find((v) => v !== a);\n        const neighbors = result.boxes.filter((n) => n !== b && Math.abs(n[a + other] - b[a + side]) < 1e-3 && Math.abs(n[transverse + \"0\"] - b[transverse + \"0\"]) < 1e-3 && Math.abs(n[transverse + \"1\"] - b[transverse + \"1\"]) < 1e-3);\n        const a0 = b[axis + \"0\"], a1 = b[axis + \"1\"];\n        let spans2 = [[a0, a1]];\n        for (const n of neighbors) {\n          const n0 = n[axis + \"0\"], n1 = n[axis + \"1\"];\n          spans2 = spans2.flatMap((r) => [[r[0], Math.min(r[1], n0)], [Math.max(r[0], n1), r[1]]]).filter((r) => r[1] - r[0] > 1e-3);\n        }\n        for (const r of spans2) {\n          const exposed = { ...b };\n          exposed[axis + \"0\"] = r[0];\n          exposed[axis + \"1\"] = r[1];\n          const normal = [0, 0, 0];\n          normal[axes.indexOf(a)] = sign;\n          faces.push({ box: exposed, normal });\n        }\n      }\n    }\n    return { faces, error: null };\n  }\n\n  // v2/src/model/glass-fit.js\n  function showsGlassDoor(u) {\n    if (!u) return false;\n    const g2 = { ...u, frontStyle: \"glass\", ovStyle: \"glass\", doorOpen: false, drawerOpen: false, drawers: [], xopen: [], leafOpen: [], bayOpen: [] };\n    let fronts = [];\n    try {\n      fronts = cabinetParts(g2).filter((p) => p.kind === \"door\").map((p) => finishedFront(g2, p.local));\n    } catch {\n      fronts = [];\n    }\n    if (isTall(g2) && g2.door) (tallLeaves(g2) || []).forEach((lf) => fronts.push({ x0: REVEAL, x1: g2.w - REVEAL, y0: lf.y0, y1: lf.y1, z0: g2.d, z1: g2.d + T }));\n    return fronts.some((b) => !!glassFrame(g2, b));\n  }\n\n  // v2/src/model/finishes.js\n  var FINISH_KEYS = EGGER_DECORS.map(function(d) {\n    return d.key;\n  });\n  function okFinish(f) {\n    return typeof f === \"string\" && decorOf(f) ? f : null;\n  }\n  var MAT_CACHE = {};\n  function materialOf(key) {\n    if (typeof key !== \"string\") return null;\n    if (Object.prototype.hasOwnProperty.call(MAT_CACHE, key)) return MAT_CACHE[key];\n    const d = decorOf(key);\n    if (!d) return null;\n    const known = Object.prototype.hasOwnProperty.call(MATERIALS, key) ? MATERIALS[key] : null;\n    const m = {\n      label: d.label,\n      short: known ? known.short : d.name,\n      code: d.code,\n      tex: d.tex,\n      name: d.name,\n      decor: d,\n      board: decorBoard(d),\n      perSqmBoardInc: known ? known.perSqmBoardInc : null,\n      quoteOnly: known ? !!known.quoteOnly : true\n    };\n    MAT_CACHE[key] = m;\n    return m;\n  }\n  function finishLabel(key) {\n    const m = materialOf(key);\n    return m ? m.label : String(key || \"\");\n  }\n  function finishShort(key) {\n    const d = decorOf(key);\n    return d ? decorShort(d) : String(key || \"\");\n  }\n  function effCarcass(u, kitchen) {\n    return okFinish(u && u.ovCarcass) || kitchen && kitchen.carcass || \"white\";\n  }\n  function effFronts(u, kitchen) {\n    return okFinish(u && u.ovFronts) || kitchen && kitchen.fronts || \"white\";\n  }\n  function isCustom(u) {\n    return !!(okFinish(u && u.ovCarcass) || okFinish(u && u.ovFronts) || okStyle(u && u.ovStyle));\n  }\n  function effFrontMat(u, kitchen) {\n    if (okFinish(u && u.ovFronts)) return \"mfc\";\n    return kitchen && kitchen.frontMat === \"mdf-paint\" ? \"mdf-paint\" : \"mfc\";\n  }\n  function effStyle(u, kitchen) {\n    const k = kitchen && okStyle(kitchen.frontStyle);\n    return okStyle(u && u.ovStyle) || (k && !isCabinetOnly(k) ? k : null) || \"slab\";\n  }\n  function migrateStyle(u, K2) {\n    if (u.ovStyle !== void 0) return;\n    const s = okStyle(u.frontStyle);\n    if (s && s !== K2.frontStyle) {\n      u.ovStyle = s;\n      if (u.shaker) u.ovShaker = { ...u.shaker };\n    }\n  }\n  function jpullBlocked(u, kitchen) {\n    return isPaintedOnly(effStyle(u, kitchenOf2(kitchen))) && effFrontMat(u, kitchenOf2(kitchen)) !== \"mdf-paint\";\n  }\n  function resolveFront(u, K2) {\n    const mat = effFrontMat(u, K2);\n    if (mat === \"mdf-paint\") {\n      u.frontMat = \"mdf-paint\";\n      u.paint = normPaint(K2.paint);\n    } else {\n      delete u.frontMat;\n      delete u.paint;\n    }\n    let st = effStyle(u, K2);\n    if (isPaintedOnly(st) && mat !== \"mdf-paint\") st = \"slab\";\n    if (st !== \"slab\" || u.frontStyle !== void 0) u.frontStyle = st;\n    if (st === \"shaker\") {\n      if (okStyle(u.ovStyle)) {\n        if (u.ovShaker) u.shaker = { ...u.ovShaker };\n        else if (!u.shaker) u.shaker = { ...K2.shaker };\n      } else u.shaker = { ...K2.shaker };\n    }\n  }\n  function resolveGola(u, K2) {\n    const on = !!(K2.gola && K2.gola.on) && u.ovGola !== \"off\" && !!GOLA_TYPES[u.type];\n    if (on) {\n      const { wall, ...base } = K2.gola;\n      void wall;\n      u.gola = { ...base, on: true };\n    } else delete u.gola;\n  }\n  function resolveBuild(u, kitchen) {\n    const b = normBuild(kitchen && kitchen.build);\n    if (Object.keys(b).length) u.build = b;\n    else delete u.build;\n  }\n  function resolveFinishes(units, kitchen) {\n    const K2 = kitchenOf2(kitchen);\n    (units || []).forEach(function(u) {\n      resolveFront(u, K2);\n      resolveGola(u, K2);\n      resolveBuild(u, kitchen);\n      u.finish = effCarcass(u, kitchen);\n      const f = effFronts(u, kitchen);\n      u.doorFinish = f;\n      u.frontFinish = f;\n      u.plinthFinish = plinthKeyOf(u);\n      if (u.type === \"island\") u.skinFinish = okFinish(u.ovSkin) || (u.frontMat === \"mdf-paint\" ? plinthKeyOf({ frontMat: \"mdf-paint\", paint: u.paint }) : f);\n    });\n    return units;\n  }\n  var LEGACY_GLASS = \"kitchen\";\n  function isIntentionalGlass(u) {\n    return !!(u && isCabinetOnly(u.ovStyle) && u.glassFrom !== LEGACY_GLASS);\n  }\n  function migrateFinishes(units, kitchen) {\n    const K2 = kitchenOf2(kitchen);\n    const fromOldMigration = (units || []).some((u) => isCabinetOnly(u && u.ovStyle) && !u.glassFrom && !showsGlassDoor(u));\n    if (fromOldMigration) for (const u of units) {\n      if (!isCabinetOnly(u.ovStyle) || u.glassFrom) continue;\n      if (!showsGlassDoor(u)) {\n        u.ovStyle = null;\n        u.ovShaker = null;\n      } else u.glassFrom = LEGACY_GLASS;\n    }\n    const glassKitchen = isCabinetOnly(K2.frontStyle);\n    (units || []).forEach(function(u) {\n      migrateStyle(u, K2);\n      if (glassKitchen && !okStyle(u.ovStyle) && showsGlassDoor(u)) {\n        u.ovStyle = K2.frontStyle;\n        u.glassFrom = LEGACY_GLASS;\n        if (u.ovShaker === void 0) u.ovShaker = null;\n      }\n      if (u.ovCarcass === void 0) {\n        const c = okFinish(u.finish);\n        u.ovCarcass = c && c !== kitchen.carcass ? c : null;\n      }\n      if (u.ovFronts === void 0) {\n        const f = okFinish(u.doorFinish) || okFinish(u.frontFinish);\n        u.ovFronts = f && f !== kitchen.fronts ? f : null;\n      }\n    });\n    if (glassKitchen && kitchen && typeof kitchen === \"object\") kitchen.frontStyle = \"slab\";\n    return resolveFinishes(units, kitchen);\n  }\n\n  // v2/src/model/align.js\n  var ALIGN = {\n    on: 26,\n    off: 40,\n    near: 900,\n    // acquire, release, neighbour reach\n    coplanar: 1.5,\n    // how exactly planes must agree to join a run\n    gap: 60\n  };\n  function adjoinGap(a, b, alongAxis) {\n    const fa = foot(a), fb = foot(b);\n    return alongAxis === \"x\" ? Math.max(0, Math.max(fa.x0, fb.x0) - Math.min(fa.x1, fb.x1)) : Math.max(0, Math.max(fa.z0, fb.z0) - Math.min(fa.z1, fb.z1));\n  }\n  function connectedRun(units, seed, alongAxis, linked) {\n    const lvl = levelKey(seed);\n    const pool = units.filter(function(v) {\n      return levelKey(v) === lvl;\n    });\n    const run = [seed], seen = {}, queue = [seed];\n    seen[seed.id] = 1;\n    while (queue.length) {\n      const cur = queue.shift();\n      for (let i = 0; i < pool.length; i++) {\n        const v = pool[i];\n        if (seen[v.id]) continue;\n        if (!linked(cur, v)) continue;\n        if (adjoinGap(cur, v, alongAxis) > ALIGN.gap) continue;\n        seen[v.id] = 1;\n        run.push(v);\n        queue.push(v);\n      }\n    }\n    return run;\n  }\n  function runExtent(run, alongAxis) {\n    let lo = 1e9, hi = -1e9;\n    for (let i = 0; i < run.length; i++) {\n      const v = run[i];\n      const f = foot(v);\n      lo = Math.min(lo, alongAxis === \"x\" ? f.x0 : f.z0);\n      hi = Math.max(hi, alongAxis === \"x\" ? f.x1 : f.z1);\n    }\n    return { lo, hi };\n  }\n  function frontFaces(u) {\n    const E = unitEnvelope(u), xf = planXf(u, E.LX, E.LZ), segs = [];\n    if (isLPlan(u)) {\n      const A1 = armA(u), A2 = armB(u), ix = A1 - u.d;\n      segs.push({ a: [0, u.d], b: [ix, u.d], n: [0, 1], arm: \"A\" });\n      segs.push({ a: [ix, u.d], b: [ix, A2], n: [-1, 0], arm: \"B\" });\n    } else {\n      segs.push({ a: [0, u.d], b: [u.w, u.d], n: [0, 1], arm: \"\" });\n    }\n    return segs.map(function(sg) {\n      const p0 = xf.p([sg.a[0], 0, sg.a[1]]), p1 = xf.p([sg.b[0], 0, sg.b[1]]);\n      const nn = xf.n([sg.n[0], 0, sg.n[1]]);\n      const axis = Math.abs(nn[0]) > 0.5 ? \"x\" : \"z\";\n      const at = axis === \"x\" ? p0[0] : p0[2];\n      const dir = axis === \"x\" ? nn[0] > 0 ? 1 : -1 : nn[2] > 0 ? 1 : -1;\n      let lo, hi;\n      if (axis === \"x\") {\n        lo = Math.min(p0[2], p1[2]);\n        hi = Math.max(p0[2], p1[2]);\n      } else {\n        lo = Math.min(p0[0], p1[0]);\n        hi = Math.max(p0[0], p1[0]);\n      }\n      return { axis, dir, at, from: lo, to: hi, unit: u, arm: sg.arm };\n    });\n  }\n  function frontPlane(u) {\n    return frontFaces(u)[0];\n  }\n  function topY(u) {\n    return (u.y || 0) + u.h;\n  }\n  function nearbyUnits(units, u) {\n    const a = foot(u);\n    return units.filter(function(v) {\n      if (v.id === u.id || !sameLevel(v, u)) return false;\n      const b = foot(v);\n      const gapX = Math.max(0, Math.max(a.x0, b.x0) - Math.min(a.x1, b.x1));\n      const gapZ = Math.max(0, Math.max(a.z0, b.z0) - Math.min(a.z1, b.z1));\n      return Math.hypot(gapX, gapZ) <= ALIGN.near;\n    });\n  }\n  function facesJoin(fa, fb) {\n    if (fa.axis !== fb.axis || fa.dir !== fb.dir) return false;\n    if (Math.abs(fa.at - fb.at) > ALIGN.coplanar) return false;\n    const gap = Math.max(fa.from, fb.from) - Math.min(fa.to, fb.to);\n    return gap <= ALIGN.gap;\n  }\n  function sideContacts(units, u) {\n    if (!u) return [];\n    const TOUCH = 3, MINOV = 60, lvl = levelKey(u), out = [];\n    const uyb = u.family === \"wall\" ? u.y || 0 : -LEG_H, uyt = (u.y || 0) + u.h;\n    const ub = footBoxes(u);\n    units.forEach(function(v) {\n      if (v.id === u.id || levelKey(v) !== lvl) return;\n      const vyb = v.family === \"wall\" ? v.y || 0 : -LEG_H, vyt = (v.y || 0) + v.h;\n      const y0 = Math.max(uyb, vyb), y1 = Math.min(uyt, vyt);\n      if (y1 - y0 < 100) return;\n      const vb = footBoxes(v);\n      function frontAt(axis) {\n        let best = null;\n        const pair = [u, v];\n        for (let i = 0; i < pair.length; i++) {\n          const unit2 = pair[i];\n          const ff = frontFaces(unit2);\n          for (let j = 0; j < ff.length; j++) {\n            const f = ff[j];\n            if (f.axis !== axis) continue;\n            const p = f.at + f.dir * (T + 1);\n            if (best === null || (f.dir > 0 ? p > best : p < best)) best = p;\n          }\n        }\n        return best;\n      }\n      ub.forEach(function(a) {\n        vb.forEach(function(b) {\n          const zov = Math.min(a.z1, b.z1) - Math.max(a.z0, b.z0);\n          if (zov >= MINOV) {\n            if (Math.abs(a.x1 - b.x0) <= TOUCH || Math.abs(a.x0 - b.x1) <= TOUCH) {\n              const fz = frontAt(\"z\");\n              out.push({\n                axis: \"x\",\n                at: Math.abs(a.x1 - b.x0) <= TOUCH ? (a.x1 + b.x0) / 2 : (a.x0 + b.x1) / 2,\n                lo: Math.max(a.z0, b.z0),\n                hi: Math.min(a.z1, b.z1),\n                front: fz === null ? Math.min(a.z1, b.z1) : fz,\n                y0,\n                y1\n              });\n            }\n          }\n          const xov = Math.min(a.x1, b.x1) - Math.max(a.x0, b.x0);\n          if (xov >= MINOV) {\n            if (Math.abs(a.z1 - b.z0) <= TOUCH || Math.abs(a.z0 - b.z1) <= TOUCH) {\n              const fx = frontAt(\"x\");\n              out.push({\n                axis: \"z\",\n                at: Math.abs(a.z1 - b.z0) <= TOUCH ? (a.z1 + b.z0) / 2 : (a.z0 + b.z1) / 2,\n                lo: Math.max(a.x0, b.x0),\n                hi: Math.min(a.x1, b.x1),\n                front: fx === null ? Math.min(a.x1, b.x1) : fx,\n                y0,\n                y1\n              });\n            }\n          }\n        });\n      });\n    });\n    return out;\n  }\n  function allJoints(units) {\n    const out = [], seen = {};\n    (units || []).forEach(function(u) {\n      sideContacts(units, u).forEach(function(j) {\n        const k = j.axis + \":\" + Math.round(j.at) + \":\" + Math.round(j.lo) + \":\" + Math.round(j.hi);\n        if (!seen[k]) {\n          seen[k] = 1;\n          out.push(j);\n        }\n      });\n    });\n    return out;\n  }\n  function alignGroups(units, u, held) {\n    if (!u) return { fronts: [], tops: [], joints: [] };\n    const pool = nearbyUnits(units, u), fronts = [], tops = [];\n    const heldF = held && held.fronts || [];\n    frontFaces(u).forEach(function(mf) {\n      let best = null;\n      for (let i = 0; i < pool.length; i++) {\n        const v = pool[i];\n        const vfs = frontFaces(v);\n        for (let j = 0; j < vfs.length; j++) {\n          const vf = vfs[j];\n          if (vf.axis !== mf.axis || vf.dir !== mf.dir) continue;\n          const gap = Math.max(mf.from, vf.from) - Math.min(mf.to, vf.to);\n          if (gap > ALIGN.gap) continue;\n          const d = vf.at - mf.at;\n          const engaged = heldF.some(function(h) {\n            return (h.arm === void 0 || h.arm === mf.arm) && h.other && h.other.id === v.id;\n          });\n          const lim = engaged ? ALIGN.off : ALIGN.on;\n          if (Math.abs(d) <= lim && (!best || Math.abs(d) < Math.abs(best.delta)))\n            best = { delta: d, other: v, at: vf.at };\n        }\n      }\n      if (!best) return;\n      const plane = best.at, seen = {}, members = [u], faces = [mf];\n      seen[u.id] = 1;\n      const reach = units.filter(function(v) {\n        return levelKey(v) === levelKey(u);\n      });\n      const queue = [{ u, f: mf }];\n      while (queue.length) {\n        const cur = queue.shift();\n        reach.forEach(function(v) {\n          if (seen[v.id]) return;\n          frontFaces(v).forEach(function(vf) {\n            if (seen[v.id]) return;\n            if (vf.axis !== mf.axis || vf.dir !== mf.dir) return;\n            if (Math.abs(vf.at - plane) > ALIGN.coplanar) return;\n            if (!facesJoin(cur.f, vf)) return;\n            seen[v.id] = 1;\n            members.push(v);\n            faces.push(vf);\n            queue.push({ u: v, f: vf });\n          });\n        });\n      }\n      let lo = 1e9, hi = -1e9;\n      for (let i = 0; i < faces.length; i++) {\n        const fc = faces[i];\n        lo = Math.min(lo, fc.from);\n        hi = Math.max(hi, fc.to);\n      }\n      fronts.push({\n        kind: \"front\",\n        arm: mf.arm,\n        axis: mf.axis,\n        dir: mf.dir,\n        at: plane,\n        delta: best.delta,\n        other: best.other,\n        from: lo,\n        to: hi,\n        y: Math.min.apply(null, members.map(topY)),\n        run: members.length,\n        label: \"Fronts aligned\"\n      });\n    });\n    const myTop = topY(u);\n    let bestT = null;\n    for (let i = 0; i < pool.length; i++) {\n      const v = pool[i];\n      const dt = topY(v) - myTop;\n      const engaged = (held && held.tops || []).some(function(h) {\n        return h.other && h.other.id === v.id;\n      });\n      const lim = engaged ? ALIGN.off : ALIGN.on;\n      if (Math.abs(dt) <= lim && (!bestT || Math.abs(dt) < Math.abs(bestT.delta)))\n        bestT = { delta: dt, other: v, y: topY(v) };\n    }\n    if (bestT) {\n      const topLink = function(a, b) {\n        const ta = a.id === u.id ? bestT.y : topY(a);\n        return Math.abs(ta - bestT.y) <= ALIGN.coplanar && Math.abs(topY(b) - bestT.y) <= ALIGN.coplanar;\n      };\n      const runX = connectedRun(units, u, \"x\", topLink);\n      const runZ = connectedRun(units, u, \"z\", topLink);\n      let runT, axisT;\n      if (runZ.length > runX.length) {\n        runT = runZ;\n        axisT = \"z\";\n      } else {\n        runT = runX;\n        axisT = \"x\";\n      }\n      const centres = runT.map(function(v) {\n        const f = foot(v);\n        return { x: (f.x0 + f.x1) / 2, z: (f.z0 + f.z1) / 2 };\n      }).sort(function(a, b) {\n        return axisT === \"x\" ? a.x - b.x : a.z - b.z;\n      });\n      const bx2 = runExtent(runT, \"x\"), bz = runExtent(runT, \"z\");\n      const along2 = axisT === \"x\" ? bx2 : bz;\n      const perp = axisT === \"x\" ? bz : bx2;\n      const mid = (perp.lo + perp.hi) / 2;\n      tops.push({\n        kind: \"top\",\n        delta: bestT.delta,\n        other: bestT.other,\n        y: bestT.y,\n        axis: axisT,\n        lo: along2.lo,\n        hi: along2.hi,\n        mid,\n        centres,\n        run: runT.length,\n        x0: bx2.lo,\n        x1: bx2.hi,\n        z0: bz.lo,\n        z1: bz.hi,\n        // bbox kept for other callers\n        label: \"Tops aligned\"\n      });\n    }\n    return {\n      fronts,\n      tops,\n      joints: allJoints(units),\n      front: fronts[0] || null,\n      top: tops[0] || null\n    };\n  }\n  function alignCues(units, u, held) {\n    const g2 = alignGroups(units, u, held && held.fronts ? held : {\n      fronts: held && held.front ? [held.front] : [],\n      tops: held && held.top ? [held.top] : []\n    });\n    return {\n      front: g2.fronts[0] || null,\n      top: g2.tops[0] || null,\n      fronts: g2.fronts,\n      tops: g2.tops\n    };\n  }\n  function frontSnap(units, u, held) {\n    const g2 = alignGroups(units, u, held);\n    let pick = null;\n    const gf = g2.fronts;\n    for (let i = 0; i < gf.length; i++) {\n      const f = gf[i];\n      if (Math.abs(f.delta) < 1e-9) continue;\n      if (!pick || Math.abs(f.delta) < Math.abs(pick.delta)) pick = f;\n    }\n    if (!pick) return { x: u.x, z: u.z, cues: g2 };\n    const nx = u.x + (pick.axis === \"x\" ? pick.delta : 0);\n    const nz = u.z + (pick.axis === \"z\" ? pick.delta : 0);\n    if (blockedAt(units, u, nx, nz)) return { x: u.x, z: u.z, cues: g2 };\n    const ox = u.x, oz = u.z;\n    u.x = nx;\n    u.z = nz;\n    const after = alignGroups(units, u, held);\n    u.x = ox;\n    u.z = oz;\n    return { x: nx, z: nz, cues: after };\n  }\n  function validCues(units, u, c) {\n    if (!u) return { fronts: [], tops: [] };\n    const now = alignGroups(units, u, c);\n    const fronts = now.fronts.filter(function(f) {\n      return Math.abs(f.delta) < 1;\n    });\n    const tops = now.tops.filter(function(t) {\n      return Math.abs(t.delta) < 1;\n    });\n    return { fronts, tops, front: fronts[0] || null, top: tops[0] || null };\n  }\n  function cueText(c, blocked) {\n    const bits = [];\n    const nf = c && c.fronts ? c.fronts.length : 0;\n    if (nf === 1) bits.push(\"Fronts aligned\");\n    else if (nf > 1) bits.push(\"Fronts aligned on \" + nf + \" runs\");\n    if (c && c.tops && c.tops.length) bits.push(\"Tops aligned\");\n    if (bits.length) return bits.join(\" \\xB7 \");\n    if (!blocked) return \"\";\n    if (blocked.type === \"room-opening\")\n      return blocked.kind === \"door\" ? \"Stopped at \" + (blocked.label || \"the door\") + \" - its doorway stays clear\" : \"Stopped at \" + (blocked.label || \"the window\") + \" - it would cover it\";\n    return blocked.id === \"__wall\" ? \"Stopped at the wall\" : \"Stopped against \" + blocked.id;\n  }\n\n  // v2/src/model/plinths.js\n  var PLINTH = { TOE: 40, TH: 30, JOIN: 3, PLANE: 1, CORNER: 6, MIN: 40 };\n  var PLINTH_BOARDS = {\n    egger: { max: 2700, label: \"Egger board\" },\n    mdf: { max: 3e3, label: \"MDF\" }\n  };\n  function hasPlinth(u) {\n    return !!u && u.type !== \"workshop\" && u.family !== \"wall\";\n  }\n  function plinthFinishOf(u) {\n    return u && (u.plinthFinish || u.frontFinish || u.finish) || \"white\";\n  }\n  function plinthBoardOf(finish3) {\n    return /^mdf/i.test(String(finish3 || \"\")) ? \"mdf\" : \"egger\";\n  }\n  function plinthLabel(finish3) {\n    if (isPaintKey(finish3)) return paintKeyText(finish3);\n    const m = materialOf(finish3);\n    if (m) return m.label;\n    return plinthBoardOf(finish3) === \"mdf\" ? \"MDF\" : String(finish3 || \"white\");\n  }\n  function splitRun(lo, hi, max, joints) {\n    const L = hi - lo;\n    if (!(L > max + 1e-6)) return [{ from: lo, to: hi }];\n    const n = Math.ceil(L / max - 1e-9), cuts = [];\n    let prev = lo;\n    for (let k = 1; k < n; k++) {\n      const left = n - k;\n      const ideal = prev + (hi - prev) / (left + 1);\n      const okCut = (c2) => c2 > prev + PLINTH.MIN && c2 - prev <= max + 1e-6 && hi - c2 <= left * max + 1e-6;\n      let best = null;\n      (joints || []).forEach(function(j) {\n        if (!okCut(j) || Math.abs(j - ideal) > 0.25 * max) return;\n        if (best === null || Math.abs(j - ideal) < Math.abs(best - ideal)) best = j;\n      });\n      const c = best !== null ? best : Math.min(ideal, prev + max);\n      cuts.push(c);\n      prev = c;\n    }\n    const out = [];\n    let a = lo;\n    cuts.forEach(function(c) {\n      out.push({ from: a, to: c });\n      a = c;\n    });\n    out.push({ from: a, to: hi });\n    return out;\n  }\n  function segmentsOf(units) {\n    const segs = [];\n    (units || []).forEach(function(u) {\n      if (!hasPlinth(u)) return;\n      const finish3 = plinthFinishOf(u);\n      const inset = u.type === \"island\" && u.skinDrop ? T : 0;\n      frontFaces(u).forEach(function(f) {\n        segs.push({\n          axis: f.axis,\n          dir: f.dir,\n          front: f.at,\n          plane: f.at - f.dir * PLINTH.TOE,\n          lo: Math.min(f.from, f.to) + inset,\n          hi: Math.max(f.from, f.to) - inset,\n          finish: finish3,\n          y0: -LEG_H,\n          y1: 0,\n          unit: u.id,\n          arm: f.arm || \"\"\n        });\n      });\n    });\n    return segs;\n  }\n  function plinthRuns(units) {\n    const segs = segmentsOf(units).sort(function(a, b) {\n      return a.axis < b.axis ? -1 : a.axis > b.axis ? 1 : a.dir - b.dir || a.lo - b.lo || a.plane - b.plane;\n    });\n    const runs = [];\n    segs.forEach(function(s) {\n      let r = null;\n      for (let i = 0; i < runs.length; i++) {\n        const q = runs[i];\n        if (q.axis !== s.axis || q.dir !== s.dir || q.finish !== s.finish || q.y0 !== s.y0 || q.y1 !== s.y1) continue;\n        if (Math.abs(q.plane - s.plane) > PLINTH.PLANE) continue;\n        if (s.lo - q.hi > PLINTH.JOIN || s.hi < q.lo) continue;\n        r = q;\n        break;\n      }\n      if (!r) {\n        runs.push({\n          axis: s.axis,\n          dir: s.dir,\n          front: s.front,\n          plane: s.plane,\n          lo: s.lo,\n          hi: s.hi,\n          finish: s.finish,\n          y0: s.y0,\n          y1: s.y1,\n          units: [s.unit],\n          joints: [],\n          ends: { lo: \"free\", hi: \"free\" }\n        });\n        return;\n      }\n      if (s.lo > r.lo + PLINTH.MIN && s.lo < r.hi + PLINTH.JOIN) r.joints.push((Math.min(s.lo, r.hi) + Math.max(s.lo, r.hi)) / 2);\n      r.hi = Math.max(r.hi, s.hi);\n      if (r.units.indexOf(s.unit) < 0) r.units.push(s.unit);\n    });\n    for (let i = 0; i < runs.length; i++) for (let j = 0; j < runs.length; j++) {\n      const R4 = runs[i], P2 = runs[j];\n      if (R4.axis !== \"z\" || P2.axis !== \"x\") continue;\n      [\"lo\", \"hi\"].forEach(function(re) {\n        if (Math.abs(R4[re] - P2.front) > PLINTH.CORNER) return;\n        [\"lo\", \"hi\"].forEach(function(pe) {\n          if (Math.abs(P2[pe] - R4.front) > PLINTH.CORNER) return;\n          const sR = re === \"hi\" ? -1 : 1, sP = pe === \"hi\" ? -1 : 1;\n          if (sR !== P2.dir || sP !== R4.dir) return;\n          if (R4.ends[re] !== \"free\" || P2.ends[pe] !== \"free\") return;\n          R4[re] = P2.plane - P2.dir * PLINTH.TH;\n          R4.ends[re] = \"corner-through\";\n          P2[pe] = R4.plane;\n          P2.ends[pe] = \"corner-butt\";\n        });\n      });\n    }\n    return runs.filter(function(r) {\n      return r.hi - r.lo >= PLINTH.MIN;\n    }).map(function(r, k) {\n      const board = plinthBoardOf(r.finish), max = PLINTH_BOARDS[board].max;\n      const pieces = splitRun(r.lo, r.hi, max, r.joints).map(function(p) {\n        return { from: p.from, to: p.to, length: Math.round(p.to - p.from) };\n      });\n      return Object.assign(r, {\n        id: \"P\" + (k + 1),\n        back: r.plane - r.dir * PLINTH.TH,\n        length: Math.round(r.hi - r.lo),\n        height: r.y1 - r.y0,\n        board,\n        max,\n        pieces\n      });\n    });\n  }\n  function plinthRunOf(units, u) {\n    if (!hasPlinth(u)) return [];\n    const ids = {};\n    plinthRuns(units).forEach(function(r) {\n      if (r.units.indexOf(u.id) >= 0) r.units.forEach(function(id) {\n        ids[id] = 1;\n      });\n    });\n    ids[u.id] = 1;\n    return (units || []).filter(function(v) {\n      return ids[v.id];\n    });\n  }\n  function plinthRunsText(units, nameOf) {\n    const runs = plinthRuns(units);\n    if (!runs.length) return \"\";\n    const nm = nameOf || function(id) {\n      return id;\n    };\n    const lines = runs.map(function(r, i) {\n      const who = r.units.map(nm);\n      const span2 = who.length === 1 ? \"under \" + who[0] : \"continuous under \" + who.join(\", \");\n      const pcs = r.pieces.length === 1 ? \"one piece\" : r.pieces.length + \" pieces \" + r.pieces.map(function(p) {\n        return p.length;\n      }).join(\" + \") + \" mm\";\n      return \"Plinth run \" + (i + 1) + \": \" + r.length + \" mm long, \" + Math.round(r.height) + \" mm high, \" + plinthLabel(r.finish) + \", \" + span2 + \" \\u2014 \" + pcs + (r.ends.lo !== \"free\" || r.ends.hi !== \"free\" ? \", corner joint included\" : \"\");\n    });\n    const boards = {};\n    runs.forEach(function(r) {\n      boards[r.board] = 1;\n    });\n    const lim = Object.keys(boards).map(function(b) {\n      return PLINTH_BOARDS[b].label + \" \" + PLINTH_BOARDS[b].max + \" mm\";\n    }).join(\", \");\n    const painted = runs.some(function(r) {\n      return isPaintKey(r.finish);\n    });\n    return lines.join(\"\\n\") + \"\\nPlinth pieces are planned to a nominal maximum length (\" + lim + \"); plinths are not priced here and stock lengths are to be confirmed.\" + (painted ? \" Painted MDF plinths: the MDF board, supplied with a water-based primer only, is quoted with the painted doors.\" : \"\");\n  }\n\n  // v2/src/model/exposed-ends.js\n  var EXPOSE = { TOUCH: 3, GRID: 12, COVERED: 0.95, EXPOSED: 0.05, WALL_NEAR: 200 };\n  function sideSpan(u) {\n    if (!u) return [0, 0];\n    if (u.family === \"wall\") {\n      const y = u.y || 0;\n      return [y, y + (u.h || 0)];\n    }\n    return [-LEG_H, (u.y || 0) + (u.h || 0)];\n  }\n  function reachOf(u, side) {\n    const g2 = finishingOf(u);\n    return side === \"L\" ? (g2.endL ? FINISH_KIT.endT : 0) + g2.scribeL : (g2.endR ? FINISH_KIT.endT : 0) + g2.scribeR;\n  }\n  function sideProbe(u, side, extra) {\n    const E = unitEnvelope(u), xf = planXf(u, E.LX, E.LZ);\n    const r = reachOf(u, side), t = extra == null ? EXPOSE.TOUCH : extra;\n    const x0 = side === \"L\" ? -r - t : E.LX + r, x1 = side === \"L\" ? -r : E.LX + r + t;\n    const a = xf.p([x0, 0, 0]), b = xf.p([x1, 0, E.LZ]);\n    const box3 = { x0: Math.min(a[0], b[0]), x1: Math.max(a[0], b[0]), z0: Math.min(a[2], b[2]), z1: Math.max(a[2], b[2]) };\n    const along2 = box3.x1 - box3.x0 > box3.z1 - box3.z0 ? \"x\" : \"z\", normal = along2 === \"x\" ? \"z\" : \"x\";\n    const f = xf.p([side === \"L\" ? -r : E.LX + r, 0, 0]), n = xf.n([side === \"L\" ? -1 : 1, 0, 0]);\n    return {\n      box: box3,\n      along: along2,\n      normal,\n      face: normal === \"x\" ? f[0] : f[2],\n      out: (normal === \"x\" ? n[0] : n[2]) > 0 ? 1 : -1\n    };\n  }\n  function hit(b, x, z) {\n    return x > b.x0 && x < b.x1 && z > b.z0 && z < b.z1;\n  }\n  function sideExposure(units, u, side) {\n    const out = { side, state: \"n/a\", by: [], covered: 0, wallGap: null, panel: false, note: \"\" };\n    if (!u) return out;\n    const isl = u.type === \"island\";\n    if (!canFinishing(u) && !isl) {\n      out.note = finishingWhy(u) || \"\";\n      return out;\n    }\n    const g2 = finishingOf(u);\n    out.panel = isl ? true : side === \"L\" ? g2.endL : g2.endR;\n    if (isl) {\n      out.island = true;\n      out.toFloor = !!u.skinDrop;\n    }\n    const P2 = sideProbe(u, side);\n    const walls = roomWalls();\n    for (let i = 0; i < walls.length; i++) {\n      const w = walls[i];\n      if (w.axis !== P2.normal || w.dir !== P2.out) continue;\n      if (!alongWall(P2.box, w)) continue;\n      const face2 = w.axis === \"x\" ? w.dir > 0 ? P2.box.x1 : P2.box.x0 : w.dir > 0 ? P2.box.z1 : P2.box.z0;\n      const inner = w.axis === \"x\" ? w.dir > 0 ? P2.box.x0 : P2.box.x1 : w.dir > 0 ? P2.box.z0 : P2.box.z1;\n      const past = w.dir > 0 ? face2 - w.at : w.at - face2;\n      if (past > 1e-3) {\n        out.state = \"wall\";\n        out.wall = w.id;\n        out.by = [w.name];\n        out.covered = 1;\n        out.wallGap = 0;\n        return out;\n      }\n      const gap = w.dir > 0 ? w.at - inner : inner - w.at;\n      if (gap >= 0 && gap <= EXPOSE.WALL_NEAR && (out.wallGap === null || gap < out.wallGap)) {\n        out.wallGap = Math.round(gap);\n        out.wall = w.id;\n      }\n    }\n    const span2 = sideSpan(u), N = EXPOSE.GRID;\n    const cands = (units || []).filter(function(v) {\n      return v && v.id !== u.id;\n    }).map(function(v) {\n      return { v, span: sideSpan(v), boxes: footBoxes(v) };\n    }).filter(function(c) {\n      return c.span[0] < span2[1] - 1 && c.span[1] > span2[0] + 1;\n    });\n    const B = P2.box, mid = P2.face + P2.out * (EXPOSE.TOUCH - 0.25);\n    const lo = P2.along === \"x\" ? B.x0 : B.z0, hi = P2.along === \"x\" ? B.x1 : B.z1;\n    let n = 0, cov = 0;\n    const by = {};\n    for (let i = 0; i < N; i++) {\n      const s = lo + (hi - lo) * (i + 0.5) / N;\n      const x = P2.along === \"x\" ? s : mid, z = P2.along === \"x\" ? mid : s;\n      for (let j = 0; j < N; j++) {\n        const y = span2[0] + (span2[1] - span2[0]) * (j + 0.5) / N;\n        n++;\n        for (let c = 0; c < cands.length; c++) {\n          const C3 = cands[c];\n          if (y <= C3.span[0] || y >= C3.span[1]) continue;\n          if (C3.boxes.some(function(bb) {\n            return hit(bb, x, z);\n          })) {\n            cov++;\n            by[C3.v.id] = C3.v;\n            break;\n          }\n        }\n      }\n    }\n    out.covered = n ? cov / n : 0;\n    out.by = Object.keys(by).map(function(id) {\n      return displayName(units, by[id]);\n    });\n    out.state = out.covered >= EXPOSE.COVERED ? \"covered\" : out.covered <= EXPOSE.EXPOSED ? \"exposed\" : \"partly\";\n    return out;\n  }\n  function exposedEnds(units, u) {\n    return { L: sideExposure(units, u, \"L\"), R: sideExposure(units, u, \"R\") };\n  }\n  function openRunEnds(units) {\n    const out = [];\n    (units || []).forEach(function(u) {\n      if (u && u.type === \"island\") {\n        if (!u.skinDrop && [\"L\", \"R\"].some(function(s) {\n          return sideExposure(units, u, s).state === \"exposed\";\n        })) out.push({ id: u.id, side: \"island\" });\n        return;\n      }\n      if (!canFinishing(u)) return;\n      [\"L\", \"R\"].forEach(function(s) {\n        const e = sideExposure(units, u, s);\n        if (e.state === \"exposed\" && !e.panel) out.push({ id: u.id, side: s });\n      });\n    });\n    return out;\n  }\n  function exposureText(e) {\n    if (!e) return \"\";\n    const who = e.by.length ? e.by.join(\", \") : \"\";\n    switch (e.state) {\n      case \"wall\":\n        return \"against the \" + who;\n      case \"covered\":\n        return e.island ? \"island end against \" + who : e.panel ? \"panel sits against \" + who + \" - not a run end\" : \"next to \" + who;\n      case \"partly\":\n        return \"partly exposed - \" + who + \" covers \" + Math.round(e.covered * 100) + \"%\";\n      case \"exposed\":\n        return (e.island ? \"island end, built-in panel\" + (e.toFloor ? \" to the floor\" : \" (legs show below)\") : \"exposed run end\") + (e.wallGap != null && e.wallGap > 0 ? \" (\" + e.wallGap + \" mm from the wall)\" : \"\");\n      default:\n        return e.note || \"\";\n    }\n  }\n\n  // v2/src/model/worktop-catalogue.js\n  var WT_SOURCE = { read: \"2026-10-08\", supplier: \"Panelco (panelco.com)\", maker: \"EGGER\", lines: 42, skus: 128, priced: 4 };\n  var WT_LINES = [{ \"id\": \"F128PA-20pa\", \"decor\": \"F128\", \"tex\": \"PA\", \"name\": \"Black Ambiance Granite\", \"family\": \"20pa\", \"familyLabel\": \"20 mm PerfectSense Ambiance\", \"t\": 20, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2026/01/F128.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8856861048862/8860181823518/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f128-pa-laminate-breakfast-bars/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F128_PA?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f128-pa\" }, \"colourFrom\": \"the planner's calibrated EGGER F128 PA\", \"notes\": [\"Panelco files this 650 mm-deep size under 'Laminate Breakfast Bars' (the 20mm Ambiance decors have no separate worktop page); treated as a standard worktop by depth/code (3611 vs 3621)\", \"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3611/F128PA\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3621/F128PA\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }] }, { \"id\": \"F129PA-20pa\", \"decor\": \"F129\", \"tex\": \"PA\", \"name\": \"Beige Ambiance Granite\", \"family\": \"20pa\", \"familyLabel\": \"20 mm PerfectSense Ambiance\", \"t\": 20, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2026/01/F129.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860181987358/8860182020126/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f129-pa-laminate-breakfast-bars/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F129_PA?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f129-pa\" }, \"colourFrom\": \"the planner's calibrated EGGER F129 PA\", \"notes\": [\"Panelco files this 650 mm-deep size under 'Laminate Breakfast Bars' (the 20mm Ambiance decors have no separate worktop page); treated as a standard worktop by depth/code (3611 vs 3621)\", \"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3611/F129PA\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3621/F129PA\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }] }, { \"id\": \"F199PA-20pa\", \"decor\": \"F199\", \"tex\": \"PA\", \"name\": \"Black Ambiance Marble\", \"family\": \"20pa\", \"familyLabel\": \"20 mm PerfectSense Ambiance\", \"t\": 20, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2026/01/F199.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8862193614878/8862193647646/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f199-pa-laminate-breakfast-bars/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F199_PA?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#292524\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/d57a237d68c2584c-worktop-tex-F199PA.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8862193614878/8862193647646/AR_4_3.png\", \"md5\": \"4ed3673a38e0804d204da0c656ccbda8\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8862193614878/8862193647646/AR_4_3.png\", \"notes\": [\"Panelco files this 650 mm-deep size under 'Laminate Breakfast Bars' (the 20mm Ambiance decors have no separate worktop page); treated as a standard worktop by depth/code (3611 vs 3621)\", \"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3611/F199PA\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3621/F199PA\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }] }, { \"id\": \"F032ST78-25sq\", \"decor\": \"F032\", \"tex\": \"ST78\", \"name\": \"Grey Cascia Granite\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F032.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860179038238/8860179071006/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f032-st78-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F032_78?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#67645f\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/68ff5440e0b74964-worktop-tex-F032ST78.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860179038238/8860179071006/AR_4_3.png\", \"md5\": \"90cdc6696b99c8e0c19c25288af298c8\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860179038238/8860179071006/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F032ST78\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F032ST78\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f032-st78-laminate-breakfast-bars/\" }, { \"id\": \"F052ST75-25sq\", \"decor\": \"F052\", \"tex\": \"ST75\", \"name\": \"Calais Travertine\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F052.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860179726366/8860179759134/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f052-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F052_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#c2b8b0\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/401e6145ae8d1cac-worktop-tex-F052ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860179726366/8860179759134/AR_4_3.png\", \"md5\": \"7c5129800c950142bf5caf7d02f283ea\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860179726366/8860179759134/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F052ST75\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F052ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f052-st75-laminate-breakfast-bars/\" }, { \"id\": \"F076ST75-25sq\", \"decor\": \"F076\", \"tex\": \"ST75\", \"name\": \"Grey Braganza Granite\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F076.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860180316190/8860180348958/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f076-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F076_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#a29e96\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/b2d82420741f797a-worktop-tex-F076ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860180316190/8860180348958/AR_4_3.png\", \"md5\": \"6f3232f8bf15d45141a21e507b081bb9\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860180316190/8860180348958/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F076ST75\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F076ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f076-st75-laminate-breakfast-bars/\" }, { \"id\": \"F121ST87-25sq\", \"decor\": \"F121\", \"tex\": \"ST87\", \"name\": \"Anthracite Metal Rock\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F121.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854323888158/8854505390110/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f121-st87-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F121_87?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#59544e\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/658a0edbdbd3a62b-worktop-tex-F121ST87.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8854323888158/8854505390110/AR_4_3.png\", \"md5\": \"4ff20e9b323ed06c036d3da392276a71\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8854323888158/8854505390110/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F121ST87\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F121ST87\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f121-st87-laminate-breakfast-bars/\" }, { \"id\": \"F229ST75-25sq\", \"decor\": \"F229\", \"tex\": \"ST75\", \"name\": \"Cremona Marble\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F229.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860183920670/8860183953438/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f229-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F229_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#f0ebe1\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/dc4ddcd82622c405-worktop-tex-F229ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860183920670/8860183953438/AR_4_3.png\", \"md5\": \"3d9dd94cb2c94302348097eb5782a49c\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860183920670/8860183953438/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F229ST75\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F229ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f229-st75-laminate-breakfast-bars/\" }, { \"id\": \"F237ST76-25sq\", \"decor\": \"F237\", \"tex\": \"ST76\", \"name\": \"Cupria Slate\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F237.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854510895134/8854510927902/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f237-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F237_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f237-st76\" }, \"colourFrom\": \"the planner's calibrated EGGER F237 ST76\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F237ST76\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F237ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f237-st76-laminate-breakfast-bars/\" }, { \"id\": \"F243ST76-25sq\", \"decor\": \"F243\", \"tex\": \"ST76\", \"name\": \"Light Grey Candela Marble\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F243.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854511878174/8854511910942/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f243-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F243_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f243-st76\" }, \"colourFrom\": \"the planner's calibrated EGGER F243 ST76\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F243ST76\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F243ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f243-st76-laminate-breakfast-bars/\" }, { \"id\": \"F244ST76-25sq\", \"decor\": \"F244\", \"tex\": \"ST76\", \"name\": \"Anthracite Candela Marble\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F244.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854512271390/8854512304158/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f244-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F244_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f244-st76\" }, \"colourFrom\": \"the planner's calibrated EGGER F244 ST76\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F244ST76\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F244ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f244-st76-laminate-breakfast-bars/\" }, { \"id\": \"F637ST10-25sq\", \"decor\": \"F637\", \"tex\": \"ST10\", \"name\": \"White Chromix\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F637.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854345842718/8854517710878/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f637-st10-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F637_10?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f637-st10\" }, \"colourFrom\": \"the planner's calibrated EGGER F637 ST10\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F637ST10\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F637ST10\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f637-st10-laminate-breakfast-bars/\" }, { \"id\": \"F676ST75-25sq\", \"decor\": \"F676\", \"tex\": \"ST75\", \"name\": \"Sand Grey Calvia\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F676.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860190408734/8860190441502/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f676-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F676_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#d5c9bd\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/623ef34d71acc07d-worktop-tex-F676ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860190408734/8860190441502/AR_4_3.png\", \"md5\": \"9ebe3d4da72c8c2642598cc38febc0b1\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860190408734/8860190441502/AR_4_3.png\", \"notes\": ['EGGER name: \"Sand Grey Calvia Stone\"', 'breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished; EGGER name: \"Sand Grey Calvia Stone\"'], \"sizes\": [{ \"sku\": \"3612/F676ST75\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F676ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f676-st75-laminate-breakfast-bars/\" }, { \"id\": \"F800ST9-25sq\", \"decor\": \"F800\", \"tex\": \"ST9\", \"name\": \"Crystal Marble\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F800.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854519775262/8854519808030/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f800-st9-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F800_9?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f800-st9\" }, \"colourFrom\": \"the planner's calibrated EGGER F800 ST9\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F800ST9\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F800ST9\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f800-st9-laminate-breakfast-bars/\" }, { \"id\": \"F812ST9-25sq\", \"decor\": \"F812\", \"tex\": \"ST9\", \"name\": \"White Levanto Marble\", \"family\": \"25sq\", \"familyLabel\": \"25 mm square edge\", \"t\": 25, \"edge\": \"square edge, 1.5 mm ABS edging (EGGER datasheet)\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F812.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854349381662/8854520070174/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f812-st9-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F812_9?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f812-st9\" }, \"colourFrom\": \"the planner's calibrated EGGER F812 ST9\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3612/F812ST9\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3622/F812ST9\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f812-st9-laminate-breakfast-bars/\" }, { \"id\": \"H1180ST37-38fw\", \"decor\": \"H1180\", \"tex\": \"ST37\", \"name\": \"Natural Halifax Oak\", \"family\": \"38fw\", \"familyLabel\": \"38 mm Feelwood square edge\", \"t\": 38, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H1180.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854365372446/8854523117598/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h1180-st37-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H1180_37?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h1180-st37\" }, \"colourFrom\": \"the planner's calibrated EGGER H1180 ST37\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3615/H1180ST37\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3625/H1180ST37\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h1180-st37-laminate-breakfast-bars/\" }, { \"id\": \"H1344ST32-38fw\", \"decor\": \"H1344\", \"tex\": \"ST32\", \"name\": \"Cognac Brown Sherman Oak\", \"family\": \"38fw\", \"familyLabel\": \"38 mm Feelwood square edge\", \"t\": 38, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H1344.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854376775710/8854527868958/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h1344-st32-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H1344_32?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#8f6b41\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/609703d05a6f680e-worktop-tex-H1344ST32.jpg\", \"mm\": [400, 300], \"grain\": \"v\", \"egger\": \"https://cdn.egger.com/img/pim/8854376775710/8854527868958/AR_4_3.png\", \"md5\": \"ea50276ac38001a7f4a62d3172c1c0d1\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8854376775710/8854527868958/AR_4_3.png\", \"notes\": [\"EGGER decor page fetched directly (not shown in the GB worktops-collection decor slider)\", \"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished; EGGER decor page fetched directly (not shown in the GB worktops-collection decor slider)\"], \"sizes\": [{ \"sku\": \"3615/H1344ST32\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3625/H1344ST32\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h1344-st32-laminate-breakfast-bars/\" }, { \"id\": \"H3176ST37-38fw\", \"decor\": \"H3176\", \"tex\": \"ST37\", \"name\": \"Pewter Halifax Oak\", \"family\": \"38fw\", \"familyLabel\": \"38 mm Feelwood square edge\", \"t\": 38, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H3176.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854403612702/8854539599902/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h3176-st37-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H3176_37?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h3176-st37\" }, \"colourFrom\": \"the planner's calibrated EGGER H3176 ST37\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3615/H3176ST37\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3625/H3176ST37\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h3176-st37-laminate-breakfast-bars/\" }, { \"id\": \"H3359ST32-38fw\", \"decor\": \"H3359\", \"tex\": \"ST32\", \"name\": \"Light Natural Davenport Oak\", \"family\": \"38fw\", \"familyLabel\": \"38 mm Feelwood square edge\", \"t\": 38, \"edge\": \"square edge; edging thickness not stated by EGGER / Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H3359.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854542450718/8854542483486/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h3359-st12-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H3359_32?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#bb9b7a\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/3757f6053e4f4c4d-worktop-tex-H3359ST32.jpg\", \"mm\": [400, 300], \"grain\": \"v\", \"egger\": \"https://cdn.egger.com/img/pim/8854542450718/8854542483486/AR_4_3.png\", \"md5\": \"e224337263da508296e74041e0fb8a27\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8854542450718/8854542483486/AR_4_3.png\", \"notes\": [\"Panelco attribute says texture ST12 (and URL slug), but Panelco product code 3615/H3359ST32, Panelco upstand/splashback slugs, EGGER Stock Programme and egger.com all say ST32; ST32 used\", \"Panelco attribute says texture ST12 (and URL slug), but Panelco product code 3625/H3359ST32, Panelco upstand/splashback slugs, EGGER Stock Programme and egger.com all say ST32; ST32 used; breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3615/H3359ST32\", \"l\": 4100, \"d\": 650, \"bar\": false, \"shop\": null }, { \"sku\": \"3625/H3359ST32\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h3359-st12-laminate-breakfast-bars/\" }, { \"id\": \"F074ST75-38pf\", \"decor\": \"F074\", \"tex\": \"ST75\", \"name\": \"Light Grey Valmasino Marble\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F074.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860180021278/8860180054046/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f074-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F074_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#b7b4ad\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/d1af5de973ec4e8f-worktop-tex-F074ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860180021278/8860180054046/AR_4_3.png\", \"md5\": \"91679e081bff14427b461f52273e589d\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860180021278/8860180054046/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F074ST75\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F074ST75\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F074ST75\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F074ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f074-st75-laminate-breakfast-bars/\" }, { \"id\": \"F186ST9-38pf\", \"decor\": \"F186\", \"tex\": \"ST9\", \"name\": \"Light Grey Chicago Concrete\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F186.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854324674590/8854505488414/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f186-st9-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F186_9?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f186-st9\" }, \"colourFrom\": \"the planner's calibrated EGGER F186 ST9\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F186ST9\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F186ST9\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F186ST9\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f186-st9-laminate-breakfast-bars/\" }, { \"id\": \"F206ST9-38pf\", \"decor\": \"F206\", \"tex\": \"ST9\", \"name\": \"Black Pietra Grigia\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F206.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854326640670/8854505979934/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f206-st9-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F206_9?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f206-st9\" }, \"colourFrom\": \"the planner's calibrated EGGER F206 ST9\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F206ST9\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": [{ \"price\": 102.96, \"product\": \"Worktop F206 ST9 Black Pietra Grigia Egger 38mm\", \"variant\": \"Worktop F206 ST9 Black Pietra Grigia Egger 38mm - 38mm / 3050x600\", \"id\": \"14995013370241\" }] }, { \"sku\": \"3610/F206ST9\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F206ST9\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f206-st9-laminate-breakfast-bars/\" }, { \"id\": \"F226ST78-38pf\", \"decor\": \"F226\", \"tex\": \"ST78\", \"name\": \"Sand Beige Titanite\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F226.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854507290654/8854507323422/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f226-st78-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F226_78?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#8f7760\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/e7dff8a3d8da0949-worktop-tex-F226ST78.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8854507290654/8854507323422/AR_4_3.png\", \"md5\": \"cd189fb98012f7e525d6ebe0a5e95885\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8854507290654/8854507323422/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F226ST78\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F226ST78\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F226ST78\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F226ST78\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f226-st78-laminate-breakfast-bars/\" }, { \"id\": \"F229ST75-38pf\", \"decor\": \"F229\", \"tex\": \"ST75\", \"name\": \"Cremona Marble\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F229.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860183920670/8860183953438/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f229-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F229_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#f0ebe1\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/dc4ddcd82622c405-worktop-tex-F229ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860183920670/8860183953438/AR_4_3.png\", \"md5\": \"3d9dd94cb2c94302348097eb5782a49c\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860183920670/8860183953438/AR_4_3.png\", \"notes\": [\"Panelco lists 3601 with length 4100 (every other 3601 SKU is 3050x600); this duplicates 3600/F229 4100x600 - likely a Panelco data error, confirm with Panelco\", \"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F229ST75\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F229ST75\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F229ST75\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F229ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f229-st75-laminate-breakfast-bars/\" }, { \"id\": \"F235ST76-38pf\", \"decor\": \"F235\", \"tex\": \"ST76\", \"name\": \"Scivaro Slate\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F235.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854510501918/8854510534686/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f235-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F235_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f235-st76\" }, \"colourFrom\": \"the planner's calibrated EGGER F235 ST76\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F235ST76\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F235ST76\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F235ST76\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F235ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f235-st76-laminate-breakfast-bars/\" }, { \"id\": \"F247ST76-38pf\", \"decor\": \"F247\", \"tex\": \"ST76\", \"name\": \"Anthracite Mountain Basalt\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F247.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860184805406/8860184838174/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f247-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F247_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#262525\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/e68018ad40e386f2-worktop-tex-F247ST76.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860184805406/8860184838174/AR_4_3.png\", \"md5\": \"a7a02295dcce5497cda1cf58076581ed\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860184805406/8860184838174/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F247ST76\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F247ST76\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F247ST76\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F247ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f247-st76-laminate-breakfast-bars/\" }, { \"id\": \"F486ST76-38pf\", \"decor\": \"F486\", \"tex\": \"ST76\", \"name\": \"White Sparkle Grain\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F486.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860187164702/8860187197470/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f486-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F486_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#d6cec1\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/c18949d15e64ee5d-worktop-tex-F486ST76.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860187164702/8860187197470/AR_4_3.png\", \"md5\": \"d9503ed098a83c9d6b4190a28a6f03dc\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860187164702/8860187197470/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F486ST76\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F486ST76\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F486ST76\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F486ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f486-st76-laminate-breakfast-bars/\" }, { \"id\": \"F487ST76-38pf\", \"decor\": \"F487\", \"tex\": \"ST76\", \"name\": \"Grey Sparkle Grain\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F487.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860187459614/8860187492382/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f487-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F487_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#756e69\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/8ae21fb29b98126a-worktop-tex-F487ST76.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860187459614/8860187492382/AR_4_3.png\", \"md5\": \"aac349c79b9afbd3efc8d17ea3259b3a\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860187459614/8860187492382/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F487ST76\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F487ST76\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F487ST76\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F487ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f487-st76-laminate-breakfast-bars/\" }, { \"id\": \"F490ST76-38pf\", \"decor\": \"F490\", \"tex\": \"ST76\", \"name\": \"Black Sparkle Grain\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F490.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860187754526/8860187787294/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f490-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F490_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#2a282b\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/8d4d81403a7e48c1-worktop-tex-F490ST76.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860187754526/8860187787294/AR_4_3.png\", \"md5\": \"3a43d4a30d381fd89d8e9cae00a18c85\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860187754526/8860187787294/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F490ST76\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F490ST76\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F490ST76\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F490ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f490-st76-laminate-breakfast-bars/\" }, { \"id\": \"F620ST87-38pf\", \"decor\": \"F620\", \"tex\": \"ST87\", \"name\": \"Anthracite Steel Gray\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F620.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860188835870/8860188868638/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f620-st87-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F620_87?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#625d5b\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/e19ccc7cf292a531-worktop-tex-F620ST87.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860188835870/8860188868638/AR_4_3.png\", \"md5\": \"66be27f6f9d2e3b0bfd971437acfce84\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860188835870/8860188868638/AR_4_3.png\", \"notes\": ['EGGER name: \"Anthracite Steel Grey\"', 'breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished; EGGER name: \"Anthracite Steel Grey\"'], \"sizes\": [{ \"sku\": \"3601/F620ST87\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F620ST87\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": [{ \"price\": 123.76, \"product\": \"F620 ST87 Anthracite Grey Egger Worktop 38mm\", \"variant\": \"F620 ST87 Anthracite Grey Egger Worktop 38mm - 38mm / 4100x600\", \"id\": \"14848005079425\" }] }, { \"sku\": \"3610/F620ST87\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F620ST87\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f620-st87-laminate-breakfast-bars/\" }, { \"id\": \"F638ST10-38pf\", \"decor\": \"F638\", \"tex\": \"ST10\", \"name\": \"Chromix Silver\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F638.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854346629150/8854517907486/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f638-st10-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F638_10?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f638-st10\" }, \"colourFrom\": \"the planner's calibrated EGGER F638 ST10\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F638ST10\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F638ST10\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F638ST10\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F638ST10\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f638-st10-laminate-breakfast-bars/\" }, { \"id\": \"F676ST75-38pf\", \"decor\": \"F676\", \"tex\": \"ST75\", \"name\": \"Sand Grey Calvia\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F676.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860190408734/8860190441502/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f676-st75-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F676_75?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#d5c9bd\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/623ef34d71acc07d-worktop-tex-F676ST75.jpg\", \"mm\": [400, 300], \"grain\": \"none\", \"egger\": \"https://cdn.egger.com/img/pim/8860190408734/8860190441502/AR_4_3.png\", \"md5\": \"9ebe3d4da72c8c2642598cc38febc0b1\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860190408734/8860190441502/AR_4_3.png\", \"notes\": ['EGGER name: \"Sand Grey Calvia Stone\"', 'breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished; EGGER name: \"Sand Grey Calvia Stone\"'], \"sizes\": [{ \"sku\": \"3601/F676ST75\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/F676ST75\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/F676ST75\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F676ST75\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f676-st75-laminate-breakfast-bars/\" }, { \"id\": \"F812ST9-38pf\", \"decor\": \"F812\", \"tex\": \"ST9\", \"name\": \"White Levanto Marble\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/F812.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854349381662/8854520070174/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/f812-st9-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/F812_9?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"f812-st9\" }, \"colourFrom\": \"the planner's calibrated EGGER F812 ST9\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/F812ST9\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": [{ \"price\": 102.96, \"product\": \"Worktop F812 ST9 White Levanto Marble Egger 38mm\", \"variant\": \"Worktop F812 ST9 White Levanto Marble Egger 38mm - 38mm / 3050x600\", \"id\": \"14988243665281\" }] }, { \"sku\": \"3600/F812ST9\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": [{ \"price\": 220, \"product\": \"Worktop F812 ST9 White Levanto Marble Egger 38mm\", \"variant\": \"Worktop F812 ST9 White Levanto Marble Egger 38mm - 38mm / 4100x600\", \"id\": \"14988243665281\" }] }, { \"sku\": \"3610/F812ST9\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/F812ST9\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/f812-st9-laminate-breakfast-bars/\" }, { \"id\": \"H1146ST10-38pf\", \"decor\": \"H1146\", \"tex\": \"ST10\", \"name\": \"Grey Bardolino Oak\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H1146.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860194308126/8860194340894/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h1146-st10-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H1146_10?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h1146-st10\" }, \"colourFrom\": \"the planner's calibrated EGGER H1146 ST10\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H1146ST10\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H1146ST10\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H1146ST10\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H1146ST10\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h1146-st10-laminate-breakfast-bars/\" }, { \"id\": \"H1313ST10-38pf\", \"decor\": \"H1313\", \"tex\": \"ST10\", \"name\": \"Grey Brown Whiteriver Oak\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H1313.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854374416414/8854527574046/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h1313-st10-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H1313_10?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h1313-st10\" }, \"colourFrom\": \"the planner's calibrated EGGER H1313 ST10\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H1313ST10\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H1313ST10\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H1313ST10\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H1313ST10\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h1313-st10-laminate-breakfast-bars/\" }, { \"id\": \"H1401ST22-38pf\", \"decor\": \"H1401\", \"tex\": \"ST22\", \"name\": \"Cascina Pine\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H1401.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854381101086/8854531080222/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h1401-st22-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H1401_22?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#d8d3c9\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/5d60f3a7e084dd3e-worktop-tex-H1401ST22.jpg\", \"mm\": [400, 300], \"grain\": \"v\", \"egger\": \"https://cdn.egger.com/img/pim/8854381101086/8854531080222/AR_4_3.png\", \"md5\": \"f3af045d2f1189e48f5cc91a004eb1a2\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8854381101086/8854531080222/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H1401ST22\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H1401ST22\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H1401ST22\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H1401ST22\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h1401-st22-laminate-breakfast-bars/\" }, { \"id\": \"H193ST12-38pf\", \"decor\": \"H193\", \"tex\": \"ST12\", \"name\": \"Oak Butcherblock\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H193.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860200632350/8860200665118/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h193-st12-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H193_12?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#c1ab88\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/1802e7f31f22cb57-worktop-tex-H193ST12.jpg\", \"mm\": [400, 300], \"grain\": \"v\", \"egger\": \"https://cdn.egger.com/img/pim/8860200632350/8860200665118/AR_4_3.png\", \"md5\": \"5fe7b70439d0b618fe327d3f8c7e100e\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860200632350/8860200665118/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H193ST12\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H193ST12\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H193ST12\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H193ST12\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h193-st12-laminate-breakfast-bars/\" }, { \"id\": \"H194ST12-38pf\", \"decor\": \"H194\", \"tex\": \"ST12\", \"name\": \"Walnut ButcherBlock\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H194.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8860200927262/8860200960030/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h194-st12-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H194_12?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"hex\": \"#996945\", \"texture\": { \"url\": \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-09/cdeb10a5b865d362-worktop-tex-H194ST12.jpg\", \"mm\": [400, 300], \"grain\": \"v\", \"egger\": \"https://cdn.egger.com/img/pim/8860200927262/8860200960030/AR_4_3.png\", \"md5\": \"ca549d2beabcabef5f370fc7010c33fd\", \"scale\": \"approximate (H1180 ST37 board-file comparison)\" } }, \"colourFrom\": \"mean of EGGER's decor image https://cdn.egger.com/img/pim/8860200927262/8860200960030/AR_4_3.png\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H194ST12\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H194ST12\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H194ST12\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H194ST12\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h194-st12-laminate-breakfast-bars/\" }, { \"id\": \"H2033ST10-38pf\", \"decor\": \"H2033\", \"tex\": \"ST10\", \"name\": \"Dark Hunton Oak\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H2033.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854392111134/8854534422558/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h2033-st10-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H2033_10?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h2033-st10\" }, \"colourFrom\": \"the planner's calibrated EGGER H2033 ST10\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H2033ST10\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H2033ST10\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H2033ST10\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H2033ST10\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h2033-st10-laminate-breakfast-bars/\" }, { \"id\": \"H3157ST12-38pf\", \"decor\": \"H3157\", \"tex\": \"ST12\", \"name\": \"Vicenza Oak\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H3157.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854400466974/8854538420254/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h3157-st12-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H3157_12?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h3157-st12\" }, \"colourFrom\": \"the planner's calibrated EGGER H3157 ST12\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H3157ST12\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H3157ST12\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H3157ST12\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H3157ST12\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h3157-st12-laminate-breakfast-bars/\" }, { \"id\": \"H3303ST10-38pf\", \"decor\": \"H3303\", \"tex\": \"ST10\", \"name\": \"Natural Hamilton Oak\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/H3303.jpg\", \"eggerImage\": \"https://cdn.egger.com/img/pim/8854408724510/8854540386334/AR_4_3.png\", \"panelco\": \"https://panelco.com/products/h3303-st10-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/H3303_10?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"h3303-st10\" }, \"colourFrom\": \"the planner's calibrated EGGER H3303 ST10\", \"notes\": [\"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished\"], \"sizes\": [{ \"sku\": \"3601/H3303ST10\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/H3303ST10\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/H3303ST10\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/H3303ST10\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/h3303-st10-laminate-breakfast-bars/\" }, { \"id\": \"W1000ST76-38pf\", \"decor\": \"W1000\", \"tex\": \"ST76\", \"name\": \"Premium White\", \"family\": \"38pf\", \"familyLabel\": \"38 mm postformed\", \"t\": 38, \"edge\": \"postformed front edge, 3 mm radius (EGGER); single or double postforming not stated by Panelco\", \"image\": \"https://panelco.com/wp-content/uploads/2025/10/W1000.jpg\", \"eggerImage\": null, \"panelco\": \"https://panelco.com/products/w1000-st76-laminate-worktops/\", \"egger\": \"https://www.egger.com/en/furniture-interior-design/decors/W1000_76?country=GB\", \"core\": \"Chipboard\", \"cert\": \"PEFC\", \"colour\": { \"key\": \"white\" }, \"colourFrom\": \"the planner's calibrated EGGER W1000 ST9 (same print, another texture)\", \"notes\": [\"EGGER decor page fetched directly (not shown in the GB worktops-collection decor slider)\", \"breakfast bar (920 mm deep); Panelco does not state whether both long edges are finished; EGGER decor page fetched directly (not shown in the GB worktops-collection decor slider)\"], \"sizes\": [{ \"sku\": \"3601/W1000ST76\", \"l\": 3050, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3600/W1000ST76\", \"l\": 4100, \"d\": 600, \"bar\": false, \"shop\": null }, { \"sku\": \"3610/W1000ST76\", \"l\": 4100, \"d\": 670, \"bar\": false, \"shop\": null }, { \"sku\": \"3620/W1000ST76\", \"l\": 4100, \"d\": 920, \"bar\": true, \"shop\": null }], \"barPage\": \"https://panelco.com/products/w1000-st76-laminate-breakfast-bars/\" }];\n\n  // v2/src/model/worktops.js\n  var WT = { FRONT: 20, SIDE: 0, MAX_OVER: 100, JOIN: 3, PLANE: 1, CORNER: 6, MIN: 100, DEFAULT_LINE: \"F812ST9-38pf\" };\n  var BY_ID2 = new Map(WT_LINES.map((L) => [L.id, L]));\n  function lineOf(id) {\n    return BY_ID2.get(id) || null;\n  }\n  var clampN2 = (v, lo, hi, d) => {\n    const n = Number(v);\n    return Number.isFinite(n) ? Math.min(hi, Math.max(lo, Math.round(n))) : d;\n  };\n  function worktopOf(kitchen) {\n    const w = kitchen && kitchen.worktop;\n    if (!w || typeof w !== \"object\") return { on: false, line: WT.DEFAULT_LINE, front: WT.FRONT, side: WT.SIDE, set: false };\n    return {\n      on: !!w.on,\n      line: lineOf(w.line) ? w.line : WT.DEFAULT_LINE,\n      front: clampN2(w.front, 0, WT.MAX_OVER, WT.FRONT),\n      side: clampN2(w.side, 0, WT.MAX_OVER, WT.SIDE),\n      set: true\n    };\n  }\n  function hasTop(u) {\n    if (!u || u.family === \"wall\" || isTall(u) || u.type === \"island\") return false;\n    return u.family === \"base\" || u.type === \"corner-l\" || u.type === \"corner-blind\";\n  }\n  function endsAlong(u, f) {\n    if (!canFinishing(u)) return { lo: Math.min(f.from, f.to), hi: Math.max(f.from, f.to), loSide: null, hiSide: null };\n    const g2 = finishingOf(u), rL = (g2.endL ? FINISH_KIT.endT : 0) + g2.scribeL, rR = (g2.endR ? FINISH_KIT.endT : 0) + g2.scribeR;\n    const E = unitEnvelope(u), xf = planXf(u, E.LX, E.LZ);\n    const a = xf.p([-rL, 0, u.d]), b = xf.p([E.LX + rR, 0, u.d]);\n    const ca = f.axis === \"x\" ? a[2] : a[0], cb = f.axis === \"x\" ? b[2] : b[0];\n    return ca <= cb ? { lo: ca, hi: cb, loSide: \"L\", hiSide: \"R\" } : { lo: cb, hi: ca, loSide: \"R\", hiSide: \"L\" };\n  }\n  function segmentsOf2(units) {\n    const segs = [];\n    (units || []).forEach(function(u) {\n      if (!hasTop(u)) return;\n      const top = (u.y || 0) + u.h;\n      frontFaces(u).forEach(function(f) {\n        const e = f.arm ? { lo: Math.min(f.from, f.to), hi: Math.max(f.from, f.to), loSide: null, hiSide: null } : endsAlong(u, f);\n        segs.push({\n          axis: f.axis,\n          dir: f.dir,\n          front: f.at,\n          back: f.at - f.dir * u.d,\n          lo: e.lo,\n          hi: e.hi,\n          top,\n          unit: u.id,\n          u,\n          loSide: e.loSide,\n          hiSide: e.hiSide,\n          arm: f.arm || \"\"\n        });\n      });\n    });\n    return segs;\n  }\n  function endFree(units, seg, which) {\n    const side = which === \"lo\" ? seg.loSide : seg.hiSide;\n    if (!side) return false;\n    return sideExposure(units, seg.u, side).state === \"exposed\";\n  }\n  function worktopRuns(units, kitchen) {\n    const W2 = worktopOf(kitchen);\n    if (!W2.on) return [];\n    const L = lineOf(W2.line);\n    const segs = segmentsOf2(units).sort(function(a, b) {\n      return a.axis < b.axis ? -1 : a.axis > b.axis ? 1 : a.dir - b.dir || a.lo - b.lo;\n    });\n    const runs = [];\n    segs.forEach(function(s) {\n      let r = null;\n      for (let i = 0; i < runs.length; i++) {\n        const q = runs[i];\n        if (q.axis !== s.axis || q.dir !== s.dir || Math.abs(q.front - s.front) > WT.PLANE || Math.abs(q.back - s.back) > WT.PLANE || Math.abs(q.top - s.top) > 1) continue;\n        if (s.lo - q.hi > WT.JOIN || s.hi < q.lo) continue;\n        r = q;\n        break;\n      }\n      if (!r) {\n        runs.push({\n          axis: s.axis,\n          dir: s.dir,\n          front: s.front,\n          back: s.back,\n          top: s.top,\n          lo: s.lo,\n          hi: s.hi,\n          segs: [s],\n          joints: [],\n          ends: { lo: \"closed\", hi: \"closed\" }\n        });\n        return;\n      }\n      if (s.lo > r.lo + WT.MIN && s.lo < r.hi + WT.JOIN) r.joints.push((Math.min(s.lo, r.hi) + Math.max(s.lo, r.hi)) / 2);\n      r.hi = Math.max(r.hi, s.hi);\n      r.segs.push(s);\n    });\n    const edge = (r) => r.front + r.dir * (T + W2.front);\n    for (const R4 of runs) for (const P2 of runs) {\n      if (R4.axis !== \"z\" || P2.axis !== \"x\") continue;\n      [\"lo\", \"hi\"].forEach(function(re) {\n        if (Math.abs(R4[re] - P2.front) > WT.CORNER) return;\n        [\"lo\", \"hi\"].forEach(function(pe) {\n          if (Math.abs(P2[pe] - R4.front) > WT.CORNER) return;\n          const sR = re === \"hi\" ? -1 : 1, sP = pe === \"hi\" ? -1 : 1;\n          if (sR !== P2.dir || sP !== R4.dir) return;\n          if (R4.ends[re] !== \"closed\" || P2.ends[pe] !== \"closed\") return;\n          R4[re] = P2.back;\n          R4.ends[re] = \"corner-through\";\n          P2[pe] = edge(R4);\n          P2.ends[pe] = \"corner-butt\";\n        });\n      });\n    }\n    const out = [];\n    runs.forEach(function(r) {\n      const loSeg = r.segs.reduce((m, s) => s.lo < m.lo ? s : m, r.segs[0]), hiSeg = r.segs.reduce((m, s) => s.hi > m.hi ? s : m, r.segs[0]);\n      const over = { lo: 0, hi: 0 };\n      if (r.ends.lo === \"closed\" && endFree(units, loSeg, \"lo\")) {\n        over.lo = W2.side;\n        r.ends.lo = \"free\";\n      }\n      if (r.ends.hi === \"closed\" && endFree(units, hiSeg, \"hi\")) {\n        over.hi = W2.side;\n        r.ends.hi = \"free\";\n      }\n      const ids = [];\n      r.segs.forEach((s) => {\n        if (ids.indexOf(s.unit) < 0) ids.push(s.unit);\n      });\n      out.push(finish({\n        kind: \"run\",\n        axis: r.axis,\n        dir: r.dir,\n        front: r.front,\n        back: r.back,\n        top: r.top,\n        lo: r.lo - over.lo,\n        hi: r.hi + over.hi,\n        depth: Math.abs(edge(r) - r.back),\n        units: ids,\n        joints: r.joints,\n        ends: r.ends,\n        over\n      }, L, W2));\n    });\n    (units || []).forEach(function(u) {\n      if (u.type !== \"island\") return;\n      const f = frontFaces(u)[0];\n      const lo = Math.min(f.from, f.to) - W2.side, hi = Math.max(f.from, f.to) + W2.side;\n      const back = f.at - f.dir * u.d - f.dir * W2.front;\n      out.push(finish({\n        kind: \"island\",\n        axis: f.axis,\n        dir: f.dir,\n        front: f.at,\n        back,\n        top: (u.y || 0) + u.h,\n        lo,\n        hi,\n        depth: u.d + T + 2 * W2.front,\n        units: [u.id],\n        joints: [],\n        ends: { lo: \"free\", hi: \"free\" },\n        over: { lo: W2.side, hi: W2.side }\n      }, L, W2));\n    });\n    out.forEach(function(r, i) {\n      r.id = (r.kind === \"island\" ? \"I\" : \"W\") + (i + 1);\n    });\n    flagWindows(out);\n    return out;\n  }\n  function finish(r, L, W2) {\n    r.line = L.id;\n    r.t = L.t;\n    r.length = Math.round(r.hi - r.lo);\n    r.flags = [];\n    r.edgeFront = r.dir;\n    r.frontEdge = r.kind === \"island\" ? r.front + r.dir * (T + W2.front) : r.front + r.dir * (T + W2.front);\n    const plain2 = L.sizes.filter((s) => !s.bar), bars = L.sizes.filter((s) => s.bar);\n    const depthOk = (s) => s.d >= r.depth - 0.5;\n    let pool = plain2.filter(depthOk), bar = false;\n    if (!pool.length) {\n      pool = bars.filter(depthOk);\n      bar = pool.length > 0;\n    }\n    if (!pool.length) {\n      r.stock = null;\n      r.flags.push(\"needs a \" + Math.round(r.depth) + \" mm deep worktop - \" + L.familyLabel + \" \" + L.decor + \" is supplied at most \" + Math.max(...L.sizes.map((s) => s.d)) + \" mm deep\");\n      r.pieces = [{ from: r.lo, to: r.hi, length: r.length, board: null }];\n      return r;\n    }\n    const dPick = Math.min(...pool.map((s) => s.d)), atDepth = pool.filter((s) => s.d === dPick);\n    const maxL = Math.max(...atDepth.map((s) => s.l));\n    r.stock = { depth: dPick, bar, max: maxL };\n    if (bar) r.flags.push(\"deeper than the standard boards: cut from the \" + dPick + \" mm breakfast-bar board\");\n    r.pieces = splitRun(r.lo, r.hi, maxL, r.joints).map(function(p) {\n      const len = Math.round(p.to - p.from);\n      const fits2 = atDepth.filter((s) => s.l >= len - 0.5).sort((a, b) => a.l - b.l);\n      return { from: p.from, to: p.to, length: len, board: fits2[0] || null };\n    });\n    return r;\n  }\n  function flagWindows(runs) {\n    let zones = [];\n    try {\n      zones = openingZones().filter((z) => z.kind === \"window\");\n    } catch {\n      zones = [];\n    }\n    if (!zones.length) return;\n    runs.forEach(function(r) {\n      const v0 = r.top + LEG_H, v1 = v0 + r.t;\n      worktopBoxes(r).forEach(function(b) {\n        zones.forEach(function(z) {\n          if (v1 <= z.v0 + 1 || v0 >= z.v1 - 1) return;\n          if (b.x1 > z.box.x0 + 0.5 && b.x0 < z.box.x1 - 0.5 && b.z1 > z.box.z0 + 0.5 && b.z0 < z.box.z1 - 0.5) {\n            const msg = \"runs into the window on the \" + (z.op.wall || \"\") + \" wall: the worktop top is \" + Math.round(v1) + \" mm from the floor, the sill \" + Math.round(z.op.y) + \" mm\";\n            if (r.flags.indexOf(msg) < 0) r.flags.push(msg);\n          }\n        });\n      });\n    });\n  }\n  function worktopBoxes(r) {\n    const a0 = Math.min(r.back, r.frontEdge), a1 = Math.max(r.back, r.frontEdge);\n    return r.pieces.map(function(p, k) {\n      return r.axis === \"z\" ? { x0: p.from, x1: p.to, z0: a0, z1: a1, y0: r.top, y1: r.top + r.t, piece: k } : { x0: a0, x1: a1, z0: p.from, z1: p.to, y0: r.top, y1: r.top + r.t, piece: k };\n    });\n  }\n  function worktopParts(units, kitchen) {\n    const W2 = worktopOf(kitchen), L = lineOf(W2.line);\n    const out = [];\n    worktopRuns(units, kitchen).forEach(function(r) {\n      r.pieces.forEach(function(p, k) {\n        out.push({\n          run: r.id,\n          kind: r.kind,\n          piece: k + 1,\n          of: r.pieces.length,\n          name: (r.kind === \"island\" ? \"Island worktop\" : \"Worktop \" + r.id) + (r.pieces.length > 1 ? \" piece \" + (k + 1) : \"\"),\n          decor: L.decor + \" \" + L.tex,\n          line: L.id,\n          lineName: L.name,\n          family: L.familyLabel,\n          t: L.t,\n          finished: { l: p.length, d: Math.round(r.depth), t: L.t },\n          board: p.board ? { sku: p.board.sku, l: p.board.l, d: p.board.d, bar: p.board.bar } : null,\n          price: p.board && p.board.shop ? p.board.shop[0] : null,\n          edges: L.edge + (r.kind === \"island\" ? \"; the back is exposed too (island) - the edging there is the workshop's to specify\" : \"\"),\n          joints: (k > 0 ? [\"joint at its start - type (butt with a jointing strip / mason's mitre) decided by the workshop\"] : []).concat(r.ends.lo === \"corner-butt\" && k === 0 ? [\"corner joint: butts the other run - made by the workshop\"] : []).concat(r.ends.hi === \"corner-butt\" && k === r.pieces.length - 1 ? [\"corner joint: butts the other run - made by the workshop\"] : []),\n          flags: r.flags.slice()\n        });\n      });\n    });\n    return out;\n  }\n\n  // v2/src/model/appliances.js\n  var SRC = \"Bosch UK, read 09.10.2026 (v2/tools/appliances/bosch-2026-10-09.md)\";\n  var APPLIANCES = {\n    oven: {\n      id: \"bosch-hhf113br0b\",\n      brand: \"Bosch\",\n      series: \"Series 2\",\n      model: \"HHF113BR0B\",\n      kind: \"oven\",\n      name: \"Bosch Series 2 HHF113BR0B built-in oven, 60 x 60 cm, stainless steel\",\n      size: { w: 594, h: 595, d: 548 },\n      // appliance H x W x D 595 x 594 x 548\n      body: { w: 560, h: 570 },\n      // behind the front (drawing): 570 high; fits the 560-568 opening\n      front: 20,\n      panel: 115,\n      handle: 50,\n      // front proud 19 (20 metal); control panel 115 high; handle <= 50 proud\n      opening: { h: 600, hTol: 4, w: [560, 568], d: 550, rearGap: 20 },\n      // under a worktop\n      facts: [\n        \"66 l, energy class A\",\n        \"LED display (- clock +), function knob left, temperature knob right (50-275 C), bar handle\",\n        \"cabinets 90 C / neighbouring fronts 70 C; ventilation cut-out in the shelf; never behind a cabinet door\"\n      ],\n      page: \"https://www.bosch-home.co.uk/en/product/cooking/ovens/built-in-ovens/HHF113BR0B\",\n      image: \"https://media3.bsh-group.com/Product_Shots/MCSA02381021_HHF113BR0B_BuiltInOven_Bosch_STP_EVO_def.webp\",\n      drawing: \"https://media3.bsh-group.com/Line_Drawings/MCZ_02488614_1860229_3HB1000B0_en-GB.webp\",\n      src: SRC\n    },\n    hob: {\n      id: \"bosch-pue611bb5b\",\n      brand: \"Bosch\",\n      series: \"Series 4\",\n      model: \"PUE611BB5B\",\n      kind: \"hob\",\n      name: \"Bosch Series 4 PUE611BB5B 60 cm induction hob, frameless black glass\",\n      size: { w: 592, d: 522, below: 51 },\n      // 592 x 522; 51 mm from the glass top to the underside\n      glass: 5,\n      // glass above the worktop: NOT stated by Bosch - drawn 5 mm\n      cutout: { w: 560, d: [490, 500], r: 3, back: 40, side: 50 },\n      minWorktop: 16,\n      zones: 4,\n      facts: [\n        \"induction, 4 zones, TouchSelect controls along the front\",\n        \"only above an oven WITH a cooling fan (HHF113BR0B has one)\",\n        \"30 mm from the worktop top to the top of the oven front; min 5 mm oven to hob (Bosch hob manual p.10)\"\n      ],\n      page: \"https://www.bosch-home.co.uk/en/product/cooking/hobs/induction-hobs/PUE611BB5B\",\n      image: \"https://media3.bsh-group.com/Product_Shots/17814011_PUE611BB5B_STP_def.webp\",\n      drawing: \"https://media3.bsh-group.com/Line_Drawings/MCZ_00757981_402244_EX671LYB1E_en-GB.webp\",\n      src: SRC\n    },\n    hood: {\n      id: \"bosch-dwp64bc50b\",\n      brand: \"Bosch\",\n      series: \"Series 2\",\n      model: \"DWP64BC50B\",\n      kind: \"hood\",\n      name: \"Bosch Series 2 DWP64BC50B 60 cm chimney hood, stainless steel\",\n      size: { w: 600, d: 500, canopy: 246 },\n      total: [799, 975],\n      chimney: { lower: [250, 170], upper: [248, 168] },\n      minAbove: { electric: 550, gas: 650 },\n      roomAbove: { extraction: 380, recirculation: 590 },\n      facts: [\"extraction 365 / recirculation 211 m3/h, 150 mm outlet, energy class D\", \"at least the hob's width, centred over it\"],\n      page: \"https://www.bosch-home.co.uk/en/product/cooking/cooker-hoods/wall-mounted-cooker-hoods/DWP64BC50B\",\n      image: \"https://media3.bsh-group.com/Product_Shots/MCSA02002511_DWP64BC50_ChimneyHood_Bosch_STP_def.webp\",\n      drawing: \"https://media3.bsh-group.com/Line_Drawings/MCZ_01998375_1394506_DWP64BC50_en-GB.webp\",\n      src: SRC\n    }\n  };\n  var OVEN_BASE = { w: 600, h: 720, d: 560, limits: { w: [596, 604], h: [640, 900], d: [550, 650] } };\n  var HOOD_ABOVE = 650;\n  function hoodAbove(u) {\n    const v = u ? Number(u.hoodAbove) : NaN;\n    return Number.isFinite(v) ? v : HOOD_ABOVE;\n  }\n  function hoodDx(u) {\n    const v = u ? Number(u.hoodDx) : NaN;\n    return Number.isFinite(v) ? v : 0;\n  }\n  var HOOD_SRC = \"Bosch manual 9001672689 (060522) REG25\";\n  function hoodHeightRange(u, kitchen, room) {\n    const k = APPLIANCES.hood, L = isOvenBase(u) ? ovenHobLayout(Object.assign({}, u, { hood: true }), kitchen) : null;\n    if (!L) return null;\n    const min = k.minAbove.electric;\n    const ceil = room && room.on !== false && Number(room.height) > 0 ? Number(room.height) - LEG_H - (u.y || 0) : NaN;\n    const max = Number.isFinite(ceil) ? Math.floor(ceil - k.total[0] - L.hob.y1) : null;\n    return { min, max, glass: L.hob.y1 };\n  }\n  function hoodHeightCheck(u, kitchen, room, above) {\n    const k = APPLIANCES.hood, R4 = hoodHeightRange(u, kitchen, room);\n    if (!R4) return \"A hood goes over an oven + hob base\";\n    if (!Number.isFinite(above)) return \"The hood's height must be a number of millimetres\";\n    if (above < R4.min) return HOOD_SRC + \" 13.3: the \" + k.model + \" at least \" + R4.min + \" mm above an induction hob - \" + Math.round(above) + \" mm is too low\";\n    if (R4.max != null && above > R4.max) return HOOD_SRC + \" 13.2: the \" + k.model + \" is at least \" + k.total[0] + \" mm tall from its lower edge - at most \" + R4.max + \" mm above the hob under this ceiling\";\n    return null;\n  }\n  function hoodDxRange(u, kitchen, room, xf, roomWH) {\n    const L = isOvenBase(u) ? ovenHobLayout(Object.assign({}, u, { hood: true, hoodDx: 0 }), kitchen) : null;\n    if (!L || !xf) return null;\n    if (!(room && room.on !== false) || !roomWH || !(roomWH.width > 0) || !(roomWH.depth > 0)) return { min: null, max: null };\n    const H2 = L.hood, o = xf.p([0, 0, 0]), e = xf.p([1, 0, 0]), dir = [e[0] - o[0], e[2] - o[2]];\n    let lo = -Infinity, hi = Infinity;\n    for (const x of [H2.x0, H2.x1]) for (const z of [H2.z0, H2.z1]) {\n      const p = xf.p([x, 0, z]), P2 = [p[0], p[2]], lim = [roomWH.width, roomWH.depth];\n      for (let i = 0; i < 2; i++) {\n        if (Math.abs(dir[i]) < 1e-9) continue;\n        const a = (0 - P2[i]) / dir[i], b = (lim[i] - P2[i]) / dir[i];\n        lo = Math.max(lo, Math.min(a, b));\n        hi = Math.min(hi, Math.max(a, b));\n      }\n    }\n    return { min: Math.ceil(lo), max: Math.floor(hi) };\n  }\n  function hoodNotes(u) {\n    const dx = hoodDx(u), out = [];\n    if (Math.abs(dx) >= 1) out.push(\"Off centre by \" + Math.abs(Math.round(dx)) + \" mm - \" + HOOD_SRC + \" 13.7 advises the middle of the hob \\xABto optimally detect the cooking vapours\\xBB\");\n    return out;\n  }\n  var WT_NONE = 38;\n  function isOvenBase(u) {\n    return !!u && u.type === \"base-oven\";\n  }\n  function ovenFit(u) {\n    const O = APPLIANCES.oven.opening, out = [];\n    if (!isOvenBase(u)) return out;\n    const inW = u.w - 2 * T;\n    if (inW < O.w[0] || inW > O.w[1])\n      out.push(\"The Bosch HHF113BR0B needs an opening \" + O.w[0] + \"-\" + O.w[1] + \" mm wide: this cabinet is \" + inW + \" mm inside (\" + u.w + \" mm) - the oven is never stretched\");\n    if (u.d < O.d) out.push(\"The Bosch HHF113BR0B needs \" + O.d + \" mm depth: this cabinet is \" + u.d + \" mm deep\");\n    if (u.h < O.h + 2 * T) out.push(\"The Bosch HHF113BR0B needs a \" + O.h + \" mm opening under the worktop above its shelf: this cabinet is \" + u.h + \" mm high\");\n    return out;\n  }\n  function ovenShelfY(u) {\n    return u.h - APPLIANCES.oven.opening.h;\n  }\n  function ovenBaseParts(W2, H2, D2) {\n    const p = [], gap = APPLIANCES.oven.opening.rearGap, sy = H2 - APPLIANCES.oven.opening.h;\n    const box3 = (name2, x0, x1, y0, y1, z0, z1, ex, tAxis) => p.push({ name: name2, x0, x1, y0, y1, z0, z1, ex, tAxis, role: \"board\" });\n    box3(\"Side L\", 0, T, 0, H2, 0, D2, [-1, 0, 0], \"x\");\n    box3(\"Side R\", W2 - T, W2, 0, H2, 0, D2, [1, 0, 0], \"x\");\n    box3(\"Base\", T, W2 - T, 0, T, VOID_REAR + T, D2, [0, -1, 0], \"y\");\n    box3(\"Back (below the oven)\", T, W2 - T, T, sy - T, VOID_REAR, VOID_REAR + T, [0, 0, -1], \"z\");\n    box3(\"Oven shelf\", T, W2 - T, sy - T, sy, gap, D2, [0, 0, 1], \"y\");\n    return p;\n  }\n  function ovenPanel(u) {\n    const sy = ovenShelfY(u), rv = 2;\n    return { x0: rv, x1: u.w - rv, y0: 0, y1: sy - T - rv, z0: u.d, z1: u.d + T };\n  }\n  function hobWorktop(kitchen) {\n    const W2 = worktopOf(kitchen), L = W2.on ? lineOf(W2.line) : null;\n    return { on: !!W2.on, t: L ? L.t : WT_NONE };\n  }\n  function ovenHobLayout(u, kitchen) {\n    if (!isOvenBase(u)) return null;\n    const A = APPLIANCES, W2 = u.w, D2 = u.d, H2 = u.h, sy = ovenShelfY(u), cx = W2 / 2;\n    const wt = hobWorktop(kitchen), wtTop = H2 + wt.t;\n    const o = A.oven, oy0 = sy, oy1 = sy + o.size.h;\n    const oven = {\n      front: { x0: cx - o.size.w / 2, x1: cx + o.size.w / 2, y0: oy0, y1: oy1, z0: D2, z1: D2 + o.front },\n      body: { x0: cx - o.body.w / 2, x1: cx + o.body.w / 2, y0: oy0, y1: oy0 + o.body.h, z0: D2 - o.size.d, z1: D2 },\n      panelY: oy1 - o.panel,\n      // control panel: the top 115 mm of the front\n      handle: { x0: cx - 230, x1: cx + 230, y: oy1 - o.panel - 45, z: D2 + o.front + 32 },\n      knobs: [cx - 210, cx + 210],\n      display: { x0: cx - 55, x1: cx + 55 }\n    };\n    const h = A.hob, cd = (h.cutout.d[0] + h.cutout.d[1]) / 2, zc = h.cutout.back + cd / 2;\n    const hob = {\n      x0: cx - h.size.w / 2,\n      x1: cx + h.size.w / 2,\n      z0: zc - h.size.d / 2,\n      z1: zc + h.size.d / 2,\n      y0: wtTop,\n      y1: wtTop + h.glass,\n      under: wtTop + h.glass - h.size.below,\n      zones: [[cx - 140, zc - 105, 105], [cx + 140, zc - 105, 90], [cx - 140, zc + 105, 90], [cx + 140, zc + 105, 105]]\n    };\n    const clearance = Math.round(hob.under - (oy0 + o.body.h)), frontBelowTop = Math.round(wtTop - oy1);\n    let hood = null;\n    if (u.hood) {\n      const k = A.hood, y0 = hob.y1 + hoodAbove(u), hx = cx + hoodDx(u);\n      hood = {\n        x0: hx - k.size.w / 2,\n        x1: hx + k.size.w / 2,\n        z0: 0,\n        z1: k.size.d,\n        y0,\n        y1: y0 + k.size.canopy,\n        chimney: { w: k.chimney.lower[0], d: k.chimney.lower[1], y0: y0 + k.size.canopy, y1: y0 + k.total[0] }\n      };\n    }\n    const checks = [];\n    if (clearance < 5) checks.push(\"hob to oven \" + clearance + \" mm - Bosch asks at least 5 mm (the fitter sets the oven shelf)\");\n    if (frontBelowTop < 30) checks.push(\"oven front top \" + frontBelowTop + \" mm below the worktop top - Bosch asks 30 mm\");\n    if (wt.on && wt.t < A.hob.minWorktop) checks.push(\"worktop \" + wt.t + \" mm - the PUE611BB5B needs at least \" + A.hob.minWorktop + \" mm\");\n    if (!wt.on) checks.push(\"no worktop chosen - the hob is drawn on a notional \" + WT_NONE + \" mm worktop\");\n    return { oven, hob, hood, worktop: wt, clearance, frontBelowTop, checks };\n  }\n  function hoodFit(layout, ceilingY2, hoodWorld, wallBoxes) {\n    const k = APPLIANCES.hood, out = { chimneyTop: null, notes: [], refuse: null };\n    if (!layout || !layout.hood) return out;\n    const H2 = layout.hood, room = ceilingY2 - H2.y0;\n    if (Number.isFinite(room)) {\n      if (room < k.total[0]) out.refuse = \"The Bosch DWP64BC50B needs \" + k.total[0] + \" mm from its canopy to the ceiling (its shortest height): here there are \" + Math.round(room) + \" mm\";\n      else if (room > k.total[1]) {\n        out.chimneyTop = H2.y0 + k.total[1];\n        out.notes.push(\"the chimney stops \" + Math.round(room - k.total[1]) + \" mm below the ceiling (Bosch extension DHZ1224 not included)\");\n      } else out.chimneyTop = ceilingY2;\n    } else out.chimneyTop = H2.y0 + k.total[0];\n    (wallBoxes || []).forEach((b) => {\n      if (hoodWorld && b.box.x0 < hoodWorld.x1 - 1 && b.box.x1 > hoodWorld.x0 + 1 && b.box.z0 < hoodWorld.z1 - 1 && b.box.z1 > hoodWorld.z0 + 1 && b.box.y0 < hoodWorld.y2 - 1 && b.box.y1 > hoodWorld.y0 + 1)\n        out.notes.push(b.name + \" is in the hood's space - move it or take the hood off\");\n    });\n    return out;\n  }\n  function applianceText(units) {\n    const ov = (units || []).filter(isOvenBase);\n    if (!ov.length) return \"\";\n    const hoods = ov.filter((u) => u.hood).length, A = APPLIANCES;\n    return \"Appliances (not in the cut list, quoted separately - not supplied by our cut list): \" + ov.length + \" x \" + A.oven.name + \" and \" + ov.length + \" x \" + A.hob.name + (hoods ? \", \" + hoods + \" x \" + A.hood.name : \"\") + \". Fitting, electrics, ducting and the worktop's hob cut-out (\" + A.hob.cutout.w + \" x \" + A.hob.cutout.d.join(\"-\") + \" mm, Bosch) are not included.\";\n  }\n\n  // v2/src/model/drawer-construction.js\n  var MODEL1 = Object.freeze({\n    name: \"Drawer Box Model 1\",\n    t: T,\n    // 18 - every part\n    strip: 16,\n    // G: side strip under the base groove = groove offset from the side's bottom edge\n    baseTop: 16 + T,\n    // 34 - top face of the base, where front and back stand\n    grooveW: T,\n    // 18 - base groove width (= board)\n    grooveD: 6,\n    // base groove depth into each side\n    shaveW: 16,\n    // runner shave: from the bottom edge, 16 high\n    shaveD: 2,\n    // ... 2 deep on the inside face (strip 18 -> 16)\n    play: 0.5,\n    // housed panel cut 0.5 mm short each side (owner 05.09.2026)\n    cornerInset: 15,\n    // Cabineo seats 15 mm in from each edge of front / back\n    runner: \"H\\xE4fele Matrix Runner UM A (concealed undermount) - preset; shop runner SKU not confirmed\"\n  });\n  var MODEL1_MIN_H = MODEL1.baseTop + 2 * MODEL1.cornerInset;\n  var MODEL1_OPEN = Object.freeze([\n    \"runner model / SKU for the shop and its drilling (H\\xE4fele UM A holes not machined)\",\n    \"box length vs runner length NL (box length still the Lab's carcass depth - 79.5)\",\n    \"runner side clearance (Lab keeps 5 mm a side; UM A sheet: internal drawer width LW - 49)\",\n    \"drawer front fixing / adjuster to the box front\",\n    \"base cut width: preset table W - 36 vs housed W - 25 (drawn housed)\"\n  ]);\n  function model1Panels(b) {\n    const M = MODEL1, t = M.t;\n    const x0 = b.x0, x1 = b.x0 + b.w, y0 = b.y0, y1 = b.y0 + b.h, z0 = b.z0, z1 = b.z0 + b.l;\n    const gy0 = y0 + M.strip, gy1 = y0 + M.baseTop;\n    const out = [];\n    [[x0, 1, \"Side L\"], [x1, -1, \"Side R\"]].forEach(function(s) {\n      const o = s[0], k = s[1];\n      const span2 = function(a, c) {\n        return k > 0 ? [o + a, o + c] : [o - c, o - a];\n      };\n      const up = span2(0, t), gr = span2(0, t - M.grooveD), sh = span2(0, t - M.shaveD);\n      out.push({ name: s[2], role: \"side\", x0: up[0], x1: up[1], y0: gy1, y1, z0, z1 });\n      out.push({ name: s[2], role: \"side-groove\", x0: gr[0], x1: gr[1], y0: gy0, y1: gy1, z0, z1 });\n      out.push({ name: s[2], role: \"side-strip\", x0: sh[0], x1: sh[1], y0, y1: gy0, z0, z1 });\n    });\n    const bx2 = t - M.grooveD + M.play;\n    out.push({ name: \"Base\", role: \"base\", x0: x0 + bx2, x1: x1 - bx2, y0: gy0, y1: gy1, z0, z1 });\n    out.push({ name: \"Front\", role: \"front\", x0: x0 + t, x1: x1 - t, y0: gy1, y1, z0: z1 - t, z1 });\n    out.push({ name: \"Back\", role: \"back\", x0: x0 + t, x1: x1 - t, y0: gy1, y1, z0, z1: z0 + t });\n    return out;\n  }\n  function model1Parts(W2, D2, H2) {\n    const M = MODEL1, t = M.t, panelH = H2 - M.baseTop, inner = W2 - 2 * t;\n    const baseW = inner + 2 * (M.grooveD - M.play);\n    const r = function(v) {\n      return Math.round(v * 10) / 10;\n    };\n    return {\n      ok: panelH >= 2 * M.cornerInset && inner > 0,\n      parts: [\n        {\n          name: \"Drawer side\",\n          L: r(D2),\n          W: r(H2),\n          qty: 2,\n          ops: \"groove \" + M.grooveW + \" x \" + M.grooveD + \" at \" + M.strip + \" (base); shave \" + M.shaveW + \" x \" + M.shaveD + \" at 0, inside (runner); 4 Cabineo females\"\n        },\n        { name: \"Drawer base\", L: r(D2), W: r(baseW), qty: 1, ops: \"housed in the side grooves\" },\n        { name: \"Drawer box front\", L: r(inner), W: r(panelH), qty: 1, ops: \"sits on the base, flush top, no groove; Cabineo males\" },\n        { name: \"Drawer box back\", L: r(inner), W: r(panelH), qty: 1, ops: \"sits on the base, flush top, no groove; Cabineo males\" }\n      ]\n    };\n  }\n  function model1Text(W2, D2, H2) {\n    const p = model1Parts(W2, D2, H2).parts;\n    return \"sides \" + p[0].L + \" x \" + p[0].W + \" x2, base \" + p[1].L + \" x \" + p[1].W + \", front/back \" + p[2].L + \" x \" + p[2].W + \" x2\";\n  }\n\n  // v2/src/model/estimate.js\n  var BOX_MIN_H = MODEL1_MIN_H;\n  var BOX_RUNNER_CLEAR = 10;\n  function storedBoxH(u, i) {\n    const a = u && u.boxH;\n    const v = Array.isArray(a) ? Number(a[i]) : NaN;\n    return v > 0 ? v : null;\n  }\n  function fitBoxH(want, max) {\n    const room = Math.floor(Math.max(0, max) * 10) / 10;\n    return Math.min(Math.round(Math.max(want, BOX_MIN_H) * 10) / 10, room);\n  }\n  function ownFrontH(u) {\n    const a = u && u.dfH;\n    if (!Array.isArray(a)) return null;\n    if (u.type === \"base-drawer\") {\n      const v = Number(a[0]);\n      return v > 0 ? [v] : null;\n    }\n    if (u.type === \"base-4drawer\") {\n      if (a.length !== DRW4.n) return null;\n      const v = a.map(Number);\n      return v.every((x) => x > 0 && isFinite(x)) ? v : null;\n    }\n    return null;\n  }\n  function singleFrontH(u) {\n    const own2 = ownFrontH(u);\n    if (!own2) return DRW.frontH;\n    const top = Math.max(BOX_MIN_H, u.h - DRW.gapTotal - 1);\n    return Math.min(Math.max(own2[0], BOX_MIN_H), top);\n  }\n  function drawerParts(u) {\n    const W2 = u.w, H2 = u.h, D2 = u.d, iw = W2 - 2 * T;\n    const boxOuter = iw - 2 * DRW.sideGap;\n    const boxW = boxOuter - 2 * T;\n    const boxL = D2 - DRW.boxBackSet;\n    const FH = singleFrontH(u);\n    const g2 = golaFace(u);\n    const fy1 = g2 ? H2 - g2.topGap : H2 - 2;\n    let by0 = fy1 - FH + DRW4.boxLift, ceil = H2 - T, crec = null;\n    if (g2) {\n      const j = golaJ(u);\n      if (j && j.ok) ceil = Math.min(ceil, j.y0);\n      crec = golaCRecess(fy1 - FH - g2.cGap / 2, g2.clearance);\n      by0 = Math.max(by0, crec.y1 + BOX_RUNNER_CLEAR);\n    }\n    const boxMax = ceil - by0;\n    const want = storedBoxH(u, 0);\n    const boxH = fitBoxH(want == null ? DRW.boxH : want, boxMax);\n    return {\n      fy1,\n      fy0: fy1 - FH,\n      crec,\n      boxOuter,\n      boxW,\n      boxL,\n      boxH,\n      boxDef: DRW.boxH,\n      boxMax: Math.max(BOX_MIN_H, boxMax),\n      by0,\n      by1: by0 + boxH,\n      frontH: FH,\n      frontW: W2 - 2 * DRW.frontGapSide,\n      // 594 at W=600\n      doorW: W2 - 2 * DRW.doorGapSide,\n      // 596 at W=600\n      doorH: g2 ? fy1 - FH - g2.cGap - DRW4.revealBottom : H2 - FH - DRW.gapTotal,\n      // 518.5 at H=720\n      /* Model 1 base: the box's full length, housed in the side grooves (drawer-construction.js) */\n      bottomW: boxW + 2 * (MODEL1.grooveD - MODEL1.play),\n      bottomL: boxL\n    };\n  }\n  var THIN_MAX = 6;\n  function boardAreaSplit(parts) {\n    let a18 = 0, a3 = 0;\n    for (let i = 0; i < parts.length; i++) {\n      const b = parts[i];\n      if (b.role === \"leg\") continue;\n      if (b.kind === \"fixed-v\" || b.kind === \"fixed-h\" || b.kind === \"shelf\") {\n        const ex = b.x1 - b.x0, ey = b.y1 - b.y0, ez = b.z1 - b.z0;\n        a18 += (b.kind === \"fixed-v\" ? ey * ez : ex * ez) / 1e6;\n        continue;\n      }\n      const d = [b.x1 - b.x0, b.y1 - b.y0, b.z1 - b.z0].sort(function(m, n) {\n        return n - m;\n      });\n      const face2 = d[0] * d[1] / 1e6;\n      if (d[2] <= THIN_MAX) a3 += face2;\n      else a18 += face2;\n    }\n    return { a18, a3, total: a18 + a3 };\n  }\n  function boardAreaM2(parts) {\n    return boardAreaSplit(parts).total;\n  }\n  function drawer4Parts(u) {\n    const W2 = u.w, H2 = u.h, D2 = u.d, iw = W2 - 2 * T;\n    const g2 = golaFace(u), jg = g2 ? golaJ(u) : null;\n    const rTop = g2 ? g2.topGap : DRW4.revealTop, gap = g2 ? g2.cGap : DRW4.gap;\n    const avail = H2 - (rTop + DRW4.revealBottom + (DRW4.n - 1) * gap);\n    const units = DRW4.ratios.reduce(function(a, b) {\n      return a + b;\n    }, 0);\n    const step = avail / units;\n    const boxOuter = iw - 2 * DRW.sideGap;\n    const boxL = D2 - DRW.boxBackSet;\n    const out = [];\n    let y1 = H2 - rTop;\n    const ratios = DRW4.ratios;\n    const own2 = ownFrontH(u);\n    const ownSum = own2 ? own2.reduce(function(a, b) {\n      return a + b;\n    }, 0) : 0;\n    for (let i = 0; i < ratios.length; i++) {\n      const r = ratios[i];\n      const fh = own2 ? own2[i] * (avail / ownSum) : step * r;\n      const fy0 = y1 - fh;\n      let by0 = fy0 + DRW4.boxLift;\n      let ceil = i === 0 ? H2 - T : out[i - 1].by0 - BOX_RUNNER_CLEAR;\n      let cAbove = null, cBelow = null;\n      if (g2) {\n        if (i === 0) {\n          if (jg && jg.ok) ceil = Math.min(ceil, jg.y0);\n        } else {\n          cAbove = golaCRecess(y1 + gap / 2, g2.clearance);\n          ceil = Math.min(ceil, cAbove.y0);\n        }\n        if (i < DRW4.n - 1) {\n          cBelow = golaCRecess(fy0 - gap / 2, g2.clearance);\n          by0 = Math.max(by0, cBelow.y1 + BOX_RUNNER_CLEAR);\n        }\n      }\n      const def = fh * DRW4.boxRatio;\n      const want = storedBoxH(u, i);\n      const bh = want == null ? fitBoxH(def, ceil - by0) : fitBoxH(want, ceil - by0);\n      out.push({\n        boxDef: def,\n        boxMax: Math.max(BOX_MIN_H, ceil - by0),\n        i,\n        name: DRW4.names[i],\n        frontH: fh,\n        fy0,\n        fy1: y1,\n        frontW: W2 - 2 * DRW.frontGapSide,\n        boxOuter,\n        boxW: boxOuter - 2 * T,\n        boxL,\n        boxH: bh,\n        by0,\n        by1: by0 + bh,\n        cBelow,\n        bottomW: boxOuter - 2 * T + 2 * (MODEL1.grooveD - MODEL1.play),\n        bottomL: boxL\n      });\n      y1 = fy0 - gap;\n    }\n    return out;\n  }\n  function buildParts4(W2, H2, D2) {\n    return buildParts(W2, H2, D2).filter(function(b) {\n      return b.name !== \"Shelf\";\n    });\n  }\n  function edgeMetres4(W2, H2) {\n    return (2 * H2 + 2 * (W2 - 2 * T)) / 1e3;\n  }\n  function edgeMetres(W2, H2) {\n    return (2 * H2 + (W2 - 2 * T) + (W2 - 2 * T) + (W2 - 2 * T - 2 * SHELF_SIDE_GAP)) / 1e3;\n  }\n  function boardMat(key) {\n    return materialOf(key == null || key === \"\" ? \"white\" : key);\n  }\n  function withFinishing(e, u) {\n    if (!e || e.quoteOnly || !u) return e;\n    const x = finishingExtras(u);\n    if (!x.a18 && !x.edgeM) return e;\n    let addBoard = 0;\n    const keys2 = Object.keys(x.byMat || {});\n    for (let i = 0; i < keys2.length; i++) {\n      const mat = boardMat(keys2[i]);\n      if (!mat || mat.quoteOnly || mat.perSqmBoardInc == null) return Object.assign({}, e, { incomplete: isPaintKey(keys2[i]) ? \"painted MDF end panel (primed MDF quoted)\" : finishLabel(keys2[i]) });\n      addBoard += x.byMat[keys2[i]] * (mat.perSqmBoardInc + PRICING.perSqmLabourInc);\n    }\n    const addEdge = x.edgeM * PRICING.perEdgeMetreInc;\n    const out = {};\n    for (const k in e) out[k] = e[k];\n    out.inc = e.inc + addBoard + addEdge;\n    out.raw = e.raw + addBoard + addEdge;\n    out.a18 = (e.a18 || 0) + x.a18;\n    out.edgeM = (e.edgeM || 0) + x.edgeM;\n    out.areaM2 = (e.areaM2 || 0) + x.a18;\n    out.finishing = { board: addBoard, edging: addEdge, pieces: x.parts.length };\n    out.parts = {\n      fixed: e.parts.fixed,\n      board: e.parts.board + addBoard,\n      back: e.parts.back,\n      edging: e.parts.edging + addEdge\n    };\n    return out;\n  }\n  function baselineInteriorExtras(u) {\n    if (isCornerShelfUnit(u)) return cornerShelfStockExtras(u);\n    const n = baselineShelves(u);\n    if (!n || !canInterior(u)) return { a18: 0, edgeM: 0 };\n    const stock = interiorParts({\n      w: u.w,\n      h: u.h,\n      d: u.d,\n      type: u.type,\n      family: u.family,\n      finish: u.finish,\n      interior: { shelves: n, vDiv: [], hDiv: [] }\n    });\n    if (!stock.length) return { a18: 0, edgeM: 0 };\n    return {\n      a18: boardAreaSplit(stock).a18,\n      edgeM: stock.reduce(function(t, q) {\n        return t + (q.x1 - q.x0);\n      }, 0) / 1e3\n    };\n  }\n  function withInterior(e, u) {\n    if (!e || e.quoteOnly || !u) return e;\n    let x = interiorExtras(u);\n    const base = baselineInteriorExtras(u);\n    x = {\n      a18: x.a18 - base.a18,\n      edgeM: x.edgeM - base.edgeM,\n      shelves: x.shelves,\n      dividers: x.dividers,\n      parts: x.parts\n    };\n    if (Math.abs(x.a18) < 1e-9 && Math.abs(x.edgeM) < 1e-9) return e;\n    const mat = boardMat(u.finish);\n    if (!mat || mat.quoteOnly) return Object.assign({}, e, { incomplete: finishLabel(u.finish) });\n    const addBoard = x.a18 * (mat.perSqmBoardInc + PRICING.perSqmLabourInc);\n    const addEdge = x.edgeM * PRICING.perEdgeMetreInc;\n    const out = {};\n    for (const k in e) out[k] = e[k];\n    out.inc = e.inc + addBoard + addEdge;\n    out.raw = e.raw + addBoard + addEdge;\n    out.a18 = (e.a18 || 0) + x.a18;\n    out.edgeM = (e.edgeM || 0) + x.edgeM;\n    out.areaM2 = (e.areaM2 || 0) + x.a18;\n    out.interior = { board: addBoard, edging: addEdge, shelves: x.shelves, dividers: x.dividers };\n    out.parts = {\n      fixed: e.parts.fixed,\n      board: e.parts.board + addBoard,\n      back: e.parts.back,\n      edging: e.parts.edging + addEdge\n    };\n    return out;\n  }\n  function estimate(W2, H2, D2, finish3, family, arg2, opts) {\n    const mat = boardMat(finish3);\n    if (!mat || mat.quoteOnly) return { quoteOnly: true, label: mat ? mat.label : finishLabel(finish3) };\n    if (family === \"island\") {\n      const secs = arg2 && arg2.length >= 2 && arg2.length <= 4 ? arg2.map(function(x) {\n        return typeof x === \"string\" ? { w: 600, kind: x } : { w: x.w, kind: x.kind === \"drawers\" ? \"drawers\" : \"doors\" };\n      }) : [{ w: 600, kind: \"drawers\" }, { w: 600, kind: \"doors\" }, { w: 600, kind: \"drawers\" }];\n      const bd = D2 - T;\n      const bays = secs.map(function(sc) {\n        let be = estimate(sc.w, H2, bd, finish3, sc.kind === \"drawers\" ? \"base-4drawer\" : \"base\");\n        if (sc.kind !== \"drawers\" && sc.interior)\n          be = withInterior(be, {\n            w: sc.w,\n            h: H2,\n            d: bd,\n            type: \"base\",\n            family: \"base\",\n            finish: finish3,\n            interior: sc.interior\n          });\n        return be;\n      });\n      if (bays.some(function(b) {\n        return b.quoteOnly;\n      }))\n        return { quoteOnly: true, label: mat.label };\n      const bodyW = secs.reduce(function(t, sc) {\n        return t + sc.w;\n      }, 0) + 2 * T;\n      const o = opts || {};\n      const skin = boardAreaSplit(islandSkinParts({ w: bodyW, h: H2, d: D2, skinDrop: !!o.skinDrop }));\n      const Hs = H2 + (o.skinDrop ? LEG_H : 0);\n      const skinEdgeM = (2 * (Hs + bd) + bodyW + 2 * Hs) / 1e3;\n      const smat = o.skinKey ? boardMat(o.skinKey) : mat;\n      const skinIncomplete = !smat || smat.quoteOnly || smat.perSqmBoardInc == null ? isPaintKey(o.skinKey) ? \"painted MDF island end panels and back (primed MDF quoted)\" : finishLabel(o.skinKey) : null;\n      const skinBoard = skinIncomplete ? 0 : skin.a18 * (smat.perSqmBoardInc + PRICING.perSqmLabourInc);\n      const skinEdge = skinEdgeM * PRICING.perEdgeMetreInc;\n      const sum = function(k) {\n        return bays.reduce(function(t, b) {\n          return t + b[k];\n        }, 0);\n      };\n      const rawI = sum(\"raw\") + skinBoard + skinEdge;\n      const isl = {\n        quoteOnly: false,\n        label: mat.label,\n        family: \"base\",\n        island: true,\n        bays,\n        sections: secs,\n        bodyW,\n        skin: { board: skinBoard, edging: skinEdge, a18: skin.a18, edgeM: skinEdgeM },\n        inc: bays.reduce(function(t, b) {\n          return t + b.inc;\n        }, 0) + skinBoard + skinEdge,\n        raw: rawI,\n        atFloor: bays.some(function(b) {\n          return b.atFloor;\n        }),\n        areaM2: sum(\"areaM2\") + skin.total,\n        a18: sum(\"a18\") + skin.a18,\n        a3: sum(\"a3\"),\n        edgeM: sum(\"edgeM\") + skinEdgeM,\n        parts: {\n          fixed: bays.reduce(function(t, b) {\n            return t + b.parts.fixed;\n          }, 0),\n          board: bays.reduce(function(t, b) {\n            return t + b.parts.board;\n          }, 0) + skinBoard,\n          back: bays.reduce(function(t, b) {\n            return t + b.parts.back;\n          }, 0),\n          edging: bays.reduce(function(t, b) {\n            return t + b.parts.edging;\n          }, 0) + skinEdge\n        }\n      };\n      if (skinIncomplete) isl.incomplete = skinIncomplete;\n      return isl;\n    }\n    if (family === \"tall-pantry\" || family === \"tall-fridge\" || family === \"tall-oven\") {\n      const tu = {\n        type: family,\n        w: W2,\n        h: H2,\n        d: D2,\n        shelves: arg2 != null ? arg2 : TALL.shelves.def\n      };\n      const tparts = tallParts(tu);\n      const TA = boardAreaSplit(tparts);\n      const shelfCount = tparts.filter(function(q) {\n        return /^Shelf|^Deck|^Fixed deck/.test(q.name);\n      }).length;\n      const tEdge = (2 * H2 + 2 * (W2 - 2 * T) + shelfCount * (W2 - 2 * T - 2 * SHELF_SIDE_GAP)) / 1e3;\n      const tBoard = TA.a18 * (mat.perSqmBoardInc + PRICING.perSqmLabourInc);\n      const tBack = TA.a3 * (PRICING.perSqmBack3mmInc + PRICING.perSqmLabourInc);\n      const tEdging = tEdge * PRICING.perEdgeMetreInc;\n      const tRaw = tBoard + tBack + tEdging;\n      return {\n        quoteOnly: false,\n        label: mat.label,\n        family: \"base\",\n        tall: true,\n        provisional: family !== \"tall-pantry\",\n        inc: tRaw,\n        raw: tRaw,\n        atFloor: false,\n        areaM2: TA.total,\n        a18: TA.a18,\n        a3: TA.a3,\n        edgeM: tEdge,\n        shelfCount,\n        parts: { fixed: 0, board: tBoard, back: tBack, edging: tEdging }\n      };\n    }\n    if (family === \"base-oven\") {\n      const op = ovenBaseParts(W2, H2, D2), OA = boardAreaSplit(op);\n      const oEdge = (2 * H2 + 2 * (W2 - 2 * T)) / 1e3;\n      const oBoard = OA.a18 * (mat.perSqmBoardInc + PRICING.perSqmLabourInc);\n      const oEdging = oEdge * PRICING.perEdgeMetreInc;\n      const oRaw = oBoard + oEdging;\n      return {\n        quoteOnly: false,\n        label: mat.label,\n        family: \"base\",\n        provisional: true,\n        inc: oRaw,\n        raw: oRaw,\n        atFloor: false,\n        areaM2: OA.total,\n        a18: OA.a18,\n        a3: OA.a3,\n        edgeM: oEdge,\n        shelfCount: 1,\n        parts: { fixed: 0, board: oBoard, back: 0, edging: oEdging }\n      };\n    }\n    const isLWall = family === \"corner-wall\";\n    const isLTall = family === \"corner-tall\";\n    const isWall2 = family === \"wall\" || isLWall;\n    const is4 = family === \"base-4drawer\";\n    const isL = family === \"corner-l\", isBlind = family === \"corner-blind\";\n    const isCorner = isL || isBlind || isLTall;\n    const parts = isLTall ? cornerLTallParts(W2, arg2 != null ? arg2 : W2, H2, D2) : isLWall ? cornerLWallParts(W2, arg2 != null ? arg2 : W2, H2, D2) : isWall2 ? wallParts(W2, H2, D2) : is4 ? buildParts4(W2, H2, D2) : isL ? cornerLParts(W2, arg2 != null ? arg2 : W2, H2, D2) : isBlind ? cornerBlindParts(W2, H2, D2) : buildParts(W2, H2, D2);\n    const A = boardAreaSplit(parts);\n    const em = is4 ? edgeMetres4(W2, H2) : isL || isLWall || isLTall ? (function() {\n      const A2 = arg2 != null ? arg2 : W2;\n      const moreShelves = isLTall ? (CORNER_TALL_SHELVES - 1) * (W2 - D2 + (A2 - D2)) : 0;\n      return (2 * H2 + 2 * H2 + 2 * (W2 - D2) + (W2 - D2) + 2 * (A2 - D2) + (A2 - D2) + moreShelves) / 1e3;\n    })() : isBlind ? (2 * H2 + (W2 - 2 * T) + (W2 - Math.min(CORNER.blindLen, W2 - 300) - T) + H2) / 1e3 : edgeMetres(W2, H2);\n    const board = A.a18 * (mat.perSqmBoardInc + PRICING.perSqmLabourInc);\n    const back = A.a3 * (PRICING.perSqmBack3mmInc + PRICING.perSqmLabourInc);\n    const edging = em * PRICING.perEdgeMetreInc;\n    const fixed = isWall2 ? PRICING.wallFixedInc : isCorner ? PRICING.cornerFixedInc : PRICING.fixedInc;\n    const raw = fixed + board + back + edging;\n    const floor = isWall2 || isCorner ? 0 : PRICING.floorInc;\n    return {\n      quoteOnly: false,\n      label: mat.label,\n      family: isWall2 ? \"wall\" : isCorner ? \"corner\" : \"base\",\n      inc: Math.max(floor, raw),\n      raw,\n      atFloor: raw < floor,\n      areaM2: A.total,\n      a18: A.a18,\n      a3: A.a3,\n      edgeM: em,\n      parts: { fixed, board, back, edging }\n    };\n  }\n\n  // v2/src/model/own-out.js\n  function ownCount(u) {\n    return !u ? 0 : u.type === \"base-drawer\" ? 1 : u.type === \"base-4drawer\" ? 4 : 0;\n  }\n  function ownOut(u) {\n    const o = /* @__PURE__ */ new Set(), n = ownCount(u);\n    if (n && Array.isArray(u.dOut)) {\n      for (const i of u.dOut) if (Number.isInteger(i) && i >= 0 && i < n) o.add(i);\n    }\n    return o;\n  }\n\n  // v2/src/model/added-drawers.js\n  var XDR = {\n    frontH: Math.round(DRW.frontH),\n    // 194: the lab's drawer front, in whole mm\n    gap: DRW4.gap,\n    // 4 mm between drawer fronts, and between a drawer front and the door\n    lift: DRW4.boxLift,\n    // the box bottom sits 18 mm above its front's bottom (lab)\n    minFront: MODEL1_MIN_H\n    // = BOX_MIN_H (Drawer Box Model 1, model/drawer-construction.js - imports constants only)\n  };\n  function addDrawersWhy(u) {\n    if (!u) return \"Select a cabinet first\";\n    if (u.type === \"tall-fridge\") return \"A fridge / freezer housing is the appliance from top to bottom - there is no free space for a drawer box\";\n    if (u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\") {\n      try {\n        return cornerDrawerWhy(u);\n      } catch {\n        return \"An L-shaped corner has no straight run inside: a drawer box and its runners would run into the corner\";\n      }\n    }\n    if (u.type === \"corner-blind\")\n      return \"A blind corner has no side panel on its blind side to carry a drawer runner - put the drawers in the cabinet beside it\";\n    if (u.type === \"island\")\n      return \"An island's sections are drawers or doors on their own: switch a door section to drawers in the side panel\";\n    return null;\n  }\n  function cornerDrawerWhy(u) {\n    const D2 = u.d, H2 = u.h, LD = cornerLDoors(armA(u), armB(u), H2, D2);\n    const B = interiorBounds(u), depth = Math.round(B ? B.d : D2 - T);\n    const a = Math.round(LD.a.w), b = Math.round(LD.b.w), ix = Math.round(armA(u) - D2);\n    return \"An L corner's arms each have a straight run for a drawer box - arm A \" + a + \" mm wide, arm B \" + b + \" mm wide, \" + depth + \" mm deep - but no side panel at the inner corner (\" + ix + \" mm along arm A) to carry the drawer runner on that side; a drawer here needs a runner support panel at the inner corner, which this cabinet does not have. Put the drawers in the cabinet beside it, or ask us for the support panel\";\n  }\n  function canAddDrawers(u) {\n    return addDrawersWhy(u) === null;\n  }\n  function xdrRecords(u) {\n    return u && Array.isArray(u.xdr) ? u.xdr : [];\n  }\n  function hasAddedDrawers(u) {\n    return xdrRecords(u).length > 0 && canAddDrawers(u);\n  }\n  function xdrOpen(u, n) {\n    return !!(u && Array.isArray(u.xopen) && u.xopen.indexOf(n) >= 0);\n  }\n  function nextDrawerN(u) {\n    let n = u && u.type === \"base-drawer\" ? 1 : u && u.type === \"base-4drawer\" ? 4 : 0;\n    for (const r of xdrRecords(u)) if (r.n > n) n = r.n;\n    return n + 1;\n  }\n  function frameOf(u) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const lo = DRW4.revealBottom;\n    const gf = golaFace(u);\n    const topFree = u.type === \"base-drawer\" && ownOut(u).has(0);\n    const hi = gf ? u.type === \"base-drawer\" && !topFree ? doorRange(u)[1] : u.h - gf.topGap : u.type === \"base-drawer\" && !topFree ? u.h - 2 - drawerParts(u).frontH - XDR.gap : u.h - DRW4.revealTop;\n    let cs = cells(u), nBands = bands(u).length;\n    let shelves = (interiorParts(u) || []).filter((q) => q.kind === \"shelf\");\n    const fronts = [], boxes = [];\n    if (u.type === \"base-4drawer\") {\n      const out = ownOut(u);\n      for (const g2 of drawer4Parts(u)) {\n        if (out.has(g2.i)) continue;\n        fronts.push({ y0: g2.fy0, y1: g2.fy1, name: \"the \" + g2.name.toLowerCase() + \"'s front\" });\n        boxes.push({ x0: (u.w - g2.boxOuter) / 2, x1: (u.w + g2.boxOuter) / 2, y0: g2.by0 - BOX_RUNNER_CLEAR, y1: g2.by1, name: \"the \" + g2.name.toLowerCase() + \"'s box\" });\n      }\n    } else if (u.type === \"tall-oven\") {\n      const nz = ovenNiche(u), w = B.w;\n      cs = [\n        { band: 0, col: 0, x0: 0, x1: w, y0: T, y1: nz.y0 - T, ceil: \"deck under the oven\" },\n        { band: 1, col: 0, x0: 0, x1: w, y0: nz.y1 + T, y1: u.h - T }\n      ];\n      nBands = 2;\n      shelves = tallParts(u).filter((q) => /^Shelf/.test(q.name)).map((q) => ({ ...q, kind: \"shelf\" }));\n      fronts.push({ y0: nz.y0 - T - REVEAL, y1: nz.y1 + REVEAL, name: \"the oven opening\" });\n    }\n    const bz0 = B.z0 + 8;\n    return {\n      u,\n      B,\n      cs,\n      multiBand: nBands > 1,\n      nBands,\n      lo,\n      hi,\n      shelves,\n      fronts,\n      boxes,\n      bz0,\n      boxL: Math.min(u.d - DRW.boxBackSet, u.d - bz0 - 2)\n    };\n  }\n  function cellOf(F, band, col) {\n    for (const c of F.cs) if (c.band === band && c.col === col) return c;\n    return null;\n  }\n  function sectionName(u, c, F) {\n    F = F || frameOf(u);\n    if (!F || !c) return \"the cabinet\";\n    const cols = F.cs.filter((q) => q.band === c.band).length;\n    if (F.cs.length <= 1) return \"the cabinet\";\n    const across = cols <= 1 ? \"\" : cols === 2 ? c.col === 0 ? \"left\" : \"right\" : \"bay \" + (c.col + 1);\n    const level = F.multiBand ? F.nBands === 2 ? c.band === 0 ? \"lower\" : \"upper\" : \"level \" + (c.band + 1) : \"\";\n    return [level, across].filter(Boolean).join(\" \") + \" section\";\n  }\n  function shape(F, rec) {\n    const u = F.u, c = cellOf(F, rec.band, rec.col);\n    if (!c) return { why: \"its section is not there any more\" };\n    const y = Number(rec.y), fh = Number(rec.fh);\n    const by0 = Math.max(y + XDR.lift, c.y0 + BOX_RUNNER_CLEAR);\n    const boxOuter = c.x1 - c.x0 - 2 * DRW.sideGap;\n    const bx0 = F.B.x0 + c.x0 + DRW.sideGap;\n    const g2 = XDR.gap / 2;\n    const fx0 = c.x0 <= 1e-3 ? DRW.frontGapSide : F.B.x0 + c.x0 - T / 2 + g2;\n    const fx1 = c.x1 >= F.B.w - 1e-3 ? u.w - DRW.frontGapSide : F.B.x0 + c.x1 + T / 2 - g2;\n    return { c, y, fh, fy0: y, fy1: y + fh, fx0, fx1, by0, boxOuter, bx0 };\n  }\n  function overlap(a0, a1, b0, b1) {\n    return a0 < b1 - 1e-3 && b0 < a1 - 1e-3;\n  }\n  function fits(F, rec, placed, needH) {\n    const need = needH > BOX_MIN_H ? needH : BOX_MIN_H;\n    const s = shape(F, rec);\n    if (s.why) return { ok: false, why: s.why };\n    if (!(s.fh >= XDR.minFront - 1e-3)) return { ok: false, why: \"a drawer front has to be at least \" + XDR.minFront + \" mm high\" };\n    if (s.fy0 < F.lo - 1e-3) return { ok: false, why: \"the front would go below the bottom of the cabinet\" };\n    if (s.fy1 > F.hi + 1e-3)\n      return { ok: false, why: F.u.type === \"base-drawer\" ? \"the front would run into the top drawer's front\" : \"the front would go above the top of the cabinet\" };\n    for (const q of F.fronts) if (overlap(q.y0 - XDR.gap, q.y1 + XDR.gap, s.fy0, s.fy1))\n      return { ok: false, why: \"its front would overlap \" + q.name, taken: q };\n    if (s.boxOuter <= 2 * T + 1e-3) return { ok: false, why: \"the \" + sectionName(F.u, s.c, F) + \" is too narrow for a drawer box\" };\n    if (s.by0 + need > s.c.y1 + 1e-3)\n      return { ok: false, why: \"there is no room for the box under the \" + (s.c.ceil || (s.c.y1 >= F.B.y1 - 1e-3 ? \"top of the cabinet\" : \"fixed shelf above\")) };\n    const z0 = s.by0 - BOX_RUNNER_CLEAR, z1 = s.by0 + need;\n    for (const q of F.shelves) {\n      if (!overlap(q.x0, q.x1, s.bx0, s.bx0 + s.boxOuter)) continue;\n      if (overlap(q.y0, q.y1, z0, z1))\n        return { ok: false, why: \"a shelf at \" + Math.round(q.y0) + \" mm is in the way - move or remove it in Interior\", shelf: q };\n    }\n    for (const q of F.boxes) if (overlap(q.x0, q.x1, s.bx0, s.bx0 + s.boxOuter) && overlap(q.y0, q.y1, z0, z1))\n      return { ok: false, why: \"its box would hit \" + q.name, taken: q };\n    for (const o of placed) {\n      if (overlap(o.fx0, o.fx1, s.fx0, s.fx1) && overlap(o.fy0 - XDR.gap, o.fy1 + XDR.gap, s.fy0, s.fy1))\n        return { ok: false, why: \"its front would overlap \" + o.name + \"'s front\", other: o };\n      if (o.band === rec.band && o.col === rec.col && overlap(o.by0 - BOX_RUNNER_CLEAR, o.by1, z0, z1))\n        return { ok: false, why: \"its box would hit \" + o.name + \"'s box\", other: o };\n    }\n    return { ok: true, s };\n  }\n  function ceilingOf(F, d, others2) {\n    let top = d.c.y1;\n    for (const q of F.shelves) {\n      if (!overlap(q.x0, q.x1, d.x0, d.x1)) continue;\n      if (q.y0 >= d.by0 - 1e-3 && q.y0 < top) top = q.y0;\n    }\n    for (const q of F.boxes) {\n      if (!overlap(q.x0, q.x1, d.x0, d.x1)) continue;\n      if (q.y0 >= d.by0 - 1e-3 && q.y0 < top) top = q.y0;\n    }\n    for (const o of others2) {\n      if (o === d || o.band !== d.band || o.col !== d.col) continue;\n      const r = o.by0 - BOX_RUNNER_CLEAR;\n      if (r >= d.by0 - 1e-3 && r < top) top = r;\n    }\n    return top;\n  }\n  function wholeMm(b) {\n    b.minMm = Math.ceil(b.min - 1e-6);\n    b.maxMm = Math.max(b.minMm, Math.floor(b.max + 1e-6));\n    b.mm = Math.min(b.maxMm, Math.max(b.minMm, Math.round(b.h)));\n    b.h = b.mm;\n    b.by1 = b.by0 + b.h;\n    return b;\n  }\n  function place(F, rec, k, placed) {\n    const f = fits(F, rec, placed);\n    if (!f.ok) return null;\n    const s = f.s;\n    const d = {\n      k,\n      n: rec.n,\n      name: \"Drawer \" + rec.n,\n      band: rec.band,\n      col: rec.col,\n      c: s.c,\n      y: s.y,\n      fh: s.fh,\n      fy0: s.fy0,\n      fy1: s.fy1,\n      fx0: s.fx0,\n      fx1: s.fx1,\n      by0: s.by0,\n      w: s.boxOuter,\n      l: F.boxL,\n      x0: s.bx0,\n      x1: s.bx0 + s.boxOuter,\n      bz0: F.bz0,\n      def: Math.round(s.fh * DRW4.boxRatio),\n      min: BOX_MIN_H,\n      open: xdrOpen(F.u, rec.n),\n      added: true\n    };\n    d.max = Math.max(BOX_MIN_H, ceilingOf(F, d, placed) - d.by0);\n    const want = Number(rec.bh) > 0 ? Number(rec.bh) : Math.min(d.def, d.max);\n    d.h = Math.min(Math.max(want, BOX_MIN_H), d.max);\n    return wholeMm(d);\n  }\n  function addedDrawers(u) {\n    const recs = xdrRecords(u);\n    if (!recs.length || !canAddDrawers(u)) return [];\n    const F = frameOf(u);\n    if (!F) return [];\n    const placed = [];\n    recs.forEach((rec, k) => {\n      const d = place(F, rec, k, placed);\n      if (d) placed.push(d);\n    });\n    for (const d of placed) {\n      d.max = Math.max(d.h, ceilingOf(F, d, placed) - d.by0);\n      d.maxMm = Math.max(d.minMm, Math.floor(d.max + 1e-6));\n    }\n    return placed;\n  }\n  function addedFronts(u) {\n    if (!u || u.drawerFronts === false) return [];\n    return addedDrawers(u);\n  }\n  function allFreeBands(lo, hi, fr) {\n    let free = [[lo, hi]];\n    for (const f of fr) {\n      const a = f.fy0 - XDR.gap, b = f.fy1 + XDR.gap, next = [];\n      for (const [p, q] of free) {\n        if (a > p) next.push([p, Math.min(q, a)]);\n        if (b < q) next.push([Math.max(p, b), q]);\n      }\n      free = next.filter(([p, q]) => q - p > 0.5);\n    }\n    return free.sort((p, q) => p[0] - q[0]);\n  }\n  function freeBands(lo, hi, fr) {\n    let best = null;\n    for (const [p, q] of allFreeBands(lo, hi, fr)) if (!best || q - p > best[1] - best[0]) best = [p, q];\n    return best;\n  }\n  function isTallType(u) {\n    return u.type === \"tall-pantry\" || u.type === \"tall-oven\" || u.type === \"tall-fridge\";\n  }\n  function doorRange(u) {\n    if (u.type === \"base-drawer\") {\n      const G = drawerParts(u);\n      return [2, 2 + G.doorH];\n    }\n    const gf = golaFace(u);\n    return [REVEAL, u.h - (gf ? gf.topGap : REVEAL)];\n  }\n  function doorBand(u) {\n    if (!u || u.type === \"base-4drawer\" || isTallType(u)) return null;\n    const fr = addedFronts(u);\n    const own2 = Number(u.doorH) > 0 ? Number(u.doorH) : null;\n    if (!fr.length && own2 == null) return null;\n    const [lo, hi] = doorRange(u);\n    const all = allFreeBands(lo, hi, fr);\n    const best = freeBands(lo, hi, fr);\n    if (!best) return { none: true, y0: lo, y1: lo, room: 0, lo, hi, extra: [] };\n    let [y0, y1] = best;\n    const room = y1 - y0;\n    if (own2 != null && own2 < room) {\n      if (Math.abs(y0 - lo) < 0.01 || Math.abs(y1 - hi) > 0.01) y1 = y0 + own2;\n      else y0 = y1 - own2;\n    }\n    const extra = all.filter(([p, q]) => !(p === best[0] && q === best[1]) && q - p >= XDR.minFront - 0.05).map(([p, q]) => ({ y0: p, y1: q }));\n    return {\n      y0,\n      y1,\n      room,\n      lo,\n      hi,\n      own: own2 != null && own2 < room,\n      full: Math.abs(y0 - lo) < 0.01 && Math.abs(y1 - hi) < 0.01,\n      extra\n    };\n  }\n  function doorStrips(u) {\n    const band = doorBand(u);\n    if (!band || band.none || !band.extra || !band.extra.length) return [];\n    return band.extra.slice().sort((p, q) => q.y0 - p.y0).map((b, k) => ({ y0: b.y0, y1: b.y1, name: \"Door strip \" + (k + 1) }));\n  }\n  function tallLeafBands(u, leaves) {\n    const fr = addedFronts(u);\n    if (!fr.length) return leaves;\n    const out = [];\n    for (const lf of leaves) {\n      const best = freeBands(lf.y0, lf.y1, fr);\n      if (!best) continue;\n      out.push({ ...lf, y0: best[0], y1: best[1], short: best[0] !== lf.y0 || best[1] !== lf.y1 });\n      allFreeBands(lf.y0, lf.y1, fr).filter(([p, q]) => !(p === best[0] && q === best[1])).sort((a, b) => b[0] - a[0]).forEach(([p, q], k) => out.push({ ...lf, y0: p, y1: q, short: true, strip: true, name: lf.name + \" strip \" + (k + 1) }));\n    }\n    return out;\n  }\n  function faceSliver(u) {\n    if (!u || u.type === \"base-4drawer\") return 0;\n    const fr = addedFronts(u).length ? addedFronts(u) : addedDrawers(u);\n    if (!fr.length) return 0;\n    const ranges = isTallType(u) ? [[REVEAL, u.h - REVEAL]] : [doorRange(u)];\n    let least = 0;\n    const note = (h) => {\n      const v = Math.max(h, 0.1);\n      if (!least || v < least) least = v;\n    };\n    const g2 = XDR.gap, tooLow = g2 + XDR.minFront - 0.05;\n    for (const [lo, hi] of ranges) {\n      for (const [p, q] of allFreeBands(lo, hi, fr)) if (q - p < XDR.minFront - 0.05) note(q - p);\n      for (const f of fr) {\n        if (f.fy0 < lo - 0.5 || f.fy1 > hi + 0.5) continue;\n        const e0 = f.fy0 - lo, e1 = hi - f.fy1;\n        if (e0 > 0.5 && e0 < tooLow) note(e0 - g2);\n        if (e1 > 0.5 && e1 < tooLow) note(e1 - g2);\n        let below = null;\n        for (const o of fr) if (o !== f && o.fy1 <= f.fy0 + 0.5 && o.fx0 < f.fx1 - 0.5 && f.fx0 < o.fx1 - 0.5 && (!below || o.fy1 > below.fy1)) below = o;\n        if (below) {\n          const gap = f.fy0 - below.fy1;\n          if (gap > g2 + 0.5 && gap < g2 + tooLow) note(gap - 2 * g2);\n        }\n      }\n    }\n    return least;\n  }\n  function setDoorH(u, want) {\n    if (want == null || want === \"\" || want === \"full\") {\n      const had = u.doorH != null;\n      delete u.doorH;\n      return { ok: true, h: null, changed: had };\n    }\n    const v = Math.round(Number(want));\n    if (!(v > 0) || !isFinite(v)) return { ok: false, why: \"Type the door height in mm, or Full\" };\n    const b = doorBand({ ...u, doorH: void 0 }) || { y0: doorRange(u)[0], y1: doorRange(u)[1] };\n    const room = b.none ? 0 : b.y1 - b.y0;\n    if (room <= 0.5) return { ok: false, why: \"The drawer fronts cover the whole face - there is no room for a door\" };\n    if (v >= room - 0.5) {\n      delete u.doorH;\n      return { ok: true, h: null, room: Math.floor(room), clamped: v > room + 0.5 };\n    }\n    u.doorH = v;\n    return { ok: true, h: v, room: Math.floor(room) };\n  }\n  function recIndex(u, n) {\n    const r = xdrRecords(u);\n    for (let i = 0; i < r.length; i++) if (r[i].n === n) return i;\n    return -1;\n  }\n  function drawerByN(u, n) {\n    return addedDrawers(u).find((d) => d.n === n) || null;\n  }\n  function drawerSections(u) {\n    const F = canAddDrawers(u) ? frameOf(u) : null;\n    if (!F) return [];\n    return F.cs.map((c, i) => ({ i, band: c.band, col: c.col, name: sectionName(u, c, F), w: Math.round(c.x1 - c.x0), h: Math.round(c.y1 - c.y0) }));\n  }\n  function drawerFitWhy(u, rec, selfN) {\n    const why = addDrawersWhy(u);\n    if (why) return { ok: false, why };\n    const F = frameOf(u);\n    if (!F) return { ok: false, why: \"This cabinet has no inside to fit a drawer\" };\n    const others2 = addedDrawers(u).filter((d) => d.n !== selfN);\n    const f = fits(F, rec, others2);\n    return f.ok ? { ok: true } : { ok: false, why: f.why };\n  }\n  function scan(u, rec, selfN, from, to, needH) {\n    const F = frameOf(u), others2 = addedDrawers(u).filter((d) => d.n !== selfN);\n    const step = to >= from ? 1 : -1;\n    for (let y = Math.round(from); step > 0 ? y <= to : y >= to; y += step) {\n      if (fits(F, { ...rec, y }, others2, needH).ok) return y;\n    }\n    return null;\n  }\n  function drawerTravel(u, n) {\n    const d = drawerByN(u, n);\n    if (!d) return null;\n    const F = frameOf(u), others2 = addedDrawers(u).filter((o) => o.n !== n);\n    const rec = { n, band: d.band, col: d.col, y: d.y, fh: d.fh };\n    let lo = d.y, hi = d.y;\n    while (lo - 1 >= F.lo - 1e-3 && fits(F, { ...rec, y: lo - 1 }, others2).ok) lo -= 1;\n    while (hi + 1 <= F.hi && fits(F, { ...rec, y: hi + 1 }, others2).ok) hi += 1;\n    return { lo: Math.round(lo), hi: Math.round(hi) };\n  }\n  function addDrawer(u, a) {\n    a = a || {};\n    const why = addDrawersWhy(u);\n    if (why) return { ok: false, why };\n    const F = frameOf(u);\n    if (!F) return { ok: false, why: \"This cabinet has no inside to fit a drawer\" };\n    const placed = addedDrawers(u);\n    const n = nextDrawerN(u);\n    const wanted2 = a.band != null && a.col != null ? [cellOf(F, Number(a.band), Number(a.col))] : F.cs.slice();\n    if (!wanted2[0]) return { ok: false, why: \"That section is not in this cabinet\" };\n    const order = wanted2.slice().sort((p, q) => q.y1 - p.y1 || p.col - q.col);\n    const had = faceSliver(u) > 0;\n    const clean = (rec2, y) => had || !(faceSliver({ ...u, xdr: xdrRecords(u).concat([{ ...rec2, y }]) }) > 0);\n    const scanY = (rec2, from, to, need) => {\n      for (let y = Math.round(from); y >= to; y -= 1) if (fits(F, { ...rec2, y }, placed, need).ok && clean(rec2, y)) return y;\n      for (let y = Math.round(from); y >= to; y -= 1) if (fits(F, { ...rec2, y }, placed, need).ok) return y;\n      return null;\n    };\n    const tryFront = (fh2) => {\n      let lastWhy = null;\n      for (const c2 of order) {\n        const rec2 = { n, band: c2.band, col: c2.col, fh: fh2, bh: null };\n        if (a.y != null) {\n          const f = fits(F, { ...rec2, y: Math.round(Number(a.y)) }, placed);\n          if (f.ok) return { y: Math.round(Number(a.y)), c: c2 };\n          lastWhy = f.why;\n          continue;\n        }\n        const mine = placed.filter((d2) => d2.band === c2.band && d2.col === c2.col);\n        const top = (c2.y1 >= F.B.y1 - 1e-3 ? F.hi : Math.min(F.hi, c2.y1 + T / 2 - XDR.gap / 2)) - fh2;\n        const under = mine.length ? Math.min.apply(null, mine.map((d2) => d2.fy0)) - XDR.gap - fh2 : top;\n        for (const need of [Math.round(fh2 * DRW4.boxRatio), BOX_MIN_H]) {\n          let y = scanY(rec2, Math.min(top, under), F.lo, need);\n          if (y == null && under < top) y = scanY(rec2, top, F.lo, need);\n          if (y != null) return { y, c: c2 };\n        }\n        const probe = fits(F, { ...rec2, y: Math.max(F.lo, Math.min(top, under)) }, placed);\n        lastWhy = probe.ok ? \"there is no room left for another \" + fh2 + \" mm drawer\" : probe.why;\n        if (mine.length && !probe.shelf) lastWhy = \"there is no room left under \" + mine[mine.length - 1].name;\n      }\n      return { why: lastWhy };\n    };\n    const fh0 = Math.round(Number(a.fh) > 0 ? Number(a.fh) : XDR.frontH);\n    let fh = fh0, got = tryFront(fh0);\n    if (got.y == null && a.fh == null && a.y == null) {\n      let best = null;\n      for (const need of [BOX_MIN_H]) for (const c2 of order) {\n        const rec2 = { n, band: c2.band, col: c2.col, bh: null };\n        for (let y = Math.round(F.hi - XDR.minFront); y >= F.lo; y -= 1) {\n          if (!fits(F, { ...rec2, y, fh: XDR.minFront }, placed, need).ok) continue;\n          let lo = XDR.minFront, hi = fh0 - 1;\n          while (lo < hi) {\n            const mid = Math.ceil((lo + hi) / 2);\n            if (fits(F, { ...rec2, y, fh: mid }, placed, need).ok) lo = mid;\n            else hi = mid - 1;\n          }\n          if (!best || lo > best.fh) best = { y, c: c2, fh: lo };\n        }\n      }\n      if (best) {\n        got = { y: best.y, c: best.c };\n        fh = best.fh;\n      }\n    }\n    if (got.y == null) {\n      if (a.y == null && F.fronts.length && !freeBands(F.lo, F.hi, F.fronts.map((q) => ({ fy0: q.y0, fy1: q.y1 }))))\n        return { ok: false, why: \"No room for a drawer: every part of this cabinet's face is already a drawer front - there is no free face for another drawer to open through\" };\n      return { ok: false, why: \"No room for a drawer\" + (wanted2.length === 1 ? \" in \" + inWords(sectionName(u, wanted2[0], F)) : \"\") + \": \" + (got.why || \"it does not fit\") };\n    }\n    const c = got.c, rec = { n, band: c.band, col: c.col, y: got.y, fh, bh: null };\n    if (!Array.isArray(u.xdr)) u.xdr = [];\n    if (u.drawerFronts === void 0 && !u.door && !u.xdr.length && u.type !== \"base-drawer\" && u.type !== \"base-4drawer\") u.drawerFronts = false;\n    const frontless = u.drawerFronts === false;\n    u.xdr = u.xdr.concat([rec]);\n    const d = drawerByN(u, n);\n    return {\n      ok: true,\n      n,\n      name: \"Drawer \" + n,\n      y: got.y,\n      fh,\n      band: c.band,\n      col: c.col,\n      frontless,\n      section: sectionName(u, c, F),\n      box: d ? d.mm : null\n    };\n  }\n  function inWords(name2) {\n    return name2 === \"the cabinet\" ? \"this cabinet\" : \"the \" + name2;\n  }\n  function removeDrawer(u, n) {\n    const i = recIndex(u, n);\n    if (i < 0) return { ok: false, why: \"That drawer is not there any more\" };\n    u.xdr = u.xdr.filter((r) => r.n !== n);\n    if (Array.isArray(u.xopen)) u.xopen = u.xopen.filter((x) => x !== n);\n    if (!u.xdr.length) delete u.xdr;\n    return { ok: true, n };\n  }\n  function sliverWith(u, i, y) {\n    const c = { ...u, xdr: u.xdr.map((r, k) => k === i ? { ...r, y } : r) };\n    const s = faceSliver(c);\n    return s > 0 && !(faceSliver(u) > 0 && s >= faceSliver(u) - 0.05);\n  }\n  function moveDrawer(u, n, want, drag) {\n    const i = recIndex(u, n);\n    if (i < 0) return { ok: false, why: \"That drawer is not there any more\" };\n    const d = drawerByN(u, n);\n    if (!d) return { ok: false, why: \"That drawer does not fit this cabinet as it is now\" };\n    const asked = Number(want);\n    if (!isFinite(asked)) return { ok: false, why: \"Type where the drawer front starts, in mm from the bottom\" };\n    let y;\n    const w = Math.round(asked);\n    if (drag) {\n      const t = drawerTravel(u, n);\n      y = Math.min(Math.max(w, t.lo), t.hi);\n    } else {\n      const rec = { n, band: d.band, col: d.col, fh: d.fh };\n      const clean = (yy) => drawerFitWhy(u, { ...rec, y: yy }, n).ok && !sliverWith(u, i, yy);\n      if (clean(w)) y = w;\n      else {\n        for (let k = 1; k <= Math.ceil(u.h) && y == null; k++) for (const yy of [w - k, w + k]) if (y == null && clean(yy)) y = yy;\n        if (y == null) {\n          const F = frameOf(u);\n          const upY = scan(u, rec, n, w, F.hi), dnY = scan(u, rec, n, w, F.lo);\n          y = upY == null ? dnY : dnY == null ? upY : Math.abs(upY - w) <= Math.abs(dnY - w) ? upY : dnY;\n          if (y == null) y = d.y;\n        }\n      }\n    }\n    const recs = u.xdr.slice();\n    recs[i] = { ...recs[i], y };\n    u.xdr = recs;\n    let why = y !== w ? drawerFitWhy(u, { n, band: d.band, col: d.col, fh: d.fh, y: w }, n).why : null;\n    if (y !== w && !why && sliverWith({ ...u, xdr: recs.map((r, k) => k === i ? { ...r, y: w } : r) }, i, w))\n      why = \"at \" + w + \" mm it would leave a strip lower than the \" + XDR.minFront + \" mm a door or front can be\";\n    return { ok: true, y, asked: w, clamped: y !== w, why };\n  }\n  function setDrawerFrontH(u, n, want) {\n    const i = recIndex(u, n);\n    if (i < 0) return { ok: false, why: \"That drawer is not there any more\" };\n    const d = drawerByN(u, n);\n    if (!d) return { ok: false, why: \"That drawer does not fit this cabinet as it is now\" };\n    const w = Math.round(Number(want));\n    if (!(w > 0)) return { ok: false, why: \"Type the front height in mm\" };\n    const rec = { n, band: d.band, col: d.col, y: d.y };\n    let fh = w;\n    let why = null;\n    if (!drawerFitWhy(u, { ...rec, fh: w }, n).ok) {\n      why = drawerFitWhy(u, { ...rec, fh: w }, n).why;\n      if (w > d.fh) {\n        fh = d.fh;\n        while (fh + 1 <= w && drawerFitWhy(u, { ...rec, fh: fh + 1 }, n).ok) fh += 1;\n      } else {\n        fh = Math.max(XDR.minFront, w);\n        if (!drawerFitWhy(u, { ...rec, fh }, n).ok) fh = d.fh;\n      }\n    }\n    const recs = u.xdr.slice();\n    recs[i] = { ...recs[i], fh };\n    u.xdr = recs;\n    return { ok: true, fh, asked: w, clamped: fh !== w, why: fh !== w ? why : null };\n  }\n  function setAddedBoxH(u, n, want) {\n    const i = recIndex(u, n);\n    if (i < 0) return null;\n    const d = drawerByN(u, n);\n    if (!d) return null;\n    const asked = Number(want);\n    if (!(asked > 0) || !isFinite(asked)) return null;\n    const w = Math.round(asked);\n    const fit = Math.min(Math.max(w, d.minMm), d.maxMm);\n    const recs = u.xdr.slice();\n    recs[i] = { ...recs[i], bh: fit };\n    u.xdr = recs;\n    return { h: fit, asked, max: d.maxMm, min: d.minMm, clamped: fit !== w };\n  }\n  function toggleAddedOpen(u, n) {\n    const list = Array.isArray(u.xopen) ? u.xopen.slice() : [];\n    const at = list.indexOf(n);\n    if (at >= 0) list.splice(at, 1);\n    else list.push(n);\n    u.xopen = list;\n    return at < 0;\n  }\n  function drawerAcross(u, axis, at) {\n    if (!hasAddedDrawers(u)) return null;\n    const B = interiorBounds(u);\n    if (!B) return null;\n    for (const d of addedDrawers(u)) {\n      if (axis === \"x\") {\n        const x = B.x0 + at;\n        if (overlap(x, x + T, d.x0 - DRW.sideGap, d.x1 + DRW.sideGap)) return d;\n      } else {\n        const y = B.y0 + at;\n        if (overlap(y, y + T, d.by0 - BOX_RUNNER_CLEAR, d.by1)) return d;\n      }\n    }\n    return null;\n  }\n  function guardDrawers(u, fn, remap) {\n    if (!hasAddedDrawers(u)) return fn();\n    const keepInterior = JSON.stringify(u.interior === void 0 ? null : u.interior);\n    const keepXdr = JSON.stringify(u.xdr);\n    const before = addedDrawers(u).map((d) => ({ n: d.n, name: d.name, x0: d.x0, x1: d.x1, by0: d.by0, by1: d.by1, band: d.band, col: d.col }));\n    const r = fn();\n    if (!r || r.ok === false) return r;\n    if (remap) remap(r, before);\n    const after = addedDrawers(u);\n    const boards = (interiorParts(u) || []).filter((q) => q.kind === \"fixed-v\" || q.kind === \"fixed-h\");\n    let bad = before.find((b) => !after.some((a) => a.n === b.n)) || null;\n    if (!bad) bad = before.find((b) => boards.some((q) => overlap(q.x0, q.x1, b.x0 - DRW.sideGap, b.x1 + DRW.sideGap) && overlap(q.y0, q.y1, b.by0 - BOX_RUNNER_CLEAR, b.by1))) || null;\n    if (!bad) return r;\n    const was = JSON.parse(keepInterior);\n    if (was === null) delete u.interior;\n    else u.interior = was;\n    u.xdr = JSON.parse(keepXdr);\n    return { ok: false, why: bad.name + \" is in the way - move or remove the drawer first (Drawers)\" };\n  }\n  function remapAfterDivider(u, op, idx, x, before) {\n    if (!Array.isArray(u.xdr)) return;\n    const B = interiorBounds(u);\n    const at = {};\n    for (const b of before || []) at[b.n] = b;\n    u.xdr = u.xdr.map((r) => {\n      let col = r.col;\n      if (op === \"add\") {\n        if (r.col > idx) col = r.col + 1;\n        else if (r.col === idx && B && at[r.n] && (at[r.n].x0 + at[r.n].x1) / 2 - B.x0 > x) col = idx + 1;\n      } else if (op === \"remove\") {\n        if (r.col > idx) col = r.col - 1;\n      }\n      return col === r.col ? r : { ...r, col };\n    });\n  }\n  function remapAfterPartition(u, op, idx, y, before) {\n    if (!Array.isArray(u.xdr)) return;\n    const B = interiorBounds(u);\n    const at = {};\n    for (const b of before || []) at[b.n] = b;\n    u.xdr = u.xdr.map((r) => {\n      let band = r.band;\n      if (op === \"add\") {\n        if (r.band > idx) band = r.band + 1;\n        else if (r.band === idx && B && at[r.n] && at[r.n].by0 - B.y0 > y) band = idx + 1;\n      } else if (op === \"remove\") {\n        if (r.band > idx) band = r.band - 1;\n      }\n      return band === r.band ? r : { ...r, band };\n    });\n  }\n  function addedDrawersText(u) {\n    const list = addedDrawers(u);\n    if (!list.length) return \"\";\n    const fronts = u.drawerFronts !== false;\n    const band = doorBand(u);\n    return list.length + \" added drawer\" + (list.length === 1 ? \"\" : \"s\") + \" (\" + list.map((d) => d.name + \": \" + (fronts ? Math.round(d.fh) + \" mm front from \" + Math.round(d.fy0) + \" mm, \" : \"no front, \") + Math.round(d.w) + \" x \" + Math.round(d.l) + \" x \" + d.mm + \" mm box\").join(\"; \") + \")\" + (!fronts ? \", drawer fronts not fitted\" : \"\") + (u.door && band ? band.none ? \", the drawer fronts cover the whole face (no door)\" : \", door shortened to \" + Math.round(band.y1 - band.y0) + \" mm\" : \"\") + (u.door && fronts ? doorStrips(u).map((q) => \", \" + q.name.toLowerCase() + \" \" + Math.round(q.y1 - q.y0) + \" mm\").join(\"\") : \"\");\n  }\n  function addDrawerAt(u, lx, ly) {\n    const why = addDrawersWhy(u);\n    if (why) return { ok: false, why };\n    const F = frameOf(u);\n    if (!F) return { ok: false, why: \"This cabinet has no inside to fit a drawer\" };\n    const placed = addedDrawers(u), n = nextDrawerN(u), fh = XDR.frontH;\n    const ix = Number(lx) - F.B.x0, iy = Number(ly);\n    const want = Math.round(iy - fh / 2);\n    const dist2 = (c) => (ix < c.x0 ? c.x0 - ix : ix > c.x1 ? ix - c.x1 : 0) + (iy < c.y0 ? c.y0 - iy : iy > c.y1 ? iy - c.y1 : 0);\n    const order = F.cs.slice().sort((p, q) => dist2(p) - dist2(q));\n    const top = Math.round(F.hi), bottom = Math.round(F.lo);\n    for (const c of order) {\n      const rec = { n, band: c.band, col: c.col, fh, bh: null };\n      for (let d = 0; d <= Math.max(top - want, want - bottom); d++) {\n        for (const y of d ? [want - d, want + d] : [want]) {\n          if (y < bottom || y + fh > top + 1e-3) continue;\n          if (fits(F, { ...rec, y }, placed, Math.round(fh * DRW4.boxRatio)).ok && !(faceSliver({ ...u, xdr: xdrRecords(u).concat([{ ...rec, y }]) }) > 0 && !(faceSliver(u) > 0))) {\n            const r2 = addDrawer(u, { band: c.band, col: c.col, y, fh });\n            return r2.ok ? { ...r2, asked: want, dropped: true } : r2;\n          }\n        }\n      }\n    }\n    const r = addDrawer(u, {});\n    return r.ok ? { ...r, asked: want, dropped: true, elsewhere: true } : r;\n  }\n  function previewDrawerAt(u, lx, ly) {\n    if (!u) return { ok: false, why: \"Let go of the drawer over a cabinet\" };\n    const c = JSON.parse(JSON.stringify(u));\n    const r = addDrawerAt(c, lx, ly);\n    if (!r || !r.ok) return { ok: false, why: r && r.why || \"No room for a drawer here\" };\n    const d = drawerByN(c, r.n);\n    if (!d) return { ok: false, why: \"No room for a drawer here\" };\n    const frontless = c.drawerFronts === false;\n    return {\n      ok: true,\n      n: r.n,\n      name: r.name,\n      y: r.y,\n      fh: r.fh,\n      band: r.band,\n      col: r.col,\n      section: r.section,\n      asked: r.asked,\n      elsewhere: !!r.elsewhere,\n      frontless,\n      box: { x0: d.x0, x1: d.x1, y0: d.by0, y1: d.by1, z0: d.bz0, z1: d.bz0 + d.l },\n      front: { x0: d.fx0, x1: d.fx1, y0: d.fy0, y1: d.fy1 }\n    };\n  }\n  function cellAtPoint(F, ix, iy) {\n    let best = null, bestD = Infinity;\n    for (const c of F.cs) {\n      const dx = ix < c.x0 ? c.x0 - ix : ix > c.x1 ? ix - c.x1 : 0, dy = iy < c.y0 ? c.y0 - iy : iy > c.y1 ? iy - c.y1 : 0;\n      const d = dx + dy;\n      if (d < bestD) {\n        bestD = d;\n        best = c;\n      }\n    }\n    return bestD <= T ? best : null;\n  }\n  function relocateDrawer(u, n, lx, ly) {\n    const why0 = addDrawersWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const i = recIndex(u, n);\n    if (i < 0) return { ok: false, why: \"That drawer is not there any more\" };\n    const d = drawerByN(u, n);\n    if (!d) return { ok: false, why: \"That drawer does not fit this cabinet as it is now\" };\n    const F = frameOf(u);\n    if (!F) return { ok: false, why: \"This cabinet has no inside to fit a drawer\" };\n    const ix = Number(lx) - F.B.x0, iy = Number(ly);\n    if (!isFinite(ix) || !isFinite(iy)) return { ok: false, why: \"Carry the drawer over a bay of this cabinet\" };\n    const c = cellAtPoint(F, ix, iy);\n    if (!c) return { ok: false, why: \"Carry the drawer over a bay of this cabinet - not its sides or its legs\" };\n    const others2 = addedDrawers(u).filter((o) => o.n !== n);\n    const rec = { ...u.xdr[i], band: c.band, col: c.col, fh: d.fh, bh: d.mm };\n    const need = d.mm;\n    const want = Math.round(iy - d.fh / 2);\n    const lo = Math.round(F.lo), hi = Math.round(F.hi - d.fh);\n    const okAt = (y2) => fits(F, { ...rec, y: y2 }, others2, need).ok;\n    const clean = (y2) => !(faceSliver({ ...u, xdr: u.xdr.map((r, k) => k === i ? { ...rec, y: y2 } : r) }) > 0) || faceSliver(u) > 0;\n    let y = null, any = null;\n    for (let k = 0; k <= Math.max(hi - want, want - lo) && y == null; k++) {\n      for (const yy of k ? [want - k, want + k] : [want]) {\n        if (yy < lo || yy > hi || !okAt(yy)) continue;\n        if (any == null) any = yy;\n        if (clean(yy)) {\n          y = yy;\n          break;\n        }\n      }\n    }\n    if (y == null) y = any;\n    const from = { band: d.band, col: d.col, y: d.y, section: sectionName(u, d.c, F) };\n    const section = sectionName(u, c, F);\n    if (y == null) {\n      const probe = fits(F, { ...rec, y: Math.max(lo, Math.min(hi, want)) }, others2, need);\n      return { ok: false, why: \"No room for \" + d.name + \" in \" + inWords(section) + \": \" + (probe.ok ? \"its \" + d.fh + \" mm front and \" + d.mm + \" mm box do not fit there\" : probe.why), section, band: c.band, col: c.col, from };\n    }\n    const same = c.band === d.band && c.col === d.col && y === d.y;\n    if (!same) {\n      const recs = u.xdr.slice();\n      recs[i] = { ...rec, bh: u.xdr[i].bh, y };\n      u.xdr = recs;\n    }\n    return { ok: true, n, name: d.name, band: c.band, col: c.col, y, section, from, same, asked: want };\n  }\n  function thereWords(name2) {\n    return name2 === \"the cabinet\" ? \"that cabinet\" : \"the \" + name2 + \" of that cabinet\";\n  }\n  function landIn(v, spec, lx, ly) {\n    if (!v) return { ok: false, why: \"Carry the drawer over a cabinet\" };\n    const why0 = addDrawersWhy(v);\n    if (why0) return { ok: false, why: why0 };\n    const F = frameOf(v);\n    if (!F) return { ok: false, why: \"That cabinet has no inside to fit a drawer\" };\n    const ix = Number(lx) - F.B.x0, iy = Number(ly);\n    if (!isFinite(ix) || !isFinite(iy)) return { ok: false, why: \"Carry the drawer over a bay of that cabinet\" };\n    const c = cellAtPoint(F, ix, iy);\n    if (!c) return { ok: false, why: \"Carry the drawer over a bay of that cabinet - not its sides or its legs\" };\n    const others2 = addedDrawers(v), nv = nextDrawerN(v);\n    const rec = { n: nv, band: c.band, col: c.col, fh: spec.fh, bh: spec.bh == null ? null : spec.bh };\n    const need = spec.mm, want = Math.round(iy - spec.fh / 2);\n    const lo = Math.round(F.lo), hi = Math.round(F.hi - spec.fh);\n    const okAt = (y2) => fits(F, { ...rec, y: y2 }, others2, need).ok;\n    const clean = (y2) => !(faceSliver({ ...v, xdr: xdrRecords(v).concat([{ ...rec, y: y2 }]) }) > 0) || faceSliver(v) > 0;\n    let y = null, any = null;\n    for (let k = 0; k <= Math.max(hi - want, want - lo) && y == null; k++) {\n      for (const yy of k ? [want - k, want + k] : [want]) {\n        if (yy < lo || yy > hi || !okAt(yy)) continue;\n        if (any == null) any = yy;\n        if (clean(yy)) {\n          y = yy;\n          break;\n        }\n      }\n    }\n    if (y == null) y = any;\n    const section = sectionName(v, c, F);\n    if (y == null) {\n      const probe = fits(F, { ...rec, y: Math.max(lo, Math.min(hi, want)) }, others2, need);\n      return { ok: false, why: \"No room for \" + spec.name + \" in \" + thereWords(section) + \": \" + (probe.ok ? \"its \" + spec.fh + \" mm front and \" + spec.mm + \" mm box do not fit there\" : probe.why), section };\n    }\n    return { ok: true, rec, y, c, section, nv, want };\n  }\n  function transferDrawer(u, n, v, lx, ly) {\n    if (!u || !v) return { ok: false, why: \"Carry the drawer over a cabinet\" };\n    if (u === v || u.id === v.id) return relocateDrawer(u, n, lx, ly);\n    {\n      const why0 = addDrawersWhy(v);\n      if (why0) return { ok: false, why: why0 };\n    }\n    const i = recIndex(u, n);\n    if (i < 0) return { ok: false, why: \"That drawer is not there any more\" };\n    const d = drawerByN(u, n);\n    if (!d) return { ok: false, why: \"That drawer does not fit its cabinet as it is now\" };\n    const src = u.xdr[i];\n    const L = landIn(v, { name: d.name, fh: d.fh, mm: d.mm, bh: src.bh == null ? null : src.bh }, lx, ly);\n    const from = { id: u.id, n, name: d.name, section: sectionName(u, d.c, frameOf(u)) };\n    if (!L.ok) return { ...L, from };\n    const { rec, y, c, section, nv, want } = L;\n    const was = { xdr: v.xdr ? v.xdr.slice() : void 0, xopen: v.xopen ? v.xopen.slice() : void 0 };\n    v.xdr = xdrRecords(v).concat([{ ...rec, y }]);\n    const landed = drawerByN(v, nv);\n    if (!landed || Math.abs(landed.fh - d.fh) > 0.5 || Math.abs(landed.mm - d.mm) > 0.5) {\n      if (was.xdr === void 0) delete v.xdr;\n      else v.xdr = was.xdr;\n      return { ok: false, why: \"No room for \" + d.name + \" in \" + thereWords(section) + \" as it is (its front and box would not keep their sizes)\", section, from };\n    }\n    if (xdrOpen(u, n)) v.xopen = (Array.isArray(v.xopen) ? v.xopen : []).concat([nv]);\n    removeDrawer(u, n);\n    return { ok: true, n: nv, name: \"Drawer \" + nv, band: c.band, col: c.col, y, section, from, fh: d.fh, box: landed.mm, asked: want, transfer: true };\n  }\n  function previewTransfer(u, n, v, lx, ly) {\n    if (!u || !v) return { ok: false, why: \"Carry the drawer over a cabinet\" };\n    const cu = JSON.parse(JSON.stringify(u)), cv = JSON.parse(JSON.stringify(v));\n    const r = transferDrawer(cu, n, cv, lx, ly);\n    if (!r.ok) return r;\n    const d = drawerByN(cv, r.n);\n    if (!d) return { ok: false, why: \"No room for the drawer there\" };\n    return {\n      ...r,\n      box: { x0: d.x0, x1: d.x1, y0: d.by0, y1: d.by1, z0: d.bz0, z1: d.bz0 + d.l },\n      front: cv.drawerFronts === false ? null : { x0: d.fx0, x1: d.fx1, y0: d.fy0, y1: d.fy1 }\n    };\n  }\n  function previewRelocate(u, n, lx, ly) {\n    if (!u) return { ok: false, why: \"Carry the drawer over a bay of this cabinet\" };\n    const c = JSON.parse(JSON.stringify(u));\n    const r = relocateDrawer(c, n, lx, ly);\n    if (!r.ok) return r;\n    const d = drawerByN(c, n);\n    if (!d) return { ok: false, why: \"No room for the drawer here\" };\n    return {\n      ...r,\n      box: { x0: d.x0, x1: d.x1, y0: d.by0, y1: d.by1, z0: d.bz0, z1: d.bz0 + d.l },\n      front: c.drawerFronts === false ? null : { x0: d.fx0, x1: d.fx1, y0: d.fy0, y1: d.fy1 }\n    };\n  }\n\n  // v2/src/model/gola-plan.js\n  var TYPE_NAME = {\n    wall: \"wall cabinets\",\n    \"corner-wall\": \"wall cabinets\",\n    \"corner-l\": \"corner cabinets\",\n    \"corner-blind\": \"corner cabinets\",\n    island: \"islands\",\n    \"tall-pantry\": \"tall cabinets\",\n    \"tall-oven\": \"tall cabinets\",\n    \"tall-fridge\": \"tall cabinets\"\n  };\n  function golaWhyNot(u) {\n    if (!u) return \"Select a cabinet first\";\n    if (GOLA_TYPES[u.type]) return null;\n    if (u.family === \"wall\" || u.type === \"corner-wall\")\n      return \"Wall cabinets: the Gola wall profile has no verified installation drawing yet, so it is not machined\";\n    if (/^tall-/.test(u.type)) return \"Tall cabinets need the vertical Gola profiles, which have no verified installation drawing yet\";\n    return \"Gola is not drawn on \" + (TYPE_NAME[u.type] || \"this cabinet\") + \" yet\";\n  }\n  function golaRecesses(u) {\n    const g2 = golaFace(u);\n    if (!g2) return [];\n    const out = [];\n    const j = golaJ(u);\n    if (j && j.ok) out.push({ kind: \"J\", y0: j.y0, y1: j.y1, back: j.back, down: j.down, nominal: j.nominal });\n    if (u.type === \"base-drawer\") {\n      const c = drawerParts(u).crec;\n      if (c) out.push({ kind: \"C\", y0: c.y0, y1: c.y1, yc: c.yc, back: c.back, height: c.height });\n    } else if (u.type === \"base-4drawer\") {\n      drawer4Parts(u).forEach(function(q) {\n        const c = q.cBelow;\n        if (c) out.push({ kind: \"C\", y0: c.y0, y1: c.y1, yc: c.yc, back: c.back, height: c.height });\n      });\n    }\n    return out;\n  }\n  function golaCarcass(u, parts) {\n    const rec = golaRecesses(u);\n    if (!rec.length) return parts;\n    const D2 = u.d;\n    const jb = rec.filter((r) => r.kind === \"J\")[0];\n    return parts.map(function(b) {\n      if ((b.name === \"Side L\" || b.name === \"Side R\") && b.y1 - b.y0 > 1) {\n        return { ...b, notches: rec.map((r) => ({\n          kind: r.kind,\n          y0: Math.max(r.y0, b.y0),\n          y1: Math.min(r.y1, b.y1),\n          z0: D2 - r.back,\n          z1: D2\n        })) };\n      }\n      if (b.name === \"Rail front\" && jb) return { ...b, z0: b.z0 - jb.back, z1: b.z1 - jb.back, golaSetback: jb.back };\n      return b;\n    });\n  }\n  function golaSidePaths(u) {\n    const rec = golaRecesses(u);\n    if (!rec.length) return [];\n    const L = u.h;\n    return [[\"Side L\", \"LH\"], [\"Side R\", \"RH\"]].map(function(sh) {\n      return {\n        side: sh[0],\n        hand: sh[1],\n        length: L,\n        width: u.d,\n        thickness: PLANNER_BASE_BUILD.boardT,\n        paths: rec.map((r) => notchPath({\n          kind: r.kind,\n          L,\n          from: Math.max(0, L - r.y1),\n          len: r.y1 - r.y0,\n          back: r.back,\n          hand: sh[1]\n        }))\n      };\n    });\n  }\n  var HINGE_ARM_CLEAR = 7 + 5;\n  function golaHingeYs(u, y0, y1, inset) {\n    const k = inset == null ? 70 : inset;\n    const a = y0 + Math.min(k, (y1 - y0) / 2), b = y1 - Math.min(k, (y1 - y0) / 2);\n    let ys = b - a > 60 ? [a, b] : [(y0 + y1) / 2];\n    const rec = golaRecesses(u);\n    ys = ys.map(function(y) {\n      for (const r of rec) if (y > r.y0 - HINGE_ARM_CLEAR && y < r.y1 + HINGE_ARM_CLEAR) y = r.y0 - HINGE_ARM_CLEAR;\n      return Math.max(y0 + 20, y);\n    });\n    return ys;\n  }\n  function golaRuns(units) {\n    const segs = { J: [], C: [] };\n    (units || []).forEach(function(u) {\n      const rec = golaRecesses(u);\n      if (!rec.length) return;\n      const xf = unitXf(u);\n      rec.forEach(function(r) {\n        const yy = r.kind === \"J\" ? r.y1 : r.yc;\n        const a = xf.p([0, yy, u.d]), b = xf.p([u.w, yy, u.d]);\n        segs[r.kind].push({ a, b });\n      });\n    });\n    const out = {};\n    for (const k of [\"J\", \"C\"]) {\n      const pieces = mergeSegs(segs[k]).map((s) => Math.round(dist(s.a, s.b)));\n      const bars = golaBars(pieces, GOLA_PROFILES[k].barMm);\n      out[k] = {\n        sku: GOLA_PROFILES[k].sku,\n        name: GOLA_PROFILES[k].name,\n        pieces,\n        runs: pieces.length,\n        total: bars.total,\n        bars: pieces.length ? bars.bars : 0\n      };\n    }\n    return out;\n  }\n  function dist(a, b) {\n    return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);\n  }\n  function near(a, b) {\n    return dist(a, b) < 1.5;\n  }\n  function mergeSegs(list) {\n    const segs = list.map((s) => ({ a: s.a, b: s.b }));\n    let joined = true;\n    while (joined) {\n      joined = false;\n      for (let i = 0; i < segs.length && !joined; i++) for (let j = i + 1; j < segs.length && !joined; j++) {\n        const p = segs[i], q = segs[j];\n        const d1 = [p.b[0] - p.a[0], p.b[1] - p.a[1], p.b[2] - p.a[2]], d2 = [q.b[0] - q.a[0], q.b[1] - q.a[1], q.b[2] - q.a[2]];\n        const l1 = Math.hypot(d1[0], d1[1], d1[2]) || 1, l2 = Math.hypot(d2[0], d2[1], d2[2]) || 1;\n        const par = Math.abs((d1[0] * d2[0] + d1[1] * d2[1] + d1[2] * d2[2]) / (l1 * l2));\n        if (par < 0.9999) continue;\n        const ends = [[p.a, p.b, q.a, q.b], [p.a, p.b, q.b, q.a], [p.b, p.a, q.a, q.b], [p.b, p.a, q.b, q.a]];\n        for (const e of ends) if (near(e[1], e[2])) {\n          segs[i] = { a: e[0], b: e[3] };\n          segs.splice(j, 1);\n          joined = true;\n          break;\n        }\n      }\n    }\n    return segs;\n  }\n  function golaNotes(units) {\n    const notes = [];\n    const skipped = {}, added = [];\n    if (!golaUsed(units)) return notes;\n    (units || []).forEach(function(u, i) {\n      const why = golaWhyNot(u);\n      if (why) skipped[why] = (skipped[why] || 0) + 1;\n      else if (golaFace(u) && hasAddedDrawers(u)) added.push(\"C\" + (i + 1));\n    });\n    for (const k of Object.keys(skipped)) notes.push(k + \" (\" + skipped[k] + \")\");\n    if (added.length) notes.push(\"Drawers added by hand (\" + added.join(\", \") + \") keep a 4 mm reveal - no C profile is fitted at them\");\n    return notes;\n  }\n  function golaUsed(units) {\n    return (units || []).some((u) => !!golaFace(u));\n  }\n  function golaRequested(units, kitchen) {\n    return golaUsed(units) || golaWallOn(kitchen) && golaWallUnits(units).length > 0;\n  }\n  var GOLA_WALL = GOLA_UNVERIFIED.find((p) => p.sku === \"05-79363\");\n  function isGolaWallUnit(u) {\n    return !!u && (u.family === \"wall\" || u.type === \"wall\" || u.type === \"corner-wall\");\n  }\n  function golaWallUnits(units) {\n    return (units || []).map((u, i) => ({ u, n: i + 1 })).filter((x) => isGolaWallUnit(x.u));\n  }\n  function golaWallOn(kitchen) {\n    const g2 = kitchen && kitchen.gola;\n    return !!(g2 && g2.wall === true);\n  }\n  function golaWallText(units, kitchen) {\n    if (!golaWallOn(kitchen)) return \"\";\n    const W2 = golaWallUnits(units);\n    const which = W2.length ? W2.length + \" wall cabinet\" + (W2.length === 1 ? \"\" : \"s\") + \" (\" + W2.map((x) => \"C\" + x.n).join(\", \") + \")\" : \"no wall cabinet in the plan yet\";\n    return \"GOLA ON WALL UNITS - requested: \" + GOLA_WALL.name + \" \" + GOLA_WALL.sku + \" on \" + which + \". We hold no verified installation drawing for this profile, so nothing is notched, drawn or priced for it here: the wall cabinets are cut as shown, and the profile, any notch and the front sizes are to be specified and quoted separately (not production-approved).\";\n  }\n  function golaSpecText(units, kitchen) {\n    const wallLine = golaWallText(units, kitchen);\n    if (!golaUsed(units)) return wallLine;\n    const lines = [];\n    const j0 = (units || []).map((u) => golaJ(u)).filter((j) => j && j.ok)[0];\n    lines.push(\"GOLA HANDLELESS - \" + GOLA_PROFILES.J.name + \" \" + GOLA_PROFILES.J.sku + \" at the top, \" + GOLA_PROFILES.C.name + \" \" + GOLA_PROFILES.C.sku + \" between drawers. The supplier's drawings disagree slightly: J installed schematic (2022) 56.5 down x 27 back vs current section (2026) 56.9 overall; C installed cut-out (2022) 73 x 26 vs current section (2026) 73.5 x 26. Notches are never cut under the current section (J >= 56.9 on this build, C 73.5 + clearance).\");\n    if (j0) lines.push(\"Carcass build: \" + PLANNER_BASE_BUILD.what + \" -> J notch \" + j0.formula + \" = \" + j0.down + \" mm down x \" + j0.back + \" mm back (top thickness not subtracted: the rails sit between the sides). Fitting clearance \" + j0.clearance + \" mm. Notches cut THROUGH (+\" + 0.2 + \" mm overrun); side panels handed LH / RH; tool by the workshop.\");\n    lines.push(\"TO CONFIRM BEFORE CUTTING (quote only, not production-approved): the J drop and its 27 mm setback, and the C height, against the supplier or a sample of the profiles actually supplied - \" + GOLA_PROFILES.J.confirm + \".\");\n    (units || []).forEach(function(u, i) {\n      const sp = golaSidePaths(u);\n      if (!sp.length) return;\n      const rec = golaRecesses(u);\n      const g2 = golaFace(u);\n      lines.push(\"C\" + (i + 1) + \" \" + u.w + \"W \" + u.h + \"H \" + u.d + \"D: \" + rec.map((r) => r.kind === \"J\" ? \"J notch \" + r.down + \" x \" + r.back : \"C notch \" + r.height + \" x \" + r.back + \" centred \" + Math.round(r.yc * 10) / 10 + \" mm above the bottom\").join(\"; \") + \"; front top \" + g2.topGap + \" mm under the carcass top\" + (rec.length > 1 ? \", \" + g2.cGap + \" mm gaps at the C profiles\" : \"\") + \"; front rail set back \" + GOLA_PROFILES.J.back + \" mm.\");\n    });\n    const R4 = golaRuns(units);\n    for (const k of [\"J\", \"C\"]) if (R4[k].runs) lines.push(\"Profile \" + k + \" \" + R4[k].sku + \": \" + R4[k].runs + \" run\" + (R4[k].runs === 1 ? \"\" : \"s\") + \" (\" + R4[k].pieces.join(\" + \") + \" mm) = \" + R4[k].bars + \" x 4.1 m bar\" + (R4[k].bars === 1 ? \"\" : \"s\") + \" - not priced here.\");\n    const notes = golaNotes(units);\n    if (notes.length) lines.push(\"Not handleless here: \" + notes.join(\"; \") + \".\");\n    lines.push(\"Not supplied as machined: \" + GOLA_UNVERIFIED.map((p) => p.name + \" \" + p.sku).join(\", \") + \" (no verified installation drawing).\");\n    if (wallLine) lines.push(wallLine);\n    return lines.join(\"\\n\");\n  }\n\n  // v2/src/model/build-geometry.js\n  var WS = Object.freeze({\n    cl: 0.5,\n    grooveDepth: 8,\n    grooveOffset: 16,\n    rabbet: 10,\n    hdf: 3,\n    voidRear: 50,\n    shelfSetbackOwner: 22,\n    shelfPlayOwner: 1,\n    shelfSetback: 10,\n    shelfPlay: 0.5,\n    railD: 100\n  });\n  var OWNER_BASE = { base: 1, \"base-double\": 1, \"base-drawer\": 1 };\n  function isOwnerBase(u) {\n    return !!u && !!OWNER_BASE[u.type];\n  }\n  function wsAligned(u) {\n    return !!u && (isOwnerBase(u) || u.family === \"wall\" && u.type === \"wall\" || u.type === \"tall-pantry\");\n  }\n  function unitBuild(u) {\n    return normBuild(u && u.build);\n  }\n  function wsBack(u) {\n    if (!wsAligned(u)) return null;\n    const W2 = u.w, H2 = u.h, b = unitBuild(u);\n    let mode = isOwnerBase(u) ? \"inset\" : \"groove\", note = \"\";\n    if (b.back) {\n      if (isOwnerBase(u) && (b.back === \"groove\" || b.back === \"rabbet\")) note = \"A \" + (b.back === \"groove\" ? \"groove\" : \"rebate\") + \" was asked for, but this base has top rails - a full top is needed for it - so the back stays set in (workshop rule).\";\n      else mode = b.back;\n    }\n    const C3 = WS;\n    if (mode === \"groove\") {\n      const a = T - C3.grooveDepth + C3.cl;\n      return { mode, t: C3.hdf, x0: a, x1: W2 - a, y0: a, y1: H2 - a, z0: C3.grooveOffset, z1: C3.grooveOffset + C3.hdf, face: C3.grooveOffset + C3.hdf, cl: C3.cl, note };\n    }\n    if (mode === \"rabbet\") {\n      const a = T - C3.rabbet + C3.cl;\n      return { mode, t: C3.hdf, x0: a, x1: W2 - a, y0: a, y1: H2 - a, z0: 0, z1: C3.hdf, face: C3.hdf, cl: C3.cl, note };\n    }\n    if (mode === \"overlay\") return { mode, t: C3.hdf, x0: 1, x1: W2 - 1, y0: 1, y1: H2 - 1, z0: -C3.hdf, z1: 0, face: 0, cl: C3.cl, note };\n    return { mode: \"inset\", t: T, x0: T, x1: W2 - T, y0: T, y1: H2 - T, z0: C3.voidRear, z1: C3.voidRear + T, face: C3.voidRear + T, cl: isOwnerBase(u) ? 0 : C3.cl, note };\n  }\n  function wsInside(u) {\n    const bk = wsBack(u);\n    if (!bk) return null;\n    const own2 = isOwnerBase(u);\n    return { z0: bk.face + bk.cl, z1: u.d - (own2 ? WS.shelfSetbackOwner : WS.shelfSetback), play: own2 ? WS.shelfPlayOwner : WS.shelfPlay };\n  }\n  function applyBuildGeometry(u, parts) {\n    if (!u || !parts || !parts.length) return parts;\n    const b = unitBuild(u), over = b.carcass === \"over\";\n    const bk = wsBack(u), ins = wsInside(u);\n    if (!bk && !over) return parts;\n    const W2 = u.w, H2 = u.h, D2 = u.d;\n    const HORIZ = /^(Base|Bottom|Top|Rail rear|Rail front)$/;\n    return parts.map(function(q) {\n      const p = { ...q };\n      if (over && /^Side [LR]$/.test(p.name)) {\n        p.y0 = T;\n        p.y1 = H2 - T;\n      }\n      if (over && HORIZ.test(p.name)) {\n        p.x0 = 0;\n        p.x1 = W2;\n      }\n      if (bk) {\n        if (p.name === \"Back\") {\n          p.x0 = bk.x0;\n          p.x1 = bk.x1;\n          p.y0 = bk.y0;\n          p.y1 = bk.y1;\n          p.z0 = bk.z0;\n          p.z1 = bk.z1;\n          p.backMode = bk.mode;\n        }\n        if (isOwnerBase(u)) {\n          const zf = bk.mode === \"inset\" ? bk.face : 0;\n          if (p.name === \"Base\") p.z0 = zf;\n          if (p.name === \"Rail rear\") {\n            p.z0 = zf;\n            p.z1 = zf + WS.railD;\n          }\n        }\n        if (/^Shelf/.test(p.name) && ins && u.type === \"tall-pantry\") {\n          p.x0 = T + ins.play;\n          p.x1 = W2 - T - ins.play;\n          p.z0 = ins.z0;\n          p.z1 = ins.z1;\n        }\n      }\n      return p;\n    });\n  }\n  function buildDiffs(u) {\n    const out = [];\n    if (!u) return out;\n    const b = unitBuild(u);\n    if (u.type === \"base-4drawer\") out.push(\"Four-drawer bank: the workshop converter gives it a grooved 3 mm back, a full top and a bottom to the rear; the Lab draws the owner's base (18 mm back set in 50, two 100 mm rails). Not reconciled - converter (card 1790943069435).\");\n    if (u.type === \"tall-fridge\" || u.type === \"tall-oven\") out.push(\"Appliance tower: the workshop converter does not build this cabinet yet; the Lab's own boards are shown.\");\n    if (u.family === \"corner\" || /^corner/.test(u.type || \"\")) out.push(\"Corner unit: the workshop builds corners its own way; the Lab's boards are shown.\");\n    if (u.type === \"island\") out.push(\"Island: the back choice does not apply to islands; bays are drawn by the Lab.\");\n    if (isOwnerBase(u) && u.interior && ((u.interior.vDiv || []).length || (u.interior.hDiv || []).length))\n      out.push(\"This base has dividers or fixed shelves: the workshop converter falls back to its old construction (grooved back, full top, confirmat) - the Lab still draws the rails.\");\n    const bk = wsBack(u);\n    if (bk && bk.note) out.push(bk.note);\n    if (b.back && !bk) out.push(\"The back choice is not applied to this cabinet type in the Lab drawing.\");\n    out.push(\"Edge banding: the workshop model bands front edges 2 mm; the cut list prices the calculator's edging (as listed).\");\n    return out;\n  }\n  function wsOps(u, name2) {\n    const bk = wsBack(u);\n    if (!bk) return [];\n    const carcass2 = /^(Side [LR]|Bottom|Top)$/.test(name2);\n    if (bk.mode === \"groove\" && carcass2) return [\"Back groove \" + (bk.t + bk.cl) + \" wide x \" + WS.grooveDepth + \" deep, \" + (WS.grooveOffset - bk.cl / 2) + \" mm from the rear edge\"];\n    if (bk.mode === \"rabbet\" && carcass2) return [\"Back rebate \" + WS.rabbet + \" deep x \" + bk.t + \" at the rear edge\"];\n    if (name2 === \"Back\") return [bk.mode === \"inset\" ? \"Set in \" + WS.voidRear + \" mm from the rear (18 mm board)\" : bk.mode === \"overlay\" ? \"Applied on the back of the carcass (3 mm)\" : bk.mode === \"groove\" ? \"In the grooves (3 mm)\" : \"In the rebates (3 mm)\"];\n    return [];\n  }\n\n  // v2/src/model/interior.js\n  var INTERIOR = { maxShelves: 6, minGap: 0, minCompartment: 0, minBand: 0, dividerT: T };\n  function maxShelvesFor(u) {\n    const B = u ? interiorBounds(u) : null;\n    if (!B) return INTERIOR.maxShelves;\n    const holes = B.h - T >= PIN_INSET ? Math.floor((B.h - T - PIN_INSET) / PIN_PITCH) + 1 : 0;\n    return Math.max(INTERIOR.maxShelves, holes);\n  }\n  function baselineShelves(u) {\n    if (!u) return 0;\n    if (u.type === \"tall-pantry\") return tallShelves(u);\n    if (u.type === \"tall-oven\" || u.type === \"tall-fridge\") return 0;\n    if (u.type === \"base-oven\") return 0;\n    if (u.family === \"corner\") return 0;\n    if (u.type === \"base-4drawer\") return 0;\n    return 1;\n  }\n  function interiorOf(u) {\n    let i = u && u.interior || null;\n    const shelves = i && i.shelves != null ? Math.max(0, Math.min(maxShelvesFor(u), Math.round(i.shelves))) : baselineShelves(u);\n    i = i || {};\n    const rawV = i.vDiv || i.dividers || [], rawSbV = Array.isArray(i.vSb) ? i.vSb : [];\n    const pairsV = rawV.map(function(x, k) {\n      return { x, sb: rawSbV[k] == null ? null : rawSbV[k] };\n    }).sort(function(a, c) {\n      return a.x - c.x;\n    });\n    const rawSbH = Array.isArray(i.hSb) ? i.hSb : [];\n    const pairsH = (i.hDiv || []).map(function(y, k) {\n      return { y, sb: rawSbH[k] == null ? null : rawSbH[k] };\n    }).sort(function(a, c) {\n      return a.y - c.y;\n    });\n    let list = pairsV.map(function(p) {\n      return p.x;\n    }), sbV = pairsV.map(function(p) {\n      return p.sb;\n    });\n    let hlist = pairsH.map(function(p) {\n      return p.y;\n    }), sbH = pairsH.map(function(p) {\n      return p.sb;\n    });\n    const B = u ? interiorBounds(u) : null;\n    if (B) {\n      const kept = [], keptSb = [];\n      let at = 0;\n      for (let k = 0; k < list.length; k++) {\n        const x = list[k];\n        const lo = at + INTERIOR.minCompartment;\n        const hi = B.w - INTERIOR.minCompartment - T;\n        if (hi < lo) continue;\n        const v = Math.round(Math.max(lo, Math.min(hi, x)));\n        kept.push(v);\n        keptSb.push(sbV[k]);\n        at = v + T;\n      }\n      list = kept;\n      sbV = keptSb;\n    }\n    if (B) {\n      const kh = [], khSb = [];\n      let atY = 0;\n      for (let k = 0; k < hlist.length; k++) {\n        const y = hlist[k];\n        const lo = atY + INTERIOR.minBand;\n        const hi = B.h - INTERIOR.minBand - T;\n        if (hi < lo) continue;\n        const v = Math.round(Math.max(lo, Math.min(hi, y)));\n        kh.push(v);\n        khSb.push(sbH[k]);\n        atY = v + T;\n      }\n      hlist = kh;\n      sbH = khSb;\n    }\n    return { shelves, dividers: list, vDiv: list, hDiv: hlist, vSb: sbV, hSb: sbH };\n  }\n  function interiorWhy(u) {\n    if (!u) return \"Nothing is selected.\";\n    if (u.type === \"base-4drawer\")\n      return \"A drawer bank is drawers all the way up - there is no cupboard space to shelve.\";\n    if (u.type === \"base-oven\")\n      return \"The oven fills this cabinet: its opening, shelf and ventilation stay as Bosch draws them - no shelves or dividers.\";\n    if (u.type === \"tall-fridge\")\n      return \"An appliance housing is left clear: shelves or dividers would block the appliance and its ventilation.\";\n    if (u.type === \"tall-oven\")\n      return \"The appliance opening stays clear. The cupboards above and below it can be shelved - that is handled by the oven tower itself.\";\n    if (u.family === \"corner\" || String(u.type).indexOf(\"corner\") === 0)\n      return \"A corner cabinet turns a corner, so a straight shelf or divider would run into the corner post or the doors. Corner storage is a separate fitting we would specify by hand.\";\n    if (u.type === \"island\")\n      return \"Choose a DOOR section on the island - each one is shelved on its own. Drawer sections have no cupboard space.\";\n    return null;\n  }\n  function canInterior(u) {\n    return !!u && interiorWhy(u) === null;\n  }\n  function interiorBounds(u) {\n    if (!u) return null;\n    const W2 = u.w, H2 = u.h, D2 = u.d;\n    const x0 = T, x1 = W2 - T;\n    const y0 = T;\n    let y1 = H2 - T;\n    let z0, z1;\n    if (u.family === \"wall\") {\n      z0 = 3;\n      z1 = D2 - 29.5 + 3;\n      y1 = H2 - T;\n    } else {\n      z0 = VOID_REAR + T;\n      z1 = D2 - SHELF_FRONT_SETBACK;\n      y1 = H2 - T - RAIL_D * 0;\n    }\n    const ws = wsInside(u);\n    if (ws) {\n      z0 = ws.z0;\n      z1 = ws.z1;\n    }\n    if (u.type === \"base-drawer\" && !(Array.isArray(u.dOut) && u.dOut.indexOf(0) >= 0)) {\n      const G = drawerParts(u);\n      y1 = H2 - T - G.frontH - 12;\n    }\n    if (u.type === \"base\" || u.type === \"base-drawer\") y1 = Math.min(y1, H2 - T);\n    if (u.family !== \"wall\") {\n      for (const r of golaRecesses(u)) if (r.y0 < y1 && (r.kind === \"J\" || u.type === \"base-drawer\")) y1 = Math.min(y1, r.y0);\n    }\n    return {\n      x0,\n      x1,\n      y0,\n      y1,\n      z0,\n      z1,\n      w: x1 - x0,\n      h: y1 - y0,\n      d: z1 - z0\n    };\n  }\n  function ownsInterior(u) {\n    return canInterior(u);\n  }\n  function stripStockShelves(parts, u) {\n    if (!ownsInterior(u) && !isCornerShelfUnit(u)) return parts;\n    return parts.filter(function(q) {\n      return !/^Shelf/.test(q.name);\n    });\n  }\n  function bands(u) {\n    const B = interiorBounds(u);\n    if (!B) return [];\n    const hs = interiorOf(u).hDiv, out = [];\n    let at = B.y0;\n    for (let i = 0; i < hs.length; i++) {\n      const y = hs[i];\n      out.push({ y0: at, y1: B.y0 + y });\n      at = B.y0 + y + T;\n    }\n    out.push({ y0: at, y1: B.y1 });\n    return out.filter(function(c) {\n      return c.y1 - c.y0 >= 0;\n    });\n  }\n  function cellsAcross(u) {\n    const B = interiorBounds(u);\n    if (!B) return [];\n    const d = interiorOf(u).vDiv, out = [];\n    let at = 0;\n    for (let i = 0; i < d.length; i++) {\n      const x = d[i];\n      out.push({ x0: at, x1: x });\n      at = x + T;\n    }\n    out.push({ x0: at, x1: B.w });\n    return out.filter(function(c) {\n      return c.x1 - c.x0 >= 0;\n    });\n  }\n  function compartments(u) {\n    return cellsAcross(u);\n  }\n  function cells(u) {\n    const out = [];\n    bands(u).forEach(function(bd, bi) {\n      cellsAcross(u).forEach(function(c, ci) {\n        out.push({ band: bi, col: ci, x0: c.x0, x1: c.x1, y0: bd.y0, y1: bd.y1 });\n      });\n    });\n    return out;\n  }\n  function dividerRange(u, list, idx) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const d = (list || interiorOf(u).vDiv).slice();\n    const lo = (idx > 0 ? d[idx - 1] + T : 0) + INTERIOR.minCompartment;\n    const hi = (idx < d.length - 1 ? d[idx + 1] : B.w) - INTERIOR.minCompartment - T;\n    return { min: Math.round(lo), max: Math.round(hi) };\n  }\n  function hDividerRange(u, list, idx) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const d = (list || interiorOf(u).hDiv).slice();\n    const lo = (idx > 0 ? d[idx - 1] + T : 0) + INTERIOR.minBand;\n    const hi = (idx < d.length - 1 ? d[idx + 1] : B.h) - INTERIOR.minBand - T;\n    return { min: Math.round(lo), max: Math.round(hi) };\n  }\n  function canAddDivider(u) {\n    const B = interiorBounds(u);\n    if (!B) return false;\n    return cellsAcross(u).some(function(c) {\n      return c.x1 - c.x0 >= T;\n    });\n  }\n  function canAddHDivider(u) {\n    const B = interiorBounds(u);\n    if (!B) return false;\n    return bands(u).some(function(c) {\n      return c.y1 - c.y0 >= T;\n    });\n  }\n  var DIVIDER_MIN_DEPTH2 = SHELF_MIN_DEPTH;\n  function dividerSetbackLimits(u) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const D2 = u.d, std = Math.round((D2 - B.z1) * 10) / 10;\n    return { D: D2, std, min: std, max: Math.floor(D2 - (B.z0 + DIVIDER_MIN_DEPTH2)) };\n  }\n  function dividerFrontZ(u, B, sb) {\n    if (sb == null) return B.z1;\n    const L = dividerSetbackLimits(u);\n    if (!L) return B.z1;\n    return u.d - Math.max(L.min, Math.min(L.max, sb));\n  }\n  function carrySetbacks(oldList, oldSb, newList) {\n    const o = oldList || [], sb = oldSb || [], n = newList || [];\n    if (o.length === n.length) return n.map(function(x, k) {\n      return sb[k] == null ? null : sb[k];\n    });\n    return n.map(function(x) {\n      for (let k = 0; k < o.length; k++) if (Math.abs(o[k] - x) <= 1) return sb[k] == null ? null : sb[k];\n      return null;\n    });\n  }\n  function interiorParts(u) {\n    if (isCornerShelfUnit(u)) return cornerInteriorParts(u);\n    if (!canInterior(u)) return [];\n    const B = interiorBounds(u);\n    if (!B || B.h <= 0 || B.w <= 0) return [];\n    const I = interiorOf(u), p = [];\n    function box3(n, x0, x1, y0, y1, z0, z1, ex, kind) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: \"board\", kind });\n    }\n    I.hDiv.forEach(function(y, i) {\n      box3(\n        \"Fixed shelf \" + (i + 1),\n        B.x0,\n        B.x1,\n        B.y0 + y,\n        B.y0 + y + T,\n        B.z0,\n        dividerFrontZ(u, B, I.hSb[i]),\n        [0, 1, 0],\n        \"fixed-h\"\n      );\n    });\n    const bnds = bands(u);\n    I.vDiv.forEach(function(x, i) {\n      bnds.forEach(function(bd, bi) {\n        if (bd.y1 - bd.y0 <= 0) return;\n        box3(\n          \"Fixed divider \" + (i + 1) + (bnds.length > 1 ? \".\" + (bi + 1) : \"\"),\n          B.x0 + x,\n          B.x0 + x + T,\n          bd.y0,\n          bd.y1,\n          B.z0,\n          dividerFrontZ(u, B, I.vSb[i]),\n          [0, 0, 1],\n          \"fixed-v\"\n        );\n      });\n    });\n    const multi = cells(u).length > 1;\n    const byCell = {};\n    shelfListOf(u).forEach(function(s) {\n      (byCell[s.cell] = byCell[s.cell] || []).push(s);\n    });\n    cells(u).forEach(function(c) {\n      const key = shelfCellKey(c);\n      const mine = (byCell[key] || []).slice().sort(function(a, b) {\n        return a.y - b.y;\n      });\n      mine.forEach(function(s, idx) {\n        const y = B.y0 + s.y;\n        if (y < c.y0 - 1e-3 || y + T > c.y1 + 1e-3) return;\n        const gap = (wsInside(u) || { play: SHELF_SIDE_GAP }).play;\n        if (c.x1 - c.x0 - 2 * gap <= 0) return;\n        const E = shelfEdgesOf(u, s) || { z0: B.z0, z1: B.z1 };\n        box3(\n          \"Shelf \" + (idx + 1) + (multi ? \" (\" + (c.band + 1) + \".\" + (c.col + 1) + \")\" : \"\"),\n          B.x0 + c.x0 + gap,\n          B.x0 + c.x1 - gap,\n          y,\n          y + T,\n          E.z0,\n          E.z1,\n          [0, 0, 1],\n          \"shelf\"\n        );\n        const q = p[p.length - 1];\n        q.sid = s.id;\n        q.cell = key;\n        if (E.custom) {\n          q.setback = E.setback;\n          q.depth = E.depth;\n        }\n      });\n    });\n    return p;\n  }\n  function interiorCounts(u) {\n    const parts = interiorParts(u), I = interiorOf(u);\n    return {\n      shelvesPerCell: I.shelves,\n      shelfPanels: parts.filter(function(q) {\n        return q.kind === \"shelf\";\n      }).length,\n      fixedH: I.hDiv.length,\n      fixedV: I.vDiv.length,\n      cells: cells(u).length\n    };\n  }\n  function interiorExtras(u) {\n    if (isCornerShelfUnit(u)) {\n      const c = cornerShelfExtras(u);\n      return { a18: c.a18, edgeM: c.edgeM, parts: interiorParts(u) };\n    }\n    const parts = interiorParts(u);\n    if (!parts.length) return { a18: 0, edgeM: 0, parts };\n    const A = boardAreaSplit(parts);\n    const edge = parts.reduce(function(t, q) {\n      return t + (q.kind === \"fixed-v\" ? q.y1 - q.y0 : q.x1 - q.x0);\n    }, 0) / 1e3;\n    return { a18: A.a18, edgeM: edge, parts };\n  }\n  function interiorText(u) {\n    const I = interiorOf(u), C3 = interiorCounts(u), n0 = baselineShelves(u);\n    if (I.shelves === n0 && !I.vDiv.length && !I.hDiv.length) return \"\";\n    const bits = [];\n    if (C3.fixedH)\n      bits.push(C3.fixedH + \" fixed horizontal partition\" + (C3.fixedH === 1 ? \"\" : \"s\") + \" at \" + I.hDiv.map(function(y) {\n        return Math.round(y) + \" mm\";\n      }).join(\", \") + \" above the inside bottom (full width, fixed to the carcass)\");\n    if (C3.fixedV)\n      bits.push(C3.fixedV + \" fixed vertical divider\" + (C3.fixedV === 1 ? \"\" : \"s\") + \" at \" + I.vDiv.map(function(x) {\n        return Math.round(x) + \" mm\";\n      }).join(\", \") + \" from the inside left (fixed to the carcass)\");\n    if (I.shelves)\n      bits.push(I.shelves + (I.shelves === 1 ? \" adjustable shelf\" : \" adjustable shelves\") + \" per compartment on supports\" + (C3.cells > 1 ? \" (\" + C3.shelfPanels + \" shelves in total across \" + C3.cells + \" compartments)\" : \"\") + (n0 ? \", including the \" + n0 + \" already in this cabinet\" : \"\"));\n    else bits.push(\"no adjustable shelves\");\n    bits.push(\"shelf supports and fixings to confirm\");\n    return bits.join(\"; \");\n  }\n  function system32Snap(yFromBottom) {\n    let n = Math.round((yFromBottom - PIN_INSET) / PIN_PITCH);\n    if (n < 0) n = 0;\n    return PIN_INSET + n * PIN_PITCH;\n  }\n  function hDivDragTo(u, idx, wantY) {\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No interior to edit.\" };\n    const I = interiorOf(u);\n    const list = (I.hDiv || []).slice();\n    if (idx < 0 || idx >= list.length)\n      return { ok: false, why: \"That partition is not there any more.\" };\n    const below = idx > 0 ? list[idx - 1] + T : 0;\n    const above = idx < list.length - 1 ? list[idx + 1] : B.h;\n    const min = below + INTERIOR.minBand;\n    const max = above - INTERIOR.minBand - T;\n    if (max < min) return { ok: false, why: \"There is no room to move it.\" };\n    let snapped = system32Snap(clamp4(wantY, min, max));\n    while (snapped > max && snapped - PIN_PITCH >= min) snapped -= PIN_PITCH;\n    while (snapped < min && snapped + PIN_PITCH <= max) snapped += PIN_PITCH;\n    if (snapped < min || snapped > max)\n      return { ok: false, why: \"No shelf hole there would leave a usable compartment.\" };\n    list[idx] = Math.round(snapped);\n    setInterior(u, { shelves: I.shelves, vDiv: I.vDiv, hDiv: list, vSb: I.vSb, hSb: I.hSb });\n    return { ok: true, y: list[idx], min: Math.round(min), max: Math.round(max) };\n  }\n  function vDivDragTo0(u, idx, wantX) {\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No interior to edit.\" };\n    const I = interiorOf(u);\n    const list = (I.vDiv || []).slice();\n    if (idx < 0 || idx >= list.length)\n      return { ok: false, why: \"That divider is not there any more.\" };\n    const left = idx > 0 ? list[idx - 1] + T : 0;\n    const right = idx < list.length - 1 ? list[idx + 1] : B.w;\n    const min = left + INTERIOR.minCompartment;\n    const max = right - INTERIOR.minCompartment - T;\n    if (max < min) return { ok: false, why: \"There is no room to move it.\" };\n    list[idx] = Math.round(clamp4(wantX, min, max));\n    setInterior(u, {\n      shelves: I.shelves,\n      vDiv: list,\n      hDiv: I.hDiv,\n      vSb: I.vSb,\n      hSb: I.hSb,\n      shelfList: u.interior && u.interior.shelfList || null\n    });\n    return { ok: true, x: list[idx], min: Math.round(min), max: Math.round(max) };\n  }\n  function vDivDragTo(u, idx, wantX) {\n    return guardDrawers(u, function() {\n      return vDivDragTo0(u, idx, wantX);\n    });\n  }\n  function islandIntIndex(u) {\n    const L = islandBayList(u);\n    const want = u.intSection != null ? u.intSection : -1;\n    if (want >= 0 && L[want] && L[want].kind !== \"drawers\") return want;\n    for (let i = 0; i < L.length; i++) if (L[i].kind !== \"drawers\") return i;\n    return -1;\n  }\n  function islandIntTarget(u) {\n    const i = islandIntIndex(u);\n    if (i < 0) return null;\n    const L = islandBayList(u), sec = L[i];\n    return {\n      __island: u,\n      __sec: i,\n      id: u.id + \":int\" + i,\n      type: \"base\",\n      family: \"base\",\n      w: sec.w,\n      h: u.h,\n      d: islandBayD(u),\n      finish: u.finish,\n      interior: sec.interior || null\n    };\n  }\n  function interiorTarget(u) {\n    if (!u) return null;\n    return isIsland(u) ? islandIntTarget(u) : u;\n  }\n  function setInterior(u, next) {\n    if (isIsland(u)) {\n      const i = islandIntIndex(u);\n      if (i < 0) return;\n      u.bays = islandBayList(u).map(function(sc, j) {\n        return { w: sc.w, kind: sc.kind, interior: j === i ? next : sc.interior };\n      });\n      islandSync(u);\n    } else {\n      u.interior = next;\n      if (u.type === \"tall-pantry\") u.shelves = clamp4(next.shelves, TALL.shelves.min, TALL.shelves.max);\n    }\n  }\n\n  // v2/src/model/placement.js\n  function placeLCorner(units, u) {\n    const run = units.filter(function(v) {\n      return v.family === \"base\";\n    });\n    if (!run.length) {\n      u.x = 0;\n      u.z = 0;\n      u.rot = 0;\n      return u;\n    }\n    let right = -1e9, host = null;\n    for (let i = 0; i < run.length; i++) {\n      const v = run[i];\n      const f = foot(v);\n      if (f.x1 > right) {\n        right = f.x1;\n        host = v;\n      }\n    }\n    u.rot = 0;\n    if (u.type !== \"corner-tall\") u.d = clamp4(host.d, CORNER.lLimits.d[0], Math.max(CORNER.lLimits.d[0], maxCornerDepth(u)));\n    u.z = host.z;\n    u.x = right;\n    let guard = 0;\n    while (units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    }) && guard++ < 400) u.x += 10;\n    return u;\n  }\n  function placeNew(units, u) {\n    if (u.type === \"corner-l\" || u.type === \"corner-tall\") return placeLCorner(units, u);\n    if (u.family !== \"corner\") u.run = \"main\";\n    const level = units.filter(function(v) {\n      return levelKey(v) === levelKey(u);\n    });\n    if (!level.length) {\n      const bases = units.filter(function(v) {\n        return v.family === \"base\";\n      });\n      u.x = bases.length ? Math.min.apply(null, bases.map(function(v) {\n        return v.x;\n      })) : 0;\n      u.z = 0;\n      return u;\n    }\n    let right = -1e9;\n    for (let i = 0; i < level.length; i++) {\n      const v = level[i];\n      right = Math.max(right, foot(v).x1);\n    }\n    u.x = right;\n    u.z = level[0].z;\n    u.y = level[0].y;\n    let guard = 0;\n    while ((level.some(function(v) {\n      return overlaps(u, v);\n    }) || zonesOf(u).length) && guard++ < 400) u.x += 10;\n    if (behindWall(u, u.x, u.z)) {\n      let leftEdge = 1e9;\n      for (let i = 0; i < level.length; i++) {\n        const v = level[i];\n        leftEdge = Math.min(leftEdge, foot(v).x0);\n      }\n      u.x = (leftEdge < 1e9 ? leftEdge : 0) - u.w;\n      let g2 = 0;\n      while (g2++ < 400 && (level.some(function(v) {\n        return overlaps(u, v);\n      }) || zonesOf(u).length)) u.x -= 10;\n      pushIntoRoom(u);\n    }\n    return u;\n  }\n  function returnRot(rw) {\n    if (rw.axis === \"x\") return rw.dir > 0 ? 1 : 3;\n    return rw.dir > 0 ? 2 : 0;\n  }\n  function onReturnWall(v, rw) {\n    if (v.type === \"corner-l\") return true;\n    if (levelKey(v) !== \"floor\") return false;\n    const f = foot(v);\n    const back = rw.axis === \"x\" ? rw.dir > 0 ? f.x1 : f.x0 : rw.dir > 0 ? f.z1 : f.z0;\n    return Math.abs(back - rw.at) < 40;\n  }\n  function flushToReturn(u, rw) {\n    const f = foot(u);\n    if (rw.axis === \"x\") u.x += rw.at - (rw.dir > 0 ? f.x1 : f.x0);\n    else u.z += rw.at - (rw.dir > 0 ? f.z1 : f.z0);\n  }\n  function runRot(run) {\n    return run === \"return\" && ROOM.ret ? returnRot(ROOM.ret) : 0;\n  }\n  function isCornerUnit(u) {\n    return !!u && (u.family === \"corner\" || String(u.type).indexOf(\"corner\") === 0);\n  }\n  function orientForRun(u, run) {\n    if (u && !isCornerUnit(u)) u.rot = runRot(run);\n  }\n  function flushToRun(u, run) {\n    if (run === \"return\" && ROOM.ret) flushToReturn(u, ROOM.ret);\n    else {\n      const f = foot(u);\n      u.z += ROOM.wallZ - f.z0;\n    }\n  }\n  function runWallDist(u, run) {\n    const f = foot(u);\n    if (run === \"main\") return Math.abs(f.z0 - ROOM.wallZ);\n    if (run === \"return\" && ROOM.ret) {\n      const rw = ROOM.ret;\n      return rw.axis === \"x\" ? Math.abs((rw.dir > 0 ? f.x1 : f.x0) - rw.at) : Math.abs((rw.dir > 0 ? f.z1 : f.z0) - rw.at);\n    }\n    return Infinity;\n  }\n  function pointWallDist(pt, run) {\n    if (run === \"main\") return Math.abs(pt[1] - ROOM.wallZ);\n    if (run === \"return\" && ROOM.ret) {\n      const rw = ROOM.ret;\n      return Math.abs((rw.axis === \"x\" ? pt[0] : pt[1]) - rw.at);\n    }\n    return Infinity;\n  }\n  var RUN_ACQ = { on: 260, off: 520, margin: 120 };\n  function decideAttach(pt, current) {\n    const dm = pointWallDist(pt, \"main\");\n    const dr = ROOM.ret ? pointWallDist(pt, \"return\") : Infinity;\n    const near2 = dm <= dr ? { w: \"main\", d: dm } : { w: \"return\", d: dr };\n    if (!current) return near2.d <= RUN_ACQ.on ? near2.w : null;\n    const cur = pointWallDist(pt, current);\n    if (cur <= RUN_ACQ.off) {\n      const other = current === \"main\" ? \"return\" : \"main\";\n      const od = other === \"return\" && !ROOM.ret ? Infinity : pointWallDist(pt, other);\n      if (od <= RUN_ACQ.on && od < cur - RUN_ACQ.margin) return other;\n      return current;\n    }\n    return near2.d <= RUN_ACQ.on ? near2.w : null;\n  }\n  function wallFlushOf(u) {\n    if (!u || isCornerUnit(u)) return null;\n    if (runWallDist(u, \"main\") < RUN_ACQ.on) return \"main\";\n    if (ROOM.ret && runWallDist(u, \"return\") < RUN_ACQ.on) return \"return\";\n    return null;\n  }\n  function placeAlongWall(units, u, run, pt) {\n    orientForRun(u, run);\n    u.x = 0;\n    u.z = 0;\n    flushToRun(u, run);\n    const runAxis = run === \"return\" && ROOM.ret && ROOM.ret.axis === \"x\" ? \"z\" : run === \"return\" && ROOM.ret ? \"x\" : \"x\";\n    function centreTo(coord) {\n      const f = foot(u), c = runAxis === \"z\" ? (f.z0 + f.z1) / 2 : (f.x0 + f.x1) / 2;\n      if (runAxis === \"z\") u.z += coord - c;\n      else u.x += coord - c;\n    }\n    const target = runAxis === \"z\" ? pt[1] : pt[0];\n    centreTo(target);\n    pushIntoRoom(u);\n    const bad = function() {\n      return behindWall(u, u.x, u.z) || units.some(function(v) {\n        return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n      }) || zonesOf(u).length > 0;\n    };\n    if (!bad()) return true;\n    const step = 10;\n    let best = null, bestGap = Infinity;\n    for (let dir = -1; dir <= 1; dir += 2) {\n      orientForRun(u, run);\n      u.x = 0;\n      u.z = 0;\n      flushToRun(u, run);\n      centreTo(target);\n      for (let i = 0; i < 400; i++) {\n        if (runAxis === \"z\") u.z += dir * step;\n        else u.x += dir * step;\n        pushIntoRoom(u);\n        if (!bad()) {\n          if (i * step < bestGap) {\n            bestGap = i * step;\n            best = { x: u.x, z: u.z };\n          }\n          break;\n        }\n      }\n    }\n    if (best) {\n      u.x = best.x;\n      u.z = best.z;\n      return true;\n    }\n    return false;\n  }\n  function placeReturn(units, u) {\n    const rw = retWall(units);\n    if (!rw) return placeNew(units, u);\n    u.run = \"return\";\n    u.rot = returnRot(rw);\n    u.x = 0;\n    u.z = 0;\n    flushToReturn(u, rw);\n    const runAxis = rw.axis === \"x\" ? \"z\" : \"x\";\n    let farEdge = 0;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v.id === u.id || !onReturnWall(v, rw)) continue;\n      const f = foot(v);\n      farEdge = Math.max(farEdge, runAxis === \"z\" ? f.z1 : f.x1);\n    }\n    const f0 = foot(u);\n    if (runAxis === \"z\") u.z += farEdge - f0.z0;\n    else u.x += farEdge - f0.x0;\n    let guard = 0;\n    while (guard++ < 400 && units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    })) {\n      if (runAxis === \"z\") u.z += 10;\n      else u.x += 10;\n    }\n    pushIntoRoom(u);\n    return u;\n  }\n  function sceneValid(units) {\n    syncRoom(units);\n    for (let i = 0; i < units.length; i++) {\n      if (behindWall(units[i], units[i].x, units[i].z)) return false;\n      for (let j = i + 1; j < units.length; j++)\n        if (sameLevel(units[i], units[j]) && overlaps(units[i], units[j])) return false;\n    }\n    return true;\n  }\n  function atomicRoomOp(units, mutate) {\n    const clashBefore = clashingIds(units);\n    const snap3 = units.map(function(v) {\n      return { u: v, x: v.x, z: v.z, rot: v.rot, w: v.w, w2: v.w2, d: v.d, y: v.y };\n    });\n    const savedRet = ROOM.ret;\n    mutate();\n    syncRoom(units);\n    units.forEach(function(v) {\n      pushIntoRoom(v);\n    });\n    if (sceneValid(units) && !newClash(units, clashBefore)) return true;\n    snap3.forEach(function(s) {\n      s.u.x = s.x;\n      s.u.z = s.z;\n      s.u.rot = s.rot;\n      s.u.w = s.w;\n      s.u.w2 = s.w2;\n      s.u.d = s.d;\n      s.u.y = s.y;\n    });\n    ROOM.ret = savedRet;\n    return false;\n  }\n  function revalidateRoom(units) {\n    syncRoom(units);\n    units.forEach(function(v) {\n      pushIntoRoom(v);\n    });\n    return units;\n  }\n  function unitAlongAxis(u) {\n    return (u.rot || 0) % 2 === 0 ? \"x\" : \"z\";\n  }\n  var ISLAND_GAP = 1e3;\n  function placeIsland(units, u) {\n    u.run = null;\n    u.rot = 0;\n    const others2 = units.filter(function(v) {\n      return v.id !== u.id;\n    });\n    function legalHere() {\n      return !behindWall(u, u.x, u.z) && !others2.some(function(v) {\n        return sameLevel(v, u) && overlaps(u, v);\n      }) && !zonesOf(u).length;\n    }\n    if (!others2.length) {\n      u.x = 0;\n      u.z = MAIN_WALL.at + ISLAND_GAP;\n      pushIntoRoom(u);\n      return legalHere();\n    }\n    const fs2 = others2.map(foot);\n    const minX = Math.min.apply(null, fs2.map(function(q) {\n      return q.x0;\n    }));\n    const maxX = Math.max.apply(null, fs2.map(function(q) {\n      return q.x1;\n    }));\n    const maxZ = Math.max.apply(null, fs2.map(function(q) {\n      return q.z1;\n    }));\n    u.x = (minX + maxX) / 2 - u.w / 2;\n    for (let step = 0; step <= 12; step++) {\n      u.z = maxZ + ISLAND_GAP + step * 100;\n      pushIntoRoom(u);\n      if (legalHere()) return true;\n    }\n    for (let back = 0; back <= 10; back++) {\n      u.z = maxZ + 50 + back * 60;\n      pushIntoRoom(u);\n      if (legalHere()) return true;\n    }\n    return false;\n  }\n  function placeByAnchor(units, u, anchor) {\n    function legal() {\n      return !behindWall(u, u.x, u.z) && !units.some(function(v) {\n        return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n      }) && !zonesOf(u).length;\n    }\n    if (isIsland(u)) return placeIsland(units, u);\n    if (!anchor) {\n      u.run = \"main\";\n      u.rot = 0;\n      u.x = 0;\n      u.z = 0;\n      if (!isCornerUnit(u) && ROOM.ret) flushToRun(u, \"main\");\n      return legal();\n    }\n    if (anchor.type === \"corner-l\") {\n      u.run = \"return\";\n      placeReturn(units, u);\n      return legal();\n    }\n    u.rot = anchor.rot || 0;\n    u.run = anchor.run || null;\n    const axis = unitAlongAxis(anchor), perp = axis === \"x\" ? \"z\" : \"x\";\n    const fa = foot(anchor);\n    function tryside(plus) {\n      u.x = 0;\n      u.z = 0;\n      if (perp === \"x\") u.x += fa.x0 - foot(u).x0;\n      else u.z += fa.z0 - foot(u).z0;\n      if (axis === \"x\") {\n        if (plus) u.x += fa.x1 - foot(u).x0;\n        else u.x += fa.x0 - foot(u).x1;\n      } else {\n        if (plus) u.z += fa.z1 - foot(u).z0;\n        else u.z += fa.z0 - foot(u).z1;\n      }\n      if (u.run && ROOM.ret && !isCornerUnit(u) && runWallDist(anchor, u.run) < 1) flushToRun(u, u.run);\n      return legal();\n    }\n    if (tryside(true)) return true;\n    if (tryside(false)) return true;\n    return false;\n  }\n  function sideDir(u, side) {\n    const k = ((u && u.rot || 0) % 4 + 4) % 4;\n    const r = k === 0 ? [1, 0] : k === 1 ? [0, 1] : k === 2 ? [-1, 0] : [0, -1];\n    const s = side === \"left\" ? -1 : 1;\n    return { dx: r[0] * s, dz: r[1] * s };\n  }\n  function frontDir(u) {\n    const k = ((u && u.rot || 0) % 4 + 4) % 4;\n    return k === 0 ? { dx: 0, dz: 1 } : k === 1 ? { dx: -1, dz: 0 } : k === 2 ? { dx: 0, dz: -1 } : { dx: 1, dz: 0 };\n  }\n  var FRONT_OF_ROT = [[0, 1], [-1, 0], [0, -1], [1, 0]];\n  function cornerArmSides(u) {\n    if (!u || !isLPlan(u)) return null;\n    const B = footBoxes(u);\n    if (B.length < 2) return null;\n    const E = foot(u), out = {};\n    for (let i = 0; i < 2; i++) {\n      const b = B[i], o = B[1 - i], lx = b.x1 - b.x0, lz = b.z1 - b.z0;\n      if (Math.abs(lx - lz) < 1) return null;\n      const along2 = lx > lz ? \"x\" : \"z\";\n      const bc = along2 === \"x\" ? (b.x0 + b.x1) / 2 : (b.z0 + b.z1) / 2, oc = along2 === \"x\" ? (o.x0 + o.x1) / 2 : (o.z0 + o.z1) / 2;\n      const s = bc >= oc ? 1 : -1;\n      const d = along2 === \"x\" ? { dx: s, dz: 0 } : { dx: 0, dz: s };\n      const n = along2 === \"x\" ? Math.abs(b.z0 - E.z0) < 1 ? { dx: 0, dz: 1 } : { dx: 0, dz: -1 } : Math.abs(b.x0 - E.x0) < 1 ? { dx: 1, dz: 0 } : { dx: -1, dz: 0 };\n      const right = { dx: n.dz, dz: -n.dx };\n      const side = d.dx === right.dx && d.dz === right.dz ? \"right\" : \"left\";\n      const rot = FRONT_OF_ROT.findIndex((f) => f[0] === n.dx && f[1] === n.dz);\n      if (out[side] || rot < 0) return null;\n      out[side] = { box: b, n, d, rot, arm: i === 0 ? \"A\" : \"B\" };\n    }\n    return out.left && out.right ? out : null;\n  }\n  function besideSide(u, side) {\n    const arms = cornerArmSides(u);\n    if (arms) {\n      const a = arms[side];\n      return a ? { box: a.box, n: a.n, d: a.d, rot: a.rot } : null;\n    }\n    return { box: foot(u), n: besideFrame(u).n, d: besideDir(u, side), rot: u.rot || 0 };\n  }\n  function cornerPlusTile(u) {\n    return u && (u.type === \"corner-wall\" || u.family === \"wall\") ? \"wall\" : \"base\";\n  }\n  function quickAddable(u) {\n    return !!u && (!isCornerUnit(u) || !!cornerArmSides(u));\n  }\n  function besideFrame(u) {\n    const fd = frontDir(u), f = foot(u), T3 = 1;\n    let best = null;\n    for (const w of roomWalls()) {\n      const out = w.axis === \"z\" ? { dx: 0, dz: w.dir } : { dx: w.dir, dz: 0 };\n      const face2 = w.axis === \"z\" ? w.dir > 0 ? f.z1 : f.z0 : w.dir > 0 ? f.x1 : f.x0;\n      if (Math.abs(face2 - w.at) > T3) continue;\n      if (!alongWall(f, w)) continue;\n      const rank = out.dx === -fd.dx && out.dz === -fd.dz ? 0 : out.dx === fd.dx && out.dz === fd.dz ? 1 : 2;\n      if (!best || rank < best.rank) best = { rank, out, wall: w.id || null };\n    }\n    if (!best) {\n      const r = sideDir(u, \"right\");\n      return { n: fd, right: r, wall: null, own: true };\n    }\n    const n = { dx: -best.out.dx, dz: -best.out.dz };\n    const right = { dx: -best.out.dz, dz: best.out.dx };\n    return { n, right, wall: best.wall, own: false };\n  }\n  function besideDir(u, side) {\n    const r = besideFrame(u).right;\n    return side === \"left\" ? { dx: -r.dx, dz: -r.dz } : { dx: r.dx, dz: r.dz };\n  }\n  function placeBeside(units, u, anchor, side) {\n    if (!quickAddable(anchor) || side !== \"left\" && side !== \"right\") return false;\n    function legal() {\n      return !behindWall(u, u.x, u.z) && !units.some(function(v) {\n        return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n      }) && !zonesOf(u).length;\n    }\n    const S2 = besideSide(anchor, side);\n    if (!S2) return false;\n    const arm = !!cornerArmSides(anchor);\n    u.rot = S2.rot;\n    u.run = isIsland(anchor) ? null : arm ? null : anchor.run || null;\n    const d = S2.d, n = S2.n;\n    const fa = S2.box;\n    u.x = 0;\n    u.z = 0;\n    if (n.dz > 0) u.z += fa.z0 - foot(u).z0;\n    else if (n.dz < 0) u.z += fa.z1 - foot(u).z1;\n    else if (n.dx > 0) u.x += fa.x0 - foot(u).x0;\n    else u.x += fa.x1 - foot(u).x1;\n    if (d.dx > 0) u.x += fa.x1 - foot(u).x0;\n    else if (d.dx < 0) u.x += fa.x0 - foot(u).x1;\n    else if (d.dz > 0) u.z += fa.z1 - foot(u).z0;\n    else u.z += fa.z0 - foot(u).z1;\n    if (arm) {\n      if (!u.rot && runWallDist(u, \"main\") < 1) u.run = \"main\";\n      else if (ROOM.ret && runWallDist(u, \"return\") < 1 && u.rot === runRot(\"return\")) u.run = \"return\";\n    }\n    return legal();\n  }\n  function matchingProbe(anchor) {\n    const n = nextUid();\n    setUid(n);\n    const u = newUnit(anchor.type, 0, 0, anchor);\n    setUid(n);\n    u.id = \"__qadd_probe\";\n    return u;\n  }\n  var ONE_DOOR_MAX = 600;\n  var NARROW_MIN = CABINET_MIN_W;\n  function besideAdapted(units, anchor, side, make) {\n    if (!quickAddable(anchor)) return null;\n    const corner = !make && !!cornerArmSides(anchor);\n    const probe = () => {\n      if (make) return make();\n      if (!corner) return matchingProbe(anchor);\n      const n0 = nextUid();\n      setUid(n0);\n      const c = newUnit(cornerPlusTile(anchor));\n      c.door = true;\n      setUid(n0);\n      c.id = \"__qadd_probe\";\n      return c;\n    };\n    const same = probe();\n    if (!same) return null;\n    if (placeBeside(units, same, anchor, side)) return { u: same, adapted: false };\n    if ([\"base\", \"wall\", \"base-drawer\", \"base-4drawer\"].indexOf(same.type) < 0 || same.doors !== 1 && same.doors !== 2) return null;\n    const one = probe();\n    one.doors = 1;\n    const lim = limitsFor(one).w;\n    const fits2 = (w) => {\n      one.w = w;\n      return placeBeside(units, one, anchor, side);\n    };\n    let lo = Math.ceil(Math.max(NARROW_MIN, lim[0])), hi = Math.floor(Math.min(ONE_DOOR_MAX, lim[1], same.w));\n    if (hi < lo || !fits2(lo)) return null;\n    if (!fits2(hi)) {\n      while (hi - lo > 1) {\n        const m = lo + hi >> 1;\n        if (fits2(m)) lo = m;\n        else hi = m;\n      }\n      hi = lo;\n    }\n    fits2(hi);\n    return { u: one, adapted: true };\n  }\n  function besideFree(units, anchor, side) {\n    return !!besideAdapted(units, anchor, side);\n  }\n\n  // v2/src/model/parts.js\n  function buildParts(W2, H2, D2) {\n    const p = [];\n    function box3(name2, x0, x1, y0, y1, z0, z1, ex, role) {\n      p.push({ name: name2, x0, x1, y0, y1, z0, z1, ex, role: role || \"board\" });\n    }\n    const zBack0 = VOID_REAR, zBack1 = VOID_REAR + T;\n    const innerZ0 = zBack1, innerZ1 = D2;\n    box3(\"Side L\", 0, T, 0, H2, 0, D2, [-1, 0, 0]);\n    box3(\"Side R\", W2 - T, W2, 0, H2, 0, D2, [1, 0, 0]);\n    box3(\"Base\", T, W2 - T, 0, T, innerZ0, innerZ1, [0, -1, 0]);\n    box3(\"Back\", T, W2 - T, T, H2 - T, zBack0, zBack1, [0, 0, -1]);\n    box3(\"Rail rear\", T, W2 - T, H2 - T, H2, innerZ0, innerZ0 + RAIL_D, [0, 1, -0.6]);\n    box3(\"Rail front\", T, W2 - T, H2 - T, H2, D2 - RAIL_D, D2, [0, 1, 0.6]);\n    const sy = Math.round((H2 - T) / 2);\n    box3(\n      \"Shelf\",\n      T + SHELF_SIDE_GAP,\n      W2 - T - SHELF_SIDE_GAP,\n      sy,\n      sy + T,\n      innerZ0,\n      innerZ1 - SHELF_FRONT_SETBACK,\n      [0, 0, 1]\n    );\n    return p;\n  }\n  function wallParts(W2, H2, D2) {\n    const p = [];\n    function box3(n, x0, x1, y0, y1, z0, z1, ex) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: \"board\" });\n    }\n    box3(\"Side L\", 0, T, 0, H2, 0, D2, [-1, 0, 0]);\n    box3(\"Side R\", W2 - T, W2, 0, H2, 0, D2, [1, 0, 0]);\n    box3(\"Bottom\", T, W2 - T, 0, T, 0, D2, [0, -1, 0]);\n    box3(\"Top\", T, W2 - T, H2 - T, H2, 0, D2, [0, 1, 0]);\n    box3(\"Back\", T, W2 - T, T, H2 - T, 0, 3, [0, 0, -1]);\n    const sy = Math.round((H2 - T) / 2);\n    box3(\"Shelf\", T + 1, W2 - T - 1, sy, sy + T, 3, D2 - 29.5 + 3, [0, 0, 1]);\n    return p;\n  }\n  function partWorldBox(u, b) {\n    const xf = unitXf(u);\n    let lo = null, hi = null;\n    const corners = [\n      [b.x0, b.y0, b.z0],\n      [b.x1, b.y0, b.z0],\n      [b.x0, b.y1, b.z0],\n      [b.x1, b.y1, b.z0],\n      [b.x0, b.y0, b.z1],\n      [b.x1, b.y0, b.z1],\n      [b.x0, b.y1, b.z1],\n      [b.x1, b.y1, b.z1]\n    ];\n    for (let k = 0; k < corners.length; k++) {\n      const c = corners[k];\n      const p = xf.p(c);\n      if (!lo) {\n        lo = [p[0], p[1], p[2]];\n        hi = [p[0], p[1], p[2]];\n        continue;\n      }\n      for (let i = 0; i < 3; i++) {\n        if (p[i] < lo[i]) lo[i] = p[i];\n        if (p[i] > hi[i]) hi[i] = p[i];\n      }\n    }\n    return { x0: lo[0], y0: lo[1], z0: lo[2], x1: hi[0], y1: hi[1], z1: hi[2] };\n  }\n  function carcassPartsFor(u) {\n    if (!u) return [];\n    return stripStockShelves(carcassRawFor(u), u);\n  }\n  function carcassRawFor(u) {\n    return applyBuildGeometry(u, carcassOwnFor(u));\n  }\n  function carcassOwnFor(u) {\n    if (isTall(u)) return tallParts(u) || [];\n    if (u.type === \"corner-l\") return cornerLParts(armA(u), armB(u), u.h, u.d) || [];\n    if (u.type === \"corner-wall\") return cornerLWallParts(armA(u), armB(u), u.h, u.d) || [];\n    if (u.type === \"corner-tall\") return cornerLTallParts(armA(u), armB(u), u.h, u.d) || [];\n    if (u.type === \"corner-blind\") {\n      const cb = cornerBlindParts(u.w, u.h, u.d) || [];\n      return u.hand === \"right\" ? mirrorPartsX(cb, u.w) || cb : cb;\n    }\n    if (isOvenBase(u)) return ovenBaseParts(u.w, u.h, u.d);\n    if (u.family === \"wall\") return wallParts(u.w, u.h, u.d) || [];\n    if (u.type === \"base-4drawer\") return golaCarcass(u, buildParts4(u.w, u.h, u.d) || []);\n    return golaCarcass(u, buildParts(u.w, u.h, u.d) || []);\n  }\n  function partMaterialOf(u, kind) {\n    if (kind === \"door\" || kind === \"drawer-front\")\n      return u.frontMat === \"mdf-paint\" ? \"mdf-paint\" : u.doorFinish || u.frontFinish || u.finish || \"white\";\n    if (kind === \"plinth\") return u.plinthFinish || u.frontFinish || u.finish || \"white\";\n    if (kind === \"skin\") return u.skinFinish || u.frontFinish || u.finish || \"white\";\n    return u.finish || \"white\";\n  }\n  var PART_KIND_LABEL = {\n    carcass: \"Carcass board\",\n    shelf: \"Adjustable shelf\",\n    \"fixed-h\": \"Fixed shelf\",\n    \"fixed-v\": \"Fixed divider\",\n    door: \"Door\",\n    \"drawer-front\": \"Drawer front\",\n    \"drawer-box\": \"Drawer box\",\n    plinth: \"Plinth\",\n    skin: \"End panel\",\n    finishing: \"End / scribe panel\",\n    leg: \"Leg\"\n  };\n  function cabinetParts(u) {\n    if (u && u.type === \"workshop\") return workshopRuntimeParts(u);\n    if (!u) return [];\n    const out = [];\n    const seen = {};\n    function add(name2, kind, b) {\n      if (!b) return {};\n      const w = Math.abs(b.x1 - b.x0), h = Math.abs(b.y1 - b.y0), d = Math.abs(b.z1 - b.z0);\n      if (w < 0.5 && h < 0.5 && d < 0.5) return {};\n      let pid = u.id + \":\" + kind + \":\" + name2;\n      if (b.pidName) pid = u.id + \":\" + kind + \":\" + b.pidName;\n      else if (seen[pid] != null) {\n        seen[pid]++;\n        pid = pid + \"#\" + seen[pid];\n      } else seen[pid] = 0;\n      const part = {\n        pid,\n        unitId: u.id,\n        name: name2,\n        kind,\n        ex: b.ex ? [b.ex[0], b.ex[1], b.ex[2]] : [0, 0, 0],\n        exFixed: !!EXPLODE_FIXED[name2],\n        label: PART_KIND_LABEL[kind] || \"Part\",\n        /* a board that names its own material (an end panel: model/finishing.js endKeyOf) keeps it - the part\n           list, the cut list and the 3D then say the same board (task 1791235365921) */\n        material: b.mat || partMaterialOf(u, kind),\n        local: { x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1, z0: b.z0, z1: b.z1 },\n        box: partWorldBox(u, b),\n        mm: { w: Math.round(w), h: Math.round(h), d: Math.round(d) },\n        thickness: Math.round(Math.min(w, Math.min(h, d)))\n      };\n      if (b.tAxis === \"x\" || b.tAxis === \"y\" || b.tAxis === \"z\") {\n        part.tAxis = b.tAxis;\n        part.thickness = Math.round(b.tAxis === \"x\" ? w : b.tAxis === \"y\" ? h : d);\n      }\n      if (b.notches) part.notches = b.notches.map(function(n) {\n        return { ...n };\n      });\n      if (b.corner) {\n        part.corner = true;\n        part.arm = b.arm;\n        part.sid = b.sid;\n        part.front = { axis: b.front.axis, sign: b.front.sign, at: b.front.at, from: b.front.from, to: b.front.to, mid: b.front.mid.slice() };\n      }\n      out.push(part);\n      return part;\n    }\n    const band = doorBand(u);\n    carcassPartsFor(u).forEach(function(q) {\n      if (q.role === \"leg\") {\n        add(q.name, \"leg\", q);\n        return;\n      }\n      add(q.name, \"carcass\", q);\n    });\n    (interiorParts(u) || []).forEach(function(q) {\n      add(q.name, q.kind === \"fixed-h\" ? \"fixed-h\" : q.kind === \"fixed-v\" ? \"fixed-v\" : \"shelf\", q);\n    });\n    (finishingParts(u) || []).forEach(function(q) {\n      const p = add(q.name, \"finishing\", q);\n      if (q.endPanel) {\n        p.endPanel = true;\n        p.label = \"End panel\";\n      }\n    });\n    if (isIsland(u)) (islandSkinParts(u) || []).forEach(function(q) {\n      add(q.name, \"skin\", q);\n    });\n    if (isOvenBase(u) && drawerFrontsOn(u)) {\n      const op = add(\"Panel below the oven\", \"door\", ovenPanel(u));\n      if (op && op.pid) op.finished = true;\n    }\n    if (u.door && !u.doorOpen && !isCornerUnit(u) && !isTall(u) && !isIsland(u) && !isOvenBase(u) && u.type !== \"base-drawer\" && u.type !== \"base-4drawer\" && !(band && band.none)) {\n      const gf = golaFace(u);\n      const dy0 = band ? band.y0 : gf ? REVEAL : 0, dy1 = band ? band.y1 : gf ? u.h - gf.topGap : u.h;\n      const nLeaves = doorLeaves(u);\n      if (nLeaves === 2) {\n        leafPlan(u, u.w, u.h).forEach(function(lf, i) {\n          add(\n            \"Door \" + (i + 1),\n            \"door\",\n            { x0: lf.x0, x1: lf.x1, y0: dy0, y1: dy1, z0: u.d, z1: u.d + T }\n          ).short = !!band;\n        });\n      } else {\n        add(\"Door\", \"door\", { x0: 0, x1: u.w, y0: dy0, y1: dy1, z0: u.d, z1: u.d + T }).short = !!band;\n      }\n      doorStrips(u).forEach(function(s) {\n        if (nLeaves === 2) leafPlan(u, u.w, u.h).forEach(function(lf, i) {\n          add(s.name + (i === 0 ? \" left\" : \" right\"), \"door\", { x0: lf.x0, x1: lf.x1, y0: s.y0, y1: s.y1, z0: u.d, z1: u.d + T }).short = true;\n        });\n        else add(s.name, \"door\", { x0: 0, x1: u.w, y0: s.y0, y1: s.y1, z0: u.d, z1: u.d + T }).short = true;\n      });\n    }\n    if (isCornerUnit(u) && u.door && !u.doorOpen) {\n      (cornerDoorSlabs(u) || []).forEach(function(s) {\n        add(s.name, \"door\", { x0: s.x0, x1: s.x1, y0: s.y0, y1: s.y1, z0: s.z0, z1: s.z1 });\n      });\n    }\n    if (u.type === \"base-4drawer\") {\n      const bank = drawer4Parts(u) || [];\n      const outB = ownOut(u);\n      bank.forEach(function(p, i) {\n        if (outB.has(i)) return;\n        if (u.drawers && u.drawers[i]) return;\n        const fx0 = (u.w - p.frontW) / 2;\n        if (drawerFrontsOn(u))\n          add(\n            p.name || \"Drawer front \" + (i + 1),\n            \"drawer-front\",\n            { x0: fx0, x1: fx0 + p.frontW, y0: p.fy0, y1: p.fy1, z0: u.d, z1: u.d + T }\n          );\n        const bx0 = (u.w - p.boxOuter) / 2;\n        add(\n          (p.name || \"Drawer \" + (i + 1)) + \" box\",\n          \"drawer-box\",\n          {\n            x0: bx0,\n            x1: bx0 + p.boxOuter,\n            y0: p.by0,\n            y1: p.by1,\n            z0: VOID_REAR + T,\n            z1: VOID_REAR + T + p.boxL\n          }\n        );\n      });\n    } else if (u.type === \"base-drawer\") {\n      const dp = drawerParts(u);\n      const dfx0 = (u.w - dp.frontW) / 2;\n      const dfy1 = dp.fy1;\n      const dOpen = !!(u.drawerOpen || u.drawers && u.drawers[0]);\n      if (!dOpen && !ownOut(u).has(0)) {\n        if (drawerFrontsOn(u)) add(\n          \"Drawer front\",\n          \"drawer-front\",\n          {\n            x0: dfx0,\n            x1: dfx0 + dp.frontW,\n            y0: dfy1 - dp.frontH,\n            y1: dfy1,\n            z0: u.d,\n            z1: u.d + T\n          }\n        );\n        const dbx0 = (u.w - dp.boxOuter) / 2;\n        add(\n          \"Drawer box\",\n          \"drawer-box\",\n          {\n            x0: dbx0,\n            x1: dbx0 + dp.boxOuter,\n            y0: dp.by0,\n            y1: dp.by1,\n            z0: VOID_REAR + T,\n            z1: VOID_REAR + T + dp.boxL\n          }\n        );\n      }\n      if (u.door && !u.doorOpen && !(band && band.none)) {\n        const ddx0 = (u.w - dp.doorW) / 2;\n        add(\n          \"Door\",\n          \"door\",\n          {\n            x0: ddx0,\n            x1: ddx0 + dp.doorW,\n            y0: band ? band.y0 : 2,\n            y1: band ? band.y1 : 2 + dp.doorH,\n            z0: u.d,\n            z1: u.d + T\n          }\n        ).short = !!band;\n        doorStrips(u).forEach(function(s) {\n          add(s.name, \"door\", { x0: ddx0, x1: ddx0 + dp.doorW, y0: s.y0, y1: s.y1, z0: u.d, z1: u.d + T }).short = true;\n        });\n      }\n    }\n    addedDrawers(u).forEach(function(d) {\n      if (d.open) return;\n      if (drawerFrontsOn(u)) add(\n        d.name + \" front\",\n        \"drawer-front\",\n        { x0: d.fx0, x1: d.fx1, y0: d.fy0, y1: d.fy1, z0: u.d, z1: u.d + T }\n      ).xn = d.n;\n      add(\n        d.name + \" box\",\n        \"drawer-box\",\n        { x0: d.x0, x1: d.x1, y0: d.by0, y1: d.by1, z0: d.bz0, z1: d.bz0 + d.l }\n      ).xn = d.n;\n    });\n    return out;\n  }\n  var PART_WORDS = { oak: \"Casella Oak\", w1100: \"W1100 Egger ST9\", white: \"White\" };\n  function partMaterialWords(key) {\n    if (Object.prototype.hasOwnProperty.call(PART_WORDS, key)) return PART_WORDS[key];\n    const d = decorOf(key);\n    return d ? decorShort(d) : \"White\";\n  }\n  function partReadout(u, part) {\n    if (!part) return null;\n    const m = part.mm;\n    const dims = [m.w, m.h, m.d].filter(function(n) {\n      return n > 0;\n    });\n    if (part.kind === \"workshop\") dims.sort((a, b) => b - a);\n    const size3 = part.kind === \"drawer-box\" ? m.w + \" \\xD7 \" + m.d + \" \\xD7 \" + m.h + \" mm box\" : dims.slice(0, 2).join(\" \\xD7 \") + \" mm\";\n    const mat = part.materialName || (part.material === \"mdf-paint\" ? \"Painted MDF\" : partMaterialWords(part.material));\n    const thick = part.thickness ? part.thickness + \" mm\" : null;\n    if (part.corner) {\n      const bs = partsById(u, part.pid);\n      const nm = String(part.pid).split(\":shelf:\")[1] || \"Shelf\";\n      return [\n        nm + \" (L-shaped, two boards)\",\n        bs.map(function(b) {\n          return \"arm \" + b.arm + \" \" + b.mm.w + \" \\xD7 \" + b.mm.d + \" mm\";\n        }).join(\", \"),\n        mat + \" \\xB7 18 mm\"\n      ].join(\" \\xB7 \");\n    }\n    return [part.name, size3, mat + (thick ? \" \\xB7 \" + thick : \"\")].filter(Boolean).join(\" \\xB7 \");\n  }\n  function partsById(u, pid) {\n    if (!u || !pid) return [];\n    return cabinetParts(u).filter(function(p) {\n      return p.pid === pid;\n    });\n  }\n  function partById(u, pid) {\n    if (!u || !pid) return null;\n    let hit2 = null;\n    const cp = cabinetParts(u);\n    for (let i = 0; i < cp.length; i++) {\n      const p = cp[i];\n      if (p.pid === pid) hit2 = p;\n    }\n    return hit2;\n  }\n\n  // v2/src/model/shelves.js\n  function shelfCellKey(c) {\n    return c.band + \".\" + c.col;\n  }\n  function legacyShelfYs(u, n) {\n    const B = interiorBounds(u);\n    if (!B || !n) return [];\n    const i = u && u.interior || {};\n    const vD = i.vDiv || i.dividers || [], hD = i.hDiv || [];\n    let stockY = null;\n    if (n === baselineShelves(u) && !vD.length && !hD.length) {\n      const src = String(u.type).indexOf(\"tall\") === 0 ? tallParts(u) : u.family === \"wall\" ? wallParts(u.w, u.h, u.d) : buildParts(u.w, u.h, u.d);\n      const ys = src.filter(function(q) {\n        return /^Shelf/.test(q.name);\n      }).map(function(q) {\n        return q.y0;\n      });\n      if (ys.length === n) stockY = ys;\n    }\n    const out = [];\n    cells(u).forEach(function(c) {\n      const ch = c.y1 - c.y0;\n      for (let k = 1; k <= n; k++) {\n        const y = stockY ? stockY[k - 1] : c.y0 + (ch - T) * k / (n + 1);\n        out.push({ cell: shelfCellKey(c), y: y - B.y0 });\n      }\n    });\n    return out;\n  }\n  function validateShelfList(u, list) {\n    const B = interiorBounds(u);\n    if (!B) return [];\n    const live = {};\n    cells(u).forEach(function(c) {\n      live[shelfCellKey(c)] = c;\n    });\n    const out = [];\n    (list || []).forEach(function(s, idx) {\n      if (!s) return;\n      const key = s.cell != null ? String(s.cell) : \"0.0\";\n      const c = live[key];\n      if (!c) return;\n      const lo = c.y0 - B.y0, hi = c.y1 - B.y0 - T;\n      if (hi < lo) return;\n      if (c.x1 - c.x0 - 2 * SHELF_SIDE_GAP <= 0) return;\n      const y = Math.round(clamp4(s.y != null ? s.y : lo, lo, hi));\n      if (out.some(function(o) {\n        return o.cell === key && Math.abs(o.y - y) < T - 1e-3;\n      })) return;\n      out.push(keepEdges(s, { id: s.id != null ? String(s.id) : \"S\" + (idx + 1), cell: key, y }));\n    });\n    return out;\n  }\n  function shelfListOf(u) {\n    if (isCornerShelfUnit(u)) return cornerShelfList(u);\n    if (!u || !canInterior(u)) return [];\n    const i = u.interior || null;\n    if (i && i.shelfList && i.shelfList.length != null)\n      return validateShelfList(u, i.shelfList);\n    const n = i && i.shelves != null ? Math.max(0, Math.min(maxShelvesFor(u), Math.round(i.shelves))) : baselineShelves(u);\n    return validateShelfList(u, legacyShelfYs(u, n).map(function(s, idx) {\n      return { id: \"S\" + (idx + 1), cell: s.cell, y: Math.round(s.y) };\n    }));\n  }\n  function nextShelfId(list) {\n    let max = 0;\n    const arr = list || [];\n    for (let i = 0; i < arr.length; i++) {\n      const s = arr[i];\n      const m = /^S(\\d+)$/.exec(String(s && s.id) || \"\");\n      if (m) max = Math.max(max, parseInt(m[1], 10));\n    }\n    return \"S\" + (max + 1);\n  }\n  function materialiseShelves2(u) {\n    if (!u || !canInterior(u)) return [];\n    const list = shelfListOf(u);\n    const I = interiorOf(u);\n    u.interior = u.interior || {};\n    u.interior.shelfList = list.map(function(s) {\n      return keepEdges(s, { id: s.id, cell: s.cell, y: s.y });\n    });\n    u.interior.shelves = shelvesPerCell(u, list);\n    u.interior.vDiv = I.vDiv;\n    u.interior.hDiv = I.hDiv;\n    u.interior.vSb = I.vSb;\n    u.interior.hSb = I.hSb;\n    return u.interior.shelfList;\n  }\n  function shelvesPerCell(u, list) {\n    const per = {};\n    (list || shelfListOf(u)).forEach(function(s) {\n      per[s.cell] = (per[s.cell] || 0) + 1;\n    });\n    let mx = 0;\n    const ks = Object.keys(per);\n    for (let i = 0; i < ks.length; i++) {\n      const k = ks[i];\n      mx = Math.max(mx, per[k]);\n    }\n    return mx;\n  }\n  var SHELF_CLEAR = 0;\n  function shelfCellOf(u, cellKey) {\n    let found = null;\n    const cs = cells(u);\n    for (let i = 0; i < cs.length; i++) {\n      const c = cs[i];\n      if (shelfCellKey(c) === String(cellKey)) found = c;\n    }\n    return found;\n  }\n  function shelfRangeIn(u, cellKey, selfId) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const c = shelfCellOf(u, cellKey);\n    if (!c) return null;\n    const list = shelfListOf(u).filter(function(s) {\n      return s.cell === String(cellKey) && s.id !== selfId;\n    });\n    const lo = c.y0 - B.y0, hi = c.y1 - B.y0;\n    const blocks = addedDrawers(u).filter(function(d) {\n      return shelfCellKey(d.c) === String(cellKey);\n    }).map(function(d) {\n      return { lo: d.by0 - BOX_RUNNER_CLEAR - B.y0, hi: d.by1 - B.y0, name: d.name };\n    });\n    return {\n      lo,\n      hi,\n      others: list,\n      blocks,\n      min: lo + SHELF_CLEAR,\n      max: hi - SHELF_CLEAR - T\n    };\n  }\n  function shelfYLegal(R4, y) {\n    if (!R4 || y < R4.min - 1e-3 || y > R4.max + 1e-3) return false;\n    for (const b of R4.blocks || []) if (y + T > b.lo + 1e-3 && y < b.hi - 1e-3) return false;\n    for (let i = 0; i < R4.others.length; i++) {\n      const o = R4.others[i].y;\n      if (Math.abs(y - o) < T + SHELF_CLEAR - 1e-3) return false;\n    }\n    return true;\n  }\n  function shelfSnapLegal(R4, want) {\n    if (!R4) return null;\n    const start2 = system32Snap(clamp4(want, R4.min, R4.max));\n    if (shelfYLegal(R4, start2)) return start2;\n    for (let step = 1; step <= 64; step++) {\n      const up = start2 + step * PIN_PITCH, dn = start2 - step * PIN_PITCH;\n      const dUp = Math.abs(up - want), dDn = Math.abs(dn - want);\n      const first = dUp <= dDn ? up : dn, second = dUp <= dDn ? dn : up;\n      if (shelfYLegal(R4, first)) return first;\n      if (shelfYLegal(R4, second)) return second;\n      if (dn < R4.min - PIN_PITCH && up > R4.max + PIN_PITCH) break;\n    }\n    return null;\n  }\n  function shelfAdd(u, cellKey, wantY) {\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const key = String(cellKey == null ? \"0.0\" : cellKey);\n    const R4 = shelfRangeIn(u, key, null);\n    if (!R4) return { ok: false, why: \"There is no compartment there.\" };\n    const y = shelfSnapLegal(R4, wantY == null ? R4.lo + (R4.hi - R4.lo) / 2 : wantY);\n    if (y == null)\n      return { ok: false, why: \"There is no shelf hole left with enough room around it.\" };\n    const list = materialiseShelves2(u).slice();\n    const id = nextShelfId(list);\n    list.push({ id, cell: key, y: Math.round(y) });\n    u.interior.shelfList = list;\n    u.interior.shelves = shelvesPerCell(u, list);\n    return { ok: true, id, y: Math.round(y), cell: key };\n  }\n  function shelfMoveTo(u, id, wantY) {\n    if (isCornerShelfUnit(u)) return cornerShelfMoveTo(u, id, wantY);\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const list = materialiseShelves2(u).slice();\n    let at = -1;\n    for (let i = 0; i < list.length; i++) {\n      const s = list[i];\n      if (s.id === String(id)) at = i;\n    }\n    if (at < 0) return { ok: false, why: \"That shelf is not there any more.\" };\n    const R4 = shelfRangeIn(u, list[at].cell, list[at].id);\n    if (!R4) return { ok: false, why: \"Its compartment has gone.\" };\n    const y = shelfSnapLegal(R4, wantY);\n    if (y == null)\n      return { ok: false, why: \"No shelf hole there leaves room above and below.\" };\n    list[at] = keepEdges(list[at], { id: list[at].id, cell: list[at].cell, y: Math.round(y) });\n    u.interior.shelfList = list;\n    u.interior.shelves = shelvesPerCell(u, list);\n    return {\n      ok: true,\n      id: list[at].id,\n      y: list[at].y,\n      min: Math.round(R4.min),\n      max: Math.round(R4.max)\n    };\n  }\n  function shelfRemove(u, id) {\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const list = materialiseShelves2(u).slice();\n    const keep = list.filter(function(s) {\n      return s.id !== String(id);\n    });\n    if (keep.length === list.length)\n      return { ok: false, why: \"That shelf is not there any more.\" };\n    u.interior.shelfList = keep;\n    u.interior.shelves = shelvesPerCell(u, keep);\n    return { ok: true, removed: String(id), left: keep.length };\n  }\n  function cloneShelfList(list) {\n    return (list || []).map(function(s, i) {\n      return keepEdges(s, { id: \"S\" + (i + 1), cell: s.cell, y: s.y });\n    });\n  }\n  function reconcileShelfCount(u, wantPerCell) {\n    if (!canInterior(u)) return null;\n    let list = shelfListOf(u).map(function(s) {\n      return keepEdges(s, { id: s.id, cell: s.cell, y: s.y });\n    });\n    const want = Math.max(0, Math.round(wantPerCell));\n    let ok2 = true;\n    const cs = cells(u);\n    for (let ci = 0; ci < cs.length; ci++) {\n      const c = cs[ci];\n      const key = shelfCellKey(c);\n      const mine = list.filter(function(s) {\n        return s.cell === key;\n      }).sort(function(a, b) {\n        return a.y - b.y;\n      });\n      while (mine.length > want) {\n        const drop = mine.pop();\n        list = list.filter(function(s) {\n          return s.id !== drop.id;\n        });\n      }\n      let guard = 0;\n      while (mine.length < want && guard++ < 32) {\n        const R4 = {\n          lo: c.y0 - interiorBounds(u).y0,\n          hi: c.y1 - interiorBounds(u).y0,\n          others: mine.slice()\n        };\n        R4.min = R4.lo + SHELF_CLEAR;\n        R4.max = R4.hi - SHELF_CLEAR - T;\n        const edges = [R4.lo].concat(mine.map(function(s) {\n          return s.y;\n        })).concat([R4.hi]);\n        edges.sort(function(a, b) {\n          return a - b;\n        });\n        let bestMid = null, bestGap = -1;\n        for (let i = 0; i < edges.length - 1; i++) {\n          const g2 = edges[i + 1] - edges[i];\n          if (g2 > bestGap) {\n            bestGap = g2;\n            bestMid = edges[i] + g2 / 2;\n          }\n        }\n        const y = shelfSnapLegal(R4, bestMid);\n        if (y == null) {\n          ok2 = false;\n          break;\n        }\n        const id = nextShelfId(list);\n        const rec = { id, cell: key, y: Math.round(y) };\n        list.push(rec);\n        mine.push(rec);\n        mine.sort(function(a, b) {\n          return a.y - b.y;\n        });\n      }\n    }\n    return ok2 ? list : null;\n  }\n  function keepEdges(s, rec) {\n    if (s && s.setback != null && isFinite(Number(s.setback)) && Number(s.setback) >= 0) rec.setback = Math.round(Number(s.setback));\n    if (s && s.depth != null && isFinite(Number(s.depth)) && Number(s.depth) > 0) rec.depth = Math.round(Number(s.depth));\n    return rec;\n  }\n  function shelfDepthLimits(u, cellKey) {\n    if (isCornerShelfUnit(u)) return cornerShelfLimits(u);\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const c = shelfCellOf(u, cellKey == null ? \"0.0\" : cellKey);\n    if (!c) return null;\n    const nDiv = interiorOf(u).vDiv.length;\n    const onDivider = c.col > 0 || c.col < nDiv;\n    const D2 = u.d;\n    const frontMax = onDivider ? B.z1 : D2;\n    return {\n      D: D2,\n      std: { z0: B.z0, z1: B.z1 },\n      rearMin: B.z0,\n      frontMax,\n      onDivider,\n      minDepth: SHELF_MIN_DEPTH,\n      maxDepth: Math.round(frontMax - B.z0),\n      minSetback: Math.round(D2 - frontMax),\n      maxSetback: Math.round(D2 - (B.z0 + SHELF_MIN_DEPTH)),\n      /* the standard shelf's pins sit on the System-32 lines: D - PIN_INSET and B.z0 + PIN_INSET */\n      pinFront: PIN_INSET - (D2 - B.z1),\n      pinRear: PIN_INSET,\n      whyFront: onDivider ? \"This shelf rests on a divider, whose front edge is \" + Math.round(D2 - B.z1) + \" mm behind the carcass front - a shelf cannot stand further forward than the panel that carries its pins.\" : \"The front edge stops flush with the carcass front - the door shuts against it.\",\n      whyRear: \"The rear edge stops at the back of the cabinet's inside.\",\n      whyMin: \"A shelf rests on a front and a rear row of shelf pins - \" + SHELF_MIN_DEPTH + \" mm is the shallowest that still carries both rows.\"\n    };\n  }\n  function shelfEdgesOf(u, s) {\n    if (isCornerShelfUnit(u)) return cornerShelfEdges(u, s);\n    const L = shelfDepthLimits(u, s && s.cell);\n    if (!L) return null;\n    let z1 = s && s.setback != null ? L.D - s.setback : L.std.z1;\n    z1 = clamp4(z1, L.rearMin + L.minDepth, L.frontMax);\n    let z0 = s && s.depth != null ? z1 - s.depth : L.std.z0;\n    z0 = clamp4(z0, L.rearMin, z1 - Math.min(L.minDepth, z1 - L.rearMin));\n    return {\n      z0,\n      z1,\n      setback: Math.round((L.D - z1) * 2) / 2,\n      depth: Math.round((z1 - z0) * 2) / 2,\n      custom: !!(s && (s.setback != null || s.depth != null))\n    };\n  }\n  function shelfPins(u, s, part) {\n    if (isCornerShelfUnit(u)) return null;\n    const L = shelfDepthLimits(u, s && s.cell);\n    const E = shelfEdgesOf(u, s);\n    const B = interiorBounds(u);\n    if (!L || !E || !B) return null;\n    const front = E.z1 - L.pinFront, rear = E.z0 + L.pinRear;\n    const zs = front - rear >= 2 * PIN_R ? [front, rear] : [];\n    const y = part ? part.y0 : B.y0 + s.y, ys = [];\n    for (let k = -2; k <= 2; k++) {\n      const yy = y + k * PIN_PITCH;\n      if (yy >= B.y0 + 10 && yy <= B.y1 - 10) ys.push(yy);\n    }\n    return { zs, ys, bearingY: y };\n  }\n  function shelfSetEdges(u, id, want, mode) {\n    if (isCornerShelfUnit(u)) return cornerShelfSetEdges(u, id, want, mode === \"depth\" ? \"depth\" : \"front\");\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const list0 = shelfListOf(u);\n    const s = list0.filter(function(q) {\n      return q.id === String(id);\n    })[0];\n    if (!s) return { ok: false, why: \"That shelf is not there any more.\" };\n    const L = shelfDepthLimits(u, s.cell), E = shelfEdgesOf(u, s);\n    if (!L || !E) return { ok: false, why: \"Its compartment has gone.\" };\n    const num6 = function(v) {\n      const n = Number(v);\n      return isFinite(n) ? n : null;\n    };\n    let z0 = E.z0, z1 = E.z1, clamped = null;\n    const lim = function(v, lo, hi, whyLo, whyHi) {\n      if (v < lo - 1e-3) {\n        clamped = whyLo;\n        return lo;\n      }\n      if (v > hi + 1e-3) {\n        clamped = whyHi;\n        return hi;\n      }\n      return v;\n    };\n    if (mode === \"depth\") {\n      const d = num6(want && want.depth);\n      if (d == null) return { ok: false, why: \"Type the shelf depth in millimetres.\" };\n      z1 = lim(z0 + d, z0 + L.minDepth, L.frontMax, L.whyMin, L.whyFront);\n    } else if (mode === \"slide\") {\n      const sb = num6(want && want.setback);\n      if (sb == null) return { ok: false, why: \"Type the front setback in millimetres.\" };\n      const dep = E.depth;\n      z1 = lim(L.D - sb, L.rearMin + dep, L.frontMax, L.whyRear, L.whyFront);\n      z0 = z1 - dep;\n    } else {\n      const sb = num6(want && want.setback);\n      if (sb == null) return { ok: false, why: \"Type the front setback in millimetres.\" };\n      z1 = lim(L.D - sb, z0 + L.minDepth, L.frontMax, L.whyMin, L.whyFront);\n    }\n    const h2 = (v) => Math.round(v * 2) / 2;\n    z0 = h2(z0);\n    z1 = h2(z1);\n    const rec = { id: s.id, cell: s.cell, y: s.y };\n    if (Math.abs(z1 - L.std.z1) > 0.25 || Math.abs(z0 - L.std.z0) > 0.25) rec.setback = h2(L.D - z1);\n    if (Math.abs(z0 - L.std.z0) > 0.25) rec.depth = h2(z1 - z0);\n    const list = materialiseShelves2(u).map(function(q) {\n      return q.id === s.id ? rec : q;\n    });\n    u.interior.shelfList = list;\n    u.interior.shelves = shelvesPerCell(u, list);\n    const E2 = shelfEdgesOf(u, rec);\n    return {\n      ok: true,\n      id: s.id,\n      setback: E2.setback,\n      depth: E2.depth,\n      z0: E2.z0,\n      z1: E2.z1,\n      clamped,\n      min: { setback: L.minSetback, depth: L.minDepth },\n      max: { setback: L.maxSetback, depth: L.maxDepth }\n    };\n  }\n\n  // v2/src/model/units.js\n  function clamp4(v, lo, hi) {\n    return v < lo ? lo : v > hi ? hi : v;\n  }\n  function familyOf(type) {\n    if (type === \"wall\" || type === \"corner-wall\") return \"wall\";\n    if (type === \"corner-l\" || type === \"corner-blind\" || type === \"corner-tall\") return \"corner\";\n    return \"base\";\n  }\n  function drawerFrontsOn(u) {\n    return !!u && u.drawerFronts !== false;\n  }\n  function islandBayDoorsOn(u) {\n    return !!u && u.bayDoors !== false;\n  }\n  function anyFrontsOn(u) {\n    if (!u) return false;\n    if (u.type === \"island\") return drawerFrontsOn(u) || islandBayDoorsOn(u);\n    if (u.type === \"base-4drawer\") return drawerFrontsOn(u);\n    if (u.type === \"base-oven\") return drawerFrontsOn(u);\n    if (u.type === \"base-drawer\") return !!u.door || drawerFrontsOn(u);\n    if (Array.isArray(u.xdr) && u.xdr.length) return !!u.door || drawerFrontsOn(u);\n    return !!u.door;\n  }\n  function freshId() {\n    const used = UB_SCENE && Array.isArray(UB_SCENE.units) ? UB_SCENE.units : null;\n    let id = \"U\" + nextUid();\n    if (used) for (let k = 0; k < 1e5 && used.some((v) => v && v.id === id); k++) id = \"U\" + nextUid();\n    return id;\n  }\n  function newUnit(type, x, z, src) {\n    type = type || \"base\";\n    const fam = familyOf(type), corner = fam === \"corner\", wall = fam === \"wall\";\n    const island = type === \"island\";\n    const tall = type === \"tall-pantry\" || type === \"tall-fridge\" || type === \"tall-oven\";\n    const u = {\n      id: freshId(),\n      type,\n      family: fam,\n      w: tall ? TALL.defaultW : island ? ISLAND.defaultW : corner ? CORNER.defaultW : type === \"corner-wall\" ? 700 : wall ? WALL.defaultW : 600,\n      h: tall ? TALL.defaultH : island ? ISLAND.defaultH : corner ? CORNER.defaultH : wall ? WALL.defaultH : 720,\n      d: tall ? TALL.defaultD : island ? ISLAND.defaultD : corner ? CORNER.defaultD : wall ? WALL.defaultD : 560,\n      y: wall ? WALL.mountY : 0,\n      x: x || 0,\n      z: z || 0,\n      rot: 0,\n      hand: \"left\",\n      run: \"main\",\n      // wall-run membership (main by default)\n      doors: 1,\n      // 1 = single door, 2 = a pair\n      ovCarcass: null,\n      ovFronts: null,\n      // finish exceptions; null = inherit the kitchen\n      /* L wall arms: 700 + 1000, both inside the validated wall width range\n         300-1000, so the L is unmistakable without inventing a new limit */\n      w2: corner || type === \"corner-wall\" ? type === \"corner-wall\" ? 1e3 : CORNER.defaultW : void 0,\n      /* the TALL L corner: the tall units' carcass height (TALL.defaultH), the base L's arms and depth */\n      ...type === \"corner-tall\" ? { h: TALL.defaultH } : {},\n      finish: \"white\",\n      doorFinish: \"white\",\n      frontFinish: \"white\",\n      door: type === \"base-drawer\" || corner || tall,\n      doorOpen: false,\n      drawerOpen: false,\n      /* island only: the two bays, and the finish exception for its applied\n         end panels and back (null = follow the kitchen FRONTS finish) */\n      /* default island: THREE 600 mm sections - drawers, doors, drawers -\n         giving a 1836 mm body including the two applied end panels */\n      bays: island ? [\n        { w: 600, kind: \"drawers\" },\n        { w: 600, kind: \"doors\" },\n        { w: 600, kind: \"drawers\" }\n      ] : void 0,\n      bayOpen: island ? [false, false, false] : void 0,\n      // one open/close per bay\n      shelves: tall ? TALL.shelves.def : void 0,\n      // pantry: adjustable\n      leafOpen: tall ? [false, false] : void 0,\n      // one per tall leaf\n      ovSkin: null,\n      /* a NEW island's end panels and back go to the floor (task 1791235365921); saved islands keep what they had */\n      skinDrop: island ? true : void 0,\n      drawers: [false, false, false, false]\n    };\n    if (src) {\n      [\"w\", \"h\", \"d\", \"y\", \"rot\", \"hand\", \"finish\", \"doorFinish\", \"frontFinish\", \"plinthFinish\", \"door\", \"doors\", \"run\", \"ovCarcass\", \"ovFronts\", \"ovSkin\", \"skinDrop\", \"hood\", \"hoodAbove\", \"hoodDx\"].forEach(function(k) {\n        u[k] = src[k];\n      });\n      if (src.ovPlinth) u.ovPlinth = JSON.parse(JSON.stringify(src.ovPlinth));\n      if (src.drawers) u.drawers = src.drawers.slice();\n      if (src.frontStyle) u.frontStyle = src.frontStyle;\n      if (src.shaker) u.shaker = { ...src.shaker };\n      if (src.pockets === 1 || src.pockets === 2 || src.pockets === 4) u.pockets = src.pockets;\n      if (src.ovStyle !== void 0) u.ovStyle = src.ovStyle;\n      if (src.ovShaker) u.ovShaker = { ...src.ovShaker };\n      if (src.frontMat) u.frontMat = src.frontMat;\n      if (src.ovGola === \"off\") u.ovGola = \"off\";\n      if (src.gola && typeof src.gola === \"object\") u.gola = { ...src.gola };\n      if (Array.isArray(src.boxH)) u.boxH = src.boxH.slice();\n      if (Array.isArray(src.dfH)) u.dfH = src.dfH.slice();\n      if (src.drawerFronts === false) u.drawerFronts = false;\n      if (Number(src.doorH) > 0) u.doorH = Number(src.doorH);\n      if (Array.isArray(src.xdr) && src.xdr.length)\n        u.xdr = src.xdr.map(function(r) {\n          return { n: r.n, band: r.band, col: r.col, y: r.y, fh: r.fh, bh: r.bh == null ? null : r.bh };\n        });\n      if (src.bayDoors === false) u.bayDoors = false;\n      if (Array.isArray(src.cutouts) && src.cutouts.length)\n        u.cutouts = src.cutouts.map(function(c) {\n          return { ...c, pts: (c.pts || []).map(function(p) {\n            return Array.isArray(p) ? p.slice() : p;\n          }) };\n        });\n      if (src.fixing === \"cabineo\" || src.fixing === \"screws\") u.fixing = src.fixing;\n      if (src.paint) u.paint = { ...src.paint };\n      if (src.interior) {\n        u.interior = {\n          shelves: src.interior.shelves,\n          vDiv: (src.interior.vDiv || []).slice(),\n          hDiv: (src.interior.hDiv || []).slice()\n        };\n        u.interior.dividers = u.interior.vDiv;\n        if (Array.isArray(src.interior.vSb)) u.interior.vSb = src.interior.vSb.slice();\n        if (Array.isArray(src.interior.hSb)) u.interior.hSb = src.interior.hSb.slice();\n        if (src.interior.shelfList)\n          u.interior.shelfList = cloneShelfList(src.interior.shelfList);\n      }\n      if (Array.isArray(src.cornerShelves)) u.cornerShelves = cloneCornerShelves(src.cornerShelves);\n      if (tall) {\n        if (src.shelves != null) u.shelves = src.shelves;\n        if (src.leafOpen) u.leafOpen = src.leafOpen.slice();\n      }\n      if (island && src.bays && src.bays.length >= 2 && src.bays.length <= 4)\n        u.bays = src.bays.map(function(x2) {\n          return typeof x2 === \"string\" ? { w: 600, kind: x2 } : { w: x2.w, kind: x2.kind };\n        });\n      u.w2 = src.w2 != null ? src.w2 : src.w;\n    }\n    if (type !== \"corner-l\" && type !== \"corner-wall\" && type !== \"corner-tall\") u.w2 = void 0;\n    if (type === \"base-4drawer\") u.door = false;\n    if (type === \"base-oven\") {\n      u.door = false;\n      if (u.hood !== true) {\n        delete u.hood;\n        delete u.hoodAbove;\n        delete u.hoodDx;\n      }\n    } else {\n      delete u.hood;\n      delete u.hoodAbove;\n      delete u.hoodDx;\n    }\n    if (island) islandSync(u);\n    return u;\n  }\n  function displayName(units, u) {\n    let i = 0;\n    for (let k = 0; k < units.length; k++) if (units[k].id === u.id) i = k;\n    return \"Cabinet \" + (i + 1);\n  }\n  var TYPE_NAME2 = {\n    \"base\": \"Base cabinet\",\n    \"base-drawer\": \"Base + top drawer\",\n    \"base-4drawer\": \"Four drawer base\",\n    \"wall\": \"Wall cabinet\",\n    \"corner-l\": \"L-shaped corner base\",\n    \"corner-blind\": \"Blind corner base\",\n    \"corner-wall\": \"L-shaped corner wall\",\n    \"corner-tall\": \"L-shaped tall corner\",\n    \"island\": \"Kitchen island\",\n    \"tall-pantry\": \"Tall pantry\",\n    \"tall-fridge\": \"Fridge / freezer housing\",\n    \"tall-oven\": \"Oven tower\",\n    \"base-oven\": \"Oven + hob base\"\n  };\n  function typeName(u) {\n    return TYPE_NAME2[u.type] || \"Base cabinet\";\n  }\n  function armB2(u) {\n    if (u.type === \"island\") return islandBayList(u);\n    if (isTall(u)) return tallShelves(u);\n    return u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\" ? armB(u) : void 0;\n  }\n  function priceKey(u) {\n    return u.type === \"base-4drawer\" || u.type === \"corner-l\" || u.type === \"corner-blind\" || u.type === \"corner-wall\" || u.type === \"corner-tall\" || u.type === \"island\" || u.type === \"base-oven\" || isTall(u) ? u.type : u.family;\n  }\n  function unitLabel(u) {\n    if (isTall(u))\n      return typeName(u) + \" \" + u.w + \" \\xD7 \" + u.h + \" \\xD7 \" + u.d + \" mm (\" + (u.h + LEG_H) + \" mm overall on \" + LEG_H + \" mm legs\" + (u.type === \"tall-pantry\" ? \", \" + tallShelves(u) + \" shelves\" : \"\") + \")\";\n    if (u.type === \"island\") {\n      const L = islandBayList(u);\n      return typeName(u) + \" \" + islandBodyW(L) + \" \\xD7 \" + u.h + \" \\xD7 \" + u.d + \" mm (\" + L.length + \" sections: \" + L.map(function(x) {\n        return x.w + \" \" + x.kind;\n      }).join(\", \") + \")\";\n    }\n    if (u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\")\n      return typeName(u) + \" \" + armA(u) + \" + \" + armB(u) + \" arms, \" + u.d + \" deep, \" + u.h + \" high\";\n    if (u.type === \"base-oven\")\n      return typeName(u) + \" \" + u.w + \"\\xD7\" + u.h + \"\\xD7\" + u.d + \" (Bosch HHF113BR0B oven, PUE611BB5B hob\" + (u.hood ? \", DWP64BC50B hood\" : \"\") + \")\";\n    if (u.type === \"corner-blind\")\n      return typeName(u) + \" \" + u.w + \"\\xD7\" + u.h + \"\\xD7\" + u.d + \" (\" + (u.hand === \"right\" ? \"right\" : \"left\") + \"-hand)\";\n    return typeName(u) + \" \" + u.w + \"\\xD7\" + u.h + \"\\xD7\" + u.d;\n  }\n\n  // v2/src/model/tall.js\n  var TALL = {\n    limits: { w: [WIDTH_MIN, WIDTH_MAX], h: [1970, 2150], d: [300, 650] },\n    defaultW: 600,\n    defaultH: 1970,\n    defaultD: 560,\n    heights: [1970, 2150],\n    // carcass; add the 150 mm legs for overall\n    shelves: { min: 2, max: 8, def: 5 },\n    // pantry, adjustable\n    /* PROVISIONAL planning figures, shown as \"to confirm\" everywhere: */\n    ovenNicheH: 595,\n    // single-oven cavity, model dependent\n    ovenNicheY: 870,\n    // cavity floor - a usable working height\n    fridgeSplit: 0.68,\n    // fridge over freezer, front split to confirm\n    ventGap: 40\n    // service gap left at the back of a housing\n  };\n  function isTall(u) {\n    return !!u && (u.type === \"tall-pantry\" || u.type === \"tall-fridge\" || u.type === \"tall-oven\");\n  }\n  function isHousing(u) {\n    return !!u && (u.type === \"tall-fridge\" || u.type === \"tall-oven\");\n  }\n  function tallShelves(u) {\n    const n = u && u.shelves != null ? u.shelves : TALL.shelves.def;\n    return clamp4(Math.round(n), TALL.shelves.min, TALL.shelves.max);\n  }\n  function ovenNiche(u) {\n    const H2 = u.h, h = Math.min(TALL.ovenNicheH, H2 - 2 * T - 300);\n    const y0 = clamp4(TALL.ovenNicheY, T + 150, H2 - T - h - 150);\n    return { y0, y1: y0 + h, h };\n  }\n  function fridgeSplitY(u) {\n    const inner0 = T, inner1 = u.h - T;\n    return Math.round(inner0 + (inner1 - inner0) * TALL.fridgeSplit);\n  }\n  function tallParts(u) {\n    const W2 = u.w, H2 = u.h, D2 = u.d, p = [];\n    function box3(n, x0, x1, y0, y1, z0, z1, ex) {\n      p.push({ name: n, x0, x1, y0, y1, z0, z1, ex, role: \"board\" });\n    }\n    box3(\"Side L\", 0, T, 0, H2, 0, D2, [-1, 0, 0]);\n    box3(\"Side R\", W2 - T, W2, 0, H2, 0, D2, [1, 0, 0]);\n    box3(\"Bottom\", T, W2 - T, 0, T, 0, D2, [0, -1, 0]);\n    box3(\"Top\", T, W2 - T, H2 - T, H2, 0, D2, [0, 1, 0]);\n    const sh = function(name2, y) {\n      box3(\n        name2,\n        T + SHELF_SIDE_GAP,\n        W2 - T - SHELF_SIDE_GAP,\n        y,\n        y + T,\n        3,\n        D2 - SHELF_FRONT_SETBACK,\n        [0, 0, 1]\n      );\n    };\n    if (u.type === \"tall-pantry\") {\n      box3(\"Back\", T, W2 - T, T, H2 - T, 0, 3, [0, 0, -1]);\n      const n = tallShelves(u), inner0 = T, inner1 = H2 - T;\n      for (let i = 1; i <= n; i++)\n        sh(\"Shelf \" + i, Math.round(inner0 + (inner1 - inner0) * i / (n + 1)));\n    } else if (u.type === \"tall-fridge\") {\n      box3(\"Back brace top\", T, W2 - T, H2 - T - 200, H2 - T, 0, 3, [0, 0, -1]);\n      box3(\"Back brace bottom\", T, W2 - T, T, T + 200, 0, 3, [0, 0, -1]);\n      sh(\"Fixed deck\", fridgeSplitY(u));\n    } else {\n      const nz = ovenNiche(u);\n      box3(\"Back upper\", T, W2 - T, nz.y1, H2 - T, 0, 3, [0, 0, -1]);\n      box3(\"Back lower\", T, W2 - T, T, nz.y0, 0, 3, [0, 0, -1]);\n      sh(\"Deck under oven\", nz.y0 - T);\n      sh(\"Deck over oven\", nz.y1);\n      sh(\"Shelf above\", Math.round((nz.y1 + H2 - T) / 2));\n      sh(\"Shelf below\", Math.round((T + nz.y0) / 2));\n    }\n    return p;\n  }\n  function tallLeaves(u) {\n    return tallLeafBands(u, tallLeavesRaw(u).map(function(lf, li) {\n      lf.li = li;\n      return lf;\n    }));\n  }\n  function tallLeavesRaw(u) {\n    const H2 = u.h, out = [];\n    if (u.type === \"tall-pantry\") {\n      const mid = Math.round(H2 / 2);\n      out.push({ name: \"Lower door\", y0: REVEAL, y1: mid - REVEAL / 2 });\n      out.push({ name: \"Upper door\", y0: mid + REVEAL / 2, y1: H2 - REVEAL });\n    } else if (u.type === \"tall-fridge\") {\n      const sp = fridgeSplitY(u);\n      out.push({ name: \"Freezer front\", y0: REVEAL, y1: sp - REVEAL / 2, appliance: true });\n      out.push({ name: \"Fridge front\", y0: sp + REVEAL / 2, y1: H2 - REVEAL, appliance: true });\n    } else {\n      const nz = ovenNiche(u);\n      out.push({ name: \"Lower door\", y0: REVEAL, y1: nz.y0 - T - REVEAL });\n      out.push({ name: \"Upper door\", y0: nz.y1 + REVEAL, y1: H2 - REVEAL });\n    }\n    return out;\n  }\n  function tallProvisos(u) {\n    const out = [];\n    if (u.type === \"tall-fridge\")\n      out.push(\n        \"appliance model required\",\n        \"niche size and ventilation to confirm\",\n        \"front split and fixings to confirm\"\n      );\n    else if (u.type === \"tall-oven\")\n      out.push(\n        \"appliance model required\",\n        \"oven niche is model dependent - to confirm\",\n        \"ventilation and fixings to confirm\"\n      );\n    else\n      out.push(\"tall door split and hinge specification to confirm\");\n    return out;\n  }\n\n  // v2/src/model/limits.js\n  function structuralWidthMin(u) {\n    if (!u) return WIDTH_MIN;\n    if (u.type === \"tall-oven\" || u.type === \"tall-fridge\") return APPLIANCE_MIN_W;\n    if (u.type === \"base-oven\") return OVEN_BASE.limits.w[0];\n    if (u.type === \"base-drawer\" || u.type === \"base-4drawer\") return DRAWER_MIN_W;\n    return WIDTH_MIN;\n  }\n  function limitsFor(u) {\n    if (!u) return LIMITS;\n    if (u.type === \"island\") return ISLAND.limits;\n    if (u.type === \"base-oven\") return OVEN_BASE.limits;\n    if (isTall(u)) return TALL.limits;\n    if (u.type === \"corner-wall\") return CORNER.wallArmLimits;\n    if (u.type === \"corner-tall\") return CORNER_TALL.limits;\n    if (u.family === \"wall\") return WALL.limits;\n    if (u.type === \"corner-l\") return CORNER.lLimits;\n    if (u.family === \"corner\") return CORNER.limits;\n    return LIMITS;\n  }\n  function maxCornerDepth(u) {\n    if (u && u.type === \"corner-wall\")\n      return Math.min(WALL.limits.d[1], Math.min(armA(u), armB(u)) - CORNER.minOpening);\n    if (u && u.type === \"corner-tall\")\n      return Math.min(CORNER_TALL.limits.d[1], Math.min(armA(u), armB(u)) - CORNER.minOpening);\n    return Math.min(\n      CORNER.lLimits.d[1],\n      Math.min(armA(u), armB(u)) - CORNER.minOpening\n    );\n  }\n\n  // v2/src/model/explode.js\n  function exOff(b, off) {\n    if (!off || !b || !b.ex || EXPLODE_FIXED[b.name]) return [0, 0, 0];\n    return [b.ex[0] * off, b.ex[1] * off, b.ex[2] * off];\n  }\n  function explodeMM(u) {\n    const e = u && u.explode;\n    if (!e) return 0;\n    if (e === true) return EXPLODE_MM;\n    return Math.max(0, Math.min(1, e)) * EXPLODE_MAX;\n  }\n  function spreadAxisFor(u) {\n    if (u && u.run === \"return\" && ROOM.ret) return ROOM.ret.axis === \"x\" ? \"z\" : \"x\";\n    return \"x\";\n  }\n  function applySpread(units, off) {\n    if (!units) return units;\n    units.forEach(function(u) {\n      u.dispX = 0;\n      u.dispY = 0;\n      u.dispZ = 0;\n    });\n    if (!off) return units;\n    const CLEAR = off * 0.45;\n    const groups = {};\n    units.forEach(function(u) {\n      const ax = spreadAxisFor(u);\n      const key = levelKey(u) + \"|\" + ax;\n      (groups[key] = groups[key] || { ax, list: [] }).list.push(u);\n    });\n    Object.keys(groups).forEach(function(key) {\n      const g2 = groups[key], ax = g2.ax;\n      const lo = function(u) {\n        const f = foot(u);\n        return (ax === \"x\" ? f.x0 : f.z0) - off;\n      };\n      const hi = function(u) {\n        const f = foot(u);\n        return (ax === \"x\" ? f.x1 : f.z1) + off;\n      };\n      const list = g2.list.slice().sort(function(a, b) {\n        return lo(a) - lo(b);\n      });\n      let cursor = null;\n      for (let i = 0; i < list.length; i++) {\n        const u = list[i];\n        const loU = lo(u), hiU = hi(u);\n        let shift = 0;\n        if (cursor !== null && loU < cursor) shift = cursor - loU;\n        if (ax === \"x\") u.dispX = shift;\n        else u.dispZ = shift;\n        cursor = hiU + shift + CLEAR;\n      }\n    });\n    return units;\n  }\n\n  // v2/src/model/fronts.js\n  function doorTransform(W2, D2, angleRad) {\n    const hx = REVEAL, hz = D2;\n    const c = Math.cos(angleRad), sn = Math.sin(angleRad);\n    return {\n      p: function(p) {\n        const dx = p[0] - hx, dz = p[2] - hz;\n        return [hx + dx * c - dz * sn, p[1], hz + dx * sn + dz * c];\n      },\n      n: function(n) {\n        return [n[0] * c - n[2] * sn, n[1], n[0] * sn + n[2] * c];\n      }\n    };\n  }\n  function swingLeavesRoom(u, sign) {\n    if (!roomOn()) return false;\n    const sz = roomSize(), D2 = u.d, H2 = u.h || 0, W2 = u.w;\n    const hx = sign > 0 ? REVEAL : W2 - REVEAL;\n    const span2 = doorLeaves(u) === 2 ? (W2 - 3 * REVEAL) / 2 : W2 - 2 * REVEAL;\n    const sw = swingXf(hx, D2, sign * DOOR_OPEN_DEG * Math.PI / 180), xf = unitXf(u);\n    const xs = sign > 0 ? [hx, hx + span2] : [hx - span2, hx];\n    const E = 1;\n    for (const x of xs) for (const z of [D2, D2 + T]) {\n      const p = xf.p(sw.p([x, H2 / 2, z]));\n      if (p[0] < -E || p[0] > sz.width + E || p[2] < -E || p[2] > sz.depth + E) return true;\n    }\n    return false;\n  }\n  function hingeSideBlocked(u, sign) {\n    if (!u) return false;\n    const W2 = u.w, D2 = u.d, H2 = u.h || 0;\n    if (swingLeavesRoom(u, sign)) return true;\n    const reach = Math.min(W2, 600);\n    const p = unitXf(u).p([sign > 0 ? -40 : W2 + 40, H2 / 2, D2 + reach / 2]);\n    if (roomOn()) {\n      const sz = roomSize();\n      if (p[0] < 0 || p[0] > sz.width || p[2] < 0 || p[2] > sz.depth) return true;\n    }\n    const units = UB_SCENE && UB_SCENE.units || [];\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (!v || v.id === u.id) continue;\n      const y0 = v.family === \"wall\" ? v.y || 0 : (v.y || 0) - LEG_H;\n      const yw = (u.y || 0) + H2 / 2;\n      if (yw < y0 || yw > (v.y || 0) + v.h) continue;\n      const boxes = footBoxes(v) || [];\n      for (let k = 0; k < boxes.length; k++) {\n        const r = boxes[k];\n        if (p[0] >= r.x0 && p[0] <= r.x1 && p[2] >= r.z0 && p[2] <= r.z1) return true;\n      }\n    }\n    return false;\n  }\n  function doorSwingRad(u, sign) {\n    const deg = hingeSideBlocked(u, sign) ? Math.min(90, DOOR_OPEN_DEG) : DOOR_OPEN_DEG;\n    return deg * Math.PI / 180;\n  }\n  function doorSwingXf(u, hx, sign) {\n    const D2 = u.d;\n    if (hingeSideBlocked(u, sign)) return swingXf(hx, D2 + T, sign * Math.PI / 2);\n    return swingXf(hx, D2, sign * DOOR_OPEN_DEG * Math.PI / 180);\n  }\n  function openFrontBox(u, p) {\n    const xf = unitXf(u), b = p.basis, L = p.local;\n    let lo = null, hi = null;\n    const xs = [L.x0, L.x1];\n    for (let ix = 0; ix < xs.length; ix++) {\n      const x = xs[ix];\n      const ys = [L.y0, L.y1];\n      for (let iy = 0; iy < ys.length; iy++) {\n        const y = ys[iy];\n        const zs = [L.z0, L.z1];\n        for (let iz = 0; iz < zs.length; iz++) {\n          const z = zs[iz];\n          const q = [\n            b.o[0] + b.ex[0] * x + b.ey[0] * y + b.ez[0] * z,\n            b.o[1] + b.ex[1] * x + b.ey[1] * y + b.ez[1] * z,\n            b.o[2] + b.ex[2] * x + b.ey[2] * y + b.ez[2] * z\n          ];\n          const w = xf.p(q);\n          if (!lo) {\n            lo = w.slice();\n            hi = w.slice();\n            continue;\n          }\n          for (let i = 0; i < 3; i++) {\n            if (w[i] < lo[i]) lo[i] = w[i];\n            if (w[i] > hi[i]) hi[i] = w[i];\n          }\n        }\n      }\n    }\n    return { x0: lo[0], y0: lo[1], z0: lo[2], x1: hi[0], y1: hi[1], z1: hi[2] };\n  }\n  function rayHitsOpenFront(u, p, ray) {\n    const xf = unitXf(u);\n    const o = xf.p([0, 0, 0]), ax = xf.p([1, 0, 0]), ay = xf.p([0, 1, 0]), az = xf.p([0, 0, 1]);\n    const E = [\n      [ax[0] - o[0], ax[1] - o[1], ax[2] - o[2]],\n      [ay[0] - o[0], ay[1] - o[1], ay[2] - o[2]],\n      [az[0] - o[0], az[1] - o[1], az[2] - o[2]]\n    ];\n    function toLocal2(v, point) {\n      const w = point ? [v[0] - o[0], v[1] - o[1], v[2] - o[2]] : v;\n      return [\n        w[0] * E[0][0] + w[1] * E[0][1] + w[2] * E[0][2],\n        w[0] * E[1][0] + w[1] * E[1][1] + w[2] * E[1][2],\n        w[0] * E[2][0] + w[1] * E[2][1] + w[2] * E[2][2]\n      ];\n    }\n    const B = p.basis;\n    function toFront(v, point) {\n      const w = point ? [v[0] - B.o[0], v[1] - B.o[1], v[2] - B.o[2]] : v;\n      return [\n        w[0] * B.ex[0] + w[1] * B.ex[1] + w[2] * B.ex[2],\n        w[0] * B.ey[0] + w[1] * B.ey[1] + w[2] * B.ey[2],\n        w[0] * B.ez[0] + w[1] * B.ez[1] + w[2] * B.ez[2]\n      ];\n    }\n    const ro = toFront(toLocal2(ray.o, true), true), rd = toFront(toLocal2(ray.d, false), false);\n    const L = p.local, lo = [L.x0, L.y0, L.z0], hi = [L.x1, L.y1, L.z1];\n    let tn = -Infinity, tf = Infinity;\n    for (let i = 0; i < 3; i++) {\n      if (Math.abs(rd[i]) < 1e-12) {\n        if (ro[i] < lo[i] || ro[i] > hi[i]) return null;\n        continue;\n      }\n      let t1 = (lo[i] - ro[i]) / rd[i], t2 = (hi[i] - ro[i]) / rd[i];\n      if (t1 > t2) {\n        const tt = t1;\n        t1 = t2;\n        t2 = tt;\n      }\n      if (t1 > tn) tn = t1;\n      if (t2 < tf) tf = t2;\n      if (tn > tf) return null;\n    }\n    if (tf < 0) return null;\n    return tn >= 0 ? tn : tf;\n  }\n  function bankIndexOf(u, p) {\n    const bank = drawer4Parts(u) || [], out = Array.isArray(u.dOut) ? u.dOut : [];\n    for (let i = 0; i < bank.length; i++) {\n      const q = bank[i];\n      if (out.indexOf(i) >= 0) continue;\n      if (p.kind === \"drawer-front\" && (q.name || \"Drawer front \" + (i + 1)) === p.name) return i;\n      if (p.kind === \"drawer-box\" && (q.name || \"Drawer \" + (i + 1)) + \" box\" === p.name) return i;\n    }\n    return -1;\n  }\n  function openFrontParts(u) {\n    if (!u) return [];\n    const swung = !!(u.door && u.doorOpen);\n    const bank4 = u.type === \"base-4drawer\";\n    const slid = !bank4 && !!(u.drawerOpen || u.drawers && u.drawers[0]);\n    const slid4 = bank4 && Array.isArray(u.drawers) && u.drawers.some(Boolean);\n    const xslid = !!(Array.isArray(u.xopen) && u.xopen.length);\n    const tall = !!(isTall(u) && u.door);\n    if (!swung && !slid && !slid4 && !tall && !xslid) return [];\n    const shut = {};\n    for (const k in u) if (Object.prototype.hasOwnProperty.call(u, k)) shut[k] = u[k];\n    shut.doorOpen = false;\n    shut.drawerOpen = false;\n    shut.drawers = null;\n    shut.xopen = [];\n    const W2 = u.w, D2 = u.d;\n    const ang = DOOR_OPEN_DEG * Math.PI / 180;\n    const twoLeaf = doorLeaves(u) === 2;\n    const out = [];\n    function basisOf2(xf) {\n      const o = xf.p([0, 0, 0]);\n      const ax = xf.p([1, 0, 0]), ay = xf.p([0, 1, 0]), az = xf.p([0, 0, 1]);\n      return {\n        o,\n        ex: [ax[0] - o[0], ax[1] - o[1], ax[2] - o[2]],\n        ey: [ay[0] - o[0], ay[1] - o[1], ay[2] - o[2]],\n        ez: [az[0] - o[0], az[1] - o[1], az[2] - o[2]]\n      };\n    }\n    function push(name2, kind, b, xf, openFlag) {\n      out.push({\n        pid: u.id + \":\" + kind + \":\" + name2,\n        unitId: u.id,\n        name: name2,\n        kind,\n        label: PART_KIND_LABEL[kind] || \"Part\",\n        material: partMaterialOf(u, kind),\n        local: { x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1, z0: b.z0, z1: b.z1 },\n        mm: {\n          w: Math.round(Math.abs(b.x1 - b.x0)),\n          h: Math.round(Math.abs(b.y1 - b.y0)),\n          d: Math.round(Math.abs(b.z1 - b.z0))\n        },\n        ex: [0, 0, 0],\n        exFixed: true,\n        open: !!openFlag,\n        basis: basisOf2(xf)\n      });\n    }\n    if (isCornerUnit(u) && u.door && u.doorOpen) {\n      (cornerDoorSlabs(u) || []).forEach(function(sl) {\n        push(\n          sl.name,\n          \"door\",\n          { x0: sl.x0, x1: sl.x1, y0: sl.y0, y1: sl.y1, z0: sl.z0, z1: sl.z1 },\n          swingXf(sl.hx, sl.hz, sl.sign * ang),\n          true\n        );\n      });\n      return out;\n    }\n    if (isTall(u) && u.door) {\n      (tallLeaves(u) || []).forEach(function(lf, k) {\n        const li = lf.li != null ? lf.li : k;\n        const open = !!(u.leafOpen && u.leafOpen[li]);\n        push(\n          lf.name,\n          \"door\",\n          { x0: REVEAL, x1: W2 - REVEAL, y0: lf.y0, y1: lf.y1, z0: D2, z1: D2 + T },\n          open ? doorSwingXf(u, REVEAL, 1) : doorTransform(W2, D2, 0),\n          open\n        );\n      });\n      return out;\n    }\n    cabinetParts(shut).forEach(function(p) {\n      let xf = null;\n      if (p.kind === \"door\" && swung) {\n        let hx = REVEAL, sign = 1;\n        if (twoLeaf) {\n          const mid = (p.local.x0 + p.local.x1) / 2;\n          if (mid > W2 / 2) {\n            hx = W2 - REVEAL;\n            sign = -1;\n          }\n        }\n        xf = doorSwingXf(u, hx, sign);\n      } else if ((p.kind === \"drawer-front\" || p.kind === \"drawer-box\") && (p.xn != null ? xdrOpen(u, p.xn) : bank4 ? !!(u.drawers && u.drawers[bankIndexOf(u, p)]) : slid)) {\n        const by = DRW.openBy;\n        xf = {\n          p: function(q) {\n            return [q[0], q[1], q[2] + by];\n          },\n          n: function(n) {\n            return n;\n          }\n        };\n      }\n      if (!xf) return;\n      const o = xf.p([0, 0, 0]);\n      const ax = xf.p([1, 0, 0]), ay = xf.p([0, 1, 0]), az = xf.p([0, 0, 1]);\n      out.push({\n        pid: p.pid,\n        unitId: u.id,\n        name: p.name,\n        kind: p.kind,\n        label: p.label,\n        xn: p.xn,\n        material: p.material,\n        local: p.local,\n        mm: p.mm,\n        ex: p.ex,\n        exFixed: p.exFixed,\n        open: true,\n        /* unit-LOCAL basis: the renderer applies it inside the\n           cabinet's own transform, exactly as the emitters do */\n        basis: {\n          o,\n          ex: [ax[0] - o[0], ax[1] - o[1], ax[2] - o[2]],\n          ey: [ay[0] - o[0], ay[1] - o[1], ay[2] - o[2]],\n          ez: [az[0] - o[0], az[1] - o[1], az[2] - o[2]]\n        }\n      });\n    });\n    return out;\n  }\n  function pickPartIn(u, rayHit) {\n    let best = null, bestT = Infinity;\n    const cp = cabinetParts(u);\n    for (let i = 0; i < cp.length; i++) {\n      const p = cp[i];\n      const t = rayHit(p.box);\n      if (t !== null && t < bestT) {\n        bestT = t;\n        best = p;\n      }\n    }\n    const op = openFrontParts(u);\n    for (let i = 0; i < op.length; i++) {\n      const p = op[i];\n      const t = rayHit.ray ? rayHitsOpenFront(u, p, rayHit.ray) : rayHit(openFrontBox(u, p));\n      if (t !== null && t < bestT) {\n        bestT = t;\n        best = p;\n      }\n    }\n    return best ? { part: best, t: bestT } : null;\n  }\n\n  // v2/src/model/resize.js\n  var RESIZE_SNAP = { on: 32, off: 70 };\n  function resizeSnapTargets(units, u, k, edge) {\n    const out = [];\n    (units || []).forEach(function(v) {\n      if (v.id === u.id || isIsland(v)) return;\n      if (!sameTierAs(v, u)) return;\n      if (k === \"h\") {\n        out.push({ at: (v.y || 0) + v.h, why: \"top\", other: v });\n        out.push({ at: v.y || 0, why: \"bottom\", other: v });\n      } else {\n        const f = foot(v), ax = resizeAxisOf(u, k).world;\n        out.push({ at: ax === \"x\" ? f.x0 : f.z0, why: \"edge\", other: v });\n        out.push({ at: ax === \"x\" ? f.x1 : f.z1, why: \"edge\", other: v });\n      }\n    });\n    return out;\n  }\n  function sameTierAs(a, b) {\n    return sameLevel(a, b);\n  }\n  function resizeSnap(units, u, k, want, edge, base, held) {\n    const fixed = edge === \"lo\" ? base.hi : base.lo;\n    const targets = resizeSnapTargets(units, u, k, edge);\n    let best = null;\n    for (let i = 0; i < targets.length; i++) {\n      const t = targets[i];\n      let size3 = edge === \"lo\" ? fixed - t.at : t.at - fixed;\n      if (k === \"h\") size3 = edge === \"lo\" ? base.hi - t.at : t.at - base.lo;\n      if (!(size3 > 0)) continue;\n      const d = Math.abs(size3 - want);\n      const key = k + \":\" + edge + \":\" + Math.round(t.at);\n      const limit = held && held === key ? RESIZE_SNAP.off : RESIZE_SNAP.on;\n      if (d > limit) continue;\n      if (!best || d < best.d) best = { d, size: Math.round(size3 * 10) / 10, key, why: t.why, other: t.other };\n    }\n    return best;\n  }\n  function resizeLimits(u, k) {\n    const L = limitsFor(u);\n    if (k === \"w\") return [Math.max(L.w[0], structuralWidthMin(u)), L.w[1]];\n    if (k === \"h\") return L.h;\n    if (k === \"d\") return [L.d[0], Math.max(\n      L.d[0],\n      u.family === \"corner\" || isLPlan(u) ? maxCornerDepth(u) : L.d[1]\n    )];\n    if (k === \"w2\") return L.w2 || L.w;\n    return L.w;\n  }\n  function resizeAxisOf(u, k) {\n    const xf = planXf(u, 1, 1);\n    if (k === \"h\") return { world: \"y\", dir: [0, 1, 0] };\n    const loc = k === \"d\" ? [0, 0, 1] : [1, 0, 0];\n    const n = xf.n(loc);\n    return { world: Math.abs(n[0]) > Math.abs(n[2]) ? \"x\" : \"z\", dir: n };\n  }\n  function resizeApply(u, k, v, edge, base) {\n    if (k === \"h\") {\n      if (edge === \"lo\" && u.family !== \"wall\") {\n        const top = base && base.hi != null ? base.hi : (u.y || 0) + u.h;\n        u.h = v;\n        u.y = top - v;\n        return;\n      }\n      u.h = v;\n      return;\n    }\n    if (k === \"w2\") {\n      u.w2 = v;\n      return;\n    }\n    if (k === \"w\") u.w = v;\n    else if (k === \"d\") u.d = v;\n    const ax = resizeAxisOf(u, k).world;\n    const f = foot(u);\n    const lo0 = ax === \"x\" ? base.lo : base.lo, hi0 = base.hi;\n    if (edge === \"lo\") {\n      const curHi = ax === \"x\" ? f.x1 : f.z1;\n      if (ax === \"x\") u.x += hi0 - curHi;\n      else u.z += hi0 - curHi;\n    } else {\n      const curLo = ax === \"x\" ? f.x0 : f.z0;\n      if (ax === \"x\") u.x += lo0 - curLo;\n      else u.z += lo0 - curLo;\n    }\n  }\n  function resizeLegal(units, u, zonesBefore) {\n    if (behindWall(u, u.x, u.z)) return false;\n    if (newZoneOf(u, zonesBefore)) return false;\n    return !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n  }\n  function zonesHeld(u) {\n    const out = /* @__PURE__ */ new Set();\n    for (const z of openingZones()) if (unitInZone(u, z)) out.add(z.op.id);\n    return out;\n  }\n  function newZoneOf(u, before) {\n    for (const z of openingZones()) if (!(before && before.has(z.op.id)) && unitInZone(u, z)) return z;\n    return null;\n  }\n  function resizeClamp(units, u, k, want, edge, base) {\n    const lim = resizeLimits(u, k);\n    let lo = Math.max(lim[0], 1), hi = clamp4(want, lim[0], lim[1]);\n    const snap3 = { x: u.x, z: u.z, w: u.w, w2: u.w2, h: u.h, d: u.d };\n    const held = zonesHeld(u);\n    function test(v) {\n      resizeApply(u, k, v, edge, base);\n      const ok2 = resizeLegal(units, u, held);\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.w = snap3.w;\n      u.w2 = snap3.w2;\n      u.h = snap3.h;\n      u.d = snap3.d;\n      return ok2;\n    }\n    if (test(hi)) return hi;\n    if (!test(lo)) return null;\n    for (let i = 0; i < 24 && hi - lo > 1; i++) {\n      const mid = (lo + hi) / 2;\n      if (test(mid)) lo = mid;\n      else hi = mid;\n    }\n    let w0 = Math.floor(lo);\n    for (let b = 1; b <= 3; b++) {\n      if (test(w0 + b)) w0 = w0 + b;\n      else break;\n    }\n    if (k !== \"h\" && base) {\n      const ts = resizeSnapTargets(units, u, k, edge);\n      for (let i = 0; i < ts.length; i++) {\n        const c = Math.round((edge === \"lo\" ? base.hi - ts[i].at : ts[i].at - base.lo) * 10) / 10;\n        if (c !== w0 && Math.abs(c - w0) < 1 && c <= hi && c >= lim[0] && test(c)) {\n          resizeApply(u, k, c, edge, base);\n          const touching = (units || []).some(function(v) {\n            return v.id !== u.id && sameLevel(v, u) && contactGap(u, v) < 0.05;\n          });\n          u.x = snap3.x;\n          u.z = snap3.z;\n          u.w = snap3.w;\n          u.w2 = snap3.w2;\n          u.h = snap3.h;\n          u.d = snap3.d;\n          if (touching) {\n            w0 = c;\n            break;\n          }\n        }\n      }\n    }\n    return w0;\n  }\n  function contactGap(a, b) {\n    const A = footBoxes(a), B = footBoxes(b);\n    let best = Infinity;\n    for (let i = 0; i < A.length; i++) for (let j = 0; j < B.length; j++) {\n      const p = A[i], q = B[j];\n      const gx = Math.max(Math.min(q.x0, q.x1) - Math.max(p.x0, p.x1), Math.min(p.x0, p.x1) - Math.max(q.x0, q.x1), 0);\n      const gz = Math.max(Math.min(q.z0, q.z1) - Math.max(p.z0, p.z1), Math.min(p.z0, p.z1) - Math.max(q.z0, q.z1), 0);\n      const ov = Math.max(gx, gz);\n      if (ov < best) best = ov;\n    }\n    return best;\n  }\n  function resizeBase(u, k) {\n    const f = foot(u);\n    if (k === \"h\") return { lo: u.y || 0, hi: (u.y || 0) + u.h, size: u.h };\n    const ax = resizeAxisOf(u, k).world;\n    return {\n      lo: ax === \"x\" ? f.x0 : f.z0,\n      hi: ax === \"x\" ? f.x1 : f.z1,\n      size: k === \"w2\" ? armB(u) : u[k],\n      ax\n    };\n  }\n  function resizeFromEdge(units, u, k, want, edge) {\n    if (!u) return { ok: false, why: \"Nothing is selected.\" };\n    const base = resizeBase(u, k);\n    const snap3 = { x: u.x, z: u.z, w: u.w, w2: u.w2, h: u.h, d: u.d };\n    const held = zonesHeld(u);\n    const wantV = clamp4(want, resizeLimits(u, k)[0], resizeLimits(u, k)[1]);\n    resizeApply(u, k, wantV, edge, base);\n    const zoneAtWant = newZoneOf(u, held);\n    u.x = snap3.x;\n    u.z = snap3.z;\n    u.w = snap3.w;\n    u.w2 = snap3.w2;\n    u.h = snap3.h;\n    u.d = snap3.d;\n    const stop = zoneAtWant ? openingHit(zoneAtWant) : null;\n    const v = resizeClamp(units, u, k, want, edge, base);\n    if (v == null) {\n      return { ok: false, opening: stop, why: stop ? stop.label + (stop.kind === \"door\" ? \" keeps its doorway clear\" : \" would be covered\") + \" - nothing changed.\" : \"There is no room to resize it there - something is already against it.\" };\n    }\n    resizeApply(u, k, v, edge, base);\n    if (!resizeLegal(units, u, held)) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.w = snap3.w;\n      u.w2 = snap3.w2;\n      u.h = snap3.h;\n      u.d = snap3.d;\n      return { ok: false, why: \"That size would run into something - nothing changed.\" };\n    }\n    return { ok: true, value: v, clamped: v < wantV, wanted: Math.round(want), opening: v < wantV ? stop : null };\n  }\n  function pushChain(units, u, edge, axis) {\n    const s = edge === \"lo\" ? -1 : 1, out = [], seen = /* @__PURE__ */ new Set([u.id]);\n    const lo = (b) => axis === \"x\" ? b.x0 : b.z0, hi = (b) => axis === \"x\" ? b.x1 : b.z1;\n    const across0 = (b) => axis === \"x\" ? b.z0 : b.x0, across1 = (b) => axis === \"x\" ? b.z1 : b.x1;\n    let front = [u];\n    while (front.length) {\n      const next = [];\n      for (const a of front) {\n        const fa = foot(a), face2 = s > 0 ? hi(fa) : lo(fa);\n        for (const v of units) {\n          if (seen.has(v.id) || !sameLevel(v, u) || isLPlan(v) || isIsland(v)) continue;\n          const fv = foot(v), near2 = s > 0 ? lo(fv) : hi(fv);\n          if (Math.abs(near2 - face2) > 1) continue;\n          if (Math.min(across1(fv), across1(fa)) - Math.max(across0(fv), across0(fa)) <= 1) continue;\n          seen.add(v.id);\n          out.push(v);\n          next.push(v);\n        }\n      }\n      front = next;\n    }\n    return out;\n  }\n  function resizeWithPush(units, u, k, want, edge, origin) {\n    if (origin) for (const v of units) {\n      const o = origin[v.id];\n      if (o && v.id !== u.id) {\n        v.x = o.x;\n        v.z = o.z;\n      }\n    }\n    const rr = resizeFromEdge(units, u, k, want, edge);\n    if (k !== \"w\" || !rr.ok || !rr.clamped || rr.opening || isLPlan(u) || isIsland(u)) return rr;\n    const wantV = clamp4(want, resizeLimits(u, k)[0], resizeLimits(u, k)[1]);\n    const axis = resizeAxisOf(u, k).world, s = edge === \"lo\" ? -1 : 1;\n    const pushed = /* @__PURE__ */ new Set();\n    let size3 = rr.value, total = 0;\n    for (let round = 0; round < 12 && wantV - size3 > 0.5; round++) {\n      const need = wantV - size3;\n      const chain = pushChain(units, u, edge, axis);\n      if (!chain.length) break;\n      const base = resizeBase(u, k), size0 = size3;\n      const snapU = { x: u.x, z: u.z, w: u.w }, snapC = chain.map((v) => ({ v, x: v.x, z: v.z }));\n      const inChain = new Set(chain.map((v) => v.id).concat([u.id]));\n      const heldU = zonesHeld(u), heldC = new Map(chain.map((v) => [v.id, zonesHeld(v)]));\n      const put = (d) => {\n        u.x = snapU.x;\n        u.z = snapU.z;\n        u.w = snapU.w;\n        resizeApply(u, k, size0 + d, edge, base);\n        for (const c of snapC) {\n          c.v.x = c.x + (axis === \"x\" ? s * d : 0);\n          c.v.z = c.z + (axis === \"z\" ? s * d : 0);\n        }\n      };\n      const legal = () => {\n        for (const m of [u].concat(chain)) {\n          if (behindWall(m, m.x, m.z)) return false;\n          if (newZoneOf(m, m === u ? heldU : heldC.get(m.id))) return false;\n          if (units.some((v) => !inChain.has(v.id) && sameLevel(v, m) && overlaps(m, v))) return false;\n        }\n        return true;\n      };\n      let D2 = 0;\n      put(need);\n      if (legal()) D2 = need;\n      else {\n        let lo = 0, hi = need;\n        for (let i = 0; i < 24 && hi - lo > 0.25; i++) {\n          const m = (lo + hi) / 2;\n          put(m);\n          if (legal()) lo = m;\n          else hi = m;\n        }\n        D2 = Math.floor(lo);\n        put(D2 + 1);\n        if (D2 + 1 <= need && legal()) D2 = D2 + 1;\n      }\n      put(D2);\n      if (!legal()) {\n        put(0);\n        D2 = 0;\n      }\n      if (D2 <= 0) break;\n      for (const v of chain) pushed.add(v.id);\n      size3 = size0 + D2;\n      total += D2;\n    }\n    if (!total) return Object.assign(rr, { pushed: [], push: 0 });\n    return {\n      ok: true,\n      value: size3,\n      clamped: size3 < wantV - 0.5,\n      wanted: rr.wanted,\n      opening: null,\n      pushed: Array.from(pushed),\n      push: total\n    };\n  }\n\n  // v2/src/model/handles.js\n  function handleInset(extent) {\n    return 0;\n  }\n  function bodyMidY(u) {\n    const yBot = u.family === \"wall\" ? u.y || 0 : 0;\n    return yBot + (u.h || 0) / 2;\n  }\n  function frontSign(u, axis) {\n    const n = resizeAxisOf(u, \"d\").dir;\n    const c = axis === \"x\" ? n[0] : n[2];\n    return c < 0 ? -1 : 1;\n  }\n  function editHandles(u) {\n    if (!u || isIsland(u)) return [];\n    const out = [];\n    const f = foot(u);\n    const yBot = u.family === \"wall\" ? u.y || 0 : 0;\n    const yTop = (u.y || 0) + (u.h || 0);\n    const cx = (f.x0 + f.x1) / 2, cz = (f.z0 + f.z1) / 2, cy = bodyMidY(u);\n    function push(dim, edge, anchor, value, axis, label, dir) {\n      if (!dir) {\n        const s2 = edge === \"lo\" ? -1 : 1;\n        dir = axis === \"x\" ? [s2, 0, 0] : axis === \"y\" ? [0, s2, 0] : [0, 0, s2];\n      }\n      out.push({\n        hid: u.id + \":\" + dim + \":\" + (edge || \"only\"),\n        dir,\n        unitId: u.id,\n        kind: \"size\",\n        dim,\n        edge: edge || null,\n        anchor,\n        axis,\n        value: Math.round(value),\n        label: label || Math.round(value) + \" mm\"\n      });\n    }\n    if (isCornerUnit(u)) {\n      let exposedMid = function(loA, hiA, loB, hiB) {\n        const leftLo = loA, leftHi = Math.min(hiA, loB);\n        const rightLo = Math.max(loA, hiB), rightHi = hiA;\n        const lw = leftHi - leftLo, rw = rightHi - rightLo;\n        if (lw <= 1 && rw <= 1) return (loA + hiA) / 2;\n        return lw >= rw ? (leftLo + leftHi) / 2 : (rightLo + rightHi) / 2;\n      };\n      const boxes = footBoxes(u);\n      const a = boxes[0] || f, b = boxes[1] || f;\n      const aWide = a.x1 - a.x0 >= a.z1 - a.z0;\n      const bWide = b.x1 - b.x0 >= b.z1 - b.z0;\n      const aIns = handleInset(aWide ? a.x1 - a.x0 : a.z1 - a.z0);\n      const bIns = handleInset(bWide ? b.x1 - b.x0 : b.z1 - b.z0);\n      push(\n        \"w\",\n        null,\n        aWide ? [a.x1 - aIns, cy, (a.z0 + a.z1) / 2] : [(a.x0 + a.x1) / 2, cy, a.z1 - aIns],\n        armA(u),\n        aWide ? \"x\" : \"z\",\n        \"Arm \" + Math.round(armA(u)) + \" mm\"\n      );\n      push(\n        \"w2\",\n        null,\n        bWide ? [b.x1 - bIns, cy, (b.z0 + b.z1) / 2] : [(b.x0 + b.x1) / 2, cy, b.z1 - bIns],\n        armB(u),\n        bWide ? \"x\" : \"z\",\n        \"Arm \" + Math.round(armB(u)) + \" mm\"\n      );\n      const dAxC = aWide ? \"z\" : \"x\";\n      const dLoC = dAxC === \"x\" ? a.x0 : a.z0;\n      const dHiC = dAxC === \"x\" ? a.x1 : a.z1;\n      const dInsC = handleInset(dHiC - dLoC);\n      const dMid = dAxC === \"x\" ? exposedMid(a.z0, a.z1, b.z0, b.z1) : exposedMid(a.x0, a.x1, b.x0, b.x1);\n      const dSgnC = frontSign(u, dAxC);\n      const dAtC = dSgnC > 0 ? dHiC - dInsC : dLoC + dInsC;\n      push(\n        \"d\",\n        dSgnC > 0 ? \"hi\" : \"lo\",\n        dAxC === \"x\" ? [dAtC, cy, dMid] : [dMid, cy, dAtC],\n        u.d,\n        dAxC\n      );\n    } else {\n      const wAx = resizeAxisOf(u, \"w\").world;\n      const wLo = wAx === \"x\" ? f.x0 : f.z0, wHi = wAx === \"x\" ? f.x1 : f.z1;\n      const wIns = handleInset(wHi - wLo);\n      push(\n        \"w\",\n        \"lo\",\n        wAx === \"x\" ? [wLo + wIns, cy, cz] : [cx, cy, wLo + wIns],\n        u.w,\n        wAx\n      );\n      push(\n        \"w\",\n        \"hi\",\n        wAx === \"x\" ? [wHi - wIns, cy, cz] : [cx, cy, wHi - wIns],\n        u.w,\n        wAx\n      );\n      const dAx = resizeAxisOf(u, \"d\").world;\n      const dLo = dAx === \"x\" ? f.x0 : f.z0, dHi = dAx === \"x\" ? f.x1 : f.z1;\n      const dIns = handleInset(dHi - dLo);\n      const dSgn = frontSign(u, dAx);\n      const dAt = dSgn > 0 ? dHi - dIns : dLo + dIns;\n      push(\n        \"d\",\n        dSgn > 0 ? \"hi\" : \"lo\",\n        dAx === \"x\" ? [dAt, cy, cz] : [cx, cy, dAt],\n        u.d,\n        dAx\n      );\n    }\n    const hIns = handleInset(yTop - yBot);\n    let tBox = f;\n    if (isCornerUnit(u)) {\n      const tb = footBoxes(u);\n      if (tb && tb.length) tBox = tb[0];\n    }\n    const tcx = (tBox.x0 + tBox.x1) / 2, tcz = (tBox.z0 + tBox.z1) / 2;\n    out.push({\n      hid: u.id + \":h:hi\",\n      unitId: u.id,\n      kind: \"size\",\n      dim: \"h\",\n      edge: \"hi\",\n      anchor: [tcx, yTop, tcz],\n      axis: \"y\",\n      dir: [0, 1, 0],\n      value: Math.round(u.h),\n      label: Math.round(u.h) + \" mm\"\n    });\n    return out;\n  }\n\n  // v2/src/model/rows.js\n  function relayoutRow(units, family) {\n    const row = units.filter(function(u) {\n      return u.family === family;\n    }).sort(function(a, b) {\n      return a.x - b.x;\n    });\n    if (!row.length) return;\n    let cursor = row[0].x;\n    const z0 = row[0].z, y0 = row[0].y;\n    for (let i = 0; i < row.length; i++) {\n      const u = row[i];\n      u.x = cursor;\n      u.z = z0;\n      u.y = y0;\n      cursor += u.w;\n    }\n  }\n  function rowGroup(units, u, tol) {\n    tol = tol == null ? 120 : tol;\n    const fam = units.filter(function(v) {\n      return v.family === u.family;\n    }).sort(function(a, b) {\n      return a.x - b.x;\n    });\n    let i = -1;\n    for (let k = 0; k < fam.length; k++) if (fam[k].id === u.id) i = k;\n    if (i < 0) return [];\n    let st = i, en = i;\n    while (st > 0 && fam[st].x - (fam[st - 1].x + fam[st - 1].w) <= tol) st--;\n    while (en < fam.length - 1 && fam[en + 1].x - (fam[en].x + fam[en].w) <= tol) en++;\n    return fam.slice(st, en + 1);\n  }\n  function swapUnits(units, a, b, snapshot) {\n    if (!a || !b || a.id === b.id || a.family !== b.family) return false;\n    if (snapshot) {\n      units.forEach(function(u) {\n        const s0 = snapshot[u.id];\n        if (s0) {\n          u.x = s0.x;\n          u.z = s0.z;\n          u.y = s0.y;\n        }\n      });\n    }\n    let group = rowGroup(units, a);\n    let inGroup = false;\n    for (let i = 0; i < group.length; i++) {\n      const v = group[i];\n      if (v.id === b.id) inGroup = true;\n    }\n    if (!inGroup) {\n      group = units.filter(function(v) {\n        return v.family === a.family;\n      }).sort(function(m, n) {\n        return m.x - n.x;\n      });\n    }\n    let ia = -1, ib = -1;\n    for (let k = 0; k < group.length; k++) {\n      if (group[k].id === a.id) ia = k;\n      if (group[k].id === b.id) ib = k;\n    }\n    if (ia < 0 || ib < 0) return false;\n    const anchor = group[0].x;\n    const tmp = group[ia];\n    group[ia] = group[ib];\n    group[ib] = tmp;\n    let cursor = anchor;\n    for (let i = 0; i < group.length; i++) {\n      const u = group[i];\n      u.x = cursor;\n      cursor += u.w;\n    }\n    return true;\n  }\n  function rowNeighbour(units, u, dir) {\n    const row = units.filter(function(v) {\n      return v.family === u.family;\n    }).sort(function(a, b) {\n      return a.x - b.x;\n    });\n    let i = row.findIndex ? row.findIndex(function(v) {\n      return v.id === u.id;\n    }) : -1;\n    if (i < 0) {\n      for (let k = 0; k < row.length; k++) if (row[k].id === u.id) i = k;\n    }\n    const j = i + dir;\n    return j >= 0 && j < row.length ? row[j] : null;\n  }\n\n  // v2/src/model/upper-lower.js\n  var UL_TOL = 1;\n  var UL_NEAR = 26;\n  var UL_SNAP = { on: 26, off: 40 };\n  function ulTier(u) {\n    if (!u || u.type === \"island\" || isTall(u)) return null;\n    if (String(u.type).indexOf(\"corner\") === 0) return null;\n    return u.family === \"wall\" ? \"wall\" : \"base\";\n  }\n  function ulWallKey(u) {\n    const k = ((u.rot || 0) % 4 + 4) % 4;\n    if (u.run) return \"run:\" + u.run;\n    return \"face:\" + k;\n  }\n  function ulAxis(u) {\n    return (u.rot || 0) % 2 === 0 ? \"x\" : \"z\";\n  }\n  function ulEdges(u) {\n    const ax = ulAxis(u), fb = foot(u);\n    return [fb[ax + \"0\"], fb[ax + \"1\"]];\n  }\n  function upperLowerGuides(units, snapOn) {\n    if (!units) return [];\n    if (snapOn === void 0) snapOn = true;\n    const out = [], seen = {};\n    const bases = units.filter(function(v) {\n      return ulTier(v) === \"base\";\n    });\n    const walls = units.filter(function(v) {\n      return ulTier(v) === \"wall\";\n    });\n    bases.forEach(function(bu) {\n      walls.forEach(function(wu) {\n        if (ulWallKey(bu) !== ulWallKey(wu)) return;\n        if (ulAxis(bu) !== ulAxis(wu)) return;\n        const ax = ulAxis(bu);\n        const bE = ulEdges(bu), wE = ulEdges(wu);\n        if (Math.min(bE[1], wE[1]) - Math.max(bE[0], wE[0]) < -400) return;\n        [0, 1].forEach(function(i) {\n          [0, 1].forEach(function(j) {\n            const d0 = Math.abs(bE[i] - wE[j]);\n            const kind = d0 <= UL_TOL ? \"aligned\" : d0 <= UL_NEAR ? \"candidate\" : null;\n            if (kind === \"candidate\" && !snapOn) return;\n            if (!kind) return;\n            const at = Math.round((bE[i] + wE[j]) / 2 * 10) / 10;\n            const key = ax + \":\" + Math.round(at) + \":\" + (i === j ? \"same\" : \"cross\") + \":\" + kind;\n            if (seen[key]) return;\n            seen[key] = 1;\n            out.push({\n              axis: ax,\n              at,\n              y0: (bu.y || 0) + bu.h,\n              // top of the base cabinet\n              y1: wu.y || 0,\n              // underside of the wall cabinet\n              baseEdge: bE[i],\n              wallEdge: wE[j],\n              side: i === 0 ? \"left\" : \"right\",\n              kind,\n              baseId: bu.id,\n              wallId: wu.id,\n              off: d0\n            });\n          });\n        });\n      });\n    });\n    return out.filter(function(g2) {\n      return g2.y1 > g2.y0 + 20;\n    });\n  }\n  function ulPlaneFor(units, g2) {\n    let far = 0;\n    const arr = units || [];\n    for (let i = 0; i < arr.length; i++) {\n      const v = arr[i];\n      if (ulTier(v) === null || ulAxis(v) !== g2.axis) continue;\n      const fb = foot(v);\n      const per = g2.axis === \"x\" ? fb.z1 : fb.x1;\n      if (per > far) far = per;\n    }\n    return far + 30;\n  }\n  function ulSnapAlong(units, u, wantAlong, held) {\n    if (!units || ulTier(u) === null) return { at: wantAlong, key: null, cue: null };\n    const ax = ulAxis(u), fb = foot(u);\n    const span2 = fb[ax + \"1\"] - fb[ax + \"0\"], half = span2 / 2;\n    const wantLo = wantAlong - half, wantHi = wantAlong + half;\n    const want = ulTier(u) === \"wall\" ? \"base\" : \"wall\";\n    let best = null;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v.id === u.id || ulTier(v) !== want) continue;\n      if (ulWallKey(v) !== ulWallKey(u) || ulAxis(v) !== ax) continue;\n      const e = ulEdges(v);\n      const prs = [[\"left\", e[0]], [\"right\", e[1]]];\n      for (let j = 0; j < prs.length; j++) {\n        const pr = prs[j];\n        const mines = [[\"left\", wantLo], [\"right\", wantHi]];\n        for (let k = 0; k < mines.length; k++) {\n          const mine = mines[k];\n          const dist2 = Math.abs(pr[1] - mine[1]);\n          const key = v.id + \":\" + pr[0] + \":\" + mine[0];\n          const limit = held && held === key ? UL_SNAP.off : UL_SNAP.on;\n          if (dist2 > limit) continue;\n          const at = mine[0] === \"left\" ? pr[1] + half : pr[1] - half;\n          if (!best || dist2 < best.dist) best = { dist: dist2, at, key, side: pr[0] };\n        }\n      }\n    }\n    if (!best) return { at: wantAlong, key: null, cue: null };\n    return {\n      at: best.at,\n      key: best.key,\n      cue: \"Lined up with the \" + (want === \"base\" ? \"base\" : \"wall\") + \" cabinet \" + best.side + \" edge\"\n    };\n  }\n\n  // v2/src/model/runs.js\n  var RUN_GAP = 20;\n  function runTier(u) {\n    if (!u) return null;\n    if (u.type === \"island\" || isTall(u)) return null;\n    return u.family === \"wall\" ? \"wall\" : \"base\";\n  }\n  function runElevation(u) {\n    if (!u) return null;\n    const k = ((u.rot || 0) % 4 + 4) % 4;\n    if (u.run) return \"run:\" + u.run + \":\" + k;\n    const fb = foot(u);\n    const line = k % 2 === 0 ? Math.round(k === 0 ? fb.z0 : fb.z1) : Math.round(k === 1 ? fb.x0 : fb.x1);\n    return \"face:\" + k + \":\" + line;\n  }\n  function runAxisOf(u) {\n    return (u.rot || 0) % 2 === 0 ? \"x\" : \"z\";\n  }\n  function runMembers(units, u) {\n    const tier = runTier(u);\n    if (!tier || !units) return [];\n    const elev = runElevation(u), axis = runAxisOf(u);\n    const pool = units.filter(function(v) {\n      return runTier(v) === tier && runElevation(v) === elev;\n    }).sort(function(p, q) {\n      return foot(p)[axis + \"0\"] - foot(q)[axis + \"0\"];\n    });\n    const ids = pool.map(function(v) {\n      return v.id;\n    });\n    const i = ids.indexOf(u.id);\n    if (i < 0) return [u];\n    const out = [pool[i]];\n    let a, c;\n    for (a = i; a > 0; a--) {\n      if (foot(pool[a])[axis + \"0\"] - foot(pool[a - 1])[axis + \"1\"] > RUN_GAP) break;\n      out.unshift(pool[a - 1]);\n    }\n    for (c = i; c < pool.length - 1; c++) {\n      if (foot(pool[c + 1])[axis + \"0\"] - foot(pool[c])[axis + \"1\"] > RUN_GAP) break;\n      out.push(pool[c + 1]);\n    }\n    return out;\n  }\n  function runSibling(units, u) {\n    if (!u || !units) return [];\n    const want = runTier(u) === \"wall\" ? \"base\" : \"wall\";\n    const axis = runAxisOf(u), mine = foot(u);\n    const pool = units.filter(function(v) {\n      return runTier(v) === want && runAxisOf(v) === axis && foot(v)[axis + \"0\"] < mine[axis + \"1\"] + 1200 && foot(v)[axis + \"1\"] > mine[axis + \"0\"] - 1200;\n    });\n    return pool.length ? runMembers(units, pool[0]) : [];\n  }\n  function runRange(members, key) {\n    if (!members || !members.length) return null;\n    let lo = -Infinity, hi = Infinity;\n    for (let i = 0; i < members.length; i++) {\n      const v = members[i];\n      let lim = (limitsFor(v)[key] || limitsFor(v).w).slice();\n      if (key === \"d\" && v.family === \"corner\") lim = [lim[0], maxCornerDepth(v)];\n      lo = Math.max(lo, lim[0]);\n      hi = Math.min(hi, lim[1]);\n    }\n    return hi >= lo ? { min: Math.round(lo), max: Math.round(hi) } : null;\n  }\n  function runValue(members, key) {\n    if (!members || !members.length) return null;\n    const v0 = Math.round(members[0][key]);\n    for (let i = 1; i < members.length; i++)\n      if (Math.round(members[i][key]) !== v0) return null;\n    return v0;\n  }\n  function runDepthBlock(units, members) {\n    const c = members.filter(function(v) {\n      return v.family === \"corner\";\n    });\n    if (!c.length) return null;\n    const affected = [];\n    c.forEach(function(cc) {\n      (units || []).forEach(function(v) {\n        if (v.id !== cc.id && runTier(v) && affected.indexOf(v) < 0 && runElevation(v) !== runElevation(cc)) affected.push(v);\n      });\n    });\n    return \"This run turns a corner, and a corner's two arms share one depth - changing it here would move the \" + affected.length + \" cabinet\" + (affected.length === 1 ? \"\" : \"s\") + \" on the other wall as well. Set the corner's own depth first, then resize each wall.\";\n  }\n  function applyRunDim(units, members, key, value) {\n    if (!members || !members.length) return { ok: false, why: \"Nothing is selected.\" };\n    if (key === \"d\") {\n      const blk = runDepthBlock(units, members);\n      if (blk) return { ok: false, why: blk };\n    }\n    const rng = runRange(members, key);\n    if (!rng) return { ok: false, why: \"These cabinets have no size in common.\" };\n    const want = Math.round(value);\n    const v = clamp4(want, rng.min, rng.max);\n    const snap3 = (units || []).map(function(q) {\n      return { u: q, x: q.x, z: q.z, w: q.w, h: q.h, d: q.d, y: q.y, rot: q.rot };\n    });\n    function undo() {\n      snap3.forEach(function(r) {\n        r.u.x = r.x;\n        r.u.z = r.z;\n        r.u.w = r.w;\n        r.u.h = r.h;\n        r.u.d = r.d;\n        r.u.y = r.y;\n        r.u.rot = r.rot;\n      });\n    }\n    members.forEach(function(m) {\n      if (key === \"d\") {\n        const before = unitXf(m).p([0, 0, 0]);\n        m.d = v;\n        const after = unitXf(m).p([0, 0, 0]);\n        m.x -= after[0] - before[0];\n        m.z -= after[2] - before[2];\n      } else {\n        m.h = v;\n      }\n    });\n    if (!sceneValid(units)) {\n      undo();\n      return { ok: false, why: \"That size does not fit: something in the run would run into another cabinet or a wall, so nothing was changed.\" };\n    }\n    return { ok: true, value: v, clamped: v !== want, range: rng, n: members.length };\n  }\n\n  // v2/src/model/interior-place.js\n  var DIVIDER_CENTRE_SNAP = 6;\n  function basisOf(u) {\n    const xf = unitXf(u);\n    const o = xf.p([0, 0, 0]);\n    const ax = (v) => {\n      const q = xf.p(v);\n      return [q[0] - o[0], q[1] - o[1], q[2] - o[2]];\n    };\n    return { xf, o, ex: ax([1, 0, 0]), ey: ax([0, 1, 0]), ez: ax([0, 0, 1]) };\n  }\n  var dot2 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  function worldToLocal(u, p) {\n    const b = basisOf(u), d = [p[0] - b.o[0], p[1] - b.o[1], p[2] - b.o[2]];\n    return [dot2(d, b.ex), dot2(d, b.ey), dot2(d, b.ez)];\n  }\n  function localToWorld(u, p) {\n    return unitXf(u).p(p);\n  }\n  function rayToLocal(u, ray) {\n    const b = basisOf(u), d = [ray.o[0] - b.o[0], ray.o[1] - b.o[1], ray.o[2] - b.o[2]];\n    return { o: [dot2(d, b.ex), dot2(d, b.ey), dot2(d, b.ez)], d: [dot2(ray.d, b.ex), dot2(ray.d, b.ey), dot2(ray.d, b.ez)] };\n  }\n  function placeWhy(u) {\n    if (!u) return \"Point inside a cabinet.\";\n    if (isIsland(u)) return \"An island is shelved per section: choose the section in Inside, then use its controls.\";\n    return interiorWhy(u);\n  }\n  function interiorRayHit(u, ray) {\n    if (!u || !ray || placeWhy(u)) return null;\n    const B = interiorBounds(u);\n    if (!B || B.w <= 0 || B.h <= 0) return null;\n    const r = rayToLocal(u, ray);\n    const lo = [B.x0, B.y0, B.z0], hi = [B.x1, B.y1, B.z1];\n    let t0 = -Infinity, t1 = Infinity;\n    for (let i = 0; i < 3; i++) {\n      if (Math.abs(r.d[i]) < 1e-9) {\n        if (r.o[i] < lo[i] || r.o[i] > hi[i]) return null;\n        continue;\n      }\n      let a = (lo[i] - r.o[i]) / r.d[i], b = (hi[i] - r.o[i]) / r.d[i];\n      if (a > b) {\n        const s = a;\n        a = b;\n        b = s;\n      }\n      if (a > t0) t0 = a;\n      if (b < t1) t1 = b;\n    }\n    if (t1 < Math.max(t0, 0)) return null;\n    const t = Math.max(t0, 0);\n    return { t, p: [r.o[0] + r.d[0] * t, r.o[1] + r.d[1] * t, r.o[2] + r.d[2] * t], B };\n  }\n  function cellAt(u, B, lx, ly) {\n    const cs = cells(u);\n    for (let i = 0; i < cs.length; i++) {\n      const c = cs[i];\n      if (lx - B.x0 >= c.x0 && lx - B.x0 <= c.x1 && ly >= c.y0 && ly <= c.y1) return c;\n    }\n    return null;\n  }\n  function shelfGaps(u, cellKey, y, selfId) {\n    if (isCornerShelfUnit(u)) return cornerShelfGaps(u, y, selfId);\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const c = cells(u).filter((q) => shelfCellKey(q) === String(cellKey))[0];\n    if (!c) return null;\n    const y0 = B.y0 + y, y1 = y0 + T;\n    let floor = c.y0, ceil = c.y1;\n    for (const s of shelfListOf(u)) {\n      if (s.cell !== String(cellKey) || s.id === selfId) continue;\n      const a = B.y0 + s.y, b = a + T;\n      if (b <= y0 + 1e-3 && b > floor) floor = b;\n      if (a >= y1 - 1e-3 && a < ceil) ceil = a;\n    }\n    const x = B.x0 + (c.x0 + c.x1) / 2;\n    return { below: y0 - floor, above: ceil - y1, floor, ceil, y0, y1, x, cell: c };\n  }\n  function shelfBoxLocal(u, cellKey, y) {\n    const B = interiorBounds(u);\n    const c = cells(u).filter((q) => shelfCellKey(q) === String(cellKey))[0];\n    if (!B || !c) return null;\n    return {\n      x0: B.x0 + c.x0 + SHELF_SIDE_GAP,\n      x1: B.x0 + c.x1 - SHELF_SIDE_GAP,\n      y0: B.y0 + y,\n      y1: B.y0 + y + T,\n      z0: B.z0,\n      z1: B.z1\n    };\n  }\n  function bayName(u, c) {\n    const multiBand = bands(u).length > 1, multiCol = cells(u).length > 1;\n    if (!multiCol) return \"this cabinet\";\n    return \"bay \" + (c.col + 1) + (multiBand ? \" (level \" + (c.band + 1) + \")\" : \"\");\n  }\n  function shelfPlacement(u, lp) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to shelve.\" };\n    const c = cellAt(u, B, lp[0], lp[1]);\n    if (!c) return { ok: false, why: \"Point inside a bay - that is a divider or a fixed panel.\" };\n    const key = shelfCellKey(c);\n    const R4 = shelfRangeIn(u, key, null);\n    const bay = bayName(u, c);\n    if (!R4 || R4.max < R4.min) return { ok: false, why: \"This bay is too low for a shelf.\", cell: key, bay };\n    if (c.x1 - c.x0 - 2 * SHELF_SIDE_GAP <= 0) return { ok: false, why: \"This bay is too narrow for a shelf.\", cell: key, bay };\n    const mid = clamp4(lp[1] - B.y0, R4.lo, R4.hi);\n    const boards = R4.others.map((o) => [o.y, o.y + T]).sort((a, b2) => a[0] - b2[0]);\n    let gLo = R4.lo, gHi = R4.hi, onBoard = null;\n    for (const b2 of boards) {\n      if (mid >= b2[0] && mid <= b2[1]) {\n        onBoard = b2;\n        break;\n      }\n      if (b2[1] <= mid) gLo = Math.max(gLo, b2[1]);\n      else if (b2[0] < gHi) gHi = b2[0];\n    }\n    const free = { min: gLo + SHELF_CLEAR, max: gHi - SHELF_CLEAR - T };\n    const range = { min: Math.round(free.min), max: Math.round(free.max) };\n    const follow = Math.round(clamp4(mid - T / 2, R4.lo, R4.hi - T));\n    const refused = (why) => {\n      const base2 = { cell: key, y: follow, bay, range, ok: false, why };\n      base2.box = shelfBoxLocal(u, key, follow);\n      base2.gaps = shelfGaps(u, key, follow, null);\n      return base2;\n    };\n    if (onBoard) return refused(\"There is a shelf here already - move up or down into a free gap.\");\n    if (free.max < free.min)\n      return refused(\"This gap is only \" + Math.round(gHi - gLo) + \" mm - a shelf is \" + T + \" mm thick.\");\n    let y = system32Snap(clamp4(mid - T / 2, free.min, free.max));\n    if (y > free.max + 1e-3) y -= PIN_PITCH;\n    if (y < free.min - 1e-3) y += PIN_PITCH;\n    if (y < free.min - 1e-3 || y > free.max + 1e-3)\n      return refused(\"No shelf hole in this gap - shelves rest on pins every \" + PIN_PITCH + \" mm.\");\n    const base = { cell: key, y: Math.round(y), bay, range };\n    base.box = shelfBoxLocal(u, key, base.y);\n    base.gaps = shelfGaps(u, key, base.y, null);\n    if (!shelfYLegal(R4, base.y)) return refused(\"There is a shelf here already - move up or down into a free gap.\");\n    return Object.assign(base, { ok: true, why: null });\n  }\n  function shelfPlace(u, pl) {\n    if (!pl || !pl.ok) return { ok: false, why: pl && pl.why || \"Nothing to place.\" };\n    const R4 = shelfRangeIn(u, pl.cell, null);\n    if (!R4 || !shelfYLegal(R4, pl.y)) return { ok: false, why: \"That place is no longer free.\" };\n    const list = shelfListOf(u).map((s) => keepEdges(s, { id: s.id, cell: s.cell, y: s.y }));\n    const id = nextShelfId(list);\n    list.push({ id, cell: pl.cell, y: pl.y });\n    writeInterior(u, interiorOf(u).vDiv, list);\n    return { ok: true, id, y: pl.y, cell: pl.cell };\n  }\n  function spans(B, vDiv, skip) {\n    const out = [];\n    let at = 0;\n    vDiv.forEach((x, i) => {\n      if (i === skip) return;\n      out.push([at, x]);\n      at = x + T;\n    });\n    out.push([at, B.w]);\n    return out;\n  }\n  function dividerGaps(u, x, selfIdx) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const vd = interiorOf(u).vDiv;\n    let left = 0, right = B.w;\n    vd.forEach((d, i) => {\n      if (i === selfIdx) return;\n      if (d + T <= x + 1e-3 && d + T > left) left = d + T;\n      if (d >= x + T - 1e-3 && d < right) right = d;\n    });\n    const ys = shelfListOf(u).map((s) => B.y0 + s.y).concat(interiorOf(u).hDiv.map((y) => B.y0 + y)).sort((a, c) => a - c);\n    let lo = B.y0, bestY = (B.y0 + B.y1) / 2, bestGap = -1;\n    for (const y of ys.concat([B.y1])) {\n      if (y - lo > bestGap) {\n        bestGap = y - lo;\n        bestY = (lo + y) / 2;\n      }\n      lo = Math.max(lo, y + T);\n    }\n    return {\n      left: x - left,\n      right: right - (x + T),\n      lx: B.x0 + left,\n      rx: B.x0 + right,\n      x0: B.x0 + x,\n      x1: B.x0 + x + T,\n      y: bestY,\n      B\n    };\n  }\n  function dividerBoxLocal(u, x) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    return { x0: B.x0 + x, x1: B.x0 + x + T, y0: B.y0, y1: B.y1, z0: B.z0, z1: B.z1 };\n  }\n  function dividerLegal(B, vDiv, x) {\n    const next = vDiv.concat([x]).sort((a, c) => a - c);\n    let at = 0;\n    for (const d of next) {\n      if (d - at < INTERIOR.minCompartment - 1e-3) return false;\n      at = d + T;\n    }\n    return B.w - at >= INTERIOR.minCompartment - 1e-3;\n  }\n  function dividerPlacement(u, lp) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const vd = interiorOf(u).vDiv;\n    const px = lp[0] - B.x0;\n    const bay = spans(B, vd, -1).filter((s) => px >= s[0] && px <= s[1])[0];\n    if (!bay) return { ok: false, why: \"There is a divider here already.\" };\n    const lim = { min: bay[0] + INTERIOR.minCompartment, max: bay[1] - INTERIOR.minCompartment - T };\n    let x = Math.round(clamp4(px - T / 2, bay[0], bay[1] - T));\n    let snapped = null;\n    const mid = (bay[0] + bay[1]) / 2 - T / 2;\n    if (Math.abs(x - mid) <= DIVIDER_CENTRE_SNAP) {\n      x = Math.round(mid);\n      snapped = \"centre of the bay\";\n    }\n    const base = {\n      x,\n      snapped,\n      box: dividerBoxLocal(u, x),\n      gaps: dividerGaps(u, x, -1),\n      range: { min: Math.round(lim.min), max: Math.round(lim.max) }\n    };\n    if (lim.max < lim.min)\n      return Object.assign(base, { ok: false, why: \"This bay is narrower than a \" + T + \" mm divider.\" });\n    if (!dividerLegal(B, vd, x)) return Object.assign(base, { ok: false, why: \"A divider here would overlap another board.\" });\n    const dx = drawerAcross(u, \"x\", x);\n    if (dx) return Object.assign(base, { ok: false, why: dx.name + \" is there - a divider would cut through its box\" });\n    return Object.assign(base, { ok: true, why: null });\n  }\n  function dividerPlace0(u, x) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const I = interiorOf(u), vd = I.vDiv.slice();\n    x = Math.round(x);\n    if (!dividerLegal(B, vd, x)) return { ok: false, why: \"A divider there would overlap another board or leave the cabinet.\" };\n    const col = vd.filter((d) => d < x).length;\n    const list = shelfListOf(u);\n    const out = [];\n    let ids = list.map((s) => ({ id: s.id }));\n    for (const s of list) {\n      const [band, c] = String(s.cell).split(\".\").map((n) => parseInt(n, 10));\n      if (c > col) out.push(keepEdges(s, { id: s.id, cell: band + \".\" + (c + 1), y: s.y }));\n      else if (c === col) {\n        out.push(keepEdges(s, { id: s.id, cell: s.cell, y: s.y }));\n        const id = nextShelfId(ids.concat(out));\n        ids = ids.concat([{ id }]);\n        out.push(keepEdges(s, { id, cell: band + \".\" + (col + 1), y: s.y }));\n      } else out.push(keepEdges(s, { id: s.id, cell: s.cell, y: s.y }));\n    }\n    vd.push(x);\n    vd.sort((a, c) => a - c);\n    writeInterior(u, vd, out);\n    return { ok: true, x, idx: vd.indexOf(x) };\n  }\n  function dividerRemoveAt0(u, idx) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const I = interiorOf(u), vd = I.vDiv.slice();\n    if (idx < 0 || idx >= vd.length) return { ok: false, why: \"That divider is not there any more.\" };\n    const list = shelfListOf(u), out = [];\n    for (const s of list) {\n      const [band, c] = String(s.cell).split(\".\").map((n) => parseInt(n, 10));\n      if (c <= idx) out.push(keepEdges(s, { id: s.id, cell: s.cell, y: s.y }));\n    }\n    for (const s of list) {\n      const [band, c] = String(s.cell).split(\".\").map((n) => parseInt(n, 10));\n      if (c === idx + 1) {\n        const cell = band + \".\" + idx;\n        if (out.every((o) => o.cell !== cell || Math.abs(o.y - s.y) >= T + SHELF_CLEAR)) out.push(keepEdges(s, { id: s.id, cell, y: s.y }));\n      } else if (c > idx + 1) out.push(keepEdges(s, { id: s.id, cell: band + \".\" + (c - 1), y: s.y }));\n    }\n    vd.splice(idx, 1);\n    writeInterior(u, vd, out);\n    return { ok: true, left: vd.length };\n  }\n  function bandSpans(B, hDiv, skip) {\n    const out = [];\n    let at = 0;\n    hDiv.forEach((y, i) => {\n      if (i === skip) return;\n      out.push([at, y]);\n      at = y + T;\n    });\n    out.push([at, B.h]);\n    return out;\n  }\n  var bandOfCell = (cell) => parseInt(String(cell).split(\".\")[0], 10) || 0;\n  var colOfCell = (cell) => parseInt(String(cell).split(\".\")[1], 10) || 0;\n  function hDividerGaps(u, y, selfIdx) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const hd = interiorOf(u).hDiv;\n    let floor = 0, ceil = B.h;\n    hd.forEach((d, i) => {\n      if (i === selfIdx) return;\n      if (d + T <= y + 1e-3 && d + T > floor) floor = d + T;\n      if (d >= y + T - 1e-3 && d < ceil) ceil = d;\n    });\n    const cols = spans(B, interiorOf(u).vDiv, -1).map((c, i) => ({ c, i })).sort((p, q) => q.c[1] - q.c[0] - (p.c[1] - p.c[0]));\n    const col = cols[0].i, x = B.x0 + (cols[0].c[0] + cols[0].c[1]) / 2;\n    for (const sh of shelfListOf(u)) {\n      if (colOfCell(sh.cell) !== col) continue;\n      if (sh.y + T <= y + 1e-3 && sh.y + T > floor) floor = sh.y + T;\n      if (sh.y >= y + T - 1e-3 && sh.y < ceil) ceil = sh.y;\n    }\n    return {\n      below: y - floor,\n      above: ceil - (y + T),\n      floor: B.y0 + floor,\n      ceil: B.y0 + ceil,\n      y0: B.y0 + y,\n      y1: B.y0 + y + T,\n      x,\n      B\n    };\n  }\n  function hDividerBoxLocal(u, y) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    return { x0: B.x0, x1: B.x1, y0: B.y0 + y, y1: B.y0 + y + T, z0: B.z0, z1: B.z1 };\n  }\n  function hLimits(u, B, hd, lo, hi, shelves, y) {\n    let min = lo + INTERIOR.minBand, max = hi - INTERIOR.minBand - T, byShelf = { min: false, max: false };\n    for (const s of shelves) {\n      if (s.y < lo - 1e-3 || s.y > hi + 1e-3) continue;\n      if (s.y + T <= y + 1e-3) {\n        const m = s.y + T + SHELF_CLEAR;\n        if (m > min) {\n          min = m;\n          byShelf.min = true;\n        }\n      } else if (s.y >= y + T - 1e-3) {\n        const m = s.y - SHELF_CLEAR - T;\n        if (m < max) {\n          max = m;\n          byShelf.max = true;\n        }\n      }\n    }\n    return { min: Math.round(min * 1e3) / 1e3, max: Math.round(max * 1e3) / 1e3, byShelf };\n  }\n  function shelfInTheWay(shelves, y) {\n    for (const s of shelves) if (Math.abs(s.y - y) < T + SHELF_CLEAR - 1e-3) return s;\n    return null;\n  }\n  function hDividerRangeOf(u, idx) {\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const hd = interiorOf(u).hDiv;\n    if (idx < 0 || idx >= hd.length) return null;\n    const lo = idx > 0 ? hd[idx - 1] + T : 0, hi = idx < hd.length - 1 ? hd[idx + 1] : B.h;\n    const L = hLimits(u, B, hd, lo, hi, shelfListOf(u), hd[idx]);\n    return { min: Math.ceil(L.min), max: Math.floor(L.max), byShelf: L.byShelf };\n  }\n  function hDividerPlacement(u, lp) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const hd = interiorOf(u).hDiv;\n    const py = lp[1] - B.y0;\n    const band = bandSpans(B, hd, -1).filter((s) => py >= s[0] && py <= s[1])[0];\n    if (!band) return { ok: false, why: \"There is a horizontal divider here already.\" };\n    let y = Math.round(clamp4(py - T / 2, band[0], band[1] - T));\n    let snapped = null;\n    const mid = (band[0] + band[1]) / 2 - T / 2;\n    if (Math.abs(y - mid) <= DIVIDER_CENTRE_SNAP) {\n      y = Math.round(mid);\n      snapped = \"centre of the space\";\n    }\n    const shelves = shelfListOf(u);\n    const lim = { min: band[0] + INTERIOR.minBand, max: band[1] - INTERIOR.minBand - T };\n    const base = {\n      y,\n      snapped,\n      box: hDividerBoxLocal(u, y),\n      gaps: hDividerGaps(u, y, -1),\n      range: { min: Math.round(lim.min), max: Math.round(lim.max) }\n    };\n    if (lim.max < lim.min)\n      return Object.assign(base, { ok: false, why: \"This space is lower than a \" + T + \" mm divider.\" });\n    if (y < lim.min - 1e-3 || y > lim.max + 1e-3)\n      return Object.assign(base, { ok: false, why: \"A divider here would overlap another board.\" });\n    if (shelfInTheWay(shelves, y))\n      return Object.assign(base, { ok: false, why: \"There is a shelf here - place the divider above or below it, or remove the shelf first.\" });\n    const dy = drawerAcross(u, \"y\", y);\n    if (dy) return Object.assign(base, { ok: false, why: dy.name + \" is there - place the divider above or below its box\" });\n    return Object.assign(base, { ok: true, why: null });\n  }\n  function hDividerPlace0(u, y) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const hd = interiorOf(u).hDiv.slice();\n    y = Math.round(y);\n    const band = bandSpans(B, hd, -1).filter((s) => y >= s[0] - 1e-3 && y + T <= s[1] + 1e-3)[0];\n    if (!band) return { ok: false, why: \"There is a horizontal divider here already.\" };\n    if (y < band[0] + INTERIOR.minBand - 1e-3 || y > band[1] - INTERIOR.minBand - T + 1e-3)\n      return { ok: false, why: \"A divider there would overlap another board or leave the cabinet.\" };\n    const list = shelfListOf(u);\n    if (shelfInTheWay(list, y)) return { ok: false, why: \"A shelf is in the way there.\" };\n    const b = hd.filter((d) => d < y).length;\n    const out = list.map((s) => {\n      const bb = bandOfCell(s.cell), c = colOfCell(s.cell);\n      const nb = bb > b ? bb + 1 : bb === b && s.y > y ? b + 1 : bb;\n      return keepEdges(s, { id: s.id, cell: nb + \".\" + c, y: s.y });\n    });\n    hd.push(y);\n    hd.sort((a, c) => a - c);\n    writeInterior(u, interiorOf(u).vDiv, out, hd);\n    return { ok: true, y, idx: hd.indexOf(y) };\n  }\n  function hDividerMoveTo0(u, idx, wantY) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const hd = interiorOf(u).hDiv.slice();\n    if (idx < 0 || idx >= hd.length) return { ok: false, why: \"That divider is not there any more.\" };\n    const R4 = hDividerRangeOf(u, idx);\n    if (!R4 || R4.max < R4.min) return { ok: false, why: \"There is no room to move it.\" };\n    const y = Math.round(clamp4(wantY, R4.min, R4.max));\n    const blocked = wantY < R4.min - 0.5 && R4.byShelf.min || wantY > R4.max + 0.5 && R4.byShelf.max;\n    if (y === hd[idx]) return { ok: true, y, min: R4.min, max: R4.max, blocked };\n    const list = shelfListOf(u);\n    hd[idx] = y;\n    writeInterior(u, interiorOf(u).vDiv, list, hd);\n    return { ok: true, y, min: R4.min, max: R4.max, blocked };\n  }\n  function hDividerRemoveAt0(u, idx) {\n    const why0 = placeWhy(u);\n    if (why0) return { ok: false, why: why0 };\n    const hd = interiorOf(u).hDiv.slice();\n    if (idx < 0 || idx >= hd.length) return { ok: false, why: \"That divider is not there any more.\" };\n    const out = shelfListOf(u).map((s) => {\n      const bb = bandOfCell(s.cell);\n      return keepEdges(s, { id: s.id, cell: (bb > idx ? bb - 1 : bb) + \".\" + colOfCell(s.cell), y: s.y });\n    });\n    hd.splice(idx, 1);\n    writeInterior(u, interiorOf(u).vDiv, out, hd);\n    return { ok: true, left: hd.length };\n  }\n  function writeInterior(u, vDiv, shelfList, hDiv) {\n    const I = interiorOf(u), hd = (hDiv || I.hDiv).slice();\n    setInterior(u, {\n      shelves: I.shelves,\n      vDiv: vDiv.slice(),\n      dividers: vDiv.slice(),\n      hDiv: hd,\n      shelfList,\n      vSb: carrySetbacks(I.vDiv, I.vSb, vDiv),\n      hSb: carrySetbacks(I.hDiv, I.hSb, hd)\n    });\n    const n = shelvesPerCell(u, shelfListOf(u));\n    u.interior.shelves = n;\n    if (u.type === \"tall-pantry\") u.shelves = clamp4(n, TALL.shelves.min, TALL.shelves.max);\n  }\n  function hDividerIndexOf(part) {\n    const m = /^Fixed shelf (\\d+)/.exec(part && part.name || \"\");\n    return m ? parseInt(m[1], 10) - 1 : -1;\n  }\n  function dividerIndexOf(part) {\n    const m = /^Fixed divider (\\d+)/.exec(part && part.name || \"\");\n    return m ? parseInt(m[1], 10) - 1 : -1;\n  }\n  function dividerPlace(u, x) {\n    return guardDrawers(u, () => dividerPlace0(u, x), (r, before) => remapAfterDivider(u, \"add\", r.idx, r.x, before));\n  }\n  function dividerRemoveAt(u, idx) {\n    return guardDrawers(u, () => dividerRemoveAt0(u, idx), (r, before) => remapAfterDivider(u, \"remove\", idx, null, before));\n  }\n  function hDividerPlace(u, y) {\n    return guardDrawers(u, () => hDividerPlace0(u, y), (r, before) => remapAfterPartition(u, \"add\", r.idx, r.y, before));\n  }\n  function hDividerMoveTo(u, idx, wantY) {\n    return guardDrawers(u, () => hDividerMoveTo0(u, idx, wantY));\n  }\n  function hDividerRemoveAt(u, idx) {\n    return guardDrawers(u, () => hDividerRemoveAt0(u, idx), (r, before) => remapAfterPartition(u, \"remove\", idx, null, before));\n  }\n\n  // v2/src/model/divider-equal.js\n  var AX3 = {\n    v: { list: \"vDiv\", flag: \"vEqual\", len: \"w\", min: () => INTERIOR.minCompartment, drawer: \"x\", what: \"divider\" },\n    h: { list: \"hDiv\", flag: \"hEqual\", len: \"h\", min: () => INTERIOR.minBand, drawer: \"y\", what: \"horizontal divider\" }\n  };\n  function equalFaces(a, b, n) {\n    if (!(n > 0)) return [];\n    const g2 = (b - a - n * T) / (n + 1);\n    const out = [];\n    for (let i = 0; i < n; i++) out.push(Math.round(a + (i + 1) * g2 + i * T));\n    return out;\n  }\n  function clearGaps(a, b, faces) {\n    const out = [];\n    let at = a;\n    for (const f of faces.slice().sort((p, q) => p - q)) {\n      out.push(f - at);\n      at = f + T;\n    }\n    out.push(b - at);\n    return out;\n  }\n  var bandOf = (cell) => parseInt(String(cell).split(\".\")[0], 10) || 0;\n  function splitPlan(u, axis, nWanted) {\n    const A = AX3[axis];\n    if (!A) return { ok: false, why: \"axis must be v or h\" };\n    if (!canInterior(u)) return { ok: false, why: \"This cabinet has no editable interior.\" };\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const I = interiorOf(u), cur = I[A.list].slice();\n    const n = nWanted != null ? nWanted : cur.length;\n    if (n < 1) return { ok: false, why: \"There is no \" + A.what + \" to share the space out - add one first\", faces: [], gaps: [], before: cur };\n    const L = B[A.len], faces = equalFaces(0, L, n), gaps = clearGaps(0, L, faces);\n    const base = { faces, gaps, before: cur, L };\n    if (gaps.some((g2) => g2 < A.min() - 1e-3))\n      return Object.assign(base, { ok: false, why: \"Not enough room for \" + (n + 1) + \" openings with \" + n + \" \" + A.what + (n === 1 ? \"\" : \"s\") + \" of \" + T + \" mm\" });\n    for (const f of faces) {\n      const d = drawerAcross(u, A.drawer, f);\n      if (d) return Object.assign(base, { ok: false, why: d.name + \" is in the way - a \" + A.what + \" there would cut through its box\" });\n    }\n    if (axis === \"h\") {\n      for (const s of shelfListOf(u)) {\n        const b = bandOf(s.cell);\n        const lo = b > 0 ? faces[b - 1] + T + SHELF_CLEAR : 0, hi = b < faces.length ? faces[b] - SHELF_CLEAR - T : L - T;\n        if (s.y < lo - 0.5 || s.y > hi + 0.5)\n          return Object.assign(base, { ok: false, why: \"A shelf at \" + Math.round(s.y) + \" mm is in the way - move or remove it, then split equally\" });\n      }\n    }\n    return Object.assign(base, { ok: true, why: null });\n  }\n  function writeAxis(u, axis, faces, keep) {\n    const A = AX3[axis], I = interiorOf(u), raw = u.interior || {};\n    const next = {\n      shelves: I.shelves,\n      vDiv: (axis === \"v\" ? faces : I.vDiv).slice(),\n      hDiv: (axis === \"h\" ? faces : I.hDiv).slice(),\n      shelfList: raw.shelfList || null\n    };\n    next.dividers = next.vDiv.slice();\n    next.vSb = carrySetbacks(I.vDiv, I.vSb, next.vDiv);\n    next.hSb = carrySetbacks(I.hDiv, I.hSb, next.hDiv);\n    const other = axis === \"v\" ? \"hEqual\" : \"vEqual\";\n    if (raw[other]) next[other] = true;\n    if (keep) next[A.flag] = true;\n    setInterior(u, next);\n    if (u.interior && u.interior.shelfList) u.interior.shelves = shelvesPerCell(u, shelfListOf(u));\n  }\n  function splitEqually(u, axis) {\n    const P2 = splitPlan(u, axis);\n    if (!P2.ok) return P2;\n    const changed = JSON.stringify(P2.faces) !== JSON.stringify(P2.before);\n    writeAxis(u, axis, P2.faces, true);\n    return Object.assign({}, P2, { ok: true, changed });\n  }\n  function equalOff(u, axis) {\n    const A = AX3[axis], raw = u.interior;\n    if (!raw || !raw[A.flag]) return false;\n    delete raw[A.flag];\n    return true;\n  }\n  function equalOn(u, axis) {\n    const A = AX3[axis];\n    return !!(u && u.interior && u.interior[A.flag]);\n  }\n  function centrePlan(u, axis, idx) {\n    const A = AX3[axis];\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const cur = interiorOf(u)[A.list].slice();\n    if (idx < 0 || idx >= cur.length) return { ok: false, why: \"That \" + A.what + \" is not there any more.\" };\n    const lo = idx > 0 ? cur[idx - 1] + T : 0, hi = idx < cur.length - 1 ? cur[idx + 1] : B[A.len];\n    const f = equalFaces(lo, hi, 1)[0];\n    const faces = cur.slice();\n    faces[idx] = f;\n    const gaps = [f - lo, hi - (f + T)];\n    const d = drawerAcross(u, A.drawer, f);\n    if (d) return { ok: false, why: d.name + \" is in the way - a \" + A.what + \" there would cut through its box\", faces, gaps };\n    if (axis === \"h\") {\n      for (const s of shelfListOf(u)) {\n        if (s.y >= lo - 0.5 && s.y <= hi + 0.5 && Math.abs(s.y - f) < T + SHELF_CLEAR - 1e-3)\n          return { ok: false, why: \"A shelf at \" + Math.round(s.y) + \" mm is in the way of the centre\", faces, gaps };\n      }\n    }\n    return { ok: true, why: null, faces, gaps, at: f, before: cur };\n  }\n  function centreBoard(u, axis, idx) {\n    const P2 = centrePlan(u, axis, idx);\n    if (!P2.ok) return P2;\n    const keep = P2.faces.length === 1 && equalOn(u, axis);\n    writeAxis(u, axis, P2.faces, keep);\n    return Object.assign({}, P2, { changed: P2.at !== P2.before[idx] });\n  }\n  function centreOf(u, axis, idx, faces) {\n    const A = AX3[axis];\n    const B = interiorBounds(u);\n    if (!B) return null;\n    const cur = faces || interiorOf(u)[A.list];\n    const lo = idx > 0 ? cur[idx - 1] + T : 0, hi = idx < cur.length - 1 ? cur[idx + 1] : B[A.len];\n    return { at: equalFaces(lo, hi, 1)[0], lo, hi, gap: Math.round((hi - lo - T) / 2) };\n  }\n  function settleEqual(units) {\n    let n = 0;\n    for (const u of units || []) {\n      if (!u || !u.interior) continue;\n      for (const axis of [\"v\", \"h\"]) {\n        if (!u.interior[AX3[axis].flag]) continue;\n        const P2 = splitPlan(u, axis);\n        if (!P2.ok || JSON.stringify(P2.faces) === JSON.stringify((u.interior[AX3[axis].list] || []).slice().sort((p, q) => p - q))) continue;\n        writeAxis(u, axis, P2.faces, true);\n        n++;\n      }\n    }\n    return n;\n  }\n\n  // v2/src/model/part-duplicate.js\n  function duplicateShelf(u, id) {\n    if (isCornerShelfUnit(u)) return { ok: false, why: \"An L corner shelf is copied with + Shelf - its two arms are placed together.\" };\n    const e = shelfListOf(u).filter((s) => s.id === String(id))[0];\n    if (!e) return { ok: false, why: \"That shelf is not there any more.\" };\n    const R4 = shelfRangeIn(u, e.cell, null);\n    const g2 = shelfGaps(u, e.cell, e.y, e.id);\n    const want = !g2 ? e.y : g2.above >= g2.below ? e.y + T + g2.above / 2 - T / 2 : e.y - g2.below / 2 - T / 2;\n    const y = R4 ? shelfSnapLegal(R4, want) : null;\n    if (y == null) return { ok: false, why: \"No free shelf hole left in this bay - a shelf needs \" + PIN_PITCH + \" mm steps and room above and below.\" };\n    const list = materialiseShelves2(u).slice();\n    const nid = nextShelfId(list);\n    list.push(keepEdges(e, { id: nid, cell: e.cell, y: Math.round(y) }));\n    u.interior.shelfList = list;\n    u.interior.shelves = shelvesPerCell(u, list);\n    return { ok: true, id: nid, y: Math.round(y), cell: e.cell, from: e.id };\n  }\n  function besideSpans(list, idx, len) {\n    const at = list[idx], lo = idx > 0 ? list[idx - 1] + T : 0, hi = idx < list.length - 1 ? list[idx + 1] : len;\n    return [[lo, at], [at + T, hi]];\n  }\n  function duplicateBoard(u, axis, idx) {\n    const B = interiorBounds(u);\n    if (!B) return { ok: false, why: \"No inside to divide.\" };\n    const I = interiorOf(u), list = axis === \"v\" ? I.vDiv : I.hDiv, sbs = (axis === \"v\" ? I.vSb : I.hSb) || [];\n    if (!(idx >= 0 && idx < list.length)) return { ok: false, why: \"That divider is not there any more.\" };\n    const len = axis === \"v\" ? B.w : B.h, sb = sbs[idx] == null ? null : sbs[idx];\n    const spans2 = besideSpans(list, idx, len).sort((a, b) => b[1] - b[0] - (a[1] - a[0]));\n    const place2 = axis === \"v\" ? dividerPlace : hDividerPlace;\n    const eq = equalOn(u, axis);\n    const need = axis === \"v\" ? INTERIOR.minCompartment : INTERIOR.minBand;\n    let r = null, why = null;\n    for (const [lo, hi] of spans2) {\n      if (hi - lo < 2 * need + T - 1e-3) continue;\n      r = place2(u, (lo + hi) / 2 - T / 2);\n      if (r.ok) break;\n      why = r.why;\n      r = null;\n    }\n    if (!r) return { ok: false, why: why || \"No room beside it for another \" + (axis === \"v\" ? \"divider\" : \"horizontal divider\") + \" - the openings either side are too narrow.\" };\n    if (sb != null) {\n      const key = axis === \"v\" ? \"vSb\" : \"hSb\", now = interiorOf(u), arr = ((axis === \"v\" ? now.vSb : now.hSb) || []).slice();\n      while (arr.length < (axis === \"v\" ? now.vDiv : now.hDiv).length) arr.push(null);\n      arr[r.idx] = sb;\n      setInterior(u, Object.assign({}, u.interior || {}, { [key]: arr }));\n    }\n    let shared = null;\n    if (eq) {\n      const s = splitEqually(u, axis);\n      shared = s.ok ? s.gaps : null;\n    }\n    return { ok: true, idx: r.idx, at: axis === \"v\" ? r.x : r.y, setback: sb, shared };\n  }\n  function duplicateDivider(u, idx) {\n    return duplicateBoard(u, \"v\", idx);\n  }\n  function duplicateHDivider(u, idx) {\n    return duplicateBoard(u, \"h\", idx);\n  }\n\n  // v2/src/model/room-corners.js\n  function cornerOwnsWall(u) {\n    return !!u && String(u.type).indexOf(\"corner\") === 0 && !!ROOM.ret && ROOM.ret.ownerId === u.id;\n  }\n  function cornerMoveOK(units, u, x, z) {\n    const ox = u.x, oz = u.z;\n    let ok2 = true;\n    u.x = x;\n    u.z = z;\n    if (protrusion(foot(u), MAIN_WALL) > 0.01) ok2 = false;\n    if (ok2) ok2 = !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n    if (ok2) {\n      const saved = ROOM.ret;\n      ROOM.ret = retWall(units);\n      ok2 = !units.some(function(v) {\n        return v.id !== u.id && behindWall(v, v.x, v.z);\n      });\n      if (!ok2) ROOM.ret = saved;\n    }\n    u.x = ox;\n    u.z = oz;\n    return ok2;\n  }\n  function cornerCanTransfer(u) {\n    return roomOn() && !!u && String(u.type).indexOf(\"corner\") === 0;\n  }\n  function cornerAtRoomCorner(units, u, cornerId) {\n    const c = roomCorners().filter(function(q) {\n      return q.id === cornerId;\n    })[0];\n    if (!c) return { ok: false, why: \"That corner is not part of the room.\" };\n    const snap3 = { x: u.x, z: u.z, rot: u.rot };\n    u.rot = c.rot;\n    const fb = foot(u);\n    const free = !!seatWalls();\n    const lowX = free ? c.rot === 2 || c.rot === 3 : c.x === 0, lowZ = free ? c.rot === 0 || c.rot === 3 : c.z === 0;\n    const dx = lowX ? c.x - fb.x0 : c.x - fb.x1;\n    const dz = lowZ ? c.z - fb.z0 : c.z - fb.z1;\n    u.x += dx;\n    u.z += dz;\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n    if (!ok2) {\n      const attemptBox = foot(u);\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      return { ok: false, why: \"That corner is occupied or too small for this cabinet.\", box: attemptBox };\n    }\n    return { ok: true, corner: c.id };\n  }\n  function roomCornerSeatedBy(f, tol) {\n    if (!f || !roomOn()) return null;\n    const sz = roomSize(), t = tol == null ? 2 : tol;\n    let found = null;\n    const corners = roomCorners();\n    if (seatWalls()) {\n      for (const c of corners) if (c.walls.every(function(id) {\n        const w = seatWallById(id);\n        return w && Math.abs(gapToWall(f, w)) <= t;\n      })) return c.id;\n      return null;\n    }\n    for (let i = 0; i < corners.length; i++) {\n      const c = corners[i];\n      const okX = c.x === 0 ? Math.abs(f.x0 - 0) <= t : Math.abs(f.x1 - sz.width) <= t;\n      const okZ = c.z === 0 ? Math.abs(f.z0 - 0) <= t : Math.abs(f.z1 - sz.depth) <= t;\n      if (okX && okZ && !found) found = c.id;\n    }\n    return found;\n  }\n  function armRoomMax(units, u, key) {\n    if (!u || !isLPlan(u)) return null;\n    const lim = limitsFor(u);\n    const lo = (lim[key] || lim.w)[0], hi = Math.min(ARM_CEIL, (lim[key] || lim.w)[1]);\n    const snap3 = { w: u.w, w2: u.w2, x: u.x, z: u.z, rot: u.rot };\n    const legal = function(v2) {\n      return tryLArm(units, u, key, v2, false);\n    };\n    let best = null;\n    let v, step;\n    for (step = 100; step >= 10; step = step / 10) {\n      const from = best == null ? lo : best;\n      for (v = from; v <= hi + 1e-3; v += step) {\n        if (legal(v)) best = v;\n        else break;\n      }\n    }\n    u.w = snap3.w;\n    u.w2 = snap3.w2;\n    u.x = snap3.x;\n    u.z = snap3.z;\n    u.rot = snap3.rot;\n    if (best == null) return lo;\n    return Math.max(lo, Math.round(best / 10) * 10);\n  }\n  function lCornerIdOf(u) {\n    if (typeof hugCornerOf !== \"function\" || typeof roomCorners !== \"function\") return null;\n    const hug = hugCornerOf(u);\n    let id = null;\n    const pin = typeof hugPointOf === \"function\" ? hugPointOf(u) : null;\n    const corners = roomCorners();\n    for (let i = 0; i < corners.length; i++) {\n      const c = corners[i];\n      const need = (c.x === 0 ? \"x0\" : \"x1\") + (c.z === 0 ? \"z0\" : \"z1\");\n      if (need !== hug) continue;\n      if (pin && (Math.abs(pin.x - c.x) > 2 || Math.abs(pin.z - c.z) > 2)) continue;\n      id = c.id;\n    }\n    return id;\n  }\n  function tryLArm(units, u, k, v, keep) {\n    const snap3 = { x: u.x, z: u.z, rot: u.rot, w: u.w, w2: u.w2, d: u.d, y: u.y };\n    const cornerId = lCornerIdOf(u);\n    const pin0 = typeof hugPointOf === \"function\" ? hugPointOf(u) : null;\n    u[k] = v;\n    if (cornerId && typeof cornerAtRoomCorner === \"function\")\n      cornerAtRoomCorner(units, u, cornerId);\n    if (typeof syncRoom === \"function\") syncRoom(units);\n    let ok2 = !behindWall(u, u.x, u.z);\n    if (ok2) {\n      for (let i = 0; i < (units || []).length; i++) {\n        const o = units[i];\n        if (o === u || o.id === u.id) continue;\n        if (!sameLevel(o, u)) continue;\n        if (overlaps(o, u)) {\n          ok2 = false;\n          break;\n        }\n      }\n    }\n    if (ok2 && cornerId && pin0 && typeof hugPointOf === \"function\") {\n      const pin2 = hugPointOf(u);\n      if (pin2 && (Math.abs(pin2.x - pin0.x) > 1 || Math.abs(pin2.z - pin0.z) > 1)) ok2 = false;\n    }\n    if (!ok2 || !keep) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      u.w = snap3.w;\n      u.w2 = snap3.w2;\n      u.d = snap3.d;\n      u.y = snap3.y;\n      if (typeof syncRoom === \"function\") syncRoom(units);\n    }\n    return ok2;\n  }\n  function cornerArmMin(u) {\n    const lim = u.type === \"corner-wall\" ? WALL.limits : CORNER.lLimits;\n    return Math.max(lim.w[0], (u.d || 0) + CORNER.minOpening);\n  }\n  function cornerArmMax(u) {\n    const lim = u.type === \"corner-wall\" ? WALL.limits : CORNER.lLimits;\n    return lim.w[1];\n  }\n  function cornerArmsFit(units, u, cornerId, a, b) {\n    const snap3 = { x: u.x, z: u.z, rot: u.rot, w: u.w, w2: u.w2 };\n    u.w = a;\n    u.w2 = b;\n    const r = cornerAtRoomCorner(units, u, cornerId);\n    const ok2 = !!r.ok;\n    u.x = snap3.x;\n    u.z = snap3.z;\n    u.rot = snap3.rot;\n    u.w = snap3.w;\n    u.w2 = snap3.w2;\n    return ok2;\n  }\n  function cornerArmSearch(units, u, cornerId, want, other, whichA) {\n    let lo = cornerArmMin(u), hi = Math.min(want, cornerArmMax(u));\n    const fit = function(v) {\n      return whichA ? cornerArmsFit(units, u, cornerId, v, other) : cornerArmsFit(units, u, cornerId, other, v);\n    };\n    if (fit(hi)) return hi;\n    if (!fit(lo)) return null;\n    while (hi - lo > 10) {\n      const mid = Math.floor((lo + hi) / 2 / 10) * 10;\n      if (mid <= lo) break;\n      if (fit(mid)) lo = mid;\n      else hi = mid;\n    }\n    return Math.floor(lo / 10) * 10;\n  }\n  function fitCornerArms(units, u, cornerId) {\n    if (!u || !isCornerUnit(u)) return { ok: false, why: \"That is not a corner cabinet.\" };\n    const A0 = Math.min(armA(u), cornerArmMax(u));\n    const B0 = Math.min(armB(u), cornerArmMax(u));\n    const mn = cornerArmMin(u);\n    if (cornerArmsFit(units, u, cornerId, A0, B0)) {\n      u.w = A0;\n      u.w2 = B0;\n      const r0 = cornerAtRoomCorner(units, u, cornerId);\n      return r0.ok ? { ok: true, armA: A0, armB: B0, changed: false } : { ok: false, why: \"That corner will not take this cabinet.\" };\n    }\n    let foundA = null, foundB = null;\n    if (cornerArmsFit(units, u, cornerId, A0, mn)) {\n      foundA = A0;\n      foundB = cornerArmSearch(units, u, cornerId, B0, A0, false);\n    } else if (cornerArmsFit(units, u, cornerId, mn, B0)) {\n      foundB = B0;\n      foundA = cornerArmSearch(units, u, cornerId, A0, B0, true);\n    } else {\n      foundA = cornerArmSearch(units, u, cornerId, A0, mn, true);\n      if (foundA != null) foundB = cornerArmSearch(units, u, cornerId, B0, foundA, false);\n    }\n    if (foundA == null || foundB == null) {\n      return {\n        ok: false,\n        need: mn,\n        armA: A0,\n        armB: B0,\n        why: \"This corner is too tight for a corner cabinet: the arms would have to be shorter than \" + mn + \" mm, which leaves no usable door. Nothing was added.\"\n      };\n    }\n    u.w = foundA;\n    u.w2 = foundB;\n    const r = cornerAtRoomCorner(units, u, cornerId);\n    if (!r.ok) return { ok: false, why: r.why || \"That corner will not take this cabinet.\" };\n    return {\n      ok: true,\n      armA: foundA,\n      armB: foundB,\n      changed: foundA !== A0 || foundB !== B0,\n      wasA: A0,\n      wasB: B0\n    };\n  }\n  function cornerTargetFor(units, u, host) {\n    if (host) {\n      const hp = hugPointOf(host);\n      if (hp) {\n        const same = roomCorners().filter(function(c) {\n          return Math.abs(c.x - hp.x) < 1 && Math.abs(c.z - hp.z) < 1;\n        })[0];\n        if (same) return same.id;\n      }\n    }\n    const fb = foot(u), cx = (fb.x0 + fb.x1) / 2, cz = (fb.z0 + fb.z1) / 2;\n    const free = roomCorners().filter(function(c) {\n      return !units.some(function(v) {\n        if (v.id === u.id || !isCornerUnit(v) || !sameLevel(v, u)) return false;\n        const p = hugPointOf(v);\n        return p && Math.abs(p.x - c.x) < 1 && Math.abs(p.z - c.z) < 1;\n      });\n    });\n    if (!free.length) return null;\n    free.sort(function(a, b) {\n      return Math.hypot(a.x - cx, a.z - cz) - Math.hypot(b.x - cx, b.z - cz);\n    });\n    return free[0].id;\n  }\n  function cornerTargetFirstThatFits(units, u) {\n    const fb = foot(u), cx = (fb.x0 + fb.x1) / 2, cz = (fb.z0 + fb.z1) / 2;\n    const free = roomCorners().filter(function(c) {\n      return !units.some(function(v) {\n        if (v.id === u.id || !isCornerUnit(v) || !sameLevel(v, u)) return false;\n        const p = hugPointOf(v);\n        return p && Math.abs(p.x - c.x) < 1 && Math.abs(p.z - c.z) < 1;\n      });\n    }).sort(function(a, b) {\n      return Math.hypot(a.x - cx, a.z - cz) - Math.hypot(b.x - cx, b.z - cz);\n    });\n    for (let i = 0; i < free.length; i++) {\n      const keep = { x: u.x, z: u.z, rot: u.rot, w: u.w, w2: u.w2 };\n      const r = fitCornerArms(units, u, free[i].id);\n      u.x = keep.x;\n      u.z = keep.z;\n      u.rot = keep.rot;\n      u.w = keep.w;\n      u.w2 = keep.w2;\n      if (r.ok) return free[i].id;\n    }\n    return null;\n  }\n  function seatCornerAutomatically(units, u) {\n    if (!roomOn() || !u) return null;\n    const fb = foot(u), cx = (fb.x0 + fb.x1) / 2, cz = (fb.z0 + fb.z1) / 2;\n    const order = roomCorners().slice().sort(function(a, b) {\n      return Math.hypot(a.x - cx, a.z - cz) - Math.hypot(b.x - cx, b.z - cz);\n    });\n    for (let i = 0; i < order.length; i++)\n      if (cornerAtRoomCorner(units, u, order[i].id).ok) return order[i].id;\n    return null;\n  }\n  var HUG_ROT = { x1z0: 0, x1z1: 1, x0z1: 2, x0z0: 3 };\n  function seatAtInferredCorner(units, u) {\n    if (!u || roomOn()) return null;\n    const rw = retWall((units || []).filter(function(v) {\n      return v.id !== u.id;\n    }));\n    if (!rw || rw.axis !== \"x\") return null;\n    const hug = (rw.dir > 0 ? \"x1\" : \"x0\") + \"z0\";\n    const rot = HUG_ROT[hug];\n    if (rot == null) return null;\n    const snap3 = { x: u.x, z: u.z, rot: u.rot };\n    u.rot = rot;\n    const fb = foot(u);\n    u.x += rw.at - (rw.dir > 0 ? fb.x1 : fb.x0);\n    u.z += ROOM.wallZ - foot(u).z0;\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n    if (!ok2) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      return null;\n    }\n    return { x: u.x, z: u.z, rot: u.rot };\n  }\n  function hugCornerOf(u) {\n    const B = footBoxes(u), f = foot(u), e = 6;\n    const cand = [\n      [\"x0z0\", f.x0 + e, f.z0 + e],\n      [\"x1z0\", f.x1 - e, f.z0 + e],\n      [\"x0z1\", f.x0 + e, f.z1 - e],\n      [\"x1z1\", f.x1 - e, f.z1 - e]\n    ];\n    const miss = cand.filter(function(c) {\n      return !B.some(function(b) {\n        return c[1] > b.x0 && c[1] < b.x1 && c[2] > b.z0 && c[2] < b.z1;\n      });\n    });\n    if (miss.length !== 1) return null;\n    return { x0z0: \"x1z1\", x1z1: \"x0z0\", x1z0: \"x0z1\", x0z1: \"x1z0\" }[miss[0][0]];\n  }\n  function hugPointOf(u) {\n    const g2 = hugCornerOf(u);\n    if (!g2) return null;\n    const f = foot(u);\n    return {\n      x: g2.indexOf(\"x0\") === 0 ? f.x0 : f.x1,\n      z: g2.indexOf(\"z0\") > 0 ? f.z0 : f.z1,\n      hug: g2\n    };\n  }\n  function seatSharingCorner(units, u, other) {\n    const p = hugPointOf(other);\n    if (!p) return null;\n    const rot = HUG_ROT[p.hug];\n    if (rot == null) return null;\n    const snap3 = { x: u.x, z: u.z, rot: u.rot };\n    u.rot = rot;\n    const q = hugPointOf(u);\n    if (!q) {\n      u.rot = snap3.rot;\n      return null;\n    }\n    u.x += p.x - q.x;\n    u.z += p.z - q.z;\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n    if (!ok2) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      return null;\n    }\n    return { x: u.x, z: u.z, rot: u.rot };\n  }\n  function cornerDestinations(units, u) {\n    const out = [];\n    roomCorners().forEach(function(c) {\n      out.push({ kind: \"room\", id: c.id, x: c.x, z: c.z });\n    });\n    (units || []).forEach(function(v) {\n      if (v.id === u.id || !isCornerUnit(v)) return;\n      if (sameLevel(v, u)) return;\n      const p = hugPointOf(v);\n      if (!p) return;\n      out.push({ kind: \"share\", id: \"shared\", x: p.x, z: p.z, other: v });\n    });\n    return out;\n  }\n  function nearestRoomCorner(px, pz) {\n    if (!roomOn()) return null;\n    let best = null;\n    const corners = roomCorners();\n    for (let i = 0; i < corners.length; i++) {\n      const c = corners[i];\n      const dd = Math.hypot(c.x - px, c.z - pz);\n      if (dd < 900 && (!best || dd < best.dd)) best = { corner: c, dd };\n    }\n    return best ? best.corner : null;\n  }\n  function cornerTransferPreview(units, u, cornerId) {\n    const snap3 = { x: u.x, z: u.z, rot: u.rot };\n    const r = cornerAtRoomCorner(units, u, cornerId);\n    const box3 = r.ok ? foot(u) : null, rot = u.rot;\n    u.x = snap3.x;\n    u.z = snap3.z;\n    u.rot = snap3.rot;\n    return r.ok ? { ok: true, corner: cornerId, box: box3, rot } : { ok: false, why: r.why, box: r.box };\n  }\n\n  // v2/src/model/walls.js\n  var WALL_ROT = { back: 0, right: 1, front: 2, left: 3 };\n  function roomWallById(id) {\n    return roomWallList().filter(function(w) {\n      return w.id === id;\n    })[0] || null;\n  }\n  function wallsByDistance(px, pz) {\n    const S2 = seatWalls();\n    if (S2) return S2.map(function(w) {\n      const a = w.axis === \"z\" ? px : pz, c = clamp4(a, w.lo, w.hi), off = w.axis === \"z\" ? pz - w.at : px - w.at;\n      return { id: w.id, d: Math.hypot(a - c, off) };\n    }).sort(function(a, b) {\n      return a.d - b.d;\n    });\n    const sz = roomSize();\n    return [\n      { id: \"back\", d: Math.abs(pz - 0) },\n      { id: \"front\", d: Math.abs(sz.depth - pz) },\n      { id: \"left\", d: Math.abs(px - 0) },\n      { id: \"right\", d: Math.abs(sz.width - px) }\n    ].sort(function(a, b) {\n      return a.d - b.d;\n    });\n  }\n  var ALONG_SIGN = [1, 1, -1, -1];\n  function yawOf(u) {\n    return ((u && u.rot || 0) % 4 + 4) % 4;\n  }\n  function alongAxisForYaw(k) {\n    return k % 2 === 0 ? \"x\" : \"z\";\n  }\n  function alongAxisForWall(wallId) {\n    wallId = wallFace(wallId);\n    return wallId === \"back\" || wallId === \"front\" ? \"x\" : \"z\";\n  }\n  function roomWallPlane(wallId) {\n    const sw = seatWallById(wallId);\n    if (sw) return { axis: sw.axis, at: sw.at };\n    const sz = roomSize();\n    if (wallId === \"back\") return { axis: \"z\", at: 0 };\n    if (wallId === \"front\") return { axis: \"z\", at: sz.depth };\n    if (wallId === \"left\") return { axis: \"x\", at: 0 };\n    return { axis: \"x\", at: sz.width };\n  }\n  function centreAlong(u, ax) {\n    const f = foot(u);\n    return ax === \"z\" ? (f.z0 + f.z1) / 2 : (f.x0 + f.x1) / 2;\n  }\n  function grabLocalFrom(u, px, pz) {\n    const k = yawOf(u), ax = alongAxisForYaw(k);\n    const f = foot(u);\n    const half = (ax === \"z\" ? f.z1 - f.z0 : f.x1 - f.x0) / 2;\n    const off = (ax === \"z\" ? pz : px) - centreAlong(u, ax);\n    return clamp4(off * ALONG_SIGN[k], -half, half);\n  }\n  function grabAlongForWall(grabLocal, wallId) {\n    const k = WALL_ROT[wallFace(wallId)];\n    if (k == null || !grabLocal) return 0;\n    return grabLocal * ALONG_SIGN[k];\n  }\n  function flushRoomWallOf(u, tol) {\n    if (!u || isCornerUnit(u) || isIsland(u)) return null;\n    const S2 = seatWalls();\n    if (S2) {\n      const g2 = foot(u), tt = tol == null ? 2 : tol;\n      let bw = null, bdist = Infinity;\n      for (const w of S2) {\n        const d = Math.abs(gapToWall(g2, w));\n        if (alongWall(g2, w) && d < bdist) {\n          bdist = d;\n          bw = w.id;\n        }\n      }\n      return bdist <= tt ? bw : null;\n    }\n    const sz = roomSize(), f = foot(u), t = tol == null ? 2 : tol;\n    let best = null, bd = Infinity;\n    const es = [\n      [\"back\", Math.abs(f.z0 - 0)],\n      [\"front\", Math.abs(sz.depth - f.z1)],\n      [\"left\", Math.abs(f.x0 - 0)],\n      [\"right\", Math.abs(sz.width - f.x1)]\n    ];\n    for (let i = 0; i < es.length; i++) {\n      const e = es[i];\n      if (e[1] < bd) {\n        bd = e[1];\n        best = e[0];\n      }\n    }\n    return bd <= t ? best : null;\n  }\n  function attachToRoomWall(units, u, wallId, alongPt) {\n    if (!u || isCornerUnit(u) || isIsland(u)) return null;\n    const sw = seatWallById(wallId);\n    if (sw) return attachToSeatWall(units, u, sw, alongPt);\n    if (seatWalls()) return null;\n    const rot = WALL_ROT[wallId];\n    if (rot == null) return null;\n    const sz = roomSize();\n    const snap3 = { x: u.x, z: u.z, rot: u.rot, run: u.run };\n    u.rot = rot;\n    const f = foot(u);\n    if (wallId === \"back\") u.z += 0 - f.z0;\n    if (wallId === \"front\") u.z += sz.depth - f.z1;\n    if (wallId === \"left\") u.x += 0 - f.x0;\n    if (wallId === \"right\") u.x += sz.width - f.x1;\n    if (alongPt != null) {\n      const g2 = foot(u);\n      if (wallId === \"back\" || wallId === \"front\") {\n        u.x += clamp4(alongPt - (g2.x0 + g2.x1) / 2, -1e6, 1e6);\n        const h1 = foot(u);\n        if (h1.x0 < 0) u.x -= h1.x0;\n        if (h1.x1 > sz.width) u.x -= h1.x1 - sz.width;\n      } else {\n        u.z += clamp4(alongPt - (g2.z0 + g2.z1) / 2, -1e6, 1e6);\n        const h2 = foot(u);\n        if (h2.z0 < 0) u.z -= h2.z0;\n        if (h2.z1 > sz.depth) u.z -= h2.z1 - sz.depth;\n      }\n    }\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    }) && !zonesOf(u).length;\n    if (!ok2) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      u.run = snap3.run;\n      return null;\n    }\n    return { wall: wallId, rot, x: u.x, z: u.z };\n  }\n  function attachToSeatWall(units, u, w, alongPt) {\n    const rot = WALL_ROT[w.face];\n    const snap3 = { x: u.x, z: u.z, rot: u.rot, run: u.run };\n    u.rot = rot;\n    const f = foot(u);\n    if (w.face === \"back\") u.z += w.at - f.z0;\n    if (w.face === \"front\") u.z += w.at - f.z1;\n    if (w.face === \"left\") u.x += w.at - f.x0;\n    if (w.face === \"right\") u.x += w.at - f.x1;\n    if (alongPt != null) {\n      const g2 = foot(u);\n      if (w.axis === \"z\") {\n        u.x += alongPt - (g2.x0 + g2.x1) / 2;\n        const h1 = foot(u);\n        if (h1.x0 < w.lo) u.x += w.lo - h1.x0;\n        if (h1.x1 > w.hi) u.x -= h1.x1 - w.hi;\n      } else {\n        u.z += alongPt - (g2.z0 + g2.z1) / 2;\n        const h2 = foot(u);\n        if (h2.z0 < w.lo) u.z += w.lo - h2.z0;\n        if (h2.z1 > w.hi) u.z -= h2.z1 - w.hi;\n      }\n    }\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    }) && !zonesOf(u).length;\n    if (!ok2) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      u.run = snap3.run;\n      return null;\n    }\n    return { wall: w.id, rot, x: u.x, z: u.z };\n  }\n  var SEAT_TOL = 2;\n  function seatEligible(u) {\n    return !!u && !isCornerUnit(u) && !isIsland(u) && (u.family === \"base\" || u.family === \"wall\");\n  }\n  function touchedRoomWalls(u, tol) {\n    if (!u) return [];\n    const S2 = seatWalls();\n    if (S2) {\n      const g2 = foot(u), tt = tol == null ? SEAT_TOL : tol;\n      return S2.map(function(w) {\n        return [w.id, Math.abs(gapToWall(g2, w)), alongWall(g2, w)];\n      }).filter(function(e) {\n        return e[2] && e[1] <= tt;\n      }).sort(function(a, b) {\n        return a[1] - b[1];\n      }).map(function(e) {\n        return e[0];\n      });\n    }\n    const sz = roomSize(), f = foot(u), t = tol == null ? SEAT_TOL : tol;\n    return [\n      [\"back\", Math.abs(f.z0 - 0)],\n      [\"front\", Math.abs(sz.depth - f.z1)],\n      [\"left\", Math.abs(f.x0 - 0)],\n      [\"right\", Math.abs(sz.width - f.x1)]\n    ].filter(function(e) {\n      return e[1] <= t;\n    }).sort(function(a, b) {\n      return a[1] - b[1];\n    }).map(function(e) {\n      return e[0];\n    });\n  }\n  function backWallOf(u) {\n    return [\"back\", \"right\", \"front\", \"left\"][yawOf(u)];\n  }\n  function wallSeatOK(u, tol) {\n    if (!seatEligible(u)) return true;\n    const ws = touchedRoomWalls(u, tol);\n    return !ws.length || backSeatOf(ws, u) != null;\n  }\n  function backSeatOf(ws, u) {\n    const bf = backWallOf(u);\n    for (let i = 0; i < ws.length; i++) if (wallFace(ws[i]) === bf) return ws[i];\n    return null;\n  }\n  function reseatOnWall(units, u, prefer, tol) {\n    if (wallSeatOK(u, tol)) return null;\n    const ws = touchedRoomWalls(u, tol);\n    const order = prefer && ws.indexOf(prefer) >= 0 ? [prefer].concat(ws.filter(function(w) {\n      return w !== prefer;\n    })) : ws;\n    const f = foot(u), y = u.y;\n    for (let i = 0; i < order.length; i++) {\n      const w = order[i], ax = alongAxisForWall(w);\n      const along2 = ax === \"z\" ? (f.z0 + f.z1) / 2 : (f.x0 + f.x1) / 2;\n      if (attachToRoomWall(units, u, w, along2)) {\n        u.y = y;\n        u.run = w === \"back\" ? \"main\" : null;\n        return { ok: true, wall: w, rot: u.rot };\n      }\n    }\n    return {\n      ok: false,\n      wall: order[0],\n      why: \"No room to stand it against the \" + order[0] + \" wall there\"\n    };\n  }\n  function touchedWalls(u, tol) {\n    return touchedRoomWalls(u, tol == null ? 1 : tol);\n  }\n  function backOnWall(u) {\n    return backSeatOf(touchedWalls(u), u) != null;\n  }\n  function seatOnTouchedWall(units, u, prefer, tol) {\n    const r = reseatOnWall(units, u, prefer, tol);\n    return r && r.ok ? r.wall : null;\n  }\n  var SEAT_NEAR = 50;\n  function closeSideGaps(units, u) {\n    if (seatWalls()) return closeSideGapsFree(units, u);\n    const bw = backWallOf(u), sz = roomSize();\n    const side = bw === \"back\" || bw === \"front\" ? [\"left\", \"right\"] : [\"back\", \"front\"];\n    let moved = false;\n    for (let i = 0; i < side.length; i++) {\n      const w = side[i], f = foot(u);\n      const gap = w === \"left\" ? f.x0 : w === \"right\" ? sz.width - f.x1 : w === \"back\" ? f.z0 : sz.depth - f.z1;\n      if (!(gap > SEAT_TOL && gap <= SEAT_NEAR)) continue;\n      const ox = u.x, oz = u.z;\n      if (w === \"left\") u.x -= gap;\n      else if (w === \"right\") u.x += gap;\n      else if (w === \"back\") u.z -= gap;\n      else u.z += gap;\n      const bad = behindWall(u, u.x, u.z) || units.some(function(v) {\n        return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n      });\n      if (bad) {\n        u.x = ox;\n        u.z = oz;\n      } else moved = true;\n    }\n    return moved;\n  }\n  function closeSideGapsFree(units, u) {\n    const bf = backWallOf(u), horiz = bf === \"back\" || bf === \"front\";\n    let moved = false;\n    for (const w of seatWalls()) {\n      if (w.axis === \"z\" === horiz) continue;\n      const f = foot(u), gap = gapToWall(f, w);\n      if (!(gap > SEAT_TOL && gap <= SEAT_NEAR) || !alongWall(f, w)) continue;\n      const ox = u.x, oz = u.z;\n      if (w.face === \"left\") u.x -= gap;\n      else if (w.face === \"right\") u.x += gap;\n      else if (w.face === \"back\") u.z -= gap;\n      else u.z += gap;\n      const bad = behindWall(u, u.x, u.z) || units.some(function(v) {\n        return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n      });\n      if (bad) {\n        u.x = ox;\n        u.z = oz;\n      } else moved = true;\n    }\n    return moved;\n  }\n  function settleNearWall(units, u, prefer) {\n    if (!seatEligible(u)) return null;\n    const rs = reseatOnWall(units, u, prefer, SEAT_NEAR);\n    if (rs) {\n      if (rs.ok) closeSideGaps(units, u);\n      return rs;\n    }\n    const ws = touchedRoomWalls(u, SEAT_NEAR), bw = backSeatOf(ws, u);\n    if (bw == null) return null;\n    if (touchedRoomWalls(u).indexOf(bw) < 0) {\n      const f = foot(u), y = u.y, al = alongAxisForWall(bw) === \"z\" ? (f.z0 + f.z1) / 2 : (f.x0 + f.x1) / 2;\n      if (!attachToRoomWall(units, u, bw, al)) return null;\n      u.y = y;\n    }\n    u.run = bw === \"back\" ? \"main\" : null;\n    const side = closeSideGaps(units, u);\n    return { ok: true, wall: bw, closed: true, side };\n  }\n\n  // v2/src/model/run-inherit.js\n  function runInheritEligible(u) {\n    return !!u && !isCornerUnit(u) && !isIsland(u) && !isTall(u) && (u.family === \"base\" || u.family === \"wall\");\n  }\n  function runDonorFor(units, u) {\n    if (!runInheritEligible(u)) return null;\n    const ax = unitAlongAxis(u), fb = foot(u);\n    const a0 = ax === \"x\" ? fb.x0 : fb.z0, a1 = ax === \"x\" ? fb.x1 : fb.z1;\n    let best = null;\n    const arr = units || [];\n    for (let i = 0; i < arr.length; i++) {\n      const v = arr[i];\n      if (v.id === u.id || !runInheritEligible(v)) continue;\n      if (v.family !== u.family) continue;\n      if ((v.rot || 0) % 4 !== (u.rot || 0) % 4) continue;\n      if (!sameLevel(v, u)) continue;\n      const g2 = foot(v);\n      const bk = ax === \"x\" ? Math.round(g2.z0) : Math.round(g2.x0);\n      const mk = ax === \"x\" ? Math.round(fb.z0) : Math.round(fb.x0);\n      if (Math.abs(bk - mk) > 60) continue;\n      const b0 = ax === \"x\" ? g2.x0 : g2.z0, b1 = ax === \"x\" ? g2.x1 : g2.z1;\n      const gap = b0 >= a1 ? b0 - a1 : b1 <= a0 ? a0 - b1 : 0;\n      if (gap > RUN_GAP + 0.5) continue;\n      if (!best || gap < best.gap) best = { gap, u: v };\n    }\n    return best ? best.u : null;\n  }\n  function runDimsMatch(u, donor) {\n    if (!donor) return true;\n    if (u.h !== donor.h || u.d !== donor.d) return false;\n    if (u.family === \"wall\" && (u.y || 0) !== (donor.y || 0)) return false;\n    return true;\n  }\n  function inheritRunDims(units, u) {\n    const donor = runDonorFor(units, u);\n    if (!donor) return { ok: false, none: true };\n    if (runDimsMatch(u, donor)) return { ok: true, already: true, from: donor };\n    const lim = limitsFor(u);\n    const wantH = donor.h, wantD = donor.d;\n    if (wantH < lim.h[0] || wantH > lim.h[1])\n      return { ok: false, why: \"That run is \" + wantH + \" mm high, which this cabinet cannot be built at (\" + lim.h[0] + \"\\u2013\" + lim.h[1] + \" mm) - nothing changed.\" };\n    if (wantD < lim.d[0] || wantD > lim.d[1])\n      return { ok: false, why: \"That run is \" + wantD + \" mm deep, which this cabinet cannot be built at (\" + lim.d[0] + \"\\u2013\" + lim.d[1] + \" mm) - nothing changed.\" };\n    const snap3 = { h: u.h, d: u.d, y: u.y, x: u.x, z: u.z };\n    u.h = wantH;\n    u.d = wantD;\n    if (u.family === \"wall\") u.y = donor.y || 0;\n    const f = foot(u), ax = unitAlongAxis(u);\n    const back = ax === \"x\" ? foot(donor).z0 : foot(donor).x0;\n    if (ax === \"x\") u.z += back - f.z0;\n    else u.x += back - f.x0;\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n    if (!ok2) {\n      u.h = snap3.h;\n      u.d = snap3.d;\n      u.y = snap3.y;\n      u.x = snap3.x;\n      u.z = snap3.z;\n      return { ok: false, why: \"Matching that run would make this cabinet clash - nothing changed.\" };\n    }\n    return {\n      ok: true,\n      from: donor,\n      h: wantH,\n      d: wantD,\n      y: u.family === \"wall\" ? u.y || 0 : null,\n      mixed: units.some(function(v) {\n        return v.id !== u.id && v.id !== donor.id && runInheritEligible(v) && v.family === u.family && sameLevel(v, u) && (v.h !== donor.h || v.d !== donor.d);\n      })\n    };\n  }\n  function runInheritCue(r, u) {\n    if (!r || !r.ok || r.already) return null;\n    const what = u.family === \"wall\" ? \"wall run\" : \"base run\";\n    return \"Matched this \" + what + \": \" + r.h + \" high \\xD7 \" + r.d + \" deep\" + (r.y != null ? \", hung at \" + r.y + \" mm\" : \"\") + (r.mixed ? \" (from \" + displayName(UB_SCENE ? UB_SCENE.units : [], r.from) + \")\" : \"\");\n  }\n\n  // v2/src/model/gaps.js\n  function gapEligible(u) {\n    return !!u && !isCornerUnit(u) && !isIsland(u) && !isTall(u) && (u.family === \"base\" || u.family === \"wall\");\n  }\n  function gapWidthLimits(u) {\n    const lim = u.family === \"wall\" ? WALL.limits : LIMITS;\n    return { min: lim.w[0], max: lim.w[1] };\n  }\n  function gapRunOf(units, u) {\n    const ax = unitAlongAxis(u), fb = foot(u);\n    const backKey = ax === \"x\" ? Math.round(fb.z0) : Math.round(fb.x0);\n    return (units || []).filter(function(v) {\n      if (!gapEligible(v)) return false;\n      if ((v.rot || 0) % 4 !== (u.rot || 0) % 4) return false;\n      if (!sameLevel(v, u)) return false;\n      const g2 = foot(v);\n      const bk = ax === \"x\" ? Math.round(g2.z0) : Math.round(g2.x0);\n      return Math.abs(bk - backKey) <= 2;\n    }).sort(function(a, b) {\n      const A = foot(a), B = foot(b);\n      return ax === \"x\" ? A.x0 - B.x0 : A.z0 - B.z0;\n    });\n  }\n  function gapContiguousRun(units, u) {\n    const all = gapRunOf(units, u), ax = unitAlongAxis(u);\n    const i = all.indexOf(u);\n    if (i < 0) return [];\n    let lo0 = i, hi0 = i;\n    const edge = function(v, which) {\n      const f = foot(v);\n      return ax === \"x\" ? which ? f.x1 : f.x0 : which ? f.z1 : f.z0;\n    };\n    while (lo0 > 0 && edge(all[lo0], 0) - edge(all[lo0 - 1], 1) <= RUN_GAP + 0.5) lo0--;\n    while (hi0 < all.length - 1 && edge(all[hi0 + 1], 0) - edge(all[hi0], 1) <= RUN_GAP + 0.5) hi0++;\n    return all.slice(lo0, hi0 + 1);\n  }\n  function gapBeside(units, u) {\n    const ax = unitAlongAxis(u), fb = foot(u), sz = roomSize();\n    const a0 = ax === \"x\" ? fb.x0 : fb.z0, a1 = ax === \"x\" ? fb.x1 : fb.z1;\n    const p0 = ax === \"x\" ? fb.z0 : fb.x0, p1 = ax === \"x\" ? fb.z1 : fb.x1;\n    let loStop = 0, hiStop = ax === \"x\" ? sz.width : sz.depth;\n    const us = units || [];\n    for (let i = 0; i < us.length; i++) {\n      const v = us[i];\n      if (v.id === u.id || !sameLevel(v, u)) continue;\n      const fbs = footBoxes(v);\n      for (let j = 0; j < fbs.length; j++) {\n        const b = fbs[j];\n        const b0 = ax === \"x\" ? b.x0 : b.z0, b1 = ax === \"x\" ? b.x1 : b.z1;\n        const q0 = ax === \"x\" ? b.z0 : b.x0, q1 = ax === \"x\" ? b.z1 : b.x1;\n        if (q1 <= p0 + 1 || q0 >= p1 - 1) continue;\n        if (b1 <= a0 + 1 && b1 > loStop) loStop = b1;\n        if (b0 >= a1 - 1 && b0 < hiStop) hiStop = b0;\n      }\n    }\n    return {\n      lo: Math.max(0, Math.round((a0 - loStop) * 10) / 10),\n      hi: Math.max(0, Math.round((hiStop - a1) * 10) / 10)\n    };\n  }\n  function gapOffer(units, u) {\n    if (!gapEligible(u)) return { ok: false, why: \"This cabinet cannot be widened to fill a gap.\" };\n    const g2 = gapBeside(units, u), TOL = 1;\n    const lo = g2.lo > TOL ? g2.lo : 0, hi = g2.hi > TOL ? g2.hi : 0;\n    if (!lo && !hi) return { ok: false, why: \"There is no gap beside this cabinet.\" };\n    return {\n      ok: true,\n      lo,\n      hi,\n      ambiguous: !!(lo && hi),\n      dir: lo && !hi ? \"lo\" : hi && !lo ? \"hi\" : null,\n      loLabel: \"towards the left end of this wall\",\n      hiLabel: \"towards the right end of this wall\"\n    };\n  }\n  function gapFillExtend(units, u, dir) {\n    if (!gapEligible(u)) return { ok: false, why: \"This cabinet cannot be widened.\" };\n    const g2 = gapBeside(units, u);\n    const room = dir === \"lo\" ? g2.lo : g2.hi;\n    if (room <= 1) return { ok: false, why: \"There is no gap on that side.\" };\n    const lim = gapWidthLimits(u), was = u.w;\n    const want = Math.min(lim.max, u.w + room);\n    if (want <= u.w + 0.5)\n      return { ok: false, why: \"This cabinet is already at its maximum width of \" + lim.max + \" mm.\" };\n    const snap3 = { x: u.x, z: u.z, w: u.w };\n    const ax = unitAlongAxis(u), grow3 = want - u.w;\n    u.w = want;\n    if (dir === \"lo\") {\n      if (ax === \"x\") u.x -= grow3;\n      else u.z -= grow3;\n    }\n    const ok2 = !behindWall(u, u.x, u.z) && !units.some(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    });\n    if (!ok2) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.w = snap3.w;\n      return { ok: false, why: \"Widening it there would run into something.\" };\n    }\n    return {\n      ok: true,\n      was,\n      now: u.w,\n      added: Math.round((u.w - was) * 10) / 10,\n      leftOver: Math.max(0, Math.round((room - (u.w - was)) * 10) / 10)\n    };\n  }\n  function gapFillShare(units, u, dir) {\n    const g2 = gapBeside(units, u);\n    const room = dir === \"lo\" ? g2.lo : g2.hi;\n    if (room <= 1) return { ok: false, why: \"There is no gap on that side.\" };\n    const ax = unitAlongAxis(u);\n    const run = gapContiguousRun(units, u);\n    if (!run.length) return { ok: false, why: \"There is no run to share this gap across.\" };\n    const snap3 = run.map(function(v2) {\n      return { u: v2, x: v2.x, z: v2.z, w: v2.w };\n    });\n    const was = run.map(function(v2) {\n      return v2.w;\n    });\n    const add = run.map(function() {\n      return 0;\n    });\n    let left = room, guard = 0;\n    while (left > 0.5 && guard++ < 64) {\n      const takers = run.filter(function(v2, i2) {\n        return v2.w + add[i2] < gapWidthLimits(v2).max - 0.5;\n      });\n      if (!takers.length) break;\n      const each = left / takers.length;\n      let moved = 0;\n      for (let i2 = 0; i2 < run.length; i2++) {\n        const v2 = run[i2];\n        if (v2.w + add[i2] >= gapWidthLimits(v2).max - 0.5) continue;\n        const can = Math.min(each, gapWidthLimits(v2).max - (v2.w + add[i2]));\n        add[i2] += can;\n        moved += can;\n      }\n      if (moved <= 1e-3) break;\n      left -= moved;\n    }\n    const total = add.reduce(function(t, v2) {\n      return t + v2;\n    }, 0);\n    if (total <= 0.5)\n      return { ok: false, why: \"Every cabinet in this run is already at its maximum width.\" };\n    run.forEach(function(v2, i2) {\n      v2.w = Math.round((v2.w + add[i2]) * 10) / 10;\n    });\n    let edge, i, v, f;\n    if (dir === \"hi\") {\n      f = foot(snap3[0].u);\n      edge = ax === \"x\" ? f.x0 : f.z0;\n      for (i = 0; i < run.length; i++) {\n        v = run[i];\n        const fa = foot(v), cur0 = ax === \"x\" ? fa.x0 : fa.z0;\n        if (ax === \"x\") v.x += edge - cur0;\n        else v.z += edge - cur0;\n        const fb2 = foot(v);\n        edge += ax === \"x\" ? fb2.x1 - fb2.x0 : fb2.z1 - fb2.z0;\n      }\n    } else {\n      f = foot(snap3[snap3.length - 1].u);\n      edge = ax === \"x\" ? f.x1 : f.z1;\n      for (i = run.length - 1; i >= 0; i--) {\n        v = run[i];\n        const fc = foot(v), cur1 = ax === \"x\" ? fc.x1 : fc.z1;\n        if (ax === \"x\") v.x += edge - cur1;\n        else v.z += edge - cur1;\n        const fd = foot(v);\n        edge -= ax === \"x\" ? fd.x1 - fd.x0 : fd.z1 - fd.z0;\n      }\n    }\n    const bad = run.some(function(q) {\n      return behindWall(q, q.x, q.z);\n    }) || units.some(function(a, ia) {\n      return units.some(function(b, ib) {\n        return ia !== ib && sameLevel(a, b) && overlaps(a, b);\n      });\n    });\n    if (bad) {\n      snap3.forEach(function(sv) {\n        sv.u.x = sv.x;\n        sv.u.z = sv.z;\n        sv.u.w = sv.w;\n      });\n      return { ok: false, why: \"Sharing the gap would run into something - nothing was changed.\" };\n    }\n    return {\n      ok: true,\n      count: run.length,\n      added: Math.round(total * 10) / 10,\n      each: run.map(function(q, ii) {\n        return { id: q.id, was: was[ii], now: q.w };\n      }),\n      leftOver: Math.max(0, Math.round((room - total) * 10) / 10)\n    };\n  }\n\n  // v2/src/model/free-placement.js\n  var NUDGE_DIRS = [\n    { k: \"right\", dx: 1, dz: 0 },\n    { k: \"left\", dx: -1, dz: 0 },\n    { k: \"front\", dx: 0, dz: 1 },\n    { k: \"back\", dx: 0, dz: -1 }\n  ];\n  function nudgeDir(k) {\n    for (let i = 0; i < NUDGE_DIRS.length; i++) if (NUDGE_DIRS[i].k === k) return NUDGE_DIRS[i];\n    return null;\n  }\n  function nudgeLimit(units, u, dirKey) {\n    const d = nudgeDir(dirKey);\n    if (!d || !u) return null;\n    const mine = footBoxes(u);\n    const horiz = d.dx !== 0;\n    const sgn = horiz ? d.dx : d.dz;\n    let best = Infinity, what = \"wall\", other = null;\n    const R4 = roomSize();\n    for (let i = 0; i < mine.length; i++) {\n      const m = mine[i];\n      const room = horiz ? sgn > 0 ? R4.width - m.x1 : m.x0 : sgn > 0 ? R4.depth - m.z1 : m.z0;\n      if (room < best) {\n        best = room;\n        what = \"wall\";\n        other = null;\n      }\n    }\n    const us = units || [];\n    for (let i = 0; i < us.length; i++) {\n      const v = us[i];\n      if (v === u || v.id === u.id) continue;\n      if (!sameLevel(v, u)) continue;\n      const theirs = footBoxes(v);\n      for (let j = 0; j < mine.length; j++) {\n        const m = mine[j];\n        for (let k = 0; k < theirs.length; k++) {\n          const o = theirs[k];\n          const across = horiz ? m.z0 < o.z1 - 0.5 && m.z1 > o.z0 + 0.5 : m.x0 < o.x1 - 0.5 && m.x1 > o.x0 + 0.5;\n          if (!across) continue;\n          const gap = horiz ? sgn > 0 ? o.x0 - m.x1 : m.x0 - o.x1 : sgn > 0 ? o.z0 - m.z1 : m.z0 - o.z1;\n          if (gap < -0.5) continue;\n          if (gap < best) {\n            best = gap;\n            what = \"cabinet\";\n            other = v;\n          }\n        }\n      }\n    }\n    const vs = unitVSpan(u);\n    for (const zn of openingZones()) {\n      if (vs[1] <= zn.v0 + 1 || vs[0] >= zn.v1 - 1 || unitInZone(u, zn)) continue;\n      const o = zn.box;\n      for (let j = 0; j < mine.length; j++) {\n        const m = mine[j];\n        const across = horiz ? m.z0 < o.z1 - 0.5 && m.z1 > o.z0 + 0.5 : m.x0 < o.x1 - 0.5 && m.x1 > o.x0 + 0.5;\n        if (!across) continue;\n        const gap = horiz ? sgn > 0 ? o.x0 - m.x1 : m.x0 - o.x1 : sgn > 0 ? o.z0 - m.z1 : m.z0 - o.z1;\n        if (gap < -0.5) continue;\n        if (gap < best) {\n          best = gap;\n          what = \"opening\";\n          other = openingHit(zn);\n        }\n      }\n    }\n    if (!isFinite(best)) return null;\n    return {\n      dist: Math.max(0, Math.round(best * 100) / 100),\n      what,\n      other,\n      dx: d.dx,\n      dz: d.dz,\n      key: dirKey\n    };\n  }\n  function fitsHere(units, u) {\n    if (behindWall(u, u.x, u.z)) return false;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v === u || v.id === u.id) continue;\n      if (!sameLevel(v, u)) continue;\n      if (overlaps(v, u)) return false;\n    }\n    for (const zn of openingZones()) if (unitInZone(u, zn)) return false;\n    return true;\n  }\n  function sweepWall(units, u, wallId, preferAt) {\n    const sz = roomSize();\n    const sw = seatWallById(wallId);\n    const horiz = sw ? sw.axis === \"z\" : wallId === \"back\" || wallId === \"front\";\n    const span2 = sw ? sw.hi : horiz ? sz.width : sz.depth, from = sw ? sw.lo : 0;\n    const snap3 = { x: u.x, z: u.z, rot: u.rot, run: u.run };\n    const STEP = 25;\n    let best = null, bestGap = Infinity;\n    for (let a = from; a <= span2; a += STEP) {\n      if (!attachToRoomWall(units, u, wallId, a)) continue;\n      if (!fitsHere(units, u)) continue;\n      const f = foot(u);\n      const mid = horiz ? (f.x0 + f.x1) / 2 : (f.z0 + f.z1) / 2;\n      const gap = preferAt == null ? mid : Math.abs(mid - preferAt);\n      if (gap < bestGap) {\n        bestGap = gap;\n        best = { x: u.x, z: u.z, rot: u.rot };\n      }\n    }\n    u.x = snap3.x;\n    u.z = snap3.z;\n    u.rot = snap3.rot;\n    u.run = snap3.run;\n    return best;\n  }\n  function anchorWalls(units, anchor) {\n    if (!anchor) return [];\n    if (seatWalls()) return touchedRoomWalls(anchor, 60);\n    const sz = roomSize(), T22 = 60, out = [];\n    footBoxes(anchor).forEach(function(g2) {\n      if (Math.abs(g2.z0 - 0) < T22 && out.indexOf(\"back\") < 0) out.push(\"back\");\n      if (Math.abs(g2.z1 - sz.depth) < T22 && out.indexOf(\"front\") < 0) out.push(\"front\");\n      if (Math.abs(g2.x0 - 0) < T22 && out.indexOf(\"left\") < 0) out.push(\"left\");\n      if (Math.abs(g2.x1 - sz.width) < T22 && out.indexOf(\"right\") < 0) out.push(\"right\");\n    });\n    return out;\n  }\n  function wallFreeSpans(units, nu, wallId) {\n    const sw = seatWallById(wallId);\n    if (sw) return freeSpansOn(units, nu, sw);\n    const sz = roomSize();\n    const horiz = wallId === \"back\" || wallId === \"front\";\n    const span2 = horiz ? sz.width : sz.depth;\n    const T22 = 60, taken = [];\n    (units || []).forEach(function(v) {\n      if (v === nu || v.id === nu.id) return;\n      if (!sameLevel(v, nu)) return;\n      footBoxes(v).forEach(function(g2) {\n        const on = wallId === \"back\" ? Math.abs(g2.z0 - 0) < T22 : wallId === \"front\" ? Math.abs(g2.z1 - sz.depth) < T22 : wallId === \"left\" ? Math.abs(g2.x0 - 0) < T22 : Math.abs(g2.x1 - sz.width) < T22;\n        if (!on) return;\n        taken.push(horiz ? { a: g2.x0, b: g2.x1, u: v } : { a: g2.z0, b: g2.z1, u: v });\n      });\n    });\n    taken.sort(function(p1, p2) {\n      return p1.a - p2.a;\n    });\n    const out = [];\n    let at = 0, prev = null;\n    for (let i = 0; i < taken.length; i++) {\n      const t = taken[i];\n      if (t.a - at > FIT_TOL)\n        out.push({ from: at, to: t.a, len: t.a - at, before: prev, after: t.u, wall: wallId });\n      at = Math.max(at, t.b);\n      prev = t.u;\n    }\n    if (span2 - at > FIT_TOL)\n      out.push({ from: at, to: span2, len: span2 - at, before: prev, after: null, wall: wallId });\n    return out;\n  }\n  function freeSpansOn(units, nu, w) {\n    const T22 = 60, taken = [], horiz = w.axis === \"z\";\n    (units || []).forEach(function(v) {\n      if (v === nu || v.id === nu.id || !sameLevel(v, nu)) return;\n      footBoxes(v).forEach(function(g2) {\n        if (Math.abs(gapToWall(g2, w)) >= T22 || !alongWall(g2, w)) return;\n        taken.push(horiz ? { a: g2.x0, b: g2.x1, u: v } : { a: g2.z0, b: g2.z1, u: v });\n      });\n    });\n    taken.sort(function(p1, p2) {\n      return p1.a - p2.a;\n    });\n    const out = [];\n    let at = w.lo, prev = null;\n    for (let i = 0; i < taken.length; i++) {\n      const t = taken[i];\n      if (t.a - at > FIT_TOL) out.push({ from: at, to: t.a, len: t.a - at, before: prev, after: t.u, wall: w.id });\n      at = Math.max(at, t.b);\n      prev = t.u;\n    }\n    if (w.hi - at > FIT_TOL) out.push({ from: at, to: w.hi, len: w.hi - at, before: prev, after: null, wall: w.id });\n    return out;\n  }\n  var isCornerPlan = (u) => /corner/.test(u.type || \"\");\n  function elevationOf(units, anchor) {\n    if (!anchor) return null;\n    if (seatWalls()) return elevationOnFree(units, anchor);\n    const sz = roomSize(), f = foot(anchor), T22 = 80;\n    let w = null;\n    const k = ((anchor.rot || 0) % 4 + 4) % 4;\n    const own2 = k === 0 ? Math.abs(f.z0) < T22 ? \"back\" : null : k === 1 ? Math.abs(f.x1 - sz.width) < T22 ? \"right\" : null : k === 2 ? Math.abs(f.z1 - sz.depth) < T22 ? \"front\" : null : Math.abs(f.x0) < T22 ? \"left\" : null;\n    if (own2 && !isCornerPlan(anchor)) w = own2;\n    else if (Math.abs(f.z0 - 0) < T22) w = \"back\";\n    else if (Math.abs(f.z1 - sz.depth) < T22) w = \"front\";\n    else if (Math.abs(f.x0 - 0) < T22) w = \"left\";\n    else if (Math.abs(f.x1 - sz.width) < T22) w = \"right\";\n    if (!w) return null;\n    const horiz = w === \"back\" || w === \"front\";\n    let lo = horiz ? f.x0 : f.z0, hi = horiz ? f.x1 : f.z1;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v === anchor || v.id === anchor.id) continue;\n      const g2 = foot(v);\n      const onSame = horiz ? Math.abs(g2.z0 - f.z0) < 200 || Math.abs(g2.z1 - f.z1) < 200 : Math.abs(g2.x0 - f.x0) < 200 || Math.abs(g2.x1 - f.x1) < 200;\n      if (!onSame) continue;\n      lo = Math.min(lo, horiz ? g2.x0 : g2.z0);\n      hi = Math.max(hi, horiz ? g2.x1 : g2.z1);\n    }\n    return { wall: w, horiz, start: lo, end: hi };\n  }\n  function elevationOnFree(units, anchor) {\n    const f = foot(anchor), ws = touchedRoomWalls(anchor, 80);\n    if (!ws.length) return null;\n    const bf = [\"back\", \"right\", \"front\", \"left\"][((anchor.rot || 0) % 4 + 4) % 4];\n    const id = !isCornerPlan(anchor) && ws.filter(function(x) {\n      return seatWallById(x).face === bf;\n    })[0] || ws[0];\n    const w = seatWallById(id), horiz = w.axis === \"z\";\n    let lo = horiz ? f.x0 : f.z0, hi = horiz ? f.x1 : f.z1;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v === anchor || v.id === anchor.id) continue;\n      const g2 = foot(v);\n      if (Math.abs(gapToWall(g2, w)) >= 200 || !alongWall(g2, w)) continue;\n      lo = Math.min(lo, horiz ? g2.x0 : g2.z0);\n      hi = Math.max(hi, horiz ? g2.x1 : g2.z1);\n    }\n    return { wall: id, horiz, start: lo, end: hi };\n  }\n  function placeNearestLegal(units, u, anchor) {\n    const tried = [];\n    const elev = elevationOf(units, anchor);\n    if (elev) {\n      tried.push(elev.wall);\n      const at = sweepWall(units, u, elev.wall, elev.start);\n      if (at) {\n        u.x = at.x;\n        u.z = at.z;\n        u.rot = at.rot;\n        return { ok: true, wall: elev.wall, sameWall: true };\n      }\n    }\n    const walls = roomWallList().map(function(w) {\n      return w.id;\n    });\n    for (let i = 0; i < walls.length; i++) {\n      if (tried.indexOf(walls[i]) >= 0) continue;\n      const at2 = sweepWall(units, u, walls[i], null);\n      if (at2) {\n        u.x = at2.x;\n        u.z = at2.z;\n        u.rot = at2.rot;\n        return { ok: true, wall: walls[i], sameWall: false };\n      }\n    }\n    return { ok: false };\n  }\n  function placeFreeFloor(units, u) {\n    const sz = roomSize(), snap3 = { x: u.x, z: u.z };\n    const STEP = 100;\n    let best = null, bestD = Infinity;\n    const cx = sz.width / 2, cz = sz.depth / 2;\n    for (let x = 0; x <= sz.width; x += STEP) {\n      for (let z = 0; z <= sz.depth; z += STEP) {\n        u.x = x;\n        u.z = z;\n        if (!fitsHere(units, u)) continue;\n        const f = foot(u);\n        const d = Math.hypot((f.x0 + f.x1) / 2 - cx, (f.z0 + f.z1) / 2 - cz);\n        if (d < bestD) {\n          bestD = d;\n          best = { x, z };\n        }\n      }\n    }\n    u.x = snap3.x;\n    u.z = snap3.z;\n    if (!best) return { ok: false };\n    u.x = best.x;\n    u.z = best.z;\n    return { ok: true, floor: true };\n  }\n  var FIT_MIN = CABINET_MIN_W;\n  var FIT_TOL = 2;\n  function runFreeSpans(units, nu, anchor) {\n    const elev = elevationOf(units, anchor);\n    if (!elev) return null;\n    const sz = roomSize();\n    const span2 = elev.horiz ? sz.width : sz.depth;\n    const taken = [];\n    (units || []).forEach(function(v) {\n      if (v === nu || v.id === nu.id) return;\n      if (!sameLevel(v, nu)) return;\n      const g2 = foot(v);\n      const onLine = elev.horiz ? Math.abs(g2.z0 - (elev.wall === \"back\" ? 0 : sz.depth - (g2.z1 - g2.z0))) < 200 || Math.abs(g2.z1 - sz.depth) < 200 || Math.abs(g2.z0) < 200 : Math.abs(g2.x1 - sz.width) < 200 || Math.abs(g2.x0) < 200;\n      if (!onLine) return;\n      taken.push(elev.horiz ? { a: g2.x0, b: g2.x1, u: v } : { a: g2.z0, b: g2.z1, u: v });\n    });\n    taken.sort(function(p1, p2) {\n      return p1.a - p2.a;\n    });\n    const out = [];\n    let at = 0, prev = null;\n    for (let i = 0; i < taken.length; i++) {\n      const t = taken[i];\n      if (t.a - at > FIT_TOL)\n        out.push({ from: at, to: t.a, len: t.a - at, before: prev, after: t.u });\n      at = Math.max(at, t.b);\n      prev = t.u;\n    }\n    if (span2 - at > FIT_TOL)\n      out.push({ from: at, to: span2, len: span2 - at, before: prev, after: null });\n    return { elev, spans: out };\n  }\n\n  // v2/src/model/snap-turn.js\n  function snapUnit(units, u, px, pz, enabled, prev, py) {\n    prev = prev || { x: null, z: null, y: null };\n    const res = { x: px, z: pz, y: py, cues: [], snapX: null, snapZ: null, snapY: null };\n    if (!enabled) return res;\n    function pick(axis, cands, cur, was) {\n      let best = null;\n      for (let i = 0; i < cands.length; i++) {\n        const c = cands[i];\n        const dist2 = Math.abs(cur - c.at);\n        const limit = was && was === c.key ? SNAP.off : SNAP.on;\n        if (dist2 <= limit && (!best || dist2 < best.dist)) best = { c, dist: dist2 };\n      }\n      return best;\n    }\n    const cx = [], cz = [], cy = [];\n    units.forEach(function(v) {\n      if (v.id === u.id) return;\n      if (v.family === u.family) {\n        cy.push({ key: v.id + \":top\", at: v.y + v.h - u.h, label: \"Tops aligned\" });\n        cy.push({ key: v.id + \":bottom\", at: v.y, label: \"Cabinets level\" });\n      }\n      cx.push({ key: v.id + \":right\", at: v.x + v.w, label: \"Cabinets side by side\" });\n      cx.push({ key: v.id + \":left\", at: v.x - u.w, label: \"Cabinets side by side\" });\n      cx.push({ key: v.id + \":alignL\", at: v.x, label: \"Cabinets lined up\" });\n      cz.push({ key: v.id + \":front\", at: v.z, label: \"Fronts aligned\" });\n      cz.push({ key: v.id + \":back\", at: v.z + v.d - u.d, label: \"Backs aligned\" });\n    });\n    const bx2 = pick(\"x\", cx, px, prev.x), bz = pick(\"z\", cz, pz, prev.z);\n    if (bx2) {\n      res.x = bx2.c.at;\n      res.snapX = bx2.c.key;\n      res.cues.push(bx2.c.label);\n    }\n    if (bz) {\n      res.z = bz.c.at;\n      res.snapZ = bz.c.key;\n      res.cues.push(bz.c.label);\n    }\n    if (py !== void 0 && py !== null) {\n      const by = pick(\"y\", cy, py, prev.y);\n      res.y = by ? by.c.at : py;\n      res.snapY = by ? by.c.key : null;\n      if (by) res.cues.push(by.c.label);\n    }\n    return res;\n  }\n  function snapDim(units, u, key, value) {\n    let best = null;\n    for (let i = 0; i < units.length; i++) {\n      const v = units[i];\n      if (v.id === u.id) continue;\n      const dist2 = Math.abs(value - v[key]);\n      if (dist2 > 0 && dist2 <= SNAP.on && (!best || dist2 < best.dist)) best = { val: v[key], dist: dist2, id: v.id };\n    }\n    return best ? { value: best.val, cue: key.toUpperCase() + \" matched to \" + best.id + \" (\" + best.val + \" mm)\" } : { value, cue: null };\n  }\n  function clearRoomSide(u) {\n    if (u && String(u.type).indexOf(\"corner\") === 0) u.roomSide = null;\n  }\n  function turnUnit(units, u, dir) {\n    if (!u) return { ok: false, reason: \"none\" };\n    const was = u.rot || 0, wasSide = u.roomSide;\n    u.rot = ((was + (dir < 0 ? -1 : 1)) % 4 + 4) % 4;\n    clearRoomSide(u);\n    if (behindWall(u, u.x, u.z)) {\n      u.rot = was;\n      u.roomSide = wasSide;\n      return { ok: false, reason: \"wall\", by: WALL_HIT };\n    }\n    const hit2 = units.filter(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    })[0];\n    if (hit2) {\n      u.rot = was;\n      return { ok: false, reason: \"blocked\", by: hit2 };\n    }\n    return { ok: true };\n  }\n  function flipUnit(units, u) {\n    if (!u) return { ok: false, reason: \"none\", why: \"Nothing is selected.\" };\n    const before = foot(u);\n    const cx0 = (before.x0 + before.x1) / 2, cz0 = (before.z0 + before.z1) / 2;\n    const snap3 = { x: u.x, z: u.z, rot: u.rot, roomSide: u.roomSide };\n    u.rot = (((u.rot || 0) + 2) % 4 + 4) % 4;\n    clearRoomSide(u);\n    const after = foot(u);\n    u.x += cx0 - (after.x0 + after.x1) / 2;\n    u.z += cz0 - (after.z0 + after.z1) / 2;\n    if (behindWall(u, u.x, u.z)) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      u.roomSide = snap3.roomSide;\n      return {\n        ok: false,\n        reason: \"wall\",\n        why: \"Turning it the other way would put part of it through a wall.\"\n      };\n    }\n    const hit2 = units.filter(function(v) {\n      return v.id !== u.id && sameLevel(v, u) && overlaps(u, v);\n    })[0];\n    if (hit2) {\n      u.x = snap3.x;\n      u.z = snap3.z;\n      u.rot = snap3.rot;\n      u.roomSide = snap3.roomSide;\n      return {\n        ok: false,\n        reason: \"blocked\",\n        by: hit2,\n        why: \"Turning it the other way would run into \" + displayName(units, hit2) + \".\"\n      };\n    }\n    return { ok: true, rot: u.rot };\n  }\n  function wallOffWall(u) {\n    return u.family === \"wall\" && (u.rot || 0) !== 0;\n  }\n\n  // v2/src/render/view-constants.js\n  var view_constants_exports = {};\n  __export(view_constants_exports, {\n    APPLIANCE_GREY: () => APPLIANCE_GREY,\n    CENTRE_GAIN: () => CENTRE_GAIN,\n    COLOURS: () => COLOURS,\n    FIT_PAD: () => FIT_PAD,\n    FIT_R: () => FIT_R,\n    FLOOR_EYE_GAP: () => FLOOR_EYE_GAP,\n    FOVY: () => FOVY,\n    NEAR_GAP: () => NEAR_GAP,\n    PITCH: () => PITCH,\n    TEX: () => TEX,\n    VIEW_MIN_MM: () => VIEW_MIN_MM,\n    ZOOM: () => ZOOM,\n    ZOOM_EASE_MIN: () => ZOOM_EASE_MIN,\n    clampZoom: () => clampZoom\n  });\n  var APPLIANCE_GREY = [0.56, 0.575, 0.59];\n  var COLOURS = {\n    white: [0.962, 0.96, 0.95],\n    oak: [0.692, 0.544, 0.396],\n    /* pure white Egger W1100 ST9 (task 1790948486103): #FFFFFF, the light and shade still model the boards */\n    w1100: [1, 1, 1],\n    hole: [0.352, 0.345, 0.332]\n  };\n  var TEX = { alongMM: 900, acrossMM: 675, size: 1024 };\n  var FIT_R = { assembled: 820, exploded: 1080 };\n  var ZOOM = { min: 0.02, max: 5, step: 1.35, wheel: 8e-4, stepMax: 1.18 };\n  var ZOOM_EASE_MIN = 0.05;\n  var NEAR_GAP = 40;\n  var VIEW_MIN_MM = 110;\n  var CENTRE_GAIN = 1.7;\n  function clampZoom(z) {\n    z = typeof z === \"number\" && isFinite(z) ? z : 1;\n    return Math.min(ZOOM.max, Math.max(ZOOM.min, z));\n  }\n  var FIT_PAD = 1.14;\n  var FOVY = 35 * Math.PI / 180;\n  var PITCH = { min: 0.03, max: 1.15 };\n  var FLOOR_EYE_GAP = 120;\n\n  // v2/src/render/mesh/overlays.js\n  var ALIGN_GREEN = [0.1, 0.74, 0.28];\n  var SEL_BLUE = [1, 0.62, 0.1];\n  var UL_GREEN = [0.1, 0.74, 0.28];\n  var UL_GREEN_SOFT = [0.55, 0.78, 0.58];\n  var PAD_OK = [0.16, 0.72, 0.32];\n  var PAD_BAD = [0.82, 0.22, 0.2];\n  function emitAlignGuides(d, cues, u) {\n    return;\n    if (!cues || !u) return;\n    if (!cues.fronts && cues.front) cues = { fronts: [cues.front], tops: cues.top ? [cues.top] : [] };\n    if (!cues.fronts) cues = { fronts: [], tops: cues.tops || (cues.top ? [cues.top] : []) };\n    const GREEN = ALIGN_GREEN, t = 30, bar = 40;\n    const FRONT_DROP = 150;\n    (cues.fronts || []).forEach(function(f) {\n      const lo = Math.min(f.from, f.to), hi = Math.max(f.from, f.to);\n      const yc = f.y - FRONT_DROP;\n      if (f.axis === \"z\")\n        emitBox(d, lo, hi, yc - bar / 2, yc + bar / 2, f.at - t / 2 + f.dir * t / 2, f.at + t / 2 + f.dir * t / 2, GREEN, 0, 0);\n      else\n        emitBox(d, f.at - t / 2 + f.dir * t / 2, f.at + t / 2 + f.dir * t / 2, yc - bar / 2, yc + bar / 2, lo, hi, GREEN, 0, 0);\n    });\n    (cues.tops || []).forEach(function(c) {\n      const y = c.y;\n      const cs = c.centres;\n      if (cs && cs.length) {\n        for (let i = 0; i + 1 < cs.length; i++) {\n          const a = cs[i], b = cs[i + 1];\n          const xl = Math.min(a.x, b.x), xh = Math.max(a.x, b.x);\n          const zl = Math.min(a.z, b.z), zh = Math.max(a.z, b.z);\n          emitBox(d, xl - t / 2, xh + t / 2, y + 2, y + 2 + bar, zl - t / 2, zh + t / 2, GREEN, 0, 0);\n        }\n        if (cs.length === 1) emitBox(d, cs[0].x - t / 2, cs[0].x + t / 2, y + 2, y + 2 + bar, cs[0].z - t / 2, cs[0].z + t / 2, GREEN, 0, 0);\n      } else {\n        const axis = c.axis || (c.x1 - c.x0 >= c.z1 - c.z0 ? \"x\" : \"z\");\n        const lo = c.lo, hi = c.hi, mid = c.mid;\n        if (axis === \"x\") emitBox(d, lo, hi, y + 2, y + 2 + bar, mid - t / 2, mid + t / 2, GREEN, 0, 0);\n        else emitBox(d, mid - t / 2, mid + t / 2, y + 2, y + 2 + bar, lo, hi, GREEN, 0, 0);\n      }\n    });\n  }\n  function emitSelWire(d, u) {\n    const SEL5 = SEL_BLUE, t = 7, pad = 8;\n    const yBot = (u.family === \"wall\" ? u.y || 0 : -LEG_H) - pad;\n    const yTop = (u.y || 0) + u.h + pad;\n    footBoxes(u).forEach(function(b) {\n      const x0 = b.x0 - pad, x1 = b.x1 + pad, z0 = b.z0 - pad, z1 = b.z1 + pad;\n      function eX(y, z) {\n        emitBox(d, x0, x1, y - t / 2, y + t / 2, z - t / 2, z + t / 2, SEL5, 0, 0);\n      }\n      function eY(x, z) {\n        emitBox(d, x - t / 2, x + t / 2, yBot, yTop, z - t / 2, z + t / 2, SEL5, 0, 0);\n      }\n      function eZ(x, y) {\n        emitBox(d, x - t / 2, x + t / 2, y - t / 2, y + t / 2, z0, z1, SEL5, 0, 0);\n      }\n      eX(yBot, z0);\n      eX(yBot, z1);\n      eX(yTop, z0);\n      eX(yTop, z1);\n      eZ(x0, yBot);\n      eZ(x1, yBot);\n      eZ(x0, yTop);\n      eZ(x1, yTop);\n      eY(x0, z0);\n      eY(x1, z0);\n      eY(x0, z1);\n      eY(x1, z1);\n    });\n  }\n  var PART_HOVER = [0.2, 0.62, 0.99];\n  var PART_SEL = [0.05, 0.36, 0.86];\n  function emitPartMark(d, box3, col, zoomK) {\n    if (!box3) return;\n    const span2 = Math.min(Math.min(box3.x1 - box3.x0, box3.y1 - box3.y0), box3.z1 - box3.z0);\n    const t = clamp4(Math.max(3, span2 * 0.22), 3, 9) * (zoomK || 1);\n    const pad = t * 0.55;\n    const x0 = box3.x0 - pad, x1 = box3.x1 + pad;\n    const y0 = box3.y0 - pad, y1 = box3.y1 + pad;\n    const z0 = box3.z0 - pad, z1 = box3.z1 + pad;\n    function eX(y, z) {\n      emitBox(d, x0, x1, y - t / 2, y + t / 2, z - t / 2, z + t / 2, col, 0, 0);\n    }\n    function eY(x, z) {\n      emitBox(d, x - t / 2, x + t / 2, y0, y1, z - t / 2, z + t / 2, col, 0, 0);\n    }\n    function eZ(x, y) {\n      emitBox(d, x - t / 2, x + t / 2, y - t / 2, y + t / 2, z0, z1, col, 0, 0);\n    }\n    eX(y0, z0);\n    eX(y0, z1);\n    eX(y1, z0);\n    eX(y1, z1);\n    eZ(x0, y0);\n    eZ(x1, y0);\n    eZ(x0, y1);\n    eZ(x1, y1);\n    eY(x0, z0);\n    eY(x1, z0);\n    eY(x0, z1);\n    eY(x1, z1);\n  }\n  var GHOST_OK = [0.92, 0.435, 0];\n  var GHOST_BAD = [0.86, 0.16, 0.14];\n  var GHOST_CENTRED = [0.16, 0.72, 0.32];\n  var GHOST_OFF_CENTRE = [0.9, 0.2, 0.16];\n  function ghostColour(g2) {\n    if (!g2 || !g2.ok) return GHOST_BAD;\n    if (g2.centred === true) return GHOST_CENTRED;\n    if (g2.centred === false) return GHOST_OFF_CENTRE;\n    return GHOST_OK;\n  }\n  function ghostFilled(g2) {\n    return !g2 || !g2.ok || g2.centred !== true && g2.centred !== false;\n  }\n  function emitPlaceGhost(d, g2, zoomK) {\n    if (!g2 || !g2.box) return;\n    const b = g2.box, col = ghostColour(g2);\n    if (ghostFilled(g2)) emitBox(d, b.x0, b.x1, b.y0, b.y1, b.z0, b.z1, col, 0, 0);\n    emitPartMark(d, b, col, zoomK);\n  }\n  function emitCornerTargetPad(d, sc) {\n    return;\n    const t = sc && sc.cornerTarget;\n    if (!t || !t.box) return;\n    const b = t.box, y = (t.y || 0) + 4;\n    const col = t.ok ? PAD_OK : PAD_BAD;\n    emitBox(d, b.x0, b.x1, y, y + 8, b.z0, b.z1, col, 0, 0, null, [0, 1, 0]);\n  }\n  function emitUpperLowerGuides(d, units, snapOn) {\n    return;\n    const gs = upperLowerGuides(units, snapOn);\n    if (!gs.length) return;\n    gs.forEach(function(g2) {\n      const aligned = g2.kind === \"aligned\";\n      const GREEN = aligned ? UL_GREEN : UL_GREEN_SOFT;\n      const t = aligned ? 14 : 6;\n      const p = ulPlaneFor(units, g2);\n      if (g2.axis === \"x\")\n        emitBox(d, g2.at - t / 2, g2.at + t / 2, g2.y0, g2.y1, p - t / 2, p + t / 2, GREEN, 0, 0, null);\n      else\n        emitBox(d, p - t / 2, p + t / 2, g2.y0, g2.y1, g2.at - t / 2, g2.at + t / 2, GREEN, 0, 0, null);\n      if (!aligned) return;\n      if (g2.axis === \"x\") {\n        emitBox(d, g2.baseEdge - t / 2, g2.baseEdge + t / 2, g2.y0 - 40, g2.y0, p - t / 2, p + t / 2, GREEN, 0, 0, null);\n        emitBox(d, g2.wallEdge - t / 2, g2.wallEdge + t / 2, g2.y1, g2.y1 + 40, p - t / 2, p + t / 2, GREEN, 0, 0, null);\n      } else {\n        emitBox(d, p - t / 2, p + t / 2, g2.y0 - 40, g2.y0, g2.baseEdge - t / 2, g2.baseEdge + t / 2, GREEN, 0, 0, null);\n        emitBox(d, p - t / 2, p + t / 2, g2.y1, g2.y1 + 40, g2.wallEdge - t / 2, g2.wallEdge + t / 2, GREEN, 0, 0, null);\n      }\n    });\n  }\n\n  // v2/src/render/mesh/constants.js\n  var MAT_CLASS = {\n    PLAIN: 0,\n    // \u043A\u043B\u0430\u0441\u0441 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D (\u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430; \u0442\u0435\u0441\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 0)\n    BOARD_WHITE: 1,\n    // COLOURS.white \u2014 \u043A\u043E\u0440\u043F\u0443\u0441, \u0444\u0430\u0441\u0430\u0434\u044B, \u0434\u043E\u0431\u043E\u0440\u044B, \u043F\u043B\u0438\u043D\u0442\u0443\u0441, \u043D\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435\n    BOARD_OAK: 2,\n    // COLOURS.oak \u2014 \u0442\u043E \u0436\u0435 \u0432 \u0434\u0443\u0431\u0435 (tex = 1: \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u0430 \u0434\u0435\u043A\u043E\u0440\u0430)\n    HOLE: 3,\n    // COLOURS.hole \u2014 \u043E\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044F \u043F\u043E\u0434 \u043F\u043E\u043B\u043A\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043B\u0438, \u0434\u043D\u043E \u044F\u0449\u0438\u043A\u0430 (\u0414\u0412\u041F)\n    REVEAL: 4,\n    // GAP_DARK \u2014 \u0437\u0430\u0437\u043E\u0440\u044B \u043C\u0435\u0436\u0434\u0443 \u0444\u0430\u0441\u0430\u0434\u0430\u043C\u0438 \u0438 \u0448\u0432\u044B \u043C\u0435\u0436\u0434\u0443 \u0448\u043A\u0430\u0444\u0430\u043C\u0438; REVEAL_DARK\n    METAL: 5,\n    // MET.* \u2014 \u043F\u0435\u0442\u043B\u0438, \u043F\u043E\u043B\u043A\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043B\u0438, \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u044F\u0449\u0438\u043A\u043E\u0432\n    LEG: 6,\n    // LEG_COL.* \u2014 \u043D\u043E\u0436\u043A\u0438\n    APPLIANCE: 7,\n    // APPLIANCE_GREY \u2014 \u043C\u0435\u0441\u0442\u043E \u043F\u043E\u0434 \u0442\u0435\u0445\u043D\u0438\u043A\u0443 \u0432 \u0432\u044B\u0441\u043E\u043A\u043E\u043C \u0448\u043A\u0430\u0444\u0443\n    WALL: 8,\n    // WALL_GREY \u2014 \u0441\u0442\u0435\u043D\u044B \u043A\u043E\u043C\u043D\u0430\u0442\u044B \u0438 \u0444\u043E\u043D\u0430\n    FLOOR: 9,\n    // FLOOR_TONE \u2014 \u043F\u043E\u043B\n    CONTACT: 10,\n    // \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043D\u044B\u0435 \u0442\u0435\u043D\u0438 \u043D\u0430 \u043F\u043E\u043B\u0443 (\u0446\u0432\u0435\u0442 \u043D\u0430 \u043B\u0435\u0442\u0443, \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u043E\u0439)\n    SEL: 11,\n    // SEL_BLUE \u2014 \u043A\u0430\u0440\u043A\u0430\u0441 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0448\u043A\u0430\u0444\u0430\n    PART_MARK: 12,\n    // PART_HOVER, PART_SEL \u2014 \u043C\u0435\u0442\u043A\u0438 \u0434\u0435\u0442\u0430\u043B\u0438 (\u043F\u043E\u0434 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u0435\u043C / \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439)\n    GUIDE: 13,\n    // ALIGN_GREEN, UL_GREEN, UL_GREEN_SOFT \u2014 \u0437\u0435\u043B\u0451\u043D\u044B\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435;\n    // PAD_OK, PAD_BAD \u2014 \u043F\u043B\u043E\u0449\u0430\u0434\u043A\u0430 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0443\u0433\u043B\u0430 (\u0437\u0435\u043B\u0451\u043D\u0430\u044F / \u043A\u0440\u0430\u0441\u043D\u0430\u044F)\n    WALL_PAINT: 14,\n    // WALL_COLOURS[*].rgb \u2014 \u0441\u0442\u0435\u043D\u044B \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C \u0446\u0432\u0435\u0442\u0435 (room-style.js, \u0437\u0430\u0434\u0430\u0447\u0430 1790876476355)\n    FLOOR_FINISH: 15,\n    // FLOOR_FINISHES[*].colours[*].rgb \u2014 \u043F\u043E\u043B \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u043E\u0442\u0434\u0435\u043B\u043A\u0435\n    OPENING: 16,\n    // OPENING_COLOURS.frame / leaf \u2014 \u0440\u0430\u043C\u0430 \u043E\u043A\u043D\u0430, \u043A\u043E\u0440\u043E\u0431\u043A\u0430, \u043D\u0430\u043B\u0438\u0447\u043D\u0438\u043A, \u043F\u043E\u043B\u043E\u0442\u043D\u043E \u0434\u0432\u0435\u0440\u0438\n    GLASS: 17,\n    // OPENING_COLOURS.glass \u2014 \u0441\u0442\u0435\u043A\u043B\u043E \u043E\u043A\u043D\u0430 (\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0435)\n    PAINT_MATT: 18,\n    // PAINT_RGB[\"satin-matt\"][*] \u2014 \u043A\u0440\u0430\u0448\u0435\u043D\u044B\u0439 \u0444\u0430\u0441\u0430\u0434 \u041C\u0414\u0424, \u0441\u0430\u0442\u0438\u043D / \u043C\u0430\u0442 (front-materials.js, 1790895487998)\n    PAINT_GLOSS: 19,\n    // PAINT_RGB[\"gloss\" | \"high-gloss\"][*] \u2014 \u043A\u0440\u0430\u0448\u0435\u043D\u044B\u0439 \u0444\u0430\u0441\u0430\u0434 \u041C\u0414\u0424, \u0433\u043B\u044F\u043D\u0435\u0446\n    APPL_STEEL: 22,\n    // brushed stainless of a Bosch appliance (render/mesh/appliances.js, task 1791557195336)\n    APPL_GLASS: 23,\n    // black glass: the oven door, the induction hob\n    APPL_DARK: 24,\n    // knobs, display, zone rings, touch strip, hood buttons\n    SPLASH_GLASS: 25,\n    // a glass splashback in its chosen colour (render/mesh/splash.js; colour by hint, any custom colour)\n    SPLASH_TILE: 26,\n    // a tiled splashback: the renderer's tile texture (render/splash-texture.js)\n    WORKTOP: 21,\n    // a worktop decor the planner holds no calibrated Egger board for: its own colour (model/worktop-catalogue.js, 1791478310196)\n    WORKSHOP_BOARD: 27,\n    // native construction board: preserve its explicit vertex colour\n    BOARD_PURE: 20\n    // COLOURS.w1100 \u2014 \u0442\u043E \u0436\u0435, \u0447\u0442\u043E BOARD_WHITE, \u043D\u043E \u0447\u0438\u0441\u0442\u043E \u0431\u0435\u043B\u043E\u0435 #FFFFFF (Egger W1100 ST9, 1790948486103)\n  };\n\n  // v2/src/render/mesh/decor.js\n  var DECOR_CLASS_BASE = 100;\n  var WT_CLASS_BASE = 600;\n  var WT2 = null;\n  function wtArr(hex) {\n    const h = parseInt(String(hex).replace(\"#\", \"\"), 16);\n    return [(h >> 16 & 255) / 255, (h >> 8 & 255) / 255, (h & 255) / 255];\n  }\n  function wtBuild() {\n    WT2 = { byKey: {}, rec: [], flat: {} };\n    for (const L of WT_LINES) {\n      if (!L.colour || L.colour.key || !L.colour.hex) continue;\n      const k = L.decor + L.tex, t = L.colour.texture;\n      if (t && t.url) {\n        if (WT2.byKey[k]) continue;\n        const wood = L.decor[0] === \"H\";\n        const d = {\n          key: \"wt-\" + k.toLowerCase(),\n          code: L.decor,\n          tex: L.tex,\n          name: L.name,\n          group: wood ? \"woods\" : \"stone\",\n          kind: \"texture\",\n          hex: L.colour.hex.slice(1),\n          grain: t.grain === \"v\" ? \"v\" : \"none\",\n          mm: t.mm,\n          scale: \"approximate\",\n          surface: wood ? \"structured\" : \"smooth\",\n          pack: {\n            url: t.url,\n            high: t.url,\n            mm: t.mm,\n            grain: t.grain === \"v\" ? \"v\" : \"none\",\n            repeat: \"mirror\",\n            offsetMm: null,\n            qual: \"Approximate: EGGER's own decor image (about \" + t.mm[0] + \" x \" + t.mm[1] + \" mm) repeated mirrored, not the full-board arrangement\"\n          },\n          source: t.egger,\n          label: \"Egger \" + L.decor + \" \" + L.tex + \" \" + L.name + \" (worktop)\",\n          worktop: true\n        };\n        WT2.byKey[k] = { arr: wtArr(L.colour.hex), code: WT_CLASS_BASE + WT2.rec.length, d };\n        WT2.rec.push(d);\n      } else if (!WT2.flat[L.colour.hex]) WT2.flat[L.colour.hex] = wtArr(L.colour.hex);\n    }\n    return WT2;\n  }\n  function worktopColour(line) {\n    if (line && line.colour && line.colour.key) return { col: boardColour(line.colour.key), tex: boardTex(line.colour.key) };\n    const A = WT2 || wtBuild(), e = line ? A.byKey[line.decor + line.tex] : null;\n    if (e) return { col: e.arr, tex: 1 };\n    return { col: line && line.colour && A.flat[line.colour.hex] || boardColour(\"white\"), tex: 0 };\n  }\n  function worktopClassEntries(code) {\n    const A = WT2 || wtBuild();\n    return Object.keys(A.byKey).map((k) => [A.byKey[k].arr, A.byKey[k].code]).concat(Object.keys(A.flat).map((k) => [A.flat[k], code]));\n  }\n  function worktopDecorOfClass(code) {\n    const A = WT2 || wtBuild();\n    const i = code - WT_CLASS_BASE;\n    return i >= 0 && i < A.rec.length ? A.rec[i] : null;\n  }\n  var LEGACY = { white: 1, oak: 1, w1100: 1 };\n  var ARR = null;\n  function build() {\n    ARR = { col: {}, idx: {} };\n    for (let i = 0; i < EGGER_DECORS.length; i++) {\n      const d = EGGER_DECORS[i];\n      ARR.idx[d.key] = i;\n      if (LEGACY[d.key]) continue;\n      const h = parseInt(d.hex, 16);\n      ARR.col[d.key] = [(h >> 16 & 255) / 255, (h >> 8 & 255) / 255, (h & 255) / 255];\n    }\n    return ARR;\n  }\n  function boardColour(key) {\n    if (key && LEGACY[key]) return COLOURS[key];\n    const paint = paintOfKey(key);\n    if (paint) return paintColour(paint);\n    const A = ARR || build();\n    return key && Object.prototype.hasOwnProperty.call(A.col, key) ? A.col[key] : COLOURS.white;\n  }\n  function boardTex(key) {\n    if (key === \"oak\") return 1;\n    if (paintOfKey(key)) return 0;\n    if (!key || LEGACY[key]) return 0;\n    const d = decorOf(key);\n    return d && (d.kind === \"texture\" || decorSurface(d).relief) ? 1 : 0;\n  }\n  function decorRelief(d) {\n    return !!d && d.kind === \"solid\" && decorSurface(d).relief;\n  }\n  function decorClassEntries() {\n    const A = ARR || build(), out = [];\n    for (const key of Object.keys(A.col)) out.push([A.col[key], DECOR_CLASS_BASE + A.idx[key]]);\n    return out;\n  }\n  function decorOfClass(code) {\n    if (code >= WT_CLASS_BASE) return worktopDecorOfClass(code);\n    const i = code - DECOR_CLASS_BASE;\n    return i >= 0 && i < EGGER_DECORS.length && !LEGACY[EGGER_DECORS[i].key] ? EGGER_DECORS[i] : null;\n  }\n  function decorUvTransform(d, tex) {\n    const T3 = tex || { alongMM: 900, acrossMM: 675 };\n    if (d.grain === \"v\") return { rotation: Math.PI / 2, repeat: [T3.acrossMM / d.mm[0], T3.alongMM / d.mm[1]] };\n    return { rotation: 0, repeat: [T3.alongMM / d.mm[0], T3.acrossMM / d.mm[1]] };\n  }\n\n  // v2/src/render/mesh/appliances.js\n  var C = (h) => [(h >> 16 & 255) / 255, (h >> 8 & 255) / 255, (h & 255) / 255];\n  var APPL_COL = {\n    steel: C(13159632),\n    steelEdge: C(10331048),\n    // brushed stainless (oven band, handle, hood)\n    glass: C(1316377),\n    glassEdge: C(2237738),\n    // black glass (oven door, hob)\n    knob: C(2829616),\n    led: C(13120030),\n    // knobs / display surround, the red LED\n    zone: C(3816770),\n    touch: C(5790818)\n    // hob zone rings, the touch-control strip\n  };\n  function applianceClassEntries(C22) {\n    return [\n      [APPL_COL.steel, C22.APPL_STEEL],\n      [APPL_COL.steelEdge, C22.APPL_STEEL],\n      [APPL_COL.glass, C22.APPL_GLASS],\n      [APPL_COL.glassEdge, C22.APPL_GLASS],\n      [APPL_COL.knob, C22.APPL_DARK],\n      [APPL_COL.led, C22.APPL_DARK],\n      [APPL_COL.zone, C22.APPL_DARK],\n      [APPL_COL.touch, C22.APPL_DARK]\n    ];\n  }\n  function emitOven(d, u, OFF2, kitchen) {\n    const L = ovenHobLayout(u, kitchen);\n    if (!L) return;\n    const o = L.oven, f = o.front, A = APPLIANCES.oven;\n    featTag(\"Oven - \" + A.model);\n    emitBoxXf(d, o.body.x0, o.body.x1, o.body.y0, o.body.y1, o.body.z0, o.body.z1 - 0.5, APPL_COL.steelEdge, 0, 0, OFF2);\n    emitBoxXf(d, f.x0, f.x1, o.panelY, f.y1, f.z0, f.z1, APPL_COL.steel, 0, 0, OFF2);\n    emitBoxXf(d, f.x0, f.x1, f.y0, o.panelY - 1, f.z0, f.z1 - 1, APPL_COL.glassEdge, 0, 0, OFF2);\n    emitBoxXf(d, f.x0 + 6, f.x1 - 6, f.y0 + 6, o.panelY - 6, f.z1 - 1, f.z1, APPL_COL.glass, 0, 0, OFF2);\n    const hz = f.z1 + 18, hy = o.handle.y;\n    [o.handle.x0 + 25, o.handle.x1 - 25].forEach((x) => emitCylAB(d, [x, hy, f.z1], [x, hy, hz], 6, 10, APPL_COL.steelEdge, OFF2));\n    emitCylAB(d, [o.handle.x0, hy, hz], [o.handle.x1, hy, hz], 9, 14, APPL_COL.steel, OFF2);\n    const ky = (o.panelY + f.y1) / 2;\n    o.knobs.forEach((x) => {\n      emitCylAB(d, [x, ky, f.z1], [x, ky, f.z1 + 3], 24, 20, APPL_COL.steelEdge, OFF2);\n      emitCylAB(d, [x, ky, f.z1 + 3], [x, ky, f.z1 + 24], 19, 20, APPL_COL.knob, OFF2);\n    });\n    emitBoxXf(d, o.display.x0, o.display.x1, ky - 16, ky + 16, f.z1, f.z1 + 1.5, APPL_COL.knob, 0, 0, OFF2);\n    emitBoxXf(d, o.display.x0 + 30, o.display.x1 - 30, ky - 7, ky + 7, f.z1 + 1.5, f.z1 + 2, APPL_COL.led, 0, 0, OFF2);\n  }\n  function ceilingY(room) {\n    return room && room.on !== false && Number(room.height) > 0 ? Number(room.height) - LEG_H : NaN;\n  }\n  function worldBox(xf, b) {\n    const ps = [[b.x0, b.y0, b.z0], [b.x1, b.y1, b.z1], [b.x0, b.y0, b.z1], [b.x1, b.y0, b.z0]].map((p) => xf.p(p));\n    const xs = ps.map((p) => p[0]), zs = ps.map((p) => p[2]);\n    return { x0: Math.min(...xs), x1: Math.max(...xs), y0: b.y0, y2: b.y1, z0: Math.min(...zs), z1: Math.max(...zs) };\n  }\n  function quadXf(d, xf, q, col) {\n    const n = vnorm(vcross(vsub(q[1], q[0]), vsub(q[2], q[0])));\n    pushQuad(d, q.map((p) => xf.p(p)), xf.n(n), col, null, 0);\n  }\n  function emitHobsAndHoods(d, units, kitchen, room) {\n    const out = [];\n    const walls = (units || []).filter((w) => w && w.family === \"wall\").map((w) => {\n      const b = worldBox(unitXf(w), { x0: 0, x1: w.w, y0: 0, y1: w.h, z0: 0, z1: w.d });\n      return { name: \"A wall cabinet\", box: { x0: b.x0, x1: b.x1, z0: b.z0, z1: b.z1, y0: w.y, y1: w.y + w.h } };\n    });\n    (units || []).filter(isOvenBase).forEach((u) => {\n      const L = ovenHobLayout(u, kitchen), OFF2 = unitXf(u), h = L.hob;\n      featTag(\"Hob - \" + APPLIANCES.hob.model);\n      emitBoxXf(d, h.x0, h.x1, h.y0, h.y1, h.z0, h.z1, APPL_COL.glass, 0, 0, OFF2);\n      h.zones.forEach((z) => emitRing(d, [z[0], h.y1 + 0.3, z[1]], [0, 1, 0], z[2] - 6, z[2], 40, APPL_COL.zone, OFF2));\n      emitBoxXf(d, h.x0 + 150, h.x1 - 150, h.y1, h.y1 + 0.3, h.z1 - 45, h.z1 - 25, APPL_COL.touch, 0, 0, OFF2);\n      const rec = { id: u.id, hob: true, hood: null };\n      if (L.hood) {\n        const H2 = L.hood, k = APPLIANCES.hood, wb = worldBox(OFF2, { x0: H2.x0, x1: H2.x1, y0: H2.y0, y1: H2.y0 + k.total[0], z0: H2.z0, z1: H2.z1 });\n        wb.y0 = (u.y || 0) + H2.y0;\n        wb.y2 = (u.y || 0) + H2.y0 + k.total[0];\n        const fit = hoodFit(L, ceilingY(room) - (u.y || 0), wb, walls);\n        rec.hood = { refuse: fit.refuse, notes: fit.notes, chimneyTop: fit.chimneyTop };\n        if (!fit.refuse) {\n          featTag(\"Extractor hood - \" + k.model);\n          const cx = (H2.x0 + H2.x1) / 2, rim = 55, ch = k.chimney.lower;\n          emitBoxXf(d, H2.x0, H2.x1, H2.y0, H2.y0 + rim, H2.z0, H2.z1, APPL_COL.steel, 0, 0, OFF2);\n          emitBoxXf(d, H2.x0 + 20, H2.x1 - 20, H2.y0 - 0.5, H2.y0, H2.z0 + 20, H2.z1 - 20, APPL_COL.steelEdge, 0, 0, OFF2);\n          const y0 = H2.y0 + rim, y1 = H2.y1, b = [H2.x0, H2.x1, H2.z0, H2.z1], t = [cx - ch[0] / 2, cx + ch[0] / 2, 0, ch[1]];\n          quadXf(d, OFF2, [[b[0], y0, b[3]], [b[1], y0, b[3]], [t[1], y1, t[3]], [t[0], y1, t[3]]], APPL_COL.steel);\n          quadXf(d, OFF2, [[b[0], y0, b[2]], [b[0], y0, b[3]], [t[0], y1, t[3]], [t[0], y1, t[2]]], APPL_COL.steel);\n          quadXf(d, OFF2, [[b[1], y0, b[3]], [b[1], y0, b[2]], [t[1], y1, t[2]], [t[1], y1, t[3]]], APPL_COL.steel);\n          const top = fit.chimneyTop != null ? fit.chimneyTop : H2.chimney.y1;\n          emitBoxXf(d, t[0], t[1], y1, top, 0, ch[1], APPL_COL.steel, 0, 0, OFF2);\n          [-60, -20, 20, 60].forEach((dx) => emitBoxXf(d, cx + dx - 12, cx + dx + 12, H2.y0 + 18, H2.y0 + 34, H2.z1, H2.z1 + 2, APPL_COL.knob, 0, 0, OFF2));\n        }\n      }\n      out.push(rec);\n    });\n    return out;\n  }\n\n  // v2/src/render/mesh/materials.js\n  function matRegistry() {\n    const C3 = MAT_CLASS, m = /* @__PURE__ */ new Map();\n    m.set(COLOURS.white, C3.BOARD_WHITE);\n    m.set(COLOURS.oak, C3.BOARD_OAK);\n    m.set(COLOURS.w1100, C3.BOARD_PURE);\n    for (const [col, code] of decorClassEntries()) m.set(col, code);\n    for (const [col, code] of worktopClassEntries(C3.WORKTOP)) m.set(col, code);\n    for (const [col, code] of applianceClassEntries(C3)) m.set(col, code);\n    m.set(COLOURS.hole, C3.HOLE);\n    m.set(GAP_DARK, C3.REVEAL);\n    m.set(REVEAL_DARK, C3.REVEAL);\n    for (const k of Object.keys(MET)) m.set(MET[k], C3.METAL);\n    m.set(GOLA_COL, C3.METAL);\n    for (const k of Object.keys(LEG_COL)) m.set(LEG_COL[k], C3.LEG);\n    m.set(APPLIANCE_GREY, C3.APPLIANCE);\n    m.set(WALL_GREY, C3.WALL);\n    m.set(FLOOR_TONE, C3.FLOOR);\n    m.set(SEL_BLUE, C3.SEL);\n    m.set(PART_HOVER, C3.PART_MARK);\n    m.set(PART_SEL, C3.PART_MARK);\n    m.set(ALIGN_GREEN, C3.GUIDE);\n    m.set(UL_GREEN, C3.GUIDE);\n    m.set(UL_GREEN_SOFT, C3.GUIDE);\n    m.set(PAD_OK, C3.GUIDE);\n    m.set(PAD_BAD, C3.GUIDE);\n    for (const c of WALL_COLOURS) m.set(c.rgb, C3.WALL_PAINT);\n    for (const f of FLOOR_FINISHES) for (const c of f.colours) m.set(c.rgb, C3.FLOOR_FINISH);\n    m.set(OPENING_COLOURS.frame, C3.OPENING);\n    m.set(OPENING_COLOURS.leaf, C3.OPENING);\n    m.set(OPENING_COLOURS.glass, C3.GLASS);\n    m.set(OPENING_COLOURS.handle, C3.METAL);\n    for (const f of PAINT_FINISHES) for (const k of Object.keys(PAINT_RGB[f.id]))\n      m.set(PAINT_RGB[f.id][k], f.gloss ? C3.PAINT_GLOSS : C3.PAINT_MATT);\n    return m;\n  }\n\n  // v2/src/render/mesh/prims.js\n  var MAT_REG = null;\n  var MAT_HINT = 0;\n  var ROLE = 0;\n  var FEAT = null;\n  function featCapture(on) {\n    FEAT = on ? { boxes: [], pts: [], tag: null, front: null } : null;\n  }\n  function featTaken() {\n    const f = FEAT;\n    FEAT = null;\n    return f;\n  }\n  function featTag(t, inset) {\n    if (!FEAT) return null;\n    const w = FEAT.tag;\n    FEAT.tag = t;\n    FEAT.inset = inset || 0;\n    return w;\n  }\n  function featFront(t) {\n    if (!FEAT) return null;\n    const w = FEAT.front;\n    FEAT.front = t;\n    return w;\n  }\n  function featOn() {\n    return !!FEAT;\n  }\n  function featPoint(p, kind, rank, part) {\n    if (FEAT) FEAT.pts.push({ p: [p[0], p[1], p[2]], kind, rank, part: part || FEAT.tag || null });\n  }\n  function featBoxOf(x0, x1, y0, y1, z0, z1, xf, name2, front, g2) {\n    if (g2) {\n      const lo = (a, b) => Math.min(a, b) - g2, hi = (a, b) => Math.max(a, b) + g2;\n      const X0 = lo(x0, x1), X1 = hi(x0, x1), Y0 = lo(y0, y1), Y1 = hi(y0, y1), Z0 = lo(z0, z1), Z1 = hi(z0, z1);\n      x0 = X0;\n      x1 = X1;\n      y0 = Y0;\n      y1 = Y1;\n      z0 = Z0;\n      z1 = Z1;\n    }\n    const ext = [Math.abs(x1 - x0), Math.abs(y1 - y0), Math.abs(z1 - z0)];\n    if (Math.max(ext[0], ext[1], ext[2]) < 25) return;\n    const P2 = xf && xf.p ? xf.p : function(q) {\n      return q;\n    };\n    const c = [];\n    for (const x of [x0, x1]) for (const y of [y0, y1]) for (const z of [z0, z1]) c.push(P2([x, y, z]));\n    FEAT.boxes.push({ c, name: name2 || null, front: !!front });\n  }\n  function matClassOf(col) {\n    if (!MAT_REG) MAT_REG = matRegistry();\n    const k = MAT_REG.get(col);\n    return k === void 0 ? MAT_HINT : k;\n  }\n  function setMatHint(c) {\n    const keep = MAT_HINT;\n    MAT_HINT = c;\n    return keep;\n  }\n  function emitFrontBoxXf(d, x0, x1, y0, y1, z0, z1, col, grainAxis, tex, xf, onlyN) {\n    if (FEAT) featBoxOf(x0, x1, y0, y1, z0, z1, xf, FEAT.front || \"Front\", true, EPS);\n    const keep = ROLE;\n    ROLE = 1;\n    try {\n      emitBox(d, x0, x1, y0, y1, z0, z1, col, grainAxis, tex, xf, onlyN);\n    } finally {\n      ROLE = keep;\n    }\n  }\n  function earClip(poly) {\n    const n = poly.length, idx = [];\n    for (let i = 0; i < n; i++) idx.push(i);\n    let area = 0;\n    for (let i = 0; i < n; i++) {\n      const a = poly[i], b = poly[(i + 1) % n];\n      area += a[0] * b[1] - b[0] * a[1];\n    }\n    const ccw = area > 0, tris = [];\n    const cr = (a, b, c) => (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n    const inTri = (p, a, b, c) => {\n      const d1 = cr(a, b, p), d2 = cr(b, c, p), d3 = cr(c, a, p);\n      return ccw ? d1 > 1e-12 && d2 > 1e-12 && d3 > 1e-12 : d1 < -1e-12 && d2 < -1e-12 && d3 < -1e-12;\n    };\n    let guard = 0;\n    while (idx.length > 3 && guard++ < 1e4) {\n      let cut = false;\n      for (let k = 0; k < idx.length; k++) {\n        const ia = idx[(k + idx.length - 1) % idx.length], ib = idx[k], ic = idx[(k + 1) % idx.length];\n        const a = poly[ia], b = poly[ib], c = poly[ic], v = cr(a, b, c);\n        if (ccw ? v <= 1e-12 : v >= -1e-12) continue;\n        if (idx.some((j) => j !== ia && j !== ib && j !== ic && inTri(poly[j], a, b, c))) continue;\n        tris.push([ia, ib, ic]);\n        idx.splice(k, 1);\n        cut = true;\n        break;\n      }\n      if (!cut) break;\n    }\n    if (idx.length === 3) tris.push([idx[0], idx[1], idx[2]]);\n    return { tris, ccw };\n  }\n  function v3sub(a, b) {\n    return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n  }\n  function v3cross(a, b) {\n    return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n  }\n  function v3unit(a) {\n    const l = Math.hypot(a[0], a[1], a[2]) || 1;\n    return [a[0] / l, a[1] / l, a[2] / l];\n  }\n  function pushOut(d, pts, nOut, col, xf) {\n    const g2 = v3cross(v3sub(pts[1], pts[0]), v3sub(pts[2], pts[0]));\n    if (g2[0] * nOut[0] + g2[1] * nOut[1] + g2[2] * nOut[2] < 0) pts = [pts[0]].concat(pts.slice(1).reverse());\n    const P2 = xf ? pts.map((q) => xf.p(q)) : pts, N = xf ? xf.n(nOut) : nOut;\n    if (P2.length === 3) pushTri(d, P2[0], P2[1], P2[2], N, col, null, 0);\n    else pushQuad(d, P2, N, col, null, 0);\n  }\n  function pushOutSmooth(d, pts, ns, nOut, col, xf) {\n    const g2 = v3cross(v3sub(pts[1], pts[0]), v3sub(pts[2], pts[0]));\n    if (g2[0] * nOut[0] + g2[1] * nOut[1] + g2[2] * nOut[2] < 0) {\n      pts = [pts[0]].concat(pts.slice(1).reverse());\n      ns = [ns[0]].concat(ns.slice(1).reverse());\n    }\n    const P2 = xf ? pts.map((q) => xf.p(q)) : pts, N = xf ? ns.map((q) => xf.n(q)) : ns;\n    for (const [i, j, k] of [[0, 1, 2], [0, 2, 3]]) {\n      for (const v of [i, j, k]) d.push(P2[v][0], P2[v][1], P2[v][2], N[v][0], N[v][1], N[v][2], col[0], col[1], col[2], 0, 0, 0);\n      if (d.meta) d.meta.push(matClassOf(col), ROLE);\n    }\n  }\n  function emitFrontProfileXf(d, b, prof, col, tex, xf) {\n    if (FEAT) featBoxOf(b.x0, b.x1, b.y0, b.y1, b.z0, b.z1, xf, FEAT.front || \"Front\", true, EPS);\n    const keep = ROLE;\n    ROLE = 1;\n    try {\n      const poly = prof.outline, w0 = prof.along[1], w1 = prof.along[2], n = poly.length;\n      const { tris, ccw } = earClip(poly);\n      const dir3 = (dd, dz) => {\n        const o = prof.at(0, 0, w0), p = prof.at(dd, dz, w0);\n        return [p[0] - o[0], p[1] - o[1], p[2] - o[2]];\n      };\n      const SMOOTH_DEG = 30, en = [];\n      for (let i = 0; i < n; i++) {\n        const a = poly[i], c = poly[(i + 1) % n], ed = c[0] - a[0], ez = c[1] - a[1], l = Math.hypot(ed, ez) || 1;\n        en.push(ccw ? [ez / l, -ed / l] : [-ez / l, ed / l]);\n      }\n      const cosS = Math.cos(SMOOTH_DEG * Math.PI / 180);\n      const vN = (i, own2) => {\n        const p = en[(i + n - 1) % n], q = en[i % n], o = en[own2];\n        if (p[0] * q[0] + p[1] * q[1] < cosS) return o;\n        return [(p[0] + q[0]) / 2, (p[1] + q[1]) / 2];\n      };\n      for (let i = 0; i < n; i++) {\n        const a = poly[i], c = poly[(i + 1) % n];\n        const na = v3unit(dir3(...vN(i, i))), nc = v3unit(dir3(...vN((i + 1) % n, i))), nOut = v3unit(dir3(en[i][0], en[i][1]));\n        pushOutSmooth(\n          d,\n          [prof.at(a[0], a[1], w0), prof.at(c[0], c[1], w0), prof.at(c[0], c[1], w1), prof.at(a[0], a[1], w1)],\n          [na, nc, nc, na],\n          nOut,\n          col,\n          xf\n        );\n      }\n      const ax = prof.along[0], nEnd = (sgn) => [ax === \"x\" ? sgn : 0, 0, ax === \"z\" ? sgn : 0];\n      for (const t3 of tris) {\n        pushOut(d, t3.map((k) => prof.at(poly[k][0], poly[k][1], w0)), nEnd(-1), col, xf);\n        pushOut(d, t3.map((k) => prof.at(poly[k][0], poly[k][1], w1)), nEnd(1), col, xf);\n      }\n    } finally {\n      ROLE = keep;\n    }\n  }\n  function emitBoardProfileXf(d, outline2, z0, z1, col, grainAxis, tex, xf) {\n    const poly = outline2, n = poly.length;\n    if (n < 3) return;\n    const { tris, ccw } = earClip(poly);\n    const uvFor = (pts, nAxis, extPts) => {\n      const inPlane = [0, 1, 2].filter((a) => a !== nAxis), E = extPts || pts;\n      const ext = inPlane.map((a) => Math.max(...E.map((p) => p[a])) - Math.min(...E.map((p) => p[a])));\n      let gA, aA;\n      if (grainAxis != null && inPlane.indexOf(grainAxis) >= 0) {\n        gA = grainAxis;\n        aA = inPlane.find((a) => a !== grainAxis);\n      } else {\n        gA = ext[0] >= ext[1] ? inPlane[0] : inPlane[1];\n        aA = inPlane.find((a) => a !== gA);\n      }\n      return pts.map((p) => [p[gA] / TEX.alongMM, p[aA] / TEX.acrossMM]);\n    };\n    const put = (pts, nOut, uvs) => {\n      const g2 = v3cross(v3sub(pts[1], pts[0]), v3sub(pts[2], pts[0]));\n      if (g2[0] * nOut[0] + g2[1] * nOut[1] + g2[2] * nOut[2] < 0) {\n        pts = [pts[0]].concat(pts.slice(1).reverse());\n        uvs = [uvs[0]].concat(uvs.slice(1).reverse());\n      }\n      const P2 = xf ? pts.map((q) => xf.p(q)) : pts, N = xf ? xf.n(nOut) : nOut;\n      const tri = (i, j, k) => {\n        for (const v of [i, j, k]) d.push(P2[v][0], P2[v][1], P2[v][2], N[0], N[1], N[2], col[0], col[1], col[2], uvs[v][0], uvs[v][1], tex || 0);\n        if (d.meta) d.meta.push(matClassOf(col), ROLE);\n      };\n      tri(0, 1, 2);\n      if (P2.length === 4) tri(0, 2, 3);\n    };\n    for (let i = 0; i < n; i++) {\n      const a = poly[i], c = poly[(i + 1) % n], ex = c[0] - a[0], ey = c[1] - a[1], l = Math.hypot(ex, ey);\n      if (l < 1e-9) continue;\n      const nOut = ccw ? [ey / l, -ex / l, 0] : [-ey / l, ex / l, 0];\n      const q = [[a[0], a[1], z0], [c[0], c[1], z0], [c[0], c[1], z1], [a[0], a[1], z1]];\n      put(q, nOut, uvFor(q, Math.abs(nOut[0]) > Math.abs(nOut[1]) ? 0 : 1));\n    }\n    for (const [z, s] of [[z0, -1], [z1, 1]]) {\n      const cap2 = poly.map((p) => [p[0], p[1], z]), uv = uvFor(cap2, 2);\n      for (const t3 of tris) put(t3.map((k) => cap2[k]), [0, 0, s], t3.map((k) => uv[k]));\n    }\n  }\n  var loopArea = (l) => l.reduce((s, p, i) => {\n    const q = l[(i + 1) % l.length];\n    return s + p[0] * q[1] - q[0] * p[1];\n  }, 0) / 2;\n  function bridgeHoles(outer, holes) {\n    let poly = loopArea(outer) > 0 ? outer.slice() : outer.slice().reverse();\n    const hs = holes.map((h) => loopArea(h) < 0 ? h.slice() : h.slice().reverse()).sort((h, k) => Math.max(...k.map((p) => p[0])) - Math.max(...h.map((p) => p[0])));\n    for (const h of hs) {\n      let m = 0;\n      h.forEach((p, i) => {\n        if (p[0] > h[m][0]) m = i;\n      });\n      const M = h[m];\n      let best = null;\n      for (let i = 0; i < poly.length; i++) {\n        const p = poly[i], q = poly[(i + 1) % poly.length];\n        if (!(p[1] <= M[1] && M[1] < q[1] || q[1] <= M[1] && M[1] < p[1])) continue;\n        const x = p[0] + (M[1] - p[1]) * (q[0] - p[0]) / (q[1] - p[1]);\n        if (x > M[0] && (!best || x < best.x)) best = { i, x };\n      }\n      if (!best) continue;\n      const I = [best.x, M[1]], ring = h.slice(m).concat(h.slice(0, m));\n      poly = poly.slice(0, best.i + 1).concat([I], ring, [M, I], poly.slice(best.i + 1));\n    }\n    return poly;\n  }\n  function emitCutBoardXf(d, cut, t0, t1, col, grainAxis, tex, xf) {\n    const A = cut.plane[0], B = cut.plane[1], T3 = cut.thin;\n    const P3 = (p, t) => {\n      const q = [0, 0, 0];\n      q[A] = p[0];\n      q[B] = p[1];\n      q[T3] = t;\n      return q;\n    };\n    const outer = loopArea(cut.outer) > 0 ? cut.outer : cut.outer.slice().reverse();\n    const holes = cut.holes.map((h) => loopArea(h) < 0 ? h : h.slice().reverse());\n    if (FEAT && ROLE !== 1) {\n      const lo = [Math.min(...outer.map((p) => p[0])), Math.min(...outer.map((p) => p[1]))], hi = [Math.max(...outer.map((p) => p[0])), Math.max(...outer.map((p) => p[1]))];\n      const a = P3(lo, t0), b = P3(hi, t1);\n      featBoxOf(Math.min(a[0], b[0]), Math.max(a[0], b[0]), Math.min(a[1], b[1]), Math.max(a[1], b[1]), Math.min(a[2], b[2]), Math.max(a[2], b[2]), xf, FEAT.tag, false, FEAT.inset || 0);\n    }\n    const uvFor = (pts, nAxis, extPts) => {\n      const inPlane = [0, 1, 2].filter((a) => a !== nAxis), E = extPts || pts;\n      const ext2 = inPlane.map((a) => Math.max(...E.map((p) => p[a])) - Math.min(...E.map((p) => p[a])));\n      let gA, aA;\n      if (grainAxis != null && inPlane.indexOf(grainAxis) >= 0) {\n        gA = grainAxis;\n        aA = inPlane.find((a) => a !== grainAxis);\n      } else {\n        gA = ext2[0] >= ext2[1] ? inPlane[0] : inPlane[1];\n        aA = inPlane.find((a) => a !== gA);\n      }\n      return pts.map((p) => [p[gA] / TEX.alongMM, p[aA] / TEX.acrossMM]);\n    };\n    const put = (pts, nOut, uvs) => {\n      const g2 = v3cross(v3sub(pts[1], pts[0]), v3sub(pts[2], pts[0]));\n      if (g2[0] * nOut[0] + g2[1] * nOut[1] + g2[2] * nOut[2] < 0) {\n        pts = [pts[0]].concat(pts.slice(1).reverse());\n        uvs = [uvs[0]].concat(uvs.slice(1).reverse());\n      }\n      const P2 = xf ? pts.map((q) => xf.p(q)) : pts, N = xf ? xf.n(nOut) : nOut;\n      const tri = (i, j, k) => {\n        for (const v of [i, j, k]) d.push(P2[v][0], P2[v][1], P2[v][2], N[0], N[1], N[2], col[0], col[1], col[2], uvs[v][0], uvs[v][1], tex || 0);\n        if (d.meta) d.meta.push(matClassOf(col), ROLE);\n      };\n      tri(0, 1, 2);\n      if (P2.length === 4) tri(0, 2, 3);\n    };\n    for (const loop of [outer, ...holes]) {\n      for (let i = 0; i < loop.length; i++) {\n        const a = loop[i], c = loop[(i + 1) % loop.length], ex = c[0] - a[0], ey = c[1] - a[1], l = Math.hypot(ex, ey);\n        if (l < 1e-9) continue;\n        const n = [0, 0, 0];\n        n[A] = ey / l;\n        n[B] = -ex / l;\n        const q = [P3(a, t0), P3(c, t0), P3(c, t1), P3(a, t1)];\n        put(q, n, uvFor(q, Math.abs(ey) > Math.abs(ex) ? A : B));\n      }\n    }\n    const poly = bridgeHoles(outer, holes), { tris } = earClip(poly);\n    const ext = outer.map((p) => P3(p, t0));\n    for (const [t, s] of [[t0, -1], [t1, 1]]) {\n      const cap2 = poly.map((p) => P3(p, t)), uv = uvFor(cap2, T3, ext), n = [0, 0, 0];\n      n[T3] = s;\n      for (const t3 of tris) put(t3.map((k) => cap2[k]), n, t3.map((k) => uv[k]));\n    }\n  }\n  var FACE = [\n    { i: [[1, 0, 0], [1, 1, 0], [1, 1, 1], [1, 0, 1]], n: [1, 0, 0] },\n    { i: [[0, 0, 0], [0, 0, 1], [0, 1, 1], [0, 1, 0]], n: [-1, 0, 0] },\n    { i: [[0, 1, 0], [0, 1, 1], [1, 1, 1], [1, 1, 0]], n: [0, 1, 0] },\n    { i: [[0, 0, 0], [1, 0, 0], [1, 0, 1], [0, 0, 1]], n: [0, -1, 0] },\n    { i: [[0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]], n: [0, 0, 1] },\n    { i: [[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]], n: [0, 0, -1] }\n  ];\n  function pushTri(d, a, b, c, n, col, uvFn, tex) {\n    if (!col || !n) {\n      throw new Error(\"ub-lab: missing \" + (!col ? \"colour\" : \"normal\") + \" passed to pushTri - check the MET palette key at the call site\");\n    }\n    [a, b, c].forEach(function(p) {\n      const uv = uvFn ? uvFn(p) : [0, 0];\n      d.push(p[0], p[1], p[2], n[0], n[1], n[2], col[0], col[1], col[2], uv[0], uv[1], tex || 0);\n    });\n    if (d.meta) d.meta.push(matClassOf(col), ROLE);\n  }\n  function pushQuad(d, q, n, col, uvFn, tex) {\n    pushTri(d, q[0], q[1], q[2], n, col, uvFn, tex);\n    pushTri(d, q[0], q[2], q[3], n, col, uvFn, tex);\n  }\n  function emitBox(d, x0, x1, y0, y1, z0, z1, col, grainAxis, tex, xf, onlyN) {\n    if (FEAT && ROLE !== 1) featBoxOf(x0, x1, y0, y1, z0, z1, xf, FEAT.tag, false, FEAT.inset || 0);\n    emitBoxFaces(\n      d,\n      x0,\n      x1,\n      y0,\n      y1,\n      z0,\n      z1,\n      col,\n      grainAxis,\n      tex,\n      xf,\n      onlyN ? function(n) {\n        return n[0] === onlyN[0] && n[1] === onlyN[1] && n[2] === onlyN[2];\n      } : null,\n      null\n    );\n  }\n  function featBox(x0, x1, y0, y1, z0, z1, xf) {\n    if (FEAT && ROLE !== 1) featBoxOf(x0, x1, y0, y1, z0, z1, xf, FEAT.tag, false, FEAT.inset || 0);\n  }\n  function emitBoxFaces(d, x0, x1, y0, y1, z0, z1, col, grainAxis, tex, xf, keep, dimsFor) {\n    const X = [x0, x1], Y = [y0, y1], Z = [z0, z1];\n    const dims = dimsFor || [x1 - x0, y1 - y0, z1 - z0];\n    FACE.forEach(function(f) {\n      if (keep && !keep(f.n)) return;\n      const nAxis = f.n[0] !== 0 ? 0 : f.n[1] !== 0 ? 1 : 2;\n      const inPlane = [0, 1, 2].filter(function(a) {\n        return a !== nAxis;\n      });\n      let gA, aA;\n      if (grainAxis != null && inPlane.indexOf(grainAxis) >= 0) {\n        gA = grainAxis;\n        aA = inPlane.filter(function(a) {\n          return a !== grainAxis;\n        })[0];\n      } else {\n        gA = dims[inPlane[0]] >= dims[inPlane[1]] ? inPlane[0] : inPlane[1];\n        aA = inPlane.filter(function(a) {\n          return a !== gA;\n        })[0];\n      }\n      const local = f.i.map(function(c) {\n        return [X[c[0]], Y[c[1]], Z[c[2]]];\n      });\n      const uvOf = {};\n      local.forEach(function(p, i) {\n        uvOf[i] = [p[gA] / TEX.alongMM, p[aA] / TEX.acrossMM];\n      });\n      const quad = xf ? local.map(function(p) {\n        return xf.p(p);\n      }) : local;\n      const nrm = xf ? xf.n(f.n) : f.n;\n      const idx = /* @__PURE__ */ new Map();\n      quad.forEach(function(p, i) {\n        idx.set(p, i);\n      });\n      pushQuad(d, quad, nrm, col, function(p) {\n        return uvOf[idx.get(p)] || [0, 0];\n      }, tex);\n    });\n  }\n  function emitCylY(d, cx, cz, yBot, yTop, r, seg, col, ribAmt) {\n    let i, a0, a1, r0, r111, p0, p1;\n    function rad(k) {\n      return r + (ribAmt && k % 2 ? ribAmt : 0);\n    }\n    for (i = 0; i < seg; i++) {\n      a0 = 2 * Math.PI * i / seg;\n      a1 = 2 * Math.PI * (i + 1) / seg;\n      r0 = rad(i);\n      r111 = rad(i + 1);\n      p0 = [cx + r0 * Math.cos(a0), cz + r0 * Math.sin(a0)];\n      p1 = [cx + r111 * Math.cos(a1), cz + r111 * Math.sin(a1)];\n      const nx = Math.cos((a0 + a1) / 2), nz = Math.sin((a0 + a1) / 2);\n      pushQuad(d, [[p0[0], yBot, p0[1]], [p0[0], yTop, p0[1]], [p1[0], yTop, p1[1]], [p1[0], yBot, p1[1]]], [nx, 0, nz], col, null, 0);\n      pushTri(d, [cx, yTop, cz], [p1[0], yTop, p1[1]], [p0[0], yTop, p0[1]], [0, 1, 0], col, null, 0);\n      pushTri(d, [cx, yBot, cz], [p0[0], yBot, p0[1]], [p1[0], yBot, p1[1]], [0, -1, 0], col, null, 0);\n    }\n  }\n  function emitDiscXf(d, x, cy, cz, r, seg, col, dir, xf) {\n    const Pf = xf && xf.p ? xf.p : function(p) {\n      return p;\n    };\n    const Nf = xf && xf.n ? xf.n : function(n) {\n      return n;\n    };\n    const nrm = Nf([dir > 0 ? 1 : -1, 0, 0]);\n    const c = Pf([x, cy, cz]);\n    if (FEAT) featPoint(Pf([x - (dir > 0 ? 0.15 : -0.15), cy, cz]), \"hole centre \\xD8\" + Math.round(r * 20) / 10, 1.4);\n    for (let i = 0; i < seg; i++) {\n      const a0 = 2 * Math.PI * i / seg, a1 = 2 * Math.PI * (i + 1) / seg;\n      const p0 = Pf([x, cy + r * Math.cos(a0), cz + r * Math.sin(a0)]);\n      const p1 = Pf([x, cy + r * Math.cos(a1), cz + r * Math.sin(a1)]);\n      if (dir > 0) pushTri(d, c, p0, p1, nrm, col, null, 0);\n      else pushTri(d, c, p1, p0, nrm, col, null, 0);\n    }\n  }\n  var LEG = { plate: 100, plateT: 3, shaftR: 14, collarR: 18, footR: 25, padR: 27 };\n  var LEG_COL = {\n    plate: [0.145, 0.145, 0.15],\n    shaft: [0.105, 0.105, 0.112],\n    collar: [0.175, 0.175, 0.18],\n    foot: [0.088, 0.088, 0.094]\n  };\n  function emitLeg(d, cx, cz, dy) {\n    const C3 = LEG_COL;\n    const h = LEG.plate / 2;\n    emitBox(d, cx - h, cx + h, -LEG.plateT + dy, 0 + dy, cz - h, cz + h, C3.plate, null, 0);\n    emitCylY(d, cx, cz, -118 + dy, -LEG.plateT + dy, LEG.shaftR, 20, C3.shaft, 0);\n    emitCylY(d, cx, cz, -128 + dy, -118 + dy, LEG.collarR, 20, C3.collar, 0);\n    emitCylY(d, cx, cz, -145 + dy, -128 + dy, LEG.footR, 16, C3.foot, 2.2);\n    emitCylY(d, cx, cz, -150 + dy, -145 + dy, LEG.padR, 20, C3.shaft, 0);\n  }\n  var HINGE = {\n    cupR: 17.5,\n    rimR: 18.6,\n    boreR: 14.5,\n    // \u00D835 cup, thin rim, dark recess\n    cupProud: 2.2,\n    boreDepth: 9,\n    cupInset: 22,\n    flangeX0: -18,\n    flangeX1: 19,\n    flangeY: 28.5,\n    flangeThk: 2.5,\n    flangeR: 7,\n    // ~57 across\n    earOffX: 9.5,\n    earOffY: 22.5,\n    earR: 3.1,\n    // offset toward the door centre\n    standoff: 18,\n    plateBoss: 22,\n    // short articulation at the cup\n    armW: 14,\n    armT: 9,\n    // slender straight arm\n    barrelR: 3.6,\n    barrelL: 18,\n    plateSetback: 37,\n    yInset: 70\n  };\n  var HINGE_ZOOM_FIT = 130;\n  var MET = {\n    rim: [0.84, 0.86, 0.89],\n    // thin bright rim / rolled edge\n    wall: [0.66, 0.68, 0.72],\n    recess: [0.21, 0.22, 0.24],\n    // dark recessed cup centre\n    boss: [0.58, 0.6, 0.64],\n    ear: [0.74, 0.76, 0.8],\n    screw: [0.44, 0.46, 0.5],\n    arm: [0.78, 0.8, 0.84],\n    // arm top\n    armSide: [0.54, 0.56, 0.6],\n    // shaded flank\n    barrel: [0.5, 0.52, 0.56],\n    plate: [0.7, 0.72, 0.76],\n    plateHi: [0.8, 0.82, 0.85],\n    adj: [0.4, 0.42, 0.46],\n    bore: [0.15, 0.16, 0.18]\n  };\n  var GOLA_COL = [0.76, 0.78, 0.81];\n  function vsub(a, b) {\n    return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n  }\n  function vlen(a) {\n    return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]);\n  }\n  function vnorm(a) {\n    const l = vlen(a) || 1;\n    return [a[0] / l, a[1] / l, a[2] / l];\n  }\n  function vcross(a, b) {\n    return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n  }\n  function vadd(a, b) {\n    return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n  }\n  function vmul(a, k) {\n    return [a[0] * k, a[1] * k, a[2] * k];\n  }\n  function frame(dir) {\n    const d = vnorm(dir);\n    const hint = Math.abs(d[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0];\n    const right = vnorm(vcross(hint, d));\n    const up = vcross(d, right);\n    return { d, r: right, u: up };\n  }\n  var ID = { p: function(p) {\n    return p;\n  }, n: function(n) {\n    return n;\n  } };\n  function emitCylAB(d, A, B, rad, seg, col, xf, inward) {\n    xf = xf || ID;\n    const f = frame(vsub(B, A)), L = vlen(vsub(B, A));\n    function pt(a, t) {\n      const c = vadd(vmul(f.r, Math.cos(a)), vmul(f.u, Math.sin(a)));\n      return { p: xf.p(vadd(vadd(A, vmul(f.d, t)), vmul(c, rad))), n: xf.n(c) };\n    }\n    for (let i = 0; i < seg; i++) {\n      const a0 = 2 * Math.PI * i / seg, a1 = 2 * Math.PI * (i + 1) / seg;\n      const q0 = pt(a0, 0), q1 = pt(a1, 0), q2 = pt(a1, L), q3 = pt(a0, L);\n      const nm = xf.n(vadd(vmul(f.r, Math.cos((a0 + a1) / 2)), vmul(f.u, Math.sin((a0 + a1) / 2))));\n      if (inward) {\n        pushQuad(d, [q0.p, q3.p, q2.p, q1.p], vmul(nm, -1), col, null, 0);\n      } else {\n        pushQuad(d, [q0.p, q1.p, q2.p, q3.p], nm, col, null, 0);\n        pushTri(d, xf.p(vadd(A, vmul(f.d, L))), q3.p, q2.p, xf.n(f.d), col, null, 0);\n        pushTri(d, xf.p(A), q1.p, q0.p, xf.n(vmul(f.d, -1)), col, null, 0);\n      }\n    }\n  }\n  function emitRing(d, C3, dir, rIn, rOut, seg, col, xf) {\n    xf = xf || ID;\n    const f = frame(dir);\n    function pt(a, r) {\n      const c = vadd(vmul(f.r, Math.cos(a)), vmul(f.u, Math.sin(a)));\n      return xf.p(vadd(C3, vmul(c, r)));\n    }\n    const nm = xf.n(f.d);\n    for (let i = 0; i < seg; i++) {\n      const a0 = 2 * Math.PI * i / seg, a1 = 2 * Math.PI * (i + 1) / seg;\n      if (rIn <= 0) pushTri(d, xf.p(C3), pt(a0, rOut), pt(a1, rOut), nm, col, null, 0);\n      else pushQuad(d, [pt(a0, rIn), pt(a0, rOut), pt(a1, rOut), pt(a1, rIn)], nm, col, null, 0);\n    }\n  }\n  function emitStrut(d, A, B, w, t, col) {\n    const f = frame(vsub(B, A)), L = vlen(vsub(B, A));\n    const hw = w / 2, ht = t / 2;\n    function c(i, j, k) {\n      return vadd(vadd(vadd(A, vmul(f.d, k ? L : 0)), vmul(f.r, i ? hw : -hw)), vmul(f.u, j ? ht : -ht));\n    }\n    const V3 = {};\n    [0, 1].forEach(function(i) {\n      [0, 1].forEach(function(j) {\n        [0, 1].forEach(function(k) {\n          V3[\"\" + i + j + k] = c(i, j, k);\n        });\n      });\n    });\n    const F = [\n      [[\"100\", \"110\", \"111\", \"101\"], f.r],\n      [[\"000\", \"001\", \"011\", \"010\"], vmul(f.r, -1)],\n      [[\"010\", \"011\", \"111\", \"110\"], f.u],\n      [[\"000\", \"100\", \"101\", \"001\"], vmul(f.u, -1)],\n      [[\"001\", \"101\", \"111\", \"011\"], f.d],\n      [[\"000\", \"010\", \"110\", \"100\"], vmul(f.d, -1)]\n    ];\n    F.forEach(function(x) {\n      pushQuad(d, x[0].map(function(k) {\n        return V3[k];\n      }), vnorm(x[1]), col, null, 0);\n    });\n  }\n  function hingePoints(W2, H2, D2, yc, doorXf, doorOff, sideOff, uxf) {\n    const U = uxf && uxf.p ? uxf : { p: function(p) {\n      return p;\n    }, n: function(n) {\n      return n;\n    } };\n    const cx = REVEAL + HINGE.cupInset, faceZ = D2 + EPS;\n    const dxf = {\n      p: function(p) {\n        const q = doorXf.p(p);\n        return U.p([q[0], q[1], q[2] + doorOff]);\n      },\n      n: function(n) {\n        return U.n(doorXf.n(n));\n      }\n    };\n    const sxf = { p: function(p) {\n      return U.p([p[0] + sideOff, p[1], p[2]]);\n    }, n: U.n };\n    const A = dxf.p([cx, yc, faceZ - HINGE.cupProud - HINGE.standoff]);\n    const C3 = sxf.p([T + HINGE.plateBoss, yc, D2 - HINGE.plateSetback]);\n    return { cx, faceZ, dxf, sxf, A, C: C3 };\n  }\n  function emitHinge(d, W2, H2, D2, yc, doorXf, doorOff, sideOff, uxf) {\n    const g2 = hingePoints(W2, H2, D2, yc, doorXf, doorOff, sideOff, uxf);\n    const cx = g2.cx, fz = g2.faceZ, dxf = g2.dxf, sxf = g2.sxf;\n    const zF = fz - HINGE.flangeThk;\n    const zC = zF - HINGE.cupProud;\n    if (FEAT) {\n      featPoint(dxf.p([cx, yc, fz]), \"hinge cup centre \\xD835\", 0.8, \"Hinge\");\n      [-1, 1].forEach(function(sg) {\n        featPoint(dxf.p([cx + HINGE.earOffX, yc + sg * HINGE.earOffY, zF - 2.6]), \"hinge screw\", 1.4, \"Hinge\");\n      });\n      const pz0 = D2 - HINGE.plateSetback;\n      featPoint(sxf.p([T, yc, pz0]), \"mounting plate centre\", 1, \"Hinge plate\");\n      [-17, 17].forEach(function(dy) {\n        featPoint(sxf.p([T + 5.6, yc + dy, pz0]), \"mounting plate screw\", 1.4, \"Hinge plate\");\n      });\n    }\n    roundPlateXf(\n      d,\n      cx + HINGE.flangeX0,\n      cx + HINGE.flangeX1,\n      yc - HINGE.flangeY,\n      yc + HINGE.flangeY,\n      HINGE.flangeR,\n      zF,\n      fz,\n      MET.ear,\n      dxf\n    );\n    emitCylAB(d, [cx, yc, zF], [cx, yc, zC], HINGE.cupR, 26, MET.wall, dxf);\n    emitRing(d, [cx, yc, zC], [0, 0, -1], HINGE.boreR, HINGE.cupR, 26, MET.rim, dxf);\n    emitCylAB(d, [cx, yc, zC], [cx, yc, zC + HINGE.boreDepth], HINGE.boreR, 26, MET.recess, dxf, true);\n    emitRing(d, [cx, yc, zC + HINGE.boreDepth], [0, 0, -1], 0, HINGE.boreR, 26, MET.bore, dxf);\n    [-1, 1].forEach(function(sg) {\n      const ex = cx + HINGE.earOffX, ey = yc + sg * HINGE.earOffY;\n      emitRing(d, [cx, yc, zF - 0.01], [0, 0, -1], 0, 1e-3, 3, MET.ear, dxf);\n      emitCylAB(d, [ex, ey, zF], [ex, ey, zF - 1.4], HINGE.earR + 1.6, 14, MET.ear, dxf);\n      emitCylAB(d, [ex, ey, zF - 1.4], [ex, ey, zF - 2.6], HINGE.earR, 14, MET.screw, dxf);\n      emitRing(d, [ex, ey, zF - 2.6], [0, 0, -1], 0, HINGE.earR, 14, MET.screw, dxf);\n      emitStrutBoxXf(\n        d,\n        ex - HINGE.earR * 0.75,\n        ex + HINGE.earR * 0.75,\n        ey - 0.45,\n        ey + 0.45,\n        zF - 2.75,\n        zF - 2.55,\n        MET.recess,\n        dxf\n      );\n    });\n    emitCylAB(d, [cx, yc, zC], [cx, yc, zC - HINGE.standoff + 5], 6.2, 18, MET.boss, dxf);\n    emitCylAB(d, [cx, yc, zC - HINGE.standoff + 5], [cx, yc, zC - HINGE.standoff + 1], 4.6, 16, MET.barrel, dxf);\n    const pz = D2 - HINGE.plateSetback, sx = T;\n    const SXF = sxf;\n    emitStrutBoxXf(d, sx, sx + 3.5, yc - 24, yc + 24, pz - 8, pz + 8, MET.plate, SXF);\n    emitStrutBoxXf(d, sx, sx + 3.5, yc - 8, yc + 8, pz - 14, pz + 14, MET.plate, SXF);\n    emitStrutBoxXf(d, sx + 3.5, sx + 7, yc - 7, yc + 7, pz - 8, pz + 8, MET.plateHi, SXF);\n    emitCylAB(d, [sx + 7, yc, pz], [sx + HINGE.plateBoss, yc, pz], 4.4, 18, MET.boss, SXF);\n    [-17, 17].forEach(function(dy) {\n      emitCylAB(d, [sx + 3.5, yc + dy, pz], [sx + 5.6, yc + dy, pz], 3.2, 14, MET.screw, SXF);\n      emitRing(d, [sx + 5.6, yc + dy, pz], [1, 0, 0], 0, 3.2, 14, MET.screw, SXF);\n      emitStrutBoxXf(d, sx + 5.6, sx + 5.8, yc + dy - 2.2, yc + dy + 2.2, pz - 0.45, pz + 0.45, MET.recess, SXF);\n    });\n    emitCylAB(d, [sx + 3.5, yc, pz + 10], [sx + 6.4, yc, pz + 10], 3, 14, MET.adj, SXF);\n    emitStrutBoxXf(d, sx + 6.4, sx + 6.6, yc - 2.2, yc + 2.2, pz + 9.55, pz + 10.45, MET.recess, SXF);\n    const A = g2.A, C3 = g2.C;\n    emitStrut(d, A, C3, HINGE.armW, HINGE.armT, MET.arm);\n    emitStrut(d, A, C3, HINGE.armW - 7, HINGE.armT + 0.7, MET.rim);\n    [[A, HINGE.barrelR], [C3, HINGE.barrelR - 0.3]].forEach(function(b) {\n      const p = b[0], r = b[1], h = HINGE.barrelL / 2;\n      emitCylAB(d, [p[0], p[1] - h, p[2]], [p[0], p[1] + h, p[2]], r, 16, MET.barrel);\n      emitRing(d, [p[0], p[1] + h, p[2]], [0, 1, 0], 0, r, 16, MET.screw);\n      emitRing(d, [p[0], p[1] - h, p[2]], [0, -1, 0], 0, r, 16, MET.screw);\n    });\n  }\n  function roundPlateXf(d, x0, x1, y0, y1, r, z0, z1, col, xf) {\n    const pts = [], seg = 4;\n    let i, a;\n    const CORN = [[x1 - r, y0 + r, -Math.PI / 2], [x1 - r, y1 - r, 0], [x0 + r, y1 - r, Math.PI / 2], [x0 + r, y0 + r, Math.PI]];\n    for (let ci = 0; ci < CORN.length; ci++) {\n      const c = CORN[ci];\n      for (i = 0; i <= seg; i++) {\n        a = c[2] + Math.PI / 2 * i / seg;\n        pts.push([c[0] + r * Math.cos(a), c[1] + r * Math.sin(a)]);\n      }\n    }\n    const n = pts.length;\n    for (i = 0; i < n; i++) {\n      const p = pts[i], q = pts[(i + 1) % n];\n      const nx = q[1] - p[1], ny = -(q[0] - p[0]), l = Math.hypot(nx, ny) || 1;\n      pushQuad(\n        d,\n        [xf.p([p[0], p[1], z0]), xf.p([q[0], q[1], z0]), xf.p([q[0], q[1], z1]), xf.p([p[0], p[1], z1])],\n        xf.n([nx / l, ny / l, 0]),\n        col,\n        null,\n        0\n      );\n    }\n    for (i = 1; i < n - 1; i++) {\n      pushTri(\n        d,\n        xf.p([pts[0][0], pts[0][1], z1]),\n        xf.p([pts[i][0], pts[i][1], z1]),\n        xf.p([pts[i + 1][0], pts[i + 1][1], z1]),\n        xf.n([0, 0, 1]),\n        col,\n        null,\n        0\n      );\n      pushTri(\n        d,\n        xf.p([pts[0][0], pts[0][1], z0]),\n        xf.p([pts[i + 1][0], pts[i + 1][1], z0]),\n        xf.p([pts[i][0], pts[i][1], z0]),\n        xf.n([0, 0, -1]),\n        col,\n        null,\n        0\n      );\n    }\n  }\n  function emitStrutBoxXf(d, x0, x1, y0, y1, z0, z1, col, xf) {\n    const X = [x0, x1], Y = [y0, y1], Z = [z0, z1];\n    FACE.forEach(function(f) {\n      const q = f.i.map(function(c) {\n        return xf.p([X[c[0]], Y[c[1]], Z[c[2]]]);\n      });\n      pushQuad(d, q, xf.n(f.n), col, null, 0);\n    });\n  }\n  var emitBoxXf = emitBox;\n  function emitLegXf(d, cx, cz, dy, xf) {\n    const p = xf && xf.p ? xf.p([cx, 0, cz]) : [cx, 0, cz];\n    if (FEAT) {\n      featPoint([p[0], -150 + dy, p[2]], \"leg centre on the floor\", 1, \"Leg\");\n      featPoint([p[0], -LEG.plateT + dy, p[2]], \"leg plate centre\", 1.2, \"Leg\");\n    }\n    emitLeg(d, p[0], p[2], dy);\n  }\n  function emitHingeXf(d, W2, H2, D2, yc, doorXf, doorOff, sideOff, xf) {\n    emitHinge(d, W2, H2, D2, yc, doorXf, doorOff, sideOff, xf);\n  }\n\n  // v2/src/render/mesh/room-shell.js\n  var SLAB = 14;\n  var REVEAL2 = 120;\n  var FRAME = 60;\n  var ARCH = 45;\n  function wallPiece(d, fr, a0, a1, y0, y1, d0, d1, col, onlyN) {\n    if (a1 - a0 < 0.01 || y1 - y0 < 0.01) return;\n    if (fr.angled) {\n      const P2 = [fr.pt(a0, d0), fr.pt(a1, d0), fr.pt(a1, d1), fr.pt(a0, d1)].map((p) => [p[0], p[1]]);\n      const v = (p, y) => [p[0], y, p[1]], n = [fr.inward[0], 0, fr.inward[1]], m = [-fr.inward[0], 0, -fr.inward[1]];\n      const t = [fr.dir[0], 0, fr.dir[1]], tb = [-fr.dir[0], 0, -fr.dir[1]];\n      const face2 = (q, nn) => pushQuad(d, q, nn, col, null, 0);\n      face2([v(P2[3], y0), v(P2[2], y0), v(P2[2], y1), v(P2[3], y1)], n);\n      if (!onlyN) {\n        face2([v(P2[1], y0), v(P2[0], y0), v(P2[0], y1), v(P2[1], y1)], m);\n        face2([v(P2[0], y0), v(P2[3], y0), v(P2[3], y1), v(P2[0], y1)], tb);\n        face2([v(P2[2], y0), v(P2[1], y0), v(P2[1], y1), v(P2[2], y1)], t);\n        face2([v(P2[0], y1), v(P2[3], y1), v(P2[2], y1), v(P2[1], y1)], [0, 1, 0]);\n        face2([v(P2[1], y0), v(P2[2], y0), v(P2[3], y0), v(P2[0], y0)], [0, -1, 0]);\n      }\n      return;\n    }\n    const b = wallBox(fr, a0, a1, d0, d1);\n    emitBox(d, b.x0, b.x1, y0, y1, b.z0, b.z1, col, 0, 0, null, onlyN);\n  }\n  function emitRoomShell(d, sz, room, wallGrey, floorTone, selId, ghost, armedId, objSelId) {\n    const wy1 = sz.height;\n    const wallCol = wallIsDefault(room) ? wallGrey : wallColourOf(room).rgb;\n    const plainFloor = floorIsDefault(room);\n    const floorCol = plainFloor ? floorTone : floorColourOf(room).rgb;\n    const textured = !plainFloor && floorFinishOf(room).id !== \"plain\";\n    const ol = roomOutlineOf(room);\n    if (!ol) emitBox(d, 0, sz.width, -LEG_H - 16, -LEG_H, 0, sz.depth, floorCol, 0, textured ? 1 : 0);\n    else {\n      const P2 = ol.walls, up = [0, 1, 0], uv = (p) => [p[0] / 1e3, p[2] / 1e3];\n      for (const [a, b, c] of triangulate(ol)) pushTri(d, [P2[a].x, -LEG_H, P2[a].z], [P2[c].x, -LEG_H, P2[c].z], [P2[b].x, -LEG_H, P2[b].z], up, floorCol, uv, textured ? 1 : 0);\n    }\n    const ops = openingsOf(room);\n    for (const wall of ol ? roomWallIds(room) : [\"back\", \"front\", \"left\", \"right\"]) {\n      const fr = wallFrame(wall, sz, room);\n      const n = [fr.inward[0], 0, fr.inward[1]];\n      const mine = ops.filter((o) => o.wall === wall).slice().sort((p, q) => p.x - q.x);\n      let at = 0;\n      for (const o of mine) {\n        const y0 = -LEG_H + o.y, y1 = -LEG_H + o.y + o.h;\n        wallPiece(d, fr, at, o.x, -LEG_H, wy1, -SLAB, 0, wallCol, n);\n        wallPiece(d, fr, o.x, o.x + o.w, -LEG_H, y0, -SLAB, 0, wallCol, n);\n        wallPiece(d, fr, o.x, o.x + o.w, y1, wy1, -SLAB, 0, wallCol, n);\n        at = o.x + o.w;\n      }\n      wallPiece(d, fr, at, fr.len, -LEG_H, wy1, -SLAB, 0, wallCol, n);\n      const w = wallSink(d, wall);\n      for (const o of mine) emitOpening(w, fr, o, wallCol);\n      for (const o of mine) {\n        if (o.id === armedId) {\n          outline(w, fr, o, PAD_OK);\n          outline(w, fr, Object.assign({}, o, { x: o.x - 40, w: o.w + 80, y: o.kind === \"door\" ? 0 : o.y - 40, h: o.h + (o.kind === \"door\" ? 40 : 80) }), PAD_OK);\n        } else if (o.id === selId) outline(w, fr, o, SEL_BLUE);\n      }\n      if (ghost && ghost.wall === wall) outline(w, fr, ghost, ghost.ok ? PAD_OK : PAD_BAD);\n      for (const o of roomObjectsOf(room).filter((q) => q.wall === wall)) {\n        const y0 = -LEG_H + o.y, y1 = -LEG_H + o.y + o.h;\n        wallPiece(w, fr, o.x, o.x + o.w, y0, y1, 0, o.d, BOILER_COL);\n        wallPiece(w, fr, o.x + 20, o.x + o.w - 20, y0 + 20, y0 + Math.min(90, o.h / 4), o.d, o.d + 2, BOILER_STRIP);\n        if (o.id === objSelId) {\n          const t = 16, d0 = o.d + 2, d1 = o.d + 8;\n          wallPiece(w, fr, o.x - t, o.x, y0 - t, y1 + t, d0, d1, SEL_BLUE);\n          wallPiece(w, fr, o.x + o.w, o.x + o.w + t, y0 - t, y1 + t, d0, d1, SEL_BLUE);\n          wallPiece(w, fr, o.x, o.x + o.w, y1, y1 + t, d0, d1, SEL_BLUE);\n          wallPiece(w, fr, o.x, o.x + o.w, y0 - t, y0, d0, d1, SEL_BLUE);\n        }\n      }\n    }\n    emitPartitions(d, room, sz, wallCol);\n  }\n  function emitPartitions(d, room, sz, wallCol) {\n    const parts = partitionsOf(room);\n    if (!parts.length) return;\n    const ceil = sz.height;\n    for (const pc of solidPieces(parts, ceil)) prism(d, pc.poly, -LEG_H + pc.y0, -LEG_H + pc.y1, pc.kind === \"solid\" ? SOLID_COL : wallCol);\n  }\n  var SOLID_COL = [0.86, 0.85, 0.82];\n  function prism(d, poly, y0, y1, col) {\n    let a = 0;\n    for (let i = 0; i < poly.length; i++) {\n      const p = poly[i], q = poly[(i + 1) % poly.length];\n      a += p.x * q.z - q.x * p.z;\n    }\n    const P2 = a > 0 ? poly : poly.slice().reverse();\n    for (let i = 0; i < P2.length; i++) {\n      const p = P2[i], q = P2[(i + 1) % P2.length], dx = q.x - p.x, dz = q.z - p.z, L = Math.hypot(dx, dz) || 1;\n      const n = [dz / L, 0, -dx / L];\n      pushQuad(d, [[q.x, y0, q.z], [p.x, y0, p.z], [p.x, y1, p.z], [q.x, y1, q.z]], n, col, null, 0);\n    }\n    const tri = triangulate({ walls: P2.map((q, i) => ({ id: \"t\" + i, x: q.x, z: q.z })) });\n    for (const [i, j, k] of tri) pushTri(d, [P2[i].x, y1, P2[i].z], [P2[k].x, y1, P2[k].z], [P2[j].x, y1, P2[j].z], [0, 1, 0], col, null, 0);\n  }\n  var BOILER_COL = [0.93, 0.93, 0.92];\n  var BOILER_STRIP = [0.42, 0.43, 0.45];\n  function wallSink(d, wall) {\n    if (!d.wallSinks) return d;\n    if (!d.wallSinks[wall]) {\n      const s = [];\n      if (d.meta) s.meta = [];\n      d.wallSinks[wall] = s;\n    }\n    return d.wallSinks[wall];\n  }\n  function outline(d, fr, o, col) {\n    const a0 = o.x - 30, a1 = o.x + o.w + 30, y0 = -LEG_H + o.y - (o.kind === \"door\" ? 0 : 30), y1 = -LEG_H + o.y + o.h + 30, t = 22;\n    wallPiece(d, fr, Math.max(0, a0), a0 + t, y0, y1, 18, 24, col);\n    wallPiece(d, fr, a1 - t, Math.min(fr.len, a1), y0, y1, 18, 24, col);\n    wallPiece(d, fr, a0 + t, a1 - t, y1 - t, y1, 18, 24, col);\n    if (o.kind !== \"door\") wallPiece(d, fr, a0 + t, a1 - t, y0, y0 + t, 18, 24, col);\n  }\n  function emitOpening(d, fr, o, wallCol) {\n    const C3 = OPENING_COLOURS;\n    const a0 = o.x, a1 = o.x + o.w, y0 = -LEG_H + o.y, y1 = -LEG_H + o.y + o.h;\n    const along2 = [fr.dir[0], 0, fr.dir[1]];\n    const back = [-along2[0], 0, -along2[2]];\n    wallPiece(d, fr, a0 - 1, a0, y0, y1, -REVEAL2, 0, wallCol, along2);\n    wallPiece(d, fr, a1, a1 + 1, y0, y1, -REVEAL2, 0, wallCol, back);\n    wallPiece(d, fr, a0, a1, y1, y1 + 1, -REVEAL2, 0, wallCol, [0, -1, 0]);\n    if (o.kind === \"window\") {\n      wallPiece(d, fr, a0, a1, y0 - 1, y0, -REVEAL2, 0, wallCol, [0, 1, 0]);\n      const f0 = -80, f12 = -20;\n      wallPiece(d, fr, a0, a0 + FRAME, y0, y1, f0, f12, C3.frame);\n      wallPiece(d, fr, a1 - FRAME, a1, y0, y1, f0, f12, C3.frame);\n      wallPiece(d, fr, a0 + FRAME, a1 - FRAME, y1 - FRAME, y1, f0, f12, C3.frame);\n      wallPiece(d, fr, a0 + FRAME, a1 - FRAME, y0, y0 + FRAME, f0, f12, C3.frame);\n      if (o.w >= 1200) {\n        const m = (a0 + a1) / 2;\n        wallPiece(d, fr, m - 25, m + 25, y0 + FRAME, y1 - FRAME, f0 + 5, f12 - 5, C3.frame);\n      }\n      wallPiece(d, fr, a0 + FRAME, a1 - FRAME, y0 + FRAME, y1 - FRAME, -52, -48, C3.glass);\n      wallPiece(d, fr, Math.max(0, a0 - 40), Math.min(fr.len, a1 + 40), y0 - 22, y0, -20, 30, C3.frame);\n    } else {\n      wallPiece(d, fr, Math.max(0, a0 - ARCH), a0, y0, y1 + ARCH, 0, 15, C3.frame);\n      wallPiece(d, fr, a1, Math.min(fr.len, a1 + ARCH), y0, y1 + ARCH, 0, 15, C3.frame);\n      wallPiece(d, fr, a0, a1, y1, y1 + ARCH, 0, 15, C3.frame);\n      wallPiece(d, fr, a0 + 3, a1 - 3, y0 + 8, y1 - 3, -50, -10, C3.leaf);\n      const pw0 = a0 + 3 + 110, pw1 = a1 - 3 - 110, hy = y0 + 8 + (y1 - y0) * 0.55;\n      if (pw1 - pw0 > 100) {\n        for (const [b0, b1] of [[y0 + 160, hy - 60], [hy + 60, y1 - 130]]) {\n          if (b1 - b0 < 120) continue;\n          wallPiece(d, fr, pw0, pw1, b0, b0 + 14, -10, -6, C3.frame);\n          wallPiece(d, fr, pw0, pw1, b1 - 14, b1, -10, -6, C3.frame);\n          wallPiece(d, fr, pw0, pw0 + 14, b0, b1, -10, -6, C3.frame);\n          wallPiece(d, fr, pw1 - 14, pw1, b0, b1, -10, -6, C3.frame);\n        }\n      }\n      const hx = a1 - 3 - 70, hyw = -LEG_H + 1e3;\n      wallPiece(d, fr, hx - 20, hx + 20, hyw - 80, hyw + 80, -10, -2, C3.handle);\n      wallPiece(d, fr, hx - 9, hx + 9, hyw - 9, hyw + 9, -2, 34, C3.handle);\n      wallPiece(d, fr, hx - 125, hx + 12, hyw - 9, hyw + 9, 34, 52, C3.handle);\n    }\n  }\n\n  // v2/src/render/mesh/workshop-preview.js\n  function emitWorkshopPreview(data, preview) {\n    if (!preview || preview.readOnly !== true || !Array.isArray(preview.panels)) throw new Error(\"A validated read-only workshop preview is required.\");\n    const ranges = [];\n    for (const panel of preview.panels) {\n      const b = panel.box, start2 = data.length, inset = Math.min(EPS, (b.x1 - b.x0) / 4, (b.y1 - b.y0) / 4, (b.z1 - b.z0) / 4);\n      const hint = setMatHint(MAT_CLASS.WORKSHOP_BOARD), tag = featTag(panel.pid, inset), front = featFront(panel.front ? panel.pid : null);\n      try {\n        const emit = panel.front ? emitFrontBoxXf : emitBoxXf;\n        emit(data, b.x0 + inset, b.x1 - inset, b.y0 + inset, b.y1 - inset, b.z0 + inset, b.z1 - inset, panel.material.rgb, 0, 0, null);\n      } finally {\n        setMatHint(hint);\n        featTag(tag);\n        featFront(front);\n      }\n      ranges.push({ pid: panel.pid, start: start2, end: data.length, inset });\n    }\n    return ranges;\n  }\n\n  // v2/src/model/cutouts.js\n  var CUTOUT_PANELS2 = [\"side-left\", \"side-right\", \"back\", \"bottom\", \"top\"];\n  var PANEL_LABEL = { \"side-left\": \"Left side\", \"side-right\": \"Right side\", \"back\": \"Back\", \"bottom\": \"Bottom\", \"top\": \"Top\" };\n  var MAX_CUTOUTS2 = 12;\n  var MAX_POINTS2 = 64;\n  var ON_EDGE_MM2 = 0.5;\n  var r18 = (v) => Math.round(v * 10) / 10;\n  var num4 = (v) => {\n    const n = Number(v);\n    return Number.isFinite(n) ? n : null;\n  };\n  var BASE_NAMES = { \"side-left\": \"Side L\", \"side-right\": \"Side R\", \"back\": \"Back\", \"bottom\": \"Base\" };\n  var BOX_NAMES = { \"side-left\": \"Side L\", \"side-right\": \"Side R\", \"back\": \"Back\", \"bottom\": \"Bottom\", \"top\": \"Top\" };\n  var NAMES_BY_TYPE = {\n    \"base\": BASE_NAMES,\n    \"base-drawer\": BASE_NAMES,\n    \"base-4drawer\": BASE_NAMES,\n    \"base-double\": BASE_NAMES,\n    \"wall\": BOX_NAMES,\n    \"tall-pantry\": BOX_NAMES\n  };\n  function cutoutPanelsOf(u) {\n    const names = u && NAMES_BY_TYPE[u.type];\n    return names ? CUTOUT_PANELS2.filter((p) => names[p]) : [];\n  }\n  function boardNameOf(u, panel) {\n    const names = u && NAMES_BY_TYPE[u.type];\n    return names && names[panel] || null;\n  }\n  function normCutouts(list) {\n    if (!Array.isArray(list)) return [];\n    const out = [];\n    for (const c of list.slice(0, MAX_CUTOUTS2)) {\n      if (!c || typeof c !== \"object\" || !CUTOUT_PANELS2.includes(c.panel)) continue;\n      const pts = (Array.isArray(c.pts) ? c.pts : []).slice(0, MAX_POINTS2).map((p) => Array.isArray(p) ? [num4(p[0]), num4(p[1])] : [num4(p && p.x), num4(p && p.y)]).filter(([x, y]) => x != null && y != null).map(([x, y]) => [r18(x), r18(y)]);\n      if (pts.length > 1 && pts[0][0] === pts[pts.length - 1][0] && pts[0][1] === pts[pts.length - 1][1]) pts.pop();\n      if (pts.length < 3) continue;\n      out.push({ id: String(c.id || \"cut-\" + (out.length + 1)).slice(0, 40), panel: c.panel, pts, through: true });\n    }\n    return out;\n  }\n  function boardFrame(panel, b, D2) {\n    if (panel === \"back\") return { plane: [0, 1], thin: 2, to: ([x, y]) => [x, y], from: ([a, c]) => [a, c] };\n    if (panel === \"bottom\" || panel === \"top\") return { plane: [0, 2], thin: 1, to: ([x, y]) => [x, D2 - y], from: ([a, c]) => [a, D2 - c] };\n    return { plane: [2, 1], thin: 0, to: ([x, y]) => [D2 - x, y], from: ([a, c]) => [D2 - a, c] };\n  }\n  var area22 = (pts) => pts.reduce((a, p, i) => {\n    const q = pts[(i + 1) % pts.length];\n    return a + p.u * q.v - q.u * p.v;\n  }, 0);\n  function sidesOf2(p, L, W2) {\n    const s = [];\n    if (Math.abs(p.v) <= ON_EDGE_MM2) s.push(0);\n    if (Math.abs(p.u - L) <= ON_EDGE_MM2) s.push(1);\n    if (Math.abs(p.v - W2) <= ON_EDGE_MM2) s.push(2);\n    if (Math.abs(p.u) <= ON_EDGE_MM2) s.push(3);\n    return s;\n  }\n  function snap2(p, L, W2) {\n    const s = sidesOf2(p, L, W2);\n    return { u: s.includes(3) ? 0 : s.includes(1) ? L : p.u, v: s.includes(0) ? 0 : s.includes(2) ? W2 : p.v };\n  }\n  function perim2(p, L, W2) {\n    if (p.v === 0) return p.u;\n    if (p.u === L) return L + p.v;\n    if (p.v === W2) return L + W2 + (L - p.u);\n    return 2 * L + W2 + (W2 - p.v);\n  }\n  function segmentsCross2(a, b, c, d) {\n    const o = (p, q, r) => Math.sign((q.u - p.u) * (r.v - p.v) - (q.v - p.v) * (r.u - p.u));\n    return o(a, b, c) * o(a, b, d) < 0 && o(c, d, a) * o(c, d, b) < 0;\n  }\n  function cutoutShape2(rawPts, L, W2) {\n    if (!(L > 0 && W2 > 0) || !Array.isArray(rawPts) || rawPts.length < 3) return { fault: \"the cut-out has fewer than three corners\" };\n    if (rawPts.some((p) => p.u < -ON_EDGE_MM2 || p.u > L + ON_EDGE_MM2 || p.v < -ON_EDGE_MM2 || p.v > W2 + ON_EDGE_MM2)) return { fault: \"a corner of the cut-out lies outside the \" + r18(L) + \" x \" + r18(W2) + \" mm part\" };\n    let pts = rawPts.map((p) => snap2(p, L, W2));\n    const n = pts.length;\n    for (let i = 0; i < n; i += 1) for (let j = i + 2; j < n; j += 1) {\n      if (i === 0 && j === n - 1) continue;\n      if (segmentsCross2(pts[i], pts[(i + 1) % n], pts[j], pts[(j + 1) % n])) return { fault: \"the cut-out's outline crosses itself\" };\n    }\n    if (Math.abs(area22(pts)) / 2 < 1) return { fault: \"the cut-out encloses no area\" };\n    if (area22(pts) < 0) pts = pts.slice().reverse();\n    const on = pts.map((p) => sidesOf2(p, L, W2));\n    if (!on.some((s) => s.length)) return { kind: \"hole\", pts };\n    const along2 = pts.map((p, i) => on[i].some((s) => on[(i + 1) % n].includes(s)));\n    const runs = along2.reduce((k, a2, i) => k + (!a2 && along2[(i + n - 1) % n] ? 1 : 0), 0);\n    if (!along2.some(Boolean)) return { fault: \"the cut-out touches the edge of the part without opening onto it - move it in, or draw it open onto the edge\" };\n    if (along2.every(Boolean)) return { fault: \"the cut-out runs only along the edge of the part\" };\n    if (runs !== 1) return { fault: \"the cut-out opens onto the edge of the part in more than one place - draw each opening as its own cut-out\" };\n    const start2 = along2.findIndex((a2, i) => !a2 && along2[(i + n - 1) % n]);\n    const chain = [];\n    for (let k = 0, i = start2; k <= n; k += 1, i = (i + 1) % n) {\n      chain.push(pts[i]);\n      if (along2[i] && k > 0) break;\n    }\n    const a = chain[0], b = chain[chain.length - 1];\n    if (chain.slice(1, -1).some((p) => sidesOf2(p, L, W2).length)) return { fault: \"the cut-out meets the edge of the part again part-way along - draw each opening as its own cut-out\" };\n    const P2 = 2 * (L + W2), sa = perim2(a, L, W2), sb = perim2(b, L, W2);\n    const corners = [{ u: 0, v: 0 }, { u: L, v: 0 }, { u: L, v: W2 }, { u: 0, v: W2 }].map((c) => ({ c, s: perim2(c, L, W2) }));\n    const span2 = ((sb - sa) % P2 + P2) % P2;\n    const keep = corners.map(({ c, s }) => ({ c, d: ((s - sa) % P2 + P2) % P2 })).filter(({ d }) => d > 1e-6 && d < span2 - 1e-6).sort((x, y) => x.d - y.d).map(({ c }) => c);\n    const outline2 = [a, ...keep, b, ...chain.slice(1, -1).reverse()].map((p) => ({ u: r18(p.u), v: r18(p.v) }));\n    const clean = outline2.filter((p, i) => {\n      const q = outline2[(i + 1) % outline2.length];\n      return Math.abs(p.u - q.u) > 1e-6 || Math.abs(p.v - q.v) > 1e-6;\n    });\n    if (Math.abs(area22(clean)) / 2 < 1) return { fault: \"the cut-out removes the whole part\" };\n    return { kind: \"notch\", outline: area22(clean) < 0 ? clean.reverse() : clean };\n  }\n  function boardCut(u, b, D2) {\n    const list = normCutouts(u && u.cutouts);\n    if (!list.length || !b) return null;\n    const panels = CUTOUT_PANELS2.filter((p) => boardNameOf(u, p) === b.name);\n    const mine = list.filter((c) => panels.includes(c.panel));\n    if (!mine.length) return null;\n    const f = boardFrame(mine[0].panel, b, D2);\n    const [a0, a1, c0, c1] = [\n      Math.min(b[[\"x0\", \"y0\", \"z0\"][f.plane[0]]], b[[\"x1\", \"y1\", \"z1\"][f.plane[0]]]),\n      Math.max(b[[\"x0\", \"y0\", \"z0\"][f.plane[0]]], b[[\"x1\", \"y1\", \"z1\"][f.plane[0]]]),\n      b[[\"x0\", \"y0\", \"z0\"][f.plane[1]]],\n      b[[\"x1\", \"y1\", \"z1\"][f.plane[1]]]\n    ];\n    const L = a1 - a0, W2 = c1 - c0;\n    let outer = [[a0, c0], [a1, c0], [a1, c1], [a0, c1]], notched = false;\n    const holes = [], faults = [];\n    for (const c of mine) {\n      const local = c.pts.map((p) => {\n        const q = f.to(p);\n        return { u: q[0] - a0, v: q[1] - c0 };\n      });\n      const s = cutoutShape2(local, L, W2);\n      if (s.fault) {\n        faults.push({ id: c.id, why: s.fault });\n        continue;\n      }\n      if (s.kind === \"hole\") {\n        holes.push(s.pts.map((p) => [p.u + a0, p.v + c0]));\n        continue;\n      }\n      if (notched) {\n        faults.push({ id: c.id, why: \"one cut-out per part may open onto its edge; this second one is not cut\" });\n        continue;\n      }\n      notched = true;\n      outer = s.outline.map((p) => [p.u + a0, p.v + c0]);\n    }\n    return { panel: mine[0].panel, plane: f.plane, thin: f.thin, outer, holes, faults };\n  }\n  function cutoutVerdicts(u, parts, D2) {\n    const out = [];\n    for (const c of normCutouts(u && u.cutouts)) {\n      const name2 = boardNameOf(u, c.panel);\n      const b = name2 && (parts || []).find((p) => p.name === name2);\n      if (!b) {\n        out.push({ id: c.id, panel: c.panel, kind: null, why: \"this cabinet has no \" + PANEL_LABEL[c.panel].toLowerCase() + \" board, so it is not cut\" });\n        continue;\n      }\n      const cut = boardCut({ ...u, cutouts: [c] }, b, D2);\n      if (cut.faults.length) out.push({ id: c.id, panel: c.panel, kind: null, why: cut.faults[0].why });\n      else out.push({ id: c.id, panel: c.panel, kind: cut.holes.length ? \"hole\" : \"notch\", why: null });\n    }\n    return out;\n  }\n  function panelRect(u, parts, D2, panel) {\n    const name2 = boardNameOf(u, panel);\n    const b = name2 && (parts || []).find((p) => p.name === name2);\n    if (!b) return null;\n    const f = boardFrame(panel, b, D2);\n    const A = [\"x0\", \"y0\", \"z0\"], B = [\"x1\", \"y1\", \"z1\"];\n    const corners = [[b[A[f.plane[0]]], b[A[f.plane[1]]]], [b[B[f.plane[0]]], b[B[f.plane[1]]]]].map(f.from);\n    return {\n      x0: Math.min(corners[0][0], corners[1][0]),\n      x1: Math.max(corners[0][0], corners[1][0]),\n      y0: Math.min(corners[0][1], corners[1][1]),\n      y1: Math.max(corners[0][1], corners[1][1])\n    };\n  }\n\n  // v2/src/render/mesh/gola.js\n  function sub2(a, b) {\n    return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n  }\n  function cross3(a, b) {\n    return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n  }\n  function dot3(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function unit(a) {\n    const l = Math.hypot(a[0], a[1], a[2]) || 1;\n    return [a[0] / l, a[1] / l, a[2] / l];\n  }\n  function face(d, q, inside, col, xf) {\n    let n = unit(cross3(sub2(q[1], q[0]), sub2(q[2], q[0])));\n    const c = [(q[0][0] + q[2][0]) / 2, (q[0][1] + q[2][1]) / 2, (q[0][2] + q[2][2]) / 2];\n    if (dot3(n, sub2(c, inside)) < 0) {\n      q = [q[0], q[3], q[2], q[1]];\n      n = [-n[0], -n[1], -n[2]];\n    }\n    const P2 = xf && xf.p ? q.map((p) => xf.p(p)) : q;\n    pushQuad(d, P2, xf && xf.n ? xf.n(n) : n, col, null, 0);\n  }\n  function emitPrismX(d, x0, x1, quad, at, col, xf) {\n    const p0 = quad.map((p) => {\n      const yz = at(p[0], p[1]);\n      return [x0, yz[0], yz[1]];\n    });\n    const p1 = quad.map((p) => {\n      const yz = at(p[0], p[1]);\n      return [x1, yz[0], yz[1]];\n    });\n    const cy = p0.reduce((s, p) => s + p[1], 0) / 4, cz = p0.reduce((s, p) => s + p[2], 0) / 4;\n    const inside = [(x0 + x1) / 2, cy, cz];\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      face(d, [p0[i], p0[j], p1[j], p1[i]], inside, col, xf);\n    }\n    face(d, p0.slice(), inside, col, xf);\n    face(d, p1.slice(), inside, col, xf);\n  }\n  function emitGolaProfiles(d, u, xf) {\n    const rec = golaRecesses(u);\n    if (!rec.length) return 0;\n    const W2 = u.w, D2 = u.d;\n    let n = 0;\n    featTag(\"Gola profile\");\n    for (const r of rec) {\n      const H2 = r.kind === \"J\" ? Math.min(r.y1 - r.y0, GOLA_PROFILES.J.sectionHeight) : GOLA_PROFILES.C.profileHeight;\n      const v0 = r.kind === \"J\" ? r.y1 - r.y0 - H2 : (r.y1 - r.y0 - H2) / 2;\n      const sec = r.kind === \"J\" ? sectionJ(H2, r.back) : sectionC(H2, r.back);\n      const at = (uu, vv) => [r.y0 + v0 + vv, D2 - r.back + uu];\n      for (const q of sec) {\n        emitPrismX(d, 0, W2, q, at, GOLA_COL, xf);\n        n++;\n      }\n    }\n    return n;\n  }\n  function notchedBoxes(b) {\n    const ns = (b.notches || []).slice().sort((p, q) => p.y0 - q.y0);\n    const out = [];\n    let cur = b.y0;\n    for (const n of ns) {\n      const y0 = Math.max(n.y0, b.y0), y1 = Math.min(n.y1, b.y1);\n      if (y1 <= y0) continue;\n      if (y0 > cur + 0.01) out.push({ y0: cur, y1: y0, z0: b.z0, z1: b.z1 });\n      out.push({ y0, y1, z0: b.z0, z1: Math.max(b.z0 + 1, n.z0), cut: true });\n      cur = y1;\n    }\n    if (cur < b.y1 - 0.01) out.push({ y0: cur, y1: b.y1, z0: b.z0, z1: b.z1 });\n    return out;\n  }\n  function notchedGrid(b) {\n    const segs = notchedBoxes(b);\n    const ys = [], zs = [b.z0, b.z1];\n    for (const s of segs) {\n      ys.push(s.y0, s.y1);\n      if (s.cut) zs.push(s.z1);\n    }\n    const uniq = (a) => a.sort((p, q) => p - q).filter((v, i, s) => i === 0 || v - s[i - 1] > 1e-3);\n    const Y = uniq(ys), Z = uniq(zs);\n    const solid = (i, j) => {\n      if (i < 0 || j < 0 || i >= Y.length - 1 || j >= Z.length - 1) return false;\n      const ym = (Y[i] + Y[i + 1]) / 2, zm = (Z[j] + Z[j + 1]) / 2;\n      const s = segs.find((q) => ym > q.y0 && ym < q.y1);\n      return !!s && zm > s.z0 && zm < s.z1;\n    };\n    return { Y, Z, solid, segs };\n  }\n  function emitNotchedBoard(d, b, dx, dy, dz, col, grain, tex, xf) {\n    const G = notchedGrid(b), segs = G.segs;\n    const yAt = (v) => (v <= b.y0 + 1e-3 ? v + EPS : v >= b.y1 - 1e-3 ? v - EPS : v) + dy;\n    const zAt = (v) => (v <= b.z0 + 1e-3 ? v + EPS : v - EPS) + dz;\n    const X0 = b.x0 + EPS + dx, X1 = b.x1 - EPS + dx;\n    for (const s of segs) featBox(X0, X1, yAt(s.y0), yAt(s.y1), zAt(s.z0), zAt(s.z1), xf);\n    const dims = [X1 - X0, b.y1 - b.y0, b.z1 - b.z0];\n    const Y = G.Y.map(yAt), Z = G.Z.map(zAt);\n    for (let i = 0; i < Y.length - 1; i++) for (let j = 0; j < Z.length - 1; j++) {\n      if (!G.solid(i, j)) continue;\n      const keep = (n) => n[0] !== 0 || n[1] === 1 && !G.solid(i + 1, j) || n[1] === -1 && !G.solid(i - 1, j) || n[2] === 1 && !G.solid(i, j + 1) || n[2] === -1 && !G.solid(i, j - 1);\n      emitBoxFaces(d, X0, X1, Y[i], Y[i + 1], Z[j], Z[j + 1], col, grain, tex, xf, keep, dims);\n    }\n  }\n\n  // v2/src/render/mesh/unit.js\n  function cutSink(d, key, units) {\n    if (!d.cutSinks) return d;\n    if (!d.cutSinks[key]) {\n      const s = [];\n      if (d.meta) s.meta = [];\n      d.cutSinks[key] = { units: (units || []).slice(), d: s };\n    }\n    return d.cutSinks[key].d;\n  }\n  function emitPlinthRuns(d0, units, runs) {\n    const TH = PLINTH.TH, JH = 0.5;\n    (runs || plinthRuns(units)).forEach(function(r, ri) {\n      const d = cutSink(d0, \"plinth:\" + ri + \":\" + (r.units || []).join(\",\"), r.units);\n      const pf = r.finish, col = boardColour(pf), tex = boardTex(pf);\n      const a0 = Math.min(r.plane, r.back), a1 = Math.max(r.plane, r.back);\n      r.pieces.forEach(function(p, k) {\n        featTag(\"Plinth\");\n        const lo = p.from + (k > 0 ? JH : 0), hi = p.to - (k < r.pieces.length - 1 ? JH : 0);\n        if (r.axis === \"z\") emitBox(d, lo, hi, r.y0, r.y1, a0, a1, col, 0, tex);\n        else emitBox(d, a0, a1, r.y0, r.y1, lo, hi, col, 0, tex);\n        if (k === 0) return;\n        const f12 = r.plane - r.dir * 0.15, f0 = r.plane - r.dir * TH;\n        const b0 = Math.min(f0, f12), b1 = Math.max(f0, f12);\n        featTag(\"Plinth joint\");\n        if (r.axis === \"z\") emitBox(d, p.from - JH, p.from + JH, r.y0, r.y1, b0, b1, GAP_DARK, 0, 0, null);\n        else emitBox(d, b0, b1, r.y0, r.y1, p.from - JH, p.from + JH, GAP_DARK, 0, 0, null);\n      });\n    });\n  }\n  function emitWorktops(d0, units, kitchen) {\n    const runs = worktopRuns(units, kitchen);\n    if (!runs.length) return;\n    const L = lineOf(worktopOf(kitchen).line), wc = worktopColour(L);\n    const JH = 0.5;\n    runs.forEach(function(r, ri) {\n      const d = cutSink(d0, \"worktop:\" + (r.id != null ? r.id : ri) + \":\" + (r.units || []).join(\",\"), r.units);\n      worktopBoxes(r).forEach(function(b, k) {\n        featTag(\"Worktop\");\n        const bLo = k === 0 && r.ends.lo === \"corner-butt\", bHi = k === r.pieces.length - 1 && r.ends.hi === \"corner-butt\";\n        const e0 = r.axis === \"z\" ? b.x0 : b.z0, e1 = r.axis === \"z\" ? b.x1 : b.z1;\n        const lo = e0 + (k > 0 ? JH : 0) + (bLo ? 2 * JH : 0), hi = e1 - (k < r.pieces.length - 1 ? JH : 0) - (bHi ? 2 * JH : 0);\n        if (r.axis === \"z\") emitBox(d, lo, hi, b.y0, b.y1, b.z0, b.z1, wc.col, 0, wc.tex);\n        else emitBox(d, b.x0, b.x1, b.y0, b.y1, lo, hi, wc.col, 2, wc.tex);\n        [bLo ? e0 : null, bHi ? e1 - 2 * JH : null].forEach(function(at2) {\n          if (at2 == null) return;\n          featTag(\"Worktop corner joint\");\n          if (r.axis === \"z\") emitBox(d, at2, at2 + 2 * JH, b.y0, b.y1 - 0.1, b.z0, b.z1, GAP_DARK, 0, 0, null);\n          else emitBox(d, b.x0, b.x1, b.y0, b.y1 - 0.1, at2, at2 + 2 * JH, GAP_DARK, 0, 0, null);\n        });\n        if (k === 0) return;\n        featTag(\"Worktop joint\");\n        const at = r.pieces[k].from;\n        if (r.axis === \"z\") emitBox(d, at - JH, at + JH, b.y0, b.y1 - 0.1, b.z0, b.z1, GAP_DARK, 0, 0, null);\n        else emitBox(d, b.x0, b.x1, b.y0, b.y1 - 0.1, at - JH, at + JH, GAP_DARK, 0, 0, null);\n      });\n    });\n  }\n  function emitInterior(d, u) {\n    const parts = interiorParts(u);\n    if (!parts.length) return;\n    const col = boardColour(u.finish), tex = boardTex(u.finish);\n    const XF = unitXf(u);\n    parts.forEach(function(q) {\n      featTag(q.name, EPS);\n      emitBoxXf(\n        d,\n        q.x0 + EPS,\n        q.x1 - EPS,\n        q.y0 + EPS,\n        q.y1 - EPS,\n        q.z0 + EPS,\n        q.z1 - EPS,\n        col,\n        0,\n        tex,\n        XF\n      );\n      if (q.kind === \"shelf\" && !u._productionHardware) {\n        const P2 = shelfPins(u, { id: q.sid, cell: q.cell, y: q.y0 - interiorBounds(u).y0, setback: q.setback, depth: q.depth }, q);\n        if (P2 && P2.zs.length) {\n          const xL = q.x0 - SHELF_SIDE_GAP, xR = q.x1 + SHELF_SIDE_GAP;\n          P2.zs.forEach(function(zc) {\n            [[xL + 4, 1], [xR - 4, -1]].forEach(function(pt) {\n              if (featOn()) featPoint(XF.p([pt[0], q.y0, zc]), \"shelf support\", 1.4, \"Shelf pin \\xB7 \" + q.name);\n              emitBoxXf(d, pt[0] - 4, pt[0] + 4, q.y0 - 5, q.y0, zc - 2.5, zc + 2.5, MET.barrel, 0, 0, XF);\n            });\n          });\n          if (!explodeMM(u)) {\n            [[xL, 1], [xR, -1]].forEach(function(sd) {\n              const dv = parts.filter(function(o) {\n                return o.kind === \"fixed-v\" && Math.abs((sd[1] > 0 ? o.x1 : o.x0) - sd[0]) < 0.01 && o.y0 <= q.y0 && o.y1 >= q.y1;\n              })[0];\n              featTag(dv ? dv.name : sd[1] > 0 ? \"Side L\" : \"Side R\");\n              P2.zs.forEach(function(zc) {\n                P2.ys.forEach(function(yy) {\n                  emitDiscXf(d, sd[0] + sd[1] * 0.15, yy, zc, PIN_R, 10, COLOURS.hole, sd[1], XF);\n                });\n              });\n            });\n          }\n        }\n      }\n    });\n  }\n  function emitFinishing(d, u) {\n    const parts = finishingParts(u);\n    if (!parts.length) return;\n    const XF = unitXf(u), off = explodeMM(u);\n    parts.forEach(function(q) {\n      const fin = q.mat || u.frontFinish || u.doorFinish || u.finish;\n      const col = boardColour(fin), tex = boardTex(fin);\n      const dx = (q.ex[0] || 0) * off;\n      featTag(q.name, EPS);\n      emitBoxXf(\n        d,\n        q.x0 + EPS + dx,\n        q.x1 - EPS + dx,\n        q.y0 + EPS,\n        q.y1 - EPS,\n        q.z0 + EPS,\n        q.z1 - EPS,\n        col,\n        1,\n        tex,\n        XF\n      );\n    });\n  }\n  function frontCol(u, key) {\n    return u.frontMat === \"mdf-paint\" ? paintColour(u.paint) : boardColour(key);\n  }\n  function frontTex(u, key) {\n    return u.frontMat === \"mdf-paint\" ? 0 : boardTex(key);\n  }\n  var legDy = (u) => u && u.dispY || 0;\n  var SPAN = [[\"x0\", \"x1\"], [\"y0\", \"y1\"], [\"z0\", \"z1\"]];\n  function emitCutBoard(d, u, b, D2, dx, dy, dz, col, grainAxis, useTex, xf) {\n    if (!u.cutouts || !u.cutouts.length) return false;\n    const cut = boardCut(u, b, D2);\n    if (!cut) return false;\n    const off = [dx, dy, dz];\n    const lim = (axis) => {\n      const k = SPAN[axis];\n      return [Math.min(b[k[0]], b[k[1]]), Math.max(b[k[0]], b[k[1]])];\n    };\n    const lt = lim(cut.thin), la = lim(cut.plane[0]), lb = lim(cut.plane[1]);\n    const ins = (v, l) => Math.abs(v - l[0]) < 1e-6 ? l[0] + EPS : Math.abs(v - l[1]) < 1e-6 ? l[1] - EPS : v;\n    const at = (p) => [ins(p[0], la) + off[cut.plane[0]], ins(p[1], lb) + off[cut.plane[1]]];\n    emitCutBoardXf(\n      d,\n      { ...cut, outer: cut.outer.map(at), holes: cut.holes.map((h) => h.map(at)) },\n      lt[0] + EPS + off[cut.thin],\n      lt[1] - EPS + off[cut.thin],\n      col,\n      grainAxis,\n      useTex,\n      xf\n    );\n    return true;\n  }\n  function emitUnit(d, u, selected2) {\n    if (u.type === \"workshop\") return emitWorkshopPreview(d, workshopRuntimeView(u));\n    const emitHingeXf2 = (...a) => {\n      if (!u._productionHardware) emitHingeXf(...a);\n    };\n    const emitLegXf2 = (...a) => {\n      if (!u._productionHardware) emitLegXf(...a);\n    };\n    const emitFrontSlab2 = (data, box3, col2, tex, xf) => {\n      const jp = u.frontStyle === \"jpull\" ? jpullProfile(u, box3) : null;\n      if (jp) return emitFrontProfile(data, box3, jp, col2, tex, xf);\n      const result = shakerFaces(u, box3);\n      if (!result.faces) return emitFrontSlab(data, box3, col2, tex, xf);\n      result.faces.forEach((piece) => emitFrontSlab(data, piece.box, col2, tex, xf, piece.normal));\n      const g2 = u.frontStyle === \"glass\" ? glassFrame(u, box3, canonFrontOf(u, box3)) : null;\n      if (g2) emitFrontSlab(data, g2.pane, OPENING_COLOURS.glass, 0, xf);\n    };\n    const emitFrontPanel2 = (data, x0, x1, y0, y1, z0, z1, col2, tex, xf) => {\n      if (!u.frontStyle || u.frontStyle === \"slab\") return emitFrontPanel(data, x0, x1, y0, y1, z0, z1, col2, tex, xf);\n      return emitFrontSlab2(data, { x0, x1, y0, y1, z0, z1 }, col2, tex, xf);\n    };\n    const W2 = u.w, H2 = u.h, D2 = u.d;\n    const off = explodeMM(u);\n    const col = boardColour(u.finish);\n    const useTex = boardTex(u.finish);\n    const innerZ0 = VOID_REAR + T;\n    const G = drawerParts(u);\n    const isDrawer = u.type === \"base-drawer\";\n    const OFF2 = unitXf(u);\n    function W3(p) {\n      return OFF2.p(p);\n    }\n    function emitDoorStrips(dxf0, dcol, dtex, fx0, fx1, pair) {\n      doorStrips(u).forEach(function(s) {\n        featFront(u.doorOpen ? s.name + \" (open)\" : s.name);\n        if (pair) {\n          leafPlan(u, W2, H2).forEach(function(lf) {\n            noteFront(u, lf.x0 + EPS, lf.x1 - EPS, s.y0 + EPS, s.y1 - EPS, D2 + EPS, D2 + T - EPS, !u.doorOpen && !off);\n            const sw = u.doorOpen ? doorSwingXf(u, lf.hx, lf.sign) : swingXf(lf.hx, D2, 0);\n            const LXF = {\n              p: function(p) {\n                const q = sw.p(p);\n                return W3([q[0], q[1], q[2] + off]);\n              },\n              n: function(n) {\n                return OFF2.n(sw.n(n));\n              }\n            };\n            emitFrontPanel2(d, lf.x0 + EPS, lf.x1 - EPS, s.y0 + EPS, s.y1 - EPS, D2 + EPS, D2 + T - EPS, dcol, dtex, LXF);\n          });\n          return;\n        }\n        const SXF = {\n          p: function(p) {\n            const q = dxf0.p(p);\n            return W3([q[0], q[1], q[2] + off]);\n          },\n          n: function(n) {\n            return OFF2.n(dxf0.n(n));\n          }\n        };\n        noteFront(u, fx0 + EPS, fx1 - EPS, s.y0 + EPS, s.y1 - EPS, D2 + EPS, D2 + T - EPS, !u.doorOpen && !off);\n        emitFrontPanel2(d, fx0 + EPS, fx1 - EPS, s.y0 + EPS, s.y1 - EPS, D2 + EPS, D2 + T - EPS, dcol, dtex, SXF);\n        hingeYs(s.y0, s.y1).forEach(function(yc) {\n          emitHingeXf2(d, W2, H2, D2, yc, dxf0, off, -off, OFF2);\n        });\n      });\n    }\n    function emitModel1Box(dd, b, c, tex, XF) {\n      const P2 = model1Panels(b), sides = {};\n      P2.forEach(function(p) {\n        if (/^side/.test(p.role)) {\n          (sides[p.name] = sides[p.name] || []).push(p);\n          return;\n        }\n        emitBoxXf(dd, p.x0, p.x1, p.y0, p.y1, p.z0, p.z1, c, 0, tex, XF);\n      });\n      Object.keys(sides).forEach(function(k) {\n        const S2 = sides[k], o = sideOutline(S2);\n        featBox(\n          Math.min.apply(null, S2.map(function(s) {\n            return s.x0;\n          })),\n          Math.max.apply(null, S2.map(function(s) {\n            return s.x1;\n          })),\n          Math.min.apply(null, S2.map(function(s) {\n            return s.y0;\n          })),\n          Math.max.apply(null, S2.map(function(s) {\n            return s.y1;\n          })),\n          S2[0].z0,\n          S2[0].z1,\n          XF\n        );\n        emitBoardProfileXf(dd, o, S2[0].z0, S2[0].z1, c, 0, tex, XF);\n      });\n    }\n    function emitConcealedRunners(dd, bx0, bo, by0, rz0, len) {\n      if (u._productionHardware) return;\n      const s = MODEL1.t - MODEL1.shaveD, y0 = by0 + 4, y1 = by0 + MODEL1.strip - 0.5;\n      [bx0 + s, bx0 + bo - s - DRW.runnerT].forEach(function(rx) {\n        emitBoxXf(dd, rx, rx + DRW.runnerT, y0, y1, rz0, rz0 + len, MET.barrel, 0, 0, OFF2);\n      });\n    }\n    function emitAdded() {\n      const xfronts = drawerFrontsOn(u);\n      addedDrawers(u).forEach(function(xd) {\n        const slide = xd.open ? DRW.openBy : 0;\n        const XB = { p: function(p) {\n          return W3([p[0], p[1], p[2] + slide]);\n        }, n: OFF2.n };\n        const XF = { p: function(p) {\n          return W3([p[0], p[1], p[2] + slide + off]);\n        }, n: OFF2.n };\n        if (xfronts) {\n          featFront(xd.name + \" front\" + (xd.open ? \" (open)\" : \"\"));\n          noteFront(u, xd.fx0 + EPS, xd.fx1 - EPS, xd.fy0 + EPS, xd.fy1 - EPS, D2 + EPS, D2 + T - EPS, !xd.open && !off);\n          emitFrontPanel2(\n            d,\n            xd.fx0 + EPS,\n            xd.fx1 - EPS,\n            xd.fy0 + EPS,\n            xd.fy1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            frontCol(u, u.frontFinish),\n            frontTex(u, u.frontFinish),\n            XF\n          );\n        }\n        featTag(xd.name + \" box\" + (xd.open ? \" (open)\" : \"\"));\n        const bo = xd.w, bx0 = xd.x0, bz0 = xd.bz0, bz1 = bz0 + xd.l, by0 = xd.by0, by1 = xd.by1;\n        emitModel1Box(d, { x0: bx0, w: bo, y0: by0, h: by1 - by0, z0: bz0, l: bz1 - bz0 }, col, useTex, XB);\n        featTag(\"Drawer runner\");\n        emitConcealedRunners(d, bx0, bo, by0, bz0 - 8, xd.l);\n      });\n    }\n    if (isOvenBase(u)) {\n      ovenBaseParts(W2, H2, D2).forEach(function(bx2) {\n        featTag(bx2.name, EPS);\n        const _e = exOff(bx2, off), dx = _e[0], dy = _e[1], dz = _e[2];\n        emitBoxXf(\n          d,\n          bx2.x0 + EPS + dx,\n          bx2.x1 - EPS + dx,\n          bx2.y0 + EPS + dy,\n          bx2.y1 - EPS + dy,\n          bx2.z0 + EPS + dz,\n          bx2.z1 - EPS + dz,\n          col,\n          bx2.name.indexOf(\"Side\") === 0 ? 1 : 0,\n          useTex,\n          OFF2\n        );\n      });\n      legCentres(W2, D2, VOID_REAR + T).forEach(function(c) {\n        emitLegXf2(d, c[0], c[1], 0, OFF2);\n      });\n      if (drawerFrontsOn(u)) {\n        const p = ovenPanel(u), PXF = { p: function(q) {\n          return W3([q[0], q[1], q[2] + off]);\n        }, n: OFF2.n };\n        featFront(\"Panel below the oven\");\n        noteFront(u, p.x0 + EPS, p.x1 - EPS, p.y0 + EPS, p.y1 - EPS, p.z0 + EPS, p.z1 - EPS, !off);\n        emitFrontPanel2(\n          d,\n          p.x0 + EPS,\n          p.x1 - EPS,\n          p.y0 + EPS,\n          p.y1 - EPS,\n          p.z0 + EPS,\n          p.z1 - EPS,\n          frontCol(u, u.doorFinish),\n          frontTex(u, u.doorFinish),\n          PXF\n        );\n      }\n      emitOven(d, u, { p: function(q) {\n        return W3([q[0], q[1], q[2] + off]);\n      }, n: OFF2.n }, null);\n      return;\n    }\n    if (isTall(u)) {\n      let tparts = carcassRawFor(u);\n      const TVERT = {\n        \"Side L\": 1,\n        \"Side R\": 1,\n        \"Back\": 1,\n        \"Back brace top\": 1,\n        \"Back brace bottom\": 1,\n        \"Back upper\": 1,\n        \"Back lower\": 1\n      };\n      tparts = stripStockShelves(tparts, u);\n      tparts.forEach(function(bx2) {\n        featTag(bx2.name, EPS);\n        const _e = exOff(bx2, off), dx = _e[0], dy = _e[1], dz = _e[2];\n        if (emitCutBoard(d, u, bx2, D2, dx, dy, dz, col, TVERT[bx2.name] ? 1 : 0, useTex, OFF2)) return;\n        emitBoxXf(\n          d,\n          bx2.x0 + EPS + dx,\n          bx2.x1 - EPS + dx,\n          bx2.y0 + EPS + dy,\n          bx2.y1 - EPS + dy,\n          bx2.z0 + EPS + dz,\n          bx2.z1 - EPS + dz,\n          col,\n          TVERT[bx2.name] ? 1 : 0,\n          useTex,\n          OFF2\n        );\n      });\n      emitInterior(d, u);\n      legCentres(W2, D2, VOID_REAR + T).forEach(function(c) {\n        emitLegXf2(d, c[0], c[1], legDy(u), OFF2);\n      });\n      if (isHousing(u)) {\n        featTag(\"Appliance space\");\n        const nz = u.type === \"tall-oven\" ? ovenNiche(u) : { y0: T, y1: fridgeSplitY(u), h: fridgeSplitY(u) - T };\n        const ax0 = T + 6, ax1 = W2 - T - 6;\n        const az1 = D2 - 30, az0 = Math.max(T, az1 - (u.type === \"tall-oven\" ? 560 : 540));\n        emitBoxXf(\n          d,\n          ax0,\n          ax1,\n          nz.y0 + 6,\n          nz.y1 - 6,\n          az0,\n          az1,\n          APPLIANCE_GREY,\n          0,\n          0,\n          OFF2\n        );\n        if (u.type === \"tall-fridge\") {\n          emitBoxXf(\n            d,\n            ax0,\n            ax1,\n            fridgeSplitY(u) + T + 6,\n            H2 - T - 6,\n            az0,\n            az1,\n            APPLIANCE_GREY,\n            0,\n            0,\n            OFF2\n          );\n        }\n      }\n      if (u.door) {\n        const tcol = frontCol(u, u.doorFinish);\n        const ttex = frontTex(u, u.doorFinish);\n        tallLeaves(u).forEach(function(lf, k) {\n          const li = lf.li != null ? lf.li : k;\n          noteFront(\n            u,\n            REVEAL + EPS,\n            W2 - REVEAL - EPS,\n            lf.y0 + EPS,\n            lf.y1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            !(u.leafOpen && u.leafOpen[li]) && !off\n          );\n        });\n        tallLeaves(u).forEach(function(lf, k) {\n          const li = lf.li != null ? lf.li : k;\n          const open = !!(u.leafOpen && u.leafOpen[li]);\n          featFront(open ? \"Door (open)\" : \"Door\");\n          const txf0 = open ? doorSwingXf(u, REVEAL, 1) : doorTransform(W2, D2, 0);\n          const TXF = {\n            p: function(p) {\n              const q = txf0.p(p);\n              return W3([q[0], q[1], q[2] + off]);\n            },\n            n: function(n) {\n              return OFF2.n(txf0.n(n));\n            }\n          };\n          emitFrontPanel2(\n            d,\n            REVEAL + EPS,\n            W2 - REVEAL - EPS,\n            lf.y0 + EPS,\n            lf.y1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            tcol,\n            ttex,\n            TXF\n          );\n          const span2 = lf.y1 - lf.y0;\n          [lf.y0 + HINGE.yInset, lf.y0 + span2 / 2, lf.y1 - HINGE.yInset].forEach(function(yc) {\n            emitHingeXf2(d, W2, H2, D2, yc, txf0, off, -off, OFF2);\n          });\n        });\n      }\n      emitAdded();\n      return;\n    }\n    if (isIsland(u)) {\n      const skinF = u.skinFinish || u.frontFinish || u.finish;\n      const scol = boardColour(skinF), stex = boardTex(skinF);\n      islandSkinParts(u).forEach(function(b) {\n        featTag(b.name, EPS);\n        const _e = exOff(b, off), dx = _e[0], dy = _e[1], dz = _e[2];\n        emitBoxXf(\n          d,\n          b.x0 + EPS + dx,\n          b.x1 - EPS + dx,\n          b.y0 + EPS + dy,\n          b.y1 - EPS + dy,\n          b.z0 + EPS + dz,\n          b.z1 - EPS + dz,\n          scol,\n          1,\n          stex,\n          OFF2\n        );\n      });\n      islandBays(u).forEach(function(b) {\n        emitUnit(d, { ...b, frontStyle: u.frontStyle, shaker: u.shaker, frontMat: u.frontMat, paint: u.paint }, false);\n      });\n      return;\n    }\n    if (u.family === \"corner\") {\n      const isLT = u.type === \"corner-tall\", isL = u.type === \"corner-l\" || isLT;\n      const CXF = OFF2;\n      const mirX = !isL && u.hand === \"right\";\n      let cparts = isLT ? cornerLTallParts(armA(u), armB(u), H2, D2) : isL ? cornerLParts(armA(u), armB(u), H2, D2) : cornerBlindParts(W2, H2, D2);\n      if (mirX) cparts = mirrorPartsX(cparts, W2);\n      const CVERT = {\n        \"Back A\": 1,\n        \"Back B\": 1,\n        \"Back\": 1,\n        \"End A\": 1,\n        \"End B\": 1,\n        \"Side blind end\": 1,\n        \"Side open end\": 1,\n        \"Blanking panel\": 1\n      };\n      if (isL) cparts = cparts.filter(function(b) {\n        return !/^Shelf/.test(b.name);\n      });\n      cparts.forEach(function(b) {\n        featTag(b.name, EPS);\n        const _e = exOff(b, off), dx = _e[0], dy = _e[1], dz = _e[2];\n        emitBoxXf(\n          d,\n          b.x0 + EPS + dx,\n          b.x1 - EPS + dx,\n          b.y0 + EPS + dy,\n          b.y1 - EPS + dy,\n          b.z0 + EPS + dz,\n          b.z1 - EPS + dz,\n          col,\n          CVERT[b.name] ? 1 : 0,\n          useTex,\n          CXF\n        );\n      });\n      cornerLegCentres(u).forEach(function(c) {\n        emitLegXf2(d, c[0], c[1], legDy(u), CXF);\n      });\n      if (u.door) {\n        const ccol = frontCol(u, u.doorFinish);\n        const ctex = frontTex(u, u.doorFinish);\n        const cang = u.doorOpen ? DOOR_OPEN_DEG * Math.PI / 180 : 0;\n        featFront(u.doorOpen ? \"Door (open)\" : \"Door\");\n        cornerDoorSlabs(u).forEach(function(s) {\n          const _sw = swingXf(s.hx, s.hz, s.sign * cang);\n          const _out = s.z1 - s.z0 <= s.x1 - s.x0 ? [0, 0, off] : [-off, 0, 0];\n          const DXF = composeXf(CXF, {\n            p: function(p) {\n              const q = _sw.p(p);\n              return [q[0] + _out[0], q[1] + _out[1], q[2] + _out[2]];\n            },\n            n: _sw.n\n          });\n          emitFrontSlab2(d, s, ccol, ctex, DXF);\n        });\n      }\n      if (isL) emitInterior(d, u);\n      return;\n    }\n    if (u.type === \"corner-wall\") {\n      const LWXF = OFF2;\n      const lwCV = { \"Back A\": 1, \"Back B\": 1, \"End A\": 1, \"End B\": 1 };\n      cornerLWallParts(armA(u), armB(u), H2, D2).forEach(function(b) {\n        if (/^Shelf/.test(b.name)) return;\n        featTag(b.name, EPS);\n        const _e2 = exOff(b, off);\n        emitBoxXf(\n          d,\n          b.x0 + EPS + _e2[0],\n          b.x1 - EPS + _e2[0],\n          b.y0 + EPS + _e2[1],\n          b.y1 - EPS + _e2[1],\n          b.z0 + EPS + _e2[2],\n          b.z1 - EPS + _e2[2],\n          col,\n          lwCV[b.name] ? 1 : 0,\n          useTex,\n          LWXF\n        );\n      });\n      if (u.door) {\n        const lwcol = frontCol(u, u.doorFinish);\n        const lwtex = frontTex(u, u.doorFinish);\n        const lwang = u.doorOpen ? DOOR_OPEN_DEG * Math.PI / 180 : 0;\n        featFront(u.doorOpen ? \"Door (open)\" : \"Door\");\n        cornerDoorSlabs(u).forEach(function(s) {\n          const _sw2 = swingXf(s.hx, s.hz, s.sign * lwang);\n          const _out2 = s.z1 - s.z0 <= s.x1 - s.x0 ? [0, 0, off] : [-off, 0, 0];\n          const LDXF = composeXf(LWXF, {\n            p: function(p) {\n              const q = _sw2.p(p);\n              return [q[0] + _out2[0], q[1] + _out2[1], q[2] + _out2[2]];\n            },\n            n: _sw2.n\n          });\n          emitFrontSlab2(d, s, lwcol, lwtex, LDXF);\n        });\n      }\n      emitInterior(d, u);\n      return;\n    }\n    if (u.family === \"wall\") {\n      stripStockShelves(carcassRawFor(u), u).forEach(function(b) {\n        featTag(b.name, EPS);\n        const _e = exOff(b, off), dx = _e[0], dy = _e[1], dz = _e[2];\n        if (emitCutBoard(d, u, b, D2, dx, dy, dz, col, b.name === \"Side L\" || b.name === \"Side R\" || b.name === \"Back\" ? 1 : 0, useTex, OFF2)) return;\n        emitBoxXf(\n          d,\n          b.x0 + EPS + dx,\n          b.x1 - EPS + dx,\n          b.y0 + EPS + dy,\n          b.y1 - EPS + dy,\n          b.z0 + EPS + dz,\n          b.z1 - EPS + dz,\n          col,\n          b.name === \"Side L\" || b.name === \"Side R\" || b.name === \"Back\" ? 1 : 0,\n          useTex,\n          OFF2\n        );\n      });\n      emitInterior(d, u);\n      const wband = doorBand(u);\n      const wb0 = wband ? wband.y0 : REVEAL, wb1 = wband ? wband.y1 : H2 - REVEAL;\n      if (u.door && !(wband && wband.none)) {\n        const wcol = frontCol(u, u.doorFinish);\n        const wtex = frontTex(u, u.doorFinish);\n        const wxf0 = u.doorOpen ? doorSwingXf(u, REVEAL, 1) : doorTransform(W2, D2, 0);\n        featFront(u.doorOpen ? \"Door (open)\" : \"Door\");\n        const WXF = {\n          p: function(p) {\n            const q = wxf0.p(p);\n            return W3([q[0], q[1], q[2] + off]);\n          },\n          n: function(n) {\n            return OFF2.n(wxf0.n(n));\n          }\n        };\n        if (doorLeaves(u) === 2) {\n          leafPlan(u, W2, H2).forEach(function(lf) {\n            noteFront(\n              u,\n              lf.x0 + EPS,\n              lf.x1 - EPS,\n              wb0 + EPS,\n              wb1 - EPS,\n              D2 + EPS,\n              D2 + T - EPS,\n              !u.doorOpen && !off\n            );\n          });\n          leafPlan(u, W2, H2).forEach(function(lf) {\n            const sw = u.doorOpen ? doorSwingXf(u, lf.hx, lf.sign) : swingXf(lf.hx, D2, 0);\n            const LXF = {\n              p: function(p) {\n                const q = sw.p(p);\n                return W3([q[0], q[1], q[2] + off]);\n              },\n              n: function(n) {\n                return OFF2.n(sw.n(n));\n              }\n            };\n            emitFrontPanel2(\n              d,\n              lf.x0 + EPS,\n              lf.x1 - EPS,\n              wb0 + EPS,\n              wb1 - EPS,\n              D2 + EPS,\n              D2 + T - EPS,\n              wcol,\n              wtex,\n              LXF\n            );\n          });\n        } else {\n          noteFront(\n            u,\n            REVEAL + EPS,\n            W2 - REVEAL - EPS,\n            wb0 + EPS,\n            wb1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            !u.doorOpen && !off\n          );\n          emitFrontPanel2(\n            d,\n            REVEAL + EPS,\n            W2 - REVEAL - EPS,\n            wb0 + EPS,\n            wb1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            wcol,\n            wtex,\n            WXF\n          );\n          (wband ? hingeYs(wb0, wb1) : [HINGE.yInset, H2 - HINGE.yInset]).forEach(function(yc) {\n            emitHingeXf2(d, W2, H2, D2, yc, wxf0, off, -off, OFF2);\n          });\n        }\n        emitDoorStrips(wxf0, wcol, wtex, REVEAL, W2 - REVEAL, doorLeaves(u) === 2);\n      }\n      emitAdded();\n      return;\n    }\n    if (u.type === \"base-4drawer\") {\n      carcassRawFor(u).forEach(function(b) {\n        featTag(b.name, EPS);\n        const _e = exOff(b, off), dx = _e[0], dy = _e[1], dz = _e[2];\n        const g4 = { \"Side L\": 1, \"Side R\": 1, \"Back\": 1 }[b.name] ? 1 : 0;\n        if (emitCutBoard(d, u, b, D2, dx, dy, dz, col, g4, useTex, OFF2)) return;\n        if (b.notches) {\n          emitNotchedBoard(d, b, dx, dy, dz, col, g4, useTex, OFF2);\n          return;\n        }\n        emitBoxXf(\n          d,\n          b.x0 + EPS + dx,\n          b.x1 - EPS + dx,\n          b.y0 + EPS + dy,\n          b.y1 - EPS + dy,\n          b.z0 + EPS + dz,\n          b.z1 - EPS + dz,\n          col,\n          g4,\n          useTex,\n          OFF2\n        );\n      });\n      emitGolaProfiles(d, u, OFF2);\n      legCentres(W2, D2, innerZ0).forEach(function(c) {\n        emitLegXf2(d, c[0], c[1], legDy(u), OFF2);\n      });\n      const f4col = frontCol(u, u.frontFinish);\n      const f4tex = frontTex(u, u.frontFinish);\n      const open4 = u.drawers || [];\n      const fronts4 = drawerFrontsOn(u);\n      const out4 = ownOut(u);\n      (function() {\n        if (fronts4) drawer4Parts(u).forEach(function(g4, i) {\n          if (out4.has(i)) return;\n          const fx = (W2 - g4.frontW) / 2;\n          noteFront(\n            u,\n            fx + EPS,\n            W2 - fx - EPS,\n            g4.fy0 + EPS,\n            g4.fy1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            !open4[i] && !off\n          );\n        });\n      })();\n      drawer4Parts(u).forEach(function(g4, i) {\n        if (out4.has(i)) return;\n        const slide4 = open4[i] ? DRW.openBy : 0;\n        const S4 = { p: function(p) {\n          return W3([p[0], p[1], p[2] + slide4]);\n        }, n: OFF2.n };\n        const S4F = { p: function(p) {\n          return W3([p[0], p[1], p[2] + slide4 + off]);\n        }, n: OFF2.n };\n        const fx0 = (W2 - g4.frontW) / 2;\n        if (fronts4) {\n          featFront(\"Drawer front \" + (i + 1) + (open4[i] ? \" (open)\" : \"\"));\n          emitFrontPanel2(d, fx0 + EPS, W2 - fx0 - EPS, g4.fy0 + EPS, g4.fy1 - EPS, D2 + EPS, D2 + T - EPS, f4col, f4tex, S4F);\n        }\n        featTag(\"Drawer \" + (i + 1) + \" box\" + (open4[i] ? \" (open)\" : \"\"));\n        const bo4 = g4.boxOuter, bx4 = (W2 - bo4) / 2, bz0 = innerZ0 + 8, bz1 = bz0 + g4.boxL;\n        emitModel1Box(d, { x0: bx4, w: bo4, y0: g4.by0, h: g4.by1 - g4.by0, z0: bz0, l: bz1 - bz0 }, col, useTex, S4);\n        featTag(\"Drawer runner\");\n        emitConcealedRunners(d, bx4, bo4, g4.by0, innerZ0, g4.boxL);\n      });\n      emitAdded();\n      return;\n    }\n    const parts = stripStockShelves(carcassRawFor(u), u);\n    const VERT2 = { \"Side L\": 1, \"Side R\": 1, \"Back\": 1 };\n    parts.forEach(function(b) {\n      featTag(b.name, EPS);\n      const _e = exOff(b, off), dx = _e[0], dy = _e[1], dz = _e[2];\n      if (emitCutBoard(d, u, b, D2, dx, dy, dz, col, VERT2[b.name] ? 1 : 0, useTex, OFF2)) return;\n      if (b.notches) {\n        emitNotchedBoard(d, b, dx, dy, dz, col, VERT2[b.name] ? 1 : 0, useTex, OFF2);\n        return;\n      }\n      emitBoxXf(\n        d,\n        b.x0 + EPS + dx,\n        b.x1 - EPS + dx,\n        b.y0 + EPS + dy,\n        b.y1 - EPS + dy,\n        b.z0 + EPS + dz,\n        b.z1 - EPS + dz,\n        col,\n        VERT2[b.name] ? 1 : 0,\n        useTex,\n        OFF2\n      );\n    });\n    emitInterior(d, u);\n    emitGolaProfiles(d, u, OFF2);\n    legCentres(W2, D2, innerZ0).forEach(function(c) {\n      emitLegXf2(d, c[0], c[1], legDy(u), OFF2);\n    });\n    featFront(u.doorOpen ? \"Door (open)\" : \"Door\");\n    const band = doorBand(u);\n    const doorOn = !!u.door && !(band && band.none);\n    if (u.door || isDrawer) {\n      const dcol = frontCol(u, u.doorFinish);\n      const dtex = frontTex(u, u.doorFinish);\n      const dxf0 = u.doorOpen ? doorSwingXf(u, REVEAL, 1) : doorTransform(W2, D2, 0);\n      const DXF = {\n        p: function(p) {\n          const q = dxf0.p(p);\n          return W3([q[0], q[1], q[2] + off]);\n        },\n        n: function(n) {\n          return OFF2.n(dxf0.n(n));\n        }\n      };\n      if (!isDrawer) {\n        const gf = golaFace(u);\n        const by0 = band ? band.y0 : REVEAL, by1 = band ? band.y1 : H2 - (gf ? gf.topGap : REVEAL);\n        if (doorOn) {\n          if (doorLeaves(u) === 2) {\n            leafPlan(u, W2, H2).forEach(function(lf) {\n              noteFront(\n                u,\n                lf.x0 + EPS,\n                lf.x1 - EPS,\n                by0 + EPS,\n                by1 - EPS,\n                D2 + EPS,\n                D2 + T - EPS,\n                !u.doorOpen && !off\n              );\n            });\n            leafPlan(u, W2, H2).forEach(function(lf) {\n              const sw = u.doorOpen ? doorSwingXf(u, lf.hx, lf.sign) : swingXf(lf.hx, D2, 0);\n              const LXF = {\n                p: function(p) {\n                  const q = sw.p(p);\n                  return W3([q[0], q[1], q[2] + off]);\n                },\n                n: function(n) {\n                  return OFF2.n(sw.n(n));\n                }\n              };\n              emitFrontPanel2(\n                d,\n                lf.x0 + EPS,\n                lf.x1 - EPS,\n                by0 + EPS,\n                by1 - EPS,\n                D2 + EPS,\n                D2 + T - EPS,\n                dcol,\n                dtex,\n                LXF\n              );\n            });\n          } else {\n            noteFront(\n              u,\n              REVEAL + EPS,\n              W2 - REVEAL - EPS,\n              by0 + EPS,\n              by1 - EPS,\n              D2 + EPS,\n              D2 + T - EPS,\n              !u.doorOpen && !off\n            );\n            emitFrontPanel2(\n              d,\n              REVEAL + EPS,\n              W2 - REVEAL - EPS,\n              by0 + EPS,\n              by1 - EPS,\n              D2 + EPS,\n              D2 + T - EPS,\n              dcol,\n              dtex,\n              DXF\n            );\n            (gf ? golaHingeYs(u, by0, by1, HINGE.yInset) : band ? hingeYs(by0, by1) : [HINGE.yInset, H2 - HINGE.yInset]).forEach(function(yc) {\n              emitHingeXf2(d, W2, H2, D2, yc, dxf0, off, -off, OFF2);\n            });\n          }\n          emitDoorStrips(dxf0, dcol, dtex, REVEAL, W2 - REVEAL, doorLeaves(u) === 2);\n        }\n      } else {\n        const dw = G.doorW, dGap = (W2 - dw) / 2;\n        const dy0 = band ? band.y0 : 2, dy1 = band ? band.y1 : 2 + G.doorH;\n        if (doorOn) {\n          emitFrontPanel2(\n            d,\n            dGap + EPS,\n            W2 - dGap - EPS,\n            dy0 + EPS,\n            dy1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            dcol,\n            dtex,\n            DXF\n          );\n          (golaFace(u) ? golaHingeYs(u, dy0, dy1, HINGE.yInset) : band ? hingeYs(dy0, dy1) : [Math.min(HINGE.yInset, 2 + G.doorH - 70), Math.max(70, 2 + G.doorH - 70)].filter(function(v, i, arr) {\n            return i === 0 || Math.abs(v - arr[0]) > 60;\n          })).forEach(function(yc) {\n            emitHingeXf2(d, W2, H2, D2, yc, dxf0, off, -off, OFF2);\n          });\n          emitDoorStrips(dxf0, dcol, dtex, dGap, W2 - dGap, false);\n        }\n        const fcol = frontCol(u, u.frontFinish);\n        const ftex = frontTex(u, u.frontFinish);\n        const slide = u.drawerOpen ? DRW.openBy : 0;\n        const SL = { p: function(p) {\n          return W3([p[0], p[1], p[2] + slide]);\n        }, n: OFF2.n };\n        const SLF = { p: function(p) {\n          return W3([p[0], p[1], p[2] + slide + off]);\n        }, n: OFF2.n };\n        const fy1 = G.fy1, fy0 = fy1 - G.frontH, fx0 = (W2 - G.frontW) / 2;\n        const topOut = ownOut(u).has(0);\n        if (drawerFrontsOn(u) && !topOut) {\n          featFront(u.drawerOpen ? \"Drawer front (open)\" : \"Drawer front\");\n          noteFront(\n            u,\n            fx0 + EPS,\n            W2 - fx0 - EPS,\n            fy0 + EPS,\n            fy1 - EPS,\n            D2 + EPS,\n            D2 + T - EPS,\n            !u.drawerOpen && !off\n          );\n          emitFrontPanel2(d, fx0 + EPS, W2 - fx0 - EPS, fy0 + EPS, fy1 - EPS, D2 + EPS, D2 + T - EPS, fcol, ftex, SLF);\n        }\n        if (doorOn) noteFront(\n          u,\n          dGap + EPS,\n          W2 - dGap - EPS,\n          dy0 + EPS,\n          dy1 - EPS,\n          D2 + EPS,\n          D2 + T - EPS,\n          !u.doorOpen && !off\n        );\n        if (!topOut) {\n          featTag(u.drawerOpen ? \"Drawer box (open)\" : \"Drawer box\");\n          const bo = G.boxOuter, bx0 = (W2 - bo) / 2, bz0 = innerZ0 + 8, bz1 = bz0 + G.boxL;\n          const by0 = G.by0, by1 = G.by1;\n          emitModel1Box(d, { x0: bx0, w: bo, y0: by0, h: by1 - by0, z0: bz0, l: bz1 - bz0 }, col, useTex, SL);\n          featTag(\"Drawer runner\");\n          emitConcealedRunners(d, bx0, bo, by0, innerZ0, G.boxL);\n        }\n      }\n    }\n    emitAdded();\n  }\n  function sideOutline(S2) {\n    const R4 = S2.slice().sort(function(a, b) {\n      return a.y0 - b.y0;\n    });\n    const outerAtX0 = R4.every(function(r) {\n      return Math.abs(r.x0 - R4[0].x0) < 1e-6;\n    });\n    const outer = outerAtX0 ? R4[0].x0 : R4[0].x1, inner = function(r) {\n      return outerAtX0 ? r.x1 : r.x0;\n    };\n    const pts = [[outer, R4[0].y0]];\n    R4.forEach(function(r) {\n      pts.push([inner(r), r.y0], [inner(r), r.y1]);\n    });\n    pts.push([outer, R4[R4.length - 1].y1]);\n    const out = [];\n    pts.forEach(function(p) {\n      const q = out[out.length - 1];\n      if (!q || Math.abs(q[0] - p[0]) > 1e-6 || Math.abs(q[1] - p[1]) > 1e-6) out.push(p);\n    });\n    for (let i = out.length - 1; i >= 0 && out.length > 3; i--) {\n      const a = out[(i + out.length - 1) % out.length], b = out[i], c = out[(i + 1) % out.length];\n      if (Math.abs((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0])) < 1e-6) out.splice(i, 1);\n    }\n    return out;\n  }\n  function hingeYs(y0, y1) {\n    const a = y0 + Math.min(HINGE.yInset, (y1 - y0) / 2), b = y1 - Math.min(HINGE.yInset, (y1 - y0) / 2);\n    return b - a > 60 ? [a, b] : [(y0 + y1) / 2];\n  }\n\n  // v2/src/model/splashbacks.js\n  function worldRange(u, x0, x1, axis) {\n    const xf = unitXf(u), a = xf.p([x0, 0, 0]), b = xf.p([x1, 0, 0]), k = axis === \"x\" ? 0 : 2;\n    return [Math.min(a[k], b[k]), Math.max(a[k], b[k])];\n  }\n  function backAt(u, axis) {\n    const p = unitXf(u).p([0, 0, 0]);\n    return axis === \"x\" ? p[0] : p[2];\n  }\n  var SPLASH = {\n    DEFAULT_H: 600,\n    MIN_H: 100,\n    GLASS_T: 6,\n    TILE_T: 8,\n    GLASS: [\n      { id: \"white\", name: \"Pure white\", hex: \"#f2f2ee\" },\n      { id: \"cream\", name: \"Cream\", hex: \"#ece3cf\" },\n      { id: \"dove\", name: \"Dove grey\", hex: \"#c8c8c2\" },\n      { id: \"sage\", name: \"Sage green\", hex: \"#a9b8a0\" },\n      { id: \"duck\", name: \"Duck egg\", hex: \"#9fc2c0\" },\n      { id: \"navy\", name: \"Navy\", hex: \"#22344f\" },\n      { id: \"anthracite\", name: \"Anthracite\", hex: \"#3a3d41\" },\n      { id: \"black\", name: \"Black\", hex: \"#16171a\" }\n    ],\n    TILE_COLOURS: [\n      { id: \"white\", name: \"Gloss white\", hex: \"#f4f4f0\" },\n      { id: \"grey\", name: \"Light grey\", hex: \"#cfd0cc\" },\n      { id: \"sage\", name: \"Sage\", hex: \"#a6b59b\" },\n      { id: \"blue\", name: \"Blue\", hex: \"#5d7d9a\" },\n      { id: \"terracotta\", name: \"Terracotta\", hex: \"#b8664a\" },\n      { id: \"black\", name: \"Black\", hex: \"#222326\" }\n    ],\n    SIZES: [\n      { id: \"100x100\", w: 100, h: 100, name: \"100 x 100 square\" },\n      { id: \"150x75\", w: 150, h: 75, name: \"150 x 75 metro\" },\n      { id: \"200x100\", w: 200, h: 100, name: \"200 x 100 metro\" },\n      { id: \"300x75\", w: 300, h: 75, name: \"300 x 75 slim\" }\n    ],\n    LAYOUTS: [{ id: \"stack\", name: \"Stacked\" }, { id: \"brick\", name: \"Brick (half bond)\" }, { id: \"vertical\", name: \"Vertical stack\" }],\n    GROUTS: [{ id: \"white\", name: \"White grout\", hex: \"#f0efe9\" }, { id: \"grey\", name: \"Grey grout\", hex: \"#9b9c98\" }, { id: \"dark\", name: \"Dark grout\", hex: \"#3b3c3a\" }]\n  };\n  var HEX = /^#[0-9a-f]{6}$/i;\n  var byId = (list, id) => list.find((x) => x.id === id) || null;\n  function splashOf(kitchen) {\n    const s = kitchen && kitchen.splash;\n    if (!s || typeof s !== \"object\") return { on: false, kind: \"glass\", colour: SPLASH.GLASS[0].hex, tile: { size: \"100x100\", layout: \"stack\", grout: \"white\" }, set: false };\n    const kind = s.kind === \"tiles\" ? \"tiles\" : \"glass\";\n    const t = s.tile && typeof s.tile === \"object\" ? s.tile : {};\n    return {\n      on: !!s.on,\n      kind,\n      colour: HEX.test(String(s.colour || \"\")) ? String(s.colour).toLowerCase() : kind === \"tiles\" ? SPLASH.TILE_COLOURS[0].hex : SPLASH.GLASS[0].hex,\n      tile: {\n        size: byId(SPLASH.SIZES, t.size) ? t.size : \"100x100\",\n        layout: byId(SPLASH.LAYOUTS, t.layout) ? t.layout : \"stack\",\n        grout: byId(SPLASH.GROUTS, t.grout) ? t.grout : \"white\"\n      },\n      set: true,\n      pieces: piecesOf(s.pieces)\n    };\n  }\n  var PIECE = { MIN_W: 100, MIN_H: 100, MAX_H: 2400 };\n  function piecesOf(list) {\n    if (!Array.isArray(list)) return null;\n    const out = [], seen = /* @__PURE__ */ new Set();\n    list.forEach((q, i) => {\n      if (!q || typeof q !== \"object\" || typeof q.wall !== \"string\" || !q.wall) return;\n      const n = (v) => Number.isFinite(Number(v)) ? Math.round(Number(v)) : NaN;\n      let a0 = n(q.a0), a1 = n(q.a1), y0 = n(q.y0), y1 = n(q.y1);\n      if (![a0, a1, y0, y1].every(Number.isFinite)) return;\n      if (a1 < a0) [a0, a1] = [a1, a0];\n      if (y1 < y0) [y0, y1] = [y1, y0];\n      let id = typeof q.id === \"string\" && q.id ? q.id : \"SB\" + (i + 1);\n      while (seen.has(id)) id += \"b\";\n      seen.add(id);\n      out.push({ id, wall: q.wall, a0, a1, y0, y1 });\n    });\n    return out;\n  }\n  function pieceWall(wallId) {\n    try {\n      const sw = seatWallById(wallId);\n      if (sw) return { id: wallId, axis: sw.axis, at: sw.at, sign: sw.face === \"back\" || sw.face === \"left\" ? 1 : -1, lo: sw.lo, hi: sw.hi };\n      if ([\"back\", \"front\", \"left\", \"right\"].indexOf(wallId) < 0) return null;\n      const P2 = roomWallPlane(wallId), sz = roomSize();\n      return { id: wallId, axis: P2.axis, at: P2.at, sign: wallId === \"back\" || wallId === \"left\" ? 1 : -1, lo: 0, hi: P2.axis === \"z\" ? sz.width : sz.depth };\n    } catch {\n      return null;\n    }\n  }\n  function nextPieceId(pieces) {\n    let k = 1;\n    const ids = new Set((pieces || []).map((q) => q.id));\n    while (ids.has(\"SB\" + k)) k++;\n    return \"SB\" + k;\n  }\n  function splashName(S2) {\n    if (S2.kind === \"glass\") {\n      const g3 = SPLASH.GLASS.find((x) => x.hex === S2.colour);\n      return \"Glass, \" + (g3 ? g3.name : \"custom colour \" + S2.colour);\n    }\n    const c = SPLASH.TILE_COLOURS.find((x) => x.hex === S2.colour), z = byId(SPLASH.SIZES, S2.tile.size), l = byId(SPLASH.LAYOUTS, S2.tile.layout), g2 = byId(SPLASH.GROUTS, S2.tile.grout);\n    return \"Tiles \" + z.name + \", \" + (c ? c.name : \"custom colour \" + S2.colour) + \", \" + l.name.toLowerCase() + \", \" + g2.name.toLowerCase();\n  }\n  function cutIntervals(lo, hi, rules) {\n    const pts = /* @__PURE__ */ new Set([lo, hi]);\n    rules.forEach((r) => {\n      if (r.a0 > lo && r.a0 < hi) pts.add(r.a0);\n      if (r.a1 > lo && r.a1 < hi) pts.add(r.a1);\n    });\n    const P2 = [...pts].sort((a, b) => a - b), out = [];\n    for (let i = 0; i < P2.length - 1; i++) if (P2[i + 1] - P2[i] > 0.5) out.push([P2[i], P2[i + 1]]);\n    return out;\n  }\n  function splashPanels(units, kitchen, room) {\n    const S2 = splashOf(kitchen);\n    if (!S2.on) return [];\n    if (S2.pieces) return piecePanels(S2, room);\n    return autoPanels(units, kitchen, room);\n  }\n  function piecePanels(S2, room) {\n    const t = S2.kind === \"glass\" ? SPLASH.GLASS_T : SPLASH.TILE_T;\n    let zones = [];\n    try {\n      zones = openingZones(room).filter((z) => z.kind === \"window\");\n    } catch {\n      zones = [];\n    }\n    const out = [];\n    S2.pieces.forEach((q) => {\n      const w = pieceWall(q.wall), flags = [];\n      if (!w) {\n        out.push({ run: q.id, piece: q.id, wall: q.wall, axis: null, sign: 1, plane: null, lo: q.a0, hi: q.a1, y0: q.y0, t, segs: [], area: 0, flags: [\"its wall is not in this room\"] });\n        return;\n      }\n      const along2 = w.axis === \"z\" ? \"x\" : \"z\", rules = [];\n      zones.forEach((z) => {\n        const za0 = along2 === \"x\" ? z.box.x0 : z.box.z0, za1 = along2 === \"x\" ? z.box.x1 : z.box.z1;\n        const near2 = w.axis === \"z\" ? Math.abs(z.box.z0 - w.at) < 400 || Math.abs(z.box.z1 - w.at) < 400 : Math.abs(z.box.x0 - w.at) < 400 || Math.abs(z.box.x1 - w.at) < 400;\n        if (!near2 || za1 <= q.a0 + 1 || za0 >= q.a1 - 1) return;\n        const sill = z.v0 - LEG_H;\n        if (sill >= q.y1) return;\n        if (sill - q.y0 >= SPLASH.MIN_H) {\n          rules.push({ a0: za0, a1: za1, top: sill });\n          flags.push(\"stops at the window sill\");\n        } else {\n          rules.push({ a0: za0, a1: za1, top: null });\n          flags.push(\"leaves out the window's width\");\n        }\n      });\n      const segs = [];\n      cutIntervals(q.a0, q.a1, rules).forEach(([a0, a1]) => {\n        const m = (a0 + a1) / 2;\n        let tp = q.y1;\n        for (const g2 of rules) if (m > g2.a0 && m < g2.a1) {\n          if (g2.top === null) {\n            tp = null;\n            break;\n          }\n          tp = Math.min(tp, g2.top);\n        }\n        if (tp === null) return;\n        const last = segs[segs.length - 1];\n        if (last && Math.abs(last.a1 - a0) < 0.5 && Math.abs(last.top - tp) < 0.5) last.a1 = a1;\n        else segs.push({ a0, a1, top: tp });\n      });\n      const area = segs.reduce((s2, g2) => s2 + (g2.a1 - g2.a0) * (g2.top - q.y0), 0) / 1e6;\n      out.push({\n        run: q.id,\n        piece: q.id,\n        wall: q.wall,\n        axis: w.axis,\n        sign: w.sign,\n        plane: w.at,\n        lo: q.a0,\n        hi: q.a1,\n        y0: q.y0,\n        t,\n        segs,\n        area: Math.round(area * 100) / 100,\n        flags\n      });\n    });\n    return out;\n  }\n  function autoPanels(units, kitchen, room) {\n    const S2 = splashOf(kitchen);\n    const W2 = worktopOf(kitchen), K2 = Object.assign({}, kitchen || {}, { worktop: Object.assign({}, kitchen && kitchen.worktop || {}, { on: true, line: W2.line }) });\n    const runs = worktopRuns(units || [], K2).filter((r) => r.kind === \"run\");\n    const t = S2.kind === \"glass\" ? SPLASH.GLASS_T : SPLASH.TILE_T;\n    const walls = (units || []).filter((u) => u && u.family === \"wall\");\n    let zones = [];\n    try {\n      zones = openingZones(room).filter((z) => z.kind === \"window\");\n    } catch {\n      zones = [];\n    }\n    const out = [];\n    runs.forEach((r) => {\n      const mine = (units || []).filter((u) => r.units.indexOf(u.id) >= 0);\n      let onWall2 = false;\n      try {\n        onWall2 = mine.some((u) => backOnWall(u));\n      } catch {\n        onWall2 = false;\n      }\n      if (!onWall2) return;\n      const sign = Math.sign(r.frontEdge - r.back) || 1, along2 = r.axis === \"z\" ? \"x\" : \"z\", across = r.axis === \"z\" ? \"z\" : \"x\";\n      const y0 = W2.on ? r.top + r.t : r.top, flags = [];\n      let lo = r.lo, hi = r.hi;\n      [\"lo\", \"hi\"].forEach((e) => {\n        if (r.ends[e] !== \"corner-butt\") return;\n        const at = e === \"lo\" ? r.lo : r.hi;\n        const q = runs.find((o) => o !== r && o.axis !== r.axis && Math.abs(o.frontEdge - at) < 2);\n        if (!q) return;\n        const qs = Math.sign(q.frontEdge - q.back) || 1, to = q.back + qs * t;\n        if (e === \"lo\") lo = Math.min(lo, to);\n        else hi = Math.max(hi, to);\n      });\n      [\"lo\", \"hi\"].forEach((e) => {\n        if (r.ends[e] !== \"closed\") return;\n        const at = e === \"lo\" ? r.lo : r.hi;\n        const q = runs.find((o) => {\n          if (o === r || o.axis === r.axis) return false;\n          const a = Math.min(o.back, o.frontEdge) - 30, b = Math.max(o.back, o.frontEdge) + 30;\n          if (at < a || at > b) return false;\n          if (r.back < Math.min(o.lo, o.hi) - 30 || r.back > Math.max(o.lo, o.hi) + 30) return false;\n          let w = false;\n          try {\n            w = (units || []).some((u) => o.units.indexOf(u.id) >= 0 && backOnWall(u));\n          } catch {\n            w = false;\n          }\n          return w;\n        });\n        if (!q) return;\n        const qs = Math.sign(q.frontEdge - q.back) || 1, to = q.back + qs * t;\n        if (e === \"lo\" ? to < lo - 0.5 : to > hi + 0.5) {\n          if (e === \"lo\") lo = to;\n          else hi = to;\n          flags.push(\"carried into the corner to meet the other wall's splashback\");\n        }\n      });\n      const over = walls.filter((w) => {\n        const [a0, a1] = worldRange(w, 0, w.w, along2);\n        return a1 > lo + 1 && a0 < hi - 1 && Math.abs(backAt(w, across) - r.back) < 80;\n      });\n      const top = over.length ? Math.min(...over.map((w) => w.y)) : y0 + SPLASH.DEFAULT_H;\n      if (top - y0 < SPLASH.MIN_H) {\n        flags.push(\"no room between the worktop and the wall cabinets (\" + Math.round(top - y0) + \" mm)\");\n        return;\n      }\n      const rules = [];\n      (units || []).filter((u) => isOvenBase(u) && u.hood && r.units.indexOf(u.id) >= 0).forEach((u) => {\n        const L = ovenHobLayout(u, kitchen), [a0, a1] = worldRange(u, L.hood.x0, L.hood.x1, along2);\n        rules.push({ a0, a1, top: Math.max(top, (u.y || 0) + L.hood.y0), why: \"hood\" });\n      });\n      zones.forEach((z) => {\n        const za0 = along2 === \"x\" ? z.box.x0 : z.box.z0, za1 = along2 === \"x\" ? z.box.x1 : z.box.z1;\n        const near2 = across === \"z\" ? Math.abs(z.box.z0 - r.back) < 400 || Math.abs(z.box.z1 - r.back) < 400 : Math.abs(z.box.x0 - r.back) < 400 || Math.abs(z.box.x1 - r.back) < 400;\n        if (!near2 || za1 <= lo + 1 || za0 >= hi - 1) return;\n        const sill = z.v0 - LEG_H;\n        if (sill >= top) return;\n        if (sill - y0 >= SPLASH.MIN_H) {\n          rules.push({ a0: za0, a1: za1, top: sill, why: \"window\" });\n          flags.push(\"stops at the window sill (\" + Math.round(sill - y0) + \" mm high there)\");\n        } else {\n          rules.push({ a0: za0, a1: za1, top: null, why: \"window\" });\n          flags.push(\"leaves out the window's width (its sill is \" + Math.round(sill + LEG_H) + \" mm from the floor)\");\n        }\n      });\n      const segs = [];\n      cutIntervals(lo, hi, rules).forEach(([a0, a1]) => {\n        const m = (a0 + a1) / 2;\n        let tp = top;\n        for (const q of rules) if (m > q.a0 && m < q.a1) {\n          if (q.top === null) {\n            tp = null;\n            break;\n          }\n          tp = q.why === \"hood\" ? Math.max(tp, q.top) : Math.min(tp, q.top);\n        }\n        if (tp === null) return;\n        const last = segs[segs.length - 1];\n        if (last && Math.abs(last.a1 - a0) < 0.5 && Math.abs(last.top - tp) < 0.5) last.a1 = a1;\n        else segs.push({ a0, a1, top: tp });\n      });\n      if (!segs.length) return;\n      const area = segs.reduce((s, g2) => s + (g2.a1 - g2.a0) * (g2.top - y0), 0) / 1e6;\n      out.push({ run: r.id, wall: wallIdFor(r.axis, r.back, sign, (lo + hi) / 2), axis: r.axis, sign, plane: r.back, lo, hi, y0, t, segs, area: Math.round(area * 100) / 100, flags });\n    });\n    return out;\n  }\n  function wallIdFor(axis, at, sign, near2) {\n    try {\n      const L = seatWalls();\n      if (L) {\n        const w = L.find((x) => x.axis === axis && Math.abs(x.at - at) < 2 && (x.face === \"back\" || x.face === \"left\" ? 1 : -1) === sign && near2 >= x.lo - 2 && near2 <= x.hi + 2);\n        return w ? w.id : null;\n      }\n      for (const id of [\"back\", \"front\", \"left\", \"right\"]) {\n        const w = pieceWall(id);\n        if (w && w.axis === axis && Math.abs(w.at - at) < 2 && w.sign === sign) return id;\n      }\n    } catch {\n    }\n    return null;\n  }\n  function materializePieces(units, kitchen, room) {\n    const P2 = autoPanels(units, kitchen, room), out = [];\n    P2.forEach((p) => p.segs.forEach((g2) => {\n      const wall = wallIdFor(p.axis, p.plane, p.sign, (g2.a0 + g2.a1) / 2);\n      if (!wall) return;\n      out.push({ id: nextPieceId(out), wall, a0: Math.round(g2.a0), a1: Math.round(g2.a1), y0: Math.round(p.y0), y1: Math.round(g2.top) });\n    }));\n    return out;\n  }\n  function defaultPiece(units, kitchen, room, wallId, at) {\n    const w = pieceWall(wallId);\n    if (!w) return null;\n    const along2 = w.axis === \"z\" ? \"x\" : \"z\";\n    const S2 = splashOf(kitchen), W2 = worktopOf(kitchen);\n    const K2 = Object.assign({}, kitchen || {}, { worktop: Object.assign({}, kitchen && kitchen.worktop || {}, { on: true, line: W2.line }) });\n    const runs = worktopRuns(units || [], K2).filter((r) => r.kind === \"run\" && r.axis === w.axis && Math.abs(r.back - w.at) < 60);\n    const run = runs.find((r) => at >= r.lo - 1 && at <= r.hi + 1);\n    const y0 = run ? W2.on ? run.top + run.t : run.top : 720 + 38;\n    const host = run ? (units || []).find((u) => run.units.indexOf(u.id) >= 0 && (() => {\n      const [a02, a12] = worldRange(u, 0, u.w, along2);\n      return at >= a02 - 1 && at <= a12 + 1;\n    })()) : null;\n    let a0 = at - 300, a1 = at + 300, y1 = y0 + SPLASH.DEFAULT_H;\n    if (host) {\n      [a0, a1] = worldRange(host, 0, host.w, along2);\n    }\n    if (host && isOvenBase(host)) {\n      const L = ovenHobLayout(host, kitchen);\n      const zone = host.hood ? [L.hood.x0, L.hood.x1] : [L.hob.x0, L.hob.x1];\n      [a0, a1] = worldRange(host, zone[0], zone[1], along2);\n      if (host.hood) y1 = Math.max(y1, (host.y || 0) + L.hood.y0);\n    }\n    const walls = (units || []).filter((u) => u && u.family === \"wall\");\n    const over = walls.filter((u) => {\n      const [b0, b1] = worldRange(u, 0, u.w, along2);\n      return b1 > a0 + 1 && b0 < a1 - 1 && Math.abs(backAt(u, w.axis) - w.at) < 80;\n    });\n    if (over.length && !(host && isOvenBase(host) && host.hood)) y1 = Math.min(...over.map((u) => u.y));\n    if (y1 - y0 < PIECE.MIN_H) y1 = y0 + PIECE.MIN_H;\n    const pieces = S2.pieces || [];\n    return { id: nextPieceId(pieces), wall: wallId, a0: Math.round(a0), a1: Math.round(a1), y0: Math.round(y0), y1: Math.round(y1), cooker: !!(host && isOvenBase(host)) };\n  }\n  function splashText(units, kitchen, room) {\n    const S2 = splashOf(kitchen);\n    if (!S2.on) return \"\";\n    const P2 = splashPanels(units, kitchen, room);\n    if (!P2.length) return \"Splashback: \" + splashName(S2) + \" - no wall run to put it on yet.\";\n    const total = P2.reduce((s, p) => s + p.area, 0);\n    return \"Splashback (\" + splashName(S2) + \", quoted separately - not in the cut list): \" + P2.map((p) => (p.piece ? \"piece \" + p.piece + \" on the \" + p.wall + \" wall\" : \"run \" + p.run) + \" \" + Math.round(p.hi - p.lo) + \" mm long, \" + p.segs.map((g2) => Math.round(g2.top - p.y0)).filter((v, i, a) => a.indexOf(v) === i).join(\" / \") + \" mm high\" + (p.flags.length ? \" (\" + p.flags.join(\"; \") + \")\" : \"\")).join(\"; \") + \"; about \" + total.toFixed(2) + \" m2 in all. Glass toughening, cut-outs for sockets and the fixing / tiling are the supplier's and fitter's.\";\n  }\n\n  // v2/src/render/mesh/splash.js\n  var rgb3 = (hex) => {\n    const h = parseInt(String(hex).slice(1), 16);\n    return [(h >> 16 & 255) / 255, (h >> 8 & 255) / 255, (h & 255) / 255];\n  };\n  var WHITE = [1, 1, 1];\n  function frameOf2(p) {\n    const y = (q) => p.y0 + q[1];\n    if (p.axis === \"z\" && p.sign > 0) return { start: p.lo, dir: 1, p: (q) => [p.lo + q[0], y(q), p.plane + q[2]], n: (n) => [n[0], n[1], n[2]] };\n    if (p.axis === \"z\") return { start: p.hi, dir: -1, p: (q) => [p.hi - q[0], y(q), p.plane - q[2]], n: (n) => [-n[0], n[1], -n[2]] };\n    if (p.sign > 0) return { start: p.hi, dir: -1, p: (q) => [p.plane + q[2], y(q), p.hi - q[0]], n: (n) => [n[2], n[1], -n[0]] };\n    return { start: p.lo, dir: 1, p: (q) => [p.plane - q[2], y(q), p.lo + q[0]], n: (n) => [-n[2], n[1], n[0]] };\n  }\n  function sinkFor(d, wall) {\n    if (!wall || !d.wallSinks) return d;\n    if (!d.wallSinks[wall]) {\n      const s = [];\n      if (d.meta) s.meta = [];\n      d.wallSinks[wall] = s;\n    }\n    return d.wallSinks[wall];\n  }\n  function emitSplashbacks(d, units, kitchen, room) {\n    const S2 = splashOf(kitchen);\n    if (!S2.on) return [];\n    const P2 = splashPanels(units, kitchen, room);\n    const glass = S2.kind === \"glass\", col = glass ? rgb3(S2.colour) : WHITE;\n    const keep = setMatHint(glass ? MAT_CLASS.SPLASH_GLASS : MAT_CLASS.SPLASH_TILE);\n    try {\n      P2.forEach((p) => {\n        const xf = frameOf2(p);\n        const dd = sinkFor(d, p.wall);\n        p.segs.forEach((g2) => {\n          featTag(\"Splashback\");\n          const s0 = xf.dir > 0 ? g2.a0 - xf.start : xf.start - g2.a1, s1 = xf.dir > 0 ? g2.a1 - xf.start : xf.start - g2.a0;\n          emitBoxXf(dd, s0, s1, 0, g2.top - p.y0, 0, p.t, col, 0, glass ? 0 : 1, xf);\n        });\n      });\n    } finally {\n      setMatHint(keep);\n    }\n    return P2;\n  }\n\n  // v2/src/render/mesh/scene.js\n  var WALL_GREY = [0.885, 0.885, 0.875];\n  var FLOOR_TONE = [0.8, 0.795, 0.785];\n  function sceneFrame(units) {\n    if (!units || !units.length) return { cx: 0, cy: 285, cz: 280, r: FIT_R.assembled };\n    const d = [];\n    units.forEach(function(u) {\n      emitUnit(d, u, false);\n    });\n    let x0 = 1e9, y0 = 1e9, z0 = 1e9, x1 = -1e9, y1 = -1e9, z1 = -1e9, i;\n    for (i = 0; i + 11 < d.length; i += 12) {\n      if (d[i] < x0) x0 = d[i];\n      if (d[i] > x1) x1 = d[i];\n      if (d[i + 1] < y0) y0 = d[i + 1];\n      if (d[i + 1] > y1) y1 = d[i + 1];\n      if (d[i + 2] < z0) z0 = d[i + 2];\n      if (d[i + 2] > z1) z1 = d[i + 2];\n    }\n    if (x0 > x1) {\n      x0 = 1e9;\n      x1 = -1e9;\n      z0 = 1e9;\n      z1 = -1e9;\n      y0 = -LEG_H;\n      y1 = 0;\n      for (let k = 0; k < units.length; k++) {\n        const u = units[k];\n        const ux = u.x || 0, uz = u.z || 0;\n        x0 = Math.min(x0, ux);\n        x1 = Math.max(x1, ux + u.w);\n        z0 = Math.min(z0, uz);\n        z1 = Math.max(z1, uz + u.d);\n        y1 = Math.max(y1, (u.y || 0) + u.h);\n      }\n    }\n    try {\n      const S2 = UB_SCENE;\n      if (S2 && S2.units === units && S2.kitchen && S2.kitchen.splash && S2.kitchen.splash.on) {\n        for (const p of splashPanels(units, S2.kitchen, S2.room || null)) {\n          const top = Math.max(p.y0, ...(p.segs || []).map((g2) => g2.top)), n0 = p.plane, n1 = p.plane + p.sign * (p.t || 0);\n          if (p.axis === \"z\") {\n            x0 = Math.min(x0, p.lo);\n            x1 = Math.max(x1, p.hi);\n            z0 = Math.min(z0, n0, n1);\n            z1 = Math.max(z1, n0, n1);\n          } else {\n            z0 = Math.min(z0, p.lo);\n            z1 = Math.max(z1, p.hi);\n            x0 = Math.min(x0, n0, n1);\n            x1 = Math.max(x1, n0, n1);\n          }\n          y0 = Math.min(y0, p.y0);\n          y1 = Math.max(y1, top);\n        }\n      }\n    } catch {\n    }\n    try {\n      const S2 = UB_SCENE;\n      if (S2 && S2.units === units) for (const u of units) {\n        if (!isOvenBase(u) || !u.hood) continue;\n        const L = ovenHobLayout(u, S2.kitchen);\n        if (!L || !L.hood) continue;\n        const H2 = L.hood, xf = unitXf(u), uy = u.y || 0;\n        for (const x of [H2.x0, H2.x1]) for (const z of [H2.z0, H2.z1]) {\n          const p = xf.p([x, 0, z]);\n          x0 = Math.min(x0, p[0]);\n          x1 = Math.max(x1, p[0]);\n          z0 = Math.min(z0, p[2]);\n          z1 = Math.max(z1, p[2]);\n        }\n        y0 = Math.min(y0, uy + H2.y0);\n        y1 = Math.max(y1, uy + H2.y1);\n      }\n    } catch {\n    }\n    const uhx = (x1 - x0) / 2, uhy = (y1 - y0) / 2, uhz = (z1 - z0) / 2;\n    const ucx = (x0 + x1) / 2, ucy = (y0 + y1) / 2, ucz = (z0 + z1) / 2;\n    if (roomOn()) {\n      const sz = roomSize();\n      x0 = Math.min(x0, -20);\n      x1 = Math.max(x1, sz.width + 20);\n      z0 = Math.min(z0, -20);\n      z1 = Math.max(z1, sz.depth + 20);\n      y0 = Math.min(y0, -LEG_H);\n      y1 = Math.max(y1, ROOM.wallTop);\n    }\n    const hx = (x1 - x0) / 2, hy = (y1 - y0) / 2, hz = (z1 - z0) / 2;\n    const ur = Math.max(FIT_R.assembled, Math.sqrt(uhx * uhx + uhy * uhy + uhz * uhz) * FIT_PAD);\n    return {\n      cx: (x0 + x1) / 2,\n      cy: (y0 + y1) / 2,\n      cz: (z0 + z1) / 2,\n      ucx,\n      ucy,\n      ucz,\n      ur,\n      hx,\n      hy,\n      hz,\n      // AABB half-extents (framing)\n      uhx,\n      uhy,\n      uhz,\n      // cabinets only (close-zoom distance clamp)\n      r: Math.max(FIT_R.assembled, Math.sqrt(hx * hx + hy * hy + hz * hz) * FIT_PAD)\n    };\n  }\n  var SHADOW_STEPS = (function() {\n    const out = [], n = 8, reach = 58;\n    for (let i = 0; i < n; i++) {\n      const t = i / (n - 1);\n      out.push({\n        grow: Math.round(reach * (1 - t) * (1 - t) * 100) / 100,\n        k: Math.round((0.965 - 0.345 * t * t) * 1e3) / 1e3\n      });\n    }\n    return out;\n  })();\n  function emitContactShadows(d, units) {\n    const FLOOR = [0.8, 0.795, 0.785];\n    const yTop = -LEG_H;\n    const keepHint = setMatHint(MAT_CLASS.CONTACT);\n    try {\n      (units || []).forEach(function(u) {\n        if (!u || u.family === \"wall\") return;\n        if (explodeMM(u) > 0) return;\n        footBoxes(u).forEach(function(b) {\n          SHADOW_STEPS.forEach(function(s, i) {\n            const col = [FLOOR[0] * s.k, FLOOR[1] * s.k, FLOOR[2] * s.k];\n            const y = yTop + 0.2 + i * 0.12;\n            emitBox(\n              d,\n              b.x0 - s.grow,\n              b.x1 + s.grow,\n              y,\n              y + 0.05,\n              b.z0 - s.grow,\n              b.z1 + s.grow,\n              col,\n              0,\n              0,\n              null,\n              [0, 1, 0]\n            );\n          });\n        });\n      });\n    } finally {\n      setMatHint(keepHint);\n    }\n  }\n  var REVEAL_DARK = [0.085, 0.085, 0.08];\n  var XRAY = false;\n  var XRAY_DEFER = [];\n  var XRAY_SPLIT = -1;\n  function xrayOn(on) {\n    XRAY = !!on;\n  }\n  function xrayActive() {\n    return XRAY;\n  }\n  function xraySplit() {\n    return XRAY_SPLIT;\n  }\n  function deferFront(fn) {\n    XRAY_DEFER.push(fn);\n  }\n  function emitFrontPanel(d, x0, x1, y0, y1, z0, z1, col, tex, xf) {\n    if (XRAY) {\n      deferFront(function() {\n        emitFrontBoxXf(d, x0, x1, y0, y1, z0, z1, col, 1, tex, xf);\n      });\n      return;\n    }\n    emitFrontBoxXf(d, x0, x1, y0, y1, z0, z1, col, 1, tex, xf);\n  }\n  function emitFrontSlab(d, b, col, tex, xf, onlyN) {\n    if (XRAY) {\n      deferFront(function() {\n        emitFrontBoxXf(d, b.x0, b.x1, b.y0, b.y1, b.z0, b.z1, col, 1, tex, xf, onlyN);\n      });\n      return;\n    }\n    emitFrontBoxXf(d, b.x0, b.x1, b.y0, b.y1, b.z0, b.z1, col, 1, tex, xf, onlyN);\n  }\n  function emitFrontProfile(d, b, prof, col, tex, xf) {\n    if (XRAY) {\n      deferFront(function() {\n        emitFrontProfileXf(d, b, prof, col, tex, xf);\n      });\n      return;\n    }\n    emitFrontProfileXf(d, b, prof, col, tex, xf);\n  }\n  var GAP_DARK = [0.1, 0.1, 0.1];\n  var GAP_MAX = 10;\n  var FRONTS = [];\n  function noteFront(u, x0, x1, y0, y1, z0, z1, closed2) {\n    const xf = unitXf(u);\n    const p = [];\n    let i, j, k;\n    for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) for (k = 0; k < 2; k++)\n      p.push(xf.p([i ? x1 : x0, j ? y1 : y0, k ? z1 : z0]));\n    const n = xf.n([0, 0, 1]);\n    const ax = Math.abs(n[0]) > 0.5 ? 0 : Math.abs(n[1]) > 0.5 ? 1 : 2;\n    const box3 = {\n      x0: Math.min.apply(null, p.map(function(q) {\n        return q[0];\n      })),\n      x1: Math.max.apply(null, p.map(function(q) {\n        return q[0];\n      })),\n      y0: Math.min.apply(null, p.map(function(q) {\n        return q[1];\n      })),\n      y1: Math.max.apply(null, p.map(function(q) {\n        return q[1];\n      })),\n      z0: Math.min.apply(null, p.map(function(q) {\n        return q[2];\n      })),\n      z1: Math.max.apply(null, p.map(function(q) {\n        return q[2];\n      }))\n    };\n    const sign = n[ax] > 0 ? 1 : -1;\n    const lo = [box3.x0, box3.y0, box3.z0][ax], hi = [box3.x1, box3.y1, box3.z1][ax];\n    box3.axis = ax;\n    box3.sign = sign;\n    box3.face = sign > 0 ? hi : lo;\n    box3.back = sign > 0 ? lo : hi;\n    box3.closed = !!closed2;\n    FRONTS.push(box3);\n  }\n  function emitSceneGaps(d) {\n    const A = [\"x\", \"y\", \"z\"];\n    const groups = {};\n    FRONTS.forEach(function(fr) {\n      if (!fr.closed) return;\n      const key = fr.axis + \":\" + fr.sign + \":\" + Math.round(fr.face * 10);\n      (groups[key] = groups[key] || []).push(fr);\n    });\n    Object.keys(groups).forEach(function(key) {\n      const list = groups[key];\n      const ax = list[0].axis;\n      const tang = [0, 1, 2].filter(function(a) {\n        return a !== ax;\n      });\n      for (let i = 0; i < list.length; i++) for (let j = i + 1; j < list.length; j++) {\n        tang.forEach(function(ga) {\n          const oa = tang.filter(function(a2) {\n            return a2 !== ga;\n          })[0];\n          const a = list[i], b = list[j];\n          const lo = a[A[ga] + \"0\"] <= b[A[ga] + \"0\"] ? a : b;\n          const hi = lo === a ? b : a;\n          const g0 = lo[A[ga] + \"1\"], g1 = hi[A[ga] + \"0\"];\n          if (!(g1 > g0 && g1 - g0 <= GAP_MAX)) return;\n          const c0 = Math.max(lo[A[oa] + \"0\"], hi[A[oa] + \"0\"]);\n          const c1 = Math.min(lo[A[oa] + \"1\"], hi[A[oa] + \"1\"]);\n          if (!(c1 - c0 > 1)) return;\n          const back = a.sign > 0 ? Math.max(a.back, b.back) : Math.min(a.back, b.back);\n          const face2 = a.face;\n          const p0 = a.sign > 0 ? back + 0.02 : face2 + 0.15;\n          const p1 = a.sign > 0 ? face2 - 0.15 : back - 0.02;\n          if (!(p1 > p0)) return;\n          const inset = Math.min(0.02, (g1 - g0) / 10);\n          const q0 = [0, 0, 0], q1 = [0, 0, 0];\n          q0[ga] = g0 + inset;\n          q1[ga] = g1 - inset;\n          q0[oa] = c0;\n          q1[oa] = c1;\n          q0[ax] = p0;\n          q1[ax] = p1;\n          emitBox(d, q0[0], q1[0], q0[1], q1[1], q0[2], q1[2], GAP_DARK, 0, 0, null);\n        });\n      }\n    });\n  }\n  var SEAM_HALF = 1;\n  var SEAM_BACK = 8;\n  function emitContactSeams(d, units) {\n    if (!units || units.length < 2) return;\n    const seen = {};\n    units.forEach(function(u) {\n      if (typeof explodeMM === \"function\" && explodeMM(u) > 0) return;\n      sideContacts(units, u).forEach(function(c) {\n        const key = c.axis + \":\" + Math.round(c.at * 10) + \":\" + Math.round(c.lo) + \":\" + Math.round(c.hi) + \":\" + Math.round(c.y0) + \":\" + Math.round(c.y1);\n        if (seen[key]) return;\n        seen[key] = 1;\n        const y0 = Math.max(c.y0, 0);\n        if (!(c.hi - c.lo > 1) || !(c.y1 - y0 > 1)) return;\n        const mid = (c.lo + c.hi) / 2;\n        const dir = c.front >= mid ? 1 : -1;\n        const f12 = c.front - dir * 0.15;\n        const f0 = c.front - dir * SEAM_BACK;\n        const a0 = Math.min(f0, f12), a1 = Math.max(f0, f12);\n        if (!(a1 - a0 > 0.05)) return;\n        if (c.axis === \"x\") {\n          emitBox(\n            d,\n            c.at - SEAM_HALF,\n            c.at + SEAM_HALF,\n            y0,\n            c.y1,\n            a0,\n            a1,\n            GAP_DARK,\n            0,\n            0,\n            null\n          );\n        } else {\n          emitBox(\n            d,\n            a0,\n            a1,\n            y0,\n            c.y1,\n            c.at - SEAM_HALF,\n            c.at + SEAM_HALF,\n            GAP_DARK,\n            0,\n            0,\n            null\n          );\n        }\n      });\n    });\n  }\n  var MESH_META = null;\n  function buildMeshData(input) {\n    const scene = input && input.units ? input : { units: [input], selectedId: null };\n    const d = [];\n    if (MESH_META) d.meta = MESH_META;\n    FRONTS = [];\n    if (scene.units.length) emitBackdrop(d, scene.units);\n    scene.units.forEach(function(u) {\n      emitUnit(d, u, u.id === scene.selectedId);\n    });\n    emitContactShadows(d, scene.units);\n    emitSceneGaps(d);\n    emitContactSeams(d, scene.units);\n    scene.units.forEach(function(u) {\n      emitFinishing(d, u);\n    });\n    emitPlinthRuns(d, scene.units);\n    emitWorktops(d, scene.units, scene.kitchen);\n    emitHobsAndHoods(d, scene.units, scene.kitchen, scene.room);\n    emitSplashbacks(d, scene.units, scene.kitchen, scene.room);\n    emitCornerTargetPad(d, scene);\n    const partsOn = !!scene.partsMode && !scene.explode;\n    const selU = scene.units.filter(function(v) {\n      return v.id === scene.selectedId;\n    })[0];\n    if (!partsOn)\n      scene.units.forEach(function(u) {\n        if (u.id === scene.selectedId) emitSelWire(d, u);\n      });\n    else if (selU) {\n      const zk = scene.partMarkScale || 1;\n      const hv = scene.hoverPart && partById(selU, scene.hoverPart);\n      const sp = scene.selPart && partById(selU, scene.selPart);\n      if (hv && (!sp || hv.pid !== sp.pid)) (hv.corner ? partsById(selU, hv.pid) : [hv]).forEach(function(q) {\n        emitPartMark(d, q.box, PART_HOVER, zk);\n      });\n      if (sp) emitPartMark(d, sp.box, PART_SEL, zk);\n      if (sp && sp.corner) partsById(selU, sp.pid).forEach(function(q) {\n        if (q !== sp && q.local.x0 !== sp.local.x0) emitPartMark(d, q.box, PART_SEL, zk);\n      });\n      if (scene.placeGhost) emitPlaceGhost(d, scene.placeGhost, zk);\n    }\n    if ((scene.alignView || scene.alignTemp) && !scene.units.some(function(v) {\n      return explodeMM(v) > 0;\n    }))\n      emitUpperLowerGuides(d, scene.units, scene.snap !== false);\n    XRAY_SPLIT = -1;\n    if (XRAY && XRAY_DEFER.length) {\n      XRAY_SPLIT = d.length / 12;\n      const q = XRAY_DEFER;\n      XRAY_DEFER = [];\n      const keep2 = XRAY;\n      XRAY = false;\n      try {\n        q.forEach(function(fn) {\n          fn();\n        });\n      } finally {\n        XRAY = keep2;\n      }\n    } else {\n      XRAY_DEFER = [];\n    }\n    if (scene.cues) emitAlignGuides(\n      d,\n      scene.cues,\n      scene.units.filter(function(v) {\n        return v.id === scene.selectedId;\n      })[0]\n    );\n    return d;\n  }\n  function emitStatedRoom(d, units, roomSel, roomDrag, roomArmed) {\n    emitRoomShell(\n      d,\n      roomSize(),\n      UB_SCENE && UB_SCENE.room,\n      WALL_GREY,\n      FLOOR_TONE,\n      roomSel !== void 0 ? roomSel : UB_SCENE && UB_SCENE.roomSel || null,\n      roomDrag !== void 0 ? roomDrag : UB_SCENE && UB_SCENE.roomDrag || null,\n      roomArmed !== void 0 ? roomArmed : UB_SCENE && UB_SCENE.roomArmed || null,\n      UB_SCENE && UB_SCENE.roomObjSel || null\n    );\n  }\n  function emitBackdrop(d, units, roomSel, roomDrag, roomArmed) {\n    if (roomOn()) return emitStatedRoom(d, units, roomSel, roomDrag, roomArmed);\n    let x0 = ROOM.minX, x1 = ROOM.maxX, top = 0;\n    for (let k = 0; k < units.length; k++) {\n      const f = foot(units[k]);\n      x0 = Math.min(x0, f.x0 - 500);\n      x1 = Math.max(x1, f.x1 + 500);\n      top = Math.max(top, (units[k].y || 0) + units[k].h);\n    }\n    const wy1 = Math.max(top + 400, ROOM.wallTop);\n    const GREY = WALL_GREY;\n    const rw0 = retWall(units);\n    let iX0 = x0, iX1 = x1, iZ1 = ROOM.wallZ + 1800;\n    for (let k = 0; k < units.length; k++) {\n      const f = foot(units[k]);\n      iZ1 = Math.max(iZ1, f.z1 + 500);\n    }\n    if (rw0) {\n      if (rw0.axis === \"x\") {\n        if (rw0.dir > 0) iX1 = Math.min(iX1, rw0.at);\n        else iX0 = Math.max(iX0, rw0.at);\n      } else {\n        if (rw0.dir > 0) iZ1 = Math.min(iZ1, rw0.at);\n      }\n    }\n    const wx0 = iX0, wx1 = iX1;\n    emitBox(d, wx0, wx1, -LEG_H, wy1, ROOM.wallZ - 14, ROOM.wallZ, GREY, 0, 0, null, [0, 0, 1]);\n    emitBox(d, iX0, iX1, -LEG_H - 16, -LEG_H, ROOM.wallZ - 14, iZ1, FLOOR_TONE, 0, 0);\n    const rw = retWall(units);\n    if (rw) {\n      if (rw.axis === \"x\") {\n        const xa = rw.dir > 0 ? rw.at : rw.at - 14, xb = rw.dir > 0 ? rw.at + 14 : rw.at;\n        emitBox(d, xa, xb, -LEG_H, wy1, ROOM.wallZ - 14, iZ1, GREY, 0, 0, null, [-rw.dir, 0, 0]);\n      } else {\n        const za = rw.dir > 0 ? rw.at : rw.at - 14, zb = rw.dir > 0 ? rw.at + 14 : rw.at;\n        emitBox(d, iX0, iX1, -LEG_H, wy1, za, zb, GREY, 0, 0, null, [0, 0, -rw.dir]);\n      }\n    }\n  }\n  function emitUnitLayer(d, u) {\n    const keepF = FRONTS, keepX = XRAY;\n    FRONTS = [];\n    XRAY = false;\n    try {\n      emitUnit(d, u, false);\n      emitFinishing(d, u);\n      return FRONTS;\n    } finally {\n      FRONTS = keepF;\n      XRAY = keepX;\n    }\n  }\n  function emitSceneLayer(d, scene, fronts) {\n    if (scene.units.length) emitBackdrop(d, scene.units, scene.roomSel, scene.roomDrag, scene.roomArmed);\n    const keepF = FRONTS;\n    FRONTS = fronts || [];\n    try {\n      emitSceneGaps(d);\n    } finally {\n      FRONTS = keepF;\n    }\n    emitContactSeams(d, scene.units);\n    emitPlinthRuns(d, scene.units);\n    emitWorktops(d, scene.units, scene.kitchen);\n    emitHobsAndHoods(d, scene.units, scene.kitchen, scene.room);\n    emitSplashbacks(d, scene.units, scene.kitchen, scene.room);\n    emitCornerTargetPad(d, scene);\n  }\n  function emitOverlayLayer(d, scene) {\n    const partsOn = !!scene.partsMode && !scene.explode;\n    const selU = scene.units.filter(function(v) {\n      return v.id === scene.selectedId;\n    })[0];\n    if (!partsOn) {\n      for (let k = 0; k < scene.units.length; k++)\n        if (scene.units[k].id === scene.selectedId) emitSelWire(d, scene.units[k]);\n    } else if (selU) {\n      const zk = scene.partMarkScale || 1;\n      const hv = scene.hoverPart && partById(selU, scene.hoverPart);\n      const sp = scene.selPart && partById(selU, scene.selPart);\n      if (hv && (!sp || hv.pid !== sp.pid)) (hv.corner ? partsById(selU, hv.pid) : [hv]).forEach(function(q) {\n        emitPartMark(d, q.box, PART_HOVER, zk);\n      });\n      if (sp) emitPartMark(d, sp.box, PART_SEL, zk);\n      if (sp && sp.corner) partsById(selU, sp.pid).forEach(function(q) {\n        if (q !== sp && q.local.x0 !== sp.local.x0) emitPartMark(d, q.box, PART_SEL, zk);\n      });\n      if (scene.placeGhost) emitPlaceGhost(d, scene.placeGhost, zk);\n    }\n    if (scene.dropPreview && scene.dropPreview.unit) {\n      emitUnitLayer(d, scene.dropPreview.unit);\n      if (!scene.dropPreview.ok) {\n        const pu = scene.dropPreview.unit, F = foot(pu), y0 = pu.family === \"wall\" ? pu.y || 0 : -LEG_H, y1 = (pu.y || 0) + pu.h;\n        emitPlaceGhost(d, { ok: false, box: { x0: F.x0, x1: F.x1, y0, y1, z0: F.z0, z1: F.z1 } }, 1);\n      }\n    }\n    if ((scene.alignView || scene.alignTemp) && !scene.units.some(function(v) {\n      return explodeMM(v) > 0;\n    }))\n      emitUpperLowerGuides(d, scene.units, scene.snap !== false);\n    if (scene.cues) emitAlignGuides(d, scene.cues, selU);\n  }\n\n  // v2/src/render/legacy-shaders.js\n  var VS = [\n    \"attribute vec3 aPos; attribute vec3 aNrm; attribute vec3 aCol;\",\n    \"attribute vec2 aUV;  attribute float aTex;\",\n    \"uniform mat4 uMVP;\",\n    \"varying vec3 vNrm; varying vec3 vCol; varying vec2 vUV; varying float vTex;\",\n    \"varying vec3 vWorld;\",\n    \"void main(){ vNrm = aNrm; vCol = aCol; vUV = aUV; vTex = aTex;\",\n    \"  vWorld = aPos;\",\n    \"  gl_Position = uMVP * vec4(aPos,1.0); }\"\n  ].join(\"\\n\");\n  var FS = [\n    \"precision mediump float;\",\n    \"varying vec3 vNrm; varying vec3 vCol; varying vec2 vUV; varying float vTex;\",\n    \"varying vec3 vWorld;\",\n    \"uniform sampler2D uTex; uniform float uTexReady; uniform vec3 uEye;\",\n    \"uniform float uAlpha;\",\n    \"void main(){\",\n    \"  vec3 n = normalize(vNrm);\",\n    \"  vec3 V = normalize(uEye - vWorld);\",\n    \"  float hemi = 0.5 + 0.5 * n.y;\",\n    \"  float amb = mix(0.50, 0.76, hemi);\",\n    \"  vec3 L1 = normalize(vec3(-0.30, 0.72, 0.85));\",\n    \"  vec3 L2 = normalize(vec3( 0.80, 0.30, -0.25));\",\n    \"  float d1 = max(dot(n, L1), 0.0);\",\n    \"  float d2 = max(dot(n, L2), 0.0);\",\n    \"  float lit = amb + 0.40 * d1 + 0.08 * d2;\",\n    \"  float fres = pow(1.0 - max(dot(n, V), 0.0), 3.0);\",\n    \"  lit *= (1.0 - 0.16 * fres);\",\n    \"  vec3 H = normalize(L1 + V);\",\n    \"  float spec = pow(max(dot(n, H), 0.0), 42.0) * 0.15;\",\n    \"  vec3 base = mix(vCol, texture2D(uTex, vUV).rgb, vTex * uTexReady);\",\n    /* WARM NEUTRAL WHITE, NOT FLAT GREY. The three light terms now carry a\n       colour as well as a weight, exactly as a studio rig does: a warm key,\n       a cool sky/floor ambient and a cool fill. The LUMINANCE weights are\n       untouched, so every figure room44 pins stays where it was - what\n       changes is that a lit white face leans very slightly warm and a shaded\n       one very slightly cool, which is what reads as \"white\" to the eye\n       instead of the dead neutral grey it had before. Taken from the\n       reference rig (sun 0xfff6ea, hemisphere ground 0x9aa3ad). */\n    \"  vec3 SKY  = vec3(1.000, 0.995, 0.980);\",\n    \"  vec3 GRND = vec3(0.880, 0.905, 0.950);\",\n    \"  vec3 KEY  = vec3(1.000, 0.972, 0.930);\",\n    \"  vec3 FILL = vec3(0.930, 0.955, 1.000);\",\n    \"  vec3 light = mix(GRND, SKY, hemi) * amb\",\n    \"             + KEY  * (0.40 * d1)\",\n    \"             + FILL * (0.08 * d2);\",\n    \"  light *= (1.0 - 0.16 * fres);\",\n    \"  float cap = min(lit, 1.02) / max(lit, 0.0001);\",\n    \"  gl_FragColor = vec4(base * light * cap + spec, uAlpha); }\"\n  ].join(\"\\n\");\n\n  // v2/src/render/mesh/features.js\n  function unitFeatures(u, production = null) {\n    featCapture(true);\n    try {\n      emitUnitLayer([], production ? { ...u, _productionHardware: true } : u);\n    } catch (e) {\n      featCapture(false);\n      throw e;\n    }\n    const f = featTaken() || { boxes: [], pts: [] };\n    if (production) {\n      const seen = /* @__PURE__ */ new Set();\n      for (const item of production.filter((p) => p.unitId === u.id)) {\n        const p = item.anchor || item.pos, key = p.join(\",\") + \":\" + item.label;\n        if (seen.has(key)) continue;\n        seen.add(key);\n        f.pts.push({ p, kind: item.label + \" centre\", part: item.label, rank: 0.8 });\n      }\n    }\n    return f;\n  }\n  function plinthFeatures(units) {\n    const runs = plinthRuns(units), out = [];\n    runs.forEach(function(r) {\n      featCapture(true);\n      try {\n        emitPlinthRuns([], [], [r]);\n      } catch (e) {\n        featCapture(false);\n        throw e;\n      }\n      const f = featTaken() || { boxes: [], pts: [] };\n      out.push({ unitId: r.units[0], boxes: f.boxes });\n    });\n    return out;\n  }\n\n  // v2/src/render/camera.js\n  function mMul(a, b) {\n    const o = new Array(16);\n    for (let r = 0; r < 4; r++) for (let c = 0; c < 4; c++) {\n      o[r * 4 + c] = a[r * 4] * b[c] + a[r * 4 + 1] * b[4 + c] + a[r * 4 + 2] * b[8 + c] + a[r * 4 + 3] * b[12 + c];\n    }\n    return o;\n  }\n  function mRotY(t) {\n    const c = Math.cos(t), s = Math.sin(t);\n    return [c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1];\n  }\n  function mRotX(t) {\n    const c = Math.cos(t), s = Math.sin(t);\n    return [1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1];\n  }\n  function mTrans(x, y, z) {\n    return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1];\n  }\n  function mPersp(f, a, n, fa) {\n    const t = 1 / Math.tan(f / 2);\n    return [t / a, 0, 0, 0, 0, t, 0, 0, 0, 0, (fa + n) / (n - fa), -1, 0, 0, 2 * fa * n / (n - fa), 0];\n  }\n  function rotMat(yaw, pitch) {\n    return mMul(mRotY(yaw), mRotX(pitch));\n  }\n  function applyRT(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[4] * v[0] + m[5] * v[1] + m[6] * v[2],\n      m[8] * v[0] + m[9] * v[1] + m[10] * v[2]\n    ];\n  }\n  function unitAABB(u) {\n    const yBottom = u.family === \"wall\" ? u.y || 0 : -LEG_H;\n    const yTop = (u.y || 0) + u.h;\n    const f = foot(u);\n    return { x0: f.x0, x1: f.x1, y0: yBottom, y1: yTop, z0: f.z0, z1: f.z1 };\n  }\n  function selOf(view, units) {\n    for (let i = 0; i < units.length; i++) if (units[i].id === view.selectedId) return units[i];\n    return units[0];\n  }\n  function computeCamera(view, units, cw, ch, frameOf3) {\n    cw = cw || 600;\n    ch = ch || 440;\n    const F = view.frame || (frameOf3 ? frameOf3(units) : null);\n    if (!F) return null;\n    let cx = F.cx, cy = F.cy, cz = F.cz;\n    const aspect = cw / ch;\n    const insetTop = Math.max(0, Math.min(ch * 0.4, Number(view.insetTop) || 0));\n    const insetBottom = Math.max(0, Math.min(ch * 0.4, Number(view.insetBottom) || 0));\n    const ndcOffY = insetTop > 0 || insetBottom > 0 ? (insetBottom - insetTop) / ch : 0;\n    const tanV = Math.tan(FOVY / 2);\n    const halfTop = Math.min(Math.atan(tanV * (ch - insetTop) / ch), Math.atan(tanV * aspect));\n    const half = halfTop;\n    const viewScale = insetBottom > 0 ? (ch - insetTop - insetBottom) / (ch - insetTop) : 1;\n    let FIT = F.r;\n    const u0 = selOf(view, units);\n    const zNow = clampZoom(view.zoom);\n    if (zNow < 1) {\n      const tRaw = Math.max(0, Math.min(1, (1 - zNow) / (1 - ZOOM_EASE_MIN)));\n      const t = tRaw * tRaw;\n      let rClose = F.ur || F.r;\n      let tx = F.ucx != null ? F.ucx : cx, ty = F.ucy != null ? F.ucy : cy, tz = F.ucz != null ? F.ucz : cz;\n      if (u0) {\n        const fb0 = foot(u0);\n        tx = (fb0.x0 + fb0.x1) / 2;\n        ty = (u0.y || 0) + u0.h / 2;\n        tz = (fb0.z0 + fb0.z1) / 2;\n        rClose = Math.max(\n          FIT_R.assembled * 0.35,\n          Math.hypot((fb0.x1 - fb0.x0) / 2, u0.h / 2, (fb0.z1 - fb0.z0) / 2) * FIT_PAD\n        );\n      }\n      FIT = F.r + (rClose - F.r) * t;\n      cx = cx + (tx - cx) * t;\n      cy = cy + (ty - cy) * t;\n      cz = cz + (tz - cz) * t;\n    }\n    if (view.hingeZoom && u0 && u0.door) {\n      FIT = HINGE_ZOOM_FIT;\n      if (Array.isArray(view.productionHingeTarget) && view.productionHingeTarget.length === 3 && view.productionHingeTarget.every(Number.isFinite)) {\n        [cx, cy, cz] = view.productionHingeTarget;\n      } else {\n        const gz = hingePoints(\n          u0.w,\n          u0.h,\n          u0.d,\n          u0.h - HINGE.yInset,\n          doorTransform(u0.w, u0.d, u0.doorOpen ? DOOR_OPEN_DEG * Math.PI / 180 : 0),\n          0,\n          0,\n          unitXf(u0)\n        );\n        cx = (gz.A[0] + gz.C[0]) / 2;\n        cy = gz.A[1];\n        cz = (gz.A[2] + gz.C[2]) / 2;\n      }\n    }\n    const PV = view.pivot && Array.isArray(view.pivot.p) && view.pivot.p.every(Number.isFinite) && !(view.hingeZoom && u0 && u0.door) ? view.pivot : null;\n    if (PV) {\n      FIT = F.r;\n      cx = PV.p[0];\n      cy = PV.p[1];\n      cz = PV.p[2];\n    }\n    const perZoom = PV && PV.k > 0 ? PV.k : FIT / Math.sin(half);\n    let dist2 = perZoom * (PV ? clampPivotZoom(view.zoom) : clampZoom(view.zoom));\n    const rot = rotMat(view.yaw, clampPitch(view.pitch));\n    let atMin = false, legacyDist = null, pivotScale = 1, pivotBlock = null, pivotMin = null, pivotSight = true;\n    const pr = applyRT(rot, [view.panX || 0, view.panY || 0, 0]);\n    cx += pr[0];\n    cy += pr[1];\n    cz += pr[2];\n    if (PV) {\n      const r = pivotClamp(PV.p, rot, view.panX || 0, view.panY || 0, dist2, nearBoxes(units), LAST_LEN.has(PV) ? LAST_LEN.get(PV) : PV.len > 0 ? PV.len : void 0);\n      if (Math.abs(r.scale - 1) > 1e-9) {\n        const pr2 = applyRT(rot, [(view.panX || 0) * (r.scale - 1), (view.panY || 0) * (r.scale - 1), 0]);\n        cx += pr2[0];\n        cy += pr2[1];\n        cz += pr2[2];\n        dist2 *= r.scale;\n      }\n      pivotScale = r.scale;\n      pivotBlock = r.block;\n      pivotMin = r.min;\n      atMin = r.atMin;\n      {\n        const e0 = applyRT(rot, [(view.panX || 0) * r.scale, (view.panY || 0) * r.scale, dist2]);\n        LAST_LEN.set(PV, Math.hypot(e0[0], e0[1], e0[2]));\n      }\n      if (PV.capD > 0) legacyDist = Math.max(dist2, PV.capD);\n      const e = applyRT(rot, [(view.panX || 0) * r.scale, (view.panY || 0) * r.scale, dist2]), L = Math.hypot(e[0], e[1], e[2]);\n      pivotSight = L > 1e-6 ? !boardBefore(PV.p, [e[0] / L, e[1] / L, e[2] / L], L, nearBoxes(units)) : true;\n    }\n    if (!PV && !(view.hingeZoom && u0 && u0.door)) {\n      const vd = applyRT(rot, [0, 0, 1]);\n      const boxes2 = nearBoxes(units);\n      let fl = clearanceDist([cx, cy, cz], vd, dist2, boxes2, NEAR_GAP, { passMin: 0, islandOnly: true, prevT: view.frame && typeof view.frame === \"object\" ? LAST_LEN.get(view.frame) : void 0 });\n      const old = legacyFloor(view, F, FIT, u0, zNow, vd);\n      legacyDist = Math.max(dist2, old);\n      if (!(Math.abs(view.panX || 0) > 1e-6 || Math.abs(view.panY || 0) > 1e-6)) {\n        const surf = clearanceDist([cx, cy, cz], vd, 1e-6, boxes2, 0);\n        fl = Math.max(fl, surf + Math.max(0, old - surf) / CENTRE_GAIN);\n      }\n      if (fl > dist2) {\n        dist2 = fl;\n        atMin = true;\n      } else if (fl < dist2) dist2 = fl;\n      if (view.frame && typeof view.frame === \"object\") LAST_LEN.set(view.frame, dist2);\n      if (clampZoom(view.zoom) <= ZOOM.min + 1e-9) atMin = true;\n    }\n    if (view.camHold) {\n      cx = view.camHold.cx;\n      cy = view.camHold.cy;\n      cz = view.camHold.cz;\n      dist2 = view.camHold.dist;\n      atMin = !!view.camHold.atMin;\n    }\n    let floorLift = 0;\n    {\n      const vdf = applyRT(rot, [0, 0, 1]);\n      const eyeY = cy + vdf[1] * dist2, minY = floorY() + FLOOR_EYE_GAP;\n      if (Number.isFinite(eyeY) && eyeY < minY) {\n        floorLift = minY - eyeY;\n        cy += floorLift;\n      }\n      if (floorLift > 0 && !view.camHold && !(view.hingeZoom && u0 && u0.door)) {\n        const fl = clearanceDist([cx, cy, cz], vdf, dist2, nearBoxes(units), NEAR_GAP);\n        if (fl > dist2) {\n          dist2 = fl;\n          atMin = true;\n        }\n      }\n    }\n    const mv = mMul(mMul(mTrans(-cx, -cy, -cz), rot), mTrans(0, 0, -dist2));\n    const sceneR = Math.max(FIT, 200);\n    let near2 = Math.max(dist2 - sceneR * 1.8, dist2 * 0.04, 8);\n    let far = dist2 + sceneR * 3 + 4e3;\n    const vdc = applyRT(rot, [0, 0, 1]);\n    const eye = [cx + vdc[0] * dist2, cy + vdc[1] * dist2, cz + vdc[2] * dist2];\n    let lo = Infinity, hi = -Infinity;\n    const boxes = [];\n    for (let i = 0; i < units.length; i++) boxes.push(unitAABB(units[i]));\n    if (roomOn()) {\n      const sz = roomSize();\n      boxes.push({ x0: -20, x1: sz.width + 20, y0: -LEG_H - 20, y1: ROOM.wallTop, z0: -20, z1: sz.depth + 20 });\n    }\n    for (let b = 0; b < boxes.length; b++) {\n      const B = boxes[b];\n      for (let xi = 0; xi < 2; xi++) for (let yi = 0; yi < 2; yi++) for (let zi = 0; zi < 2; zi++) {\n        const px = xi ? B.x1 : B.x0, py = yi ? B.y1 : B.y0, pz = zi ? B.z1 : B.z0;\n        const dpt = (eye[0] - px) * vdc[0] + (eye[1] - py) * vdc[1] + (eye[2] - pz) * vdc[2];\n        if (dpt < lo) lo = dpt;\n        if (dpt > hi) hi = dpt;\n      }\n    }\n    if (lo < hi) {\n      near2 = Math.min(near2, Math.max(lo - 50, 8));\n      far = Math.max(far, hi + 50);\n    }\n    let mvp = mMul(mv, mPersp(FOVY, aspect, near2, far));\n    if (viewScale !== 1) mvp = mMul(mvp, [viewScale, 0, 0, 0, 0, viewScale, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n    if (ndcOffY) mvp = mMul(mvp, mTrans(0, ndcOffY, 0));\n    return {\n      cx,\n      cy,\n      cz,\n      dist: dist2,\n      cw,\n      ch,\n      aspect,\n      near: near2,\n      far,\n      atMin,\n      fovY: FOVY,\n      rot,\n      mv,\n      mvp,\n      insetTop,\n      insetBottom,\n      ndcOffY,\n      viewScale,\n      fitHalf: half,\n      floorLift,\n      perZoom,\n      legacyDist,\n      pivot: PV ? PV.p.slice() : null,\n      pivotScale,\n      pivotBlock,\n      pivotMin,\n      pivotSight,\n      eye: camEyeOf({ cx, cy, cz, dist: dist2, rot })\n    };\n  }\n  var PIVOT_ZOOM_MIN = 1e-5;\n  var LAST_LEN = /* @__PURE__ */ new WeakMap();\n  function boardBefore(p, dir, L, boxes) {\n    for (const B of boxes) {\n      if (!B || !B.u || B.guard) continue;\n      const d = [p[0] - B.o[0], p[1] - B.o[1], p[2] - B.o[2]];\n      let t0 = -Infinity, t1 = Infinity;\n      for (let k = 0; k < 3 && t0 <= t1; k++) {\n        const ax = B.u[k], p0 = d[0] * ax[0] + d[1] * ax[1] + d[2] * ax[2], v = dir[0] * ax[0] + dir[1] * ax[1] + dir[2] * ax[2];\n        if (Math.abs(v) < 1e-12) {\n          if (p0 <= 0 || p0 >= B.L[k]) t0 = Infinity;\n          continue;\n        }\n        let a = -p0 / v, b = (B.L[k] - p0) / v;\n        if (a > b) {\n          const x = a;\n          a = b;\n          b = x;\n        }\n        if (a > t0) t0 = a;\n        if (b < t1) t1 = b;\n      }\n      if (t0 <= t1 && t1 > 2 && t0 < L - 2) return true;\n    }\n    return false;\n  }\n  function clampPivotZoom(z) {\n    return Math.max(PIVOT_ZOOM_MIN, Math.min(ZOOM.max, Number.isFinite(z) ? z : 1));\n  }\n  function pivotClamp(p, rot, panX, panY, dist2, boxes, prevLen) {\n    const e = applyRT(rot, [panX, panY, dist2]), L = Math.hypot(e[0], e[1], e[2]);\n    if (!(L > 1e-9)) return { scale: 1, min: 0, block: null, atMin: true };\n    const dir = [e[0] / L, e[1] / L, e[2] / L];\n    const min = clearanceDist(p, dir, 1e-6, boxes, NEAR_GAP);\n    const want = Math.max(L, min);\n    const out = clearanceDist(p, dir, want, boxes, NEAR_GAP, { passMin: min, prevT: prevLen });\n    let block = null;\n    for (const B0 of boxes) {\n      const B = B0 && B0.u ? B0 : null;\n      if (!B) continue;\n      const d = [p[0] - B.o[0], p[1] - B.o[1], p[2] - B.o[2]];\n      let t0 = -Infinity, t1 = Infinity;\n      for (let k = 0; k < 3 && t0 <= t1; k++) {\n        const ax = B.u[k], p0 = d[0] * ax[0] + d[1] * ax[1] + d[2] * ax[2], v = dir[0] * ax[0] + dir[1] * ax[1] + dir[2] * ax[2];\n        const lo = -NEAR_GAP, hi = B.L[k] + NEAR_GAP;\n        if (Math.abs(v) < 1e-12) {\n          if (p0 <= lo || p0 >= hi) t0 = Infinity;\n          continue;\n        }\n        let a = (lo - p0) / v, b = (hi - p0) / v;\n        if (a > b) {\n          const x = a;\n          a = b;\n          b = x;\n        }\n        if (a > t0) t0 = a;\n        if (b < t1) t1 = b;\n      }\n      if (t0 <= t1 && t0 > min + 1e-6 && t0 < L && (block === null || t0 < block)) block = t0;\n    }\n    return { scale: out / L, min, block, atMin: L <= min + 0.01 };\n  }\n  function legacyFloor(view, F, FIT, u0, zNow, vd) {\n    const F2 = view.frame || F;\n    let sx = F2.uhx != null ? F2.uhx : F2.hx || FIT;\n    let sy = F2.uhy != null ? F2.uhy : F2.hy || FIT;\n    let sz2 = F2.uhz != null ? F2.uhz : F2.hz || FIT;\n    if (zNow < 1 && u0) {\n      const fb1 = foot(u0);\n      const ttR = Math.max(0, Math.min(1, (1 - zNow) / (1 - ZOOM_EASE_MIN)));\n      const tt = ttR * ttR;\n      sx = sx + ((fb1.x1 - fb1.x0) / 2 - sx) * tt;\n      sy = sy + (u0.h / 2 - sy) * tt;\n      sz2 = sz2 + ((fb1.z1 - fb1.z0) / 2 - sz2) * tt;\n    }\n    return Math.abs(vd[0]) * sx + Math.abs(vd[1]) * sy + Math.abs(vd[2]) * sz2 + 80;\n  }\n  var HW_PAD = 12;\n  var obbOfCorners = (c) => {\n    const o = c[0], E = [c[4], c[2], c[1]].map((p) => [p[0] - o[0], p[1] - o[1], p[2] - o[2]]);\n    const L = E.map((e) => Math.hypot(e[0], e[1], e[2]));\n    const u = E.map((e, i) => L[i] > 1e-9 ? [e[0] / L[i], e[1] / L[i], e[2] / L[i]] : [i === 0 ? 1 : 0, i === 1 ? 1 : 0, i === 2 ? 1 : 0]);\n    return { o, u, L };\n  };\n  var obbOfAabb = (B) => ({ o: [B.x0, B.y0, B.z0], u: [[1, 0, 0], [0, 1, 0], [0, 0, 1]], L: [B.x1 - B.x0, B.y1 - B.y0, B.z1 - B.z0] });\n  var shapeCache = /* @__PURE__ */ new Map();\n  function unitGuards(u) {\n    const key = JSON.stringify(u);\n    const hit2 = shapeCache.get(u.id);\n    if (hit2 && hit2.key === key) return hit2.boxes;\n    const boxes = [];\n    let f = null;\n    try {\n      f = unitFeatures(u);\n    } catch (e) {\n      f = null;\n    }\n    if (f) {\n      for (const q of f.boxes) boxes.push(obbOfCorners(q.c));\n      const hw = f.pts.filter((p) => /^hinge |^mounting plate/.test(p.kind)).map((p) => p.p);\n      const groups = [];\n      for (const p of hw) {\n        let g2 = groups.find((G) => G.some((q) => Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2]) < 140));\n        if (!g2) {\n          g2 = [];\n          groups.push(g2);\n        }\n        g2.push(p);\n      }\n      for (const g2 of groups) {\n        const B = { x0: Infinity, y0: Infinity, z0: Infinity, x1: -Infinity, y1: -Infinity, z1: -Infinity };\n        for (const p of g2) {\n          B.x0 = Math.min(B.x0, p[0]);\n          B.x1 = Math.max(B.x1, p[0]);\n          B.y0 = Math.min(B.y0, p[1]);\n          B.y1 = Math.max(B.y1, p[1]);\n          B.z0 = Math.min(B.z0, p[2]);\n          B.z1 = Math.max(B.z1, p[2]);\n        }\n        boxes.push(Object.assign(obbOfAabb({ x0: B.x0 - HW_PAD, x1: B.x1 + HW_PAD, y0: B.y0 - HW_PAD, y1: B.y1 + HW_PAD, z0: B.z0 - HW_PAD, z1: B.z1 + HW_PAD }), { guard: \"hardware\" }));\n      }\n    } else boxes.push(obbOfAabb(unitAABB(u)));\n    if (u.family !== \"wall\") {\n      const A = unitAABB(u);\n      if (A.y0 < 0) boxes.push(Object.assign(obbOfAabb({ x0: A.x0, x1: A.x1, y0: A.y0, y1: 0, z0: A.z0, z1: A.z1 }), { guard: \"legs\" }));\n    }\n    if (shapeCache.size > 400) shapeCache.clear();\n    shapeCache.set(u.id, { key, boxes });\n    return boxes;\n  }\n  var plinthCache = { key: null, boxes: [] };\n  function plinthGuards(units) {\n    const key = JSON.stringify(units.map((u) => [u.id, u.x, u.z, u.y, u.w, u.d, u.h, u.rot, u.type, u.family, u.finish, u.plinthFinish]));\n    if (plinthCache.key === key) return plinthCache.boxes;\n    let boxes = [];\n    try {\n      for (const pf of plinthFeatures(units)) for (const b of pf.boxes) boxes.push(obbOfCorners(b.c));\n    } catch (e) {\n      boxes = [];\n    }\n    plinthCache = { key, boxes };\n    return boxes;\n  }\n  function nearBoxes(units) {\n    const out = [];\n    for (let i = 0; i < (units || []).length; i++) {\n      const u = units[i], pass = !!u && (u.type === \"island\" || (u.family === \"base\" || u.family === \"corner\") && !isTall(u));\n      for (const b of unitGuards(u)) out.push(pass ? Object.assign({}, b, { pass: true }, u.type === \"island\" ? { island: true } : {}) : b);\n    }\n    for (const b of plinthGuards(units || [])) out.push(Object.assign({}, b, { pass: true }));\n    return out;\n  }\n  function clearanceDist(target, vd, dist2, boxes, gap, opts) {\n    const passMin = opts && opts.passMin != null ? opts.passMin : null;\n    const islandOnly = !!(opts && opts.islandOnly);\n    const obbs = boxes.map((B) => B && B.u ? B : Object.assign(obbOfAabb(B), B && B.pass ? { pass: true } : {}));\n    const iv = [];\n    for (const B of obbs) {\n      const d = [target[0] - B.o[0], target[1] - B.o[1], target[2] - B.o[2]];\n      let t0 = -Infinity, t1 = Infinity;\n      for (let k = 0; k < 3 && t0 <= t1; k++) {\n        const ax = B.u[k], p0 = d[0] * ax[0] + d[1] * ax[1] + d[2] * ax[2], v = vd[0] * ax[0] + vd[1] * ax[1] + vd[2] * ax[2];\n        const lo = -gap, hi = B.L[k] + gap;\n        if (Math.abs(v) < 1e-12) {\n          if (p0 <= lo || p0 >= hi) t0 = Infinity;\n          continue;\n        }\n        let a = (lo - p0) / v, b = (hi - p0) / v;\n        if (a > b) {\n          const x = a;\n          a = b;\n          b = x;\n        }\n        if (a > t0) t0 = a;\n        if (b < t1) t1 = b;\n      }\n      if (t0 < t1) iv.push([t0, t1, islandOnly ? !!B.island : !!B.pass]);\n    }\n    iv.sort((x, y) => x[0] - y[0]);\n    const spans2 = [];\n    for (const [a, b, isl] of iv) {\n      const last = spans2[spans2.length - 1];\n      if (last && a < last[1]) {\n        last[1] = Math.max(last[1], b);\n        last[2] = last[2] && isl;\n      } else spans2.push([a, b, isl]);\n    }\n    let t = dist2;\n    for (const [a, b, isl] of spans2) {\n      if (!(a < t && t < b)) continue;\n      const prevT = opts && opts.prevT != null && Number.isFinite(opts.prevT) ? opts.prevT : null;\n      const toTarget = prevT != null ? t < prevT - 1e-6 : t - a < b - t;\n      t = passMin != null && isl && a >= passMin && toTarget ? a : b;\n      break;\n    }\n    return t;\n  }\n  function floorY() {\n    return -LEG_H;\n  }\n  function clampPitch(p) {\n    if (typeof p !== \"number\" || !Number.isFinite(p)) return DEFAULTS.pitch;\n    return Math.min(PITCH.max, Math.max(PITCH.min, p));\n  }\n  function computeCameraGuarded(view, units, cw, ch, frameOf3) {\n    const p = clampPitch(view.pitch);\n    if (p !== view.pitch) view.pitch = p;\n    let cam = computeCamera(view, units, cw, ch, frameOf3);\n    if (cam && cam.floorLift > 1e-6 && !view.camHold) {\n      const up = applyRT(cam.rot, [0, 1, 0]);\n      if (up[1] > 1e-3) {\n        view.panY = (view.panY || 0) + cam.floorLift / up[1];\n        cam = computeCamera(view, units, cw, ch, frameOf3);\n      }\n    }\n    return cam;\n  }\n  function camEyeOf(cam) {\n    const b = applyRT(cam.rot, [0, 0, cam.dist]);\n    return [cam.cx + b[0], cam.cy + b[1], cam.cz + b[2]];\n  }\n  function pictureCentreNdc(cam) {\n    return [0, cam && cam.ndcOffY ? cam.ndcOffY : 0];\n  }\n  function ndcToLens(cam, nx, ny) {\n    const c = pictureCentreNdc(cam), k = cam && cam.viewScale > 0 ? cam.viewScale : 1;\n    return [(nx - c[0]) / k, (ny - c[1]) / k];\n  }\n  function worldToNdc(cam, p) {\n    if (!cam || !cam.mvp) return null;\n    const m = cam.mvp, o = [];\n    for (let c = 0; c < 4; c++) o[c] = m[c] * p[0] + m[4 + c] * p[1] + m[8 + c] * p[2] + m[12 + c];\n    if (o[3] === 0) return null;\n    return [o[0] / o[3], o[1] / o[3]];\n  }\n  function worldClipZ(cam, p) {\n    if (!cam || !cam.mvp) return null;\n    const m = cam.mvp;\n    const z = m[2] * p[0] + m[6] * p[1] + m[10] * p[2] + m[14];\n    const w = m[3] * p[0] + m[7] * p[1] + m[11] * p[2] + m[15];\n    return w === 0 ? null : z / w;\n  }\n  function rayFromNdc(cam, nx, ny) {\n    if (!cam) return null;\n    const m = cam.rot;\n    const back = applyRT(m, [0, 0, cam.dist]);\n    const eye = [cam.cx + back[0], cam.cy + back[1], cam.cz + back[2]];\n    const ty = Math.tan(FOVY / 2), tx = ty * cam.aspect;\n    [nx, ny] = ndcToLens(cam, nx, ny);\n    const dir = applyRT(m, [nx * tx, ny * ty, -1]);\n    const len = Math.sqrt(dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2]) || 1;\n    return { o: eye, d: [dir[0] / len, dir[1] / len, dir[2] / len] };\n  }\n  function screenToFloor(cam, nx, ny, planeY) {\n    if (!cam) return null;\n    const m = cam.rot;\n    let eye = [cam.cx, cam.cy, cam.cz];\n    const back = applyRT(m, [0, 0, cam.dist]);\n    eye = [eye[0] + back[0], eye[1] + back[1], eye[2] + back[2]];\n    const ty = Math.tan(FOVY / 2), tx = ty * cam.aspect;\n    [nx, ny] = ndcToLens(cam, nx, ny);\n    const dir = applyRT(m, [nx * tx, ny * ty, -1]);\n    if (Math.abs(dir[1]) < 1e-4) return null;\n    const t = (planeY - eye[1]) / dir[1];\n    if (t <= 0) return null;\n    return [eye[0] + dir[0] * t, planeY, eye[2] + dir[2] * t];\n  }\n  function screenToPlane(cam, nx, ny, axis, at) {\n    if (!cam) return null;\n    const m = cam.rot;\n    let eye = [cam.cx, cam.cy, cam.cz];\n    const back = applyRT(m, [0, 0, cam.dist]);\n    eye = [eye[0] + back[0], eye[1] + back[1], eye[2] + back[2]];\n    const ty = Math.tan(FOVY / 2), tx = ty * cam.aspect;\n    [nx, ny] = ndcToLens(cam, nx, ny);\n    const dir = applyRT(m, [nx * tx, ny * ty, -1]);\n    const i = axis === \"x\" ? 0 : 2;\n    if (Math.abs(dir[i]) < 1e-4) return null;\n    const t = (at - eye[i]) / dir[i];\n    if (t <= 0) return null;\n    return [eye[0] + dir[0] * t, eye[1] + dir[1] * t, eye[2] + dir[2] * t];\n  }\n  var ORBIT = {\n    yawPerPx: 95e-4,\n    pitchPerPx: 75e-4,\n    pitchMin: PITCH.min,\n    pitchMax: PITCH.max,\n    touchYawPerPx: 0.011,\n    panPerPxOfDist: 16e-4\n  };\n  function orbitBy(view, dx, dy) {\n    const p = view.pitch + dy * ORBIT.pitchPerPx;\n    return {\n      yaw: view.yaw + dx * ORBIT.yawPerPx,\n      pitch: Math.min(ORBIT.pitchMax, Math.max(ORBIT.pitchMin, p))\n    };\n  }\n  function panBy(view, cam, dx, dy) {\n    const k = (cam ? cam.dist : 3e3) * ORBIT.panPerPxOfDist;\n    return { panX: (view.panX || 0) - dx * k, panY: (view.panY || 0) + dy * k };\n  }\n  function wheelZoom(zoom, deltaY, deltaMode) {\n    let dy = deltaY;\n    if (deltaMode === 1) dy *= 16;\n    else if (deltaMode === 2) dy *= 400;\n    let factor = Math.exp(dy * ZOOM.wheel);\n    factor = Math.min(ZOOM.stepMax, Math.max(1 / ZOOM.stepMax, factor));\n    return clampZoom(zoom * factor);\n  }\n  function fitZoom(frame2) {\n    if (!frame2 || !frame2.ur || !frame2.r) return 1;\n    return clampZoom(frame2.ur / frame2.r);\n  }\n\n  // v2/src/render/materials.js\n  var MATERIAL_SPECS = {\n    /* roughness 0.52 / 0.55 \u2192 0.82 (30.09.2026, task 1790780076781): the configurator's board face\n       (viewer.js faceMaterial: MeshStandardMaterial roughness 0.82). The glossier board mirrored the\n       environment as a grey sheen across every face - the \u00ABdull grey\u00BB next to its soft matte white.\n       The colours stay ours: the white and the oak are still told apart as they are sold. */\n    /* 0.82 \u2192 0.72 (11.10.2026, task 1791531588544 - owner after the material-preview comparison: \u00ABeach board has sheen ... everything\n       needs to become sort of brighter\u00BB): measured on the stand (.ev/lightmeasure.mjs, live 90dd2aa vs this build): with the\n       soft-box studio a board at 0.72 shows a soft sheen following its faces, and a white is pixel-for-pixel unchanged (W1100 241,\n       no clipping, no grey wash) - the 30.09 grey sheen came from the 64\u00B2 gradient at 0.52 / 0.55. ART-DIRECTED, not an EGGER\n       measurement. */\n    white: { color: 15592939, roughness: 0.72, metalness: 0 },\n    oak: { color: 15789286, roughness: 0.72, metalness: 0, textured: true },\n    grey: { color: 12172477, roughness: 0.6, metalness: 0 },\n    black: { color: 2763822, roughness: 0.55, metalness: 0 },\n    metal: { color: 12830667, roughness: 0.34, metalness: 0.88 },\n    glass: { color: 14674158, roughness: 0.1, metalness: 0, opacity: 0.3 },\n    edge: { color: 15131872, roughness: 0.7, metalness: 0 },\n    /* the shadow line in a 2 mm gap: charcoal, because that is what the eye\n       expects to see down a recess between two white boards. At 0.329 it was a\n       mid-grey against a near-white board and the seam barely registered. */\n    reveal: { color: 3684148, roughness: 0.95, metalness: 0 },\n    /* THE ROOM IS THE BACKDROP, NOT THE PRODUCT. [owner browser test 22/09/2026 - \"the\n       room background and white cabinet are nearly the same flat mid-grey\"] A soft\n       mid-grey room puts about 0.23 of display range between the two. */\n    /* LIGHTER AND WARMER, SAME RULE. [owner 29/09/2026: \u00AB\u043A\u043B\u0430\u0441\u0441\u043D\u043E \u0432\u044B\u0433\u043B\u044F\u0434\u0435\u043B\u043E, \u043F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u00BB]\n       The page read dark and gloomy. The wall is lifted from 0x8f to 0xb3 and warmed; the white\n       board (0xed) is still 0x3a = 0.23 of display range above it - the separation the rule above\n       asks for - and the floor stays darker than the wall so the room keeps its depth. */\n    /* THE CONFIGURATOR'S PALETTE. [owner 29/09/2026: \u00AB\u043A\u043B\u0438\u0435\u043D\u0442\u0443 \u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F \u043A\u0430\u043A \u0442\u0430\u043C \u0444\u043E\u043D \u0441\u0435\u0442\u043E\u0447\u043A\u043E\u0439 \u0438\n       \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u044B\u0435 \u043D\u044C\u0430\u043D\u0441\u044B\u00BB] Cool light greys of the engineering configurator\n       (cabinet-configurator viewer.js: ground 0xd6dbe1, sky 0xcfd8e3..0xdde3ea). The white board\n       still separates from them by its shading, the contact shadow and the grid under it. */\n    /* A TONE DOWN FROM THE BOARD (29.09.2026, owner: \u00AB3\u0434 \u043C\u043E\u0434\u0435\u043B\u0438 \u0441\u043B\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u0446\u0432\u0435\u0442\u043E\u0432 \u0441 \u0444\u043E\u043D\u043E\u043C\u00BB): a white\n       wall (0xeef1f5) and the white board were one mass. The room is now a cool mid-light grey the\n       white board clearly sits in front of; the floor a shade lighter than the walls, as before. */\n    floor: { color: 13357528, roughness: 0.92, metalness: 0 },\n    wall: { color: 12371149, roughness: 0.96, metalness: 0 },\n    /* window frames, door linings and leaves (task 1790876476355): satin white paint */\n    paint: { color: 15987438, roughness: 0.55, metalness: 0 },\n    /* THE APPLIANCES (task 1791557195336): brushed stainless (a soft metal, so the vertex colour still reads), black glass\n       (a near-mirror dielectric), the dark controls */\n    steel: { color: 13159632, roughness: 0.38, metalness: 0.62 },\n    blackGlass: { color: 1316377, roughness: 0.08, metalness: 0 },\n    /* SPLASHBACKS: back-painted glass is glossy and opaque (the colour is the paint behind it); glazed tiles a little less */\n    splashGlass: { color: 16777215, roughness: 0.07, metalness: 0 },\n    splashTile: { color: 16777215, roughness: 0.32, metalness: 0, textured: true },\n    /* painted MDF fronts (task 1790895487998): the colour is the vertex colour (the preview tone); satin /\n       matt reads like the board, gloss picks up the light */\n    paintMatt: { color: 16777215, roughness: 0.7, metalness: 0 },\n    paintGloss: { color: 16777215, roughness: 0.22, metalness: 0 },\n    /* EGGER DECORS (task 1791046839036): the matte melamine board of the white and the oak (roughness 0.82). A\n       solid decor is its calibrated colour (vertex colour); a textured one its own image, unmultiplied (white), so\n       the decor's colours are the shop image's */\n    decor: { color: 16777215, roughness: 0.72, metalness: 0 }\n    // the smooth family's default (egger-decors DECOR_SURFACES)\n  };\n  var BACKGROUND = 14541802;\n  var SKY = [\"#cfd8e3\", \"#dde3ea\", \"#cdd2d8\"];\n  var GROUND = 13357528;\n  var GRID = { cell: 100, major: 10397617, minor: 12173513 };\n  var EDGE = { color: 2830648, opacity: 0.34 };\n  var FACE_OFFSET = { factor: 2, units: 2 };\n  var SEL_EMISSIVE = 15429376;\n  var SEL_LEVEL = { sel: 0.04, selpart: 0.18, hover: 0.12 };\n  var XRAY_ALPHA = { 1: 0.18, 2: 0.3, 3: 0.4, 4: 0.48 };\n  var CUT_LEVELS = 8;\n  var CUT_GHOST = 0.12;\n  function cutAlpha(k) {\n    return 1 - Math.max(0, Math.min(CUT_LEVELS, k)) / CUT_LEVELS * (1 - CUT_GHOST);\n  }\n  var C2 = MAT_CLASS;\n  var CLASS_STYLE = {};\n  function style(code, s) {\n    if (code != null) CLASS_STYLE[code] = s;\n  }\n  style(C2.PLAIN, { spec: \"edge\", shadow: \"both\" });\n  style(C2.WORKTOP, { spec: \"decor\", shadow: \"both\", board: true });\n  style(C2.APPL_STEEL, { spec: \"steel\", shadow: \"both\" });\n  style(C2.APPL_GLASS, { spec: \"blackGlass\", shadow: \"both\" });\n  style(C2.APPL_DARK, { spec: \"black\", shadow: \"both\" });\n  style(C2.SPLASH_GLASS, { spec: \"splashGlass\", shadow: \"receive\" });\n  style(C2.SPLASH_TILE, { spec: \"splashTile\", shadow: \"receive\" });\n  style(C2.WORKSHOP_BOARD, { spec: \"white\", shadow: \"both\", board: true });\n  style(C2.BOARD_WHITE, { spec: \"white\", color: MATERIAL_SPECS.white.color, shadow: \"both\", board: true });\n  style(C2.BOARD_OAK, { spec: \"oak\", shadow: \"both\", board: true });\n  style(C2.BOARD_PURE, { spec: \"white\", color: 16777215, shadow: \"both\", board: true });\n  style(C2.HOLE, { spec: \"black\", shadow: \"receive\" });\n  style(C2.REVEAL, { spec: \"reveal\", color: MATERIAL_SPECS.reveal.color, shadow: \"receive\" });\n  style(C2.METAL, { spec: \"metal\", shadow: \"both\" });\n  style(C2.LEG, { spec: \"black\", shadow: \"both\" });\n  style(C2.APPLIANCE, { spec: \"grey\", shadow: \"both\" });\n  style(C2.WALL, { spec: \"wall\", color: MATERIAL_SPECS.wall.color, shadow: \"receive\" });\n  style(C2.FLOOR, { spec: \"floor\", color: MATERIAL_SPECS.floor.color, lit: false, shadow: \"none\" });\n  style(C2.WALL_PAINT, { spec: \"wall\", shadow: \"receive\" });\n  style(C2.FLOOR_FINISH, { spec: \"floor\", lit: false, shadow: \"none\", floor: true });\n  style(C2.OPENING, { spec: \"paint\", shadow: \"both\" });\n  style(C2.GLASS, { spec: \"glass\", shadow: \"none\" });\n  style(C2.PAINT_MATT, { spec: \"paintMatt\", shadow: \"both\", board: true });\n  style(C2.PAINT_GLOSS, { spec: \"paintGloss\", shadow: \"both\", board: true });\n  style(C2.CONTACT, { skip: true });\n  style(C2.SEL, { lit: false, shadow: \"none\" });\n  style(C2.PART_MARK, { lit: false, shadow: \"none\" });\n  style(C2.GUIDE, { lit: false, shadow: \"none\" });\n  var DECOR_STYLES = {};\n  function decorStyle(code) {\n    if (DECOR_STYLES[code]) return DECOR_STYLES[code];\n    const d = decorOfClass(code);\n    const s = {\n      spec: \"decor\",\n      shadow: \"both\",\n      board: true,\n      decor: true,\n      roughness: d ? decorSurface(d).roughness : MATERIAL_SPECS.decor.roughness,\n      relief: decorRelief(d)\n    };\n    DECOR_STYLES[code] = s;\n    return s;\n  }\n  var RELIEF_SCALE = 0.5;\n  function classStyle(code) {\n    return CLASS_STYLE[code] || (code >= DECOR_CLASS_BASE ? decorStyle(code) : CLASS_STYLE[C2.PLAIN]);\n  }\n  function srgbToLinear(c) {\n    return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n  }\n  function hexToLinear(hex) {\n    return [\n      srgbToLinear((hex >> 16 & 255) / 255),\n      srgbToLinear((hex >> 8 & 255) / 255),\n      srgbToLinear((hex & 255) / 255)\n    ];\n  }\n  function createMaterialCache(THREE, getTexture, isLambert, getRelief) {\n    const cache3 = /* @__PURE__ */ new Map();\n    function get(code, textured, variant) {\n      const key = code + \"|\" + (textured ? 1 : 0) + \"|\" + (variant || \"\");\n      let m = cache3.get(key);\n      if (m) return m;\n      const st = classStyle(code);\n      if (st.lit === false) {\n        m = new THREE.MeshBasicMaterial({ vertexColors: true, toneMapped: false });\n      } else {\n        const spec = MATERIAL_SPECS[st.spec] || MATERIAL_SPECS.edge;\n        const tex = textured && !st.relief ? getTexture(code) : null;\n        const bump = textured && st.relief && !isLambert() && getRelief ? getRelief() : null;\n        m = isLambert() ? new THREE.MeshLambertMaterial({ vertexColors: !tex, color: tex ? spec.color : 16777215, map: tex || null }) : new THREE.MeshStandardMaterial({\n          roughness: st.roughness != null ? st.roughness : spec.roughness,\n          metalness: spec.metalness,\n          /* \u0434\u0443\u0431 \u0441 \u0442\u0435\u043A\u0441\u0442\u0443\u0440\u043E\u0439: \u0446\u0432\u0435\u0442 \u0431\u0435\u0440\u0451\u0442\u0441\u044F \u0438\u0437 \u0441\u043A\u0430\u043D\u0430 (\u043A\u0430\u043A \u0441\u0442\u0430\u0440\u044B\u0439 mix(vCol, tex, vTex)),\n             \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u2014 \u043A\u043B\u0438\u0435\u043D\u0442\u0441\u043A\u0438\u0439 0xf0ece6; \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u043E\u0435 \u2014 \u0446\u0432\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043D */\n          vertexColors: !tex,\n          color: tex ? spec.color : 16777215,\n          map: tex || null\n        });\n        if (bump) {\n          m.bumpMap = bump;\n          m.bumpScale = RELIEF_SCALE;\n        }\n        if (spec.opacity != null) {\n          m.transparent = true;\n          m.opacity = spec.opacity;\n          m.depthWrite = false;\n        }\n        if (variant === \"sel\" || variant === \"selpart\" || variant === \"hover\") {\n          m.emissive = new THREE.Color(SEL_EMISSIVE);\n          m.emissiveIntensity = SEL_LEVEL[variant];\n        }\n        const xl = /^xray([1-4])$/.exec(variant || \"\");\n        if (xl) {\n          m.transparent = true;\n          m.opacity = XRAY_ALPHA[+xl[1]];\n          m.depthWrite = false;\n        }\n      }\n      const cl = /^cut(\\d+)$/.exec(variant || \"\");\n      if (cl) {\n        m.opacity = Math.min(m.transparent ? m.opacity : 1, cutAlpha(+cl[1]));\n        m.transparent = true;\n        m.depthWrite = false;\n      }\n      m.polygonOffset = true;\n      m.polygonOffsetFactor = FACE_OFFSET.factor;\n      m.polygonOffsetUnits = FACE_OFFSET.units;\n      m.userData.key = key;\n      cache3.set(key, m);\n      return m;\n    }\n    function clear() {\n      cache3.forEach((m) => m.dispose());\n      cache3.clear();\n    }\n    function dropCode(code) {\n      cache3.forEach((m, k) => {\n        const p = k.split(\"|\");\n        if (+p[0] === code && p[1] === \"1\") {\n          m.dispose();\n          cache3.delete(k);\n        }\n      });\n    }\n    function dropTextured() {\n      cache3.forEach((m, k) => {\n        if (k.split(\"|\")[1] === \"1\") {\n          m.dispose();\n          cache3.delete(k);\n        }\n      });\n    }\n    return { get, clear, dropTextured, dropCode, size: () => cache3.size };\n  }\n\n  // v2/src/render/mesh/room-edges.js\n  var EDGE_IN = 4;\n  var ROOM_EDGE = { color: 2830648, opacity: 0.48 };\n  function roomEdgeSegments(sz, room) {\n    const W2 = sz.width, D2 = sz.depth, y0 = -LEG_H + EDGE_IN, y1 = sz.height;\n    const e = EDGE_IN, out = [];\n    for (const [a, b, x, z] of [[\"back\", \"left\", e, e], [\"back\", \"right\", W2 - e, e], [\"front\", \"left\", e, D2 - e], [\"front\", \"right\", W2 - e, D2 - e]])\n      out.push({ walls: [a, b], kind: \"corner\", pos: [x, y0, z, x, y1, z] });\n    const ops = openingsOf(room);\n    for (const wall of [\"back\", \"front\", \"left\", \"right\"]) {\n      const fr = wallFrame(wall, sz);\n      const gaps = ops.filter((o) => o.wall === wall && o.y < 1).map((o) => [Math.max(0, o.x), Math.min(fr.len, o.x + o.w)]).filter((g2) => g2[1] > g2[0]).sort((p, q) => p[0] - q[0]);\n      const pos = [];\n      let at = 0;\n      const run = (a0, a1) => {\n        if (a1 - a0 < 1) return;\n        const p = fr.pt(a0, e), q = fr.pt(a1, e);\n        pos.push(p[0], y0, p[1], q[0], y0, q[1]);\n      };\n      for (const g2 of gaps) {\n        run(at, g2[0]);\n        at = Math.max(at, g2[1]);\n      }\n      run(at, fr.len);\n      if (pos.length) out.push({ walls: [wall], kind: \"foot\", pos });\n    }\n    return out;\n  }\n\n  // v2/src/render/floor-texture.js\n  function hashNoise(seed) {\n    const r = { s: seed >>> 0 };\n    return () => {\n      r.s = r.s * 1664525 + 1013904223 >>> 0;\n      return r.s / 4294967296;\n    };\n  }\n  var css = (r, g2, b, a) => \"rgba(\" + (r | 0) + \",\" + (g2 | 0) + \",\" + (b | 0) + \",\" + a + \")\";\n  var FLOOR_TILE_MM = { wood: [2400, 1440], tile: [1800, 1800] };\n  function makeFloorTexture(THREE, doc2, finish3, hex) {\n    if (!doc2 || !doc2.createElement || finish3 !== \"wood\" && finish3 !== \"tile\") return null;\n    const mm = FLOOR_TILE_MM[finish3];\n    const px = 1024 / mm[0];\n    const W2 = 1024, H2 = Math.round(mm[1] * px);\n    const c = doc2.createElement(\"canvas\");\n    c.width = W2;\n    c.height = H2;\n    const g2 = c.getContext && c.getContext(\"2d\");\n    if (!g2) return null;\n    const R4 = hex >> 16 & 255, G = hex >> 8 & 255, B = hex & 255;\n    const rnd = hashNoise(hex || 7);\n    g2.fillStyle = css(R4, G, B, 1);\n    g2.fillRect(0, 0, W2, H2);\n    if (finish3 === \"wood\") {\n      const boardH = 180 * px, rows = Math.round(H2 / boardH);\n      for (let r = 0; r < rows; r++) {\n        const y0 = Math.round(r * H2 / rows), y1 = Math.round((r + 1) * H2 / rows);\n        let x = -rnd() * 1200 * px;\n        while (x < W2) {\n          const len = (600 + rnd() * 1200) * px;\n          const k = 0.86 + rnd() * 0.22;\n          g2.fillStyle = css(R4 * k, G * k, B * k, 1);\n          g2.fillRect(Math.floor(x), y0, Math.ceil(len), y1 - y0);\n          if (x + len > W2) g2.fillRect(Math.floor(x - W2), y0, Math.ceil(len), y1 - y0);\n          for (let s = y0; s < y1; s += 1 + Math.floor(rnd() * 3)) {\n            const kk = k * (0.9 + rnd() * 0.18);\n            g2.fillStyle = css(R4 * kk, G * kk, B * kk, 0.25 + rnd() * 0.3);\n            g2.fillRect(Math.floor(x), s, Math.ceil(len), 1);\n          }\n          g2.strokeStyle = \"rgba(0,0,0,0.10)\";\n          g2.lineWidth = 1;\n          for (let i = 0; i < 3; i++) {\n            const yy = y0 + 3 + rnd() * (y1 - y0 - 6), amp = 1 + rnd() * 2.5, f = 2 + rnd() * 3;\n            g2.beginPath();\n            for (let t = 0; t <= len; t += 12) {\n              const py = yy + Math.sin(t / len * Math.PI * f) * amp;\n              if (t === 0) g2.moveTo(x + t, py);\n              else g2.lineTo(x + t, py);\n            }\n            g2.stroke();\n          }\n          g2.fillStyle = \"rgba(40,28,18,0.45)\";\n          g2.fillRect(Math.floor(x), y0, 1, y1 - y0);\n          x += len;\n        }\n        g2.fillStyle = \"rgba(40,28,18,0.55)\";\n        g2.fillRect(0, y0, W2, 1);\n      }\n    } else {\n      const t = 600 * px, n = Math.round(W2 / t), m = Math.round(H2 / t), gr = Math.max(1, Math.round(3 * px * 1.6));\n      for (let i = 0; i < n; i++) for (let j = 0; j < m; j++) {\n        const k = 0.95 + rnd() * 0.08;\n        g2.fillStyle = css(R4 * k, G * k, B * k, 1);\n        g2.fillRect(Math.round(i * W2 / n), Math.round(j * H2 / m), Math.ceil(W2 / n), Math.ceil(H2 / m));\n      }\n      const dark = (R4 + G + B) / 3 < 110;\n      g2.fillStyle = dark ? \"rgba(150,150,150,0.55)\" : \"rgba(90,90,90,0.35)\";\n      for (let i = 0; i < n; i++) g2.fillRect(Math.round(i * W2 / n), 0, gr, H2);\n      for (let j = 0; j < m; j++) g2.fillRect(0, Math.round(j * H2 / m), W2, gr);\n    }\n    const tex = new THREE.CanvasTexture(c);\n    tex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n    tex.colorSpace = THREE.SRGBColorSpace;\n    tex.anisotropy = 8;\n    tex.repeat.set(TEX.alongMM / mm[0], TEX.acrossMM / mm[1]);\n    return tex;\n  }\n\n  // v2/src/render/splash-texture.js\n  var GROUT = 2;\n  function splashPattern(S2) {\n    const z = SPLASH.SIZES.find((s) => s.id === S2.tile.size) || SPLASH.SIZES[0];\n    const vertical = S2.tile.layout === \"vertical\", tw = vertical ? z.h : z.w, th = vertical ? z.w : z.h;\n    const brick = S2.tile.layout === \"brick\";\n    return { tw, th, brick, pw: tw, ph: brick ? 2 * th : th };\n  }\n  function makeSplashTexture(THREE, doc2, S2) {\n    if (!doc2 || !doc2.createElement || !S2 || S2.kind !== \"tiles\") return null;\n    const P2 = splashPattern(S2), px = Math.min(6, 1024 / Math.max(P2.pw, P2.ph));\n    const W2 = Math.round(P2.pw * px), H2 = Math.round(P2.ph * px);\n    const c = doc2.createElement(\"canvas\");\n    c.width = W2;\n    c.height = H2;\n    const g2 = c.getContext && c.getContext(\"2d\");\n    if (!g2) return null;\n    const grout = (SPLASH.GROUTS.find((x) => x.id === S2.tile.grout) || SPLASH.GROUTS[0]).hex;\n    g2.fillStyle = grout;\n    g2.fillRect(0, 0, W2, H2);\n    const gp = GROUT * px;\n    const tile = (x0, y0) => {\n      g2.fillStyle = S2.colour;\n      g2.fillRect(x0 + gp / 2, y0 + gp / 2, P2.tw * px - gp, P2.th * px - gp);\n      g2.fillStyle = \"rgba(255,255,255,0.18)\";\n      g2.fillRect(x0 + gp / 2, y0 + gp / 2, P2.tw * px - gp, Math.max(1, 1.2 * px));\n    };\n    const th = P2.th * px, tw = P2.tw * px;\n    tile(0, H2 - th);\n    if (P2.brick) {\n      tile(-tw / 2, H2 - 2 * th);\n      tile(tw / 2, H2 - 2 * th);\n    }\n    const tex = new THREE.CanvasTexture(c);\n    tex.colorSpace = THREE.SRGBColorSpace;\n    tex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n    tex.repeat.set(TEX.alongMM / P2.pw, TEX.acrossMM / P2.ph);\n    tex.anisotropy = 4;\n    return tex;\n  }\n\n  // v2/src/render/quality.js\n  var LEVELS = [\n    { name: \"lambert-1x\", env: false, shadows: false, material: \"lambert\", maxDpr: 1 },\n    { name: \"lambert\", env: false, shadows: false, material: \"lambert\", maxDpr: 1.5 },\n    { name: \"no-shadow\", env: false, shadows: false, material: \"standard\", maxDpr: 1.5 },\n    { name: \"no-env\", env: false, shadows: true, material: \"standard\", maxDpr: 2 },\n    { name: \"full\", env: true, shadows: true, material: \"standard\", maxDpr: 2 }\n  ];\n  var MAX_LEVEL = LEVELS.length - 1;\n  var GOVERNOR = {\n    budgetMs: 33,\n    DOWN_N: 8,\n    UP_N: 45,\n    UP_RATIO: 0.5,\n    HOLD_MS: 4e3,\n    MAX_FAILS: 2,\n    FAST_N: 3,\n    FAST_X: 3,\n    UP_FAST_N: 12,\n    UP_FAST_RATIO: 1 / 3,\n    UP_FAST_HOLD_MS: 1e3,\n    REPROBE_MS: 3e4\n  };\n  var STORE_KEY = \"ub-cabinet-lab:v2-quality\";\n  function isSoftwareRenderer(name2) {\n    return /swiftshader|llvmpipe|softpipe|software|microsoft basic render/i.test(String(name2 || \"\"));\n  }\n  function isWeakGpu(name2) {\n    return /Mali-4\\d\\d|Mali-T6\\d\\d|Adreno \\(TM\\) [34]\\d\\d|Adreno [34]\\d\\d|PowerVR SGX/i.test(String(name2 || \"\"));\n  }\n  function startLevel(dev) {\n    dev = dev || {};\n    if (isSoftwareRenderer(dev.renderer)) return 1;\n    if (isWeakGpu(dev.renderer)) return 2;\n    const mem = dev.deviceMemory;\n    if (dev.mobile) return mem && mem < 4 ? 2 : 3;\n    return 4;\n  }\n  function antialiasFor(level, dev) {\n    return !isSoftwareRenderer(dev && dev.renderer);\n  }\n  function bootLevel(saved, dev) {\n    const s = startLevel(dev);\n    if (!saved) return s;\n    return Math.max(saved.level, Math.min(s, 3));\n  }\n  function median(a) {\n    const b = a.slice().sort((x, y) => x - y);\n    return b[Math.floor(b.length / 2)];\n  }\n  function createGovernor(o) {\n    o = o || {};\n    const P2 = Object.assign({}, GOVERNOR, o.params || {});\n    const min = o.min != null ? o.min : 0, max = o.max != null ? o.max : MAX_LEVEL;\n    const st = {\n      level: o.level != null ? o.level : max,\n      fails: Object.assign({}, o.fails || {}),\n      samples: [],\n      lastChange: -Infinity,\n      changes: 0,\n      t0: null\n    };\n    function change(to, t, why) {\n      const from = st.level;\n      st.level = to;\n      st.samples = [];\n      st.lastChange = t;\n      st.changes++;\n      return { from, to, why };\n    }\n    return {\n      get level() {\n        return st.level;\n      },\n      get fails() {\n        return Object.assign({}, st.fails);\n      },\n      get changes() {\n        return st.changes;\n      },\n      /* ms \u2014 \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C \u043A\u0430\u0434\u0440\u0430, t \u2014 \u0432\u0440\u0435\u043C\u044F (\u043C\u0441); \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 { from, to, why } \u043F\u0440\u0438 \u0441\u043C\u0435\u043D\u0435 \u0443\u0440\u043E\u0432\u043D\u044F */\n      sample(ms, t) {\n        if (!(ms >= 0) || !isFinite(ms)) return null;\n        if (st.t0 == null) st.t0 = t;\n        st.samples.push(ms);\n        if (st.samples.length > P2.UP_N) st.samples.shift();\n        const n = st.samples.length;\n        if (n >= P2.FAST_N && st.level > min && st.samples.slice(-P2.FAST_N).every((x) => x > P2.budgetMs * P2.FAST_X)) {\n          st.fails[st.level] = (st.fails[st.level] || 0) + 1;\n          return change(st.level - 1, t, `${P2.FAST_N} \\u043A\\u0430\\u0434\\u0440\\u0430 \\u043F\\u043E\\u0434\\u0440\\u044F\\u0434 \\u0434\\u043E\\u043B\\u044C\\u0448\\u0435 ${P2.budgetMs * P2.FAST_X} \\u043C\\u0441`);\n        }\n        if (n >= P2.DOWN_N && st.level > min) {\n          const m = median(st.samples.slice(-P2.DOWN_N));\n          if (m > P2.budgetMs) {\n            st.fails[st.level] = (st.fails[st.level] || 0) + 1;\n            return change(st.level - 1, t, `\\u043C\\u0435\\u0434\\u0438\\u0430\\u043D\\u0430 ${m.toFixed(1)} \\u043C\\u0441 > \\u0431\\u044E\\u0434\\u0436\\u0435\\u0442\\u0430 ${P2.budgetMs}`);\n          }\n        }\n        if (n >= P2.UP_FAST_N && st.level < max) {\n          const up = st.level + 1, f = st.fails[up] || 0;\n          const m = median(st.samples.slice(-P2.UP_FAST_N));\n          if (f < P2.MAX_FAILS && m <= P2.budgetMs * P2.UP_FAST_RATIO && t - st.lastChange >= P2.UP_FAST_HOLD_MS * Math.pow(2, f))\n            return change(up, t, `\\u0431\\u043E\\u043B\\u044C\\u0448\\u043E\\u0439 \\u0437\\u0430\\u043F\\u0430\\u0441: \\u043C\\u0435\\u0434\\u0438\\u0430\\u043D\\u0430 ${m.toFixed(1)} \\u043C\\u0441 \\u2264 ${(P2.budgetMs * P2.UP_FAST_RATIO).toFixed(1)}`);\n        }\n        if (n >= P2.UP_N && st.level < max) {\n          const up = st.level + 1, f = st.fails[up] || 0;\n          const m = median(st.samples);\n          if (f < P2.MAX_FAILS && m < P2.budgetMs * P2.UP_RATIO && t - st.lastChange >= P2.HOLD_MS * Math.pow(2, f))\n            return change(up, t, `\\u043C\\u0435\\u0434\\u0438\\u0430\\u043D\\u0430 ${m.toFixed(1)} \\u043C\\u0441 < ${(P2.budgetMs * P2.UP_RATIO).toFixed(1)}`);\n          if (f >= P2.MAX_FAILS && !st.reprobed && m < P2.budgetMs * P2.UP_RATIO && t - (isFinite(st.lastChange) ? st.lastChange : st.t0) >= P2.REPROBE_MS) {\n            st.reprobed = true;\n            return change(up, t, `\\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u043D\\u0430\\u044F \\u043F\\u0440\\u043E\\u0431\\u0430: \\u043C\\u0435\\u0434\\u0438\\u0430\\u043D\\u0430 ${m.toFixed(1)} \\u043C\\u0441 < ${(P2.budgetMs * P2.UP_RATIO).toFixed(1)} ${P2.REPROBE_MS / 1e3} \\u0441`);\n          }\n        }\n        return null;\n      },\n      state() {\n        return { level: st.level, fails: Object.assign({}, st.fails) };\n      }\n    };\n  }\n  var DECAY = { halfDays: 3, clearDays: 14 };\n  function agedFails(fails, at, now) {\n    const f = Object.assign({}, fails || {});\n    if (!(at > 0) || !(now >= at)) return f;\n    const days = (now - at) / 864e5;\n    if (days >= DECAY.clearDays) return {};\n    if (days >= DECAY.halfDays) {\n      for (const k of Object.keys(f)) {\n        f[k] = Math.floor((f[k] | 0) / 2);\n        if (!f[k]) delete f[k];\n      }\n    }\n    return f;\n  }\n  function loadState(storage, renderer, now) {\n    try {\n      const all = JSON.parse(storage && storage.getItem(STORE_KEY) || \"null\");\n      const s = all && all[String(renderer || \"?\")];\n      if (!s || !(s.level >= 0 && s.level <= MAX_LEVEL)) return null;\n      return { level: s.level | 0, fails: agedFails(s.fails, s.at, now != null ? now : Date.now()) };\n    } catch {\n      return null;\n    }\n  }\n  function saveState(storage, renderer, s) {\n    try {\n      if (!storage) return false;\n      const all = JSON.parse(storage.getItem(STORE_KEY) || \"{}\") || {};\n      all[String(renderer || \"?\")] = { level: s.level, fails: s.fails || {}, at: Date.now() };\n      storage.setItem(STORE_KEY, JSON.stringify(all));\n      return true;\n    } catch {\n      return false;\n    }\n  }\n  function frameCost(probeMs, jsMs, minProbe) {\n    if (minProbe <= 35 && probeMs <= minProbe * 1.2 + 0.5) return jsMs;\n    return probeMs;\n  }\n\n  // v2/src/render/graphics.js\n  var TIERS = {\n    low: { name: \"low\", label: \"Fast\", maxLevel: 2, dprCap: 1, bloom: false, extras: false, aniso: 4 },\n    auto: { name: \"auto\", label: \"Balanced\", maxLevel: 4, dprCap: null, bloom: true, extras: false, aniso: 8 },\n    high: { name: \"high\", label: \"Sharp\", maxLevel: 4, dprCap: null, bloom: true, extras: true, aniso: 16 }\n  };\n  var TIER_NAMES = [\"low\", \"auto\", \"high\"];\n  var GFX_KEY = \"ub-cabinet-lab:v2-graphics\";\n  var BLOOM = { threshold: 0.8, knee: 0.15, warm: 0.1, warmKnee: 0.15, strength: 0.32, minLevel: 3 };\n  var HIGH = { samples: 2, supersample: 2, belowDpr: 1.5, maxSide: 4096, lineInk: 1.25 };\n  function tierName(v) {\n    return v === \"low\" || v === \"high\" ? v : \"auto\";\n  }\n  function tierOf(v) {\n    return TIERS[tierName(v)];\n  }\n  function pixelRatio(dpr, levelMaxDpr, tier) {\n    const t = tierOf(tier && tier.name ? tier.name : tier);\n    let r = Math.min(dpr || 1, levelMaxDpr || 1);\n    if (t.dprCap) r = Math.min(r, t.dprCap);\n    return r;\n  }\n  function framePlan(tier, level, mood, caps) {\n    const t = tierOf(tier && tier.name ? tier.name : tier);\n    caps = caps || {};\n    const maxLevel = caps.maxLevel != null ? caps.maxLevel : 4;\n    const maxS = caps.maxSamples > 0 ? caps.maxSamples : 4;\n    const extras = !!(t.extras && level >= maxLevel && (caps.dpr || 1) < HIGH.belowDpr);\n    const bloom = t.bloom && level >= BLOOM.minLevel && mood > 1e-3 ? BLOOM.strength * Math.min(1, mood) : 0;\n    const post = !caps.failed && (extras || bloom > 0);\n    if (!post) return { post: false, samples: 0, scale: 1, bloom: 0, extras: false };\n    const samples = extras ? Math.min(HIGH.samples, maxS) : caps.antialias === false ? 0 : Math.min(4, maxS);\n    let scale = 1;\n    if (extras) {\n      scale = HIGH.supersample;\n      const side = Math.max(caps.bufW || 0, caps.bufH || 0);\n      if (side > 0 && side * scale > HIGH.maxSide) scale = Math.max(1, HIGH.maxSide / side);\n    }\n    return { post: true, samples, scale, bloom, extras };\n  }\n  function postBytes(w, h, samples, bloomOn) {\n    if (!(w > 0 && h > 0)) return 0;\n    const px = w * h, s = Math.max(1, samples | 0);\n    let b = px * 4 * (samples > 0 ? s + 1 : 1) + px * 4 * s;\n    if (bloomOn) {\n      const q = (d) => Math.max(1, Math.round(w / d)) * Math.max(1, Math.round(h / d)) * 4;\n      b += q(2) * 2 + q(4) * 2 + q(8);\n    }\n    return b;\n  }\n  function loadTier(storage) {\n    try {\n      const v = storage && storage.getItem(GFX_KEY);\n      return v ? tierName(v) : null;\n    } catch {\n      return null;\n    }\n  }\n  function saveTier(storage, name2) {\n    try {\n      if (!storage) return false;\n      storage.setItem(GFX_KEY, tierName(name2));\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  // v2/src/render/post.js\n  var VERT = \"varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position.xy, 0.0, 1.0); }\";\n  var BRIGHT = `uniform sampler2D tSrc; uniform vec2 uTexel; uniform float uTh, uKnee, uWarm, uWarmKnee; varying vec2 vUv;\n  void main() {\n    vec3 c = 0.25 * (texture2D(tSrc, vUv + uTexel * vec2(-0.5, -0.5)).rgb + texture2D(tSrc, vUv + uTexel * vec2(0.5, -0.5)).rgb\n      + texture2D(tSrc, vUv + uTexel * vec2(-0.5, 0.5)).rgb + texture2D(tSrc, vUv + uTexel * vec2(0.5, 0.5)).rgb);\n    float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\n    gl_FragColor = vec4(c * smoothstep(uTh, uTh + uKnee, l) * smoothstep(uWarm, uWarm + uWarmKnee, c.r - c.b), 1.0);\n  }`;\n  var DOWN = `uniform sampler2D tSrc; uniform vec2 uTexel; varying vec2 vUv;\n  void main() {\n    vec3 c = 0.5 * texture2D(tSrc, vUv).rgb + 0.125 * (texture2D(tSrc, vUv + uTexel * vec2(-1.0, -1.0)).rgb\n      + texture2D(tSrc, vUv + uTexel * vec2(1.0, -1.0)).rgb + texture2D(tSrc, vUv + uTexel * vec2(-1.0, 1.0)).rgb\n      + texture2D(tSrc, vUv + uTexel * vec2(1.0, 1.0)).rgb);\n    gl_FragColor = vec4(c, 1.0);\n  }`;\n  var UP = `uniform sampler2D tSmall, tBig; uniform vec2 uTexel; varying vec2 vUv;\n  void main() {\n    vec3 s = 0.25 * texture2D(tSmall, vUv).rgb\n      + 0.125 * (texture2D(tSmall, vUv + uTexel * vec2(-1.0, 0.0)).rgb + texture2D(tSmall, vUv + uTexel * vec2(1.0, 0.0)).rgb\n               + texture2D(tSmall, vUv + uTexel * vec2(0.0, -1.0)).rgb + texture2D(tSmall, vUv + uTexel * vec2(0.0, 1.0)).rgb)\n      + 0.0625 * (texture2D(tSmall, vUv + uTexel * vec2(-1.0, -1.0)).rgb + texture2D(tSmall, vUv + uTexel * vec2(1.0, -1.0)).rgb\n               + texture2D(tSmall, vUv + uTexel * vec2(-1.0, 1.0)).rgb + texture2D(tSmall, vUv + uTexel * vec2(1.0, 1.0)).rgb);\n    gl_FragColor = vec4(s + texture2D(tBig, vUv).rgb, 1.0);\n  }`;\n  var FINAL = `uniform sampler2D tBase, tBloom; uniform vec2 uOut, uBaseTexel; uniform float uScale, uBloom; varying vec2 vUv;\n  void main() {\n    vec2 uv = gl_FragCoord.xy / uOut;\n    vec3 c;\n    if (uScale <= 1.0 || abs(uScale - 2.0) < 0.001) c = texture2D(tBase, uv).rgb;   // 1x exact texel; 2x: one tap = the 2 x 2 box\n    else { vec2 o = uBaseTexel * (uScale * 0.25);\n      c = 0.25 * (texture2D(tBase, uv + vec2(-o.x, -o.y)).rgb + texture2D(tBase, uv + vec2(o.x, -o.y)).rgb\n        + texture2D(tBase, uv + vec2(-o.x, o.y)).rgb + texture2D(tBase, uv + vec2(o.x, o.y)).rgb); }\n    if (uBloom > 0.0) c += uBloom * texture2D(tBloom, uv).rgb;\n    gl_FragColor = vec4(min(c, vec3(1.0)), 1.0);\n  }`;\n  function createPost(THREE, renderer) {\n    const st = { target: null, w: 0, h: 0, samples: -1, chain: null, failed: false, checked: false, frames: 0, last: null, error: null };\n    const geom = new THREE.BufferGeometry();\n    geom.setAttribute(\"position\", new THREE.Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));\n    geom.setAttribute(\"uv\", new THREE.Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2));\n    const mat = (frag, uniforms) => new THREE.ShaderMaterial({\n      vertexShader: VERT,\n      fragmentShader: frag,\n      uniforms,\n      depthTest: false,\n      depthWrite: false,\n      toneMapped: false\n    });\n    const M = {\n      bright: mat(BRIGHT, {\n        tSrc: { value: null },\n        uTexel: { value: new THREE.Vector2() },\n        uTh: { value: 0.7 },\n        uKnee: { value: 0.2 },\n        uWarm: { value: 0.1 },\n        uWarmKnee: { value: 0.15 }\n      }),\n      down: mat(DOWN, { tSrc: { value: null }, uTexel: { value: new THREE.Vector2() } }),\n      up: mat(UP, { tSmall: { value: null }, tBig: { value: null }, uTexel: { value: new THREE.Vector2() } }),\n      final: mat(FINAL, {\n        tBase: { value: null },\n        tBloom: { value: null },\n        uOut: { value: new THREE.Vector2(1, 1) },\n        uBaseTexel: { value: new THREE.Vector2() },\n        uScale: { value: 1 },\n        uBloom: { value: 0 }\n      })\n    };\n    const quad = new THREE.Mesh(geom, M.final);\n    quad.frustumCulled = false;\n    const scene = new THREE.Scene();\n    scene.add(quad);\n    const cam = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n    function makeTarget(w, h, samples) {\n      const t = new THREE.WebGLRenderTarget(w, h, {\n        type: THREE.UnsignedByteType,\n        depthBuffer: true,\n        stencilBuffer: false,\n        samples: samples > 0 ? samples : 0,\n        minFilter: THREE.LinearFilter,\n        magFilter: THREE.LinearFilter,\n        generateMipmaps: false\n      });\n      t.texture.colorSpace = THREE.SRGBColorSpace;\n      t.texture.internalFormat = \"RGBA8\";\n      t.isXRRenderTarget = true;\n      t.texture.name = \"ub-post-scene\";\n      return t;\n    }\n    function plainTarget(w, h, name2) {\n      const t = new THREE.WebGLRenderTarget(Math.max(1, w), Math.max(1, h), {\n        type: THREE.UnsignedByteType,\n        depthBuffer: false,\n        stencilBuffer: false,\n        minFilter: THREE.LinearFilter,\n        magFilter: THREE.LinearFilter,\n        generateMipmaps: false\n      });\n      t.texture.name = name2;\n      return t;\n    }\n    function ensure(w, h, samples, bloom) {\n      if (!st.target || st.samples !== samples) {\n        if (st.target) st.target.dispose();\n        st.target = makeTarget(w, h, samples);\n        st.samples = samples;\n        st.w = w;\n        st.h = h;\n        st.checked = false;\n      } else if (st.w !== w || st.h !== h) {\n        st.target.setSize(w, h);\n        st.w = w;\n        st.h = h;\n      }\n      if (!bloom && st.chain) {\n        st.chain.a.concat(st.chain.b).forEach((t) => t.dispose());\n        st.chain = null;\n      }\n      if (bloom) {\n        const d = (k) => [Math.max(1, Math.round(w / k)), Math.max(1, Math.round(h / k))];\n        const sizes = [d(2), d(4), d(8)];\n        if (!st.chain) st.chain = {\n          a: sizes.map((s, i) => plainTarget(s[0], s[1], \"ub-post-glow-a\" + i)),\n          b: sizes.slice(0, 2).map((s, i) => plainTarget(s[0], s[1], \"ub-post-glow-b\" + i))\n        };\n        sizes.forEach((s, i) => {\n          const t = st.chain.a[i];\n          if (t.width !== s[0] || t.height !== s[1]) t.setSize(s[0], s[1]);\n        });\n        sizes.slice(0, 2).forEach((s, i) => {\n          const t = st.chain.b[i];\n          if (t.width !== s[0] || t.height !== s[1]) t.setSize(s[0], s[1]);\n        });\n      }\n    }\n    function pass(material2, target) {\n      quad.material = material2;\n      renderer.setRenderTarget(target);\n      renderer.render(scene, cam);\n    }\n    function glow(P2) {\n      const A = st.chain.a, B = st.chain.b, src = st.target.texture;\n      M.bright.uniforms.tSrc.value = src;\n      M.bright.uniforms.uTexel.value.set(1 / st.w, 1 / st.h);\n      M.bright.uniforms.uTh.value = P2.threshold;\n      M.bright.uniforms.uKnee.value = P2.knee;\n      M.bright.uniforms.uWarm.value = P2.warm;\n      M.bright.uniforms.uWarmKnee.value = P2.warmKnee;\n      pass(M.bright, A[0]);\n      for (let i = 1; i < 3; i++) {\n        M.down.uniforms.tSrc.value = A[i - 1].texture;\n        M.down.uniforms.uTexel.value.set(1 / A[i - 1].width, 1 / A[i - 1].height);\n        pass(M.down, A[i]);\n      }\n      M.up.uniforms.tSmall.value = A[2].texture;\n      M.up.uniforms.tBig.value = A[1].texture;\n      M.up.uniforms.uTexel.value.set(1 / A[2].width, 1 / A[2].height);\n      pass(M.up, B[1]);\n      M.up.uniforms.tSmall.value = B[1].texture;\n      M.up.uniforms.tBig.value = A[0].texture;\n      M.up.uniforms.uTexel.value.set(1 / B[1].width, 1 / B[1].height);\n      pass(M.up, B[0]);\n      return B[0].texture;\n    }\n    function render(sc, camera, plan, bufW, bufH, bloomParams) {\n      if (st.failed) return false;\n      const prevTarget = renderer.getRenderTarget();\n      try {\n        const w = Math.max(1, Math.round(bufW * plan.scale)), h = Math.max(1, Math.round(bufH * plan.scale));\n        ensure(w, h, plan.samples, plan.bloom > 0);\n        renderer.setRenderTarget(st.target);\n        if (!st.checked) {\n          const gl = renderer.getContext();\n          const ok2 = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n          st.checked = true;\n          if (!ok2) throw new Error(\"post buffer incomplete (\" + w + \"x\" + h + \", \" + plan.samples + \" samples)\");\n        }\n        renderer.render(sc, camera);\n        const bloomTex = plan.bloom > 0 ? glow(bloomParams) : null;\n        const F = M.final.uniforms;\n        F.tBase.value = st.target.texture;\n        F.tBloom.value = bloomTex;\n        F.uBloom.value = bloomTex ? plan.bloom : 0;\n        F.uOut.value.set(bufW, bufH);\n        F.uBaseTexel.value.set(1 / w, 1 / h);\n        F.uScale.value = plan.scale;\n        pass(M.final, null);\n        st.frames++;\n        st.last = { w, h, samples: plan.samples, scale: plan.scale, bloom: plan.bloom };\n        return true;\n      } catch (err) {\n        st.failed = true;\n        st.error = String(err && err.message || err);\n        try {\n          renderer.setRenderTarget(prevTarget);\n        } catch {\n        }\n        release();\n        return false;\n      }\n    }\n    function release() {\n      if (st.target) {\n        st.target.dispose();\n        st.target = null;\n      }\n      if (st.chain) {\n        st.chain.a.concat(st.chain.b).forEach((t) => t.dispose());\n        st.chain = null;\n      }\n      st.samples = -1;\n      st.w = st.h = 0;\n    }\n    function dispose() {\n      release();\n      geom.dispose();\n      Object.keys(M).forEach((k) => M[k].dispose());\n    }\n    function info() {\n      const l = st.last;\n      return {\n        failed: st.failed,\n        error: st.error,\n        frames: st.frames,\n        allocated: !!st.target,\n        width: l ? l.w : 0,\n        height: l ? l.h : 0,\n        samples: l ? l.samples : 0,\n        scale: l ? l.scale : 1,\n        glowAllocated: !!st.chain,\n        bytes: st.target ? postBytes(st.w, st.h, st.samples, !!st.chain) : 0\n      };\n    }\n    return {\n      render,\n      release,\n      dispose,\n      info,\n      failed: () => st.failed,\n      /* for checks: break the buffer on purpose (the fallback path) */\n      _fail: (why) => {\n        st.failed = true;\n        st.error = why || \"forced\";\n        release();\n      }\n    };\n  }\n\n  // v2/src/render/geometry.js\n  function unitBasis(u) {\n    const xf = unitXf(u);\n    const o = xf.p([0, 0, 0]);\n    const ex = xf.p([1, 0, 0]), ey = xf.p([0, 1, 0]), ez = xf.p([0, 0, 1]);\n    return [\n      ex[0] - o[0],\n      ey[0] - o[0],\n      ez[0] - o[0],\n      o[0],\n      ex[1] - o[1],\n      ey[1] - o[1],\n      ez[1] - o[1],\n      o[1],\n      ex[2] - o[2],\n      ey[2] - o[2],\n      ez[2] - o[2],\n      o[2]\n    ];\n  }\n  function invBasis(b) {\n    const r = [b[0], b[4], b[8], b[1], b[5], b[9], b[2], b[6], b[10]];\n    const o = [b[3], b[7], b[11]];\n    return { r, t: [\n      -(r[0] * o[0] + r[1] * o[1] + r[2] * o[2]),\n      -(r[3] * o[0] + r[4] * o[1] + r[5] * o[2]),\n      -(r[6] * o[0] + r[7] * o[1] + r[8] * o[2])\n    ] };\n  }\n  var POSE = { x: 1, y: 1, z: 1, dispX: 1, dispY: 1, dispZ: 1, id: 1 };\n  function unitShapeKey(u) {\n    const keys2 = Object.keys(u).sort();\n    let s = \"\";\n    for (let i = 0; i < keys2.length; i++) {\n      const k = keys2[i];\n      if (POSE[k]) continue;\n      const v = u[k];\n      if (v === void 0 || typeof v === \"function\") continue;\n      s += k + \"=\" + JSON.stringify(v) + \";\";\n    }\n    s += \"|ex=\" + explodeMM(u);\n    const leaves = u.leafOpen && u.leafOpen.some && u.leafOpen.some(Boolean);\n    if (u.door && (u.doorOpen || leaves)) s += \"|sw=\" + doorSwingRad(u, 1) + \",\" + doorSwingRad(u, -1);\n    return s;\n  }\n  function bucketize(d, inv) {\n    const out = /* @__PURE__ */ new Map();\n    const meta = d.meta;\n    const nTri = d.length / 36 | 0;\n    if (!meta || meta.length !== nTri * 2)\n      throw new Error(\"render: \\u0443 \\u0432\\u044B\\u0432\\u043E\\u0434\\u0430 \\u044D\\u043C\\u0438\\u0442\\u0442\\u0435\\u0440\\u0430 \\u043D\\u0435\\u0442 d.meta \\u043D\\u0430 \\u043A\\u0430\\u0436\\u0434\\u044B\\u0439 \\u0442\\u0440\\u0435\\u0443\\u0433\\u043E\\u043B\\u044C\\u043D\\u0438\\u043A\");\n    const r = inv ? inv.r : null, t = inv ? inv.t : null;\n    const lin = /* @__PURE__ */ new Map();\n    function L(c) {\n      let v = lin.get(c);\n      if (v === void 0) {\n        v = srgbToLinear(c);\n        lin.set(c, v);\n      }\n      return v;\n    }\n    for (let tri = 0; tri < nTri; tri++) {\n      const cls = meta[tri * 2], role = meta[tri * 2 + 1];\n      const st = classStyle(cls);\n      if (st.skip) continue;\n      const base = tri * 36;\n      const tex = d[base + 11] > 0.5 ? 1 : 0;\n      const key = cls + \":\" + tex + \":\" + role;\n      let b = out.get(key);\n      if (!b) {\n        b = {\n          cls,\n          tex,\n          role,\n          pos: [],\n          nrm: [],\n          col: [],\n          uv: [],\n          over: st.color != null ? hexToLinear(st.color) : null\n        };\n        out.set(key, b);\n      }\n      for (let v = 0; v < 3; v++) {\n        const o = base + v * 12;\n        const px = d[o], py = d[o + 1], pz = d[o + 2], nx = d[o + 3], ny = d[o + 4], nz = d[o + 5];\n        if (r) {\n          b.pos.push(\n            r[0] * px + r[1] * py + r[2] * pz + t[0],\n            r[3] * px + r[4] * py + r[5] * pz + t[1],\n            r[6] * px + r[7] * py + r[8] * pz + t[2]\n          );\n          b.nrm.push(r[0] * nx + r[1] * ny + r[2] * nz, r[3] * nx + r[4] * ny + r[5] * nz, r[6] * nx + r[7] * ny + r[8] * nz);\n        } else {\n          b.pos.push(px, py, pz);\n          b.nrm.push(nx, ny, nz);\n        }\n        if (b.over) b.col.push(b.over[0], b.over[1], b.over[2]);\n        else b.col.push(L(d[o + 6]), L(d[o + 7]), L(d[o + 8]));\n        if (tex) b.uv.push(d[o + 9], d[o + 10]);\n        else b.uv.push(0, 0);\n      }\n    }\n    return out;\n  }\n  function toGeometry(THREE, b) {\n    const g2 = new THREE.BufferGeometry();\n    g2.setAttribute(\"position\", new THREE.BufferAttribute(new Float32Array(b.pos), 3));\n    g2.setAttribute(\"normal\", new THREE.BufferAttribute(new Float32Array(b.nrm), 3));\n    g2.setAttribute(\"color\", new THREE.BufferAttribute(new Float32Array(b.col), 3));\n    g2.setAttribute(\"uv\", new THREE.BufferAttribute(new Float32Array(b.uv), 2));\n    g2.computeBoundingSphere();\n    g2.computeBoundingBox();\n    return g2;\n  }\n  function frontToLocal(fr, inv) {\n    return xformFront(fr, inv.r, inv.t);\n  }\n  function frontToWorld(fr, basis) {\n    return xformFront(\n      fr,\n      [basis[0], basis[1], basis[2], basis[4], basis[5], basis[6], basis[8], basis[9], basis[10]],\n      [basis[3], basis[7], basis[11]]\n    );\n  }\n  function xformFront(fr, r, t) {\n    const lo = [Infinity, Infinity, Infinity], hi = [-Infinity, -Infinity, -Infinity];\n    for (let i = 0; i < 2; i++) for (let j = 0; j < 2; j++) for (let k = 0; k < 2; k++) {\n      const x = i ? fr.x1 : fr.x0, y = j ? fr.y1 : fr.y0, z = k ? fr.z1 : fr.z0;\n      const p = [r[0] * x + r[1] * y + r[2] * z + t[0], r[3] * x + r[4] * y + r[5] * z + t[1], r[6] * x + r[7] * y + r[8] * z + t[2]];\n      for (let a = 0; a < 3; a++) {\n        if (p[a] < lo[a]) lo[a] = p[a];\n        if (p[a] > hi[a]) hi[a] = p[a];\n      }\n    }\n    const n0 = [0, 0, 0];\n    n0[fr.axis] = fr.sign;\n    const n = [r[0] * n0[0] + r[1] * n0[1] + r[2] * n0[2], r[3] * n0[0] + r[4] * n0[1] + r[5] * n0[2], r[6] * n0[0] + r[7] * n0[1] + r[8] * n0[2]];\n    const ax = Math.abs(n[0]) > 0.5 ? 0 : Math.abs(n[1]) > 0.5 ? 1 : 2;\n    const sign = n[ax] > 0 ? 1 : -1;\n    const out = { x0: lo[0], x1: hi[0], y0: lo[1], y1: hi[1], z0: lo[2], z1: hi[2] };\n    out.axis = ax;\n    out.sign = sign;\n    out.face = sign > 0 ? hi[ax] : lo[ax];\n    out.back = sign > 0 ? lo[ax] : hi[ax];\n    out.closed = fr.closed;\n    return out;\n  }\n\n  // v2/src/render/environment.js\n  var ENVIRONMENTS = Object.freeze([\"neutral\", \"universe\"]);\n  var ENV_PREF_KEY = \"ub-cabinet-lab:environment\";\n  var ENV_LABEL = Object.freeze({ neutral: \"Neutral\", universe: \"Universe\" });\n  function envName(v) {\n    return v === \"universe\" ? \"universe\" : \"neutral\";\n  }\n  var DEG = Math.PI / 180;\n  function dirOf(azDeg, elDeg) {\n    const a = azDeg * DEG, e = elDeg * DEG;\n    return [Math.sin(a) * Math.cos(e), Math.sin(e), -Math.cos(a) * Math.cos(e)];\n  }\n  var UNIVERSE = Object.freeze({\n    skyUrl: \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-04/7329b6f9616132d6-ub-universe-sky-1774.jpg\",\n    earthUrl: \"https://chat.uniboards.co.uk/api/uploads/dev-files/2026-10-04/2f8e8722f112621f-ub-universe-earth-1024.jpg\",\n    skyAz0: 0,\n    // the panorama's turn about the vertical (deg)\n    sun: Object.freeze({ az: -135, el: 13, radius: 2.6, halo: 9 }),\n    // angular radii (deg)\n    earth: Object.freeze({ az: -20, el: -6, radius: 7.5, faceLon: 10, tilt: 23.4 }),\n    /* the panorama's largest galaxy in the artwork (pixel 355, 210 of 1774 x 887) - for the checks */\n    heroGalaxyUv: Object.freeze([355 / 1774, 1 - 210 / 887])\n  });\n  var SUN_DIR = Object.freeze(dirOf(UNIVERSE.sun.az, UNIVERSE.sun.el));\n  var EARTH_DIR = Object.freeze(dirOf(UNIVERSE.earth.az, UNIVERSE.earth.el));\n  var SKY_VS = `\nvarying vec3 vDir;\nvoid main() {\n  vDir = position;\n  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n  gl_Position.z = gl_Position.w * 0.99999;\n}`;\n  var SKY_FS = `\nuniform sampler2D map;\nuniform float az0;\nuniform float gain;\nvarying vec3 vDir;\nvoid main() {\n  vec3 d = normalize(vDir);\n  float az = atan(d.x, -d.z);\n  float u = 0.5 + (az - az0) / 6.283185307179586;\n  float v = 0.5 + asin(clamp(d.y, -1.0, 1.0)) / 3.141592653589793;\n  float s = fract(1.0 - u);\n  float t = 1.0 - v;\n  /* the wrap column: take the derivative of the copy of s that does not jump there */\n  float s2 = fract(s + 0.5) - 0.5;\n  vec2 gx = vec2(dFdx(s), dFdx(t)), gy = vec2(dFdy(s), dFdy(t));\n  float ax = dFdx(s2), ay = dFdy(s2);\n  if (abs(ax) + abs(ay) < abs(gx.x) + abs(gy.x)) { gx.x = ax; gy.x = ay; }\n  vec3 c = textureGrad(map, vec2(s, t), gx, gy).rgb * gain;\n  gl_FragColor = vec4(c, 1.0);\n  #include <colorspace_fragment>\n}`;\n  var EARTH_VS = `\nvarying vec2 vUv;\nvarying vec3 vN;\nvarying vec3 vW;\nvoid main() {\n  vUv = uv;\n  vN = normalize(mat3(modelMatrix) * normal);\n  vec4 w = modelMatrix * vec4(position, 1.0);\n  vW = w.xyz;\n  gl_Position = projectionMatrix * viewMatrix * w;\n  gl_Position.z = gl_Position.w * 0.99999;\n}`;\n  var EARTH_FS = `\nuniform sampler2D map;\nuniform vec3 sunDir;\nuniform float hasMap;\nuniform vec3 base;\nvarying vec2 vUv;\nvarying vec3 vN;\nvarying vec3 vW;\nvoid main() {\n  vec3 N = normalize(vN);\n  vec3 V = normalize(cameraPosition - vW);\n  float ndl = dot(N, sunDir);\n  vec3 alb = hasMap > 0.5 ? texture2D(map, vUv).rgb : base;\n  float day = smoothstep(-0.06, 0.18, ndl);\n  vec3 col = alb * (0.012 + 1.6 * max(ndl, 0.0) * day + 0.06 * day);\n  float rim = pow(1.0 - max(dot(N, V), 0.0), 2.6);\n  col += vec3(0.28, 0.52, 1.0) * rim * (0.03 + 0.85 * smoothstep(-0.25, 0.35, ndl));\n  gl_FragColor = vec4(col, 1.0);\n  #include <colorspace_fragment>\n}`;\n  var SUN_FS = `\nvarying vec2 vUv;\nvarying vec3 vN;\nvarying vec3 vW;\nvoid main() {\n  vec3 N = normalize(vN);\n  vec3 V = normalize(cameraPosition - vW);\n  float mu = max(dot(N, V), 0.0);\n  float limb = pow(mu, 0.55);\n  vec3 col = mix(vec3(1.0, 0.36, 0.04), vec3(1.0, 0.93, 0.70), limb);\n  gl_FragColor = vec4(col, 1.0);\n  #include <colorspace_fragment>\n}`;\n  var HALO_VS = `\nvarying vec2 vUv;\nvoid main() {\n  vUv = uv;\n  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n  gl_Position.z = gl_Position.w * 0.99999;\n}`;\n  var HALO_FS = `\nuniform float inner;\nvarying vec2 vUv;\nvoid main() {\n  float r = length(vUv - 0.5) * 2.0;\n  float x = max(r - inner, 0.0) / max(1.0 - inner, 1e-3);\n  float a = (1.0 - smoothstep(0.0, 1.0, x)) * (0.55 * exp(-x * 5.0) + 0.12 * (1.0 - x));\n  gl_FragColor = vec4(vec3(1.0, 0.62, 0.22) * a, a);\n}`;\n  var SKY_R = 1e3;\n  var SKY_ORDER = Object.freeze({ sky: -40, halo: -39, sun: -38, earth: -37 });\n  function createEnvironment(THREE, o) {\n    o = o || {};\n    const headless = !!o.headless;\n    const st = {\n      active: \"neutral\",\n      requested: \"neutral\",\n      loading: null,\n      error: null,\n      group: null,\n      parts: null,\n      images: { sky: null, earth: null },\n      tex: { sky: null, earth: null },\n      loads: 0,\n      uploads: 0\n    };\n    function loadTex(url) {\n      return new Promise((resolve, reject) => {\n        new THREE.TextureLoader().setCrossOrigin(\"anonymous\").load(\n          url,\n          resolve,\n          void 0,\n          () => reject(new Error(\"could not load \" + url))\n        );\n      });\n    }\n    function build3() {\n      if (st.group) return st.group;\n      const g2 = new THREE.Group();\n      g2.name = \"environment-universe\";\n      g2.userData.environment = \"universe\";\n      const skyGeom = new THREE.SphereGeometry(1, 32, 16);\n      const skyMat = new THREE.ShaderMaterial({\n        name: \"universe-sky\",\n        vertexShader: SKY_VS,\n        fragmentShader: SKY_FS,\n        uniforms: { map: { value: st.tex.sky }, az0: { value: UNIVERSE.skyAz0 * DEG }, gain: { value: 1 } },\n        side: THREE.BackSide,\n        depthTest: false,\n        depthWrite: false,\n        toneMapped: false\n      });\n      const sky = new THREE.Mesh(skyGeom, skyMat);\n      sky.name = \"universe-sky\";\n      sky.renderOrder = SKY_ORDER.sky;\n      sky.frustumCulled = false;\n      const earthGeom = new THREE.SphereGeometry(1, 48, 24);\n      const earthMat = new THREE.ShaderMaterial({\n        name: \"universe-earth\",\n        vertexShader: EARTH_VS,\n        fragmentShader: EARTH_FS,\n        uniforms: {\n          map: { value: st.tex.earth },\n          hasMap: { value: st.tex.earth ? 1 : 0 },\n          base: { value: new THREE.Color(2903942) },\n          sunDir: { value: new THREE.Vector3(SUN_DIR[0], SUN_DIR[1], SUN_DIR[2]) }\n        },\n        depthTest: false,\n        depthWrite: false,\n        toneMapped: false\n      });\n      const earth = new THREE.Mesh(earthGeom, earthMat);\n      earth.name = \"universe-earth\";\n      earth.renderOrder = SKY_ORDER.earth;\n      earth.frustumCulled = false;\n      orientEarth(earth);\n      const sunGeom = new THREE.SphereGeometry(1, 24, 12);\n      const sunMat = new THREE.ShaderMaterial({\n        name: \"universe-sun\",\n        vertexShader: EARTH_VS,\n        fragmentShader: SUN_FS,\n        depthTest: false,\n        depthWrite: false,\n        toneMapped: false\n      });\n      const sun = new THREE.Mesh(sunGeom, sunMat);\n      sun.name = \"universe-sun\";\n      sun.renderOrder = SKY_ORDER.sun;\n      sun.frustumCulled = false;\n      const haloGeom = new THREE.PlaneGeometry(2, 2);\n      const haloMat = new THREE.ShaderMaterial({\n        name: \"universe-sun-halo\",\n        vertexShader: HALO_VS,\n        fragmentShader: HALO_FS,\n        uniforms: { inner: { value: UNIVERSE.sun.radius / UNIVERSE.sun.halo * 0.85 } },\n        blending: THREE.AdditiveBlending,\n        depthTest: false,\n        depthWrite: false,\n        toneMapped: false\n      });\n      haloMat.transparent = false;\n      const halo = new THREE.Mesh(haloGeom, haloMat);\n      halo.name = \"universe-sun-halo\";\n      halo.renderOrder = SKY_ORDER.halo;\n      halo.frustumCulled = false;\n      for (const m of [sky, earth, sun, halo]) {\n        m.castShadow = false;\n        m.receiveShadow = false;\n        m.matrixAutoUpdate = true;\n      }\n      g2.add(sky, halo, sun, earth);\n      st.parts = { sky, earth, sun, halo, geoms: [skyGeom, earthGeom, sunGeom, haloGeom], mats: [skyMat, earthMat, sunMat, haloMat] };\n      st.group = g2;\n      place2(SKY_R);\n      return g2;\n    }\n    function orientEarth(earth) {\n      const lon = (UNIVERSE.earth.faceLon + 180) / 360;\n      const a = new THREE.Vector3(-Math.cos(2 * Math.PI * lon), 0, Math.sin(2 * Math.PI * lon));\n      const ny = new THREE.Vector3(0, 1, 0);\n      const lz = new THREE.Vector3().crossVectors(a, ny);\n      const f = new THREE.Vector3(-EARTH_DIR[0], -EARTH_DIR[1], -EARTH_DIR[2]);\n      const up = new THREE.Vector3(0, 1, 0).addScaledVector(f, -f.y).normalize();\n      up.applyAxisAngle(f, -UNIVERSE.earth.tilt * DEG);\n      const wz = new THREE.Vector3().crossVectors(f, up);\n      const L = new THREE.Matrix4().makeBasis(a, ny, lz), W2 = new THREE.Matrix4().makeBasis(f, up, wz);\n      earth.quaternion.setFromRotationMatrix(W2.multiply(L.transpose()));\n    }\n    function place2(R4) {\n      const p = st.parts;\n      if (!p) return;\n      p.sky.scale.setScalar(R4);\n      const D2 = R4 * 0.9;\n      p.earth.position.set(EARTH_DIR[0] * D2, EARTH_DIR[1] * D2, EARTH_DIR[2] * D2);\n      p.earth.scale.setScalar(D2 * Math.sin(UNIVERSE.earth.radius * DEG));\n      p.sun.position.set(SUN_DIR[0] * D2, SUN_DIR[1] * D2, SUN_DIR[2] * D2);\n      p.sun.scale.setScalar(D2 * Math.sin(UNIVERSE.sun.radius * DEG));\n      p.halo.position.copy(p.sun.position);\n      p.halo.scale.setScalar(D2 * Math.tan(UNIVERSE.sun.halo * DEG));\n      p.halo.quaternion.setFromUnitVectors(new THREE.Vector3(0, 0, 1), new THREE.Vector3(-SUN_DIR[0], -SUN_DIR[1], -SUN_DIR[2]));\n      st.R = R4;\n    }\n    function follow(camera) {\n      if (!st.group || !st.group.parent || !camera) return;\n      st.group.position.copy(camera.position);\n    }\n    function applyTextures() {\n      if (!st.parts) return;\n      st.parts.sky.material.uniforms.map.value = st.tex.sky;\n      st.parts.earth.material.uniforms.map.value = st.tex.earth;\n      st.parts.earth.material.uniforms.hasMap.value = st.tex.earth ? 1 : 0;\n    }\n    function prepare() {\n      if (headless) {\n        build3();\n        return Promise.resolve();\n      }\n      if (st.tex.sky && st.tex.earth) {\n        build3();\n        applyTextures();\n        return Promise.resolve();\n      }\n      if (st.loading) return st.loading;\n      const r = o.renderer && o.renderer();\n      const maxAniso = r ? Math.min(4, r.capabilities.getMaxAnisotropy()) : 1;\n      st.loads++;\n      st.loading = Promise.all([loadTex(UNIVERSE.skyUrl), loadTex(UNIVERSE.earthUrl)]).then(([sky, earth]) => {\n        st.loading = null;\n        if (st.disposed) {\n          sky.dispose();\n          earth.dispose();\n          throw new Error(\"disposed\");\n        }\n        sky.colorSpace = THREE.SRGBColorSpace;\n        sky.wrapS = THREE.RepeatWrapping;\n        sky.wrapT = THREE.ClampToEdgeWrapping;\n        sky.generateMipmaps = true;\n        sky.minFilter = THREE.LinearMipmapLinearFilter;\n        sky.anisotropy = maxAniso;\n        earth.colorSpace = THREE.SRGBColorSpace;\n        earth.wrapS = THREE.RepeatWrapping;\n        earth.anisotropy = maxAniso;\n        st.tex.sky = sky;\n        st.tex.earth = earth;\n        build3();\n        applyTextures();\n      }, (err) => {\n        st.loading = null;\n        throw err;\n      });\n      return st.loading;\n    }\n    function set(name2) {\n      name2 = envName(name2);\n      st.requested = name2;\n      if (name2 === \"neutral\") {\n        if (st.active !== \"neutral\") release();\n        st.error = null;\n        return Promise.resolve(\"neutral\");\n      }\n      if (st.active === \"universe\") return Promise.resolve(\"universe\");\n      st.error = null;\n      return prepare().then(() => {\n        if (st.disposed || st.requested !== \"universe\") return st.active;\n        st.active = \"universe\";\n        if (o.scene && st.group && st.group.parent !== o.scene) o.scene.add(st.group);\n        if (o.onReady) o.onReady(\"universe\");\n        return \"universe\";\n      }, (err) => {\n        st.error = String(err && err.message || err);\n        if (st.requested === \"universe\") st.requested = \"neutral\";\n        if (o.onError) o.onError(\"universe\", err);\n        return st.active;\n      });\n    }\n    function release() {\n      st.active = \"neutral\";\n      if (st.group && st.group.parent) st.group.parent.remove(st.group);\n      if (headless || !st.parts) return;\n      st.parts.geoms.forEach((g2) => g2.dispose());\n      st.parts.mats.forEach((m) => m.dispose());\n      if (st.tex.sky) st.tex.sky.dispose();\n      if (st.tex.earth) st.tex.earth.dispose();\n    }\n    function dispose() {\n      release();\n      st.disposed = true;\n      st.tex.sky = null;\n      st.tex.earth = null;\n      st.group = null;\n      st.parts = null;\n    }\n    function restored() {\n      if (st.tex.sky) st.tex.sky.needsUpdate = true;\n      if (st.tex.earth) st.tex.earth.needsUpdate = true;\n    }\n    return {\n      set,\n      follow,\n      dispose,\n      release,\n      restored,\n      active: () => st.active,\n      group: () => st.group,\n      state: () => ({\n        active: st.active,\n        requested: st.requested,\n        loading: !!st.loading,\n        error: st.error,\n        loads: st.loads,\n        textures: (st.tex.sky ? 1 : 0) + (st.tex.earth ? 1 : 0),\n        textureBytes: [st.tex.sky, st.tex.earth].reduce((s, t) => s + (t && t.image ? Math.round(t.image.width * t.image.height * 4 * 4 / 3) : 0), 0)\n      })\n    };\n  }\n\n  // v2/src/render/evening-glow.js\n  function surfacesOf(units, kitchen, basisOf2) {\n    const out = [];\n    let runs = [];\n    try {\n      runs = worktopRuns(units, kitchen) || [];\n    } catch {\n      runs = [];\n    }\n    if (runs.length) {\n      for (const r of runs) for (const bx2 of worktopBoxes(r)) out.push({ x0: bx2.x0, x1: bx2.x1, z0: bx2.z0, z1: bx2.z1, y: bx2.y1 });\n      return out;\n    }\n    for (const u of units || []) {\n      if (!hasTop(u)) continue;\n      const b = basisOf2(u), E = unitEnvelope(u), top = b[7] + (u.h || 720);\n      const rects = isLPlan(u) ? [[0, E.LX, 0, u.d], [E.LX - u.d, E.LX, 0, E.LZ]] : [[0, E.LX, 0, E.LZ]];\n      for (const [x0, x1, z0, z1] of rects) {\n        const R4 = worldRect(b, x0, x1, z0, z1);\n        out.push(Object.assign(R4, { y: top }));\n      }\n    }\n    return out;\n  }\n  function worldPt(b, x, y, z) {\n    return [b[0] * x + b[1] * y + b[2] * z + b[3], b[4] * x + b[5] * y + b[6] * z + b[7], b[8] * x + b[9] * y + b[10] * z + b[11]];\n  }\n  function worldRect(b, x0, x1, z0, z1) {\n    const ps = [[x0, z0], [x1, z0], [x1, z1], [x0, z1]].map(([x, z]) => worldPt(b, x, 0, z));\n    return { x0: Math.min(...ps.map((p) => p[0])), x1: Math.max(...ps.map((p) => p[0])), z0: Math.min(...ps.map((p) => p[2])), z1: Math.max(...ps.map((p) => p[2])) };\n  }\n  function onWall(b, p, q) {\n    let R4;\n    try {\n      R4 = roomSize();\n    } catch {\n      return false;\n    }\n    const w = (v) => [b[0] * v[0] + b[1] * v[1] + b[2] * v[2] + b[3], b[8] * v[0] + b[9] * v[1] + b[10] * v[2] + b[11]];\n    const P2 = w(p), Q = w(q), near2 = (a, c) => Math.abs(a - c) < 40;\n    return near2(P2[0], 0) && near2(Q[0], 0) || near2(P2[0], R4.width) && near2(Q[0], R4.width) || near2(P2[1], 0) && near2(Q[1], 0) || near2(P2[1], R4.depth) && near2(Q[1], R4.depth);\n  }\n  var MAX_LIGHTS = 8;\n  var WARM_LIGHT = 16757862;\n  var LED = 16769712;\n  var WASH = [255, 196, 128];\n  var KICK = [255, 164, 84];\n  function gradient(THREE, doc2, stops, rgb4) {\n    const cv = doc2.createElement(\"canvas\");\n    cv.width = 8;\n    cv.height = 128;\n    const g2 = cv.getContext(\"2d\"), gr = g2.createLinearGradient(0, 0, 0, 128);\n    for (const [at, a] of stops) gr.addColorStop(at, \"rgba(\" + rgb4.join(\",\") + \",\" + a + \")\");\n    g2.fillStyle = gr;\n    g2.fillRect(0, 0, 8, 128);\n    const t = new THREE.CanvasTexture(cv);\n    if (\"colorSpace\" in t && THREE.SRGBColorSpace) t.colorSpace = THREE.SRGBColorSpace;\n    return t;\n  }\n  function createEveningGlow(THREE, doc2) {\n    const group = new THREE.Group();\n    group.name = \"evening-glow\";\n    group.visible = false;\n    const ledMat = new THREE.MeshBasicMaterial({ color: LED, transparent: true, opacity: 0, depthWrite: false, toneMapped: false });\n    const add = { transparent: true, opacity: 0, blending: THREE.AdditiveBlending, depthWrite: false, toneMapped: false, side: THREE.DoubleSide };\n    const washMat = new THREE.MeshBasicMaterial(Object.assign({ map: gradient(THREE, doc2, [[0, 0.95], [0.3, 0.42], [1, 0]], WASH) }, add));\n    const kickMat = new THREE.MeshBasicMaterial(Object.assign({ map: gradient(THREE, doc2, [[0, 0.9], [0.35, 0.32], [1, 0]], KICK) }, add));\n    const poolMat = new THREE.MeshBasicMaterial(Object.assign({ map: gradient(THREE, doc2, [[0, 0.95], [0.4, 0.38], [1, 0]], WASH) }, add));\n    const geoms = [];\n    const lights = [];\n    let sig = null, count = { led: 0, kick: 0, corner: 0, lights: 0, pools: 0 };\n    function pool(R4, y, o, f, depth) {\n      const g2 = new THREE.BufferGeometry(), P2 = [[R4.x0, R4.z0], [R4.x1, R4.z0], [R4.x1, R4.z1], [R4.x0, R4.z1]];\n      const v = (p) => Math.max(0, Math.min(1, 1 - ((p[0] - o[0]) * f[0] + (p[1] - o[1]) * f[1]) / depth));\n      const pos = [], uv = [];\n      for (const k of [0, 1, 2, 0, 2, 3]) {\n        pos.push(P2[k][0], y, P2[k][1]);\n        uv.push(0.5, v(P2[k]));\n      }\n      g2.setAttribute(\"position\", new THREE.Float32BufferAttribute(pos, 3));\n      g2.setAttribute(\"uv\", new THREE.Float32BufferAttribute(uv, 2));\n      geoms.push(g2);\n      const m = new THREE.Mesh(g2, poolMat);\n      m.renderOrder = 3;\n      m.raycast = () => {\n      };\n      group.add(m);\n      count.pools++;\n    }\n    function poolsUnder(b, surfaces, x0, x1, z0, z1, fl, bottomY) {\n      const R4 = worldRect(b, x0, x1, z0, z1);\n      const f = [b[0] * fl[0] + b[2] * fl[1], b[8] * fl[0] + b[10] * fl[1]], n = Math.hypot(f[0], f[1]) || 1;\n      f[0] /= n;\n      f[1] /= n;\n      const cs = [[x0, z0], [x1, z0], [x1, z1], [x0, z1]].map(([x, z]) => worldPt(b, x, 0, z)).map((p) => [p[0], p[2]]);\n      const o = cs.reduce((a, c) => c[0] * f[0] + c[1] * f[1] < a[0] * f[0] + a[1] * f[1] ? c : a);\n      const depth = Math.abs((x1 - x0) * fl[0]) + Math.abs((z1 - z0) * fl[1]);\n      for (const S2 of surfaces) {\n        if (!(S2.y < bottomY - 50)) continue;\n        const I = { x0: Math.max(R4.x0, S2.x0), x1: Math.min(R4.x1, S2.x1), z0: Math.max(R4.z0, S2.z0), z1: Math.min(R4.z1, S2.z1) };\n        if (I.x1 - I.x0 < 20 || I.z1 - I.z0 < 20) continue;\n        pool(I, S2.y + 1.5, o, f, depth);\n      }\n    }\n    function quad(mat, a, b, c, d) {\n      const g2 = new THREE.BufferGeometry();\n      g2.setAttribute(\"position\", new THREE.Float32BufferAttribute([...a, ...b, ...c, ...a, ...c, ...d], 3));\n      g2.setAttribute(\"uv\", new THREE.Float32BufferAttribute([0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0], 2));\n      geoms.push(g2);\n      const m = new THREE.Mesh(g2, mat);\n      m.renderOrder = 3;\n      m.castShadow = false;\n      m.receiveShadow = false;\n      m.raycast = () => {\n      };\n      return m;\n    }\n    function box3(mat, x0, x1, y0, y1, z0, z1) {\n      const g2 = new THREE.BoxGeometry(x1 - x0, y1 - y0, z1 - z0);\n      g2.translate((x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2);\n      geoms.push(g2);\n      const m = new THREE.Mesh(g2, mat);\n      m.renderOrder = 3;\n      m.castShadow = false;\n      m.receiveShadow = false;\n      m.raycast = () => {\n      };\n      return m;\n    }\n    function clear() {\n      lights.length = 0;\n      for (const c of group.children.slice()) group.remove(c);\n      for (const g2 of geoms) g2.dispose();\n      geoms.length = 0;\n      count = { led: 0, kick: 0, corner: 0, lights: 0, pools: 0 };\n    }\n    function sync(units, basisOf2, poseSig, kitchen) {\n      if (poseSig === sig) return;\n      sig = poseSig;\n      clear();\n      let surfaces = [];\n      try {\n        surfaces = surfacesOf(units, kitchen, basisOf2);\n      } catch {\n        surfaces = [];\n      }\n      const POOL = 620;\n      const cands = [];\n      for (const u of units || []) {\n        if (!u || !(u.w > 0) || !(u.d > 0)) continue;\n        const fam = u.family || familyOf(u.type);\n        const E = unitEnvelope(u), W2 = E.LX, D2 = E.LZ;\n        const g2 = new THREE.Group();\n        g2.matrixAutoUpdate = false;\n        const b = basisOf2(u);\n        g2.matrix.set(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], 0, 0, 0, 1);\n        const fy = -LEG_H + 2, IN = 70, OUT = 260;\n        if (isLPlan(u)) {\n          const A1 = W2, A2 = D2, Dd = u.d, ix = A1 - Dd;\n          if (!(ix > 0) || !(A2 > Dd)) continue;\n          if (fam === \"wall\") {\n            g2.add(box3(ledMat, 30, ix - 30, -6, -1, Dd - 60, Dd - 44));\n            g2.add(box3(ledMat, ix + 44, ix + 60, -6, -1, Dd + 30, A2 - 30));\n            const y0 = -2, y1 = -Math.min(650, Math.max(200, (u.y || 0) + LEG_H - 40));\n            if (onWall(b, [0, 0, 0], [A1, 0, 0])) g2.add(quad(washMat, [0, y0, 3], [A1 - 3, y0, 3], [A1 - 3, y1, 3], [0, y1, 3]));\n            if (onWall(b, [A1, 0, 0], [A1, 0, A2])) g2.add(quad(washMat, [A1 - 3, y0, A2], [A1 - 3, y0, 3], [A1 - 3, y1, 3], [A1 - 3, y1, A2]));\n            poolsUnder(b, surfaces, 0, A1, 0, POOL, [0, 1], b[7]);\n            poolsUnder(b, surfaces, A1 - POOL, A1, POOL, A2, [-1, 0], b[7]);\n            cands.push({ g: g2, p: [ix / 2, -60, Dd - 40], kind: \"wall\" }, { g: g2, p: [ix + 40, -60, (Dd + A2) / 2], kind: \"wall\" });\n            count.led++;\n            count.corner++;\n          } else {\n            const c0 = [ix + IN, fy, Dd - IN], c1 = [ix - OUT, fy, Dd + OUT];\n            g2.add(quad(kickMat, [0, fy, Dd - IN], c0, c1, [0, fy, Dd + OUT]));\n            g2.add(quad(kickMat, [ix + IN, fy, A2], c0, c1, [ix - OUT, fy, A2]));\n            cands.push({ g: g2, p: [ix / 2, -LEG_H + 40, Dd + 60], kind: \"kick\" }, { g: g2, p: [ix - 60, -LEG_H + 40, (Dd + A2) / 2], kind: \"kick\" });\n            count.kick++;\n            count.corner++;\n          }\n          g2.updateMatrixWorld(true);\n          group.add(g2);\n          continue;\n        }\n        if (fam === \"wall\") {\n          g2.add(box3(ledMat, 30, W2 - 30, -6, -1, D2 - 60, D2 - 44));\n          const y0 = -2, y1 = -Math.min(650, Math.max(200, (u.y || 0) + LEG_H - 40));\n          if (onWall(b, [0, 0, 0], [W2, 0, 0])) g2.add(quad(washMat, [0, y0, 3], [W2, y0, 3], [W2, y1, 3], [0, y1, 3]));\n          poolsUnder(b, surfaces, 0, W2, 0, POOL, [0, 1], b[7]);\n          cands.push({ g: g2, p: [W2 / 2, -60, D2 - 40], kind: \"wall\" });\n          count.led++;\n        } else {\n          const z0 = Math.max(0, D2 - IN);\n          g2.add(quad(kickMat, [0, fy, z0], [W2, fy, z0], [W2, fy, D2 + OUT], [0, fy, D2 + OUT]));\n          cands.push({ g: g2, p: [W2 / 2, -LEG_H + 40, D2 + 60], kind: \"kick\" });\n          count.kick++;\n        }\n        g2.updateMatrixWorld(true);\n        group.add(g2);\n      }\n      placeLights(cands);\n    }\n    function placeLights(cands) {\n      const walls = cands.filter((c) => c.kind === \"wall\"), kicks = cands.filter((c) => c.kind === \"kick\");\n      const nW = Math.min(walls.length, kicks.length ? Math.max(MAX_LIGHTS - Math.min(kicks.length, 3), Math.ceil(MAX_LIGHTS / 2)) : MAX_LIGHTS);\n      const nK = Math.min(kicks.length, MAX_LIGHTS - nW);\n      const spread = (list, n) => {\n        const out = [];\n        if (n <= 0) return out;\n        for (let i = 0; i < n; i++) out.push(list[Math.floor((i + 0.5) * list.length / n)]);\n        return out;\n      };\n      const thin = (n, len) => len > n ? len / n : 1;\n      for (const [list, n, kind] of [[walls, nW, \"wall\"], [kicks, nK, \"kick\"]]) {\n        const k = thin(n, list.length);\n        for (const c of spread(list, n)) {\n          const reach = kind === \"wall\" ? 1100 * Math.min(1.8, Math.sqrt(k)) : 520 * Math.min(1.6, Math.sqrt(k));\n          const L = new THREE.PointLight(WARM_LIGHT, 0, reach, 0);\n          L.castShadow = false;\n          L.position.set(c.p[0], c.p[1], c.p[2]);\n          c.g.add(L);\n          c.g.updateMatrixWorld(true);\n          lights.push({ light: L, base: kind === \"wall\" ? 1.8 : 0.9 });\n        }\n      }\n      count.lights = lights.length;\n    }\n    function setLevel(m) {\n      const on = m > 1e-3;\n      group.visible = on;\n      ledMat.opacity = m;\n      washMat.opacity = 0.5 * m;\n      kickMat.opacity = 0.9 * m;\n      poolMat.opacity = 0.8 * m;\n      for (const l of lights) l.light.intensity = l.base * m;\n    }\n    return { group, sync, setLevel, count: () => Object.assign({}, count), visible: () => group.visible };\n  }\n\n  // v2/src/model/hardware/cabineo-fit.js\n  var CABINEO_FIT = Object.freeze({\n    bores: Object.freeze([-3.139, -14.32, -25.5]),\n    // nearest the edge first\n    radius: 7.5,\n    tolerance: 0.25\n    // mm, bore centre to seat centre\n  });\n  function cabineoFit(d) {\n    const b = CABINEO_FIT.bores;\n    if (!Array.isArray(d) || d.length !== b.length) return { ok: false, why: \"Expected \" + b.length + \" seats in a row for one Cabineo, found \" + (Array.isArray(d) ? d.length : 0) + \".\" };\n    const offset = d.reduce((s, v, i) => s + v + b[i], 0) / b.length;\n    const residual = Math.max(...d.map((v, i) => Math.abs(v - (offset - b[i]))));\n    if (!(residual <= CABINEO_FIT.tolerance)) return { ok: false, offset, residual, why: \"The seats are \" + residual.toFixed(2) + \" mm off Lamello's bore pattern - the product is not drawn there.\" };\n    return { ok: true, offset, residual };\n  }\n\n  // v2/src/model/production-hardware.js\n  var VIEW = /* @__PURE__ */ new Set([\"explode\", \"dispX\", \"dispY\", \"dispZ\", \"doorOpen\", \"drawerOpen\", \"leafOpen\", \"drawers\", \"xopen\", \"_productionHardware\"]);\n  function hardwareScene(scene) {\n    return {\n      units: (scene.units || []).map((u) => Object.fromEntries(Object.entries(u).filter(([k]) => !VIEW.has(k)))),\n      kitchen: scene.kitchen || null,\n      ...scene.decors ? { decors: scene.decors } : {}\n    };\n  }\n  var hardwareKey = (scene) => JSON.stringify(hardwareScene(scene));\n  var vec = (p) => [p.x, p.y, p.z];\n  var dot4 = (a, b) => a.reduce((s, v, i) => s + v * b[i], 0);\n  function inverse(u) {\n    const xf = unitXf({ ...u, dispX: 0, dispY: 0, dispZ: 0 }), o = xf.p([0, 0, 0]);\n    const axes = [[1, 0, 0], [0, 1, 0], [0, 0, 1]].map((n) => xf.n(n));\n    return { point: (p) => axes.map((a) => dot4(a, [p[0] - o[0], p[1] - 150 - o[1], p[2] - o[2]])), normal: (n) => axes.map((a) => dot4(a, n)) };\n  }\n  function panelBox(panel, inv) {\n    const pts = [];\n    for (const x of [panel.box.min.x, panel.box.max.x]) for (const y of [panel.box.min.y, panel.box.max.y]) for (const z of [panel.box.min.z, panel.box.max.z]) pts.push(inv.point([x, y, z]));\n    return [\"x\", \"y\", \"z\"].flatMap((k, i) => [Math.min(...pts.map((p) => p[i])), Math.max(...pts.map((p) => p[i]))]);\n  }\n  var boxArray = (p) => [\"x\", \"y\", \"z\"].flatMap((k) => [p.local[k + \"0\"], p.local[k + \"1\"]]);\n  function candidates(role, parts) {\n    const names = {\n      \"side-left\": [\"Side L\"],\n      \"side-right\": [\"Side R\"],\n      bottom: [\"Base\", \"Bottom\"],\n      top: [\"Top\"],\n      back: [\"Back\"],\n      \"top-rail\": [\"Rail rear\", \"Rail front\"]\n    };\n    if (names[role]) return parts.filter((p) => names[role].includes(p.name));\n    const kinds = {\n      door: [\"door\"],\n      \"drawer-front\": [\"drawer-front\"],\n      shelf: [\"shelf\", \"fixed-h\"],\n      divider: [\"fixed-v\"],\n      \"drawer-side\": [\"drawer-box\"],\n      \"drawer-box-front\": [\"drawer-box\"],\n      \"drawer-box-back\": [\"drawer-box\"],\n      \"drawer-bottom\": [\"drawer-box\"]\n    };\n    return parts.filter((p) => (kinds[role] || []).includes(p.kind));\n  }\n  function closed(u) {\n    return {\n      ...u,\n      doorOpen: false,\n      drawerOpen: false,\n      drawers: (u.drawers || []).map(() => false),\n      leafOpen: (u.leafOpen || []).map(() => false),\n      xopen: [],\n      explode: 0,\n      dispX: 0,\n      dispY: 0,\n      dispZ: 0\n    };\n  }\n  var basisPoint = (b, p) => b ? b.o.map((v, i) => v + b.ex[i] * p[0] + b.ey[i] * p[1] + b.ez[i] * p[2]) : p;\n  var basisNormal = (b, p) => b ? b.ex.map((v, i) => v * p[0] + b.ey[i] * p[1] + b.ez[i] * p[2]) : p;\n  function hardwarePrimitives(scene, state2, onlyUnitId = null) {\n    var _a, _b, _c;\n    const out = { items: [], paths: [], products: [], unplaced: [], skipped: 0, envelopes: 0, pending: 0, unsupported: [], missing: [], warnings: [] };\n    if (!state2 || state2.status !== \"ready\" || state2.key !== hardwareKey(scene)) return out;\n    const packet = state2.packet;\n    if ((packet == null ? void 0 : packet.v) !== 1 || ((_a = packet.frame) == null ? void 0 : _a.origin) !== \"workshop-floor\" || ((_b = packet.frame) == null ? void 0 : _b.assembly) !== \"closed\") return out;\n    out.unsupported = packet.unsupported || [];\n    const units = new Map((scene.units || []).map((u) => [String(u.id), u]));\n    for (const rec of packet.cabinets || []) {\n      if (onlyUnitId != null && String(rec.unitId) !== String(onlyUnitId)) continue;\n      const u = units.get(String(rec.unitId));\n      if (!u) {\n        out.skipped += (rec.bodies || []).length;\n        continue;\n      }\n      const inv = inverse(u), xf = unitXf(u), shut = closed(u);\n      const parts = [...cabinetParts(shut), ...openFrontParts(shut)].filter((p, i, a) => a.findIndex((q) => q.pid === p.pid) === i);\n      const moving = new Map(openFrontParts(u).map((p) => [p.pid, p]));\n      const hostMap = /* @__PURE__ */ new Map();\n      for (const panel of rec.panels || []) {\n        const box3 = panelBox(panel, inv);\n        const matches = candidates(panel.role, parts).filter((p) => boxArray(p).every((v, i) => Math.abs(v - box3[i]) <= 2));\n        if (matches.length === 1) hostMap.set(panel.key, matches[0]);\n      }\n      const emit = (id, hostKey, kind, p, n, len, dia, envelope, label, anchor = p) => {\n        var _a2;\n        const host = hostMap.get(hostKey);\n        if (!host && kind !== \"leg\" || !(len > 0 && dia > 0 && len <= 5e3 && dia <= 5e3)) {\n          out.skipped++;\n          return;\n        }\n        const local = inv.point(vec(p)), normal = inv.normal(vec(n));\n        const off = host ? exOff(host, explodeMM(u)) : [0, 0, 0], move = host && ((_a2 = moving.get(host.pid)) == null ? void 0 : _a2.basis);\n        const pos = xf.p(basisPoint(move, local.map((v, i) => v + off[i]))), dir = xf.n(basisNormal(move, normal));\n        const point = xf.p(basisPoint(move, inv.point(vec(anchor)).map((v, i) => v + off[i])));\n        if (![...pos, ...dir, ...point, len, dia].every(Number.isFinite) || out.items.length >= 1e4) {\n          out.skipped++;\n          return;\n        }\n        out.items.push({ id, unitId: u.id, panelKey: hostKey, partId: (host == null ? void 0 : host.pid) || null, kind, pos, dir, anchor: point, len, dia, envelope, label });\n        if (envelope) out.envelopes++;\n      };\n      for (const fitting of rec.bodies || []) {\n        if (!(fitting.panelKeys || []).every((k) => hostMap.has(k))) {\n          out.skipped += (fitting.bodies || []).length;\n          continue;\n        }\n        for (const [i, b] of (fitting.bodies || []).entries()) {\n          const host = b.hostKey || fitting.hostKey;\n          const anchor = host !== fitting.hostKey ? Object.fromEntries([\"x\", \"y\", \"z\"].map((k) => [k, b.pos[k] + b.dir[k] * b.len / 2])) : fitting.at;\n          emit(fitting.id + \":\" + i, host, fitting.kind, b.pos, b.dir, b.len, b.dia, false, (fitting.records || []).map((r) => r.label).join(\" / \"), anchor);\n        }\n      }\n      const runnerRows = /* @__PURE__ */ new Map();\n      for (const f of rec.bodies || []) if (f.kind === \"runner\" && hostMap.has(f.hostKey)) {\n        const key = [f.hostKey, f.at.y, JSON.stringify(f.normal)].join(\":\");\n        if (!runnerRows.has(key)) runnerRows.set(key, []);\n        runnerRows.get(key).push(f);\n      }\n      for (const [key, rows] of runnerRows) if (rows.length === 2) {\n        const a = rows[0].at, b = rows[1].at, len = Math.hypot(b.x - a.x, b.y - a.y, b.z - a.z);\n        if (len > 0) emit(\n          rec.unitId + \":runner-span:\" + key,\n          rows[0].hostKey,\n          \"runner\",\n          { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, z: (a.z + b.z) / 2 },\n          { x: (b.x - a.x) / len, y: (b.y - a.y) / len, z: (b.z - a.z) / len },\n          len,\n          rows[0].dia,\n          false,\n          \"runner mounting span\"\n        );\n      }\n      for (const [i, leg] of (rec.legs || []).entries())\n        emit(rec.unitId + \":leg:\" + i, null, \"leg\", { x: leg.x, y: leg.y + leg.height / 2, z: leg.z }, { x: 0, y: 1, z: 0 }, leg.height, leg.dia, false, \"Adjustable leg\", leg);\n      for (const [i, e] of (rec.envelopes || []).entries()) {\n        const f = e.feature;\n        if (f.type === \"recess\" && f.p && f.inward && f.normal && f.halfWidth > 0 && f.centre > 0) {\n          const host = hostMap.get(e.panelKey);\n          if (!host) {\n            out.skipped++;\n            continue;\n          }\n          const n = vec(f.normal), along2 = vec(f.inward), side = [n[1] * along2[2] - n[2] * along2[1], n[2] * along2[0] - n[0] * along2[2], n[0] * along2[1] - n[1] * along2[0]];\n          const off = exOff(host, explodeMM(u)), move = (_c = moving.get(host.pid)) == null ? void 0 : _c.basis;\n          const pt = (a, b) => {\n            const world = vec(f.p).map((v, j) => v + along2[j] * a + side[j] * b);\n            const local = inv.point(world).map((v, j) => v + off[j]);\n            return xf.p(basisPoint(move, local));\n          };\n          const points = [pt(0, f.halfWidth)];\n          for (let k = 0; k <= 16; k++) {\n            const a = Math.PI * k / 16;\n            points.push(pt(f.centre + Math.sin(a) * f.halfWidth, Math.cos(a) * f.halfWidth));\n          }\n          points.push(pt(0, -f.halfWidth));\n          if (points.flat().every(Number.isFinite)) out.paths.push({ id: rec.unitId + \":collar:\" + i, unitId: u.id, panelKey: e.panelKey, label: f.label, points });\n          const seats = (rec.envelopes || []).filter((s) => s.panelKey === e.panelKey && s.feature.type === \"hole\" && /cabineo seat/.test(s.feature.label || \"\") && dot4(vec(s.feature.normal), n) > 0.999).map((s) => {\n            const fp = vec(f.p), d = vec(s.feature.p).map((v, j) => v - fp[j]);\n            return { s, along: dot4(d, along2), lat: dot4(d, side), up: dot4(d, n) };\n          }).filter((q) => q.along > 0 && q.along < 45 && Math.abs(q.lat) < 0.5 && Math.abs(q.up) < 0.5).sort((a, b) => a.along - b.along);\n          const fit = cabineoFit(seats.map((q) => q.along));\n          if (!fit.ok) {\n            out.unplaced.push({ id: rec.unitId + \":cabineo:\" + i, unitId: u.id, panelKey: e.panelKey, why: fit.why });\n            continue;\n          }\n          const T3 = (x, y, z) => {\n            const w = vec(f.p).map((v, j) => v + along2[j] * (fit.offset - x) + side[j] * y - n[j] * z);\n            return xf.p(basisPoint(move, inv.point(w).map((v, j) => v + off[j])));\n          };\n          const O = T3(0, 0, 0), ax = [T3(1, 0, 0), T3(0, 1, 0), T3(0, 0, 1)].map((p2) => p2.map((v, j) => v - O[j]));\n          if ([...O, ...ax.flat()].every(Number.isFinite))\n            out.products.push({\n              id: rec.unitId + \":cabineo:\" + i,\n              unitId: u.id,\n              panelKey: e.panelKey,\n              partId: host.pid,\n              kind: \"cabineo-product\",\n              label: \"Lamello Cabineo 12 (Lamello STEP)\",\n              basis: ax,\n              origin: O,\n              residual: fit.residual,\n              seatIds: seats.map((q) => rec.unitId + \":seat:\" + (rec.envelopes || []).indexOf(q.s))\n            });\n          continue;\n        }\n        if (f.type !== \"hole\" || !f.p || !f.normal) continue;\n        const p = Object.fromEntries([\"x\", \"y\", \"z\"].map((k) => [k, f.p[k] - f.normal[k] * f.depth / 2]));\n        emit(rec.unitId + \":seat:\" + i, e.panelKey, \"cabineo-seat\", p, f.normal, f.depth, f.dia, true, f.label, f.p);\n      }\n      out.pending += (rec.pending || []).length;\n      out.missing.push(...rec.missingBodyLabels || []);\n      out.warnings.push(...rec.warnings || []);\n    }\n    return out;\n  }\n  var fixingsShown = (scene) => (scene.units || []).some((u) => u.fixing === \"cabineo\");\n  function fixingPrimitives(scene, state2) {\n    const all = hardwarePrimitives(scene, state2);\n    const want = new Set((scene.units || []).filter((u) => u.fixing === \"cabineo\").map((u) => String(u.id)));\n    const items = all.items.filter((i) => i.kind === \"cabineo-seat\" && want.has(String(i.unitId)));\n    const products = all.products.filter((p) => want.has(String(p.unitId)));\n    const paths = all.paths.filter((p) => want.has(String(p.unitId)));\n    const drawn = new Set(items.map((i) => String(i.unitId)).concat(paths.map((p) => String(p.unitId))));\n    const ready = !!(state2 && state2.status === \"ready\" && state2.key === hardwareKey(scene));\n    return {\n      items,\n      paths,\n      products,\n      unplaced: all.unplaced.filter((p) => want.has(String(p.unitId))),\n      envelopes: items.length,\n      skipped: 0,\n      pending: all.pending,\n      unsupported: all.unsupported,\n      warnings: all.warnings,\n      notBuilt: ready ? [...want].filter((id) => !drawn.has(id)) : [],\n      ready\n    };\n  }\n\n  // v2/src/model/hardware/cabineo-mesh.js\n  var CABINEO_MESH = Object.freeze({\n    source: Object.freeze({ file: \"Cabineo-12_connector.stp\", url: \"https://lamello.com/fileadmin/products/Cabineo-12_connector.stp\", sha256: \"1f9d794985a9149c5f2e5216e1a570c7e2f72207e7d40228fa941ed04dc059a1\" }),\n    unit: \"mm\",\n    frame: \"STEP\",\n    step: 0.01,\n    vertices: 1691,\n    triangles: 2080,\n    bbox: Object.freeze({ min: Object.freeze([-33.75, -8.25, -0.1]), max: Object.freeze([11.5, 8.25, 10.8]) }),\n    pos: \"fgQAAHwBfgTn/34BfgTP/4IBfgS4/4oBfgSh/5QBfgSM/6EBfgR5/7ABfgRo/8IBfgRZ/9YBfgRN/+sBfgRD/wICfgQ9/xkCfgQ5/zICfgQ4/0oCfgQ6/2MCfgRA/3sCfgRI/5ICfgRT/6gCfgRg/70CfgRw/88CfgSD/+ACfgSX/+4CfgSs//oCfgTD/wMDfgTb/wkDfgT0/wwDfgQMAAwDfgQlAAkDfgQ9AAMDfgRUAPoCfgRpAO4CfgR9AOACfgSQAM8CfgSgAL0CfgStAKgCfgS4AJICfgTAAHsCfgTGAGMCfgTIAEoCfgTHADICfgTDABkCfgS9AAICfgSzAOsBfgSnANYBfgSYAMIBfgSHALABfgR0AKEBfgRfAJQBfgRIAIoBfgQxAIIBfgQZAH4BfgQAAHwBZQQAAGMBTAQAAEoBTAQfAEwBTAQ9AFIBTARaAFsBTAR2AGgBTASQAHgBTASoAIsBTAS+AKEBTATQALoBTATgANUBTATsAPEBTAT0AA8CTAT5AC0CTAT6AEwCTAT3AGoCTATwAIgCTATmAKUCTATZAMECTATIANsCTASzAPICTASdAAcDTASEABkDTARoACcDTARMADIDTAQuADoDTAQPAD4DTATx/z4DTATS/zoDTAS0/zIDTASY/ycDTAR8/xkDTARj/wcDTARN//ICTAQ4/9sCTAQn/8ECTAQa/6UCTAQQ/4gCTAQJ/2oCTAQG/0wCTAQH/y0CTAQM/w8CTAQU//EBTAQg/9UBTAQw/7oBTARC/6EBTARY/4sBTARw/3gBTASK/2gBTASm/1sBTATD/1IBTATh/0wBTAQAAEoBZQQAAGMBZQTK/2oBZQSX/30BZQRr/5wBZQRH/8QBZQQu//QBZQQh/ykCZQQh/18CZQQu/5QCZQRH/8QCZQRr/+wCZQSX/wsDZQTK/x4DZQQAACUDZQQ2AB4DZQRpAAsDZQSVAOwCZQS5AMQCZQTSAJQCZQTfAF8CZQTfACkCZQTSAPQBZQS5AMQBZQSVAJwBZQRpAH0BZQQ2AGoBTAQAAEoBTAQfAEwBTAQ9AFIBTARaAFsBTAR2AGgBTASQAHgBTASoAIsBTAS+AKEBTATQALoBTATgANUBTATsAPEBTAT0AA8CTAT5AC0CTAT6AEwCTAT3AGoCTATwAIgCTATmAKUCTATZAMECTATIANsC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\",\n    idx: \"aQAAAAEAZwBoAGkANAAyADMANQA2ADQAagBlAGYAagABAAIAagBmAGcAagACAAMAagBpAAEAagBnAGkAawBkAGUAawADAAQAawAEAAUAawBlAGoAawBqAAMAawBjAGQAbAAFAAYAbAAGAAcAbABrAAUAbABjAGsAbABhAGIAbABiAGMAbQAHAAgAbQAIAAkAbQBsAAcAbQBhAGwAbQBfAGAAbQBgAGEAbgBtAAkAbgBfAG0AbgAJAAoAbgAKAAsAbgBdAF4AbgBeAF8AbwALAAwAbwAMAA0AbwBuAAsAbwBdAG4AbwBbAFwAbwBcAF0AcAANAA4AcAAOAA8AcABvAA0AcABbAG8AcABZAFoAcABaAFsAcQBZAHAAcQAPABAAcQAQABEAcQBXAFgAcQBYAFkAcQBwAA8AcgBxABEAcgBXAHEAcgARABIAcgASABMAcgBVAFYAcgBWAFcAcwATABQAcwAUABUAcwBVAHIAcwByABMAcwBTAFQAcwBUAFUAdAAVABYAdAAWABcAdABTAHMAdABzABUAdABRAFIAdABSAFMAdQAXABgAdQAYABkAdQBRAHQAdQB0ABcAdQBPAFAAdQBQAFEAdgB1ABkAdgBPAHUAdgAZABoAdgBOAE8AdwAaABsAdwAbABwAdwBOAHYAdwB2ABoAdwBMAE0AdwBNAE4AeAAcAB0AeAAdAB4AeABMAHcAeAB3ABwAeABKAEsAeABLAEwAeQBKAHgAeQB4AB4AeQAeAB8AeQAfACAAeQBIAEkAeQBJAEoAegB5ACAAegAgACEAegBIAHkAegAhACIAegBGAEcAegBHAEgAewB6ACIAewAiACMAewAjACQAewBGAHoAewBEAEUAewBFAEYAfAAkACUAfAAlACYAfAB7ACQAfABEAHsAfABCAEMAfABDAEQAfQAmACcAfQAnACgAfQBAAEEAfQB8ACYAfQBBAEIAfQBCAHwAfgAoACkAfgApACoAfgA+AD8AfgA/AEAAfgB9ACgAfgBAAH0AfwA+AH4AfwB+ACoAfwAqACsAfwArACwAfwA8AD0AfwA9AD4AgAB/ACwAgAA8AH8AgAAsAC0AgAAtAC4AgAA6ADsAgAA7ADwAgQA6AIAAgQCAAC4AgQAuAC8AgQAvADAAgQA4ADkAgQA5ADoAggAyADQAggA0ADYAggCBADAAggA4AIEAggAwADEAggAxADIAggA2ADcAggA3ADgAhAC3AOoAhACDALcAhQDqAOkAhQCEAOoAhgDpAOgAhgCFAOkAhwCGAOgAhwDoAOcAiACHAOcAiADnAOYAiQCIAOYAiQDmAOUAigCJAOUAigDlAOQAiwCKAOQAiwDkAOMAjACLAOMAjADjAOIAjQCMAOIAjQDiAOEAjgCNAOEAjgDhAOAAjwCOAOAAjwDgAN8AkACPAN8AkADfAN4AkQCQAN4AkQDeAN0AkgCRAN0AkgDdANwAkwCSANwAkwDcANsAlACTANsAlADbANoAlQCUANoAlQDaANkAlgDZANgAlgCVANkAlwCWANgAlwDYANcAmADXANYAmACXANcAmQDWANUAmQCYANYAmgDVANQAmgCZANUAmwCaANQAmwDUANMAnACbANMAnADTANIAnQCcANIAnQDSANEAngCdANEAngDRANAAnwCeANAAnwDQAM8AoACfAM8AoADPAM4AoQCgAM4AoQDOAM0AogChAM0AogDNAMwAowCiAMwAowDMAMsApACjAMsApADLAMoApQCkAMoApQDKAMkApgClAMkApgDJAMgApwCmAMgApwDIAMcAqACnAMcAqADHAMYAqQCoAMYAqQDGAMUAqgDFAMQAqgCpAMUAqwDEAMMAqwCqAMQArADDAMIArACrAMMArQDCAMEArQCsAMIArgDBAMAArgCtAMEArwDAAL8ArwCuAMAAsAC+AL0AsAC/AL4AsACvAL8AsQCwAL0AsgC9ALwAsgCxAL0AswCyALwAswC8ALsAtACzALsAtAC7ALoAtQC0ALoAtQC6ALkAtgC1ALkAtgC5ALgA+wD9APwABgEFAQQB9gD4APcACAEHAQYB9AD2APUA8gD0APMA8gD5APgA8gD4APYA8gD2APQACwEKAQkB7wDxAPAA7wDyAPEA7wD6APkA7wD7APoA7wD+AP0A7wD/AP4A7wAAAf8A7wD5APIA7wD9APsADwELAQkBDwEEAQMBDwEJAQgBDwEMAQsBDwENAQwBDwEOAQ0BDwEGAQQBDwEIAQYB6wDtAOwAEgERARABHQHuAO0AHQHvAO4AHQEBAQABHQECAQEBHQHtAOsAHQEAAe8AFAESARABFAETARIBGgEcARsBFgEVARQBFwEWARQBGAEPAQMBGAEDAQIBGAECAR0BGAEQAQ8BGAEUARABGAEaARkBGAEcARoBGAEdARwBGAEXARQBMAEtASwBMAEvAS0BMQEsASsBMQEwASwBMgErASoBMgExASsBMwEqASkBMwEyASoBNAEpASgBNAEzASkBNQEoAScBNQE0ASgBNgEnASYBNgE1AScBNwEmASUBNwE2ASYBOAElASQBOAE3ASUBOQEkASMBOQE4ASQBOgEjASIBOgE5ASMBOwEiASEBOwE6ASIBPAEhASABPAE7ASEBPQEgAR8BPQE8ASABLgEfAR4BLgE9AR8BUAFNAUwBUAFPAU0BUQFMAUsBUQFQAUwBUgFLAUoBUgFRAUsBUwFKAUkBUwFSAUoBVAFJAUgBVAFTAUkBVQFIAUcBVQFUAUgBVgFHAUYBVgFVAUcBVwFGAUUBVwFWAUYBWAFFAUQBWAFXAUUBWQFEAUMBWQFYAUQBWgFDAUIBWgFZAUMBWwFCAUEBWwFaAUIBXAFBAUABXAFbAUEBXQFAAT8BXQFcAUABTgE/AT4BTgFdAT8BewFeAV8BegFfAWABegF7AV8BeQFgAWEBeQF6AWABeAFhAWIBeAF5AWEBdwFiAWMBdwF4AWIBdgFjAWQBdgF3AWMBdQFkAWUBdQF2AWQBdAFlAWYBdAF1AWUBcwFmAWcBcwF0AWYBcgFnAWgBcgFzAWcBcQFoAWkBcQFpAWoBcQFyAWgBcAFxAWoBbwFqAWsBbwFrAWwBbwFwAWoBbgFsAW0BbgFvAWwBogF8AX0BigGIAYkBowF9AX4BowGiAX0BpAGhAaIBpAGiAaMBpQF+AX8BpQF/AYABpQGjAX4BpgGjAaUBpgGkAaMBpwGAAYEBpwGlAYABqAGfAaABqAGgAaEBqAGkAaYBqAGhAaQBqQGlAacBqQGmAaUBqgGBAYIBqgGnAYEBqwGmAakBqwGfAagBqwGoAaYBrAGpAacBrAGnAaoBrQGCAYMBrQGqAYIBrgGdAZ4BrgGeAZ8BrgGfAasBrwGpAawBrwGrAakBsAGqAa0BsAGsAaoBsQGDAYQBsQGtAYMBsgGrAa8BsgGuAasBswGsAbABswGvAawBtAGtAbEBtAGwAa0BtQGEAYUBtQGxAYQBtgGuAbIBtgGcAZ0BtgGdAa4BtwGyAa8BtwGvAbMBuAGwAbQBuAGzAbABuQG0AbEBuQGxAbUBugGFAYYBugGGAYcBugG1AYUBuwGyAbcBuwG2AbIBuwGcAbYBvAG3AbMBvAGzAbgBvQG4AbQBvQG0AbkBvgG5AbUBvgG1AboBvwGHAYgBvwG6AYcBvwGIAYoBwAGaAZsBwAGbAZwBwAGcAbsBwQG7AbcBwQG3AbwBwgG8AbgBwgG4Ab0BwwG9AbkBwwG5Ab4BxAG+AboBxAG6Ab8BxQHAAbsBxQG7AcEBxQGaAcABxgHBAbwBxgG8AcIBxwHCAb0BxwG9AcMByAHDAb4ByAG+AcQByQGKAYsByQG/AYoByQHEAb8BygGaAcUBygGZAZoBywHFAcEBywHBAcYBzAHGAcIBzAHCAccBzQHDAcgBzQHHAcMBzgGLAYwBzgGMAY0BzgGNAcgBzgHIAcQBzgHJAYsBzgHEAckBzwGYAZkBzwHKAcUBzwGZAcoBzwHFAcsB0AHLAcYB0AHGAcwB0QHHAc0B0QHMAccB0gGNAY4B0gGOAY8B0gHIAY0B0gHNAcgB0wHLAdAB0wHPAcsB1AHMAdEB1AHQAcwB1QGQAdEB1QHSAY8B1QHNAdIB1QGPAZAB1QHRAc0B1gGYAc8B1gGWAZcB1gGXAZgB1gHPAdMB1wHQAdQB1wHTAdAB1wGTAZQB2AHRAZAB2AGQAZEB2AGSAdQB2AGRAZIB2AHUAdEB2QHXAZQB2QGUAZUB2QGVAZYB2QGWAdYB2QHWAdMB2QHTAdcB2gHXAdQB2gHUAZIB2gGSAZMB2gGTAdcB9AH1AfYB3AEBAtsBAgL2AfcBAgL0AfYBAwLzAfQBAwL0AQICBAL3AfgBBAL4AfkBBAICAvcBBQIDAgICBQICAgQCBgL5AfoBBgIEAvkBBwLzAQMCBwLxAfIBBwLyAfMBBwIDAgUCCAIFAgQCCAIEAgYCCQL6AfsBCQIGAvoBCgIFAggCCgIHAgUCCgLxAQcCCwIGAgkCCwIIAgYCDAL7AfwBDAIJAvsBDQLvAfABDQLwAfEBDQLxAQoCDgIIAgsCDgIKAggCDwIJAgwCDwILAgkCEAL8Af0BEAIMAvwBEQIKAg4CEQINAgoCEgIOAgsCEgILAg8CEwIMAhACEwIPAgwCFAL9Af4BFAIQAv0BFQLuAe8BFQINAhECFQLvAQ0CFgIRAg4CFgIOAhICFwISAg8CFwIPAhMCGAIQAhQCGAITAhACGQL+Af8BGQL/AQACGQIUAv4BGgIRAhYCGgIVAhECGgLuARUCGwIWAhICGwISAhcCHAIXAhMCHAITAhgCHQIUAhkCHQIYAhQCHgIAAgECHgIZAgACHgIBAtwBHwLsAe0BHwLtAe4BHwLuARoCIAIaAhYCIAIWAhsCIQIbAhcCIQIXAhwCIgIcAhgCIgIYAh0CIwIdAhkCIwIZAh4CJAIfAhoCJALsAR8CJAIaAiACJQIgAhsCJQIbAiECJgIcAiICJgIhAhwCJwIiAh0CJwIdAiMCKALcAd0BKAIjAh4CKAIeAtwBKQLrAewBKQLsASQCKgIkAiACKgIgAiUCKwIlAiECKwIhAiYCLAImAiICLAIiAicCLQLdAd4BLQLeAd8BLQLfAScCLQInAiMCLQIoAt0BLQIjAigCLgLqAesBLgIpAiQCLgIkAioCLgLrASkCLwIqAiUCLwIlAisCMAImAiwCMAIrAiYCMQIsAicCMQLfAeABMQLgAeEBMQInAt8BMgIuAioCMgIqAi8CMwIvAisCMwIrAjACNALhAeIBNAIwAiwCNAIxAuEBNALiATACNAIsAjECNQIuAjICNQLoAekBNQLpAeoBNQLqAS4CNgLlAeYBNgIyAi8CNgIvAjMCNwLiAeMBNwLjAeQBNwLkATMCNwIzAjACNwIwAuIBOALmAecBOALnAegBOAI1AjICOALoATUCOAIyAjYCOAI2AuYBOQLkAeUBOQIzAuQBOQI2AjMCOQLlATYCRwJIAlUCRgJVAlQCRgJHAlUCRQJUAlMCRQJGAlQCRAJTAlICRAJFAlMCQwJSAlECQwJEAlICQgJRAlACQgJDAlECQQJQAk8CQQJCAlACQAJPAk4CQAJBAk8CPwJOAk0CPwJAAk4CPgI/Ak0CPQJMAksCPQJNAkwCPQI+Ak0CPAI9AksCOwJLAkoCOwI8AksCOgJKAkkCOgI7AkoCYwJkAmICpAJ/An4CpAJ+AosCpQJ/AqQCpQKAAn8CpgKBAoACpgKAAqUCpwKBAqYCpwKCAoECqAKDAoICqAKCAqcCqQKDAqgCqQKEAoMCqgKFAoQCqgKEAqkCqwKGAoUCqwKFAqoCrAKGAqsCrAKHAoYCrQKIAocCrQKHAqwCrgKJAogCrgKIAq0CrwKJAq4CrwJ8An0CrwKKAokCrwJ9AooCsAKkAosCsAKLAowCsQKkArACsQKlAqQCsgKmAqUCsgKlArECswKnAqYCswKmArICtAKnArMCtAKoAqcCtQKpAqgCtQKoArQCtgKpArUCtgKqAqkCtwKrAqoCtwKqArYCuAKsAqsCuAKrArcCuQKsArgCuQKtAqwCugKuAq0CugKtArkCuwJ8Aq8CuwKvAq4CuwJ7AnwCuwKuAroCvAKwAowCvAKMAo0CvQKwArwCvQKxArACvgKyArECvgKxAr0CvwKyAr4CvwKzArICwAKzAr8CwAK0ArMCwQK0AsACwQK1ArQCwgK2ArUCwgK1AsECwwK2AsICwwK3ArYCxAK4ArcCxAK3AsMCxQK5ArgCxQK4AsQCxgK6ArkCxgK5AsUCxwJ7ArsCxwJ6AnsCxwK6AsYCxwK7AroCyAK8Ao0CyAKNAo4CyQK+Ar0CyQK9ArwCyQK8AsgCygK+AskCywLAAr8CywK/Ar4CywK+AsoCzALAAssCzQLBAsACzQLAAswCzgLCAsECzgLBAs0CzwLCAs4CzwLDAsIC0ALDAs8C0ALEAsMC0QLFAsQC0QLEAtAC0gLGAsUC0gLHAsYC0gLFAtEC0wJ5AnoC0wJ6AscC0wLHAtIC1AKOAo8C1ALIAo4C1QLIAtQC1QLJAsgC1gLKAskC1gLJAtUC1wLLAsoC1wLKAtYC2ALLAtcC2ALMAssC2QLMAtgC2QLNAswC2gLNAtkC2gLOAs0C2wLOAtoC2wLPAs4C3ALPAtsC3ALQAs8C3QLQAtwC3QLRAtAC3gLRAt0C3gLSAtEC3wLSAt4C3wJ3AngC3wJ4AnkC3wLTAtIC3wJ5AtMC4ALUAo8C4AKPApAC4QLUAuAC4QLVAtQC4gLVAuEC4gLWAtUC4wLXAtYC4wLWAuIC5ALYAtcC5ALXAuMC5QLZAtgC5QLYAuQC5gLaAtkC5gLZAuUC5wLcAtsC5wLaAuYC5wLbAtoC6ALcAucC6QLdAtwC6QLcAugC6gLeAt0C6gLdAukC6wLeAuoC6wJ3At8C6wLfAt4C7ALgApAC7ALhAuAC7AKQApEC7QLhAuwC7gLhAu0C7gLiAuEC7wLjAuIC7wLkAuMC7wLiAu4C8ALlAuQC8ALkAu8C8QLlAvAC8gLmAuUC8gLnAuYC8gLlAvEC8wLnAvIC9ALoAucC9ALnAvMC9QLpAugC9QLqAukC9QLoAvQC9gLqAvUC9wJ2AncC9wLrAuoC9wJ3AusC9wLqAvYC+ALtAuwC+AKRApIC+ALsApEC+QLtAvgC+gLuAu0C+gLtAvkC+wLvAu4C+wLuAvoC/ALvAvsC/ALwAu8C/ALxAvAC/QLxAvwC/gLxAv0C/gLyAvEC/wLyAv4C/wLzAvICAAPzAv8CAAP0AvMCAQP0AgADAQP1AvQCAQP2AvUCAgP3AvYCAgP2AgEDAwP3AgIDAwN1AnYCAwN2AvcCBAP4ApICBAOSApMCBQP5AvgCBQP4AgQDBgP6AvkCBgP5AgUDBwP7AvoCBwP6AgYDCAP7AgcDCAP8AvsCCQP9AvwCCQP8AggDCgP+Av0CCgP9AgkDCwP/Av4CCwP+AgoDDAMAA/8CDAP/AgsDDQMBAwADDQMAAwwDDgMCAwEDDgMBAw0DDwN0AnUCDwN1AgMDDwMCAw4DDwMDAwIDEAMEA5MCEAOTApQCEQMFAwQDEQMEAxADEgMGAwUDEgMFAxEDEwMHAwYDEwMGAxIDFAMHAxMDFAMIAwcDFAMJAwgDFQMJAxQDFgMKAwkDFgMJAxUDFwMLAwoDFwMMAwsDFwMKAxYDGAMMAxcDGQMNAwwDGQMMAxgDGgMNAxkDGgMOAw0DGwMOAxoDGwNzAnQCGwN0Ag8DGwMPAw4DHAOUApUCHAMQA5QCHQMQAxwDHQMRAxADHgMRAx0DHgMSAxEDHwMSAx4DHwMTAxIDIAMTAx8DIAMUAxMDIAMVAxQDIQMVAyADIgMVAyEDIgMWAxUDIwMWAyIDIwMXAxYDJAMXAyMDJAMYAxcDJQMYAyQDJQMZAxgDJgMZAyUDJgMaAxkDJwMbAxoDJwNzAhsDJwNyAnMCJwMaAyYDKAOVApYCKAMcA5UCKQMcAygDKQMdAxwDKgMeAx0DKgMdAykDKgMfAx4DKwMfAyoDLAMgAx8DLAMfAysDLAMhAyADLQMhAywDLQMiAyEDLgMiAy0DLwMiAy4DLwMjAyIDMAMkAyMDMAMlAyQDMAMjAy8DMQMlAzADMgMmAyUDMgMnAyYDMgMlAzEDMwNxAnICMwNyAicDMwMnAzIDNAMoA5YCNAOWApcCNQMpAygDNQMoAzQDNgMqAykDNgMrAyoDNgMpAzUDNwMrAzYDOAMrAzcDOAMsAysDOQMtAywDOQMuAy0DOQMsAzgDOgMuAzkDOwMvAy4DOwMuAzoDPAMwAy8DPAMvAzsDPQMxAzADPQMwAzwDPgMxAz0DPgMyAzEDPgMzAzIDPwMzAz4DPwNvAnACPwNwAnECPwNxAjMDQAOXApgCQAM0A5cCQQM1AzQDQQM0A0ADQgM1A0EDQgM2AzUDQwM2A0IDQwM3AzYDRAM3A0MDRAM4AzcDRQM4A0QDRQM5AzgDRgM6AzkDRgM5A0UDRwM7AzoDRwM6A0YDSAM8AzsDSAM7A0cDSQM9AzwDSQM8A0gDSgM9A0kDSgM+Az0DSwM/Az4DSwM+A0oDSwNvAj8DTANAA5gCTAOYApkCTANBA0ADTQNBA0wDTgNCA0EDTgNBA00DTwNCA04DTwNDA0IDUANEA0MDUANDA08DUANFA0QDUQNFA1ADUgNFA1EDUgNGA0UDUwNHA0YDUwNIA0cDUwNGA1IDVANIA1MDVQNJA0gDVQNIA1QDVgNKA0kDVgNJA1UDVwNtAm4CVwNuAm8CVwNKA1YDVwNvAksDVwNLA0oDWANMA5kCWANNA0wDWAOZApoCWQNNA1gDWgNOA00DWgNNA1kDWwNPA04DWwNOA1oDXANPA1sDXANQA08DXQNRA1ADXQNQA1wDXgNSA1EDXgNRA10DXwNSA14DXwNTA1IDYANTA18DYANUA1MDYQNUA2ADYQNVA1QDYgNVA2EDYgNWA1UDYgNXA1YDYwNXA2IDYwNsAm0CYwNtAlcDZAOaApsCZANYA5oCZQNZA1gDZQNYA2QDZgNZA2UDZgNaA1kDZgNbA1oDZwNbA2YDaANbA2cDaANcA1sDaQNeA10DaQNcA2gDaQNdA1wDagNeA2kDawNfA14DawNeA2oDbANfA2sDbANgA18DbQNgA2wDbQNhA2ADbQNiA2EDbgNiA20DbwNiA24DbwNjA2IDbwNsAmMDcANkA5sCcAObApwCcANlA2QDcQNlA3ADcgNmA2UDcgNnA2YDcgNlA3EDcwNnA3IDdANoA2cDdANnA3MDdQNpA2gDdQNqA2kDdQNoA3QDdgNqA3UDdwNrA2oDdwNqA3YDeANsA2sDeANrA3cDeQNtA2wDeQNuA20DeQNsA3gDegNuA3kDewNrAmwCewNvA24DewNsAm8DewNuA3oDfANwA5wCfAOcAp0CfQNwA3wDfQNxA3ADfgNzA3IDfgNyA3EDfgNxA30DfwNzA34DgANzA38DgAN0A3MDgQN0A4ADgQN1A3QDggN1A4EDggN3A3YDggN2A3UDgwN3A4IDgwN4A3cDhAN4A4MDhQN4A4QDhQN5A3gDhgN5A4UDhgN6A3kDhwNqAmsChwN6A4YDhwNrAnsDhwN7A3oDiAOdAp4CiAN8A50CiQN9A3wDiQN8A4gDigN9A4kDigN+A30DiwN+A4oDiwN/A34DjAN/A4sDjAOAA38DjAOBA4ADjQOBA4wDjgOCA4EDjgOBA40DjwODA4IDjwOCA44DkAOEA4MDkAODA48DkQOEA5ADkQOFA4QDkgOGA4UDkgOFA5EDkwNpAmoCkwOGA5IDkwOHA4YDkwNqAocDlAOJA4gDlAOeAp8ClAOIA54ClQOJA5QDlgOKA4kDlgOJA5UDlwOLA4oDlwOKA5YDmAOMA4sDmAONA4wDmAOLA5cDmQONA5gDmgOOA40DmgOPA44DmgONA5kDmwOPA5oDnAOQA48DnAOPA5sDnQORA5ADnQOQA5wDngOSA5EDngORA50DnwNoAmkCnwNpApMDnwOTA5IDnwOSA54DoAOUA58CoAOfAqACoQOWA5UDoQOVA5QDoQOUA6ADogOWA6EDowOXA5YDowOWA6IDpAOXA6MDpAOZA5gDpAOYA5cDpQOZA6QDpgOZA6UDpgOaA5kDpwOaA6YDpwOcA5sDpwObA5oDqAOcA6cDqQOcA6gDqQOdA5wDqgOdA6kDqgOeA50DqwOfA54DqwNnAmgCqwOeA6oDqwNoAp8DrAOgAqECrAOhA6ADrAOgA6ACrQOhA6wDrgOiA6EDrgOhA60DrgOjA6IDrwOjA64DsAOjA68DsAOkA6MDsQOkA7ADsQOlA6QDsgOmA6UDsgOnA6YDsgOlA7EDswOnA7IDtAOoA6cDtAOnA7MDtQOpA6gDtQOqA6kDtQOoA7QDtgOqA7UDtwNmAmcCtwNnAqsDtwOrA6oDtwOqA7YDuAOsA6ECuAOhAqICuQOtA6wDuQOsA7gDugOtA7kDugOuA60DuwOvA64DuwOuA7oDvAOvA7sDvAOwA68DvQOxA7ADvQOwA7wDvgOxA70DvgOyA7EDvwOzA7IDvwO0A7MDvwOyA74DwAO0A78DwQO1A7QDwQO0A8ADwgO2A7UDwgO1A8EDwwO2A8IDwwNlAmYCwwNmArcDwwO3A7YDxANWAlcCxANXAlgCxAO4A6ICxAO5A7gDxAOiAqMCxAOjAlYCxQNYAlkCxQO5A8QDxQO6A7kDxQPEA1gCxgNZAloCxgPFA1kCxgO7A7oDxgO6A8UDxwPGA1oCxwO7A8YDyANaAlsCyAO7A8cDyAPHA1oCyAO8A7sDyQNbAlwCyQPIA1sCyQO9A7wDyQO8A8gDygNcAl0CygNdAl4CygPJA1wCygO9A8kDygO+A70DygO/A74DywPKA14CywO/A8oDzAPBA8ADzANeAl8CzANfAmACzAPLA14CzAO/A8sDzAPAA78DzQPBA8wDzQPMA2ACzgPCA8EDzgNgAmECzgNhAmICzgPBA80DzgPNA2ACzgPDA8IDzwNlAsMDzwNkAmUCzwNiAmQCzwPOA2ICzwPDA84D0APeA+sD0QPrA+oD0QPQA+sD0gPqA+kD0gPRA+oD0wPpA+gD0wPSA+kD1APoA+cD1APTA+gD1QPnA+YD1QPUA+cD1gPmA+UD1gPVA+YD1wPlA+QD1wPWA+UD2APkA+MD2APXA+QD2QPjA+ID2QPYA+MD2gPiA+ED2gPZA+ID2wPhA+AD2wPaA+ED3APgA98D3APbA+AD3QPcA98D+AP5A/oD+AP6AwcE9wMHBAYE9wP4AwcE9gMGBAUE9gP3AwYE9QMFBAQE9QP2AwUE9AMEBAME9AP1AwQE8wMCBAEE8wMDBAIE8wP0AwME8gPzAwEE8QMBBAAE8QPyAwEE8AMABP8D8APxAwAE7wP/A/4D7wPwA/8D7gP+A/0D7gPvA/4D7QP8A/sD7QP9A/wD7QPuA/0D7APtA/sDCAQWBCMECQQjBCIECQQIBCMECgQiBCEECgQJBCIECwQhBCAECwQKBCEEDAQgBB8EDAQLBCAEDQQfBB4EDQQMBB8EDgQeBB0EDgQNBB4EDwQdBBwEDwQOBB0EEAQcBBsEEAQPBBwEEQQbBBoEEQQQBBsEEgQaBBkEEgQRBBoEEwQZBBgEEwQSBBkEFAQYBBcEFAQTBBgEFQQUBBcEMQQyBD8EMAQ/BD4EMAQxBD8ELwQ+BD0ELwQwBD4ELgQ9BDwELgQvBD0ELQQ8BDsELQQuBDwELAQ7BDoELAQtBDsEKwQ6BDkEKwQsBDoEKgQ5BDgEKgQrBDkEKQQ4BDcEKQQqBDgEKAQ3BDYEKAQpBDcEJwQ2BDUEJwQoBDYEJgQnBDUEJQQ1BDQEJQQmBDUEJAQ0BDMEJAQlBDQEQwRBBEAEQwRABEIEYAReBF0EYQRdBFwEYQRgBF0EYgRcBFsEYgRhBFwEYwRbBFoEYwRiBFsEZARaBFkEZARjBFoEZQRZBFgEZQRkBFkEZgRYBFcEZgRlBFgEZwRXBFYEZwRmBFcEaARWBFUEaARnBFYEaQRVBFQEaQRoBFUEagRUBFMEagRpBFQEawRqBFMEawRTBFIEbARrBFIEbARSBFEEbQRsBFEEbQRRBFAEbgRQBE8EbgRtBFAEbwRPBE4EbwRuBE8EcAROBE0EcARvBE4EcQRwBE0EcgRMBEsEcgRNBEwEcgRxBE0EcwRLBEoEcwRyBEsEdARzBEoEdQRJBEgEdQRKBEkEdQR0BEoEdgRIBEcEdgR1BEgEdwR2BEcEeARHBEYEeAR3BEcEeQRGBEUEeQR4BEYEXwRFBEQEXwR5BEUEegR9BHsEfAR9BHoEkASSBJEElASTBJIElASSBJAEjgSQBI8EjASOBI0EjASQBI4EmASVBJQEmASWBJUEmASXBJYEmASUBJAEmASQBIwEiQSLBIoEhQSHBIYEhQSIBIcEhQSJBIgEhQSLBIkEhASMBIsEhASLBIUEgwSMBIQEgwSYBIwEfwSBBIAEfwSCBIEEfgSDBIIEfgSYBIMEfgSCBH8EtwS4BJgEmwSYBLgEtgS3BJgEmQSYBJsEtQS2BJgEtAS1BJgEnASZBJsEswS0BJgEsgSzBJgEsgSYBH4EnQSZBJwEsQSyBH4EngSZBJ0EsASxBH4EnwSZBJ4ErwSwBH4EoASZBJ8ErgSvBH4EoQSZBKAErQSuBH4EogSZBKEErAStBH4EowSZBKIEqwSsBH4EqgSrBH4EmgSjBKQEmgSkBKUEmgSlBKYEmgSmBKcEmgSnBKgEmgSoBKkEmgSpBKoEmgSZBKMEmgSqBH4EJAXaBNsEIwXZBNoEIwXaBCQFJQXbBNwEJQUkBdsEIgXYBNkEIgXZBCMFJgXcBN0EJgUlBdwEIQXXBNgEIQXYBCIFJwXdBN4EJwUmBd0EIAXWBNcEIAXXBCEFKAXeBN8EKAUnBd4EHwXVBNYEHwXWBCAFKQXfBOAEKQUoBd8EHgXUBNUEHgXVBB8FKgXgBOEEKgUpBeAEHQXTBNQEHQXUBB4FKwUqBeEEHAXSBNMEHAXTBB0FLAUrBeEEGwXSBBwF0QTSBBsFLQUsBeEEGgXRBBsF0ATRBBoFGQXQBBoFzwTQBBkFGAXPBBkFzgTPBBgFFwXOBBgF/QT8BDAFzQTOBBcF/gQwBS8F/gT9BDAF/wT+BC8F/wQvBS4FFgXNBBcFAAUuBS0FAAX/BC4FAAUtBeEEzATNBBYFAQUABeEEFQXMBBYFAgUBBeEEywTMBBUFAwUCBeEEFAXLBBUFygTLBBQFEwXKBBQFyQTKBBMFEgXJBBMFyATJBBIFEQXIBBIFxwTIBBEFxwQRBRAFDwXHBBAFDgXHBA8F8gTxBAkFPgULBQoF8wTyBAkF8wQJBQgF9ATzBAgF9AQIBQcF9QT0BAcF9QQHBQYFPQULBT4FPQUMBQsF9gT1BAYF9gQGBQUF9wT2BAUF9wQFBQQFPAUNBQwFPAUMBT0FOwUOBQ0FOwUNBTwFOwXHBA4FOgXHBDsF4gT3BAQF4gT4BPcE4gT5BPgE4gT6BPkE4gQDBeEE4gQEBQMF7gTiBO8E7ATiBO4E7ATuBO0E6gTiBOwE6gTsBOsE6ATqBOkE5gTiBOoE5gToBOcE5gTqBOgE5ATmBOUE5ATiBOYE4wTiBOQE+wT6BOIE+wTiBOME8AT7BOMESQUyBTEFSAUzBTIFSAUyBUkFRwU0BTMFRwUzBUgFRgU1BTQFRgU0BUcFRQU2BTUFRQU1BUYFxgRABT8FuQRABcYEuQRBBUAFuQRCBUEFuQRDBUIFuQREBUMFwwS5BMYEwwTFBMQEwwTGBMUEvAS6BLkEvAS7BLoEvgS9BLwEvgS8BLkEwQTDBMIEwQS5BMMEwAS/BL4EwAS5BMEEwAS+BLkEuQTHBDgFOAXHBDkFOQXHBDoFuQQ4BTcFuQQ3BTYFuQQ2BUQFRAU2BUUFWwVKBUsFWwVLBUwFWwVaBUoFXAVbBUwFXQVMBU0FXQVNBU4FXQVcBUwFXgVOBU8FXgVdBU4FXwVeBU8FYAVPBVAFYAVQBVEFYAVfBU8FYQVgBVEFYgVRBVIFYgVhBVEFYwVSBVMFYwViBVIFZAVTBVQFZAVjBVMFZQVUBVUFZQVkBVQFZgVVBVYFZgVWBVcFZgVlBVUFZwVmBVcFWQVXBVgFWQVnBVcFdQVoBWkFdgV1BWkFdwVpBWoFdwV2BWkFeAVqBWsFeAV3BWoFeQVrBWwFeQV4BWsFegVsBW0FegVtBW4FegV5BWwFewV6BW4FfAVuBW8FfAV7BW4FfQVvBXAFfQV8BW8FfgVwBXEFfgV9BXAFfwVxBXIFfwVyBXMFfwV+BXEFdAV/BXMFhQWGBYcFjwWFBY4FjQWOBYUFkAWFBY8FjAWNBYUFkQWFBZAFiwWMBYUFkgWFBZEFigWLBYUFkwWFBZIFiQWKBYUFlAWFBZMFiAWJBYUFlQWFBZQFhAWVBZYFlwWEBZYFmAWEBZcFmQWEBZgFmgWEBZkFmwWEBZoFnAWEBZsFnQWEBZwFngWEBZ0FnwWEBZ4FggWxBbIFggWyBbMFggWzBbQFggW0BbUFggW1BbYFggW2BbcFggW3BbgFggW4BbkFggW5BboFggW6BYgFggWIBYUFsAWxBYIFoAWEBZ8FrwWwBYIFoQWEBaAFgQWCBYUFgQWFBYcFrgWvBYIFgAWCBYEFgwWiBaMFgwWjBaQFgwWkBaUFgwWlBaYFgwWmBacFgwWnBagFgwWoBakFgwWpBaoFgwWqBasFgwWrBawFgwWsBa0FgwWtBa4FggWDBa4FgwWEBaIFogWEBaEFhAWFBZUF0wXUBdUF0QXSBdMF2QXXBdgF2wXXBdkF2wXVBdYF2wXWBdcF2wXZBdoF2wXTBdUFzgXRBdMFzgXPBdAFzgXQBdEF3QXbBdwFzAXNBc4FygXOBdMFygXLBcwFygXMBc4FyAXJBcoFyAXTBdsFyAXbBd0FyAXKBdMF5QXiBeMF5QXjBeQF5wXiBeUF5wXlBeYF6AXiBecFxQXGBccFxQXHBcgFxQXdBd4FxQXeBd8FxQXIBd0F6gXoBekF6gXiBegFwwXEBcUF7AXqBesF7AXiBeoFwQXCBcMFwAXDBcUFwAXBBcMF7gXsBe0FvgW/BcAF7wXiBewF7wXsBe4FvAW9Bb4FvAXfBeAFvAXgBeEFvAXhBeIFvAXFBd8FvAXABcUFvAW+BcAFuwW8BeIF8wXwBfEF8wXxBfIFEwYUBrsF9QXzBfQFEgYTBrsF+AXzBfUF+AX1BfYF+AX2BfcF+AXwBfMFEAa7BeIFEAYRBhIGEAYSBrsF+wX4BfkF+wX5BfoFCwYQBuIFCwYMBg0GCwYNBg4GCwYOBg8GCwYPBhAGCQYLBuIFCQYKBgsGCAbiBe8FCAYJBuIFBwYIBu8FBwbvBfAFBQbwBfgFBQYHBvAFBQYGBgcGAgb4BfsFAgYFBvgFAgYDBgQGAgYEBgUGAAYBBgIG/AUCBvsF/AUABgIG/AX9Bf4F/AX+Bf8F/AX/BQAGPgYVBhYGPwYWBhcGPwY+BhYGQAYXBhgGQAY/BhcGQQYYBhkGQQZABhgGQgZBBhkGQgYZBhoGQwZCBhoGQwYaBhsGRAZDBhsGRQZEBhsGRQYbBhwGRQYcBh0GRgYdBh4GRgZFBh0GRwZGBh4GSAYeBh8GSAYfBiAGSAZHBh4GSQZIBiAGSgYgBiEGSgYhBiIGSgZJBiAGSwZKBiIGTAYiBiMGTAZLBiIGTQYjBiQGTQZMBiMGTgYkBiUGTgYlBiYGTgZNBiQGTwYmBicGTwZOBiYGUAZPBicGUQYnBigGUQYoBikGUQZQBicGUgYpBioGUgZRBikGUwZSBioGVAYqBisGVAZTBioGVQYrBiwGVQZUBisGVgYsBi0GVgZVBiwGVwYtBi4GVwZWBi0GWAYuBi8GWAZXBi4GWQYvBjAGWQZYBi8GWgYwBjEGWgYxBjIGWgZZBjAGWwZaBjIGXAZbBjIGXAYyBjMGXAYzBjQGXQZcBjQGXgZdBjQGXgY0BjUGXwZeBjUGXwY1BjYGXwY2BjcGYAZfBjcGYQZgBjcGYQY3BjgGYQY4BjkGYgZhBjkGYwZiBjkGYwY5BjoGYwY6BjsGZAZjBjsGZAY7BjwGPQZkBjwGdQZlBmYGdgZ1BmYGdwZmBmcGdwZnBmgGdwZ2BmYGeAZ3BmgGeQZoBmkGeQZ4BmgGegZpBmoGegZqBmsGegZ5BmkGewZ6BmsGfAZrBmwGfAZ7BmsGfQZsBm0GfQZ8BmwGfgZtBm4GfgZ9Bm0GfwZuBm8GfwZ+Bm4GgAZvBnAGgAZwBnEGgAZ/Bm8GgQaABnEGggZxBnIGggaBBnEGdAZyBnMGdAaCBnIGkAaDBoQGkQaEBoUGkQaQBoQGkgaFBoYGkgaRBoUGkwaGBocGkwaSBoYGlAaHBogGlAaTBocGlQaIBokGlQaUBogGlgaVBokGlwaJBooGlwaKBosGlwaWBokGmAaXBosGmQaLBowGmQaYBosGmgaMBo0GmgaZBowGjwaNBo4GjwaaBo0G\"\n  });\n  var b64 = (s) => typeof atob === \"function\" ? Uint8Array.from(atob(s), (c) => c.charCodeAt(0)) : Uint8Array.from(Buffer.from(s, \"base64\"));\n  function cabineoMesh() {\n    const p = b64(CABINEO_MESH.pos), i = b64(CABINEO_MESH.idx);\n    const q = new Int16Array(p.buffer, p.byteOffset, p.byteLength / 2), ix = new Uint16Array(i.buffer, i.byteOffset, i.byteLength / 2);\n    const pos = new Float32Array(q.length);\n    for (let k = 0; k < q.length; k++) pos[k] = q[k] * CABINEO_MESH.step;\n    return { pos, idx: new Uint32Array(ix) };\n  }\n\n  // v2/src/render/workshop-hardware.js\n  function createWorkshopHardware(THREE) {\n    const group = new THREE.Group();\n    group.name = \"production-hardware\";\n    const cylinder = new THREE.CylinderGeometry(1, 1, 1, 12);\n    const palette = {\n      dowel: 3120735,\n      confirmat: 3632015,\n      cam: 13208082,\n      pin: 753017,\n      hinge: 6321546,\n      runner: 6321546,\n      leg: 3159873,\n      \"cabineo-seat\": 14186518\n    };\n    const materials = /* @__PURE__ */ new Map();\n    const collarMaterial = new THREE.LineBasicMaterial({ color: 14186518 });\n    let signature = null, last = { items: [], skipped: 0 };\n    let productGeo = null;\n    const productMaterial = { all: new THREE.MeshLambertMaterial({ color: 2285658 }), fixings: new THREE.MeshLambertMaterial({ color: 10134445 }) };\n    const geoOf = () => {\n      if (!productGeo) {\n        const m = cabineoMesh();\n        productGeo = new THREE.BufferGeometry();\n        productGeo.setAttribute(\"position\", new THREE.BufferAttribute(m.pos, 3));\n        productGeo.setIndex(new THREE.BufferAttribute(m.idx, 1));\n        productGeo.computeVertexNormals();\n      }\n      return productGeo;\n    };\n    function clear() {\n      for (const m of group.children) {\n        if (m.dispose) m.dispose();\n        if (m.isLineSegments) m.geometry.dispose();\n      }\n      group.clear();\n    }\n    return {\n      group,\n      /* on: false | true / \"all\" (Hardware X-ray: every fitting) | \"fixings\" (normal view: only the Cabineo seats of the cabinets\n         whose chosen fixing is Cabineo - task 1791963906042) */\n      sync(scene, state2, on) {\n        var _a;\n        group.visible = !!on;\n        const mode = on === \"fixings\" ? \"fixings\" : \"all\";\n        if (!on) return;\n        const source = hardwareKey(scene);\n        const pose = scene.units.map((u) => [u.id, u.doorOpen, u.drawerOpen, u.leafOpen, u.drawers, u.xopen, u.explode, u.dispX, u.dispY, u.dispZ]);\n        const key = JSON.stringify([mode, state2 == null ? void 0 : state2.status, (_a = state2 == null ? void 0 : state2.packet) == null ? void 0 : _a.sourceSha256, (state2 == null ? void 0 : state2.key) === source, pose]);\n        if (key === signature) return;\n        signature = key;\n        clear();\n        last = mode === \"fixings\" ? fixingPrimitives(scene, state2) : hardwarePrimitives(scene, state2);\n        const up = new THREE.Vector3(0, 1, 0), batches = /* @__PURE__ */ new Map();\n        for (const p of last.items) {\n          const dir = new THREE.Vector3(...p.dir);\n          if (dir.lengthSq() < 0.99 || dir.lengthSq() > 1.01) continue;\n          const matKey = p.kind + \":\" + p.envelope;\n          if (!materials.has(matKey)) materials.set(matKey, new THREE.MeshLambertMaterial({\n            color: palette[p.kind] || 6321546,\n            transparent: !!p.envelope,\n            opacity: p.envelope ? 0.55 : 1,\n            depthWrite: !p.envelope,\n            wireframe: !!p.envelope\n          }));\n          if (!batches.has(matKey)) batches.set(matKey, []);\n          batches.get(matKey).push(p);\n        }\n        const dummy = new THREE.Object3D();\n        for (const [matKey, items] of batches) {\n          const mesh = new THREE.InstancedMesh(cylinder, materials.get(matKey), items.length);\n          items.forEach((p, i) => {\n            dummy.position.set(...p.pos);\n            dummy.quaternion.setFromUnitVectors(up, new THREE.Vector3(...p.dir).normalize());\n            dummy.scale.set(p.dia / 2, p.len, p.dia / 2);\n            dummy.updateMatrix();\n            mesh.setMatrixAt(i, dummy.matrix);\n          });\n          mesh.instanceMatrix.needsUpdate = true;\n          mesh.frustumCulled = false;\n          mesh.userData.production = items;\n          mesh.name = matKey;\n          group.add(mesh);\n        }\n        const prods = last.products || [];\n        if (prods.length) {\n          const mesh = new THREE.InstancedMesh(geoOf(), productMaterial[mode], prods.length), m4 = new THREE.Matrix4();\n          prods.forEach((p, i) => {\n            const [ex, ey, ez] = p.basis, o = p.origin;\n            m4.set(ex[0], ey[0], ez[0], o[0], ex[1], ey[1], ez[1], o[1], ex[2], ey[2], ez[2], o[2], 0, 0, 0, 1);\n            mesh.setMatrixAt(i, m4);\n          });\n          mesh.instanceMatrix.needsUpdate = true;\n          mesh.frustumCulled = false;\n          mesh.userData.production = prods;\n          mesh.name = \"cabineo-product\";\n          group.add(mesh);\n        }\n        const lines = [];\n        for (const p of last.paths || []) for (let i = 0; i < p.points.length; i++) lines.push(...p.points[i], ...p.points[(i + 1) % p.points.length]);\n        if (lines.length) {\n          const geometry = new THREE.BufferGeometry();\n          geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(lines, 3));\n          const line = new THREE.LineSegments(geometry, collarMaterial);\n          line.name = \"Cabineo collar envelopes\";\n          line.userData.production = last.paths;\n          group.add(line);\n        }\n      },\n      inspect: () => last,\n      dispose() {\n        clear();\n        cylinder.dispose();\n        materials.forEach((m) => m.dispose());\n        collarMaterial.dispose();\n        if (productGeo) productGeo.dispose();\n        productMaterial.all.dispose();\n        productMaterial.fixings.dispose();\n      }\n    };\n  }\n\n  // v2/src/render/renderer.js\n  var GHOST_XRAY = 2;\n  var LIGHT = { key: 2.65, fill: 0.35, hemi: 0.55, env: 1.2 };\n  var SUN_OFFSET = [-2600, 6200, 2600];\n  var STUDIO = { mid: \"#d1d1d1\", bottomCss: \"#949494\", bottom: 9737364 };\n  var UNIVERSE_LIGHT = {\n    keyColor: 16773596,\n    sunDist: 9e3,\n    shadowFar: 2e4,\n    bias: -12e-4,\n    normalBias: 4,\n    fill: 0.3,\n    fillColor: 11060479,\n    hemiSky: 14673392,\n    hemiGround: 7765384,\n    hemi: 0.5,\n    background: 0\n  };\n  function createRenderer(opts) {\n    const THREE = opts.THREE;\n    const canvas = opts.canvas || null;\n    const headless = !!opts.headless;\n    const win2 = opts.window || typeof globalThis !== \"undefined\" && globalThis.window || null;\n    const doc2 = win2 && win2.document;\n    const raf = win2 && win2.requestAnimationFrame ? win2.requestAnimationFrame.bind(win2) : null;\n    const caf = win2 && win2.cancelAnimationFrame ? win2.cancelAnimationFrame.bind(win2) : null;\n    const now = () => typeof performance !== \"undefined\" ? performance.now() : Date.now();\n    const q = {\n      level: Math.max(0, Math.min(MAX_LEVEL, opts.level != null ? opts.level : MAX_LEVEL)),\n      prevShadows: false,\n      tier: tierOf(opts.graphics)\n    };\n    const dprOf = () => pixelRatio(win2 && win2.devicePixelRatio || 1, L().maxDpr, q.tier);\n    const anisoOf = () => Math.min(q.tier.aniso, st.renderer.capabilities.getMaxAnisotropy());\n    const L = () => LEVELS[q.level];\n    const st = {\n      disposed: false,\n      lost: false,\n      envDirty: false,\n      renderer: null,\n      scene: null,\n      camera: null,\n      key: null,\n      envRT: null,\n      oakTex: null,\n      decorTex: /* @__PURE__ */ new Map(),\n      // decor class -> { tex } (task 1791046839036): each decor's own image, on first use\n      unitsRoot: null,\n      sceneGroup: null,\n      overlayGroup: null,\n      shapes: /* @__PURE__ */ new Map(),\n      // shapeKey -> { buckets:[{geom, cls, tex, role}], frontsLocal, refs }\n      units: /* @__PURE__ */ new Map(),\n      // unitId -> { key, shape, group, meshes:[{mesh, cls, tex, role}], basisKey, basis }\n      sceneSig: null,\n      overlaySig: null,\n      paintSig: null,\n      sceneGeoms: [],\n      overlayGeoms: [],\n      needsRender: false,\n      rafId: 0,\n      lastW: 0,\n      lastH: 0,\n      cam: null,\n      minProbe: Infinity,\n      sunOffset: SUN_OFFSET.slice(),\n      envWant: \"neutral\",\n      skin: \"neutral\",\n      stats: {\n        updates: 0,\n        unitBuilds: 0,\n        shapeHits: 0,\n        sceneBuilds: 0,\n        overlayBuilds: 0,\n        frames: 0,\n        lastUpdateMs: 0,\n        lastFrameMs: 0,\n        shadowUpdates: 0\n      }\n    };\n    const mats = createMaterialCache(\n      THREE,\n      (code) => code === MAT_CLASS.BOARD_OAK ? st.oakTex : decorTexture(code),\n      () => L().material === \"lambert\",\n      () => st.oakTex\n    );\n    function rawWrap(tex, raw) {\n      tex.wrapS = raw ? THREE.RepeatWrapping : THREE.MirroredRepeatWrapping;\n      tex.wrapT = THREE.MirroredRepeatWrapping;\n    }\n    function packTry(d) {\n      const p = d && d.pack;\n      if (!p || !p.url) return null;\n      return {\n        url: p.url,\n        uv: decorUvTransform({ grain: p.grain, mm: p.mm }, TEX),\n        raw: p.repeat === \"board\",\n        sample: p.repeat === \"sample\",\n        offset: p.offsetMm ? [p.offsetMm[0] / p.mm[0], p.offsetMm[1] / p.mm[1]] : null,\n        source: d.worktop ? \"egger-decor-image\" : \"root-pack\"\n      };\n    }\n    function placeTexture(tex, t) {\n      if (t.sample) {\n        tex.wrapS = tex.wrapT = THREE.RepeatWrapping;\n      } else rawWrap(tex, t.raw);\n      if (t.uv) {\n        tex.center.set(0, 0);\n        tex.rotation = t.uv.rotation;\n        tex.repeat.set(t.uv.repeat[0], t.uv.repeat[1]);\n      }\n      if (t.offset) tex.offset.set(t.offset[0], t.offset[1]);\n    }\n    function decorTexture(code) {\n      if (headless) return null;\n      const rec = st.decorTex.get(code);\n      if (rec) return rec.tex;\n      const d = decorOfClass(code);\n      if (!d || d.kind !== \"texture\") return null;\n      const raw = decorRawUrl(d);\n      const tries = [];\n      const pk = packTry(d);\n      if (pk) tries.push(pk);\n      if (raw) tries.push({ url: raw, uv: decorUvTransform({ grain: \"v\", mm: RAW_MM }, TEX), raw: true, source: \"egger-board\" });\n      const shop = decorImageUrl(d, 1024);\n      if (shop) tries.push({ url: shop, uv: decorUvTransform(d, TEX), raw: false, source: \"shop\" });\n      const slot = { tex: null, failed: false, source: null };\n      st.decorTex.set(code, slot);\n      const load = (i) => {\n        if (i >= tries.length) {\n          slot.failed = true;\n          return;\n        }\n        const t = tries[i];\n        new THREE.TextureLoader().setCrossOrigin(\"anonymous\").load(t.url, (tex) => {\n          if (st.disposed) {\n            tex.dispose();\n            return;\n          }\n          tex.colorSpace = THREE.SRGBColorSpace;\n          placeTexture(tex, t);\n          tex.anisotropy = anisoOf();\n          slot.tex = tex;\n          slot.source = t.source || (t.raw ? \"egger-board\" : \"shop\");\n          mats.dropCode(code);\n          repaintAll();\n          invalidate();\n        }, void 0, () => load(i + 1));\n      };\n      load(0);\n      return null;\n    }\n    if (!headless) {\n      const r = new THREE.WebGLRenderer({\n        canvas,\n        antialias: opts.antialias != null ? !!opts.antialias : true,\n        alpha: false,\n        powerPreference: \"high-performance\",\n        preserveDrawingBuffer: !!opts.preserveDrawingBuffer\n      });\n      r.outputColorSpace = THREE.SRGBColorSpace;\n      try {\n        const a = r.getContextAttributes && r.getContextAttributes();\n        st.ctxAA = !!(a && a.antialias);\n      } catch {\n        st.ctxAA = false;\n      }\n      r.toneMapping = THREE.NeutralToneMapping;\n      r.toneMappingExposure = 1;\n      r.shadowMap.enabled = L().shadows;\n      r.shadowMap.type = THREE.PCFShadowMap;\n      r.shadowMap.autoUpdate = false;\n      r.setPixelRatio(dprOf());\n      st.renderer = r;\n    }\n    st.scene = new THREE.Scene();\n    st.scene.background = new THREE.Color(BACKGROUND);\n    buildBackdrop();\n    st.camera = new THREE.PerspectiveCamera(35, 1, 10, 4e4);\n    st.unitsRoot = new THREE.Group();\n    st.unitsRoot.name = \"units\";\n    st.sceneGroup = new THREE.Group();\n    st.sceneGroup.name = \"room\";\n    st.overlayGroup = new THREE.Group();\n    st.overlayGroup.name = \"overlay\";\n    st.scene.add(st.unitsRoot, st.sceneGroup, st.overlayGroup);\n    const workshopHardware = createWorkshopHardware(THREE);\n    st.scene.add(workshopHardware.group);\n    st.glow = !headless && doc2 && doc2.createElement ? createEveningGlow(THREE, doc2) : null;\n    if (st.glow) st.scene.add(st.glow.group);\n    st.arrowGroup = new THREE.Group();\n    st.arrowGroup.name = \"size-arrows\";\n    st.scene.add(st.arrowGroup);\n    st.arrowSrc = null;\n    st.arrowNodes = /* @__PURE__ */ new Map();\n    st.leaderNodes = /* @__PURE__ */ new Map();\n    st.arrowKit = null;\n    function arrowKit() {\n      if (st.arrowKit) return st.arrowKit;\n      st.arrowKit = {\n        shaft: new THREE.CylinderGeometry(6, 6, 70, 12),\n        head: new THREE.ConeGeometry(16, 40, 16),\n        mat: new THREE.MeshStandardMaterial({ color: \"#eb6f00\", roughness: 0.45, metalness: 0.1 }),\n        hot: new THREE.MeshStandardMaterial({ color: \"#ffb45c\", roughness: 0.35, emissive: new THREE.Color(\"#eb6f00\"), emissiveIntensity: 0.5 }),\n        up: new THREE.Vector3(0, 1, 0),\n        dir: new THREE.Vector3(),\n        /* the thin leader from an arrow floated clear of a narrow gap down to the edge it drives\n           (interact/handles.js widthGap, task 1790892947971) */\n        leader: new THREE.CylinderGeometry(1, 1, 1, 8),\n        leaderMat: new THREE.MeshBasicMaterial({ color: \"#eb6f00\", transparent: true, opacity: 0.7 })\n      };\n      return st.arrowKit;\n    }\n    function syncArrows() {\n      const list = st.arrowSrc ? st.arrowSrc() || [] : [];\n      const seen = /* @__PURE__ */ new Set();\n      for (const a of list) {\n        if (!a || !a.p || !a.dir) continue;\n        const K2 = arrowKit();\n        let g2 = st.arrowNodes.get(a.hid);\n        if (!g2) {\n          g2 = new THREE.Group();\n          g2.name = \"arrow:\" + a.hid;\n          const shaft = new THREE.Mesh(K2.shaft, K2.mat);\n          shaft.position.y = 35;\n          const head = new THREE.Mesh(K2.head, K2.mat);\n          head.position.y = 88;\n          g2.add(shaft, head);\n          st.arrowNodes.set(a.hid, g2);\n          st.arrowGroup.add(g2);\n        }\n        seen.add(a.hid);\n        K2.dir.set(a.dir[0], a.dir[1], a.dir[2]).normalize();\n        g2.quaternion.setFromUnitVectors(K2.up, K2.dir);\n        g2.position.set(a.p[0], a.p[1], a.p[2]);\n        g2.scale.setScalar(a.s || 1);\n        const m = a.hot ? K2.hot : K2.mat;\n        g2.children[0].material = m;\n        g2.children[1].material = m;\n        g2.visible = true;\n        let ld = st.leaderNodes.get(a.hid);\n        if (a.leader && a.leader[0] && a.leader[1]) {\n          if (!ld) {\n            ld = new THREE.Mesh(K2.leader, K2.leaderMat);\n            ld.name = \"leader:\" + a.hid;\n            st.leaderNodes.set(a.hid, ld);\n            st.arrowGroup.add(ld);\n          }\n          const [p, q2] = a.leader, dx = q2[0] - p[0], dy = q2[1] - p[1], dz = q2[2] - p[2], len = Math.hypot(dx, dy, dz) || 1;\n          K2.dir.set(dx / len, dy / len, dz / len);\n          ld.quaternion.setFromUnitVectors(K2.up, K2.dir);\n          ld.position.set((p[0] + q2[0]) / 2, (p[1] + q2[1]) / 2, (p[2] + q2[2]) / 2);\n          const r = 1.8 * (a.s || 1);\n          ld.scale.set(r, len, r);\n          ld.visible = true;\n        } else if (ld) ld.visible = false;\n      }\n      for (const [hid, g2] of st.arrowNodes) if (!seen.has(hid)) g2.visible = false;\n      for (const [hid, ld] of st.leaderNodes) if (!seen.has(hid)) ld.visible = false;\n    }\n    buildLighting();\n    buildEnvironment();\n    st.hemi.intensity = hemiFor(L());\n    st.neutralBackground = st.scene.background;\n    st.env = createEnvironment(THREE, {\n      scene: st.scene,\n      headless,\n      renderer: () => st.renderer,\n      onReady: () => {\n        applySkin();\n        if (opts.onEnvironment) opts.onEnvironment(st.env.state());\n      },\n      onError: () => {\n        applySkin();\n        if (opts.onEnvironment) opts.onEnvironment(st.env.state());\n      }\n    });\n    function applySkin() {\n      const uni = st.env.active() === \"universe\";\n      st.skin = uni ? \"universe\" : \"neutral\";\n      const k = st.key;\n      if (uni) {\n        st.sunOffset = [SUN_DIR[0] * UNIVERSE_LIGHT.sunDist, SUN_DIR[1] * UNIVERSE_LIGHT.sunDist, SUN_DIR[2] * UNIVERSE_LIGHT.sunDist];\n        k.color.setHex(UNIVERSE_LIGHT.keyColor);\n        k.shadow.bias = UNIVERSE_LIGHT.bias;\n        k.shadow.normalBias = UNIVERSE_LIGHT.normalBias;\n        k.shadow.camera.far = UNIVERSE_LIGHT.shadowFar;\n        st.fill.color.setHex(UNIVERSE_LIGHT.fillColor);\n        st.fill.intensity = UNIVERSE_LIGHT.fill;\n        st.fill.position.set(EARTH_DIR[0] * 3e3, EARTH_DIR[1] * 3e3, EARTH_DIR[2] * 3e3);\n        st.hemi.color.setHex(UNIVERSE_LIGHT.hemiSky);\n        st.hemi.groundColor.setHex(UNIVERSE_LIGHT.hemiGround);\n        st.scene.background = new THREE.Color(UNIVERSE_LIGHT.background);\n      } else {\n        st.sunOffset = SUN_OFFSET.slice();\n        k.color.setHex(16774890);\n        k.shadow.bias = -6e-4;\n        k.shadow.normalBias = 1.2;\n        k.shadow.camera.far = 12e3;\n        st.fill.color.setHex(16777215);\n        st.fill.intensity = LIGHT.fill;\n        st.fill.position.set(-2500, 1200, -1500);\n        st.hemi.color.setHex(16777215);\n        st.hemi.groundColor.setHex(10134445);\n        st.scene.background = st.neutralBackground;\n      }\n      st.hemi.intensity = hemiFor(L());\n      k.shadow.camera.updateProjectionMatrix();\n      if (st.ground) st.ground.visible = !uni;\n      if (st.renderer) st.renderer.localClippingEnabled = uni;\n      clipToRoom();\n      const tx = k.target.position.x, tz = k.target.position.z;\n      k.position.set(tx + st.sunOffset[0], st.sunOffset[1], tz + st.sunOffset[2]);\n      k.updateMatrixWorld();\n      if (st.renderer) {\n        st.renderer.shadowMap.needsUpdate = true;\n        st.stats.shadowUpdates++;\n      }\n      invalidate();\n    }\n    function clipToRoom() {\n      const uni = st.skin === \"universe\";\n      const mats2 = [st.grid && st.grid.material, st.catcher && st.catcher.material].filter(Boolean);\n      let planes = null;\n      if (uni) {\n        const sz = roomSize() || {}, w = sz.width || 0, d = sz.depth || 0;\n        planes = [\n          new THREE.Plane(new THREE.Vector3(1, 0, 0), 0),\n          new THREE.Plane(new THREE.Vector3(-1, 0, 0), w),\n          new THREE.Plane(new THREE.Vector3(0, 0, 1), 0),\n          new THREE.Plane(new THREE.Vector3(0, 0, -1), d)\n        ];\n      }\n      for (const m of mats2) {\n        const had = !!(m.clippingPlanes && m.clippingPlanes.length);\n        m.clippingPlanes = planes;\n        if (had !== !!planes) m.needsUpdate = true;\n      }\n    }\n    function buildBackdrop() {\n      if (headless || !st.renderer) return;\n      const d = canvas && canvas.ownerDocument || win2 && win2.document;\n      if (d && d.createElement) {\n        const c = d.createElement(\"canvas\");\n        c.width = 8;\n        c.height = 256;\n        const g2 = c.getContext && c.getContext(\"2d\");\n        if (g2) {\n          const grad = g2.createLinearGradient(0, 0, 0, 256);\n          grad.addColorStop(0, SKY[0]);\n          grad.addColorStop(0.55, SKY[1]);\n          grad.addColorStop(1, SKY[2]);\n          g2.fillStyle = grad;\n          g2.fillRect(0, 0, 8, 256);\n          const tex = new THREE.CanvasTexture(c);\n          tex.colorSpace = THREE.SRGBColorSpace;\n          st.scene.background = tex;\n        }\n      }\n      const ground = new THREE.Mesh(new THREE.PlaneGeometry(4e4, 4e4), new THREE.MeshBasicMaterial({ color: GROUND }));\n      ground.rotation.x = -Math.PI / 2;\n      ground.position.y = -LEG_H - 18;\n      ground.name = \"ground\";\n      ground.material.depthWrite = false;\n      ground.renderOrder = -2;\n      st.scene.add(ground);\n      st.ground = ground;\n      const catcher = new THREE.Mesh(new THREE.PlaneGeometry(4e4, 4e4), new THREE.ShadowMaterial({ opacity: 0.22 }));\n      catcher.rotation.x = -Math.PI / 2;\n      catcher.position.y = -LEG_H + 0.5;\n      catcher.receiveShadow = true;\n      catcher.name = \"shadow-catcher\";\n      st.scene.add(catcher);\n      st.catcher = catcher;\n      st.grid = null;\n      placeGrid();\n    }\n    function placeGrid() {\n      if (headless || !st.renderer) return;\n      const sz = roomSize() || {};\n      const span2 = Math.max(12e3, Math.ceil((Math.max(sz.width || 0, sz.depth || 0) + 6e3) / 1e3) * 1e3);\n      if (!st.grid || st.gridSpan !== span2) {\n        if (st.grid) {\n          st.scene.remove(st.grid);\n          st.grid.geometry.dispose();\n          st.grid.material.dispose();\n        }\n        st.grid = new THREE.GridHelper(span2, span2 / GRID.cell, GRID.major, GRID.minor);\n        st.grid.material.toneMapped = false;\n        st.grid.name = \"floor-grid\";\n        st.gridSpan = span2;\n        st.scene.add(st.grid);\n      }\n      const under = !floorIsDefault(st.room);\n      st.grid.material.depthWrite = !under;\n      st.grid.renderOrder = under ? -1 : 0;\n      st.grid.position.set((sz.width || 0) / 2, under ? -LEG_H - 17 : -LEG_H + 1, (sz.depth || 0) / 2);\n      if (st.env) clipToRoom();\n    }\n    function hemiFor(lv) {\n      return st.skin === \"universe\" ? UNIVERSE_LIGHT.hemi : LIGHT.hemi;\n    }\n    function envFillFor(lv) {\n      return lv.env ? 0 : LIGHT.env * Math.PI;\n    }\n    function buildLighting() {\n      const key = new THREE.DirectionalLight(16774890, LIGHT.key);\n      key.position.set(SUN_OFFSET[0], SUN_OFFSET[1], SUN_OFFSET[2]);\n      key.castShadow = true;\n      key.shadow.mapSize.set(2048, 2048);\n      key.shadow.bias = -6e-4;\n      key.shadow.normalBias = 1.2;\n      key.shadow.radius = 2.5;\n      const c = key.shadow.camera;\n      c.left = -4e3;\n      c.right = 4e3;\n      c.top = 4e3;\n      c.bottom = -4e3;\n      c.near = 100;\n      c.far = 12e3;\n      st.scene.add(key, key.target);\n      st.key = key;\n      const fill = new THREE.DirectionalLight(16777215, LIGHT.fill);\n      fill.position.set(-2500, 1200, -1500);\n      st.scene.add(fill);\n      st.fill = fill;\n      st.hemi = new THREE.HemisphereLight(16777215, 10134445, LIGHT.hemi);\n      st.scene.add(st.hemi);\n      st.envFill = new THREE.HemisphereLight(16777215, STUDIO.bottom, envFillFor(L()));\n      st.envFill.name = \"env-fill\";\n      st.scene.add(st.envFill);\n      st.scene.environmentIntensity = LIGHT.env;\n    }\n    function gradientStudio(d) {\n      const c = d.createElement(\"canvas\");\n      c.width = 64;\n      c.height = 64;\n      const g2 = c.getContext && c.getContext(\"2d\");\n      if (!g2) return null;\n      const grad = g2.createLinearGradient(0, 0, 0, 64);\n      grad.addColorStop(0, \"#ffffff\");\n      grad.addColorStop(0.5, STUDIO.mid);\n      grad.addColorStop(1, STUDIO.bottomCss);\n      g2.fillStyle = grad;\n      g2.fillRect(0, 0, 64, 64);\n      g2.fillStyle = \"rgba(255,255,255,0.9)\";\n      g2.fillRect(8, 6, 48, 10);\n      return c;\n    }\n    function canvasMeanLinear(c) {\n      const g2 = c.getContext(\"2d\"), a = g2.getImageData(0, 0, c.width, c.height).data;\n      const lin = (v) => {\n        v /= 255;\n        return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n      };\n      let s = 0;\n      for (let i = 0; i < a.length; i += 4) s += 0.2126 * lin(a[i]) + 0.7152 * lin(a[i + 1]) + 0.0722 * lin(a[i + 2]);\n      return s / (a.length / 4);\n    }\n    function softBoxStudio(d, gain) {\n      const W2 = 1024, H2 = 512, c = d.createElement(\"canvas\");\n      c.width = W2;\n      c.height = H2;\n      const g2 = c.getContext && c.getContext(\"2d\");\n      if (!g2 || !g2.getImageData) return null;\n      const grad = g2.createLinearGradient(0, 0, 0, H2);\n      grad.addColorStop(0, \"#f4f4f4\");\n      grad.addColorStop(0.46, \"#c9c9c9\");\n      grad.addColorStop(0.54, \"#a9a6a2\");\n      grad.addColorStop(1, \"#7e7b78\");\n      g2.fillStyle = grad;\n      g2.fillRect(0, 0, W2, H2);\n      const box3 = (u, v, bw, bh, col, a) => {\n        g2.save();\n        g2.globalAlpha = a;\n        g2.fillStyle = col;\n        g2.filter = \"blur(\" + Math.round(Math.min(bw, bh) * 0.12) + \"px)\";\n        g2.fillRect(u * W2 - bw / 2, v * H2 - bh / 2, bw, bh);\n        g2.restore();\n      };\n      for (const u of [0.5, 0, 1]) box3(u, 0.22, 300, 70, \"#ffffff\", 0.95);\n      box3(0.25, 0.36, 90, 220, \"#ffffff\", 0.9);\n      box3(0.75, 0.36, 90, 220, \"#fff4e6\", 0.75);\n      box3(0.5, 0.42, 520, 40, \"#ffffff\", 0.35);\n      if (gain !== 1) {\n        const im = g2.getImageData(0, 0, W2, H2), a = im.data;\n        const f = (v) => {\n          v /= 255;\n          let l = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n          l = Math.min(1, l * gain);\n          return Math.round(255 * (l <= 31308e-7 ? l * 12.92 : 1.055 * Math.pow(l, 1 / 2.4) - 0.055));\n        };\n        for (let i = 0; i < a.length; i += 4) {\n          a[i] = f(a[i]);\n          a[i + 1] = f(a[i + 1]);\n          a[i + 2] = f(a[i + 2]);\n        }\n        g2.putImageData(im, 0, 0);\n      }\n      return c;\n    }\n    function studioCanvas() {\n      const d = canvas && canvas.ownerDocument || doc2;\n      if (!d || !d.createElement) return null;\n      const old = gradientStudio(d);\n      if (!old) return null;\n      try {\n        const raw = softBoxStudio(d, 1);\n        if (!raw) return old;\n        const want = canvasMeanLinear(old);\n        let gain = want / canvasMeanLinear(raw), soft = softBoxStudio(d, gain);\n        for (let i = 0; i < 3; i++) {\n          const m = canvasMeanLinear(soft);\n          if (Math.abs(m - want) / want < 5e-3) break;\n          gain *= want / m;\n          soft = softBoxStudio(d, gain);\n        }\n        st.envMeans = { old: want, soft: canvasMeanLinear(soft), gain };\n        return soft;\n      } catch {\n        return old;\n      }\n    }\n    function buildEnvironment() {\n      if (st.envRT) {\n        st.envRT.dispose();\n        st.envRT = null;\n        st.scene.environment = null;\n      }\n      if (headless || !st.renderer || !L().env) return;\n      const pmrem = new THREE.PMREMGenerator(st.renderer);\n      const sc = studioCanvas();\n      if (sc) {\n        const src = new THREE.CanvasTexture(sc);\n        src.mapping = THREE.EquirectangularReflectionMapping;\n        src.colorSpace = THREE.SRGBColorSpace;\n        st.envRT = pmrem.fromEquirectangular(src);\n        st.scene.environment = st.envRT.texture;\n        pmrem.dispose();\n        src.dispose();\n        return;\n      }\n      const envScene = new THREE.Scene();\n      envScene.background = new THREE.Color(14672872);\n      const pg = new THREE.PlaneGeometry(6e3, 3e3), pm = new THREE.MeshBasicMaterial({ color: 16777215 });\n      const panel = new THREE.Mesh(pg, pm);\n      panel.position.set(0, 2400, -2600);\n      envScene.add(panel);\n      const panel2 = new THREE.Mesh(pg, pm);\n      panel2.position.set(-2600, 2e3, 0);\n      panel2.rotation.y = Math.PI / 2;\n      envScene.add(panel2);\n      st.envRT = pmrem.fromScene(envScene, 0.04);\n      st.scene.environment = st.envRT.texture;\n      pmrem.dispose();\n      pg.dispose();\n      pm.dispose();\n    }\n    function applyLevel(prevMaterial) {\n      const lv = L();\n      st.hemi.intensity = hemiFor(lv);\n      st.envFill.intensity = envFillFor(lv);\n      if (st.renderer) {\n        st.renderer.shadowMap.enabled = lv.shadows;\n        st.renderer.shadowMap.needsUpdate = true;\n        st.renderer.setPixelRatio(dprOf());\n        st.lastW = 0;\n      }\n      buildEnvironment();\n      if (prevMaterial !== lv.material || q.prevShadows !== lv.shadows) {\n        mats.clear();\n        repaintAll();\n      }\n      if (q.prevShadows !== lv.shadows && st.catcher) st.catcher.material.needsUpdate = true;\n    }\n    function setLevel(n) {\n      n = Math.max(0, Math.min(MAX_LEVEL, n | 0));\n      if (n === q.level) return false;\n      const prevMaterial = L().material;\n      q.prevShadows = L().shadows;\n      q.level = n;\n      applyLevel(prevMaterial);\n      invalidate();\n      return true;\n    }\n    function loadOak(url) {\n      if (headless) return Promise.resolve(false);\n      const oak = decorOf(\"oak\"), raw = decorRawUrl(oak);\n      const tries = [];\n      const pk = packTry(oak);\n      if (pk) tries.push(pk);\n      if (raw) tries.push({ url: raw, uv: decorUvTransform({ grain: \"v\", mm: RAW_MM }, TEX), raw: true, source: \"egger-board\" });\n      if (url) tries.push({ url, uv: null, raw: false, source: \"theme-scan\" });\n      return new Promise((resolve) => {\n        const load = (i) => {\n          if (i >= tries.length) {\n            resolve(false);\n            return;\n          }\n          const t = tries[i];\n          new THREE.TextureLoader().setCrossOrigin(\"anonymous\").load(t.url, (tex) => {\n            if (st.disposed) {\n              tex.dispose();\n              resolve(false);\n              return;\n            }\n            tex.colorSpace = THREE.SRGBColorSpace;\n            placeTexture(tex, t);\n            tex.anisotropy = anisoOf();\n            st.oakTex = tex;\n            st.oakSource = t.source;\n            mats.dropTextured();\n            repaintAll();\n            invalidate();\n            resolve(true);\n          }, void 0, () => load(i + 1));\n        };\n        load(0);\n      });\n    }\n    const oakReady = loadOak(opts.oakTextureUrl);\n    function acquireShape(u, key, basis) {\n      let sh = st.shapes.get(key);\n      if (sh) {\n        sh.refs++;\n        st.stats.shapeHits++;\n        return sh;\n      }\n      const d = [];\n      d.meta = [];\n      const fronts = emitUnitLayer(d, u) || [];\n      const inv = invBasis(basis);\n      const buckets = [];\n      bucketize(d, inv).forEach((b) => {\n        const geom = toGeometry(THREE, b);\n        const edges = !headless && classStyle(b.cls).board ? new THREE.EdgesGeometry(geom, 25) : null;\n        buckets.push({ geom, edges, cls: b.cls, tex: b.tex, role: b.role, tris: b.pos.length / 9 });\n      });\n      sh = { key, buckets, frontsLocal: fronts.map((f) => frontToLocal(f, inv)), refs: 1 };\n      st.shapes.set(key, sh);\n      st.stats.unitBuilds++;\n      return sh;\n    }\n    function releaseShape(sh) {\n      if (--sh.refs > 0) return;\n      sh.buckets.forEach((b) => {\n        b.geom.dispose();\n        if (b.edges) b.edges.dispose();\n      });\n      st.shapes.delete(sh.key);\n    }\n    function edgeMat() {\n      if (!st.edgeMat) st.edgeMat = new THREE.LineBasicMaterial({ color: EDGE.color, transparent: true, opacity: EDGE.opacity, depthWrite: false });\n      return st.edgeMat;\n    }\n    function cutEdgeMat(k) {\n      st.cutEdgeMats = st.cutEdgeMats || {};\n      if (!st.cutEdgeMats[k]) st.cutEdgeMats[k] = new THREE.LineBasicMaterial({ color: EDGE.color, transparent: true, opacity: EDGE.opacity * cutAlpha(k), depthWrite: false });\n      return st.cutEdgeMats[k];\n    }\n    function edgeLines(geom) {\n      const l = new THREE.LineSegments(geom, edgeMat());\n      l.renderOrder = 1;\n      l.name = \"board-edges\";\n      return l;\n    }\n    function meshFor(b) {\n      const mesh = new THREE.Mesh(b.geom, mats.get(b.cls, b.tex, \"\"));\n      const s = classStyle(b.cls).shadow;\n      mesh.castShadow = s === \"cast\" || s === \"both\";\n      mesh.receiveShadow = s === \"receive\" || s === \"both\";\n      mesh.userData.cls = b.cls;\n      mesh.userData.tex = b.tex;\n      mesh.userData.role = b.role;\n      return mesh;\n    }\n    function setMatrix(group, b) {\n      group.matrix.set(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], 0, 0, 0, 1);\n      group.matrixWorldNeedsUpdate = true;\n    }\n    function dropUnit(rec) {\n      st.unitsRoot.remove(rec.group);\n      releaseShape(rec.shape);\n    }\n    function update(snap3) {\n      var _a;\n      if (st.disposed) return;\n      const t0 = now();\n      const units = snap3.units || [];\n      const view = snap3.view || {};\n      const live = /* @__PURE__ */ new Set();\n      let geomChanged = false;\n      let poseSig = \"\";\n      for (let i = 0; i < units.length; i++) {\n        const u = units[i];\n        live.add(u.id);\n        const key = unitShapeKey(u);\n        const basis = unitBasis(u);\n        const bk = basis.join(\",\");\n        poseSig += u.id + \"@\" + key + \"@\" + bk + \";\";\n        let rec = st.units.get(u.id);\n        if (rec && rec.key === key) {\n          if (rec.basisKey !== bk) {\n            setMatrix(rec.group, basis);\n            rec.basisKey = bk;\n            rec.basis = basis;\n            geomChanged = true;\n          }\n          continue;\n        }\n        if (rec) {\n          dropUnit(rec);\n          st.units.delete(u.id);\n        }\n        const shape2 = acquireShape(u, key, basis);\n        const group = new THREE.Group();\n        group.matrixAutoUpdate = false;\n        group.userData.unitId = u.id;\n        setMatrix(group, basis);\n        const meshes = shape2.buckets.map((b) => {\n          const m = meshFor(b);\n          group.add(m);\n          return m;\n        });\n        shape2.buckets.forEach((b) => {\n          if (b.edges) group.add(edgeLines(b.edges));\n        });\n        rec = { key, shape: shape2, group, meshes, basisKey: bk, basis };\n        st.units.set(u.id, rec);\n        st.unitsRoot.add(group);\n        geomChanged = true;\n      }\n      for (const [id, rec] of st.units) if (!live.has(id)) {\n        dropUnit(rec);\n        st.units.delete(id);\n        geomChanged = true;\n      }\n      if (st.glow) st.glow.sync(units, (u) => {\n        const r = st.units.get(u.id);\n        return r ? r.basis : unitBasis(u);\n      }, poseSig + \"|\" + JSON.stringify(snap3.room || null) + \"|\" + JSON.stringify(snap3.kitchen && snap3.kitchen.worktop || null), snap3.kitchen || null);\n      st.room = snap3.room || null;\n      st.kitchen = snap3.kitchen || null;\n      const sceneSig = poseSig + \"|\" + JSON.stringify(snap3.room || null) + \"|\" + JSON.stringify(view.cornerTarget || null) + \"|\" + (view.roomSel || \"\") + \"|\" + JSON.stringify(view.roomDrag || null) + \"|\" + (view.roomArmed || \"\") + \"|\" + (view.roomObjSel || \"\") + \"|\" + JSON.stringify(snap3.kitchen && snap3.kitchen.worktop || null) + \"|\" + units.filter((u) => u.type === \"base-oven\").map((u) => u.id + (u.hood ? \"h\" : \"\")).join(\",\") + \"|\" + JSON.stringify(snap3.kitchen && snap3.kitchen.splash || null);\n      if (sceneSig !== st.sceneSig) {\n        st.sceneSig = sceneSig;\n        const fronts = [];\n        units.forEach((u) => {\n          const rec = st.units.get(u.id);\n          rec.shape.frontsLocal.forEach((f) => fronts.push(frontToWorld(f, rec.basis)));\n        });\n        const d = [];\n        d.meta = [];\n        d.wallSinks = {};\n        d.cutSinks = {};\n        emitSceneLayer(d, { units, kitchen: snap3.kitchen || null, room: snap3.room || null, cornerTarget: view.cornerTarget || null, roomSel: view.roomSel || null, roomDrag: view.roomDrag || null, roomArmed: view.roomArmed || null }, fronts);\n        replaceLayer(st.sceneGroup, \"sceneGeoms\", d);\n        placeGrid();\n        st.stats.sceneBuilds++;\n        geomChanged = true;\n      }\n      const ov = {\n        units,\n        selectedId: view.selectedId || null,\n        partsMode: !!view.partsMode,\n        explode: view.explode || 0,\n        hoverPart: view.hoverPart || null,\n        selPart: view.selPart || null,\n        partMarkScale: view.partMarkScale || 1,\n        alignView: !!view.alignView,\n        alignTemp: !!view.alignTemp,\n        snap: view.snap !== false,\n        cues: view.cues || null,\n        placeGhost: view.placeGhost || null,\n        dropPreview: view.dropPreview || null\n      };\n      const overlaySig = poseSig + \"|\" + JSON.stringify([\n        ov.selectedId,\n        ov.partsMode,\n        ov.explode,\n        ov.hoverPart,\n        ov.selPart,\n        ov.partMarkScale,\n        ov.alignView,\n        ov.alignTemp,\n        ov.snap,\n        ov.cues,\n        ov.placeGhost,\n        ov.dropPreview && ov.dropPreview.unit ? [ov.dropPreview.unit.type, Math.round(ov.dropPreview.unit.x), Math.round(ov.dropPreview.unit.z), ov.dropPreview.unit.rot || 0, ov.dropPreview.ok, Math.round(ov.dropPreview.unit.dispY || 0)] : null\n      ]);\n      if (overlaySig !== st.overlaySig) {\n        st.overlaySig = overlaySig;\n        const d = [];\n        d.meta = [];\n        emitOverlayLayer(d, ov);\n        replaceLayer(st.overlayGroup, \"overlayGeoms\", d);\n        st.stats.overlayBuilds++;\n      }\n      const want = envName(view.environment);\n      if (want !== st.envWant) {\n        st.envWant = want;\n        st.env.set(want);\n        if (want === \"neutral\") {\n          applySkin();\n          if (opts.onEnvironment) opts.onEnvironment(st.env.state());\n        }\n      }\n      st.view = view;\n      workshopHardware.sync(\n        { units, kitchen: snap3.kitchen, decors: snap3.decors },\n        view.productionHardware,\n        ((_a = view.productionHardware) == null ? void 0 : _a.enabled) ? view.hardwareXray ? \"all\" : fixingsShown({ units }) ? \"fixings\" : false : false\n      );\n      {\n        const want2 = view.evening ? 1 : 0;\n        if (want2 !== st.mood.to) {\n          st.mood.from = moodNow();\n          st.mood.to = want2;\n          st.mood.t0 = now();\n        }\n      }\n      repaintAll();\n      if (geomChanged && st.renderer) {\n        st.renderer.shadowMap.needsUpdate = true;\n        st.stats.shadowUpdates++;\n      }\n      st.stats.updates++;\n      st.stats.lastUpdateMs = now() - t0;\n      invalidate();\n    }\n    function replaceLayer(group, field, d) {\n      st[field].forEach((g2) => g2.dispose());\n      st[field] = [];\n      while (group.children.length) group.remove(group.children[0]);\n      addBuckets(group, field, d);\n      if (d.wallSinks) for (const wall of Object.keys(d.wallSinks)) {\n        const g2 = new THREE.Group();\n        g2.name = \"room-openings-\" + wall;\n        g2.userData.wall = wall;\n        addBuckets(g2, field, d.wallSinks[wall]);\n        group.add(g2);\n      }\n      if (d.cutSinks) for (const key of Object.keys(d.cutSinks)) {\n        const sk = d.cutSinks[key], g2 = new THREE.Group();\n        g2.name = \"run-part-\" + key;\n        g2.userData.cutUnits = sk.units;\n        addBuckets(g2, field, sk.d);\n        group.add(g2);\n      }\n      if (field === \"sceneGeoms\" && d.wallSinks) {\n        for (const seg of roomEdgeSegments(roomSize(), st.room)) {\n          const geom = new THREE.BufferGeometry();\n          geom.setAttribute(\"position\", new THREE.Float32BufferAttribute(seg.pos, 3));\n          st[field].push(geom);\n          const l = new THREE.LineSegments(geom, roomEdgeMat());\n          l.renderOrder = 1;\n          l.name = \"room-edges-\" + seg.kind + \"-\" + seg.walls.join(\"-\");\n          l.userData.edgeWalls = seg.walls;\n          group.add(l);\n        }\n      }\n    }\n    function roomEdgeMat() {\n      if (!st.roomEdgeMat) st.roomEdgeMat = new THREE.LineBasicMaterial({ color: ROOM_EDGE.color, transparent: true, opacity: ROOM_EDGE.opacity, depthWrite: false });\n      return st.roomEdgeMat;\n    }\n    function addBuckets(group, field, d) {\n      bucketize(d, null).forEach((b) => {\n        const geom = toGeometry(THREE, b);\n        st[field].push(geom);\n        group.add(meshFor({ geom, cls: b.cls, tex: b.tex, role: b.role }));\n        if (!headless && field === \"sceneGeoms\" && classStyle(b.cls).board) {\n          const edges = new THREE.EdgesGeometry(geom, 25);\n          st[field].push(edges);\n          group.add(edgeLines(edges));\n        }\n      });\n    }\n    function repaintAll() {\n      const v = st.view || {};\n      const xr = v.xray ? \"xray\" + Math.max(1, Math.min(3, v.xray | 0)) : \"\";\n      const fx = v.frontsSeeThrough ? \"xray4\" : \"\";\n      const hx = v.hardwareXray ? \"xray1\" : \"\";\n      let shadowFlip = false;\n      st.units.forEach((rec, id) => {\n        const isSel = id === v.selectedId;\n        const ck = v.cut && v.cut.get(id) || 0;\n        rec.meshes.forEach((m) => {\n          let variant = \"\";\n          if (isSel && classStyle(m.userData.cls).board) variant = \"sel\";\n          else if (id === v.hoverUnitId && classStyle(m.userData.cls).board) variant = \"hover\";\n          if (fx && m.userData.role === 1) variant = fx;\n          if (hx && classStyle(m.userData.cls).board) variant = hx;\n          if ((isSel || id === v.xrayUnitId) && xr && m.userData.role === 1) variant = xr;\n          if (v.ghostUnitId && id === v.ghostUnitId && m.userData.role === 1) {\n            const own2 = /^xray(\\d)$/.exec(variant);\n            if (!(own2 && XRAY_ALPHA[+own2[1]] < XRAY_ALPHA[GHOST_XRAY])) variant = \"xray\" + GHOST_XRAY;\n          }\n          if (ck) {\n            const own2 = /^xray(\\d)$/.exec(variant);\n            if (!(own2 && XRAY_ALPHA[+own2[1]] < cutAlpha(ck))) variant = \"cut\" + ck;\n          }\n          m.material = mats.get(m.userData.cls, m.userData.tex, variant);\n          if (m.userData.cast === void 0) m.userData.cast = m.castShadow;\n          const cast = m.userData.cast && !(ck > CUT_LEVELS / 2);\n          if (m.castShadow !== cast) {\n            m.castShadow = cast;\n            shadowFlip = true;\n          }\n        });\n        rec.group.children.forEach((c) => {\n          if (c.isLineSegments) c.material = ck ? cutEdgeMat(ck) : edgeMat();\n        });\n      });\n      if (shadowFlip && st.renderer) {\n        st.renderer.shadowMap.needsUpdate = true;\n        st.stats.shadowUpdates++;\n        shadowFlip = false;\n      }\n      const cutOfParts = (o) => {\n        const us = o.parent && o.parent.userData && o.parent.userData.cutUnits;\n        if (!us || !us.length || !v.cut) return 0;\n        let k = Infinity;\n        for (const id of us) {\n          const c = v.cut.get(id);\n          if (!c) return 0;\n          if (c < k) k = c;\n        }\n        return k;\n      };\n      [st.sceneGroup, st.overlayGroup].forEach((g2) => g2.traverse((m) => {\n        if (m.isLineSegments && m.parent && m.parent.userData && m.parent.userData.cutUnits) {\n          const k2 = cutOfParts(m);\n          m.material = k2 ? cutEdgeMat(k2) : edgeMat();\n          return;\n        }\n        if (!m.isMesh) return;\n        const k = cutOfParts(m);\n        m.material = m.userData.cls === MAT_CLASS.FLOOR_FINISH && floorMaterial() || m.userData.cls === MAT_CLASS.SPLASH_TILE && splashMaterial() || mats.get(m.userData.cls, m.userData.tex, k ? \"cut\" + k : hx && m.parent && m.parent.userData && m.parent.userData.cutUnits ? hx : \"\");\n        if (m.parent && m.parent.userData && m.parent.userData.cutUnits) {\n          if (m.userData.cast === void 0) m.userData.cast = m.castShadow;\n          const cast = m.userData.cast && !(k > CUT_LEVELS / 2);\n          if (m.castShadow !== cast) {\n            m.castShadow = cast;\n            shadowFlip = true;\n          }\n        }\n      }));\n      if (shadowFlip && st.renderer) {\n        st.renderer.shadowMap.needsUpdate = true;\n        st.stats.shadowUpdates++;\n      }\n    }\n    function syncWallParts() {\n      const g2 = st.sceneGroup;\n      if (!g2) return;\n      const sz = roomSize();\n      const p = st.camera.position, eye = [p.x, p.y, p.z];\n      let flipped = false;\n      for (const c of g2.children) {\n        if (!c.userData.wall && !c.userData.edgeWalls) continue;\n        const seen = c.userData.edgeWalls ? c.userData.edgeWalls.every((w) => wallSeenFrom(w, sz, eye)) : wallSeenFrom(c.userData.wall, sz, eye);\n        if (c.visible !== seen) {\n          c.visible = seen;\n          flipped = true;\n        }\n      }\n      if (flipped && st.renderer) {\n        st.renderer.shadowMap.needsUpdate = true;\n        st.stats.shadowUpdates++;\n      }\n    }\n    function splashMaterial() {\n      if (headless || !doc2) return null;\n      const S2 = splashOf(st.kitchen);\n      if (!S2.on || S2.kind !== \"tiles\") return null;\n      const key = JSON.stringify([S2.colour, S2.tile]);\n      st.splashMats = st.splashMats || /* @__PURE__ */ new Map();\n      let m = st.splashMats.get(key);\n      if (m === void 0) {\n        const tex = makeSplashTexture(THREE, doc2, S2);\n        m = tex ? new THREE.MeshStandardMaterial({ map: tex, roughness: MATERIAL_SPECS.splashTile.roughness, metalness: 0 }) : null;\n        if (m) {\n          m.polygonOffset = true;\n          m.polygonOffsetFactor = 1;\n          m.polygonOffsetUnits = 1;\n        }\n        st.splashMats.set(key, m);\n      }\n      return m;\n    }\n    function floorMaterial() {\n      if (headless || !doc2) return null;\n      const f = floorFinishOf(st.room), c = floorColourOf(st.room);\n      if (f.id === \"plain\") return null;\n      const key = f.id + \"|\" + c.id;\n      st.floorMats = st.floorMats || /* @__PURE__ */ new Map();\n      let m = st.floorMats.get(key);\n      if (m === void 0) {\n        const tex = makeFloorTexture(THREE, doc2, f.id, c.hex);\n        m = tex ? new THREE.MeshBasicMaterial({ map: tex, toneMapped: false }) : null;\n        if (m) {\n          m.polygonOffset = true;\n          m.polygonOffsetFactor = 2;\n          m.polygonOffsetUnits = 2;\n        }\n        st.floorMats.set(key, m);\n      }\n      return m;\n    }\n    function setCamera(cam) {\n      if (!cam) return;\n      st.cam = cam;\n      const c = st.camera;\n      c.fov = cam.fovY * 180 / Math.PI;\n      c.aspect = cam.aspect;\n      c.near = cam.near;\n      c.far = cam.far;\n      const vk = cam.viewScale > 0 ? cam.viewScale : 1;\n      if ((cam.ndcOffY || vk !== 1) && cam.cw > 0 && cam.ch > 0) c.setViewOffset(cam.cw, cam.ch, cam.cw * (vk - 1) / (2 * vk), (cam.ndcOffY - 1 + vk) * cam.ch / (2 * vk), cam.cw / vk, cam.ch / vk);\n      else if (c.view && c.view.enabled) c.clearViewOffset();\n      c.position.set(cam.eye[0], cam.eye[1], cam.eye[2]);\n      c.up.set(0, 1, 0);\n      c.lookAt(cam.cx, cam.cy, cam.cz);\n      c.updateProjectionMatrix();\n      c.updateMatrixWorld();\n      syncWallParts();\n      const k = st.key;\n      const tx = cam.cx, tz = cam.cz;\n      if (k.target.position.x !== tx || k.target.position.z !== tz) {\n        k.target.position.set(tx, 0, tz);\n        k.position.set(tx + st.sunOffset[0], st.sunOffset[1], tz + st.sunOffset[2]);\n        k.target.updateMatrixWorld();\n        if (st.renderer) {\n          st.renderer.shadowMap.needsUpdate = true;\n          st.stats.shadowUpdates++;\n        }\n      }\n      st.env.follow(c);\n      invalidate();\n    }\n    function invalidate() {\n      if (st.disposed || st.needsRender || headless || !st.renderer) return;\n      st.needsRender = true;\n      if (!raf) {\n        st.needsRender = false;\n        frame2();\n        return;\n      }\n      st.rafId = raf(frame2);\n    }\n    function frame2() {\n      st.needsRender = false;\n      st.rafId = 0;\n      if (st.disposed || st.lost || !st.renderer) return;\n      if (doc2 && doc2.hidden) return;\n      renderNow();\n    }\n    const MOOD_MS = 1400, WARM = new THREE.Color(16754784), NIGHT = new THREE.Color(1777968);\n    st.mood = { cur: 0, from: 0, to: 0, t0: 0 };\n    function moodNow() {\n      const m = st.mood;\n      if (m.cur === m.to) return m.cur;\n      let slow = false;\n      try {\n        slow = !!(win2 && win2.matchMedia && win2.matchMedia(\"(prefers-reduced-motion: reduce)\").matches);\n      } catch {\n        slow = false;\n      }\n      const k = slow ? 1 : Math.min(1, (now() - m.t0) / MOOD_MS), e = k * k * (3 - 2 * k);\n      m.cur = k >= 1 ? m.to : m.from + (m.to - m.from) * e;\n      return m.cur;\n    }\n    function withMood(draw) {\n      const m = moodNow();\n      if (st.glow) st.glow.setLevel(m);\n      st.floorDim = 1;\n      if (!(m > 1e-3)) {\n        draw();\n        return;\n      }\n      const keep = [];\n      const scale = (o, f) => {\n        if (o && typeof o.intensity === \"number\") {\n          keep.push([o, o.intensity]);\n          o.intensity *= f;\n        }\n      };\n      scale(st.hemi, 1 - 0.6 * m);\n      scale(st.envFill, 1 - 0.6 * m);\n      scale(st.key, 1 - 0.7 * m);\n      scale(st.fill, 1 - 0.6 * m);\n      const kc = st.key && st.key.color ? st.key.color.clone() : null;\n      if (kc) st.key.color.lerp(WARM, 0.75 * m);\n      const ex = st.renderer.toneMappingExposure;\n      st.renderer.toneMappingExposure = ex * (1 - 0.3 * m);\n      const bg = st.scene.background && st.scene.background.isColor ? st.scene.background.clone() : null;\n      if (bg) st.scene.background.lerp(NIGHT, 0.6 * m);\n      const floorKeep = [];\n      {\n        const seen = /* @__PURE__ */ new Set(), f = 1 - 0.73 * m;\n        st.floorDim = f;\n        const dim = (mm) => {\n          if (!mm || !mm.color || seen.has(mm)) return;\n          seen.add(mm);\n          floorKeep.push([mm, mm.color.clone()]);\n          mm.color.setRGB(mm.color.r * f, mm.color.g * f, Math.min(1, mm.color.b * f * (1 + 0.12 * m)));\n        };\n        try {\n          dim(mats.get(MAT_CLASS.FLOOR, false, \"\"));\n        } catch {\n        }\n        if (st.floorMats) st.floorMats.forEach(dim);\n        if (st.ground) dim(st.ground.material);\n        if (st.grid) dim(st.grid.material);\n      }\n      try {\n        draw();\n      } finally {\n        for (const [mm, c] of floorKeep) mm.color.copy(c);\n        for (const [o, v] of keep) o.intensity = v;\n        if (kc) st.key.color.copy(kc);\n        st.renderer.toneMappingExposure = ex;\n        if (bg) st.scene.background.copy(bg);\n      }\n    }\n    function drawFrame() {\n      const r = st.renderer, el = r.domElement || canvas || {};\n      let plan = framePlan(q.tier, q.level, st.mood.cur, {\n        maxLevel: MAX_LEVEL,\n        maxSamples: r.capabilities.maxSamples,\n        antialias: st.ctxAA,\n        dpr: win2 && win2.devicePixelRatio || 1,\n        failed: !!(st.post && st.post.failed()),\n        bufW: el.width,\n        bufH: el.height\n      });\n      if (st.planOverride) plan = Object.assign({}, plan, st.planOverride);\n      if (plan.post) {\n        if (!st.post) st.post = createPost(THREE, r);\n        r.info.autoReset = false;\n        r.info.reset();\n        let ok2 = false;\n        const lineKeep = [];\n        if (plan.scale > 1) {\n          for (const m of [st.edgeMat, st.roomEdgeMat]) if (m) {\n            lineKeep.push([m, m.opacity]);\n            m.opacity = Math.min(1, m.opacity * plan.scale * HIGH.lineInk);\n          }\n        }\n        try {\n          ok2 = st.post.render(st.scene, st.camera, plan, el.width || 1, el.height || 1, BLOOM);\n        } finally {\n          r.info.autoReset = true;\n          for (const [m, o] of lineKeep) m.opacity = o;\n        }\n        if (!ok2) {\n          plan = Object.assign({}, plan, { post: false, fellBack: true });\n          r.render(st.scene, st.camera);\n        }\n      } else {\n        if (st.post && st.post.info().allocated) st.post.release();\n        r.render(st.scene, st.camera);\n      }\n      st.lastPlan = plan;\n    }\n    function setGraphics(name2) {\n      const t = tierOf(name2);\n      if (t === q.tier) return false;\n      q.tier = t;\n      if (st.renderer) {\n        st.renderer.setPixelRatio(dprOf());\n        st.lastW = 0;\n        const a = anisoOf();\n        const re = (tex) => {\n          if (tex && tex.anisotropy !== a) {\n            tex.anisotropy = a;\n            tex.needsUpdate = true;\n          }\n        };\n        re(st.oakTex);\n        st.decorTex.forEach((v) => re(v.tex));\n      }\n      invalidate();\n      return true;\n    }\n    function graphicsInfo() {\n      const p = st.lastPlan || { post: false, samples: 0, scale: 1, bloom: 0 };\n      const pi = st.post ? st.post.info() : null;\n      return {\n        tier: q.tier.name,\n        label: q.tier.label,\n        level: q.level,\n        pixelRatio: st.renderer ? st.renderer.getPixelRatio() : 1,\n        contextAntialias: !!st.ctxAA,\n        maxSamples: st.renderer ? st.renderer.capabilities.maxSamples : 0,\n        anisotropy: st.renderer ? anisoOf() : 0,\n        post: !!p.post,\n        samples: p.post ? p.samples : st.ctxAA ? 4 : 0,\n        scale: p.post ? p.scale : 1,\n        bloom: p.bloom || 0,\n        fellBack: !!p.fellBack,\n        postFailed: !!(pi && pi.failed),\n        postError: pi ? pi.error : null,\n        postBytes: pi ? pi.bytes : 0,\n        postSize: pi && pi.allocated ? [pi.width, pi.height] : null,\n        glowAllocated: !!(pi && pi.glowAllocated)\n      };\n    }\n    function renderNow() {\n      if (st.disposed || st.lost || !st.renderer) return false;\n      if (st.rafId && caf) {\n        caf(st.rafId);\n        st.rafId = 0;\n        st.needsRender = false;\n      }\n      const t0 = now();\n      if (st.envDirty) {\n        st.envDirty = false;\n        buildEnvironment();\n      }\n      resizeIfNeeded();\n      syncArrows();\n      syncWallParts();\n      st.env.follow(st.camera);\n      withMood(drawFrame);\n      if (st.mood.cur !== st.mood.to && raf) invalidate();\n      st.stats.frames++;\n      const t1 = now();\n      st.stats.lastFrameMs = t1 - t0;\n      if (opts.onSample && raf) {\n        const js = st.stats.lastFrameMs;\n        raf(() => {\n          const t2 = now(), probe = t2 - t0;\n          if (probe < st.minProbe) st.minProbe = probe;\n          opts.onSample(frameCost(probe, js, st.minProbe), t2);\n        });\n      }\n      if (opts.onFrame) opts.onFrame(st.cam);\n      return true;\n    }\n    function resizeIfNeeded() {\n      if (!canvas) return;\n      const w = canvas.clientWidth || st.cam && st.cam.cw || 1, h = canvas.clientHeight || st.cam && st.cam.ch || 1;\n      if (w === st.lastW && h === st.lastH) return;\n      st.lastW = w;\n      st.lastH = h;\n      st.renderer.setSize(w, h, false);\n    }\n    function onLost(e) {\n      if (e && e.preventDefault) e.preventDefault();\n      st.lost = true;\n      if (opts.onLost) opts.onLost();\n    }\n    function onRestored() {\n      if (!st.lost) return;\n      st.lost = false;\n      st.envDirty = true;\n      if (st.renderer) st.renderer.shadowMap.needsUpdate = true;\n      if (st.oakTex) st.oakTex.needsUpdate = true;\n      st.decorTex.forEach((r) => {\n        if (r.tex) r.tex.needsUpdate = true;\n      });\n      st.env.restored();\n      if (st.post) st.post.release();\n      invalidate();\n      if (opts.onRestored) opts.onRestored();\n    }\n    function onVisible() {\n      if (doc2 && !doc2.hidden) invalidate();\n    }\n    if (canvas && canvas.addEventListener && !headless) {\n      canvas.addEventListener(\"webglcontextlost\", onLost, false);\n      canvas.addEventListener(\"webglcontextrestored\", onRestored, false);\n    }\n    if (doc2 && doc2.addEventListener && !headless) doc2.addEventListener(\"visibilitychange\", onVisible);\n    function dispose() {\n      if (st.disposed) return;\n      st.disposed = true;\n      if (st.rafId && caf) caf(st.rafId);\n      if (canvas && canvas.removeEventListener) {\n        canvas.removeEventListener(\"webglcontextlost\", onLost, false);\n        canvas.removeEventListener(\"webglcontextrestored\", onRestored, false);\n      }\n      if (doc2 && doc2.removeEventListener) doc2.removeEventListener(\"visibilitychange\", onVisible);\n      st.units.forEach((rec) => dropUnit(rec));\n      st.units.clear();\n      workshopHardware.dispose();\n      st.shapes.forEach((sh) => sh.buckets.forEach((b) => b.geom.dispose()));\n      st.shapes.clear();\n      if (st.arrowKit) {\n        st.arrowKit.shaft.dispose();\n        st.arrowKit.head.dispose();\n        st.arrowKit.mat.dispose();\n        st.arrowKit.hot.dispose();\n        st.arrowKit.leader.dispose();\n        st.arrowKit.leaderMat.dispose();\n        st.arrowKit = null;\n      }\n      st.arrowNodes.clear();\n      st.leaderNodes.clear();\n      st.sceneGeoms.forEach((g2) => g2.dispose());\n      st.sceneGeoms = [];\n      st.overlayGeoms.forEach((g2) => g2.dispose());\n      st.overlayGeoms = [];\n      mats.clear();\n      if (st.floorMats) {\n        st.floorMats.forEach((m) => {\n          if (m) {\n            if (m.map) m.map.dispose();\n            m.dispose();\n          }\n        });\n        st.floorMats = null;\n      }\n      if (st.oakTex) {\n        st.oakTex.dispose();\n        st.oakTex = null;\n      }\n      st.decorTex.forEach((r) => {\n        if (r.tex) r.tex.dispose();\n      });\n      st.decorTex.clear();\n      if (st.envRT) {\n        st.envRT.dispose();\n        st.envRT = null;\n      }\n      st.env.dispose();\n      if (st.key) {\n        const sh = st.key.shadow;\n        if (sh && sh.map && sh.map.depthTexture) sh.map.depthTexture.dispose();\n        st.key.dispose();\n      }\n      if (st.post) {\n        st.post.dispose();\n        st.post = null;\n      }\n      if (st.renderer) st.renderer.dispose();\n    }\n    function raycast(nx, ny) {\n      if (!st.ray) st.ray = new THREE.Raycaster();\n      const ray = st.ray;\n      st.unitsRoot.updateMatrixWorld(true);\n      ray.setFromCamera(new THREE.Vector2(nx, ny), st.camera);\n      const hits = ray.intersectObject(st.unitsRoot, true);\n      for (let i = 0; i < hits.length; i++) {\n        const h = hits[i], o = h.object;\n        if (!o.visible || !o.parent || !o.parent.userData.unitId) continue;\n        if (st.view && st.view.cutIds && st.view.cutIds.has(o.parent.userData.unitId)) continue;\n        const n = h.face ? h.face.normal.clone().transformDirection(o.matrixWorld) : null;\n        return {\n          unitId: o.parent.userData.unitId,\n          point: { x: h.point.x, y: h.point.y, z: h.point.z },\n          normal: n ? { x: n.x, y: n.y, z: n.z } : null,\n          distance: h.distance\n        };\n      }\n      return null;\n    }\n    function info() {\n      const r = st.renderer;\n      const all = [];\n      st.scene.traverse((o) => {\n        if (o.isMesh && o.visible) all.push(o);\n      });\n      let tris = 0;\n      for (let i = 0; i < all.length; i++) tris += all[i].geometry.attributes.position.count / 3;\n      const meshes = all.length;\n      return Object.assign({}, st.stats, {\n        units: st.units.size,\n        shapes: st.shapes.size,\n        materials: mats.size(),\n        meshes,\n        triangles: tris,\n        drawCalls: r ? r.info.render.calls : 0,\n        gpuGeometries: r ? r.info.memory.geometries : 0,\n        gpuTextures: r ? r.info.memory.textures : 0,\n        programs: r && r.info.programs ? r.info.programs.length : 0,\n        environment: st.env.state(),\n        graphics: graphicsInfo()\n      });\n    }\n    return {\n      /* \u043F\u043E\u043C\u0435\u043D\u044F\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u0444\u043B\u0430\u0433\u0438 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 (\u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435) \u0431\u0435\u0437 \u0441\u0432\u0435\u0440\u043A\u0438 \u0441\u0446\u0435\u043D\u044B */\n      repaint: (patch) => {\n        st.view = Object.assign({}, st.view || {}, patch || {});\n        repaintAll();\n        invalidate();\n      },\n      update,\n      setCamera,\n      invalidate,\n      renderNow,\n      dispose,\n      info,\n      oakReady,\n      raycast,\n      setLevel,\n      level: () => q.level,\n      setGraphics,\n      graphics: () => graphicsInfo(),\n      /* the size arrows: fn() -> [{ hid, p:[x,y,z] root, dir:[x,y,z], s scale, hot }] read every frame */\n      setArrowSource: (fn) => {\n        st.arrowSrc = fn || null;\n        invalidate();\n      },\n      syncArrows: () => syncArrows(),\n      /* \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A: \u0433\u0440\u0430\u0444 \u0441\u0446\u0435\u043D\u044B \u0438 \u043E\u0431\u044A\u0435\u043A\u0442\u044B Three.js \u043A\u0430\u043A \u0435\u0441\u0442\u044C */\n      inspect: () => ({\n        THREE,\n        scene: st.scene,\n        camera: st.camera,\n        renderer: st.renderer,\n        envMeans: st.envMeans || null,\n        // the soft-box studio's mean linear brightness vs the gradient's (checks)\n        /* which image each Egger decor class is drawn from: \"egger-board\" (raw Board file), \"shop\", or failed */\n        decorSources: () => {\n          const o = { oak: st.oakSource || (st.oakTex ? \"theme-scan\" : \"none\") };\n          st.decorTex.forEach((v, k) => {\n            const d = decorOfClass(k);\n            o[d ? d.key : k] = v.source || (v.failed ? \"failed\" : \"loading\");\n          });\n          return o;\n        },\n        unitsRoot: st.unitsRoot,\n        sceneGroup: st.sceneGroup,\n        overlayGroup: st.overlayGroup,\n        arrowGroup: st.arrowGroup,\n        productionHardware: workshopHardware.group,\n        productionHardwareData: workshopHardware.inspect,\n        mood: () => ({ cur: st.mood.cur, to: st.mood.to }),\n        floorDim: () => st.floorDim == null ? 1 : st.floorDim,\n        glow: () => st.glow ? Object.assign({ visible: st.glow.visible() }, st.glow.count()) : null,\n        units: st.units,\n        shapes: st.shapes,\n        key: st.key,\n        fill: st.fill,\n        hemi: st.hemi,\n        ground: st.ground,\n        catcher: st.catcher,\n        grid: st.grid,\n        environment: st.env,\n        skin: () => st.skin,\n        post: () => st.post,\n        /* checks only: force parts of the frame plan (render/graphics.js framePlan), null - back to the tier's own */\n        setPlanOverride: (p) => {\n          st.planOverride = p || null;\n          invalidate();\n        }\n      }),\n      environment: () => st.env.state(),\n      lost: () => st.lost\n    };\n  }\n\n  // v2/src/render/host-state.js\n  function internalEditLevel(m, partDragActive) {\n    if (m && m.measureOn && m.measureUnit) return 3;\n    if (!m || !m.partsMode) return 0;\n    if (partDragActive) return 1;\n    if (m.insideTool && m.insideTool !== \"select\") return 2;\n    const u = (m.units || []).find((v) => v.id === m.selectedId);\n    if (!u || !m.selPart) return 0;\n    const p = partById(u, m.selPart);\n    if (!p) return 0;\n    return p.kind === \"shelf\" || p.kind === \"fixed-h\" || p.kind === \"fixed-v\" || p.kind === \"drawer-box\" ? 2 : 0;\n  }\n  function hoverUnitOf(m) {\n    const h = m && m.hoverPart;\n    if (!h) return null;\n    const id = String(h).split(\":\")[0];\n    return (m.units || []).some((v) => v.id === id) ? id : null;\n  }\n  function xrayUnitOf(m) {\n    if (m && m.measureOn) return m.measureUnit || null;\n    if (!m || !m.partsMode) return null;\n    if (m.placeGhost && m.placeGhost.unitId) return m.placeGhost.unitId;\n    return m.insideTool && m.insideTool !== \"select\" ? hoverUnitOf(m) : null;\n  }\n\n  // v2/src/render/view-cut.js\n  var WALL_TOL = 60;\n  function backOnWall2(u) {\n    let R4;\n    try {\n      R4 = roomSize();\n    } catch {\n      return false;\n    }\n    const on = (n, b) => {\n      const back = n.dx > 0 ? b.x0 : n.dx < 0 ? b.x1 : n.dz > 0 ? b.z0 : b.z1;\n      const wall = n.dx > 0 ? 0 : n.dx < 0 ? R4.width : n.dz > 0 ? 0 : R4.depth;\n      return Math.abs(back - wall) <= WALL_TOL;\n    };\n    const arms = /corner/.test(u.type) ? cornerArmSides(u) : null;\n    if (arms) return [arms.left, arms.right].some((a) => on(a.n, a.box));\n    return on(frontDir(u), foot(u));\n  }\n  var ISLAND_PASS_ON = 450;\n  var ISLAND_PASS_OFF = 700;\n  function eyeDistToBox(e, B) {\n    return Math.hypot(Math.max(B.x0 - e[0], 0, e[0] - B.x1), Math.max(B.y0 - e[1], 0, e[1] - B.y1), Math.max(B.z0 - e[2], 0, e[2] - B.z1));\n  }\n  function cutClass(u) {\n    if (!u) return null;\n    if (u.type === \"island\") return \"island\";\n    if (u.family === \"wall\") return \"wall\";\n    if ((u.family === \"base\" || u.family === \"corner\") && u.type !== \"island\" && !isTall(u)) return \"base\";\n    return null;\n  }\n  var VIEW_CUT = {\n    engage: 0.45,\n    release: 0.3,\n    window: 0.5,\n    minOn: 0.01,\n    ghost: CUT_GHOST,\n    fadeMs: 220,\n    levels: CUT_LEVELS,\n    hideOn: 0.06,\n    hideOff: 0.03,\n    grid: 40\n  };\n  function hiddenShare(cands, others2, N) {\n    if (!cands.length || !others2.length) return { share: 0, by: {} };\n    const n = N || VIEW_CUT.grid, by = {};\n    let tot = 0, hid = 0;\n    for (let i = 0; i < n; i++) for (let j = 0; j < n; j++) {\n      const x = -1 + (i + 0.5) * 2 / n, y = -1 + (j + 0.5) * 2 / n;\n      let dmin = Infinity;\n      for (const o of others2) {\n        const r = o.rect;\n        if (x >= r[0] && x <= r[1] && y >= r[2] && y <= r[3] && o.depth < dmin) dmin = o.depth;\n      }\n      if (dmin === Infinity) continue;\n      tot++;\n      let any = false;\n      for (const c of cands) {\n        const r = c.rect;\n        if (x >= r[0] && x <= r[1] && y >= r[2] && y <= r[3] && c.depth < dmin) {\n          any = true;\n          by[c.id] = (by[c.id] || 0) + 1;\n        }\n      }\n      if (any) hid++;\n    }\n    return { share: tot ? hid / tot : 0, by };\n  }\n  function boxOf(u) {\n    const f = foot(u), y0 = u.family === \"wall\" ? u.y || 0 : -LEG_H;\n    return { x0: f.x0, x1: f.x1, y0, y1: (u.y || 0) + (u.h || 0), z0: f.z0, z1: f.z1 };\n  }\n  function eyeBehind(u, eye) {\n    const arms = /corner/.test(u.type) ? cornerArmSides(u) : null;\n    if (arms) {\n      for (const a of [arms.left, arms.right]) {\n        const n2 = a.n, b = a.box;\n        const back2 = n2.dx > 0 ? b.x0 : n2.dx < 0 ? b.x1 : n2.dz > 0 ? b.z0 : b.z1;\n        const s = n2.dx ? (eye[0] - back2) * n2.dx : (eye[2] - back2) * n2.dz;\n        if (s < 0) return true;\n      }\n      return false;\n    }\n    const n = frontDir(u), f = foot(u);\n    const back = n.dx > 0 ? f.x0 : n.dx < 0 ? f.x1 : n.dz > 0 ? f.z0 : f.z1;\n    return (n.dx ? (eye[0] - back) * n.dx : (eye[2] - back) * n.dz) < 0;\n  }\n  function projectBox(cam, B) {\n    const eye = cam.eye, rot = cam.rot;\n    const R4 = applyRT(rot, [1, 0, 0]), U = applyRT(rot, [0, 1, 0]), V3 = applyRT(rot, [0, 0, 1]);\n    const ty = Math.tan((cam.fovY || FOVY) / 2), tx = ty * (cam.aspect || 1);\n    const P2 = [];\n    for (const X of [B.x0, B.x1]) for (const Y of [B.y0, B.y1]) for (const Z of [B.z0, B.z1]) {\n      const q = [X - eye[0], Y - eye[1], Z - eye[2]];\n      P2.push([q[0] * R4[0] + q[1] * R4[1] + q[2] * R4[2], q[0] * U[0] + q[1] * U[1] + q[2] * U[2], -(q[0] * V3[0] + q[1] * V3[1] + q[2] * V3[2])]);\n    }\n    const E = 1;\n    const pts = [];\n    const oy = cam.ndcOffY || 0;\n    const vk = cam.viewScale > 0 ? cam.viewScale : 1;\n    const proj = (p) => pts.push([vk * p[0] / (p[2] * tx), vk * p[1] / (p[2] * ty) + oy]);\n    for (let i = 0; i < 8; i++) {\n      if (P2[i][2] >= E) proj(P2[i]);\n      for (const bit of [1, 2, 4]) {\n        const j = i ^ bit;\n        if (j < i) continue;\n        const a = P2[i], b = P2[j];\n        if (a[2] >= E !== b[2] >= E) {\n          const t = (E - a[2]) / (b[2] - a[2]);\n          proj([a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, E]);\n        }\n      }\n    }\n    const c = [(B.x0 + B.x1) / 2 - eye[0], (B.y0 + B.y1) / 2 - eye[1], (B.z0 + B.z1) / 2 - eye[2]];\n    const depth = -(c[0] * V3[0] + c[1] * V3[1] + c[2] * V3[2]);\n    if (!pts.length) return { rect: null, depth };\n    let x0 = Infinity, x1 = -Infinity, y0 = Infinity, y1 = -Infinity;\n    for (const p of pts) {\n      x0 = Math.min(x0, p[0]);\n      x1 = Math.max(x1, p[0]);\n      y0 = Math.min(y0, p[1]);\n      y1 = Math.max(y1, p[1]);\n    }\n    return { rect: [x0, x1, y0, y1], depth };\n  }\n  function rectCover(r, w) {\n    if (!r) return 0;\n    const ov = (a, b) => Math.max(0, Math.min(b, w) - Math.max(a, -w));\n    return ov(r[0], r[1]) * ov(r[2], r[3]) / (4 * w * w);\n  }\n  function unionCover(rects, w) {\n    if (!rects.length) return 0;\n    const NX = 32, NY = 20;\n    let hit2 = 0;\n    for (let i = 0; i < NX; i++) for (let j = 0; j < NY; j++) {\n      const x = -w + (i + 0.5) * 2 * w / NX, y = -w + (j + 0.5) * 2 * w / NY;\n      if (rects.some((r) => x >= r[0] && x <= r[1] && y >= r[2] && y <= r[3])) hit2++;\n    }\n    return hit2 / (NX * NY);\n  }\n  function obstructors(units, cam, selectedId, prev) {\n    const ids = /* @__PURE__ */ new Set(), cand = {};\n    if (!cam || !cam.eye || !cam.rot) return { ids, share: 0, cand };\n    const w = decideRow(units, cam, prev, \"wall\"), b = decideRow(units, cam, prev, \"base\"), il = decideRow(units, cam, prev, \"island\");\n    const bp = decidePass(units, cam, prev, \"base\");\n    for (const u of units || []) {\n      if (!b.ids.has(u.id)) continue;\n      const B = boxOf(u), d = eyeDistToBox(cam.eye, B), was = !!(prev && prev.has(u.id) && prev.passIds && prev.passIds.has(u.id));\n      if (d <= (was ? ISLAND_PASS_OFF : ISLAND_PASS_ON)) bp.ids.add(u.id);\n    }\n    for (const id of w.ids) ids.add(id);\n    for (const id of b.ids) ids.add(id);\n    for (const id of il.ids) ids.add(id);\n    for (const id of bp.ids) ids.add(id);\n    const pass = /* @__PURE__ */ new Set([...il.ids, ...bp.ids]);\n    Object.assign(cand, w.cand, b.cand, il.cand);\n    return { ids, pass, share: w.share, hide: w.hide, baseShare: b.share, baseHide: b.hide, islandShare: il.share, cand };\n  }\n  function decideRow(units, cam, prev, cls) {\n    if (cls === \"island\") return decideIslands(units, cam, prev);\n    const ids = /* @__PURE__ */ new Set(), cand = {};\n    const rects = [], on = [];\n    for (const u of units || []) {\n      if (cutClass(u) !== cls) continue;\n      if (cls === \"base\" && !backOnWall2(u)) continue;\n      if (!eyeBehind(u, cam.eye)) continue;\n      const pb = projectBox(cam, boxOf(u));\n      if (!pb.rect || !(pb.depth < cam.dist)) continue;\n      const whole = rectCover(pb.rect, 1);\n      if (!(whole > 0)) continue;\n      cand[u.id] = Math.round(whole * 1e3) / 1e3;\n      rects.push(pb.rect);\n      if (whole >= VIEW_CUT.minOn) on.push(u.id);\n    }\n    const share = unionCover(rects, VIEW_CUT.window);\n    const was = !!(prev && [...prev].some((id) => {\n      const u = (units || []).find((v) => v.id === id);\n      return cutClass(u) === cls;\n    }));\n    if (share >= (was ? VIEW_CUT.release : VIEW_CUT.engage)) for (const id of on) ids.add(id);\n    let hide = 0;\n    const all = Object.keys(cand);\n    if (all.length) {\n      const cs = [], os = [];\n      for (const u of units || []) {\n        const pb = projectBox(cam, boxOf(u));\n        if (!pb.rect || !(pb.depth > 0)) continue;\n        if (all.includes(u.id)) cs.push({ id: u.id, rect: pb.rect, depth: pb.depth });\n        else os.push({ id: u.id, rect: pb.rect, depth: pb.depth });\n      }\n      const h = hiddenShare(cs, os);\n      hide = h.share;\n      const face2 = (id) => {\n        const u = (units || []).find((v) => v.id === id);\n        return u ? ((u.rot || 0) % 4 + 4) % 4 : -1;\n      };\n      if (hide >= (was ? VIEW_CUT.hideOff : VIEW_CUT.hideOn)) {\n        const rows = new Set(all.filter((id) => h.by[id]).map(face2));\n        for (const id of all) if (rows.has(face2(id))) ids.add(id);\n      }\n      if (cls === \"base\") {\n        const by = {};\n        for (const c of cs) if (os.some((o) => o.depth > c.depth && rectCover(o.rect, 1) > 0)) by[c.id] = 1;\n        const rows = new Set(all.filter((id) => by[id]).map(face2));\n        for (const id of all) if (rows.has(face2(id))) ids.add(id);\n      }\n    }\n    return { ids, share: Math.round(share * 1e3) / 1e3, hide: Math.round(hide * 1e3) / 1e3, cand };\n  }\n  function decideIslands(units, cam, prev) {\n    return decidePass(units, cam, prev, \"island\");\n  }\n  var WORKTOP_BAND = 40;\n  var ISLAND_AT = 60;\n  var PASS_GROW = 40;\n  function segHitsBox(a, b, B, g2) {\n    let t0 = 0, t1 = 1;\n    const lo = [B.x0 - g2, B.y0 - g2, B.z0 - g2], hi = [B.x1 + g2, B.y1 + g2, B.z1 + g2];\n    for (let k = 0; k < 3; k++) {\n      const d = b[k] - a[k];\n      if (Math.abs(d) < 1e-9) {\n        if (a[k] < lo[k] || a[k] > hi[k]) return false;\n        continue;\n      }\n      let u0 = (lo[k] - a[k]) / d, u1 = (hi[k] - a[k]) / d;\n      if (u0 > u1) {\n        const x = u0;\n        u0 = u1;\n        u1 = x;\n      }\n      if (u0 > t0) t0 = u0;\n      if (u1 < t1) t1 = u1;\n      if (t0 > t1) return false;\n    }\n    return true;\n  }\n  function decidePass(units, cam, prev, cls) {\n    const ids = /* @__PURE__ */ new Set(), cand = {};\n    const e = cam.eye, V3 = applyRT(cam.rot, [0, 0, 1]);\n    const depthOf = (X, Y, Z) => -((X - e[0]) * V3[0] + (Y - e[1]) * V3[1] + (Z - e[2]) * V3[2]);\n    for (const u of units || []) {\n      if (cutClass(u) !== cls) continue;\n      const B = boxOf(u);\n      B.y1 += WORKTOP_BAND;\n      const g2 = cls === \"island\" ? ISLAND_AT : 0;\n      if (e[0] > B.x0 - g2 && e[0] < B.x1 + g2 && e[1] > B.y0 - g2 && e[1] < B.y1 + g2 && e[2] > B.z0 - g2 && e[2] < B.z1 + g2) {\n        ids.add(u.id);\n        cand[u.id] = \"inside\";\n        continue;\n      }\n      let far = -Infinity;\n      for (const X of [B.x0, B.x1]) for (const Y of [B.y0, B.y1]) for (const Z of [B.z0, B.z1]) far = Math.max(far, depthOf(X, Y, Z));\n      const inFront = far > 0 && far < cam.dist;\n      if (!inFront) continue;\n      if (!segHitsBox(e, [cam.cx, cam.cy, cam.cz], B, PASS_GROW)) continue;\n      const d = eyeDistToBox(e, B), was = !!(prev && prev.has(u.id));\n      cand[u.id] = Math.round(d);\n      if (d <= (was ? ISLAND_PASS_OFF : ISLAND_PASS_ON)) ids.add(u.id);\n    }\n    return { ids, share: 0, hide: 0, cand };\n  }\n  function createViewCut(opts) {\n    const o = opts || {};\n    const now = o.now || (() => Date.now());\n    const reduced = !!o.reducedMotion;\n    const st = { set: /* @__PURE__ */ new Set(), lvl: /* @__PURE__ */ new Map(), t: 0, why: null };\n    function step(units, cam, selectedId) {\n      const t = now(), dt = st.t ? Math.min(50, Math.max(0, t - st.t)) : 0;\n      st.t = t;\n      const r = obstructors(units, cam, selectedId, st.set);\n      st.set = r.ids;\n      st.set.passIds = r.pass || null;\n      st.why = r;\n      const live = new Set((units || []).map((u) => u.id));\n      const cut = /* @__PURE__ */ new Map();\n      let moving = false;\n      for (const id of /* @__PURE__ */ new Set([...st.lvl.keys(), ...r.ids])) {\n        if (!live.has(id)) {\n          st.lvl.delete(id);\n          continue;\n        }\n        const goal = r.ids.has(id) ? 1 : 0;\n        let a = st.lvl.get(id) || 0;\n        a = reduced ? goal : goal > a ? Math.min(goal, a + dt / VIEW_CUT.fadeMs) : Math.max(goal, a - dt / VIEW_CUT.fadeMs);\n        if (a !== goal) moving = true;\n        if (a <= 0) {\n          st.lvl.delete(id);\n          continue;\n        }\n        st.lvl.set(id, a);\n        const k = Math.max(1, Math.round(a * VIEW_CUT.levels));\n        cut.set(id, k);\n      }\n      return { cut, ids: r.ids, pass: r.pass || /* @__PURE__ */ new Set(), moving };\n    }\n    function idle() {\n      st.t = 0;\n    }\n    return { step, idle, state: () => ({ ids: [...st.set], share: st.why ? st.why.share : 0, cand: st.why ? st.why.cand : {}, lvl: Object.fromEntries(st.lvl) }) };\n  }\n\n  // v2/src/render/index.js\n  function openCopy(u) {\n    const c = Object.assign({}, u);\n    if (u.door) c.doorOpen = true;\n    if (u.type === \"base-drawer\") c.drawerOpen = true;\n    if (u.type === \"base-4drawer\" && Array.isArray(u.drawers)) c.drawers = u.drawers.map(() => true);\n    if (Array.isArray(u.leafOpen)) c.leafOpen = u.leafOpen.map(() => true);\n    const x = xdrRecords(u);\n    if (x.length) c.xopen = x.map((r) => r.n);\n    return c;\n  }\n  function createRenderer2(canvas, o) {\n    o = o || {};\n    const THREE = o.three;\n    const getModel = o.getModel;\n    const win2 = o.window || (typeof globalThis !== \"undefined\" ? globalThis.window : null);\n    const listeners = { contextlost: [], contextrestored: [], frame: [], environment: [] };\n    const emit = (ev, arg) => {\n      const l = listeners[ev];\n      for (let i = 0; i < l.length; i++) l[i](arg);\n    };\n    const ownView = !o.view;\n    const view = o.view || {\n      yaw: DEFAULTS.yaw,\n      pitch: DEFAULTS.pitch,\n      zoom: 1,\n      panX: 0,\n      panY: 0,\n      frame: null,\n      camHold: null,\n      hingeZoom: false\n    };\n    const flags = { xray: null };\n    const controls = { rotate: true, pan: true, zoom: true };\n    const ui = { cam: null, drag: null, tS: null, tM: null, pinch: null, focusId: void 0, focusFrame: null };\n    const dev = deviceInfo();\n    const storage = (() => {\n      try {\n        return win2 && win2.localStorage;\n      } catch {\n        return null;\n      }\n    })();\n    const fixed = o.quality === \"full\" ? MAX_LEVEL : o.quality === \"lite\" ? 1 : typeof o.quality === \"number\" || /^[0-4]$/.test(String(o.quality)) ? Number(o.quality) : null;\n    const saved = fixed == null ? loadState(storage, dev.renderer) : null;\n    const gfx = { name: tierName(o.graphics || loadTier(storage) || \"auto\"), source: o.graphics ? \"address\" : loadTier(storage) ? \"saved\" : \"default\" };\n    const deviceTarget = fixed != null ? fixed : bootLevel(saved, dev);\n    const target = Math.min(deviceTarget, tierOf(gfx.name).maxLevel);\n    const qs = { target, deviceTarget, adaptive: fixed == null && !o.headless, gov: null, changes: [], upgraded: !!o.headless, upgradeScheduled: false };\n    if (qs.adaptive) qs.gov = createGovernor({ level: target, fails: saved ? saved.fails : {}, max: tierOf(gfx.name).maxLevel });\n    const bootLevel2 = o.headless ? target : Math.min(target, 1);\n    const R4 = createRenderer({\n      THREE,\n      canvas,\n      window: win2,\n      headless: !!o.headless,\n      level: bootLevel2,\n      graphics: gfx.name,\n      antialias: antialiasFor(target, dev),\n      oakTextureUrl: o.oakTextureUrl,\n      preserveDrawingBuffer: !!o.preserveDrawingBuffer,\n      onFrame: (cam) => {\n        emit(\"frame\", cam);\n        afterFirstFrame();\n      },\n      onLost: () => emit(\"contextlost\"),\n      onRestored: () => {\n        emit(\"contextrestored\");\n        update();\n      },\n      /* the exterior skin arrived, failed or went back to Neutral (task 1791152519382): { active, requested, error, ... } */\n      onEnvironment: (s) => emit(\"environment\", s),\n      onSample: (ms, t) => {\n        if (!qs.gov || !qs.upgraded) return;\n        const ch = qs.gov.sample(ms, t);\n        if (ch) {\n          R4.setLevel(ch.to);\n          qs.changes.push(Object.assign({ at: Math.round(t) }, ch));\n          saveState(storage, dev.renderer, qs.gov.state());\n        }\n      }\n    });\n    function afterFirstFrame() {\n      if (qs.firstFrameLevel == null) qs.firstFrameLevel = R4.level();\n      if (qs.upgraded || qs.upgradeScheduled) return;\n      qs.upgradeScheduled = true;\n      const go = () => {\n        qs.upgraded = true;\n        R4.setLevel(qs.gov ? qs.gov.level : Math.min(qs.target, tierOf(gfx.name).maxLevel));\n      };\n      if (win2 && win2.setTimeout) win2.setTimeout(go, 0);\n      else go();\n    }\n    function deviceInfo() {\n      const d = { renderer: \"\", deviceMemory: null, cores: null, mobile: false };\n      if (o.headless || !win2) return d;\n      try {\n        const nav = win2.navigator || {};\n        d.deviceMemory = nav.deviceMemory || null;\n        d.cores = nav.hardwareConcurrency || null;\n        d.mobile = /Mobi|Android|iPhone|iPad/i.test(nav.userAgent || \"\");\n        const gl = win2.document.createElement(\"canvas\").getContext(\"webgl\");\n        const ext = gl && gl.getExtension(\"WEBGL_debug_renderer_info\");\n        d.renderer = ext ? String(gl.getParameter(ext.UNMASKED_RENDERER_WEBGL)) : String(gl && gl.getParameter(gl.RENDERER) || \"\");\n        const lose = gl && gl.getExtension(\"WEBGL_lose_context\");\n        if (lose) lose.loseContext();\n      } catch {\n      }\n      return d;\n    }\n    function model() {\n      return getModel() || { units: [] };\n    }\n    function size3() {\n      return [canvas && canvas.clientWidth || 600, canvas && canvas.clientHeight || 440];\n    }\n    function camNow() {\n      var _a;\n      const m = model();\n      if (!view.frame && ownView) view.frame = sceneFrame(m.units);\n      const [cw, ch] = size3();\n      const units = m.units || [];\n      if (ui.focusId === void 0 || clampZoom(view.zoom) >= 1 - 1e-9 || view.frame !== ui.focusFrame || view.hingeZoom || !units.some((u) => u.id === ui.focusId)) ui.focusId = m.selectedId;\n      ui.focusFrame = view.frame;\n      const input = {\n        frame: view.frame,\n        zoom: view.zoom,\n        yaw: view.yaw,\n        pitch: view.pitch,\n        panX: view.panX,\n        panY: view.panY,\n        camHold: view.camHold,\n        hingeZoom: view.hingeZoom,\n        pivot: view.pivot || null,\n        // the aimed point (camera.js, task 1790934980365)\n        insetTop: view.insetTop || 0,\n        // the docks' top band on a phone (ui/view-inset.js; camera.js frames below it)\n        insetBottom: view.insetBottom || 0,\n        // an open tray's bottom band on a phone (ui/view-inset.js; camera.js frames above it)\n        selectedId: ui.focusId\n      };\n      if (view.hingeZoom && m.hardwareXray && ((_a = m.productionHardware) == null ? void 0 : _a.enabled)) {\n        const cups = hardwarePrimitives(m, m.productionHardware, ui.focusId).items.filter((p) => p.unitId === ui.focusId && p.label === \"hinge cup\");\n        const cup = cups.sort((a, b) => b.anchor[1] - a.anchor[1])[0];\n        if (cup) {\n          input.productionHingeTarget = cup.anchor;\n          input.pivot = null;\n        }\n      }\n      ui.cam = computeCameraGuarded(input, m.units, cw, ch, sceneFrame);\n      view.pitch = input.pitch;\n      view.panY = input.panY;\n      return ui.cam;\n    }\n    const RISE_MS = 750;\n    const ease3 = (a) => a < 0.5 ? 4 * a * a * a : 1 - Math.pow(-2 * a + 2, 3) / 2;\n    const reducedMotion = !!o.calm || (() => {\n      try {\n        return !!(win2 && win2.matchMedia && win2.matchMedia(\"(prefers-reduced-motion: reduce)\").matches);\n      } catch {\n        return false;\n      }\n    })();\n    let riseTimer = 0;\n    function risingPreview(dp) {\n      if (!dp || !dp.unit) return dp || null;\n      if (reducedMotion || !(dp.t0 >= 0)) return dp;\n      const now = win2 && win2.performance ? win2.performance.now() : Date.now();\n      if (!(dp.t0 > 0)) dp.t0 = now;\n      const k = Math.max(0, Math.min(1, (now - dp.t0) / RISE_MS));\n      if (k >= 1) return dp;\n      const u = dp.unit, drop = (u.h || 720) + (u.family === \"wall\" ? 0 : 150);\n      if (!riseTimer && win2 && win2.requestAnimationFrame) riseTimer = win2.requestAnimationFrame(() => {\n        riseTimer = 0;\n        requestFrame();\n      });\n      return Object.assign({}, dp, { unit: Object.assign({}, u, { dispY: -(1 - ease3(k)) * drop }), rising: k });\n    }\n    function snapshot() {\n      var _a;\n      const m = model();\n      const ex = m.explode || 0;\n      m.units.forEach((u) => {\n        u.explode = ex;\n      });\n      applySpread(m.units, explodeMM({ explode: ex }));\n      const authority = o.calm && ((_a = m.productionHardware) == null ? void 0 : _a.enabled);\n      const units = (m.showOpen ? m.units.map(openCopy) : m.units).map((u) => {\n        if (authority) return { ...u, _productionHardware: !!m.hardwareXray };\n        if (\"_productionHardware\" in u) {\n          const clean = { ...u };\n          delete clean._productionHardware;\n          return clean;\n        }\n        return u;\n      });\n      return { units, room: m.room, kitchen: m.kitchen, decors: m.decors, view: {\n        // kitchen: the worktops (task 1791478310196)\n        selectedId: m.selectedId,\n        explode: ex,\n        partsMode: !!m.partsMode,\n        hoverPart: m.hoverPart || null,\n        selPart: m.selPart || null,\n        partMarkScale: m.partMarkScale || 1,\n        alignView: !!m.alignView,\n        alignTemp: !!m.alignTemp,\n        snap: m.snap !== false,\n        cues: m.cues || null,\n        cornerTarget: m.cornerTarget || null,\n        xray: flags.xray != null ? flags.xray : internalEdit(m),\n        hoverUnitId: o.calm ? null : hoverUnitOf(m),\n        placeGhost: m.placeGhost || null,\n        dropPreview: risingPreview(m.dropPreview),\n        evening: !!m.evening,\n        xrayUnitId: xrayUnitOf(m),\n        frontsSeeThrough: !!m.frontsSeeThrough,\n        hardwareXray: !!m.hardwareXray,\n        productionHardware: authority ? m.productionHardware : null,\n        environment: m.environment || \"neutral\",\n        // the exterior skin, a view setting (task 1791152519382)\n        ghostUnitId: m.drawerPreview && m.drawerPreview.id || m.interiorPreview && m.interiorPreview.id || null,\n        // the drawer drag's target: its fronts see-through (task 1791100473866); a shelf / divider drag-in's too (task 1791222646469)\n        roomSel: m.roomSel || null,\n        roomDrag: m.roomDrag || null,\n        roomArmed: m.roomArmed || null,\n        roomObjSel: m.roomObjSel || null\n      } };\n    }\n    const internalEdit = (m) => internalEditLevel(m, !!(o.partDragActive && o.partDragActive()));\n    const viewCut = createViewCut({ reducedMotion, now: () => win2 && win2.performance ? win2.performance.now() : Date.now() });\n    let cutTimer = 0;\n    function cutFor(cam) {\n      const m = model();\n      const r = viewCut.step(m.units || [], cam, m.selectedId);\n      const fam = (id) => {\n        const u = (m.units || []).find((v) => v.id === id);\n        return u ? u.family : null;\n      };\n      const isIsland2 = (id) => {\n        const u = (m.units || []).find((v) => v.id === id);\n        return !!u && u.type === \"island\";\n      };\n      const through = [...r.ids].filter((id) => id !== m.selectedId && (fam(id) === \"wall\" || isIsland2(id) || r.pass && r.pass.has(id)));\n      m.viewCut = through.length ? through : null;\n      r.through = new Set(through);\n      if (r.moving && !cutTimer && win2 && win2.requestAnimationFrame) cutTimer = win2.requestAnimationFrame(() => {\n        cutTimer = 0;\n        requestFrame();\n      });\n      return r;\n    }\n    function update() {\n      const gm = model().graphics;\n      if (gm && tierName(gm) !== gfx.name) {\n        api.setGraphics(gm);\n        return;\n      }\n      const cam = camNow(), snap3 = snapshot(), r = cutFor(cam);\n      snap3.view.cut = r.cut;\n      snap3.view.cutIds = r.through || r.ids;\n      R4.update(snap3);\n      R4.setCamera(cam);\n    }\n    function requestFrame() {\n      update();\n    }\n    function ndc(clientX, clientY) {\n      const r = canvas.getBoundingClientRect();\n      return [(clientX - r.left) / r.width * 2 - 1, -((clientY - r.top) / r.height * 2 - 1)];\n    }\n    function onDown(e) {\n      const pan = e.button === 2 || e.shiftKey;\n      if (pan ? !controls.pan : !controls.rotate) return;\n      ui.drag = { x: e.clientX, y: e.clientY, pan };\n    }\n    function onMove(e) {\n      if (!ui.drag) return;\n      const dx = e.clientX - ui.drag.x, dy = e.clientY - ui.drag.y;\n      ui.drag.x = e.clientX;\n      ui.drag.y = e.clientY;\n      view.camHold = null;\n      Object.assign(view, ui.drag.pan ? panBy(view, ui.cam, dx, dy) : orbitBy(view, dx, dy));\n      requestFrame();\n    }\n    function onUp() {\n      ui.drag = null;\n    }\n    function onWheel(e) {\n      if (!controls.zoom) return;\n      const next = wheelZoom(view.zoom, e.deltaY, e.deltaMode);\n      if (Math.abs(next - clampZoom(view.zoom)) > 1e-9) {\n        if (e.cancelable) e.preventDefault();\n        view.camHold = null;\n        view.zoom = next;\n        requestFrame();\n      }\n    }\n    const gap = (e) => Math.hypot(e.touches[0].clientX - e.touches[1].clientX, e.touches[0].clientY - e.touches[1].clientY);\n    function onTouchStart(e) {\n      if (e.touches.length === 2 && controls.zoom) {\n        ui.pinch = { gap: Math.max(1, gap(e)), z0: clampZoom(view.zoom) };\n        ui.tS = null;\n        return;\n      }\n      ui.pinch = null;\n      if (e.touches.length === 1) {\n        ui.tS = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n        ui.tM = null;\n      }\n    }\n    function onTouchMove(e) {\n      if (ui.pinch && e.touches.length === 2) {\n        if (e.cancelable) e.preventDefault();\n        view.camHold = null;\n        view.zoom = clampZoom(ui.pinch.z0 * (ui.pinch.gap / Math.max(1, gap(e))));\n        requestFrame();\n        return;\n      }\n      if (!ui.tS || e.touches.length !== 1 || !controls.rotate) return;\n      const x = e.touches[0].clientX, y = e.touches[0].clientY, dx = x - ui.tS.x, dy = y - ui.tS.y;\n      if (ui.tM === null) {\n        if (Math.abs(dx) < 6 && Math.abs(dy) < 6) return;\n        ui.tM = Math.abs(dx) > Math.abs(dy) ? \"act\" : \"scroll\";\n      }\n      if (ui.tM !== \"act\") return;\n      if (e.cancelable) e.preventDefault();\n      view.camHold = null;\n      view.yaw += dx * ORBIT.touchYawPerPx;\n      ui.tS.x = x;\n      ui.tS.y = y;\n      requestFrame();\n    }\n    function onTouchEnd(e) {\n      if (!e.touches || e.touches.length < 2) ui.pinch = null;\n      ui.tS = null;\n      ui.tM = null;\n    }\n    const noMenu = (e) => e.preventDefault();\n    const bound = !!(canvas && canvas.addEventListener && !o.headless);\n    if (bound) {\n      canvas.addEventListener(\"mousedown\", onDown);\n      canvas.addEventListener(\"contextmenu\", noMenu);\n      canvas.addEventListener(\"wheel\", onWheel, { passive: false });\n      canvas.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n      canvas.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n      canvas.addEventListener(\"touchend\", onTouchEnd, { passive: true });\n      win2.addEventListener(\"mousemove\", onMove);\n      win2.addEventListener(\"mouseup\", onUp);\n    }\n    const PRESET = { iso: [DEFAULTS.yaw, DEFAULTS.pitch], front: [0, 0.05], side: [-Math.PI / 2, 0.05], top: [0, 1.15] };\n    function refitKitchen() {\n      view.camHold = null;\n      view.frame = sceneFrame(model().units);\n      view.panX = 0;\n      view.panY = 0;\n      view.zoom = fitZoom(view.frame);\n    }\n    const api = {\n      update,\n      requestFrame,\n      pick(clientX, clientY) {\n        const [nx, ny] = ndc(clientX, clientY);\n        const hit2 = R4.raycast(nx, ny);\n        if (!hit2) return null;\n        const u = model().units.find((v) => v.id === hit2.unitId);\n        const ray = rayFromNdc(ui.cam || camNow(), nx, ny);\n        const hitBox = (B) => {\n          let t0 = -Infinity, t1 = Infinity;\n          const lo = [B.x0, B.y0, B.z0], hi = [B.x1, B.y1, B.z1];\n          for (let i = 0; i < 3; i++) {\n            const oo = ray.o[i], d = ray.d[i];\n            if (Math.abs(d) < 1e-9) {\n              if (oo < lo[i] || oo > hi[i]) return null;\n              continue;\n            }\n            let ta = (lo[i] - oo) / d, tb = (hi[i] - oo) / d;\n            if (ta > tb) {\n              const s = ta;\n              ta = tb;\n              tb = s;\n            }\n            if (ta > t0) t0 = ta;\n            if (tb < t1) t1 = tb;\n            if (t0 > t1) return null;\n          }\n          return t1 < 0 ? null : t0 >= 0 ? t0 : t1;\n        };\n        hitBox.ray = ray;\n        const pp = u ? pickPartIn(u, hitBox) : null;\n        return { unitId: hit2.unitId, part: pp ? pp.part : null, point: hit2.point, normal: hit2.normal };\n      },\n      /* \u043F\u0438\u0448\u0443\u0442 \u043F\u043E\u043B\u044F \u0441\u0430\u043C\u043E\u0433\u043E \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0449\u0438\u043A\u0430 \u2014 \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A (\u0441\u043C. internalEdit, hoverUnitOf) */\n      setSelection(ids) {\n        model().selectedId = ids && ids.length ? ids[0] : null;\n        update();\n      },\n      setHover(idOrPid) {\n        model().hoverPart = idOrPid || null;\n        update();\n      },\n      /* xray: \u0447\u0438\u0441\u043B\u043E \u2014 \u0437\u0430\u043A\u0440\u0435\u043F\u0438\u0442\u044C (\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438, \u0441\u0442\u0435\u043D\u0434); null \u2014 \u0441\u043D\u043E\u0432\u0430 \u0438\u0437 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F */\n      setOverlay(p) {\n        if (p && \"xray\" in p) flags.xray = p.xray;\n        update();\n      },\n      setView(v) {\n        if (typeof v === \"string\") {\n          if (v === \"fit\") refitKitchen();\n          else if (PRESET[v]) {\n            view.camHold = null;\n            view.yaw = PRESET[v][0];\n            view.pitch = PRESET[v][1];\n            if (v === \"iso\") refitKitchen();\n          }\n        } else if (v) {\n          if (v.azimuth != null) view.yaw = v.azimuth;\n          if (v.elevation != null) view.pitch = Math.max(ORBIT.pitchMin, Math.min(ORBIT.pitchMax, v.elevation));\n          const c = ui.cam || camNow();\n          if (v.target || v.distance != null) {\n            const t = v.target || { x: c.cx, y: c.cy, z: c.cz };\n            view.camHold = { cx: t.x, cy: t.y, cz: t.z, dist: v.distance != null ? v.distance : c.dist, atMin: false };\n          }\n        }\n        requestFrame();\n      },\n      getView() {\n        const c = ui.cam || camNow();\n        return { azimuth: view.yaw, elevation: view.pitch, distance: c.dist, target: { x: c.cx, y: c.cy, z: c.cz } };\n      },\n      worldToScreen(p) {\n        const c = ui.cam || camNow();\n        const nd = worldToNdc(c, [p.x, p.y, p.z]);\n        if (!nd) return { x: NaN, y: NaN, visible: false };\n        const m = c.mvp, w = m[3] * p.x + m[7] * p.y + m[11] * p.z + m[15];\n        const x = (nd[0] + 1) / 2 * c.cw, y = (1 - nd[1]) / 2 * c.ch;\n        return { x, y, visible: w > 0 && x >= 0 && y >= 0 && x <= c.cw && y <= c.ch };\n      },\n      screenToPlane(clientX, clientY, planeY) {\n        const [nx, ny] = ndc(clientX, clientY);\n        const h = screenToFloor(ui.cam || camNow(), nx, ny, planeY || 0);\n        return h ? { x: h[0], z: h[2] } : null;\n      },\n      setControls(c) {\n        Object.assign(controls, c || {});\n        if (!controls.rotate && !controls.pan) ui.drag = null;\n      },\n      on(ev, fn) {\n        const l = listeners[ev];\n        if (!l) throw new Error(\"render: \\u043D\\u0435\\u0442 \\u0441\\u043E\\u0431\\u044B\\u0442\\u0438\\u044F \" + ev);\n        l.push(fn);\n        return () => {\n          const i = l.indexOf(fn);\n          if (i >= 0) l.splice(i, 1);\n        };\n      },\n      dispose() {\n        if (bound) {\n          canvas.removeEventListener(\"mousedown\", onDown);\n          canvas.removeEventListener(\"contextmenu\", noMenu);\n          canvas.removeEventListener(\"wheel\", onWheel);\n          canvas.removeEventListener(\"touchstart\", onTouchStart);\n          canvas.removeEventListener(\"touchmove\", onTouchMove);\n          canvas.removeEventListener(\"touchend\", onTouchEnd);\n          win2.removeEventListener(\"mousemove\", onMove);\n          win2.removeEventListener(\"mouseup\", onUp);\n        }\n        R4.dispose();\n      },\n      /* \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 (docs/render-api.md) */\n      camera: () => ui.cam || camNow(),\n      /* the camera the next frame is drawn with, computed now from the scene as it is (focus cabinet included) - the\n         render surface takes it, so the + , arrows and numbers are placed by the very camera of the picture */\n      cameraNow: () => camNow(),\n      viewCut: () => viewCut.state(),\n      // the rear-view fade, for the checks (view-cut.js)\n      /* aim a zoomed-in view at this cabinet from now on (the focus a later selection keeps) - asked for by a deliberate\n         action on that cabinet, e.g. the + press that made it when its own next + would be out of the picture */\n      focusOn: (id) => {\n        ui.focusId = id;\n        ui.focusFrame = view.frame;\n      },\n      worldToNdc: (p) => worldToNdc(ui.cam || camNow(), p),\n      rayAt(clientX, clientY) {\n        const [nx, ny] = ndc(clientX, clientY);\n        return rayFromNdc(ui.cam || camNow(), nx, ny);\n      },\n      info: () => R4.info(),\n      /* the exterior skin as drawn: { active: \"neutral\"|\"universe\", requested, loading, error, loads, textures } */\n      environment: () => R4.environment(),\n      setArrowSource: (fn) => R4.setArrowSource(fn),\n      renderNow: () => R4.renderNow(),\n      viewState: () => Object.assign({}, view),\n      setViewState(s) {\n        Object.assign(view, s || {});\n        requestFrame();\n      },\n      ready: () => R4.oakReady,\n      /* \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430: { level, name, target, adaptive, renderer, changes } */\n      quality: () => ({\n        level: R4.level(),\n        name: LEVELS[R4.level()].name,\n        target: qs.target,\n        adaptive: qs.adaptive,\n        renderer: dev.renderer,\n        device: dev,\n        changes: qs.changes.slice(),\n        firstFrameLevel: qs.firstFrameLevel\n      }),\n      setQuality(n) {\n        qs.gov = null;\n        qs.adaptive = false;\n        qs.upgraded = true;\n        R4.setLevel(n);\n      },\n      /* THE GRAPHICS TIER (render/graphics.js): \"low\" (Fast) | \"auto\" (Balanced) | \"high\" (Sharp). Remembered on this device\n         unless { save: false }. A lower cap takes the level down at once; a higher one gives the governor room again, from\n         the device's own start level (it climbs further only on fast frames, as ever). */\n      setGraphics(name2, opt) {\n        const t = tierOf(name2);\n        const changed = t.name !== gfx.name;\n        gfx.name = t.name;\n        gfx.source = \"chosen\";\n        try {\n          const m = getModel && getModel();\n          if (m) m.graphics = t.name;\n        } catch {\n        }\n        if (!(opt && opt.save === false)) saveTier(storage, t.name);\n        R4.setGraphics(t.name);\n        if (qs.adaptive) {\n          const cur = qs.gov ? qs.gov.level : R4.level();\n          const lv = Math.min(t.maxLevel, Math.max(cur, Math.min(qs.deviceTarget, t.maxLevel)));\n          qs.gov = createGovernor({ level: lv, fails: qs.gov ? qs.gov.fails : {}, max: t.maxLevel });\n          qs.target = lv;\n          if (qs.upgraded) R4.setLevel(lv);\n        } else R4.setLevel(Math.min(qs.deviceTarget, t.maxLevel));\n        requestFrame();\n        return changed;\n      },\n      /* { tier, label, tiers, source, level, pixelRatio, post, samples, scale, bloom, postBytes, ... } (renderer.js graphicsInfo) */\n      graphics: () => Object.assign({ tiers: TIER_NAMES.slice(), source: gfx.source }, R4.graphics()),\n      /* \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A: \u0441\u0446\u0435\u043D\u0430 Three.js */\n      inspect: () => R4.inspect()\n    };\n    return api;\n  }\n\n  // v2/src/render/surface.js\n  var legacyExports = {\n    get buildMeshData() {\n      return buildMeshData;\n    },\n    get MET() {\n      return MET;\n    },\n    get HINGE() {\n      return HINGE;\n    },\n    get sceneFrame() {\n      return sceneFrame;\n    },\n    get emitContactShadows() {\n      return emitContactShadows;\n    },\n    get SHADOW_STEPS() {\n      return SHADOW_STEPS;\n    },\n    get xrayOn() {\n      return xrayOn;\n    },\n    get xrayActive() {\n      return xrayActive;\n    },\n    get xraySplit() {\n      return xraySplit;\n    },\n    get emitDiscXf() {\n      return emitDiscXf;\n    },\n    get hingePoints() {\n      return hingePoints;\n    },\n    get VS() {\n      return VS;\n    },\n    get FS() {\n      return FS;\n    }\n  };\n  function afterFrame(inst) {\n    const i = inst() || {};\n    if (typeof i.afterFrame === \"function\") i.afterFrame();\n    if (typeof i.onFrame === \"function\") i.onFrame();\n  }\n  function wireFrame(R4, inst) {\n    return R4.on(\"frame\", () => afterFrame(inst));\n  }\n  function pictureCamera(R4, scene, cw, ch) {\n    const c = R4 && R4.cameraNow ? R4.cameraNow() : null;\n    return c || computeCameraGuarded(scene, scene.units, cw, ch, sceneFrame);\n  }\n  function attach(ctx) {\n    const { root, canvas, scene } = ctx;\n    const win2 = ctx.win || null;\n    const st = {\n      cam: null,\n      atMin: false,\n      R: null,\n      lost: false,\n      xray: null,\n      rstat: { builds: 0, frames: 0, verts: 0, tris: 0, units: 0, buildMs: 0, uploadMs: 0 }\n    };\n    const now = () => typeof performance !== \"undefined\" && performance.now ? performance.now() : Date.now();\n    const inst = () => ctx.inst || {};\n    const gesture = () => !!(inst().sizeGestureActive && inst().sizeGestureActive());\n    const gesturePart = () => !!(inst().partDragActive && inst().partDragActive());\n    function render() {\n      const cw = canvas && canvas.clientWidth || 600, ch = canvas && canvas.clientHeight || 440;\n      st.cam = pictureCamera(st.R, scene, cw, ch);\n      if (st.cam) st.atMin = st.cam.atMin;\n      st.rstat.frames++;\n      if (st.R) st.R.requestFrame();\n      else afterFrame(inst);\n      return st.cam;\n    }\n    function ensureCam() {\n      if (!st.cam) render();\n      return st.cam;\n    }\n    const LEGACY_CAM_KEYS = [\"cx\", \"cy\", \"cz\", \"dist\", \"cw\", \"ch\", \"aspect\", \"near\", \"far\"];\n    function legacyCam() {\n      if (!st.cam) return null;\n      if (st.legacyCamOf !== st.cam) {\n        const o = {};\n        for (const k of LEGACY_CAM_KEYS) if (k in st.cam) o[k] = st.cam[k];\n        st.legacyCamOf = st.cam;\n        st.legacyCam = o;\n      }\n      return st.legacyCam;\n    }\n    function update() {\n      const t0 = now();\n      xrayOn((st.xray != null ? st.xray : internalEditLevel(scene, gesturePart())) > 0);\n      scene.units.forEach((u) => {\n        u.explode = scene.explode;\n      });\n      applySpread(scene.units, explodeMM({ explode: scene.explode }));\n      if (st.R) {\n        st.R.update();\n      } else {\n        const d = buildMeshData(scene);\n        st.rstat.verts = d.length / 12;\n        st.rstat.tris = Math.round(st.rstat.verts / 3);\n      }\n      st.rstat.builds++;\n      st.rstat.units = scene.units.length;\n      st.rstat.buildMs = Math.round((now() - t0) * 100) / 100;\n      st.rstat.uploadMs = 0;\n    }\n    function holdCamera() {\n      render();\n      if (scene.camHold) return scene.camHold;\n      if (!st.cam) return null;\n      scene.camHold = { cx: st.cam.cx, cy: st.cam.cy, cz: st.cam.cz, dist: st.cam.dist, atMin: st.atMin };\n      return scene.camHold;\n    }\n    function releaseCamera() {\n      if (gesture()) return;\n      scene.camHold = null;\n    }\n    function setZoom(z, why) {\n      if (gesture()) return clampZoom(scene.zoom);\n      releaseCamera();\n      const before = clampZoom(scene.zoom);\n      scene.zoom = clampZoom(z);\n      render();\n      if (inst().zoomChanged) inst().zoomChanged({ before, why: !!why, atMin: st.atMin });\n      return scene.zoom;\n    }\n    function refit() {\n      if (gesture()) return;\n      releaseCamera();\n      scene.frame = sceneFrame(scene.units);\n      scene.zoom = 1;\n      scene.fitWide = true;\n      scene.panX = 0;\n      scene.panY = 0;\n      if (inst().zoomChanged) inst().zoomChanged({ before: null, why: false, atMin: st.atMin });\n    }\n    function liveRect() {\n      const r = canvas && canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : { left: 0, top: 0, width: canvas && canvas.clientWidth || 700, height: canvas && canvas.clientHeight || 520 };\n      if (!r.width || !r.height) return null;\n      return r;\n    }\n    if (!scene.frame) scene.frame = sceneFrame(scene.units);\n    if (scene.units && scene.units.length) {\n      scene.zoom = clampZoom(fitZoom(scene.frame) * 1.3);\n      scene.fitWide = false;\n    }\n    function say(msg) {\n      const ui = inst().ui;\n      if (ui && ui.cue) {\n        ui.cue(msg);\n        return;\n      }\n      const c = root && root.querySelector ? root.querySelector(\"[data-ub-cue]\") : null;\n      if (c) {\n        c.textContent = msg || \"\";\n        if (c.style) c.style.display = msg ? \"\" : \"none\";\n      }\n    }\n    const LOST_MSG = \"The 3D view was interrupted \\u2014 restoring it\\u2026\";\n    const NOT_RESTORED_MSG = \"The 3D view could not be restored \\u2014 please reload the page to carry on.\";\n    const NO_START_MSG = \"The 3D view could not start \\u2014 please reload the page to carry on.\";\n    const RESTORE_WAIT_MS = 8e3;\n    function onContextLost() {\n      st.lost = true;\n      st.restoring = true;\n      say(LOST_MSG);\n      if (win2 && win2.setTimeout) win2.setTimeout(() => {\n        if (st.lost && st.restoring) {\n          st.restoring = false;\n          say(NOT_RESTORED_MSG);\n        }\n      }, RESTORE_WAIT_MS);\n    }\n    function onContextRestored() {\n      st.lost = false;\n      st.restoring = false;\n      say(null);\n    }\n    function startThree(THREE) {\n      const q = /[?&]quality=(full|lite|auto|[0-4])\\b/.exec(win2.location && win2.location.search || \"\");\n      try {\n        st.R = createRenderer2(canvas, {\n          three: THREE,\n          getModel: () => scene,\n          view: scene,\n          window: win2,\n          partDragActive: gesturePart,\n          quality: q && q[1] || root.getAttribute(\"data-ub-quality\") || \"auto\",\n          /* ?ubgfx=low|auto|high - a fixed graphics tier for a comparison screenshot (task 1791531588544); else the device's choice */\n          graphics: (/[?&]ubgfx=(low|auto|high)\\b/.exec(win2.location && win2.location.search || \"\") || [])[1] || null,\n          oakTextureUrl: root.getAttribute(\"data-ub-oak-tex\"),\n          /* the pro edition (ui/edition.js): no glow under the pointer, no cabinet rising from the floor */\n          calm: root.getAttribute(\"data-ub-edition\") === \"pro\"\n        });\n      } catch (err) {\n        st.R = null;\n        if (win2.console) win2.console.error(\"Cabinet Lab v2: \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440 Three.js \\u043D\\u0435 \\u0437\\u0430\\u043F\\u0443\\u0441\\u0442\\u0438\\u043B\\u0441\\u044F\", err);\n        say(NO_START_MSG);\n        if (root.classList) {\n          root.classList.remove(\"ub-lab--loading\");\n          root.classList.add(\"ub-lab--failed\");\n        }\n        return;\n      }\n      st.R.setControls({ rotate: false, pan: false, zoom: false });\n      if (st.R.graphics) {\n        try {\n          scene.graphics = st.R.graphics().tier;\n        } catch {\n        }\n      }\n      st.R.on(\"contextlost\", onContextLost);\n      st.R.on(\"contextrestored\", onContextRestored);\n      st.R.on(\"environment\", onEnvironment);\n      restoreEnvironment();\n      wireFrame(st.R, inst);\n      if (st.arrowSrc) st.R.setArrowSource(st.arrowSrc);\n      if (st.xray != null) st.R.setOverlay({ xray: st.xray });\n      st.R.update();\n      applyUrlCamera();\n    }\n    function restoreEnvironment() {\n      const m = /[?&]ubenv=(universe|neutral)\\b/.exec(win2.location && win2.location.search || \"\");\n      let name2 = m ? m[1] : null;\n      if (!name2) {\n        try {\n          name2 = win2.localStorage && win2.localStorage.getItem(ENV_PREF_KEY);\n        } catch {\n          name2 = null;\n        }\n      }\n      if (envName(name2) === \"universe\") {\n        scene.environment = \"universe\";\n        scene.envLoading = true;\n      }\n      if (/[?&]ublight=evening\\b/.test(win2.location && win2.location.search || \"\")) scene.evening = true;\n    }\n    function onEnvironment(s) {\n      if (!s) return;\n      const ui = inst().ui;\n      const was = !!scene.envLoading;\n      scene.envLoading = false;\n      if (s.error && scene.environment === \"universe\" && s.active !== \"universe\") {\n        scene.environment = \"neutral\";\n        say(\"The Universe sky could not be loaded - showing Neutral. Try it again from the View menu.\");\n      } else if (was && s.active === \"universe\") {\n        say(\"Environment: Universe - turn the view to find the Earth, the Sun and the galaxies round the room.\");\n      }\n      if (ui && ui.syncControls) ui.syncControls();\n    }\n    function applyUrlCamera() {\n      const m = /[?&]ubcam=(-?[\\d.]+),(-?[\\d.]+)(?:,([\\d.]+))?/.exec(win2.location && win2.location.search || \"\");\n      if (!m) return;\n      releaseCamera();\n      scene.yaw = Number(m[1]) * Math.PI / 180;\n      scene.pitch = Number(m[2]) * Math.PI / 180;\n      if (m[3]) scene.zoom = clampZoom(Number(m[3]));\n      render();\n    }\n    if (win2 && win2.addEventListener) win2.addEventListener(\"resize\", () => {\n      render();\n    });\n    if (win2 && typeof win2.ResizeObserver === \"function\" && canvas && canvas.nodeType === 1) {\n      try {\n        new win2.ResizeObserver(() => {\n          render();\n        }).observe(canvas);\n      } catch {\n      }\n    }\n    const lib = root && root.getAttribute && root.getAttribute(\"data-ub-three-lib\");\n    if (win2 && win2.document && canvas && typeof canvas.getContext === \"function\") {\n      if (ctx.three) Promise.resolve(ctx.three).then(startThree);\n      else if (lib) {\n        import(\n          /* webpackIgnore: true */\n          lib\n        ).then(startThree).catch((err) => {\n          if (win2.console) win2.console.error(\"Cabinet Lab v2: Three.js \\u043D\\u0435\\u0434\\u043E\\u0441\\u0442\\u0443\\u043F\\u0435\\u043D\", err);\n          say(NO_START_MSG);\n        });\n      }\n    }\n    return {\n      /* 22 \u0438\u043C\u0435\u043D\u0438 __ubProj \u0441\u043B\u043E\u044F render */\n      screenToFloor: (nx, ny, planeY) => screenToFloor(ensureCam(), nx, ny, planeY),\n      screenToWall: (nx, ny, planeZ) => screenToPlane(ensureCam(), nx, ny, \"z\", planeZ),\n      screenToPlane: (nx, ny, axis, at) => screenToPlane(ensureCam(), nx, ny, axis, at),\n      worldToNdc: (p) => st.cam ? worldToNdc(st.cam, p) : null,\n      worldClipZ: (p) => st.cam ? worldClipZ(st.cam, p) : null,\n      unitAABB,\n      setCam: (y, p) => {\n        releaseCamera();\n        scene.yaw = y;\n        scene.pitch = p;\n        render();\n      },\n      /* the picture's focus cabinet (render/index.js focusOn); false without Three.js, where the camera aims at the\n         selection anyway */\n      focusOn: (id) => {\n        if (!(st.R && st.R.focusOn)) return false;\n        st.R.focusOn(id);\n        render();\n        return true;\n      },\n      holdCamera,\n      releaseCamera,\n      eye: () => st.cam ? camEyeOf(st.cam) : null,\n      camEye: () => st.cam ? camEyeOf(st.cam) : null,\n      renderStats: () => Object.assign({}, st.rstat),\n      resetStats: () => {\n        st.rstat.builds = 0;\n        st.rstat.frames = 0;\n      },\n      render,\n      camHeld: () => !!scene.camHold,\n      cam: legacyCam,\n      atMinDist: () => st.atMin,\n      setZoom,\n      refit,\n      liveRect,\n      resize: (w, h) => {\n        canvas.clientWidth = w;\n        canvas.clientHeight = h;\n        render();\n      },\n      sceneFrame: (units) => sceneFrame(units || scene.units),\n      /* \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u043E\u0435 \u0434\u043B\u044F \u0441\u043B\u043E\u0451\u0432 \u0432\u044B\u0448\u0435 (\u0441\u043D\u0430\u0440\u0443\u0436\u0438 \u043D\u0435 \u0432\u0438\u0434\u043D\u043E) */\n      camera: () => st.cam,\n      update,\n      contextLost: () => st.lost,\n      renderer: () => st.R,\n      /* the size arrows as 3D meshes (render/renderer.js): the interaction layer hands its source */\n      setArrowSource: (fn) => {\n        st.arrowSrc = fn;\n        if (st.R) st.R.setArrowSource(fn);\n      },\n      setOverlay: (p) => {\n        if (p && p.xray != null) st.xray = p.xray;\n        if (st.R) st.R.setOverlay(p);\n      },\n      setSelectionHighlight: (ids) => {\n        if (st.R) st.R.setSelection(ids);\n      },\n      setHover: (id) => {\n        if (st.R) st.R.setHover(id);\n      },\n      pick: (x, y) => st.R ? st.R.pick(x, y) : null,\n      /* the graphics tier (render/graphics.js): \"low\" | \"auto\" | \"high\"; null before Three.js has started */\n      setGraphics: (name2, opt) => st.R ? st.R.setGraphics(name2, opt) : null,\n      graphics: () => st.R ? st.R.graphics() : null\n    };\n  }\n\n  // v2/src/interact/surface.js\n  var surface_exports2 = {};\n  __export(surface_exports2, {\n    attach: () => attach2,\n    legacyExports: () => legacyExports2,\n    renderPort: () => renderPort\n  });\n\n  // v2/src/interact/core.js\n  function createCore(opts) {\n    const scene = opts.scene;\n    const render = opts.render;\n    const onCue = opts.onCue || null;\n    const onChange = opts.onChange || null;\n    const rectOf = opts.rect || null;\n    const ctx = {\n      scene,\n      render,\n      opts,\n      /* \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0436\u0435\u0441\u0442\u043E\u0432 \u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u2014 \u0442\u043E, \u0447\u0442\u043E \u0432 \u0441\u0442\u0430\u0440\u043E\u043C init \u0436\u0438\u043B\u043E \u0432\n         \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u0437\u0430\u043C\u044B\u043A\u0430\u043D\u0438\u044F (drag, handleDrag, partDrag, sizeDrag, activeHandle, ...) */\n      st: {\n        drag: null,\n        handleDrag: null,\n        partDrag: null,\n        sizeDrag: null,\n        activeHandle: null,\n        dragSnap: { x: null, z: null, y: null },\n        touch: { tS: null, tM: null, tGrab: null, pinch: null },\n        gapUndo: null,\n        gapPick: null,\n        fitWideNext: true,\n        lastNudge: null,\n        cueText: \"\",\n        cueSeq: 0,\n        histAddBefore: null,\n        shelfMmFocus: false\n      }\n    };\n    ctx.sel = function sel() {\n      const us = scene.units;\n      for (let i = 0; i < us.length; i++) if (us[i].id === scene.selectedId) return us[i];\n      return us[0];\n    };\n    ctx.byId = function byId2(id) {\n      for (let i = 0; i < scene.units.length; i++) if (scene.units[i].id === id) return scene.units[i];\n      return null;\n    };\n    ctx.cue = function cue(msg) {\n      ctx.st.cueText = msg || \"\";\n      ctx.st.cueSeq++;\n      if (onCue) onCue(msg || null);\n    };\n    ctx.changed = function changed(what) {\n      if (onChange) onChange(what);\n    };\n    ctx.frame = function frame2() {\n      render.setView(scene);\n      render.update({ units: scene.units, view: scene });\n      render.requestFrame();\n      ctx.changed(\"frame\");\n    };\n    ctx.settle = function settle() {\n      syncRoom(scene.units);\n      settleEqual(scene.units);\n      const us = scene.units;\n      for (let i = 0; i < us.length; i++) us[i].explode = scene.explode;\n      applySpread(us, explodeMM({ explode: scene.explode }));\n      scene.cues = scene.cues || null;\n    };\n    ctx.refresh = function refresh() {\n      ctx.settle();\n      ctx.frame();\n      ctx.changed(\"refresh\");\n    };\n    ctx.syncState = function syncState() {\n      const u = ctx.sel();\n      if (u && u.id !== scene._lastSel) {\n        scene._lastSel = u.id;\n        if (u.type === \"corner-l\" && ROOM.ret) scene.activeRun = \"return\";\n      }\n      if (ctx.syncHandlesState) ctx.syncHandlesState();\n      ctx.syncGapPick();\n    };\n    ctx.syncControls = function syncControls() {\n      ctx.syncState();\n      ctx.changed(\"controls\");\n    };\n    ctx.syncGapPick = function syncGapPick() {\n      const u = ctx.sel();\n      const off = u ? gapOffer(scene.units, u) : { ok: false };\n      if (!off.ok) return;\n      if (off.ambiguous) {\n        if (!ctx.st.gapPick) ctx.st.gapPick = \"hi\";\n      } else ctx.st.gapPick = off.dir || \"hi\";\n    };\n    ctx.alignVisible = function alignVisible() {\n      return !!(scene.alignView || scene.alignTemp);\n    };\n    ctx.alignTempOn = function alignTempOn() {\n      if (scene.alignTemp) return;\n      scene.alignTemp = true;\n      scene.cues = alignGroups(scene.units, ctx.sel(), null);\n    };\n    ctx.alignTempOff = function alignTempOff() {\n      if (!scene.alignTemp) return;\n      scene.alignTemp = false;\n      if (!scene.alignView) {\n        scene.cues = null;\n        ctx.cue(null);\n      }\n      ctx.syncControls();\n      ctx.refresh();\n    };\n    ctx.refreshCues = function refreshCues() {\n      const u = ctx.sel();\n      scene.cues = ctx.alignVisible() && u ? alignGroups(scene.units, u, null) : null;\n      ctx.cue(ctx.alignVisible() ? cueText(scene.cues, null) : null);\n    };\n    ctx.cam = function cam() {\n      const v = render.getView();\n      return v ? v.cam : null;\n    };\n    ctx.liveRect = function liveRect() {\n      const r = rectOf ? rectOf() : null;\n      if (!r || !r.width || !r.height) return null;\n      return r;\n    };\n    ctx.ensureCam = function ensureCam() {\n      const r = ctx.liveRect();\n      const cw = r ? r.width : 0, ch = r ? r.height : 0;\n      const c = ctx.cam();\n      if (!c || cw && ch && (Math.abs(c.cw - cw) > 0.5 || Math.abs(c.ch - ch) > 0.5)) ctx.frame();\n      return !!ctx.cam();\n    };\n    ctx.ndcFromEvent = function ndcFromEvent(clientX, clientY) {\n      ctx.ensureCam();\n      const r = ctx.liveRect();\n      if (!r) return [0, 0];\n      return [(clientX - r.left) / r.width * 2 - 1, -((clientY - r.top) / r.height * 2 - 1)];\n    };\n    ctx.pointerRay = function pointerRay(clientX, clientY) {\n      if (!ctx.ensureCam()) return null;\n      const r = ctx.liveRect();\n      if (!r) return null;\n      const nx = (clientX - r.left) / r.width * 2 - 1;\n      const ny = -((clientY - r.top) / r.height * 2 - 1);\n      return render.rayNdc(nx, ny);\n    };\n    ctx.rayFromNdc = function rayFromNdc2(nx, ny) {\n      return render.rayNdc(nx, ny);\n    };\n    ctx.screenToFloor = function screenToFloor2(nx, ny, planeY) {\n      return render.planeNdc(nx, ny, \"y\", planeY);\n    };\n    ctx.screenToPlane = function screenToPlane2(nx, ny, axis, at) {\n      return render.planeNdc(nx, ny, axis, at);\n    };\n    ctx.worldToNdc = function worldToNdc2(p) {\n      return render.worldToNdc(p);\n    };\n    ctx.worldClipZ = function worldClipZ2(p) {\n      return render.worldClipZ(p);\n    };\n    ctx.meshPoint = function meshPoint(clientX, clientY) {\n      return render.meshPoint ? render.meshPoint(clientX, clientY) : null;\n    };\n    ctx.camEye = function camEye() {\n      return render.eye();\n    };\n    ctx.canvasSize = function canvasSize() {\n      const z = opts.size ? opts.size() : null;\n      if (z) return { w: z.w || 600, h: z.h || 440, cw: z.w, ch: z.h };\n      const r = rectOf ? rectOf() : null;\n      return { w: r && r.width || 600, h: r && r.height || 440, cw: r ? r.width : 0, ch: r ? r.height : 0 };\n    };\n    ctx.halfSpan = function halfSpan() {\n      const c = ctx.cam();\n      return Math.tan(FOVY / 2) * (c ? c.dist : 2e3) / (c && c.viewScale > 0 ? c.viewScale : 1);\n    };\n    ctx.wallPlaneFor = function wallPlaneFor(run) {\n      if (run === \"return\" && ROOM.ret) return { axis: ROOM.ret.axis, at: ROOM.ret.at };\n      return { axis: \"z\", at: ROOM.wallZ };\n    };\n    ctx.runAxisFor = function runAxisFor(run) {\n      return run === \"return\" && ROOM.ret && ROOM.ret.axis === \"x\" ? \"z\" : \"x\";\n    };\n    ctx.roomExtent = function roomExtent(axis) {\n      const s = roomSize();\n      return axis === \"z\" ? s.depth : s.width;\n    };\n    ctx.footCentre = function footCentre(u) {\n      const f = foot(u);\n      return [(f.x0 + f.x1) / 2, (f.z0 + f.z1) / 2];\n    };\n    return ctx;\n  }\n\n  // v2/src/interact/history.js\n  var HIST_LIMIT = 80;\n  function installHistory(ctx) {\n    const scene = ctx.scene;\n    const HIST = { past: [], future: [], live: null, limit: HIST_LIMIT };\n    function snap3() {\n      return JSON.stringify({\n        ...scene.workshop ? { workshop: scene.workshop } : {},\n        units: scene.units,\n        selectedId: scene.selectedId,\n        room: scene.room,\n        kitchen: scene.kitchen,\n        activeRun: scene.activeRun\n      });\n    }\n    function changed() {\n      ctx.changed(\"history\");\n    }\n    function begin(label) {\n      if (HIST.live) return;\n      HIST.live = { label: label || \"change\", before: snap3() };\n    }\n    function commit() {\n      if (!HIST.live) return false;\n      const after = snap3(), live = HIST.live;\n      HIST.live = null;\n      if (after === live.before) return false;\n      HIST.past.push({ label: live.label, before: live.before, after });\n      if (HIST.past.length > HIST.limit) HIST.past.shift();\n      HIST.future.length = 0;\n      changed();\n      return true;\n    }\n    function abort() {\n      HIST.live = null;\n    }\n    function liveBefore() {\n      return HIST.live ? HIST.live.before : null;\n    }\n    function pushAfter(label, before) {\n      if (before == null) return false;\n      const after = snap3();\n      if (after === before) return false;\n      HIST.past.push({ label: label || \"change\", before, after });\n      if (HIST.past.length > HIST.limit) HIST.past.shift();\n      HIST.future.length = 0;\n      changed();\n      return true;\n    }\n    function run(label, fn) {\n      begin(label);\n      let r;\n      try {\n        r = fn();\n      } catch (e) {\n        abort();\n        throw e;\n      }\n      commit();\n      return r;\n    }\n    function restore2(json2) {\n      let d;\n      try {\n        d = JSON.parse(json2);\n      } catch {\n        return false;\n      }\n      const want = d.units || [];\n      const byIdMap = {};\n      for (const u of scene.units) byIdMap[u.id] = u;\n      const rebuilt = want.map((snapU) => {\n        const live = byIdMap[snapU.id];\n        if (!live) return snapU;\n        for (const k of Object.keys(live)) if (!Object.prototype.hasOwnProperty.call(snapU, k)) delete live[k];\n        for (const k of Object.keys(snapU)) live[k] = snapU[k];\n        return live;\n      });\n      scene.units.length = 0;\n      for (const u of rebuilt) scene.units.push(u);\n      if (d.workshop) scene.workshop = d.workshop;\n      else delete scene.workshop;\n      scene.selectedId = d.selectedId;\n      if (d.room) scene.room = d.room;\n      if (d.kitchen) scene.kitchen = d.kitchen;\n      scene.activeRun = d.activeRun;\n      scene.cues = null;\n      syncRoom(scene.units);\n      if (!scene.workshop) resolveFinishes(scene.units, scene.kitchen);\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function clear() {\n      HIST.past.length = 0;\n      HIST.future.length = 0;\n      HIST.live = null;\n      changed();\n    }\n    function canUndo() {\n      return HIST.past.length > 0;\n    }\n    function canRedo() {\n      return HIST.future.length > 0;\n    }\n    function undo() {\n      if (!HIST.past.length) {\n        ctx.cue(\"Nothing to undo\");\n        return false;\n      }\n      const e = HIST.past.pop();\n      HIST.future.push(e);\n      restore2(e.before);\n      if (ctx.view && ctx.view.afterHistory) ctx.view.afterHistory(e, \"undo\");\n      ctx.cue(\"Undone: \" + e.label);\n      changed();\n      return true;\n    }\n    function redo() {\n      if (!HIST.future.length) {\n        ctx.cue(\"Nothing to redo\");\n        return false;\n      }\n      const e = HIST.future.pop();\n      HIST.past.push(e);\n      restore2(e.after);\n      if (ctx.view && ctx.view.afterHistory) ctx.view.afterHistory(e, \"redo\");\n      ctx.cue(\"Redone: \" + e.label);\n      changed();\n      return true;\n    }\n    const hist = {\n      snap: snap3,\n      begin,\n      commit,\n      abort,\n      liveBefore,\n      pushAfter,\n      run,\n      restore: restore2,\n      undo,\n      redo,\n      canUndo,\n      canRedo,\n      clear,\n      depth: () => ({ past: HIST.past.length, future: HIST.future.length }),\n      labels: () => HIST.past.map((e) => e.label),\n      /* \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043A\u043D\u043E\u043F\u043E\u043A: \u00ABUndo <\u0447\u0442\u043E>\u00BB / \u00ABRedo <\u0447\u0442\u043E>\u00BB (27 syncUndoUI) */\n      undoLabel: () => HIST.past.length ? HIST.past[HIST.past.length - 1].label : null,\n      redoLabel: () => HIST.future.length ? HIST.future[HIST.future.length - 1].label : null,\n      /* \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A \u043F\u0430\u0440\u0438\u0442\u0435\u0442\u0430: \u0441\u0430\u043C\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 */\n      raw: () => HIST\n    };\n    ctx.hist = hist;\n    return hist;\n  }\n\n  // v2/src/interact/math.js\n  function mMul2(a, b) {\n    const o = new Array(16);\n    for (let r = 0; r < 4; r++) for (let c = 0; c < 4; c++) {\n      o[r * 4 + c] = a[r * 4] * b[c] + a[r * 4 + 1] * b[4 + c] + a[r * 4 + 2] * b[8 + c] + a[r * 4 + 3] * b[12 + c];\n    }\n    return o;\n  }\n  function mRotY2(t) {\n    const c = Math.cos(t), s = Math.sin(t);\n    return [c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1];\n  }\n  function mRotX2(t) {\n    const c = Math.cos(t), s = Math.sin(t);\n    return [1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1];\n  }\n  function rotMat2(yaw, pitch) {\n    return mMul2(mRotY2(yaw), mRotX2(pitch));\n  }\n  function applyR(m, v) {\n    return [\n      m[0] * v[0] + m[4] * v[1] + m[8] * v[2],\n      m[1] * v[0] + m[5] * v[1] + m[9] * v[2],\n      m[2] * v[0] + m[6] * v[1] + m[10] * v[2]\n    ];\n  }\n  function applyRT2(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[4] * v[0] + m[5] * v[1] + m[6] * v[2],\n      m[8] * v[0] + m[9] * v[1] + m[10] * v[2]\n    ];\n  }\n  function rayAABB(ray, B) {\n    let t0 = -Infinity, t1 = Infinity;\n    const lo = [B.x0, B.y0, B.z0], hi = [B.x1, B.y1, B.z1];\n    for (let i = 0; i < 3; i++) {\n      const o = ray.o[i], d = ray.d[i];\n      if (Math.abs(d) < 1e-9) {\n        if (o < lo[i] || o > hi[i]) return null;\n        continue;\n      }\n      let ta = (lo[i] - o) / d, tb = (hi[i] - o) / d;\n      if (ta > tb) {\n        const s = ta;\n        ta = tb;\n        tb = s;\n      }\n      if (ta > t0) t0 = ta;\n      if (tb < t1) t1 = tb;\n      if (t0 > t1) return null;\n    }\n    return t1 < 0 ? null : t0 >= 0 ? t0 : t1;\n  }\n\n  // v2/src/interact/view.js\n  var PLUS_GAIN = 1.7;\n  function installView(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    const zc = (z) => scene.pivot ? clampPivotZoom(z) : clampZoom(z);\n    const zMinNow = () => scene.pivot ? PIVOT_ZOOM_MIN : ZOOM.min;\n    function zoomStatus() {\n      if (scene.pivot) {\n        const c = ctx.cam();\n        if (c && c.atMin) return \"Zoomed in as far as it goes\";\n        return scene.zoom >= ZOOM.max - 1e-6 && !canOutPast() ? \"Zoomed out as far as it goes\" : scene.zoom < 1 ? \"Zoomed in\" : \"Zoomed out\";\n      }\n      const z = clampZoom(scene.zoom);\n      if (Math.abs(z - 1) < 0.02) return \"Whole kitchen in view\";\n      if (z <= ZOOM.min + 1e-6) return \"Zoomed in as far as it goes\";\n      if (z >= ZOOM.max - 1e-6) return \"Zoomed out as far as it goes\";\n      return z < 1 ? \"Zoomed in\" : \"Zoomed out\";\n    }\n    function atMin() {\n      const c = ctx.cam();\n      return !!(c && c.atMin);\n    }\n    function holdCamera() {\n      ctx.frame();\n      if (scene.camHold) return scene.camHold;\n      const c = ctx.cam();\n      if (!c) return null;\n      scene.camHold = { cx: c.cx, cy: c.cy, cz: c.cz, dist: c.dist, atMin: c.atMin };\n      return scene.camHold;\n    }\n    function sizeGestureActive() {\n      return !!st.sizeDrag || !!st.handleDrag;\n    }\n    function releaseCamera() {\n      if (sizeGestureActive()) return;\n      scene.camHold = null;\n    }\n    function panBy2(dx, dy) {\n      scene.panX = (scene.panX || 0) + dx;\n      scene.panY = (scene.panY || 0) + dy;\n      const h = scene.camHold;\n      if (h) {\n        const w = applyRT2(rotMat2(scene.yaw, clampPitch(scene.pitch)), [dx, dy, 0]);\n        scene.camHold = Object.assign({}, h, { cx: h.cx + w[0], cy: h.cy + w[1], cz: h.cz + w[2] });\n      }\n      ctx.frame();\n    }\n    function pivotOn(p) {\n      if (!p || !p.every(Number.isFinite) || sizeGestureActive() || scene.camHold) return false;\n      if (scene.pivot && Math.hypot(p[0] - scene.pivot.p[0], p[1] - scene.pivot.p[1], p[2] - scene.pivot.p[2]) < 0.5) return true;\n      const c = ctx.cam();\n      if (!c || !c.eye) return false;\n      const q = applyR(c.rot, [c.eye[0] - p[0], c.eye[1] - p[1], c.eye[2] - p[2]]);\n      if (!(q[2] > 1)) return false;\n      const z = clampPivotZoom(scene.zoom);\n      scene.pivot = { p: p.slice(), k: q[2] / z, len: Math.hypot(q[0], q[1], q[2]) };\n      scene.panX = q[0];\n      scene.panY = q[1];\n      scene.zoom = z;\n      ctx.frame();\n      return true;\n    }\n    function pivotOff() {\n      if (scene.pivot) scene.pivot = null;\n    }\n    const PASS_ROOM = 400;\n    function passBeyond(p) {\n      const c = ctx.cam();\n      if (!p || !c || !c.eye) return null;\n      const v = [p[0] - c.eye[0], p[1] - c.eye[1], p[2] - c.eye[2]], L = Math.hypot(v[0], v[1], v[2]);\n      if (!(L > 1)) return null;\n      const dir = [v[0] / L, v[1] / L, v[2] / L], iv = [];\n      const G = NEAR_GAP, WT3 = 40, env2 = [];\n      for (const u of scene.units || []) {\n        if (!u || !(u.type === \"island\" || (u.family === \"base\" || u.family === \"corner\") && !isTall(u))) continue;\n        const A = unitAABB(u);\n        env2.push({ o: [A.x0 - G, A.y0 - G, A.z0 - G], u: [[1, 0, 0], [0, 1, 0], [0, 0, 1]], L: [A.x1 - A.x0 + 2 * G, A.y1 - A.y0 + 2 * G + WT3, A.z1 - A.z0 + 2 * G], pass: true, guard: true });\n      }\n      for (const B of nearBoxes(scene.units || []).concat(env2)) {\n        const d = [c.eye[0] - B.o[0], c.eye[1] - B.o[1], c.eye[2] - B.o[2]];\n        let t0 = -Infinity, t1 = Infinity;\n        for (let k = 0; k < 3 && t0 <= t1; k++) {\n          const ax = B.u[k], p0 = d[0] * ax[0] + d[1] * ax[1] + d[2] * ax[2], w = dir[0] * ax[0] + dir[1] * ax[1] + dir[2] * ax[2];\n          if (Math.abs(w) < 1e-12) {\n            if (p0 < 0 || p0 > B.L[k]) t0 = Infinity;\n            continue;\n          }\n          let a = -p0 / w, b = (B.L[k] - p0) / w;\n          if (a > b) {\n            const x = a;\n            a = b;\n            b = x;\n          }\n          if (a > t0) t0 = a;\n          if (b < t1) t1 = b;\n        }\n        if (t0 <= t1 && t1 > 0) iv.push({ t0, t1, pass: !!B.pass, guard: !!B.guard });\n      }\n      let lo = L, hi = L, on = false, grew = true;\n      while (grew) {\n        grew = false;\n        for (const s of iv) if (s.pass && s.t0 <= hi + 1 && s.t1 >= lo - 1 && (s.t0 < lo - 1e-6 || s.t1 > hi + 1e-6 || !on)) {\n          lo = Math.min(lo, s.t0);\n          hi = Math.max(hi, s.t1);\n          on = true;\n          grew = true;\n        }\n      }\n      if (!on) return null;\n      if (iv.some((s) => !s.pass && s.t0 < hi && s.t1 > lo)) return null;\n      let next = Infinity, board = Infinity;\n      for (const s of iv) if (s.t0 > hi) {\n        if (s.t0 < next) next = s.t0;\n        if (!s.guard && s.t0 < board) board = s.t0;\n      }\n      if (!(next - hi >= PASS_ROOM) || !Number.isFinite(board)) return null;\n      return [c.eye[0] + dir[0] * board, c.eye[1] + dir[1] * board, c.eye[2] + dir[2] * board];\n    }\n    function passOn() {\n      if (!scene.pivot || !atMin()) return false;\n      const q = passBeyond(scene.pivot.p);\n      if (!q) return false;\n      const was = { pivot: scene.pivot, zoom: scene.zoom, panX: scene.panX, panY: scene.panY };\n      if (pivotOn(q) && !atMin()) return true;\n      scene.pivot = was.pivot;\n      scene.zoom = was.zoom;\n      scene.panX = was.panX;\n      scene.panY = was.panY;\n      ctx.frame();\n      return false;\n    }\n    function kitchenScale() {\n      const F = scene.frame || (ctx.render && ctx.render.frameOf ? ctx.render.frameOf(scene.units) : null), c = ctx.cam();\n      if (!F || !(F.r > 0)) return 0;\n      const half = c && c.fitHalf > 0 ? c.fitHalf : Math.min(FOVY / 2, Math.atan(Math.tan(FOVY / 2) * (c && c.aspect || 1)));\n      return F.r / Math.sin(half);\n    }\n    function outPastLen(f) {\n      const P2 = scene.pivot;\n      if (!P2 || !(P2.k > 0) || !(f > 1)) return 0;\n      const z0 = clampPivotZoom(scene.zoom), want = z0 * f;\n      if (!(want > ZOOM.max + 1e-9)) return 0;\n      const K0 = kitchenScale();\n      if (!(P2.k * ZOOM.max < K0)) return 0;\n      const top = K0 * ZOOM.max, d0 = P2.k * z0, d1 = Math.min(P2.k * want, top);\n      return d1 > d0 + 1e-6 ? d1 : 0;\n    }\n    function outPast(f) {\n      const P2 = scene.pivot, d1 = outPastLen(f);\n      if (!d1) return false;\n      const g2 = d1 / (P2.k * clampPivotZoom(scene.zoom));\n      P2.k = d1 / ZOOM.max;\n      scene.zoom = ZOOM.max;\n      scene.panX = (scene.panX || 0) * g2;\n      scene.panY = (scene.panY || 0) * g2;\n      return true;\n    }\n    const canOutPast = () => outPastLen(ZOOM.stepMax) > 0;\n    function normPivot() {\n      const P2 = scene.pivot;\n      if (!P2 || !(P2.k > 0) || !(scene.zoom < ZOOM.min)) return;\n      P2.k = P2.k * scene.zoom / ZOOM.min;\n      scene.zoom = ZOOM.min;\n    }\n    function bakePivot() {\n      if (!scene.pivot) return;\n      const c = ctx.cam();\n      if (!c || !(c.pivotScale > 0) || !(Math.abs(c.pivotScale - 1) > 1e-9)) return;\n      const s = c.pivotScale;\n      scene.zoom = clampPivotZoom(scene.zoom * s);\n      scene.panX = (scene.panX || 0) * s;\n      scene.panY = (scene.panY || 0) * s;\n      normPivot();\n      ctx.frame();\n    }\n    function orbitStart() {\n      if (sizeGestureActive() || scene.camHold || !ctx.worldToNdc || !ctx.rayFromNdc) return;\n      try {\n        orbitAim();\n      } catch (e) {\n      }\n    }\n    function orbitAim() {\n      st.orbitSight = void 0;\n      if (!scene.pivot && !atMin() && !sameView(st.plusStop)) return;\n      if (scene.pivot) {\n        const nd = ctx.worldToNdc(scene.pivot.p), cz = ctx.worldClipZ ? ctx.worldClipZ(scene.pivot.p) : 0;\n        if (nd && cz !== null && cz > -1 && cz < 1 && Math.abs(nd[0]) <= 1 && Math.abs(nd[1]) <= 1) return;\n      }\n      const a = centreAnchor();\n      if (a && a.on) pivotOn(a.p);\n    }\n    const CLOSE_MM = 600;\n    function orbitGuard(prev) {\n      if (!scene.pivot || scene.camHold) return;\n      let c = ctx.cam();\n      if (!c) return;\n      const Lnow = Math.hypot(scene.panX || 0, scene.panY || 0, c.dist / (c.pivotScale || 1));\n      const close = Lnow <= CLOSE_MM;\n      if (close && c.pivotScale > 1 + 1e-9) {\n        const L0 = Math.hypot(scene.panX || 0, scene.panY || 0, c.dist / c.pivotScale), out = L0 * c.pivotScale;\n        if (prev && out - L0 > Math.max(60, 0.5 * L0)) {\n          scene.yaw = prev.yaw;\n          scene.pitch = prev.pitch;\n          ctx.frame();\n          ctx.cue(\"Zoom out to turn further round this point\");\n          return;\n        }\n      }\n      if (close && prev && c.pivotSight === false && st.orbitSight !== false) {\n        scene.yaw = prev.yaw;\n        scene.pitch = prev.pitch;\n        ctx.frame();\n        ctx.cue(\"Zoom out to turn further round this point\");\n        return;\n      }\n      bakePivot();\n      c = ctx.cam();\n      if (c) st.orbitSight = c.pivotSight;\n      if (!close || !c || c.pivotBlock == null) return;\n      const L = Math.hypot(scene.panX || 0, scene.panY || 0, c.dist);\n      if (!(c.pivotBlock < L - 0.5)) return;\n      const s = Math.max(c.pivotMin || 0, c.pivotBlock) / L;\n      scene.zoom = clampPivotZoom(scene.zoom * s);\n      scene.panX = (scene.panX || 0) * s;\n      scene.panY = (scene.panY || 0) * s;\n      normPivot();\n      ctx.frame();\n    }\n    function dolly(f) {\n      if (!scene.pivot || sizeGestureActive()) return false;\n      releaseCamera();\n      if (outPast(f)) {\n        normPivot();\n        ctx.frame();\n        bakePivot();\n        ctx.changed(\"zoom\");\n        return true;\n      }\n      const z0 = scene.zoom, z1 = clampPivotZoom(z0 * f), g2 = z1 / z0;\n      scene.zoom = z1;\n      scene.panX = (scene.panX || 0) * g2;\n      scene.panY = (scene.panY || 0) * g2;\n      normPivot();\n      ctx.frame();\n      bakePivot();\n      ctx.changed(\"zoom\");\n      return true;\n    }\n    function setZoom(z, why) {\n      if (sizeGestureActive()) return zc(scene.zoom);\n      releaseCamera();\n      const before = zc(scene.zoom);\n      scene.zoom = zc(z);\n      normPivot();\n      ctx.frame();\n      bakePivot();\n      ctx.changed(\"zoom\");\n      if (why && (Math.abs(scene.zoom - before) < 1e-9 || atMin())) {\n        ctx.cue(scene.zoom >= ZOOM.max ? \"Zoomed out as far as it goes\" : \"Zoomed in as far as it goes\");\n      } else {\n        ctx.cue(zoomStatus());\n      }\n      return scene.zoom;\n    }\n    function zoomButtons() {\n      const z = zc(scene.zoom);\n      const wheelMin = z <= zMinNow() + 1e-9 || atMin();\n      let inDisabled;\n      if (scene.pivot || !moved() && atMin() && z > ZOOM.min + 1e-9) inDisabled = sameView(st.plusStop) || !centreCanGo();\n      else inDisabled = wheelMin || atViewMin();\n      return { outDisabled: z >= ZOOM.max - 1e-9 && !(scene.pivot && canOutPast()), inDisabled, atMin: wheelMin };\n    }\n    function centreClient() {\n      const r = ctx.liveRect ? ctx.liveRect() : null;\n      if (!r || !(r.width > 0) || !(r.height > 0)) return null;\n      const nd = pictureCentreNdc(ctx.cam ? ctx.cam() : null);\n      return { x: r.left + (nd[0] + 1) / 2 * r.width, y: r.top + (1 - nd[1]) / 2 * r.height };\n    }\n    function centreAnchor() {\n      const c = centreClient();\n      return c ? wheelAnchor(c.x, c.y) : null;\n    }\n    function plusFloor(a) {\n      if (eyeTo(a.p) > VIEW_MIN_MM + 1) return VIEW_MIN_MM;\n      const c = ctx.cam();\n      return scene.pivot && c && c.pivotMin != null ? 0 : VIEW_MIN_MM;\n    }\n    function centreCanGo() {\n      const a = centreAnchor();\n      if (!(a && a.on)) return false;\n      const d = eyeTo(a.p);\n      if (d > VIEW_MIN_MM + 1) return true;\n      if (!scene.pivot) return false;\n      const c = ctx.cam();\n      if (!c) return false;\n      const same = Math.hypot(a.p[0] - scene.pivot.p[0], a.p[1] - scene.pivot.p[1], a.p[2] - scene.pivot.p[2]) < 0.5;\n      return same ? !c.atMin : true;\n    }\n    function eyeTo(p) {\n      const c = ctx.cam();\n      if (!c || !c.eye) return Infinity;\n      return Math.hypot(p[0] - c.eye[0], p[1] - c.eye[1], p[2] - c.eye[2]);\n    }\n    let structCache = { key: null, pts: [] };\n    function structurePts() {\n      const key = JSON.stringify(scene.units || []);\n      if (structCache.key === key) return structCache.pts;\n      const pts = [];\n      for (const u of scene.units || []) {\n        let f = null;\n        try {\n          f = unitFeatures(u);\n        } catch (e) {\n          f = null;\n        }\n        if (!f) continue;\n        for (const p of f.pts) if (/^(hinge|mounting plate|hole centre|shelf support|leg plate)/.test(p.kind)) pts.push(p.p);\n      }\n      structCache = { key, pts };\n      return pts;\n    }\n    function structureInView(near2) {\n      const c = ctx.cam();\n      if (!c) return true;\n      for (const p of near2) {\n        const dx = p[0] - c.eye[0], dy = p[1] - c.eye[1], dz = p[2] - c.eye[2];\n        if (dx * dx + dy * dy + dz * dz < 1) continue;\n        const nd = ctx.worldToNdc(p), cz = ctx.worldClipZ ? ctx.worldClipZ(p) : 0;\n        if (!(nd && cz !== null && cz > -1 && cz < 1 && Math.abs(nd[0]) < 0.85 && Math.abs(nd[1]) < 0.85)) continue;\n        const L = Math.sqrt(dx * dx + dy * dy + dz * dz), ray = { o: c.eye, d: [dx / L, dy / L, dz / L] };\n        const t = boardOnRay(ray, true);\n        if (t === null || t >= L - 3) return true;\n      }\n      return false;\n    }\n    const nearStructure = (a) => structurePts().filter((p) => Math.hypot(p[0] - a.p[0], p[1] - a.p[1], p[2] - a.p[2]) < 600);\n    const EDGE_G = 25, EDGE_MIN = 12, EDGE_INNER = 0.6;\n    function boardKeyOnRay(ray, boxes) {\n      let best = -1, bt = Infinity;\n      for (let i = 0; i < boxes.length; i++) {\n        const B = boxes[i];\n        if (B.guard) continue;\n        const d = [ray.o[0] - B.o[0], ray.o[1] - B.o[1], ray.o[2] - B.o[2]];\n        let t0 = -Infinity, t1 = Infinity;\n        for (let k = 0; k < 3 && t0 <= t1; k++) {\n          const ax = B.u[k], p0 = d[0] * ax[0] + d[1] * ax[1] + d[2] * ax[2], v = ray.d[0] * ax[0] + ray.d[1] * ax[1] + ray.d[2] * ax[2];\n          if (Math.abs(v) < 1e-12) {\n            if (p0 < 0 || p0 > B.L[k]) t0 = Infinity;\n            continue;\n          }\n          let a0 = -p0 / v, b0 = (B.L[k] - p0) / v;\n          if (a0 > b0) {\n            const x = a0;\n            a0 = b0;\n            b0 = x;\n          }\n          if (a0 > t0) t0 = a0;\n          if (b0 < t1) t1 = b0;\n        }\n        if (t0 <= t1 && t0 > 1 && t0 < bt) {\n          bt = t0;\n          best = i;\n        }\n      }\n      return best;\n    }\n    function edgeLength() {\n      if (!ctx.rayFromNdc) return EDGE_G * 2;\n      const boxes = nearBoxes(scene.units || []), g2 = [];\n      for (let j = 0; j < EDGE_G; j++) {\n        const row = [];\n        for (let i = 0; i < EDGE_G; i++) {\n          const ray = ctx.rayFromNdc(-0.96 + 1.92 * i / (EDGE_G - 1), -0.96 + 1.92 * j / (EDGE_G - 1));\n          row.push(ray ? boardKeyOnRay(ray, boxes) : -1);\n        }\n        g2.push(row);\n      }\n      const inner = (i) => Math.abs(-0.96 + 1.92 * i / (EDGE_G - 1)) <= EDGE_INNER + 1e-9;\n      let n = 0;\n      for (let j = 0; j < EDGE_G; j++) for (let i = 0; i < EDGE_G; i++) {\n        if (!inner(i) || !inner(j)) continue;\n        const k = g2[j][i];\n        if (i + 1 < EDGE_G && inner(i + 1) && k !== g2[j][i + 1] && (k >= 0 || g2[j][i + 1] >= 0)) n++;\n        if (j + 1 < EDGE_G && inner(j + 1) && k !== g2[j + 1][i] && (k >= 0 || g2[j + 1][i] >= 0)) n++;\n      }\n      return n;\n    }\n    const recognisable = () => edgeLength() >= EDGE_MIN;\n    function viewKey() {\n      return { zoom: scene.zoom, panX: scene.panX || 0, panY: scene.panY || 0, yaw: scene.yaw, pitch: scene.pitch, n: (scene.units || []).length };\n    }\n    function sameView(k) {\n      const v = viewKey();\n      return !!k && Math.abs(k.zoom - v.zoom) < 1e-9 && k.yaw === v.yaw && k.pitch === v.pitch && k.n === v.n && Math.abs(k.panX - v.panX) < 1 && Math.abs(k.panY - v.panY) < 1;\n    }\n    function atViewMin() {\n      if (sameView(st.plusStop)) return true;\n      if (!moved()) return false;\n      const a = centreAnchor();\n      return !!(a && a.on && eyeTo(a.p) <= VIEW_MIN_MM + 0.5);\n    }\n    const moved = () => !!scene.pivot || Math.abs(scene.panX || 0) > 1e-6 || Math.abs(scene.panY || 0) > 1e-6;\n    function zoomCentre(factor) {\n      if (sizeGestureActive()) return zc(scene.zoom);\n      if (factor > 1) syncOut();\n      let aimed = false;\n      if (!moved()) {\n        if (factor > 1) {\n          st.plusStop = null;\n          return setZoom(scene.zoom * factor, true);\n        }\n        if (sameView(st.plusStop)) {\n          ctx.cue(\"Zoomed in as far as it goes\");\n          return scene.zoom;\n        }\n        if (atMin()) {\n          const a0 = centreAnchor(), capD = a0 ? eyeTo(a0.p) : 0;\n          if (!(a0 && a0.on && capD > VIEW_MIN_MM + 1 && pivotOn(a0.p))) {\n            ctx.cue(\"Zoomed in as far as it goes\");\n            return scene.zoom;\n          }\n          scene.pivot.capD = capD;\n          aimed = true;\n        }\n      }\n      if (!aimed && !moved()) {\n        const z0 = scene.zoom, want2 = clampZoom(z0 * factor);\n        setZoom(want2, true);\n        if (!recognisable()) {\n          let lo = want2, hi = z0;\n          for (let i = 0; i < 12; i++) {\n            const mid = (lo + hi) / 2;\n            scene.zoom = mid;\n            ctx.frame();\n            if (recognisable()) hi = mid;\n            else lo = mid;\n          }\n          scene.zoom = hi;\n          ctx.frame();\n          ctx.changed(\"zoom\");\n          st.plusStop = viewKey();\n          ctx.cue(\"Zoomed in as far as it goes\");\n        } else st.plusStop = null;\n        return scene.zoom;\n      }\n      const a = centreAnchor();\n      if (!a) return setZoom(scene.zoom * factor, true);\n      if (factor < 1 && atViewMin()) {\n        ctx.cue(\"Zoomed in as far as it goes\");\n        return scene.zoom;\n      }\n      if (a.on && (scene.pivot || factor < 1)) pivotOn(a.p);\n      if (factor > 1 && outPastLen(factor) > 0) {\n        dolly(factor);\n        st.wheelAnchor = a;\n        ctx.cue(zoomStatus());\n        return scene.zoom;\n      }\n      const before = { zoom: scene.zoom, panX: scene.panX || 0, panY: scene.panY || 0 };\n      const onPivot = !!(scene.pivot && a.on && Math.hypot(a.p[0] - scene.pivot.p[0], a.p[1] - scene.pivot.p[1], a.p[2] - scene.pivot.p[2]) < 1e-6);\n      const k0 = scene.pivot ? scene.pivot.k : null;\n      const tryZoom = (z) => {\n        scene.zoom = before.zoom;\n        scene.panX = before.panX;\n        scene.panY = before.panY;\n        if (scene.pivot && k0 != null) scene.pivot.k = k0;\n        ctx.frame();\n        if (onPivot) dolly(z / before.zoom);\n        else {\n          setZoom(z);\n          keepAnchor(a);\n        }\n        return eyeTo(a.p);\n      };\n      const want = zc(before.zoom * factor);\n      const near2 = factor < 1 && a.on ? nearStructure(a) : null;\n      const gainNow = () => {\n        const c = ctx.cam();\n        if (!c || c.legacyDist == null) return Infinity;\n        const vd = applyRT2(c.rot, [0, 0, 1]), depth = -((a.p[0] - c.eye[0]) * vd[0] + (a.p[1] - c.eye[1]) * vd[1] + (a.p[2] - c.eye[2]) * vd[2]);\n        return depth > 1 ? (depth + (c.legacyDist - c.dist)) / depth : Infinity;\n      };\n      const floorD = plusFloor(a);\n      const fine = (dd) => dd >= floorD && (!!near2 && near2.length > 0 && structureInView(near2) || (scene.pivot ? true : gainNow() < PLUS_GAIN) && recognisable());\n      let d = tryZoom(want), held = false;\n      if (factor < 1 && a.on && !fine(d)) {\n        let lo = want, hi = before.zoom;\n        for (let i = 0; i < 14; i++) {\n          const mid = (lo + hi) / 2;\n          if (fine(tryZoom(mid))) hi = mid;\n          else lo = mid;\n        }\n        d = tryZoom(hi);\n        held = true;\n      }\n      st.plusStop = held ? viewKey() : null;\n      st.wheelAnchor = a;\n      const stuck = Math.abs(scene.zoom - before.zoom) < 1e-9 || atMin() || held;\n      ctx.cue(stuck ? factor > 1 ? scene.zoom >= ZOOM.max ? \"Zoomed out as far as it goes\" : zoomStatus() : \"Zoomed in as far as it goes\" : zoomStatus());\n      return scene.zoom;\n    }\n    function fitZoom2() {\n      const F = scene.frame || ctx.render.frameOf(scene.units);\n      if (!F || !F.ur || !F.r) return 1;\n      return clampZoom(F.ur / F.r);\n    }\n    function refit() {\n      if (sizeGestureActive()) return;\n      releaseCamera();\n      pivotOff();\n      scene.frame = ctx.render.frameOf(scene.units);\n      scene.zoom = 1;\n      scene.fitWide = true;\n      scene.panX = 0;\n      scene.panY = 0;\n      ctx.changed(\"zoom\");\n    }\n    function wantWide() {\n      st.fitWideNext = !st.fitWideNext;\n      return st.fitWideNext;\n    }\n    function fitButton() {\n      refit();\n      if (!wantWide()) {\n        scene.zoom = fitZoom2();\n        scene.fitWide = false;\n        ctx.changed(\"zoom\");\n      }\n      ctx.cue(scene.fitWide ? \"Whole room in view\" : \"Whole kitchen in view\");\n      ctx.frame();\n    }\n    function fitKitchen(quiet) {\n      refit();\n      scene.zoom = fitZoom2();\n      scene.fitWide = false;\n      st.fitWideNext = false;\n      ctx.changed(\"zoom\");\n      if (!quiet) ctx.cue(\"Whole kitchen in view\");\n      ctx.frame();\n    }\n    function fitRoom() {\n      refit();\n      scene.fitWide = true;\n      st.fitWideNext = true;\n      ctx.changed(\"zoom\");\n      ctx.cue(\"Whole room in view\");\n      ctx.frame();\n    }\n    function syncOut() {\n      if (scene.pivot) {\n        bakePivot();\n        return;\n      }\n      const c = ctx.cam();\n      if (!c || !c.atMin || scene.camHold || !(c.perZoom > 0)) return;\n      const zEff = clampZoom(c.dist / c.perZoom);\n      if (zEff > scene.zoom) scene.zoom = zEff;\n    }\n    function zoomIn() {\n      return zoomCentre(1 / ZOOM.step);\n    }\n    function zoomOut() {\n      return zoomCentre(ZOOM.step);\n    }\n    function anchorAt(x, y) {\n      return wheelAnchor(x, y);\n    }\n    function pinchBy(f, a) {\n      if (scene.pivot && a && a.on && Math.hypot(a.p[0] - scene.pivot.p[0], a.p[1] - scene.pivot.p[1], a.p[2] - scene.pivot.p[2]) < 1e-6) {\n        if (f < 1 && atMin()) {\n          if (!passOn()) return scene.zoom;\n          a.p = scene.pivot.p.slice();\n        }\n        dolly(f);\n        st.wheelAnchor = a;\n        ctx.cue(zoomStatus());\n        return scene.zoom;\n      }\n      if (f > 1 && outPastLen(f) > 0) {\n        dolly(f);\n        st.wheelAnchor = a || null;\n        ctx.cue(zoomStatus());\n        return scene.zoom;\n      }\n      return zoomAnchored(zc(scene.zoom * f), a);\n    }\n    function zoomAnchored(z, a) {\n      if (scene.pivot && a && a.on && Math.hypot(a.p[0] - scene.pivot.p[0], a.p[1] - scene.pivot.p[1], a.p[2] - scene.pivot.p[2]) < 1e-6 && scene.zoom > 0) {\n        dolly(clampPivotZoom(z) / scene.zoom);\n        st.wheelAnchor = a;\n        ctx.cue(zoomStatus());\n        return scene.zoom;\n      }\n      setZoom(z);\n      if (a) keepAnchor(a);\n      bakePivot();\n      st.wheelAnchor = a || null;\n      return scene.zoom;\n    }\n    function inCanvas(x, y) {\n      if (!Number.isFinite(x) || !Number.isFinite(y) || !ctx.liveRect) return false;\n      const r = ctx.liveRect();\n      return !!r && x >= r.left && x <= r.left + r.width && y >= r.top && y <= r.top + r.height;\n    }\n    function wheelAnchor(clientX, clientY) {\n      if (!inCanvas(clientX, clientY)) {\n        const lp = st.lastPointer;\n        if (!lp || !inCanvas(lp[0], lp[1])) return null;\n        clientX = lp[0];\n        clientY = lp[1];\n      }\n      const nd = ctx.ndcFromEvent(clientX, clientY), c = ctx.cam();\n      const ray = c ? ctx.rayFromNdc(nd[0], nd[1]) : null;\n      if (!ray) return null;\n      const onRay = (p) => {\n        const t2 = (p[0] - ray.o[0]) * ray.d[0] + (p[1] - ray.o[1]) * ray.d[1] + (p[2] - ray.o[2]) * ray.d[2];\n        return t2 > 1 ? [ray.o[0] + ray.d[0] * t2, ray.o[1] + ray.d[1] * t2, ray.o[2] + ray.d[2] * t2] : null;\n      };\n      const mp = ctx.meshPoint ? ctx.meshPoint(clientX, clientY) : null;\n      const mpr = mp ? onRay(mp) : null;\n      if (mpr) return { nd, p: mpr, on: \"mesh\", at: [clientX, clientY] };\n      const bt = boardOnRay(ray);\n      if (bt !== null && bt < (c.far || Infinity)) return { nd, p: [ray.o[0] + ray.d[0] * bt, ray.o[1] + ray.d[1] * bt, ray.o[2] + ray.d[2] * bt], on: \"board\", at: [clientX, clientY] };\n      const hit2 = ctx.pointer && ctx.pointer.hitRay ? ctx.pointer.hitRay(ray) : null;\n      if (hit2 && hit2.t < (c.far || Infinity)) return { nd, p: hit2.p, on: hit2.id, at: [clientX, clientY] };\n      const vd = applyRT2(c.rot, [0, 0, 1]);\n      const cos = -(ray.d[0] * vd[0] + ray.d[1] * vd[1] + ray.d[2] * vd[2]);\n      if (!(cos > 1e-3)) return null;\n      const t = c.dist / cos;\n      return { nd, p: [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t], on: null, at: [clientX, clientY] };\n    }\n    function boardOnRay(ray, boardsOnly) {\n      let best = null;\n      const cut = scene.viewCut || null;\n      for (const B of nearBoxes(cut ? (scene.units || []).filter((u) => cut.indexOf(u.id) < 0) : scene.units || [])) {\n        if (boardsOnly && B.guard) continue;\n        const d = [ray.o[0] - B.o[0], ray.o[1] - B.o[1], ray.o[2] - B.o[2]];\n        let t0 = -Infinity, t1 = Infinity;\n        for (let k = 0; k < 3 && t0 <= t1; k++) {\n          const ax = B.u[k], p0 = d[0] * ax[0] + d[1] * ax[1] + d[2] * ax[2], v = ray.d[0] * ax[0] + ray.d[1] * ax[1] + ray.d[2] * ax[2];\n          if (Math.abs(v) < 1e-12) {\n            if (p0 < 0 || p0 > B.L[k]) t0 = Infinity;\n            continue;\n          }\n          let a = -p0 / v, b = (B.L[k] - p0) / v;\n          if (a > b) {\n            const x = a;\n            a = b;\n            b = x;\n          }\n          if (a > t0) t0 = a;\n          if (b < t1) t1 = b;\n        }\n        if (t0 <= t1 && t0 > 1 && (best === null || t0 < best)) best = t0;\n      }\n      return best;\n    }\n    function keepAnchor(a) {\n      for (let k = 0; k < 8; k++) {\n        const c = ctx.cam();\n        if (!c) return;\n        const v = applyR(c.rot, [a.p[0] - c.cx, a.p[1] - c.cy, a.p[2] - c.cz]);\n        const depth = c.dist - v[2];\n        if (!(depth > 1)) return;\n        const ty = Math.tan((c.fovY || FOVY) / 2), tx = ty * c.aspect;\n        const ln = ndcToLens(c, a.nd[0], a.nd[1]);\n        const ex = v[0] - ln[0] * tx * depth, ey = v[1] - ln[1] * ty * depth;\n        if (!Number.isFinite(ex) || !Number.isFinite(ey)) return;\n        if (Math.abs(ex) < 1e-6 && Math.abs(ey) < 1e-6) return;\n        scene.panX = (scene.panX || 0) + ex;\n        scene.panY = (scene.panY || 0) + ey;\n        ctx.frame();\n      }\n    }\n    function wheel(deltaY, deltaMode, clientX, clientY) {\n      let dy = deltaY;\n      if (deltaMode === 1) dy *= 16;\n      else if (deltaMode === 2) dy *= 400;\n      let factor = Math.exp(dy * ZOOM.wheel);\n      factor = Math.min(ZOOM.stepMax, Math.max(1 / ZOOM.stepMax, factor));\n      const zoomingIn = factor < 1;\n      if (sizeGestureActive()) return true;\n      let anchor = wheelAnchor(clientX, clientY), aimed = false;\n      if (scene.pivot && anchor) {\n        const r = ctx.liveRect ? ctx.liveRect() : null, q = ctx.worldToNdc ? ctx.worldToNdc(scene.pivot.p) : null;\n        if (r && q && Math.hypot((q[0] - anchor.nd[0]) * r.width / 2, (q[1] - anchor.nd[1]) * r.height / 2) <= 1.5) {\n          anchor = { nd: q, p: scene.pivot.p.slice(), on: \"pivot\", at: anchor.at };\n          aimed = true;\n        }\n      }\n      const was = { pivot: scene.pivot, zoom: scene.zoom, panX: scene.panX, panY: scene.panY };\n      if (!aimed && anchor && anchor.on) aimed = pivotOn(anchor.p);\n      if (zoomingIn && atMin()) {\n        if (passOn()) {\n          aimed = true;\n          anchor = { nd: anchor ? anchor.nd : null, p: scene.pivot.p.slice(), on: \"pass\", at: anchor ? anchor.at : null };\n        } else {\n          if (scene.pivot !== was.pivot) {\n            scene.pivot = was.pivot;\n            scene.zoom = was.zoom;\n            scene.panX = was.panX;\n            scene.panY = was.panY;\n            ctx.frame();\n          }\n          return true;\n        }\n      }\n      if (!zoomingIn) syncOut();\n      const next = zc(scene.zoom * factor);\n      const past = !zoomingIn && outPastLen(factor) > 0;\n      if (Math.abs(next - zc(scene.zoom)) <= 1e-9 && !past) return zoomingIn;\n      if (aimed || past) {\n        dolly(factor);\n        st.wheelAnchor = anchor;\n        ctx.cue(zoomStatus());\n        return true;\n      }\n      setZoom(next);\n      if (anchor) keepAnchor(anchor);\n      bakePivot();\n      st.wheelAnchor = anchor;\n      return true;\n    }\n    const STEP = 0.2;\n    function rotBy(dy, dp) {\n      if (sizeGestureActive()) return;\n      releaseCamera();\n      orbitStart();\n      const prev = { yaw: scene.yaw, pitch: scene.pitch };\n      scene.yaw += dy;\n      scene.pitch = clamp4(scene.pitch + dp, -1.15, 1.15);\n      ctx.frame();\n      orbitGuard(prev);\n    }\n    function front() {\n      releaseCamera();\n      scene.yaw = DEFAULTS.yaw;\n      scene.pitch = DEFAULTS.pitch;\n      ctx.frame();\n    }\n    function rotButton(k) {\n      if (k === \"left\") rotBy(-STEP, 0);\n      else if (k === \"right\") rotBy(STEP, 0);\n      else if (k === \"up\") rotBy(0, STEP);\n      else if (k === \"down\") rotBy(0, -STEP);\n      else if (k === \"front\") front();\n    }\n    function setCam(y, p) {\n      releaseCamera();\n      scene.yaw = y;\n      scene.pitch = p;\n      ctx.frame();\n    }\n    function reframeKeepingView() {\n      const F0 = scene.frame || ctx.render.frameOf(scene.units);\n      if (scene.pivot) {\n        scene.frame = ctx.render.frameOf(scene.units);\n        releaseCamera();\n        ctx.changed(\"zoom\");\n        return;\n      }\n      const m = rotMat2(scene.yaw, scene.pitch);\n      const pr0 = applyRT2(m, [scene.panX || 0, scene.panY || 0, 0]);\n      const t0 = [F0.cx + pr0[0], F0.cy + pr0[1], F0.cz + pr0[2]];\n      const F1 = ctx.render.frameOf(scene.units);\n      scene.frame = F1;\n      const r0 = Math.max(F0.r || 0, 1), r111 = Math.max(F1.r || 0, 1);\n      const z0 = scene.zoom || 1;\n      const D2 = [t0[0] - F1.cx, t0[1] - F1.cy, t0[2] - F1.cz];\n      const cam = applyR(m, D2);\n      releaseCamera();\n      scene.panX = cam[0];\n      scene.panY = cam[1];\n      const along2 = cam[2];\n      const lc = ctx.cam();\n      if (lc && lc.dist > 0) {\n        const k = lc.dist / (r0 * z0);\n        if (k > 0) scene.zoom = clampZoom((lc.dist + along2) / (r111 * k));\n        else scene.zoom = clampZoom(z0 * (r0 / r111));\n      } else scene.zoom = clampZoom(z0 * (r0 / r111));\n      ctx.changed(\"zoom\");\n    }\n    function unitBoxPts(u) {\n      const B = unitAABB(u), pts = [];\n      for (const x of [B.x0, B.x1]) for (const y of [B.y0, B.y1]) for (const z of [B.z0, B.z1]) pts.push([x, y, z]);\n      return pts;\n    }\n    const revealMemo = /* @__PURE__ */ new WeakMap();\n    function viewNow() {\n      return {\n        zoom: scene.zoom,\n        panX: scene.panX || 0,\n        panY: scene.panY || 0,\n        yaw: scene.yaw,\n        pitch: scene.pitch,\n        frame: scene.frame || null,\n        camHold: scene.camHold ? Object.assign({}, scene.camHold) : null\n      };\n    }\n    function sameV(a, b) {\n      return !!a && !!b && Math.abs(a.zoom - b.zoom) < 1e-9 && Math.abs(a.panX - b.panX) < 0.5 && Math.abs(a.panY - b.panY) < 0.5 && a.yaw === b.yaw && a.pitch === b.pitch && a.frame === b.frame && JSON.stringify(a.camHold) === JSON.stringify(b.camHold);\n    }\n    function setV(v) {\n      scene.zoom = v.zoom;\n      scene.panX = v.panX;\n      scene.panY = v.panY;\n      scene.frame = v.frame;\n      scene.camHold = v.camHold ? Object.assign({}, v.camHold) : null;\n      ctx.frame();\n      ctx.changed(\"zoom\");\n    }\n    function afterHistory(entry, dir) {\n      const m = entry && revealMemo.get(entry);\n      if (!m) return false;\n      const now = viewNow();\n      if (dir === \"undo\" && sameV(now, m.after)) {\n        setV(m.before);\n        return true;\n      }\n      if (dir === \"redo\" && sameV(now, m.before)) {\n        setV(m.after);\n        return true;\n      }\n      return false;\n    }\n    function revealUnit(id, safe, opts) {\n      const vBefore = viewNow();\n      const u = (scene.units || []).find((v) => v.id === id);\n      if (!u || sizeGestureActive()) return { moved: false, why: u ? \"gesture\" : \"no cabinet\" };\n      const cs = ctx.canvasSize ? ctx.canvasSize() : null;\n      if (!cs || !(cs.w > 0) || !(cs.h > 0)) return { moved: false, why: \"no canvas\" };\n      const S2 = Object.assign({ l: cs.w * 0.06, r: cs.w * 0.06, t: cs.h * 0.08, b: cs.h * 0.08 }, safe || {});\n      const X0 = -1 + 2 * S2.l / cs.w, X1 = 1 - 2 * S2.r / cs.w, Y0 = -1 + 2 * S2.b / cs.h, Y1 = 1 - 2 * S2.t / cs.h;\n      if (!(X1 - X0 > 0.2) || !(Y1 - Y0 > 0.2)) return { moved: false, why: \"no free picture\" };\n      const pts = unitBoxPts(u);\n      if (!(opts && opts.withPlus === false) && u.id === scene.selectedId && ctx.quickAdd && ctx.quickAdd.free && ctx.quickAdd.worldAnchor) {\n        for (const sd of [\"left\", \"right\"]) {\n          try {\n            if (ctx.quickAdd.free(sd)) pts.push(ctx.quickAdd.worldAnchor(u, sd));\n          } catch {\n          }\n        }\n      }\n      const box3 = () => {\n        ctx.frame();\n        let x0 = Infinity, x1 = -Infinity, y0 = Infinity, y1 = -Infinity;\n        for (const p of pts) {\n          const nd = ctx.worldToNdc(p), cz = ctx.worldClipZ ? ctx.worldClipZ(p) : 0;\n          if (!nd || cz === null || !(cz > -1 && cz < 1) || !isFinite(nd[0]) || !isFinite(nd[1])) return null;\n          x0 = Math.min(x0, nd[0]);\n          x1 = Math.max(x1, nd[0]);\n          y0 = Math.min(y0, nd[1]);\n          y1 = Math.max(y1, nd[1]);\n        }\n        return { x0, x1, y0, y1 };\n      };\n      const E = 1e-3, inside = (b2) => !!b2 && b2.x0 >= X0 - E && b2.x1 <= X1 + E && b2.y0 >= Y0 - E && b2.y1 <= Y1 + E;\n      const fits2 = (b2) => !!b2 && b2.x1 - b2.x0 <= X1 - X0 && b2.y1 - b2.y0 <= Y1 - Y0;\n      const c0 = ctx.cam(), eye0 = c0 && c0.eye ? c0.eye.slice() : null, z0 = scene.zoom;\n      let trace = null;\n      const done2 = (how) => {\n        const c = ctx.cam();\n        ctx.changed(\"zoom\");\n        if (how !== \"kept\" && ctx.hist && ctx.hist.raw) {\n          const H2 = ctx.hist.raw(), e = H2.past[H2.past.length - 1];\n          if (e) revealMemo.set(e, { before: vBefore, after: viewNow() });\n        }\n        st.lastReveal = {\n          id,\n          how,\n          moved: how !== \"kept\",\n          eyeMoved: eye0 && c && c.eye ? Math.round(Math.hypot(c.eye[0] - eye0[0], c.eye[1] - eye0[1], c.eye[2] - eye0[2])) : null,\n          zoom0: z0,\n          zoom: scene.zoom,\n          safe: [X0, X1, Y0, Y1],\n          box: box3(),\n          box0,\n          cv: [cs.w, cs.h],\n          trace\n        };\n        return st.lastReveal;\n      };\n      let b = box3();\n      const box0 = b ? { x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1 } : null;\n      const TOL = 12, tx = 2 * TOL / cs.w, ty = 2 * TOL / cs.h;\n      const nearlyIn = (q) => !!q && q.x0 >= Math.max(-1, X0 - tx) && q.x1 <= Math.min(1, X1 + tx) && q.y0 >= Math.max(-1, Y0 - ty) && q.y1 <= Math.min(1, Y1 + ty);\n      const onCv = (q) => !!q && q.x0 >= -1 && q.x1 <= 1 && q.y0 >= -1 && q.y1 <= 1;\n      if (inside(b) || nearlyIn(b) || opts && opts.onCanvas && onCv(b)) return done2(\"kept\");\n      const slide = () => {\n        for (let k = 0; k < 8; k++) {\n          b = box3();\n          if (!b || inside(b) || !fits2(b)) return;\n          const want = [b.x0 < X0 ? X0 - b.x0 : b.x1 > X1 ? X1 - b.x1 : 0, b.y0 < Y0 ? Y0 - b.y0 : b.y1 > Y1 ? Y1 - b.y1 : 0];\n          const c = ctx.cam(), step = Math.max(1, (c ? c.dist : 3e3) * 0.01);\n          const mid = () => {\n            const q = box3();\n            return q ? [(q.x0 + q.x1) / 2, (q.y0 + q.y1) / 2] : null;\n          };\n          const m0 = mid();\n          if (!m0) return;\n          panBy2(step, 0);\n          const mx = mid();\n          panBy2(-step, 0);\n          panBy2(0, step);\n          const my = mid();\n          panBy2(0, -step);\n          if (!mx || !my) return;\n          const jx = (mx[0] - m0[0]) / step, jy = (my[1] - m0[1]) / step;\n          if (!(Math.abs(jx) > 1e-9) || !(Math.abs(jy) > 1e-9)) return;\n          panBy2(want[0] ? want[0] * 1.0005 / jx : 0, want[1] ? want[1] * 1.0005 / jy : 0);\n        }\n      };\n      if (b && fits2(b)) {\n        slide();\n        if (inside(box3())) return done2(\"slid\");\n      }\n      const F0 = scene.frame || ctx.render.frameOf(scene.units), F1 = ctx.render.frameOf(scene.units);\n      let zFit = F0 && F1 && F0.r > 0 && F1.ur > 0 ? F1.ur / F0.r : fitZoom2();\n      if (scene.pivot && scene.pivot.k > 0 && F1 && F1.ur > 0) {\n        const cc = ctx.cam(), half = cc && cc.fitHalf > 0 ? cc.fitHalf : Math.min(FOVY / 2, Math.atan(Math.tan(FOVY / 2) * (cc && cc.aspect || 1)));\n        zFit = F1.ur / Math.sin(half) / scene.pivot.k;\n      }\n      const zMax = clampZoom(Math.max(z0, zFit));\n      const P0 = { panX: scene.panX || 0, panY: scene.panY || 0, hold: scene.camHold ? Object.assign({}, scene.camHold) : null };\n      const setZ = (z) => {\n        scene.panX = P0.panX;\n        scene.panY = P0.panY;\n        scene.camHold = P0.hold ? Object.assign({}, P0.hold, { dist: P0.hold.dist * z / z0 }) : null;\n        scene.zoom = clampZoom(z);\n        ctx.frame();\n      };\n      trace = [];\n      const ok2 = (z) => {\n        setZ(z);\n        const b0 = box3();\n        slide();\n        const b1 = box3();\n        const r = inside(b1);\n        if (trace.length < 24) {\n          const c = ctx.cam();\n          trace.push([Math.round(z * 1e3) / 1e3, b0 ? \"b\" : \"null\", b1 ? [b1.x0, b1.x1, b1.y0, b1.y1].map((v) => Math.round(v * 100) / 100).join(\",\") : \"null\", r ? 1 : 0, c ? Math.round(c.dist) : null]);\n        }\n        return r;\n      };\n      if (ok2(zMax)) {\n        let lo = z0, hi = zMax;\n        for (let i = 0; i < 14; i++) {\n          const mid = (lo + hi) / 2;\n          if (ok2(mid)) hi = mid;\n          else lo = mid;\n        }\n        ok2(hi);\n        return done2(\"zoomed out\");\n      }\n      setZ(z0);\n      fitKitchen(true);\n      return done2(\"fit\");\n    }\n    function openingView() {\n      pivotOff();\n      if (scene.units && scene.units.length) {\n        scene.zoom = fitZoom2();\n        scene.fitWide = false;\n        ctx.changed(\"zoom\");\n        ctx.frame();\n      }\n    }\n    const view = {\n      zoomStatus,\n      holdCamera,\n      releaseCamera,\n      panBy: panBy2,\n      revealUnit,\n      afterHistory,\n      sizeGestureActive,\n      setZoom,\n      zoomButtons,\n      fitZoom: fitZoom2,\n      refit,\n      wantWide,\n      fitButton,\n      fitKitchen,\n      fitRoom,\n      zoomIn,\n      zoomOut,\n      wheel,\n      rotBy,\n      front,\n      rotButton,\n      setCam,\n      reframeKeepingView,\n      openingView,\n      syncOut,\n      anchorAt,\n      zoomAnchored,\n      edgeLength,\n      STEP,\n      pivotOn,\n      pivotOff,\n      orbitStart,\n      orbitGuard,\n      zoomClamp: zc,\n      pinchBy,\n      centreClient\n    };\n    ctx.view = view;\n    return view;\n  }\n\n  // v2/src/model/hardware-choice.js\n  var HARDWARE_CHOICES = Object.freeze([\"standard\", \"premium\", \"kit\"]);\n  function hardwareOf(plan) {\n    const h = plan && typeof plan.hardware === \"string\" ? plan.hardware : \"\";\n    return HARDWARE_CHOICES.includes(h) ? h : \"\";\n  }\n\n  // v2/src/interact/persist.js\n  var LS_KEY = \"ub-cabinet-lab:v1\";\n  var PROJECT_KEY = \"ub-cabinet-lab:project\";\n  var RECOVERY_KEY = \"ub-cabinet-lab:recovery\";\n  function installPersist(ctx) {\n    const scene = ctx.scene;\n    const storageOf = ctx.opts.storage || (() => null);\n    function initialScene2() {\n      setUid(1);\n      const a = newUnit(\"base\");\n      a.x = 0;\n      a.door = true;\n      const b = newUnit(\"base-drawer\");\n      b.x = a.w;\n      b.z = a.z;\n      b.door = true;\n      scene.units = [a, b];\n      scene.selectedId = a.id;\n      migrateFinishes(scene.units, scene.kitchen);\n      scene.frame = ctx.render.frameOf(scene.units);\n    }\n    function migrateRoom2() {\n      const r = scene.room;\n      if (r && r.on && r.width && r.depth) {\n        if (!r.height) r.height = ROOM_DEFAULT.height;\n        return false;\n      }\n      let needW = 0, needD = 0, needH = 0;\n      for (const v of scene.units) {\n        const fb = foot(v);\n        needW = Math.max(needW, fb.x1);\n        needD = Math.max(needD, fb.z1);\n        needH = Math.max(needH, (v.y || 0) + v.h);\n      }\n      scene.room = {\n        on: true,\n        width: clamp4(\n          Math.max(r && r.width || 0, Math.ceil((needW + 600) / 100) * 100),\n          ROOM_LIMITS.width[0],\n          ROOM_LIMITS.width[1]\n        ),\n        depth: clamp4(\n          Math.max(r && r.depth || 0, Math.ceil((needD + 900) / 100) * 100),\n          ROOM_LIMITS.depth[0],\n          ROOM_LIMITS.depth[1]\n        ),\n        height: clamp4(Math.max(\n          r && r.height || 0,\n          Math.ceil((needH + 300) / 100) * 100,\n          ROOM_DEFAULT.height\n        ), ROOM_LIMITS.height[0], ROOM_LIMITS.height[1])\n      };\n      return true;\n    }\n    function store() {\n      try {\n        return storageOf() || null;\n      } catch {\n        return null;\n      }\n    }\n    function serialize2() {\n      if (scene.workshop) return workshopDocumentOf(scene);\n      return {\n        v: 1,\n        uid: UID,\n        units: scene.units,\n        // every field, verbatim\n        room: scene.room || null,\n        kitchen: scene.kitchen || null,\n        activeRun: scene.activeRun || \"main\",\n        selectedId: scene.selectedId || null,\n        /* the buyer's choice of CNC drilling is part of the plan (review 08.10.2026): reload, another device and the\n           account bring it back; a plan that never chose is parts only (owner 25.09.2026, OWNER-SAID.md) */\n        drilling: scene.drilling === true,\n        /* the hardware the plan is bought with (model/hardware-choice.js): a complete kit from the Kitchen Cabinets pages\n           (task 1792963645529) must not come back from a reload as bare panels */\n        ...hardwareOf(scene) ? { hardware: hardwareOf(scene) } : {},\n        n: scene.units.length,\n        when: (/* @__PURE__ */ new Date()).toLocaleString(\"en-GB\", { hour12: false })\n      };\n    }\n    function saveState2() {\n      const s = store();\n      if (!s) return false;\n      try {\n        s.setItem(LS_KEY, JSON.stringify(serialize2()));\n        return true;\n      } catch {\n        return false;\n      }\n    }\n    function clearState() {\n      const s = store();\n      if (s) {\n        try {\n          s.removeItem(LS_KEY);\n        } catch {\n        }\n      }\n    }\n    function applyPlan(d, opt) {\n      if (d && (d.workshop || Array.isArray(d.units) && d.units.some((u) => u && u.type === \"workshop\"))) {\n        if (!ctx.opts.workshopAllowed) return false;\n        let runtime;\n        try {\n          runtime = workshopRuntime(d);\n        } catch {\n          return false;\n        }\n        scene.units = runtime.units;\n        scene.workshop = runtime.workshop;\n        scene.room = { on: false };\n        scene.hardwareXray = false;\n        scene.frontsSeeThrough = false;\n        scene.kitchen = { worktop: { on: false }, plinth: { on: false } };\n        scene.activeRun = \"main\";\n        scene.selectedId = scene.units[0].id;\n        scene.selPart = null;\n        scene.moveMode = false;\n        scene.sizeMode = false;\n        scene.partsMode = false;\n        scene.panMode = false;\n        scene.frame = ctx.render.frameOf(scene.units);\n        return true;\n      }\n      const allowEmpty = !!(opt && opt.empty);\n      if (!d || d.v !== 1 || !Array.isArray(d.units) || !d.units.length && !allowEmpty) return false;\n      for (let i = 0; i < d.units.length; i++) {\n        const u = d.units[i];\n        if (!u || typeof u.type !== \"string\" || !isFinite(u.w) || !isFinite(u.h)) return false;\n      }\n      delete scene.workshop;\n      scene.units = d.units;\n      scene.room = d.room || null;\n      if (d.kitchen) scene.kitchen = d.kitchen;\n      scene.activeRun = d.activeRun || \"main\";\n      scene.drilling = d.drilling === true;\n      if (hardwareOf(d)) scene.hardware = hardwareOf(d);\n      else delete scene.hardware;\n      scene.selectedId = d.selectedId || (scene.units[0] ? scene.units[0].id : null);\n      let maxN = 0;\n      for (const v of scene.units) {\n        const n = parseInt(String(v.id).replace(/\\D/g, \"\"), 10);\n        if (isFinite(n)) maxN = Math.max(maxN, n);\n      }\n      setUid(Math.max(d.uid || 0, maxN) + 0);\n      migrateFinishes(scene.units, scene.kitchen);\n      migrateRoom2();\n      syncRoom(scene.units);\n      scene.frame = ctx.render.frameOf(scene.units);\n      return true;\n    }\n    function loadState2() {\n      const s = store();\n      if (!s) return false;\n      let raw;\n      try {\n        raw = s.getItem(LS_KEY);\n      } catch {\n        return false;\n      }\n      if (!raw) return false;\n      try {\n        return applyPlan(JSON.parse(raw));\n      } catch {\n        return false;\n      }\n    }\n    function savedStamp() {\n      const s = store();\n      if (!s) return null;\n      try {\n        const d = JSON.parse(s.getItem(LS_KEY) || \"null\");\n        return d && d.v === 1 && d.units && d.units.length ? d : null;\n      } catch {\n        return null;\n      }\n    }\n    const rec = { planId: null, rev: 0, seen: null, hold: 0, tab: randomId(8), failed: false, listeners: [], cur: null };\n    function own2(id) {\n      if (!id) return null;\n      const c = rec.cur && rec.cur.planId === id ? rec.cur : null;\n      const e = entry(id);\n      if (!c) return e;\n      return e && e.tab !== rec.tab && (e.localRevision || 0) > (c.localRevision || 0) ? e : c;\n    }\n    function randomId(bytes) {\n      let out = \"\";\n      try {\n        const c = globalThis.crypto;\n        if (c && c.getRandomValues) {\n          const a = new Uint8Array(bytes);\n          c.getRandomValues(a);\n          for (const b of a) out += (b < 16 ? \"0\" : \"\") + b.toString(16);\n          return out;\n        }\n      } catch {\n      }\n      for (let i = 0; i < bytes * 2; i++) out += Math.floor(Math.random() * 16).toString(16);\n      return out;\n    }\n    const VIEW_ONLY = { explode: 1, dispX: 1, dispY: 1, dispZ: 1 };\n    function keyOf2(plan) {\n      const o = Object.assign({}, plan);\n      delete o.when;\n      delete o.n;\n      delete o.uid;\n      return JSON.stringify(o, (k, v) => VIEW_ONLY[k] ? void 0 : v);\n    }\n    function readJ2(k) {\n      const s = store();\n      if (!s) return null;\n      try {\n        return JSON.parse(s.getItem(k) || \"null\");\n      } catch {\n        return null;\n      }\n    }\n    function writeJ2(k, v) {\n      const s = store();\n      if (!s) return false;\n      try {\n        s.setItem(k, JSON.stringify(v));\n        return true;\n      } catch {\n        return false;\n      }\n    }\n    function index() {\n      const d = readJ2(RECOVERY_KEY);\n      return d && d.v === 1 && Array.isArray(d.plans) ? d : { v: 1, active: null, plans: [] };\n    }\n    function entry(id) {\n      const e = id ? readJ2(RECOVERY_KEY + \":\" + id) : null;\n      return e && e.schemaVersion === 1 && e.plan ? e : null;\n    }\n    function pkNow() {\n      const v = readJ2(PROJECT_KEY);\n      return v && typeof v.token === \"string\" ? { token: v.token, planId: typeof v.planId === \"string\" ? v.planId : null } : null;\n    }\n    function tokenNow() {\n      const v = pkNow();\n      return v ? v.token : null;\n    }\n    function setToken(t) {\n      const s = store();\n      if (!s) return;\n      try {\n        if (t) s.setItem(PROJECT_KEY, JSON.stringify(rec.planId ? { token: t, planId: rec.planId } : { token: t }));\n        else s.removeItem(PROJECT_KEY);\n      } catch {\n      }\n    }\n    function tell(kind, extra) {\n      for (const f of rec.listeners) {\n        try {\n          f(Object.assign({ kind }, extra || {}));\n        } catch {\n        }\n      }\n    }\n    function putIndex(id, e, makeActive) {\n      const ix = index();\n      ix.plans = ix.plans.filter((p) => p && p.id !== id);\n      if (e) ix.plans.unshift({ id, at: e.savedAt, n: e.plan.units.length, token: e.projectToken || null });\n      if (makeActive !== void 0) ix.active = makeActive;\n      return writeJ2(RECOVERY_KEY, ix);\n    }\n    function planNow() {\n      const raw = ctx.hist && ctx.hist.raw ? ctx.hist.raw() : null;\n      const st = ctx.st || {};\n      if (raw && raw.live) {\n        try {\n          const b = JSON.parse(raw.live.before);\n          const units = b.units || [];\n          return {\n            v: 1,\n            uid: UID,\n            units,\n            room: b.room || null,\n            kitchen: b.kitchen || null,\n            activeRun: b.activeRun || \"main\",\n            selectedId: b.selectedId || null,\n            drilling: scene.drilling === true,\n            n: units.length,\n            when: (/* @__PURE__ */ new Date()).toLocaleString(\"en-GB\", { hour12: false })\n          };\n        } catch {\n          return null;\n        }\n      }\n      if (st.drag || st.handleDrag || st.partDrag || st.sizeDrag) return null;\n      return serialize2();\n    }\n    function checkpoint(reason) {\n      if (rec.hold > 0) return { ok: false, why: \"hold\" };\n      const plan = planNow();\n      if (!plan) return { ok: false, why: \"gesture\" };\n      const key = keyOf2(plan);\n      if (key === rec.seen) return { ok: true, same: true, rev: rec.rev };\n      const s = store();\n      if (!rec.planId) {\n        rec.planId = randomId(8);\n        rec.rev = 0;\n        rec.synced = 0;\n        rec.serverRev = null;\n        rec.cur = null;\n      }\n      const there = entry(rec.planId);\n      let forked = false;\n      if (there && there.tab !== rec.tab && there.localRevision > rec.rev) {\n        rec.planId = randomId(8);\n        rec.rev = 0;\n        rec.synced = 0;\n        rec.serverRev = null;\n        rec.token = null;\n        rec.cur = null;\n        forked = true;\n      }\n      const prev = forked ? null : own2(rec.planId);\n      const pkv = pkNow(), pk = pkv ? pkv.token : null;\n      const ours = !!pkv && (pkv.planId ? pkv.planId === rec.planId : !rec.token);\n      const token = forked ? null : pk && pk !== rec.pkSeen && ours ? pk : rec.token || null;\n      const e = {\n        schemaVersion: 1,\n        planId: rec.planId,\n        localRevision: rec.rev + 1,\n        syncedRevision: rec.synced || 0,\n        acknowledgedServerRevision: rec.serverRev == null ? null : rec.serverRev,\n        projectToken: token || null,\n        tab: rec.tab,\n        savedAt: (/* @__PURE__ */ new Date()).toISOString(),\n        reason: reason || \"change\",\n        plan,\n        /* the plan's key for the server (ui/account.js client_plan_id): a save that lost its token still goes into this\n           plan's project; a new plan, a fork and a detached plan (409) get a new key */\n        planKey: prev && prev.planKey || randomId(8)\n      };\n      if (!forked && there && there.unconfirmedToken && !token) e.unconfirmedToken = there.unconfirmedToken;\n      const kept = !!s && writeJ2(RECOVERY_KEY + \":\" + rec.planId, e) && putIndex(rec.planId, e, rec.planId);\n      rec.cur = e;\n      if (forked) setToken(null);\n      rec.rev = e.localRevision;\n      rec.token = token || null;\n      rec.pkSeen = forked ? null : pk;\n      rec.seen = key;\n      if (!kept) {\n        rec.failed = true;\n        tell(\"failed\", { why: s ? \"storage full or blocked\" : \"no storage\" });\n        return { ok: false, why: s ? \"storage\" : \"no storage\", inTab: true, rev: rec.rev, planId: rec.planId };\n      }\n      rec.failed = false;\n      tell(\"saved\", { rev: rec.rev, planId: rec.planId, forked, reason: e.reason });\n      return { ok: true, rev: rec.rev, planId: rec.planId, forked };\n    }\n    function recover() {\n      const ix = index();\n      const e = entry(ix.active);\n      if (!e) {\n        const s = store();\n        let legacy = null;\n        try {\n          legacy = s && !readJ2(RECOVERY_KEY) ? JSON.parse(s.getItem(LS_KEY) || \"null\") : null;\n        } catch {\n          legacy = null;\n        }\n        if (legacy && applyPlan(legacy)) {\n          const unconfirmed = tokenNow();\n          setToken(null);\n          rec.token = null;\n          rec.pkSeen = null;\n          rec.seen = null;\n          const r = checkpoint(\"from Save plan\");\n          if (r.ok && unconfirmed) {\n            const e2 = own2(rec.planId);\n            if (e2) {\n              e2.unconfirmedToken = unconfirmed;\n              rec.cur = e2;\n              writeJ2(RECOVERY_KEY + \":\" + rec.planId, e2);\n            }\n          }\n          return { ok: true, legacy: true, planId: rec.planId, saved: !!r.ok, n: scene.units.length, unconfirmedToken: unconfirmed || null };\n        }\n        rec.seen = keyOf2(serialize2());\n        rec.token = null;\n        rec.pkSeen = tokenNow();\n        return { ok: false, why: \"nothing saved\", token: rec.pkSeen || null };\n      }\n      if (!applyPlan(e.plan, { empty: true })) {\n        rec.seen = keyOf2(serialize2());\n        rec.token = null;\n        rec.pkSeen = tokenNow();\n        return { ok: false, why: \"unreadable\" };\n      }\n      adopt(e);\n      return { ok: true, planId: e.planId, rev: e.localRevision, n: e.plan.units.length, savedAt: e.savedAt };\n    }\n    function adopt(e) {\n      rec.cur = e;\n      rec.planId = e.planId;\n      rec.rev = e.localRevision || 0;\n      rec.synced = e.syncedRevision || 0;\n      rec.serverRev = e.acknowledgedServerRevision == null ? null : e.acknowledgedServerRevision;\n      rec.token = e.projectToken || null;\n      rec.seen = keyOf2(e.plan);\n      setToken(rec.token);\n      rec.pkSeen = rec.token;\n    }\n    function forget() {\n      rec.planId = null;\n      rec.rev = 0;\n      rec.synced = 0;\n      rec.serverRev = null;\n      rec.token = null;\n      rec.cur = null;\n      rec.pkSeen = tokenNow();\n      rec.seen = keyOf2(serialize2());\n      const ix = index();\n      ix.active = null;\n      writeJ2(RECOVERY_KEY, ix);\n    }\n    function acknowledge(planId, localRev, serverRev, token) {\n      const e = own2(planId);\n      if (!e) return false;\n      if (localRev < (e.syncedRevision || 0)) return false;\n      if (serverRev != null && e.acknowledgedServerRevision != null && serverRev < e.acknowledgedServerRevision) return false;\n      e.syncedRevision = localRev;\n      if (serverRev != null) e.acknowledgedServerRevision = serverRev;\n      if (token) e.projectToken = token;\n      writeJ2(RECOVERY_KEY + \":\" + planId, e);\n      putIndex(planId, e);\n      if (planId === rec.planId) {\n        rec.cur = e;\n        rec.synced = localRev;\n        if (serverRev != null) rec.serverRev = serverRev;\n        if (token) {\n          rec.token = token;\n          setToken(token);\n        }\n      }\n      return true;\n    }\n    function openPlan(plan, meta) {\n      const m = meta || {};\n      const ix = index();\n      const mine = ix.plans.map((p) => entry(p.id)).find((e2) => e2 && m.token && e2.projectToken === m.token);\n      if (mine && (mine.localRevision || 0) > (mine.syncedRevision || 0)) {\n        if (!applyPlan(mine.plan, { empty: true })) return { ok: false, why: \"unreadable\" };\n        adopt(mine);\n        putIndex(mine.planId, mine, mine.planId);\n        return { ok: true, local: true, planId: mine.planId };\n      }\n      if (!applyPlan(plan, { empty: true })) return { ok: false, why: \"unreadable\" };\n      const id = mine ? mine.planId : randomId(8);\n      const e = {\n        schemaVersion: 1,\n        planId: id,\n        localRevision: 1,\n        syncedRevision: 1,\n        acknowledgedServerRevision: m.serverRev == null ? null : m.serverRev,\n        projectToken: m.token || null,\n        tab: rec.tab,\n        savedAt: (/* @__PURE__ */ new Date()).toISOString(),\n        reason: m.reason || \"opened\",\n        plan: serialize2(),\n        planKey: randomId(8)\n      };\n      const kept = writeJ2(RECOVERY_KEY + \":\" + id, e) && putIndex(id, e, id);\n      adopt(e);\n      rec.failed = !kept;\n      tell(kept ? \"saved\" : \"failed\", { rev: 1, planId: id, reason: e.reason, why: kept ? void 0 : \"storage full or blocked\" });\n      return { ok: true, local: false, planId: id, saved: kept };\n    }\n    function detach(planId) {\n      const e = own2(planId);\n      if (!e) return false;\n      e.projectToken = null;\n      e.acknowledgedServerRevision = null;\n      e.syncedRevision = 0;\n      e.planKey = randomId(8);\n      writeJ2(RECOVERY_KEY + \":\" + planId, e);\n      putIndex(planId, e);\n      if (planId === rec.planId) {\n        rec.cur = e;\n        rec.token = null;\n        rec.serverRev = null;\n        rec.synced = 0;\n        setToken(null);\n        rec.pkSeen = null;\n      }\n      return true;\n    }\n    function ownToken(token) {\n      if (!token || !rec.planId) return false;\n      const e = own2(rec.planId);\n      if (token !== rec.token) {\n        rec.token = token;\n        rec.serverRev = null;\n        rec.synced = 0;\n        if (e) {\n          e.projectToken = token;\n          e.acknowledgedServerRevision = null;\n          e.syncedRevision = 0;\n          rec.cur = e;\n          writeJ2(RECOVERY_KEY + \":\" + rec.planId, e);\n          putIndex(rec.planId, e);\n        }\n      }\n      setToken(token);\n      rec.pkSeen = token;\n      return true;\n    }\n    function confirmToken(planId, token, serverRev) {\n      const e = own2(planId);\n      if (!e || e.unconfirmedToken !== token) return false;\n      delete e.unconfirmedToken;\n      writeJ2(RECOVERY_KEY + \":\" + planId, e);\n      return acknowledge(planId, e.localRevision, serverRev, token);\n    }\n    function others2() {\n      return index().plans.filter((p) => p && p.id !== rec.planId);\n    }\n    function switchTo(id) {\n      const e = entry(id);\n      if (!e || !applyPlan(e.plan, { empty: true })) return { ok: false, why: \"unreadable\" };\n      adopt(e);\n      putIndex(id, e, id);\n      return { ok: true, planId: id };\n    }\n    function adoptStored(planId) {\n      if (!planId || planId !== rec.planId) return null;\n      const c = own2(planId), e = entry(planId);\n      if (!c) return null;\n      if (c.projectToken) return { token: c.projectToken, adopted: false };\n      if (!e || typeof e.projectToken !== \"string\" || !e.projectToken) return null;\n      c.projectToken = e.projectToken;\n      if (e.acknowledgedServerRevision != null) c.acknowledgedServerRevision = e.acknowledgedServerRevision;\n      if (keyOf2(e.plan) === keyOf2(c.plan) && (e.syncedRevision || 0) >= (e.localRevision || 0)) c.syncedRevision = c.localRevision;\n      writeJ2(RECOVERY_KEY + \":\" + planId, c);\n      putIndex(planId, c);\n      rec.cur = c;\n      rec.token = e.projectToken;\n      rec.synced = c.syncedRevision || 0;\n      if (e.acknowledgedServerRevision != null) rec.serverRev = e.acknowledgedServerRevision;\n      setToken(e.projectToken);\n      return { token: e.projectToken, adopted: true };\n    }\n    const recovery = {\n      checkpoint,\n      recover,\n      forget,\n      acknowledge,\n      confirmToken,\n      detach,\n      ownToken,\n      openPlan,\n      others: others2,\n      switchTo,\n      adoptStored,\n      hold() {\n        rec.hold++;\n      },\n      release() {\n        if (rec.hold > 0) rec.hold--;\n      },\n      onStatus(f) {\n        rec.listeners.push(f);\n      },\n      state() {\n        return {\n          planId: rec.planId,\n          rev: rec.rev,\n          synced: rec.synced || 0,\n          serverRev: rec.serverRev,\n          token: rec.token,\n          held: rec.hold > 0,\n          failed: rec.failed,\n          storage: !!store()\n        };\n      },\n      current() {\n        return rec.planId ? own2(rec.planId) : null;\n      },\n      /* the plan as it stands now, through the one serializer (mid-gesture: the plan before the gesture) - for a\n         downloaded copy when the browser refuses to keep it */\n      planNow() {\n        return planNow() || serialize2();\n      },\n      keyOf: keyOf2\n    };\n    function saveNote() {\n      const d = savedStamp();\n      return !store() ? \"This browser will not let the planner save anything.\" : d ? \"Saved plan: \" + (d.n || d.units.length) + \" cabinets, \" + (d.when || \"earlier\") + \". Saved on this device only.\" : \"Saved in this browser only, on this device.\";\n    }\n    const persist = {\n      initialScene: initialScene2,\n      migrateRoom: migrateRoom2,\n      store,\n      serialize: serialize2,\n      applyPlan,\n      saveState: saveState2,\n      clearState,\n      loadState: loadState2,\n      savedStamp,\n      saveNote,\n      recovery,\n      LS_KEY\n    };\n    ctx.persist = persist;\n    return persist;\n  }\n\n  // v2/src/interact/workshop-commands.js\n  var PASS = /* @__PURE__ */ new Set([\"openPlan\", \"save\", \"restore\", \"selectWorkshopPart\", \"setEnvironment\", \"setGraphics\", \"toggleAllDims\", \"toggleSnap\", \"toggleFrontsSeeThrough\"]);\n  function workshopCommand(ctx, name2, args) {\n    if (!ctx.scene.workshop) return null;\n    if (name2 === \"setDim\") {\n      try {\n        const current = workshopDocumentOf(ctx.scene);\n        const selected2 = ctx.sel(), document2 = resizeWorkshopScene(current, selected2.id, args.k, Number(args.value));\n        if (JSON.stringify(document2) === JSON.stringify(current)) {\n          ctx.syncControls();\n          return { ok: true, changed: false, value: selected2[args.k] };\n        }\n        const next = workshopRuntime(document2);\n        ctx.hist.run(\"workshop size\", () => {\n          ctx.scene.units = next.units;\n          ctx.scene.workshop = next.workshop;\n        });\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, value: ctx.sel()[args.k] };\n      } catch (e) {\n        ctx.cue(e.message);\n        return { ok: false, why: e.message };\n      }\n    }\n    if (PASS.has(name2)) return null;\n    const why = \"This workshop construction currently supports size edits, part selection and project files. That operation is not available yet.\";\n    ctx.cue(why);\n    return { ok: false, why };\n  }\n\n  // v2/src/interact/commands.js\n  var OPENING_GUARDED = /* @__PURE__ */ new Set([\n    \"flip\",\n    \"turn\",\n    \"setDim\",\n    \"moveInRow\",\n    \"setRoomDim\",\n    \"setRunDim\",\n    \"setTallHeight\",\n    \"setSectionWidth\",\n    \"setSectionCount\",\n    \"islandPreset\"\n  ]);\n  function openingGuardBefore(ctx) {\n    return { snap: ctx.hist.snap(), ids: clashingIds(ctx.scene.units) };\n  }\n  function openingGuardAfter(ctx, g2, r) {\n    const clash = newClash(ctx.scene.units, g2.ids);\n    if (!clash) return r;\n    ctx.hist.restore(g2.snap);\n    const why = openingWhy(clash.zone);\n    if (ctx.cue) ctx.cue(\"Not changed \\u2014 \" + why);\n    if (ctx.syncControls) ctx.syncControls();\n    if (ctx.refresh) ctx.refresh();\n    return { ok: false, why };\n  }\n  function createCommands(ctx) {\n    const defs = /* @__PURE__ */ new Map();\n    function define(name2, spec) {\n      if (defs.has(name2)) throw new Error(\"commands: \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u0430 \\u043E\\u0431\\u044A\\u044F\\u0432\\u043B\\u0435\\u043D\\u0430 \\u0434\\u0432\\u0430\\u0436\\u0434\\u044B: \" + name2);\n      if (typeof spec.run !== \"function\") throw new Error(\"commands: \\u0443 \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u043D\\u0435\\u0442 run: \" + name2);\n      defs.set(name2, {\n        name: name2,\n        history: spec.history === void 0 ? null : spec.history,\n        doc: spec.doc || \"\",\n        args: spec.args || null,\n        run: spec.run,\n        undoAfterGuard: spec.undoAfterGuard === true\n      });\n    }\n    function run(name2, args) {\n      const d = defs.get(name2);\n      if (!d) throw new Error(\"commands: \\u043D\\u0435\\u0442 \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \" + name2);\n      const native = workshopCommand(ctx, name2, args || {});\n      if (native) return native;\n      const guard = OPENING_GUARDED.has(name2) && ctx.hist && ctx.scene ? openingGuardBefore(ctx) : null;\n      let r = d.run(args || {});\n      r = r === void 0 ? { ok: true } : r;\n      if (guard && r && r.ok !== false) r = openingGuardAfter(ctx, guard, r);\n      if (d.undoAfterGuard && guard && r && r.ok !== false && ctx.hist.pushAfter) ctx.hist.pushAfter(d.history || name2, guard.snap);\n      return r;\n    }\n    function has(name2) {\n      return defs.has(name2);\n    }\n    function list() {\n      return Array.from(defs.values()).map((d) => ({ name: d.name, history: d.history, doc: d.doc, args: d.args }));\n    }\n    const commands = { define, run, has, list };\n    ctx.commands = commands;\n    return commands;\n  }\n\n  // v2/src/interact/radial.js\n  var RADIAL_MODES = [\n    { mode: \"rotate\", label: \"Rotate view\", cabinet: false },\n    { mode: \"pan\", label: \"Move view\", cabinet: false },\n    { mode: \"cabinet\", label: \"Move cabinet\", cabinet: true },\n    { mode: \"size\", label: \"Size cabinet\", cabinet: true }\n  ];\n  var NO_CABINET = \"Select a cabinet first - then this mode works on it\";\n  function sceneMode(scene) {\n    return scene.moveMode ? \"cabinet\" : scene.panMode ? \"pan\" : scene.sizeMode ? \"size\" : \"rotate\";\n  }\n  function radialOptions(scene) {\n    const sel = !!(scene && scene.selectedId && (scene.units || []).some((u) => u.id === scene.selectedId));\n    const cur = scene ? sceneMode(scene) : null;\n    return RADIAL_MODES.map((m) => ({\n      mode: m.mode,\n      label: m.label,\n      current: cur === m.mode,\n      disabled: m.cabinet && !sel ? NO_CABINET : null\n    }));\n  }\n  var TRAVEL_PX = 4;\n  function noteTravel(g2, e, x0, y0) {\n    if (!g2 || g2.travelled || !e || x0 == null || y0 == null) return;\n    if (Math.hypot(e.clientX - x0, e.clientY - y0) >= TRAVEL_PX) g2.travelled = true;\n  }\n  function installRadial(ctx) {\n    const scene = ctx.scene;\n    let armed = null;\n    let voided = null;\n    function gesture() {\n      const st = ctx.st || {};\n      return st.drag || st.handleDrag || st.sizeDrag || null;\n    }\n    function ofMode(g2, m) {\n      const st = ctx.st || {};\n      if (m === \"rotate\" || m === \"pan\") return g2 === st.drag && !g2.moving;\n      if (m === \"cabinet\") return g2 === st.drag && !!g2.moving;\n      if (m === \"size\") return g2 === st.handleDrag || g2 === st.sizeDrag;\n      return false;\n    }\n    const options = () => radialOptions(scene);\n    function background(e) {\n      if (!e || e.__ubTaken) return false;\n      if (scene.measureOn) return false;\n      if (ctx.pointer && ctx.pointer.pickAt(e.clientX, e.clientY)) return false;\n      if (ctx.openingDrag && ctx.openingDrag.openingAt && ctx.openingDrag.openingAt(e.clientX, e.clientY)) return false;\n      return true;\n    }\n    function open(x, y, auto) {\n      scene.radial = auto ? { x: Math.round(x), y: Math.round(y), auto: true } : { x: Math.round(x), y: Math.round(y) };\n      ctx.syncControls();\n      return true;\n    }\n    function close() {\n      if (!scene.radial) return false;\n      scene.radial = null;\n      ctx.syncControls();\n      return true;\n    }\n    function dblclick(e) {\n      if (!background(e)) return false;\n      if (ctx.inside && ctx.inside.exitEdit && (!ctx.inside.editing || ctx.inside.editing())) ctx.inside.exitEdit();\n      if (scene.insideTool && ctx.inside && ctx.inside.setTool) ctx.inside.setTool(null);\n      const r = ctx.liveRect ? ctx.liveRect() : null;\n      open(e.clientX - (r ? r.left : 0), e.clientY - (r ? r.top : 0));\n      if (e.preventDefault) e.preventDefault();\n      return true;\n    }\n    function dismiss() {\n      if (!scene.radial) return false;\n      armed = null;\n      return close();\n    }\n    function down(e) {\n      if (!scene.radial) return false;\n      if (e && e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return false;\n      if (scene.radial.auto) {\n        dismiss();\n        return false;\n      }\n      dismiss();\n      if (e && e.preventDefault) e.preventDefault();\n      return true;\n    }\n    function choose(mode) {\n      const o = options().find((q) => q.mode === mode);\n      if (!o) return { ok: false, why: \"unknown mode\" };\n      if (o.disabled) {\n        ctx.cue(o.disabled);\n        return { ok: false, why: o.disabled };\n      }\n      scene.radial = null;\n      armed = mode;\n      if (mode === \"rotate\" || mode === \"pan\") ctx.setCamera(mode);\n      else ctx.setAction(mode);\n      return { ok: true, mode };\n    }\n    function cancel() {\n      const g2 = gesture();\n      if (g2) voided = g2;\n      return false;\n    }\n    function release(e) {\n      const g2 = gesture();\n      const cut = !!g2 && g2 === voided;\n      voided = null;\n      if (!g2 || cut || !g2.travelled || scene.radial) return false;\n      if (e && e.button != null && e.button !== 0) return false;\n      if (scene.measureOn || scene.insideTool) return false;\n      const st = ctx.st || {};\n      const moveOrRotate = g2 === st.drag;\n      if (!moveOrRotate) {\n        if (!armed) return false;\n        if (sceneMode(scene) !== armed) {\n          armed = null;\n          return false;\n        }\n        if (!ofMode(g2, armed)) return false;\n      }\n      const r = ctx.liveRect ? ctx.liveRect() : null;\n      const cx = e ? e.clientX : 0, cy = e ? e.clientY : 0;\n      let x = cx - (r ? r.left : 0), y = cy - (r ? r.top : 0);\n      if (r && r.width > 0 && r.height > 0) {\n        x = Math.min(Math.max(x, 0), r.width);\n        y = Math.min(Math.max(y, 0), r.height);\n      }\n      return open(x, y, true);\n    }\n    function touchDone(clientX, clientY) {\n      if (scene.radial || scene.measureOn || scene.insideTool) return false;\n      const r = ctx.liveRect ? ctx.liveRect() : null;\n      let x = clientX - (r ? r.left : 0), y = clientY - (r ? r.top : 0);\n      if (r && r.width > 0 && r.height > 0) {\n        x = Math.min(Math.max(x, 0), r.width);\n        y = Math.min(Math.max(y, 0), r.height);\n      }\n      return open(x, y, true);\n    }\n    const radial = {\n      options,\n      open,\n      close,\n      dismiss,\n      choose,\n      dblclick,\n      down,\n      release,\n      cancel,\n      background,\n      touchDone,\n      isOpen: () => !!scene.radial,\n      armed: () => armed\n    };\n    ctx.radial = radial;\n    return radial;\n  }\n\n  // v2/src/interact/pointer.js\n  function installPointer(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    const dragLog = [];\n    st.dragLogOn = false;\n    st.dragFrame = 0;\n    function dlog(tag, o) {\n      if (!st.dragLogOn) return;\n      o = o || {};\n      o.f = ++st.dragFrame;\n      o.tag = tag;\n      dragLog.push(o);\n      if (dragLog.length > 400) dragLog.shift();\n      ctx.changed(\"draglog\");\n    }\n    function unitAABB2(u) {\n      const yBottom = u.family === \"wall\" ? u.y || 0 : -LEG_H;\n      const yTop = (u.y || 0) + u.h;\n      const f = foot(u);\n      return { x0: f.x0, x1: f.x1, y0: yBottom, y1: yTop, z0: f.z0, z1: f.z1 };\n    }\n    function unitPickBoxes(u) {\n      const yBottom = u.family === \"wall\" ? u.y || 0 : -LEG_H;\n      const yTop = (u.y || 0) + u.h;\n      return footBoxes(u).map((b) => ({ x0: b.x0, x1: b.x1, y0: yBottom, y1: yTop, z0: b.z0, z1: b.z1 }));\n    }\n    const isCut = (id) => !!(scene.viewCut && scene.viewCut.indexOf(id) >= 0);\n    function pickRay(ray, preferId) {\n      if (!ray) return null;\n      let best = null, preferred = null;\n      const us = scene.units;\n      for (let i = 0; i < us.length; i++) {\n        const u = us[i];\n        if (isCut(u.id)) continue;\n        const boxes = unitPickBoxes(u);\n        for (let j = 0; j < boxes.length; j++) {\n          const t = rayAABB(ray, boxes[j]);\n          if (t === null) continue;\n          if (preferId && u.id === preferId && (preferred === null || t < preferred.t)) preferred = { id: u.id, t };\n          if (best === null || t < best.t) best = { id: u.id, t };\n        }\n      }\n      if (preferred) return preferred.id;\n      return best ? best.id : null;\n    }\n    function hitRay(ray) {\n      if (!ray) return null;\n      let best = null;\n      const us = scene.units;\n      for (let i = 0; i < us.length; i++) {\n        if (isCut(us[i].id)) continue;\n        const boxes = unitPickBoxes(us[i]);\n        for (let j = 0; j < boxes.length; j++) {\n          const t = rayAABB(ray, boxes[j]);\n          if (t !== null && t > 1 && (best === null || t < best.t)) best = { id: us[i].id, t };\n        }\n      }\n      if (!best) return null;\n      best.p = [ray.o[0] + ray.d[0] * best.t, ray.o[1] + ray.d[1] * best.t, ray.o[2] + ray.d[2] * best.t];\n      return best;\n    }\n    function pickAt(clientX, clientY, preferId) {\n      return pickRay(ctx.pointerRay(clientX, clientY), preferId);\n    }\n    function pickNdc(nx, ny, preferId) {\n      return pickRay(ctx.rayFromNdc(nx, ny), preferId);\n    }\n    function pickDebug(nx, ny) {\n      const ray = ctx.rayFromNdc(nx, ny);\n      if (!ray) return null;\n      const all = [];\n      for (const u of scene.units) {\n        if (isCut(u.id)) continue;\n        let bt = null;\n        for (const B of unitPickBoxes(u)) {\n          const t = rayAABB(ray, B);\n          if (t !== null && (bt === null || t < bt)) bt = t;\n        }\n        if (bt !== null) all.push({ id: u.id, t: bt });\n      }\n      all.sort((a, b) => a.t - b.t);\n      return { picked: all.length ? all[0].id : null, all };\n    }\n    function decideWallRun(run, hit2) {\n      if (!ROOM.ret || !hit2) return run || \"main\";\n      const rw = ROOM.ret, M = 150;\n      if (run === \"return\") {\n        const ax = ctx.runAxisFor(\"return\");\n        const c = ax === \"z\" ? hit2[2] : hit2[0];\n        return c < ROOM.wallZ + M ? \"main\" : \"return\";\n      }\n      if (rw.axis === \"x\") return (rw.dir > 0 ? hit2[0] > rw.at - M : hit2[0] < rw.at + M) ? \"return\" : \"main\";\n      return (rw.dir > 0 ? hit2[2] > rw.at - M : hit2[2] < rw.at + M) ? \"return\" : \"main\";\n    }\n    function placeWallAlong(u, run, along2, y) {\n      const keep = { x: u.x, z: u.z, y: u.y, rot: u.rot, run: u.run };\n      u.run = run;\n      orientForRun(u, run);\n      u.x = 0;\n      u.z = 0;\n      flushToRun(u, run);\n      const ax = ctx.runAxisFor(run), f = foot(u);\n      const c = ax === \"z\" ? (f.z0 + f.z1) / 2 : (f.x0 + f.x1) / 2;\n      if (ax === \"z\") u.z += along2 - c;\n      else u.x += along2 - c;\n      u.y = clamp4(y, 300, 2e3);\n      if (behindWall(u, u.x, u.z) || scene.units.some((v) => v.id !== u.id && sameLevel(v, u) && overlaps(u, v))) {\n        u.x = keep.x;\n        u.z = keep.z;\n        u.y = keep.y;\n        u.rot = keep.rot;\n        u.run = keep.run;\n        return false;\n      }\n      return true;\n    }\n    function down(e) {\n      if (e.preventDefault) e.preventDefault();\n      if (ctx.measure && ctx.measure.on()) {\n        st.drag = { x: e.clientX, y: e.clientY, moving: false, panning: !!scene.panMode, id: null, pxDown: { x: e.clientX, y: e.clientY } };\n        return;\n      }\n      const picked = pickAt(e.clientX, e.clientY);\n      const camOnly = () => {\n        st.drag = { x: e.clientX, y: e.clientY, moving: false, panning: !!scene.panMode, id: null, pxDown: { x: e.clientX, y: e.clientY } };\n      };\n      if (scene.sizeMode) {\n        if (picked) {\n          scene.selectedId = picked;\n          ctx.refreshCues();\n          ctx.syncControls();\n          ctx.refresh();\n        }\n        if (ctx.parts && ctx.parts.chooseDrawerAt) ctx.parts.chooseDrawerAt(e.clientX, e.clientY);\n        camOnly();\n        return;\n      }\n      if (scene.moveMode && picked && picked !== scene.selectedId) {\n        camOnly();\n        st.drag.clickSelect = picked;\n        ctx.cue(null);\n        return;\n      }\n      if (scene.moveMode) {\n        if (!picked) {\n          camOnly();\n          ctx.cue(null);\n          return;\n        }\n        scene.selectedId = picked;\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n        if (scene.explode > 0) {\n          st.drag = null;\n          ctx.cue(\"Exploded view is a preview \\u2014 set it back to Assembled to move cabinets\");\n          return;\n        }\n      } else if (scene.panMode) {\n      } else if (picked) {\n        scene.selectedId = picked;\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      const u0 = scene.panMode && !scene.moveMode ? ctx.sel() || scene.units[0] : ctx.byId(picked) || ctx.sel();\n      if (!u0) {\n        st.drag = null;\n        return;\n      }\n      const nd = ctx.ndcFromEvent(e.clientX, e.clientY);\n      const isCornerU0 = String(u0.type).indexOf(\"corner\") === 0;\n      let planeY = isCornerU0 ? u0.y || 0 : u0.family === \"wall\" ? null : 0;\n      if (isCornerU0 && planeY !== 0 && !ctx.screenToFloor(nd[0], nd[1], planeY)) planeY = 0;\n      const hit2 = planeY === null ? null : ctx.screenToFloor(nd[0], nd[1], planeY);\n      const wRun = u0.family === \"wall\" ? wallFlushOf(u0) || \"main\" : null;\n      const wPlane = wRun ? ctx.wallPlaneFor(wRun) : null;\n      const wallHit = wPlane ? ctx.screenToPlane(nd[0], nd[1], wPlane.axis, wPlane.at) : null;\n      const wAx = wRun ? ctx.runAxisFor(wRun) : \"x\";\n      const wFoot = wRun ? foot(u0) : null;\n      const wCentre = wFoot ? wAx === \"z\" ? (wFoot.z0 + wFoot.z1) / 2 : (wFoot.x0 + wFoot.x1) / 2 : 0;\n      const fwWall = flushRoomWallOf(u0);\n      let fwLocal = null;\n      if (fwWall) {\n        const fwPl = roomWallPlane(fwWall);\n        const fwHit = ctx.screenToPlane(nd[0], nd[1], fwPl.axis, fwPl.at);\n        if (fwHit) fwLocal = grabLocalFrom(u0, fwHit[0], fwHit[2]);\n      }\n      ctx.cue(null);\n      const snap0 = {};\n      for (const v of scene.units) snap0[v.id] = { x: v.x, y: v.y, z: v.z, rot: v.rot, run: v.run };\n      const drag = st.drag = {\n        x: e.clientX,\n        y: e.clientY,\n        moving: scene.moveMode && !!picked,\n        snapshot: snap0,\n        clashBefore: clashingIds(scene.units),\n        // task 1790952098081: an older plan's clash is not a new one\n        id: picked || null,\n        panning: !!scene.panMode && !(scene.moveMode && picked),\n        guide: null,\n        noSnap: e.altKey || e.metaKey,\n        planeY,\n        wall: u0.family === \"wall\" && String(u0.type).indexOf(\"corner\") !== 0,\n        wallRun: wRun,\n        ndY0: u0.family === \"wall\" ? nd[1] : null,\n        y0: u0.y || 0,\n        grabAlong: wallHit ? (wAx === \"z\" ? wallHit[2] : wallHit[0]) - wCentre : 0,\n        grabX: hit2 ? hit2[0] - u0.x : 0,\n        grabZ: hit2 ? hit2[2] - u0.z : 0,\n        grabY: wallHit ? wallHit[1] - u0.y : 0,\n        swapTarget: null,\n        attachWall: fwWall,\n        grabLocal: fwLocal,\n        ulKey: null,\n        ulCue: null\n      };\n      st.dragSnap = { x: null, z: null, y: null };\n      drag.pxDown = { x: e.clientX, y: e.clientY };\n      if (drag.moving) ctx.hist.begin(\"move cabinet\");\n      let inRun = false;\n      if (u0 && runInheritEligible(u0)) {\n        const dn = runDonorFor(scene.units, u0);\n        inRun = !!(dn && runDimsMatch(u0, dn));\n      }\n      drag.wasInRun = inRun;\n      drag.vIntent = false;\n      if (drag.moving) ctx.alignTempOn();\n      else ctx.alignTempOff();\n      dlog(\"DOWN\", {\n        id: picked || \"none\",\n        mode: scene.moveMode ? \"move\" : scene.panMode ? \"pan\" : \"view\",\n        planeY: planeY === null ? \"none\" : planeY,\n        wallRun: wRun || \"none\",\n        grabAlong: drag.grabAlong || 0,\n        grabX: drag.grabX || 0,\n        grabZ: drag.grabZ || 0,\n        y0: drag.y0 || 0,\n        ndY0: drag.ndY0 == null ? \"none\" : drag.ndY0,\n        ux: u0.x,\n        uz: u0.z,\n        uy: u0.y || 0,\n        rot: u0.rot || 0\n      });\n    }\n    function move(e) {\n      const drag = st.drag;\n      if (!drag) return;\n      const ME = globalThis.MouseEvent;\n      if (typeof ME === \"function\" && e instanceof ME && e.isTrusted === true && e.buttons === 0 && !(e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents)) {\n        up();\n        return;\n      }\n      if (e.preventDefault) e.preventDefault();\n      if (drag.pxDown) noteTravel(drag, e, drag.pxDown.x, drag.pxDown.y);\n      if (drag.pxDown && !drag.travelled) return;\n      if (drag.moving) {\n        moveCabinet(drag, e);\n        return;\n      }\n      if (drag.panning) {\n        if (ctx.view.sizeGestureActive()) return;\n        const c = ctx.cam();\n        const k = (c ? c.dist : 3e3) * 16e-4;\n        ctx.view.panBy(-(e.clientX - drag.x) * k, (e.clientY - drag.y) * k);\n        drag.x = e.clientX;\n        drag.y = e.clientY;\n        return;\n      }\n      if (ctx.view.sizeGestureActive()) return;\n      if (!drag.orbitAimed) {\n        drag.orbitAimed = true;\n        ctx.view.releaseCamera();\n        if (ctx.view.orbitStart) ctx.view.orbitStart();\n      }\n      const prevTurn = { yaw: scene.yaw, pitch: scene.pitch };\n      scene.yaw += (e.clientX - drag.x) * 95e-4;\n      ctx.view.releaseCamera();\n      scene.pitch = clamp4(scene.pitch + (e.clientY - drag.y) * 75e-4, PITCH.min, PITCH.max);\n      drag.x = e.clientX;\n      drag.y = e.clientY;\n      ctx.frame();\n      if (ctx.view.orbitGuard) ctx.view.orbitGuard(prevTurn);\n    }\n    function moveCabinet(drag, e) {\n      const u = ctx.byId(drag.id) || ctx.sel();\n      if (!u) return;\n      const nd2 = ctx.ndcFromEvent(e.clientX, e.clientY);\n      const fourWallDrag = !isCornerUnit(u) && !isIsland(u) && (u.family === \"wall\" || !drag.wall && u.family === \"base\");\n      if (fourWallDrag) {\n        fourWall(drag, u, nd2);\n        return;\n      }\n      if (drag.wall) {\n        wallSlide(drag, u, nd2, e);\n        return;\n      }\n      if (String(u.type).indexOf(\"corner\") === 0) {\n        cornerDrag(drag, u, nd2);\n        return;\n      }\n      const h2 = ctx.screenToFloor(nd2[0], nd2[1], drag.planeY);\n      if (!h2) return;\n      const wantX = h2[0] - drag.grabX, wantZ = h2[2] - drag.grabZ;\n      const mc = moveClamped(scene.units, u, wantX, wantZ);\n      u.x = mc.x;\n      u.z = mc.z;\n      if (scene.snap && !drag.noSnap) {\n        const ss = snapUnit(scene.units, u, u.x, u.z, true, { x: drag.sideSnap || null, z: null });\n        if (ss.snapX && !blockedAt(scene.units, u, ss.x, u.z)) u.x = ss.x;\n        drag.sideSnap = ss.snapX;\n      } else drag.sideSnap = null;\n      const fs2 = scene.snap && !drag.noSnap ? frontSnap(scene.units, u, drag.cues) : { x: u.x, z: u.z, cues: alignGroups(scene.units, u, drag.cues) };\n      u.x = fs2.x;\n      u.z = fs2.z;\n      drag.cues = fs2.cues;\n      scene.cues = ctx.alignVisible() ? fs2.cues : null;\n      ctx.cue(ctx.alignVisible() ? cueText(fs2.cues, mc.blocked) : cueText(null, mc.blocked));\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function wallUnderPointer(nd2, dragged) {\n      const ray = ctx.rayFromNdc ? ctx.rayFromNdc(nd2[0], nd2[1]) : null;\n      if (!ray) return null;\n      const o = ray.o, d = ray.d, sz = roomSize();\n      let tStop = Infinity;\n      if (Math.abs(d[1]) > 1e-6) {\n        const t = (-LEG_H - o[1]) / d[1];\n        if (t > 0) tStop = t;\n      }\n      let tSelf = null;\n      for (const v of scene.units) for (const B of unitPickBoxes(v)) {\n        const t = rayAABB(ray, B);\n        if (t === null) continue;\n        if (dragged && v.id === dragged.id) {\n          if (tSelf === null || t < tSelf) tSelf = t;\n          continue;\n        }\n        if (t < tStop) tStop = t;\n      }\n      const selfWalls = dragged && tSelf !== null ? touchedRoomWalls(dragged) : [];\n      const fD = dragged ? foot(dragged) : null;\n      let best = null;\n      const SW = seatWalls();\n      const list = SW ? SW.map((w) => ({ id: w.id, ax: w.axis === \"z\" ? 2 : 0, at: w.at, inside: w.face === \"back\" || w.face === \"left\" ? 1 : -1, lo: w.lo, hi: w.hi })) : [\n        { id: \"back\", ax: 2, at: 0, inside: 1 },\n        { id: \"front\", ax: 2, at: sz.depth, inside: -1 },\n        { id: \"left\", ax: 0, at: 0, inside: 1 },\n        { id: \"right\", ax: 0, at: sz.width, inside: -1 }\n      ];\n      for (const w of list) {\n        if ((o[w.ax] - w.at) * w.inside <= 0) continue;\n        if (Math.abs(d[w.ax]) < 1e-6) continue;\n        const t = (w.at - o[w.ax]) / d[w.ax];\n        if (!(t > 0)) continue;\n        const p = [o[0] + d[0] * t, o[1] + d[1] * t, o[2] + d[2] * t];\n        const al = w.ax === 2 ? p[0] : p[2], lo = w.lo == null ? 0 : w.lo, len = w.hi == null ? w.ax === 2 ? sz.width : sz.depth : w.hi;\n        if (al < lo || al > len || p[1] < 0 || p[1] > (sz.height || 2400)) continue;\n        if (selfWalls.indexOf(w.id) >= 0 && tSelf < t) {\n          const a0 = w.ax === 2 ? fD.x0 : fD.z0, a1 = w.ax === 2 ? fD.x1 : fD.z1;\n          if (al >= a0 - 100 && al <= a1 + 100) continue;\n        }\n        if (!best || t < best.t) best = { id: w.id, t, p };\n      }\n      return best && best.t < tStop ? best : null;\n    }\n    function fourWall(drag, u, nd2) {\n      const planeY = u.family === \"wall\" ? (u.y || 0) + (u.h || 0) / 2 : 0;\n      let hr = ctx.screenToFloor(nd2[0], nd2[1], planeY);\n      if (!hr) {\n        hr = ctx.screenToFloor(nd2[0], nd2[1], planeY === 0 ? u.y || 0 : 0);\n        if (!hr) return;\n      }\n      const P2 = [hr[0], hr[2]];\n      const pre = { x: u.x, z: u.z, rot: u.rot, run: u.run };\n      const order = wallsByDistance(P2[0], P2[1]);\n      const held = drag.attachWall || null;\n      let heldD = Infinity;\n      if (held) {\n        heldD = (order.filter((w) => w.id === held)[0] || { d: Infinity }).d;\n      }\n      const near2 = order[0];\n      let want = null;\n      let holdSticky = false;\n      if (held && u.family === \"wall\") {\n        const hpl = roomWallPlane(held);\n        const hh = ctx.screenToPlane(nd2[0], nd2[1], hpl.axis, hpl.at);\n        if (hh) {\n          const hax = alongAxisForWall(held);\n          const hv = hax === \"z\" ? hh[2] : hh[0];\n          const hExt = hax === \"z\" ? roomSize().depth : roomSize().width;\n          holdSticky = hv >= -RUN_ACQ.off && hv <= hExt + RUN_ACQ.off;\n        }\n      }\n      if (holdSticky || held && heldD <= RUN_ACQ.off) {\n        want = near2.id !== held && near2.d <= RUN_ACQ.on && near2.d < heldD - RUN_ACQ.margin ? near2.id : held;\n      } else if (near2.d <= RUN_ACQ.on) want = near2.id;\n      const ptrWall = wallUnderPointer(nd2, u);\n      if (ptrWall) want = ptrWall.id;\n      if (want) {\n        const wpl = roomWallPlane(want);\n        const wph = ctx.screenToPlane(nd2[0], nd2[1], wpl.axis, wpl.at);\n        const wax = alongAxisForWall(want);\n        const rawAlong = wph ? wax === \"z\" ? wph[2] : wph[0] : wax === \"z\" ? P2[1] : P2[0];\n        if (drag.grabLocal == null) drag.grabLocal = grabLocalFrom(u, P2[0], P2[1]);\n        let along2 = rawAlong - grabAlongForWall(drag.grabLocal, want);\n        const yBefore = u.y;\n        if (scene.snap && !drag.noSnap && attachToRoomWall(scene.units, u, want, along2)) {\n          const ul = ulSnapAlong(scene.units, u, along2, drag.ulKey);\n          drag.ulKey = ul.key;\n          drag.ulCue = ul.cue;\n          along2 = ul.at;\n        } else {\n          drag.ulKey = null;\n          drag.ulCue = null;\n        }\n        drag.wallFull = null;\n        drag.openingStop = null;\n        if (attachToRoomWall(scene.units, u, want, along2)) {\n          u.y = yBefore;\n          drag.attachWall = want;\n          u.run = want === \"back\" ? \"main\" : null;\n        } else {\n          const best = sweepWall(scene.units, u, want, along2);\n          if (best) {\n            u.x = best.x;\n            u.z = best.z;\n            u.rot = best.rot;\n            u.y = yBefore;\n            drag.attachWall = want;\n            u.run = want === \"back\" ? \"main\" : null;\n          } else {\n            u.x = pre.x;\n            u.z = pre.z;\n            u.rot = pre.rot;\n            u.run = pre.run;\n            u.y = yBefore;\n            drag.wallFull = want;\n          }\n        }\n        if (u.rot === pre.rot && (u.x !== pre.x || u.z !== pre.z)) {\n          const tx = u.x, tz = u.z;\n          u.x = pre.x;\n          u.z = pre.z;\n          const mc = moveClamped(scene.units, u, tx, tz);\n          if (mc.blocked && mc.blocked.type === \"room-opening\") {\n            u.x = mc.x;\n            u.z = mc.z;\n            drag.openingStop = \"Stopped at \" + mc.blocked.label + (mc.blocked.kind === \"door\" ? \" - its doorway stays clear\" : \" - it would cover it\");\n          } else {\n            u.x = tx;\n            u.z = tz;\n          }\n        }\n      } else {\n        drag.openingStop = null;\n        if (drag.attachWall) {\n          drag.grabX = P2[0] - u.x;\n          drag.grabZ = P2[1] - u.z;\n        }\n        drag.attachWall = null;\n        u.run = null;\n        const yFree = u.y;\n        const mcF = moveClamped(scene.units, u, P2[0] - drag.grabX, P2[1] - drag.grabZ);\n        u.x = mcF.x;\n        u.z = mcF.z;\n        u.y = yFree;\n        const rs = settleNearWall(scene.units, u, near2.id);\n        let seatedOn = null;\n        if (rs && !rs.ok) {\n          u.x = pre.x;\n          u.z = pre.z;\n          u.rot = pre.rot;\n          u.run = pre.run;\n        } else if (rs) seatedOn = rs.wall;\n        u.y = yFree;\n        drag.seatWall = seatedOn;\n        if (seatedOn) {\n          u.run = seatedOn === \"back\" ? \"main\" : null;\n          drag.attachWall = seatedOn;\n          drag.grabLocal = grabLocalFrom(u, P2[0], P2[1]);\n        }\n        drag.angledNear = !seatedOn && nearAngledWallBox(foot(u), RUN_ACQ.on) ? true : null;\n      }\n      if (drag.attachWall) drag.angledNear = null;\n      scene.cues = ctx.alignVisible() ? alignGroups(scene.units, u, drag.cues) : null;\n      drag.cues = scene.cues;\n      const alignTxt = ctx.alignVisible() ? cueText(scene.cues, null) : null;\n      const cueWall = drag.attachWall || !drag.attachWall && drag.seatWall || null;\n      ctx.cue([\n        drag.wallFull ? \"No room for it on the \" + seatWallName(drag.wallFull) : null,\n        drag.openingStop || null,\n        cueWall ? \"Against the \" + seatWallName(cueWall) : null,\n        drag.angledNear ? ANGLED_WALL_SAY : null,\n        drag.ulCue || null,\n        alignTxt\n      ].filter(Boolean).join(\" \\xB7 \") || null);\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function settleY(u, wantY) {\n      const us = scene.units;\n      for (let i = 0; i < us.length; i++) {\n        const v = us[i];\n        if (v.id === u.id || v.family !== \"wall\") continue;\n        if (Math.abs((v.y || 0) - wantY) <= 40) wantY = v.y || 0;\n      }\n      return wantY;\n    }\n    function wallSlide(drag, u, nd2, e) {\n      const wrun = drag.wallRun || wallFlushOf(u) || \"main\";\n      const other = wrun === \"main\" ? \"return\" : \"main\";\n      const hitWall = (run) => {\n        const q = ctx.wallPlaneFor(run);\n        return ctx.screenToPlane(nd2[0], nd2[1], q.axis, q.at);\n      };\n      let wantY = drag.y0 != null ? drag.y0 : u.y;\n      if (drag.ndY0 != null && drag.pxDown) {\n        const UP_DEAD = 14;\n        const f0 = foot(u);\n        const anchor = [(f0.x0 + f0.x1) / 2, (u.y || 0) + u.h / 2, (f0.z0 + f0.z1) / 2];\n        const aAx = ctx.runAxisFor(drag.wallRun || wrun);\n        const alongV = aAx === \"z\" ? [0, 0, 1] : [1, 0, 0];\n        const pA = ctx.worldToNdc(anchor);\n        const pAlong = ctx.worldToNdc([anchor[0] + alongV[0] * 200, anchor[1], anchor[2] + alongV[2] * 200]);\n        const pUp = ctx.worldToNdc([anchor[0], anchor[1] + 200, anchor[2]]);\n        const dxp = e.clientX - drag.pxDown.x, dyp = e.clientY - drag.pxDown.y;\n        let along2 = dxp, vert = -dyp;\n        if (pA && pAlong && pUp) {\n          let ax1 = pAlong[0] - pA[0], ay1 = -(pAlong[1] - pA[1]);\n          let ux1 = pUp[0] - pA[0], uy1 = -(pUp[1] - pA[1]);\n          const ma = Math.hypot(ax1, ay1) || 1, mu = Math.hypot(ux1, uy1) || 1;\n          ax1 /= ma;\n          ay1 /= ma;\n          ux1 /= mu;\n          uy1 /= mu;\n          along2 = dxp * ax1 + -dyp * ay1;\n          vert = dxp * ux1 + -dyp * uy1;\n        }\n        if (!drag.vIntent && Math.abs(vert) > UP_DEAD && Math.abs(vert) > Math.abs(along2)) {\n          drag.vIntent = true;\n          dlog(\"VINTENT\", { along: along2, vert, note: \"height unlocked\" });\n        }\n        if (drag.vIntent) {\n          const c = ctx.cam();\n          const span2 = Math.tan(FOVY / 2) * (c ? c.dist : 2e3);\n          wantY = drag.y0 + (nd2[1] - drag.ndY0) * span2;\n        }\n        wantY = settleY(u, wantY);\n        dlog(\"AXIS\", { along: along2, vert, vIntent: drag.vIntent ? \"yes\" : \"no\", wantY });\n      }\n      const alongFor = (run, hit2) => {\n        const a2 = ctx.runAxisFor(run);\n        return (a2 === \"z\" ? hit2[2] : hit2[0]) - (run === drag.wallRun ? drag.grabAlong || 0 : 0);\n      };\n      const tryRun = (run, hit2) => {\n        if (!hit2) {\n          dlog(\"NOHIT\", { run });\n          return false;\n        }\n        let along2 = alongFor(run, hit2);\n        const along0 = along2;\n        if (scene.snap && !drag.noSnap) {\n          const ul = ulSnapAlong(scene.units, u, along2, drag.ulKey);\n          drag.ulKey = ul.key;\n          drag.ulCue = ul.cue;\n          along2 = ul.at;\n        } else {\n          drag.ulKey = null;\n          drag.ulCue = null;\n        }\n        const okp = placeWallAlong(u, run, along2, wantY);\n        dlog(\"TRY\", {\n          run,\n          rawAlong: along0,\n          snapAlong: along2,\n          ulKey: drag.ulKey || \"none\",\n          wantY,\n          placed: okp ? \"yes\" : \"REJECTED\",\n          ux: u.x,\n          uz: u.z,\n          uy: u.y || 0\n        });\n        if (!okp) return false;\n        if (drag.wallRun !== run) {\n          dlog(\"WALLSWITCH\", { from: drag.wallRun || \"none\", to: run, grabAlongReset: true });\n          drag.wallRun = run;\n          drag.grabAlong = 0;\n        }\n        return true;\n      };\n      const hw = hitWall(wrun);\n      const ho = ROOM.ret ? hitWall(other) : null;\n      const wantOther = hw ? decideWallRun(wrun, hw) !== wrun : true;\n      let done2 = false;\n      if (wantOther) done2 = tryRun(other, ho) || tryRun(wrun, hw);\n      else done2 = tryRun(wrun, hw) || tryRun(other, ho);\n      if (!done2) dlog(\"STALL\", { note: \"no legal along-wall placement\", wantY, ux: u.x, uz: u.z, uy: u.y || 0 });\n      if (!done2) {\n        u.y = clamp4(wantY, 300, 2e3);\n      } else {\n        scene.cues = ctx.alignVisible() ? alignGroups(scene.units, u, drag.cues) : null;\n        drag.cues = scene.cues;\n        dlog(\"OK\", {\n          run: drag.wallRun || wrun,\n          ux: u.x,\n          uz: u.z,\n          uy: u.y || 0,\n          fronts: scene.cues && scene.cues.fronts ? scene.cues.fronts.length : 0,\n          tops: scene.cues && scene.cues.tops ? scene.cues.tops.length : 0,\n          guidesVisible: ctx.alignVisible() ? \"yes\" : \"no\"\n        });\n        ctx.cue([\n          (drag.wallRun || wrun) === \"return\" ? \"On the return wall\" : \"On the main wall\",\n          drag.ulCue || null,\n          ctx.alignVisible() ? cueText(scene.cues, null) : null\n        ].filter(Boolean).join(\" \\xB7 \"));\n      }\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function cornerDrag(drag, u, nd2) {\n      let hc = ctx.screenToFloor(nd2[0], nd2[1], drag.planeY);\n      if (!hc) {\n        hc = ctx.screenToFloor(nd2[0], nd2[1], 0);\n        if (!hc) return;\n        drag.planeY = 0;\n        drag.grabX = hc[0] - u.x;\n        drag.grabZ = hc[2] - u.z;\n      }\n      if (cornerCanTransfer(u)) {\n        const dests = cornerDestinations(scene.units, u);\n        let best = null, bd = Infinity;\n        for (const c of dests) {\n          const dd = Math.hypot(c.x - hc[0], c.z - hc[2]);\n          if (dd < bd) {\n            bd = dd;\n            best = c;\n          }\n        }\n        if (best && best.kind === \"share\" && bd < 1200) {\n          const keep = { x: u.x, z: u.z, rot: u.rot };\n          const got = seatSharingCorner(scene.units, u, best.other);\n          if (got) {\n            scene.cornerTarget = null;\n            drag.cornerTarget = null;\n            ctx.cue(\"Above the corner cabinet below\");\n          } else {\n            u.x = keep.x;\n            u.z = keep.z;\n            u.rot = keep.rot;\n            ctx.cue(\"That corner is taken at this height \\u2014 nothing moved\");\n          }\n          ctx.syncControls();\n          ctx.refresh();\n          return;\n        }\n        const tc = best && best.kind === \"room\" ? roomCorners().filter((q) => q.id === best.id)[0] : null;\n        let atOwn = false;\n        if (tc) {\n          const pv0 = cornerTransferPreview(scene.units, u, tc.id);\n          atOwn = !!(pv0.ok && pv0.box && Math.abs((pv0.box.x0 + pv0.box.x1) / 2 - (foot(u).x0 + foot(u).x1) / 2) < 1 && Math.abs((pv0.box.z0 + pv0.box.z1) / 2 - (foot(u).z0 + foot(u).z1) / 2) < 1);\n        }\n        if (tc && !atOwn) {\n          const pv = cornerTransferPreview(scene.units, u, tc.id);\n          scene.cornerTarget = pv.ok ? { corner: tc.id, box: pv.box, ok: true, y: u.y || 0 } : { corner: tc.id, ok: false, why: pv.why, box: pv.box, y: u.y || 0 };\n          drag.cornerTarget = scene.cornerTarget;\n          ctx.cue(pv.ok ? \"Release to move to the \" + tc.id.replace(\"-\", \" \") + \" corner\" : pv.why);\n        } else {\n          scene.cornerTarget = null;\n          drag.cornerTarget = null;\n          ctx.cue(\"Drag toward a corner to move this cabinet\");\n        }\n        ctx.syncControls();\n        ctx.refresh();\n        return;\n      }\n      const cTan = (u.rot || 0) % 2 === 0 ? \"x\" : \"z\";\n      let cx = u.x, cz = u.z;\n      if (cTan === \"x\") cx = hc[0] - drag.grabX;\n      else cz = hc[2] - drag.grabZ;\n      let bestX = u.x, bestZ = u.z;\n      const steps = 12;\n      for (let si = 1; si <= steps; si++) {\n        const tx = u.x + (cx - u.x) * si / steps;\n        const tz = u.z + (cz - u.z) * si / steps;\n        if (cornerMoveOK(scene.units, u, tx, tz)) {\n          bestX = tx;\n          bestZ = tz;\n        } else break;\n      }\n      u.x = bestX;\n      u.z = bestZ;\n      syncRoom(scene.units);\n      ctx.cue(ROOM.ret ? \"Corner moved \\u2014 the wall follows it\" : \"Corner moved\");\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function up() {\n      const drag = st.drag;\n      if (drag && drag.clickSelect && !drag.travelled) {\n        scene.selectedId = drag.clickSelect;\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      if (drag && drag.moving && drag.pxDown && !drag.travelled) {\n        ctx.hist.abort();\n        st.drag = null;\n        ctx.alignTempOff();\n        if (ctx.parts && ctx.parts.chooseDrawerAt) ctx.parts.chooseDrawerAt(drag.pxDown.x, drag.pxDown.y);\n        return;\n      }\n      if (drag && drag.panning && drag.pxDown && !drag.travelled && drag.id && !(ctx.measure && ctx.measure.on()) && ctx.byId(drag.id) && scene.selectedId !== drag.id) {\n        scene.selectedId = drag.id;\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      if (drag && !drag.moving && drag.pxDown && !drag.travelled && !(ctx.measure && ctx.measure.on()) && ctx.parts && ctx.parts.chooseDrawerAt)\n        ctx.parts.chooseDrawerAt(drag.pxDown.x, drag.pxDown.y);\n      if (drag && drag.moving && scene.cornerTarget) {\n        const cu = ctx.byId(drag.id) || ctx.sel();\n        const tgt = scene.cornerTarget;\n        scene.cornerTarget = null;\n        if (cu && tgt.ok) {\n          const r = cornerAtRoomCorner(scene.units, cu, tgt.corner);\n          ctx.cue(r.ok ? \"Moved to the \" + tgt.corner.replace(\"-\", \" \") + \" corner\" : r.why || \"That corner did not work - nothing moved\");\n        } else if (cu) {\n          ctx.cue(\"That corner is occupied or too small - the cabinet stayed put\");\n        }\n        syncRoom(scene.units);\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      if (drag && drag.moving) {\n        const moved = ctx.byId(drag.id);\n        let seatBad = false;\n        if (moved) {\n          const rs = settleNearWall(scene.units, moved, null);\n          seatBad = !!(rs && !rs.ok);\n        }\n        const clash = drag.snapshot ? newClash(scene.units, drag.clashBefore) : null;\n        if (drag.snapshot && (seatBad || clash || !sceneValid(scene.units))) {\n          for (const v of scene.units) {\n            const s = drag.snapshot[v.id];\n            if (s) {\n              v.x = s.x;\n              v.y = s.y;\n              v.z = s.z;\n              v.rot = s.rot;\n              v.run = s.run;\n            }\n          }\n          syncRoom(scene.units);\n          ctx.cue(moved && moved.type === \"corner-l\" && !clash ? \"Moved back \\u2014 the corner can't go there, it would trap another cabinet\" : clash ? \"Moved back \\u2014 \" + openingWhy(clash.zone) : \"Moved back \\u2014 that drop wouldn't fit\");\n          if (clash) drag.keepCue = \"Moved back \\u2014 \" + openingWhy(clash.zone);\n        } else {\n          scene.cues = ctx.alignVisible() ? validCues(scene.units, ctx.sel(), scene.cues) : null;\n          ctx.cue(drag.openingStop || (ctx.alignVisible() ? cueText(scene.cues, null) : null));\n          if (drag.openingStop) drag.keepCue = drag.openingStop;\n          if (moved && moved.family === \"base\" && ROOM.ret && moved.run) scene.activeRun = moved.run;\n        }\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      if (drag) dlog(\"UP\", { id: drag.id || \"none\", wallRun: drag.wallRun || \"none\", grabAlong: drag.grabAlong || 0 });\n      if (drag && drag.moving && !drag.wasInRun) {\n        const ju = ctx.byId(drag.id) || ctx.sel();\n        if (ju && runInheritEligible(ju)) {\n          const jr = inheritRunDims(scene.units, ju);\n          if (jr.ok && !jr.already) {\n            ctx.cue(runInheritCue(jr, ju));\n          } else if (!jr.ok && !jr.none) ctx.cue(jr.why);\n        }\n      }\n      ctx.hist.commit();\n      st.drag = null;\n      ctx.alignTempOff();\n      if (drag && drag.keepCue) ctx.cue(drag.keepCue);\n    }\n    function cancelMove() {\n      const drag = st.drag, before = drag && drag.moving && ctx.hist.liveBefore ? ctx.hist.liveBefore() : null;\n      ctx.hist.abort();\n      st.drag = null;\n      ctx.alignTempOff();\n      if (before != null && ctx.hist.restore) {\n        ctx.hist.restore(before);\n        ctx.cue(null);\n        ctx.syncControls();\n        ctx.refresh();\n      }\n    }\n    function blur() {\n      cancelMove();\n    }\n    function cancel() {\n      cancelMove();\n    }\n    function lostCapture() {\n      ctx.alignTempOff();\n    }\n    function setDragLog(on) {\n      st.dragLogOn = !!on;\n      if (!on) dragLog.length = 0;\n      return st.dragLogOn;\n    }\n    function toggleDragLog() {\n      st.dragLogOn = !st.dragLogOn;\n      dragLog.length = 0;\n      st.dragFrame = 0;\n      return st.dragLogOn;\n    }\n    const pointer = {\n      unitAABB: unitAABB2,\n      unitPickBoxes,\n      pickRay,\n      hitRay,\n      pickAt,\n      pickNdc,\n      pickDebug,\n      decideWallRun,\n      placeWallAlong,\n      down,\n      move,\n      up,\n      blur,\n      cancel,\n      lostCapture,\n      dragLog: () => dragLog,\n      setDragLog,\n      toggleDragLog,\n      dlog\n    };\n    ctx.pointer = pointer;\n    return pointer;\n  }\n\n  // v2/src/interact/touch.js\n  var ECHO_MS = 700;\n  var TOUCH_ECHO_CAP_MS = 1e4;\n  function touchEcho(e, st, tNow) {\n    if (!e || e.__touch || !st || st.touchDblAt == null) return false;\n    const dt = tNow - st.touchDblAt;\n    if (dt < 0) return false;\n    const caps = e.sourceCapabilities;\n    if (caps) return !!caps.firesTouchEvents && !!st.touchDblPending && dt < TOUCH_ECHO_CAP_MS;\n    return dt < ECHO_MS;\n  }\n  function touchGap(e) {\n    const a = e.touches[0], b = e.touches[1];\n    return Math.sqrt(Math.pow(a.clientX - b.clientX, 2) + Math.pow(a.clientY - b.clientY, 2));\n  }\n  function installTouch(ctx) {\n    const scene = ctx.scene, st = ctx.st, T3 = st.touch;\n    const TAP_PX = 6;\n    function start2(e) {\n      st.touchDblPending = false;\n      if (e.touches.length === 2) {\n        if (ctx.view && ctx.view.syncOut) ctx.view.syncOut();\n        const mx = (e.touches[0].clientX + e.touches[1].clientX) / 2, my = (e.touches[0].clientY + e.touches[1].clientY) / 2;\n        const anchor = ctx.view && ctx.view.anchorAt ? ctx.view.anchorAt(mx, my) : null;\n        if (anchor && anchor.on && ctx.view.pivotOn) ctx.view.pivotOn(anchor.p);\n        T3.pinch = { gap: Math.max(1, touchGap(e)), z0: ctx.view && ctx.view.zoomClamp ? ctx.view.zoomClamp(scene.zoom) : clampZoom(scene.zoom), anchor, lastGap: Math.max(1, touchGap(e)) };\n        T3.tS = null;\n        T3.tM = null;\n        T3.tGrab = null;\n        return;\n      }\n      T3.pinch = null;\n      if (e.touches.length !== 1) return;\n      T3.tS = {\n        x: e.touches[0].clientX,\n        y: e.touches[0].clientY,\n        x0: e.touches[0].clientX,\n        y0: e.touches[0].clientY,\n        turned: 0\n      };\n      T3.tM = null;\n      T3.tGrab = null;\n      if (ctx.measure && ctx.measure.on()) return;\n      if (scene.partsMode && ctx.parts && ctx.parts.selectedShelfEdgeAt) {\n        const x0 = e.touches[0].clientX, y0 = e.touches[0].clientY;\n        if (ctx.parts.selectedShelfEdgeAt(x0, y0)) {\n          ctx.parts.down({ clientX: x0, clientY: y0, __touch: true, preventDefault() {\n          }, stopPropagation() {\n          } });\n          if (st.partDrag && st.partDrag.mode === \"shelf-pending\") {\n            T3.partTouch = true;\n            T3.tM = \"act\";\n            return;\n          }\n        }\n        const fUnder = !st.partDrag && ctx.parts.partUnderPointer ? ctx.parts.partUnderPointer(x0, y0) : null;\n        if ((st.insideTool === \"edit\" || (!st.insideTool || st.insideTool === \"select\") && scene.selPart) && fUnder && fUnder.pid === scene.selPart) {\n          ctx.parts.down({ clientX: x0, clientY: y0, __touch: true, preventDefault() {\n          }, stopPropagation() {\n          } });\n          if (st.partDrag) {\n            T3.partTouch = true;\n            T3.tM = \"act\";\n            return;\n          }\n          st.editAway = null;\n        }\n      }\n      if (scene.roomArmed && ctx.openingDrag && ctx.openingDrag.openingAt) {\n        const x0 = e.touches[0].clientX, y0 = e.touches[0].clientY, hit2 = ctx.openingDrag.openingAt(x0, y0);\n        if (hit2 && hit2.id === scene.roomArmed && ctx.openingDrag.down({ clientX: x0, clientY: y0, button: 0, __touch: true, preventDefault() {\n        }, stopPropagation() {\n        } })) {\n          T3.openTouch = true;\n          T3.tM = \"act\";\n          return;\n        }\n      }\n      if (scene.roomObjSel && ctx.objectDrag && ctx.objectDrag.objectAt) {\n        const x0 = e.touches[0].clientX, y0 = e.touches[0].clientY, hit2 = ctx.objectDrag.objectAt(x0, y0);\n        if (hit2 && hit2.id === scene.roomObjSel && ctx.objectDrag.down({ clientX: x0, clientY: y0, button: 0, __touch: true, preventDefault() {\n        }, stopPropagation() {\n        } })) {\n          T3.objTouch = true;\n          T3.tM = \"act\";\n          return;\n        }\n      }\n      if (scene.splashSel && ctx.splashDrag && ctx.splashDrag.pieceAt) {\n        const x0 = e.touches[0].clientX, y0 = e.touches[0].clientY, hit2 = ctx.splashDrag.pieceAt(x0, y0);\n        if (hit2 && hit2.id === scene.splashSel && ctx.splashDrag.down({ clientX: x0, clientY: y0, button: 0, __touch: true, preventDefault() {\n        }, stopPropagation() {\n        } })) {\n          T3.splashTouch = true;\n          T3.tM = \"act\";\n          return;\n        }\n      }\n      if (scene.hoodSel && ctx.hoodDrag && ctx.hoodDrag.hoodAt) {\n        const x0 = e.touches[0].clientX, y0 = e.touches[0].clientY, hit2 = ctx.hoodDrag.hoodAt(x0, y0);\n        if (hit2 && hit2.id === scene.hoodSel && ctx.hoodDrag.down({ clientX: x0, clientY: y0, button: 0, __touch: true, preventDefault() {\n        }, stopPropagation() {\n        } })) {\n          T3.hoodTouch = true;\n          T3.tM = \"act\";\n          return;\n        }\n      }\n      if (ctx.drawerMove && ctx.drawerMove.touchStart(e.touches[0].clientX, e.touches[0].clientY)) {\n        T3.drawerTouch = true;\n        T3.tM = \"act\";\n        return;\n      }\n      const id = ctx.pointer.pickAt(e.touches[0].clientX, e.touches[0].clientY);\n      const wasSel = scene.selectedId;\n      if (id) {\n        scene.selectedId = id;\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      if (T3.tS) T3.tS.onId = id && id === wasSel ? id : null;\n    }\n    function move(e) {\n      if (T3.pinch && e.touches.length === 2) {\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        if (ctx.view.sizeGestureActive()) return true;\n        const g2 = Math.max(1, touchGap(e)), zz = T3.pinch.z0 * (T3.pinch.gap / g2);\n        if (scene.pivot && ctx.view.pinchBy) ctx.view.pinchBy(T3.pinch.lastGap / g2, T3.pinch.anchor);\n        else if (ctx.view.zoomAnchored) ctx.view.zoomAnchored(zz, T3.pinch.anchor);\n        else ctx.view.setZoom(zz);\n        T3.pinch.lastGap = g2;\n        return true;\n      }\n      if (T3.drawerTouch) {\n        if (e.touches.length !== 1) {\n          T3.drawerTouch = false;\n          ctx.drawerMove.cancel();\n          return false;\n        }\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        ctx.drawerMove.move({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY, preventDefault() {\n        } });\n        return true;\n      }\n      if (T3.openTouch) {\n        if (e.touches.length !== 1) return false;\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        ctx.openingDrag.move({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY, preventDefault() {\n        } });\n        return true;\n      }\n      if (T3.splashTouch) {\n        if (e.touches.length !== 1) return false;\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        ctx.splashDrag.move({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY, preventDefault() {\n        } });\n        return true;\n      }\n      if (T3.hoodTouch) {\n        if (e.touches.length !== 1) return false;\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        ctx.hoodDrag.move({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY, preventDefault() {\n        } });\n        return true;\n      }\n      if (T3.objTouch) {\n        if (e.touches.length !== 1) return false;\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        ctx.objectDrag.move({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY, preventDefault() {\n        } });\n        return true;\n      }\n      if (T3.partTouch) {\n        if (e.touches.length !== 1) return false;\n        if (e.cancelable && e.preventDefault) e.preventDefault();\n        ctx.parts.move({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY, shiftKey: false, preventDefault() {\n        } });\n        return true;\n      }\n      const tS = T3.tS;\n      if (!tS || e.touches.length !== 1) return false;\n      const x = e.touches[0].clientX, y = e.touches[0].clientY, dx = x - tS.x, dy = y - tS.y;\n      if (T3.tM === null) {\n        if (Math.abs(dx) < 6 && Math.abs(dy) < 6) return false;\n        T3.tM = \"act\";\n        if (T3.tM === \"act\" && scene.radial && ctx.radial) ctx.radial.close();\n      }\n      if (T3.tM !== \"act\") return false;\n      if (e.cancelable && e.preventDefault) e.preventDefault();\n      const moveIt = scene.moveMode && !!tS.onId && !!ctx.sel() && ctx.sel().id === tS.onId;\n      if (scene.panMode && !moveIt) {\n        const c = ctx.cam();\n        const k = (c ? c.dist : 3e3) * 16e-4;\n        ctx.view.panBy(-dx * k, dy * k);\n        tS.x = x;\n        tS.y = y;\n        return true;\n      }\n      if (moveIt) {\n        const u = ctx.sel();\n        if (!T3.moveHist) {\n          T3.moveSnap = ctx.hist.snap();\n          ctx.hist.begin(\"move cabinet\");\n          T3.moveHist = true;\n        }\n        ctx.alignTempOn();\n        const ndt = ctx.ndcFromEvent(x, y), ht = ctx.screenToFloor(ndt[0], ndt[1], 0);\n        if (!ht) {\n          tS.x = x;\n          tS.y = y;\n          return true;\n        }\n        if (T3.tGrab === null) T3.tGrab = { gx: ht[0] - u.x, gz: ht[2] - u.z };\n        const r = snapUnit(scene.units, u, ht[0] - T3.tGrab.gx, ht[2] - T3.tGrab.gz, scene.snap, st.dragSnap);\n        st.dragSnap = { x: r.snapX, z: r.snapZ };\n        u.x = r.x;\n        u.z = r.z;\n        ctx.cue(ctx.alignVisible() ? r.cues.join(\" \\xB7 \") : null);\n        ctx.syncControls();\n        ctx.refresh();\n      } else {\n        if (!tS.orbitAimed) {\n          tS.orbitAimed = true;\n          if (ctx.view.orbitStart && !scene.camHold) ctx.view.orbitStart();\n        }\n        const prevTurn = { yaw: scene.yaw, pitch: scene.pitch };\n        scene.yaw += dx * 0.011;\n        scene.pitch = Math.min(PITCH.max, Math.max(PITCH.min, scene.pitch + dy * 75e-4));\n        ctx.frame();\n        if (ctx.view.orbitGuard) ctx.view.orbitGuard(prevTurn);\n      }\n      tS.x = x;\n      tS.y = y;\n      return true;\n    }\n    const now = () => typeof performance !== \"undefined\" && performance.now ? performance.now() : Date.now();\n    function end(e) {\n      var _a;\n      const moved = T3.tM === \"act\" && T3.tS && !T3.drawerTouch && !T3.openTouch && !T3.partTouch && !T3.pinch && (!e || !e.touches || e.touches.length === 0) && Math.hypot(T3.tS.x - T3.tS.x0, T3.tS.y - T3.tS.y0) >= 4;\n      const liftAt = moved ? { x: T3.tS.x, y: T3.tS.y } : null;\n      const tapped = T3.tS && T3.tM === null && !T3.pinch && !T3.drawerTouch && !T3.openTouch && !T3.partTouch && (!e || !e.touches || e.touches.length === 0);\n      if (tapped && scene.radial && ctx.radial && ctx.radial.dismiss) ctx.radial.dismiss();\n      if (liftAt && ctx.radial && ctx.radial.touchDone) ctx.radial.touchDone(liftAt.x, liftAt.y);\n      if (T3.moveHist) {\n        T3.moveHist = false;\n        T3.moveSnap = null;\n        ctx.hist.commit();\n      }\n      if (T3.drawerTouch) {\n        T3.drawerTouch = false;\n        const was = ctx.drawerMove.active();\n        const t = e && e.changedTouches && e.changedTouches[0];\n        ctx.drawerMove.up(t ? { clientX: t.clientX, clientY: t.clientY } : { clientX: T3.tS && T3.tS.x, clientY: T3.tS && T3.tS.y });\n        if (was && !was.moved && T3.tS) T3.tM = null;\n        else {\n          T3.tS = null;\n          T3.tM = null;\n          T3.lastTap = null;\n          return;\n        }\n      }\n      const lift = e && e.changedTouches && e.changedTouches[0];\n      const still = !!T3.tS && (!lift || Math.hypot(lift.clientX - T3.tS.x0, lift.clientY - T3.tS.y0) < TAP_PX);\n      if (T3.openTouch || T3.objTouch || T3.splashTouch || T3.hoodTouch || T3.partTouch) {\n        const pdMoved = !!(T3.partTouch && st.partDrag && st.partDrag.moved);\n        const spSt = T3.splashTouch && ctx.splashDrag.state ? ctx.splashDrag.state() : null;\n        const spMoved = !!(spSt && spSt.moved);\n        const hdSt = T3.hoodTouch && ctx.hoodDrag.state ? ctx.hoodDrag.state() : null, hdMoved = !!(hdSt && hdSt.moved);\n        if (T3.openTouch) {\n          T3.openTouch = false;\n          ctx.openingDrag.up({});\n        }\n        if (T3.objTouch) {\n          T3.objTouch = false;\n          ctx.objectDrag.up({});\n        }\n        if (T3.splashTouch) {\n          T3.splashTouch = false;\n          ctx.splashDrag.up({});\n        }\n        if (T3.hoodTouch) {\n          T3.hoodTouch = false;\n          ctx.hoodDrag.up({});\n        }\n        if (T3.partTouch) {\n          T3.partTouch = false;\n          ctx.parts.up();\n        }\n        if (still && !pdMoved && !spMoved && !hdMoved) T3.tM = null;\n        else {\n          T3.tS = null;\n          T3.tM = null;\n          T3.lastTap = null;\n          return;\n        }\n      }\n      const evT = e && typeof e.timeStamp === \"number\" && e.timeStamp > 0 && e.timeStamp <= now() + 1 ? e.timeStamp : now();\n      const tap = T3.tS && T3.tM === null && !T3.pinch && (!e || !e.touches || e.touches.length === 0) ? { x: T3.tS.x0, y: T3.tS.y0, t: evT, h: now() } : null;\n      if (!e || !e.touches || e.touches.length < 2) T3.pinch = null;\n      T3.tS = null;\n      T3.tM = null;\n      T3.tGrab = null;\n      ctx.alignTempOff();\n      if (!tap || ctx.measure && ctx.measure.on()) {\n        T3.lastTap = null;\n        return;\n      }\n      if (scene.workshop) {\n        const hit2 = (_a = ctx.parts) == null ? void 0 : _a.realPartAt(tap.x, tap.y);\n        if (hit2 == null ? void 0 : hit2.part) {\n          scene.selPart = hit2.part.pid;\n          ctx.changed(\"partinfo\");\n          ctx.refresh();\n        }\n        T3.lastTap = null;\n        return;\n      }\n      if (ctx.objectDrag && ctx.objectDrag.tapAt) ctx.objectDrag.tapAt(tap.x, tap.y);\n      if (ctx.splashDrag && ctx.splashDrag.tapAt) ctx.splashDrag.tapAt(tap.x, tap.y);\n      if (ctx.hoodDrag && ctx.hoodDrag.tapAt) ctx.hoodDrag.tapAt(tap.x, tap.y);\n      if (ctx.parts && ctx.parts.chooseDrawerAt) ctx.parts.chooseDrawerAt(tap.x, tap.y);\n      const prev = T3.lastTap;\n      const quick = prev && (tap.t - prev.t <= 350 || prev.h != null && tap.h - prev.h <= 350);\n      if (prev && quick && Math.hypot(tap.x - prev.x, tap.y - prev.y) <= 24) {\n        T3.lastTap = null;\n        st.touchDblAt = now();\n        st.touchDblPending = true;\n        const ev = { clientX: tap.x, clientY: tap.y, __touch: true, preventDefault() {\n        }, stopPropagation() {\n        } };\n        if (ctx.canvasDblclick) ctx.canvasDblclick(ev);\n        else if (ctx.parts && ctx.parts.dblclick) ctx.parts.dblclick(ev);\n        return;\n      }\n      T3.lastTap = tap;\n    }\n    function cancel() {\n      if (T3.drawerTouch) {\n        T3.drawerTouch = false;\n        ctx.drawerMove.cancel();\n      }\n      if (T3.openTouch) {\n        T3.openTouch = false;\n        ctx.openingDrag.cancel();\n      }\n      if (T3.objTouch) {\n        T3.objTouch = false;\n        ctx.objectDrag.cancel();\n      }\n      if (T3.splashTouch) {\n        T3.splashTouch = false;\n        ctx.splashDrag.cancel();\n      }\n      if (T3.hoodTouch) {\n        T3.hoodTouch = false;\n        ctx.hoodDrag.cancel();\n      }\n      if (T3.partTouch) {\n        T3.partTouch = false;\n        ctx.parts.cancelDrag();\n      }\n      if (T3.moveHist) {\n        T3.moveHist = false;\n        ctx.hist.abort();\n        if (T3.moveSnap != null && ctx.hist.restore) {\n          ctx.hist.restore(T3.moveSnap);\n          ctx.syncControls();\n          ctx.refresh();\n        }\n        T3.moveSnap = null;\n      }\n      T3.pinch = null;\n      T3.tS = null;\n      T3.tM = null;\n      T3.tGrab = null;\n      ctx.alignTempOff();\n    }\n    const touch = { start: start2, move, end, cancel };\n    ctx.touch = touch;\n    return touch;\n  }\n\n  // v2/src/interact/shelf-ids.js\n  function shelfPidOf(u, entry) {\n    if (isCornerShelfUnit(u)) {\n      const nm2 = cornerShelfName(u, entry);\n      return nm2 ? u.id + \":shelf:\" + nm2 : null;\n    }\n    const mine = shelfListOf(u).filter((q) => q.cell === entry.cell).sort((a, b) => a.y - b.y);\n    let idx = -1;\n    for (let i = 0; i < mine.length; i++) if (mine[i].id === entry.id) idx = i;\n    if (idx < 0) return null;\n    const cs = cells(u);\n    const multi = cs.length > 1;\n    let c = null;\n    for (const q of cs) if (shelfCellKey(q) === entry.cell) c = q;\n    const nm = \"Shelf \" + (idx + 1) + (multi && c ? \" (\" + (c.band + 1) + \".\" + (c.col + 1) + \")\" : \"\");\n    return u.id + \":shelf:\" + nm;\n  }\n  function shelfEntryOf(u, pid) {\n    let entry = null;\n    for (const q of shelfListOf(u)) if (shelfPidOf(u, q) === pid) entry = q;\n    return entry;\n  }\n  function selectedCellKey(u, selPart) {\n    if (!u) return \"0.0\";\n    const p = selPart ? partById(u, selPart) : null;\n    if (p) {\n      let found = null;\n      for (const q of shelfListOf(u)) if (shelfPidOf(u, q) === p.pid) found = q.cell;\n      if (found) return found;\n      const B = interiorBounds(u);\n      if (B) {\n        const yMid = (p.local.y0 + p.local.y1) / 2, xMid = (p.local.x0 + p.local.x1) / 2;\n        let best = null;\n        for (const c of cells(u)) {\n          if (yMid >= c.y0 - 1 && yMid <= c.y1 + 1 && xMid >= B.x0 + c.x0 - 1 && xMid <= B.x0 + c.x1 + 1) best = shelfCellKey(c);\n        }\n        if (best) return best;\n      }\n    }\n    const first = cells(u)[0];\n    return first ? shelfCellKey(first) : \"0.0\";\n  }\n\n  // v2/src/interact/handles.js\n  function inView(ctx, p) {\n    const z = ctx.worldClipZ(p);\n    return z !== null && z >= -1 && z <= 1;\n  }\n  function clientOfWorld(ctx, p) {\n    if (!inView(ctx, p)) return null;\n    const nd = ctx.worldToNdc(p);\n    if (!nd) return null;\n    if (!isFinite(nd[0]) || !isFinite(nd[1])) return null;\n    const cs = ctx.canvasSize();\n    return { x: (nd[0] * 0.5 + 0.5) * cs.w, y: (0.5 - nd[1] * 0.5) * cs.h };\n  }\n  function pxPerMmAlongDir(ctx, h) {\n    const d = h.dir || [1, 0, 0];\n    const a = clientOfWorld(ctx, h.anchor);\n    const b = clientOfWorld(ctx, [\n      h.anchor[0] + d[0] * 100,\n      h.anchor[1] + d[1] * 100,\n      h.anchor[2] + d[2] * 100\n    ]);\n    if (!a || !b) return { px: 0.5, ux: 1, uy: 0 };\n    const dx = b.x - a.x, dy = b.y - a.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    if (!(len > 1e-4)) return { px: 0.5, ux: 1, uy: 0 };\n    return { px: len / 100, ux: dx / len, uy: dy / len };\n  }\n  function pxPerMmAlong(ctx, u, axis) {\n    const f = foot(u), c = [(f.x0 + f.x1) / 2, bodyMidY(u), (f.z0 + f.z1) / 2];\n    const d = [0, 0, 0];\n    d[axis === \"x\" ? 0 : axis === \"y\" ? 1 : 2] = 100;\n    const a = clientOfWorld(ctx, c);\n    const b = clientOfWorld(ctx, [c[0] + d[0], c[1] + d[1], c[2] + d[2]]);\n    if (!a || !b) return { px: 0.5, ux: 1, uy: 0 };\n    const dx = b.x - a.x, dy = b.y - a.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    if (!(len > 1e-4)) return { px: 0.5, ux: 1, uy: 0 };\n    return { px: len / 100, ux: dx / len, uy: dy / len };\n  }\n  function rotateViewOn(scene) {\n    return !scene.moveMode && !scene.panMode && !scene.sizeMode && !scene.partsMode;\n  }\n  var PART_AXIS = {\n    \"Side L\": \"w:lo\",\n    \"Side R\": \"w:hi\",\n    \"Top\": \"h:hi\",\n    \"Rail rear\": \"h:hi\",\n    \"Rail front\": \"h:hi\",\n    \"Base\": \"h:lo\",\n    \"Bottom\": \"h:lo\",\n    \"Back\": \"d:lo\"\n  };\n  function interiorHandlesFor(scene, u) {\n    const p = scene.selPart ? partById(u, scene.selPart) : null;\n    if (p) {\n      if (p.kind === \"shelf\" || p.kind === \"fixed-h\") {\n        let yv = null;\n        if (p.kind === \"shelf\") {\n          const sl = shelfListOf(u);\n          for (let i = 0; i < sl.length; i++) if (shelfPidOf(u, sl[i]) === p.pid) yv = sl[i].y;\n        } else {\n          const m1 = /(\\d+)/.exec(p.name || \"\");\n          const i1 = m1 ? parseInt(m1[1], 10) - 1 : 0;\n          yv = (interiorOf(u).hDiv || [])[i1];\n        }\n        if (yv == null) yv = Math.round(p.local.y0 - (interiorBounds(u) || { y0: 0 }).y0);\n        return [{\n          hid: u.id + \":int:\" + p.pid,\n          unitId: u.id,\n          kind: \"interior\",\n          dim: \"int-y\",\n          edge: \"hi\",\n          axis: \"y\",\n          part: p.pid,\n          partName: p.name,\n          anchor: [\n            (p.box.x0 + p.box.x1) / 2,\n            (p.box.y0 + p.box.y1) / 2,\n            (p.box.z0 + p.box.z1) / 2\n          ],\n          value: Math.round(yv),\n          label: Math.round(yv) + \" mm\",\n          compact: true\n        }];\n      }\n      if (p.kind === \"fixed-v\") {\n        const m2 = /(\\d+)/.exec(p.name || \"\");\n        const i2 = m2 ? parseInt(m2[1], 10) - 1 : 0;\n        let xv = (interiorOf(u).vDiv || [])[i2];\n        if (xv == null) xv = 0;\n        return [{\n          hid: u.id + \":int:\" + p.pid,\n          unitId: u.id,\n          kind: \"interior\",\n          dim: \"int-x\",\n          edge: \"hi\",\n          axis: resizeAxisOf(u, \"w\").world,\n          part: p.pid,\n          partName: p.name,\n          anchor: [\n            (p.box.x0 + p.box.x1) / 2,\n            (p.box.y0 + p.box.y1) / 2,\n            (p.box.z0 + p.box.z1) / 2\n          ],\n          value: Math.round(xv),\n          label: Math.round(xv) + \" mm\",\n          compact: true\n        }];\n      }\n      if (p.kind === \"drawer-box\") return [];\n    }\n    return [];\n  }\n  function handlesForSelection(scene, u) {\n    if (scene.sizeMode) return editHandles(u).concat(interiorHandlesFor(scene, u));\n    if (!scene.partsMode) return [];\n    return interiorHandlesFor(scene, u);\n  }\n  function handleTitle(h) {\n    if (h.kind === \"interior\") {\n      if (h.dim === \"int-x\") return (h.partName || \"Divider\") + \" \\u2014 \" + h.value + \" mm from the inside left \\xB7 drag across\";\n      return (h.partName || \"Shelf\") + \" \\u2014 \" + h.value + \" mm above the inside bottom \\xB7 drag up or down\";\n    }\n    if (h.dim === \"w2\") return \"Second arm \\u2014 \" + h.value + \" mm, grows from the junction\";\n    if (h.dim === \"w\") return (h.edge === \"lo\" ? \"Left side\" : h.edge === \"hi\" ? \"Right side\" : \"Arm\") + \" \\u2014 width \" + h.value + \" mm\" + (h.edge === \"lo\" ? \", the right side stays where it is\" : h.edge === \"hi\" ? \", the left side stays where it is\" : \", grows from the junction\");\n    if (h.dim === \"d\") return \"Front \\u2014 depth \" + h.value + \" mm, the back stays where it is\";\n    return (h.edge === \"lo\" ? \"Bottom\" : \"Top\") + \" \\u2014 height \" + h.value + \" mm\" + (h.edge === \"lo\" ? \", the top stays where it is\" : \", the bottom stays where it is\");\n  }\n  function segHitsBox2(e, p, lo, hi) {\n    const d = [p[0] - e[0], p[1] - e[1], p[2] - e[2]];\n    let tn = 0, tf = 1;\n    for (let i = 0; i < 3; i++) {\n      if (Math.abs(d[i]) < 1e-9) {\n        if (e[i] < lo[i] || e[i] > hi[i]) return false;\n        continue;\n      }\n      let t1 = (lo[i] - e[i]) / d[i], t2 = (hi[i] - e[i]) / d[i];\n      if (t1 > t2) {\n        const tt = t1;\n        t1 = t2;\n        t2 = tt;\n      }\n      if (t1 > tn) tn = t1;\n      if (t2 < tf) tf = t2;\n      if (tn > tf) return false;\n    }\n    return tn < 0.995 && tf > 0;\n  }\n  var GRIP_REF_MM = 600;\n  var gripHalf = (alen) => Math.min(44, Math.max(24, (alen || 0) * 0.5)) / 2;\n  var FORE_OK = 0.5;\n  var FACE_AWAY = 0.34;\n  var WIDTH_SPARE = 0.9;\n  var TWIN_DEG = 28;\n  function candidateRoots(u, h) {\n    const out = [{ p: h.anchor.slice(), face: -1 }];\n    if (!u || !h || h.kind !== \"size\") return out;\n    const corner = isCornerUnit(u);\n    if (corner && h.dim !== \"h\") return out;\n    const f = corner ? footBoxes(u)[0] || foot(u) : foot(u), y0 = u.y || 0, y1 = y0 + (u.h || 0);\n    const lo = [f.x0, y0, f.z0], hi = [f.x1, y1, f.z1];\n    const d = h.dir || [1, 0, 0];\n    let ai = 0;\n    for (let i = 1; i < 3; i++) if (Math.abs(d[i]) > Math.abs(d[ai])) ai = i;\n    const sg = d[ai] > 0 ? 1 : -1, E = sg > 0 ? hi[ai] : lo[ai];\n    const [b, c] = [0, 1, 2].filter((i) => i !== ai);\n    const at = (i, t) => lo[i] + (hi[i] - lo[i]) * t;\n    const same = (p, q) => Math.abs(p[0] - q[0]) < 1 && Math.abs(p[1] - q[1]) < 1 && Math.abs(p[2] - q[2]) < 1;\n    for (const [tb, tc] of [\n      [0.5, 0.5],\n      [0.25, 0.5],\n      [0.75, 0.5],\n      [0.5, 0.25],\n      [0.5, 0.75],\n      [0.25, 0.25],\n      [0.75, 0.25],\n      [0.25, 0.75],\n      [0.75, 0.75]\n    ]) {\n      const p = [0, 0, 0];\n      p[ai] = E;\n      p[b] = at(b, tb);\n      p[c] = at(c, tc);\n      if (!out.some((q) => same(q.p, p))) out.push({ p, face: ai });\n    }\n    const ins = Math.min(60, (hi[ai] - lo[ai]) * 0.12);\n    for (const nb of [b, c]) for (const side of [0, 1]) {\n      const oc = nb === b ? c : b;\n      const p = [0, 0, 0];\n      p[ai] = E - sg * ins;\n      p[nb] = side ? hi[nb] : lo[nb];\n      p[oc] = at(oc, 0.5);\n      const n = [0, 0, 0];\n      n[nb] = side ? 1 : -1;\n      out.push({ p, face: nb, n });\n    }\n    return out;\n  }\n  function planFacing(u, d, eye) {\n    const f = foot(u);\n    const hx = eye[0] - (f.x0 + f.x1) / 2, hz = eye[2] - (f.z0 + f.z1) / 2;\n    const hl = Math.hypot(hx, hz);\n    return hl > 1 ? (d[0] * hx + d[2] * hz) / hl : 1;\n  }\n  function sizeHandleSeen(eye, h, u, headMm) {\n    if (!eye || !h || !u) return { seen: true, fore: 1 };\n    const d = h.dir || [1, 0, 0];\n    const r = [h.anchor[0] - eye[0], h.anchor[1] - eye[1], h.anchor[2] - eye[2]];\n    const rl = Math.hypot(r[0], r[1], r[2]) || 1;\n    const cx = (d[1] * r[2] - d[2] * r[1]) / rl, cy = (d[2] * r[0] - d[0] * r[2]) / rl, cz = (d[0] * r[1] - d[1] * r[0]) / rl;\n    const fore = Math.hypot(cx, cy, cz);\n    if (h.dim === \"h\") return { seen: true, fore };\n    const facing = planFacing(u, d, eye);\n    if (facing < -FACE_AWAY) return { seen: false, fore, facing, why: \"its face is turned away\" };\n    const T3 = Math.max(40, headMm || 160);\n    const head = [h.anchor[0] + d[0] * T3, h.anchor[1] + d[1] * T3, h.anchor[2] + d[2] * T3];\n    const boxes = footBoxes(u) || [];\n    const y0 = u.y || 0, y1 = y0 + (u.h || 0), eps = 3;\n    for (let i = 0; i < boxes.length; i++) {\n      const b = boxes[i];\n      if (segHitsBox2(\n        eye,\n        head,\n        [Math.min(b.x0, b.x1) + eps, y0 + eps, Math.min(b.z0, b.z1) + eps],\n        [Math.max(b.x0, b.x1) - eps, y1 - eps, Math.max(b.z0, b.z1) - eps]\n      ))\n        return { seen: false, fore, facing, why: \"behind its own cabinet\" };\n    }\n    return { seen: true, fore, facing };\n  }\n  var GAP_NEAR = 600;\n  var GAP_CLEAR = 2;\n  var GAP_MIN_SCALE = 0.6;\n  var GAP_MIN_PX = 14;\n  function widthGap(units, u, h) {\n    if (!u || !h || h.kind !== \"size\" || h.dim !== \"w\" || !h.edge || isCornerUnit(u)) return null;\n    const d = h.dir || [1, 0, 0];\n    const ai = Math.abs(d[0]) >= Math.abs(d[2]) ? 0 : 2, sg = d[ai] > 0 ? 1 : -1, bi = ai === 0 ? 2 : 0;\n    const f = foot(u);\n    const lo = ai === 0 ? Math.min(f.x0, f.x1) : Math.min(f.z0, f.z1), hi = ai === 0 ? Math.max(f.x0, f.x1) : Math.max(f.z0, f.z1);\n    const b0 = bi === 0 ? Math.min(f.x0, f.x1) : Math.min(f.z0, f.z1), b1 = bi === 0 ? Math.max(f.x0, f.x1) : Math.max(f.z0, f.z1);\n    const E = sg > 0 ? hi : lo;\n    let best = null;\n    for (const v of units || []) {\n      if (!v || v.id === u.id || !sameLevel(u, v)) continue;\n      for (const b of footBoxes(v) || []) {\n        const vb0 = bi === 0 ? Math.min(b.x0, b.x1) : Math.min(b.z0, b.z1), vb1 = bi === 0 ? Math.max(b.x0, b.x1) : Math.max(b.z0, b.z1);\n        if (Math.min(b1, vb1) - Math.max(b0, vb0) <= 1) continue;\n        const va0 = ai === 0 ? Math.min(b.x0, b.x1) : Math.min(b.z0, b.z1), va1 = ai === 0 ? Math.max(b.x0, b.x1) : Math.max(b.z0, b.z1);\n        const dist2 = sg > 0 ? va0 - E : E - va1;\n        if (dist2 < -0.5) continue;\n        if (best === null || dist2 < best) best = dist2;\n      }\n    }\n    if (best === null || best <= 0.05 || best > GAP_NEAR) return null;\n    return { gap: best, ai, sg, E };\n  }\n  function twinArrows(items) {\n    const vis = items.filter((it) => it.visible && it.kind === \"size\");\n    const drop = {};\n    const dimOf = (it) => it.hid.split(\":\").slice(-2)[0];\n    const left = {};\n    for (const it of vis) left[dimOf(it)] = (left[dimOf(it)] || 0) + 1;\n    for (let i = 0; i < vis.length; i++) for (let j = i + 1; j < vis.length; j++) {\n      const a = vis[i], b = vis[j];\n      if (drop[a.hid] || drop[b.hid]) continue;\n      let dd = Math.abs(a.deg - b.deg) % 360;\n      if (dd > 180) dd = 360 - dd;\n      if (dd > TWIN_DEG) continue;\n      if (Math.hypot(a.x - b.x, a.y - b.y) >= Math.max(a.alen, b.alen)) continue;\n      const la = left[dimOf(a)], lb = left[dimOf(b)];\n      const loser = la > 1 && lb <= 1 ? a : lb > 1 && la <= 1 ? b : a.fore < b.fore ? a : b;\n      drop[loser.hid] = true;\n      left[dimOf(loser)]--;\n    }\n    return drop;\n  }\n  function installHandles(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    function rotateOn() {\n      return rotateViewOn(scene);\n    }\n    function forSel(u) {\n      return handlesForSelection(scene, u);\n    }\n    function gripRefSpan() {\n      const c = ctx.cam();\n      if (!c || !c.dist) return 0;\n      const ch = c.ch || ctx.canvasSize().ch || 1;\n      const pxPerMm = ch * (c.viewScale > 0 ? c.viewScale : 1) / (2 * c.dist * Math.tan(FOVY / 2));\n      return GRIP_REF_MM * pxPerMm;\n    }\n    function projectedSpan(u) {\n      const f = foot(u);\n      const a = clientOfWorld(ctx, [f.x0, bodyMidY(u), (f.z0 + f.z1) / 2]);\n      const b = clientOfWorld(ctx, [f.x1, bodyMidY(u), (f.z0 + f.z1) / 2]);\n      const c = clientOfWorld(ctx, [(f.x0 + f.x1) / 2, bodyMidY(u), f.z0]);\n      const e = clientOfWorld(ctx, [(f.x0 + f.x1) / 2, bodyMidY(u), f.z1]);\n      const s1 = a && b ? Math.hypot(b.x - a.x, b.y - a.y) : 0;\n      const s2 = c && e ? Math.hypot(e.x - c.x, e.y - c.y) : 0;\n      return Math.max(s1, s2);\n    }\n    function gripOverNeighbour(u, h, px, py, ux, uy, alen, athk) {\n      const cs = ctx.canvasSize();\n      const eye = ctx.camEye();\n      if (!eye || !cs.cw || !cs.ch) return false;\n      const others2 = [];\n      for (const v of scene.units) if (v && v.id !== u.id) others2.push(v);\n      if (!others2.length) return false;\n      const rootD = Math.hypot(h.anchor[0] - eye[0], h.anchor[1] - eye[1], h.anchor[2] - eye[2]);\n      const nx = -uy, ny = ux, pts = [];\n      for (let i = 0; i <= 6; i++) {\n        const t = -0.35 + 0.85 * i / 6;\n        pts.push([px + ux * alen * t, py + uy * alen * t]);\n      }\n      pts.push([px + ux * alen * 0.45 + nx * athk * 0.5, py + uy * alen * 0.45 + ny * athk * 0.5]);\n      pts.push([px + ux * alen * 0.45 - nx * athk * 0.5, py + uy * alen * 0.45 - ny * athk * 0.5]);\n      const own2 = ctx.pointer.unitPickBoxes(u);\n      for (let k = 0; k < pts.length; k++) {\n        const cx = pts[k][0], cy = pts[k][1];\n        const ray = ctx.rayFromNdc(cx / cs.cw * 2 - 1, 1 - cy / cs.ch * 2);\n        if (!ray) continue;\n        let tOwn = null;\n        for (let b = 0; b < own2.length; b++) {\n          const t0 = rayAABB(ray, own2[b]);\n          if (t0 !== null && (tOwn === null || t0 < tOwn)) tOwn = t0;\n        }\n        for (let j = 0; j < others2.length; j++) {\n          const boxes = ctx.pointer.unitPickBoxes(others2[j]);\n          for (let b = 0; b < boxes.length; b++) {\n            const tt = rayAABB(ray, boxes[b]);\n            if (tt !== null && tt < rootD + 600 && !(tOwn !== null && tOwn <= tt)) return true;\n          }\n        }\n      }\n      return false;\n    }\n    function shown() {\n      const u = ctx.sel();\n      return !(!scene.partsMode && !scene.sizeMode || !u || scene.explode > 0 || scene.insideTool);\n    }\n    function syncHandlesState() {\n      if (!shown()) return;\n      const u = ctx.sel();\n      if (st.activeHandle && st.activeHandle.indexOf(u.id + \":\") !== 0) st.activeHandle = null;\n    }\n    const STEP = 160;\n    function boxesOf(v, eps) {\n      const bs = footBoxes(v) || [], y0 = v.y || 0, y1 = y0 + (v.h || 0);\n      return bs.map((b) => ({\n        lo: [Math.min(b.x0, b.x1) + eps, y0 + eps, Math.min(b.z0, b.z1) + eps],\n        hi: [Math.max(b.x0, b.x1) - eps, y1 - eps, Math.max(b.z0, b.z1) - eps]\n      }));\n    }\n    function hitsAny(e, p, bs) {\n      for (const b of bs) if (segHitsBox2(e, p, b.lo, b.hi)) return true;\n      return false;\n    }\n    function screenOf(h, p, eye, refPx) {\n      const at = clientOfWorld(ctx, p);\n      if (!at) return null;\n      const d = h.dir || [1, 0, 0];\n      const endAt = clientOfWorld(ctx, [p[0] + d[0] * STEP, p[1] + d[1] * STEP, p[2] + d[2] * STEP]);\n      const vx = endAt ? endAt.x - at.x : 0, vy = endAt ? endAt.y - at.y : 0;\n      const vlen2 = Math.hypot(vx, vy);\n      const r = [p[0] - eye[0], p[1] - eye[1], p[2] - eye[2]], rl = Math.hypot(r[0], r[1], r[2]) || 1;\n      const fore = Math.hypot(d[1] * r[2] - d[2] * r[1], d[2] * r[0] - d[0] * r[2], d[0] * r[1] - d[1] * r[0]) / rl;\n      const ux = vlen2 > 0.5 ? vx / vlen2 : 0, uy = vlen2 > 0.5 ? vy / vlen2 : 1;\n      const honest = vlen2 / STEP;\n      const pxmm = fore < FORE_OK || vlen2 <= 0.5 ? Math.max(honest, refPx) : honest;\n      return { at, ux, uy, fore, custom: pxmm !== honest, pxmm, deg: Math.atan2(uy, ux) * 180 / Math.PI };\n    }\n    const ARROW = { tip: 108, headAt: 88, headR: 16, scaleBy: 1400, sMin: 0.35, sMax: 3.2, headOn: 0.93 };\n    function meshScale(p, eye) {\n      return Math.max(ARROW.sMin, Math.min(ARROW.sMax, Math.hypot(p[0] - eye[0], p[1] - eye[1], p[2] - eye[2]) / ARROW.scaleBy));\n    }\n    function meshGeom(h, p, eye, sFit) {\n      const d = h.dir || [1, 0, 0];\n      const r = [p[0] - eye[0], p[1] - eye[1], p[2] - eye[2]], rl = Math.hypot(r[0], r[1], r[2]) || 1;\n      const s = sFit || Math.max(ARROW.sMin, Math.min(ARROW.sMax, rl / ARROW.scaleBy));\n      const dot6 = Math.abs((d[0] * r[0] + d[1] * r[1] + d[2] * r[2]) / rl);\n      const tipW = [p[0] + d[0] * ARROW.tip * s, p[1] + d[1] * ARROW.tip * s, p[2] + d[2] * ARROW.tip * s];\n      const headW = [p[0] + d[0] * ARROW.headAt * s, p[1] + d[1] * ARROW.headAt * s, p[2] + d[2] * ARROW.headAt * s];\n      const at = clientOfWorld(ctx, p), tip = clientOfWorld(ctx, tipW);\n      if (!at || !tip || !inView(ctx, tipW)) return null;\n      const v = [headW[0] - eye[0], headW[1] - eye[1], headW[2] - eye[2]];\n      let c = [d[1] * v[2] - d[2] * v[1], d[2] * v[0] - d[0] * v[2], d[0] * v[1] - d[1] * v[0]];\n      let cl = Math.hypot(c[0], c[1], c[2]);\n      if (cl < 1e-6) {\n        c = [0, 1, 0];\n        cl = 1;\n      }\n      const k = ARROW.headR * s / cl;\n      const h1 = clientOfWorld(ctx, [headW[0] + c[0] * k, headW[1] + c[1] * k, headW[2] + c[2] * k]);\n      const h2 = clientOfWorld(ctx, [headW[0] - c[0] * k, headW[1] - c[1] * k, headW[2] - c[2] * k]);\n      const thk = h1 && h2 ? Math.hypot(h1.x - h2.x, h1.y - h2.y) : 9;\n      const vx = tip.x - at.x, vy = tip.y - at.y, len = Math.hypot(vx, vy);\n      return { at, s, len, thk, headOn: dot6 >= ARROW.headOn, ux: len > 0.5 ? vx / len : null, uy: len > 0.5 ? vy / len : null, headW };\n    }\n    function shapeOf(q, m) {\n      const ux = Math.cos(q.deg * Math.PI / 180), uy = Math.sin(q.deg * Math.PI / 180), nx = -uy, ny = ux;\n      const hl = q.alen / 2 + m, ht = (q.athk || 9) / 2 + m;\n      return [\n        [q.x - ux * hl + nx * ht, q.y - uy * hl + ny * ht],\n        [q.x + ux * hl + nx * ht, q.y + uy * hl + ny * ht],\n        [q.x + ux * hl - nx * ht, q.y + uy * hl - ny * ht],\n        [q.x - ux * hl - nx * ht, q.y - uy * hl - ny * ht]\n      ];\n    }\n    function shapesHit(A, B) {\n      for (const P2 of [A, B]) for (let i = 0; i < P2.length; i++) {\n        const a = P2[i], b = P2[(i + 1) % P2.length], ax = -(b[1] - a[1]), ay = b[0] - a[0];\n        let p0 = Infinity, p1 = -Infinity, q0 = Infinity, q1 = -Infinity;\n        for (const v of A) {\n          const d = v[0] * ax + v[1] * ay;\n          if (d < p0) p0 = d;\n          if (d > p1) p1 = d;\n        }\n        for (const v of B) {\n          const d = v[0] * ax + v[1] * ay;\n          if (d < q0) q0 = d;\n          if (d > q1) q1 = d;\n        }\n        if (p1 <= q0 || q1 <= p0) return false;\n      }\n      return true;\n    }\n    function twinOf(g2, placed, alen) {\n      for (const q of placed) {\n        if (shapesHit(shapeOf(g2, 2), shapeOf(q, 2))) return true;\n        const dist2 = Math.hypot(g2.x - q.x, g2.y - q.y);\n        let dd = Math.abs(g2.deg - q.deg) % 360;\n        if (dd > 180) dd = 360 - dd;\n        if (dd <= TWIN_DEG && dist2 < Math.max(g2.alen || alen, q.alen)) return true;\n      }\n      return false;\n    }\n    function placeSize(u, h, env2, placed, sticky) {\n      const { eye, alen, athk, refPx, own: own2, oth } = env2;\n      const corner = env2.corner && h.dim !== \"h\";\n      let cands = candidateRoots(u, h).map((c, i) => ({ ...c, idx: i }));\n      const head = cands[0], faceC = cands.filter((c) => c.face >= 0 && !c.n), adj = cands.filter((c) => c.n);\n      adj.sort((a, b) => {\n        const fa = (a.n[0] * (eye[0] - a.p[0]) + a.n[1] * (eye[1] - a.p[1]) + a.n[2] * (eye[2] - a.p[2])) / (Math.hypot(eye[0] - a.p[0], eye[1] - a.p[1], eye[2] - a.p[2]) || 1);\n        const fb = (b.n[0] * (eye[0] - b.p[0]) + b.n[1] * (eye[1] - b.p[1]) + b.n[2] * (eye[2] - b.p[2])) / (Math.hypot(eye[0] - b.p[0], eye[1] - b.p[1], eye[2] - b.p[2]) || 1);\n        return fb - fa;\n      });\n      cands = [head].concat(faceC, adj);\n      if (sticky != null) {\n        const k = cands.findIndex((c) => c.idx === sticky);\n        if (k > 0) cands.unshift(cands.splice(k, 1)[0]);\n      }\n      const d = h.dir || [1, 0, 0];\n      const cs = ctx.canvasSize();\n      const gp = corner ? null : env2.gaps && env2.gaps[h.hid] || null;\n      const clearAt = (p, s, bs) => {\n        const L = ARROW.tip * s;\n        for (const t of [0.5, 1]) if (hitsAny(eye, [p[0] + d[0] * L * t, p[1] + d[1] * L * t, p[2] + d[2] * L * t], bs)) return false;\n        return true;\n      };\n      let best1 = null, best2 = null;\n      for (const c of cands) {\n        if (!corner && hitsAny(eye, c.p, own2) || hitsAny(eye, c.p, oth)) continue;\n        const g2 = screenOf(h, c.p, eye, refPx);\n        if (!g2) continue;\n        let sFit = null;\n        if (gp) {\n          const s0 = meshScale(c.p, eye), room = gp.gap + gp.sg * (gp.E - c.p[gp.ai]) - GAP_CLEAR;\n          if (ARROW.tip * s0 > room) {\n            sFit = room / ARROW.tip;\n            if (sFit < s0 * GAP_MIN_SCALE) continue;\n          }\n        }\n        const mg = meshGeom(h, c.p, eye, sFit);\n        if (!mg) continue;\n        if (sFit && mg.len < Math.min(GAP_MIN_PX, alen * GAP_MIN_SCALE)) continue;\n        if (mg.headOn && h.dim !== \"d\" && env2.active !== h.hid) continue;\n        if (!corner && hitsAny(eye, mg.headW, own2)) continue;\n        let len = Math.max(1, Math.round(mg.len));\n        const thk = Math.max(6, Math.round(mg.thk));\n        if (mg.ux != null) {\n          g2.ux = mg.ux;\n          g2.uy = mg.uy;\n          g2.deg = Math.atan2(g2.uy, g2.ux) * 180 / Math.PI;\n        }\n        if (len < thk) {\n          const back = (thk - len) / 2;\n          g2.at = { x: g2.at.x - g2.ux * back, y: g2.at.y - g2.uy * back };\n          len = thk;\n        }\n        const off = len * 0.5;\n        g2.x = g2.at.x + g2.ux * off;\n        g2.y = g2.at.y + g2.uy * off;\n        g2.alen = len;\n        g2.athk = thk;\n        g2.s = mg.s;\n        g2.p = c.p;\n        g2.idx = c.idx;\n        if (cs.w && cs.h) {\n          const m = 4, x0 = g2.at.x, y0 = g2.at.y, x1 = g2.at.x + g2.ux * len, y1 = g2.at.y + g2.uy * len;\n          if (Math.min(x0, x1) < m || Math.max(x0, x1) > cs.w - m || Math.min(y0, y1) < m || Math.max(y0, y1) > cs.h - m) continue;\n        }\n        if (twinOf(g2, placed, alen)) {\n          if (!best2) best2 = g2;\n          continue;\n        }\n        if (gp) {\n          if (!clearAt(c.p, mg.s, oth)) continue;\n          g2.tier = 0;\n          g2.gap = true;\n          return g2;\n        }\n        if (!gripOverNeighbour(u, { anchor: c.p }, g2.x, g2.y, g2.ux, g2.uy, len, thk)) {\n          g2.tier = 0;\n          return g2;\n        }\n        if (!best1) best1 = g2;\n      }\n      if (gp) {\n        const f = foot(u), y0 = u.y || 0, y1 = y0 + (u.h || 0);\n        const bi = gp.ai === 0 ? 2 : 0, bA = bi === 0 ? f.x0 : f.z0, bB = bi === 0 ? f.x1 : f.z1;\n        const ends = eye[1] >= (y0 + y1) / 2 ? [[y1, 1], [y0, -1]] : [[y0, -1], [y1, 1]];\n        const tries = [];\n        for (const e2 of ends) for (const t of [0.5, 0.2, 0.8]) tries.push([e2[0], e2[1], bA + (bB - bA) * t]);\n        for (let k = 0; k < tries.length; k++) {\n          const [ye, up2, bm] = tries[k];\n          if (up2 < 0 && ye < 60) continue;\n          const at = [0, 0, 0];\n          at[gp.ai] = gp.E - gp.sg * 12;\n          at[bi] = bm;\n          at[1] = ye;\n          const s0 = meshScale(at, eye), p = at.slice();\n          p[1] = ye + up2 * 30 * s0;\n          if (hitsAny(eye, p, own2) || hitsAny(eye, p, oth)) continue;\n          if (!clearAt(p, s0, own2.concat(oth))) continue;\n          const g2 = screenOf(h, p, eye, refPx);\n          if (!g2) continue;\n          const mg = meshGeom(h, p, eye);\n          if (!mg || mg.headOn) continue;\n          let len = Math.max(1, Math.round(mg.len));\n          const thk = Math.max(6, Math.round(mg.thk));\n          if (mg.ux != null) {\n            g2.ux = mg.ux;\n            g2.uy = mg.uy;\n            g2.deg = Math.atan2(g2.uy, g2.ux) * 180 / Math.PI;\n          }\n          g2.x = g2.at.x + g2.ux * len * 0.5;\n          g2.y = g2.at.y + g2.uy * len * 0.5;\n          g2.alen = len;\n          g2.athk = thk;\n          g2.s = mg.s;\n          g2.p = p;\n          g2.idx = 100 + k;\n          g2.gap = true;\n          g2.leader = [p.slice(), at.slice()];\n          if (cs.w && cs.h) {\n            const m = 4, x1 = g2.at.x + g2.ux * len, y1s = g2.at.y + g2.uy * len;\n            if (Math.min(g2.at.x, x1) < m || Math.max(g2.at.x, x1) > cs.w - m || Math.min(g2.at.y, y1s) < m || Math.max(g2.at.y, y1s) > cs.h - m) continue;\n          }\n          if (twinOf(g2, placed, alen)) {\n            if (!best2) best2 = g2;\n            continue;\n          }\n          g2.tier = 0;\n          return g2;\n        }\n      }\n      if (best1) {\n        best1.tier = 1;\n        return best1;\n      }\n      if (best2) {\n        best2.tier = 2;\n        return best2;\n      }\n      return null;\n    }\n    function layout() {\n      if (!shown()) return [];\n      const u = ctx.sel();\n      const active = st.activeHandle && st.activeHandle.indexOf(u.id + \":\") !== 0 ? null : st.activeHandle;\n      const span2 = gripRefSpan() || projectedSpan(u);\n      const faint = span2 < 150;\n      const alen = clamp4(Math.round(span2 * 0.34), 26, 92), athk = Math.max(9, Math.round(alen * 0.3));\n      const eye = ctx.camEye();\n      const corner = isCornerUnit(u);\n      const env2 = { eye, alen, athk, refPx: span2 / GRIP_REF_MM, corner, own: boxesOf(u, 3), oth: [], active, gaps: {} };\n      for (const v of scene.units) if (v && v.id !== u.id) env2.oth.push(...boxesOf(v, 3));\n      const prevScreen = st.handleScreen || {};\n      st.handleScreen = {};\n      const hs = forSel(u);\n      for (const h of hs) {\n        const gp = widthGap(scene.units, u, h);\n        if (gp) env2.gaps[h.hid] = gp;\n      }\n      const out = hs.map((h) => ({ hid: h.hid, visible: false }));\n      const byHid = {};\n      out.forEach((it) => {\n        byHid[it.hid] = it;\n      });\n      const placed = [];\n      function show2(h, g2) {\n        const it = byHid[h.hid];\n        it.visible = true;\n        it.kind = h.kind;\n        it.fore = g2.fore;\n        it.x = Math.round(g2.x);\n        it.y = Math.round(g2.y);\n        it.deg = g2.deg;\n        it.alen = g2.alen;\n        it.athk = h.compact ? Math.max(9, Math.round(g2.alen * 0.3)) : g2.athk || athk;\n        if (h.kind === \"size\") {\n          it.s = g2.s;\n          it.dir = (h.dir || [1, 0, 0]).slice();\n        }\n        it.passive = !scene.sizeMode && h.kind === \"size\";\n        it.active = active === h.hid;\n        it.root = g2.p;\n        it.alt = !!(g2.idx > 0);\n        it.tier = g2.tier || 0;\n        it.gap = !!g2.gap;\n        it.leader = g2.leader || null;\n        it.mesh = h.kind === \"size\";\n        it.rootX = Math.round(g2.at.x);\n        it.rootY = Math.round(g2.at.y);\n        it.ux = g2.ux;\n        it.uy = g2.uy;\n        it.gripX = it.rootX;\n        it.gripY = it.rootY;\n        it.gripHalf = gripHalf(it.alen);\n        if (h.kind === \"size\") {\n          const GRIP_CLEAR = gripHalf(it.alen) + 19 + 2;\n          const plus = ctx.quickAdd && ctx.quickAdd.layout ? ctx.quickAdd.layout() : [];\n          const gap = (x, y) => Math.min(Infinity, ...plus.map((p) => Math.max(Math.abs(p.x - x), Math.abs(p.y - y))));\n          if (plus.length && gap(it.rootX, it.rootY) < GRIP_CLEAR) {\n            let best2 = { x: it.rootX, y: it.rootY, g: gap(it.rootX, it.rootY) };\n            for (const sgn of [-1, 1]) {\n              for (let t = 2; t <= 120; t += 2) {\n                const x = it.rootX + g2.ux * t * sgn, y = it.rootY + g2.uy * t * sgn, q = gap(x, y);\n                if (q > best2.g) best2 = { x, y, g: q };\n                if (q >= GRIP_CLEAR) break;\n              }\n              if (best2.g >= GRIP_CLEAR) break;\n            }\n            it.gripX = Math.round(best2.x);\n            it.gripY = Math.round(best2.y);\n          }\n        }\n        it.label = h.label;\n        it.title = handleTitle(h);\n        it.showLabel = active === h.hid || !active && !faint;\n        it.faint = !active;\n        it.labelX = Math.round(g2.x - g2.ux * g2.alen * 0.3);\n        it.labelY = Math.round(g2.y - g2.uy * g2.alen * 0.3 - it.athk - 8);\n        placed.push({ x: it.x, y: it.y, deg: it.deg, alen: it.alen, athk: it.athk });\n        st.handleScreen[h.hid] = { idx: g2.idx, px: g2.pxmm, ux: g2.ux, uy: g2.uy, custom: !!(it.alt || g2.custom) };\n      }\n      for (const h of hs) {\n        if (h.kind === \"size\") continue;\n        const g2 = eye ? screenOf(h, h.anchor, eye, env2.refPx) : null;\n        if (!g2) continue;\n        const a2 = clamp4(Math.round(span2 * 0.2), 20, 54);\n        g2.x = g2.at.x;\n        g2.y = g2.at.y;\n        g2.alen = a2;\n        g2.p = h.anchor;\n        g2.idx = 0;\n        g2.custom = false;\n        show2(h, g2);\n      }\n      if (!eye) return out;\n      const sticky = (h) => active === h.hid && prevScreen[h.hid] ? prevScreen[h.hid].idx : null;\n      const size3 = hs.filter((h) => h.kind === \"size\");\n      if (corner) {\n        for (const h of size3) {\n          const g2 = placeSize(u, h, env2, placed, sticky(h));\n          if (!g2) continue;\n          const headMm = Math.min(600, alen * 0.8 / (g2.pxmm || 1));\n          if (!sizeHandleSeen(eye, h, u, headMm).seen && active !== h.hid) continue;\n          show2(h, g2);\n        }\n        const twins = twinArrows(out);\n        for (const it of out) if (twins[it.hid] && it.hid !== active) it.visible = false;\n        return out;\n      }\n      const hH = size3.find((h) => h.dim === \"h\"), hD = size3.find((h) => h.dim === \"d\");\n      const depthOn = hD && (planFacing(u, hD.dir, eye) >= -FACE_AWAY || active === hD.hid);\n      const ends = size3.filter((h) => h.dim === \"w\" && h.edge).map((h) => ({ h, facing: planFacing(u, h.dir, eye), gap: !!env2.gaps[h.hid] })).sort((a, b) => b.facing - a.facing);\n      function run(order) {\n        const pl = placed.slice(), dec = [];\n        const take = (h, g2) => {\n          dec.push({ h, g: g2 });\n          pl.push({ x: g2.x, y: g2.y, deg: g2.deg, alen: g2.alen, athk: g2.athk });\n        };\n        let missing = 0;\n        for (const k of order) {\n          if (k === \"h\" && hH) {\n            const g2 = placeSize(u, hH, env2, pl, sticky(hH));\n            if (g2) take(hH, g2);\n            else missing++;\n          }\n          if (k === \"d\" && depthOn) {\n            const g2 = placeSize(u, hD, env2, pl, sticky(hD));\n            if (g2) take(hD, g2);\n            else missing++;\n          }\n          if (k === \"w\" && ends.length) {\n            const res = [];\n            for (const e of ends) {\n              if (e.facing < -WIDTH_SPARE && active !== e.h.hid) continue;\n              const g2 = placeSize(u, e.h, env2, pl, sticky(e.h));\n              if (g2) res.push({ ...e, g: g2, prim: e.facing >= -FACE_AWAY || active === e.h.hid || e.gap && !!g2.gap });\n            }\n            const gapIn = res.some((r) => r.gap && r.g.gap && r.g.tier === 0);\n            const clean = res.filter((r) => (r.prim || gapIn) && r.g.tier === 0);\n            if (clean.length) for (const r of clean) take(r.h, r.g);\n            else if (res.length) {\n              res.sort((a, b) => a.g.tier - b.g.tier || (b.prim ? 1 : 0) - (a.prim ? 1 : 0) || b.facing - a.facing);\n              take(res[0].h, res[0].g);\n            } else missing++;\n          }\n        }\n        const cost = missing * 100 + dec.reduce((c, d) => c + (d.g.tier === 2 ? 10 : d.g.tier), 0);\n        return { dec, cost };\n      }\n      let best = null;\n      for (const order of [[\"h\", \"d\", \"w\"], [\"h\", \"w\", \"d\"], [\"d\", \"w\", \"h\"], [\"w\", \"d\", \"h\"]]) {\n        const r = run(order);\n        if (!best || r.cost < best.cost) best = r;\n        if (best.cost === 0) break;\n      }\n      for (const d of best.dec) show2(d.h, d.g);\n      for (const h of size3) if (h !== hH && h !== hD && !(h.dim === \"w\" && h.edge)) {\n        const g2 = placeSize(u, h, env2, placed, sticky(h));\n        if (g2) show2(h, g2);\n      }\n      return out;\n    }\n    function list() {\n      const u = ctx.sel();\n      return u ? forSel(u) : [];\n    }\n    function edit() {\n      const u = ctx.sel();\n      return u ? editHandles(u) : [];\n    }\n    function handleById(hid) {\n      const u = ctx.sel();\n      if (!u) return null;\n      let got = null;\n      const e = editHandles(u);\n      for (let i = 0; i < e.length; i++) if (e[i].hid === hid) got = e[i];\n      if (!got) {\n        const s = forSel(u);\n        for (let i = 0; i < s.length; i++) if (s[i].hid === hid) got = s[i];\n      }\n      return got;\n    }\n    function mmToPx(hid, mm) {\n      const u = ctx.sel();\n      if (!u) return null;\n      let h = null;\n      const s = forSel(u);\n      for (let i = 0; i < s.length; i++) if (s[i].hid === hid) h = s[i];\n      if (!h) {\n        const e = editHandles(u);\n        for (let i = 0; i < e.length; i++) if (e[i].hid === hid) h = e[i];\n      }\n      if (!h) return null;\n      const hsn = st.handleScreen && st.handleScreen[hid];\n      if (hsn && hsn.custom) return { dx: hsn.ux * hsn.px * mm, dy: hsn.uy * hsn.px * mm };\n      const a = clientOfWorld(ctx, h.anchor);\n      const d = h.dir || [1, 0, 0];\n      const b = clientOfWorld(ctx, [h.anchor[0] + d[0] * 100, h.anchor[1] + d[1] * 100, h.anchor[2] + d[2] * 100]);\n      if (!a || !b) return null;\n      const k = mm / 100;\n      return { dx: (b.x - a.x) * k, dy: (b.y - a.y) * k };\n    }\n    function arrowFor(k, edge) {\n      const u = ctx.sel();\n      if (!u) return null;\n      const want = k + \":\" + edge;\n      const alt = edge === \"hi\" ? k + \":only\" : null;\n      const L = layout();\n      const vis = {};\n      for (let i = 0; i < L.length; i++) if (L[i].visible) vis[L[i].hid] = true;\n      let got = null;\n      const s = forSel(u);\n      for (let i = 0; i < s.length; i++) {\n        const h = s[i];\n        const key = h.dim + \":\" + (h.edge || \"only\");\n        if ((key === want || alt && key === alt) && vis[h.hid]) got = h.hid;\n      }\n      return got;\n    }\n    function setActive(hid) {\n      st.activeHandle = hid || null;\n      syncHandlesState();\n      ctx.changed(\"handles\");\n    }\n    function startDrag(hid, e) {\n      const hh = handleById(hid);\n      if (hh && hh.kind === \"size\" && !scene.sizeMode) return;\n      if (!scene.partsMode && !scene.sizeMode) return;\n      const u = ctx.sel();\n      if (!u) return;\n      const h = handleById(hid);\n      if (!h) return;\n      if (e) {\n        if (e.preventDefault) e.preventDefault();\n        if (e.stopPropagation) e.stopPropagation();\n      }\n      ctx.view.holdCamera();\n      if (ctx.radial) ctx.radial.close();\n      setActive(hid);\n      const hsn = st.handleScreen && st.handleScreen[hid];\n      const conv = hsn && hsn.custom ? { px: hsn.px, ux: hsn.ux, uy: hsn.uy } : pxPerMmAlongDir(ctx, h);\n      st.handleDrag = {\n        hid,\n        dim: h.dim,\n        edge: h.edge,\n        axis: h.axis,\n        start: h.value,\n        px: e ? e.clientX : 0,\n        py: e ? e.clientY : 0,\n        conv,\n        u,\n        moved: false,\n        snapKey: null,\n        /* where every cabinet stood at pointer-down: a width pushing the run is measured from there */\n        origin: Object.fromEntries(scene.units.map((v) => [v.id, { x: v.x, z: v.z }])),\n        /* a whole arm, not an edge: apply then re-seat */\n        wholeArm: h.edge == null,\n        /* the two world ends of this dimension, captured ONCE\n           so the snap and the resize share one fixed basis */\n        base: resizeBase(u, h.dim),\n        /* the geometry to put back if the drag is cancelled */\n        snap: { x: u.x, z: u.z, y: u.y, w: u.w, w2: u.w2, h: u.h, d: u.d }\n      };\n      ctx.hist.begin(\"resize cabinet\");\n      ctx.alignTempOn();\n    }\n    function cancelDrag() {\n      const hd = st.handleDrag;\n      if (!hd) return false;\n      const u = hd.u, s = hd.snap;\n      u.x = s.x;\n      u.z = s.z;\n      u.y = s.y;\n      u.w = s.w;\n      u.w2 = s.w2;\n      u.h = s.h;\n      u.d = s.d;\n      if (hd.origin) for (const v of scene.units) {\n        const o = hd.origin[v.id];\n        if (o && v !== u) {\n          v.x = o.x;\n          v.z = o.z;\n        }\n      }\n      ctx.hist.abort();\n      st.handleDrag = null;\n      ctx.alignTempOff();\n      scene.resizeSnap = null;\n      ctx.cue(\"Cancelled\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function move(e) {\n      const hd = st.handleDrag;\n      if (!hd) return;\n      if (e.preventDefault) e.preventDefault();\n      noteTravel(hd, e, hd.px, hd.py);\n      const dx = e.clientX - hd.px, dy = e.clientY - hd.py;\n      const along2 = (dx * hd.conv.ux + dy * hd.conv.uy) / hd.conv.px;\n      let want = hd.start + along2;\n      want = Math.round(want / 5) * 5;\n      const edg = hd.edge || \"hi\";\n      const sn = resizeSnap(scene.units, hd.u, hd.dim, want, edg, hd.base, hd.snapKey);\n      if (sn) {\n        want = sn.size;\n        hd.snapKey = sn.key;\n      }\n      scene.resizeSnap = sn ? { k: hd.dim, at: sn.size, why: sn.why, otherId: sn.other.id } : null;\n      let r;\n      if (hd.wholeArm) {\n        ctx.size.applyDim(hd.u, hd.dim, want);\n        const now = ctx.size.currentDim(hd.u, hd.dim);\n        r = { ok: true, value: now, clamped: Math.abs(now - want) > 0.51 };\n      } else {\n        r = hd.dim === \"w\" ? resizeWithPush(scene.units, hd.u, hd.dim, want, edg, hd.origin) : resizeFromEdge(scene.units, hd.u, hd.dim, want, edg);\n      }\n      if (r && r.ok) {\n        hd.moved = true;\n        hd.lastMsg = r.push > 0 && !r.clamped ? Math.round(r.value) + \" mm - \" + (r.pushed.length === 1 ? displayName(scene.units, scene.units.find((v) => v.id === r.pushed[0])) : r.pushed.length + \" cabinets\") + \" moved along \" + Math.round(r.push) + \" mm\" : r.clamped ? \"Stopped at \" + r.value + \" mm - \" + (r.opening ? r.opening.label + (r.opening.kind === \"door\" ? \" - its doorway stays clear\" : \" - it would cover it\") : \"it meets the next cabinet\") : sn ? \"Lined up with the \" + sn.why + \" of \" + displayName(scene.units, sn.other) + \" - \" + r.value + \" mm\" : Math.round(r.value) + \" mm\";\n        ctx.cue(hd.lastMsg);\n        ctx.syncControls();\n        ctx.refresh();\n      } else if (r && r.why) {\n        hd.lastMsg = r.why;\n        ctx.cue(r.why);\n      }\n    }\n    function up() {\n      const hd = st.handleDrag;\n      if (!hd) return;\n      if (hd.moved) ctx.hist.commit();\n      else ctx.hist.abort();\n      const keep = hd.lastMsg || null;\n      scene.resizeSnap = null;\n      st.handleDrag = null;\n      ctx.alignTempOff();\n      scene.resizeSnap = null;\n      if (keep) ctx.cue(keep);\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    const ARROWS_DRAWN = false;\n    function meshArrows() {\n      if (!ARROWS_DRAWN || !scene.sizeMode) return [];\n      return layout().filter((it) => it.visible && it.kind === \"size\" && it.s).map((it) => ({\n        hid: it.hid,\n        p: it.root,\n        dir: it.dir,\n        s: it.s,\n        leader: it.leader || null,\n        hot: st.activeHandle === it.hid || st.hoverHandle === it.hid\n      }));\n    }\n    function setHover(hid) {\n      if (st.hoverHandle === (hid || null)) return;\n      st.hoverHandle = hid || null;\n      if (ctx.frame) ctx.frame();\n      else ctx.changed(\"frame\");\n    }\n    const handles = {\n      meshArrows,\n      setHover,\n      list,\n      edit,\n      layout,\n      mmToPx,\n      arrowFor,\n      handleById,\n      setActive,\n      startDrag,\n      cancelDrag,\n      move,\n      up,\n      rotateViewOn: rotateOn,\n      interiorHandlesFor: (u) => interiorHandlesFor(scene, u),\n      handlesForSelection: forSel,\n      handleTitle,\n      PART_AXIS,\n      active: () => st.activeHandle\n    };\n    ctx.handles = handles;\n    ctx.syncHandlesState = syncHandlesState;\n    return handles;\n  }\n\n  // v2/src/model/drawer-box.js\n  function wholeMm2(b) {\n    const minMm = Math.ceil(b.min - 1e-6);\n    const maxMm = Math.max(minMm, Math.floor(b.max + 1e-6));\n    b.minMm = minMm;\n    b.maxMm = maxMm;\n    b.mm = Math.min(maxMm, Math.max(minMm, Math.round(b.h)));\n    return b;\n  }\n  function ownDrawers(u) {\n    return !!u && (u.type === \"base-drawer\" || u.type === \"base-4drawer\");\n  }\n  function boxOf2(list, i) {\n    return (list || []).find((b) => b && b.i === i) || null;\n  }\n  function hasDrawerBoxes(u) {\n    return ownDrawers(u) && ownOut(u).size < ownCount(u) || hasAddedDrawers(u);\n  }\n  function addedBoxes(u, from) {\n    return addedDrawers(u).map((d, j) => wholeMm2({\n      i: from + j,\n      xn: d.n,\n      name: d.name + \" box\",\n      h: d.h,\n      def: d.def,\n      max: d.max,\n      min: d.min,\n      by0: d.by0,\n      by1: d.by1,\n      fy0: d.fy0,\n      fy1: d.fy1,\n      w: d.w,\n      l: d.l,\n      x0: d.x0,\n      x1: d.x1,\n      open: d.open,\n      band: d.band,\n      col: d.col\n    }));\n  }\n  function drawerOfPart(u, name2) {\n    if (!name2) return -1;\n    if (u.type === \"base-drawer\" && /^Drawer (front|box)( |$)/.test(name2)) return 0;\n    let best = -1, bestLen = -1;\n    for (const b of drawerBoxes(u)) {\n      const front = b.name.replace(/ box$/, \"\");\n      if ((name2 === b.name || name2 === front || name2.indexOf(front + \" \") === 0) && front.length > bestLen) {\n        best = b.i;\n        bestLen = front.length;\n      }\n    }\n    return best;\n  }\n  function drawerBoxes(u) {\n    if (!hasDrawerBoxes(u)) return [];\n    const out = ownOut(u), own2 = ownBoxes(u).filter((b) => !out.has(b.i));\n    return own2.concat(addedBoxes(u, ownCount(u)));\n  }\n  function ownBoxes(u) {\n    if (!ownDrawers(u)) return [];\n    if (u.type === \"base-drawer\") {\n      const g2 = drawerParts(u);\n      const fy1 = g2.fy1, fy0 = fy1 - g2.frontH;\n      return [wholeMm2({\n        i: 0,\n        name: \"Drawer box\",\n        h: g2.boxH,\n        def: g2.boxDef,\n        max: g2.boxMax,\n        min: BOX_MIN_H,\n        by0: g2.by0,\n        by1: g2.by1,\n        fy0,\n        fy1,\n        w: g2.boxOuter,\n        l: g2.boxL,\n        x0: (u.w - g2.boxOuter) / 2,\n        x1: (u.w + g2.boxOuter) / 2\n      })];\n    }\n    return drawer4Parts(u).map((g2) => wholeMm2({\n      i: g2.i,\n      name: g2.name + \" box\",\n      h: g2.boxH,\n      def: g2.boxDef,\n      max: g2.boxMax,\n      min: BOX_MIN_H,\n      by0: g2.by0,\n      by1: g2.by1,\n      fy0: g2.fy0,\n      fy1: g2.fy1,\n      w: g2.boxOuter,\n      l: g2.boxL,\n      x0: (u.w - g2.boxOuter) / 2,\n      x1: (u.w + g2.boxOuter) / 2\n    }));\n  }\n  function transferPreset(u, i, v, lx, ly) {\n    if (!u || !v) return { ok: false, why: \"Carry the drawer over a cabinet\" };\n    if (!ownDrawers(u)) return { ok: false, why: \"That is not one of the cabinet's own drawers\" };\n    const out = ownOut(u);\n    const b = out.has(i) ? null : boxOf2(ownBoxes(u), i);\n    if (!b) return { ok: false, why: \"That drawer is not there any more\" };\n    const name2 = b.name.replace(/ box$/, \"\"), fh = Math.round(b.fy1 - b.fy0), wasOpen = u.type === \"base-4drawer\" ? !!(u.drawers && u.drawers[i]) : !!(u.drawerOpen || u.drawers && u.drawers[0]);\n    const self = u === v || u.id === v.id;\n    const keep = (x) => ({\n      dOut: x.dOut === void 0 ? void 0 : x.dOut.slice(),\n      xdr: x.xdr === void 0 ? void 0 : x.xdr.slice(),\n      xopen: x.xopen === void 0 ? void 0 : x.xopen.slice(),\n      drawers: x.drawers === void 0 ? void 0 : x.drawers.slice(),\n      drawerOpen: x.drawerOpen\n    });\n    const back = (x, k) => {\n      for (const key of Object.keys(k)) {\n        if (k[key] === void 0) delete x[key];\n        else x[key] = k[key];\n      }\n    };\n    const ku = keep(u), kv = self ? null : keep(v);\n    const undo = (r) => {\n      back(u, ku);\n      if (!self) back(v, kv);\n      return r;\n    };\n    u.dOut = Array.from(new Set((Array.isArray(u.dOut) ? u.dOut : []).concat([i]))).sort((p, q) => p - q);\n    if (u.type === \"base-4drawer\") {\n      if (Array.isArray(u.drawers)) {\n        const d2 = u.drawers.slice();\n        d2[i] = false;\n        u.drawers = d2;\n      }\n    } else {\n      u.drawerOpen = false;\n      if (Array.isArray(u.drawers)) {\n        const d2 = u.drawers.slice();\n        d2[0] = false;\n        u.drawers = d2;\n      }\n    }\n    const L = landIn(v, { name: name2, fh, mm: b.mm, bh: b.mm }, lx, ly);\n    if (!L.ok) return undo({ ...L, from: { id: u.id, i, name: name2 } });\n    if (self && Math.abs(L.y - b.fy0) <= 1) return undo({ ok: true, same: true, name: name2, from: { id: u.id, i, name: name2 } });\n    v.xdr = xdrRecords(v).concat([{ ...L.rec, y: L.y }]);\n    const d = drawerByN(v, L.nv);\n    if (!d || Math.abs(d.fh - fh) > 0.5 || Math.abs(d.mm - b.mm) > 0.5)\n      return undo({ ok: false, why: \"No room for \" + name2 + \" there as it is (its front and box would not keep their sizes)\", section: L.section, from: { id: u.id, i, name: name2 } });\n    if (wasOpen) v.xopen = (Array.isArray(v.xopen) ? v.xopen : []).concat([L.nv]);\n    return { ok: true, n: L.nv, name: \"Drawer \" + L.nv, was: name2, y: L.y, section: L.section, fh, box: d.mm, asked: L.want, from: { id: u.id, i, name: name2 }, transfer: !self, same: false };\n  }\n  function previewPresetTransfer(u, i, v, lx, ly) {\n    if (!u || !v) return { ok: false, why: \"Carry the drawer over a cabinet\" };\n    const self = u === v || u.id === v.id;\n    const cu = JSON.parse(JSON.stringify(u)), cv = self ? cu : JSON.parse(JSON.stringify(v));\n    const r = transferPreset(cu, i, cv, lx, ly);\n    if (!r.ok || r.same) return r;\n    const d = drawerByN(cv, r.n);\n    if (!d) return { ok: false, why: \"No room for the drawer there\" };\n    return {\n      ...r,\n      boxRect: { x0: d.x0, x1: d.x1, y0: d.by0, y1: d.by1, z0: d.bz0, z1: d.bz0 + d.l },\n      box: { x0: d.x0, x1: d.x1, y0: d.by0, y1: d.by1, z0: d.bz0, z1: d.bz0 + d.l },\n      boxMm: d.mm,\n      front: cv.drawerFronts === false ? null : { x0: d.fx0, x1: d.fx1, y0: d.fy0, y1: d.fy1 }\n    };\n  }\n  function setDrawerBoxH(u, i, h) {\n    const list = drawerBoxes(u);\n    const b = boxOf2(list, i);\n    const asked = Number(h);\n    if (!b || !(asked > 0) || !isFinite(asked)) return null;\n    const want = Math.round(asked);\n    if (b.xn != null) return setAddedBoxH(u, b.xn, asked);\n    const fit = Math.min(Math.max(want, b.minMm), b.maxMm);\n    const arr = Array.isArray(u.boxH) ? u.boxH.slice() : [];\n    const own2 = ownCount(u);\n    while (arr.length < own2) arr.push(null);\n    arr.length = own2;\n    arr[i] = fit;\n    u.boxH = arr;\n    return { h: fit, asked, max: b.maxMm, min: b.minMm, clamped: fit !== want };\n  }\n  var DRAWER_BOX_DEFAULT = DRW.boxH;\n  var FRONT_MIN = BOX_MIN_H;\n  var r19 = (v) => Math.round(v * 10) / 10;\n  function linkedEdge(u, b) {\n    if (!b) return \"top\";\n    if (b.xn == null) return u.type === \"base-drawer\" || u.type === \"base-4drawer\" && b.i === 0 ? \"bottom\" : \"top\";\n    const list = drawerBoxes(u), hit2 = list.find((x) => x.xn === b.xn), i = hit2 ? hit2.i : -1;\n    if (i < 0) return \"top\";\n    if (canGrow(u, i, \"top\")) return \"top\";\n    return canGrow(u, i, \"bottom\") ? \"bottom\" : \"top\";\n  }\n  function bankGiver(i) {\n    return i === 0 ? 1 : i - 1;\n  }\n  function applyChanges(u, list, changes) {\n    const want = {};\n    const own2 = ownBoxes(u), nOwn = ownCount(u);\n    const arr = Array.isArray(u.boxH) ? u.boxH.slice() : [];\n    while (arr.length < nOwn) arr.push(null);\n    arr.length = nOwn;\n    let fr = null, ownTouched = false;\n    let recs = Array.isArray(u.xdr) ? u.xdr.slice() : null;\n    for (const c of changes) {\n      const b = boxOf2(list, c.i) || (ownOut(u).has(c.i) ? boxOf2(own2, c.i) : null);\n      if (!b) return null;\n      const d = c.fh - (b.fy1 - b.fy0);\n      if (b.xn != null) {\n        const k = recs ? recs.findIndex((r) => r.n === b.xn) : -1;\n        if (k < 0) return null;\n        const y = c.edge === \"bottom\" ? Math.round(recs[k].y - d) : recs[k].y;\n        const wantBox = Number(recs[k].bh) > 0 ? Number(recs[k].bh) : Math.round(b.h);\n        recs[k] = { ...recs[k], y, fh: Math.round(c.fh), bh: Math.round(wantBox) };\n        want[c.i] = { fh: Math.round(c.fh), bh: Math.round(b.h), wantBox: Math.round(wantBox), added: true };\n      } else if (u.type === \"base-drawer\") {\n        u.dfH = [r19(c.fh)];\n        arr[0] = r19(b.h);\n        ownTouched = true;\n        want[0] = { fh: r19(c.fh), bh: arr[0] };\n      } else {\n        if (!fr) fr = own2.map((x) => x.fy1 - x.fy0);\n        fr[c.i] = c.fh;\n        arr[c.i] = r19(boxOf2(own2, c.i).h);\n        ownTouched = true;\n        want[c.i] = { fh: c.fh, bh: arr[c.i] };\n      }\n    }\n    if (recs) u.xdr = recs;\n    if (fr) u.dfH = fr;\n    if (ownTouched) u.boxH = arr;\n    return want;\n  }\n  function changesFor(u, list, i, fh, edge) {\n    const b = boxOf2(list, i);\n    if (b.xn == null && u.type === \"base-4drawer\") {\n      const j = bankGiver(i), d = fh - (b.fy1 - b.fy0), g2 = boxOf2(list, j) || boxOf2(ownBoxes(u), j);\n      return [{ i, fh, edge }, { i: j, fh: g2.fy1 - g2.fy0 - d, edge: j < i ? \"bottom\" : \"top\", slot: ownOut(u).has(j) }];\n    }\n    return [{ i, fh, edge }];\n  }\n  function applyLinked(u, list, i, fh, edge) {\n    return applyChanges(u, list, changesFor(u, list, i, fh, edge));\n  }\n  function boardsOf(u, interiorParts2) {\n    return (interiorParts2(u) || []).filter((q) => q.kind === \"shelf\" || q.kind === \"fixed-h\").map((q) => [q.kind, r19(q.x0), r19(q.x1), r19(q.y0), r19(q.y1)].join(\":\"));\n  }\n  function linkedWhy(u, i, fh, edge) {\n    const list = drawerBoxes(u);\n    if (!boxOf2(list, i)) return \"That drawer is not there any more\";\n    return changesWhy(u, changesFor(u, list, i, fh, edge), i);\n  }\n  function changesWhy(u, changes, i) {\n    const interiorParts2 = interiorParts;\n    const list = drawerBoxes(u), b = boxOf2(list, i);\n    if (!b) return \"That drawer is not there any more\";\n    for (const ch of changes) if (ch.slot && !(ch.fh >= FRONT_MIN - 0.05)) return \"the open slot beside it would be lower than the \" + FRONT_MIN + \" mm a drawer front needs\";\n    const c = JSON.parse(JSON.stringify(u));\n    const want = applyChanges(c, list, changes);\n    if (!want) return \"That drawer is not there any more\";\n    const fh = want[i] ? want[i].fh : b.fy1 - b.fy0;\n    const after = drawerBoxes(c);\n    if (after.length !== list.length || after.some((x, k) => x.xn == null !== (list[k].xn == null) || x.xn != null && x.xn !== list[k].xn)) {\n      const gone = list.find((o) => o.xn != null && !after.some((x) => x.xn === o.xn));\n      if (!gone || gone === b) return \"it would not fit in its section\";\n      return \"it would run into \" + gone.name.replace(/ box$/, \"\");\n    }\n    for (let k = 0; k < after.length; k++) {\n      const a = after[k], w = want[a.i], fa = a.fy1 - a.fy0;\n      if (w) {\n        if (fa < FRONT_MIN - 0.05) return \"a drawer front cannot be lower than \" + FRONT_MIN + \" mm\";\n        if (Math.abs(fa - w.fh) > 0.6) return list[k].name.replace(/ box$/, \"\") + \"'s front would not fit\";\n        if (a.max != null && a.max < (w.added ? w.wantBox : w.bh) - 1e-6)\n          return (a.i === i ? \"its\" : list[k].name.replace(/ box$/, \"\") + \"'s\") + \" box is \" + Math.round(w.added ? w.wantBox : w.bh) + \" mm high - a \" + Math.round(fa) + \" mm front leaves room for \" + Math.floor(a.max) + \" mm; make the box lower first\";\n        if ((w.added ? w.wantBox : w.bh) < BOX_MIN_H) return (a.i === i ? \"its\" : list[k].name.replace(/ box$/, \"\") + \"'s\") + \" box would be lower than the \" + BOX_MIN_H + \" mm a box can be built at\";\n        const expect = w.added ? Math.max(BOX_MIN_H, Math.min(w.wantBox, a.max)) : w.bh;\n        const held = w.added && Math.abs(a.h - expect) <= 0.6 && a.h >= BOX_MIN_H - 0.05 && w.wantBox >= BOX_MIN_H - 0.05;\n        if (Math.abs(a.h - w.bh) > 0.6 && !held) return (a.i === i ? \"its box\" : list[k].name.replace(/ box$/, \"\") + \"'s box\") + \" would run into \" + (a.xn != null ? \"what is above it\" : k === 0 ? \"the top rails\" : \"the drawer above\");\n      } else {\n        const o = list[k];\n        if (Math.abs(a.h - o.h) > 0.05 || Math.abs(a.by0 - o.by0) > 0.05 || Math.abs(a.fy0 - o.fy0) > 0.05 || Math.abs(a.fy1 - o.fy1) > 0.05)\n          return \"it would run into \" + o.name.replace(/ box$/, \"\");\n      }\n    }\n    for (let p = 0; p < after.length; p++) for (let q = p + 1; q < after.length; q++) {\n      const A = after[p], B = after[q];\n      if (!(A.x0 < B.x1 - 0.01 && B.x0 < A.x1 - 0.01)) continue;\n      if (A.by0 - 10 < B.by1 - 0.01 && B.by0 - 10 < A.by1 - 0.01 && (want[A.i] || want[B.i]))\n        return \"its box would run into \" + (want[A.i] ? B : A).name.replace(/ box$/, \"\") + \"'s\";\n    }\n    if (c.type === \"base-drawer\") {\n      const G = drawerParts(c);\n      if (!(G.doorH > 0.5)) return \"there would be no room left for the door under it\";\n      if (want[0] && boxOf2(list, 0) && boxOf2(list, 0).xn == null && Math.abs(G.frontH - want[0].fh) > 0.6) return \"the front would not fit over the door\";\n    }\n    const d0 = doorSegs(u), d1 = doorSegs(c);\n    if (d1.length !== d0.length) return \"the door \" + (d1.length < d0.length ? \"beside it would disappear - take the door off first (Remove door) if that is meant\" : \"would split\");\n    for (let k = 0; k < d1.length; k++) {\n      const h0 = d0[k].y1 - d0[k].y0, h1 = d1[k].y1 - d1[k].y0;\n      if (h1 < h0 - 0.05 && h1 < FRONT_MIN - 0.05) return \"the door beside it would be lower than the \" + FRONT_MIN + \" mm a front can be\";\n    }\n    void fh;\n    if (interiorParts2) {\n      const was = boardsOf(u, interiorParts2).join(\"|\"), now = boardsOf(c, interiorParts2).join(\"|\");\n      if (was !== now) return \"a shelf inside is in the way - move or remove it in Interior\";\n      const boards = (interiorParts2(c) || []).filter((q) => q.kind === \"shelf\" || q.kind === \"fixed-h\");\n      for (const k of Object.keys(want)) {\n        const a = boxOf2(after, Number(k));\n        if (!a || a.xn != null) continue;\n        for (const q of boards) if (q.x0 < a.x1 && a.x0 < q.x1 && q.y0 < a.by1 - 0.01 && a.by0 - 10 < q.y1 - 0.01)\n          return \"a shelf at \" + Math.round(q.y0) + \" mm is in the way - move or remove it in Interior\";\n      }\n    }\n    return null;\n  }\n  var GAP = 4;\n  function isTallU(u) {\n    return /^tall-/.test(u.type);\n  }\n  function doorSegs(u) {\n    if (!u || !u.door) return [];\n    if (isTallU(u)) return tallLeaves(u).map((lf) => ({ y0: lf.y0, y1: lf.y1, x0: 2, x1: u.w - 2, name: lf.name }));\n    if (u.type === \"base-4drawer\" || /^corner/.test(u.type) || u.type === \"island\") return [];\n    const band = doorBand(u);\n    let list;\n    if (!band) {\n      const [lo, hi] = doorRange(u);\n      list = [{ y0: lo, y1: hi }];\n    } else if (band.none) list = [];\n    else list = [band].concat(band.extra || []);\n    return list.map((q) => ({ y0: q.y0, y1: q.y1, x0: 2, x1: u.w - 2, name: \"Door\" })).sort((p, q) => p.y0 - q.y0);\n  }\n  function faceSegments(u) {\n    const out = [];\n    const list = drawerBoxes(u);\n    const added = {};\n    for (const d of addedDrawers(u)) added[d.n] = d;\n    for (const b of list) {\n      const a = b.xn != null ? added[b.xn] : null;\n      out.push({\n        kind: \"drawer\",\n        i: b.i,\n        xn: b.xn == null ? null : b.xn,\n        name: b.name.replace(/ box$/, \"\"),\n        key: b.xn != null ? \"x\" + b.xn : \"o\" + b.i,\n        y0: b.fy0,\n        y1: b.fy1,\n        x0: a ? a.fx0 : DRW.frontGapSide,\n        x1: a ? a.fx1 : u.w - DRW.frontGapSide\n      });\n    }\n    doorSegs(u).forEach((q, k) => out.push({ kind: \"door\", k, name: q.name, key: \"door\" + k, y0: q.y0, y1: q.y1, x0: q.x0, x1: q.x1 }));\n    return out;\n  }\n  function frontSeams(u) {\n    if (!u || !hasDrawerBoxes(u)) return [];\n    const segs = faceSegments(u), out = [];\n    for (const A of segs) for (const B of segs) {\n      if (A === B || A.kind === \"door\" && B.kind === \"door\") continue;\n      if (!(A.x0 < B.x1 - 0.5 && B.x0 < A.x1 - 0.5)) continue;\n      if (Math.abs(A.y0 - B.y1 - GAP) > 0.6) continue;\n      out.push({\n        key: A.key + \"/\" + B.key,\n        a: A,\n        b: B,\n        y: (A.y0 + B.y1) / 2,\n        x0: Math.max(A.x0, B.x0),\n        x1: Math.min(A.x1, B.x1)\n      });\n    }\n    return out.sort((p, q) => q.y - p.y);\n  }\n  function seamChanges(s, dy) {\n    const ch = [];\n    if (s.a.kind === \"drawer\") ch.push({ i: s.a.i, fh: s.a.y1 - s.a.y0 - dy, edge: \"bottom\" });\n    if (s.b.kind === \"drawer\") ch.push({ i: s.b.i, fh: s.b.y1 - s.b.y0 + dy, edge: \"top\" });\n    return ch;\n  }\n  function seamStep(s) {\n    return s.a.xn != null || s.b.xn != null ? 1 : 0.1;\n  }\n  function seamWhy(u, s, dy) {\n    if (Math.abs(dy) < 1e-9) return null;\n    const ch = seamChanges(s, dy);\n    if (!ch.length) return \"nothing to move\";\n    for (const c of ch) if (!(c.fh >= FRONT_MIN - 0.05)) return \"a front cannot be lower than \" + FRONT_MIN + \" mm\";\n    return changesWhy(u, ch, ch[0].i);\n  }\n  function clearReach(okAt, target, res) {\n    const sg = target < 0 ? -1 : 1, T3 = Math.abs(target), STEP = 5;\n    if (T3 < 1e-9) return 0;\n    let last = 0;\n    for (let x = Math.min(STEP, T3); ; x = Math.min(x + STEP, T3)) {\n      if (!okAt(sg * x)) {\n        let lo = last, hi = x;\n        while (hi - lo > res + 1e-9) {\n          const m = Math.round((lo + hi) / 2 / res) * res;\n          if (m <= lo + 1e-9 || m >= hi - 1e-9) break;\n          if (okAt(sg * m)) lo = m;\n          else hi = m;\n        }\n        return sg * (Math.round(lo / res) * res);\n      }\n      last = x;\n      if (x >= T3 - 1e-9) return sg * T3;\n    }\n  }\n  var reachCache = /* @__PURE__ */ new Map();\n  function stateKey(u, k) {\n    return k + \"|\" + JSON.stringify([u.id, u.type, u.w, u.h, u.d, u.xdr, u.dfH, u.boxH, u.interior, u.door, u.doorH, u.drawerFronts]);\n  }\n  function cached(key, fn) {\n    if (reachCache.has(key)) return reachCache.get(key);\n    const v = fn();\n    if (reachCache.size > 200) reachCache.clear();\n    reachCache.set(key, v);\n    return v;\n  }\n  function seamRange(u, s) {\n    const st = seamStep(s);\n    return cached(stateKey(u, \"seam:\" + s.key), () => {\n      const ok2 = (d) => seamWhy(u, s, d) === null;\n      const r = (v) => Math.round(v * 10) / 10;\n      return { lo: r(clearReach(ok2, -Math.ceil(u.h), st)), hi: r(clearReach(ok2, Math.ceil(u.h), st)) };\n    });\n  }\n  function seamByKey(u, key) {\n    return frontSeams(u).find((s) => s.key === key) || null;\n  }\n  function seamOn(u, i, edge) {\n    return frontSeams(u).find((s) => edge === \"top\" ? s.b.kind === \"drawer\" && s.b.i === i : s.a.kind === \"drawer\" && s.a.i === i) || null;\n  }\n  function moveSeam(u, key, yWant) {\n    const s = seamByKey(u, key);\n    if (!s) return { ok: false, why: \"That joint between the fronts is not there any more\" };\n    const asked = Number(yWant);\n    if (!isFinite(asked)) return { ok: false, why: \"Type where the joint goes, in mm\" };\n    return moveSeamBy(u, s, asked - s.y);\n  }\n  function moveSeamBy(u, s, want) {\n    const st = seamStep(s);\n    let dy = st === 1 ? Math.round(want) : want;\n    let why = null, clamped = false;\n    const fit = Math.abs(dy) < 1e-9 ? 0 : clearReach((d) => seamWhy(u, s, d) === null, dy, st);\n    if (Math.abs(fit - dy) > 1e-6) {\n      why = seamWhy(u, s, fit + (dy > 0 ? st : -st));\n      clamped = true;\n      dy = fit;\n    }\n    if (Math.abs(dy) > 1e-6) applyChanges(u, drawerBoxes(u), seamChanges(s, dy));\n    const segs = faceSegments(u);\n    const find = (seg) => segs.find((q) => q.key === seg.key) || seg;\n    const A = find(s.a), B = find(s.b);\n    return {\n      ok: true,\n      key: s.key,\n      y: Math.round((s.y + dy) * 10) / 10,\n      dy,\n      asked: Math.round((s.y + want) * 10) / 10,\n      clamped,\n      why: clamped ? why : null,\n      a: { kind: A.kind, name: A.name, fh: Math.round((A.y1 - A.y0) * 10) / 10 },\n      b: { kind: B.kind, name: B.name, fh: Math.round((B.y1 - B.y0) * 10) / 10 }\n    };\n  }\n  function canGrow(u, i, edge) {\n    const s = seamOn(u, i, edge);\n    if (s) return seamWhy(u, s, edge === \"top\" ? 1 : -1) === null;\n    const b = boxOf2(drawerBoxes(u), i);\n    return !!b && linkedWhy(u, i, b.fy1 - b.fy0 + 1, edge) === null;\n  }\n  function drawerHeightRange(u, i, edge) {\n    const list = drawerBoxes(u), b = boxOf2(list, i);\n    if (!b) return null;\n    const now = b.fy1 - b.fy0, cur = Math.round(now);\n    const e = edge || linkedEdge(u, b);\n    const s = seamOn(u, i, e);\n    if (s) {\n      const rg = seamRange(u, s), sign = e === \"top\" ? 1 : -1;\n      const a = now + sign * rg.lo, z = now + sign * rg.hi;\n      return { lo: Math.round(Math.min(a, z)), hi: Math.round(Math.max(a, z)), now: cur, edge: e, seam: s.key };\n    }\n    const okAt = (fh) => linkedWhy(u, i, fh, e) === null;\n    if (!okAt(now)) return { lo: cur, hi: cur, now: cur, stuck: true };\n    return cached(stateKey(u, \"free:\" + i + \":\" + e), () => {\n      const ok2 = (d) => okAt(now + d);\n      const up = clearReach(ok2, Math.ceil(u.h), 1), dn = clearReach(ok2, -Math.max(0, Math.floor(now - 1)), 1);\n      return { lo: Math.round(Math.min(now + dn, cur)), hi: Math.round(Math.max(now + up, cur)), now: cur, edge: e };\n    });\n  }\n  function setDrawerHeight2(u, i, want, edgeWant) {\n    const list = drawerBoxes(u), b = boxOf2(list, i);\n    if (!b) return { ok: false, why: \"No such drawer\" };\n    const asked = Number(want);\n    if (!(asked > 0) || !isFinite(asked)) return { ok: false, why: \"Type the drawer height in mm\" };\n    const w = Math.round(asked), now0 = b.fy1 - b.fy0;\n    let edge = edgeWant;\n    if (!edge && w < now0 - 0.01) {\n      const st = seamOn(u, i, \"top\"), sb = seamOn(u, i, \"bottom\");\n      edge = st && seamWhy(u, st, -1) === null ? \"top\" : sb && seamWhy(u, sb, 1) === null ? \"bottom\" : null;\n    }\n    if (!edge) edge = linkedEdge(u, b);\n    const s = seamOn(u, i, edge);\n    if (s) {\n      const sign = edge === \"top\" ? 1 : -1;\n      const r = moveSeamBy(u, s, sign * (w - now0));\n      const nb = boxOf2(drawerBoxes(u), i);\n      const fh2 = nb ? Math.round((nb.fy1 - nb.fy0) * 10) / 10 : now0;\n      const other = edge === \"top\" ? s.a : s.b;\n      let lo = null, hi = null;\n      if (r.clamped) {\n        const rg = drawerHeightRange(u, i, edge);\n        lo = rg.lo;\n        hi = rg.hi;\n      }\n      return {\n        ok: true,\n        fh: fh2,\n        box: nb ? nb.mm : null,\n        asked: w,\n        clamped: r.clamped,\n        why: r.why,\n        lo,\n        hi,\n        edge,\n        giver: other.kind === \"drawer\" ? other.i : null,\n        giverDoor: other.kind === \"door\",\n        seam: s.key\n      };\n    }\n    const giver = b.xn == null && u.type === \"base-4drawer\" ? bankGiver(i) : null;\n    let fh = w, why = null, range = null;\n    if (linkedWhy(u, i, now0, edge) !== null && linkedWhy(u, i, w, edge) !== null) return { ok: false, why: linkedWhy(u, i, now0, edge) || \"This drawer does not fit as it is\" };\n    const reach = clearReach((d) => linkedWhy(u, i, now0 + d, edge) === null, w - now0, 1);\n    if (Math.abs(now0 + reach - w) > 0.01) {\n      range = drawerHeightRange(u, i, edge);\n      fh = Math.round(now0 + reach);\n      why = linkedWhy(u, i, w > fh ? fh + 1 : fh - 1, edge);\n    }\n    if (Math.abs(fh - now0) > 0.01) applyLinked(u, list, i, fh, edge);\n    const now = boxOf2(drawerBoxes(u), i);\n    return {\n      ok: true,\n      fh,\n      box: now ? now.mm : null,\n      asked: w,\n      clamped: fh !== w,\n      why: fh !== w ? why : null,\n      lo: range ? range.lo : null,\n      hi: range ? range.hi : null,\n      edge,\n      giver\n    };\n  }\n\n  // v2/src/interact/parts.js\n  function frontOf2(p) {\n    if (p.front) return p.front;\n    const L = p.local;\n    return { axis: \"z\", sign: 1, at: L.z1, from: L.x0, to: L.x1, mid: [(L.x0 + L.x1) / 2, L.y1, L.z1] };\n  }\n  var ARM_WORD = (pd) => pd && pd.arm ? \"Arm \" + pd.arm + \" shelf\" : \"Shelf\";\n  var EDGE_PX = 14;\n  var EDGE_MM = 12;\n  var SNAP_MM = 6;\n  var INSIDE_KINDS = { shelf: 1, \"fixed-v\": 1, \"fixed-h\": 1 };\n  function installParts(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    function syncPartInfo() {\n      ctx.syncHandlesState();\n      ctx.changed(\"partinfo\");\n    }\n    function shelfEdgeAt(u, p, cx, cy) {\n      if (st.insideTool && st.insideTool !== \"edit\" && st.insideTool !== \"select\") return null;\n      if (!u || !p || p.kind !== \"shelf\") return null;\n      const ray = ctx.pointerRay ? ctx.pointerRay(cx, cy) : null;\n      if (!ray) return null;\n      const r = rayToLocal(u, ray), L = p.local, F = frontOf2(p), k = F.axis === \"x\" ? 0 : 2, o = k === 0 ? 2 : 0;\n      const t = rayAABB(r, F.axis === \"x\" ? { x0: L.x0 - 2, x1: L.x1, y0: L.y0 - 4, y1: L.y1 + 4, z0: L.z0 - 2, z1: L.z1 + 2 } : { x0: L.x0 - 2, x1: L.x1 + 2, y0: L.y0 - 4, y1: L.y1 + 4, z0: L.z0, z1: L.z1 + 2 });\n      if (t === null) return null;\n      const hk = r.o[k] + r.d[k] * t, ho = r.o[o] + r.d[o] * t;\n      if (p.front && (ho < F.from - 2 || ho > F.to + 2)) return null;\n      const back = F.mid.slice();\n      back[k] -= F.sign * 100;\n      const a = localToWorld(u, F.mid), b = localToWorld(u, back);\n      const conv = pxPerMmAlongDir(ctx, { anchor: a, dir: [(b[0] - a[0]) / 100, (b[1] - a[1]) / 100, (b[2] - a[2]) / 100] });\n      const convY = pxPerMmAlong(ctx, u, \"y\");\n      if (!(conv.px > 0.04) || conv.px < 0.2 * convY.px) return null;\n      const grab = Math.max(EDGE_MM, EDGE_PX / conv.px);\n      return F.sign * (F.at - hk) <= grab ? { conv } : null;\n    }\n    function selectedShelfEdgeAt(cx, cy) {\n      const u = ctx.sel();\n      if (!u || !scene.selPart) return null;\n      const p = partUnderPointer(cx, cy);\n      if (!p || p.pid !== scene.selPart || p.kind !== \"shelf\") return null;\n      return shelfEdgeAt(u, p, cx, cy) ? { u, p } : null;\n    }\n    function partsRayHit(nx, ny) {\n      const ray = ctx.rayFromNdc(nx, ny);\n      if (!ray) return null;\n      const fn = function(B) {\n        return rayAABB(ray, B);\n      };\n      fn.ray = ray;\n      return fn;\n    }\n    function partUnderPointer(cx, cy) {\n      if (st.insideTool) {\n        if (st.insideTool !== \"select\" && st.insideTool !== \"edit\") return null;\n        const g2 = ctx.inside.interiorPartUnder(cx, cy);\n        if (st.insideTool === \"edit\") return g2 && g2.part.pid === scene.selPart ? g2.part : null;\n        return g2 ? g2.part : null;\n      }\n      const u = ctx.sel();\n      if (!u || !scene.partsMode && !rotateViewOn(scene)) return null;\n      const r = ctx.liveRect();\n      if (!r) return null;\n      const nd = ctx.ndcFromEvent(cx, cy);\n      const hitFn = partsRayHit(nd[0], nd[1]);\n      if (!hitFn) return null;\n      const got = pickPartIn(u, hitFn);\n      return got ? got.part : null;\n    }\n    function hover(e) {\n      if (!scene.partsMode || st.drag || st.partDrag) return;\n      const p = partUnderPointer(e.clientX, e.clientY);\n      const pid = p ? p.pid : null;\n      const edge = !!(p && p.pid === scene.selPart && p.kind === \"shelf\" && shelfEdgeAt(ctx.sel(), p, e.clientX, e.clientY));\n      if (edge !== !!st.shelfEdgeHover) {\n        st.shelfEdgeHover = edge;\n        ctx.changed(\"handles\");\n      }\n      if (pid === scene.hoverPart) return;\n      scene.hoverPart = pid;\n      ctx.frame();\n    }\n    function leave() {\n      if (!scene.partsMode || !scene.hoverPart) return;\n      scene.hoverPart = null;\n      ctx.frame();\n    }\n    function realPartAt(cx, cy) {\n      const nd = ctx.ndcFromEvent(cx, cy), hitFn = partsRayHit(nd[0], nd[1]);\n      if (!hitFn) return null;\n      let best = null;\n      for (const v of scene.units) {\n        const g2 = pickPartIn(v, hitFn);\n        if (g2 && (!best || g2.t < best.t)) best = { u: v, part: g2.part, t: g2.t };\n      }\n      return best;\n    }\n    const MAG = { CAPTURE: 8, RELEASE: 14 };\n    function magnet(pd, axis, want, e) {\n      if (e && e.altKey) {\n        pd.centred = false;\n        return { at: want, centred: false };\n      }\n      const c = centreOf(pd.u, axis, pd.idx);\n      if (!c) return { at: want, centred: false };\n      const d = Math.abs(want - c.at);\n      pd.centred = pd.centred ? d <= MAG.RELEASE : d <= MAG.CAPTURE;\n      return pd.centred ? { at: c.at, centred: true, gap: c.gap } : { at: want, centred: false };\n    }\n    function down(e) {\n      if (scene.workshop) {\n        const hit2 = realPartAt(e.clientX, e.clientY);\n        if (hit2 == null ? void 0 : hit2.part) {\n          scene.selPart = hit2.part.pid;\n          ctx.changed(\"partinfo\");\n          ctx.refresh();\n        }\n        return;\n      }\n      if (!scene.partsMode || scene.explode > 0) return;\n      let u = ctx.sel(), p = null;\n      if (st.insideTool === \"edit\") {\n        const g2 = ctx.inside.interiorPartUnder(e.clientX, e.clientY), real = realPartAt(e.clientX, e.clientY);\n        const onIt = g2 && g2.part.pid === scene.selPart && (!real || real.part.pid === scene.selPart || real.t >= g2.t - 1);\n        if (!onIt) {\n          st.editAway = { x: e.clientX, y: e.clientY };\n          return;\n        }\n        st.editAway = null;\n        u = g2.u;\n        p = g2.part;\n        e.__ubTaken = true;\n      } else if (st.insideTool === \"select\") {\n        const g2 = ctx.inside.interiorPartUnder(e.clientX, e.clientY);\n        if (!g2) return;\n        if (g2.part.pid !== scene.selPart) {\n          st.pendingSel = { u: g2.u, p: g2.part, x: e.clientX, y: e.clientY };\n          return;\n        }\n        u = g2.u;\n        p = g2.part;\n        if (scene.selectedId !== u.id) {\n          scene.selectedId = u.id;\n          if (ctx.refreshCues) ctx.refreshCues();\n        }\n        e.__ubTaken = true;\n      } else {\n        const gs = scene.selPart && ctx.inside && ctx.inside.interiorPartUnder ? ctx.inside.interiorPartUnder(e.clientX, e.clientY) : null;\n        p = gs && gs.part.pid === scene.selPart ? gs.part : u ? partUnderPointer(e.clientX, e.clientY) : null;\n        if (gs && gs.part.pid === scene.selPart) u = gs.u;\n        if (!p && scene.partsMode) {\n          const r = realPartAt(e.clientX, e.clientY);\n          if (r && INSIDE_KINDS[r.part.kind] && !isIsland(r.u)) {\n            u = r.u;\n            p = r.part;\n            if (scene.selectedId !== u.id) {\n              scene.selectedId = u.id;\n              if (ctx.refreshCues) ctx.refreshCues();\n            }\n            e.__ubTaken = true;\n          }\n        }\n        if (!u) return;\n        if (p && INSIDE_KINDS[p.kind] && p.pid !== scene.selPart) {\n          st.pendingSel = { u, p, x: e.clientX, y: e.clientY };\n          return;\n        }\n        if (!(p && INSIDE_KINDS[p.kind])) p = null;\n        else {\n          e.__ubTaken = true;\n          if (scene.selectedId !== u.id) {\n            scene.selectedId = u.id;\n            if (ctx.refreshCues) ctx.refreshCues();\n          }\n        }\n      }\n      if (!p) return;\n      const wasSel = scene.selPart === p.pid;\n      const edgeGrab = wasSel && p.kind === \"shelf\" ? shelfEdgeAt(u, p, e.clientX, e.clientY) : null;\n      scene.selPart = p.pid;\n      scene.hoverPart = p.pid;\n      const intSnap = JSON.stringify({ i: u.interior || null, c: u.cornerShelves === void 0 ? \"__none\" : u.cornerShelves });\n      if (p.kind === \"shelf\" && edgeGrab) {\n        const entry = shelfEntryOf(u, p.pid), E = entry ? shelfEdgesOf(u, entry) : null;\n        if (entry && E) {\n          ctx.view.holdCamera();\n          ctx.hist.begin(\"move shelf\");\n          const F = frontOf2(p), arm = p.corner ? p.arm : null;\n          const cy = pxPerMmAlongDir(ctx, {\n            anchor: localToWorld(u, F.mid),\n            dir: (function() {\n              const a = localToWorld(u, [0, 0, 0]), b = localToWorld(u, [0, 1, 0]);\n              return [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n            })()\n          });\n          const sb0 = arm === \"B\" ? E.sbB : E.setback, depth0 = arm === \"B\" ? E.depthB : E.depth;\n          st.partDrag = {\n            mode: \"shelf-pending\",\n            id: entry.id,\n            y0: entry.y,\n            py: e.clientY,\n            px: e.clientX,\n            u,\n            moved: false,\n            snap: intSnap,\n            sb0,\n            depth0,\n            conv: edgeGrab.conv,\n            convY: cy,\n            arm,\n            fsign: F.sign,\n            ax: axisGrab(u, p, \"y\", e.clientX, e.clientY),\n            axZ: axisGrab(u, p, F.axis, e.clientX, e.clientY)\n          };\n          ctx.cue(ARM_WORD(st.partDrag) + \" depth \" + depth0 + \" mm, front setback \" + sb0 + \" mm - drag the front edge in or out\" + (arm ? \"\" : \" (Shift slides the whole shelf)\") + \", up or down to move it; Esc cancels\");\n        }\n      } else if (p.kind === \"shelf\") {\n        let entry = null;\n        const sl = shelfListOf(u);\n        for (let i = 0; i < sl.length; i++) if (shelfPidOf(u, sl[i]) === p.pid) entry = sl[i];\n        if (entry) {\n          ctx.view.holdCamera();\n          ctx.hist.begin(\"move shelf\");\n          st.partDrag = {\n            mode: \"shelf\",\n            id: entry.id,\n            y0: entry.y,\n            py: e.clientY,\n            u,\n            moved: false,\n            snap: intSnap,\n            ax: axisGrab(u, p, \"y\", e.clientX, e.clientY)\n          };\n        }\n      } else if (p.kind === \"fixed-h\" || p.kind === \"fixed-v\") {\n        const m = /(\\d+)/.exec(p.name || \"\");\n        const idx = m ? parseInt(m[1], 10) - 1 : -1;\n        const I0 = interiorOf(u);\n        if (idx >= 0) {\n          ctx.view.holdCamera();\n          ctx.hist.begin(p.kind === \"fixed-h\" ? \"move horizontal divider\" : \"move divider\");\n          st.partDrag = {\n            mode: p.kind,\n            idx,\n            u,\n            moved: false,\n            snap: intSnap,\n            wasEqual: equalOn(u, p.kind === \"fixed-h\" ? \"h\" : \"v\"),\n            px: e.clientX,\n            py: e.clientY,\n            start: p.kind === \"fixed-h\" ? I0.hDiv[idx] : I0.vDiv[idx],\n            ax: axisGrab(u, p, p.kind === \"fixed-h\" ? \"y\" : \"x\", e.clientX, e.clientY)\n          };\n        }\n      }\n      if (st.partDrag) {\n        if (e.preventDefault) e.preventDefault();\n        if (e.stopPropagation) e.stopPropagation();\n      }\n      syncPartInfo();\n      ctx.refresh();\n      if (e.stopPropagation) e.stopPropagation();\n    }\n    function cancelDrag() {\n      const pd = st.partDrag;\n      if (!pd) return false;\n      const u = pd.u;\n      try {\n        const s0 = pd.snap ? JSON.parse(pd.snap) : { i: null, c: \"__none\" };\n        u.interior = s0.i;\n        if (s0.c === \"__none\") delete u.cornerShelves;\n        else u.cornerShelves = s0.c;\n      } catch {\n      }\n      ctx.hist.abort();\n      st.partDrag = null;\n      ctx.view.releaseCamera();\n      ctx.cue(\"Cancelled\");\n      syncPartInfo();\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function move(e) {\n      const pd = st.partDrag;\n      if (!pd) return;\n      if (e.preventDefault) e.preventDefault();\n      const u = pd.u;\n      if (pd.mode === \"shelf-pending\") {\n        const mx = e.clientX - pd.px, my = e.clientY - pd.py;\n        if (Math.hypot(mx, my) < 5) return;\n        const yx = pd.convY.ux, yy = pd.convY.uy, zx = pd.conv.ux, zy = pd.conv.uy;\n        const det = yx * zy - yy * zx;\n        let depthWins = false;\n        if (Math.abs(det) > 0.2) {\n          const a = (mx * zy - my * zx) / det, b = (yx * my - yy * mx) / det;\n          depthWins = Math.abs(b) > Math.abs(a);\n        }\n        if (depthWins) {\n          ctx.hist.abort();\n          ctx.hist.begin(\"shelf depth\");\n          pd.mode = \"shelf-depth\";\n          pd.ax = pd.axZ;\n        } else pd.mode = \"shelf\";\n      }\n      const dAx = axisTravel(pd, e.clientX, e.clientY);\n      if (pd.mode === \"shelf-depth\") {\n        let fwd = dAx === null ? null : dAx * (pd.fsign || 1);\n        if (fwd === null) {\n          const c = pd.conv, dx = e.clientX - pd.px, dy = e.clientY - pd.py;\n          fwd = -(dx * c.ux + dy * c.uy) / Math.max(1e-4, c.px);\n        }\n        const L = shelfDepthLimits(u, (shelfListOf(u).filter((q) => q.id === pd.id)[0] || {}).cell);\n        let sb = Math.round(pd.sb0 - fwd);\n        if (L) {\n          for (const m of [L.D - L.std.z1, 0]) if (Math.abs(sb - m) <= SNAP_MM) {\n            sb = m;\n            break;\n          }\n        }\n        const slide = !!e.shiftKey && !pd.arm;\n        const r2 = shelfSetEdges(u, pd.id, { setback: sb, arm: pd.arm || void 0 }, slide ? \"slide\" : \"front\");\n        if (r2.ok) {\n          pd.moved = pd.moved || r2.setback !== pd.sb0 || r2.depth !== pd.depth0;\n          ctx.cue((r2.clamped ? r2.clamped + \" \" : \"\") + ARM_WORD(pd) + \" depth \" + r2.depth + \" mm, front setback \" + r2.setback + \" mm\" + (slide ? \" (sliding)\" : \"\"));\n          syncPartInfo();\n          ctx.refresh();\n        } else if (r2.why) ctx.cue(r2.why);\n        return;\n      }\n      if (pd.mode === \"fixed-v\") {\n        let along2 = dAx;\n        if (along2 === null) {\n          const conv = pxPerMmAlong(ctx, u, resizeAxisOf(u, \"w\").world);\n          const dx = e.clientX - pd.px, dy = e.clientY - pd.py;\n          along2 = (dx * conv.ux + dy * conv.uy) / conv.px;\n        }\n        const mg = magnet(pd, \"v\", pd.start + along2, e);\n        const rv = vDivDragTo(u, pd.idx, mg.at);\n        if (rv.ok) {\n          pd.moved = true;\n          ctx.cue(mg.centred ? \"Centred - \" + mg.gap + \" mm clear either side (hold Alt to place it freely)\" : \"Divider at \" + Math.round(rv.x) + \" mm from the inside left\" + (pd.wasEqual ? \" - equal spacing off, placed by hand\" : \"\"));\n          syncPartInfo();\n          ctx.refresh();\n        } else if (rv.why) ctx.cue(rv.why);\n        return;\n      }\n      const convY = pxPerMmAlong(ctx, u, \"y\");\n      const dmm = dAx !== null ? dAx : (pd.py - e.clientY) / Math.max(1e-4, convY.px);\n      if (pd.mode === \"fixed-h\") {\n        const mgh = magnet(pd, \"h\", pd.start + dmm, e);\n        const rh = hDividerMoveTo(u, pd.idx, mgh.at);\n        if (rh.ok) {\n          pd.moved = true;\n          ctx.cue(rh.blocked ? \"A shelf is in the way - the divider stops against it\" : mgh.centred && Math.abs(rh.y - mgh.at) < 1 ? \"Centred - \" + mgh.gap + \" mm clear above and below (hold Alt to place it freely)\" : \"Horizontal divider at \" + Math.round(rh.y) + \" mm above the inside bottom\" + (pd.wasEqual ? \" - equal spacing off, placed by hand\" : \"\"));\n          syncPartInfo();\n          ctx.refresh();\n        } else if (rh.why) ctx.cue(rh.why);\n        return;\n      }\n      const r = shelfMoveTo(u, pd.id, pd.y0 + dmm);\n      if (r.ok) {\n        pd.moved = true;\n        scene.selPart = null;\n        const sl = shelfListOf(u);\n        for (let i = 0; i < sl.length; i++) if (sl[i].id === pd.id) scene.selPart = shelfPidOf(u, sl[i]);\n        scene.hoverPart = scene.selPart;\n        ctx.cue(\"Shelf at \" + Math.round(r.y) + \" mm above the inside bottom\");\n        syncPartInfo();\n        ctx.refresh();\n      } else if (r.why) ctx.cue(r.why);\n    }\n    function axisGrab(u, p, axis, cx, cy) {\n      let c = p.front && axis === p.front.axis ? p.front.mid.slice() : [(p.local.x0 + p.local.x1) / 2, axis === \"z\" ? p.local.y1 : (p.local.y0 + p.local.y1) / 2, p.local.z1];\n      if (p.front && axis === p.front.axis && ctx.pointerRay) {\n        const ray = ctx.pointerRay(cx, cy), L = p.local;\n        const r = ray ? rayToLocal(u, ray) : null, t = r ? rayAABB(r, { x0: L.x0 - 2, x1: L.x1 + 2, y0: L.y0 - 4, y1: L.y1 + 4, z0: L.z0 - 2, z1: L.z1 + 2 }) : null;\n        if (t !== null) {\n          const k = p.front.axis === \"x\" ? 0 : 2, o = k === 0 ? 2 : 0, h = r.o[o] + r.d[o] * t;\n          c[k] = p.front.at;\n          c[1] = L.y1;\n          c[o] = Math.min(p.front.to, Math.max(p.front.from, h));\n        }\n      }\n      const s0 = ctx.inside.axisParam(u, axis, c, cx, cy);\n      return s0 === null ? null : { u, axis, anchor: c, s0 };\n    }\n    function axisTravel(pd, cx, cy) {\n      const g2 = pd.ax;\n      if (!g2) return null;\n      const s = ctx.inside.axisParam(g2.u, g2.axis, g2.anchor, cx, cy);\n      return s === null ? null : s - g2.s0;\n    }\n    function up(e) {\n      if (st.pendingSel && !st.partDrag) {\n        const ps = st.pendingSel;\n        st.pendingSel = null;\n        const moved = e && e.clientX != null ? Math.hypot(e.clientX - ps.x, e.clientY - ps.y) : 0;\n        if (moved <= 5) {\n          if (scene.selectedId !== ps.u.id) {\n            scene.selectedId = ps.u.id;\n            if (ctx.refreshCues) ctx.refreshCues();\n          }\n          scene.selPart = ps.p.pid;\n          scene.hoverPart = ps.p.pid;\n          st.shelfEdgeHover = false;\n          syncPartInfo();\n          ctx.refresh();\n        }\n      }\n      if (st.editAway && !st.partDrag) {\n        const a = st.editAway;\n        st.editAway = null;\n        const moved = e && e.clientX != null ? Math.hypot(e.clientX - a.x, e.clientY - a.y) : 0;\n        if (moved <= 5 && st.insideTool === \"edit\" && ctx.inside && ctx.inside.exitEdit) {\n          ctx.inside.exitEdit();\n          syncPartInfo();\n        }\n      }\n      const pd = st.partDrag;\n      if (!pd) return;\n      if (pd.moved) ctx.hist.commit();\n      else ctx.hist.abort();\n      st.partDrag = null;\n      ctx.view.releaseCamera();\n      syncPartInfo();\n      ctx.refresh();\n    }\n    function openFrontUnderPointer(cx, cy) {\n      const nd = ctx.ndcFromEvent(cx, cy), ray = ctx.rayFromNdc(nd[0], nd[1]);\n      if (!ray) return null;\n      let best = null;\n      const us = scene.units;\n      for (let i = 0; i < us.length; i++) {\n        const v = us[i], ps = openFrontParts(v);\n        for (let j = 0; j < ps.length; j++) {\n          const p = ps[j];\n          if (!p.open) continue;\n          const t = rayHitsOpenFront(v, p, ray);\n          if (t !== null && (!best || t < best.t)) best = { u: v, part: p, t };\n        }\n      }\n      return best;\n    }\n    function anythingOpen(u) {\n      return !!(u.doorOpen || u.drawerOpen || Array.isArray(u.xopen) && u.xopen.length > 0 || u.drawers && u.drawers.some && u.drawers.some(Boolean) || u.leafOpen && u.leafOpen.some && u.leafOpen.some(Boolean));\n    }\n    function islandBayUnder(u, cx, cy) {\n      const nd = ctx.ndcFromEvent(cx, cy), hitFn = partsRayHit(nd[0], nd[1]);\n      if (!hitFn) return null;\n      const bays = islandBays(u);\n      let best = null;\n      for (let i = 0; i < bays.length; i++) {\n        const got = pickPartIn(bays[i], hitFn);\n        if (got && (!best || got.t < best.t)) best = { i, part: got.part, t: got.t };\n      }\n      return best;\n    }\n    function islandDblclick(u, e) {\n      const hit2 = islandBayUnder(u, e.clientX, e.clientY);\n      const front = hit2 && (hit2.part.kind === \"door\" || hit2.part.kind === \"drawer-front\" || hit2.part.kind === \"drawer-box\");\n      if (front) {\n        const i = hit2.i, kind = (u.bays && u.bays[i] && u.bays[i].kind) === \"drawers\" ? \"drawers\" : \"doors\";\n        ctx.hist.run(kind === \"drawers\" ? \"open drawer\" : \"open door\", function() {\n          const st2 = (u.bayOpen || []).slice();\n          st2[i] = !st2[i];\n          u.bayOpen = st2;\n        });\n        ctx.cue(\"Section \" + (i + 1) + \" \" + kind + \" \" + (u.bayOpen[i] ? \"open - double-click again to shut\" : \"shut\"));\n      } else {\n        if (!(u.bayOpen || []).some(Boolean)) return false;\n        ctx.hist.run(\"shut fronts\", function() {\n          u.bayOpen = (u.bayOpen || []).map(function() {\n            return false;\n          });\n        });\n        ctx.cue(\"Shut\");\n      }\n      scene.hoverPart = null;\n      scene.selPart = null;\n      syncPartInfo();\n      ctx.syncControls();\n      ctx.refresh();\n      if (e.preventDefault) e.preventDefault();\n      if (e.stopPropagation) e.stopPropagation();\n      return true;\n    }\n    function partOfUnitUnder(u, cx, cy, withT) {\n      const nd = ctx.ndcFromEvent(cx, cy);\n      const hitFn = partsRayHit(nd[0], nd[1]);\n      if (!hitFn) return null;\n      const got = pickPartIn(u, hitFn);\n      return withT ? got : got ? got.part : null;\n    }\n    function dblclick(e) {\n      if (scene.workshop) {\n        e.__ubTaken = true;\n        return true;\n      }\n      if (touchEcho(e, st, typeof performance !== \"undefined\" && performance.now ? performance.now() : Date.now())) return;\n      let u = null, p = null;\n      const of = openFrontUnderPointer(e.clientX, e.clientY);\n      if (of) {\n        u = of.u;\n        p = of.part;\n        const near2 = partOfUnitUnder(of.u, e.clientX, e.clientY, true);\n        if (near2 && near2.part && INSIDE_KINDS[near2.part.kind] && near2.t < of.t) p = near2.part;\n      }\n      if (!u) {\n        const hit2 = ctx.pointer && ctx.pointer.pickAt ? ctx.pointer.pickAt(e.clientX, e.clientY) : null;\n        const id = hit2 && (hit2.id || hit2.unit && hit2.unit.id || (typeof hit2 === \"string\" ? hit2 : null));\n        u = id && (scene.units || []).find((v) => v.id === id) || null;\n        if (!u && (scene.partsMode || rotateViewOn(scene))) u = ctx.sel();\n      }\n      st.lastDbl = { of: !!of, u: u ? u.id : null, mode: scene.moveMode ? \"cabinet\" : scene.sizeMode ? \"size\" : scene.panMode ? \"pan\" : \"rotate\" };\n      if (!u) return;\n      const take = () => {\n        if (u.id !== scene.selectedId) {\n          scene.selectedId = u.id;\n          scene.selPart = null;\n        }\n      };\n      if (isIsland(u) && !of) {\n        if (islandDblclick(u, e) !== false) {\n          take();\n          return true;\n        }\n        return false;\n      }\n      if (!p) p = partOfUnitUnder(u, e.clientX, e.clientY);\n      st.lastDbl.part = p ? p.kind + \":\" + p.name : null;\n      if (!p) return;\n      if (INSIDE_KINDS[p.kind] && !isIsland(u)) {\n        take();\n        if (scene.explode > 0) {\n          ctx.cue(\"Exploded view is a preview - set it back to Assembled to edit shelves\");\n          return;\n        }\n        const cur = ctx.inside ? ctx.inside.tool() : null;\n        if (ctx.inside && (!cur || cur === \"edit\")) ctx.inside.enterEdit();\n        else if (ctx.inside && cur !== \"select\") ctx.inside.setTool(\"select\");\n        scene.selectedId = u.id;\n        scene.selPart = p.pid;\n        scene.hoverPart = p.pid;\n        st.lastDbl.selected = p.pid;\n        ctx.cue(p.kind === \"shelf\" ? \"Shelf selected - drag it up or down, drag its front edge in or out for its depth, or click a number to type it\" : \"Divider selected - drag it, or click a gap number to type it\");\n        syncPartInfo();\n        ctx.syncControls();\n        ctx.refresh();\n        if (e.preventDefault) e.preventDefault();\n        if (e.stopPropagation) e.stopPropagation();\n        return true;\n      }\n      const front = p.kind === \"door\" || p.kind === \"drawer-front\" || p.kind === \"drawer-box\";\n      if (!front && !anythingOpen(u)) return;\n      take();\n      if (p.kind !== \"door\" && p.kind !== \"drawer-front\" && p.kind !== \"drawer-box\") {\n        if (!anythingOpen(u)) return;\n        ctx.hist.run(\"shut fronts\", function() {\n          u.doorOpen = false;\n          u.drawerOpen = false;\n          if (Array.isArray(u.xopen)) u.xopen = [];\n          if (u.drawers) u.drawers = u.drawers.map(function() {\n            return false;\n          });\n          if (u.leafOpen) u.leafOpen = u.leafOpen.map(function() {\n            return false;\n          });\n        });\n        ctx.cue(\"Shut\");\n      } else if (p.kind === \"door\" && isTall(u)) {\n        let li = -1;\n        const lv = tallLeaves(u) || [];\n        for (let i = 0; i < lv.length; i++) if (lv[i].name === p.name) li = lv[i].li != null ? lv[i].li : i;\n        if (li < 0) return;\n        ctx.hist.run(\"open door\", function() {\n          u.leafOpen = (u.leafOpen || []).slice();\n          u.leafOpen[li] = !u.leafOpen[li];\n        });\n        ctx.cue(u.leafOpen[li] ? \"Door open - double-click it again to shut it\" : \"Door shut\");\n      } else if (p.kind === \"door\") {\n        ctx.hist.run(\"open door\", function() {\n          u.doorOpen = !u.doorOpen;\n        });\n        ctx.cue(u.doorOpen ? \"Door open - double-click it again to shut it\" : \"Door shut\");\n      } else if (p.kind === \"drawer-front\" || p.kind === \"drawer-box\") {\n        ctx.hist.run(\"open drawer\", function() {\n          if (p.xn != null) {\n            toggleAddedOpen(u, p.xn);\n            return;\n          }\n          if (u.type === \"base-4drawer\") {\n            const bank = drawer4Parts(u) || [];\n            let at = -1;\n            for (let i = 0; i < bank.length; i++) {\n              const q = bank[i];\n              if ((q.name || \"Drawer front \" + (i + 1)) === p.name || (q.name || \"\") + \" box\" === p.name) at = i;\n            }\n            u.drawers = (u.drawers || [false, false, false, false]).slice();\n            if (at >= 0) u.drawers[at] = !u.drawers[at];\n          } else u.drawerOpen = !u.drawerOpen;\n        });\n        ctx.cue(anythingOpen(u) ? \"Drawer open - double-click it again to shut it\" : \"Drawer shut\");\n      } else return;\n      scene.hoverPart = null;\n      scene.selPart = null;\n      syncPartInfo();\n      ctx.syncControls();\n      ctx.refresh();\n      if (e.preventDefault) e.preventDefault();\n      if (e.stopPropagation) e.stopPropagation();\n      return true;\n    }\n    function chooseDrawerAt(cx, cy) {\n      const u = ctx.sel();\n      if (!u || !hasDrawerBoxes(u) || scene.explode > 0 || st.insideTool) return -1;\n      const nd = ctx.ndcFromEvent(cx, cy);\n      const hitFn = nd ? partsRayHit(nd[0], nd[1]) : null;\n      const got = hitFn ? pickPartIn(u, hitFn) : null;\n      const p = got && got.part;\n      const i = p && (p.kind === \"drawer-front\" || p.kind === \"drawer-box\") ? drawerOfPart(u, p.name) : -1;\n      const had = scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.i : -1;\n      const part = p && p.kind === \"drawer-box\" ? \"box\" : \"front\";\n      const hadPart = scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.part : null;\n      if (i >= 0) {\n        if (had !== i || !scene.drawerBox.click || scene.drawerBox.part !== part) scene.drawerBox = { id: u.id, i, click: true, part };\n      } else if (had >= 0) scene.drawerBox = null;\n      if (i !== had || i >= 0 && part !== hadPart) {\n        ctx.frame();\n        if (ctx.changed) ctx.changed(\"controls\");\n      }\n      return i;\n    }\n    function setSelPart(pid) {\n      scene.selPart = pid;\n      syncPartInfo();\n      ctx.refresh();\n    }\n    const parts = {\n      hover,\n      leave,\n      down,\n      move,\n      up,\n      dblclick,\n      cancelDrag,\n      partUnderPointer,\n      realPartAt,\n      setSelPart,\n      selectedShelfEdgeAt,\n      openFrontUnderPointer,\n      anythingOpen,\n      syncPartInfo,\n      chooseDrawerAt\n    };\n    ctx.parts = parts;\n    return parts;\n  }\n\n  // v2/src/interact/size.js\n  function sizeSpecs(u) {\n    const base = u.y || 0, top = base + u.h, out = [];\n    function spec(k, name2, value, p0, p1, grow3, face2, along2, rank) {\n      return {\n        k,\n        label: name2,\n        name: name2,\n        value,\n        p0,\n        p1,\n        grow: grow3,\n        tip: p1,\n        face: face2,\n        along: along2,\n        rank,\n        vertical: Math.abs(grow3[1]) > 0.5\n      };\n    }\n    const pinAt = hugPointOf(u);\n    function freeEnd(e0, e1) {\n      if (!pinAt) return { pin: e0, free: e1 };\n      const d0 = Math.hypot(e0[0] - pinAt.x, e0[2] - pinAt.z);\n      const d1 = Math.hypot(e1[0] - pinAt.x, e1[2] - pinAt.z);\n      return d0 <= d1 ? { pin: e0, free: e1 } : { pin: e1, free: e0 };\n    }\n    function armSpec(k, name2, value, e0, e1, face2, rank) {\n      const m = freeEnd(e0, e1);\n      const vx = m.free[0] - m.pin[0], vz = m.free[2] - m.pin[2];\n      const L = Math.hypot(vx, vz) || 1;\n      const sp = spec(k, name2, value, m.pin, m.free, [vx / L, 0, vz / L], face2, \"u\", rank);\n      sp.freeEndOnly = true;\n      sp.pinAt = m.pin;\n      sp.freeAt = m.free;\n      return sp;\n    }\n    if (isLPlan(u)) {\n      const E = unitEnvelope(u), xf = planXf(u, E.LX, E.LZ);\n      const A = armA(u), B = armB(u), D2 = u.d;\n      const P2 = function(x, y, z) {\n        const q = xf.p([x, 0, z]);\n        return [q[0], y, q[2]];\n      };\n      const f12 = [P2(0, base, D2), P2(A, base, D2), P2(A, top, D2), P2(0, top, D2)];\n      const f2 = [P2(A, base, 0), P2(A, base, B), P2(A, top, B), P2(A, top, 0)];\n      const fd = [P2(0, base, 0), P2(0, base, D2), P2(0, top, D2), P2(0, top, 0)];\n      const f1b = [P2(A, base, 0), P2(0, base, 0), P2(0, top, 0), P2(A, top, 0)];\n      out.push(armSpec(\"w\", \"Arm 1\", A, P2(0, base, D2), P2(A, base, D2), f12, 0));\n      out[out.length - 1].alt = f1b;\n      out.push(armSpec(\"w2\", \"Arm 2\", B, P2(A, base, 0), P2(A, base, B), f2, 1));\n      out.push(spec(\"d\", \"Depth\", D2, P2(0, base, 0), P2(0, base, D2), xf.n([0, 0, 1]), fd, \"u\", 2));\n      out[out.length - 1].freeEndOnly = true;\n      out[out.length - 1].pinAt = P2(0, base, 0);\n      out[out.length - 1].freeAt = P2(0, base, D2);\n      out.push(spec(\"h\", \"Height\", u.h, P2(A, base, D2), P2(A, top, D2), [0, 1, 0], f12, \"v\", -1));\n      out[out.length - 1].alt = f1b;\n      return out;\n    }\n    const xf2 = planXf(u, u.w, u.d);\n    const Q = function(x, y, z) {\n      const q = xf2.p([x, 0, z]);\n      return [q[0], y, q[2]];\n    };\n    const W2 = u.w, Dd = u.d;\n    const front = [Q(0, base, Dd), Q(W2, base, Dd), Q(W2, top, Dd), Q(0, top, Dd)];\n    const back = [Q(W2, base, 0), Q(0, base, 0), Q(0, top, 0), Q(W2, top, 0)];\n    const right = [Q(W2, base, 0), Q(W2, base, Dd), Q(W2, top, Dd), Q(W2, top, 0)];\n    const left = [Q(0, base, Dd), Q(0, base, 0), Q(0, top, 0), Q(0, top, Dd)];\n    out.push(spec(\"w\", \"Width\", W2, Q(0, base, Dd), Q(W2, base, Dd), xf2.n([1, 0, 0]), front, \"u\", 1));\n    out[0].alt = back;\n    out[0].q0 = Q(0, base, Dd);\n    out[0].q1 = Q(W2, base, Dd);\n    out[0].aq0 = Q(W2, base, 0);\n    out[0].aq1 = Q(0, base, 0);\n    out.push(spec(\"h\", \"Height\", u.h, Q(W2, base, Dd), Q(W2, top, Dd), [0, 1, 0], front, \"v\", 0));\n    out[out.length - 1].freeEndOnly = true;\n    out[out.length - 1].pinAt = Q(W2, base, Dd);\n    out[out.length - 1].freeAt = Q(W2, top, Dd);\n    out[1].alt = back;\n    out.push(spec(\"d\", \"Depth\", Dd, Q(W2, base, 0), Q(W2, base, Dd), xf2.n([0, 0, 1]), right, \"u\", 2));\n    out[2].alt = left;\n    out[2].q0 = Q(W2, base, 0);\n    out[2].q1 = Q(W2, base, Dd);\n    out[2].aq0 = Q(0, base, Dd);\n    out[2].aq1 = Q(0, base, 0);\n    return out;\n  }\n  function quadPt(q, a, b) {\n    const x = (1 - a) * (1 - b) * q[0][0] + a * (1 - b) * q[1][0] + a * b * q[2][0] + (1 - a) * b * q[3][0];\n    const y = (1 - a) * (1 - b) * q[0][1] + a * (1 - b) * q[1][1] + a * b * q[2][1] + (1 - a) * b * q[3][1];\n    return { x, y };\n  }\n  function quadArea(q) {\n    let a = 0;\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      a += q[i][0] * q[j][1] - q[j][0] * q[i][1];\n    }\n    return a / 2;\n  }\n  function pointInQuad(q, x, y) {\n    let pos = 0, neg3 = 0;\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      const cr = (q[j][0] - q[i][0]) * (y - q[i][1]) - (q[j][1] - q[i][1]) * (x - q[i][0]);\n      if (cr > 0) pos++;\n      else if (cr < 0) neg3++;\n    }\n    return pos === 0 || neg3 === 0;\n  }\n  function rectInQuad(q, r) {\n    return pointInQuad(q, r.x0, r.y0) && pointInQuad(q, r.x1, r.y0) && pointInQuad(q, r.x1, r.y1) && pointInQuad(q, r.x0, r.y1);\n  }\n  function quadSpan(q) {\n    let m = 1e9;\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      m = Math.min(m, Math.hypot(q[j][0] - q[i][0], q[j][1] - q[i][1]));\n    }\n    return m;\n  }\n  function rectAt(cx, cy, w, h) {\n    return { x0: cx - w / 2, y0: cy - h / 2, x1: cx + w / 2, y1: cy + h / 2 };\n  }\n  function rectsHit(a, b) {\n    return !(a.x1 <= b.x0 || b.x1 <= a.x0 || a.y1 <= b.y0 || b.y1 <= a.y0);\n  }\n  function rectAtClash(r, list) {\n    for (let i = 0; i < list.length; i++) if (rectsHit(r, list[i])) return true;\n    return false;\n  }\n  function lerp(A, B, t) {\n    return { x: A.x + (B.x - A.x) * t, y: A.y + (B.y - A.y) * t };\n  }\n  function fitEnd(A, B, tIn, MAXWALK, g2, Q, cw, ch, taken) {\n    for (let t = tIn; t <= tIn + MAXWALK + 1e-9; t += 0.02) {\n      const pt = lerp(A, B, t);\n      const r = rectAt(pt.x, pt.y, g2, g2);\n      if (r.x0 >= 0 && r.y0 >= 0 && r.x1 <= cw && r.y1 <= ch && rectInQuad(Q, r) && !rectAtClash(r, taken)) return pt;\n    }\n    return null;\n  }\n  var SIZE_UI = {\n    /* below this the cabinet is simply too small to edit on: show nothing\n       but a quiet hint. Between the two, controls scale with the cabinet. */\n    spanHide: 54,\n    spanFull: 170,\n    gripMin: 14,\n    gripMax: 26,\n    // hit target, scaled by how much room\n    glyphMin: 7,\n    glyphMax: 11,\n    // the ARROW stays small even close up\n    fontMin: 8,\n    fontMax: 12,\n    inset: 0.1\n    // keep clear of the face's own edges\n  };\n  function installSize(ctx) {\n    const scene = ctx.scene;\n    function currentDim2(u, k) {\n      return k === \"w2\" ? armB(u) : u ? u[k] : 0;\n    }\n    function dimLimits2(u, k, U) {\n      const LIM = limitsFor(u);\n      const lim = (LIM[k] || LIM.w).slice();\n      if (k === \"w\") lim[0] = Math.max(lim[0], structuralWidthMin(u));\n      if (k === \"d\" && u.family === \"corner\") lim[1] = Math.max(lim[0], maxCornerDepth(u));\n      if (k === \"w\" && u.fitted && !isLPlan(u) && (u.family === \"base\" || u.family === \"wall\"))\n        lim[0] = Math.min(lim[0], FIT_MIN);\n      if ((k === \"w\" || k === \"w2\") && isLPlan(u)) {\n        const reach = armRoomMax(U || scene.units, u, k);\n        if (reach != null) lim[1] = Math.max(lim[0], Math.min(lim[1], reach));\n      }\n      return lim;\n    }\n    function widthEdge(u) {\n      const ax = resizeAxisOf(u, \"w\").world, f = foot(u), R4 = roomSize();\n      const lo = ax === \"x\" ? f.x0 : f.z0, hi = ax === \"x\" ? f.x1 : f.z1, end = ax === \"x\" ? R4.width : R4.depth;\n      const hiWall = Math.abs(end - hi) <= 2, loWall = Math.abs(lo) <= 2;\n      return hiWall && !loWall ? \"lo\" : \"hi\";\n    }\n    function pushText(rr, U) {\n      const L = U || scene.units;\n      const names = (rr.pushed || []).map((id) => displayName(L, L.find((v) => v.id === id)));\n      const who = (names.length === 1 ? names[0] : names.length + \" cabinets\") + \" moved along \" + Math.round(rr.push) + \" mm\";\n      return rr.clamped ? \"Only \" + Math.round(rr.value) + \" mm fits (asked for \" + rr.wanted + \" mm) - \" + who + \" to the end of the room\" : Math.round(rr.value) + \" mm - \" + who;\n    }\n    function applyDim(u, k, raw) {\n      if (!u) return 0;\n      const before = ctx.hist.snap(), held = clashingIds(scene.units);\n      const cur0 = k === \"w2\" ? armB(u) : u[k];\n      const v = applyDimRaw(u, k, raw);\n      const clash = newClash(scene.units, held);\n      if (!clash) return v;\n      ctx.hist.restore(before);\n      ctx.cue(\"That size would \" + (clash.zone.kind === \"door\" ? \"block \" : \"cover \") + clash.hit.label + \" - nothing changed\");\n      return cur0;\n    }\n    function previewDim(units, u, k, raw) {\n      const said = [];\n      const E = { units, quiet: true, say: (m) => {\n        if (m) said.push(m);\n      } };\n      const cur0 = k === \"w2\" ? armB(u) : u[k];\n      const held = clashingIds(units);\n      const v = applyDimRaw(u, k, raw, E);\n      const clash = newClash(units, held);\n      if (clash) return { value: cur0, refused: \"That size would \" + (clash.zone.kind === \"door\" ? \"block \" : \"cover \") + clash.hit.label, said };\n      const want = E.snapTo != null ? E.snapTo : E.limited;\n      const refused = want != null && Math.abs(v - want) > 0.5 || want == null && v === cur0 && String(raw) !== String(cur0) ? said.filter(Boolean).pop() || \"That size will not fit\" : null;\n      return { value: refused ? cur0 : v, refused, said, snapped: E.snapTo != null && !refused, limited: E.limited };\n    }\n    function applyDimRaw(u, k, raw, E) {\n      const U = E ? E.units : scene.units, quiet = !!(E && E.quiet);\n      const cueTo = (m) => {\n        if (quiet) E.say(m);\n        else ctx.cue(m);\n      };\n      if (!quiet) ctx.view.holdCamera();\n      if (isIsland(u) && k === \"w\") {\n        cueTo(\"The island body width comes from its sections \\u2014 change a section width instead\");\n        return u.w;\n      }\n      if (scene.explode > 0) {\n        cueTo(\"Exploded view is a preview \\u2014 set it back to Assembled to edit\");\n        return k === \"w2\" ? armB(u) : u[k];\n      }\n      const cur = k === \"w2\" ? armB(u) : u[k];\n      let v = parseInt(String(raw).replace(/[^0-9-]/g, \"\"), 10);\n      if (!isFinite(v)) v = cur;\n      if (v === cur) return cur;\n      const lim = dimLimits2(u, k, U);\n      if ((k === \"w\" || k === \"w2\") && v < lim[0]) {\n        cueTo(\"The narrowest this cabinet can be is \" + lim[0] + \" mm - nothing changed\");\n        return cur;\n      }\n      v = clamp4(v, lim[0], lim[1]);\n      if (quiet) E.limited = v;\n      let snapMsg = null, clampMsg = null, pushMsg = null;\n      if (k !== \"w\" && k !== \"w2\" && scene.snap) {\n        const sd = snapDim(U, u, k, v);\n        v = sd.value;\n        snapMsg = sd.cue;\n        if (quiet && sd.cue) E.snapTo = v;\n      }\n      cueTo(snapMsg || null);\n      if (isLPlan(u) && (k === \"w\" || k === \"w2\" || k === \"d\")) {\n        if (tryLArm(U, u, k, v, true)) {\n          if (!quiet) {\n            ctx.syncControls();\n            ctx.refresh();\n          }\n          return v;\n        }\n        cueTo(\"No room to resize the corner \\u2014 it would push cabinets through a wall or into each other\");\n        return cur;\n      }\n      if (k === \"w\" || k === \"w2\" || k === \"d\" || k === \"h\") {\n        const edge = k === \"w\" ? widthEdge(u) : \"hi\";\n        const rr = k === \"w\" ? resizeWithPush(U, u, k, v, edge) : resizeFromEdge(U, u, k, v, \"hi\");\n        if (rr.ok && rr.push > 0) pushMsg = pushText(rr, U);\n        if (!rr.ok) {\n          cueTo(rr.why || \"That size will not fit - nothing changed\");\n          return cur;\n        }\n        if (rr.clamped && !(rr.push > 0)) clampMsg = rr.opening ? \"Only \" + rr.value + \" mm fits - stopped at \" + rr.opening.label + (rr.opening.kind === \"door\" ? \", its doorway stays clear\" : \", it would cover it\") + \" (asked for \" + rr.wanted + \" mm)\" : \"Only \" + rr.value + \" mm will fit there (asked for \" + rr.wanted + \" mm)\";\n        if (clampMsg || pushMsg) cueTo([pushMsg, clampMsg].filter(Boolean).join(\" \\xB7 \"));\n        v = rr.value;\n        if (quiet) return v;\n        if (u.family === \"base\" && !isIsland(u) && u.run && ROOM.ret) {\n          orientForRun(u, u.run);\n          flushToRun(u, u.run);\n        }\n        const push2 = wallPush(u);\n        if (push2 > 0) u.z += push2;\n      } else {\n        u[k] = v;\n        if (u.family === \"base\" && !isIsland(u) && u.run && ROOM.ret) {\n          orientForRun(u, u.run);\n          flushToRun(u, u.run);\n        }\n        const push = wallPush(u);\n        if (push > 0) u.z += push;\n        if (u.family === \"corner\") nudgeClear(U, u);\n      }\n      if (quiet) return v;\n      if (k === \"h\" || k === \"d\" || k === \"y\") {\n        scene.cues = ctx.alignVisible() ? alignGroups(scene.units, u, scene.cues) : null;\n        const parts = [pushMsg, clampMsg, snapMsg, ctx.alignVisible() ? cueText(scene.cues, null) : null].filter(Boolean);\n        ctx.cue(parts.join(\" \\xB7 \") || null);\n      }\n      return v;\n    }\n    function commitSize(k, raw) {\n      const sizeBefore = ctx.hist.snap();\n      const u = ctx.sel();\n      if (!u) return void 0;\n      applyDim(u, k, raw);\n      ctx.hist.pushAfter(\"resize cabinet\", sizeBefore);\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function sidebarDim(k, raw) {\n      const v = applyDim(ctx.sel(), k, raw);\n      ctx.syncControls();\n      ctx.refresh();\n      return v;\n    }\n    const st = ctx.st;\n    function projQuad(face2, cw, ch) {\n      const out = [];\n      for (let i = 0; i < 4; i++) {\n        const nd = ctx.worldToNdc(face2[i]);\n        if (!nd) return null;\n        out.push([(nd[0] + 1) / 2 * cw, (1 - nd[1]) / 2 * ch]);\n      }\n      return out;\n    }\n    function specs(u) {\n      return sizeSpecs(u);\n    }\n    function specOf(u, k) {\n      const all = sizeSpecs(u);\n      for (let i = 0; i < all.length; i++) if (all[i].k === k) return all[i];\n      return void 0;\n    }\n    function setActiveDim(k) {\n      if (scene.activeDim === k) return;\n      scene.activeDim = k || null;\n      ctx.changed(\"sizeactive\");\n    }\n    function startGrip(e, k, edge, node) {\n      setActiveDim(k);\n      if (node) {\n        const fe = node.edge;\n        if (fe === \"lo\" || fe === \"hi\") edge = fe;\n      }\n      e.preventDefault();\n      e.stopPropagation();\n      ctx.view.holdCamera();\n      const u = ctx.sel();\n      if (!u) return;\n      if (ctx.radial) ctx.radial.close();\n      ctx.hist.begin(\"resize cabinet\");\n      edge = edge === \"lo\" ? \"lo\" : \"hi\";\n      const start2 = currentDim2(u, k), px = e.clientX, py = e.clientY;\n      const gBase = resizeBase(u, k);\n      const sp0 = specOf(u, k);\n      let dir = { x: 1, y: -1 };\n      if (sp0 && sp0.tip && sp0.grow) {\n        const L = 120;\n        const p1 = ctx.worldToNdc(sp0.tip);\n        const p2 = ctx.worldToNdc([\n          sp0.tip[0] + sp0.grow[0] * L,\n          sp0.tip[1] + sp0.grow[1] * L,\n          sp0.tip[2] + sp0.grow[2] * L\n        ]);\n        if (p1 && p2) {\n          const dx = p2[0] - p1[0], dy = -(p2[1] - p1[1]);\n          const m = Math.hypot(dx, dy);\n          if (m > 1e-6) dir = { x: dx / m, y: dy / m };\n        }\n      }\n      const drawn = node ? node.deg : null;\n      if (drawn != null && drawn !== \"\" && isFinite(Number(drawn))) {\n        const rad = Number(drawn) * Math.PI / 180;\n        dir = { x: Math.cos(rad), y: Math.sin(rad) };\n      } else if (edge === \"lo\") {\n        dir = { x: -dir.x, y: -dir.y };\n      }\n      const spNow = sp0;\n      st.sizeDrag = {\n        k,\n        start: start2,\n        dir,\n        edge,\n        wholeArm: !!(spNow && spNow.freeEndOnly),\n        u,\n        px,\n        py,\n        gBase,\n        snapKey: null,\n        snapWhy: null,\n        /* where every cabinet stood when the drag began: a pushed run comes back when the size does */\n        origin: Object.fromEntries(scene.units.map((v) => [v.id, { x: v.x, z: v.z }]))\n      };\n    }\n    function move(ev) {\n      const sd = st.sizeDrag;\n      if (!sd) return;\n      noteTravel(sd, ev, sd.px, sd.py);\n      const u = sd.u, k = sd.k;\n      const d = (ev.clientX - sd.px) * sd.dir.x + (ev.clientY - sd.py) * sd.dir.y;\n      let want = Math.round((sd.start + d * 2.2) / 5) * 5;\n      const sn = resizeSnap(scene.units, u, k, want, sd.edge, sd.gBase, sd.snapKey);\n      if (sn) {\n        want = sn.size;\n        sd.snapKey = sn.key;\n        sd.snapWhy = sn.why;\n      } else {\n        sd.snapKey = null;\n        sd.snapWhy = null;\n      }\n      scene.resizeSnap = sn ? { k, at: sn.size, why: sn.why, otherId: sn.other.id } : null;\n      let rr;\n      if (sd.wholeArm) {\n        applyDim(u, k, want);\n        const now = currentDim2(u, k);\n        rr = { ok: true, value: now, clamped: Math.abs(now - want) > 0.51 };\n      } else {\n        rr = k === \"w\" ? resizeWithPush(scene.units, u, k, want, sd.edge, sd.origin) : resizeFromEdge(scene.units, u, k, want, sd.edge);\n      }\n      if (rr.ok && rr.push > 0 && !rr.clamped) ctx.cue(pushText(rr));\n      else if (rr.ok) {\n        ctx.cue(rr.clamped ? \"Stopped at \" + rr.value + \" mm - \" + (rr.opening ? rr.opening.label + (rr.opening.kind === \"door\" ? \" - its doorway stays clear\" : \" - it would cover it\") : \"it meets the next cabinet\") : sn ? \"Lined up with the \" + sn.why + \" of \" + displayName(scene.units, sn.other) + \" - \" + rr.value + \" mm\" : null);\n      }\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function up() {\n      if (!st.sizeDrag) return;\n      ctx.hist.commit();\n      st.sizeDrag = null;\n      scene.resizeSnap = null;\n      setActiveDim(null);\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function layout() {\n      const u = ctx.sel();\n      if (!scene.sizeMode || !u) return null;\n      const cs = ctx.canvasSize(), cw = cs.w, ch = cs.h;\n      const all = sizeSpecs(u);\n      const numText = function(sp) {\n        return Math.round(sp.value) + \" mm\";\n      };\n      const placed = [];\n      const grips = {};\n      let taken = [];\n      const sorted = all.slice().sort(function(a, b) {\n        return a.rank - b.rank;\n      });\n      for (let si0 = 0; si0 < sorted.length; si0++) {\n        const sp = sorted[si0];\n        const q = projQuad(sp.face, cw, ch);\n        const qa = sp.alt ? projQuad(sp.alt, cw, ch) : null;\n        const useAlt = qa && Math.abs(quadArea(qa)) > Math.abs(quadArea(q));\n        const Q = useAlt ? qa : q;\n        const prov0 = useAlt ? sp.aq0 || sp.p0 : sp.q0 || sp.p0;\n        const prov1 = useAlt ? sp.aq1 || sp.p1 : sp.q1 || sp.p1;\n        if (!Q) continue;\n        const span2 = quadSpan(Q);\n        if (span2 < SIZE_UI.spanHide) continue;\n        const t = Math.max(0, Math.min(\n          1,\n          (span2 - SIZE_UI.spanHide) / (SIZE_UI.spanFull - SIZE_UI.spanHide)\n        ));\n        let grip = Math.round(SIZE_UI.gripMin + (SIZE_UI.gripMax - SIZE_UI.gripMin) * t);\n        const glyph = Math.round(SIZE_UI.glyphMin + (SIZE_UI.glyphMax - SIZE_UI.glyphMin) * t);\n        let font = Math.round(SIZE_UI.fontMin + (SIZE_UI.fontMax - SIZE_UI.fontMin) * t);\n        const txt = numText(sp);\n        const LANES = sp.along === \"v\" ? [0.88, 0.76, 0.12, 0.24] : [0.12, 0.24, 0.88, 0.76];\n        const OFFS = sp.along === \"v\" ? [0.62, 0.5, 0.38, 0.5] : [0.34, 0.46, 0.62, 0.5];\n        const SHRINK = [1, 0.8, 0.62];\n        let a = null, b = null, mid = null, rects = null, gs = grip, fs2 = font, gl = glyph;\n        let edgeLen = 0, lineLen = 0;\n        for (let wk = 0; wk < 2 && !rects; wk++) {\n          const MAXWALK = wk === 0 ? 0 : 0.46;\n          for (let li = 0; li < LANES.length && !rects; li++) {\n            for (let si = 0; si < SHRINK.length && !rects; si++) {\n              const sc = SHRINK[si];\n              const g2 = Math.max(12, Math.round(grip * sc));\n              const f2 = Math.max(7, Math.round(font * sc));\n              const w2 = 6 + f2 * 0.62 * txt.length, h2 = f2 + 4;\n              const L = LANES[li], OF = OFFS[li];\n              let E0, E1;\n              if (sp.along === \"v\") {\n                E0 = quadPt(Q, L, 0);\n                E1 = quadPt(Q, L, 1);\n              } else {\n                E0 = quadPt(Q, 0, L);\n                E1 = quadPt(Q, 1, L);\n              }\n              const eLen = Math.hypot(E1.x - E0.x, E1.y - E0.y);\n              if (eLen < 24) continue;\n              const tIn = Math.min(0.14, Math.max(0.025, (g2 / 2 + 2) / eLen));\n              const ca = fitEnd(E0, E1, tIn, MAXWALK, g2, Q, cw, ch, taken);\n              const cb = fitEnd(E1, E0, tIn, MAXWALK, g2, Q, cw, ch, taken);\n              if (!ca || !cb) continue;\n              const cm = sp.along === \"v\" ? quadPt(Q, OF, 0.5) : quadPt(Q, 0.5, OF);\n              const rr = [\n                rectAt(ca.x, ca.y, g2, g2),\n                rectAt(cb.x, cb.y, g2, g2),\n                rectAt(cm.x, cm.y, w2, h2)\n              ];\n              if (!(rectInQuad(Q, rr[0]) && rectInQuad(Q, rr[1]) && rectInQuad(Q, rr[2]))) continue;\n              let onCanvas = true;\n              for (let ri = 0; ri < 3; ri++) {\n                const r = rr[ri];\n                if (!(r.x0 >= 0 && r.y0 >= 0 && r.x1 <= cw && r.y1 <= ch)) {\n                  onCanvas = false;\n                  break;\n                }\n              }\n              if (!onCanvas) continue;\n              if (rectAtClash(rr[2], taken)) continue;\n              if (Math.hypot(cb.x - ca.x, cb.y - ca.y) < g2 + 6) continue;\n              a = ca;\n              b = cb;\n              mid = cm;\n              rects = rr;\n              gs = g2;\n              fs2 = f2;\n              gl = Math.max(6, Math.round(glyph * sc));\n              edgeLen = eLen;\n              lineLen = Math.hypot(cb.x - ca.x, cb.y - ca.y);\n            }\n          }\n        }\n        if (!rects) continue;\n        grip = gs;\n        font = fs2;\n        const glyphUsed = gl;\n        taken = taken.concat(rects);\n        const deg = Math.atan2(b.y - a.y, b.x - a.x) * 180 / Math.PI;\n        const hiEnd = sp.vertical ? \"top\" : \"far end\";\n        const loEnd = sp.vertical ? \"bottom\" : \"near end\";\n        const place2 = function(pt, d, endName, otherEnd, edge) {\n          return {\n            x: Math.round(pt.x),\n            y: Math.round(pt.y),\n            deg: Math.round(d),\n            size: grip,\n            glyph: glyphUsed,\n            edge,\n            title: sp.name + \" \\u2013 drag the \" + endName,\n            aria: \"Drag the \" + endName + \" to change \" + sp.name.toLowerCase() + \". The \" + otherEnd + \" stays where it is.\"\n          };\n        };\n        if (sp.freeEndOnly) {\n          const fn = ctx.worldToNdc(sp.freeAt);\n          const fx = fn ? (fn[0] + 1) / 2 * cw : b.x, fy = fn ? (1 - fn[1]) / 2 * ch : b.y;\n          const aIsFree = Math.hypot(a.x - fx, a.y - fy) < Math.hypot(b.x - fx, b.y - fy);\n          const hp = aIsFree ? a : b, other = aIsFree ? b : a;\n          const outDeg = Math.atan2(hp.y - other.y, hp.x - other.x) * 180 / Math.PI;\n          const g2 = place2(hp, outDeg, \"free end\", \"corner end\", null);\n          g2.aria = \"Drag away from the corner to lengthen \" + sp.name.toLowerCase() + \", back toward the corner to shorten it. The corner end stays fixed.\";\n          grips[sp.k] = { hi: g2, lo: null };\n        } else {\n          let ax = Math.abs(prov1[0] - prov0[0]) >= Math.abs(prov1[2] - prov0[2]) ? 0 : 2;\n          if (Math.abs(prov1[1] - prov0[1]) > Math.abs(prov1[ax] - prov0[ax])) ax = 1;\n          const aIsLow = prov0[ax] <= prov1[ax];\n          const aEdge = aIsLow ? \"lo\" : \"hi\";\n          const bEdge = aIsLow ? \"hi\" : \"lo\";\n          const degA = Math.atan2(a.y - b.y, a.x - b.x) * 180 / Math.PI;\n          const degB = Math.atan2(b.y - a.y, b.x - a.x) * 180 / Math.PI;\n          grips[sp.k] = {\n            hi: place2(b, degB, bEdge === \"hi\" ? hiEnd : loEnd, bEdge === \"hi\" ? loEnd : hiEnd, bEdge),\n            lo: place2(a, degA, aEdge === \"hi\" ? hiEnd : loEnd, aEdge === \"hi\" ? loEnd : hiEnd, aEdge)\n          };\n        }\n        placed.push({\n          k: sp.k,\n          a,\n          b,\n          mid,\n          rects,\n          quad: Q,\n          edgeLen,\n          lineLen,\n          fill: edgeLen > 0 ? lineLen / edgeLen : 0,\n          grip,\n          glyph: glyphUsed,\n          font,\n          span: span2,\n          deg,\n          freeEndOnly: !!sp.freeEndOnly,\n          pinAt: sp.pinAt,\n          freeAt: sp.freeAt,\n          x: mid.x,\n          y: mid.y,\n          label: sp.name,\n          value: sp.value,\n          tip: { x: b.x, y: b.y }\n        });\n      }\n      placed.grips = grips;\n      placed.hint = null;\n      if (!placed.length) {\n        const f = foot(u), y = (u.y || 0) + u.h / 2;\n        const nd = ctx.worldToNdc([(f.x0 + f.x1) / 2, y, (f.z0 + f.z1) / 2]);\n        placed.hint = {\n          text: \"Zoom in to edit sizes\",\n          x: nd ? Math.round((nd[0] + 1) / 2 * cw) : null,\n          y: nd ? Math.round((1 - nd[1]) / 2 * ch) : null\n        };\n      }\n      return placed;\n    }\n    const size3 = {\n      currentDim: currentDim2,\n      dimLimits: dimLimits2,\n      applyDim,\n      previewDim,\n      commitSize,\n      sidebarDim,\n      move,\n      up,\n      startGrip,\n      setActiveDim,\n      specs,\n      layout\n    };\n    ctx.size = size3;\n    return size3;\n  }\n\n  // v2/src/interact/nudge.js\n  function nudgeUnit(units, u, dirKey) {\n    if (!u) return { ok: false, why: \"nothing selected\" };\n    const lim = nudgeLimit(units, u, dirKey);\n    if (!lim) return { ok: false, why: \"no room that way\" };\n    if (lim.dist <= 0.5)\n      return {\n        ok: false,\n        already: true,\n        what: lim.what,\n        why: lim.what === \"cabinet\" ? \"Already touching \" + displayName(units, lim.other) : lim.what === \"opening\" && lim.other ? \"Already at \" + lim.other.label + (lim.other.kind === \"door\" ? \" - its doorway stays clear\" : \" - it would cover it\") : \"Already against the wall\"\n      };\n    const was = { x: u.x, z: u.z, rot: u.rot, y: u.y, w: u.w, h: u.h, d: u.d };\n    const cornerFrom = isCornerUnit(u) ? roomCornerSeatedBy(foot(u)) : null;\n    if (isCornerUnit(u) && roomOn()) {\n      const probe = { x: u.x, z: u.z };\n      u.x += lim.dx * lim.dist;\n      u.z += lim.dz * lim.dist;\n      const landedFoot = foot(u);\n      u.x = probe.x;\n      u.z = probe.z;\n      const cornerTo = roomCornerSeatedBy(landedFoot);\n      if (cornerTo && cornerTo !== cornerFrom) {\n        const f0 = foot(u);\n        const cBefore = [(f0.x0 + f0.x1) / 2, (f0.z0 + f0.z1) / 2];\n        const rc = cornerAtRoomCorner(units, u, cornerTo);\n        if (!rc.ok)\n          return {\n            ok: false,\n            why: rc.why || \"That corner did not work - nothing moved\"\n          };\n        u.y = was.y;\n        u.w = was.w;\n        u.h = was.h;\n        u.d = was.d;\n        const f12 = foot(u);\n        const cAfter = [(f12.x0 + f12.x1) / 2, (f12.z0 + f12.z1) / 2];\n        const trav = Math.abs((cAfter[0] - cBefore[0]) * lim.dx + (cAfter[1] - cBefore[1]) * lim.dz);\n        return {\n          ok: true,\n          moved: Math.round(trav * 100) / 100,\n          what: \"corner\",\n          corner: cornerTo,\n          from: cornerFrom,\n          other: null,\n          dx: lim.dx,\n          dz: lim.dz,\n          key: dirKey\n        };\n      }\n    }\n    const wallsBefore = touchedRoomWalls(u), seatedBefore = wallsBefore.length > 0 && wallSeatOK(u);\n    u.x += lim.dx * lim.dist;\n    u.z += lim.dz * lim.dist;\n    if (lim.what === \"wall\" && behindWall(u, u.x, u.z)) pushIntoRoom(u);\n    let bad = behindWall(u, u.x, u.z);\n    if (!bad) {\n      const us = units || [];\n      for (let i = 0; i < us.length && !bad; i++) {\n        const v = us[i];\n        if (v !== u && v.id !== u.id && sameLevel(v, u) && overlaps(v, u)) bad = true;\n      }\n    }\n    if (bad) {\n      u.x = was.x;\n      u.z = was.z;\n      u.rot = was.rot;\n      u.y = was.y;\n      return { ok: false, why: \"nothing legal that way\" };\n    }\n    u.y = was.y;\n    u.rot = was.rot;\n    u.w = was.w;\n    u.h = was.h;\n    u.d = was.d;\n    let seated = null;\n    if (!wallSeatOK(u)) {\n      const gained = touchedRoomWalls(u).filter(function(w) {\n        return wallsBefore.indexOf(w) < 0;\n      });\n      if (gained.length || seatedBefore) {\n        const rs = reseatOnWall(units, u, gained.indexOf(dirKey) >= 0 ? dirKey : gained[0] || null);\n        if (rs && !rs.ok) {\n          u.x = was.x;\n          u.z = was.z;\n          u.rot = was.rot;\n          u.y = was.y;\n          return { ok: false, why: rs.why };\n        }\n        if (rs) seated = rs.wall;\n      }\n    }\n    return {\n      ok: true,\n      moved: lim.dist,\n      what: lim.what,\n      other: lim.other,\n      dx: lim.dx,\n      dz: lim.dz,\n      key: dirKey,\n      seated\n    };\n  }\n  function nudgeCue(units, u, r) {\n    if (!r || !r.ok) return r && r.why ? r.why : null;\n    const mm = Math.round(r.moved);\n    if (r.what === \"corner\")\n      return \"Moved \" + mm + \" mm, into the \" + String(r.corner).replace(\"-\", \" \") + \" corner, both arms against the walls\";\n    if (r.seated) return \"Moved \" + mm + \" mm onto the \" + r.seated + \" wall, turned to face the room\";\n    if (r.what === \"opening\" && r.other)\n      return \"Moved \" + mm + \" mm, stopped at \" + r.other.label + (r.other.kind === \"door\" ? \" - its doorway stays clear\" : \" - it would cover it\");\n    return r.what === \"cabinet\" ? \"Moved \" + mm + \" mm, flush against \" + displayName(units, r.other) : \"Moved \" + mm + \" mm, flush against the wall\";\n  }\n  function installNudge(ctx) {\n    const scene = ctx.scene;\n    function run(key) {\n      const u = ctx.sel();\n      if (!u) return null;\n      ctx.view.holdCamera();\n      const keep = scene.selectedId;\n      const shot = {};\n      for (const v of scene.units) shot[v.id] = { x: v.x, y: v.y, z: v.z, rot: v.rot, run: v.run };\n      const nudgeBefore = ctx.hist.snap();\n      const clashBefore = clashingIds(scene.units);\n      const r = nudgeUnit(scene.units, u, key);\n      if (r && r.ok && r.what === \"corner\") syncRoom(scene.units);\n      const clash = r && r.ok ? newClash(scene.units, clashBefore) : null;\n      if (clash) {\n        for (const v of scene.units) {\n          const s = shot[v.id];\n          if (s) {\n            v.x = s.x;\n            v.y = s.y;\n            v.z = s.z;\n            v.rot = s.rot;\n            v.run = s.run;\n          }\n        }\n        syncRoom(scene.units);\n        scene.selectedId = keep;\n        ctx.cue(\"Stayed put \\u2014 \" + openingWhy(clash.zone));\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: false, why: openingWhy(clash.zone) };\n      }\n      if (r && r.ok && r.what === \"corner\") {\n        if (!sceneValid(scene.units)) {\n          for (const v of scene.units) {\n            const s = shot[v.id];\n            if (s) {\n              v.x = s.x;\n              v.y = s.y;\n              v.z = s.z;\n              v.rot = s.rot;\n              v.run = s.run;\n            }\n          }\n          syncRoom(scene.units);\n          scene.selectedId = keep;\n          ctx.cue(\"Moved back \\u2014 the corner can't go there, it would trap another cabinet\");\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: false, why: \"that corner would trap another cabinet\" };\n        }\n      }\n      scene.selectedId = keep;\n      ctx.cue(nudgeCue(scene.units, u, r));\n      if (r && r.ok) ctx.hist.pushAfter(\"move cabinet\", nudgeBefore);\n      if (r && r.ok) {\n        scene.cues = alignGroups(scene.units, u, null);\n        scene.alignTemp = true;\n        scene.nudgeFlash = { id: u.id, what: r.what, otherId: r.other ? r.other.id : null };\n      }\n      ctx.syncControls();\n      ctx.refresh();\n      return r;\n    }\n    function layout() {\n      const u = ctx.sel();\n      if (!scene.moveMode || !u) return null;\n      const cs = ctx.canvasSize(), cw = cs.w, ch = cs.h;\n      const f = foot(u), y = (u.y || 0) + Math.min(u.h * 0.5, 400);\n      const cx = (f.x0 + f.x1) / 2, cz = (f.z0 + f.z1) / 2;\n      const out = [];\n      for (let i = 0; i < NUDGE_DIRS.length; i++) {\n        const d = NUDGE_DIRS[i];\n        const lim = nudgeLimit(scene.units, u, d.k);\n        if (!lim || lim.dist <= 0.5) continue;\n        const OFF2 = 130;\n        const ax = d.dx ? d.dx > 0 ? f.x1 + OFF2 : f.x0 - OFF2 : cx;\n        const az = d.dz ? d.dz > 0 ? f.z1 + OFF2 : f.z0 - OFF2 : cz;\n        const nd = ctx.worldToNdc([ax, y, az]);\n        const tip = ctx.worldToNdc([ax + d.dx * 200, y, az + d.dz * 200]);\n        if (!nd || !tip) continue;\n        const sx = (nd[0] + 1) / 2 * cw, sy = (1 - nd[1]) / 2 * ch;\n        const tx = (tip[0] + 1) / 2 * cw, ty = (1 - tip[1]) / 2 * ch;\n        if (sx < 8 || sy < 60 || sx > cw - 8 || sy > ch - 8) continue;\n        const deg = Math.atan2(ty - sy, tx - sx) * 180 / Math.PI;\n        let ax2 = sx, ay2 = sy, shift = 0;\n        const ins = ctx.viewInsets ? ctx.viewInsets() : null;\n        const eL = ins ? Math.max(8, ins.l + 14) : 8, eR = ins ? Math.max(8, ins.r + 14) : 8, eT = ins ? Math.max(60, ins.t + 14) : 60, eB = ins ? Math.max(8, ins.b + 14) : 8;\n        const plus = ctx.quickAdd && ctx.quickAdd.layout ? ctx.quickAdd.layout() : [];\n        if (plus.length) {\n          const CLEAR = 35, gap = (x, yy) => Math.min(Infinity, ...plus.map((p) => Math.max(Math.abs(p.x - x), Math.abs(p.y - yy))));\n          if (gap(sx, sy) < CLEAR) {\n            const L = Math.hypot(tx - sx, ty - sy) || 1, ux = (tx - sx) / L, uy = (ty - sy) / L;\n            let best = { x: sx, y: sy, g: gap(sx, sy), t: 0 };\n            for (const sgn of [1, -1]) {\n              for (let t = 2; t <= 160; t += 2) {\n                const x = sx + ux * t * sgn, yy = sy + uy * t * sgn;\n                if (x < eL || yy < eT || x > cw - eR || yy > ch - eB) break;\n                const g2 = gap(x, yy);\n                if (g2 > best.g) best = { x, y: yy, g: g2, t: t * sgn };\n                if (g2 >= CLEAR) break;\n              }\n              if (best.g >= CLEAR) break;\n            }\n            ax2 = best.x;\n            ay2 = best.y;\n            shift = best.t;\n          }\n        }\n        const title = lim.what === \"cabinet\" ? \"Move \" + Math.round(lim.dist) + \" mm, up against \" + displayName(scene.units, lim.other) : \"Move \" + Math.round(lim.dist) + \" mm, up against the wall\";\n        out.push({\n          k: d.k,\n          x: ax2,\n          y: ay2,\n          deg,\n          dist: lim.dist,\n          what: lim.what,\n          otherId: lim.other ? lim.other.id : null,\n          title,\n          shift\n        });\n      }\n      return out;\n    }\n    function limit(u, k) {\n      return nudgeLimit(scene.units, u, k);\n    }\n    const nudge = { run, layout, limit, nudgeUnit, nudgeCue };\n    ctx.nudge = nudge;\n    return nudge;\n  }\n\n  // v2/src/interact/keyboard.js\n  function installKeyboard(ctx) {\n    const scene = ctx.scene;\n    function typingInField(t) {\n      if (!t || !t.tagName) return false;\n      const tag = String(t.tagName).toLowerCase();\n      return tag === \"input\" || tag === \"textarea\" || tag === \"select\";\n    }\n    function windowKey(e) {\n      if (!e || typingInField(e.target)) return false;\n      const mod = e.ctrlKey || e.metaKey;\n      const k = String(e.key || \"\").toLowerCase();\n      if (mod && k === \"z\" && !e.shiftKey) {\n        if (e.preventDefault) e.preventDefault();\n        ctx.hist.undo();\n        return true;\n      }\n      if (mod && k === \"z\" && e.shiftKey || mod && k === \"y\") {\n        if (e.preventDefault) e.preventDefault();\n        ctx.hist.redo();\n        return true;\n      }\n      if (k === \"escape\") {\n        if (ctx.handles.cancelDrag()) {\n          if (e.preventDefault) e.preventDefault();\n          return true;\n        }\n        if (ctx.parts.cancelDrag()) {\n          if (e.preventDefault) e.preventDefault();\n          return true;\n        }\n        if (ctx.inside && ctx.inside.key(e)) {\n          if (e.preventDefault) e.preventDefault();\n          return true;\n        }\n        if (ctx.measure && ctx.measure.key(e)) {\n          if (e.preventDefault) e.preventDefault();\n          return true;\n        }\n        return false;\n      }\n      if ((k === \"delete\" || k === \"backspace\") && ctx.measure && ctx.measure.on()) {\n        if (ctx.measure.key(e) && e.preventDefault) e.preventDefault();\n        return true;\n      }\n      if ((k === \"delete\" || k === \"backspace\") && scene.partsMode && scene.selPart) {\n        if (ctx.commands.run(\"removeSelectedShelf\").ok) {\n          if (e.preventDefault) e.preventDefault();\n          return true;\n        }\n        if (ctx.commands.run(\"removeSelectedDivider\").ok) {\n          if (e.preventDefault) e.preventDefault();\n          return true;\n        }\n        return false;\n      }\n      if (!mod && (k.indexOf(\"arrow\") === 0 || k === \"[\" || k === \"]\" || k === \"{\" || k === \"}\") && ctx.inside && ctx.inside.key(e)) {\n        if (e.preventDefault) e.preventDefault();\n        return true;\n      }\n      return false;\n    }\n    function partTakesArrow(k) {\n      const s = ctx.inside && ctx.inside.selectedInterior ? ctx.inside.selectedInterior() : null;\n      if (!s) return false;\n      return s.kind === \"shelf\" || s.kind === \"hdivider\" ? k === \"ArrowUp\" || k === \"ArrowDown\" : k === \"ArrowLeft\" || k === \"ArrowRight\";\n    }\n    function canvasKey(e) {\n      const k = e.key, v = ctx.view, S2 = v.STEP;\n      if (partTakesArrow(k)) return false;\n      let used = true;\n      if (k === \"ArrowLeft\") v.rotBy(-S2, 0);\n      else if (k === \"ArrowRight\") v.rotBy(S2, 0);\n      else if (k === \"ArrowUp\") v.rotBy(0, S2);\n      else if (k === \"ArrowDown\") v.rotBy(0, -S2);\n      else if (k === \"Home\") v.front();\n      else if (k === \"-\" || k === \"_\") v.zoomOut();\n      else if (k === \"+\" || k === \"=\") v.zoomIn();\n      else if ((k === \"m\" || k === \"M\") && !e.ctrlKey && !e.metaKey && !e.altKey) ctx.commands.run(\"measureTool\");\n      else used = false;\n      if (used && e.preventDefault) e.preventDefault();\n      return used;\n    }\n    const keyboard = { windowKey, canvasKey, typingInField };\n    ctx.keyboard = keyboard;\n    return keyboard;\n  }\n\n  // v2/src/interact/tray.js\n  function installTray(ctx) {\n    const st = ctx.st;\n    const later = ctx.opts.later || ((fn) => globalThis.setTimeout(fn, 0));\n    const drag0 = {};\n    const listeners = [];\n    st.trayGhost = null;\n    function inside(r, ev) {\n      return ev.clientX >= r.left && ev.clientX <= r.left + r.width && ev.clientY >= r.top && ev.clientY <= r.top + r.height;\n    }\n    function showGhost(type, fx, fz) {\n      const probe = newUnit(type);\n      probe.x = fx - probe.w / 2;\n      probe.z = fz - probe.d / 2;\n      const cs = ctx.canvasSize();\n      const cw = cs.w, ch = cs.h;\n      const pts = [];\n      for (const b of footBoxes(probe)) {\n        for (const c of [[b.x0, b.z0], [b.x1, b.z0], [b.x1, b.z1], [b.x0, b.z1]]) {\n          const nd = ctx.worldToNdc([c[0], 0, c[1]]);\n          if (nd) pts.push([Math.round((nd[0] + 1) / 2 * cw), Math.round((1 - nd[1]) / 2 * ch)]);\n        }\n      }\n      if (!pts.length) return;\n      st.trayGhost = { type, points: pts.slice(0, 4), width: cw, height: ch };\n      ctx.changed(\"tray-ghost\");\n    }\n    function hideGhost() {\n      if (st.trayGhost) {\n        st.trayGhost = null;\n        ctx.changed(\"tray-ghost\");\n      }\n    }\n    function start2(type, e) {\n      drag0[type] = { x: e.clientX, y: e.clientY, moved: false };\n      listeners.push({ type });\n      return true;\n    }\n    function mv(type, ev) {\n      const d = drag0[type];\n      if (!d) return;\n      if (!d.moved && Math.hypot(ev.clientX - d.x, ev.clientY - d.y) < 6) return;\n      d.moved = true;\n      const r = ctx.liveRect();\n      if (!r) return;\n      if (!inside(r, ev)) {\n        hideGhost();\n        return;\n      }\n      const nd = ctx.ndcFromEvent(ev.clientX, ev.clientY);\n      const hit2 = ctx.screenToFloor(nd[0], nd[1], 0);\n      if (hit2) showGhost(type, hit2[0], hit2[2]);\n    }\n    function up1(type, ev) {\n      hideGhost();\n      const d = drag0[type];\n      if (d && d.moved) {\n        const r = ctx.liveRect();\n        if (r && inside(r, ev)) {\n          const nd = ctx.ndcFromEvent(ev.clientX, ev.clientY);\n          const hit2 = ctx.screenToFloor(nd[0], nd[1], 0);\n          if (hit2) {\n            ctx.commands.run(\"dropUnit\", { type, x: hit2[0], z: hit2[2] });\n            ctx.changed(\"tray-drop\");\n          }\n        }\n        later(() => {\n          drag0[type] = null;\n        });\n      } else {\n        drag0[type] = null;\n      }\n    }\n    function move(e) {\n      const list = listeners.slice();\n      for (let i = 0; i < list.length; i++) mv(list[i].type, e);\n    }\n    function up(e) {\n      const list = listeners.slice();\n      listeners.length = 0;\n      for (let i = 0; i < list.length; i++) up1(list[i].type, e);\n    }\n    function consumeClick(type) {\n      const d = drag0[type];\n      if (d && d.moved) {\n        drag0[type] = null;\n        return true;\n      }\n      return false;\n    }\n    function ghost() {\n      return st.trayGhost;\n    }\n    function dragging() {\n      return listeners.length > 0;\n    }\n    const tray = { start: start2, move, up, consumeClick, ghost, dragging };\n    ctx.tray = tray;\n    return tray;\n  }\n\n  // v2/src/interact/cmd-units.js\n  function fitToGap(units, nu, anchor) {\n    if (!nu || isCornerUnit(nu) || isIsland(nu) || isTall(nu)) return null;\n    if (nu.family !== \"base\" && nu.family !== \"wall\") return null;\n    const walls = isCornerUnit(anchor) ? anchorWalls(units, anchor) : [];\n    if (walls.length > 1) {\n      const af0 = foot(anchor);\n      let best = null;\n      for (const wid of walls) {\n        const hz = alongAxisForWall(wid) === \"x\";\n        const lo0 = hz ? af0.x0 : af0.z0, hi0 = hz ? af0.x1 : af0.z1;\n        for (const g2 of wallFreeSpans(units, nu, wid)) {\n          if (g2.len < FIT_MIN - 0.5) continue;\n          const touching = Math.abs(g2.from - hi0) <= FIT_TOL || Math.abs(g2.to - lo0) <= FIT_TOL;\n          const occupied = g2.before && !isCornerUnit(g2.before) || g2.after && !isCornerUnit(g2.after);\n          const score = (occupied ? 4 : 0) + (touching ? 3 : 0) + Math.min(1, g2.len / 4e3);\n          if (!best || score > best.score) best = { g: g2, wall: wid, score };\n        }\n      }\n      if (best) {\n        const r2 = seatInSpan(units, nu, best.wall, best.g, anchor);\n        if (r2) return r2;\n      }\n      return null;\n    }\n    const R4 = runFreeSpans(units, nu, anchor);\n    if (!R4 || !R4.spans.length) return null;\n    const elev = R4.elev, horiz = elev.horiz;\n    const af = anchor ? foot(anchor) : null;\n    const lo = af ? horiz ? af.x0 : af.z0 : null;\n    const hi = af ? horiz ? af.x1 : af.z1 : null;\n    const usable = R4.spans.filter((g2) => g2.len >= FIT_MIN - 0.5);\n    if (!usable.length) return null;\n    let pick = null;\n    if (af) {\n      for (const g2 of usable) {\n        if (pick) continue;\n        if (Math.abs(g2.to - lo) <= FIT_TOL || Math.abs(g2.from - hi) <= FIT_TOL) pick = g2;\n      }\n    }\n    if (!pick && af) {\n      const mid = (lo + hi) / 2;\n      let best = Infinity;\n      for (const g2 of usable) {\n        const d = Math.abs((g2.from + g2.to) / 2 - mid);\n        if (d < best) {\n          best = d;\n          pick = g2;\n        }\n      }\n    }\n    if (!pick) pick = usable[0];\n    const std = nu.w;\n    const exact = Math.abs(pick.len - std) <= FIT_TOL;\n    if (exact) return null;\n    if (pick.len < FIT_MIN - 0.5) return null;\n    if (pick.len >= std + FIT_MIN) return null;\n    const want = Math.round(pick.len);\n    const host = pick.before || pick.after || anchor;\n    if (host && host.family === nu.family) {\n      nu.h = host.h;\n      nu.d = host.d;\n      if (nu.family === \"wall\") nu.y = host.y || nu.y;\n    }\n    const snap3 = { x: nu.x, z: nu.z, rot: nu.rot, w: nu.w, doors: nu.doors };\n    nu.w = want;\n    if (nu.doors === 2 && want <= ONE_DOOR_MAX) nu.doors = 1;\n    nu.fitted = true;\n    if (!attachToRoomWall(units, nu, elev.wall, (pick.from + pick.to) / 2)) {\n      nu.x = snap3.x;\n      nu.z = snap3.z;\n      nu.rot = snap3.rot;\n      nu.w = snap3.w;\n      nu.doors = snap3.doors;\n      delete nu.fitted;\n      return null;\n    }\n    const f = foot(nu);\n    if (horiz) nu.x += pick.from - f.x0;\n    else nu.z += pick.from - f.z0;\n    const bad = behindWall(nu, nu.x, nu.z) || (units || []).some((v) => v !== nu && v.id !== nu.id && sameLevel(v, nu) && overlaps(v, nu)) || zonesOf(nu).length > 0;\n    if (bad) {\n      nu.x = snap3.x;\n      nu.z = snap3.z;\n      nu.rot = snap3.rot;\n      nu.w = snap3.w;\n      nu.doors = snap3.doors;\n      delete nu.fitted;\n      return null;\n    }\n    return {\n      ok: true,\n      span: want,\n      wall: elev.wall,\n      from: pick.from,\n      to: pick.to,\n      host\n    };\n  }\n  function seatInSpan(units, nu, wallId, g2, anchor) {\n    const horiz = alongAxisForWall(wallId) === \"x\";\n    const std = nu.w;\n    const host = g2.before || g2.after || anchor;\n    const snap3 = { x: nu.x, z: nu.z, rot: nu.rot, w: nu.w, h: nu.h, d: nu.d, y: nu.y, doors: nu.doors };\n    if (host && (host.family === nu.family || isCornerUnit(host))) {\n      if (host.h) nu.h = host.h;\n      if (host.d) nu.d = host.d;\n      if (nu.family === \"wall\" && host.y != null) nu.y = host.y;\n    }\n    let fitted = false;\n    if (g2.len < std + FIT_MIN && Math.abs(g2.len - std) > FIT_TOL) {\n      if (g2.len < FIT_MIN - 0.5) {\n        return null;\n      }\n      nu.w = Math.round(g2.len);\n      nu.fitted = true;\n      fitted = true;\n      if (nu.doors === 2 && nu.w <= ONE_DOOR_MAX) nu.doors = 1;\n    } else if (g2.len < std - FIT_TOL) {\n      return null;\n    }\n    if (!attachToRoomWall(units, nu, wallId, (g2.from + g2.to) / 2)) {\n      nu.x = snap3.x;\n      nu.z = snap3.z;\n      nu.rot = snap3.rot;\n      nu.w = snap3.w;\n      nu.doors = snap3.doors;\n      nu.h = snap3.h;\n      nu.d = snap3.d;\n      nu.y = snap3.y;\n      delete nu.fitted;\n      return null;\n    }\n    const f = foot(nu);\n    let lowSide = true;\n    if (anchor) {\n      const af = foot(anchor);\n      const aLo = horiz ? af.x0 : af.z0, aHi = horiz ? af.x1 : af.z1;\n      if (Math.abs(g2.to - aLo) <= FIT_TOL) lowSide = false;\n      else if (Math.abs(g2.from - aHi) <= FIT_TOL) lowSide = true;\n    }\n    if (lowSide) {\n      if (horiz) nu.x += g2.from - f.x0;\n      else nu.z += g2.from - f.z0;\n    } else {\n      if (horiz) nu.x += g2.to - f.x1;\n      else nu.z += g2.to - f.z1;\n    }\n    const bad = behindWall(nu, nu.x, nu.z) || (units || []).some((v) => v !== nu && v.id !== nu.id && sameLevel(v, nu) && overlaps(v, nu)) || zonesOf(nu).length > 0;\n    if (bad) {\n      nu.x = snap3.x;\n      nu.z = snap3.z;\n      nu.rot = snap3.rot;\n      nu.w = snap3.w;\n      nu.h = snap3.h;\n      nu.d = snap3.d;\n      nu.y = snap3.y;\n      delete nu.fitted;\n      return null;\n    }\n    return { ok: true, span: fitted ? nu.w : null, wall: wallId, beside: !!host };\n  }\n  function libSpec(id) {\n    if (id === \"base-double\") return { type: \"base\", doors: 2, w: 800 };\n    if (id === \"wall-double\") return { type: \"wall\", doors: 2, w: 800 };\n    if (id === \"base\") return { type: \"base\", doors: 1 };\n    if (id === \"wall\") return { type: \"wall\", doors: 1 };\n    if (id === \"island\") return { type: \"island\" };\n    if (id === \"tall-pantry\" || id === \"tall-fridge\" || id === \"tall-oven\")\n      return { type: id };\n    if (id === \"base-oven\") return { type: \"base-oven\" };\n    if (id === \"base-oven-hood\") return { type: \"base-oven\", hood: true };\n    return { type: id };\n  }\n  function tileOf(u) {\n    if (!u) return null;\n    if (u.type === \"base\" || u.type === \"wall\") return u.type + (u.doors === 2 ? \"-double\" : \"\");\n    if (u.type === \"base-oven\") return u.hood ? \"base-oven-hood\" : \"base-oven\";\n    return u.type;\n  }\n  var PLUS_TILES = [\n    \"base\",\n    \"base-double\",\n    \"base-drawer\",\n    \"base-4drawer\",\n    \"wall\",\n    \"wall-double\",\n    \"tall-pantry\",\n    \"tall-fridge\",\n    \"tall-oven\",\n    \"base-oven\",\n    \"base-oven-hood\"\n  ];\n  var TILE_NAME = {\n    \"base\": \"Base 1 door\",\n    \"base-double\": \"Base 2 doors\",\n    \"base-drawer\": \"Base + drawer\",\n    \"base-4drawer\": \"Four drawer\",\n    \"wall\": \"Wall 1 door\",\n    \"wall-double\": \"Wall 2 doors\",\n    \"corner-l\": \"L corner\",\n    \"corner-blind\": \"Blind corner\",\n    \"corner-wall\": \"L corner wall\",\n    \"corner-tall\": \"L corner tall\",\n    \"island\": \"Island\",\n    \"tall-pantry\": \"Tall pantry\",\n    \"tall-fridge\": \"Fridge housing\",\n    \"tall-oven\": \"Oven tower\",\n    \"base-oven\": \"Oven + hob\",\n    \"base-oven-hood\": \"Oven, hob + hood\"\n  };\n  function plusTileOk(src, tile) {\n    return !!src && !!tile && (PLUS_TILES.indexOf(tile) >= 0 || tile === tileOf(src));\n  }\n  var PLUS_FINISH_KEYS = [\"finish\", \"doorFinish\", \"frontFinish\", \"plinthFinish\", \"ovCarcass\", \"ovFronts\", \"ovSkin\", \"frontStyle\", \"ovStyle\", \"frontMat\"];\n  function plusUnit(src, tile, carcass2, probe) {\n    const spec = libSpec(tile), type = spec.type;\n    const n = probe ? nextUid() : 0;\n    if (probe) setUid(n);\n    const u = newUnit(type);\n    if (probe) {\n      setUid(n);\n      u.id = \"__qadd_pick\";\n    }\n    if (spec.doors) u.doors = spec.doors;\n    if (spec.w) u.w = spec.w;\n    if (type !== \"base-4drawer\" && type !== \"island\" && type !== \"base-oven\") u.door = true;\n    if (spec.hood) u.hood = true;\n    for (const k of PLUS_FINISH_KEYS) if (src[k] !== void 0) u[k] = src[k];\n    if (src.ovPlinth) u.ovPlinth = JSON.parse(JSON.stringify(src.ovPlinth));\n    if (src.shaker) u.shaker = { ...src.shaker };\n    if (src.ovShaker) u.ovShaker = { ...src.ovShaker };\n    if (src.paint) u.paint = { ...src.paint };\n    const tier = (v) => v.type === \"island\" || isTall(v) || isCornerUnit(v) ? null : v.family;\n    if (tier(u) && tier(u) === tier(src)) {\n      const lim = limitsFor(u), cl = (v, r) => Math.max(r[0], Math.min(r[1], v));\n      if (Number(src.h) > 0) u.h = cl(src.h, lim.h);\n      if (Number(src.d) > 0) u.d = cl(src.d, lim.d);\n      u.y = src.y || 0;\n    }\n    if (carcass2 && CARCASS_TYPES.indexOf(tile) >= 0) makeCarcassOnly(u);\n    return u;\n  }\n  var CARCASS_TYPES = [\n    \"base\",\n    \"base-double\",\n    \"base-drawer\",\n    \"base-4drawer\",\n    \"wall\",\n    \"wall-double\",\n    \"corner-l\",\n    \"corner-blind\",\n    \"corner-wall\",\n    \"corner-tall\",\n    \"island\",\n    \"tall-pantry\",\n    \"tall-fridge\",\n    \"tall-oven\",\n    \"base-oven\",\n    \"base-oven-hood\"\n  ];\n  function makeCarcassOnly(u) {\n    if (u.type !== \"base-4drawer\" && u.type !== \"island\") {\n      u.door = false;\n      u.doorOpen = false;\n    }\n    if (u.type === \"base-drawer\" || u.type === \"base-4drawer\" || u.type === \"island\" || u.type === \"base-oven\") u.drawerFronts = false;\n    if (u.type === \"island\") u.bayDoors = false;\n    return u;\n  }\n  var EXPLODED_EDIT = \"Exploded view is a preview \\u2014 set it back to Assembled to edit\";\n  var EXPLODED_TURN = \"Exploded view is a preview \\u2014 set it back to Assembled to turn cabinets\";\n  function installUnitCommands(ctx) {\n    const scene = ctx.scene, st = ctx.st, hist = ctx.hist;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    function carcassOnly(type) {\n      return !!scene.addCarcass && CARCASS_TYPES.indexOf(type) >= 0;\n    }\n    define(\"setAddMode\", {\n      history: null,\n      args: { carcass: \"true = new cabinets come without doors; false = complete (the default)\" },\n      doc: \"Add panel: complete cabinets (default) or carcass only - interface state, not saved, no Undo (task 1791045019714)\",\n      run(a) {\n        const on = !!(a && a.carcass);\n        scene.addCarcass = on;\n        cue(on ? \"Carcass only: new cabinets come without doors or drawer fronts - fit them later with Fronts\" : \"Complete cabinets: new cabinets come with their doors\");\n        ctx.syncControls();\n        return { ok: true, carcass: on };\n      }\n    });\n    function addUnit(id) {\n      const spec = libSpec(id);\n      const type = spec.type;\n      st.histAddBefore = hist.snap();\n      if (scene.explode > 0) {\n        cue(EXPLODED_EDIT);\n        return { ok: false, why: \"exploded\" };\n      }\n      syncRoom(scene.units);\n      const hadUnits = scene.units.length > 0;\n      const anchor0 = ctx.sel();\n      const nu = newUnit(type);\n      if (spec.doors) nu.doors = spec.doors;\n      if (spec.w) nu.w = spec.w;\n      if (type !== \"base-4drawer\" && type !== \"island\" && type !== \"base-oven\") nu.door = true;\n      if (spec.hood) nu.hood = true;\n      if (carcassOnly(type)) makeCarcassOnly(nu);\n      let placed;\n      if (type === \"corner-l\" || type === \"corner-tall\") {\n        placeNew(scene.units, nu);\n        placed = true;\n      } else if (isCornerUnit(nu) && !roomOn() && seatAtInferredCorner(scene.units, nu)) {\n        placed = true;\n      } else {\n        const fit = fitToGap(scene.units, nu, anchor0);\n        if (fit && fit.ok) {\n          placed = true;\n          if (fit.span) nu.fittedSpan = fit.span;\n        } else placed = placeByAnchor(scene.units, nu, ctx.sel());\n      }\n      let fellBack = null;\n      if (!placed && !isCornerUnit(nu)) {\n        const r2 = isIsland(nu) ? placeFreeFloor(scene.units, nu) : placeNearestLegal(scene.units, nu, anchor0);\n        if (r2 && r2.ok) {\n          placed = true;\n          fellBack = r2;\n        }\n      }\n      if (!placed) {\n        cue(type === \"island\" ? \"There is no clear floor anywhere in this room for an island \\u2014 move something, or make the room bigger\" : isCornerUnit(nu) ? \"Every corner that would take this one is occupied \\u2014 move a corner cabinet first\" : \"This room is full at that height \\u2014 there is nowhere legal left for another \" + (spec.label ? String(spec.label).toLowerCase() : \"cabinet\") + \". Move something, or make the room bigger.\");\n        return { ok: false, why: \"full\" };\n      }\n      scene.units.push(nu);\n      scene.selectedId = nu.id;\n      const addBefore = st.histAddBefore;\n      st.histAddBefore = null;\n      let inhMsg = null;\n      let fbMsg = null;\n      if (nu.fittedSpan) fbMsg = \"Fitted to \" + nu.fittedSpan + \" mm gap\";\n      if (fellBack) {\n        fbMsg = fellBack.floor ? \"No room beside that one, so it went to the clearest floor space \\u2014 drag it where you want it\" : fellBack.sameWall ? \"No room right there, so it went to the nearest free spot on the same wall\" : \"That wall is full, so it went to the nearest free spot on another wall\";\n        const src = anchor0 && scene.units.find((v) => v.id === anchor0.id);\n        if (src && quickAddable(src)) {\n          const small = [\"left\", \"right\"].map((sd) => gapBeside2(src, sd)).filter((g2) => g2 != null && g2 < CABINET_MIN_W);\n          if (small.length) fbMsg = \"The \" + Math.max(...small) + \" mm gap beside it is under the \" + CABINET_MIN_W + \" mm minimum - \" + fbMsg.charAt(0).toLowerCase() + fbMsg.slice(1);\n        }\n      }\n      if (runInheritEligible(nu)) {\n        const inh = inheritRunDims(scene.units, nu);\n        if (inh.ok && !inh.already) inhMsg = runInheritCue(inh, nu);\n        else if (!inh.ok && !inh.none) inhMsg = inh.why;\n      }\n      if (isCornerUnit(nu)) {\n        const host = anchor0 && isCornerUnit(anchor0) && anchor0.id !== nu.id ? anchor0 : null;\n        let shared = null;\n        if (host) {\n          if (sameLevel(host, nu)) {\n            cue(\"There is already a corner cabinet at that height - placing this one in a free corner\");\n          } else {\n            shared = seatSharingCorner(scene.units, nu, host);\n            if (shared) cue(\"Placed in the same corner, \" + ((nu.y || 0) > (host.y || 0) ? \"above \" : \"below \") + displayName(scene.units, host));\n            else cue(\"That corner will not take this one - placing it in a free corner\");\n          }\n        }\n        if (!shared) {\n          const want = host ? cornerTargetFor(scene.units, nu, host) : cornerTargetFirstThatFits(scene.units, nu);\n          if (!want) {\n            scene.units.pop();\n            scene.selectedId = anchor0 ? anchor0.id : null;\n            cue(\"There is no room corner free for this cabinet, so nothing was added\");\n            ctx.syncControls();\n            ctx.refresh();\n            return { ok: false, why: \"no corner\" };\n          }\n          const fit = fitCornerArms(scene.units, nu, want);\n          if (!fit.ok) {\n            scene.units.pop();\n            scene.selectedId = anchor0 ? anchor0.id : null;\n            cue(fit.why || \"That corner will not take this cabinet, so nothing was added\");\n            ctx.syncControls();\n            ctx.refresh();\n            return { ok: false, why: fit.why || \"corner\" };\n          }\n          cue(fit.changed ? \"Fitted into the \" + want.replace(\"-\", \" \") + \" corner - arms shortened from \" + fit.wasA + \" and \" + fit.wasB + \" mm to \" + fit.armA + \" and \" + fit.armB + \" mm; depth \" + nu.d + \" mm unchanged\" : \"Placed in the \" + want.replace(\"-\", \" \") + \" corner, turned to fit it\");\n        }\n      }\n      resolveFinishes(scene.units, scene.kitchen);\n      if (type === \"corner-l\") {\n        syncRoom(scene.units);\n        scene.activeRun = \"return\";\n      } else if (nu.run) scene.activeRun = nu.run;\n      if (!hadUnits || !scene.frame) {\n        scene.frame = ctx.render.frameOf(scene.units);\n        scene.zoom = 1;\n      }\n      ctx.refreshCues();\n      hist.pushAfter(\"add cabinet\", addBefore);\n      if (fbMsg) cue(fbMsg);\n      else if (inhMsg) cue(inhMsg);\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true, id: nu.id };\n    }\n    define(\"addUnit\", {\n      history: \"add cabinet\",\n      args: { type: \"id \\u043F\\u043B\\u0438\\u0442\\u043A\\u0438 \\u0431\\u0438\\u0431\\u043B\\u0438\\u043E\\u0442\\u0435\\u043A\\u0438 (base, base-double, wall, corner-l, island, \\u2026)\" },\n      doc: \"\\u0414\\u043E\\u0431\\u0430\\u0432\\u0438\\u0442\\u044C \\u0448\\u043A\\u0430\\u0444 \\u0440\\u044F\\u0434\\u043E\\u043C \\u0441 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u043C (\\u043A\\u043D\\u043E\\u043F\\u043A\\u0430 \\u0438 \\u043F\\u043B\\u0438\\u0442\\u043A\\u0430 \\u043B\\u043E\\u0442\\u043A\\u0430; 25-controls.js addUnit)\",\n      run: (a) => addUnit(a.type)\n    });\n    const narrowFitFamily = (u) => !isIsland(u) && !isCornerUnit(u) && !isTall(u) && (u.family === \"base\" || u.family === \"wall\");\n    function gapBeside2(s, side) {\n      const n0 = nextUid();\n      setUid(n0);\n      const pr = newUnit(s.family === \"wall\" ? \"wall\" : \"base\", 0, 0);\n      setUid(n0);\n      pr.id = \"__qadd_gap\";\n      pr.doors = 1;\n      if (s.family === \"wall\") {\n        pr.y = s.y;\n        pr.h = s.h;\n      } else pr.h = s.h;\n      pr.d = s.d;\n      const fits2 = (w) => {\n        pr.w = w;\n        return placeBeside(scene.units, pr, s, side);\n      };\n      if (!fits2(1)) return null;\n      let lo = 1, hi = 2100;\n      if (fits2(hi)) return hi;\n      while (hi - lo > 1) {\n        const m = lo + hi >> 1;\n        if (fits2(m)) lo = m;\n        else hi = m;\n      }\n      return lo;\n    }\n    function backOnWall3(u) {\n      if (seatWalls()) return backOnWall(u);\n      const f = foot(u), sz = roomSize(), k = ((u.rot || 0) % 4 + 4) % 4, T3 = 1;\n      return k === 0 ? Math.abs(f.z0) < T3 : k === 1 ? Math.abs(f.x1 - sz.width) < T3 : k === 2 ? Math.abs(f.z1 - sz.depth) < T3 : Math.abs(f.x0) < T3;\n    }\n    function resolveDrop(type, fx, fz, preview) {\n      const n0 = preview ? nextUid() : 0;\n      if (preview) setUid(n0);\n      const dbl = type === \"base-double\" || type === \"wall-double\" ? libSpec(type) : null;\n      if (dbl) type = dbl.type;\n      const hoodTile = type === \"base-oven-hood\";\n      if (hoodTile) type = \"base-oven\";\n      const u = newUnit(type);\n      if (dbl) {\n        u.doors = dbl.doors;\n        u.w = dbl.w;\n      }\n      if (preview) {\n        setUid(n0);\n        u.id = \"__drop_preview\";\n      }\n      if (type !== \"base-4drawer\" && type !== \"island\" && type !== \"base-oven\") u.door = true;\n      if (hoodTile) u.hood = true;\n      if (carcassOnly(type)) makeCarcassOnly(u);\n      u.x = fx - u.w / 2;\n      u.z = fz - u.d / 2;\n      let wallId0 = null;\n      let early = null;\n      if (!isIsland(u) && !isCornerUnit(u)) {\n        const near2 = wallsByDistance(fx, fz)[0];\n        if (near2 && near2.d <= RUN_ACQ.on) {\n          const along2 = alongAxisForWall(near2.id) === \"x\" ? fx : fz;\n          if (attachToRoomWall(scene.units, u, near2.id, along2)) {\n            u.run = near2.id === \"back\" ? \"main\" : null;\n            wallId0 = near2.id;\n          } else {\n            u.run = null;\n            const g2 = narrowFitFamily(u) ? wallFreeSpans(scene.units, u, near2.id).find((s2) => along2 >= s2.from - 1 && along2 <= s2.to + 1) : null;\n            if (g2 && g2.len < u.w) {\n              if (g2.len >= CABINET_MIN_W - 0.5) {\n                const keep = { x: u.x, z: u.z, w: u.w, doors: u.doors, rot: u.rot };\n                u.w = Math.floor(g2.len + 1e-6);\n                if (u.doors === 2 && u.w <= ONE_DOOR_MAX) u.doors = 1;\n                if (attachToRoomWall(scene.units, u, near2.id, (g2.from + g2.to) / 2)) {\n                  const f = foot(u), hz = alongAxisForWall(near2.id) === \"x\";\n                  if (hz) u.x += g2.from - f.x0;\n                  else u.z += g2.from - f.z0;\n                  u.run = near2.id === \"back\" ? \"main\" : null;\n                  wallId0 = near2.id;\n                  u.fitted = true;\n                  early = { span: u.w };\n                } else {\n                  u.x = keep.x;\n                  u.z = keep.z;\n                  u.w = keep.w;\n                  u.doors = keep.doors;\n                  u.rot = keep.rot;\n                }\n              } else early = { under: Math.round(g2.len) };\n            }\n          }\n        } else u.run = null;\n      }\n      pushIntoRoom(u);\n      const seat = settleNearWall(scene.units, u, wallsByDistance(fx, fz)[0].id);\n      if (scene.snap !== false && !isIsland(u) && !isCornerUnit(u)) {\n        const snapIn = preview ? st.dropSnap || null : st.dropReuse ? st.dropSnapIn : st.dropSnap || null;\n        const sn = snapUnit(scene.units, u, u.x, u.z, true, snapIn);\n        u.x = sn.x;\n        u.z = sn.z;\n        if (preview) {\n          st.dropSnapIn = snapIn;\n          st.dropAt = { type, fx, fz };\n          st.dropSnap = { x: sn.snapX, z: sn.snapZ };\n        }\n      }\n      let bad = seat && !seat.ok || behindWall(u, u.x, u.z) || scene.units.some((v) => sameLevel(v, u) && overlaps(u, v));\n      let narrow = early;\n      if (!wallId0 && seat && seat.ok && seat.wall) wallId0 = seat.wall;\n      if (bad && !(early && early.span) && !(seat && !seat.ok) && narrowFitFamily(u) && wallId0) {\n        const horiz = alongAxisForWall(wallId0) === \"x\", along2 = horiz ? fx : fz;\n        const g2 = wallFreeSpans(scene.units, u, wallId0).find((s) => along2 >= s.from - 1 && along2 <= s.to + 1);\n        if (g2 && g2.len < u.w) {\n          if (g2.len >= CABINET_MIN_W - 0.5) {\n            const keep = { x: u.x, z: u.z, w: u.w, doors: u.doors };\n            u.w = Math.floor(g2.len + 1e-6);\n            if (u.doors === 2 && u.w <= ONE_DOOR_MAX) u.doors = 1;\n            const f = foot(u);\n            if (horiz) u.x += g2.from - f.x0;\n            else u.z += g2.from - f.z0;\n            const still = behindWall(u, u.x, u.z) || scene.units.some((v) => sameLevel(v, u) && overlaps(u, v));\n            if (still) {\n              u.x = keep.x;\n              u.z = keep.z;\n              u.w = keep.w;\n              u.doors = keep.doors;\n            } else {\n              bad = false;\n              u.fitted = true;\n              narrow = { span: u.w };\n            }\n          } else narrow = { under: Math.round(g2.len) };\n        }\n      }\n      let offWall = false;\n      if (!bad && u.family === \"wall\" && !isCornerUnit(u) && roomOn() && !backOnWall3(u)) {\n        bad = true;\n        offWall = true;\n      }\n      const zn = bad ? null : zonesOf(u)[0];\n      st[preview ? \"dropDiagP\" : \"dropDiag\"] = {\n        b: !!bad,\n        s: seat ? seat.ok ? 1 : 0 : -1,\n        bw: behindWall(u, u.x, u.z) ? 1 : 0,\n        ov: scene.units.filter((v) => sameLevel(v, u) && overlaps(u, v)).map((v) => v.id),\n        u: [Math.round(u.x), Math.round(u.z), u.w, u.rot || 0],\n        e: early ? early.span || -early.under : 0,\n        n: narrow ? narrow.span || -narrow.under : 0,\n        w0: wallId0 || \"-\"\n      };\n      return { u, bad: !!bad, zn, narrow, offWall };\n    }\n    function previewDrop(type, fx, fz) {\n      const r = resolveDrop(type, fx, fz, true);\n      if (r.u && !(r.bad || r.zn)) {\n        const k = scene.kitchen;\n        resolveFinishes([r.u], k);\n      }\n      const t0 = scene.dropPreview && scene.dropPreview.t0 > 0 ? scene.dropPreview.t0 : 0;\n      scene.dropPreview = {\n        unit: r.u,\n        ok: !(r.bad || r.zn),\n        why: r.zn ? \"opening\" : r.bad ? r.offWall ? \"offwall\" : r.narrow && r.narrow.under != null ? \"narrow\" : \"blocked\" : null,\n        t0,\n        fitted: r.narrow && r.narrow.span ? r.narrow.span : null,\n        gap: r.narrow && r.narrow.under != null ? r.narrow.under : null\n      };\n      return scene.dropPreview;\n    }\n    function clearDropPreview() {\n      st.dropSnap = null;\n      st.dropSnapIn = null;\n      st.dropAt = null;\n      if (scene.dropPreview) {\n        scene.dropPreview = null;\n        return true;\n      }\n      return false;\n    }\n    ctx.previewDrop = previewDrop;\n    ctx.clearDropPreview = clearDropPreview;\n    function dropUnit(type, fx, fz) {\n      const keepSnap = st.dropSnap || null, keepIn = st.dropSnapIn || null, at = st.dropAt;\n      const same = !!(at && at.type === type && Math.abs(at.fx - fx) < 0.01 && Math.abs(at.fz - fz) < 0.01);\n      clearDropPreview();\n      st.dropSnap = keepSnap;\n      st.dropSnapIn = keepIn;\n      st.dropReuse = same;\n      const dropBefore = hist.snap();\n      const { u, bad, zn, narrow, offWall } = resolveDrop(type, fx, fz, false);\n      st.dropSnap = null;\n      st.dropSnapIn = null;\n      st.dropReuse = false;\n      if (zn) {\n        cue(\"Can't drop it there \\u2014 \" + openingWhy(zn));\n        return { ok: false, why: \"opening\" };\n      }\n      const angled = !isIsland(u) && !isCornerUnit(u) && !backOnWall3(u) && nearAngledWallBox(foot(u), RUN_ACQ.on);\n      if (bad && offWall) {\n        cue(angled ? ANGLED_WALL_SAY.replace(\"it stays free-standing where it is\", \"a wall cabinet needs a square wall - nothing was added\") : \"A wall cabinet hangs on a wall - drag it onto a wall to place it; nothing was added\");\n        return { ok: false, why: \"offwall\", angled: !!angled };\n      }\n      if (bad && narrow && narrow.under != null) {\n        cue(\"The gap there is \" + narrow.under + \" mm - the narrowest cabinet is \" + CABINET_MIN_W + \" mm; nothing added\");\n        return { ok: false, why: \"narrow\", gap: narrow.under };\n      }\n      if (bad) {\n        cue(\"No room to drop it there \\u2014 try another spot\");\n        return { ok: false, why: \"blocked\" };\n      }\n      scene.units.push(u);\n      scene.selectedId = u.id;\n      resolveFinishes(scene.units, scene.kitchen);\n      hist.pushAfter(\"add cabinet\", dropBefore);\n      let dropMsg = null;\n      if (runInheritEligible(u)) {\n        const inhD = inheritRunDims(scene.units, u);\n        if (inhD.ok && !inhD.already) dropMsg = runInheritCue(inhD, u);\n        else if (!inhD.ok && !inhD.none) dropMsg = inhD.why;\n      }\n      if (narrow && narrow.span) dropMsg = \"Fitted to the \" + narrow.span + \" mm gap - a \" + narrow.span + \" mm \" + (u.doors === 1 ? \"one-door \" : \"\") + \"cabinet\" + (dropMsg ? \"; \" + dropMsg : \"\");\n      if (angled) dropMsg = ANGLED_WALL_SAY + (dropMsg ? \"; \" + dropMsg : \"\");\n      if (u.run) scene.activeRun = u.run;\n      ctx.refreshCues();\n      if (dropMsg) cue(dropMsg);\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true, id: u.id, unit: u, angled: !!angled };\n    }\n    define(\"dropUnit\", {\n      history: \"add cabinet\",\n      args: { type: \"\\u0442\\u0438\\u043F \\u0448\\u043A\\u0430\\u0444\\u0430\", x: \"\\u043C\\u043C \\u043F\\u043E \\u043F\\u043E\\u043B\\u0443\", z: \"\\u043C\\u043C \\u043F\\u043E \\u043F\\u043E\\u043B\\u0443\" },\n      doc: \"\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u043D\\u043E\\u0432\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444 \\u0432 \\u0442\\u043E\\u0447\\u043A\\u0443 \\u043F\\u043B\\u0430\\u043D\\u0430 (\\u043F\\u0435\\u0440\\u0435\\u0442\\u0430\\u0441\\u043A\\u0438\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0438\\u0437 \\u043B\\u043E\\u0442\\u043A\\u0430; 26-library-tray.js dropUnit)\",\n      run: (a) => dropUnit(a.type, a.x, a.z)\n    });\n    define(\"select\", {\n      history: null,\n      args: { id: \"id \\u0448\\u043A\\u0430\\u0444\\u0430\" },\n      doc: \"\\u0412\\u044B\\u0431\\u0440\\u0430\\u0442\\u044C \\u0448\\u043A\\u0430\\u0444 (\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0430 \\u0448\\u043A\\u0430\\u0444\\u043E\\u0432 [data-ub-pick]; 24-estimate-panel.js)\",\n      run(a) {\n        scene.selectedId = a.id;\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n      }\n    });\n    define(\"duplicate\", {\n      history: \"duplicate cabinet\",\n      doc: \"\\u0414\\u0443\\u0431\\u043B\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444 \\u0432 \\u0441\\u043E\\u0441\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0441\\u0432\\u043E\\u0431\\u043E\\u0434\\u043D\\u044B\\u0439 \\u0441\\u043B\\u043E\\u0442 ([data-ub-duplicate]; 27-sidebar-sections.js)\",\n      run() {\n        const s = ctx.sel();\n        if (!s) return { ok: false, why: \"nothing selected\" };\n        const snapBefore = hist.snap();\n        syncRoom(scene.units);\n        const nu = newUnit(s.type, 0, 0, s);\n        if (!placeByAnchor(scene.units, nu, s)) {\n          cue(\"No space next to this cabinet to duplicate it \\u2014 move it or select another\");\n          return { ok: false, why: \"no space\" };\n        }\n        scene.units.push(nu);\n        scene.selectedId = nu.id;\n        hist.pushAfter(\"duplicate cabinet\", snapBefore);\n        resolveFinishes(scene.units, scene.kitchen);\n        if (nu.run) scene.activeRun = nu.run;\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, id: nu.id };\n      }\n    });\n    define(\"addBeside\", {\n      history: \"add matching cabinet\",\n      args: {\n        side: \"left | right (as seen from the cabinet's front)\",\n        id: \"\\u0448\\u043A\\u0430\\u0444-\\u043E\\u0431\\u0440\\u0430\\u0437\\u0435\\u0446 (\\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439)\",\n        tile: \"\\u043F\\u043B\\u0438\\u0442\\u043A\\u0430 \\u043A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0430, \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0430\\u044F \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0434\\u0432\\u0443\\u043C\\u044F \\u043D\\u0430\\u0436\\u0430\\u0442\\u0438\\u044F\\u043C\\u0438 + (\\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E - \\u0442\\u0430\\u043A\\u043E\\u0439 \\u0436\\u0435 \\u0448\\u043A\\u0430\\u0444, \\u043A\\u0430\\u043A \\u043E\\u0431\\u0440\\u0430\\u0437\\u0435\\u0446; task 1791151587816)\"\n      },\n      doc: \"\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u0442\\u0430\\u043A\\u043E\\u0439 \\u0436\\u0435 \\u0448\\u043A\\u0430\\u0444 (\\u0438\\u043B\\u0438 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0432 \\u043A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0435 \\u0442\\u0438\\u043F) \\u0432\\u043F\\u043B\\u043E\\u0442\\u043D\\u0443\\u044E \\u0441\\u043B\\u0435\\u0432\\u0430 \\u0438\\u043B\\u0438 \\u0441\\u043F\\u0440\\u0430\\u0432\\u0430 \\u043E\\u0442 \\u0448\\u043A\\u0430\\u0444\\u0430 (\\u043A\\u043D\\u043E\\u043F\\u043A\\u0430 + \\u0443 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430, quick-add-dom.js)\",\n      run(a) {\n        a = a || {};\n        const s = a.id ? scene.units.find((v) => v.id === a.id) : ctx.sel();\n        if (!s) return { ok: false, why: \"nothing selected\" };\n        const side = a.side === \"left\" ? \"left\" : a.side === \"right\" ? \"right\" : null;\n        if (!side) return { ok: false, why: \"side must be left or right\" };\n        if (scene.explode > 0) {\n          cue(EXPLODED_EDIT);\n          return { ok: false, why: \"exploded\" };\n        }\n        if (!quickAddable(s)) {\n          cue(\"A corner cabinet has no plain left or right \\u2014 use Duplicate\");\n          return { ok: false, why: \"corner\" };\n        }\n        if (cornerArmSides(s) && !a.tile) a = Object.assign({}, a, { tile: cornerPlusTile(s) });\n        if (a.tile && a.tile !== tileOf(s)) {\n          if (!plusTileOk(s, a.tile)) {\n            cue((TILE_NAME[a.tile] || \"That cabinet\") + \" can't stand beside a cabinet \\u2014 tap it in Add, or drag it onto the plan\");\n            return { ok: false, why: \"not beside\" };\n          }\n          const snap0 = hist.snap();\n          syncRoom(scene.units);\n          const fit2 = besideAdapted(scene.units, s, side, () => plusUnit(s, a.tile, scene.addCarcass, true));\n          const name2 = TILE_NAME[a.tile] || \"cabinet\";\n          if (!fit2) {\n            const probe = plusUnit(s, a.tile, scene.addCarcass, true);\n            placeBeside(scene.units, probe, s, side);\n            const zn = zonesOf(probe)[0];\n            const gp = zn ? null : gapBeside2(s, side);\n            cue(zn ? \"Can't add a \" + name2 + \" on the \" + side + \" \\u2014 \" + openingWhy(zn) + \"; nothing added\" : gp != null && gp < CABINET_MIN_W ? \"The gap on the \" + side + \" is \" + gp + \" mm - the narrowest cabinet is \" + CABINET_MIN_W + \" mm; nothing added\" : gp != null && gp < probe.w ? (/^[aeiou]/i.test(name2) ? \"An \" : \"A \") + name2 + \" is \" + Math.round(probe.w) + \" mm wide and can't be made narrower; the gap on the \" + side + \" is \" + gp + \" mm - nothing added\" : \"No room for a \" + name2 + \" on the \" + side + \" of this cabinet \\u2014 nothing added\");\n            return { ok: false, why: zn ? \"opening\" : \"no space\" };\n          }\n          const nu2 = plusUnit(s, a.tile, scene.addCarcass, false);\n          for (const k of [\"x\", \"z\", \"rot\", \"run\", \"w\", \"doors\", \"y\"]) nu2[k] = fit2.u[k];\n          scene.units.push(nu2);\n          scene.selectedId = nu2.id;\n          hist.pushAfter(\"add matching cabinet\", snap0);\n          resolveFinishes(scene.units, scene.kitchen);\n          if (nu2.run) scene.activeRun = nu2.run;\n          ctx.refreshCues();\n          cue(fit2.adapted ? \"Only room for one door on the \" + side + \" \\u2014 added a \" + Math.round(nu2.w) + \" mm one-door cabinet\" : \"Added a \" + name2 + \" on the \" + side);\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: true, id: nu2.id, side, adapted: fit2.adapted, w: nu2.w, tile: a.tile };\n        }\n        const snapBefore = hist.snap();\n        syncRoom(scene.units);\n        const fit = besideAdapted(scene.units, s, side);\n        if (!fit) {\n          const probe = newUnit(s.type, 0, 0, s);\n          probe.id = \"__qadd_why\";\n          placeBeside(scene.units, probe, s, side);\n          const zn = zonesOf(probe)[0];\n          const gp = zn ? null : gapBeside2(s, side);\n          cue(zn ? \"Can't add on the \" + side + \" \\u2014 \" + openingWhy(zn) + \"; nothing added\" : gp != null && gp < CABINET_MIN_W ? \"The gap on the \" + side + \" is \" + gp + \" mm - the narrowest cabinet is \" + CABINET_MIN_W + \" mm; nothing added\" : \"No room on the \" + side + \" of this cabinet \\u2014 nothing added\");\n          return { ok: false, why: zn ? \"opening\" : \"no space\" };\n        }\n        const nu = newUnit(s.type, 0, 0, s);\n        for (const k of [\"x\", \"z\", \"rot\", \"run\", \"w\", \"doors\"]) nu[k] = fit.u[k];\n        scene.units.push(nu);\n        scene.selectedId = nu.id;\n        hist.pushAfter(\"add matching cabinet\", snapBefore);\n        resolveFinishes(scene.units, scene.kitchen);\n        if (nu.run) scene.activeRun = nu.run;\n        ctx.refreshCues();\n        cue(fit.adapted ? \"Only room for one door on the \" + side + \" \\u2014 added a \" + Math.round(nu.w) + \" mm one-door cabinet\" : \"Added a matching cabinet on the \" + side);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, id: nu.id, side, adapted: fit.adapted, w: nu.w };\n      }\n    });\n    define(\"remove\", {\n      history: \"remove cabinet\",\n      doc: \"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444; \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u043D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u044F\\u0435\\u0442\\u0441\\u044F ([data-ub-remove]; 27-sidebar-sections.js)\",\n      run() {\n        if (scene.units.length <= 1) return { ok: false, why: \"last cabinet\" };\n        const snapBefore = hist.snap();\n        const i = scene.units.indexOf(ctx.sel());\n        scene.units.splice(i, 1);\n        scene.selectedId = scene.units[Math.max(0, i - 1)].id;\n        hist.pushAfter(\"remove cabinet\", snapBefore);\n        ctx.refreshCues();\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    function oneUndoStep(label, spec) {\n      const run0 = spec.run;\n      return Object.assign({}, spec, { run(a) {\n        const before = hist.snap();\n        const r = run0.call(this, a);\n        if (!r || r.ok !== false) hist.pushAfter(label, before);\n        return r;\n      } });\n    }\n    define(\"flip\", oneUndoStep(\"turn cabinet\", {\n      history: \"turn cabinet\",\n      doc: \"\\u0420\\u0430\\u0437\\u0432\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444 \\u043D\\u0430 180\\xB0 ([data-ub-turn-flip]; 26-library-tray.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        if (scene.explode > 0) {\n          cue(EXPLODED_TURN);\n          return { ok: false, why: \"exploded\" };\n        }\n        if (isCornerUnit(u)) {\n          const okc = atomicRoomOp(scene.units, () => {\n            const b = foot(u);\n            const cx = (b.x0 + b.x1) / 2, cz = (b.z0 + b.z1) / 2;\n            clearRoomSide(u);\n            u.rot = (((u.rot || 0) + 2) % 4 + 4) % 4;\n            const a = foot(u);\n            u.x += cx - (a.x0 + a.x1) / 2;\n            u.z += cz - (a.z0 + a.z1) / 2;\n          });\n          ctx.refreshCues();\n          cue(okc ? \"Facing the other way\" : \"No room to face it the other way \\u2014 it would go through a wall or into another cabinet\");\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: !!okc };\n        }\n        const r = flipUnit(scene.units, u);\n        if (r.ok && u.family === \"base\") u.run = null;\n        ctx.refreshCues();\n        cue(r.ok ? \"Facing the other way\" : r.why || \"That turn would not fit\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: !!r.ok, why: r.why };\n      }\n    }));\n    define(\"turn\", oneUndoStep(\"turn cabinet\", {\n      history: \"turn cabinet\",\n      args: { dir: \"-1 \\u2014 \\u043F\\u0440\\u043E\\u0442\\u0438\\u0432 \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E\\u0439 (Turn left), 1 \\u2014 \\u043F\\u043E \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E\\u0439 (Turn right)\" },\n      doc: \"\\u041F\\u043E\\u0432\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444 \\u043D\\u0430 90\\xB0 ([data-ub-turn-left]/[data-ub-turn-right]; 26-library-tray.js)\",\n      run(a) {\n        const dir = a.dir;\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        if (scene.explode > 0) {\n          cue(EXPLODED_TURN);\n          return { ok: false, why: \"exploded\" };\n        }\n        if (isCornerUnit(u)) {\n          const moved = atomicRoomOp(scene.units, () => {\n            clearRoomSide(u);\n            u.rot = (((u.rot || 0) + (dir < 0 ? -1 : 1)) % 4 + 4) % 4;\n          });\n          if (moved) {\n            scene.frame = ctx.render.frameOf(scene.units);\n            scene.zoom = 1;\n          }\n          ctx.refreshCues();\n          cue(moved ? dir < 0 ? \"Turned the corner anticlockwise\" : \"Turned the corner clockwise\" : \"No room to turn the corner \\u2014 it would push cabinets through a wall or into each other\");\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: !!moved };\n        }\n        const r = turnUnit(scene.units, u, dir);\n        if (r.ok && u.family === \"base\") u.run = null;\n        ctx.refreshCues();\n        if (!r.ok && r.reason === \"wall\") {\n          cue(\"No room to turn \\u2014 it would go through the wall\");\n        } else if (!r.ok && r.reason === \"blocked\") {\n          cue(\"No room to turn \\u2014 \" + displayName(scene.units, r.by) + \" is in the way\");\n        } else {\n          cue(wallOffWall(u) ? \"Turned \\u2014 this wall cabinet's back is no longer against the wall\" : dir < 0 ? \"Turned anticlockwise\" : \"Turned clockwise\");\n        }\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: !!r.ok, why: r.reason };\n      }\n    }));\n    define(\"moveInRow\", {\n      history: null,\n      args: { dir: \"-1 \\u2014 \\u0441 \\u043B\\u0435\\u0432\\u044B\\u043C \\u0441\\u043E\\u0441\\u0435\\u0434\\u043E\\u043C, 1 \\u2014 \\u0441 \\u043F\\u0440\\u0430\\u0432\\u044B\\u043C\" },\n      doc: \"\\u041F\\u043E\\u043C\\u0435\\u043D\\u044F\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444 \\u043C\\u0435\\u0441\\u0442\\u0430\\u043C\\u0438 \\u0441 \\u0441\\u043E\\u0441\\u0435\\u0434\\u043E\\u043C \\u043F\\u043E \\u0440\\u044F\\u0434\\u0443 ([data-ub-moveleft]/[data-ub-moveright]; 28-zoom-modes-save.js)\",\n      run(a) {\n        const u = ctx.sel(), n = rowNeighbour(scene.units, u, a.dir);\n        if (!n) return { ok: false, why: \"no neighbour\" };\n        swapUnits(scene.units, u, n, null);\n        cue(\"Cabinets reordered\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    define(\"setDim\", {\n      history: null,\n      args: { k: \"w | w2 | h | d\", value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F\" },\n      doc: \"\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F \\u0441\\u0431\\u043E\\u043A\\u0443 ([data-ub-num]/[data-ub-slider]; 25-controls.js)\",\n      run(a) {\n        return { ok: true, value: ctx.size.sidebarDim(a.k, a.value) };\n      }\n    });\n    return { addUnit, dropUnit };\n  }\n\n  // v2/src/interact/cmd-fronts.js\n  function installFrontCommands(ctx) {\n    const scene = ctx.scene;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    function done2() {\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    define(\"setFrontStyle\", {\n      history: \"front style\",\n      args: { frontStyle: \"slab | shaker | jpull\", shaker: \"panels 1/2/4; frame, rail, railAt, depth in mm\" },\n      doc: \"Set the selected cabinet's OWN front style (an exception to the kitchen's, task 1790895487998) and Shaker panels; the same geometry is used by both renderers.\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        const frontStyle = a.frontStyle || u.frontStyle || \"slab\";\n        if (!okStyle(frontStyle)) return { ok: false, why: \"Choose Flat, Shaker or J-pull\" };\n        if (a.frontStyle && !offeredStyle(frontStyle) && frontStyle !== u.frontStyle) {\n          cue(NOT_OFFERED);\n          done2();\n          return { ok: false, why: NOT_OFFERED };\n        }\n        if (isPaintedOnly(frontStyle) && effFrontMat(u, scene.kitchen) !== \"mdf-paint\") {\n          const why2 = JPULL_NEEDS_PAINT + \" - choose Painted MDF under Doors (whole kitchen) first\";\n          cue(why2);\n          done2();\n          return { ok: false, why: why2 };\n        }\n        const shaker = { ...u.shaker || {}, ...a.shaker || {} };\n        const next = { ...u, frontStyle, shaker };\n        const why = shakerError(next);\n        if (why) {\n          cue(why);\n          done2();\n          return { ok: false, why };\n        }\n        ctx.hist.run(\"front style\", () => {\n          u.ovStyle = frontStyle;\n          u.ovShaker = { ...shaker };\n          delete u.glassFrom;\n          const p = Number((a.shaker || {}).panels);\n          if (p === 2 || p === 4) u.pockets = p;\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        done2();\n        return { ok: true, frontStyle, shaker };\n      }\n    });\n    define(\"setTallPockets\", {\n      history: \"tall door panels\",\n      args: { n: \"1 | 2 | 4\" },\n      doc: \"Pockets on the selected cabinet's TALL Shaker door fronts: 1, 2 (larger upper, smaller lower) or 4 equal; small fronts stay one pocket; one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        const n = Number(a && a.n);\n        if (POCKET_CHOICES.indexOf(n) < 0) return { ok: false, why: \"Choose 1, 2 or 4 panels\" };\n        const tall = tallFronts(u);\n        if (!tall.length) {\n          const why2 = \"This cabinet has no tall door front - its doors and drawer fronts take one panel each\";\n          cue(why2);\n          done2();\n          return { ok: false, why: why2 };\n        }\n        if (tallPocketChoice(u) === n && u.pockets === n) {\n          done2();\n          return { ok: true, changed: false, n };\n        }\n        const why = shakerError({ ...u, frontStyle: \"shaker\", shaker: u.shaker || {}, pockets: n });\n        if (why) {\n          cue(why);\n          done2();\n          return { ok: false, why };\n        }\n        ctx.hist.run(\"tall door panels\", () => {\n          u.pockets = n;\n        });\n        cue(tall.map((f) => f.name).join(\" and \") + \": \" + n + (n === 1 ? \" panel - one pocket\" : \" panels\") + (n === 1 ? \"\" : n === 2 ? \" - a larger upper and a smaller lower\" : \" - four equal, one above the other\"));\n        done2();\n        return { ok: true, changed: true, n };\n      }\n    });\n    define(\"toggleDoor\", {\n      history: \"door\",\n      doc: \"\\u0414\\u043E\\u0431\\u0430\\u0432\\u0438\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0443\\u0431\\u0440\\u0430\\u0442\\u044C \\u0434\\u0432\\u0435\\u0440\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 ([data-ub-door]; 28-zoom-modes-save.js); \\u043E\\u0434\\u043D\\u0430 \\u0437\\u0430\\u043F\\u0438\\u0441\\u044C Undo\",\n      run() {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        if (u.type === \"base-4drawer\") return { ok: false, why: \"drawer bank\" };\n        if (u.type === \"base-oven\") {\n          const why = \"An oven + hob base has no door - its front is the panel below the oven\";\n          cue(why);\n          return { ok: false, why };\n        }\n        ctx.hist.run(\"door\", () => {\n          u.door = !u.door;\n          if (!u.door) {\n            u.doorOpen = false;\n            scene.hingeZoom = false;\n          }\n        });\n        done2();\n        return { ok: true, on: u.door };\n      }\n    });\n    define(\"toggleDrawerFronts\", {\n      history: \"drawer fronts\",\n      doc: \"Fit or take off the drawer fronts of the selected cabinet (an island: all its section fronts); box heights stay; one Undo\",\n      run() {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        const added = Array.isArray(u.xdr) && u.xdr.length > 0;\n        if (u.type !== \"base-drawer\" && u.type !== \"base-4drawer\" && u.type !== \"island\" && u.type !== \"base-oven\" && !added) {\n          const why = \"This cabinet has no drawer fronts\";\n          cue(why);\n          return { ok: false, why };\n        }\n        const on = u.type === \"island\" ? !(u.drawerFronts !== false || u.bayDoors !== false) : u.drawerFronts === false;\n        ctx.hist.run(\"drawer fronts\", () => {\n          if (on) delete u.drawerFronts;\n          else u.drawerFronts = false;\n          if (u.type === \"island\") {\n            if (on) delete u.bayDoors;\n            else u.bayDoors = false;\n          }\n        });\n        if (!on && scene.selPart && !partById(u, scene.selPart)) scene.selPart = null;\n        cue(u.type === \"base-oven\" ? on ? \"Panel below the oven fitted\" : \"Panel below the oven taken off - the oven stays\" : u.type === \"island\" ? on ? \"Island fronts fitted\" : \"Island fronts taken off - the sections stay\" : on ? \"Drawer fronts fitted - the boxes keep their heights\" : \"Drawer fronts taken off - the boxes stay inside\");\n        done2();\n        return { ok: true, on };\n      }\n    });\n    define(\"toggleDoorOpen\", {\n      history: null,\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C \\u0434\\u0432\\u0435\\u0440\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 ([data-ub-dooropen]; 28-zoom-modes-save.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u.door) return { ok: false, why: \"no door\" };\n        u.doorOpen = !u.doorOpen;\n        done2();\n        return { ok: true, open: u.doorOpen };\n      }\n    });\n    define(\"toggleDrawerOpen\", {\n      history: null,\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C \\u044F\\u0449\\u0438\\u043A \\u0448\\u043A\\u0430\\u0444\\u0430 \\u0441 \\u044F\\u0449\\u0438\\u043A\\u043E\\u043C ([data-ub-draweropen]; 28-zoom-modes-save.js)\",\n      run() {\n        const u = ctx.sel();\n        if (u.type !== \"base-drawer\") return { ok: false, why: \"not a drawer unit\" };\n        u.drawerOpen = !u.drawerOpen;\n        done2();\n        return { ok: true, open: u.drawerOpen };\n      }\n    });\n    define(\"toggleDrawer\", {\n      history: null,\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u044F\\u0449\\u0438\\u043A\\u0430 0\\u20263\" },\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C \\u043E\\u0434\\u0438\\u043D \\u044F\\u0449\\u0438\\u043A \\u0447\\u0435\\u0442\\u044B\\u0440\\u0451\\u0445\\u044A\\u044F\\u0449\\u0438\\u0447\\u043D\\u043E\\u0433\\u043E ([data-ub-drawer-n]; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"base-4drawer\") return { ok: false, why: \"not a drawer bank\" };\n        const i = a.i;\n        u.drawers[i] = !u.drawers[i];\n        done2();\n        return { ok: true };\n      }\n    });\n    define(\"toggleAllDrawers\", {\n      history: null,\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0432\\u0441\\u0435 \\u044F\\u0449\\u0438\\u043A\\u0438 (\\u0435\\u0441\\u043B\\u0438 \\u0445\\u043E\\u0442\\u044C \\u043E\\u0434\\u0438\\u043D \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442) \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C \\u0432\\u0441\\u0435 ([data-ub-drawers-all]; 27-sidebar-sections.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u || u.type !== \"base-4drawer\") return { ok: false, why: \"not a drawer bank\" };\n        const anyShut = u.drawers.some((v) => !v);\n        u.drawers = u.drawers.map(() => anyShut);\n        done2();\n        return { ok: true };\n      }\n    });\n    define(\"setBlindHand\", {\n      history: null,\n      args: { hand: \"left | right\" },\n      doc: \"\\u0421\\u0442\\u043E\\u0440\\u043E\\u043D\\u0430 \\u0433\\u043B\\u0443\\u0445\\u043E\\u0439 \\u0447\\u0430\\u0441\\u0442\\u0438 \\u0443\\u0433\\u043B\\u043E\\u0432\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 ([data-ub-hand]; 26-library-tray.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"corner-blind\") return { ok: false, why: \"not a blind corner\" };\n        u.hand = a.hand;\n        cue(u.hand === \"right\" ? \"Opening on the left\" : \"Opening on the right\");\n        done2();\n        return { ok: true };\n      }\n    });\n    define(\"setBayKind\", {\n      history: null,\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u0441\\u0435\\u043A\\u0446\\u0438\\u0438\", kind: \"doors | drawers\" },\n      doc: \"\\u0414\\u0432\\u0435\\u0440\\u0438 \\u0438\\u043B\\u0438 \\u044F\\u0449\\u0438\\u043A\\u0438 \\u0432 \\u0441\\u0435\\u043A\\u0446\\u0438\\u0438 \\u043E\\u0441\\u0442\\u0440\\u043E\\u0432\\u0430 ([data-ub-bay] + data-ub-baykind; 26-library-tray.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"island\") return { ok: false, why: \"not an island\" };\n        const i = a.i, kind = a.kind;\n        const cur = islandBayList(u);\n        if (i >= cur.length || cur[i].kind === kind) return { ok: false, why: \"unchanged\" };\n        u.bays = cur.map((sc, j) => ({ w: sc.w, kind: j === i ? kind : sc.kind }));\n        islandSync(u);\n        cue(\"Section \" + (i + 1) + \": \" + (kind === \"drawers\" ? \"four drawers\" : \"doors\"));\n        done2();\n        return { ok: true };\n      }\n    });\n    function islandTry(u, mutate, what) {\n      const snap3 = {\n        bays: islandBayList(u).map((x) => ({ w: x.w, kind: x.kind })),\n        bayOpen: (u.bayOpen || []).slice(),\n        w: u.w,\n        x: u.x,\n        z: u.z\n      };\n      mutate(u);\n      islandSync(u);\n      function legal() {\n        return !behindWall(u, u.x, u.z) && !scene.units.some((v) => v.id !== u.id && sameLevel(v, u) && overlaps(u, v));\n      }\n      if (legal()) {\n        done2();\n        return true;\n      }\n      const x0 = u.x, z0 = u.z;\n      for (let r = 50; r <= 600; r += 50) {\n        const tries = [[x0 - r, z0], [x0 + r, z0], [x0, z0 + r], [x0, z0 - r], [x0 - r, z0 + r], [x0 + r, z0 + r]];\n        for (let i = 0; i < tries.length; i++) {\n          u.x = tries[i][0];\n          u.z = tries[i][1];\n          pushIntoRoom(u);\n          if (legal()) {\n            cue(what + \" \\u2014 the island moved \" + Math.round(Math.hypot(u.x - x0, u.z - z0)) + \" mm to stay clear\");\n            done2();\n            return true;\n          }\n        }\n      }\n      u.bays = snap3.bays;\n      u.bayOpen = snap3.bayOpen;\n      u.w = snap3.w;\n      u.x = snap3.x;\n      u.z = snap3.z;\n      islandSync(u);\n      cue(\"No room for that \\u2014 \" + what.toLowerCase() + \" would run into another cabinet or a wall, so nothing was changed\");\n      done2();\n      return false;\n    }\n    define(\"setSectionCount\", {\n      history: null,\n      args: { n: \"2 | 3 | 4\" },\n      doc: \"\\u0427\\u0438\\u0441\\u043B\\u043E \\u0441\\u0435\\u043A\\u0446\\u0438\\u0439 \\u043E\\u0441\\u0442\\u0440\\u043E\\u0432\\u0430 ([data-ub-seccount]; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"island\") return { ok: false, why: \"not an island\" };\n        const n = a.n;\n        const cur = islandBayList(u);\n        if (cur.length === n) return { ok: false, why: \"unchanged\" };\n        const removed = cur.slice(n);\n        const ok2 = islandTry(u, (x) => {\n          const next = cur.slice(0, n);\n          while (next.length < n) {\n            const last = next[next.length - 1];\n            next.push({ w: last.w, kind: last.kind === \"drawers\" ? \"doors\" : \"drawers\" });\n          }\n          x.bays = next;\n        }, n + \" sections\");\n        if (removed.length && islandBayList(u).length === n)\n          cue(\"Now \" + n + \" sections \\u2014 removed the \" + (removed.length > 1 ? \"last \" + removed.length + \" sections\" : \"last section\") + \" from the right-hand end (\" + removed.map((r) => r.w + \" mm \" + r.kind).join(\", \") + \")\");\n        return { ok: ok2 };\n      }\n    });\n    define(\"islandPreset\", {\n      history: \"island preset\",\n      args: { id: \"compact | standard | large | four\" },\n      doc: \"\\u0413\\u043E\\u0442\\u043E\\u0432\\u044B\\u0439 \\u043D\\u0430\\u0431\\u043E\\u0440 \\u0441\\u0435\\u043A\\u0446\\u0438\\u0439 \\u043E\\u0441\\u0442\\u0440\\u043E\\u0432\\u0430 ([data-ub-ispreset]; 27-sidebar-sections.js); one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"island\") return { ok: false, why: \"not an island\" };\n        const id = a.id;\n        const P2 = ISLAND.presets.filter((p) => p.id === id)[0];\n        if (!P2) return { ok: false, why: \"no preset\" };\n        const ok2 = ctx.hist.run(\"island preset\", () => islandTry(u, (x) => {\n          x.bays = P2.bays.map((w, i) => ({ w, kind: P2.kinds[i] }));\n        }, P2.label + \" island\"));\n        return { ok: ok2 };\n      }\n    });\n    define(\"setSectionWidth\", {\n      history: null,\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u0441\\u0435\\u043A\\u0446\\u0438\\u0438\", value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F, \\u043C\\u043C\" },\n      doc: \"\\u0428\\u0438\\u0440\\u0438\\u043D\\u0430 \\u043E\\u0434\\u043D\\u043E\\u0439 \\u0441\\u0435\\u043A\\u0446\\u0438\\u0438 \\u043E\\u0441\\u0442\\u0440\\u043E\\u0432\\u0430 ([data-ub-secw] change/blur; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"island\") return { ok: false, why: \"not an island\" };\n        const i = a.i;\n        const cur = islandBayList(u);\n        if (i >= cur.length) return { ok: false, why: \"no section\" };\n        const want = parseInt(a.value, 10);\n        if (!isFinite(want)) {\n          ctx.syncControls();\n          return { ok: false, why: \"not a number\" };\n        }\n        const w = clamp4(Math.round(want), ISLAND_BAY_LIMITS.w[0], ISLAND_BAY_LIMITS.w[1]);\n        if (w !== want) cue(\"Sections are \" + ISLAND_BAY_LIMITS.w[0] + \"\\u2013\" + ISLAND_BAY_LIMITS.w[1] + \" mm \\u2014 using \" + w + \" mm\");\n        if (w === cur[i].w) {\n          ctx.syncControls();\n          return { ok: false, why: \"unchanged\" };\n        }\n        const ok2 = islandTry(u, (x) => {\n          x.bays = cur.map((sc, j) => ({ w: j === i ? w : sc.w, kind: sc.kind }));\n        }, \"Section \" + (i + 1) + \" at \" + w + \" mm\");\n        return { ok: ok2 };\n      }\n    });\n    define(\"toggleBayOpen\", {\n      history: null,\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u0441\\u0435\\u043A\\u0446\\u0438\\u0438\" },\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C \\u043E\\u0434\\u043D\\u0443 \\u0441\\u0435\\u043A\\u0446\\u0438\\u044E \\u043E\\u0441\\u0442\\u0440\\u043E\\u0432\\u0430 ([data-ub-bayopen]; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"island\") return { ok: false, why: \"not an island\" };\n        const i = a.i;\n        const st = (u.bayOpen || [false, false]).slice();\n        st[i] = !st[i];\n        u.bayOpen = st;\n        const kind = islandBayKinds(u)[i];\n        cue(\"Section \" + (i + 1) + \" \" + (kind === \"drawers\" ? \"drawers \" : \"doors \") + (st[i] ? \"open\" : \"closed\"));\n        done2();\n        return { ok: true };\n      }\n    });\n    define(\"setTallHeight\", {\n      history: null,\n      args: { h: \"\\u0432\\u044B\\u0441\\u043E\\u0442\\u0430 \\u043A\\u043E\\u0440\\u043F\\u0443\\u0441\\u0430, \\u043C\\u043C (1970 | 2150)\" },\n      doc: \"\\u0412\\u044B\\u0441\\u043E\\u0442\\u0430 \\u0432\\u044B\\u0441\\u043E\\u043A\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 ([data-ub-tallh]; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || !isTall(u)) return { ok: false, why: \"not tall\" };\n        const h = a.h;\n        if (u.h === h) return { ok: false, why: \"unchanged\" };\n        const was = u.h;\n        u.h = h;\n        const clash = scene.units.some((v) => v.id !== u.id && sameLevel(v, u) && overlaps(u, v));\n        let ok2 = true;\n        if (clash || behindWall(u, u.x, u.z)) {\n          u.h = was;\n          ok2 = false;\n          cue(\"A \" + h + \" mm carcass would run into another cabinet there \\u2014 nothing changed\");\n        } else {\n          cue(h + \" mm carcass, \" + (h + LEG_H) + \" mm overall on legs\");\n        }\n        done2();\n        return { ok: ok2 };\n      }\n    });\n    define(\"stepPantryShelves\", {\n      history: null,\n      args: { step: \"-1 | 1\" },\n      doc: \"\\u041F\\u043E\\u043B\\u043A\\u0438 \\u043F\\u0435\\u043D\\u0430\\u043B\\u0430 \\u043D\\u0430 \\u043E\\u0434\\u043D\\u0443 \\u043C\\u0435\\u043D\\u044C\\u0448\\u0435 \\u0438\\u043B\\u0438 \\u0431\\u043E\\u043B\\u044C\\u0448\\u0435 ([data-ub-shelfstep]; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || u.type !== \"tall-pantry\") return { ok: false, why: \"not a pantry\" };\n        const n = clamp4(tallShelves(u) + a.step, TALL.shelves.min, TALL.shelves.max);\n        if (n === tallShelves(u)) return { ok: false, why: \"limit\" };\n        u.shelves = n;\n        if (u.interior) u.interior = { shelves: n, dividers: interiorOf(u).dividers, vSb: interiorOf(u).vSb };\n        cue(n + \" adjustable shelves\");\n        done2();\n        return { ok: true };\n      }\n    });\n    define(\"toggleLeaf\", {\n      history: null,\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u0441\\u0442\\u0432\\u043E\\u0440\\u043A\\u0438\" },\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C \\u043E\\u0434\\u043D\\u0443 \\u0441\\u0442\\u0432\\u043E\\u0440\\u043A\\u0443 \\u0432\\u044B\\u0441\\u043E\\u043A\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 ([data-ub-leafopen]; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u || !isTall(u)) return { ok: false, why: \"not tall\" };\n        const i = a.i;\n        const lv = tallLeaves(u).find((l, k) => (l.li != null ? l.li : k) === i);\n        if (!lv) return { ok: false, why: \"no leaf\" };\n        const st = (u.leafOpen || [false, false]).slice();\n        st[i] = !st[i];\n        u.leafOpen = st;\n        cue(lv.name + (st[i] ? \" open\" : \" closed\"));\n        done2();\n        return { ok: true };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-glass.js\n  function glassTargets(u) {\n    if (!u) return [];\n    const g2 = { ...u, frontStyle: \"glass\", ovStyle: \"glass\", doorOpen: false, drawerOpen: false, drawers: [], xopen: [], leafOpen: [], bayOpen: [] };\n    const fronts = cabinetParts(g2).filter((p) => p.kind === \"door\").map((p) => finishedFront(g2, p.local));\n    if (isTall(g2) && g2.door) (tallLeaves(g2) || []).forEach((lf) => fronts.push({ x0: REVEAL, x1: g2.w - REVEAL, y0: lf.y0, y1: lf.y1, z0: g2.d, z1: g2.d + T }));\n    const out = [];\n    for (const b of fronts) {\n      const fr = glassFrame(g2, b);\n      if (!fr) continue;\n      out.push({\n        box: { x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1, z0: b.z0, z1: b.z1 },\n        aperture: { x0: fr.pane.x0, x1: fr.pane.x1, y0: fr.pane.y0, y1: fr.pane.y1, z0: b.z1, z1: b.z1 },\n        w: Math.round(fr.aperture.w * 10) / 10,\n        h: Math.round(fr.aperture.h * 10) / 10\n      });\n    }\n    return out;\n  }\n  function installGlassCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue;\n    const nameOf = (u) => displayName(scene.units, u);\n    function check(u) {\n      if (!u) return { ok: false, none: true, why: \"Let go of Glass on the cabinet you want it on\" };\n      const name2 = nameOf(u);\n      const targets = glassTargets(u);\n      if (targets.length && u.ovStyle === \"glass\" && u.glassFrom !== \"kitchen\") return { ok: false, u, why: name2 + \" already has glass doors\", targets };\n      if (!targets.length) return { ok: false, u, why: name2 + \" has no door big enough for a glass centre (drawer fronts and small doors stay as they are)\", targets };\n      return { ok: true, u, targets };\n    }\n    function glassAt(cx, cy) {\n      if (scene.explode > 0) return { ok: false, none: true, why: \"Exploded view is a preview - set it back to Assembled to fit a glass door\" };\n      const id = ctx.pointer && ctx.pointer.pickAt ? ctx.pointer.pickAt(cx, cy) : null;\n      return check(id ? scene.units.find((v) => v.id === id) : null);\n    }\n    function apply(R4, how) {\n      const u = R4.u;\n      ctx.hist.run(\"glass door\", () => {\n        u.ovStyle = \"glass\";\n        delete u.glassFrom;\n        resolveFinishes(scene.units, scene.kitchen);\n      });\n      const n = R4.targets.length, others2 = scene.units.length - 1;\n      cue(nameOf(u) + \": glass door\" + (n === 1 ? \"\" : \"s\") + \" - this cabinet only\" + (others2 > 0 ? \"; the other \" + (others2 === 1 ? \"cabinet keeps its\" : others2 + \" cabinets keep their\") + \" doors\" : \"\") + \". The glass is quoted (to be specified)\");\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true, id: u.id, name: nameOf(u), how, targets: R4.targets };\n    }\n    function view(R4) {\n      return R4.none ? null : { id: R4.u.id, ok: !!R4.ok, why: R4.ok ? null : R4.why, targets: R4.targets || [] };\n    }\n    define(\"previewGlassDrop\", {\n      history: null,\n      args: { cx: \"client x\", cy: \"client y\" },\n      doc: \"View only: while Glass is dragged from the Fronts tray, outline the door(s) of the cabinet under the pointer that would take glass (or why not); nothing in the plan changes\",\n      run(a) {\n        const R4 = glassAt(a && a.cx, a && a.cy), pv = view(R4);\n        const was = JSON.stringify(scene.glassPreview || null);\n        scene.glassPreview = pv;\n        if (JSON.stringify(pv) !== was) ctx.frame();\n        return pv ? Object.assign({ name: nameOf(R4.u), sync: false }, pv) : { ok: false, none: true, why: R4.why, sync: false };\n      }\n    });\n    define(\"clearGlassPreview\", {\n      history: null,\n      args: {},\n      doc: \"View only: take the Glass drag preview away (left the cabinets, cancelled, Escape)\",\n      run() {\n        const had = !!scene.glassPreview;\n        scene.glassPreview = null;\n        if (had) ctx.frame();\n        return { ok: true, had, sync: false };\n      }\n    });\n    define(\"dropGlassAt\", {\n      history: \"glass door\",\n      args: { cx: \"client x\", cy: \"client y\" },\n      doc: \"Drop Glass dragged from the Fronts tray: the cabinet under the pointer gets glass doors (its own style), one Undo; anywhere else nothing changes\",\n      run(a) {\n        const had = !!scene.glassPreview;\n        scene.glassPreview = null;\n        const R4 = glassAt(a && a.cx, a && a.cy);\n        if (!R4.ok) {\n          cue(\"Not changed: \" + R4.why);\n          if (had) ctx.frame();\n          return { ok: false, why: R4.why };\n        }\n        return apply(R4, \"drop\");\n      }\n    });\n    define(\"setGlassDoor\", {\n      history: \"glass door\",\n      args: { id: \"cabinet id (default: the selected one)\", on: \"true (default) | false\" },\n      doc: \"Glass doors on / off for the SELECTED cabinet only (never the kitchen), said by name; one Undo; nothing selected - nothing changes\",\n      run(a) {\n        const id = a && a.id ? a.id : scene.selectedId;\n        const u = id ? scene.units.find((v) => v.id === id) : null;\n        if (!u) {\n          cue(GLASS_ONE_CABINET);\n          return { ok: false, why: GLASS_ONE_CABINET };\n        }\n        if (a && a.on === false) {\n          if (u.ovStyle !== \"glass\") {\n            const why = nameOf(u) + \" has no glass doors\";\n            cue(\"Not changed: \" + why);\n            return { ok: false, why };\n          }\n          ctx.hist.run(\"glass door off\", () => {\n            u.ovStyle = null;\n            u.ovShaker = null;\n            delete u.glassFrom;\n            resolveFinishes(scene.units, scene.kitchen);\n          });\n          const st = u.frontStyle || \"slab\", word = st === \"slab\" ? \"Flat\" : st === \"jpull\" ? \"J-pull\" : st.charAt(0).toUpperCase() + st.slice(1);\n          cue(nameOf(u) + \": glass off - its doors are the kitchen's \" + word + \" again\");\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: true, id: u.id, name: nameOf(u), on: false, style: st };\n        }\n        const R4 = check(u);\n        if (!R4.ok) {\n          cue(\"Not changed: \" + R4.why);\n          return { ok: false, why: R4.why };\n        }\n        return apply(R4, \"selected\");\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-interior.js\n  function installInteriorCommands(ctx) {\n    const scene = ctx.scene, st = ctx.st, hist = ctx.hist;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    function syncPartInfo() {\n      if (ctx.syncHandlesState) ctx.syncHandlesState();\n    }\n    define(\"addShelf\", {\n      history: \"add shelf\",\n      doc: \"\\u0414\\u043E\\u0431\\u0430\\u0432\\u0438\\u0442\\u044C \\u043F\\u043E\\u043B\\u043A\\u0443 \\u0432 \\u043E\\u0442\\u0441\\u0435\\u043A \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u0434\\u0435\\u0442\\u0430\\u043B\\u0438 ([data-ub-shelfadd]; 27-sidebar-sections.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        const r = hist.run(\"add shelf\", () => shelfAdd(u, selectedCellKey(u, scene.selPart), null));\n        if (!r.ok) {\n          cue(r.why);\n          return { ok: false, why: r.why };\n        }\n        for (const q of shelfListOf(u)) if (q.id === r.id) scene.selPart = shelfPidOf(u, q);\n        cue(\"Shelf added at \" + Math.round(r.y) + \" mm above the inside bottom\");\n        syncPartInfo();\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, id: r.id };\n      }\n    });\n    function removeSelectedShelf() {\n      const u = ctx.sel();\n      if (!u || !scene.selPart) return false;\n      const p = partById(u, scene.selPart);\n      if (!p || p.kind !== \"shelf\") return false;\n      const entry = shelfEntryOf(u, p.pid);\n      if (!entry) return false;\n      const r = hist.run(\"remove shelf\", () => shelfRemove(u, entry.id));\n      if (!r.ok) {\n        cue(r.why);\n        return false;\n      }\n      scene.selPart = null;\n      scene.hoverPart = null;\n      cue(\"Shelf removed\");\n      syncPartInfo();\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    define(\"removeSelectedShelf\", {\n      history: \"remove shelf\",\n      doc: \"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0443\\u044E \\u043F\\u043E\\u043B\\u043A\\u0443 ([data-ub-shelfdel], Delete/Backspace \\u0432 \\u0440\\u0435\\u0436\\u0438\\u043C\\u0435 \\u0434\\u0435\\u0442\\u0430\\u043B\\u0435\\u0439; 27-sidebar-sections.js)\",\n      run() {\n        return { ok: removeSelectedShelf() };\n      }\n    });\n    function commitShelfMm(raw) {\n      const u = ctx.sel();\n      if (!u || !scene.selPart) return false;\n      const p = partById(u, scene.selPart);\n      if (!p || p.kind !== \"shelf\") return false;\n      const want = parseFloat(raw);\n      if (!isFinite(want)) {\n        cue(\"Type a height in millimetres\");\n        return false;\n      }\n      const entry = shelfEntryOf(u, p.pid);\n      if (!entry) return false;\n      const r = hist.run(\"set shelf height\", () => shelfMoveTo(u, entry.id, want));\n      if (!r.ok) {\n        cue(r.why);\n        return false;\n      }\n      st.shelfMmFocus = false;\n      for (const q of shelfListOf(u)) if (q.id === entry.id) scene.selPart = shelfPidOf(u, q);\n      cue(Math.round(r.y) === Math.round(want) ? \"Shelf at \" + Math.round(r.y) + \" mm\" : \"Nearest shelf hole: \" + Math.round(r.y) + \" mm\");\n      syncPartInfo();\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    define(\"setShelfHeight\", {\n      history: \"set shelf height\",\n      args: { mm: \"\\u0432\\u044B\\u0441\\u043E\\u0442\\u0430 \\u043D\\u0430\\u0434 \\u0434\\u043D\\u043E\\u043C \\u0432\\u043D\\u0443\\u0442\\u0440\\u0438, \\u043C\\u043C (\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u043B\\u0438 \\u0447\\u0438\\u0441\\u043B\\u043E)\" },\n      doc: \"\\u0422\\u043E\\u0447\\u043D\\u0430\\u044F \\u0432\\u044B\\u0441\\u043E\\u0442\\u0430 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u043F\\u043E\\u043B\\u043A\\u0438 ([data-ub-shelfmm] Enter; 27-sidebar-sections.js commitShelfMm)\",\n      run(a) {\n        return { ok: commitShelfMm(a.mm) };\n      }\n    });\n    define(\"shelfMmFocus\", {\n      history: null,\n      args: { on: \"true \\u2014 \\u0444\\u043E\\u043A\\u0443\\u0441 \\u0432 \\u043F\\u043E\\u043B\\u0435, false \\u2014 \\u0443\\u0448\\u0451\\u043B\" },\n      doc: \"\\u0424\\u043E\\u043A\\u0443\\u0441 \\u043F\\u043E\\u043B\\u044F \\u0432\\u044B\\u0441\\u043E\\u0442\\u044B \\u043F\\u043E\\u043B\\u043A\\u0438 ([data-ub-shelfmm] focus/blur; 27-sidebar-sections.js)\",\n      run(a) {\n        if (a.on) {\n          st.shelfMmFocus = true;\n          return { ok: true };\n        }\n        st.shelfMmFocus = false;\n        syncPartInfo();\n        return { ok: true };\n      }\n    });\n    define(\"shelfMmCancel\", {\n      history: null,\n      doc: \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C \\u0432\\u0432\\u043E\\u0434 \\u0432\\u044B\\u0441\\u043E\\u0442\\u044B \\u043F\\u043E\\u043B\\u043A\\u0438 ([data-ub-shelfmm] Escape; 27-sidebar-sections.js)\",\n      run() {\n        st.shelfMmFocus = false;\n        syncPartInfo();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    function editInterior(mutate) {\n      const u = ctx.sel();\n      if (!u) return { ok: false, why: \"nothing selected\" };\n      const tgt = interiorTarget(u);\n      if (!tgt || !canInterior(tgt)) {\n        cue(interiorWhy(tgt || u));\n        return { ok: false, why: \"no interior\" };\n      }\n      const I = interiorOf(tgt);\n      const next = { shelves: I.shelves, vDiv: I.vDiv.slice(), hDiv: I.hDiv.slice() };\n      if (mutate(next, tgt) === false) return { ok: false, why: \"unchanged\" };\n      next.shelves = clamp4(Math.round(next.shelves), 0, maxShelvesFor(tgt));\n      next.vDiv = (next.vDiv || []).slice().sort((a, c) => a - c);\n      next.hDiv = (next.hDiv || []).slice().sort((a, c) => a - c);\n      next.dividers = next.vDiv;\n      next.vSb = carrySetbacks(I.vDiv, I.vSb, next.vDiv);\n      next.hSb = carrySetbacks(I.hDiv, I.hSb, next.hDiv);\n      const structural = JSON.stringify(next.vDiv) !== JSON.stringify(I.vDiv) || JSON.stringify(next.hDiv) !== JSON.stringify(I.hDiv);\n      if (structural) {\n        next.shelfList = null;\n      } else {\n        next.shelfList = reconcileShelfCount(tgt, next.shelves);\n        if (next.shelfList) next.shelves = shelvesPerCell(tgt, next.shelfList);\n      }\n      hist.begin(\"interior change\");\n      setInterior(u, next);\n      hist.commit();\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true };\n    }\n    define(\"interiorShelves\", {\n      history: \"interior change\",\n      args: { step: \"-1 | 1\" },\n      doc: \"\\u0420\\u0435\\u0433\\u0443\\u043B\\u0438\\u0440\\u0443\\u0435\\u043C\\u044B\\u0445 \\u043F\\u043E\\u043B\\u043E\\u043A \\u043D\\u0430 \\u043E\\u0434\\u043D\\u0443 \\u043C\\u0435\\u043D\\u044C\\u0448\\u0435 \\u0438\\u043B\\u0438 \\u0431\\u043E\\u043B\\u044C\\u0448\\u0435 ([data-ub-intshelf]; 27-sidebar-sections.js)\",\n      run(a) {\n        return editInterior((n) => {\n          const was = n.shelves;\n          n.shelves = was + a.step;\n          if (n.shelves === was) return false;\n          cue(n.shelves ? n.shelves + \" shelves\" : \"No shelves\");\n        });\n      }\n    });\n    define(\"addDivider\", {\n      history: \"interior change\",\n      doc: \"\\u0412\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u0430\\u044F \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0430 \\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0435 \\u0441\\u0430\\u043C\\u043E\\u0433\\u043E \\u0448\\u0438\\u0440\\u043E\\u043A\\u043E\\u0433\\u043E \\u043E\\u0442\\u0441\\u0435\\u043A\\u0430 ([data-ub-intdivadd]; 27-sidebar-sections.js)\",\n      run() {\n        return editInterior((n, tgt) => {\n          if (!canAddDivider(tgt)) {\n            cue(\"No room for another divider \\u2014 no compartment is as wide as an \" + T + \" mm board\");\n            return false;\n          }\n          const B = interiorBounds(tgt), comps = [];\n          let at = 0;\n          for (const x of n.vDiv) {\n            comps.push([at, x]);\n            at = x + T;\n          }\n          comps.push([at, B.w]);\n          const best = comps.sort((p, c) => c[1] - c[0] - (p[1] - p[0]))[0];\n          n.vDiv.push(Math.round((best[0] + best[1]) / 2 - T / 2));\n          cue(n.vDiv.length + \" divider\" + (n.vDiv.length === 1 ? \"\" : \"s\"));\n        });\n      }\n    });\n    define(\"addPartition\", {\n      history: \"interior change\",\n      doc: \"\\u0413\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u0430\\u044F \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0430 \\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0435 \\u0441\\u0430\\u043C\\u043E\\u0439 \\u0432\\u044B\\u0441\\u043E\\u043A\\u043E\\u0439 \\u043F\\u043E\\u043B\\u043E\\u0441\\u044B ([data-ub-inthadd]; 27-sidebar-sections.js)\",\n      run() {\n        return editInterior((n, tgt) => {\n          if (!canAddHDivider(tgt)) {\n            cue(\"No room for another fixed partition \\u2014 no band is as high as an \" + T + \" mm board\");\n            return false;\n          }\n          const B = interiorBounds(tgt), bnds = [];\n          let at = 0;\n          for (const y of n.hDiv) {\n            bnds.push([at, y]);\n            at = y + T;\n          }\n          bnds.push([at, B.h]);\n          const best = bnds.sort((p, c) => c[1] - c[0] - (p[1] - p[0]))[0];\n          n.hDiv.push(Math.round((best[0] + best[1]) / 2 - T / 2));\n          cue(n.hDiv.length + \" fixed horizontal partition\" + (n.hDiv.length === 1 ? \"\" : \"s\"));\n        });\n      }\n    });\n    define(\"removePartition\", {\n      history: \"interior change\",\n      doc: \"\\u0423\\u0431\\u0440\\u0430\\u0442\\u044C \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u044E\\u044E \\u0433\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u0443\\u044E \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0443 ([data-ub-inthdel]; 27-sidebar-sections.js)\",\n      run() {\n        return editInterior((n) => {\n          if (!n.hDiv.length) return false;\n          n.hDiv.pop();\n          cue(n.hDiv.length ? n.hDiv.length + \" fixed partitions left\" : \"Fixed partitions removed\");\n        });\n      }\n    });\n    define(\"setPartition\", {\n      history: \"interior change\",\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438\", value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F, \\u043C\\u043C\" },\n      doc: \"\\u0412\\u044B\\u0441\\u043E\\u0442\\u0430 \\u0433\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u043E\\u0439 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438 ([data-ub-inthpos] change/blur; 27-sidebar-sections.js)\",\n      run(a) {\n        const i = a.i;\n        return editInterior((n, tgt) => {\n          if (i >= n.hDiv.length) return false;\n          const want = parseInt(a.value, 10);\n          if (!isFinite(want)) return false;\n          const rg = hDividerRange(tgt, n.hDiv, i);\n          const v = clamp4(Math.round(want), rg.min, rg.max);\n          if (v !== want) cue(\"That partition must sit \" + rg.min + \"\\u2013\" + rg.max + \" mm above the inside bottom \\u2014 using \" + v + \" mm\");\n          if (v === n.hDiv[i]) return false;\n          n.hDiv[i] = v;\n        });\n      }\n    });\n    define(\"removeDivider\", {\n      history: \"interior change\",\n      doc: \"\\u0423\\u0431\\u0440\\u0430\\u0442\\u044C \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u044E\\u044E \\u0432\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u0443\\u044E \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0443 ([data-ub-intdivdel]; 27-sidebar-sections.js)\",\n      run() {\n        return editInterior((n) => {\n          if (!n.vDiv.length) return false;\n          n.vDiv.pop();\n          cue(n.vDiv.length ? n.vDiv.length + \" dividers left\" : \"Dividers removed\");\n        });\n      }\n    });\n    define(\"setDivider\", {\n      history: \"interior change\",\n      args: { i: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438\", value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F, \\u043C\\u043C\" },\n      doc: \"\\u041F\\u043E\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0435 \\u0432\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u043E\\u0439 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438 ([data-ub-intdivpos] change/blur; 27-sidebar-sections.js)\",\n      run(a) {\n        const i = a.i;\n        return editInterior((n, tgt) => {\n          if (i >= n.vDiv.length) return false;\n          const want = parseInt(a.value, 10);\n          if (!isFinite(want)) return false;\n          const rg = dividerRange(tgt, n.vDiv, i);\n          const v = clamp4(Math.round(want), rg.min, rg.max);\n          if (v !== want) cue(\"That compartment must be \" + rg.min + \"\\u2013\" + rg.max + \" mm \\u2014 using \" + v + \" mm\");\n          if (v === n.vDiv[i]) return false;\n          n.vDiv[i] = v;\n        });\n      }\n    });\n    define(\"toggleInteriorView\", {\n      history: null,\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0434\\u0432\\u0435\\u0440\\u0438, \\u0447\\u0442\\u043E\\u0431\\u044B \\u0432\\u0438\\u0434\\u0435\\u0442\\u044C \\u043D\\u0430\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D\\u0438\\u0435, \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C ([data-ub-intsee]; 27-sidebar-sections.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        const open = !(u.doorOpen || (u.leafOpen || []).some(Boolean));\n        if (isTall(u)) u.leafOpen = [open, open];\n        else u.doorOpen = open;\n        cue(open ? \"Doors open \\u2014 the interior is visible\" : \"Doors closed\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, open };\n      }\n    });\n    const AXW = { v: \"divider\", h: \"horizontal divider\" };\n    function divTarget(a) {\n      const u = ctx.sel();\n      if (!u) return { why: \"Select a cabinet first\" };\n      if (isIsland(u)) return { why: \"On an island, place its dividers by hand for now\" };\n      const axis = a && a.axis === \"h\" ? \"h\" : a && a.axis === \"v\" ? \"v\" : null;\n      if (!axis) return { why: \"axis must be v or h\" };\n      return { u, axis };\n    }\n    define(\"splitEqually\", {\n      history: \"split equally\",\n      args: { axis: \"v | h\" },\n      doc: \"\\u041F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438 \\u044D\\u0442\\u043E\\u0439 \\u043E\\u0440\\u0438\\u0435\\u043D\\u0442\\u0430\\u0446\\u0438\\u0438 - \\u0440\\u0430\\u0432\\u043D\\u044B\\u0435 \\u0427\\u0418\\u0421\\u0422\\u042B\\u0415 \\u043F\\u0440\\u043E\\u0451\\u043C\\u044B (\\u0442\\u043E\\u043B\\u0449\\u0438\\u043D\\u0430 18 \\u043C\\u043C \\u0443\\u0447\\u0442\\u0435\\u043D\\u0430), \\u0438 \\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044C \\u0438\\u0445 \\u0440\\u0430\\u0432\\u043D\\u044B\\u043C\\u0438 (\\u0440\\u0435\\u0436\\u0438\\u043C)\",\n      run(a) {\n        const t = divTarget(a);\n        if (!t.u) {\n          cue(t.why);\n          return { ok: false, why: t.why };\n        }\n        const before = hist.snap();\n        const r = splitEqually(t.u, t.axis);\n        if (!r.ok) {\n          cue(r.why + \" - nothing changed\");\n          ctx.syncControls();\n          ctx.refresh();\n          return r;\n        }\n        hist.pushAfter(\"split equally\", before);\n        const g2 = r.gaps, k = g2.length, w = AXW[t.axis];\n        cue(\"Split equally: \" + k + \" equal openings of \" + Math.min(...g2) + (Math.max(...g2) !== Math.min(...g2) ? \"-\" + Math.max(...g2) : \"\") + \" mm - a \" + w + \" you add is shared out the same way; drag or type one to place it by hand\");\n        syncPartInfo();\n        ctx.syncControls();\n        ctx.refresh();\n        return Object.assign({ ok: true }, r);\n      }\n    });\n    define(\"equalSpacingOff\", {\n      history: \"equal spacing off\",\n      args: { axis: \"v | h\" },\n      doc: \"\\u0412\\u044B\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0440\\u0435\\u0436\\u0438\\u043C \\u0440\\u0430\\u0432\\u043D\\u044B\\u0445 \\u043F\\u0440\\u043E\\u0451\\u043C\\u043E\\u0432 - \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438 \\u043E\\u0441\\u0442\\u0430\\u044E\\u0442\\u0441\\u044F \\u0433\\u0434\\u0435 \\u0441\\u0442\\u043E\\u044F\\u0442\",\n      run(a) {\n        const t = divTarget(a);\n        if (!t.u) return { ok: false, why: t.why };\n        if (!equalOn(t.u, t.axis)) return { ok: false, why: \"not on\" };\n        const before = hist.snap();\n        equalOff(t.u, t.axis);\n        hist.pushAfter(\"equal spacing off\", before);\n        cue(\"Equal spacing off - the \" + AXW[t.axis] + \"s stay where they are and are placed by hand again\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    define(\"centreDivider\", {\n      history: \"centre divider\",\n      args: { axis: \"v | h\", idx: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438\" },\n      doc: \"\\u041F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0443 - \\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0435 \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0441\\u043E\\u0441\\u0435\\u0434\\u044F\\u043C\\u0438 (\\u0434\\u0432\\u0430 \\u0440\\u0430\\u0432\\u043D\\u044B\\u0445 \\u0447\\u0438\\u0441\\u0442\\u044B\\u0445 \\u043F\\u0440\\u043E\\u0451\\u043C\\u0430 \\u043F\\u043E \\u0441\\u0442\\u043E\\u0440\\u043E\\u043D\\u0430\\u043C)\",\n      run(a) {\n        const t = divTarget(a);\n        if (!t.u) {\n          cue(t.why);\n          return { ok: false, why: t.why };\n        }\n        const before = hist.snap();\n        const r = centreBoard(t.u, t.axis, Number(a.idx));\n        if (!r.ok) {\n          cue(r.why + \" - nothing changed\");\n          ctx.syncControls();\n          ctx.refresh();\n          return r;\n        }\n        if (!r.changed) {\n          cue(\"It is already in the centre: \" + r.gaps.join(\" mm and \") + \" mm either side\");\n          return Object.assign({ ok: true }, r);\n        }\n        hist.pushAfter(\"centre \" + AXW[t.axis], before);\n        cue(\"Centred: \" + r.gaps.join(\" mm and \") + \" mm either side\");\n        syncPartInfo();\n        ctx.syncControls();\n        ctx.refresh();\n        return Object.assign({ ok: true }, r);\n      }\n    });\n    return { removeSelectedShelf, commitShelfMm };\n  }\n\n  // v2/src/interact/cmd-room.js\n  function installRoomCommands(ctx) {\n    const scene = ctx.scene;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    ctx.roomTry = (m, w) => roomTry(m, w);\n    function roomTry(mutate, what) {\n      const was = JSON.parse(JSON.stringify(scene.room || ROOM_DEFAULT));\n      mutate(scene.room = scene.room || {\n        on: true,\n        width: ROOM_DEFAULT.width,\n        depth: ROOM_DEFAULT.depth,\n        height: ROOM_DEFAULT.height\n      });\n      const out = scene.units.filter((v) => behindWall(v, v.x, v.z));\n      const tooTall = scene.units.filter((v) => (v.y || 0) + v.h > roomHeight() + 1e-3);\n      const lost = openingsOf(scene.room).filter((o) => !checkOpening(Object.assign({}, scene.room, { openings: [] }), o, [], roomSize()).ok);\n      const lostObj = roomObjectsOf(scene.room).filter((o) => !checkObject(scene.room, o, roomSize(), [], null).ok);\n      if (lostObj.length && !lost.length && !out.length && !tooTall.length) {\n        scene.room = was;\n        cue(\"That room would leave no space for \" + objectLabel(scene.room, lostObj[0]).toLowerCase() + \" on the \" + wallNameOf(scene.room, lostObj[0].wall).toLowerCase() + \" - nothing changed. Move or resize it first.\");\n        ctx.syncControls();\n        ctx.refresh();\n        return false;\n      }\n      if (lost.length && !out.length && !tooTall.length) {\n        const name2 = openingLabel(scene.room, lost[0]) + \" on the \" + wallNameOf(scene.room, lost[0].wall).toLowerCase();\n        scene.room = was;\n        cue(\"That room would leave no space for \" + name2 + \" - nothing changed. Move or resize it first.\");\n        ctx.syncControls();\n        ctx.refresh();\n        return false;\n      }\n      if (out.length || tooTall.length) {\n        scene.room = was;\n        const hit2 = out.concat(tooTall.filter((v) => out.indexOf(v) < 0));\n        const names = hit2.map((v) => displayName(scene.units, v));\n        const shown = names.slice(0, 3).join(\", \") + (names.length > 3 ? \" and \" + (names.length - 3) + \" more\" : \"\");\n        cue(\"That room would cut through \" + shown + \" - nothing changed. Move \" + (names.length === 1 ? \"it\" : \"them\") + \" first, then resize the room.\");\n        ctx.syncControls();\n        ctx.refresh();\n        return false;\n      }\n      if (what) cue(what);\n      ctx.view.reframeKeepingView();\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function statedRoomOn(what) {\n      const need = { w: 0, d: 0 };\n      for (const v of scene.units) {\n        const fb = foot(v);\n        need.w = Math.max(need.w, fb.x1);\n        need.d = Math.max(need.d, fb.z1);\n      }\n      return roomTry((r) => {\n        r.on = true;\n        r.width = clamp4(\n          Math.max(r.width || 0, Math.ceil((need.w + 600) / 100) * 100),\n          ROOM_LIMITS.width[0],\n          ROOM_LIMITS.width[1]\n        );\n        r.depth = clamp4(\n          Math.max(r.depth || 0, Math.ceil((need.d + 900) / 100) * 100),\n          ROOM_LIMITS.depth[0],\n          ROOM_LIMITS.depth[1]\n        );\n      }, what);\n    }\n    ctx.room = { roomTry, statedRoomOn };\n    define(\"roomInfo\", {\n      history: null,\n      doc: \"\\u041D\\u0430\\u0437\\u0432\\u0430\\u0442\\u044C \\u0440\\u0430\\u0437\\u043C\\u0435\\u0440\\u044B \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u044B \\u0432 \\u0441\\u0442\\u0440\\u043E\\u043A\\u0435 \\u0441\\u043E\\u0441\\u0442\\u043E\\u044F\\u043D\\u0438\\u044F ([data-ub-roomon]; 27-sidebar-sections.js)\",\n      run() {\n        const sz = roomSize();\n        cue(\"Room \" + sz.width + \" mm across, \" + sz.depth + \" mm back to front, \" + sz.height + \" mm to the ceiling - change them under Room on the 3D view\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    define(\"setRoomDim\", {\n      /* ONE Undo step per accepted size (task 1790951047269, 19.10.2026; was history:null - none): recorded by commands.js after\n         the opening guard, from its own before-snapshot; a refused / restored size records nothing */\n      history: \"room size\",\n      undoAfterGuard: true,\n      args: { k: \"width | depth | height\", value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F, \\u043C\\u043C\" },\n      doc: \"\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u044B; \\u043E\\u0442\\u043A\\u0430\\u0437, \\u0435\\u0441\\u043B\\u0438 \\u0441\\u0442\\u0435\\u043D\\u0430 \\u043F\\u0440\\u043E\\u0448\\u043B\\u0430 \\u0431\\u044B \\u0447\\u0435\\u0440\\u0435\\u0437 \\u0448\\u043A\\u0430\\u0444 ([data-ub-roomdim] change/blur; 27-sidebar-sections.js)\",\n      run(a) {\n        const k = a.k;\n        const want = parseInt(a.value, 10);\n        if (!isFinite(want)) {\n          ctx.syncControls();\n          return { ok: false, why: \"not a number\" };\n        }\n        const v = clamp4(Math.round(want), ROOM_LIMITS[k][0], ROOM_LIMITS[k][1]);\n        if (v !== want) cue(\"A room is \" + ROOM_LIMITS[k][0] + \"\\u2013\" + ROOM_LIMITS[k][1] + \" mm - using \" + v + \" mm\");\n        if (v === roomSize()[k]) {\n          ctx.syncControls();\n          return { ok: false, why: \"unchanged\" };\n        }\n        const ok2 = roomTry(\n          (r) => {\n            r[k] = v;\n          },\n          k === \"width\" ? \"Room \" + v + \" mm across\" : k === \"height\" ? \"Ceiling \" + v + \" mm high\" : \"Room \" + v + \" mm back to front\"\n        );\n        return { ok: ok2 };\n      }\n    });\n    define(\"toggleRunLink\", {\n      history: null,\n      args: { tier: \"base | wall\" },\n      doc: \"\\u0420\\u044F\\u0434 \\u043C\\u0435\\u043D\\u044F\\u0435\\u0442\\u0441\\u044F \\u0446\\u0435\\u043B\\u0438\\u043A\\u043E\\u043C \\u0438\\u043B\\u0438 \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0448\\u043A\\u0430\\u0444 ([data-ub-runlink]; 27-sidebar-sections.js)\",\n      run(a) {\n        const tier = a.tier;\n        scene.runUnlinked = scene.runUnlinked || {};\n        scene.runUnlinked[tier] = !scene.runUnlinked[tier];\n        cue(scene.runUnlinked[tier] ? \"Only the selected cabinet will change\" : \"The whole \" + tier + \" run will change together\");\n        ctx.syncControls();\n        return { ok: true, unlinked: scene.runUnlinked[tier] };\n      }\n    });\n    define(\"setRunDim\", {\n      history: null,\n      args: { key: \"h | d\", tier: \"base | wall\", value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F, \\u043C\\u043C\" },\n      doc: \"\\u0412\\u044B\\u0441\\u043E\\u0442\\u0430 \\u0438\\u043B\\u0438 \\u0433\\u043B\\u0443\\u0431\\u0438\\u043D\\u0430 \\u0446\\u0435\\u043B\\u043E\\u0433\\u043E \\u0440\\u044F\\u0434\\u0430 ([data-ub-rundim] + data-ub-runtier, change/blur; 27-sidebar-sections.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        const key = a.key, tier = a.tier;\n        const want = parseInt(a.value, 10);\n        if (!isFinite(want)) {\n          ctx.syncControls();\n          return { ok: false, why: \"not a number\" };\n        }\n        const mine = runTier(u);\n        let mem = mine === tier ? runMembers(scene.units, u) : runSibling(scene.units, u);\n        if (!mem.length) {\n          cue(\"There is no \" + tier + \" run here to resize\");\n          return { ok: false, why: \"no run\" };\n        }\n        if (scene.runUnlinked && scene.runUnlinked[tier]) {\n          const only = mem.filter((v) => v.id === u.id);\n          if (only.length) mem = only;\n        }\n        const r = applyRunDim(scene.units, mem, key, want);\n        if (!r.ok) {\n          cue(r.why);\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: false, why: r.why };\n        }\n        cue((key === \"h\" ? \"Height \" : \"Depth \") + r.value + \" mm on \" + r.n + \" cabinet\" + (r.n === 1 ? \"\" : \"s\") + (r.clamped ? \" (held inside the range they share)\" : \"\"));\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    return ctx.room;\n  }\n\n  // v2/src/interact/cmd-room-edit.js\n  function installRoomEditCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue, hist = ctx.hist;\n    function room() {\n      if (!scene.room) scene.room = { on: true, width: roomSize().width, depth: roomSize().depth, height: roomSize().height };\n      return scene.room;\n    }\n    function done2(label, before, msg) {\n      hist.pushAfter(label, before);\n      if (msg) cue(msg);\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function named(units) {\n      const names = units.map((v) => displayName(scene.units, v));\n      return names.slice(0, 2).join(\" and \") + (names.length > 2 ? \" and \" + (names.length - 2) + \" more\" : \"\");\n    }\n    function refuse(chk, op) {\n      const what = OPENING_KINDS[op.kind].name.toLowerCase();\n      const msg = chk.why === \"cabinet\" && op.kind === \"door\" ? \"The door's way in (900 mm in front of it) would be blocked by \" + named(chk.units) + \" - nothing changed. Move it along the wall, or move the cabinet first.\" : chk.why === \"cabinet\" ? \"The \" + what + \" would sit behind \" + named(chk.units) + \" on the \" + wallNameOf(scene.room, op.wall).toLowerCase() + \" - nothing changed. Move it along the wall, or move the cabinet first.\" : chk.why + \" - nothing changed.\";\n      cue(msg);\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: false, why: chk.why === \"cabinet\" ? \"behind a cabinet\" : chk.why };\n    }\n    define(\"setRoomLook\", {\n      history: \"room colours\",\n      args: { k: \"wall | floorFinish | floorColour\", value: \"id \\u0438\\u0437 WALL_COLOURS / FLOOR_FINISHES\" },\n      doc: \"\\u0426\\u0432\\u0435\\u0442 \\u0441\\u0442\\u0435\\u043D, \\u043E\\u0442\\u0434\\u0435\\u043B\\u043A\\u0430 \\u0438 \\u0446\\u0432\\u0435\\u0442 \\u043F\\u043E\\u043B\\u0430 (Room setup \\u2192 Walls / Floor; ui/room-editor.js)\",\n      run(a) {\n        const r = room(), before = hist.snap();\n        if (a.k === \"wall\") {\n          const c = WALL_COLOURS.find((x) => x.id === a.value);\n          if (!c) return { ok: false, why: \"unknown colour\" };\n          if ((r.wallColour || WALL_COLOURS[0].id) === c.id) return { ok: false, why: \"unchanged\" };\n          r.wallColour = c.id;\n          done2(\"wall colour\", before, \"Walls: \" + c.name);\n          return { ok: true };\n        }\n        if (a.k === \"floorFinish\") {\n          const f = FLOOR_FINISHES.find((x) => x.id === a.value);\n          if (!f) return { ok: false, why: \"unknown finish\" };\n          if (floorFinishOf(r).id === f.id) return { ok: false, why: \"unchanged\" };\n          r.floorFinish = f.id;\n          if (!f.colours.some((c2) => c2.id === r.floorColour)) r.floorColour = f.colours[0].id;\n          const c = f.colours.find((x) => x.id === r.floorColour);\n          done2(\"floor\", before, \"Floor: \" + f.name.toLowerCase() + \", \" + c.name.toLowerCase());\n          return { ok: true };\n        }\n        if (a.k === \"floorColour\") {\n          const f = floorFinishOf(r), c = f.colours.find((x) => x.id === a.value);\n          if (!c) return { ok: false, why: \"unknown colour\" };\n          if (r.floorFinish === f.id && r.floorColour === c.id) return { ok: false, why: \"unchanged\" };\n          r.floorFinish = f.id;\n          r.floorColour = c.id;\n          done2(\"floor\", before, \"Floor: \" + f.name.toLowerCase() + \", \" + c.name.toLowerCase());\n          return { ok: true };\n        }\n        return { ok: false, why: \"k must be wall, floorFinish or floorColour\" };\n      }\n    });\n    define(\"addOpening\", {\n      history: \"add window / add door\",\n      args: { kind: \"window | door\", prefer: \"wall to try first (optional)\", wall: \"this wall only (optional, API)\", at: \"{ wall, x } exact place (catalogue drop)\", phase: \"check (optional)\" },\n      doc: \"\\u0414\\u043E\\u0431\\u0430\\u0432\\u0438\\u0442\\u044C \\u043E\\u043A\\u043D\\u043E \\u0438\\u043B\\u0438 \\u0434\\u0432\\u0435\\u0440\\u044C: \\u0441\\u0432\\u043E\\u0431\\u043E\\u0434\\u043D\\u043E\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E \\u043D\\u0430 \\u043B\\u044E\\u0431\\u043E\\u0439 \\u0441\\u0442\\u0435\\u043D\\u0435 (\\u0441\\u043D\\u0430\\u0447\\u0430\\u043B\\u0430 \\u0441\\u0442\\u0435\\u043D\\u0430 \\u0432 \\u0446\\u0435\\u043D\\u0442\\u0440\\u0435 \\u0432\\u0438\\u0434\\u0430) \\u0438\\u043B\\u0438 \\u0442\\u043E\\u0447\\u043D\\u043E \\u0432 \\u0442\\u043E\\u0447\\u043A\\u0435 \\u0431\\u0440\\u043E\\u0441\\u043A\\u0430 \\u0438\\u0437 \\u043A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0430\",\n      run(a) {\n        const kind = a.kind === \"door\" ? \"door\" : a.kind === \"window\" ? \"window\" : null;\n        if (!kind) return { ok: false, why: \"kind must be window or door\" };\n        const r = room(), list = openingsOf(r), sz = roomSize();\n        if (list.length >= OPENING_MAX) {\n          if (a.phase !== \"check\") cue(\"A room can have up to \" + OPENING_MAX + \" windows and doors\");\n          return { ok: false, why: \"A room can have up to \" + OPENING_MAX + \" windows and doors\" };\n        }\n        let spot = null;\n        if (a.at && isRoomWall(scene.room, a.at.wall)) {\n          const K2 = OPENING_KINDS[kind], lim = openingLimits(kind, sz, a.at.wall), len = wallFrame(a.at.wall, sz).len;\n          const w = clamp4(K2.def.w, lim.w[0], lim.w[1]), h = clamp4(K2.def.h, lim.h[0], lim.h[1]), y = kind === \"door\" ? 0 : clamp4(K2.def.y, lim.y[0], lim.y[1]);\n          const x = clamp4(Math.round(((Number(a.at.x) || 0) - w / 2) / 10) * 10, 50, Math.max(50, len - 50 - w));\n          const op2 = { id: \"__new\", kind, wall: a.at.wall, x, w, h, y };\n          const chk = checkOpening(r, op2, scene.units, sz);\n          const why = chk.ok ? null : chk.why === \"cabinet\" ? kind === \"door\" ? \"its way in (900 mm in front) would be blocked by \" + named(chk.units) : \"it would sit behind \" + named(chk.units) + \" on the \" + wallNameOf(scene.room, op2.wall).toLowerCase() : chk.why.charAt(0).toLowerCase() + chk.why.slice(1);\n          if (a.phase === \"check\") return { ok: chk.ok, why, op: op2 };\n          if (!chk.ok) {\n            cue(\"Can't put the \" + kind + \" there - \" + why + \". Nothing was added.\");\n            ctx.syncControls();\n            ctx.refresh();\n            return { ok: false, why, op: op2 };\n          }\n          spot = { wall: op2.wall, x: op2.x, w: op2.w, h: op2.h, y: op2.y };\n        } else {\n          const only = isRoomWall(scene.room, a.wall) ? a.wall : null;\n          const prefer = only || (isRoomWall(scene.room, a.prefer) ? a.prefer : null) || (ctx.openingDrag && ctx.openingDrag.wallInView ? ctx.openingDrag.wallInView() : null);\n          spot = freeSpotFor(r, kind, scene.units, sz, prefer, !!only);\n          if (!spot) {\n            const why = only ? \"no clear stretch on the \" + wallNameOf(scene.room, only).toLowerCase() + \" for a \" + kind + \" - cabinets or other openings take it\" : \"there is no clear stretch of wall for a \" + kind + \" anywhere in the room - every wall is taken by cabinets, other windows and doors or corners\";\n            if (a.phase !== \"check\") {\n              cue(why.charAt(0).toUpperCase() + why.slice(1) + \". Nothing was added - make room first.\");\n              ctx.syncControls();\n            }\n            return { ok: false, why: \"no space\", reason: why };\n          }\n          if (a.phase === \"check\") return { ok: true, op: Object.assign({ id: \"__new\", kind }, spot) };\n        }\n        const before = hist.snap();\n        const op = Object.assign({ id: nextOpeningId(r, kind), kind }, spot);\n        r.openings = list.concat([op]);\n        scene.roomSel = op.id;\n        if (ctx.openingDrag && ctx.openingDrag.arm) ctx.openingDrag.arm(op.id);\n        else scene.roomArmed = op.id;\n        done2(\"add \" + kind, before, openingLabel(r, op) + \" added on the \" + wallNameOf(scene.room, op.wall).toLowerCase() + \" - drag it along the wall to place it\" + (kind === \"window\" ? \", click it for its width handles\" : \"\") + \"; Done or Escape when finished\");\n        return { ok: true, id: op.id, wall: op.wall, op };\n      }\n    });\n    define(\"setOpening\", {\n      history: \"move window / resize door \\u2026\",\n      args: {\n        id: \"W1 | D1 \\u2026\",\n        k: \"wall | x | w | h | y\",\n        value: \"\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u0437 \\u043F\\u043E\\u043B\\u044F, id \\u0441\\u0442\\u0435\\u043D\\u044B \\u0438\\u043B\\u0438 \\u0434\\u043B\\u044F x: centre\",\n        phase: \"live (\\u043F\\u043E\\u043B\\u0437\\u0443\\u043D\\u043E\\u043A \\u0442\\u044F\\u043D\\u0443\\u0442: \\u0434\\u0432\\u0438\\u0433\\u0430\\u0442\\u044C \\u0431\\u0435\\u0437 \\u0437\\u0430\\u043F\\u0438\\u0441\\u0438) | end (\\u043E\\u0442\\u043F\\u0443\\u0441\\u0442\\u0438\\u043B\\u0438: \\u043E\\u0434\\u043D\\u0430 \\u0437\\u0430\\u043F\\u0438\\u0441\\u044C \\u0438\\u0441\\u0442\\u043E\\u0440\\u0438\\u0438) | \\u043D\\u0435\\u0442 (\\u043E\\u0434\\u043D\\u043E \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0435)\"\n      },\n      doc: \"\\u0421\\u0442\\u0435\\u043D\\u0430, \\u043C\\u0435\\u0441\\u0442\\u043E \\u043E\\u0442 \\u043B\\u0435\\u0432\\u043E\\u0433\\u043E \\u0443\\u0433\\u043B\\u0430, \\u0448\\u0438\\u0440\\u0438\\u043D\\u0430, \\u0432\\u044B\\u0441\\u043E\\u0442\\u0430, \\u043F\\u043E\\u0434\\u043E\\u043A\\u043E\\u043D\\u043D\\u0438\\u043A \\u043E\\u043A\\u043D\\u0430 \\u0438\\u043B\\u0438 \\u0434\\u0432\\u0435\\u0440\\u0438 (\\u043F\\u0430\\u043D\\u0435\\u043B\\u044C Room \\u043D\\u0430 \\u0445\\u043E\\u043B\\u0441\\u0442\\u0435)\",\n      run(a) {\n        const res = setOpening(a || {});\n        if (a && a.phase === \"end\" && hist.raw().live) hist.commit();\n        return res;\n      }\n    });\n    function setOpening(a) {\n      {\n        const r = room(), list = openingsOf(r);\n        const cur = list.find((o) => o.id === a.id);\n        if (!cur) return { ok: false, why: \"no such opening\" };\n        const sz = roomSize(), op = Object.assign({}, cur), K2 = OPENING_KINDS[op.kind];\n        const what = K2.name.toLowerCase();\n        let note = \"\";\n        if (a.k === \"wall\") {\n          if (!isRoomWall(scene.room, a.value)) return { ok: false, why: \"unknown wall\" };\n          if (a.value === op.wall) return { ok: false, why: \"unchanged\" };\n          op.wall = a.value;\n          const len = wallFrame(op.wall, sz).len, lim = openingLimits(op.kind, sz, op.wall);\n          op.w = clamp4(op.w, lim.w[0], lim.w[1]);\n          op.x = clamp4(op.x, 50, Math.max(50, len - 50 - op.w));\n          if (!checkOpening(r, op, scene.units, sz).ok) {\n            const spot = freeSpotFor(\n              Object.assign({}, r, { openings: list.filter((o) => o.id !== op.id) }),\n              op.kind,\n              scene.units,\n              sz,\n              op.wall,\n              true\n            );\n            if (spot && spot.wall === op.wall) {\n              op.x = spot.x;\n              op.w = Math.min(op.w, spot.w) || spot.w;\n            }\n          }\n        } else if (a.k === \"x\" || a.k === \"w\" || a.k === \"h\" || a.k === \"y\") {\n          const lenX = wallFrame(op.wall, sz).len;\n          const want = a.k === \"x\" && a.value === \"centre\" ? Math.round((lenX - op.w) / 20) * 10 : parseInt(a.value, 10);\n          if (!isFinite(want)) {\n            ctx.syncControls();\n            return { ok: false, why: \"not a number\" };\n          }\n          if (a.k === \"y\" && op.kind === \"door\") {\n            cue(\"A door starts at the floor\");\n            ctx.syncControls();\n            return { ok: false, why: \"door sill\" };\n          }\n          const lim = openingLimits(op.kind, sz, op.wall), len = wallFrame(op.wall, sz).len;\n          const range = a.k === \"x\" ? [50, Math.max(50, len - 50 - op.w)] : lim[a.k];\n          const v = clamp4(Math.round(want), range[0], range[1]);\n          if (v !== want) note = \" (\" + (a.k === \"x\" ? \"from the corner \" : a.k === \"w\" ? \"width \" : a.k === \"h\" ? \"height \" : \"sill \") + range[0] + \"\\u2013\" + range[1] + \" mm, using \" + v + \")\";\n          if (v === op[a.k]) {\n            if (note && !a.phase) cue(K2.name + \" unchanged\" + note);\n            if (!a.phase) ctx.syncControls();\n            return { ok: false, why: \"unchanged\" };\n          }\n          op[a.k] = v;\n        } else return { ok: false, why: \"k must be wall, x, w, h or y\" };\n        const chk = checkOpening(r, op, scene.units, sz, cur);\n        if (!chk.ok) return refuse(chk, op);\n        const label = a.k === \"wall\" || a.k === \"x\" ? \"move \" + what : \"resize \" + what;\n        const msg = openingLabel(r, op) + \": \" + wallNameOf(scene.room, op.wall).toLowerCase() + \", \" + op.x + \" mm from the left corner, \" + op.w + \" \\xD7 \" + op.h + \" mm\" + (op.kind === \"window\" ? \", sill \" + op.y + \" mm\" : \"\") + note;\n        if (a.phase) {\n          hist.begin(label);\n          r.openings = list.map((o) => o.id === op.id ? op : o);\n          cue(msg);\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: true, x: op.x, wall: op.wall };\n        }\n        const before = hist.snap();\n        r.openings = list.map((o) => o.id === op.id ? op : o);\n        done2(label, before, msg);\n        return { ok: true, x: op.x, wall: op.wall };\n      }\n    }\n    define(\"placeOpening\", {\n      history: \"move window / move door\",\n      args: { id: \"W1 | D1 \\u2026\", wall: \"back | left | right | front\", x: \"\\u043C\\u043C \\u043E\\u0442 \\u043B\\u0435\\u0432\\u043E\\u0433\\u043E \\u0443\\u0433\\u043B\\u0430\", y: \"\\u043F\\u043E\\u0434\\u043E\\u043A\\u043E\\u043D\\u043D\\u0438\\u043A (\\u043E\\u043A\\u043D\\u043E)\", phase: \"live | end | check\" },\n      doc: \"\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u043F\\u0440\\u043E\\u0451\\u043C \\u0446\\u0435\\u043B\\u0438\\u043A\\u043E\\u043C (\\u0441\\u0442\\u0435\\u043D\\u0430, \\u043C\\u0435\\u0441\\u0442\\u043E, \\u043F\\u043E\\u0434\\u043E\\u043A\\u043E\\u043D\\u043D\\u0438\\u043A) \\u2014 \\u043F\\u0435\\u0440\\u0435\\u0442\\u0430\\u0441\\u043A\\u0438\\u0432\\u0430\\u043D\\u0438\\u0435 \\u043C\\u044B\\u0448\\u044C\\u044E \\u0432 3D (opening-drag.js)\",\n      run(a) {\n        const r = room(), list = openingsOf(r), cur = list.find((o) => o.id === a.id);\n        if (!cur) return { ok: false, why: \"no such opening\" };\n        if (!isRoomWall(scene.room, a.wall)) return { ok: false, why: \"unknown wall\" };\n        const sz = roomSize(), op = Object.assign({}, cur);\n        op.wall = a.wall;\n        const lim = openingLimits(op.kind, sz, op.wall), len = wallFrame(op.wall, sz).len;\n        op.w = clamp4(op.w, lim.w[0], lim.w[1]);\n        op.x = clamp4(Math.round((Number(a.x) || 0) / 10) * 10, 50, Math.max(50, len - 50 - op.w));\n        if (op.kind === \"door\") op.y = 0;\n        const chk = checkOpening(Object.assign({}, r, { openings: list }), op, scene.units, sz, cur);\n        const why = chk.ok ? null : chk.why === \"cabinet\" ? op.kind === \"door\" ? \"its way in (900 mm in front) would be blocked by \" + named(chk.units) : \"it would sit behind \" + named(chk.units) + \" on the \" + wallNameOf(scene.room, op.wall).toLowerCase() : chk.why.charAt(0).toLowerCase() + chk.why.slice(1);\n        if (a.phase === \"check\" || !chk.ok) return { ok: chk.ok, why, op };\n        const what = OPENING_KINDS[op.kind].name.toLowerCase();\n        if (a.phase === \"live\") hist.begin(\"move \" + what);\n        const before = a.phase ? null : hist.snap();\n        r.openings = list.map((o) => o.id === op.id ? op : o);\n        cue(openingLabel(r, op) + \": \" + wallNameOf(scene.room, op.wall).toLowerCase() + \", \" + op.x + \" mm from the left corner\" + (op.kind === \"window\" ? \", sill \" + op.y + \" mm\" : \"\"));\n        if (a.phase === \"end\") hist.commit();\n        else if (!a.phase) hist.pushAfter(\"move \" + what, before);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, op };\n      }\n    });\n    define(\"resizeOpening\", {\n      history: \"resize window / resize door\",\n      args: { id: \"W1 | D1 \\u2026\", edge: \"left | right\", a: \"\\u043C\\u043C \\u043E\\u0442 \\u043B\\u0435\\u0432\\u043E\\u0433\\u043E \\u0443\\u0433\\u043B\\u0430 \\u0441\\u0442\\u0435\\u043D\\u044B\", phase: \"live | end | check\" },\n      doc: \"\\u0428\\u0438\\u0440\\u0438\\u043D\\u0430 \\u043F\\u0440\\u043E\\u0451\\u043C\\u0430 \\u0437\\u0430 \\u043B\\u0435\\u0432\\u0443\\u044E / \\u043F\\u0440\\u0430\\u0432\\u0443\\u044E \\u0440\\u0443\\u0447\\u043A\\u0443, \\u043F\\u0440\\u043E\\u0442\\u0438\\u0432\\u043E\\u043F\\u043E\\u043B\\u043E\\u0436\\u043D\\u0430\\u044F \\u0441\\u0442\\u043E\\u0440\\u043E\\u043D\\u0430 \\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435 (opening-card-dom.js)\",\n      run(a) {\n        const r = room(), list = openingsOf(r), cur = list.find((o) => o.id === a.id);\n        if (!cur) return { ok: false, why: \"no such opening\" };\n        if (a.edge !== \"left\" && a.edge !== \"right\") return { ok: false, why: \"edge must be left or right\" };\n        const sz = roomSize(), lim = openingLimits(cur.kind, sz, cur.wall), len = wallFrame(cur.wall, sz).len;\n        const at = Math.round((Number(a.a) || 0) / 10) * 10, op = Object.assign({}, cur);\n        let clampedBy = null;\n        if (a.edge === \"right\") {\n          const right = clamp4(at, cur.x + lim.w[0], Math.min(cur.x + lim.w[1], len - 50));\n          if (right !== at) clampedBy = at < cur.x + lim.w[0] ? \"min\" : \"max\";\n          op.w = right - cur.x;\n        } else {\n          const right = cur.x + cur.w;\n          const left = clamp4(at, Math.max(50, right - lim.w[1]), right - lim.w[0]);\n          if (left !== at) clampedBy = at > right - lim.w[0] ? \"min\" : \"max\";\n          op.x = left;\n          op.w = right - left;\n        }\n        const chk = checkOpening(Object.assign({}, r, { openings: list }), op, scene.units, sz, cur);\n        const what = OPENING_KINDS[op.kind].name.toLowerCase();\n        const why = chk.ok ? null : chk.why === \"cabinet\" ? op.kind === \"door\" ? \"its way in (900 mm in front) would be blocked by \" + named(chk.units) : \"it would reach behind \" + named(chk.units) + \" on the \" + wallNameOf(scene.room, op.wall).toLowerCase() : chk.why.charAt(0).toLowerCase() + chk.why.slice(1);\n        const limitSay = clampedBy === \"min\" ? \" (\" + lim.w[0] + \" mm is the narrowest \" + what + \")\" : clampedBy === \"max\" ? \" (as wide as it can go here)\" : \"\";\n        if (a.phase === \"check\" || !chk.ok) return { ok: chk.ok, why, op, limit: clampedBy };\n        if (a.phase === \"live\") hist.begin(\"resize \" + what);\n        const before = a.phase ? null : hist.snap();\n        r.openings = list.map((o) => o.id === op.id ? op : o);\n        cue(openingLabel(r, op) + \": \" + op.w + \" mm wide\" + limitSay);\n        if (a.phase === \"end\") hist.commit();\n        else if (!a.phase) hist.pushAfter(\"resize \" + what, before);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, op, limit: clampedBy };\n      }\n    });\n    define(\"faceWall\", {\n      history: null,\n      args: { wall: \"back | left | right | front\" },\n      doc: \"\\u041F\\u043E\\u0432\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u0432\\u0438\\u0434 \\u043A \\u0441\\u0442\\u0435\\u043D\\u0435 \\u0438\\u0437\\u043D\\u0443\\u0442\\u0440\\u0438 \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u044B (\\u0432\\u0441\\u044F \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u0430 \\u0432 \\u043A\\u0430\\u0434\\u0440\\u0435)\",\n      run(a) {\n        const base = { back: 0, left: -Math.PI / 2, right: Math.PI / 2, front: Math.PI }[a && a.wall];\n        if (base === void 0) return { ok: false, why: \"unknown wall\" };\n        const said = ctx.st.cueText;\n        ctx.view.fitRoom();\n        ctx.view.setCam(base - 0.38, 0.36);\n        if (said) cue(said);\n        return { ok: true, yaw: base - 0.38 };\n      }\n    });\n    define(\"removeOpening\", {\n      history: \"remove window / remove door\",\n      args: { id: \"W1 | D1 \\u2026\" },\n      doc: \"\\u0423\\u0431\\u0440\\u0430\\u0442\\u044C \\u043E\\u043A\\u043D\\u043E \\u0438\\u043B\\u0438 \\u0434\\u0432\\u0435\\u0440\\u044C (Room setup, \\u043A\\u043D\\u043E\\u043F\\u043A\\u0430 Remove \\u0443 \\u043F\\u0440\\u043E\\u0451\\u043C\\u0430)\",\n      run(a) {\n        const r = room(), list = openingsOf(r), op = list.find((o) => o.id === a.id);\n        if (!op) return { ok: false, why: \"no such opening\" };\n        const before = hist.snap(), name2 = openingLabel(r, op);\n        r.openings = list.filter((o) => o.id !== op.id);\n        if (scene.roomArmed === op.id) scene.roomArmed = null;\n        done2(\"remove \" + op.kind, before, name2 + \" removed\");\n        return { ok: true };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-room-objects.js\n  function installRoomObjectCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue, hist = ctx.hist;\n    function room() {\n      if (!scene.room) scene.room = { on: true, width: roomSize().width, depth: roomSize().depth, height: roomSize().height };\n      return scene.room;\n    }\n    const cabinetsIn = (prev) => (z) => (scene.units || []).filter((u) => unitInZone(u, z) && !(prev && unitInZone(u, prev)));\n    function named(units) {\n      const names = units.map((v) => displayName(scene.units, v));\n      return names.slice(0, 2).join(\" and \") + (names.length > 2 ? \" and \" + (names.length - 2) + \" more\" : \"\");\n    }\n    function why(chk) {\n      return chk.why === \"cabinet\" ? \"it would run into \" + named(chk.units) : chk.why.charAt(0).toLowerCase() + chk.why.slice(1);\n    }\n    function refuse(chk, verb) {\n      cue(\"Can't \" + verb + \" the boiler there - \" + why(chk) + \". Nothing changed.\");\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: false, why: chk.why === \"cabinet\" ? \"cabinet\" : chk.why };\n    }\n    const check = (r, o, prev) => checkObject(r, o, roomSize(), openingsOf(r), cabinetsIn(prev ? objectZone(prev, roomSize()) : null));\n    define(\"addRoomObject\", {\n      history: \"add boiler\",\n      args: { kind: \"boiler\", at: \"{ wall, x } - optional: a place on a wall (else a free spot, the wall in view first)\", phase: \"check - only say whether it fits\" },\n      doc: \"Add a boiler (room object on a wall, placeholder sizes) - one Undo; the new one is selected\",\n      run(a) {\n        const kind = a && a.kind || \"boiler\", K2 = ROOM_OBJECT_KINDS[kind];\n        if (!K2) return { ok: false, why: \"unknown kind\" };\n        const r = room(), list = roomObjectsOf(r);\n        if (list.length >= ROOM_OBJECT_MAX) {\n          cue(\"A room can have up to \" + ROOM_OBJECT_MAX + \" boilers and similar objects - nothing added.\");\n          return { ok: false, why: \"full\" };\n        }\n        let o;\n        if (a && a.at && isRoomWall(scene.room, a.at.wall)) {\n          const sz = roomSize(), lim = objectLimits(kind, sz, a.at.wall), fr = wallFrame(a.at.wall, sz);\n          const w = clamp4(K2.def.w, lim.w[0], lim.w[1]), h = clamp4(K2.def.h, lim.h[0], lim.h[1]);\n          const x = clamp4(Math.round(((Number(a.at.x) || 0) - w / 2) / 10) * 10, 0, Math.max(0, fr.len - w));\n          o = { id: \"__new\", kind, wall: a.at.wall, x, y: clamp4(K2.def.y, 0, Math.max(0, sz.height - h)), w, h, d: K2.def.d };\n          const chk = check(r, o);\n          if (a.phase === \"check\") return { ok: chk.ok, why: chk.ok ? null : why(chk), op: o };\n          if (!chk.ok) return refuse(chk, \"put\");\n        } else {\n          const prefer = ctx.openingDrag && ctx.openingDrag.wallInView ? ctx.openingDrag.wallInView() : null;\n          const spot = freeSpotForObject(r, kind, roomSize(), openingsOf(r), cabinetsIn(null), prefer);\n          if (!spot) {\n            cue(\"There is no clear stretch of wall for a boiler anywhere in the room - nothing added.\");\n            return { ok: false, why: \"no room\" };\n          }\n          o = Object.assign({ id: \"__new\", kind }, spot);\n          if (a && a.phase === \"check\") return { ok: true, op: o };\n        }\n        const before = hist.snap();\n        o.id = nextObjectId(r);\n        o.verified = false;\n        r.objects = list.concat([o]);\n        scene.roomObjSel = o.id;\n        hist.pushAfter(\"add boiler\", before);\n        cue(objectLabel(r, o) + \" added on the \" + wallNameOf(scene.room, o.wall).toLowerCase() + \" - \" + BOILER.note);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, id: o.id, op: Object.assign({}, o) };\n      }\n    });\n    define(\"setRoomObject\", {\n      history: \"boiler size / place\",\n      args: { id: \"B1\\u2026\", k: \"w | h | d | y | x | wall\", raw: \"mm or a wall id\" },\n      doc: \"Type one size or position of a boiler - one Undo; refused with the reason when it would not fit\",\n      run(a) {\n        const r = room(), o0 = roomObjectsOf(r).find((q) => q.id === (a && a.id));\n        if (!o0) return { ok: false, why: \"no such object\" };\n        const k = a.k, o = Object.assign({}, o0), sz = roomSize();\n        if (k === \"wall\") {\n          if (!isRoomWall(scene.room, a.raw)) return { ok: false, why: \"unknown wall\" };\n          o.wall = a.raw;\n          o.x = clamp4(o.x, 0, Math.max(0, wallFrame(o.wall, sz).len - o.w));\n        } else if ([\"w\", \"h\", \"d\", \"y\", \"x\"].indexOf(k) >= 0) {\n          const v = Math.round(Number(a.raw));\n          if (!isFinite(v)) {\n            cue(\"Type a size in millimetres\");\n            return { ok: false, why: \"not a number\" };\n          }\n          const lim = objectLimits(o.kind, sz, o.wall);\n          if (k === \"w\" || k === \"h\" || k === \"d\") {\n            const L = lim[k];\n            if (v < L[0] || v > L[1]) {\n              cue(\"The boiler's \" + { w: \"width\", h: \"height\", d: \"depth\" }[k] + \" can be \" + L[0] + \" to \" + L[1] + \" mm - nothing changed.\");\n              return { ok: false, why: \"range\" };\n            }\n          }\n          o[k] = v;\n        } else return { ok: false, why: \"unknown field\" };\n        if (JSON.stringify(o) === JSON.stringify(o0)) return { ok: true, unchanged: true };\n        const chk = check(r, o, o0);\n        if (!chk.ok) return refuse(chk, k === \"wall\" || k === \"x\" ? \"move\" : \"size\");\n        const before = hist.snap();\n        r.objects = roomObjectsOf(r).map((q) => q.id === o.id ? o : q);\n        hist.pushAfter(k === \"wall\" || k === \"x\" || k === \"y\" ? \"move boiler\" : \"boiler size\", before);\n        cue(objectLabel(r, o) + \": \" + o.w + \" \\xD7 \" + o.h + \" \\xD7 \" + o.d + \" mm, \" + o.y + \" mm up, \" + o.x + \" mm along the \" + wallNameOf(scene.room, o.wall).toLowerCase());\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, op: Object.assign({}, o) };\n      }\n    });\n    define(\"placeRoomObject\", {\n      history: \"move boiler\",\n      args: { id: \"B1\\u2026\", wall: \"wall id\", x: \"mm along it\", phase: \"check - only say whether it fits\" },\n      doc: \"Move a boiler along its wall or onto another wall, its height kept - one Undo\",\n      run(a) {\n        const r = room(), o0 = roomObjectsOf(r).find((q) => q.id === (a && a.id));\n        if (!o0) return { ok: false, why: \"no such object\" };\n        if (!isRoomWall(scene.room, a.wall)) return { ok: false, why: \"unknown wall\" };\n        const fr = wallFrame(a.wall, roomSize());\n        const o = Object.assign({}, o0, { wall: a.wall, x: clamp4(Math.round(Number(a.x) / 10) * 10, 0, Math.max(0, fr.len - o0.w)) });\n        const chk = check(r, o, o0);\n        if (a.phase === \"check\") return { ok: chk.ok, why: chk.ok ? null : why(chk), op: o };\n        if (!chk.ok) return refuse(chk, \"move\");\n        const before = hist.snap();\n        r.objects = roomObjectsOf(r).map((q) => q.id === o.id ? o : q);\n        hist.pushAfter(\"move boiler\", before);\n        cue(objectLabel(r, o) + \" on the \" + wallNameOf(scene.room, o.wall).toLowerCase() + \", \" + o.x + \" mm along it, \" + o.y + \" mm up\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, op: Object.assign({}, o) };\n      }\n    });\n    define(\"removeRoomObject\", {\n      history: \"remove boiler\",\n      args: { id: \"B1\\u2026\" },\n      doc: \"Remove a boiler - one Undo\",\n      run(a) {\n        const r = room(), o = roomObjectsOf(r).find((q) => q.id === (a && a.id));\n        if (!o) return { ok: false, why: \"no such object\" };\n        const before = hist.snap(), label = objectLabel(r, o);\n        r.objects = roomObjectsOf(r).filter((q) => q.id !== o.id);\n        if (scene.roomObjSel === o.id) scene.roomObjSel = null;\n        hist.pushAfter(\"remove boiler\", before);\n        cue(label + \" removed\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n  }\n\n  // v2/src/model/room-layout-session.js\n  var SNAP_MM2 = 10;\n  var SNAP_ALIGN = 30;\n  function snapCorner(o, id, x, z) {\n    const w = o.walls, n = w.length, i = w.findIndex((p) => p.id === id);\n    let sx = Math.round(x / SNAP_MM2) * SNAP_MM2, sz = Math.round(z / SNAP_MM2) * SNAP_MM2, snapped = null;\n    if (i >= 0) for (const nb of [w[(i - 1 + n) % n], w[(i + 1) % n]]) {\n      if (Math.abs(sx - nb.x) <= SNAP_ALIGN && sx !== nb.x) {\n        sx = nb.x;\n        snapped = \"square\";\n      }\n      if (Math.abs(sz - nb.z) <= SNAP_ALIGN && sz !== nb.z) {\n        sz = nb.z;\n        snapped = \"square\";\n      }\n    }\n    return { x: sx, z: sz, snapped };\n  }\n  function snapPoint(x, z) {\n    return { x: Math.round(x / SNAP_MM2) * SNAP_MM2, z: Math.round(z / SNAP_MM2) * SNAP_MM2 };\n  }\n  function createLayoutSession(room, sz) {\n    const start2 = outlineOf(room, sz);\n    const startParts = JSON.parse(JSON.stringify(partitionsOf(room)));\n    const ceil = sz && sz.height || room && room.height || 2400;\n    setCeiling(ceil);\n    let draft = start2, parts = startParts, past = [], future = [], last = null;\n    function step(r) {\n      last = r.ok ? null : r.why;\n      if (!r.ok) return r;\n      past.push({ o: draft, p: parts });\n      future = [];\n      draft = r.outline;\n      return r;\n    }\n    function partStep(r) {\n      last = r.ok ? null : r.why;\n      if (!r.ok) return r;\n      past.push({ o: draft, p: parts });\n      future = [];\n      parts = r.parts;\n      return r;\n    }\n    const api = {\n      start: () => start2,\n      draft: () => draft,\n      lastWhy: () => last,\n      changed: () => JSON.stringify(draft) !== JSON.stringify(start2) || JSON.stringify(parts) !== JSON.stringify(startParts),\n      /* the internal walls: an open wall (Finish wall), a closed enclosure / solid block (Close shape), moved, a corner moved\n         (square kept), thickness, doorways, removed - each ONE editor step or refused with the reason */\n      parts: () => parts,\n      /* the Apply command: the editor's internal walls handed over whole (checked by issues() like everything else) */\n      loadParts: (list) => partStep({ ok: true, parts: JSON.parse(JSON.stringify(list || [])) }),\n      addPart: (kind, pts, opts) => partStep(addPartition(parts, draft, kind, pts, opts)),\n      removePart: (id) => partStep(removePartition(parts, id)),\n      movePart: (id, dx, dz) => partStep(movePartition(parts, draft, id, Math.round(dx / SNAP_MM2) * SNAP_MM2, Math.round(dz / SNAP_MM2) * SNAP_MM2)),\n      movePartPoint: (id, i, x, z, square) => partStep(movePartPoint(parts, draft, id, i, Math.round(x / SNAP_MM2) * SNAP_MM2, Math.round(z / SNAP_MM2) * SNAP_MM2, square !== false)),\n      partThick: (id, t) => partStep(setPartThick(parts, draft, id, t)),\n      addPartDoor: (id, seg, w, at, h) => partStep(addPartDoor(parts, draft, id, seg, w, at, h)),\n      /* typed dimensions (owner 13.10: \u00ABuser-set wall height / doorway width + height should be dimensions\u00BB): a wall's height\n         (empty: to the ceiling), a doorway's width / height / place - refused with the reason only where the geometry cannot be */\n      partHeight: (id, h) => partStep(setPartHeight(parts, draft, id, h)),\n      setPartDoor: (id, did, v) => partStep(setPartDoor(parts, draft, id, did, v || {})),\n      ceiling: () => ceil,\n      removePartDoor: (id, did) => partStep(removePartDoor(parts, id, did)),\n      walls: () => segments(draft),\n      moveCorner: (id, x, z, snap3) => {\n        const p = snap3 === false ? { x, z } : snapCorner(draft, id, x, z);\n        return step(moveCorner(draft, id, p.x, p.z));\n      },\n      pushWall: (id, by) => step(pushWall(draft, id, Math.round(by))),\n      setLength: (id, len) => step(setWallLength(draft, id, Math.round(Number(len)))),\n      setAngle: (id, deg) => step(setCornerAngle(draft, id, Number(deg))),\n      recess: (id, a0, a1, depth) => step(notchWall(draft, id, Math.round(a0), Math.round(a1), Math.round(depth))),\n      /* free shape: a new corner on a wall (dragged off its line), a corner taken away, a whole outline drawn corner by corner */\n      bend: (id, x, z, snap3) => {\n        const p = snap3 === false ? { x, z } : snapPoint(x, z);\n        return step(bendWall(draft, id, p.x, p.z));\n      },\n      removeCorner: (id) => step(removeCorner(draft, id)),\n      drawn: (pts) => step(outlineFromPoints(draft, pts)),\n      /* a whole outline given (the Apply command: the editor's draft, checked against the room as it is now) */\n      load: (o) => step(validateOutline(o)),\n      preset: (kind, a) => {\n        const B = outlineBounds(draft), W2 = B.x1 - B.x0, D2 = B.z1 - B.z0;\n        if (kind === \"rect\") return step({ ok: true, outline: rectOutline(W2, D2) });\n        if (kind === \"L\") return step(lShapeOutline(W2, D2, Math.round(a && a.cutW || W2 / 3), Math.round(a && a.cutD || D2 / 3)));\n        return { ok: false, why: \"unknown shape\" };\n      },\n      /* SQUARE-CORNER EDITING (owner 13.10.2026): corner moves keeping both walls square, a square step, a breast / recess by\n         positive numbers, a corner removed keeping the room square - each ONE editor step or refused with the reason */\n      orthoMove: (id, x, z) => step(orthoMoveCorner(draft, id, Math.round(x / SNAP_MM2) * SNAP_MM2, Math.round(z / SNAP_MM2) * SNAP_MM2)),\n      orthoRemove: (id) => step(orthoRemoveCorner(draft, id)),\n      stepWall: (id, at, depth, dir, side) => step(stepWall(draft, id, at, depth, dir, side)),\n      feature: (id, f) => {\n        const r = wallFeature(draft, id, f);\n        if (r.ok) step(r);\n        else last = r.why;\n        return r;\n      },\n      isOrtho: () => isOrthoOutline(draft),\n      canUndo: () => past.length > 0,\n      canRedo: () => future.length > 0,\n      undo: () => {\n        if (!past.length) return false;\n        future.push({ o: draft, p: parts });\n        const e = past.pop();\n        draft = e.o;\n        parts = e.p;\n        return true;\n      },\n      redo: () => {\n        if (!future.length) return false;\n        past.push({ o: draft, p: parts });\n        const e = future.pop();\n        draft = e.o;\n        parts = e.p;\n        return true;\n      },\n      /* what Apply would refuse for; boxes: cabinet footprints [{ id, label, x0, x1, z0, z1 }] */\n      /* the windows / doors / boilers re-measured on the draft's walls (they keep their place in the room - outline.carryAlong).\n         A rectangle resized into a rectangle keeps today's rule instead (each keeps its distance from its wall's start corner,\n         exactly what the Width / Depth fields do), so a rectangular room behaves exactly as before. */\n      carried: (items) => isRectOutline(start2) && isRectOutline(draft) ? items || [] : carryAlong(start2, draft, items),\n      issues: (boxes, openings, objects) => {\n        const out = [];\n        const v = validateOutline(draft);\n        if (!v.ok) out.push({ kind: \"outline\", why: v.why });\n        else {\n          const B0 = outlineBounds(draft);\n          if (B0.x0 !== 0 || B0.z0 !== 0) out.push({ kind: \"stage\", why: \"The room must keep its back-left corner where it is - move the other walls instead (a recess out of the back or left wall moves it)\" });\n        }\n        return out.concat(outlineIssues(draft, boxes, api.carried(openings), api.carried(objects)), partitionIssues(parts, draft, boxes, ceil));\n      },\n      /* the change Apply would write to the room, or null with the reasons */\n      applyPatch: (boxes, openings, objects) => {\n        const iss = api.issues(boxes, openings, objects);\n        if (iss.length) return { ok: false, issues: iss };\n        const B = outlineBounds(draft);\n        if (B.x0 !== 0 || B.z0 !== 0) return { ok: false, issues: [{ kind: \"stage\", why: \"The room must keep its back-left corner where it is - move the other walls instead (a recess out of the back or left wall moves it)\" }] };\n        const rect2 = isRectOutline(draft);\n        const patch = { width: B.x1 - B.x0, depth: B.z1 - B.z0, outline: rect2 ? null : draft };\n        let ops = api.carried(openings), objs = api.carried(objects);\n        if (rect2) {\n          const rename = {};\n          draft.walls.forEach((p, k) => {\n            if (p.id !== RECT_IDS[k]) rename[p.id] = RECT_IDS[k];\n          });\n          const re = (q) => rename[q.wall] ? Object.assign({}, q, { wall: rename[q.wall] }) : q;\n          ops = ops.map(re);\n          objs = objs.map(re);\n        }\n        if (ops.some((q, k) => q !== (openings || [])[k])) patch.openings = ops;\n        if (objs.some((q, k) => q !== (objects || [])[k])) patch.objects = objs;\n        if (JSON.stringify(parts) !== JSON.stringify(startParts)) patch.partitions = parts;\n        return { ok: true, patch };\n      }\n    };\n    return api;\n  }\n\n  // v2/src/interact/cmd-room-layout.js\n  function installRoomLayoutCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue, hist = ctx.hist;\n    const boxes = () => (scene.units || []).map((u) => {\n      const vs = unitVSpan(u);\n      return Object.assign({ id: u.id, label: displayName(scene.units, u), v0: vs[0], v1: vs[1] }, foot(u));\n    });\n    define(\"applyRoomLayout\", {\n      history: \"room layout\",\n      args: { outline: \"{ walls: [{ id, x, z }] } - the editor's draft\", partitions: \"[{ id, kind: wall|enclosure|solid, pts, thick?, doors? }] - the walls inside (optional; absent: unchanged)\" },\n      doc: \"Set room layout: apply the edited outline - one Undo; refused with every reason while anything would be cut or lost\",\n      run(a) {\n        const room = scene.room || { on: true, width: roomSize().width, depth: roomSize().depth, height: roomSize().height };\n        const s = createLayoutSession(room, roomSize());\n        const ld = a && a.outline ? s.load(a.outline) : { ok: false, why: \"No layout given\" };\n        if (ld.ok && a && Array.isArray(a.partitions)) s.loadParts(a.partitions);\n        const r = ld.ok ? s.applyPatch(boxes(), openingsOf(room), roomObjectsOf(room)) : { ok: false, issues: [{ kind: \"outline\", why: ld.why }] };\n        if (!r.ok) {\n          cue(\"Room layout not applied - \" + r.issues.map((q) => q.why).join(\"; \") + \". Nothing changed.\");\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: false, issues: r.issues };\n        }\n        const sameShape = JSON.stringify(r.patch.outline || null) === JSON.stringify(room.outline || null);\n        if (sameShape && !r.patch.openings && !r.patch.objects && !r.patch.partitions && r.patch.width === Math.round(room.width || roomSize().width) && r.patch.depth === Math.round(room.depth || roomSize().depth)) return { ok: true, unchanged: true };\n        const before = hist.snap();\n        const nP = r.patch.partitions ? r.patch.partitions.length : 0;\n        const what = (r.patch.outline ? \"Room layout: \" + r.patch.outline.walls.length + \" walls\" : \"Room \" + r.patch.width + \" x \" + r.patch.depth + \" mm\") + (nP ? \" + \" + nP + \" inside\" : \"\");\n        const ok2 = ctx.roomTry((rm) => {\n          rm.width = r.patch.width;\n          rm.depth = r.patch.depth;\n          if (r.patch.outline) rm.outline = r.patch.outline;\n          else delete rm.outline;\n          const by = (list) => {\n            const m = {};\n            for (const q of list) m[q.id] = q;\n            return m;\n          };\n          if (r.patch.openings) {\n            const m = by(r.patch.openings);\n            rm.openings = (rm.openings || []).map((q) => q && m[q.id] || q);\n          }\n          if (r.patch.objects) {\n            const m = by(r.patch.objects);\n            rm.objects = (rm.objects || []).map((q) => q && m[q.id] || q);\n          }\n          if (r.patch.partitions) {\n            if (r.patch.partitions.length) rm.partitions = r.patch.partitions;\n            else delete rm.partitions;\n          }\n        }, what);\n        if (!ok2) return { ok: false, issues: [{ kind: \"room\", why: \"the room's own rule refused it (see the message)\" }] };\n        hist.pushAfter(\"room layout\", before);\n        return { ok: true, patch: r.patch };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-finish.js\n  function installFinishCommands(ctx) {\n    const scene = ctx.scene;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    define(\"setKitchenFinish\", {\n      history: null,\n      args: { k: \"carcass | fronts\", value: \"white | oak\" },\n      doc: \"\\u041E\\u0442\\u0434\\u0435\\u043B\\u043A\\u0430 \\u0432\\u0441\\u0435\\u0439 \\u043A\\u0443\\u0445\\u043D\\u0438, \\u0441\\u0432\\u043E\\u044F \\u043E\\u0442\\u0434\\u0435\\u043B\\u043A\\u0430 \\u0448\\u043A\\u0430\\u0444\\u043E\\u0432 \\u043E\\u0441\\u0442\\u0430\\u0451\\u0442\\u0441\\u044F ([data-ub-kfinish]/[data-ub-kval]; 25-controls.js)\",\n      run(a) {\n        const which = a.k;\n        const val = a.value;\n        if (!okFinish(val)) return { ok: false, why: \"unknown finish\" };\n        scene.kitchen[which] = val;\n        if (which === \"fronts\") {\n          if (scene.kitchen.frontMat) scene.kitchen.frontMat = \"mfc\";\n          if (isRouted(scene.kitchen.frontStyle)) scene.kitchen.frontStyle = \"slab\";\n          const jp = scene.units.filter((u) => isPaintedOnly(u.ovStyle) && !okFinish(u.ovFronts));\n          jp.forEach((u) => {\n            u.ovStyle = null;\n            u.ovShaker = null;\n          });\n          if (jp.length) cue(JPULL_NEEDS_PAINT + \", so \" + jp.length + \" cabinet\" + (jp.length === 1 ? \"\" : \"s\") + \" with J-pull fronts \" + (jp.length === 1 ? \"is\" : \"are\") + \" now Flat\");\n        }\n        resolveFinishes(scene.units, scene.kitchen);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    define(\"setKitchenMaterials\", {\n      history: \"kitchen materials\",\n      args: {\n        carcass: \"white | oak\",\n        fronts: \"white | oak\",\n        frontMat: \"mfc | mdf-paint\",\n        paint: \"{ finish, tone, ref }\",\n        frontStyle: \"slab | shaker | jpull\",\n        shaker: \"{\\u2026}\",\n        primer: \"true | false - painted MDF fronts supplied primed (water-based primer, no colour)\"\n      },\n      doc: \"Whole kitchen: carcass, front material / decor / paint, door style; clears that exception on every cabinet; one Undo\",\n      run(a) {\n        a = a || {};\n        const k = kitchenOf2(scene.kitchen);\n        const next = JSON.parse(JSON.stringify(k));\n        const said = [];\n        let clearCarcass = false, clearFronts = false, clearStyle = false;\n        if (a.carcass != null) {\n          if (!okFinish(a.carcass)) return { ok: false, why: \"unknown carcass finish\" };\n          next.carcass = a.carcass;\n          clearCarcass = true;\n        }\n        if (a.fronts != null) {\n          if (!okFinish(a.fronts)) return { ok: false, why: \"unknown front decor\" };\n          next.fronts = a.fronts;\n          next.frontMat = \"mfc\";\n          clearFronts = true;\n        }\n        if (a.frontMat != null) {\n          if (!okFrontMat(a.frontMat)) return { ok: false, why: \"unknown front material\" };\n          next.frontMat = a.frontMat;\n          clearFronts = true;\n        }\n        if (a.paint) {\n          const p = a.paint;\n          if (p.finish != null && !okPaintFinish(p.finish)) return { ok: false, why: \"unknown paint finish\" };\n          if (p.tone != null && !okTone(p.tone)) return { ok: false, why: \"unknown preview tone\" };\n          next.paint = {\n            finish: p.finish != null ? p.finish : next.paint.finish,\n            tone: p.tone != null ? p.tone : next.paint.tone,\n            ref: p.ref != null ? cleanRef(p.ref) : next.paint.ref\n          };\n          next.frontMat = \"mdf-paint\";\n          clearFronts = true;\n        }\n        if (a.primer != null) {\n          if (a.primer === true) next.primer = true;\n          else delete next.primer;\n          if (!!k.primer !== (a.primer === true)) said.push(a.primer === true ? \"Painted fronts: supplied primed with a water-based primer, ready for your painter - the colour is for the 3D view only\" : \"Painted fronts: quoted separately\");\n        }\n        if (a.frontStyle != null || a.shaker) {\n          const st = a.frontStyle != null ? okStyle(a.frontStyle) : next.frontStyle;\n          if (!st) return { ok: false, why: \"Choose Flat, Shaker or J-pull\" };\n          if (a.frontStyle != null && !offeredStyle(st) && st !== k.frontStyle) {\n            cue(NOT_OFFERED);\n            return { ok: false, why: NOT_OFFERED };\n          }\n          if (isCabinetOnly(st)) {\n            cue(GLASS_ONE_CABINET);\n            return { ok: false, why: GLASS_ONE_CABINET };\n          }\n          next.frontStyle = st;\n          next.shaker = { ...next.shaker, ...a.shaker || {} };\n          clearStyle = true;\n        }\n        if (isRouted(next.frontStyle) && next.frontMat !== \"mdf-paint\") {\n          if (a.frontStyle != null) {\n            next.frontMat = \"mdf-paint\";\n            clearFronts = true;\n            said.push(styleOf(next.frontStyle).long + \" fronts are routed from MDF, so the fronts are now painted MDF\");\n          } else {\n            next.frontStyle = \"slab\";\n            clearStyle = true;\n            said.push(\"Egger MFC fronts are flat, so the door style is now Flat\");\n          }\n        }\n        let ownJpull = [];\n        if (isPaintedOnly(next.frontStyle) && next.frontMat === \"mdf-paint\") {\n          const own2 = scene.units.filter((u) => okFinish(u.ovFronts));\n          if (own2.length && !clearFronts) said.push(JPULL_NEEDS_PAINT + \", so \" + own2.length + \" cabinet\" + (own2.length === 1 ? \"\" : \"s\") + \" with \" + (own2.length === 1 ? \"its\" : \"their\") + \" own Egger fronts \" + (own2.length === 1 ? \"is\" : \"are\") + \" painted MDF too\");\n          clearFronts = true;\n        }\n        if (next.frontMat !== \"mdf-paint\") {\n          ownJpull = scene.units.filter((u) => isPaintedOnly(u.ovStyle));\n          if (ownJpull.length) said.push(JPULL_NEEDS_PAINT + \", so \" + ownJpull.length + \" cabinet\" + (ownJpull.length === 1 ? \"\" : \"s\") + \" with J-pull fronts \" + (ownJpull.length === 1 ? \"is\" : \"are\") + \" now Flat\");\n        }\n        if (next.frontStyle === \"shaker\") {\n          const why = shakerBoxes({ frontStyle: \"shaker\", shaker: next.shaker }, { x0: 0, x1: 3e3, y0: 0, y1: 3e3, z0: 0, z1: 18 }).error;\n          if (why) {\n            cue(why);\n            return { ok: false, why };\n          }\n        }\n        const keepGlass = clearStyle ? scene.units.filter(isIntentionalGlass) : [];\n        if (keepGlass.length) said.push(keepGlass.length === 1 ? displayName(scene.units, keepGlass[0]) + \" keeps its glass doors\" : keepGlass.map((u) => displayName(scene.units, u)).join(\", \") + \" keep their glass doors\");\n        const before = JSON.stringify({ k, u: scene.units.map((u) => [u.ovCarcass, u.ovFronts, u.ovSkin, u.ovStyle]) });\n        ctx.hist.run(\"kitchen materials\", () => {\n          scene.kitchen = next;\n          for (const u of scene.units) {\n            if (clearCarcass) u.ovCarcass = null;\n            if (clearFronts) {\n              u.ovFronts = null;\n              if (u.type === \"island\") u.ovSkin = null;\n            }\n            if (clearStyle && keepGlass.indexOf(u) < 0) {\n              u.ovStyle = null;\n              u.ovShaker = null;\n              delete u.glassFrom;\n            }\n            if (ownJpull.indexOf(u) >= 0) {\n              u.ovStyle = null;\n              u.ovShaker = null;\n            }\n          }\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        const after = JSON.stringify({ k: scene.kitchen, u: scene.units.map((u) => [u.ovCarcass, u.ovFronts, u.ovSkin, u.ovStyle]) });\n        if (before !== after) {\n          const n = scene.units.length;\n          cue((said.length ? said.join(\". \") + \". \" : \"\") + \"Whole kitchen updated - \" + n + \" cabinet\" + (n === 1 ? \"\" : \"s\"));\n        }\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, changed: before !== after, kitchen: scene.kitchen, frontMats: FRONT_MATS.length };\n      }\n    });\n    define(\"setOwnFinish\", {\n      history: \"cabinet finish\",\n      args: { k: \"carcass | fronts\", value: \"an Egger decor key (model/egger-decors.js)\" },\n      doc: \"\\u0421\\u0432\\u043E\\u044F \\u043E\\u0442\\u0434\\u0435\\u043B\\u043A\\u0430 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0433\\u043E \\u0448\\u043A\\u0430\\u0444\\u0430 ([data-ub-ov]/[data-ub-ovval]; 25-controls.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        const which = a.k, val = a.value;\n        if (which === \"plinth\" || which === \"plinthRef\") return setPlinth(u, which, val);\n        if (!okFinish(val)) return { ok: false, why: \"unknown finish\" };\n        if ((which === \"carcass\" ? u.ovCarcass : u.ovFronts) === val) return { ok: false, why: \"unchanged\" };\n        const flat = which === \"fronts\" && isPaintedOnly(effStyle(u, kitchenOf2(scene.kitchen)));\n        ctx.hist.run(\"cabinet finish\", () => {\n          if (which === \"carcass\") u.ovCarcass = val;\n          else u.ovFronts = val;\n          if (flat) {\n            u.ovStyle = \"slab\";\n            u.ovShaker = null;\n          }\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        if (flat) cue(JPULL_NEEDS_PAINT + \", so this cabinet's fronts are now Flat in \" + finishLabel(val));\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    function setPlinth(u, which, val) {\n      if (!hasPlinth(u)) {\n        cue(\"A wall cabinet has no plinth\");\n        return { ok: false, why: \"no plinth\" };\n      }\n      const run = plinthRunOf(scene.units, u);\n      const cur = okPlinthOv(u.ovPlinth);\n      let next;\n      if (which === \"plinthRef\") {\n        if (!cur || cur.mat !== \"mdf-paint\") return { ok: false, why: \"not a painted plinth\" };\n        next = { mat: \"mdf-paint\", paint: normPaint({ ...cur.paint, ref: val }) };\n      } else if (val === \"follow\") next = null;\n      else if (okFinish(val)) next = { mat: \"mfc\", decor: val };\n      else {\n        const m = /^paint:([a-z-]+):([a-z-]+)$/.exec(String(val || \"\"));\n        if (!m || !okPaintFinish(m[1]) || !okTone(m[2])) return { ok: false, why: \"unknown plinth material\" };\n        const ref = cur && cur.mat === \"mdf-paint\" ? cur.paint.ref : u.paint && u.frontMat === \"mdf-paint\" ? u.paint.ref : \"\";\n        next = { mat: \"mdf-paint\", paint: normPaint({ finish: m[1], tone: m[2], ref }) };\n      }\n      const same = run.every(function(v) {\n        return JSON.stringify(okPlinthOv(v.ovPlinth)) === JSON.stringify(next);\n      });\n      if (same) return { ok: false, why: \"unchanged\" };\n      ctx.hist.run(\"plinth\", () => {\n        run.forEach(function(v) {\n          if (next) v.ovPlinth = JSON.parse(JSON.stringify(next));\n          else delete v.ovPlinth;\n        });\n        resolveFinishes(scene.units, scene.kitchen);\n      });\n      cue((next ? \"Plinth set\" : \"Plinth follows the doors again\") + \" - \" + (run.length > 1 ? \"the continuous run under \" + run.length + \" cabinets\" : \"this cabinet's plinth\"));\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true, run: run.map(function(v) {\n        return v.id;\n      }) };\n    }\n    define(\"clearOwnFinish\", {\n      history: \"cabinet finish\",\n      doc: \"\\u0412\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u043C\\u0443 \\u0448\\u043A\\u0430\\u0444\\u0443 \\u043E\\u0442\\u0434\\u0435\\u043B\\u043A\\u0443 \\u043A\\u0443\\u0445\\u043D\\u0438 ([data-ub-finreset]; 25-controls.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        ctx.hist.run(\"cabinet finish\", () => {\n          u.ovCarcass = null;\n          u.ovFronts = null;\n          u.ovStyle = null;\n          u.ovShaker = null;\n          plinthRunOf(scene.units, u).forEach(function(v) {\n            delete v.ovPlinth;\n          });\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    function editFinishing(mutate, what, target, noHist) {\n      const u = target || ctx.sel();\n      if (!u) return { ok: false, why: \"nothing selected\" };\n      if (!canFinishing(u)) {\n        cue(finishingWhy(u));\n        return { ok: false, why: \"no finishing\" };\n      }\n      const before = ctx.hist.snap();\n      const zones0 = clashingIds(scene.units);\n      const snap3 = JSON.stringify(u.finishing || {});\n      const g2 = finishingOf(u);\n      if (mutate(g2) === false) return { ok: false, why: \"unchanged\" };\n      u.finishing = g2;\n      const hitWall = behindWall(u, u.x, u.z);\n      const hitUnit = scene.units.filter((v) => v.id !== u.id && sameLevel(v, u) && overlaps(u, v));\n      const zone = !hitWall && !hitUnit.length ? newClash(scene.units, zones0) : null;\n      if (hitWall || hitUnit.length || zone) {\n        u.finishing = JSON.parse(snap3);\n        const why = zone ? openingWhy(zone.zone) : hitUnit.length ? hitUnit.map((v) => displayName(scene.units, v)).join(\", \") + \" stands right there\" : \"it would go through the wall\";\n        if (!target) cue(\"No room for \" + what + \" \\u2014 \" + why + \". Nothing was moved.\");\n        if (!target) {\n          ctx.syncControls();\n          ctx.refresh();\n        }\n        return { ok: false, why: \"No room for \" + what + \" \\u2014 \" + why };\n      }\n      if (!noHist) ctx.hist.pushAfter(what || \"finishing\", before);\n      if (!target) {\n        if (what) cue(what + \" \\u2014 overall width now \" + overallWidth(u) + \" mm\");\n        ctx.syncControls();\n        ctx.refresh();\n      }\n      return { ok: true, overall: overallWidth(u) };\n    }\n    function autoDrop(u, g2) {\n      if (!g2.endL && !g2.endR && !g2.dropSet && u.family !== \"wall\") g2.endDrop = true;\n    }\n    function unitOf(a) {\n      return a && a.id ? scene.units.find((v) => v.id === a.id) || null : null;\n    }\n    define(\"toggleEndPanel\", {\n      history: \"end panel\",\n      args: { side: \"L | R\", on: \"true | false (optional, else toggles)\", id: \"unit id (optional)\" },\n      doc: \"End panel on the cabinet's left or right ([data-ub-end]; the Finishing strip); one Undo step\",\n      run(a) {\n        const side = a.side === \"R\" ? \"R\" : \"L\";\n        const target = unitOf(a);\n        const u = target || ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        const cur = finishingOf(u)[side === \"L\" ? \"endL\" : \"endR\"];\n        const on = a.on == null ? !cur : !!a.on;\n        if (on === cur) return { ok: false, why: \"unchanged\" };\n        return editFinishing((g2) => {\n          if (on) autoDrop(u, g2);\n          if (side === \"L\") g2.endL = on;\n          else g2.endR = on;\n        }, (on ? \"\" : \"no \") + (side === \"L\" ? \"left\" : \"right\") + \" end panel\", target);\n      }\n    });\n    define(\"setEndDrop\", {\n      history: \"end panel height\",\n      args: { down: \"true \\u2014 to the floor, false \\u2014 carcass height\" },\n      doc: \"End panel height ([data-ub-enddrop]); a deliberate choice (dropSet), kept; one Undo step\",\n      run(a) {\n        const want = !!a.down;\n        const u = ctx.sel();\n        if (u && u.type === \"island\") {\n          if (!!u.skinDrop === want) return { ok: false, why: \"unchanged\" };\n          ctx.hist.run(\"island panels height\", () => {\n            u.skinDrop = want;\n          });\n          cue(want ? \"Island end panels and back down to the floor - the legs are hidden\" : \"Island end panels and back at carcass height - the legs show below\");\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: true };\n        }\n        if (u && u.family === \"wall\") {\n          cue(\"A wall unit has no legs, so its end panel is always carcass height\");\n          return { ok: false, why: \"wall unit\" };\n        }\n        return editFinishing((g2) => {\n          if (g2.endDrop === want && g2.dropSet) return false;\n          g2.endDrop = want;\n          g2.dropSet = true;\n        }, want ? \"end panel down to the floor\" : \"end panel at carcass height\");\n      }\n    });\n    define(\"setEndMat\", {\n      history: \"end panel material\",\n      args: { value: \"fronts | carcass | an Egger decor key\" },\n      doc: \"End panel material: match the fronts (default), the carcass, or a contrast Egger decor; one Undo step\",\n      run(a) {\n        const v = String(a.value || \"\");\n        const m = v === \"fronts\" || v === \"carcass\" ? v : okFinish(v) ? \"decor:\" + v : null;\n        if (!m) return { ok: false, why: \"unknown end panel material\" };\n        return editFinishing((g2) => {\n          const cur = g2.mat || \"fronts\";\n          if (cur === m) return false;\n          if (m === \"fronts\") delete g2.mat;\n          else g2.mat = m;\n        }, m === \"fronts\" ? \"end panels match the fronts\" : m === \"carcass\" ? \"end panels in the carcass board\" : \"end panels in \" + finishLabel(m.slice(6)));\n      }\n    });\n    define(\"finishExposedEnds\", {\n      history: \"end panels\",\n      args: {},\n      doc: \"An end panel on every fully exposed run end of the plan (geometry, not list order); one Undo step\",\n      run() {\n        const list = openRunEnds(scene.units);\n        if (!list.length) {\n          cue(\"No exposed run ends without an end panel\");\n          return { ok: false, why: \"none\", added: 0 };\n        }\n        const before = ctx.hist.snap();\n        let added = 0;\n        const skipped = [];\n        list.forEach((e) => {\n          const u = scene.units.find((v) => v.id === e.id);\n          if (e.side === \"island\") {\n            u.skinDrop = true;\n            added++;\n            return;\n          }\n          const r = editFinishingQuiet(u, e.side);\n          if (r.ok) added++;\n          else skipped.push(displayName(scene.units, u) + \" \" + (e.side === \"L\" ? \"left\" : \"right\") + \": \" + r.why);\n        });\n        ctx.hist.pushAfter(\"end panels\", before);\n        cue(added ? \"End panels added to \" + added + \" exposed end\" + (added === 1 ? \"\" : \"s\") + (skipped.length ? \" \\u2014 not \" + skipped.length + \" (no room)\" : \"\") : \"No room for an end panel at the exposed ends\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: added > 0, added, skipped };\n      }\n    });\n    function editFinishingQuiet(u, side) {\n      return editFinishing((g2) => {\n        autoDrop(u, g2);\n        if (side === \"L\") g2.endL = true;\n        else g2.endR = true;\n      }, (side === \"L\" ? \"left\" : \"right\") + \" end panel\", u, true);\n    }\n    define(\"setScribe\", {\n      history: \"scribe\",\n      args: { side: \"L | R\", value: \"the field's text, mm\" },\n      doc: \"Scribe filler strip on the left or right ([data-ub-scribe] change/blur); one Undo step\",\n      run(a) {\n        const side = a.side;\n        return editFinishing((g2) => {\n          const want = parseInt(a.value, 10);\n          if (!isFinite(want)) return false;\n          let v = clamp4(Math.round(want), 0, FINISH_KIT.scribe.max);\n          if (v !== want) cue(\"A scribe is 0\\u2013\" + FINISH_KIT.scribe.max + \" mm \\u2014 using \" + v + \" mm\");\n          if (v > 0 && v < FINISH_KIT.scribe.min) v = FINISH_KIT.scribe.min;\n          const key = side === \"L\" ? \"scribeL\" : \"scribeR\";\n          if (g2[key] === v) return false;\n          g2[key] = v;\n        }, (side === \"L\" ? \"left\" : \"right\") + \" scribe\");\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-plan.js\n  function installPlanCommands(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    define(\"toggleSnap\", {\n      history: null,\n      doc: \"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0432\\u044B\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u043F\\u0440\\u0438\\u0432\\u044F\\u0437\\u043A\\u0443 \\u043A \\u0441\\u043E\\u0441\\u0435\\u0434\\u044F\\u043C ([data-ub-snap]; 28-zoom-modes-save.js)\",\n      run() {\n        scene.snap = !scene.snap;\n        ctx.syncControls();\n        return { ok: true, on: scene.snap };\n      }\n    });\n    define(\"toggleFrontsSeeThrough\", {\n      history: null,\n      doc: \"\\u041F\\u0440\\u043E\\u0437\\u0440\\u0430\\u0447\\u043D\\u044B\\u0435 \\u0444\\u0430\\u0441\\u0430\\u0434\\u044B: \\u0432\\u0441\\u0435 \\u0434\\u0432\\u0435\\u0440\\u0438 \\u0438 \\u044F\\u0449\\u0438\\u043A\\u0438 \\u043F\\u043E\\u043B\\u0443\\u043F\\u0440\\u043E\\u0437\\u0440\\u0430\\u0447\\u043D\\u044B, \\u043A\\u043E\\u0440\\u043F\\u0443\\u0441\\u0430 \\u043D\\u0435\\u043F\\u0440\\u043E\\u0437\\u0440\\u0430\\u0447\\u043D\\u044B ([data-ub-frontsee], \\u043C\\u0435\\u043D\\u044E \\u0432\\u0438\\u0434\\u0430)\",\n      run() {\n        scene.frontsSeeThrough = !scene.frontsSeeThrough;\n        cue(scene.frontsSeeThrough ? \"Transparent fronts: on - doors and drawers are see-through\" : \"Transparent fronts: off\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, on: !!scene.frontsSeeThrough };\n      }\n    });\n    define(\"toggleAllDims\", {\n      history: null,\n      doc: \"All dimensions: W / H / D of every cabinet drawn as a drawing ([data-ub-alldims], View menu)\",\n      run() {\n        scene.allDims = !scene.allDims;\n        cue(scene.allDims ? \"All dimensions: on - every cabinet's width, height and depth\" : \"All dimensions: off - the selected cabinet's only\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, on: !!scene.allDims };\n      }\n    });\n    define(\"setEnvironment\", {\n      history: null,\n      doc: \"\\u041E\\u043A\\u0440\\u0443\\u0436\\u0435\\u043D\\u0438\\u0435 \\u0437\\u0430 \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u043E\\u0439: Neutral (\\u0441\\u0435\\u0440\\u044B\\u0439 \\u0444\\u043E\\u043D) \\u0438\\u043B\\u0438 Universe (\\u043A\\u043E\\u0441\\u043C\\u043E\\u0441) ([data-ub-env], \\u043C\\u0435\\u043D\\u044E \\u0432\\u0438\\u0434\\u0430)\",\n      run(a) {\n        const name2 = envName(a && a.name);\n        if (name2 === envName(scene.environment)) {\n          ctx.syncControls();\n          return { ok: true, name: name2, unchanged: true };\n        }\n        scene.environment = name2;\n        scene.envLoading = name2 === \"universe\";\n        try {\n          const s = ctx.opts.storage && ctx.opts.storage();\n          if (s) s.setItem(ENV_PREF_KEY, name2);\n        } catch {\n        }\n        cue(name2 === \"universe\" ? \"Environment: Universe - loading the sky\\u2026\" : \"Environment: Neutral\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, name: name2 };\n      }\n    });\n    define(\"setGraphics\", {\n      history: null,\n      doc: \"\\u041A\\u0430\\u0447\\u0435\\u0441\\u0442\\u0432\\u043E \\u043A\\u0430\\u0440\\u0442\\u0438\\u043D\\u043A\\u0438 3D: Fast, Balanced \\u0438\\u043B\\u0438 Sharp ([data-ub-gfx], \\u043C\\u0435\\u043D\\u044E \\u0432\\u0438\\u0434\\u0430)\",\n      run(a) {\n        const name2 = tierName(a && a.name);\n        if (name2 === tierName(scene.graphics)) {\n          ctx.syncControls();\n          return { ok: true, name: name2, unchanged: true };\n        }\n        scene.graphics = name2;\n        cue(name2 === \"low\" ? \"Picture: Fast - the lightest 3D view, no shadows or reflections\" : name2 === \"high\" ? \"Picture: Sharp - smoother edges and finer textures; it steps back by itself if this device is slow\" : \"Picture: Balanced - the standard 3D view\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, name: name2 };\n      }\n    });\n    define(\"toggleAlignView\", {\n      history: null,\n      doc: \"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0432\\u044B\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u043D\\u0430\\u043F\\u0440\\u0430\\u0432\\u043B\\u044F\\u044E\\u0449\\u0438\\u0435 \\u0432\\u044B\\u0440\\u0430\\u0432\\u043D\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F ([data-ub-alignview]; 28-zoom-modes-save.js)\",\n      run() {\n        scene.alignView = !scene.alignView;\n        scene.cues = ctx.alignVisible() ? alignGroups(scene.units, ctx.sel(), null) : null;\n        if (!scene.alignView) cue(null);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, on: scene.alignView };\n      }\n    });\n    define(\"toggleHinge\", {\n      history: null,\n      doc: \"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0441\\u043A\\u0440\\u044B\\u0442\\u044C \\u043F\\u0435\\u0442\\u043B\\u0438 ([data-ub-hinge]; 28-zoom-modes-save.js)\",\n      run() {\n        scene.hinge = !scene.hinge;\n        ctx.refresh();\n        return { ok: true, on: scene.hinge };\n      }\n    });\n    define(\"toggleHingeZoom\", {\n      history: null,\n      doc: \"\\u041A\\u0440\\u0443\\u043F\\u043D\\u044B\\u0439 \\u043F\\u043B\\u0430\\u043D \\u043F\\u0435\\u0442\\u043B\\u0438 \\u0438\\u043B\\u0438 \\u0432\\u0441\\u044F \\u043A\\u0443\\u0445\\u043D\\u044F ([data-ub-hingezoom]; 28-zoom-modes-save.js)\",\n      run() {\n        const u = ctx.sel();\n        if (!u.door) return { ok: false, why: \"no door\" };\n        scene.hingeZoom = !scene.hingeZoom;\n        ctx.syncControls();\n        ctx.frame();\n        return { ok: true, on: scene.hingeZoom };\n      }\n    });\n    function applyExplode(pct0) {\n      const pct = Math.max(0, Math.min(100, Math.round(pct0) || 0));\n      scene.explode = pct / 100;\n      for (const u of scene.units) u.explode = scene.explode;\n      ctx.refresh();\n      return pct;\n    }\n    define(\"setExplode\", {\n      history: null,\n      args: { pct: \"0\\u2026100 (\\u0441\\u0442\\u0440\\u043E\\u043A\\u0430 \\u0438\\u043B\\u0438 \\u0447\\u0438\\u0441\\u043B\\u043E)\" },\n      doc: \"\\u0420\\u0430\\u0437\\u043D\\u0435\\u0441\\u0451\\u043D\\u043D\\u044B\\u0439 \\u0432\\u0438\\u0434, 0 \\u2014 \\u0441\\u043E\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 ([data-ub-explode] input/change; 28-zoom-modes-save.js applyExplode)\",\n      run(a) {\n        return { ok: true, pct: applyExplode(parseFloat(a.pct)) };\n      }\n    });\n    ctx.explodeText = function explodeText(pct) {\n      return pct <= 0 ? \"Assembled\" : pct >= 100 ? \"Maximum\" : pct + \"%\";\n    };\n    define(\"save\", {\n      history: null,\n      doc: \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C \\u043F\\u043B\\u0430\\u043D \\u0432 \\u044D\\u0442\\u043E\\u043C \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440\\u0435 ([data-ub-save]; 28-zoom-modes-save.js)\",\n      run() {\n        if (!ctx.persist.store()) {\n          cue(\"This browser will not let the planner save \\u2014 try turning off private browsing\");\n          return { ok: false, why: \"no storage\" };\n        }\n        if (!ctx.persist.saveState()) {\n          cue(\"The plan could not be saved in this browser\");\n          return { ok: false, why: \"failed\" };\n        }\n        cue(\"Plan saved in this browser \\u2014 Restore brings it back on this device\");\n        return { ok: true };\n      }\n    });\n    define(\"restore\", {\n      history: null,\n      doc: \"\\u0412\\u043E\\u0441\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u0438\\u0442\\u044C \\u0441\\u043E\\u0445\\u0440\\u0430\\u043D\\u0451\\u043D\\u043D\\u044B\\u0439 \\u043F\\u043B\\u0430\\u043D ([data-ub-restore]; 28-zoom-modes-save.js)\",\n      run() {\n        if (!ctx.persist.savedStamp()) {\n          cue(\"There is no saved plan in this browser yet\");\n          return { ok: false, why: \"nothing saved\" };\n        }\n        if (!ctx.persist.loadState()) {\n          cue(\"That saved plan could not be read \\u2014 nothing changed\");\n          return { ok: false, why: \"unreadable\" };\n        }\n        scene.explode = 0;\n        scene.hinge = false;\n        scene.hingeZoom = false;\n        scene.cues = null;\n        scene.alignTemp = false;\n        ctx.view.refit();\n        cue(\"Saved plan restored\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    function afterOpen(msg) {\n      ctx.hist.clear();\n      st.gapUndo = null;\n      scene.explode = 0;\n      scene.hinge = false;\n      scene.hingeZoom = false;\n      scene.cues = null;\n      scene.alignTemp = false;\n      if (scene.workshop) ctx.view.fitKitchen(true);\n      else ctx.view.refit();\n      if (msg) cue(msg);\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    define(\"selectWorkshopPart\", { history: null, doc: \"Select one native workshop panel\", run(a) {\n      if (!scene.workshop) return { ok: false, why: \"not a workshop construction\" };\n      const part = cabinetParts(ctx.sel()).find((p) => p.pid === a.pid);\n      if (!part) return { ok: false, why: \"panel not found\" };\n      scene.selPart = part.pid;\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true };\n    } });\n    define(\"openPlan\", {\n      history: null,\n      args: { plan: \"\\u043F\\u043B\\u0430\\u043D \\u0444\\u043E\\u0440\\u043C\\u0430\\u0442\\u0430 Save plan\", meta: \"{ token, serverRev, reason }\" },\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u043F\\u043B\\u0430\\u043D \\u043F\\u043E \\u0441\\u0441\\u044B\\u043B\\u043A\\u0435 ?plan= \\u0438\\u043B\\u0438 \\u0438\\u0437 \\u0430\\u043A\\u043A\\u0430\\u0443\\u043D\\u0442\\u0430; \\u0442\\u0435\\u043A\\u0443\\u0449\\u0438\\u0439 \\u043F\\u043B\\u0430\\u043D \\u043E\\u0441\\u0442\\u0430\\u0451\\u0442\\u0441\\u044F \\u0432 \\u044D\\u0442\\u043E\\u043C \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440\\u0435 (persist.js recovery)\",\n      run(a) {\n        const r = ctx.persist.recovery.openPlan(a.plan, a.meta || {});\n        if (!r.ok) {\n          cue(\"That saved plan could not be opened \\u2014 nothing changed\");\n          return { ok: false, why: r.why };\n        }\n        afterOpen(a.cue || null);\n        return r;\n      }\n    });\n    define(\"switchPlan\", {\n      history: null,\n      args: { id: \"planId \\u0434\\u0440\\u0443\\u0433\\u043E\\u0433\\u043E \\u043F\\u043B\\u0430\\u043D\\u0430 \\u044D\\u0442\\u043E\\u0433\\u043E \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440\\u0430\" },\n      doc: \"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u0434\\u0440\\u0443\\u0433\\u043E\\u0439 \\u043F\\u043B\\u0430\\u043D, \\u0441\\u043E\\u0445\\u0440\\u0430\\u043D\\u0451\\u043D\\u043D\\u044B\\u0439 \\u0432 \\u044D\\u0442\\u043E\\u043C \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440\\u0435 (persist.js recovery.others)\",\n      run(a) {\n        const r = ctx.persist.recovery.switchTo(a.id);\n        if (!r.ok) {\n          cue(\"That plan could not be opened \\u2014 nothing changed\");\n          return { ok: false, why: r.why };\n        }\n        afterOpen(\"Your other plan is open \\u2014 the one before is kept in this browser\");\n        return r;\n      }\n    });\n    function gapSnapshot() {\n      return scene.units.map((v) => ({ u: v, x: v.x, z: v.z, w: v.w }));\n    }\n    function gapRestore(snap3) {\n      if (!snap3) return false;\n      for (const s of snap3) {\n        s.u.x = s.x;\n        s.u.z = s.z;\n        s.u.w = s.w;\n      }\n      return true;\n    }\n    function gapDir() {\n      return st.gapPick || null;\n    }\n    define(\"gapPick\", {\n      history: null,\n      args: { dir: \"lo | hi\" },\n      doc: \"\\u0412\\u044B\\u0431\\u0440\\u0430\\u0442\\u044C \\u043A\\u043E\\u043D\\u0435\\u0446 \\u0441\\u0442\\u0435\\u043D\\u044B \\u0434\\u043B\\u044F \\xABFill a gap\\xBB ([data-ub-gapdir]; 28-zoom-modes-save.js)\",\n      run(a) {\n        st.gapPick = a.dir;\n        ctx.syncGapPick();\n        ctx.refresh();\n        return { ok: true, dir: st.gapPick };\n      }\n    });\n    const GAP_LABEL = { extend: \"extend cabinet\", share: \"share across run\" };\n    define(\"gapFill\", {\n      history: \"extend cabinet | share across run\",\n      args: { mode: \"extend \\u2014 \\u0440\\u0430\\u0441\\u0448\\u0438\\u0440\\u0438\\u0442\\u044C \\u044D\\u0442\\u043E\\u0442 \\u0448\\u043A\\u0430\\u0444 | share \\u2014 \\u0440\\u0430\\u0437\\u0434\\u0430\\u0442\\u044C \\u043F\\u043E \\u0440\\u044F\\u0434\\u0443\" },\n      doc: \"\\u0417\\u0430\\u043F\\u043E\\u043B\\u043D\\u0438\\u0442\\u044C \\u0441\\u0432\\u043E\\u0431\\u043E\\u0434\\u043D\\u043E\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E \\u0443 \\u0441\\u0442\\u0435\\u043D\\u044B ([data-ub-gapfill]; 28-zoom-modes-save.js)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"nothing selected\" };\n        const off = gapOffer(scene.units, u);\n        if (!off.ok) {\n          cue(off.why);\n          ctx.syncGapPick();\n          return { ok: false, why: off.why };\n        }\n        const dir = gapDir() || off.dir;\n        if (!dir) {\n          cue(\"Choose which end of the wall to fill first\");\n          ctx.syncGapPick();\n          return { ok: false, why: \"no end\" };\n        }\n        const mode = a.mode;\n        const before = ctx.hist.snap();\n        const snap3 = gapSnapshot();\n        const r = mode === \"share\" ? gapFillShare(scene.units, u, dir) : gapFillExtend(scene.units, u, dir);\n        if (!r.ok) {\n          gapRestore(snap3);\n          cue(r.why || \"That gap could not be filled\");\n          ctx.syncGapPick();\n          ctx.syncControls();\n          ctx.refresh();\n          return { ok: false, why: r.why };\n        }\n        st.gapUndo = ctx.hist.pushAfter(GAP_LABEL[mode === \"share\" ? \"share\" : \"extend\"], before) ? GAP_LABEL[mode === \"share\" ? \"share\" : \"extend\"] : null;\n        if (mode === \"share\") {\n          const parts = r.each.filter((e) => Math.abs(e.now - e.was) > 0.5).map((e) => e.was + \"->\" + e.now).join(\", \");\n          cue(\"Shared \" + r.added + \" mm across \" + r.count + \" cabinet\" + (r.count === 1 ? \"\" : \"s\") + \": \" + parts + \" mm\" + (r.leftOver > 1 ? \" (\" + r.leftOver + \" mm could not be used - maximum widths)\" : \"\"));\n        } else {\n          cue(\"Extended from \" + r.was + \" to \" + r.now + \" mm (+\" + r.added + \" mm)\" + (r.leftOver > 1 ? \" - \" + r.leftOver + \" mm left, maximum width reached\" : \"\"));\n        }\n        ctx.syncGapPick();\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    define(\"gapUndo\", {\n      history: \"(the fill's own Undo entry)\",\n      doc: \"\\u0412\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u0440\\u0430\\u0441\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043A\\u0443 \\u0434\\u043E \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0435\\u0433\\u043E \\xABFill a gap\\xBB ([data-ub-gapundo]; 28-zoom-modes-save.js)\",\n      run() {\n        const lab = st.gapUndo;\n        st.gapUndo = null;\n        if (!lab || ctx.hist.undoLabel() !== lab) {\n          ctx.syncGapPick();\n          ctx.syncControls();\n          return { ok: false, why: \"nothing to put back\" };\n        }\n        ctx.hist.undo();\n        cue(\"Put back as it was\");\n        ctx.syncGapPick();\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n    define(\"toggleDragLog\", {\n      history: null,\n      doc: \"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0438\\u043B\\u0438 \\u0432\\u044B\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0436\\u0443\\u0440\\u043D\\u0430\\u043B \\u043F\\u0435\\u0440\\u0435\\u0442\\u0430\\u0441\\u043A\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F ([data-ub-draglogtoggle]; 28-zoom-modes-save.js)\",\n      run() {\n        const on = ctx.pointer.toggleDragLog();\n        cue(on ? \"Drag log on - it records what each drag frame did, and changes nothing\" : \"Drag log off\");\n        return { ok: true, on };\n      }\n    });\n    define(\"copyDragLog\", {\n      history: null,\n      doc: \"\\u0422\\u0435\\u043A\\u0441\\u0442 \\u0436\\u0443\\u0440\\u043D\\u0430\\u043B\\u0430 \\u043F\\u0435\\u0440\\u0435\\u0442\\u0430\\u0441\\u043A\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F \\u0434\\u043B\\u044F \\u0431\\u0443\\u0444\\u0435\\u0440\\u0430 \\u043E\\u0431\\u043C\\u0435\\u043D\\u0430 ([data-ub-draglogcopy]; 28-zoom-modes-save.js); \\u0437\\u0430\\u043F\\u0438\\u0441\\u044C \\u0432 \\u0431\\u0443\\u0444\\u0435\\u0440 \\u2014 \\u0438\\u043D\\u0442\\u0435\\u0440\\u0444\\u0435\\u0439\\u0441\",\n      run() {\n        const log = ctx.pointer.dragLog();\n        const txt = log.map((q) => {\n          const bits = [];\n          for (const k of Object.keys(q)) if (k !== \"tag\" && k !== \"f\") bits.push(k + \"=\" + q[k]);\n          return q.f + \" \" + q.tag + \" \" + bits.join(\" \");\n        }).join(\"\\n\");\n        cue(\"Drag log copied - \" + log.length + \" frames\");\n        return { ok: true, text: txt };\n      }\n    });\n    define(\"reset\", {\n      history: null,\n      doc: \"\\u041D\\u0430\\u0447\\u0430\\u0442\\u044C \\u043F\\u043B\\u0430\\u043D \\u0437\\u0430\\u043D\\u043E\\u0432\\u043E: \\u0441\\u0442\\u0430\\u0440\\u0442\\u043E\\u0432\\u044B\\u0435 \\u0448\\u043A\\u0430\\u0444\\u044B, \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u0430 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E, \\u0432\\u0438\\u0434 \\u0441\\u043F\\u0435\\u0440\\u0435\\u0434\\u0438 ([data-ub-reset]; 28-zoom-modes-save.js)\",\n      run() {\n        ctx.persist.initialScene();\n        scene.explode = 0;\n        scene.hinge = false;\n        scene.hingeZoom = false;\n        try {\n          const st2 = ctx.persist.store();\n          if (st2) st2.removeItem(PROJECT_KEY);\n        } catch {\n        }\n        scene.moveMode = false;\n        scene.panMode = false;\n        scene.sizeMode = false;\n        scene.panX = 0;\n        scene.panY = 0;\n        scene.pivot = null;\n        scene.cues = null;\n        scene.snap = true;\n        scene.zoom = 1;\n        scene.alignView = false;\n        scene.alignTemp = false;\n        scene.activeRun = \"main\";\n        scene.room = { on: true, width: ROOM_DEFAULT.width, depth: ROOM_DEFAULT.depth, height: ROOM_DEFAULT.height };\n        scene.cornerTarget = null;\n        ctx.view.releaseCamera();\n        scene.yaw = DEFAULTS.yaw;\n        scene.pitch = DEFAULTS.pitch;\n        ctx.settle();\n        if (ctx.persist.recovery) ctx.persist.recovery.forget();\n        cue(null);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-drawer-box.js\n  var BOX_HISTORY = \"drawer box height\";\n  function installDrawerBoxCommands(ctx) {\n    const scene = ctx.scene;\n    const define = ctx.commands.define;\n    const cue = ctx.cue;\n    let dragging = false, before = null, dragLabel = BOX_HISTORY;\n    function endDrag() {\n      if (!dragging) return false;\n      dragging = false;\n      const b0 = before;\n      before = null;\n      return ctx.hist.pushAfter(dragLabel, b0);\n    }\n    function done2() {\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function pick(a) {\n      const u = ctx.sel();\n      if (!u) return { why: \"Select a cabinet first\" };\n      if (!hasDrawerBoxes(u)) return { why: \"This cabinet has no drawers - add one with Drawers\" };\n      const list = drawerBoxes(u);\n      const asked = a && a.i != null ? Number(a.i) : scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.i : null;\n      const b = asked == null ? list[0] : boxOf2(list, asked);\n      if (!b) return { why: \"No such drawer\" };\n      return { u, list, i: b.i, b };\n    }\n    define(\"selectDrawerBox\", {\n      history: null,\n      args: { i: \"drawer index, 0 = top\", part: \"optional: box | front - which part its handles edit\" },\n      doc: \"Choose which drawer of the selected cabinet its handles and numbers edit, and its part (view state, not saved)\",\n      run(a) {\n        const p = pick(a);\n        if (p.why) return { ok: false, why: p.why };\n        const prev = scene.drawerBox, same = !!(prev && prev.id === p.u.id && prev.i === p.i);\n        const part = a && (a.part === \"box\" || a.part === \"front\") ? a.part : same && prev.part === \"box\" ? \"box\" : \"front\";\n        scene.drawerBox = { ...prev || {}, id: p.u.id, i: p.i, part };\n        ctx.frame();\n        return { ok: true, i: p.i, h: p.b.mm, max: p.b.maxMm };\n      }\n    });\n    define(\"setDrawerBoxH\", {\n      history: BOX_HISTORY,\n      args: { i: \"drawer index, 0 = top\", h: \"box height mm\", live: \"true while dragging\" },\n      doc: \"Drawer box height of the selected cabinet, independent of the front; fits the space up to the rails / the drawer above; one Undo (a drag: one Undo for the whole drag)\",\n      run(a) {\n        const p = pick(a);\n        if (p.why) {\n          cue(p.why);\n          return { ok: false, why: p.why };\n        }\n        const h = Number(a && a.h);\n        if (!(h > 0) || !isFinite(h)) {\n          const why = \"Type the box height in mm\";\n          cue(why);\n          return { ok: false, why };\n        }\n        scene.drawerBox = { ...scene.drawerBox || {}, id: p.u.id, i: p.i, part: \"front\" };\n        let r;\n        if (a.live) {\n          if (!dragging) {\n            before = ctx.hist.snap();\n            dragging = true;\n            dragLabel = BOX_HISTORY;\n          }\n          r = setDrawerBoxH(p.u, p.i, h);\n        } else {\n          endDrag();\n          r = ctx.hist.run(BOX_HISTORY, () => setDrawerBoxH(p.u, p.i, h));\n        }\n        if (!r) return { ok: false, why: \"No such drawer\" };\n        const name2 = p.b.name.replace(/ box$/, \"\");\n        if (!a.live || r.clamped) {\n          cue(r.clamped ? r.asked > r.max ? name2 + \" box: \" + Math.round(r.h) + \" mm - that is all the room \" + (p.i === 0 ? \"under the top\" : \"under the drawer above\") + \" (asked for \" + Math.round(r.asked) + \" mm)\" : name2 + \" box: \" + Math.round(r.h) + \" mm - the least a box can be built at\" : name2 + \" box: \" + Math.round(r.h) + \" mm high (front unchanged)\");\n        }\n        if (a.live) ctx.frame();\n        else done2();\n        return { ok: true, i: p.i, h: r.h, max: r.max, clamped: r.clamped };\n      }\n    });\n    define(\"setDrawerHeight\", {\n      history: \"drawer height\",\n      args: { i: \"drawer index, 0 = top\", h: \"drawer (front) height mm\", live: \"true while dragging\", edge: \"top | bottom (optional)\" },\n      doc: \"Drawer height of the selected cabinet: the front AND its box together, the box keeping its place under the front; up to what physically fits; one Undo (a drag: one Undo for the whole drag)\",\n      run(a) {\n        const p = pick(a);\n        if (p.why) {\n          cue(p.why);\n          return { ok: false, why: p.why };\n        }\n        const h = Number(a && a.h);\n        if (!(h > 0) || !isFinite(h)) {\n          const why = \"Type the drawer height in mm\";\n          cue(why);\n          return { ok: false, why };\n        }\n        scene.drawerBox = { ...scene.drawerBox || {}, id: p.u.id, i: p.i, part: \"front\" };\n        const edge = a.edge === \"top\" || a.edge === \"bottom\" ? a.edge : void 0;\n        let r;\n        if (a.live) {\n          if (!dragging) {\n            before = ctx.hist.snap();\n            dragging = true;\n            dragLabel = \"drawer height\";\n          }\n          r = setDrawerHeight2(p.u, p.i, h, edge);\n        } else {\n          endDrag();\n          r = ctx.hist.run(\"drawer height\", () => setDrawerHeight2(p.u, p.i, h, edge));\n        }\n        if (!r || !r.ok) {\n          const why = r && r.why || \"No such drawer\";\n          cue(why);\n          if (!a.live) done2();\n          return { ok: false, why };\n        }\n        const name2 = p.b.name.replace(/ box$/, \"\");\n        if (!a.live || r.clamped) {\n          cue(name2 + \": \" + r.fh + \" mm high, box \" + r.box + \" mm\" + (r.clamped ? \" - as near to \" + r.asked + \" mm as fits\" + (r.why ? \" (\" + r.why + \")\" : \"\") : \"\") + (r.giver != null ? boxOf2(drawerBoxes(p.u), r.giver) ? \" - the \" + (((boxOf2(drawerBoxes(p.u), r.giver) || {}).fy0 || 0) > ((boxOf2(drawerBoxes(p.u), p.i) || {}).fy0 || 0) ? \"drawer above\" : \"drawer below\") + \" gave way\" : \" - the open slot beside it gave way\" : \"\") + (r.giverDoor ? \" - the door gave way\" : \"\") + (p.u.type === \"base-drawer\" && p.b.xn == null ? \" - the door under it is \" + Math.round(drawerParts(p.u).doorH) + \" mm\" : \"\"));\n        }\n        if (a.live) ctx.frame();\n        else done2();\n        return { ok: true, i: p.i, fh: r.fh, box: r.box, clamped: r.clamped, edge: r.edge };\n      }\n    });\n    define(\"moveSeam\", {\n      history: \"move joint\",\n      args: { key: \"the joint (frontSeams key)\", y: \"mm above the cabinet bottom\", live: \"true while dragging\" },\n      doc: \"Move the joint between two fronts of the selected cabinet (drawer / drawer or drawer / door) up or down: one grows by what the other loses, the boxes follow, the reveal stays; up to what physically fits; one Undo (a drag: one for the whole drag)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        const key = String(a && a.key || \"\");\n        const s = frontSeams(u).find((q) => q.key === key);\n        if (!s) {\n          const why = \"That joint between the fronts is not there any more\";\n          cue(why);\n          return { ok: false, why };\n        }\n        const y = Number(a && a.y);\n        if (!isFinite(y) || a.y === \"\" || a.y == null) {\n          const why = \"Say where the joint goes, in mm\";\n          cue(why);\n          return { ok: false, why };\n        }\n        let r;\n        if (a.live) {\n          if (!dragging) {\n            before = ctx.hist.snap();\n            dragging = true;\n            dragLabel = \"move joint\";\n          }\n          r = moveSeam(u, key, y);\n        } else {\n          endDrag();\n          r = ctx.hist.run(\"move joint\", () => moveSeam(u, key, y));\n        }\n        if (!r || !r.ok) {\n          const why = r && r.why || \"That joint does not move\";\n          cue(why);\n          if (!a.live) done2();\n          return { ok: false, why };\n        }\n        const dr = s.b.kind === \"drawer\" ? s.b : s.a.kind === \"drawer\" ? s.a : null;\n        const keep = scene.drawerBox && scene.drawerBox.id === u.id && [s.a, s.b].some((q) => q.kind === \"drawer\" && q.i === scene.drawerBox.i);\n        if (dr && !keep) scene.drawerBox = { id: u.id, i: dr.i };\n        if (!a.live || r.clamped)\n          cue(r.a.name + \" \" + Math.round(r.a.fh) + \" mm, \" + r.b.name + \" \" + Math.round(r.b.fh) + \" mm\" + (r.clamped ? \" - as far as it goes\" + (r.why ? \" (\" + r.why + \")\" : \"\") : \"\"));\n        if (a.live) ctx.frame();\n        else done2();\n        return r;\n      }\n    });\n    define(\"drawerGeometry\", {\n      history: null,\n      args: { id: \"cabinet id (default: the selected one)\" },\n      doc: \"Read only: the built drawer fronts, drawer boxes and doors of a cabinet (top first), and its drawers' linked heights\",\n      run(a) {\n        const u = (a && a.id != null ? (scene.units || []).find((v) => v.id === a.id) : ctx.sel()) || null;\n        if (!u) return { ok: false, why: \"No such cabinet\" };\n        const r111 = (v) => Math.round(v * 10) / 10;\n        const of = (k) => cabinetParts(u).filter((q) => q.kind === k).sort((p, q) => q.local.y1 - p.local.y1).map((q) => ({ name: q.name, y0: r111(q.local.y0), y1: r111(q.local.y1), h: r111(q.local.y1 - q.local.y0) }));\n        return {\n          ok: true,\n          id: u.id,\n          fronts: of(\"drawer-front\"),\n          boxes: of(\"drawer-box\"),\n          doors: of(\"door\"),\n          drawers: drawerBoxes(u).map((b) => ({\n            i: b.i,\n            xn: b.xn == null ? null : b.xn,\n            name: b.name.replace(/ box$/, \"\"),\n            fh: r111(b.fy1 - b.fy0),\n            fy0: r111(b.fy0),\n            box: b.mm,\n            by0: r111(b.by0)\n          })),\n          seams: frontSeams(u).map((s) => ({ key: s.key, y: r111(s.y), a: s.a.name, b: s.b.name, ah: r111(s.a.y1 - s.a.y0), bh: r111(s.b.y1 - s.b.y0) }))\n        };\n      }\n    });\n    define(\"drawerBoxDone\", {\n      history: null,\n      args: {},\n      doc: \"End a drawer box height drag: the drag becomes one Undo step (none if nothing changed)\",\n      run() {\n        if (!dragging) return { ok: true, changed: false };\n        const changed = endDrag();\n        done2();\n        return { ok: true, changed };\n      }\n    });\n    define(\"drawerDragCancel\", {\n      history: null,\n      args: {},\n      doc: \"Cancel a drawer drag (box height or position): back to how it was before the press, no Undo step\",\n      run() {\n        if (!dragging) return { ok: true, cancelled: false };\n        const b0 = before;\n        dragging = false;\n        before = null;\n        if (b0 != null) ctx.hist.restore(b0);\n        cue(\"Drag cancelled\");\n        done2();\n        return { ok: true, cancelled: true };\n      }\n    });\n    function selectAdded(u, n) {\n      const b = drawerBoxes(u).find((x) => x.xn === n);\n      if (b) scene.drawerBox = { id: u.id, i: b.i };\n    }\n    function doorWords(u) {\n      const band = doorBand(u);\n      if (!u.door || !band) return \"\";\n      if (band.none) return \" - the drawer fronts cover the whole face, no door\";\n      const ex = band.extra || [];\n      return \" - the door is now \" + Math.round(band.y1 - band.y0) + \" mm high\" + (ex.length ? \", with \" + (ex.length === 1 ? \"a door strip of \" + Math.round(ex[0].y1 - ex[0].y0) + \" mm\" : ex.length + \" door strips\") + \" beside the drawers\" : \"\");\n    }\n    define(\"addDrawer\", {\n      history: \"add drawer\",\n      args: { band: \"section level (optional)\", col: \"section across (optional)\", y: \"front bottom mm (optional)\", fh: \"front height mm (optional)\" },\n      doc: \"Add one drawer box (with its front unless the cabinet is a carcass only) to the selected base cabinet, in a section with room - under the drawers already there; the door shortens to the rest of the face; one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        const why0 = addDrawersWhy(u);\n        if (why0) {\n          cue(why0);\n          done2();\n          return { ok: false, why: why0 };\n        }\n        endDrag();\n        const r = ctx.hist.run(\"add drawer\", () => addDrawer(u, a || {}));\n        if (!r.ok) {\n          cue(r.why);\n          done2();\n          return r;\n        }\n        selectAdded(u, r.n);\n        if (scene.selPart && !partById(u, scene.selPart)) scene.selPart = null;\n        cue(r.name + \" added\" + (r.section !== \"the cabinet\" ? \" in the \" + r.section : \"\") + \": front \" + r.fh + \" mm at \" + r.y + \" mm, box \" + r.box + \" mm\" + (r.frontless ? \" - no front (carcass only: fit fronts later with Fronts)\" : doorWords(u)));\n        done2();\n        return r;\n      }\n    });\n    function dropTarget(cx, cy) {\n      const ray = ctx.pointerRay ? ctx.pointerRay(Number(cx), Number(cy)) : null;\n      let best = null;\n      if (ray) for (const u of scene.units || []) {\n        const r = rayToLocal(u, ray), lo = [0, 0, 0], hi = [u.w, u.h, u.d + T + 2];\n        let t0 = -Infinity, t1 = Infinity, miss = false;\n        for (let k = 0; k < 3; k++) {\n          if (Math.abs(r.d[k]) < 1e-9) {\n            if (r.o[k] < lo[k] || r.o[k] > hi[k]) miss = true;\n            continue;\n          }\n          let p = (lo[k] - r.o[k]) / r.d[k], q = (hi[k] - r.o[k]) / r.d[k];\n          if (p > q) {\n            const x = p;\n            p = q;\n            q = x;\n          }\n          t0 = Math.max(t0, p);\n          t1 = Math.min(t1, q);\n        }\n        if (miss || t1 < Math.max(t0, 0)) continue;\n        const t = Math.max(t0, 0);\n        if (!best || t < best.t) best = { u, t, x: r.o[0] + r.d[0] * t, y: r.o[1] + r.d[1] * t };\n      }\n      return best;\n    }\n    define(\"previewDrawerDrop\", {\n      history: null,\n      args: { cx: \"client x\", cy: \"client y\" },\n      doc: \"View only: while the interior drawer is dragged, show where a drop at this point would put the drawer (or that it does not fit) - the target cabinet's fronts go see-through; nothing in the plan changes\",\n      run(a) {\n        const best = dropTarget(a && a.cx, a && a.cy);\n        if (!best) {\n          const had = !!scene.drawerPreview;\n          scene.drawerPreview = null;\n          if (had) ctx.frame();\n          return { ok: false, none: true, why: \"Let go of the drawer over a cabinet\", sync: false };\n        }\n        const u = best.u;\n        const why0 = addDrawersWhy(u);\n        const pv = why0 ? { ok: false, why: why0 } : previewDrawerAt(u, best.x, best.y);\n        scene.drawerPreview = {\n          id: u.id,\n          ok: !!pv.ok,\n          why: pv.ok ? null : pv.why,\n          box: pv.box || null,\n          front: pv.front || null,\n          y: pv.y,\n          fh: pv.fh,\n          n: pv.n,\n          name: pv.name || null,\n          frontless: !!pv.frontless,\n          elsewhere: !!pv.elsewhere,\n          lx: best.x,\n          ly: best.y\n        };\n        ctx.frame();\n        return { ...pv, id: u.id, lx: best.x, ly: best.y, sync: false };\n      }\n    });\n    define(\"clearDrawerPreview\", {\n      history: null,\n      args: {},\n      doc: \"View only: take the drop preview away (the drag left the cabinets, was cancelled or ended)\",\n      run() {\n        const had = !!scene.drawerPreview;\n        scene.drawerPreview = null;\n        if (had) ctx.frame();\n        return { ok: true, had, sync: false };\n      }\n    });\n    define(\"dropDrawerAt\", {\n      history: \"add drawer\",\n      args: { cx: \"client x\", cy: \"client y\" },\n      doc: \"Drop an interior drawer where the pointer is: the cabinet under it gets one drawer at that height (nearest place it fits, as previewed); one Undo\",\n      run(a) {\n        const had = !!scene.drawerPreview;\n        scene.drawerPreview = null;\n        const best = dropTarget(a && a.cx, a && a.cy);\n        if (!best) {\n          const why = \"Let go of the drawer over a cabinet\";\n          cue(why);\n          if (had) ctx.frame();\n          return { ok: false, why };\n        }\n        const u = best.u;\n        const why0 = addDrawersWhy(u);\n        if (why0) {\n          cue(why0);\n          done2();\n          return { ok: false, why: why0 };\n        }\n        endDrag();\n        const r = ctx.hist.run(\"add drawer\", () => addDrawerAt(u, best.x, best.y));\n        if (!r.ok) {\n          cue(r.why);\n          done2();\n          return r;\n        }\n        scene.selectedId = u.id;\n        selectAdded(u, r.n);\n        if (scene.selPart && !partById(u, scene.selPart)) scene.selPart = null;\n        cue(r.name + \" added\" + (r.section !== \"the cabinet\" ? \" in the \" + r.section : \"\") + \": front \" + r.fh + \" mm at \" + r.y + \" mm\" + (r.elsewhere ? \" (no full-size drawer fits where it was dropped - the room that was left)\" : r.y !== r.asked ? \" (the nearest place it fits)\" : \"\") + \", box \" + r.box + \" mm\" + (r.frontless ? \" - no front (carcass only)\" : doorWords(u)));\n        done2();\n        return { ...r, id: u.id };\n      }\n    });\n    define(\"removeDrawer\", {\n      history: \"remove drawer\",\n      args: { n: \"the drawer number\" },\n      doc: \"Take one added drawer (box and front) out of the selected cabinet; the door grows back over the face it leaves; one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        endDrag();\n        const n = Number(a && a.n);\n        const d = drawerByN(u, n), name2 = d ? d.name : \"Drawer \" + n;\n        const r = ctx.hist.run(\"remove drawer\", () => removeDrawer(u, n));\n        if (!r.ok) {\n          cue(r.why);\n          done2();\n          return r;\n        }\n        scene.drawerBox = null;\n        if (scene.selPart && !partById(u, scene.selPart)) scene.selPart = null;\n        cue(name2 + \" taken out\" + doorWords(u));\n        done2();\n        return r;\n      }\n    });\n    define(\"moveDrawer\", {\n      history: \"move drawer\",\n      args: { n: \"the drawer number\", y: \"front bottom, mm above the cabinet bottom\", live: \"true while dragging\" },\n      doc: \"Move an added drawer (front and box together) up or down: a drag slides it as far as it fits (never past a shelf or another drawer), a typed height goes to the nearest place it fits; one Undo (a drag: one for the whole drag)\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        const n = Number(a && a.n);\n        if (!drawerByN(u, n)) {\n          const why = \"That drawer is not there any more\";\n          cue(why);\n          return { ok: false, why };\n        }\n        if (!isFinite(Number(a && a.y)) || a.y === \"\" || a.y == null) {\n          const why = \"Type where the drawer front starts, in mm from the bottom\";\n          cue(why);\n          return { ok: false, why };\n        }\n        let r;\n        if (a.live) {\n          if (!dragging) {\n            before = ctx.hist.snap();\n            dragging = true;\n            dragLabel = \"move drawer\";\n          }\n          r = moveDrawer(u, n, a.y, true);\n        } else {\n          endDrag();\n          r = ctx.hist.run(\"move drawer\", () => moveDrawer(u, n, a.y, false));\n        }\n        if (!r.ok) {\n          cue(r.why);\n          return r;\n        }\n        selectAdded(u, n);\n        const d = drawerByN(u, n);\n        if (!a.live || r.clamped) cue(d.name + \" front at \" + r.y + \" mm\" + (r.clamped ? \" - as near to \" + r.asked + \" mm as it fits\" + (r.why ? \" (\" + r.why + \")\" : \"\") : \"\") + doorWords(u));\n        if (a.live) ctx.frame();\n        else done2();\n        return r;\n      }\n    });\n    define(\"setDrawerFront\", {\n      history: \"drawer front height\",\n      args: { n: \"the drawer number\", fh: \"front height mm\" },\n      doc: \"The front height of an added drawer, kept to what fits beside the other fronts; its box keeps its height; one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        endDrag();\n        const n = Number(a && a.n);\n        const r = ctx.hist.run(\"drawer front height\", () => setDrawerFrontH(u, n, a && a.fh));\n        if (!r.ok) {\n          cue(r.why);\n          done2();\n          return r;\n        }\n        const d = drawerByN(u, n);\n        cue(d.name + \" front \" + r.fh + \" mm\" + (r.clamped ? \" - as near to \" + r.asked + \" mm as fits (\" + r.why + \")\" : \"\") + doorWords(u));\n        done2();\n        return r;\n      }\n    });\n    define(\"setDoorHeight\", {\n      history: \"door height\",\n      args: { h: \"door height mm, or full\" },\n      doc: \"Shorten the selected cabinet's door by hand (the rest of the face stays open), or back to Full; one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        if (!u.door) {\n          const why = \"This cabinet has no door - Fit door first\";\n          cue(why);\n          return { ok: false, why };\n        }\n        if (u.type === \"base-4drawer\" || /^tall-|^corner|^island/.test(u.type)) {\n          const why = \"This cabinet's doors are set by its own leaves\";\n          cue(why);\n          return { ok: false, why };\n        }\n        endDrag();\n        const r = ctx.hist.run(\"door height\", () => setDoorH(u, a && a.h));\n        if (!r.ok) {\n          cue(r.why);\n          done2();\n          return r;\n        }\n        const band = doorBand(u);\n        cue(r.h == null ? \"Door over all the face the drawers leave\" + (band && !band.none ? \": \" + Math.round(band.y1 - band.y0) + \" mm\" : \"\") : \"Door \" + r.h + \" mm - the rest of the face stays open (up to \" + r.room + \" mm fits)\");\n        done2();\n        return r;\n      }\n    });\n    define(\"toggleAddedDrawer\", {\n      history: \"open drawer\",\n      args: { n: \"the drawer number\" },\n      doc: \"Pull an added drawer open or push it shut (the double-click on its front does the same); one Undo, like a door\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        const n = Number(a && a.n), d = drawerByN(u, n);\n        if (!d) return { ok: false, why: \"That drawer is not there any more\" };\n        let open = false;\n        ctx.hist.run(\"open drawer\", () => {\n          open = toggleAddedOpen(u, n);\n        });\n        scene.selPart = null;\n        scene.hoverPart = null;\n        cue(d.name + (open ? \" open\" : \" shut\"));\n        done2();\n        return { ok: true, open };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-gola.js\n  var LABEL = { clearance: \"Fitting clearance\", topGap: \"Gap under the worktop\", cGap: \"Gap at the drawer profile\" };\n  function frontsWhy(units, g2) {\n    for (const u0 of units) {\n      if (!GOLA_TYPES[u0.type] || u0.ovGola === \"off\") continue;\n      const u = { ...u0, gola: { ...g2, on: true } };\n      if (u.type === \"base-4drawer\") {\n        if (drawer4Parts(u).some((q) => !(q.frontH >= 40))) return \"the drawer fronts of a \" + u.h + \" mm high drawer cabinet would be too low\";\n      } else if (u.type === \"base-drawer\") {\n        if (!(drawerParts(u).doorH >= 40)) return \"the door under the drawer of a \" + u.h + \" mm high cabinet would be too low\";\n      } else if (!(u.h - g2.topGap - 2 >= 40)) return \"a \" + u.h + \" mm high door would be too low\";\n    }\n    return null;\n  }\n  function installGolaCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue;\n    const selected2 = () => (scene.units || []).find((u) => u.id === scene.selectedId) || null;\n    define(\"setKitchenGola\", {\n      history: \"Gola\",\n      args: { on: \"base units: true | false\", wall: \"wall units: true | false\", clearance: \"mm 0-3\", topGap: \"mm 10-45\", cGap: \"mm 10-60\" },\n      doc: \"Whole kitchen: Gola on base units on / off, Gola on wall units on / off (independent) and the three numbers; one Undo\",\n      run(a) {\n        a = a || {};\n        const cur = normGola(kitchenOf2(scene.kitchen).gola);\n        const want = { ...cur };\n        if (a.on != null) want.on = a.on === true || a.on === \"true\";\n        if (a.wall != null) want.wall = a.wall === true || a.wall === \"true\";\n        for (const k of [\"clearance\", \"topGap\", \"cGap\"]) {\n          if (a[k] == null || a[k] === \"\") continue;\n          const v = Number(a[k]);\n          const lim = GOLA_LIMITS[k];\n          if (!isFinite(v) || v < lim[0] || v > lim[1]) {\n            const why = LABEL[k] + \": \" + lim[0] + \" to \" + lim[1] + \" mm\";\n            cue(why);\n            return { ok: false, why };\n          }\n          want[k] = Math.round(v * 10) / 10;\n        }\n        const next = normGola(want);\n        if (next.on) {\n          const why = frontsWhy(scene.units || [], next);\n          if (why) {\n            const w = \"Not changed: \" + why;\n            cue(w);\n            return { ok: false, why: w };\n          }\n        }\n        const before = JSON.stringify(cur) + JSON.stringify((scene.units || []).map((u) => u.ovGola || null));\n        const switchOn = next.on && (a.on === true || a.on === \"true\");\n        ctx.hist.run(\"Gola\", () => {\n          scene.kitchen = { ...scene.kitchen || {}, gola: next };\n          if (switchOn) for (const u of scene.units) delete u.ovGola;\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        const after = JSON.stringify(next) + JSON.stringify((scene.units || []).map((u) => u.ovGola || null));\n        if (before !== after && a.on == null && a.wall != null && ![\"clearance\", \"topGap\", \"cGap\"].some((k) => a[k] != null && a[k] !== \"\")) {\n          const nw = (scene.units || []).filter((u) => u.family === \"wall\" || u.type === \"wall\" || u.type === \"corner-wall\").length;\n          cue(next.wall ? \"Gola on wall units: requested for \" + nw + \" wall cabinet\" + (nw === 1 ? \"\" : \"s\") + \" - the wall profile is quoted separately (no verified drawing, nothing is cut for it); base units unchanged\" : \"Gola on wall units off; base units unchanged\");\n        } else if (before !== after) {\n          const n = (scene.units || []).filter((u) => u.gola && u.gola.on).length;\n          cue(next.on ? \"Gola handleless: \" + n + \" base cabinet\" + (n === 1 ? \"\" : \"s\") + \" with J (and C) profiles\" : \"Gola off - handleless profiles removed, fronts back to their usual size\");\n        }\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, changed: before !== after, gola: next };\n      }\n    });\n    define(\"setUnitGola\", {\n      history: \"Gola (cabinet)\",\n      args: { on: \"true | false\" },\n      doc: \"The selected cabinet: no Gola on this one, or back to the kitchen's; one Undo\",\n      run(a) {\n        const u = selected2();\n        if (!u) {\n          cue(\"Select a cabinet first\");\n          return { ok: false, why: \"Select a cabinet first\" };\n        }\n        const why = golaWhyNot(u);\n        if (why) {\n          cue(why);\n          return { ok: false, why };\n        }\n        const on = !(a && (a.on === false || a.on === \"false\"));\n        const was = u.ovGola === \"off\" ? \"off\" : null, now = on ? null : \"off\";\n        if (was === now) return { ok: true, changed: false };\n        ctx.hist.run(\"Gola (cabinet)\", () => {\n          if (now) u.ovGola = now;\n          else delete u.ovGola;\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        cue(on ? \"This cabinet follows the kitchen's Gola again\" : \"No Gola on this cabinet\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, changed: true };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-worktop.js\n  function installWorktopCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue;\n    define(\"setKitchenWorktop\", {\n      history: \"worktop\",\n      args: { on: \"true | false\", line: \"worktop-catalogue line id\", front: \"mm 0-100\", side: \"mm 0-100\" },\n      doc: \"Whole kitchen: worktops on / off, the EGGER worktop line, front and side overhang; one Undo\",\n      run(a) {\n        a = a || {};\n        const cur = worktopOf(scene.kitchen);\n        const want = { on: cur.on, line: cur.line, front: cur.front, side: cur.side };\n        if (a.on != null) want.on = a.on === true || a.on === \"true\";\n        if (a.line != null) {\n          if (!lineOf(a.line)) {\n            cue(\"Unknown worktop\");\n            return { ok: false, why: \"unknown worktop line\" };\n          }\n          want.line = a.line;\n          if (a.on == null) want.on = true;\n        }\n        for (const k of [\"front\", \"side\"]) {\n          if (a[k] == null || a[k] === \"\") continue;\n          const n = Number(a[k]);\n          if (!Number.isFinite(n) || n < 0 || n > WT.MAX_OVER) {\n            const why = (k === \"front\" ? \"Front\" : \"Side\") + \" overhang is 0-\" + WT.MAX_OVER + \" mm\";\n            cue(why);\n            return { ok: false, why };\n          }\n          want[k] = Math.round(n);\n        }\n        if (cur.set && JSON.stringify(want) === JSON.stringify({ on: cur.on, line: cur.line, front: cur.front, side: cur.side }))\n          return { ok: false, why: \"unchanged\" };\n        ctx.hist.run(\"worktop\", () => {\n          const k = kitchenOf2(scene.kitchen);\n          k.worktop = want;\n          scene.kitchen = k;\n        });\n        const L = lineOf(want.line);\n        cue(want.on ? \"Worktop: \" + L.decor + \" \" + L.tex + \" \" + L.name + \", \" + L.familyLabel : \"No worktops\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, worktop: want };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-appliances.js\n  function installApplianceCommands(ctx) {\n    const define = ctx.commands.define, cue = ctx.cue, scene = ctx.scene;\n    define(\"setUnitHood\", {\n      history: \"hood\",\n      args: { on: \"true | false (absent = toggle)\" },\n      doc: \"The selected oven + hob base: its Bosch DWP64BC50B chimney hood on / off, centred over its hob; one Undo\",\n      run(a) {\n        const u = ctx.sel();\n        if (!u) return { ok: false, why: \"Select a cabinet first\" };\n        if (!isOvenBase(u)) {\n          const why = \"A hood goes over an oven + hob base - choose one first\";\n          cue(why);\n          return { ok: false, why };\n        }\n        const on = a && a.on != null ? a.on === true || a.on === \"true\" : !u.hood;\n        if (!!u.hood === on) return { ok: false, why: \"unchanged\" };\n        ctx.hist.run(\"hood\", () => {\n          if (on) u.hood = true;\n          else delete u.hood;\n        });\n        cue(on ? \"Hood: \" + APPLIANCES.hood.name + \", centred over the hob\" : \"Hood taken off\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, on };\n      }\n    });\n    const setHood = {\n      history: \"hood-place\",\n      args: { id: \"the oven + hob base (absent = the selected)\", above: \"mm, the hob's top to the hood's lower edge\", dx: \"mm along the wall from centred over the hob\" },\n      doc: \"The hood's own place on its cabinet's wall: height and sideways (cited limits only); one Undo\",\n      run(a) {\n        const u = a && a.id ? (scene.units || []).find((x) => x.id === a.id) : ctx.sel();\n        if (!u || !isOvenBase(u) || !u.hood) {\n          const why = \"No hood there - add one to an oven + hob base first\";\n          cue(why);\n          return { ok: false, why };\n        }\n        const nA = a && a.above != null ? Math.round(Number(a.above)) : hoodAbove(u);\n        const nD = a && a.dx != null ? Math.round(Number(a.dx)) : hoodDx(u);\n        if (a && a.above != null) {\n          const why = hoodHeightCheck(u, scene.kitchen, scene.room, nA);\n          if (why) {\n            cue(why);\n            return { ok: false, why };\n          }\n        }\n        if (a && a.dx != null) {\n          if (!Number.isFinite(nD)) {\n            const why = \"The hood's offset must be a number of millimetres\";\n            cue(why);\n            return { ok: false, why };\n          }\n          const R4 = hoodDxRange(u, scene.kitchen, scene.room, unitXf(u), roomSize());\n          if (R4 && R4.min != null && (nD < R4.min || nD > R4.max)) {\n            const why = \"The hood would leave the room along its wall: \" + R4.min + \" to \" + R4.max + \" mm from centred here\";\n            cue(why);\n            return { ok: false, why };\n          }\n        }\n        if (nA === hoodAbove(u) && nD === hoodDx(u)) return { ok: false, why: \"unchanged\" };\n        ctx.hist.run(\"hood-place\", () => {\n          if (nA === HOOD_ABOVE) delete u.hoodAbove;\n          else u.hoodAbove = nA;\n          if (nD === 0) delete u.hoodDx;\n          else u.hoodDx = nD;\n        });\n        const notes = hoodNotes(u);\n        cue(\"Hood \" + nA + \" mm above the hob\" + (nD ? \", \" + Math.abs(nD) + \" mm \" + (nD > 0 ? \"right\" : \"left\") + \" of centre\" : \", centred\") + (notes.length ? \" - \" + notes[0] : \"\"));\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, above: nA, dx: nD, notes };\n      }\n    };\n    define(\"setHood\", setHood);\n    define(\"setHoodHeight\", Object.assign({}, setHood, { doc: \"Alias of setHood (the hood's height and sideways place)\" }));\n  }\n\n  // v2/src/interact/cmd-splash.js\n  var HEX2 = /^#[0-9a-f]{6}$/i;\n  function installSplashCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue;\n    define(\"setKitchenSplash\", {\n      history: \"splashback\",\n      args: { on: \"true | false\", kind: \"glass | tiles\", colour: \"#rrggbb\", size: \"tile size id\", layout: \"stack | brick | vertical\", grout: \"white | grey | dark\" },\n      doc: \"Whole kitchen: splashback on / off, glass or tiles, colour (or custom), tile size / layout / grout; one Undo\",\n      run(a) {\n        a = a || {};\n        const cur = splashOf(scene.kitchen);\n        const want = { on: cur.on, kind: cur.kind, colour: cur.colour, tile: { ...cur.tile } };\n        const no = (why2) => {\n          cue(why2);\n          return { ok: false, why: why2 };\n        };\n        if (a.kind != null) {\n          if (a.kind !== \"glass\" && a.kind !== \"tiles\") return no(\"A splashback is glass or tiles\");\n          if (a.kind !== want.kind && a.colour == null) want.colour = (a.kind === \"tiles\" ? SPLASH.TILE_COLOURS : SPLASH.GLASS)[0].hex;\n          want.kind = a.kind;\n        }\n        if (a.colour != null) {\n          if (!HEX2.test(String(a.colour))) return no(\"A colour is #rrggbb\");\n          want.colour = String(a.colour).toLowerCase();\n        }\n        if (a.size != null) {\n          if (!SPLASH.SIZES.some((s) => s.id === a.size)) return no(\"Unknown tile size\");\n          want.tile.size = a.size;\n        }\n        if (a.layout != null) {\n          if (!SPLASH.LAYOUTS.some((s) => s.id === a.layout)) return no(\"Unknown tile layout\");\n          want.tile.layout = a.layout;\n        }\n        if (a.grout != null) {\n          if (!SPLASH.GROUTS.some((s) => s.id === a.grout)) return no(\"Unknown grout\");\n          want.tile.grout = a.grout;\n        }\n        if (a.on != null) want.on = a.on === true || a.on === \"true\";\n        else if (a.kind != null || a.colour != null || a.size != null || a.layout != null || a.grout != null) want.on = true;\n        if (cur.set && JSON.stringify(want) === JSON.stringify({ on: cur.on, kind: cur.kind, colour: cur.colour, tile: cur.tile }))\n          return { ok: false, why: \"unchanged\" };\n        const pieces = cur.pieces ? cur.pieces.map((q) => ({ ...q })) : !cur.set ? [] : null;\n        ctx.hist.run(\"splashback\", () => {\n          const k = kitchenOf2(scene.kitchen);\n          k.splash = pieces ? Object.assign({}, want, { pieces }) : want;\n          scene.kitchen = k;\n        });\n        cue(!want.on ? \"No splashback\" : \"Splashback: \" + splashName(splashOf({ splash: want })) + (pieces && !pieces.length ? \" - drag \\xABAdd piece\\xBB onto a wall to place it\" : \"\"));\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, splash: want };\n      }\n    });\n    const room = () => scene.room || null;\n    const startPieces = (cur) => cur.pieces ? cur.pieces.map((q) => ({ ...q })) : cur.on ? materializePieces(scene.units, scene.kitchen, room()) : [];\n    const commit = (label, cur, pieces) => ctx.hist.run(label, () => {\n      const k = kitchenOf2(scene.kitchen);\n      k.splash = { on: pieces.length > 0 || false, kind: cur.kind, colour: cur.colour, tile: { ...cur.tile }, pieces };\n      scene.kitchen = k;\n    });\n    const fit = (q, w) => {\n      if (w.lo != null && w.hi != null) {\n        const len = q.a1 - q.a0;\n        if (q.a0 < w.lo) {\n          q.a0 = w.lo;\n          q.a1 = Math.min(w.hi, q.a0 + len);\n        }\n        if (q.a1 > w.hi) {\n          q.a1 = w.hi;\n          q.a0 = Math.max(w.lo, q.a1 - len);\n        }\n      }\n      return q;\n    };\n    const why = (q, w) => !w ? \"That wall is not in this room\" : q.a1 - q.a0 < PIECE.MIN_W ? \"A splashback piece is at least \" + PIECE.MIN_W + \" mm wide\" : q.y1 - q.y0 < PIECE.MIN_H ? \"A splashback piece is at least \" + PIECE.MIN_H + \" mm high\" : q.y0 < 0 || q.y1 - q.y0 > PIECE.MAX_H ? \"That height is not possible\" : null;\n    define(\"addSplashPiece\", {\n      history: \"add splashback piece\",\n      args: { wall: \"wall id\", at: \"mm along the wall (drop point)\", a0: \"mm\", a1: \"mm\", y0: \"mm\", y1: \"mm\" },\n      doc: \"A splashback piece on ONE wall: at a drop point (the cooker zone / the cabinet under it) or exact mm; one Undo\",\n      run(a) {\n        a = a || {};\n        const cur = splashOf(scene.kitchen), w = pieceWall(a.wall);\n        const no = (m) => {\n          cue(m);\n          return { ok: false, why: m };\n        };\n        if (!w) return no(\"That wall is not in this room\");\n        let q;\n        if (a.a0 != null && a.a1 != null) q = { id: \"\", wall: a.wall, a0: Math.round(+a.a0), a1: Math.round(+a.a1), y0: Math.round(+(a.y0 != null ? a.y0 : 758)), y1: Math.round(+(a.y1 != null ? a.y1 : 1358)) };\n        else {\n          if (!Number.isFinite(+a.at)) return no(\"Where on the wall?\");\n          q = defaultPiece(scene.units, scene.kitchen, room(), a.wall, +a.at);\n        }\n        if (!q) return no(\"That wall is not in this room\");\n        q = fit({ id: q.id, wall: q.wall, a0: Math.min(q.a0, q.a1), a1: Math.max(q.a0, q.a1), y0: Math.min(q.y0, q.y1), y1: Math.max(q.y0, q.y1) }, w);\n        const bad = why(q, w);\n        if (bad) return no(bad);\n        const pieces = startPieces(cur);\n        q.id = nextPieceId(pieces);\n        pieces.push(q);\n        commit(\"add splashback piece\", cur, pieces);\n        ctx.view && (ctx.view.splashSel = q.id);\n        cue(\"Splashback piece \" + q.id + \": \" + (q.a1 - q.a0) + \" x \" + (q.y1 - q.y0) + \" mm\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, piece: q };\n      }\n    });\n    define(\"setSplashPiece\", {\n      history: \"splashback piece\",\n      args: { id: \"piece id\", wall: \"wall id\", a0: \"mm\", a1: \"mm\", y0: \"mm\", y1: \"mm\", w: \"width mm (keeps a0)\", h: \"height mm (keeps y0)\" },\n      doc: \"Move / resize one splashback piece by exact millimetres (or onto another wall); one Undo\",\n      run(a) {\n        a = a || {};\n        const cur = splashOf(scene.kitchen), pieces = startPieces(cur);\n        const no = (m) => {\n          cue(m);\n          return { ok: false, why: m };\n        };\n        const i = pieces.findIndex((q2) => q2.id === a.id);\n        if (i < 0) return no(\"No such splashback piece\");\n        const q = { ...pieces[i] }, num6 = (v) => v == null || v === \"\" ? null : Number(v);\n        if (a.wall != null) q.wall = String(a.wall);\n        for (const k of [\"a0\", \"a1\", \"y0\", \"y1\"]) {\n          const v = num6(a[k]);\n          if (v != null) {\n            if (!Number.isFinite(v)) return no(\"A size is a number of millimetres\");\n            q[k] = Math.round(v);\n          }\n        }\n        if (num6(a.w) != null) {\n          if (!Number.isFinite(num6(a.w))) return no(\"A size is a number of millimetres\");\n          q.a1 = q.a0 + Math.round(num6(a.w));\n        }\n        if (num6(a.h) != null) {\n          if (!Number.isFinite(num6(a.h))) return no(\"A size is a number of millimetres\");\n          q.y1 = q.y0 + Math.round(num6(a.h));\n        }\n        if (q.a1 < q.a0) [q.a0, q.a1] = [q.a1, q.a0];\n        if (q.y1 < q.y0) [q.y0, q.y1] = [q.y1, q.y0];\n        const w = pieceWall(q.wall);\n        if (w) fit(q, w);\n        const bad = why(q, w);\n        if (bad) return no(bad);\n        if (JSON.stringify(q) === JSON.stringify(pieces[i]) && cur.pieces) return { ok: false, why: \"unchanged\" };\n        pieces[i] = q;\n        commit(\"splashback piece\", cur, pieces);\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true, piece: q };\n      }\n    });\n    define(\"removeSplashPiece\", {\n      history: \"remove splashback piece\",\n      args: { id: \"piece id\" },\n      doc: \"Remove one splashback piece (the others stay); one Undo\",\n      run(a) {\n        a = a || {};\n        const cur = splashOf(scene.kitchen), pieces = startPieces(cur);\n        const i = pieces.findIndex((q) => q.id === (a && a.id));\n        if (i < 0) {\n          cue(\"No such splashback piece\");\n          return { ok: false, why: \"No such splashback piece\" };\n        }\n        pieces.splice(i, 1);\n        commit(\"remove splashback piece\", cur, pieces);\n        if (ctx.view && ctx.view.splashSel === a.id) ctx.view.splashSel = null;\n        cue(\"Splashback piece removed\");\n        ctx.syncControls();\n        ctx.refresh();\n        return { ok: true };\n      }\n    });\n  }\n\n  // v2/src/model/kitchen-rules.js\n  var RULES_VERSION = \"2026-10-12.2\";\n  var BOSCH = \"Bosch UK installation manuals, read 09.10.2026 (v2/tools/appliances/bosch-2026-10-09.md)\";\n  var RULES = [\n    {\n      id: \"in-room\",\n      kind: \"planner\",\n      severity: \"hard\",\n      title: \"Every cabinet inside the room\",\n      text: \"A cabinet outside the walls cannot be fitted.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"no-overlap\",\n      kind: \"planner\",\n      severity: \"hard\",\n      title: \"No two cabinets in the same space\",\n      text: \"Two cabinets on the same level cannot occupy the same floor or wall space.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"openings\",\n      kind: \"planner\",\n      severity: \"hard\",\n      title: \"Windows and doors kept clear\",\n      text: \"No cabinet stands in a door's opening or in front of a window (the same zones the planner uses when you place a cabinet by hand).\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"oven-fit\",\n      kind: \"manufacturer\",\n      severity: \"hard\",\n      title: \"The oven fits its cabinet (Bosch HHF113BR0B only)\",\n      text: \"For the Bosch HHF113BR0B the planner draws: an opening 560-568 mm wide, at least 550 mm deep and 600 mm high under the worktop. Another oven has its own figures.\",\n      appliance: \"bosch-hhf113br0b\",\n      page: \"pp.22-24\",\n      ref: \"the opening inside the cabinet, under the worktop\",\n      source: BOSCH + \" [M-oven 9001771898 rev G pp.22-24]\",\n      reviewed: null\n    },\n    {\n      id: \"hob-side\",\n      kind: \"manufacturer\",\n      severity: \"hard\",\n      title: \"Space beside the hob (Bosch PUE611BB5B only)\",\n      text: \"For the Bosch PUE611BB5B induction hob the planner draws, Bosch's installation manual asks at least 50 mm from the edge of the worktop cut-out to a side wall or a tall unit. In a 600 mm cabinet the 560 mm cut-out is 20 mm from the side. Another hob - or a gas hob - has its own figure in its own manual.\",\n      appliance: \"bosch-pue611bb5b\",\n      page: \"p.9\",\n      ref: \"the worktop cut-out's side edge to the face of the wall or tall unit\",\n      source: BOSCH + \" [M-hob 9001867174 rev F p.9]\",\n      reviewed: null\n    },\n    {\n      id: \"hood-clear\",\n      kind: \"manufacturer\",\n      severity: \"hard\",\n      title: \"The hood's space and height (Bosch DWP64BC50B only)\",\n      text: \"For the Bosch DWP64BC50B chimney hood the planner draws: centred over the hob and at least as wide as it (manual rev L pp.9-12); its total height is 799-975 mm from the canopy's underside to the chimney's top (product page), so the ceiling must be at least 799 mm above the canopy; a wall cabinet cannot hang in its space. The planner hangs the canopy 650 mm above the induction hob - its own choice within Bosch's 550 mm minimum for electric hobs (650 for gas). Another hood has its own figures.\",\n      appliance: \"bosch-dwp64bc50b\",\n      page: \"pp.9-12 + product page\",\n      ref: \"canopy underside; hob glass top for the height above the hob\",\n      source: BOSCH + \" [M-hood 9001672689 rev L pp.9-12; P-hood]\",\n      reviewed: null\n    },\n    {\n      id: \"appliance-model\",\n      kind: \"unknown\",\n      severity: \"hard\",\n      title: \"Your own appliance models\",\n      text: \"The oven + hob cabinet is drawn with Bosch planning models (HHF113BR0B oven, PUE611BB5B hob, DWP64BC50B hood) so it can be laid out. If you buy other appliances, their clearances are UNKNOWN until their own installation manuals are checked. Fridge and oven housings are generic spaces, not a chosen appliance.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"extractor\",\n      kind: \"layout\",\n      severity: \"advice\",\n      title: \"Extraction over the hob\",\n      text: \"A hob is normally planned with a hood over it. Without one in the plan, ventilation has to be planned another way - your fitter decides.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"hob-landing\",\n      kind: \"layout\",\n      severity: \"advice\",\n      title: \"Worktop on both sides of the hob\",\n      text: \"Somewhere to put a hot pan down on each side of the hob, and pan drawers within reach. No minimum width is claimed.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"fridge-place\",\n      kind: \"layout\",\n      severity: \"advice\",\n      title: \"Fridge at the end of a run, with worktop beside it\",\n      text: \"A tall fridge at the end of a run does not cut the worktop in two, and a worktop beside it is where shopping goes down. Which way the door opens depends on the fridge model, which the planner does not know yet.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"walkway\",\n      kind: \"planner\",\n      severity: \"advice\",\n      title: \"Room to walk between runs\",\n      text: \"This planner keeps 1000 mm between an island and the runs (its own setting, not a standard; to be reviewed). Narrower walkways are flagged as advice.\",\n      source: \"Cabinet Lab generator setting GEN.islandClear (kitchen-gen.js)\",\n      reviewed: null\n    },\n    {\n      id: \"tidy-runs\",\n      kind: \"planner\",\n      severity: \"advice\",\n      title: \"Runs closed edge to edge\",\n      text: \"A small gap between cabinets (50-600 mm) cannot hold a cabinet and collects dirt; close it with a wider cabinet or a filler.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"storage\",\n      kind: \"layout\",\n      severity: \"advice\",\n      title: \"Storage you can reach\",\n      text: \"Wall cabinets over the worktop, a pantry, or drawers - storage near where it is used. Counted from the plan, not from what anything costs.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"sink\",\n      kind: \"unknown\",\n      severity: \"advice\",\n      title: \"Sink, dishwasher and washing machine\",\n      text: \"The planner does not place a sink, a dishwasher or a washing machine yet, so their position, plumbing and door clearance are UNKNOWN - not counted as good or bad.\",\n      source: null,\n      reviewed: null\n    },\n    {\n      id: \"triangle\",\n      kind: \"unknown\",\n      severity: \"advice\",\n      title: \"Work triangle / work zones\",\n      text: \"A work triangle needs the sink's position, which the planner does not have; with several cooks, separate work zones matter more than one triangle. Left unknown.\",\n      source: null,\n      reviewed: null\n    }\n  ];\n  var RULE = Object.fromEntries(RULES.map((r) => [r.id, r]));\n  var TOPICS = [\n    [/extract|hood|vent|steam|smell/, [\"extractor\", \"hood-clear\"]],\n    [/fridge|freezer/, [\"fridge-place\"]],\n    [/hob|cook|oven|pan/, [\"hob-side\", \"hob-landing\", \"oven-fit\", \"extractor\"]],\n    [/washer|washing|dishwasher|sink|plumb|tap/, [\"sink\"]],\n    [/triangle|work ?zone|two cooks|2 cooks|several cooks|workflow/, [\"triangle\", \"walkway\"]],\n    [/walk|aisle|space between|clearance|island/, [\"walkway\", \"openings\"]],\n    [/window|door/, [\"openings\"]],\n    [/storage|cupboard|drawer|pantry/, [\"storage\", \"hob-landing\"]],\n    [/gap|filler/, [\"tidy-runs\"]]\n  ];\n  function rulesFor(text) {\n    const t = String(text || \"\").toLowerCase(), ids = [];\n    for (const [re, list] of TOPICS) if (re.test(t)) {\n      for (const id of list) if (!ids.includes(id)) ids.push(id);\n    }\n    return ids.map((id) => RULE[id]);\n  }\n  function cite(rule) {\n    if (!rule) return \"\";\n    const from = rule.kind === \"manufacturer\" ? \" (\" + (rule.source || \"manufacturer\") + \")\" : rule.kind === \"planner\" ? \" (this planner's own rule, not a standard)\" : rule.kind === \"unknown\" ? \"\" : \" (general layout advice, not a regulation)\";\n    return rule.title + \": \" + rule.text + from;\n  }\n\n  // v2/src/model/kitchen-score.js\n  var isWall = (u) => u.family === \"wall\";\n  var isFloor = (u) => !isWall(u);\n  var isBaseRun = (u) => u.family === \"base\" && u.type !== \"island\" && !isTall(u);\n  var hasDrawers = (u) => u.type === \"base-drawer\" || u.type === \"base-4drawer\" || Array.isArray(u.xdr) && u.xdr.length > 0;\n  var axisOf2 = (u) => ((u.rot || 0) % 2 + 2) % 2 === 0 ? \"x\" : \"z\";\n  var cross4 = (ax) => ax === \"x\" ? \"z\" : \"x\";\n  var span = (u, ax) => {\n    const b = foot(u);\n    return [b[ax + \"0\"], b[ax + \"1\"]];\n  };\n  var overlapLen = (a, b) => Math.min(a[1], b[1]) - Math.max(a[0], b[0]);\n  function neighbours(u, list, near2) {\n    const ax = axisOf2(u), cx = cross4(ax), su = span(u, ax), cu = span(u, cx), out = { lo: [], hi: [] };\n    for (const v of list) {\n      if (v === u || !isFloor(v) || v.type === \"island\") continue;\n      if (overlapLen(cu, span(v, cx)) < 100) continue;\n      const sv = span(v, ax);\n      if (overlapLen(su, sv) > 1) continue;\n      if (su[0] - sv[1] >= -1 && su[0] - sv[1] <= near2) out.lo.push({ v, gap: Math.max(0, su[0] - sv[1]) });\n      if (sv[0] - su[1] >= -1 && sv[0] - su[1] <= near2) out.hi.push({ v, gap: Math.max(0, sv[0] - su[1]) });\n    }\n    return out;\n  }\n  function modelOf(u) {\n    if (!isOvenBase(u)) return { oven: null, hob: null, hood: null };\n    const pick = (k, def) => Object.prototype.hasOwnProperty.call(u, k) ? u[k] || null : def;\n    return { oven: pick(\"ovenModel\", APPLIANCES.oven.id), hob: pick(\"hobModel\", APPLIANCES.hob.id), hood: u.hood ? pick(\"hoodModel\", APPLIANCES.hood.id) : null };\n  }\n  function hardChecks(list, room, kitchen) {\n    const checks = [];\n    const add = (id, status, detail, fix) => {\n      const r = RULE[id];\n      checks.push({\n        id,\n        title: r.title,\n        kind: r.kind,\n        status,\n        detail: detail || null,\n        fix: fix || null,\n        appliance: r.appliance || null,\n        source: r.source || null,\n        ref: r.ref || null\n      });\n    };\n    const R4 = room && room.on !== false && Number(room.width) > 0 && Number(room.depth) > 0 ? room : null;\n    if (!R4) add(\"in-room\", \"unknown\", \"the room's size is not set\");\n    else {\n      const out = list.filter((u) => {\n        const b = foot(u);\n        return b.x0 < -1 || b.z0 < -1 || b.x1 > R4.width + 1 || b.z1 > R4.depth + 1;\n      });\n      add(\n        \"in-room\",\n        out.length ? \"fail\" : \"pass\",\n        out.length ? out.length + \" cabinet\" + (out.length === 1 ? \" is\" : \"s are\") + \" outside the walls\" : null,\n        out.length ? \"Move the cabinet back inside the room, or make the room bigger in Room.\" : null\n      );\n    }\n    let clash = 0;\n    for (let i = 0; i < list.length; i++) for (let j = i + 1; j < list.length; j++) if (sameLevel(list[i], list[j]) && overlaps(list[i], list[j])) clash++;\n    add(\n      \"no-overlap\",\n      clash ? \"fail\" : \"pass\",\n      clash ? clash + \" pair\" + (clash === 1 ? \"\" : \"s\") + \" of cabinets in the same space\" : null,\n      clash ? \"Move or resize one of the overlapping cabinets.\" : null\n    );\n    if (!R4) add(\"openings\", \"unknown\", \"the room is not set\");\n    else {\n      const zones = openingZones(R4, { width: R4.width, depth: R4.depth, height: R4.height || 2400 });\n      const blocked = list.filter((u) => zones.some((zn) => unitInZone(u, zn)));\n      add(\n        \"openings\",\n        blocked.length ? \"fail\" : \"pass\",\n        blocked.length ? blocked.length + \" cabinet\" + (blocked.length === 1 ? \" blocks\" : \"s block\") + \" a window or a door\" : null,\n        blocked.length ? \"Move it out of the window or door zone.\" : null\n      );\n    }\n    const ovens = list.filter(isOvenBase);\n    const housings = list.filter((u) => u.type === \"tall-fridge\" || u.type === \"tall-oven\");\n    if (ovens.length || housings.length) add(\n      \"appliance-model\",\n      \"unknown\",\n      \"your own appliance models are not chosen: figures are checked only for the Bosch models drawn in the oven + hob cabinet\" + (housings.length ? \"; fridge / oven housings are generic spaces\" : \"\")\n    );\n    if (!ovens.length) {\n      add(\"oven-fit\", \"n/a\");\n      add(\"hob-side\", \"n/a\");\n      add(\"hood-clear\", \"n/a\");\n      return checks;\n    }\n    const ofModel = (key) => ovens.filter((u) => modelOf(u)[key] === APPLIANCES[key].id);\n    const otherWords = (key) => \"this \" + key + \" is not the \" + APPLIANCES[key].brand + \" \" + APPLIANCES[key].model + \" the figures were read for - check its own installation manual\";\n    const ovensM = ofModel(\"oven\");\n    if (!ovensM.length) add(\"oven-fit\", \"unknown\", otherWords(\"oven\"));\n    else {\n      const misfit = ovensM.map(ovenFit).filter((w) => w.length);\n      add(\n        \"oven-fit\",\n        misfit.length ? \"fail\" : \"pass\",\n        misfit.length ? misfit[0][0] : null,\n        misfit.length ? \"Set the oven + hob cabinet back to 600 mm wide and at least 550 mm deep.\" : null\n      );\n    }\n    const C3 = APPLIANCES.hob.cutout, needMm = C3.side || 50;\n    let tooClose = null;\n    const hobsM = ofModel(\"hob\");\n    if (!hobsM.length) add(\"hob-side\", \"unknown\", otherWords(\"hob\"));\n    else for (const u of hobsM) {\n      const side = (u.w - C3.w) / 2, need = needMm - side, ax = axisOf2(u), su = span(u, ax);\n      const nb = neighbours(u, list, Math.max(need, 0) + 1);\n      const tall = nb.lo.concat(nb.hi).find((n) => isTall(n.v) && n.gap < need);\n      if (tall) {\n        tooClose = \"a tall unit is \" + Math.round(tall.gap + side) + \" mm from the hob cut-out (Bosch PUE611BB5B manual: at least \" + needMm + \")\";\n        break;\n      }\n      if (R4) {\n        const lim = ax === \"x\" ? R4.width : R4.depth;\n        const lo = su[0], hi = lim - su[1];\n        if (lo + side < needMm && !nb.lo.length) {\n          tooClose = \"the side wall is \" + Math.round(lo + side) + \" mm from the hob cut-out (Bosch PUE611BB5B manual: at least \" + needMm + \")\";\n          break;\n        }\n        if (hi + side < needMm && !nb.hi.length) {\n          tooClose = \"the side wall is \" + Math.round(hi + side) + \" mm from the hob cut-out (Bosch PUE611BB5B manual: at least \" + needMm + \")\";\n          break;\n        }\n      }\n    }\n    if (hobsM.length) add(\"hob-side\", tooClose ? \"fail\" : \"pass\", tooClose, tooClose ? \"Put a base cabinet between the oven + hob cabinet and the tall unit or the wall.\" : null);\n    const hooded = ovens.filter((u) => u.hood);\n    const hoodedM = hooded.filter((u) => modelOf(u).hood === APPLIANCES.hood.id);\n    if (!hooded.length) add(\"hood-clear\", \"n/a\");\n    else if (!hoodedM.length) add(\"hood-clear\", \"unknown\", otherWords(\"hood\"));\n    else {\n      let why = null;\n      const tall = R4 && Number(R4.height) > 0;\n      for (const u of hoodedM) {\n        const L = ovenHobLayout(u, kitchen || {}), y0 = (u.y || 0) + L.hood.y0, bu = foot(u);\n        const inSpace = list.find((w) => {\n          if (!isWall(w)) return false;\n          const b = foot(w);\n          return b.x0 < bu.x1 - 1 && b.x1 > bu.x0 + 1 && b.z0 < bu.z1 - 1 && b.z1 > bu.z0 + 1 && (w.y || 0) + (w.h || 0) > y0 + 1;\n        });\n        if (inSpace) {\n          why = \"a wall cabinet hangs in the hood's space\";\n          break;\n        }\n        if (R4) {\n          const probe = { ...u, id: \"__hood\", type: \"wall\", family: \"wall\", y: y0, h: APPLIANCES.hood.total[0] };\n          const zones = openingZones(R4, { width: R4.width, depth: R4.depth, height: R4.height || 2400 });\n          if (zones.some((zn) => unitInZone(probe, zn))) {\n            why = \"the hood would hang in front of a window or a door\";\n            break;\n          }\n        }\n        if (tall && Number(R4.height) - LEG_H - y0 < APPLIANCES.hood.total[0]) {\n          why = \"the room is too low for the Bosch DWP64BC50B hood (its shortest total height is \" + APPLIANCES.hood.total[0] + \" mm from the canopy up)\";\n          break;\n        }\n      }\n      add(\n        \"hood-clear\",\n        why ? \"fail\" : tall ? \"pass\" : \"unknown\",\n        why || (tall ? null : \"the room height is not set\"),\n        why ? \"Take the wall cabinet above the hob away - the hood goes there.\" : null\n      );\n    }\n    return checks;\n  }\n  function advice(list) {\n    const out = [];\n    const add = (key, rule, status, points, said, fix) => out.push({\n      key,\n      rule,\n      label: RULE[rule].title,\n      status,\n      points: status === \"measured\" ? Math.max(0, Math.min(1, points)) : null,\n      said,\n      fix: status === \"measured\" && points < 1 ? fix : null\n    });\n    const base = list.filter(isBaseRun), ovens = list.filter(isOvenBase), fridges = list.filter((u) => u.type === \"tall-fridge\");\n    if (!ovens.length) add(\"cooking\", \"hob-landing\", \"n/a\", 0, \"No oven + hob cabinet in this plan - where you cook is not assessed.\");\n    else {\n      let p = 0;\n      const said = [];\n      for (const u of ovens) {\n        const nb = neighbours(u, list, 50);\n        const ok2 = (n) => isBaseRun(n.v) || n.v.type === \"corner-l\";\n        const lo = nb.lo.some(ok2), hi = nb.hi.some(ok2);\n        const pans = nb.lo.concat(nb.hi).some((n) => hasDrawers(n.v));\n        p += ((lo ? 1 : 0) + (hi ? 1 : 0) + (pans ? 1 : 0)) / 3;\n        said.push((lo && hi ? \"worktop on both sides of the hob\" : lo || hi ? \"worktop on one side of the hob only\" : \"no worktop beside the hob\") + (pans ? \", pan drawers next to it\" : \", no drawers right next to it\"));\n      }\n      add(\n        \"cooking\",\n        \"hob-landing\",\n        \"measured\",\n        p / ovens.length,\n        \"Cooking: \" + said.join(\"; \") + \".\",\n        \"Put a base cabinet on each side of the oven + hob cabinet - a drawer base beside it keeps pans in reach.\"\n      );\n    }\n    if (!ovens.length) add(\"extractor\", \"extractor\", \"n/a\", 0, \"No hob in this plan, so extraction is not assessed.\");\n    else {\n      const n = ovens.filter((u) => u.hood).length;\n      add(\n        \"extractor\",\n        \"extractor\",\n        \"measured\",\n        n / ovens.length,\n        n === ovens.length ? \"Extractor: the hob has its hood, centred over it.\" : \"Extractor: the hob has no hood in the plan.\",\n        \"Select the oven + hob cabinet and switch its hood on - or plan extraction another way with your fitter.\"\n      );\n    }\n    if (!fridges.length) add(\"fridge\", \"fridge-place\", \"n/a\", 0, \"No fridge housing in this plan - fine if your fridge stands somewhere else.\");\n    else {\n      let p = 0;\n      const said = [];\n      for (const u of fridges) {\n        const nb = neighbours(u, list, 50);\n        const baseLo = nb.lo.some((n) => isBaseRun(n.v)), baseHi = nb.hi.some((n) => isBaseRun(n.v));\n        const end = !(baseLo && baseHi), landing = baseLo || baseHi;\n        p += (end ? 0.5 : 0) + (landing ? 0.5 : 0);\n        said.push((end ? \"at the end of a run\" : \"splitting the worktop in two\") + (landing ? \", with worktop beside it\" : \", with no worktop beside it\"));\n      }\n      add(\n        \"fridge\",\n        \"fridge-place\",\n        \"measured\",\n        p / fridges.length,\n        \"Fridge: \" + said.join(\"; \") + \".\",\n        \"Move the fridge housing to the end of a run, next to a base cabinet.\"\n      );\n    }\n    const ways = [];\n    for (const isl of list.filter((u) => u.type === \"island\")) {\n      const bi = foot(isl);\n      for (const v of list.filter((x) => isFloor(x) && x.type !== \"island\")) {\n        const b = foot(v);\n        const dz = Math.max(b.z0 - bi.z1, bi.z0 - b.z1), dx = Math.max(b.x0 - bi.x1, bi.x0 - b.x1);\n        if (dx < 0 && dz >= 0) ways.push(dz);\n        else if (dz < 0 && dx >= 0) ways.push(dx);\n      }\n    }\n    const sides = list.filter((u) => isFloor(u) && u.type !== \"island\" && axisOf2(u) === \"z\");\n    for (const a of sides) for (const b of sides) if (a !== b && foot(a).x1 < foot(b).x0 && overlapLen(span(a, \"z\"), span(b, \"z\")) > 100) ways.push(foot(b).x0 - foot(a).x1);\n    if (!ways.length) add(\"walkway\", \"walkway\", \"n/a\", 0, \"No island or facing runs - no walkway between cabinets to check.\");\n    else {\n      const min = Math.min(...ways), want = 1e3;\n      add(\n        \"walkway\",\n        \"walkway\",\n        \"measured\",\n        min >= want ? 1 : Math.max(0, (min - 600) / (want - 600)),\n        \"Walkway: the narrowest between cabinets is \" + Math.round(min) + \" mm (this planner keeps \" + want + \" mm).\",\n        \"Move the island or a run so the walkway is at least \" + want + \" mm.\"\n      );\n    }\n    let gaps = 0;\n    const groups = /* @__PURE__ */ new Map();\n    for (const u of list.filter((v) => v.type !== \"island\")) {\n      const ax = axisOf2(u), cu = span(u, cross4(ax));\n      const k = ax + \":\" + Math.round(cu[0] / 100) + \":\" + (isWall(u) ? \"w\" : \"f\");\n      const arr = groups.get(k) || [];\n      arr.push(u);\n      groups.set(k, arr);\n    }\n    for (const [k, arr] of groups) {\n      const ax = k[0];\n      const s = arr.map((u) => span(u, ax)).sort((p, q) => p[0] - q[0]);\n      for (let i = 1; i < s.length; i++) {\n        const g2 = s[i][0] - s[i - 1][1];\n        if (g2 > 50 && g2 < 600) gaps++;\n      }\n    }\n    if (!list.length) add(\"tidy\", \"tidy-runs\", \"n/a\", 0, \"No cabinets yet.\");\n    else add(\n      \"tidy\",\n      \"tidy-runs\",\n      \"measured\",\n      1 - gaps * 0.25,\n      gaps ? \"Runs: \" + gaps + \" small gap\" + (gaps === 1 ? \"\" : \"s\") + \" between cabinets.\" : \"Runs: closed edge to edge.\",\n      \"Close the gap\" + (gaps === 1 ? \"\" : \"s\") + \" with a wider cabinet or a filler.\"\n    );\n    const baseLen = base.reduce((s, u) => s + (Number(u.w) || 0), 0);\n    if (!baseLen) add(\"storage\", \"storage\", \"n/a\", 0, \"No base cabinets yet - storage is not assessed.\");\n    else {\n      const wallLen = list.filter(isWall).reduce((s, u) => s + (Number(u.w) || 0), 0);\n      const pantry = list.filter((u) => u.type === \"tall-pantry\").reduce((s, u) => s + 2 * (Number(u.w) || 600), 0);\n      const drawerLen = base.filter(hasDrawers).reduce((s, u) => s + (Number(u.w) || 0), 0) / 2;\n      const p = (wallLen + pantry + drawerLen) / baseLen;\n      add(\n        \"storage\",\n        \"storage\",\n        \"measured\",\n        p,\n        \"Storage: \" + Math.round(Math.min(1, p) * 100) + \"% of the worktop's length has storage above or beside it.\",\n        \"Hang wall cabinets over the worktop, add a pantry, or use drawer bases.\"\n      );\n    }\n    return out;\n  }\n  var UNKNOWN = [\n    { rule: \"sink\", said: \"Sink, dishwasher and washing machine: the planner does not place them yet - not scored.\" },\n    { rule: \"triangle\", said: \"Work triangle / work zones: needs the sink's position - not scored.\" },\n    { rule: \"fridge-place\", said: \"Appliance door swings: no fridge or washer model is chosen - not checked.\" }\n  ];\n  function scoreKitchen(units, room, kitchen) {\n    const list = Array.isArray(units) ? units : [];\n    const checks = hardChecks(list, room, kitchen);\n    const adv = advice(list);\n    const measured = adv.filter((a) => a.status === \"measured\");\n    const total = measured.length ? Math.round(100 * measured.reduce((s, a) => s + a.points, 0) / measured.length) : 0;\n    const fails = checks.filter((c) => c.status === \"fail\");\n    const fixes = fails.map((c) => c.fix).concat(measured.filter((a) => a.fix).sort((p, q) => p.points - q.points).map((a) => a.fix)).filter(Boolean);\n    if (!list.length) fixes.push(\"Add cabinets - or ask Chef for kitchen options for this room.\");\n    const parts = adv.map((a) => ({\n      key: a.key,\n      rule: a.rule,\n      label: a.label,\n      status: a.status,\n      points: a.status === \"measured\" ? Math.round(a.points * 10) : 0,\n      max: a.status === \"measured\" ? 10 : 0,\n      hint: a.fix,\n      said: a.said\n    }));\n    const unknownChecks = checks.filter((c) => c.status === \"unknown\");\n    const hard = { pass: checks.filter((c) => c.status === \"pass\").length, fail: fails.length, unknown: unknownChecks.length };\n    const coverage = {\n      measured: measured.length,\n      notInPlan: adv.filter((a) => a.status === \"n/a\").length,\n      notChecked: UNKNOWN.length,\n      of: measured.length + UNKNOWN.length\n    };\n    coverage.words = measured.length + \" of \" + coverage.of + \" checked\";\n    return {\n      version: RULES_VERSION,\n      total,\n      scored: measured.length > 0,\n      blocked: fails.length > 0,\n      checks,\n      hard,\n      parts,\n      unknown: UNKNOWN.slice(),\n      measured: measured.length,\n      coverage,\n      hint: fixes[0] || null,\n      fixes\n    };\n  }\n  function scoreWords(s) {\n    if (!s) return \"\";\n    const fails = s.checks.filter((c) => c.status === \"fail\");\n    const lines = [fails.length ? \"First fix \" + fails.length + \" problem\" + (fails.length === 1 ? \"\" : \"s\") + \": \" + fails.map((c) => c.detail).join(\"; \") + \".\" : !s.scored ? \"No score yet - there is nothing in the plan I can measure.\" : \"Your kitchen scores \" + s.total + \" out of 100 for how it works - \" + s.coverage.words + \" (price and finish never count; what is not checked is not counted as right).\"];\n    const good = s.parts.filter((p) => p.status === \"measured\" && p.points >= 10).map((p) => p.said);\n    const weak = s.parts.filter((p) => p.status === \"measured\" && p.points < 10).map((p) => p.said);\n    if (good.length) lines.push(\"Good - \" + good.join(\" \"));\n    if (weak.length) lines.push(\"Could be better - \" + weak.join(\" \"));\n    if (s.fixes.length) lines.push(\"Best next step: \" + s.fixes[0]);\n    else if (s.scored) lines.push(\"Nothing to improve among the things measured - that is not the same as everything being right.\");\n    const unk = s.checks.filter((c) => c.status === \"unknown\");\n    if (unk.length) lines.push(\"Unknown: \" + unk.map((c) => c.detail || c.title).join(\"; \") + \".\");\n    lines.push(\"Not scored, the plan cannot show it: the sink, dishwasher and washing machine, the work triangle, appliance door swings. These are this planner's rules, not yet reviewed by a kitchen designer.\");\n    return lines.join(\"\\n\");\n  }\n\n  // v2/src/model/kitchen-gen.js\n  var GEN = {\n    baseD: 560,\n    wallD: 300,\n    wallY: 1400,\n    cornerArm: 1e3,\n    aisle: 1050,\n    islandClear: 1e3,\n    minRun: 300,\n    minCab: 300,\n    maxCab: 1e3,\n    step: 50,\n    sideReserve: 900\n  };\n  var LAYOUTS = [\n    { key: \"line\", name: \"One wall\" },\n    { key: \"L-left\", name: \"L-shaped, left corner\" },\n    { key: \"L-right\", name: \"L-shaped, right corner\" },\n    { key: \"U\", name: \"U-shaped\" },\n    { key: \"galley\", name: \"Two walls\" },\n    { key: \"island\", name: \"L-shape with island\" },\n    { key: \"line-island\", name: \"One wall with island\" }\n  ];\n  var f50 = (v) => Math.floor(v / 50) * 50;\n  var sizeOf = (room) => ({ width: room.width, depth: room.depth, height: room.height || 2400 });\n  function sideLen(R4) {\n    return f50(Math.min(R4.depth - GEN.sideReserve, 3200));\n  }\n  function layoutFits(key, room) {\n    const W2 = room.width, D2 = room.depth, S2 = sideLen(room);\n    const island = newUnit(\"island\");\n    const islandRoom = D2 >= GEN.baseD + GEN.aisle + island.d + GEN.islandClear && W2 >= island.w + 2 * 900;\n    if (key === \"line\") return W2 >= 1800;\n    if (key === \"L-left\" || key === \"L-right\") return W2 >= 2200 && S2 >= GEN.cornerArm + 600;\n    if (key === \"U\") return W2 >= 2 * GEN.cornerArm + 800 && S2 >= GEN.cornerArm + 600;\n    if (key === \"galley\") return W2 >= 2 * GEN.baseD + 1100 && W2 <= 3800 && S2 >= 1800;\n    if (key === \"island\") return W2 >= 2200 && S2 >= GEN.cornerArm + 600 && islandRoom;\n    if (key === \"line-island\") return W2 >= 1800 && islandRoom;\n    return false;\n  }\n  function seeded(seed) {\n    let s = Number(seed) >>> 0 || 1;\n    return function() {\n      s ^= s << 13;\n      s >>>= 0;\n      s ^= s >> 17;\n      s ^= s << 5;\n      s >>>= 0;\n      return s / 4294967296;\n    };\n  }\n  function poseOn(u, wall, p, room) {\n    u.y = u.family === \"wall\" ? GEN.wallY : 0;\n    if (wall === \"back\") {\n      u.rot = 0;\n      u.x = p;\n      u.z = 0;\n    }\n    if (wall === \"left\") {\n      u.rot = 3;\n      u.x = 0;\n      u.z = p;\n    }\n    if (wall === \"right\") {\n      u.rot = 1;\n      u.x = room.width - u.d;\n      u.z = p;\n    }\n    u.run = wall === \"back\" ? \"main\" : \"\";\n    return u;\n  }\n  function inRoom(u, room) {\n    return footBoxes(u).every((b) => b.x0 >= -0.5 && b.z0 >= -0.5 && b.x1 <= room.width + 0.5 && b.z1 <= room.depth + 0.5);\n  }\n  function clashes(u, units, zones) {\n    if (zones.some((zn) => unitInZone(u, zn))) return true;\n    return units.some((v) => sameLevel(u, v) && overlaps(u, v));\n  }\n  function freeSpans(kind, wall, a, b, room, zones) {\n    const spans2 = [];\n    let s = null;\n    for (let p = a; p + GEN.step <= b; p += GEN.step) {\n      const probe = poseOn(proto(kind, GEN.step), wall, p, room);\n      const blocked = zones.some((zn) => unitInZone(probe, zn));\n      if (!blocked && s == null) s = p;\n      if (blocked && s != null) {\n        spans2.push([s, p]);\n        s = null;\n      }\n    }\n    if (s != null) spans2.push([s, f50(b)]);\n    return spans2.filter((x) => x[1] - x[0] >= GEN.minRun);\n  }\n  function proto(kind, w) {\n    const u = newUnit(kind === \"wall\" ? \"wall\" : kind);\n    u.w = w;\n    u.id = \"__gen\";\n    return u;\n  }\n  function splitWidths(len, rnd) {\n    const L = f50(len);\n    if (L < GEN.minCab) return [];\n    let n = Math.max(1, Math.round(L / (rnd && rnd() < 0.35 ? 800 : 600)));\n    while (n > 1 && L / n < 400) n--;\n    while (L / n > GEN.maxCab) n++;\n    const base = f50(L / n);\n    const out = new Array(n).fill(base);\n    let rest = L - base * n;\n    for (let i = 0; rest >= 50; i = (i + 1) % n) {\n      out[i] += 50;\n      rest -= 50;\n    }\n    return out;\n  }\n  function cabinet2(type, w) {\n    const u = newUnit(type);\n    u.w = w;\n    if (type === \"base\" || type === \"wall\") u.doors = w > 600 ? 2 : 1;\n    if (type !== \"base-4drawer\" && type !== \"island\" && type !== \"base-oven\") u.door = true;\n    return u;\n  }\n  function buildRuns(key, room) {\n    const W2 = room.width, S2 = sideLen(room), A = GEN.cornerArm, runs = [], corners = [];\n    const back = (a, b, open) => ({ wall: \"back\", a, b, open });\n    if (key === \"line\" || key === \"line-island\") runs.push(back(0, f50(W2), \"b\"));\n    if (key === \"L-left\" || key === \"island\") {\n      corners.push(\"left\");\n      runs.push(back(A, f50(W2), \"b\"), { wall: \"left\", a: A, b: S2, open: \"b\" });\n    }\n    if (key === \"L-right\") {\n      corners.push(\"right\");\n      runs.push(back(0, f50(W2 - A), \"a\"), { wall: \"right\", a: A, b: S2, open: \"b\" });\n    }\n    if (key === \"U\") {\n      corners.push(\"left\", \"right\");\n      runs.push(back(A, f50(W2 - A), null), { wall: \"left\", a: A, b: S2, open: \"b\" }, { wall: \"right\", a: A, b: S2, open: \"b\" });\n    }\n    if (key === \"galley\") runs.push({ wall: \"left\", a: 0, b: S2, open: \"b\" }, { wall: \"right\", a: 0, b: S2, open: \"b\" });\n    return { runs: runs.filter((r) => r.b - r.a >= GEN.minRun), corners };\n  }\n  function cornerUnits(side, room) {\n    const A = GEN.cornerArm, out = [];\n    for (const type of [\"corner-l\", \"corner-wall\"]) {\n      const u = newUnit(type);\n      u.w = A;\n      u.w2 = A;\n      u.d = type === \"corner-l\" ? GEN.baseD : GEN.wallD;\n      u.y = type === \"corner-wall\" ? GEN.wallY : 0;\n      u.door = true;\n      u.run = \"main\";\n      if (side === \"left\") {\n        u.rot = 3;\n        u.x = 0;\n        u.z = 0;\n      } else {\n        u.rot = 0;\n        u.x = room.width - A;\n        u.z = 0;\n      }\n      out.push(u);\n    }\n    return out;\n  }\n  function genCandidate(key, room, opt) {\n    const o = opt || {};\n    const rnd = o.rnd || seeded(o.seed || 1);\n    if (!layoutFits(key, room)) return null;\n    const zones = openingZones(room, sizeOf(room));\n    const units = [];\n    const put = (u) => {\n      if (!inRoom(u, room) || clashes(u, units, zones)) return false;\n      units.push(u);\n      return true;\n    };\n    const { runs, corners } = buildRuns(key, room);\n    const wallCorner = {};\n    for (const side of corners) for (const u of cornerUnits(side, room)) {\n      if (put(u)) {\n        if (u.type === \"corner-wall\") wallCorner[side] = true;\n      } else if (u.type === \"corner-l\") return null;\n    }\n    const talls = o.talls === false ? [] : [\"tall-fridge\", \"tall-pantry\"];\n    const tallRuns = runs.filter((r) => r.open).sort((p, q) => q.b - q.a - (p.b - p.a));\n    const tallAt = {};\n    for (const r of tallRuns) {\n      if (!talls.length || r.b - r.a < 1500) continue;\n      const set = r.b - r.a >= 600 * talls.length + 900 ? talls : talls.slice(0, 1);\n      const tw = 600 * set.length;\n      const p0 = r.open === \"b\" ? f50(r.b - tw) : r.a;\n      const block = set.map((t, i) => poseOn(cabinet2(t, 600), r.wall, p0 + 600 * i, room));\n      const ok2 = block.every((u) => inRoom(u, room) && !clashes(u, units.concat(block.filter((v) => v !== u)), zones));\n      if (ok2) {\n        block.forEach((u) => units.push(u));\n        tallAt[r.wall] = r.open === \"b\" ? [p0, r.b] : [r.a, r.a + tw];\n        break;\n      }\n    }\n    const longest = runs.slice().sort((p, q) => q.b - q.a - (p.b - p.a))[0];\n    let bankDone = false;\n    const ovenAt = {};\n    let ovenDone = o.cooking === false;\n    for (const r of runs.slice().sort((p, q) => q.b - q.a - (p.b - p.a))) {\n      const t = tallAt[r.wall];\n      const parts = t ? r.open === \"b\" ? [[r.a, t[0]]] : [[t[1], r.b]] : [[r.a, r.b]];\n      for (const [a, b] of parts) {\n        const spans2 = freeSpans(\"base\", r.wall, a, b, room, zones);\n        for (const [s0, s1] of spans2.slice().sort((p, q) => q[1] - q[0] - (p[1] - p[0]))) {\n          let widths = splitWidths(s1 - s0, rnd), cook = -1;\n          if (!ovenDone && s1 - s0 >= OVEN_BASE.w + 2 * GEN.minCab) {\n            const len = f50(s1 - s0) - OVEN_BASE.w;\n            const hoodOk = freeSpans(\"wall\", r.wall, s0, s1, room, zones);\n            let left = null;\n            for (let d = 0; d <= len && left == null; d += GEN.step) for (const sg of [1, -1]) {\n              const l = f50(len / 2) + sg * d;\n              if (l < GEN.minCab || len - l < GEN.minCab) continue;\n              const x0 = s0 + l, x1 = x0 + OVEN_BASE.w;\n              if (hoodOk.some(([a2, b2]) => a2 <= x0 && b2 >= x1)) {\n                left = l;\n                break;\n              }\n            }\n            const L = left != null ? splitWidths(left, rnd) : [], Rt = left != null ? splitWidths(len - left, rnd) : [];\n            if (L.length && Rt.length) {\n              widths = L.concat([OVEN_BASE.w], Rt);\n              cook = L.length;\n            }\n          }\n          let p = s0;\n          const mid = Math.floor(widths.length / 2);\n          widths.forEach((w, i) => {\n            let type = \"base\";\n            if (i === cook) type = \"base-oven\";\n            else if (!bankDone && (cook >= 0 ? i === cook + 1 || i === cook - 1 && widths[cook + 1] < 450 : o.cooking === false && r === longest && i === mid) && w >= 450) {\n              type = \"base-4drawer\";\n              bankDone = true;\n            } else if (w >= 450 && w <= 600 && rnd() < 0.3) type = \"base-drawer\";\n            const u = poseOn(cabinet2(type, w), r.wall, p, room);\n            if (type === \"base-oven\") {\n              const L = ovenHobLayout(u, {});\n              if (o.hood !== false) u.hood = true;\n              const hl = ovenHobLayout(u, {});\n              if (u.hood && (!hl || !hl.hood || sizeOf(room).height - LEG_H - hl.hood.y0 < APPLIANCES.hood.total[0])) delete u.hood;\n              if (L && put(u)) {\n                ovenDone = true;\n                ovenAt[r.wall] = [p, p + w];\n              }\n            } else put(u);\n            p += w;\n          });\n        }\n      }\n    }\n    if (o.walls !== false) for (const r of runs) {\n      const t = tallAt[r.wall], hob = ovenAt[r.wall];\n      let parts = t ? r.open === \"b\" ? [[r.a, t[0]]] : [[t[1], r.b]] : [[r.a, r.b]];\n      if (hob) parts = parts.flatMap(([a, b]) => [[a, Math.min(b, hob[0])], [Math.max(a, hob[1]), b]]).filter(([a, b]) => b - a >= GEN.minRun);\n      for (const [a, b] of parts) {\n        for (const [s0, s1] of freeSpans(\"wall\", r.wall, a, b, room, zones)) {\n          let p = s0;\n          for (const w of splitWidths(s1 - s0, rnd)) {\n            put(poseOn(cabinet2(\"wall\", w), r.wall, p, room));\n            p += w;\n          }\n        }\n      }\n    }\n    if (key === \"island\" || key === \"line-island\") {\n      const isl = newUnit(\"island\");\n      isl.rot = 0;\n      isl.y = 0;\n      isl.run = \"main\";\n      isl.x = f50((room.width - isl.w) / 2) + (key === \"island\" ? f50(GEN.baseD / 2) : 0);\n      isl.z = GEN.baseD + GEN.aisle;\n      if (isl.z + isl.d + GEN.islandClear > room.depth || !put(isl)) return null;\n    }\n    return units.length ? { key, units } : null;\n  }\n  function validKitchen(units, room) {\n    const zones = openingZones(room, sizeOf(room));\n    for (let i = 0; i < units.length; i++) {\n      const u = units[i];\n      if (!inRoom(u, room)) return { ok: false, why: \"outside the room: \" + u.type };\n      if (zones.some((zn) => unitInZone(u, zn))) return { ok: false, why: \"in a window or door zone: \" + u.type };\n      for (let j = i + 1; j < units.length; j++) if (sameLevel(u, units[j]) && overlaps(u, units[j])) return { ok: false, why: \"overlap: \" + u.type + \" / \" + units[j].type };\n    }\n    return { ok: true };\n  }\n  function generateKitchens(room, opt) {\n    const keep = UID;\n    try {\n      return generateInner(room, opt);\n    } finally {\n      setUid(keep);\n    }\n  }\n  function generateInner(room, opt) {\n    const o = opt || {};\n    const count = o.count || 4;\n    const seed = Number(o.seed) || 1;\n    const keys2 = o.layout && o.layout !== \"auto\" ? [o.layout] : LAYOUTS.map((l) => l.key);\n    const out = [];\n    keys2.forEach((key, ki) => {\n      let best = null;\n      for (let s = 0; s < (o.tries || 4); s++) {\n        const c = genCandidate(key, room, { rnd: seeded(seed * 7919 + ki * 104729 + s * 15485863), talls: o.talls, walls: o.walls, cooking: o.cooking, hood: o.hood });\n        if (!c || !validKitchen(c.units, room).ok) continue;\n        const sc = scoreKitchen(c.units, room);\n        if (sc.blocked) continue;\n        if (!best || sc.total > best.score.total) best = { key, name: LAYOUTS.find((l) => l.key === key).name, units: c.units, score: sc };\n      }\n      if (best) out.push(best);\n    });\n    out.sort((a, b) => b.score.total - a.score.total);\n    return out.slice(0, count);\n  }\n\n  // v2/src/interact/cmd-generate.js\n  function installGenerateCommands(ctx) {\n    const scene = ctx.scene, st = ctx.st, define = ctx.commands.define, cue = ctx.cue;\n    const roomNow = () => {\n      const r = scene.room || {};\n      return { width: r.width || 3600, depth: r.depth || 3e3, height: r.height || 2400, openings: Array.isArray(r.openings) ? r.openings : [] };\n    };\n    define(\"kitchenVariants\", {\n      history: null,\n      args: {\n        layout: \"auto | line | L-left | L-right | U | galley | island | line-island\",\n        seed: \"\\u0447\\u0438\\u0441\\u043B\\u043E: \\u0434\\u0440\\u0443\\u0433\\u043E\\u0439 \\u043D\\u0430\\u0431\\u043E\\u0440\",\n        cooking: \"false: \\u0431\\u0435\\u0437 \\u0448\\u043A\\u0430\\u0444\\u0430 \\u0434\\u0443\\u0445\\u043E\\u0432\\u043A\\u0430 + \\u0432\\u0430\\u0440\\u043E\\u0447\\u043D\\u0430\\u044F (\\u0443 \\u0447\\u0435\\u043B\\u043E\\u0432\\u0435\\u043A\\u0430 \\u0441\\u0432\\u043E\\u044F \\u043F\\u043B\\u0438\\u0442\\u0430)\",\n        hood: \"false: \\u0431\\u0435\\u0437 \\u0432\\u044B\\u0442\\u044F\\u0436\\u043A\\u0438 (\\u0432\\u044B\\u0442\\u044F\\u0436\\u043A\\u0430 \\u0438\\u043D\\u0430\\u0447\\u0435)\"\n      },\n      doc: \"\\u0412\\u043E\\u043B\\u0448\\u0435\\u0431\\u043D\\u0430\\u044F \\u043F\\u0430\\u043B\\u043E\\u0447\\u043A\\u0430: \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u044B \\u0446\\u0435\\u043B\\u043E\\u0439 \\u043A\\u0443\\u0445\\u043D\\u0438 \\u0434\\u043B\\u044F \\u044D\\u0442\\u043E\\u0439 \\u043A\\u043E\\u043C\\u043D\\u0430\\u0442\\u044B (\\u043D\\u0438\\u0447\\u0435\\u0433\\u043E \\u043D\\u0435 \\u043C\\u0435\\u043D\\u044F\\u0435\\u0442; applyKitchen \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u044F\\u0435\\u0442)\",\n      run(a) {\n        const room = roomNow();\n        const vs = generateKitchens(room, {\n          layout: a && a.layout || \"auto\",\n          seed: Number(a && a.seed) || 1,\n          count: 4,\n          cooking: a && a.cooking === false ? false : void 0,\n          hood: a && a.hood === false ? false : void 0\n        });\n        st.wand = { at: Date.now(), roomKey: JSON.stringify(room), variants: vs };\n        if (!vs.length) {\n          cue(\"This room is too small for a whole kitchen - make the room wider first (at least 1800 mm).\");\n          return { ok: false, why: \"room too small\" };\n        }\n        return { ok: true, variants: vs.map((v, i) => ({ index: i, key: v.key, name: v.name, score: v.score.total, cabinets: v.units.length, hint: v.score.hint, units: v.units })) };\n      }\n    });\n    define(\"applyKitchen\", {\n      history: \"magic wand\",\n      args: { index: \"\\u043D\\u043E\\u043C\\u0435\\u0440 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430 \\u0438\\u0437 kitchenVariants\" },\n      doc: \"\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u043A\\u0443\\u0445\\u043D\\u0438 \\u0432\\u043C\\u0435\\u0441\\u0442\\u043E \\u043F\\u043B\\u0430\\u043D\\u0430 (\\u043E\\u0434\\u043D\\u0430 \\u043E\\u0442\\u043C\\u0435\\u043D\\u0430 \\u0432\\u043E\\u0437\\u0432\\u0440\\u0430\\u0449\\u0430\\u0435\\u0442 \\u043F\\u0440\\u0435\\u0436\\u043D\\u0438\\u0439 \\u043F\\u043B\\u0430\\u043D)\",\n      run(a) {\n        const w = st.wand;\n        const i = Math.max(0, Number(a && a.index) || 0);\n        if (!w || !w.variants || !w.variants[i]) return { ok: false, why: \"no variant - ask for kitchens first\" };\n        if (w.roomKey !== JSON.stringify(roomNow())) return { ok: false, why: \"the room changed - ask for kitchens again\" };\n        if (scene.explode > 0) {\n          cue(\"Close the exploded view first.\");\n          return { ok: false, why: \"exploded\" };\n        }\n        const v = w.variants[i];\n        const room = roomNow();\n        if (!validKitchen(v.units, room).ok) return { ok: false, why: \"not valid in this room\" };\n        ctx.hist.run(\"magic wand\", () => {\n          const fresh = JSON.parse(JSON.stringify(v.units));\n          const used = /* @__PURE__ */ new Set();\n          for (const u of fresh) {\n            let id;\n            do {\n              id = \"U\" + nextUid();\n            } while (used.has(id));\n            used.add(id);\n            u.id = id;\n            u.explode = 0;\n          }\n          scene.units.length = 0;\n          for (const u of fresh) scene.units.push(u);\n          resolveFinishes(scene.units, scene.kitchen);\n          scene.selectedId = fresh[0] ? fresh[0].id : null;\n          scene.activeRun = \"main\";\n        });\n        ctx.settle();\n        cue(\"Magic wand: \" + v.name + \", \" + v.units.length + \" cabinets, score \" + v.score.total + \". Undo puts your plan back.\");\n        ctx.syncControls();\n        ctx.refresh();\n        try {\n          if (ctx.view && ctx.view.fitKitchen) ctx.view.fitKitchen(true);\n          ctx.frame();\n        } catch {\n        }\n        return { ok: true, key: v.key, cabinets: v.units.length, score: v.score.total };\n      }\n    });\n    define(\"kitchenScore\", {\n      history: null,\n      doc: \"\\u041E\\u0446\\u0435\\u043D\\u043A\\u0430 \\u043A\\u0443\\u0445\\u043D\\u0438 v2: \\u0436\\u0451\\u0441\\u0442\\u043A\\u0438\\u0435 \\u043F\\u0440\\u043E\\u0432\\u0435\\u0440\\u043A\\u0438 \\u043E\\u0442\\u0434\\u0435\\u043B\\u044C\\u043D\\u043E, \\u0441\\u043E\\u0432\\u0435\\u0442\\u044B 0\\u2013100 \\u043F\\u043E \\u0438\\u0437\\u043C\\u0435\\u0440\\u0435\\u043D\\u043D\\u043E\\u043C\\u0443, \\u043D\\u0435\\u0438\\u0437\\u0432\\u0435\\u0441\\u0442\\u043D\\u043E\\u0435 \\u043D\\u0430\\u0437\\u0432\\u0430\\u043D\\u043E; \\u0446\\u0435\\u043D\\u0430 \\u0438 \\u043E\\u0442\\u0434\\u0435\\u043B\\u043A\\u0430 \\u043D\\u0435 \\u0441\\u0447\\u0438\\u0442\\u0430\\u044E\\u0442\\u0441\\u044F\",\n      run() {\n        return { ok: true, ...scoreKitchen(scene.units, roomNow(), scene.kitchen) };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-build.js\n  function installBuildCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue || (() => {\n    });\n    define(\"toggleHardwareXray\", {\n      history: null,\n      doc: \"Hardware X-ray: every board faint, the hinges, runners and legs solid (pro edition)\",\n      run() {\n        scene.hardwareXray = !scene.hardwareXray;\n        cue(scene.hardwareXray ? \"Hardware X-ray: on - the boards are faint, the hinges, runners and legs show\" : \"Hardware X-ray: off\");\n        if (ctx.syncControls) ctx.syncControls();\n        if (ctx.refresh) ctx.refresh();\n        return { ok: true, on: !!scene.hardwareXray };\n      }\n    });\n    define(\"setKitchenBuild\", {\n      history: \"construction\",\n      args: { carcass: \"between | over | standard\", back: \"groove | rabbet | overlay | inset | standard\" },\n      doc: \"Whole kitchen: how the carcass is built (top and bottom between or over the sides; the back) - the workshop standard when not set; one Undo\",\n      run(a) {\n        a = a || {};\n        const next = normBuild(kitchenOf2(scene.kitchen).build);\n        for (const k of Object.keys(BUILD_CHOICES)) {\n          if (!(k in a)) continue;\n          const v = a[k] == null || a[k] === \"standard\" ? null : String(a[k]);\n          if (!buildOk(k, v)) {\n            const why = \"Unknown \" + k + \" choice: \" + v;\n            cue(why);\n            return { ok: false, why };\n          }\n          if (v == null) delete next[k];\n          else next[k] = v;\n        }\n        const before = JSON.stringify(normBuild(kitchenOf2(scene.kitchen).build));\n        if (JSON.stringify(next) === before) return { ok: true, build: next, changed: false };\n        ctx.hist.run(\"construction\", () => {\n          const k = { ...scene.kitchen || {} };\n          if (Object.keys(next).length) k.build = next;\n          else delete k.build;\n          scene.kitchen = k;\n          resolveFinishes(scene.units, scene.kitchen);\n        });\n        if (ctx.syncControls) ctx.syncControls();\n        if (ctx.refresh) ctx.refresh();\n        return { ok: true, build: next, changed: true };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-cutouts.js\n  function installCutoutCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue || (() => {\n    });\n    const unitOf = (a) => a && a.id ? (scene.units || []).find((x) => x.id === a.id) : ctx.sel();\n    const refuse = (why) => {\n      cue(why);\n      return { ok: false, why };\n    };\n    const redraw = () => {\n      if (ctx.syncControls) ctx.syncControls();\n      if (ctx.refresh) ctx.refresh();\n    };\n    define(\"addCutout\", {\n      history: \"cut-out\",\n      args: { id: \"cabinet id (absent = the selected)\", panel: \"side-left | side-right | back | bottom | top\", pts: \"[[x, y], ...] mm in the panel's cut-out frame, at least 3\" },\n      doc: \"A bespoke cut-out on one carcass board of a cabinet (pro edition): a hole, or a notch open onto the board's edge; one Undo\",\n      run(a) {\n        a = a || {};\n        const u = unitOf(a);\n        if (!u) return refuse(\"Select a cabinet first\");\n        if (!cutoutPanelsOf(u).includes(a.panel)) {\n          return refuse(cutoutPanelsOf(u).length ? \"This cabinet has no \" + String(PANEL_LABEL[a.panel] || a.panel).toLowerCase() + \" board to cut\" : \"Cut-outs are not available on this cabinet type yet\");\n        }\n        const [c] = normCutouts([{ panel: a.panel, pts: a.pts }]);\n        if (!c) return refuse(\"A cut-out needs at least three corners\");\n        const have = normCutouts(u.cutouts);\n        let n = have.length + 1;\n        while (have.some((x) => x.id === \"cut-\" + n)) n++;\n        c.id = \"cut-\" + n;\n        const next = have.concat([c]);\n        const v = cutoutVerdicts({ ...u, cutouts: next }, carcassRawFor(u), u.d).find((x) => x.id === c.id);\n        if (!v || !v.kind) return refuse(\"Not cut: \" + (v ? v.why : \"the board was not found\"));\n        ctx.hist.run(\"cut-out\", () => {\n          u.cutouts = next;\n        });\n        cue((v.kind === \"hole\" ? \"Hole\" : \"Notch\") + \" cut in the \" + PANEL_LABEL[c.panel].toLowerCase());\n        redraw();\n        return { ok: true, cut: c.id, kind: v.kind };\n      }\n    });\n    define(\"removeCutout\", {\n      history: \"cut-out\",\n      args: { id: \"cabinet id (absent = the selected)\", cut: \"the cut-out's id\" },\n      doc: \"Take one bespoke cut-out off a cabinet; one Undo\",\n      run(a) {\n        a = a || {};\n        const u = unitOf(a);\n        if (!u) return refuse(\"Select a cabinet first\");\n        const have = normCutouts(u.cutouts);\n        if (!have.some((x) => x.id === a.cut)) return { ok: false, why: \"unchanged\" };\n        const next = have.filter((x) => x.id !== a.cut);\n        ctx.hist.run(\"cut-out\", () => {\n          if (next.length) u.cutouts = next;\n          else delete u.cutouts;\n        });\n        cue(\"Cut-out removed\");\n        redraw();\n        return { ok: true };\n      }\n    });\n  }\n\n  // v2/src/model/fixings.js\n  var FIXINGS = Object.freeze([[\"cabineo\", \"Lamello Cabineo 12\"], [\"screws\", \"Screws\"]]);\n  var fixingOk = (v) => FIXINGS.some((f) => f[0] === v);\n  var fixingLabel = (v) => (FIXINGS.find((f) => f[0] === v) || [null, null])[1];\n  var SCREW_PILOT = Object.freeze({\n    dia: 3,\n    faceOnly: true,\n    blind: true,\n    /* depth by board thickness - ONLY the thicknesses the workshop has answered; anything else is open */\n    depthByThickness: Object.freeze({ 18: 9 }),\n    /* the owner 25.10.2026: \u00ABSomething around 300 millimeters, each 300 millimeters\u00BB - NOMINAL centres; not an exact pitch, not a\n       maximum, and with no end offset, count or short-joint rule */\n    spacingNominal: 300,\n    positions: null,\n    status: \"pending\",\n    known: Object.freeze([\n      \"\\xD83 mm pilot holes - workshop policy for ordinary wood screws (owner 13.09.2026; human 25.10.2026 \\xAB3 millimetre drill bit\\xBB)\",\n      \"Depth 9 mm, blind, on an 18 mm board (human 25.10.2026) - other thicknesses not decided\",\n      \"On panel faces only - never on an edge; no confirmat, dowel or countersink (human 25.10.2026)\",\n      \"Spacing about 300 mm between screws (owner 25.10.2026: \\xABaround 300 millimeters, each 300\\xBB) - nominal\"\n    ]),\n    open: Object.freeze([\n      \"Positions: how far the first and last screw sit from the joint's ends, how many on a joint, and the rule for short joints (rails) - not decided yet\",\n      \"Face: drilled from the joint's outside face into the meeting board, or from the inside - not recorded\",\n      \"Depth on boards other than 18 mm - not decided\"\n    ])\n  });\n  function fixingOf(u) {\n    const v = u && fixingOk(u.fixing) ? u.fixing : null;\n    if (!v) return { choice: null, label: \"Current construction (not chosen)\", ops: \"as the workshop converter builds this cabinet today\", pending: [] };\n    if (v === \"cabineo\") return { choice: v, label: fixingLabel(v), ops: \"Cabineo seats and pins from the workshop's preset (the converter's)\", pending: [] };\n    return {\n      choice: v,\n      label: fixingLabel(v),\n      ops: \"\\xD83 mm \\xD7 9 mm blind pilot holes on faces only (18 mm board) - no hole is placed until the positions are decided\",\n      pending: SCREW_PILOT.open.slice(),\n      pilot: SCREW_PILOT\n    };\n  }\n\n  // v2/src/interact/cmd-fixing.js\n  function installFixingCommands(ctx) {\n    const scene = ctx.scene, define = ctx.commands.define, cue = ctx.cue || (() => {\n    });\n    const unitOf = (a) => a && a.id ? (scene.units || []).find((x) => x.id === a.id) : ctx.sel();\n    define(\"setUnitFixing\", {\n      history: \"fixing\",\n      args: { id: \"cabinet id (absent = the selected)\", fixing: \"cabineo | screws\" },\n      doc: \"Ironmongery - Fixings: how this cabinet's carcass boards are joined (Lamello Cabineo 12, or screws on \\xD83 face pilots); one Undo\",\n      run(a) {\n        a = a || {};\n        const u = unitOf(a);\n        if (!u) {\n          const why = \"Select a cabinet first\";\n          cue(why);\n          return { ok: false, why };\n        }\n        const v = String(a.fixing || \"\");\n        if (!fixingOk(v)) {\n          const why = \"Unknown fixing: \" + v + \" (Cabineo or Screws)\";\n          cue(why);\n          return { ok: false, why };\n        }\n        if (u.fixing === v) return { ok: true, changed: false, fixing: v };\n        ctx.hist.run(\"fixing\", () => {\n          u.fixing = v;\n        });\n        cue(\"Fixings: \" + fixingLabel(v));\n        if (ctx.syncControls) ctx.syncControls();\n        if (ctx.refresh) ctx.refresh();\n        return { ok: true, changed: true, fixing: v, id: u.id };\n      }\n    });\n  }\n\n  // v2/src/interact/cmd-index.js\n  function installCommandSet(ctx) {\n    installUnitCommands(ctx);\n    installFrontCommands(ctx);\n    installGlassCommands(ctx);\n    installInteriorCommands(ctx);\n    installRoomCommands(ctx);\n    installRoomEditCommands(ctx);\n    installRoomObjectCommands(ctx);\n    installRoomLayoutCommands(ctx);\n    installFinishCommands(ctx);\n    installPlanCommands(ctx);\n    installDrawerBoxCommands(ctx);\n    installGolaCommands(ctx);\n    installWorktopCommands(ctx);\n    installApplianceCommands(ctx);\n    installSplashCommands(ctx);\n    installGenerateCommands(ctx);\n    installBuildCommands(ctx);\n    installCutoutCommands(ctx);\n    installFixingCommands(ctx);\n    return ctx.commands;\n  }\n\n  // v2/src/interact/inside-tools.js\n  var INSIDE_TOOLS = [\"select\", \"shelf\", \"divider\", \"hdivider\", \"edit\"];\n  var PLACE_TOOLS = [\"shelf\", \"divider\", \"hdivider\"];\n  var TOOL_WORD = { shelf: \"shelf\", divider: \"vertical divider\", hdivider: \"horizontal divider\" };\n  var CLICK_PX = 5;\n  var PICK_PX = 7;\n  function grow(b, pad) {\n    return { x0: b.x0 - pad, x1: b.x1 + pad, y0: b.y0 - pad, y1: b.y1 + pad, z0: b.z0 - pad, z1: b.z1 + pad };\n  }\n  function installInsideTools(ctx) {\n    const scene = ctx.scene, st = ctx.st, hist = ctx.hist;\n    st.insideTool = null;\n    st.place = null;\n    st.placeDown = null;\n    function tool() {\n      return st.insideTool;\n    }\n    function placing() {\n      return PLACE_TOOLS.indexOf(st.insideTool) >= 0;\n    }\n    function clearGhost() {\n      const had = !!(st.place || scene.placeGhost);\n      st.place = null;\n      scene.placeGhost = null;\n      return had;\n    }\n    const QUIET = { shelf: 1, divider: 1, hdivider: 1, select: 1 };\n    const say = (t) => {\n      st.placeWords = t || \"\";\n      ctx.cue(null);\n    };\n    function toolHint() {\n      if (QUIET[st.insideTool]) return \"\";\n      if (st.insideTool === \"shelf\") return \"Adding a shelf - move the pointer inside a cabinet and click at the height you want it. Esc to stop.\";\n      if (st.insideTool === \"divider\") return \"Adding a vertical divider - move the pointer inside a cabinet and click where you want it. Esc to stop.\";\n      if (st.insideTool === \"hdivider\") return \"Adding a horizontal divider - a fixed board side to side; move the pointer inside a cabinet and click at the height you want. Esc to stop.\";\n      if (st.insideTool === \"select\") return \"Select a shelf or divider and drag it, or type a gap. Arrow keys move it; Delete removes it.\";\n      if (st.insideTool === \"edit\") return \"Editing this part - drag it up or down, drag a shelf's front edge for its depth, or click a number to type it. Click anywhere else to finish.\";\n      return \"\";\n    }\n    function setTool(name2) {\n      const t = INSIDE_TOOLS.indexOf(name2) >= 0 ? name2 : null;\n      if (t && scene.explode > 0) {\n        ctx.cue(\"Exploded view is a preview - set it back to Assembled to place shelves\");\n        return { ok: false, why: \"exploded\" };\n      }\n      st.insideTool = t;\n      scene.insideTool = t;\n      scene.partsMode = !!scene.sizeMode || !!t;\n      if (t && ctx.measure && ctx.measure.modeLeft) ctx.measure.modeLeft();\n      if (!scene.partsMode) {\n        scene.hoverPart = null;\n        scene.selPart = null;\n      }\n      st.placeDown = null;\n      clearGhost();\n      if (PLACE_TOOLS.indexOf(t) >= 0) {\n        scene.hoverPart = null;\n      }\n      ctx.cue(t ? toolHint() : null);\n      ctx.changed(\"handles\");\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true, tool: t };\n    }\n    function exitEdit() {\n      if (st.insideTool !== \"edit\") return false;\n      scene.selPart = null;\n      scene.hoverPart = null;\n      st.shelfEdgeHover = false;\n      st.editAway = null;\n      setTool(null);\n      return true;\n    }\n    function enterEdit() {\n      return setTool(\"edit\");\n    }\n    function modeLeft() {\n      if (st.insideTool) {\n        st.insideTool = null;\n        scene.insideTool = null;\n        st.placeDown = null;\n        clearGhost();\n        scene.partsMode = !!scene.sizeMode;\n      }\n    }\n    function rayAt(cx, cy) {\n      return ctx.pointerRay(cx, cy);\n    }\n    function interiorUnder(cx, cy) {\n      const ray = rayAt(cx, cy);\n      if (!ray) return null;\n      let best = null;\n      for (const u of scene.units) {\n        const h = interiorRayHit(u, ray);\n        if (h && (!best || h.t < best.t)) best = { u, t: h.t, p: h.p, B: h.B };\n      }\n      return best;\n    }\n    function placementAt(cx, cy) {\n      const h = interiorUnder(cx, cy);\n      if (!h) return null;\n      const pl = st.insideTool === \"shelf\" ? shelfPlacement(h.u, h.p) : st.insideTool === \"hdivider\" ? hDividerPlacement(h.u, h.p) : dividerPlacement(h.u, h.p);\n      return { u: h.u, pl, kind: st.insideTool, lp: h.p };\n    }\n    function interiorPartUnder(cx, cy) {\n      const ray = rayAt(cx, cy);\n      if (!ray) return null;\n      const cs = ctx.canvasSize(), hPx = cs && cs.h || 600;\n      const vk = ctx.cam && ctx.cam() && ctx.cam().viewScale > 0 ? ctx.cam().viewScale : 1;\n      const mmPerPxAt = (t) => 2 * Math.tan(FOVY / 2) * Math.max(t, 1) / (hPx * vk);\n      let best = null, near2 = null;\n      for (const u of scene.units) {\n        const lShelf = isCornerShelfUnit(u);\n        if (placeWhy(u) && !lShelf) continue;\n        for (const p of cabinetParts(u)) {\n          if (p.kind !== \"shelf\" && p.kind !== \"fixed-v\" && p.kind !== \"fixed-h\") continue;\n          const t = rayAABB(ray, p.box);\n          if (t !== null) {\n            if (!best || t < best.t) best = { u, part: p, t };\n            continue;\n          }\n          const t0 = rayAABB(ray, grow(p.box, 80));\n          if (t0 === null) continue;\n          const t1 = rayAABB(ray, grow(p.box, PICK_PX * mmPerPxAt(t0)));\n          if (t1 !== null && (!near2 || t1 < near2.t)) near2 = { u, part: p, t: t1 };\n        }\n      }\n      return best || near2;\n    }\n    function describe(pl, kind, u) {\n      const who = displayName(scene.units, u);\n      if (!pl.ok) return pl.why;\n      if (kind === \"shelf\")\n        return \"Shelf in \" + who + (pl.bay !== \"this cabinet\" ? \", \" + pl.bay : \"\") + \" at \" + pl.y + \" mm - click to place\";\n      if (kind === \"hdivider\")\n        return \"Horizontal divider in \" + who + \" at \" + Math.round(pl.y) + \" mm above the inside bottom\" + (pl.snapped ? \" (\" + pl.snapped + \")\" : \"\") + \" - click to place\";\n      return \"Divider in \" + who + \" at \" + Math.round(pl.x) + \" mm from the inside left\" + (pl.snapped ? \" (\" + pl.snapped + \")\" : \"\") + \" - click to place\";\n    }\n    function hover(e) {\n      if (!placing() || st.partDrag) return false;\n      const got = placementAt(e.clientX, e.clientY);\n      st.lastHover = { x: e.clientX, y: e.clientY, ok: !!(got && got.pl && got.pl.ok), mm: got && got.pl ? got.pl.x != null ? got.pl.x : got.pl.y : null, lp: got && got.lp ? got.lp.map(Math.round) : null };\n      if (!got || !got.pl || !got.pl.box && !got.pl.ok) {\n        const had = clearGhost();\n        say(got && got.pl && got.pl.why ? got.pl.why : \"\");\n        if (had || got) {\n          ctx.changed(\"handles\");\n          ctx.frame();\n        }\n        return true;\n      }\n      st.place = got;\n      const centred = got.kind === \"divider\" || got.kind === \"hdivider\" ? !!got.pl.snapped : null;\n      scene.placeGhost = { unitId: got.u.id, kind: got.kind, ok: !!got.pl.ok, centred, box: partWorldBox(got.u, got.pl.box) };\n      say(describe(got.pl, got.kind, got.u));\n      ctx.changed(\"handles\");\n      ctx.frame();\n      return true;\n    }\n    function leave() {\n      if (placing() && clearGhost()) {\n        say(\"\");\n        ctx.changed(\"handles\");\n        ctx.frame();\n      }\n    }\n    function down(e) {\n      if (!placing()) return false;\n      st.placeDown = { x: e.clientX, y: e.clientY };\n      if (e.preventDefault) e.preventDefault();\n      return true;\n    }\n    function up(e) {\n      const d = st.placeDown;\n      st.placeDown = null;\n      if (!d || !placing()) return false;\n      if (Math.hypot(e.clientX - d.x, e.clientY - d.y) > CLICK_PX) return true;\n      const got = placementAt(e.clientX, e.clientY) || st.place;\n      if (!got) {\n        say(\"Point inside a cabinet to place a \" + (TOOL_WORD[st.insideTool] || \"divider\"));\n        return true;\n      }\n      commitPlacement(got);\n      return true;\n    }\n    function commitPlacement(got, how) {\n      const u = got.u, pl = got.pl;\n      if (!pl.ok) {\n        say(pl.why + \" Nothing was added.\");\n        return { ok: false, why: pl.why };\n      }\n      const more = how === \"drop\" ? \" Drag in another, or Undo.\" : \" Click again for another; Esc to finish.\";\n      let r;\n      if (got.kind === \"shelf\") r = hist.run(\"add shelf\", () => shelfPlace(u, pl));\n      else if (got.kind === \"hdivider\") r = hist.run(\"add horizontal divider\", () => {\n        const eq = equalOn(u, \"h\");\n        const q = hDividerPlace(u, pl.y);\n        if (q.ok && eq) {\n          const s = splitEqually(u, \"h\");\n          q.shared = s.ok ? s.gaps : null;\n          q.shareWhy = s.ok ? null : s.why;\n        }\n        return q;\n      });\n      else r = hist.run(\"add divider\", () => {\n        const eq = equalOn(u, \"v\");\n        const q = dividerPlace(u, pl.x);\n        if (q.ok && eq) {\n          const s = splitEqually(u, \"v\");\n          q.shared = s.ok ? s.gaps : null;\n          q.shareWhy = s.ok ? null : s.why;\n        }\n        return q;\n      });\n      if (!r.ok) {\n        say(r.why);\n        return r;\n      }\n      scene.selectedId = u.id;\n      if (got.kind === \"shelf\") {\n        const e2 = shelfListOf(u).filter((s) => s.id === r.id)[0];\n        scene.selPart = e2 ? shelfPidOf(u, e2) : null;\n        say(\"Shelf added at \" + r.y + \" mm above the inside bottom\" + (pl.bay !== \"this cabinet\" ? \", \" + pl.bay : \"\") + \".\" + more);\n      } else if (got.kind === \"hdivider\") {\n        const p = cabinetParts(u).filter((q) => q.kind === \"fixed-h\" && hDividerIndexOf(q) === r.idx)[0];\n        scene.selPart = p ? p.pid : null;\n        say(\"Horizontal divider added at \" + Math.round(r.y) + \" mm above the inside bottom, front set back \" + dividerSetbackLimits(u).std + \" mm (deeper: click its setback).\" + more);\n      } else {\n        const p = cabinetParts(u).filter((q) => q.kind === \"fixed-v\" && dividerIndexOf(q) === r.idx)[0];\n        scene.selPart = p ? p.pid : null;\n        say(\"Divider added at \" + Math.round(r.x) + \" mm from the inside left, front set back \" + dividerSetbackLimits(u).std + \" mm (deeper: click its setback).\" + more);\n      }\n      if (how === \"drop\" && !scene.sizeMode) {\n        scene.selPart = null;\n        scene.hoverPart = null;\n      }\n      clearGhost();\n      ctx.refreshCues && ctx.refreshCues();\n      ctx.syncHandlesState && ctx.syncHandlesState();\n      ctx.changed(\"partinfo\");\n      ctx.syncControls();\n      ctx.refresh();\n      return Object.assign({ ok: true }, r);\n    }\n    function unitUnder(cx, cy) {\n      const ray = rayAt(cx, cy);\n      if (!ray) return null;\n      let best = null;\n      for (const u of scene.units || []) {\n        const r = rayToLocal(u, ray), lo = [0, u.family === \"wall\" ? 0 : -LEG_H, 0], hi = [u.w, u.h, u.d + T + 2];\n        let t0 = -Infinity, t1 = Infinity, miss = false;\n        for (let k = 0; k < 3; k++) {\n          if (Math.abs(r.d[k]) < 1e-9) {\n            if (r.o[k] < lo[k] || r.o[k] > hi[k]) miss = true;\n            continue;\n          }\n          let p = (lo[k] - r.o[k]) / r.d[k], q = (hi[k] - r.o[k]) / r.d[k];\n          if (p > q) {\n            const x = p;\n            p = q;\n            q = x;\n          }\n          t0 = Math.max(t0, p);\n          t1 = Math.min(t1, q);\n        }\n        if (miss || t1 < Math.max(t0, 0)) continue;\n        const t = Math.max(t0, 0);\n        if (!best || t < best.t) best = { u, t, y: r.o[1] + r.d[1] * t };\n      }\n      return best;\n    }\n    function madeParts(u, kind, r) {\n      let ps;\n      if (kind === \"shelf\") {\n        const e = shelfListOf(u).filter((s) => s.id === r.id)[0];\n        const pid = e ? shelfPidOf(u, e) : null;\n        ps = cabinetParts(u).filter((p) => p.pid === pid);\n      } else if (kind === \"hdivider\") ps = cabinetParts(u).filter((p) => p.kind === \"fixed-h\" && hDividerIndexOf(p) === r.idx);\n      else ps = cabinetParts(u).filter((p) => p.kind === \"fixed-v\" && dividerIndexOf(p) === r.idx);\n      return ps.map((p) => ({ name: p.name, box: { x0: p.local.x0, x1: p.local.x1, y0: p.local.y0, y1: p.local.y1, z0: p.local.z0, z1: p.local.z1 } }));\n    }\n    function placeOn(u, kind, pl) {\n      return kind === \"shelf\" ? shelfPlace(u, pl) : kind === \"hdivider\" ? hDividerPlace(u, pl.y) : dividerPlace(u, pl.x);\n    }\n    function dropResolve(kind, cx, cy) {\n      if (PLACE_TOOLS.indexOf(kind) < 0) return { ok: false, none: true, why: \"Nothing to place\" };\n      const word = TOOL_WORD[kind];\n      if (scene.explode > 0) return { ok: false, none: true, why: \"Exploded view is a preview - set it back to Assembled to place a \" + word };\n      const h = interiorUnder(cx, cy);\n      if (!h) {\n        const b = unitUnder(cx, cy);\n        if (!b) return { ok: false, none: true, why: \"Let go of the \" + word + \" inside a cabinet\" };\n        return { ok: false, u: b.u, kind, why: placeWhy(b.u) || (b.y < 0 ? \"That is the cabinet's legs - move up into the cabinet to place a \" + word : \"Move inside the cabinet's opening to place a \" + word) };\n      }\n      const pl = kind === \"shelf\" ? shelfPlacement(h.u, h.p) : kind === \"hdivider\" ? hDividerPlacement(h.u, h.p) : dividerPlacement(h.u, h.p);\n      const out = { u: h.u, kind, pl, lp: h.p, ok: !!pl.ok, why: pl.ok ? null : pl.why };\n      if (!pl.ok) {\n        out.boxes = pl.box ? [{ name: word, box: pl.box }] : [];\n        return out;\n      }\n      const c = JSON.parse(JSON.stringify(h.u));\n      const r = placeOn(c, kind, pl);\n      if (!r || !r.ok) return Object.assign(out, { ok: false, why: r && r.why || \"That place is not free\", boxes: pl.box ? [{ name: word, box: pl.box }] : [] });\n      out.boxes = madeParts(c, kind, r);\n      if (!out.boxes.length) return Object.assign(out, { ok: false, why: \"That \" + word + \" would not be made here\", boxes: [] });\n      return out;\n    }\n    function previewView(R4) {\n      return {\n        id: R4.u.id,\n        kind: R4.kind,\n        ok: !!R4.ok,\n        why: R4.ok ? null : R4.why,\n        boxes: R4.boxes || [],\n        y: R4.pl && R4.pl.y != null ? R4.pl.y : null,\n        x: R4.pl && R4.pl.x != null ? R4.pl.x : null,\n        bay: R4.pl && R4.pl.bay || null,\n        snapped: R4.pl && R4.pl.snapped || null\n      };\n    }\n    function previewDrop(kind, cx, cy) {\n      if (st.place || scene.placeGhost) clearGhost();\n      const R4 = dropResolve(kind, cx, cy);\n      if (R4.none) {\n        const had = !!scene.interiorPreview;\n        scene.interiorPreview = null;\n        if (had) ctx.frame();\n        return { ok: false, none: true, why: R4.why, sync: false };\n      }\n      const pv = previewView(R4);\n      scene.interiorPreview = pv;\n      ctx.frame();\n      return Object.assign({}, pv, { name: displayName(scene.units, R4.u), sync: false });\n    }\n    function clearDrop() {\n      const had = !!scene.interiorPreview;\n      scene.interiorPreview = null;\n      if (had) ctx.frame();\n      return { ok: true, had, sync: false };\n    }\n    function dropAt(kind, cx, cy) {\n      const had = !!scene.interiorPreview;\n      scene.interiorPreview = null;\n      const R4 = dropResolve(kind, cx, cy);\n      if (!R4.ok) {\n        const why = R4.why || \"Nothing fits here\";\n        say(\"Not added: \" + why);\n        if (had) ctx.frame();\n        return { ok: false, why };\n      }\n      const before = JSON.stringify(R4.boxes);\n      const r = commitPlacement({ u: R4.u, pl: R4.pl, kind: R4.kind }, \"drop\");\n      if (!r.ok) return r;\n      const made = madeParts(R4.u, R4.kind, r);\n      return Object.assign({}, r, { id: R4.u.id, kind: R4.kind, boxes: made, previewed: R4.boxes, matches: JSON.stringify(made) === before });\n    }\n    function selectedInterior() {\n      if (!st.insideTool) return null;\n      return selectedPart();\n    }\n    function selectedPart() {\n      const u = ctx.sel();\n      if (!u || !scene.partsMode || !scene.selPart) return null;\n      const p = partById(u, scene.selPart);\n      if (!p || p.kind !== \"shelf\" && p.kind !== \"fixed-v\" && p.kind !== \"fixed-h\") return null;\n      if (p.kind === \"shelf\") {\n        const e = shelfEntryOf(u, p.pid);\n        return e ? { u, part: p, kind: \"shelf\", entry: e } : null;\n      }\n      if (p.kind === \"fixed-h\") {\n        const hi = hDividerIndexOf(p);\n        if (hi < 0) return null;\n        const y = interiorOf(u).hDiv[hi];\n        return y == null ? null : { u, part: p, kind: \"hdivider\", idx: hi, y };\n      }\n      const idx = dividerIndexOf(p);\n      if (idx < 0) return null;\n      return { u, part: p, kind: \"divider\", idx, x: interiorOf(u).vDiv[idx] };\n    }\n    function reselect(u, kind, key2) {\n      if (kind === \"shelf\") {\n        const e = shelfListOf(u).filter((s) => s.id === key2)[0];\n        scene.selPart = e ? shelfPidOf(u, e) : null;\n      } else if (kind === \"hdivider\") {\n        const p = cabinetParts(u).filter((q) => q.kind === \"fixed-h\" && hDividerIndexOf(q) === key2)[0];\n        scene.selPart = p ? p.pid : null;\n      } else {\n        const p = cabinetParts(u).filter((q) => q.kind === \"fixed-v\" && dividerIndexOf(q) === key2)[0];\n        scene.selPart = p ? p.pid : null;\n      }\n      scene.hoverPart = scene.selPart;\n    }\n    function after() {\n      ctx.syncHandlesState && ctx.syncHandlesState();\n      ctx.changed(\"partinfo\");\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function nudge(dir, big) {\n      const s = selectedInterior();\n      if (!s) return { ok: false, why: \"no shelf or divider selected\" };\n      const u = s.u;\n      if (s.kind === \"shelf\") {\n        const step2 = PIN_PITCH * (big ? 3 : 1) * (dir > 0 ? 1 : -1);\n        const was = s.entry.y;\n        const r2 = hist.run(\"move shelf\", () => shelfMoveTo(u, s.entry.id, was + step2));\n        if (!r2.ok || r2.y === was) {\n          ctx.cue(r2.ok ? \"That shelf cannot go further this way\" : r2.why);\n          after();\n          return { ok: false };\n        }\n        reselect(u, \"shelf\", s.entry.id);\n        ctx.cue(\"Shelf at \" + r2.y + \" mm above the inside bottom\");\n        after();\n        return { ok: true, y: r2.y };\n      }\n      if (s.kind === \"hdivider\") {\n        const step2 = (big ? 10 : 1) * (dir > 0 ? 1 : -1);\n        const r2 = hist.run(\"move horizontal divider\", () => hDividerMoveTo(u, s.idx, s.y + step2));\n        if (!r2.ok || r2.y === s.y) {\n          ctx.cue(!r2.ok ? r2.why : r2.blocked ? \"A shelf is in the way - the divider stops against it\" : \"That divider cannot go further this way\");\n          after();\n          return { ok: false };\n        }\n        reselect(u, \"hdivider\", s.idx);\n        ctx.cue(\"Horizontal divider at \" + r2.y + \" mm above the inside bottom\");\n        after();\n        return { ok: true, y: r2.y };\n      }\n      const step = (big ? 10 : 1) * (dir > 0 ? 1 : -1);\n      const r = hist.run(\"move divider\", () => vDivDragTo(u, s.idx, s.x + step));\n      if (!r.ok || r.x === s.x) {\n        ctx.cue(r.ok ? \"That divider cannot go further this way\" : r.why);\n        after();\n        return { ok: false };\n      }\n      reselect(u, \"divider\", s.idx);\n      ctx.cue(\"Divider at \" + r.x + \" mm from the inside left\");\n      after();\n      return { ok: true, x: r.x };\n    }\n    function dividerSetbackOf(s) {\n      const I = interiorOf(s.u), key2 = s.kind === \"hdivider\" ? \"hSb\" : \"vSb\", L = dividerSetbackLimits(s.u);\n      const v = (I[key2] || [])[s.idx];\n      return { L, key: key2, value: v == null ? L.std : Math.max(L.min, Math.min(L.max, v)) };\n    }\n    function setDividerSetback(s, mm) {\n      const u = s.u, D0 = dividerSetbackOf(s), L = D0.L;\n      if (!L) return { ok: false, why: \"no interior\" };\n      const want = Math.round(mm * 10) / 10, v = Math.max(L.min, Math.min(L.max, want));\n      const clamped = v !== want ? want < L.min ? \"Not shallower than the cabinet's own \" + L.min + \" mm -\" : \"Deepest is \" + L.max + \" mm -\" : null;\n      const r = hist.run(s.kind === \"hdivider\" ? \"horizontal divider setback\" : \"divider setback\", () => {\n        const I = interiorOf(u), next = Object.assign({}, u.interior || {}, { vDiv: I.vDiv.slice(), dividers: I.vDiv.slice(), hDiv: I.hDiv.slice(), vSb: (I.vSb || []).slice(), hSb: (I.hSb || []).slice() });\n        next[D0.key][s.idx] = v === L.std ? null : v;\n        setInterior(u, next);\n        return { ok: true };\n      });\n      if (!r || !r.ok) return { ok: false, why: r && r.why || \"unchanged\" };\n      reselect(u, s.kind, s.idx);\n      let beside = 0;\n      if (s.kind === \"divider\") {\n        const ps = cabinetParts(u), dv = ps.filter((q) => q.kind === \"fixed-v\" && dividerIndexOf(q) === s.idx)[0];\n        if (dv) beside = ps.filter((q) => q.kind === \"shelf\" && (Math.abs(q.local.x1 - dv.local.x0) <= 2 || Math.abs(q.local.x0 - dv.local.x1) <= 2) && q.local.z1 > dv.local.z1 + 7).length;\n      }\n      ctx.cue((clamped ? clamped + \" \" : \"\") + (s.kind === \"hdivider\" ? \"Horizontal divider\" : \"Divider\") + \" front setback \" + v + \" mm\" + (beside ? \" - \" + beside + \" shelf\" + (beside > 1 ? \"s\" : \"\") + \" beside it reach further forward: set them back as far, or their front pins are not drilled into this divider\" : \"\"));\n      after();\n      return { ok: true, setback: v, clamped, shelvesBeyond: beside };\n    }\n    function setGap(which, raw) {\n      const s = selectedInterior();\n      if (!s) return { ok: false, why: \"no shelf or divider selected\" };\n      const mm = parseFloat(raw);\n      if (!isFinite(mm) || mm < 0) {\n        ctx.cue(\"Type a gap in millimetres\");\n        return { ok: false, why: \"not a number\" };\n      }\n      const u = s.u, B = interiorBounds(u);\n      if ((s.kind === \"divider\" || s.kind === \"hdivider\") && which === \"setback\") return setDividerSetback(s, mm);\n      if (s.kind === \"shelf\" && (which === \"depth\" || which === \"setback\")) return setEdge(s, which, mm);\n      const am = /^(depth|setback)([AB])$/.exec(String(which));\n      if (s.kind === \"shelf\" && am && s.entry.corner) return setEdge(s, am[1], mm, am[2]);\n      if (s.kind === \"shelf\") {\n        const g3 = shelfGaps(u, s.entry.cell, s.entry.y, s.entry.id);\n        if (which !== \"below\" && which !== \"above\") return { ok: false, why: \"which\" };\n        const want2 = which === \"below\" ? g3.floor + mm - B.y0 : g3.ceil - mm - T - B.y0;\n        const r2 = hist.run(\"set shelf height\", () => shelfMoveTo(u, s.entry.id, want2));\n        if (!r2.ok) {\n          ctx.cue(r2.why);\n          after();\n          return { ok: false, why: r2.why };\n        }\n        reselect(u, \"shelf\", s.entry.id);\n        const g23 = shelfGaps(u, s.entry.cell, r2.y, s.entry.id);\n        const got2 = Math.round(which === \"below\" ? g23.below : g23.above);\n        ctx.cue(got2 === Math.round(mm) ? \"Gap \" + which + \" the shelf: \" + got2 + \" mm\" : \"Nearest shelf hole gives \" + got2 + \" mm \" + which + \" (shelves sit on 32 mm holes)\");\n        after();\n        return { ok: true, y: r2.y, gap: got2 };\n      }\n      if (s.kind === \"hdivider\") {\n        if (which !== \"below\" && which !== \"above\") return { ok: false, why: \"which\" };\n        const g3 = hDividerGaps(u, s.y, s.idx);\n        const want2 = which === \"below\" ? g3.floor + mm - B.y0 : g3.ceil - mm - T - B.y0;\n        const r2 = hist.run(\"move horizontal divider\", () => hDividerMoveTo(u, s.idx, want2));\n        if (!r2.ok) {\n          ctx.cue(r2.why);\n          after();\n          return { ok: false, why: r2.why };\n        }\n        reselect(u, \"hdivider\", s.idx);\n        const g23 = hDividerGaps(u, r2.y, s.idx);\n        const got2 = Math.round(which === \"below\" ? g23.below : g23.above);\n        ctx.cue(got2 === Math.round(mm) ? \"Gap \" + which + \" the divider: \" + got2 + \" mm\" : r2.blocked ? \"A shelf is in the way - using \" + got2 + \" mm \" + which : \"There is only room for \" + got2 + \" mm \" + which);\n        after();\n        return { ok: true, y: r2.y, gap: got2 };\n      }\n      if (which !== \"left\" && which !== \"right\") return { ok: false, why: \"which\" };\n      const g2 = dividerGaps(u, s.x, s.idx);\n      const want = which === \"left\" ? g2.lx + mm - B.x0 : g2.rx - mm - T - B.x0;\n      const r = hist.run(\"move divider\", () => vDivDragTo(u, s.idx, want));\n      if (!r.ok) {\n        ctx.cue(r.why);\n        after();\n        return { ok: false, why: r.why };\n      }\n      reselect(u, \"divider\", s.idx);\n      const g22 = dividerGaps(u, r.x, s.idx);\n      const got = Math.round(which === \"left\" ? g22.left : g22.right);\n      ctx.cue(got === Math.round(mm) ? \"Gap \" + which + \" of the divider: \" + got + \" mm\" : \"There is only room for \" + got + \" mm \" + which);\n      after();\n      return { ok: true, x: r.x, gap: got };\n    }\n    function setEdge(s, which, mm, arm) {\n      const u = s.u;\n      const r = hist.run(\n        which === \"depth\" ? \"shelf depth\" : \"shelf setback\",\n        () => shelfSetEdges(u, s.entry.id, which === \"depth\" ? { depth: mm, arm } : { setback: mm, arm }, which === \"depth\" ? \"depth\" : \"front\")\n      );\n      if (!r.ok) {\n        ctx.cue(r.why);\n        after();\n        return { ok: false, why: r.why };\n      }\n      reselect(u, \"shelf\", s.entry.id);\n      ctx.cue((r.clamped ? r.clamped + \" \" : \"\") + (arm ? \"Arm \" + arm + \" shelf\" : \"Shelf\") + \" depth \" + r.depth + \" mm, front setback \" + r.setback + \" mm\");\n      after();\n      return { ok: true, depth: r.depth, setback: r.setback, clamped: r.clamped, arm: arm || null };\n    }\n    function nudgeDepth(dir, big) {\n      const s = selectedInterior();\n      if (!s || s.kind !== \"shelf\") return { ok: false, why: \"no shelf selected\" };\n      const E = shelfEdgesOf(s.u, s.entry);\n      if (s.entry.corner) {\n        const st0 = (big ? 10 : 1) * dir, u = s.u;\n        const r2 = hist.run(\"shelf setback\", () => {\n          shelfSetEdges(u, s.entry.id, { setback: E.sbA - st0, arm: \"A\" }, \"front\");\n          return shelfSetEdges(u, s.entry.id, { setback: E.sbB - st0, arm: \"B\" }, \"front\");\n        });\n        reselect(u, \"shelf\", s.entry.id);\n        const E2 = shelfEdgesOf(u, shelfListOf(u).filter((q) => q.id === s.entry.id)[0] || s.entry);\n        ctx.cue((E2.sbA === E.sbA && E2.sbB === E.sbB ? (r2.clamped || \"That shelf cannot go further this way\") + \" - \" : \"\") + \"Arm A \" + E2.depthA + \" deep, \" + E2.sbA + \" back; arm B \" + E2.depthB + \" deep, \" + E2.sbB + \" back\");\n        after();\n        return { ok: !!r2.ok, sbA: E2.sbA, sbB: E2.sbB };\n      }\n      const r = setEdge(s, \"setback\", E.setback - dir * (big ? 10 : 1));\n      if (r.ok && r.setback === E.setback && r.depth === E.depth) ctx.cue(r.clamped || \"That shelf cannot go further this way\");\n      return r;\n    }\n    function duplicateSelected() {\n      const s = selectedPart();\n      if (!s) return { ok: false, why: \"no shelf or divider selected\" };\n      const u = s.u;\n      const r = s.kind === \"shelf\" ? hist.run(\"duplicate shelf\", () => duplicateShelf(u, s.entry.id)) : s.kind === \"hdivider\" ? hist.run(\"duplicate horizontal divider\", () => duplicateHDivider(u, s.idx)) : hist.run(\"duplicate divider\", () => duplicateDivider(u, s.idx));\n      if (!r || !r.ok) {\n        ctx.cue(r && r.why || \"No room for another one here\");\n        after();\n        return { ok: false, why: r && r.why || \"no room\" };\n      }\n      reselect(u, s.kind, s.kind === \"shelf\" ? r.id : r.idx);\n      const what = s.kind === \"shelf\" ? \"Shelf\" : s.kind === \"hdivider\" ? \"Horizontal divider\" : \"Divider\";\n      ctx.cue(what + \" duplicated\" + (s.kind === \"shelf\" ? \" at \" + r.y + \" mm\" : r.shared ? \" - shared out equally\" : \" at \" + r.at + \" mm\") + (r.setback != null ? \", its own \" + r.setback + \" mm front setback kept\" : \"\"));\n      after();\n      return Object.assign({ ok: true, kind: s.kind }, r);\n    }\n    function removeSelectedPart() {\n      const s = selectedPart();\n      if (!s) return { ok: false, why: \"no shelf or divider selected\" };\n      if (s.kind === \"shelf\") {\n        const r = ctx.commands && ctx.commands.run ? ctx.commands.run(\"removeSelectedShelf\", {}) : null;\n        return { ok: !!(r && r.ok), kind: \"shelf\" };\n      }\n      return Object.assign({ kind: s.kind }, removeSelected());\n    }\n    function removeSelected() {\n      const s = selectedPart();\n      if (!s || s.kind !== \"divider\" && s.kind !== \"hdivider\") return { ok: false };\n      const r = s.kind === \"hdivider\" ? hist.run(\"remove horizontal divider\", () => hDividerRemoveAt(s.u, s.idx)) : hist.run(\"remove divider\", () => dividerRemoveAt(s.u, s.idx));\n      if (!r.ok) {\n        ctx.cue(r.why);\n        return r;\n      }\n      scene.selPart = null;\n      scene.hoverPart = null;\n      ctx.cue(s.kind === \"hdivider\" ? \"Horizontal divider removed\" : \"Divider removed\");\n      after();\n      return { ok: true };\n    }\n    function cornerDims(s, out, W2, shelfDims) {\n      const u = s.u, e = s.entry, E = shelfEdgesOf(u, e), bs = cornerShelfBoards(u, e);\n      if (!E || bs.length !== 2) return out;\n      const A = bs[0], Bb = bs[1], drag = st.partDrag && st.partDrag.mode === \"shelf-depth\", hdrag = st.partDrag && st.partDrag.mode === \"shelf\";\n      if (!drag) shelfDims(u, shelfGaps(u, \"0.0\", e.y, e.id), !st.partDrag, A.z1);\n      if (hdrag) return out;\n      const y = A.y1, ed = !st.partDrag, xA = A.x1 - 0.3 * (A.x1 - A.x0), zB = A.z1 + 0.3 * (Bb.z1 - A.z1), ix = armA(u) - u.d;\n      out.avoid = [\n        [W2(u, [A.x0, y, A.z1]), W2(u, [A.x1, y, A.z1])],\n        [W2(u, [A.x0, A.y0, A.z1]), W2(u, [A.x1, A.y0, A.z1])],\n        [W2(u, [Bb.x0, y, A.z1]), W2(u, [Bb.x0, y, Bb.z1])],\n        [W2(u, [Bb.x0, Bb.y0, A.z1]), W2(u, [Bb.x0, Bb.y0, Bb.z1])]\n      ];\n      out.push({ a: W2(u, [xA, y, A.z0]), b: W2(u, [xA, y, A.z1]), mm: E.depthA, which: \"depthA\", edit: ed, axis: \"z\", label: \"Arm A shelf depth\" });\n      if (E.sbA >= 1) out.push({ a: W2(u, [xA, y, A.z1]), b: W2(u, [xA, y, u.d]), mm: E.sbA, which: \"setbackA\", edit: ed, axis: \"z\", label: \"Arm A front setback\" });\n      else out.push({ a: W2(u, [xA, y, A.z1]), b: W2(u, [xA, y, A.z1 + 0.01]), mm: 0, which: \"setbackA\", edit: ed, axis: \"z\", label: \"Arm A front setback\", flush: true });\n      out.push({ a: W2(u, [Bb.x1, y, zB]), b: W2(u, [Bb.x0, y, zB]), mm: E.depthB, which: \"depthB\", edit: ed, axis: \"x\", depthLike: true, label: \"Arm B shelf depth\" });\n      if (E.sbB >= 1) out.push({ a: W2(u, [Bb.x0, y, zB]), b: W2(u, [ix, y, zB]), mm: E.sbB, which: \"setbackB\", edit: ed, axis: \"x\", depthLike: true, label: \"Arm B front setback\" });\n      else out.push({ a: W2(u, [Bb.x0, y, zB]), b: W2(u, [Bb.x0 - 0.01, y, zB]), mm: 0, which: \"setbackB\", edit: ed, axis: \"x\", depthLike: true, label: \"Arm B front setback\", flush: true });\n      return out;\n    }\n    function dims() {\n      if (scene.explode > 0) return [];\n      const out = [];\n      const W2 = (u, p) => localToWorld(u, p);\n      function shelfDims(u, g2, edit, zFront) {\n        if (!g2) return;\n        const z = zFront != null ? zFront : interiorBounds(u).z1;\n        out.push({ a: W2(u, [g2.x, g2.floor, z]), b: W2(u, [g2.x, g2.y0, z]), mm: g2.below, which: \"below\", edit, axis: \"y\" });\n        out.push({ a: W2(u, [g2.x, g2.y1, z]), b: W2(u, [g2.x, g2.ceil, z]), mm: g2.above, which: \"above\", edit, axis: \"y\" });\n      }\n      function divDims(u, g2, edit) {\n        if (!g2) return;\n        const z = g2.B.z1;\n        out.push({ a: W2(u, [g2.lx, g2.y, z]), b: W2(u, [g2.x0, g2.y, z]), mm: g2.left, which: \"left\", edit, axis: \"x\" });\n        out.push({ a: W2(u, [g2.x1, g2.y, z]), b: W2(u, [g2.rx, g2.y, z]), mm: g2.right, which: \"right\", edit, axis: \"x\" });\n      }\n      if (placing() && st.place && st.place.pl && st.place.pl.gaps) {\n        const P2 = st.place;\n        if (P2.kind === \"shelf\" || P2.kind === \"hdivider\") shelfDims(P2.u, P2.pl.gaps, false);\n        else divDims(P2.u, P2.pl.gaps, false);\n        out.forEach((d) => {\n          d.ghost = true;\n          d.ok = !!P2.pl.ok;\n        });\n        return out;\n      }\n      const s = selectedInterior();\n      if (!s || placing()) return out;\n      if (s.kind === \"shelf\" && s.entry.corner) return cornerDims(s, out, W2, shelfDims);\n      if (s.kind === \"shelf\") {\n        const E = shelfEdgesOf(s.u, s.entry);\n        const drag = st.partDrag && st.partDrag.mode === \"shelf-depth\", hdrag = st.partDrag && st.partDrag.mode === \"shelf\";\n        if (!drag) shelfDims(s.u, shelfGaps(s.u, s.entry.cell, s.entry.y, s.entry.id), !st.partDrag, E ? E.z1 : null);\n        if (hdrag) return out;\n        if (E) {\n          const p = s.part.local, x = p.x0 + 2, y = p.y1;\n          out.avoid = [[W2(s.u, [p.x0, p.y1, E.z1]), W2(s.u, [p.x1, p.y1, E.z1])], [W2(s.u, [p.x0, p.y0, E.z1]), W2(s.u, [p.x1, p.y0, E.z1])]];\n          out.push({ a: W2(s.u, [x, y, E.z0]), b: W2(s.u, [x, y, E.z1]), mm: E.depth, which: \"depth\", edit: !st.partDrag, axis: \"z\", label: \"Shelf depth\" });\n          if (E.setback >= 1) out.push({ a: W2(s.u, [x, y, E.z1]), b: W2(s.u, [x, y, s.u.d]), mm: E.setback, which: \"setback\", edit: !st.partDrag, axis: \"z\", label: \"Front setback\" });\n          else out.push({ a: W2(s.u, [x, y, E.z1]), b: W2(s.u, [x, y, E.z1 + 0.01]), mm: 0, which: \"setback\", edit: !st.partDrag, axis: \"z\", label: \"Front setback\", flush: true });\n        }\n      } else if (s.kind === \"hdivider\") shelfDims(s.u, hDividerGaps(s.u, s.y, s.idx), !st.partDrag);\n      else divDims(s.u, dividerGaps(s.u, s.x, s.idx), !st.partDrag);\n      if ((s.kind === \"divider\" || s.kind === \"hdivider\") && s.part && s.part.local && !st.partDrag) {\n        const p = s.part.local, sb = dividerSetbackOf(s).value, x = s.kind === \"divider\" ? p.x0 : p.x0 + 2, y = p.y1;\n        out.push({ a: W2(s.u, [x, y, p.z1]), b: W2(s.u, [x, y, s.u.d]), mm: sb, which: \"setback\", edit: true, axis: \"z\", label: \"Front setback\" });\n      }\n      return out;\n    }\n    function status() {\n      if (placing()) return st.placeWords || \"\";\n      const s = selectedInterior();\n      if (s && s.kind === \"shelf\" && s.entry.corner) {\n        const E = shelfEdgesOf(s.u, s.entry);\n        return \"L shelf at \" + s.entry.y + \" mm \\xB7 arm A \" + E.depthA + \" deep, \" + E.sbA + \" back \\xB7 arm B \" + E.depthB + \" deep, \" + E.sbB + \" back \\xB7 \\u2191\\u2193 move \\xB7 [ ] depth\";\n      }\n      if (s && s.kind === \"shelf\") {\n        const E = shelfEdgesOf(s.u, s.entry);\n        return \"Shelf at \" + s.entry.y + \" mm\" + (E ? \" \\xB7 \" + E.depth + \" deep, \" + E.setback + \" back\" : \"\") + \" \\xB7 \\u2191\\u2193 move \\xB7 [ ] depth \\xB7 Delete removes\";\n      }\n      if (s && s.kind === \"divider\") return \"Divider at \" + s.x + \" mm \\xB7 \" + dividerSetbackOf(s).value + \" back \\xB7 \\u2190\\u2192 move \\xB7 Delete removes\";\n      if (s && s.kind === \"hdivider\") return \"H divider at \" + s.y + \" mm \\xB7 \" + dividerSetbackOf(s).value + \" back \\xB7 \\u2191\\u2193 move \\xB7 Delete removes\";\n      return \"\";\n    }\n    function statusTip() {\n      if (placing()) return toolHint();\n      const s = selectedInterior();\n      if (s && s.kind === \"shelf\" && s.entry.corner) {\n        const L = shelfDepthLimits(s.u, s.entry.cell);\n        return \"L-shaped corner shelf at \" + s.entry.y + \" mm above the inside bottom \\xB7 \\u2191\\u2193 32 mm, Shift \\xD73 \\xB7 drag either arm's front edge for that arm's depth (\" + L.minDepth + \" to \" + L.maxDepth + \" mm), its rear stays on the back \\xB7 click a number to type it \\xB7 [ ] both fronts 1 mm, Shift 10 \\xB7 its supports are still to be specified by the workshop\";\n      }\n      if (s && s.kind === \"shelf\") {\n        const E = shelfEdgesOf(s.u, s.entry), L = shelfDepthLimits(s.u, s.entry.cell);\n        return \"Shelf at \" + s.entry.y + \" mm above the inside bottom \\xB7 \\u2191\\u2193 one shelf hole (32 mm), Shift \\xD73 \\xB7 click a gap to type it\" + (E && L ? \" \\xB7 depth \" + E.depth + \" mm (\" + L.minDepth + \" to \" + L.maxDepth + \"), front setback \" + E.setback + \" mm: drag the front edge (Shift slides the shelf), click a number to type it, [ ] 1 mm, Shift 10\" : \"\") + \" \\xB7 Delete removes it\";\n      }\n      if (s && s.kind === \"divider\") {\n        const rg = dividerRange(s.u, null, s.idx);\n        return \"Divider at \" + s.x + \" mm from the inside left\" + (rg ? \" (\" + rg.min + \" to \" + rg.max + \")\" : \"\") + \" \\xB7 \\u2190\\u2192 1 mm, Shift 10 \\xB7 click a gap to type it \\xB7 Delete removes it\";\n      }\n      if (s && s.kind === \"hdivider\") {\n        const rg = hDividerRangeOf(s.u, s.idx);\n        return \"Horizontal divider at \" + s.y + \" mm above the inside bottom\" + (rg ? \" (\" + rg.min + \" to \" + rg.max + \")\" : \"\") + \" \\xB7 \\u2191\\u2193 1 mm, Shift 10 \\xB7 click a gap to type it \\xB7 Delete removes it\";\n      }\n      return toolHint();\n    }\n    function key(e) {\n      const k = String(e.key || \"\");\n      if (k === \"Escape\") {\n        if (placing()) {\n          setTool(\"select\");\n          return true;\n        }\n        if (st.insideTool === \"select\") {\n          setTool(null);\n          return true;\n        }\n        if (st.insideTool === \"edit\") {\n          exitEdit();\n          return true;\n        }\n        return false;\n      }\n      if (!scene.partsMode) return false;\n      const s = selectedInterior();\n      if (!s) return false;\n      if (s.kind === \"shelf\" && (k === \"ArrowUp\" || k === \"ArrowDown\")) {\n        nudge(k === \"ArrowUp\" ? 1 : -1, !!e.shiftKey);\n        return true;\n      }\n      if (s.kind === \"shelf\" && (k === \"[\" || k === \"]\" || k === \"{\" || k === \"}\")) {\n        nudgeDepth(k === \"]\" || k === \"}\" ? 1 : -1, !!e.shiftKey || k === \"{\" || k === \"}\");\n        return true;\n      }\n      if (s.kind === \"hdivider\" && (k === \"ArrowUp\" || k === \"ArrowDown\")) {\n        nudge(k === \"ArrowUp\" ? 1 : -1, !!e.shiftKey);\n        return true;\n      }\n      if (s.kind === \"divider\" && (k === \"ArrowLeft\" || k === \"ArrowRight\")) {\n        nudge(k === \"ArrowRight\" ? 1 : -1, !!e.shiftKey);\n        return true;\n      }\n      return false;\n    }\n    function axisParam(u, axis, anchor, cx, cy) {\n      const ray = rayAt(cx, cy);\n      if (!ray) return null;\n      const r = rayToLocal(u, ray);\n      const a = axis === \"x\" ? [1, 0, 0] : axis === \"z\" ? [0, 0, 1] : [0, 1, 0];\n      const da = r.d[0] * a[0] + r.d[1] * a[1] + r.d[2] * a[2];\n      const n = [r.d[0] - a[0] * da, r.d[1] - a[1] * da, r.d[2] - a[2] * da];\n      const nl = Math.hypot(n[0], n[1], n[2]);\n      if (nl < 0.08) return null;\n      const nd = n[0] * r.d[0] + n[1] * r.d[1] + n[2] * r.d[2];\n      if (Math.abs(nd) < 1e-9) return null;\n      const t = (n[0] * (anchor[0] - r.o[0]) + n[1] * (anchor[1] - r.o[1]) + n[2] * (anchor[2] - r.o[2])) / nd;\n      const X = [r.o[0] + r.d[0] * t, r.o[1] + r.d[1] * t, r.o[2] + r.d[2] * t];\n      return (X[0] - anchor[0]) * a[0] + (X[1] - anchor[1]) * a[1] + (X[2] - anchor[2]) * a[2];\n    }\n    const probe = {\n      bounds: (u) => interiorBounds(u),\n      shelfYs: (u) => shelfListOf(u).map((s) => s.y).sort((p, q) => p - q),\n      toWorld: (u, p) => localToWorld(u, p),\n      lastHover: () => st.lastHover || null,\n      at: (x, y) => {\n        const g2 = placementAt(x, y);\n        return g2 ? { ok: g2.pl.ok, mm: g2.pl.x != null ? g2.pl.x : g2.pl.y, lp: g2.lp.map(Math.round) } : null;\n      }\n    };\n    const api = {\n      probe,\n      axisParam,\n      tool,\n      setTool,\n      modeLeft,\n      placing,\n      hover,\n      leave,\n      down,\n      up,\n      placementAt,\n      commitPlacement,\n      interiorPartUnder,\n      selectedInterior,\n      selectedPart,\n      nudge,\n      nudgeDepth,\n      setGap,\n      removeSelected,\n      duplicateSelected,\n      removeSelectedPart,\n      dims,\n      status,\n      statusTip,\n      key,\n      toolHint,\n      enterEdit,\n      exitEdit,\n      /* is one part being edited from a double-click (shared with the neutral radial, task 1791223318552) */\n      editing: () => st.insideTool === \"edit\"\n    };\n    ctx.inside = api;\n    const define = ctx.commands.define;\n    define(\"insideTool\", {\n      history: null,\n      args: { tool: \"select | shelf | divider (\\u0432\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u0430\\u044F) | hdivider (\\u0433\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u0430\\u044F) | null (\\u0432\\u044B\\u0439\\u0442\\u0438)\" },\n      doc: \"\\u0418\\u043D\\u0441\\u0442\\u0440\\u0443\\u043C\\u0435\\u043D\\u0442 \\u043D\\u0430\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D\\u0438\\u044F: + Shelf / + Divider \\u0441\\u0442\\u0430\\u0432\\u044F\\u0442 \\u0434\\u0435\\u0442\\u0430\\u043B\\u044C \\u0449\\u0435\\u043B\\u0447\\u043A\\u043E\\u043C \\u0432\\u043D\\u0443\\u0442\\u0440\\u0438 \\u0448\\u043A\\u0430\\u0444\\u0430, Select \\u0432\\u044B\\u0431\\u0438\\u0440\\u0430\\u0435\\u0442 \\u0438 \\u0442\\u044F\\u043D\\u0435\\u0442 ([data-ub-itool])\",\n      run(a) {\n        return setTool(a && a.tool);\n      }\n    });\n    define(\"placeInteriorAt\", {\n      history: \"add shelf | add divider | add horizontal divider\",\n      args: { x: \"clientX\", y: \"clientY\" },\n      doc: \"\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u043F\\u043E\\u043B\\u043A\\u0443 \\u0438\\u043B\\u0438 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0443 \\u0442\\u0435\\u043A\\u0443\\u0449\\u0435\\u0433\\u043E \\u0438\\u043D\\u0441\\u0442\\u0440\\u0443\\u043C\\u0435\\u043D\\u0442\\u0430 \\u0432 \\u0442\\u043E\\u0447\\u043A\\u0443 \\u0445\\u043E\\u043B\\u0441\\u0442\\u0430 (\\u0442\\u043E \\u0436\\u0435, \\u0447\\u0442\\u043E \\u0449\\u0435\\u043B\\u0447\\u043E\\u043A)\",\n      run(a) {\n        if (!placing()) return { ok: false, why: \"no tool\" };\n        const g2 = placementAt(a.x, a.y);\n        return g2 ? commitPlacement(g2) : { ok: false, why: \"not inside a cabinet\" };\n      }\n    });\n    define(\"previewInteriorDrop\", {\n      history: null,\n      args: { kind: \"shelf | divider | hdivider\", cx: \"client x\", cy: \"client y\" },\n      doc: \"View only: while a shelf / divider is dragged in from the menu, show the real board a release here would add (orange edges, the cabinet's fronts see-through) or that it does not fit; nothing in the plan changes\",\n      run(a) {\n        return previewDrop(a && a.kind, a && a.cx, a && a.cy);\n      }\n    });\n    define(\"clearInteriorPreview\", {\n      history: null,\n      args: {},\n      doc: \"View only: take the shelf / divider drag-in preview away (left the cabinets, cancelled, Escape)\",\n      run() {\n        return clearDrop();\n      }\n    });\n    define(\"dropInteriorAt\", {\n      history: \"add shelf | add divider | add horizontal divider\",\n      args: { kind: \"shelf | divider | hdivider\", cx: \"client x\", cy: \"client y\" },\n      doc: \"Drop a shelf / divider dragged in from the menu: exactly the previewed board, one Undo; no fit - nothing added\",\n      run(a) {\n        return dropAt(a && a.kind, a && a.cx, a && a.cy);\n      }\n    });\n    define(\"nudgePart\", {\n      history: \"move shelf | move divider\",\n      args: { dir: \"-1 | 1\", big: \"Shift\" },\n      doc: \"\\u0421\\u0434\\u0432\\u0438\\u043D\\u0443\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0443\\u044E \\u043F\\u043E\\u043B\\u043A\\u0443 \\u043D\\u0430 \\u043E\\u0442\\u0432\\u0435\\u0440\\u0441\\u0442\\u0438\\u0435 (32 \\u043C\\u043C) \\u0438\\u043B\\u0438 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0443 \\u043D\\u0430 1 \\u043C\\u043C (\\u0441\\u0442\\u0440\\u0435\\u043B\\u043A\\u0438; Shift \\u2014 \\xD73 / 10 \\u043C\\u043C)\",\n      run(a) {\n        return nudge(a.dir, !!a.big);\n      }\n    });\n    define(\"setPartGap\", {\n      history: \"set shelf height | move divider | shelf depth | shelf setback\",\n      args: { which: \"below | above | left | right | depth | setback\", mm: \"\\u043F\\u0440\\u043E\\u0441\\u0432\\u0435\\u0442, \\u043C\\u043C\" },\n      doc: \"\\u0427\\u0438\\u0441\\u0442\\u044B\\u0439 \\u043F\\u0440\\u043E\\u0441\\u0432\\u0435\\u0442 \\u0443 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u043F\\u043E\\u043B\\u043A\\u0438 \\u0438\\u043B\\u0438 \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0438 (\\u0447\\u0438\\u0441\\u043B\\u043E \\u043D\\u0430 \\u0440\\u0430\\u0437\\u043C\\u0435\\u0440\\u043D\\u043E\\u0439 \\u043B\\u0438\\u043D\\u0438\\u0438); \\u0443 \\u043F\\u043E\\u043B\\u043A\\u0438 \\u0442\\u0430\\u043A\\u0436\\u0435 which: depth | setback - \\u0433\\u043B\\u0443\\u0431\\u0438\\u043D\\u0430 \\u0438 \\u043E\\u0442\\u0441\\u0442\\u0443\\u043F \\u043E\\u0442 \\u043F\\u0435\\u0440\\u0435\\u0434\\u043D\\u0435\\u0433\\u043E \\u043A\\u0440\\u0430\\u044F \\u043A\\u043E\\u0440\\u043F\\u0443\\u0441\\u0430 (\\u0437\\u0430\\u0434\\u0430\\u0447\\u0430 1791215235157)\",\n      run(a) {\n        return setGap(a.which, a.mm);\n      }\n    });\n    define(\"nudgeShelfDepth\", {\n      history: \"shelf setback\",\n      args: { dir: \"-1 (shallower) | 1 (deeper)\", big: \"Shift: 10 mm\" },\n      doc: \"\\u041F\\u0435\\u0440\\u0435\\u0434\\u043D\\u0438\\u0439 \\u043A\\u0440\\u0430\\u0439 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u043F\\u043E\\u043B\\u043A\\u0438 \\u043D\\u0430 1 \\u043C\\u043C (Shift 10) \\u0432\\u043F\\u0435\\u0440\\u0451\\u0434/\\u043D\\u0430\\u0437\\u0430\\u0434, \\u0437\\u0430\\u0434\\u043D\\u0438\\u0439 \\u043A\\u0440\\u0430\\u0439 \\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435 ([ \\u0438 ], \\u0437\\u0430\\u0434\\u0430\\u0447\\u0430 1791215235157)\",\n      run(a) {\n        return nudgeDepth(a.dir, !!a.big);\n      }\n    });\n    define(\"duplicateSelectedPart\", {\n      history: \"duplicate shelf / divider\",\n      doc: \"+ beside the selected shelf / divider: one more of the same part, its own settings kept, where the rules allow (owner 11.10.2026)\",\n      run() {\n        return duplicateSelected();\n      }\n    });\n    define(\"removeSelectedPart\", {\n      history: \"remove shelf / divider\",\n      doc: \"\\xD7 beside the selected shelf / divider: that part only, one Undo step (owner 11.10.2026)\",\n      run() {\n        return removeSelectedPart();\n      }\n    });\n    define(\"removeSelectedDivider\", {\n      history: \"remove divider\",\n      doc: \"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0443\\u044E \\u043F\\u0435\\u0440\\u0435\\u0433\\u043E\\u0440\\u043E\\u0434\\u043A\\u0443 (\\u0432\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u0443\\u044E \\u0438\\u043B\\u0438 \\u0433\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u0443\\u044E), \\u0441\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0432 \\u043F\\u043E\\u043B\\u043A\\u0438 (Delete/Backspace)\",\n      run() {\n        return removeSelected();\n      }\n    });\n    return api;\n  }\n\n  // v2/src/interact/measure.js\n  var SNAP_TOL_PX = 14;\n  var SNAP_RANK_PX = 5;\n  var CLICK_PX2 = 5;\n  var GRAB_PX = 10;\n  var HIDE_MM = 1.5;\n  var HOT_KIND = /corner|hole|centre/;\n  function measureText(a, b) {\n    const dist2 = Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);\n    const dx = Math.abs(a[0] - b[0]), dy = Math.abs(a[1] - b[1]), dz = Math.abs(a[2] - b[2]);\n    const axes = [\n      dx > 0.5 ? Math.round(dx) + \" across\" : \"\",\n      dy > 0.5 ? Math.round(dy) + \" up\" : \"\",\n      dz > 0.5 ? Math.round(dz) + \" deep\" : \"\"\n    ].filter(Boolean);\n    return { mm: dist2, dx, dy, dz, text: axes.length > 1 ? Math.round(dist2) + \" mm (\" + axes.join(\", \") + \")\" : Math.round(dist2) + \" mm\" };\n  }\n  var sub3 = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n  var dot5 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  function obbOf(c) {\n    return { o: c[0], e: [sub3(c[4], c[0]), sub3(c[2], c[0]), sub3(c[1], c[0])] };\n  }\n  function rayOBB(o, d, B) {\n    let t0 = -Infinity, t1 = Infinity;\n    const r = sub3(o, B.o);\n    for (let i = 0; i < 3; i++) {\n      const e = B.e[i], L2 = dot5(e, e);\n      if (L2 < 1e-9) continue;\n      const L = Math.sqrt(L2), a = [e[0] / L, e[1] / L, e[2] / L];\n      const ro = dot5(r, a), rd = dot5(d, a);\n      if (Math.abs(rd) < 1e-12) {\n        if (ro < 0 || ro > L) return null;\n        continue;\n      }\n      let ta = (0 - ro) / rd, tb = (L - ro) / rd;\n      if (ta > tb) {\n        const q = ta;\n        ta = tb;\n        tb = q;\n      }\n      if (ta > t0) t0 = ta;\n      if (tb < t1) t1 = tb;\n      if (t0 > t1) return null;\n    }\n    if (t1 < 0) return null;\n    return Math.max(t0, 0);\n  }\n  function boxPoints(c) {\n    const out = [];\n    for (let i = 0; i < 8; i++) out.push({ p: c[i], mids: 0 });\n    for (let i = 0; i < 8; i++) for (const bit of [4, 2, 1]) {\n      const j = i | bit;\n      if (j === i) continue;\n      out.push({ p: [(c[i][0] + c[j][0]) / 2, (c[i][1] + c[j][1]) / 2, (c[i][2] + c[j][2]) / 2], mids: 1 });\n    }\n    return out;\n  }\n  function installMeasure(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    const M = st.measure = { on: false, pts: [], hover: null, down: null, grab: null, grabWas: null };\n    const cache3 = { key: null, cands: null, occ: null }, perUnit = /* @__PURE__ */ new Map();\n    function on() {\n      return M.on;\n    }\n    function hint() {\n      return \"Measuring - click a corner, hole or fitting, then another. Points snap like magnets. Drag to turn the view; Esc to stop.\";\n    }\n    function redraw() {\n      ctx.changed(\"handles\");\n      ctx.frame();\n    }\n    function build3() {\n      var _a, _b;\n      const authority = scene.hardwareXray && ((_a = scene.productionHardware) == null ? void 0 : _a.enabled);\n      const hw = scene.productionHardware;\n      const productionKey = authority ? [hw.status, (_b = hw.packet) == null ? void 0 : _b.sourceSha256, hw.key === hardwareKey(scene)].join(\":\") : \"\";\n      const key2 = JSON.stringify([scene.units, scene.room || null, productionKey]);\n      if (cache3.key === key2) return cache3;\n      const production = authority ? hardwarePrimitives(scene, hw).items : null;\n      const cands = [], occ = [], seen = /* @__PURE__ */ new Set();\n      const add = (c) => {\n        const k = c.p.map((v) => Math.round(v * 5)).join(\",\") + \"|\" + c.rank;\n        if (seen.has(k)) return;\n        seen.add(k);\n        cands.push(c);\n      };\n      const sceneKey = key2, live = /* @__PURE__ */ new Set();\n      for (const u of scene.units) {\n        const open = !!(u.doorOpen || u.drawerOpen || u.drawers && u.drawers.some(Boolean) || u.leafOpen && u.leafOpen.some(Boolean));\n        const uk = JSON.stringify(u) + productionKey + (open ? sceneKey : \"\");\n        live.add(u.id);\n        let hit2 = perUnit.get(u.id);\n        if (!hit2 || hit2.k !== uk) {\n          let f0;\n          try {\n            f0 = unitFeatures(u, production);\n          } catch {\n            f0 = { boxes: [], pts: [] };\n          }\n          hit2 = { k: uk, f: f0 };\n          perUnit.set(u.id, hit2);\n        }\n        const f = hit2.f;\n        const who = displayName(scene.units, u);\n        for (const b of f.boxes) {\n          const name2 = b.name || (b.front ? \"Front\" : \"Board\");\n          occ.push({ unitId: u.id, front: b.front, B: obbOf(b.c), name: name2 });\n          for (const q of boxPoints(b.c)) {\n            const kind = q.mids ? \"edge middle\" : \"corner\";\n            add({ p: q.p, rank: q.mids, kind, part: name2, unitId: u.id, label: kind + \" \\xB7 \" + name2 + \" \\xB7 \" + who });\n          }\n        }\n        for (const q of f.pts) add({\n          p: q.p,\n          rank: q.rank,\n          kind: q.kind,\n          part: q.part || \"\",\n          unitId: u.id,\n          label: q.kind + (q.part ? \" \\xB7 \" + q.part : \"\") + \" \\xB7 \" + who\n        });\n      }\n      for (const id of Array.from(perUnit.keys())) if (!live.has(id)) perUnit.delete(id);\n      let plinths = [];\n      try {\n        plinths = plinthFeatures(scene.units);\n      } catch {\n        plinths = [];\n      }\n      for (const pf of plinths) {\n        const who = displayName(scene.units, scene.units.find((v) => v.id === pf.unitId));\n        for (const b of pf.boxes) {\n          const name2 = b.name || \"Plinth\";\n          occ.push({ unitId: pf.unitId, front: false, B: obbOf(b.c), name: name2 });\n          if (name2 !== \"Plinth\") continue;\n          for (const q of boxPoints(b.c)) {\n            const kind = q.mids ? \"edge middle\" : \"corner\";\n            add({ p: q.p, rank: q.mids, kind, part: name2, unitId: pf.unitId, label: kind + \" \\xB7 \" + name2 + \" \\xB7 \" + who });\n          }\n        }\n      }\n      const R4 = roomSize(), F = -LEG_H;\n      if (R4 && R4.width && R4.depth) {\n        const top = R4.height || 2400;\n        for (const [x, z, nm] of [[0, 0, \"back-left\"], [R4.width, 0, \"back-right\"], [0, R4.depth, \"front-left\"], [R4.width, R4.depth, \"front-right\"]]) {\n          const walls = [z === 0 ? \"back\" : \"front\", x === 0 ? \"left\" : \"right\"];\n          cands.push({ p: [x, F, z], rank: 0, kind: \"room corner\", part: nm + \" at the floor\", unitId: null, walls, label: \"room corner \\xB7 \" + nm + \" at the floor\" });\n          cands.push({ p: [x, top, z], rank: 0, kind: \"room corner\", part: nm + \" at the top\", unitId: null, walls, label: \"room corner \\xB7 \" + nm + \" at the top of the wall\" });\n        }\n      }\n      cache3.key = key2;\n      cache3.cands = cands;\n      cache3.occ = occ;\n      return cache3;\n    }\n    function wallsSeen(eye) {\n      const R4 = roomSize();\n      return { back: eye[2] > 0, front: eye[2] < R4.depth, left: eye[0] > 0, right: eye[0] < R4.width, floor: eye[1] > -LEG_H };\n    }\n    function clearUnits() {\n      const s = /* @__PURE__ */ new Set();\n      if (scene.measureOn && scene.measureUnit) {\n        s.add(scene.measureUnit);\n        if (scene.selectedId) s.add(scene.selectedId);\n      }\n      return s;\n    }\n    function cutUnits() {\n      return new Set(scene.viewCut || []);\n    }\n    function hiddenFrom(eye, p, occ, clear2, cut) {\n      var _a;\n      const v = sub3(p, eye), L = Math.hypot(v[0], v[1], v[2]);\n      if (L < 1) return false;\n      const d = [v[0] / L, v[1] / L, v[2] / L];\n      for (const o of occ) {\n        if (scene.hardwareXray && ((_a = scene.productionHardware) == null ? void 0 : _a.enabled) || o.front && clear2.has(o.unitId)) continue;\n        if (cut && cut.has(o.unitId)) continue;\n        const t = rayOBB(eye, d, o.B);\n        if (t !== null && t < L - HIDE_MM) return true;\n      }\n      return false;\n    }\n    function canvasXY(cx, cy) {\n      const r = ctx.liveRect();\n      return r ? { x: cx - r.left, y: cy - r.top } : { x: cx, y: cy };\n    }\n    function anchorPoint() {\n      if (M.grab != null) return M.pts[1 - M.grab] ? M.pts[1 - M.grab].p : null;\n      return M.pts.length === 1 ? M.pts[0].p : null;\n    }\n    function squareFeet(a, seen) {\n      if (!a) return [];\n      const R4 = roomSize(), out = [];\n      const inRoom2 = (p) => p[0] >= -1 && p[0] <= R4.width + 1 && p[2] >= -1 && p[2] <= R4.depth + 1 && p[1] >= -LEG_H - 1 && p[1] <= (R4.height || 2400) + 1;\n      const feet = [\n        [\"back\", [a[0], a[1], 0], \"the back wall\"],\n        [\"front\", [a[0], a[1], R4.depth], \"the front wall\"],\n        [\"left\", [0, a[1], a[2]], \"the left wall\"],\n        [\"right\", [R4.width, a[1], a[2]], \"the right wall\"],\n        [\"floor\", [a[0], -LEG_H, a[2]], \"the floor\"]\n      ];\n      for (const [w, p, nm] of feet) {\n        if (!seen[w] || !inRoom2(p)) continue;\n        if (Math.hypot(p[0] - a[0], p[1] - a[1], p[2] - a[2]) < 1) continue;\n        out.push({ p, rank: 0.4, kind: \"square to \" + nm, part: nm, unitId: null, walls: [w], label: \"square to \" + nm + \" \\xB7 straight from the first point\" });\n      }\n      return out;\n    }\n    function snapAt(cx, cy) {\n      var _a;\n      if (scene.explode > 0) return null;\n      if (!ctx.ensureCam()) return null;\n      const eye = ctx.camEye();\n      if (!eye) return null;\n      const s = canvasXY(cx, cy), C3 = build3(), clear2 = clearUnits(), seen = wallsSeen(eye), cut = cutUnits();\n      const near2 = [];\n      const consider = (c) => {\n        if (c.walls && !c.walls.some((w) => seen[w])) return;\n        if (c.unitId !== null && cut.has(c.unitId)) return;\n        const q = clientOfWorld(ctx, c.p);\n        if (!q) return;\n        const d = Math.hypot(q.x - s.x, q.y - s.y);\n        if (d > SNAP_TOL_PX) return;\n        near2.push({ c, d, score: d + c.rank * SNAP_RANK_PX, camD: Math.hypot(c.p[0] - eye[0], c.p[1] - eye[1], c.p[2] - eye[2]) });\n      };\n      C3.cands.forEach(consider);\n      squareFeet(anchorPoint(), seen).forEach(consider);\n      near2.sort((a, b) => a.score - b.score);\n      let best = null;\n      for (const n of near2) {\n        if (best && n.score > best.score + 1) break;\n        if (n.c.unitId !== null && hiddenFrom(eye, n.c.p, C3.occ, clear2, cut)) continue;\n        if (!best || n.score < best.score - 1 || Math.abs(n.score - best.score) <= 1 && n.camD < best.camD) best = n;\n      }\n      if (best) return {\n        p: best.c.p.slice(),\n        kind: best.c.kind,\n        unitId: best.c.unitId,\n        part: best.c.part,\n        label: best.c.label,\n        px: Math.round(best.d * 10) / 10\n      };\n      const ray = ctx.pointerRay(cx, cy);\n      if (!ray) return null;\n      let hit2 = null;\n      for (const o of C3.occ) {\n        if (scene.hardwareXray && ((_a = scene.productionHardware) == null ? void 0 : _a.enabled) || o.front && clear2.has(o.unitId)) continue;\n        if (cut.has(o.unitId)) continue;\n        const t = rayOBB(ray.o, ray.d, o.B);\n        if (t !== null && t > 1 && (!hit2 || t < hit2.t)) hit2 = { t, o };\n      }\n      const R4 = roomSize();\n      const planes = [\n        [\"floor\", 1, -LEG_H, \"the floor\"],\n        [\"back\", 2, 0, \"the back wall\"],\n        [\"front\", 2, R4.depth, \"the front wall\"],\n        [\"left\", 0, 0, \"the left wall\"],\n        [\"right\", 0, R4.width, \"the right wall\"]\n      ];\n      let wall = null;\n      for (const [w, ax, at, nm] of planes) {\n        if (!seen[w] || Math.abs(ray.d[ax]) < 1e-9) continue;\n        const t = (at - ray.o[ax]) / ray.d[ax];\n        if (t <= 1) continue;\n        const p = [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t];\n        if (p[0] < -1 || p[0] > R4.width + 1 || p[2] < -1 || p[2] > R4.depth + 1 || p[1] < -LEG_H - 1 || p[1] > (R4.height || 2400) + 1) continue;\n        if (!wall || t < wall.t) wall = { t, p, nm };\n      }\n      if (hit2 && (!wall || hit2.t < wall.t)) {\n        const u = scene.units.filter((v) => v.id === hit2.o.unitId)[0];\n        const w = [ray.o[0] + ray.d[0] * hit2.t, ray.o[1] + ray.d[1] * hit2.t, ray.o[2] + ray.d[2] * hit2.t];\n        return { p: w, kind: \"on the face\", unitId: hit2.o.unitId, part: hit2.o.name, label: \"on the face \\xB7 \" + hit2.o.name + \" \\xB7 \" + (u ? displayName(scene.units, u) : \"cabinet\"), px: null };\n      }\n      if (wall) return { p: wall.p, kind: \"on \" + wall.nm, unitId: null, part: wall.nm, label: \"on \" + wall.nm, px: null };\n      return null;\n    }\n    function setOn(want) {\n      const next = !!want;\n      if (next && scene.explode > 0) {\n        ctx.cue(\"Exploded view is a preview - set it back to Assembled to measure\");\n        return { ok: false, why: \"exploded\" };\n      }\n      if (next) {\n        if (scene.sizeMode || scene.moveMode) ctx.setAction(null);\n        if (ctx.inside && ctx.inside.modeLeft && st.insideTool) ctx.inside.modeLeft();\n        scene.hoverPart = null;\n      }\n      M.on = next;\n      scene.measureOn = next;\n      M.pts = [];\n      M.hover = null;\n      M.down = null;\n      M.grab = null;\n      scene.measureUnit = null;\n      ctx.cue(next ? hint() : null);\n      ctx.changed(\"handles\");\n      ctx.syncControls();\n      ctx.refresh();\n      return { ok: true, on: next };\n    }\n    function modeLeft() {\n      if (M.on) {\n        M.on = false;\n        scene.measureOn = false;\n        M.pts = [];\n        M.hover = null;\n        M.down = null;\n        M.grab = null;\n        scene.measureUnit = null;\n      }\n    }\n    function readout() {\n      const pair = M.pts.length === 2 ? [M.pts[0].p, M.pts[1].p] : M.pts.length === 1 && M.hover ? [M.pts[0].p, M.hover.p] : null;\n      return pair ? measureText(pair[0], pair[1]) : null;\n    }\n    function cueNow() {\n      const r = readout();\n      if (M.grab != null) {\n        ctx.cue(r ? r.text + \" - release to keep this end\" : hint());\n        return;\n      }\n      if (M.pts.length === 2) {\n        ctx.cue(r.text + \" \\xB7 click to measure again, drag an end ball to adjust, Esc to clear\");\n        return;\n      }\n      if (M.pts.length === 1) {\n        ctx.cue(M.hover ? r.text + \" - click to fix the second point (\" + M.hover.label + \")\" : \"Now click a second corner\");\n        return;\n      }\n      ctx.cue(M.hover ? M.hover.label + \" - click to start measuring here\" : hint());\n    }\n    function endUnder(cx, cy) {\n      if (!M.pts.length) return -1;\n      const s = canvasXY(cx, cy);\n      let bi = -1, bd = GRAB_PX;\n      M.pts.forEach((q, i) => {\n        const c = clientOfWorld(ctx, q.p);\n        if (!c) return;\n        const d = Math.hypot(c.x - s.x, c.y - s.y);\n        if (d <= bd) {\n          bd = d;\n          bi = i;\n        }\n      });\n      return bi;\n    }\n    const LOOK_KEEP_PX = 28;\n    function lockedUnit() {\n      const fixed = M.grab != null ? M.pts[1 - M.grab] : M.pts.length === 1 ? M.pts[0] : null;\n      const id = fixed && fixed.unitId;\n      return id && scene.units.some((u) => u.id === id) ? id : null;\n    }\n    function nearUnitOnScreen(id, cx, cy, px) {\n      const u = scene.units.find((v) => v.id === id);\n      if (!u || !ctx.pointer.unitAABB) return false;\n      const B = ctx.pointer.unitAABB(u), s0 = canvasXY(cx, cy);\n      let x0 = Infinity, x1 = -Infinity, y0 = Infinity, y1 = -Infinity, any = false;\n      for (const X of [B.x0, B.x1]) for (const Y of [B.y0, B.y1]) for (const Z of [B.z0, B.z1]) {\n        const q = clientOfWorld(ctx, [X, Y, Z]);\n        if (!q) continue;\n        any = true;\n        x0 = Math.min(x0, q.x);\n        x1 = Math.max(x1, q.x);\n        y0 = Math.min(y0, q.y);\n        y1 = Math.max(y1, q.y);\n      }\n      return any && s0.x >= x0 - px && s0.x <= x1 + px && s0.y >= y0 - px && s0.y <= y1 + px;\n    }\n    function hover(e) {\n      if (!M.on) return false;\n      if (st.drag) {\n        if (M.hover) {\n          M.hover = null;\n          redraw();\n        }\n        return true;\n      }\n      const was = scene.measureUnit;\n      const pick = ctx.pointer.pickAt(e.clientX, e.clientY) || null;\n      const lock = lockedUnit();\n      scene.measureUnit = lock || pick;\n      M.hover = snapAt(e.clientX, e.clientY);\n      if (!lock && M.hover && M.hover.unitId && M.hover.unitId !== pick) {\n        const first = M.hover;\n        scene.measureUnit = first.unitId;\n        const again = snapAt(e.clientX, e.clientY);\n        if (again && again.unitId === first.unitId) M.hover = again;\n        else {\n          scene.measureUnit = pick;\n          M.hover = first;\n        }\n      }\n      if (!lock && was && scene.measureUnit !== was && !(M.hover && M.hover.unitId && M.hover.unitId !== was && !/^on the face/.test(M.hover.kind || \"\")) && nearUnitOnScreen(was, e.clientX, e.clientY, LOOK_KEEP_PX)) {\n        scene.measureUnit = was;\n        M.hover = snapAt(e.clientX, e.clientY);\n      }\n      if (M.hover) M.rearmed = false;\n      if (M.grab != null && M.hover) M.pts[M.grab] = M.hover;\n      M.overEnd = M.grab == null && M.pts.length === 2 ? endUnder(e.clientX, e.clientY) : -1;\n      cueNow();\n      if (was !== scene.measureUnit) ctx.refresh();\n      else redraw();\n      return true;\n    }\n    function leave() {\n      if (!M.on || M.grab != null) return;\n      if (M.rearmed && M.hover) return;\n      if (lockedUnit()) {\n        if (M.hover) {\n          M.hover = null;\n          cueNow();\n          redraw();\n        }\n        return;\n      }\n      if (M.hover || scene.measureUnit) {\n        M.hover = null;\n        scene.measureUnit = null;\n        cueNow();\n        ctx.refresh();\n      }\n    }\n    function down(e) {\n      if (!M.on) return false;\n      if (e.button != null && e.button !== 0) return false;\n      M.down = { x: e.clientX, y: e.clientY };\n      const i = M.pts.length === 2 ? endUnder(e.clientX, e.clientY) : -1;\n      if (i >= 0) {\n        M.grab = i;\n        M.grabWas = M.pts[i];\n        if (e.preventDefault) e.preventDefault();\n        return true;\n      }\n      return false;\n    }\n    function up(e) {\n      if (!M.on || !M.down) return false;\n      const d = M.down;\n      M.down = null;\n      const moved = Math.hypot(e.clientX - d.x, e.clientY - d.y) > CLICK_PX2;\n      if (M.grab != null) {\n        const s = snapAt(e.clientX, e.clientY);\n        const was = M.grabWas;\n        if (moved && s) M.pts[M.grab] = s;\n        else M.pts[M.grab] = was;\n        M.grab = null;\n        M.grabWas = null;\n        if (!moved) {\n          M.pts = [];\n          M.hover = was;\n          M.rearmed = true;\n        }\n        cueNow();\n        redraw();\n        return true;\n      }\n      if (moved) return false;\n      return placeAt(e.clientX, e.clientY).ok;\n    }\n    function placeAt(cx, cy) {\n      if (!M.on) return { ok: false, why: \"measure is off\" };\n      const s = M.rearmed && M.hover ? M.hover : snapAt(cx, cy);\n      if (!s) {\n        ctx.cue(scene.explode > 0 ? \"Exploded view is a preview - set it back to Assembled to measure\" : \"Point at a cabinet corner or edge to measure from it\");\n        return { ok: false, why: \"nothing here\" };\n      }\n      M.rearmed = false;\n      if (M.pts.length >= 2) {\n        M.pts = [];\n        M.hover = s;\n        M.rearmed = true;\n        cueNow();\n        redraw();\n        return { ok: true, count: 0, rearmed: true, point: null, reading: null };\n      }\n      M.pts.push(s);\n      M.hover = s;\n      cueNow();\n      redraw();\n      return { ok: true, count: M.pts.length, point: s, reading: readout() };\n    }\n    function clear() {\n      M.pts = [];\n      M.grab = null;\n      M.down = null;\n      cueNow();\n      redraw();\n      return { ok: true };\n    }\n    function removeLast() {\n      if (!M.pts.length) return { ok: false };\n      M.pts.pop();\n      cueNow();\n      redraw();\n      return { ok: true, count: M.pts.length };\n    }\n    function key(e) {\n      if (!M.on) return false;\n      const k = String(e.key || \"\");\n      if (k === \"Escape\") {\n        if (M.grab != null) {\n          M.pts[M.grab] = M.grabWas;\n          M.grab = null;\n          M.down = null;\n          cueNow();\n          redraw();\n          return true;\n        }\n        if (M.pts.length) {\n          clear();\n          return true;\n        }\n        setOn(false);\n        return true;\n      }\n      if (k === \"Backspace\" || k === \"Delete\") {\n        removeLast();\n        return true;\n      }\n      return false;\n    }\n    function view() {\n      if (!M.on || scene.explode > 0) return null;\n      const pts = M.pts.map((q) => ({ p: q.p, kind: q.kind, label: q.label }));\n      const hv = M.hover && M.pts.length !== 2 && M.grab == null || M.grab != null && M.hover ? { p: M.hover.p, kind: M.hover.kind, label: M.hover.label, hot: HOT_KIND.test(M.hover.kind) } : null;\n      const pair = M.pts.length === 2 ? [M.pts[0].p, M.pts[1].p] : M.pts.length === 1 && M.hover ? [M.pts[0].p, M.hover.p] : null;\n      const mt = pair ? measureText(pair[0], pair[1]) : null;\n      return {\n        pts,\n        hover: hv,\n        line: pair ? { a: pair[0], b: pair[1], text: mt.text, short: Math.round(mt.mm) + \" mm\", live: M.pts.length !== 2 || M.grab != null } : null,\n        grab: M.grab,\n        overEnd: M.overEnd != null ? M.overEnd : -1\n      };\n    }\n    const probe = {\n      count: () => M.pts.length,\n      points: () => M.pts.map((q) => ({ p: q.p.map((v) => Math.round(v * 10) / 10), kind: q.kind, label: q.label })),\n      hover: () => M.hover ? { p: M.hover.p.map((v) => Math.round(v * 10) / 10), kind: M.hover.kind, label: M.hover.label, px: M.hover.px } : null,\n      reading: () => {\n        const r = readout();\n        return r ? { mm: Math.round(r.mm * 10) / 10, text: r.text } : null;\n      },\n      snapAt: (x, y) => {\n        const s = snapAt(x, y);\n        return s ? { p: s.p.map((v) => Math.round(v * 10) / 10), kind: s.kind, label: s.label, px: s.px } : null;\n      },\n      /* what is drawn and can be caught, straight from the capture (render/mesh/features.js) */\n      features: (id) => {\n        var _a;\n        const u = scene.units.filter((v) => v.id === id)[0];\n        const p = scene.hardwareXray && ((_a = scene.productionHardware) == null ? void 0 : _a.enabled) ? hardwarePrimitives(scene, scene.productionHardware).items : null;\n        return u ? unitFeatures(u, p) : null;\n      },\n      candidates: () => build3().cands.map((c) => ({ p: c.p, kind: c.kind, rank: c.rank, part: c.part, unitId: c.unitId, label: c.label, walls: c.walls || null })),\n      hidden: (p) => {\n        const e = ctx.camEye();\n        return e ? hiddenFrom(e, p, build3().occ, clearUnits(), cutUnits()) : null;\n      },\n      screenOf: (p) => {\n        const c = clientOfWorld(ctx, p);\n        const r = ctx.liveRect();\n        return c ? { x: c.x + (r ? r.left : 0), y: c.y + (r ? r.top : 0) } : null;\n      }\n    };\n    const api = { on, setOn, modeLeft, hover, leave, down, up, key, placeAt, clear, removeLast, view, readout, snapAt, probe, hint };\n    ctx.measure = api;\n    const define = ctx.commands.define;\n    define(\"measureTool\", {\n      history: null,\n      args: { on: \"true | false (\\u043D\\u0435\\u0442 \\u2014 \\u043F\\u0435\\u0440\\u0435\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C)\" },\n      doc: \"\\u0420\\u0443\\u043B\\u0435\\u0442\\u043A\\u0430: \\u0434\\u0432\\u0430 \\u0449\\u0435\\u043B\\u0447\\u043A\\u0430 \\u043F\\u043E \\u0443\\u0433\\u043B\\u0430\\u043C, \\u043C\\u0430\\u0433\\u043D\\u0438\\u0442 14 px \\u043A \\u0443\\u0433\\u043B\\u0430\\u043C \\u0438 \\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0430\\u043C \\u0440\\u0451\\u0431\\u0435\\u0440 \\u0434\\u043E\\u0441\\u043E\\u043A ([data-ub-measure], \\u043A\\u043B\\u0430\\u0432\\u0438\\u0448\\u0430 M)\",\n      run(a) {\n        return setOn(a && a.on != null ? !!a.on : !M.on);\n      }\n    });\n    define(\"measureAt\", {\n      history: null,\n      args: { x: \"clientX\", y: \"clientY\" },\n      doc: \"\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u0442\\u043E\\u0447\\u043A\\u0443 \\u0440\\u0443\\u043B\\u0435\\u0442\\u043A\\u0438 \\u0432 \\u0442\\u043E\\u0447\\u043A\\u0443 \\u0445\\u043E\\u043B\\u0441\\u0442\\u0430 (\\u0442\\u043E \\u0436\\u0435, \\u0447\\u0442\\u043E \\u0449\\u0435\\u043B\\u0447\\u043E\\u043A): \\u043C\\u0430\\u0433\\u043D\\u0438\\u0442 \\u043A \\u0431\\u043B\\u0438\\u0436\\u0430\\u0439\\u0448\\u0435\\u043C\\u0443 \\u0443\\u0433\\u043B\\u0443\",\n      run(a) {\n        return placeAt(a.x, a.y);\n      }\n    });\n    define(\"measureClear\", {\n      history: null,\n      doc: \"\\u0423\\u0431\\u0440\\u0430\\u0442\\u044C \\u0438\\u0437\\u043C\\u0435\\u0440\\u0435\\u043D\\u0438\\u0435 \\u0440\\u0443\\u043B\\u0435\\u0442\\u043A\\u0438 (\\u0438\\u043D\\u0441\\u0442\\u0440\\u0443\\u043C\\u0435\\u043D\\u0442 \\u043E\\u0441\\u0442\\u0430\\u0451\\u0442\\u0441\\u044F)\",\n      run() {\n        return clear();\n      }\n    });\n    return api;\n  }\n\n  // v2/src/interact/quick-add.js\n  var ANCHOR = { out: 70, front: 40, height: 0.5, hideBehind: 40, clearPx: 35 };\n  function installQuickAdd(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    function busyWhy() {\n      if (scene.measureOn) return \"measuring\";\n      if (scene.insideTool) return \"inside tool\";\n      if (scene.explode > 0) return \"exploded\";\n      if (st.drag && st.drag.moving || st.handleDrag || st.partDrag || st.sizeDrag || st.trayGhost) return \"dragging\";\n      return null;\n    }\n    function selUnit() {\n      const u = ctx.sel();\n      return u && scene.units.indexOf(u) >= 0 && u.id === scene.selectedId ? u : null;\n    }\n    function hiddenWhy() {\n      const u = selUnit();\n      if (!u) return \"nothing selected\";\n      if (!quickAddable(u)) return \"corner\";\n      return busyWhy();\n    }\n    let armed = null;\n    const srcTileOf = (u) => cornerArmSides(u) ? cornerPlusTile(u) : tileOf(u);\n    function pending() {\n      return armed ? { ...armed } : null;\n    }\n    function disarm() {\n      const was = !!armed;\n      armed = null;\n      return was;\n    }\n    function check() {\n      if (!armed) return null;\n      const u = selUnit();\n      if (!u || !quickAddable(u) || busyWhy()) {\n        armed = null;\n        return null;\n      }\n      if (u.id !== armed.src) {\n        if (!scene.units.some((v) => v.id === armed.src)) {\n          armed.src = u.id;\n          armed.srcTile = srcTileOf(u);\n          if (!plusTileOk(u, armed.tile)) armed.tile = armed.srcTile;\n        } else armed = null;\n      }\n      return pending();\n    }\n    function arm(side) {\n      const u = selUnit();\n      if (!u || hiddenWhy() || side !== \"left\" && side !== \"right\") {\n        armed = null;\n        return null;\n      }\n      const srcTile = srcTileOf(u);\n      const tile = armed && armed.src === u.id && plusTileOk(u, armed.tile) ? armed.tile : srcTile;\n      armed = { src: u.id, side, tile, srcTile };\n      return pending();\n    }\n    function choose(tile) {\n      if (!check()) return { ok: false, why: \"not armed\" };\n      const u = selUnit();\n      if (!plusTileOk(u, tile)) return { ok: false, why: \"not beside\", name: TILE_NAME[tile] || tile };\n      armed.tile = tile;\n      return { ok: true, tile };\n    }\n    function commit(side) {\n      if (!check()) return { ok: false, why: \"not armed\" };\n      if (side === \"left\" || side === \"right\") armed.side = side;\n      const a = armed;\n      const r = ctx.commands.run(\"addBeside\", a.tile === a.srcTile ? { side: a.side } : { side: a.side, tile: a.tile });\n      if (r && r.ok) {\n        const nu = scene.units.find((v) => v.id === r.id);\n        armed = nu && nu.id === scene.selectedId && quickAddable(nu) ? { src: nu.id, side: a.side, tile: a.tile, srcTile: srcTileOf(nu) } : null;\n      }\n      return r || { ok: false };\n    }\n    function tileName2(t) {\n      return TILE_NAME[t] || \"cabinet\";\n    }\n    function chosenFits(u, side) {\n      if (!armed || armed.src !== u.id || armed.side !== side || armed.tile === armed.srcTile) return false;\n      return !!besideAdapted(scene.units, u, side, () => plusUnit(u, armed.tile, scene.addCarcass, true));\n    }\n    function free(side) {\n      const u = selUnit();\n      return !!u && (besideFree(scene.units, u, side) || chosenFits(u, side));\n    }\n    function title(side) {\n      return \"Add matching cabinet on the \" + side;\n    }\n    function frame2() {\n      const u = selUnit();\n      return u ? besideFrame(u) : null;\n    }\n    function worldAnchor(u, side) {\n      const S2 = besideSide(u, side);\n      const f = S2.box, d = S2.d, n = S2.n;\n      const cx = (f.x0 + f.x1) / 2, cz = (f.z0 + f.z1) / 2;\n      let x = cx, z = cz;\n      if (d.dx > 0) x = f.x1 + ANCHOR.out;\n      else if (d.dx < 0) x = f.x0 - ANCHOR.out;\n      else if (d.dz > 0) z = f.z1 + ANCHOR.out;\n      else z = f.z0 - ANCHOR.out;\n      if (n.dx > 0) x = f.x1 + ANCHOR.front;\n      else if (n.dx < 0) x = f.x0 - ANCHOR.front;\n      else if (n.dz > 0) z = f.z1 + ANCHOR.front;\n      else z = f.z0 - ANCHOR.front;\n      return [x, (u.y || 0) + (u.h || 0) * ANCHOR.height, z];\n    }\n    function localAnchor(u, side) {\n      const p = worldAnchor(u, side), k = ((u.rot || 0) % 4 + 4) % 4, X = p[0] - u.x, Z = p[2] - u.z;\n      const lx = k === 0 ? X : k === 1 ? Z : k === 2 ? u.w - X : u.w - Z;\n      const lz = k === 0 ? Z : k === 1 ? u.d - X : k === 2 ? u.d - Z : X;\n      return [lx, p[1] - (u.y || 0), lz];\n    }\n    function behindSomething(p, s) {\n      if (!ctx.meshPoint || !ctx.camEye) return false;\n      const r = ctx.opts.rect ? ctx.opts.rect() : null;\n      const eye = ctx.camEye();\n      if (!r || !eye) return false;\n      const hit2 = ctx.meshPoint(r.left + s.x, r.top + s.y);\n      if (!hit2) return false;\n      const dh = Math.hypot(hit2[0] - eye[0], hit2[1] - eye[1], hit2[2] - eye[2]);\n      const dp = Math.hypot(p[0] - eye[0], p[1] - eye[1], p[2] - eye[2]);\n      return dh < dp - ANCHOR.hideBehind;\n    }\n    const SAFE = { beyondPx: 0, edgeOnPx: 1, frontPadPx: 2 };\n    function frontQuads() {\n      const out = [];\n      for (const v of scene.units) {\n        let faces = [];\n        try {\n          faces = frontFaces(v);\n        } catch {\n          faces = [];\n        }\n        const y0 = v.family === \"wall\" ? (v.y || 0) + LEG_H : 0, y1 = (v.y || 0) + (v.h || 0) + LEG_H;\n        for (const f of faces) {\n          const pts = f.axis === \"z\" ? [[f.from, y0, f.at], [f.to, y0, f.at], [f.to, y1, f.at], [f.from, y1, f.at]] : [[f.at, y0, f.from], [f.at, y0, f.to], [f.at, y1, f.to], [f.at, y1, f.from]];\n          const q = pts.map((w) => clientOfWorld(ctx, w));\n          if (q.every(Boolean)) {\n            q.unitId = v.id;\n            q.axis = f.axis;\n            q.at = f.at;\n            let nrm = null;\n            for (const B of footBoxes(v)) {\n              if (f.axis === \"z\") {\n                if (Math.abs(B.z1 - f.at) < 1) nrm = [0, 1];\n                else if (Math.abs(B.z0 - f.at) < 1) nrm = [0, -1];\n              } else {\n                if (Math.abs(B.x1 - f.at) < 1) nrm = [1, 0];\n                else if (Math.abs(B.x0 - f.at) < 1) nrm = [-1, 0];\n              }\n              if (nrm) break;\n            }\n            q.nrm = nrm;\n            q.mid = [(pts[0][0] + pts[2][0]) / 2, (pts[0][2] + pts[2][2]) / 2];\n            out.push(q);\n          }\n        }\n      }\n      return out;\n    }\n    function insideQuad(q, x, y, pad) {\n      let sign = 0;\n      for (let i = 0; i < 4; i++) {\n        const a = q[i], b = q[(i + 1) % 4];\n        const ex = b.x - a.x, ey = b.y - a.y, len = Math.hypot(ex, ey) || 1;\n        const c = (ex * (y - a.y) - ey * (x - a.x)) / len;\n        if (Math.abs(c) <= pad) continue;\n        const sg = c > 0 ? 1 : -1;\n        if (sign === 0) sign = sg;\n        else if (sg !== sign) return false;\n      }\n      return true;\n    }\n    function unsafeSpot(u, side, s) {\n      return !!unsafeWhy(u, side, s);\n    }\n    function safetyHide(side) {\n      const u = selUnit();\n      if (!u || !free(side)) return null;\n      const s = clientOfWorld(ctx, worldAnchor(u, side));\n      if (!s) return null;\n      return unsafeWhy(u, side, s);\n    }\n    function unsafeWhy(u, side, s) {\n      const S2 = besideSide(u, side), f = S2.box, d = S2.d, n = S2.n;\n      const p = worldAnchor(u, side);\n      let ex = p[0], ez = p[2];\n      if (d.dx > 0) ex = f.x1;\n      else if (d.dx < 0) ex = f.x0;\n      else if (d.dz > 0) ez = f.z1;\n      else ez = f.z0;\n      if (n.dx > 0) ex = f.x1;\n      else if (n.dx < 0) ex = f.x0;\n      else if (n.dz > 0) ez = f.z1;\n      else ez = f.z0;\n      const E = clientOfWorld(ctx, [ex, p[1], ez]), E2 = clientOfWorld(ctx, [ex + d.dx * 100, p[1], ez + d.dz * 100]);\n      if (!E || !E2) return \"no-edge\";\n      const sx = E2.x - E.x, sy = E2.y - E.y, sl = Math.hypot(sx, sy);\n      if (sl < SAFE.edgeOnPx) return \"edge-on \" + sl.toFixed(1);\n      {\n        const b = ((s.x - E.x) * sx + (s.y - E.y) * sy) / sl;\n        if (b < SAFE.beyondPx) return \"not-beyond \" + b.toFixed(1);\n      }\n      const eyeNow = ctx.camEye ? ctx.camEye() : null;\n      const backOn = (q) => !!(eyeNow && q.nrm && (eyeNow[0] - q.mid[0]) * q.nrm[0] + (eyeNow[2] - q.mid[1]) * q.nrm[1] <= 0);\n      for (const q of frontQuads()) if (insideQuad(q, s.x, s.y, SAFE.frontPadPx)) return \"on-front \" + q.unitId + (backOn(q) ? \" back\" : \" face\") + \" \" + JSON.stringify(q.map((c) => [Math.round(c.x), Math.round(c.y)]));\n      return null;\n    }\n    function layout() {\n      if (hiddenWhy()) return [];\n      const u = selUnit();\n      const cs = ctx.canvasSize(), cw = cs.w, ch = cs.h, M = 4;\n      const out = [];\n      for (const side of [\"left\", \"right\"]) {\n        if (!free(side)) continue;\n        const p = worldAnchor(u, side);\n        const s = clientOfWorld(ctx, p);\n        if (!s) continue;\n        if (s.x < M || s.y < M || s.x > cw - M || s.y > ch - M) continue;\n        if (behindSomething(p, s)) continue;\n        if (unsafeSpot(u, side, s)) continue;\n        out.push({ side, x: s.x, y: s.y, title: title(side), world: p });\n      }\n      return out;\n    }\n    function layoutWhy() {\n      const h = hiddenWhy();\n      if (h) return { left: \"hidden: \" + h, right: \"hidden: \" + h };\n      const u = selUnit();\n      const cs = ctx.canvasSize(), cw = cs.w, ch = cs.h, M = 4, out = {};\n      for (const side of [\"left\", \"right\"]) {\n        if (!free(side)) {\n          out[side] = \"no free side\";\n          continue;\n        }\n        const p = worldAnchor(u, side), s = clientOfWorld(ctx, p);\n        if (!s) {\n          out[side] = \"behind the camera\";\n          continue;\n        }\n        if (s.x < M || s.y < M || s.x > cw - M || s.y > ch - M) {\n          out[side] = \"outside the canvas \" + Math.round(s.x) + \",\" + Math.round(s.y) + \" of \" + cw + \"x\" + ch;\n          continue;\n        }\n        if (behindSomething(p, s)) {\n          out[side] = \"behind something at \" + Math.round(s.x) + \",\" + Math.round(s.y);\n          continue;\n        }\n        const uw = unsafeWhy(u, side, s);\n        if (uw) {\n          out[side] = \"unsafe spot: \" + uw;\n          continue;\n        }\n        out[side] = \"drawn at \" + Math.round(s.x) + \",\" + Math.round(s.y);\n      }\n      return out;\n    }\n    function sceneAdd() {\n      if (busyWhy()) return false;\n      if (!scene.units.length) return true;\n      const u = selUnit();\n      if (!u || !quickAddable(u)) return true;\n      return !free(\"left\") && !free(\"right\");\n    }\n    function run(side) {\n      return ctx.commands.run(\"addBeside\", { side });\n    }\n    function follow(side) {\n      const u = selUnit();\n      if (!u || !free(side) || hiddenWhy()) return false;\n      if (layout().some((a) => a.side === side)) return false;\n      if (!(ctx.render && ctx.render.focusOn && ctx.render.focusOn(u.id))) return false;\n      if (ctx.frame) ctx.frame();\n      return true;\n    }\n    function spotWhy(side, s) {\n      const u = selUnit();\n      if (!u || !s || side !== \"left\" && side !== \"right\" || !free(side)) return \"no free side\";\n      try {\n        return unsafeWhy(u, side, s);\n      } catch {\n        return \"no-edge\";\n      }\n    }\n    function edgeSpan(side) {\n      const u = selUnit();\n      if (!u || side !== \"left\" && side !== \"right\") return null;\n      const p = worldAnchor(u, side), y0 = u.family === \"wall\" ? u.y || 0 : 0, y1 = (u.y || 0) + (u.h || 0);\n      const a = clientOfWorld(ctx, [p[0], y0, p[2]]), b = clientOfWorld(ctx, [p[0], y1, p[2]]);\n      return a && b ? Math.hypot(b.x - a.x, b.y - a.y) : null;\n    }\n    const pick = { arm, choose, commit, check, pending, disarm, tileName: tileName2, tileOf, allowed: (t) => plusTileOk(selUnit(), t) };\n    const quickAdd = { layout, layoutWhy, spotWhy, edgeSpan, run, follow, free, hiddenWhy, title, sceneAdd, localAnchor, worldAnchor, frame: frame2, safetyHide, pick };\n    ctx.quickAdd = quickAdd;\n    return quickAdd;\n  }\n\n  // v2/src/interact/opening-drag.js\n  var GRAB_PAD = 40;\n  var MOVE_PX = 3;\n  function installOpeningDrag(ctx) {\n    const scene = ctx.scene;\n    const st = { drag: null, press: null, size: null };\n    function wallHits(ray) {\n      if (!ray) return [];\n      const sz = roomSize(), out = [];\n      for (const wall of roomWallIds(scene.room)) {\n        const fr = wallFrame(wall, sz);\n        const n = [fr.inward[0], 0, fr.inward[1]];\n        const dn = ray.d[0] * n[0] + ray.d[2] * n[2];\n        if (dn >= -1e-6) continue;\n        const s0 = fr.pt(0, 0);\n        const t = ((s0[0] - ray.o[0]) * n[0] + (s0[1] - ray.o[2]) * n[2]) / dn;\n        if (!(t > 1)) continue;\n        const p = [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t];\n        const a = (p[0] - s0[0]) * fr.dir[0] + (p[2] - s0[1]) * fr.dir[1];\n        const v = p[1] + LEG_H;\n        if (a < -200 || a > fr.len + 200 || v < -200 || v > sz.height + LEG_H + 200) continue;\n        out.push({ wall, t, a, v, len: fr.len });\n      }\n      out.sort((p, q) => p.t - q.t);\n      return out;\n    }\n    function openingAt(clientX, clientY) {\n      const ops = openingsOf(scene.room);\n      if (!ops.length) return null;\n      const ray = ctx.pointerRay(clientX, clientY);\n      const hits = wallHits(ray);\n      if (!hits.length) return null;\n      const cab = ctx.pointer && ctx.pointer.hitRay ? ctx.pointer.hitRay(ray) : null;\n      for (const h of hits) {\n        if (cab && cab.t < h.t) return null;\n        const o = ops.find((q) => q.wall === h.wall && h.a >= q.x - GRAB_PAD && h.a <= q.x + q.w + GRAB_PAD && h.v >= q.y - GRAB_PAD && h.v <= q.y + q.h + GRAB_PAD);\n        if (o) return { id: o.id, wall: h.wall, a: h.a, v: h.v, t: h.t };\n        if (h.a >= 0 && h.a <= h.len) return null;\n      }\n      return null;\n    }\n    function wallAt(clientX, clientY) {\n      const hits = wallHits(ctx.pointerRay(clientX, clientY));\n      const h = hits.find((q) => q.a >= 0 && q.a <= q.len) || hits[0];\n      return h || null;\n    }\n    function select(id) {\n      if ((scene.roomSel || null) === (id || null)) return;\n      scene.roomSel = id || null;\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function arm(id) {\n      const was = scene.roomArmed || null;\n      if (was === (id || null)) return false;\n      scene.roomArmed = id || null;\n      ctx.changed(\"roomArmed\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function disarm(say) {\n      if (!scene.roomArmed) return false;\n      const o = openingsOf(scene.room).find((q) => q.id === scene.roomArmed);\n      arm(null);\n      if (say && o) ctx.cue(openingLabel(scene.room, o) + \" stays where it is - double-click it to move it again\");\n      return true;\n    }\n    function dblclick(e) {\n      if (!e || scene.measureOn || scene.insideTool || scene.explode > 0) return false;\n      const hit2 = openingAt(e.clientX, e.clientY);\n      if (!hit2) return false;\n      const o = openingsOf(scene.room).find((q) => q.id === hit2.id);\n      scene.roomSel = o.id;\n      arm(o.id);\n      ctx.cue(openingLabel(scene.room, o) + \" is ready to move - drag it along the wall or onto another wall; Done or Escape when finished\");\n      return true;\n    }\n    function down(e) {\n      if (!e || e.button != null && e.button !== 0) return false;\n      if (scene.measureOn || scene.insideTool || scene.explode > 0) return false;\n      const hit2 = openingAt(e.clientX, e.clientY);\n      if (!hit2 || hit2.id !== scene.roomArmed) {\n        if (scene.roomArmed) disarm(false);\n        if (!hit2 && scene.roomSel) select(null);\n        st.press = hit2 ? { id: hit2.id, x0: e.clientX, y0: e.clientY } : null;\n        return false;\n      }\n      st.press = null;\n      const o = openingsOf(scene.room).find((q) => q.id === hit2.id);\n      st.drag = {\n        id: o.id,\n        x0: e.clientX,\n        y0: e.clientY,\n        moved: false,\n        grabA: hit2.a - o.x,\n        grabV: hit2.v - o.y,\n        wall0: o.wall,\n        orig: JSON.parse(JSON.stringify(scene.room.openings)),\n        bad: null\n      };\n      select(o.id);\n      if (e.preventDefault) e.preventDefault();\n      ctx.cue(openingLabel(scene.room, o) + \" - drag it along the wall, or onto another wall, and let go\");\n      ctx.changed(\"roomDrag\");\n      return true;\n    }\n    function move(e) {\n      const p = st.press;\n      if (p && (Math.abs(e.clientX - p.x0) >= MOVE_PX || Math.abs(e.clientY - p.y0) >= MOVE_PX)) st.press = null;\n      const d = st.drag;\n      if (!d) return false;\n      if (!d.moved && Math.abs(e.clientX - d.x0) < MOVE_PX && Math.abs(e.clientY - d.y0) < MOVE_PX) return true;\n      d.moved = true;\n      const h = wallAt(e.clientX, e.clientY);\n      if (!h) return true;\n      const o = openingsOf(scene.room).find((q) => q.id === d.id);\n      if (!o) {\n        st.drag = null;\n        return true;\n      }\n      const x = h.wall === d.wall0 ? h.a - d.grabA : h.a - o.w / 2;\n      const y = o.kind === \"door\" ? 0 : o.y;\n      const r = ctx.commands.run(\"placeOpening\", { id: d.id, wall: h.wall, x, y, phase: \"check\" });\n      if (r.ok) {\n        d.bad = null;\n        scene.roomDrag = null;\n        ctx.commands.run(\"placeOpening\", { id: d.id, wall: h.wall, x: r.op.x, y: r.op.y, phase: \"live\" });\n      } else {\n        d.bad = r.why;\n        scene.roomDrag = { id: d.id, wall: r.op.wall, x: r.op.x, y: r.op.y, w: r.op.w, h: r.op.h, kind: o.kind, why: r.why };\n        ctx.cue(\"Not there: \" + r.why + \". Let go somewhere else, or it goes back.\");\n        ctx.refresh();\n      }\n      return true;\n    }\n    function up() {\n      const p = st.press;\n      st.press = null;\n      if (p && !st.drag && scene.roomSel !== p.id && openingsOf(scene.room).some((q) => q.id === p.id)) {\n        select(p.id);\n        const o2 = openingsOf(scene.room).find((q) => q.id === p.id);\n        ctx.cue(openingLabel(scene.room, o2) + \": click a measurement to type it exactly, double-click the \" + o2.kind + \" to move it with the mouse\");\n      }\n      const d = st.drag;\n      if (!d) return false;\n      st.drag = null;\n      const hadGhost = !!scene.roomDrag;\n      scene.roomDrag = null;\n      if (!d.moved) {\n        ctx.changed(\"roomDrag\");\n        if (hadGhost) ctx.refresh();\n        return true;\n      }\n      const o = openingsOf(scene.room).find((q) => q.id === d.id);\n      if (d.bad || !o) {\n        scene.room.openings = d.orig;\n        if (ctx.hist.raw().live) ctx.hist.abort();\n        const back = openingsOf(scene.room).find((q) => q.id === d.id);\n        ctx.cue(\"Can't put the \" + OPENING_KINDS[(back || o).kind].name.toLowerCase() + \" there - \" + (d.bad || \"not allowed\") + \". It is back where it was.\");\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      ctx.commands.run(\"placeOpening\", { id: d.id, wall: o.wall, x: o.x, y: o.y, phase: \"end\" });\n      return true;\n    }\n    function wallHitOn(wall, clientX, clientY) {\n      const ray = ctx.pointerRay(clientX, clientY);\n      if (!ray) return null;\n      const sz = roomSize(), fr = wallFrame(wall, sz);\n      if (!fr) return null;\n      const n = [fr.inward[0], 0, fr.inward[1]];\n      const dn = ray.d[0] * n[0] + ray.d[2] * n[2];\n      if (Math.abs(dn) < 1e-6) return null;\n      const s0 = fr.pt(0, 0);\n      const t = ((s0[0] - ray.o[0]) * n[0] + (s0[1] - ray.o[2]) * n[2]) / dn;\n      if (!(t > 1)) return null;\n      const p = [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t];\n      const a = (p[0] - s0[0]) * fr.dir[0] + (p[2] - s0[1]) * fr.dir[1];\n      return { wall, a, v: p[1] + LEG_H, t, len: fr.len };\n    }\n    function wallInView() {\n      const ray = ctx.rayFromNdc ? ctx.rayFromNdc(0, 0) : null;\n      const h = wallHits(ray).find((q) => q.a >= 0 && q.a <= q.len);\n      return h ? h.wall : null;\n    }\n    function sizeStart(id, edge, clientX, clientY) {\n      const o = openingsOf(scene.room).find((q) => q.id === id);\n      if (!o || edge !== \"left\" && edge !== \"right\") return false;\n      if (st.drag) return false;\n      const h = wallHitOn(o.wall, clientX, clientY);\n      const sideA = edge === \"left\" ? o.x : o.x + o.w;\n      st.size = { id, edge, grab: h ? h.a - sideA : 0, orig: JSON.parse(JSON.stringify(scene.room.openings)), moved: false, bad: null, x0: clientX, y0: clientY, lastA: sideA };\n      ctx.changed(\"roomSize\");\n      return true;\n    }\n    function sizeMove(clientX, clientY) {\n      const s = st.size;\n      if (!s) return false;\n      if (!s.moved && Math.abs(clientX - s.x0) < MOVE_PX && Math.abs(clientY - s.y0) < MOVE_PX) return true;\n      s.moved = true;\n      const o = openingsOf(scene.room).find((q) => q.id === s.id);\n      if (!o) {\n        st.size = null;\n        return true;\n      }\n      const h = wallHitOn(o.wall, clientX, clientY);\n      if (!h) return true;\n      const a = h.a - s.grab;\n      const r = ctx.commands.run(\"resizeOpening\", { id: s.id, edge: s.edge, a, phase: \"check\" });\n      if (r.ok) {\n        s.bad = null;\n        scene.roomDrag = null;\n        ctx.commands.run(\"resizeOpening\", { id: s.id, edge: s.edge, a, phase: \"live\" });\n        s.lastA = s.edge === \"left\" ? r.op.x : r.op.x + r.op.w;\n      } else {\n        s.bad = r.why;\n        scene.roomDrag = { id: s.id, wall: r.op.wall, x: r.op.x, y: r.op.y, w: r.op.w, h: r.op.h, kind: o.kind, why: r.why };\n        ctx.cue(\"Not that wide: \" + r.why + \". Let go and it keeps the last width that fitted.\");\n        ctx.refresh();\n      }\n      return true;\n    }\n    function sizeEnd() {\n      const s = st.size;\n      if (!s) return false;\n      st.size = null;\n      const hadGhost = !!scene.roomDrag;\n      scene.roomDrag = null;\n      if (!s.moved) {\n        ctx.changed(\"roomSize\");\n        if (hadGhost) ctx.refresh();\n        return true;\n      }\n      const r = ctx.commands.run(\"resizeOpening\", { id: s.id, edge: s.edge, a: s.lastA, phase: \"end\" });\n      if (!r.ok && ctx.hist.raw().live) ctx.hist.abort();\n      ctx.changed(\"roomSize\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function cancel() {\n      const s = st.size;\n      if (s) {\n        st.size = null;\n        scene.roomDrag = null;\n        scene.room.openings = s.orig;\n        if (ctx.hist.raw().live) ctx.hist.abort();\n        ctx.cue(\"Width put back\");\n        ctx.changed(\"roomSize\");\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      const d = st.drag;\n      if (!d) return false;\n      st.drag = null;\n      st.press = null;\n      scene.roomDrag = null;\n      scene.room.openings = d.orig;\n      if (ctx.hist.raw().live) ctx.hist.abort();\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    const api = {\n      openingAt,\n      wallAt,\n      wallHitOn,\n      wallInView,\n      down,\n      move,\n      up,\n      cancel,\n      dblclick,\n      arm,\n      disarm,\n      armed: () => scene.roomArmed || null,\n      dragging: () => !!st.drag,\n      state: () => st.drag,\n      sizeStart,\n      sizeMove,\n      sizeEnd,\n      sizing: () => st.size ? { id: st.size.id, edge: st.size.edge, bad: st.size.bad, moved: st.size.moved } : null\n    };\n    ctx.openingDrag = api;\n    return api;\n  }\n\n  // v2/src/interact/room-object-drag.js\n  var MOVE_PX2 = 3;\n  var PAD = 30;\n  function installRoomObjectDrag(ctx) {\n    const scene = ctx.scene;\n    const st = { drag: null, press: null };\n    function planeHit(ray, wall, dIn) {\n      const sz = roomSize(), fr = wallFrame(wall, sz);\n      if (!fr || !ray) return null;\n      const n = [fr.inward[0], 0, fr.inward[1]], dn = ray.d[0] * n[0] + ray.d[2] * n[2];\n      if (dn >= -1e-6) return null;\n      const s0 = fr.pt(0, dIn || 0);\n      const t = ((s0[0] - ray.o[0]) * n[0] + (s0[1] - ray.o[2]) * n[2]) / dn;\n      if (!(t > 1)) return null;\n      const p = [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t];\n      return { wall, t, a: (p[0] - s0[0]) * fr.dir[0] + (p[2] - s0[1]) * fr.dir[1], v: p[1] + LEG_H, len: fr.len };\n    }\n    function objectAt(clientX, clientY) {\n      const list = roomObjectsOf(scene.room);\n      if (!list.length) return null;\n      const ray = ctx.pointerRay(clientX, clientY);\n      if (!ray) return null;\n      const cab = ctx.pointer && ctx.pointer.hitRay ? ctx.pointer.hitRay(ray) : null;\n      let best = null;\n      for (const o of list) {\n        for (const dIn of [o.d, 0]) {\n          const h = planeHit(ray, o.wall, dIn);\n          if (!h) continue;\n          if (h.a >= o.x - PAD && h.a <= o.x + o.w + PAD && h.v >= o.y - PAD && h.v <= o.y + o.h + PAD && (!best || h.t < best.t)) {\n            best = Object.assign({ id: o.id }, h);\n            break;\n          }\n        }\n      }\n      if (best && cab && cab.t < best.t) return null;\n      return best;\n    }\n    function wallAt(clientX, clientY) {\n      const ray = ctx.pointerRay(clientX, clientY);\n      const hits = roomWallIds(scene.room).map((w) => planeHit(ray, w, 0)).filter(Boolean).sort((p, q) => p.t - q.t);\n      return hits.find((h) => h.a >= 0 && h.a <= h.len && h.v >= -200) || null;\n    }\n    function select(id) {\n      if ((scene.roomObjSel || null) === (id || null)) return;\n      scene.roomObjSel = id || null;\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function down(e) {\n      if (!e || e.button != null && e.button !== 0) return false;\n      if (scene.measureOn || scene.insideTool || scene.explode > 0) return false;\n      const hit2 = objectAt(e.clientX, e.clientY);\n      if (!hit2 || hit2.id !== scene.roomObjSel) {\n        st.press = { id: hit2 ? hit2.id : null, x0: e.clientX, y0: e.clientY };\n        return false;\n      }\n      const o = roomObjectsOf(scene.room).find((q) => q.id === hit2.id);\n      st.press = null;\n      st.drag = {\n        id: o.id,\n        x0: e.clientX,\n        y0: e.clientY,\n        moved: false,\n        grab: hit2.a - o.x,\n        wall0: o.wall,\n        orig: JSON.parse(JSON.stringify(scene.room.objects)),\n        from: { wall: o.wall, x: o.x },\n        last: { wall: o.wall, x: o.x },\n        bad: null\n      };\n      if (e.preventDefault) e.preventDefault();\n      ctx.cue(objectLabel(scene.room, o) + \" - drag it along the wall or onto another wall, and let go\");\n      return true;\n    }\n    function move(e) {\n      const p = st.press;\n      if (p && (Math.abs(e.clientX - p.x0) >= MOVE_PX2 || Math.abs(e.clientY - p.y0) >= MOVE_PX2)) st.press = null;\n      const d = st.drag;\n      if (!d) return false;\n      if (!d.moved && Math.abs(e.clientX - d.x0) < MOVE_PX2 && Math.abs(e.clientY - d.y0) < MOVE_PX2) return true;\n      d.moved = true;\n      const h = wallAt(e.clientX, e.clientY);\n      if (!h) return true;\n      const o = roomObjectsOf(scene.room).find((q) => q.id === d.id);\n      if (!o) {\n        st.drag = null;\n        return true;\n      }\n      const x = h.wall === d.wall0 ? h.a - d.grab : h.a - o.w / 2;\n      const live = scene.room.objects;\n      scene.room.objects = d.orig;\n      const r = ctx.commands.run(\"placeRoomObject\", { id: d.id, wall: h.wall, x, phase: \"check\" });\n      scene.room.objects = live;\n      if (r.ok) {\n        d.bad = null;\n        d.last = { wall: r.op.wall, x: r.op.x };\n        scene.room.objects = roomObjectsOf(scene.room).map((q) => q.id === d.id ? Object.assign({}, q, { wall: r.op.wall, x: r.op.x }) : q);\n        ctx.cue(objectLabel(scene.room, o) + \" - \" + r.op.x + \" mm along this wall, \" + o.y + \" mm up\");\n      } else {\n        d.bad = r.why;\n        ctx.cue(\"Not there: \" + r.why + \". Let go and it stays where it last fitted.\");\n      }\n      ctx.refresh();\n      return true;\n    }\n    function up() {\n      const p = st.press;\n      st.press = null;\n      if (p && !st.drag) {\n        if (p.id) {\n          select(p.id);\n          const o = roomObjectsOf(scene.room).find((q) => q.id === p.id);\n          if (o) ctx.cue(objectLabel(scene.room, o) + \" selected - drag it to move it; its sizes are on the Room strip\");\n        } else if (scene.roomObjSel) select(null);\n        return false;\n      }\n      const d = st.drag;\n      if (!d) return false;\n      st.drag = null;\n      scene.room.objects = d.orig;\n      if (!d.moved || d.last.wall === d.from.wall && d.last.x === d.from.x) {\n        ctx.syncControls();\n        ctx.refresh();\n        if (d.bad && d.moved) ctx.cue(\"The boiler stays where it was - \" + d.bad);\n        return true;\n      }\n      ctx.commands.run(\"placeRoomObject\", { id: d.id, wall: d.last.wall, x: d.last.x });\n      return true;\n    }\n    function cancel() {\n      const d = st.drag;\n      st.press = null;\n      if (!d) return false;\n      st.drag = null;\n      scene.room.objects = d.orig;\n      ctx.cue(\"The boiler is back where it was\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function tapAt(x, y) {\n      const hit2 = objectAt(x, y);\n      if (hit2) {\n        select(hit2.id);\n        const o = roomObjectsOf(scene.room).find((q) => q.id === hit2.id);\n        if (o) ctx.cue(objectLabel(scene.room, o) + \" selected - drag it to move it; its sizes are on the Room strip\");\n        return true;\n      }\n      if (scene.roomObjSel) select(null);\n      return false;\n    }\n    const api = { objectAt, wallAt, down, move, up, cancel, tapAt, dragging: () => !!st.drag, state: () => st.drag };\n    ctx.objectDrag = api;\n    return api;\n  }\n\n  // v2/src/interact/splash-drag.js\n  var MOVE_PX3 = 3;\n  var PAD2 = 20;\n  function installSplashDrag(ctx) {\n    const scene = ctx.scene;\n    const st = { drag: null, press: null, edge: null };\n    function pieces() {\n      const S2 = splashOf(scene.kitchen);\n      if (!S2.on) return [];\n      if (S2.pieces) return S2.pieces;\n      try {\n        return materializePieces(scene.units, scene.kitchen, scene.room || null);\n      } catch {\n        return [];\n      }\n    }\n    function thick() {\n      return splashOf(scene.kitchen).kind === \"glass\" ? 6 : 8;\n    }\n    function planeHit(ray, wall, dIn) {\n      const sz = roomSize(), fr = wallFrame(wall, sz, scene.room || null), pw = pieceWall(wall);\n      if (!fr || !ray || !pw) return null;\n      const n = [fr.inward[0], 0, fr.inward[1]], dn = ray.d[0] * n[0] + ray.d[2] * n[2];\n      if (dn >= -1e-6) return null;\n      const s0 = fr.pt(0, dIn || 0);\n      const t = ((s0[0] - ray.o[0]) * n[0] + (s0[1] - ray.o[2]) * n[2]) / dn;\n      if (!(t > 1)) return null;\n      const p = [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t];\n      const along2 = pw.axis === \"z\" ? p[0] : p[2];\n      const inWall = pw.lo == null || along2 >= pw.lo - 1 && along2 <= pw.hi + 1;\n      return { wall, t, a: along2, y: p[1], v: p[1] + LEG_H, inWall };\n    }\n    function pieceAt(clientX, clientY) {\n      const list = pieces();\n      if (!list.length || !ctx.pointerRay) return null;\n      const ray = ctx.pointerRay(clientX, clientY);\n      if (!ray) return null;\n      const cab = ctx.pointer && ctx.pointer.hitRay ? ctx.pointer.hitRay(ray) : null;\n      let best = null;\n      for (const q of list) {\n        for (const dIn of [thick(), 0]) {\n          const h = planeHit(ray, q.wall, dIn);\n          if (!h) continue;\n          if (h.a >= q.a0 - PAD2 && h.a <= q.a1 + PAD2 && h.y >= q.y0 - PAD2 && h.y <= q.y1 + PAD2 && (!best || h.t < best.t)) {\n            best = Object.assign({ id: q.id }, h);\n            break;\n          }\n        }\n      }\n      if (best && cab && cab.t < best.t) return null;\n      return best;\n    }\n    function wallAt(clientX, clientY) {\n      if (!ctx.pointerRay) return null;\n      const ray = ctx.pointerRay(clientX, clientY);\n      if (!ray) return null;\n      const hits = roomWallIds(scene.room || null).map((w) => planeHit(ray, w, 0)).filter((h) => h && h.inWall).sort((p, q) => p.t - q.t);\n      return hits[0] || null;\n    }\n    function select(id) {\n      if ((scene.splashSel || null) === (id || null)) return;\n      scene.splashSel = id || null;\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    const label = (q) => \"Splashback \" + q.id + \" \\xB7 \" + (q.a1 - q.a0) + \" \\xD7 \" + (q.y1 - q.y0) + \" mm\";\n    function preview(orig, q) {\n      const k = Object.assign({}, scene.kitchen);\n      k.splash = Object.assign({}, orig, { on: true, pieces: (orig.pieces || pieces()).map((p) => p.id === q.id ? q : p) });\n      scene.kitchen = k;\n      ctx.refresh();\n    }\n    function restore2(orig) {\n      const k = Object.assign({}, scene.kitchen);\n      if (orig === void 0) delete k.splash;\n      else k.splash = orig;\n      scene.kitchen = k;\n    }\n    function down(e) {\n      if (!e || e.button != null && e.button !== 0) return false;\n      if (scene.measureOn || scene.insideTool || scene.explode > 0) return false;\n      const hit2 = pieceAt(e.clientX, e.clientY);\n      if (!hit2 || hit2.id !== scene.splashSel) {\n        st.press = { id: hit2 ? hit2.id : null, x0: e.clientX, y0: e.clientY };\n        return false;\n      }\n      const q = pieces().find((p) => p.id === hit2.id);\n      if (!q) return false;\n      st.press = null;\n      const orig = scene.kitchen && scene.kitchen.splash !== void 0 ? JSON.parse(JSON.stringify(scene.kitchen.splash)) : void 0;\n      st.drag = { id: q.id, x0: e.clientX, y0: e.clientY, moved: false, grab: hit2.a - q.a0, wall0: q.wall, orig, from: { ...q }, last: { ...q } };\n      if (e.preventDefault) e.preventDefault();\n      ctx.cue(label(q) + \" - drag it along the wall or onto another wall, and let go\");\n      return true;\n    }\n    function move(e) {\n      const p = st.press;\n      if (p && (Math.abs(e.clientX - p.x0) >= MOVE_PX3 || Math.abs(e.clientY - p.y0) >= MOVE_PX3)) st.press = null;\n      const d = st.drag;\n      if (!d) return false;\n      if (!d.moved && Math.abs(e.clientX - d.x0) < MOVE_PX3 && Math.abs(e.clientY - d.y0) < MOVE_PX3) return true;\n      d.moved = true;\n      const h = wallAt(e.clientX, e.clientY);\n      if (!h) return true;\n      const wdt = d.from.a1 - d.from.a0;\n      let a0 = Math.round(h.wall === d.wall0 ? h.a - d.grab : h.a - wdt / 2);\n      const w = pieceWall(h.wall);\n      if (w && w.lo != null) a0 = Math.max(w.lo, Math.min(w.hi - wdt, a0));\n      d.last = { ...d.from, wall: h.wall, a0, a1: a0 + wdt };\n      preview(d.orig || {}, d.last);\n      ctx.cue(label(d.last) + \" - \" + a0 + \" mm along this wall\");\n      return true;\n    }\n    function up() {\n      const p = st.press;\n      st.press = null;\n      if (p && !st.drag) {\n        if (p.id) {\n          select(p.id);\n          const q = pieces().find((x) => x.id === p.id);\n          if (q) ctx.cue(label(q) + \" selected - drag it, pull an edge, or type its sizes in the Splashback strip\");\n        } else if (scene.splashSel) select(null);\n        return false;\n      }\n      const d = st.drag;\n      if (!d) return false;\n      st.drag = null;\n      restore2(d.orig);\n      if (!d.moved || d.last.wall === d.from.wall && d.last.a0 === d.from.a0) {\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      ctx.commands.run(\"setSplashPiece\", { id: d.id, wall: d.last.wall, a0: d.last.a0, a1: d.last.a1 });\n      return true;\n    }\n    function cancel() {\n      const d = st.drag, g2 = st.edge;\n      st.press = null;\n      if (!d && !g2) return false;\n      st.drag = null;\n      st.edge = null;\n      restore2((d || g2).orig);\n      ctx.cue(\"The splashback piece is back where it was\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function edgeStart(id, edge) {\n      const q = pieces().find((p) => p.id === id);\n      if (!q || [\"left\", \"right\", \"top\", \"bottom\"].indexOf(edge) < 0) return false;\n      const orig = scene.kitchen && scene.kitchen.splash !== void 0 ? JSON.parse(JSON.stringify(scene.kitchen.splash)) : void 0;\n      st.edge = { id, edge, orig, from: { ...q }, last: { ...q } };\n      return true;\n    }\n    function edgeMove(clientX, clientY) {\n      const g2 = st.edge;\n      if (!g2 || !ctx.pointerRay) return false;\n      const h = planeHit(ctx.pointerRay(clientX, clientY), g2.from.wall, thick());\n      if (!h) return true;\n      const q = { ...g2.from }, w = pieceWall(q.wall);\n      const fr = wallFrame(q.wall, roomSize(), scene.room || null), sgn = fr ? Math.abs(fr.dir[0]) > 0.5 ? fr.dir[0] : fr.dir[1] : 1;\n      const loEdge = g2.edge === \"left\" === sgn > 0 ? \"a0\" : \"a1\";\n      if (g2.edge === \"left\" || g2.edge === \"right\") {\n        let v = Math.round(h.a);\n        if (w && w.lo != null) v = Math.max(w.lo, Math.min(w.hi, v));\n        if (loEdge === \"a0\") q.a0 = Math.min(v, q.a1 - PIECE.MIN_W);\n        else q.a1 = Math.max(v, q.a0 + PIECE.MIN_W);\n      } else if (g2.edge === \"top\") q.y1 = Math.max(Math.round(h.y), q.y0 + PIECE.MIN_H);\n      else q.y0 = Math.max(0, Math.min(Math.round(h.y), q.y1 - PIECE.MIN_H));\n      g2.last = q;\n      preview(g2.orig || {}, q);\n      ctx.cue(label(q));\n      return true;\n    }\n    function edgeEnd() {\n      const g2 = st.edge;\n      if (!g2) return false;\n      st.edge = null;\n      restore2(g2.orig);\n      const a = g2.last, b = g2.from;\n      if (a.a0 === b.a0 && a.a1 === b.a1 && a.y0 === b.y0 && a.y1 === b.y1) {\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      ctx.commands.run(\"setSplashPiece\", { id: g2.id, a0: a.a0, a1: a.a1, y0: a.y0, y1: a.y1 });\n      return true;\n    }\n    function tapAt(x, y) {\n      const hit2 = pieceAt(x, y);\n      if (hit2) {\n        select(hit2.id);\n        return true;\n      }\n      if (scene.splashSel) select(null);\n      return false;\n    }\n    const api = {\n      pieceAt,\n      wallAt,\n      pieces,\n      down,\n      move,\n      up,\n      cancel,\n      tapAt,\n      edgeStart,\n      edgeMove,\n      edgeEnd,\n      select,\n      dragging: () => !!st.drag,\n      sizing: () => !!st.edge,\n      state: () => st.drag || st.edge\n    };\n    ctx.splashDrag = api;\n    return api;\n  }\n\n  // v2/src/interact/hood-drag.js\n  var MOVE_PX4 = 3;\n  function installHoodDrag(ctx) {\n    const scene = ctx.scene;\n    const st = { drag: null, press: null };\n    const ceilingY2 = (room) => room && room.on !== false && Number(room.height) > 0 ? Number(room.height) - LEG_H : NaN;\n    function hoods() {\n      const out = [];\n      for (const u of scene.units || []) {\n        if (!isOvenBase(u) || !u.hood) continue;\n        const L = ovenHobLayout(u, scene.kitchen);\n        if (!L || !L.hood) continue;\n        const H2 = L.hood, k = APPLIANCES.hood, xf = unitXf(u), uy = u.y || 0;\n        const world = (b) => {\n          const ps = [[b.x0, 0, b.z0], [b.x1, 0, b.z1], [b.x0, 0, b.z1], [b.x1, 0, b.z0]].map((p) => xf.p(p));\n          const xs = ps.map((p) => p[0]), zs = ps.map((p) => p[2]);\n          return { x0: Math.min(...xs), x1: Math.max(...xs), y0: uy + b.y0, y1: uy + b.y1, z0: Math.min(...zs), z1: Math.max(...zs) };\n        };\n        const wb = world({ x0: H2.x0, x1: H2.x1, y0: H2.y0, y1: H2.y0 + k.total[0], z0: H2.z0, z1: H2.z1 });\n        const fit = hoodFit(L, ceilingY2(scene.room) - uy, { x0: wb.x0, x1: wb.x1, z0: wb.z0, z1: wb.z1, y0: wb.y0, y2: wb.y1 }, []);\n        if (fit.refuse) continue;\n        const cx = (H2.x0 + H2.x1) / 2, ch = k.chimney.lower, top = fit.chimneyTop != null ? fit.chimneyTop : H2.chimney.y1;\n        const canopy = world({ x0: H2.x0, x1: H2.x1, y0: H2.y0, y1: H2.y1, z0: H2.z0, z1: H2.z1 });\n        const chimney = world({ x0: cx - ch[0] / 2, x1: cx + ch[0] / 2, y0: H2.y1, y1: top, z0: 0, z1: ch[1] });\n        const fp = xf.p([cx, 0, H2.z1]), fn = xf.n ? xf.n([0, 0, 1]) : [0, 0, 1];\n        out.push({ id: u.id, u, boxes: [canopy, chimney], front: { p: [fp[0], 0, fp[2]], n: fn } });\n      }\n      return out;\n    }\n    function rayBox(ray, b) {\n      let t0 = -Infinity, t1 = Infinity;\n      const lo = [b.x0, b.y0, b.z0], hi = [b.x1, b.y1, b.z1];\n      for (let i = 0; i < 3; i++) {\n        if (Math.abs(ray.d[i]) < 1e-12) {\n          if (ray.o[i] < lo[i] || ray.o[i] > hi[i]) return null;\n          continue;\n        }\n        let a = (lo[i] - ray.o[i]) / ray.d[i], c = (hi[i] - ray.o[i]) / ray.d[i];\n        if (a > c) {\n          const s = a;\n          a = c;\n          c = s;\n        }\n        t0 = Math.max(t0, a);\n        t1 = Math.min(t1, c);\n        if (t0 > t1) return null;\n      }\n      return t1 > 0 ? Math.max(t0, 0) : null;\n    }\n    function hoodAt(clientX, clientY) {\n      if (!ctx.pointerRay) return null;\n      const ray = ctx.pointerRay(clientX, clientY);\n      if (!ray) return null;\n      let best = null;\n      for (const h of hoods()) for (const b of h.boxes) {\n        const t = rayBox(ray, b);\n        if (t != null && (!best || t < best.t)) best = { id: h.id, t };\n      }\n      if (!best) return null;\n      const cab = ctx.pointer && ctx.pointer.hitRay ? ctx.pointer.hitRay(ray) : null;\n      if (cab && cab.t < best.t - 1) return null;\n      return best;\n    }\n    function select(id) {\n      if ((scene.hoodSel || null) === (id || null)) return;\n      scene.hoodSel = id || null;\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function planeHit(h, clientX, clientY) {\n      const ray = ctx.pointerRay ? ctx.pointerRay(clientX, clientY) : null;\n      if (!ray) return null;\n      const n = h.front.n, dn = ray.d[0] * n[0] + ray.d[2] * n[2];\n      if (Math.abs(dn) < 1e-6) return null;\n      const t = ((h.front.p[0] - ray.o[0]) * n[0] + (h.front.p[2] - ray.o[2]) * n[2]) / dn;\n      return t > 0 ? [ray.o[0] + ray.d[0] * t, ray.o[1] + ray.d[1] * t, ray.o[2] + ray.d[2] * t] : null;\n    }\n    function alongDir(u) {\n      const xf = unitXf(u), o = xf.p([0, 0, 0]), e = xf.p([1, 0, 0]);\n      return [e[0] - o[0], e[2] - o[2]];\n    }\n    function down(e) {\n      if (!e || e.button != null && e.button !== 0) return false;\n      if (scene.measureOn || scene.insideTool || scene.explode > 0) return false;\n      const hit2 = hoodAt(e.clientX, e.clientY);\n      if (!hit2 || hit2.id !== scene.hoodSel) {\n        st.press = { id: hit2 ? hit2.id : null, x0: e.clientX, y0: e.clientY };\n        return false;\n      }\n      const h = hoods().find((x) => x.id === hit2.id);\n      if (!h) return false;\n      const p = planeHit(h, e.clientX, e.clientY);\n      if (!p) return false;\n      const R4 = hoodHeightRange(h.u, scene.kitchen, scene.room), RX = hoodDxRange(h.u, scene.kitchen, scene.room, unitXf(h.u), roomSize());\n      st.press = null;\n      st.drag = {\n        id: h.id,\n        u: h.u,\n        h,\n        p0: p,\n        dir: alongDir(h.u),\n        x0: e.clientX,\n        cy0: e.clientY,\n        from: hoodAbove(h.u),\n        fromDx: hoodDx(h.u),\n        orig: h.u.hoodAbove,\n        origDx: h.u.hoodDx,\n        last: hoodAbove(h.u),\n        lastDx: hoodDx(h.u),\n        R: R4,\n        RX,\n        moved: false\n      };\n      if (e.preventDefault) e.preventDefault();\n      ctx.cue(\"Hood \" + st.drag.from + \" mm above the hob - drag it up, down or along the wall, let go to set it\" + (R4 ? \" (\" + R4.min + (R4.max != null ? \"-\" + R4.max : \"+\") + \" mm, Bosch manual 13.3\" + (R4.max != null ? \", 13.2\" : \"\") + \")\" : \"\"));\n      return true;\n    }\n    function restore2(d) {\n      if (d.orig === void 0) delete d.u.hoodAbove;\n      else d.u.hoodAbove = d.orig;\n      if (d.origDx === void 0) delete d.u.hoodDx;\n      else d.u.hoodDx = d.origDx;\n    }\n    function move(e) {\n      const p = st.press;\n      if (p && (Math.abs(e.clientX - p.x0) >= MOVE_PX4 || Math.abs(e.clientY - p.y0) >= MOVE_PX4)) st.press = null;\n      const d = st.drag;\n      if (!d) return false;\n      if (!d.moved && Math.abs(e.clientY - d.cy0) < MOVE_PX4 && Math.abs(e.clientX - d.x0) < MOVE_PX4) return true;\n      d.moved = true;\n      const q = planeHit(d.h, e.clientX, e.clientY);\n      if (!q) return true;\n      let v = Math.round(d.from + (q[1] - d.p0[1]));\n      if (d.R) {\n        v = Math.max(d.R.min, v);\n        if (d.R.max != null) v = Math.min(d.R.max, v);\n      }\n      let x = Math.round(d.fromDx + (q[0] - d.p0[0]) * d.dir[0] + (q[2] - d.p0[2]) * d.dir[1]);\n      if (d.RX && d.RX.min != null) x = Math.max(d.RX.min, Math.min(d.RX.max, x));\n      d.last = v;\n      d.lastDx = x;\n      d.u.hoodAbove = v;\n      d.u.hoodDx = x;\n      ctx.refresh();\n      ctx.cue(\"Hood \" + v + \" mm above the hob\" + (d.R && (v === d.R.min || v === d.R.max) ? \" (Bosch's limit)\" : \"\") + (x ? \", \" + Math.abs(x) + \" mm off centre - Bosch advises the middle of the hob\" : \", centred\"));\n      return true;\n    }\n    function up() {\n      const p = st.press;\n      st.press = null;\n      if (p && !st.drag) {\n        if (p.id) {\n          select(p.id);\n          ctx.cue(selectedCue(p.id));\n        } else if (scene.hoodSel) select(null);\n        return false;\n      }\n      const d = st.drag;\n      if (!d) return false;\n      st.drag = null;\n      restore2(d);\n      if (!d.moved || d.last === d.from && d.lastDx === d.fromDx) {\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      ctx.commands.run(\"setHood\", { id: d.id, above: d.last, dx: d.lastDx });\n      return true;\n    }\n    function cancel() {\n      const d = st.drag;\n      st.press = null;\n      if (!d) return false;\n      st.drag = null;\n      restore2(d);\n      ctx.cue(\"The hood is back where it was\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function selectedCue(id) {\n      const h = hoods().find((x) => x.id === id), R4 = h ? hoodHeightRange(h.u, scene.kitchen, scene.room) : null;\n      return APPLIANCES.hood.name + \" selected - drag it, or type its height and place\" + (R4 ? \"; height \" + R4.min + (R4.max != null ? \"-\" + R4.max : \"+\") + \" mm above the hob (Bosch manual 13.3\" + (R4.max != null ? \", 13.2\" : \"\") + \")\" : \"\");\n    }\n    function tapAt(x, y) {\n      const hit2 = hoodAt(x, y);\n      if (hit2) {\n        const was = scene.hoodSel;\n        select(hit2.id);\n        if (was !== hit2.id) ctx.cue(selectedCue(hit2.id));\n        return true;\n      }\n      if (scene.hoodSel) select(null);\n      return false;\n    }\n    const api = { hoodAt, hoods, down, move, up, cancel, tapAt, select, dragging: () => !!st.drag, state: () => st.drag };\n    ctx.hoodDrag = api;\n    return api;\n  }\n\n  // v2/src/model/drawer-datums.js\n  var DRAWER_SNAP = { CAPTURE: 8, RELEASE: 12, NEAR: 600 };\n  var KINDS = [\n    { kind: \"bottom\", words: \"fronts' bottoms level\", off: () => 0, line: (o) => o.fy0 },\n    { kind: \"top\", words: \"fronts' tops level\", off: (d) => d.fh, line: (o) => o.fy1 },\n    { kind: \"box\", words: \"boxes' tops level\", off: (d) => d.by1 - d.fy0, line: (o) => o.by1 }\n  ];\n  function neighbours2(units, u) {\n    const fu = foot(u), out = [u];\n    for (const v of units || []) {\n      if (!v || v === u || v.family === \"wall\" !== (u.family === \"wall\")) continue;\n      const fv = foot(v), gap = Math.max(0, fv.x0 - fu.x1, fu.x0 - fv.x1, fv.z0 - fu.z1, fu.z0 - fv.z1);\n      if (gap <= DRAWER_SNAP.NEAR) out.push(v);\n    }\n    return out;\n  }\n  function others(v) {\n    const out = addedDrawers(v).map((o) => ({ key: o.n, n: o.n, name: o.name, col: o.col, band: o.band, fy0: o.fy0, fy1: o.fy1, by1: o.by1, fx0: o.fx0, fx1: o.fx1 }));\n    for (const b of drawerBoxes(v)) if (b.xn == null && isFinite(b.fy0) && isFinite(b.fy1))\n      out.push({ key: \"p\" + b.i, n: null, preset: true, name: String(b.name || \"Drawer\").replace(/ box$/, \"\"), fy0: b.fy0, fy1: b.fy1, by1: b.by1, fx0: 0, fx1: v.w });\n    return out;\n  }\n  function drawerDatums(units, u, n) {\n    const mine = addedDrawers(u).find((d) => d.n === n);\n    if (!mine) return [];\n    const t = drawerTravel(u, n), lo = t ? t.lo : -Infinity, hi = t ? t.hi : Infinity, out = [];\n    for (const v of neighbours2(units, u)) {\n      const dy = (v.y || 0) - (u.y || 0);\n      for (const o of others(v)) {\n        if (v === u && !o.preset && (o.n === n || o.col === mine.col && o.band === mine.band)) continue;\n        for (const K2 of KINDS) {\n          const lineY = K2.line(o) + dy, at = Math.round((lineY - K2.off(mine)) * 10) / 10;\n          if (at < lo - 0.01 || at > hi + 0.01) continue;\n          if (!isFinite(at)) continue;\n          out.push({ kind: K2.kind, words: K2.words, at, y: (u.y || 0) + lineY, other: o.name, otherN: o.key, otherUnit: v.id, preset: !!o.preset });\n        }\n      }\n    }\n    return out;\n  }\n  function drawerSnap(units, u, n, want, o) {\n    o = o || {};\n    if (o.free) return { at: want, datum: null, cue: null };\n    const ds = drawerDatums(units, u, n);\n    if (o.held) {\n      const h = ds.find((d) => d.kind === o.held.kind && d.otherN === o.held.otherN && d.otherUnit === o.held.otherUnit);\n      if (h && Math.abs(want - h.at) <= DRAWER_SNAP.RELEASE) return { at: h.at, datum: h, cue: words(h) };\n    }\n    let best = null;\n    for (const d of ds) {\n      const dist2 = Math.abs(want - d.at);\n      if (dist2 <= DRAWER_SNAP.CAPTURE && (!best || dist2 < best.dist)) best = { d, dist: dist2 };\n    }\n    return best ? { at: best.d.at, datum: best.d, cue: words(best.d) } : { at: want, datum: null, cue: null };\n  }\n  function words(d) {\n    return \"Lined up with \" + d.other + \" - \" + d.words + \" (Alt: place freely)\";\n  }\n  function drawerDatumLines(units, u, n, datum) {\n    if (!datum) return [];\n    const v = (units || []).find((q) => q.id === datum.otherUnit) || u;\n    const a = addedDrawers(u).find((d) => d.n === n), b = others(v).find((d) => d.key === datum.otherN);\n    if (!a || !b) return [];\n    const fu = foot(u), fv = foot(v), x0 = Math.min(fu.x0 + a.fx0, fv.x0 + b.fx0), x1 = Math.max(fu.x0 + a.fx1, fv.x0 + b.fx1);\n    const z = Math.max(fu.z1, fv.z1) + 2;\n    return [{ A: [x0, datum.y, z], B: [x1, datum.y, z] }];\n  }\n\n  // v2/src/interact/drawer-move.js\n  var TRAVEL_PX2 = 5;\n  function snapRelocate(units, u, n, lx, ly, o) {\n    o = o || {};\n    const r = previewRelocate(u, n, lx, ly);\n    if (!r.ok || r.asked == null) return { r, lx, ly, datum: null };\n    const c = JSON.parse(JSON.stringify(u));\n    relocateDrawer(c, n, lx, ly);\n    const all = (units || [u]).map((v) => v && v.id === u.id ? c : v);\n    const s = drawerSnap(all, c, n, r.asked, { held: o.held, free: o.free });\n    if (!s.datum) return { r, lx, ly, datum: null };\n    const d = drawerByN(c, n);\n    if (!d) return { r, lx, ly, datum: null };\n    const ly2 = s.at + d.fh / 2, r2 = previewRelocate(u, n, lx, ly2);\n    if (!r2.ok || r2.band !== r.band || r2.col !== r.col || Math.abs(r2.y - s.at) > 0.5) return { r, lx, ly, datum: null };\n    const c2 = JSON.parse(JSON.stringify(u));\n    relocateDrawer(c2, n, lx, ly2);\n    const all2 = (units || [u]).map((v) => v && v.id === u.id ? c2 : v);\n    return { r: r2, lx, ly: ly2, datum: s.datum, cue: s.cue, lines: drawerDatumLines(all2, c2, n, s.datum) };\n  }\n  var theOf = (s) => /^the /.test(String(s)) ? String(s) : \"the \" + s;\n  function installDrawerMove(ctx) {\n    const scene = ctx.scene, st = ctx.st;\n    let g2 = null;\n    const cue = (t) => ctx.cue && ctx.cue(t);\n    function grabAt(cx, cy) {\n      if (scene.explode > 0 || st.insideTool || ctx.measure && ctx.measure.on()) return null;\n      const u = ctx.byId ? ctx.byId(scene.selectedId) : null;\n      if (!u || !scene.drawerBox || scene.drawerBox.id !== u.id) return null;\n      const hit2 = ctx.parts && ctx.parts.realPartAt ? ctx.parts.realPartAt(cx, cy) : null;\n      if (!hit2 || !hit2.u || hit2.u.id !== u.id || !hit2.part) return null;\n      const p = hit2.part;\n      if (p.kind !== \"drawer-front\" && p.kind !== \"drawer-box\") return null;\n      const i = drawerOfPart(u, p.name);\n      if (i < 0 || i !== scene.drawerBox.i) return null;\n      const b = drawerBoxes(u).find((x) => x.i === i);\n      return { u, i, b, n: b && b.xn != null ? b.xn : null };\n    }\n    function localAt(u, cx, cy) {\n      const ray = ctx.pointerRay ? ctx.pointerRay(Number(cx), Number(cy)) : null;\n      if (!ray) return null;\n      const r = rayToLocal(u, ray), zf = u.d + 18;\n      if (Math.abs(r.d[2]) < 1e-9) return null;\n      const t = (zf - r.o[2]) / r.d[2];\n      if (!(t > 0)) return null;\n      return { x: r.o[0] + r.d[0] * t, y: r.o[1] + r.d[1] * t };\n    }\n    function hint(t) {\n      if (t == null) {\n        if (g2) g2.said = null;\n        return;\n      }\n      if (g2 && g2.said === t) return;\n      if (g2) g2.said = t;\n      cue(t);\n    }\n    function setPreview(pv) {\n      const was = JSON.stringify(scene.drawerPreview || null);\n      scene.drawerPreview = pv;\n      if (JSON.stringify(pv) !== was) ctx.frame();\n    }\n    function setDatum(lines) {\n      const was = JSON.stringify(scene.drawerDatum || null), now = lines && lines.length ? { lines } : null;\n      scene.drawerDatum = now;\n      if (JSON.stringify(now) !== was) ctx.frame();\n    }\n    const onFace = (v, lp) => !!lp && lp.x >= -1 && lp.x <= v.w + 1 && lp.y >= -1 && lp.y <= v.h + 1;\n    function destAt(u, cx, cy) {\n      const hit2 = ctx.parts && ctx.parts.realPartAt ? ctx.parts.realPartAt(cx, cy) : null;\n      if (hit2 && hit2.u && hit2.u.id !== u.id && (scene.units || []).indexOf(hit2.u) >= 0) return { v: hit2.u, lp: localAt(hit2.u, cx, cy) };\n      const lp = localAt(u, cx, cy);\n      if (onFace(u, lp)) return { v: u, lp };\n      for (const v of scene.units || []) {\n        if (v === u || v.family !== u.family) continue;\n        const q = localAt(v, cx, cy);\n        if (onFace(v, q)) return { v, lp: q };\n      }\n      return { v: u, lp };\n    }\n    const nameOf = (v) => {\n      try {\n        return displayName(scene.units, v) || \"the next cabinet\";\n      } catch {\n        return \"the next cabinet\";\n      }\n    };\n    function previewPreset(cx, cy) {\n      const u = g2.u, D2 = destAt(u, cx, cy), v = D2.v, lp = D2.lp, across = v !== u, nm = g2.b && g2.b.name ? g2.b.name.replace(/ box$/, \"\") : \"The drawer\";\n      const r = !lp ? { ok: false, why: \"Carry the drawer over a bay of a cabinet\" } : previewPresetTransfer(u, g2.i, v, lp.x, lp.y);\n      g2.pv = r;\n      g2.dest = across ? v : null;\n      setPreview({\n        id: v.id,\n        ok: !!r.ok && !r.same,\n        why: r.ok ? null : r.why,\n        box: r.ok && !r.same ? r.box : null,\n        front: r.ok && !r.same ? r.front : null,\n        y: r.y,\n        fh: r.fh != null ? r.fh : null,\n        n: r.n,\n        name: nm,\n        move: true,\n        transfer: across,\n        from: across ? u.id : null,\n        section: r.section || null,\n        preset: true\n      });\n      setDatum(null);\n      if (r.ok && r.same) hint(nm + \" stays where it is - let go and nothing changes; Escape cancels\");\n      else if (r.ok) hint(nm + \" into \" + (across ? nameOf(v) : \"this cabinet\") + (r.section && r.section !== \"the cabinet\" ? \", \" + r.section : \"\") + \", front at \" + r.y + \" mm (its \" + r.fh + \" mm front and box kept; its place here stays an open slot) - let go to move it there; Escape cancels\");\n      else hint(\"Not here: \" + r.why);\n      return r;\n    }\n    function preview(cx, cy, free) {\n      if (!g2) return null;\n      if (g2.preset) return previewPreset(cx, cy);\n      const u = g2.u, D2 = destAt(u, cx, cy), v = D2.v, lp = D2.lp, across = v !== u;\n      const sp = lp && !across ? snapRelocate(scene.units || [u], u, g2.n, lp.x, lp.y, { held: g2.held, free: !!free }) : null;\n      const r = !lp ? { ok: false, why: \"Carry the drawer over a bay of a cabinet\" } : across ? previewTransfer(u, g2.n, v, lp.x, lp.y) : sp.r;\n      g2.pv = r;\n      g2.dest = across ? v : null;\n      g2.held = sp && sp.datum ? sp.datum : null;\n      const d = drawerByN(u, g2.n);\n      setPreview({\n        id: v.id,\n        ok: !!r.ok,\n        why: r.ok ? null : r.why,\n        box: r.box || null,\n        front: r.front || null,\n        y: r.y,\n        fh: d ? d.fh : null,\n        n: across ? r.n : g2.n,\n        name: d ? d.name : null,\n        move: true,\n        transfer: across,\n        from: across ? u.id : null,\n        section: r.section || null\n      });\n      setDatum(sp && sp.datum ? sp.lines : null);\n      if (r.ok && across) hint((d ? d.name : \"The drawer\") + \" into \" + nameOf(v) + (r.section && r.section !== \"the cabinet\" ? \", \" + r.section : \"\") + \", front at \" + r.y + \" mm (its \" + (d ? d.fh : \"\") + \" mm front and box kept) - let go to move it there; Escape cancels\");\n      else if (r.ok && sp && sp.datum) hint((d ? d.name : \"The drawer\") + \" to \" + theOf(r.section) + \", front at \" + r.y + \" mm - \" + sp.cue);\n      else if (r.ok) hint((d ? d.name : \"The drawer\") + (r.same ? \" stays where it is\" : \" to \" + theOf(r.section) + \", front at \" + r.y + \" mm\") + \" - let go to move it there; Escape cancels\");\n      else hint(\"Not here: \" + r.why);\n      return r;\n    }\n    function end(drop, cx, cy, e0) {\n      const gg = g2;\n      g2 = null;\n      if (!gg) return false;\n      hint(null);\n      const had = !!scene.drawerPreview || !!scene.drawerDatum;\n      scene.drawerPreview = null;\n      scene.drawerDatum = null;\n      if (!gg.moved) {\n        if (had) ctx.frame();\n        return true;\n      }\n      st.drawerMoved = Date.now();\n      if (!drop) {\n        cue(\"Not moved\");\n        ctx.frame();\n        return true;\n      }\n      const u = gg.u, D2 = destAt(u, cx, cy), v = D2.v;\n      let lp = D2.lp;\n      if (gg.preset) {\n        const pv2 = lp ? previewPresetTransfer(u, gg.i, v, lp.x, lp.y) : { ok: false, why: \"Carry the drawer over a bay of a cabinet\" };\n        if (!pv2.ok) {\n          cue(\"Not moved: \" + pv2.why);\n          ctx.frame();\n          return true;\n        }\n        if (pv2.same) {\n          cue((pv2.name || \"The drawer\") + \" stays where it is\");\n          ctx.frame();\n          return true;\n        }\n        const rt = ctx.hist.run(\"move drawer\", () => transferPreset(u, gg.i, v, lp.x, lp.y));\n        if (!rt || !rt.ok) {\n          cue(\"Not moved: \" + (rt && rt.why || \"it does not fit there\"));\n          ctx.frame();\n          return true;\n        }\n        scene.selectedId = v.id;\n        const bt = drawerBoxes(v).find((x) => x.xn === rt.n);\n        scene.drawerBox = bt ? { id: v.id, i: bt.i, click: true, part: \"front\" } : null;\n        if (scene.selPart && !partById(v, scene.selPart)) scene.selPart = null;\n        cue(rt.from.name + \" moved \" + (v !== u ? \"from \" + nameOf(u) + \" into \" + nameOf(v) : \"inside \" + nameOf(u)) + (rt.section && rt.section !== \"the cabinet\" ? \", \" + rt.section : \"\") + \", front at \" + rt.y + \" mm - now \" + rt.name + \" there; its old place is an open slot; Undo puts it back\");\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      if (v !== u) {\n        const pt = lp ? previewTransfer(u, gg.n, v, lp.x, lp.y) : { ok: false, why: \"Carry the drawer over a bay of a cabinet\" };\n        if (!pt.ok) {\n          cue(\"Not moved: \" + pt.why);\n          ctx.frame();\n          return true;\n        }\n        const rt = ctx.hist.run(\"move drawer to another cabinet\", () => transferDrawer(u, gg.n, v, lp.x, lp.y));\n        if (!rt || !rt.ok) {\n          cue(\"Not moved: \" + (rt && rt.why || \"it does not fit there\"));\n          ctx.frame();\n          return true;\n        }\n        scene.selectedId = v.id;\n        const bt = drawerBoxes(v).find((x) => x.xn === rt.n);\n        scene.drawerBox = bt ? { id: v.id, i: bt.i, click: true, part: \"front\" } : null;\n        if (scene.selPart && !partById(v, scene.selPart)) scene.selPart = null;\n        cue(rt.from.name + \" moved from \" + nameOf(u) + \" into \" + nameOf(v) + (rt.section && rt.section !== \"the cabinet\" ? \", \" + rt.section : \"\") + \", front at \" + rt.y + \" mm - now \" + rt.name + \" there; Undo puts it back\");\n        ctx.syncControls();\n        ctx.refresh();\n        return true;\n      }\n      if (lp) {\n        const free = e0 && e0.altKey != null ? !!e0.altKey : !!gg.free;\n        const s0 = snapRelocate(scene.units || [u], u, gg.n, lp.x, lp.y, { held: gg.held, free });\n        lp = { x: s0.lx, y: s0.ly };\n      }\n      const pv = lp ? previewRelocate(u, gg.n, lp.x, lp.y) : { ok: false, why: \"Carry the drawer over a bay of this cabinet\" };\n      if (!pv.ok) {\n        cue(\"Not moved: \" + pv.why);\n        ctx.frame();\n        return true;\n      }\n      if (pv.same) {\n        cue((pv.name || \"The drawer\") + \" stays where it is\");\n        ctx.frame();\n        return true;\n      }\n      const r = ctx.hist.run(\"move drawer\", () => relocateDrawer(u, gg.n, lp.x, lp.y));\n      if (!r || !r.ok) {\n        cue(\"Not moved: \" + (r && r.why || \"it does not fit there\"));\n        ctx.frame();\n        return true;\n      }\n      const b = drawerBoxes(u).find((x) => x.xn === gg.n);\n      if (b) scene.drawerBox = { id: u.id, i: b.i, click: true };\n      if (scene.selPart && !partById(u, scene.selPart)) scene.selPart = null;\n      cue(r.name + \" moved from \" + theOf(r.from.section) + \" to \" + theOf(r.section) + \", front at \" + r.y + \" mm - Undo puts it back\");\n      ctx.syncControls();\n      ctx.refresh();\n      return true;\n    }\n    function down(e, touch) {\n      if (g2) end(false);\n      if (!touch && e.button != null && e.button !== 0) return false;\n      const x = e.clientX, y = e.clientY, got = grabAt(x, y);\n      if (!got) return false;\n      if (got.n == null) {\n        g2 = { u: got.u, n: null, i: got.i, x0: x, y0: y, moved: false, pv: null, preset: true, touch: !!touch, said: null, b: got.b };\n      } else g2 = { u: got.u, n: got.n, i: got.i, x0: x, y0: y, moved: false, pv: null, touch: !!touch, said: null };\n      if (e.preventDefault) e.preventDefault();\n      return true;\n    }\n    function move(e) {\n      if (!g2) return false;\n      const x = e.clientX, y = e.clientY;\n      if (!g2.touch && e.isTrusted === true && e.buttons === 0) {\n        end(false);\n        return true;\n      }\n      if (!g2.moved && Math.hypot(x - g2.x0, y - g2.y0) < TRAVEL_PX2) return true;\n      if (!g2.moved) {\n        g2.moved = true;\n      }\n      if (e.preventDefault) e.preventDefault();\n      g2.free = !!e.altKey;\n      preview(x, y, g2.free);\n      return true;\n    }\n    function up(e) {\n      if (!g2) return false;\n      return end(true, e && e.clientX, e && e.clientY, e);\n    }\n    function cancel() {\n      if (!g2) return false;\n      end(false);\n      return true;\n    }\n    function key(e) {\n      if (!g2 || !e || e.key !== \"Escape\") return false;\n      if (e.preventDefault) e.preventDefault();\n      if (e.stopPropagation) e.stopPropagation();\n      end(false);\n      return true;\n    }\n    const api = {\n      down,\n      move,\n      up,\n      cancel,\n      key,\n      grabAt,\n      active: () => g2 ? { n: g2.n, moved: g2.moved } : null,\n      /* touch: one finger on the chosen drawer (touch.js start) */\n      touchStart: (x, y) => down({ clientX: x, clientY: y, preventDefault() {\n      } }, true)\n    };\n    ctx.drawerMove = api;\n    return api;\n  }\n\n  // v2/src/interact/index.js\n  function createInteraction(opts) {\n    const ctx = createCore(opts);\n    const scene = ctx.scene;\n    installHistory(ctx);\n    installView(ctx);\n    installPersist(ctx);\n    createCommands(ctx);\n    installPointer(ctx);\n    installParts(ctx);\n    installHandles(ctx);\n    installSize(ctx);\n    installNudge(ctx);\n    installTouch(ctx);\n    installKeyboard(ctx);\n    installTray(ctx);\n    installInsideTools(ctx);\n    installMeasure(ctx);\n    installQuickAdd(ctx);\n    installOpeningDrag(ctx);\n    installRoomObjectDrag(ctx);\n    installSplashDrag(ctx);\n    installHoodDrag(ctx);\n    installDrawerMove(ctx);\n    installRadial(ctx);\n    function afterMode(endInside) {\n      if (endInside && !scene.sizeMode && ctx.inside) ctx.inside.modeLeft();\n      scene.partsMode = !!scene.sizeMode || !!ctx.st.insideTool;\n      if (!scene.partsMode) {\n        scene.hoverPart = null;\n        scene.selPart = null;\n      }\n      if ((scene.sizeMode || scene.moveMode) && ctx.measure) ctx.measure.modeLeft();\n      ctx.st.activeHandle = null;\n      ctx.changed(\"handles\");\n      scene.cues = null;\n      ctx.cue(null);\n      ctx.syncControls();\n      ctx.refresh();\n    }\n    function setActionFlags(a) {\n      if (scene.workshop) a = null;\n      scene.moveMode = a === \"cabinet\";\n      scene.sizeMode = a === \"size\" || a === \"parts\";\n      scene.partsMode = scene.sizeMode || !!ctx.st.insideTool;\n    }\n    const modeLog = ctx.st.modeLog = [];\n    function logMode(fn, v) {\n      let by = \"\";\n      try {\n        by = String(new Error().stack || \"\").split(\"\\n\").slice(3, 6).map((l) => (l.match(/at ([^ (]+)/) || [])[1] || \"?\").join(\"<\");\n      } catch {\n      }\n      modeLog.push(fn + \":\" + v + \"@\" + by);\n      if (modeLog.length > 8) modeLog.shift();\n    }\n    function setCamera(c) {\n      logMode(\"cam\", c);\n      scene.panMode = c === \"pan\";\n      afterMode(false);\n    }\n    function setAction(a) {\n      logMode(\"act\", a);\n      setActionFlags(a);\n      afterMode(true);\n    }\n    function camera() {\n      return scene.panMode ? \"pan\" : \"rotate\";\n    }\n    function action() {\n      return scene.moveMode ? \"cabinet\" : scene.sizeMode ? \"size\" : null;\n    }\n    function chooseMode(m) {\n      if (scene.workshop && m !== \"rotate\" && m !== \"pan\") {\n        ctx.cue(\"Use the workshop size fields to resize this construction.\");\n        return;\n      }\n      if (m === \"rotate\" || m === \"pan\") {\n        if (camera() === m && action()) setAction(null);\n        else setCamera(m);\n        return;\n      }\n      const want = m === \"parts\" ? \"size\" : m;\n      setAction(action() === want ? null : want);\n    }\n    function setMode(m) {\n      logMode(\"set\", m);\n      setActionFlags(m === \"rotate\" || m === \"pan\" ? null : m);\n      scene.panMode = m === \"pan\";\n      afterMode(true);\n    }\n    function mode() {\n      return action() || camera();\n    }\n    ctx.setMode = setMode;\n    ctx.chooseMode = chooseMode;\n    ctx.setCamera = setCamera;\n    ctx.setAction = setAction;\n    ctx.mode = mode;\n    ctx.camera = camera;\n    ctx.action = action;\n    installCommandSet(ctx);\n    const CANVAS = {\n      /* + Shelf / + Divider: the press belongs to the tool (inside-tools.js) - nothing else sees it */\n      /* Measure: a press on an end ball is the tape's; any other press still turns the view (measure.js) */\n      /* the radial menu open: a press anywhere on the canvas only closes it (click-away, task 1790952562758) */\n      /* the press Chrome makes from the SECOND tap of a finger double tap the touch layer already handled is not a click-away:\n         that double tap may have just opened the cursor menu (touch.js touchEcho - a touch-made event of that same gesture);\n         it goes on to the other handlers as any press does (task 1791651497473, recorded: browser-flows \u00AB\u043F\u0430\u043B\u0435\u0446: \u0437\u0430\u0442\u0435\u043C \u0434\u0432\u043E\u0439\u043D\u043E\u0435\n         \u043A\u0430\u0441\u0430\u043D\u0438\u0435 \u043C\u0438\u043C\u043E \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043A\u0440\u0443\u0433\u043E\u0432\u043E\u0435 \u043C\u0435\u043D\u044E\u00BB - the menu opened at the touchend and this press shut it at once) */\n      mousedown: [\n        (e) => {\n          if (!touchEcho(e, ctx.st, msNow()) && ctx.radial.down(e)) e.__ubTaken = true;\n        },\n        (e) => {\n          if (ctx.measure.down(e)) e.__ubTaken = true;\n        },\n        (e) => {\n          if (ctx.inside.down(e)) e.__ubTaken = true;\n        },\n        /* a press on a window or door is its grab: the view does not turn and no cabinet moves (opening-drag.js) */\n        (e) => {\n          if (ctx.openingDrag.down(e)) e.__ubTaken = true;\n        },\n        /* a press on the SELECTED boiler is its drag (room-object-drag.js); on another boiler a click selects it */\n        (e) => {\n          if (ctx.objectDrag.down(e)) e.__ubTaken = true;\n        },\n        /* a press on the SELECTED splashback piece is its drag (splash-drag.js); on another piece a click selects it */\n        (e) => {\n          if (ctx.splashDrag.down(e)) e.__ubTaken = true;\n        },\n        /* a press on the SELECTED hood is its drag (hood-drag.js); on another hood a click selects it */\n        (e) => {\n          if (ctx.hoodDrag.down(e)) e.__ubTaken = true;\n        },\n        /* a press on the CHOSEN drawer's own front or box is that drawer's - it is carried to another bay (drawer-move.js) */\n        (e) => {\n          if (ctx.drawerMove.down(e)) e.__ubTaken = true;\n        },\n        (e) => ctx.parts.down(e),\n        (e) => ctx.pointer.down(e)\n      ],\n      mousemove: [(e) => {\n        ctx.st.lastPointer = [e.clientX, e.clientY];\n      }, (e) => {\n        if (ctx.measure.hover(e)) e.__ubTaken = true;\n      }, (e) => ctx.inside.hover(e), (e) => ctx.parts.hover(e)],\n      mouseleave: [(e) => ctx.measure.leave(e), (e) => ctx.inside.leave(e), (e) => ctx.parts.leave(e)],\n      /* two clicks on one corner are two tape points, not \"open this door\" (viewer.js dblclick) */\n      /* a double-click on a window or door arms it for moving (opening-drag.js, owner 02.10.2026) - before a cabinet's door */\n      /* nothing interactive under it - wall, floor, empty canvas: the four-mode radial menu (task 1790952562758), last */\n      /* the browser's own dblclick straight after a finger double-tap that the touch layer already ran through this list:\n         once is enough (task 1791223318552 - the tap opens the menu now too, the echo would open it again) */\n      dblclick: [\n        (e) => {\n          if (touchEcho(e, ctx.st, msNow())) e.__ubTaken = true;\n        },\n        // touch.js touchEcho (task 1791651497473)\n        (e) => {\n          if (ctx.openingDrag.dblclick(e)) e.__ubTaken = true;\n        },\n        /* a door / drawer / shelf the double-click acted on takes it: an open door swung OUT of its cabinet stands outside the\n           cabinet pick boxes, and radial.background() read that spot as empty floor - the shut came with the four-mode menu\n           (task 1791150651365, finding of 1791150653115) */\n        (e) => {\n          if (!ctx.measure.on() && ctx.parts.dblclick(e)) e.__ubTaken = true;\n        },\n        (e) => {\n          if (ctx.radial.dblclick(e)) e.__ubTaken = true;\n        }\n      ],\n      wheel: [() => ctx.radial.close(), (e) => {\n        if (ctx.view.wheel(e.deltaY, e.deltaMode, e.clientX, e.clientY) && e.cancelable && e.preventDefault) e.preventDefault();\n      }],\n      keydown: [(e) => ctx.keyboard.canvasKey(e)],\n      touchstart: [(e) => ctx.touch.start(e)],\n      touchmove: [(e) => ctx.touch.move(e)],\n      touchend: [(e) => ctx.touch.end(e)],\n      touchcancel: [(e) => ctx.touch.cancel(e)],\n      pointercancel: [() => ctx.drawerMove.cancel(), () => ctx.radial.cancel(), () => ctx.pointer.cancel()],\n      lostpointercapture: [() => ctx.pointer.lostCapture()]\n    };\n    const WINDOW = {\n      /* the window / door drag comes SECOND, after pointer: the browser hands the same event object to the canvas\n         list first, and there Measure's hover marks it taken - the loop then stops after the first handler, which\n         must stay pointer.move (the view turns in Measure). A window / door drag never runs with Measure on. */\n      /* the drawer carry comes SECOND, after pointer.move (which must stay first - Measure, above): pointer.move does nothing\n         while a drawer is carried (its press never reached it) */\n      mousemove: [(e) => ctx.pointer.move(e), (e) => {\n        if (ctx.drawerMove.move(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.openingDrag.move(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.objectDrag.move(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.splashDrag.move(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.hoodDrag.move(e)) e.__ubTaken = true;\n      }, (e) => ctx.handles.move(e), (e) => ctx.parts.move(e), (e) => ctx.size.move(e), (e) => ctx.tray.move(e)],\n      /* mouseup has no canvas list (nothing marks it beforehand), and the drag must end before pointer.up, which\n         commits any open history gesture */\n      /* a gesture of the mode chosen in the radial menu that really travelled: the menu comes back at the release\n         (radial.js, task 1791046271563) - before pointer / handles / size up, which drop the gesture it reads */\n      mouseup: [(e) => {\n        if (ctx.drawerMove.up(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.openingDrag.up(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.objectDrag.up(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.splashDrag.up(e)) e.__ubTaken = true;\n      }, (e) => {\n        if (ctx.hoodDrag.up(e)) e.__ubTaken = true;\n      }, (e) => ctx.radial.release(e), (e) => ctx.pointer.up(e), (e) => ctx.handles.up(e), (e) => ctx.parts.up(e), (e) => ctx.size.up(e), (e) => ctx.tray.up(e), (e) => ctx.inside.up(e), (e) => ctx.measure.up(e)],\n      keydown: [\n        (e) => {\n          if (ctx.drawerMove.key(e)) e.__ubTaken = true;\n        },\n        (e) => {\n          if (e.key === \"Escape\" && ctx.radial.dismiss()) e.__ubTaken = true;\n        },\n        (e) => {\n          if (e.key === \"Escape\" && (ctx.openingDrag.cancel() || ctx.objectDrag.cancel() || ctx.splashDrag.cancel() || ctx.hoodDrag.cancel() || ctx.openingDrag.disarm(true))) e.__ubTaken = true;\n        },\n        (e) => ctx.keyboard.windowKey(e)\n      ],\n      /* the window lost focus mid-drag (alt-tab, a dialog): a shelf / divider drag ends where it is, one Undo (task 1791215235157) */\n      blur: [() => ctx.drawerMove.cancel(), () => ctx.radial.cancel(), () => ctx.openingDrag.cancel(), () => ctx.objectDrag.cancel(), () => ctx.splashDrag.cancel(), () => ctx.hoodDrag.cancel(), () => ctx.parts.up(), () => ctx.pointer.blur()]\n    };\n    function msNow() {\n      return typeof performance !== \"undefined\" && performance.now ? performance.now() : Date.now();\n    }\n    function dispatch(table, type, e) {\n      const list = table[type];\n      if (!list) return false;\n      const ev = e || {};\n      for (let i = 0; i < list.length; i++) {\n        list[i](ev);\n        if (ev.__ubTaken) break;\n      }\n      return true;\n    }\n    function canvasEvent(type, e) {\n      return dispatch(CANVAS, type, e);\n    }\n    ctx.canvasDblclick = (e) => dispatch(CANVAS, \"dblclick\", e);\n    function windowEvent(type, e) {\n      return dispatch(WINDOW, type, e);\n    }\n    function boot2() {\n      if (ctx.render.setControls) ctx.render.setControls({ rotate: false, pan: false, zoom: false });\n      ctx.persist.initialScene();\n      ctx.persist.migrateRoom();\n      ctx.syncControls();\n      ctx.refresh();\n      ctx.view.openingView();\n    }\n    return {\n      ctx,\n      scene,\n      commands: ctx.commands,\n      hist: ctx.hist,\n      view: ctx.view,\n      persist: ctx.persist,\n      pointer: ctx.pointer,\n      parts: ctx.parts,\n      handles: ctx.handles,\n      size: ctx.size,\n      nudge: ctx.nudge,\n      touch: ctx.touch,\n      keyboard: ctx.keyboard,\n      tray: ctx.tray,\n      inside: ctx.inside,\n      measure: ctx.measure,\n      quickAdd: ctx.quickAdd,\n      setMode,\n      chooseMode,\n      setCamera,\n      setAction,\n      mode,\n      camera,\n      action,\n      canvasEvent,\n      windowEvent,\n      boot: boot2,\n      cue: () => ctx.st.cueText,\n      sel: ctx.sel,\n      radial: ctx.radial\n    };\n  }\n\n  // v2/src/model/unit-fingerprint.js\n  var VOLATILE = { explode: 1, dispX: 1, dispY: 1, dispZ: 1 };\n  function unitFingerprint(u) {\n    return u ? JSON.stringify(u, (k, v) => VOLATILE[k] ? void 0 : v) : \"\";\n  }\n\n  // v2/src/interact/unit-edit.js\n  function applyDraft(ia, u, d) {\n    for (const k of [\"w\", \"h\", \"d\"]) {\n      if (d[k] == null || Number(d[k]) === u[k]) continue;\n      ia.size.applyDim(u, k, String(d[k]));\n      if (Math.abs(u[k] - Number(d[k])) > 0.5) return \"the kitchen allows \" + k.toUpperCase() + \" \" + u[k] + \" mm here, not \" + d[k] + \" mm (neighbours, walls or limits)\";\n    }\n    if (d.shelves != null && canInterior(u)) {\n      let guard = 0;\n      while (interiorOf(u).shelves !== d.shelves && guard++ < 40) {\n        const r = ia.commands.run(\"interiorShelves\", { step: interiorOf(u).shelves < d.shelves ? 1 : -1 });\n        if (!r || r.ok === false) return \"the shelves could not be set to \" + d.shelves;\n      }\n      if (interiorOf(u).shelves !== d.shelves) return \"this cabinet takes \" + interiorOf(u).shelves + \" shelves at most\";\n    }\n    if (d.door != null && !!u.door !== !!d.door) {\n      const r = ia.commands.run(\"toggleDoor\", {});\n      if (!r || r.ok === false) return \"the door could not be \" + (d.door ? \"added\" : \"removed\");\n    }\n    return null;\n  }\n  function applyUnitEdit(ia, a) {\n    const scene = ia.ctx.scene, H2 = ia.hist.raw();\n    if (H2.live) return { ok: false, why: \"Finish what you are doing in the planner first.\" };\n    const before = ia.hist.snap(), d0 = H2.past.length, sel0 = scene.selectedId;\n    const back = (why2) => {\n      ia.hist.restore(before);\n      H2.past.length = d0;\n      scene.selectedId = sel0;\n      ia.ctx.refresh();\n      return { ok: false, why: why2 };\n    };\n    let u = null, label = \"edit cabinet\";\n    if (a && a.type) {\n      const r = ia.commands.run(\"addUnit\", { type: a.type });\n      if (!r || r.ok === false) return back(\"The cabinet could not be added: \" + (r && (r.why || r.cue) || \"no room\"));\n      u = scene.units.find((v) => v.id === scene.selectedId) || null;\n      if (!u) return back(\"The cabinet could not be added.\");\n      label = \"add cabinet\";\n    } else {\n      u = scene.units.find((v) => v.id === (a && a.id)) || null;\n      if (!u) return { ok: false, why: \"That cabinet is no longer in the kitchen - nothing changed.\" };\n      if (unitFingerprint(u) !== (a && a.fingerprint)) return { ok: false, why: \"The cabinet changed since this window opened - nothing changed. Close it and open it again.\" };\n      scene.selectedId = u.id;\n    }\n    let why = null;\n    try {\n      why = applyDraft(ia, u, a && a.draft || {});\n    } catch (e) {\n      why = \"the edit failed (\" + (e && e.message) + \")\";\n    }\n    if (why) return back(\"Nothing changed: \" + why + \".\");\n    const after = ia.hist.snap();\n    H2.past.length = d0;\n    if (after === before) {\n      scene.selectedId = sel0 && !a.type ? sel0 : scene.selectedId;\n      return { ok: true, changed: false, id: u.id };\n    }\n    H2.past.push({ label, before, after });\n    H2.future.length = 0;\n    if (!a.type) scene.selectedId = sel0;\n    ia.ctx.changed(\"history\");\n    ia.ctx.refresh();\n    return { ok: true, changed: true, id: u.id, label };\n  }\n  function previewUnitEdit(ia, a) {\n    const scene = ia.ctx.scene, out = { ok: true, sync: false, render: false, fields: {} };\n    if (!a || !a.id) return out;\n    const units = JSON.parse(JSON.stringify(scene.units));\n    const u = units.find((v) => v.id === a.id);\n    if (!u) return { ok: false, sync: false, render: false, why: \"That cabinet is no longer in the kitchen.\", fields: {} };\n    const d = a.draft || {};\n    for (const k of [\"w\", \"h\", \"d\"]) {\n      if (d[k] == null || Number(d[k]) === u[k]) continue;\n      const asked = Math.round(Number(d[k]));\n      const r = ia.size.previewDim(units, u, k, String(asked));\n      out.fields[k] = { asked, value: r.value, refused: r.refused || null, said: r.said };\n      if (r.refused) break;\n    }\n    return out;\n  }\n\n  // v2/src/interact/ui-commands.js\n  function createUiCommands(ia) {\n    const ctx = ia.ctx, st = ctx.st, C3 = ia.commands;\n    const run = (name2, args) => C3.run(name2, args || {});\n    const TABLE = {\n      \"workshop.size\": (a) => run(\"setDim\", a),\n      \"workshop.part\": (a) => run(\"selectWorkshopPart\", a),\n      \"drawer.all\": () => run(\"toggleAllDrawers\"),\n      \"drawer.toggle\": (a) => run(\"toggleDrawer\", { i: a.i }),\n      \"finishing.end\": (a) => run(\"toggleEndPanel\", { side: a.side }),\n      \"finishing.endDrop\": (a) => run(\"setEndDrop\", { down: a.drop }),\n      \"finishing.scribe\": (a) => run(\"setScribe\", { side: a.side, value: a.raw }),\n      \"finishing.endSet\": (a) => run(\"toggleEndPanel\", { side: a.side, on: a.on }),\n      \"finishing.endMat\": (a) => run(\"setEndMat\", { value: a.value }),\n      \"finishing.all\": () => run(\"finishExposedEnds\"),\n      \"gap.fill\": (a) => {\n        if (a.dir) st.gapPick = a.dir;\n        return run(\"gapFill\", { mode: a.mode });\n      },\n      \"gap.undo\": () => run(\"gapUndo\"),\n      \"history.undo\": () => ({ ok: ia.hist.undo() }),\n      \"history.redo\": () => ({ ok: ia.hist.redo() }),\n      \"interior.hdiv.add\": () => run(\"addPartition\"),\n      \"interior.hdiv.pos\": (a) => run(\"setPartition\", { i: a.i, value: a.raw }),\n      \"interior.hdiv.remove\": () => run(\"removePartition\"),\n      \"interior.see\": () => run(\"toggleInteriorView\"),\n      \"interior.shelves\": (a) => run(\"interiorShelves\", { step: a.step }),\n      \"interior.vdiv.add\": () => run(\"addDivider\"),\n      \"interior.vdiv.pos\": (a) => run(\"setDivider\", { i: a.i, value: a.raw }),\n      \"interior.vdiv.remove\": () => run(\"removeDivider\"),\n      \"island.bayKind\": (a) => run(\"setBayKind\", { i: a.i, kind: a.kind }),\n      \"island.bayOpen\": (a) => run(\"toggleBayOpen\", { i: a.i }),\n      \"island.preset\": (a) => run(\"islandPreset\", { id: a.id }),\n      \"island.sections\": (a) => run(\"setSectionCount\", { n: a.n }),\n      \"island.sectionWidth\": (a) => run(\"setSectionWidth\", { i: a.i, value: a.raw }),\n      \"kitchen.finish\": (a) => run(\"setKitchenFinish\", { k: a.which, value: a.val }),\n      \"kitchen.materials\": (a) => run(\"setKitchenMaterials\", a),\n      \"kitchen.gola\": (a) => run(\"setKitchenGola\", a),\n      \"kitchen.build\": (a) => run(\"setKitchenBuild\", a),\n      // the pro edition's construction choices (card 1791885434176)\n      \"unit.cutout.add\": (a) => run(\"addCutout\", a),\n      // the pro edition's bespoke cut-outs (card 1792055030187)\n      \"unit.cutout.remove\": (a) => run(\"removeCutout\", a),\n      \"unit.fixing\": (a) => run(\"setUnitFixing\", a),\n      // Ironmongery - Fixings (task 1791963906042)\n      \"kitchen.worktop\": (a) => run(\"setKitchenWorktop\", a),\n      \"unit.hood\": (a) => run(\"setUnitHood\", a),\n      // task 1791557195336\n      \"unit.hoodPlace\": (a) => run(\"setHood\", a),\n      // the hood's own place: height + along its wall (owner 13.10.2026)\n      \"kitchen.splash\": (a) => run(\"setKitchenSplash\", a),\n      // task 1791557195336\n      \"splash.add\": (a) => run(\"addSplashPiece\", a),\n      // authored pieces (owner 12.10.2026)\n      \"splash.piece\": (a) => run(\"setSplashPiece\", a),\n      \"splash.remove\": (a) => run(\"removeSplashPiece\", a),\n      \"unit.gola\": (a) => run(\"setUnitGola\", { on: a.on }),\n      \"plan.reset\": () => run(\"reset\"),\n      \"wand.variants\": (a) => run(\"kitchenVariants\", { seed: a.seed, layout: a.layout, cooking: a.cooking, hood: a.hood }),\n      \"wand.apply\": (a) => run(\"applyKitchen\", { index: a.index }),\n      \"kitchen.score\": () => run(\"kitchenScore\"),\n      \"plan.restore\": () => run(\"restore\"),\n      \"plan.save\": () => run(\"save\"),\n      \"plan.open\": (a) => run(\"openPlan\", { plan: a.plan, meta: a.meta, cue: a.cue }),\n      \"plan.switch\": (a) => run(\"switchPlan\", { id: a.id }),\n      \"room.dim\": (a) => run(\"setRoomDim\", { k: a.k, value: a.raw }),\n      \"room.show\": () => run(\"roomInfo\"),\n      \"room.look\": (a) => run(\"setRoomLook\", { k: a.k, value: a.value }),\n      \"room.opening.add\": (a) => run(\"addOpening\", { kind: a.kind, wall: a.wall }),\n      \"room.opening.set\": (a) => run(\"setOpening\", { id: a.id, k: a.k, value: a.raw, phase: a.phase }),\n      /* turn the view to look at one wall from inside the room, the whole room framed (the Room panel\n         does it when a window or door is added to or moved onto that wall, task 1790876476355) */\n      \"view.faceWall\": (a) => run(\"faceWall\", { wall: a.wall }),\n      \"room.opening.remove\": (a) => run(\"removeOpening\", { id: a.id }),\n      /* Set room layout (ui/room-layout-editor.js): the editor's draft applied - one Undo, or refused with every reason */\n      \"room.layout.apply\": (a) => run(\"applyRoomLayout\", { outline: a.outline, partitions: a.partitions }),\n      /* the boiler on the Room strip (ui/room-editor.js; the 3D drag is interact/room-object-drag.js) */\n      \"room.object.add\": (a) => run(\"addRoomObject\", { kind: a.kind || \"boiler\" }),\n      \"room.object.set\": (a) => run(\"setRoomObject\", { id: a.id, k: a.k, raw: a.raw }),\n      \"room.object.remove\": (a) => run(\"removeRoomObject\", { id: a.id }),\n      \"run.dim\": (a) => run(\"setRunDim\", { key: a.key, tier: a.tier, value: a.raw }),\n      \"run.link\": (a) => run(\"toggleRunLink\", { tier: a.tier }),\n      \"select\": (a) => run(\"select\", { id: a.id }),\n      \"shelf.add\": () => run(\"addShelf\"),\n      \"shelf.height\": (a) => run(\"setShelfHeight\", { mm: a.raw }),\n      \"shelf.remove\": () => run(\"removeSelectedShelf\"),\n      \"size.grip\": (a) => {\n        const e = { clientX: a.clientX, clientY: a.clientY, preventDefault() {\n        }, stopPropagation() {\n        } };\n        ia.size.setActiveDim(a.k);\n        ia.size.startGrip(e, a.k, a.edge, { edge: a.edge, deg: a.deg });\n        return { ok: true, sync: false, render: false };\n      },\n      \"tall.height\": (a) => run(\"setTallHeight\", { h: a.h }),\n      \"tall.leaf\": (a) => run(\"toggleLeaf\", { i: a.i }),\n      \"tall.shelves\": (a) => run(\"stepPantryShelves\", { step: a.step }),\n      \"drawer.box\": (a) => run(\"selectDrawerBox\", a && a.part ? { i: a.i, part: a.part } : { i: a.i }),\n      \"drawer.boxH\": (a) => run(\"setDrawerBoxH\", { i: a.i, h: a.h, live: !!a.live }),\n      \"drawer.boxDone\": () => run(\"drawerBoxDone\"),\n      \"drawer.height\": (a) => run(\"setDrawerHeight\", { i: a.i, h: a.h, live: !!a.live, edge: a.edge }),\n      \"drawer.seam\": (a) => run(\"moveSeam\", { key: a.key, y: a.y, live: !!a.live }),\n      /* drawers added into a cabinet (task 1791091585353) */\n      \"drawer.add\": (a) => run(\"addDrawer\", { band: a && a.band, col: a && a.col, y: a && a.y, fh: a && a.fh }),\n      \"drawer.remove\": (a) => run(\"removeDrawer\", { n: a.n }),\n      \"drawer.dropAt\": (a) => run(\"dropDrawerAt\", { cx: a.cx, cy: a.cy }),\n      \"drawer.preview\": (a) => run(\"previewDrawerDrop\", { cx: a.cx, cy: a.cy }),\n      \"drawer.previewClear\": () => run(\"clearDrawerPreview\"),\n      /* a shelf / divider dragged in from the menu (task 1791222646469): the drawer drag-in's preview / drop for boards */\n      \"interior.preview\": (a) => run(\"previewInteriorDrop\", { kind: a.kind, cx: a.cx, cy: a.cy }),\n      \"interior.previewClear\": () => run(\"clearInteriorPreview\"),\n      \"interior.dropAt\": (a) => run(\"dropInteriorAt\", { kind: a.kind, cx: a.cx, cy: a.cy }),\n      /* glass doors, one cabinet at a time (task 1791491928266, owner 09.10.2026): drag Glass from the Fronts tray onto a cabinet */\n      \"glass.preview\": (a) => run(\"previewGlassDrop\", { cx: a.cx, cy: a.cy }),\n      \"glass.previewClear\": () => run(\"clearGlassPreview\"),\n      \"glass.dropAt\": (a) => run(\"dropGlassAt\", { cx: a.cx, cy: a.cy }),\n      \"glass.selected\": (a) => run(\"setGlassDoor\", { id: a && a.id }),\n      /* the selected cabinet's Glass ON / OFF (owner 09.10.2026): on:true = glass on it only, on:false = glass off */\n      \"glass.toggle\": (a) => run(\"setGlassDoor\", { on: !(a && a.on === false) }),\n      \"drawer.move\": (a) => run(\"moveDrawer\", { n: a.n, y: a.y, live: !!a.live }),\n      \"drawer.front\": (a) => run(\"setDrawerFront\", { n: a.n, fh: a.fh }),\n      \"drawer.openAdded\": (a) => run(\"toggleAddedDrawer\", { n: a.n }),\n      \"drawer.cancel\": () => run(\"drawerDragCancel\"),\n      \"drawer.doorH\": (a) => run(\"setDoorHeight\", { h: a.h }),\n      \"tall.pockets\": (a) => run(\"setTallPockets\", { n: a.n }),\n      \"unit.add\": (a) => run(\"addUnit\", { type: a.type }),\n      \"unit.addMode\": (a) => run(\"setAddMode\", { carcass: !!(a && a.carcass) }),\n      /* the side panel's size field: ONE Undo step for the cabinet and every cabinet a wider width pushed along (owner\n         03.10.2026); a value that changes nothing writes none */\n      \"unit.dim\": (a) => {\n        const before = ia.hist.snap();\n        const v = ia.size.applyDim(ctx.sel(), a.k, a.raw);\n        ia.hist.pushAfter(\"resize cabinet\", before);\n        return { ok: true, value: v };\n      },\n      \"unit.frontStyle\": (a) => run(\"setFrontStyle\", a),\n      \"unit.door\": () => run(\"toggleDoor\"),\n      \"unit.drawerFronts\": () => run(\"toggleDrawerFronts\"),\n      \"unit.doorOpen\": () => run(\"toggleDoorOpen\"),\n      \"unit.drawerOpen\": () => run(\"toggleDrawerOpen\"),\n      \"unit.drop\": (a) => run(\"dropUnit\", { type: a.type, x: a.x, z: a.z }),\n      \"unit.duplicate\": () => run(\"duplicate\"),\n      \"unit.addBeside\": (a) => run(\"addBeside\", { side: a && a.side, id: a && a.id }),\n      \"unit.finish\": (a) => run(\"setOwnFinish\", { k: a.which, value: a.value }),\n      \"unit.finishReset\": () => run(\"clearOwnFinish\"),\n      \"unit.flip\": () => run(\"flip\"),\n      \"unit.hand\": (a) => run(\"setBlindHand\", { hand: a.hand }),\n      \"unit.remove\": () => run(\"remove\"),\n      \"unit.reorder\": (a) => run(\"moveInRow\", { dir: a.dir }),\n      \"unit.resize\": (a) => ({ ok: ia.size.commitSize(a.k, a.raw) !== void 0 }),\n      \"unit.turn\": (a) => run(\"turn\", { dir: a.dir }),\n      /* the build inspector's Apply (task 1791963906042): one cabinet's draft through the planner's own rules, ONE Undo step,\n         refused as a whole (nothing changed) when stale or not allowed - interact/unit-edit.js */\n      \"unit.editApply\": (a) => applyUnitEdit(ia, a),\n      /* its faithful preview: the same size decision on a copy of the kitchen's cabinets - nothing changes */\n      \"unit.editPreview\": (a) => previewUnitEdit(ia, a),\n      \"view.alignView\": () => run(\"toggleAlignView\"),\n      \"view.frontsSeeThrough\": () => run(\"toggleFrontsSeeThrough\"),\n      \"view.hardwareXray\": () => run(\"toggleHardwareXray\"),\n      // pro edition (card 1792055030181)\n      \"view.allDims\": () => run(\"toggleAllDims\"),\n      \"view.environment\": (a) => run(\"setEnvironment\", { name: a && a.name }),\n      \"view.graphics\": (a) => run(\"setGraphics\", { name: a && a.name }),\n      \"view.explode\": (a) => run(\"setExplode\", { pct: a.pct }),\n      \"view.fit\": () => {\n        ia.view.fitButton();\n        return { ok: true };\n      },\n      /* a cabinet just added from the catalogue: the chosen view stays, moved only as far as showing it needs (view.js) */\n      \"view.reveal\": (a) => ia.view.revealUnit(a && a.id != null ? a.id : ia.scene.selectedId, a && a.safe),\n      \"view.fitTo\": (a) => {\n        if (a.wide) ia.view.fitRoom();\n        else ia.view.fitKitchen(!!a.quiet);\n        return { ok: true };\n      },\n      \"view.hinge\": () => run(\"toggleHinge\"),\n      \"view.hingeZoom\": () => run(\"toggleHingeZoom\"),\n      \"view.mode\": (a) => {\n        ia.chooseMode(a.mode);\n        return { ok: true };\n      },\n      \"view.radialChoose\": (a) => ia.radial.choose(a.mode),\n      \"view.radialClose\": () => ({ ok: ia.radial.close() }),\n      /* a finger's touch that landed on a control lying over the canvas but belongs to the view (the cursor menu that came back by\n         itself after a move / rotate - ui/radial-menu.js): handed to the canvas's own touch handling, as if the canvas had it */\n      \"view.canvasTouch\": (a) => ({ ok: !!(a && a.type && a.event) && (ia.canvasEvent(a.type, a.event), true), sync: false, render: false }),\n      // the touch layer draws its own frames\n      /* the cursor menu after a move / rotate made by a BUTTON (owner 11.10.2026, cursor-menu-after-transform-oct11: \u00ABafter every\n         action of move or rotate ... doesn't matter where it was called from\u00BB): at the press point, or the button's centre for a\n         key press (client px) - kept on the canvas and clear of the controls, like the gesture's (radial.js touchDone) */\n      \"view.menuAt\": (a) => ({ ok: !!(ia.radial && ia.radial.touchDone && ia.radial.touchDone(a.x, a.y)) }),\n      \"view.rotate\": (a) => {\n        ia.view.rotButton(a.dir);\n        return { ok: true };\n      },\n      \"view.snap\": () => run(\"toggleSnap\"),\n      \"view.zoom\": (a) => {\n        if (a.dir === \"in\") ia.view.zoomIn();\n        else ia.view.zoomOut();\n        return { ok: true };\n      }\n    };\n    function uiRun(name2, args) {\n      const f = TABLE[name2];\n      if (!f) throw new Error(\"interact: \\u0438\\u043D\\u0442\\u0435\\u0440\\u0444\\u0435\\u0439\\u0441 \\u0437\\u043E\\u0432\\u0451\\u0442 \\u043D\\u0435\\u0438\\u0437\\u0432\\u0435\\u0441\\u0442\\u043D\\u0443\\u044E \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u0443 \" + name2);\n      const seq = st.cueSeq;\n      const r = f(args || {}) || {};\n      const out = Object.assign({}, r);\n      if (out.ok === void 0) out.ok = true;\n      if (st.cueSeq !== seq) out.cue = st.cueText || null;\n      else delete out.cue;\n      return out;\n    }\n    function history() {\n      const H2 = ia.hist.raw();\n      return { past: H2.past.map((e) => e.label), future: H2.future.map((e) => e.label) };\n    }\n    function can(name2) {\n      if (name2 === \"gap.undo\") return !!st.gapUndo && ia.hist.undoLabel() === st.gapUndo;\n      if (name2 === \"history.undo\") return ia.hist.canUndo();\n      if (name2 === \"history.redo\") return ia.hist.canRedo();\n      return Object.prototype.hasOwnProperty.call(TABLE, name2);\n    }\n    return { run: uiRun, history, can, names: () => Object.keys(TABLE) };\n  }\n\n  // v2/src/interact/overlay-dom.js\n  function arrowSvg() {\n    return '<svg class=\"ub-a-arrow\" viewBox=\"0 0 100 34\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" aria-hidden=\"true\" focusable=\"false\"><rect class=\"ub-a-shaft\" x=\"2\" y=\"13.5\" width=\"62\" height=\"7\" rx=\"3.5\"></rect><polygon class=\"ub-a-head\" points=\"60,3 98,17 60,31\"></polygon></svg>';\n  }\n  function createOverlayDom(ia, env2) {\n    const root = env2.root, canvas = env2.canvas, doc2 = env2.doc;\n    const scene = ia.scene, ctx = ia.ctx;\n    const make = (tag) => root.ownerDocument ? root.ownerDocument.createElement(tag) : doc2 && doc2.createElement ? doc2.createElement(tag) : null;\n    const partsLayer = root.querySelector ? root.querySelector(\"[data-ub-parts]\") : null;\n    const hNodes = {}, hLabels = {}, gripStubs = {};\n    function layerOrigin() {\n      if (!partsLayer || !partsLayer.getBoundingClientRect || !canvas || !canvas.getBoundingClientRect) return { dx: 0, dy: 0 };\n      const cr = canvas.getBoundingClientRect(), lr = partsLayer.getBoundingClientRect();\n      if (!cr || !lr || !isFinite(cr.left) || !isFinite(lr.left)) return { dx: 0, dy: 0 };\n      return { dx: cr.left - lr.left, dy: cr.top - lr.top };\n    }\n    function ensureHandleNode(h) {\n      if (hNodes[h.hid]) return hNodes[h.hid];\n      const b = make(\"button\");\n      if (!b) return null;\n      b.setAttribute(\"type\", \"button\");\n      b.setAttribute(\"class\", \"ub-lab__parrow ub-lab__parrow--\" + h.axis);\n      b.setAttribute(\"data-ub-phandle\", h.hid);\n      b.setAttribute(\"data-ub-pdim\", h.dim);\n      if (h.edge) {\n        b.setAttribute(\"data-ub-pedge\", h.edge);\n        b.setAttribute(\"data-ub-edge\", h.edge);\n      }\n      b.innerHTML = arrowSvg();\n      const hid = h.hid;\n      b.addEventListener(\"mousedown\", (e) => {\n        if (e && e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n        ia.handles.startDrag(hid, e);\n      });\n      for (const t of [\"touchstart\", \"touchmove\", \"touchend\", \"touchcancel\"])\n        b.addEventListener(t, (e) => {\n          ia.canvasEvent(t, e);\n        }, { passive: t !== \"touchmove\" });\n      b.addEventListener(\"mouseenter\", () => {\n        if (ia.handles.setHover) ia.handles.setHover(hid);\n      });\n      b.addEventListener(\"mouseleave\", () => {\n        if (ia.handles.setHover) ia.handles.setHover(null);\n      });\n      if (partsLayer && partsLayer.appendChild) partsLayer.appendChild(b);\n      hNodes[hid] = b;\n      const l = make(\"span\");\n      l.setAttribute(\"class\", \"ub-lab__plabel\");\n      l.setAttribute(\"data-ub-plabel\", hid);\n      if (partsLayer && partsLayer.appendChild) partsLayer.appendChild(l);\n      hLabels[hid] = l;\n      return b;\n    }\n    function hideOne(k) {\n      hNodes[k].style.display = \"none\";\n      if (hLabels[k]) hLabels[k].style.display = \"none\";\n    }\n    function hideAllHandles() {\n      for (const k of Object.keys(hNodes)) hideOne(k);\n      if (partsLayer) partsLayer.setAttribute(\"hidden\", \"\");\n    }\n    function drawHandles() {\n      if (!partsLayer) return;\n      const u = ctx.sel();\n      if (!scene.partsMode && !scene.sizeMode || !u || scene.explode > 0) {\n        hideAllHandles();\n        return;\n      }\n      partsLayer.removeAttribute(\"hidden\");\n      ctx.syncHandlesState();\n      const o = layerOrigin();\n      const byHid = {};\n      for (const h of ia.handles.list()) byHid[h.hid] = h;\n      const live = {};\n      for (const it of ia.handles.layout()) {\n        const h = byHid[it.hid];\n        if (!h) continue;\n        live[it.hid] = 1;\n        const node = ensureHandleNode(h);\n        if (!node) continue;\n        if (!it.visible) {\n          hideOne(it.hid);\n          continue;\n        }\n        node.style.display = \"\";\n        const gx = it.gripX != null ? it.gripX : it.rootX != null ? it.rootX : it.x, gy = it.gripY != null ? it.gripY : it.rootY != null ? it.rootY : it.y;\n        node.style.left = Math.round(gx + o.dx) + \"px\";\n        node.style.top = Math.round(gy + o.dy) + \"px\";\n        node.style.width = gripHalf(it.alen) * 2 + \"px\";\n        node.style.height = \"16px\";\n        node.style.transform = \"translate(-50%,-50%) rotate(\" + it.deg.toFixed(1) + \"deg)\";\n        {\n          const r = (it.deg % 180 + 180) % 180, horiz = r < 45 || r > 135;\n          node.style.cursor = horiz ? \"ew-resize\" : \"ns-resize\";\n        }\n        node.classList.add(\"is-grip\");\n        node.setAttribute(\"data-ub-deg\", String(Math.round(it.deg)));\n        node.classList.toggle(\"is-mesh\", !!it.mesh);\n        node.classList.toggle(\"is-gap\", !!it.gap);\n        if (it.alt || it.mesh) node.setAttribute(\"data-ub-root\", it.alt ? \"moved\" : \"mesh\");\n        else node.removeAttribute(\"data-ub-root\");\n        node.setAttribute(\"title\", it.title);\n        node.setAttribute(\"aria-label\", it.title);\n        node.classList.toggle(\"is-active\", !!it.active);\n        node.style.pointerEvents = it.passive ? \"none\" : \"auto\";\n        node.classList.toggle(\"is-passive\", !!it.passive);\n        if (it.passive) node.setAttribute(\"aria-hidden\", \"true\");\n        else node.removeAttribute(\"aria-hidden\");\n        node.disabled = !!it.passive;\n        const lab = hLabels[it.hid];\n        if (lab) {\n          lab.style.display = it.showLabel ? \"\" : \"none\";\n          lab.textContent = it.label;\n          lab.classList.toggle(\"is-faint\", !!it.faint);\n          let lx = it.labelX, ly = it.labelY;\n          if (it.showLabel && isFinite(it.rootX) && isFinite(it.ux) && lab.getBoundingClientRect) {\n            const r = lab.getBoundingClientRect();\n            const hb = Math.abs(it.ux) * (r.width || 0) / 2 + Math.abs(it.uy) * (r.height || 0) / 2 + 1;\n            lx = it.rootX - it.ux * hb;\n            ly = it.rootY - it.uy * hb;\n          }\n          lab.style.left = Math.round(lx + o.dx) + \"px\";\n          lab.style.top = Math.round(ly + o.dy) + \"px\";\n        }\n      }\n      for (const k of Object.keys(hNodes)) if (!live[k]) hideOne(k);\n    }\n    function gripStub(key) {\n      if (!gripStubs[key]) {\n        const el = make(\"button\");\n        el.setAttribute(\"type\", \"button\");\n        el.style.display = \"none\";\n        el.disabled = true;\n        gripStubs[key] = el;\n      }\n      return gripStubs[key];\n    }\n    function arrowFor(k, edge) {\n      const hid = ia.handles.arrowFor(k, edge);\n      const n = hid ? hNodes[hid] : null;\n      return n && n.style.display !== \"none\" ? n : gripStub(k + \":\" + edge);\n    }\n    const N = { els: null, host: null };\n    function ensureNudgeUI() {\n      if (N.els) return N.els;\n      const host = root.querySelector ? root.querySelector(\"[data-ub-size]\") : null;\n      if (!host) return null;\n      let stage = null;\n      for (const n of [host.parentNode, canvas && canvas.parentNode, root])\n        if (!stage && n && typeof n.appendChild === \"function\") stage = n;\n      if (!stage) return null;\n      const nudgeHost = N.host = make(\"div\");\n      nudgeHost.className = \"ub-lab__move\";\n      nudgeHost.setAttribute(\"data-ub-move\", \"\");\n      nudgeHost.setAttribute(\"role\", \"group\");\n      nudgeHost.setAttribute(\"aria-label\", \"Move this cabinet\");\n      stage.appendChild(nudgeHost);\n      const nudgeEls = N.els = {};\n      for (const d of NUDGE_DIRS) {\n        const b = make(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-lab__movearrow\";\n        b.setAttribute(\"data-ub-movearrow\", d.k);\n        b.innerHTML = \"\\u25B6\";\n        b.textContent = \"\\u25B6\";\n        const k = d.k;\n        b.addEventListener(\"click\", (e) => {\n          if (e && e.preventDefault) e.preventDefault();\n          if (e && e.stopPropagation) e.stopPropagation();\n          ia.nudge.run(k);\n        });\n        b.addEventListener(\"mousedown\", (e) => {\n          if (e && e.stopPropagation) e.stopPropagation();\n        });\n        nudgeHost.appendChild(b);\n        nudgeEls[k] = b;\n      }\n      return nudgeEls;\n    }\n    function drawNudge() {\n      const els = ensureNudgeUI();\n      const nudgeHost = N.host;\n      if (!els || !nudgeHost) return;\n      const u = ctx.sel();\n      if (!scene.moveMode || !u) {\n        nudgeHost.setAttribute(\"hidden\", \"\");\n        for (const d of NUDGE_DIRS) els[d.k].style.display = \"none\";\n        ctx.st.lastNudge = null;\n        return;\n      }\n      nudgeHost.removeAttribute(\"hidden\");\n      const L = ia.nudge.layout() || [];\n      ctx.st.lastNudge = L;\n      const at = {};\n      for (const a of L) at[a.k] = a;\n      for (const d of NUDGE_DIRS) {\n        const b = els[d.k], a = at[d.k];\n        if (!a) {\n          b.style.display = \"none\";\n          b.disabled = true;\n          continue;\n        }\n        b.style.display = \"\";\n        b.disabled = false;\n        b.style.left = Math.round(a.x) + \"px\";\n        b.style.top = Math.round(a.y) + \"px\";\n        b.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(a.deg) + \"deg)\";\n        b.setAttribute(\"data-ub-deg\", String(Math.round(a.deg)));\n        b.setAttribute(\"data-ub-dist\", String(Math.round(a.dist)));\n        b.setAttribute(\"title\", a.title);\n        b.setAttribute(\"aria-label\", a.title);\n      }\n    }\n    function draw() {\n      try {\n        drawNudge();\n      } catch {\n      }\n      try {\n        drawHandles();\n      } catch {\n      }\n    }\n    return {\n      draw,\n      drawHandles,\n      drawNudge,\n      hideAllHandles,\n      arrowFor,\n      handleNode: (hid) => hNodes[hid] || null,\n      handleLabel: (hid) => {\n        const l = hLabels[hid];\n        return l ? l.textContent : null;\n      },\n      handleVisible: (hid) => {\n        const n = hNodes[hid];\n        return !!n && n.style.display !== \"none\";\n      },\n      handleSize: (hid) => {\n        const n = hNodes[hid];\n        return n ? parseInt(n.style.width, 10) : null;\n      },\n      handleAt: (hid) => {\n        const n = hNodes[hid];\n        return n ? { x: parseInt(n.style.left, 10), y: parseInt(n.style.top, 10) } : null;\n      },\n      nudgeEl: (k) => N.els ? N.els[k] : null\n    };\n  }\n\n  // v2/src/ui/dim-draw.js\n  var DIM = { GAP_EXT: 2, EXT_OVER: 4, HEAD_L: 6, HEAD_W: 2.2, TEXT_OFF: 2 };\n  var R2 = (v) => Math.round(v * 10) / 10;\n  function readableDeg(dx, dy) {\n    let d = Math.atan2(dy, dx) * 180 / Math.PI;\n    if (d > 90) d -= 180;\n    if (d <= -90) d += 180;\n    if (Math.abs(d - 90) < 0.5) d = -90;\n    return d;\n  }\n  function normalAway(P0, P1, from) {\n    const dx = P1.x - P0.x, dy = P1.y - P0.y, L = Math.hypot(dx, dy) || 1;\n    let nx = -dy / L, ny = dx / L;\n    const mx = (P0.x + P1.x) / 2, my = (P0.y + P1.y) / 2;\n    if (from && (mx - from.x) * nx + (my - from.y) * ny < 0) {\n      nx = -nx;\n      ny = -ny;\n    }\n    return { x: nx, y: ny };\n  }\n  function dimGeom(P0, P1, n, off, at, textH) {\n    const o = off || 0, t = at == null ? 0.5 : at, th = textH || 10;\n    const d0 = { x: P0.x + n.x * o, y: P0.y + n.y * o }, d1 = { x: P1.x + n.x * o, y: P1.y + n.y * o };\n    const dx = d1.x - d0.x, dy = d1.y - d0.y, len = Math.hypot(dx, dy) || 1, ux = dx / len, uy = dy / len;\n    const ext = o > 0 ? [P0, P1].map((P2) => [\n      { x: P2.x + n.x * Math.min(DIM.GAP_EXT, o), y: P2.y + n.y * Math.min(DIM.GAP_EXT, o) },\n      { x: P2.x + n.x * (o + DIM.EXT_OVER), y: P2.y + n.y * (o + DIM.EXT_OVER) }\n    ]) : [];\n    const inside = len >= 2 * DIM.HEAD_L + 6;\n    const head = (tip, dir) => {\n      const bx2 = tip.x - ux * DIM.HEAD_L * dir, by = tip.y - uy * DIM.HEAD_L * dir;\n      return [tip, { x: bx2 - uy * DIM.HEAD_W, y: by + ux * DIM.HEAD_W }, { x: bx2 + uy * DIM.HEAD_W, y: by - ux * DIM.HEAD_W }];\n    };\n    const heads = inside ? [head(d0, -1), head(d1, 1)] : [head(d0, 1), head(d1, -1)];\n    const deg = readableDeg(dx, dy);\n    const off2 = DIM.TEXT_OFF + th / 2;\n    const tx = d0.x + dx * t + n.x * off2, ty = d0.y + dy * t + n.y * off2;\n    return { d0, d1, ext, heads, inside, len, u: { x: ux, y: uy }, n, text: { x: tx, y: ty, deg } };\n  }\n  function dimSvg(g2, cls) {\n    const c = cls ? \" \" + cls : \"\";\n    let s = \"\";\n    for (const [a, b] of g2.ext) s += '<line class=\"ub-dim__ext' + c + '\" x1=\"' + R2(a.x) + '\" y1=\"' + R2(a.y) + '\" x2=\"' + R2(b.x) + '\" y2=\"' + R2(b.y) + '\"></line>';\n    s += '<line class=\"ub-dim__line' + c + '\" x1=\"' + R2(g2.d0.x) + '\" y1=\"' + R2(g2.d0.y) + '\" x2=\"' + R2(g2.d1.x) + '\" y2=\"' + R2(g2.d1.y) + '\"></line>';\n    if (!g2.inside) for (const [p, s2] of [[g2.d0, -1], [g2.d1, 1]]) {\n      const q = { x: p.x + g2.u.x * s2 * (DIM.HEAD_L + 4), y: p.y + g2.u.y * s2 * (DIM.HEAD_L + 4) };\n      s += '<line class=\"ub-dim__line' + c + '\" x1=\"' + R2(p.x) + '\" y1=\"' + R2(p.y) + '\" x2=\"' + R2(q.x) + '\" y2=\"' + R2(q.y) + '\"></line>';\n    }\n    for (const h of g2.heads) s += '<path class=\"ub-dim__head' + c + '\" d=\"M' + R2(h[0].x) + \" \" + R2(h[0].y) + \"L\" + R2(h[1].x) + \" \" + R2(h[1].y) + \"L\" + R2(h[2].x) + \" \" + R2(h[2].y) + 'Z\"></path>';\n    return s;\n  }\n  function turnedBox(x, y, w, h, deg) {\n    const a = deg * Math.PI / 180, c = Math.abs(Math.cos(a)), s = Math.abs(Math.sin(a));\n    const W2 = w * c + h * s, H2 = w * s + h * c;\n    return { x0: x - W2 / 2, y0: y - H2 / 2, x1: x + W2 / 2, y1: y + H2 / 2 };\n  }\n  function textW(txt, font) {\n    return Math.ceil(String(txt).length * font * 0.62) + 2;\n  }\n\n  // v2/src/ui/bottom-tray.js\n  var TRAY_SEL = \".ub-lab__flyout--strip, .ub-lab__flyout--tray, .ub-lab__kmatpop\";\n  function placeBottom(root, el) {\n    if (!root || !el || el.hidden || !el.getBoundingClientRect || !el.offsetParent) return;\n    const host = el.offsetParent, hr = host.getBoundingClientRect();\n    if (!hr.width) return;\n    el.style.left = \"\";\n    el.style.right = \"\";\n    const sr = el.getBoundingClientRect();\n    let left = Math.round(sr.left - hr.left), right = Math.round(hr.right - sr.right);\n    const top = sr.top - 8;\n    const L = root.querySelector(\".ub-lab__dock--left\"), R4 = root.querySelector(\".ub-lab__dock--right\");\n    const reach = (d) => {\n      if (!d || !d.getBoundingClientRect) return null;\n      const r = d.getBoundingClientRect();\n      return r.width && r.bottom > top ? r : null;\n    };\n    const phone = hr.width <= 640 && !el.classList.contains(\"ub-lab__flyout--strip\");\n    const lr = phone ? null : reach(L), rr = phone ? null : reach(R4);\n    if (lr) left = Math.max(left, Math.round(lr.right - hr.left + 8));\n    if (rr) right = Math.max(right, Math.round(hr.right - rr.left + 8));\n    if (hr.width - left - right < 220) {\n      left = Math.min(left, 8);\n      right = Math.min(right, 8);\n    }\n    el.classList.toggle(\"is-over-docks\", phone);\n    el.style.left = left + \"px\";\n    el.style.right = right + \"px\";\n    el.style.top = \"\";\n  }\n  function placeAll(root) {\n    if (!root || !root.querySelectorAll) return;\n    for (const el of root.querySelectorAll(TRAY_SEL)) if (!el.hidden) placeBottom(root, el);\n  }\n  function sideways(el, e) {\n    let n = e.target;\n    const d = Math.abs(e.deltaY) > Math.abs(e.deltaX) ? e.deltaY : e.deltaX;\n    if (!d) return false;\n    while (n && n !== el.parentNode) {\n      if (n.scrollWidth > n.clientWidth + 1) {\n        const cs = n.ownerDocument && n.ownerDocument.defaultView ? n.ownerDocument.defaultView.getComputedStyle(n) : null;\n        if (!cs || /auto|scroll/.test(cs.overflowX)) {\n          const max = n.scrollWidth - n.clientWidth;\n          if (!(d < 0 && n.scrollLeft <= 0 || d > 0 && n.scrollLeft >= max - 1)) {\n            n.scrollLeft = Math.max(0, Math.min(max, n.scrollLeft + d));\n            return true;\n          }\n        }\n      }\n      if (n === el) break;\n      n = n.parentNode;\n    }\n    return false;\n  }\n  function wireTrays(root, win2) {\n    if (!root || !root.querySelectorAll) return;\n    for (const el of root.querySelectorAll(TRAY_SEL)) {\n      if (el.__ubTray || el.getAttribute(\"data-ub-flyout\") === \"room\") continue;\n      el.__ubTray = true;\n      el.addEventListener(\"wheel\", (e) => {\n        if (e.stopPropagation) e.stopPropagation();\n        if (sideways(el, e) && e.preventDefault) e.preventDefault();\n      }, { passive: false });\n    }\n    if (win2 && win2.addEventListener && !root.__ubTrayResize) {\n      root.__ubTrayResize = true;\n      win2.addEventListener(\"resize\", () => placeAll(root));\n    }\n  }\n\n  // v2/src/interact/corner-shelf-stand-qa.js\n  function installCornerShelfStandQa(ia, env2) {\n    const root = env2.root, canvas = env2.canvas, doc2 = root && root.ownerDocument || env2.doc;\n    const win2 = doc2 && doc2.defaultView, loc = win2 && win2.location || {};\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\"))) return null;\n    const m = /[?&]qa_corner=(base|wall)\\b/.exec(String(loc.search || \"\"));\n    if (!m || !win2.setTimeout || !canvas) return null;\n    const step = (/[?&]qa_step=(edit|armA|armB|typed)\\b/.exec(String(loc.search || \"\")) || [0, \"edit\"])[1];\n    const doors = (/[?&]qa_doors=(open|shut|none)\\b/.exec(String(loc.search || \"\")) || [0, \"open\"])[1];\n    const ORDER = [\"edit\", \"armA\", \"armB\", \"typed\"], upto = (s) => ORDER.indexOf(step) >= ORDER.indexOf(s);\n    const ctx = ia.ctx, scene = ia.scene, out = [];\n    const box3 = doc2.createElement(\"pre\");\n    box3.setAttribute(\"data-ub-qacorner\", \"\");\n    box3.style.cssText = \"position:fixed;left:0;right:0;bottom:0;z-index:99999;margin:0;padding:6px 8px;max-height:30vh;overflow:auto;background:rgba(20,20,20,.86);color:#9ef59e;font:11px/1.35 monospace;white-space:pre-wrap\";\n    const say = () => {\n      box3.textContent = \"qa_corner \" + m[1] + \" \" + step + \" (doors \" + doors + \")\\n\" + out.join(\"\\n\");\n    };\n    const render = () => {\n      try {\n        const R4 = root.__ubProj && root.__ubProj.__v2 && root.__ubProj.__v2.renderer && root.__ubProj.__v2.renderer();\n        if (R4 && R4.renderNow) R4.renderNow();\n      } catch {\n      }\n    };\n    let u = null;\n    const state2 = () => {\n      const s = shelfListOf(u)[0], E = s ? shelfEdgesOf(u, s) : null;\n      const nums = Array.prototype.slice.call(root.querySelectorAll(\"[data-ub-idim]\")).filter((n) => n.style.display !== \"none\" && n.getBoundingClientRect().width > 0).map((n) => n.getAttribute(\"data-ub-idim\") + \" \" + n.textContent);\n      return \"editing \" + (ia.inside.editing() ? \"TRUE\" : \"false\") + \" | selected \" + (scene.selPart || \"none\") + (E ? \" | shelf \" + s.y + \" mm up; arm A \" + E.depthA + \" deep, \" + E.sbA + \" back; arm B \" + E.depthB + \" deep, \" + E.sbB + \" back\" : \"\") + \" | numbers \" + (nums.join(\", \") || \"none\") + \" | Undo steps \" + ia.hist.depth().past + \" | doors \" + (u.door ? u.doorOpen ? \"open\" : \"shut\" : \"none\");\n    };\n    const scr = (lp) => {\n      const n = ctx.worldToNdc(localToWorld(u, lp));\n      const r = canvas.getBoundingClientRect();\n      return n ? { x: r.left + (n[0] + 1) / 2 * r.width, y: r.top + (1 - n[1]) / 2 * r.height } : null;\n    };\n    const isShelf = (p) => {\n      if (!p || doc2.elementFromPoint(p.x, p.y) !== canvas) return false;\n      const h = ctx.parts.realPartAt(p.x, p.y);\n      return !!(h && h.u === u && h.part.kind === \"shelf\");\n    };\n    const pts = () => {\n      const [A, B] = cornerShelfBoards(u, shelfListOf(u)[0]), xa = A.x1 - Math.min(140, (A.x1 - A.x0) * 0.4), zb = A.z1 + Math.min(140, (B.z1 - A.z1) * 0.4);\n      return { onA: scr([xa, A.y1, A.z1 - 60]), edgeA: scr([xa, A.y1, A.z1 - 3]), toA: scr([xa, A.y1, A.z1 - 83]), edgeB: scr([B.x0 + 3, B.y1, zb]), toB: scr([B.x0 + 83, B.y1, zb]) };\n    };\n    const look = () => {\n      for (const zoom of [0.3, 0.4, 0.5]) for (const pitch of [0.5, 0.75, 0.35]) for (let k = 0; k < 48; k++) {\n        scene.zoom = zoom;\n        if (root.__ubProj && root.__ubProj.setCam) root.__ubProj.setCam(-Math.PI + k * Math.PI / 24, pitch);\n        ctx.frame();\n        const p = pts(), [A] = cornerShelfBoards(u, shelfListOf(u)[0]), up = scr([A.x1 - Math.min(140, (A.x1 - A.x0) * 0.4), A.y1 + 100, A.z1 - 3]);\n        const dir = (a, b) => {\n          const L = Math.hypot(b.x - a.x, b.y - a.y) || 1;\n          return [(b.x - a.x) / L, (b.y - a.y) / L, L];\n        };\n        const dU = dir(p.edgeA, up), dA = dir(p.edgeA, p.toA), dB = dir(p.edgeB, p.toB);\n        const apart = (m2, n) => Math.abs(m2[0] * n[1] - m2[1] * n[0]) > 0.5;\n        if (dA[2] > 18 && dB[2] > 18 && apart(dU, dA) && apart(dU, dB) && isShelf(p.onA) && isShelf(p.edgeA) && isShelf(p.edgeB)) return true;\n      }\n      return false;\n    };\n    const evs = (x, y, n) => {\n      const el = doc2.elementFromPoint(x, y) || canvas, o = { clientX: x, clientY: y, bubbles: true, cancelable: true, view: win2, button: 0 };\n      for (let k = 1; k <= n; k++) {\n        el.dispatchEvent(new win2.MouseEvent(\"mousedown\", { ...o, buttons: 1, detail: k }));\n        el.dispatchEvent(new win2.MouseEvent(\"mouseup\", { ...o, buttons: 0, detail: k }));\n        el.dispatchEvent(new win2.MouseEvent(\"click\", { ...o, buttons: 0, detail: k }));\n      }\n      if (n === 2) el.dispatchEvent(new win2.MouseEvent(\"dblclick\", { ...o, buttons: 0, detail: 2 }));\n    };\n    const drag = (a, b) => {\n      const o = { bubbles: true, cancelable: true, view: win2, button: 0 };\n      canvas.dispatchEvent(new win2.MouseEvent(\"mousemove\", { ...o, clientX: a.x, clientY: a.y }));\n      canvas.dispatchEvent(new win2.MouseEvent(\"mousedown\", { ...o, clientX: a.x, clientY: a.y, buttons: 1, detail: 1 }));\n      for (let i = 1; i <= 10; i++) win2.dispatchEvent(new win2.MouseEvent(\"mousemove\", { ...o, clientX: a.x + (b.x - a.x) * i / 10, clientY: a.y + (b.y - a.y) * i / 10, buttons: 1 }));\n      win2.dispatchEvent(new win2.MouseEvent(\"mouseup\", { ...o, clientX: b.x, clientY: b.y, buttons: 0 }));\n    };\n    win2.setTimeout(() => {\n      try {\n        const P2 = root.__ubProj, sc = P2.sceneRef();\n        const keep = sc.units.slice().sort((p, q) => p.x - q.x)[0];\n        u = keep;\n        u.type = m[1] === \"wall\" ? \"corner-wall\" : \"corner-l\";\n        u.family = m[1] === \"wall\" ? \"wall\" : \"corner\";\n        u.w = m[1] === \"wall\" ? 1e3 : 1200;\n        u.w2 = m[1] === \"wall\" ? 1e3 : 1200;\n        u.d = m[1] === \"wall\" ? 330 : 600;\n        u.h = 720;\n        u.rot = 0;\n        u.x = 1500;\n        u.z = 1300;\n        u.y = m[1] === \"wall\" ? WALL.mountY : 0;\n        u.door = doors !== \"none\";\n        u.doorOpen = doors === \"open\";\n        delete u.cornerShelves;\n        delete u.interior;\n        sc.units.length = 0;\n        sc.units.push(u);\n        sc.selectedId = u.id;\n        ia.setMode(\"rotate\");\n        const R0 = P2.__v2.renderer && P2.__v2.renderer();\n        if (R0 && R0.focusOn) R0.focusOn(u.id);\n        win2.scrollTo(0, canvas.getBoundingClientRect().top + win2.scrollY - 8);\n        P2.render();\n        const seen = doors === \"shut\" ? true : look();\n        render();\n        out.push(\"FIXTURE: one \" + (m[1] === \"wall\" ? \"L-shaped corner WALL\" : \"L-shaped corner BASE\") + \" \" + u.w + \" + \" + u.w2 + \" x \" + u.d + \" deep, doors \" + doors + \"; both arms in sight: \" + seen);\n        out.push(\"before: \" + state2());\n        doc2.body.appendChild(box3);\n        say();\n        const steps = [];\n        steps.push(() => {\n          const p = pts();\n          evs(p.onA.x, p.onA.y, 2);\n          out.push(\"edit: double-click on the shelf -> \" + state2());\n        });\n        if (upto(\"armA\")) steps.push(() => {\n          const p = pts();\n          drag(p.edgeA, p.toA);\n          out.push(\"armA: arm A's front edge carried 80 mm back -> \" + state2());\n        });\n        if (upto(\"armB\")) steps.push(() => {\n          look();\n          const p = pts();\n          drag(p.edgeB, p.toB);\n          out.push(\"armB: arm B's front edge carried 80 mm back -> \" + state2());\n        });\n        if (upto(\"typed\")) steps.push(() => {\n          const r = ia.commands.run(\"setPartGap\", { which: \"depthB\", mm: m[1] === \"wall\" ? \"200\" : \"300\" });\n          out.push(\"typed: arm B depth \" + (m[1] === \"wall\" ? 200 : 300) + \" -> \" + (r && r.ok ? \"\" : \"REFUSED \" + (r && r.why) + \" \") + state2());\n        });\n        steps.forEach((fn, i) => win2.setTimeout(() => {\n          try {\n            fn();\n          } catch (e) {\n            out.push(\"err \" + (e && e.message));\n          }\n          P2.render();\n          render();\n          say();\n        }, 700 * (i + 1)));\n      } catch (e) {\n        out.push(\"err \" + (e && e.message));\n        doc2.body.appendChild(box3);\n        say();\n      }\n    }, 2600);\n    return { step };\n  }\n\n  // v2/src/interact/free-spot.js\n  function nearestFreeSpot(want, w, h, area, obs, pad, step) {\n    pad = pad == null ? 3 : pad;\n    step = step || 4;\n    const xMin = area.x0, xMax = area.x1 - w, yMin = area.y0, yMax = area.y1 - h;\n    if (xMax < xMin || yMax < yMin) return null;\n    const clampX = Math.min(Math.max(want.x, xMin), xMax), clampY = Math.min(Math.max(want.y, yMin), yMax);\n    const rows = [clampY];\n    for (let y = yMin; y <= yMax + 1e-3; y += step) rows.push(y);\n    let best = null, bestD = Infinity;\n    for (const y of rows) {\n      const dy = Math.abs(y - want.y);\n      if (dy >= bestD) continue;\n      const bans = [];\n      for (const r of obs) if (r.y0 - pad < y + h && r.y1 + pad > y) bans.push([r.x0 - pad - w, r.x1 + pad]);\n      bans.sort((a, b) => a[0] - b[0]);\n      let at = xMin;\n      const free = [];\n      for (const [a, b] of bans) {\n        if (a > at) free.push([at, Math.min(a, xMax)]);\n        at = Math.max(at, b);\n        if (at > xMax) break;\n      }\n      if (at <= xMax) free.push([at, xMax]);\n      for (const [a, b] of free) {\n        if (b < a) continue;\n        const x = Math.min(Math.max(clampX, a), b), d = Math.hypot(x - want.x, dy);\n        if (d < bestD) {\n          bestD = d;\n          best = { x, y };\n        }\n      }\n    }\n    return best;\n  }\n\n  // v2/src/interact/inside-dom.js\n  var NS = \"http://www.w3.org/2000/svg\";\n  function createInsideDom(ia, env2) {\n    const root = env2.root, canvas = env2.canvas;\n    const scene = ia.scene, ctx = ia.ctx, st = ctx.st;\n    const q = (s) => root.querySelector ? root.querySelector(s) : null;\n    const qa = (s) => root.querySelectorAll ? Array.prototype.slice.call(root.querySelectorAll(s)) : [];\n    const doc2 = root.ownerDocument || env2.doc;\n    const layer2 = q(\"[data-ub-idims]\"), svg2 = q(\"[data-ub-idimlines]\");\n    const bar = q(\"[data-ub-itoolbar]\"), barText = q(\"[data-ub-itooltext]\");\n    const btns = qa(\"[data-ub-itool]\");\n    const labels = {};\n    let editing = null;\n    let barKey = \"\";\n    let lastTool = null;\n    let lastCursor = null;\n    function run(tool) {\n      const r = ia.commands.run(\"insideTool\", { tool: tool === \"off\" ? null : tool });\n      draw();\n      return r;\n    }\n    root.__ubInsideEntry = function() {\n      const t = ia.inside && ia.inside.tool();\n      return run(t && t !== \"edit\" ? \"off\" : \"select\");\n    };\n    const dockBtn = q('[data-ub-fly=\"inside\"]');\n    const removeBtn = q(\"[data-ub-itoolremove]\");\n    if (removeBtn) removeBtn.addEventListener(\"click\", () => {\n      const r = ia.commands.run(\"removeSelectedShelf\");\n      if (!r || !r.ok) ia.commands.run(\"removeSelectedDivider\");\n      draw();\n    });\n    btns.forEach((b) => {\n      b.addEventListener(\"click\", () => {\n        let t = b.getAttribute(\"data-ub-itool\");\n        if ((t === \"shelf\" || t === \"divider\" || t === \"hdivider\") && ia.inside && ia.inside.tool() === t) {\n          t = \"select\";\n          ia.scene.selPart = null;\n          ia.scene.hoverPart = null;\n        }\n        const fly = b.closest ? b.closest(\"[data-ub-flyout]\") : null;\n        if (fly && t !== \"off\") {\n          const c = fly.querySelector(\"[data-ub-flyclose]\");\n          if (c) c.click();\n        }\n        run(t);\n        if (canvas && canvas.focus && t !== \"off\") {\n          try {\n            canvas.focus({ preventScroll: true });\n          } catch {\n          }\n        }\n      });\n    });\n    function origin() {\n      if (!layer2 || !layer2.getBoundingClientRect || !canvas || !canvas.getBoundingClientRect) return { dx: 0, dy: 0 };\n      const cr = canvas.getBoundingClientRect(), lr = layer2.getBoundingClientRect();\n      return { dx: cr.left - lr.left, dy: cr.top - lr.top };\n    }\n    function originIn(box3) {\n      if (!box3 || !box3.getBoundingClientRect || !canvas || !canvas.getBoundingClientRect) return { dx: 0, dy: 0 };\n      const cr = canvas.getBoundingClientRect(), br = box3.getBoundingClientRect();\n      return { dx: cr.left - br.left - (box3.clientLeft || 0), dy: cr.top - br.top - (box3.clientTop || 0) };\n    }\n    function el(tag, cls) {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      return e;\n    }\n    function line(x1, y1, x2, y2, cls) {\n      const l = doc2.createElementNS(NS, \"line\");\n      l.setAttribute(\"x1\", x1.toFixed(1));\n      l.setAttribute(\"y1\", y1.toFixed(1));\n      l.setAttribute(\"x2\", x2.toFixed(1));\n      l.setAttribute(\"y2\", y2.toFixed(1));\n      l.setAttribute(\"class\", cls);\n      svg2.appendChild(l);\n    }\n    const WORD = {\n      depth: \"Shelf depth\",\n      setback: \"Front setback\",\n      /* an L corner's shelf: each arm its own (task 1791215235157) */\n      depthA: \"Arm A shelf depth\",\n      setbackA: \"Arm A front setback\",\n      depthB: \"Arm B shelf depth\",\n      setbackB: \"Arm B front setback\"\n    };\n    const what = (which) => WORD[which] || \"Clear gap \" + which;\n    function startEdit(which, node, value) {\n      if (editing) return;\n      const inp = el(\"input\", \"ub-lab__idiminput\");\n      inp.type = \"number\";\n      inp.min = \"0\";\n      inp.step = \"1\";\n      inp.value = String(value);\n      inp.setAttribute(\"aria-label\", what(which) + \", mm\");\n      inp.style.left = node.style.left;\n      inp.style.top = node.style.top;\n      inp.setAttribute(\"title\", \"Type the \" + what(which).toLowerCase() + \" in mm, Enter to set, Esc to cancel\");\n      layer2.appendChild(inp);\n      node.style.display = \"none\";\n      editing = { which, input: inp };\n      const stop = (commit) => {\n        if (!editing || editing.input !== inp) return;\n        const raw = inp.value;\n        editing = null;\n        if (inp.parentNode) inp.parentNode.removeChild(inp);\n        if (commit) ia.commands.run(\"setPartGap\", { which, mm: raw });\n        draw();\n      };\n      inp.addEventListener(\"keydown\", (e) => {\n        if (e.key === \"Enter\") {\n          e.preventDefault();\n          stop(true);\n        } else if (e.key === \"Escape\") {\n          e.preventDefault();\n          e.stopPropagation();\n          stop(false);\n        }\n      });\n      inp.addEventListener(\"blur\", () => stop(false));\n      try {\n        inp.focus();\n        inp.select();\n      } catch {\n      }\n    }\n    function label(d, x, y, deg) {\n      let n = labels[d.which];\n      const tag = d.edit ? \"button\" : \"span\";\n      if (!n || n.tagName.toLowerCase() !== tag) {\n        if (n && n.parentNode) n.parentNode.removeChild(n);\n        n = el(tag, \"ub-lab__idim\");\n        n.setAttribute(\"data-ub-idim\", d.which);\n        if (tag === \"button\") {\n          n.type = \"button\";\n          n.addEventListener(\"mousedown\", (e) => {\n            e.stopPropagation();\n          });\n          n.addEventListener(\"click\", (e) => {\n            e.stopPropagation();\n            startEdit(n.getAttribute(\"data-ub-idim\"), n, n.getAttribute(\"data-ub-mm\"));\n          });\n        }\n        layer2.appendChild(n);\n        labels[d.which] = n;\n      }\n      const mm = Math.max(0, Math.round(d.mm));\n      n.textContent = String(mm);\n      n.setAttribute(\"data-ub-mm\", String(mm));\n      if (d.edit) {\n        n.setAttribute(\"title\", what(d.which) + \" - click to type it\");\n        n.setAttribute(\"aria-label\", what(d.which) + \" \" + mm + \" mm, click to type\");\n      }\n      n.classList.toggle(\"is-ghost\", !!d.ghost);\n      n.classList.toggle(\"is-bad\", !!d.ghost && !d.ok);\n      n.style.left = x.toFixed(1) + \"px\";\n      n.style.top = y.toFixed(1) + \"px\";\n      n.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(deg || 0) + \"deg)\";\n      n.style.display = editing && editing.which === d.which ? \"none\" : \"\";\n    }\n    function boxOf3(n) {\n      const w0 = n.offsetWidth || 0, h0 = n.offsetHeight || 0, x = parseFloat(n.style.left), y = parseFloat(n.style.top);\n      const m = /rotate\\((-?[\\d.]+)deg\\)/.exec(n.style.transform || \"\"), t = m ? Number(m[1]) * Math.PI / 180 : 0;\n      const c = Math.abs(Math.cos(t)), sn = Math.abs(Math.sin(t)), w = w0 * c + h0 * sn, h = w0 * sn + h0 * c;\n      return { x0: x - w / 2, x1: x + w / 2, y0: y - h / 2, y1: y + h / 2, w, h };\n    }\n    const hit2 = (p, q2, pad) => p.x0 < q2.x1 + pad && q2.x0 < p.x1 + pad && p.y0 < q2.y1 + pad && q2.y0 < p.y1 + pad;\n    function moveTo(n, x, y) {\n      n.style.left = x.toFixed(1) + \"px\";\n      n.style.top = y.toFixed(1) + \"px\";\n    }\n    const PADHIT = 14;\n    function onGrip(b, segs) {\n      for (const g2 of segs || []) {\n        const n = Math.max(2, Math.ceil(Math.hypot(g2[1].x - g2[0].x, g2[1].y - g2[0].y) / 4));\n        for (let i = 0; i <= n; i++) {\n          const x = g2[0].x + (g2[1].x - g2[0].x) * i / n, y = g2[0].y + (g2[1].y - g2[0].y) * i / n;\n          if (x > b.x0 - PADHIT && x < b.x1 + PADHIT && y > b.y0 - PADHIT && y < b.y1 + PADHIT) return true;\n        }\n      }\n      return false;\n    }\n    function settle(placed, o, cs, segs) {\n      const done2 = [];\n      if (bar && !bar.hasAttribute(\"hidden\") && bar.getBoundingClientRect && layer2.getBoundingClientRect) {\n        const br = bar.getBoundingClientRect(), lr = layer2.getBoundingClientRect();\n        if (br.width) done2.push({ x0: br.left - lr.left, x1: br.right - lr.left, y0: br.top - lr.top, y1: br.bottom - lr.top, w: br.width, h: br.height });\n      }\n      for (const P2 of placed) {\n        const n = P2.n;\n        if (n.style.display === \"none\") continue;\n        let b = boxOf3(n);\n        if (!b.w) continue;\n        let side = 0;\n        for (let i = 0; i < 3; i++) {\n          moveTo(n, P2.mx + P2.nx * side, P2.my + P2.ny * side);\n          b = boxOf3(n);\n          if (!done2.some((q2) => hit2(b, q2, 2))) break;\n          side += Math.abs(P2.nx) * b.w + Math.abs(P2.ny) * b.h + 3;\n        }\n        let x = Math.min(Math.max(parseFloat(n.style.left), o.dx + b.w / 2 + 3), o.dx + cs.w - b.w / 2 - 3);\n        let y = Math.min(Math.max(parseFloat(n.style.top), o.dy + b.h / 2 + 3), o.dy + cs.h - b.h / 2 - 3);\n        moveTo(n, x, y);\n        if (done2.some((q2) => hit2(boxOf3(n), q2, 2))) {\n          const nx0 = P2.nx || 0, ny0 = P2.nx || P2.ny ? P2.ny : 1, tx = -ny0, ty = nx0, x0 = x, y0 = y;\n          const fits2 = (px, py) => px >= o.dx + b.w / 2 + 3 && px <= o.dx + cs.w - b.w / 2 - 3 && py >= o.dy + b.h / 2 + 3 && py <= o.dy + cs.h - b.h / 2 - 3;\n          let found = false;\n          for (let k = 1; k <= 12 && !found; k++) for (const [ax, ay] of [[nx0, ny0], [-nx0, -ny0], [tx, ty], [-tx, -ty]]) {\n            const px = x0 + ax * 8 * k, py = y0 + ay * 8 * k;\n            if (!fits2(px, py)) continue;\n            moveTo(n, px, py);\n            if (!done2.some((q2) => hit2(boxOf3(n), q2, 2))) {\n              found = true;\n              x = px;\n              y = py;\n              break;\n            }\n          }\n          if (!found) moveTo(n, x0, y0);\n        }\n        if (segs && segs.length && onGrip(boxOf3(n), segs)) {\n          const x0 = x, y0 = y;\n          let found = false;\n          for (let k = 1; k <= 10 && !found; k++) for (const sg of [1, -1]) {\n            const nx = P2.nx || 0, ny = P2.nx || P2.ny ? P2.ny : 1;\n            moveTo(n, x0 + nx * sg * k * 9, y0 + ny * sg * k * 9);\n            const bb = boxOf3(n);\n            if (!onGrip(bb, segs) && !done2.some((q2) => hit2(bb, q2, 2))) {\n              found = true;\n              break;\n            }\n          }\n          if (!found) moveTo(n, x0, y0);\n        }\n        if (doc2.elementFromPoint && n.getBoundingClientRect) {\n          const cx = o.dx + cs.w / 2, cy = o.dy + cs.h / 2;\n          const covered = () => {\n            const r = n.getBoundingClientRect(), top = doc2.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2);\n            return !!top && top !== n && !n.contains(top) && !(layer2 && layer2.contains(top)) && !(top.closest && (top.closest(\"[data-ub-idim]\") || top.closest(\"[data-ub-idivbar]\")));\n          };\n          if (covered()) {\n            const x0 = parseFloat(n.style.left), y0 = parseFloat(n.style.top), L = Math.hypot(cx - x0, cy - y0) || 1;\n            let found = false;\n            for (let k = 1; k <= 20 && !found; k++) {\n              moveTo(n, x0 + (cx - x0) / L * 12 * k, y0 + (cy - y0) / L * 12 * k);\n              found = !covered() && !(segs && segs.length && onGrip(boxOf3(n), segs)) && !done2.some((q2) => hit2(boxOf3(n), q2, 2));\n            }\n            if (!found) moveTo(n, x0, y0);\n          }\n        }\n        done2.push(boxOf3(n));\n      }\n    }\n    function drawDims() {\n      if (!layer2 || !svg2) return;\n      const ds = ia.inside && scene.partsMode ? ia.inside.dims() : [];\n      const live = {};\n      while (svg2.firstChild) svg2.removeChild(svg2.firstChild);\n      if (!ds.length) {\n        layer2.setAttribute(\"hidden\", \"\");\n        for (const k of Object.keys(labels)) labels[k].style.display = \"none\";\n        return;\n      }\n      layer2.removeAttribute(\"hidden\");\n      const o = origin();\n      const cs = ctx.canvasSize();\n      svg2.setAttribute(\"width\", String(cs.w));\n      svg2.setAttribute(\"height\", String(cs.h));\n      svg2.style.left = o.dx + \"px\";\n      svg2.style.top = o.dy + \"px\";\n      const placed = [];\n      for (const d of ds) {\n        const a = clientOfWorld(ctx, d.a), b = clientOfWorld(ctx, d.b);\n        if (!a || !b) continue;\n        const cls = \"ub-lab__idimline\" + (d.ghost ? \" is-ghost\" : \"\") + (d.ghost && !d.ok ? \" is-bad\" : \"\");\n        if (d.flush || (d.axis === \"z\" || d.depthLike) && Math.hypot(b.x - a.x, b.y - a.y) < 14) {\n          label(d, o.dx + a.x, o.dy + a.y + 12, 0);\n          placed.push({ n: labels[d.which], L: 1, ux: 1, uy: 0, nx: 0, ny: 1, mx: o.dx + a.x, my: o.dy + a.y + 12, deg: 0 });\n          live[d.which] = true;\n          continue;\n        }\n        line(a.x, a.y, b.x, b.y, cls);\n        const dx = b.x - a.x, dy = b.y - a.y, L = Math.hypot(dx, dy) || 1, nx = -dy / L * 5, ny = dx / L * 5;\n        line(a.x - nx, a.y - ny, a.x + nx, a.y + ny, cls);\n        line(b.x - nx, b.y - ny, b.x + nx, b.y + ny, cls);\n        let snx = -dy / L, sny = dx / L;\n        if (sny > 0 || sny === 0 && snx < 0) {\n          snx = -snx;\n          sny = -sny;\n        }\n        const g2 = dimGeom(a, b, { x: snx, y: sny }, 0, 0.5, 12);\n        for (const h of g2.heads) {\n          const pth = doc2.createElementNS(NS, \"path\");\n          pth.setAttribute(\"d\", \"M\" + h[0].x.toFixed(1) + \" \" + h[0].y.toFixed(1) + \"L\" + h[1].x.toFixed(1) + \" \" + h[1].y.toFixed(1) + \"L\" + h[2].x.toFixed(1) + \" \" + h[2].y.toFixed(1) + \"Z\");\n          pth.setAttribute(\"class\", \"ub-lab__idimhead\" + (d.ghost ? \" is-ghost\" : \"\") + (d.ghost && !d.ok ? \" is-bad\" : \"\"));\n          svg2.appendChild(pth);\n        }\n        const deg = readableDeg(dx, dy);\n        label(d, o.dx + g2.text.x, o.dy + g2.text.y, deg);\n        placed.push({ n: labels[d.which], L, ux: dx / L, uy: dy / L, nx: snx, ny: sny, mx: o.dx + g2.text.x, my: o.dy + g2.text.y, deg });\n        live[d.which] = true;\n      }\n      const segs = (ds.avoid || []).map((g2) => {\n        const a = clientOfWorld(ctx, g2[0]), b = clientOfWorld(ctx, g2[1]);\n        return a && b ? [{ x: o.dx + a.x, y: o.dy + a.y }, { x: o.dx + b.x, y: o.dy + b.y }] : null;\n      }).filter(Boolean);\n      settle(placed, o, cs, segs);\n      for (const k of Object.keys(labels)) if (!live[k]) labels[k].style.display = \"none\";\n    }\n    function keepDocksFree() {\n      if (!bar || bar.hidden || !bar.offsetParent || !bar.getBoundingClientRect) return;\n      const hr = bar.offsetParent.getBoundingClientRect(), br = bar.getBoundingClientRect();\n      if (!(hr.width <= 640)) return;\n      const reach = (sel) => {\n        const d = root.querySelector(sel);\n        if (!d || !d.getBoundingClientRect) return null;\n        const r = d.getBoundingClientRect();\n        return r.width && r.bottom > br.top + 1 && r.top < br.bottom ? r : null;\n      };\n      const L = reach(\".ub-lab__dock--left\"), R4 = reach(\".ub-lab__dock--right\");\n      if (L) bar.style.left = Math.round(L.right - hr.left + 6) + \"px\";\n      if (R4) bar.style.right = Math.round(hr.right - R4.left + 6) + \"px\";\n    }\n    function drawBar() {\n      const t0 = ia.inside ? ia.inside.tool() : null;\n      const t = t0 === \"edit\" ? null : t0;\n      btns.forEach((b) => {\n        const v = b.getAttribute(\"data-ub-itool\");\n        const on = v !== \"off\" && v === t;\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      });\n      if (dockBtn) {\n        dockBtn.setAttribute(\"aria-expanded\", t ? \"true\" : \"false\");\n        dockBtn.classList.toggle(\"is-active\", !!t);\n      }\n      if (removeBtn) {\n        const sel = !!(t && ia.inside && ia.inside.selectedInterior && ia.inside.selectedInterior());\n        if (sel) removeBtn.removeAttribute(\"hidden\");\n        else removeBtn.setAttribute(\"hidden\", \"\");\n      }\n      if (bar) {\n        if (t && !lastTool && root.__ubDocks && root.__ubDocks.state && root.__ubDocks.state().flyout) root.__ubDocks.show(null);\n        lastTool = t || null;\n        let trayOpen = false;\n        try {\n          trayOpen = !!root.querySelector(TRAY_SEL.split(\",\").map((q2) => q2.trim() + \":not([hidden])\").join(\",\"));\n        } catch {\n          trayOpen = false;\n        }\n        const on = !!t && !trayOpen;\n        if (on) bar.removeAttribute(\"hidden\");\n        else bar.setAttribute(\"hidden\", \"\");\n        const cs = ctx.canvasSize ? ctx.canvasSize() : { w: 0, h: 0 };\n        const key = on ? cs.w + \"x\" + cs.h : \"\";\n        if (on && key !== barKey) {\n          try {\n            placeBottom(root, bar);\n            keepDocksFree();\n          } catch {\n          }\n        }\n        barKey = key;\n      }\n      if (barText && t) {\n        const s = ia.inside.status(), tip = ia.inside.statusTip ? ia.inside.statusTip() : s;\n        if (barText.textContent !== s) barText.textContent = s;\n        if (barText.getAttribute(\"title\") !== tip) barText.setAttribute(\"title\", tip);\n        if (bar) bar.setAttribute(\"aria-description\", tip);\n      }\n    }\n    function drawCursor() {\n      if (!canvas || !canvas.style) return;\n      const t = ia.inside ? ia.inside.tool() : null;\n      let c = null;\n      if (t === \"shelf\" || t === \"divider\" || t === \"hdivider\") c = scene.placeGhost ? scene.placeGhost.ok ? \"copy\" : \"not-allowed\" : \"crosshair\";\n      else if (t === \"select\" || t === \"edit\") {\n        const h = scene.hoverPart ? String(scene.hoverPart) : \"\";\n        c = st.partDrag ? st.partDrag.mode === \"fixed-v\" ? \"ew-resize\" : st.partDrag.mode === \"shelf-depth\" ? \"move\" : \"ns-resize\" : st.shelfEdgeHover ? \"move\" : /:shelf:|:fixed-h:/.test(h) ? \"ns-resize\" : /:fixed-v:/.test(h) ? \"ew-resize\" : \"\";\n      }\n      if (c !== null) {\n        canvas.style.cursor = c;\n        lastCursor = c;\n      } else if (lastCursor !== null) {\n        canvas.style.cursor = \"\";\n        lastCursor = null;\n      }\n    }\n    let divBar = null;\n    function divBarEl() {\n      if (divBar || !root || !doc2) return divBar;\n      const host = layer2 && layer2.parentNode || root;\n      divBar = el(\"div\", \"ub-lab__idivbar\");\n      divBar.setAttribute(\"data-ub-idivbar\", \"\");\n      divBar.setAttribute(\"role\", \"group\");\n      divBar.hidden = true;\n      const bc = el(\"button\", \"ub-lab__idivbtn\");\n      bc.type = \"button\";\n      bc.setAttribute(\"data-ub-idivcentre\", \"\");\n      bc.textContent = \"Centre\";\n      const bs = el(\"button\", \"ub-lab__idivbtn\");\n      bs.type = \"button\";\n      bs.setAttribute(\"data-ub-idivsplit\", \"\");\n      bs.textContent = \"Split equally\";\n      const bd = el(\"button\", \"ub-lab__idivbtn ub-lab__idivbtn--icon\");\n      bd.type = \"button\";\n      bd.setAttribute(\"data-ub-ipartdup\", \"\");\n      bd.textContent = \"+\";\n      const bx2 = el(\"button\", \"ub-lab__idivbtn ub-lab__idivbtn--icon\");\n      bx2.type = \"button\";\n      bx2.setAttribute(\"data-ub-ipartdel\", \"\");\n      bx2.textContent = \"\\xD7\";\n      divBar.appendChild(bc);\n      divBar.appendChild(bs);\n      divBar.appendChild(bd);\n      divBar.appendChild(bx2);\n      for (const t of [\"mousedown\", \"pointerdown\", \"dblclick\"]) divBar.addEventListener(t, (e) => e.stopPropagation());\n      divBar.addEventListener(\"touchstart\", (e) => e.stopPropagation(), { passive: true });\n      divBar.addEventListener(\"click\", (e) => {\n        e.stopPropagation();\n        const b = e.target && e.target.closest ? e.target.closest(\"button\") : null;\n        const sel = ia.inside && ia.inside.selectedPart ? ia.inside.selectedPart() : null;\n        if (!b || !sel) return;\n        if (b.hasAttribute(\"data-ub-ipartdup\")) {\n          ia.commands.run(\"duplicateSelectedPart\", {});\n          draw();\n          return;\n        }\n        if (b.hasAttribute(\"data-ub-ipartdel\")) {\n          ia.commands.run(\"removeSelectedPart\", {});\n          draw();\n          return;\n        }\n        if (sel.kind !== \"divider\" && sel.kind !== \"hdivider\") return;\n        const axis = sel.kind === \"hdivider\" ? \"h\" : \"v\";\n        if (b.hasAttribute(\"data-ub-idivcentre\")) ia.commands.run(\"centreDivider\", { axis, idx: sel.idx });\n        else ia.commands.run(equalOn(sel.u, axis) ? \"equalSpacingOff\" : \"splitEqually\", { axis });\n        draw();\n      });\n      host.appendChild(divBar);\n      return divBar;\n    }\n    function drawDivBar() {\n      const sel = ia.inside && scene.partsMode && ia.inside.selectedPart ? ia.inside.selectedPart() : null;\n      const bar2 = divBarEl();\n      if (!bar2) return;\n      if (!sel || sel.kind !== \"divider\" && sel.kind !== \"hdivider\" && sel.kind !== \"shelf\" || scene.explode > 0) {\n        if (!bar2.hidden) bar2.hidden = true;\n        return;\n      }\n      const B = interiorBounds(sel.u);\n      if (!B) {\n        bar2.hidden = true;\n        return;\n      }\n      const shelf = sel.kind === \"shelf\", axis = sel.kind === \"hdivider\" ? \"h\" : \"v\";\n      const pl = shelf && sel.part && sel.part.local;\n      const lp = shelf ? pl ? [pl.x1, (pl.y0 + pl.y1) / 2, pl.z1] : null : axis === \"v\" ? [B.x0 + sel.x + T / 2, B.y1, B.z1] : [B.x1, B.y0 + sel.y + T / 2, B.z1];\n      if (!lp) {\n        bar2.hidden = true;\n        return;\n      }\n      const c = clientOfWorld(ctx, localToWorld(sel.u, lp));\n      if (!c) {\n        bar2.hidden = true;\n        return;\n      }\n      bar2.hidden = false;\n      const o = originIn(bar2.offsetParent || bar2.parentNode);\n      const word = shelf ? \"shelf\" : axis === \"h\" ? \"horizontal divider\" : \"divider\";\n      for (const [q2, t] of [[\"[data-ub-ipartdup]\", \"Duplicate \" + word], [\"[data-ub-ipartdel]\", \"Remove \" + word]]) {\n        const n = bar2.querySelector(q2);\n        if (n && n.getAttribute(\"aria-label\") !== t) {\n          n.setAttribute(\"aria-label\", t);\n          n.title = t;\n        }\n      }\n      for (const q2 of [\"[data-ub-idivcentre]\", \"[data-ub-idivsplit]\"]) {\n        const n = bar2.querySelector(q2);\n        if (n && n.hidden !== shelf) n.hidden = shelf;\n      }\n      const split = bar2.querySelector(\"[data-ub-idivsplit]\"), on = !shelf && equalOn(sel.u, axis);\n      split.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n      split.classList.toggle(\"is-on\", on);\n      split.title = on ? \"Equal spacing is on - press to place the dividers by hand again\" : \"Share every \" + (axis === \"v\" ? \"vertical\" : \"horizontal\") + \" divider out into equal clear openings, and keep them equal\";\n      bar2.querySelector(\"[data-ub-idivcentre]\").title = \"Put this divider in the middle between its neighbours\";\n      if (bar2.classList.contains(\"is-stack\")) bar2.classList.remove(\"is-stack\");\n      const bw = bar2.offsetWidth || 170, bh = bar2.offsetHeight || 28, cs = ctx.canvasSize();\n      const fit = (x, y) => [Math.min(Math.max(4, x), Math.max(4, cs.w - bw - 4)), Math.min(Math.max(4, y), Math.max(4, cs.h - bh - 4))];\n      const want = fit(axis === \"v\" && !shelf ? c.x - bw / 2 : c.x + 10, axis === \"v\" && !shelf ? c.y - bh - 10 : c.y - bh / 2);\n      const obs = barObstacles(bar2), hits = (p) => obs.some((r) => p[0] < r.x1 + 3 && p[0] + bw > r.x0 - 3 && p[1] < r.y1 + 3 && p[1] + bh > r.y0 - 3);\n      let at = want;\n      if (hits(want)) {\n        const area = visibleArea(cs);\n        const fr = [[B.x0, B.y0], [B.x1, B.y0], [B.x0, B.y1], [B.x1, B.y1]].map(([x, y]) => clientOfWorld(ctx, localToWorld(sel.u, [x, y, B.z1]))).filter(Boolean);\n        const opening = fr.length === 4 ? { x0: Math.min(...fr.map((q2) => q2.x)), y0: Math.min(...fr.map((q2) => q2.y)), x1: Math.max(...fr.map((q2) => q2.x)), y1: Math.max(...fr.map((q2) => q2.y)) } : null;\n        let p = null;\n        for (const ob of opening ? [obs.concat([opening]), obs] : [obs]) {\n          p = nearestFreeSpot({ x: want[0], y: want[1] }, bw, bh, area, ob, 3, 4);\n          if (!p) {\n            bar2.classList.add(\"is-stack\");\n            const sw = bar2.offsetWidth || bw, sh = bar2.offsetHeight || bh;\n            p = nearestFreeSpot({ x: axis === \"v\" && !shelf ? c.x - sw / 2 : c.x + 10, y: axis === \"v\" && !shelf ? c.y - sh - 10 : c.y - sh / 2 }, sw, sh, area, ob, 3, 4);\n            if (!p) bar2.classList.remove(\"is-stack\");\n          }\n          if (p) break;\n        }\n        if (p) at = [p.x, p.y];\n      }\n      bar2.style.left = (o.dx + at[0]).toFixed(1) + \"px\";\n      bar2.style.top = (o.dy + at[1]).toFixed(1) + \"px\";\n    }\n    function visibleArea(cs) {\n      const win2 = doc2 && doc2.defaultView, cr = canvas && canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n      const vw = win2 && win2.innerWidth ? win2.innerWidth : Infinity, vh = win2 && win2.innerHeight ? win2.innerHeight : Infinity;\n      const x0 = Math.max(4, cr ? -cr.left + 4 : 4), y0 = Math.max(4, cr ? -cr.top + 4 : 4);\n      const x1 = Math.min(cs.w - 4, cr ? vw - cr.left - 4 : cs.w - 4), y1 = Math.min(cs.h - 4, cr ? vh - cr.top - 4 : cs.h - 4);\n      return x1 > x0 && y1 > y0 ? { x0, y0, x1, y1 } : { x0: 4, y0: 4, x1: cs.w - 4, y1: cs.h - 4 };\n    }\n    const FIXED_SEL = \".ub-lab__tool, .ub-lab__toolgrp button, .ub-lab__dock button, .ub-chef button, [data-ub-fly], [data-ub-itoolbar]\";\n    const ANCHORED_SEL = \"button[data-ub-idim], .ub-lab__sizenum, .ub-lab__sizearrow, [data-ub-movearrow], .ub-lab__parrow, .ub-lab__qaddbtn\";\n    let obsAt = 0, obsList = [], obsKey = \"\";\n    function barObstacles(barEl) {\n      const now = Date.now();\n      if (!canvas || !canvas.getBoundingClientRect) return obsList;\n      const strip = q(\"[data-ub-itoolbar]\");\n      const cr = canvas.getBoundingClientRect(), key = [cr.left, cr.top, cr.width, cr.height].map(Math.round).join(\",\") + \"|\" + (strip && !strip.hidden ? 1 : 0);\n      const noHover = !!(doc2 && doc2.defaultView && doc2.defaultView.matchMedia && doc2.defaultView.matchMedia(\"(hover: none)\").matches);\n      const win2 = doc2 && doc2.defaultView;\n      const zoneOf = (e) => {\n        try {\n          const a = win2 && win2.getComputedStyle ? win2.getComputedStyle(e, \"::after\") : null;\n          if (!a || !a.content || a.content === \"none\" || a.position !== \"absolute\") return null;\n          const px = (v) => {\n            const n = parseFloat(v);\n            return isFinite(n) && n < 0 ? -n : 0;\n          };\n          return { l: px(a.left), r: px(a.right), t: px(a.top), b: px(a.bottom) };\n        } catch {\n          return null;\n        }\n      };\n      const rects = (sel, zone) => {\n        const out = [];\n        for (const e of qa(sel)) {\n          if (barEl.contains(e) || e.hidden || e.closest && e.closest(\"[hidden]\")) continue;\n          const r = e.getBoundingClientRect ? e.getBoundingClientRect() : null;\n          if (!r || !(r.width > 0) || !(r.height > 0)) continue;\n          if (r.right <= cr.left || r.left >= cr.right || r.bottom <= cr.top || r.top >= cr.bottom) continue;\n          const z = zone && zoneOf(e) || { l: 0, r: 0, t: 0, b: 0 };\n          out.push({ x0: r.left - z.l - cr.left, y0: r.top - z.t - cr.top, x1: r.right + z.r - cr.left, y1: r.bottom + z.b - cr.top });\n        }\n        return out;\n      };\n      if (!(now - obsAt < 300 && key === obsKey)) {\n        obsAt = now;\n        obsKey = key;\n        obsList = rects(FIXED_SEL, false);\n      }\n      return obsList.concat(rects(ANCHORED_SEL + (noHover ? \", .ub-lab__finbtn\" : \"\"), true));\n    }\n    function draw() {\n      try {\n        drawBar();\n        drawDims();\n        drawCursor();\n        drawDivBar();\n      } catch {\n      }\n    }\n    function frame2() {\n      const shown = layer2 && !layer2.hasAttribute(\"hidden\") || divBar && !divBar.hidden;\n      if (!scene.partsMode && !shown) return;\n      try {\n        drawDims();\n        drawDivBar();\n      } catch {\n      }\n    }\n    try {\n      installCornerShelfStandQa(ia, env2);\n    } catch {\n    }\n    return { draw, frame: frame2, labels: () => labels, editing: () => editing, divBar: () => divBar };\n  }\n\n  // v2/src/interact/measure-dom.js\n  var NS2 = \"http://www.w3.org/2000/svg\";\n  var MARK_R = 4;\n  var MARK_OUTLINE = 1;\n  var LABEL_GAP = 22;\n  function createMeasureDom(ia, env2) {\n    const root = env2.root, canvas = env2.canvas;\n    const ctx = ia.ctx;\n    const q = (s) => root.querySelector ? root.querySelector(s) : null;\n    const qa = (s) => root.querySelectorAll ? Array.prototype.slice.call(root.querySelectorAll(s)) : [];\n    const doc2 = root.ownerDocument || env2.doc;\n    const layer2 = q(\"[data-ub-mlayer]\"), svg2 = q(\"[data-ub-mlines]\");\n    const bar = q(\"[data-ub-mbar]\"), barText = q(\"[data-ub-mtext]\");\n    const btns = qa(\"[data-ub-measure]\");\n    let hoverLab = null, distLab = null, lastCursor = null;\n    btns.forEach((b) => b.addEventListener(\"click\", () => {\n      ia.commands.run(\"measureTool\", {});\n      draw();\n      if (canvas && canvas.focus && ctx.measure.on()) {\n        try {\n          canvas.focus({ preventScroll: true });\n        } catch {\n        }\n      }\n    }));\n    qa(\"[data-ub-mclear]\").forEach((b) => b.addEventListener(\"click\", () => {\n      ia.commands.run(\"measureClear\", {});\n      draw();\n    }));\n    qa(\"[data-ub-mdone]\").forEach((b) => b.addEventListener(\"click\", () => {\n      ia.commands.run(\"measureTool\", { on: false });\n      draw();\n    }));\n    function origin() {\n      if (!layer2 || !layer2.getBoundingClientRect || !canvas || !canvas.getBoundingClientRect) return { dx: 0, dy: 0 };\n      const cr = canvas.getBoundingClientRect(), lr = layer2.getBoundingClientRect();\n      return { dx: cr.left - lr.left, dy: cr.top - lr.top };\n    }\n    function node(tag, attrs, cls) {\n      const n = doc2.createElementNS(NS2, tag);\n      for (const k of Object.keys(attrs)) n.setAttribute(k, typeof attrs[k] === \"number\" ? attrs[k].toFixed(1) : attrs[k]);\n      if (cls) n.setAttribute(\"class\", cls);\n      svg2.appendChild(n);\n      return n;\n    }\n    function lab(existing, cls) {\n      if (existing) return existing;\n      const n = doc2.createElement(\"span\");\n      n.className = cls;\n      layer2.appendChild(n);\n      return n;\n    }\n    function place2(n, text, x, y) {\n      if (n.textContent !== text) n.textContent = text;\n      n.style.left = x.toFixed(1) + \"px\";\n      n.style.top = y.toFixed(1) + \"px\";\n      n.style.display = \"\";\n    }\n    function clampIn(n, o, cs, sidewaysOnly) {\n      const w = n.offsetWidth || 0, h = n.offsetHeight || 0;\n      if (!w || !h) return;\n      const x = parseFloat(n.style.left), y = parseFloat(n.style.top);\n      const cx = Math.min(Math.max(x, o.dx + w / 2 + 4), o.dx + cs.w - w / 2 - 4);\n      const cy = Math.min(Math.max(y, o.dy + h / 2 + 4), o.dy + cs.h - h / 2 - 4);\n      if (cx !== x) n.style.left = cx.toFixed(1) + \"px\";\n      if (cy !== y && !sidewaysOnly) n.style.top = cy.toFixed(1) + \"px\";\n    }\n    const shortKind = (label) => String(label || \"\").split(\" \\xB7 \")[0];\n    function drawLayer() {\n      if (!layer2 || !svg2) return;\n      const v = ctx.measure ? ctx.measure.view() : null;\n      while (svg2.firstChild) svg2.removeChild(svg2.firstChild);\n      if (!v) {\n        layer2.setAttribute(\"hidden\", \"\");\n        if (hoverLab) hoverLab.style.display = \"none\";\n        if (distLab) distLab.style.display = \"none\";\n        return;\n      }\n      layer2.removeAttribute(\"hidden\");\n      const o = origin(), cs = ctx.canvasSize();\n      svg2.setAttribute(\"width\", String(cs.w));\n      svg2.setAttribute(\"height\", String(cs.h));\n      svg2.style.left = o.dx + \"px\";\n      svg2.style.top = o.dy + \"px\";\n      let distShown = false, hoverShown = false;\n      if (v.line) {\n        const a = clientOfWorld(ctx, v.line.a), b = clientOfWorld(ctx, v.line.b);\n        if (a && b) {\n          node(\"line\", { x1: a.x, y1: a.y, x2: b.x, y2: b.y }, \"ub-lab__mline-halo\");\n          node(\"line\", { x1: a.x, y1: a.y, x2: b.x, y2: b.y }, \"ub-lab__mline\" + (v.line.live ? \" is-live\" : \"\"));\n          distLab = lab(distLab, \"ub-lab__mdist\");\n          distLab.setAttribute(\"data-ub-mdist\", \"\");\n          distLab.classList.toggle(\"is-live\", !!v.line.live);\n          distLab.setAttribute(\"title\", v.line.text);\n          distLab.setAttribute(\"aria-label\", v.line.text);\n          place2(distLab, v.line.short, 0, 0);\n          const ddx = b.x - a.x, ddy = b.y - a.y, L = Math.hypot(ddx, ddy) || 1;\n          let nx = -ddy / L, ny = ddx / L;\n          if (ny > 0 || ny === 0 && nx < 0) {\n            nx = -nx;\n            ny = -ny;\n          }\n          const bh = distLab.offsetHeight || 13;\n          const off = 3 + bh / 2;\n          place2(distLab, v.line.short, o.dx + (a.x + b.x) / 2 + nx * off, o.dy + (a.y + b.y) / 2 + ny * off);\n          distLab.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(readableDeg(ddx, ddy)) + \"deg)\";\n          clampIn(distLab, o, cs);\n          distShown = true;\n        }\n      }\n      v.pts.forEach((pt, i) => {\n        const c = clientOfWorld(ctx, pt.p);\n        if (!c) return;\n        const hot = v.overEnd === i || v.grab === i;\n        node(\"circle\", { cx: c.x, cy: c.y, r: MARK_R }, \"ub-lab__mend\" + (hot ? \" is-hot\" : \"\")).setAttribute(\"data-ub-mend\", String(i));\n      });\n      if (v.hover) {\n        const c = clientOfWorld(ctx, v.hover.p);\n        if (c) {\n          const face2 = /^on /.test(v.hover.kind);\n          node(\n            \"circle\",\n            { cx: c.x, cy: c.y, r: MARK_R },\n            \"ub-lab__msnap\" + (v.hover.hot ? \" is-corner\" : face2 ? \" is-face\" : \" is-edge\")\n          ).setAttribute(\"data-ub-msnap\", v.hover.kind);\n          hoverLab = lab(hoverLab, \"ub-lab__mlabel\");\n          hoverLab.setAttribute(\"title\", v.hover.label);\n          place2(hoverLab, shortKind(v.hover.label), o.dx + c.x, o.dy + c.y);\n          const lh = hoverLab.offsetHeight || 22, dotTop = MARK_R + MARK_OUTLINE / 2;\n          const above = c.y - dotTop - LABEL_GAP - lh / 2, below = c.y + dotTop + LABEL_GAP + lh / 2;\n          const ly = above - lh / 2 >= 4 || below + lh / 2 > cs.h - 4 ? above : below;\n          hoverLab.style.top = (o.dy + ly).toFixed(1) + \"px\";\n          hoverLab.setAttribute(\"data-ub-mlabel-side\", ly === above ? \"above\" : \"below\");\n          clampIn(hoverLab, o, cs, true);\n          hoverShown = true;\n        }\n      }\n      if (!distShown && distLab) distLab.style.display = \"none\";\n      if (!hoverShown && hoverLab) hoverLab.style.display = \"none\";\n    }\n    function drawBar() {\n      const onNow = !!(ctx.measure && ctx.measure.on());\n      btns.forEach((b) => {\n        b.setAttribute(\"aria-pressed\", onNow ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", onNow);\n      });\n      if (bar) {\n        if (onNow) bar.removeAttribute(\"hidden\");\n        else bar.setAttribute(\"hidden\", \"\");\n      }\n      if (barText && onNow) {\n        const r = ctx.measure.readout(), n = ctx.measure.probe.count();\n        const v = ctx.measure.view(), at = v && v.hover ? v.hover.label : \"\";\n        const s = n === 2 && r ? r.text : n === 1 ? r ? r.text + (at ? \" \\xB7 to \" + at : \"\") : \"Click the second point\" : at ? at + \" \\xB7 click to start here\" : \"Click a corner, hole or fitting, then another. Points snap like magnets.\";\n        if (barText.textContent !== s) barText.textContent = s;\n      }\n    }\n    function drawCursor() {\n      if (!canvas || !canvas.style) return;\n      const v = ctx.measure && ctx.measure.on() ? ctx.measure.view() : null;\n      let c = null;\n      if (ctx.measure && ctx.measure.on()) c = v && (v.hover || v.grab != null || v.overEnd >= 0) ? \"none\" : \"default\";\n      if (c !== null) {\n        if (canvas.style.cursor !== c) canvas.style.cursor = c;\n        lastCursor = c;\n      } else if (lastCursor !== null) {\n        canvas.style.cursor = \"\";\n        lastCursor = null;\n      }\n    }\n    function draw() {\n      try {\n        drawBar();\n        drawLayer();\n        drawCursor();\n      } catch {\n      }\n    }\n    return { draw };\n  }\n\n  // v2/src/interact/hinge-evidence.js\n  function installHingeEvidence(ia, env2) {\n    const doc2 = env2.doc, w = doc2 && doc2.defaultView;\n    if (!w || !w.location || !w.setTimeout) return;\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(w.location.hostname || \"\"))) return;\n    if (/^#ub-zoom-plus$/.test(String(w.location.hash || \"\"))) {\n      w.setTimeout(() => {\n        try {\n          let n = 0;\n          while (!ia.view.zoomButtons().inDisabled && n < 40) {\n            ia.view.zoomIn();\n            n++;\n          }\n          ia.ctx.frame();\n          ia.ctx.changed(\"zoom\");\n          const box3 = doc2.createElement(\"pre\");\n          box3.setAttribute(\"data-ub-hinge-evidence\", \"\");\n          box3.style.cssText = \"position:fixed;left:8px;bottom:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.9);border:1px solid #999;font:12px/1.35 monospace;color:#111\";\n          box3.textContent = \"Zoom in to its limit \\xB7 first-visit view\\n\" + n + \" presses \\xB7 board boundary across the picture: \" + ia.view.edgeLength() + \" (bar 12) \\xB7 Zoom in \" + (ia.view.zoomButtons().inDisabled ? \"off\" : \"on\");\n          doc2.body.appendChild(box3);\n          w.__ubHingeEvidence = { path: \"zoom-plus\", steps: n, edge: ia.view.edgeLength() };\n        } catch {\n        }\n      }, 1500);\n      return;\n    }\n    const m = String(w.location.hash || \"\").match(/^#ub-hinge-(\\d{1,2})-(wheel|pinch|plus)$/);\n    if (!m) return;\n    const ctx = ia.ctx, scene = ia.scene, canvas = env2.canvas;\n    const ev = (o) => Object.assign({ preventDefault() {\n    }, stopPropagation() {\n    }, button: 0, buttons: 0, target: canvas, cancelable: true }, o);\n    w.setTimeout(() => {\n      try {\n        const u = (scene.units || [])[Number(m[1]) - 1];\n        if (!u || !u.door) return;\n        ia.commands.run(\"select\", { id: u.id });\n        u.doorOpen = true;\n        ctx.changed(\"plan\");\n        ctx.frame();\n        const hp = unitFeatures(u).pts.filter((q) => /^hinge cup centre/.test(q.kind)).map((q) => q.p).sort((a2, b2) => b2[1] - a2[1])[0];\n        if (!hp) return;\n        const rect2 = () => ctx.liveRect();\n        const at = () => {\n          const nd = ctx.worldToNdc(hp), r2 = rect2();\n          if (!nd || !r2) return null;\n          return { clientX: Math.round(r2.left + (nd[0] + 1) / 2 * r2.width), clientY: Math.round(r2.top + (1 - nd[1]) / 2 * r2.height) };\n        };\n        let n = 0;\n        if (m[2] === \"wheel\") {\n          while (!ia.view.zoomButtons().atMin && n < 200) {\n            const p = at();\n            if (!p) break;\n            ia.canvasEvent(\"wheel\", ev(Object.assign({ deltaY: -100, deltaMode: 0 }, p)));\n            n++;\n          }\n        } else if (m[2] === \"pinch\") {\n          for (let round = 0; round < 10 && !ia.view.zoomButtons().atMin; round++) {\n            const p = at();\n            if (!p) break;\n            const t = (g2) => ev({ touches: [{ clientX: p.clientX - g2, clientY: p.clientY }, { clientX: p.clientX + g2, clientY: p.clientY }] });\n            ia.canvasEvent(\"touchstart\", t(20));\n            for (let g2 = 20; g2 < 300; g2 *= 1.12) {\n              ia.canvasEvent(\"touchmove\", t(g2));\n              n++;\n            }\n            ia.canvasEvent(\"touchend\", ev({ touches: [] }));\n          }\n        } else {\n          for (let k = 0; k < 8; k++) {\n            const c2 = ctx.cam(), nd = ctx.worldToNdc(hp);\n            if (!c2 || !nd) break;\n            const v = applyR(c2.rot, [hp[0] - c2.cx, hp[1] - c2.cy, hp[2] - c2.cz]), depth = c2.dist - v[2], ty = Math.tan(FOVY / 2);\n            scene.panX = (scene.panX || 0) + nd[0] * ty * c2.aspect * depth;\n            scene.panY = (scene.panY || 0) + nd[1] * ty * depth;\n            ctx.frame();\n          }\n          while (!ia.view.zoomButtons().inDisabled && n < 40) {\n            ia.view.zoomIn();\n            n++;\n          }\n        }\n        ctx.frame();\n        ctx.changed(\"zoom\");\n        const c = ctx.cam(), e = c.eye, d = Math.hypot(hp[0] - e[0], hp[1] - e[1], hp[2] - e[2]);\n        const r = applyRT2(c.rot, [1, 0, 0]), a = ctx.worldToNdc(hp), b = ctx.worldToNdc([hp[0] + r[0], hp[1] + r[1], hp[2] + r[2]]), R4 = rect2();\n        const pxmm = a && b && R4 ? Math.hypot((b[0] - a[0]) / 2 * R4.width, (b[1] - a[1]) / 2 * R4.height) : 0;\n        const box3 = doc2.createElement(\"pre\");\n        box3.setAttribute(\"data-ub-hinge-evidence\", \"\");\n        box3.style.cssText = \"position:fixed;left:8px;bottom:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.9);border:1px solid #999;font:12px/1.35 monospace;color:#111\";\n        box3.textContent = \"hinge close-up \\xB7 \" + m[2] + \" \\xB7 cabinet \" + m[1] + \" door open\\n\" + n + \" steps \\xB7 camera to hinge \" + Math.round(d) + \" mm \\xB7 \" + pxmm.toFixed(1) + \" px/mm \\xB7 Zoom in \" + (ia.view.zoomButtons().inDisabled ? \"off\" : \"on\");\n        doc2.body.appendChild(box3);\n        w.__ubHingeEvidence = { path: m[2], steps: n, mm: d, pxmm };\n      } catch {\n      }\n    }, 1500);\n  }\n\n  // v2/src/interact/gola-evidence.js\n  function installGolaEvidence(ia, env2) {\n    const doc2 = env2.doc, w = doc2 && doc2.defaultView;\n    if (!w || !w.location || !w.setTimeout) return;\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(w.location.hostname || \"\"))) return;\n    const m = String(w.location.hash || \"\").match(/^#ub-gola(-end)?$/);\n    if (!m) return;\n    const ctx = ia.ctx, scene = ia.scene;\n    w.setTimeout(() => {\n      try {\n        scene.units.length = 0;\n        const r111 = ia.commands.run(\"dropUnit\", { type: \"base\", x: 700, z: 300 });\n        const a = r111 && r111.unit;\n        if (!a) return;\n        let x = a.x + a.w;\n        for (const t of [\"base-drawer\", \"base-4drawer\"]) {\n          const u = newUnit(t);\n          u.x = x;\n          u.z = a.z;\n          u.rot = a.rot;\n          u.y = a.y;\n          u.run = a.run;\n          if (t !== \"base-4drawer\") u.door = true;\n          scene.units.push(u);\n          x += u.w;\n        }\n        ia.commands.run(\"setKitchenGola\", { on: true });\n        const bank = scene.units[2];\n        scene.selectedId = null;\n        scene.yaw = -0.62;\n        scene.pitch = 0.2;\n        scene.panX = 0;\n        scene.panY = 0;\n        ctx.changed(\"plan\");\n        ctx.frame();\n        if (m[1]) {\n          const hp = unitXf(bank).p([bank.w, bank.h - 120, bank.d]);\n          for (let k = 0; k < 8; k++) {\n            const c = ctx.cam(), nd = ctx.worldToNdc(hp);\n            if (!c || !nd) break;\n            const v = applyR(c.rot, [hp[0] - c.cx, hp[1] - c.cy, hp[2] - c.cz]), depth = c.dist - v[2], ty = Math.tan(FOVY / 2);\n            scene.panX = (scene.panX || 0) + nd[0] * ty * c.aspect * depth;\n            scene.panY = (scene.panY || 0) + nd[1] * ty * depth;\n            ctx.frame();\n          }\n          for (let n = 0; n < 5 && !ia.view.zoomButtons().inDisabled; n++) ia.view.zoomIn();\n          ctx.frame();\n        }\n        ctx.changed(\"zoom\");\n        const rec = golaRecesses(bank), R4 = golaRuns(scene.units);\n        const box3 = doc2.createElement(\"pre\");\n        box3.setAttribute(\"data-ub-gola-evidence\", \"\");\n        box3.style.cssText = \"position:fixed;left:8px;bottom:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.92);border:1px solid #999;font:12px/1.35 monospace;color:#111\";\n        box3.textContent = \"Gola evidence (preview stand) \\xB7 kitchen gola \" + JSON.stringify(scene.kitchen.gola) + \"\\n4-drawer end side: \" + rec.map((r) => r.kind === \"J\" ? \"J \" + r.down + \" down x \" + r.back + \" back\" : \"C \" + r.height + \" x \" + r.back + \" @\" + Math.round(r.yc)).join(\" | \") + \"\\nJ run \" + R4.J.pieces.join(\"+\") + \" mm = \" + R4.J.bars + \" bar(s) \\xB7 C \" + R4.C.pieces.join(\"+\") + \" mm = \" + R4.C.bars + \" bar(s)\";\n        doc2.body.appendChild(box3);\n        w.__ubGolaEvidence = { rec, runs: R4 };\n      } catch (e) {\n        w.__ubGolaEvidence = { error: String(e && e.message || e) };\n      }\n    }, 1500);\n  }\n\n  // v2/src/interact/fronts-evidence.js\n  function installFrontsEvidence(ia, env2) {\n    const doc2 = env2.doc, w = doc2 && doc2.defaultView;\n    if (!w || !w.location || !w.setTimeout) return;\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(w.location.hostname || \"\"))) return;\n    if (/^#ub-oven-door$/.test(String(w.location.hash || \"\"))) {\n      const scene2 = ia.scene;\n      w.setTimeout(() => {\n        try {\n          scene2.units.length = 0;\n          const r111 = ia.commands.run(\"dropUnit\", { type: \"base-oven\", x: 700, z: 300 });\n          const o = r111 && r111.unit;\n          if (!o) return;\n          o.door = true;\n          const b = newUnit(\"base\");\n          b.x = o.x + o.w;\n          b.z = o.z;\n          b.rot = o.rot;\n          b.y = o.y;\n          b.run = o.run;\n          b.door = true;\n          scene2.units.push(b);\n          scene2.selectedId = null;\n          scene2.yaw = -0.35;\n          scene2.pitch = 0.12;\n          scene2.panX = 0;\n          scene2.panY = 0;\n          ia.ctx.changed(\"plan\");\n          ia.ctx.frame();\n          ia.view.fitKitchen(true);\n          const co = doc2.querySelector(\".ub-lab__coach\"), cb = co && co.querySelector(\"button\");\n          if (cb) cb.click();\n          const note = doc2.createElement(\"div\");\n          note.setAttribute(\"data-ub-oven-door-evidence\", \"\");\n          note.style.cssText = \"position:fixed;left:8px;top:8px;z-index:99;background:#fff;border:1px solid #999;padding:6px 8px;font:13px/1.35 system-ui;max-width:440px\";\n          const parts = cabinetParts(o).map((p) => p.name).join(\", \");\n          note.textContent = \"Oven + hob base with door:true - its parts: \" + parts;\n          doc2.body.appendChild(note);\n        } catch (e) {\n        }\n      }, 1500);\n    }\n    const gm = String(w.location.hash || \"\").match(/^#ub-glass(-open|-corner)?$/);\n    if (gm) {\n      const scene2 = ia.scene;\n      w.setTimeout(() => {\n        try {\n          scene2.units.length = 0;\n          const r111 = ia.commands.run(\"dropUnit\", { type: \"base\", x: 700, z: 300 });\n          const a = r111 && r111.unit;\n          if (!a) return;\n          const b = newUnit(\"base\");\n          b.x = a.x + a.w;\n          b.z = a.z;\n          b.rot = a.rot;\n          b.y = a.y;\n          b.run = a.run;\n          b.door = true;\n          scene2.units.push(b);\n          const wl = newUnit(\"wall\");\n          wl.x = a.x;\n          wl.z = a.z;\n          wl.rot = a.rot;\n          wl.run = a.run;\n          wl.door = true;\n          scene2.units.push(wl);\n          ia.commands.run(\"setKitchenMaterials\", { frontMat: \"mdf-paint\" });\n          const has = ia.commands.list ? ia.commands.list().some((c) => (c.name || c) === \"setGlassDoor\") : false;\n          if (has) ia.commands.run(\"setGlassDoor\", { id: b.id });\n          else {\n            scene2.selectedId = b.id;\n            ia.commands.run(\"setFrontStyle\", { frontStyle: \"glass\" });\n          }\n          if (gm[1] === \"-open\") {\n            a.doorOpen = true;\n            b.doorOpen = true;\n          }\n          scene2.selectedId = null;\n          const q = /[?&]jcam=(-?[\\d.]+),(-?[\\d.]+),([\\d.]+)/.exec(w.location.search || \"\");\n          scene2.yaw = q ? +q[1] : -0.35;\n          scene2.pitch = q ? +q[2] : 0.12;\n          scene2.panX = 0;\n          scene2.panY = 0;\n          ia.ctx.changed(\"plan\");\n          ia.ctx.frame();\n          ia.view.fitKitchen(true);\n          if (q && gm[1] !== \"-corner\") ia.view.setZoom((scene2.zoom || 1) / +q[3]);\n          const co = doc2.querySelector(\".ub-lab__coach\"), cb = co && co.querySelector(\"button\");\n          if (cb) cb.click();\n          const box3 = doc2.createElement(\"pre\");\n          box3.setAttribute(\"data-ub-glass-evidence\", \"\");\n          box3.style.cssText = \"position:fixed;left:8px;top:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.92);border:1px solid #999;font:12px/1.35 monospace;color:#222\";\n          const lines = [\n            \"Glass door evidence (preview stand) \\xB7 build \" + (has ? \"with\" : \"WITHOUT\") + \" the one-cabinet command \\xB7 kitchen style \" + scene2.kitchen.frontStyle + \" \\xB7 fronts \" + scene2.units.map((u, i) => \"Cabinet \" + (i + 1) + \" \" + (u.frontStyle || \"slab\")).join(\", \") + (gm[1] === \"-open\" ? \" \\xB7 doors OPEN\" : \"\"),\n            \"the pane is a display sheet - glass type, thickness, safety class and retention to be specified (quote)\"\n          ];\n          const show2 = () => {\n            box3.textContent = lines.join(\"\\n\");\n            doc2.body.appendChild(box3);\n          };\n          if (gm[1] !== \"-corner\") {\n            show2();\n            return;\n          }\n          w.setTimeout(() => {\n            try {\n              const P2 = doc2.querySelector(\".ub-lab\").__ubProj, R4 = P2.__v2.renderer();\n              const door = cabinetParts({ ...b, doorOpen: false }).filter((x) => x.kind === \"door\")[0], L = door.local;\n              const at = unitXf(b).p([L.x0 + 82, L.y1 - 82, L.z1]);\n              const proj = () => {\n                R4.renderNow();\n                const I = R4.inspect();\n                I.camera.updateMatrixWorld();\n                const v = new I.THREE.Vector3(at[0], at[1], at[2]).project(I.camera);\n                return [v.x, v.y];\n              };\n              const centre3 = () => {\n                for (let it = 0; it < 6; it++) {\n                  const p0 = proj();\n                  if (Math.abs(p0[0]) < 0.03 && Math.abs(p0[1]) < 0.03) break;\n                  for (const k of [\"panX\", \"panY\"]) {\n                    const ax = k === \"panX\" ? 0 : 1, q0 = proj(), b0 = scene2[k] || 0;\n                    scene2[k] = b0 + 20;\n                    P2.render();\n                    const q1 = proj(), dd = (q1[ax] - q0[ax]) / 20;\n                    scene2[k] = Math.abs(dd) > 1e-7 ? b0 - q0[ax] / dd : b0;\n                    P2.render();\n                  }\n                }\n              };\n              centre3();\n              const zm = q ? +q[3] : 4;\n              for (let k = 0; k < 6; k++) {\n                ia.view.setZoom((scene2.zoom || 1) / Math.pow(zm, 1 / 6));\n                P2.render();\n                centre3();\n              }\n              lines.push(\"close-up: Cabinet 2's frame at the aperture's top-left corner (where a stile would meet a rail) \\xB7 zoom \" + Math.round(scene2.zoom * 100) / 100);\n              try {\n                const I = R4.inspect(), gl = I.renderer.getContext(), Wd = gl.drawingBufferWidth, Hd = gl.drawingBufferHeight;\n                R4.renderNow();\n                I.renderer.render(I.scene, I.camera);\n                const px = new Uint8Array(Wd * Hd * 4);\n                gl.readPixels(0, 0, Wd, Hd, gl.RGBA, gl.UNSIGNED_BYTE, px);\n                const ym = L.y1 - 42, xj = L.x0 + 82;\n                const scan2 = (x0, x1) => {\n                  let prev = null, mx = 0;\n                  for (let k = 0; k <= 60; k++) {\n                    const wp = unitXf(b).p([x0 + (x1 - x0) * k / 60, ym, L.z1]);\n                    const v = new I.THREE.Vector3(wp[0], wp[1], wp[2]).project(I.camera);\n                    const sx = Math.round((v.x + 1) / 2 * Wd), sy = Math.round((v.y + 1) / 2 * Hd);\n                    if (sx < 0 || sy < 0 || sx >= Wd || sy >= Hd) continue;\n                    const o = (sy * Wd + sx) * 4, l = 0.299 * px[o] + 0.587 * px[o + 1] + 0.114 * px[o + 2];\n                    if (prev != null) mx = Math.max(mx, Math.abs(l - prev));\n                    prev = l;\n                  }\n                  return Math.round(mx * 10) / 10;\n                };\n                const join = scan2(xj - 30, xj + 30), ctrl = scan2(xj + 90, xj + 150);\n                lines.push(\"seam scan across the stile / rail join line: largest brightness step \" + join + \" (control, plain top border: \" + ctrl + \")\");\n                w.__ubGlassSeam = { join, ctrl };\n              } catch (e) {\n                lines.push(\"seam scan err \" + (e && e.message));\n              }\n            } catch (e) {\n              lines.push(\"close-up err \" + (e && e.message));\n            }\n            show2();\n          }, 700);\n        } catch (e) {\n          w.__ubGlassEvidence = { error: String(e && e.message || e) };\n        }\n      }, 1500);\n      return;\n    }\n    const m = String(w.location.hash || \"\").match(/^#ub-jpull(-tray|-close(-open)?(-drawer)?)?$/);\n    if (!m) return;\n    const ctx = ia.ctx, scene = ia.scene;\n    w.setTimeout(() => {\n      try {\n        scene.units.length = 0;\n        const r111 = ia.commands.run(\"dropUnit\", { type: \"base\", x: 700, z: 300 });\n        const a = r111 && r111.unit;\n        if (!a) return;\n        const b = newUnit(\"base-drawer\");\n        b.x = a.x + a.w;\n        b.z = a.z;\n        b.rot = a.rot;\n        b.y = a.y;\n        b.run = a.run;\n        b.door = true;\n        scene.units.push(b);\n        const wl = newUnit(\"wall\");\n        wl.x = a.x;\n        wl.z = a.z;\n        wl.rot = a.rot;\n        wl.run = a.run;\n        wl.door = true;\n        scene.units.push(wl);\n        ia.commands.run(\"setKitchenMaterials\", { frontStyle: \"jpull\" });\n        scene.selectedId = a.id;\n        scene.yaw = -0.45;\n        scene.pitch = 0.42;\n        scene.panX = 0;\n        scene.panY = 0;\n        ctx.changed(\"plan\");\n        ctx.frame();\n        ctx.changed(\"zoom\");\n        const box3 = doc2.createElement(\"pre\");\n        box3.setAttribute(\"data-ub-jpull-evidence\", \"\");\n        box3.style.cssText = \"position:fixed;left:8px;top:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.92);border:1px solid #999;font:12px/1.35 monospace;color:#111\";\n        const lines = [\"J-pull evidence (preview stand) \\xB7 kitchen \" + scene.kitchen.frontStyle + \" / \" + scene.kitchen.frontMat + \" \\xB7 fronts \" + scene.units.map((u) => (u.frontStyle || \"slab\") + \"/\" + (u.frontMat || \"mfc\")).join(\", \")];\n        const out = { units: scene.units.map((u) => ({ type: u.type, style: u.frontStyle, mat: u.frontMat })) };\n        const finish3 = () => {\n          box3.textContent = lines.join(\"\\n\");\n          doc2.body.appendChild(box3);\n          w.__ubJpullEvidence = out;\n        };\n        if (!m[1]) {\n          finish3();\n          return;\n        }\n        if (/^-close/.test(m[1])) {\n          if (m[2]) {\n            a.doorOpen = true;\n            b.drawerOpen = true;\n          }\n          const q = /[?&]jcam=(-?[\\d.]+),(-?[\\d.]+),([\\d.]+)/.exec(w.location.search || \"\");\n          scene.yaw = q ? +q[1] : m[3] ? 1.05 : -1.05;\n          scene.pitch = q ? +q[2] : 0.3;\n          ctx.changed(\"plan\");\n          ctx.frame();\n          w.setTimeout(() => {\n            try {\n              const P2 = doc2.querySelector(\".ub-lab\").__ubProj, R4 = P2.__v2.renderer(), cv = doc2.querySelector(\".ub-lab__canvas\");\n              const tu = m[3] ? b : a;\n              const door = cabinetParts({ ...tu, doorOpen: false, drawerOpen: false }).filter((x) => x.kind === (m[3] ? \"drawer-front\" : \"door\"))[0];\n              const L = door.local, at = unitXf(tu).p([m[3] ? L.x1 - 1 : L.x0 + 1, L.y1 - 15, (L.z0 + L.z1) / 2 + (m[3] && m[2] ? 420 : 0)]);\n              const proj = () => {\n                R4.renderNow();\n                const I = R4.inspect();\n                I.camera.updateMatrixWorld();\n                const v = new I.THREE.Vector3(at[0], at[1], at[2]).project(I.camera);\n                return [v.x, v.y];\n              };\n              const centre3 = () => {\n                for (let it = 0; it < 6; it++) {\n                  const p0 = proj();\n                  if (Math.abs(p0[0]) < 0.03 && Math.abs(p0[1]) < 0.03) break;\n                  for (const k of [\"panX\", \"panY\"]) {\n                    const ax = k === \"panX\" ? 0 : 1, q0 = proj(), b0 = scene[k] || 0;\n                    scene[k] = b0 + 20;\n                    P2.render();\n                    const q1 = proj(), dd = (q1[ax] - q0[ax]) / 20;\n                    scene[k] = Math.abs(dd) > 1e-7 ? b0 - q0[ax] / dd : b0;\n                    P2.render();\n                  }\n                }\n              };\n              centre3();\n              const zm = q ? +q[3] : 5;\n              scene.selectedId = null;\n              P2.render();\n              for (let k = 0; k < 6; k++) {\n                ia.view.setZoom((scene.zoom || 1) / Math.pow(zm, 1 / 6));\n                P2.render();\n                centre3();\n              }\n              const r = jpullBoxes(tu, L);\n              lines.push(\"close-up: \" + (m[3] ? \"Cabinet 2 drawer front\" : \"Cabinet 1 door\") + \", top edge (\" + (r && r.edge) + \")\" + (m[2] ? \"; door and drawer OPEN\" : \"\") + \" \\xB7 zoom \" + Math.round(scene.zoom * 100) / 100);\n              if (r && r.section) lines.push(\"section from the opening edge [from-to mm: back kept | face kept, of \" + Math.round(L.z1 - L.z0) + \" mm]: \" + r.section.slice(0, -1).map((x) => x[0] + \"-\" + x[1] + \": \" + x[2] + \"|\" + x[3]).join(\"  \") + \"  then full board\");\n              lines.push(\"back = cabinet inside, face = the user's side\");\n            } catch (e) {\n              lines.push(\"close-up err \" + (e && e.message));\n            }\n            finish3();\n          }, 700);\n          return;\n        }\n        const fly = doc2.querySelector('[data-ub-fly=\"fronts\"]');\n        if (fly) fly.click();\n        w.setTimeout(() => {\n          const t = doc2.querySelector('[data-ub-flyout=\"fronts\"]');\n          if (t && !t.hidden) {\n            const h = () => Math.round(t.getBoundingClientRect().height);\n            const after = h();\n            t.classList.remove(\"ub-lab__flyout--fcompact\");\n            const before = h();\n            t.classList.add(\"ub-lab__flyout--fcompact\");\n            out.tray = { before, after };\n            lines.push(\"Fronts tray height: before \" + before + \" px -> now \" + after + \" px (\" + Math.round(100 - after / before * 100) + \"% lower), viewport \" + w.innerWidth + \" px\");\n          } else lines.push(\"Fronts tray did not open\");\n          finish3();\n        }, 600);\n      } catch (e) {\n        w.__ubJpullEvidence = { error: String(e && e.message || e) };\n      }\n    }, 1500);\n  }\n\n  // v2/src/interact/drawer-evidence.js\n  var VIEWS = { \"\": [-0.55, 0.32, 1.5], open: [-0.75, 0.3, 1.5], under: [-0.9, 0.03, 1.6], rear: [1.2, 0.03, 0.9], section: [-0.55, 0.32, 1.3] };\n  function installDrawerEvidence(ia, env2) {\n    const doc2 = env2.doc, w = doc2 && doc2.defaultView;\n    if (!w || !w.location || !w.setTimeout) return;\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(w.location.hostname || \"\"))) return;\n    const m = String(w.location.hash || \"\").match(/^#ub-dbox(?:-(open|under|rear|section))?$/);\n    if (!m) return;\n    const view = m[1] || \"\";\n    const ctx = ia.ctx, scene = ia.scene;\n    w.setTimeout(() => {\n      const lines = [];\n      const box3 = doc2.createElement(\"pre\");\n      box3.setAttribute(\"data-ub-dbox-evidence\", \"\");\n      box3.style.cssText = \"position:fixed;left:8px;top:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.93);border:1px solid #999;font:12px/1.35 monospace;color:#111;max-width:60vw;white-space:pre-wrap\";\n      const finish3 = () => {\n        box3.textContent = lines.join(\"\\n\");\n        doc2.body.appendChild(box3);\n      };\n      try {\n        scene.units.length = 0;\n        const low = view === \"under\" || view === \"rear\";\n        const r111 = ia.commands.run(\"dropUnit\", { type: low ? \"wall\" : \"base-drawer\", x: 900, z: 300 });\n        const u = r111 && r111.unit;\n        if (!u) {\n          lines.push(\"no cabinet\");\n          finish3();\n          return;\n        }\n        u.door = true;\n        let xd = null;\n        if (low) {\n          u.interior = { shelves: 0, vDiv: [], hDiv: [] };\n          const a = addDrawer(u, {});\n          u.drawerFronts = false;\n          xd = a && a.ok ? addedDrawers(u)[0] : null;\n          if (!xd) {\n            lines.push(\"no drawer in the wall cabinet: \" + (a && a.why));\n            finish3();\n            return;\n          }\n          u.xopen = [xd.n];\n          xd = addedDrawers(u)[0];\n        } else u.drawerOpen = view !== \"\";\n        scene.selectedId = null;\n        const q = /[?&]dcam=(-?[\\d.]+),(-?[\\d.]+),([\\d.]+)/.exec(w.location.search || \"\");\n        const v = q ? [+q[1], +q[2], +q[3]] : VIEWS[view];\n        scene.yaw = v[0];\n        scene.pitch = v[1];\n        scene.panX = 0;\n        scene.panY = 0;\n        ctx.changed(\"plan\");\n        ctx.frame();\n        const b = drawerBoxes(u)[0];\n        const P2 = model1Panels({ x0: b.x0, w: b.w, y0: b.by0, h: b.h, z0: 0, l: b.l });\n        const open = low ? true : u.drawerOpen;\n        const parts = model1Parts(b.w, b.l, b.h);\n        lines.push(MODEL1.name + \" \\xB7 Cabinet \" + u.w + \" x \" + u.h + \" x \" + u.d + (low ? \" (wall, added drawer, no front)\" : \"\") + \" \\xB7 drawer \" + (open ? \"OPEN\" : \"closed\") + \" \\xB7 view \" + (view || \"closed\") + \" (yaw \" + v[0] + \", pitch \" + v[1] + \")\");\n        lines.push(\"box \" + Math.round(b.w) + \" W x \" + Math.round(b.l) + \" L x \" + Math.round(b.h) + \" H mm, its foot \" + Math.round(b.by0) + \" mm up the cabinet\");\n        parts.parts.forEach((p) => lines.push(\"  \" + p.name + \" \" + p.L + \" x \" + p.W + \" x\" + p.qty + \" - \" + p.ops));\n        const F = P2.find((p) => p.role === \"front\"), K2 = P2.find((p) => p.role === \"back\"), B = P2.find((p) => p.role === \"base\");\n        lines.push(\"front / back from \" + (F.y0 - b.by0) + \" to \" + (F.y1 - b.by0) + \" mm up the side (on the base top \" + (B.y1 - b.by0) + \"), base \" + (B.y0 - b.by0) + \"-\" + (B.y1 - b.by0) + \"; below \" + (B.y0 - b.by0) + \" mm only the two 16 mm side strips\");\n        lines.push(\"still open: \" + MODEL1_OPEN.join(\"; \"));\n        w.setTimeout(() => {\n          try {\n            const Pj = doc2.querySelector(\".ub-lab\").__ubProj, R4 = Pj.__v2.renderer();\n            const L = b, zMid = low ? xd.bz0 + xd.l / 2 + 420 : (u.d - 79.5) / 2 + (u.drawerOpen ? 420 : 0);\n            const at = unitXf(u).p([u.w / 2, low ? L.by0 - 260 : L.by0 + L.h / 2, zMid]);\n            const proj = () => {\n              R4.renderNow();\n              const I = R4.inspect();\n              I.camera.updateMatrixWorld();\n              const p = new I.THREE.Vector3(at[0], at[1], at[2]).project(I.camera);\n              return [p.x, p.y];\n            };\n            const centre3 = () => {\n              for (let it = 0; it < 6; it++) {\n                const p0 = proj();\n                if (Math.abs(p0[0]) < 0.03 && Math.abs(p0[1]) < 0.03) break;\n                for (const k of [\"panX\", \"panY\"]) {\n                  const ax = k === \"panX\" ? 0 : 1, q0 = proj(), b0 = scene[k] || 0;\n                  scene[k] = b0 + 20;\n                  Pj.render();\n                  const q1 = proj(), dd = (q1[ax] - q0[ax]) / 20;\n                  scene[k] = Math.abs(dd) > 1e-7 ? b0 - q0[ax] / dd : b0;\n                  Pj.render();\n                }\n              }\n            };\n            centre3();\n            for (let k = 0; k < 6; k++) {\n              ia.view.setZoom((scene.zoom || 1) / Math.pow(v[2], 1 / 6));\n              Pj.render();\n              centre3();\n            }\n            lines.push(\"zoom \" + Math.round((scene.zoom || 1) * 100) / 100 + \", pitch now \" + Math.round((scene.pitch || 0) * 100) / 100);\n            if (view === \"section\") doc2.body.appendChild(sectionSvg(doc2, b, P2));\n          } catch (e) {\n            lines.push(\"view err \" + (e && e.message));\n          }\n          finish3();\n        }, 700);\n      } catch (e) {\n        lines.push(\"err \" + (e && e.message));\n        finish3();\n      }\n    }, 1500);\n  }\n  function sectionSvg(doc2, b, P2) {\n    const NS7 = \"http://www.w3.org/2000/svg\";\n    const s = 2.2, pad = 70;\n    const el = (n, a, t) => {\n      const e = doc2.createElementNS(NS7, n);\n      for (const k in a) e.setAttribute(k, a[k]);\n      if (t != null) e.textContent = t;\n      return e;\n    };\n    const svg2 = el(\"svg\", { width: 760, height: 560, viewBox: \"0 0 760 560\" });\n    svg2.setAttribute(\"data-ub-dbox-section\", \"\");\n    svg2.style.cssText = \"position:fixed;right:8px;bottom:8px;z-index:99999;background:#fff;border:1px solid #888\";\n    const g2 = el(\"g\", {});\n    svg2.appendChild(g2);\n    const col = { side: \"#d9c7a5\", \"side-groove\": \"#d9c7a5\", \"side-strip\": \"#d9c7a5\", base: \"#b9d3b0\", front: \"#a9c4de\", back: \"#a9c4de\" };\n    const txt = (x, y, t, a) => g2.appendChild(el(\"text\", Object.assign({ x, y, \"font-size\": 12, \"font-family\": \"monospace\", fill: \"#111\" }, a || {}), t));\n    const dim = (x1, y1, x2, y2, t, off) => {\n      g2.appendChild(el(\"line\", { x1, y1, x2, y2, stroke: \"#c00\", \"stroke-width\": 1 }));\n      [[x1, y1], [x2, y2]].forEach((p) => g2.appendChild(el(\"circle\", { cx: p[0], cy: p[1], r: 1.8, fill: \"#c00\" })));\n      txt((x1 + x2) / 2 + (off ? off[0] : 4), (y1 + y2) / 2 + (off ? off[1] : -4), t, { fill: \"#c00\" });\n    };\n    txt(12, 22, \"CROSS-SECTION (left corner, from the front), mm - Drawer Box Model 1\");\n    const X = (x) => pad + (x - b.x0) * s, Y = (y) => 40 + (b.by0 + b.h - y) * s;\n    const cut = P2.filter((p) => p.x0 < b.x0 + 90 && p.role !== \"front\" && p.role !== \"back\");\n    cut.forEach((p) => g2.appendChild(el(\"rect\", {\n      x: X(p.x0),\n      y: Y(p.y1),\n      width: (Math.min(p.x1, b.x0 + 90) - p.x0) * s,\n      height: (p.y1 - p.y0) * s,\n      fill: col[p.role],\n      stroke: \"#333\",\n      \"stroke-width\": 1\n    })));\n    const F = P2.find((p) => p.role === \"front\"), B = P2.find((p) => p.role === \"base\");\n    g2.appendChild(el(\"rect\", { x: X(F.x0), y: Y(F.y1), width: (b.x0 + 90 - F.x0) * s, height: (F.y1 - F.y0) * s, fill: \"none\", stroke: \"#36c\", \"stroke-dasharray\": \"5 3\" }));\n    txt(X(F.x0) + 6, Y(F.y1) + 16, \"back / front beyond: on the base\");\n    const runner = { x0: b.x0 + 16, x1: b.x0 + 28, y0: b.by0 + 4, y1: b.by0 + 15.5 };\n    g2.appendChild(el(\"rect\", { x: X(runner.x0), y: Y(runner.y1), width: 12 * s, height: (runner.y1 - runner.y0) * s, fill: \"#999\", stroke: \"#333\", \"stroke-dasharray\": \"3 2\" }));\n    txt(X(runner.x1) + 4, Y(runner.y0) + 2, \"runner zone (illustrative)\");\n    const xr = X(b.x0) - 30;\n    dim(xr, Y(b.by0), xr, Y(B.y0), String(B.y0 - b.by0), [-34, 4]);\n    dim(xr, Y(B.y0), xr, Y(B.y1), String(B.y1 - B.y0), [-34, 4]);\n    dim(xr, Y(B.y1), xr, Y(b.by0 + b.h), String(Math.round((b.by0 + b.h - B.y1) * 10) / 10), [-40, 4]);\n    dim(X(b.x0), Y(b.by0) + 22, X(b.x0 + 16), Y(b.by0) + 22, \"16\", [-6, 16]);\n    dim(X(b.x0), Y(B.y1) - 8, X(B.x0), Y(B.y1) - 8, String(Math.round((B.x0 - b.x0) * 10) / 10), [-8, -6]);\n    dim(X(b.x0), Y(b.by0 + b.h) - 10, X(b.x0 + 18), Y(b.by0 + b.h) - 10, \"18\", [-6, -6]);\n    txt(X(b.x0 + 40), Y(B.y1) + 26, \"base 18 in 18x6 groove at 16\");\n    txt(X(b.x0 + 40), Y(b.by0) + 14, \"side strip shaved 2 inside: 18 -> 16\");\n    const s2 = Math.min(0.62, 640 / b.l), oy = 330, ox = 60;\n    txt(12, oy - 22, \"LONG SECTION (through the middle, from the side): \" + Math.round(b.l) + \" long, \" + Math.round(b.h) + \" high\");\n    const X2 = (z) => ox + z * s2, Y2 = (y) => oy + (b.by0 + b.h - y) * s2 * 2.2;\n    P2.filter((p) => p.role === \"base\" || p.role === \"front\" || p.role === \"back\").forEach((p) => g2.appendChild(el(\"rect\", {\n      x: X2(p.z0),\n      y: Y2(p.y1),\n      width: (p.z1 - p.z0) * s2,\n      height: (p.y1 - p.y0) * s2 * 2.2,\n      fill: col[p.role],\n      stroke: \"#333\"\n    })));\n    const side = P2.filter((p) => p.name === \"Side L\");\n    g2.appendChild(el(\"rect\", { x: X2(0), y: Y2(b.by0 + b.h), width: b.l * s2, height: b.h * s2 * 2.2, fill: \"none\", stroke: \"#8a6d3b\", \"stroke-dasharray\": \"6 3\" }));\n    txt(X2(0), Y2(b.by0) + 16, \"side (beyond, dashed) runs full height & length; nothing of front/back below the base\");\n    const K2 = P2.find((p) => p.role === \"back\");\n    dim(X2(b.l) + 16, Y2(F.y0), X2(b.l) + 16, Y2(F.y1), \"front \" + Math.round((F.y1 - F.y0) * 10) / 10, [6, 4]);\n    dim(X2(0) - 16, Y2(K2.y0), X2(0) - 16, Y2(K2.y1), \"back \" + Math.round((K2.y1 - K2.y0) * 10) / 10, [-70, 4]);\n    dim(X2(0), Y2(B.y0) + 48, X2(b.l), Y2(B.y0) + 48, \"base \" + Math.round(b.l * 10) / 10 + \" (full length)\", [-60, 16]);\n    txt(12, 548, \"scale: cross-section \" + s + \" px/mm; long section \" + Math.round(s2 * 100) / 100 + \" px/mm along, x2.2 up. Red = mm from the model.\");\n    void side;\n    return svg2;\n  }\n\n  // v2/src/interact/drawer-move-evidence.js\n  function installDrawerMoveEvidence(ia, env2) {\n    const doc2 = env2.doc, w = doc2 && doc2.defaultView;\n    if (!w || !w.location || !w.setTimeout) return;\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(w.location.hostname || \"\"))) return;\n    const m = String(w.location.hash || \"\").match(/^#ub-dmove(-cabinet|-size)?(-hold|-sel|-arrow)?$/);\n    if (!m) return;\n    const scene = ia.scene, ctx = ia.ctx;\n    w.setTimeout(() => {\n      const lines = [];\n      const box3 = doc2.createElement(\"pre\");\n      box3.setAttribute(\"data-ub-dmove-evidence\", \"\");\n      box3.style.cssText = \"position:fixed;left:8px;top:8px;z-index:99999;margin:0;padding:6px 8px;background:rgba(255,255,255,.93);border:1px solid #999;font:12px/1.35 monospace;color:#111;max-width:62vw;white-space:pre-wrap\";\n      const finish3 = () => {\n        box3.textContent = lines.join(\"\\n\");\n        doc2.body.appendChild(box3);\n        w.__ubDmove = lines.slice();\n      };\n      try {\n        scene.units.length = 0;\n        const r111 = ia.commands.run(\"dropUnit\", { type: \"base\", x: 900, z: 300 });\n        const u = r111 && r111.unit;\n        if (!u) {\n          lines.push(\"no cabinet\");\n          finish3();\n          return;\n        }\n        u.door = false;\n        u.interior = { shelves: 0, vDiv: [280], hDiv: [] };\n        const a = addDrawer(u, { band: 0, col: 0, y: 40 });\n        const b = addDrawer(u, { band: 0, col: 1 });\n        scene.selectedId = u.id;\n        scene.drawerBox = null;\n        if (m[1] === \"-cabinet\") ia.ctx.setMode(\"cabinet\");\n        else if (m[1] === \"-size\") ia.ctx.setMode(\"size\");\n        else ia.ctx.setMode(\"rotate\");\n        scene.yaw = -0.25;\n        scene.pitch = 0.12;\n        scene.panX = 0;\n        scene.panY = 0;\n        ctx.changed(\"plan\");\n        ctx.frame();\n        ia.view.fitKitchen(true);\n        ctx.frame();\n        const cv = doc2.querySelector(\".ub-lab__canvas\");\n        const co = doc2.querySelector(\".ub-lab__coach\"), cb = co && co.querySelector(\"button\");\n        if (cb) cb.click();\n        const st = () => ({\n          sel: scene.drawerBox ? scene.drawerBox.i : null,\n          yaw: Math.round(scene.yaw * 1e3) / 1e3,\n          pitch: Math.round(scene.pitch * 1e3) / 1e3,\n          x: Math.round(u.x),\n          z: Math.round(u.z),\n          d: ia.hist.depth().past,\n          dr: addedDrawers(u).map((q) => q.name + \"@\" + (q.col === 0 ? \"L\" : \"R\") + \" y\" + q.y + \" f\" + q.fh + \" b\" + q.mm).join(\", \")\n        });\n        const fmt = (s) => \"chosen \" + s.sel + \" \\xB7 yaw \" + s.yaw + \" pitch \" + s.pitch + \" \\xB7 cabinet x\" + s.x + \" z\" + s.z + \" \\xB7 Undo \" + s.d + \"\\n  drawers: \" + s.dr;\n        const screen = (lp) => {\n          const nd = ia.ctx.worldToNdc(unitXf(u).p(lp)), r = cv.getBoundingClientRect();\n          return nd ? [r.left + (nd[0] + 1) / 2 * r.width, r.top + (1 - nd[1]) / 2 * r.height] : null;\n        };\n        const A = addedDrawers(u).find((q) => q.n === a.n), B = addedDrawers(u).find((q) => q.n === b.n);\n        const from = screen([(A.fx0 + A.fx1) / 2, (A.fy0 + A.fy1) / 2, u.d + 19]);\n        const to = screen([(B.fx0 + B.fx1) / 2, B.fy0 - 110, u.d + 19]);\n        const ev = (type, x, y, buttons, tgt) => {\n          const e = new w.MouseEvent(type, { clientX: x, clientY: y, button: 0, buttons, bubbles: true, cancelable: true, view: w, detail: 1 });\n          (tgt || cv).dispatchEvent(e);\n        };\n        lines.push(\"Drawer relocation evidence (preview stand) \\xB7 mode \" + ia.ctx.mode() + \" \\xB7 \" + (A ? \"A = \" + A.name : \"\") + \", \" + (B ? \"B = \" + B.name : \"\"));\n        const s0 = st();\n        lines.push(\"0 start: \" + fmt(s0));\n        ev(\"mousedown\", from[0], from[1], 1);\n        ev(\"mouseup\", from[0], from[1], 0, w);\n        ev(\"click\", from[0], from[1], 0);\n        w.setTimeout(() => {\n          const s1 = st();\n          lines.push(\"1 click on A: \" + fmt(s1));\n          const arrowsShown = Array.prototype.slice.call(doc2.querySelectorAll(\"[data-ub-dharrow]\")).filter((el) => !el.hasAttribute(\"hidden\")).map((el) => el.getAttribute(\"data-ub-dharrow\"));\n          lines.push(\"  orange height arrows shown: \" + (arrowsShown.length ? arrowsShown.join(\" + \") : \"none\"));\n          if (m[2] === \"-sel\") {\n            finish3();\n            return;\n          }\n          if (m[2] === \"-arrow\") {\n            const ar = doc2.querySelector('[data-ub-dharrow=\"top\"]');\n            if (!ar || ar.hasAttribute(\"hidden\")) {\n              lines.push(\"no top arrow\");\n              finish3();\n              return;\n            }\n            const r = ar.getBoundingClientRect(), ax = r.left + r.width / 2, ay = r.top + r.height / 2;\n            const pe = (type, x, y, buttons, tgt) => (tgt || w).dispatchEvent(new w.PointerEvent(type, { clientX: x, clientY: y, button: 0, buttons, pointerId: 45, pointerType: \"mouse\", isPrimary: true, bubbles: true, cancelable: true }));\n            pe(\"pointerdown\", ax, ay, 1, ar);\n            let k2 = 0;\n            const stp = () => {\n              k2++;\n              pe(\"pointermove\", ax, ay - 5 * k2, 1);\n              if (k2 < 8) {\n                w.setTimeout(stp, 40);\n                return;\n              }\n              w.setTimeout(() => {\n                const s2 = st();\n                lines.push(\"2 top arrow pulled up 40 px, held: \" + fmt(s2));\n                finish3();\n              }, 300);\n            };\n            w.setTimeout(stp, 60);\n            return;\n          }\n          ev(\"mousedown\", from[0], from[1], 1);\n          let k = 0;\n          const step = () => {\n            k++;\n            ev(\"mousemove\", from[0] + (to[0] - from[0]) * k / 8, from[1] + (to[1] - from[1]) * k / 8, 1, w);\n            if (k < 8) {\n              w.setTimeout(step, 40);\n              return;\n            }\n            w.setTimeout(() => {\n              const s2 = st();\n              lines.push(\"2 held over the right bay under B: \" + fmt(s2) + (scene.drawerMovePreview ? \"\\n  preview: \" + JSON.stringify({ ok: scene.drawerMovePreview.ok, to: scene.drawerMovePreview.section, y: scene.drawerMovePreview.y, why: scene.drawerMovePreview.why }) : \"\"));\n              if (m[2] === \"-hold\") {\n                lines.push(\"(held - not released)\");\n                finish3();\n                return;\n              }\n              ev(\"mouseup\", to[0], to[1], 0, w);\n              w.setTimeout(() => {\n                const s3 = st();\n                lines.push(\"3 released: \" + fmt(s3));\n                const camera = s3.yaw !== s1.yaw || s3.pitch !== s1.pitch, moved = s3.x !== s1.x || s3.z !== s1.z, dr = s3.dr !== s1.dr;\n                lines.push(\"=> what the drag did: \" + [camera ? \"TURNED THE CAMERA\" : \"\", moved ? \"MOVED THE WHOLE CABINET\" : \"\", dr ? \"changed the drawers\" : \"\", !camera && !moved && !dr ? \"nothing\" : \"\"].filter(Boolean).join(\", \") + \" \\xB7 Undo steps added \" + (s3.d - s1.d));\n                finish3();\n              }, 400);\n            }, 300);\n          };\n          w.setTimeout(step, 80);\n        }, 400);\n      } catch (e) {\n        lines.push(\"error \" + (e && e.message));\n        finish3();\n      }\n    }, 1500);\n  }\n\n  // v2/src/interact/quick-add-dom.js\n  var PLUS = '<svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 1.5v9M1.5 6h9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" fill=\"none\"/></svg>';\n  function createQuickAddDom(ia, env2) {\n    const root = env2.root, canvas = env2.canvas;\n    const doc2 = root.ownerDocument || env2.doc;\n    const q = (s) => root.querySelector ? root.querySelector(s) : null;\n    const host = q(\"[data-ub-size]\");\n    let stage = null;\n    for (const n of [host && host.parentNode, canvas && canvas.parentNode, root])\n      if (!stage && n && typeof n.appendChild === \"function\") stage = n;\n    if (!stage || !doc2) return null;\n    const layer2 = doc2.createElement(\"div\");\n    layer2.className = \"ub-lab__qadd\";\n    layer2.setAttribute(\"data-ub-qaddlayer\", \"\");\n    layer2.setAttribute(\"role\", \"group\");\n    layer2.setAttribute(\"aria-label\", \"Add a matching cabinet beside this one\");\n    layer2.setAttribute(\"hidden\", \"\");\n    stage.appendChild(layer2);\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    const btn = {};\n    for (const side of [\"left\", \"right\"]) {\n      const b = doc2.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"ub-lab__qaddbtn\";\n      b.setAttribute(\"data-ub-qadd\", side);\n      b.innerHTML = PLUS;\n      b.style.display = \"none\";\n      b.addEventListener(\"mousedown\", stop);\n      b.addEventListener(\"pointerdown\", stop);\n      b.addEventListener(\"touchstart\", stop, { passive: true });\n      b.addEventListener(\"click\", (e) => {\n        if (e && e.preventDefault) e.preventDefault();\n        stop(e);\n        press(side);\n      });\n      b.addEventListener(\"keydown\", (e) => {\n        if (e && e.key === \"Escape\" && pick() && pick().pending()) {\n          cancel();\n        }\n      });\n      layer2.appendChild(b);\n      btn[side] = b;\n    }\n    const lead = {};\n    for (const side of [\"left\", \"right\"]) {\n      const l = doc2.createElement(\"div\");\n      l.className = \"ub-lab__qaddlead\";\n      l.setAttribute(\"data-ub-qaddlead\", side);\n      l.setAttribute(\"aria-hidden\", \"true\");\n      l.style.display = \"none\";\n      layer2.insertBefore(l, layer2.firstChild);\n      lead[side] = l;\n    }\n    const pick = () => ia.quickAdd && ia.quickAdd.pick || null;\n    const fly = () => q('[data-ub-flyout=\"cabinets\"]');\n    function catalogOpen() {\n      const f = fly();\n      return !!f && !f.hasAttribute(\"hidden\");\n    }\n    function openCatalog() {\n      if (catalogOpen()) return;\n      if (root.__ubDocks && root.__ubDocks.show) {\n        root.__ubDocks.show(\"cabinets\");\n        return;\n      }\n      const f = fly();\n      if (f) f.removeAttribute(\"hidden\");\n      const t = q(\"[data-ub-tray]\");\n      if (t) t.removeAttribute(\"hidden\");\n    }\n    function closeCatalog() {\n      if (!catalogOpen()) return;\n      if (root.__ubDocks && root.__ubDocks.show) {\n        root.__ubDocks.show(null);\n        return;\n      }\n      const f = fly();\n      if (f) f.setAttribute(\"hidden\", \"\");\n    }\n    function say(msg) {\n      try {\n        if (ia.ctx && ia.ctx.cue) ia.ctx.cue(msg);\n      } catch {\n      }\n    }\n    function focusKeep(b) {\n      if (b && b.style.display !== \"none\" && b.focus && doc2.activeElement !== b) {\n        try {\n          b.focus({ preventScroll: true });\n        } catch {\n        }\n      }\n    }\n    function press(side) {\n      const P2 = pick(), b = btn[side];\n      if (!P2) {\n        const done0 = ia.quickAdd.run(side);\n        draw();\n        return done0;\n      }\n      const a = P2.check();\n      if (a && catalogOpen()) {\n        const done2 = P2.commit(side);\n        syncPick();\n        draw();\n        if (done2 && done2.ok && done2.id && ia.view && ia.view.revealUnit) {\n          ia.view.revealUnit(done2.id, freeInsets(), { withPlus: false, onCanvas: true });\n          draw();\n        }\n        focusKeep(b);\n        return done2;\n      }\n      const now = P2.arm(side);\n      if (!now) return null;\n      pin = b && b.style.display !== \"none\" ? { src: now.src, side, left: b.style.left, top: b.style.top, key: viewKey() } : null;\n      openCatalog();\n      syncPick(true);\n      draw();\n      say(\"Pick a cabinet below, then press + to add it on the \" + side + \" \\u2014 \" + P2.tileName(now.tile) + \" is picked; each press adds one\");\n      focusKeep(b);\n      return { ok: true, armed: now };\n    }\n    function cancel() {\n      const P2 = pick();\n      if (P2) P2.disarm();\n      closeCatalog();\n      syncPick();\n      draw();\n    }\n    let pickKey = null;\n    function syncPick(scroll) {\n      const P2 = pick(), a = P2 ? P2.pending() : null;\n      const key = a ? a.src + \"|\" + a.side + \"|\" + a.tile : \"\";\n      if (key === pickKey && !scroll) return;\n      pickKey = key;\n      const f = fly();\n      if (f && f.classList) f.classList.toggle(\"is-picking\", !!a);\n      let picked = null;\n      if (root.querySelectorAll) for (const t of root.querySelectorAll(\"[data-ub-tray-add]\")) {\n        const id = t.getAttribute(\"data-ub-tray-add\");\n        const on = !!a && id === a.tile, no = !!a && !P2.allowed(id);\n        if (t.classList) {\n          t.classList.toggle(\"is-picked\", on);\n          t.classList.toggle(\"is-noplus\", no);\n        }\n        if (a) t.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        else t.removeAttribute(\"aria-pressed\");\n        if (no) t.setAttribute(\"aria-disabled\", \"true\");\n        else t.removeAttribute(\"aria-disabled\");\n        if (on) picked = t;\n      }\n      const hint = q(\"[data-ub-pickhint]\");\n      if (hint) {\n        if (a) {\n          hint.textContent = \"Press + to add \" + P2.tileName(a.tile) + \" on the \" + a.side + \" \\u2014 each press adds one\";\n          hint.removeAttribute(\"hidden\");\n        } else {\n          hint.textContent = \"\";\n          hint.setAttribute(\"hidden\", \"\");\n        }\n      }\n      if (scroll && picked && picked.offsetParent) {\n        let body = picked.parentNode;\n        while (body && body !== root && !(body.scrollWidth > body.clientWidth + 1)) body = body.parentNode;\n        if (body && body !== root && body.getBoundingClientRect) {\n          const br = body.getBoundingClientRect(), tr = picked.getBoundingClientRect();\n          if (tr.left < br.left + 4) body.scrollLeft -= br.left + 4 - tr.left;\n          else if (tr.right > br.right - 4) body.scrollLeft += tr.right - br.right + 4;\n        }\n      }\n    }\n    root.__ubPlusPick = {\n      armed() {\n        const P2 = pick();\n        return !!(P2 && P2.check() && catalogOpen());\n      },\n      choose(tile) {\n        const P2 = pick();\n        if (!P2) return { ok: false };\n        const r = P2.choose(tile);\n        if (!r.ok && r.why === \"not beside\") say((r.name || \"That cabinet\") + \" can't go beside a cabinet with + \\u2014 close this and tap it, or drag it onto the plan\");\n        else if (r.ok) say(P2.tileName(tile) + \" picked \\u2014 press + to add it on the \" + P2.pending().side);\n        syncPick(true);\n        draw();\n        return r;\n      },\n      cancel,\n      pending: () => {\n        const P2 = pick();\n        return P2 ? P2.pending() : null;\n      }\n    };\n    {\n      let down = null;\n      const live = /* @__PURE__ */ new Set();\n      const CLICK_PX3 = 6, CLICK_MS = 700;\n      const now = () => Date.now();\n      const onCanvas = (e) => !!e && e.target === canvas;\n      if (canvas && canvas.addEventListener) {\n        canvas.addEventListener(\"pointerdown\", (e) => {\n          live.add(e.pointerId === void 0 ? \"m\" : e.pointerId);\n          down = onCanvas(e) && live.size === 1 && !(e.button > 0) ? { x: e.clientX, y: e.clientY, t: now(), id: e.pointerId } : null;\n        }, true);\n        canvas.addEventListener(\"pointermove\", (e) => {\n          if (down && Math.hypot(e.clientX - down.x, e.clientY - down.y) > CLICK_PX3) down = null;\n        }, true);\n        const end = (e, cancelled) => {\n          const d = down;\n          down = null;\n          if (cancelled || !d || !onCanvas(e) || d.id !== void 0 && e.pointerId !== void 0 && d.id !== e.pointerId) return;\n          if (Math.hypot(e.clientX - d.x, e.clientY - d.y) > CLICK_PX3 || now() - d.t > CLICK_MS) return;\n          const P2 = pick();\n          if (!P2 || !P2.pending() || !catalogOpen()) return;\n          let hit2 = null;\n          try {\n            hit2 = ia.pointer && ia.pointer.pickAt ? ia.pointer.pickAt(e.clientX, e.clientY) : null;\n          } catch {\n            hit2 = null;\n          }\n          if (hit2) return;\n          cancel();\n        };\n        canvas.addEventListener(\"pointerup\", (e) => end(e, false), true);\n        canvas.addEventListener(\"pointercancel\", (e) => end(e, true), true);\n        const w = doc2.defaultView;\n        if (w && w.addEventListener) for (const t of [\"pointerup\", \"pointercancel\"])\n          w.addEventListener(t, (e) => {\n            live.delete(e.pointerId === void 0 ? \"m\" : e.pointerId);\n            if (!live.size && t === \"pointercancel\") down = null;\n          });\n      }\n    }\n    try {\n      const w = doc2.defaultView;\n      const m = String(w && w.location && w.location.hash || \"\").match(/^#ub-plus-(\\d{1,2})-(left|right)((?:-(?:x\\d|[a-z][a-z0-9]*(?:-(?!x\\d(?:-|$))[a-z0-9]+)*))*)$/);\n      if (m && w.setTimeout) {\n        const steps = [], re = /-(x(\\d)|[a-z][a-z0-9]*(?:-(?!x\\d(?:-|$))[a-z0-9]+)*)/g;\n        for (let t = re.exec(m[3]); t; t = re.exec(m[3])) steps.push(t[2] ? { press: Number(t[2]) } : { tile: t[1] });\n        const stand = /^cut\\.uniboards\\.co\\.uk$/i.test(String(w.location && w.location.hostname || \"\"));\n        const todo = stand ? steps : steps.filter((x) => x.tile).slice(0, 1);\n        w.setTimeout(() => {\n          try {\n            const u = (ia.scene.units || [])[Number(m[1]) - 1];\n            if (u) ia.commands.run(\"select\", { id: u.id });\n            press(m[2]);\n            let k = 0;\n            const next = () => {\n              const x = todo[k++];\n              if (!x) return;\n              if (x.tile) {\n                root.__ubPlusPick.choose(x.tile);\n                w.setTimeout(next, 200);\n                return;\n              }\n              let n = x.press;\n              const one = () => {\n                if (n-- <= 0) {\n                  next();\n                  return;\n                }\n                const a = pick() && pick().pending();\n                if (a) press(a.side);\n                w.setTimeout(one, 350);\n              };\n              one();\n            };\n            next();\n          } catch {\n          }\n        }, 900);\n      }\n    } catch {\n    }\n    function origin() {\n      if (!layer2.getBoundingClientRect || !canvas || !canvas.getBoundingClientRect) return { dx: 0, dy: 0 };\n      const cr = canvas.getBoundingClientRect(), lr = layer2.getBoundingClientRect();\n      if (!isFinite(cr.left) || !isFinite(lr.left)) return { dx: 0, dy: 0 };\n      return { dx: cr.left - lr.left, dy: cr.top - lr.top };\n    }\n    const COVERS3 = \".ub-lab__dock .ub-lab__toolgrp, .ub-lab__dock--top > *, .ub-lab__flyout:not([hidden]), .ub-lab__eyemenu:not([hidden])\";\n    function freeInsets() {\n      if (!canvas || !canvas.getBoundingClientRect || !root.querySelectorAll) return null;\n      const c = canvas.getBoundingClientRect(), w = doc2.defaultView, vb = w && w.innerHeight ? Math.min(c.bottom, w.innerHeight) : c.bottom;\n      if (!(c.width > 0) || !(vb - c.top > 0)) return null;\n      const S2 = { l: 10, r: 10, t: 10, b: 10 + (c.bottom - vb) };\n      for (const n of root.querySelectorAll(COVERS3)) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        const q2 = n.getBoundingClientRect();\n        if (!(q2.width > 0) || q2.right <= c.left || q2.left >= c.right || q2.bottom <= c.top || q2.top >= vb) continue;\n        const cx = (q2.left + q2.right) / 2 - c.left, cy = (q2.top + q2.bottom) / 2 - c.top;\n        if (q2.height > q2.width) {\n          if (cx < c.width / 2) S2.l = Math.max(S2.l, q2.right - c.left + 8);\n          else S2.r = Math.max(S2.r, c.right - q2.left + 8);\n        } else if (cy < (vb - c.top) / 2) S2.t = Math.max(S2.t, q2.bottom - c.top + 8);\n        else S2.b = Math.max(S2.b, c.bottom - q2.top + 8);\n      }\n      return S2;\n    }\n    if (ia && ia.ctx) ia.ctx.viewInsets = freeInsets;\n    function covered(b, armedBtn) {\n      if (!b.getBoundingClientRect || !root.querySelectorAll) return false;\n      const r = b.getBoundingClientRect();\n      if (!(r.width > 0)) return false;\n      const cx = r.left + r.width / 2, cy = r.top + r.height / 2;\n      for (const n of root.querySelectorAll(COVERS3)) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        if (armedBtn && n.getAttribute && n.getAttribute(\"data-ub-flyout\") === \"cabinets\") continue;\n        const q2 = n.getBoundingClientRect();\n        if (q2.width > 0 && cx >= q2.left - 4 && cx <= q2.right + 4 && cy >= q2.top - 4 && cy <= q2.bottom + 4) return n;\n      }\n      return null;\n    }\n    function drawerWork() {\n      if (q('[data-ub-flyout=\"drawers\"]:not([hidden])')) return \"drawers tray\";\n      if (q(\"[data-ub-boxlayer] .ub-lab__seam.is-dragging\")) return \"joint drag\";\n      const act = doc2 && doc2.activeElement;\n      if (act && act.closest && act.closest(\"[data-ub-boxlayer]\")) return \"drawer editing\";\n      const sp = ia.scene && ia.scene.selPart;\n      if (typeof sp === \"string\" && /:drawer-(front|box):/.test(sp)) return \"drawer part\";\n      const sc = ia.scene;\n      if (sc && sc.drawerBox && sc.drawerBox.click && sc.drawerBox.id === sc.selectedId) return \"drawer chosen\";\n      return null;\n    }\n    let pin = null;\n    function viewKey() {\n      let c = null;\n      try {\n        c = ia.ctx && ia.ctx.cam ? ia.ctx.cam() : null;\n      } catch {\n        c = null;\n      }\n      const sc = ia.scene || {}, o = origin(), r = canvas && canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n      const n = (v) => typeof v === \"number\" && isFinite(v) ? Math.round(v * 1e3) / 1e3 : null;\n      return JSON.stringify([\n        c ? [c.cx, c.cy, c.cz, c.dist].map(n) : null,\n        [sc.yaw, sc.pitch, sc.zoom, sc.panX, sc.panY].map(n),\n        r ? [r.width, r.height].map(n) : null,\n        [o.dx, o.dy].map(n)\n      ]);\n    }\n    function pinOf(side, armed) {\n      if (!pin) return null;\n      if (!armed || armed.src !== pin.src || armed.side !== pin.side) {\n        pin = null;\n        return null;\n      }\n      if (side !== pin.side) return null;\n      if (viewKey() !== pin.key) {\n        pin = null;\n        return null;\n      }\n      return pin;\n    }\n    let last = [], lastWhy = {};\n    root.__ubQaddWhy = () => {\n      const out = { ...lastWhy };\n      if (out.left === \"layout\" || out.right === \"layout\") {\n        let w = null;\n        try {\n          w = ia.quickAdd.layoutWhy ? ia.quickAdd.layoutWhy() : null;\n        } catch {\n          w = null;\n        }\n        for (const k of [\"left\", \"right\"]) if (out[k] === \"layout\") out[k] = \"layout: \" + (w && w[k] ? w[k] : \"?\");\n      }\n      return out;\n    };\n    function draw() {\n      const P2 = pick();\n      if (P2 && P2.pending()) {\n        if (!catalogOpen() || drawerWork()) P2.disarm();\n        else P2.check();\n      }\n      const armed = P2 ? P2.pending() : null;\n      syncPick();\n      let L = [];\n      try {\n        L = ia.quickAdd.layout() || [];\n      } catch {\n        L = [];\n      }\n      const hadPlus = L.length > 0;\n      if (L.length && drawerWork()) L = [];\n      const dw = hadPlus && !L.length ? drawerWork() : null;\n      lastWhy = {};\n      if (dw) lastWhy = { left: \"drawer work: \" + dw, right: \"drawer work: \" + dw };\n      else for (const k of [\"left\", \"right\"]) if (!L.some((a) => a.side === k)) lastWhy[k] = \"layout\";\n      last = L;\n      if (!L.length) {\n        if (!armed) pin = null;\n        layer2.setAttribute(\"hidden\", \"\");\n        for (const s of [\"left\", \"right\"]) {\n          btn[s].style.display = \"none\";\n          lead[s].style.display = \"none\";\n          if (btn[s].classList) btn[s].classList.toggle(\"is-armed\", !!armed && armed.side === s);\n          if (!armed) btn[s].setAttribute(\"aria-expanded\", \"false\");\n        }\n        if (layer2.style.zIndex !== \"\") layer2.style.zIndex = \"\";\n        return;\n      }\n      layer2.removeAttribute(\"hidden\");\n      const above = !!(ia.scene && ia.scene.moveMode);\n      const z = armed ? \"13\" : above ? \"8\" : \"\";\n      if (layer2.style.zIndex !== z) layer2.style.zIndex = z;\n      const o = origin(), at = {};\n      for (const a of L) at[a.side] = a;\n      for (const s of [\"left\", \"right\"]) {\n        const b = btn[s], a = at[s];\n        const on = !!armed && armed.side === s;\n        if (b.classList) b.classList.toggle(\"is-armed\", on);\n        if (!a) {\n          b.style.display = \"none\";\n          lead[s].style.display = \"none\";\n          continue;\n        }\n        b.style.display = \"\";\n        const pn = pinOf(s, armed);\n        b.style.left = pn ? pn.left : (a.x + o.dx).toFixed(1) + \"px\";\n        b.style.top = pn ? pn.top : (a.y + o.dy).toFixed(1) + \"px\";\n        if (on) {\n          const nm = P2.tileName(armed.tile);\n          b.setAttribute(\"title\", \"Add \" + nm + \" on the \" + s + \" \\u2014 each press adds one\");\n          b.setAttribute(\"aria-label\", \"Add \" + nm + \" on the \" + s);\n          b.setAttribute(\"aria-expanded\", \"true\");\n        } else {\n          b.setAttribute(\"title\", \"Add a cabinet on the \" + s + \" \\u2014 opens the catalogue, then each press adds one\");\n          b.setAttribute(\"aria-label\", a.title);\n          if (armed && armed.src === (ia.scene && ia.scene.selectedId)) {\n            const nm2 = P2.tileName(armed.tile);\n            b.setAttribute(\"title\", \"Add \" + nm2 + \" on the \" + s + \" \\u2014 each press adds one\");\n            b.setAttribute(\"aria-label\", \"Add \" + nm2 + \" on the \" + s);\n          }\n          b.setAttribute(\"aria-expanded\", \"false\");\n        }\n        b.setAttribute(\"aria-controls\", \"ub-lab-fly-cabinets\");\n        lead[s].style.display = \"none\";\n        const cov = covered(b, on);\n        const covName = cov ? String(cov.className || cov.tagName || \"?\").split(\" \")[0] : \"\";\n        if (cov && !pn) {\n          const c = clearSpot(s, a, on);\n          if (c) {\n            b.style.left = (c.x + o.dx).toFixed(1) + \"px\";\n            b.style.top = (c.y + o.dy).toFixed(1) + \"px\";\n            leader(lead[s], a.x + o.dx, a.y + o.dy, c.x + o.dx, c.y + o.dy);\n            lastWhy[s] = \"moved clear of \" + covName + \" by \" + Math.round(c.d) + \" px\";\n          } else {\n            b.style.display = \"none\";\n            const ls = lastSearch[s] || {};\n            lastWhy[s] = \"covered by \" + covName + \"; no clear point within \" + ls.maxPx + \" px (its edge on screen) of \" + JSON.stringify(ls.from) + \", covers \" + JSON.stringify(ls.covers);\n          }\n        } else if (cov) {\n          b.style.display = \"none\";\n          lastWhy[s] = \"covered by \" + covName;\n        } else lastWhy[s] = pn ? \"drawn, pinned where pressed\" : \"drawn\";\n      }\n    }\n    const CLEAR = { stepPx: 4, fingerPx: 24, halfBtn: 12 };\n    const lastSearch = {};\n    function coverRects(armedBtn) {\n      const out = [];\n      if (!root.querySelectorAll || !canvas || !canvas.getBoundingClientRect) return out;\n      const cr = canvas.getBoundingClientRect();\n      for (const n of root.querySelectorAll(COVERS3)) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        if (armedBtn && n.getAttribute && n.getAttribute(\"data-ub-flyout\") === \"cabinets\") continue;\n        const r = n.getBoundingClientRect();\n        if (r.width > 0 && r.height > 0) out.push({ x0: r.left - cr.left, y0: r.top - cr.top, x1: r.right - cr.left, y1: r.bottom - cr.top });\n      }\n      return out;\n    }\n    function clearSpot(side, a, armedBtn) {\n      const cs = ia.ctx && ia.ctx.canvasSize ? ia.ctx.canvasSize() : null, cw = cs ? cs.w : 0, ch = cs ? cs.h : 0;\n      if (!(cw > 0 && ch > 0) || !ia.quickAdd || !ia.quickAdd.spotWhy) return null;\n      const rects = coverRects(armedBtn), m = CLEAR.halfBtn + CLEAR.fingerPx, e = CLEAR.halfBtn + 4;\n      const clear = (x, y) => x >= e && y >= e && x <= cw - e && y <= ch - e && rects.every((r) => x < r.x0 - m || x > r.x1 + m || y < r.y0 - m || y > r.y1 + m);\n      let span2 = null;\n      try {\n        span2 = ia.quickAdd.edgeSpan ? ia.quickAdd.edgeSpan(side) : null;\n      } catch {\n        span2 = null;\n      }\n      const maxPx = Math.max(2 * CLEAR.halfBtn, span2 || 0);\n      lastSearch[side] = { from: [Math.round(a.x), Math.round(a.y)], maxPx: Math.round(maxPx), covers: rects.map((r) => [r.x0, r.y0, r.x1 - r.x0, r.y1 - r.y0].map(Math.round)) };\n      for (let rr = CLEAR.stepPx; rr <= maxPx; rr += CLEAR.stepPx) {\n        const n = Math.max(8, Math.round(2 * Math.PI * rr / CLEAR.stepPx));\n        let best = null;\n        for (let k = 0; k < n; k++) {\n          const t = 2 * Math.PI * k / n, x = a.x + rr * Math.cos(t), y = a.y + rr * Math.sin(t);\n          if (!clear(x, y)) continue;\n          if (ia.quickAdd.spotWhy(side, { x, y })) continue;\n          if (!best) best = { x, y, d: rr };\n        }\n        if (best) return best;\n      }\n      return null;\n    }\n    function leader(l, x0, y0, x1, y1) {\n      const len = Math.hypot(x1 - x0, y1 - y0);\n      if (!(len > 6)) {\n        l.style.display = \"none\";\n        return;\n      }\n      l.style.display = \"\";\n      l.style.left = x0.toFixed(1) + \"px\";\n      l.style.top = y0.toFixed(1) + \"px\";\n      l.style.width = len.toFixed(1) + \"px\";\n      l.style.transform = \"rotate(\" + (Math.atan2(y1 - y0, x1 - x0) * 180 / Math.PI).toFixed(1) + \"deg)\";\n    }\n    return { draw, el: (side) => btn[side] || null, sceneEl: () => null, layer: layer2, last: () => last, drawerWork, press, cancel, catalogOpen };\n  }\n\n  // v2/src/interact/opening-catalog-drag.js\n  var SEL = \"[data-ub-roomadd]\";\n  var MOVE_PX5 = 6;\n  function installOpeningCatalogDrag(ia, env2) {\n    const ctx = ia.ctx, scene = ia.scene, root = env2.root, canvas = env2.canvas;\n    const doc2 = root && root.ownerDocument || env2.doc;\n    const win2 = doc2 && doc2.defaultView;\n    if (!root || !canvas || !doc2 || !win2 || !ctx.openingDrag) return null;\n    let dg = null, eatClickUntil = 0;\n    const run = (name2, args) => ia.commands.run(name2, args);\n    const canvasAt = (x, y) => {\n      const el = doc2.elementFromPoint ? doc2.elementFromPoint(x, y) : null;\n      return el === canvas;\n    };\n    const KIND = { window: \"window\", door: \"door\" };\n    function clearGhost() {\n      if (scene.roomDrag && scene.roomDrag.id === \"__new\") {\n        scene.roomDrag = null;\n        ctx.refresh();\n      }\n    }\n    function preview(x, y) {\n      if (!dg) return;\n      if (!canvasAt(x, y)) {\n        dg.last = null;\n        clearGhost();\n        ctx.cue(\"Carry the \" + dg.kind + \" onto a wall in the view and let go - Escape cancels\");\n        return;\n      }\n      const h = ctx.openingDrag.wallAt(x, y);\n      if (!h || h.a < 0 || h.a > h.len) {\n        dg.last = null;\n        clearGhost();\n        ctx.cue(\"Point at a wall to place the \" + dg.kind);\n        return;\n      }\n      const r = run(\"addOpening\", { kind: dg.kind, at: { wall: h.wall, x: h.a }, phase: \"check\" });\n      if (!r || !r.op) {\n        dg.last = null;\n        clearGhost();\n        if (r && r.why) ctx.cue(r.why);\n        return;\n      }\n      dg.last = { wall: h.wall, a: h.a, ok: !!r.ok, why: r.why || null };\n      scene.roomDrag = { id: \"__new\", kind: dg.kind, wall: r.op.wall, x: r.op.x, y: r.op.y, w: r.op.w, h: r.op.h, ok: !!r.ok, why: r.why || null };\n      const wallName = { back: \"back\", left: \"left\", right: \"right\", front: \"front\" }[r.op.wall] + \" wall\";\n      ctx.cue(r.ok ? (dg.kind === \"door\" ? \"Door\" : \"Window\") + \" on the \" + wallName + \", \" + r.op.x + \" mm from its left corner - let go to add it\" : \"Not there: \" + r.why + \". Carry it on, or let go to add nothing.\");\n      ctx.refresh();\n    }\n    function finish3(e, drop) {\n      const g2 = dg;\n      if (!g2) return;\n      dg = null;\n      for (const [t, f] of g2.ls) win2.removeEventListener(t, f, true);\n      if (g2.btn && g2.btn.classList) g2.btn.classList.remove(\"is-dragging\");\n      if (!g2.moved) return;\n      eatClickUntil = Date.now() + 400;\n      clearGhost();\n      if (!drop) {\n        ctx.cue(\"Nothing added\");\n        return;\n      }\n      let at = null;\n      if (e && canvasAt(e.clientX, e.clientY)) {\n        const h = ctx.openingDrag.wallAt(e.clientX, e.clientY);\n        if (h && h.a >= 0 && h.a <= h.len) at = { wall: h.wall, x: h.a };\n      }\n      if (!at && g2.last && g2.last.ok) at = { wall: g2.last.wall, x: g2.last.a };\n      if (!at) {\n        ctx.cue(\"Nothing added - let go of the \" + g2.kind + \" on a wall in the view\");\n        return;\n      }\n      const r = run(\"addOpening\", { kind: g2.kind, at });\n      if (r && r.ok) ctx.changed(\"roomOpenings\");\n    }\n    const onDown = (e) => {\n      const btn = e.target && e.target.closest ? e.target.closest(SEL) : null;\n      if (!btn || !root.contains(btn) || btn.disabled) return;\n      if (e.button != null && e.button !== 0) return;\n      if (e.isPrimary === false) return;\n      const kind = KIND[btn.getAttribute(\"data-ub-roomadd\")];\n      if (!kind) return;\n      e.preventDefault();\n      if (dg) finish3(e, false);\n      dg = { kind, btn, x0: e.clientX, y0: e.clientY, moved: false, last: null, pid: e.pointerId, ls: [] };\n      const mv = (ev) => {\n        if (!dg || dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (ev.isTrusted === true && ev.pointerType === \"mouse\" && ev.buttons === 0) {\n          finish3(ev, false);\n          return;\n        }\n        if (!dg.moved && Math.hypot(ev.clientX - dg.x0, ev.clientY - dg.y0) < MOVE_PX5) return;\n        if (!dg.moved) {\n          dg.moved = true;\n          dg.btn.classList.add(\"is-dragging\");\n        }\n        ev.preventDefault();\n        preview(ev.clientX, ev.clientY);\n      };\n      const upF = (ev) => {\n        if (dg && dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (dg && dg.moved) ev.stopPropagation();\n        finish3(ev, true);\n      };\n      const cancel = (ev) => finish3(ev, false);\n      const keyF = (ev) => {\n        if (ev.key === \"Escape\") {\n          ev.stopPropagation();\n          if (ev.preventDefault) ev.preventDefault();\n          finish3(ev, false);\n        }\n      };\n      dg.ls = [[\"pointermove\", mv], [\"pointerup\", upF], [\"pointercancel\", cancel], [\"keydown\", keyF], [\"blur\", cancel]];\n      for (const [t, f] of dg.ls) win2.addEventListener(t, f, true);\n    };\n    root.addEventListener(\"pointerdown\", onDown, true);\n    const onClick = (e) => {\n      if (Date.now() > eatClickUntil) return;\n      const btn = e.target && e.target.closest ? e.target.closest(SEL) : null;\n      if (!btn) return;\n      e.stopPropagation();\n      if (e.preventDefault) e.preventDefault();\n      eatClickUntil = 0;\n    };\n    root.addEventListener(\"click\", onClick, true);\n    return { dragging: () => !!dg, last: () => dg ? dg.last : null };\n  }\n\n  // v2/src/interact/boiler-catalog-drag.js\n  var SEL2 = \"[data-ub-roomobjadd]\";\n  var MOVE_PX6 = 6;\n  function installBoilerCatalogDrag(ia, env2) {\n    const ctx = ia.ctx, scene = ia.scene, root = env2.root, canvas = env2.canvas;\n    const doc2 = root && root.ownerDocument || env2.doc;\n    const win2 = doc2 && doc2.defaultView;\n    if (!root || !canvas || !doc2 || !win2 || !ctx.openingDrag) return null;\n    let dg = null, eatClickUntil = 0;\n    const run = (name2, args) => ia.commands.run(name2, args);\n    const canvasAt = (x, y) => {\n      const el = doc2.elementFromPoint ? doc2.elementFromPoint(x, y) : null;\n      return el === canvas;\n    };\n    const NAMES = { back: \"back\", left: \"left\", right: \"right\", front: \"front\" };\n    function clearGhost() {\n      if (scene.roomDrag && scene.roomDrag.id === \"__new\") {\n        scene.roomDrag = null;\n        ctx.refresh();\n      }\n    }\n    function preview(x, y) {\n      if (!dg) return;\n      if (!canvasAt(x, y)) {\n        dg.last = null;\n        clearGhost();\n        ctx.cue(\"Carry the boiler onto a wall in the view and let go - Escape cancels\");\n        return;\n      }\n      const h = ctx.openingDrag.wallAt(x, y);\n      if (!h || h.a < 0 || h.a > h.len) {\n        dg.last = null;\n        clearGhost();\n        ctx.cue(\"Point at a wall to place the boiler\");\n        return;\n      }\n      const r = run(\"addRoomObject\", { kind: dg.kind, at: { wall: h.wall, x: h.a }, phase: \"check\" });\n      if (!r || !r.op) {\n        dg.last = null;\n        clearGhost();\n        if (r && r.why) ctx.cue(r.why);\n        return;\n      }\n      dg.last = { wall: h.wall, a: h.a, ok: !!r.ok, why: r.why || null };\n      scene.roomDrag = { id: \"__new\", kind: dg.kind, wall: r.op.wall, x: r.op.x, y: r.op.y, w: r.op.w, h: r.op.h, ok: !!r.ok, why: r.why || null };\n      const wallName = NAMES[r.op.wall] ? NAMES[r.op.wall] + \" wall\" : \"wall\";\n      ctx.cue(r.ok ? \"Boiler on the \" + wallName + \", \" + r.op.x + \" mm from its left corner - let go to add it (a placeholder, its own sizes typed after)\" : \"Not there: \" + r.why + \". Carry it on, or let go to add nothing.\");\n      ctx.refresh();\n    }\n    function finish3(e, drop) {\n      const g2 = dg;\n      if (!g2) return;\n      dg = null;\n      for (const [t, f] of g2.ls) win2.removeEventListener(t, f, true);\n      if (g2.btn && g2.btn.classList) g2.btn.classList.remove(\"is-dragging\");\n      if (!g2.moved) return;\n      eatClickUntil = Date.now() + 400;\n      clearGhost();\n      if (!drop) {\n        ctx.cue(\"Nothing added\");\n        return;\n      }\n      let at = null;\n      if (e && canvasAt(e.clientX, e.clientY)) {\n        const h = ctx.openingDrag.wallAt(e.clientX, e.clientY);\n        if (h && h.a >= 0 && h.a <= h.len) at = { wall: h.wall, x: h.a };\n      }\n      if (!at && g2.last && g2.last.ok) at = { wall: g2.last.wall, x: g2.last.a };\n      if (!at) {\n        ctx.cue(\"Nothing added - let go of the boiler on a wall in the view\");\n        return;\n      }\n      const r = run(\"addRoomObject\", { kind: g2.kind, at });\n      if (r && r.ok) ctx.changed(\"roomObjects\");\n    }\n    const onDown = (e) => {\n      const btn = e.target && e.target.closest ? e.target.closest(SEL2) : null;\n      if (!btn || !root.contains(btn) || btn.disabled) return;\n      if (e.button != null && e.button !== 0) return;\n      if (e.isPrimary === false) return;\n      const kind = btn.getAttribute(\"data-ub-roomobjadd\");\n      if (kind !== \"boiler\") return;\n      e.preventDefault();\n      if (dg) finish3(e, false);\n      dg = { kind, btn, x0: e.clientX, y0: e.clientY, moved: false, last: null, pid: e.pointerId, ls: [] };\n      const mv = (ev) => {\n        if (!dg || dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (ev.isTrusted === true && ev.pointerType === \"mouse\" && ev.buttons === 0) {\n          finish3(ev, false);\n          return;\n        }\n        if (!dg.moved && Math.hypot(ev.clientX - dg.x0, ev.clientY - dg.y0) < MOVE_PX6) return;\n        if (!dg.moved) {\n          dg.moved = true;\n          dg.btn.classList.add(\"is-dragging\");\n        }\n        ev.preventDefault();\n        preview(ev.clientX, ev.clientY);\n      };\n      const upF = (ev) => {\n        if (dg && dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (dg && dg.moved) ev.stopPropagation();\n        finish3(ev, true);\n      };\n      const cancel = (ev) => finish3(ev, false);\n      const keyF = (ev) => {\n        if (ev.key === \"Escape\") {\n          ev.stopPropagation();\n          if (ev.preventDefault) ev.preventDefault();\n          finish3(ev, false);\n        }\n      };\n      dg.ls = [[\"pointermove\", mv], [\"pointerup\", upF], [\"pointercancel\", cancel], [\"keydown\", keyF], [\"blur\", cancel]];\n      for (const [t, f] of dg.ls) win2.addEventListener(t, f, true);\n    };\n    root.addEventListener(\"pointerdown\", onDown, true);\n    const onClick = (e) => {\n      if (Date.now() > eatClickUntil) return;\n      const btn = e.target && e.target.closest ? e.target.closest(SEL2) : null;\n      if (!btn) return;\n      e.stopPropagation();\n      if (e.preventDefault) e.preventDefault();\n      eatClickUntil = 0;\n    };\n    root.addEventListener(\"click\", onClick, true);\n    return { dragging: () => !!dg, last: () => dg ? dg.last : null };\n  }\n\n  // v2/src/interact/opening-stand-qa.js\n  function installOpeningStandQa(ia, env2) {\n    const root = env2.root, canvas = env2.canvas, doc2 = root && root.ownerDocument || env2.doc;\n    const win2 = doc2 && doc2.defaultView, loc = win2 && win2.location || {};\n    if (!/^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\"))) return null;\n    const m = /[?&]qa_openings=(panel|add|grips|drop)\\b/.exec(String(loc.search || \"\"));\n    if (!m || !win2.setTimeout) return null;\n    const want = m[1], ORDER = [\"panel\", \"add\", \"grips\", \"drop\"], upto = (s) => ORDER.indexOf(want) >= ORDER.indexOf(s);\n    const release = /[?&]qa_release=1\\b/.test(String(loc.search || \"\"));\n    const ctx = ia.ctx, scene = ia.scene, out = [];\n    const box3 = doc2.createElement(\"pre\");\n    box3.setAttribute(\"data-ub-qaopenings\", \"\");\n    box3.style.cssText = \"position:fixed;left:0;right:0;bottom:0;z-index:99999;margin:0;padding:6px 8px;max-height:34vh;overflow:auto;background:rgba(20,20,20,.86);color:#9ef59e;font:11px/1.35 monospace;white-space:pre-wrap\";\n    const say = () => {\n      box3.textContent = \"qa_openings \" + want + \"\\n\" + out.join(\"\\n\");\n    };\n    const state2 = () => {\n      const ops = scene.room && scene.room.openings || [];\n      const hv = (s) => {\n        const e = root.querySelector(s);\n        return !!(e && !e.hidden && e.getBoundingClientRect().width > 0);\n      };\n      return \"openings \" + JSON.stringify(ops.map((o) => [o.id, o.wall, o.x, o.w, o.h, \"sill \" + o.y])) + \" | selected \" + (scene.roomSel || \"none\") + \" | armed \" + (scene.roomArmed || \"none\") + \" | grips \" + (hv('[data-ub-ophandle=\"left\"]') && hv('[data-ub-ophandle=\"right\"]') ? \"SHOWN\" : \"hidden\") + \" | wall switches \" + (root.querySelector(\"[data-ub-roomaddwall]\") ? \"PRESENT\" : \"none\") + \" | Undo steps \" + ia.hist.depth().past + (scene.roomDrag ? \" | preview \" + (scene.roomDrag.ok ? \"GREEN\" : \"RED\") + \" on \" + scene.roomDrag.wall + \" wall\" : \"\");\n    };\n    const render = () => {\n      try {\n        const R4 = root.__ubProj && root.__ubProj.__v2 && root.__ubProj.__v2.renderer && root.__ubProj.__v2.renderer();\n        if (R4 && R4.renderNow) R4.renderNow();\n      } catch {\n      }\n    };\n    const client = (a, v) => {\n      const n = ctx.worldToNdc([a, v - 150, 0]);\n      if (!n) return null;\n      const r = canvas.getBoundingClientRect();\n      return { x: r.left + (n[0] + 1) / 2 * r.width, y: r.top + (1 - n[1]) / 2 * r.height };\n    };\n    const steps = [];\n    steps.push(() => {\n      const fly = root.querySelector('[data-ub-flyout=\"room\"]');\n      if (fly && fly.hidden) {\n        const b = root.querySelector('[data-ub-fly=\"room\"]');\n        if (b) b.click();\n      }\n      const t = root.querySelector('[data-ub-roomtab=\"openings\"]');\n      if (t) t.click();\n      ia.commands.run(\"faceWall\", { wall: \"back\" });\n      render();\n      out.push(\"panel: Room strip, Windows & doors -> \" + state2());\n    });\n    if (upto(\"add\")) steps.push(() => {\n      const b = root.querySelector('[data-ub-roomadd=\"window\"]');\n      if (b) b.click();\n      ia.commands.run(\"faceWall\", { wall: \"back\" });\n      render();\n      out.push(\"add: one click on Add window -> \" + state2());\n    });\n    if (upto(\"grips\")) steps.push(() => {\n      if (ctx.openingDrag) ctx.openingDrag.disarm(false);\n      scene.roomSel = null;\n      const o = (scene.room && scene.room.openings || []).slice(-1)[0];\n      const p = o && client(o.x + o.w / 2, o.y + o.h / 2);\n      if (p) {\n        const ev = { clientX: p.x, clientY: p.y, button: 0, buttons: 1, preventDefault() {\n        }, stopPropagation() {\n        } };\n        ia.canvasEvent(\"mousedown\", ev);\n        ia.windowEvent(\"mouseup\", Object.assign({}, ev, { buttons: 0 }));\n      }\n      render();\n      out.push(\"grips: one click on the window in the view -> \" + state2());\n    });\n    if (upto(\"drop\")) steps.push(() => {\n      scene.roomSel = null;\n      if (ctx.openingDrag) ctx.openingDrag.disarm(false);\n      const btn = root.querySelector('[data-ub-roomadd=\"door\"]');\n      const br = btn && btn.getBoundingClientRect(), to = client(500, 1e3);\n      if (!btn || !to) {\n        out.push(\"drop: no button or wall point\");\n        return;\n      }\n      const P2 = (type, x, y, el) => {\n        const e = new win2.MouseEvent(type, { bubbles: true, cancelable: true, clientX: x, clientY: y, button: 0, buttons: type === \"pointerup\" ? 0 : 1 });\n        Object.defineProperty(e, \"pointerId\", { value: 41 });\n        Object.defineProperty(e, \"isPrimary\", { value: true });\n        (el || win2).dispatchEvent(e);\n      };\n      const bx2 = br.left + br.width / 2, by = br.top + br.height / 2;\n      P2(\"pointerdown\", bx2, by, btn);\n      for (let k = 1; k <= 8; k++) P2(\"pointermove\", bx2 + (to.x - bx2) * k / 8, by + (to.y - by) * k / 8);\n      render();\n      out.push(\"drop: Add door carried onto the back wall, held -> \" + state2());\n      if (release) {\n        P2(\"pointerup\", to.x, to.y);\n        render();\n        out.push(\"drop: let go -> \" + state2());\n      }\n    });\n    win2.setTimeout(() => {\n      doc2.body.appendChild(box3);\n      steps.forEach((fn, i) => win2.setTimeout(() => {\n        try {\n          fn();\n        } catch (e) {\n          out.push(\"err \" + (e && e.message));\n        }\n        say();\n      }, 700 * (i + 1)));\n    }, 2600);\n    return { box: box3 };\n  }\n\n  // v2/src/interact/opening-card-dom.js\n  var EDNAME = { x: \"From the corner\", w: \"Width\", h: \"Height\", y: \"Sill\" };\n  var WHAT = { x: \"distance from the left corner\", w: \"width\", h: \"height\", y: \"sill height\" };\n  var SEQ = { n: 0 };\n  function createOpeningCardDom(ia, env2) {\n    const ctx = ia.ctx, scene = ia.scene, root = env2.root, canvas = env2.canvas;\n    const doc2 = root && root.ownerDocument || env2.doc;\n    if (!canvas || !doc2) return null;\n    const stage = canvas.parentNode || root;\n    const svgNS = \"http://www.w3.org/2000/svg\";\n    const mk = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const svgEl = (tag, attrs) => {\n      const n = doc2.createElementNS(svgNS, tag);\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      return n;\n    };\n    const dimLayer = mk(\"div\", \"ub-lab__opdims\", { \"data-ub-opdims\": \"\" });\n    dimLayer.hidden = true;\n    const svg2 = svgEl(\"svg\", { class: \"ub-lab__opdimsvg\", \"aria-hidden\": \"true\" });\n    const arrowId = \"ub-oparr-\" + ++SEQ.n;\n    const defs = svgEl(\"defs\");\n    const marker = svgEl(\"marker\", {\n      id: arrowId,\n      viewBox: \"0 0 8 8\",\n      refX: \"8\",\n      refY: \"4\",\n      markerWidth: \"7\",\n      markerHeight: \"7\",\n      markerUnits: \"userSpaceOnUse\",\n      orient: \"auto-start-reverse\"\n    });\n    marker.appendChild(svgEl(\"path\", { d: \"M0,1 L8,4 L0,7 z\", class: \"ub-lab__opdimhead\" }));\n    defs.appendChild(marker);\n    svg2.appendChild(defs);\n    const lines = svgEl(\"g\");\n    svg2.appendChild(lines);\n    dimLayer.appendChild(svg2);\n    stage.appendChild(dimLayer);\n    const probe = mk(\"span\", \"ub-lab__opprobe\", { \"aria-hidden\": \"true\" });\n    probe.style.cssText = \"position:absolute;left:0;top:0;width:0;height:0;overflow:hidden;pointer-events:none;visibility:hidden\";\n    stage.appendChild(probe);\n    const chips = {};\n    for (const k of [\"w\", \"h\", \"y\", \"x\"]) {\n      chips[k] = mk(\"button\", \"ub-lab__opchip\", { type: \"button\", \"data-ub-opchip\": k });\n      dimLayer.appendChild(chips[k]);\n    }\n    const summaryChip = mk(\"span\", \"ub-lab__opchip ub-lab__opsum\", { \"data-ub-opchip\": \"sum\", role: \"group\", \"aria-label\": \"Measurements, in millimetres\" });\n    summaryChip.style.display = \"none\";\n    dimLayer.appendChild(summaryChip);\n    const bar = mk(\"div\", \"ub-lab__opbar\", { \"data-ub-opbar\": \"\", role: \"group\" });\n    bar.hidden = true;\n    const bShow = mk(\"button\", \"ub-lab__opbtn ub-lab__opshow\", { type: \"button\", \"data-ub-opshow\": \"\" }, \"Show it\");\n    const bDone = mk(\"button\", \"ub-lab__opbtn ub-lab__opdone\", { type: \"button\", \"data-ub-opdone\": \"\" }, \"Done\");\n    const bDel = mk(\"button\", \"ub-lab__opbtn ub-lab__opdel\", { type: \"button\", \"data-ub-opdel\": \"\" });\n    const bin = svgEl(\"svg\", { viewBox: \"0 0 16 16\", width: \"13\", height: \"13\", \"aria-hidden\": \"true\", focusable: \"false\" });\n    bin.appendChild(svgEl(\"path\", { d: \"M5.5 2h5l.5 1.5H14V5H2V3.5h3zM3.5 6h9l-.7 8.2a1 1 0 0 1-1 .8H5.2a1 1 0 0 1-1-.8zM6.3 7.5v5.5h1.1V7.5zm2.3 0v5.5h1.1V7.5z\", fill: \"currentColor\" }));\n    bDel.appendChild(bin);\n    bDel.appendChild(mk(\"span\", \"ub-lab__opbtnt\", null, \"Remove\"));\n    bar.appendChild(bShow);\n    bar.appendChild(bDone);\n    bar.appendChild(bDel);\n    stage.appendChild(bar);\n    const ed = mk(\"div\", \"ub-lab__oped\", { \"data-ub-oped\": \"\", role: \"group\" });\n    ed.hidden = true;\n    const edLab = mk(\"span\", \"ub-lab__opedlab\", { \"aria-hidden\": \"true\" });\n    const edIn = mk(\"input\", \"ub-lab__opedin\", { type: \"number\", inputmode: \"numeric\", step: \"10\", \"data-ub-opedin\": \"\", \"aria-describedby\": \"ub-oped-msg\" });\n    const edMm = mk(\"span\", \"ub-lab__opedmm\", { \"aria-hidden\": \"true\" }, \"mm\");\n    const edMsg = mk(\"span\", \"ub-lab__opedmsg\", { id: \"ub-oped-msg\", \"data-ub-opedmsg\": \"\", role: \"alert\" });\n    const edRow = mk(\"span\", \"ub-lab__opedrow\");\n    edRow.appendChild(edLab);\n    edRow.appendChild(edIn);\n    edRow.appendChild(edMm);\n    ed.appendChild(edRow);\n    ed.appendChild(edMsg);\n    edMsg.hidden = true;\n    stage.appendChild(ed);\n    const errEl = mk(\"div\", \"ub-lab__operr\", { \"data-ub-operr\": \"\", role: \"alert\" });\n    errEl.hidden = true;\n    stage.appendChild(errEl);\n    const handles = {};\n    for (const edge of [\"left\", \"right\"]) {\n      const hb = mk(\"button\", \"ub-lab__ophandle ub-lab__ophandle--\" + edge, {\n        type: \"button\",\n        \"data-ub-ophandle\": edge,\n        \"aria-label\": (edge === \"left\" ? \"Left\" : \"Right\") + \" side - drag along the wall to change the width; arrow keys move it 10 mm\",\n        title: \"Drag to change the width - the other side stays\"\n      });\n      hb.hidden = true;\n      stage.appendChild(hb);\n      handles[edge] = hb;\n      for (const t of [\"mousedown\", \"dblclick\", \"click\"]) hb.addEventListener(t, (e) => {\n        if (e && e.stopPropagation) e.stopPropagation();\n      });\n      hb.addEventListener(\"touchstart\", (e) => {\n        if (e && e.stopPropagation) e.stopPropagation();\n      }, { passive: true });\n      hb.addEventListener(\"pointerdown\", (e) => {\n        if (e.stopPropagation) e.stopPropagation();\n        if (e.button != null && e.button !== 0) return;\n        const o = sel();\n        if (!o || !ctx.openingDrag || !ctx.openingDrag.sizeStart(o.id, edge, e.clientX, e.clientY)) return;\n        if (e.preventDefault) e.preventDefault();\n        try {\n          hb.setPointerCapture(e.pointerId);\n        } catch {\n        }\n        hb.classList.add(\"is-dragging\");\n      });\n      hb.addEventListener(\"pointermove\", (e) => {\n        if (ctx.openingDrag && ctx.openingDrag.sizing()) {\n          if (e.preventDefault) e.preventDefault();\n          ctx.openingDrag.sizeMove(e.clientX, e.clientY);\n          draw();\n        }\n      });\n      const end = (e) => {\n        if (ctx.openingDrag && ctx.openingDrag.sizing()) {\n          if (e && e.type === \"pointercancel\") ctx.openingDrag.cancel();\n          else ctx.openingDrag.sizeEnd();\n        }\n        hb.classList.remove(\"is-dragging\");\n        draw();\n      };\n      hb.addEventListener(\"pointerup\", end);\n      hb.addEventListener(\"pointercancel\", end);\n      hb.addEventListener(\"lostpointercapture\", () => {\n        if (ctx.openingDrag && ctx.openingDrag.sizing()) ctx.openingDrag.sizeEnd();\n        hb.classList.remove(\"is-dragging\");\n        draw();\n      });\n      hb.addEventListener(\"keydown\", (e) => {\n        if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\") return;\n        e.preventDefault();\n        e.stopPropagation();\n        const o = sel();\n        if (!o) return;\n        const side = edge === \"left\" ? o.x : o.x + o.w;\n        run(\"resizeOpening\", { id: o.id, edge, a: side + (e.key === \"ArrowLeft\" ? -10 : 10) });\n        draw();\n      });\n    }\n    const st = { id: null, edit: null, err: null, anchors: {}, layout: null };\n    let catalog = null;\n    try {\n      catalog = installOpeningCatalogDrag(ia, env2);\n    } catch {\n      catalog = null;\n    }\n    let boilerCatalog = null;\n    try {\n      boilerCatalog = installBoilerCatalogDrag(ia, env2);\n    } catch {\n      boilerCatalog = null;\n    }\n    try {\n      installOpeningStandQa(ia, env2);\n    } catch {\n    }\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    const run = (name2, args) => ia.commands.run(name2, args);\n    const geo = (o) => o ? [o.wall, o.x, o.w, o.h, o.y].join(\",\") : \"\";\n    function sel() {\n      return scene.roomSel ? openingsOf(scene.room).find((o) => o.id === scene.roomSel) || null : null;\n    }\n    for (const el of [dimLayer, ed, errEl, bar]) {\n      for (const t of [\"mousedown\", \"pointerdown\", \"dblclick\", \"click\"]) el.addEventListener(t, stop);\n      el.addEventListener(\"wheel\", stop, { passive: true });\n      el.addEventListener(\"touchstart\", stop, { passive: true });\n    }\n    bar.addEventListener(\"keydown\", (e) => {\n      if (e.key !== \"Escape\" && !((e.ctrlKey || e.metaKey) && /^[zy]$/i.test(e.key || \"\"))) stop(e);\n    });\n    dimLayer.addEventListener(\"click\", (e) => {\n      const b = e.target && e.target.closest ? e.target.closest(\"[data-ub-opseg], button[data-ub-opchip]\") : null;\n      if (!b || !dimLayer.contains(b)) return;\n      edOpen(b.getAttribute(\"data-ub-opseg\") || b.getAttribute(\"data-ub-opchip\"));\n    });\n    bar.addEventListener(\"click\", (e) => {\n      const b = e.target && e.target.closest ? e.target.closest(\"button\") : null;\n      if (!b || !bar.contains(b)) return;\n      const o = sel();\n      if (!o) return;\n      if (b === bShow) {\n        run(\"faceWall\", { wall: o.wall });\n        draw();\n        return;\n      }\n      if (b === bDone) {\n        if (ctx.openingDrag) ctx.openingDrag.disarm(true);\n        draw();\n        if (bDel.focus) bDel.focus();\n        return;\n      }\n      if (b === bDel) {\n        const r = run(\"removeOpening\", { id: o.id });\n        if (r && r.ok === false) return;\n        scene.roomSel = null;\n        scene.roomArmed = null;\n        ctx.syncControls();\n        ctx.refresh();\n        draw();\n        if (canvas.focus) canvas.focus();\n      }\n    });\n    function rangeOf(o, k) {\n      const sz = roomSize();\n      if (k === \"x\") return [50, Math.max(50, wallFrame(o.wall, sz).len - 50 - o.w)];\n      return openingLimits(o.kind, sz, o.wall)[k];\n    }\n    function edOpen(k) {\n      const o = sel();\n      if (!o || !EDNAME[k] || k === \"y\" && o.kind === \"door\") return;\n      if (ctx.openingDrag && scene.roomArmed) ctx.openingDrag.disarm(false);\n      st.err = null;\n      errEl.hidden = true;\n      st.edit = { id: o.id, k, dirty: false };\n      const name2 = openingLabel(scene.room, o).toLowerCase();\n      edLab.textContent = EDNAME[k];\n      edIn.setAttribute(\"aria-label\", EDNAME[k] + \" of \" + name2 + \", in millimetres - Enter to set, Escape to cancel\");\n      const r = rangeOf(o, k);\n      edIn.min = String(r[0]);\n      edIn.max = String(r[1]);\n      edIn.value = String(o[k]);\n      edMsg.textContent = \"\";\n      edMsg.hidden = true;\n      ed.classList.remove(\"is-bad\");\n      ed.setAttribute(\"data-ub-opedk\", k);\n      ed.hidden = false;\n      draw();\n      if (edIn.focus) edIn.focus();\n      if (edIn.select) edIn.select();\n    }\n    function edClose(focusBack) {\n      const e = st.edit;\n      if (!e) return;\n      st.edit = null;\n      ed.hidden = true;\n      ed.removeAttribute(\"data-ub-opedk\");\n      draw();\n      if (focusBack) {\n        const b = summaryChip.style.display !== \"none\" ? summaryChip.querySelector('[data-ub-opseg=\"' + e.k + '\"]') : chips[e.k];\n        if (b && b.focus && b.style.display !== \"none\") b.focus();\n      }\n    }\n    function edCommit(how) {\n      const e = st.edit;\n      if (!e) return;\n      const o = sel();\n      if (!o || o.id !== e.id) {\n        edClose(false);\n        return;\n      }\n      const raw = String(edIn.value || \"\").trim(), v = Number(raw), r = rangeOf(o, e.k);\n      let why = null;\n      if (raw === \"\" || !isFinite(v) || Math.round(v) !== v) why = \"type a whole number of millimetres\";\n      else if (v < r[0] || v > r[1]) why = EDNAME[e.k] + \" can be \" + r[0] + \"\\u2013\" + r[1] + \" mm here\";\n      else if (v === o[e.k]) {\n        edClose(how === \"enter\");\n        return;\n      } else {\n        const res = run(\"setOpening\", { id: o.id, k: e.k, value: String(v) });\n        if (!(res && res.ok)) why = res && res.why && res.why !== \"unchanged\" ? res.why : \"it does not fit there\";\n      }\n      if (!why) {\n        edClose(how === \"enter\");\n        return;\n      }\n      const text = \"Not changed - \" + why + \". Still \" + o[e.k] + \" mm.\";\n      if (how === \"enter\") {\n        edMsg.textContent = text;\n        edMsg.hidden = false;\n        ed.classList.add(\"is-bad\");\n        if (edIn.select) edIn.select();\n        draw();\n        return;\n      }\n      edClose(false);\n      st.err = { k: e.k, id: o.id, text, geo: geo(o) };\n      errEl.textContent = text;\n      draw();\n    }\n    ed.addEventListener(\"keydown\", (e) => {\n      const k = e.key || \"\";\n      stop(e);\n      if (k === \"Enter\") {\n        if (e.preventDefault) e.preventDefault();\n        edCommit(\"enter\");\n      } else if (k === \"Escape\") {\n        if (e.preventDefault) e.preventDefault();\n        edClose(true);\n      }\n    });\n    ed.addEventListener(\"keyup\", stop);\n    edIn.addEventListener(\"input\", () => {\n      if (st.edit) st.edit.dirty = true;\n      if (!edMsg.hidden) {\n        edMsg.hidden = true;\n        edMsg.textContent = \"\";\n        ed.classList.remove(\"is-bad\");\n      }\n    });\n    edIn.addEventListener(\"blur\", () => {\n      if (st.edit) edCommit(\"blur\");\n    });\n    function worldOn(fr, a, v, out) {\n      const p = fr.pt(a, out || 0);\n      return [p[0], v - LEG_H, p[1]];\n    }\n    function px(p) {\n      return clientOfWorld(ctx, p);\n    }\n    function origin() {\n      const cr = canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n      const lr = probe.getBoundingClientRect ? probe.getBoundingClientRect() : null;\n      return cr && lr && isFinite(cr.left) && isFinite(lr.left) ? { dx: cr.left - lr.left, dy: cr.top - lr.top } : { dx: 0, dy: 0 };\n    }\n    const seg = (a, b, cls, heads) => {\n      const l = svgEl(\"line\", { x1: a.x.toFixed(1), y1: a.y.toFixed(1), x2: b.x.toFixed(1), y2: b.y.toFixed(1), class: cls });\n      if (heads) {\n        l.setAttribute(\"marker-start\", \"url(#\" + arrowId + \")\");\n        l.setAttribute(\"marker-end\", \"url(#\" + arrowId + \")\");\n      }\n      lines.appendChild(l);\n    };\n    const ext = (from, to) => {\n      const dx = to.x - from.x, dy = to.y - from.y, L = Math.hypot(dx, dy) || 1;\n      seg({ x: from.x + dx / L * 2, y: from.y + dy / L * 2 }, { x: to.x + dx / L * 4, y: to.y + dy / L * 4 }, \"ub-lab__opdimext\", false);\n    };\n    const shown = [];\n    function chip(k, at, text, o) {\n      const deg = at && at.deg != null ? at.deg : 0;\n      const c = chips[k];\n      if (!at) {\n        c.style.display = \"none\";\n        return;\n      }\n      c.style.display = \"\";\n      c.classList.remove(\"is-moved\");\n      if (c.textContent !== text) c.textContent = text;\n      const lab = EDNAME[k] + \" \" + text + \" - click to type an exact \" + WHAT[k];\n      if (c.getAttribute(\"aria-label\") !== lab) {\n        c.setAttribute(\"aria-label\", lab);\n        c.title = EDNAME[k] + \" - click to type an exact \" + WHAT[k];\n      }\n      c.classList.toggle(\"is-editing\", !!(st.edit && st.edit.k === k));\n      c.style.left = (at.x + o.dx).toFixed(1) + \"px\";\n      c.style.top = (at.y + o.dy).toFixed(1) + \"px\";\n      c.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(deg) + \"deg)\";\n      const w0 = c.offsetWidth || text.length * 6 + 8, h0 = c.offsetHeight || 16;\n      const tb = turnedBox(at.x, at.y, w0, h0, deg), w = tb.x1 - tb.x0, h = tb.y1 - tb.y0;\n      shown.push({ k, el: c, x: at.x, y: at.y, x0: tb.x0, x1: tb.x1, y0: tb.y0, y1: tb.y1, w, h, deg });\n    }\n    function domObstacles() {\n      const out = [];\n      if (env2.obstacles) for (const q2 of env2.obstacles() || []) out.push(Object.assign({ tool: true }, q2));\n      const cr = canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n      if (!cr || !(cr.width > 0)) return out;\n      const q = \".ub-lab__dock .ub-lab__toolgrp, .ub-lab__dock--top > *, [data-ub-modehint], [data-ub-qscene]:not([hidden]), .ub-lab__flyout:not([hidden]), .ub-lab__eyemenu:not([hidden])\";\n      for (const n of root.querySelectorAll ? root.querySelectorAll(q) : []) {\n        if (!n.getBoundingClientRect || n.offsetParent === null) continue;\n        const r = n.getBoundingClientRect();\n        if (!(r.width > 0 && r.height > 0)) continue;\n        out.push({ x0: r.left - cr.left, x1: r.right - cr.left, y0: r.top - cr.top, y1: r.bottom - cr.top, tool: true });\n      }\n      return out;\n    }\n    const area = (a, b) => Math.max(0, Math.min(a.x1, b.x1) - Math.max(a.x0, b.x0)) * Math.max(0, Math.min(a.y1, b.y1) - Math.max(a.y0, b.y0));\n    const mid = (p, q) => p && q ? { x: (p.x + q.x) / 2, y: (p.y + q.y) / 2 } : null;\n    const beside = (p, q, c) => {\n      if (!p || !q) return null;\n      const n = normalAway(p, q, c), m = mid(p, q);\n      return { x: m.x + n.x * 9, y: m.y + n.y * 9, deg: readableDeg(q.x - p.x, q.y - p.y) };\n    };\n    function hideAll() {\n      for (const k in handles) if (!handles[k].hidden) handles[k].hidden = true;\n      if (!dimLayer.hidden) dimLayer.hidden = true;\n      if (!bar.hidden) bar.hidden = true;\n      st.id = null;\n      st.layout = null;\n      if (st.edit) {\n        st.edit = null;\n        ed.hidden = true;\n        ed.removeAttribute(\"data-ub-opedk\");\n      }\n      if (st.err) {\n        st.err = null;\n        errEl.hidden = true;\n      }\n    }\n    function draw() {\n      const o0 = sel();\n      if (!o0) {\n        hideAll();\n        return;\n      }\n      if (st.edit && st.edit.id !== o0.id) {\n        st.edit = null;\n        ed.hidden = true;\n        ed.removeAttribute(\"data-ub-opedk\");\n      }\n      if (st.err && (st.err.id !== o0.id || st.err.geo !== geo(o0))) {\n        st.err = null;\n        errEl.hidden = true;\n      }\n      if (st.edit && !st.edit.dirty && edIn.value !== String(o0[st.edit.k])) edIn.value = String(o0[st.edit.k]);\n      if (st.id !== o0.id) {\n        st.id = o0.id;\n        const name2 = openingLabel(scene.room, o0).toLowerCase();\n        bar.setAttribute(\"aria-label\", openingLabel(scene.room, o0));\n        bDel.setAttribute(\"aria-label\", \"Remove \" + name2);\n        bDel.title = \"Remove \" + name2;\n        bDone.setAttribute(\"aria-label\", \"Done moving \" + name2);\n        bDone.title = \"Done moving - Escape does the same\";\n        bShow.setAttribute(\"aria-label\", \"Show \" + name2);\n      }\n      const g2 = scene.roomDrag && scene.roomDrag.id === o0.id ? scene.roomDrag : null;\n      const o = g2 ? Object.assign({}, o0, { wall: g2.wall, x: g2.x, y: g2.y, w: g2.w, h: g2.h }) : o0;\n      const armed = scene.roomArmed === o0.id;\n      dimLayer.classList.toggle(\"is-bad\", !!g2);\n      bar.classList.toggle(\"is-armed\", armed);\n      if (bDone.hidden === armed) bDone.hidden = !armed;\n      const sz = roomSize(), fr = wallFrame(o.wall, sz);\n      while (lines.firstChild) lines.removeChild(lines.firstChild);\n      shown.length = 0;\n      const OUT = 30, GAP5 = 120;\n      const c00 = px(worldOn(fr, o.x, o.y, OUT)), c10 = px(worldOn(fr, o.x + o.w, o.y, OUT));\n      const c01 = px(worldOn(fr, o.x, o.y + o.h, OUT)), c11 = px(worldOn(fr, o.x + o.w, o.y + o.h, OUT));\n      const seen = !!(c00 && c10 && c01 && c11);\n      const od = origin(), cs = ctx.canvasSize();\n      if (seen) {\n        dimLayer.hidden = false;\n        svg2.setAttribute(\"style\", \"left:\" + od.dx.toFixed(1) + \"px;top:\" + od.dy.toFixed(1) + \"px\");\n        svg2.setAttribute(\"width\", String(cs.w));\n        svg2.setAttribute(\"height\", String(cs.h));\n        const t0 = px(worldOn(fr, o.x, o.y + o.h + GAP5, OUT)), t1 = px(worldOn(fr, o.x + o.w, o.y + o.h + GAP5, OUT));\n        const s0 = px(worldOn(fr, o.x + o.w + GAP5, o.y, OUT)), s1 = px(worldOn(fr, o.x + o.w + GAP5, o.y + o.h, OUT));\n        if (t0 && t1) {\n          seg(t0, t1, \"ub-lab__opdimline\", true);\n          ext(c01, t0);\n          ext(c11, t1);\n        }\n        if (s0 && s1) {\n          seg(s0, s1, \"ub-lab__opdimline\", true);\n          ext(c10, s0);\n          ext(c11, s1);\n        }\n        const oc = mid(c00, c11);\n        chip(\"w\", beside(t0, t1, oc), o.w + \" mm\", od);\n        chip(\"h\", beside(s0, s1, oc), o.h + \" mm\", od);\n        if (o.kind === \"window\") {\n          const f0 = px(worldOn(fr, o.x - GAP5, 0, OUT)), f12 = px(worldOn(fr, o.x - GAP5, o.y, OUT));\n          if (f0 && f12) {\n            seg(f0, f12, \"ub-lab__opdimline\", true);\n            ext(c00, f12);\n          }\n          chip(\"y\", beside(f0, f12, oc), o.y + \" mm\", od);\n        } else chip(\"y\", null, \"\", od);\n        const l0 = px(worldOn(fr, 0, 60, OUT)), l1 = px(worldOn(fr, o.x, 60, OUT));\n        if (l0 && l1 && o.x > 0) {\n          seg(l0, l1, \"ub-lab__opdimline\", true);\n          const fl = px(worldOn(fr, o.x, o.kind === \"door\" ? 0 : o.y, OUT));\n          if (fl) ext(fl, l1);\n        }\n        chip(\"x\", beside(l0, l1, oc), o.x + \" mm\", od);\n      } else dimLayer.hidden = true;\n      bShow.hidden = seen;\n      const grips = seen && o0.kind === \"window\" && !(ctx.openingDrag && ctx.openingDrag.dragging());\n      for (const edge of [\"left\", \"right\"]) {\n        const hb = handles[edge];\n        const p = grips ? px(worldOn(fr, edge === \"left\" ? o.x : o.x + o.w, o.y + o.h / 2, 0)) : null;\n        if (!p) {\n          if (!hb.hidden) hb.hidden = true;\n          continue;\n        }\n        hb.hidden = false;\n        hb.style.left = (p.x + od.dx).toFixed(1) + \"px\";\n        hb.style.top = (p.y + od.dy).toFixed(1) + \"px\";\n      }\n      bar.hidden = false;\n      const dom = domObstacles(), tools = dom.filter((q) => q.tool);\n      const bw = bar.offsetWidth || (armed ? 128 : 76) + (seen ? 0 : 52), bh = bar.offsetHeight || 26, M = 4;\n      const clampX = (v) => Math.min(Math.max(M, v), Math.max(M, cs.w - bw - M));\n      const clampY = (v) => Math.min(Math.max(M, v), Math.max(M, cs.h - bh - M));\n      let bb = null;\n      if (seen) {\n        const xs = [c00.x, c10.x, c01.x, c11.x], ys = [c00.y, c10.y, c01.y, c11.y];\n        bb = { x0: Math.min(...xs) - 6, x1: Math.max(...xs) + 6, y0: Math.min(...ys) - 6, y1: Math.max(...ys) + 6 };\n      }\n      const cands = [];\n      const ax = bb ? bb.x1 : M + 60, ay = bb ? bb.y0 : cs.h - bh - 48;\n      if (bb) {\n        cands.push(\n          [bb.x1 - bw, bb.y0 - bh - 4],\n          [bb.x0, bb.y0 - bh - 4],\n          [bb.x1 + 4, bb.y0],\n          [bb.x0 - bw - 4, bb.y0],\n          [bb.x1 - bw, bb.y1 + 4],\n          [bb.x0, bb.y1 + 4],\n          [bb.x1 - bw - 4, bb.y0 + 4],\n          [bb.x0 + 4, bb.y0 + 4]\n        );\n        const gy0 = Math.max(M, bb.y0 - 140), gy1 = Math.min(cs.h - bh - M, bb.y1 + 140), gx0 = Math.max(M, bb.x0 - 160), gx1 = Math.min(cs.w - bw - M, bb.x1 + 160);\n        const step = Math.max(8, Math.ceil(Math.sqrt(Math.max(1, (gx1 - gx0) * (gy1 - gy0)) / 6e3)));\n        for (let gy = gy0; gy <= gy1; gy += step) for (let gx = gx0; gx <= gx1; gx += step) cands.push([gx, gy]);\n      } else {\n        for (let gy = M; gy <= cs.h - bh - M; gy += 12) for (let gx = M; gx <= cs.w - bw - M; gx += 12) cands.push([gx, gy]);\n      }\n      let best = null;\n      for (const [cx0, cy0] of cands) {\n        const x0 = clampX(cx0), y0 = clampY(cy0), r = { x0, y0, x1: x0 + bw, y1: y0 + bh };\n        let score = 0;\n        for (const q of dom) score += (q.tool ? 4e3 : 4) * area(r, q);\n        for (const q of shown) score += 60 * area(r, q);\n        if (bb) score += 20 * area(r, bb);\n        score += 0.6 * Math.hypot(x0 + bw - ax, y0 + bh - ay);\n        if (!best || score < best.score - 0.01) best = { x: x0, y: y0, score };\n      }\n      const barR = { x0: best.x, y0: best.y, x1: best.x + bw, y1: best.y + bh };\n      bar.style.left = (best.x + od.dx).toFixed(1) + \"px\";\n      bar.style.top = (best.y + od.dy).toFixed(1) + \"px\";\n      const walls = [barR].concat(tools, bb ? [bb] : []);\n      const inView2 = (r) => r.x0 >= 0 && r.y0 >= 0 && r.x1 <= cs.w && r.y1 <= cs.h;\n      const grow3 = (r) => ({ x0: r.x0 - 1, x1: r.x1 + 1, y0: r.y0 - 1, y1: r.y1 + 1 });\n      const clear = (r, i) => {\n        const g3 = grow3(r);\n        return inView2(r) && !walls.some((b) => area(g3, b) > 0) && !shown.some((p, j) => j < i && area(g3, p) > 0);\n      };\n      let compact = !!(env2.summaryOnly && env2.summaryOnly());\n      for (let i = 0; i < shown.length && !compact; i++) {\n        const q = shown[i];\n        if (clear(q, i)) continue;\n        let moved = null;\n        for (let d = 3; d <= 140 && !moved; d += 3) {\n          for (const [dx, dy] of [[0, -d], [0, d], [-d, 0], [d, 0]]) {\n            const r = { x0: q.x0 + dx, x1: q.x1 + dx, y0: q.y0 + dy, y1: q.y1 + dy };\n            if (clear(r, i)) {\n              moved = [dx, dy];\n              break;\n            }\n          }\n        }\n        if (!moved) {\n          compact = true;\n          break;\n        }\n        q.x += moved[0];\n        q.y += moved[1];\n        q.x0 += moved[0];\n        q.x1 += moved[0];\n        q.y0 += moved[1];\n        q.y1 += moved[1];\n        q.el.style.left = (q.x + od.dx).toFixed(1) + \"px\";\n        q.el.style.top = (q.y + od.dy).toFixed(1) + \"px\";\n        q.el.classList.add(\"is-moved\");\n      }\n      let chipsOut = shown.map((q) => ({ k: q.k, x0: q.x0, x1: q.x1, y0: q.y0, y1: q.y1 }));\n      const useSum = compact && !!bb;\n      if (useSum) {\n        for (const q of shown) q.el.style.display = \"none\";\n        while (lines.firstChild) lines.removeChild(lines.firstChild);\n        const segs = [[\"w\", \"W \" + o.w], [\"h\", \"H \" + o.h]].concat(o.kind === \"window\" ? [[\"y\", \"sill \" + o.y]] : []).concat([[\"x\", o.x + \" from corner\"]]);\n        const text = segs.map((q) => q[1]).join(\" \\xB7 \") + \" mm\";\n        if (summaryChip.textContent !== text) {\n          summaryChip.textContent = \"\";\n          segs.forEach(([k, t], i) => {\n            if (i) summaryChip.appendChild(mk(\"span\", \"ub-lab__opsep\", { \"aria-hidden\": \"true\" }, \" \\xB7 \"));\n            summaryChip.appendChild(mk(\"button\", \"ub-lab__opseg\", {\n              type: \"button\",\n              \"data-ub-opseg\": k,\n              title: EDNAME[k] + \" - click to type an exact \" + WHAT[k],\n              \"aria-label\": EDNAME[k] + \" \" + o[k] + \" mm - click to type an exact \" + WHAT[k]\n            }, t));\n          });\n          summaryChip.appendChild(mk(\"span\", \"ub-lab__opsep\", { \"aria-hidden\": \"true\" }, \" mm\"));\n        }\n        for (const b of summaryChip.querySelectorAll(\"[data-ub-opseg]\")) b.classList.toggle(\"is-editing\", !!(st.edit && st.edit.k === b.getAttribute(\"data-ub-opseg\")));\n        summaryChip.style.display = \"\";\n        const lDock = Math.max(0, ...tools.filter((q) => q.x0 < cs.w / 3 && q.y1 - q.y0 > 60).map((q) => q.x1));\n        const rDock = Math.min(cs.w, ...tools.filter((q) => q.x1 > cs.w * 2 / 3 && q.y1 - q.y0 > 60).map((q) => q.x0));\n        const band = Math.max(120, rDock - lDock - 12);\n        summaryChip.style.whiteSpace = \"\";\n        summaryChip.style.maxWidth = \"\";\n        summaryChip.style.width = \"\";\n        const natural = summaryChip.offsetWidth || text.length * 6 + 10;\n        if (natural > band) {\n          summaryChip.style.whiteSpace = \"normal\";\n          summaryChip.style.maxWidth = band + \"px\";\n          summaryChip.style.width = \"max-content\";\n        }\n        const nLines = natural > band ? Math.ceil(natural / band) : 1;\n        const sw = natural > band ? Math.min(summaryChip.offsetWidth || band, band) : natural, sh = summaryChip.offsetHeight || 16 * nLines;\n        const spots = [[(bb.x0 + bb.x1) / 2, bb.y1 + sh / 2 + 6], [(bb.x0 + bb.x1) / 2, bb.y0 - sh / 2 - 6], [bb.x0 - sw / 2 - 6, (bb.y0 + bb.y1) / 2], [bb.x1 + sw / 2 + 6, (bb.y0 + bb.y1) / 2]];\n        for (let gy = sh / 2 + 2; gy <= cs.h - sh / 2 - 2; gy += 12) for (let gx = sw / 2 + 2; gx <= cs.w - sw / 2 - 2; gx += 12) spots.push([gx, gy]);\n        const ox2 = (bb.x0 + bb.x1) / 2, oy2 = (bb.y0 + bb.y1) / 2;\n        let at = null, atScore = Infinity;\n        for (let i = 0; i < spots.length; i++) {\n          const [sx, sy] = spots[i];\n          const cx = Math.min(Math.max(sw / 2 + 2, sx), cs.w - sw / 2 - 2), cy = Math.min(Math.max(sh / 2 + 2, sy), cs.h - sh / 2 - 2);\n          const r = { x0: cx - sw / 2, x1: cx + sw / 2, y0: cy - sh / 2, y1: cy + sh / 2 };\n          let sc = i < 4 ? 0 : 1e3 + Math.hypot(cx - ox2, cy - oy2);\n          for (const b of walls) sc += 1e6 * area(r, b);\n          if (sc < atScore) {\n            at = r;\n            atScore = sc;\n          }\n        }\n        summaryChip.style.left = ((at.x0 + at.x1) / 2 + od.dx).toFixed(1) + \"px\";\n        summaryChip.style.top = ((at.y0 + at.y1) / 2 + od.dy).toFixed(1) + \"px\";\n        chipsOut = [{ k: \"sum\", x0: at.x0, x1: at.x1, y0: at.y0, y1: at.y1 }];\n      } else summaryChip.style.display = \"none\";\n      st.layout = { bar: barR, opening: bb, chips: chipsOut, compact: useSum, docks: tools, seen };\n      st.anchors = {};\n      if (seen) {\n        for (const k of [\"w\", \"h\", \"y\", \"x\"]) {\n          if (useSum) {\n            const b = summaryChip.querySelector('[data-ub-opseg=\"' + k + '\"]');\n            if (!b) continue;\n            const sr = probe.getBoundingClientRect ? probe.getBoundingClientRect() : null, r = b.getBoundingClientRect ? b.getBoundingClientRect() : null;\n            st.anchors[k] = sr && r && r.width > 0 ? { x: r.left - sr.left + r.width / 2, y: r.top - sr.top + r.height / 2, h: r.height } : { x: parseFloat(summaryChip.style.left) || 0, y: parseFloat(summaryChip.style.top) || 0, h: 16 };\n          } else {\n            const q = shown.find((p) => p.k === k);\n            if (q) st.anchors[k] = { x: q.x + od.dx, y: q.y + od.dy, h: q.h };\n          }\n        }\n      }\n      const holdX = (v, w) => Math.min(Math.max(od.dx + w / 2 + 2, v), od.dx + cs.w - w / 2 - 2);\n      const holdY = (v, h) => Math.min(Math.max(od.dy + h / 2 + 2, v), od.dy + cs.h - h / 2 - 2);\n      if (st.edit) {\n        const a = st.anchors[st.edit.k];\n        if (!a) {\n          st.edit = null;\n          ed.hidden = true;\n          ed.removeAttribute(\"data-ub-opedk\");\n        } else {\n          const ew = ed.offsetWidth || 150, eh = ed.offsetHeight || 28;\n          const ex = holdX(a.x, ew), ey = holdY(a.y, eh);\n          ed.style.left = ex.toFixed(1) + \"px\";\n          ed.style.top = ey.toFixed(1) + \"px\";\n          st.layout.editor = { k: st.edit.k, x0: ex - ew / 2 - od.dx, x1: ex + ew / 2 - od.dx, y0: ey - eh / 2 - od.dy, y1: ey + eh / 2 - od.dy };\n        }\n      }\n      if (st.err) {\n        const a = st.anchors[st.err.k];\n        if (!a) errEl.hidden = true;\n        else {\n          errEl.hidden = false;\n          const ew = errEl.offsetWidth || 220, eh = errEl.offsetHeight || 22;\n          const ey = a.y + a.h / 2 + 4 + eh > od.dy + cs.h ? a.y - a.h / 2 - 4 - eh : a.y + a.h / 2 + 4;\n          errEl.style.left = holdX(a.x, ew).toFixed(1) + \"px\";\n          errEl.style.top = Math.max(od.dy, ey).toFixed(1) + \"px\";\n        }\n      }\n    }\n    return {\n      draw,\n      bar,\n      dims: dimLayer,\n      editor: ed,\n      refusal: errEl,\n      edit: (k) => edOpen(k),\n      editing: () => st.edit ? st.edit.k : null,\n      layout: () => st.layout,\n      handles: () => handles,\n      catalog: () => catalog,\n      boilerCatalog: () => boilerCatalog,\n      remove: () => {\n        for (const n of [dimLayer, probe, bar, ed, errEl, handles.left, handles.right]) n.remove();\n      }\n    };\n  }\n\n  // v2/src/interact/splash-piece-dom.js\n  var EDGES = [\"left\", \"right\", \"top\", \"bottom\"];\n  var MOVE_PX7 = 6;\n  function gripCentres(pts, lo, hi, out) {\n    const mid = (a, b) => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 });\n    const at = { [lo]: mid(pts[0], pts[3]), [hi]: mid(pts[1], pts[2]), bottom: mid(pts[0], pts[1]), top: mid(pts[2], pts[3]) };\n    if (out > 0) {\n      const cx = (pts[0].x + pts[1].x + pts[2].x + pts[3].x) / 4, cy = (pts[0].y + pts[1].y + pts[2].y + pts[3].y) / 4;\n      for (const e of EDGES) {\n        const g2 = at[e], dx = g2.x - cx, dy = g2.y - cy, L = Math.hypot(dx, dy);\n        if (L > 1e-6) at[e] = { x: g2.x + dx / L * out, y: g2.y + dy / L * out };\n      }\n    }\n    return at;\n  }\n  function createSplashPieceDom(ia, env2) {\n    const ctx = ia.ctx, scene = ia.scene, root = env2.root, canvas = env2.canvas;\n    const doc2 = root && root.ownerDocument || env2.doc;\n    const win2 = doc2 && doc2.defaultView;\n    const D2 = ctx.splashDrag;\n    if (!root || !canvas || !doc2 || !D2) return null;\n    const stage = canvas.parentNode || root;\n    const NS7 = \"http://www.w3.org/2000/svg\";\n    const mk = (tag, cls, attrs) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      for (const k in attrs || {}) e.setAttribute(k, attrs[k]);\n      return e;\n    };\n    const run = (name2, args) => ia.commands.run(name2, args);\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    const svg2 = doc2.createElementNS(NS7, \"svg\");\n    svg2.setAttribute(\"class\", \"ub-lab__spsel\");\n    svg2.setAttribute(\"aria-hidden\", \"true\");\n    svg2.setAttribute(\"data-ub-spsel\", \"\");\n    const poly = doc2.createElementNS(NS7, \"polygon\");\n    svg2.appendChild(poly);\n    svg2.style.display = \"none\";\n    stage.appendChild(svg2);\n    const grips = {};\n    for (const edge of EDGES) {\n      const b = mk(\"button\", \"ub-lab__spgrip ub-lab__spgrip--\" + edge, {\n        type: \"button\",\n        \"data-ub-spgrip\": edge,\n        \"aria-label\": \"Splashback \" + edge + \" edge - drag to \" + (edge === \"left\" || edge === \"right\" ? \"change the width\" : \"change the height\") + \"; arrow keys move it 10 mm\",\n        title: \"Drag this edge - the opposite edge stays\"\n      });\n      b.hidden = true;\n      stage.appendChild(b);\n      grips[edge] = b;\n      for (const t of [\"mousedown\", \"dblclick\", \"click\"]) b.addEventListener(t, stop);\n      b.addEventListener(\"touchstart\", stop, { passive: true });\n      b.addEventListener(\"pointerdown\", (e) => {\n        stop(e);\n        if (e.button != null && e.button !== 0) return;\n        if (!scene.splashSel || !D2.edgeStart(scene.splashSel, edge)) return;\n        if (e.preventDefault) e.preventDefault();\n        try {\n          b.setPointerCapture(e.pointerId);\n        } catch {\n        }\n        b.classList.add(\"is-dragging\");\n      });\n      b.addEventListener(\"pointermove\", (e) => {\n        if (D2.sizing()) {\n          if (e.preventDefault) e.preventDefault();\n          D2.edgeMove(e.clientX, e.clientY);\n          draw();\n        }\n      });\n      const end = (e) => {\n        if (D2.sizing()) {\n          if (e && e.type === \"pointercancel\") D2.cancel();\n          else D2.edgeEnd();\n        }\n        b.classList.remove(\"is-dragging\");\n        draw();\n      };\n      b.addEventListener(\"pointerup\", end);\n      b.addEventListener(\"pointercancel\", end);\n      b.addEventListener(\"lostpointercapture\", () => {\n        if (D2.sizing()) D2.edgeEnd();\n        b.classList.remove(\"is-dragging\");\n        draw();\n      });\n      b.addEventListener(\"keydown\", (e) => {\n        const k = e.key, q = selected2();\n        if (!q || [\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].indexOf(k) < 0) return;\n        e.preventDefault();\n        stop(e);\n        const sgn = alongSign(q.wall), d = k === \"ArrowRight\" || k === \"ArrowUp\" ? 10 : -10;\n        const a = {};\n        if (edge === \"left\" || edge === \"right\") {\n          const key = edge === \"left\" === sgn > 0 ? \"a0\" : \"a1\";\n          a[key] = q[key] + (k === \"ArrowLeft\" || k === \"ArrowRight\" ? d * sgn : 0);\n        } else a[edge === \"top\" ? \"y1\" : \"y0\"] = q[edge === \"top\" ? \"y1\" : \"y0\"] + (k === \"ArrowUp\" || k === \"ArrowDown\" ? d : 0);\n        run(\"setSplashPiece\", Object.assign({ id: q.id }, a));\n        draw();\n      });\n    }\n    function selected2() {\n      return scene.splashSel ? D2.pieces().find((q) => q.id === scene.splashSel) || null : null;\n    }\n    function alongSign(wall) {\n      const fr = wallFrame(wall, roomSize(), scene.room || null);\n      return fr ? Math.abs(fr.dir[0]) > 0.5 ? fr.dir[0] : fr.dir[1] : 1;\n    }\n    function wpt(q, a, y) {\n      const w = pieceWall(q.wall);\n      if (!w) return null;\n      const t = splashOf(scene.kitchen).kind === \"glass\" ? 6 : 8, f = w.at + w.sign * t;\n      return w.axis === \"z\" ? [a, y, f] : [f, y, a];\n    }\n    function draw() {\n      syncList();\n      const q = selected2();\n      const hideAll = () => {\n        svg2.style.display = \"none\";\n        for (const e of EDGES) grips[e].hidden = true;\n      };\n      if (!q || scene.measureOn) {\n        hideAll();\n        syncRow(null);\n        return;\n      }\n      const pts = [[q.a0, q.y0], [q.a1, q.y0], [q.a1, q.y1], [q.a0, q.y1]].map(([a, y]) => clientOfWorld(ctx, wpt(q, a, y)));\n      if (pts.some((p) => !p)) {\n        hideAll();\n        syncRow(q);\n        return;\n      }\n      const cs = ctx.canvasSize ? ctx.canvasSize() : { w: canvas.clientWidth, h: canvas.clientHeight };\n      svg2.setAttribute(\"width\", cs.w);\n      svg2.setAttribute(\"height\", cs.h);\n      svg2.style.display = \"\";\n      poly.setAttribute(\"points\", pts.map((p) => p.x.toFixed(1) + \",\" + p.y.toFixed(1)).join(\" \"));\n      const sgn = alongSign(q.wall), lo = sgn > 0 ? \"left\" : \"right\", hi = sgn > 0 ? \"right\" : \"left\";\n      let coarse = false;\n      try {\n        coarse = !!(win2 && win2.matchMedia && win2.matchMedia(\"(pointer: coarse)\").matches);\n      } catch {\n        coarse = false;\n      }\n      const touch = cs.w <= 640 || coarse;\n      const at = gripCentres(pts, lo, hi, touch ? grips.top.offsetWidth || 22 : 0);\n      for (const e of EDGES) {\n        const g2 = grips[e], p = at[e];\n        g2.hidden = false;\n        g2.style.left = p.x + \"px\";\n        g2.style.top = p.y + \"px\";\n      }\n      syncRow(q);\n    }\n    const strip = root.querySelector('[data-ub-flyout=\"splash\"] [data-ub-tbody]') || root.querySelector('[data-ub-flyout=\"splash\"]');\n    let addBtn = root.querySelector(\"[data-ub-spadd]\"), row = root.querySelector(\"[data-ub-sppiece]\");\n    if (strip && !addBtn) {\n      addBtn = mk(\"button\", \"ub-lab__btn ub-lab__spadd\", {\n        type: \"button\",\n        \"data-ub-spadd\": \"\",\n        title: \"Drag onto a wall in the view: a splashback piece there\",\n        \"aria-label\": \"Add a splashback piece - drag it onto a wall\"\n      });\n      addBtn.innerHTML = '<span class=\"ub-lab__spaddsw\" aria-hidden=\"true\"></span><span>Add piece</span>';\n      strip.insertBefore(addBtn, strip.firstChild);\n    }\n    let list = root.querySelector(\"[data-ub-splist]\"), listSig = null;\n    if (strip && !list) {\n      list = mk(\"div\", \"ub-lab__splist\", { \"data-ub-splist\": \"\", role: \"group\", \"aria-label\": \"Splashback pieces - choose one\" });\n      list.hidden = true;\n      if (addBtn && addBtn.nextSibling) strip.insertBefore(list, addBtn.nextSibling);\n      else strip.appendChild(list);\n      list.addEventListener(\"click\", (e) => {\n        const b = e.target && e.target.closest ? e.target.closest(\"[data-ub-spchip]\") : null;\n        if (!b || !list.contains(b)) return;\n        stop(e);\n        const id = b.getAttribute(\"data-ub-spchip\");\n        if (!D2.pieces().some((q2) => q2.id === id)) return;\n        if (D2.select) D2.select(id);\n        else {\n          scene.splashSel = id;\n          ctx.syncControls();\n          ctx.refresh();\n        }\n        const q = selected2();\n        if (q && ctx.cue) ctx.cue(\"Splashback \" + q.id + \" selected - pull an edge, drag it, or type its sizes below\");\n        draw();\n      });\n    }\n    function syncList() {\n      if (!list) return;\n      const ps = D2.pieces(), sel = scene.splashSel || null;\n      const sig = ps.map((q) => q.id + \":\" + q.wall).join(\",\") + \"|\" + sel;\n      if (sig === listSig) return;\n      listSig = sig;\n      list.hidden = ps.length === 0;\n      list.textContent = \"\";\n      for (const q of ps) {\n        const b = mk(\"button\", \"ub-lab__btn ub-lab__spchip\", {\n          type: \"button\",\n          \"data-ub-spchip\": q.id,\n          \"aria-pressed\": q.id === sel ? \"true\" : \"false\",\n          \"aria-label\": \"Splashback piece \" + q.id + \" on the \" + q.wall + \" wall\"\n        });\n        b.textContent = q.id + \" \\xB7 \" + q.wall;\n        list.appendChild(b);\n      }\n    }\n    const F = {};\n    if (strip && !row) {\n      row = mk(\"div\", \"ub-lab__sppiece\", { \"data-ub-sppiece\": \"\", role: \"group\", \"aria-label\": \"Selected splashback piece\" });\n      const lab = mk(\"span\", \"ub-lab__sppiecelab\", { \"data-ub-sppiecelab\": \"\" });\n      row.appendChild(lab);\n      for (const [k, name2] of [[\"w\", \"Width\"], [\"h\", \"Height\"], [\"from\", \"From\"], [\"bottom\", \"Bottom\"]]) {\n        const l = mk(\"label\", \"ub-lab__dbox ub-lab__spfield\");\n        const s = mk(\"span\", \"ub-lab__wtlab\");\n        s.textContent = name2;\n        const i = mk(\"input\", \"\", { type: \"number\", inputmode: \"numeric\", step: \"10\", \"data-ub-spmm\": k, \"aria-label\": \"Splashback piece \" + name2.toLowerCase() + \", mm\" });\n        l.appendChild(s);\n        l.appendChild(i);\n        row.appendChild(l);\n        F[k] = i;\n        i.addEventListener(\"change\", () => {\n          const q = selected2();\n          if (!q) return;\n          const v = Number(i.value);\n          if (!Number.isFinite(v)) {\n            syncRow(q);\n            return;\n          }\n          const a = { id: q.id };\n          if (k === \"w\") a.w = v;\n          else if (k === \"h\") a.h = v;\n          else if (k === \"from\") {\n            a.a0 = v;\n            a.a1 = v + (q.a1 - q.a0);\n          } else {\n            a.y0 = v;\n            a.y1 = v + (q.y1 - q.y0);\n          }\n          const r = run(\"setSplashPiece\", a);\n          if (r && r.ok === false && r.why !== \"unchanged\") syncRow(q);\n          draw();\n        });\n        i.addEventListener(\"keydown\", (e) => {\n          if (e.key === \"Enter\" && i.blur) i.blur();\n          stop(e);\n        });\n      }\n      const rm = mk(\"button\", \"ub-lab__btn ub-lab__sprm\", { type: \"button\", \"data-ub-sprm\": \"\", \"aria-label\": \"Remove this splashback piece\" });\n      rm.textContent = \"Remove\";\n      rm.addEventListener(\"click\", () => {\n        const q = selected2();\n        if (!q) return;\n        run(\"removeSplashPiece\", { id: q.id });\n        scene.splashSel = null;\n        ctx.syncControls();\n        ctx.refresh();\n        draw();\n      });\n      row.appendChild(rm);\n      row.hidden = true;\n      strip.appendChild(row);\n    }\n    function syncRow(q) {\n      if (!row) return;\n      row.hidden = !q;\n      if (!q) return;\n      const lab = row.querySelector(\"[data-ub-sppiecelab]\");\n      if (lab) lab.textContent = q.id + \" \\xB7 \" + q.wall;\n      const vals = { w: q.a1 - q.a0, h: q.y1 - q.y0, from: q.a0, bottom: q.y0 };\n      for (const k in F) if (doc2.activeElement !== F[k]) F[k].value = String(vals[k]);\n    }\n    let dg = null, eatClick = 0;\n    const onDown = (e) => {\n      const b = e.target && e.target.closest ? e.target.closest(\"[data-ub-spadd]\") : null;\n      if (!b || !root.contains(b) || e.button != null && e.button !== 0 || e.isPrimary === false) return;\n      e.preventDefault();\n      dg = { b, x0: e.clientX, y0: e.clientY, moved: false, pid: e.pointerId, last: null, ls: [] };\n      const mv = (ev) => {\n        if (!dg || dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (ev.isTrusted === true && ev.pointerType === \"mouse\" && ev.buttons === 0) {\n          finish3(ev, false);\n          return;\n        }\n        if (!dg.moved && Math.hypot(ev.clientX - dg.x0, ev.clientY - dg.y0) < MOVE_PX7) return;\n        if (!dg.moved) {\n          dg.moved = true;\n          b.classList.add(\"is-dragging\");\n        }\n        ev.preventDefault();\n        const h = overCanvas(ev.clientX, ev.clientY) ? D2.wallAt(ev.clientX, ev.clientY) : null;\n        dg.last = h;\n        ctx.cue(h ? \"Let go: a splashback piece on this wall here\" : \"Carry it onto a wall in the view\");\n      };\n      const upF = (ev) => {\n        if (dg && dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (dg && dg.moved) ev.stopPropagation();\n        finish3(ev, true);\n      };\n      const cancelF = (ev) => finish3(ev, false);\n      const keyF = (ev) => {\n        if (ev.key === \"Escape\") {\n          ev.stopPropagation();\n          finish3(ev, false);\n        }\n      };\n      dg.ls = [[\"pointermove\", mv], [\"pointerup\", upF], [\"pointercancel\", cancelF], [\"keydown\", keyF], [\"blur\", cancelF]];\n      for (const [t, f] of dg.ls) win2.addEventListener(t, f, true);\n    };\n    const overCanvas = (x, y) => {\n      const el = doc2.elementFromPoint ? doc2.elementFromPoint(x, y) : null;\n      return el === canvas;\n    };\n    function finish3(e, drop) {\n      const g2 = dg;\n      if (!g2) return;\n      dg = null;\n      for (const [t, f] of g2.ls) win2.removeEventListener(t, f, true);\n      g2.b.classList.remove(\"is-dragging\");\n      if (!g2.moved) return;\n      eatClick = Date.now() + 400;\n      if (!drop) {\n        ctx.cue(\"Nothing added\");\n        return;\n      }\n      let h = e && overCanvas(e.clientX, e.clientY) ? D2.wallAt(e.clientX, e.clientY) : null;\n      if (!h) h = g2.last;\n      if (!h) {\n        ctx.cue(\"Nothing added - let go of it on a wall in the view\");\n        return;\n      }\n      const r = run(\"addSplashPiece\", { wall: h.wall, at: Math.round(h.a) });\n      if (r && r.ok && r.piece) {\n        scene.splashSel = r.piece.id;\n        ctx.syncControls();\n        ctx.refresh();\n        draw();\n      }\n    }\n    if (win2) {\n      root.addEventListener(\"pointerdown\", onDown, true);\n      root.addEventListener(\"click\", (e) => {\n        const b = e.target && e.target.closest ? e.target.closest(\"[data-ub-spadd]\") : null;\n        if (!b) return;\n        if (Date.now() < eatClick) {\n          e.stopPropagation();\n          e.preventDefault();\n          eatClick = 0;\n          return;\n        }\n        ctx.cue(\"Drag \\xABAdd piece\\xBB onto a wall in the view - it covers only where you let go\");\n      }, true);\n    }\n    return { draw, grips, outline: svg2, row, add: addBtn };\n  }\n\n  // v2/src/interact/hood-dom.js\n  var FINGER_REACH = 24;\n  function createHoodDom(ia, env2) {\n    const ctx = ia.ctx, scene = ia.scene, root = env2.root, canvas = env2.canvas;\n    const doc2 = root && root.ownerDocument || env2.doc;\n    const D2 = ctx.hoodDrag;\n    if (!root || !canvas || !doc2 || !D2) return null;\n    const stage = canvas.parentNode || root;\n    const NS7 = \"http://www.w3.org/2000/svg\";\n    const svg2 = doc2.createElementNS(NS7, \"svg\");\n    svg2.setAttribute(\"class\", \"ub-lab__hoodsel\");\n    svg2.setAttribute(\"aria-hidden\", \"true\");\n    svg2.setAttribute(\"data-ub-hoodsel\", \"\");\n    const poly = doc2.createElementNS(NS7, \"rect\");\n    svg2.appendChild(poly);\n    svg2.style.display = \"none\";\n    stage.appendChild(svg2);\n    const card = doc2.createElement(\"div\");\n    card.className = \"ub-lab__hoodcard\";\n    card.setAttribute(\"data-ub-hoodcard\", \"\");\n    card.setAttribute(\"role\", \"group\");\n    card.setAttribute(\"aria-label\", \"Selected extractor hood\");\n    card.hidden = true;\n    const name2 = doc2.createElement(\"div\");\n    name2.className = \"ub-lab__hoodname\";\n    name2.textContent = APPLIANCES.hood.model;\n    const lab = doc2.createElement(\"label\");\n    lab.className = \"ub-lab__dbox ub-lab__hoodfield\";\n    const ls = doc2.createElement(\"span\");\n    ls.textContent = \"Height above hob, mm\";\n    const inp = doc2.createElement(\"input\");\n    inp.type = \"number\";\n    inp.setAttribute(\"inputmode\", \"numeric\");\n    inp.step = \"10\";\n    inp.setAttribute(\"data-ub-hoodmm\", \"\");\n    inp.setAttribute(\"aria-label\", \"Hood height above the hob glass, mm\");\n    lab.appendChild(ls);\n    lab.appendChild(inp);\n    const lab2 = doc2.createElement(\"label\");\n    lab2.className = \"ub-lab__dbox ub-lab__hoodfield\";\n    const ls2 = doc2.createElement(\"span\");\n    ls2.textContent = \"Along the wall, mm (+ right)\";\n    const inpX = doc2.createElement(\"input\");\n    inpX.type = \"number\";\n    inpX.setAttribute(\"inputmode\", \"numeric\");\n    inpX.step = \"10\";\n    inpX.setAttribute(\"data-ub-hooddx\", \"\");\n    inpX.setAttribute(\"aria-label\", \"Hood offset along the wall from centred over the hob, mm\");\n    lab2.appendChild(ls2);\n    lab2.appendChild(inpX);\n    const range = doc2.createElement(\"div\");\n    range.className = \"ub-lab__hoodrange\";\n    range.setAttribute(\"data-ub-hoodrange\", \"\");\n    const note = doc2.createElement(\"div\");\n    note.className = \"ub-lab__hoodrange\";\n    note.setAttribute(\"data-ub-hoodnote\", \"\");\n    card.appendChild(name2);\n    card.appendChild(lab);\n    card.appendChild(lab2);\n    card.appendChild(range);\n    card.appendChild(note);\n    stage.appendChild(card);\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    for (const t of [\"mousedown\", \"pointerdown\", \"click\", \"dblclick\", \"wheel\"]) card.addEventListener(t, stop, t === \"wheel\" ? { passive: true } : void 0);\n    card.addEventListener(\"touchstart\", stop, { passive: true });\n    const selected2 = () => scene.hoodSel ? D2.hoods().find((h) => h.id === scene.hoodSel) || null : null;\n    for (const [el, key] of [[inp, \"above\"], [inpX, \"dx\"]]) {\n      el.addEventListener(\"change\", () => {\n        const h = selected2();\n        if (!h) return;\n        const r = ia.commands.run(\"setHood\", { id: h.id, [key]: Number(el.value) });\n        if (!r || r.ok === false) {\n          inp.value = String(hoodAbove(h.u));\n          inpX.value = String(hoodDx(h.u));\n        }\n        draw();\n      });\n      el.addEventListener(\"keydown\", (e) => {\n        if (e.key === \"Enter\" && el.blur) el.blur();\n        stop(e);\n      });\n    }\n    function draw() {\n      const h = selected2();\n      if (!h || scene.measureOn) {\n        svg2.style.display = \"none\";\n        card.hidden = true;\n        return;\n      }\n      let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity, ok2 = true;\n      for (const b of h.boxes) for (const x of [b.x0, b.x1]) for (const y of [b.y0, b.y1]) for (const z of [b.z0, b.z1]) {\n        const p = clientOfWorld(ctx, [x, y, z]);\n        if (!p) {\n          ok2 = false;\n          continue;\n        }\n        x0 = Math.min(x0, p.x);\n        x1 = Math.max(x1, p.x);\n        y0 = Math.min(y0, p.y);\n        y1 = Math.max(y1, p.y);\n      }\n      const R4 = hoodHeightRange(h.u, scene.kitchen, scene.room), RX = hoodDxRange(h.u, scene.kitchen, scene.room, unitXf(h.u), roomSize());\n      if (doc2.activeElement !== inp) inp.value = String(hoodAbove(h.u));\n      if (doc2.activeElement !== inpX) inpX.value = String(hoodDx(h.u));\n      range.textContent = R4 ? \"Height \" + R4.min + (R4.max != null ? \"-\" + R4.max : \"+\") + \" mm (\" + HOOD_SRC + \" 13.3\" + (R4.max != null ? \", 13.2 under this ceiling\" : \"\") + \"); along the wall \" + (RX && RX.min != null ? RX.min + \" to \" + RX.max + \" mm (this room)\" : \"no limit known (no room stated)\") : \"\";\n      const ns = hoodNotes(h.u);\n      note.textContent = ns.length ? ns[0] : \"\";\n      note.hidden = !ns.length;\n      const tip = APPLIANCES.hood.model + \" - \" + range.textContent + (ns.length ? \" \" + ns[0] : \"\");\n      if (card.title !== tip) card.title = tip;\n      card.hidden = false;\n      if (!ok2 || !(x1 > x0)) {\n        svg2.style.display = \"none\";\n        return;\n      }\n      const cs = ctx.canvasSize ? ctx.canvasSize() : { w: canvas.clientWidth, h: canvas.clientHeight };\n      svg2.setAttribute(\"width\", cs.w);\n      svg2.setAttribute(\"height\", cs.h);\n      svg2.style.display = \"\";\n      const box3 = { x0: Math.floor(x0 - 3), y0: Math.floor(y0 - 3), x1: Math.ceil(x1 + 3), y1: Math.ceil(y1 + 3) };\n      poly.setAttribute(\"x\", String(box3.x0));\n      poly.setAttribute(\"y\", String(box3.y0));\n      poly.setAttribute(\"width\", String(box3.x1 - box3.x0));\n      poly.setAttribute(\"height\", String(box3.y1 - box3.y0));\n      const maxW = Math.max(120, Math.min(260, cs.w - 8));\n      if (card.style.maxWidth !== maxW + \"px\") card.style.maxWidth = maxW + \"px\";\n      let coarse = false;\n      try {\n        const w = doc2.defaultView;\n        coarse = !!(w && w.matchMedia && w.matchMedia(\"(pointer: coarse)\").matches);\n      } catch {\n        coarse = false;\n      }\n      const G = cs.w <= 640 || coarse ? FINGER_REACH : 4;\n      const compact = cs.w <= 640;\n      if (card.classList.contains(\"is-compact\") !== compact) {\n        card.classList.toggle(\"is-compact\", compact);\n        ls.textContent = compact ? \"Height\" : \"Height above hob, mm\";\n        ls2.textContent = compact ? \"Along\" : \"Along the wall, mm (+ right)\";\n      }\n      const cw = Math.min(card.offsetWidth || 170, maxW), chh = card.offsetHeight || 80, M = 4;\n      const clampX = (v) => Math.max(M, Math.min(cs.w - cw - M, v)), clampY = (v) => Math.max(M, Math.min(cs.h - chh - M, v));\n      const midY = (box3.y0 + box3.y1) / 2 - chh / 2, midX = (box3.x0 + box3.x1) / 2 - cw / 2;\n      const cands = [[Math.ceil(box3.x1 + G), Math.round(clampY(midY))], [Math.floor(box3.x0 - G - cw), Math.round(clampY(midY))], [Math.round(clampX(midX)), Math.ceil(box3.y1 + G)], [Math.round(clampX(midX)), Math.floor(box3.y0 - G - chh)]];\n      const over = (l, t) => Math.max(0, Math.min(l + cw, box3.x1 + G) - Math.max(l, box3.x0 - G)) * Math.max(0, Math.min(t + chh, box3.y1 + G) - Math.max(t, box3.y0 - G));\n      const fits2 = (l, t) => l >= M - 1e-6 && t >= M - 1e-6 && l + cw <= cs.w - M + 1e-6 && t + chh <= cs.h - M + 1e-6;\n      const cr = canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : { left: 0, top: 0 };\n      const ctrl = [];\n      if (root.querySelectorAll) for (const e of root.querySelectorAll('.ub-lab__dock button, .ub-lab__dock [role=\"button\"], .ub-lab__dock input, .ub-lab__dock select, [data-ub-chef-btn]')) {\n        if (e.hidden || e.offsetParent === null || card.contains(e)) continue;\n        const q = e.getBoundingClientRect();\n        if (!(q.width > 0 && q.height > 0)) continue;\n        const b = { x0: q.left - cr.left - 2, y0: q.top - cr.top - 2, x1: q.right - cr.left + 2, y1: q.bottom - cr.top + 2 };\n        if (b.x1 > 0 && b.x0 < cs.w && b.y1 > 0 && b.y0 < cs.h) ctrl.push(b);\n      }\n      const cabs = [];\n      for (const u of scene.units || []) {\n        const A = unitAABB(u);\n        let b = null;\n        for (const x of [A.x0, A.x1]) for (const y of [A.y0, A.y1]) for (const z of [A.z0, A.z1]) {\n          const p = clientOfWorld(ctx, [x, y, z]);\n          if (!p) continue;\n          b = b ? { x0: Math.min(b.x0, p.x), y0: Math.min(b.y0, p.y), x1: Math.max(b.x1, p.x), y1: Math.max(b.y1, p.y) } : { x0: p.x, y0: p.y, x1: p.x, y1: p.y };\n        }\n        if (b) cabs.push(b);\n      }\n      const inter = (l, t, b) => Math.max(0, Math.min(l + cw, b.x1) - Math.max(l, b.x0)) * Math.max(0, Math.min(t + chh, b.y1) - Math.max(t, b.y0));\n      const cost = (l, t) => {\n        let c = over(l, t) * 1e6;\n        for (const b of ctrl) c += inter(l, t, b) * 1e3;\n        for (const b of cabs) c += inter(l, t, b);\n        return c;\n      };\n      const all = cands.filter(([l, t]) => fits2(l, t));\n      for (let t = M; t + chh <= cs.h - M; t += 8) for (let l = M; l + cw <= cs.w - M; l += 8) all.push([l, t]);\n      let best = null, bc = Infinity;\n      for (const [l, t] of all) {\n        const c = cost(l, t);\n        if (c < bc - 1e-9) {\n          bc = c;\n          best = [l, t];\n        }\n      }\n      if (!best) best = [clampX(cands[0][0]), clampY(cands[0][1])];\n      card.style.left = best[0] + \"px\";\n      card.style.top = best[1] + \"px\";\n    }\n    return { draw, card, outline: svg2, input: inp };\n  }\n\n  // v2/src/interact/hover-tip.js\n  function createHoverTip(ia, env2) {\n    const root = env2.root, canvas = env2.canvas;\n    const scene = ia.scene, ctx = ia.ctx;\n    const stage = canvas && canvas.parentNode;\n    const doc2 = root.ownerDocument || env2.doc;\n    if (!stage || !doc2 || !canvas.addEventListener) return null;\n    const tip = doc2.createElement(\"div\");\n    tip.className = \"ub-lab__tip\";\n    tip.setAttribute(\"data-ub-hovername\", \"\");\n    tip.setAttribute(\"aria-hidden\", \"true\");\n    tip.hidden = true;\n    stage.appendChild(tip);\n    let last = 0;\n    function hide() {\n      if (!tip.hidden) tip.hidden = true;\n    }\n    function place2(e) {\n      const r = stage.getBoundingClientRect();\n      const w = tip.offsetWidth || 70, h = tip.offsetHeight || 20;\n      let x = e.clientX - r.left + 14, y = e.clientY - r.top + 16;\n      if (x + w > r.width - 6) x = e.clientX - r.left - w - 10;\n      if (y + h > r.height - 6) y = e.clientY - r.top - h - 10;\n      tip.style.left = Math.max(6, Math.min(x, r.width - w - 6)) + \"px\";\n      tip.style.top = Math.max(6, Math.min(y, r.height - h - 6)) + \"px\";\n    }\n    function markRow(id) {\n      const rows = root.querySelectorAll ? root.querySelectorAll(\"[data-ub-pick]\") : [];\n      for (let i = 0; i < rows.length; i++) rows[i].classList.toggle(\"is-hover\", !!id && rows[i].getAttribute(\"data-ub-pick\") === id);\n    }\n    function setHover(id) {\n      markRow(id || null);\n      if (scene.partsMode) return;\n      const want = id || null;\n      if (want === (scene.hoverPart || null)) return;\n      scene.hoverPart = want;\n      ctx.frame();\n    }\n    if (root.addEventListener) {\n      root.addEventListener(\"mouseover\", function(e) {\n        const row = e.target && e.target.closest ? e.target.closest(\"[data-ub-pick]\") : null;\n        if (row) setHover(row.getAttribute(\"data-ub-pick\"));\n      });\n      root.addEventListener(\"mouseout\", function(e) {\n        const row = e.target && e.target.closest ? e.target.closest(\"[data-ub-pick]\") : null;\n        const to = e.relatedTarget && e.relatedTarget.closest ? e.relatedTarget.closest(\"[data-ub-pick]\") : null;\n        if (row && row !== to) setHover(null);\n      });\n    }\n    canvas.addEventListener(\"mousemove\", function(e) {\n      if (e.buttons) {\n        hide();\n        return;\n      }\n      if (scene.insideTool) {\n        hide();\n        return;\n      }\n      if (scene.measureOn) {\n        hide();\n        return;\n      }\n      const now = Date.now();\n      if (now - last < 30) return;\n      last = now;\n      const id = ctx.pointer && ctx.pointer.pickAt ? ctx.pointer.pickAt(e.clientX, e.clientY) : null;\n      setHover(id);\n      const u = id && scene.units.find((v) => v.id === id);\n      if (!u || scene.explode > 0) {\n        hide();\n        return;\n      }\n      const name2 = displayName(scene.units, u);\n      if (tip.textContent !== name2) tip.textContent = name2;\n      tip.hidden = false;\n      place2(e);\n      canvas.style.cursor = scene.moveMode ? \"move\" : scene.sizeMode || scene.panMode ? \"\" : \"pointer\";\n    });\n    function out() {\n      hide();\n      setHover(null);\n      if (!scene.moveMode) canvas.style.cursor = \"\";\n    }\n    canvas.addEventListener(\"mouseleave\", out);\n    canvas.addEventListener(\"mousedown\", hide);\n    canvas.addEventListener(\"touchstart\", hide, { passive: true });\n    return { hide, el: tip, setHover };\n  }\n\n  // v2/src/interact/opening-drag-dom.js\n  function createOpeningDragDom(ia, opts) {\n    const ctx = ia.ctx, scene = ia.scene, canvas = opts.canvas, root = opts.root;\n    const doc2 = opts.doc || canvas && canvas.ownerDocument;\n    const D2 = ctx.openingDrag;\n    if (!canvas || !doc2 || !D2) return null;\n    const stage = canvas.parentNode || root;\n    const tip = doc2.createElement(\"div\");\n    tip.className = \"ub-lab__optip\";\n    tip.setAttribute(\"aria-hidden\", \"true\");\n    tip.hidden = true;\n    stage.appendChild(tip);\n    const st = { cursor: null, last: 0 };\n    function setCursor(c) {\n      if (c === st.cursor) return;\n      canvas.style.cursor = c || \"\";\n      st.cursor = c;\n    }\n    function textOf(id) {\n      const o = openingsOf(scene.room).find((q) => q.id === id);\n      if (!o) return null;\n      const d = D2.dragging() ? D2.state() : null;\n      if (d && d.bad) return \"Not here - \" + d.bad;\n      const where = openingLabel(scene.room, o) + \" \\xB7 \" + wallNameOf(scene.room, o.wall) + \" \\xB7 \" + o.x + \" from corner \\xB7 \" + o.w + \" \\xD7 \" + o.h;\n      if (d) return where;\n      return where + (scene.roomArmed === id ? \" - drag to move it\" : \" - double-click to move it\");\n    }\n    function refresh() {\n      if (tip.hidden || !st.id) return;\n      const t = textOf(st.id);\n      if (t == null) {\n        hide();\n        return;\n      }\n      if (tip.textContent !== t) tip.textContent = t;\n      if (!D2.dragging()) setCursor(scene.roomArmed === st.id ? \"grab\" : null);\n    }\n    function show2(e, text, id) {\n      const s = stage.getBoundingClientRect();\n      st.id = id || st.id;\n      tip.textContent = text;\n      tip.style.left = e.clientX - s.left + 14 + \"px\";\n      tip.style.top = e.clientY - s.top + 16 + \"px\";\n      tip.hidden = false;\n    }\n    function hide() {\n      if (!tip.hidden) tip.hidden = true;\n    }\n    function onMove(e) {\n      if (D2.dragging()) {\n        const d = D2.state();\n        setCursor(d.bad ? \"not-allowed\" : \"grabbing\");\n        const t = textOf(d.id);\n        if (t) show2(e, t, d.id);\n        st.dragged = true;\n        return;\n      }\n      if (e.buttons || scene.measureOn || scene.insideTool) {\n        hide();\n        if (st.cursor) setCursor(null);\n        return;\n      }\n      const now = Date.now();\n      if (now - st.last < 30) return;\n      st.last = now;\n      const hit2 = D2.openingAt(e.clientX, e.clientY);\n      if (!hit2) {\n        hide();\n        if (st.cursor) setCursor(null);\n        return;\n      }\n      setCursor(scene.roomArmed === hit2.id ? \"grab\" : null);\n      show2(e, textOf(hit2.id), hit2.id);\n    }\n    canvas.addEventListener(\"mousemove\", onMove);\n    if (doc2.defaultView) doc2.defaultView.addEventListener(\"mousemove\", (e) => {\n      if (D2.dragging()) onMove(e);\n    });\n    canvas.addEventListener(\"mouseleave\", () => {\n      if (!D2.dragging()) {\n        hide();\n        setCursor(null);\n      }\n    });\n    if (doc2.defaultView) doc2.defaultView.addEventListener(\"mouseup\", () => {\n      if (st.dragged) {\n        st.dragged = false;\n        hide();\n      }\n    });\n    return { tip, hide, refresh, text: () => tip.hidden ? null : tip.textContent };\n  }\n\n  // v2/src/interact/dock-tips.js\n  var COACH_KEY = \"ub-cabinet-lab:v2-coach\";\n  function createDockTips(ia, env2) {\n    const root = env2.root, canvas = env2.canvas;\n    const stage = canvas && canvas.parentNode;\n    const doc2 = root.ownerDocument || env2.doc;\n    const win2 = doc2 && doc2.defaultView;\n    if (!stage || !doc2 || !root.querySelectorAll) return null;\n    const tip = doc2.createElement(\"div\");\n    tip.className = \"ub-lab__ttip\";\n    tip.setAttribute(\"aria-hidden\", \"true\");\n    tip.hidden = true;\n    stage.appendChild(tip);\n    let held = null;\n    function show2(btn) {\n      const text = btn.getAttribute(\"title\") || btn.getAttribute(\"aria-label\");\n      if (!text) return;\n      if (btn.hasAttribute(\"title\")) {\n        held = { btn, title: btn.getAttribute(\"title\") };\n        btn.removeAttribute(\"title\");\n      }\n      tip.textContent = text;\n      tip.hidden = false;\n      const s = stage.getBoundingClientRect(), b = btn.getBoundingClientRect();\n      const right = b.left - s.left > s.width / 2;\n      const top = !!btn.closest(\".ub-lab__dock--top\") || b.top - s.top < 60 && !btn.closest(\".ub-lab__dock--right\");\n      let x, y;\n      if (top) {\n        x = b.left - s.left + b.width / 2 - tip.offsetWidth / 2;\n        y = b.bottom - s.top + 8;\n      } else if (right) {\n        x = b.left - s.left - tip.offsetWidth - 8;\n        y = b.top - s.top + b.height / 2 - tip.offsetHeight / 2;\n      } else {\n        x = b.right - s.left + 8;\n        y = b.top - s.top + b.height / 2 - tip.offsetHeight / 2;\n      }\n      tip.style.left = Math.max(6, Math.min(x, s.width - tip.offsetWidth - 6)) + \"px\";\n      tip.style.top = Math.max(6, Math.min(y, s.height - tip.offsetHeight - 6)) + \"px\";\n    }\n    function hide() {\n      tip.hidden = true;\n      if (held) {\n        if (!held.btn.hasAttribute(\"title\")) held.btn.setAttribute(\"title\", held.title);\n        held = null;\n      }\n    }\n    const wired = typeof WeakSet === \"function\" ? /* @__PURE__ */ new WeakSet() : null;\n    function wire(btn) {\n      if (wired) {\n        if (wired.has(btn)) return;\n        wired.add(btn);\n      }\n      btn.addEventListener(\"mouseenter\", function() {\n        show2(btn);\n      });\n      btn.addEventListener(\"mouseleave\", hide);\n      btn.addEventListener(\"click\", hide);\n    }\n    root.querySelectorAll(\".ub-lab__dock .ub-lab__tool\").forEach(wire);\n    if (wired && root.addEventListener) root.addEventListener(\"mouseover\", function(e) {\n      const btn = e.target && e.target.closest ? e.target.closest(\".ub-lab__dock .ub-lab__tool\") : null;\n      if (btn && !wired.has(btn)) {\n        wire(btn);\n        show2(btn);\n      }\n    });\n    const markUsed = function() {\n      root.classList.add(\"ub-lab--used\");\n    };\n    canvas.addEventListener(\"mousedown\", markUsed);\n    canvas.addEventListener(\"touchstart\", markUsed, { passive: true });\n    root.querySelectorAll(\"[data-ub-mode-rotate],[data-ub-mode-pan],[data-ub-mode-size],[data-ub-mode-move]\").forEach(function(b) {\n      b.addEventListener(\"click\", function() {\n        root.classList.remove(\"ub-lab--used\");\n      });\n    });\n    let store = null;\n    try {\n      store = win2 && win2.localStorage;\n    } catch {\n      store = null;\n    }\n    const add = root.querySelector('[data-ub-fly=\"cabinets\"]');\n    let coach = null;\n    function dismiss() {\n      if (!coach) return;\n      coach.remove();\n      coach = null;\n      try {\n        if (store) store.setItem(COACH_KEY, \"1\");\n      } catch {\n      }\n    }\n    let seen = true;\n    try {\n      seen = !store || store.getItem(COACH_KEY) === \"1\";\n    } catch {\n      seen = true;\n    }\n    if (add && !seen) {\n      coach = doc2.createElement(\"div\");\n      coach.className = \"ub-lab__coach\";\n      coach.setAttribute(\"role\", \"note\");\n      const t = doc2.createElement(\"b\");\n      t.textContent = \"Start here\";\n      const p = doc2.createElement(\"span\");\n      p.textContent = \"Add a cabinet, or click one in the room to change it.\";\n      const x = doc2.createElement(\"button\");\n      x.type = \"button\";\n      x.className = \"ub-lab__coachx\";\n      x.setAttribute(\"aria-label\", \"Close the hint\");\n      x.textContent = \"\\xD7\";\n      x.addEventListener(\"click\", dismiss);\n      coach.appendChild(t);\n      coach.appendChild(p);\n      coach.appendChild(x);\n      const strip = root && root.querySelector ? root.querySelector(\"[data-ub-status]\") : null;\n      if (strip) {\n        coach.classList.add(\"ub-lab__coach--strip\");\n        p.textContent = \"Add a cabinet with Cabinets on the left of the view, or click one in the room to change it.\";\n        strip.insertBefore(coach, strip.firstChild);\n      } else stage.appendChild(coach);\n      const place2 = function() {\n        if (!coach || strip) return;\n        const s = stage.getBoundingClientRect(), b = add.getBoundingClientRect();\n        coach.style.left = b.right - s.left + 12 + \"px\";\n        coach.style.top = b.top - s.top + b.height / 2 + \"px\";\n      };\n      place2();\n      if (win2 && win2.addEventListener) win2.addEventListener(\"resize\", place2);\n      add.addEventListener(\"click\", dismiss);\n      canvas.addEventListener(\"mousedown\", dismiss);\n      canvas.addEventListener(\"touchstart\", dismiss, { passive: true });\n    }\n    return { hide, dismiss, el: tip, coach: () => coach };\n  }\n\n  // v2/src/interact/dbl-guard.js\n  var SAME_PAIR_MS = 350;\n  function createDblGuard(opts) {\n    const now = opts && opts.now || (() => typeof performance !== \"undefined\" && performance.now ? performance.now() : Date.now());\n    let pair = null;\n    let press = null;\n    let synthAt = -1e9;\n    const count = (e) => e && e.detail > 0 ? e.detail : 1;\n    return {\n      /* any mouse press (window, capture, mousedown - it carries the click count); onCanvas - it landed on the planner's\n         canvas itself. An odd count opens a pair (1, 3, 5 ...), the even one is its second press. */\n      down(e, onCanvas) {\n        if (count(e) % 2 === 1 || !pair) pair = { canvas: !!onCanvas, dragged: false };\n        if (!press) press = { x: e.clientX, y: e.clientY };\n      },\n      /* the button went down (pointerdown of a mouse: it comes even where a control cancelled the mouse events - a\n         drawer seam, an arrow) */\n      press(e) {\n        press = { x: e.clientX, y: e.clientY };\n      },\n      /* any move: with the button held and TRAVEL_PX away from the press, the pair is a drag */\n      move(e) {\n        if (!press || !pair || pair.dragged) return;\n        if (e && e.buttons === 0) {\n          press = null;\n          return;\n        }\n        if (Math.hypot(e.clientX - press.x, e.clientY - press.y) >= TRAVEL_PX) pair.dragged = true;\n      },\n      up() {\n        press = null;\n      },\n      /* a click: true when it is the second click of a LATER pair (count 4, 6 ...) on a pair that began on the canvas\n         and was not a drag - the caller runs the canvas double-click for it */\n      click(e) {\n        const c = count(e);\n        if (c < 4 || c % 2 !== 0 || !pair || !pair.canvas || pair.dragged) return false;\n        synthAt = now();\n        return true;\n      },\n      /* the browser's dblclick: false when this pair was a drag, or its double-click already ran from click() */\n      dbl() {\n        if (pair && pair.dragged) return false;\n        if (now() - synthAt < SAME_PAIR_MS) return false;\n        return true;\n      },\n      state: () => ({ pair: pair ? Object.assign({}, pair) : null, pressing: !!press })\n    };\n  }\n\n  // v2/src/interact/wheel-forward.js\n  var NO_ZOOM = \"input, textarea, select, [contenteditable=''], [contenteditable='true'], .ub-chef, [data-ub-flyout], .ub-lab__flyout, [data-ub-radial]\";\n  function scrollsWith(el, e, win2) {\n    if (!el || !win2 || !win2.getComputedStyle) return false;\n    const cs = win2.getComputedStyle(el);\n    const dx = Math.abs(e.deltaX || 0), dy = Math.abs(e.deltaY || 0);\n    const can = (ov) => ov === \"auto\" || ov === \"scroll\" || ov === \"overlay\";\n    if (dy >= dx && can(cs.overflowY) && el.scrollHeight > el.clientHeight + 1) return true;\n    if (dx > dy && can(cs.overflowX) && el.scrollWidth > el.clientWidth + 1) return true;\n    return false;\n  }\n  function overlayWheelWanted(e, canvas, root, win2) {\n    const t = e && e.target;\n    if (!t || !canvas || !root || t === canvas) return false;\n    if (!root.contains || !root.contains(t)) return false;\n    if (canvas.contains && canvas.contains(t)) return false;\n    const r = canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : null;\n    if (!r || !(r.width > 0) || !(r.height > 0)) return false;\n    const x = e.clientX, y = e.clientY;\n    if (!(x >= r.left && x <= r.right && y >= r.top && y <= r.bottom)) return false;\n    if (t.closest && t.closest(NO_ZOOM)) return false;\n    for (let el = t; el && el !== root; el = el.parentNode) if (el.nodeType === 1 && scrollsWith(el, e, win2)) return false;\n    return true;\n  }\n  function installOverlayWheel(ia, canvas, root, win2) {\n    if (!root || !root.addEventListener || !canvas) return null;\n    const onWheel = (e) => {\n      if (overlayWheelWanted(e, canvas, root, win2)) ia.canvasEvent(\"wheel\", e);\n    };\n    root.addEventListener(\"wheel\", onWheel, { passive: false });\n    return onWheel;\n  }\n\n  // v2/src/interact/surface.js\n  var legacyExports2 = {};\n  function renderPort(scene, R4, frameOf3) {\n    function cam() {\n      return R4.camera ? R4.camera() : R4.cam ? R4.cam() : null;\n    }\n    function rayBase(nx, ny) {\n      const c = cam();\n      if (!c) return null;\n      const m = rotMat2(scene.yaw, scene.pitch);\n      const back = applyRT2(m, [0, 0, c.dist]);\n      const eye = [c.cx + back[0], c.cy + back[1], c.cz + back[2]];\n      const ty = Math.tan(FOVY / 2), tx = ty * c.aspect;\n      const L = ndcToLens(c, nx, ny);\n      return { eye, dir: applyRT2(m, [L[0] * tx, L[1] * ty, -1]) };\n    }\n    return {\n      setView() {\n      },\n      update() {\n        if (R4.render) R4.render();\n      },\n      requestFrame() {\n      },\n      getView() {\n        const c = cam();\n        return c ? { cam: Object.assign({}, c, { atMin: R4.atMinDist ? !!R4.atMinDist() : !!c.atMin }) } : null;\n      },\n      frameOf: (units) => frameOf3(units),\n      /* aim the zoomed-in picture at this cabinet (render/surface.js focusOn); false when the render has no focus */\n      focusOn: (id) => !!(R4.focusOn && R4.focusOn(id)),\n      setControls() {\n      },\n      rayNdc(nx, ny) {\n        const b = rayBase(nx, ny);\n        if (!b) return null;\n        const d = b.dir, len = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]) || 1;\n        return { o: b.eye, d: [d[0] / len, d[1] / len, d[2] / len] };\n      },\n      planeNdc(nx, ny, axis, at) {\n        const b = rayBase(nx, ny);\n        if (!b) return null;\n        const eye = b.eye, dir = b.dir;\n        if (axis === \"y\") {\n          if (Math.abs(dir[1]) < 1e-4) return null;\n          const t2 = (at - eye[1]) / dir[1];\n          if (t2 <= 0) return null;\n          return [eye[0] + dir[0] * t2, at, eye[2] + dir[2] * t2];\n        }\n        const i = axis === \"x\" ? 0 : 2;\n        if (Math.abs(dir[i]) < 1e-4) return null;\n        const t = (at - eye[i]) / dir[i];\n        if (t <= 0) return null;\n        return [eye[0] + dir[0] * t, eye[1] + dir[1] * t, eye[2] + dir[2] * t];\n      },\n      eye() {\n        const c = cam();\n        if (!c) return null;\n        const b = applyRT2(rotMat2(scene.yaw, scene.pitch), [0, 0, c.dist]);\n        return [c.cx + b[0], c.cy + b[1], c.cz + b[2]];\n      },\n      worldToNdc: (p) => R4.worldToNdc ? R4.worldToNdc(p) : null,\n      worldClipZ: (p) => R4.worldClipZ ? R4.worldClipZ(p) : null,\n      /* the visible board under a screen point: Three.js raycast over the real triangles (render\n         pick); null without Three.js. The wheel zooms towards this point (view.js wheel). */\n      meshPoint(clientX, clientY) {\n        const h = R4.pick ? R4.pick(clientX, clientY) : null;\n        return h && h.point ? [h.point.x, h.point.y, h.point.z] : null;\n      }\n    };\n  }\n  function attach2(ctx) {\n    var _a;\n    const { root, canvas, scene } = ctx;\n    const win2 = ctx.win || null;\n    const R4 = Object.assign({}, ctx.inst || {});\n    const cueEl = root && root.querySelector ? root.querySelector(\"[data-ub-cue]\") : null;\n    let overlay = null, inside = null, measure = null, qadd = null, opcard = null, opdragDom = null, spdom = null, hooddom = null;\n    const st2 = { uiMuted: false };\n    let keep = null;\n    const PLAN_EVENTS = { refresh: 1, controls: 1, history: 1 };\n    const ia = createInteraction({\n      workshopAllowed: root.getAttribute(\"data-ub-edition\") === \"pro\" && ((_a = root.__ubLabConfig) == null ? void 0 : _a.workshopDocuments) === true,\n      scene,\n      render: renderPort(scene, R4, ctx.frameOf || ((u) => R4.sceneFrame ? R4.sceneFrame(u) : null)),\n      rect: () => {\n        if (!canvas) return null;\n        return canvas.getBoundingClientRect ? canvas.getBoundingClientRect() : { left: 0, top: 0, width: canvas.clientWidth || 700, height: canvas.clientHeight || 520 };\n      },\n      /* \u0440\u0430\u0437\u043C\u0435\u0440 \u0445\u043E\u043B\u0441\u0442\u0430 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0441\u0447\u0451\u0442\u0430 NDC \u2194 \u043F\u0438\u043A\u0441\u0435\u043B\u0438 \u2014 clientWidth/clientHeight, \u043A\u0430\u043A \u0441\u0442\u0430\u0440\u044B\u0439 \u043A\u043E\u0434\n         (\u00ABvar cw = canvas.clientWidth || 600\u00BB): \u0443 getBoundingClientRect \u0448\u0438\u0440\u0438\u043D\u0430 \u0434\u0440\u043E\u0431\u043D\u0430\u044F\n         (1218.09 \u043F\u0440\u043E\u0442\u0438\u0432 1218), \u0438 \u0432 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0440\u0435\u0441\u0430\u0439\u0437 \u0441\u0442\u0440\u0435\u043B\u043A\u043E\u0439 \u0434\u0430\u0432\u0430\u043B 945 \u0432\u043C\u0435\u0441\u0442\u043E 950 */\n      size: () => canvas ? { w: canvas.clientWidth || 0, h: canvas.clientHeight || 0 } : null,\n      storage: () => {\n        try {\n          return win2 && win2.localStorage;\n        } catch {\n          return null;\n        }\n      },\n      onCue: (msg) => {\n        const ui = ctx.inst && ctx.inst.ui;\n        if (ui && ui.cue) {\n          ui.cue(msg);\n          return;\n        }\n        if (cueEl) {\n          cueEl.textContent = msg || \"\";\n          if (cueEl.style) cueEl.style.display = msg ? \"\" : \"none\";\n        }\n      },\n      onChange: (what) => {\n        const ui = ctx.inst && ctx.inst.ui;\n        const quiet = st2.uiMuted || !ui;\n        if (keep && PLAN_EVENTS[what]) {\n          try {\n            keep.checkpoint(what);\n          } catch {\n          }\n        }\n        if (inside && what !== \"tray-ghost\") inside.draw();\n        if (measure && what !== \"tray-ghost\") measure.draw();\n        if (qadd && what !== \"tray-ghost\" && what !== \"draglog\") {\n          try {\n            qadd.draw();\n          } catch {\n          }\n        }\n        if (opcard && what !== \"tray-ghost\" && what !== \"draglog\") {\n          try {\n            opcard.draw();\n          } catch {\n          }\n        }\n        if (spdom && what !== \"tray-ghost\" && what !== \"draglog\") {\n          try {\n            spdom.draw();\n          } catch {\n          }\n        }\n        if (hooddom && what !== \"tray-ghost\" && what !== \"draglog\") {\n          try {\n            hooddom.draw();\n          } catch {\n          }\n        }\n        if (opdragDom && opdragDom.refresh) {\n          try {\n            opdragDom.refresh();\n          } catch {\n          }\n        }\n        if (what === \"refresh\") {\n          if (R4.update) R4.update();\n          if (!quiet && ui.syncOut) ui.syncOut();\n        } else if (what === \"controls\" || what === \"partinfo\" || what === \"history\" || what === \"zoom\") {\n          if (!quiet && ui.syncControls) ui.syncControls({ noState: true });\n          if (what === \"controls\" && overlay) overlay.draw();\n        } else if (what === \"frame\" || what === \"handles\" || what === \"sizeactive\" || what === \"tray-ghost\") {\n          if (overlay && (what === \"frame\" || what === \"handles\")) overlay.draw();\n          if (!quiet && ui.frame) ui.frame();\n        }\n      }\n    });\n    if (root && root.querySelector) overlay = createOverlayDom(ia, { root, canvas, doc: ctx.doc || null });\n    if (root && root.querySelector) {\n      try {\n        inside = createInsideDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n        inside = null;\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        measure = createMeasureDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n        measure = null;\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        installHingeEvidence(ia, { canvas, doc: ctx.doc || root.ownerDocument || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        installGolaEvidence(ia, { canvas, doc: ctx.doc || root.ownerDocument || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        installFrontsEvidence(ia, { canvas, doc: ctx.doc || root.ownerDocument || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        installDrawerEvidence(ia, { canvas, doc: ctx.doc || root.ownerDocument || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        installDrawerMoveEvidence(ia, { canvas, doc: ctx.doc || root.ownerDocument || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        qadd = createQuickAddDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n        qadd = null;\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        opcard = createOpeningCardDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n        opcard = null;\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        spdom = createSplashPieceDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n        spdom = null;\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        hooddom = createHoodDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n        hooddom = null;\n      }\n    }\n    if (R4.setArrowSource) R4.setArrowSource(() => ia.handles && ia.handles.meshArrows ? ia.handles.meshArrows() : []);\n    if (root && root.querySelector) {\n      try {\n        createHoverTip(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        opdragDom = createOpeningDragDom(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n      }\n    }\n    if (root && root.querySelector) {\n      try {\n        createDockTips(ia, { root, canvas, doc: ctx.doc || null });\n      } catch {\n      }\n    }\n    keep = ia.persist.recovery;\n    try {\n      const back = keep.recover();\n      if (back.ok) {\n        ia.ctx.settle();\n        if (scene.workshop) ia.view.fitKitchen(true);\n        else if (ia.view && ia.view.refit) ia.view.refit();\n      }\n    } catch {\n    }\n    const uiCommands0 = createUiCommands(ia);\n    const uiCommands = Object.assign({}, uiCommands0, {\n      run(name2, args) {\n        st2.uiMuted = true;\n        try {\n          return uiCommands0.run(name2, args);\n        } finally {\n          st2.uiMuted = false;\n          try {\n            keep.checkpoint(\"command\");\n          } catch {\n          }\n        }\n      }\n    });\n    if (win2 && win2.addEventListener) {\n      win2.addEventListener(\"pagehide\", () => {\n        try {\n          keep.checkpoint(\"pagehide\");\n        } catch {\n        }\n      });\n      const d = ctx.doc || root && root.ownerDocument || null;\n      if (d && d.addEventListener) d.addEventListener(\"visibilitychange\", () => {\n        if (d.hidden) {\n          try {\n            keep.checkpoint(\"hidden\");\n          } catch {\n          }\n        }\n      });\n    }\n    if (canvas && canvas.addEventListener) {\n      for (const t of [\"mousedown\", \"mousemove\", \"mouseleave\", \"keydown\", \"pointercancel\", \"lostpointercapture\"])\n        canvas.addEventListener(t, (e) => ia.canvasEvent(t, e));\n      canvas.addEventListener(\"wheel\", (e) => ia.canvasEvent(\"wheel\", e), { passive: false });\n      installOverlayWheel(ia, canvas, root, win2);\n      const guard = createDblGuard();\n      {\n        let firstOnCanvas = null;\n        const at = (e) => e && e.timeStamp > 0 ? e.timeStamp : typeof performance !== \"undefined\" && performance.now ? performance.now() : Date.now();\n        canvas.addEventListener(\"mousedown\", (e) => {\n          if ((e.detail || 1) % 2 === 1) firstOnCanvas = { t: at(e), x: e.clientX, y: e.clientY, paired: false };\n        }, true);\n        const near2 = (e) => !!firstOnCanvas && (firstOnCanvas.paired || at(e) - firstOnCanvas.t < 700) && Math.hypot(e.clientX - firstOnCanvas.x, e.clientY - firstOnCanvas.y) <= 10;\n        const own2 = (t) => !!(t && t !== canvas && root && root.contains && root.contains(t));\n        const keep2 = (e) => {\n          if (!own2(e.target) || !near2(e)) return;\n          if (e.type !== \"dblclick\" && (e.detail || 0) < 2) return;\n          if (e.type === \"mousedown\") firstOnCanvas.paired = true;\n          e.stopPropagation();\n          if (e.preventDefault) e.preventDefault();\n          if (e.type === \"dblclick\") {\n            firstOnCanvas = null;\n            if (guard.dbl(e)) ia.canvasEvent(\"dblclick\", e);\n          } else if (e.type === \"click\" && guard.click(e)) {\n            firstOnCanvas = null;\n            ia.canvasEvent(\"dblclick\", e);\n          }\n        };\n        if (win2 && win2.addEventListener) {\n          win2.addEventListener(\"pointerdown\", (e) => {\n            if (!e.pointerType || e.pointerType === \"mouse\") guard.press(e);\n          }, true);\n          win2.addEventListener(\"mousedown\", (e) => guard.down(e, e.target === canvas || own2(e.target) && near2(e) && (e.detail || 0) >= 2), true);\n          for (const t of [\"pointermove\", \"mousemove\"]) win2.addEventListener(t, (e) => {\n            if (!e.pointerType || e.pointerType === \"mouse\") guard.move(e);\n          }, true);\n          for (const t of [\"pointerup\", \"mouseup\"]) win2.addEventListener(t, () => guard.up(), true);\n          for (const t of [\"mousedown\", \"click\", \"dblclick\"]) win2.addEventListener(t, keep2, true);\n        }\n        canvas.addEventListener(\"dblclick\", (e) => {\n          if (guard.dbl(e)) ia.canvasEvent(\"dblclick\", e);\n        });\n        canvas.addEventListener(\"click\", (e) => {\n          if (guard.click(e)) ia.canvasEvent(\"dblclick\", e);\n        });\n        ia.ctx.st.dblGuard = guard;\n      }\n      canvas.addEventListener(\"touchstart\", (e) => ia.canvasEvent(\"touchstart\", e), { passive: true });\n      canvas.addEventListener(\"touchmove\", (e) => ia.canvasEvent(\"touchmove\", e), { passive: false });\n      canvas.addEventListener(\"touchend\", (e) => ia.canvasEvent(\"touchend\", e), { passive: true });\n      canvas.addEventListener(\"touchcancel\", (e) => ia.canvasEvent(\"touchcancel\", e), { passive: true });\n    }\n    if (win2 && win2.addEventListener) {\n      const DISABLED = \"button:disabled,input:disabled,select:disabled,textarea:disabled,fieldset:disabled\";\n      let pressId = null, endedByPointer = false;\n      for (const t of [\"mousemove\", \"mouseup\", \"keydown\", \"blur\"]) win2.addEventListener(t, (e) => {\n        if (t === \"mouseup\" && endedByPointer) {\n          endedByPointer = false;\n          return;\n        }\n        if (pressId != null && (t === \"mousemove\" || t === \"mouseup\") && e && e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;\n        ia.windowEvent(t, e);\n      });\n      win2.addEventListener(\"pointerdown\", (e) => {\n        if (!e || e.pointerType !== \"mouse\" && e.pointerType !== \"pen\") return;\n        pressId = e.pointerId;\n        endedByPointer = false;\n      }, true);\n      win2.addEventListener(\"pointercancel\", (e) => {\n        if (e && pressId != null && e.pointerId === pressId) pressId = null;\n      }, true);\n      win2.addEventListener(\"mousedown\", () => {\n        endedByPointer = false;\n      }, true);\n      win2.addEventListener(\"pointerup\", (e) => {\n        if (!e || e.pointerType !== \"mouse\" && e.pointerType !== \"pen\") return;\n        if (pressId != null && e.pointerId !== pressId) return;\n        pressId = null;\n        const t = e.target;\n        if (t && t.closest && t.closest(DISABLED)) {\n          ia.windowEvent(\"mouseup\", e);\n          endedByPointer = true;\n        }\n      });\n      const reproject = () => {\n        if (measure && scene.measureOn) {\n          try {\n            measure.draw();\n          } catch {\n          }\n        }\n        if (qadd) {\n          try {\n            qadd.draw();\n          } catch {\n          }\n        }\n        if (opcard) {\n          try {\n            opcard.draw();\n          } catch {\n          }\n        }\n        if (spdom) {\n          try {\n            spdom.draw();\n          } catch {\n          }\n        }\n        if (hooddom) {\n          try {\n            hooddom.draw();\n          } catch {\n          }\n        }\n        if (!overlay || !scene.partsMode && !scene.sizeMode && !ia.handles.rotateViewOn()) return;\n        try {\n          overlay.drawHandles();\n          if (inside) inside.draw();\n        } catch {\n        }\n      };\n      win2.addEventListener(\"scroll\", reproject, true);\n      win2.addEventListener(\"resize\", reproject);\n    }\n    const c = ia.ctx, st = c.st;\n    return {\n      /* 45 \u0438\u043C\u0451\u043D __ubProj \u0441\u043B\u043E\u044F interact */\n      wallPlaneFor: c.wallPlaneFor,\n      runAxisFor: c.runAxisFor,\n      placeWallAlong: ia.pointer.placeWallAlong,\n      pickNdc: ia.pointer.pickNdc,\n      pickDebug: ia.pointer.pickDebug,\n      nudgeLimit: (u, k) => ia.nudge.limit(u, k),\n      nudge: (k) => ia.nudge.run(k),\n      undo: () => ia.hist.undo(),\n      redo: () => ia.hist.redo(),\n      partAt: (cx, cy) => ia.parts.partUnderPointer(cx, cy),\n      handles: () => ia.handles.edit(),\n      shownHandles: () => ia.handles.list(),\n      handleNode: (hid) => overlay ? overlay.handleNode(hid) : null,\n      handleLabel: (hid) => overlay ? overlay.handleLabel(hid) : null,\n      handleVisible: (hid) => overlay ? overlay.handleVisible(hid) : false,\n      handleSize: (hid) => overlay ? overlay.handleSize(hid) : null,\n      handleAt: (hid) => overlay ? overlay.handleAt(hid) : null,\n      activeHandle: () => st.activeHandle,\n      startHandleDrag: (hid, e) => ia.handles.startDrag(hid, e),\n      mmToPx: (hid, mm) => ia.handles.mmToPx(hid, mm),\n      cancelHandleDrag: () => ia.handles.cancelDrag(),\n      cancelPartDrag: () => ia.parts.cancelDrag(),\n      setActiveHandle: (hid) => ia.handles.setActive(hid),\n      drawPartHandles: () => {\n        if (overlay) overlay.drawHandles();\n        else c.syncHandlesState();\n      },\n      hoverPart: () => scene.hoverPart,\n      selPart: () => scene.selPart,\n      setSelPart: (pid) => ia.parts.setSelPart(pid),\n      commitShelfMm: (v) => ia.commands.run(\"setShelfHeight\", { mm: v }).ok,\n      removeSelectedShelf: () => ia.commands.run(\"removeSelectedShelf\").ok,\n      selectedCellKey: () => selectedCellKey(c.sel(), scene.selPart),\n      canUndo: () => ia.hist.canUndo(),\n      canRedo: () => ia.hist.canRedo(),\n      histDepth: () => ia.hist.depth(),\n      histLabels: () => ia.hist.labels(),\n      histBegin: (label) => ia.hist.begin(label),\n      histCommit: () => ia.hist.commit(),\n      nudgeArrows: () => st.lastNudge,\n      nudgeEl: (k) => overlay ? overlay.nudgeEl(k) : null,\n      dropUnit: (type, fx, fz) => {\n        const r = ia.commands.run(\"dropUnit\", { type, x: fx, z: fz });\n        return r && r.unit ? r.unit : null;\n      },\n      dragLog: () => ia.pointer.dragLog(),\n      dragLogSet: (on) => ia.pointer.setDragLog(on),\n      unitPickBoxes: ia.pointer.unitPickBoxes,\n      pickAtClient: ia.pointer.pickAt,\n      applyDim: (u, k, raw) => ia.size.applyDim(u, k, raw),\n      dimLimits: (u, k) => ia.size.dimLimits(u, k),\n      /* \u0432\u0438\u0434: \u0442\u0435 \u0436\u0435 \u0447\u0438\u0441\u043B\u0430, \u0447\u0442\u043E \u0443 \u0440\u0435\u043D\u0434\u0435\u0440\u0430, \u0438 \u0441\u0442\u0440\u043E\u043A\u0430 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0441\u0442\u0430\u0440\u043E\u0433\u043E setZoom */\n      setZoom: (z, why) => ia.view.setZoom(z, why),\n      refit: () => ia.view.refit(),\n      holdCamera: () => ia.view.holdCamera(),\n      releaseCamera: () => ia.view.releaseCamera(),\n      setCam: (y, p) => ia.view.setCam(y, p),\n      /* \u0441\u043B\u0443\u0436\u0435\u0431\u043D\u043E\u0435: \u0440\u0435\u043D\u0434\u0435\u0440\u0443 \u2014 \u0436\u0435\u0441\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0434\u0435\u0440\u0436\u0438\u0442 \u043A\u0430\u043C\u0435\u0440\u0443; \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u2014 \u0432\u0435\u0441\u044C \u0441\u043B\u043E\u0439 */\n      sizeGestureActive: () => ia.view.sizeGestureActive(),\n      /* \u0440\u0435\u043D\u0434\u0435\u0440\u0443: \u0438\u0434\u0451\u0442 \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E\u043B\u043A\u0438 / \u043F\u0435\u0440\u0435\u0433\u043E\u0440\u043E\u0434\u043A\u0438 (\u0444\u0430\u0441\u0430\u0434\u044B \u043F\u0440\u043E\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044E\u0442 \u0441\u0438\u043B\u044C\u043D\u0435\u0435 \u2014\n         \u0441\u0442\u0430\u0440\u044B\u0439 internalEditActive() === 1); \u0432\u044B\u0431\u043E\u0440 \u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0439 \u043F\u0438\u0448\u0435\u0442 \u043F\u0440\u044F\u043C\u043E \u0432\n         scene.selectedId / scene.hoverPart / scene.selPart, \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u043D\u0435\u0442 */\n      partDragActive: () => !!st.partDrag,\n      setMode: (m) => ia.setMode(m),\n      /* \u043F\u043E\u043A\u0430 \u0441\u043B\u043E\u044F \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043D\u0435\u0442 \u2014 \u0441\u0442\u0430\u0440\u044B\u0439 syncControls \u0432 \u0447\u0430\u0441\u0442\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F (\u0432\u044B\u0431\u043E\u0440 L-\u0443\u0433\u043B\u0430 \u0434\u0435\u043B\u0430\u0435\u0442\n         \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u043C \u0440\u044F\u0434 return, \u0441\u0431\u0440\u043E\u0441 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0440\u0443\u0447\u043A\u0438, \u043A\u043E\u043D\u0435\u0446 \u0441\u0442\u0435\u043D\u044B \u0434\u043B\u044F \u00ABFill a gap\u00BB); \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441,\n         \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u044F\u0441\u044C \u043F\u043E\u0441\u043B\u0435, \u043E\u0442\u0434\u0430\u0451\u0442 \u0441\u0432\u043E\u0439 syncControls \u2014 \u043E\u043D \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0437\u043E\u0432\u0451\u0442 interaction.ctx.syncState\n         (ui/index.js, stateFirst), \u0437\u0430\u0442\u0435\u043C \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043F\u0430\u043D\u0435\u043B\u0438 */\n      syncControls: () => {\n        c.syncControls();\n      },\n      interaction: ia,\n      /* \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 (docs/ui.md): \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0435\u0433\u043E \u0438\u043C\u0435\u043D\u0430\u043C\u0438, \u0438\u0441\u0442\u043E\u0440\u0438\u044F \u0434\u043B\u044F \u043F\u043E\u0434\u043F\u0438\u0441\u0435\u0439 Undo/Redo */\n      commands: uiCommands,\n      arrowFor: (k, edge) => overlay ? overlay.arrowFor(k, edge) : null,\n      /* \u043A\u0430\u0434\u0440 \u0440\u0435\u043D\u0434\u0435\u0440\u0430 \u0438 \u0441\u0440\u0430\u0437\u0443 \u2014 \u0441\u0442\u0440\u0435\u043B\u043A\u0438 \u0437\u0430 \u043A\u0430\u043C\u0435\u0440\u043E\u0439 (\u0441\u0442\u0430\u0440\u044B\u0439 render(): drawNudgeUI, reprojectHandles) */\n      render: () => {\n        const r = R4.render ? R4.render() : null;\n        if (overlay) overlay.draw();\n        if (inside) inside.draw();\n        if (measure) measure.draw();\n        if (qadd) {\n          try {\n            qadd.draw();\n          } catch {\n          }\n        }\n        if (opcard) {\n          try {\n            opcard.draw();\n          } catch {\n          }\n        }\n        return r;\n      },\n      /* after every frame the renderer draws on its own (render/surface.js afterFrame: orbit, zoom easing,\n         quality reload) - the + goes to its cabinet point in THAT picture */\n      /* ... and the selected divider's Centre / Split equally bar with its numbers (task 1791668417075, owner: \u00ABCentre / Split equally\n         controls ... cannot be reached with cursor because their screen location changes as cursor approaches\u00BB; measured in the browser\n         t1792004090475: after a wheel zoom, an orbit, or a toolbar Undo the camera eased on its own frames, the bar stayed where the last\n         pointer event had put it, and the first mouse move toward it moved it 28 / 11 / 82 px - selection and plan unchanged). It now\n         goes with its divider on every frame, so the pointer's approach never moves it. */\n      onFrame: () => {\n        if (inside) {\n          try {\n            if (inside.frame) inside.frame();\n            else inside.draw();\n          } catch {\n          }\n        }\n        if (qadd) {\n          try {\n            qadd.draw();\n          } catch {\n          }\n        }\n        if (opcard) {\n          try {\n            opcard.draw();\n          } catch {\n          }\n        }\n        if (spdom) {\n          try {\n            spdom.draw();\n          } catch {\n          }\n        }\n        if (hooddom) {\n          try {\n            hooddom.draw();\n          } catch {\n          }\n        }\n      },\n      openingCard: () => opcard,\n      openingTip: () => opdragDom,\n      splashPieceDom: () => spdom,\n      hoodDom: () => hooddom,\n      insideDom: () => inside,\n      measureDom: () => measure,\n      quickAddDom: () => qadd,\n      quickAdd: (side) => ia.commands.run(\"addBeside\", { side }),\n      quickAddLayout: () => qadd ? qadd.last() : []\n    };\n  }\n\n  // v2/src/ui/surface.js\n  var surface_exports3 = {};\n  __export(surface_exports3, {\n    attach: () => attach3,\n    legacyExports: () => legacyExports3\n  });\n\n  // v2/src/ui/format.js\n  function money(n) {\n    const c = globalThis.__UB_LAB_CURRENCY__;\n    if (c) {\n      try {\n        return new Intl.NumberFormat(globalThis.__UB_LAB_LOCALE__ || \"en-GB\", { style: \"currency\", currency: c }).format(n);\n      } catch {\n      }\n    }\n    return (c ? c + \" \" : \"\\xA3\") + n.toFixed(2);\n  }\n  function pence(n) {\n    return Math.round(n * 100);\n  }\n\n  // v2/src/ui/icons.js\n  var NOTE_MARK = \"\\n\\n\\u2014 your notes below \\u2014\\n\";\n  function miniFor(u) {\n    const k = (u.type === \"base\" || u.type === \"wall\") && u.doors === 2 ? u.type + \"-2\" : u.type;\n    return MINI[k] || MINI.base;\n  }\n  function mini(inner) {\n    return '<svg viewBox=\"0 0 24 22\" aria-hidden=\"true\" focusable=\"false\">' + inner + \"</svg>\";\n  }\n  var bx = (x, y, w, h) => '<rect data-fill data-stroke x=\"' + x + '\" y=\"' + y + '\" width=\"' + w + '\" height=\"' + h + '\" rx=\"1\" fill=\"#e9e9e3\" stroke=\"#5c5c56\" stroke-width=\"1.3\"/>';\n  var lg = (a, b) => '<path data-stroke d=\"M' + a + \" 17v3M\" + b + ' 17v3\" stroke=\"#5c5c56\" stroke-width=\"1.3\"/>';\n  var MINI = {\n    /* one door with a handle; two doors (u.doors === 2) \u2014 \"-2\" below. Was two leaves for both\n       (owner 30.09.2026: \u00AB\u0432\u043E\u0442 \u044D\u0442\u043E \u043D\u0435 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E. \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043F\u043E\u0434\u043E\u0431\u043D\u044B\u0435 \u043C\u0435\u043B\u043E\u0447\u0438 \u0438\u0441\u043F\u0440\u0430\u0432\u044C\u00BB) */\n    \"base\": mini(bx(4, 5, 16, 12) + '<circle data-knob cx=\"16.5\" cy=\"11\" r=\"0.9\" fill=\"#5c5c56\"/>' + lg(6, 18)),\n    \"base-2\": mini(bx(4, 5, 16, 12) + '<path data-stroke d=\"M12 5v12\" stroke=\"#5c5c56\" stroke-width=\"1.1\"/><circle data-knob cx=\"10.4\" cy=\"11\" r=\"0.8\" fill=\"#5c5c56\"/><circle data-knob cx=\"13.6\" cy=\"11\" r=\"0.8\" fill=\"#5c5c56\"/>' + lg(6, 18)),\n    \"base-drawer\": mini(bx(4, 5, 16, 12) + '<path data-stroke d=\"M4 9h16\" stroke=\"#5c5c56\" stroke-width=\"1.1\"/>' + lg(6, 18)),\n    \"base-4drawer\": mini(bx(4, 5, 16, 12) + '<path data-stroke d=\"M4 8h16M4 11h16M4 14h16\" stroke=\"#5c5c56\" stroke-width=\"1\"/>' + lg(6, 18)),\n    \"wall\": mini('<path data-stroke d=\"M2 3h20\" stroke=\"#9a9a92\" stroke-width=\"1.6\"/>' + bx(4, 5, 16, 11) + '<circle data-knob cx=\"16.5\" cy=\"10.5\" r=\"0.9\" fill=\"#5c5c56\"/>'),\n    \"wall-2\": mini('<path data-stroke d=\"M2 3h20\" stroke=\"#9a9a92\" stroke-width=\"1.6\"/>' + bx(4, 5, 16, 11) + '<path data-stroke d=\"M12 5v11\" stroke=\"#5c5c56\" stroke-width=\"1.1\"/><circle data-knob cx=\"10.4\" cy=\"10.5\" r=\"0.8\" fill=\"#5c5c56\"/><circle data-knob cx=\"13.6\" cy=\"10.5\" r=\"0.8\" fill=\"#5c5c56\"/>'),\n    \"corner-l\": mini('<path data-fill data-stroke d=\"M3 6h11v5h7v9H3z\" fill=\"#e9e9e3\" stroke=\"#5c5c56\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>' + lg(5, 19)),\n    \"corner-blind\": mini(bx(3, 6, 18, 11) + '<rect data-fill x=\"3\" y=\"6\" width=\"7\" height=\"11\" fill=\"#cfcfc8\" stroke=\"#5c5c56\" stroke-width=\"1.1\"/>' + lg(5, 19)),\n    \"corner-wall\": mini('<path data-fill data-stroke d=\"M3 4h11v5h7v9H3z\" fill=\"#e9e9e3\" stroke=\"#5c5c56\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/>'),\n    \"corner-tall\": mini('<path data-fill data-stroke d=\"M4 2h9v6h7v12H4z\" fill=\"#e9e9e3\" stroke=\"#5c5c56\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/><path data-stroke d=\"M4 8h9M4 14h16\" stroke=\"#5c5c56\" stroke-width=\"0.9\"/>' + lg(6, 18)),\n    \"tall-pantry\": mini(bx(7, 2, 10, 18) + '<path data-stroke d=\"M7 7h10M7 12h10\" stroke=\"#5c5c56\" stroke-width=\"1\"/><path data-stroke d=\"M12 2v18\" stroke=\"#5c5c56\" stroke-width=\"1\"/>' + lg(8, 16)),\n    \"tall-fridge\": mini(bx(7, 2, 10, 18) + '<path data-stroke d=\"M7 13h10\" stroke=\"#5c5c56\" stroke-width=\"1.2\"/><rect data-fill x=\"9\" y=\"4\" width=\"6\" height=\"7\" fill=\"#c9ced3\" stroke=\"#5c5c56\" stroke-width=\"0.9\"/>' + lg(8, 16)),\n    \"tall-oven\": mini(bx(7, 2, 10, 18) + '<rect data-fill x=\"9\" y=\"8\" width=\"6\" height=\"5\" fill=\"#c9ced3\" stroke=\"#5c5c56\" stroke-width=\"0.9\"/><path data-stroke d=\"M7 7h10M7 14h10\" stroke=\"#5c5c56\" stroke-width=\"1\"/>' + lg(8, 16)),\n    /* the oven + hob base (task 1791557195336): the oven's dark door under a control band, the hob on top */\n    \"base-oven\": mini(bx(4, 5, 16, 12) + '<rect data-fill x=\"5.5\" y=\"9\" width=\"13\" height=\"6\" fill=\"#33363a\" stroke=\"#5c5c56\" stroke-width=\"0.8\"/><path data-stroke d=\"M4 8h16M7 3.6h10\" stroke=\"#5c5c56\" stroke-width=\"1\"/>' + lg(6, 18)),\n    /* the island: wide, freestanding, one door bay + one drawer bay */\n    \"island\": mini(bx(2, 6, 20, 11) + '<path data-stroke d=\"M12 6v11\" stroke=\"#5c5c56\" stroke-width=\"1.2\"/><path data-stroke d=\"M12 9.5h10M12 13h10\" stroke=\"#5c5c56\" stroke-width=\"1\"/><path data-stroke d=\"M2 6h20\" stroke=\"#5c5c56\" stroke-width=\"1.8\"/>' + lg(4, 20))\n  };\n\n  // v2/src/ui/dom.js\n  function show(el, on) {\n    if (!el) return;\n    if (on) el.removeAttribute(\"hidden\");\n    else el.setAttribute(\"hidden\", \"\");\n  }\n  function pressed(el, on) {\n    el.classList.toggle(\"is-active\", on);\n    el.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n  }\n  function selected(scene) {\n    const units = scene.units;\n    for (let i = 0; i < units.length; i++) if (units[i].id === scene.selectedId) return units[i];\n    return units[0];\n  }\n\n  // v2/src/ui/estimate.js\n  var wtOn = () => {\n    try {\n      return worktopOf(UB_SCENE && UB_SCENE.kitchen).on;\n    } catch {\n      return false;\n    }\n  };\n  function frontWords(u, key) {\n    const mat = u.frontMat === \"mdf-paint\" ? paintText(u.paint) : finishLabel(key);\n    const st = u.frontStyle && u.frontStyle !== \"slab\" ? \", \" + styleWords(u.frontStyle) : \"\";\n    return mat + st;\n  }\n  function unitEstimate(u) {\n    return withFinishing(withInterior(estimate(\n      u.w,\n      u.h,\n      u.d,\n      u.finish,\n      priceKey(u),\n      armB2(u),\n      u.type === \"island\" ? { skinDrop: !!u.skinDrop, skinKey: u.skinFinish || u.frontFinish } : void 0\n    ), u), u);\n  }\n  function unitEstimates(units) {\n    const out = new Array(units.length);\n    for (let i = 0; i < units.length; i++) out[i] = unitEstimate(units[i]);\n    return out;\n  }\n  function sceneEstimate(units, ests) {\n    ests = ests || unitEstimates(units);\n    let totalP = 0, walls = 0, pending = 0;\n    const lines = [], incomplete = [];\n    for (let i = 0; i < units.length; i++) {\n      const u = units[i];\n      if (u.family === \"wall\") walls++;\n      const e = ests[i];\n      const gap = noRate(e);\n      if (gap) {\n        pending++;\n        if (incomplete.indexOf(gap) < 0) incomplete.push(gap);\n      }\n      const p = e.quoteOnly ? 0 : pence(e.inc);\n      totalP += p;\n      lines.push({\n        id: u.id,\n        label: unitLabel(u),\n        inc: e.quoteOnly ? null : p / 100,\n        raw: e.quoteOnly ? null : e.inc,\n        atFloor: e.atFloor,\n        family: u.family,\n        incomplete: gap || null\n      });\n    }\n    const total = totalP / 100;\n    const excl = [];\n    if (units.some(function(u) {\n      return u.door;\n    })) excl.push(\"doors and hinges\");\n    if (units.some(function(u) {\n      return u.type === \"base-drawer\";\n    })) excl.push(\"drawer fronts, boxes and runners\");\n    if (units.some(function(u) {\n      return u.type === \"base-4drawer\";\n    }))\n      excl.push(\"the four drawer fronts, boxes and runners on each drawer bank\");\n    if (units.some(function(u) {\n      return u.family === \"corner\";\n    }))\n      excl.push(\"corner post and any corner storage fittings\");\n    if (walls) excl.push(\"wall mounting fittings\");\n    const scribeNote = units.some(function(u) {\n      return finishingOf(u).scribeL || finishingOf(u).scribeR;\n    }) ? \"Scribe strips are included and priced. Their width is a trim-to-fit allowance cut on site - we have not surveyed the wall, so the fitter takes the final cut.\" : null;\n    if (units.some(function(u) {\n      const I = interiorOf(u);\n      return I.shelves || I.vDiv.length || I.hDiv.length;\n    }))\n      excl.push(\"shelf supports and the fixings for fixed partitions - we hold no price for these yet, so they are listed rather than guessed\");\n    const talls = units.filter(isTall);\n    if (talls.length) {\n      excl.push(\"tall unit hinges, legs and hardware\");\n      if (talls.some(isHousing))\n        excl.push(\"all appliances, their ventilation and installation - the housings are PROVISIONAL planning models and need the appliance model confirmed\");\n    }\n    const isles = units.filter(function(u) {\n      return u.type === \"island\";\n    });\n    if (isles.length) {\n      const kk = isles.reduce(function(a, u) {\n        return a.concat(islandBayKinds(u));\n      }, []);\n      if (kk.indexOf(\"doors\") >= 0) excl.push(\"the island bay doors and hinges\");\n      if (kk.indexOf(\"drawers\") >= 0) excl.push(\"the island drawer fronts, boxes and runners\");\n      excl.push(wtOn() ? \"the island worktop - listed separately, not in this figure\" : \"a worktop for the island - NOT included\");\n    }\n    if (units.some(function(u) {\n      return u.family !== \"wall\";\n    })) excl.push(\"plinths\");\n    return {\n      total,\n      totalPence: totalP,\n      totalEx: Math.round(totalP / 1.2) / 100,\n      // ex VAT derived FROM the aggregate\n      lines,\n      excluded: excl,\n      notes: scribeNote ? [scribeNote] : [],\n      priced: units.length - pending,\n      walls,\n      pending,\n      incomplete,\n      complete: !incomplete.length\n    };\n  }\n  function noRate(e) {\n    return !e ? null : e.quoteOnly ? e.label || \"a decor\" : e.incomplete || null;\n  }\n  function estWords(e, what, ex) {\n    const gap = noRate(ex);\n    return gap ? \" \\u2014 \" + what + \" not estimated: no board price held for \" + gap + \" (quoted)\" : \" \\u2014 \" + what + \" est. \" + money(e.inc) + \" inc VAT\";\n  }\n  function plinthBlock(units) {\n    const ids = (units || []).map(function(u) {\n      return u.id;\n    });\n    const t = plinthRunsText(units, function(id) {\n      return \"Cabinet \" + (ids.indexOf(id) + 1);\n    });\n    return t ? \"\\n\" + t : \"\";\n  }\n  function specText(units, ests, options = {}) {\n    ests = ests || unitEstimates(units);\n    const includePrice = options.includePrice !== false;\n    return units.map(function(u, idx) {\n      const n = idx + 1;\n      const ex = ests[idx];\n      const e = { inc: ex.quoteOnly ? null : pence(ex.inc) / 100 };\n      const M = finishLabel;\n      if (isTall(u)) {\n        const leaves = tallLeaves(u);\n        const appliance = isHousing(u);\n        const bits = [];\n        bits.push(\"carcass \" + M(u.finish));\n        bits.push((appliance ? \"appliance fronts \" : \"doors \") + leaves.length + \" leaves \" + frontWords(u, u.doorFinish) + (leaves.some((l) => l.short) ? \" (\" + leaves.map((l) => l.name.toLowerCase() + \" \" + Math.round(l.y1 - l.y0) + \" mm\").join(\", \") + \")\" : \"\"));\n        if (addedDrawersText(u)) bits.push(addedDrawersText(u) + (drawerFrontsOn(u) ? \", drawer fronts \" + frontWords(u, u.frontFinish) : \"\"));\n        if (u.type === \"tall-pantry\") bits.push(tallShelves(u) + \" adjustable shelves\");\n        if (interiorText(u)) bits.push(\"interior: \" + interiorText(u));\n        if (finishingText(u)) bits.push(\"finishing: \" + finishingText(u) + \" in \" + M(u.frontFinish || u.doorFinish || u.finish) + \", overall width \" + u.w + \" mm\");\n        if (u.type === \"tall-fridge\") bits.push(\"open service back for ventilation\");\n        if (u.type === \"tall-oven\") bits.push(\"clear appliance opening \" + Math.round(ovenNiche(u).h) + \" mm high\");\n        bits.push(\"plinth \" + plinthLabel(plinthFinishOf(u)));\n        const exTall = [\"hinges, legs and other hardware\"].concat(addedDrawers(u).length ? [\"drawer boxes and runners\"] : []);\n        if (appliance) exTall.push(\"the appliance itself\", \"its ventilation and installation\");\n        return \"Cabinet \" + n + \": \" + unitLabel(u) + \" \\u2014 \" + bits.join(\", \") + (includePrice ? estWords(e, \"carcass boards\", ex) : \"\") + \" (\" + exTall.join(\", \") + \" not included) \\u2014 PROVISIONAL: \" + tallProvisos(u).join(\"; \") + \". Not approved for manufacture until the hardware is verified.\";\n      }\n      if (u.type === \"island\") {\n        const L = islandBayList(u), kinds = L.map(function(x) {\n          return x.kind;\n        });\n        const fronts = L.map(function(sc, i) {\n          const itx = sc.kind !== \"drawers\" && sc.interior ? interiorText({\n            w: sc.w,\n            h: u.h,\n            d: islandBayD(u),\n            type: \"base\",\n            family: \"base\",\n            interior: sc.interior\n          }) : \"\";\n          return \"section \" + (i + 1) + \" \" + sc.w + \" mm \" + ((sc.kind === \"drawers\" ? drawerFrontsOn(u) : islandBayDoorsOn(u)) ? (sc.kind === \"drawers\" ? \"drawer fronts \" : \"doors \") + frontWords(u, sc.kind === \"drawers\" ? u.frontFinish : u.doorFinish) : sc.kind === \"drawers\" ? \"drawer boxes, no fronts\" : \"no doors\") + (itx ? \" (interior: \" + itx + \")\" : \"\");\n        }).join(\", \");\n        const missing = [];\n        if (kinds.indexOf(\"doors\") >= 0) missing.push(\"bay doors and hinges\");\n        if (kinds.indexOf(\"drawers\") >= 0) missing.push(\"drawer fronts, boxes and runners\");\n        missing.push(wtOn() ? \"the worktop (listed separately)\" : \"a worktop\");\n        return \"Cabinet \" + n + \": \" + unitLabel(u) + \" \\u2014 body \" + islandBodyW(islandBayList(u)) + \" mm across \" + islandBayList(u).length + \" sections plus two 18 mm end panels, bay carcasses \" + M(u.finish) + \", \" + fronts + \", end panels and back \" + (isPaintKey(u.skinFinish) ? paintKeyText(u.skinFinish) : M(u.skinFinish || u.frontFinish)) + (u.skinDrop ? \" (down to the floor)\" : \" (carcass height)\") + \", plinth \" + plinthLabel(plinthFinishOf(u)) + (includePrice ? estWords(e, \"carcasses and applied panels\", ex) : \"\") + \" (\" + missing.join(\", \") + \" not included)\";\n      }\n      return \"Cabinet \" + n + \": \" + unitLabel(u) + (isLPlan(u) || u.type === \"island\" || isTall(u) ? \"\" : \" mm\") + \" \\u2014 carcass \" + finishLabel(u.finish) + (u.door ? \", door \" + frontWords(u, u.doorFinish) : \", no door\") + (u.type === \"base-drawer\" ? drawerFrontsOn(u) ? \", drawer front \" + frontWords(u, u.frontFinish) : \", drawer box, no drawer front\" : \"\") + (u.type === \"base-4drawer\" ? drawerFrontsOn(u) ? \", drawer fronts \" + frontWords(u, u.frontFinish) : \", four drawer boxes, no drawer fronts\" : \"\") + (addedDrawersText(u) ? \", \" + addedDrawersText(u) + (drawerFrontsOn(u) && u.type !== \"base-drawer\" ? \", drawer fronts \" + frontWords(u, u.frontFinish) : \"\") : \"\") + (u.family !== \"wall\" ? \", plinth \" + plinthLabel(plinthFinishOf(u)) : \"\") + (interiorText(u) ? \" \\u2014 interior: \" + interiorText(u) : \"\") + (finishingText(u) ? \" \\u2014 finishing: \" + finishingText(u) + \" in \" + finishLabel(u.frontFinish || u.doorFinish || u.finish) + \" (overall width with finishing \" + overallWidth(u) + \" mm)\" : \"\") + (includePrice ? estWords(e, \"carcass\", ex) : \"\") + (u.family === \"wall\" ? \" (mounting fittings\" + (addedDrawers(u).length ? \", drawer boxes and runners\" : \"\") + \" not included)\" : u.type === \"base-4drawer\" ? \" (four drawer fronts, boxes and runners not included)\" : addedDrawers(u).length ? \" (drawer boxes and runners not included)\" : u.family === \"corner\" ? \" (corner post and corner fittings not included)\" : \"\");\n    }).join(\"\\n\") + plinthBlock(units);\n  }\n  function planData(units) {\n    return JSON.stringify(units.map(function(u) {\n      return {\n        ref: u.id,\n        type: u.type,\n        w: u.w,\n        w2: u.type === \"corner-l\" || u.type === \"corner-tall\" ? armB(u) : void 0,\n        rot: u.rot || 0,\n        hand: u.type === \"corner-blind\" ? u.hand : void 0,\n        h: u.h,\n        d: u.d,\n        x: Math.round(u.x),\n        y: Math.round(u.y || 0),\n        z: Math.round(u.z),\n        carcass: u.finish,\n        door: u.door ? u.doorFinish : null,\n        front: u.type === \"base-drawer\" && drawerFrontsOn(u) ? u.frontFinish : null,\n        drawerFronts: u.type === \"base-drawer\" || u.type === \"base-4drawer\" || u.type === \"island\" ? drawerFrontsOn(u) : void 0,\n        frontMat: u.frontMat || \"mfc\",\n        frontStyle: u.frontStyle || \"slab\",\n        xdrawers: addedDrawers(u).length ? addedDrawers(u).map(function(d) {\n          return {\n            n: d.n,\n            band: d.band,\n            col: d.col,\n            y: Math.round(d.fy0),\n            front: Math.round(d.fh),\n            box: d.mm,\n            boxW: Math.round(d.w),\n            boxL: Math.round(d.l)\n          };\n        }) : void 0,\n        paint: u.frontMat === \"mdf-paint\" ? u.paint : void 0\n      };\n    }));\n  }\n\n  // v2/src/ui/calculator.js\n  var CALC_DEFAULTS = Object.freeze({\n    priceMode: \"calculator-main\",\n    // the only customer-facing order price\n    orderButton: true,\n    // CALC_ORDER_BUTTON: false hides \"Order cut list\"\n    /* 25.09.2026, the owner: \"\u0441 \u0434\u044B\u0440\u043A\u0430\u043C\u0438\u2026 \u043F\u043E 130. \u0410 \u0435\u0441\u043B\u0438 \u0434\u044B\u0440\u043A\u0438 \u043D\u0435 \u0431\u0435\u0440\u0443\u0442, \u0442\u043E\u0433\u0434\u0430 \u043F\u043E 55\u2026 \u043D\u0430\u0434\u043E \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0442\u0435\u043B\u044C\"\n       \u2014 and \"\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043E\u2026 \u043E\u043D\u0438 \u0432\u0441\u0451 \u0437\u0430\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0435\u0442\u0430\u043B\u0438\", so parts only by default. */\n    drillToggle: true,\n    // show the \"CNC drilling\" switch above the calculator price\n    /* OFF by default again (review 08.10.2026; owner 25.09.2026, docs/OWNER-SAID.md: \u00AB\u0435\u043C\u0443 \u043D\u0430\u0434\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0435\u0442\u0430\u043B\u0438.\n       \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043A\u0430\u043A \u0432\u043E\u0442 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043E \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u0431\u044B\u0432\u0430\u0435\u0442, \u043E\u043D\u0438 \u0432\u0441\u0451 \u0437\u0430\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0435\u0442\u0430\u043B\u0438\u00BB). 03.10.2026 it was turned on\n       because the holes now come from the professional configurator (owner: \u00AB\u041F\u0440\u043E\u0444\u0435\u0441\u0441\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u043D\u0435\u0447\u043D\u043E \u044D\u0442\u0430\u043B\u043E\u043D\u00BB) - but\n       the starter plan has drawers whose grooves have no cutter in the workshop (no \u00D84 / \u00D83.5), so drilling on by default\n       hid Buy now on the first screen. CNC drilling is an explicit choice, and the plan remembers it (scene.drilling). */\n    drilling: false,\n    // its starting position for a plan that never chose: panels cut and edged only\n    /* The planner sits on the shop's own domain, so the calculator's line items go straight into the\n       shop's basket (/cart/add.js) \u2014 the same variants the calculator's own order would carry. */\n    basketButton: false,\n    // cart variants do not carry the cut-list dimensions to production\n    /* \"Buy now\" (02.10.2026). The owner: \u00AB\u042F \u0443\u0436\u0435 20 \u0440\u0430\u0437 \u043F\u0440\u043E\u0441\u0438\u043B \u0438\u043D\u0442\u0435\u0433\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0447\u0435\u043A\u0430\u0443\u0442!!!!!! \u2026 \u041D\u0430\u0439\u0442\u0438 \u0441\u043F\u043E\u0441\u043E\u0431\n       \u043B\u044E\u0431\u043E\u0439 \u0446\u0435\u043D\u043E\u0439!!!\u00BB. Not the shop basket above: the server turns this cut list into a cut project in\n       our registry and a Shopify draft order, and the customer pays on Shopify's own checkout page\n       (POST /checkout \u2192 invoice_url). The order note links the project, so the workshop cuts from it. */\n    checkoutButton: true,\n    api: \"https://chat.uniboards.co.uk/api/cabinet-lab\",\n    // CALC_API\n    debounceMs: 2e3,\n    // CALC_DEBOUNCE_MS: wait this long after the last change before asking\n    // (the server allows 30 price requests a minute per visitor)\n    timeoutMs: 15e3,\n    // CALC_TIMEOUT_MS: give up on a request after this long\n    /* The page addresses the server answers (its CORS list). From anywhere else\n       - a local test stand, the render reference, a shared *.shopifypreview.com\n       link - the browser would refuse the reply and print an error in the\n       console, so the request is not even made: the line says the calculator is\n       not available on this page. Add an address here AND on the server\n       (CABINET_LAB_EXTRA_ORIGINS) together. */\n    origins: Object.freeze([\n      \"https://uniboards.co.uk\",\n      \"https://www.uniboards.co.uk\",\n      \"https://uniboards.myshopify.com\",\n      \"https://cut.uniboards.co.uk\"\n    ]),\n    /* Doors and drawer fronts are 18 mm boards the customer would cut too, so\n       the cut list includes them. The planner's own estimate does NOT (it is\n       carcasses only) - the two figures are therefore not the same thing, and\n       the panel says so. false = carcass panels only, like the planner estimate. */\n    includeFronts: true,\n    // CALC_INCLUDE_FRONTS\n    /* Edge banding thickness sent for every banded edge, mm. 0.8 mm is the tape\n       the pricing research costs (23 x 0.8 mm, 75 m roll). PROVISIONAL. */\n    edgeMm: 0.8,\n    // CALC_EDGE_MM\n    /* The 3 mm backs are not MFC: they are sourced as this board (see the\n       PRICING notes in the constants). */\n    thinMaterial: \"Finsa White Painted 1 Side Fibraprint MDF\",\n    // CALC_THIN_MATERIAL\n    /* Decors with a grain direction. White has none, so its panels may be\n       turned on the sheet; oak may not. */\n    grained: Object.freeze({ oak: true })\n    // CALC_GRAINED\n  });\n  function calcConfig(over) {\n    return Object.assign({}, CALC_DEFAULTS, over || {});\n  }\n  function calcRound(x) {\n    return Math.round(x * 10) / 10;\n  }\n  function calcShut(u) {\n    const s = {};\n    for (const k in u) s[k] = u[k];\n    s.doorOpen = false;\n    s.drawerOpen = false;\n    s.drawers = [false, false, false, false];\n    s.leafOpen = [];\n    s.bayOpen = [];\n    s.xopen = [];\n    return s;\n  }\n  var INSIDE_T_AXIS = { \"fixed-v\": \"x\", \"fixed-h\": \"y\", shelf: \"y\", \"end-panel\": \"x\", scribe: \"z\" };\n  function calcPartRow(name2, kind, matKey, b, depthAxis, cfg, ownTAxis) {\n    cfg = cfg || CALC_DEFAULTS;\n    const ext = { x: Math.abs(b.x1 - b.x0), y: Math.abs(b.y1 - b.y0), z: Math.abs(b.z1 - b.z0) };\n    const axes = [\"x\", \"y\", \"z\"].sort(function(m, n) {\n      return ext[m] - ext[n];\n    });\n    const hint = ownTAxis === \"x\" || ownTAxis === \"y\" || ownTAxis === \"z\" ? ownTAxis : INSIDE_T_AXIS[kind];\n    if (hint && axes[0] !== hint && ext[hint] >= 1) {\n      axes.splice(axes.indexOf(hint), 1);\n      axes.unshift(hint);\n    }\n    const tAxis = axes[0], faces = [axes[1], axes[2]];\n    const thick = Math.round(ext[tAxis]);\n    if (thick < 1 || ext[faces[0]] < 1) return null;\n    const thin = thick <= THIN_MAX;\n    const mat = thin ? cfg.thinMaterial : finishLabel(matKey || \"white\");\n    const grain = !thin && !!(cfg.grained[matKey] || decorGrained(matKey));\n    let lenAxis;\n    if (grain) {\n      if (faces.indexOf(\"y\") >= 0) lenAxis = \"y\";\n      else lenAxis = faces[0] === depthAxis ? faces[1] : faces[0];\n    } else {\n      lenAxis = ext[faces[0]] >= ext[faces[1]] ? faces[0] : faces[1];\n    }\n    const widAxis = faces[0] === lenAxis ? faces[1] : faces[0];\n    const e = { L1: 0, L2: 0, W1: 0, W2: 0 };\n    function band(axis) {\n      if (axis === lenAxis) e.L1 = cfg.edgeMm;\n      else e.W1 = cfg.edgeMm;\n    }\n    if (!thin) {\n      if (kind === \"door\" || kind === \"drawer-front\") {\n        e.L1 = e.L2 = e.W1 = e.W2 = cfg.edgeMm;\n      } else if (kind === \"end-panel\") {\n        band(\"y\");\n        band(\"z\");\n      } else if (/^Back|brace|^Rail rear/.test(name2)) {\n      } else if (tAxis !== depthAxis) {\n        band(faces[0] === depthAxis ? faces[1] : faces[0]);\n      } else if (faces.indexOf(\"y\") >= 0) {\n        band(\"y\");\n      }\n    }\n    return {\n      name: name2,\n      material: mat,\n      thickness: thick,\n      length: calcRound(ext[lenAxis]),\n      width: calcRound(ext[widAxis]),\n      qty: 1,\n      edging: e,\n      grain\n    };\n  }\n  function calcUnitRows(u, cfg) {\n    cfg = cfg || CALC_DEFAULTS;\n    const rows = [];\n    if (!u) return rows;\n    if (u.type === \"workshop\") return rows;\n    const s = calcShut(u);\n    if (isIsland(s)) {\n      islandBays(s).forEach(function(bay, i) {\n        calcUnitRows(bay, cfg).forEach(function(r) {\n          r.name = \"Section \" + (i + 1) + \" \" + r.name;\n          rows.push(r);\n        });\n      });\n      const skinMat = u.skinFinish || u.frontFinish || u.finish || \"white\";\n      if (!isPaintKey(skinMat)) islandSkinParts(s).forEach(function(q) {\n        const r = calcPartRow(q.name, /^End panel/.test(q.name) ? \"end-panel\" : \"skin\", skinMat, q, \"z\", cfg);\n        if (r) rows.push(r);\n      });\n      return rows;\n    }\n    const twoArm = u.type === \"corner-l\" || u.type === \"corner-wall\" || u.type === \"corner-tall\";\n    cabinetParts(s).forEach(function(p) {\n      if (p.kind === \"leg\" || p.kind === \"drawer-box\") return;\n      if (!cfg.includeFronts && (p.kind === \"door\" || p.kind === \"drawer-front\")) return;\n      if (s.frontMat === \"mdf-paint\" && (p.kind === \"door\" || p.kind === \"drawer-front\")) return;\n      if (p.kind === \"door\" && glassFrame(s, p.local)) return;\n      if (p.kind === \"finishing\" && isPaintKey(p.material)) return;\n      const depthAxis = twoArm && / B$/.test(p.name) ? \"x\" : \"z\";\n      const kind = p.kind === \"finishing\" ? p.endPanel ? \"end-panel\" : \"scribe\" : p.kind;\n      const box3 = p.kind === \"door\" && !isCornerUnit(s) && !p.finished ? { ...p.local, ...finishedFront(s, p.local) } : p.local;\n      const r = calcPartRow(p.name, kind, p.material, box3, depthAxis, cfg, p.tAxis);\n      if (r) rows.push(r);\n    });\n    if (cfg.includeFronts && isTall(s) && s.door && s.frontMat !== \"mdf-paint\") {\n      (tallLeaves(s) || []).forEach(function(lf) {\n        const r = calcPartRow(\n          lf.name,\n          \"door\",\n          s.doorFinish || s.finish || \"white\",\n          { x0: REVEAL, x1: s.w - REVEAL, y0: lf.y0, y1: lf.y1, z0: s.d, z1: s.d + T },\n          \"z\",\n          cfg\n        );\n        if (r) rows.push(r);\n      });\n    }\n    return rows;\n  }\n  function calcSceneParts(units, cfg) {\n    const out = [];\n    (units || []).forEach(function(u, i) {\n      calcUnitRows(u, cfg).forEach(function(r) {\n        r.name = \"C\" + (i + 1) + \" \" + r.name;\n        r.unit = u.id;\n        out.push(r);\n      });\n    });\n    return out;\n  }\n  function jpullProfileSpec(runMm, edge) {\n    const P2 = JPULL_PLAN;\n    return {\n      path: JPULL_PROFILE.path,\n      units: \"mm\",\n      boardMm: JPULL_PROFILE.boardMm,\n      edge,\n      runMm,\n      backMm: P2.stem,\n      coveFromMm: P2.stem,\n      coveToMm: P2.stem + P2.coveWidth,\n      coveSidesToMm: P2.lipTip + P2.lip,\n      coveBottomMm: P2.coveBottom,\n      lipMm: P2.lip,\n      lipTopMm: P2.lipTip,\n      backAboveLipMm: P2.lipTip,\n      backExtensionMm: JPULL_BACK_EXTENSION_MM,\n      section: jpullSectionMm()\n    };\n  }\n  function jpullProfileWords(p) {\n    return \"J-pull profile, exact mm (one source with the 3D): back \" + p.backMm + \" thick, running to the \" + p.edge + \" edge; cove \" + (p.coveToMm - p.coveFromMm) + \" wide (\" + p.coveFromMm + \"-\" + p.coveToMm + \" from the back), straight sides to \" + p.coveSidesToMm + \", round bottom at \" + p.coveBottomMm + \"; lip \" + p.lipMm + \" thick at the face, its top \" + p.lipTopMm + \" below the back (back \" + p.backAboveLipMm + \" above the lip); along the whole \" + p.runMm + \" mm edge; \" + p.boardMm + \" mm board; path \" + p.path;\n  }\n  function calcQuoteFronts(units) {\n    const out = [];\n    function piece(cab, name2, kind, u, b, finished) {\n      if (kind === \"door\" && !isCornerUnit(u) && !finished) b = { ...b, ...finishedFront(u, b) };\n      const ex = Math.abs(b.x1 - b.x0), ey = Math.abs(b.y1 - b.y0), ez = Math.abs(b.z1 - b.z0);\n      const style2 = u.frontStyle || \"slab\";\n      const routed = style2 !== \"slab\";\n      const styled = routed ? styledBoxes(u, b) : null;\n      const fits2 = !routed || !!(styled && styled.boxes);\n      const shk = style2 === \"shaker\" && fits2 ? styled : null;\n      const frame0 = Number((u.shaker || {}).frame) || 80;\n      out.push({\n        cabinet: cab,\n        name: name2,\n        kind,\n        length: calcRound(ey),\n        width: calcRound(Math.max(ex, ez)),\n        thickness: Math.round(Math.min(ex, ez)),\n        painted: u.frontMat === \"mdf-paint\",\n        pockets: shk ? shk.pockets : 0,\n        frame: shk && shk.frame < frame0 ? shk.frame : 0,\n        style: routed && !fits2 ? \"slab\" : style2,\n        styleNote: routed && !fits2 ? styleOf(style2).long + \" does not fit - flat\" : \"\",\n        /* J-pull (task 1791236257323): which edge carries the integrated pull - the same answer the 3D front draws */\n        pull: style2 === \"jpull\" && fits2 ? styled.edge : \"\",\n        /* ...and its profile in real mm, from the ONE source the 3D sweeps (front-materials.js JPULL_PROFILE): the\n           path, its section points [x across from the back, y from the opening edge], and the run along that edge\n           (the front's width) - task 1791236257323, owner 07.10.2026: \u00ABall these sizes ... real ... transferred to CNC\u00BB */\n        jprofile: style2 === \"jpull\" && fits2 ? jpullProfileSpec(calcRound(Math.max(ex, ez)), styled.edge) : null,\n        /* GLASS DOOR (task 1791491928266): the one-piece frame (its border widths) and its aperture; the glass itself is a row of\n           its own below - never a board */\n        /* ONE PIECE (owner 09.10.2026, confirmed construction): the finished door board with its centre CNC-cut out -\n           the border left at the sides and at the top / bottom, and the aperture [w, h]; no stiles or rails joined */\n        glassFrame: style2 === \"glass\" && fits2 ? {\n          construction: \"one-piece\",\n          border: { side: styled.glass.border.side, end: styled.glass.border.end },\n          aperture: [calcRound(styled.glass.aperture.w), calcRound(styled.glass.aperture.h)]\n        } : null,\n        paint: u.frontMat === \"mdf-paint\" ? Object.assign({}, u.paint) : null\n      });\n      if (style2 === \"glass\" && fits2) out.push({\n        cabinet: cab,\n        name: name2 + \" glass\",\n        kind: \"glass\",\n        glass: true,\n        /* the VISIBLE aperture only: the pane to order is bigger by however it is held, not decided */\n        length: calcRound(styled.glass.aperture.h),\n        width: calcRound(styled.glass.aperture.w),\n        thickness: 0,\n        painted: false,\n        style: \"glass\",\n        styleNote: GLASS_TBC,\n        pockets: 0,\n        frame: 0,\n        pull: \"\",\n        jprofile: null,\n        glassFrame: null,\n        paint: null\n      });\n    }\n    function scan2(u, cab, prefix) {\n      if (u.frontMat !== \"mdf-paint\" && (!u.frontStyle || u.frontStyle === \"slab\")) return;\n      const s = calcShut(u);\n      cabinetParts(s).forEach(function(p) {\n        if (p.kind === \"door\" || p.kind === \"drawer-front\") piece(cab, prefix + p.name, p.kind, u, p.local, !!p.finished);\n      });\n      if (isTall(s) && s.door) (tallLeaves(s) || []).forEach(function(lf) {\n        piece(cab, prefix + lf.name, \"door\", u, { x0: REVEAL, x1: s.w - REVEAL, y0: lf.y0, y1: lf.y1, z0: s.d, z1: s.d + T });\n      });\n    }\n    (units || []).forEach(function(u, i) {\n      const cab = \"C\" + (i + 1);\n      if (isIsland(u)) islandBays(calcShut(u)).forEach(function(bay, j) {\n        scan2(bay, cab, \"Section \" + (j + 1) + \" \");\n      });\n      else scan2(u, cab, \"\");\n    });\n    return out;\n  }\n  var GLASS_TBC = \"glass to be specified: type, thickness, safety class (toughened / laminated) and how it is held (beading, clips or a rebate) - the pane's cut size follows from that and is NOT this aperture; not manufacture-ready\";\n  function calcQuoteFrontsText(units) {\n    const q = calcQuoteFronts(units);\n    if (!q.length) return \"\";\n    const painted = q.filter(function(f) {\n      return f.painted;\n    });\n    const lines = q.map(function(f) {\n      if (f.glass) return f.cabinet + \" \" + f.name + \": visible aperture \" + f.length + \" x \" + f.width + \" mm - \" + GLASS_TBC;\n      return f.cabinet + \" \" + f.name + \" \" + f.length + \" x \" + f.width + \" x \" + f.thickness + \" mm\" + (f.glassFrame ? \" finished (as made and hung)\" : \"\") + \", \" + (f.painted ? \"MDF\" : \"MFC\") + \", \" + styleWords(f.style) + (f.pockets ? \", \" + f.pockets + \" panel\" + (f.pockets === 1 ? \"\" : \"s\") : \"\") + (f.frame ? \", \" + f.frame + \" mm frame\" : \"\") + (f.pull ? \", pull on the \" + f.pull + \" edge\" : \"\") + (f.jprofile ? \" [\" + jpullProfileWords(f.jprofile) + \"]\" : \"\") + (f.glassFrame ? \", one-piece frame: this door board with a \" + f.glassFrame.aperture[1] + \" x \" + f.glassFrame.aperture[0] + \" mm aperture CNC-cut through it, leaving \" + f.glassFrame.border.side + \" mm at the sides and \" + f.glassFrame.border.end + \" mm top and bottom (no joints) - the cut-out's machining and the glass retention detail are to be confirmed\" : \"\") + (f.styleNote ? \" (\" + f.styleNote + \")\" : \"\");\n    });\n    return \"Fronts to quote (\" + q.length + \"): \" + (painted.length ? PAINTED_MDF + \" - \" + paintText(painted[0].paint) + \". \" : \"\") + \"Board, primer and routing are not in the cut-list price\" + (q.some(function(f) {\n      return /^groove/.test(f.style);\n    }) ? \"; grooves are a planning pattern - spacing, width, depth and cutter to be confirmed\" : \"\") + (q.some(function(f) {\n      return f.style === \"jpull\";\n    }) ? \"; the J-pull profile is given in exact mm below - the shaped cutter and the workshop's check of the profile are still to be confirmed (not machine-ready)\" : \"\") + (q.some(function(f) {\n      return f.glass;\n    }) ? \"; glass doors: the frame and the glass are quoted - the glass is not priced or cut here\" : \"\") + \".\\n\" + lines.join(\"\\n\");\n  }\n  function calcQuotePanels(units) {\n    const out = [];\n    const row = function(cab, name2, kind, b, key) {\n      const ex = Math.abs(b.x1 - b.x0), ey = Math.abs(b.y1 - b.y0), ez = Math.abs(b.z1 - b.z0);\n      const tAx = INSIDE_T_AXIS[kind];\n      const t = tAx === \"x\" ? ex : tAx === \"z\" ? ez : Math.min(ex, ez);\n      const w = tAx === \"x\" ? ez : tAx === \"z\" ? ex : Math.max(ex, ez);\n      out.push({\n        cabinet: cab,\n        name: name2,\n        kind,\n        length: calcRound(ey),\n        width: calcRound(w),\n        thickness: Math.round(t),\n        painted: true,\n        paint: paintOfKey(key)\n      });\n    };\n    (units || []).forEach(function(u, i) {\n      const cab = \"C\" + (i + 1);\n      if (isIsland(u)) {\n        if (isPaintKey(u.skinFinish)) islandSkinParts(u).forEach(function(b) {\n          row(cab, b.name, /^End panel/.test(b.name) ? \"end-panel\" : \"skin\", b, u.skinFinish);\n        });\n        return;\n      }\n      cabinetParts(calcShut(u)).forEach(function(p) {\n        if (p.kind === \"finishing\" && isPaintKey(p.material)) row(cab, p.name, p.endPanel ? \"end-panel\" : \"scribe\", p.local, p.material);\n      });\n    });\n    return out;\n  }\n  function calcQuotePanelsText(units) {\n    const q = calcQuotePanels(units);\n    if (!q.length) return \"\";\n    return \"Painted panels to quote (\" + q.length + \"): \" + PAINTED_MDF + \" - \" + paintText(q[0].paint) + \". Board and primer are not in the cut-list price; fixing to the cabinets is confirmed by the workshop.\\n\" + q.map(function(f) {\n      return f.cabinet + \" \" + f.name + \" \" + f.length + \" x \" + f.width + \" x \" + f.thickness + \" mm, MDF, flat\";\n    }).join(\"\\n\");\n  }\n  function calcDrawerBoxes(units) {\n    const n = /* @__PURE__ */ new Map();\n    const add = function(u) {\n      drawerBoxes(u).forEach(function(b) {\n        const key = Math.round(b.w) + \" x \" + Math.round(b.l) + \" x \" + b.mm + \" mm\";\n        n.set(key, (n.get(key) || 0) + 1);\n      });\n    };\n    (units || []).forEach(function(u) {\n      if (isIsland(u)) islandBays(u).forEach(add);\n      else add(u);\n    });\n    return Array.from(n.entries()).map(function(e) {\n      return e[0] + (e[1] > 1 ? \" x\" + e[1] : \"\");\n    });\n  }\n  function calcDrawerBoxSpecText(units) {\n    const n = /* @__PURE__ */ new Map();\n    const add = function(u) {\n      drawerBoxes(u).forEach(function(b) {\n        const key = Math.round(b.w) + \" x \" + Math.round(b.l) + \" x \" + Math.round(b.h) + \" mm box: \" + model1Text(b.w, b.l, b.h);\n        n.set(key, (n.get(key) || 0) + 1);\n      });\n    };\n    (units || []).forEach(function(u) {\n      if (isIsland(u)) islandBays(u).forEach(add);\n      else add(u);\n    });\n    if (!n.size) return \"\";\n    return \"Drawer boxes - \" + MODEL1.name + \" (18 mm board): base in \" + MODEL1.grooveW + \" x \" + MODEL1.grooveD + \" side grooves \" + MODEL1.strip + \" mm up, front and back sit on the base flush with the side tops (no groove), side strip under the base shaved \" + MODEL1.shaveD + \" mm inside for concealed undermount runners.\\n\" + Array.from(n.entries()).map(function(e) {\n      return e[0] + (e[1] > 1 ? \" (x\" + e[1] + \")\" : \"\");\n    }).join(\"\\n\") + \"\\nTo confirm before machining: \" + MODEL1_OPEN.join(\"; \") + \".\";\n  }\n  function calcQuoteWorktops(units, kitchen) {\n    const k = kitchen !== void 0 ? kitchen : UB_SCENE && UB_SCENE.kitchen;\n    try {\n      return worktopParts(units || [], k);\n    } catch {\n      return [];\n    }\n  }\n  function calcWorktopBoards(scene) {\n    if (!scene || !scene.kitchen || !worktopOf(scene.kitchen).on) return null;\n    return calcQuoteWorktops(Array.isArray(scene.units) ? scene.units : [], scene.kitchen);\n  }\n  function calcApplianceList(scene) {\n    const units = scene && Array.isArray(scene.units) ? scene.units : [];\n    const out = [];\n    units.filter(isOvenBase).forEach((u) => [\"oven\", \"hob\"].concat(u.hood ? [\"hood\"] : []).forEach((k) => {\n      const a = APPLIANCES[k];\n      out.push({ unit: u.id, kind: k, brand: a.brand, model: a.model, name: a.name, page: a.page });\n    }));\n    return out.length ? out : null;\n  }\n  function calcSplashList(scene) {\n    if (!scene || !scene.kitchen) return null;\n    const S2 = splashOf(scene.kitchen);\n    if (!S2.on) return null;\n    let P2 = [];\n    try {\n      P2 = splashPanels(Array.isArray(scene.units) ? scene.units : [], scene.kitchen, scene.room || null);\n    } catch {\n      P2 = [];\n    }\n    return {\n      kind: S2.kind,\n      colour: S2.colour,\n      tile: S2.kind === \"tiles\" ? { ...S2.tile } : null,\n      name: splashName(S2),\n      panels: P2.map((p) => ({ run: p.run, length: Math.round(p.hi - p.lo), heights: [...new Set(p.segs.map((g2) => Math.round(g2.top - p.y0)))], area: p.area, flags: p.flags.slice() })),\n      area: Math.round(P2.reduce((t, p) => t + p.area, 0) * 100) / 100\n    };\n  }\n  function calcQuoteWorktopsText(units, kitchen) {\n    const q = calcQuoteWorktops(units, kitchen);\n    if (!q.length) return \"\";\n    const priced = q.filter((p) => p.price), sum = priced.reduce((t, p) => t + p.price.price, 0);\n    return \"Worktops (\" + q.length + \" board\" + (q.length === 1 ? \"\" : \"s\") + \", EGGER via Panelco: \" + q[0].decor + \" \" + q[0].lineName + \", \" + q[0].family + \"):\\n\" + q.map(function(p) {\n      return p.name + \": \" + p.finished.l + \" x \" + p.finished.d + \" x \" + p.finished.t + \" mm finished, from \" + (p.board ? \"board \" + p.board.sku + \" \" + p.board.l + \" x \" + p.board.d + (p.board.bar ? \" (breakfast bar)\" : \"\") : \"NO SUPPLIED BOARD\") + (p.price ? \" - our shop \\xA3\" + p.price.price.toFixed(2) : \" - price on request\") + (p.joints.length ? \"; \" + p.joints.join(\"; \") : \"\") + (p.flags.length ? \"; CHECK: \" + p.flags.join(\"; \") : \"\");\n    }).join(\"\\n\") + \"\\n\" + (priced.length ? priced.length + \" board\" + (priced.length === 1 ? \"\" : \"s\") + \" at our shop price \\xA3\" + sum.toFixed(2) + \"; \" : \"\") + (q.length - priced.length ? q.length - priced.length + \" quoted separately. \" : \"\") + \"Not in the cut-list price. No sink / hob cut-outs or joint machining are included; the edges and joints are confirmed by the workshop.\";\n  }\n  function calcWorkshopNote(units) {\n    const nWs = (units || []).filter(function(u) {\n      return u && u.type === \"workshop\";\n    }).length;\n    return nWs ? nWs + \" workshop cabinet\" + (nWs === 1 ? \"\" : \"s\") + \" - built from the workshop document (its panels, materials, edging and machining), not priced in this cut list\" : \"\";\n  }\n  function calcExcluded(units, cfg, kitchen) {\n    cfg = cfg || CALC_DEFAULTS;\n    const x = [\"legs\", \"hinges, runners and other hardware\"];\n    const q = calcQuoteFronts(units);\n    const nPaint = q.filter(function(f) {\n      return f.painted;\n    }).length;\n    const nPanel = calcQuotePanels(units).length;\n    if (nPaint) x.push(nPaint + \" painted MDF front\" + (nPaint === 1 ? \"\" : \"s\") + \" (quote required)\");\n    if (nPanel) x.push(nPanel + \" painted MDF panel\" + (nPanel === 1 ? \"\" : \"s\") + \" - end panels, scribes, island ends and back (quote required)\");\n    if (q.some(function(f) {\n      return !f.painted && f.style === \"shaker\";\n    })) x.push(\"Shaker recess machining (quoted separately)\");\n    if (q.some(function(f) {\n      return !f.painted && /^groove/.test(f.style);\n    })) x.push(\"groove routing (quoted separately)\");\n    if (q.some(function(f) {\n      return f.style === \"jpull\";\n    })) x.push(\"J-pull finger-pull machining (quoted with the painted fronts)\");\n    const nGlass = q.filter(function(f) {\n      return f.glass;\n    }).length;\n    if (nGlass) x.push(nGlass + \" glass door\" + (nGlass === 1 ? \"\" : \"s\") + \" - frame and glass (quote required; glass to be specified)\");\n    if ((units || []).some(function(u) {\n      return u.type === \"base-drawer\" || u.type === \"base-4drawer\" || hasDrawerBoxes(u) || u.type === \"island\" && islandBayKinds(u).indexOf(\"drawers\") >= 0;\n    })) {\n      const sizes = calcDrawerBoxes(units);\n      x.unshift(\"drawer boxes\" + (sizes.length ? \" (\" + sizes.join(\", \") + \")\" : \"\"));\n    }\n    if (!cfg.includeFronts) x.unshift(\"doors and drawer fronts\");\n    if (golaUsed(units)) x.push(\"Gola profiles and the side-panel notches (quoted on request)\");\n    const ws = calcWorkshopNote(units);\n    if (ws) x.push(ws);\n    x.push(\"plinths\");\n    const wq = calcQuoteWorktops(units, kitchen);\n    x.push(wq.length ? \"worktops (\" + wq.length + \" board\" + (wq.length === 1 ? \"\" : \"s\") + \", listed separately)\" : \"worktops\");\n    const nOv = (units || []).filter(isOvenBase).length;\n    if (splashOf(kitchen !== void 0 ? kitchen : UB_SCENE && UB_SCENE.kitchen).on) x.push(\"the splashback (listed separately)\");\n    if (nOv) x.push(\"the Bosch oven\" + (nOv === 1 ? \"\" : \"s\") + \", hob\" + (nOv === 1 ? \"\" : \"s\") + ((units || []).some((u) => isOvenBase(u) && u.hood) ? \" and hood\" : \"\") + \" (listed separately)\");\n    return x;\n  }\n  function calcMoney(n) {\n    return \"\\xA3\" + Number(n).toFixed(2);\n  }\n  function calcOriginOk(win2, cfg) {\n    let o = null;\n    try {\n      o = win2 && win2.location && win2.location.origin || null;\n    } catch {\n      o = null;\n    }\n    return !o || cfg.origins.indexOf(o) >= 0;\n  }\n  function calcPost(win2, cfg, path2, body) {\n    const f = win2 && win2.fetch ? function(u, o) {\n      return win2.fetch(u, o);\n    } : null;\n    if (!f) return Promise.reject(new Error(\"no fetch\"));\n    if (!calcOriginOk(win2, cfg)) {\n      const no = new Error(\"origin\");\n      no.calcReason = \"The calculator is not available on this page address.\";\n      return Promise.reject(no);\n    }\n    let ctl = null;\n    const tm = { id: null };\n    try {\n      ctl = typeof win2.AbortController === \"function\" ? new win2.AbortController() : null;\n    } catch {\n      ctl = null;\n    }\n    const opts = {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(body),\n      credentials: \"omit\"\n    };\n    if (ctl) opts.signal = ctl.signal;\n    return new Promise(function(resolve, reject) {\n      if (ctl) tm.id = win2.setTimeout(function() {\n        try {\n          ctl.abort();\n        } catch {\n        }\n      }, cfg.timeoutMs);\n      let p;\n      try {\n        p = f(cfg.api + path2, opts);\n      } catch (e) {\n        p = Promise.reject(e);\n      }\n      Promise.resolve(p).then(function(res) {\n        if (!res || typeof res.json !== \"function\") throw new Error(\"no response\");\n        const status = res.status;\n        return res.json().then(\n          function(j) {\n            return { status, ok: !!res.ok, json: j };\n          },\n          function() {\n            return { status, ok: false, json: null };\n          }\n        );\n      }).then(\n        function(r) {\n          if (tm.id) win2.clearTimeout(tm.id);\n          resolve(r);\n        },\n        function(e) {\n          if (tm.id) win2.clearTimeout(tm.id);\n          reject(e);\n        }\n      );\n    });\n  }\n  function calcReason(r) {\n    const j = r && r.json, st = r && r.status;\n    if (st === 429) return \"Too many price requests from this connection - it will work again in a minute.\";\n    if (st === 502 || st === 504) return \"The cutting engine is busy or down just now.\";\n    if (st === 403) return \"This page is not allowed to ask the calculator (origin not allowed).\";\n    if (st === 413) return \"This kitchen is too large to price in one go.\";\n    if (j && typeof j.error === \"string\" && j.error) return j.error;\n    return st ? \"The calculator answered \" + st + \".\" : \"The calculator could not be reached.\";\n  }\n  var EGGER_ID = /\\bEgger ([A-Z]{1,2}\\d{3,4}) ([A-Z]{2}\\d{0,3})\\b/;\n  function calcDecorMismatch(rows, j) {\n    const sheets = j && Array.isArray(j.sheets) ? j.sheets : [];\n    if (!sheets.length || !Array.isArray(rows)) return [];\n    const unmapped = (j && j.unmapped_materials || []).map(function(u) {\n      return String(u && u.label || u);\n    });\n    const out = [];\n    for (const row of rows) {\n      const label = String(row && row.material || \"\"), m = EGGER_ID.exec(label);\n      if (!m || out.indexOf(label) >= 0) continue;\n      if (unmapped.some(function(u) {\n        return u.indexOf(label) === 0;\n      })) continue;\n      const code = new RegExp(\"\\\\b\" + m[1] + \"\\\\b\", \"i\"), tex = new RegExp(\"\\\\b\" + m[2] + \"\\\\b\", \"i\");\n      if (!sheets.some(function(x) {\n        const t = String(x && x.material || \"\");\n        return code.test(t) && tex.test(t);\n      })) out.push(label);\n    }\n    return out;\n  }\n  var LEGACY_BOARD = { W1000: \"ST9\", W1100: \"ST9\", H1385: \"ST40\" };\n  function calcNeedsExactCheck(rows) {\n    const out = [];\n    for (const row of rows || []) {\n      const label = String(row && row.material || \"\"), m = EGGER_ID.exec(label);\n      if (m && LEGACY_BOARD[m[1]] !== m[2] && out.indexOf(label) < 0) out.push(label);\n    }\n    return out;\n  }\n  function calcOrderBlock(st, labels) {\n    if (!st || st.phase === \"ok\") return null;\n    const named = st.mismatch && st.mismatch.length ? st.mismatch : st.unmapped && st.unmapped.length ? st.unmapped : labels;\n    return Object.assign(new Error(\"No exact catalogue price for \" + named.join(\", \") + \" yet.\"), {\n      fromServer: true,\n      code: st.phase === \"unavailable\" ? \"quote_unavailable\" : \"no_exact_board\",\n      calcReason: st.phase === \"unavailable\" ? \"The price of \" + named.join(\", \") + \" could not be confirmed just now. Please try again, or send the enquiry below.\" : \"No exact catalogue price is linked for \" + named.join(\", \") + \" yet, so it cannot be ordered here. Please send the enquiry below.\"\n    });\n  }\n  function calcReadQuote(r, rows) {\n    const j = r && r.json;\n    if (!r || !r.ok || !j || j.ok !== true || !j.totals || typeof j.totals.inc_vat !== \"number\" || !isFinite(j.totals.inc_vat))\n      return { phase: \"unavailable\", reason: calcReason(r), status: r && r.status || 0 };\n    const unmapped = (j.unmapped_materials || []).map(String);\n    const unpriced = (j.lines || []).filter(function(l) {\n      return l && l.status === \"no_price\";\n    });\n    const mismatch = calcDecorMismatch(rows, j);\n    if (mismatch.length) return {\n      phase: \"incomplete\",\n      incVat: null,\n      exVat: null,\n      vat: null,\n      mismatch,\n      unmapped,\n      unpriced: unpriced.length,\n      sheets: j.sheets || [],\n      warnings: j.warnings || [],\n      note: j.provisional && j.provisional.note || \"\",\n      scope: j.scope || \"\",\n      drilling: j.drilling === true,\n      cart: null,\n      primer: j.primer && typeof j.primer === \"object\" ? j.primer : null\n    };\n    const complete = j.complete !== false && !unmapped.length && !unpriced.length;\n    return {\n      phase: complete ? \"ok\" : \"incomplete\",\n      mismatch: [],\n      incVat: j.totals.inc_vat,\n      exVat: j.totals.ex_vat,\n      vat: j.totals.vat,\n      unmapped,\n      unpriced: unpriced.length,\n      sheets: j.sheets || [],\n      warnings: j.warnings || [],\n      note: j.provisional && j.provisional.note || \"\",\n      scope: j.scope || \"\",\n      drilling: j.drilling === true,\n      /* the configurator built the plan: { ok, cabinets, unsupported, drilling } (null: no plan sent) */\n      cnc: j.cnc && typeof j.cnc === \"object\" ? j.cnc : null,\n      /* the price the shopper accepts: Buy now sends it back and the server orders at exactly that price\n         (task 1790935635323); the business terms the price is made on (made to order, the \u00A3300 minimum) */\n      quoteId: typeof j.quote_id === \"string\" ? j.quote_id : null,\n      terms: j.terms && typeof j.terms === \"object\" ? j.terms : null,\n      /* the hardware priced in: { label, items: [{ qty, title }], notIncluded: [item] } or null (card 1791454714368) */\n      hardware: calcReadHardware(j.hardware),\n      /* primed painted MDF fronts (card 1791454713907): what the server lets this plan buy, and whether it is in the price */\n      primer: j.primer && typeof j.primer === \"object\" ? j.primer : null,\n      cart: calcReadCart(j.cart)\n    };\n  }\n  function calcReadHardware(h) {\n    if (!h || typeof h !== \"object\" || !Array.isArray(h.extras)) return null;\n    return {\n      label: String(h.label || \"\"),\n      items: h.extras.filter(function(e) {\n        return e && Number(e.qty) > 0;\n      }).map(function(e) {\n        return { qty: Math.round(Number(e.qty)), title: String(e.title || \"item\") };\n      }),\n      notIncluded: (Array.isArray(h.not_included) ? h.not_included : []).map(function(x) {\n        return String(x && x.item || \"\");\n      }).filter(Boolean)\n    };\n  }\n  function calcReadCart(c) {\n    if (!c || !Array.isArray(c.lines)) return null;\n    const lines = c.lines.filter(function(l) {\n      return l && /^\\d+$/.test(String(l.variant_id)) && Number(l.quantity) > 0;\n    }).map(function(l) {\n      return { id: Number(l.variant_id), quantity: Math.round(Number(l.quantity)), label: l.label || \"\" };\n    });\n    const unpaired = (Array.isArray(c.unpaired) ? c.unpaired : []).map(function(u) {\n      return String(u && u.label || \"edging\");\n    });\n    const skipped = (Array.isArray(c.skipped) ? c.skipped : []).map(function(u) {\n      return String(u && u.label || \"item\");\n    });\n    return {\n      lines,\n      unpaired,\n      skipped,\n      complete: c.complete === true && lines.length > 0,\n      priceVerified: c.price_verified === true\n    };\n  }\n  function calcAddToBasket(win2, cart) {\n    if (!cart || !cart.lines.length) return Promise.reject(Object.assign(new Error(\"empty\"), { calcReason: \"Nothing to add yet.\" }));\n    if (!cart.complete || cart.unpaired.length || cart.skipped.length) {\n      return Promise.reject(Object.assign(new Error(\"incomplete\"), { calcReason: \"The basket is missing part of this cut list. Use \\u201COrder cut list\\u201D to check the full order.\" }));\n    }\n    if (!cart.priceVerified) {\n      return Promise.reject(Object.assign(new Error(\"price-unverified\"), { calcReason: \"The shop basket price has not been checked against the cut-list quote. Use \\u201COrder cut list\\u201D.\" }));\n    }\n    const host = win2 && win2.location && win2.location.hostname || \"\";\n    if (!/(^|\\.)uniboards\\.co\\.uk$|\\.myshopify\\.com$/.test(host) || /^cut\\./.test(host) || /^chat\\./.test(host)) {\n      return Promise.reject(Object.assign(new Error(\"not-shop\"), { calcReason: \"The basket works on the shop page \\u2014 here, use \\u201COrder cut list\\u201D.\" }));\n    }\n    const missing = cart.unpaired.concat(cart.skipped);\n    const items = cart.lines.map(function(l, i) {\n      const it = { id: l.id, quantity: l.quantity };\n      if (i === 0 && missing.length) it.properties = { \"To confirm\": missing.join(\"; \") };\n      return it;\n    });\n    return win2.fetch(\"/cart/add.js\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\", \"Accept\": \"application/json\" },\n      body: JSON.stringify({ items }),\n      credentials: \"same-origin\"\n    }).then(function(res) {\n      if (!res || !res.ok) return (res && typeof res.json === \"function\" ? res.json() : Promise.resolve({})).then(function(j) {\n        throw Object.assign(new Error(\"cart\"), { calcReason: j && (j.description || j.message) || \"The basket did not accept these items.\" });\n      });\n      return { added: items.length, missing };\n    });\n  }\n  function calcVerifyBasket(win2, cfg, rows, drilling) {\n    if (!Array.isArray(rows) || !rows.length) return Promise.reject(Object.assign(new Error(\"empty\"), { calcReason: \"Nothing to add yet.\" }));\n    const body = { parts: rows, machining: false, verify_cart: true };\n    if (drilling) body.drilling = true;\n    return calcPost(win2, cfg, \"/quote\", body).then(function(r) {\n      const st = calcReadQuote(r, rows);\n      if (st.phase === \"unavailable\") throw Object.assign(new Error(\"quote\"), { calcReason: st.reason });\n      if (st.phase !== \"ok\" || !st.cart || !st.cart.complete || !st.cart.priceVerified) {\n        throw Object.assign(new Error(\"price-unverified\"), {\n          calcReason: \"The current shop basket price does not match the cut-list quote. Use \\u201COrder cut list\\u201D.\"\n        });\n      }\n      return st.cart;\n    });\n  }\n  function calcLineText(st, nParts, excl, cfg, units) {\n    cfg = cfg || CALC_DEFAULTS;\n    const head = \"Calculator price: \";\n    if (!st || st.phase === \"idle\") return { line: head + \"waiting\\u2026\", note: \"\" };\n    const ws = st.phase === \"empty\" ? calcWorkshopNote(units) : \"\";\n    if (ws) return { line: head + \"not priced here - workshop cabinet\", note: \"Not in this cut list: \" + ws + \".\" };\n    if (st.phase === \"empty\") return { line: head + \"nothing to price\", note: \"\" };\n    if (st.phase === \"loading\") return { line: head + \"calculating\\u2026\", note: \"\" };\n    if (st.phase === \"unavailable\")\n      return {\n        line: head + \"unavailable right now\",\n        note: (st.reason ? st.reason + \" \" : \"\") + (cfg.priceMode === \"calculator-main\" ? \"Open the cut-list calculator or send an enquiry to get a price.\" : \"The planner estimate is unaffected.\")\n      };\n    const sheets = (st.sheets || []).map(function(s) {\n      return (s.count || 0) + \" \\xD7 \" + (s.material || \"board\") + (typeof s.utilisation === \"number\" ? \" (\" + Math.round(s.utilisation > 1 ? s.utilisation : s.utilisation * 100) + \"% used)\" : \"\");\n    }).join(\", \");\n    const note = \"Cut list of \" + nParts + \" panel\" + (nParts === 1 ? \"\" : \"s\") + (cfg.includeFronts ? \" including doors and drawer fronts\" : \"\") + (excl && excl.length ? \"; not in it: \" + excl.join(\", \") : \"\") + (sheets ? \"; sheets: \" + sheets : \"\") + \".\";\n    if (st.phase === \"incomplete\" && st.mismatch && st.mismatch.length)\n      return { line: head + \"incomplete \\u2014 no catalogue price for \" + st.mismatch.join(\", \"), note };\n    if (st.phase === \"incomplete\")\n      return {\n        line: head + calcMoney(st.incVat) + \" inc VAT so far \\u2014 incomplete\" + (st.unmapped.length ? \" (materials: \" + st.unmapped.join(\", \") + \")\" : st.unpriced ? \" (\" + st.unpriced + \" line\" + (st.unpriced === 1 ? \"\" : \"s\") + \" not priced)\" : \"\"),\n        note\n      };\n    return {\n      line: head + calcMoney(st.incVat) + \" inc VAT (whole sheets, cutting, edging) \\u2014 provisional\",\n      note\n    };\n  }\n  function calcHardwareOf(scene) {\n    return hardwareOf(scene);\n  }\n  function calcController(o) {\n    const cfg = o.cfg || CALC_DEFAULTS, win2 = o.win;\n    const S2 = {\n      st: { phase: \"idle\" },\n      timer: null,\n      seq: 0,\n      sentSig: null,\n      parts: [],\n      drilling: cfg.drilling === true\n    };\n    const setT = o.setTimeout || function(f, ms) {\n      return win2.setTimeout(f, ms);\n    };\n    const clrT = o.clearTimeout || function(h) {\n      win2.clearTimeout(h);\n    };\n    function set(n) {\n      S2.st = n;\n      try {\n        o.onState(S2.st);\n      } catch {\n      }\n    }\n    function planNow() {\n      let scene = null, wt = null;\n      if (o.getScene) {\n        try {\n          scene = o.getScene() || null;\n        } catch {\n          scene = null;\n        }\n      }\n      try {\n        wt = calcWorktopBoards(scene);\n      } catch {\n        wt = null;\n      }\n      let ap = null, sp = null;\n      try {\n        ap = calcApplianceList(scene);\n        sp = calcSplashList(scene);\n      } catch {\n        ap = sp = null;\n      }\n      return { scene, wt, ap, sp };\n    }\n    const sigOf = (rows, P2) => JSON.stringify(rows) + (S2.drilling ? \"|drill\" : \"\") + (calcHardwareOf(P2.scene) ? \"|hw\" + calcHardwareOf(P2.scene) : \"\") + (P2.wt ? \"|wt\" + JSON.stringify(P2.wt) : \"\") + (P2.ap ? \"|ap\" + JSON.stringify(P2.ap) : \"\") + (P2.sp ? \"|sp\" + JSON.stringify(P2.sp) : \"\") + (P2.scene && P2.scene.kitchen && P2.scene.kitchen.primer === true ? \"|primer\" : \"\");\n    function run(force) {\n      S2.timer = null;\n      let rows;\n      try {\n        rows = o.getParts() || [];\n      } catch {\n        rows = [];\n      }\n      const P2 = planNow();\n      const sig = sigOf(rows, P2);\n      if (!force && sig === S2.sentSig && S2.st.phase !== \"unavailable\") return;\n      S2.sentSig = sig;\n      S2.parts = rows;\n      if (!rows.length) {\n        S2.seq++;\n        set({ phase: \"empty\" });\n        return;\n      }\n      const my = ++S2.seq;\n      set({ phase: \"loading\" });\n      const body = { parts: rows, machining: false };\n      if (S2.drilling) body.drilling = true;\n      if (P2.scene) body.scene = P2.scene;\n      if (P2.wt) body.worktops = P2.wt;\n      if (P2.ap) body.appliances = P2.ap;\n      if (P2.sp) body.splashbacks = P2.sp;\n      if (calcHardwareOf(P2.scene)) body.hardware = calcHardwareOf(P2.scene);\n      const p = calcPost(win2, cfg, \"/quote\", body);\n      p.then(\n        function(r) {\n          if (my === S2.seq) set(calcReadQuote(r, rows));\n        },\n        function(e) {\n          if (my === S2.seq) set({\n            phase: \"unavailable\",\n            status: 0,\n            reason: e && e.calcReason || \"The calculator could not be reached.\"\n          });\n        }\n      );\n    }\n    return {\n      poke: function() {\n        let rows;\n        try {\n          rows = o.getParts() || [];\n        } catch {\n          rows = [];\n        }\n        const sig = sigOf(rows, planNow());\n        if (sig === S2.sentSig && S2.timer == null && S2.st.phase !== \"unavailable\") return;\n        if (S2.timer != null) clrT(S2.timer);\n        S2.seq++;\n        S2.sentSig = null;\n        set({ phase: \"loading\" });\n        S2.timer = setT(function() {\n          run(false);\n        }, cfg.debounceMs);\n      },\n      now: function() {\n        if (S2.timer != null) {\n          clrT(S2.timer);\n          S2.timer = null;\n        }\n        run(true);\n      },\n      state: function() {\n        return S2.st;\n      },\n      partCount: function() {\n        return S2.parts.length;\n      },\n      drilling: function() {\n        return S2.drilling;\n      },\n      /* the drilling switch: ask again at once with the new setting */\n      setDrilling: function(on) {\n        S2.drilling = on === true;\n        if (S2.timer != null) {\n          clrT(S2.timer);\n          S2.timer = null;\n        }\n        run(true);\n      },\n      /* Buy now / Order cut list - after the exact-decor check (verified) */\n      /* scene, drilling: the plan and the drilling switch - the server builds the plan with the\n         configurator, and its parts and holes go into the order (cards 1790943069435, 1790937288681) */\n      /* extra: { quoteId, plan: { id, revision }, build, acceptOffer } - the accepted price and which plan it was */\n      checkout: function(name2, rows, requestId, email, token, scene, drilling, extra) {\n        return verified(rows).then(function() {\n          return checkoutNow(name2, rows, requestId, email, token, scene, drilling, extra || {});\n        });\n      },\n      order: function(name2, rows, token, scene, drilling, who) {\n        return verified(rows).then(function() {\n          return orderNow(name2, rows, token, scene, drilling, who);\n        });\n      }\n    };\n    function verified(rows) {\n      const labels = calcNeedsExactCheck(rows);\n      if (!labels.length) return Promise.resolve();\n      const same = JSON.stringify(rows) === JSON.stringify(S2.parts) && (S2.st.phase === \"ok\" || S2.st.phase === \"incomplete\");\n      const st = same ? Promise.resolve(S2.st) : calcPost(win2, cfg, \"/quote\", { parts: rows, machining: false }).then(function(r) {\n        return calcReadQuote(r, rows);\n      });\n      return st.then(function(q) {\n        const b = calcOrderBlock(q, labels);\n        if (b) throw b;\n      });\n    }\n    function checkoutNow(name2, rows, requestId, email, token, scene, drilling, extra) {\n      {\n        const body = { name: name2, parts: rows, request_id: requestId };\n        if (extra.quoteId) body.quote_id = extra.quoteId;\n        if (extra.plan && extra.plan.id) body.plan = { id: String(extra.plan.id), revision: extra.plan.revision };\n        if (extra.build) body.build = String(extra.build);\n        if (extra.acceptOffer) body.accept_offer = extra.acceptOffer;\n        if (extra.deliveryPostcode) body.delivery_postcode = String(extra.deliveryPostcode);\n        if (extra.customer) body.customer = extra.customer;\n        if (extra.session) body.session = extra.session;\n        if (scene) body.scene = scene;\n        if (drilling) body.drilling = true;\n        if (calcHardwareOf(scene)) body.hardware = calcHardwareOf(scene);\n        if (email) body.email = email;\n        if (typeof token === \"string\" && token) body.token = token;\n        const slow = Object.assign({}, cfg, { timeoutMs: Math.max(cfg.timeoutMs || 0, 45e3) });\n        return calcPost(win2, slow, \"/checkout\", body).then(function(r) {\n          const j = r && r.json;\n          if (!r || !r.ok || !j || j.ok !== true || typeof j.invoice_url !== \"string\" || !/^https:\\/\\/([a-z0-9-]+\\.)*(uniboards\\.co\\.uk|myshopify\\.com|shopify\\.com)\\//i.test(j.invoice_url)) {\n            const err = new Error(j && (j.error || j.message) || (r && r.status ? \"HTTP \" + r.status : \"no reply\"));\n            err.fromServer = !!(j && j.error);\n            err.code = j && j.code || \"\";\n            if (j && j.offer) err.offer = j.offer;\n            if (j && j.quote) err.quote = j.quote;\n            if (j && Array.isArray(j.reasons)) err.reasons = j.reasons.map(String);\n            if (j && typeof j.token === \"string\") err.token = j.token;\n            throw err;\n          }\n          return {\n            url: j.invoice_url,\n            orderName: j.order_name || \"\",\n            total: j.total || \"\",\n            projectId: j.project_id || null,\n            token: typeof j.token === \"string\" ? j.token : null,\n            delivery: j.delivery && typeof j.delivery === \"object\" && j.delivery.postcode ? { postcode: String(j.delivery.postcode), price: Number(j.delivery.price) } : null\n          };\n        });\n      }\n    }\n    function orderNow(name2, rows, token, scene, drilling, who) {\n      {\n        const body = { name: name2, parts: rows };\n        if (who && who.customer) body.customer = who.customer;\n        if (who && who.session) body.session = who.session;\n        if (scene) body.scene = scene;\n        let wt = null;\n        try {\n          wt = calcWorktopBoards(scene);\n        } catch {\n          wt = null;\n        }\n        if (wt) body.worktops = wt;\n        let ap = null, sp = null;\n        try {\n          ap = calcApplianceList(scene);\n          sp = calcSplashList(scene);\n        } catch {\n          ap = sp = null;\n        }\n        if (ap) body.appliances = ap;\n        if (sp) body.splashbacks = sp;\n        if (drilling) body.drilling = true;\n        if (typeof token === \"string\" && token) body.token = token;\n        const p = calcPost(win2, cfg, \"/to-calculator\", body);\n        return p.then(function(r) {\n          const j = r && r.json;\n          if (!r || !r.ok || !j || j.ok !== true || typeof j.url !== \"string\" || !/^https:\\/\\//.test(j.url)) {\n            const err = new Error(j && (j.error || j.message) || (r && r.status ? \"HTTP \" + r.status : \"no reply\"));\n            err.fromServer = !!(j && j.error);\n            throw err;\n          }\n          return {\n            url: j.url,\n            expires: j.expires || null,\n            token: typeof j.token === \"string\" ? j.token : null,\n            updated: j.updated === true,\n            freshReason: j.fresh_reason || null\n          };\n        });\n      }\n    }\n  }\n\n  // v2/src/ui/estimate-panel.js\n  function createEstimatePanel(ctx, options = {}) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win || doc2 && doc2.defaultView;\n    const calculatorMain = options.calculatorMain === true;\n    const q = (s) => root.querySelector(s);\n    const el = {\n      price: q(\".ub-lab__price\"),\n      note: q(\".ub-lab__price-note\"),\n      label: q(\"[data-ub-price-label]\"),\n      doorprice: q(\"[data-ub-doorprice]\"),\n      excluded: q(\"[data-ub-excluded]\"),\n      wallfit: q(\"[data-ub-wallfittings]\"),\n      list: q(\"[data-ub-list]\"),\n      remove: q(\"[data-ub-remove]\"),\n      spec: q(\".ub-lab__spec\"),\n      title: q(\"[data-ub-doc-title]\"),\n      material: q(\"[data-ub-doc-material]\"),\n      dims: q(\"[data-ub-doc-dims]\"),\n      build: q(\"[data-ub-doc-build]\")\n    };\n    if (calculatorMain) {\n      const note = q(\".ub-lab__estnote\");\n      if (note) note.textContent = \"The cut-list price covers the boards, cutting, edging and any drilling. Hardware is not included, we do not offer assembly, and delivery is added separately.\";\n    }\n    if (el.list) el.list.addEventListener(\"click\", function(e) {\n      const b = e.target && e.target.closest ? e.target.closest(\"[data-ub-pick]\") : null;\n      if (!b || !el.list.contains(b)) return;\n      ctx.act(\"select\", { id: b.getAttribute(\"data-ub-pick\") });\n    });\n    const state2 = { last: null };\n    const ta0 = doc2.querySelector(\"[data-ub-message]\");\n    if (ta0) ta0.addEventListener(\"input\", function() {\n      ta0.dataset.ubTouched = \"1\";\n    });\n    function sync() {\n      const scene = ctx.scene(), units = scene.units;\n      const ests = unitEstimates(units);\n      const E = sceneEstimate(units, ests), u = selected(scene);\n      state2.last = E;\n      if (el.price) el.price.textContent = calculatorMain ? \"\\u2014\" : E.complete === false ? \"Quote\" : money(E.total);\n      if (el.note) el.note.textContent = calculatorMain ? \"Whole sheets, cutting and edging. Review the complete order in the cut-list calculator.\" : \"Cabinet carcasses only, \" + E.priced + \" unit\" + (E.priced === 1 ? \"\" : \"s\") + \", estimated inc VAT.\" + (E.excluded.length ? \" EXCLUDES \" + E.excluded.join(\", \") + \" \\u2014 price to confirm.\" : \"\") + \" Plinth is shown but NOT yet in the price (no plinth cost data yet).\" + (E.complete === false ? \" INCOMPLETE: no board price held for \" + E.incomplete.join(\", \") + \" - quoted.\" : \"\");\n      if (el.label) el.label.textContent = calculatorMain ? \"Cut-list price \\u2014 calculating\\u2026\" : \"Cabinet carcass estimate (\" + units.length + \" unit\" + (units.length === 1 ? \"\" : \"s\") + \")\";\n      const dp = el.doorprice;\n      if (dp) {\n        if (!calculatorMain && E.excluded.length) dp.removeAttribute(\"hidden\");\n        else dp.setAttribute(\"hidden\", \"\");\n      }\n      if (el.excluded) el.excluded.textContent = E.excluded.length ? E.excluded.join(\", \").replace(/^./, function(c) {\n        return c.toUpperCase();\n      }) : \"\\u2014\";\n      const wf = el.wallfit;\n      if (wf) {\n        if (E.walls) wf.removeAttribute(\"hidden\");\n        else wf.setAttribute(\"hidden\", \"\");\n      }\n      if (el.list) {\n        el.list.innerHTML = units.map(function(v, i) {\n          const p = noRate(ests[i]) ? \"quote\" : money(pence(ests[i].inc) / 100);\n          const name2 = displayName(units, v), type = typeName(v);\n          return '<button type=\"button\" class=\"ub-lab__unit' + (v.id === scene.selectedId ? \" is-active\" : \"\") + '\" data-ub-pick=\"' + v.id + '\" aria-label=\"' + name2 + \", \" + type + (calculatorMain ? '\" title=\"' + type : \", carcass estimate \" + p + ' including VAT\" title=\"' + type + \" \\u2014 carcass estimate \" + p + \" inc VAT\") + '\"><span class=\"ub-lab__unitico\">' + miniFor(v) + '</span><span class=\"ub-lab__unitname\"><b>' + name2 + \"</b><em>\" + type + (isCustom(v) ? ' <span class=\"ub-lab__unitcustom\">Custom finish</span>' : \"\") + \"</em></span>\" + (calculatorMain ? \"\" : '<span class=\"ub-lab__unitprice\">' + p + \"</span>\") + \"</button>\";\n        }).join(\"\");\n        const act = el.list.querySelector(\".is-active\"), pan = act && act.closest && act.closest(\".ub-lab__panel\");\n        if (act && pan && pan.scrollHeight > pan.clientHeight + 1 && win2 && win2.getComputedStyle && win2.getComputedStyle(pan).overflowY !== \"visible\") {\n          const r = act.getBoundingClientRect(), pr = pan.getBoundingClientRect();\n          if (r.top < pr.top) pan.scrollTop -= pr.top - r.top + 12;\n          else if (r.bottom > pr.bottom - 90) pan.scrollTop += r.bottom - (pr.bottom - 90) + 12;\n        }\n      }\n      if (el.remove) el.remove.disabled = units.length <= 1;\n      const spec = specText(units, ests, { includePrice: !calculatorMain });\n      if (el.spec) el.spec.textContent = spec;\n      if (el.title) el.title.textContent = \"Your kitchen \\u2014 \" + units.length + \" cabinet\" + (units.length === 1 ? \"\" : \"s\");\n      if (el.material) el.material.textContent = finishLabel(u.finish);\n      if (el.dims) el.dims.textContent = u.family === \"wall\" ? u.w + \"W \" + u.h + \"H \" + u.d + \"D wall cabinet \\u2014 full top and bottom, no legs.\" : u.type === \"corner-l\" ? armA(u) + \" along the first wall, \" + armB(u) + \" along the second, \" + u.d + \" deep, \" + u.h + \"H \\u2014 approx \" + (u.h + LEG_H) + \"H with legs.\" : u.type === \"corner-blind\" ? u.w + \"W \" + u.h + \"H \" + u.d + \"D \\u2014 reachable opening \" + Math.round(blindSplit(u.w, u.h, u.d).openingW) + \" mm, approx \" + (u.h + LEG_H) + \"H with legs.\" : u.w + \"W \" + u.h + \"H \" + u.d + \"D carcass, approx \" + (u.h + LEG_H) + \"H with 150 mm legs.\";\n      if (el.build) el.build.textContent = u.family === \"wall\" ? \"Wall cabinets have a full top and bottom, an adjustable shelf and a 3mm back, and hang on the wall \\u2014 no legs.\" : u.type === \"corner-l\" ? \"The L-shaped corner wraps right around the corner with two doors meeting at 90 degrees, an L-shaped bottom and shelf, and is designed for six legs (not included).\" : u.type === \"corner-blind\" ? \"The blind corner runs past the corner: the section behind the next run is closed by a blanking panel, and the rest opens on a full-height door.\" : u.type === \"base-4drawer\" ? \"The four drawer base has four drawers instead of a door \\u2014 three matching and a deeper one at the bottom \\u2014 with a full bottom and two top rails, designed for adjustable legs (runners and legs not included).\" : \"Base cabinets have an 18mm back, an adjustable shelf and two flat top rails, and are designed to stand on adjustable legs (not included).\";\n      const ta = doc2.querySelector(\"[data-ub-message]\");\n      if (ta) {\n        const cur = ta.value || \"\";\n        let notes = \"\";\n        const i = cur.indexOf(NOTE_MARK);\n        if (i >= 0) notes = cur.slice(i + NOTE_MARK.length);\n        else if (cur.trim() !== \"\") notes = cur;\n        const qf = calcQuoteFrontsText(units), qp = calcQuotePanelsText(units);\n        const qw = calcQuoteWorktopsText(units);\n        const qa = applianceText(units);\n        const qs = (function() {\n          try {\n            const sc = ctx.scene();\n            return splashText(units, sc.kitchen, sc.room);\n          } catch {\n            return \"\";\n          }\n        })();\n        const gq = golaSpecText(units, scene.kitchen);\n        const dq = calcDrawerBoxSpecText(units);\n        ta.value = \"Please quote for the following kitchen units:\\n\\n\" + spec + (qf ? \"\\n\\n\" + qf : \"\") + (qp ? \"\\n\\n\" + qp : \"\") + (qw ? \"\\n\\n\" + qw : \"\") + (qa ? \"\\n\\n\" + qa : \"\") + (qs ? \"\\n\\n\" + qs : \"\") + (gq ? \"\\n\\n\" + gq : \"\") + (dq ? \"\\n\\n\" + dq : \"\") + (calculatorMain ? \"\\n\\nThe cut-list calculator provides the order price for boards, cutting and edging.\" : \"\\n\\nCabinet carcass estimate (all \" + E.priced + \" unit\" + (E.priced === 1 ? \"\" : \"s\") + \"): \" + money(E.total) + \" inc VAT, \" + money(E.totalEx) + \" ex VAT. Indicative, not a quotation.\") + (E.notes && E.notes.length ? \"\\nPLEASE NOTE: \" + E.notes.join(\" \") : \"\") + (E.excluded.length ? \"\\nNOT INCLUDED, still to be priced: \" + E.excluded.join(\", \") + \".\" : \"\") + NOTE_MARK + notes;\n      }\n      [\n        [\"units\", units.length],\n        [\"estimate\", calculatorMain ? \"\" : money(E.total) + \" inc VAT (\" + money(E.totalEx) + \" ex VAT) \\u2014 \" + E.priced + \" cabinet carcass\" + (E.priced === 1 ? \"\" : \"es\") + (E.excluded.length ? \"; excludes \" + E.excluded.join(\", \") : \"\") + (E.notes && E.notes.length ? \" \\u2014 PLEASE NOTE: \" + E.notes.join(\" \") : \"\")],\n        [\"plan\", planData(units)]\n      ].forEach(function(kv) {\n        const h = doc2.querySelector('[data-ub-hidden=\"' + kv[0] + '\"]');\n        if (h) h.value = kv[1];\n      });\n      if (ctx.onPriced) ctx.onPriced(E);\n    }\n    return { sync, estimate: () => state2.last };\n  }\n\n  // v2/src/ui/account.js\n  var SESSION_KEY = \"ub-cabinet-lab:session\";\n  var PROJECT_KEY2 = \"ub-cabinet-lab:project\";\n  var ACCOUNT_DEFAULTS = Object.freeze({\n    api: \"https://chat.uniboards.co.uk/api/shop-account\",\n    autosaveMs: 5e3,\n    /* a guest's plan goes to the server too (the Quoter sees it before any order); false - only signed-in accounts */\n    guestServer: true,\n    retryMs: 3e4,\n    projectsUrl: \"/pages/my-projects\",\n    timeoutMs: 15e3,\n    /* the shop's customer accounts (card 1792316430371): \"classic\" - /account/login?checkout_url= (live today);\n       \"new\" - Shopify's new customer accounts: /customer_authentication/login?return_to=<relative path> (shopify.dev, Online\n       Store themes, login). Either way the server knows the shopper only from the theme's signed identity (data-ub-customer-*,\n       HMAC with the shop's private key, checked by /session) - never from an email or id the page sends. */\n    accounts: \"classic\"\n  });\n  var INTENT_KEY = \"ub-cabinet-lab:signin-intent\";\n  var INTENT_MAX_MS = 24 * 3600 * 1e3;\n  function readCustomer(root) {\n    const g2 = (k) => root && root.getAttribute && root.getAttribute(\"data-ub-customer-\" + k) || \"\";\n    const c = { id: g2(\"id\"), email: g2(\"email\"), ts: g2(\"ts\"), sig: g2(\"sig\") };\n    return c.id && c.email && c.ts && /^[a-f0-9]{64}$/i.test(c.sig) ? c : null;\n  }\n  function planOf(scene, uid) {\n    return {\n      v: 1,\n      uid,\n      units: scene.units,\n      room: scene.room || null,\n      kitchen: scene.kitchen || null,\n      activeRun: scene.activeRun || \"main\",\n      selectedId: scene.selectedId || null,\n      n: scene.units.length,\n      when: (/* @__PURE__ */ new Date()).toLocaleString(\"en-GB\", { hour12: false })\n    };\n  }\n  function shopAccountSettings(root) {\n    const v = root && root.getAttribute ? String(root.getAttribute(\"data-ub-guest-server\") || \"\").trim().toLowerCase() : \"\";\n    return v === \"off\" ? { guestServer: false } : {};\n  }\n  function createAccount(ctx, over) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win;\n    const cfg = Object.assign({}, ACCOUNT_DEFAULTS, shopAccountSettings(root), over || {});\n    const R4 = ctx.recovery || null;\n    const st = {\n      session: null,\n      email: \"\",\n      timer: null,\n      retry: null,\n      saving: false,\n      again: false,\n      savedAt: null,\n      error: \"\",\n      note: \"\",\n      el: null,\n      hydrated: false,\n      inflight: null\n    };\n    const serverOn = () => !!st.session || cfg.guestServer !== false;\n    const probeRun = () => {\n      try {\n        return !!(win2.navigator && win2.navigator.webdriver === true);\n      } catch {\n        return false;\n      }\n    };\n    const partsNow = () => {\n      try {\n        const p = ctx.planParts ? ctx.planParts() : null;\n        return Array.isArray(p) ? p.slice(0, 1200) : void 0;\n      } catch {\n        return void 0;\n      }\n    };\n    const ls = () => {\n      try {\n        return win2.localStorage || null;\n      } catch {\n        return null;\n      }\n    };\n    const getJ = (k) => {\n      try {\n        return JSON.parse(ls() && ls().getItem(k) || \"null\");\n      } catch {\n        return null;\n      }\n    };\n    const setJ = (k, v) => {\n      try {\n        if (ls()) ls().setItem(k, JSON.stringify(v));\n      } catch {\n      }\n    };\n    const planToken = () => {\n      const v = getJ(PROJECT_KEY2);\n      return v && typeof v.token === \"string\" ? v.token : null;\n    };\n    const TOKEN = /^[a-f0-9]{16,96}$/i;\n    function post(path2, body) {\n      if (!win2.fetch) return Promise.reject(new Error(\"no fetch\"));\n      let ctl = null, tm = null;\n      try {\n        ctl = typeof win2.AbortController === \"function\" ? new win2.AbortController() : null;\n      } catch {\n        ctl = null;\n      }\n      if (ctl) tm = win2.setTimeout(() => {\n        try {\n          ctl.abort();\n        } catch {\n        }\n      }, cfg.timeoutMs);\n      return Promise.resolve(win2.fetch(cfg.api + path2, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(body),\n        credentials: \"omit\",\n        signal: ctl ? ctl.signal : void 0\n      })).then((r) => r.json().then((j) => ({ status: r.status, ok: !!r.ok, json: j }), () => ({ status: r.status, ok: false, json: null }))).finally(() => {\n        if (tm) win2.clearTimeout(tm);\n      });\n    }\n    const customer = readCustomer(root);\n    const newAccounts = cfg.accounts === \"new\";\n    const backPath = () => win2.location && win2.location.pathname + win2.location.search || \"/\";\n    const loginUrl = () => newAccounts ? \"/customer_authentication/login?return_to=\" + encodeURIComponent(backPath()) : \"/account/login?checkout_url=\" + encodeURIComponent(backPath());\n    const offline = () => {\n      try {\n        return !!(win2.navigator && win2.navigator.onLine === false);\n      } catch {\n        return false;\n      }\n    };\n    const intentNow = () => {\n      const v = getJ(INTENT_KEY);\n      return v && v.v === 1 && typeof v.planId === \"string\" ? v : null;\n    };\n    const dropIntent = () => {\n      try {\n        if (ls()) ls().removeItem(INTENT_KEY);\n      } catch {\n      }\n    };\n    function local() {\n      if (!R4) return { kept: false, failed: false, synced: !!st.savedAt, others: 0 };\n      const s = R4.state();\n      const cur = s.planId ? R4.current() : null;\n      return {\n        kept: !!cur,\n        failed: !!s.failed || !s.storage,\n        synced: !!(cur && cur.projectToken && (cur.syncedRevision || 0) >= (cur.localRevision || 0)),\n        token: cur && cur.projectToken || null,\n        others: R4.others().length\n      };\n    }\n    function paint() {\n      if (!st.el) return;\n      const el = st.el;\n      const L = local();\n      el.textContent = \"\";\n      const line = doc2.createElement(\"span\");\n      line.setAttribute(\"data-ub-account-state\", L.failed ? \"not-kept\" : st.error ? \"error\" : st.saving ? \"saving\" : st.session && L.synced ? \"account\" : st.session && newAccounts && offline() ? \"offline\" : L.kept ? \"browser\" : \"none\");\n      let text = \"\";\n      if (L.failed) text = \"This browser is not keeping your plan. \";\n      else if (L.kept && !(st.session && L.synced)) text = \"Saved in this browser. \";\n      if (st.session && L.failed && !L.synced) {\n        text += st.error ? st.error + \" \" : \"\";\n      } else if (st.session) {\n        text += st.error ? st.error + \" \" : st.saving ? \"Saving to your account\\u2026 \" : L.synced ? \"Saved to your account. \" : newAccounts && offline() ? \"Offline - it goes to your account when you are back online. \" : newAccounts ? \"Not yet saved to your account. \" : \"Your plans are saved to your account. \";\n      } else {\n        text += st.error ? st.error + \" \" : newAccounts ? \"Sign in to save to your account. \" : \"Sign in to keep this plan on any device. \";\n      }\n      if (st.note) text += st.note + \" \";\n      line.textContent = text;\n      el.appendChild(line);\n      const link = doc2.createElement(\"a\");\n      if (st.session) {\n        link.setAttribute(\"href\", cfg.projectsUrl);\n        link.textContent = \"My projects\";\n      } else {\n        link.setAttribute(\"href\", loginUrl());\n        link.textContent = \"Sign in\";\n        if (newAccounts && link.addEventListener) link.addEventListener(\"click\", (e) => {\n          const r = prepareSignIn();\n          if (!r.ok && r.why !== \"empty\") {\n            if (e && e.preventDefault) e.preventDefault();\n            st.note = r.message;\n            paint();\n          }\n        });\n      }\n      el.appendChild(link);\n      if (L.failed) {\n        const dl = doc2.createElement(\"a\");\n        dl.setAttribute(\"href\", \"#\");\n        dl.setAttribute(\"data-ub-account-download\", \"\");\n        dl.textContent = \" Download a copy\";\n        if (dl.addEventListener) dl.addEventListener(\"click\", (e) => {\n          if (e && e.preventDefault) e.preventDefault();\n          download();\n        });\n        el.appendChild(dl);\n      }\n      if (L.others) {\n        const o = doc2.createElement(\"a\");\n        o.setAttribute(\"href\", \"#\");\n        o.setAttribute(\"data-ub-account-other\", \"\");\n        o.textContent = \" Your previous plan\";\n        if (o.addEventListener) o.addEventListener(\"click\", (e) => {\n          if (e && e.preventDefault) e.preventDefault();\n          const prev = R4.others()[0];\n          if (prev && ctx.act) ctx.act(\"plan.switch\", { id: prev.id });\n          paint();\n        });\n        el.appendChild(o);\n      }\n    }\n    function download() {\n      try {\n        const plan = R4 ? R4.planNow() : planOf(ctx.scene(), UID);\n        const blob = new win2.Blob([JSON.stringify(plan)], { type: \"application/json\" });\n        const a = doc2.createElement(\"a\");\n        a.setAttribute(\"href\", win2.URL.createObjectURL(blob));\n        a.setAttribute(\"download\", \"cabinet-lab-plan.json\");\n        if (a.click) a.click();\n      } catch {\n        if (ctx.cue) ctx.cue(\"The plan could not be downloaded from this browser.\");\n      }\n    }\n    function prepareSignIn() {\n      const no = (why, message) => ({ ok: false, why, message, url: loginUrl() });\n      if (!R4) return no(\"storage\", \"This browser cannot keep your plan while you sign in - download a project file first.\");\n      let ck = null;\n      try {\n        ck = R4.checkpoint(\"signin\");\n      } catch {\n        ck = null;\n      }\n      const s = R4.state();\n      const cur = s.planId ? R4.current() : null;\n      if (!cur) {\n        if (s.failed || !s.storage) return no(\"storage\", \"This browser is not keeping your plan - download a project file before you sign in, or it is lost.\");\n        return { ok: false, why: \"empty\", message: \"There is nothing to save yet - add a cabinet first.\", url: loginUrl() };\n      }\n      if (s.failed || !s.storage || ck && ck.ok === false && ck.why !== \"hold\" && ck.why !== \"gesture\")\n        return no(\"storage\", \"This browser could not keep your latest changes - download a project file before you sign in, or they are lost.\");\n      let stored = null;\n      try {\n        stored = JSON.parse(ls().getItem(RECOVERY_KEY + \":\" + cur.planId) || \"null\");\n      } catch {\n        stored = null;\n      }\n      if (!stored || !stored.plan || R4.keyOf(stored.plan) !== R4.keyOf(cur.plan))\n        return no(\"storage\", \"This browser could not keep your latest changes - download a project file before you sign in, or they are lost.\");\n      const intent = { v: 1, planId: cur.planId, planKey: cur.planKey || null, rev: cur.localRevision || 0, at: Date.now(), path: backPath() };\n      try {\n        ls().setItem(INTENT_KEY, JSON.stringify(intent));\n      } catch {\n        return no(\"storage\", \"This browser has no room to keep your plan while you sign in - download a project file first.\");\n      }\n      const back = intentNow();\n      if (!back || back.planId !== intent.planId || back.at !== intent.at) return no(\"storage\", \"This browser could not keep your plan while you sign in - download a project file first.\");\n      return { ok: true, url: loginUrl(), planId: cur.planId };\n    }\n    function mount() {\n      const head = root.querySelector && root.querySelector(\".ub-lab__panelhead\");\n      if (!head) return;\n      const el = doc2.createElement(\"p\");\n      el.className = \"ub-lab__account\";\n      el.setAttribute(\"data-ub-account\", \"\");\n      el.setAttribute(\"aria-live\", \"polite\");\n      head.appendChild(el);\n      st.el = el;\n      paint();\n      if (root.addEventListener) root.addEventListener(\"click\", (e) => {\n        const t = e && e.target;\n        if (t && t.closest && t.closest(\"[data-ub-newplan],[data-ub-reset]\") && win2 && win2.setTimeout) win2.setTimeout(paint, 0);\n      });\n    }\n    function signIn() {\n      if (!customer) return Promise.resolve(false);\n      const saved = getJ(SESSION_KEY);\n      if (saved && saved.session && saved.email === customer.email.toLowerCase() && saved.exp > Date.now()) {\n        st.session = saved.session;\n        st.email = saved.email;\n        paint();\n        return Promise.resolve(true);\n      }\n      const tokens = [];\n      const addT = (t) => {\n        if (typeof t === \"string\" && TOKEN.test(t) && tokens.indexOf(t) < 0 && tokens.length < 50) tokens.push(t);\n      };\n      addT(planToken());\n      try {\n        if (R4) {\n          const c = R4.current();\n          if (c) addT(c.projectToken);\n          R4.others().forEach((o) => addT(o && o.token));\n        }\n      } catch {\n      }\n      return post(\"/session\", { customer, tokens }).then((r) => {\n        if (!r.ok || !r.json || !r.json.session) return false;\n        st.session = r.json.session;\n        st.email = r.json.user.email;\n        setJ(SESSION_KEY, {\n          session: st.session,\n          email: st.email,\n          exp: Date.now() + Math.min(30, r.json.expires_in_days || 30) * 864e5\n        });\n        paint();\n        return true;\n      }, () => false);\n    }\n    function signedOut() {\n      st.session = null;\n      setJ(SESSION_KEY, null);\n      st.error = \"You are signed out \\u2014 sign in again to save this plan to your account. It is kept in this browser.\";\n    }\n    const timers = () => typeof win2.setTimeout === \"function\" && typeof win2.clearTimeout === \"function\";\n    function retryLater() {\n      if (!timers()) return;\n      if (st.retry) win2.clearTimeout(st.retry);\n      st.retry = win2.setTimeout(() => {\n        st.retry = null;\n        save();\n      }, cfg.retryMs);\n    }\n    function save() {\n      if (!serverOn() || !st.hydrated) return Promise.resolve(null);\n      if (!R4) return st.session ? saveWithoutCopy() : Promise.resolve(null);\n      if (st.saving) {\n        st.again = true;\n        return Promise.resolve(null);\n      }\n      try {\n        R4.checkpoint(\"account\");\n      } catch {\n      }\n      const cur = R4.current();\n      if (!cur || cur.projectToken && (cur.syncedRevision || 0) >= (cur.localRevision || 0)) {\n        paint();\n        return Promise.resolve(null);\n      }\n      if (!cur.projectToken && !(cur.plan && Array.isArray(cur.plan.units) && cur.plan.units.length)) {\n        paint();\n        return Promise.resolve(null);\n      }\n      let locks = null;\n      try {\n        locks = win2.navigator && win2.navigator.locks && typeof win2.navigator.locks.request === \"function\" ? win2.navigator.locks : null;\n      } catch {\n        locks = null;\n      }\n      if (!cur.projectToken && locks) {\n        st.saving = true;\n        paint();\n        const outer = Promise.resolve(locks.request(\"ub-cabinet-lab:first-save:\" + cur.planId, () => {\n          st.saving = false;\n          const a = R4.adoptStored ? R4.adoptStored(cur.planId) : null;\n          const now = R4.current() || cur;\n          if (a && a.adopted && (now.syncedRevision || 0) >= (now.localRevision || 0)) {\n            paint();\n            return null;\n          }\n          return send(now);\n        })).catch(() => {\n          st.saving = false;\n          st.inflight = null;\n          paint();\n          retryLater();\n          return null;\n        });\n        st.inflight = outer;\n        return outer;\n      }\n      return send(cur);\n    }\n    function send(cur) {\n      const planId = cur.planId, rev = cur.localRevision;\n      const guest = !st.session;\n      st.saving = true;\n      st.error = \"\";\n      paint();\n      const body = {\n        token: cur.projectToken || null,\n        base_revision: cur.acknowledgedServerRevision == null ? null : cur.acknowledgedServerRevision,\n        name: kitchenName(cur.plan),\n        plan: cur.plan\n      };\n      if (cur.planKey) body.client_plan_id = cur.planKey;\n      if (!guest) body.session = st.session;\n      const parts = partsNow();\n      if (parts) body.parts = parts;\n      if (probeRun()) body.probe = true;\n      const p = post(\"/plan/save\", body).then((r) => {\n        st.saving = false;\n        st.inflight = null;\n        if (r.ok && r.json && r.json.token) {\n          if (!guest && r.json.signed_in === false) signedOut();\n          else {\n            R4.acknowledge(planId, rev, typeof r.json.revision === \"number\" ? r.json.revision : null, r.json.token);\n            st.savedAt = r.json.saved_at || (/* @__PURE__ */ new Date()).toISOString();\n            try {\n              settleIntent();\n            } catch {\n            }\n            if (st.forking === planId) {\n              st.forking = null;\n              st.note = guest ? \"Both versions are kept.\" : \"Both versions are kept in My projects.\";\n            }\n          }\n        } else if (r.status === 401 && !guest) signedOut();\n        else if (r.status === 409) {\n          R4.detach(planId);\n          st.forking = planId;\n          st.note = guest ? \"This plan was also changed in another tab \\u2014 both versions are kept.\" : \"This plan was also changed on another device or tab \\u2014 your version is kept in this browser; the other is in your account.\";\n          st.again = true;\n        } else {\n          if (!guest) st.error = \"Not saved to your account just now \\u2014 it is kept in this browser and will be sent again.\";\n          retryLater();\n        }\n        paint();\n        if (st.again || R4.state().planId === planId && R4.state().rev > rev) {\n          st.again = false;\n          schedule();\n        }\n        return r.json;\n      }, () => {\n        st.saving = false;\n        st.inflight = null;\n        if (!guest) st.error = \"Not saved to your account just now \\u2014 it is kept in this browser and will be sent again.\";\n        paint();\n        retryLater();\n        return null;\n      });\n      st.inflight = p;\n      return p;\n    }\n    function flush(ms) {\n      if (!serverOn() || !R4) return Promise.resolve(planToken());\n      if (st.timer && timers()) {\n        win2.clearTimeout(st.timer);\n        st.timer = null;\n      }\n      const token = () => {\n        const c = R4.current();\n        return c && c.projectToken || planToken();\n      };\n      const pending = () => {\n        const c = R4.current();\n        return !!(c && (!c.projectToken || (c.syncedRevision || 0) < (c.localRevision || 0)));\n      };\n      const work = (st.inflight || Promise.resolve(null)).then(() => st.hydrated ? save() : (ready || Promise.resolve()).then(() => save())).then(() => pending() && st.inflight ? st.inflight : null).then(token, token);\n      if (!(ms > 0) || !timers()) return work;\n      return Promise.race([work, new Promise((res) => win2.setTimeout(() => res(token()), ms))]);\n    }\n    function saveWithoutCopy() {\n      if (st.saving) {\n        st.again = true;\n        return Promise.resolve(null);\n      }\n      st.saving = true;\n      st.error = \"\";\n      paint();\n      const body = { session: st.session, token: planToken(), name: kitchenName(), plan: planOf(ctx.scene(), UID) };\n      return post(\"/plan/save\", body).then((r) => {\n        st.saving = false;\n        if (r.ok && r.json && r.json.token) {\n          setJ(PROJECT_KEY2, { token: r.json.token });\n          if (r.json.signed_in === false) signedOut();\n          else st.savedAt = r.json.saved_at || (/* @__PURE__ */ new Date()).toISOString();\n        } else if (r.status === 401) signedOut();\n        else st.error = \"Not saved to your account just now \\u2014 it is still in this browser.\";\n        paint();\n        if (st.again) {\n          st.again = false;\n          schedule();\n        }\n        return r.json;\n      }, () => {\n        st.saving = false;\n        st.error = \"Not saved to your account just now \\u2014 it is still in this browser.\";\n        paint();\n        return null;\n      });\n    }\n    function kitchenName(plan) {\n      const n = plan && plan.units ? plan.units.length : ctx.scene().units.length;\n      return \"Cabinet Lab kitchen \\u2014 \" + n + \" unit\" + (n === 1 ? \"\" : \"s\");\n    }\n    function schedule() {\n      if (!serverOn() || !timers()) return;\n      if (st.timer) win2.clearTimeout(st.timer);\n      st.timer = win2.setTimeout(() => {\n        st.timer = null;\n        save();\n      }, cfg.autosaveMs);\n    }\n    function openSaved(token, why, untouchedOnly) {\n      return post(\"/plan/load\", { token }).then((r) => {\n        if (!r.ok || !r.json || !r.json.plan) return { ok: false, status: r.status };\n        if (untouchedOnly && R4 && R4.state().planId) return { ok: false, why: \"edited meanwhile\" };\n        if (!R4) {\n          const s = ls();\n          if (!s) return { ok: false };\n          let mine = null, done2 = false;\n          try {\n            mine = s.getItem(LS_KEY);\n            s.setItem(LS_KEY, JSON.stringify(r.json.plan));\n          } catch {\n            return { ok: false };\n          }\n          try {\n            const out2 = ctx.act ? ctx.act(\"plan.restore\", {}) : null;\n            done2 = !!(out2 && out2.ok);\n          } finally {\n            try {\n              if (mine == null) s.removeItem(LS_KEY);\n              else s.setItem(LS_KEY, mine);\n            } catch {\n            }\n          }\n          if (done2) setJ(PROJECT_KEY2, { token });\n          return { ok: done2 };\n        }\n        const out = ctx.act ? ctx.act(\"plan.open\", {\n          plan: r.json.plan,\n          meta: { token, serverRev: typeof r.json.revision === \"number\" ? r.json.revision : 0, reason: why },\n          cue: why === \"link\" ? \"Your saved plan is open: \" + (r.json.name || \"kitchen\") + \".\" : \"Your saved plan is open.\"\n        }) : null;\n        return { ok: !!(out && out.ok), json: r.json };\n      }, () => ({ ok: false }));\n    }\n    function linkToken() {\n      let token = \"\";\n      try {\n        token = new win2.URLSearchParams(win2.location.search).get(\"plan\") || \"\";\n      } catch {\n        token = \"\";\n      }\n      return TOKEN.test(token) ? token : null;\n    }\n    function hydrate() {\n      const link = linkToken();\n      if (link) {\n        return openSaved(link, \"link\", false).then((o) => {\n          if (!o.ok && ctx.cue) ctx.cue(\"That saved plan could not be opened \\u2014 this is the plan from this browser.\");\n          return o.ok;\n        });\n      }\n      if (!R4) return Promise.resolve(false);\n      const s = R4.state();\n      const cur = s.planId ? R4.current() : null;\n      if (cur && cur.unconfirmedToken) {\n        return post(\"/plan/load\", { token: cur.unconfirmedToken }).then((r) => {\n          if (r.ok && r.json && r.json.plan && R4.keyOf(r.json.plan) === R4.keyOf(cur.plan))\n            R4.confirmToken(cur.planId, cur.unconfirmedToken, typeof r.json.revision === \"number\" ? r.json.revision : 0);\n          return false;\n        }, () => false);\n      }\n      if (!s.planId && planToken()) return openSaved(planToken(), \"project\", true).then((o) => o.ok);\n      return Promise.resolve(false);\n    }\n    function latestFromAccount() {\n      if (!R4 || R4.state().planId || !st.session) return Promise.resolve(false);\n      return post(\"/projects\", { session: st.session }).then((r) => {\n        const items = r.ok && r.json && r.json.items || [];\n        const it = items.find((i) => i && i.kind === \"plan\" && i.open_3d);\n        const m = it ? /[?&]plan=([a-f0-9]{16,96})/i.exec(it.open_3d) : null;\n        if (!m) return false;\n        return openSaved(m[1], \"account\", true).then((o) => o.ok);\n      }, () => false);\n    }\n    try {\n      mount();\n    } catch {\n    }\n    if (R4) R4.onStatus(() => {\n      try {\n        paint();\n        if (st.hydrated) schedule();\n      } catch {\n      }\n    });\n    if (win2.addEventListener) win2.addEventListener(\"online\", () => {\n      if (serverOn() && st.hydrated) save();\n    });\n    function settleIntent() {\n      const it = intentNow();\n      if (!it) return;\n      if (!(it.at > 0) || Date.now() - it.at > INTENT_MAX_MS) {\n        dropIntent();\n        return;\n      }\n      if (!st.session || !R4) return;\n      const cur = R4.state().planId ? R4.current() : null;\n      if (cur && cur.planId === it.planId) {\n        if (cur.projectToken && (cur.syncedRevision || 0) >= (cur.localRevision || 0)) {\n          dropIntent();\n          paint();\n        }\n      } else {\n        st.note = \"The plan you were saving before you signed in is kept in this browser - File > Open project opens it.\";\n        paint();\n      }\n    }\n    if (R4) R4.onStatus(() => {\n      try {\n        settleIntent();\n      } catch {\n      }\n    });\n    const ready = hydrate().catch(() => false).then(() => signIn()).then((ok2) => ok2 ? latestFromAccount().catch(() => false).then(() => ok2) : ok2).then((ok2) => {\n      st.hydrated = true;\n      paint();\n      return ok2 || serverOn() ? save() : null;\n    }).then((r) => {\n      try {\n        settleIntent();\n      } catch {\n      }\n      return r;\n    });\n    return {\n      onChange: function() {\n        try {\n          if (!R4) schedule();\n        } catch {\n        }\n      },\n      saveNow: save,\n      flush,\n      ready,\n      state: function() {\n        const L = local();\n        return {\n          signedIn: !!st.session,\n          email: st.email,\n          saving: st.saving,\n          savedAt: st.savedAt,\n          error: st.error,\n          note: st.note,\n          hydrated: st.hydrated,\n          keptInBrowser: L.kept,\n          notKept: L.failed,\n          syncedToAccount: L.synced\n        };\n      },\n      customer: function() {\n        return customer;\n      },\n      /* FILE MENU (card 1792316430371): the same /projects list and /plan/load open this module already uses, nothing new on\n         the server. Only the account's 3D plans (kind \"plan\" with a ?plan= link); the token is the link's own. */\n      listProjects: function() {\n        if (!st.session) return Promise.resolve({ ok: false, why: \"signed out\" });\n        return post(\"/projects\", { session: st.session }).then((r) => {\n          if (r.status === 401) {\n            signedOut();\n            paint();\n            return { ok: false, why: \"signed out\" };\n          }\n          if (!r.ok || !r.json) return { ok: false, why: \"unavailable\", status: r.status };\n          const mine = (() => {\n            try {\n              const c = R4 && R4.current();\n              return c && c.projectToken || planToken() || null;\n            } catch {\n              return null;\n            }\n          })();\n          const items = [];\n          for (const i of r.json.items || []) {\n            const m = i && i.kind === \"plan\" && i.open_3d ? /[?&]plan=([a-f0-9]{16,96})/i.exec(i.open_3d) : null;\n            if (m) items.push({ token: m[1], name: i.name || \"Kitchen\", updatedAt: i.updated_at || null, current: m[1] === mine });\n          }\n          return { ok: true, items };\n        }, () => ({ ok: false, why: \"unavailable\" }));\n      },\n      openProject: function(token) {\n        if (!TOKEN.test(String(token || \"\"))) return Promise.resolve({ ok: false, why: \"bad token\" });\n        return openSaved(token, \"account\", false);\n      },\n      /* the shop's sign-in, coming back to this very page (the plan on screen is kept in this browser meanwhile) */\n      signInUrl: function() {\n        return loginUrl();\n      },\n      /* Save while signed out (card 1792316430371): keep the plan + intent durably, THEN the caller may navigate to r.url */\n      prepareSignIn: function() {\n        return prepareSignIn();\n      },\n      intent: function() {\n        return intentNow();\n      },\n      newAccounts,\n      offline: function() {\n        return offline();\n      },\n      projectsUrl: function() {\n        return cfg.projectsUrl;\n      },\n      serverOn: function() {\n        return serverOn();\n      }\n    };\n  }\n\n  // v2/src/ui/drill-summary.js\n  function joinList(xs) {\n    if (xs.length <= 1) return xs.join(\"\");\n    return xs.slice(0, -1).join(\", \") + \" and \" + xs[xs.length - 1];\n  }\n  function constructionFrom(warnings) {\n    const w = (Array.isArray(warnings) ? warnings : []).map(String).join(\" \");\n    const baseCabineo = /Base units:[^.]*?(set in|service void)[^.]*?Cabineo/i.test(w) || /Base units:[^.]*Cabineo/i.test(w);\n    const othersGroove = /Other units[^.]*back in a groove/i.test(w);\n    const othersConfirmat = /Other units[^.]*confirmat/i.test(w);\n    const known = baseCabineo || othersGroove || othersConfirmat;\n    return { known, baseCabineo, othersGroove, othersConfirmat };\n  }\n  function planHas(units) {\n    const has = { shelves: false, doors: false, drawers: false, base: 0, other: 0 };\n    for (const u of units || []) {\n      if (!u) continue;\n      if (u.family ? u.family === \"base\" : /^base/.test(String(u.type || \"\"))) has.base++;\n      else has.other++;\n      for (const p of cabinetParts(u)) {\n        if (p.kind === \"shelf\" && p.corner) has.cornerShelves = true;\n        else if (p.kind === \"shelf\") has.shelves = true;\n        else if (p.kind === \"door\") has.doors = true;\n        else if (p.kind === \"drawer-box\" || p.kind === \"drawer-front\") has.drawers = true;\n      }\n      if (u.door) has.doors = true;\n    }\n    return has;\n  }\n  function drillSummary(units, st) {\n    const cnc = st && st.cnc;\n    if (!cnc || cnc.built !== true) return \" CNC hole positions are not set yet; request a drilling quote before ordering.\";\n    const has = planHas(units), how = constructionFrom(st.warnings);\n    const holes = [];\n    if (has.shelves) holes.push(\"shelf-pin holes\");\n    if (how.known) {\n      const j = [];\n      if (has.base && how.baseCabineo) j.push(\"Cabineo connector seats\" + (has.other ? \" on the base units\" : \"\"));\n      if (has.other && how.othersConfirmat) j.push(\"confirmat holes\" + (has.base ? \" on the other units\" : \"\"));\n      if (!j.length && (has.base || has.other)) j.push(\"carcass connector holes\");\n      holes.push.apply(holes, j);\n    } else if (has.base || has.other) holes.push(\"carcass connector holes\");\n    if (has.doors) holes.push(\"hinge holes\");\n    if (has.drawers) holes.push(\"drawer runner holes\");\n    const grooves = [];\n    if (has.other && how.othersGroove) grooves.push(\"back grooves\" + (has.base ? \" on the non-base units\" : \"\"));\n    if (has.drawers) grooves.push(\"drawer-bottom grooves\");\n    let t = \" With CNC drilling: \" + joinList(holes) + (grooves.length ? \"; \" + joinList(grooves) : \"\") + \".\";\n    if (cnc.ok !== true) {\n      const why = [].concat(Array.isArray(cnc.toolFaults) ? cnc.toolFaults : [], Array.isArray(cnc.missing) ? cnc.missing.map(function(m) {\n        return typeof m === \"string\" ? m : m && (m.label || m.what) || \"\";\n      }) : []).map(String).filter(Boolean);\n      let s = \" Not ready for the machine yet\" + (why.length ? \": \" + why.join(\" \") : \"\");\n      if (!/[.!?]$/.test(s)) s += \".\";\n      t += s + \" The drilling is confirmed by the workshop - request a drilling quote before ordering.\";\n    }\n    return t;\n  }\n\n  // v2/src/ui/buy-dialog.js\n  function createBuyDialog(doc2) {\n    let el = null, box3 = null, titleEl = null, textEl = null, slot = null, acts = null, busy = false, lastFocus = null;\n    function mk(tag, cls, text) {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      if (text != null) e.textContent = text;\n      return e;\n    }\n    function build3() {\n      if (el) return;\n      el = mk(\"div\", \"ub-buydlg\");\n      el.setAttribute(\"data-ub-buydlg\", \"\");\n      el.setAttribute(\"role\", \"dialog\");\n      el.setAttribute(\"aria-modal\", \"true\");\n      el.setAttribute(\"hidden\", \"\");\n      box3 = mk(\"div\", \"ub-buydlg__box\");\n      const x = mk(\"button\", \"ub-buydlg__x\", \"\\xD7\");\n      x.setAttribute(\"type\", \"button\");\n      x.setAttribute(\"aria-label\", \"Close\");\n      x.setAttribute(\"data-ub-buydlg-close\", \"\");\n      x.addEventListener(\"click\", function() {\n        if (!busy) close();\n      });\n      titleEl = mk(\"h3\", \"ub-buydlg__title\");\n      titleEl.id = \"ub-buydlg-title\";\n      el.setAttribute(\"aria-labelledby\", titleEl.id);\n      textEl = mk(\"p\", \"ub-buydlg__text\");\n      textEl.setAttribute(\"data-ub-buydlg-text\", \"\");\n      textEl.setAttribute(\"aria-live\", \"polite\");\n      slot = mk(\"div\", \"ub-buydlg__slot\");\n      acts = mk(\"div\", \"ub-buydlg__acts\");\n      box3.appendChild(x);\n      box3.appendChild(titleEl);\n      box3.appendChild(textEl);\n      box3.appendChild(slot);\n      box3.appendChild(acts);\n      el.appendChild(box3);\n      el.addEventListener(\"click\", function(e) {\n        if (e.target === el && !busy) close();\n      });\n      el.addEventListener(\"keydown\", function(e) {\n        if (e.key === \"Escape\" && !busy) {\n          e.stopPropagation();\n          close();\n        }\n      });\n      (doc2.body || doc2.documentElement).appendChild(el);\n    }\n    function show2(o) {\n      build3();\n      o = o || {};\n      if (el.hasAttribute(\"hidden\")) lastFocus = doc2.activeElement;\n      busy = o.tone === \"busy\";\n      el.setAttribute(\"data-tone\", o.tone || \"info\");\n      titleEl.textContent = o.title || \"\";\n      textEl.textContent = o.text || \"\";\n      slot.textContent = \"\";\n      if (o.field) slot.appendChild(o.field);\n      acts.textContent = \"\";\n      (o.actions || []).forEach(function(a) {\n        const b = mk(a.href ? \"a\" : \"button\", \"ub-buydlg__btn\" + (a.primary ? \" ub-buydlg__btn--go\" : \"\"), a.label);\n        if (a.href) b.setAttribute(\"href\", a.href);\n        else b.setAttribute(\"type\", \"button\");\n        if (a.id) b.setAttribute(\"data-ub-buydlg-act\", a.id);\n        b.addEventListener(\"click\", function(e) {\n          if (!a.href && e && e.preventDefault) e.preventDefault();\n          if (!a.keep && !a.href) close();\n          if (a.onClick) a.onClick(e);\n        });\n        acts.appendChild(b);\n      });\n      el.removeAttribute(\"hidden\");\n      try {\n        doc2.documentElement.classList.add(\"ub-buydlg-open\");\n      } catch {\n      }\n      const first = o.field && o.field.querySelector && o.field.querySelector(\"input\") || acts.querySelector(\".ub-buydlg__btn--go\") || acts.firstChild;\n      try {\n        if (first && first.focus) first.focus({ preventScroll: true });\n      } catch {\n      }\n      return el;\n    }\n    function close() {\n      if (!el || el.hasAttribute(\"hidden\")) return;\n      el.setAttribute(\"hidden\", \"\");\n      busy = false;\n      try {\n        doc2.documentElement.classList.remove(\"ub-buydlg-open\");\n      } catch {\n      }\n      try {\n        if (lastFocus && lastFocus.focus) lastFocus.focus({ preventScroll: true });\n      } catch {\n      }\n    }\n    function isOpen() {\n      return !!el && !el.hasAttribute(\"hidden\");\n    }\n    return { show: show2, close, isOpen, el: function() {\n      return el;\n    } };\n  }\n\n  // v2/src/ui/primer-option.js\n  function createPrimerOption(doc2, act) {\n    const el = (tag, cls, text) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      if (text != null) e.textContent = text;\n      return e;\n    };\n    const box3 = el(\"label\", \"ub-lab__drill ub-lab__primer\");\n    box3.setAttribute(\"data-ub-calc-primer\", \"\");\n    box3.setAttribute(\"hidden\", \"\");\n    const input = el(\"input\");\n    input.setAttribute(\"type\", \"checkbox\");\n    input.setAttribute(\"data-ub-primer\", \"\");\n    const txt = el(\"span\");\n    txt.appendChild(el(\"b\", \"\", \"Primed (water-based primer)\"));\n    const small = el(\"small\", \"\", \"\");\n    small.setAttribute(\"data-ub-primer-note\", \"\");\n    txt.appendChild(small);\n    box3.appendChild(input);\n    box3.appendChild(txt);\n    input.addEventListener(\"change\", function() {\n      const r = act ? act(\"kitchen.materials\", { primer: !!input.checked }) : null;\n      if (r && r.ok === false) input.checked = !input.checked;\n    });\n    function paint(st, chosen) {\n      const p = st && st.primer;\n      if (!p || p.open !== true || p.painted !== true) {\n        box3.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      box3.removeAttribute(\"hidden\");\n      input.checked = chosen === true;\n      if (!p.sellable) {\n        input.disabled = true;\n        small.textContent = \"Not for this plan: \" + (p.why || \"these painted parts are quoted separately\") + \".\";\n        return;\n      }\n      input.disabled = false;\n      small.textContent = chosen === true ? p.applied && p.qty ? \"Your painted fronts come primed, ready for your painter - no colour or top coat. Primer \" + p.m2 + \" m\\xB2 (both faces and edges), charged as \" + p.qty + \" m\\xB2. The colour you picked is for the 3D view only.\" : \"Your painted fronts come primed, ready for your painter - the price is being updated.\" : \"Tick to buy the painted fronts now, supplied primed with a water-based primer (no colour). Off: quoted separately.\";\n    }\n    return { el: box3, paint };\n  }\n\n  // v2/src/ui/calculator-panel.js\n  function createCalculatorPanel(ctx, over) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win;\n    function quotedFronts() {\n      const q = calcQuoteFronts(units());\n      const st = C3.ctl ? C3.ctl.state() : null;\n      return st && st.primer && st.primer.applied === true ? q.filter(function(f) {\n        return !f.painted;\n      }) : q;\n    }\n    const primerChosen = function() {\n      try {\n        const k = ctx.scene().kitchen;\n        return !!(k && k.primer === true);\n      } catch {\n        return false;\n      }\n    };\n    const cfg = calcConfig(over);\n    const C3 = { ui: null, ctl: null };\n    const units = () => ctx.scene().units;\n    const golaUsed2 = () => golaRequested(ctx.scene().units, ctx.scene().kitchen);\n    function calcEl(tag, css2, text) {\n      const el = doc2.createElement(tag);\n      if (css2) el.setAttribute(\"style\", css2);\n      if (text != null) el.textContent = text;\n      return el;\n    }\n    function calcPaint() {\n      if (!C3.ui || !C3.ctl) return;\n      const st = C3.ctl.state();\n      if (C3.ui.hwNote) {\n        const h = st && st.hardware;\n        C3.ui.hwNote.textContent = h && h.items.length ? \"In the price: \" + h.items.map(function(i) {\n          return i.qty + \" \\xD7 \" + i.title;\n        }).join(\", \") + \".\" + (h.notIncluded.length ? \" Not included: \" + h.notIncluded.join(\", \") + \".\" : \"\") : \"Hinges and fittings as separate items in the order. None: panels only.\";\n      }\n      if (C3.ui.primer) C3.ui.primer.paint(st, primerChosen());\n      if (C3.ui.line) {\n        const t = calcLineText(st, C3.ctl.partCount(), calcExcluded(units(), cfg), cfg, units());\n        if (cfg.priceMode === \"calculator-main\") {\n          const pEl = root.querySelector(\".ub-lab__price\"), lEl = root.querySelector(\"[data-ub-price-label]\");\n          if (pEl) pEl.textContent = st.phase === \"ok\" ? calcMoney(st.incVat) : \"\\u2014\";\n          const nq = quotedFronts().filter(function(f) {\n            return f.painted;\n          }).length;\n          const np = calcQuotePanels(units()).length;\n          const nw = calcQuoteWorktops(units()).length;\n          const without = [nq ? \"painted fronts\" : \"\", np ? nq ? \"panels\" : \"painted panels\" : \"\", nw ? \"worktops\" : \"\"].filter(Boolean);\n          const short = st.phase === \"ok\" && st.terms && st.terms.below_minimum ? Math.max(0, Number(st.terms.minimum_ex_vat) - Number(st.exVat)) : 0;\n          if (lEl) lEl.textContent = short ? \"Min. order \" + calcMoney(st.terms.minimum_ex_vat).replace(/\\.00$/, \"\") + \" ex VAT \\u2014 add \" + calcMoney(short) : st.phase === \"ok\" ? without.length ? \"Cut-list price without the \" + (without.length > 1 ? without.slice(0, -1).join(\", \") + \" and \" + without[without.length - 1] : without[0]) + \", inc VAT\" : \"Cut-list price, including VAT\" : st.phase === \"empty\" && calcWorkshopNote(units()) ? \"Cut-list price \\u2014 not for a workshop cabinet\" : \"Cut-list price \\u2014 pending\";\n          if (lEl && lEl.classList) lEl.classList.toggle(\"is-short\", !!short);\n          C3.ui.line.textContent = st.phase === \"ok\" ? \"Whole sheets, cutting and edging \\u2014 review the full order in the calculator.\" + (nq ? \" Painted MDF fronts (\" + nq + \"): quote required \\u2014 send the enquiry below.\" : \"\") : t.line;\n        } else {\n          C3.ui.line.textContent = t.line;\n        }\n        C3.ui.note.textContent = t.note + (C3.ctl.drilling() ? drillSummary(units(), st) : \"\") + (golaUsed2() ? \" Gola: the notched side panels and the profiles are quoted on request.\" : \"\");\n        if (st.note) C3.ui.line.setAttribute(\"title\", st.note);\n        else C3.ui.line.removeAttribute(\"title\");\n        if (st.phase === \"unavailable\") C3.ui.retry.removeAttribute(\"hidden\");\n        else C3.ui.retry.setAttribute(\"hidden\", \"\");\n      }\n      const gola = golaUsed2();\n      const onRequest = C3.ctl.drilling() && !cncReady() || gola;\n      if (C3.ui.order) C3.ui.order.textContent = gola ? \"Request Gola quote\" : onRequest ? \"Request drilling quote\" : \"Order cut list\";\n      if (C3.ui.buy) {\n        if (onRequest) C3.ui.buy.setAttribute(\"hidden\", \"\");\n        else C3.ui.buy.removeAttribute(\"hidden\");\n      }\n      if (C3.ui.buy && C3.ui.buy.classList) {\n        const below = !!(st && st.phase === \"ok\" && st.terms && st.terms.below_minimum);\n        C3.ui.buy.classList.toggle(\"is-below\", below);\n        if (below) C3.ui.buy.setAttribute(\"title\", \"Minimum order \" + calcMoney(st.terms.minimum_ex_vat) + \" excluding VAT\");\n        else C3.ui.buy.removeAttribute(\"title\");\n      }\n    }\n    function hardwareBlock(wrap) {\n      const f = win2 && typeof win2.fetch === \"function\" ? win2.fetch.bind(win2) : null;\n      if (!f || !cfg.api) return;\n      let asked;\n      try {\n        asked = Promise.resolve(f(String(cfg.api).replace(/\\/$/, \"\") + \"/hardware\", { credentials: \"omit\" }));\n      } catch {\n        return;\n      }\n      asked.then(function(r) {\n        return r && r.ok && typeof r.json === \"function\" ? r.json() : null;\n      }).then(function(j) {\n        const tiers = j && j.ok && Array.isArray(j.tiers) ? j.tiers.filter(function(t) {\n          return t && /^(standard|premium)$/.test(t.id);\n        }) : [];\n        const ui = C3.ui;\n        if (!tiers.length || !ui || ui.hw) return;\n        const lab = calcEl(\"label\", \"\", \"\");\n        lab.className = \"ub-lab__drill ub-lab__hw\";\n        lab.setAttribute(\"data-ub-calc-hw\", \"\");\n        const txt = calcEl(\"span\", \"\", \"\");\n        txt.appendChild(calcEl(\"b\", \"\", \"Hardware\"));\n        ui.hwNote = calcEl(\"small\", \"\", \"Hinges and fittings as separate items in the order. None: panels only.\");\n        txt.appendChild(ui.hwNote);\n        ui.hw = calcEl(\"select\", \"\", \"\");\n        ui.hw.setAttribute(\"aria-label\", \"Hardware\");\n        const opt = function(v, t) {\n          const o = calcEl(\"option\", \"\", t);\n          o.setAttribute(\"value\", v);\n          return o;\n        };\n        ui.hw.appendChild(opt(\"\", \"None\"));\n        for (const t of tiers) ui.hw.appendChild(opt(t.id, t.label));\n        let cur = \"\";\n        try {\n          cur = calcHardwareOf(ctx.scene());\n        } catch {\n          cur = \"\";\n        }\n        ui.hw.value = tiers.some(function(t) {\n          return t.id === cur;\n        }) ? cur : \"\";\n        ui.hw.addEventListener(\"change\", function() {\n          try {\n            ctx.scene().hardware = ui.hw.value || void 0;\n          } catch {\n          }\n          try {\n            if (ctx.recovery && ctx.recovery.checkpoint) ctx.recovery.checkpoint(\"hardware\");\n          } catch {\n          }\n          if (C3.ctl) C3.ctl.now();\n        });\n        lab.appendChild(txt);\n        lab.appendChild(ui.hw);\n        if (ui.line && ui.line.parentNode === wrap) wrap.insertBefore(lab, ui.line);\n        else wrap.appendChild(lab);\n      }, function() {\n      });\n    }\n    function sceneDrilling() {\n      try {\n        const sc = ctx.scene();\n        return typeof sc.drilling === \"boolean\" ? sc.drilling : cfg.drilling === true;\n      } catch {\n        return cfg.drilling === true;\n      }\n    }\n    function projectToken() {\n      const R4 = ctx.recovery;\n      if (R4 && typeof R4.state === \"function\" && typeof R4.ownToken === \"function\") {\n        const st = R4.state();\n        return st.planId ? st.token || null : null;\n      }\n      try {\n        const v = JSON.parse(win2.localStorage.getItem(PROJECT_KEY) || \"null\");\n        return v && typeof v.token === \"string\" ? v.token : null;\n      } catch {\n        return null;\n      }\n    }\n    function rememberProject(token) {\n      if (!token) return;\n      if (ctx.recovery && typeof ctx.recovery.ownToken === \"function\" && ctx.recovery.ownToken(token)) return;\n      try {\n        win2.localStorage.setItem(PROJECT_KEY, JSON.stringify({ token }));\n      } catch {\n      }\n    }\n    function planProject() {\n      const acc = ctx.account;\n      if (projectToken() || !acc || typeof acc.flush !== \"function\") return Promise.resolve(projectToken());\n      return Promise.resolve(acc.flush(4e3)).then(() => projectToken(), () => projectToken());\n    }\n    function calcOrderName() {\n      const d = /* @__PURE__ */ new Date(), n = units().length;\n      function two(k) {\n        return (k < 10 ? \"0\" : \"\") + k;\n      }\n      return \"Cabinet Lab kitchen \\u2014 \" + n + \" unit\" + (n === 1 ? \"\" : \"s\") + \" \\u2014 \" + d.getFullYear() + \"-\" + two(d.getMonth() + 1) + \"-\" + two(d.getDate());\n    }\n    function planScene() {\n      const sc = ctx.scene();\n      return {\n        v: 1,\n        units: sc.units,\n        kitchen: sc.kitchen || null,\n        room: sc.room || null,\n        activeRun: sc.activeRun || \"main\",\n        drilling: sc.drilling === true,\n        ...calcHardwareOf(sc) ? { hardware: calcHardwareOf(sc) } : {}\n      };\n    }\n    function cncReady() {\n      const st = C3.ctl && C3.ctl.state();\n      return !!(st && st.cnc && st.cnc.ok === true);\n    }\n    function golaRequest(ui) {\n      const message = doc2.querySelector(\"[data-ub-message]\");\n      const request = \"Gola handleless kitchen: please quote the Gola profiles and any notched side panels (details above).\";\n      if (message && !message.value.includes(request)) message.value += \"\\n\" + request;\n      if (message && typeof message.focus === \"function\") message.focus();\n      ui.orderMsg.textContent = \"Gola notches and profiles are not in the online cut list yet. Please complete and send the enquiry below - the notch sizes and profile lengths are already in it.\";\n    }\n    function calcOrderClick() {\n      const ui = C3.ui;\n      if (!ui || !C3.ctl || ui.busy) return;\n      ui.orderLink.onclick = null;\n      if (golaUsed2()) {\n        golaRequest(ui);\n        tell(ui.orderMsg.textContent, { title: \"Gola needs a quote\", actions: [Object.assign({ primary: true }, ENQUIRY), CLOSE] });\n        return;\n      }\n      if (C3.ctl.drilling() && !cncReady()) {\n        const message = doc2.querySelector(\"[data-ub-message]\");\n        const st = C3.ctl.state(), cnc = st && st.cnc, built = !!(cnc && cnc.built === true);\n        const why = built ? [].concat(Array.isArray(cnc.toolFaults) ? cnc.toolFaults : []).map(String).filter(Boolean) : [];\n        const request = built ? \"CNC drilling requested; the drilling is built but not ready for the machine\" + (why.length ? \" (\" + why.join(\" \") + \")\" : \"\") + \" - please confirm the drilling and its final price.\" : \"CNC drilling requested; please confirm hole positions and the final drilling price.\";\n        if (message && !message.value.includes(request)) message.value += \"\\n\" + request;\n        if (message && typeof message.focus === \"function\") message.focus();\n        ui.orderMsg.textContent = built ? \"The drilling is built but not ready for the machine yet\" + (why.length ? \": \" + why.join(\" \") : \".\") + \" Please complete and send the enquiry below.\" : \"Drilling positions are not in this cut list yet. Please complete and send the enquiry below.\";\n        tell(ui.orderMsg.textContent, { title: \"Drilling needs a quote\", actions: [Object.assign({ primary: true }, ENQUIRY), CLOSE] });\n        return;\n      }\n      const rows = calcSceneParts(units(), cfg);\n      if (!rows.length) {\n        tell(\"Add a cabinet first.\", { title: \"Your plan is empty\" });\n        return;\n      }\n      const quoteFronts = quotedFronts(), quotePanels = calcQuotePanels(units());\n      const qNote = (quoteFronts.length ? \" Your \" + quoteFronts.length + \" painted or routed front\" + (quoteFronts.length === 1 ? \" is\" : \"s are\") + \" not in it \\u2014 they are listed in the enquiry below for a quote.\" : \"\") + (quotePanels.length ? \" Your \" + quotePanels.length + \" painted panel\" + (quotePanels.length === 1 ? \" is\" : \"s are\") + \" not in it either \\u2014 quoted with the painted doors.\" : \"\") + (calcQuoteWorktops(units()).length ? \" Your worktops are not in it either \\u2014 they are listed in the enquiry (task 1791478310196).\" : \"\");\n      let w = null;\n      try {\n        w = win2.open(\"\", \"_blank\");\n      } catch {\n        w = null;\n      }\n      if (w) {\n        try {\n          w.opener = null;\n          w.document.title = \"Opening the cut-list calculator\\u2026\";\n          w.document.body.textContent = \"Opening the Uniboards cut-list calculator\\u2026\";\n        } catch {\n        }\n      }\n      ui.busy = true;\n      ui.order.disabled = true;\n      ui.orderMsg.textContent = \"Preparing your cut list\\u2026\";\n      ui.orderLink.setAttribute(\"hidden\", \"\");\n      return planProject().then(function(token) {\n        return C3.ctl.order(calcOrderName(), rows, token, planScene(), C3.ctl.drilling(), { customer: calcCustomer(), session: calcSession() });\n      }).then(function(r) {\n        ui.busy = false;\n        ui.order.disabled = false;\n        rememberProject(r.token);\n        const fresh = r.freshReason === \"edited_in_calculator\" ? \" You had changed your earlier list in the calculator, so it stays as it was at its old link \\u2014 this is a new list.\" : \"\";\n        let opened = false;\n        if (w && !w.closed) {\n          try {\n            w.location.href = r.url;\n            opened = true;\n          } catch {\n            opened = false;\n          }\n        }\n        if (!opened) {\n          try {\n            opened = !!win2.open(r.url, \"_blank\", \"noopener\");\n          } catch {\n            opened = false;\n          }\n        }\n        ui.orderLink.setAttribute(\"href\", r.url);\n        ui.orderLink.removeAttribute(\"hidden\");\n        ui.orderMsg.textContent = opened ? (r.updated ? \"Your cut list in the calculator is updated: \" : \"The calculator opened in a new tab with your \") + rows.length + \" panels.\" + qNote + fresh + \" \" : (r.updated ? \"Your cut list is updated.\" : \"Your cut list is ready.\") + qNote + fresh + \" \";\n        if (!opened) DLG.show({\n          title: \"Your cut list is ready\",\n          tone: \"ok\",\n          text: ui.orderMsg.textContent.trim(),\n          actions: [{ id: \"calculator\", label: \"Open the calculator\", primary: true, href: r.url }, CLOSE]\n        });\n      }, function(err) {\n        ui.busy = false;\n        ui.order.disabled = false;\n        if (w) {\n          try {\n            w.close();\n          } catch {\n          }\n        }\n        tell(\n          err && err.fromServer ? \"The calculator could not take this cut list: \" + err.message + \" Please send the enquiry below and we will price it for you.\" : err && err.calcReason ? err.calcReason + \" Please send the enquiry below and we will price it for you.\" : \"The calculator could not be reached just now. Please try again, or send the enquiry below and we will price it for you.\",\n          { title: \"The cut list did not open\", tone: \"error\", actions: [{ id: \"retry\", label: \"Try again\", primary: true, onClick: calcOrderClick }, ENQUIRY] }\n        );\n      });\n    }\n    const B = { sig: null, id: null, offer: null };\n    const PENDING_KEY = \"ub-cabinet-lab:checkout\";\n    const PENDING_TTL_MS = 24 * 3600 * 1e3;\n    function pendingRead() {\n      try {\n        const p = JSON.parse(win2.localStorage.getItem(PENDING_KEY) || \"null\");\n        return p && p.v === 1 && typeof p.id === \"string\" && typeof p.sig === \"string\" && Number(p.at) > Date.now() - PENDING_TTL_MS ? p : null;\n      } catch {\n        return null;\n      }\n    }\n    function pendingWrite(p) {\n      try {\n        win2.localStorage.setItem(PENDING_KEY, JSON.stringify(p));\n        return true;\n      } catch {\n        return false;\n      }\n    }\n    function pendingClear() {\n      try {\n        win2.localStorage.removeItem(PENDING_KEY);\n      } catch {\n      }\n    }\n    function fp(s) {\n      let h = 2166136261;\n      s = String(s);\n      for (let i = 0; i < s.length; i++) {\n        h ^= s.charCodeAt(i);\n        h = Math.imul(h, 16777619) >>> 0;\n      }\n      return h.toString(16);\n    }\n    function buyerKey() {\n      const c = calcCustomer();\n      if (c && c.id) return \"c:\" + c.id;\n      const s = calcSession();\n      return s ? \"s:\" + fp(s) : \"guest\";\n    }\n    function planKey() {\n      const R4 = ctx.recovery ? ctx.recovery.state() : null;\n      return R4 && R4.planId || projectToken() || \"-\";\n    }\n    function checkoutBase(rows, quoteId, drilling, postcode) {\n      return [fp(JSON.stringify(rows)), quoteId || \"\", drilling ? \"d\" : \"c\", buyerKey(), planKey(), shipKey(postcode)].join(\"|\");\n    }\n    const SHIP_KEY = \"ub-cabinet-lab:postcode\";\n    const SHIP_RE = /^[A-Z]{1,2}[0-9][A-Z0-9]?\\s*[0-9][A-Z]{2}$/i;\n    const D2 = { ans: null, seq: 0, timer: null };\n    function shipKey(v) {\n      return String(v || \"\").toUpperCase().replace(/[^A-Z0-9]/g, \"\");\n    }\n    function shipRead() {\n      try {\n        return String(win2.localStorage.getItem(SHIP_KEY) || \"\");\n      } catch {\n        return \"\";\n      }\n    }\n    function shipKeep(v) {\n      try {\n        if (v) win2.localStorage.setItem(SHIP_KEY, v);\n        else win2.localStorage.removeItem(SHIP_KEY);\n      } catch {\n      }\n    }\n    function shipValue() {\n      return C3.ui && C3.ui.ship ? String(C3.ui.ship.value || \"\").trim().toUpperCase() : \"\";\n    }\n    function shipPaint() {\n      const ui = C3.ui;\n      if (!ui || !ui.shipNote) return;\n      const pc = shipValue(), a = D2.ans;\n      ui.shipNote.textContent = !pc ? \"Enter your postcode for the delivery price.\" : !SHIP_RE.test(pc) ? \"Enter a full UK postcode.\" : !a || a.key !== shipKey(pc) ? \"Checking the delivery\\u2026\" : a.ok && a.available ? calcMoney(a.price) + \" + VAT for the whole order, flat-packed.\" : a.message || \"The delivery could not be priced just now.\";\n    }\n    function shipLookup() {\n      const pc = shipValue();\n      shipKeep(SHIP_RE.test(pc) ? pc : \"\");\n      if (!SHIP_RE.test(pc)) {\n        D2.ans = null;\n        shipPaint();\n        return Promise.resolve(null);\n      }\n      const key = shipKey(pc);\n      if (D2.ans && D2.ans.key === key && D2.ans.ok) {\n        shipPaint();\n        return Promise.resolve(D2.ans);\n      }\n      const seq = ++D2.seq;\n      D2.ans = null;\n      shipPaint();\n      return calcPost(win2, cfg, \"/delivery\", { postcode: pc }).then(function(r) {\n        const j = r && r.json;\n        const a = j && typeof j.ok === \"boolean\" ? { key, ok: j.ok, available: j.available === true, price: Number(j.price), message: j.message || \"\" } : { key, ok: false, available: false, message: \"The delivery could not be priced just now.\" };\n        if (seq === D2.seq) {\n          D2.ans = a;\n          shipPaint();\n        }\n        return a;\n      }, function() {\n        const a = { key, ok: false, available: false, message: \"The delivery could not be priced just now.\" };\n        if (seq === D2.seq) {\n          D2.ans = a;\n          shipPaint();\n        }\n        return a;\n      });\n    }\n    function calcAttemptId(base, offerId) {\n      const sig = base + \"|\" + (offerId || \"\");\n      if (sig === B.sig && B.id) return B.id;\n      const p = pendingRead();\n      if (p && p.sig === sig) {\n        B.sig = sig;\n        B.id = p.id;\n        return B.id;\n      }\n      let rnd = \"\";\n      try {\n        const a = new Uint8Array(9);\n        win2.crypto.getRandomValues(a);\n        rnd = Array.prototype.map.call(a, function(x) {\n          return (x < 16 ? \"0\" : \"\") + x.toString(16);\n        }).join(\"\");\n      } catch {\n        rnd = Date.now().toString(36) + Math.random().toString(36).slice(2, 10);\n      }\n      B.sig = sig;\n      B.id = \"cablab-\" + rnd;\n      return B.id;\n    }\n    function calcSession() {\n      try {\n        const v = JSON.parse(win2.localStorage.getItem(\"ub-cabinet-lab:session\") || \"null\");\n        return v && typeof v.session === \"string\" && v.exp > Date.now() ? v.session : null;\n      } catch {\n        return null;\n      }\n    }\n    function calcCustomer() {\n      const g2 = function(k) {\n        return root.getAttribute && root.getAttribute(\"data-ub-customer-\" + k) || \"\";\n      };\n      const c = { id: g2(\"id\"), email: g2(\"email\"), ts: g2(\"ts\"), sig: g2(\"sig\") };\n      return c.id && c.email && c.ts && /^[a-f0-9]{64}$/i.test(c.sig) ? c : null;\n    }\n    function calcCustomerEmail() {\n      const v = root.getAttribute && root.getAttribute(\"data-ub-customer-email\") || \"\";\n      return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(v.trim()) ? v.trim() : \"\";\n    }\n    const DLG = createBuyDialog(doc2);\n    function enquiryGo() {\n      const m = doc2.querySelector(\"[data-ub-message]\");\n      const form = m && m.closest ? m.closest(\"form\") : null;\n      try {\n        (form || m).scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n      } catch {\n      }\n      try {\n        if (m) m.focus({ preventScroll: true });\n      } catch {\n      }\n    }\n    const ENQUIRY = { id: \"enquiry\", label: \"Send enquiry\", onClick: enquiryGo };\n    const CLOSE = { id: \"close\", label: \"Close\" };\n    function tell(text, o) {\n      if (C3.ui && C3.ui.orderMsg) C3.ui.orderMsg.textContent = text;\n      return DLG.show(Object.assign({ title: \"Buy now\", tone: \"warn\", actions: [CLOSE] }, o || {}, { text }));\n    }\n    function waitForPrice(again) {\n      DLG.show({ title: \"Buy now\", tone: \"busy\", text: \"Working out the price\\u2026\", actions: [] });\n      const t0 = Date.now();\n      (function poll() {\n        const ph = (C3.ctl && C3.ctl.state() || {}).phase;\n        if (ph === \"ok\") {\n          DLG.close();\n          again();\n          return;\n        }\n        if (ph === \"unavailable\" || ph === \"error\" || Date.now() - t0 > 3e4) {\n          tell(\n            \"The price could not be worked out just now. Please try again, or send the plan as an enquiry and we will price it.\",\n            { tone: \"error\", actions: [{ id: \"retry\", label: \"Try again\", primary: true, keep: true, onClick: function() {\n              if (C3.ctl) C3.ctl.now();\n              waitForPrice(again);\n            } }, ENQUIRY] }\n          );\n          return;\n        }\n        win2.setTimeout(poll, 400);\n      })();\n    }\n    function askPostcode(onReady) {\n      const ui = C3.ui;\n      const wrap = doc2.createElement(\"label\");\n      wrap.className = \"ub-buydlg__field\";\n      const cap2 = doc2.createElement(\"span\");\n      cap2.textContent = \"Delivery postcode\";\n      wrap.appendChild(cap2);\n      const inp = doc2.createElement(\"input\");\n      inp.setAttribute(\"type\", \"text\");\n      inp.setAttribute(\"autocomplete\", \"postal-code\");\n      inp.setAttribute(\"maxlength\", \"10\");\n      inp.setAttribute(\"placeholder\", \"e.g. B1 1AA\");\n      inp.setAttribute(\"data-ub-buydlg-postcode\", \"\");\n      inp.value = shipValue();\n      wrap.appendChild(inp);\n      const note = doc2.createElement(\"small\");\n      note.setAttribute(\"data-ub-buydlg-shipnote\", \"\");\n      note.setAttribute(\"aria-live\", \"polite\");\n      wrap.appendChild(note);\n      let go = null, timer = null;\n      function paint() {\n        const pc = String(inp.value || \"\").trim().toUpperCase(), a = D2.ans;\n        const ready = !!(SHIP_RE.test(pc) && a && a.key === shipKey(pc) && a.ok && a.available);\n        note.textContent = !pc ? \"We deliver the whole order flat-packed; the price depends on your area.\" : !SHIP_RE.test(pc) ? \"Enter a full UK postcode, e.g. B1 1AA.\" : !a || a.key !== shipKey(pc) ? \"Checking the delivery\\u2026\" : a.ok && a.available ? \"Delivery \" + calcMoney(a.price) + \" + VAT for the whole order.\" : a.message || \"The delivery could not be priced just now.\";\n        if (go) {\n          go.disabled = !ready;\n          go.setAttribute(\"aria-disabled\", ready ? \"false\" : \"true\");\n        }\n        return ready;\n      }\n      function lookup() {\n        if (ui.ship) ui.ship.value = String(inp.value || \"\").trim().toUpperCase();\n        paint();\n        return shipLookup().then(function() {\n          return paint();\n        });\n      }\n      function next() {\n        lookup().then(function(ok2) {\n          if (ok2) {\n            DLG.close();\n            onReady();\n          }\n        });\n      }\n      inp.addEventListener(\"input\", function() {\n        if (timer) win2.clearTimeout(timer);\n        paint();\n        timer = win2.setTimeout(function() {\n          timer = null;\n          lookup();\n        }, 400);\n      });\n      inp.addEventListener(\"keydown\", function(e) {\n        if (e.key !== \"Enter\") return;\n        if (e.preventDefault) e.preventDefault();\n        if (timer) {\n          win2.clearTimeout(timer);\n          timer = null;\n        }\n        next();\n      });\n      DLG.show({\n        title: \"Where do we deliver?\",\n        tone: \"info\",\n        field: wrap,\n        text: \"Enter your postcode to see the delivery price, then continue to Shopify's secure payment page.\",\n        actions: [{ id: \"continue\", label: \"Continue to payment\", primary: true, keep: true, onClick: next }, ENQUIRY]\n      });\n      go = DLG.el().querySelector('[data-ub-buydlg-act=\"continue\"]');\n      if (SHIP_RE.test(String(inp.value || \"\").trim())) lookup();\n      else paint();\n    }\n    function calcBuyClick(opts) {\n      const ui = C3.ui;\n      if (!ui || !C3.ctl || ui.busy) return;\n      opts = opts && opts.ubBuy ? opts : { ubBuy: true };\n      ui.orderLink.onclick = null;\n      if (golaUsed2()) {\n        golaRequest(ui);\n        tell(ui.orderMsg.textContent, { title: \"Gola needs a quote\", actions: [Object.assign({ primary: true }, ENQUIRY), CLOSE] });\n        return;\n      }\n      if (C3.ctl.drilling() && !cncReady()) {\n        const c = (C3.ctl.state() || {}).cnc || {};\n        const why = (c.toolFaults || []).concat((c.missing || []).map(function(m) {\n          return m.count + \" \\xD7 \" + m.operation + \" on \" + m.part;\n        }));\n        tell(\n          \"CNC drilling for this plan is not ready for the machine yet\" + (why.length ? \" (\" + why.join(\"; \") + \")\" : \"\") + \": switch drilling off to buy the cut and edged panels now, or send the enquiry below.\",\n          { title: \"Drilling needs a quote\", actions: [{\n            id: \"nodrill\",\n            label: \"Buy without drilling\",\n            primary: true,\n            keep: true,\n            onClick: function() {\n              if (ui.drill) {\n                ui.drill.checked = false;\n                ui.drill.dispatchEvent(new win2.Event(\"change\"));\n              }\n              waitForPrice(function() {\n                calcBuyClick(opts);\n              });\n            }\n          }, ENQUIRY] }\n        );\n        return;\n      }\n      const st = C3.ctl.state() || {};\n      if (st.phase !== \"ok\") {\n        ui.orderMsg.textContent = \"The price is still being worked out \\u2014 please try again in a moment.\";\n        waitForPrice(function() {\n          calcBuyClick(opts);\n        });\n        return;\n      }\n      if (st.terms && st.terms.below_minimum) {\n        const short = Math.max(0, Number(st.terms.minimum_ex_vat) - Number(st.exVat));\n        tell(\n          \"Our minimum order is \" + calcMoney(st.terms.minimum_ex_vat) + \" excluding VAT (before delivery); this plan comes to \" + calcMoney(st.exVat) + \" excluding VAT. Add to the plan, or send the enquiry below.\",\n          { title: \"Add \" + calcMoney(short) + \" more to buy online\", actions: [{ id: \"design\", label: \"Keep designing\", primary: true }, ENQUIRY] }\n        );\n        return;\n      }\n      const rows = calcSceneParts(units(), cfg);\n      if (!rows.length) {\n        tell(\"Add a cabinet first.\", { title: \"Your plan is empty\" });\n        return;\n      }\n      const postcode = shipValue();\n      if (ui.ship && !SHIP_RE.test(postcode)) {\n        ui.orderMsg.textContent = \"Enter your delivery postcode first: the delivery is priced for your area (the whole order, flat-packed).\";\n        askPostcode(function() {\n          calcBuyClick(opts);\n        });\n        return;\n      }\n      if (D2.ans && D2.ans.key === shipKey(postcode) && D2.ans.ok && !D2.ans.available) {\n        tell(D2.ans.message, { title: \"No online delivery rate for \" + postcode, actions: [\n          Object.assign({ primary: true }, ENQUIRY),\n          { id: \"postcode\", label: \"Change postcode\", keep: true, onClick: function() {\n            askPostcode(function() {\n              calcBuyClick(opts);\n            });\n          } }\n        ] });\n        return;\n      }\n      const quoteFronts = quotedFronts(), quotePanels = calcQuotePanels(units()), quoteWt = calcQuoteWorktops(units());\n      if ((quoteFronts.length || quotePanels.length || quoteWt.length) && !opts.separateOk) {\n        const what = [\n          quoteFronts.length ? quoteFronts.length + \" painted or routed front\" + (quoteFronts.length === 1 ? \"\" : \"s\") : \"\",\n          quotePanels.length ? quotePanels.length + \" painted panel\" + (quotePanels.length === 1 ? \"\" : \"s\") : \"\",\n          quoteWt.length ? quoteWt.length + \" worktop board\" + (quoteWt.length === 1 ? \"\" : \"s\") : \"\"\n        ].filter(Boolean).join(\" and \");\n        tell(\n          \"Your \" + what + (quoteFronts.length + quotePanels.length + quoteWt.length === 1 ? \" is\" : \" are\") + \" priced separately and not in this order. Buy the cut and edged panels now, and send the rest as an enquiry for a quote?\",\n          {\n            title: \"Some parts are priced separately\",\n            tone: \"info\",\n            actions: [\n              { id: \"buy-panels\", label: \"Buy the panels now\", primary: true, onClick: function() {\n                calcBuyClick(Object.assign({}, opts, { separateOk: true }));\n              } },\n              { id: \"cancel\", label: \"Cancel\" }\n            ]\n          }\n        );\n        return;\n      }\n      const base = checkoutBase(rows, st.quoteId, C3.ctl.drilling(), postcode);\n      const kept = pendingRead();\n      const offer = B.offer && B.offer.quote_id === st.quoteId ? B.offer : kept && kept.base === base && kept.offer && kept.offer.quote_id === st.quoteId ? kept.offer : null;\n      B.offer = null;\n      const attemptId = calcAttemptId(base, offer ? offer.id : \"\");\n      pendingWrite({ v: 1, base, sig: base + \"|\" + (offer ? offer.id : \"\"), id: attemptId, offer, at: Date.now() });\n      ui.busy = true;\n      ui.buy.disabled = true;\n      if (ui.order) ui.order.disabled = true;\n      const terms = st.terms && st.terms.made_to_order || \"Made to order: 5\\u20137 working days to make, then delivered flat-packed (delivery for your postcode is on the order).\";\n      ui.orderMsg.textContent = \"Preparing your order and secure checkout\\u2026 \" + terms;\n      ui.orderLink.setAttribute(\"hidden\", \"\");\n      DLG.show({ title: \"Preparing your secure checkout\\u2026\", tone: \"busy\", text: terms, actions: [] });\n      const again = function() {\n        calcBuyClick({ ubBuy: true, separateOk: opts.separateOk });\n      };\n      const RETRY = { id: \"retry\", label: \"Try again\", primary: true, onClick: again };\n      const R4 = ctx.recovery ? ctx.recovery.state() : null;\n      const extra = {\n        quoteId: st.quoteId,\n        plan: R4 && R4.planId ? { id: R4.planId, revision: R4.rev } : null,\n        build: root.getAttribute && root.getAttribute(\"data-ub-build\") || \"\",\n        acceptOffer: offer,\n        customer: calcCustomer(),\n        session: calcSession(),\n        deliveryPostcode: postcode\n      };\n      return planProject().then(function(token) {\n        return C3.ctl.checkout(calcOrderName(), rows, attemptId, calcCustomerEmail(), token, planScene(), C3.ctl.drilling(), extra);\n      }).then(function(r) {\n        pendingClear();\n        rememberProject(r.token);\n        ui.orderMsg.textContent = \"Order \" + r.orderName + \" is ready\" + (r.delivery ? \" (delivery to \" + r.delivery.postcode + \": \" + calcMoney(r.delivery.price) + \" + VAT)\" : \"\") + \" \\u2014 taking you to checkout\\u2026 \" + terms + \" \";\n        ui.orderLink.setAttribute(\"href\", r.url);\n        ui.orderLink.textContent = \"Go to checkout\";\n        ui.orderLink.removeAttribute(\"target\");\n        ui.orderLink.removeAttribute(\"hidden\");\n        DLG.show({\n          title: \"Order \" + r.orderName + \" is ready\",\n          tone: \"ok\",\n          text: \"Taking you to Shopify's secure payment page\\u2026\" + (r.delivery ? \" Delivery to \" + r.delivery.postcode + \": \" + calcMoney(r.delivery.price) + \" + VAT.\" : \"\"),\n          actions: [{ id: \"pay\", label: \"Go to payment\", primary: true, href: r.url }]\n        });\n        try {\n          win2.location.href = r.url;\n        } catch {\n        }\n        ui.busy = false;\n        ui.buy.disabled = false;\n        if (ui.order) ui.order.disabled = false;\n      }, function(err) {\n        ui.busy = false;\n        ui.buy.disabled = false;\n        if (ui.order) ui.order.disabled = false;\n        const code = err && err.code;\n        const unknown = !(err && err.fromServer) || code === \"in_progress\" || code === \"shopify_uncertain\" || code === \"awaiting_confirmation\";\n        if (!unknown) pendingClear();\n        if (err && err.token) rememberProject(err.token);\n        if (code === \"price_changed\" && err.offer) {\n          const o = err.offer;\n          ui.orderMsg.textContent = \"Shopify calculates this order at \" + calcMoney(o.total) + \" including VAT (\" + calcMoney(o.subtotal) + \" + VAT \" + calcMoney(o.tax) + \"). \";\n          ui.orderLink.setAttribute(\"href\", \"#\");\n          ui.orderLink.textContent = \"Accept \" + calcMoney(o.total) + \" and continue\";\n          ui.orderLink.removeAttribute(\"target\");\n          ui.orderLink.removeAttribute(\"hidden\");\n          const accept = function() {\n            ui.orderLink.onclick = null;\n            B.offer = o;\n            again();\n          };\n          ui.orderLink.onclick = function(e) {\n            if (e && e.preventDefault) e.preventDefault();\n            accept();\n          };\n          tell(ui.orderMsg.textContent, {\n            title: \"Shopify's total for this order\",\n            tone: \"info\",\n            actions: [{ id: \"accept\", label: \"Accept \" + calcMoney(o.total) + \" and continue\", primary: true, onClick: accept }, { id: \"cancel\", label: \"Cancel\" }]\n          });\n          return;\n        }\n        if (code === \"price_changed\") {\n          C3.ctl.now();\n          tell(\"The price has changed since it was shown \\u2014 please check the new price and press Buy again.\", { title: \"The price has changed\", tone: \"info\" });\n          return;\n        }\n        if (code === \"request_reused\") {\n          B.id = null;\n          B.sig = null;\n          tell(\"Please press Buy again.\", { title: \"Buy now\", actions: [RETRY, CLOSE] });\n          return;\n        }\n        if (code === \"signed_out\") {\n          try {\n            win2.localStorage.removeItem(\"ub-cabinet-lab:session\");\n          } catch {\n          }\n          const back = win2.location && win2.location.pathname + win2.location.search || \"/\";\n          const login = \"/account/login?checkout_url=\" + encodeURIComponent(back);\n          ui.orderLink.setAttribute(\"href\", login);\n          ui.orderLink.textContent = \"Sign in\";\n          ui.orderLink.removeAttribute(\"target\");\n          ui.orderLink.removeAttribute(\"hidden\");\n          tell(\"Please sign in again to buy from your account. \", { title: \"Please sign in again\", actions: [{ id: \"signin\", label: \"Sign in\", primary: true, href: login }, CLOSE] });\n          return;\n        }\n        const plain2 = !!(err && err.fromServer) && (code === \"below_minimum\" || code === \"awaiting_confirmation\" || code === \"in_progress\" || code === \"drilling_not_ready\" || code === \"delivery_postcode_needed\" || code === \"delivery_unavailable\" || code === \"delivery_unpriced\");\n        const text = err && err.fromServer ? plain2 ? err.message + (err.reasons && err.reasons.length ? \" (\" + err.reasons.join(\"; \") + \")\" : \"\") : \"We could not start the checkout: \" + err.message + \" Try \\u201COrder cut list\\u201D, or send the enquiry below.\" : err && err.calcReason ? err.calcReason + \" Try \\u201COrder cut list\\u201D, or send the enquiry below.\" : \"The checkout could not be reached just now. Please try again, or use \\u201COrder cut list\\u201D.\";\n        if (code === \"delivery_postcode_needed\") {\n          ui.orderMsg.textContent = text;\n          askPostcode(again);\n          return;\n        }\n        tell(text, {\n          title: code === \"in_progress\" || code === \"awaiting_confirmation\" ? \"Your order is on its way\" : \"The checkout did not start\",\n          tone: \"error\",\n          actions: code === \"below_minimum\" || code === \"delivery_unavailable\" || code === \"drilling_not_ready\" ? [Object.assign({ primary: true }, ENQUIRY), CLOSE] : [RETRY, ENQUIRY]\n        });\n      });\n    }\n    function calcBasketClick() {\n      const ui = C3.ui;\n      if (!ui || !C3.ctl || ui.busy) return;\n      ui.orderLink.onclick = null;\n      const rows = calcSceneParts(units(), cfg);\n      ui.busy = true;\n      ui.basket.disabled = true;\n      ui.orderMsg.textContent = \"Checking current basket prices\\u2026\";\n      return calcVerifyBasket(win2, cfg, rows, C3.ctl.drilling()).then(function(cart) {\n        return calcAddToBasket(win2, cart);\n      }).then(function(r) {\n        ui.busy = false;\n        ui.basket.disabled = false;\n        ui.orderMsg.textContent = \"Added \" + r.added + \" item\" + (r.added === 1 ? \"\" : \"s\") + \" to your basket\" + (r.missing.length ? \" (to confirm with us: \" + r.missing.join(\"; \") + \")\" : \"\") + \". \";\n        ui.orderLink.setAttribute(\"href\", \"/cart\");\n        ui.orderLink.textContent = \"Open the basket\";\n        ui.orderLink.removeAttribute(\"target\");\n        ui.orderLink.removeAttribute(\"hidden\");\n        try {\n          win2.location.href = \"/cart\";\n        } catch {\n        }\n      }, function(err) {\n        ui.busy = false;\n        ui.basket.disabled = false;\n        ui.orderMsg.textContent = err && err.calcReason || \"The basket could not be reached \\u2014 please try again.\";\n      });\n    }\n    function calcMount(priceBox, quoteBox) {\n      if (C3.ui) return C3.ui;\n      const ui = { busy: false };\n      if (cfg.priceMode !== \"lab-only\" && priceBox) {\n        const wrap = calcEl(\"div\", \"\");\n        wrap.className = \"ub-lab__calc\";\n        wrap.setAttribute(\"data-ub-calc\", \"\");\n        ui.line = calcEl(\"div\", \"\", \"Calculator price: waiting\\u2026\");\n        ui.line.className = \"ub-lab__calcline\";\n        ui.line.setAttribute(\"data-ub-calc-line\", \"\");\n        ui.line.setAttribute(\"aria-live\", \"polite\");\n        ui.note = calcEl(\"div\", \"\", \"\");\n        ui.note.className = \"ub-lab__calcnote\";\n        ui.retry = calcEl(\"button\", \"\", \"Try again\");\n        ui.retry.setAttribute(\"type\", \"button\");\n        ui.retry.setAttribute(\"class\", \"ub-lab__btn\");\n        ui.retry.setAttribute(\"hidden\", \"\");\n        ui.retry.addEventListener(\"click\", function() {\n          if (C3.ctl) C3.ctl.now();\n        });\n        if (cfg.drillToggle) {\n          const lab = calcEl(\"label\", \"\", \"\");\n          lab.className = \"ub-lab__drill\";\n          lab.setAttribute(\"data-ub-calc-drill\", \"\");\n          ui.drill = calcEl(\"input\", \"\", \"\");\n          ui.drill.setAttribute(\"type\", \"checkbox\");\n          if (sceneDrilling()) ui.drill.setAttribute(\"checked\", \"\");\n          ui.drill.addEventListener(\"change\", function() {\n            try {\n              ctx.scene().drilling = !!ui.drill.checked;\n            } catch {\n            }\n            try {\n              if (ctx.recovery && ctx.recovery.checkpoint) ctx.recovery.checkpoint(\"drilling\");\n            } catch {\n            }\n            if (C3.ctl) C3.ctl.setDrilling(!!ui.drill.checked);\n          });\n          lab.appendChild(ui.drill);\n          const txt = calcEl(\"span\", \"\", \"\");\n          txt.appendChild(calcEl(\"b\", \"\", \"CNC drilling\"));\n          txt.appendChild(calcEl(\"small\", \"\", \"We drill the assembly holes. Off: cut and edged parts only.\"));\n          lab.appendChild(txt);\n          wrap.appendChild(lab);\n        }\n        hardwareBlock(wrap);\n        ui.primer = createPrimerOption(doc2, ctx.act);\n        wrap.appendChild(ui.primer.el);\n        wrap.appendChild(ui.line);\n        wrap.appendChild(ui.note);\n        wrap.appendChild(ui.retry);\n        ui.calcWrap = wrap;\n        const calcSlot = root.querySelector && root.querySelector(\"[data-ub-calc-slot]\");\n        (calcSlot || priceBox).appendChild(wrap);\n      }\n      const slot = priceBox && priceBox.querySelector && priceBox.querySelector(\"[data-ub-calc-order-slot]\");\n      if (cfg.orderButton && (slot || quoteBox)) {\n        const ob = calcEl(\"div\", \"\");\n        ob.className = \"ub-lab__order\";\n        ob.setAttribute(\"data-ub-calc-order\", \"\");\n        if (cfg.checkoutButton) {\n          ui.buy = calcEl(\"button\", \"\", \"Buy now\");\n          ui.buy.setAttribute(\"type\", \"button\");\n          ui.buy.setAttribute(\"class\", \"ub-lab__btn ub-lab__cta\");\n          ui.buy.setAttribute(\"data-ub-calc-buy\", \"\");\n          ui.buy.addEventListener(\"click\", calcBuyClick);\n        }\n        ui.order = calcEl(\"button\", \"\", \"Order cut list\");\n        ui.order.setAttribute(\"type\", \"button\");\n        ui.order.setAttribute(\"class\", cfg.checkoutButton ? \"ub-lab__btn ub-lab__order2\" : \"ub-lab__btn ub-lab__cta\");\n        ui.order.addEventListener(\"click\", calcOrderClick);\n        const why = calcEl(\"p\", \"\", cfg.checkoutButton ? \"Buy now: secure Shopify checkout for these cut and edged panels \\u2014 made to order, 5\\u20137 working days to make, delivered flat-packed at our standard rate for your postcode; minimum order \\xA3300 excl. VAT. Order cut list: check and edit them in our calculator first.\" : \"You check the panels and pay in our cut-list calculator.\");\n        why.className = \"ub-lab__orderwhy\";\n        const status = calcEl(\"div\", \"\");\n        status.className = \"ub-lab__orderstatus\";\n        ui.orderMsg = calcEl(\"span\", \"\", \"\");\n        ui.orderMsg.setAttribute(\"aria-live\", \"polite\");\n        ui.orderLink = calcEl(\"a\", \"\", \"Open the calculator\");\n        ui.orderLink.setAttribute(\"target\", \"_blank\");\n        ui.orderLink.setAttribute(\"rel\", \"noopener\");\n        ui.orderLink.setAttribute(\"hidden\", \"\");\n        status.appendChild(ui.orderMsg);\n        status.appendChild(ui.orderLink);\n        if (ui.buy) {\n          const row = calcEl(\"div\", \"\");\n          row.className = \"ub-lab__buyrow\";\n          row.appendChild(ui.buy);\n          row.appendChild(ui.order);\n          ob.appendChild(row);\n          const ship = calcEl(\"label\", \"\");\n          ship.className = \"ub-lab__ship\";\n          ship.setAttribute(\"data-ub-calc-ship\", \"\");\n          ship.appendChild(calcEl(\"span\", \"\", \"Delivery to\"));\n          ui.ship = calcEl(\"input\", \"\", \"\");\n          ui.ship.setAttribute(\"type\", \"text\");\n          ui.ship.setAttribute(\"autocomplete\", \"postal-code\");\n          ui.ship.setAttribute(\"placeholder\", \"Postcode\");\n          ui.ship.setAttribute(\"maxlength\", \"10\");\n          ui.ship.setAttribute(\"aria-label\", \"Delivery postcode\");\n          ui.ship.value = shipRead();\n          ui.ship.addEventListener(\"input\", function() {\n            if (D2.timer) win2.clearTimeout(D2.timer);\n            shipPaint();\n            D2.timer = win2.setTimeout(function() {\n              D2.timer = null;\n              shipLookup();\n            }, 500);\n          });\n          ui.ship.addEventListener(\"change\", function() {\n            if (D2.timer) {\n              win2.clearTimeout(D2.timer);\n              D2.timer = null;\n            }\n            shipLookup();\n          });\n          ship.appendChild(ui.ship);\n          ui.shipNote = calcEl(\"span\", \"\", \"\");\n          ui.shipNote.className = \"ub-lab__shipnote\";\n          ui.shipNote.setAttribute(\"aria-live\", \"polite\");\n          ship.appendChild(ui.shipNote);\n          (ui.calcWrap || ob).appendChild(ship);\n        } else ob.appendChild(ui.order);\n        if (cfg.basketButton) {\n          ui.basket = calcEl(\"button\", \"\", \"Add to basket\");\n          ui.basket.setAttribute(\"type\", \"button\");\n          ui.basket.setAttribute(\"class\", \"ub-lab__btn\");\n          ui.basket.setAttribute(\"data-ub-calc-basket\", \"\");\n          ui.basket.addEventListener(\"click\", calcBasketClick);\n          ob.appendChild(ui.basket);\n        }\n        ob.appendChild(why);\n        ob.appendChild(status);\n        if (slot) slot.appendChild(ob);\n        else {\n          const title = quoteBox.querySelector(\".ub-lab__quote-title\");\n          if (title && title.nextSibling) quoteBox.insertBefore(ob, title.nextSibling);\n          else quoteBox.appendChild(ob);\n        }\n      }\n      if (!ui.line && !ui.order) return null;\n      C3.ui = ui;\n      C3.ctl = calcController({\n        getParts: function() {\n          return calcSceneParts(units(), cfg);\n        },\n        getScene: planScene,\n        onState: calcPaint,\n        win: win2,\n        cfg: Object.assign({}, cfg, { drilling: sceneDrilling() }),\n        setTimeout: over && over.setTimeout,\n        clearTimeout: over && over.clearTimeout\n      });\n      if (ui.line) C3.ctl.now();\n      if (ui.ship) shipLookup();\n      return ui;\n    }\n    function calcOnChange() {\n      if (!C3.ui || !C3.ctl) return;\n      try {\n        const want = sceneDrilling();\n        if (C3.ui.drill && C3.ui.drill.checked !== want) C3.ui.drill.checked = want;\n        if (C3.ctl.drilling() !== want) C3.ctl.setDrilling(want);\n      } catch {\n      }\n      try {\n        if (C3.ui.line) C3.ctl.poke();\n        calcPaint();\n      } catch {\n      }\n    }\n    try {\n      calcMount(root.querySelector(\".ub-lab__pricebox\"), root.querySelector(\".ub-lab__quotebox\"));\n    } catch (e) {\n      C3.ui = null;\n      C3.ctl = null;\n      try {\n        win2.console.warn(\"Cabinet Lab: calculator panel not added.\", e);\n      } catch {\n      }\n    }\n    return {\n      mount: calcMount,\n      parts: function() {\n        return calcSceneParts(units(), cfg);\n      },\n      unitRows: function(u) {\n        return calcUnitRows(u, cfg);\n      },\n      lineText: function(st, n, excl) {\n        return calcLineText(st, n, excl, cfg);\n      },\n      readQuote: calcReadQuote,\n      controller: function(o) {\n        return calcController(Object.assign({ win: win2, cfg }, o));\n      },\n      excluded: function() {\n        return calcExcluded(units(), cfg);\n      },\n      state: function() {\n        return C3.ctl ? C3.ctl.state() : null;\n      },\n      ui: function() {\n        return C3.ui;\n      },\n      order: calcOrderClick,\n      buy: calcBuyClick,\n      onChange: calcOnChange,\n      mode: cfg.priceMode\n    };\n  }\n\n  // v2/src/ui/sticky-header.js\n  function measureHead(root, doc2, win2) {\n    if (!doc2 || typeof doc2.elementsFromPoint !== \"function\") return 0;\n    const w = win2.innerWidth || 1024;\n    let best = 0;\n    for (const fx of [0.5, 0.15, 0.85]) {\n      const hits = doc2.elementsFromPoint(Math.round(w * fx), 2) || [];\n      for (const el of hits) {\n        if (!el || el === doc2.body || el === doc2.documentElement) continue;\n        if (root && (el === root || root.contains && root.contains(el))) continue;\n        const cs = win2.getComputedStyle ? win2.getComputedStyle(el) : null;\n        if (!cs) continue;\n        if (cs.position !== \"fixed\" && cs.position !== \"sticky\") continue;\n        if (cs.visibility === \"hidden\" || cs.display === \"none\") continue;\n        const r = el.getBoundingClientRect ? el.getBoundingClientRect() : null;\n        if (!r || r.height <= 0 || r.top > 4) continue;\n        if (r.bottom > best) best = r.bottom;\n      }\n    }\n    return Math.max(0, Math.min(400, Math.round(best)));\n  }\n  function tameStickyHeader(doc2, win2) {\n    if (!doc2) return null;\n    let hdr = null;\n    try {\n      if (typeof doc2.getElementById === \"function\") hdr = doc2.getElementById(\"header\");\n      if (!hdr && typeof doc2.querySelector === \"function\")\n        hdr = doc2.querySelector(\"header.header, .header-group > header\");\n    } catch {\n      hdr = null;\n    }\n    if (!hdr) return null;\n    const docEl = doc2.documentElement;\n    if (docEl && docEl.classList) docEl.classList.add(\"ub-lab-page\");\n    const st = { pending: false };\n    function strip() {\n      if (hdr.dataset && hdr.dataset.sticky !== \"false\") hdr.dataset.sticky = \"false\";\n      if (hdr.classList && hdr.classList.contains(\"header-sticky\"))\n        hdr.classList.remove(\"header-sticky\");\n      if (hdr.style && hdr.style.height) hdr.style.height = \"\";\n    }\n    function unstick() {\n      strip();\n      if (st.pending) return;\n      st.pending = true;\n      const later = function() {\n        st.pending = false;\n        strip();\n      };\n      if (win2.requestAnimationFrame) win2.requestAnimationFrame(later);\n      else globalThis.setTimeout(later, 0);\n    }\n    unstick();\n    let mo = null;\n    if (typeof win2.MutationObserver === \"function\") {\n      try {\n        mo = new win2.MutationObserver(unstick);\n        mo.observe(hdr, { attributes: true, attributeFilter: [\"class\", \"style\", \"data-sticky\"] });\n      } catch {\n        mo = null;\n      }\n    }\n    win2.addEventListener(\"scroll\", unstick, { passive: true });\n    win2.addEventListener(\"resize\", unstick);\n    return { header: hdr, stop() {\n      if (mo) mo.disconnect();\n      win2.removeEventListener(\"scroll\", unstick, { passive: true });\n      win2.removeEventListener(\"resize\", unstick);\n    } };\n  }\n  function watchHead(root, doc2, win2, onChange) {\n    const st = { px: -1, queued: false };\n    function applyHead() {\n      st.queued = false;\n      const h = measureHead(root, doc2, win2);\n      if (Math.abs(h - st.px) < 1) return;\n      st.px = h;\n      if (root.style && root.style.setProperty) root.style.setProperty(\"--ub-head\", h + \"px\");\n      onChange();\n    }\n    function queueHead() {\n      if (st.queued) return;\n      st.queued = true;\n      if (win2.requestAnimationFrame) win2.requestAnimationFrame(applyHead);\n      else globalThis.setTimeout(applyHead, 16);\n    }\n    applyHead();\n    win2.addEventListener(\"scroll\", queueHead, { passive: true });\n    win2.addEventListener(\"resize\", queueHead);\n    let ro = null;\n    if (win2.ResizeObserver) {\n      try {\n        ro = new win2.ResizeObserver(queueHead);\n        ro.observe(doc2.body);\n      } catch {\n        ro = null;\n      }\n    }\n    return { stop() {\n      win2.removeEventListener(\"scroll\", queueHead, { passive: true });\n      win2.removeEventListener(\"resize\", queueHead);\n      if (ro) ro.disconnect();\n    } };\n  }\n\n  // v2/src/ui/edition.js\n  var PRO = \"pro\";\n  function editionOf(root) {\n    return root && root.getAttribute && root.getAttribute(\"data-ub-edition\") === PRO ? PRO : \"shop\";\n  }\n  var PRO_CONFIG = { calc: false, account: false, chef: false, stickyHeader: false };\n  function configOf(root) {\n    const base = editionOf(root) === PRO ? PRO_CONFIG : { calc: {} };\n    const given = root && root.__ubLabConfig;\n    return given && typeof given === \"object\" ? Object.assign({}, base, given) : base;\n  }\n\n  // v2/src/ui/workshop.js\n  function createWorkshopPanel(ctx) {\n    if (editionOf(ctx.root) !== PRO) return {};\n    const { doc: doc2, root } = ctx, host = root.querySelector(\".ub-lab__sec--units\");\n    if (!(host == null ? void 0 : host.parentNode)) return {};\n    const sec = doc2.createElement(\"section\");\n    sec.className = \"ub-lab__sec ub-lab__sec--workshop\";\n    sec.hidden = true;\n    const title = doc2.createElement(\"h3\");\n    title.textContent = \"Workshop cabinet\";\n    sec.appendChild(title);\n    const fields = {};\n    for (const [k, label] of [[\"w\", \"Width\"], [\"h\", \"Height\"], [\"d\", \"Depth\"]]) {\n      const row = doc2.createElement(\"label\");\n      row.className = \"ub-lab__optrow\";\n      row.textContent = label + \" (mm) \";\n      const input = doc2.createElement(\"input\");\n      input.type = \"number\";\n      input.step = \"1\";\n      input.setAttribute(\"data-ub-workshop-size\", k);\n      input.addEventListener(\"change\", () => ctx.act(\"workshop.size\", { k, value: input.value }));\n      row.appendChild(input);\n      sec.appendChild(row);\n      fields[k] = input;\n    }\n    const picker = doc2.createElement(\"select\");\n    picker.setAttribute(\"data-ub-workshop-part\", \"\");\n    picker.setAttribute(\"aria-label\", \"Workshop panel\");\n    picker.addEventListener(\"change\", () => ctx.act(\"workshop.part\", { pid: picker.value }));\n    sec.appendChild(picker);\n    const undo = doc2.createElement(\"button\");\n    undo.type = \"button\";\n    undo.className = \"ub-lab__btn\";\n    undo.textContent = \"Undo\";\n    undo.addEventListener(\"click\", () => ctx.act(\"history.undo\", {}));\n    sec.appendChild(undo);\n    const note = doc2.createElement(\"p\");\n    note.className = \"ub-lab__note\";\n    note.textContent = \"Original construction, materials and machining are retained. Size edits and project files are available. Apply to the parts list is not enabled for this construction yet.\";\n    sec.appendChild(note);\n    host.parentNode.insertBefore(sec, host);\n    const state2 = { home: null, next: null };\n    return { sync() {\n      const scene = ctx.scene(), on = !!scene.workshop;\n      sec.hidden = !on;\n      root.toggleAttribute(\"data-ub-workshop\", on);\n      const files = root.querySelector(\"[data-ub-pfile]\");\n      if (files) {\n        if (on && files.parentNode !== sec) {\n          state2.home = files.parentNode;\n          state2.next = files.nextSibling;\n          sec.appendChild(files);\n        } else if (!on && state2.home && files.parentNode === sec) state2.home.insertBefore(files, state2.next && state2.next.parentNode === state2.home ? state2.next : null);\n      }\n      if (!on) return;\n      const u = scene.units[0];\n      for (const k of Object.keys(fields)) if (doc2.activeElement !== fields[k]) fields[k].value = String(u[k]);\n      const parts = workshopRuntimeParts(u), key = parts.map((p) => p.pid + \"|\" + p.mm.w + \"|\" + p.mm.h + \"|\" + p.mm.d).join(\";\");\n      if (picker.__key !== key) {\n        picker.textContent = \"\";\n        for (const p of parts) {\n          const o = doc2.createElement(\"option\");\n          o.value = p.pid;\n          o.textContent = p.name + \" \\xB7 \" + p.materialName;\n          picker.appendChild(o);\n        }\n        picker.__key = key;\n      }\n      if (scene.selPart) picker.value = scene.selPart;\n    }, destroy() {\n      root.removeAttribute(\"data-ub-workshop\");\n      sec.remove();\n    } };\n  }\n\n  // v2/src/ui/controls.js\n  function syncStyleSelect(sel, style2) {\n    const cur = style2 || \"slab\";\n    Array.prototype.slice.call(sel.querySelectorAll(\"option[data-ub-legacy]\")).forEach((o) => {\n      if (o.value !== cur) o.remove();\n    });\n    if (isLegacyStyle(cur) && !sel.querySelector('option[value=\"' + cur + '\"]')) {\n      const o = sel.ownerDocument.createElement(\"option\");\n      o.value = cur;\n      o.disabled = true;\n      o.setAttribute(\"data-ub-legacy\", \"\");\n      o.textContent = styleOf(cur).name + \" (no longer offered)\";\n      sel.appendChild(o);\n    }\n    sel.value = cur;\n  }\n  function exText(pct) {\n    return pct <= 0 ? \"Assembled\" : pct >= 100 ? \"Maximum\" : pct + \"%\";\n  }\n  function createControls(ctx) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win;\n    const q = (s) => root.querySelector(s);\n    const qa = (s) => Array.prototype.slice.call(root.querySelectorAll(s));\n    const st = { shelfFocus: false };\n    const LS_KEY3 = \"ub-cabinet-lab:v1\";\n    const dims = {};\n    for (const k of [\"w\", \"w2\", \"h\", \"d\"])\n      dims[k] = { sl: q('[data-ub-slider=\"' + k + '\"]'), nu: q('[data-ub-num=\"' + k + '\"]'), hp: q('[data-ub-help=\"' + k + '\"]') };\n    const E = {\n      frontStyle: q(\"[data-ub-frontstyle]\"),\n      shakerFields: qa(\"[data-ub-shaker]\"),\n      shakerRow: q(\"[data-ub-shakerrow]\"),\n      zo: q(\"[data-ub-zoomout]\"),\n      zi: q(\"[data-ub-zoomin]\"),\n      dim2: q(\"[data-ub-dim2]\"),\n      kfinish: qa(\"[data-ub-kfinish]\"),\n      finexc: q(\"[data-ub-finexceptions]\"),\n      wlabel: q(\"[data-ub-wlabel]\"),\n      dlabel: q(\"[data-ub-dlabel]\"),\n      w2label: q(\"[data-ub-w2label]\"),\n      turnRow: q(\"[data-ub-turnrow]\"),\n      handRow: q(\"[data-ub-handrow]\"),\n      hand: qa(\"[data-ub-hand]\"),\n      secRow: q(\"[data-ub-secrow]\"),\n      preRow: q(\"[data-ub-presetrow]\"),\n      seccount: qa(\"[data-ub-seccount]\"),\n      sec: qa(\"[data-ub-sec]\"),\n      secw: qa(\"[data-ub-secw]\"),\n      bay: qa(\"[data-ub-bay]\"),\n      bayopen: qa(\"[data-ub-bayopen]\"),\n      tallRow: q(\"[data-ub-tallrow]\"),\n      tallh: qa(\"[data-ub-tallh]\"),\n      shelfRow: q(\"[data-ub-shelfrow]\"),\n      shelfVal: q(\"[data-ub-shelfval]\"),\n      shelfstep: qa(\"[data-ub-shelfstep]\"),\n      leafRow: q(\"[data-ub-leafrow]\"),\n      leafopen: qa(\"[data-ub-leafopen]\"),\n      tallNote: q(\"[data-ub-tallnote]\"),\n      intWrap: q(\"[data-ub-interior]\"),\n      intWhy: q(\"[data-ub-intwhy]\"),\n      intSum: q(\"[data-ub-intsum]\"),\n      intShelfRow: q(\"[data-ub-intshelfrow]\"),\n      intDivRow: q(\"[data-ub-intdivrow]\"),\n      intShelfVal: q(\"[data-ub-intshelfval]\"),\n      intshelf: qa(\"[data-ub-intshelf]\"),\n      inthadd: q(\"[data-ub-inthadd]\"),\n      inthdel: q(\"[data-ub-inthdel]\"),\n      inthRow: q(\"[data-ub-inthrow]\"),\n      inthw: qa(\"[data-ub-inthw]\"),\n      inthpos: qa(\"[data-ub-inthpos]\"),\n      intdivadd: q(\"[data-ub-intdivadd]\"),\n      intdivdel: q(\"[data-ub-intdivdel]\"),\n      intdivw: qa(\"[data-ub-intdivw]\"),\n      intdivpos: qa(\"[data-ub-intdivpos]\"),\n      seeRow: q(\"[data-ub-intseerow]\"),\n      see: q(\"[data-ub-intsee]\"),\n      intNote: q(\"[data-ub-intnote]\"),\n      roomSum: q(\"[data-ub-roomsum]\"),\n      roomOn: q(\"[data-ub-roomon]\"),\n      roomdim: qa(\"[data-ub-roomdim]\"),\n      roomNote: q(\"[data-ub-roomnote]\"),\n      runFold: q(\"[data-ub-runfold]\"),\n      runWhy: q(\"[data-ub-runwhy]\"),\n      runSum: q(\"[data-ub-runsum]\"),\n      runNote: q(\"[data-ub-runnote]\"),\n      finWrap: q(\"[data-ub-finishing]\"),\n      finWhy: q(\"[data-ub-finwhy]\"),\n      finSum: q(\"[data-ub-finsum]\"),\n      endRow: q(\"[data-ub-endrow]\"),\n      scribRow: q(\"[data-ub-scribrow]\"),\n      end: qa(\"[data-ub-end]\"),\n      endhRow: q(\"[data-ub-endhrow]\"),\n      enddrop: qa(\"[data-ub-enddrop]\"),\n      scribe: qa(\"[data-ub-scribe]\"),\n      finNote: q(\"[data-ub-finnote]\"),\n      islandNote: q(\"[data-ub-islandnote]\"),\n      blindSplit: q(\"[data-ub-blindsplit]\"),\n      d4row: q(\"[data-ub-drawer4row]\"),\n      drawerN: qa(\"[data-ub-drawer-n]\"),\n      drawersAll: q(\"[data-ub-drawers-all]\"),\n      frontH: q(\"[data-ub-frontheights]\"),\n      drawerOpen: q(\"[data-ub-draweropen]\"),\n      drawerOpenRow: q(\"[data-ub-draweropen-row]\"),\n      doorRow: q(\"[data-ub-doorrow]\"),\n      door: q(\"[data-ub-door]\"),\n      hingeRow: q(\"[data-ub-hingerow]\"),\n      hinge: q(\"[data-ub-hinge]\"),\n      hingeZoom: q(\"[data-ub-hingezoom]\"),\n      modes: [\n        [\"rotate\", q(\"[data-ub-mode-rotate]\")],\n        [\"pan\", q(\"[data-ub-mode-pan]\")],\n        [\"size\", q(\"[data-ub-mode-size]\")],\n        [\"parts\", q(\"[data-ub-mode-parts]\")],\n        [\"move\", q(\"[data-ub-mode-move]\")]\n      ],\n      turnL: q(\"[data-ub-turn-left]\"),\n      turnR: q(\"[data-ub-turn-right]\"),\n      modeHint: q(\"[data-ub-modehint]\"),\n      moveL: q(\"[data-ub-moveleft]\"),\n      moveR: q(\"[data-ub-moveright]\"),\n      snap: q(\"[data-ub-snap]\"),\n      alignView: q(\"[data-ub-alignview]\"),\n      frontSee: q(\"[data-ub-frontsee]\"),\n      allDims: q(\"[data-ub-alldims]\"),\n      envBtns: qa(\"[data-ub-env]\"),\n      gfxBtns: qa(\"[data-ub-gfx]\"),\n      doorHint: q(\"[data-ub-doorhint]\"),\n      selLabel: q(\"[data-ub-sellabel]\"),\n      hood: q(\"[data-ub-hood]\"),\n      partInfo: q(\"[data-ub-partinfo]\"),\n      partRow: q(\"[data-ub-partrow]\"),\n      shelfRow2: q(\"[data-ub-shelfrow2]\"),\n      shelfDel: q(\"[data-ub-shelfdel]\"),\n      shelfMm: q(\"[data-ub-shelfmm]\"),\n      shelfAdd: q(\"[data-ub-shelfadd]\"),\n      noteInside: q('[data-ub-groupnote=\"inside\"]'),\n      noteFronts: q('[data-ub-groupnote=\"fronts\"]'),\n      gapBox: q(\"[data-ub-gapbox]\"),\n      gapDirs: q(\"[data-ub-gapdirs]\"),\n      gapNote: q(\"[data-ub-gapnote]\"),\n      gapUndo: q(\"[data-ub-gapundo]\"),\n      gapdir: qa(\"[data-ub-gapdir]\"),\n      gapfill: qa(\"[data-ub-gapfill]\"),\n      undo: q(\"[data-ub-undo]\"),\n      redo: q(\"[data-ub-redo]\"),\n      restore: q(\"[data-ub-restore]\"),\n      save: q(\"[data-ub-save]\"),\n      saveNote: q(\"[data-ub-savenote]\"),\n      explode: q(\"[data-ub-explode]\"),\n      explodeVal: q(\"[data-ub-explode-val]\"),\n      runRows: {},\n      runCounts: {},\n      runLinks: {},\n      runHints: {},\n      runDims: {}\n    };\n    const rundims = qa(\"[data-ub-rundim]\");\n    for (const tier of [\"base\", \"wall\"]) {\n      E.runRows[tier] = q('[data-ub-runrow=\"' + tier + '\"]');\n      E.runCounts[tier] = q('[data-ub-runcount=\"' + tier + '\"]');\n      E.runLinks[tier] = q('[data-ub-runlink=\"' + tier + '\"]');\n      E.runHints[tier] = q('[data-ub-runhint=\"' + tier + '\"]');\n      for (const key of [\"h\", \"d\"])\n        E.runDims[tier + key] = rundims.filter(function(x) {\n          return x.getAttribute(\"data-ub-rundim\") === key && x.getAttribute(\"data-ub-runtier\") === tier;\n        })[0] || null;\n    }\n    const focused = (el) => !!doc2.activeElement && doc2.activeElement === el;\n    const hintOf = {};\n    for (const inp of E.inthpos) {\n      const i = inp.getAttribute(\"data-ub-inthpos\");\n      hintOf[\"h\" + i] = q('[data-ub-inthhint=\"' + i + '\"]');\n    }\n    for (const inp of E.intdivpos) {\n      const i = inp.getAttribute(\"data-ub-intdivpos\");\n      hintOf[\"v\" + i] = q('[data-ub-intdivhint=\"' + i + '\"]');\n    }\n    function syncZoomButtons() {\n      const V3 = ctx.view, ZOOM2 = V3.ZOOM;\n      const z = V3.clampZoom(ctx.scene().zoom);\n      if (E.zo) E.zo.disabled = z >= ZOOM2.max - 1e-9;\n      if (E.zi) E.zi.disabled = ctx.scene().pivot && V3.zoomInDisabled ? !!V3.zoomInDisabled() : z <= ZOOM2.min + 1e-9 || V3.atMinDist() || !!(V3.zoomInDisabled && V3.zoomInDisabled());\n    }\n    function syncGroupNotes(u) {\n      function note(el, text) {\n        if (!el) return;\n        if (text) {\n          el.textContent = text;\n          el.removeAttribute(\"hidden\");\n        } else el.setAttribute(\"hidden\", \"\");\n      }\n      if (!u) {\n        note(E.noteInside, \"Select a cabinet to change what is inside it.\");\n        note(E.noteFronts, \"Select a cabinet to change its doors and drawers.\");\n        return;\n      }\n      note(E.noteInside, canInterior(u) ? null : interiorWhy(u) || \"This cabinet does not take shelves.\");\n      const isle = isIsland(u);\n      note(E.noteFronts, u.type === \"base-4drawer\" ? \"A drawer bank is drawers all the way up - there is no door to add, only its drawer fronts.\" : isle ? \"An island's doors and drawers belong to its sections; their fronts go on and off together.\" : null);\n    }\n    function shelfPidOf2(u, entry) {\n      if (isCornerShelfUnit(u)) {\n        const nm2 = cornerShelfName(u, entry);\n        return nm2 ? u.id + \":shelf:\" + nm2 : null;\n      }\n      const mine = shelfListOf(u).filter(function(x) {\n        return x.cell === entry.cell;\n      }).sort(function(a, b) {\n        return a.y - b.y;\n      });\n      let idx = -1;\n      for (let i = 0; i < mine.length; i++) if (mine[i].id === entry.id) idx = i;\n      if (idx < 0) return null;\n      const cs = cells(u);\n      const multi = cs.length > 1;\n      let c = null;\n      for (const x of cs) if (shelfCellKey(x) === entry.cell) c = x;\n      const nm = \"Shelf \" + (idx + 1) + (multi && c ? \" (\" + (c.band + 1) + \".\" + (c.col + 1) + \")\" : \"\");\n      return u.id + \":shelf:\" + nm;\n    }\n    function partInfoText(u, part) {\n      if (!part) return \"\";\n      let base = partReadout(u, part);\n      if (part.kind === \"shelf\") {\n        const sl = shelfListOf(u).filter(function(x) {\n          return shelfPidOf2(u, x) === part.pid;\n        })[0];\n        if (sl) base += \" \\xB7 \" + Math.round(sl.y) + \" mm above the inside bottom\";\n      }\n      return base;\n    }\n    function syncPartInfo() {\n      const scene = ctx.scene();\n      const u = selected(scene);\n      const p = scene.partsMode && u && scene.selPart ? partById(u, scene.selPart) : null;\n      if (E.partRow) {\n        if (scene.partsMode) E.partRow.removeAttribute(\"hidden\");\n        else E.partRow.setAttribute(\"hidden\", \"\");\n      }\n      if (E.partInfo) E.partInfo.textContent = p ? partInfoText(u, p) : scene.partsMode ? \"Point at a part to see what it is\" : \"\";\n      syncGroupNotes(u);\n      const sh = E.shelfRow2;\n      if (sh) {\n        const isShelf = !!(p && p.kind === \"shelf\");\n        if (u && canInterior(u)) sh.removeAttribute(\"hidden\");\n        else sh.setAttribute(\"hidden\", \"\");\n        if (E.shelfDel) E.shelfDel.disabled = !isShelf;\n        const mm2 = E.shelfMm;\n        if (mm2) {\n          mm2.disabled = !isShelf;\n          if (isShelf && !st.shelfFocus) {\n            const sl2 = shelfListOf(u).filter(function(x) {\n              return shelfPidOf2(u, x) === p.pid;\n            })[0];\n            mm2.value = sl2 ? String(Math.round(sl2.y)) : \"\";\n          } else if (!isShelf) mm2.value = \"\";\n        }\n      }\n    }\n    function gapDir() {\n      const pick = E.gapDirs && E.gapDirs.getAttribute(\"data-ub-gappick\");\n      return pick || null;\n    }\n    function syncGapUI() {\n      const box3 = E.gapBox;\n      if (!box3) return;\n      const scene = ctx.scene();\n      const u = selected(scene);\n      const off = u ? gapOffer(scene.units, u) : { ok: false };\n      const dirs = E.gapDirs, note = E.gapNote, undo = E.gapUndo;\n      const canUndo = !!(ctx.commands && ctx.commands.can && ctx.commands.can(\"gap.undo\"));\n      if (undo) {\n        if (canUndo) undo.removeAttribute(\"hidden\");\n        else undo.setAttribute(\"hidden\", \"\");\n      }\n      if (!off.ok) {\n        box3.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      box3.removeAttribute(\"hidden\");\n      if (dirs) {\n        if (off.ambiguous) {\n          dirs.removeAttribute(\"hidden\");\n          if (!dirs.getAttribute(\"data-ub-gappick\")) dirs.setAttribute(\"data-ub-gappick\", \"hi\");\n        } else {\n          dirs.setAttribute(\"hidden\", \"\");\n          dirs.setAttribute(\"data-ub-gappick\", off.dir || \"hi\");\n        }\n      }\n      const chosen = gapDir() || off.dir || \"hi\";\n      const amount = chosen === \"lo\" ? off.lo : off.hi;\n      if (note) note.textContent = off.ambiguous ? \"There is a gap both ways on this wall: \" + off.lo + \" mm \" + off.loLabel + \", and \" + off.hi + \" mm \" + off.hiLabel + \". Choose an end, then Extend or Share.\" : amount + \" mm of free space \" + (chosen === \"lo\" ? off.loLabel : off.hiLabel) + \". Extend widens this cabinet only; Share spreads it across the run.\";\n    }\n    function syncUndoUI() {\n      const h = ctx.commands && ctx.commands.history ? ctx.commands.history() : null;\n      const past = h && h.past || [], future = h && h.future || [];\n      if (E.undo) {\n        E.undo.disabled = !past.length;\n        E.undo.setAttribute(\"aria-description\", past.length ? \"Undo \" + past[past.length - 1] : \"Nothing to undo\");\n      }\n      if (E.redo) {\n        E.redo.disabled = !future.length;\n        E.redo.setAttribute(\"aria-description\", future.length ? \"Redo \" + future[future.length - 1] : \"Nothing to redo\");\n      }\n    }\n    function store() {\n      try {\n        return win2.localStorage || null;\n      } catch {\n        return null;\n      }\n    }\n    function savedStamp() {\n      const s = store();\n      if (!s) return null;\n      try {\n        const d = JSON.parse(s.getItem(LS_KEY3) || \"null\");\n        return d && d.v === 1 && d.units && d.units.length ? d : null;\n      } catch {\n        return null;\n      }\n    }\n    function syncSaveUI() {\n      const d = savedStamp();\n      if (E.restore) {\n        if (d) E.restore.removeAttribute(\"disabled\");\n        else E.restore.setAttribute(\"disabled\", \"\");\n      }\n      if (E.saveNote) E.saveNote.textContent = !store() ? \"This browser will not let the planner save anything.\" : d ? \"Saved plan: \" + (d.n || d.units.length) + \" cabinets, \" + (d.when || \"earlier\") + \". Saved on this device only.\" : \"Saved in this browser only, on this device.\";\n    }\n    function syncControls() {\n      var _a;\n      const scene = ctx.scene();\n      syncZoomButtons();\n      for (const b of E.envBtns || []) {\n        const nm = b.getAttribute(\"data-ub-env\"), onEnv = nm === (scene.environment === \"universe\" ? \"universe\" : \"neutral\");\n        b.classList.toggle(\"is-active\", onEnv);\n        b.setAttribute(\"aria-pressed\", onEnv ? \"true\" : \"false\");\n        const busy = nm === \"universe\" && onEnv && !!scene.envLoading;\n        if (busy) b.setAttribute(\"aria-busy\", \"true\");\n        else b.removeAttribute(\"aria-busy\");\n        b.textContent = nm === \"universe\" ? busy ? \"Universe\\u2026\" : \"Universe\" : \"Neutral\";\n      }\n      for (const b of E.gfxBtns || []) {\n        const on2 = b.getAttribute(\"data-ub-gfx\") === (scene.graphics === \"low\" || scene.graphics === \"high\" ? scene.graphics : \"auto\");\n        b.classList.toggle(\"is-active\", on2);\n        b.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n      }\n      const u = selected(scene);\n      const LIM = limitsFor(u);\n      const isL0 = isLPlan(u);\n      for (const k of [\"w\", \"w2\", \"h\", \"d\"]) {\n        if (k === \"w2\" && !isL0) continue;\n        let lim = LIM[k] || LIM.w;\n        if (k === \"d\" && u.family === \"corner\") lim = [lim[0], Math.max(lim[0], maxCornerDepth(u))];\n        const val = k === \"w2\" ? armB(u) : u[k];\n        const sl = dims[k].sl, nu = dims[k].nu;\n        const derived = false;\n        if (sl) {\n          sl.min = lim[0];\n          sl.max = lim[1];\n          sl.value = val;\n          sl.disabled = !!derived;\n        }\n        const note = derived ? \"adds up from the sections\" : k === \"h\" ? u.family === \"wall\" ? \"full cabinet height\" : \"excludes the legs\" : k === \"d\" && u.family === \"corner\" ? \"limited by the shorter arm\" : \"\";\n        if (nu) nu.readOnly = !!derived;\n        if (nu) {\n          nu.min = lim[0];\n          nu.max = lim[1];\n          nu.value = val;\n          nu.setAttribute(\"title\", lim[0] + \"\\u2013\" + lim[1] + \" mm\" + (note ? \" \\xB7 \" + note : \"\"));\n        }\n        const hp = dims[k].hp;\n        if (hp) hp.textContent = note || lim[0] + \"\\u2013\" + lim[1] + \" mm\";\n      }\n      show(E.dim2, isL0);\n      for (const b of E.kfinish) {\n        const kf = b.getAttribute(\"data-ub-kfinish\");\n        const on2 = scene.kitchen[kf] === b.getAttribute(\"data-ub-kval\") && !(kf === \"fronts\" && scene.kitchen.frontMat === \"mdf-paint\");\n        b.classList.toggle(\"is-active\", on2);\n        b.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n      }\n      const exc = scene.units.filter(isCustom);\n      if (E.finexc) E.finexc.textContent = exc.length ? exc.length === 1 ? displayName(scene.units, exc[0]) + \" has its own finish.\" : exc.length + \" cabinets have their own finish (\" + exc.map(function(v) {\n        return displayName(scene.units, v);\n      }).join(\", \") + \").\" : \"\";\n      const isDrw = u.type === \"base-drawer\";\n      const is4 = u.type === \"base-4drawer\";\n      const isle = u.type === \"island\";\n      const isCnr = u.family === \"corner\";\n      const isBlind = u.type === \"corner-blind\";\n      if (E.wlabel) E.wlabel.textContent = isLPlan(u) ? \"Arm 1\" : \"Width\";\n      if (E.dlabel) E.dlabel.textContent = isLPlan(u) ? \"Arm depth\" : \"Depth\";\n      if (E.w2label) E.w2label.textContent = \"Arm 2\";\n      if (E.turnRow) E.turnRow.setAttribute(\"hidden\", \"\");\n      show(E.handRow, isBlind);\n      for (const b of E.hand)\n        pressed(b, isBlind && b.getAttribute(\"data-ub-hand\") === (u.hand || \"left\"));\n      const secList = isle ? islandBayList(u) : [];\n      show(E.secRow, isle);\n      show(E.preRow, isle);\n      for (const btn of E.seccount) {\n        const n = parseInt(btn.getAttribute(\"data-ub-seccount\"), 10);\n        pressed(btn, isle && secList.length === n);\n      }\n      for (const row of E.sec) {\n        const i = parseInt(row.getAttribute(\"data-ub-sec\"), 10);\n        show(row, isle && i < secList.length);\n      }\n      for (const inp of E.secw) {\n        const i = parseInt(inp.getAttribute(\"data-ub-secw\"), 10);\n        if (!isle || i >= secList.length) continue;\n        if (!focused(inp)) inp.value = String(secList[i].w);\n        inp.min = String(ISLAND_BAY_LIMITS.w[0]);\n        inp.max = String(ISLAND_BAY_LIMITS.w[1]);\n        inp.title = ISLAND_BAY_LIMITS.w[0] + \"\\u2013\" + ISLAND_BAY_LIMITS.w[1] + \" mm\";\n      }\n      for (const btn of E.bay) {\n        const i = parseInt(btn.getAttribute(\"data-ub-bay\"), 10);\n        pressed(btn, isle && i < secList.length && secList[i].kind === btn.getAttribute(\"data-ub-baykind\"));\n      }\n      for (const btn of E.bayopen) {\n        const i = parseInt(btn.getAttribute(\"data-ub-bayopen\"), 10);\n        if (!isle || i >= secList.length) {\n          btn.disabled = true;\n          continue;\n        }\n        const kind = secList[i].kind, open = !!(u.bayOpen && u.bayOpen[i]);\n        const what = kind === \"drawers\" ? \"drawers\" : \"doors\";\n        if (kind !== \"drawers\") {\n          btn.setAttribute(\"hidden\", \"\");\n          btn.disabled = true;\n          continue;\n        }\n        btn.removeAttribute(\"hidden\");\n        btn.disabled = false;\n        btn.textContent = open ? \"Close\" : \"Open\";\n        pressed(btn, open);\n        btn.setAttribute(\n          \"aria-label\",\n          (open ? \"Close section \" : \"Open section \") + (i + 1) + \" \" + what\n        );\n      }\n      const tall = isTall(u);\n      show(E.tallRow, tall);\n      for (const btn of E.tallh)\n        pressed(btn, tall && u.h === parseInt(btn.getAttribute(\"data-ub-tallh\"), 10));\n      const isPantry = tall && u.type === \"tall-pantry\";\n      show(E.shelfRow, isPantry);\n      if (E.shelfVal && isPantry) E.shelfVal.textContent = String(tallShelves(u));\n      for (const btn of E.shelfstep) {\n        const step = parseInt(btn.getAttribute(\"data-ub-shelfstep\"), 10);\n        btn.disabled = !isPantry || (step < 0 ? tallShelves(u) <= TALL.shelves.min : tallShelves(u) >= TALL.shelves.max);\n      }\n      show(E.leafRow, tall);\n      for (const btn of E.leafopen) {\n        const i = parseInt(btn.getAttribute(\"data-ub-leafopen\"), 10);\n        if (!tall) {\n          btn.disabled = true;\n          continue;\n        }\n        const lv = tallLeaves(u).find(function(l, k) {\n          return (l.li != null ? l.li : k) === i;\n        });\n        const open = !!(u.leafOpen && u.leafOpen[i]);\n        btn.disabled = !lv;\n        if (!lv) continue;\n        btn.textContent = lv.name.replace(\" door\", \"\").replace(\" front\", \"\");\n        pressed(btn, open);\n        btn.setAttribute(\"aria-label\", (open ? \"Close the \" : \"Open the \") + lv.name.toLowerCase());\n      }\n      if (E.tallNote) E.tallNote.textContent = tall ? (isHousing(u) ? \"PROVISIONAL planning model. The appliance is NOT included and no exact fit is claimed - \" : \"PROVISIONAL. \") + \"To confirm: \" + tallProvisos(u).join(\"; \") + \". \" + (u.h + LEG_H) + \" mm overall on \" + LEG_H + \" mm legs.\" + (u.type === \"tall-fridge\" ? \" The back is left open behind the appliance: a cabinet panel must not cover a fridge's back.\" : \"\") + \" Not approved for manufacture until the hardware is verified.\" : \"\";\n      const tgt = interiorTarget(u);\n      const why = tgt ? interiorWhy(tgt) : \"Nothing is selected.\";\n      const able = !!tgt && why === null;\n      if (E.intWrap) E.intWrap.removeAttribute(\"hidden\");\n      if (E.intWhy) E.intWhy.textContent = able ? \"\" : isIsland(u) && !tgt ? \"This island is all drawer sections - switch a section to Doors to shelve it.\" : why || \"\";\n      const II = able ? interiorOf(tgt) : { shelves: 0, dividers: [], vDiv: [], hDiv: [] };\n      const CC = able ? interiorCounts(tgt) : { fixedH: 0, fixedV: 0, shelfPanels: 0, cells: 0 };\n      const many = (n, one, more) => n + \" \" + (n === 1 ? one : more);\n      const bits = [\n        II.shelves ? many(II.shelves, \"shelf\", \"shelves\") : null,\n        CC.fixedH ? many(CC.fixedH, \"fixed shelf\", \"fixed shelves\") : null,\n        CC.fixedV ? many(CC.fixedV, \"divider\", \"dividers\") : null\n      ].filter(Boolean);\n      if (E.intSum) E.intSum.textContent = !able ? \"not available for this cabinet\" : (bits.length ? bits.join(\" \\xB7 \") : \"no shelves\") + (isIsland(u) ? \" (section \" + (islandIntIndex(u) + 1) + \")\" : \"\");\n      show(E.intShelfRow, able);\n      show(E.intDivRow, able);\n      if (E.intShelfVal) E.intShelfVal.textContent = String(II.shelves);\n      for (const btn of E.intshelf) {\n        const s1 = parseInt(btn.getAttribute(\"data-ub-intshelf\"), 10);\n        btn.disabled = !able || (s1 < 0 ? II.shelves <= 0 : II.shelves >= maxShelvesFor(tgt));\n      }\n      if (E.inthadd) E.inthadd.disabled = !able || !canAddHDivider(tgt);\n      if (E.inthdel) E.inthdel.disabled = !able || !II.hDiv.length;\n      show(E.inthRow, able);\n      for (const row of E.inthw) {\n        const i = parseInt(row.getAttribute(\"data-ub-inthw\"), 10);\n        show(row, able && i < II.hDiv.length);\n      }\n      for (const inp of E.inthpos) {\n        const i = parseInt(inp.getAttribute(\"data-ub-inthpos\"), 10);\n        if (!able || i >= II.hDiv.length) continue;\n        const rg = hDividerRange(tgt, II.hDiv, i);\n        if (!focused(inp)) inp.value = String(Math.round(II.hDiv[i]));\n        inp.min = String(rg.min);\n        inp.max = String(rg.max);\n        const hint = hintOf[\"h\" + i];\n        if (hint) hint.textContent = rg.min + \"\\u2013\" + rg.max + \" mm\";\n      }\n      if (E.intdivadd) E.intdivadd.disabled = !able || !canAddDivider(tgt);\n      if (E.intdivdel) E.intdivdel.disabled = !able || !II.vDiv.length;\n      for (const row of E.intdivw) {\n        const i = parseInt(row.getAttribute(\"data-ub-intdivw\"), 10);\n        show(row, able && i < II.vDiv.length);\n      }\n      for (const inp of E.intdivpos) {\n        const i = parseInt(inp.getAttribute(\"data-ub-intdivpos\"), 10);\n        if (!able || i >= II.vDiv.length) continue;\n        const rg = dividerRange(tgt, II.vDiv, i);\n        if (!focused(inp)) inp.value = String(Math.round(II.vDiv[i]));\n        inp.min = String(rg.min);\n        inp.max = String(rg.max);\n        const hint = hintOf[\"v\" + i];\n        if (hint) hint.textContent = rg.min + \"\\u2013\" + rg.max + \" mm\";\n      }\n      const shut = able && !isIsland(u) && u.door && !(u.doorOpen || (u.leafOpen || []).some(Boolean));\n      show(E.seeRow, able);\n      if (E.see) {\n        E.see.textContent = shut ? \"Show interior\" : \"Close doors\";\n        E.see.setAttribute(\"aria-label\", shut ? \"Open the doors so the interior can be seen\" : \"Close the doors again\");\n      }\n      if (E.intNote) E.intNote.textContent = able ? \"Usable inside \" + Math.round(interiorBounds(tgt).w) + \" \\xD7 \" + Math.round(interiorBounds(tgt).h) + \" mm, in \" + CC.cells + \" compartment\" + (CC.cells === 1 ? \"\" : \"s\") + \". Fixed partitions run the full width and are fixed to the carcass; fixed vertical dividers run between them; adjustable shelves sit on supports inside each compartment and can be moved or taken out. All are 18 mm board in the carcass finish. Shelf supports and fixings are still to be confirmed and are not priced.\" : \"\";\n      syncGapUI();\n      const rsz = roomSize();\n      if (E.roomSum) E.roomSum.textContent = rsz.width + \" \\xD7 \" + rsz.depth + \" \\xD7 \" + rsz.height + \" mm\";\n      if (E.roomOn) E.roomOn.textContent = \"Room size\";\n      for (const inp of E.roomdim) {\n        const k = inp.getAttribute(\"data-ub-roomdim\");\n        inp.disabled = false;\n        if (!focused(inp))\n          inp.value = String(k === \"width\" ? rsz.width : k === \"height\" ? rsz.height : rsz.depth);\n        inp.min = String(ROOM_LIMITS[k][0]);\n        inp.max = String(ROOM_LIMITS[k][1]);\n      }\n      if (E.roomNote) E.roomNote.textContent = \"Your kitchen is planned inside a room \" + rsz.width + \" mm across, \" + rsz.depth + \" mm back to front and \" + rsz.height + \" mm to the ceiling. The four walls stay exactly where they are as you add, move and remove cabinets, and a corner cabinet can be dropped into any of the four corners. Change the measurements here at any time - if a new size would cut through a cabinet we will say which one and change nothing.\";\n      const mineTier = runTier(u);\n      const runSets = {};\n      if (mineTier) {\n        runSets[mineTier] = runMembers(scene.units, u);\n        const sib = runSibling(scene.units, u);\n        if (sib.length) runSets[runTier(sib[0])] = sib;\n      }\n      const anyRun = !!(runSets.base || runSets.wall);\n      if (E.runFold) E.runFold.removeAttribute(\"hidden\");\n      if (E.runWhy) E.runWhy.textContent = anyRun ? \"\" : u && u.type === \"island\" ? \"An island stands on its own in the room, so it is not part of a wall run.\" : u && isTall(u) ? \"A tall unit runs floor to ceiling with its own height range, so it is resized on its own.\" : \"Select a cabinet in a run to resize the whole run.\";\n      if (E.runSum) E.runSum.textContent = anyRun ? Object.keys(runSets).map(function(k) {\n        const n = runSets[k].length;\n        return n + \" \" + k + (n === 1 ? \" cabinet\" : \" cabinets\");\n      }).join(\", \") : \"not available for this cabinet\";\n      for (const tier of [\"base\", \"wall\"]) {\n        const row = E.runRows[tier];\n        const mem = runSets[tier] || [];\n        show(row, !!mem.length);\n        const cnt = E.runCounts[tier];\n        if (cnt) cnt.textContent = mem.length ? mem.length + \" cabinet\" + (mem.length === 1 ? \"\" : \"s\") + (mem.some(function(v) {\n          return v.id === (u && u.id);\n        }) ? \" (including this one)\" : \"\") : \"\";\n        const lk = E.runLinks[tier];\n        const linked = !(scene.runUnlinked && scene.runUnlinked[tier]);\n        if (lk) {\n          lk.disabled = !mem.length;\n          lk.textContent = linked ? \"Linked\" : \"Just this one\";\n          pressed(lk, linked);\n          lk.setAttribute(\"aria-label\", linked ? \"Linked: every cabinet in this run changes together. Click to change only the selected cabinet.\" : \"Only the selected cabinet changes. Click to link the whole run again.\");\n        }\n        const mixed = { any: false };\n        for (const key of [\"h\", \"d\"]) {\n          const inp = E.runDims[tier + key];\n          if (!inp) continue;\n          inp.disabled = !mem.length;\n          if (!mem.length) {\n            inp.value = \"\";\n            continue;\n          }\n          let use = linked ? mem : mem.filter(function(v) {\n            return v.id === (u && u.id);\n          });\n          if (!use.length) use = mem;\n          const val = runValue(use, key), rg = runRange(use, key);\n          if (val === null) mixed.any = true;\n          if (!focused(inp))\n            inp.value = val === null ? \"\" : String(val);\n          inp.placeholder = val === null ? \"Mixed\" : \"\";\n          if (rg) {\n            inp.min = String(rg.min);\n            inp.max = String(rg.max);\n            inp.title = rg.min + \"\\u2013\" + rg.max + \" mm\";\n          }\n        }\n        if (row) row.classList.toggle(\"is-mixed\", mixed.any);\n        const hint = E.runHints[tier];\n        if (hint && mem.length) {\n          const rh = runRange(mem, \"h\"), rd = runRange(mem, \"d\");\n          hint.textContent = (rh ? \"height \" + rh.min + \"\\u2013\" + rh.max : \"\") + (rd ? \", depth \" + rd.min + \"\\u2013\" + rd.max + \" mm\" : \"\");\n        } else if (hint) hint.textContent = \"\";\n      }\n      if (E.runNote) E.runNote.textContent = anyRun ? \"Heights and depths only - widths and positions along the wall are left alone. Depth is measured from the backs, so the run stays against the wall and grows forward. Wall cabinets keep the height they are hung at.\" : \"\";\n      if (E.finWrap) E.finWrap.removeAttribute(\"hidden\");\n      const finAble = canFinishing(u);\n      const FG = finishingOf(u);\n      if (E.finWhy) E.finWhy.textContent = finAble ? \"\" : finishingWhy(u) || \"\";\n      if (E.finSum) E.finSum.textContent = !finAble ? \"already finished\" : hasFinishing(u) ? [\n        FG.endL ? \"left end\" : null,\n        FG.endR ? \"right end\" : null,\n        FG.scribeL ? FG.scribeL + \" mm left scribe\" : null,\n        FG.scribeR ? FG.scribeR + \" mm right scribe\" : null\n      ].filter(Boolean).join(\", \") : \"none\";\n      show(E.endRow, finAble);\n      show(E.scribRow, finAble);\n      for (const btn of E.end) {\n        const side = btn.getAttribute(\"data-ub-end\");\n        const on2 = finAble && (side === \"L\" ? FG.endL : FG.endR);\n        btn.disabled = !finAble;\n        btn.classList.toggle(\"is-active\", on2);\n        btn.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n      }\n      const showEndH = finAble && (FG.endL || FG.endR) && u.family !== \"wall\";\n      show(E.endhRow, showEndH);\n      for (const btn of E.enddrop) {\n        const want = btn.getAttribute(\"data-ub-enddrop\") === \"1\";\n        const on2 = showEndH && FG.endDrop === want;\n        btn.disabled = !showEndH;\n        btn.classList.toggle(\"is-active\", on2);\n        btn.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n      }\n      for (const inp of E.scribe) {\n        const side = inp.getAttribute(\"data-ub-scribe\");\n        inp.disabled = !finAble;\n        if (!focused(inp))\n          inp.value = String(side === \"L\" ? FG.scribeL : FG.scribeR);\n        inp.max = String(FINISH_KIT.scribe.max);\n      }\n      if (E.finNote) E.finNote.textContent = !finAble ? \"\" : \"Cabinet \" + u.w + \" mm; overall with finishing \" + overallWidth(u) + \" mm. The inside of the cabinet does not change. Ends and scribes are 18 mm board and take up room on the floor, so the next cabinet is placed clear of them. An end panel matches the fronts unless you choose otherwise, and on a floor cabinet it goes down to the floor to hide the legs - set both in End panels. A scribe is a trim-to-fit allowance cut on site, not a surveyed wall contour.\" + (u.family === \"wall\" ? \" A wall unit's end panel is carcass height - it has no legs to clear.\" : \"\");\n      if (E.islandNote) E.islandNote.textContent = isle ? \"Body \" + islandBodyW(secList) + \" mm = \" + secList.map(function(x) {\n        return x.w;\n      }).join(\" + \") + \" + 36 mm end panels. Freestanding, with a finished back and finished ends. \" + (worktopOf(scene.kitchen).on ? \"Its worktop is planned in Worktop and listed separately.\" : \"No worktop is included or shown.\") + islandAisleText(scene.units, u) : \"\";\n      if (E.blindSplit) {\n        if (isBlind) {\n          const sp = blindSplit(u.w, u.h, u.d);\n          E.blindSplit.textContent = \"Reachable opening \" + Math.round(sp.openingW) + \" mm \\xB7 blind section \" + Math.round(sp.blindLen) + \" mm, about \" + Math.round(sp.blindVolumeL) + \" litres behind the blanking panel\";\n        } else E.blindSplit.textContent = \"\";\n      }\n      show(E.d4row, is4);\n      for (const b of E.drawerN) {\n        const i = parseInt(b.getAttribute(\"data-ub-drawer-n\"), 10);\n        const open = is4 && u.drawers && u.drawers[i];\n        b.disabled = !is4;\n        b.classList.toggle(\"is-active\", !!open);\n        b.setAttribute(\"aria-pressed\", open ? \"true\" : \"false\");\n        b.textContent = (DRW4.names[i] || \"Drawer\") + (open ? \" \\u2013 open\" : \"\");\n      }\n      const dall = E.drawersAll;\n      if (dall) {\n        dall.disabled = !is4;\n        dall.textContent = is4 && u.drawers && u.drawers.every(function(v) {\n          return v;\n        }) ? \"Close all drawers\" : \"Open all drawers\";\n      }\n      if (E.frontH) E.frontH.textContent = is4 ? \"Front heights \" + drawer4Parts(u).map(function(g2, i) {\n        return Array.isArray(u.dOut) && u.dOut.indexOf(i) >= 0 ? \"open slot\" : Math.round(g2.frontH);\n      }).join(\" / \") + \" mm\" : \"\";\n      show(E.drawerOpenRow, !(is4 || isle || isTall(u)));\n      const db = E.drawerOpen;\n      if (db) {\n        db.disabled = !isDrw;\n        db.classList.toggle(\"is-active\", isDrw && u.drawerOpen);\n        db.textContent = isDrw && u.drawerOpen ? \"Close drawer\" : \"Open drawer\";\n      }\n      show(E.doorRow, !(is4 || isle));\n      if (E.frontStyle) syncStyleSelect(E.frontStyle, u.frontStyle);\n      show(E.shakerRow, u.frontStyle === \"shaker\");\n      for (const field of E.shakerFields) {\n        const key = field.getAttribute(\"data-ub-shaker\");\n        const defaults = { panels: 1, frame: 80, depth: 6 };\n        if (!focused(field)) field.value = String((_a = (u.shaker || {})[key]) != null ? _a : defaults[key]);\n      }\n      const doorBtn = E.door;\n      if (doorBtn) {\n        const chosen = !!scene.selectedId && (scene.units || []).some((v) => v.id === scene.selectedId);\n        const isOven = u && u.type === \"base-oven\";\n        const can = chosen && !is4 && !isle && !isOven, on2 = can && !!u.door;\n        doorBtn.disabled = !can;\n        doorBtn.classList.toggle(\"is-active\", on2);\n        doorBtn.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n        const nm = chosen ? displayName(scene.units, u) : \"\";\n        const t = !chosen ? \"Doors: select a cabinet first\" : is4 ? \"Doors: \" + nm + \" is a drawer bank - it has no door\" : isle ? \"Doors: an island\\u2019s doors belong to its sections\" : isOven ? \"Doors: \" + nm + \" is an oven + hob base - its front is the panel below the oven\" : \"Doors on \" + nm + \": \" + (u.door ? \"on - press to take them off\" : \"off - press to add \" + (isCnr ? \"its doors\" : \"a door\"));\n        if (doorBtn.getAttribute(\"aria-description\") !== t) doorBtn.setAttribute(\"aria-description\", t);\n      }\n      const canOpen = !is4 && !isTall(u);\n      const hingeOK = !is4 && !isCnr;\n      show(E.hingeRow, hingeOK);\n      show(E.hinge, hingeOK);\n      const hz = E.hingeZoom;\n      if (hz) {\n        show(hz, hingeOK);\n        hz.disabled = !hingeOK || !u.door;\n        hz.classList.toggle(\"is-active\", scene.hingeZoom);\n        hz.textContent = scene.hingeZoom ? \"Whole kitchen\" : \"Hinge close-up\";\n      }\n      syncPartInfo();\n      const onRot = !scene.panMode;\n      const modeOn = {\n        rotate: onRot,\n        pan: !!scene.panMode,\n        size: !!scene.sizeMode,\n        parts: !!scene.partsMode,\n        move: !!scene.moveMode\n      };\n      for (const [m, b] of E.modes) if (b) {\n        pressed(b, modeOn[m]);\n        const grp = m === \"rotate\" || m === \"pan\" ? \"camera\" : \"action\";\n        if (b.getAttribute(\"data-ub-modegroup\") !== grp) b.setAttribute(\"data-ub-modegroup\", grp);\n      }\n      for (const [b, label] of [\n        [E.turnL, \"Turn \" + displayName(scene.units, u) + \" left 90 degrees\"],\n        [E.turnR, \"Turn \" + displayName(scene.units, u) + \" right 90 degrees\"]\n      ]) {\n        if (!b) continue;\n        b.disabled = !u;\n        if (b.getAttribute(\"aria-description\") !== label) b.setAttribute(\"aria-description\", label);\n        b.classList.toggle(\"is-warn\", wallOffWall(u));\n      }\n      const camHint = scene.panMode ? \"drag the background to slide the kitchen\" : \"drag the background to turn the kitchen\";\n      if (E.modeHint) E.modeHint.textContent = scene.sizeMode ? \"Pull an orange arrow, or click a size to type it. Click a shelf or panel to select it; \" + camHint + \".\" : scene.moveMode ? \"Drag a cabinet to move it. It stops when it meets another and snaps flush; \" + camHint + \".\" : scene.panMode ? \"Drag to slide the whole kitchen across the screen.\" : \"Drag anywhere to turn the kitchen around.\";\n      if (E.moveL) E.moveL.disabled = !rowNeighbour(scene.units, u, -1);\n      if (E.moveR) E.moveR.disabled = !rowNeighbour(scene.units, u, 1);\n      const sn = E.snap;\n      if (sn) {\n        sn.classList.toggle(\"is-active\", scene.snap);\n        sn.textContent = scene.snap ? \"Snap to neighbours: on\" : \"Snap to neighbours: off\";\n      }\n      const fs2 = E.frontSee;\n      if (fs2) {\n        const on2 = !!scene.frontsSeeThrough;\n        fs2.classList.toggle(\"is-active\", on2);\n        fs2.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n        fs2.textContent = on2 ? \"Transparent fronts: on\" : \"Transparent fronts: off\";\n      }\n      const ad = E.allDims;\n      if (ad) {\n        const on2 = !!scene.allDims;\n        ad.classList.toggle(\"is-active\", on2);\n        ad.setAttribute(\"aria-pressed\", on2 ? \"true\" : \"false\");\n        ad.textContent = on2 ? \"All dimensions: on\" : \"All dimensions: off\";\n      }\n      const av = E.alignView;\n      if (av) {\n        av.classList.toggle(\"is-active\", scene.alignView);\n        av.setAttribute(\"aria-pressed\", scene.alignView ? \"true\" : \"false\");\n        av.textContent = scene.alignView ? \"Alignment view: on\" : \"Alignment view: off\";\n      }\n      if (E.doorHint) E.doorHint.style.display = canOpen && !u.door ? \"\" : \"none\";\n      if (E.selLabel) E.selLabel.textContent = displayName(scene.units, u) + \" \\xB7 \" + unitLabel(u);\n      if (E.hood) {\n        const ov = !!u && u.type === \"base-oven\";\n        if (ov) E.hood.removeAttribute(\"hidden\");\n        else E.hood.setAttribute(\"hidden\", \"\");\n        E.hood.setAttribute(\"aria-pressed\", ov && u.hood ? \"true\" : \"false\");\n        E.hood.textContent = ov && u.hood ? \"Remove hood\" : \"Add hood\";\n      }\n    }\n    const act = (name2, args, what) => ctx.act(name2, args, what);\n    const ONLY_CONTROLS = { out: false, render: false }, NO_OUT = { out: false };\n    const on = (el, type, fn) => {\n      if (el) el.addEventListener(type, fn);\n    };\n    const attr = (el, name2) => el.getAttribute(name2);\n    const int2 = (el, name2) => parseInt(el.getAttribute(name2), 10);\n    const onCommit = (el, fn) => {\n      el.addEventListener(\"change\", fn);\n      el.addEventListener(\"blur\", fn);\n    };\n    for (const k of [\"w\", \"w2\", \"h\", \"d\"]) {\n      const sl = dims[k].sl, nu = dims[k].nu;\n      on(sl, \"input\", function() {\n        act(\"unit.dim\", { k, raw: sl.value });\n      });\n      if (nu) {\n        onCommit(nu, function() {\n          act(\"unit.dim\", { k, raw: nu.value });\n        });\n        nu.addEventListener(\"keydown\", function(e) {\n          if (e.key === \"Enter\") {\n            e.preventDefault();\n            act(\"unit.dim\", { k, raw: nu.value });\n            nu.blur();\n          }\n        });\n      }\n    }\n    for (const b of E.kfinish) on(b, \"click\", function() {\n      const val = attr(b, \"data-ub-kval\");\n      if (!okFinish(val)) return;\n      act(\"kitchen.finish\", { which: attr(b, \"data-ub-kfinish\"), val });\n    });\n    for (const b of qa(\"[data-ub-roomon]\")) on(b, \"click\", function() {\n      act(\"room.show\", {});\n    });\n    for (const inp of E.roomdim) onCommit(inp, function() {\n      act(\"room.dim\", { k: attr(inp, \"data-ub-roomdim\"), raw: inp.value });\n    });\n    for (const tier of [\"base\", \"wall\"]) on(E.runLinks[tier], \"click\", function() {\n      act(\"run.link\", { tier }, ONLY_CONTROLS);\n    });\n    for (const inp of rundims)\n      onCommit(inp, function() {\n        act(\"run.dim\", { key: attr(inp, \"data-ub-rundim\"), tier: attr(inp, \"data-ub-runtier\"), raw: inp.value });\n      });\n    for (const b of E.end) on(b, \"click\", function() {\n      act(\"finishing.end\", { side: attr(b, \"data-ub-end\") });\n    });\n    for (const b of E.enddrop) on(b, \"click\", function() {\n      act(\"finishing.endDrop\", { drop: attr(b, \"data-ub-enddrop\") === \"1\" });\n    });\n    for (const inp of E.scribe) onCommit(inp, function() {\n      act(\"finishing.scribe\", { side: attr(inp, \"data-ub-scribe\"), raw: inp.value });\n    });\n    on(E.shelfAdd, \"click\", function() {\n      act(\"shelf.add\", {});\n    });\n    on(E.shelfDel, \"click\", function() {\n      act(\"shelf.remove\", {});\n    });\n    const mm = E.shelfMm;\n    if (mm) {\n      mm.addEventListener(\"focus\", function() {\n        st.shelfFocus = true;\n        mm.dataset.ubStart = mm.value;\n      });\n      mm.addEventListener(\"blur\", function() {\n        st.shelfFocus = false;\n        syncPartInfo();\n      });\n      mm.addEventListener(\"keydown\", function(e) {\n        if (!e) return;\n        if (e.key === \"Enter\") {\n          if (e.preventDefault) e.preventDefault();\n          const raw = mm.value, was = st.shelfFocus;\n          st.shelfFocus = false;\n          const r = act(\"shelf.height\", { raw });\n          if (!r || !r.ok) {\n            st.shelfFocus = was;\n            mm.value = raw;\n          }\n        } else if (e.key === \"Escape\") {\n          if (e.preventDefault) e.preventDefault();\n          mm.value = mm.dataset && mm.dataset.ubStart || mm.value;\n          st.shelfFocus = false;\n          syncPartInfo();\n          ctx.view.requestRender();\n        }\n      });\n    }\n    on(E.undo, \"click\", function() {\n      act(\"history.undo\", {});\n    });\n    on(E.redo, \"click\", function() {\n      act(\"history.redo\", {});\n    });\n    for (const b of E.intshelf) on(b, \"click\", function() {\n      act(\"interior.shelves\", { step: int2(b, \"data-ub-intshelf\") });\n    });\n    for (const b of qa(\"[data-ub-intdivadd]\")) on(b, \"click\", function() {\n      act(\"interior.vdiv.add\", {});\n    });\n    for (const b of qa(\"[data-ub-inthadd]\")) on(b, \"click\", function() {\n      act(\"interior.hdiv.add\", {});\n    });\n    for (const b of qa(\"[data-ub-inthdel]\")) on(b, \"click\", function() {\n      act(\"interior.hdiv.remove\", {});\n    });\n    for (const b of qa(\"[data-ub-intdivdel]\")) on(b, \"click\", function() {\n      act(\"interior.vdiv.remove\", {});\n    });\n    for (const inp of E.inthpos) onCommit(inp, function() {\n      act(\"interior.hdiv.pos\", { i: int2(inp, \"data-ub-inthpos\"), raw: inp.value });\n    });\n    for (const inp of E.intdivpos) onCommit(inp, function() {\n      act(\"interior.vdiv.pos\", { i: int2(inp, \"data-ub-intdivpos\"), raw: inp.value });\n    });\n    for (const b of qa(\"[data-ub-intsee]\")) on(b, \"click\", function() {\n      act(\"interior.see\", {});\n    });\n    for (const b of E.tallh) on(b, \"click\", function() {\n      act(\"tall.height\", { h: int2(b, \"data-ub-tallh\") });\n    });\n    for (const b of E.shelfstep) on(b, \"click\", function() {\n      act(\"tall.shelves\", { step: int2(b, \"data-ub-shelfstep\") });\n    });\n    for (const b of E.leafopen) on(b, \"click\", function() {\n      act(\"tall.leaf\", { i: int2(b, \"data-ub-leafopen\") });\n    });\n    for (const b of E.seccount) on(b, \"click\", function() {\n      act(\"island.sections\", { n: int2(b, \"data-ub-seccount\") });\n    });\n    for (const b of qa(\"[data-ub-ispreset]\")) on(b, \"click\", function() {\n      act(\"island.preset\", { id: attr(b, \"data-ub-ispreset\") });\n    });\n    for (const inp of E.secw) onCommit(inp, function() {\n      act(\"island.sectionWidth\", { i: int2(inp, \"data-ub-secw\"), raw: inp.value });\n    });\n    for (const b of E.bayopen) on(b, \"click\", function() {\n      act(\"island.bayOpen\", { i: int2(b, \"data-ub-bayopen\") });\n    });\n    for (const b of E.drawerN) on(b, \"click\", function() {\n      act(\"drawer.toggle\", { i: int2(b, \"data-ub-drawer-n\") });\n    });\n    on(E.drawersAll, \"click\", function() {\n      act(\"drawer.all\", {});\n    });\n    on(q(\"[data-ub-hood]\"), \"click\", function() {\n      act(\"unit.hood\", {});\n    });\n    on(q(\"[data-ub-duplicate]\"), \"click\", function() {\n      act(\"unit.duplicate\", {});\n    });\n    on(q(\"[data-ub-remove]\"), \"click\", function() {\n      act(\"unit.remove\", {});\n    });\n    on(q(\"[data-ub-fit]\"), \"click\", function() {\n      act(\"view.fit\", {}, NO_OUT);\n    });\n    on(E.zo, \"click\", function() {\n      act(\"view.zoom\", { dir: \"out\" }, NO_OUT);\n    });\n    on(E.zi, \"click\", function() {\n      act(\"view.zoom\", { dir: \"in\" }, NO_OUT);\n    });\n    for (const b of qa(\"[data-ub-rot]\")) on(b, \"click\", function(e) {\n      act(\"view.rotate\", { dir: attr(b, \"data-ub-rot\") }, NO_OUT);\n      const r = b.getBoundingClientRect ? b.getBoundingClientRect() : null;\n      const p = e && e.detail > 0 && (e.clientX || e.clientY) ? { x: e.clientX, y: e.clientY } : r ? { x: r.left + r.width / 2, y: r.top + r.height / 2 } : null;\n      if (p) act(\"view.menuAt\", p, NO_OUT);\n    });\n    for (const [sel, m] of [\n      [\"[data-ub-mode-rotate]\", \"rotate\"],\n      [\"[data-ub-mode-parts]\", \"parts\"],\n      [\"[data-ub-mode-pan]\", \"pan\"],\n      [\"[data-ub-mode-size]\", \"size\"],\n      [\"[data-ub-mode-move]\", \"cabinet\"]\n    ])\n      on(q(sel), \"click\", function() {\n        act(\"view.mode\", { mode: m });\n      });\n    on(E.moveL, \"click\", function() {\n      act(\"unit.reorder\", { dir: -1 });\n    });\n    on(E.moveR, \"click\", function() {\n      act(\"unit.reorder\", { dir: 1 });\n    });\n    on(E.snap, \"click\", function() {\n      act(\"view.snap\", {}, ONLY_CONTROLS);\n    });\n    on(E.alignView, \"click\", function() {\n      act(\"view.alignView\", {});\n    });\n    on(E.frontSee, \"click\", function() {\n      act(\"view.frontsSeeThrough\", {});\n    });\n    on(E.allDims, \"click\", function() {\n      act(\"view.allDims\", {});\n    });\n    for (const b of E.envBtns || []) on(b, \"click\", function() {\n      act(\"view.environment\", { name: b.getAttribute(\"data-ub-env\") });\n    });\n    for (const b of E.gfxBtns || []) on(b, \"click\", function() {\n      act(\"view.graphics\", { name: b.getAttribute(\"data-ub-gfx\") });\n    });\n    on(E.door, \"click\", function() {\n      act(\"unit.door\", {});\n    });\n    if (E.frontStyle) on(E.frontStyle, \"change\", () => act(\"unit.frontStyle\", { frontStyle: E.frontStyle.value }));\n    for (const field of E.shakerFields) on(field, \"change\", () => {\n      const key = field.getAttribute(\"data-ub-shaker\");\n      const value = Number(field.value);\n      const result = act(\"unit.frontStyle\", { shaker: { [key]: value } });\n      if (result && result.ok === false) field.blur();\n    });\n    on(E.drawerOpen, \"click\", function() {\n      act(\"unit.drawerOpen\", {});\n    });\n    on(E.hingeZoom, \"click\", function() {\n      act(\"view.hingeZoom\", {}, { out: false });\n    });\n    function applyExplode(raw) {\n      const pct = Math.max(0, Math.min(100, Math.round(parseFloat(raw)) || 0));\n      if (E.explodeVal) E.explodeVal.textContent = exText(pct);\n      if (E.explode) {\n        if (E.explode.value !== String(pct)) E.explode.value = String(pct);\n        E.explode.setAttribute(\"aria-valuetext\", exText(pct));\n      }\n      act(\"view.explode\", { pct }, { controls: false });\n    }\n    if (E.explode) {\n      E.explode.addEventListener(\"input\", function() {\n        applyExplode(E.explode.value);\n      });\n      E.explode.addEventListener(\"change\", function() {\n        applyExplode(E.explode.value);\n      });\n    }\n    on(E.hinge, \"click\", function() {\n      act(\"view.hinge\", {}, { controls: false });\n      E.hinge.classList.toggle(\"is-active\", !!ctx.scene().hinge);\n    });\n    on(E.save, \"click\", function() {\n      act(\"plan.save\", {}, ONLY_CONTROLS);\n    });\n    on(E.restore, \"click\", function() {\n      act(\"plan.restore\", {});\n    });\n    function freshPlan() {\n      act(\"plan.reset\", {});\n      if (E.explode) {\n        E.explode.value = \"0\";\n        E.explode.setAttribute(\"aria-valuetext\", \"Assembled\");\n      }\n      if (E.explodeVal) E.explodeVal.textContent = \"Assembled\";\n      if (E.hinge) E.hinge.classList.remove(\"is-active\");\n    }\n    on(q(\"[data-ub-reset]\"), \"click\", freshPlan);\n    on(q(\"[data-ub-newplan]\"), \"click\", function() {\n      freshPlan();\n      let kept = 0;\n      try {\n        kept = ctx.recovery && ctx.recovery.others ? ctx.recovery.others().length : 0;\n      } catch {\n        kept = 0;\n      }\n      if (ctx.cue) ctx.cue(kept ? \"New plan started - your previous plan is kept in this browser: \\xABYour previous plan\\xBB opens it again\" : \"New plan started\");\n    });\n    for (const b of E.gapdir) on(b, \"click\", function() {\n      if (E.gapDirs) E.gapDirs.setAttribute(\"data-ub-gappick\", attr(b, \"data-ub-gapdir\"));\n      syncGapUI();\n      ctx.view.requestRender();\n    });\n    for (const b of E.gapfill) on(b, \"click\", function() {\n      act(\"gap.fill\", { mode: attr(b, \"data-ub-gapfill\"), dir: gapDir() });\n    });\n    on(E.gapUndo, \"click\", function() {\n      act(\"gap.undo\", {});\n    });\n    return {\n      /* old syncControls, plus the undo/redo and save buttons (their old syncs ran\n         from the history and save paths; here every change lands in one sync) */\n      sync() {\n        syncControls();\n        syncUndoUI();\n        syncSaveUI();\n      },\n      syncPartInfo,\n      syncGapUI,\n      syncZoomButtons\n    };\n  }\n\n  // v2/src/ui/wand.js\n  var WAND_SVG = '<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 20 15 9\"/><path d=\"m14 5 1-2 1 2 2 1-2 1-1 2-1-2-2-1z\"/><path d=\"M19 12l.6 1.4L21 14l-1.4.6L19 16l-.6-1.4L17 14l1.4-.6z\"/></svg>';\n  function createWand(ctx) {\n    const root = ctx.root, doc2 = ctx.doc;\n    const head = root && root.querySelector && root.querySelector(\".ub-lab__panelhead\");\n    if (!head || !doc2) return { sync() {\n    } };\n    const box3 = doc2.createElement(\"div\");\n    box3.className = \"ub-lab__wand\";\n    box3.setAttribute(\"data-ub-wandbox\", \"\");\n    box3.innerHTML = '<div class=\"ub-lab__wandrow\"><button type=\"button\" class=\"ub-lab__btn ub-lab__wandbtn\" data-ub-wand aria-expanded=\"false\">' + WAND_SVG + '<span>Magic wand</span></button><span class=\"ub-lab__score\" data-ub-score></span></div><div class=\"ub-lab__wandlist\" data-ub-wandlist hidden><p class=\"ub-lab__scorehint\" data-ub-scorehint></p><p class=\"ub-lab__wandnote\">Whole kitchens for your room - pick one (Undo brings your plan back):</p><div class=\"ub-lab__wandopts\" data-ub-wandopts></div><button type=\"button\" class=\"ub-lab__btn\" data-ub-wandmore>Other kitchens</button></div>';\n    const units = root.querySelector(\".ub-lab__sec--units\");\n    if (units && units.parentNode) units.parentNode.insertBefore(box3, units.nextSibling);\n    else head.appendChild(box3);\n    const q = (s) => box3.querySelector(s);\n    const btn = q(\"[data-ub-wand]\"), list = q(\"[data-ub-wandlist]\"), opts = q(\"[data-ub-wandopts]\");\n    const scoreEl = q(\"[data-ub-score]\"), hintEl = q(\"[data-ub-scorehint]\");\n    let seed = 1, lastScore = null;\n    function show2(v) {\n      opts.textContent = \"\";\n      if (!v || !v.ok) {\n        const p = doc2.createElement(\"p\");\n        p.className = \"ub-lab__wandnote\";\n        p.textContent = \"Your room is too small for a whole kitchen - make it at least 1800 mm wide in Room.\";\n        opts.appendChild(p);\n        return;\n      }\n      v.variants.forEach((x) => {\n        const b = doc2.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-lab__btn ub-lab__wandopt\";\n        b.setAttribute(\"data-ub-wandpick\", String(x.index));\n        b.innerHTML = \"<b></b><span></span>\";\n        b.querySelector(\"b\").textContent = x.name;\n        b.querySelector(\"span\").textContent = x.cabinets + \" cabinets \\xB7 score \" + x.score;\n        b.addEventListener(\"click\", () => {\n          const r = ctx.act(\"wand.apply\", { index: x.index });\n          if (r && r.ok) close();\n        });\n        opts.appendChild(b);\n      });\n    }\n    function open() {\n      show2(ctx.act(\"wand.variants\", { seed }, { controls: false, render: false, out: false }));\n      list.hidden = false;\n      btn.setAttribute(\"aria-expanded\", \"true\");\n    }\n    function close() {\n      list.hidden = true;\n      btn.setAttribute(\"aria-expanded\", \"false\");\n    }\n    btn.addEventListener(\"click\", () => {\n      if (list.hidden) open();\n      else close();\n    });\n    q(\"[data-ub-wandmore]\").addEventListener(\"click\", () => {\n      seed += 1;\n      open();\n    });\n    function sync() {\n      var _a;\n      const native = !!(ctx.scene && ((_a = ctx.scene()) == null ? void 0 : _a.workshop));\n      box3.hidden = native;\n      if (native) {\n        scoreEl.textContent = \"\";\n        hintEl.textContent = \"\";\n        delete root.__ubScore;\n        return;\n      }\n      let s = null;\n      try {\n        s = ctx.commands && typeof ctx.commands.run === \"function\" ? ctx.commands.run(\"kitchen.score\") : null;\n      } catch {\n        s = null;\n      }\n      if (!s || !s.ok) {\n        scoreEl.textContent = \"\";\n        hintEl.textContent = \"\";\n        return;\n      }\n      const fails = Array.isArray(s.checks) ? s.checks.filter((c) => c.status === \"fail\") : [];\n      const cov = s.coverage ? \" \\xB7 \" + s.coverage.words : \"\";\n      scoreEl.textContent = s.scored === false ? \"No score yet\" : fails.length ? \"Kitchen score \" + s.total + cov + \" \\xB7 fix \" + fails.length + \" first\" : \"Kitchen score \" + s.total + cov;\n      scoreEl.setAttribute(\"data-ub-score-blocked\", fails.length ? \"true\" : \"false\");\n      scoreEl.setAttribute(\"data-ub-score-value\", String(s.total));\n      if (lastScore != null && s.total !== lastScore) {\n        const d = s.total - lastScore;\n        scoreEl.setAttribute(\"data-ub-score-delta\", (d > 0 ? \"+\" : \"\") + d);\n      } else scoreEl.removeAttribute(\"data-ub-score-delta\");\n      lastScore = s.total;\n      hintEl.textContent = fails.length ? \"To raise it: fix first - \" + fails.map((x) => x.detail).join(\"; \") + \". \" + (s.hint || \"\") : s.hint ? \"To raise it: \" + s.hint : \"Nothing to improve among the things measured - the sink, dishwasher, washing machine and door swings are not checked.\";\n      scoreEl.setAttribute(\"title\", \"Kitchen score \" + s.total + \" of 100 for how the kitchen works\" + (s.coverage ? \" (\" + s.coverage.words + \")\" : \"\") + \" - placement of the hob, hood and fridge, walkways, tidy runs, storage (price and finish never count; the sink, dishwasher and washing machine are not placed by the planner, so not scored). \" + hintEl.textContent);\n      root.__ubScore = s;\n    }\n    sync();\n    return { sync, open, close };\n  }\n\n  // v2/src/ui/decor-tape.js\n  var API = \"https://chat.uniboards.co.uk/api/cabinet-lab/decors-without-tape\";\n  var S = { hidden: /* @__PURE__ */ new Set(), asked: null, listeners: [] };\n  var keyOf = (code, tex) => String(code || \"\").toUpperCase() + \" \" + String(tex || \"\").toUpperCase();\n  function decorWithoutTape(d) {\n    return !!d && S.hidden.has(keyOf(d.code, d.tex));\n  }\n  function onDecorTape(fn) {\n    S.listeners.push(fn);\n  }\n  function loadDecorTape(win2, url) {\n    if (S.asked) return S.asked;\n    const f = win2 && typeof win2.fetch === \"function\" ? win2.fetch.bind(win2) : null;\n    if (!f) return S.asked = Promise.resolve(S.hidden);\n    S.asked = f(url || API, { credentials: \"omit\" }).then((r) => r && r.ok ? r.json() : null).then((j) => {\n      if (j && j.ok && Array.isArray(j.decors)) {\n        S.hidden = new Set(j.decors.map((x) => keyOf(x.code, x.texture)));\n        for (const fn of S.listeners) {\n          try {\n            fn();\n          } catch {\n          }\n        }\n      }\n      return S.hidden;\n    }, () => S.hidden);\n    return S.asked;\n  }\n\n  // v2/src/ui/chef-consult.js\n  var NEG = /\\b(don'?t|do not|dont|never|without|no)\\b[^.?!]{0,40}\\b(change|changing|touch|touching|modify|modifying|alter|altering|replace|replacing|apply|applying|edit|editing|redesign|add|adding|remove|removing|delete|deleting|move|moving|put|putting|install|installing|swap|swapping)\\b/;\n  var ADVICE = /\\b(consult(ation|ing)?|advice|advise|adviser|just (asking|ideas|thoughts|curious)|only (advice|ideas)|ideas only|what (do|would|should) you (think|suggest|recommend)|what('?s| is) (best|better|the difference)|should i|would you|is it (ok|okay|better|worth)|can you (explain|tell me)|why|how (much|do|does|should|far|wide|high)|which is (best|better)|compare|pros and cons|recommend)\\b/;\n  var DESIGN = /(design|plan|make|build|create|generate|draw|lay ?out|surprise|suggest|show|give|offer|propose)\\b.*\\b(kitchen|layout|options?|ideas|designs?)\\b|magic wand|do it for me|whole kitchen|kitchen options|other kitchens|new kitchen/;\n  var LAYOUT_WORDS = [\n    [/\\bisland\\b/, \"island\"],\n    [/\\bu[- ]?shape|\\bu[- ]?kitchen|three walls/, \"U\"],\n    [/\\bgalley|two walls|parallel/, \"galley\"],\n    [/\\bl[- ]?shape|\\bcorner\\b|\\bl[- ]?kitchen/, \"L-left\"],\n    [/one wall|single wall|straight|\\bline(ar)?\\b/, \"line\"]\n  ];\n  function intentOf(text) {\n    const t = String(text || \"\").toLowerCase().replace(/[\u2019`]/g, \"'\").trim();\n    const noChange = NEG.test(t) || /\\b(consultation|advice) only\\b|\\bonly (consult|advice|advise)/.test(t);\n    const prefs = prefsOf(t);\n    const hit2 = LAYOUT_WORDS.find(([re]) => re.test(t));\n    const layout = hit2 ? hit2[1] : null;\n    if (!t) return { intent: \"none\", noChange, layout, prefs };\n    if (/^(hi|hello|hey)\\b[!. ]*$/.test(t)) return { intent: \"greet\", noChange, layout, prefs };\n    if (/^(undo|go back|take (that|it) back|cancel that|put it back)\\b/.test(t)) return { intent: \"undo\", noChange: false, layout, prefs };\n    if (/^redo\\b/.test(t)) return { intent: \"redo\", noChange: false, layout, prefs };\n    if (/(how good|score|rate (my|the|this) kitchen|how is my kitchen|what('?s| is) wrong with my kitchen|check my kitchen)/.test(t)) return { intent: \"score\", noChange: true, layout, prefs };\n    if (/^(just )?(suggest|show)( me)? (some )?options\\b|^(skip|just suggest)/.test(t)) return { intent: \"consult\", skip: true, noChange, layout, prefs };\n    const pics = /\\b(images?|pictures?|photos?|examples?|what (do|does) (it|they) look like)\\b/.test(t);\n    const alts = /\\b(alternatives?|options?|ideas|layouts?)\\b/.test(t);\n    if (noChange && alts && !pics) return { intent: \"consult\", noChange: true, layout, prefs };\n    if (pics) return { intent: \"pictures\", noChange: true, layout, prefs };\n    if (noChange) return { intent: \"advice\", noChange: true, layout, prefs };\n    if (DESIGN.test(t) && !/^(add|put|place|remove|delete)\\b/.test(t)) return { intent: \"consult\", noChange: false, layout, prefs };\n    if (/\\?\\s*$/.test(t) || ADVICE.test(t)) return { intent: \"advice\", noChange: true, layout, prefs };\n    return { intent: \"command\", noChange: false, layout, prefs };\n  }\n  function prefsOf(text) {\n    const t = String(text || \"\").toLowerCase();\n    const p = {};\n    const m = /\u00A3\\s?(\\d[\\d,]*(?:\\.\\d+)?)\\s*(k)?\\b|(\\d[\\d,]*)\\s*(k|thousand)?\\s*(pounds|gbp)\\b/.exec(t);\n    if (m) {\n      const n = Number(String(m[1] || m[3]).replace(/,/g, \"\")) * (m[2] || m[4] ? 1e3 : 1);\n      if (n > 0) p.budget = n;\n      p.budgetIncludes = [/appliance/.test(t) && \"appliances\", /fit(ting)?\\b|install/.test(t) && \"fitting\", /worktop/.test(t) && \"worktop\"].filter(Boolean);\n    }\n    if (/two cooks|2 cooks|both cook|we both|family|kids|children|entertain|several people|cook together/.test(t)) p.cooks = \"several\";\n    else if (/\\b(just me|only me|i live alone|single cook|one cook|by myself)\\b/.test(t)) p.cooks = \"one\";\n    if (/\\b(modern|contemporary|minimal|minimalist|sleek|handleless)\\b/.test(t)) p.look = \"modern\";\n    else if (/\\b(traditional|classic|cottage|country|farmhouse|period)\\b/.test(t)) p.look = \"traditional\";\n    if (/\\bshaker\\b/.test(t)) p.style = \"shaker\";\n    else if (/\\bj[- ]?pull\\b|handleless/.test(t)) p.style = \"jpull\";\n    else if (/\\b(flat|slab|plain)\\b/.test(t)) p.style = \"slab\";\n    if (/freestanding cooker|free[- ]standing cooker|range cooker|own cooker|separate cooker|no (built[- ]in )?(oven|hob|cooker)\\b|without (an? )?(oven|hob|cooker)\\b/.test(t)) p.hob = false;\n    else if (/\\b(built[- ]in oven|oven and hob|hob and oven|induction hob|a hob|an oven)\\b/.test(t)) p.hob = true;\n    if (/no (cooker )?(hood|extractor)\\b|without (a |an )?(cooker )?(hood|extractor)\\b|ceiling extractor|downdraft|extractor (is )?(elsewhere|already)/.test(t)) p.hood = false;\n    if (/clean|wipe|durable|hard[- ]wearing|easy to maintain/.test(t)) p.easyCare = true;\n    if (/drawer/.test(t)) p.drawers = true;\n    return p;\n  }\n  var SUGGEST = { label: \"Just suggest options\", skip: true };\n  var GUIDE_ORDER = { whole: [\"goal\", \"room\", \"cooking\"], finishes: [\"goal\", \"look\", \"finish\"], one: [\"goal\"] };\n  function nextQuestion(prefs, asked, facts2) {\n    const p = prefs || {}, a = asked || [], f = facts2 || {};\n    const goal = p.goal || \"whole\";\n    for (const id of GUIDE_ORDER[goal] || GUIDE_ORDER.whole) {\n      if (a.indexOf(id) >= 0) continue;\n      if (id === \"goal\" && !p.goal && f.units > 0) return {\n        id,\n        text: \"What shall we work on?\",\n        chips: [\n          { label: \"New layout options\", set: { goal: \"whole\" } },\n          { label: \"Doors & colour\", set: { goal: \"finishes\" } },\n          { label: \"Change one cabinet\", set: { goal: \"one\" } },\n          { label: \"Check my kitchen\", score: true }\n        ]\n      };\n      if (id === \"room\" && !p.roomOk && !f.roomSet) {\n        const r = f.room || {};\n        return {\n          id,\n          text: \"Let's start with your room - I'll open the room drawing tool for its walls, windows and doors.\",\n          chips: [\n            { label: \"Open the room tool\", tool: \"roomlayout\" },\n            ...r.width > 0 ? [{ label: \"Start with \" + r.width + \" x \" + r.depth + \" mm\", set: { roomOk: true } }] : [],\n            SUGGEST\n          ]\n        };\n      }\n      if (id === \"cooking\" && p.hob === void 0) return {\n        id,\n        text: \"Built-in oven and hob, or your own cooker?\",\n        chips: [{ label: \"Built-in oven + hob\", set: { hob: true } }, { label: \"My own cooker\", set: { hob: false } }, SUGGEST]\n      };\n      if (id === \"look\" && !p.look && !p.style) return {\n        id,\n        text: \"Which doors? (Our own door styles.)\",\n        pictures: true,\n        chips: [\n          { label: \"Flat\", set: { style: \"slab\", look: \"modern\" }, img: \"flat\" },\n          { label: \"Shaker\", set: { style: \"shaker\", look: \"traditional\" }, img: \"shaker\" },\n          { label: \"J-pull (handleless)\", set: { style: \"jpull\", look: \"modern\" }, img: \"jpull\" },\n          { label: \"Skip\", next: true }\n        ]\n      };\n      if (id === \"finish\" && !p.finish && (p.style || f.frontStyle || \"slab\") === \"slab\") return {\n        id,\n        text: \"And the colour?\",\n        chips: [{ label: \"White\", set: { finish: \"white\" } }, { label: \"Light grey\", set: { finish: \"light grey\" } }, { label: \"Oak\", set: { finish: \"oak\" } }, { label: \"Skip\", next: true }]\n      };\n    }\n    return null;\n  }\n  function answerSummary(prefs) {\n    const p = prefs || {}, out = [];\n    if (p.goal) out.push({ whole: \"Layout options\", finishes: \"Doors & colour\", one: \"One cabinet\" }[p.goal] || p.goal);\n    if (p.roomOk) out.push(\"Room as it is\");\n    if (p.cooks) out.push(p.cooks === \"several\" ? \"Two cooks\" : \"One cook\");\n    if (p.style) out.push({ slab: \"Flat doors\", shaker: \"Shaker doors\", jpull: \"J-pull doors\" }[p.style]);\n    if (p.hob === true) out.push(\"Oven + hob\");\n    else if (p.hob === false) out.push(\"Own cooker\");\n    if (p.finish) out.push(p.finish.replace(/^\\w/, (c) => c.toUpperCase()));\n    if (p.budget) out.push(\"Budget \\xA3\" + p.budget.toLocaleString(\"en-GB\"));\n    return out;\n  }\n  function factsOf(v) {\n    const units = v.units || [];\n    const base = units.filter((u) => u.family === \"base\" && u.type !== \"island\" && !/^tall/.test(u.type));\n    const worktop = base.reduce((s, u) => s + (u.type === \"corner-l\" ? (u.w || 0) + (u.w2 || u.w || 0) - (u.d || 560) : u.w || 0), 0);\n    const walls = units.filter((u) => u.family === \"wall\").length;\n    return {\n      cabinets: units.length,\n      worktop,\n      walls,\n      island: units.some((u) => u.type === \"island\"),\n      fridge: units.some((u) => u.type === \"tall-fridge\"),\n      pantry: units.some((u) => u.type === \"tall-pantry\"),\n      oven: units.some((u) => u.type === \"base-oven\"),\n      hood: units.some((u) => u.hood === true),\n      score: v.score ? v.score.total : v.scoreTotal || 0\n    };\n  }\n  function chooseOptions(variants, prefs) {\n    const p = prefs || {};\n    const list = (variants || []).map((v, i) => ({ v, i, f: factsOf(v) }));\n    if (!list.length) return [];\n    const rank = (o) => {\n      let r = o.f.score;\n      if (p.cooks === \"several\") r += (o.f.island ? 8 : 0) + (/^(U|island)$/.test(o.v.key) ? 6 : 0) + o.f.worktop / 1e3;\n      if (p.cooks === \"one\") r += /^(line|L-left|L-right)$/.test(o.v.key) ? 4 : 0;\n      if (p.budget && p.budget < 8e3) r -= o.f.cabinets * 0.6;\n      return r;\n    };\n    const picked = list.slice().sort((a, b) => rank(b) - rank(a)).slice(0, 3);\n    const most = Math.max(...picked.map((o) => o.f.worktop)), fewest = Math.min(...picked.map((o) => o.f.cabinets));\n    return picked.map((o) => {\n      const pros = [], cons = [];\n      if (o.f.worktop === most) pros.push(\"most worktop (\" + (o.f.worktop / 1e3).toFixed(1) + \" m)\");\n      if (o.f.cabinets === fewest) pros.push(\"fewest cabinets - the least board to cut\");\n      if (o.f.island) {\n        pros.push(\"an island: room for a second cook or stools\");\n        cons.push(\"needs a 1000 mm walkway all round\");\n      }\n      if (o.f.oven) pros.push(\"an oven + hob cabinet (drawn with Bosch planning models)\" + (o.f.hood ? \" under its hood\" : \"\") + \", worktop both sides\");\n      if (o.f.fridge) pros.push(\"fridge housing at the end of a run\");\n      if (!o.f.fridge) cons.push(\"no fridge housing - for a freestanding fridge elsewhere\");\n      if (o.f.walls < 3) cons.push(\"few wall cabinets (windows or doors in the way)\");\n      return { index: o.i, key: o.v.key, name: o.v.name, cabinets: o.f.cabinets, score: o.f.score, pros, cons };\n    });\n  }\n  function budgetWords(prefs) {\n    const p = prefs || {};\n    const parts = [\"This planner prices only the cut and edged Egger boards for the cabinets - you see that price in the panel after you apply a kitchen.\"];\n    parts.push(\"Appliances, worktops, sink and taps, fitting and delivery are not in it, and painted MDF fronts (Shaker, J-pull - supplied primed only) are quoted separately.\");\n    if (p.budget) parts.unshift(\"Your budget of \\xA3\" + Math.round(p.budget).toLocaleString(\"en-GB\") + (p.budgetIncludes && p.budgetIncludes.length ? \" (with \" + p.budgetIncludes.join(\", \") + \")\" : \"\") + \" noted - I will not guess what a whole kitchen costs.\");\n    return parts.join(\" \");\n  }\n  function adviceFor(text, score) {\n    const cards = rulesFor(text);\n    const t = String(text || \"\").toLowerCase();\n    const out = [];\n    if (/veneer|melamine|mfc|painted|mdf|material|finish|gloss|matt|durab|clean/.test(t)) {\n      out.push(\"Materials we make fronts from: Egger MFC (melamine-faced board, priced right here) or 18 mm MDF supplied with a water-based primer only, for you or your painter to finish - that one is quoted. Shaker and J-pull are routed from MDF, so they come as primed MDF. Veneer is not offered in this planner, so I will not compare its price.\");\n    }\n    if (/budget|cost|price|expensive|cheap|afford|\u00A3/.test(t)) out.push(budgetWords(prefsOf(text)));\n    if (/style|look|modern|traditional|shaker|flat|slab|j[- ]?pull|handle/.test(t)) {\n      out.push(\"Door styles here: Flat (plain, works in Egger MFC or painted MDF), Shaker (a framed recess, painted MDF) and J-pull (a finger pull in the door edge, no handles, painted MDF). Style, material and budget are separate choices - pick the look first, then I can show it on your kitchen with Apply.\");\n    }\n    for (const c of cards.slice(0, 3)) out.push(cite(c));\n    if (score && cards.length) {\n      const rel = score.parts.filter((p) => cards.some((c) => c.id === p.rule) && p.status === \"measured\").map((p) => p.said);\n      if (rel.length) out.push(\"In your plan now: \" + rel.join(\" \"));\n    }\n    if (!out.length) return null;\n    return out.join(\"\\n\") + \"\\n(Rules \" + RULES_VERSION + \", this planner's own - not yet reviewed by a kitchen designer. I have not changed your plan.)\";\n  }\n  function describeOps(ops) {\n    const say = {\n      add: (o) => \"add a \" + (o.type || \"base\").replace(/-/g, \" \") + \" cabinet\",\n      remove: () => \"remove the selected cabinet\",\n      finish: (o) => \"make the \" + (o.part === \"carcass\" ? \"carcasses\" : \"fronts\") + \" \" + String(o.value).replace(/-/g, \" \"),\n      room: (o) => \"set the room to \" + [o.width, o.depth].filter(Boolean).join(\" x \") + \" mm\",\n      select: (o) => \"select cabinet \" + o.index,\n      style: (o) => \"change every door to \" + ({ slab: \"Flat\", shaker: \"Shaker\", jpull: \"J-pull\" }[o.style] || o.style),\n      wand: (o) => \"replace your plan with a \" + (o.layout && o.layout !== \"auto\" ? o.layout : \"new\") + \" kitchen\",\n      apply: (o) => \"put in option \" + (o.index + 1)\n    };\n    return (ops || []).map((o) => say[o.op] ? say[o.op](o) : null).filter(Boolean).join(\", then \");\n  }\n\n  // v2/src/ui/front-thumbs.js\n  var FRONT_THUMBS = {\n    \"flat\": \"data:image/webp;base64,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\",\n    \"shaker\": \"data:image/webp;base64,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\",\n    \"jpull\": \"data:image/webp;base64,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\",\n    \"glass\": \"data:image/webp;base64,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\",\n    \"tall-1\": \"data:image/webp;base64,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\",\n    \"tall-2\": \"data:image/webp;base64,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\",\n    \"tall-4\": \"data:image/webp;base64,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\"\n  };\n\n  // v2/src/ui/chef-scene.js\n  var WALLS = { back: \"back wall\", left: \"left wall\", right: \"right wall\", front: \"front wall\" };\n  var ROT_WALL = { 0: \"back\", 1: \"right\", 2: \"front\", 3: \"left\" };\n  var ROW_NAME = { floor: \"floor cabinets\", wall: \"wall cabinets\", island: \"island\" };\n  var TYPE_WORDS = {\n    base: \"base cabinet\",\n    \"base-double\": \"double base cabinet\",\n    \"base-drawer\": \"base + top drawer\",\n    \"base-4drawer\": \"drawer bank\",\n    \"base-oven\": \"oven + hob cabinet\",\n    \"corner-l\": \"corner cabinet\",\n    \"corner-blind\": \"blind corner cabinet\",\n    \"corner-tall\": \"tall corner cabinet\",\n    \"corner-wall\": \"corner wall cabinet\",\n    wall: \"wall cabinet\",\n    \"tall-pantry\": \"tall pantry\",\n    \"tall-fridge\": \"fridge housing\",\n    \"tall-oven\": \"oven tower\",\n    island: \"island\"\n  };\n  var CATALOGUE_TYPES = [\n    \"base\",\n    \"base-double\",\n    \"base-drawer\",\n    \"base-4drawer\",\n    \"base-oven\",\n    \"corner-l\",\n    \"corner-blind\",\n    \"corner-tall\",\n    \"corner-wall\",\n    \"wall\",\n    \"tall-pantry\",\n    \"tall-fridge\",\n    \"tall-oven\",\n    \"island\"\n  ];\n  function islandPresets() {\n    return (ISLAND && ISLAND.presets || []).map((p) => ({ id: p.id, label: p.label, bays: p.bays.slice(), kinds: p.kinds.slice() }));\n  }\n  function typeWords(t) {\n    return TYPE_WORDS[t] || String(t || \"cabinet\").replace(/-/g, \" \");\n  }\n  function centre2(u) {\n    let bs = [];\n    try {\n      bs = footBoxes(u) || [];\n    } catch {\n      bs = [];\n    }\n    if (!bs.length) return { x: (u.x || 0) + (u.w || 0) / 2, z: (u.z || 0) + (u.d || 0) / 2 };\n    const x0 = Math.min(...bs.map((b) => b.x0)), x1 = Math.max(...bs.map((b) => b.x1)), z0 = Math.min(...bs.map((b) => b.z0)), z1 = Math.max(...bs.map((b) => b.z1));\n    return { x: (x0 + x1) / 2, z: (z0 + z1) / 2 };\n  }\n  function along(wall, c) {\n    return wall === \"back\" ? c.x : wall === \"front\" ? -c.x : wall === \"left\" ? -c.z : c.z;\n  }\n  function partsOf(u) {\n    let ps = [];\n    try {\n      ps = cabinetParts(u) || [];\n    } catch {\n      ps = [];\n    }\n    const doors = ps.filter((p) => p.kind === \"door\" && !/panel/i.test(p.name)).map((p) => ({ id: p.pid, name: p.name }));\n    const panels = ps.filter((p) => p.kind === \"door\" && /panel/i.test(p.name)).map((p) => ({ id: p.pid, name: p.name }));\n    if (isTall(u) && u.door && !doors.length) {\n      const n = Math.max(1, Number(doorLeaves(u)) || 1);\n      for (let i = 0; i < n; i++) doors.push({ id: u.id + \":door:Leaf \" + (i + 1), name: \"Leaf \" + (i + 1) });\n    }\n    const fronts = ps.filter((p) => p.kind === \"drawer-front\").map((p) => ({ id: p.pid, name: p.name }));\n    let boxes = [];\n    try {\n      boxes = drawerBoxes(u).map((b) => ({\n        i: b.i,\n        name: b.name,\n        top: Number(b.fy1) || 0,\n        frontH: Math.round((Number(b.fy1) || 0) - (Number(b.fy0) || 0)),\n        boxH: b.mm != null ? b.mm : Math.round(b.h || 0),\n        boxMax: b.maxMm != null ? b.maxMm : null\n      })).sort((a, b) => b.top - a.top);\n    } catch {\n      boxes = [];\n    }\n    return { doors, panels, fronts, boxes };\n  }\n  function inventory(scene) {\n    const units = scene && Array.isArray(scene.units) ? scene.units : [];\n    const room = scene && scene.room || {};\n    const cabs = units.map((u) => {\n      const island = u.type === \"island\";\n      const wall = island ? null : ROT_WALL[((u.rot || 0) % 4 + 4) % 4] || \"back\";\n      const row = island ? \"island\" : u.family === \"wall\" ? \"wall\" : \"floor\";\n      const c = centre2(u);\n      return { id: u.id, type: u.type, words: typeWords(u.type), wall, row, w: u.w, h: u.h, d: u.d, at: Math.round(along(wall || \"back\", c)), parts: partsOf(u) };\n    });\n    const groups = {};\n    for (const c of cabs) {\n      const k = (c.wall || \"island\") + \"/\" + c.row;\n      (groups[k] = groups[k] || []).push(c);\n    }\n    for (const k of Object.keys(groups)) {\n      groups[k].sort((a, b) => a.at - b.at);\n      groups[k].forEach((c, i, all) => {\n        c.fromLeft = i + 1;\n        c.fromRight = all.length - i;\n        c.of = all.length;\n      });\n    }\n    const sum = (f) => cabs.reduce((s, c) => s + f(c), 0);\n    return {\n      roomSet: !!room.on,\n      room: { width: room.width, depth: room.depth },\n      cabinets: cabs,\n      groups,\n      counts: {\n        cabinets: cabs.length,\n        doors: sum((c) => c.parts.doors.length),\n        drawerFronts: sum((c) => c.parts.fronts.length),\n        drawerBoxes: sum((c) => c.parts.boxes.length),\n        wallCabinets: cabs.filter((c) => c.row === \"wall\").length,\n        floorCabinets: cabs.filter((c) => c.row === \"floor\").length,\n        islands: cabs.filter((c) => c.row === \"island\").length\n      }\n    };\n  }\n  var ORD = {\n    first: 1,\n    \"1st\": 1,\n    one: 1,\n    second: 2,\n    \"2nd\": 2,\n    two: 2,\n    third: 3,\n    \"3rd\": 3,\n    three: 3,\n    fourth: 4,\n    \"4th\": 4,\n    four: 4,\n    fifth: 5,\n    \"5th\": 5,\n    five: 5,\n    sixth: 6,\n    \"6th\": 6,\n    six: 6,\n    seventh: 7,\n    \"7th\": 7,\n    seven: 7,\n    eighth: 8,\n    \"8th\": 8,\n    eight: 8\n  };\n  function parseTarget(text) {\n    const t = String(text || \"\").toLowerCase().replace(/\\b(top|bottom|first|second|third|fourth|fifth|last|\\d{1,2}(?:st|nd|rd|th))\\s+drawer\\b|\\bdrawer\\s+(?:number\\s+|no\\.?\\s*|#)?\\d{1,2}\\b/g, \" drawer \");\n    const m = /\\b(first|1st|one|second|2nd|two|third|3rd|three|fourth|4th|four|fifth|5th|five|sixth|6th|six|seventh|7th|seven|eighth|8th|eight|last|\\d{1,2}(?:st|nd|rd|th)?)\\b[^.?!]{0,30}?\\b(cabinet|unit|cupboard|one)?s?\\b[^.?!]{0,20}?\\bfrom the (left|right)\\b/.exec(t) || /\\b(cabinet|unit|cupboard) (?:number |no\\.? ?|#)?(\\d{1,2})\\b[^.?!]{0,20}?\\bfrom the (left|right)\\b/.exec(t);\n    const num6 = /\\bcabinet (?:number |no\\.? ?|#)(\\d{1,2})\\b/.exec(t);\n    let n = null, from = null;\n    if (m) {\n      const word = m[1] === \"cabinet\" || m[1] === \"unit\" || m[1] === \"cupboard\" ? m[2] : m[1];\n      from = m[3];\n      n = word === \"last\" ? -1 : ORD[word] || parseInt(word, 10) || null;\n    } else if (num6) {\n      n = parseInt(num6[1], 10);\n      from = \"left\";\n    }\n    if (!n) return null;\n    const wall = /\\bback wall\\b/.test(t) ? \"back\" : /\\bleft wall\\b/.test(t) ? \"left\" : /\\bright wall\\b/.test(t) ? \"right\" : /\\bfront wall\\b/.test(t) ? \"front\" : null;\n    const row = /\\b(wall|upper|top|high) (cabinet|unit|cupboard)s?\\b|\\buppers?\\b/.test(t) ? \"wall\" : /\\b(base|lower|floor|bottom) (cabinet|unit|cupboard)s?\\b/.test(t) ? \"floor\" : /\\bisland\\b/.test(t) ? \"island\" : null;\n    return { n, from: from || \"left\", wall, row };\n  }\n  function resolveTarget(inv, q) {\n    if (!q || !inv) return { none: \"I could not tell which cabinet you mean.\" };\n    const keys2 = Object.keys(inv.groups).filter((k) => {\n      const [w2, r2] = k.split(\"/\");\n      return (!q.wall || w2 === q.wall) && (!q.row || r2 === q.row) && (q.row === \"island\" || w2 !== \"island\");\n    });\n    if (!keys2.length) return { none: q.wall ? \"There are no \" + (q.row ? ROW_NAME[q.row] : \"cabinets\") + \" on the \" + WALLS[q.wall] + \".\" : \"There are no cabinets in the plan yet.\" };\n    if (keys2.length > 1) {\n      return { ask: {\n        text: \"Which run do you mean? (Counted \" + (q.n === -1 ? \"\" : \"the \" + ordinalWord(q.n) + \" \") + \"from the \" + q.from + \", facing the wall.)\",\n        choices: keys2.slice(0, 4).map((k) => {\n          const [w2, r2] = k.split(\"/\");\n          return { label: (w2 === \"island\" ? \"Island\" : cap(WALLS[w2])) + (w2 === \"island\" ? \"\" : \", \" + ROW_NAME[r2]) + \" (\" + inv.groups[k].length + \")\", set: { wall: w2 === \"island\" ? null : w2, row: r2 } };\n        })\n      } };\n    }\n    const g2 = inv.groups[keys2[0]], n = q.n === -1 ? 1 : q.n;\n    const u = q.from === \"right\" || q.n === -1 ? g2.find((c) => q.n === -1 ? c.fromRight === 1 : c.fromRight === n) : g2.find((c) => c.fromLeft === n);\n    const [w, r] = keys2[0].split(\"/\");\n    if (!u) return { none: \"There \" + (g2.length === 1 ? \"is only 1\" : \"are only \" + g2.length) + \" \" + (w === \"island\" ? \"island cabinet\" + (g2.length === 1 ? \"\" : \"s\") : ROW_NAME[r] + \" on the \" + WALLS[w]) + \".\" };\n    return { unit: u, where: w === \"island\" ? \"the island\" : \"the \" + WALLS[w] + \", \" + ROW_NAME[r] };\n  }\n  function ordinalWord(n) {\n    return n + (n % 10 === 1 && n !== 11 ? \"st\" : n % 10 === 2 && n !== 12 ? \"nd\" : n % 10 === 3 && n !== 13 ? \"rd\" : \"th\");\n  }\n  function cap(s) {\n    return s.charAt(0).toUpperCase() + s.slice(1);\n  }\n  function cabinetLine(c) {\n    const p = c.parts, bits = [];\n    if (p.doors.length) bits.push(p.doors.length + \" door\" + (p.doors.length === 1 ? \"\" : \"s\"));\n    if (p.fronts.length) bits.push(p.fronts.length + \" drawer front\" + (p.fronts.length === 1 ? \"\" : \"s\") + \" / \" + p.boxes.length + \" box\" + (p.boxes.length === 1 ? \"\" : \"es\"));\n    else if (p.boxes.length) bits.push(p.boxes.length + \" drawer box\" + (p.boxes.length === 1 ? \"\" : \"es\"));\n    return c.words + \", \" + Math.round(c.w || 0) + \" mm\" + (bits.length ? \" - \" + bits.join(\", \") : \"\");\n  }\n  function inventoryWords(inv) {\n    const k = inv.counts;\n    if (!k.cabinets) return inv.roomSet ? \"Your room is set up, with no cabinets yet.\" : \"The plan is empty - no room and no cabinets yet.\";\n    const runs = Object.keys(inv.groups).map((key) => {\n      const [w, r] = key.split(\"/\");\n      return (w === \"island\" ? \"island \" : WALLS[w] + \" \" + ROW_NAME[r] + \" \") + inv.groups[key].length;\n    });\n    return k.cabinets + \" cabinet\" + (k.cabinets === 1 ? \"\" : \"s\") + \" (\" + runs.join(\", \") + \"): \" + k.doors + \" door\" + (k.doors === 1 ? \"\" : \"s\") + \", \" + k.drawerFronts + \" drawer front\" + (k.drawerFronts === 1 ? \"\" : \"s\") + \" and \" + k.drawerBoxes + \" drawer box\" + (k.drawerBoxes === 1 ? \"\" : \"es\") + \".\";\n  }\n  var TOOLS2 = [\n    {\n      id: \"roomlayout\",\n      name: \"the room drawing tool (Set room layout)\",\n      control: \"[data-ub-roomlayout]\",\n      press: true,\n      says: /\\b(draw|sketch|outline|shape)\\b[^.?!]{0,30}\\broom\\b|\\broom (layout|shape|drawing|outline)\\b|\\bset room layout\\b|\\bdraw (the )?walls?\\b/\n    },\n    {\n      id: \"room\",\n      name: \"Room (size, walls, floor, windows and doors)\",\n      control: '[data-ub-fly=\"room\"]',\n      says: /\\b(room (size|tool|settings|dimensions?)|windows?|doors? (in|of) the room|room walls?|floor colou?r|wall colou?r)\\b/\n    },\n    { id: \"cabinets\", name: \"Cabinets (add a cabinet)\", control: '[data-ub-fly=\"cabinets\"]', says: /\\b(cabinet catalogue|add a cabinet|cabinets? (tool|list|catalogue)|catalogue)\\b/ },\n    { id: \"inside\", name: \"Shelves & dividers\", control: '[data-ub-fly=\"inside\"]', says: /\\b(shelves?|dividers?|inside|interior)\\b/ },\n    { id: \"fronts\", name: \"Doors (door styles and fronts)\", control: '[data-ub-fly=\"fronts\"]', says: /\\b(door (styles?|tool|types?)|fronts? tool|doors tool)\\b/ },\n    { id: \"drawers\", name: \"Drawers\", control: '[data-ub-fly=\"drawers\"]', says: /\\b(drawers? (tool|options)|drawer boxes)\\b/ },\n    { id: \"finishing\", name: \"End panels\", control: '[data-ub-fly=\"finishing\"]', says: /\\b(end panels?|scribe|filler)\\b/ },\n    { id: \"worktop\", name: \"Worktop\", control: '[data-ub-fly=\"worktop\"]', says: /\\bworktops?\\b|\\bcountertops?\\b/ },\n    { id: \"splash\", name: \"Splashback\", control: '[data-ub-fly=\"splash\"]', says: /\\bsplash ?backs?\\b|\\bupstands?\\b/ }\n  ];\n  var OPEN_VERB = /\\b(open|show me|show|go to|take me to|bring up|where is|i want to (?:use|open)|let me (?:use|open|see))\\b/g;\n  function toolFor(text) {\n    const t = String(text || \"\").toLowerCase();\n    for (const clause of t.split(/[.!?;\\n]+/)) {\n      if (TOOLS2[0].says.test(clause) && clause.length <= 80) return TOOLS2[0];\n      OPEN_VERB.lastIndex = 0;\n      let m;\n      while (m = OPEN_VERB.exec(clause)) {\n        const near2 = clause.slice(m.index + m[0].length, m.index + m[0].length + 32);\n        const hit2 = TOOLS2.slice(1).find((x) => x.says.test(near2));\n        if (hit2) return hit2;\n      }\n    }\n    return null;\n  }\n  function parseDrawer(text) {\n    const t = String(text || \"\").toLowerCase();\n    const m = /\\b(top|bottom|first|second|third|fourth|fifth|last|\\d{1,2}(?:st|nd|rd|th))\\s+drawer\\b/.exec(t) || /\\bdrawer\\s+(?:number\\s+|no\\.?\\s*|#)?(\\d{1,2})\\b/.exec(t);\n    if (!m) return null;\n    const w = m[1];\n    const n = { top: 1, first: 1, second: 2, third: 3, fourth: 4, fifth: 5 }[w] || (/^\\d{1,2}(st|nd|rd|th)?$/.test(w) ? parseInt(w, 10) : null);\n    return { n: w === \"bottom\" || w === \"last\" ? -1 : n, part: /\\bbox(es)?\\b/.test(t) ? \"box\" : \"front\" };\n  }\n  function drawerOf(cab, q) {\n    const list = cab && cab.parts && cab.parts.boxes || [];\n    if (!list.length) return { none: \"It has no drawers.\" };\n    const d = q.n === -1 ? list[list.length - 1] : list[q.n - 1];\n    if (!d) return { none: \"It has only \" + list.length + \" drawer\" + (list.length === 1 ? \"\" : \"s\") + \".\" };\n    return { drawer: d, pos: q.n === -1 ? list.length : q.n, of: list.length };\n  }\n\n  // v2/src/ui/chef-voice.js\n  var VOICE_API = \"https://chat.uniboards.co.uk/api/shop-account/voice\";\n  var MAX_MS = 6e4;\n  var SESSION_KEY2 = \"ub-cabinet-lab:session\";\n  var MIC_SVG = '<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\"/><path d=\"M5 11a7 7 0 0 0 14 0\"/><path d=\"M12 18v3\"/></svg>';\n  function sessionOf(win2) {\n    try {\n      const j = JSON.parse(win2.localStorage && win2.localStorage.getItem(SESSION_KEY2) || \"null\");\n      return j && j.session && (!j.exp || j.exp > Date.now()) ? j.session : null;\n    } catch {\n      return null;\n    }\n  }\n  function canRecord(win2) {\n    return !!(win2 && win2.navigator && win2.navigator.mediaDevices && typeof win2.navigator.mediaDevices.getUserMedia === \"function\" && typeof win2.MediaRecorder === \"function\");\n  }\n  function toBase64(win2, blob) {\n    return new Promise((res, rej) => {\n      try {\n        const r = new win2.FileReader();\n        r.onload = () => res(String(r.result || \"\").replace(/^data:[^,]*,/, \"\"));\n        r.onerror = () => rej(new Error(\"read\"));\n        r.readAsDataURL(blob);\n      } catch (e) {\n        rej(e);\n      }\n    });\n  }\n  function createVoice(o) {\n    const win2 = o.win, btn = o.button, statusEl = o.status;\n    const api = o.api || VOICE_API;\n    let st = \"idle\", rec = null, stream = null, chunks = [], timer = null, tick = null, started = 0, discard = false;\n    const doc2 = btn.ownerDocument;\n    let cancelBtn = null;\n    function showCancel(on) {\n      if (on && !cancelBtn && statusEl && doc2) {\n        cancelBtn = doc2.createElement(\"button\");\n        cancelBtn.type = \"button\";\n        cancelBtn.className = \"ub-chef__miccancel\";\n        cancelBtn.textContent = \"Cancel\";\n        cancelBtn.setAttribute(\"data-ub-chef-mic-cancel\", \"\");\n        cancelBtn.setAttribute(\"aria-label\", \"Cancel the recording - nothing is sent\");\n        cancelBtn.addEventListener(\"click\", (e) => {\n          e.preventDefault();\n          cancel();\n        });\n      }\n      if (cancelBtn && statusEl) {\n        if (on) {\n          if (cancelBtn.parentNode !== statusEl) statusEl.appendChild(cancelBtn);\n        } else if (cancelBtn.parentNode) cancelBtn.parentNode.removeChild(cancelBtn);\n      }\n    }\n    function set(s, words2) {\n      st = s;\n      btn.setAttribute(\"data-ub-mic-state\", s);\n      btn.setAttribute(\"aria-pressed\", s === \"recording\" ? \"true\" : \"false\");\n      btn.setAttribute(\"aria-label\", s === \"recording\" ? \"Stop recording\" : \"Speak to Chef\");\n      btn.disabled = s === \"asking\" || s === \"transcribing\";\n      if (statusEl) {\n        statusEl.textContent = words2 || \"\";\n        statusEl.hidden = !words2;\n      }\n      showCancel(s === \"recording\");\n    }\n    function release() {\n      if (timer) {\n        win2.clearTimeout(timer);\n        timer = null;\n      }\n      if (tick) {\n        win2.clearInterval(tick);\n        tick = null;\n      }\n      if (stream) {\n        try {\n          stream.getTracks().forEach((t) => t.stop());\n        } catch {\n        }\n        stream = null;\n      }\n    }\n    function signInWords() {\n      set(\"signin\", \"Voice needs you signed in to your Uniboards account (free) - or just type your message.\");\n      if (o.onSignIn) o.onSignIn(o.loginUrl);\n    }\n    async function send(blob, type) {\n      set(\"transcribing\", \"Turning your words into text\\u2026\");\n      const session = sessionOf(win2);\n      if (!session) {\n        signInWords();\n        return;\n      }\n      let r = null;\n      try {\n        const ext = /ogg/.test(type) ? \"ogg\" : /mp4|m4a|aac/.test(type) ? \"m4a\" : \"webm\";\n        const base64 = await toBase64(win2, blob);\n        const res = await win2.fetch(api, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          credentials: \"omit\",\n          body: JSON.stringify({ session, clip: { name: \"chef.\" + ext, base64 } })\n        });\n        const j = await res.json().catch(() => null);\n        r = { status: res.status, json: j };\n      } catch {\n        r = { status: 0, json: null };\n      }\n      if (r.status === 401) {\n        signInWords();\n        return;\n      }\n      if (r.status === 404 || r.status === 405) {\n        set(\"error\", \"Voice is not switched on here yet - please type your message.\");\n        return;\n      }\n      if (r.status === 429) {\n        const c = r.json && r.json.code;\n        set(\"error\", c === \"voice_busy\" ? \"One recording at a time - wait for the last one, or type.\" : c === \"voice_resting\" ? \"Voice is resting for today - please type your message.\" : \"Voice is resting for a while - please type your message.\");\n        return;\n      }\n      if (r.status === 413) {\n        set(\"error\", \"That recording is too long - say it in under a minute, or type it.\");\n        return;\n      }\n      if (r.status === 403) {\n        set(\"error\", \"Voice is not available on this page - please type your message.\");\n        return;\n      }\n      const text = r.json && r.json.ok && typeof r.json.text === \"string\" ? r.json.text.trim() : \"\";\n      if (!text) {\n        set(\"error\", r.json && r.json.error && (r.json.error.message || r.json.error) || \"I could not make out any words - try again, or type.\");\n        return;\n      }\n      o.onText(text);\n      set(\"idle\", \"Check the text, change anything, then press Send.\");\n    }\n    async function start2() {\n      if (!canRecord(win2)) {\n        set(\"error\", \"This browser cannot record here - please type your message.\");\n        return;\n      }\n      if (!sessionOf(win2)) {\n        signInWords();\n        return;\n      }\n      set(\"asking\", \"Allow the microphone to talk to Chef\\u2026\");\n      try {\n        stream = await win2.navigator.mediaDevices.getUserMedia({ audio: true });\n        if (cancelled) {\n          cancelled = false;\n          release();\n          set(\"idle\", \"Cancelled - nothing was sent.\");\n          return;\n        }\n      } catch (e) {\n        cancelled = false;\n        release();\n        const n = e && e.name;\n        set(\"error\", n === \"NotAllowedError\" || n === \"SecurityError\" ? \"The microphone is blocked - allow it in your browser's site settings, or type your message.\" : n === \"NotFoundError\" ? \"No microphone found - please type your message.\" : \"The microphone did not start - please type your message.\");\n        return;\n      }\n      chunks = [];\n      try {\n        try {\n          rec = new win2.MediaRecorder(stream, { audioBitsPerSecond: 64e3 });\n        } catch {\n          rec = new win2.MediaRecorder(stream);\n        }\n      } catch {\n        release();\n        set(\"error\", \"This browser cannot record here - please type your message.\");\n        return;\n      }\n      rec.ondataavailable = (e) => {\n        if (e && e.data && e.data.size) chunks.push(e.data);\n      };\n      rec.onstop = () => {\n        const type = rec && rec.mimeType || \"audio/webm\";\n        release();\n        if (discard) {\n          discard = false;\n          chunks = [];\n          set(\"idle\", \"Cancelled - nothing was sent.\");\n          return;\n        }\n        const blob = new win2.Blob(chunks, { type });\n        chunks = [];\n        if (!blob.size) {\n          set(\"error\", \"Nothing was recorded - try again, or type.\");\n          return;\n        }\n        send(blob, type);\n      };\n      rec.start();\n      started = Date.now();\n      set(\"recording\", \"Listening\\u2026 tap the microphone again when you have finished.\");\n      tick = win2.setInterval(() => {\n        if (st === \"recording\" && statusEl) {\n          statusEl.textContent = \"Listening\\u2026 \" + Math.round((Date.now() - started) / 1e3) + \" s - tap again to finish.\";\n          showCancel(true);\n        }\n      }, 1e3);\n      timer = win2.setTimeout(() => stop(), MAX_MS);\n    }\n    function stop() {\n      if (rec && st === \"recording\") {\n        try {\n          rec.stop();\n        } catch {\n          release();\n          set(\"idle\");\n        }\n      }\n    }\n    function cancel() {\n      if (st === \"recording\" && rec) {\n        discard = true;\n        try {\n          rec.stop();\n        } catch {\n          discard = false;\n          release();\n          chunks = [];\n          set(\"idle\", \"Cancelled - nothing was sent.\");\n        }\n        return true;\n      }\n      if (st === \"asking\") {\n        cancelled = true;\n        return true;\n      }\n      return false;\n    }\n    let cancelled = false;\n    function tap() {\n      if (st === \"recording\") stop();\n      else if (st !== \"asking\" && st !== \"transcribing\") start2();\n    }\n    btn.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      tap();\n    });\n    try {\n      win2.addEventListener(\"keydown\", (e) => {\n        if (e && e.key === \"Escape\" && (st === \"recording\" || st === \"asking\")) cancel();\n      }, true);\n      if (doc2) doc2.addEventListener(\"visibilitychange\", () => {\n        if (doc2.visibilityState === \"hidden\") cancel();\n      });\n    } catch {\n    }\n    set(\"idle\");\n    return { state: () => st, tap, stop, release, cancel };\n  }\n\n  // v2/src/ui/chef.js\n  var API2 = \"https://chat.uniboards.co.uk/api/cabinet-lab/chef\";\n  var VISITOR_KEY = \"ub-cabinet-lab:chef-visitor\";\n  var CHAT_KEY = \"ub-cabinet-lab:chef-chat\";\n  var FACE_SVG = '<svg class=\"ub-chef__face\" viewBox=\"0 0 64 64\" aria-hidden=\"true\" focusable=\"false\"><g><circle cx=\"21\" cy=\"15\" r=\"8\" fill=\"#fff\" stroke=\"#d9d5cc\"/><circle cx=\"32\" cy=\"11\" r=\"9.5\" fill=\"#fff\" stroke=\"#d9d5cc\"/><circle cx=\"43\" cy=\"15\" r=\"8\" fill=\"#fff\" stroke=\"#d9d5cc\"/><rect x=\"19\" y=\"15\" width=\"26\" height=\"8\" rx=\"2\" fill=\"#fff\" stroke=\"#d9d5cc\"/></g><rect x=\"12\" y=\"22\" width=\"40\" height=\"32\" rx=\"13\" fill=\"#2a2c31\"/><rect x=\"15\" y=\"25\" width=\"34\" height=\"26\" rx=\"10\" fill=\"#33363c\"/><rect class=\"eye\" x=\"22\" y=\"32\" width=\"6\" height=\"9\" rx=\"3\" fill=\"#ffd84d\"/><rect class=\"eye\" x=\"36\" y=\"32\" width=\"6\" height=\"9\" rx=\"3\" fill=\"#ffd84d\"/><path class=\"hap\" d=\"M21 38 q4 -6 8 0 M35 38 q4 -6 8 0\" stroke=\"#ffd84d\" stroke-width=\"2.6\" fill=\"none\" stroke-linecap=\"round\"/><path class=\"mouth\" d=\"M27 45 q5 4 10 0\" stroke=\"#ffd84d\" stroke-width=\"2.2\" fill=\"none\" stroke-linecap=\"round\"/><path class=\"sad\" d=\"M26 47 q6 -4 12 0\" stroke=\"#ffd84d\" stroke-width=\"2.2\" fill=\"none\" stroke-linecap=\"round\"/><g class=\"wav\" stroke=\"#f2c200\" stroke-width=\"2.2\" fill=\"none\" stroke-linecap=\"round\"><path d=\"M8 33 q-3 5 0 10\"/><path d=\"M56 33 q3 5 0 10\"/></g><g class=\"dots\" fill=\"#f2c200\"><circle cx=\"50\" cy=\"8\" r=\"2.4\"/><circle cx=\"56\" cy=\"5\" r=\"2.4\"/><circle cx=\"61\" cy=\"2\" r=\"2.4\"/></g><g class=\"tool\"><rect x=\"50\" y=\"40\" width=\"3.4\" height=\"17\" rx=\"1.5\" fill=\"#8a6a45\" transform=\"rotate(25 51 48)\"/><rect x=\"49\" y=\"35\" width=\"13\" height=\"7\" rx=\"2\" fill=\"#9aa0a6\" transform=\"rotate(25 55 38)\"/></g></svg>';\n  var LAYOUT_WORDS2 = [\n    [/\\bisland\\b/, \"island\"],\n    [/\\bu[- ]?shape|\\bu[- ]?kitchen|three walls/, \"U\"],\n    [/\\bgalley|two walls|parallel/, \"galley\"],\n    [/\\bl[- ]?shape|\\bcorner\\b|\\bl[- ]?kitchen/, \"L-left\"],\n    [/one wall|single wall|straight|\\bline(ar)?\\b/, \"line\"]\n  ];\n  var ADD_WORDS = [\n    [/blind corner/, \"corner-blind\"],\n    [/tall corner|corner tall/, \"corner-tall\"],\n    [/corner wall|wall corner/, \"corner-wall\"],\n    [/wall cabinet|wall unit|upper/, \"wall\"],\n    [/four[- ]drawer|drawer bank|4[- ]drawer|pan drawer/, \"base-4drawer\"],\n    [/\\bdrawer/, \"base-drawer\"],\n    [/pantry|larder/, \"tall-pantry\"],\n    [/fridge|freezer/, \"tall-fridge\"],\n    [/oven tower|tall oven/, \"tall-oven\"],\n    [/oven|hob|cooker/, \"base-oven\"],\n    [/\\bisland\\b/, \"island\"],\n    [/corner/, \"corner-l\"],\n    [/double|wide/, \"base-double\"],\n    [/base|cabinet|cupboard|unit/, \"base\"]\n  ];\n  var STYLE_NAME = { slab: \"Flat\", shaker: \"Shaker\", jpull: \"J-pull\" };\n  function quickPhrase(text, finishes) {\n    const t = String(text || \"\").toLowerCase().trim();\n    if (!t) return null;\n    if (/^(hi|hello|hey)\\b[!. ]*$/.test(t)) return { ops: [], reply: \"Hello! I can talk your kitchen through with you, show you a few kitchen options, or make a change - nothing changes until you press Apply.\" };\n    if (/^(undo|go back|take (that|it) back|cancel that)\\b/.test(t)) return { ops: [{ op: \"undo\" }], reply: \"Undone.\" };\n    if (/^redo\\b/.test(t)) return { ops: [{ op: \"redo\" }], reply: \"Redone.\" };\n    if (/(how good|score|rate (my|the|this) kitchen|how is my kitchen)/.test(t)) return { ops: [{ op: \"score\" }], reply: null };\n    if (/\\b(design|plan|make|build|create|generate|draw|lay ?out|surprise)\\b.*\\b(kitchen|it|me|room|layout)\\b|magic wand|do it for me|whole kitchen/.test(t) && !/\\badd\\b/.test(t)) {\n      const hit2 = LAYOUT_WORDS2.find(([re]) => re.test(t));\n      return { ops: [{ op: \"wand\", layout: hit2 ? hit2[1] : \"auto\" }], reply: null };\n    }\n    if (/^(add|put|place|i need|give me|another)\\b/.test(t)) {\n      const hit2 = ADD_WORDS.find(([re]) => re.test(t));\n      if (hit2) return { ops: [{ op: \"add\", type: hit2[1] }], reply: null };\n    }\n    if (/^(remove|delete|take away|get rid of)\\b.*\\b(it|this|that|selected|cabinet|one|unit)\\b/.test(t)) return { ops: [{ op: \"remove\" }], reply: null };\n    const sty = /\\b(doors?|fronts?|kitchen|it|them)\\b.*\\b(shaker|j[- ]?pull|handleless|flat|slab|plain)\\b/.exec(t);\n    if (/^(make|change|switch|set|turn|use|go)\\b/.test(t) && sty) {\n      const s = /shaker/.test(sty[2]) ? \"shaker\" : /j[- ]?pull|handleless/.test(sty[2]) ? \"jpull\" : \"slab\";\n      return { ops: [{ op: \"style\", style: s }], reply: null };\n    }\n    const fin = /(fronts?|doors?|carcass(es)?|cabinets?|kitchen|it)\\b.*\\b(in|to|be|make|paint)?\\s*([a-z][a-z ]{1,30})$/.exec(t);\n    if (/^(make|change|paint|do|set|turn)\\b/.test(t) && fin && Array.isArray(finishes)) {\n      const want = fin[4].replace(/\\b(colou?r|finish|please|the)\\b/g, \"\").trim();\n      const f = findFinish(want, finishes);\n      if (f) return { ops: [{ op: \"finish\", part: /carcass/.test(t) ? \"carcass\" : \"fronts\", value: f.key }], reply: null };\n    }\n    const room = /room\\b.*?(\\d+(?:\\.\\d+)?)\\s*(mm|metres?|meters?|m)?\\s*(?:by|x|\u00D7)\\s*(\\d+(?:\\.\\d+)?)\\s*(mm|metres?|meters?|m)?/.exec(t);\n    if (room) {\n      const mm = (v, u) => {\n        const n = Number(v);\n        return Math.round(u && /^m(et|$)/.test(u) && !/mm/.test(u) || n < 20 ? n * 1e3 : n);\n      };\n      return { ops: [{ op: \"room\", width: mm(room[1], room[2] || room[4]), depth: mm(room[3], room[4] || room[2]) }], reply: null };\n    }\n    return null;\n  }\n  function findFinish(words2, finishes) {\n    const w = String(words2 || \"\").toLowerCase().trim();\n    if (!w) return null;\n    if (w === \"white\" || w === \"oak\") return { key: w, name: w };\n    const list = (finishes || []).map((f) => typeof f === \"string\" ? { key: f.split(\"=\")[0], name: f.split(\"=\").slice(1).join(\"=\") || f } : f);\n    const toks = w.split(/\\s+/).filter((x) => x.length > 2);\n    if (!toks.length) return null;\n    return list.find((f) => toks.every((x) => f.name.toLowerCase().includes(x))) || null;\n  }\n  function chatMaxHeight({ stageBottom, toolbarBottom, chefBottomGap, buttonHeight, gap, cssMax, margin = 8, floor = 120 }) {\n    if (![stageBottom, toolbarBottom, chefBottomGap, buttonHeight, gap].every(Number.isFinite)) return null;\n    const room = Math.floor(stageBottom - chefBottomGap - buttonHeight - gap - (toolbarBottom + margin));\n    const max = Number.isFinite(cssMax) && cssMax > 0 ? Math.min(cssMax, room) : room;\n    return Math.max(floor, max);\n  }\n  function toolbarRect(stage, bar) {\n    const els = [bar].concat(Array.from(bar.querySelectorAll(\"*\")), Array.from(stage.querySelectorAll(\"[data-ub-undo],[data-ub-redo]\")));\n    let bottom = -Infinity, height = 0;\n    for (const el of els) {\n      const r = el.getBoundingClientRect();\n      if (!(r.width > 0 && r.height > 0)) continue;\n      if (r.bottom > bottom) bottom = r.bottom;\n      height = Math.max(height, r.height);\n    }\n    return { bottom: Number.isFinite(bottom) ? bottom : NaN, height };\n  }\n  function chatPlacement({ vw, vh, stage, icon: icon2, width, height, minHeight = 300, gap = 10, margin = 8, topInset = 0 }) {\n    const nums = [vw, vh, width, height, stage && stage.left, stage && stage.right, icon2 && icon2.left, icon2 && icon2.right, icon2 && icon2.bottom];\n    if (!nums.every(Number.isFinite) || !(width > 0) || !(height > 0)) return { mode: \"in\", why: \"unmeasured\" };\n    const side = (icon2.left + icon2.right) / 2 >= (stage.left + stage.right) / 2 ? \"right\" : \"left\";\n    const room = side === \"right\" ? vw - margin - (stage.right + gap) : stage.left - gap - margin;\n    if (room < width) return { mode: \"in\", side, why: \"no room beside the view (\" + Math.floor(room) + \" < \" + Math.ceil(width) + \" px)\" };\n    const top0 = margin + Math.max(0, topInset || 0);\n    let bottom = Math.min(icon2.bottom, vh - margin);\n    bottom = Math.max(bottom, Math.min(vh - margin, top0 + Math.min(height, minHeight)));\n    const top = Math.max(top0, bottom - height), h = Math.floor(bottom - top);\n    if (h < Math.min(height, minHeight)) return { mode: \"in\", side, why: \"too short (\" + h + \" px)\" };\n    const left = side === \"right\" ? Math.ceil(stage.right + gap) : Math.floor(stage.left - gap - width);\n    return { mode: \"out\", side, left, top: Math.round(top), width: Math.round(width), height: h };\n  }\n  function fixedOrigin(el, win2) {\n    for (let p = el && el.parentElement; p && p !== el.ownerDocument.documentElement; p = p.parentElement) {\n      const s = win2.getComputedStyle(p);\n      const cb = s.transform && s.transform !== \"none\" || s.perspective && s.perspective !== \"none\" || s.filter && s.filter !== \"none\" || s.backdropFilter && s.backdropFilter !== \"none\" || /paint|layout|strict|content/.test(s.contain || \"\") || /transform|perspective|filter/.test(s.willChange || \"\");\n      if (cb) {\n        const r = p.getBoundingClientRect();\n        const clips = [s.overflow, s.overflowX, s.overflowY].some((o) => o && o !== \"visible\");\n        return { x: r.left + (p.clientLeft || 0), y: r.top + (p.clientTop || 0), clip: clips ? r : null, by: p };\n      }\n    }\n    return { x: 0, y: 0, clip: null, by: null };\n  }\n  var CONSENT_SEL = \"#shopify-pc__banner\";\n  function overlayEdge(rect2, vh, shown = true) {\n    if (!shown || !rect2 || !Number.isFinite(vh) || !(rect2.height > 0) || !(rect2.width > 0)) return null;\n    if (rect2.bottom < vh - 2 || rect2.top >= vh) return null;\n    return Math.max(0, Math.floor(rect2.top));\n  }\n  function planSvg(units, room, w, h) {\n    const R4 = room || {}, W2 = Number(R4.width) || 3600, D2 = Number(R4.depth) || 3e3;\n    const s = Math.min((w - 8) / W2, (h - 8) / D2), ox = (w - W2 * s) / 2, oz = (h - D2 * s) / 2;\n    const X = (v) => (ox + v * s).toFixed(1), Z = (v) => (oz + v * s).toFixed(1), L = (v) => Math.max(0.5, v * s).toFixed(1);\n    let out = '<svg class=\"ub-chef__plan\" viewBox=\"0 0 ' + w + \" \" + h + '\" width=\"' + w + '\" height=\"' + h + '\" role=\"img\" aria-label=\"Plan of this kitchen from above\"><rect x=\"' + X(0) + '\" y=\"' + Z(0) + '\" width=\"' + L(W2) + '\" height=\"' + L(D2) + '\" fill=\"#fbfaf6\" stroke=\"#8d8a80\" stroke-width=\"1.5\"/>';\n    for (const o of Array.isArray(R4.openings) ? R4.openings : []) {\n      const c = o.kind === \"door\" ? \"#c2410c\" : \"#2563eb\", a = Number(o.x) || 0, b = a + (Number(o.w) || 0);\n      if (o.wall === \"back\") out += '<line x1=\"' + X(a) + '\" y1=\"' + Z(0) + '\" x2=\"' + X(b) + '\" y2=\"' + Z(0) + '\" stroke=\"' + c + '\" stroke-width=\"3\"/>';\n      if (o.wall === \"front\") out += '<line x1=\"' + X(a) + '\" y1=\"' + Z(D2) + '\" x2=\"' + X(b) + '\" y2=\"' + Z(D2) + '\" stroke=\"' + c + '\" stroke-width=\"3\"/>';\n      if (o.wall === \"left\") out += '<line x1=\"' + X(0) + '\" y1=\"' + Z(a) + '\" x2=\"' + X(0) + '\" y2=\"' + Z(b) + '\" stroke=\"' + c + '\" stroke-width=\"3\"/>';\n      if (o.wall === \"right\") out += '<line x1=\"' + X(W2) + '\" y1=\"' + Z(a) + '\" x2=\"' + X(W2) + '\" y2=\"' + Z(b) + '\" stroke=\"' + c + '\" stroke-width=\"3\"/>';\n    }\n    const order = (u) => u.family === \"wall\" ? 1 : 0;\n    for (const u of (units || []).slice().sort((a, b) => order(a) - order(b))) {\n      const wall = u.family === \"wall\", tall = /^tall/.test(u.type), oven = u.type === \"base-oven\";\n      const fill = wall ? \"none\" : tall ? \"#6b6f76\" : u.type === \"island\" ? \"#d6c7a8\" : \"#e9e6dc\";\n      for (const b of footBoxes(u)) {\n        out += '<rect x=\"' + X(b.x0) + '\" y=\"' + Z(b.z0) + '\" width=\"' + L(b.x1 - b.x0) + '\" height=\"' + L(b.z1 - b.z0) + '\" fill=\"' + fill + '\" stroke=\"' + (wall ? \"#9a958a\" : \"#55534d\") + '\" stroke-width=\"' + (wall ? 0.8 : 1) + '\"' + (wall ? ' stroke-dasharray=\"2 2\"' : \"\") + \"/>\";\n        if (oven) out += '<circle cx=\"' + X((b.x0 + b.x1) / 2) + '\" cy=\"' + Z((b.z0 + b.z1) / 2) + '\" r=\"' + L(160) + '\" fill=\"none\" stroke=\"#1f2937\" stroke-width=\"1\"/>';\n      }\n    }\n    return out + \"</svg>\";\n  }\n  function createChef(ctx) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win;\n    const main = root && root.querySelector && (root.querySelector(\".ub-lab__stage\") || root.querySelector(\".ub-lab__visual\"));\n    if (!main || !doc2 || !win2 || ctx.config && ctx.config.chef === false) return { sync() {\n    } };\n    const ls = () => {\n      try {\n        return win2.localStorage || null;\n      } catch {\n        return null;\n      }\n    };\n    const reduced = () => {\n      try {\n        return !!(win2.matchMedia && win2.matchMedia(\"(prefers-reduced-motion: reduce)\").matches);\n      } catch {\n        return false;\n      }\n    };\n    const box3 = doc2.createElement(\"div\");\n    box3.className = \"ub-chef\";\n    box3.setAttribute(\"data-ub-chef\", \"\");\n    const mic = canRecord(win2) ? '<button type=\"button\" class=\"ub-chef__mic\" data-ub-chef-mic aria-label=\"Speak to Chef\" title=\"Speak to Chef - tap to start, tap again to finish\">' + MIC_SVG + \"</button>\" : \"\";\n    box3.innerHTML = '<button type=\"button\" class=\"ub-chef__btn\" data-ub-chef-btn aria-expanded=\"false\" aria-label=\"Ask Chef\">' + FACE_SVG + '</button><div class=\"ub-chef__panel\" data-ub-chef-panel hidden role=\"dialog\" aria-label=\"Chef\"><div class=\"ub-chef__rail\" data-ub-chef-rail><button type=\"button\" class=\"ub-chef__x\" data-ub-chef-close aria-label=\"Close Chef\">&times;</button>' + FACE_SVG + '<span class=\"ub-chef__sr\" data-ub-chef-status>Ready to help</span>' + mic + '</div><div class=\"ub-chef__col\"><div class=\"ub-chef__log\" data-ub-chef-log aria-live=\"polite\"></div><div class=\"ub-chef__try\" data-ub-chef-try></div><p class=\"ub-chef__voice\" data-ub-chef-voice hidden></p><form class=\"ub-chef__form\" data-ub-chef-form><input type=\"text\" maxlength=\"400\" autocomplete=\"off\" data-ub-chef-input placeholder=\"Ask or tell me anything\\u2026\" aria-label=\"Message to Chef\"><button type=\"submit\" class=\"ub-lab__btn\" data-ub-chef-send>Send</button></form></div></div><span class=\"ub-chef__tail\" data-ub-chef-tail hidden aria-hidden=\"true\"></span>';\n    main.appendChild(box3);\n    const q = (s) => box3.querySelector(s);\n    const btn = q(\"[data-ub-chef-btn]\"), panel = q(\"[data-ub-chef-panel]\"), log = q(\"[data-ub-chef-log]\"), input = q(\"[data-ub-chef-input]\"), status = q(\"[data-ub-chef-status]\");\n    const faces = Array.from(box3.querySelectorAll(\".ub-chef__face\"));\n    let moodT = null, busy = false;\n    function mood(m, ms) {\n      faces.forEach((f) => f.setAttribute(\"class\", \"ub-chef__face \" + (m || \"idle\")));\n      box3.setAttribute(\"data-ub-chef-mood\", m || \"idle\");\n      if (moodT) win2.clearTimeout(moodT);\n      if (ms) moodT = win2.setTimeout(() => mood(\"idle\"), ms);\n    }\n    mood(\"idle\");\n    function visitor() {\n      const s = ls();\n      let v = null;\n      try {\n        v = s && s.getItem(VISITOR_KEY);\n      } catch {\n        v = null;\n      }\n      if (!v || !/^[a-f0-9]{32}$/.test(v)) {\n        v = \"\";\n        try {\n          const a = new Uint8Array(16);\n          win2.crypto.getRandomValues(a);\n          a.forEach((b) => {\n            v += (b < 16 ? \"0\" : \"\") + b.toString(16);\n          });\n        } catch {\n          for (let i = 0; i < 32; i++) v += Math.floor(Math.random() * 16).toString(16);\n        }\n        try {\n          if (s) s.setItem(VISITOR_KEY, v);\n        } catch {\n        }\n      }\n      return v;\n    }\n    let chat = [];\n    try {\n      const s = ls();\n      chat = JSON.parse(s && s.getItem(CHAT_KEY) || \"[]\");\n      if (!Array.isArray(chat)) chat = [];\n    } catch {\n      chat = [];\n    }\n    function save() {\n      try {\n        const s = ls();\n        if (s) s.setItem(CHAT_KEY, JSON.stringify(chat.slice(-20)));\n      } catch {\n      }\n    }\n    function say(role, text) {\n      if (!text) return null;\n      chat.push({ role, text: String(text).slice(0, 1200) });\n      chat = chat.slice(-20);\n      save();\n      if (role === \"you\" && typeof triesOff === \"function\") triesOff();\n      const p = doc2.createElement(\"p\");\n      p.className = \"ub-chef__msg ub-chef__msg--\" + role;\n      p.textContent = text;\n      log.appendChild(p);\n      log.scrollTop = log.scrollHeight;\n      return p;\n    }\n    chat.forEach((m) => {\n      const p = doc2.createElement(\"p\");\n      p.className = \"ub-chef__msg ub-chef__msg--\" + m.role;\n      p.textContent = m.text;\n      log.appendChild(p);\n    });\n    if (!chat.length) say(\"chef\", \"Hi, I'm Chef. Tap \\xABHelp me plan\\xBB and I'll take you through it a click at a time, or just ask me anything. Nothing in your plan changes until you press Apply.\");\n    const tries = [\"Help me plan\", \"Suggest kitchen options\", \"How good is my kitchen?\", \"Where should the fridge go?\"];\n    const tryBox = q(\"[data-ub-chef-try]\");\n    tries.forEach((t, i) => {\n      const b = doc2.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"ub-chef__chip\" + (i === 0 ? \" ub-chef__chip--go\" : \"\");\n      b.textContent = t;\n      if (i === 0) b.setAttribute(\"data-ub-chef-guide\", \"\");\n      b.addEventListener(\"click\", () => i === 0 ? startGuide(true) : ask(t));\n      tryBox.appendChild(b);\n    });\n    const triesOff = () => {\n      tryBox.hidden = chat.some((m) => m.role === \"you\");\n    };\n    triesOff();\n    function finishesList() {\n      const out = [\"white=White\", \"oak=Oak\"];\n      try {\n        const all = Object.values(DECOR_BY_KEY);\n        if (Array.isArray(all)) for (const d of all) {\n          if (out.length >= 40) break;\n          if (decorWithoutTape(d)) continue;\n          if (/(white|oak|grey|gray|black|walnut|cashmere|beige|green|blue|anthracite)/i.test(d.name)) out.push(d.key + \"=\" + d.name);\n        }\n      } catch {\n      }\n      return out;\n    }\n    function scoreNow() {\n      try {\n        const s = ctx.commands && ctx.commands.run ? ctx.commands.run(\"kitchen.score\") : null;\n        return s && s.ok ? s : null;\n      } catch {\n        return null;\n      }\n    }\n    function stateNow() {\n      const sc = ctx.scene(), r = sc.room || {};\n      const score = scoreNow();\n      const types = {};\n      sc.units.forEach((u) => {\n        types[u.type] = (types[u.type] || 0) + 1;\n      });\n      const sel = sc.units.findIndex((u) => u.id === sc.selectedId);\n      return {\n        room: { width: r.width, depth: r.depth, openings: Array.isArray(r.openings) ? r.openings.map((o) => o.kind + \" on \" + o.wall + \" wall\") : [] },\n        cabinets: sc.units.length,\n        types,\n        selected: sel >= 0 ? sel + 1 : null,\n        score: score ? score.total : null,\n        weakest: score ? score.hint : null,\n        finishes: finishesList()\n      };\n    }\n    function sparkle() {\n      if (reduced()) return;\n      const host = doc2.createElement(\"div\");\n      host.className = \"ub-chef__sparkle\";\n      host.setAttribute(\"aria-hidden\", \"true\");\n      for (let i = 0; i < 10; i++) {\n        const s = doc2.createElement(\"i\");\n        s.style.setProperty(\"--a\", i * 36 + \"deg\");\n        s.style.setProperty(\"--d\", 18 + i % 3 * 8 + \"px\");\n        host.appendChild(s);\n      }\n      box3.appendChild(host);\n      win2.setTimeout(() => {\n        if (host.parentNode) host.parentNode.removeChild(host);\n      }, 900);\n    }\n    let pending = null;\n    const consult = { prefs: {}, asked: [], hist: [], current: null, after: null, layout: null, seed: 1, budgetSaid: false };\n    function closeOpen() {\n      log.querySelectorAll(\".ub-chef__card--q:not(.is-done), .ub-chef__card--opts:not(.is-done)\").forEach(closeCard);\n    }\n    function card(cls) {\n      const c = doc2.createElement(\"div\");\n      c.className = \"ub-chef__card \" + (cls || \"\");\n      log.appendChild(c);\n      return c;\n    }\n    function button(host, label, attr, fn, primary) {\n      const b = doc2.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"ub-lab__btn ub-chef__act\" + (primary ? \" ub-chef__act--go\" : \"\");\n      b.textContent = label;\n      if (attr) b.setAttribute(attr, \"\");\n      b.addEventListener(\"click\", fn);\n      host.appendChild(b);\n      return b;\n    }\n    function closeCard(c) {\n      if (!c) return;\n      c.classList.add(\"is-done\");\n      c.querySelectorAll(\"button\").forEach((b) => {\n        b.disabled = true;\n      });\n    }\n    function scrollDown() {\n      log.scrollTop = log.scrollHeight;\n    }\n    function planSig() {\n      const sc = ctx.scene();\n      return JSON.stringify({ u: sc.units, r: sc.room || null, k: sc.kitchen || null });\n    }\n    function unitsSig(units) {\n      return JSON.stringify((units || []).map((u) => [u.type, u.x, u.z, u.y, u.w, u.w2 || 0, u.d, u.rot || 0, !!u.hood]));\n    }\n    function propose(ops, words2) {\n      if (pending) closeCard(pending.card);\n      const c = card(\"ub-chef__card--apply\");\n      c.setAttribute(\"data-ub-chef-proposal\", \"\");\n      const p = doc2.createElement(\"p\");\n      p.textContent = (words2 || \"I can \" + describeOps(ops) + \".\") + \" Your plan stays as it is until you press Apply.\";\n      c.appendChild(p);\n      const row = doc2.createElement(\"div\");\n      row.className = \"ub-chef__row\";\n      c.appendChild(row);\n      pending = { ops, card: c, plan: planSig() };\n      button(row, \"Apply\", \"data-ub-chef-apply\", () => apply(), true);\n      button(row, \"Not now\", \"data-ub-chef-cancel\", () => {\n        closeCard(c);\n        pending = null;\n        consult.after = null;\n        say(\"chef\", \"OK - nothing changed.\");\n        resumeGuide();\n      });\n      scrollDown();\n      mood(\"listen\", 1200);\n    }\n    function apply() {\n      if (!pending) return;\n      const { ops, card: c, plan } = pending;\n      pending = null;\n      closeCard(c);\n      if (plan !== planSig()) {\n        say(\"chef\", \"Your plan has changed since I suggested this, so I have not applied it. Ask me again and I will suggest it for the plan as it is now.\");\n        mood(\"oops\", 1600);\n        return;\n      }\n      mood(\"work\");\n      const before = pastLen();\n      const out = perform(ops);\n      finish3(out, null);\n      const stepped = before === null || pastLen() > before;\n      if (out.changed && !out.failed && !stepped) say(\"chef\", \"(This change has no Undo step in the editor - change it back the same way.)\");\n      if (out.changed && !out.failed && stepped) {\n        const u = card(\"ub-chef__card--undo\");\n        const row = doc2.createElement(\"div\");\n        row.className = \"ub-chef__row\";\n        u.appendChild(row);\n        const after = planSig();\n        button(row, \"Undo\", \"data-ub-chef-undo\", () => {\n          closeCard(u);\n          if (planSig() !== after) {\n            say(\"chef\", \"You have changed the plan since then - close this chat and use the editor's Undo to step back in order.\");\n            return;\n          }\n          const r = ctx.act(\"history.undo\", {});\n          say(\"chef\", r && r.ok !== false ? \"Undone - your plan is back as it was.\" : \"There was nothing to undo.\");\n        });\n        scrollDown();\n        if (out.next) out.next();\n        else if (consult.after === \"finish\") {\n          consult.after = null;\n          colourNow();\n        } else resumeGuide();\n      }\n    }\n    function pastLen() {\n      try {\n        const h = ctx.commands && ctx.commands.history ? ctx.commands.history() : null;\n        return h && Array.isArray(h.past) ? h.past.length : null;\n      } catch {\n        return null;\n      }\n    }\n    function perform(ops) {\n      const said = [];\n      let changed = false, failed = false, next = null;\n      for (const o of ops || []) {\n        let r = null;\n        if (o.op === \"apply\") {\n          const v = ctx.act(\"wand.variants\", o.args || {}, { controls: false, render: false, out: false });\n          const idx = v && v.ok && Array.isArray(v.variants) ? v.variants.findIndex((x) => unitsSig(x.units) === o.sig) : -1;\n          r = idx < 0 ? { ok: false, why: \"that kitchen is no longer on offer for this room - ask me for options again\" } : ctx.act(\"wand.apply\", { index: idx });\n          if (r && r.ok) {\n            said.push(\"Here is your kitchen: \" + o.name + \", \" + r.cabinets + \" cabinets. The price in the panel is for the cut and edged boards only.\");\n            const want = consult.prefs.style, now = (ctx.scene().kitchen || {}).frontStyle || \"slab\";\n            if (want && want !== now) next = () => propose([{ op: \"style\", style: want }], \"You liked \" + STYLE_NAME[want] + \" doors - shall I put them on this kitchen?\" + (want !== \"slab\" ? \" \" + STYLE_NAME[want] + \" is routed from MDF and supplied primed, so those fronts are quoted rather than priced here.\" : \"\"));\n          }\n        } else if (o.op === \"add\") r = ctx.act(\"unit.add\", { type: o.type });\n        else if (o.op === \"remove\") r = ctx.act(\"unit.remove\", {});\n        else if (o.op === \"finish\") r = ctx.act(\"kitchen.materials\", { [o.part === \"carcass\" ? \"carcass\" : \"fronts\"]: o.value });\n        else if (o.op === \"style\") {\n          r = ctx.act(\"kitchen.materials\", { frontStyle: o.style });\n          if (r && r.ok !== false) said.push(\"Every door is \" + STYLE_NAME[o.style] + \" now.\");\n        } else if (o.op === \"room\") {\n          r = { ok: true };\n          if (o.width) {\n            const x = ctx.act(\"room.dim\", { k: \"width\", raw: String(o.width) });\n            if (x && x.ok === false) r = x;\n          }\n          if (o.depth) {\n            const x = ctx.act(\"room.dim\", { k: \"depth\", raw: String(o.depth) });\n            if (x && x.ok === false) r = x;\n          }\n        } else if (o.op === \"select\") {\n          const u = ctx.scene().units[o.index - 1];\n          r = u ? ctx.act(\"select\", { id: u.id }) : { ok: false, why: \"there is no cabinet \" + o.index };\n        } else if (o.op === \"unitDrawerH\" || o.op === \"unitDrawerBoxH\" || o.op === \"islandPreset\") {\n          const cab = inventory(ctx.scene()).cabinets.find((c) => c.id === o.id);\n          if (!cab) r = { ok: false, why: \"that cabinet is no longer in the plan - ask me again\" };\n          else if (o.op !== \"islandPreset\" && !cab.parts.boxes.some((d) => d.i === o.i)) r = { ok: false, why: \"that drawer is no longer there - ask me again\" };\n          else {\n            ctx.act(\"select\", { id: o.id });\n            if (o.op === \"islandPreset\") r = ctx.act(\"island.preset\", { id: o.preset });\n            else if (o.op === \"unitDrawerH\") r = ctx.act(\"drawer.height\", { i: o.i, h: o.h });\n            else r = ctx.act(\"drawer.boxH\", { i: o.i, h: o.h });\n          }\n        } else if (o.op === \"unitFinish\" || o.op === \"unitGlass\" || o.op === \"unitStyle\" || o.op === \"unitRemove\") {\n          if (!ctx.scene().units.some((u) => u.id === o.id)) r = { ok: false, why: \"that cabinet is no longer in the plan - ask me again\" };\n          else {\n            ctx.act(\"select\", { id: o.id });\n            if (o.op === \"unitFinish\") r = ctx.act(\"unit.finish\", { which: o.which, value: o.value });\n            else if (o.op === \"unitGlass\") r = ctx.act(\"glass.toggle\", { on: o.on !== false });\n            else if (o.op === \"unitStyle\") r = ctx.act(\"unit.frontStyle\", { frontStyle: o.style });\n            else r = ctx.act(\"unit.remove\", {});\n          }\n        } else if (o.op === \"undo\") r = ctx.act(\"history.undo\", {});\n        else if (o.op === \"redo\") r = ctx.act(\"history.redo\", {});\n        else if (o.op === \"score\") {\n          const s = scoreNow();\n          if (s) said.push(scoreWords(s));\n          r = { ok: true, view: true };\n        } else continue;\n        if (r && r.ok === false) {\n          failed = true;\n          said.push(\"I could not do that: \" + (r.why || \"it does not fit\") + \".\");\n        } else if (r && !r.view) changed = true;\n      }\n      return { said, changed, failed, next };\n    }\n    function guideFacts() {\n      const sc = ctx.scene(), r = sc.room || {}, op = Array.isArray(r.openings) ? r.openings : [];\n      return { units: sc.units.length, roomSet: !!r.on, frontStyle: (sc.kitchen || {}).frontStyle || \"slab\", room: r.width ? { width: r.width, depth: r.depth, windows: op.filter((o) => o.kind !== \"door\").length, doors: op.filter((o) => o.kind === \"door\").length } : null };\n    }\n    const ALL_STEPS = Array.from(new Set([].concat(...Object.values(GUIDE_ORDER))));\n    function suggestNow() {\n      ALL_STEPS.forEach((id) => {\n        if (consult.asked.indexOf(id) < 0) consult.asked.push(id);\n      });\n      return consult.prefs.goal === \"finishes\" ? doorsDone() : showOptions(true);\n    }\n    function wholeKitchen() {\n      if (!consult.prefs.goal) consult.prefs.goal = \"whole\";\n      if (consult.asked.indexOf(\"goal\") < 0) consult.asked.push(\"goal\");\n    }\n    function resumeGuide() {\n      if (consult.resume) {\n        consult.resume = false;\n        askNext(true);\n      }\n    }\n    function quickPhraseOps(t) {\n      const l = quickPhrase(t, finishesList());\n      return !!(l && l.ops && l.ops.length);\n    }\n    function startGuide(fromClick) {\n      if (busy) return;\n      if (pending) {\n        closeCard(pending.card);\n        pending = null;\n      }\n      consult.prefs = {};\n      consult.asked = [];\n      consult.hist = [];\n      consult.after = null;\n      consult.layout = null;\n      if (fromClick) say(\"you\", \"Help me plan\");\n      askNext(fromClick);\n    }\n    function forget(id, keys2) {\n      for (const k of keys2 || []) delete consult.prefs[k];\n      consult.asked = consult.asked.filter((x) => x !== id && x !== consult.current);\n      consult.hist = consult.hist.filter((h) => h.id !== id);\n    }\n    function back() {\n      const last = consult.hist.pop();\n      if (!last) return;\n      say(\"you\", \"Back\");\n      forget(last.id, last.keys);\n      askNext(true);\n    }\n    function openTool(tool) {\n      const el = tool && root.querySelector(tool.control);\n      if (!el) {\n        say(\"chef\", \"I can't find \" + (tool ? tool.name : \"that tool\") + \" on this page.\");\n        return false;\n      }\n      if (tool.press || el.getAttribute(\"aria-expanded\") !== \"true\") el.click();\n      say(\"chef\", \"I've opened \" + tool.name + \".\" + (tool.id === \"roomlayout\" ? \" Draw the walls, add windows and doors, then press Apply there - nothing changes until you do.\" : \"\"));\n      mood(\"happy\", 900);\n      return true;\n    }\n    function targetEdit(text, q2) {\n      const inv = inventory(ctx.scene());\n      let hit2 = null, where = \"\";\n      if (q2.id) {\n        hit2 = inv.cabinets.find((c) => c.id === q2.id) || null;\n        where = hit2 ? hit2.wall ? \"the \" + hit2.wall + \" wall\" : \"the island\" : \"\";\n      } else {\n        const r = resolveTarget(inv, q2);\n        if (r.none) {\n          say(\"chef\", r.none);\n          mood(\"think\", 900);\n          return;\n        }\n        if (r.ask) {\n          closeOpen();\n          say(\"chef\", r.ask.text);\n          const c = card(\"ub-chef__card--q\");\n          c.setAttribute(\"data-ub-chef-question\", \"which-run\");\n          const chips = doc2.createElement(\"div\");\n          chips.className = \"ub-chef__chips\";\n          c.appendChild(chips);\n          for (const ch of r.ask.choices) {\n            const b = doc2.createElement(\"button\");\n            b.type = \"button\";\n            b.className = \"ub-chef__chip\";\n            b.textContent = ch.label;\n            b.setAttribute(\"data-ub-chef-chip\", ch.label);\n            b.addEventListener(\"click\", () => {\n              closeCard(c);\n              say(\"you\", ch.label);\n              targetEdit(text, { ...q2, wall: ch.set.wall, row: ch.set.row });\n            });\n            chips.appendChild(b);\n          }\n          scrollDown();\n          return;\n        }\n        hit2 = r.unit;\n        where = r.where;\n      }\n      if (!hit2) {\n        say(\"chef\", \"Tap the cabinet in the plan first, then say \\xABthis one\\xBB.\");\n        return;\n      }\n      ctx.act(\"select\", { id: hit2.id });\n      ctx.act(\"view.reveal\", { id: hit2.id });\n      const count = q2.id ? \"\" : (q2.from === \"right\" ? ordinal(hit2.fromRight) + \" from the right\" : ordinal(hit2.fromLeft) + \" from the left\") + \" on \" + where + \": \";\n      const t = String(text || \"\").toLowerCase(), ops = [];\n      const dq = parseDrawer(t);\n      if (dq) {\n        const r = drawerOf(hit2, dq);\n        if (r.none) {\n          say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \". \" + r.none);\n          return;\n        }\n        const d = r.drawer;\n        ctx.act(\"drawer.box\", { i: d.i, part: dq.part });\n        const desc = \"its \" + ordinal(r.pos) + \" drawer from the top - front \" + d.frontH + \" mm, box \" + d.boxH + \" mm\" + (d.boxMax ? \" (the box can be up to \" + d.boxMax + \" mm there)\" : \"\");\n        if (/\\b(colou?r|oak|white|grey|gray|black|walnut|material|finish|paint|decor)\\b/.test(t)) {\n          say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \", \" + desc + \". The planner can't give one drawer front its own colour or material - only this whole cabinet's fronts (\\xABmake this cabinet oak\\xBB) or the whole kitchen. I've opened the Drawers tool on it.\");\n          openTool(TOOLS2.find((x) => x.id === \"drawers\"));\n          return;\n        }\n        const mm = /\\b(\\d{2,3})\\s*(?:mm|millimet(?:re|er)s?)\\b/.exec(t);\n        if (mm) {\n          const h = parseInt(mm[1], 10);\n          if (dq.part === \"box\") {\n            if (d.boxMax && h > d.boxMax) {\n              say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \", \" + desc + \". \" + h + \" mm is more than its box can be there - nothing changed.\");\n              return;\n            }\n            say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \", \" + desc + \" - highlighted.\");\n            return propose([{ op: \"unitDrawerBoxH\", id: hit2.id, i: d.i, h }], \"Make that drawer's box \" + h + \" mm high (its front stays as it is)?\");\n          }\n          say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \", \" + desc + \" - highlighted.\");\n          return propose([{ op: \"unitDrawerH\", id: hit2.id, i: d.i, h }], \"Make that drawer \" + h + \" mm high - front and box together, up to what fits?\");\n        }\n        say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \", \" + desc + \" - highlighted. Say a height, e.g. \\xAB200 mm\\xBB, or \\xABits box 120 mm\\xBB.\");\n        return;\n      }\n      let words2 = null;\n      if (/\\bglass\\b/.test(t)) {\n        if (!hit2.parts.doors.length) {\n          say(\"chef\", count + cabinetLine(hit2) + \". It has no doors, so it can't have glass ones.\");\n          return;\n        }\n        const off = /\\b(no|remove|without|take off|plain)\\b[^.?!]{0,20}\\bglass\\b|\\bglass\\b[^.?!]{0,12}\\b(off|out)\\b/.test(t);\n        ops.push({ op: \"unitGlass\", id: hit2.id, on: !off });\n        words2 = (off ? \"Take the glass out of\" : \"Put glass doors on\") + \" this \" + hit2.words + \"?\";\n      } else if (/\\b(shaker|j[- ]?pull|handleless|flat|slab)\\b/.test(t) && /\\bdoors?\\b|\\bstyle\\b|\\bfronts?\\b/.test(t)) {\n        const st = /shaker/.test(t) ? \"shaker\" : /j[- ]?pull|handleless/.test(t) ? \"jpull\" : \"slab\";\n        ops.push({ op: \"unitStyle\", id: hit2.id, style: st });\n        words2 = \"Give this \" + hit2.words + \" \" + STYLE_NAME[st] + \" doors (just this one)?\";\n      } else if (/\\b(remove|delete|take (it|that) (out|away)|get rid of)\\b/.test(t)) {\n        ops.push({ op: \"unitRemove\", id: hit2.id });\n        words2 = \"Remove this \" + hit2.words + \"?\";\n      } else {\n        const m = /\\b(?:in|to|make it|make them|paint it|colou?r|finish)\\s+([a-z][a-z ]{1,30}?)(?:\\s+(?:fronts?|doors?|please))?\\s*[.!?]?$/.exec(t);\n        const f = m ? findFinish(m[1].replace(/\\b(the|a|an)\\b/g, \"\").trim(), finishesList()) : null;\n        if (f) {\n          const which = /\\bcarcass\\b/.test(t) ? \"carcass\" : \"fronts\";\n          ops.push({ op: \"unitFinish\", id: hit2.id, which, value: f.key });\n          words2 = \"Make this \" + hit2.words + \"'s \" + (which === \"carcass\" ? \"carcass\" : \"fronts\") + \" \" + f.name + \" (just this one)?\";\n        }\n      }\n      if (!ops.length) {\n        say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \" - highlighted. What shall I change on it: glass doors, a colour, its door style, or remove it?\");\n        mood(\"listen\", 900);\n        return;\n      }\n      say(\"chef\", \"That's the \" + count + cabinetLine(hit2) + \" - highlighted.\");\n      propose(ops, words2);\n    }\n    function ordinal(n) {\n      return n + (n % 10 === 1 && n !== 11 ? \"st\" : n % 10 === 2 && n !== 12 ? \"nd\" : n % 10 === 3 && n !== 13 ? \"rd\" : \"th\");\n    }\n    function askNext(focusChips) {\n      const qn = nextQuestion(consult.prefs, consult.asked, guideFacts());\n      if (!qn) {\n        consult.current = null;\n        if (consult.prefs.goal === \"one\") {\n          say(\"chef\", \"Which one? Say it like \\xABthe 3rd from the left on the back wall\\xBB, or tap it in the plan and say \\xABthis one\\xBB - then what to change (glass doors, a colour, a door style).\");\n          try {\n            input.focus({ preventScroll: true });\n          } catch {\n          }\n          return;\n        }\n        return consult.prefs.goal === \"finishes\" ? doorsDone() : showOptions();\n      }\n      consult.asked.push(qn.id);\n      consult.current = qn.id;\n      closeOpen();\n      say(\"chef\", qn.text);\n      const c = card(\"ub-chef__card--q\" + (qn.pictures ? \" ub-chef__card--pics\" : \"\"));\n      c.setAttribute(\"data-ub-chef-question\", qn.id);\n      const chips = doc2.createElement(\"div\");\n      chips.className = \"ub-chef__chips\";\n      c.appendChild(chips);\n      for (const ch of qn.chips) {\n        const b = doc2.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-chef__chip\" + (ch.img ? \" ub-chef__pic\" : \"\") + (ch.skip ? \" ub-chef__chip--skip\" : \"\");\n        if (ch.img && FRONT_THUMBS[ch.img]) {\n          const im = doc2.createElement(\"img\");\n          im.src = FRONT_THUMBS[ch.img];\n          im.alt = ch.label + \" door\";\n          im.width = 60;\n          im.height = 60;\n          b.appendChild(im);\n        }\n        const s = doc2.createElement(\"span\");\n        s.textContent = ch.label;\n        b.appendChild(s);\n        b.setAttribute(\"data-ub-chef-chip\", ch.label);\n        b.addEventListener(\"click\", () => {\n          closeCard(c);\n          say(\"you\", ch.label);\n          if (ch.skip) return suggestNow();\n          if (ch.next) return askNext(true);\n          if (ch.edit) {\n            consult.asked = consult.asked.filter((x) => x !== qn.id);\n            input.value = ch.edit;\n            try {\n              input.focus({ preventScroll: true });\n              input.setSelectionRange(ch.edit.length, ch.edit.length);\n            } catch {\n            }\n            consult.resume = true;\n            say(\"chef\", \"Edit the size and press Send - I'll carry on from there.\");\n            return;\n          }\n          if (ch.score) {\n            const out = perform([{ op: \"score\" }]);\n            finish3(out, null);\n            return;\n          }\n          if (ch.tool) {\n            openTool(TOOLS2.find((x) => x.id === ch.tool));\n            return;\n          }\n          consult.hist.push({ id: qn.id, keys: Object.keys(ch.set || {}) });\n          Object.assign(consult.prefs, ch.set || {});\n          mood(\"think\", 700);\n          askNext(true);\n        });\n        chips.appendChild(b);\n      }\n      if (consult.hist.length) {\n        const b = doc2.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-chef__chip ub-chef__chip--skip\";\n        b.textContent = \"Back\";\n        b.setAttribute(\"data-ub-chef-back\", \"\");\n        b.addEventListener(\"click\", () => {\n          closeCard(c);\n          back();\n        });\n        chips.appendChild(b);\n      }\n      scrollDown();\n      if (focusChips) {\n        const f = chips.querySelector(\"button\");\n        if (f) try {\n          f.focus({ preventScroll: true });\n        } catch {\n        }\n      }\n    }\n    function doorsDone() {\n      const want = consult.prefs.style, now = (ctx.scene().kitchen || {}).frontStyle || \"slab\";\n      if (!ctx.scene().units.length) {\n        say(\"chef\", \"Your plan has no cabinets yet - say \\xABHelp me plan\\xBB and pick \\xABPlan a whole kitchen\\xBB first, then the doors.\");\n        return;\n      }\n      if (want && want !== now) {\n        consult.after = consult.prefs.finish || want !== \"slab\" ? \"finish\" : null;\n        return propose([{ op: \"style\", style: want }], \"Shall I put \" + STYLE_NAME[want] + \" doors on your kitchen?\" + (want !== \"slab\" ? \" \" + STYLE_NAME[want] + \" is routed from MDF and supplied primed, so those fronts are quoted rather than priced here.\" : \"\"));\n      }\n      return colourNow();\n    }\n    function colourNow() {\n      const f = consult.prefs.finish, style2 = consult.prefs.style || (ctx.scene().kitchen || {}).frontStyle || \"slab\";\n      if (style2 !== \"slab\") {\n        say(\"chef\", STYLE_NAME[style2] + \" doors come primed, ready to paint - the colour is your paint choice and is quoted separately. Anything else?\");\n        return;\n      }\n      if (!f) {\n        say(\"chef\", \"Done - tell me if you'd like another colour or a different layout.\");\n        return;\n      }\n      const hit2 = findFinish(f, finishesList());\n      if (hit2 && ((ctx.scene().kitchen || {}).fronts || \"white\") === hit2.key) {\n        say(\"chef\", \"Your doors are \" + f + \" already - nothing to change.\");\n        return;\n      }\n      if (hit2) return propose([{ op: \"finish\", part: \"fronts\", value: hit2.key }], \"Shall I make the doors \" + f + \"?\");\n      say(\"chef\", \"I can't find a \" + f + \" finish with its own edging tape right now - try another colour in the Finish panel.\");\n    }\n    function showOptions(assumed) {\n      const args = {\n        layout: consult.layout || \"auto\",\n        seed: consult.seed,\n        ...consult.prefs.hob === false ? { cooking: false } : {},\n        ...consult.prefs.hood === false ? { hood: false } : {}\n      };\n      const v = ctx.act(\"wand.variants\", args, { controls: false, render: false, out: false });\n      if (!v || !v.ok || !v.variants || !v.variants.length) {\n        say(\"chef\", consult.layout ? \"That layout does not fit this room - shall I show the ones that do? Say \\xABsuggest options\\xBB.\" : \"Your room is too small for a whole kitchen - make it at least 1800 mm wide in Room, and ask me again.\");\n        consult.layout = null;\n        mood(\"oops\", 1600);\n        return;\n      }\n      const sc = ctx.scene();\n      closeOpen();\n      const opts = chooseOptions(v.variants.map((x) => ({ ...x, scoreTotal: x.score, score: null })), consult.prefs);\n      const why = [];\n      if (assumed || !consult.prefs.cooks && !consult.prefs.look && !consult.prefs.style) why.push(\"I've assumed one main cook and no particular style - tell me if that's wrong\");\n      if (consult.prefs.cooks === \"several\") why.push(\"room for two cooks first\");\n      if (consult.prefs.budget || consult.prefs.priority === \"budget\") why.push(\"fewer cabinets first for your budget\");\n      if (consult.prefs.priority === \"storage\") why.push(\"the most storage first\");\n      if (consult.prefs.priority === \"workspace\") why.push(\"the most worktop first\");\n      if (consult.prefs.hob === false) why.push(\"no built-in oven or hob - you have your own cooker\");\n      else if (consult.prefs.hob !== true) why.push(\"I've included an oven + hob cabinet drawn with Bosch planning models - say if you have a freestanding or range cooker, or your own appliances\");\n      if (consult.prefs.hob !== false && consult.prefs.hood === false) why.push(\"no hood - extraction planned another way\");\n      say(\"chef\", \"Here \" + (opts.length === 1 ? \"is a kitchen\" : \"are \" + opts.length + \" different kitchens\") + \" for your \" + (sc.room && sc.room.width ? sc.room.width + \" x \" + sc.room.depth + \" mm \" : \"\") + \"room\" + (why.length ? \" (\" + why.join(\"; \") + \")\" : \"\") + \". Pick one to see what changes - your plan stays as it is until you press Apply.\");\n      const list = card(\"ub-chef__card--opts\");\n      list.setAttribute(\"data-ub-chef-options\", \"\");\n      for (const o of opts) {\n        const x = v.variants[o.index];\n        const b = doc2.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-chef__opt\";\n        b.setAttribute(\"data-ub-chef-option\", String(o.index));\n        b.innerHTML = planSvg(x.units, sc.room, 84, 64) + \"<span><b></b><small></small><em></em></span>\";\n        b.querySelector(\"b\").textContent = o.name;\n        b.querySelector(\"small\").textContent = o.cabinets + \" cabinets \\xB7 works \" + o.score + \"/100\";\n        b.querySelector(\"em\").textContent = o.pros.concat(o.cons.map((c) => \"but \" + c)).join(\"; \");\n        b.addEventListener(\"click\", () => {\n          const n = sc.units.length;\n          propose([{ op: \"apply\", index: o.index, name: o.name, args, sig: unitsSig(x.units) }], \"Put in \\xAB\" + o.name + \"\\xBB (\" + o.cabinets + \" cabinets)\" + (n ? \" instead of your \" + n + \" cabinet\" + (n === 1 ? \"\" : \"s\") : \"\") + \"? One Undo brings your plan back.\");\n        });\n        list.appendChild(b);\n      }\n      const row = doc2.createElement(\"div\");\n      row.className = \"ub-chef__row\";\n      list.appendChild(row);\n      button(row, \"Other options\", \"data-ub-chef-more\", () => {\n        closeCard(list);\n        consult.seed += 1;\n        showOptions(assumed);\n      });\n      if (!consult.budgetSaid) {\n        say(\"chef\", budgetWords(consult.prefs));\n        consult.budgetSaid = true;\n      }\n      scrollDown();\n      mood(\"happy\", 1200);\n    }\n    function showLooks(noChange) {\n      say(\"chef\", \"These are our own studio renders of the door styles we make\" + (noChange ? \" - looking changes nothing\" : \"\") + \". Flat works in Egger MFC or painted MDF; Shaker and J-pull are routed from MDF and supplied primed. For whole-kitchen ideas, I can draw plans of 2-3 options for your room - say \\xABsuggest options\\xBB.\");\n      const c = card(\"ub-chef__card--q ub-chef__card--pics\");\n      c.setAttribute(\"data-ub-chef-question\", \"pictures\");\n      for (const [id, img, label] of [[\"slab\", \"flat\", \"Flat\"], [\"shaker\", \"shaker\", \"Shaker\"], [\"jpull\", \"jpull\", \"J-pull (handleless)\"]]) {\n        const b = doc2.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-chef__chip ub-chef__pic\";\n        b.setAttribute(\"data-ub-chef-chip\", label);\n        if (FRONT_THUMBS[img]) {\n          const im = doc2.createElement(\"img\");\n          im.src = FRONT_THUMBS[img];\n          im.alt = label + \" door\";\n          im.width = 72;\n          im.height = 72;\n          b.appendChild(im);\n        }\n        const s = doc2.createElement(\"span\");\n        s.textContent = label;\n        b.appendChild(s);\n        b.addEventListener(\"click\", () => {\n          closeCard(c);\n          say(\"you\", label);\n          consult.prefs.style = id;\n          const now = (ctx.scene().kitchen || {}).frontStyle || \"slab\";\n          if (now === id) say(\"chef\", \"Your kitchen already has \" + STYLE_NAME[id] + \" doors.\");\n          else propose([{ op: \"style\", style: id }], \"Shall I show \" + STYLE_NAME[id] + \" doors on your kitchen?\" + (id !== \"slab\" ? \" \" + STYLE_NAME[id] + \" fronts are primed MDF, quoted rather than priced here.\" : \"\"));\n        });\n        c.appendChild(b);\n      }\n      scrollDown();\n    }\n    async function ask(text) {\n      const t = String(text || \"\").trim();\n      if (!t || busy) return;\n      say(\"you\", t);\n      input.value = \"\";\n      if (voice) voice.clear();\n      const it = intentOf(t);\n      Object.assign(consult.prefs, it.prefs);\n      if (consult.current && (it.intent === \"command\" || it.intent === \"advice\") && Object.keys(it.prefs).some((k) => k !== \"budgetIncludes\") && !quickPhraseOps(t)) {\n        say(\"chef\", \"Got it.\");\n        mood(\"think\", 700);\n        return askNext();\n      }\n      if (it.prefs.budget && it.intent !== \"advice\") {\n        say(\"chef\", budgetWords(consult.prefs));\n        consult.budgetSaid = true;\n      } else if (it.prefs.budget) consult.budgetSaid = true;\n      if (it.intent === \"greet\") {\n        say(\"chef\", quickPhrase(\"hi\").reply);\n        mood(\"happy\", 1200);\n        return;\n      }\n      {\n        const low = t.toLowerCase();\n        const ipreset = /\\bisland\\b/.test(low) ? islandPresets().find((p) => new RegExp(\"\\\\b\" + p.id + \"\\\\b|\\\\b\" + p.label.toLowerCase() + \"\\\\b\").test(low)) : null;\n        if (ipreset && it.intent !== \"advice\") {\n          const isl = inventory(ctx.scene()).cabinets.filter((c) => c.row === \"island\");\n          const sel = isl.find((c) => c.id === ctx.scene().selectedId);\n          if (!isl.length) {\n            say(\"chef\", \"There's no island in the plan - say \\xABadd an island\\xBB first.\");\n            return;\n          }\n          if (isl.length > 1 && !sel) {\n            say(\"chef\", \"There are \" + isl.length + \" islands - tap the one you mean in the plan, then ask again.\");\n            return;\n          }\n          const u = sel || isl[0];\n          if (pending) {\n            closeCard(pending.card);\n            pending = null;\n          }\n          ctx.act(\"select\", { id: u.id });\n          ctx.act(\"view.reveal\", { id: u.id });\n          return propose([{ op: \"islandPreset\", id: u.id, preset: ipreset.id }], \"Make the island \\xAB\" + ipreset.label + \"\\xBB - \" + ipreset.bays.length + \" sections (\" + ipreset.bays.map((w, i) => w + \" mm \" + ipreset.kinds[i]).join(\", \") + \")?\");\n        }\n        if (/\\b(presets?|what (cabinets )?can (you|i) add|which cabinets can)\\b/.test(low)) {\n          say(\"chef\", \"Cabinets I can add: \" + CATALOGUE_TYPES.map(typeWords).join(\", \") + \". Island presets: \" + islandPresets().map((p) => p.label + \" (\" + p.bays.length + \" sections)\").join(\", \") + \". And 2-3 whole-kitchen layouts for your room - say \\xABsuggest options\\xBB.\");\n          return;\n        }\n        const tq = parseTarget(t) || (/\\b(this|that|the selected) (one|cabinet|unit|cupboard)\\b/.test(low) && ctx.scene().selectedId ? { id: ctx.scene().selectedId } : null);\n        if (tq && it.intent !== \"advice\") {\n          if (pending) {\n            closeCard(pending.card);\n            pending = null;\n          }\n          return targetEdit(t, tq);\n        }\n        const tool = toolFor(t);\n        if (tool) return void openTool(tool);\n        if (/\\bhow many\\b|\\b(list|show) (the |my )?cabinets\\b|\\bwhat('s| is) in (my|the) (plan|kitchen)\\b/.test(low)) {\n          say(\"chef\", inventoryWords(inventory(ctx.scene())));\n          return;\n        }\n        if (/\\bwhat (have|did) i (chosen|choose|picked|pick|said|say)\\b|\\bmy (answers|choices) so far\\b/.test(low)) {\n          const a = answerSummary(consult.prefs);\n          say(\"chef\", a.length ? \"So far: \" + a.join(\", \") + \".\" : \"Nothing chosen yet.\");\n          return;\n        }\n      }\n      if (it.intent === \"undo\" || it.intent === \"redo\") {\n        const out = perform([{ op: it.intent }]);\n        finish3(out, out.failed ? null : it.intent === \"undo\" ? \"Undone.\" : \"Redone.\");\n        return;\n      }\n      if (it.intent === \"score\") {\n        const out = perform([{ op: \"score\" }]);\n        finish3(out, null);\n        return;\n      }\n      if (it.intent === \"consult\") {\n        if (pending) {\n          closeCard(pending.card);\n          pending = null;\n        }\n        if (it.noChange) say(\"chef\", \"I will not change your plan - here are ideas to look at. Nothing goes in unless you press Apply.\");\n        if (it.layout) consult.layout = it.layout;\n        if (consult.current) {\n          consult.asked = consult.asked.filter((x) => x !== consult.current);\n          consult.current = null;\n        }\n        wholeKitchen();\n        if (it.skip) return suggestNow();\n        return askNext();\n      }\n      if (it.intent === \"pictures\") {\n        if (pending) {\n          closeCard(pending.card);\n          pending = null;\n        }\n        return showLooks(it.noChange);\n      }\n      if (it.intent === \"advice\") {\n        const local2 = adviceFor(t, scoreNow());\n        if (!local2) return server(t, true);\n        say(\"chef\", local2);\n        mood(\"happy\", 1200);\n        if (/\\b(layout|style|kitchen|recommend|ask)\\b/.test(t.toLowerCase()) && nextQuestion(consult.prefs, consult.asked, guideFacts())) {\n          wholeKitchen();\n          askNext();\n        }\n        return;\n      }\n      if (/\\b(washing machine|washer|dishwasher|dish washer|sink|tumble dryer)\\b/i.test(t)) {\n        say(\"chef\", \"The planner cannot place a washing machine, dishwasher or sink yet, so I cannot add one or check how it fits - the kitchen score lists them as not checked. Tell the team the model you want when you order and they will plan around it. I have not changed your plan.\");\n        mood(\"think\", 1600);\n        return;\n      }\n      const local = quickPhrase(t, finishesList());\n      if (local && local.ops.length) {\n        if (local.ops[0].op === \"wand\") {\n          consult.layout = local.ops[0].layout !== \"auto\" ? local.ops[0].layout : null;\n          wholeKitchen();\n          return askNext();\n        }\n        return propose(local.ops);\n      }\n      if (local && local.reply) {\n        say(\"chef\", local.reply);\n        return;\n      }\n      return server(t, false);\n    }\n    async function server(t, adviceOnly) {\n      busy = true;\n      mood(\"think\");\n      status.textContent = \"Thinking\\u2026\";\n      let r = null;\n      try {\n        const res = await win2.fetch(API2, {\n          method: \"POST\",\n          headers: { \"Content-Type\": \"application/json\" },\n          credentials: \"omit\",\n          body: JSON.stringify({\n            text: t,\n            visitor: visitor(),\n            state: stateNow(),\n            history: chat.slice(-7, -1),\n            ...adviceOnly ? { advice: true } : {},\n            ...win2.navigator && win2.navigator.webdriver === true ? { probe: true } : {}\n          })\n        });\n        const j = await res.json().catch(() => null);\n        r = { status: res.status, json: j };\n      } catch {\n        r = { status: 0, json: null };\n      }\n      busy = false;\n      status.textContent = \"Ready to help\";\n      if (!r.json || r.json.ok !== true) {\n        mood(\"oops\", 1800);\n        say(\"chef\", r.json && r.json.error || \"I cannot reach my notes just now - I can still suggest kitchen options, check your kitchen, or add a cabinet for you.\");\n        return;\n      }\n      const ops = (Array.isArray(r.json.ops) ? r.json.ops : []).filter((o) => o && [\"add\", \"remove\", \"finish\", \"room\", \"select\", \"style\", \"wand\", \"undo\", \"redo\", \"score\"].includes(o.op));\n      if (r.json.reply) say(\"chef\", r.json.reply);\n      if (adviceOnly) {\n        if (ops.some((o) => ![\"score\"].includes(o.op))) say(\"chef\", \"I have not changed your plan.\");\n        mood(\"happy\", 1200);\n        return;\n      }\n      const wand = ops.find((o) => o.op === \"wand\");\n      if (wand) {\n        consult.layout = wand.layout && wand.layout !== \"auto\" ? wand.layout : null;\n        wholeKitchen();\n        return askNext();\n      }\n      const now = ops.filter((o) => o.op === \"score\");\n      const later = ops.filter((o) => ![\"score\", \"undo\", \"redo\"].includes(o.op));\n      if (now.length) finish3(perform(now), null);\n      if (later.length) propose(later);\n      else if (!r.json.reply && !now.length) say(\"chef\", \"Done.\");\n      mood(r.json.mood === \"think\" ? \"think\" : \"happy\", 1600);\n    }\n    function finish3(out, reply) {\n      const text = [reply].concat(out.said).filter(Boolean).join(\" \");\n      say(\"chef\", text || (out.failed ? \"That did not work.\" : \"Done.\"));\n      if (out.changed && !out.failed) sparkle();\n      mood(out.failed ? \"oops\" : \"happy\", 1600);\n    }\n    const micBtn = q(\"[data-ub-chef-mic]\"), voiceEl = q(\"[data-ub-chef-voice]\");\n    let voice = null;\n    if (micBtn) {\n      const back2 = win2.location && win2.location.pathname + win2.location.search || \"/\";\n      const v = createVoice({\n        win: win2,\n        button: micBtn,\n        status: voiceEl,\n        loginUrl: \"/account/login?checkout_url=\" + encodeURIComponent(back2),\n        /* what was already typed stays: the words are added after it, all of it editable before Send */\n        onText: (text) => {\n          input.value = input.value.trim() ? input.value.trim() + \" \" + text : text;\n          mood(\"listen\", 1500);\n          try {\n            input.focus({ preventScroll: true });\n          } catch {\n          }\n        },\n        onSignIn: (url) => {\n          if (voiceEl.querySelector(\"a\")) return;\n          const a = doc2.createElement(\"a\");\n          a.href = url;\n          a.textContent = \" Sign in\";\n          a.setAttribute(\"data-ub-chef-signin\", \"\");\n          voiceEl.appendChild(a);\n        }\n      });\n      voice = { clear() {\n        if (v.state() !== \"recording\" && v.state() !== \"transcribing\") {\n          voiceEl.textContent = \"\";\n          voiceEl.hidden = true;\n        }\n      }, state: v.state, tap: v.tap, cancel: v.cancel };\n    }\n    const tail = q(\"[data-ub-chef-tail]\");\n    let dock = null, lastW = 288;\n    function dockEl() {\n      if (!dock) {\n        dock = doc2.createElement(\"div\");\n        dock.className = \"ub-chef-dock\";\n        dock.setAttribute(\"data-ub-chef-dock\", \"\");\n        dock.hidden = true;\n        main.parentNode.insertBefore(dock, main.nextSibling);\n      }\n      return dock;\n    }\n    function moveTo(host, before) {\n      if (panel.parentNode === host) return;\n      const had = doc2.activeElement && panel.contains(doc2.activeElement) ? doc2.activeElement : null;\n      host.insertBefore(panel, before || null);\n      if (had) try {\n        had.focus({ preventScroll: true });\n      } catch {\n      }\n    }\n    function clearPlace() {\n      box3.classList.remove(\"is-out\", \"is-below\");\n      panel.removeAttribute(\"data-ub-chef-place\");\n      for (const k of [\"position\", \"left\", \"top\", \"right\", \"bottom\", \"width\", \"height\", \"maxHeight\"]) panel.style[k] = \"\";\n      if (tail) {\n        tail.hidden = true;\n        tail.style.left = tail.style.top = \"\";\n      }\n    }\n    function inside() {\n      clearPlace();\n      moveTo(box3, tail);\n      if (dock) dock.hidden = true;\n    }\n    function outside() {\n      if (!win2.getComputedStyle) return false;\n      const de = doc2.documentElement;\n      const vw = de && de.clientWidth ? de.clientWidth : win2.innerWidth, vh = win2.innerHeight;\n      if (panel.parentNode === box3 && !panel.style.width) lastW = parseFloat(win2.getComputedStyle(panel).width) || lastW;\n      const st = main.getBoundingClientRect(), bx2 = box3.getBoundingClientRect(), bs = win2.getComputedStyle(btn);\n      const size3 = parseFloat(bs.width) || 56;\n      const icon2 = { left: bx2.right - size3, right: bx2.right, top: bx2.bottom - size3, bottom: bx2.bottom };\n      const head = parseFloat(win2.getComputedStyle(root).getPropertyValue(\"--ub-head\")) || 0;\n      const edge = consentEdge();\n      const pl = chatPlacement({ vw, vh: edge != null ? Math.min(vh, edge) : vh, stage: st, icon: icon2, width: lastW, height: Math.min(460, Math.round(vh * 0.64)), topInset: head });\n      panel.setAttribute(\"data-ub-chef-why\", pl.why || \"\");\n      if (pl.mode !== \"out\") return false;\n      clearPlace();\n      moveTo(box3, tail);\n      if (dock) dock.hidden = true;\n      panel.style.position = \"fixed\";\n      panel.style.right = \"auto\";\n      panel.style.bottom = \"auto\";\n      const o = fixedOrigin(panel, win2);\n      if (o.clip && (pl.left < o.clip.left || pl.left + pl.width > o.clip.right || pl.top < o.clip.top || pl.top + pl.height > o.clip.bottom)) {\n        panel.style.position = panel.style.right = panel.style.bottom = \"\";\n        panel.setAttribute(\"data-ub-chef-why\", \"a clipping container of the page\");\n        return false;\n      }\n      box3.classList.add(\"is-out\");\n      panel.setAttribute(\"data-ub-chef-place\", \"out-\" + pl.side);\n      panel.style.left = pl.left - o.x + \"px\";\n      panel.style.top = pl.top - o.y + \"px\";\n      panel.style.width = pl.width + \"px\";\n      panel.style.height = pl.height + \"px\";\n      panel.style.maxHeight = pl.height + \"px\";\n      if (tail) {\n        const cy = Math.min(Math.max((icon2.top + icon2.bottom) / 2, pl.top + 14), pl.top + pl.height - 14);\n        tail.hidden = false;\n        tail.setAttribute(\"data-side\", pl.side);\n        tail.style.left = (pl.side === \"right\" ? pl.left - 6 : pl.left + pl.width - 6) - o.x + \"px\";\n        tail.style.top = cy - 6 - o.y + \"px\";\n      }\n      return true;\n    }\n    function below() {\n      if (doc2.fullscreenElement || !main.parentNode) return false;\n      if (panel.getAttribute(\"data-ub-chef-place\") === \"below\" && panel.parentNode === dock) return true;\n      clearPlace();\n      moveTo(dockEl());\n      dock.hidden = false;\n      box3.classList.add(\"is-below\");\n      panel.setAttribute(\"data-ub-chef-place\", \"below\");\n      return true;\n    }\n    function consentEdge() {\n      try {\n        const b = doc2.querySelector(CONSENT_SEL);\n        if (!b || !win2.getComputedStyle) return null;\n        const s = win2.getComputedStyle(b);\n        return overlayEdge(b.getBoundingClientRect(), win2.innerHeight, s.display !== \"none\" && s.visibility !== \"hidden\" && parseFloat(s.opacity || \"1\") > 0);\n      } catch {\n        return null;\n      }\n    }\n    let shrunk = false;\n    function avoid(allowScroll) {\n      const edge = consentEdge(), placeNow = panel.getAttribute(\"data-ub-chef-place\") || \"in\";\n      if (edge == null) {\n        if (shrunk && placeNow === \"below\") {\n          panel.style.height = \"\";\n          panel.style.maxHeight = \"\";\n        }\n        shrunk = false;\n        return;\n      }\n      const lim = edge - 8;\n      let pr = panel.getBoundingClientRect();\n      if (pr.bottom <= lim) return;\n      const fixed = panel.style.position === \"fixed\";\n      if (!fixed && allowScroll && win2.scrollBy) {\n        const head = parseFloat(win2.getComputedStyle(root).getPropertyValue(\"--ub-head\")) || 0;\n        const d = Math.min(pr.bottom - lim, Math.max(0, pr.top - (head + 8)));\n        if (d > 0.5) {\n          try {\n            win2.scrollBy(0, Math.ceil(d));\n          } catch {\n          }\n          pr = panel.getBoundingClientRect();\n        }\n      }\n      if (pr.bottom > lim && (fixed || placeNow === \"below\")) {\n        const h = Math.floor(lim - pr.top);\n        if (h >= 120 && h < pr.height) {\n          panel.style.height = h + \"px\";\n          panel.style.maxHeight = h + \"px\";\n          shrunk = true;\n        }\n      }\n    }\n    let fitRaf = 0;\n    const fitSoon = () => {\n      if (panel.hidden || fitRaf) return;\n      fitRaf = (win2.requestAnimationFrame || ((f) => win2.setTimeout(f, 16)))(() => {\n        fitRaf = 0;\n        fit();\n      });\n    };\n    function fit(allowScroll) {\n      if (panel.hidden) return;\n      try {\n        if (outside()) {\n          avoid(allowScroll);\n          return;\n        }\n        if (below()) {\n          avoid(allowScroll);\n          return;\n        }\n        inside();\n        const bar = main.querySelector(\".ub-lab__dock--top\");\n        if (!bar || !win2.getComputedStyle) return;\n        const tb = toolbarRect(main, bar);\n        const st = main.getBoundingClientRect(), bx2 = box3.getBoundingClientRect(), bt = btn.getBoundingClientRect();\n        const ps = win2.getComputedStyle(panel);\n        const css2 = Math.min(parseFloat(ps.height) || Infinity, parseFloat(ps.maxHeight) || Infinity);\n        const shown = bt.height > 0;\n        const gap = shown ? parseFloat(win2.getComputedStyle(box3).rowGap || win2.getComputedStyle(box3).gap) || 8 : 0;\n        const h = chatMaxHeight({ stageBottom: st.bottom, toolbarBottom: tb.bottom, chefBottomGap: st.bottom - bx2.bottom, buttonHeight: shown ? bt.height : 0, gap, cssMax: css2 });\n        if (h != null && tb.height > 0 && st.height > 0) {\n          panel.style.maxHeight = h + \"px\";\n          panel.style.height = h + \"px\";\n        }\n        avoid(allowScroll);\n      } catch {\n      }\n    }\n    let edgeTimer = 0, lastEdge = null;\n    function watchConsent(on) {\n      if (edgeTimer) {\n        win2.clearInterval(edgeTimer);\n        edgeTimer = 0;\n      }\n      if (!on || !win2.setInterval) return;\n      lastEdge = consentEdge();\n      edgeTimer = win2.setInterval(() => {\n        const e = consentEdge();\n        if (e === lastEdge) return;\n        lastEdge = e;\n        if (!panel.hidden) fit(true);\n      }, 800);\n    }\n    function open() {\n      panel.hidden = false;\n      btn.setAttribute(\"aria-expanded\", \"true\");\n      box3.classList.add(\"is-open\");\n      fit(true);\n      if (panel.getAttribute(\"data-ub-chef-place\") === \"below\" && dock && dock.scrollIntoView) try {\n        dock.scrollIntoView({ block: \"nearest\", behavior: reduced() || consentEdge() != null ? \"auto\" : \"smooth\" });\n        avoid(true);\n      } catch {\n      }\n      try {\n        input.focus({ preventScroll: true });\n      } catch {\n      }\n      log.scrollTop = log.scrollHeight;\n      watchConsent(true);\n    }\n    function close() {\n      if (voice && voice.cancel) voice.cancel();\n      panel.hidden = true;\n      btn.setAttribute(\"aria-expanded\", \"false\");\n      box3.classList.remove(\"is-open\");\n      watchConsent(false);\n      clearPlace();\n      if (dock) dock.hidden = true;\n    }\n    try {\n      win2.addEventListener(\"resize\", () => fit(true));\n      win2.addEventListener(\"scroll\", (e) => {\n        const t = e && e.target;\n        if (t && t.nodeType === 1 && (box3.contains(t) || dock && dock.contains(t))) return;\n        fitSoon();\n      }, { capture: true, passive: true });\n      doc2.addEventListener(\"fullscreenchange\", () => fit(true));\n    } catch {\n    }\n    btn.addEventListener(\"click\", () => {\n      if (panel.hidden) open();\n      else close();\n    });\n    q(\"[data-ub-chef-close]\").addEventListener(\"click\", close);\n    q(\"[data-ub-chef-form]\").addEventListener(\"submit\", (e) => {\n      e.preventDefault();\n      ask(input.value);\n    });\n    input.addEventListener(\"input\", () => {\n      if (!busy) mood(input.value ? \"listen\" : \"idle\");\n    });\n    input.addEventListener(\"keydown\", (e) => {\n      e.stopPropagation();\n    });\n    root.__ubChef = {\n      ask,\n      open,\n      close,\n      fit,\n      quickPhrase,\n      apply,\n      inventory: () => inventory(ctx.scene()),\n      voice: () => voice ? voice.state() : \"none\",\n      pending: () => pending ? pending.ops.slice() : null,\n      state: () => ({ busy, mood: box3.getAttribute(\"data-ub-chef-mood\"), messages: chat.slice(), prefs: { ...consult.prefs } })\n    };\n    return { sync() {\n    }, ask, open, close, apply };\n  }\n\n  // v2/src/ui/decor-viewer.js\n  var BOARD = \"1300 \\xD7 2800 mm\";\n  var groupName = (g2) => {\n    const x = DECOR_GROUPS.find((r) => r[0] === g2);\n    return x ? x[1] : \"\";\n  };\n  function decorView(d) {\n    if (!d) return { src: null, hi: null, whole: false, sample: false, source: \"\", note: \"\" };\n    const surf = decorSurface(d);\n    const solid = d.kind === \"solid\";\n    const plain2 = solid ? \"Plain colour: the whole board is this one colour\" + (surf.relief ? \", with a wood-grain relief that a photo does not show.\" : \".\") : \"\";\n    if (d.scale === \"board\" && d.img) {\n      return {\n        src: decorImageUrl(d, 1600),\n        hi: decorImageUrl(d, 4e3),\n        whole: true,\n        sample: false,\n        source: \"Whole board, \" + BOARD + \" - EGGER full-board image\",\n        note: plain2\n      };\n    }\n    if (!solid && d.pack && d.pack.repeat === \"board\" && d.pack.url) {\n      return {\n        src: d.pack.url,\n        hi: d.pack.high || d.pack.url,\n        whole: true,\n        sample: false,\n        source: \"Whole board, \" + BOARD + \" - from the EGGER Board file\",\n        note: \"\"\n      };\n    }\n    if (!solid && d.pack && d.pack.repeat === \"sample\" && d.pack.url) {\n      const mm = Math.round(d.pack.mm[0]) + \" \\xD7 \" + Math.round(d.pack.mm[1]) + \" mm\";\n      return {\n        src: d.pack.high || d.pack.url,\n        hi: d.pack.high || d.pack.url,\n        whole: false,\n        sample: true,\n        source: \"Sample only - Egger measured sample, \" + mm,\n        note: \"Not the whole board: no full-board image of this decor is available. The pattern on a real board is larger and varies.\"\n      };\n    }\n    if (d.img) {\n      return {\n        src: decorImageUrl(d, 1600),\n        hi: decorImageUrl(d, 4e3),\n        whole: false,\n        sample: true,\n        source: solid ? \"Shop photo of the colour\" : \"Sample only - shop product photo\",\n        note: solid ? plain2 : \"Not the whole board: a close-up of the decor. No full-board image of this decor is available.\"\n      };\n    }\n    return { src: null, hi: null, whole: false, sample: false, source: \"No image of this decor\", note: plain2 };\n  }\n  function createDecorViewer(doc2, host) {\n    const el = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const uid = \"ub-dview-\" + Math.random().toString(36).slice(2, 8);\n    const wrap = el(\"div\", \"ub-lab__dview\", { \"data-ub-dview\": \"\", hidden: \"\" });\n    const box3 = el(\"div\", \"ub-lab__dviewbox\", { role: \"dialog\", \"aria-modal\": \"true\", \"aria-labelledby\": uid + \"-t\", \"aria-describedby\": uid + \"-s\" });\n    wrap.appendChild(box3);\n    const head = el(\"div\", \"ub-lab__dviewhead\", {});\n    const title = el(\"h2\", \"ub-lab__dviewtitle\", { id: uid + \"-t\", \"data-ub-dviewtitle\": \"\" });\n    const x = el(\"button\", \"ub-lab__dviewx\", { type: \"button\", \"aria-label\": \"Close board view\", \"data-ub-dviewclose\": \"\" }, \"\\xD7\");\n    head.appendChild(title);\n    head.appendChild(x);\n    box3.appendChild(head);\n    const meta = el(\"p\", \"ub-lab__dviewmeta\", { \"data-ub-dviewmeta\": \"\" });\n    box3.appendChild(meta);\n    const fig = el(\"figure\", \"ub-lab__dviewfig\", { \"data-ub-dviewfig\": \"\" });\n    const img = el(\"img\", \"ub-lab__dviewimg\", { alt: \"\", decoding: \"async\", \"data-ub-dviewimg\": \"\" });\n    const state2 = el(\"p\", \"ub-lab__dviewstate\", { \"data-ub-dviewstate\": \"\", \"aria-live\": \"polite\" });\n    const chip = el(\"span\", \"ub-lab__dviewchip\", { \"aria-hidden\": \"true\", hidden: \"\" });\n    fig.appendChild(img);\n    fig.appendChild(chip);\n    fig.appendChild(state2);\n    box3.appendChild(fig);\n    const src = el(\"p\", \"ub-lab__dviewsrc\", { id: uid + \"-s\", \"data-ub-dviewsrc\": \"\" });\n    box3.appendChild(src);\n    const foot2 = el(\"div\", \"ub-lab__dviewfoot\", {});\n    const full = el(\"a\", \"ub-lab__dviewfull\", { target: \"_blank\", rel: \"noopener\", \"data-ub-dviewfull\": \"\" }, \"Full resolution \\u2197\");\n    const use = el(\"button\", \"ub-lab__btn ub-lab__dviewuse\", { type: \"button\", \"data-ub-dviewuse\": \"\" }, \"Use this decor\");\n    const back = el(\"button\", \"ub-lab__btn ub-lab__dviewback\", { type: \"button\", \"data-ub-dviewback\": \"\" }, \"Back to the library\");\n    foot2.appendChild(full);\n    foot2.appendChild(back);\n    foot2.appendChild(use);\n    box3.appendChild(foot2);\n    (host || doc2.body).appendChild(wrap);\n    const st = { d: null, opener: null, onUse: null, seq: 0 };\n    function setState(kind, text) {\n      fig.setAttribute(\"data-ub-dviewload\", kind);\n      state2.textContent = text || \"\";\n      state2.hidden = !text;\n    }\n    img.addEventListener(\"load\", () => {\n      if (st.d) setState(\"ok\", \"\");\n    });\n    img.addEventListener(\"error\", () => {\n      if (!st.d) return;\n      img.hidden = true;\n      chip.hidden = false;\n      chip.setAttribute(\"style\", \"background:#\" + st.d.hex);\n      full.hidden = true;\n      setState(\"error\", \"The image of \" + st.d.code + \" \" + st.d.tex + \" could not be loaded. The block shows its colour only, not its pattern.\");\n    });\n    function open(d, opts) {\n      if (!d) return;\n      const o = opts || {};\n      st.d = d;\n      st.opener = o.opener || doc2.activeElement;\n      st.onUse = o.onUse || null;\n      st.seq++;\n      const v = decorView(d), surf = decorSurface(d), bd = decorBoard(d);\n      title.textContent = \"\";\n      title.appendChild(el(\"b\", \"\", {}, d.code + \" \" + d.tex));\n      title.appendChild(doc2.createTextNode(\" \" + d.name));\n      meta.textContent = [\n        \"Egger \" + d.code,\n        \"texture \" + d.tex + \" (\" + surf.name + \")\",\n        groupName(d.group),\n        bd ? bd.mm + \" mm board\" : \"\"\n      ].filter(Boolean).join(\" \\xB7 \");\n      src.textContent = v.source + (v.note ? \". \" + v.note : \"\");\n      wrap.setAttribute(\"data-ub-dviewkind\", v.whole ? \"board\" : v.sample ? \"sample\" : \"none\");\n      wrap.setAttribute(\"data-ub-dviewdecor\", d.key);\n      chip.hidden = true;\n      if (v.src) {\n        img.hidden = false;\n        img.setAttribute(\"alt\", (v.whole ? \"Whole board of \" : v.sample ? \"Sample of \" : \"\") + \"Egger \" + d.code + \" \" + d.tex + \" \" + d.name);\n        setState(\"loading\", v.whole ? \"Loading the whole-board image\\u2026\" : \"Loading the image\\u2026\");\n        img.removeAttribute(\"src\");\n        img.setAttribute(\"src\", v.src);\n        full.hidden = !v.hi;\n        if (v.hi) full.setAttribute(\"href\", v.hi);\n      } else {\n        img.hidden = true;\n        img.removeAttribute(\"src\");\n        chip.hidden = false;\n        chip.setAttribute(\"style\", \"background:#\" + d.hex);\n        full.hidden = true;\n        setState(\"error\", \"There is no image of this decor. The block shows its colour only.\");\n      }\n      use.hidden = !st.onUse;\n      use.textContent = \"Use \" + d.code + \" \" + d.tex;\n      wrap.removeAttribute(\"hidden\");\n      try {\n        x.focus({ preventScroll: true });\n      } catch {\n        x.focus();\n      }\n    }\n    function close() {\n      if (wrap.hasAttribute(\"hidden\")) return;\n      wrap.setAttribute(\"hidden\", \"\");\n      img.removeAttribute(\"src\");\n      const o = st.opener;\n      st.d = null;\n      st.onUse = null;\n      st.opener = null;\n      if (o && o.focus && o.isConnected !== false) {\n        try {\n          o.focus({ preventScroll: true });\n        } catch {\n          o.focus();\n        }\n      }\n    }\n    x.addEventListener(\"click\", close);\n    back.addEventListener(\"click\", close);\n    use.addEventListener(\"click\", () => {\n      const f = st.onUse, d = st.d;\n      close();\n      if (f && d) f(d.key);\n    });\n    wrap.addEventListener(\"click\", (e) => {\n      if (e && e.target === wrap) close();\n    });\n    wrap.addEventListener(\"keydown\", (e) => {\n      if (!e) return;\n      if (e.stopPropagation) e.stopPropagation();\n      if (e.key === \"Escape\") {\n        if (e.preventDefault) e.preventDefault();\n        close();\n        return;\n      }\n      if (e.key === \"Tab\") {\n        const f = [x, full, back, use].filter((n) => !n.hidden);\n        const i = f.indexOf(doc2.activeElement);\n        if (e.shiftKey ? i <= 0 : i === f.length - 1) {\n          if (e.preventDefault) e.preventDefault();\n          (e.shiftKey ? f[f.length - 1] : f[0]).focus();\n        }\n      }\n    });\n    for (const t of [\"pointerdown\", \"mousedown\", \"touchstart\", \"wheel\"]) wrap.addEventListener(t, (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    }, { passive: true });\n    return { el: wrap, open, close, isOpen: () => !wrap.hasAttribute(\"hidden\"), decor: () => st.d };\n  }\n  function decorViewerFor(doc2, near2) {\n    const host = near2 && near2.closest && near2.closest(\".ub-lab\") || doc2.querySelector(\".ub-lab\") || doc2.body;\n    if (!host.__ubDecorViewer) host.__ubDecorViewer = createDecorViewer(doc2, host);\n    return host.__ubDecorViewer;\n  }\n\n  // v2/src/ui/decor-picker.js\n  var norm = (s) => String(s || \"\").toLowerCase().replace(/\\s+/g, \" \").trim();\n  function hay(d) {\n    return norm(d.code + \" \" + d.tex + \" \" + d.code + d.tex + \" \" + d.name + \" \" + d.group + \" \" + decorSurface(d).name);\n  }\n  function decorMatches(d, query, group) {\n    if (group && group !== \"all\" && d.group !== group) return false;\n    const words2 = norm(query).split(\" \").filter(Boolean);\n    if (!words2.length) return true;\n    const h = hay(d);\n    return words2.every((w) => h.indexOf(w) >= 0);\n  }\n  function decorSwatchCss(d, px) {\n    if (!d) return \"#f4f4f1\";\n    if (d.kind === \"texture\") {\n      const u = decorImageUrl(d, px || 96);\n      if (u) return 'url(\"' + u.replace(/[\"\\\\]/g, \"\") + '\") center / cover, #' + d.hex;\n    }\n    return \"#\" + d.hex;\n  }\n  function createDecorPicker(doc2, opts) {\n    const o = opts || {};\n    const el = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const root = el(\"div\", \"ub-lab__dpk\", { \"data-ub-dpk\": o.id || \"\" });\n    const search = el(\"input\", \"ub-lab__dpksearch\", {\n      type: \"search\",\n      autocomplete: \"off\",\n      \"data-ub-dpksearch\": \"\",\n      placeholder: \"Code or name\",\n      \"aria-label\": (o.label || \"Egger decor\") + \": search\"\n    });\n    root.appendChild(search);\n    const chips = el(\"div\", \"ub-lab__dpkgroups\", { role: \"group\", \"aria-label\": \"Decor group\" });\n    root.appendChild(chips);\n    const groups = [[\"all\", \"All\"]].concat(DECOR_GROUPS);\n    const st = { group: \"all\", rows: null, built: false };\n    const chipBtns = [];\n    for (const g2 of groups) {\n      const b = el(\"button\", \"ub-lab__dpkgroup\", { type: \"button\", \"data-ub-dpkgroup\": g2[0], \"aria-pressed\": g2[0] === \"all\" ? \"true\" : \"false\" }, g2[1]);\n      b.addEventListener(\"click\", () => {\n        st.group = g2[0];\n        filter();\n      });\n      chips.appendChild(b);\n      chipBtns.push(b);\n    }\n    const count = el(\"span\", \"ub-lab__dpkcount\", { \"aria-live\": \"polite\", \"data-ub-dpkcount\": \"\" });\n    root.appendChild(count);\n    const viewBtn = el(\"button\", \"ub-lab__btn ub-lab__dpkview\", { type: \"button\", \"data-ub-dpkview\": \"\" });\n    viewBtn.appendChild(zoomIcon());\n    viewBtn.appendChild(doc2.createTextNode(\" View board\"));\n    root.appendChild(viewBtn);\n    viewBtn.addEventListener(\"click\", (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n      const r = (st.rows || []).find(([, d]) => o.isOn && o.isOn(d.key));\n      if (r) decorViewerFor(doc2, root).open(r[1], { opener: viewBtn, onUse: o.onPick ? (k) => o.onPick(k) : null });\n    });\n    const list = el(\"div\", \"ub-lab__dpklist\", { role: \"listbox\", \"aria-label\": o.label || \"Egger decors\" });\n    root.appendChild(list);\n    function zoomIcon() {\n      if (typeof doc2.createElementNS !== \"function\") return el(\"span\", \"\", { \"aria-hidden\": \"true\" }, \"+\");\n      const NS7 = \"http://www.w3.org/2000/svg\";\n      const svg2 = doc2.createElementNS(NS7, \"svg\");\n      for (const [k, v] of [[\"viewBox\", \"0 0 20 20\"], [\"width\", \"14\"], [\"height\", \"14\"], [\"aria-hidden\", \"true\"], [\"focusable\", \"false\"]]) svg2.setAttribute(k, v);\n      const p = doc2.createElementNS(NS7, \"path\");\n      p.setAttribute(\"d\", \"M8.5 3a5.5 5.5 0 1 1 0 11a5.5 5.5 0 0 1 0-11zm0 2.6v5.8M5.6 8.5h5.8M12.6 12.6l4.4 4.4\");\n      for (const [k, v] of [[\"fill\", \"none\"], [\"stroke\", \"currentColor\"], [\"stroke-width\", \"2\"], [\"stroke-linecap\", \"round\"]]) p.setAttribute(k, v);\n      svg2.appendChild(p);\n      return svg2;\n    }\n    function buildRows() {\n      if (st.built) return;\n      st.built = true;\n      st.rows = [];\n      for (const d of OFFERED_DECORS) {\n        const b = el(\"button\", \"ub-lab__dpkrow\", {\n          type: \"button\",\n          role: \"option\",\n          \"data-ub-decor\": d.key,\n          \"aria-pressed\": \"false\",\n          title: d.label + \" - \" + decorSurface(d).name + (decorSurface(d).approx ? \" (\" + decorSurface(d).approx + \")\" : \"\") + (d.kind !== \"texture\" ? \"\" : d.pack ? d.pack.repeat === \"sample\" ? \" - 3D: Egger measured sample, \" + Math.round(d.pack.mm[0]) + \" x \" + Math.round(d.pack.mm[1]) + \" mm, repeated (approximate beyond the sample)\" : \" - 3D: EGGER Board pattern, 1300 x 2800 mm\" : d.rawTex ? \" - 3D: EGGER Board file, 1300 x 2800 mm\" : d.scale === \"assumed\" ? \" - texture scale approximate\" : \"\")\n        });\n        const dot6 = el(\"span\", \"ub-lab__dpkdot\", { \"aria-hidden\": \"true\", style: \"background:#\" + d.hex });\n        if (d.kind === \"texture\") {\n          const im = el(\"img\", \"\", { alt: \"\", loading: \"lazy\", decoding: \"async\", src: decorImageUrl(d, 96) || \"\" });\n          dot6.appendChild(im);\n        }\n        b.appendChild(dot6);\n        b.appendChild(el(\"span\", \"ub-lab__dpkcode\", { \"aria-hidden\": \"true\" }, d.code));\n        const nm = el(\"span\", \"ub-lab__dpkname\", {});\n        nm.appendChild(el(\"b\", \"\", {}, d.code + \" \" + d.tex));\n        nm.appendChild(doc2.createTextNode(d.name));\n        b.appendChild(nm);\n        if (d.kind === \"solid\" && decorSurface(d).relief) b.appendChild(el(\"span\", \"ub-lab__dpkth\", { title: decorSurface(d).approx }, \"grain\"));\n        const bd = decorBoard(d);\n        if (bd && !bd.exact) {\n          const th = el(\"span\", \"ub-lab__dpkth\", { title: bd.note }, bd.mm + \" mm\");\n          b.appendChild(th);\n        }\n        b.addEventListener(\"click\", () => {\n          if (o.onPick) o.onPick(d.key);\n        });\n        const cell = el(\"span\", \"ub-lab__dpkcell\", { \"data-ub-dpkcell\": d.key });\n        cell.appendChild(b);\n        const v = decorView(d);\n        const what = v.whole ? \"View whole board\" : v.src ? \"View larger (sample image)\" : \"View\";\n        const z = el(\"button\", \"ub-lab__dpkzoom\", {\n          type: \"button\",\n          \"data-ub-dpkzoom\": d.key,\n          \"aria-label\": what + \": \" + d.code + \" \" + d.tex + \" \" + d.name,\n          title: what + \" - \" + d.code + \" \" + d.tex\n        });\n        z.appendChild(zoomIcon());\n        z.addEventListener(\"click\", (e) => {\n          if (e && e.stopPropagation) e.stopPropagation();\n          decorViewerFor(doc2, root).open(d, { opener: z, onUse: o.onPick && !o.viewOnly ? (k) => o.onPick(k) : null });\n        });\n        cell.appendChild(z);\n        list.appendChild(cell);\n        st.rows.push([b, d, cell]);\n      }\n    }\n    function filter() {\n      buildRows();\n      let n = 0, all = 0;\n      for (const [b, d, cell] of st.rows) {\n        const offered = !decorWithoutTape(d) || !!(o.isOn && o.isOn(d.key));\n        if (offered) all++;\n        const show2 = offered && decorMatches(d, search.value, st.group);\n        if (show2) {\n          b.removeAttribute(\"hidden\");\n          cell.removeAttribute(\"hidden\");\n          n++;\n        } else {\n          b.setAttribute(\"hidden\", \"\");\n          cell.setAttribute(\"hidden\", \"\");\n        }\n      }\n      for (const b of chipBtns) b.setAttribute(\"aria-pressed\", b.getAttribute(\"data-ub-dpkgroup\") === st.group ? \"true\" : \"false\");\n      count.textContent = n === all ? all + \" Egger decors\" : n + \" of \" + all + \" Egger decors\";\n    }\n    onDecorTape(() => {\n      if (st.built) filter();\n    });\n    loadDecorTape(doc2.defaultView);\n    search.addEventListener(\"input\", filter);\n    search.addEventListener(\"keydown\", (e) => {\n      if (e && e.key === \"Escape\" && search.value) {\n        e.stopPropagation();\n        search.value = \"\";\n        filter();\n      }\n    });\n    function sync() {\n      if (!st.built) filter();\n      for (const [b, d] of st.rows) {\n        const on = !!(o.isOn && o.isOn(d.key));\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      }\n      const cur = st.rows.find(([, d]) => o.isOn && o.isOn(d.key));\n      viewBtn.disabled = !cur;\n      viewBtn.setAttribute(\"aria-label\", cur ? \"View board: \" + cur[1].code + \" \" + cur[1].tex + \" \" + cur[1].name + \" (the decor chosen now)\" : \"View board: choose an Egger decor first, or use the magnifier on any decor tile\");\n      viewBtn.title = viewBtn.getAttribute(\"aria-label\");\n    }\n    return { el: root, sync, filter, search, viewBtn, rows: () => (st.rows || []).length };\n  }\n\n  // v2/src/ui/badge-hover.js\n  var GRACE_MS = 160;\n  var BRIDGE_PAD = 8;\n  var BADGE_R = 7.5;\n  var FINGER = 6;\n  var PAIR_DX = 18;\n  var ANCHOR_CLEAR = 18;\n  function badgeHover(ctx) {\n    if (ctx.__badgeHover) return ctx.__badgeHover;\n    const root = ctx.root, view = ctx.view;\n    const doc2 = root.ownerDocument;\n    const win2 = ctx.win || doc2 && doc2.defaultView || globalThis;\n    const canvas = root.querySelector ? root.querySelector(\".ub-lab__canvas\") : null;\n    const S2 = { id: null, via: null, overBadge: false, timer: null, lastTouch: 0, touch: null, pointerFocus: 0 };\n    const T3 = { move: null, sched: null, fired: null, cancel: null, hide: null, set: null, keptAtFire: null };\n    const tnow = () => win2.performance && win2.performance.now ? win2.performance.now() : Date.now();\n    const badges = [], frames = [], keeps = [];\n    const now = () => Date.now();\n    const scene = () => ctx.scene() || {};\n    const unitOf = (id) => id ? (scene().units || []).find((u) => u.id === id) || null : null;\n    const isBadge = (n) => !!n && badges.some((b) => b === n || b.contains && b.contains(n));\n    const pick = (x, y) => view && view.pickAt ? view.pickAt(x, y) : null;\n    const tapEcho = (e) => !!(e && e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) || now() - S2.lastTouch < 800;\n    const popupOpen = () => keeps.some((f) => {\n      try {\n        return !!f();\n      } catch {\n        return false;\n      }\n    });\n    function redraw() {\n      for (const f of frames) {\n        try {\n          f();\n        } catch {\n        }\n      }\n    }\n    function cancel() {\n      if (S2.timer) {\n        win2.clearTimeout(S2.timer);\n        S2.timer = null;\n        T3.cancel = tnow();\n      }\n    }\n    function set(id, via) {\n      cancel();\n      if (S2.id === id && S2.via === via) {\n        if (badges.some((b) => b.getAttribute(\"hidden\") !== null)) redraw();\n        return;\n      }\n      S2.id = id;\n      S2.via = via;\n      T3.set = tnow();\n      redraw();\n    }\n    function hide() {\n      cancel();\n      if (S2.id === null && S2.via === null) return;\n      S2.id = null;\n      S2.via = null;\n      S2.overBadge = false;\n      T3.hide = tnow();\n      redraw();\n    }\n    function focusOnBadge() {\n      return isBadge(doc2 && doc2.activeElement);\n    }\n    function keep() {\n      return S2.overBadge || popupOpen() || S2.via === \"key\" && (focusOnBadge() || doc2 && doc2.activeElement === canvas);\n    }\n    function schedule() {\n      if (S2.timer || S2.id === null && S2.via === null) return;\n      T3.sched = tnow();\n      S2.timer = win2.setTimeout(() => {\n        S2.timer = null;\n        T3.fired = tnow();\n        T3.keptAtFire = keep();\n        if (!T3.keptAtFire) hide();\n      }, GRACE_MS);\n    }\n    function inBridge(x, y) {\n      const u = target();\n      if (!u || !view || !view.unitAABB || !canvas || !canvas.getBoundingClientRect) return false;\n      let l = Infinity, t = Infinity, r = -Infinity, b = -Infinity;\n      const add = (px, py) => {\n        l = Math.min(l, px);\n        r = Math.max(r, px);\n        t = Math.min(t, py);\n        b = Math.max(b, py);\n      };\n      for (const el of badges) {\n        if (!el || el.getAttribute(\"hidden\") !== null || !el.getBoundingClientRect) continue;\n        const q = el.getBoundingClientRect();\n        if (q.width > 0) {\n          add(q.left, q.top);\n          add(q.right, q.bottom);\n        }\n      }\n      if (!(r > l)) return false;\n      const B = view.unitAABB(u);\n      const nd = B ? view.worldToNdc([(B.x0 + B.x1) / 2, B.y1, (B.z0 + B.z1) / 2]) : null;\n      if (nd) {\n        const c = canvas.getBoundingClientRect(), cs = view.canvasSize();\n        add(c.left + (nd[0] + 1) / 2 * (cs.w || c.width), c.top + (1 - nd[1]) / 2 * (cs.h || c.height));\n      }\n      return x >= l - BRIDGE_PAD && x <= r + BRIDGE_PAD && y >= t - BRIDGE_PAD && y <= b + BRIDGE_PAD;\n    }\n    function radialOpen() {\n      const L = root.querySelector ? root.querySelector(\"[data-ub-radial]\") : null;\n      return !!L && !L.hidden && L.getAttribute(\"hidden\") === null;\n    }\n    function target() {\n      const sc = scene();\n      if (popupOpen()) return unitOf(sc.selectedId);\n      if (radialOpen()) return null;\n      if (S2.via === \"key\") return unitOf(sc.selectedId);\n      const u = unitOf(S2.id);\n      if (!u && S2.id !== null) {\n        S2.id = null;\n        S2.via = null;\n      }\n      return u;\n    }\n    function move(x, y, buttons, overlay, ev) {\n      T3.move = tnow();\n      if (tapEcho(ev)) return;\n      if (buttons) return;\n      if (overlay) {\n        if (S2.id && inBridge(x, y)) cancel();\n        else schedule();\n        return;\n      }\n      const id = pick(x, y);\n      if (S2.id && id !== S2.id && inBridge(x, y)) {\n        cancel();\n        return;\n      }\n      if (id) {\n        if (S2.via === \"key\") S2.via = null;\n        set(id, \"mouse\");\n        return;\n      }\n      schedule();\n    }\n    function tap(x, y) {\n      const id = pick(x, y);\n      if (id) set(id, \"touch\");\n      else hide();\n    }\n    function ensureSelected() {\n      const u = target();\n      if (u && scene().selectedId !== u.id) ctx.act(\"select\", { id: u.id });\n      return u;\n    }\n    function anchor(u) {\n      const B = u && view && view.unitAABB ? view.unitAABB(u) : null;\n      if (!B) return null;\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      const toPx2 = (nd2) => [(nd2[0] + 1) / 2 * cw, (1 - nd2[1]) / 2 * ch];\n      const nd = view.worldToNdc([(B.x0 + B.x1) / 2, B.y1 + 40, (B.z0 + B.z1) / 2]);\n      if (!nd) return null;\n      let [px, py] = toPx2(nd);\n      for (const x of [B.x0, B.x1]) for (const y of [B.y0, B.y1]) for (const z of [B.z0, B.z1]) {\n        const c = view.worldToNdc([x, y, z]);\n        if (c) py = Math.min(py, toPx2(c)[1] - ANCHOR_CLEAR);\n      }\n      if (canvas && canvas.getBoundingClientRect && root.querySelectorAll) {\n        const cr = canvas.getBoundingClientRect();\n        const nums = [];\n        for (const n of root.querySelectorAll(\".ub-lab__sizenum\")) {\n          if (n.hidden || n.getAttribute(\"hidden\") !== null || !n.getBoundingClientRect) continue;\n          const q = n.getBoundingClientRect();\n          if (q.width > 0 && q.height > 0) nums.push({ l: q.left - cr.left - 2, r: q.right - cr.left + 2, t: q.top - cr.top - 2, b: q.bottom - cr.top + 2 });\n        }\n        for (let pass = 0; pass < 4 && nums.length; pass++) {\n          const box3 = { l: px - BADGE_R - 1, r: px + PAIR_DX + BADGE_R + 1, t: py - BADGE_R - FINGER, b: py + BADGE_R + FINGER };\n          const hit2 = nums.find((q) => q.l < box3.r && q.r > box3.l && q.t < box3.b && q.b > box3.t);\n          if (!hit2) break;\n          py = hit2.t - BADGE_R - FINGER - 1;\n        }\n      }\n      return { px, py, cw, ch };\n    }\n    const stage = canvas ? canvas.closest && canvas.closest(\".ub-lab__stage\") || canvas.parentNode || canvas : null;\n    if (stage && stage.addEventListener) {\n      stage.addEventListener(\"mousemove\", (e) => {\n        if (isBadge(e.target)) {\n          S2.overBadge = true;\n          cancel();\n          return;\n        }\n        move(e.clientX, e.clientY, e.buttons, e.target !== canvas, e);\n      });\n      stage.addEventListener(\"mouseleave\", (e) => {\n        if (S2.via === \"touch\") return;\n        if (!isBadge(e.relatedTarget)) {\n          S2.overBadge = false;\n          schedule();\n        }\n      });\n    }\n    if (canvas && canvas.addEventListener) {\n      canvas.addEventListener(\"mousedown\", (ev) => {\n        S2.pointerFocus = now();\n        if (tapEcho(ev)) return;\n        if (S2.via !== \"key\") hide();\n      });\n      canvas.addEventListener(\"touchstart\", (e) => {\n        S2.lastTouch = now();\n        S2.pointerFocus = now();\n        const t = e.touches && e.touches[0];\n        S2.touch = t && e.touches.length === 1 ? { x: t.clientX, y: t.clientY, at: now() } : null;\n      }, { passive: true });\n      canvas.addEventListener(\"touchend\", (e) => {\n        S2.lastTouch = now();\n        const t0 = S2.touch, t = e.changedTouches && e.changedTouches[0];\n        S2.touch = null;\n        if (!t0 || !t || now() - t0.at > 600 || Math.hypot(t.clientX - t0.x, t.clientY - t0.y) > 10) return;\n        tap(t.clientX, t.clientY);\n      }, { passive: true });\n      canvas.addEventListener(\"focus\", () => {\n        const fromPointer = now() - S2.pointerFocus < 500;\n        S2.pointerFocus = 0;\n        if (!fromPointer && scene().selectedId) set(scene().selectedId, \"key\");\n      });\n      canvas.addEventListener(\"blur\", (e) => {\n        S2.pointerFocus = 0;\n        if (S2.via === \"key\" && !isBadge(e.relatedTarget)) hide();\n      });\n    }\n    function register(btn, frame2, keepOpen) {\n      if (frame2) frames.push(frame2);\n      if (keepOpen) keeps.push(keepOpen);\n      if (!btn || !btn.addEventListener) return;\n      badges.push(btn);\n      btn.addEventListener(\"mouseenter\", () => {\n        S2.overBadge = true;\n        cancel();\n      });\n      btn.addEventListener(\"mouseleave\", (e) => {\n        S2.overBadge = false;\n        if (S2.via === \"touch\") return;\n        if (!isBadge(e.relatedTarget)) schedule();\n      });\n      btn.addEventListener(\"focusout\", (e) => {\n        const to = e.relatedTarget;\n        if (isBadge(to) || to === canvas) return;\n        if (S2.via === \"key\") hide();\n        else schedule();\n      });\n    }\n    const api = {\n      register,\n      target,\n      ensureSelected,\n      move,\n      tap,\n      hide,\n      schedule,\n      inBridge,\n      anchor,\n      state: () => ({ id: S2.id, via: S2.via, overBadge: S2.overBadge, pending: !!S2.timer }),\n      trace: () => Object.assign({ now: tnow(), grace: GRACE_MS, id: S2.id, via: S2.via, pending: !!S2.timer, overBadge: S2.overBadge }, T3)\n    };\n    ctx.__badgeHover = api;\n    if (root && !root.__ubHover) root.__ubHover = { state: api.state, trace: api.trace };\n    return api;\n  }\n\n  // v2/src/ui/finish-popup.js\n  function createFinishPopup(ctx, parts) {\n    const root = ctx.root, view = ctx.view;\n    const finBtn = root.querySelector(\"[data-ub-finbtn]\");\n    const finPop = root.querySelector(\"[data-ub-finpop]\");\n    const ovBtns = root.querySelectorAll(\"[data-ub-ov]\");\n    const finState = root.querySelector(\"[data-ub-finstate]\");\n    const trayOpen = () => !!(parts.tray && parts.tray.isOpen && parts.tray.isOpen() && !(parts.tray.isSlim && parts.tray.isSlim()));\n    function onOpenMenu(btn) {\n      if (!btn.getBoundingClientRect || !root.querySelectorAll) return false;\n      const r = btn.getBoundingClientRect();\n      if (!(r.width > 0)) return false;\n      const cx = r.left + r.width / 2, cy = r.top + r.height / 2;\n      for (const n of root.querySelectorAll(\".ub-lab__flyout:not([hidden])\")) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        const q = n.getBoundingClientRect();\n        if (q.width > 0 && cx >= q.left - 4 && cx <= q.right + 4 && cy >= q.top - 4 && cy <= q.bottom + 4) return true;\n      }\n      return false;\n    }\n    const hover = badgeHover(ctx);\n    hover.register(finBtn, () => drawFinishUI(), () => finPopOpen());\n    function finPopOpen() {\n      return !!(finPop && finPop.getAttribute && finPop.getAttribute(\"hidden\") === null);\n    }\n    function setFinPop(open) {\n      if (!finPop || !finBtn) return;\n      if (open) finPop.removeAttribute(\"hidden\");\n      else finPop.setAttribute(\"hidden\", \"\");\n      finBtn.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n      if (!open) hover.schedule();\n      if (open) {\n        try {\n          if (root.__ubDocks && root.__ubDocks.state && root.__ubDocks.state().flyout) root.__ubDocks.show(null);\n        } catch {\n        }\n        try {\n          const pb = finPop.querySelector(\"[data-ub-fintgt]\");\n          if (pb) setTgt(TG.cur || \"carcass\");\n        } catch {\n        }\n        syncFinPop();\n        const a = finAnchor();\n        if (a) placeFinPop(a.px, a.py, a.cw, a.ch);\n      }\n    }\n    function syncFinPop() {\n      const scene = ctx.scene();\n      const u = selected(scene);\n      if (!u) return;\n      ovBtns.forEach(function(b) {\n        const which = b.getAttribute(\"data-ub-ov\"), val = b.getAttribute(\"data-ub-ovval\");\n        const cur = which === \"carcass\" ? effCarcass(u, scene.kitchen) : effFronts(u, scene.kitchen);\n        const on = cur === val && !(which === \"fronts\" && u.frontMat === \"mdf-paint\");\n        b.classList.toggle(\"is-active\", on);\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n      });\n      for (const [box3, pk] of pickers) if (box3.open) {\n        try {\n          pk.sync();\n        } catch {\n        }\n      }\n      if (finState) {\n        const oc = okFinish(u.ovCarcass), of = okFinish(u.ovFronts), os = u.ovStyle ? styleOf(u.ovStyle) : null;\n        const painted = u.frontMat === \"mdf-paint\" ? \" Fronts now: painted MDF (whole kitchen) - pick White or Oak for Egger MFC on this cabinet only.\" : \"\";\n        finState.textContent = !oc && !of && !os ? \"Following the kitchen finishes.\" + painted : \"Own finish: \" + [oc ? \"carcass\" : null, of ? \"fronts\" : null, os ? styleWords(os.id) + \" door style\" : null].filter(Boolean).join(\" and \") + \". Fronts covers doors and drawer fronts; the plinth follows them unless set below.\" + painted;\n      }\n      syncPlinth(scene, u);\n    }\n    function drawFinishUI() {\n      const btn = finBtn, pop = finPop;\n      if (!btn) return;\n      try {\n        if (pop && pop.getAttribute(\"hidden\") === null && root.__ubBottomStrip && root.__ubBottomStrip().open && root.__ubBottomStrip().which !== \"thiscab\") {\n          setFinPop(false);\n          return;\n        }\n      } catch {\n      }\n      const why = (w) => {\n        if (btn.getAttribute(\"data-ub-why\") !== w) btn.setAttribute(\"data-ub-why\", w);\n      };\n      const u = hover.target();\n      if (!u) {\n        const st = hover.state ? hover.state() : {};\n        why(\"notarget \" + (st.id || \"-\") + \"/\" + (st.via || \"-\"));\n        btn.setAttribute(\"hidden\", \"\");\n        if (pop) pop.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      const a = hover.anchor(u);\n      if (!a) {\n        why(\"noanchor\");\n        btn.setAttribute(\"hidden\", \"\");\n        if (pop) pop.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      const cw = a.cw, ch = a.ch, px = a.px, py = a.py;\n      if (px < -40 || py < -40 || px > cw + 40 || py > ch + 40) {\n        why(\"off \" + Math.round(px) + \",\" + Math.round(py) + \" of \" + Math.round(cw) + \"x\" + Math.round(ch));\n        btn.setAttribute(\"hidden\", \"\");\n        if (pop) pop.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      why(\"shown\");\n      btn.removeAttribute(\"hidden\");\n      btn.style.left = Math.round(px) + \"px\";\n      btn.style.top = Math.round(py) + \"px\";\n      btn.classList.toggle(\"is-custom\", isCustom(u));\n      if (!finPopOpen() && onOpenMenu(btn)) {\n        why(\"menu\");\n        btn.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      placeFinPop(px, py, cw, ch);\n    }\n    function freeBox(cw, ch) {\n      const M = 8, box3 = { l: M, r: cw - M, t: M, b: ch - M };\n      const cv = root.querySelector(\".ub-lab__canvas\");\n      const cr = cv && cv.getBoundingClientRect ? cv.getBoundingClientRect() : null;\n      if (!cr || !cr.width) return box3;\n      const rectOf = (sel) => {\n        const e = root.querySelector(sel);\n        const r = e && e.getBoundingClientRect ? e.getBoundingClientRect() : null;\n        return r && r.width && r.height ? r : null;\n      };\n      const L = rectOf(\".ub-lab__dock--left\"), R4 = rectOf(\".ub-lab__dock--right\"), T3 = rectOf(\".ub-lab__dock--top\");\n      const G = 6;\n      if (L) box3.l = Math.max(box3.l, L.right - cr.left + G);\n      if (R4) box3.r = Math.min(box3.r, R4.left - cr.left - G);\n      if (T3) box3.t = Math.max(box3.t, T3.bottom - cr.top + G);\n      try {\n        const bs = root.__ubBottomStrip ? root.__ubBottomStrip() : null;\n        if (bs && bs.open && bs.which !== \"thiscab\" && bs.height > 0 && ch - bs.height - G - box3.t >= 120) box3.b = Math.min(box3.b, ch - bs.height - G);\n      } catch {\n      }\n      if (box3.r - box3.l < 160) {\n        box3.l = M;\n        box3.r = cw - M;\n      }\n      return box3;\n    }\n    function placeFinPop(px, py, cw, ch) {\n      const pop = finPop;\n      if (!pop || pop.getAttribute(\"hidden\") !== null) return;\n      const F = freeBox(cw, ch);\n      pop.style.maxWidth = Math.max(160, Math.round(F.r - F.l)) + \"px\";\n      pop.style.maxHeight = Math.max(120, Math.round(F.b - F.t)) + \"px\";\n      const pw = pop.offsetWidth || 212, phh = pop.offsetHeight || 157;\n      let left = px - pw / 2;\n      if (left + pw > F.r) left = F.r - pw;\n      if (left < F.l) left = F.l;\n      const topBelow = py + 22, topAbove = py - 22 - phh;\n      const top = topBelow >= F.t && topBelow + phh <= F.b ? topBelow : topAbove >= F.t ? topAbove : Math.max(F.t, F.b - phh);\n      pop.style.left = Math.round(left) + \"px\";\n      pop.style.top = Math.round(top) + \"px\";\n      pop.style.transform = \"none\";\n    }\n    function finAnchor() {\n      const u = selected(ctx.scene());\n      if (!u) return null;\n      return hover.anchor(u);\n    }\n    if (finBtn) finBtn.addEventListener(\"click\", function(e) {\n      if (trayOpen()) {\n        if (e && e.preventDefault) e.preventDefault();\n        if (e && e.stopImmediatePropagation) e.stopImmediatePropagation();\n      }\n    }, true);\n    if (finBtn) finBtn.addEventListener(\"click\", function(e) {\n      if (e && e.stopPropagation) e.stopPropagation();\n      if (!finPopOpen()) hover.ensureSelected();\n      setFinPop(!finPopOpen());\n    });\n    ovBtns.forEach(function(b) {\n      b.addEventListener(\"click\", function() {\n        const which = b.getAttribute(\"data-ub-ov\"), val = b.getAttribute(\"data-ub-ovval\");\n        if (!okFinish(val)) return;\n        ctx.act(\"unit.finish\", { which, value: val });\n      });\n    });\n    const pickers = [];\n    if (finPop && finState && ctx.doc && finPop.insertBefore) try {\n      for (const which of [\"carcass\", \"fronts\"]) {\n        const box3 = ctx.doc.createElement(\"details\");\n        box3.className = \"ub-lab__findpk\";\n        box3.setAttribute(\"data-ub-findpk\", which);\n        const sum = ctx.doc.createElement(\"summary\");\n        sum.textContent = (which === \"carcass\" ? \"Carcass\" : \"Fronts\") + \": all Egger decors\";\n        box3.appendChild(sum);\n        const pk = createDecorPicker(ctx.doc, {\n          viewOnly: true,\n          id: \"own-\" + which,\n          label: \"This cabinet \" + which + \", all Egger MFC\",\n          isOn: (key) => {\n            const scene = ctx.scene(), u = selected(scene);\n            if (!u) return false;\n            if (which === \"fronts\" && u.frontMat === \"mdf-paint\") return false;\n            return (which === \"carcass\" ? effCarcass(u, scene.kitchen) : effFronts(u, scene.kitchen)) === key;\n          },\n          onPick: (key) => {\n            if (okFinish(key)) ctx.act(\"unit.finish\", { which, value: key });\n          }\n        });\n        box3.appendChild(pk.el);\n        box3.addEventListener(\"toggle\", () => {\n          if (box3.open) pk.sync();\n        });\n        finPop.insertBefore(box3, finState);\n        pickers.push([box3, pk]);\n      }\n    } catch {\n      pickers.length = 0;\n    }\n    const PL = { box: null, btns: [], scope: null, ref: null, paintBox: null };\n    if (finPop && finState && ctx.doc && finPop.insertBefore) try {\n      const d = ctx.doc;\n      const mk = (tag, cls, attrs, text) => {\n        const n = d.createElement(tag);\n        if (cls) n.className = cls;\n        for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n        if (text != null) n.textContent = text;\n        return n;\n      };\n      const plAct = (value) => ctx.act(\"unit.finish\", { which: \"plinth\", value });\n      const row = mk(\"div\", \"ub-lab__finrow\", { role: \"group\", \"aria-label\": \"Plinths: this cabinet's plinth run\", \"data-ub-finplinth\": \"\" });\n      row.appendChild(mk(\"span\", \"\", { id: \"ub-fin-p\" }, \"Plinths\"));\n      const add = (parent, val, label, swatch, title) => {\n        const b = mk(\"button\", \"ub-lab__finsw\", {\n          type: \"button\",\n          \"data-ub-plinth\": val,\n          \"aria-pressed\": \"false\",\n          \"aria-label\": \"Plinths: \" + (title || label),\n          title: title || label\n        });\n        if (swatch) b.appendChild(mk(\"span\", \"ub-lab__swatch ub-lab__swatch--\" + swatch));\n        b.appendChild(d.createTextNode(label));\n        b.addEventListener(\"click\", () => plAct(val));\n        parent.appendChild(b);\n        PL.btns.push(b);\n        return b;\n      };\n      add(row, \"follow\", \"Follow doors\", null, \"Follow the doors' material\");\n      add(row, \"white\", \"White\", \"white\", \"Egger W1000 ST9 Premium White\");\n      add(row, \"w1100\", \"W1100\", \"w1100\", \"Egger W1100 ST9 Alpine White\");\n      add(row, \"oak\", \"Oak\", \"oak\", \"Egger H1385 ST40 Natural Casella Oak\");\n      finPop.insertBefore(row, finState);\n      const all = mk(\"details\", \"ub-lab__findpk\", { \"data-ub-findpk\": \"plinth\" });\n      all.appendChild(mk(\"summary\", \"\", {}, \"Plinths: all Egger decors\"));\n      const pk = createDecorPicker(d, {\n        viewOnly: true,\n        id: \"own-plinth\",\n        label: \"This cabinet's plinth run, all Egger MFC\",\n        isOn: (key) => {\n          const u = selected(ctx.scene());\n          return !!u && u.plinthFinish === key;\n        },\n        onPick: (key) => {\n          if (okFinish(key)) plAct(key);\n        }\n      });\n      all.appendChild(pk.el);\n      all.addEventListener(\"toggle\", () => {\n        if (all.open) pk.sync();\n      });\n      finPop.insertBefore(all, finState);\n      pickers.push([all, pk]);\n      const pnt = mk(\"details\", \"ub-lab__findpk\", { \"data-ub-findpk\": \"plinth-paint\" });\n      pnt.appendChild(mk(\"summary\", \"\", {}, \"Plinths: painted MDF\"));\n      const tones = mk(\"div\", \"ub-lab__rsws\", { role: \"group\", \"aria-label\": \"Plinths: painted MDF colour\" });\n      for (const t of PAINT_TONES) {\n        const b = mk(\"button\", \"ub-lab__rsw\", {\n          type: \"button\",\n          \"data-ub-plinthtone\": t.id,\n          \"aria-pressed\": \"false\",\n          \"aria-label\": \"Plinths: painted MDF, \" + t.name,\n          title: \"Painted MDF, \" + t.name,\n          style: \"--ub-rsw:#\" + t.hex.toString(16).padStart(6, \"0\")\n        });\n        b.addEventListener(\"click\", () => plAct(\"paint:\" + curPaint().finish + \":\" + t.id));\n        tones.appendChild(b);\n      }\n      pnt.appendChild(tones);\n      const fins = mk(\"div\", \"\", { role: \"group\", \"aria-label\": \"Plinths: preview sheen\" });\n      for (const f of PAINT_FINISHES) {\n        const b = mk(\"button\", \"ub-lab__finsw\", {\n          type: \"button\",\n          \"data-ub-plinthfin\": f.id,\n          \"aria-pressed\": \"false\",\n          title: f.name + \" - preview only: the MDF is supplied with a water-based primer\"\n        }, f.name);\n        b.addEventListener(\"click\", () => plAct(\"paint:\" + f.id + \":\" + curPaint().tone));\n        fins.appendChild(b);\n      }\n      pnt.appendChild(fins);\n      const ref = mk(\"input\", \"ub-lab__secw\", {\n        type: \"text\",\n        maxlength: \"40\",\n        \"data-ub-plinthref\": \"\",\n        \"aria-label\": \"Plinths: your colour (RAL, NCS or brand name)\",\n        placeholder: \"Your colour - confirmed with the quote\",\n        autocomplete: \"off\"\n      });\n      ref.addEventListener(\"change\", () => ctx.act(\"unit.finish\", { which: \"plinthRef\", value: ref.value }));\n      pnt.appendChild(ref);\n      finPop.insertBefore(pnt, finState);\n      const scope = mk(\"p\", \"ub-lab__finstate\", { \"data-ub-plinthscope\": \"\", \"aria-live\": \"polite\" });\n      finPop.insertBefore(scope, finState);\n      Object.assign(PL, { box: row, scope, ref, paintBox: pnt });\n    } catch {\n      PL.box = null;\n    }\n    if (finPop && ctx.doc) try {\n      const d0 = ctx.doc, ZI = '<svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M8.5 3a5.5 5.5 0 1 1 0 11a5.5 5.5 0 0 1 0-11zm0 2.6v5.8M5.6 8.5h5.8M12.6 12.6l4.4 4.4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n      for (const b of [...finPop.querySelectorAll(\".ub-lab__finsw[data-ub-ovval], .ub-lab__finsw[data-ub-plinth]\")]) {\n        const key = b.getAttribute(\"data-ub-ovval\") || b.getAttribute(\"data-ub-plinth\"), dd = key && key !== \"follow\" ? decorOf(key) : null;\n        if (!dd || b.closest(\".ub-lab__kcell\")) continue;\n        const cell = d0.createElement(\"span\");\n        cell.className = \"ub-lab__kcell\";\n        cell.setAttribute(\"data-ub-kcell\", key);\n        b.parentNode.insertBefore(cell, b);\n        cell.appendChild(b);\n        const c = d0.createElement(\"span\");\n        c.className = \"ub-lab__dpkcode\";\n        c.setAttribute(\"aria-hidden\", \"true\");\n        c.textContent = dd.code;\n        b.appendChild(c);\n        const z = d0.createElement(\"button\");\n        z.type = \"button\";\n        z.className = \"ub-lab__dpkzoom\";\n        z.setAttribute(\"data-ub-dpkzoom\", key);\n        z.setAttribute(\"aria-label\", \"View whole board: \" + dd.code + \" \" + dd.tex + \" \" + dd.name);\n        z.setAttribute(\"title\", \"View whole board - \" + dd.code + \" \" + dd.tex);\n        z.innerHTML = ZI;\n        z.addEventListener(\"click\", (e) => {\n          if (e && e.stopPropagation) e.stopPropagation();\n          decorViewerFor(d0, root).open(dd, { opener: z, onUse: null });\n        });\n        cell.appendChild(z);\n      }\n    } catch {\n    }\n    const TG = { btns: [], cur: \"carcass\" };\n    if (finPop && ctx.doc) try {\n      const d = ctx.doc;\n      const tagOf = (n) => {\n        const pk = n.getAttribute && n.getAttribute(\"data-ub-findpk\");\n        if (pk) return pk === \"plinth-paint\" ? \"plinth\" : pk;\n        if (n.hasAttribute && (n.hasAttribute(\"data-ub-finplinth\") || n.hasAttribute(\"data-ub-plinthscope\"))) return \"plinth\";\n        const lab = n.getAttribute && n.getAttribute(\"aria-label\") || \"\";\n        return /carcass/i.test(lab) ? \"carcass\" : /fronts/i.test(lab) ? \"fronts\" : null;\n      };\n      for (const n of [...finPop.children]) {\n        const t = tagOf(n);\n        if (t) n.setAttribute(\"data-ub-fintag\", t);\n      }\n      const seg = d.createElement(\"div\");\n      seg.className = \"ub-lab__fintgt\";\n      seg.setAttribute(\"role\", \"group\");\n      seg.setAttribute(\"aria-label\", \"Which part of this cabinet\");\n      for (const [k, w] of [[\"carcass\", \"Carcass\"], [\"fronts\", \"Fronts\"], [\"plinth\", \"Plinth\"]]) {\n        const b = d.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-lab__fintgtb\";\n        b.setAttribute(\"data-ub-fintgt\", k);\n        b.setAttribute(\"aria-pressed\", k === \"carcass\" ? \"true\" : \"false\");\n        b.textContent = w;\n        b.addEventListener(\"click\", (e) => {\n          if (e && e.stopPropagation) e.stopPropagation();\n          setTgt(k);\n        });\n        seg.appendChild(b);\n        TG.btns.push(b);\n      }\n      const head = finPop.querySelector(\".ub-lab__finhead\");\n      finPop.insertBefore(seg, head ? head.nextSibling : finPop.firstChild);\n      TG.seg = seg;\n    } catch {\n      TG.btns.length = 0;\n    }\n    function setTgt(k) {\n      if (!finPop) return;\n      TG.cur = k;\n      finPop.setAttribute(\"data-ub-fintgt-on\", k);\n      for (const b of TG.btns) {\n        const on = b.getAttribute(\"data-ub-fintgt\") === k;\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        if (b.classList) b.classList.toggle(\"is-active\", on);\n      }\n      for (const [box3, pk] of pickers) {\n        const t = box3.getAttribute(\"data-ub-fintag\");\n        if (t !== k) continue;\n        try {\n          if (!box3.open) box3.open = true;\n          pk.sync();\n        } catch {\n        }\n        const sr = box3.querySelector && box3.querySelector(\"[data-ub-dpksearch]\");\n        if (sr && sr.value) {\n          sr.value = \"\";\n          try {\n            sr.dispatchEvent(new ctx.doc.defaultView.Event(\"input\", { bubbles: true }));\n          } catch {\n          }\n        }\n        if (box3.querySelectorAll) {\n          for (const r of box3.querySelectorAll(\".ub-lab__dpkrow\")) if (!r.getAttribute(\"aria-label\")) {\n            const t2 = (r.getAttribute(\"title\") || r.textContent || \"\").trim();\n            if (t2) r.setAttribute(\"aria-label\", t2);\n          }\n        }\n      }\n      if (k === \"plinth\" && PL.box && PL.box.hidden) setTgt(\"carcass\");\n    }\n    function curPaint() {\n      const u = selected(ctx.scene());\n      return u && paintOfKey(u.plinthFinish) || u && u.frontMat === \"mdf-paint\" && u.paint || { finish: \"satin-matt\", tone: \"white\" };\n    }\n    function syncPlinth(scene, u) {\n      if (!PL.box) return;\n      const show2 = hasPlinth(u);\n      PL.box.hidden = !show2;\n      if (PL.paintBox) PL.paintBox.hidden = !show2;\n      if (PL.scope) PL.scope.hidden = !show2;\n      if (!show2) return;\n      const ov = okPlinthOv(u.ovPlinth), key = u.plinthFinish, paint = paintOfKey(key);\n      PL.btns.forEach(function(b) {\n        const v = b.getAttribute(\"data-ub-plinth\");\n        const on = v === \"follow\" ? !ov : !!ov && ov.mat === \"mfc\" && ov.decor === v;\n        b.classList.toggle(\"is-active\", on);\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n      });\n      finPop.querySelectorAll(\"[data-ub-plinthtone]\").forEach(function(b) {\n        const on = !!ov && !!paint && paint.tone === b.getAttribute(\"data-ub-plinthtone\");\n        b.classList.toggle(\"is-active\", on);\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n      });\n      finPop.querySelectorAll(\"[data-ub-plinthfin]\").forEach(function(b) {\n        const on = !!ov && !!paint && paint.finish === b.getAttribute(\"data-ub-plinthfin\");\n        b.classList.toggle(\"is-active\", on);\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n      });\n      if (PL.ref) {\n        PL.ref.disabled = !(ov && ov.mat === \"mdf-paint\");\n        if (ctx.doc.activeElement !== PL.ref) PL.ref.value = ov && ov.mat === \"mdf-paint\" && ov.paint.ref || \"\";\n      }\n      const run = plinthRunOf(scene.units, u);\n      const who = run.map(function(v) {\n        return displayName(scene.units, v);\n      });\n      PL.scope.textContent = (run.length > 1 ? \"Plinths: one continuous plinth under \" + who.join(\", \") + \" - a choice here is for that whole run. \" : \"Plinths: this cabinet's own plinth. \") + (ov ? \"Set to \" : \"Follows the doors: \") + plinthLabel(key) + (isPaintKey(key) ? \" - quoted with the painted doors, not priced here.\" : \".\") + (paint && !ov ? \"\" : \"\");\n      void paintFinishOf;\n      void toneOf;\n    }\n    const finReset = root.querySelector(\"[data-ub-finreset]\");\n    if (finReset) finReset.addEventListener(\"click\", function() {\n      ctx.act(\"unit.finishReset\", {});\n    });\n    const finClose = root.querySelector(\"[data-ub-finclose]\");\n    if (finClose) finClose.addEventListener(\"click\", function() {\n      setFinPop(false);\n    });\n    return { sync: syncFinPop, frame: drawFinishUI, open: setFinPop, isOpen: finPopOpen };\n  }\n\n  // v2/src/ui/unit-remove.js\n  var BIN = '<svg viewBox=\"0 0 16 16\" width=\"8\" height=\"8\" aria-hidden=\"true\" focusable=\"false\" data-ub-unitdel-icon=\"cross\"><path d=\"M3.5 3.5l9 9M12.5 3.5l-9 9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\n  var GAP2 = 18;\n  var COVERS = \".ub-lab__dock .ub-lab__toolgrp, .ub-lab__dock--top > *, .ub-lab__flyout:not([hidden]), .ub-lab__eyemenu:not([hidden])\";\n  function createUnitRemove(ctx, parts) {\n    const root = ctx.root, view = ctx.view;\n    const finBtn = root.querySelector(\"[data-ub-finbtn]\");\n    const host = finBtn ? finBtn.parentNode : null;\n    const doc2 = root.ownerDocument;\n    if (!host || !doc2) return { sync() {\n    }, frame() {\n    } };\n    const btn = doc2.createElement(\"button\");\n    btn.type = \"button\";\n    btn.className = \"ub-lab__finbtn ub-lab__unitdel\";\n    btn.setAttribute(\"data-ub-unitdel\", \"\");\n    btn.setAttribute(\"hidden\", \"\");\n    btn.innerHTML = BIN;\n    host.appendChild(btn);\n    const trayOpen = () => !!(parts.tray && parts.tray.isOpen && parts.tray.isOpen() && !(parts.tray.isSlim && parts.tray.isSlim()));\n    const hover = badgeHover(ctx);\n    hover.register(btn, () => frame2());\n    const selected2 = () => hover.target();\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    for (const t of [\"mousedown\", \"pointerdown\", \"dblclick\", \"touchstart\"]) btn.addEventListener(t, stop, t === \"touchstart\" ? { passive: true } : void 0);\n    btn.addEventListener(\"click\", (e) => {\n      stop(e);\n      if (btn.disabled || trayOpen()) return;\n      if (!hover.ensureSelected()) return;\n      ctx.act(\"unit.remove\", {});\n    });\n    function sync() {\n      const scene = ctx.scene(), u = selected2();\n      if (!u) return;\n      const last = (scene.units || []).length <= 1;\n      btn.disabled = last;\n      const name2 = u.name || (u.type === \"island\" ? \"island\" : \"cabinet\");\n      const label = last ? \"The last cabinet stays - add another one first\" : \"Remove this \" + (u.type === \"island\" ? \"island\" : \"cabinet\") + \" (Undo brings it back)\";\n      if (btn.getAttribute(\"aria-label\") !== label) {\n        btn.setAttribute(\"aria-label\", label);\n        btn.title = label;\n      }\n      btn.setAttribute(\"data-ub-unitname\", name2);\n    }\n    function covered() {\n      if (!btn.getBoundingClientRect || !root.querySelectorAll) return false;\n      const r = btn.getBoundingClientRect();\n      if (!(r.width > 0)) return false;\n      const cx = r.left + r.width / 2, cy = r.top + r.height / 2;\n      for (const n of root.querySelectorAll(COVERS)) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        const q = n.getBoundingClientRect();\n        if (q.width > 0 && cx >= q.left - 4 && cx <= q.right + 4 && cy >= q.top - 4 && cy <= q.bottom + 4) return true;\n      }\n      return false;\n    }\n    function frame2() {\n      const scene = ctx.scene(), u = selected2();\n      if (!u || trayOpen() || scene && (scene.roomSel || scene.roomArmed)) {\n        btn.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      const a = hover.anchor(u);\n      if (!a) {\n        btn.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      const cw = a.cw, ch = a.ch, px = a.px + GAP2, py = a.py;\n      if (px < -40 || py < -40 || px > cw + 40 || py > ch + 40) {\n        btn.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      btn.removeAttribute(\"hidden\");\n      btn.style.left = Math.round(px) + \"px\";\n      btn.style.top = Math.round(py) + \"px\";\n      sync();\n      if (covered()) btn.setAttribute(\"hidden\", \"\");\n    }\n    return { sync, frame: frame2, el: btn };\n  }\n\n  // v2/src/ui/drawer-box.js\n  var COVERS2 = \".ub-lab__dock .ub-lab__toolgrp, .ub-lab__dock--top > *, .ub-lab__flyout:not([hidden]), .ub-lab__eyemenu:not([hidden])\";\n  var PANELS = '[data-ub-flyout=\"drawers\"]:not([hidden]), [data-ub-flyout=\"fronts\"]:not([hidden])';\n  function mmText(v) {\n    const r = Math.round(v * 10) / 10;\n    return Math.abs(r - Math.round(r)) < 1e-9 ? String(Math.round(r)) : r.toFixed(1);\n  }\n  function createDrawerBox(ctx, parts) {\n    const root = ctx.root, view = ctx.view;\n    const finBtn = root.querySelector(\"[data-ub-finbtn]\");\n    const host = finBtn ? finBtn.parentNode : null;\n    const doc2 = root.ownerDocument;\n    if (!host || !doc2) return { sync() {\n    }, frame() {\n    } };\n    const layer2 = doc2.createElement(\"div\");\n    layer2.className = \"ub-lab__boxlayer\";\n    layer2.setAttribute(\"data-ub-boxlayer\", \"\");\n    layer2.setAttribute(\"hidden\", \"\");\n    host.appendChild(layer2);\n    const field = doc2.createElement(\"label\");\n    field.className = \"ub-lab__boxh\";\n    field.innerHTML = '<span class=\"ub-lab__sr\">Height</span><input type=\"number\" inputmode=\"numeric\" min=\"1\" step=\"1\" data-ub-dhfield aria-label=\"Drawer height, mm - front and box together\"><span class=\"ub-lab__sr\">mm</span><span class=\"ub-lab__sr\" data-ub-dhbox></span>';\n    const input = field.querySelector(\"input\");\n    const boxNote = field.querySelector(\"[data-ub-dhbox]\");\n    const NS7 = \"http://www.w3.org/2000/svg\";\n    const dimSvgEl = doc2.createElementNS ? doc2.createElementNS(NS7, \"svg\") : null;\n    if (dimSvgEl) {\n      dimSvgEl.setAttribute(\"class\", \"ub-lab__dimlines\");\n      dimSvgEl.setAttribute(\"aria-hidden\", \"true\");\n      layer2.appendChild(dimSvgEl);\n    }\n    const selSvg = doc2.createElementNS ? doc2.createElementNS(NS7, \"svg\") : null;\n    if (selSvg) {\n      selSvg.setAttribute(\"class\", \"ub-lab__dsel\");\n      selSvg.setAttribute(\"aria-hidden\", \"true\");\n      selSvg.setAttribute(\"data-ub-dsel\", \"\");\n      layer2.insertBefore(selSvg, layer2.firstChild);\n    }\n    let hoverKey = null;\n    const halt = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    const mkNum = (attr, label) => {\n      const n = doc2.createElement(\"span\");\n      n.className = \"ub-lab__dimnum\";\n      n.setAttribute(attr, \"\");\n      n.setAttribute(\"role\", \"button\");\n      n.setAttribute(\"tabindex\", \"0\");\n      n.setAttribute(\"aria-label\", label);\n      n.addEventListener(\"mousedown\", halt);\n      n.addEventListener(\"pointerdown\", halt);\n      const modeOf = () => n === numY ? \"y\" : n === numB ? \"box\" : \"h\";\n      n.addEventListener(\"click\", (e) => {\n        halt(e);\n        if (e.preventDefault) e.preventDefault();\n        beginEdit(modeOf());\n      });\n      n.addEventListener(\"keydown\", (e) => {\n        if (e.key === \"Enter\" || e.key === \" \") {\n          halt(e);\n          if (e.preventDefault) e.preventDefault();\n          beginEdit(modeOf());\n        }\n      });\n      layer2.appendChild(n);\n      return n;\n    };\n    const numH = mkNum(\"data-ub-dhnum\", \"Drawer height, mm - click to type\");\n    const numY = mkNum(\"data-ub-dynum\", \"Where the drawer starts above the cabinet bottom, mm\");\n    const numB = mkNum(\"data-ub-dbnum\", \"Drawer BOX height, mm - click to type (its front unchanged)\");\n    const editPart = () => {\n      const s0 = ctx.scene();\n      return s0 && s0.drawerBox && s0.drawerBox.part === \"box\" ? \"box\" : \"front\";\n    };\n    const setPart = (part) => {\n      const s0 = ctx.scene();\n      if (s0 && s0.drawerBox && s0.drawerBox.part !== part) s0.drawerBox = { ...s0.drawerBox, part };\n    };\n    let editMode = \"h\";\n    function beginEdit(mode) {\n      const u = selected2(ctx.scene()), b = u && boxOf2(drawerBoxes(u), active);\n      if (!b || mode === \"y\" && b.xn == null) return;\n      editMode = mode;\n      if (mode === \"box\") setPart(\"box\");\n      else if (mode === \"h\") setPart(\"front\");\n      const at = mode === \"y\" ? numY : mode === \"box\" ? numB : numH;\n      if (field.parentNode !== layer2) layer2.appendChild(field);\n      field.removeAttribute(\"hidden\");\n      field.setAttribute(\"data-ub-boxi\", String(b.i));\n      field.setAttribute(\"data-ub-mode\", mode);\n      field.style.left = at.style.left;\n      field.style.top = at.style.top;\n      input.value = mode === \"box\" ? mmText(b.h) : String(Math.round(mode === \"y\" ? b.fy0 : b.fy1 - b.fy0));\n      input.setAttribute(\"aria-label\", mode === \"y\" ? \"Where the drawer front starts, mm above the cabinet bottom\" : mode === \"box\" ? \"Drawer BOX height, mm - its front unchanged\" : \"Drawer FRONT height, mm - its box unchanged\");\n      editing = true;\n      if (input.focus) input.focus();\n      if (input.select) input.select();\n      frame2();\n    }\n    let active = 0, drag = null, editing = false;\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    for (const t of [\"mousedown\", \"pointerdown\", \"dblclick\", \"touchstart\", \"wheel\"]) {\n      field.addEventListener(t, stop, t === \"touchstart\" || t === \"wheel\" ? { passive: true } : void 0);\n    }\n    const trayOpen = () => !!(parts.tray && parts.tray.isOpen && parts.tray.isOpen());\n    const selected2 = (scene) => (scene && scene.units || []).find((u) => u.id === scene.selectedId) || null;\n    function wanted2(scene, u) {\n      if (!hasDrawerBoxes(u)) return false;\n      if (scene.drawerBox && scene.drawerBox.id === u.id) return true;\n      if (root.querySelector && root.querySelector(PANELS)) return true;\n      const p = scene.selPart ? partById(u, scene.selPart) : null;\n      return !!(p && (p.kind === \"drawer-front\" || p.kind === \"drawer-box\"));\n    }\n    function activeIndex(scene, u, list) {\n      if (scene.drawerBox && scene.drawerBox.id === u.id) return boxOf2(list, scene.drawerBox.i) ? scene.drawerBox.i : list[0] ? list[0].i : 0;\n      const p = scene.selPart ? partById(u, scene.selPart) : null;\n      const k = p ? drawerOfPart(u, p.name) : -1;\n      return k >= 0 ? k : list[0] ? list[0].i : 0;\n    }\n    function px(u, p) {\n      const w = unitXf(u).p(p);\n      const nd = view.worldToNdc(w);\n      if (!nd) return null;\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      return [(nd[0] + 1) / 2 * cw, (1 - nd[1]) / 2 * ch];\n    }\n    function slideOf(u, b) {\n      const open = b.xn != null ? !!b.open : u.type === \"base-4drawer\" ? !!(u.drawers && u.drawers[b.i]) : !!u.drawerOpen;\n      return open ? DRW.openBy : 0;\n    }\n    let edgeKey = \"\", edges = [], seams = [];\n    function stateKey2(u) {\n      return u.id + JSON.stringify([u.w, u.h, u.d, u.xdr, u.dfH, u.boxH, u.interior, u.drawerFronts, u.door, u.doorH, u.type]);\n    }\n    function edgesOf(u, list) {\n      const k = stateKey2(u);\n      if (k !== edgeKey) {\n        edgeKey = k;\n        edges = list.map((b) => linkedEdge(u, b));\n        seams = frontSeams(u);\n        rangeKey = \"\";\n      }\n      return edges;\n    }\n    let rangeKey = \"\", range = null;\n    function rangeOf(u, i) {\n      const k = edgeKey + \"|\" + i;\n      if (k !== rangeKey) {\n        rangeKey = k;\n        try {\n          range = drawerHeightRange(u, i);\n        } catch (err) {\n          range = null;\n        }\n      }\n      return range;\n    }\n    const seamEls = [];\n    function seamEl(k) {\n      while (seamEls.length <= k) {\n        const g2 = doc2.createElement(\"button\");\n        g2.type = \"button\";\n        g2.className = \"ub-lab__seam\";\n        g2.setAttribute(\"data-ub-seam\", \"\");\n        g2.addEventListener(\"pointerdown\", (e) => down(e, g2.getAttribute(\"data-ub-seam\")));\n        g2.addEventListener(\"mousedown\", stop);\n        g2.addEventListener(\"touchstart\", stop, { passive: true });\n        g2.addEventListener(\"dblclick\", stop);\n        g2.addEventListener(\"click\", (e) => {\n          stop(e);\n        });\n        g2.addEventListener(\"keydown\", (e) => key(e, g2.getAttribute(\"data-ub-seam\")));\n        g2.addEventListener(\"pointerenter\", (e) => {\n          if (e && e.buttons) return;\n          hoverKey = g2.getAttribute(\"data-ub-seam\");\n          hoverCue(hoverKey);\n          frame2();\n        });\n        g2.addEventListener(\"pointerleave\", () => {\n          if (hoverKey === g2.getAttribute(\"data-ub-seam\")) {\n            hoverKey = null;\n            if (!drag) frame2();\n          }\n        });\n        g2.addEventListener(\"focus\", () => {\n          const s = seamOf(g2.getAttribute(\"data-ub-seam\"));\n          if (s) pickFor(s);\n        });\n        layer2.appendChild(g2);\n        seamEls.push(g2);\n      }\n      return seamEls[k];\n    }\n    function seamOf(key2) {\n      return seams.find((s) => s.key === key2) || null;\n    }\n    const arrowEls = {};\n    for (const edge of [\"top\", \"bottom\"]) {\n      const a = doc2.createElement(\"button\");\n      a.type = \"button\";\n      a.className = \"ub-lab__dharrow\";\n      a.setAttribute(\"data-ub-dharrow\", edge);\n      a.setAttribute(\"hidden\", \"\");\n      a.innerHTML = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M7 9.5l5-5 5 5M7 14.5l5 5 5-5\"></path></svg>';\n      a.addEventListener(\"pointerdown\", (e) => arrowDown(e, edge));\n      a.addEventListener(\"mousedown\", stop);\n      a.addEventListener(\"touchstart\", stop, { passive: true });\n      a.addEventListener(\"dblclick\", stop);\n      a.addEventListener(\"click\", (e) => {\n        stop(e);\n      });\n      a.addEventListener(\"keydown\", (e) => arrowKey(e, edge));\n      layer2.appendChild(a);\n      arrowEls[edge] = a;\n    }\n    const xEl = doc2.createElement(\"button\");\n    xEl.type = \"button\";\n    xEl.className = \"ub-lab__dremove\";\n    xEl.setAttribute(\"data-ub-dremove\", \"\");\n    xEl.setAttribute(\"hidden\", \"\");\n    xEl.innerHTML = '<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4.5 4.5l7 7M11.5 4.5l-7 7\"></path></svg>';\n    let xPress = null;\n    xEl.addEventListener(\"pointerdown\", (e) => {\n      stop(e);\n      if (e.preventDefault) e.preventDefault();\n      xPress = drag || hdrag ? null : { x: e.clientX, y: e.clientY, n: xEl.getAttribute(\"data-ub-n\") };\n    });\n    xEl.addEventListener(\"mousedown\", stop);\n    xEl.addEventListener(\"touchstart\", stop, { passive: true });\n    xEl.addEventListener(\"dblclick\", stop);\n    xEl.addEventListener(\"pointercancel\", () => {\n      xPress = null;\n    });\n    xEl.addEventListener(\"click\", (e) => {\n      stop(e);\n      if (e.preventDefault) e.preventDefault();\n      const p = xPress;\n      xPress = null;\n      const fromKey = e.detail === 0;\n      if (!fromKey && (!p || Math.hypot((e.clientX || 0) - p.x, (e.clientY || 0) - p.y) > 12)) return;\n      if (drag || hdrag) return;\n      const n = Number(xEl.getAttribute(\"data-ub-n\"));\n      if (!(n > 0)) return;\n      ctx.act(\"drawer.remove\", { n });\n      frame2();\n    });\n    layer2.appendChild(xEl);\n    function placeRemove(u, b) {\n      if (!b || b.xn == null) {\n        xEl.setAttribute(\"hidden\", \"\");\n        return false;\n      }\n      const fxr = frontX(u, b), z = u.d + T + 1 + slideOf(u, b), p0 = px(u, [fxr.x1, b.fy1, z]), pU = px(u, [fxr.x1, b.fy1 + 100, z]), pR = px(u, [fxr.x1 + 100, b.fy1, z]);\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      if (!p0 || p0[0] < -10 || p0[0] > cw + 10 || p0[1] < -10 || p0[1] > ch + 10) {\n        xEl.setAttribute(\"hidden\", \"\");\n        return false;\n      }\n      const unit2 = (q) => {\n        if (!q) return [0, 0];\n        const vx = q[0] - p0[0], vy = q[1] - p0[1], L = Math.hypot(vx, vy) || 1;\n        return [vx / L, vy / L];\n      };\n      const upv = unit2(pU), rt = unit2(pR), r = (xEl.offsetWidth || 20) / 2 + 3;\n      xEl.removeAttribute(\"hidden\");\n      xEl.style.left = Math.round(p0[0] + (upv[0] + rt[0]) * r) + \"px\";\n      xEl.style.top = Math.round(p0[1] + (upv[1] + rt[1]) * r) + \"px\";\n      const name2 = b.name.replace(/ box$/, \"\"), label = \"Remove \" + name2 + \" (its box and front) - Undo puts it back\";\n      xEl.setAttribute(\"data-ub-n\", String(b.xn));\n      if (xEl.getAttribute(\"aria-label\") !== label) {\n        xEl.setAttribute(\"aria-label\", label);\n        xEl.title = \"Remove \" + name2;\n      }\n      if (covered(xEl)) {\n        xEl.setAttribute(\"hidden\", \"\");\n        return false;\n      }\n      if (onGrip(xEl)) {\n        xEl.setAttribute(\"hidden\", \"\");\n        return false;\n      }\n      return true;\n    }\n    function onGrip(el) {\n      if (!el.getBoundingClientRect) return false;\n      const x = el.getBoundingClientRect();\n      if (!(x.width > 0 && x.height > 0)) return false;\n      for (const k in arrowEls) {\n        const a = arrowEls[k];\n        if (!a || a.hasAttribute(\"hidden\") || !a.getBoundingClientRect) continue;\n        const r = a.getBoundingClientRect();\n        if (r.width > 0 && r.height > 0 && x.left < r.right + 2 && r.left < x.right + 2 && x.top < r.bottom + 2 && r.top < x.bottom + 2) return true;\n      }\n      return false;\n    }\n    function frontX(u, b) {\n      const fc = faceSegments(u).find((q) => q.kind === \"drawer\" && q.i === b.i);\n      return fc ? { x0: fc.x0, x1: fc.x1 } : { x0: b.x0, x1: b.x1 };\n    }\n    function ownSeam(i, edge) {\n      return seams.find((q) => edge === \"top\" ? q.b.kind === \"drawer\" && q.b.i === i : q.a.kind === \"drawer\" && q.a.i === i) || null;\n    }\n    let hdrag = null;\n    const HLISTEN = [\n      [\"pointermove\", (e) => hMove(e)],\n      [\"pointerup\", (e) => hRelease(e)],\n      [\"pointercancel\", (e) => hRelease(e)],\n      [\"mouseup\", (e) => hRelease(e)],\n      [\"keydown\", (e) => hRelease(e)],\n      [\"blur\", (e) => hRelease(e)]\n    ];\n    function hListen(on) {\n      const t = win2 && win2.addEventListener ? win2 : doc2;\n      for (const [type, fn] of HLISTEN) {\n        if (type === \"blur\" && t !== win2) continue;\n        if (on) t.addEventListener(type, fn, true);\n        else t.removeEventListener(type, fn, true);\n      }\n    }\n    function arrowDown(e, edge) {\n      stop(e);\n      if (e.button != null && e.button !== 0) return;\n      if (hdrag) hEnd();\n      const scene = ctx.scene(), u = selected2(scene);\n      if (!u) return;\n      const list = drawerBoxes(u), b = boxOf2(list, active);\n      if (!b) return;\n      edgesOf(u, list);\n      const boxMode = editPart() === \"box\";\n      const sm2 = boxMode ? null : ownSeam(b.i, edge);\n      if (sm2) {\n        down(e, sm2.key);\n        return;\n      }\n      if (e.preventDefault) e.preventDefault();\n      const fxr = frontX(u, b), z = u.d + T + 1 + slideOf(u, b), xm = (fxr.x0 + fxr.x1) / 2, y = boxMode ? b.by1 : edge === \"top\" ? b.fy1 : b.fy0;\n      const p0 = px(u, [xm, y, z]), p1 = px(u, [xm, y + 100, z]);\n      const vx = p1 && p0 ? p1[0] - p0[0] : 0, vy = p1 && p0 ? p1[1] - p0[1] : -1, L = Math.hypot(vx, vy);\n      hdrag = {\n        i: b.i,\n        edge: boxMode ? \"top\" : edge,\n        box: boxMode,\n        h0: boxMode ? b.h : Math.round(b.fy1 - b.fy0),\n        cx: e.clientX,\n        cy: e.clientY,\n        ux: L > 1 ? vx / L : 0,\n        uy: L > 1 ? vy / L : -1,\n        k: L > 1 ? 100 / L : 1,\n        pid: e.pointerId,\n        el: e.target,\n        moved: false\n      };\n      if (boxMode) {\n        hdrag.mag = boxMagnetsOf(list, b);\n        hdrag.guide = null;\n        hdrag.name = b.name.replace(/ box$/, \"\");\n        hdrag.said = \"\";\n      }\n      try {\n        if (e.target.setPointerCapture && e.pointerId != null) e.target.setPointerCapture(e.pointerId);\n      } catch (err) {\n      }\n      hListen(true);\n      frame2();\n    }\n    function hMove(e) {\n      if (!hdrag) return;\n      if (hdrag.pid != null && e.pointerId != null && e.pointerId !== hdrag.pid) return;\n      if (e.isTrusted === true && e.pointerType !== \"touch\" && e.buttons === 0) {\n        hEnd();\n        return;\n      }\n      stop(e);\n      const dx = e.clientX - hdrag.cx, dy = e.clientY - hdrag.cy;\n      if (!hdrag.moved && Math.hypot(dx, dy) < 2) return;\n      hdrag.moved = true;\n      const rise = (dx * hdrag.ux + dy * hdrag.uy) * hdrag.k;\n      const h = Math.round(hdrag.h0 + (hdrag.edge === \"top\" ? rise : -rise));\n      if (hdrag.box) ctx.act(\"drawer.boxH\", { i: hdrag.i, h: Math.max(1, snapBoxH(h, e && e.altKey)), live: true });\n      else ctx.act(\"drawer.height\", { i: hdrag.i, h: Math.max(1, h), live: true, edge: hdrag.edge });\n      if (hdrag.box) boxCue();\n      frame2();\n    }\n    function hRelease(e) {\n      if (!hdrag) return;\n      if (e && e.type === \"keydown\") {\n        if (e.key !== \"Escape\") return;\n        stop(e);\n        if (e.preventDefault) e.preventDefault();\n        const g2 = hdrag;\n        hdrag = null;\n        hListen(false);\n        try {\n          if (g2.el && g2.el.releasePointerCapture && g2.pid != null && g2.el.hasPointerCapture && g2.el.hasPointerCapture(g2.pid)) g2.el.releasePointerCapture(g2.pid);\n        } catch (err) {\n        }\n        if (g2.moved) ctx.act(\"drawer.cancel\", {});\n        frame2();\n        return;\n      }\n      if (e && (e.type === \"pointerup\" || e.type === \"pointercancel\") && hdrag.pid != null && e.pointerId != null && e.pointerId !== hdrag.pid) return;\n      if (e && (e.type === \"pointerup\" || e.type === \"pointercancel\" || e.type === \"mouseup\")) stop(e);\n      hEnd();\n    }\n    function hEnd() {\n      if (!hdrag) return;\n      const g2 = hdrag;\n      hdrag = null;\n      hListen(false);\n      try {\n        if (g2.el && g2.el.releasePointerCapture && g2.pid != null && g2.el.hasPointerCapture && g2.el.hasPointerCapture(g2.pid)) g2.el.releasePointerCapture(g2.pid);\n      } catch (err) {\n      }\n      if (g2.moved) ctx.act(\"drawer.boxDone\", {});\n      frame2();\n    }\n    function arrowKey(e, edge) {\n      if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") return;\n      stop(e);\n      if (e.preventDefault) e.preventDefault();\n      const scene = ctx.scene(), u = selected2(scene);\n      if (!u) return;\n      const list = drawerBoxes(u), b = boxOf2(list, active);\n      if (!b) return;\n      edgesOf(u, list);\n      const step = (e.shiftKey ? 10 : 1) * (e.key === \"ArrowUp\" ? 1 : -1);\n      if (editPart() === \"box\") {\n        ctx.act(\"drawer.boxH\", { i: b.i, h: Math.round(b.h) + step });\n        return;\n      }\n      const sm2 = ownSeam(b.i, edge);\n      if (sm2) {\n        ctx.act(\"drawer.seam\", { key: sm2.key, y: Math.round((sm2.y + step) * 10) / 10 });\n        return;\n      }\n      ctx.act(\"drawer.height\", { i: b.i, h: Math.round(b.fy1 - b.fy0) + (edge === \"top\" ? step : -step), edge });\n    }\n    function placeArrows(u, b) {\n      if (!b) {\n        for (const k in arrowEls) arrowEls[k].setAttribute(\"hidden\", \"\");\n        return false;\n      }\n      const fxr = frontX(u, b), z = u.d + T + 1 + slideOf(u, b), xm = (fxr.x0 + fxr.x1) / 2, name2 = b.name.replace(/ box$/, \"\");\n      let shown = false;\n      const pT = px(u, [xm, b.fy1, z]), pU = px(u, [xm, b.fy1 + 100, z]);\n      let ux = 0, uy = -1;\n      if (pT && pU) {\n        const L = Math.hypot(pU[0] - pT[0], pU[1] - pT[1]);\n        if (L > 0.5) {\n          ux = (pU[0] - pT[0]) / L;\n          uy = (pU[1] - pT[1]) / L;\n        }\n      }\n      const boxMode = editPart() === \"box\";\n      for (const edge of [\"top\", \"bottom\"]) {\n        if (boxMode && edge === \"bottom\") {\n          arrowEls[edge].setAttribute(\"hidden\", \"\");\n          continue;\n        }\n        const a = arrowEls[edge], y = boxMode ? b.by1 : edge === \"top\" ? b.fy1 : b.fy0, p0 = px(u, [xm, y, z]);\n        const pE0 = px(u, [fxr.x0, y, z]), pE1 = px(u, [fxr.x1, y, z]);\n        const span2 = pE0 && pE1 ? Math.hypot(pE1[0] - pE0[0], pE1[1] - pE0[1]) : 40, deg = pE0 && pE1 ? Math.atan2(pE1[1] - pE0[1], pE1[0] - pE0[0]) * 180 / Math.PI : 0;\n        if (a.__baseH == null) {\n          a.style.height = \"\";\n          a.__baseH = a.offsetHeight || 10;\n        }\n        const bandH = a.__baseH, bandW = Math.round(Math.min(160, Math.max(24, span2 * 0.8))), pF0 = px(u, [xm, b.fy0, z]), pF1 = px(u, [xm, b.fy1, z]);\n        const faceH = pF0 && pF1 ? Math.hypot(pF1[0] - pF0[0], pF1[1] - pF0[1]) : 0;\n        const smE = boxMode ? null : ownSeam(b.i, edge);\n        const seamNode = smE ? seamEls.find((q) => q.getAttribute(\"data-ub-seam\") === smE.key && !q.hasAttribute(\"hidden\")) : null;\n        const stripHalf = smE ? (Number(seamNode && seamNode.getAttribute(\"data-ub-seamh\")) || 14) / 2 : 0;\n        const inset = smE ? Math.ceil(stripHalf) + 1 : 2;\n        let th = boxMode ? bandH : Math.min(bandH, Math.floor(faceH / 3) - inset);\n        let r = 0;\n        if (!boxMode && th >= 3) r = -(inset + th / 2);\n        else if (!boxMode && edge === \"top\") {\n          th = Math.min(bandH, 8);\n          r = inset + th / 2;\n        } else if (!boxMode) {\n          a.setAttribute(\"hidden\", \"\");\n          continue;\n        }\n        a.style.height = boxMode ? \"\" : th + \"px\";\n        const sg = edge === \"top\" ? 1 : -1;\n        const p = p0 ? [p0[0] + ux * r * sg, p0[1] + uy * r * sg] : null;\n        a.style.width = bandW + \"px\";\n        a.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(deg * 10) / 10 + \"deg)\";\n        const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n        if (!p || p[0] < -10 || p[0] > cw + 10 || p[1] < -10 || p[1] > ch + 10) {\n          a.setAttribute(\"hidden\", \"\");\n          continue;\n        }\n        a.removeAttribute(\"hidden\");\n        a.style.left = Math.round(p[0]) + \"px\";\n        a.style.top = Math.round(p[1]) + \"px\";\n        const sm2 = boxMode ? null : ownSeam(b.i, edge);\n        const label = boxMode ? name2 + \": BOX top edge - drag up or down to change the box height (its front unchanged)\" : name2 + \": FRONT \" + (edge === \"top\" ? \"top\" : \"bottom\") + \" edge - drag up or down to change the front height (its box unchanged)\" + (sm2 ? \"; the \" + (edge === \"top\" ? sm2.a.name : sm2.b.name) + \" next to it gives way\" : \"\");\n        a.setAttribute(\"data-ub-part\", boxMode ? \"box\" : \"front\");\n        if (a.getAttribute(\"aria-label\") !== label) {\n          a.setAttribute(\"aria-label\", label);\n          a.title = label;\n        }\n        a.classList.toggle(\"is-dragging\", !!(hdrag && hdrag.edge === edge || drag && sm2 && drag.key === sm2.key));\n        if (covered(a)) {\n          a.setAttribute(\"hidden\", \"\");\n          continue;\n        }\n        shown = true;\n      }\n      return shown;\n    }\n    function drawerOfSeam(s) {\n      return s.b.kind === \"drawer\" ? s.b.i : s.a.kind === \"drawer\" ? s.a.i : -1;\n    }\n    function pickFor(s) {\n      const scene = ctx.scene(), u = selected2(scene);\n      const own2 = u && scene.drawerBox && scene.drawerBox.id === u.id && [s.a, s.b].some((q) => q.kind === \"drawer\" && q.i === scene.drawerBox.i);\n      const i = own2 ? scene.drawerBox.i : drawerOfSeam(s);\n      if (i < 0 || !u) return;\n      if (!(scene.drawerBox && scene.drawerBox.id === u.id && scene.drawerBox.i === i)) ctx.act(\"drawer.box\", { i });\n      active = i;\n    }\n    function sidesOf3(s, i) {\n      if (s.b.kind === \"drawer\" && s.b.i === i) return { mine: s.b, other: s.a, edge: \"top\" };\n      if (s.a.kind === \"drawer\" && s.a.i === i) return { mine: s.a, other: s.b, edge: \"bottom\" };\n      const d = s.b.kind === \"drawer\" ? s.b : s.a;\n      return { mine: null, chosen: d, other: d === s.b ? s.a : s.b, edge: d === s.b ? \"top\" : \"bottom\" };\n    }\n    const hOf = (q) => Math.round(q.y1 - q.y0);\n    function hoverCue(k) {\n      if (drag || !ctx.cue) return;\n      const s = seamOf(k), scene = ctx.scene(), u = selected2(scene);\n      if (!s || !u) return;\n      const ci = scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.i : -1;\n      const sd = sidesOf3(s, ci), me = sd.mine || sd.chosen;\n      ctx.cue(me.name + \" \" + sd.edge + \" edge: drag \" + (sd.edge === \"top\" ? \"up\" : \"down\") + \" to grow it, \" + sd.other.name + \" gets shorter\" + (sd.edge === \"top\" ? \"; drawers below stay\" : \"\"));\n    }\n    function seamZ(u, s) {\n      const list = drawerBoxes(u);\n      const shut = [s.a, s.b].filter((q) => q.kind === \"drawer\").map((q) => boxOf2(list, q.i)).filter(Boolean);\n      const slide = shut.length && shut.every((b) => slideOf(u, b) > 0) ? DRW.openBy : 0;\n      return u.d + T + 1 + slide;\n    }\n    const win2 = doc2.defaultView || null;\n    const LISTEN = [\n      [\"pointermove\", (e) => move(e)],\n      [\"pointerup\", (e) => release(e)],\n      [\"pointercancel\", (e) => release(e)],\n      [\"mouseup\", (e) => release(e)],\n      [\"pointerdown\", (e) => release(e)],\n      [\"keydown\", (e) => release(e)],\n      [\"blur\", (e) => release(e)]\n    ];\n    function listen(on) {\n      const t = win2 && win2.addEventListener ? win2 : doc2;\n      for (const [type, fn] of LISTEN) {\n        if (type === \"blur\" && t !== win2) continue;\n        if (on) t.addEventListener(type, fn, true);\n        else t.removeEventListener(type, fn, true);\n      }\n    }\n    function down(e, key2) {\n      stop(e);\n      if (e.button != null && e.button !== 0) return;\n      if (drag) end();\n      if (editing && doc2.activeElement === input) {\n        apply();\n        editing = false;\n        input.blur();\n      }\n      const scene = ctx.scene(), u = selected2(scene);\n      const s = u ? seamOf(key2) : null;\n      if (!s) return;\n      if (e.preventDefault) e.preventDefault();\n      const z = seamZ(u, s), xm = (s.x0 + s.x1) / 2;\n      const p0 = px(u, [xm, s.y, z]), p1 = px(u, [xm, s.y + 100, z]);\n      const vx = p1 && p0 ? p1[0] - p0[0] : 0, vy = p1 && p0 ? p1[1] - p0[1] : -1, L = Math.hypot(vx, vy);\n      drag = {\n        key: key2,\n        y0: s.y,\n        cx: e.clientX,\n        cy: e.clientY,\n        ux: L > 1 ? vx / L : 0,\n        uy: L > 1 ? vy / L : -1,\n        k: L > 1 ? 100 / L : 1,\n        pid: e.pointerId,\n        el: e.target,\n        moved: false,\n        dir: 0,\n        a0: hOf(s.a),\n        b0: hOf(s.b),\n        mag: magnetsOf(u, s, scene),\n        guide: null\n      };\n      try {\n        if (e.target.setPointerCapture && e.pointerId != null) e.target.setPointerCapture(e.pointerId);\n      } catch (err) {\n      }\n      pickFor(s);\n      listen(true);\n    }\n    function samePointer(e) {\n      return !drag || drag.pid == null || e.pointerId == null || e.pointerId === drag.pid;\n    }\n    function move(e) {\n      if (!drag) return;\n      if (!samePointer(e)) return;\n      if (e.isTrusted === true && e.pointerType !== \"touch\" && e.buttons === 0) {\n        end();\n        return;\n      }\n      stop(e);\n      const dx = e.clientX - drag.cx, dy = e.clientY - drag.cy;\n      if (!drag.moved && Math.hypot(dx, dy) < 2) return;\n      drag.moved = true;\n      const rise = (dx * drag.ux + dy * drag.uy) * drag.k;\n      drag.dir = rise > 0.05 ? 1 : rise < -0.05 ? -1 : 0;\n      const y = snapY(drag.y0 + rise, e && e.altKey);\n      ctx.act(\"drawer.seam\", { key: drag.key, y: Math.round(y * 10) / 10, live: true });\n      frame2();\n      dragCue();\n    }\n    function magnetsOf(u, s, scene) {\n      const out = [], faces2 = faceSegments(u), dA = s.a.y0 - s.y, dB = s.b.y1 - s.y;\n      const apart = (f) => f.x1 <= s.x0 + 1 || f.x0 >= s.x1 - 1;\n      const ci = scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.i : -1, sd = sidesOf3(s, ci), me = sd.mine;\n      const ds = me === s.a ? [dA] : me === s.b ? [dB] : [dA, dB];\n      for (const f of faces2) {\n        if (!apart(f)) continue;\n        for (const e of [f.y0, f.y1]) for (const d of ds) out.push({ kind: \"edge\", y: e - d, at: e, x0: Math.min(f.x0, s.x0), x1: Math.max(f.x1, s.x1) });\n      }\n      if (me && me.kind === \"drawer\") for (const f of faces2) {\n        if (f.kind !== \"drawer\" || f.i === me.i) continue;\n        const H2 = f.y1 - f.y0;\n        out.push({ kind: \"equal\", i: f.i, h: H2, y: me === s.b ? s.b.y0 + H2 - dB : s.a.y1 - H2 - dA });\n      }\n      const rg = seamRange(u, s);\n      return rg ? out.filter((m) => m.y - s.y >= rg.lo - 1e-6 && m.y - s.y <= rg.hi + 1e-6) : out;\n    }\n    function boxMagnetsOf(list, b) {\n      const out = [], whole = (v) => Math.abs(v - Math.round(v)) < 1e-6, legal = (H2) => whole(H2) && H2 >= b.minMm - 1e-6 && H2 <= b.maxMm + 1e-6;\n      for (const o of list) {\n        if (o.i === b.i) continue;\n        const name2 = o.name.replace(/ box$/, \"\");\n        if (legal(o.h)) out.push({ kind: \"boxequal\", i: o.i, h: Math.round(o.h), name: name2 });\n        const H2 = o.by1 - b.by0;\n        if (Math.abs(o.by1 - b.by1) > 1e-6 && Math.abs(H2 - o.h) > 1e-6 && legal(H2)) out.push({ kind: \"boxtop\", i: o.i, h: Math.round(H2), at: o.by1, name: name2 });\n      }\n      return out;\n    }\n    function snapBoxH(h, off) {\n      hdrag.guide = null;\n      if (off || !hdrag.mag || !hdrag.mag.length) return h;\n      const tol = Math.max(0.5, 5 * hdrag.k);\n      let best = null;\n      for (const m of hdrag.mag) {\n        const d = Math.abs(m.h - h);\n        if (d <= tol && (!best || d < best.d - 1e-6 || Math.abs(d - best.d) < 1e-6 && m.kind === \"boxequal\")) best = { d, m };\n      }\n      if (!best) return h;\n      hdrag.guide = best.m;\n      return best.m.h;\n    }\n    function boxCue() {\n      if (!hdrag || !ctx.cue) return;\n      const g2 = hdrag.guide, key2 = g2 ? g2.kind + \":\" + g2.i : \"\";\n      if (key2 === hdrag.said) return;\n      hdrag.said = key2;\n      if (g2) ctx.cue(hdrag.name + \" box: \" + g2.h + \" mm - \" + (g2.kind === \"boxequal\" ? \"the same height as \" + g2.name + \"'s box\" : \"its top level with \" + g2.name + \"'s box top\") + \" (Alt: no magnet)\");\n    }\n    function snapY(y, off) {\n      drag.guide = null;\n      if (off || !drag.mag || !drag.mag.length) return y;\n      const tol = Math.max(0.5, 5 * drag.k);\n      let best = null;\n      for (const m of drag.mag) {\n        const d = Math.abs(m.y - y);\n        if (d <= tol && (!best || d < best.d - 1e-6 || Math.abs(d - best.d) < 1e-6 && m.kind === \"equal\")) best = { d, m };\n      }\n      if (!best) return y;\n      drag.guide = best.m;\n      return best.m.y;\n    }\n    function release(e) {\n      if (!drag) return;\n      if (e && e.type === \"keydown\" && e.key === \"Escape\") {\n        stop(e);\n        if (e.preventDefault) e.preventDefault();\n        const g2 = drag;\n        drag = null;\n        listen(false);\n        try {\n          if (g2.el && g2.el.releasePointerCapture && g2.pid != null && g2.el.hasPointerCapture && g2.el.hasPointerCapture(g2.pid)) g2.el.releasePointerCapture(g2.pid);\n        } catch (err) {\n        }\n        if (g2.moved) ctx.act(\"drawer.cancel\", {});\n        frame2();\n        return;\n      }\n      if (e && (e.type === \"pointerup\" || e.type === \"pointercancel\") && !samePointer(e)) return;\n      if (e && (e.type === \"pointerup\" || e.type === \"pointercancel\" || e.type === \"mouseup\")) stop(e);\n      end();\n    }\n    function end() {\n      if (!drag) return;\n      const g2 = drag;\n      drag = null;\n      listen(false);\n      try {\n        if (g2.el && g2.el.releasePointerCapture && g2.pid != null && g2.el.hasPointerCapture && g2.el.hasPointerCapture(g2.pid)) g2.el.releasePointerCapture(g2.pid);\n      } catch (err) {\n      }\n      if (g2.moved) ctx.act(\"drawer.boxDone\", {});\n      frame2();\n    }\n    function dragCue() {\n      if (!drag || !ctx.cue) return;\n      const s = seamOf(drag.key), scene = ctx.scene(), u = selected2(scene);\n      if (!s || !u) return;\n      const ci = scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.i : -1, sd = sidesOf3(s, ci);\n      const me = sd.mine || sd.chosen, meTop = me === s.b;\n      const m0 = meTop ? drag.b0 : drag.a0, o0 = meTop ? drag.a0 : drag.b0, m1 = hOf(me), o1 = hOf(sd.other);\n      const way = m1 > m0 ? meTop ? \"grows upward\" : \"grows downward\" : m1 < m0 ? meTop ? \"shrinks from the top\" : \"shrinks from the bottom\" : \"as it was\";\n      ctx.cue(me.name + \" \" + m0 + \" \\u2192 \" + m1 + \" mm, \" + way + \" \\xB7 \" + sd.other.name + \" \" + o0 + \" \\u2192 \" + o1 + \" mm\" + (meTop ? \" \\xB7 below unchanged\" : \"\"));\n    }\n    function key(e, k) {\n      const d = e.key === \"ArrowUp\" ? 1 : e.key === \"ArrowDown\" ? -1 : 0;\n      if (!d) return;\n      stop(e);\n      if (e.preventDefault) e.preventDefault();\n      const s = seamOf(k);\n      if (!s) return;\n      pickFor(s);\n      ctx.act(\"drawer.seam\", { key: k, y: Math.round((s.y + d * (e.shiftKey ? 10 : 1)) * 10) / 10 });\n    }\n    input.addEventListener(\"focus\", () => {\n      editing = true;\n    });\n    input.addEventListener(\"keydown\", (e) => {\n      stop(e);\n      if (e.key === \"Enter\") {\n        e.preventDefault();\n        apply();\n        input.blur();\n      } else if (e.key === \"Escape\") {\n        e.preventDefault();\n        editing = false;\n        input.blur();\n        frame2();\n      }\n    });\n    input.addEventListener(\"blur\", () => {\n      if (editing) apply();\n      editing = false;\n      frame2();\n    });\n    function apply() {\n      const v = Number(input.value);\n      const at = Number(field.getAttribute(\"data-ub-boxi\"));\n      const i = at >= 0 ? at : active;\n      const u = selected2(ctx.scene()), b = u && boxOf2(drawerBoxes(u), i);\n      if (field.getAttribute(\"data-ub-mode\") === \"box\") {\n        if (!b || !(v > 0) || Math.abs(v - b.h) < 0.05) return;\n        editing = false;\n        ctx.act(\"drawer.boxH\", { i: b.i, h: v });\n        return;\n      }\n      if (field.getAttribute(\"data-ub-mode\") === \"y\") {\n        if (!b || b.xn == null || !isFinite(v) || input.value === \"\" || Math.round(v) === Math.round(b.fy0)) return;\n        editing = false;\n        ctx.act(\"drawer.move\", { n: b.xn, y: v });\n        return;\n      }\n      if (!b || !(v > 0) || Math.round(v) === Math.round(b.fy1 - b.fy0)) return;\n      editing = false;\n      ctx.act(\"drawer.height\", { i, h: v });\n    }\n    function covered(el) {\n      if (!el.getBoundingClientRect || !root.querySelectorAll) return false;\n      const r = el.getBoundingClientRect();\n      if (!(r.width > 0)) return false;\n      const cx = r.left + r.width / 2, cy = r.top + r.height / 2;\n      for (const n of root.querySelectorAll(COVERS2)) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        const q = n.getBoundingClientRect();\n        if (q.width > 0 && cx >= q.left - 2 && cx <= q.right + 2 && cy >= q.top - 2 && cy <= q.bottom + 2) return true;\n      }\n      return false;\n    }\n    function hide() {\n      if (!layer2.hasAttribute(\"hidden\")) layer2.setAttribute(\"hidden\", \"\");\n    }\n    const pvSvg = doc2.createElementNS ? doc2.createElementNS(NS7, \"svg\") : null;\n    if (pvSvg) {\n      pvSvg.setAttribute(\"class\", \"ub-lab__dpreview\");\n      pvSvg.setAttribute(\"aria-hidden\", \"true\");\n      pvSvg.setAttribute(\"data-ub-dpreview\", \"\");\n      pvSvg.setAttribute(\"hidden\", \"\");\n      host.appendChild(pvSvg);\n    }\n    function drawPreview(scene) {\n      if (!pvSvg) return;\n      const pv = scene && scene.drawerPreview;\n      const u = pv && (scene.units || []).find((v) => v.id === pv.id);\n      if (!pv || !u) {\n        if (!pvSvg.hasAttribute(\"hidden\")) {\n          pvSvg.setAttribute(\"hidden\", \"\");\n          pvSvg.innerHTML = \"\";\n          pvSvg.removeAttribute(\"data-state\");\n        }\n        return;\n      }\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      pvSvg.setAttribute(\"width\", cw);\n      pvSvg.setAttribute(\"height\", ch);\n      pvSvg.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      const P2 = (x, y, z) => {\n        const q = px(u, [x, y, z]);\n        return q ? Math.round(q[0] * 10) / 10 + \" \" + Math.round(q[1] * 10) / 10 : null;\n      };\n      const line = (A, B, cls) => A && B ? '<path class=\"' + cls + '\" d=\"M' + A + \"L\" + B + '\"></path>' : \"\";\n      let h = \"\";\n      if (pv.ok && pv.box) {\n        const b = pv.box, X = [b.x0, b.x1], Y = [b.y0, b.y1], Z = [b.z0, b.z1];\n        const c = (i, j, k) => P2(X[i], Y[j], Z[k]);\n        for (const j of [0, 1]) for (const k of [0, 1]) h += line(c(0, j, k), c(1, j, k), \"ub-dpv__box\");\n        for (const i of [0, 1]) for (const k of [0, 1]) h += line(c(i, 0, k), c(i, 1, k), \"ub-dpv__box\");\n        for (const i of [0, 1]) for (const j of [0, 1]) h += line(c(i, j, 0), c(i, j, 1), \"ub-dpv__box\");\n        if (pv.front && !pv.frontless) {\n          const f = pv.front, z = u.d + T + 1;\n          const q = [P2(f.x0, f.y0, z), P2(f.x1, f.y0, z), P2(f.x1, f.y1, z), P2(f.x0, f.y1, z)];\n          if (q.every(Boolean)) h += '<path class=\"ub-dpv__front\" d=\"M' + q.join(\"L\") + 'Z\"></path>';\n        }\n        pvSvg.setAttribute(\"data-state\", \"ok\");\n      } else {\n        const z = u.d + T + 1;\n        const q = [P2(0, 0, z), P2(u.w, 0, z), P2(u.w, u.h, z), P2(0, u.h, z)];\n        if (q.every(Boolean)) h += '<path class=\"ub-dpv__nofit\" d=\"M' + q.join(\"L\") + 'Z\"></path>' + line(q[0], q[2], \"ub-dpv__nofit\") + line(q[1], q[3], \"ub-dpv__nofit\");\n        pvSvg.setAttribute(\"data-state\", \"nofit\");\n      }\n      pvSvg.setAttribute(\"data-ub-id\", u.id);\n      pvSvg.innerHTML = h;\n      pvSvg.removeAttribute(\"hidden\");\n    }\n    function frame2() {\n      const scene = ctx.scene(), u = selected2(scene);\n      drawPreview(scene);\n      if (!u || trayOpen() || scene.explode > 0 || scene.roomSel || scene.roomArmed || scene.measureOn || scene.insideTool || !hasDrawerBoxes(u)) {\n        hide();\n        return;\n      }\n      const list = drawerBoxes(u);\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      if (!drag) active = activeIndex(scene, u, list);\n      layer2.removeAttribute(\"hidden\");\n      const eds = edgesOf(u, list);\n      let any = false;\n      for (let k = seams.length; k < seamEls.length; k++) seamEls[k].setAttribute(\"hidden\", \"\");\n      seams.forEach((s, k) => {\n        const g2 = seamEl(k);\n        g2.setAttribute(\"data-ub-seam\", s.key);\n        const z = seamZ(u, s);\n        const pa = px(u, [s.x0 + 6, s.y, z]), pb = px(u, [s.x1 - 6, s.y, z]);\n        if (!pa || !pb || Math.max(pa[0], pb[0]) < -20 || Math.min(pa[0], pb[0]) > cw + 20 || pa[1] < -20 || pa[1] > ch + 20) {\n          g2.setAttribute(\"hidden\", \"\");\n          return;\n        }\n        const len = Math.hypot(pb[0] - pa[0], pb[1] - pa[1]);\n        if (len < 8) {\n          g2.setAttribute(\"hidden\", \"\");\n          return;\n        }\n        let deg = Math.atan2(pb[1] - pa[1], pb[0] - pa[0]) * 180 / Math.PI;\n        if (deg > 90) deg -= 180;\n        if (deg < -90) deg += 180;\n        g2.removeAttribute(\"hidden\");\n        g2.style.left = Math.round((pa[0] + pb[0]) / 2) + \"px\";\n        g2.style.top = Math.round((pa[1] + pb[1]) / 2) + \"px\";\n        g2.style.width = Math.round(len) + \"px\";\n        {\n          const xm = (s.x0 + s.x1) / 2, hOf2 = (q) => {\n            const p0 = px(u, [xm, q.y0, z]), p1 = px(u, [xm, q.y1, z]);\n            return p0 && p1 ? Math.abs(p1[1] - p0[1]) : Infinity;\n          };\n          const smaller = Math.min(hOf2(s.a), hOf2(s.b));\n          if (g2.__baseH == null) {\n            let b0 = 14;\n            try {\n              const cs2 = win2 && win2.getComputedStyle ? win2.getComputedStyle(g2) : null;\n              const v = cs2 ? parseFloat(cs2.height) : NaN;\n              if (v > 0) b0 = v;\n            } catch {\n            }\n            g2.__baseH = b0;\n          }\n          const hh = isFinite(smaller) ? Math.max(6, Math.min(g2.__baseH, Math.round(smaller * 2 / 3))) : g2.__baseH;\n          g2.style.height = hh + \"px\";\n          g2.setAttribute(\"data-ub-seamh\", String(hh));\n        }\n        g2.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(deg * 10) / 10 + \"deg)\";\n        g2.classList.toggle(\"is-dragging\", !!(drag && drag.key === s.key));\n        const ci = scene.drawerBox && scene.drawerBox.id === u.id ? scene.drawerBox.i : activeIndex(scene, u, list.length);\n        const own2 = s.b.kind === \"drawer\" && s.b.i === ci ? \"top\" : s.a.kind === \"drawer\" && s.a.i === ci ? \"bottom\" : \"\";\n        if (own2) g2.setAttribute(\"data-ub-edge\", own2);\n        else g2.removeAttribute(\"data-ub-edge\");\n        const fa = Math.round(s.a.y1 - s.a.y0), fb = Math.round(s.b.y1 - s.b.y0);\n        const label = \"Joint between \" + s.a.name + \" (\" + fa + \" mm) and \" + s.b.name + \" (\" + fb + \" mm) - drag it up or down, or use the arrow keys: one grows as the other shrinks\";\n        if (g2.getAttribute(\"aria-label\") !== label) {\n          g2.setAttribute(\"aria-label\", label);\n          g2.title = s.a.name + \" / \" + s.b.name + \" - drag the joint\";\n        }\n        g2.setAttribute(\"data-ub-seamy\", String(Math.round(s.y * 10) / 10));\n        if (covered(g2)) {\n          g2.setAttribute(\"hidden\", \"\");\n          return;\n        }\n        any = true;\n      });\n      const b = boxOf2(list, active);\n      const focusSeam = seamEls.some((g2) => g2 === doc2.activeElement);\n      if (b && (drag || editing || focusSeam || wanted2(scene, u))) {\n        const fhNow = Math.round(b.fy1 - b.fy0);\n        drawDims(u, b, fhNow);\n        drawSel(u, b);\n        if (placeArrows(u, b)) any = true;\n        if (placeRemove(u, b)) any = true;\n        const rg = rangeOf(u, b.i);\n        if (rg) {\n          input.max = editMode === \"y\" ? \"\" : String(rg.hi);\n          input.min = editMode === \"y\" ? \"\" : String(rg.lo);\n          input.title = editMode === \"y\" ? \"Where the front starts, mm above the cabinet bottom\" : \"Drawer height: \" + rg.lo + \" to \" + rg.hi + \" mm fits here - the box follows\";\n        }\n        if (boxNote) boxNote.textContent = \", box \" + b.mm + \" mm\";\n        field.title = b.name.replace(/ box$/, \"\") + \": \" + fhNow + \" mm high, box \" + b.mm + \" mm - type a height or drag a joint (front and box together)\";\n        if (!numH.hasAttribute(\"hidden\")) any = true;\n        void eds;\n      } else {\n        clearDims();\n        placeArrows(u, null);\n        placeRemove(u, null);\n        if (hoverKey && seamOf(hoverKey)) drawSel(u, null);\n        else clearSel();\n      }\n      if (!(editing && doc2.activeElement === input)) field.setAttribute(\"hidden\", \"\");\n      if (!any && !(editing && doc2.activeElement === input)) hide();\n    }\n    function clearSel() {\n      if (selSvg && selSvg.innerHTML) {\n        selSvg.innerHTML = \"\";\n        selSvg.removeAttribute(\"data-ub-i\");\n        selSvg.removeAttribute(\"data-ub-active\");\n      }\n    }\n    let faceKey = \"\", faces = [], boxParts = [];\n    function drawSel(u, b) {\n      if (!selSvg) return;\n      const k = stateKey2(u);\n      if (k !== faceKey) {\n        faceKey = k;\n        faces = faceSegments(u);\n        boxParts = cabinetParts(Object.assign({}, u, { drawers: null, drawerOpen: false, xopen: [] })).filter((q) => q.kind === \"drawer-box\");\n      }\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      selSvg.setAttribute(\"width\", cw);\n      selSvg.setAttribute(\"height\", ch);\n      selSvg.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      const r111 = (v) => Math.round(v * 10) / 10;\n      const P2 = (x, y, z) => {\n        const q = px(u, [x, y, z]);\n        return q ? r111(q[0]) + \" \" + r111(q[1]) : null;\n      };\n      const seg = (A, B, cls) => A && B ? '<path class=\"' + cls + '\" d=\"M' + A + \"L\" + B + '\"></path>' : \"\";\n      const rect2 = (f, z, cls, extra) => {\n        const q = [P2(f.x0, f.y0, z), P2(f.x1, f.y0, z), P2(f.x1, f.y1, z), P2(f.x0, f.y1, z)];\n        return q.every(Boolean) ? '<path class=\"' + cls + '\"' + (extra || \"\") + ' d=\"M' + q.join(\"L\") + 'Z\"></path>' : \"\";\n      };\n      const list = drawerBoxes(u);\n      const slideI = (i) => boxOf2(list, i) ? slideOf(u, boxOf2(list, i)) : 0;\n      const faceZ = (q) => u.d + T + 1 + (q.kind === \"drawer\" ? slideI(q.i) : 0);\n      let h = \"\";\n      if (b) for (const o of list) {\n        if (o.i === b.i) continue;\n        const op = boxParts.find((q) => drawerOfPart(u, q.name) === o.i);\n        if (op) {\n          const L = op.local, sl = slideOf(u, o), X = [L.x0, L.x1], Y = [L.y0, L.y1], Z = [L.z0 + sl, L.z1 + sl];\n          const c = (i, j, m) => P2(X[i], Y[j], Z[m]);\n          let e = \"\";\n          for (const j of [0, 1]) for (const m of [0, 1]) e += seg(c(0, j, m), c(1, j, m), \"ub-dsel__peerbox\");\n          for (const i of [0, 1]) for (const m of [0, 1]) e += seg(c(i, 0, m), c(i, 1, m), \"ub-dsel__peerbox\");\n          for (const i of [0, 1]) for (const j of [0, 1]) e += seg(c(i, j, 0), c(i, j, 1), \"ub-dsel__peerbox\");\n          h += '<g data-ub-part=\"peer\" data-ub-peer=\"' + o.i + '\">' + e + \"</g>\";\n        }\n        const of = faces.find((q) => q.kind === \"drawer\" && q.i === o.i);\n        if (of) h += rect2(of, faceZ(of), \"ub-dsel__peerfront\", ' data-ub-part=\"peerfront\" data-ub-peer=\"' + o.i + '\"');\n      }\n      const bp = b ? boxParts.find((q) => drawerOfPart(u, q.name) === b.i) : null;\n      if (bp) {\n        const L = bp.local, sl = slideOf(u, b), X = [L.x0, L.x1], Y = [L.y0, L.y1], Z = [L.z0 + sl, L.z1 + sl];\n        const c = (i, j, m) => P2(X[i], Y[j], Z[m]);\n        const bc = \"ub-dsel__box\" + (editPart() === \"box\" ? \" is-edit\" : \"\");\n        for (const j of [0, 1]) for (const m of [0, 1]) h += seg(c(0, j, m), c(1, j, m), bc);\n        for (const i of [0, 1]) for (const m of [0, 1]) h += seg(c(i, 0, m), c(i, 1, m), bc);\n        for (const i of [0, 1]) for (const j of [0, 1]) h += seg(c(i, j, 0), c(i, j, 1), bc);\n      }\n      const face2 = b ? faces.find((q) => q.kind === \"drawer\" && q.i === b.i) : null;\n      if (face2) h += rect2(face2, faceZ(face2), \"ub-dsel__front\" + (editPart() === \"box\" ? \" is-context\" : \" is-edit\"), ' data-ub-part=\"front\" data-ub-edit=\"' + editPart() + '\"');\n      if (b) for (const s2 of seams) {\n        const own2 = s2.b.kind === \"drawer\" && s2.b.i === b.i || s2.a.kind === \"drawer\" && s2.a.i === b.i;\n        if (own2) h += seg(P2(s2.x0, s2.y, seamZ(u, s2)), P2(s2.x1, s2.y, seamZ(u, s2)), \"ub-dsel__grip\");\n      }\n      const focusKey = (seamEls.find((g2) => g2 === doc2.activeElement) || { getAttribute: () => null }).getAttribute(\"data-ub-seam\");\n      const key2 = drag ? drag.key : hoverKey || focusKey;\n      const s = key2 ? seamOf(key2) : null;\n      let activeEdge = \"\";\n      if (s) {\n        const sd = sidesOf3(s, b ? b.i : -1), z = seamZ(u, s);\n        activeEdge = (sd.mine ? \"\" : \"other-\") + sd.edge;\n        if (!sd.mine) h += rect2(sd.chosen, faceZ(sd.chosen), \"ub-dsel__front is-soon\");\n        h += rect2(sd.other, faceZ(sd.other), \"ub-dsel__other\", ' data-ub-part=\"neighbour\" data-ub-name=\"' + String(sd.other.name).replace(/\"/g, \"\") + '\"');\n        const A = px(u, [s.x0, s.y, z]), B = px(u, [s.x1, s.y, z]), M = px(u, [(s.x0 + s.x1) / 2, s.y, z]), U = px(u, [(s.x0 + s.x1) / 2, s.y + 100, z]);\n        if (A && B) h += seg(r111(A[0]) + \" \" + r111(A[1]), r111(B[0]) + \" \" + r111(B[1]), \"ub-dsel__edge\");\n        if (M && U) {\n          const vx = U[0] - M[0], vy = U[1] - M[1], L = Math.hypot(vx, vy) || 1, ux = vx / L, uy = vy / L, nx = -uy, ny = ux;\n          const chev = (sg) => {\n            const o = 7, t = 12, w = 5;\n            const tip = [M[0] + ux * t * sg, M[1] + uy * t * sg], bl = [M[0] + ux * o * sg + nx * w, M[1] + uy * o * sg + ny * w], br = [M[0] + ux * o * sg - nx * w, M[1] + uy * o * sg - ny * w];\n            return '<path class=\"ub-dsel__chev' + (drag && drag.dir === sg ? \" is-going\" : \"\") + '\" data-ub-way=\"' + (sg > 0 ? \"up\" : \"down\") + '\" d=\"M' + bl.map(r111).join(\" \") + \"L\" + tip.map(r111).join(\" \") + \"L\" + br.map(r111).join(\" \") + '\"></path>';\n          };\n          if (!drag || drag.dir >= 0) h += chev(1);\n          if (!drag || drag.dir <= 0) h += chev(-1);\n        }\n      }\n      if (drag && drag.guide) {\n        const gd = drag.guide, zf = u.d + T + 1;\n        if (gd.kind === \"edge\") {\n          const A = P2(Math.max(0, gd.x0 - 20), gd.at, zf), B = P2(Math.min(u.w, gd.x1 + 20), gd.at, zf);\n          h += '<path class=\"ub-dsel__guide\" data-ub-guide=\"edge\" data-ub-at=\"' + r111(gd.at) + '\" d=\"M' + A + \"L\" + B + '\"></path>';\n          for (const E of [A, B]) if (E) {\n            const [ex, ey] = E.split(\" \");\n            h += '<circle class=\"ub-dsel__guidedot\" cx=\"' + ex + '\" cy=\"' + ey + '\" r=\"2.5\"></circle>';\n          }\n        } else {\n          const of = faces.find((q) => q.kind === \"drawer\" && q.i === gd.i);\n          if (of) h += rect2(of, faceZ(of), \"ub-dsel__guide\", ' data-ub-guide=\"equal\" data-ub-peer=\"' + gd.i + '\"');\n        }\n      }\n      if (hdrag && hdrag.box && hdrag.guide && bp) {\n        const gd = hdrag.guide, op = boxParts.find((q) => drawerOfPart(u, q.name) === gd.i), oo = boxOf2(list, gd.i);\n        if (op && oo) {\n          const L = op.local, sl = slideOf(u, oo);\n          if (gd.kind === \"boxequal\") {\n            const X = [L.x0, L.x1], Y = [L.y0, L.y1], Z = [L.z0 + sl, L.z1 + sl], c = (i, j, m) => P2(X[i], Y[j], Z[m]);\n            let e = \"\";\n            for (const j of [0, 1]) for (const m of [0, 1]) e += seg(c(0, j, m), c(1, j, m), \"ub-dsel__guide\");\n            for (const i of [0, 1]) for (const m of [0, 1]) e += seg(c(i, 0, m), c(i, 1, m), \"ub-dsel__guide\");\n            for (const i of [0, 1]) for (const j of [0, 1]) e += seg(c(i, j, 0), c(i, j, 1), \"ub-dsel__guide\");\n            h += '<g data-ub-guide=\"boxequal\" data-ub-peer=\"' + gd.i + '\" data-ub-h=\"' + gd.h + '\">' + e + \"</g>\";\n          } else {\n            const zl = Math.max(L.z1 + sl, bp.local.z1 + slideOf(u, b)), A = P2(Math.min(L.x0, bp.local.x0), gd.at, zl), B = P2(Math.max(L.x1, bp.local.x1), gd.at, zl);\n            h += '<path class=\"ub-dsel__guide\" data-ub-guide=\"boxtop\" data-ub-peer=\"' + gd.i + '\" data-ub-at=\"' + r111(gd.at) + '\" d=\"M' + A + \"L\" + B + '\"></path>';\n            for (const E of [A, B]) if (E) {\n              const [ex, ey] = E.split(\" \");\n              h += '<circle class=\"ub-dsel__guidedot\" cx=\"' + ex + '\" cy=\"' + ey + '\" r=\"2.5\"></circle>';\n            }\n          }\n        }\n      }\n      selSvg.innerHTML = h;\n      if (b) selSvg.setAttribute(\"data-ub-i\", String(b.i));\n      else selSvg.removeAttribute(\"data-ub-i\");\n      if (activeEdge) selSvg.setAttribute(\"data-ub-active\", activeEdge);\n      else selSvg.removeAttribute(\"data-ub-active\");\n    }\n    function clearDims() {\n      if (dimSvgEl) dimSvgEl.innerHTML = \"\";\n      numH.setAttribute(\"hidden\", \"\");\n      numY.setAttribute(\"hidden\", \"\");\n      numB.setAttribute(\"hidden\", \"\");\n    }\n    let boxHGeom = null;\n    function boxDims(u, b) {\n      boxHGeom = null;\n      const parts2 = cabinetParts(u).filter((q) => q.kind === \"drawer-box\"), list = drawerBoxes(u);\n      const Q = (x, y, z) => {\n        const q = px(u, [x, y, z]);\n        return q ? { x: q[0], y: q[1] } : null;\n      };\n      const one = (o, chosen, ref) => {\n        const bp = parts2.find((q) => drawerOfPart(u, q.name) === o.i);\n        if (!bp) return \"\";\n        const L = bp.local, sl = slideOf(u, o), z0 = L.z0 + sl, z1 = L.z1 + sl;\n        const C3 = Q((L.x0 + L.x1) / 2, (L.y0 + L.y1) / 2, (z0 + z1) / 2);\n        if (!C3) return \"\";\n        const off = chosen ? 14 : 10, out = [];\n        const dim = (A, B, val, what) => {\n          if (!A || !B || Math.hypot(B.x - A.x, B.y - A.y) < 3) return;\n          const g2 = dimGeom(A, B, normalAway(A, B, C3), off, 0.5, 11);\n          if (chosen && what === \"h\") {\n            boxHGeom = { g: g2, val };\n            out.push('<g data-ub-dim=\"box-h\" data-ub-box=\"' + o.i + '\" class=\"is-box\">' + dimSvg(g2) + \"</g>\");\n            return;\n          }\n          out.push('<g data-ub-dim=\"box-' + what + '\" data-ub-box=\"' + o.i + '\" class=\"' + (chosen ? \"is-box\" : \"is-peer\") + '\">' + dimSvg(g2) + '<text class=\"ub-dim__peertext\" x=\"' + Math.round(g2.text.x) + '\" y=\"' + Math.round(g2.text.y) + '\" transform=\"rotate(' + Math.round(g2.text.deg) + \" \" + Math.round(g2.text.x) + \" \" + Math.round(g2.text.y) + ')\">' + val + \"</text></g>\");\n        };\n        const W2 = mmText(o.w), H2 = mmText(o.h), D2 = mmText(o.l);\n        dim(Q(L.x1, L.y0, z0), Q(L.x1, L.y1, z0), H2, \"h\");\n        if (chosen || ref && W2 !== mmText(ref.w)) dim(Q(L.x0, L.y0, z0), Q(L.x1, L.y0, z0), W2, \"w\");\n        if (chosen || ref && D2 !== mmText(ref.l)) dim(Q(L.x1, L.y0, z0), Q(L.x1, L.y0, z1), D2, \"d\");\n        return out.join(\"\");\n      };\n      let h = one(b, true, null);\n      for (const o of list) if (o.i !== b.i) h += one(o, false, b);\n      return h;\n    }\n    function drawDims(u, b, fhNow) {\n      const z = u.d + T + 1 + slideOf(u, b), ym = (b.fy0 + b.fy1) / 2;\n      const c = px(u, [u.w / 2, ym, z]), pl = px(u, [0, ym, z]), pr = px(u, [u.w, ym, z]);\n      if (!c || !pl || !pr) {\n        clearDims();\n        return;\n      }\n      const sx = Math.abs(pr[0] - c[0]) >= Math.abs(pl[0] - c[0]) ? u.w : 0;\n      const P2 = (y) => {\n        const q = px(u, [sx, y, z]);\n        return q ? { x: q[0], y: q[1] } : null;\n      };\n      const Pa = P2(b.fy0), Pb = P2(b.fy1), P0 = P2(0), C3 = { x: c[0], y: c[1] };\n      if (!Pa || !Pb || !P0) {\n        clearDims();\n        return;\n      }\n      const n = normalAway(Pa, Pb, C3);\n      const gH = dimGeom(Pa, Pb, n, 16, 0.5, 13);\n      const showY = b.fy0 > 6 && Math.hypot(Pa.x - P0.x, Pa.y - P0.y) >= 14;\n      const gY = showY ? dimGeom(P0, Pa, n, 16, 0.5, 13) : null;\n      if (dimSvgEl) {\n        const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n        dimSvgEl.setAttribute(\"width\", cw);\n        dimSvgEl.setAttribute(\"height\", ch);\n        dimSvgEl.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n        let peers = \"\";\n        for (const o of drawerBoxes(u)) {\n          if (o.i === b.i) continue;\n          const Qa = P2(o.fy0), Qb = P2(o.fy1);\n          if (!Qa || !Qb || Math.hypot(Qb.x - Qa.x, Qb.y - Qa.y) < 14) continue;\n          const gO = dimGeom(Qa, Qb, n, 34, 0.5, 11), fh = mmText(o.fy1 - o.fy0);\n          peers += '<g data-ub-dim=\"drawer-peer\" data-ub-peer=\"' + o.i + '\" class=\"is-peer\">' + dimSvg(gO) + '<text class=\"ub-dim__peertext\" x=\"' + Math.round(gO.text.x) + '\" y=\"' + Math.round(gO.text.y) + '\" transform=\"rotate(' + Math.round(gO.text.deg) + \" \" + Math.round(gO.text.x) + \" \" + Math.round(gO.text.y) + ')\">' + fh + \"</text></g>\";\n        }\n        dimSvgEl.innerHTML = '<g data-ub-dim=\"drawer-h\" class=\"' + (editPart() === \"front\" ? \"is-active\" : \"is-context\") + '\">' + dimSvg(gH) + \"</g>\" + (gY ? '<g data-ub-dim=\"drawer-y\">' + dimSvg(gY) + \"</g>\" : \"\") + peers + boxDims(u, b);\n      }\n      const put = (el, g2, text, title) => {\n        el.removeAttribute(\"hidden\");\n        el.textContent = text;\n        el.style.left = Math.round(g2.text.x) + \"px\";\n        el.style.top = Math.round(g2.text.y) + \"px\";\n        el.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(g2.text.deg) + \"deg)\";\n        el.title = title;\n        if (covered(el)) el.setAttribute(\"hidden\", \"\");\n      };\n      const name2 = b.name.replace(/ box$/, \"\");\n      if (boxHGeom) {\n        put(numB, boxHGeom.g, boxHGeom.val, name2 + \": BOX \" + boxHGeom.val + \" mm high (its front unchanged) - click to type\");\n        numB.setAttribute(\"data-ub-boxi\", String(b.i));\n      } else numB.setAttribute(\"hidden\", \"\");\n      numB.classList.toggle(\"is-edit\", editPart() === \"box\");\n      numH.classList.toggle(\"is-edit\", editPart() === \"front\");\n      put(numH, gH, mmText(b.fy1 - b.fy0), name2 + \": FRONT \" + mmText(b.fy1 - b.fy0) + \" mm high (front and box together; its box \" + mmText(b.h) + \" mm high) - click to type\");\n      numH.setAttribute(\"data-ub-boxi\", String(b.i));\n      if (gY) put(numY, gY, String(Math.round(b.fy0)), name2 + \": starts \" + Math.round(b.fy0) + \" mm above the cabinet bottom\" + (b.xn != null ? \" - click to type\" : \"\"));\n      else numY.setAttribute(\"hidden\", \"\");\n      numY.classList.toggle(\"is-readonly\", b.xn == null);\n    }\n    try {\n      const loc = win2 && win2.location;\n      const hm = /^#ub-dsel-(\\d{1,2})-(\\d{1,2})(?:-(top|bottom))?$/.exec(String(loc && loc.hash || \"\"));\n      if (hm && win2.setTimeout) win2.setTimeout(() => {\n        try {\n          const scene = ctx.scene(), u = (scene.units || [])[Number(hm[1]) - 1];\n          if (!u || !hasDrawerBoxes(u)) return;\n          ctx.act(\"select\", { id: u.id });\n          const list = drawerBoxes(u), k = Number(hm[2]);\n          const b = list.find((q) => q.name.replace(/ box$/, \"\") === \"Drawer \" + k) || list[k - 1];\n          if (!b) return;\n          ctx.act(\"drawer.box\", { i: b.i });\n          edgesOf(u, list);\n          if (hm[3]) {\n            const sm2 = seams.find((q) => hm[3] === \"top\" ? q.b.kind === \"drawer\" && q.b.i === b.i : q.a.kind === \"drawer\" && q.a.i === b.i);\n            if (sm2) {\n              hoverKey = sm2.key;\n              hoverCue(sm2.key);\n            }\n          }\n          frame2();\n          if (view.requestRender) view.requestRender();\n        } catch (err) {\n        }\n      }, 900);\n    } catch (err) {\n    }\n    function sync() {\n      frame2();\n    }\n    return { sync, frame: frame2, el: layer2, active: () => active, dragging: () => !!drag };\n  }\n\n  // v2/src/ui/interior-drag.js\n  var KINDS2 = { shelf: \"shelf\", divider: \"vertical divider\", hdivider: \"horizontal divider\" };\n  var SEL3 = '[data-ub-itool=\"shelf\"], [data-ub-itool=\"divider\"], [data-ub-itool=\"hdivider\"]';\n  var NS3 = \"http://www.w3.org/2000/svg\";\n  var ICON = {\n    shelf: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"10.5\" width=\"18\" height=\"3\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"/></svg>',\n    hdivider: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"2\" y=\"10\" width=\"20\" height=\"4\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"/></svg>',\n    divider: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"10.5\" y=\"3\" width=\"3\" height=\"18\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"/></svg>'\n  };\n  function createInteriorDrag(ctx) {\n    const root = ctx.root, view = ctx.view, doc2 = root && root.ownerDocument, win2 = doc2 && doc2.defaultView;\n    if (!root || !doc2 || !win2 || !root.addEventListener) return { sync() {\n    }, frame() {\n    } };\n    const q = (s) => root.querySelector(s);\n    const finBtn = q(\"[data-ub-finbtn]\");\n    const host = finBtn ? finBtn.parentNode : null;\n    let dg = null, rafId = 0, pend = null, eatClickUntil = 0;\n    const canvasAt = (x, y) => {\n      const cv = q(\".ub-lab__canvas\");\n      if (!cv || !cv.getBoundingClientRect) return false;\n      const r = cv.getBoundingClientRect();\n      if (!(x >= r.left && x <= r.right && y >= r.top && y <= r.bottom)) return false;\n      const el = doc2.elementFromPoint ? doc2.elementFromPoint(x, y) : null;\n      if (!el || !root.contains(el)) return false;\n      return !(el.closest && el.closest(\".ub-lab__flyout, .ub-lab__kmatpop, .ub-lab__dock, .ub-lab__eyemenu, .ub-lab__finpop, .ub-lab__panel\"));\n    };\n    const ghostAt = (x, y, state2) => {\n      if (!dg || !dg.ghost) return;\n      dg.ghost.style.left = Math.round(x) + \"px\";\n      dg.ghost.style.top = Math.round(y) + \"px\";\n      dg.ghost.classList.toggle(\"is-over\", state2 === \"ok\" || state2 === \"over\");\n      dg.ghost.classList.toggle(\"is-target\", state2 === \"ok\");\n      dg.ghost.classList.toggle(\"is-nofit\", state2 === \"nofit\");\n    };\n    const caption = (r) => {\n      const h = q(\"[data-ub-modehint]\");\n      if (!h || !dg) return;\n      if (dg.hint0 == null) dg.hint0 = h.textContent;\n      const w = KINDS2[dg.kind], W2 = w.charAt(0).toUpperCase() + w.slice(1);\n      const t = !r || r.none ? r && r.why && !/^Let go/.test(r.why) ? r.why : \"Carry the \" + w + \" into a cabinet and let go where you want it - Escape cancels\" : r.ok ? W2 + \" in \" + r.name + (r.bay && r.bay !== \"this cabinet\" ? \", \" + r.bay : \"\") + (dg.kind === \"divider\" ? \" at \" + Math.round(r.x) + \" mm from the inside left\" : \" at \" + Math.round(r.y) + \" mm above the inside bottom\") + (r.snapped ? \" (\" + r.snapped + \")\" : \"\") + \" - let go to add it\" : \"No room for a \" + w + \" here: \" + (r.why || \"it does not fit\");\n      if (dg.ghost && dg.ghost.getAttribute(\"aria-label\") !== t) dg.ghost.setAttribute(\"aria-label\", t);\n      h.classList.add(\"is-dragquiet\");\n      h.classList.remove(\"is-dragtip\", \"is-nofit\");\n    };\n    const captionOff = (g2) => {\n      const h = q(\"[data-ub-modehint]\");\n      if (!h || g2.hint0 == null) return;\n      h.textContent = g2.hint0;\n      h.classList.remove(\"is-dragtip\", \"is-nofit\", \"is-dragquiet\");\n    };\n    const previewAt = (x, y) => {\n      if (!dg) return;\n      if (!canvasAt(x, y)) {\n        if (dg.pv) {\n          dg.pv = null;\n          ctx.act(\"interior.previewClear\", {});\n        }\n        ghostAt(x, y, \"off\");\n        caption(null);\n        return;\n      }\n      const r = ctx.act(\"interior.preview\", { kind: dg.kind, cx: x, cy: y }) || {};\n      dg.pv = r.none ? null : r;\n      ghostAt(x, y, r.none ? \"over\" : r.ok ? \"ok\" : \"nofit\");\n      caption(r);\n    };\n    const requestPreview = (x, y) => {\n      pend = { x, y };\n      if (rafId) return;\n      const raf = win2.requestAnimationFrame ? win2.requestAnimationFrame.bind(win2) : (f) => win2.setTimeout(f, 16);\n      rafId = raf(() => {\n        rafId = 0;\n        if (!dg || !pend) return;\n        const p = pend;\n        pend = null;\n        previewAt(p.x, p.y);\n      });\n    };\n    const finish3 = (e, drop) => {\n      if (!dg) return;\n      const g2 = dg;\n      dg = null;\n      pend = null;\n      for (const [t, f] of g2.ls) win2.removeEventListener(t, f, true);\n      if (g2.ghost && g2.ghost.parentNode) g2.ghost.parentNode.removeChild(g2.ghost);\n      g2.btn.classList.remove(\"is-dragging\");\n      captionOff(g2);\n      if (!g2.moved) return;\n      eatClickUntil = Date.now() + 600;\n      if (!drop) {\n        ctx.act(\"interior.previewClear\", {});\n        return;\n      }\n      if (canvasAt(e.clientX, e.clientY)) ctx.act(\"interior.dropAt\", { kind: g2.kind, cx: e.clientX, cy: e.clientY });\n      else {\n        ctx.act(\"interior.previewClear\", {});\n        if (ctx.cue) ctx.cue(\"Not added - let go of the \" + KINDS2[g2.kind] + \" inside a cabinet\");\n      }\n    };\n    const onDown = (e) => {\n      const btn = e.target && e.target.closest ? e.target.closest(SEL3) : null;\n      if (!btn || !root.contains(btn) || btn.disabled) return;\n      if (e.button != null && e.button !== 0) return;\n      if (e.isPrimary === false) return;\n      e.preventDefault();\n      if (dg) finish3(e, false);\n      const kind = btn.getAttribute(\"data-ub-itool\");\n      dg = { kind, btn, x0: e.clientX, y0: e.clientY, moved: false, ghost: null, ls: [], pv: null, pid: e.pointerId, hint0: null };\n      const mv = (ev) => {\n        if (!dg || dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (ev.isTrusted === true && ev.pointerType === \"mouse\" && ev.buttons === 0) {\n          finish3(ev, false);\n          return;\n        }\n        if (!dg.moved && Math.hypot(ev.clientX - dg.x0, ev.clientY - dg.y0) < 5) return;\n        if (!dg.moved) {\n          dg.moved = true;\n          dg.btn.classList.add(\"is-dragging\");\n          const gh = doc2.createElement(\"div\");\n          gh.className = \"ub-lab__dghost\";\n          gh.setAttribute(\"aria-hidden\", \"true\");\n          gh.setAttribute(\"data-ub-ighost\", dg.kind);\n          gh.innerHTML = ICON[dg.kind] || \"\";\n          root.appendChild(gh);\n          dg.ghost = gh;\n        }\n        ev.preventDefault();\n        ghostAt(ev.clientX, ev.clientY, dg.pv ? dg.pv.ok ? \"ok\" : \"nofit\" : canvasAt(ev.clientX, ev.clientY) ? \"over\" : \"off\");\n        requestPreview(ev.clientX, ev.clientY);\n      };\n      const upF = (ev) => {\n        if (dg && dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (dg && dg.moved) ev.stopPropagation();\n        finish3(ev, true);\n      };\n      const cancel = (ev) => finish3(ev, false);\n      const keyF = (ev) => {\n        if (ev.key === \"Escape\") {\n          ev.stopPropagation();\n          if (ev.preventDefault) ev.preventDefault();\n          finish3(ev, false);\n        }\n      };\n      dg.ls = [[\"pointermove\", mv], [\"pointerup\", upF], [\"pointercancel\", cancel], [\"keydown\", keyF], [\"blur\", cancel]];\n      for (const [t, f] of dg.ls) win2.addEventListener(t, f, true);\n    };\n    root.addEventListener(\"pointerdown\", onDown, true);\n    const onClick = (e) => {\n      if (Date.now() > eatClickUntil) return;\n      const btn = e.target && e.target.closest ? e.target.closest(SEL3) : null;\n      if (!btn) return;\n      eatClickUntil = 0;\n      e.stopPropagation();\n      if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n      e.preventDefault();\n    };\n    root.addEventListener(\"click\", onClick, true);\n    const svg2 = host && doc2.createElementNS ? doc2.createElementNS(NS3, \"svg\") : null;\n    if (svg2) {\n      svg2.setAttribute(\"class\", \"ub-lab__dpreview ub-lab__ipreview\");\n      svg2.setAttribute(\"aria-hidden\", \"true\");\n      svg2.setAttribute(\"data-ub-ipreview\", \"\");\n      svg2.setAttribute(\"hidden\", \"\");\n      host.appendChild(svg2);\n    }\n    function px(u, p) {\n      const w = unitXf(u).p(p);\n      const nd = view.worldToNdc ? view.worldToNdc(w) : null;\n      if (!nd) return null;\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      return [(nd[0] + 1) / 2 * cw, (1 - nd[1]) / 2 * ch];\n    }\n    function frame2() {\n      if (!svg2) return;\n      const scene = ctx.scene(), pv = scene && scene.interiorPreview;\n      const u = pv && (scene.units || []).find((v) => v.id === pv.id);\n      if (!pv || !u || !view.worldToNdc) {\n        if (!svg2.hasAttribute(\"hidden\")) {\n          svg2.setAttribute(\"hidden\", \"\");\n          svg2.innerHTML = \"\";\n          svg2.removeAttribute(\"data-state\");\n          svg2.removeAttribute(\"data-ub-id\");\n          svg2.removeAttribute(\"data-centre\");\n        }\n        return;\n      }\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      svg2.setAttribute(\"width\", cw);\n      svg2.setAttribute(\"height\", ch);\n      svg2.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      const P2 = (x, y, z) => {\n        const r = px(u, [x, y, z]);\n        return r ? Math.round(r[0] * 10) / 10 + \" \" + Math.round(r[1] * 10) / 10 : null;\n      };\n      const line = (A, B, cls2) => A && B ? '<path class=\"' + cls2 + '\" d=\"M' + A + \"L\" + B + '\"></path>' : \"\";\n      const centre3 = (pv.kind === \"divider\" || pv.kind === \"hdivider\") && pv.ok ? pv.snapped ? \"centred\" : \"off\" : null;\n      const cls = pv.ok ? \"ub-dpv__box\" + (centre3 === \"centred\" ? \" ub-dpv__centred\" : centre3 === \"off\" ? \" ub-dpv__offcentre\" : \"\") : \"ub-dpv__nofit\";\n      let h = \"\";\n      for (const it of pv.boxes || []) {\n        const b = it.box, X = [b.x0, b.x1], Y = [b.y0, b.y1], Z = [b.z0, b.z1];\n        const c = (i, j, k) => P2(X[i], Y[j], Z[k]);\n        for (const j of [0, 1]) for (const k of [0, 1]) h += line(c(0, j, k), c(1, j, k), cls);\n        for (const i of [0, 1]) for (const k of [0, 1]) h += line(c(i, 0, k), c(i, 1, k), cls);\n        for (const i of [0, 1]) for (const j of [0, 1]) h += line(c(i, j, 0), c(i, j, 1), cls);\n      }\n      if (!pv.ok && !(pv.boxes || []).length) {\n        const z = u.d + 19;\n        const r = [P2(0, 0, z), P2(u.w, 0, z), P2(u.w, u.h, z), P2(0, u.h, z)];\n        if (r.every(Boolean)) h += '<path class=\"ub-dpv__nofit\" d=\"M' + r.join(\"L\") + 'Z\"></path>' + line(r[0], r[2], \"ub-dpv__nofit\") + line(r[1], r[3], \"ub-dpv__nofit\");\n      }\n      svg2.setAttribute(\"data-state\", pv.ok ? \"ok\" : \"nofit\");\n      if (centre3) svg2.setAttribute(\"data-centre\", centre3);\n      else svg2.removeAttribute(\"data-centre\");\n      svg2.setAttribute(\"data-ub-id\", u.id);\n      svg2.setAttribute(\"data-ub-kind\", pv.kind);\n      svg2.innerHTML = h;\n      svg2.removeAttribute(\"hidden\");\n    }\n    try {\n      const loc = win2.location, mm = loc ? /^#ub-idrag-(shelf|divider|hdivider)-(\\d{1,2})-(\\d{1,2})$/.exec(String(loc.hash || \"\")) : null;\n      const standHost = !!loc && /(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\");\n      if (mm && standHost && win2.setTimeout && win2.PointerEvent) win2.setTimeout(() => {\n        try {\n          const kind = mm[1], u = (ctx.scene().units || [])[Number(mm[2]) - 1], cv = q(\".ub-lab__canvas\");\n          if (!u || !cv || !view.worldToNdc) return;\n          const vis = () => Array.prototype.slice.call(root.querySelectorAll('[data-ub-itool=\"' + kind + '\"]')).filter((b) => b.getBoundingClientRect && b.getBoundingClientRect().width > 0)[0];\n          if (!vis()) {\n            const fly = q('[data-ub-fly=\"inside\"]');\n            if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") fly.click();\n          }\n          win2.setTimeout(() => {\n            const btn = vis();\n            if (!btn) return;\n            const pct = Math.min(95, Math.max(5, Number(mm[3]))) / 100;\n            const lp = kind === \"divider\" ? [u.w * pct, u.h * 0.5, u.d + 20] : [u.w / 2, u.h * pct, u.d + 20];\n            const nd = view.worldToNdc(unitXf(u).p(lp)), r = cv.getBoundingClientRect(), b = btn.getBoundingClientRect();\n            if (!nd) return;\n            const tx = r.left + (nd[0] + 1) / 2 * r.width, ty = r.top + (1 - nd[1]) / 2 * r.height;\n            const bx2 = b.left + b.width / 2, by = b.top + b.height / 2;\n            const ev = (type, x, y, buttons) => new win2.PointerEvent(type, { clientX: x, clientY: y, button: 0, buttons, pointerId: 43, pointerType: \"mouse\", isPrimary: true, bubbles: true, cancelable: true });\n            btn.dispatchEvent(ev(\"pointerdown\", bx2, by, 1));\n            let k = 0;\n            const step = () => {\n              k++;\n              win2.dispatchEvent(ev(\"pointermove\", bx2 + (tx - bx2) * k / 8, by + (ty - by) * k / 8, 1));\n              if (k < 8) {\n                win2.setTimeout(step, 40);\n                return;\n              }\n              const stand = /(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\");\n              if (stand && /[?&]qa_drop=1\\b/.test(loc.search || \"\")) win2.setTimeout(() => win2.dispatchEvent(ev(\"pointerup\", tx, ty, 0)), 300);\n            };\n            win2.setTimeout(step, 60);\n          }, 500);\n        } catch {\n        }\n      }, 1400);\n    } catch {\n    }\n    return {\n      sync() {\n      },\n      frame: frame2,\n      dragging: () => dg ? { kind: dg.kind, moved: dg.moved } : null,\n      destroy() {\n        if (dg) finish3({}, false);\n        root.removeEventListener(\"pointerdown\", onDown, true);\n        root.removeEventListener(\"click\", onClick, true);\n      }\n    };\n  }\n\n  // v2/src/ui/glass-drag.js\n  var SEL4 = \"[data-ub-glassdrag]\";\n  var NS4 = \"http://www.w3.org/2000/svg\";\n  var ICON2 = '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"5\" y=\"2.5\" width=\"14\" height=\"19\" rx=\"1\" fill=\"#fff\" stroke=\"currentColor\" stroke-width=\"1.6\"/><rect x=\"8\" y=\"5.5\" width=\"8\" height=\"13\" fill=\"#cfe0ec\" stroke=\"currentColor\" stroke-width=\"1\"/></svg>';\n  function createGlassDrag(ctx) {\n    const root = ctx.root, view = ctx.view, doc2 = root && root.ownerDocument, win2 = doc2 && doc2.defaultView;\n    if (!root || !doc2 || !win2 || !root.addEventListener) return { sync() {\n    }, frame() {\n    } };\n    const q = (s) => root.querySelector(s);\n    const finBtn = q(\"[data-ub-finbtn]\");\n    const host = finBtn ? finBtn.parentNode : null;\n    let dg = null, rafId = 0, pend = null, eatClickUntil = 0;\n    const canvasAt = (x, y) => {\n      const cv = q(\".ub-lab__canvas\");\n      if (!cv || !cv.getBoundingClientRect) return false;\n      const r = cv.getBoundingClientRect();\n      if (!(x >= r.left && x <= r.right && y >= r.top && y <= r.bottom)) return false;\n      const el = doc2.elementFromPoint ? doc2.elementFromPoint(x, y) : null;\n      if (!el || !root.contains(el)) return false;\n      return !(el.closest && el.closest(\".ub-lab__flyout, .ub-lab__kmatpop, .ub-lab__dock, .ub-lab__eyemenu, .ub-lab__finpop, .ub-lab__panel\"));\n    };\n    const ghostAt = (x, y, state2) => {\n      if (!dg || !dg.ghost) return;\n      dg.ghost.style.left = Math.round(x) + \"px\";\n      dg.ghost.style.top = Math.round(y) + \"px\";\n      dg.ghost.classList.toggle(\"is-over\", state2 === \"ok\" || state2 === \"over\");\n      dg.ghost.classList.toggle(\"is-target\", state2 === \"ok\");\n      dg.ghost.classList.toggle(\"is-nofit\", state2 === \"nofit\");\n    };\n    const caption = (r) => {\n      const h = q(\"[data-ub-modehint]\");\n      if (!h || !dg) return;\n      if (dg.hint0 == null) dg.hint0 = h.textContent;\n      const n = r && r.targets ? r.targets.length : 0;\n      const t = !r || r.none ? \"Carry Glass onto the cabinet you want it on and let go - only that cabinet changes; Escape cancels\" : r.ok ? \"Glass door\" + (n === 1 ? \"\" : \"s\") + \" on \" + r.name + \" only (visible glass \" + r.targets.map((g2) => g2.h + \" x \" + g2.w).join(\", \") + \" mm) - let go to fit \" + (n === 1 ? \"it\" : \"them\") : \"Not here: \" + (r.why || \"this cabinet cannot take glass\");\n      if (h.textContent !== t) h.textContent = t;\n      h.classList.add(\"is-dragtip\");\n      h.classList.toggle(\"is-nofit\", !!(r && !r.none && !r.ok));\n    };\n    const captionOff = (g2) => {\n      const h = q(\"[data-ub-modehint]\");\n      if (!h || g2.hint0 == null) return;\n      h.textContent = g2.hint0;\n      h.classList.remove(\"is-dragtip\", \"is-nofit\");\n    };\n    const previewAt = (x, y) => {\n      if (!dg) return;\n      if (!canvasAt(x, y)) {\n        if (dg.pv) {\n          dg.pv = null;\n          ctx.act(\"glass.previewClear\", {});\n        }\n        ghostAt(x, y, \"off\");\n        caption(null);\n        return;\n      }\n      const r = ctx.act(\"glass.preview\", { cx: x, cy: y }) || {};\n      dg.pv = r.none ? null : r;\n      ghostAt(x, y, r.none ? \"over\" : r.ok ? \"ok\" : \"nofit\");\n      caption(r);\n    };\n    const requestPreview = (x, y) => {\n      pend = { x, y };\n      if (rafId) return;\n      const raf = win2.requestAnimationFrame ? win2.requestAnimationFrame.bind(win2) : (f) => win2.setTimeout(f, 16);\n      rafId = raf(() => {\n        rafId = 0;\n        if (!dg || !pend) return;\n        const p = pend;\n        pend = null;\n        previewAt(p.x, p.y);\n      });\n    };\n    const finish3 = (e, drop) => {\n      if (!dg) return;\n      const g2 = dg;\n      dg = null;\n      pend = null;\n      for (const [t, f] of g2.ls) win2.removeEventListener(t, f, true);\n      if (g2.ghost && g2.ghost.parentNode) g2.ghost.parentNode.removeChild(g2.ghost);\n      g2.btn.classList.remove(\"is-dragging\");\n      captionOff(g2);\n      if (!g2.moved) return;\n      eatClickUntil = Date.now() + 600;\n      if (!drop) {\n        ctx.act(\"glass.previewClear\", {});\n        return;\n      }\n      if (canvasAt(e.clientX, e.clientY)) ctx.act(\"glass.dropAt\", { cx: e.clientX, cy: e.clientY });\n      else {\n        ctx.act(\"glass.previewClear\", {});\n        if (ctx.cue) ctx.cue(\"Not changed - let go of Glass on the cabinet you want it on\");\n      }\n    };\n    const onDown = (e) => {\n      const btn = e.target && e.target.closest ? e.target.closest(SEL4) : null;\n      if (!btn || !root.contains(btn) || btn.disabled) return;\n      if (e.button != null && e.button !== 0) return;\n      if (e.isPrimary === false) return;\n      e.preventDefault();\n      if (dg) finish3(e, false);\n      dg = { btn, x0: e.clientX, y0: e.clientY, moved: false, ghost: null, ls: [], pv: null, pid: e.pointerId, hint0: null };\n      const mv = (ev) => {\n        if (!dg || dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (ev.isTrusted === true && ev.pointerType === \"mouse\" && ev.buttons === 0) {\n          finish3(ev, false);\n          return;\n        }\n        if (!dg.moved && Math.hypot(ev.clientX - dg.x0, ev.clientY - dg.y0) < 5) return;\n        if (!dg.moved) {\n          dg.moved = true;\n          dg.btn.classList.add(\"is-dragging\");\n          const gh = doc2.createElement(\"div\");\n          gh.className = \"ub-lab__dghost\";\n          gh.setAttribute(\"aria-hidden\", \"true\");\n          gh.setAttribute(\"data-ub-gghost\", \"\");\n          gh.innerHTML = ICON2;\n          root.appendChild(gh);\n          dg.ghost = gh;\n        }\n        ev.preventDefault();\n        ghostAt(ev.clientX, ev.clientY, dg.pv ? dg.pv.ok ? \"ok\" : \"nofit\" : canvasAt(ev.clientX, ev.clientY) ? \"over\" : \"off\");\n        requestPreview(ev.clientX, ev.clientY);\n      };\n      const upF = (ev) => {\n        if (dg && dg.pid != null && ev.pointerId != null && ev.pointerId !== dg.pid) return;\n        if (dg && dg.moved) ev.stopPropagation();\n        finish3(ev, true);\n      };\n      const cancel = (ev) => finish3(ev, false);\n      const keyF = (ev) => {\n        if (ev.key === \"Escape\") {\n          ev.stopPropagation();\n          if (ev.preventDefault) ev.preventDefault();\n          finish3(ev, false);\n        }\n      };\n      dg.ls = [[\"pointermove\", mv], [\"pointerup\", upF], [\"pointercancel\", cancel], [\"keydown\", keyF], [\"blur\", cancel]];\n      for (const [t, f] of dg.ls) win2.addEventListener(t, f, true);\n    };\n    root.addEventListener(\"pointerdown\", onDown, true);\n    const onClick = (e) => {\n      const btn = e.target && e.target.closest ? e.target.closest(SEL4) : null;\n      if (!btn || !root.contains(btn)) return;\n      e.preventDefault();\n      if (Date.now() <= eatClickUntil) {\n        eatClickUntil = 0;\n        e.stopPropagation();\n        return;\n      }\n      if (ctx.cue) ctx.cue(\"Drag Glass onto the cabinet you want - only that cabinet gets glass doors\");\n    };\n    root.addEventListener(\"click\", onClick, true);\n    const svg2 = host && doc2.createElementNS ? doc2.createElementNS(NS4, \"svg\") : null;\n    if (svg2) {\n      svg2.setAttribute(\"class\", \"ub-lab__dpreview ub-lab__gpreview\");\n      svg2.setAttribute(\"aria-hidden\", \"true\");\n      svg2.setAttribute(\"data-ub-gpreview\", \"\");\n      svg2.setAttribute(\"hidden\", \"\");\n      host.appendChild(svg2);\n    }\n    function px(u, p) {\n      const nd = view.worldToNdc ? view.worldToNdc(unitXf(u).p(p)) : null;\n      if (!nd) return null;\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      return [(nd[0] + 1) / 2 * cw, (1 - nd[1]) / 2 * ch];\n    }\n    function frame2() {\n      if (!svg2) return;\n      const scene = ctx.scene(), pv = scene && scene.glassPreview;\n      const u = pv && (scene.units || []).find((v) => v.id === pv.id);\n      if (!pv || !u || !view.worldToNdc) {\n        if (!svg2.hasAttribute(\"hidden\")) {\n          svg2.setAttribute(\"hidden\", \"\");\n          svg2.innerHTML = \"\";\n          svg2.removeAttribute(\"data-state\");\n          svg2.removeAttribute(\"data-ub-id\");\n        }\n        return;\n      }\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      svg2.setAttribute(\"width\", cw);\n      svg2.setAttribute(\"height\", ch);\n      svg2.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      const ring = (b, z, cls2) => {\n        const r = [px(u, [b.x0, b.y0, z]), px(u, [b.x1, b.y0, z]), px(u, [b.x1, b.y1, z]), px(u, [b.x0, b.y1, z])];\n        return r.every(Boolean) ? '<path class=\"' + cls2 + '\" d=\"M' + r.map((p) => Math.round(p[0] * 10) / 10 + \" \" + Math.round(p[1] * 10) / 10).join(\"L\") + 'Z\"></path>' : \"\";\n      };\n      const cls = pv.ok ? \"ub-dpv__box\" : \"ub-dpv__nofit\";\n      let h = \"\";\n      for (const t of pv.targets || []) {\n        const z = t.box.z1 + 1;\n        h += ring(t.box, z, cls) + ring(t.aperture, z, cls);\n      }\n      if (!(pv.targets || []).length) h += ring({ x0: 0, x1: u.w, y0: 0, y1: u.h }, u.d + 19, \"ub-dpv__nofit\");\n      svg2.setAttribute(\"data-state\", pv.ok ? \"ok\" : \"nofit\");\n      svg2.setAttribute(\"data-ub-id\", u.id);\n      svg2.innerHTML = h;\n      svg2.removeAttribute(\"hidden\");\n    }\n    try {\n      const loc = win2.location, mm = loc ? /^#ub-gdrag-(\\d{1,2})$/.exec(String(loc.hash || \"\")) : null;\n      if (mm && win2.setTimeout && win2.PointerEvent) win2.setTimeout(() => {\n        try {\n          const u = (ctx.scene().units || [])[Number(mm[1]) - 1], cv = q(\".ub-lab__canvas\");\n          if (!u || !cv || !view.worldToNdc) return;\n          const vis = () => Array.prototype.slice.call(root.querySelectorAll(SEL4)).filter((b) => b.getBoundingClientRect && b.getBoundingClientRect().width > 0)[0];\n          if (!vis()) {\n            const fly = q('[data-ub-fly=\"fronts\"]');\n            if (fly) fly.click();\n          }\n          win2.setTimeout(() => {\n            const btn = vis();\n            if (!btn) return;\n            const nd = view.worldToNdc(unitXf(u).p([u.w / 2, u.h * 0.62, u.d + 20])), r = cv.getBoundingClientRect(), b = btn.getBoundingClientRect();\n            if (!nd) return;\n            const tx = r.left + (nd[0] + 1) / 2 * r.width, ty = r.top + (1 - nd[1]) / 2 * r.height;\n            const bx2 = b.left + b.width / 2, by = b.top + b.height / 2;\n            const touch = /[?&]gtouch=1\\b/.test(loc.search || \"\");\n            const ev = (type, x, y, buttons) => new win2.PointerEvent(type, { clientX: x, clientY: y, button: 0, buttons, pointerId: 44, pointerType: touch ? \"touch\" : \"mouse\", isPrimary: true, bubbles: true, cancelable: true });\n            btn.dispatchEvent(ev(\"pointerdown\", bx2, by, 1));\n            let k = 0;\n            const step = () => {\n              k++;\n              win2.dispatchEvent(ev(\"pointermove\", bx2 + (tx - bx2) * k / 8, by + (ty - by) * k / 8, 1));\n              if (k < 8) {\n                win2.setTimeout(step, 40);\n                return;\n              }\n              const stand = /(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\");\n              if (stand && /[?&]qa_drop=1\\b/.test(loc.search || \"\")) win2.setTimeout(() => win2.dispatchEvent(ev(\"pointerup\", tx, ty, 0)), 300);\n            };\n            win2.setTimeout(step, 60);\n          }, 500);\n        } catch {\n        }\n      }, 1400);\n    } catch {\n    }\n    return {\n      sync() {\n      },\n      frame: frame2,\n      dragging: () => dg ? { moved: dg.moved } : null,\n      destroy() {\n        if (dg) finish3({}, false);\n        root.removeEventListener(\"pointerdown\", onDown, true);\n        root.removeEventListener(\"click\", onClick, true);\n      }\n    };\n  }\n\n  // v2/src/ui/qa-radial.js\n  function createQaRadial(ctx) {\n    const root = ctx.root, doc2 = root && root.ownerDocument, win2 = doc2 && doc2.defaultView;\n    const none = { sync() {\n    }, frame() {\n    } };\n    try {\n      const loc = win2 && win2.location;\n      if (!loc || !/(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\")) return none;\n      const m = /[?&]qa_radial=([a-z,-]+)/.exec(loc.search || \"\");\n      if (!m || !win2.PointerEvent) return none;\n      win2.setTimeout(() => {\n        run(m[1].split(\",\")).catch((e) => out(\"ERROR \" + (e && e.message)));\n      }, m[1] === \"cornerwall\" ? 1200 : 1800);\n    } catch {\n      return none;\n    }\n    const box3 = doc2.createElement(\"pre\");\n    box3.setAttribute(\"data-ub-qaradial\", \"\");\n    box3.style.cssText = \"position:fixed;z-index:99999;right:6px;top:6px;max-width:\" + (win2.innerWidth < 700 ? \"98vw\" : \"46vw\") + \";max-height:92vh;overflow:auto;margin:0;padding:6px 8px;background:rgba(255,255,255,.93);border:2px solid #111;font:\" + (win2.innerWidth < 700 ? \"8px/1.15\" : \"11px/1.35\") + \" monospace;color:#111;white-space:pre-wrap;pointer-events:none\";\n    const lines = [];\n    function out(t) {\n      lines.push(t);\n      box3.textContent = lines.join(\"\\n\");\n      if (!box3.parentNode) doc2.body.appendChild(box3);\n    }\n    const wait = (ms) => new Promise((r) => win2.setTimeout(r, ms));\n    const P2 = () => root.__ubProj, IA = () => P2().__v2.interaction();\n    const cv = () => root.querySelector(\".ub-lab__canvas\");\n    let clickCount = 0, lastClickAt = 0, lastXY = [-99, -99];\n    function count(x, y) {\n      const t = Date.now();\n      clickCount = t - lastClickAt < 500 && Math.hypot(x - lastXY[0], y - lastXY[1]) < 5 ? clickCount + 1 : 1;\n      lastClickAt = t;\n      lastXY = [x, y];\n      return clickCount;\n    }\n    const pe = (type, x, y, buttons) => new win2.PointerEvent(type, { clientX: x, clientY: y, button: 0, buttons, pointerId: 1, pointerType: \"mouse\", isPrimary: true, bubbles: true, cancelable: true, composed: true });\n    const me = (type, x, y, buttons, detail) => new win2.MouseEvent(type, { clientX: x, clientY: y, button: 0, buttons, detail, bubbles: true, cancelable: true, composed: true, view: win2 });\n    function click1(x, y) {\n      const el = doc2.elementFromPoint(x, y) || doc2.body, d = count(x, y);\n      const pd = pe(\"pointerdown\", x, y, 1);\n      el.dispatchEvent(pd);\n      const compat = !pd.defaultPrevented;\n      if (compat) el.dispatchEvent(me(\"mousedown\", x, y, 1, d));\n      const el2 = doc2.elementFromPoint(x, y) || el;\n      el2.dispatchEvent(pe(\"pointerup\", x, y, 0));\n      if (compat) el2.dispatchEvent(me(\"mouseup\", x, y, 0, d));\n      (el2.contains(el) ? el2 : el.contains(el2) ? el : el2.parentNode || el2).dispatchEvent(me(\"click\", x, y, 0, d));\n      return d;\n    }\n    function dbl(x, y) {\n      click1(x, y);\n      const d = click1(x, y);\n      (doc2.elementFromPoint(x, y) || doc2.body).dispatchEvent(me(\"dblclick\", x, y, 0, d));\n    }\n    async function drag(el, tx, ty) {\n      const r = el.getBoundingClientRect(), bx2 = r.left + r.width / 2, by = r.top + r.height / 2;\n      clickCount = 0;\n      const pd = pe(\"pointerdown\", bx2, by, 1);\n      el.dispatchEvent(pd);\n      const compat = !pd.defaultPrevented;\n      if (compat) el.dispatchEvent(me(\"mousedown\", bx2, by, 1, 1));\n      for (let k = 1; k <= 8; k++) {\n        const x = bx2 + (tx - bx2) * k / 8, y = by + (ty - by) * k / 8, t2 = doc2.elementFromPoint(x, y) || doc2.body;\n        t2.dispatchEvent(pe(\"pointermove\", x, y, 1));\n        if (compat) t2.dispatchEvent(me(\"mousemove\", x, y, 1, 0));\n        await wait(40);\n      }\n      await wait(200);\n      const t = doc2.elementFromPoint(tx, ty) || doc2.body;\n      t.dispatchEvent(pe(\"pointerup\", tx, ty, 0));\n      if (compat) t.dispatchEvent(me(\"mouseup\", tx, ty, 0, 1));\n      root.dispatchEvent(me(\"click\", tx, ty, 0, 1));\n    }\n    const key = (k) => {\n      win2.dispatchEvent(new win2.KeyboardEvent(\"keydown\", { key: k, bubbles: true }));\n    };\n    function px(u, p) {\n      const nd = ctx.view.worldToNdc(unitXf(u).p(p)), r = cv().getBoundingClientRect();\n      return nd ? [r.left + (nd[0] + 1) / 2 * r.width, r.top + (1 - nd[1]) / 2 * r.height] : null;\n    }\n    let spot = null;\n    function neutral() {\n      if (spot) return spot;\n      const c = cv().getBoundingClientRect(), pj = P2(), ia = IA();\n      for (const [fx, fy] of [[0.12, 0.85], [0.88, 0.85], [0.5, 0.9], [0.1, 0.5], [0.9, 0.5], [0.5, 0.12]]) {\n        const x = c.left + c.width * fx, y = c.top + c.height * fy, el = doc2.elementFromPoint(x, y);\n        if (el && el.tagName === \"CANVAS\" && !pj.pickAtClient(x, y) && !(ia.ctx.openingDrag && ia.ctx.openingDrag.openingAt && ia.ctx.openingDrag.openingAt(x, y))) return [x, y];\n      }\n      return null;\n    }\n    function nearSpot(u) {\n      const c = cv().getBoundingClientRect(), pj = P2(), at = px(u, [u.w / 2, u.h / 2, u.d]);\n      let best = null;\n      for (let y = c.top + 10; y < c.bottom - 10; y += 8) for (let x = c.left + 10; x < c.right - 10; x += 8) {\n        const el = doc2.elementFromPoint(x, y);\n        if (!el || el.tagName !== \"CANVAS\" || pj.pickAtClient(x, y)) continue;\n        const d = Math.hypot(x - at[0], y - at[1]);\n        if (d > 60 && (!best || d < best.d)) best = { x, y, d };\n      }\n      return best ? [best.x, best.y] : null;\n    }\n    function state2(label) {\n      const sc = P2().sceneRef(), ia = IA(), st = ia.ctx.st || {}, L = root.querySelector(\"[data-ub-radial]\");\n      const g2 = st.dblGuard && st.dblGuard.state ? st.dblGuard.state() : null;\n      const open = !!sc.radial && L && !L.hasAttribute(\"hidden\");\n      out((open ? \"MENU OPEN \" : \"menu shut \") + label + \" | tool=\" + (sc.insideTool || \"-\") + \" measure=\" + !!sc.measureOn + \" partsMode=\" + !!sc.partsMode + \" sel=\" + (sc.selectedId || \"-\") + \" selPart=\" + (sc.selPart ? String(sc.selPart).split(\":\").slice(1).join(\":\") : \"-\") + \" guard=\" + JSON.stringify(g2) + \" lastDbl=\" + JSON.stringify(st.lastDbl || null) + \" undo=\" + P2().histDepth().past);\n      return open;\n    }\n    async function neutralDbl(label) {\n      const n = neutral();\n      if (!n) {\n        out(\"no neutral spot\");\n        return false;\n      }\n      const ia = IA(), el = doc2.elementFromPoint(n[0], n[1]);\n      let called = 0, bg = null;\n      const R4 = ia.ctx.radial, orig = R4.dblclick;\n      R4.dblclick = (e) => {\n        called++;\n        bg = R4.background(e);\n        return orig(e);\n      };\n      dbl(n[0], n[1]);\n      await wait(250);\n      R4.dblclick = orig;\n      out(\"   under the pointer: \" + (el ? el.tagName + \".\" + String(el.className && el.className.baseVal != null ? el.className.baseVal : el.className).slice(0, 40) : \"-\") + \" pick=\" + P2().pickAtClient(n[0], n[1]) + \" radialHandlerCalled=\" + called + \" background=\" + bg);\n      const open = state2(\"after neutral double-click \" + label + \" at \" + n.map(Math.round));\n      key(\"Escape\");\n      await wait(650);\n      return open;\n    }\n    async function freshBase(shelf) {\n      const pj = P2();\n      for (const [x, z] of [[2600, 1400], [600, 2600], [2600, 2600], [4200, 2600], [1200, 3600]]) {\n        const u = pj.dropUnit(\"base\", x, z);\n        if (u) {\n          u.door = true;\n          u.interior = { shelves: shelf ? 1 : 0, vDiv: [], hDiv: [] };\n          pj.sceneRef().selectedId = u.id;\n          pj.syncControls();\n          IA().view.fitKitchen(true);\n          pj.render();\n          await wait(500);\n          return pj.sceneRef().units.find((v) => v.id === u.id);\n        }\n      }\n      return null;\n    }\n    const btnOn = (sel) => {\n      const b = root.querySelector(sel);\n      return b ? !(b.disabled || b.getAttribute(\"aria-disabled\") === \"true\") : null;\n    };\n    function gapLine(label) {\n      const sc = P2().sceneRef(), h = P2().histDepth();\n      const cue = root.querySelector(\"[data-ub-cue]\");\n      out(\"   \" + label + \": plan \" + JSON.stringify(sc.units.map((u) => [u.id, Math.round(u.x), Math.round(u.z), u.w])) + \" room \" + (sc.room && sc.room.width) + \" | Undo \" + (btnOn(\"[data-ub-undo]\") ? \"ON\" : \"off\") + \" Redo \" + (btnOn(\"[data-ub-redo]\") ? \"ON\" : \"off\") + \" depth \" + h.past + \"/\" + h.future + \" sel \" + sc.selectedId + \" | \" + (cue ? cue.textContent : \"\"));\n    }\n    async function press(sel) {\n      const b = root.querySelector(sel);\n      if (!b || !b.offsetParent) {\n        out(\"   \" + sel + \" NOT SHOWN\");\n        return false;\n      }\n      b.scrollIntoView({ block: \"center\" });\n      await wait(150);\n      const p = centre3(b), top = doc2.elementFromPoint(p[0], p[1]);\n      if (!(top === b || top && b.contains(top))) {\n        out(\"   \" + sel + \" covered by \" + (top ? top.tagName + \".\" + String(top.className).slice(0, 30) : \"-\") + \" - its own click()\");\n        b.click();\n      } else click1(p[0], p[1]);\n      await wait(400);\n      return true;\n    }\n    async function cornerWallRun() {\n      const ia = IA(), q = ia.quickAdd;\n      let follows = 0;\n      const of = q.follow;\n      q.follow = (sd2) => {\n        follows++;\n        const r = of(sd2);\n        out(\"   FOLLOW(\" + sd2 + \") called -> \" + r);\n        return r;\n      };\n      const boxOn = (id) => {\n        const sc2 = P2().sceneRef(), u = sc2.units.find((v) => v.id === id);\n        if (!u) return \"-\";\n        const B = P2().unitAABB(u), c2 = cv().getBoundingClientRect();\n        let x0 = 1e9, x1 = -1e9, y0 = 1e9, y1 = -1e9, off = 0;\n        for (const x of [B.x0, B.x1]) for (const y of [B.y0, B.y1]) for (const z of [B.z0, B.z1]) {\n          const n = P2().worldToNdc([x, y, z]);\n          if (!n) {\n            off++;\n            continue;\n          }\n          const px2 = (n[0] + 1) / 2 * c2.width, py = (1 - n[1]) / 2 * c2.height;\n          x0 = Math.min(x0, px2);\n          x1 = Math.max(x1, px2);\n          y0 = Math.min(y0, py);\n          y1 = Math.max(y1, py);\n          if (px2 < 0 || px2 > c2.width || py < 0 || py > c2.height) off++;\n        }\n        return u.type + \" px x\" + Math.round(x0) + \"..\" + Math.round(x1) + \" y\" + Math.round(y0) + \"..\" + Math.round(y1) + \" off \" + off + \"/8 (canvas \" + Math.round(c2.width) + \"x\" + Math.round(c2.height) + \")\";\n      };\n      await tile(\"base\");\n      await tile(\"base\");\n      await tile(\"corner-l\");\n      const sc = P2().sceneRef(), k = sc.units.find((v) => v.id === sc.selectedId);\n      camLine(\"after L corner \" + k.id);\n      const c = cv().getBoundingClientRect();\n      for (let i = 0; i < 3; i++) {\n        const x = c.left + c.width * 0.6, y = c.top + c.height * 0.5;\n        const el = doc2.elementFromPoint(x, y) || doc2.body;\n        el.dispatchEvent(pe(\"pointerdown\", x, y, 1));\n        el.dispatchEvent(me(\"mousedown\", x, y, 1, 1));\n        for (let s2 = 1; s2 <= 6; s2++) {\n          win2.dispatchEvent(pe(\"pointermove\", x + 10 * s2, y, 1));\n          win2.dispatchEvent(me(\"mousemove\", x + 10 * s2, y, 1, 0));\n          await wait(10);\n        }\n        win2.dispatchEvent(pe(\"pointerup\", x + 60, y, 0));\n        win2.dispatchEvent(me(\"mouseup\", x + 60, y, 0, 1));\n        await wait(120);\n        key(\"Escape\");\n        await wait(60);\n      }\n      const t0 = camLine(\"after three Rotate drags\");\n      let sd = null;\n      for (const s3 of [\"right\", \"left\"]) {\n        const b = root.querySelector('[data-ub-qadd=\"' + s3 + '\"]');\n        if (b && b.style.display !== \"none\" && b.offsetParent) {\n          sd = s3;\n          break;\n        }\n      }\n      out(\"   corner + drawn: \" + sd + \"  corner box \" + boxOn(k.id));\n      if (!sd) return;\n      const pressPlus = async () => {\n        const b = root.querySelector('[data-ub-qadd=\"' + sd + '\"]');\n        const p = centre3(b);\n        click1(p[0], p[1]);\n        await wait(300);\n      };\n      await pressPlus();\n      await pressPlus();\n      const t1 = camLine(\"after + + (Base)\");\n      out(\"   new \" + boxOn(sc.selectedId) + \", eye moved \" + Math.round(Math.hypot(t1.e[0] - t0.e[0], t1.e[1] - t0.e[1], t1.e[2] - t0.e[2])) + \" mm, follows \" + follows);\n      await press(\"[data-ub-undo]\");\n      const t2 = camLine(\"after Undo\");\n      const wt = root.querySelector('[data-ub-tray-add=\"wall\"]');\n      if (wt) {\n        wt.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n        await wait(150);\n        const p = centre3(wt);\n        click1(p[0], p[1]);\n        await wait(400);\n      }\n      out(\"   picked: \" + JSON.stringify(q.pick.pending()) + \" n \" + sc.units.length);\n      const b2 = root.querySelector('[data-ub-qadd=\"' + sd + '\"]');\n      out(\"   + still drawn: \" + !!(b2 && b2.style.display !== \"none\"));\n      const f0 = follows;\n      await pressPlus();\n      const t3 = camLine(\"after + (Wall 1 door)\");\n      out(\"   new \" + boxOn(sc.selectedId) + \", eye moved \" + Math.round(Math.hypot(t3.e[0] - t2.e[0], t3.e[1] - t2.e[1], t3.e[2] - t2.e[2])) + \" mm, follows \" + (follows - f0) + \", corner now \" + boxOn(k.id));\n    }\n    async function typesRun() {\n      for (const t of [\"wall\", \"corner-l\", \"island\", \"tall-pantry\"]) {\n        await tile(t);\n        const fl = root.querySelector('[data-ub-flyout=\"cabinets\"]');\n        if (fl && !fl.hasAttribute(\"hidden\")) await press('[data-ub-fly=\"cabinets\"]');\n        const sc = P2().sceneRef(), u = sc.units.find((v) => v.id === sc.selectedId), b = P2().unitAABB(u);\n        let off = 0;\n        for (const x of [b.x0, b.x1]) for (const y of [b.y0, b.y1]) for (const z of [b.z0, b.z1]) {\n          const n = P2().worldToNdc([x, y, z]);\n          if (!n || Math.abs(n[0]) > 1.02 || Math.abs(n[1]) > 1.02) off++;\n        }\n        const r = IA().ctx.st.lastReveal || {};\n        out(\"   \" + t + \": \" + u.id + \" at \" + [Math.round(u.x), Math.round(u.z), u.rot || 0] + \", corners off \" + off + \"/8, reveal \" + r.how + \" zoom \" + (r.zoom0 && r.zoom0.toFixed(3)) + \"->\" + (r.zoom && r.zoom.toFixed(3)) + \" box \" + JSON.stringify(r.box && [r.box.x0, r.box.x1, r.box.y0, r.box.y1].map((v) => Math.round(v * 100) / 100)) + \" safe \" + JSON.stringify(r.safe && r.safe.map((v) => Math.round(v * 100) / 100)) + \" trace \" + JSON.stringify((r.trace || []).slice(0, 6)));\n      }\n    }\n    async function gapRun(seq) {\n      const mode = /share/.test(seq) ? \"share\" : \"extend\";\n      gapLine(\"opening\");\n      await press('[data-ub-kfinish=\"carcass\"][data-ub-kval=\"oak\"]');\n      gapLine(\"carcass Casella Oak\");\n      await press(\"[data-ub-undo]\");\n      gapLine(\"an undone change (Redo lit)\");\n      await press('[data-ub-fly=\"room\"]');\n      await press('[data-ub-roomtab=\"size\"]');\n      const inp = root.querySelector('[data-ub-roomdim=\"width\"]');\n      if (!inp) {\n        out(\"   no Across input\");\n        return;\n      }\n      inp.focus();\n      inp.value = \"1700\";\n      inp.dispatchEvent(new win2.Event(\"input\", { bubbles: true }));\n      inp.dispatchEvent(new win2.Event(\"change\", { bubbles: true }));\n      inp.blur();\n      await wait(400);\n      gapLine(\"Across 1700\");\n      await press('[data-ub-fly=\"room\"]');\n      const u2 = P2().sceneRef().units[1];\n      await press('[data-ub-pick=\"' + u2.id + '\"]');\n      gapLine(\"Cabinet 2 picked\");\n      await press('[data-ub-gapfill=\"' + mode + '\"]');\n      gapLine(mode + \" pressed (offer \" + JSON.stringify((root.querySelector(\"[data-ub-gapnote]\") || {}).textContent || \"\") + \")\");\n      await press(\"[data-ub-undo]\");\n      gapLine(\"toolbar Undo pressed\");\n      await press(\"[data-ub-redo]\");\n      gapLine(\"toolbar Redo pressed\");\n    }\n    function camLine(label) {\n      const ia = IA(), sc = P2().sceneRef();\n      ia.ctx.frame();\n      const c = ia.ctx.cam();\n      const R4 = P2().__v2.renderer();\n      if (R4.renderNow) R4.renderNow();\n      const I = R4.inspect ? R4.inspect() : null;\n      const e = I && I.camera ? [I.camera.position.x, I.camera.position.y, I.camera.position.z] : c.eye;\n      const rm = sc.room || {};\n      const inRoom2 = e && e[0] > 0 && e[0] < (rm.width || 0) && e[2] > 0 && e[2] < (rm.depth || 0);\n      const L = (ia.quickAdd && ia.quickAdd.layout ? ia.quickAdd.layout() : []).map((a) => a.side).join(\"/\") || \"none\";\n      out(\"   \" + label + \": eye \" + e.map(Math.round).join(\",\") + \" target \" + [c.cx, c.cy, c.cz].map(Math.round).join(\",\") + \" dist \" + Math.round(c.dist) + \" zoom \" + Math.round(sc.zoom * 1e3) / 1e3 + \" pan \" + Math.round(sc.panX || 0) + \",\" + Math.round(sc.panY || 0) + \" hold \" + !!sc.camHold + \" eyeInRoom \" + inRoom2 + \" | n \" + sc.units.length + \" undo \" + P2().histDepth().past + \" sel \" + sc.selectedId + \" + \" + L + \" (\" + (ia.quickAdd.hiddenWhy() || \"-\") + \")\");\n      return { e, t: [c.cx, c.cy, c.cz], dist: c.dist, zoom: sc.zoom };\n    }\n    const centre3 = (el) => {\n      const r = el.getBoundingClientRect();\n      return [r.left + r.width / 2, r.top + r.height / 2];\n    };\n    async function tile(id) {\n      const add = root.querySelector('[data-ub-fly=\"cabinets\"]');\n      const fl = root.querySelector('[data-ub-flyout=\"cabinets\"]');\n      if (add && (!fl || fl.hasAttribute(\"hidden\"))) {\n        const p2 = centre3(add);\n        click1(p2[0], p2[1]);\n        await wait(250);\n      }\n      const t = root.querySelector('[data-ub-tray-add=\"' + id + '\"]');\n      if (!t || !t.offsetParent) {\n        out(\"   tile \" + id + \" NOT SHOWN\");\n        return false;\n      }\n      t.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n      await wait(150);\n      const p = centre3(t);\n      click1(p[0], p[1]);\n      await wait(350);\n      return true;\n    }\n    async function cornerRun(seq) {\n      const sc = P2().sceneRef();\n      out(\"   room \" + JSON.stringify(sc.room) + \" units \" + JSON.stringify(sc.units.map((u) => [u.id, u.type, Math.round(u.x), Math.round(u.z), u.rot || 0, u.w])));\n      const back = sc.units.filter((u) => !(u.rot || 0) && u.family !== \"wall\").sort((a, b) => b.x - a.x)[0];\n      if (!back) {\n        out(\"   no back-wall cabinet\");\n        return;\n      }\n      IA().commands.run(\"select\", { id: back.id });\n      P2().render();\n      await wait(400);\n      camLine(\"opening, \" + back.id + \" selected\");\n      const presses = /short/.test(seq) ? 2 : 10;\n      for (let i = 0; i < presses + 1; i++) {\n        const b = root.querySelector('[data-ub-qadd=\"right\"]');\n        if (!b || b.style.display === \"none\" || !b.offsetParent) {\n          out(\"   row: no right + on \" + sc.selectedId + \" (\" + i + \" presses)\");\n          break;\n        }\n        const p = centre3(b);\n        click1(p[0], p[1]);\n        await wait(450);\n      }\n      key(\"Escape\");\n      await wait(300);\n      const t0 = camLine(\"row done (the view the person has)\");\n      await tile(\"corner-l\");\n      const t1 = camLine(\"after L corner from Add\");\n      const cu = sc.units.find((u) => u.id === sc.selectedId);\n      out(\"   corner \" + (cu ? JSON.stringify([cu.id, cu.type, Math.round(cu.x), Math.round(cu.z), cu.rot || 0, cu.w, cu.d]) : \"-\") + \"  eye moved \" + Math.round(Math.hypot(t1.e[0] - t0.e[0], t1.e[1] - t0.e[1], t1.e[2] - t0.e[2])) + \" mm, dist \" + Math.round(t0.dist) + \" -> \" + Math.round(t1.dist));\n      out(\"   reveal: \" + JSON.stringify(IA().ctx.st.lastReveal || null));\n      {\n        const q = IA().quickAdd, cu2 = sc.units.find((u) => u.id === sc.selectedId);\n        for (const s of [\"left\", \"right\"]) {\n          const p = q.worldAnchor(cu2, s), nd = IA().ctx.worldToNdc(p);\n          out(\"   corner side \" + s + \": free \" + q.free(s) + \", safety \" + q.safetyHide(s) + \", anchor \" + p.map(Math.round) + \" ndc \" + (nd ? nd.map((v) => Math.round(v * 100) / 100) : \"-\"));\n        }\n      }\n      for (const s of [\"right\", \"left\"]) {\n        const b = root.querySelector('[data-ub-qadd=\"' + s + '\"]');\n        if (!b || b.style.display === \"none\" || !b.offsetParent) {\n          out(\"   corner + \" + s + \": not drawn\");\n          continue;\n        }\n        const p = centre3(b), top = doc2.elementFromPoint(p[0], p[1]);\n        out(\"   corner + \" + s + \" at \" + p.map(Math.round) + \" on top: \" + (top === b || top && b.contains(top)));\n        const u0 = P2().histDepth().past, n0 = sc.units.length, e0 = camLine(\"before corner + \" + s);\n        click1(p[0], p[1]);\n        await wait(450);\n        const p2 = centre3(b);\n        click1(p2[0], p2[1]);\n        await wait(600);\n        const nu = sc.units[sc.units.length - 1], e1 = camLine(\"after corner + \" + s + \" (two presses)\");\n        out(\"   corner + \" + s + \": added \" + (sc.units.length - n0) + \" \" + (nu ? JSON.stringify([nu.id, nu.type, Math.round(nu.x), Math.round(nu.z), nu.rot || 0, nu.w]) : \"\") + \", Undo \" + u0 + \" -> \" + P2().histDepth().past + \", eye moved \" + Math.round(Math.hypot(e1.e[0] - e0.e[0], e1.e[1] - e0.e[1], e1.e[2] - e0.e[2])) + \" mm\");\n        key(\"Escape\");\n        await wait(300);\n        break;\n      }\n      await tile(\"base\");\n      out(\"   reveal: \" + JSON.stringify(IA().ctx.st.lastReveal || null));\n      const t2 = camLine(\"after Base 1 door from Add\");\n      out(\"   eye moved \" + Math.round(Math.hypot(t2.e[0] - t1.e[0], t2.e[1] - t1.e[1], t2.e[2] - t1.e[2])) + \" mm, dist \" + Math.round(t1.dist) + \" -> \" + Math.round(t2.dist));\n      await tile(\"wall\");\n      const t3 = camLine(\"after Wall 1 door from Add\");\n      out(\"   eye moved \" + Math.round(Math.hypot(t3.e[0] - t2.e[0], t3.e[1] - t2.e[1], t3.e[2] - t2.e[2])) + \" mm, dist \" + Math.round(t2.dist) + \" -> \" + Math.round(t3.dist));\n      out(\"   plan \" + JSON.stringify(sc.units.map((u) => [u.id, u.type, Math.round(u.x), Math.round(u.z), u.rot || 0, u.w, u.y || 0])));\n    }\n    async function dragInRun(seq) {\n      await wait(600);\n      const SC = () => P2().sceneRef();\n      for (let g2 = 0; g2 < 8 && SC().units.length > 2; g2++) {\n        const ex = SC().units[SC().units.length - 1];\n        IA().commands.run(\"select\", { id: ex.id });\n        IA().commands.run(\"remove\");\n        await wait(150);\n      }\n      P2().render();\n      await wait(300);\n      const sc = new Proxy({}, { get: (_, k) => SC()[k] });\n      out(\"   plan at start: \" + JSON.stringify(sc.units.map((u) => [u.id, u.type, Math.round(u.x), Math.round(u.z), u.rot || 0])) + \" search \" + win2.location.search + \" storage \" + (function() {\n        try {\n          return Object.keys(win2.localStorage).filter((k) => /ub-cabinet|ub-lab/.test(k)).join(\",\");\n        } catch {\n          return \"-\";\n        }\n      })());\n      const add = root.querySelector('[data-ub-fly=\"cabinets\"]'), fl = root.querySelector('[data-ub-flyout=\"cabinets\"]');\n      if (add && (!fl || fl.hasAttribute(\"hidden\"))) {\n        const p = centre3(add);\n        click1(p[0], p[1]);\n        await wait(400);\n      }\n      const t = root.querySelector('[data-ub-tray-add=\"base\"]');\n      if (!t) {\n        out(\"   no Base tile\");\n        return;\n      }\n      t.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n      await wait(200);\n      const nb = sc.units.filter((u) => !(u.rot || 0) && u.family !== \"wall\").sort((a, b) => b.x - a.x)[0];\n      const W2 = 600, D2 = 560, R4 = sc.room || { width: 3600, depth: 3e3 };\n      const c = cv().getBoundingClientRect();\n      const at = (x, z) => {\n        const nd = ctx.view.worldToNdc([x, 0, z]);\n        return nd ? [c.left + (nd[0] + 1) / 2 * c.width, c.top + (1 - nd[1]) / 2 * c.height] : null;\n      };\n      const A = [nb.x + nb.w + 60 + W2 / 2, (nb.z || 0) + D2 / 2 + 30], B = [nb.x + nb.w / 2, (nb.z || 0) + D2 / 2], C3 = [R4.width - 60 - W2 / 2, (nb.z || 0) + D2 / 2 + 30];\n      out(\"   neighbour \" + nb.id + \" x \" + Math.round(nb.x) + \"..\" + Math.round(nb.x + nb.w) + \" z \" + Math.round(nb.z || 0) + \"; room \" + R4.width + \"x\" + R4.depth + \"; history \" + P2().histDepth().past);\n      const p0 = centre3(t);\n      const el = doc2.elementFromPoint(p0[0], p0[1]) || t;\n      el.dispatchEvent(me(\"mousedown\", p0[0], p0[1], 1, 1));\n      const moveTo = async (pt) => {\n        const s0 = [p0[0], p0[1]];\n        for (let k = 1; k <= 8; k++) {\n          const x = s0[0] + (pt[0] - s0[0]) * k / 8, y = s0[1] + (pt[1] - s0[1]) * k / 8;\n          win2.dispatchEvent(me(\"mousemove\", x, y, 1, 0));\n          await wait(25);\n        }\n        await wait(250);\n      };\n      const log = (lab, w) => {\n        const d = sc.dropPreview;\n        if (!d || !d.unit) {\n          out(\"   \" + lab + \": NO preview\");\n          return;\n        }\n        const u = d.unit;\n        const gapN = Math.round(u.x - (nb.x + nb.w)), gapW = Math.round(R4.width - (u.x + ((u.rot || 0) % 2 ? u.d : u.w)));\n        out(\"   \" + lab + \": aimed \" + w.map(Math.round) + \" -> preview \" + u.type + \" x \" + Math.round(u.x) + \" z \" + Math.round(u.z) + \" rot \" + (u.rot || 0) + \" y \" + Math.round(u.y || 0) + \" ok \" + d.ok + (d.why ? \" (\" + d.why + \")\" : \"\") + \" | gap to \" + nb.id + \" \" + gapN + \" mm, to right wall \" + gapW + \" mm\");\n      };\n      const pA = at(A[0], A[1]), pB = at(B[0], B[1]), pC = at(C3[0], C3[1]);\n      await moveTo(pA);\n      log(\"A near neighbour\", A);\n      if (seq === \"draginholda\") {\n        markBox(\"A\");\n        return;\n      }\n      await moveTo(pC);\n      log(\"C near right wall\", C3);\n      await moveTo(pB);\n      log(\"B on the neighbour\", B);\n      if (seq === \"draginhold\") {\n        markBox(\"B\");\n        return;\n      }\n      function markBox(lab) {\n        const d = sc.dropPreview, u = d && d.unit;\n        if (u) {\n          const B2 = P2().unitAABB(u);\n          let x0 = 1e9, x1 = -1e9, y0 = 1e9, y1 = -1e9;\n          for (const x of [B2.x0, B2.x1]) for (const y of [B2.y0, B2.y1]) for (const z of [B2.z0, B2.z1]) {\n            const nd = ctx.view.worldToNdc([x, y, z]);\n            if (!nd) continue;\n            const px2 = c.left + (nd[0] + 1) / 2 * c.width, py = c.top + (1 - nd[1]) / 2 * c.height;\n            x0 = Math.min(x0, px2);\n            x1 = Math.max(x1, px2);\n            y0 = Math.min(y0, py);\n            y1 = Math.max(y1, py);\n          }\n          out(\"   preview SHOULD be on screen at x \" + Math.round(x0) + \"..\" + Math.round(x1) + \" y \" + Math.round(y0) + \"..\" + Math.round(y1) + \" (page px), the pointer at \" + (lab === \"A\" ? pA : pB).map(Math.round));\n          const m = doc2.createElement(\"div\");\n          m.style.cssText = \"position:fixed;z-index:99998;pointer-events:none;border:2px dashed red;left:\" + x0 + \"px;top:\" + y0 + \"px;width:\" + (x1 - x0) + \"px;height:\" + (y1 - y0) + \"px\";\n          doc2.body.appendChild(m);\n        }\n        out(\"   plan now: \" + JSON.stringify(sc.units.map((v) => [v.id, Math.round(v.x), Math.round(v.z)])) + \"; preview unit \" + (u ? JSON.stringify([u.id, Math.round(u.x), Math.round(u.z), u.rot || 0, Math.round(u.y || 0)]) : \"-\"));\n        try {\n          const R5 = P2().__v2.renderer();\n          if (R5.renderNow) R5.renderNow();\n          const I = R5.inspect(), T3 = I.THREE;\n          const ov = I.scene.getObjectByName(\"overlay\"), box4 = ov ? new T3.Box3().setFromObject(ov) : null;\n          const bx2 = (b) => b && isFinite(b.min.x) ? [b.min.x, b.max.x, b.min.y, b.max.y, b.min.z, b.max.z].map(Math.round) : null;\n          const roots = I.scene.children.map((ch) => ch.name || ch.type);\n          const unitsRoot = I.scene.children.find((ch) => ch !== ov && ch.children && ch.children.length && ch.name !== \"overlay\" && ch.type === \"Group\" && !ch.name);\n          out(\"   RENDERER: overlay box (scene units) \" + JSON.stringify(bx2(box4)) + \" meshes \" + (ov ? ov.children.length : \"-\") + \"; scene children \" + JSON.stringify(roots).slice(0, 160));\n          const groups = [];\n          I.scene.traverse((o) => {\n            if (o.userData && (o.userData.unitId || o.userData.id)) groups.push([o.userData.unitId || o.userData.id, bx2(new T3.Box3().setFromObject(o))]);\n          });\n          out(\"   RENDERER units: \" + JSON.stringify(groups).slice(0, 400));\n          const vis = (o) => {\n            let v = true;\n            for (let q = o; q; q = q.parent) if (q.visible === false) v = false;\n            return v;\n          };\n          let ovMesh = 0, ovVis = 0;\n          if (ov) ov.traverse((o) => {\n            if (o.isMesh) {\n              ovMesh++;\n              if (vis(o)) ovVis++;\n            }\n          });\n          const labs = doc2.querySelectorAll(\".ub-lab\"), cvs = doc2.querySelectorAll(\".ub-lab__canvas, canvas\");\n          const myCv = I.renderer && I.renderer.domElement, r0 = myCv ? myCv.getBoundingClientRect() : null;\n          out(\"   overlay meshes \" + ovMesh + \" visible \" + ovVis + \" (group visible \" + (ov && ov.visible) + \"); .ub-lab roots \" + labs.length + \", canvases \" + cvs.length + \"; this renderer's canvas \" + (r0 ? [r0.left, r0.top, r0.width, r0.height].map(Math.round) : \"-\") + \" in root \" + (myCv && root.contains(myCv)));\n        } catch (e) {\n          out(\"   RENDERER inspect failed: \" + e.message);\n        }\n        out(\"   (held at \" + lab + \" for the picture; red dashed = where the preview's box projects)\");\n      }\n      await moveTo(pA);\n      log(\"A again\", A);\n      win2.dispatchEvent(me(\"mouseup\", pA[0], pA[1], 0, 1));\n      await wait(400);\n      const nu = sc.units.find((u) => u.id === sc.selectedId);\n      out(\"   released at A: \" + (nu ? nu.id + \" \" + nu.type + \" x \" + Math.round(nu.x) + \" z \" + Math.round(nu.z) + \" -> gap to \" + nb.id + \" \" + Math.round(nu.x - (nb.x + nb.w)) + \" mm\" : \"-\") + \"; history \" + P2().histDepth().past + \"; preview left \" + !!sc.dropPreview);\n    }\n    async function run(seqs) {\n      out(\"qa_radial \" + seqs.join(\",\") + \" - build \" + (root.getAttribute(\"data-ub-build\") || \"?\"));\n      const result = [];\n      for (const seq of seqs) {\n        out(\"---- \" + seq);\n        if (/^cornerrun/.test(seq)) {\n          await cornerRun(seq);\n          continue;\n        }\n        if (/^dragin/.test(seq)) {\n          await dragInRun(seq);\n          continue;\n        }\n        if (/^gap(extend|share)/.test(seq)) {\n          await gapRun(seq);\n          continue;\n        }\n        if (seq === \"types\") {\n          await typesRun();\n          continue;\n        }\n        if (seq === \"cornerwall\") {\n          await cornerWallRun();\n          continue;\n        }\n        IA().setMode(\"rotate\");\n        await wait(200);\n        const u = await freshBase(seq === \"drawershelf\");\n        if (!u) {\n          out(\"no room for a fresh base\");\n          continue;\n        }\n        if (!/^panels|^pan/.test(seq)) result.push([seq + \" baseline\", await neutralDbl(\"(baseline, nothing done yet)\")]);\n        if (/^pan(left|right)?$/.test(seq)) {\n          const dir = seq === \"panright\" ? \"right\" : \"left\";\n          const camT = () => {\n            IA().ctx.frame();\n            const c = IA().ctx.cam();\n            return [c.cx, c.cy, c.cz];\n          };\n          const eyeNow = () => {\n            const R4 = P2().__v2.renderer();\n            if (R4.renderNow) R4.renderNow();\n            const I = R4.inspect();\n            return [I.camera.position.x, I.camera.position.y, I.camera.position.z];\n          };\n          const flags2 = () => {\n            const G = IA().ctx.st || {};\n            return (G.handleDrag ? \"H\" : \"\") + (G.sizeDrag ? \"S\" : \"\") + (G.drag ? \"D\" : \"\") + (G.partDrag ? \"P\" : \"\") || \"-\";\n          };\n          const dist3 = (a, b) => Math.round(Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]));\n          async function dragPan() {\n            const n3 = neutral();\n            if (!n3) return null;\n            const t0 = camT(), e0 = eyeNow();\n            await wait(650);\n            const el = doc2.elementFromPoint(n3[0], n3[1]) || doc2.body;\n            el.dispatchEvent(pe(\"pointerdown\", n3[0], n3[1], 1));\n            el.dispatchEvent(me(\"mousedown\", n3[0], n3[1], 1, 1));\n            for (let k = 1; k <= 8; k++) {\n              const x = n3[0] + 20 * k, y = n3[1] + 8 * k;\n              win2.dispatchEvent(pe(\"pointermove\", x, y, 1));\n              win2.dispatchEvent(me(\"mousemove\", x, y, 1, 0));\n              await wait(30);\n            }\n            win2.dispatchEvent(pe(\"pointerup\", n3[0] + 160, n3[1] + 64, 0));\n            win2.dispatchEvent(me(\"mouseup\", n3[0] + 160, n3[1] + 64, 0, 1));\n            await wait(250);\n            key(\"Escape\");\n            await wait(200);\n            const t1 = camT();\n            const e1 = eyeNow(), c1 = IA().ctx.cam(), exp = Math.round(16e-4 * c1.dist * Math.hypot(160, 64));\n            const de = [e1[0] - e0[0], e1[1] - e0[1], e1[2] - e0[2]], ax = [e1[0] - t1[0], e1[1] - t1[1], e1[2] - t1[2]], al = Math.hypot(ax[0], ax[1], ax[2]) || 1;\n            const along2 = Math.round((de[0] * ax[0] + de[1] * ax[1] + de[2] * ax[2]) / al * 10) / 10;\n            out(\"      eye moved \" + dist3(e0, e1) + \" mm (along the line of sight \" + along2 + \" mm), expected \" + exp + \" mm; target moved \" + dist3(t0, t1) + \" mm; dist \" + Math.round(c1.dist) + \" zoom \" + Math.round(P2().sceneRef().zoom * 1e3) / 1e3 + \" atMin \" + !!c1.atMin + \"; held \" + !!P2().sceneRef().camHold + \", flags \" + flags2());\n            return dist3(t0, t1);\n          }\n          IA().setMode(\"pan\");\n          await wait(200);\n          const ref = await dragPan();\n          out(\"   reference - Move view with no arrow: camera target moved \" + ref + \" mm\");\n          P2().render();\n          IA().view.fitKitchen && IA().view.fitKitchen(true);\n          await wait(300);\n          IA().setMode(\"cabinet\");\n          P2().sceneRef().selectedId = u.id;\n          P2().syncControls();\n          await wait(400);\n          const arrow = root.querySelector('[data-ub-movearrow=\"' + dir + '\"]');\n          const x0 = u.x, d0 = P2().histDepth().past;\n          const flags = () => {\n            const G = IA().ctx.st || {};\n            return (G.handleDrag ? \"H\" : \"\") + (G.sizeDrag ? \"S\" : \"\") + (G.drag ? \"D\" : \"\") + (G.partDrag ? \"P\" : \"\") || \"-\";\n          };\n          if (arrow) {\n            const r = arrow.getBoundingClientRect();\n            click1(r.left + r.width / 2, r.top + r.height / 2);\n          }\n          await wait(400);\n          out(\"   after the arrow: gesture flags \" + flags() + \", history \" + JSON.stringify(IA().hist.labels().slice(-3)));\n          out(\"   the cabinet's \" + dir + \" arrow (its own button): x \" + Math.round(x0) + \" -> \" + Math.round(u.x) + \" mm, Undo \" + d0 + \" -> \" + P2().histDepth().past + \", camera held: \" + !!P2().sceneRef().camHold + \" - \" + (root.querySelector(\"[data-ub-cue]\") || {}).textContent);\n          const n2 = neutral();\n          dbl(n2[0], n2[1]);\n          await wait(300);\n          const menu = !!P2().sceneRef().radial;\n          const panBtn = root.querySelector('[data-ub-radial-mode=\"pan\"]');\n          if (panBtn) {\n            const r = panBtn.getBoundingClientRect();\n            click1(r.left + r.width / 2, r.top + r.height / 2);\n          }\n          await wait(300);\n          out(\"   after the menu: gesture flags \" + flags() + \", held \" + !!P2().sceneRef().camHold);\n          out(\"   neutral double-click: menu \" + (menu ? \"OPEN\" : \"shut\") + \"; its Move view pressed -> mode \" + IA().mode());\n          const xA = u.x, dA = P2().histDepth().past;\n          const got = await dragPan();\n          const okPan = got != null && ref > 0 && Math.abs(got - ref) / ref < 0.05;\n          out((okPan ? \"MOVE VIEW PANS\" : \"MOVE VIEW DEAD\") + \" after the arrow: camera target moved \" + got + \" mm (reference \" + ref + \"), camera held now: \" + !!P2().sceneRef().camHold + \", cabinet x \" + Math.round(xA) + \" -> \" + Math.round(u.x) + \", Undo \" + dA + \" -> \" + P2().histDepth().past);\n          result.push([seq + \" Move view pans after the arrow\", okPan && u.x === xA && P2().histDepth().past === dA]);\n          const again = await dragPan();\n          result.push([seq + \" and again\", again != null && Math.abs(again - ref) / ref < 0.05]);\n          out(\"   a second drag: \" + again + \" mm\");\n        } else if (seq === \"panseq\") {\n          const us = P2().sceneRef().units.filter((v) => v.family !== \"wall\").sort((p, q) => p.x - q.x), a0 = us[0], nb = us[1];\n          if (!a0 || !nb) {\n            out(\"   need two cabinets\");\n            continue;\n          }\n          {\n            const row = us.slice(1).filter((v) => Math.abs(v.z - a0.z) < 1 && (v.rot || 0) === (a0.rot || 0));\n            a0.x = 300;\n            const sh = Math.max(0, a0.x + a0.w + 300 - nb.x);\n            for (const v of row) v.x += sh;\n          }\n          out(\"   fixture: a0 x \" + Math.round(a0.x) + \" w \" + Math.round(a0.w) + \", nb x \" + Math.round(nb.x) + \" (gap \" + Math.round(nb.x - a0.x - a0.w) + \")\");\n          P2().sceneRef().selectedId = a0.id;\n          P2().syncControls();\n          IA().view.fitKitchen(true);\n          P2().render();\n          await wait(400);\n          const drag2 = async () => {\n            const n2 = neutral();\n            if (!n2) return;\n            const el = doc2.elementFromPoint(n2[0], n2[1]) || doc2.body;\n            el.dispatchEvent(pe(\"pointerdown\", n2[0], n2[1], 1));\n            el.dispatchEvent(me(\"mousedown\", n2[0], n2[1], 1, 1));\n            for (let k = 1; k <= 8; k++) {\n              win2.dispatchEvent(pe(\"pointermove\", n2[0] + 20 * k, n2[1] + 8 * k, 1));\n              win2.dispatchEvent(me(\"mousemove\", n2[0] + 20 * k, n2[1] + 8 * k, 1, 0));\n              await wait(30);\n            }\n            win2.dispatchEvent(pe(\"pointerup\", n2[0] + 160, n2[1] + 64, 0));\n            win2.dispatchEvent(me(\"mouseup\", n2[0] + 160, n2[1] + 64, 0, 1));\n            await wait(300);\n            key(\"Escape\");\n            await wait(200);\n          };\n          for (const dir of [\"left\", \"right\"]) {\n            const mb = root.querySelector(\"[data-ub-mode-move]\");\n            if (mb) {\n              const r = mb.getBoundingClientRect();\n              click1(r.left + r.width / 2, r.top + r.height / 2);\n            }\n            await wait(350);\n            P2().sceneRef().selectedId = a0.id;\n            IA().view.fitKitchen(true);\n            P2().syncControls();\n            P2().render();\n            await wait(400);\n            const all = [...root.querySelectorAll(\"[data-ub-movearrow]\")].map((b2) => {\n              const r = b2.getBoundingClientRect(), x = r.left + r.width / 2, y = r.top + r.height / 2, el = doc2.elementFromPoint(x, y);\n              return b2.getAttribute(\"data-ub-movearrow\") + (b2.offsetParent ? \"\" : \"(hidden)\") + (b2.disabled ? \"(disabled)\" : \"\") + \"@\" + Math.round(x) + \",\" + Math.round(y) + \" \" + Math.round(r.width) + \"x\" + Math.round(r.height) + \" top=\" + (el === b2 || el && b2.contains(el) ? \"self\" : el ? el.tagName + \".\" + String(el.className && el.className.baseVal != null ? el.className.baseVal : el.className).slice(0, 30) + (el.getAttribute(\"data-ub-qadd\") ? \"[qadd \" + el.getAttribute(\"data-ub-qadd\") + \"]\" : \"\") : \"none\");\n            });\n            out(\"   \" + dir + \": mode \" + IA().mode() + \", a0 x \" + Math.round(a0.x) + \", nb x \" + Math.round(nb.x) + \", w \" + Math.round(a0.w) + \", window \" + win2.innerWidth + \"x\" + win2.innerHeight + \"; arrows: \" + (all.join(\" | \") || \"none\"));\n            const b = root.querySelector('[data-ub-movearrow=\"' + dir + '\"]');\n            if (!b || !b.offsetParent) {\n              out(\"   \" + dir + \" arrow NOT SHOWN\");\n              result.push([seq + \" \" + dir + \" arrow shown\", false]);\n              continue;\n            }\n            result.push([seq + \" \" + dir + \" arrow shown\", true]);\n            {\n              const r = b.getBoundingClientRect();\n              click1(r.left + r.width / 2, r.top + r.height / 2);\n            }\n            await wait(450);\n            out(\"   after \" + dir + \": a0 x \" + Math.round(a0.x) + \", history \" + JSON.stringify(IA().hist.labels().slice(-2)));\n            const n2 = neutral();\n            dbl(n2[0], n2[1]);\n            await wait(300);\n            const pb = root.querySelector('[data-ub-radial-mode=\"pan\"]');\n            if (pb) {\n              const r = pb.getBoundingClientRect();\n              click1(r.left + r.width / 2, r.top + r.height / 2);\n            }\n            await wait(300);\n            await drag2();\n            await drag2();\n            out(\"   after the pans: mode \" + IA().mode() + \", radial \" + !!P2().sceneRef().radial + \", held \" + !!P2().sceneRef().camHold);\n          }\n        } else if (seq === \"moveshelf\") {\n          u.interior = { shelves: 1, vDiv: [], hDiv: [] };\n          P2().sceneRef().selectedId = u.id;\n          IA().commands.run(\"toggleDoorOpen\", {});\n          IA().view.setCam(-0.75, 0.16);\n          P2().render();\n          await wait(500);\n          const sel = () => {\n            const s = IA().ctx.inside.selectedInterior();\n            return s && s.kind === \"shelf\" ? s.part.local : null;\n          };\n          const ptL = (L2, dy, dz, edge) => px(u, [(L2.x0 + L2.x1) / 2, (edge ? L2.y1 : (L2.y0 + L2.y1) / 2) + dy, (edge ? L2.z1 - 3 : L2.z1 - 60) + dz]);\n          const B = interiorBounds(u), ys = IA().ctx.inside.probe.shelfYs(u), y = B.y0 + ys[0];\n          const guess = { x0: B.x0 + 4, x1: B.x1 - 4, y0: y, y1: y + 18, z0: B.z0, z1: B.z1 - 20 };\n          async function dragAt(a, b) {\n            clickCount = 0;\n            let el = doc2.elementFromPoint(a[0], a[1]) || doc2.body;\n            const pd = pe(\"pointerdown\", a[0], a[1], 1);\n            el.dispatchEvent(pd);\n            if (!pd.defaultPrevented) el.dispatchEvent(me(\"mousedown\", a[0], a[1], 1, 1));\n            for (let k = 1; k <= 8; k++) {\n              const x = a[0] + (b[0] - a[0]) * k / 8, yy = a[1] + (b[1] - a[1]) * k / 8, t = doc2.elementFromPoint(x, yy) || doc2.body;\n              t.dispatchEvent(pe(\"pointermove\", x, yy, 1));\n              t.dispatchEvent(me(\"mousemove\", x, yy, 1, 0));\n              await wait(30);\n            }\n            el = doc2.elementFromPoint(b[0], b[1]) || doc2.body;\n            el.dispatchEvent(pe(\"pointerup\", b[0], b[1], 0));\n            el.dispatchEvent(me(\"mouseup\", b[0], b[1], 0, 1));\n            await wait(300);\n          }\n          const g2 = ptL(guess, 0, 0, true);\n          dbl(g2[0], g2[1]);\n          await wait(400);\n          state2(\"shelf double-clicked through the open door (y \" + IA().ctx.inside.probe.shelfYs(u)[0] + \")\");\n          let L = sel() || guess;\n          await dragAt(ptL(L, 0, 0, false), ptL(L, 96, 0, false));\n          state2(\"shelf dragged up and released (y \" + IA().ctx.inside.probe.shelfYs(u)[0] + \")\");\n          const bar = () => {\n            const b = root.querySelector(\"[data-ub-itoolbar]\");\n            return !!(b && !b.hidden && b.getBoundingClientRect().width > 0);\n          };\n          out(\"   tray (Select bar) open before: \" + bar() + \", tool=\" + (P2().sceneRef().insideTool || \"-\"));\n          {\n            const n2 = neutral(), u0 = P2().histDepth().past;\n            dbl(n2[0], n2[1]);\n            await wait(300);\n            const o1 = state2(\"neutral double-click with the tray open\");\n            out(\"   tray open after: \" + bar());\n            result.push([seq + \" tray open: menu opens\", o1]);\n            const c = cv().getBoundingClientRect();\n            let away = null;\n            for (let yy = c.top + 30; yy < c.bottom - 30 && !away; yy += 17) for (let x = c.left + 40; x < c.right - 40; x += 17) {\n              const el = doc2.elementFromPoint(x, yy);\n              if (el && el.tagName === \"CANVAS\" && Math.hypot(x - n2[0], yy - n2[1]) > 90) {\n                away = [x, yy];\n                break;\n              }\n            }\n            await wait(600);\n            click1(away[0], away[1]);\n            await wait(300);\n            const shut = !state2(\"single click-away\");\n            result.push([seq + \" click-away closes it\", shut]);\n            await wait(650);\n            dbl(n2[0], n2[1]);\n            await wait(300);\n            result.push([seq + \" reopens\", state2(\"neutral double-click again (reopen)\")]);\n            key(\"Escape\");\n            await wait(300);\n            result.push([seq + \" Escape closes it\", !state2(\"Escape\")]);\n            result.push([seq + \" no Undo step from the menu\", P2().histDepth().past === u0]);\n            out(\"   Undo depth through it all: \" + u0 + \" -> \" + P2().histDepth().past);\n            await wait(650);\n          }\n          const g22 = ptL(sel() || L, 0, 0, true);\n          await wait(200);\n          dbl(g22[0], g22[1]);\n          await wait(400);\n          L = sel() || L;\n          await dragAt(ptL(L, 0, 0, true), ptL(L, 0, -90, true));\n          const s0 = (u.interior.shelfList || [])[0] || {};\n          state2(\"front edge dragged back (setback \" + s0.setback + \", depth \" + s0.depth + \")\");\n          result.push([seq + \" after a depth move\", await neutralDbl(\"after the depth move\")]);\n        } else if (/^panels/.test(seq)) {\n          for (const name2 of seq === \"panels-drawers\" ? [\"drawers\"] : seq === \"panels-inside\" ? [\"inside\"] : [\"drawers\", \"inside\"]) {\n            const fly = root.querySelector('[data-ub-fly=\"' + name2 + '\"]');\n            if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n              fly.click();\n              await wait(500);\n            }\n            const panel = root.querySelector('[data-ub-flyout=\"' + name2 + '\"]'), pr = panel && panel.getBoundingClientRect();\n            out(\"panel \" + name2 + \" open=\" + !!(panel && !panel.hasAttribute(\"hidden\")) + \" rect=\" + (pr ? [pr.left, pr.top, pr.right, pr.bottom].map(Math.round) : \"-\"));\n            const c = cv().getBoundingClientRect();\n            let shut = 0, opened = 0;\n            for (const [fx, fy] of [[0.08, 0.15], [0.5, 0.15], [0.92, 0.15], [0.08, 0.5], [0.92, 0.5], [0.08, 0.92], [0.5, 0.92], [0.92, 0.92], [0.3, 0.75], [0.7, 0.3]]) {\n              const x = c.left + c.width * fx, y = c.top + c.height * fy, el = doc2.elementFromPoint(x, y);\n              if (!el || P2().pickAtClient(x, y)) continue;\n              const ia = IA();\n              let called = 0, bg = null;\n              const R4 = ia.ctx.radial, orig = R4.dblclick;\n              R4.dblclick = (e) => {\n                called++;\n                bg = R4.background(e);\n                return orig(e);\n              };\n              P2().sceneRef().radial = null;\n              dbl(x, y);\n              await wait(250);\n              R4.dblclick = orig;\n              const sc = P2().sceneRef(), L = root.querySelector(\"[data-ub-radial]\"), isOpen = !!sc.radial && L && !L.hasAttribute(\"hidden\");\n              const cls = el.tagName + \".\" + String(el.className && el.className.baseVal != null ? el.className.baseVal : el.className).split(\" \")[0].slice(0, 28);\n              out(\"  \" + (isOpen ? \"MENU OPEN \" : \"menu shut \") + name2 + \" panel open, dbl at \" + [x, y].map(Math.round) + \" on \" + cls + \" handler=\" + called + \" background=\" + bg + \" tool=\" + (sc.insideTool || \"-\") + \" panelStillOpen=\" + !!(panel && !panel.hasAttribute(\"hidden\")) + \" undo=\" + P2().histDepth().past);\n              if (el.tagName === \"CANVAS\") {\n                result.push([seq + \" \" + name2 + \" open @\" + [fx, fy], isOpen]);\n                if (isOpen) opened++;\n                else shut++;\n              }\n              key(\"Escape\");\n              await wait(650);\n              if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n                fly.click();\n                await wait(400);\n              }\n            }\n            out(\"  -> \" + name2 + \" panel open: menu opened on \" + opened + \" canvas points, shut on \" + shut);\n            if (name2 === \"inside\") {\n              for (const t of [\"divider\", \"shelf\"]) {\n                if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n                  fly.click();\n                  await wait(400);\n                }\n                IA().commands.run(\"insideTool\", { tool: t });\n                await wait(200);\n                result.push([seq + \" inside open, \" + t + \" tool armed\", await neutralDbl(\"Inside panel open, \" + t + \" tool armed\")]);\n              }\n            }\n            if (fly && fly.getAttribute(\"aria-expanded\") === \"true\") {\n              fly.click();\n              await wait(300);\n            }\n          }\n        } else if (seq === \"drawershelf\") {\n          const fly = root.querySelector('[data-ub-fly=\"drawers\"]');\n          if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n            fly.click();\n            await wait(500);\n          }\n          const tool = root.querySelector(\"[data-ub-ddrag]\"), at = px(u, [u.w / 2, u.h * 0.8, u.d + 20]);\n          await drag(tool, at[0], at[1]);\n          await wait(400);\n          state2(\"after the drawer drag-in\");\n          result.push([seq + \" after drag-in\", await neutralDbl(\"after the drag-in\")]);\n          P2().sceneRef().selectedId = u.id;\n          IA().commands.run(\"toggleDoorOpen\", {});\n          await wait(400);\n          state2(\"door opened (\" + !!u.doorOpen + \")\");\n          result.push([seq + \" door open\", await neutralDbl(\"door open\")]);\n          const B = interiorBounds(u), sh = (u.interior.shelfList || [])[0];\n          const sy = sh ? B.y0 + sh.y + 18 : B.y0 + B.h * 0.5;\n          const sp = px(u, [B.x0 + B.w * 0.5, sy, B.z1 - 40]);\n          dbl(sp[0], sp[1]);\n          await wait(400);\n          state2(\"after double-click on the shelf through the open door\");\n          result.push([seq + \" shelf selected\", await neutralDbl(\"after selecting the shelf\")]);\n        } else if (seq === \"drawernear\" || seq === \"drawerbtn\" || seq === \"drawermodes\") {\n          spot = nearSpot(u);\n          out(\"near spot \" + JSON.stringify(spot && spot.map(Math.round)));\n          const fly = root.querySelector('[data-ub-fly=\"drawers\"]');\n          if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n            fly.click();\n            await wait(500);\n          }\n          const tool = root.querySelector(\"[data-ub-ddrag]\"), at = px(u, [u.w / 2, u.h * 0.75, u.d + 20]);\n          await drag(tool, at[0], at[1]);\n          await wait(400);\n          state2(\"after the drawer drag-in\");\n          result.push([seq + \" after drag-in\", await neutralDbl(\"after the drag-in\")]);\n          if (seq === \"drawerbtn\") {\n            const ob = root.querySelector(\"[data-ub-dopen1]\");\n            out(\"open button \" + !!ob + \" visible=\" + !!(ob && ob.getBoundingClientRect().width));\n            if (ob) {\n              ob.click();\n              await wait(400);\n            }\n          } else {\n            const b = drawerBoxes(u)[0], fp = px(u, [u.w / 2, (b.fy0 + b.fy1) / 2, u.d + 20]);\n            dbl(fp[0], fp[1]);\n            await wait(400);\n          }\n          state2(\"after opening\");\n          result.push([seq + \" opened\", await neutralDbl(\"with the drawer open\")]);\n          if (seq === \"drawermodes\") for (const md of [\"size\", \"cabinet\", \"pan\", \"rotate\"]) {\n            IA().setMode(md);\n            await wait(250);\n            result.push([seq + \" open, mode \" + md, await neutralDbl(\"open, mode \" + md)]);\n          }\n          spot = null;\n          result.push([seq + \" far corner\", await neutralDbl(\"far corner\")]);\n        } else if (seq === \"drawer\") {\n          const fly = root.querySelector('[data-ub-fly=\"drawers\"]');\n          if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n            fly.click();\n            await wait(500);\n          }\n          const tool = root.querySelector(\"[data-ub-ddrag]\"), at = px(u, [u.w / 2, u.h * 0.75, u.d + 20]);\n          if (!tool || !at) {\n            out(\"no drawer tool / spot\");\n            continue;\n          }\n          await drag(tool, at[0], at[1]);\n          await wait(400);\n          state2(\"after the drawer drag-in\");\n          result.push([\"drawer after drag-in\", await neutralDbl(\"after the drag-in\")]);\n          const b = drawerBoxes(u)[0];\n          const fp = b ? px(u, [u.w / 2, (b.fy0 + b.fy1) / 2, u.d + 20]) : null;\n          if (fp) {\n            dbl(fp[0], fp[1]);\n            await wait(300);\n            state2(\"after double-click on the drawer front (open)\");\n          }\n          result.push([\"drawer opened\", await neutralDbl(\"with the drawer open\")]);\n          result.push([\"drawer opened again\", await neutralDbl(\"again\")]);\n          if (fp) {\n            dbl(fp[0], fp[1]);\n            await wait(300);\n            state2(\"after double-click on the drawer front (shut)\");\n          }\n          result.push([\"drawer shut\", await neutralDbl(\"after shutting\")]);\n        } else {\n          const fly = root.querySelector('[data-ub-fly=\"inside\"]');\n          if (fly && fly.getAttribute(\"aria-expanded\") !== \"true\") {\n            fly.click();\n            await wait(500);\n          }\n          const btn = Array.prototype.slice.call(root.querySelectorAll('[data-ub-itool=\"' + seq + '\"]')).filter((e) => e.getBoundingClientRect().width > 0)[0];\n          if (!btn) {\n            out(\"no \" + seq + \" button\");\n            continue;\n          }\n          btn.click();\n          await wait(300);\n          const B = interiorBounds(u);\n          const at = seq === \"divider\" ? px(u, [B.x0 + B.w * 0.4, B.y0 + B.h * 0.5, B.z1]) : px(u, [u.w / 2, B.y0 + B.h * 0.55, B.z1]);\n          click1(at[0], at[1]);\n          await wait(300);\n          state2(\"after placing a \" + seq + \" by click\");\n          result.push([seq + \" placed\", await neutralDbl(\"after placing\")]);\n          result.push([seq + \" after Escape\", await neutralDbl(\"after Escape\")]);\n          const fp = seq === \"divider\" ? px(u, [B.x0 + B.w * 0.4 + 9, B.y0 + B.h * 0.5, B.z1]) : px(u, [u.w / 2, B.y0 + B.h * 0.55 + 9, B.z1]);\n          IA().commands.run(\"toggleDoorOpen\", {});\n          await wait(300);\n          dbl(fp[0], fp[1]);\n          await wait(300);\n          state2(\"after double-click on the \" + seq + \" (select)\");\n          result.push([seq + \" selected\", await neutralDbl(\"after selecting it\")]);\n        }\n        for (let k = 1; k <= 3; k++) result.push([seq + \" repeat \" + k, await neutralDbl(\"repeat \" + k)]);\n      }\n      const bad = result.filter((r) => !r[1]).map((r) => r[0]);\n      const verdict = \"==== \" + (bad.length ? \"MENU DID NOT OPEN: \" + bad.join(\"; \") : \"MENU OPENED EVERY TIME (\" + result.length + \" neutral double-clicks)\");\n      lines.unshift(verdict);\n      out(verdict);\n      const n = neutral();\n      if (n) {\n        dbl(n[0], n[1]);\n        await wait(300);\n        out(\"(the menu left open at \" + n.map(Math.round) + \" for the picture)\");\n      }\n      box3.setAttribute(\"data-ub-qaradial-done\", bad.length ? \"fail\" : \"ok\");\n    }\n    return none;\n  }\n\n  // v2/src/ui/sketch-icons.js\n  var ICON_STROKE = 1.5;\n  function gearPath() {\n    const n = 8, ro = 9.6, ri = 7.2, cx = 12, cy = 12, pts = [];\n    for (let i = 0; i < n; i++) {\n      const a = i / n * 2 * Math.PI, half = Math.PI / n, tooth = half * 0.52, base = half * 0.8;\n      for (const [ang, r] of [[a - base, ri], [a - tooth, ro], [a + tooth, ro], [a + base, ri]])\n        pts.push([cx + r * Math.sin(ang), cy - r * Math.cos(ang)]);\n    }\n    return \"M\" + pts.map((p) => p[0].toFixed(2) + \" \" + p[1].toFixed(2)).join(\"L\") + \"Z\";\n  }\n  var SKETCH_ICONS = {\n    /* ---- top bar: view and what dragging does ---- */\n    \"rotate\": { label: \"Rotate view\", d: '<ellipse cx=\"12\" cy=\"12\" rx=\"10.5\" ry=\"4\"/><ellipse cx=\"12\" cy=\"12\" rx=\"4.4\" ry=\"9.2\"/>' },\n    \"pan\": { label: \"Move view\", d: '<path d=\"M12 3v18M3 12h18M9.4 5.6 12 3l2.6 2.6M9.4 18.4 12 21l2.6-2.6M5.6 9.4 3 12l2.6 2.6M18.4 9.4 21 12l-2.6 2.6\"/>' },\n    \"size\": { label: \"Size cabinet\", d: '<path d=\"M5 3.8h14M7 1.8l-2 2 2 2M17 1.8l2 2-2 2\"/><rect x=\"3.5\" y=\"8\" width=\"17\" height=\"11\" rx=\"1\"/><path d=\"M12 8v11M10.3 11.6v2.4M13.7 11.6v2.4M6 19v2M18 19v2\"/>' },\n    \"move\": { label: \"Move cabinet\", d: '<rect x=\"8.6\" y=\"8.6\" width=\"6.8\" height=\"6.8\" rx=\".8\"/><path d=\"M12 8.6V2.6M10 4.6l2-2 2 2M12 15.4v6M10 19.4l2 2 2-2M8.6 12h-6M4.6 10l-2 2 2 2M15.4 12h6M19.4 10l2 2-2 2\"/>' },\n    \"measure\": { label: \"Tape measure\", d: '<rect x=\"1.5\" y=\"9\" width=\"21\" height=\"6\" rx=\".9\"/><path d=\"M4 9v2.6M6.5 9v1.5M9 9v2.6M11.5 9v1.5M14 9v2.6M16.5 9v1.5M19 9v2.6\"/>' },\n    \"eye\": { label: \"View options\", d: '<path d=\"M2 12s3.7-6.5 10-6.5S22 12 22 12s-3.7 6.5-10 6.5S2 12 2 12z\"/><circle cx=\"12\" cy=\"12\" r=\"3.1\"/>' },\n    /* the turns: a cabinet from above (its front edge doubled) and the arrow that turns it */\n    \"turn-left\": { label: \"Turn left\", d: '<path d=\"M5 12.5a7.2 7.2 0 1 0 2.1-5.6M4.6 3.6v3.6h3.6\"/><rect x=\"9.6\" y=\"9.8\" width=\"4.8\" height=\"4.8\" rx=\".6\"/><path d=\"M10.6 13.2h2.8\"/>' },\n    \"turn-right\": { label: \"Turn right\", d: '<path d=\"M19 12.5a7.2 7.2 0 1 1-2.1-5.6M19.4 3.6v3.6h-3.6\"/><rect x=\"9.6\" y=\"9.8\" width=\"4.8\" height=\"4.8\" rx=\".6\"/><path d=\"M10.6 13.2h2.8\"/>' },\n    \"turn-around\": { label: \"Turn around\", d: '<path d=\"M4.8 9.4a7.6 7.6 0 0 1 13.9-2M19 3.6v3.8h-3.8M19.2 14.6a7.6 7.6 0 0 1-13.9 2M5 20.4v-3.8h3.8\"/><rect x=\"9.8\" y=\"9.8\" width=\"4.4\" height=\"4.4\" rx=\".6\"/><path d=\"M10.7 13.1h2.6\"/>' },\n    /* ---- left rail: what you add and edit ---- */\n    \"cabinets\": { label: \"Add cabinet\", caption: \"Cabinets\", d: '<path d=\"M2.6 3.6h18.8\"/><rect x=\"3.6\" y=\"3.6\" width=\"16.8\" height=\"15.8\" rx=\".8\"/><path d=\"M3.6 6.4h16.8M12 6.4v13M10.3 10.8v2.6M13.7 10.8v2.6M5.8 19.4v1.8M18.2 19.4v1.8\"/>' },\n    \"shelves\": { label: \"Shelves & dividers\", caption: \"Shelves & dividers\", d: '<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"1\"/><path d=\"M15 3v18M4 9h11M4 15h11M15 12h5\"/>' },\n    \"doors\": { label: \"Fronts\", caption: \"Doors\", d: '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"1\"/><path d=\"M12 3.5v17M10.1 10v4M13.9 10v4\"/>' },\n    \"drawers\": { label: \"Drawers\", caption: \"Drawers\", d: '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"1\"/><path d=\"M3.5 8.4h17M3.5 14.4h17M10 5.95h4M10 11.4h4M10 17.4h4\"/>' },\n    \"end-panel\": { label: \"End panels\", caption: \"End panels\", d: '<path d=\"M6.5 6.8 17.5 3v15.6L6.5 21z\"/>' },\n    \"room\": { label: \"Room\", caption: \"Room\", d: '<path d=\"M3 16.5 12 12l9 4.5L12 21z\"/><path d=\"M3 16.5V7.5L12 3v9M21 16.5V7.5L12 3\"/><path d=\"M7.5 18.75l9-4.5M16.5 18.75l-9-4.5\"/>' },\n    \"settings\": { label: \"Settings\", caption: \"Settings\", d: '<path d=\"' + gearPath() + '\"/><circle cx=\"12\" cy=\"12\" r=\"3.2\"/>' },\n    /* ---- right rail: zoom, history, framing ---- */\n    \"zoom-in\": { label: \"Zoom in\", d: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7.8v8.4M7.8 12h8.4\"/>' },\n    \"zoom-out\": { label: \"Zoom out\", d: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M7.8 12h8.4\"/>' },\n    \"undo\": { label: \"Undo\", d: '<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\"/>' },\n    \"redo\": { label: \"Redo\", d: '<path d=\"m15 14 5-5-5-5\"/><path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\"/>' },\n    \"fit\": { label: \"Fit kitchen\", d: '<path d=\"M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5\"/>' },\n    /* ---- room bar ---- */\n    \"width\": { label: \"Width\", caption: \"Width\", d: '<path d=\"M3 12h18M6 9l-3 3 3 3M18 9l3 3-3 3\"/>' },\n    \"depth\": { label: \"Depth\", caption: \"Depth\", d: '<path d=\"M5 19 19 5M5 14v5h5M14 5h5v5\"/>' },\n    \"height\": { label: \"Height\", caption: \"Height\", d: '<path d=\"M12 3v18M9 6l3-3 3 3M9 18l3 3 3-3\"/>' },\n    \"add-door\": { label: \"Add a door to the room\", caption: \"Add door\", d: '<path d=\"M6 3v18M6 3.6l3 1.2v14.4L6 20.4M8 11.6v1.6\"/><path d=\"M9 4.8A15 15 0 0 1 19.5 20.4M9 20.6h10.5\" stroke-dasharray=\"1 2.6\"/>' },\n    \"add-window\": { label: \"Add a window to the room\", caption: \"Add window\", d: '<rect x=\"3.5\" y=\"3\" width=\"17\" height=\"18\" rx=\".8\"/><rect x=\"5.6\" y=\"5\" width=\"12.8\" height=\"14\" rx=\".4\"/><path d=\"M11.2 5v14M12.8 5v14\"/>' },\n    /* ---- inside a cabinet (Inside tools) ---- */\n    \"select-part\": { label: \"Move part\", d: '<path d=\"M5 3.5 18.5 10l-5.9 1.7-2.4 6.1z\"/><path d=\"m13 12.2 5 5\"/>' },\n    \"add-shelf\": { label: \"Add shelf\", d: '<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"1\"/><path d=\"M6.6 13h10.8\"/><path d=\"M7 15.1v.01M17 15.1v.01\" stroke-width=\"2.4\"/><path d=\"M12 6v4.2M9.9 8.1h4.2\"/>' },\n    \"v-divider\": { label: \"Vertical divider\", d: '<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"1\"/><path d=\"M11 3v18M13 3v18\"/>' },\n    \"h-divider\": { label: \"Horizontal divider\", d: '<rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"1\"/><path d=\"M4 11h16M4 13h16\"/>' },\n    \"remove\": { label: \"Remove\", d: '<path d=\"M4 6.5h16M9.5 6.5V4h5v2.5M6.3 6.5l1 13.5h9.4l1-13.5M10.2 10v6.5M13.8 10v6.5\"/>' },\n    \"done\": { label: \"Done\", d: '<path d=\"m4.5 12.5 4.8 4.8L19.5 7\"/>' },\n    \"clear\": { label: \"Clear\", d: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"m8.8 8.8 6.4 6.4M15.2 8.8l-6.4 6.4\"/>' },\n    \"close\": { label: \"Close\", d: '<path d=\"M6 6l12 12M18 6 6 18\"/>' },\n    /* ---- a selected cabinet ---- */\n    \"duplicate\": { label: \"Duplicate\", d: '<rect x=\"8\" y=\"8\" width=\"12.5\" height=\"12.5\" rx=\"1.2\"/><path d=\"M16 8V4.8c0-.7-.6-1.3-1.3-1.3H4.8c-.7 0-1.3.6-1.3 1.3v9.9c0 .7.6 1.3 1.3 1.3H8\"/>' },\n    \"door-open\": { label: \"Open door\", d: '<path d=\"M4 3h12v18H4z\"/><path d=\"M4 3l7 2.4v17.2L4 21\"/><path d=\"M9 13v1.8\"/>' },\n    \"drawer-open\": { label: \"Open drawer\", d: '<path d=\"M4 9h16v12H4z\"/><path d=\"M2.5 4.5h19v4.5h-19zM10 6.7h4M7 9v3h10V9\"/>' }\n  };\n  var ICON_FOR_CONTROL = {\n    \"[data-ub-eye]\": \"eye\",\n    \"[data-ub-mode-rotate]\": \"rotate\",\n    \"[data-ub-mode-pan]\": \"pan\",\n    \"[data-ub-mode-size]\": \"size\",\n    \"[data-ub-mode-move]\": \"move\",\n    \"[data-ub-measure]\": \"measure\",\n    \"[data-ub-turn-left]\": \"turn-left\",\n    \"[data-ub-turn-right]\": \"turn-right\",\n    \"[data-ub-turn-flip]\": \"turn-around\",\n    '[data-ub-fly=\"cabinets\"]': \"cabinets\",\n    '[data-ub-fly=\"inside\"]': \"shelves\",\n    '[data-ub-fly=\"fronts\"]': \"doors\",\n    '[data-ub-fly=\"drawers\"]': \"drawers\",\n    '[data-ub-fly=\"finishing\"]': \"end-panel\",\n    '[data-ub-fly=\"room\"]': \"room\",\n    \"[data-ub-zoomin]\": \"zoom-in\",\n    \"[data-ub-zoomout]\": \"zoom-out\",\n    \"[data-ub-undo]\": \"undo\",\n    \"[data-ub-redo]\": \"redo\",\n    \"[data-ub-fit]\": \"fit\",\n    '[data-ub-roomadd=\"door\"]': \"add-door\",\n    '[data-ub-roomadd=\"window\"]': \"add-window\",\n    '[data-ub-itool=\"select\"]': \"select-part\",\n    '[data-ub-itool=\"shelf\"]': \"add-shelf\",\n    '[data-ub-itool=\"divider\"]': \"v-divider\",\n    '[data-ub-itool=\"hdivider\"]': \"h-divider\",\n    \"[data-ub-itoolremove]\": \"remove\",\n    '[data-ub-itool=\"off\"]': \"done\",\n    \"[data-ub-duplicate]\": \"duplicate\",\n    \"[data-ub-remove]\": \"remove\",\n    \"[data-ub-draweropen]\": \"drawer-open\",\n    \"[data-ub-flyclose]\": \"close\"\n  };\n  function iconSvg(id, o) {\n    const ic = SKETCH_ICONS[id];\n    if (!ic) return \"\";\n    const sz = o && o.size ? ' width=\"' + o.size + '\" height=\"' + o.size + '\"' : \"\";\n    const sw = o && o.stroke || ICON_STROKE;\n    return '<svg class=\"ub-lab__sicon\" data-ub-icon=\"' + id + '\" viewBox=\"0 0 24 24\"' + sz + ' fill=\"none\" stroke=\"currentColor\" stroke-width=\"' + sw + '\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' + ic.d + \"</svg>\";\n  }\n\n  // v2/src/ui/part-thumbs.js\n  var PART_THUMBS = {\n    \"cabinet\": \"data:image/webp;base64,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\",\n    \"drawer\": \"data:image/webp;base64,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\",\n    \"shelf\": \"data:image/webp;base64,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\",\n    \"vdivider\": \"data:image/webp;base64,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\",\n    \"hdivider\": \"data:image/webp;base64,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\",\n    \"endpanel\": \"data:image/webp;base64,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\",\n    \"door\": \"data:image/webp;base64,UklGRro0AABXRUJQVlA4TK00AAAvj8AjEI2wadhIjJwlg8Of8LV6ChH9nwB+FT1JGsit4EdKLoKabTLb8gxN67iP2+Umn+/1u5+ZNI2ZkJq22iqFVlqqqFCxWhGl7rRU0aZYBF+Arrv3FbjXpYviVnQh6saCgpSClmJb0kQKVUxMTCczMzPnPPf/+sI5kzx5kqQrEdrOLgp0jO/fp0WkQrz/0zl1Q0hMxGCme9l1tmGU3OR5jzfCQqEhQog2Ej0e5/4vJBJ97IoCOTs7M/+n+x2w4bac5Pc87/ettffZ58xMJW07pW2hNmAL7dBSKC3QKZqg0Rokxhv/AC8FY7xQomliSBUT1UYNRKIkiCEKiSGp8cYrlXKlUW+MSTUCQ6cznZ5zzjl777XW973PMwEI+H9Xv80r+L6L06f5n394eJv3ltfD6/j08iMX426PP6a/hCf4dvjOWzz/7ve2fS9+6qqf7Hx6+EFkTEuGyKYFIBt09Qx38k7mD3FdHuON2N76I/MCj2PPq7fwFHfh8Vu8+K7yNj+A1y/73PKFuz50j2ujvLkZEAAQGQIyYiACEENiWjJAGBAD0LrPdkcXPMGbbLa+bZ6GJ+VtuTdP8Cbuwh0ex77zSd1+Y2/bA7rG07fYv0O8zSg/hB+7+OLFT1y87x67aYEA1ozMJmU2AShBNkpgMC02KTbwkUpGDCgZAjJEBgAEAEEBMYAd367OeEuemEW+Zb6Bb8duqt/HQ/yFx3r8OIeX+dvwHfAPcsz2uerjFz+7fO6ym5flQkxlUGTTMFIWd1PA4kIwuMyRQTAI4CCY0RKTkZJNoATZtGQDAC3ZgAI2CkA2SobIhgQQAEAAcJmXeFEywMxvt7ftEX2x+YL5DD6LawCmUjQ6mC3ZFFu6ucribu4o4BEHMFjAGMKQ2WwEBRkwlTVHalJmA+QBRQAjAxtlNpCACGTTkk0LZBMZwJpHeYGgCADY7bfV7759fzj8aF2f/Njnv/+9F+13ggyRoWRDYsgZcJOYCnzdDZtKsaip1FylG/GIRQGLYxaRmpGalpouYwJhgTFbgm4CKJTZKMFsgjeXBwkuPOIxbFoyGCAME07fNp9/+/7h8Ml1fvLF4/knH8/jh957eR/vvd699c+//NCnf5hlAMWjgZcNvDhjAMwQBAaQjZIBAUAAADFQgdeLRofoZstuAK7CXCgWa6DFhtQUKZCN8rHLmxgpPsQdMaQIGhkMgRaydf62+MLbt++uPr2dL708zx9/8fj4+AePe7zz+o4JiuB+7l5Gb4IBHARBAAEE2xCAoICgwgSVbERlNoLMBpRsSEykSGRDACCGFDEVACigKJhFSzdHgitejntkUxFgBA2ADGGTwWQO33JfePv+Afb5+9mff3Hur708r0+8//LuvZd398O5NGbAxgzIPikWFWYwiIypZNMS1MxoYWaIYBEwyixMEESygRYIbBQbAGEIIBkim0CBjBgCQQwBgMUdL7CmJQOKmEoARQCNDIgBiF2+pT7/9v37Yj99P/vx9x/3169er77z+sMHjw/CZiNyRjCjkTGjgPt5qbnjw6WYERRFNhAUQUtNpJvEDtiARcZiypriIDjIEDMSEAlgNgIyQDEEfF2DUS683CgA2UAlpgIQFDEVAZANKOXZt8oX3r4NfKx86fGcL7w8Hz/24jze9d7ru/de7ioxA8NGKQCumAEbcPv6N5/481ff+/XNx89L5P/cN3/8fGiZTUzQElMzowUCm6JRGDUpF2AlZnFGIkNkDIpEhoAMQRjICAASELERGS0xQII7HmEERUwLZEAjg6kE0MgoEsKg598KX3j7dtX6TLafePF4vf7Y4/MfvDxe+trrD4/ngdREghi45Gxasrkt0AgSM2DDx2e3/z578xw19xHzoU++ikZQscnYMhsmY0s2IBbGRjG4AMUgIDYTxRmJYkYhMiABBiSKjBYbAUEBGSJycG0eURCGBEwlpiAgjKCRAdBRw+Zzfe6HbzczP8K++PI8X3/5eH72w/Nx/e7rn148ngoCDGGKkQBuuE5udzauJsIEi0VNS88RfPXjk499cxeX7zefGI9SOYhRssmmYTTAKBokmwI2isUZIiNmyxkC4IwtYwAyFCZDGEoRxBSRmkoMZCTOuMujgUpMy2wK0gBDGBAUAQNCoXiOz7398Wj0Z5rXXp7nT708jx/+4HE/vvP6w8vzoswoIIDAuE4gGyiCxWy2BJBNSzGASGC8KF9+md/bT/7MjivaaGYTrIxRmKKRITIuDOCKoCiKjgRkDAQEAzBEMSDMDGgEJJsWZkYDgGRTiMjZPOIuBQQFvBo0MgAYINDIgOXuOb76/R//+dy317747cM6hE1QKJDRCDKKoBITnM09KsXZCIO0ZDAtjRkzjnxix4/teHg8vHFzN1fzhmkZk00l6BAzWrIpRIdYBB2N4EIAB0URnKHEZDTIbCBoRBiSDSg1M0AUMKNIwIyX5Y5soAIAMQCkkVFA0MimBWB4+hx19vv5UEcMKYoxFRh0iMVBsRjAlhlbzuYqYxQmo9iT22WjaGwvdzyYN8yMT/WSyAiMBEMGjSKbRdAIClhAYWwEEAwyEqQYExgiIwAIAERlADVGopINCCMx4xGPBbIplGxaIKNhMKQxmxbIiIHZsMNzYM0IiprIjCsCpiKyMDBYzNgoIIDbaBQFQMYGXHHG48v/vffj//Txww/9/YuJDmhhGgUELZCNqGSzaMxoLACMDTAmIMgIgsaMljEwo0gUGSAyWiAbUJiMjQAiweO4TEUAGCCygS0ZQREIGwCmUj15jpknDYCaSBEUIqMAUGwCAGbL2Ww0FrNpbAmCjJrBRnp498ff3b7+LJcOUQmCGQ1gjAYUhjDEJdmIImNjkY0SDCCY0QgggAwxo2gEEIEYQ2EyWpgMaAzIS1zIpiJsAqjEVAIAqFEyioAww/4cpQiziNS0nFEEAMSmh46RNrmkDApS04AIbJxLmy23sbiCzEYoMTERgCCjUJhGkSEyNjpEkQEbRQGDYECyERGbQQvMJgCAABoZLbNpECajJRslG+VxcxcBkE1FZEOKmJZsgBQBMAU0+3O0ztlUGhnQyAhgMYCMjSCoMDWV62Q2ZDZQZJMRVDI6YAYcE2FgRjYKQ5gZDAQZAqAAQ6xkc0VGIyNRDCLZpHQzkaEwGUUKA0FGMYBGJZtAFCTIJvLS3CUoIGhkNMAIihiACkBM0JJ58hzsacuYCkABjRmLjduoMEERRK7ImE3DMlJzxhUz1gSzqczYgKuDIcWAgUUMFEFBagCKYkahFLO5YhFkiACCIEOQmI5BIwgMMaMIGiQmo4UhAWMkyOPmXsAmaIFsgBRBIwMaRgAMA2P1HGHNZgSugBgBxeAsEBMUUNSQgMxIKTJaZjRagpYNAUWFBDE1YBMUHaKSYRMsZrQURTaNyJqORgBBRoqNwgQRiMlozGhhItkkyCAwRMyMbBgQBdMC2Sgt2dgAMKJhAAMBA1DJ7D+s7TmWtzeAmVHT0g0ERUwFGkGEFIQJBGGUIBDBIjijUVxoT1BAQCAwREY2xauRNQEYjSLY0QAjEcAgQwTFACCADEFm08jogBbD2AIkwwCwyWZLNkaFACkyDCgINAiQGGzwnGdqxoyKaDFGoDGANhsZRQzTEgC0MCNFcB1iAhK0IYMDwsHMgNkISJCipSHAEFBARtEIrlEkDDEoZiQqTBDADEgUkWI2CiOKbGBLjLBpCQIClYxKDBNDGkEBEMNkZAAwgNOzbG1t1kARNIoZRUHOyCiCIsjIZtCIZKQUs6nMAAVmEcBsR1yCBtnoiEA2LTYECgiMjQjT0Qg6roBBRpHCjDADI1FkBIJATAYAzEZpyQYMYSMMiDAxAYlAYVQAAkKYBjAEsD1LtmdxASbDmE1QnAusuQoECyhmsyfFgByICGlMSSmKRDGItKeajKAmOOimgGxaiiJDgAGFgCLjblrIIKYIIrNpZKSAzaCREQiSDTQ6WsAmqDQqyiKABiEFxBCAAIIGMC3AbGEI7p9FVkYhILYUwXVYpGQDxQBmNMgZjUYLqVEYUpwhZmwMCpghyBlQBIEQNQNoAGSA6IBFw2gEBQQwmLE4UQQRZrAIMkDJRmkwBSizKbIJIgAQwyQaixoICqYIGMjIIIMC2P4s5XZxRsAUBoAhbIKgKKBRBA0YjMDIbFKAUaARAMB1MGw2igIMoxgwxBAZAI0FQMYVRUaiyBhsM0sgDjqUGAjAEIOgY0YlBopioBTZbMnGpqgU2RAiIIgIGyBQNGwiDNWzZE4zoCAZg6AYZAQLCIItRQABKEVQoxQBCdbMEgQBBKJBSNAAETGMmBSbIhALQ0CH2CE6JowEBDMagXEAAjKgEWECmI0hoEGYopHNlooCUAgwoGAySAvDBNm0xFTw1rPgWSMbpmgUTFCIYmBAy2wiADBSM6OlpTEmEmyMtIE92Tij6MioyaZhKMWahmLYNDoGBTSCxQIWB4sgIxg0YCSbxoxGEJCYjI0ZQiwaRjYBAwwRMxiDgSADoIBKAQYhDMlYicHxWXBojGwJAqgUQcdgjQAjgymCYnEAGyODCjQyZjSUYC4bNo1ihrIQBQQzbIQoKsxgYTRgYdMuNQFhDooZQSMYyaZIQIYyG2jJZhEEQQMMGDBGQwECpIgBiAEoYqDRUgBUmhfPIu9k1MwGDCgaG0ExsoDZbIlAhESCjQHJpmU2kW3iEjCVxkYiEogxMwImyNgioEPMuApkswHdpNwRAIAxMcgIGjYpGQkjEEWQERRBgxRQUaAjQ2EAYrJhoFIELUFMQBgjQ0BMkHnxLOUOxqUoAgEZMwAKCO4nNTUQiYmQkS3QIkg2I0VMJIDbpQIFFEGQUdkAWARFIcBQ1gQXZtwjgMHiIEPMgEQxCAAylLPZwsCrIgCARKOADmipgIgJGtkUpFEANKBRAcxnie5nMCNjrjCgKMgVRbA4IwCAloC54nbpCRMEG5WAMCTYaJPNIMNorAibQUxlBogOBboBUSxmFMIQUAxgAEDGQAABsZnCGBmkBkg22UBHRkBEIxtR2FQgm4oACAAMgATzPOx4HYwiS9AQDDAzIkVQBAUpUpjIwXUym2ALEQEJKpDBFI2NLY0ZTIcoIAZEAQBGoxhkHIACr3YTgDBasoErDiDIUJgMyGZGRk2jAdDCMMZsCgiCmKACwGRTVIIgm2xsSHn6LMsdBEwjI2M2SgHABFvaQIQZkCJCAIIgQmYojSDYKGaTEQRwRUYiiGRkNEgBNR2nDAKbQYtN0AI2gZINBAApNko2BbQEhU1KAEWQAaBkQyCmJQAoKo2YmGxaSAAFQwrC4P5ZovuMgDABrMwIgmADziajYAqAEQZIJCOxiLQEAVOBSMvGNWKMyJYMyKbRksFcGMnmlNkAYaBQijEkGxAkG8UmpchGgWwCABJzcMMNb+A2TrmNM85mSjawBSoZLRBjVEDJAEYAFAEQ9sqzsAZgKsUMZg0ULTM2FgPYMoBGsNIyKFoqMDKbnkBE3OM2bCIBI2zEVWIapGZjcOSYCgRrZrQUsyEMBEo3AaQUNgMoSCKbQjHGFDZFRNhkKACBIBk1pMYIKoyoGAwDGTGQqDAN9fazzHqSEQAw1yGiAOwOyIAritkEWxZbBsE2g5ZtAmjZCCC4bSItMYYIBkUMXICHkWIDio0C2Sg2AEo2kGIwBaRANi3ZgGITAEBLkE1Lw2iB2WwJbCpQECaASgwxAgZaCoa0dEDFBvfPcnVWxWjZ2FKzkbHBHIGBqASwGMDBFjECyu1mTxRIMCMbxdkAFB2DLcXgmBEY2CgQZLNlNtCSjVIE2Sg2CmQDLZANQFAELTZBUCgtYATZQCWbRiWbFgDCCFEEAVOpZBMAk00QiEHm/lnGdbJpKWbMJssMmDELBBszZgOVotGSkk3QGAQbg5GGESlEQNp0FFNigjc2QWDT0mKTjWIDgZJNkVLAbABasgElm4IwCmRTQEo2LTZBoQCjtAC0ZCNENu+XbCqKkQ2BVwVpAYUwjYyieetZwmMRk9Eg4grYuKLY6AgaBRMEChysKNAyWLQEjY1GAYtFA2Zz4gFKNiCCmBQmQxCbFBsIikDJBrYMsikgaAHIpghasikCgJZsWoJsoAUCsKkwNhWwiSmggEpgMNlUOhhiNEh48CyZvYDBbBowA4KgmBFcJctBC2wJMraIRUoGAQVm3DaBAnCWjbvpmZh3z8sZI8xtWcc9aiIxQCAbARmgZAMAKUU2AC3ZQMtsWiCbigDIhswGWjKyCSotAVQ+HEEBLQpATQBBCwC0FDEQU+6eZXMHMzaKbIogKBqDomU2NRvZgDAaMyDYIgJoGbS5SksM2WA67uM6xy3uTQyX6xwPH1FqmHceT1kORs5lSnEbGSmQDSjAGIECkE1LNhAUQARkUxEA2UAQJGajAABDiI0RIwhTFAaMSRjQklGYfJazdoCMFjIDisGMqyzOphAGwIBErjJQzqaFaUSCykawJSNjm4KcfVJT6SYBj1IEE2dczRs3iSJDqeO2C8BtQOSgCAaRAIoAIBsCTFAo2bQoQTcRpiUbyOaOjQ+lImwItGTDQCCClkpHDGQDIP0sP/X7fzaqyIbNFTGNRsc9YqbcA2YAFGSjZmQAG5EtxQwFmEhQ9DADEoZRDC6Zzd7LZYRxBcCBzUOQxMMQD2MkGwiIsAExIwLBgMwmgEABI0PYBELJRsmm5RHd2KR0BAKKAoDJppFNEUPg1czbzwJsywZSBluMGfAwjDW30ViQFkVko8S0FAoTqZxSFDNEpZjLi/Py8P9n12YwgKtkswUSRmPGFQFAsAMgpZuUbA4Sby6a20g5mykZB1AEAEAgmA0kMoJuIADI5iWUDzcd0AIxGQBQqUALABNDCoLj89CLLcEMo0ZsiCvgjIUxYMAQwRZhNM6yEQFDFKIStGk5u8CDXKjMZgFnsyiCjgAWxVViSMyMABbKboqgCEQRRGIezG25ScwNKTMeRgIgo4UhAfPSRGbTUiiFkQ1UYoIAYsAIgBDSiGGad54ndjub4kIQyciYkdG4ogGLDZtGNgAiMnI/o0ChGVkzywaQqyEBxFSUlG6KQFmT0cJUCiajASvHdARXObiModgUg40YEmQUiUVNRGQcvIGH8U7zxubRBMHBmisgmw8RVCoZDLSQSiECmxhRgEEquH+eaigzBsWFmkaxkVEEjcYMCLYMgsgVAm6jJchQoBEpjMaM4o6DRTcw2OgoKsEZa7bYFI0ZjQ5l0E3LbK7ICB7jNuCKMzaCjWxm0URqKondvB+wm0EAlTTFw5LNlg+HCLIpSMVoCAUYQrqBImAg2+3z4DZjY8GcESkgY0DAgKJlNhtKS00QEVecpaHMaCmURMeM+zmuOJuWRDdbgm4GMWdTPDYz4IqMjWKGYjOAIriimLEYXBHAoCgGl7ktaciFxsNYc48HWbPFJuiAl01LNh+CMJWYIAAjYzYFYRoRETAEgueJBcwQEagJAK44G2MAW2ZzlbMwQctB0FJpQ2Y0zrhOzgDYiMxICboZnM1isNJBGjMWJy4Ej7iNxMrZrBzcwwZEAQNymeDgwuKGomaWBiwSNme5UMkmCJSMGdBQMgKoFA1GFFsyigIACmBirrp9HjwJYJbGoMVoBEHRKGaczQZoQIEisjEgg8aiERRQFBtBURwsGoEiRmLuKAZXzFgowZpZ1ijZRBoXzuYKGBg9zKUB0JhNURlzSVAMGjM2ii23MRhDwLBRKoyIKSI2MdnEBCQbxiaGAAzL89AORR1GkSEACoCgsWUlmw1QZrOhnM1VBmtaBkExuGIwwwaCoGUwC6yxYYpGYqMDpnTTAo0pRkujJqM40ubCzVzLxCJYc6SIqQxq6sJssdmYzSAoMlbAhrRk02gxKhkMaam0NARUgkpBwJyeh91niJagAZCxkRGQwrC5IVBSAmhh4MhGRAAAE1lcMS5BUZMNrImQFnKVjA7RSNyRCGYsEjDRJWVi44obFhAERpvBJYMioxHUbHRTdLNlC1PUHBMIkVEJZkAQVIQBYBgtQUUAQ2K3z1O9ENkUNYYoYMbGFbOBILhMy9kUV0mByMaWGSLYCMZsOYCBTU3MSLCIbHMwmzGzmUhAMKNBgo3BkSCFAQiCBgQZGwEETKQIrgjOWBwZmcKcjSUmssEYNgIyCmCKBgAYIDKYGCMAuHR6HlaVlhkwACiumDHjiggEGdlcISKLwYLcxtUQZmQjAtCy2KaysogIMWNHy1WgsoiQliCjmBLczZELkYWSEB0pNo3BZVZumLERALOSYJgxELkMA5fp8rAI6IgBISpBYMCrGUWFAAPicH6eZg9mBCNMMQMeLi0tZ6lpwMQiaAmCIibSBkixBRobVwQJhhkEGwZAsBubkZgZ9ziIwJYDUAox2HIrNkRhjIMrYIc4Y+IRgwGzGKwUJBvmVoIGaVOQlphKw8YGCkNADMQUImBiWqCDnZ4n882a2dQsSCCUDSbmCujY0qFszABQoAAIKoHIEHCFUSGLNQulm+BqJgaMZSOYARsjGyAaMw4gKJTBZToSkWzEIshIuRwpM67IiCGXCSqXgCVxG8AAARuFMIyAoBJTCbJhWloyKrL9Sc3nwXWgtARrjEU3G4ERAwGzARkpQlRaIgNSCeBgAwZzJ2i0WRM5m6ClyMhYLLY5gKIFIosEyRjZElwlpRvRTeWGolGcsc1KAEHNSBGMGbTYBJGBzZaEUQiIGDEksCkYKAAqlYwMJsg8g+elY1EUjaCRkcgAKBRRRGpEQUjMyJqRIiigKBILpSiCI0CymVEZFCnBkQU5SFSySRgDJWbkKrOBicUIk3EFZGgqEATFoGhkPEYBIzOKNVM6CpFNRgzDkEIJsqnEkJhCBAUDjTK+EQwMLIDlKbG7GQMoKoEoGtAAGxIUI4YyQwMzWooY0mgITeWMmEqQBcaIChMDI9AoBguAlmBLUEBRiSmCDRLUgCGCGUWDWbkBaiI1M4hNAYkiG2BI0CBFUCQWEDAVUQEDACoBTq9gAAYAFgxMTMBAP6W8aEBG0CgyMgIjowhqCiYbSNmAiIhsRBYBDJSgYcyADagYMKJcpVHMACimQCNISSkGYqQSbGTADRuLQU1kcbAIiow2jSwFKYoZi4yHsQhmsdliNEglxsioAGkABEwRgOjAOxgYGAgMTCwYgMCCFZDIpzT3xWwCCIxGUASNGUUkiBQNQ8xoKWZpnM2eBMEGbARXXDFjNhvBotjI5oxsZrMFFhmikRFhGgNxJLibwaASNM5YNGZsQ4ogKM4QlzlSnIgZaZzo2IBgEAAYDBQATAUCmxiAAFogaFYEEhAIHNBIBBIJSATiKTOTkCCjSBQbpAiEqDFqNqBBUjbO2FIoUEMCUWyMxDyeF3IbMIBgkQhagprIlCJDiYGDK2aJKYIANgZFsCWbBCxmiKJRzAjGtHQEjyGuzQRJQEsDBAAEIAgDBqkUAcOAwWAiEAhAAhKBRAACiYCnlhNzxmIDbDIgm8ZicUlGoggKEWG2jBQBFC0NZSUSuZri4V5iFheKmG4i3YBNNx02KRkFJBYQRIIAAnGkgEaGWBxcZgQ6ThSLkRiGiTygI3KhsAQxGdkYDcJUwBAKAzGCqVQgIyB4CoBAYgACCwASAQjkU6JbqGGCDFIUYsaM4LZpGC3FDACIwDZKEaPMgIkMyGi5ysbGQVGJiKBSkKAILokkjIMCDkZGRqqtZIigAVBAAADGYGM2pAgC2M0ZcMMgWGMpipggphIjBBhKDGSjCGhhmEY3GAgMBGBgABIJWJAYT7JtpCWSAY0xMxYbjWBLxsZsKoMWUmwJzmg5ZrsEg+KKRqNlNtd5WgwaQbDIaGEGQTGAIlIEyiC4yQMGNzxs+VBPju4Pp2hcudh6tWxLvGTiioPFDFE0bmNRgYhyw0bAHBkDUDEqiYphUzAAWyrZGCKblgpECUgEEoGBRGIAEhCoJ+3xJJvZXME0ZnOVxhlGUdQIEjmbewSRYITZaCkGUEAiACjOLmd0GEGbYxI2EIiDLYESc1AM3pCbABOpuSpwXa6ja4bEQKT2dDmEicJWuhU293zXMZccZAxi4IxGZCMFQMSAAYJkBEYlAyqMsQVExnKLgUQgAJAINFYsCAwcEU/JEC0xLdASwIbICAaLIJt7HFkEzJYCZtOSUXOVSEyx6AgyGpd8sMvHz8ssopsWGzAWZ3PhyJrBwUgBTCUoimAjGxLUBEFlohsAGBR0J9sS2GzXOG8ra8jD2hI5lwzlDqMQBhiN2bQYMZWgiNQoNhDZ3CLhVQQChUQAFjT6SbjPmEEyAsgAMIRRQA0MNs5SQzI2oNFNSgc0ZmxUgod//+lxl5VdvnQvP/J4aBiR2RQFc0o3kHLGMZUrzuYCaWTUAECwMrhiTEbLbLbEdASLU7oZQBFJZLNyuN9ss+1LvamHBXONFkMYDIFsKhVoABCDiMXFBQMBgAY0FgBAIAD1lLAVBWwUGVczAwIiggCukwoEsBhTFEo2LRcCWIiMtz796o2/fvGZ87D4YLnk2uWl+VjHWQIgkQ5ycMMi5pIgKCC4TMqOhE0kprLmoCAaS0yREiwCgyk2soErrlxnMCBXQceKARmFYrRkAwBGTIuNYhiD2QILJgAGAKAQCEBjIJ9SXojZFGBsjGzAlpqiADibmhQbCLZks2VGETQWRcYVkXz8xf3j8uFya97Ej3a8dNExaCwGYwLygEXRCAxoGMFlIgUIyAagZTZbBt0QpmVQk6WmJbAZEzTG1DDQyKYIEoZgCgWMAoAhRTYVowGDe90jkAgEAo1EITFQWDARGE/JdLFlNtAgQQbEBIvKorgAgWJTtJxN5YoZzFWCyuBC4+54lP/pzRd3uZc7PtHLOFI6IisHDygKWASFKLIhwLQUZ7PFGBSMYhMAqVGKDGiThakoGYpNi00jYhBoKcCoMDYEiLCpxECLTVAEV/3Rb89vYqCQgMZAILEiUEgsCNRTWt+CM7YEQUwBZ8zoOFITBKDU3JYrZnMvZzAFELHYMGDL/eXDOcfHe3lYHrxoHlB0BG9ixgYDFw7WDIrIPW6bAggDwZYzLhOJCbZkxCyUbFoWMSSmkk2RyKYlONiwSQmyecRdGMLAqzFFJSCQTQvA17Zf/yfzp/4FzxEYCAQACgMBGGgMFJanbOeKwKDIMGDjig3BBEHGyNlUFjEtGUzGdRIsYMb9kFGMvPH1J58cP+iIo7tsFIPbmFhcMajADdComQWumNEm6BhEGowBjRGDITUjG9ksDooiwmxktMBtXBFkSdgELdcmBkAxoGZkSzZjtmQwFePim7/OX/uz+gUEEgsSEwmYGBiYGIBGYCKfMrveiTmjYDaKYpABUEQKUXOV2RQts6lAwbQYYpHxeDKbkRPvfnd3f314+PJmxm0MBqKGGWycTQEFAARkjSAQGGMUG9KwCVoyCohpsYFITEGCNYNsgtuAB7NoMExBGtm0QExkASQGgKD+wH77l/R3fosTEolCILCiAQcAHFCAgcJAPIWtRSMjMkMTFBuVkY1soBLcLlfTMqNmS2ATXMVIdFyHjsElX/3pd4/xY3/82x/5/FcTAQRFJIDbKIiwCUAJbCogsoFXW2xG1gREZLMYkDUpRkxLNyMjt1HEjCHBFJuRyOOmAS3ZtGzJhmQwlWzIy7zxH+bn/rz+JgILEg1oQAMCgUagMJBoNKCfAgEAbFQKyIjpJqNxRcyWx8Mgm8rgMW6juAJWbpuNjA0oWiJnpOMquYyc0WC2CSITYJA1U2azJZsGyaYlsIGWbJTZbLGBI4uAIVCMuQQGxUQ2sCWDydIoZthANhCsZABhFMKo/uL2G/9Qv/Q7XLAAABIAEAAoDDQWFCAwEE/KPCtgo4gJBkGDBEFxlmI2wQxmS1EEsJixQZhKUEPg7NjOf/vU55/ffGyfnHm3HK+m8XgmA1JmwGBxE4NpzGgpBt0UiQwS1AQVgEQ3EWgYg4YRQDHYyObAEBmFEA1oyaaIIQUT6Qhe1hv/bn7hp/UVNBYUAo0AQCMAjcAANAIDAIFGPuWsu0bAAAGjI7BpZBQ1iyKblhmwYQA0bJQFwBWz1Jjn5V/9j5//+6VffH75Jvz64xzH/sToex62T1z1x4+9mnn/0cfXhjIDApERkLMJSLAmxYYEQcMQMxYwKDIaEFwxgyFFRuQMIDUHiyADMoIKA4IUiS9v/qn+ya/wLxBIQAISAJAASEDCq+hX4Kn3sy0LEGBsQMDGDAiCg6IFZnPhyBWBzRYAWASLcCv/bG5f/bvvX94AgJ/6uHZMrGgc0Oi/2vndv9A+9ZNn/pz+6txefsjnH3jvje8/c7M4KCIBzGBaZqNkE2lkBAVAEUOCAhhyTKUBNTEBHAQtj2CKAhoZzEudfjVX/0B+h4ZvKgIA8aSf/u02sRczgkrLRk3G4IotBArCZGy5bS6BYnAFFBtnVHf4tdqXf+F5extexcDAAhhoBA4f7PI1PvUm7nz4t3iOQGD847zvZ9tHP93e416vfobXxvnQQ33qYJBNoQQBZAQQQAEBBAUEZHBGcQQOiowGAIEYks3W/P36N/+Mt/7L/HzwBhckAoVAA6ARr6BfQaDhI9FPgWzbWTY6ggDi0lhADFPA2cwoWoILQTYt2bRklE1+5Z5f/OwvtzfhdSyAxsCCxMSK9Wb+b32qeLD8DV3QSDQGIHCFw1/ngx/nP1xnfrbjx5dPxNu33/sT9tIn69XvnVcQDGFIEGRAQ8yAQREMAGCg1EDBQNH4UH/4r/mlX+b3/jJ/GmBZcADM11BoQAMC0AhAABoAjYAnyy0AvMIUM1ogGMAWssFUstmSzcZZNufl39GXf+H55RvwkViQaCxYsKOQCPSlU3Dwno6f5xY7AvAAcIXAwxuv/AR/ZfnInVcuHg//9wv8zkVh/yTzZ+3Vv1Tv/0xe/sHtPZ/ie76PVz/Ou8+MRjEACILilaASM4O5j3sxmvr8fO0f8cuf4x7HcgNwsWFFYALqFQA0dgAkoOFVNKCeViqWpE1uNm64AInc2VK5bR4P2bSczSxtrnKGktlqv/4yf/+Xfrlh4HUMDOwINKCRGFgwcT627LgQBRZcoXCNxAEDR1zf6d/kV3CDAwqJicIVCrAjEBioB/Jv2B/7yXr4o/bRH+EDn553f08efpoPDtewMhvYMhshMioZH+Sbv3J99V/yHixYcfVoV+/o5+GRHSsaR0zAjsaCQiAQaKwASASg0QCAfhKeRK/UBNvMUgSwGBRn8+LkjYvoINdh7kxZ2y7+9ZvzD//Wrzcu8CoGIAA7FkwsaFxwRKMwcX3p6cnR+B5exoJE4gaNgQcYOOAKZwwUEis2LDiicEEiMbChcEThggWQmF/hjT/N8lfsu34iH/hMXvmBef8fsw9/Mt+dJbDZ1H/d/v0vr/+Cn8EPowDzB/S5IPhBPoYrFGBDolE4IxFoDAwEINAAgEag4ekhbCL3EszmiiDI2EhUZlNZk4C5c52rsvOrq3/wi8+bl4BXsaAxccSOwoqJQOCCgYnAgkJM9FLzQo3AAdc4onGNxIIVAw9wDTij8BATC3ZAYgBWbJg4otFYsaNw/g1e/Ge9/dvzxhd1+0X+3/fN93+ZL/xMx8+s//5Fvv57vPWbeg1/ETfY0Th/lr/xgs8+QBz+3M/x0/+G/4TGEXBGYcFEINBINBID0EgUAgGIp20en/UujpZc9nDuXCVomU2x5khNy4ylkn+521f/3vM3DABgYGJBYQB2rJgASDQGoFDYsGK/Zj1YecE1XsbAwBGJAw4YSEDjgiu8jMIVTrjGBY2BHQckNizYsQKgsCGx4oAd9zicbDv+0y6/5jz7kr5h3odXcYMXuEJihI99BR/HDV/h+Ck+gUBioAAHTGxYMJAYCEzAxEAiUCjAfFqWbVpud3pwaWGA2S7njlgMZmbt147+0d98/wpex0BjwcTEQKBROGCiMLDhgEYjEOi/yHt/l1fejx0/zs/+W34TD3DAxCNsWABHNBrXgMSKxgVwgw0NGDjiBEhMAARgQeEMCPQ1/QDmrjs8BDzCd/AQgSv0l9lfmBU4+ANWPMIZE2csKCSuUCg0YMeCBjQmYCIBgXoSexa9VBTQgNtYbMwoADP89ov6u5993qwBAAwABAqBiQUbEtBoNBJn3GCikNhx/HGu3+I3/r353mXwFj/31/iz/5GvI/AICx7igEbjETZcYcNAozFxRGPDA5wwcAasSBQCC2BDYsNA4IDD4XKBYMcRiRNuMLHhFg9/lX/8Jf3qG7wvXO48/ypfRyIRSAQGNgw0Gg0ITBQagUAhsCOxw5MjNUFGMbgi4zqcMXd6qovfir7y8+83NvAqBi44AhqNRgIGLggcAP0qJhYEDqiPcfMl8zF5y7wvn8PhI/gQCoEdhQMSjRUDEwCBwo4VEwsagcKCEx7ihEQjcMYBhYkbBAq59ITxJuMFCZjYMLFg4BbjK/wuGmfAjgs2BAILJo7YUQgMTBQmAHYA7GhMNPpJ7IJDJbGAM654uGS8fPjaxd/67POrGngdC3asOGNgYgBWTFxwxASccURjYMeCwsCK+jyXN+v8Q9vx3fI9I/T/pnCFCwoXDFwQGLgDNOAMSBQChQdonNC4QaGxY0UDCgsmVmzYccEYrjuKOwOFEx6gAQMbXuCIicLEhsLEBgBInAE7dsAEnBEITOwo7JgI7JhPKhUSas6ysRiq+rfJV37+eWPA6xiY2HFAYMdAYgPsSAwATAQ2XGECCg+w4wLv0v99/vL364Of4L2PxNf4/+/xGGcUjrjgAQo7brBhxYoNOwJXKBQSKxoH7IBCYsHEgh2NFUeccMEBR9zKmlEMtTQGzkgETliReIYVhR2NRiMBjcI9Egt2NDZMNBobChMbCoWJHY1+Ei50OJurtMl0+Frziz//vLkAr2Mg0BgoFM444oIViUDgggPusKBwxBkTV2gs2FA4ovHiXZ6/zx88zrdwhY+gASvOWHBCIPEcB1wQWBAITDR2BFYsuKBxwILCROCAHQBnPEIjcMF8cx6+QPCSp7gCNA4IBM6AFYULGhOw44ALJk5oFCZ2nJGYuOCEgQs2NBoXwPwmhLvyoCZL8x/Ll//O+1cGvI4FsCNQCAzsWFEIbGjAjisUGonGhisccI8VOxbAhonAQKFxixUHFHaseI5rNCauELjDNe4RWLBhxxUm4IAzCisKV4AdA4nCisIZMHAM8Rl+4EuAH+ajv8//RiBxxgETgYkLJu4RGLjHgjtsmGhcADs2NE7YsQHOgEJhorEj0JhPqv3X6JXRO5y//nPvv4HXMQAwARBINBoQKDQKB2xYsWHDNe5xQGLgDg9xjxUbDrjHERcUEo0DThhYccGKxHMcEHiGBYnHuEajcUACEo0VsGPBRKFwhQUTAzsOCATuUH+fL//z+KMjeJfP/G0+/K/4LVzwACfc4DkmNuwYmLjHCQMTgQ0NKJyxY0NjQ6OwY0PjgsIENCY8+ad/+/rL7J/6AnwkBgoJKCQSjQkIFBqBwoIzDtgQSAQKgRVnXGFHYMOKe6zYsKLxHC9hR2LFLRKFIyZWNCYOCARuMTCROAAKhUQiMbBjQWBFAxo7DpgYeITt2Pfel0+geBuf5pPv8H8QeIHEMzzHRGMg8RyJDQnYcEZiR6EBGwqFHTsKOyZgojHRqKd9XQwEzlhRaCRgAgagMbAjkDjjgAsGFkw0rgEbEhMTBzROOKAxAXDAPXasOKERCNwiARNH3AIWwMAANK5wRiCQSNzgHgMbjigMJBLPcY0VL3DzjuqeBOPCA3c44h4bdiwI7EjcItG4oHHCRKBxQiBQOKNwARQKBZhoFBowMbB9UzAwMQATCyYShUQjMFFITMARG3asKKzY0TigMNEYCBTggkAiEdiw4BZHTDzACxQWNBKJwMDECRMHvMAKgBWNQGBiRWMFQGNBY8cD7GgMFO5xjf41++d/av3gjVeX53j633gbP4PEQCIAgcYFKwobEhc0Gjug0Gg0LoBC4YLAhsYGCEwEduQ3AwOFgcKOBdCYWFAY2JGARmJiInDAjkDjgEJhQaERaOxoJAJwxo4rbLjBCQN3OCJxQqIAA4UDoDAAsKDQOCABE41AYMWKCxIbjoAEBGBiw+V/6X+9x/+48yYWvAs/io/gERYUjmhMLNhwwY4LEhOwITDRgMKGQmPHBtjQAGjsCBRgPgkDjQEIJAorEo3GQKKxIwCNQKMRgInEigWQgIGBwERgxY5E4AHOmAgMNCDQaEDhiB0DEysajUJgQWGgUVgwUIAjzlgAV7jHisZAI1ForNiwYcWGFRMDMNHYUIAVJwQGdhyw4YIFExsSOwI7BnYUoDARKAQKjUQhECgE4ilYMLEiAAOJgUAjMFAoNBZMwMAENGCgsGDFhiMArgATsAACjUKiEEg0GhMAA4VAoAEDBWgMwI6BRCNRgAWBBRsSiUAjkCjAwERixxU2bBgINAqNCxIHXBAYmLhgwYYFGzYMrNixI9EowAaAQiEAjUIgECgEGp6KgUAiMF5BojFQCCQgMNFINBoFWLBgoJGYWDGwYkcABiYWFAKNQiEQgEajMQAQmAgEGolGIwANSBQGGgFITKyARgACjUZjRWBHYMcROwIFKBQSOxoHbIDGwAVHFHZMDDR2BBoNKOwIQKPRCEAjANCARnwjGGisSCQSjQUTCQgEEhOBQKABECgECgdAYAEMLABITKyYWFBoNBqQKAzsCBQChUSjEQBoFBKJABQajUQDBiYSE4nGgh0BSEAi0BjYEQBoNCCxI9FIwMSOgUBjIhFIXJC4YMGORqARmGgUEgWAQCPQgEagEPANYmBiRSPQSAwEAgloDEChANCARgAWwECiccCOgQDAQKLRaCQaGxIHnDAAhUIgAJCYCDSgAYFAIVBINACg0UgUEoVAIDCxYCJRSBQO2NEorGg0oAALdiQGNjQahUAAJgYmGhBoTCQmIDEBEGgAbFjQCDQSBYiPwkBiIBAYaCQSkAgEABI7BgqNiUaiACsaiYHCggQ0DkhsAJhYEJgIBHYsKExAABoQgAYkYAIaAYAAFBqJiUQDoNEYKCSgUQgEFpyxABqJHYEEQCGwIxCAAAQmJhbsSDSgAAsmGg2ARqAB0EgUACAADV8XAxBIBAqQCAQKCWgUAjugkCgkYEFiwQAMQCDRSDRgx4oCBGDHATugAdBITARgIpCvYcdAwStoNAIFaECiAY0CQAICDWgECgsmGolCAwYagYkENCCwY6CRmGgEoAGFAEADAg0fjQkYgIkBmK9hASQCEK8DAtBINBoDUCgABFY0AoEd14BGIFGABY0JaAwUGo1AAxoAjQYEABoQgEKi0QhAoRFIFGAiAQ0INAKNAiSg0Qg0EgWAQGOg0WhAI1FoDBQC0Ag0AKAAAIFGAHZ4HQMTXsXABIzXMAAJaMBAINAASOwINAoDhYlGIrAgEVgAjQWJQiDQCDQGGrAhAIVEY2KgMTHQAGg0BhqFADQCgcZEAAKNADQgMNFINBKFABQg0AhAAwKNRgAagUAh0PCRaHgdEzAwATAwMTABA/Mb+LoYCEwkAgkoBAoJaBQWNBpQCDQgkQg0Go0CBBZsGEg0ABqJiUKiUYBCAgINCDQaAIGCVxFoNKCQAGg0BgqNRKMRgAZAoOF1NAACDa8isGMgsL8GgIEJz4wBCCQGCgABSDQKADsahQYkEoHCQCExsGMBLGg0oBAoDEBhYqDRaAA0oBHwKgoBAGhAoAEADYAAQCOxYQAC0ACYGIAJGJiAgQkAGJjwkRiYH/HsGJhITCQaDYBGowGBRqAxMRAIFBIQCDQagUCjEWgkoDERKCSgUQg0oAGBRqABMAEAAzCxYIePxsCE75SYgAYUAoFGILAjEWg0GtBIDDQSDRhoAECjUQg0Ag0AKAQaE757YmAiMBGAQKABE43GABQGGgCJRgMAGoGJxIaBwA7fZdGABgzsaBQaDYABCAQaOwKJAmwIABQCGwZgAgbmd5nXEWgAwEADEhOFwMSCiUCikYCJwETBHwIxMDEwMQATMAAw4bs7BiZgYML/9yIA\"\n  };\n  var PART_THUMB_META = {\n    \"cabinet\": { \"label\": \"Cabinet\", \"alt\": \"A base cabinet with one door\", \"size\": 144 },\n    \"drawer\": { \"label\": \"Drawer\", \"alt\": \"A drawer box with its front, pulled open, in a base cabinet\", \"size\": 144 },\n    \"shelf\": { \"label\": \"Shelf\", \"alt\": \"Two adjustable shelves inside an open base cabinet\", \"size\": 144 },\n    \"vdivider\": { \"label\": \"Vertical divider\", \"alt\": \"A vertical divider splitting an open base cabinet into two\", \"size\": 144 },\n    \"hdivider\": { \"label\": \"Horizontal divider\", \"alt\": \"A fixed horizontal divider across an open base cabinet\", \"size\": 144 },\n    \"endpanel\": { \"label\": \"End panel\", \"alt\": \"A finished end panel down to the floor on the right of a base cabinet\", \"size\": 144 },\n    \"door\": { \"label\": \"Door\", \"alt\": \"A base cabinet door, opened on its hinges\", \"size\": 144 }\n  };\n  function partThumbImg(id, o) {\n    const src = PART_THUMBS[id];\n    if (!src) return \"\";\n    const px = o && o.size || 56, alt = o && o.alt ? PART_THUMB_META[id].alt : \"\";\n    return '<img class=\"ub-lab__partthumb\" data-ub-partthumb=\"' + id + '\" src=\"' + src + '\" alt=\"' + alt.replace(/\"/g, \"&quot;\") + '\" width=\"' + px + '\" height=\"' + px + '\" decoding=\"async\" draggable=\"false\">';\n  }\n\n  // v2/src/ui/strip-art.js\n  var W = 600;\n  var H = 720;\n  var D = 560;\n  var T2 = 18;\n  var LEG2 = 100;\n  var K = 0.5;\n  var CA = Math.cos(Math.PI / 6);\n  var SA = Math.sin(Math.PI / 6);\n  var P = (x, y, z) => [x + z * K * CA, -y - z * K * SA];\n  function boxFaces(b) {\n    const [x0, x1, y0, y1, z0, z1] = b;\n    return [\n      [P(x0, y0, z0), P(x1, y0, z0), P(x1, y1, z0), P(x0, y1, z0)],\n      // front\n      [P(x0, y1, z0), P(x1, y1, z0), P(x1, y1, z1), P(x0, y1, z1)],\n      // top\n      [P(x1, y0, z0), P(x1, y0, z1), P(x1, y1, z1), P(x1, y1, z0)]\n      // right side\n    ];\n  }\n  var path = (pts) => \"M\" + pts.map((p) => p[0].toFixed(1) + \" \" + p[1].toFixed(1)).join(\"L\") + \"Z\";\n  function carcass(y0 = 0) {\n    return [\n      [0, W, y0, y0 + H, D - T2, D],\n      // back\n      [0, T2, y0, y0 + H, 0, D],\n      // left side\n      [0, W, y0, y0 + T2, 0, D],\n      // bottom\n      [0, W, y0 + H - T2, y0 + H, 0, D],\n      // top\n      [W - T2, W, y0, y0 + H, 0, D]\n      // right side\n    ];\n  }\n  function svg(plain2, hot, extra) {\n    const all = plain2.concat(hot);\n    let xs = [], ys = [];\n    for (const b of all) for (const f of boxFaces(b)) for (const p of f) {\n      xs.push(p[0]);\n      ys.push(p[1]);\n    }\n    if (extra) for (const p of extra.pts || []) {\n      xs.push(p[0]);\n      ys.push(p[1]);\n    }\n    const x0 = Math.min(...xs), x1 = Math.max(...xs), y0 = Math.min(...ys), y1 = Math.max(...ys);\n    const pad = 14, w = x1 - x0 + 2 * pad, h = y1 - y0 + 2 * pad, s = Math.max(w, h);\n    const vb = [(x0 + x1) / 2 - s / 2, (y0 + y1) / 2 - s / 2, s, s].map((v) => v.toFixed(0)).join(\" \");\n    const sw = (s / 24 * 1.15).toFixed(1);\n    const faces = (b, cls) => boxFaces(b).map((f, i) => '<path class=\"' + cls + (i === 0 ? \" f\" : i === 1 ? \" t\" : \" r\") + '\" d=\"' + path(f) + '\"/>').join(\"\");\n    return '<svg class=\"ub-lab__art\" viewBox=\"' + vb + '\" aria-hidden=\"true\" focusable=\"false\" stroke-width=\"' + sw + '\" stroke-linejoin=\"round\">' + plain2.map((b) => faces(b, \"ub-art__b\")).join(\"\") + hot.map((b) => faces(b, \"ub-art__hot\")).join(\"\") + (extra && extra.svg ? extra.svg : \"\") + \"</svg>\";\n  }\n  var icon = (d, extra) => '<svg class=\"ub-lab__art ub-lab__art--icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' + d + (extra || \"\") + \"</svg>\";\n  var ART = {\n    shelf: () => svg(carcass(), [[T2, W - T2, 330, 330 + T2, 20, D - T2]]),\n    hdivider: () => svg(carcass(), [[T2, W - T2, 330, 330 + T2, 0, D - T2]]),\n    vdivider: () => svg(carcass(), [[(W - T2) / 2, (W + T2) / 2, T2, H - T2, 0, D - T2]]),\n    /* a drawer pulled 240 mm out: its box (sides, back, base) behind the front */\n    drawer: () => svg(carcass(), [\n      [T2 + 12, T2 + 24, 440, 600, -240, 420],\n      // left box side\n      [T2 + 12, W - T2 - 12, 440, 452, -240, 420],\n      // base\n      [T2 + 12, W - T2 - 12, 440, 600, 408, 420],\n      // back\n      [W - T2 - 24, W - T2 - 12, 440, 600, -240, 420],\n      // right box side\n      [T2 - 2, W - T2 + 2, 430, 640, -258, -240]\n      // the front\n    ]),\n    /* the interior drawer: the box alone, inside the carcass */\n    interior: () => svg(carcass(), [\n      [T2 + 12, T2 + 24, 300, 440, 30, 520],\n      [T2 + 12, W - T2 - 12, 300, 312, 30, 520],\n      [T2 + 12, W - T2 - 12, 300, 440, 508, 520],\n      [W - T2 - 24, W - T2 - 12, 300, 440, 30, 520],\n      [T2 + 12, W - T2 - 12, 300, 440, 30, 42]\n    ]),\n    /* end panels: the carcass on its legs (legs drawn as short posts), the panel against one side */\n    endL: (floor = true) => svg(legs().concat(carcass(LEG2)), [[-T2, 0, floor ? 0 : LEG2, LEG2 + H, 0, D]]),\n    endR: (floor = true) => svg(legs().concat(carcass(LEG2)), [[W, W + T2, floor ? 0 : LEG2, LEG2 + H, 0, D]]),\n    endAll: () => svg(legs().concat(carcass(LEG2), legs(W), carcass(LEG2).map(shiftX(W))), [[-T2, 0, 0, LEG2 + H, 0, D], [2 * W, 2 * W + T2, 0, LEG2 + H, 0, D]]),\n    /* a door (the front) on its carcass, and the same door swung open */\n    door: () => svg(carcass(), [[0, W, 0, H, -T2, 0]]),\n    doorOpen: () => svg(carcass(), [[-T2, 0, 0, H, -W * 0.7, 0]]),\n    doorRemove: () => svg(carcass(), [], { svg: \"\" }),\n    /* actions */\n    select: () => icon('<path d=\"M5 3l12 8-5.2 1.2L14.6 18l-2.4 1.1-2.8-5.8L5 17z\"/>'),\n    done: () => icon('<path d=\"M4.5 12.5l4.6 4.6L19.5 6.7\"/>'),\n    remove: () => icon('<path d=\"M4 7h16M9.5 7V4.5h5V7M6.5 7l1 12.5h9l1-12.5M10 10.5v6M14 10.5v6\"/>'),\n    width: () => icon('<path d=\"M3.5 12h17M6.5 9l-3 3 3 3M17.5 9l3 3-3 3\"/>'),\n    depth: () => icon('<path d=\"M5 19L19 5M5 13v6h6M13 5h6v6\"/>'),\n    height: () => icon('<path d=\"M12 3.5v17M9 6.5l3-3 3 3M9 17.5l3 3 3-3\"/>'),\n    addDoor: () => icon('<path d=\"M6 20.5V3.5l7 1.5v17L6 20.5z\"/><path d=\"M13 5c4 .6 6.4 3.6 6.5 7.5\" stroke-dasharray=\"1.6 1.8\"/><path d=\"M4 20.5h16\"/>'),\n    addWindow: () => icon('<rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\"/><path d=\"M12 4v16M4 12h16\"/>'),\n    wall: () => icon('<rect x=\"5\" y=\"4\" width=\"14\" height=\"16\" rx=\"1.5\" class=\"ub-art__swatch\" data-ub-artswatch=\"wall\"/>'),\n    floor: () => icon('<rect x=\"5\" y=\"4\" width=\"14\" height=\"16\" rx=\"1.5\" class=\"ub-art__swatch\" data-ub-artswatch=\"floor\"/>'),\n    matFronts: () => svg(carcass(), [[0, W, 0, H, -T2, 0]]),\n    matCarcass: () => svg([], carcass())\n  };\n  function legs(x = 0) {\n    return [[40, 70, 0, LEG2, 40, 70], [W - 70, W - 40, 0, LEG2, 40, 70]].map(shiftX(x));\n  }\n  function shiftX(dx) {\n    return (b) => [b[0] + dx, b[1] + dx, b[2], b[3], b[4], b[5]];\n  }\n  var hexCss = (h) => \"#\" + (h >>> 0).toString(16).padStart(6, \"0\").slice(-6);\n  var MAP = [\n    ['[data-ub-itoolbar] [data-ub-itool=\"select\"]', \"icon:select-part\"],\n    ['[data-ub-itoolbar] [data-ub-itool=\"shelf\"]', \"thumb:shelf\"],\n    ['[data-ub-itoolbar] [data-ub-itool=\"divider\"]', \"thumb:vdivider\"],\n    ['[data-ub-itoolbar] [data-ub-itool=\"hdivider\"]', \"thumb:hdivider\"],\n    [\"[data-ub-itoolbar] [data-ub-itoolremove]\", \"icon:remove\"],\n    ['[data-ub-itoolbar] [data-ub-itool=\"off\"]', \"icon:done\"],\n    [\"[data-ub-dadd]\", \"thumb:drawer\"],\n    [\"[data-ub-ddrag]\", \"interior\", true],\n    // the box alone - no rendered preview of an interior drawer; replaces its old line icon\n    [\"[data-ub-draweropen]\", \"icon:drawer-open\"],\n    [\"[data-ub-dopen1]\", \"icon:drawer-open\"],\n    [\"[data-ub-ddoorbtn]\", \"thumb:door\"],\n    [\"[data-ub-ddoorfull]\", \"thumb:door\"],\n    ['[data-ub-fend=\"L\"]', \"thumb:endpanel:mirror\"],\n    ['[data-ub-fend=\"R\"]', \"thumb:endpanel\"],\n    ['[data-ub-fdrop=\"1\"]', \"thumb:endpanel\"],\n    ['[data-ub-fdrop=\"0\"]', \"endLshort\"],\n    ['[data-ub-fmat=\"fronts\"]', \"matFronts\"],\n    ['[data-ub-fmat=\"carcass\"]', \"matCarcass\"],\n    [\"[data-ub-fall]\", \"endAll\"],\n    ['[data-ub-roomadd=\"door\"]', \"icon:add-door\"],\n    ['[data-ub-roomadd=\"window\"]', \"icon:add-window\"],\n    ['[data-ub-roomtab=\"walls\"]', \"wall\"],\n    ['[data-ub-roomtab=\"floor\"]', \"floor\"],\n    ['[data-ub-roomtab=\"openings\"]', \"addWindow\"]\n  ];\n  ART.endLshort = () => ART.endL(false);\n  function createStripArt(ctx) {\n    const root = ctx.root;\n    if (!root || !root.querySelectorAll) return { sync() {\n    }, frame() {\n    } };\n    try {\n      paint();\n    } catch {\n    }\n    function paint() {\n      try {\n        const wt = root.querySelector('[data-ub-flyout=\"worktop\"]'), ctl = wt && wt.querySelector(\".ub-lab__wtctl\");\n        if (ctl && ctl.parentNode !== wt && wt.appendChild) {\n          ctl.classList.add(\"ub-lab__wtctl--row\");\n          wt.appendChild(ctl);\n        }\n        const info = wt && wt.querySelector(\".ub-lab__wtinfo\"), big = wt && wt.querySelector(\"[data-ub-wtlarge]\");\n        if (info && big) {\n          const txt = [...info.children].map((e) => (e.textContent || \"\").trim()).filter(Boolean).join(\" \\xB7 \");\n          const t = \"View the decor large - \" + txt;\n          if (txt && big.getAttribute(\"title\") !== t) {\n            big.setAttribute(\"title\", t);\n            big.setAttribute(\"aria-label\", t);\n          }\n        }\n      } catch {\n      }\n      const pic = (key) => {\n        if (key.startsWith(\"thumb:\")) {\n          const [, id, m] = key.split(\":\");\n          const h = partThumbImg(id, { size: 30 });\n          return m === \"mirror\" ? h.replace('class=\"ub-lab__partthumb\"', 'class=\"ub-lab__partthumb ub-lab__partthumb--mirror\"') : h;\n        }\n        if (key.startsWith(\"icon:\")) return iconSvg(key.slice(5));\n        return ART[key] ? ART[key]() : \"\";\n      };\n      const has = (b) => b.querySelector(\".ub-lab__art, .ub-lab__partthumb, .ub-lab__sicon\");\n      for (const [sel, key, replace] of MAP) {\n        for (const b of root.querySelectorAll(sel)) {\n          if (!b || !b.insertAdjacentHTML || !b.querySelector || has(b)) continue;\n          const h = pic(key);\n          if (!h) continue;\n          if (replace || key.startsWith(\"icon:\")) {\n            const old = b.querySelector(\"svg\");\n            if (old) old.remove();\n          }\n          b.insertAdjacentHTML(\"afterbegin\", h);\n          b.classList.add(\"ub-lab__artbtn\");\n        }\n      }\n      for (const sel of Object.keys(ICON_FOR_CONTROL)) {\n        for (const b of root.querySelectorAll(sel)) {\n          if (!b || !b.insertAdjacentHTML || !b.querySelector || has(b)) continue;\n          const h = iconSvg(ICON_FOR_CONTROL[sel]);\n          if (!h) continue;\n          const old = b.querySelector(\"svg\");\n          if (old) old.remove();\n          b.insertAdjacentHTML(\"afterbegin\", h);\n        }\n      }\n      for (const [sel, id] of [[\"[data-ub-settings]\", \"settings\"]]) {\n        for (const b of root.querySelectorAll(sel)) {\n          if (!b || !b.insertAdjacentHTML || !b.querySelector || b.getAttribute(\"data-ub-sicon\") === id) continue;\n          const h = iconSvg(id);\n          if (!h) continue;\n          const old = b.querySelector(\"svg\");\n          if (old) old.remove();\n          b.insertAdjacentHTML(\"afterbegin\", h);\n          b.setAttribute(\"data-ub-sicon\", id);\n        }\n      }\n      for (const [id, key] of [[\"ub-room-w\", \"width\"], [\"ub-room-d\", \"depth\"], [\"ub-room-h\", \"height\"]]) {\n        const lab = root.querySelector('label[for=\"' + id + '\"]');\n        if (lab && lab.insertAdjacentHTML && !lab.querySelector(\".ub-lab__art, .ub-lab__sicon\")) lab.insertAdjacentHTML(\"afterbegin\", iconSvg(key) || ART[key]());\n      }\n    }\n    const sw = (k) => root.querySelector('[data-ub-artswatch=\"' + k + '\"]');\n    function sync() {\n      try {\n        paint();\n        const s = ctx.scene ? ctx.scene() : null, room = s && s.room || null;\n        const w = hexCss(wallColourOf(room).hex), f = hexCss(floorColourOf(room).hex), a = sw(\"wall\"), b = sw(\"floor\");\n        if (a && a.getAttribute(\"fill\") !== w) a.setAttribute(\"fill\", w);\n        if (b && b.getAttribute(\"fill\") !== f) b.setAttribute(\"fill\", f);\n      } catch {\n      }\n    }\n    return { sync, frame: sync };\n  }\n\n  // v2/src/ui/qa-menus.js\n  function createQaMenus(ctx) {\n    const root = ctx.root, doc2 = root && root.ownerDocument, win2 = doc2 && doc2.defaultView;\n    const none = { sync() {\n    }, frame() {\n    } };\n    let which = null;\n    try {\n      const loc = win2 && win2.location;\n      if (!loc || !/(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\")) return none;\n      const m = /[?&]qa_menus=(top|side|fronts|cabinets|inside|drawers|finishing|worktop|room|settings|roomside|roomclose|roomfront|corner-bl|corner-br|corner-fl|corner-fr|roomdrag|art|matprice-doors|matprice|dragmid|dragdrop|dragcancel|showplay|showstop|showopen|showeve|evening|matundo|badges|plusadd|dragall|selectors|finrow|cornerlook|tape|place)\\b/.exec(loc.search || \"\");\n      if (!m) return none;\n      which = m[1];\n      win2.setTimeout(run, 1800);\n    } catch {\n      return none;\n    }\n    const alpha = (c) => {\n      const m = /rgba?\\(([^)]+)\\)/.exec(c || \"\");\n      if (!m) return 0;\n      const p = m[1].split(\",\").map(Number);\n      return p.length === 4 ? p[3] : 1;\n    };\n    const vis = (e) => !!(e && e.offsetParent && !e.hidden && e.getBoundingClientRect().width > 0);\n    const TILES = \"button, .ub-lab__trayitem, .ub-lab__tool, .ub-lab__eye, [role=option], [data-ub-kmat]\";\n    function measure(sel) {\n      const cv = root.querySelector(\".ub-lab__canvas\").getBoundingClientRect(), area = cv.width * cv.height;\n      return [...root.querySelectorAll(sel)].filter(vis).map((e) => {\n        const r = e.getBoundingClientRect(), cs = win2.getComputedStyle(e);\n        const tiles = [...e.querySelectorAll(TILES)].filter(vis).concat(e.matches(TILES) ? [e] : []);\n        const tb = tiles.map((t) => t.getBoundingClientRect());\n        const name2 = e.getAttribute(\"aria-label\") || e.getAttribute(\"data-ub-flyout\") || e.className && String(e.className).split(\" \").slice(-1)[0] || e.tagName;\n        let blank = 0, pass = 0;\n        const canvasEl = root.querySelector(\".ub-lab__canvas canvas\") || root.querySelector(\"canvas\");\n        for (let i = 0; i < 24; i++) for (let j = 0; j < 4; j++) {\n          const x = r.left + (i + 0.5) * r.width / 24, y = r.top + (j + 0.5) * r.height / 4, hit2 = doc2.elementFromPoint(x, y);\n          if (!hit2 || hit2.closest(TILES + \", label, summary, input, .ub-lab__optlabel, .ub-lab__doorhint, .ub-lab__addmodenote, .ub-lab__itooltext, [data-ub-qamenus]\")) continue;\n          blank++;\n          if (hit2 === canvasEl || hit2.tagName === \"CANVAS\") pass++;\n        }\n        return {\n          name: String(name2).slice(0, 28),\n          h: Math.round(r.height),\n          w: Math.round(r.width),\n          gap: Math.round(cv.bottom - r.bottom),\n          blank,\n          pass,\n          top: Math.round(r.top - cv.top),\n          bg: +alpha(cs.backgroundColor).toFixed(2),\n          shadow: cs.boxShadow !== \"none\",\n          cover: +(100 * r.width * r.height / area).toFixed(1),\n          tiles: tiles.length,\n          hit: tb.length ? Math.round(Math.min(...tb.map((b) => Math.min(b.width, b.height)))) : null,\n          tileBg: tiles.length ? +Math.max(...tiles.map((t) => alpha(win2.getComputedStyle(t).backgroundColor))).toFixed(2) : null\n        };\n      });\n    }\n    const SEL5 = {\n      top: \".ub-lab__dock--top > .ub-lab__toolgrp, .ub-lab__dock--top > .ub-lab__eye\",\n      side: \".ub-lab__dock--left > .ub-lab__toolgrp, .ub-lab__dock--right > .ub-lab__toolgrp, .ub-lab__dock--right > *:not(.ub-lab__toolgrp)\",\n      fronts: '[data-ub-flyout=\"fronts\"]',\n      cabinets: '[data-ub-flyout=\"cabinets\"]',\n      inside: \"[data-ub-itoolbar]\",\n      drawers: '[data-ub-flyout=\"drawers\"]',\n      finishing: '[data-ub-flyout=\"finishing\"]',\n      room: '[data-ub-flyout=\"room\"]',\n      settings: \"[data-ub-kmatpop]\",\n      worktop: '[data-ub-flyout=\"worktop\"]'\n    };\n    const ROOMCAM = {\n      roomside: [1.25, 0.12, 1],\n      roomclose: [0.5, 0.3, 0.45],\n      roomfront: [0.02, 0.08, 1],\n      \"corner-bl\": [-0.75, 0.14, 0.75],\n      \"corner-br\": [0.75, 0.14, 0.75],\n      \"corner-fl\": [-2.39, 0.14, 0.75],\n      \"corner-fr\": [2.39, 0.14, 0.75]\n    };\n    const wallPick = /[?&]qa_wall=([a-z-]+)/.exec(win2 && win2.location && win2.location.search || \"\");\n    function roomDrag() {\n      const L = root, ia = L.__ubProj.__v2.interaction(), s = ia.scene;\n      s.units.splice(1);\n      const u = s.units[0];\n      Object.assign(u, { type: \"base\", family: \"base\", doors: 2, door: true, w: 800, h: 720, d: 560, x: 0, z: 0, rot: 0, y: 0, run: \"main\" });\n      s.selectedId = u.id;\n      s.room = Object.assign({}, s.room, { on: true, width: 4e3, depth: 3200, openings: [{ id: \"D1\", kind: \"door\", wall: \"back\", x: 1500, w: 838, h: 2040, y: 0 }] });\n      ia.setMode(\"cabinet\");\n      ia.ctx.syncControls();\n      ia.ctx.refresh();\n      L.__ubProj.setCam(0.15, 0.3);\n      ia.view.fitKitchen(true);\n      L.__ubProj.render();\n      if (/[?&]qa_pick=1/.test(win2.location.search)) win2.setTimeout(() => {\n        const b = doc2.querySelector('[data-ub-pick=\"' + u.id + '\"]');\n        if (b) b.click();\n      }, 300);\n      win2.setTimeout(() => {\n        const I = L.__ubProj.__v2.renderer().inspect();\n        I.camera.updateMatrixWorld();\n        const r = L.querySelector(\".ub-lab__canvas\").getBoundingClientRect();\n        const scr = (q) => {\n          const v = new I.THREE.Vector3(q[0], q[1], q[2]).project(I.camera);\n          return [Math.round(r.left + (v.x + 1) / 2 * r.width), Math.round(r.top + (1 - v.y) / 2 * r.height)];\n        };\n        const from = scr([400, 500, 560]), to = scr([2400, 500, 560]);\n        const nm = (e) => !e ? \"-\" : e.tagName === \"CANVAS\" ? \"CANVAS\" : (e.getAttribute(\"data-ub-fly\") || e.getAttribute(\"aria-label\") || String(e.className && e.className.baseVal !== void 0 ? e.className.baseVal : e.className)).slice(0, 26);\n        const path2 = [];\n        for (let i = 0; i <= 16; i++) {\n          const x = from[0] + (to[0] - from[0]) * i / 16, y = from[1] + (to[1] - from[1]) * i / 16;\n          path2.push(nm(doc2.elementFromPoint(x, y)));\n        }\n        const open = [...L.querySelectorAll(\".ub-lab__flyout, .ub-lab__itool, .ub-lab__kmatpop\")].filter((n) => !n.hidden && n.offsetParent).map((n) => n.getAttribute(\"data-ub-flyout\") || n.className.split(\" \").slice(-1)[0]);\n        const box3 = doc2.createElement(\"pre\");\n        box3.setAttribute(\"data-ub-qamenus\", \"\");\n        box3.style.cssText = \"position:fixed;z-index:99999;left:4px;bottom:4px;max-width:calc(100vw - 8px);white-space:pre-wrap;margin:0;padding:4px 6px;background:rgba(255,255,255,.92);border:1px solid #333;font:10.5px/1.3 monospace;color:#111;pointer-events:none\";\n        box3.textContent = \"qa_menus=roomdrag \\xB7 canvas \" + Math.round(r.width) + \"x\" + Math.round(r.height) + \" \\xB7 from \" + from + \" to \" + to + \" \\xB7 open: \" + (open.join(\",\") || \"none\") + \"\\npress: \" + nm(doc2.elementFromPoint(from[0], from[1])) + \"\\npath: \" + path2.join(\" | \");\n        doc2.body.appendChild(box3);\n        const fire = (type, x, y, btns) => {\n          const t = doc2.elementFromPoint(x, y) || doc2.body;\n          const o = { bubbles: true, cancelable: true, composed: true, clientX: x, clientY: y, button: 0, buttons: btns, view: win2 };\n          if (/^pointer/.test(type)) t.dispatchEvent(new win2.PointerEvent(type, Object.assign({ pointerId: 1, pointerType: \"mouse\", isPrimary: true }, o)));\n          else t.dispatchEvent(new win2.MouseEvent(type, o));\n          return nm(t);\n        };\n        const seen = [];\n        seen.push(\"down:\" + fire(\"pointerdown\", from[0], from[1], 1));\n        fire(\"mousedown\", from[0], from[1], 1);\n        const mid = [(from[0] + to[0]) / 2, (from[1] + to[1]) / 2];\n        for (const [a, b] of [[from, mid], [mid, to]]) for (let i = 1; i <= 8; i++) {\n          const x = a[0] + (b[0] - a[0]) * i / 8, y = a[1] + (b[1] - a[1]) * i / 8;\n          fire(\"pointermove\", x, y, 1);\n          fire(\"mousemove\", x, y, 1);\n        }\n        seen.push(\"up:\" + fire(\"pointerup\", to[0], to[1], 0));\n        fire(\"mouseup\", to[0], to[1], 0);\n        win2.setTimeout(() => {\n          const sc = L.__ubProj.sceneRef(), c = sc.units[0], cue = (doc2.querySelector(\"[data-ub-cue]\") || {}).textContent || \"\";\n          box3.textContent += \"\\nafter the routed drag: x \" + Math.round(c.x) + \" w \" + Math.round(c.w) + \" (x+w \" + Math.round(c.x + c.w) + \", want 1455) z \" + Math.round(c.z) + \" rot \" + c.rot + \" \\xB7 cue: \" + cue.slice(0, 90) + \" \\xB7 \" + seen.join(\" \");\n        }, 600);\n        for (const p of [from, to]) {\n          const d = doc2.createElement(\"div\");\n          d.style.cssText = \"position:fixed;z-index:99998;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;background:#e00;pointer-events:none;left:\" + p[0] + \"px;top:\" + p[1] + \"px\";\n          doc2.body.appendChild(d);\n        }\n      }, 1500);\n    }\n    function evBox(text) {\n      const box3 = doc2.createElement(\"pre\");\n      box3.setAttribute(\"data-ub-qamenus\", \"\");\n      box3.style.cssText = \"position:fixed;z-index:99999;left:4px;top:4px;max-width:calc(100vw - 8px);white-space:pre-wrap;margin:0;padding:4px 6px;background:rgba(255,255,255,.94);border:1px solid #333;font:10.5px/1.3 monospace;color:#111;pointer-events:none\";\n      box3.textContent = text;\n      doc2.body.appendChild(box3);\n    }\n    function dragAllEvidence() {\n      const P2 = root.__ubProj, s = P2.sceneRef(), ia = P2.__v2.interaction(), cvs = root.querySelector(\".ub-lab__canvas\");\n      if (cvs && cvs.scrollIntoView) cvs.scrollIntoView({ block: \"center\" });\n      const add = root.querySelector('.ub-lab__dock [data-ub-fly=\"cabinets\"]');\n      if (add) add.click();\n      const lines = [\"qa_menus=dragall (dispatched mouse; trusted input is the sealed strip-gesture suite) \\xB7 start: cabinets \" + s.units.length + \", Undo \" + P2.histDepth().past];\n      const ev = (type, x, y, t) => (t || win2).dispatchEvent(new win2.MouseEvent(type, { bubbles: true, cancelable: true, clientX: x, clientY: y, button: 0, buttons: type === \"mouseup\" ? 0 : 1, view: win2 }));\n      const R4 = (v) => Math.round(v);\n      win2.setTimeout(() => {\n        const all = [...root.querySelectorAll('[data-ub-flyout=\"cabinets\"] [data-ub-tray-add]')].map((b) => b.getAttribute(\"data-ub-tray-add\"));\n        const qn = (k, d) => {\n          const m2 = new RegExp(\"[?&]\" + k + \"=(\\\\d+)\").exec(win2.location.search || \"\");\n          return m2 ? +m2[1] : d;\n        };\n        const from = qn(\"qa_from\", 0), tiles = all.slice(from, from + qn(\"qa_n\", 5));\n        lines.push(\"tiles \" + (from + 1) + \"-\" + (from + tiles.length) + \" of \" + all.length + \": \" + tiles.join(\", \"));\n        let i = 0, okN = 0;\n        const next = () => {\n          if (i >= tiles.length) {\n            lines.push(\"THESE \" + okN + \"/\" + tiles.length + \" tiles: preview = landed cabinet, +1 cabinet, +1 Undo, Undo back \\xB7 end: cabinets \" + s.units.length + \", Undo \" + P2.histDepth().past);\n            evBox(lines.join(\"\\n\"));\n            return;\n          }\n          const type = tiles[i++], tile = root.querySelector('[data-ub-flyout=\"cabinets\"] [data-ub-tray-add=\"' + type + '\"]');\n          tile.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n          win2.setTimeout(() => {\n            const tr = tile.getBoundingClientRect(), cv = cvs.getBoundingClientRect(), W2 = s.room && s.room.width || 3600, D2 = s.room && s.room.depth || 3e3;\n            let spot = null;\n            for (let y = tr.top - 30; y > cv.top + 60 && !spot; y -= 10) for (let x = cv.left + 80; x < cv.right - 80 && !spot; x += 14) {\n              const h = ia.ctx.screenToFloor((x - cv.left) / cv.width * 2 - 1, -((y - cv.top) / cv.height * 2 - 1), 0);\n              if (h && h[0] > 400 && h[0] < W2 - 400 && h[2] > 400 && h[2] < D2 - 400 && s.units.every((u) => h[0] < u.x - 400 || h[0] > u.x + (u.w || 600) + 400 || h[2] < u.z - 400 || h[2] > u.z + (u.d || 600) + 400)) spot = [x, y];\n            }\n            if (!spot) {\n              lines.push(type + \": no clear floor spot in view - skipped\");\n              next();\n              return;\n            }\n            const n0 = s.units.length, d0 = P2.histDepth().past, x0 = tr.left + tr.width / 2, y0 = tr.top + tr.height / 2;\n            ev(\"mousedown\", x0, y0, tile);\n            for (let k = 1; k <= 12; k++) ev(\"mousemove\", x0 + (spot[0] - x0) * k / 12, y0 + (spot[1] - y0) * k / 12);\n            win2.setTimeout(() => {\n              const pu = s.dropPreview && s.dropPreview.unit, pv = pu ? { ok: s.dropPreview.ok, type: pu.type, w: R4(pu.w), h: R4(pu.h), d: R4(pu.d), x: R4(pu.x), z: R4(pu.z), rot: pu.rot || 0 } : null;\n              const midN = s.units.length;\n              ev(\"mouseup\", spot[0], spot[1]);\n              win2.setTimeout(() => {\n                const nu = s.units[s.units.length - 1], land = { type: nu.type, w: R4(nu.w), h: R4(nu.h), d: R4(nu.d), x: R4(nu.x), z: R4(nu.z), rot: nu.rot || 0 };\n                const same = !!pv && [\"type\", \"w\", \"h\", \"d\", \"x\", \"z\", \"rot\"].every((k) => pv[k] === land[k]);\n                const added = s.units.length === n0 + 1 && P2.histDepth().past === d0 + 1 && midN === n0;\n                const undo = root.querySelector(\"[data-ub-undo]\");\n                if (undo) undo.click();\n                win2.setTimeout(() => {\n                  const back = s.units.length === n0 && P2.histDepth().past === d0;\n                  if (same && added && back) okN++;\n                  lines.push(type + \": preview \" + (pv ? pv.type + \" \" + pv.w + \"x\" + pv.h + \"x\" + pv.d + \" @\" + pv.x + \",\" + pv.z + \" rot\" + pv.rot : \"NONE\") + \" -> landed \" + land.w + \"x\" + land.h + \"x\" + land.d + \" @\" + land.x + \",\" + land.z + \" rot\" + land.rot + \" \\xB7 same \" + same + \" \\xB7 +1 cabinet/+1 Undo \" + added + \" \\xB7 Undo back \" + back);\n                  next();\n                }, 250);\n              }, 350);\n            }, 300);\n          }, 120);\n        };\n        next();\n      }, 500);\n    }\n    function plusEvidence() {\n      const P2 = root.__ubProj, s = P2.sceneRef(), cvs = root.querySelector(\".ub-lab__canvas\");\n      if (cvs && cvs.scrollIntoView) cvs.scrollIntoView({ block: \"center\" });\n      const open = () => {\n        const f = root.querySelector('[data-ub-flyout=\"cabinets\"]');\n        return !!f && !f.hasAttribute(\"hidden\");\n      };\n      try {\n        const u2 = s.units[s.units.length - 1];\n        P2.__v2.interaction().commands.run(\"select\", { id: u2.id });\n      } catch {\n      }\n      const lines = [\"qa_menus=plusadd (dispatched events) \\xB7 cabinets \" + s.units.length + \" \\xB7 selected \" + (s.selectedId || \"-\") + \" (the last one: a free side)\"];\n      const press = (el) => {\n        const r = el.getBoundingClientRect(), x = r.left + r.width / 2, y = r.top + r.height / 2;\n        const top = doc2.elementFromPoint(x, y);\n        const o = { bubbles: true, cancelable: true, clientX: x, clientY: y, button: 0, pointerType: \"mouse\", pointerId: 1, isPrimary: true, view: win2 };\n        const t = top || el;\n        t.dispatchEvent(new win2.PointerEvent(\"pointerdown\", Object.assign({ buttons: 1 }, o)));\n        t.dispatchEvent(new win2.MouseEvent(\"mousedown\", Object.assign({ buttons: 1 }, o)));\n        t.dispatchEvent(new win2.PointerEvent(\"pointerup\", o));\n        t.dispatchEvent(new win2.MouseEvent(\"mouseup\", o));\n        t.dispatchEvent(new win2.MouseEvent(\"click\", o));\n        return t === el || el.contains(t) ? \"on it\" : \"top was \" + (t.className || t.tagName);\n      };\n      const rail = /[?&]rail=1\\b/.test(win2.location.search || \"\");\n      if (rail) win2.setTimeout(() => {\n        const add = root.querySelector('.ub-lab__dock [data-ub-fly=\"cabinets\"]');\n        if (add) press(add);\n      }, 500);\n      win2.setTimeout(() => {\n        {\n          if (rail) lines.push(\"the catalogue opened first from the left rail Cabinets button\");\n          lines.push(\"start: catalogue \" + (open() ? \"OPEN\" : \"closed\") + \" - the + of the selected cabinet: 1st press arms (opens the catalogue), later presses add\");\n          let k = 0;\n          const step = () => {\n            const plus = [\"right\", \"left\"].map((sd) => root.querySelector('[data-ub-qadd=\"' + sd + '\"]')).find((b) => b && b.style.display !== \"none\" && b.offsetParent !== null);\n            if (!plus) {\n              lines.push(\"press \" + (k + 1) + \": no + on show\");\n              evBox(lines.join(\"\\n\"));\n              return;\n            }\n            const where = press(plus);\n            win2.setTimeout(() => {\n              lines.push(\"+ press \" + (k + 1) + \" (\" + where + \"): catalogue \" + (open() ? \"OPEN\" : \"CLOSED\") + \" \\xB7 cabinets \" + s.units.length + \" \\xB7 Undo \" + P2.histDepth().past);\n              if (++k < 4) {\n                if (k === 2) {\n                  const r = root.querySelector('[data-ub-flyout=\"cabinets\"] .ub-lab__tbody') || root.querySelector('[data-ub-flyout=\"cabinets\"]');\n                  if (r) r.scrollLeft = 160;\n                }\n                step();\n                return;\n              }\n              const row = root.querySelector('[data-ub-flyout=\"cabinets\"] .ub-lab__tbody') || root.querySelector('[data-ub-flyout=\"cabinets\"]');\n              lines.push(\"scroll of the strip after the adds: \" + (row ? Math.round(row.scrollLeft) : \"-\") + \" (set to 160 before press 3)\");\n              const undo = root.querySelector(\"[data-ub-undo]\"), redo = root.querySelector(\"[data-ub-redo]\");\n              undo.click();\n              win2.setTimeout(() => {\n                lines.push(\"Undo: catalogue \" + (open() ? \"OPEN\" : \"CLOSED\") + \" \\xB7 cabinets \" + s.units.length);\n                redo.click();\n                win2.setTimeout(() => {\n                  lines.push(\"Redo: catalogue \" + (open() ? \"OPEN\" : \"CLOSED\") + \" \\xB7 cabinets \" + s.units.length);\n                  const n1 = s.units.length, tile = root.querySelector('[data-ub-flyout=\"cabinets\"] [data-ub-tray-add=\"wall\"]');\n                  if (root.__ubPlusPick && root.__ubPlusPick.pending()) root.__ubPlusPick.cancel();\n                  const add = root.querySelector('.ub-lab__dock [data-ub-fly=\"cabinets\"]');\n                  if (!open() && add) add.click();\n                  win2.setTimeout(() => {\n                    if (tile) tile.click();\n                    win2.setTimeout(() => {\n                      lines.push(\"a tile pressed (Wall 1 door): cabinets \" + n1 + \" -> \" + s.units.length + \" \\xB7 catalogue \" + (open() ? \"OPEN\" : \"CLOSED\"));\n                      const shelves = root.querySelector('.ub-lab__dock [data-ub-fly=\"inside\"]') || root.querySelector(\".ub-lab__dock [data-ub-ifly]\") || root.querySelector(\".ub-lab__dock [data-ub-itooldock]\");\n                      const d1 = P2.histDepth().past;\n                      if (shelves) shelves.click();\n                      win2.setTimeout(() => {\n                        const anyShelf = !!root.querySelector('[data-ub-itoolbar]:not([hidden]), [data-ub-flyout=\"inside\"]:not([hidden])');\n                        lines.push(\"Shelves & dividers pressed: catalogue \" + (open() ? \"still OPEN\" : \"replaced\") + \" \\xB7 shelf strip \" + (anyShelf ? \"shown\" : \"not shown\") + \" \\xB7 Undo depth \" + d1 + \" -> \" + P2.histDepth().past);\n                        if (shelves) shelves.click();\n                        const add2 = root.querySelector('.ub-lab__dock [data-ub-fly=\"cabinets\"]');\n                        if (add2 && !open()) add2.click();\n                        win2.setTimeout(() => {\n                          const d2 = P2.histDepth().past, x = root.querySelector('[data-ub-flyout=\"cabinets\"] [data-ub-flyclose]');\n                          if (x) x.click();\n                          win2.setTimeout(() => {\n                            lines.push(\"the strip's x: catalogue \" + (open() ? \"OPEN\" : \"closed\") + \" \\xB7 Undo depth \" + d2 + \" -> \" + P2.histDepth().past);\n                            evBox(lines.join(\"\\n\"));\n                          }, 300);\n                        }, 400);\n                      }, 400);\n                    }, 500);\n                  }, 400);\n                }, 500);\n              }, 500);\n            }, 650);\n          };\n          step();\n        }\n      }, 1200);\n    }\n    function badgeEvidence() {\n      const P2 = root.__ubProj, s = P2.sceneRef(), ia = P2.__v2.interaction(), cvs = root.querySelector(\".ub-lab__canvas\");\n      if (cvs && cvs.scrollIntoView) cvs.scrollIntoView({ block: \"center\" });\n      const cat = /[?&]cat=1\\b/.test(win2.location.search || \"\");\n      if (cat) win2.setTimeout(() => {\n        const a = root.querySelector('.ub-lab__dock [data-ub-fly=\"cabinets\"]');\n        if (a) a.click();\n      }, 300);\n      win2.setTimeout(() => {\n        const u = s.units[0], cr = cvs.getBoundingClientRect();\n        const nd = ia.ctx.worldToNdc([u.x + u.w / 2, (u.h || 720) / 2, u.z + u.d / 2]);\n        const x = cr.left + (nd[0] + 1) / 2 * cr.width, y = cr.top + (1 - nd[1]) / 2 * cr.height;\n        const top = doc2.elementFromPoint(x, y), nm = (n) => n ? n.tagName.toLowerCase() + (n.className && n.className.baseVal === void 0 ? \".\" + String(n.className).trim().split(/\\s+/).join(\".\") : \"\") : \"none\";\n        const B = () => [\"[data-ub-finbtn]:not([data-ub-unitdel])\", \"[data-ub-unitdel]\"].map((q) => {\n          const b = root.querySelector(q);\n          if (!b) return \"missing\";\n          const r = b.getBoundingClientRect(), h = b.getAttribute(\"hidden\") !== null, at = r.width ? doc2.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2) : null;\n          return (q === \"[data-ub-unitdel]\" ? \"x\" : \"finish\") + \":\" + (h ? \"HIDDEN\" : \"shown@\" + Math.round(r.left) + \",\" + Math.round(r.top) + \" top=\" + (at === b || at && b.contains(at) ? \"itself\" : nm(at)));\n        }).join(\"  \");\n        const lines = [\"qa_menus=badges (dispatched events) \\xB7 cabinet 1 middle at \" + Math.round(x) + \",\" + Math.round(y) + \" \\xB7 element there: \" + nm(top) + (top === cvs ? \" (the canvas)\" : \"  <- NOT the canvas\")];\n        for (let i = 0; i < 6; i++) top.dispatchEvent(new win2.MouseEvent(\"mousemove\", { bubbles: true, clientX: x + i, clientY: y, view: win2 }));\n        win2.setTimeout(() => {\n          lines.push(\"mouse hover: \" + B());\n          cvs.dispatchEvent(new win2.MouseEvent(\"mouseleave\", { bubbles: false, clientX: 1, clientY: 1, view: win2 }));\n          win2.setTimeout(() => {\n            const T3 = (type) => {\n              try {\n                const t = new win2.Touch({ identifier: 1, target: cvs, clientX: x, clientY: y });\n                cvs.dispatchEvent(new win2.TouchEvent(type, { bubbles: true, cancelable: true, touches: type === \"touchend\" ? [] : [t], changedTouches: [t] }));\n              } catch (e) {\n                lines.push(\"touch: \" + e.message);\n              }\n            };\n            T3(\"touchstart\");\n            T3(\"touchend\");\n            win2.setTimeout(() => {\n              lines.push(\"after a tap: \" + B() + \" \\xB7 selected \" + (s.selectedId || \"-\"));\n              const fb = root.querySelector(\"[data-ub-finbtn]:not([data-ub-unitdel])\");\n              if (fb && fb.getAttribute(\"hidden\") === null) {\n                fb.click();\n                win2.setTimeout(() => {\n                  const pop = root.querySelector(\"[data-ub-finpop]\");\n                  lines.push(\"finish badge pressed -> its pop-up \" + (pop && !pop.hidden ? \"OPEN\" : \"not open\") + (cat ? \" \\xB7 catalogue strip still open: \" + !root.querySelector('[data-ub-flyout=\"cabinets\"]').hidden : \"\"));\n                  const snap3 = () => JSON.stringify(s.units.map((q) => [q.id, q.ovCarcass || \"-\", q.ovFronts || \"-\"])), k0 = JSON.stringify(s.kitchen || {}), u0 = snap3(), d0 = P2.histDepth().past, sel = s.selectedId;\n                  const ov = (w, v) => {\n                    const b = root.querySelector('[data-ub-finpop] [data-ub-ov=\"' + w + '\"][data-ub-ovval=\"' + v + '\"]');\n                    if (b) b.click();\n                    return !!b;\n                  };\n                  ov(\"carcass\", \"oak\");\n                  win2.setTimeout(() => {\n                    ov(\"fronts\", \"oak\");\n                    win2.setTimeout(() => {\n                      const u1 = s.units.map((q) => [q.id, q.ovCarcass || \"-\", q.ovFronts || \"-\"]);\n                      const mine = u1.find((q) => q[0] === sel), others2 = u1.filter((q) => q[0] !== sel);\n                      lines.push(\"this cabinet only: \" + sel + \" carcass \" + mine[1] + \", fronts \" + mine[2] + \" \\xB7 others \" + JSON.stringify(others2) + \" \\xB7 kitchen defaults unchanged \" + (JSON.stringify(s.kitchen || {}) === k0) + \" \\xB7 Undo +\" + (P2.histDepth().past - d0));\n                      const undo = root.querySelector(\"[data-ub-undo]\");\n                      undo.click();\n                      undo.click();\n                      win2.setTimeout(() => {\n                        lines.push(\"Undo x2 -> as before: \" + (snap3() === u0 && P2.histDepth().past === d0));\n                        const n0 = s.units.length, geo = JSON.stringify(s.units.find((q) => q.id === sel)), x2 = root.querySelector(\"[data-ub-unitdel]\");\n                        const xr = x2 && x2.getAttribute(\"hidden\") === null;\n                        if (x2) x2.click();\n                        win2.setTimeout(() => {\n                          const gone = s.units.length === n0 - 1 && !s.units.some((q) => q.id === sel);\n                          undo.click();\n                          win2.setTimeout(() => {\n                            const back = s.units.length === n0 && JSON.stringify(s.units.find((q) => q.id === sel)) === geo;\n                            lines.push(\"cross shown \" + xr + \" -> pressed: \" + sel + \" removed \" + gone + \" \\xB7 Undo -> back with the same geometry and finishes \" + back);\n                            evBox(lines.join(\"\\n\"));\n                          }, 400);\n                        }, 400);\n                      }, 600);\n                    }, 500);\n                  }, 500);\n                }, 500);\n              } else {\n                lines.push(\"finish badge not on show - not pressed\");\n                evBox(lines.join(\"\\n\"));\n              }\n            }, 600);\n          }, 600);\n        }, 500);\n      }, 900);\n    }\n    function actionEvidence(w) {\n      const P2 = root.__ubProj, s = P2.sceneRef(), ia = P2.__v2.interaction(), cvs = root.querySelector(\".ub-lab__canvas\");\n      const st = () => ({\n        units: s.units.length,\n        past: P2.histDepth().past,\n        yaw: +(s.yaw || 0).toFixed(4),\n        pitch: +(s.pitch || 0).toFixed(4),\n        zoom: +(s.zoom || 0).toFixed(4),\n        panX: Math.round(s.panX || 0),\n        panY: Math.round(s.panY || 0),\n        sel: s.selectedId || null,\n        eve: !!s.evening,\n        see: !!s.frontsSeeThrough,\n        kitchen: JSON.stringify(s.kitchen || {}).slice(0, 60),\n        price: ((root.querySelector(\".ub-lab__price\") || {}).textContent || \"\").trim()\n      });\n      if (cvs && cvs.scrollIntoView) cvs.scrollIntoView({ block: \"center\" });\n      const a = st();\n      if (/^drag/.test(w)) {\n        const add = root.querySelector('.ub-lab__dock [data-ub-fly=\"cabinets\"]');\n        if (add) add.click();\n        win2.setTimeout(() => {\n          const tile = root.querySelector('[data-ub-flyout=\"cabinets\"] [data-ub-tray-add=\"base\"]'), tr = tile.getBoundingClientRect(), cv = cvs.getBoundingClientRect();\n          let spot = null;\n          const W2 = s.room && s.room.width || 3600, D2 = s.room && s.room.depth || 3e3;\n          for (let y = tr.top - 24; y > cv.top + 60 && !spot; y -= 10) for (let x = cv.left + 80; x < cv.right - 80 && !spot; x += 14) {\n            const nx = (x - cv.left) / cv.width * 2 - 1, ny = -((y - cv.top) / cv.height * 2 - 1), h = ia.ctx.screenToFloor(nx, ny, 0);\n            if (h && h[0] > 250 && h[0] < W2 - 250 && h[2] > 250 && h[2] < D2 - 250 && s.units.every((u) => h[0] < u.x - 300 || h[0] > u.x + u.w + 300 || h[2] < u.z - 300 || h[2] > u.z + u.d + 300)) spot = [x, y, Math.round(h[0]), Math.round(h[2])];\n          }\n          if (!spot) {\n            evBox(\"qa_menus=\" + w + \" \\xB7 no empty floor spot visible above the catalogue in this view\");\n            return;\n          }\n          const ev = (type, x, y, t) => (t || win2).dispatchEvent(new win2.MouseEvent(type, { bubbles: true, cancelable: true, clientX: x, clientY: y, button: 0, buttons: type === \"mouseup\" ? 0 : 1, view: win2 }));\n          const x0 = tr.left + tr.width / 2, y0 = tr.top + tr.height / 2;\n          ev(\"mousedown\", x0, y0, tile);\n          for (let i = 1; i <= 12; i++) ev(\"mousemove\", x0 + (spot[0] - x0) * i / 12, y0 + (spot[1] - y0) * i / 12);\n          win2.setTimeout(() => {\n            const pv = s.dropPreview && s.dropPreview.unit ? { ok: s.dropPreview.ok, type: s.dropPreview.unit.type, x: Math.round(s.dropPreview.unit.x), z: Math.round(s.dropPreview.unit.z) } : null;\n            if (w === \"dragmid\") {\n              evBox(\"qa_menus=dragmid \\xB7 a Base 1 door tile dragged (dispatched mouse) onto the floor at \" + spot.slice(2).join(\", \") + \" mm and HELD\\nlive preview cabinet: \" + JSON.stringify(pv) + \"\\nplan: \" + a.units + \" cabinets, Undo depth \" + a.past + \" -> now \" + st().units + \" / \" + st().past + \" (no change while dragging)\");\n              return;\n            }\n            if (w === \"dragcancel\") {\n              win2.dispatchEvent(new win2.KeyboardEvent(\"keydown\", { key: \"Escape\", bubbles: true }));\n            }\n            ev(\"mouseup\", spot[0], spot[1]);\n            win2.setTimeout(() => {\n              const b = st(), nu = s.units[s.units.length - 1];\n              evBox(\"qa_menus=\" + w + \" \\xB7 preview just before release \" + JSON.stringify(pv) + (w === \"dragcancel\" ? \" \\xB7 Escape pressed, then released\" : \"\") + \"\\ncabinets \" + a.units + \" -> \" + b.units + \" \\xB7 Undo depth \" + a.past + \" -> \" + b.past + \" \\xB7 preview left on the scene: \" + !!s.dropPreview + (w === \"dragdrop\" ? \"\\nlanded: \" + JSON.stringify({ type: nu.type, x: Math.round(nu.x), z: Math.round(nu.z) }) + \" \\xB7 same as preview: \" + !!(pv && nu.type === pv.type && Math.round(nu.x) === pv.x && Math.round(nu.z) === pv.z) : \"\"));\n            }, 700);\n          }, 500);\n        }, 700);\n        return;\n      }\n      const chrome = () => [[\"top\", \".ub-lab__dock--top\"], [\"left\", \".ub-lab__dock--left\"], [\"right\", \".ub-lab__dock--right\"], [\"swatches\", \".ub-lab__dock [data-ub-kmats]\"], [\"hint\", \"[data-ub-modehint]\"]].map(([k, sel]) => {\n        const el = root.querySelector(sel);\n        if (!el) return k + \":none\";\n        const cs = win2.getComputedStyle(el), r = el.getBoundingClientRect(), hit2 = r.width ? doc2.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2) : null;\n        return k + \":\" + (cs.visibility === \"hidden\" || +cs.opacity < 0.05 ? \"hidden\" : \"SHOWN\") + (hit2 === cvs ? \"/press->view\" : \"\");\n      }).join(\" \");\n      const glow = () => {\n        try {\n          const i = P2.__v2.renderer().inspect();\n          return JSON.stringify(i.glow()) + \" \\xB7 worktop \" + !!(s.kitchen && s.kitchen.worktop && s.kitchen.worktop.on) + \" \\xB7 floor tone x\" + (+i.floorDim()).toFixed(2) + \" \\xB7 L corners in plan \" + s.units.filter((u) => /^corner-(l|wall)$/.test(u.type)).length;\n        } catch {\n          return \"-\";\n        }\n      };\n      const opened = () => {\n        let n = 0;\n        try {\n          P2.__v2.renderer().inspect().units.forEach((r) => {\n            if (/(^|;)(doorOpen|drawerOpen)=true;|drawers=\\[true/.test(r.key)) n++;\n          });\n        } catch {\n        }\n        return n;\n      };\n      if (/^show|^evening$/.test(w)) {\n        for (const t of [\"wall\", \"wall\", \"wall\", \"base-4drawer\", \"corner-l\", \"corner-wall\"]) {\n          try {\n            ia.commands.run(\"addUnit\", { type: t });\n          } catch {\n          }\n        }\n        try {\n          const RW = s.room && s.room.width || 3600, of = (t) => s.units.filter((u) => u.type === t);\n          of(\"wall\").forEach((u, i) => {\n            u.x = i * u.w;\n            u.z = 0;\n            u.rot = 0;\n          });\n          of(\"base-4drawer\").forEach((u) => {\n            u.x = 1200;\n            u.z = 0;\n            u.rot = 0;\n          });\n          for (const t of [\"corner-l\", \"corner-wall\"]) of(t).forEach((u) => {\n            u.x = RW - u.w;\n            u.z = 0;\n            u.rot = 0;\n          });\n        } catch {\n        }\n        if (/[?&]qa_wt=1\\b/.test(win2.location.search || \"\")) s.kitchen = Object.assign({}, s.kitchen || {}, { worktop: { on: true } });\n        s.environment = \"universe\";\n        s.selectedId = null;\n        try {\n          P2.render();\n        } catch {\n        }\n      }\n      const a2 = st();\n      if (w === \"showplay\" || w === \"showstop\" || w === \"showopen\" || w === \"showeve\") {\n        win2.setTimeout(() => {\n          root.querySelector(\"[data-ub-show]\").click();\n          const hold = w === \"showopen\" ? 2 : w === \"showeve\" ? 4 : -1;\n          if (hold >= 0) {\n            win2.setTimeout(() => root.__ubShow.goto(hold), 400);\n            win2.setInterval(() => {\n              if (root.__ubShow.playing()) root.__ubShow.goto(hold);\n            }, 4e3);\n          }\n          win2.setTimeout(() => {\n            const m = st(), cap2 = (root.querySelector(\"[data-ub-showcap]\") || {}).textContent || \"\";\n            const head = \"qa_menus=\" + w + \" (dispatched click, not trusted input) \\xB7 caption: \" + cap2.replace(/Stop show/, \"\").trim() + \"\\nview controls: \" + chrome() + \"\\nplan: cabinets \" + a2.units + \" -> \" + m.units + \", Undo depth \" + a2.past + \" -> \" + m.past;\n            if (w === \"showopen\") {\n              evBox(head + \"\\ncabinets drawn open: \" + opened() + \" \\xB7 open in the plan itself: \" + s.units.filter((u) => u.doorOpen || u.drawerOpen).length);\n              return;\n            }\n            if (w === \"showeve\") {\n              let mood = null;\n              try {\n                mood = P2.__v2.renderer().inspect().mood();\n              } catch {\n              }\n              evBox(head + \"\\nlight \" + JSON.stringify(mood) + \" \\xB7 warm lights \" + glow());\n              return;\n            }\n            if (w === \"showplay\") {\n              evBox(head + \"\\ncamera before \" + JSON.stringify([a2.yaw, a2.pitch, a2.zoom]) + \" -> now \" + JSON.stringify([m.yaw, m.pitch, m.zoom]));\n              return;\n            }\n            const a3 = a2;\n            root.querySelector(\"[data-ub-showstop]\").click();\n            win2.setTimeout(() => {\n              const b = st();\n              const same = [\"yaw\", \"pitch\", \"zoom\", \"panX\", \"panY\", \"sel\", \"eve\", \"see\", \"units\", \"past\"].every((k) => a3[k] === b[k]);\n              evBox(\"qa_menus=showstop \\xB7 played 3.5 s (\" + cap2.replace(/Stop show/, \"\").trim() + \"), then Stop show\\nbefore \" + JSON.stringify(a3) + \"\\nafter  \" + JSON.stringify(b) + \"\\nexactly restored: \" + same + \"\\nview controls after: \" + chrome() + \" \\xB7 cabinets drawn open \" + opened());\n            }, 1600);\n          }, w === \"showeve\" ? 2600 : w === \"showopen\" ? 1600 : 3500);\n        }, 700);\n        return;\n      }\n      if (w === \"evening\") {\n        win2.setTimeout(() => root.querySelector(\"[data-ub-light]\").click(), 700);\n        win2.setTimeout(() => {\n          let mood = null;\n          try {\n            mood = P2.__v2.renderer().inspect().mood();\n          } catch {\n          }\n          evBox(\"qa_menus=evening \\xB7 Evening light pressed 1.8 s ago \\xB7 light \" + JSON.stringify(mood) + \" \\xB7 warm lights \" + glow() + \" \\xB7 button now offers: \" + root.querySelector(\"[data-ub-light]\").getAttribute(\"aria-label\") + \"\\nplan: cabinets \" + a.units + \" -> \" + st().units + \", Undo depth \" + a2.past + \" -> \" + st().past);\n        }, 2600);\n        return;\n      }\n      if (w === \"matundo\") {\n        const sw = root.querySelector('[data-ub-kmat=\"carcass\"]');\n        if (sw) sw.click();\n        win2.setTimeout(() => {\n          const opt = root.querySelector('[data-ub-kmsec=\"carcass\"] .ub-lab__kopt[aria-pressed=\"false\"]');\n          if (opt) opt.click();\n          win2.setTimeout(() => {\n            const m = st();\n            const undo = root.querySelector(\"[data-ub-undo]\");\n            if (undo) undo.click();\n            win2.setTimeout(() => {\n              const b = st(), note = root.querySelector(\"[data-ub-kprice]\");\n              evBox(\"qa_menus=matundo \\xB7 Carcass swatch, chose \" + (opt ? opt.getAttribute(\"title\") : \"-\") + \"\\nafter the quote: carcass \" + m.kitchen + \" price \" + m.price + \" (Undo depth \" + a.past + \" -> \" + m.past + \")\\nafter Undo: \" + b.kitchen + \" price \" + b.price + \" (depth \" + b.past + \") \\xB7 back to the start: \" + (b.kitchen === a.kitchen && b.past === a.past) + \" \\xB7 note: \" + (note && !note.hidden ? note.textContent : \"-\"));\n            }, 3500);\n          }, 3200);\n        }, 600);\n      }\n    }\n    function selectorEvidence() {\n      const Q = (q) => root.querySelector(q), nm = (n) => n ? n.tagName.toLowerCase() + (n.className && n.className.baseVal === void 0 ? \".\" + String(n.className).trim().split(/\\s+/)[0] : \"\") : \"none\";\n      const SEL6 = { Carcass: '[data-ub-kmat=\"carcass\"]', Doors: '[data-ub-kmat=\"doors\"]', Worktop: '.ub-lab__kmats [data-ub-fly=\"worktop\"]' };\n      const openNow = () => {\n        const b = root.__ubBottomStrip && root.__ubBottomStrip();\n        const fp = Q(\"[data-ub-finpop]\");\n        const k = Q(\"[data-ub-kmatpop]\");\n        const kw = k && !k.hidden ? Q('[data-ub-kmat=\"carcass\"][aria-expanded=\"true\"]') ? \"Carcass\" : Q('[data-ub-kmat=\"doors\"][aria-expanded=\"true\"]') ? \"Doors\" : \"materials\" : null;\n        return (fp && !fp.hidden ? \"thiscab \" : \"\") + (kw || (b && b.open ? b.which : \"none\"));\n      };\n      const hit2 = () => Object.keys(SEL6).map((k) => {\n        const e = Q(SEL6[k]);\n        if (!e) return k + \":missing\";\n        const r = e.getBoundingClientRect();\n        const at = doc2.elementFromPoint(r.left + r.width / 2, r.top + r.height / 2);\n        return k + \"@\" + Math.round(r.left) + \",\" + Math.round(r.top) + \" \" + Math.round(r.width) + \"x\" + Math.round(r.height) + (at === e || at && e.contains(at) ? \" hit\" : \" BLOCKED by \" + nm(at));\n      }).join(\"  \");\n      const dk = (k) => () => {\n        const b = Q('.ub-lab__dock [data-ub-fly=\"' + k + '\"]');\n        if (b && b.offsetParent) b.click();\n        else root.__ubDocks.show(k);\n      };\n      const states = [\n        [\"none\", () => {\n        }],\n        [\"Cabinets\", dk(\"cabinets\")],\n        [\"Doors tray\", dk(\"fronts\")],\n        [\"Worktop\", () => Q(SEL6.Worktop).click()],\n        [\"Room\", dk(\"room\")],\n        [\"Drawers\", dk(\"drawers\")],\n        [\"End panels\", dk(\"finishing\")],\n        [\"Shelves\", () => root.__ubDocks.show(\"inside\")],\n        [\"Carcass\", () => Q(SEL6.Carcass).click()],\n        [\"Doors material\", () => Q(SEL6.Doors).click()]\n      ];\n      const clash = () => {\n        const R4 = Q(\".ub-lab__dock--right\").getBoundingClientRect();\n        return [...root.querySelectorAll(\".ub-lab__flyout--strip, .ub-lab__flyout--tray, .ub-lab__kmatpop, .ub-lab__itool, .ub-lab__finpop\")].filter((x) => !x.hidden && x.offsetParent).map((x) => {\n          const q = x.getBoundingClientRect();\n          return (x.getAttribute(\"data-ub-flyout\") || x.className.split(\" \").pop()) + \" right \" + Math.round(q.right) + (q.right > R4.left + 1 && q.top < R4.bottom && q.bottom > R4.top ? \" OVER dock@\" + Math.round(R4.left) : \" clear of dock@\" + Math.round(R4.left));\n        }).join(\", \");\n      };\n      const lines = [\"qa_menus=selectors (dispatched clicks) \\xB7 viewport \" + win2.innerWidth + \"x\" + win2.innerHeight];\n      const close = () => {\n        try {\n          root.__ubDocks.show(null);\n        } catch {\n        }\n        const it = Q(\"[data-ub-itoolbar]\");\n        if (it && !it.hidden) {\n          const d = it.querySelector('[data-ub-itool=\"off\"]');\n          if (d) d.click();\n        }\n        const k = Q(\"[data-ub-kmatpop]\");\n        if (k && !k.hidden) doc2.body.dispatchEvent(new win2.PointerEvent(\"pointerdown\", { bubbles: true }));\n      };\n      let i = 0;\n      const step = () => {\n        let bx2 = doc2.querySelector(\"[data-ub-qamenus]\");\n        if (!bx2) {\n          evBox(\"\");\n          bx2 = doc2.querySelector(\"[data-ub-qamenus]\");\n        }\n        bx2.textContent = lines.join(\"\\n\") + (i >= states.length ? \"\\n(done)\" : \"\");\n        if (i >= states.length) return;\n        const [name2, open] = states[i++];\n        close();\n        win2.setTimeout(() => {\n          try {\n            open();\n          } catch (e) {\n            lines.push(name2 + \": \" + e.message);\n          }\n          win2.setTimeout(() => {\n            lines.push(\"[\" + name2 + \" open -> \" + openNow() + \"] \" + hit2() + \" \\xB7 \" + clash());\n            const sw = Object.keys(SEL6).map((k) => {\n              close();\n              try {\n                open();\n              } catch {\n              }\n              const e = Q(SEL6[k]);\n              if (e) e.click();\n              return k + \"->\" + openNow();\n            });\n            lines.push(\"   one click: \" + sw.join(\"  \"));\n            step();\n          }, 450);\n        }, 250);\n      };\n      step();\n    }\n    function finRowEvidence() {\n      const P2 = root.__ubProj, s = P2.sceneRef(), u = s.units[0];\n      try {\n        P2.__v2.interaction().select(u.id);\n      } catch {\n        s.selectedId = u.id;\n      }\n      const k0 = JSON.stringify(s.units), d0 = P2.histDepth().past;\n      win2.setTimeout(() => {\n        const fb = root.querySelector(\"[data-ub-finbtn]:not([data-ub-unitdel])\");\n        if (fb) {\n          fb.hidden = false;\n          fb.click();\n        }\n        win2.setTimeout(() => {\n          const p = root.querySelector(\"[data-ub-finpop]\"), cv = root.querySelector(\".ub-lab__canvas\").getBoundingClientRect();\n          if (!p || p.hidden) {\n            evBox(\"qa_menus=finrow \\xB7 This cabinet only did not open\");\n            return;\n          }\n          const meas = () => {\n            const r = p.getBoundingClientRect(), vis2 = [...p.querySelectorAll(\"button:not(.ub-lab__dpkzoom)\")].filter((b) => {\n              const q = b.getBoundingClientRect();\n              return q.width > 4 && q.height > 4;\n            });\n            const tops = new Set(vis2.map((b) => Math.round(b.getBoundingClientRect().top / 6)));\n            const sw = vis2.filter((b) => b.matches(\".ub-lab__finsw, .ub-lab__dpkrow\")).length;\n            return \"rect \" + Math.round(r.left) + \",\" + Math.round(r.top) + \" \" + Math.round(r.width) + \"x\" + Math.round(r.height) + \" \\xB7 gap to canvas bottom \" + Math.round(cv.bottom - r.bottom) + \" \\xB7 rows \" + tops.size + \" \\xB7 swatches \" + sw;\n          };\n          const lines = [\"qa_menus=finrow (dispatched clicks) \\xB7 cabinet \" + u.id + \" \\xB7 \" + meas()];\n          for (const k of [\"fronts\", \"plinth\", \"carcass\"]) {\n            const b = p.querySelector('[data-ub-fintgt=\"' + k + '\"]');\n            if (b) b.click();\n            lines.push(k + \": \" + meas() + \" \\xB7 pressed \" + (b && b.getAttribute(\"aria-pressed\")));\n          }\n          if (/[?&]dump=1\\b/.test(win2.location.search || \"\")) {\n            const seen = [];\n            p.querySelectorAll(\"*\").forEach((n) => {\n              if (n.closest(\".ub-lab__dpklist\") && n.closest(\".ub-lab__dpklist\") !== n) return;\n              const r = n.getBoundingClientRect();\n              if (r.width < 2 || r.height < 2) return;\n              seen.push(n.tagName.toLowerCase() + \".\" + String(n.className && n.className.baseVal === void 0 ? n.className : \"\").split(\" \")[0] + (n.getAttribute(\"data-ub-fintag\") ? \"[\" + n.getAttribute(\"data-ub-fintag\") + \"]\" : \"\") + \" \" + Math.round(r.left) + \",\" + Math.round(r.top) + \" \" + Math.round(r.width) + \"x\" + Math.round(r.height) + \" \" + (n.children.length ? \"\" : (n.textContent || \"\").trim().slice(0, 14)));\n            });\n            lines.push(seen.slice(0, 40).join(\"\\n\"));\n            const lr = (p.querySelector('[data-ub-fintag=\"carcass\"] .ub-lab__dpklist') || p).getBoundingClientRect(), y = lr.top + lr.height / 2, at = [];\n            for (let x = lr.left; x < lr.left + 300; x += 23) {\n              const e = doc2.elementFromPoint(x, y);\n              at.push(Math.round(x) + \":\" + (e ? e.tagName.toLowerCase() + \".\" + String(e.className && e.className.baseVal === void 0 ? e.className : \"svg\").split(\" \")[0] + \" bg \" + getComputedStyle(e).backgroundColor : \"none\"));\n            }\n            lines.push(\"along the list: \" + at.join(\" | \"));\n          }\n          lines.push(\"plan unchanged by opening and switching: \" + (JSON.stringify(s.units) === k0 && P2.histDepth().past === d0));\n          evBox(lines.join(\"\\n\"));\n        }, 500);\n      }, 900);\n    }\n    function cornerLook() {\n      if (/[?&]toolbar=top\\b/.test(win2.location.search || \"\")) root.__ubForceTopBar = true;\n      const P2 = root.__ubProj, sc = P2.sceneRef(), ia = P2.__v2.interaction(), R4 = P2.__v2.renderer();\n      win2.setTimeout(() => {\n        const u = sc.units.slice().sort((a, b) => a.x - b.x)[0];\n        sc.units.length = 0;\n        Object.assign(u, { type: \"corner-wall\", family: \"wall\", w: 1e3, w2: 1e3, d: 330, h: 720, rot: 0, x: 1500, z: 1300, y: 1450, door: true, doorOpen: true });\n        delete u.cornerShelves;\n        delete u.interior;\n        sc.units.push(u);\n        sc.selectedId = u.id;\n        ia.setMode(\"rotate\");\n        if (R4 && R4.focusOn) R4.focusOn(u.id);\n        P2.render();\n        const cv = root.querySelector(\".ub-lab__canvas\");\n        win2.scrollTo(0, cv.getBoundingClientRect().top + win2.scrollY - 4);\n        win2.setTimeout(() => {\n          const M = ia.inside.probe, T3 = 18, D2 = u.d, A1 = u.w, A2 = u.w2, ix = A1 - D2, sbA = 22, sbB = 22, y1 = T3 + (Math.round((u.h - T3) / 2) - T3) + T3;\n          const zA = D2 - sbA, xB = ix + sbB, x0A = T3 + 1, zEnd = A2 - T3 - 1, xa = xB - Math.min(140, (xB - x0A) * 0.4), zb = zA + Math.min(140, (zEnd - zA) * 0.4);\n          const scr = (lp) => {\n            const r = cv.getBoundingClientRect(), nd = ia.ctx.worldToNdc(M.toWorld(u, lp));\n            return nd ? { x: Math.round(r.left + (nd[0] + 1) / 2 * r.width), y: Math.round(r.top + (1 - nd[1]) / 2 * r.height) } : null;\n          };\n          const over = {};\n          let found = null, tries = 0;\n          const isShelf = (p) => {\n            if (!p || p.y > win2.innerHeight - 6) return false;\n            const e = doc2.elementFromPoint(p.x, p.y);\n            if (e !== cv) {\n              const k = e ? String(e.className && e.className.baseVal === void 0 ? e.className : e.tagName).split(\" \")[0] : \"none\";\n              over[k] = (over[k] || 0) + 1;\n              return false;\n            }\n            const h = ia.ctx.parts.realPartAt(p.x, p.y);\n            return !!(h && h.u === u && h.part.kind === \"shelf\");\n          };\n          outer: for (const zoom of [0.2, 0.3, 0.4]) for (const pitch of [0.5, 0.75, 0.35]) for (let k = 0; k < 48; k++) {\n            tries++;\n            sc.zoom = zoom;\n            P2.setCam(-Math.PI + k * Math.PI / 24, pitch);\n            ia.ctx.frame();\n            if (R4 && R4.renderNow) R4.renderNow();\n            const p = { onA: scr([xa, y1, zA - 60]), edgeA: scr([xa, y1, zA - 3]), toA: scr([xa, y1, zA - 83]), edgeB: scr([xB + 3, y1, zb]), toB: scr([xB + 83, y1, zb]) };\n            const len = (a, b) => Math.hypot(a.x - b.x, a.y - b.y), up = scr([xa, y1 + 100, zA - 3]), dir = (a, b) => {\n              const L = len(a, b) || 1;\n              return [(b.x - a.x) / L, (b.y - a.y) / L];\n            };\n            const apart = (m, q) => Math.abs(m[0] * q[1] - m[1] * q[0]) > 0.5;\n            if (!p.onA || !p.edgeA || !p.edgeB || !p.toA || !p.toB || !up) continue;\n            const dU = dir(p.edgeA, up);\n            if (isShelf(p.onA) && isShelf(p.edgeA) && isShelf(p.edgeB) && len(p.edgeA, p.toA) > 18 && len(p.edgeB, p.toB) > 18 && apart(dU, dir(p.edgeA, p.toA)) && apart(dU, dir(p.edgeB, p.toB))) {\n              found = { zoom, pitch, k, p };\n              break outer;\n            }\n          }\n          const vg = root.querySelector(\".ub-lab__viewgrp\"), side = vg ? vg.closest(\".ub-lab__dock--top\") ? \"top bar\" : \"right column\" : \"-\";\n          evBox(\"qa_menus=cornerlook (the corner-shelves suite's fixture and search) \\xB7 viewport \" + win2.innerWidth + \"x\" + win2.innerHeight + \" \\xB7 zoom/Undo/Fit on the \" + side + \"\\nshelf in sight: \" + (found ? \"YES at zoom \" + found.zoom + \" pitch \" + found.pitch + \" turn \" + found.k + \" after \" + tries + \" views\" : \"NO in \" + tries + \" views\") + \"\\nwhat stood over shelf points instead of the canvas: \" + (Object.keys(over).map((k2) => k2 + \" x\" + over[k2]).join(\", \") || \"nothing\"));\n        }, 900);\n      }, 1200);\n    }\n    function tapeEvidence() {\n      const P2 = root.__ubProj, sc = P2.sceneRef(), ia = P2.__v2.interaction(), cv = root.querySelector(\".ub-lab__canvas\");\n      if (/[?&]dark=1\\b/.test(win2.location.search || \"\")) {\n        sc.environment = \"universe\";\n        sc.evening = true;\n        const lb = root.querySelector(\"[data-ub-light]\");\n        if (lb && /evening/i.test(lb.getAttribute(\"aria-label\") || \"\")) lb.click();\n      }\n      cv.scrollIntoView({ block: \"center\" });\n      win2.setTimeout(() => {\n        root.querySelector(\"[data-ub-measure]\").click();\n        const u = sc.units.slice().sort((a, b) => a.x - b.x)[0], fb = ia.measure.probe.features(u.id).boxes, door = fb.find((b) => /^Door/.test(b.name || \"\")) || fb[0];\n        const xs = door.c.map((c) => c[0]), ys = door.c.map((c) => c[1]), zs = door.c.map((c) => c[2]);\n        const pA = [Math.min(...xs), Math.max(...ys), Math.max(...zs)], pB = [Math.max(...xs), Math.max(...ys), Math.max(...zs)];\n        const toScr = (p) => {\n          const r = cv.getBoundingClientRect(), nd = ia.ctx.worldToNdc(p);\n          return { x: r.left + (nd[0] + 1) / 2 * r.width, y: r.top + (1 - nd[1]) / 2 * r.height };\n        };\n        const press = (q) => {\n          for (const t of [\"pointermove\", \"mousemove\", \"pointermove\", \"mousemove\", \"pointerdown\", \"mousedown\", \"pointerup\", \"mouseup\", \"click\"]) {\n            const o = { bubbles: true, cancelable: true, clientX: q.x, clientY: q.y, button: 0, buttons: /down$/.test(t) ? 1 : 0, view: win2 };\n            cv.dispatchEvent(/^pointer/.test(t) ? new win2.PointerEvent(t, Object.assign({ pointerId: 1, pointerType: \"mouse\", isPrimary: true }, o)) : new win2.MouseEvent(t, o));\n          }\n        };\n        press(toScr(pA));\n        win2.setTimeout(() => {\n          press(toScr(pB));\n          win2.setTimeout(() => {\n            const d = root.querySelector(\"[data-ub-mdist]\"), cs = d ? getComputedStyle(d) : null;\n            const words2 = [...root.querySelectorAll(\".ub-lab__stage *\")].filter((e) => {\n              const r = e.getBoundingClientRect();\n              return r.width > 2 && r.height > 2 && /^(Clear|Done)$|Click a|click to|Esc to clear/.test((e.textContent || \"\").trim()) && e.children.length === 0;\n            }).map((e) => (e.textContent || \"\").trim().slice(0, 30));\n            const vis2 = (q) => {\n              const e = root.querySelector(q);\n              return !!e && getComputedStyle(e).display !== \"none\" && e.getBoundingClientRect().width > 2;\n            };\n            evBox(\"qa_menus=tape (dispatched clicks on cabinet \" + u.id + \"'s door corners) \\xB7 Measure \" + (ia.measure.on() ? \"on\" : \"off\") + \" \\xB7 points \" + ia.measure.probe.count() + \"\\nmeasure panel elements: \" + root.querySelectorAll(\"[data-ub-mbar], [data-ub-mclear], [data-ub-mdone]\").length + \" \\xB7 visible tape words: \" + (words2.join(\" | \") || \"none\") + \" \\xB7 canvas message shown: \" + vis2(\"[data-ub-cue]\") + \" \\xB7 hint shown: \" + vis2(\"[data-ub-modehint]\") + \"\\nreading on the line: \" + (d && d.style.display !== \"none\" ? \"\\xAB\" + d.textContent + \"\\xBB \" + cs.fontSize + \" \" + cs.fontWeight + \" \" + cs.color + \" background \" + cs.backgroundColor + \" border \" + cs.borderTopWidth : \"not shown\"));\n          }, 700);\n        }, 500);\n      }, 1500);\n    }\n    function placeEvidence() {\n      const P2 = root.__ubProj, sc = P2.sceneRef(), ia = P2.__v2.interaction(), cv = root.querySelector(\".ub-lab__canvas\");\n      const kind = (/[?&]kind=(shelf|divider|hdivider)\\b/.exec(win2.location.search || \"\") || [0, \"shelf\"])[1], drag = /[?&]drag=1\\b/.test(win2.location.search || \"\");\n      cv.scrollIntoView({ block: \"center\" });\n      win2.setTimeout(() => {\n        root.__ubDocks.show(\"inside\");\n        win2.setTimeout(() => {\n          const u = sc.units.slice().sort((a, b) => a.x - b.x)[0], r = cv.getBoundingClientRect(), nd = ia.ctx.worldToNdc([u.x + u.w / 2, (u.h || 720) * 0.6, u.z + u.d / 2]);\n          const x = r.left + (nd[0] + 1) / 2 * r.width, y = r.top + (1 - nd[1]) / 2 * r.height;\n          const btn = root.querySelector('[data-ub-itoolbar] [data-ub-itool=\"' + kind + '\"]');\n          const pe = (t, px, py, tgt, b) => (tgt || cv).dispatchEvent(new win2.PointerEvent(t, { bubbles: true, cancelable: true, clientX: px, clientY: py, button: 0, buttons: b ? 1 : 0, pointerId: 3, pointerType: \"mouse\", isPrimary: true, view: win2 }));\n          const me = (t, px, py, tgt) => (tgt || cv).dispatchEvent(new win2.MouseEvent(t, { bubbles: true, cancelable: true, clientX: px, clientY: py, button: 0, view: win2 }));\n          if (drag) {\n            const b = btn.getBoundingClientRect(), bx2 = b.left + b.width / 2, by = b.top + b.height / 2;\n            pe(\"pointerdown\", bx2, by, btn, 1);\n            for (let i = 1; i <= 10; i++) {\n              const px = bx2 + (x - bx2) * i / 10, py = by + (y - by) * i / 10;\n              win2.dispatchEvent(new win2.PointerEvent(\"pointermove\", { bubbles: true, clientX: px, clientY: py, buttons: 1, pointerId: 3, pointerType: \"mouse\", isPrimary: true }));\n            }\n          } else {\n            btn.click();\n            pe(\"pointermove\", x + 2, y);\n            me(\"mousemove\", x + 2, y);\n            pe(\"pointermove\", x, y);\n            me(\"mousemove\", x, y);\n          }\n          win2.setTimeout(() => {\n            const vis2 = (q) => {\n              const e = root.querySelector(q);\n              if (!e) return null;\n              const cs = getComputedStyle(e), b = e.getBoundingClientRect();\n              return cs.display !== \"none\" && cs.visibility !== \"hidden\" && Number(cs.opacity) > 0.05 && b.width > 2 && b.height > 2 ? \"\\xAB\" + (e.textContent || \"\").trim().slice(0, 60) + \"\\xBB\" : \"none\";\n            };\n            const nums = [...root.querySelectorAll(\"[data-ub-idim], .ub-lab__idim, .ub-lab__dpv text, [data-ub-ipreview] text\")].filter((e) => {\n              const b = e.getBoundingClientRect();\n              return b.width > 0 && getComputedStyle(e).display !== \"none\";\n            }).map((e) => (e.textContent || \"\").trim()).filter(Boolean).slice(0, 8);\n            const pg = sc.placeGhost, pv = sc.interiorPreview, sr = root.querySelector(\"[data-ub-itooltext]\"), gh = root.querySelector(\"[data-ub-ighost]\");\n            evBox(\"qa_menus=place (\" + kind + (drag ? \", carried in and HELD\" : \", aimed with the tool\") + \", dispatched pointer) \\xB7 viewport \" + win2.innerWidth + \"x\" + win2.innerHeight + \"\\non show - message: \" + vis2(\"[data-ub-cue]\") + \" \\xB7 hint: \" + vis2(\"[data-ub-modehint]\") + \"\\nghost: \" + (pg ? \"placeGhost \" + (pg.ok ? \"fits\" : \"NO FIT (red)\") : pv ? \"preview \" + (pv.ok ? \"fits (orange edges)\" : \"NO FIT (red)\") : \"none\") + \" \\xB7 numbers on the cabinet: \" + (nums.join(\" \") || \"none\") + \"\\nscreen-reader only: \" + ((drag ? gh && gh.getAttribute(\"aria-label\") : sr && sr.textContent) || \"-\").slice(0, 110) + \" \\xB7 Undo depth \" + P2.histDepth().past);\n          }, 600);\n        }, 700);\n      }, 1200);\n    }\n    function run() {\n      if (which === \"roomdrag\") {\n        try {\n          roomDrag();\n        } catch (e) {\n        }\n        return;\n      }\n      if (which === \"dragall\") {\n        try {\n          dragAllEvidence();\n        } catch (e) {\n          evBox(\"qa_menus=dragall failed: \" + e.message);\n        }\n        return;\n      }\n      if (which === \"plusadd\") {\n        try {\n          plusEvidence();\n        } catch (e) {\n          evBox(\"qa_menus=plusadd failed: \" + e.message);\n        }\n        return;\n      }\n      if (which === \"selectors\") {\n        if (/[?&]nosafe=1\\b/.test(win2.location.search || \"\")) root.__ubNoSafe = true;\n        const sh = /[?&]stageh=(\\d+)/.exec(win2.location.search || \"\");\n        if (sh) {\n          const cvh = root.querySelector(\".ub-lab__canvas\");\n          cvh.style.setProperty(\"height\", sh[1] + \"px\", \"important\");\n          cvh.style.setProperty(\"min-height\", sh[1] + \"px\", \"important\");\n          win2.dispatchEvent(new win2.Event(\"resize\"));\n        }\n        win2.setTimeout(() => {\n          try {\n            selectorEvidence();\n          } catch (e) {\n            evBox(\"qa_menus=selectors failed: \" + e.message);\n          }\n        }, 600);\n        return;\n      }\n      if (which === \"finrow\") {\n        try {\n          finRowEvidence();\n        } catch (e) {\n          evBox(\"qa_menus=finrow failed: \" + e.message);\n        }\n        return;\n      }\n      if (which === \"place\") {\n        try {\n          placeEvidence();\n        } catch (e) {\n          evBox(\"qa_menus=place failed: \" + e.message);\n        }\n        return;\n      }\n      if (which === \"tape\") {\n        try {\n          tapeEvidence();\n        } catch (e) {\n          evBox(\"qa_menus=tape failed: \" + e.message);\n        }\n        return;\n      }\n      if (which === \"cornerlook\") {\n        try {\n          cornerLook();\n        } catch (e) {\n          evBox(\"qa_menus=cornerlook failed: \" + e.message);\n        }\n        return;\n      }\n      if (which === \"badges\") {\n        try {\n          badgeEvidence();\n        } catch (e) {\n          evBox(\"qa_menus=badges failed: \" + e.message);\n        }\n        return;\n      }\n      if (/^(dragmid|dragdrop|dragcancel|showplay|showstop|showopen|showeve|evening|matundo)$/.test(which)) {\n        try {\n          actionEvidence(which);\n        } catch (e) {\n        }\n        return;\n      }\n      if (which === \"matprice\" || which === \"matprice-doors\") {\n        const kind = which === \"matprice\" ? \"carcass\" : \"doors\";\n        const pr = () => {\n          const p = root.querySelector(\".ub-lab__price\");\n          return p ? p.textContent.trim() : \"\";\n        };\n        const before = pr(), k0 = JSON.stringify(root.__ubProj && root.__ubProj.sceneRef().kitchen || {});\n        const sw = root.querySelector('[data-ub-kmat=\"' + kind + '\"]');\n        if (sw) sw.click();\n        win2.setTimeout(() => {\n          const opt = root.querySelector('[data-ub-kmsec=\"' + kind + '\"] .ub-lab__kopt[aria-pressed=\"false\"]');\n          if (opt) opt.click();\n          const name2 = opt ? (opt.getAttribute(\"title\") || opt.textContent).trim().slice(0, 40) : \"-\";\n          win2.setTimeout(() => {\n            const note = root.querySelector(\"[data-ub-kprice]\"), k1 = JSON.stringify(root.__ubProj && root.__ubProj.sceneRef().kitchen || {});\n            const box3 = doc2.createElement(\"pre\");\n            box3.setAttribute(\"data-ub-qamenus\", \"\");\n            box3.style.cssText = \"position:fixed;z-index:99999;left:4px;top:4px;max-width:calc(100vw - 8px);white-space:pre-wrap;margin:0;padding:4px 6px;background:rgba(255,255,255,.92);border:1px solid #333;font:10.5px/1.3 monospace;color:#111;pointer-events:none\";\n            box3.textContent = \"qa_menus=\" + which + \" \\xB7 pressed the \" + kind + \" swatch, chose \" + name2 + \"\\nprice before \" + before + \" -> now \" + pr() + \" \\xB7 note: \" + (note && !note.hidden ? note.textContent : \"(none)\") + \"\\nkitchen before \" + k0.slice(0, 120) + \"\\nkitchen after  \" + k1.slice(0, 120) + \"\\n\" + (() => {\n              const p = root.querySelector(\"[data-ub-kmatpop]\"), cv = root.querySelector(\".ub-lab__canvas\").getBoundingClientRect();\n              if (!p || p.hidden) return \"strip closed\";\n              const r = p.getBoundingClientRect(), sec = p.querySelector('[data-ub-kmsec=\"' + kind + '\"]'), sw2 = [...sec.querySelectorAll(\".ub-lab__kopt, .ub-lab__dpkrow:not([hidden])\")].slice(0, 40);\n              const rows = new Set(sw2.map((e) => Math.round(e.getBoundingClientRect().top))).size;\n              const vis2 = (q) => [...p.querySelectorAll(q)].filter((e) => {\n                const b = e.getBoundingClientRect();\n                return b.width > 0 && b.height > 0 && getComputedStyle(e).visibility !== \"hidden\";\n              }).length;\n              return \"strip: height \" + Math.round(r.height) + \" px \\xB7 gap to canvas bottom \" + Math.round(cv.bottom - r.bottom) + \" px \\xB7 swatch rows \" + rows + \" \\xB7 header / tabs / search / captions on show \" + vis2(\"[data-ub-kmattab], [data-ub-dpksearch], .ub-lab__dpkgroup, .ub-lab__rsub, .ub-lab__koptname, .ub-lab__dpkname, .ub-lab__ktop, .ub-lab__kmathead b\");\n            })();\n            doc2.body.appendChild(box3);\n          }, 6500);\n        }, 700);\n        return;\n      }\n      if (which === \"art\") {\n        const box3 = doc2.createElement(\"div\");\n        box3.setAttribute(\"data-ub-qamenus\", \"\");\n        box3.className = \"ub-lab\";\n        box3.style.cssText = \"position:fixed;z-index:99999;inset:0;overflow:auto;background:#fff;padding:10px;font:12px sans-serif;color:#111\";\n        box3.innerHTML = [\"#bcc4cd\", \"#ffffff\"].map((bg) => '<div style=\"background:' + bg + ';padding:6px;margin-bottom:8px\">' + Object.keys(ART).map((k) => '<div style=\"display:inline-block;margin:6px 8px;text-align:center;vertical-align:top\"><span class=\"ub-lab__artdemo\" style=\"display:inline-block;width:48px;height:48px\">' + ART[k]() + '</span><span class=\"ub-lab__artdemo\" style=\"display:inline-block;width:24px;height:24px;margin-left:4px\">' + ART[k]() + \"</span><br>\" + k + \"</div>\").join(\"\") + \"</div>\").join(\"\");\n        doc2.body.appendChild(box3);\n        return;\n      }\n      if (ROOMCAM[which]) {\n        try {\n          const P2 = root.__ubProj, sc = P2.sceneRef(), c = ROOMCAM[which];\n          let picked = \"\";\n          if (wallPick) {\n            const tool = root.querySelector('.ub-lab__dock [data-ub-fly=\"room\"]');\n            if (tool) tool.click();\n            const sw = root.querySelector('[data-ub-roomsw=\"wall\"][data-ub-val=\"' + wallPick[1] + '\"]');\n            if (sw) {\n              sw.click();\n              picked = sw.getAttribute(\"aria-label\") + \" (\" + sw.getAttribute(\"aria-pressed\") + \")\";\n            }\n            if (tool && tool.getAttribute(\"aria-expanded\") === \"true\") tool.click();\n          }\n          sc.selectedId = null;\n          P2.setCam(c[0], c[1]);\n          sc.zoom = c[2];\n          P2.render();\n          const cvs = root.querySelector(\".ub-lab__canvas\");\n          if (cvs && cvs.scrollIntoView) cvs.scrollIntoView({ block: \"center\" });\n          win2.setTimeout(() => {\n            let n = 0, shown = 0;\n            const names = [];\n            try {\n              P2.__v2.renderer().inspect().scene.traverse((o) => {\n                if (o.isLineSegments && /^room-edges-/.test(o.name)) {\n                  n++;\n                  if (o.visible) {\n                    shown++;\n                    names.push(o.name.replace(\"room-edges-\", \"\"));\n                  }\n                }\n              });\n            } catch {\n            }\n            const box3 = doc2.createElement(\"pre\");\n            box3.setAttribute(\"data-ub-qamenus\", \"\");\n            box3.style.cssText = \"position:fixed;z-index:99999;left:4px;bottom:4px;max-width:calc(100vw - 8px);white-space:pre-wrap;margin:0;padding:4px 6px;background:rgba(255,255,255,.92);border:1px solid #333;font:10.5px/1.3 monospace;color:#111;pointer-events:none\";\n            box3.textContent = \"qa_menus=\" + which + (picked ? \" \\xB7 wall colour \" + picked + \" (Room panel)\" : \"\") + \" \\xB7 room line groups shown \" + shown + \" of \" + n + (names.length ? \": \" + names.join(\", \") : \"\");\n            doc2.body.appendChild(box3);\n            win2.__ubQaMenus = { which, roomEdges: { n, shown } };\n          }, 900);\n        } catch (e) {\n        }\n        return;\n      }\n      try {\n        const docks = root.__ubDocks, sc = root.__ubProj && root.__ubProj.sceneRef ? root.__ubProj.sceneRef() : null;\n        if (which === \"settings\") {\n          const b = root.querySelector(\"[data-ub-settings]\");\n          if (b && b.offsetParent) b.click();\n          else {\n            const k = root.querySelector('[data-ub-kmat=\"carcass\"]');\n            if (k) k.click();\n          }\n        }\n        if (which === \"worktop\") {\n          const w = root.querySelector('.ub-lab__dock [data-ub-fly=\"worktop\"]');\n          if (w) w.click();\n        }\n        if (which === \"fronts\" || which === \"cabinets\" || which === \"inside\" || which === \"drawers\" || which === \"finishing\" || which === \"room\") {\n          if (sc && sc.units && sc.units[0] && root.__ubProj.__v2) root.__ubProj.__v2.interaction().commands.run(\"select\", { id: sc.units[0].id });\n          const btn = root.querySelector('.ub-lab__dock [data-ub-fly=\"' + which + '\"]');\n          if (btn && btn.offsetParent) btn.click();\n          else if (docks) docks.show(which);\n          const rt = /[?&]rtab=(size|walls|floor|openings)\\b/.exec(win2.location.search || \"\");\n          if (which === \"room\" && rt) win2.setTimeout(() => {\n            const t = root.querySelector('[data-ub-roomtab=\"' + rt[1] + '\"]');\n            if (t) t.click();\n          }, 250);\n          if (/[?&]dark=1\\b/.test(win2.location.search || \"\") && sc) {\n            sc.environment = \"universe\";\n            sc.evening = true;\n            win2.setTimeout(() => {\n              const lb = root.querySelector(\"[data-ub-light]\");\n              if (lb && /evening/i.test(lb.getAttribute(\"aria-label\") || \"\")) lb.click();\n            }, 300);\n          }\n          if (which === \"cabinets\") win2.setTimeout(() => {\n            const b = doc2.querySelector(\"[data-ub-qamenus]\");\n            const st = [...root.querySelectorAll('[data-ub-flyout=\"cabinets\"] img[data-ub-thumb]')].map((i) => i.getAttribute(\"data-ub-thumb\") + \":\" + (i.getAttribute(\"data-ub-cutout\") || \"-\"));\n            const t0 = root.querySelector('[data-ub-flyout=\"cabinets\"] [data-ub-tray-add]'), cs = t0 && getComputedStyle(t0);\n            if (b) b.textContent += \"\\npictures: \" + st.join(\" \") + (cs ? \"\\ntile: background-color \" + cs.backgroundColor + \" \\xB7 border \" + cs.borderTopColor + \" \\xB7 ring \" + cs.boxShadow + \"\\nglow \" + cs.backgroundImage.slice(0, 140) : \"\");\n          }, 2600);\n          if (which === \"cabinets\" && /[?&]pick=1\\b/.test(win2.location.search || \"\")) win2.setTimeout(() => {\n            const t = root.querySelectorAll('[data-ub-flyout=\"cabinets\"] [data-ub-tray-add]')[1];\n            if (t) t.classList.add(\"is-picked\");\n          }, 400);\n        }\n        const cvs = root.querySelector(\".ub-lab__canvas\");\n        if (cvs && cvs.scrollIntoView) cvs.scrollIntoView({ block: \"center\" });\n        win2.setTimeout(() => {\n          const rows = measure(SEL5[which]), cv = root.querySelector(\".ub-lab__canvas\").getBoundingClientRect();\n          win2.__ubQaMenus = { which, canvas: [Math.round(cv.width), Math.round(cv.height)], rows };\n          const box3 = doc2.createElement(\"pre\");\n          box3.setAttribute(\"data-ub-qamenus\", \"\");\n          const bottomMenu = [\"fronts\", \"cabinets\", \"inside\", \"drawers\", \"finishing\", \"room\", \"settings\", \"worktop\"].includes(which);\n          box3.style.cssText = \"position:fixed;z-index:99999;left:4px;\" + (bottomMenu ? \"top:4px;\" : \"bottom:4px;\") + \"max-width:calc(100vw - 8px);margin:0;padding:4px 6px;background:rgba(255,255,255,.92);border:1px solid #333;font:10.5px/1.3 monospace;color:#111;white-space:pre-wrap;pointer-events:none\";\n          box3.textContent = \"qa_menus=\" + which + \" \\xB7 canvas \" + Math.round(cv.width) + \"x\" + Math.round(cv.height) + \"\\n\" + rows.map((r) => r.name + \": h \" + r.h + \" w \" + r.w + (bottomMenu ? \" \\xB7 gap to canvas bottom \" + r.gap : \" \\xB7 top \" + r.top) + \" \\xB7 bg \\u03B1 \" + r.bg + (r.shadow ? \" +shadow\" : \"\") + \" \\xB7 covers \" + r.cover + \"% \\xB7 \" + r.tiles + \" targets, smallest \" + r.hit + \" px, tile bg \\u03B1\\u2264\" + r.tileBg + \" \\xB7 blank points to the view \" + r.pass + \"/\" + r.blank).join(\"\\n\");\n          if (which === \"worktop\") {\n            try {\n              const f = root.querySelector('[data-ub-flyout=\"worktop\"]'), fr = f.getBoundingClientRect(), t = f.querySelector(\"[data-ub-wtline]\"), tr = t.getBoundingClientRect();\n              const tall = [...f.querySelectorAll(\"*\")].filter((e) => {\n                const q = e.getBoundingClientRect();\n                return q.width > 0 && q.height > tr.height + 1 && e !== f && !e.contains(t);\n              }).map((e) => (e.className && e.className.baseVal === void 0 ? String(e.className).split(\" \")[0] : e.tagName) + \" \" + Math.round(e.getBoundingClientRect().height));\n              const wrapped = [...f.querySelectorAll(\".ub-lab__wtth, [data-ub-wtline] span, .ub-lab__wtinfo b\")].filter((e) => {\n                const q = e.getBoundingClientRect();\n                return q.width > 0 && q.height > 16;\n              }).length;\n              const ctl = [...f.querySelectorAll(\".ub-lab__wtctl .ub-lab__btn, .ub-lab__wtctl input\")].map((b) => {\n                const q = b.getBoundingClientRect(), h = doc2.elementFromPoint(q.left + q.width / 2, q.top + q.height / 2);\n                return Math.round(q.height) + (h === b || b.contains(h) ? \"\" : \"!covered\");\n              });\n              {\n                const ims = [...f.querySelectorAll(\"[data-ub-wtline] img\")].slice(0, 4).map((im) => {\n                  const q = im.getBoundingClientRect(), h = q.width ? doc2.elementFromPoint(q.left + q.width / 2, q.top + q.height / 2) : null;\n                  return (im.getAttribute(\"src\") ? \"src\" : \"nosrc\") + (im.complete ? im.naturalWidth ? \" ok \" + im.naturalWidth : \" FAILED\" : \" loading\") + \" \" + Math.round(q.width) + \"px \" + getComputedStyle(im).display + (h === im ? \"\" : \" under:\" + (h ? String(h.className || h.tagName).split(\" \")[0] : \"none\"));\n                });\n                box3.textContent += \"\\nworktop pictures: \" + ims.join(\" | \");\n                const all = [...f.querySelectorAll(\"[data-ub-wtline]\")], cnt = {};\n                for (const t2 of all) {\n                  const im = t2.querySelector(\"img\"), k = !im.getAttribute(\"src\") ? \"nosrc\" : im.complete && im.naturalWidth ? \"drawn\" : t2.getAttribute(\"data-ub-wtpic\") || \"blank\";\n                  cnt[k] = (cnt[k] || 0) + 1;\n                }\n                box3.textContent += \"\\nworktop first open, no sample pressed: \" + all.length + \" samples \\xB7 \" + Object.entries(cnt).map(([k, v]) => k + \" \" + v).join(\" \\xB7 \") + \" \\xB7 crops asked \" + all.filter((t2) => /-150x150\\./.test(t2.querySelector(\"img\").getAttribute(\"src\") || \"\")).length;\n              }\n              {\n                const e = f.querySelector('[data-ub-wtline=\"H1344ST32-38fw\"]');\n                if (e) {\n                  const bd0 = e.closest(\"[data-ub-tbody]\");\n                  f.scrollLeft = 0;\n                  e.scrollIntoView({ inline: \"nearest\", block: \"nearest\" });\n                  {\n                    const br = bd0.getBoundingClientRect(), er = e.getBoundingClientRect();\n                    if (er.left < br.left + 2) bd0.scrollLeft -= br.left + 2 - er.left;\n                    else if (er.right > br.right - 2) bd0.scrollLeft += er.right - (br.right - 2);\n                  }\n                  f.scrollLeft = 0;\n                  const r0 = e.getBoundingClientRect(), b0 = bd0.getBoundingClientRect(), cx = Math.max(r0.left, b0.left) + (Math.min(r0.right, b0.right) - Math.max(r0.left, b0.left)) / 2;\n                  const q = { left: cx - r0.width / 2, width: r0.width, top: r0.top, height: r0.height }, h = doc2.elementFromPoint(cx, r0.top + r0.height / 2);\n                  box3.textContent += \"\\nH1344 (sealed targeting) tile \" + Math.round(r0.left) + \"-\" + Math.round(r0.right) + \" body \" + Math.round(b0.left) + \"-\" + Math.round(b0.right) + \" tray scrollLeft \" + f.scrollLeft + \" body scroll \" + Math.round(bd0.scrollLeft) + \"/\" + (bd0.scrollWidth - bd0.clientWidth) + \" overflowX \" + getComputedStyle(bd0).overflowX;\n                  const bd = f.querySelector(\"[data-ub-tbody]\").getBoundingClientRect(), cr = (f.querySelector(\".ub-lab__wtctl\") || f).getBoundingClientRect();\n                  box3.textContent += \"\\nH1344 centre \" + Math.round(q.left + q.width / 2) + \",\" + Math.round(q.top + q.height / 2) + \" -> \" + (h ? h === e || e.contains(h) ? \"the tile\" : h.tagName.toLowerCase() + \".\" + String(h.className && h.className.baseVal === void 0 ? h.className : \"svg\").split(\" \")[0] : \"none\") + \" \\xB7 body \" + Math.round(bd.left) + \"-\" + Math.round(bd.right) + \" \\xB7 controls \" + Math.round(cr.left) + \"-\" + Math.round(cr.right);\n                }\n              }\n              box3.textContent += \"\\nworktop: tile h \" + Math.round(tr.height) + \" \\xB7 tray visual h \" + Math.round(fr.height) + \" \\xB7 taller than a tile: \" + (tall.slice(0, 6).join(\", \") || \"none\") + \" \\xB7 wrapped labels \" + wrapped + \" \\xB7 controls \" + ctl.join(\"/\");\n            } catch (e) {\n              box3.textContent += \"\\nworktop measure failed: \" + e.message;\n            }\n          }\n          doc2.body.appendChild(box3);\n        }, 900);\n      } catch (e) {\n      }\n    }\n    return none;\n  }\n\n  // v2/src/ui/fronts-panel.js\n  function createFrontsPanel(ctx) {\n    const root = ctx.root, doc2 = root.ownerDocument || (typeof document !== \"undefined\" ? document : null);\n    const q = (s) => root.querySelector(s), qa = (s) => Array.prototype.slice.call(root.querySelectorAll(s));\n    const selected2 = () => {\n      const s = ctx.scene();\n      return (s.units || []).find((u) => u.id === s.selectedId) || null;\n    };\n    const kitchen = () => kitchenOf2(ctx.scene().kitchen);\n    const focused = (el) => doc2 && doc2.activeElement === el;\n    const show2 = (el, on) => {\n      if (el) {\n        if (on) el.removeAttribute(\"hidden\");\n        else el.setAttribute(\"hidden\", \"\");\n      }\n    };\n    const press = (b, on) => {\n      b.classList.toggle(\"is-active\", !!on);\n      b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n    };\n    for (const img of qa(\"[data-ub-fthumb]\")) {\n      const src = FRONT_THUMBS[img.getAttribute(\"data-ub-fthumb\")];\n      if (src) img.setAttribute(\"src\", src);\n    }\n    const styleBtns = qa(\"[data-ub-kstyle]\"), pocketBtns = qa(\"[data-ub-pockets]\"), modeBtns = qa(\"[data-ub-addmode]\");\n    const E = {\n      frameRow: q(\"[data-ub-kframerow]\"),\n      frame: q(\"[data-ub-kframe]\"),\n      styleNote: q(\"[data-ub-kstylenote]\"),\n      pocketRow: q(\"[data-ub-pocketrow]\"),\n      pocketNote: q(\"[data-ub-pocketnote]\"),\n      onePocket: q(\"[data-ub-onepocket]\"),\n      modeNote: q(\"[data-ub-addmodenote]\"),\n      dlist: q(\"[data-ub-dlist]\"),\n      dnote: q('[data-ub-groupnote=\"drawers\"]'),\n      dlistNote: q(\"[data-ub-dlistnote]\"),\n      dfRow: q(\"[data-ub-dfrontrow]\"),\n      dfBtn: q(\"[data-ub-dfronts]\"),\n      dfLabel: q(\"[data-ub-dfrontlabel]\"),\n      dAddRow: q(\"[data-ub-daddrow]\"),\n      dAdd: q(\"[data-ub-dadd]\"),\n      dSecs: q(\"[data-ub-dsecs]\"),\n      dDoorRow: q(\"[data-ub-ddoorrow]\"),\n      dDoor: q(\"[data-ub-ddoor]\"),\n      dDoorBtn: q(\"[data-ub-ddoorbtn]\"),\n      dDoorHRow: q(\"[data-ub-ddoorhrow]\"),\n      dDoorH: q(\"[data-ub-ddoorh]\"),\n      dDoorFull: q(\"[data-ub-ddoorfull]\")\n    };\n    let secPick = null;\n    if (E.dAdd) E.dAdd.addEventListener(\"click\", () => {\n      const u = selected2();\n      const pick = u && secPick && secPick.id === u.id ? { band: secPick.band, col: secPick.col } : {};\n      ctx.act(\"drawer.add\", pick);\n    });\n    const dragBtn = q(\"[data-ub-ddrag]\");\n    if (dragBtn && doc2) {\n      let dg = null;\n      const win2 = doc2.defaultView;\n      const canvasAt = (x, y) => {\n        const cv = root.querySelector(\".ub-lab__canvas\");\n        if (!cv || !cv.getBoundingClientRect) return false;\n        const r = cv.getBoundingClientRect();\n        if (!(x >= r.left && x <= r.right && y >= r.top && y <= r.bottom)) return false;\n        const el = doc2.elementFromPoint ? doc2.elementFromPoint(x, y) : null;\n        if (!el || !root.contains(el)) return false;\n        return !(el.closest && el.closest(\".ub-lab__flyout, .ub-lab__kmatpop, .ub-lab__dock, .ub-lab__eyemenu, .ub-lab__finpop, .ub-lab__panel\"));\n      };\n      const ghostAt = (x, y, state2) => {\n        if (!dg.ghost) return;\n        dg.ghost.style.left = Math.round(x) + \"px\";\n        dg.ghost.style.top = Math.round(y) + \"px\";\n        dg.ghost.classList.toggle(\"is-over\", state2 === \"ok\" || state2 === \"over\");\n        dg.ghost.classList.toggle(\"is-target\", state2 === \"ok\");\n        dg.ghost.classList.toggle(\"is-nofit\", state2 === \"nofit\");\n      };\n      let rafId = 0, pend = null;\n      const requestPreview = (x, y) => {\n        pend = { x, y };\n        if (rafId) return;\n        const raf = win2 && win2.requestAnimationFrame ? win2.requestAnimationFrame.bind(win2) : (f) => setTimeout(f, 16);\n        rafId = raf(() => {\n          rafId = 0;\n          if (!dg || !pend) return;\n          const q2 = pend;\n          pend = null;\n          previewAt(q2.x, q2.y);\n        });\n      };\n      const caption = (r) => {\n        const h = q(\"[data-ub-modehint]\");\n        if (!h || !dg) return;\n        if (dg.hint0 == null) dg.hint0 = h.textContent;\n        const t = !r || r.none ? \"Carry the drawer over a cabinet and let go at the height you want - Escape cancels\" : r.ok ? r.name + \" here: front \" + Math.round(r.fh) + \" mm at \" + Math.round(r.y) + \" mm\" + (r.box ? \", box \" + Math.round(r.box.y1 - r.box.y0) + \" mm\" : \"\") + (r.elsewhere ? \" (the room that is left)\" : r.asked != null && r.y !== r.asked ? \" (nearest place it fits)\" : \"\") + \" - let go to add it\" : \"No room for a drawer here: \" + (r.why || \"nothing fits\");\n        if (h.textContent !== t) h.textContent = t;\n        h.classList.add(\"is-dragtip\");\n        h.classList.toggle(\"is-nofit\", !!(r && !r.none && !r.ok));\n      };\n      const captionOff = (g2) => {\n        const h = q(\"[data-ub-modehint]\");\n        if (!h || g2.hint0 == null) return;\n        h.textContent = g2.hint0;\n        h.classList.remove(\"is-dragtip\", \"is-nofit\");\n      };\n      const previewAt = (x, y) => {\n        if (!dg) return;\n        if (!canvasAt(x, y)) {\n          if (dg.pv) {\n            dg.pv = null;\n            ctx.act(\"drawer.previewClear\", {});\n          }\n          ghostAt(x, y, \"off\");\n          caption(null);\n          return;\n        }\n        const r = ctx.act(\"drawer.preview\", { cx: x, cy: y }) || {};\n        dg.pv = r.none ? null : r;\n        ghostAt(x, y, r.none ? \"over\" : r.ok ? \"ok\" : \"nofit\");\n        caption(r);\n      };\n      const finish3 = (e, drop) => {\n        if (!dg) return;\n        const g2 = dg;\n        dg = null;\n        pend = null;\n        for (const [t, f] of g2.ls) win2.removeEventListener(t, f, true);\n        if (g2.ghost && g2.ghost.parentNode) g2.ghost.parentNode.removeChild(g2.ghost);\n        dragBtn.classList.remove(\"is-dragging\");\n        captionOff(g2);\n        if (!drop) {\n          if (g2.moved) ctx.act(\"drawer.previewClear\", {});\n          return;\n        }\n        if (!g2.moved) {\n          const u = selected2();\n          ctx.act(\"drawer.add\", u && secPick && secPick.id === u.id ? { band: secPick.band, col: secPick.col } : {});\n          return;\n        }\n        const at = canvasAt(e.clientX, e.clientY) ? ctx.act(\"drawer.preview\", { cx: e.clientX, cy: e.clientY }) || {} : null;\n        if (at && at.ok) ctx.act(\"drawer.dropAt\", { cx: e.clientX, cy: e.clientY });\n        else {\n          ctx.act(\"drawer.previewClear\", {});\n          if (at && !at.none && at.why && ctx.cue) ctx.cue(\"Not added: \" + at.why);\n        }\n      };\n      dragBtn.addEventListener(\"pointerdown\", (e) => {\n        if (e.button != null && e.button !== 0) return;\n        e.preventDefault();\n        e.stopPropagation();\n        if (dg) finish3(e, false);\n        dg = { x0: e.clientX, y0: e.clientY, moved: false, ghost: null, ls: [], pv: null, pid: e.pointerId };\n        const other = (ev) => !!(dg && dg.pid != null && ev && ev.pointerId != null && ev.pointerId !== dg.pid);\n        const mv = (ev) => {\n          if (!dg || other(ev)) return;\n          if (ev.isTrusted === true && ev.pointerType === \"mouse\" && ev.buttons === 0) {\n            finish3(ev, false);\n            return;\n          }\n          if (!dg.moved && Math.hypot(ev.clientX - dg.x0, ev.clientY - dg.y0) < 5) return;\n          if (!dg.moved) {\n            dg.moved = true;\n            dragBtn.classList.add(\"is-dragging\");\n            const gh = doc2.createElement(\"div\");\n            gh.className = \"ub-lab__dghost\";\n            gh.setAttribute(\"aria-hidden\", \"true\");\n            gh.innerHTML = dragBtn.querySelector(\"svg\") ? dragBtn.querySelector(\"svg\").outerHTML : \"\";\n            root.appendChild(gh);\n            dg.ghost = gh;\n          }\n          ev.preventDefault();\n          ghostAt(ev.clientX, ev.clientY, dg.pv ? dg.pv.ok ? \"ok\" : \"nofit\" : canvasAt(ev.clientX, ev.clientY) ? \"over\" : \"off\");\n          requestPreview(ev.clientX, ev.clientY);\n        };\n        const upF = (ev) => {\n          if (other(ev)) return;\n          ev.stopPropagation();\n          finish3(ev, true);\n        };\n        const cancel = (ev) => {\n          if (ev && ev.type === \"pointercancel\" && other(ev)) return;\n          finish3(ev, false);\n        };\n        const keyF = (ev) => {\n          if (ev.key === \"Escape\") {\n            ev.stopPropagation();\n            finish3(ev, false);\n          }\n        };\n        dg.ls = [[\"pointermove\", mv], [\"pointerup\", upF], [\"pointercancel\", cancel], [\"keydown\", keyF], [\"blur\", cancel]];\n        for (const [t, f] of dg.ls) win2.addEventListener(t, f, true);\n      });\n      try {\n        const W2 = win2, loc = W2 && W2.location, mm = loc ? /^#ub-dragin-(\\d{1,2})-(\\d{1,2})$/.exec(String(loc.hash || \"\")) : null;\n        const standHost = !!loc && /(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\");\n        if (mm && standHost && W2.setTimeout && W2.PointerEvent) W2.setTimeout(() => {\n          try {\n            const u = (ctx.scene().units || [])[Number(mm[1]) - 1];\n            const fly = q('[data-ub-fly=\"drawers\"]'), cv = q(\".ub-lab__canvas\");\n            if (!u || !fly || !cv || !ctx.view || !ctx.view.worldToNdc) return;\n            if (fly.getAttribute(\"aria-expanded\") !== \"true\") fly.click();\n            W2.setTimeout(() => {\n              const pct = Math.min(95, Math.max(5, Number(mm[2]))) / 100;\n              const w = unitXf(u).p([u.w / 2, u.h * pct, u.d + 20]), nd = ctx.view.worldToNdc(w);\n              const r = cv.getBoundingClientRect(), b = dragBtn.getBoundingClientRect();\n              if (!nd || !(b.width > 0)) return;\n              const tx = r.left + (nd[0] + 1) / 2 * r.width, ty = r.top + (1 - nd[1]) / 2 * r.height;\n              const bx2 = b.left + b.width / 2, by = b.top + b.height / 2;\n              const ev = (type, x, y, buttons) => new W2.PointerEvent(type, { clientX: x, clientY: y, button: 0, buttons, pointerId: 41, pointerType: \"mouse\", bubbles: true, cancelable: true });\n              dragBtn.dispatchEvent(ev(\"pointerdown\", bx2, by, 1));\n              let k = 0;\n              const step = () => {\n                k++;\n                W2.dispatchEvent(ev(\"pointermove\", bx2 + (tx - bx2) * k / 8, by + (ty - by) * k / 8, 1));\n                if (k < 8) {\n                  W2.setTimeout(step, 40);\n                  return;\n                }\n                const stand = /(^|\\.)cut\\.uniboards\\.co\\.uk$|^localhost$|^127\\./.test(loc.hostname || \"\");\n                if (stand && /[?&]qa_drop=1\\b/.test(loc.search || \"\")) W2.setTimeout(() => W2.dispatchEvent(ev(\"pointerup\", tx, ty, 0)), 300);\n              };\n              W2.setTimeout(step, 60);\n            }, 500);\n          } catch {\n          }\n        }, 1400);\n      } catch {\n      }\n      dragBtn.addEventListener(\"click\", (e) => {\n        if (e.detail === 0) {\n          const u = selected2();\n          ctx.act(\"drawer.add\", u && secPick && secPick.id === u.id ? { band: secPick.band, col: secPick.col } : {});\n        }\n      });\n    }\n    if (E.dDoorBtn) E.dDoorBtn.addEventListener(\"click\", () => ctx.act(\"unit.door\", {}));\n    if (E.dDoorH) {\n      E.dDoorH.addEventListener(\"change\", () => {\n        const v = Number(E.dDoorH.value);\n        if (E.dDoorH.value !== \"\" && v > 0) ctx.act(\"drawer.doorH\", { h: v });\n        else sync();\n      });\n      E.dDoorH.addEventListener(\"keydown\", (e) => {\n        e.stopPropagation();\n        if (e.key === \"Enter\") E.dDoorH.blur();\n      });\n    }\n    if (E.dDoorFull) E.dDoorFull.addEventListener(\"click\", () => ctx.act(\"drawer.doorH\", { h: \"full\" }));\n    if (E.dfBtn) E.dfBtn.addEventListener(\"click\", () => ctx.act(\"unit.drawerFronts\", {}));\n    for (const b of styleBtns) b.addEventListener(\"click\", () => ctx.act(\"kitchen.materials\", { frontStyle: b.getAttribute(\"data-ub-kstyle\") }));\n    {\n      const sw = q(\"[data-ub-glasssw]\");\n      if (sw) sw.addEventListener(\"click\", () => {\n        if (sw.disabled) return;\n        ctx.act(\"glass.toggle\", { on: sw.getAttribute(\"aria-checked\") !== \"true\" });\n      });\n    }\n    for (const b of pocketBtns) b.addEventListener(\"click\", () => ctx.act(\"tall.pockets\", { n: Number(b.getAttribute(\"data-ub-pockets\")) }));\n    for (const b of modeBtns) b.addEventListener(\"click\", () => ctx.act(\"unit.addMode\", { carcass: b.getAttribute(\"data-ub-addmode\") === \"carcass\" }));\n    if (E.frame) E.frame.addEventListener(\"change\", () => {\n      const v = Math.round(Number(E.frame.value));\n      if (!(v > 0)) {\n        sync();\n        return;\n      }\n      const r = ctx.act(\"kitchen.materials\", { shaker: { frame: v, rail: v } });\n      if (r && r.ok === false) {\n        E.frame.blur();\n        sync();\n      }\n    });\n    let chipsKey = \"\";\n    const mk = (tag, cls, text) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      if (text) e.textContent = text;\n      return e;\n    };\n    const D2 = {\n      edit: q(\"[data-ub-dedit]\"),\n      yRow: q(\"[data-ub-dyrow]\"),\n      y: q(\"[data-ub-dy]\"),\n      h: q(\"[data-ub-dh]\"),\n      boxRo: q(\"[data-ub-dboxro]\"),\n      open: q(\"[data-ub-dopen1]\"),\n      x: q(\"[data-ub-dx1]\"),\n      all: q(\"[data-ub-dall]\"),\n      cab: q(\"[data-ub-dcab]\"),\n      doorSep: q(\"[data-ub-ddoorsep]\")\n    };\n    function activeOf(u, list) {\n      const s = ctx.scene();\n      const i = s.drawerBox && s.drawerBox.id === u.id ? s.drawerBox.i : 0;\n      return list[Math.min(Math.max(0, i), list.length - 1)];\n    }\n    let forceNum = false;\n    const numIn = (el, fn) => {\n      if (!el) return;\n      el.addEventListener(\"change\", () => {\n        const v = Number(el.value);\n        if (el.value !== \"\" && isFinite(v) && v > 0) fn(v);\n        forceNum = true;\n        try {\n          sync();\n        } finally {\n          forceNum = false;\n        }\n      });\n      el.addEventListener(\"keydown\", (e) => {\n        e.stopPropagation();\n        if (e.key === \"Enter\") el.blur();\n        if (e.key === \"Escape\") {\n          el.blur();\n          sync();\n        }\n      });\n    };\n    const cur = () => {\n      const u = selected2();\n      const list = u ? drawerBoxes(u) : [];\n      return u && list.length ? { u, b: activeOf(u, list) } : null;\n    };\n    numIn(D2.h, (v) => {\n      const c = cur();\n      if (c) ctx.act(\"drawer.height\", { i: c.b.i, h: v });\n    });\n    numIn(D2.y, (v) => {\n      const c = cur();\n      if (c && c.b.xn != null) ctx.act(\"drawer.move\", { n: c.b.xn, y: v });\n    });\n    if (D2.open) D2.open.addEventListener(\"click\", () => {\n      const c = cur();\n      if (!c) return;\n      if (c.b.xn != null) ctx.act(\"drawer.openAdded\", { n: c.b.xn });\n      else if (c.u.type === \"base-4drawer\") ctx.act(\"drawer.toggle\", { i: c.b.i });\n    });\n    if (D2.x) D2.x.addEventListener(\"click\", () => {\n      const c = cur();\n      if (c && c.b.xn != null) ctx.act(\"drawer.remove\", { n: c.b.xn });\n    });\n    if (D2.all) D2.all.addEventListener(\"click\", () => ctx.act(\"drawer.all\", {}));\n    function buildChips(u, list) {\n      E.dlist.textContent = \"\";\n      for (const b of list) {\n        const c = mk(\"button\", \"ub-lab__btn ub-lab__dchip\", b.name.replace(/ box$/, \"\").replace(/ drawer$/, \"\"));\n        c.type = \"button\";\n        c.setAttribute(\"data-ub-dchip\", String(b.i));\n        if (b.xn != null) c.setAttribute(\"data-ub-dxrow\", String(b.xn));\n        c.addEventListener(\"click\", () => ctx.act(\"drawer.box\", { i: b.i }));\n        E.dlist.appendChild(c);\n      }\n    }\n    function syncAdd(u) {\n      const why = addDrawersWhy(u);\n      const able = !why;\n      show2(E.dAddRow, !!u);\n      if (E.dAdd) {\n        E.dAdd.setAttribute(\"aria-disabled\", able ? \"false\" : \"true\");\n        E.dAdd.title = able ? \"Put one drawer box into this cabinet - under the drawers already there; the door gets shorter\" : why;\n      }\n      const secs = able ? drawerSections(u) : [];\n      if (secPick && (!u || secPick.id !== u.id || !secs.some((c) => c.band === secPick.band && c.col === secPick.col))) secPick = null;\n      if (E.dSecs) {\n        const key = secs.map((c) => c.name).join(\"|\");\n        if (E.dSecs.getAttribute(\"data-key\") !== key) {\n          E.dSecs.textContent = \"\";\n          E.dSecs.setAttribute(\"data-key\", key);\n          secs.forEach((c) => {\n            const b = mk(\"button\", \"ub-lab__btn ub-lab__dsec\", c.name.replace(/ section$/, \"\").replace(/^./, (m) => m.toUpperCase()));\n            b.type = \"button\";\n            b.setAttribute(\"data-ub-dsec\", c.band + \".\" + c.col);\n            b.title = \"Next drawer in the \" + c.name + \" (\" + c.w + \" mm wide inside)\";\n            b.addEventListener(\"click\", () => {\n              const v = selected2();\n              if (!v) return;\n              secPick = { id: v.id, band: c.band, col: c.col };\n              sync();\n            });\n            E.dSecs.appendChild(b);\n          });\n        }\n        show2(E.dSecs, secs.length > 1);\n        for (const b of E.dSecs.querySelectorAll(\"[data-ub-dsec]\")) press(b, !!secPick && b.getAttribute(\"data-ub-dsec\") === secPick.band + \".\" + secPick.col);\n      }\n      const tallU = !!u && (u.type === \"tall-pantry\" || u.type === \"tall-oven\");\n      const doorAble = able && u.type !== \"base-4drawer\";\n      show2(E.dDoorRow, doorAble);\n      if (D2.doorSep) show2(D2.doorSep, doorAble);\n      if (doorAble && E.dDoor) {\n        const band = tallU ? null : doorBand(u);\n        const leaves = tallU && u.door ? tallLeaves(u) : [];\n        E.dDoor.textContent = !u.door ? \"No door\" : tallU ? leaves.length ? leaves.map((l) => l.name + \" \" + Math.round(l.y1 - l.y0) + \" mm\" + (l.short ? \" (shortened)\" : \"\")).join(\", \") : \"No room for the doors\" : !band ? \"Door\" : band.none ? \"No room for a door\" : (band.own ? \"Door, by hand\" : band.full ? \"Door\" : \"Door, shortened\") + (band.extra && band.extra.length ? \" + \" + band.extra.length + \" strip\" + (band.extra.length > 1 ? \"s\" : \"\") : \"\");\n        E.dDoor.title = !u.door ? \"No door - the drawers and the inside are open at the front\" : band && band.none ? \"No room for the door: the drawer fronts cover the whole face\" : u.type === \"base-drawer\" && !band ? \"The door under the top drawer\" : \"The door over the face the drawers leave\";\n        const single = !tallU && u.door && !(band && band.none);\n        show2(E.dDoorHRow, single);\n        show2(E.dDoorFull, single && !!(band && band.own));\n        if (single && E.dDoorH && !focused(E.dDoorH)) {\n          const r = doorRange(u);\n          E.dDoorH.value = String(Math.round(band ? band.y1 - band.y0 : r[1] - r[0]));\n          E.dDoorH.max = String(Math.floor(band ? band.room : r[1] - r[0]));\n          E.dDoorH.title = \"Door height: up to \" + E.dDoorH.max + \" mm (what the drawer fronts leave); lower leaves part of the face open\";\n        }\n        if (E.dDoorBtn) {\n          E.dDoorBtn.textContent = u.door ? \"Remove door\" : \"Fit door\";\n          E.dDoorBtn.title = u.door ? \"Take the door off - the drawers and shelves stay\" : \"Fit a door over the face the drawers leave\";\n          press(E.dDoorBtn, false);\n        }\n      }\n    }\n    function syncDrawers(u) {\n      if (!E.dlist || !doc2 || typeof doc2.createElement !== \"function\") return;\n      syncAdd(u);\n      const has = !!u && hasDrawerBoxes(u);\n      const why = addDrawersWhy(u);\n      if (D2.cab) D2.cab.textContent = u ? displayName(ctx.scene().units || [], u) : \"Drawers\";\n      const note = !u ? \"Select a cabinet to add or change its drawers.\" : has ? null : u.type === \"island\" ? \"An island's drawers belong to its sections - use its sections in the side panel.\" : why ? why + \".\" : \"No drawers yet - Add drawer puts one in; the door gets shorter.\";\n      if (E.dnote) {\n        E.dnote.textContent = note || \"\";\n        E.dnote.title = note || \"\";\n        show2(E.dnote, !!note);\n      }\n      if (!has) {\n        E.dlist.textContent = \"\";\n        chipsKey = \"\";\n        show2(D2.edit, false);\n        show2(D2.all, false);\n        show2(E.dlistNote, false);\n        return;\n      }\n      const list = drawerBoxes(u);\n      const key = u.id + \":\" + u.type + \":\" + list.map((b2) => b2.xn != null ? \"x\" + b2.xn : \"o\" + b2.i).join(\",\");\n      if (key !== chipsKey) {\n        buildChips(u, list);\n        chipsKey = key;\n      }\n      const b = activeOf(u, list);\n      for (const c of E.dlist.querySelectorAll(\"[data-ub-dchip]\")) press(c, Number(c.getAttribute(\"data-ub-dchip\")) === b.i);\n      show2(D2.edit, true);\n      const fh = Math.round(b.fy1 - b.fy0), name2 = b.name.replace(/ box$/, \"\");\n      D2.edit.setAttribute(\"aria-label\", name2);\n      D2.edit.setAttribute(\"data-ub-dactive\", String(b.i));\n      if (D2.h && (forceNum || !focused(D2.h))) D2.h.value = String(fh);\n      let rg = null;\n      try {\n        rg = drawerHeightRange(u, b.i);\n      } catch (err) {\n        rg = null;\n      }\n      if (D2.h) {\n        D2.h.setAttribute(\"aria-label\", name2 + \" height, mm - the front and its box change together\");\n        if (rg) {\n          D2.h.min = String(rg.lo);\n          D2.h.max = String(rg.hi);\n        }\n        D2.h.title = name2 + \": front and box change together; the box stays under the front\" + (rg ? \" - \" + rg.lo + \" to \" + rg.hi + \" mm fits here\" : \"\");\n      }\n      if (D2.boxRo) {\n        D2.boxRo.textContent = \"box \" + b.mm + \" mm\";\n        D2.boxRo.setAttribute(\"data-ub-boxmm\", String(b.mm));\n      }\n      const added = b.xn != null;\n      show2(D2.yRow, added);\n      if (added && D2.y && (forceNum || !focused(D2.y))) D2.y.value = String(Math.round(b.fy0));\n      show2(D2.x, added);\n      if (D2.x && added) D2.x.setAttribute(\"aria-label\", \"Take \" + name2 + \" out\");\n      const bank = u.type === \"base-4drawer\";\n      show2(D2.open, added || bank);\n      if (D2.open && (added || bank)) {\n        const on = added ? !!b.open : !!(u.drawers && u.drawers[b.i]);\n        press(D2.open, on);\n        D2.open.textContent = on ? \"Close\" : \"Open\";\n        D2.open.setAttribute(\"aria-label\", (on ? \"Close \" : \"Open \") + name2);\n      }\n      show2(D2.all, bank);\n      if (D2.all && bank) D2.all.textContent = u.drawers && u.drawers.every(Boolean) ? \"Close all\" : \"Open all\";\n      if (E.dlistNote) {\n        E.dlistNote.textContent = \"Height sets the drawer: its front and the box behind it change together - the box keeps its place under the front. \" + (list.some((x) => x.xn != null) ? \"At = where an added drawer's front starts above the cabinet bottom. \" : \"\") + \"On the cabinet, grab the line between two fronts and drag it up or down: one front grows and the one next to it shrinks by the same, the boxes follow.\";\n        show2(E.dlistNote, true);\n      }\n    }\n    function sync() {\n      const k = kitchen(), u = selected2(), scene = ctx.scene();\n      for (const b of styleBtns) press(b, k.frontStyle === b.getAttribute(\"data-ub-kstyle\"));\n      const shaker = k.frontStyle === \"shaker\";\n      show2(E.frameRow, shaker);\n      {\n        const gb = root.querySelector && root.querySelector(\"[data-ub-glassdrag]\");\n        if (gb) press(gb, !!u && u.ovStyle === \"glass\");\n      }\n      {\n        const sw = root.querySelector && root.querySelector(\"[data-ub-glasssw]\");\n        if (sw) {\n          const sc = ctx.scene(), su = sc && sc.selectedId ? (sc.units || []).find((v) => v.id === sc.selectedId) : null;\n          const on = !!su && su.ovStyle === \"glass\", can = !!su && (on || showsGlassDoor({ ...su, ovStyle: null }));\n          const nm = su ? displayName(sc.units, su) : \"\";\n          sw.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n          sw.classList.toggle(\"is-on\", on);\n          sw.disabled = !can;\n          const word = sw.querySelector(\"[data-ub-glassswword]\");\n          if (word) word.textContent = su ? \"Glass \\xB7 \" + nm : \"Glass\";\n          const tip = !su ? \"Select a cabinet to switch its glass doors on or off\" : !can ? nm + \" has no door big enough for a glass centre\" : on ? nm + \": glass doors ON - switch off to give it the kitchen's style again\" : nm + \": switch on for glass doors on this cabinet only\";\n          if (sw.title !== tip) {\n            sw.title = tip;\n            sw.setAttribute(\"aria-label\", tip);\n          }\n        }\n      }\n      if (E.frame && !focused(E.frame)) E.frame.value = String(k.shaker.frame);\n      if (E.styleNote) {\n        const st = styleOf(k.frontStyle);\n        const jp = k.frontStyle === \"jpull\";\n        const blocked = u ? jpullBlocked(u, ctx.scene().kitchen) : false;\n        E.styleNote.textContent = (isLegacyStyle(k.frontStyle) ? \"This plan has \" + st.long.toLowerCase() + \" fronts, kept as saved - grooves are no longer offered; choose Flat, Shaker or J-pull to change them. \" : jp ? \"J-pull fronts are painted MDF only: an integrated finger pull along the top of base doors and drawer fronts, the bottom of wall doors and the split of tall doors - no handles. The profile shown is nominal; its exact size and machining are confirmed with the quote. \" : st.routed ? st.name + \" fronts are routed from painted MDF. \" : \"Flat fronts come in Egger MFC or painted MDF (Doors). \") + (blocked ? \"The selected cabinet has Egger MFC fronts, so it stays Flat. \" : \"\") + (shaker ? \"Doors and drawer fronts are one panel each; a tall door can have 1, 2 or 4.\" : \"\");\n      }\n      const tall = u ? tallFronts(u) : [];\n      const own2 = !!u && u.frontStyle === \"shaker\";\n      show2(E.pocketRow, own2 && tall.length > 0);\n      if (own2 && tall.length) {\n        const n = tallPocketChoice(u);\n        for (const b of pocketBtns) press(b, Number(b.getAttribute(\"data-ub-pockets\")) === n);\n        const small = unitFronts(u).filter((f) => tall.every((t) => t.name !== f.name));\n        if (E.pocketNote) E.pocketNote.textContent = tall.map((f) => f.name + \" \" + f.h + \" mm\").join(\", \") + (small.length ? \". \" + small.map((f) => f.name).join(\", \") + \": one panel.\" : \".\");\n      }\n      const fronts = u ? unitFronts(u) : [];\n      if (E.onePocket) {\n        const say = own2 && !tall.length && fronts.length > 0;\n        E.onePocket.textContent = say ? \"This cabinet's fronts are one panel each - a door has to be 950 mm or taller to take 1, 2 or 4.\" : \"\";\n        show2(E.onePocket, say);\n      }\n      const added = !!u && Array.isArray(u.xdr) && u.xdr.length > 0;\n      const dfAble = !!u && (u.type === \"base-drawer\" || u.type === \"base-4drawer\" || u.type === \"island\" || added);\n      show2(E.dfRow, dfAble);\n      if (dfAble && E.dfBtn) {\n        const isle = u.type === \"island\";\n        const on = isle ? drawerFrontsOn(u) && islandBayDoorsOn(u) : drawerFrontsOn(u);\n        press(E.dfBtn, on);\n        const many = u.type === \"base-4drawer\" || added && u.xdr.length + (u.type === \"base-drawer\" ? 1 : 0) > 1;\n        if (E.dfLabel) E.dfLabel.textContent = isle ? \"Section fronts\" : many ? \"Drawer fronts\" : \"Drawer front\";\n        E.dfBtn.textContent = isle ? on ? \"Fronts: on\" : \"Add fronts\" : on ? many ? \"Drawer fronts: on\" : \"Drawer front: on\" : many ? \"Add drawer fronts\" : \"Add drawer front\";\n        E.dfBtn.title = on ? \"Take the fronts off - the drawer boxes stay, at their heights\" : \"Fit the fronts - the drawer boxes keep their heights\";\n      }\n      const carcass2 = !!scene.addCarcass;\n      for (const b of modeBtns) press(b, b.getAttribute(\"data-ub-addmode\") === \"carcass\" === carcass2);\n      show2(E.modeNote, carcass2);\n      syncDrawers(u);\n    }\n    sync();\n    return { sync };\n  }\n\n  // v2/src/ui/gola-panel.js\n  function createGolaPanel(ctx) {\n    const root = ctx.root, doc2 = root.ownerDocument || (typeof document !== \"undefined\" ? document : null);\n    const q = (s) => root.querySelector(s), qa = (s) => Array.prototype.slice.call(root.querySelectorAll(s));\n    const sec = q(\"[data-ub-gola]\");\n    if (!sec) return { sync() {\n    } };\n    const sw = qa(\"[data-ub-golasw]\"), nums = qa(\"[data-ub-golanum]\");\n    const E = {\n      nums: q(\"[data-ub-golanums]\"),\n      note: q(\"[data-ub-golanote]\"),\n      row: q(\"[data-ub-golarow]\"),\n      ubtn: q(\"[data-ub-ugola]\"),\n      unote: q(\"[data-ub-ugolanote]\")\n    };\n    const scene = () => ctx.scene();\n    const selected2 = () => {\n      const s = scene();\n      return (s.units || []).find((u) => u.id === s.selectedId) || null;\n    };\n    const press = (b, on) => {\n      b.classList.toggle(\"is-active\", !!on);\n      b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n    };\n    const show2 = (el, on) => {\n      if (el) {\n        if (on) el.removeAttribute(\"hidden\");\n        else el.setAttribute(\"hidden\", \"\");\n      }\n    };\n    const focused = (el) => doc2 && doc2.activeElement === el;\n    for (const b of sw) b.addEventListener(\"click\", () => {\n      const g2 = normGola(kitchenOf2(scene().kitchen).gola), wall = b.getAttribute(\"data-ub-golasw\") === \"wall\";\n      ctx.act(\"kitchen.gola\", wall ? { wall: !g2.wall } : { on: !g2.on });\n    });\n    for (const el of nums) {\n      const k = el.getAttribute(\"data-ub-golanum\");\n      el.addEventListener(\"change\", () => {\n        if (el.value === \"\") {\n          sync();\n          return;\n        }\n        const r = ctx.act(\"kitchen.gola\", { [k]: el.value });\n        if (!r || r.ok === false) sync();\n      });\n      el.addEventListener(\"keydown\", (e) => {\n        e.stopPropagation();\n        if (e.key === \"Enter\") el.blur();\n        if (e.key === \"Escape\") {\n          el.blur();\n          sync();\n        }\n      });\n    }\n    if (E.ubtn) E.ubtn.addEventListener(\"click\", () => {\n      const u = selected2();\n      if (!u) return;\n      ctx.act(\"unit.gola\", { on: u.ovGola === \"off\" });\n    });\n    function mm(v) {\n      return Math.round(v * 10) / 10 + \" mm\";\n    }\n    function sync() {\n      const s = scene(), units = s.units || [];\n      const g2 = normGola(kitchenOf2(s.kitchen).gola);\n      for (const b of sw) {\n        const wall = b.getAttribute(\"data-ub-golasw\") === \"wall\", on = wall ? g2.wall : g2.on;\n        b.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-on\", on);\n        b.classList.toggle(\"is-active\", on);\n        const t = \"Gola on \" + (wall ? \"wall\" : \"base\") + \" units: \" + (on ? \"on - press to switch off\" : \"off - press to switch on\") + \" (whole kitchen\" + (wall ? \"; the wall profile is quoted separately\" : \"\") + \")\";\n        if (b.getAttribute(\"aria-label\") !== t) {\n          b.setAttribute(\"aria-label\", t);\n          b.title = t;\n        }\n      }\n      show2(E.nums, g2.on);\n      for (const el of nums) {\n        const k = el.getAttribute(\"data-ub-golanum\");\n        if (!focused(el)) el.value = String(g2[k]);\n      }\n      if (E.note) {\n        const wl = golaWallText(units, s.kitchen);\n        const wallNote = wl ? \" Wall units: Gola requested - the wall profile has no verified installation drawing, so nothing is cut, drawn or priced for it; it is quoted separately.\" : \"\";\n        if (!g2.on) E.note.textContent = (g2.wall ? \"Base units: no Gola.\" : \"No handle is drawn. Gola: an aluminium finger-pull profile instead of handles - the J under the worktop, a C between drawers; the side panels are notched and the fronts made shorter.\") + wallNote;\n        else {\n          const any = units.find((u2) => golaFace(u2));\n          const j = any ? golaJ(any) : null;\n          const R4 = golaRuns(units);\n          const parts = [];\n          if (j && j.ok) parts.push(\"J \" + GOLA_PROFILES.J.sku + \": side notch \" + mm(j.down) + \" down x \" + j.back + \" mm back (\" + PLANNER_BASE_BUILD.what.replace(\" (no top cap)\", \"\") + \", so no top thickness is taken off\" + (j.raised ? \"; never under the profile's \" + GOLA_PROFILES.J.sectionHeight + \" mm section\" : \"\") + \" - to confirm with the supplier)\");\n          if (R4.C.runs) parts.push(\"C \" + GOLA_PROFILES.C.sku + \": notch \" + mm(GOLA_PROFILES.C.height + g2.clearance) + \" x \" + GOLA_PROFILES.C.back + \" mm at each drawer joint\");\n          for (const k of [\"J\", \"C\"]) if (R4[k].runs) parts.push(k + \" profile \" + (R4[k].total / 1e3).toFixed(2) + \" m in \" + R4[k].runs + \" run\" + (R4[k].runs === 1 ? \"\" : \"s\") + \" = \" + R4[k].bars + \" x 4.1 m bar\" + (R4[k].bars === 1 ? \"\" : \"s\"));\n          const notes = golaNotes(units);\n          E.note.textContent = (parts.length ? parts.join(\". \") + \". Profiles are not priced here - they are listed in the enquiry. \" : \"No base cabinet takes Gola yet - add a base cabinet. \") + (notes.length ? \"Not handleless: \" + notes.join(\"; \") + \".\" : \"\") + wallNote;\n        }\n      }\n      const u = selected2();\n      const why = u ? golaWhyNot(u) : \"x\";\n      show2(E.row, !!(u && g2.on));\n      if (E.ubtn) {\n        E.ubtn.disabled = !!why;\n        press(E.ubtn, !!(u && golaFace(u)));\n        E.ubtn.textContent = u && golaFace(u) ? \"Gola on this cabinet\" : \"No Gola on this cabinet\";\n      }\n      if (E.unote) E.unote.textContent = !u ? \"\" : why ? why : golaFace(u) ? golaRecesses(u).map((r) => r.kind === \"J\" ? \"J \" + r.down + \" x \" + r.back : \"C \" + r.height + \" x \" + r.back).join(\" + \") : \"Its fronts keep their usual size\";\n    }\n    sync();\n    return { sync };\n  }\n\n  // v2/src/ui/radial-menu.js\n  var RADIUS = 19;\n  var ICON3 = 28;\n  var MARGIN = 4;\n  var SPOTS = { rotate: [0, -1], pan: [1, 0], cabinet: [0, 1], size: [-1, 0] };\n  var TOOLBAR = { rotate: \"[data-ub-mode-rotate]\", pan: \"[data-ub-mode-pan]\", cabinet: \"[data-ub-mode-move]\", size: \"[data-ub-mode-size]\" };\n  function ringCentre(x, y, w, h) {\n    const reach = RADIUS + ICON3 / 2 + MARGIN;\n    const fit = (v, len) => len < 2 * reach ? len / 2 : Math.min(Math.max(v, reach), len - reach);\n    return [fit(x, w), fit(y, h)];\n  }\n  function createRadialMenu(ctx) {\n    const root = ctx.root, view = ctx.view;\n    const finBtn = root.querySelector(\"[data-ub-finbtn]\");\n    const host = finBtn ? finBtn.parentNode : null;\n    const doc2 = root.ownerDocument;\n    if (!host || !doc2) return { sync() {\n    }, frame() {\n    } };\n    const layer2 = doc2.createElement(\"div\");\n    layer2.className = \"ub-lab__radial\";\n    layer2.setAttribute(\"data-ub-radial\", \"\");\n    layer2.setAttribute(\"role\", \"menu\");\n    layer2.setAttribute(\"aria-label\", \"Choose what dragging does\");\n    layer2.setAttribute(\"hidden\", \"\");\n    host.appendChild(layer2);\n    const stop = (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n    };\n    for (const t of [\"mousedown\", \"pointerdown\", \"dblclick\", \"touchstart\", \"wheel\"]) layer2.addEventListener(t, stop, t === \"touchstart\" || t === \"wheel\" ? { passive: true } : void 0);\n    const TAP_PX = 6;\n    let held = null, fwd = false;\n    const toCanvas = (t, e) => {\n      if (ctx.act) ctx.act(\"view.canvasTouch\", { type: t, event: e });\n    };\n    const pt = (e) => {\n      const q = e.touches && e.touches[0] || e.changedTouches && e.changedTouches[0];\n      return q ? [q.clientX, q.clientY] : null;\n    };\n    layer2.addEventListener(\"touchstart\", (e) => {\n      const sc = ctx.scene();\n      fwd = false;\n      held = sc && sc.radial && sc.radial.auto && e.touches && e.touches.length === 1 ? { e, at: pt(e) } : null;\n    }, { passive: true });\n    layer2.addEventListener(\"touchmove\", (e) => {\n      if (!fwd && held) {\n        const p = pt(e);\n        if (!p || !held.at || Math.hypot(p[0] - held.at[0], p[1] - held.at[1]) < TAP_PX) return;\n        fwd = true;\n        toCanvas(\"touchstart\", held.e);\n      }\n      if (fwd) toCanvas(\"touchmove\", e);\n    }, { passive: false });\n    for (const t of [\"touchend\", \"touchcancel\"])\n      layer2.addEventListener(t, (e) => {\n        if (fwd) toCanvas(t, e);\n        fwd = false;\n        held = null;\n      }, { passive: true });\n    const btns = {};\n    for (const mode of Object.keys(SPOTS)) {\n      const b = doc2.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"ub-lab__radialbtn\";\n      b.setAttribute(\"data-ub-radial-mode\", mode);\n      b.setAttribute(\"role\", \"menuitemradio\");\n      const src = root.querySelector(TOOLBAR[mode] + \" svg\");\n      if (src) b.appendChild(src.cloneNode(true));\n      b.style.setProperty(\"--ub-rdx\", SPOTS[mode][0] * RADIUS + \"px\");\n      b.style.setProperty(\"--ub-rdy\", SPOTS[mode][1] * RADIUS + \"px\");\n      b.addEventListener(\"click\", (e) => {\n        stop(e);\n        if (e && typeof e.timeStamp === \"number\" && e.timeStamp > 0 && e.timeStamp < openedAt) return;\n        ctx.act(\"view.radialChoose\", { mode });\n      });\n      layer2.appendChild(b);\n      btns[mode] = b;\n    }\n    function clearOfControls(c, w, h) {\n      const cv = root.querySelector(\".ub-lab__canvas\");\n      if (!cv || !cv.getBoundingClientRect) return c;\n      const cr = cv.getBoundingClientRect(), reach = RADIUS + ICON3 / 2 + 2, obs = [];\n      for (const e of root.querySelectorAll(\".ub-lab__tool, .ub-lab__toolgrp button, .ub-lab__dock button, .ub-chef button, [data-ub-fly], [data-ub-itoolbar]\")) {\n        if (layer2.contains(e) || e.hidden || e.closest && e.closest(\"[hidden]\")) continue;\n        const r = e.getBoundingClientRect();\n        if (!(r.width > 0) || !(r.height > 0)) continue;\n        if (r.right <= cr.left || r.left >= cr.right || r.bottom <= cr.top || r.top >= cr.bottom) continue;\n        obs.push({ x0: r.left - cr.left, y0: r.top - cr.top, x1: r.right - cr.left, y1: r.bottom - cr.top });\n      }\n      const hits = (p2) => obs.some((r) => p2[0] + reach > r.x0 && p2[0] - reach < r.x1 && p2[1] + reach > r.y0 && p2[1] - reach < r.y1);\n      if (!hits(c)) return c;\n      const m = RADIUS + ICON3 / 2 + 4, p = nearestFreeSpot({ x: c[0] - reach, y: c[1] - reach }, 2 * reach, 2 * reach, { x0: m - reach, y0: m - reach, x1: w - m + reach, y1: h - m + reach }, obs, 0, 4);\n      return p ? [p.x + reach, p.y + reach] : c;\n    }\n    let shownAt = null;\n    let openedAt = -Infinity;\n    function sync() {\n      const scene = ctx.scene();\n      const at = scene && scene.radial;\n      if (!at) {\n        layer2.setAttribute(\"hidden\", \"\");\n        layer2.classList.remove(\"is-open\");\n        shownAt = null;\n        return;\n      }\n      const cs = view && view.canvasSize ? view.canvasSize() : { w: 600, h: 440 };\n      let c = ringCentre(at.x, at.y, cs.w || 600, cs.h || 440);\n      c = clearOfControls(c, cs.w || 600, cs.h || 440);\n      layer2.style.left = Math.round(c[0]) + \"px\";\n      layer2.style.top = Math.round(c[1]) + \"px\";\n      const opts = radialOptions(scene);\n      for (const mode of Object.keys(btns)) {\n        const b = btns[mode], o = opts ? opts.find((q) => q.mode === mode) : null;\n        const name2 = o ? o.label : mode;\n        const why = o && o.disabled;\n        b.setAttribute(\"aria-checked\", o && o.current ? \"true\" : \"false\");\n        b.classList.toggle(\"is-current\", !!(o && o.current));\n        b.classList.toggle(\"is-disabled\", !!why);\n        if (why) b.setAttribute(\"aria-disabled\", \"true\");\n        else b.removeAttribute(\"aria-disabled\");\n        const label = why ? name2 + \" - \" + why : name2;\n        if (b.getAttribute(\"aria-label\") !== label) {\n          b.setAttribute(\"aria-label\", label);\n          b.title = label;\n        }\n      }\n      const key = at.x + \",\" + at.y;\n      if (shownAt !== key) {\n        shownAt = key;\n        {\n          const w = doc2.defaultView;\n          openedAt = w && w.performance && w.performance.now ? w.performance.now() : -Infinity;\n        }\n        layer2.classList.remove(\"is-open\");\n        layer2.removeAttribute(\"hidden\");\n        void layer2.offsetWidth;\n        layer2.classList.add(\"is-open\");\n      }\n    }\n    return { sync, frame() {\n    }, el: layer2, buttons: btns };\n  }\n\n  // v2/src/ui/size-labels.js\n  var GAP3 = 6;\n  function polyRectHit(poly, r) {\n    const rp = [[r.x0, r.y0], [r.x1, r.y0], [r.x1, r.y1], [r.x0, r.y1]];\n    const axes = [[1, 0], [0, 1]];\n    for (let i = 0; i < poly.length; i++) {\n      const a = poly[i], b = poly[(i + 1) % poly.length];\n      axes.push([-(b[1] - a[1]), b[0] - a[0]]);\n    }\n    for (const ax of axes) {\n      let p0 = Infinity, p1 = -Infinity, q0 = Infinity, q1 = -Infinity;\n      for (const p of poly) {\n        const d = p[0] * ax[0] + p[1] * ax[1];\n        if (d < p0) p0 = d;\n        if (d > p1) p1 = d;\n      }\n      for (const p of rp) {\n        const d = p[0] * ax[0] + p[1] * ax[1];\n        if (d < q0) q0 = d;\n        if (d > q1) q1 = d;\n      }\n      if (p1 <= q0 || q1 <= p0) return false;\n    }\n    return true;\n  }\n  function rectsOverlap(a, b) {\n    return !(a.x1 <= b.x0 || b.x1 <= a.x0 || a.y1 <= b.y0 || b.y1 <= a.y0);\n  }\n  var grow2 = (r, g2) => ({ x0: r.x0 - g2, y0: r.y0 - g2, x1: r.x1 + g2, y1: r.y1 + g2 });\n  var rectAt2 = (x, y, w, h) => ({ x0: x - w / 2, y0: y - h / 2, x1: x + w / 2, y1: y + h / 2 });\n  function arrowPoly(a, g2) {\n    g2 = g2 || 0;\n    const ux = a.ux, uy = a.uy, nx = -uy, ny = ux, t = a.athk / 2 + g2;\n    const x0 = a.rootX - ux * g2, y0 = a.rootY - uy * g2;\n    const x1 = a.rootX + ux * (a.alen + g2), y1 = a.rootY + uy * (a.alen + g2);\n    return [[x0 + nx * t, y0 + ny * t], [x1 + nx * t, y1 + ny * t], [x1 - nx * t, y1 - ny * t], [x0 - nx * t, y0 - ny * t]];\n  }\n  function gripPoly(a, g2) {\n    if (!a || a.gripHalf == null) return null;\n    g2 = g2 || 0;\n    const cx = a.gripX != null ? a.gripX : a.rootX, cy = a.gripY != null ? a.gripY : a.rootY, L = a.gripHalf + g2, t = 8 + g2, nx = -a.uy, ny = a.ux;\n    return [\n      [cx - a.ux * L + nx * t, cy - a.uy * L + ny * t],\n      [cx + a.ux * L + nx * t, cy + a.uy * L + ny * t],\n      [cx + a.ux * L - nx * t, cy + a.uy * L - ny * t],\n      [cx - a.ux * L - nx * t, cy - a.uy * L - ny * t]\n    ];\n  }\n  function layoutSizeLabels(items, arrows, obstacles, cw, ch) {\n    const polys = (arrows || []).map((a) => arrowPoly(a, GAP3));\n    const grips = (arrows || []).map((a) => gripPoly(a, 2)).filter(Boolean);\n    const blocks = (obstacles || []).map((o) => grow2(o, GAP3));\n    const placed = [], out = {};\n    const M = 4;\n    const free = (r, ownArrow) => r.x0 >= M && r.y0 >= M && r.x1 <= cw - M && r.y1 <= ch - M && !polys.some((p, i) => ownArrow != null && arrows[i] === ownArrow ? polyRectHit(arrowPoly(ownArrow, 0), r) : polyRectHit(p, r)) && !blocks.some((b) => rectsOverlap(b, r)) && !grips.some((p) => polyRectHit(p, r)) && !placed.some((q) => rectsOverlap(grow2(q, GAP3), r));\n    const put = (it, x, y, how) => {\n      const r = rectAt2(x, y, it.w, it.h);\n      out[it.k] = { x, y, rect: r, how };\n      placed.push(r);\n    };\n    const order = items.slice().sort((a, b) => (a.arrow ? 0 : 1) - (b.arrow ? 0 : 1));\n    for (const it of order) {\n      const cands = [];\n      const a = it.arrow;\n      const half = (vx, vy) => Math.abs(vx) * it.w / 2 + Math.abs(vy) * it.h / 2;\n      if (a) {\n        const horiz = Math.abs(a.ux) >= Math.abs(a.uy);\n        let placedBase = false;\n        const ownGrip = gripPoly(a, 2);\n        for (let g2 = 3; g2 <= 90 && !placedBase; g2 += 1) {\n          const bx3 = horiz ? a.rootX - Math.sign(a.ux || 1) * (it.w / 2 + g2) : a.rootX;\n          const by2 = horiz ? a.rootY : a.rootY - Math.sign(a.uy || 1) * (it.h / 2 + g2);\n          const r = rectAt2(bx3, by2, it.w, it.h);\n          if (polyRectHit(arrowPoly(a, 2), r) || ownGrip && polyRectHit(ownGrip, r)) continue;\n          if (free(r, a)) {\n            put(it, bx3, by2, \"base\");\n            placedBase = true;\n          }\n          break;\n        }\n        if (placedBase) continue;\n        const hb = half(a.ux, a.uy) + 3;\n        const bx2 = a.rootX - a.ux * hb, by = a.rootY - a.uy * hb;\n        if (free(rectAt2(bx2, by, it.w, it.h), a)) {\n          put(it, bx2, by, \"base-side\");\n          continue;\n        }\n        let nx = -a.uy, ny = a.ux;\n        if (ny > 0) {\n          nx = -nx;\n          ny = -ny;\n        }\n        let done0 = false;\n        for (const s of [1, -1]) {\n          const d = a.athk / 2 + 3 + half(nx, ny);\n          for (const t of [0, hb]) {\n            const x = a.rootX - a.ux * t + nx * s * d, y = a.rootY - a.uy * t + ny * s * d;\n            if (free(rectAt2(x, y, it.w, it.h), a)) {\n              put(it, x, y, \"base-side\");\n              done0 = true;\n              break;\n            }\n          }\n          if (done0) break;\n        }\n        if (done0) continue;\n      }\n      if (a) {\n        const ux = a.ux, uy = a.uy;\n        let nx = -uy, ny = ux;\n        if (ny > 0) {\n          nx = -nx;\n          ny = -ny;\n        }\n        for (const extra of [0, it.h * 0.9, it.h * 2]) {\n          for (const t of [0.5, 0.3, 0.75])\n            for (const s of [1, -1]) {\n              const d = a.athk / 2 + GAP3 + 1 + half(nx, ny) + extra;\n              cands.push([a.rootX + ux * a.alen * t + nx * s * d, a.rootY + uy * a.alen * t + ny * s * d, \"beside\"]);\n            }\n          const dt = GAP3 + 1 + half(ux, uy) + extra;\n          cands.push([a.rootX + ux * (a.alen + dt), a.rootY + uy * (a.alen + dt), \"beyond\"]);\n          cands.push([a.rootX - ux * dt, a.rootY - uy * dt, \"behind\"]);\n        }\n      }\n      const an = it.anchor || (a ? { x: a.rootX, y: a.rootY } : null);\n      if (an) {\n        for (const rad of [0, 18, 34, 52, 74, 100, 130])\n          for (let i = 0; i < (rad ? 8 : 1); i++) {\n            const ang = -Math.PI / 2 + i * Math.PI / 4;\n            cands.push([an.x + Math.cos(ang) * (rad + it.w * 0.2 * (rad ? 1 : 0)), an.y + Math.sin(ang) * rad, \"near\"]);\n          }\n      }\n      let done2 = false;\n      for (const [x, y, how] of cands) {\n        if (free(rectAt2(x, y, it.w, it.h))) {\n          put(it, x, y, how);\n          done2 = true;\n          break;\n        }\n      }\n      if (done2) continue;\n      const c0 = an || { x: cw / 2, y: ch / 2 };\n      let best = null, bd = Infinity;\n      for (let y = M + it.h / 2; y <= ch - M - it.h / 2; y += 8)\n        for (let x = M + it.w / 2; x <= cw - M - it.w / 2; x += 8) {\n          const d = Math.hypot(x - c0.x, y - c0.y);\n          if (d >= bd) continue;\n          if (free(rectAt2(x, y, it.w, it.h))) {\n            bd = d;\n            best = [x, y];\n          }\n        }\n      if (best) put(it, best[0], best[1], \"canvas\");\n      else {\n        const x = Math.min(Math.max(c0.x, it.w / 2 + M), cw - it.w / 2 - M), y = Math.min(Math.max(c0.y, it.h / 2 + M), ch - it.h / 2 - M);\n        put(it, x, y, \"forced\");\n      }\n    }\n    return out;\n  }\n  function labelChip(text, fontPx) {\n    return { w: Math.ceil(18 + fontPx * 0.62 * text.length), h: Math.ceil(fontPx + 11) };\n  }\n  function buildLabelItems(specs, arrows, lineMid, toPx2, fontPx, measure) {\n    const items = [];\n    for (const sp of specs) {\n      const txt = Math.round(sp.value) + \" mm\";\n      const m = measure ? measure(sp.k, txt) : null;\n      const size3 = m && m.w > 4 && m.h > 4 ? { w: Math.ceil(m.w), h: Math.ceil(m.h) } : labelChip(txt, fontPx);\n      const mine = (arrows || []).filter((a) => String(a.hid).split(\":\").slice(-2)[0] === sp.k);\n      mine.sort((a, b) => (String(b.hid).endsWith(\":hi\") ? 1 : 0) - (String(a.hid).endsWith(\":hi\") ? 1 : 0));\n      let anchor = lineMid && lineMid[sp.k] ? lineMid[sp.k] : null;\n      if (!anchor) anchor = toPx2([(sp.p0[0] + sp.p1[0]) / 2, (sp.p0[1] + sp.p1[1]) / 2, (sp.p0[2] + sp.p1[2]) / 2]);\n      items.push({ k: sp.k, text: txt, w: size3.w, h: size3.h, arrow: mine[0] || null, anchor });\n    }\n    return items;\n  }\n\n  // v2/src/ui/size-overlay.js\n  function quadPt2(q, a, b) {\n    const x = (1 - a) * (1 - b) * q[0][0] + a * (1 - b) * q[1][0] + a * b * q[2][0] + (1 - a) * b * q[3][0];\n    const y = (1 - a) * (1 - b) * q[0][1] + a * (1 - b) * q[1][1] + a * b * q[2][1] + (1 - a) * b * q[3][1];\n    return { x, y };\n  }\n  function quadArea2(q) {\n    let a = 0;\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      a += q[i][0] * q[j][1] - q[j][0] * q[i][1];\n    }\n    return a / 2;\n  }\n  function pointInQuad2(q, x, y) {\n    let pos = 0, neg3 = 0;\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      const cr = (q[j][0] - q[i][0]) * (y - q[i][1]) - (q[j][1] - q[i][1]) * (x - q[i][0]);\n      if (cr > 0) pos++;\n      else if (cr < 0) neg3++;\n    }\n    return pos === 0 || neg3 === 0;\n  }\n  function rectInQuad2(q, r) {\n    return pointInQuad2(q, r.x0, r.y0) && pointInQuad2(q, r.x1, r.y0) && pointInQuad2(q, r.x1, r.y1) && pointInQuad2(q, r.x0, r.y1);\n  }\n  function quadSpan2(q) {\n    let m = 1e9;\n    for (let i = 0; i < 4; i++) {\n      const j = (i + 1) % 4;\n      m = Math.min(m, Math.hypot(q[j][0] - q[i][0], q[j][1] - q[i][1]));\n    }\n    return m;\n  }\n  function rectAt3(cx, cy, w, h) {\n    return { x0: cx - w / 2, y0: cy - h / 2, x1: cx + w / 2, y1: cy + h / 2 };\n  }\n  function rectsHit2(a, b) {\n    return !(a.x1 <= b.x0 || b.x1 <= a.x0 || a.y1 <= b.y0 || b.y1 <= a.y0);\n  }\n  function rectAtClash2(r, list) {\n    return list.some(function(o) {\n      return rectsHit2(r, o);\n    });\n  }\n  var SIZE_UI2 = {\n    /* below this the cabinet is simply too small to edit on: show nothing\n       but a quiet hint. Between the two, controls scale with the cabinet. */\n    spanHide: 54,\n    spanFull: 170,\n    gripMin: 14,\n    gripMax: 26,\n    // hit target, scaled by how much room\n    glyphMin: 7,\n    glyphMax: 11,\n    // the ARROW stays small even close up\n    fontMin: 8,\n    fontMax: 12,\n    inset: 0.1\n    // keep clear of the face's own edges\n  };\n  function sizeSpecs2(u) {\n    const base = u.y || 0, top = base + u.h, out = [];\n    function spec(k, name2, value, p0, p1, grow3, face2, along2, rank) {\n      return {\n        k,\n        label: name2,\n        name: name2,\n        value,\n        p0,\n        p1,\n        grow: grow3,\n        tip: p1,\n        face: face2,\n        along: along2,\n        rank,\n        vertical: Math.abs(grow3[1]) > 0.5\n      };\n    }\n    const pinAt = hugPointOf(u);\n    function freeEnd(e0, e1) {\n      if (!pinAt) return { pin: e0, free: e1 };\n      const d0 = Math.hypot(e0[0] - pinAt.x, e0[2] - pinAt.z);\n      const d1 = Math.hypot(e1[0] - pinAt.x, e1[2] - pinAt.z);\n      return d0 <= d1 ? { pin: e0, free: e1 } : { pin: e1, free: e0 };\n    }\n    function armSpec(k, name2, value, e0, e1, face2, rank) {\n      const m = freeEnd(e0, e1);\n      const vx = m.free[0] - m.pin[0], vz = m.free[2] - m.pin[2];\n      const L = Math.hypot(vx, vz) || 1;\n      const sp = spec(k, name2, value, m.pin, m.free, [vx / L, 0, vz / L], face2, \"u\", rank);\n      sp.freeEndOnly = true;\n      sp.pinAt = m.pin;\n      sp.freeAt = m.free;\n      return sp;\n    }\n    if (isLPlan(u)) {\n      const E = unitEnvelope(u), xf = planXf(u, E.LX, E.LZ);\n      const A = armA(u), B = armB(u), D2 = u.d;\n      const P2 = function(x, y, z) {\n        const q = xf.p([x, 0, z]);\n        return [q[0], y, q[2]];\n      };\n      const f12 = [P2(0, base, D2), P2(A, base, D2), P2(A, top, D2), P2(0, top, D2)];\n      const f2 = [P2(A, base, 0), P2(A, base, B), P2(A, top, B), P2(A, top, 0)];\n      const fd = [P2(0, base, 0), P2(0, base, D2), P2(0, top, D2), P2(0, top, 0)];\n      const f1b = [P2(A, base, 0), P2(0, base, 0), P2(0, top, 0), P2(A, top, 0)];\n      out.push(armSpec(\"w\", \"Arm 1\", A, P2(0, base, D2), P2(A, base, D2), f12, 0));\n      out[out.length - 1].alt = f1b;\n      out.push(armSpec(\"w2\", \"Arm 2\", B, P2(A, base, 0), P2(A, base, B), f2, 1));\n      out.push(spec(\"d\", \"Depth\", D2, P2(0, base, 0), P2(0, base, D2), xf.n([0, 0, 1]), fd, \"u\", 2));\n      out[out.length - 1].freeEndOnly = true;\n      out[out.length - 1].pinAt = P2(0, base, 0);\n      out[out.length - 1].freeAt = P2(0, base, D2);\n      out.push(spec(\"h\", \"Height\", u.h, P2(A, base, D2), P2(A, top, D2), [0, 1, 0], f12, \"v\", -1));\n      out[out.length - 1].alt = f1b;\n      return out;\n    }\n    const xf2 = planXf(u, u.w, u.d);\n    const Q = function(x, y, z) {\n      const q = xf2.p([x, 0, z]);\n      return [q[0], y, q[2]];\n    };\n    const W2 = u.w, Dd = u.d;\n    const front = [Q(0, base, Dd), Q(W2, base, Dd), Q(W2, top, Dd), Q(0, top, Dd)];\n    const back = [Q(W2, base, 0), Q(0, base, 0), Q(0, top, 0), Q(W2, top, 0)];\n    const right = [Q(W2, base, 0), Q(W2, base, Dd), Q(W2, top, Dd), Q(W2, top, 0)];\n    const left = [Q(0, base, Dd), Q(0, base, 0), Q(0, top, 0), Q(0, top, Dd)];\n    out.push(spec(\"w\", \"Width\", W2, Q(0, base, Dd), Q(W2, base, Dd), xf2.n([1, 0, 0]), front, \"u\", 1));\n    out[0].alt = back;\n    out[0].q0 = Q(0, base, Dd);\n    out[0].q1 = Q(W2, base, Dd);\n    out[0].aq0 = Q(W2, base, 0);\n    out[0].aq1 = Q(0, base, 0);\n    out.push(spec(\"h\", \"Height\", u.h, Q(W2, base, Dd), Q(W2, top, Dd), [0, 1, 0], front, \"v\", 0));\n    out[out.length - 1].freeEndOnly = true;\n    out[out.length - 1].pinAt = Q(W2, base, Dd);\n    out[out.length - 1].freeAt = Q(W2, top, Dd);\n    out[1].alt = back;\n    out.push(spec(\"d\", \"Depth\", Dd, Q(W2, base, 0), Q(W2, base, Dd), xf2.n([0, 0, 1]), right, \"u\", 2));\n    out[2].alt = left;\n    out[2].q0 = Q(W2, base, 0);\n    out[2].q1 = Q(W2, base, Dd);\n    out[2].aq0 = Q(0, base, Dd);\n    out[2].aq1 = Q(0, base, 0);\n    return out;\n  }\n  function dimLimits(units, u, k) {\n    const LIM = limitsFor(u);\n    const lim = (LIM[k] || LIM.w).slice();\n    if (k === \"w\") lim[0] = Math.max(lim[0], structuralWidthMin(u));\n    if (k === \"d\" && u.family === \"corner\") lim[1] = Math.max(lim[0], maxCornerDepth(u));\n    if (k === \"w\" && u.fitted && !isLPlan(u) && (u.family === \"base\" || u.family === \"wall\"))\n      lim[0] = Math.min(lim[0], FIT_MIN);\n    if ((k === \"w\" || k === \"w2\") && isLPlan(u)) {\n      const reach = armRoomMax(units, u, k);\n      if (reach != null) lim[1] = Math.max(lim[0], Math.min(lim[1], reach));\n    }\n    return lim;\n  }\n  function currentDim(u, k) {\n    return k === \"w2\" ? armB(u) : u ? u[k] : 0;\n  }\n  function createSizeOverlay(ctx) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win, view = ctx.view;\n    const host = root.querySelector(\"[data-ub-size]\");\n    const KEYS = [\"w\", \"w2\", \"h\", \"d\"];\n    const S2 = { els: null, lines: null, hint: null, fields: null, dragging: false };\n    let lastPtr = null;\n    if (root && root.addEventListener) for (const t of [\"pointermove\", \"pointerdown\"]) root.addEventListener(t, (e) => {\n      lastPtr = [e.clientX, e.clientY];\n    }, { passive: true, capture: true });\n    function projQuad(face2, cw, ch) {\n      const out = [];\n      for (let i = 0; i < 4; i++) {\n        const nd = view.worldToNdc(face2[i]);\n        if (!nd) return null;\n        out.push([(nd[0] + 1) / 2 * cw, (1 - nd[1]) / 2 * ch]);\n      }\n      return out;\n    }\n    function setActiveDim(k) {\n      const scene = ctx.scene();\n      if (scene.activeDim === k) return;\n      scene.activeDim = k || null;\n      if (S2.els) paintActiveDim();\n    }\n    function paintActiveDim() {\n      const active = ctx.scene().activeDim;\n      for (const k of KEYS) {\n        const el = S2.els && S2.els[k];\n        if (!el) continue;\n        const on = active === k;\n        for (const n of [el.val, el.grip, el.grip0]) {\n          if (!n) continue;\n          if (on) n.classList.add(\"is-active\");\n          else n.classList.remove(\"is-active\");\n        }\n      }\n      if (S2.lines) S2.lines.setAttribute(\"data-active\", active || \"\");\n    }\n    function ensureSizeLines() {\n      if (S2.lines) return S2.lines;\n      if (!host) return null;\n      S2.lines = doc2.createElementNS ? doc2.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\") : doc2.createElement(\"svg\");\n      S2.lines.setAttribute(\"class\", \"ub-lab__sizelines\");\n      S2.lines.setAttribute(\"aria-hidden\", \"true\");\n      host.appendChild(S2.lines);\n      return S2.lines;\n    }\n    function buildSizeUI() {\n      if (!host || S2.els) return;\n      S2.els = {};\n      ensureSizeLines();\n      for (const k of KEYS) {\n        const num6 = doc2.createElement(\"span\");\n        num6.className = \"ub-lab__sizenum\";\n        num6.setAttribute(\"data-ub-sizeval\", k);\n        num6.setAttribute(\"role\", \"button\");\n        num6.setAttribute(\"tabindex\", \"0\");\n        const inp = doc2.createElement(\"input\");\n        inp.type = \"text\";\n        inp.className = \"ub-lab__sizeinput\";\n        inp.setAttribute(\"inputmode\", \"numeric\");\n        inp.setAttribute(\"data-ub-sizeinput\", k);\n        inp.setAttribute(\"hidden\", \"\");\n        const mkArrow = function(edge) {\n          const b = doc2.createElement(\"button\");\n          b.type = \"button\";\n          b.className = \"ub-lab__sizearrow ub-lab__sizearrow--\" + edge;\n          b.setAttribute(edge === \"hi\" ? \"data-ub-sizegrip\" : \"data-ub-sizegrip-lo\", k);\n          b.addEventListener(\"mousedown\", function(e) {\n            setActiveDim(k);\n            e.preventDefault();\n            e.stopPropagation();\n            const fe = b.getAttribute(\"data-ub-edge\");\n            const deg = b.getAttribute(\"data-ub-deg\");\n            S2.dragging = true;\n            const up = function() {\n              S2.dragging = false;\n              win2.removeEventListener(\"mouseup\", up);\n            };\n            win2.addEventListener(\"mouseup\", up);\n            ctx.act(\"size.grip\", {\n              k,\n              edge: fe === \"lo\" || fe === \"hi\" ? fe : edge,\n              deg: deg != null && deg !== \"\" && isFinite(Number(deg)) ? Number(deg) : null,\n              clientX: e.clientX,\n              clientY: e.clientY\n            });\n          });\n          b.addEventListener(\"mouseenter\", function() {\n            if (!S2.dragging) setActiveDim(k);\n          });\n          b.addEventListener(\"mouseleave\", function() {\n            if (!S2.dragging) setActiveDim(null);\n          });\n          b.addEventListener(\"focus\", function() {\n            setActiveDim(k);\n          });\n          b.addEventListener(\"blur\", function() {\n            if (!S2.dragging) setActiveDim(null);\n          });\n          return b;\n        };\n        const gHi = mkArrow(\"hi\"), gLo = mkArrow(\"lo\");\n        gHi.textContent = \"\\u25B6\";\n        gLo.textContent = \"\\u25B6\";\n        const beginEdit = function() {\n          const uu = selected(ctx.scene());\n          if (!uu) return;\n          inp.value = String(Math.round(currentDim(uu, k)));\n          num6.setAttribute(\"hidden\", \"\");\n          inp.removeAttribute(\"hidden\");\n          if (inp.focus) inp.focus();\n          if (inp.select) inp.select();\n        };\n        const commit = function(raw) {\n          ctx.act(\"unit.resize\", { k, raw });\n        };\n        const endEdit = function(ok2, raw) {\n          inp.setAttribute(\"hidden\", \"\");\n          num6.removeAttribute(\"hidden\");\n          if (ok2) commit(raw);\n          else ctx.refresh();\n        };\n        num6.addEventListener(\"click\", function(e) {\n          e.preventDefault();\n          e.stopPropagation();\n          setActiveDim(k);\n          beginEdit();\n        });\n        num6.addEventListener(\"mouseenter\", function() {\n          if (!S2.dragging) setActiveDim(k);\n        });\n        num6.addEventListener(\"mouseleave\", function() {\n          if (!S2.dragging) setActiveDim(null);\n        });\n        num6.addEventListener(\"focus\", function() {\n          setActiveDim(k);\n        });\n        num6.addEventListener(\"keydown\", function(e) {\n          if (e.key === \"Enter\" || e.key === \" \") {\n            e.preventDefault();\n            beginEdit();\n          }\n        });\n        inp.addEventListener(\"keydown\", function(e) {\n          if (e.key === \"Enter\") {\n            e.preventDefault();\n            const v = inp.value;\n            inp.setAttribute(\"hidden\", \"\");\n            num6.removeAttribute(\"hidden\");\n            commit(v);\n          } else if (e.key === \"Escape\") {\n            e.preventDefault();\n            endEdit(false);\n          }\n        });\n        inp.addEventListener(\"blur\", function() {\n          if (inp.getAttribute(\"hidden\") === null) endEdit(true, inp.value);\n        });\n        host.appendChild(gLo);\n        host.appendChild(gHi);\n        host.appendChild(num6);\n        host.appendChild(inp);\n        S2.els[k] = { k, val: num6, num: num6, inp, grip: gHi, grip0: gLo, wrap: num6 };\n      }\n    }\n    function drawSizeGeometry(placed, cw, ch, dims) {\n      const svg2 = ensureSizeLines();\n      if (!svg2) return;\n      svg2.setAttribute(\"width\", cw);\n      svg2.setAttribute(\"height\", ch);\n      svg2.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      const active = ctx.scene().activeDim;\n      let out = \"\";\n      for (const k of Object.keys(dims || {})) {\n        out += '<g data-ub-dim=\"' + k + '\"' + (active === k ? ' class=\"is-active\"' : \"\") + \">\" + dimSvg(dims[k]) + \"</g>\";\n      }\n      svg2.innerHTML = out;\n    }\n    function showSizeHint(text, u, cw, ch) {\n      if (!host) return;\n      if (!S2.hint) {\n        S2.hint = doc2.createElement(\"span\");\n        S2.hint.className = \"ub-lab__sizehint\";\n        S2.hint.setAttribute(\"data-ub-sizehint\", \"\");\n        host.appendChild(S2.hint);\n      }\n      const hint = S2.hint;\n      if (!text) {\n        hint.style.display = \"none\";\n        hint.textContent = \"\";\n        return;\n      }\n      hint.textContent = text;\n      hint.style.display = \"\";\n      const f = foot(u), y = (u.y || 0) + u.h / 2;\n      const nd = view.worldToNdc([(f.x0 + f.x1) / 2, y, (f.z0 + f.z1) / 2]);\n      if (nd) {\n        hint.style.left = Math.round((nd[0] + 1) / 2 * cw) + \"px\";\n        hint.style.top = Math.round((1 - nd[1]) / 2 * ch) + \"px\";\n      }\n    }\n    function hideEl(el) {\n      el.val.style.display = \"none\";\n      el.grip.style.display = \"none\";\n      el.grip0.style.display = \"none\";\n      if (el.inp) el.inp.setAttribute(\"hidden\", \"\");\n    }\n    function drawSizeUI() {\n      if (!host) return;\n      const scene = ctx.scene();\n      const u = selected(scene);\n      if (!scene.sizeMode || !u || scene.insideTool) {\n        host.setAttribute(\"hidden\", \"\");\n        return;\n      }\n      buildSizeUI();\n      host.removeAttribute(\"hidden\");\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      const specs = sizeSpecs2(u);\n      const numText = function(sp) {\n        return String(Math.round(sp.value));\n      };\n      const aria = function(sp) {\n        return sp.name + \", \" + Math.round(sp.value) + \" millimetres. Activate to type an exact size.\";\n      };\n      const placed = [], shown = {};\n      let taken = [];\n      const ordered = specs.slice().sort(function(a, b) {\n        return a.rank - b.rank;\n      });\n      for (const sp of ordered) {\n        const el = S2.els && S2.els[sp.k];\n        if (!el) continue;\n        const q = projQuad(sp.face, cw, ch);\n        const qa = sp.alt ? projQuad(sp.alt, cw, ch) : null;\n        const useAlt = qa && Math.abs(quadArea2(qa)) > Math.abs(quadArea2(q));\n        const Q = useAlt ? qa : q;\n        const prov0 = useAlt ? sp.aq0 || sp.p0 : sp.q0 || sp.p0;\n        const prov1 = useAlt ? sp.aq1 || sp.p1 : sp.q1 || sp.p1;\n        if (!Q) continue;\n        const span2 = quadSpan2(Q);\n        if (span2 < SIZE_UI2.spanHide) continue;\n        const t = Math.max(0, Math.min(\n          1,\n          (span2 - SIZE_UI2.spanHide) / (SIZE_UI2.spanFull - SIZE_UI2.spanHide)\n        ));\n        let grip = Math.round(SIZE_UI2.gripMin + (SIZE_UI2.gripMax - SIZE_UI2.gripMin) * t);\n        let glyph = Math.round(SIZE_UI2.glyphMin + (SIZE_UI2.glyphMax - SIZE_UI2.glyphMin) * t);\n        let font = Math.round(SIZE_UI2.fontMin + (SIZE_UI2.fontMax - SIZE_UI2.fontMin) * t);\n        const txt = numText(sp);\n        const LANES = sp.along === \"v\" ? [0.88, 0.76, 0.12, 0.24] : [0.12, 0.24, 0.88, 0.76];\n        const OFFS = sp.along === \"v\" ? [0.62, 0.5, 0.38, 0.5] : [0.34, 0.46, 0.62, 0.5];\n        const SHRINK = [1, 0.8, 0.62];\n        let a = null, b = null, mid = null, rects = null, gs = grip, fs2 = font, gl = glyph;\n        let edgeLen = 0, lineLen = 0;\n        const lerp2 = function(A, B2, tt) {\n          return { x: A.x + (B2.x - A.x) * tt, y: A.y + (B2.y - A.y) * tt };\n        };\n        for (let wk = 0; wk < 2 && !rects; wk++) {\n          const MAXWALK = wk === 0 ? 0 : 0.46;\n          for (let li = 0; li < LANES.length && !rects; li++) {\n            for (let si = 0; si < SHRINK.length && !rects; si++) {\n              const sc = SHRINK[si];\n              const g2 = Math.max(12, Math.round(grip * sc));\n              const f2 = Math.max(7, Math.round(font * sc));\n              const w2 = 6 + f2 * 0.62 * txt.length, h2 = f2 + 4;\n              const L = LANES[li], OF = OFFS[li];\n              let E0, E1;\n              if (sp.along === \"v\") {\n                E0 = quadPt2(Q, L, 0);\n                E1 = quadPt2(Q, L, 1);\n              } else {\n                E0 = quadPt2(Q, 0, L);\n                E1 = quadPt2(Q, 1, L);\n              }\n              const eLen = Math.hypot(E1.x - E0.x, E1.y - E0.y);\n              if (eLen < 24) continue;\n              const tIn = Math.min(0.14, Math.max(0.025, (g2 / 2 + 2) / eLen));\n              const fitEnd2 = function(A, B2) {\n                for (let tt = tIn; tt <= tIn + MAXWALK + 1e-9; tt += 0.02) {\n                  const pt = lerp2(A, B2, tt);\n                  const r = rectAt3(pt.x, pt.y, g2, g2);\n                  if (r.x0 >= 0 && r.y0 >= 0 && r.x1 <= cw && r.y1 <= ch && rectInQuad2(Q, r) && !taken.some(function(o) {\n                    return rectsHit2(r, o);\n                  })) return pt;\n                }\n                return null;\n              };\n              const ca = fitEnd2(E0, E1), cb = fitEnd2(E1, E0);\n              if (!ca || !cb) continue;\n              const cm = sp.along === \"v\" ? quadPt2(Q, OF, 0.5) : quadPt2(Q, 0.5, OF);\n              const rr = [\n                rectAt3(ca.x, ca.y, g2, g2),\n                rectAt3(cb.x, cb.y, g2, g2),\n                rectAt3(cm.x, cm.y, w2, h2)\n              ];\n              if (!rr.every(function(r) {\n                return rectInQuad2(Q, r);\n              })) continue;\n              if (!rr.every(function(r) {\n                return r.x0 >= 0 && r.y0 >= 0 && r.x1 <= cw && r.y1 <= ch;\n              })) continue;\n              if (rectAtClash2(rr[2], taken)) continue;\n              if (Math.hypot(cb.x - ca.x, cb.y - ca.y) < g2 + 6) continue;\n              a = ca;\n              b = cb;\n              mid = cm;\n              rects = rr;\n              gs = g2;\n              fs2 = f2;\n              gl = Math.max(6, Math.round(glyph * sc));\n              edgeLen = eLen;\n              lineLen = Math.hypot(cb.x - ca.x, cb.y - ca.y);\n            }\n          }\n        }\n        if (!rects) continue;\n        grip = gs;\n        font = fs2;\n        glyph = gl;\n        taken = taken.concat(rects);\n        shown[sp.k] = true;\n        const deg = Math.atan2(b.y - a.y, b.x - a.x) * 180 / Math.PI;\n        const hiEnd = sp.vertical ? \"top\" : \"far end\";\n        const loEnd = sp.vertical ? \"bottom\" : \"near end\";\n        const gripPx = grip, glyphPx = glyph;\n        const place2 = function(node, pt, d, endName, otherEnd) {\n          node.style.display = \"\";\n          node.style.left = Math.round(pt.x) + \"px\";\n          node.style.top = Math.round(pt.y) + \"px\";\n          node.style.width = gripPx + \"px\";\n          node.style.height = gripPx + \"px\";\n          node.style.lineHeight = gripPx + \"px\";\n          node.style.fontSize = glyphPx + \"px\";\n          node.style.transform = \"translate(-50%,-50%) rotate(\" + Math.round(d) + \"deg)\";\n          node.setAttribute(\"data-ub-deg\", String(Math.round(d)));\n          node.setAttribute(\"title\", sp.name + \" \\u2013 drag the \" + endName);\n          node.setAttribute(\n            \"aria-label\",\n            \"Drag the \" + endName + \" to change \" + sp.name.toLowerCase() + \". The \" + otherEnd + \" stays where it is.\"\n          );\n        };\n        if (sp.freeEndOnly) {\n          const fn = view.worldToNdc(sp.freeAt);\n          const fx = fn ? (fn[0] + 1) / 2 * cw : b.x, fy = fn ? (1 - fn[1]) / 2 * ch : b.y;\n          const aIsFree = Math.hypot(a.x - fx, a.y - fy) < Math.hypot(b.x - fx, b.y - fy);\n          const hp = aIsFree ? a : b, other = aIsFree ? b : a;\n          const outDeg = Math.atan2(hp.y - other.y, hp.x - other.x) * 180 / Math.PI;\n          place2(el.grip, hp, outDeg, \"free end\", \"corner end\");\n          el.grip.setAttribute(\n            \"aria-label\",\n            \"Drag away from the corner to lengthen \" + sp.name.toLowerCase() + \", back toward the corner to shorten it. The corner end stays fixed.\"\n          );\n          el.grip0.style.display = \"none\";\n          el.grip0.disabled = true;\n          el.grip0.removeAttribute(\"data-ub-deg\");\n        } else {\n          let ax = Math.abs(prov1[0] - prov0[0]) >= Math.abs(prov1[2] - prov0[2]) ? 0 : 2;\n          if (Math.abs(prov1[1] - prov0[1]) > Math.abs(prov1[ax] - prov0[ax])) ax = 1;\n          const aIsLow = prov0[ax] <= prov1[ax];\n          const aEdge = aIsLow ? \"lo\" : \"hi\";\n          const bEdge = aIsLow ? \"hi\" : \"lo\";\n          const degA = Math.atan2(a.y - b.y, a.x - b.x) * 180 / Math.PI;\n          const degB = Math.atan2(b.y - a.y, b.x - a.x) * 180 / Math.PI;\n          place2(el.grip, b, degB, bEdge === \"hi\" ? hiEnd : loEnd, bEdge === \"hi\" ? loEnd : hiEnd);\n          place2(el.grip0, a, degA, aEdge === \"hi\" ? hiEnd : loEnd, aEdge === \"hi\" ? loEnd : hiEnd);\n          el.grip.setAttribute(\"data-ub-edge\", bEdge);\n          el.grip0.setAttribute(\"data-ub-edge\", aEdge);\n        }\n        placed.push({\n          k: sp.k,\n          a,\n          b,\n          mid,\n          rects,\n          quad: Q,\n          edgeLen,\n          lineLen,\n          fill: edgeLen > 0 ? lineLen / edgeLen : 0,\n          grip,\n          glyph,\n          font,\n          span: span2,\n          deg,\n          freeEndOnly: !!sp.freeEndOnly,\n          pinAt: sp.pinAt,\n          freeAt: sp.freeAt,\n          x: mid.x,\n          y: mid.y,\n          label: sp.name,\n          value: sp.value,\n          tip: { x: b.x, y: b.y }\n        });\n      }\n      const B = view.unitAABB ? view.unitAABB(u) : null;\n      let onCanvas = !B;\n      if (B) for (const x of [B.x0, B.x1]) for (const y of [B.y0, B.y1]) for (const z of [B.z0, B.z1]) {\n        const nd = view.worldToNdc([x, y, z]);\n        if (nd && Math.abs(nd[0]) <= 1 && Math.abs(nd[1]) <= 1) onCanvas = true;\n      }\n      if (!onCanvas) {\n        for (const k of KEYS) {\n          const el = S2.els && S2.els[k];\n          if (el) hideEl(el);\n        }\n        drawSizeGeometry([], cw, ch);\n        showSizeHint(null, u, cw, ch);\n        S2.fields = [];\n        return;\n      }\n      const arrows = view.sizeArrows ? view.sizeArrows() : [];\n      const fontPx = cw < 420 ? 10.5 : 11;\n      const lineOf2 = {};\n      for (const q of placed) lineOf2[q.k] = q;\n      const specOf = {}, lineMid = {};\n      for (const q of placed) lineMid[q.k] = { x: q.mid.x, y: q.mid.y };\n      const live = specs.filter((sp) => S2.els && S2.els[sp.k]);\n      for (const sp of live) {\n        const el = S2.els[sp.k];\n        specOf[sp.k] = sp;\n        el.val.textContent = numText(sp);\n        el.val.setAttribute(\"aria-label\", aria(sp));\n        el.val.setAttribute(\"title\", sp.name + \": \" + Math.round(sp.value) + \" mm - click to type\");\n        el.val.style.display = \"\";\n        el.val.style.fontSize = fontPx + \"px\";\n      }\n      const toPx2 = (p) => {\n        const nd = view.worldToNdc(p);\n        return nd ? { x: (nd[0] + 1) / 2 * cw, y: (1 - nd[1]) / 2 * ch } : null;\n      };\n      const measure = (k) => {\n        const n = S2.els[k] && S2.els[k].val;\n        const r = n && n.getBoundingClientRect ? n.getBoundingClientRect() : null;\n        return r ? { w: r.width, h: r.height } : null;\n      };\n      const items = buildLabelItems(live, arrows, lineMid, toPx2, fontPx, measure);\n      const obstacles = [];\n      const lr = view.liveRect ? view.liveRect() : null;\n      if (lr && root.querySelectorAll) {\n        for (const d of root.querySelectorAll(\".ub-lab__dock\")) {\n          const r = d.getBoundingClientRect ? d.getBoundingClientRect() : null;\n          if (!r || !(r.width > 0) || !(r.height > 0)) continue;\n          obstacles.push({ x0: r.left - lr.left, y0: r.top - lr.top, x1: r.right - lr.left, y1: r.bottom - lr.top });\n        }\n      }\n      {\n        const selId = (ctx.scene() || {}).selectedId || null;\n        if (selId !== S2.avoidFor) {\n          S2.avoidFor = selId;\n          S2.avoidAt = lastPtr && lr ? { x: lastPtr[0] - lr.left, y: lastPtr[1] - lr.top } : null;\n        }\n        if (S2.avoidAt) obstacles.push({ x0: S2.avoidAt.x - 20, y0: S2.avoidAt.y - 16, x1: S2.avoidAt.x + 20, y1: S2.avoidAt.y + 16 });\n      }\n      const dims = drawingDims(live, specOf, arrows, obstacles, cw, ch, fontPx);\n      S2.dims = dims;\n      const LL = layoutSizeLabels(\n        items.filter((it) => !dims[it.k]),\n        arrows,\n        obstacles.concat(Object.keys(dims).map((k) => dims[k].box)),\n        cw,\n        ch\n      );\n      const labelled = {};\n      for (const it of items) {\n        const el = S2.els[it.k], sp = specOf[it.k], dg = dims[it.k];\n        const at = dg ? { x: dg.text.x, y: dg.text.y, how: \"dimension\" } : LL[it.k];\n        if (!at) continue;\n        labelled[it.k] = true;\n        el.val.style.left = Math.round(at.x) + \"px\";\n        el.val.style.top = Math.round(at.y) + \"px\";\n        el.val.style.transform = \"translate(-50%,-50%) rotate(\" + (dg ? Math.round(dg.text.deg) : 0) + \"deg)\";\n        el.val.setAttribute(\"data-ub-labelat\", at.how);\n        const editing = el.inp && el.inp.getAttribute(\"hidden\") === null;\n        if (!editing) el.inp.value = Math.round(sp.value);\n        el.inp.setAttribute(\"aria-label\", sp.name + \" in millimetres\");\n        const lim = dimLimits(scene.units, u, sp.k);\n        el.inp.setAttribute(\"title\", lim[0] + \"\\u2013\" + lim[1] + \" mm\");\n        el.inp.style.left = Math.round(at.x) + \"px\";\n        el.inp.style.top = Math.round(at.y) + \"px\";\n        if (lineOf2[it.k]) {\n          lineOf2[it.k].mid = { x: at.x, y: at.y };\n          lineOf2[it.k].x = at.x;\n          lineOf2[it.k].y = at.y;\n        }\n      }\n      for (const k of KEYS) {\n        const el = S2.els && S2.els[k];\n        if (!el || labelled[k]) continue;\n        hideEl(el);\n      }\n      for (const k of KEYS) {\n        const el = S2.els && S2.els[k];\n        if (el && labelled[k] && !shown[k]) {\n          el.grip.style.display = \"none\";\n          el.grip0.style.display = \"none\";\n        }\n      }\n      for (const p of placed) {\n        const el = S2.els && S2.els[p.k];\n        if (!el) continue;\n        if (el.grip) {\n          el.grip.style.display = \"none\";\n        }\n        if (el.grip0) {\n          el.grip0.style.display = \"none\";\n        }\n      }\n      drawSizeGeometry(placed, cw, ch, dims);\n      showSizeHint(null, u, cw, ch);\n      paintActiveDim();\n      S2.fields = placed;\n    }\n    function drawingDims(live, specOf, arrows, obstacles, cw, ch, font) {\n      const out = {};\n      const polys = (arrows || []).map((a) => arrowPoly(a, 3)).concat((arrows || []).map((a) => gripPoly(a, 3)).filter(Boolean));\n      const taken = (obstacles || []).slice();\n      let sx = 0, sy = 0, sn = 0;\n      const quads = {};\n      for (const sp of live) {\n        quads[sp.k] = [sp.face, sp.alt].filter(Boolean).map((f) => projQuad(f, cw, ch)).filter(Boolean);\n        for (const q of quads[sp.k]) for (const c of q) {\n          sx += c[0];\n          sy += c[1];\n          sn++;\n        }\n      }\n      if (!sn) return out;\n      const C3 = { x: sx / sn, y: sy / sn };\n      const th = font + 2;\n      for (const sp of live) {\n        const edges = [];\n        for (const q of quads[sp.k]) {\n          const P2 = (i) => ({ x: q[i][0], y: q[i][1] });\n          if (sp.along === \"v\") edges.push([P2(0), P2(3)], [P2(1), P2(2)]);\n          else edges.push([P2(0), P2(1)], [P2(3), P2(2)]);\n        }\n        const scored = edges.map((e) => {\n          const n = normalAway(e[0], e[1], C3), mx = (e[0].x + e[1].x) / 2, my = (e[0].y + e[1].y) / 2;\n          return { e, n, out: (mx - C3.x) * n.x + (my - C3.y) * n.y, len: Math.hypot(e[1].x - e[0].x, e[1].y - e[0].y) };\n        }).filter((c) => c.len >= 28).sort((a, b) => b.out - a.out);\n        const txt = String(Math.round(specOf[sp.k].value)), el0 = S2.els && S2.els[sp.k] && S2.els[sp.k].val;\n        const tw = el0 && el0.offsetWidth || textW(txt, font), thk = el0 && el0.offsetHeight || th;\n        let got = null;\n        for (const c of scored.slice(0, 2)) {\n          for (const off of [16, 28, 42, 58]) {\n            for (const at of [0.5, 0.36, 0.64, 0.24, 0.76]) {\n              const g2 = dimGeom(c.e[0], c.e[1], c.n, off, at, thk);\n              const box3 = turnedBox(g2.text.x, g2.text.y, tw + 2, thk + 1, g2.text.deg);\n              if (box3.x0 < 2 || box3.y0 < 2 || box3.x1 > cw - 2 || box3.y1 > ch - 2) continue;\n              if (polys.some((pl) => polyRectHit(pl, box3))) continue;\n              if (taken.some((r) => rectsOverlap(r, box3))) continue;\n              if ([g2.d0, g2.d1].some((p) => p.x < 0 || p.y < 0 || p.x > cw || p.y > ch)) continue;\n              got = Object.assign(g2, { box: box3, k: sp.k });\n              break;\n            }\n            if (got) break;\n          }\n          if (got) break;\n        }\n        if (got) {\n          out[sp.k] = got;\n          taken.push(got.box);\n        }\n      }\n      return out;\n    }\n    return {\n      frame: drawSizeUI,\n      els: () => S2.els,\n      fields: () => S2.fields,\n      hint: () => S2.hint,\n      setActiveDim\n    };\n  }\n\n  // v2/src/ui/cab-dims.js\n  var CAB_DIMS = { OFF: 16, MIN_PX: 24, FONT: 11, STEP: 14, TRIES: 4 };\n  var NS5 = \"http://www.w3.org/2000/svg\";\n  var R3 = (v) => Math.round(v * 10) / 10;\n  function topWidthEdge(sp) {\n    const top = Math.max(...sp.face.map((p) => p[1]));\n    const up = (p) => [p[0], top, p[2]];\n    if (sp.aq0 && sp.aq1) return [up(sp.aq1), up(sp.aq0)];\n    if (sp.alt) return [up(sp.alt[1]), up(sp.alt[0])];\n    return [up(sp.p0), up(sp.p1)];\n  }\n  function cabDimsOf(u, toPx2, taken, opts) {\n    const out = [];\n    let specs;\n    try {\n      specs = sizeSpecs2(u);\n    } catch {\n      return out;\n    }\n    const pts = [];\n    for (const sp of specs) for (const p of sp.face) {\n      const q = toPx2(p);\n      if (q) pts.push(q);\n    }\n    for (const sp of specs) if (sp.alt) for (const p of sp.alt) {\n      const q = toPx2(p);\n      if (q) pts.push(q);\n    }\n    if (!pts.length) return out;\n    const C3 = { x: pts.reduce((s, p) => s + p.x, 0) / pts.length, y: pts.reduce((s, p) => s + p.y, 0) / pts.length };\n    const topLimit = opts && typeof opts.top === \"number\" ? opts.top : null;\n    for (const sp of specs) {\n      if ((sp.k === \"w\" || sp.k === \"w2\") && u.family !== \"wall\") {\n        const d = widthAbove(sp, toPx2, pts, taken, topLimit);\n        if (d) {\n          out.push(d);\n          continue;\n        }\n      }\n      const quad = (f) => {\n        const q = f.map(toPx2);\n        return q.every(Boolean) ? q.map((p) => [p.x, p.y]) : null;\n      };\n      let p0 = sp.p0, p1 = sp.p1;\n      const qf = quad(sp.face);\n      if (!qf) continue;\n      if (!(quadArea2(qf) > 0) && sp.alt) {\n        const qa = quad(sp.alt);\n        if (qa && quadArea2(qa) > 0) {\n          const cf = centroid(sp.face), ca = centroid(sp.alt);\n          const sh = [ca[0] - cf[0], ca[1] - cf[1], ca[2] - cf[2]];\n          p0 = [p0[0] + sh[0], p0[1] + sh[1], p0[2] + sh[2]];\n          p1 = [p1[0] + sh[0], p1[1] + sh[1], p1[2] + sh[2]];\n        }\n      }\n      const P0 = toPx2(p0), P1 = toPx2(p1);\n      if (!P0 || !P1) continue;\n      if (Math.hypot(P1.x - P0.x, P1.y - P0.y) < CAB_DIMS.MIN_PX) continue;\n      const n = normalAway(P0, P1, C3);\n      const txt = String(Math.round(sp.value)), tw = textW(txt, CAB_DIMS.FONT), th = CAB_DIMS.FONT + 2;\n      let g2 = null, box3 = null;\n      for (let t = 0; t < (taken ? CAB_DIMS.TRIES : 1); t++) {\n        g2 = dimGeom(P0, P1, n, CAB_DIMS.OFF + t * CAB_DIMS.STEP, 0.5, CAB_DIMS.FONT);\n        box3 = turnedBox(g2.text.x, g2.text.y, tw, th, g2.text.deg);\n        if (!taken || !taken.some((b) => !(b.x1 <= box3.x0 || box3.x1 <= b.x0 || b.y1 <= box3.y0 || box3.y1 <= b.y0))) break;\n      }\n      if (taken) taken.push(box3);\n      out.push({ k: sp.k, value: Math.round(sp.value), P0, P1, n, g: g2, box: box3 });\n    }\n    return out;\n  }\n  function widthAbove(sp, toPx2, pts, taken, topLimit) {\n    const [w0, w1] = topWidthEdge(sp);\n    const P0 = toPx2(w0), P1 = toPx2(w1);\n    if (!P0 || !P1) return null;\n    const L = Math.hypot(P1.x - P0.x, P1.y - P0.y);\n    if (L < CAB_DIMS.MIN_PX) return null;\n    const wm = [(w0[0] + w1[0]) / 2, (w0[1] + w1[1]) / 2, (w0[2] + w1[2]) / 2];\n    const M = toPx2(wm), Mu = toPx2([wm[0], wm[1] + 200, wm[2]]);\n    if (!M || !Mu) return null;\n    const ul = Math.hypot(Mu.x - M.x, Mu.y - M.y);\n    if (ul < 6) return null;\n    const n = { x: (Mu.x - M.x) / ul, y: (Mu.y - M.y) / ul };\n    const ux = (P1.x - P0.x) / L, uy = (P1.y - P0.y) / L;\n    let mx = -uy, my = ux;\n    if (mx * n.x + my * n.y < 0) {\n      mx = -mx;\n      my = -my;\n    }\n    const nm = mx * n.x + my * n.y;\n    if (!(nm > 0.2)) return null;\n    let clear = 0;\n    for (const q of pts) clear = Math.max(clear, ((q.x - P0.x) * mx + (q.y - P0.y) * my) / nm);\n    const txt = String(Math.round(sp.value)), tw = textW(txt, CAB_DIMS.FONT), th = CAB_DIMS.FONT + 2;\n    let g2 = null, box3 = null;\n    for (let t = 0; t < (taken ? CAB_DIMS.TRIES : 1); t++) {\n      g2 = dimGeom(P0, P1, n, clear + CAB_DIMS.OFF + t * CAB_DIMS.STEP, 0.5, CAB_DIMS.FONT);\n      box3 = turnedBox(g2.text.x, g2.text.y, tw, th, g2.text.deg);\n      if (!taken || !taken.some((b) => !(b.x1 <= box3.x0 || box3.x1 <= b.x0 || b.y1 <= box3.y0 || box3.y1 <= b.y0))) break;\n    }\n    const lim = topLimit == null ? 2 : topLimit;\n    if (Math.min(box3.y0, g2.d0.y, g2.d1.y) < lim) return null;\n    if (taken) taken.push(box3);\n    return { k: sp.k, value: Math.round(sp.value), P0, P1, n, g: g2, box: box3, above: true };\n  }\n  function centroid(f) {\n    const s = [0, 0, 0];\n    for (const p of f) {\n      s[0] += p[0];\n      s[1] += p[1];\n      s[2] += p[2];\n    }\n    return [s[0] / f.length, s[1] / f.length, s[2] / f.length];\n  }\n  function cabDimsUnits(scene, hoverId) {\n    const s = scene || {};\n    if (s.measureOn || s.partsMode || s.insideTool || (s.explode || 0) > 0 || s.showOpen || s.showActive) return [];\n    const units = s.units || [];\n    const list = s.allDims ? units.slice() : units.filter((u) => u.id === s.selectedId);\n    const out = s.sizeMode ? list.filter((u) => u.id !== s.selectedId) : list;\n    if (hoverId && hoverId !== s.selectedId && !list.some((u) => u.id === hoverId)) {\n      const h = units.find((u) => u.id === hoverId);\n      if (h) out.push(h);\n    }\n    return out;\n  }\n  function cabDimsHoverOnly(scene, hoverId) {\n    const s = scene || {};\n    if (!hoverId || hoverId === s.selectedId || s.allDims) return null;\n    return cabDimsUnits(s, hoverId).some((u) => u.id === hoverId) ? hoverId : null;\n  }\n  function createCabDims(ctx) {\n    const root = ctx.root, doc2 = ctx.doc, view = ctx.view;\n    const host = root && root.querySelector ? root.querySelector(\"[data-ub-size]\") : null;\n    const parent = host && host.parentNode;\n    let svg2 = null, lastKey = null;\n    const hover = root && view && view.pickAt ? badgeHover(ctx) : null;\n    const hoverId = () => {\n      if (!hover) return null;\n      const st = hover.state();\n      if (st.via !== \"mouse\" || !st.id) return null;\n      const u = hover.target();\n      return u ? u.id : null;\n    };\n    function ensure() {\n      if (svg2 || !parent || !doc2.createElementNS) return svg2;\n      svg2 = doc2.createElementNS(NS5, \"svg\");\n      svg2.setAttribute(\"class\", \"ub-lab__cabdims\");\n      svg2.setAttribute(\"data-ub-cabdims\", \"\");\n      svg2.setAttribute(\"aria-hidden\", \"true\");\n      svg2.setAttribute(\"focusable\", \"false\");\n      parent.insertBefore(svg2, host);\n      return svg2;\n    }\n    function frame2() {\n      const scene = ctx.scene();\n      const hid = hoverId();\n      const units = cabDimsUnits(scene, hid), onlyHover = cabDimsHoverOnly(scene, hid);\n      if (!units.length) {\n        if (svg2 && lastKey !== \"\") {\n          svg2.innerHTML = \"\";\n          svg2.setAttribute(\"hidden\", \"\");\n          lastKey = \"\";\n        }\n        return;\n      }\n      if (!ensure()) return;\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      const toPx2 = (p) => {\n        const nd = view.worldToNdc(p);\n        if (!nd || !isFinite(nd[0]) || !isFinite(nd[1])) return null;\n        if (view.worldClipZ) {\n          const z = view.worldClipZ(p);\n          if (typeof z === \"number\" && (z < -1 || z > 1)) return null;\n        }\n        return { x: (nd[0] + 1) / 2 * cw, y: (1 - nd[1]) / 2 * ch };\n      };\n      let html = \"\";\n      const taken = [];\n      let topLimit = 2;\n      try {\n        const P2 = root.__ubProj, ia = P2 && P2.__v2 && P2.__v2.interaction ? P2.__v2.interaction() : null, ins = ia && ia.ctx && ia.ctx.viewInsets ? ia.ctx.viewInsets() : null;\n        if (ins && typeof ins.t === \"number\") topLimit = Math.max(2, ins.t - 8);\n      } catch {\n      }\n      for (const u of units) {\n        for (const d of cabDimsOf(u, toPx2, taken, { top: topLimit })) {\n          const t = d.g.text, txt = String(d.value);\n          const hv = u.id === onlyHover;\n          html += '<g class=\"ub-cabdim' + (hv ? \" is-hover\" : \"\") + '\" data-unit=\"' + u.id + '\" data-k=\"' + d.k + '\" data-mm=\"' + d.value + '\"' + (d.above ? ' data-above=\"\"' : \"\") + (hv ? ' data-hover=\"\"' : \"\") + \">\" + dimSvg(d.g) + '<text class=\"ub-cabdim__num\" x=\"' + R3(t.x) + '\" y=\"' + R3(t.y) + '\" transform=\"rotate(' + R3(t.deg) + \" \" + R3(t.x) + \" \" + R3(t.y) + ')\" text-anchor=\"middle\" dominant-baseline=\"central\" data-w=\"' + textW(txt, CAB_DIMS.FONT) + '\">' + txt + \"</text></g>\";\n        }\n      }\n      const key = cw + \"x\" + ch + \"|\" + html;\n      if (key === lastKey) return;\n      lastKey = key;\n      svg2.setAttribute(\"width\", String(cw));\n      svg2.setAttribute(\"height\", String(ch));\n      svg2.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      svg2.innerHTML = html;\n      if (html) svg2.removeAttribute(\"hidden\");\n      else svg2.setAttribute(\"hidden\", \"\");\n    }\n    if (hover) hover.register(null, frame2);\n    return { frame: frame2, sync: frame2, state: () => {\n      const h = hoverId();\n      return { units: cabDimsUnits(ctx.scene(), h).map((u) => u.id), hover: cabDimsHoverOnly(ctx.scene(), h) };\n    } };\n  }\n\n  // v2/src/ui/tray-thumbs.js\n  var TRAY_THUMBS = {\n    \"base\": \"data:image/webp;base64,UklGRmYQAABXRUJQVlA4IFoQAABQaACdASpAAUABPj0ejUSiIaGS6XRoIAPEs5npuj0F6XuUgrJV5Eb+TVye/wH5voA8QDp5fzj0H+ep57Hpb9R30VPrHf4XJa+AErXeD+4/yHip/y3Dk2f8aH65xVaLf5g/R11Jfm/+V9SoYrd/2Y3CS6ZAjc2mt+uswzHGoxJY39dkj5qalk204k2IvkysmawsYe5WVtJYobPhZUykSJf4/FJtXYv9oFoCkLVFN560hClEzRFtSj+rjhERrw1YLyQP29kWS/KJSQoty/K5GdztKRh/+X+tepiQ3DxM0dt9VIbkl0gs9t7P9wWZCKWa4QOkeeb1GbrpBsbvxeHCQE9YylvGuo/lnLGntS3zn/ddm9w7mxOZtLYNwLNFw+K74qPvsBuAA2+t6gsckamQ1mkbEz7QZDadsVWVBGLV/1deOFC+e1JaI3hUrH6Ux3tnJcxlryBy59FyPzZbFsBEhFnnsXqKmCxRnQSKsHkxgqU0qBUzO1o3gT3ijjDDFxlUVOgTmJaKeVMk1DYlmzZLLiNbBEWjPVOl55ZZYpTn6cmLos1aNcHyR8KO+7ocrihIkFTEehYvdqLOAB3QJ5E2IZKdAzdqso2S/l4qkD995UHiZLcY/lq1QgSjcmchsUwO0VOCrrq67Rv3IFA+a5NoPQwypz+juUe502W5OlsebtY39JuNcIfsVyphbe4YNWqh3dF53kWG0qRFoU+7oh9OB9ZzBl9ApqYkqsjoh0N6XKWK3oOJfpgwoAxcSJHk1O3WFGSql00b3XXWhHXZj7SM9x9/j7sE0O+FF4EM7fPyhtIi/1oCj8qA1huzb9vwCUEfYYmZ8tjRQaH1BK4TcuH7MQDy9nCaZbp4CztqrXigXrpuOChuUl+2/8Ls15eg39PcPeG+1uk5O+ZZJd4La99OAEx8llhrje6dBC/Fz+RJXot/rxBexpa/4Nst9cFbawulPDxfxpnun+qdc7OJgwKtVawV/vibb9hQQgVFP5IWdqLbg2OqSr0ix7CbjljAmlyHCw8gOud0Bg1zXT0PqEKQIB5y8IrtM7lJKOoYntceGxA2ImlFxHspvC3e2mTKFzyyAmAoz8WIOMBrTefy/LcDa2TPTA/wmSmhUvsEYAAA/vpvKD2ehZSh5I5/U8VJSI43eSAvEpWo9gimZeznVCzKte/h+Vinl1BqWp8crbB3LT4IGfzT1Cux3Mc1kLIGe7zM/9VVYU7ve7RUMz3qQccdolowvEkxngm1plb+x1WUiriRH4+rOfvlpnnxy/RYOsBI2/s124eKgzIjqn3elDh8GTuQv2rp6uPwMRh9PkJCwdyNKU8PJUA47DEdDrCBpA5kOKXZv9DsFM3yBsgqHbuBF7wHepqiHD4oJ1UaT1WABQchbT9N57uEFn7ciYb1KJGKtpMwPxvN1LbHXmmd+vXkhfwP41jdHvPx+XwS5rk1Ku+DvTHlY2sQq+MGOFy5GfznP2PDeScllCBEGPWRxxwAJ8FmjkLNXN+KOseWydU1T2wNbli63PR38TrSpbSMOjRD2rhpGTPaUfvt5KbcPioo7laZv/vwqvml2BDteePYHW1YxnN97Z5LWOHwOzKnKd9dq1CiY4FcNDWInpLt+h77+T8bl7SKFNhQ6aID19NVj55PyIFGP0wD8RnsXWHHqlrJ67n6qMDKU/fvdcmht02GUtLVBEq3lmThml+dDQYDsv2QrMTyPMA0X8P3ETcK5RxRnEIhkDJCAxGYlj+dnL6Od6EarewsP/CZ/4kC9NtaDWSQ6zwJuRiqGXJ4o70SNpl7NWBRV9hoZqsdaPT5PPqU1+RKuBOqWBjMm06c46a45Tgfc9OuoCd0rP+3K7FC/MW42SaVRo/aZ7NqCycpVQo7TX5KdTRnR6M7N0/5BHfuPULv+jcPPAzvV1+Jog+TFF00VEfRBMNRHawS9OSYcU/c1StgLqu5iH2e5+n5bmqJkqZulrnjz2x6xFEwQgwWiYMsskjuvo0INmEYe0DOf8lDrgxVr0R6jYzB4lRblqDIpe6LavZv2PJKQ7eDeTEvHaxJ9VPi6pSfDD3sg89Jgq5s9KXj3R0wuL8cwYaPz9Xz/v8GB9xM7X46PU4+1UjSeSMfSYgo+zJ4zrTUgoE2YLOssjKF78dYP7F/NDShk+tBYXQ5rX3Z0sPTMnGPI18WUHjskmWQlOIlWuIfGOZZruQSIZBgcMneAz42zgjfSbXkuNUrS63lqf80J4pMRVcwMufifGBKVCM4PoWO0X9yzl190LKHRHRTotuV5pLG5W0nLarlsVifrtITnfB8uB/jopxLGQfSyvYANqijlOE9PaTQWvCFlD3uwlhg9CVhG6XbDbJtoa0Xo89QxLN3WsRflSppU0TCHV7sZ8kL+b1Ya7dyKZvQF+MLSLj/GcGza4kP2gc/m4ZTDCSkhw2KdRkenlxL3PDD0px2FbGP5VSs77jDeXYpHslhqOOFHnpyuRRRMlYxcjWRXbKkTqWp1UbH+bma76LU6jL+qpFyNpUw1MOvSeJ2ugijxqTJ0xI40fq5G03EH8qtKXl7Yl3U/SbNwf3MLpgJqquRvZQGPk/jf+bZYhWZy1hUOEs44ehAK53fiTg0khHurWx8vDkOLwPH5v6VMxiW5RCvew/Sb4FmSzW2B7NVXS/qBIxy+9hsnOvkMf1B/x7AcuuibKCUfb7pYfvlUZ69RW7MFqiWagm0j/L2wF15bHMlbq6w7r875fcKyHewbW6G8Okq2ZCF1q2KC6vAZ0zk3lKqb15PrWR5vZ35LZjjv/tiMa9L/NDz91bo3K+DMW/5Ab3OaahacGbNR3yWNqt+3xcR9f6WoiRcyJOQ9a8mUxEhzqf8PKeYRaEws40Rzs6O8PFT2j3g5UnC4D6aCQ+UrLHBmna+Q4a7hgm8JrptBiLAeMuoiahRWvwFoIF+J2zrneEQedxYXTpbBRfTPr2iT40XzZg02AAZ9Vtu+ZE3rSS7ySSYH0yZhjd0yyzLZQ34gzHnoEVFl/rkjAfifoYuYgxzOlW9tM3D76WdJkXhAP2nKoHHPH+YeDg06ganTV9kddEg3dbuLwrRKUiHj2jxll3s++KsHbfRGJoxbC/83WXPmA9D0qPbZI55JXXD1Cmf/uVUVV5TqG5SNJi9aZVM4TVup9X8Sz2a08aM/saRtIDYrm6QFxgInng9Lb8Mq8xhxYZYRyrWGSf4yxl+SmDwHvOPGz8G5r/Ir+WWBZo/9TPzInl7PVDx4v1ZNcP/5DK4uVqwB04WOv+F21aeEX7euw5o1pp5TIw1Yzb9yRXb6/5yDUnOo27toVlYfPCB5Jgv0DiQ/k3qWM5kydr09Xm02EcbYXToCQC/nWWhmN3QdaiA7Z1D3oyya1zaA1Ei5xBJjjedPZ4027JBS9163Oc5jjXGfs3FRJY5hhwLkqpMZApNYc5Fk2AFsshH497RnSlsq8zgZaoSbXUGPaxVGgEn2RbufArRZV8B8UIJQ5hupZ8JyWuT2vRpkL80F4UI0vAxJS5A0MSA6xeSzdMQmBsjOxeqHDu1FKBwQslZivlDO6Mng85ruw1xrHazWojv5T6ClLXBlSgZs9ZoQ5vzIrWTF64ygsgAxM7mZ56lSu2yLoko2mzvr6lOM6rnnXEzIeaRgeEbx1NwdSNObzeK8fG+XDBlSo5mwETUKVmxcKQv6d80X2frVSA6FCBM7SECjaG51SdoIWORX1a87uZAwxIkSr7LGMdmJ+IlU/y7FbnELqAaOScrfxjmmrkTberFqfZYF3qw5atRzBT8GFhVYbXCjqkHY4t8avGFvR9S/KP4D8ZB6+SQFRC1fsupcGPMBhSPXxZDR3dmHQr6ha0ay3WH1nWy0uhVisvqiviXnnxFD8DH6740FTcoUhYB+NssjfSk2Z8z62tGD6cwY8ZJSWxfWh0P+8T4mbFc9e2x0NFq8ZysroBrai/7Iwo8JPnA77ZUBvu5p9Um45vS1A0tS7HDjERxpCDr5ACjJ50gd3nLTesifbG7TofQeKh4h3PkXSG4uPxvUdMJDs1CILWVT9inIvT+13xABIo1gbZkEMtL6yZeyUgATTws0gHG/4YuFZatoLJIkRzQuBb0oprfYLCfNMKSz0gSJsAMidvsgA78v/b5bhHseUsXl2n93G1pptW5qDgfb8vZfz2KCl++PefZBBlNBrvXLsJ/nrHbiz77hdykDaS0+g6IkibMuxeJmMnaFaeH7RdeObhXfnJJatOgBexIueIMdxRaUgL8YZV4JmTiuKh3Q9P8WX2Op6RjL4DSzA/o4AQl67nnZz0jL4ftQjH79raP2FB0DAS4pZBrgtm5/lez7/74XkspdDi5zuNhnbexNyPy+4TtSWWJbuG0HI39JO8kZapZsNBqo1LsHI7oT9xvn3WmTOWbilRtU+1/8FvZxu/zjCetZcT6fLY7uq0kD8E5dUf1Kpi053DCzNiZyDlvT/0B8lWoqeG95xHtvopJ3aKlPztitpNHXLQl0OPj7yDBMxMv1zmCwh8lWnUlHav9Phz3jQYQzJeCXuen1gfOEQoN0+30MP83mrc+3cfc/VySVHDLvqCnFgbxQ0Sv/2dObiADOL8oKkxaneHIKLuXZ9I8MTV5R1SehS1yv+EEsISfkARU9tpV5CEvtzKUlUwmqIX8+eKxJlJyvv1T1Xlk+ihQbFdd+DoqdtAZbL9fNxC18+L5z1gPDMxDR++efzFJGkwlI8CnCaDreoR4DN2TgI6798s3vu1QHIYo8fK5nGYXFZWavnNSmu9vaCnVXC+fD6mf9tLWpvqT3L0qa4KOZymCr4OsINJiiUkuQUjdZoXla2LQum39zaFI6+W5ZyUQgEXLJrzgTXQrYL9zDXHg79KZ6TVzR3+fqNIUoi7AFwLlQp77Ipfdb0epNl84JPUSzyOGIzC9xfwafMuaNqUdjJ30oG0Cy2W8LEiyFWz2FtpGP+Pm9OzbkeRW4Qv6Ipzbbg/rxfXV8mBMzIgtRvb+cq0FErDbl0MzACFRDUpBuY29WVb6ODFHGfkgzbVWn/t076JVF1Pff6Fy6p/9d7SDVj5GuDHpDon+AHW/3di4nhds+HV6XmYDHMkUnW5qWPpBz4pRHO91kpQ22L8QsZNToV5nOB2ZmETXj9rbCJWWUZM7iILk8rRtuV3idyv//gE5v5TSnTv9Fx/p30wSv9QThalJW4SFjgG1kVKPNBirN9azMKc0QBLjsW91UaL9NFFvD7F7HF3Ezg5RPXaws+emnUzg9TV3bOfUtcCaY8W0vqzw/eu2AuzJwfN9KQYU8/r8rtYLEleE9yzocSH/eIDM2L4PU8tPsawl6+EcDE0z3V/qwbgyPntvCsaRLwtOHx1Q5k/7cu/3bJy1OpVR4gLMLg95G6uJpz3eny8Azf1H8da2HOPOYlAtsP0LEX7JBxji/ITPi74uP/q7MYCX6zY1qPuyt5RPIVM9C+TtidPf1OkGEbngB34dosHLRdXWtp71CK8PbmM4h3lXiNOJ8g+GgF1QCVMZ4CoDDdb07pp3QfeqKXiTVX79HASZ8TEtVoMif1mm6bqhKMXYA/Fiv7DA/NpSlN0qGc90JZG7gC5i6wAsgAAA\",\n    \"base-double\": \"data:image/webp;base64,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\",\n    \"base-drawer\": \"data:image/webp;base64,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\",\n    \"base-4drawer\": \"data:image/jpeg;base64,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\",\n    \"wall\": \"data:image/webp;base64,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\",\n    \"wall-double\": \"data:image/jpeg;base64,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\",\n    \"corner-l\": \"data:image/webp;base64,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\",\n    \"corner-blind\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAQDAwQDAwQEBAQFBQQFBwsHBwYGBw4KCggLEA4RERAOEA8SFBoWEhMYEw8QFh8XGBsbHR0dERYgIh8cIhocHRwBBQUFBwYHDQcHDRwSEBIcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHP/AABEIAUABQAMBEQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APvqgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgCG4u4LRN9xNHEnq7AfzqZTjFXk7FRi5aJGJceNdIgfYJXlPcxpwPzxXNLHUY9bm0cLUfQavjfSG6ySr9Yz/SksdRH9VqEy+MdFb/AJfMfWN/8KpYyi/tfmT9Wq9iZfFGjv01CH8SR/OqWKov7Qvq9T+UnXXtLfpqNp+Myj+tWq9J/aX3k+xqfysnTUbOT7t3bt9JAf61SqQezRPJJdCZZY3+66t9DmqTT2FZj6YgoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAJwMnpQBgaz428P6BGz6hq1rCB2MgJ+lc9TFUafxSN6eGq1PhieZ65+0p4csspptvcXzltoYLtXP49R9DXDUzWK0hG53U8qqPWbseY63+0d4n1SSSKyjt9PiGRlPmbpxg8f1rhq5hXmtHb0O6nltGO+p5b4k8fa/OHu59TupplIYAyEA4PoOK5lF1naTOxQhTXuxMkfHK+tU/fWtzkAnMd0f5Yqv7Nn9mp/X3mbr01vALf9oRmPI1Ve2BKG/m1S8BXW0/zKVWhL7P5GnD+0LtX5p9TU+rRRsP/AEI0vquJW0l/XyD9w/sl+H9oNQctqMoX0ltV/oKn2OKX9Ifs8O/6Zfj/AGhLZgP9NtiT/ftpB/SjkxS6fkL2NB9S9F8erQjLXWlH6hl/m1K+JX2Q+r0f5jQh+OOnSYy+ltnsLsKf1NHtK63h+DF9Wp9JmpB8aLL5diR4PeK9FH1qrH7LF9Si/tfga1v8ZYGA2vfL/wBc7gn+Rqlj6i7/AHkPL15fcaEXxpjXGb3VV+r5x+Zq1mU11f3mby3yRfg+NcfAGq3q/wC/Gp/xrRZpPuyHln91FyL43xdP7cP/AAO2B/ktWs1n/N+BDyv+7+Jfg+NUbcDVbRv9+Aj/AArRZu+/4EPK/wC6/vNCL4w7sYvNLb67h/7NVrN33RDy3yZch+LaSHAk0tyOoWfH9a0Wben3kPLn5/cX4vieHx/olu/+5cj/AArRZou34mbwHn+Bbj+I8bfe05/+Ayg/0q1mUf5SHgn/ADFhfiHZn71ldD6bT/WrWYw6pk/Upd0TL4/0tusV2v1jH9DVLMKXmJ4Op3RMvjnRj1lmX6xN/SqWOo9yfqlQmXxnojf8vwB943H9KpYyi/tfmT9Vq9iwnibSJBlb+H8Tj+dWsVRf2hOhUXQnTXNMf7uoWpPp5y/41Sr0n9pfeT7Kf8rJ01C0k+5dQN9JAapVIPZonkkuhMsiP91lb6HNUmnsTaw6mAUAFABQAUAFABQAUAc54u8Z2Xg+CCS7imkM+7YIwMfLjOT261xYzHU8Ik5rc6sNhZ4htR6HhviD9py5ZWTRtLWP0knOSPw6GvNnmtSXwKx6lPKIr43c8s1n4ueLPEbutzqsqQkZ8uD5AOvTv+tcVXEVanxSO6nhKNP4YnGTXEtxO0k0jyO3VnOSeO9ZHRbQjhbMSjjiT096b3ERRtiR8nj5f5CmwRR1Vt8Tden9K0pbky2OB1SHhuOxr06b0OOotTHs7bfIoI4JqZysioRNNLAOACDnJGMfWsHUsbKBcGjqUwV6DnH4VHtSvZoVdFB2fTp+J/wodYaplKfRgIF+U/MDWka2pnKlpYl/sI5HBGIs1Pth+z1IZNGMdosmD93NUq15WE6dlcauisiggHkfrTda4vZ2Fjt7yPaY5pUBPBViKTlB7opRl3Lcc2rIcLf3Yx2Eze3v71DVP+VfcP3u4qatr0EqKuoXDDA4Zt3r65odOi18Ic1RPcsReKPEUZGL9u/WJD/7LUvD0H9n8xqdTuWf+Ey8SRMP9ISRSOjQr/QCo+q0H0/EftKiZOPHuvQlmK2xI/6Znn8jU/U6L7j9rNE0HxJ1oN+8t4Gx2G8f+zGlLA0ujGq0uqLEfxZ1CIof7PDMe4mI/pS/s6D+0J4h9jTtvjLqAwTbXCcj7lyf8BUvANbTD2kXvE0o/jbcRMAx1NW9FnJH/oVT9Tq9J/mNyp9Y/gjQg+PMgAzPqaZ/vqjD/wBCpfVcQtpE2oveJq2vx7jSQefqFwIyOpgDf0pexxXR/kJ06Hb8zTi+P2mHltTUA85e1cfqFpcmMXT8iXRomjH8cbFsbdSsGz03qRn8yKXNilvEf1ak+pYh+NNnIMm70lu3E4X+bUe1rreH4MX1Wn0kaMPxZtHG4LZvz1S6H/16X1mot4C+pp7SNC2+K8ZPFvMv/XK53fyFUsbJdPxE8Bfr+Bop8XFjAPmaonb5ZT/jVrMZd395m8uv2N3R/iNe6rloJ9WSIdZZiNg/EtXRTx9SezZhVwUYfEkT33xN1Szjf7NfSTOBwWC7R+nNbfXqvSRksHTe6PXvCGoXGq+GdNvbtw9xPFvdgAMnJ7Cvbw03OlGUt2eViIKFRxjsbdbmIUAFAHknx1QHTtJJ6b5R/wCOj/CvneIfgpvzZ7OT/FJeh4ZbQWrGRGtLIqpAG62jOBj6V8869RdT3HBGrJo+mFpP+JZZBf8AZhVeOfQe1H1mp3MUvMoP4Z0WWMyNpcO/DH5XkUcEdg3vVLFTKad7XIx4Q0QlgLEqAxJ2TP2PuT7VX1uXVCs+5Rm8B6J5gdPtyHH3VmXA249UNV9ddtUNKXcz3+Huk3kjwfaL6M7epZH7em0elaRx1teUJRdjn7/4NWd59n8nXZ0WdNy7rMN+Z8wevpXTHM4xWsTJ05S+RRPwNFhtYa/G+GH37Qr147MaHmMJdCoRfYefhFqCBWTU9NZAeDmVT+Ww+tR9bpvqXfXYmHww1RBgT2EjgdFlI6n/AGlHpU/WIPZlc3kNj+HOtxyZ+yxMFQfMLmL3z/FQ6sX1Q+eK/wCGZSufh3r+0bdOZ8LgiN0Y549DVxqLuDnHuKfBWsK8n/EovgRAFH+juQT7cUczDnh3KWo+Fb2K12yWNygCjO6Jh/SiNRp6j919TPu9O2RlVTDgADPrTjPUbjcR9IWLYu3oVHP0NCq3Hyo7nwX8Hdc8ZQteWdusWno/lmeT+IjGQq9Tj8B710UsPWrR5oLQ5a+Lo0Xyyep6Fbfs7aXaxILy21W4uABmVEIAx6AA469ya0eHrR0cX9xy/Xoyd0195BJ+znouSwbWo85OGAwPzSj2VX+V/cP66u6+8o3HwE0dHA/tS5jYdBIq/wD1qxknHRuxrHEt6pGZcfs9xTZ8rX0wextv8Hoi33G8T3iUn/Z3ukVlj1e2f0zEV/qad5DWJj1RiXP7OviHI8u70tgvIzK4J/8AHK0U2hOvBjR8A/EUETYFjK3BAWb/ABAqHOTLVamZ83wT8VLM2NLVlB4ZZ4jnn/eo55WH7Wm+pTufhB4liUk6LOcYHyFW4x7GhVWPnp9zNufhtr8TOH0PUeAMf6M5B4HGQMU1VY7wfUxb3wRq0EI8zSb2PKc7rdvT6VcayvuJxTVkVBoDpcQoyMvyEncMEfhQ62jHyalePSG8gNtIBJ/nVOrqChoV4dJZxv5G7nPtVOqloSqZ0Xhv4Y6/4umxp1k32deGupvkhX6sev4ZNHtUiZOMd2e1eFfhboHhAxSXtzJreor0BJW1jPP8P8XXvkewrmqVFLoZ883todnLqE926h2AjCjEajCj8KybEkkRTH9w/wBKFuM+m/A67fB+iD/p1Q/mK+nwv8GPofPYn+LL1OgroMAoAKAPKfjqv/El0tv+nhh+aH/Cvn+IF+6g/M9jJv4kvQ8It3Ilk9M5+oxXy7PoGbs7ALPg5IB5H/A6l7mC/r8ARSY5V9m/UigHuJ0ef15/9DoDsRTEeYo9UPH4il0KRTsCDfyvnrHk/rVDlsTRKCml8fwEfoKGTfcjvyHmjj7s38uaEVHRErEJF+ZAoF1GRtiTPt/U1JTLEf3ZuOCCP/QqZL6Fbj+0AOgOP6f4U+g/sjbchShK4Iz+lIpli6e4glQwyNsfrhiMGqjJrqQknuiWGa4xEGuJG+XnLk0/aT7sTjHsQI5nlVJUjlXHPmRq38xT9rNLcbjFHs/w3iji8MxrHFHEnmudsaBV7dhX2WTycsLFvz/M+bzL+Ozrq9Q4AzQAuT6mgBrIrfeVT9RmlZMd2VX0uwlbc9jas3qYVJ/lWUsPSk7uCfyRarVFopP7xp0jTyMfYrcD2jA/lS+rUf5V9w/b1P5mQP4b0t23G0AP+zI4/QGs5YGhJ3cfxf8AmWsVVWl/yGnw1pp6QMv0kb+ppfUaHb8WH1qr3Kr+ELJzkT3Sj0DLj9VrN5bSbum193+RosbNdF/XzGnwfaY+W4nz/tBT/QUv7Np93+H+QfXZ9kV28GfN8l6oX0MGT+e6s3ljvpP8P+CWsd3j+P8AwBj+CywINzE/s0ZH9TS/sx/zfh/wR/Xl2M+bwA0pIaDT5EP9/P8ALYaxlltS+lv6+RqsfHz/AK+Zxfi3wjofhwW/2rw/pM0lxu2bbdCOMZydo9a5sRh5ULc1tex1YfEOtflk9DnZtSnudsRKx26AqkMQ2ooHTgVyN3OlRS1KyD94n+9QNj4uJcf7IpsRJcj9y49hQtxH1D4PXZ4T0If9OUJ/8cFfU4f+FD0R89iP4svVm1WxiFABQB5d8ck3eHtNP/T4B+aN/hXg8QfwIvz/AEZ6+Tv97L0/U8Ft8BmznPB5+hr5Rn0DNuchll45K9f++qDFCxNu3A+n9RSQNDJD/wAfDZ6EL+b0B2I512455Ef9aQ0yjp52vO/cQZ5+lWVPYvRpzYAjlUPP4CkyO5Wlj3ahC2BjY349KOhS+ES6bdJHEufnYDj0BFNBHuPCYlXOQCrD+dQim9C5HgbwB0yP/QqZmykRnUIye4U/oafQv7LGon72RTgbZGH60ht7GiEEoiyM4PNBnsJMAvTGAAKGNFK0+aTJ+tDKex7T8PXCeGQzHhZHJ/SvtMl/3SPq/wAz5rMv47OntruK7iEsTbkJIBxjpXrNWOAnpAFMAoAKACgAoAKACgAoAKACgAoA8p+MALXeiKOm2bP5x142bPWHz/Q9bLNp/L9TzhOZGPbBrxz1GCcsPZqZLJIx++P+7/U0xD7g/um/ChDR9UeGk2eHNHX+7Zwj/wAcFfVUf4cfRHzdb+JL1ZqVqZhQAUAeb/GuPf4Ws2HVL5D/AOOOP614efr/AGaP+Jfkz1Mof75+n6o+erc7ZSDzwP8AP618kz6R6m4y53AAH5V5/E0jEZakOBgY+UfqRQORA7lYpSTjdMgA/wCBZpoOqH3A3I5zkqgX86SBblSBf3Vwe+1V/MiqHLoaIP75FP8ABGefTn/61IjoVJyVvI8dViPX3P8A9agpbBZoHm3kZ2KAPqeaGN6Idu3TIR90B/5VKDZFuD+P0wf50yGUJWxc2zd8If5j+tMvoxyDF9MvYuf5Ugfwou28h8sn2z+NBElqNuG22jSeo70DWrsVbMHd16DH6ihlvY9i8Bg/8IlLn+/J/KvtMk/3SPq/zPmsz/jv0Lvh6ExWyzB2IkJBUn5RgnoK9iT1POR0iHIFSMfQAUAFABQAUAFABQAUAFABQAUAeXfFgZvNK/2Y5T+qV4mb7w+f6Hq5btP5fqeaxDBYj0/rXknqMFGJV/2uf0NMTHD/AFrHoOP50wHTf6o/UChAfV+irs0fT1/u28Y/8dFfWUvgj6HzVT436l6rICgAoA8/+Ma58Iqf7t1Gf0b/ABrxc9X+y/NfqellX8f5M+coDm5IHdF/nXyL2PpWb5BJcdhjH5qf61JiRWYChO+AoJoHIq3H/Hqrd2nH5gU0UtyW5G2NsHgtj8hSFHcj09P3OCf9ZJ/LJ/wphN6lkkmSYjqu1Pr3/rSJILsbZppMf6tAg9zVeQ47BABDaSuBhnYj+lIb1Y1SVkAHPLD+VSUy5A3Udjn+Y/xp9DNlG5+VrUkdh/6EKaLXUdKdmovwcHac+tALWJMWCHb2J4FISVx96u202g5+UdaZMdWVbPlmOD0yPz/+tSZpI9i8Cc+EpeMEvL/KvtMk/wB0j6v8z5rM/wCO/RGroX/IMh/3m/8AQjXry3PORtx9KQyWgAoAKACgAoAKACgAoAKACgAoA8r+K7YvtOH/AEyk/mteLm+8Pn+h6uW7S+X6nnEPIf6f1ryD1GOXmSM+gpiYY/eH6L/OmA+4/wBV6fMP6UID60sF2WNsvpEo/QV9bD4UfMy+JliqJCgAoA4P4vLu8HSe1xGf1rx88X+yP1R6OVv/AGj5M+boFxcu2SD5S/8AoVfH9D6ZnRZBbJ6kH8fu1KMCK2Xjg44GB+BoHJkDR7oI1xxuLfp/9ejoVfUZettjj/4F+lNBEfpqFIIS3ZWf6cAUxT3ZNbHhWPJdi556ikJkN5IAowQdvzt7nsKYRRDKWjt4kDbSBuY0it2SKp3An72ev/fNJDbLNvgEHPY4/JTTIkUtQXEcLDHy7hk+oI/woRUeol1lbrcepUYoKjsWvK8x4Xx06+4pEXtdC6o+E9Bgf1phTRWtV+Q+gT/Gky2z2HwJ/wAilN6eZLX2mSf7pH1f5nzWZ/x36I1tCP8AxLIc/wB5v/QjXry3PORtR9KQyWgAoAKACgAoAKACgAoAKACgAoA8o+K5/wCJlYDPAjb9SP8ACvFzbeHz/Q9bLdpfI87h5RvoK8g9Nj4QCyj0B/pTExcfvfbatMQ654jH+8KECPriJdkSL/dUCvrlsfMvcfTEFABQBxPxXGfBd0fSWI/+PivKzr/dJfL8zvy3/eF8/wAj5piINxMMf8s+MD3r4zofUM3QdxU+qN/SkYjouN+ccZH5ZpCZC5EcKgY6Dr7kCgrqVdQf5I8DJ2Z/MGmVFFm2YfZ2PQeUMfrQTLcSE4dB2CDn86QMhuUWTjH3nXP4c/0pjiRu3mOAQAM4Hv70DLZG0qD1yv8A7LSQhYz+7Vh7/wDoFMT3INRUi2z3DP8A1oW447jbzmSBj0KDn/P1oHDqXrJSYY88kUES3K2r/eRfdc/nT6jp7CWoGyQ9qkqR654B58IS45zJN/OvtMk/3SPqz5vM/wCO/RF7QJpTbiNotsIJ2Pn73Jzx2r2JbnnI6OPpUjJaACgAoAKACgAoAKACgAoAKACgDyP4rHOr2o/uwg/qf8K8TNvjij18t+GRwMPEbfQfyFeUeiwj4k/P+VAMkBxNj/ZFPoIkkXfJCn96RRj8aqG4j64r60+ZCgAoAKAOO+KY/wCKF1Rv7piP/kVa8zOF/sc/l+aO7Lv95j8/yZ8yxqFupP8Acb+dfFdD6h7GzCcIhzyYuPyJqTNrUcjki4OeRvI/WgVthkhHlk+mOPxNAyte8Oq9tuM/Qf8A16Co7Exz9lds9UUYpk/aHJjcxIwFXj8v/r0gZHcA+aePukkcegA/rTHEhgXdcAdRGMcUDexcc5kjJ6bwP5VJPQbCMxAeuMfihFUDGX3MCj1k/mKAjuR3Hz21qxwcxA0Mcd2aFg37rn1oRE9yjqZzcRgdSaaKhsPh4h98r/OoY3uev/DiMHwwUYcGaQGvtcl/3VerPnMz/jv0R0sdlFbRrFCu1F5AznrXrN3PPLKDFAD6QBTAKACgAoAKACgAoAKACgAoA8f+KTg68E7raIfzZ/8ACvBzV/vYryPZy5fu2/P/ACOGj+4fw/kK8w7wUfvWHt/Sn0Aep/ef8BFMRYt13X9mpGczr/MVdP4kKXws+tK+sPmQoAKACgDkvicpfwJrAH9xD+Tqa87Nl/sc/l+aO3L/APeYf10PmPH+lOOAdjD9TXxHQ+p6GvEA1rERkkp/7LSsZvccwwswHdSf0NIRFcKSsgHTAAPvTGitqBPmxgdSCf0oRUdi2E/0bB77VoJvqLCuXcg5ywH+fyoE9hl04Qysemc/5/KgcSOxXYm9upGaBzJmYboz23A/of8ACkLoJGcKo9No/Q0Axl3zbA85EifyX/GmEdyHJ+x2WeyhOPyp9R9WT2shESgHjBFIJbkF2S0qHP3ef1pocSa2OICc857/AOfapCW57D8NTnw1n/pu/wDSvs8l/wB0Xqz5vM/4/wAkdfivWPPACmAtABQAUAFABQAUAFABQAUAFABQB458T/8AkYnP/TnGP/H5K+fzT+OvRfmz2su/hfN/kjil4Rvr/hXnHcKq/vX+lPoAoB83HsKYi9pq79a0tMfeuUH/AI8K0o/GvUifwP0Pq6vqz5sKACgAoA5j4iAHwVrOe0Of1FcGZq+Eqeh14H/eIep8usALtz1yGH45NfDdD6tbGpaklbVQMkqQfb5akzfUkGQshPJCnj8KSBhOpIlHow/DmmJFe5G+8VccBR+GT/gKOhS2LL8RjBPLgY+n/wCqmSLaYAU/3st/M/1pikV7sF0UH+Ij+h/qaRcRzZ2Mo4x3oFYaDnacAEAH9GpIZJFjOMcblH6kUIUiO4/48pRn7pU5/wCAimgjuQuP9ChGfulv0an1KW7LFuF+YAjKtmpEypeZFweOwH86a2KiTRf6ge+ev0/+vQxPc9j+GRJ8MjP/AD3f+lfZZL/uq9WfN5n/AB/kjsa9c88KACgAoAKACgAoAKACgAoAKACgAoA8Y+KLY8RsO5tkH/jz18/mn8dei/NntZd/C+f+Rxq/dP8AvN/OvPO4kTmQ/wC7QAqjLj/dFMRo6Em/xNoi/wB68iH/AI+K2w/8SPqvzM638OXoz6ozX1J84GaAFoAKAOe8drv8Ha2P+nZz+lceYK+Fqeh04N2rw9T5XmA+0kZx8x/rXwfQ+tWxqWTlUh3dQw/qKlmckTLjD+4XmkhDZWOX2gZ8z86YIqqN99M2OFAH6UFfZLDP8sAIILFiQaZPcIm++MH7gH6CgGJMVMqj0J6/Uj+lDHHYjlO5tgz6mga7hGSYgG6+WD/46anqNkkZw0ns6j/x81RLGSf8eUgPB2r/AOg4/pSGtyDObbHoz/zpj6kkLtGwJUlSo5H0FJhvoMvV5DY6gmmtgiOTKwJn1I/QUA9z2P4Y8+F0OCMzOefwr7LJf91Xqz5zNP4/yR2VeuecFABQAUAFABQAUAFABQAUAFABQAUAeK/E87vEj+0CD9Wr5/M/469P8z28u/hfP/I5Ff8AVn/eb+decdo+PufY0wYoP7xcelAjX8MLu8YaEPS8iP8A4+K6ML/Fj6oyr/wpejPqDNfUHzoZoAfQAUAYnjBPM8Ka0D/z6Sn8lJrlxyvhqno/yN8K7VoeqPlSXi5yepI/pXwHQ+vWxftBlBns4/8AQjSZEiz91m+qDH4igkjYZD4PJkXNAyCLma4POS4A/D/9VA3siSUZMYJ4Cs2fr/8AroEupJtO9wD/AHf5/wD1qBEUiFp0OexOPrk/1pjWxX+e5ldFyI89fWgrRIsSjYXA6KmP0apEgjP72T/fz+T0wewqjekqkZ4UEY92FAiop/dexc/qAf60y+pctB5kAH+yOaCJaMhvh0Hfy6CoCuCeDkYY/wBKEI9f+F//ACLH0nf+lfZZJ/uq9WfO5p/H+SO0r1zzgoAKACgAoAKACgAoAKACgAoAKACgDxL4mN/xUkvrsQfzr5/M/wCP8j3Mv/hfM5ReYx+NecdgsZzkfWmDHp95aBG54PUP4z0QY6TqfyNdWE/ix9THEfwZeh9L7q+mPnhN1AFigAoAy/Eq7/Dmrr62kw/8cNc+MV8PU9H+Rth/4sPVfmfJswH2sDPAYfyr8+6H2CehcttwiJ77gfryaRL3LbEqXPo4/wDQhQQNKbRFnn5x/KgdyK3Pzuc8bmb/AD+RoG9h8gAm25yAgX86BdLkgwHlbGTuxz7AmmSMdSrSMBnapGf0oGAdLVUjPLYycCgLNiMDli/Ur/8AFUil5CD5WmwO7H9QaA6IkiXG4D1/9nNBJQcYjb2cZ/ICmadTRswPs/GOOtBlJ6lKch5GB/uD9SKDRDmAEh9eT/L/ABoFc9g+GI2+Gcek7/0r7HJP91Xqz53NP4/yR2dewecFABSAKYBQAUAFABQAUAFABQAUAFAHhvxGO7xPek/whB/46K+dzF/v36I93AfwUcwv3VGK4DsJVTaz475NMkUDkfSgDoPA67vGuke0hP5A114P+NEwxX8GR9Fl819KfPhvoAvUAFAFHWl36PqC/wB63kH/AI6axxKvRmvJ/kaUnapH1R8ky4+1+2VP6V+edD7JbFpTttXyc45xj3H+NInqWpmBBJPV/wD69BCQjZLRgHPz/wDxVAyG0OVfPp/X/wCvTHIlRd1w7H1H88/0oJ6D4GUIpPdmb60wY2c/uAO7sM4+tIFuRsDJcr97C9aGNaIdKwLsOMEH+T0hpaCuNryk9CrfyBoEtkPQlZyPY8f8CH+NAuhnzOA0wHQMv8xTRaL9l8qOv40ES3KgH+ksP9wZ/Gl0LvoK7fvGHbGef+A0+gj2P4a/8i43Xid+v0FfY5J/uq9WfO5n/H+SOxr1zzgoAKYBQAUgCmAUAFABQAUAFABQAUAeEePjv8Uar/syRj/yGlfNY9/7TL5fkj38FpRj8/zZgYwB9P6VxnSSJyGJ6gYpiG9x9DTA6PwCC3jXTPYuf/HWrrwP8eP9dDnxf8GR9AeZ719IeAIJeKANigAoAraiN2n3Y9YnH6Gs62tOXoy6fxo+R5V/fEnrha/OlsfZInUZtJiO+cfpSE9yeZgWjAz8zf0P+FBKHPxLEc/xEn8j/jQC2Ktmcwg5wDtH8qZUtybzNjOcdBnHvgf40E2JFJMcJ6ZXJH4UCIrkgi0GOTjn6UIa6kTXRid1AyeSfagdrjoiHaI+oxn1zuqRvYncAAk4wVz/AOOimSG4rdYPof5rTF0KEqjfOfTB/U0I0L8R2FiTwy8UGbKoOLlR2LoM/iaOhb2AuN7k44U/+y0dBHsnwzIPhs4/57t/Ja+xyT/dfmz53NP4/wAjsq9c84KACmAUgCmAUAFABQAUAFABQAUAFAHgvjok+KNXz082P/0WtfNY7/eZ/L8ke/g/4Efn+bMQ8D8v6VxnSKDjf6f/AK6oQnVj9DQM6b4f/wDI52DdlWQ/+ONXbgF+/j8/yOXG/wAB/L8z3LzR619EeCHme/NAHR0AFAEVyu63mX1Qj9KmavFocd0fIk65mPbKLzn61+cLY+0ROgH2aVe4LcflSF1HjkwHqc5/Q0hMfM2ZI8nruYe/y4qhIrWyEQxjnqv4dKRUtxX63GOy4/Qf4U0LsXJTtIUcAJ/h/jQSitPn7VYqp+UIWP8AL+tPoNbMq3nERYZyzfrSRcS1arsSJT1+XP5mkKRJLzEPUqP/AECglbg7f6X+Df8AstMFsU5xta4x6Z/U0ItdC2XxGhx1HrSI6kKfNcKe/mJ/I0ynsRMoImzkEJ/8TQgPZ/hl/wAi0fXz2/ktfY5J/uvzZ85mn8f5HZ1655wUAFABQAUAFABQAUwCgAoAKACgAoA8C8cHPibVv+uq/wDoC181jv8AeJfL8kfQYP8Agx/rqYx+4T6f/WrjOgbAdynJ7f41TEOXr+FAHT+AOPFVu3ojn/x013Zf/HXzOTHfwWex+d15r6E8MXzfegDsaACgAIyCPWgD5FePMwUkEhF/qK/Ntj7RMlSP9zIOBnP9aXUV9RI8Yjx0wP5GgGLc4BU8YSJyaYkR2qkBAp+UJnk9KByEbme5APHy8/mP6UB0RYlfdJPjnC4/X/61BKWw14/9LRh1WIj9aAT0KzICIQwB5zQWnuWD8u3HTKf+hUhA33AMn7ij/wAdNAhHIN2p/vRsT+S0D6Fa4A3yq3VhjimhrYkJ3WUeMkqAaA+0JEP9IU/7a4/I0gexDEd3nc4G3H8qY2e0fDD/AJFpv+u7Z/75Wvscj/3X5s+czT+P8jtK9c80KACgAoAKACmAUAFABQAUAFABQAUAeAeNGz4k1U5zmUD/AMdFfM47/eJf10PoMH/BiZHVW/KuQ6BsH3PwH9apiY9OuT/doA6fwIR/b8bf9MmP8q78uX7448f/AAj1LzuOa+gPEF86gD0GgAoAKAPkq7Qxaip7Ash/A/8A1q/OJrVo+yi7xGuwEaDnG4qf1H9agfUIVyAvXAoYMZdsAZieiwnv6k/4U0ESS0B8s5P8Kj9aBSKUKl7icA/K5j7+5zTKZfYlvPOeGcKP0pEdgl4u5sHJWMcfnTBbDMf6seiDv60hisf3YHX5l/8AQqQEjDKocdAP5kUAV93+lQcZDQt/JaY+jGyKDcNnGMkfyoGth0bf6Mg/2aGHUAoV0P8At/8AstJhuVIDkznrx/U/4VXQb6HtXwv/AORbcnvcN/6CtfX5H/uvzZ85mn8f5HaV7B5otABQAUAFABTAKQBQAUwCgAoAKACgD568Wvv8Raof+m5/z+lfM43+PI+hwn8GJmjpj3rlNwX7uMdhTEJGeEz/AHaYHX+CLGZbpr0rthCFAx/iOe35V6mW0pc/tOh52YVY8vs+p3omz3r2jyRRLQB6jQAUAFAHn978ItFuXd47q+gZiWIV1K5Jz0K+9eLUyLDzbabX9eh6UMzqx0aTMK7+DEeD5GrjrkCW2z+oYfyrllw//LU/D/gm8c2/mh+P/AOB+Ivhpvhr4YvPEeo3MUunWhRZBbhvMG9wowvTqwzzXNPIcQtYyTN45rSekk0cr4EvoPijp17e+HBJdQWzCCff+7ZSRkDDYz+FczyjGL7F/mv8zdZhh/5vwZ0kvhvWbWN1bT5+ePlXdjr6fWueeAxMN6b/ADLWLoSek0ZJsLmxk3TQyKCwOHUjoK5505R+KLRupxn8LESXBUFTgPuOP0qB2BpVLTuQ4LkAfKenH/16YWYPMm5iGAxgDPtQCTI1fNuDn+Mf+hilYrqWgTx+X/j9BJXDfNaN/F5X/stA+jG3ORI/bD5/kaBrYiV9qhOB1x+JoKt1J967sY6McfglJk2KUX/LX3bHP1aqGz2z4X5PhuQn/n4b/wBBWvr8j/3X5v8AQ+czT+P8jtK9g80KACgBaACgAoAKACgAoAKYBQAUAFAHzp4jbzNe1Nh/z9yD8mIr5fFO9afqfR4dWpR9CkOh+prnNRw6N+FMRueHtAa/MdxcAraqOB0Ln/CvRweDdV88/h/M4sVi1T92O/5HexlYkVEUKijAAHAr3UklZHjNtu7HiSmIXzKAPX6ACgBjOBQBXe4A70AU5roDIzigDxP9qGRbj4IeKkHOFtz+VxHQB4/+xPOE8OeLYs4/0yE4+qN/hQB9M3eoRQglm+ooA5rU/EChSARz07UAcXqeowzjLrGw75ANZSoUp/FFP5I0jVqR+GTXzOaubmIn5UXv93iuaWW4WW9Nfl+RtHHYiO02UG1VlGBnHfJNc0skwktk18/87m8c0xC3afyIBrbKTlc89MnFc8uH6X2Zv8P+AbRzep9qKJRr0YP+qI46hzXPLh+a+Gpf5f8ADmyziL+KBIuvW3yk+Ym0bR3x2965p5Hio7Wf9ehtHNMO97om/tm1nJJuQSe7DHt6VzSyvFx3p/l/mbxx+Ge0vzJPtMLSKyzxEjjaCPr61zTwteHxU39zN44ilJWjNfePW5Tgkg/e5B7kYrBprRmqV1oMibCuDzl93bjk/wCIp3Q3E9u+FpB8NPjP/Hy/X6LX1+Rf7t83+h81mv8AH+R22a9g80KACgBaAEoAWgAoAKACgAoAKYBQAHpQB836z/yGtSz3vZj/AORGr5Sv/Fn6v8z6Wj/Dj6L8isx+Q/j/ACrJFjvCuraRrvim70VZ/OuLCETzqnKqScBCfXknHtXp4LB+19+e35nBi8V7P3Ib/keqKyKoVcBQMADsK9xK2iPGbvqx2Qe9MBaACgD2NpAooArvcD1oAqS3RzQBny3mCeTQBRmuuoz09KAPGv2kNWtLb4Sa9a3NyiTXqJHDGWALsJFbj8qAPC/2TPElto6+J9MlnSO7u3hliQsPmChwR9eR+tID3/VdaDbgWJHt6imByt5qoYvtOQc8UAYtzevIwBJ5PGaAMuaRmPU/j1oArhTICMnkfkKAG7WwCTyc80ARtFnnkKTQA0pjd/eHGPegA8pj7g96AGNCU9gO1ABsZSNrEe4NTKKlurjUmtmS/arhekzhT2JyK55YLDz+KmvuNo4qtHab+863w58Ttd8L2bWtqtrNAZPM2zxknJwDypHpWtGhTox5KasiKlWdV803dnVW3x9vkH+k6NbSH0imZP5g1qZmzbfHzTWH+laPeReojdX/AJ4oA2bX41eFrgjfJeW+f+ekBP8A6CTQBtWvxJ8KXePL1u2Gf+eu6P8A9CApAbNr4g0m+x9m1Synz/zznRv5GgDRBBAIPB9KACgBaACgApgFABSAQ9DQB836wd2u6j6fa5f/AEM18rX/AIs/V/mfS0v4UfRfkc5421KPRPBms3slyLef7LItsd2G80qQuPxIr0MHgeb95U27HDisZy+5T3PKP2W9QW08Ra4tzKVurqBCnmZzJhiWPPXqPzr2kraI8lu7uz6sj1DOORmmItJdH1zQBYW4564FAEyTZIoA9fkbqaAK0hJyBQBSlBOR7UAZ84ODyMdaAMm8dogdv+OaAPnn9oHwV4o8b22mDQ7eO4+zF/NQyKpIOMDDcEcetAHjvgn4OfEDSPENtfXNlDZQQtuI86MZPYgR5z+NID3OPw/qnl/6VOGcddoz/nvTAY+gyxjlm5oAik0WQMvLHHFAFc6W6ZypHvigCFtNKk/Jnv04oAZ9gbAyvbrj86AGNYsvOw9e/NAERs8nB4PYmgBjWpGGGCfTpQAz7JxwM9MAUAN+zt3PI7+tAERttpJAyP50AIbdgeAR7AUAMMY3DA6HgjmgBgh2jIAOPSgBDEBlsgj6UAM8vK/KP0oAUxnHTGOvvQBNBeXllzbXM8XfMchT8eDQBr23jjxRZf6vXNQ46CSUuB+DE0AbVt8XvFttjdqEc4B/5awJ/QA0Aa9t8d9fj4uNP0+UDuqup/8AQj/KgDYtf2gAeLrQSMdTFc5/Qr/WgDZtfjx4dmA8+01GA+vlow/MNn9KANMfGvwNGqNd69DYh22hrxWiXPPG4jb2PekBtWPxB8JatCZLHxNo9zHz80N7Gw+nBoA+dtf1uOXVb5rRg6vO7iQdCCxIxXmUMFepKpUXV2XzPRrYy1NU6fZXZ5T8ULDX/E1haRadGJWhdty7lG5SOmG4PY8+leoeccv8NvCfirRvFen3txpixWkL5lP7tcjBx05ODg/hQB9RaffyvjeMEUAbcd4cD9aAL8c4J9DjpQBehbPTFAHtzx80AV2hPbNAFeSLHegClLCxB4xx0oAoy2YbPA9yKAKE2mIx+6B+HSgCpLpKNu+Xnr060AVJNFQ4ynJ7kUAVJNBBJO0DNAFaXw+r5CpgnvmgCrJ4aDA4QcDqaAKcvhdQcbOTweKAKs3hgDooHXp0oApS+GGyw2gAelAFSTw04wQpwe5oAqt4ekGQI8gZ7UAUzob4GFGOnPpQBDJo0inO3t6UAVX0tyR8pBPqetAEcli4b7vJ79/egCu1kRjjnqOM0ARmy2nHIwPxoAjazG3Ix/jQBG1pgkbQD6npQBG1uTkleT2xQA1oSF5OfUjqaAIzAVyAoLHvQAz7OWJUdxxkUAIUVuuMdh60AMeAEEdz3J6CgCHy8YyOnSgDzr4wRlfDdpkEE3a5z67GoAv/AAmhz4Rjz0M7/wAxQB6DFbllXqOPT1oA0ILPPUHmgDctLAtjg4PFAGzHAEUY7e/agC/DAWOADhuM0AalvbsQMdfpQBqW9u2BgUAe5lQaAGmMGgCNrcGgCM2gJPGaAIWsR7UARNpwNAEJ00HqM0ARSaaM/doAjbTFOOKAIW03A+7+FAEMmm57ZNAFZtL44zgUAQyaUrE5Tn6UAV30dQT8vH0oAgfRx9B6HmgCs+ipzlT26igCtJoCkfcH5UAUpvD6EEFPxxQBTl8Opg4THQn5aAKUnhsLjjB9AOlAFSXw4A2AMYFAFKbw2QCAMjHXFAFCTQH6BTjvjpQBTk0Rh0A/LpQBWk0hw+SpHbFAEEuksoPy9OnFAFV9PbJ3LnHfpj8KAK7WTFvunr2oAjazPb+LvQBE9me6n8RQBH9kxznp14OT/nigDzT42RLb6DYICAXudwXvja3P60AbHwatlm8GQlSCyzSZ56c+lAHpcNhnHy5x6+lAGta6fgrk4IoA14rQKox/9fFAGhbWJJ5HvQBsW9hlQdvPuKANa3088HGT1oA0obHAA24oA9UoAKACgAoAKADAoATaKAEMYNADTCp7CgBhtwaAGm1FAETWa+lADDZDHSgCFrHvj8aAIm08cZ6UAQNYdeM0AQtp/X5eTQBXfTMj7tAED6YMHjFAELaWvB2gDGPQUAVpNJU5+Uc9cDrQBVl0cEdPl9KAKraKM4wNx56UAVpdBUgjyxn16UAVJPDy7fun8qAKE/h5CcBRjsMdKAKUnhsZYBDnPGBQBUl8Nf7OT0x0oApzeGT/AAoSPzoApN4dYPnyznPXp/n/APVQBSm0aWLJERPPYdaAPmT4uSXsPieeO5tpltlwY3bcmcgZCnoRxQBt/A29vJ73ULWG3mMAjDqVLMN2Rkk9Og/nQB9Hadot1IFaSMjPrxigDo7fRimAwBI/SgDSt9J6cHj2oA1bfSyo+6aANK300BQccCgDThsCMZXFAF+Oy6cGgDsKACgAoAKACgAoAKACgAoAKACgAoAMUAJgUAJtFADTEDmgBpt1PagCNrYE5xQBGbQccUAQtYg9qAImsQc8daAIXsecAcUAQvp4/u8daAIX08ZJwMUAQNppGcdc8cUAQtpmf4Rz60AVn0vI27cDrjFAFZ9K5JI496AIm0hT2zj/AD/WgCE6KpG1kz+HSgCP+wFbOQMn1oAjPheGTO6JWB9s0AWoPDECA4iAHsOlAF6PQok/hxkcUATJoaZ4x09KAJ49GUfdHTpzQBbj0oZzigC3Hp2MYHPrQBcjsB6UAWVswO1AF2gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgBNo9KAEKA0ANMQNADTACKAGm2BHQUARm1HpQBGbQZoAjayBB4oAjaxHIAxQBCdPz0AoAjOn4P3ePegBBp4GBt4oAeLEZB29KAJFtByQvFADxbetAD1tenegCRLcj2zQBMsGDz0oAmWICgCUACgBaACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoATA9KAEKA9qAE8sUAJ5Q9qAE8kegoAPKHpQAeUKAF8oUAKIwKAFCAUALgUALQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB//2Q==\",\n    \"corner-wall\": \"data:image/jpeg;base64,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Zc0AQsmSeKAIymO1ADGSgBu3uaAALQA8JmgB4XFADwKAHhaAHgUASAUAPUelAEoHfFADxwPagB4HSgCQDFAD15NADxQA8UAOWgBwoAeOtADqAFFADhQA+gAoAKACgAoAawoAhZaAIGWgCMpQAwpQAwpzmgBNvrQA1k/OgCFk60AQsvJ4oAiZc0ARMmP/AK1AEZXmgBAvtQAbfWgBwTFADgv40APAoAeAOKAHigB4U8UAPFADwKAHqKAH45oAfQA8UAPFADxQA4UAOFADxQAooAcKAFFAElABQAUAFABQAhoAjYUARsKAIitADClADdlACbaAGsuc0AQuvtQBC60AQstAERXjpQAwqaAGlaADZ0oAcB+FADgtADgvFADgOaAH4oAcoxkdKAHgZoAeBxQA4CgB4FADwPyoAeKAHCgB4oAdigB9ACigBwoAcKAFoAkoAKACgAoAKACgBpoAjINADCKAGkUAN2+tADcZoARloAhdaAIGXmgCJlz2oAiZR70ARlfagBu2gA2//qoAXHNADgM9O1ADgozQA4D+VADsdgaAHAD04oAcBQA8UAPA6UAOFADh0oAeKAHCgBw9KAHCgBwoAcKAHUAOFAC0ASUAFABQAUAFABQAhFADSKAGEUANIoATbQA3FACFaAInWgCFl4oAhZaAImXPtQAwrn0oAYVIoANv5UALigBQD070AO2+lAC47UAKKAHKOntQA4CgB4GKAFAoAeBQA8UALigB4FADh0oAcKAHCgBaAHDmgBwoAWgCSgAoAKACgAoAKACgBDQA0igBpFACYoATFACFaAIXFAETCgCJl9qAIitAEZUCgBNlACbaAADH+NAC4oAXbQApHNAC49e9ACgZoAeBQA4D60AKO3FADhxQA4e9ADgOgoAcB60AOAoAcKAHCgBRQA4UAOFAC0ASUAFABQAUAFABQAUAFADcUAJigBMZoAMUANxQBGwoAiZaAImFAETLQBGy80AN20AG3FABt/GgAGKAFxQAuOfpQAYoAcBigBwGPxoAUCgBwoAcKAFHWgBwGKAHCgBwHNADutACigBwoAUUAOFACigD/9k=\",\n    \"corner-tall\": \"data:image/jpeg;base64,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nuO1AFtPDgAA2cHnigBH8NDbjaP6UAZ134TilBJi9uO1AHPal4GVwdqkjoBigDkNQ8GPCMiM8DHA/wA/5FAHO3fhuVCSUKkfrmgDJm0x7ck7CAOT1xmgDy/xc8CfEnwqjSooixvbcPly3GfSgD3Wz8OSylSFJ3fgaAOj0/wi27levTNAHUWHhSNFG5R7igDorXw/DDyI8knuOKANu201lAIXaf6UAa9vaOo6dKANGGAr1oAsgYFAC0AFABQAUAFABQAUAFABQAUAFABQAhANAET2yMOgoApz6erDpQBl3Gl7s8UAZt1pW8gFMrzxigDndT8HW+oRtGUKhu6+9AHkfhz9lvTPDOvxavb6vqU7wFjHFMyleQRzgc8E0AeqW/gpLfny+2KANa28OqgChce1AGxa6IECjaKANeDSgg4H50AX4rFVxxQBZFugHSgANuh7UAVpbBW7UAZ8+lKx+7QBkXWiZGCoI5oAxbrwvDL/AMsvm68CgDGn8DpKGBTKngcUAeXa/wDss6X4g16TVJdV1OAzEF4YmXbwAPlyvHA96APZbHwulrGi43FQOSKANu30rYRhcA0AalvpeDuoA04dPVR0/SgC4lsiAcCgCUKB0FAC0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFADWjVuooAha1RqAITp6elACDT1oAUaemeRQBItlGMcdKAJVgRe1AEgAFAC0AFABQAUAIQD2oAjaBW6igCJ7JG7UAR/2enoPyoAb/Z655oAcLBc9P0oAmW0QelAEyxqvQUAOoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/wD/2Q==\",\n    \"island\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAQDAwQDAwQEBAQFBQQFBwsHBwYGBw4KCggLEA4RERAOEA8SFBoWEhMYEw8QFh8XGBsbHR0dERYgIh8cIhocHRwBBQUFBwYHDQcHDRwSEBIcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHP/AABEIAUABQAMBEQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APvqgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAazqgyzBR6k0AYl94u0qx3L9pEsg/gi+Y59Pauepi6VPeRtDD1JbIxbb4jwz3UkUmnXEMKj5ZnZSG/AEkfjWEMwpSdnoazwc4q6dzUTxppzdWx+IrdYqi/tIyeHqdidPFmmvj98Af94f41ar0ntJfeS6U10LCeILB+k36ValF7Mnla6E66vZt0nH4g07isSDUbU/8ALxH+JpisSLdQN0mjP/AhQA8SI3RlP0NADqACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAZJKkSlndVA7k0Ac/qHjbSrFGKStcuBkLAN2fx6Vy1MZRh1v6G8MNUl0t6nl3in4zeJo98eh+FJ8ZI864YN+IVSf5159TNJPSnH7zvpZfT3qT+48X8TeMPiLrzkX39rJEScxQW7xp146Dn8TXBUr1avxyPRpUKFP4EjynUde8WeHrlxDb3AgZsgTW7EZPXng04YShVV5b+pdSvOO2xlxfFvxtBK6vahVUn/llKv8A7NWryymlo3/XyMVi77pGjD8cvE0ThXjfcOoFy4/Q5rJ4G202a+2i/sI1If2gvECHDW0vXqJlb+aVP1SS2qfgHNTe8C/B+0fqKMqyw3OW7eXG3+FL6rW6TQN0f5Walt+0wV5a1kXABJaADr9Ho9jiY7NE8tCW6Zq237TtuVzICo9lkH8s1f8Ati6/j/wSXQwz6/ga1p+01pb4zMR2+aR1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/D65+4DjvigCCTw7HggJyaAKknhpD1jBI45FAFaTwunIEYwfbmgClP4RjYEGPI+lAFCbwbGRxECfbigChN4NRudjNigChN4J35IXB9RxQBnXPgWdgfLABPHNAHguu/s3+OL/AF64vLW60sxSTF45ZS29BnI/gPI9jQB7vofw8v44kF467sDIQfKp9s0AdVD4UMCYWPP4UAadv4b2kAx/MPagDatdB29F/SgDYttGIx8tAGlFpW3HFAHRUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAJgelACbF9KAE8pT2oAabdD2oAjNmh7CgCNrBOwFAETaYp7DFAFeTSEOTigCFtGX0oArtooyfl/CgCM6Gp/h96AHLokYI+Tp2xQBZXTdoxsGMYHFADxp3tzQBYTT1H8I/KgCyloo5KigCykKr2oAfgelAC0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAYFACFQe1ACbF9KADy1oAPLX0oANgoAXaKAFoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP/2Q==\",\n    \"tall-pantry\": \"data:image/webp;base64,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\",\n    \"tall-fridge\": \"data:image/jpeg;base64,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\",\n    \"tall-oven\": \"data:image/jpeg;base64,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\",\n    \"base-oven\": \"data:image/jpeg;base64,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\",\n    \"base-oven-hood\": \"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAQDAwQDAwQEBAQFBQQFBwsHBwYGBw4KCggLEA4RERAOEA8SFBoWEhMYEw8QFh8XGBsbHR0dERYgIh8cIhocHRwBBQUFBwYHDQcHDRwSEBIcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHP/AABEIAUABQAMBEQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APvqgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAQkAZJwKAG+dGf8Alon50AKHU9GH50AOoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA5C/uJftk48xsK5ABPTmmIr/aJP75oEL9pl/v8A6CmBXu76eNV2ybcnngUgNzwlI8tvcs7sx3jljntQxo6KkMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOMv/wDj+uf+ujfzpiK9MQUAVL77qfWgDovB/wDx63P++P5UmNHSUhhQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQBxl/wD8f1x/10b+dMRXpiCgCpffdT6mgDo/B/8Ax6XH/XQfypMaOjpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDjL//AI/rj/ro386YivTEFAFS++6n1NAHR+D/APjzuP8Arp/Skxo6OkMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOMv/8Aj+uP+ujfzpiK9MQUAVL77qfWgDpPB/8Ax5T/APXT+gpMaOipDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDjNQ/wCP64/66N/OmIr0xBQBUv8Aon1oA6Twf/x5T/8AXT+gpMaOipDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDjdQ/4/rj/AHz/ADpiK1MQUAVL/on1NAHSeD/+PGf/AK6/0FJjR0VIYUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAcbqH/H9cf75/nTEV6YgoAp3/AEj/ABoA6Xwh/wAeE3/XX+gpMaOhpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAEZgilmICjqTQByF2vm3UzryrMSDTEQeU3pTEHlt6GgCjfo2I/lPegDe8JXMaRS2zHErNvHuMD/Ckxo6ekMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgCKe4jtk3yHA7DuaAMG8vpLtsH5Yx0WmIqUxBQAUAV7xcxA+hoAoozQyLJG21lOQR2oA7XStSXUbfJwJk4df61JRfoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAqXl8lqMfekPRf8aAMGaeS4cvI2T/KmIjpiEoAKAFoAiuF3Qv9M0AZtAE9pdPZTrLGeR1HYj0pDO2tLqO8gWWM8HqO4PpSGT0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAGZfaoI8xwkFu7dhTsK5jMxZiSSSeSTTEJQAUAFABQAUAIRkEetAGV0NACFgoyTgUAafhy9caisKH93IDuB9hmkxo7GkMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAZMC0MgAySpA/KgDjzZ3adYZh/wABNMQwrOn3hIPqDTEN85/71AHMJ44uUtrCW48N65E13eCzMX2dJGhz0lk2OQI/9rnHcCgB9x8QtOsrO/u7q31KGCxuTayFtPmJZs43IoUl04+8oI96AOnFycfdoAUXI7qfzoAX7SvoaAMq5nxK4Qd+poAnsdGvNTIZUKxH/lo/A/D1pDOs0vQbfTWEmWknAxvPGPoKQzVoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAayK33lB+ooAja0t2+9BEfqgoAibTLNutun4DFAETaLZN/yyI+jGi4WI20C0PQyD6N/wDWp3FYibw7CfuzSD64NFwsOtPDtpbSGV186TOQX6D8KVwsa/SgYUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA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\"\n  };\n\n  // v2/src/ui/library-tray.js\n  function pressPoint(e, b) {\n    if (e && e.detail > 0 && isFinite(e.clientX) && (e.clientX || e.clientY)) return { x: e.clientX, y: e.clientY };\n    const r = b && b.getBoundingClientRect ? b.getBoundingClientRect() : null;\n    return r ? { x: r.left + r.width / 2, y: r.top + r.height / 2 } : null;\n  }\n  function createLibraryTray(ctx, parts) {\n    const root = ctx.root, win2 = ctx.win, view = ctx.view;\n    const trayBtn = root.querySelector(\"[data-ub-tray-toggle]\");\n    const trayEl = root.querySelector(\"[data-ub-tray]\");\n    const GUARDED = [\"[data-ub-finbtn]\", \"[data-ub-finpop]\"];\n    const state2 = { open: false };\n    function setTray(open, opt) {\n      state2.open = !!open;\n      state2.slim = !!(open && opt && opt.slim);\n      if (!trayEl || !trayBtn) return;\n      if (open) trayEl.removeAttribute(\"hidden\");\n      else trayEl.setAttribute(\"hidden\", \"\");\n      trayBtn.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n      shieldUnderTray(state2.open && !state2.slim);\n    }\n    function shieldUnderTray(on) {\n      if (root.classList) {\n        if (on) root.classList.add(\"ub-lab--libopen\");\n        else root.classList.remove(\"ub-lab--libopen\");\n      }\n      for (const sel of GUARDED) {\n        const n = root.querySelector(sel);\n        if (!n) continue;\n        if (on) {\n          if (n.style) n.style.pointerEvents = \"none\";\n          n.setAttribute(\"aria-hidden\", \"true\");\n          if (n.hasAttribute && !n.hasAttribute(\"data-ub-tabsave\"))\n            n.setAttribute(\"data-ub-tabsave\", n.getAttribute(\"tabindex\") || \"\");\n          n.setAttribute(\"tabindex\", \"-1\");\n          if (n.blur) n.blur();\n        } else {\n          if (n.style) n.style.pointerEvents = \"\";\n          n.removeAttribute(\"aria-hidden\");\n          const t = n.getAttribute ? n.getAttribute(\"data-ub-tabsave\") : null;\n          if (t) n.setAttribute(\"tabindex\", t);\n          else n.removeAttribute(\"tabindex\");\n          n.removeAttribute(\"data-ub-tabsave\");\n        }\n      }\n      if (on) {\n        const pop = root.querySelector(\"[data-ub-finpop]\");\n        if (pop && pop.setAttribute) pop.setAttribute(\"hidden\", \"\");\n      }\n    }\n    function trayOpen() {\n      return state2.open;\n    }\n    if (trayBtn) trayBtn.addEventListener(\"click\", function() {\n      setTray(!trayOpen());\n    });\n    const ghostSvg = root.querySelector(\"[data-ub-ghost]\");\n    const ghostPoly = ghostSvg ? ghostSvg.querySelector(\"[data-ub-ghost-poly]\") : null;\n    function showGhost(type, fx, fz) {\n      if (!ghostSvg) return;\n      const probe = newUnit(type);\n      probe.x = fx - probe.w / 2;\n      probe.z = fz - probe.d / 2;\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      const pts = [];\n      for (const b of footBoxes(probe)) {\n        for (const c of [[b.x0, b.z0], [b.x1, b.z0], [b.x1, b.z1], [b.x0, b.z1]]) {\n          const nd = view.worldToNdc([c[0], 0, c[1]]);\n          if (nd) pts.push(Math.round((nd[0] + 1) / 2 * cw) + \",\" + Math.round((1 - nd[1]) / 2 * ch));\n        }\n      }\n      if (!pts.length) return;\n      ghostSvg.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      ghostSvg.setAttribute(\"width\", cw);\n      ghostSvg.setAttribute(\"height\", ch);\n      if (ghostPoly) ghostPoly.setAttribute(\"points\", pts.slice(0, 4).join(\" \"));\n      ghostSvg.removeAttribute(\"hidden\");\n    }\n    function dropIa() {\n      try {\n        const P2 = root.__ubProj, ia = P2 && P2.__v2 && P2.__v2.interaction ? P2.__v2.interaction() : null;\n        return ia && ia.ctx && ia.ctx.previewDrop ? ia : null;\n      } catch {\n        return null;\n      }\n    }\n    function hideGhost() {\n      if (ghostSvg) ghostSvg.setAttribute(\"hidden\", \"\");\n      const ia = dropIa();\n      if (ia && ia.ctx.clearDropPreview()) ia.ctx.frame();\n    }\n    function liveGhost(type, x, z) {\n      const ia = dropIa();\n      if (ia) {\n        if (ghostSvg) ghostSvg.setAttribute(\"hidden\", \"\");\n        ia.ctx.previewDrop(type, x, z);\n        ia.ctx.frame();\n        return;\n      }\n      showGhost(type, x, z);\n    }\n    function inside(r, ev) {\n      return !!r && ev.clientX >= r.left && ev.clientX <= r.left + r.width && ev.clientY >= r.top && ev.clientY <= r.top + r.height;\n    }\n    function floorAt(ev) {\n      const nd = view.clientToNdc(ev.clientX, ev.clientY);\n      return view.screenToFloor(nd[0], nd[1], 0);\n    }\n    const held = { x: NaN, y: NaN, hit: null };\n    function holdAt(ev, hit2) {\n      held.x = ev.clientX;\n      held.y = ev.clientY;\n      held.hit = hit2 || null;\n    }\n    function releaseAt(ev) {\n      if (held.hit && Math.abs(ev.clientX - held.x) < 0.5 && Math.abs(ev.clientY - held.y) < 0.5) return held.hit;\n      return floorAt(ev);\n    }\n    root.querySelectorAll(\"[data-ub-thumb]\").forEach(function(im) {\n      const src = TRAY_THUMBS[im.getAttribute(\"data-ub-thumb\")];\n      if (src && !im.getAttribute(\"src\")) im.setAttribute(\"src\", src);\n    });\n    function plusArmed() {\n      try {\n        return !!(root.__ubPlusPick && root.__ubPlusPick.armed());\n      } catch {\n        return false;\n      }\n    }\n    function freeInsets() {\n      const cv = root.querySelector(\".ub-lab__canvas\");\n      if (!cv || !cv.getBoundingClientRect) return null;\n      const c = cv.getBoundingClientRect(), vb = win2 && win2.innerHeight ? Math.min(c.bottom, win2.innerHeight) : c.bottom;\n      if (!(c.width > 0) || !(vb - c.top > 0)) return null;\n      const S2 = { l: 10, r: 10, t: 10, b: 10 + (c.bottom - vb) };\n      const covers = root.querySelectorAll(\".ub-lab__dock .ub-lab__toolgrp, .ub-lab__dock--top > *, .ub-lab__flyout:not([hidden]), .ub-lab__eyemenu:not([hidden])\");\n      for (const n of covers) {\n        if (n.offsetParent === null || !n.getBoundingClientRect) continue;\n        const q = n.getBoundingClientRect();\n        if (!(q.width > 0) || q.right <= c.left || q.left >= c.right || q.bottom <= c.top || q.top >= vb) continue;\n        const cx = (q.left + q.right) / 2 - c.left, cy = (q.top + q.bottom) / 2 - c.top;\n        if (q.height > q.width) {\n          if (cx < c.width / 2) S2.l = Math.max(S2.l, q.right - c.left + 8);\n          else S2.r = Math.max(S2.r, c.right - q.left + 8);\n        } else if (cy < (vb - c.top) / 2) S2.t = Math.max(S2.t, q.bottom - c.top + 8);\n        else S2.b = Math.max(S2.b, c.bottom - q.top + 8);\n      }\n      return S2;\n    }\n    function closeAfterAdd() {\n      if (state2.slim) return;\n      setTray(false);\n    }\n    function addFromTile(type) {\n      const slim = state2.slim;\n      const r = ctx.act(\"unit.add\", { type });\n      if (!slim) {\n        setTray(false);\n        if (root.__ubDocks) root.__ubDocks.show(null);\n      }\n      if (r && r.ok === false) return r;\n      ctx.act(\"view.reveal\", { safe: freeInsets() });\n      return r;\n    }\n    let trayGesture = null;\n    root.querySelectorAll(\"[data-ub-tray-add]\").forEach(function(b) {\n      const type = b.getAttribute(\"data-ub-tray-add\");\n      const drag = { d0: null };\n      b.addEventListener(\"click\", function(e) {\n        if (e) {\n          if (e.preventDefault) e.preventDefault();\n          if (e.stopPropagation) e.stopPropagation();\n          if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n        }\n        if (drag.d0 && drag.d0.moved) {\n          drag.d0 = null;\n          return;\n        }\n        if (plusArmed()) {\n          root.__ubPlusPick.choose(type);\n          return;\n        }\n        addFromTile(type);\n      });\n      b.addEventListener(\"keydown\", function(e) {\n        if (!e || e.key !== \"Enter\" && e.key !== \" \") return;\n        e.preventDefault();\n        e.stopPropagation();\n        if (plusArmed()) {\n          root.__ubPlusPick.choose(type);\n          return;\n        }\n        b.dataset.ubKeyAdd = \"1\";\n        addFromTile(type);\n      });\n      const strip = b.closest ? b.closest(\".ub-lab__flyout\") : null;\n      function stripBox() {\n        if (!strip || !strip.getBoundingClientRect) return null;\n        const r = strip.getBoundingClientRect();\n        return r && r.height > 0 ? r : null;\n      }\n      const overStrip = (ev) => {\n        const sb = stripBox();\n        return !!sb && ev.clientY >= sb.top && ev.clientX >= sb.left && ev.clientX <= sb.right;\n      };\n      b.addEventListener(\"mousedown\", function(e) {\n        if (trayGesture) trayGesture.abort();\n        drag.d0 = { x: e.clientX, y: e.clientY, moved: false };\n        held.hit = null;\n        b.classList.add(\"is-dragging\");\n        function mv(ev) {\n          const d0 = drag.d0;\n          if (!d0 || d0.cancel) return;\n          if (ev && ev.isTrusted === true && ev.buttons === 0) {\n            abort();\n            return;\n          }\n          if (!d0.moved && Math.hypot(ev.clientX - d0.x, ev.clientY - d0.y) < 6) return;\n          if (!d0.moved) {\n            const sb = stripBox();\n            if (sb && ev.clientY >= sb.top - 4) {\n              const grab = !!(strip.__ubGrab && strip.__ubGrab.active);\n              if (grab || Math.abs(ev.clientX - d0.x) > Math.abs(ev.clientY - d0.y)) return;\n            }\n          }\n          d0.moved = true;\n          const r = view.liveRect();\n          if (!r) return;\n          if (!inside(r, ev) || overStrip(ev)) {\n            hideGhost();\n            return;\n          }\n          const hit2 = floorAt(ev);\n          holdAt(ev, hit2);\n          if (hit2) liveGhost(type, hit2[0], hit2[2]);\n        }\n        function key(ev) {\n          if (ev && ev.key === \"Escape\" && drag.d0 && drag.d0.moved) {\n            drag.d0.cancel = true;\n            hideGhost();\n          }\n        }\n        function off() {\n          win2.removeEventListener(\"mousemove\", mv);\n          win2.removeEventListener(\"mouseup\", up);\n          win2.removeEventListener(\"keydown\", key, true);\n          win2.removeEventListener(\"dragstart\", lost, true);\n          win2.removeEventListener(\"pointercancel\", lost, true);\n          win2.removeEventListener(\"blur\", lost);\n          if (trayGesture === me) trayGesture = null;\n          b.classList.remove(\"is-dragging\");\n        }\n        function abort() {\n          off();\n          hideGhost();\n          drag.d0 = null;\n        }\n        function lost(ev) {\n          if (ev && ev.type === \"pointercancel\" && ev.pointerType && ev.pointerType !== \"mouse\") return;\n          abort();\n        }\n        const me = { abort };\n        function up(ev) {\n          off();\n          const rec = root.__ubTrayDrop = { d0: !!drag.d0, moved: !!(drag.d0 && drag.d0.moved), cancel: !!(drag.d0 && drag.d0.cancel), over: overStrip(ev), inside: inside(view.liveRect(), ev), held: !!held.hit, hit: null, r: null };\n          if (drag.d0 && drag.d0.moved) {\n            if (!drag.d0.cancel && !rec.over && rec.inside) {\n              const hit2 = releaseAt(ev);\n              rec.hit = hit2 ? [Math.round(hit2[0]), Math.round(hit2[2])] : null;\n              if (hit2) {\n                const r0 = ctx.act(\"unit.drop\", { type, x: hit2[0], z: hit2[2] });\n                rec.r = r0 ? r0.ok === false ? String(r0.why || \"no\") : \"ok\" : \"null\";\n                try {\n                  const ia = dropIa();\n                  if (ia) {\n                    rec.dg = ia.ctx.st.dropDiag || null;\n                    rec.dgp = ia.ctx.st.dropDiagP || null;\n                  }\n                } catch {\n                }\n                hideGhost();\n                closeAfterAdd();\n              }\n            }\n            hideGhost();\n            globalThis.setTimeout(function() {\n              drag.d0 = null;\n            }, 0);\n          } else {\n            hideGhost();\n            drag.d0 = null;\n          }\n        }\n        win2.addEventListener(\"mousemove\", mv);\n        win2.addEventListener(\"mouseup\", up);\n        win2.addEventListener(\"keydown\", key, true);\n        win2.addEventListener(\"dragstart\", lost, true);\n        win2.addEventListener(\"pointercancel\", lost, true);\n        win2.addEventListener(\"blur\", lost);\n        trayGesture = me;\n      });\n      b.addEventListener(\"pointerdown\", function(e) {\n        if (!e || e.pointerType !== \"touch\" && e.pointerType !== \"pen\") return;\n        const t = { id: e.pointerId, x: e.clientX, y: e.clientY, on: false, cancel: false };\n        held.hit = null;\n        function pm(ev) {\n          if (ev.pointerId !== t.id) return;\n          const dx = ev.clientX - t.x, dy = ev.clientY - t.y;\n          if (!t.on) {\n            if (!(dy <= -10 && Math.abs(dy) > Math.abs(dx))) return;\n            t.on = true;\n            drag.d0 = { x: t.x, y: t.y, moved: true };\n            b.classList.add(\"is-dragging\");\n          }\n          if (t.cancel) return;\n          if (ev.preventDefault) ev.preventDefault();\n          const r = view.liveRect();\n          if (!r || !inside(r, ev) || overStrip(ev)) {\n            hideGhost();\n            return;\n          }\n          const hit2 = floorAt(ev);\n          holdAt(ev, hit2);\n          if (hit2) liveGhost(type, hit2[0], hit2[2]);\n          else hideGhost();\n        }\n        function stop() {\n          win2.removeEventListener(\"pointermove\", pm, true);\n          win2.removeEventListener(\"pointerup\", pu, true);\n          win2.removeEventListener(\"pointercancel\", pc, true);\n          win2.removeEventListener(\"keydown\", pk, true);\n          b.classList.remove(\"is-dragging\");\n          hideGhost();\n          if (t.on) win2.setTimeout(function() {\n            drag.d0 = null;\n          }, 0);\n        }\n        function pu(ev) {\n          if (ev.pointerId !== t.id) return;\n          let added = false;\n          if (t.on && !t.cancel && !overStrip(ev) && inside(view.liveRect(), ev)) {\n            const hit2 = releaseAt(ev);\n            if (hit2) {\n              ctx.act(\"unit.drop\", { type, x: hit2[0], z: hit2[2] });\n              added = true;\n            }\n          }\n          stop();\n          if (added) closeAfterAdd();\n        }\n        function pc(ev) {\n          if (ev.pointerId === t.id) stop();\n        }\n        function pk(ev) {\n          if (ev && ev.key === \"Escape\" && t.on) {\n            t.cancel = true;\n            hideGhost();\n          }\n        }\n        win2.addEventListener(\"pointermove\", pm, true);\n        win2.addEventListener(\"pointerup\", pu, true);\n        win2.addEventListener(\"pointercancel\", pc, true);\n        win2.addEventListener(\"keydown\", pk, true);\n      });\n    });\n    const flipBtn = root.querySelector(\"[data-ub-turn-flip]\");\n    const menuAfter = function(r, e, b) {\n      const p = r && r.ok !== false ? pressPoint(e, b) : null;\n      if (p) ctx.act(\"view.menuAt\", p, { out: false });\n    };\n    if (flipBtn) flipBtn.addEventListener(\"click\", function(e) {\n      menuAfter(ctx.act(\"unit.flip\", {}), e, flipBtn);\n    });\n    [[\"[data-ub-turn-left]\", -1], [\"[data-ub-turn-right]\", 1]].forEach(function(pr) {\n      const b = root.querySelector(pr[0]);\n      if (b) b.addEventListener(\"click\", function(e) {\n        menuAfter(ctx.act(\"unit.turn\", { dir: pr[1] }), e, b);\n      });\n    });\n    root.querySelectorAll(\"[data-ub-hand]\").forEach(function(b) {\n      b.addEventListener(\"click\", function() {\n        ctx.act(\"unit.hand\", { hand: b.getAttribute(\"data-ub-hand\") });\n      });\n    });\n    root.querySelectorAll(\"[data-ub-bay]\").forEach(function(b) {\n      b.addEventListener(\"click\", function() {\n        ctx.act(\"island.bayKind\", {\n          i: parseInt(b.getAttribute(\"data-ub-bay\"), 10),\n          kind: b.getAttribute(\"data-ub-baykind\")\n        });\n      });\n    });\n    return { set: setTray, isOpen: trayOpen, isSlim: () => !!(state2.open && state2.slim) };\n  }\n\n  // v2/src/ui/thumb-cutout.js\n  function cutoutAlpha(px, w, h, o) {\n    const opt = Object.assign({ step: 6, light: 244, grey: 14 }, o || {});\n    const N = w * h, bg = new Uint8Array(N), q = new Int32Array(N);\n    const lum = (i) => px[i * 4] * 0.299 + px[i * 4 + 1] * 0.587 + px[i * 4 + 2] * 0.114;\n    const ok2 = (i) => {\n      const r = px[i * 4], g2 = px[i * 4 + 1], b = px[i * 4 + 2];\n      return lum(i) >= opt.light && Math.max(r, g2, b) - Math.min(r, g2, b) <= opt.grey;\n    };\n    let head = 0, tail = 0;\n    const seed = (i) => {\n      if (!bg[i] && ok2(i)) {\n        bg[i] = 1;\n        q[tail++] = i;\n      }\n    };\n    for (let x = 0; x < w; x++) {\n      seed(x);\n      seed((h - 1) * w + x);\n    }\n    for (let y = 0; y < h; y++) {\n      seed(y * w);\n      seed(y * w + w - 1);\n    }\n    while (head < tail) {\n      const i = q[head++], x = i % w, y = (i - x) / w, L = lum(i);\n      const nb = [x > 0 ? i - 1 : -1, x < w - 1 ? i + 1 : -1, y > 0 ? i - w : -1, y < h - 1 ? i + w : -1];\n      for (const j of nb) if (j >= 0 && !bg[j] && ok2(j) && Math.abs(lum(j) - L) <= opt.step) {\n        bg[j] = 1;\n        q[tail++] = j;\n      }\n    }\n    const share = tail / N;\n    if (share < 0.12 || share > 0.88) return null;\n    const a = new Uint8ClampedArray(N);\n    for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\n      let s = 0, c = 0;\n      for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\n        const xx = x + dx, yy = y + dy;\n        if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\n        c++;\n        if (!bg[yy * w + xx]) s++;\n      }\n      const m = Math.max(Math.abs(x + 0.5 - w / 2) / (w / 2), Math.abs(y + 0.5 - h / 2) / (h / 2)), edge = Math.max(0, Math.min(1, (1 - m) / 0.08));\n      a[y * w + x] = Math.round(255 * s / c * edge);\n    }\n    return { alpha: a, share };\n  }\n  function createThumbCutout(ctx) {\n    const root = ctx.root, doc2 = ctx.doc || root && root.ownerDocument;\n    const none = { sync() {\n    }, frame() {\n    } };\n    if (!root || !root.querySelectorAll || !doc2 || !doc2.createElement) return none;\n    const done2 = /* @__PURE__ */ new WeakSet();\n    function cut(im) {\n      if (done2.has(im) || !im.getAttribute(\"src\")) return;\n      done2.add(im);\n      const go = () => {\n        try {\n          const S2 = 160, c = doc2.createElement(\"canvas\");\n          c.width = S2;\n          c.height = S2;\n          const g2 = c.getContext && c.getContext(\"2d\", { willReadFrequently: true });\n          if (!g2 || !im.naturalWidth) return;\n          g2.drawImage(im, 0, 0, S2, S2);\n          const d = g2.getImageData(0, 0, S2, S2), r = cutoutAlpha(d.data, S2, S2);\n          if (!r) {\n            im.setAttribute(\"data-ub-cutout\", \"kept\");\n            return;\n          }\n          for (let i = 0; i < S2 * S2; i++) {\n            d.data[i * 4] = 0;\n            d.data[i * 4 + 1] = 0;\n            d.data[i * 4 + 2] = 0;\n            d.data[i * 4 + 3] = r.alpha[i];\n          }\n          g2.putImageData(d, 0, 0);\n          const url = \"url(\" + c.toDataURL(\"image/png\") + \")\";\n          for (const k of [\"maskImage\", \"webkitMaskImage\"]) im.style[k] = url;\n          for (const k of [\"maskSize\", \"webkitMaskSize\"]) im.style[k] = \"100% 100%\";\n          for (const k of [\"maskRepeat\", \"webkitMaskRepeat\"]) im.style[k] = \"no-repeat\";\n          im.setAttribute(\"data-ub-cutout\", \"cut \" + Math.round(r.share * 100) + \"%\");\n        } catch {\n          im.setAttribute(\"data-ub-cutout\", \"kept\");\n        }\n      };\n      if (im.complete && im.naturalWidth) go();\n      else if (im.addEventListener) im.addEventListener(\"load\", go, { once: true });\n    }\n    function sync() {\n      try {\n        for (const im of root.querySelectorAll('[data-ub-flyout=\"cabinets\"] img[data-ub-thumb]')) cut(im);\n      } catch {\n      }\n    }\n    sync();\n    return { sync, frame() {\n    } };\n  }\n\n  // v2/src/ui/thumb-hover.js\n  var ZOOM_SCALE = 1.7;\n  var GAP4 = 8;\n  var EDGE2 = 6;\n  var ECHO_MS2 = 800;\n  var ZOOM_TARGETS = [\n    \"[data-ub-tray-add]\",\n    '[data-ub-itoolbar] [data-ub-itool=\"shelf\"]',\n    '[data-ub-itoolbar] [data-ub-itool=\"divider\"]',\n    '[data-ub-itoolbar] [data-ub-itool=\"hdivider\"]',\n    \"[data-ub-dadd]\",\n    \"[data-ub-ddrag]\"\n  ].join(\", \");\n  var ZOOM_PICTURE = \"img.ub-lab__thumb, img.ub-lab__partthumb, svg.ub-lab__art\";\n  var INNER_CONTROLS = \"button,a,input,select,label,[role=button],[data-ub-tray-inspect]\";\n  var MODAL_OPEN = \"[data-ub-binsp]:not([hidden])\";\n  function placeZoom(tile, size3, view) {\n    if (!tile || !size3 || !view || !(size3.w > 0) || !(size3.h > 0)) return null;\n    const clampX = (x) => Math.max(EDGE2, Math.min(x, view.w - size3.w - EDGE2));\n    const clampY = (y) => Math.max(EDGE2, Math.min(y, view.h - size3.h - EDGE2));\n    const cx = clampX(tile.left + tile.width / 2 - size3.w / 2);\n    const above = tile.top - GAP4 - size3.h;\n    if (above >= EDGE2) return { x: cx, y: above, side: \"above\" };\n    const below = tile.top + tile.height + GAP4;\n    if (below + size3.h <= view.h - EDGE2) return { x: cx, y: below, side: \"below\" };\n    const cy = clampY(tile.top + tile.height / 2 - size3.h / 2);\n    const right = tile.left + tile.width + GAP4;\n    if (right + size3.w <= view.w - EDGE2) return { x: right, y: cy, side: \"right\" };\n    const left = tile.left - GAP4 - size3.w;\n    if (left >= EDGE2) return { x: left, y: cy, side: \"left\" };\n    return null;\n  }\n  function createThumbZoom(ctx) {\n    const root = ctx && ctx.root;\n    const doc2 = ctx && ctx.doc || root && root.ownerDocument || null;\n    const win2 = doc2 && doc2.defaultView || null;\n    const none = { sync() {\n    }, frame() {\n    }, destroy() {\n    } };\n    if (!root || !root.addEventListener || !doc2 || !win2 || typeof doc2.createElement !== \"function\") return none;\n    let box3 = null, cur = null, mode = null, lastTouch = -1e9;\n    const now = () => win2.performance && win2.performance.now ? win2.performance.now() : Date.now();\n    function tileOf2(t) {\n      try {\n        const tile = t && t.closest ? t.closest(ZOOM_TARGETS) : null;\n        if (!tile || !root.contains(tile) || tile.hasAttribute(\"data-ub-nozoom\")) return null;\n        return tile;\n      } catch {\n        return null;\n      }\n    }\n    function innerControl(t, tile) {\n      try {\n        const c = t && t.closest ? t.closest(INNER_CONTROLS) : null;\n        return !!(c && c !== tile && tile.contains(c));\n      } catch {\n        return false;\n      }\n    }\n    function pictureOf(tile) {\n      try {\n        return tile.querySelector(ZOOM_PICTURE);\n      } catch {\n        return null;\n      }\n    }\n    function shown(el) {\n      try {\n        return !!(el && el.isConnected && el.getClientRects && el.getClientRects().length);\n      } catch {\n        return false;\n      }\n    }\n    function build3() {\n      if (box3) return;\n      box3 = doc2.createElement(\"div\");\n      box3.className = \"ub-tzoom\";\n      box3.setAttribute(\"data-ub-thumbzoom\", \"\");\n      box3.setAttribute(\"aria-hidden\", \"true\");\n      box3.style.pointerEvents = \"none\";\n      box3.hidden = true;\n      (doc2.body || root).appendChild(box3);\n    }\n    function hide() {\n      if (box3) {\n        box3.hidden = true;\n        box3.textContent = \"\";\n      }\n      cur = null;\n      mode = null;\n    }\n    function modalOpen() {\n      try {\n        return !!doc2.querySelector(MODAL_OPEN);\n      } catch {\n        return false;\n      }\n    }\n    function show2(tile, how) {\n      if (modalOpen()) {\n        hide();\n        return;\n      }\n      const pic = pictureOf(tile);\n      if (!pic || !shown(tile)) {\n        hide();\n        return;\n      }\n      const pr = pic.getBoundingClientRect(), tr = tile.getBoundingClientRect();\n      if (!(pr.width > 0) || !(pr.height > 0)) {\n        hide();\n        return;\n      }\n      const w = Math.round(pr.width * ZOOM_SCALE), h = Math.round(pr.height * ZOOM_SCALE);\n      const at = placeZoom(tr, { w, h }, { w: win2.innerWidth || 0, h: win2.innerHeight || 0 });\n      if (!at) {\n        hide();\n        return;\n      }\n      build3();\n      if (cur !== tile) {\n        box3.textContent = \"\";\n        const copy3 = pic.cloneNode(true);\n        try {\n          copy3.removeAttribute(\"id\");\n          copy3.removeAttribute(\"data-ub-thumb\");\n          copy3.removeAttribute(\"data-ub-partthumb\");\n        } catch {\n        }\n        copy3.setAttribute(\"aria-hidden\", \"true\");\n        if (copy3.setAttribute && copy3.tagName && copy3.tagName.toLowerCase() === \"img\") {\n          copy3.setAttribute(\"draggable\", \"false\");\n          copy3.setAttribute(\"width\", String(w));\n          copy3.setAttribute(\"height\", String(h));\n        }\n        copy3.style.width = w + \"px\";\n        copy3.style.height = h + \"px\";\n        box3.appendChild(copy3);\n      }\n      box3.style.left = Math.round(at.x) + \"px\";\n      box3.style.top = Math.round(at.y) + \"px\";\n      box3.setAttribute(\"data-ub-thumbzoom\", at.side);\n      box3.hidden = false;\n      cur = tile;\n      mode = how;\n    }\n    const mouseLike = (e) => !!e && (e.pointerType === \"mouse\" || e.pointerType === \"pen\") && now() - lastTouch > ECHO_MS2;\n    const onOver = (e) => {\n      if (!mouseLike(e) || e.buttons) return;\n      const tile = tileOf2(e.target);\n      if (!tile) {\n        if (mode === \"pointer\") hide();\n        return;\n      }\n      if (innerControl(e.target, tile)) {\n        hide();\n        return;\n      }\n      if (tile !== cur || mode !== \"pointer\") show2(tile, \"pointer\");\n    };\n    const onOut = (e) => {\n      if (mode !== \"pointer\" || !cur) return;\n      const to = e && e.relatedTarget;\n      if (!to || !cur.contains(to)) hide();\n    };\n    const onDown = (e) => {\n      if (e && e.pointerType === \"touch\") lastTouch = now();\n      if (box3 && !box3.hidden) hide();\n    };\n    const onFocus = (e) => {\n      const tile = tileOf2(e && e.target);\n      if (!tile) return;\n      try {\n        if (tile.matches && !tile.matches(\":focus-visible\")) return;\n      } catch {\n      }\n      show2(tile, \"focus\");\n    };\n    const onBlur = (e) => {\n      if (mode === \"focus\" && (!e || !e.relatedTarget || tileOf2(e.relatedTarget) !== cur)) hide();\n    };\n    const onKey = (e) => {\n      if (e && e.key === \"Escape\" && box3 && !box3.hidden) {\n        hide();\n        if (e.stopPropagation) e.stopPropagation();\n        if (e.preventDefault) e.preventDefault();\n      }\n    };\n    const onAway = () => {\n      if (box3 && !box3.hidden) hide();\n    };\n    const onScroll = () => {\n      if (!box3 || box3.hidden) return;\n      if (mode === \"focus\" && cur) {\n        const t = cur;\n        const go = () => {\n          if (mode === \"focus\" && cur === t) show2(t, \"focus\");\n        };\n        if (win2.requestAnimationFrame) win2.requestAnimationFrame(go);\n        else go();\n        return;\n      }\n      hide();\n    };\n    const L = [\n      [root, \"pointerover\", onOver, { passive: true }],\n      [root, \"pointermove\", onOver, { passive: true }],\n      [root, \"pointerout\", onOut, { passive: true }],\n      [root, \"pointerdown\", onDown, { passive: true, capture: true }],\n      [root, \"focusin\", onFocus, false],\n      [root, \"focusout\", onBlur, false],\n      [doc2, \"keydown\", onKey, true],\n      [win2, \"scroll\", onScroll, { passive: true, capture: true }],\n      [win2, \"wheel\", onAway, { passive: true, capture: true }],\n      [win2, \"blur\", onAway, false],\n      [win2, \"resize\", onAway, false]\n    ];\n    for (const [t, ev, fn, o] of L) t.addEventListener(ev, fn, o);\n    const api = { hide, targets: ZOOM_TARGETS, scale: ZOOM_SCALE, el: () => box3 };\n    try {\n      root.__ubThumbZoom = api;\n    } catch {\n    }\n    function check() {\n      if (cur && box3 && !box3.hidden && (!shown(cur) || modalOpen())) hide();\n    }\n    return {\n      sync: check,\n      frame: check,\n      hide,\n      destroy() {\n        for (const [t, ev, fn, o] of L) t.removeEventListener(ev, fn, o);\n        if (box3 && box3.parentNode) box3.parentNode.removeChild(box3);\n        box3 = null;\n        cur = null;\n        mode = null;\n        try {\n          if (root.__ubThumbZoom === api) delete root.__ubThumbZoom;\n        } catch {\n        }\n      }\n    };\n  }\n\n  // v2/src/ui/strip-scroll.js\n  var SKIP = 'input, select, textarea, [contenteditable=\"true\"], [data-ub-ddrag], [data-ub-itool=\"shelf\"], [data-ub-itool=\"divider\"], [data-ub-itool=\"hdivider\"], [data-ub-roomadd=\"window\"], [data-ub-roomadd=\"door\"], [data-ub-roomobjadd=\"boiler\"]';\n  var STRIP_SEL = \".ub-lab__flyout--strip, .ub-lab__flyout--tray, .ub-lab__kmatpop, .ub-lab__itool, .ub-lab__finpop\";\n  function rowAt(el, t, win2) {\n    for (let n = t; n && n !== el.parentNode; n = n.parentNode) {\n      if (n.nodeType === 1 && n.scrollWidth > n.clientWidth + 1) {\n        const cs = win2.getComputedStyle(n);\n        if (/auto|scroll/.test(cs.overflowX)) return n;\n      }\n      if (n === el) break;\n    }\n    return el.querySelector(\".ub-lab__tbody, [data-ub-krow]\") || null;\n  }\n  function wireStripScroll(root, win2) {\n    if (!root || !root.querySelectorAll || !win2 || !win2.addEventListener || !win2.getComputedStyle) return;\n    for (const el of root.querySelectorAll(STRIP_SEL)) {\n      let move = function(ev) {\n        if (!g2 || ev.pointerId !== g2.id) return;\n        const dx = ev.clientX - g2.x, dy = ev.clientY - g2.y;\n        if (!g2.on && !g2.up) {\n          if (Math.abs(dy) >= 6 && Math.abs(dy) > Math.abs(dx)) {\n            g2.up = true;\n            return;\n          }\n          if (Math.abs(dx) >= 6) {\n            g2.on = true;\n            el.__ubGrab.active = true;\n            el.classList.add(\"is-grabbing\");\n          }\n        }\n        if (!g2.on) return;\n        const r = el.getBoundingClientRect();\n        if (ev.clientY < r.top - 4) {\n          el.__ubGrab.active = false;\n          return;\n        }\n        el.__ubGrab.active = true;\n        g2.row.scrollLeft = g2.s0 - dx;\n        if (ev.preventDefault) ev.preventDefault();\n      }, end = function() {\n        win2.removeEventListener(\"pointermove\", move, true);\n        win2.removeEventListener(\"pointerup\", end, true);\n        win2.removeEventListener(\"pointercancel\", end, true);\n        if (g2 && g2.on) eatUntil = Date.now() + 400;\n        g2 = null;\n        el.classList.remove(\"is-grabbing\");\n        win2.setTimeout(() => {\n          el.__ubGrab.active = false;\n        }, 0);\n      };\n      if (el.__ubStripScroll) continue;\n      el.__ubStripScroll = true;\n      el.__ubGrab = { active: false };\n      let g2 = null, eatUntil = 0, finger = null;\n      el.addEventListener(\"pointerdown\", (e) => {\n        if (e.pointerType === \"touch\" || e.pointerType === \"pen\") {\n          finger = { t: Date.now(), target: e.target, x: e.clientX, y: e.clientY };\n          return;\n        }\n        if (e.pointerType !== \"mouse\" || e.button !== 0) return;\n        if (e.target && e.target.closest && e.target.closest(SKIP)) return;\n        const row = rowAt(el, e.target, win2);\n        if (!row) return;\n        g2 = { id: e.pointerId, x: e.clientX, y: e.clientY, s0: row.scrollLeft, row, on: false, up: false };\n        win2.addEventListener(\"pointermove\", move, true);\n        win2.addEventListener(\"pointerup\", end, true);\n        win2.addEventListener(\"pointercancel\", end, true);\n      });\n      el.addEventListener(\"dragstart\", (e) => {\n        if (g2 && g2.on && e.preventDefault) e.preventDefault();\n      }, true);\n      el.addEventListener(\"click\", (e) => {\n        const stop = () => {\n          e.stopPropagation();\n          if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n          if (e.preventDefault) e.preventDefault();\n        };\n        if (finger && Date.now() - finger.t < 900) {\n          const f = finger;\n          finger = null;\n          const hit2 = e.target && e.target.closest ? e.target.closest(\"button, [role=option], .ub-lab__trayitem, label, a, input, select\") : null;\n          const r = hit2 && hit2.getBoundingClientRect ? hit2.getBoundingClientRect() : null;\n          const off = r && !(f.x >= r.left - 0.5 && f.x <= r.right + 0.5 && f.y >= r.top - 0.5 && f.y <= r.bottom + 0.5);\n          if (hit2 && (f.target && !(hit2 === f.target || hit2.contains(f.target)) || off)) {\n            stop();\n            return;\n          }\n        }\n        if (Date.now() > eatUntil) return;\n        eatUntil = 0;\n        stop();\n      }, true);\n    }\n  }\n  function createBottomStripState(ctx) {\n    const root = ctx.root;\n    if (!root || !root.querySelector) return { sync() {\n    }, frame() {\n    } };\n    const stage = root.querySelector(\".ub-lab__stage\");\n    let last = { open: false, which: null, height: 0 };\n    function measure() {\n      let el = null;\n      for (const n of root.querySelectorAll(STRIP_SEL)) if (!n.hidden && n.offsetParent !== null) {\n        el = n;\n        if (!n.hasAttribute(\"data-ub-finpop\")) break;\n      }\n      if (!el) return { open: false, which: null, height: 0 };\n      const cv = root.querySelector(\".ub-lab__canvas\"), r = el.getBoundingClientRect(), c = cv ? cv.getBoundingClientRect() : r;\n      return {\n        open: true,\n        which: el.getAttribute(\"data-ub-flyout\") || (el.hasAttribute(\"data-ub-itoolbar\") ? \"inside\" : el.getAttribute(\"data-ub-kmatpop\") !== null ? \"materials\" : el.hasAttribute(\"data-ub-finpop\") ? \"thiscab\" : null),\n        height: Math.max(0, Math.round(c.bottom - r.top))\n      };\n    }\n    root.__ubBottomStrip = () => Object.assign({}, last);\n    const ALL_STRIPS = STRIP_SEL;\n    function keepRightFree() {\n      if (root.__ubNoSafe) return;\n      const R4 = root.querySelector(\".ub-lab__dock--right\");\n      if (!R4 || !R4.getBoundingClientRect) return;\n      try {\n        const T0 = root.querySelector(\".ub-lab__dock--top\"), G = root.querySelector(\".ub-lab__viewgrp\"), host0 = R4.offsetParent;\n        if (T0 && G && host0 && host0.getBoundingClientRect) {\n          const narrow = host0.getBoundingClientRect().width <= 640 && !root.__ubForceTopBar;\n          if (narrow && G.parentNode !== R4) R4.insertBefore(G, R4.firstChild);\n          else if (!narrow && G.parentNode !== T0) T0.appendChild(G);\n        }\n      } catch {\n      }\n      try {\n        const T3 = root.querySelector(\".ub-lab__dock--top\"), host = R4.offsetParent;\n        if (T3 && host && T3.offsetParent === host) {\n          const tb = T3.getBoundingClientRect(), hb = host.getBoundingClientRect(), want = Math.round(tb.bottom - hb.top + 6) + \"px\";\n          if (hb.width <= 640) {\n            if (R4.style.top) R4.style.top = \"\";\n          } else if (tb.height && R4.style.top !== want) R4.style.top = want;\n        }\n      } catch {\n      }\n      try {\n        const cv = root.querySelector(\".ub-lab__canvas\"), cr = cv && cv.getBoundingClientRect();\n        const grps = [...R4.children].filter((c) => c.offsetParent !== null);\n        const gw = root.ownerDocument && root.ownerDocument.defaultView;\n        if (cr && cr.height && grps.length > 1 && gw && gw.getComputedStyle) {\n          const top = R4.getBoundingClientRect().top, cs = gw.getComputedStyle(R4), gap = parseFloat(cs.rowGap) || 6;\n          const need = grps.reduce((s, c) => s + c.getBoundingClientRect().height, 0) + gap * (grps.length - 1);\n          const tight = need > cr.bottom - top - 8;\n          if (R4.classList.contains(\"is-tight\") !== tight) R4.classList.toggle(\"is-tight\", tight);\n        }\n      } catch {\n      }\n      const rr = R4.getBoundingClientRect();\n      if (!rr.width || !rr.height) return;\n      for (const n of root.querySelectorAll(ALL_STRIPS)) {\n        const open = !n.hidden && n.offsetParent !== null;\n        if (!open) {\n          if (n.__ubRfree) {\n            n.style.removeProperty(\"right\");\n            n.__ubRfree = 0;\n          }\n          continue;\n        }\n        const host = n.offsetParent.getBoundingClientRect(), r = n.getBoundingClientRect();\n        if (!host.width) continue;\n        const meets = rr.bottom > r.top - 4 && rr.top < r.bottom + 4;\n        if (meets) {\n          const px = Math.max(0, Math.round(host.right - rr.left + 6));\n          if (n.style.getPropertyValue(\"right\") !== px + \"px\" || n.style.getPropertyPriority(\"right\") !== \"important\") n.style.setProperty(\"right\", px + \"px\", \"important\");\n          n.__ubRfree = px;\n        } else if (n.__ubRfree) {\n          n.style.removeProperty(\"right\");\n          n.__ubRfree = 0;\n        }\n      }\n    }\n    root.__ubKeepRightFree = keepRightFree;\n    const win2 = ctx.win || root.ownerDocument && root.ownerDocument.defaultView;\n    if (win2 && win2.addEventListener && root.addEventListener) {\n      const soon = () => {\n        try {\n          keepRightFree();\n        } catch {\n        }\n        if (win2.requestAnimationFrame) win2.requestAnimationFrame(() => {\n          try {\n            keepRightFree();\n          } catch {\n          }\n        });\n        if (win2.setTimeout) {\n          win2.setTimeout(() => {\n            try {\n              keepRightFree();\n            } catch {\n            }\n          }, 60);\n          win2.setTimeout(() => {\n            try {\n              keepRightFree();\n            } catch {\n            }\n          }, 320);\n        }\n      };\n      root.addEventListener(\"click\", soon, true);\n      root.addEventListener(\"keydown\", soon, true);\n      win2.addEventListener(\"resize\", soon);\n    }\n    function frame2() {\n      try {\n        keepRightFree();\n      } catch {\n      }\n      let m;\n      try {\n        m = measure();\n      } catch {\n        return;\n      }\n      if (m.open !== last.open || m.which !== last.which || m.height !== last.height) {\n        last = m;\n        if (stage && stage.style && stage.style.setProperty) stage.style.setProperty(\"--ub-bottom-strip-h\", m.height + \"px\");\n      }\n    }\n    return { sync: frame2, frame: frame2 };\n  }\n\n  // v2/src/ui/docks.js\n  function createDocks(ctx, parts) {\n    const root = ctx.root;\n    const flyBtns = root.querySelectorAll(\"[data-ub-fly]\");\n    const flyouts = root.querySelectorAll(\"[data-ub-flyout]\");\n    const eyeBtn = root.querySelector(\"[data-ub-eye]\");\n    const eyeMenu = root.querySelector(\"[data-ub-eyemenu]\");\n    const st = { fly: null, eye: false };\n    if (!flyBtns.length && !eyeBtn) return { show() {\n    }, eye() {\n    }, state: () => ({ flyout: null, eye: false }) };\n    function show2(name2) {\n      if (name2 === \"inside\") {\n        show2(null);\n        setEye(false);\n        const go = root.__ubInsideEntry;\n        if (typeof go === \"function\") go();\n        else if (ctx.win && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n          if (typeof root.__ubInsideEntry === \"function\") root.__ubInsideEntry();\n        }, 300);\n        return;\n      }\n      const was = st.fly, d = ctx.doc;\n      const focusIn = was && was !== name2 && d && d.activeElement && d.activeElement.closest && d.activeElement.closest('[data-ub-flyout=\"' + was + '\"]');\n      st.fly = name2 || null;\n      for (let i = 0; i < flyBtns.length; i++) {\n        const on = flyBtns[i].getAttribute(\"data-ub-fly\") === st.fly;\n        flyBtns[i].setAttribute(\"aria-expanded\", on ? \"true\" : \"false\");\n        flyBtns[i].classList.toggle(\"is-active\", on);\n      }\n      for (let j = 0; j < flyouts.length; j++) {\n        const vis = flyouts[j].getAttribute(\"data-ub-flyout\") === st.fly;\n        if (vis) flyouts[j].removeAttribute(\"hidden\");\n        else flyouts[j].setAttribute(\"hidden\", \"\");\n      }\n      if (parts.tray && parts.tray.set) parts.tray.set(st.fly === \"cabinets\", { slim: true });\n      if (st.fly) setEye(false);\n      ctx.scene().flyout = st.fly;\n      if (parts.room && parts.room.shown) parts.room.shown();\n      const coach = root.querySelector(\".ub-lab__coach\");\n      if (coach) coach.hidden = !!st.fly;\n      try {\n        placeAll(root);\n      } catch {\n      }\n      if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n      if (focusIn) {\n        const b = root.querySelector('[data-ub-fly=\"' + was + '\"]');\n        if (b && b.focus) b.focus();\n      }\n    }\n    function setEye(open) {\n      st.eye = !!open;\n      if (eyeMenu) {\n        if (st.eye) eyeMenu.removeAttribute(\"hidden\");\n        else eyeMenu.setAttribute(\"hidden\", \"\");\n      }\n      if (eyeBtn) {\n        eyeBtn.setAttribute(\"aria-expanded\", st.eye ? \"true\" : \"false\");\n        eyeBtn.classList.toggle(\"is-active\", st.eye);\n      }\n      if (st.eye && st.fly) show2(null);\n      ctx.scene().eyeOpen = st.eye;\n    }\n    flyBtns.forEach(function(btn) {\n      btn.addEventListener(\"click\", function() {\n        const name2 = btn.getAttribute(\"data-ub-fly\");\n        show2(st.fly === name2 ? null : name2);\n      });\n    });\n    if (eyeBtn) eyeBtn.addEventListener(\"click\", function() {\n      setEye(!st.eye);\n    });\n    root.querySelectorAll(\"[data-ub-flyclose]\").forEach(function(b) {\n      b.addEventListener(\"click\", function() {\n        show2(null);\n        setEye(false);\n      });\n    });\n    const fk = root.querySelector(\"[data-ub-fitkitchen]\"), fr = root.querySelector(\"[data-ub-fitroom]\");\n    const NO_PRICE = { out: false };\n    if (fk) fk.addEventListener(\"click\", function() {\n      ctx.act(\"view.fitTo\", { wide: false }, NO_PRICE);\n    });\n    if (fr) fr.addEventListener(\"click\", function() {\n      ctx.act(\"view.fitTo\", { wide: true }, NO_PRICE);\n    });\n    function onKey(e) {\n      if (e && e.key === \"Escape\" && (st.fly || st.eye)) {\n        show2(null);\n        setEye(false);\n      }\n    }\n    ctx.win.addEventListener(\"keydown\", onKey);\n    try {\n      wireTrays(root, ctx.win);\n    } catch {\n    }\n    try {\n      wireStripScroll(root, ctx.win);\n    } catch {\n    }\n    show2(null);\n    setEye(false);\n    try {\n      const m = String(ctx.win.location && ctx.win.location.hash || \"\").match(/^#ub-([a-z]+)(?:-([a-z]+|\\d{1,2}))?$/);\n      if (m && m[1] === \"size\" && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        try {\n          const u = /^\\d+$/.test(m[2] || \"\") ? (ctx.scene().units || [])[Number(m[2]) - 1] : null;\n          if (u) ctx.act(\"select\", { id: u.id });\n          ctx.act(\"view.mode\", { mode: \"size\" });\n          if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n        } catch {\n        }\n      }, 700);\n      if (m && root.querySelector('[data-ub-flyout=\"' + m[1] + '\"]')) {\n        show2(m[1]);\n        if (/^\\d+$/.test(m[2] || \"\") && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n          try {\n            const u = (ctx.scene().units || [])[Number(m[2]) - 1];\n            if (u) {\n              ctx.act(\"select\", { id: u.id });\n              show2(m[1]);\n              if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n            }\n          } catch {\n          }\n        }, 700);\n      }\n    } catch {\n    }\n    const api = {\n      show: show2,\n      eye: setEye,\n      state: function() {\n        return { flyout: st.fly, eye: st.eye };\n      },\n      destroy() {\n        ctx.win.removeEventListener(\"keydown\", onKey);\n      }\n    };\n    root.__ubDocks = { show: api.show, eye: api.eye, state: api.state };\n    return api;\n  }\n\n  // v2/src/ui/guides.js\n  var GUIDE_SLOTS = [\"front\", \"front2\", \"top\"];\n  var FINE = { dragMax: 4, viewMax: 12, heightMax: 4 };\n  var GUIDE_STYLE = Object.freeze({ width: 1.25, match: \"#15964a\", refuse: \"#d92d20\", candidateDash: \"4 3\", endR: 2 });\n  function fineLine(doc2, svg2, a, b, kind, o) {\n    const ln = doc2.createElementNS(SVG_NS, \"line\");\n    ln.setAttribute(\"x1\", a[0].toFixed(1));\n    ln.setAttribute(\"y1\", a[1].toFixed(1));\n    ln.setAttribute(\"x2\", b[0].toFixed(1));\n    ln.setAttribute(\"y2\", b[1].toFixed(1));\n    ln.setAttribute(\"class\", \"is-\" + kind);\n    ln.setAttribute(\"data-ub-fine\", kind);\n    if (o && o.inline) {\n      ln.setAttribute(\"stroke\", o.colour || GUIDE_STYLE.match);\n      ln.setAttribute(\"stroke-width\", String(GUIDE_STYLE.width));\n      if (kind === \"candidate\") ln.setAttribute(\"stroke-dasharray\", GUIDE_STYLE.candidateDash);\n    }\n    svg2.appendChild(ln);\n    if (o && o.ends) for (const q of [a, b]) {\n      const c = doc2.createElementNS(SVG_NS, \"circle\");\n      c.setAttribute(\"cx\", q[0].toFixed(1));\n      c.setAttribute(\"cy\", q[1].toFixed(1));\n      c.setAttribute(\"r\", String(GUIDE_STYLE.endR));\n      if (o.inline) c.setAttribute(\"fill\", o.colour || GUIDE_STYLE.match);\n      svg2.appendChild(c);\n    }\n    return ln;\n  }\n  var HEIGHT = { tol: 1, near: 600, floor: 1 };\n  function heightDatums(units, u, cues) {\n    if (!u || !units) return [];\n    const fu = foot(u), uy0 = u.y || 0, out = [];\n    const shown = new Set((cues && cues.tops || []).map((t) => t.other && t.other.id).filter(Boolean));\n    for (const v of units) {\n      if (!v || v.id === u.id || !(v.h > 0)) continue;\n      const fv = foot(v);\n      const gx = Math.max(0, fv.x0 - fu.x1, fu.x0 - fv.x1), gz = Math.max(0, fv.z0 - fu.z1, fu.z0 - fv.z1), gap = Math.hypot(gx, gz);\n      if (gap > HEIGHT.near) continue;\n      const vy0 = v.y || 0, mine = [[\"top\", uy0 + u.h], [\"bottom\", uy0]], theirs = [[\"top\", vy0 + v.h], [\"bottom\", vy0]];\n      for (const [ma, my] of mine) for (const [ta, ty] of theirs) {\n        if (Math.abs(my - ty) > HEIGHT.tol || my <= HEIGHT.floor) continue;\n        if (ma === \"top\" && ta === \"top\" && shown.has(v.id)) continue;\n        const ax = Math.abs(fv.x0 + fv.x1 - (fu.x0 + fu.x1)) >= Math.abs(fv.z0 + fv.z1 - (fu.z0 + fu.z1)) ? \"x\" : \"z\";\n        const y = Math.round((my + ty) / 2 * 10) / 10;\n        const lo = ax === \"x\" ? Math.min(fu.x0, fv.x0) : Math.min(fu.z0, fv.z0), hi = ax === \"x\" ? Math.max(fu.x1, fv.x1) : Math.max(fu.z1, fv.z1);\n        const p = ax === \"x\" ? Math.max(fu.z1, fv.z1) + 2 : Math.max(fu.x1, fv.x1) + 2;\n        out.push({\n          kind: \"height\",\n          mine: ma,\n          theirs: ta,\n          otherId: v.id,\n          y,\n          gap,\n          A: ax === \"x\" ? [lo, y, p] : [p, y, lo],\n          B: ax === \"x\" ? [hi, y, p] : [p, y, hi]\n        });\n      }\n    }\n    return out.sort((a, b) => a.gap - b.gap || a.y - b.y).slice(0, FINE.heightMax);\n  }\n  var SVG_NS = \"http://www.w3.org/2000/svg\";\n  function createGuides(ctx) {\n    const root = ctx.root, view = ctx.view;\n    const doc2 = ctx.doc || root && root.ownerDocument || null;\n    const worldToNdc2 = (p) => view.worldToNdc(p);\n    function drawGuideOverlay() {\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      const c = ctx.scene().cues || null;\n      const items = { front: null, front2: null, top: null };\n      const fr = (c && c.fronts || []).slice(0, 2);\n      for (let fi = 0; fi < fr.length; fi++) {\n        const f = fr[fi];\n        const lo = Math.min(f.from, f.to), hi = Math.max(f.from, f.to);\n        const y = f.y - 150;\n        const off = f.dir * 16;\n        items[fi === 0 ? \"front\" : \"front2\"] = {\n          label: f.label,\n          A: f.axis === \"z\" ? [lo, y, f.at + off] : [f.at + off, y, lo],\n          B: f.axis === \"z\" ? [hi, y, f.at + off] : [f.at + off, y, hi]\n        };\n      }\n      (c && c.tops || []).slice(0, 1).forEach(function(q) {\n        const cc = q.centres;\n        if (cc && cc.length) {\n          const a = cc[0], b = cc[cc.length - 1];\n          items.top = { label: q.label, A: [a.x, q.y + 20, a.z], B: [b.x, q.y + 20, b.z] };\n        } else {\n          const axis = q.axis || (q.x1 - q.x0 >= q.z1 - q.z0 ? \"x\" : \"z\");\n          const lo = q.lo, hi = q.hi, mid = q.mid;\n          items.top = axis === \"x\" ? { label: q.label, A: [lo, q.y + 20, mid], B: [hi, q.y + 20, mid] } : { label: q.label, A: [mid, q.y + 20, lo], B: [mid, q.y + 20, hi] };\n        }\n      });\n      const placed = [];\n      GUIDE_SLOTS.forEach(function(slot) {\n        const svg2 = root.querySelector('[data-ub-guide=\"' + slot + '\"]');\n        const pill = root.querySelector('[data-ub-guidelabel=\"' + slot + '\"]');\n        const it = items[slot];\n        if (!svg2) return;\n        const a = it ? worldToNdc2(it.A) : null, b = it ? worldToNdc2(it.B) : null;\n        if (a && b) {\n          const ax = (a[0] + 1) / 2 * cw, ay = (1 - a[1]) / 2 * ch, bx2 = (b[0] + 1) / 2 * cw, by = (1 - b[1]) / 2 * ch;\n          svg2.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n          svg2.setAttribute(\"width\", cw);\n          svg2.setAttribute(\"height\", ch);\n          const ln = svg2.querySelector(\"[data-ub-guide-seg]\");\n          if (ln) {\n            ln.setAttribute(\"x1\", ax);\n            ln.setAttribute(\"y1\", ay);\n            ln.setAttribute(\"x2\", bx2);\n            ln.setAttribute(\"y2\", by);\n          }\n          const ca = svg2.querySelector(\"[data-ub-guide-a]\"), cb = svg2.querySelector(\"[data-ub-guide-b]\");\n          if (ca) {\n            ca.setAttribute(\"cx\", ax);\n            ca.setAttribute(\"cy\", ay);\n          }\n          if (cb) {\n            cb.setAttribute(\"cx\", bx2);\n            cb.setAttribute(\"cy\", by);\n          }\n          svg2.removeAttribute(\"hidden\");\n          if (pill) {\n            const lx = (ax + bx2) / 2;\n            let ly = (ay + by) / 2;\n            ly += slot === \"top\" ? -22 : 22;\n            let guard = 0;\n            while (guard++ < 6 && placed.some(function(q) {\n              return Math.abs(q.x - lx) < 130 && Math.abs(q.y - ly) < 22;\n            })) {\n              ly += 26;\n            }\n            placed.push({ x: lx, y: ly });\n            pill.textContent = it.label;\n            pill.style.left = Math.round(lx) + \"px\";\n            pill.style.top = Math.round(ly) + \"px\";\n            pill.removeAttribute(\"hidden\");\n          }\n        } else {\n          svg2.setAttribute(\"hidden\", \"\");\n          if (pill) pill.setAttribute(\"hidden\", \"\");\n        }\n      });\n      const jsvg = root.querySelector(\"[data-ub-joints]\");\n      if (jsvg) {\n        const joints = c && c.joints || [];\n        if (joints.length && doc2 && typeof doc2.createElementNS === \"function\") {\n          jsvg.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n          jsvg.setAttribute(\"width\", cw);\n          jsvg.setAttribute(\"height\", ch);\n          while (jsvg.firstChild) jsvg.removeChild(jsvg.firstChild);\n          joints.forEach(function(j) {\n            const mid = j.front != null ? j.front : (j.lo + j.hi) / 2;\n            const A = j.axis === \"x\" ? [j.at, j.y0, mid] : [mid, j.y0, j.at];\n            const B = j.axis === \"x\" ? [j.at, j.y1, mid] : [mid, j.y1, j.at];\n            const na = worldToNdc2(A), nb = worldToNdc2(B);\n            if (!na || !nb) return;\n            const ln = doc2.createElementNS(SVG_NS, \"line\");\n            ln.setAttribute(\"x1\", (na[0] + 1) / 2 * cw);\n            ln.setAttribute(\"y1\", (1 - na[1]) / 2 * ch);\n            ln.setAttribute(\"x2\", (nb[0] + 1) / 2 * cw);\n            ln.setAttribute(\"y2\", (1 - nb[1]) / 2 * ch);\n            jsvg.appendChild(ln);\n          });\n          jsvg.removeAttribute(\"hidden\");\n        } else {\n          while (jsvg.firstChild) jsvg.removeChild(jsvg.firstChild);\n          jsvg.setAttribute(\"hidden\", \"\");\n        }\n      }\n    }\n    let fine = null;\n    function fineLayer() {\n      if (fine || !doc2 || typeof doc2.createElementNS !== \"function\") return fine;\n      const j = root.querySelector(\"[data-ub-joints]\"), host = j ? j.parentNode : null;\n      if (!host) return null;\n      fine = doc2.createElementNS(SVG_NS, \"svg\");\n      fine.setAttribute(\"class\", \"ub-lab__fineguides\");\n      fine.setAttribute(\"data-ub-fineguides\", \"\");\n      fine.setAttribute(\"aria-hidden\", \"true\");\n      fine.setAttribute(\"hidden\", \"\");\n      host.insertBefore(fine, j.nextSibling);\n      return fine;\n    }\n    function fineItems(sc) {\n      const out = [];\n      if (!sc || (sc.explode || 0) > 0) return out;\n      if (sc.alignView || sc.alignTemp) {\n        let gs = upperLowerGuides(sc.units || [], sc.snap !== false);\n        if (sc.alignTemp && !sc.alignView) gs = gs.filter((g2) => g2.baseId === sc.selectedId || g2.wallId === sc.selectedId);\n        gs = gs.slice().sort((a, b) => (a.kind === b.kind ? 0 : a.kind === \"aligned\" ? -1 : 1) || a.off - b.off).slice(0, sc.alignView ? FINE.viewMax : FINE.dragMax);\n        for (const g2 of gs) {\n          const p = ulPlaneFor(sc.units, g2);\n          const A = g2.axis === \"x\" ? [g2.at, g2.y0, p] : [p, g2.y0, g2.at], B = g2.axis === \"x\" ? [g2.at, g2.y1, p] : [p, g2.y1, g2.at];\n          out.push({ kind: g2.kind === \"aligned\" ? \"aligned\" : \"candidate\", A, B, ends: g2.kind === \"aligned\" });\n        }\n        const u = (sc.units || []).find((x) => x.id === sc.selectedId);\n        if (u) for (const h of heightDatums(sc.units, u, sc.cues)) out.push({ kind: \"height\", A: h.A, B: h.B, ends: true });\n      }\n      if (sc.drawerDatum && sc.drawerDatum.lines) for (const l of sc.drawerDatum.lines) out.push({ kind: \"drawer\", A: l.A, B: l.B, ends: true });\n      const t = sc.cornerTarget;\n      if (t && t.box) {\n        const b = t.box, y = (t.y || 0) + 4;\n        out.push({ kind: t.ok ? \"target\" : \"target-bad\", poly: [[b.x0, y, b.z0], [b.x1, y, b.z0], [b.x1, y, b.z1], [b.x0, y, b.z1]] });\n      }\n      return out;\n    }\n    function drawFine() {\n      const sc = ctx.scene ? ctx.scene() : null, items = fineItems(sc), svg2 = items.length ? fineLayer() : fine;\n      if (!svg2) return;\n      if (!items.length) {\n        if (!svg2.hasAttribute(\"hidden\")) {\n          while (svg2.firstChild) svg2.removeChild(svg2.firstChild);\n          svg2.setAttribute(\"hidden\", \"\");\n        }\n        return;\n      }\n      const cs = view.canvasSize(), cw = cs.w || 600, ch = cs.h || 440;\n      const px = (w) => {\n        const n = worldToNdc2(w);\n        return n ? [(n[0] + 1) / 2 * cw, (1 - n[1]) / 2 * ch] : null;\n      };\n      svg2.setAttribute(\"viewBox\", \"0 0 \" + cw + \" \" + ch);\n      svg2.setAttribute(\"width\", cw);\n      svg2.setAttribute(\"height\", ch);\n      while (svg2.firstChild) svg2.removeChild(svg2.firstChild);\n      for (const it of items) {\n        if (it.poly) {\n          const pts = it.poly.map(px);\n          if (pts.some((q) => !q)) continue;\n          const pg = doc2.createElementNS(SVG_NS, \"polygon\");\n          pg.setAttribute(\"points\", pts.map((q) => q[0].toFixed(1) + \",\" + q[1].toFixed(1)).join(\" \"));\n          pg.setAttribute(\"class\", \"is-\" + it.kind);\n          pg.setAttribute(\"data-ub-fine\", it.kind);\n          svg2.appendChild(pg);\n          continue;\n        }\n        const a = px(it.A), b = px(it.B);\n        if (!a || !b) continue;\n        fineLine(doc2, svg2, a, b, it.kind, { ends: it.ends });\n      }\n      svg2.removeAttribute(\"hidden\");\n    }\n    function frame2() {\n      drawGuideOverlay();\n      try {\n        drawFine();\n      } catch {\n      }\n    }\n    return { frame: frame2, state: () => ({ fine: fineItems(ctx.scene ? ctx.scene() : null).map((i) => i.kind) }) };\n  }\n\n  // v2/src/ui/room-editor.js\n  var hexCss2 = (h) => \"#\" + h.toString(16).padStart(6, \"0\");\n  function createRoomEditor(ctx) {\n    let ed = {};\n    try {\n      ed = buildRoomEditor(ctx);\n    } catch (e) {\n      return { error: e };\n    }\n    return {\n      sync() {\n        try {\n          if (ed.sync) ed.sync();\n        } catch (e) {\n          ed.error = e;\n        }\n      },\n      shown() {\n        try {\n          if (ed.shown) ed.shown();\n        } catch (e) {\n          ed.error = e;\n        }\n      },\n      section(name2) {\n        try {\n          if (ed.section) ed.section(name2);\n        } catch (e) {\n          ed.error = e;\n        }\n      },\n      sectionNow() {\n        return ed.sectionNow ? ed.sectionNow() : null;\n      }\n    };\n  }\n  function buildRoomEditor(ctx) {\n    const root = ctx.root, doc2 = ctx.doc;\n    const box3 = root.querySelector(\"[data-ub-roomedit]\");\n    if (!box3 || !doc2) return {};\n    const q = (s) => box3.querySelector(s);\n    const E = {\n      walls: q(\"[data-ub-roomwalls]\"),\n      wallName: q(\"[data-ub-roomwallname]\"),\n      fin: q(\"[data-ub-roomfloorfin]\"),\n      cols: q(\"[data-ub-roomfloorcol]\"),\n      colName: q(\"[data-ub-roomfloorname]\"),\n      list: q(\"[data-ub-roomopenings]\"),\n      add: Array.prototype.slice.call(box3.querySelectorAll(\"[data-ub-roomadd]\")),\n      objs: q(\"[data-ub-roomobjs]\"),\n      objAdd: q(\"[data-ub-roomobjadd]\")\n    };\n    const st = { open: null, listSig: \"\", colSig: \"\", objSig: \"\" };\n    const el = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const room = () => ctx.scene() && ctx.scene().room || {};\n    const act = (name2, args) => ctx.act(name2, args);\n    const focused = (n) => n && doc2.activeElement === n;\n    function swatch(kind, c, extra) {\n      const b = el(\"button\", \"ub-lab__rsw\" + (extra ? \" \" + extra : \"\"), {\n        type: \"button\",\n        \"data-ub-roomsw\": kind,\n        \"data-ub-val\": c.id,\n        title: c.name,\n        \"aria-label\": c.name,\n        \"aria-pressed\": \"false\"\n      });\n      b.setAttribute(\"style\", \"--ub-rsw:\" + hexCss2(c.hex));\n      return b;\n    }\n    if (E.walls) for (const c of WALL_COLOURS) E.walls.appendChild(swatch(\"wall\", c));\n    if (E.fin) for (const f of FLOOR_FINISHES)\n      E.fin.appendChild(el(\"button\", \"ub-lab__btn ub-lab__rfin\", { type: \"button\", \"data-ub-roomfin\": f.id, \"aria-pressed\": \"false\" }, f.name));\n    function buildColours(f) {\n      if (!E.cols || st.colSig === f.id) return;\n      const changed = st.colSig != null;\n      st.colSig = f.id;\n      E.cols.textContent = \"\";\n      for (const c of f.colours) E.cols.appendChild(swatch(\"floor\", c, f.id === \"plain\" ? \"\" : \"ub-lab__rsw--\" + f.id));\n      if (changed && body && E.cols.getBoundingClientRect && body.getBoundingClientRect) {\n        const br = body.getBoundingClientRect(), cr = E.cols.getBoundingClientRect();\n        if (cr.right > br.right - 4) body.scrollLeft += Math.min(cr.right - br.right + 8, cr.left - br.left - 8);\n        else if (cr.left < br.left + 4) body.scrollLeft -= br.left - cr.left + 8;\n      }\n    }\n    const WALL_SHORT = { back: \"Back\", left: \"Left\", right: \"Right\", front: \"Front\" };\n    function wallButtons(attrs, current, idBase) {\n      const g2 = [];\n      for (const w of roomWallIds(room())) {\n        const b = el(\"button\", \"ub-lab__rwall\", Object.assign({\n          type: \"button\",\n          \"data-ub-wall\": w,\n          \"aria-pressed\": w === current ? \"true\" : \"false\",\n          id: idBase + \"-\" + w,\n          title: wallNameOf(room(), w)\n        }, attrs));\n        b.appendChild(el(\"span\", \"ub-lab__rwallico ub-lab__rwallico--\" + w, { \"aria-hidden\": \"true\" }));\n        b.appendChild(el(\"span\", null, null, WALL_SHORT[w] || wallNameOf(room(), w)));\n        if (w === current) b.classList.add(\"is-active\");\n        g2.push(b);\n      }\n      return g2;\n    }\n    const scroller = box3.closest ? box3.closest(\"[data-ub-flyout]\") : null;\n    const strip = scroller;\n    const body = strip && strip.querySelector ? strip.querySelector(\"[data-ub-roomscroll]\") : null;\n    const tabs = strip ? Array.prototype.slice.call(strip.querySelectorAll(\"[data-ub-roomtab]\")) : [];\n    const secs = strip ? Array.prototype.slice.call(strip.querySelectorAll(\"[data-ub-roomsec]\")) : [];\n    const SECTIONS = [\"size\", \"walls\", \"floor\", \"openings\"];\n    st.sec = \"size\";\n    try {\n      const m = String(ctx.win && ctx.win.location && ctx.win.location.hash || \"\").match(/^#ub-room-([a-z]+)$/);\n      if (m && SECTIONS.indexOf(m[1]) >= 0) st.sec = m[1];\n    } catch {\n    }\n    function setSection(name2, focusTab) {\n      if (SECTIONS.indexOf(name2) < 0) return;\n      const was = st.sec;\n      st.sec = name2;\n      for (const t of tabs) {\n        const on = t.getAttribute(\"data-ub-roomtab\") === name2;\n        t.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\n        t.classList.toggle(\"is-active\", on);\n        if (on) t.removeAttribute(\"tabindex\");\n        else t.setAttribute(\"tabindex\", \"-1\");\n        if (on && focusTab && t.focus) t.focus();\n      }\n      for (const p of secs) {\n        if (p.getAttribute(\"data-ub-roomsec\") === name2) p.removeAttribute(\"hidden\");\n        else p.setAttribute(\"hidden\", \"\");\n      }\n      if (body && was !== name2) showTab(name2);\n    }\n    function showTab(name2) {\n      const t = tabs.find((x) => x.getAttribute(\"data-ub-roomtab\") === name2);\n      if (!body || !t || !t.getBoundingClientRect || body.scrollWidth <= body.clientWidth + 1) {\n        if (body) body.scrollLeft = 0;\n        return;\n      }\n      body.scrollLeft = Math.max(0, Math.round(body.scrollLeft + t.getBoundingClientRect().left - body.getBoundingClientRect().left - 4));\n    }\n    setSection(st.sec);\n    for (const t of tabs) {\n      t.addEventListener(\"click\", function() {\n        setSection(t.getAttribute(\"data-ub-roomtab\"));\n      });\n      t.addEventListener(\"keydown\", function(e) {\n        const i = SECTIONS.indexOf(t.getAttribute(\"data-ub-roomtab\"));\n        const k = e.key, n = SECTIONS.length;\n        const j = k === \"ArrowRight\" ? (i + 1) % n : k === \"ArrowLeft\" ? (i + n - 1) % n : k === \"Home\" ? 0 : k === \"End\" ? n - 1 : -1;\n        if (j < 0) return;\n        if (e.preventDefault) e.preventDefault();\n        setSection(SECTIONS[j], true);\n      });\n    }\n    if (strip) {\n      const stop = (e) => {\n        if (e && e.stopPropagation) e.stopPropagation();\n      };\n      strip.addEventListener(\"mousedown\", stop);\n      strip.addEventListener(\"pointerdown\", stop);\n      strip.addEventListener(\"touchstart\", stop, { passive: true });\n      strip.addEventListener(\"wheel\", function(e) {\n        stop(e);\n        if (!body || body.scrollWidth <= body.clientWidth + 1) return;\n        const d = Math.abs(e.deltaY) > Math.abs(e.deltaX) ? e.deltaY : e.deltaX;\n        if (!d) return;\n        const max = body.scrollWidth - body.clientWidth;\n        if (d < 0 && body.scrollLeft <= 0 || d > 0 && body.scrollLeft >= max - 1) return;\n        if (e.preventDefault) e.preventDefault();\n        body.scrollLeft = Math.max(0, Math.min(max, body.scrollLeft + d));\n      }, { passive: false });\n    }\n    function place2() {\n      if (!strip || strip.hidden || !strip.getBoundingClientRect || !strip.offsetParent) return;\n      const host = strip.offsetParent, hr = host.getBoundingClientRect();\n      if (!hr.width) return;\n      strip.style.left = \"\";\n      strip.style.right = \"\";\n      const sr = strip.getBoundingClientRect();\n      let left = Math.round(sr.left - hr.left), right = Math.round(hr.right - sr.right);\n      const top = sr.top - 8;\n      const L = root.querySelector(\".ub-lab__dock--left\"), R4 = root.querySelector(\".ub-lab__dock--right\");\n      const reach = (d) => {\n        if (!d || !d.getBoundingClientRect) return null;\n        const r = d.getBoundingClientRect();\n        return r.width && r.bottom > top ? r : null;\n      };\n      const lr = reach(L), rr = reach(R4);\n      if (lr) left = Math.max(left, Math.round(lr.right - hr.left + 8));\n      if (rr) right = Math.max(right, Math.round(hr.right - rr.left + 8));\n      strip.style.left = left + \"px\";\n      strip.style.right = right + \"px\";\n    }\n    if (ctx.win && ctx.win.addEventListener) ctx.win.addEventListener(\"resize\", place2);\n    function highlight() {\n      const sc = ctx.scene && ctx.scene();\n      if (!sc) return;\n      if ((sc.roomSel || null) !== (st.open || null)) {\n        sc.roomSel = st.open || null;\n        if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n      }\n      if (sc.roomArmed && sc.roomArmed !== (sc.roomSel || null)) {\n        sc.roomArmed = null;\n        if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n      }\n    }\n    function setOpen(id) {\n      st.open = id || null;\n      highlight();\n    }\n    function adopt() {\n      const sc = ctx.scene && ctx.scene();\n      if (sc && sc.roomSel !== void 0 && (sc.roomSel || null) !== (st.open || null)) {\n        st.open = sc.roomSel || null;\n        if (st.open) setSection(\"openings\");\n        return true;\n      }\n      return false;\n    }\n    function face2(wall) {\n      act(\"view.faceWall\", { wall });\n    }\n    function reveal(id) {\n      const li = E.list && E.list.querySelector('[data-ub-roomopitem=\"' + id + '\"]');\n      if (!li || !body || !body.getBoundingClientRect) return;\n      const fr = body.getBoundingClientRect(), lr = li.getBoundingClientRect();\n      if (lr.left < fr.left + 4 || lr.right > fr.right - 4) body.scrollLeft += Math.round(lr.left - fr.left - 8);\n    }\n    box3.addEventListener(\"click\", function(e) {\n      const t = e.target && e.target.closest ? e.target.closest(\"button\") : null;\n      if (!t || !box3.contains(t)) return;\n      if (boilerClick(t)) return;\n      const sw = t.getAttribute(\"data-ub-roomsw\");\n      if (sw) {\n        act(\"room.look\", { k: sw === \"wall\" ? \"wall\" : \"floorColour\", value: t.getAttribute(\"data-ub-val\") });\n        return;\n      }\n      const fin = t.getAttribute(\"data-ub-roomfin\");\n      if (fin) {\n        act(\"room.look\", { k: \"floorFinish\", value: fin });\n        return;\n      }\n      const wall = t.getAttribute(\"data-ub-wall\");\n      if (wall && t.getAttribute(\"data-ub-roomopid\")) {\n        const id = t.getAttribute(\"data-ub-roomopid\");\n        const r = act(\"room.opening.set\", { id, k: \"wall\", raw: wall });\n        if (r && r.ok) face2(wall);\n        sync();\n        const again = doc2.getElementById && doc2.getElementById(\"ub-rop-\" + id + \"-wall-\" + wall);\n        if (again && again.focus) again.focus();\n        return;\n      }\n      const add = t.getAttribute(\"data-ub-roomadd\");\n      if (add) {\n        const r = act(\"room.opening.add\", { kind: add });\n        if (r && r.ok && r.id) {\n          setOpen(r.id);\n          face2(r.wall);\n          sync();\n          reveal(r.id);\n          focusField(r.id);\n        }\n        return;\n      }\n      const nudge = t.getAttribute(\"data-ub-roomopnudge\");\n      if (nudge) {\n        const id = t.getAttribute(\"data-ub-roomopid\"), o = openingsOf(room()).find((x) => x.id === id);\n        if (!o) return;\n        act(\"room.opening.set\", { id, k: \"x\", raw: nudge === \"centre\" ? \"centre\" : String(o.x + Number(nudge)) });\n        return;\n      }\n      const tog = t.getAttribute(\"data-ub-roomop\");\n      if (tog) {\n        setOpen(st.open === tog ? null : tog);\n        sync();\n        reveal(tog);\n        return;\n      }\n      const del = t.getAttribute(\"data-ub-roomopdel\");\n      if (del) {\n        const r = act(\"room.opening.remove\", { id: del });\n        if (r && r.ok && st.open === del) setOpen(null);\n        sync();\n        const next = E.list && E.list.querySelector(\"[data-ub-roomop]\");\n        const target = next || E.add[0];\n        if (target && target.focus) target.focus();\n      }\n    });\n    function commitField(inp) {\n      const id = inp.getAttribute(\"data-ub-roomopid\"), k = inp.getAttribute(\"data-ub-roomopk\");\n      if (inp.getAttribute(\"data-ub-sent\") === inp.value) return;\n      inp.setAttribute(\"data-ub-sent\", inp.value);\n      act(\"room.opening.set\", { id, k, raw: inp.value });\n    }\n    const isSlider = (t) => t && t.getAttribute && t.getAttribute(\"data-ub-roomopslide\");\n    box3.addEventListener(\"input\", function(e) {\n      const t = e.target;\n      if (t && t.getAttribute && t.getAttribute(\"data-ub-roomobjk\")) {\n        t.removeAttribute(\"data-ub-sent\");\n        return;\n      }\n      if (isSlider(t)) {\n        st.sliding = true;\n        act(\"room.opening.set\", { id: t.getAttribute(\"data-ub-roomopid\"), k: \"x\", raw: t.value, phase: \"live\" });\n        return;\n      }\n      if (t && t.removeAttribute) t.removeAttribute(\"data-ub-sent\");\n    });\n    box3.addEventListener(\"change\", function(e) {\n      const t = e.target;\n      if (isSlider(t)) {\n        st.sliding = false;\n        act(\"room.opening.set\", { id: t.getAttribute(\"data-ub-roomopid\"), k: \"x\", raw: t.value, phase: \"end\" });\n        sync();\n        return;\n      }\n      if (t && t.getAttribute && t.getAttribute(\"data-ub-roomopk\")) commitField(t);\n      if (t && t.getAttribute && t.getAttribute(\"data-ub-roomobjk\")) commitObjField(t);\n    });\n    box3.addEventListener(\"focusout\", function(e) {\n      const t = e.target;\n      if (t && t.tagName === \"INPUT\" && !isSlider(t) && t.getAttribute(\"data-ub-roomopk\")) commitField(t);\n      if (t && t.tagName === \"INPUT\" && t.getAttribute(\"data-ub-roomobjk\")) commitObjField(t);\n    });\n    box3.addEventListener(\"keydown\", function(e) {\n      const t = e.target;\n      if (e.key === \"Enter\" && t && t.tagName === \"INPUT\" && !isSlider(t) && t.getAttribute(\"data-ub-roomopk\")) {\n        e.preventDefault();\n        commitField(t);\n      }\n      if (e.key === \"Enter\" && t && t.tagName === \"INPUT\" && t.getAttribute(\"data-ub-roomobjk\")) {\n        e.preventDefault();\n        commitObjField(t);\n      }\n    });\n    if (scroller) scroller.addEventListener(\"keydown\", function(e) {\n      const k = e.key || \"\";\n      if (k === \"Escape\" || (e.ctrlKey || e.metaKey) && /^[zy]$/i.test(k)) return;\n      if (/^Arrow|^Delete$|^Backspace$|^Home$|^End$|^PageUp$|^PageDown$|^[-+=_]$/.test(k) && e.stopPropagation) e.stopPropagation();\n    });\n    function focusField(id) {\n      const f = E.list && (E.list.querySelector('[data-ub-roomopid=\"' + id + '\"][data-ub-roomopslide]') || E.list.querySelector('[data-ub-roomopid=\"' + id + '\"][data-ub-wall]'));\n      if (f && f.focus) f.focus();\n    }\n    const objSel = () => {\n      const sc = ctx.scene && ctx.scene();\n      return sc && sc.roomObjSel || null;\n    };\n    function setObjSel(id) {\n      const sc = ctx.scene && ctx.scene();\n      if (!sc || (sc.roomObjSel || null) === (id || null)) return;\n      sc.roomObjSel = id || null;\n      if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n    }\n    function boilerClick(t) {\n      if (t.hasAttribute(\"data-ub-roomobjadd\")) {\n        const r = act(\"room.object.add\", { kind: t.getAttribute(\"data-ub-roomobjadd\") });\n        if (r && r.ok && r.id) {\n          setSection(\"openings\");\n          sync();\n          face2(r.op.wall);\n          const f = E.objs && E.objs.querySelector('[data-ub-roomobjid=\"' + r.id + '\"]');\n          if (f && f.focus) f.focus();\n        }\n        return true;\n      }\n      const tog = t.getAttribute(\"data-ub-roomobj\");\n      if (tog) {\n        setObjSel(objSel() === tog ? null : tog);\n        st.objSig = \"\";\n        sync();\n        return true;\n      }\n      const del = t.getAttribute(\"data-ub-roomobjdel\");\n      if (del) {\n        act(\"room.object.remove\", { id: del });\n        st.objSig = \"\";\n        sync();\n        if (E.objAdd && E.objAdd.focus) E.objAdd.focus();\n        return true;\n      }\n      const ow = t.getAttribute(\"data-ub-objwall\");\n      if (ow) {\n        const id = t.getAttribute(\"data-ub-roomobjid\");\n        const r = act(\"room.object.set\", { id, k: \"wall\", raw: ow });\n        if (r && r.ok) face2(ow);\n        st.objSig = \"\";\n        sync();\n        return true;\n      }\n      return false;\n    }\n    function commitObjField(inp) {\n      if (inp.getAttribute(\"data-ub-sent\") === inp.value) return;\n      inp.setAttribute(\"data-ub-sent\", inp.value);\n      act(\"room.object.set\", { id: inp.getAttribute(\"data-ub-roomobjid\"), k: inp.getAttribute(\"data-ub-roomobjk\"), raw: inp.value });\n    }\n    function objField(o, k, label, lim) {\n      const id = \"ub-robj-\" + o.id + \"-\" + k;\n      const wrap = el(\"span\", \"ub-lab__ropf\");\n      wrap.appendChild(el(\"label\", \"ub-lab__secwlab\", { for: id }, label));\n      const inp = el(\"input\", \"ub-lab__secw\", {\n        id,\n        type: \"number\",\n        inputmode: \"numeric\",\n        step: \"10\",\n        \"data-ub-roomobjid\": o.id,\n        \"data-ub-roomobjk\": k,\n        \"aria-label\": label + \" of \" + objectLabel(room(), o).toLowerCase() + \", in millimetres\"\n      });\n      if (lim) {\n        inp.setAttribute(\"min\", String(lim[0]));\n        inp.setAttribute(\"max\", String(lim[1]));\n      }\n      inp.value = String(o[k]);\n      wrap.appendChild(inp);\n      return wrap;\n    }\n    function buildObjs(list) {\n      E.objs.textContent = \"\";\n      const r = room(), sz = roomSize(), sel = objSel();\n      for (const o of list) {\n        const open = sel === o.id;\n        const li = el(\"li\", \"ub-lab__rop\" + (open ? \" is-open\" : \"\"), { \"data-ub-roomobjitem\": o.id });\n        const head = el(\"div\", \"ub-lab__rophead\");\n        const tog = el(\"button\", \"ub-lab__roptog\", {\n          type: \"button\",\n          \"data-ub-roomobj\": o.id,\n          \"aria-expanded\": open ? \"true\" : \"false\",\n          \"aria-label\": objectLabel(r, o) + \", \" + wallNameOf(r, o.wall) + \", \" + o.w + \" \\xD7 \" + o.h + \" \\xD7 \" + o.d + \" mm - \" + (open ? \"close\" : \"open\") + \" to move or resize it\"\n        });\n        tog.appendChild(el(\"span\", \"ub-lab__ropicon ub-lab__ropicon--boiler\", { \"aria-hidden\": \"true\" }));\n        tog.appendChild(el(\"strong\", null, null, objectLabel(r, o)));\n        head.appendChild(tog);\n        head.appendChild(el(\"button\", \"ub-lab__btn ub-lab__ropdel\" + (open ? \"\" : \" ub-lab__ropdel--x\"), {\n          type: \"button\",\n          \"data-ub-roomobjdel\": o.id,\n          \"aria-label\": \"Remove \" + objectLabel(r, o).toLowerCase(),\n          title: \"Remove \" + objectLabel(r, o).toLowerCase()\n        }, open ? \"Remove\" : \"\\xD7\"));\n        li.appendChild(head);\n        if (open) {\n          const lim = objectLimits(o.kind, sz, o.wall);\n          const body2 = el(\"div\", \"ub-lab__ropbody\", { role: \"group\", \"aria-label\": objectLabel(r, o) + \" place and size\" });\n          const wg = el(\"div\", \"ub-lab__rwalls\", { role: \"group\", \"aria-label\": \"Wall of \" + objectLabel(r, o).toLowerCase() });\n          for (const b of wallButtons({ \"data-ub-roomobjid\": o.id }, o.wall, \"ub-robj-\" + o.id + \"-wall\")) {\n            b.setAttribute(\"data-ub-objwall\", b.getAttribute(\"data-ub-wall\"));\n            b.removeAttribute(\"data-ub-wall\");\n            b.setAttribute(\"aria-label\", \"Put \" + objectLabel(r, o).toLowerCase() + \" on the \" + wallNameOf(r, b.getAttribute(\"data-ub-objwall\")).toLowerCase());\n            wg.appendChild(b);\n          }\n          body2.appendChild(wg);\n          const row = el(\"div\", \"ub-lab__rsize\");\n          row.appendChild(objField(o, \"x\", \"From wall start\", [0, Math.max(0, wallFrame(o.wall, sz).len - o.w)]));\n          row.appendChild(objField(o, \"y\", \"Height above floor\", lim.y));\n          row.appendChild(objField(o, \"w\", \"Width\", lim.w));\n          row.appendChild(objField(o, \"h\", \"Height\", lim.h));\n          row.appendChild(objField(o, \"d\", \"Depth\", lim.d));\n          body2.appendChild(row);\n          body2.appendChild(el(\"p\", \"ub-lab__note ub-lab__ropnote\", { \"data-ub-roomobjnote\": o.id }, BOILER.note + \" Drag it in the 3D view to move it.\"));\n          li.appendChild(body2);\n        }\n        E.objs.appendChild(li);\n      }\n    }\n    function syncObjs() {\n      if (!E.objs) return;\n      const list = roomObjectsOf(room()), sz = roomSize();\n      const sel = objSel();\n      if (sel && !list.some((o) => o.id === sel)) setObjSel(null);\n      const sig = JSON.stringify([list.map((o) => [o.id, o.wall]), objSel(), sz, room().outline || null]);\n      if (sig !== st.objSig) {\n        st.objSig = sig;\n        buildObjs(list);\n        if (objSel()) setSection(\"openings\");\n      } else for (const o of list) for (const inp of E.objs.querySelectorAll('input[data-ub-roomobjid=\"' + o.id + '\"]')) {\n        if (!focused(inp)) {\n          inp.value = String(o[inp.getAttribute(\"data-ub-roomobjk\")]);\n          inp.removeAttribute(\"data-ub-sent\");\n        }\n      }\n      if (E.objAdd) E.objAdd.disabled = list.length >= 6;\n    }\n    function summary2(o) {\n      return wallNameOf(room(), o.wall) + \" \\xB7 \" + o.x + \" mm from left \\xB7 \" + o.w + \" \\xD7 \" + o.h;\n    }\n    function field(o, k, label, lim) {\n      const id = \"ub-rop-\" + o.id + \"-\" + k;\n      const wrap = el(\"span\", \"ub-lab__ropf\");\n      wrap.appendChild(el(\"label\", \"ub-lab__secwlab\", { for: id }, label));\n      const inp = el(\"input\", \"ub-lab__secw\", {\n        id,\n        type: \"number\",\n        inputmode: \"numeric\",\n        step: \"10\",\n        \"data-ub-roomopid\": o.id,\n        \"data-ub-roomopk\": k,\n        min: String(lim[0]),\n        max: String(lim[1]),\n        \"aria-label\": label + \" of \" + openingLabel(room(), o).toLowerCase() + \", in millimetres\"\n      });\n      inp.value = String(o[k]);\n      wrap.appendChild(inp);\n      return wrap;\n    }\n    function placeBlock(o, sz) {\n      const len = wallFrame(o.wall, sz).len, max = Math.max(50, len - 50 - o.w);\n      const name2 = openingLabel(room(), o).toLowerCase();\n      const blk = el(\"div\", \"ub-lab__rplace\", { role: \"group\", \"aria-label\": \"Where the \" + name2 + \" is\" });\n      const wl = el(\"span\", \"ub-lab__rsub\", { id: \"ub-rop-\" + o.id + \"-wl\" }, \"Wall\");\n      blk.appendChild(wl);\n      const wg = el(\"div\", \"ub-lab__rwalls\", { role: \"group\", \"aria-labelledby\": \"ub-rop-\" + o.id + \"-wl\" });\n      for (const b of wallButtons({ \"data-ub-roomopid\": o.id, \"aria-label\": \"Move the \" + name2 + \" to the \" + wallNameOf(room(), o.wall).toLowerCase() }, o.wall, \"ub-rop-\" + o.id + \"-wall\")) {\n        b.setAttribute(\"aria-label\", \"Put the \" + name2 + \" on the \" + wallNameOf(room(), b.getAttribute(\"data-ub-wall\")).toLowerCase());\n        wg.appendChild(b);\n      }\n      blk.appendChild(wg);\n      const sid = \"ub-rop-\" + o.id + \"-slide\";\n      blk.appendChild(el(\"label\", \"ub-lab__rsub\", { for: sid }, \"Along the wall\"));\n      const row = el(\"div\", \"ub-lab__rslide\");\n      row.appendChild(el(\"button\", \"ub-lab__btn ub-lab__rnudge\", {\n        type: \"button\",\n        \"data-ub-roomopid\": o.id,\n        \"data-ub-roomopnudge\": \"-100\",\n        \"aria-label\": \"Move the \" + name2 + \" 100 mm left\",\n        title: \"100 mm left\"\n      }, \"\\u25C0\"));\n      const sl = el(\"input\", \"ub-lab__rrange\", {\n        id: sid,\n        type: \"range\",\n        min: \"50\",\n        max: String(max),\n        step: \"10\",\n        \"data-ub-roomopid\": o.id,\n        \"data-ub-roomopk\": \"x\",\n        \"data-ub-roomopslide\": \"1\",\n        \"aria-label\": \"Position of the \" + name2 + \" along the \" + wallNameOf(room(), o.wall).toLowerCase() + \", from its left corner, in millimetres\"\n      });\n      sl.value = String(o.x);\n      row.appendChild(sl);\n      row.appendChild(el(\"button\", \"ub-lab__btn ub-lab__rnudge\", {\n        type: \"button\",\n        \"data-ub-roomopid\": o.id,\n        \"data-ub-roomopnudge\": \"100\",\n        \"aria-label\": \"Move the \" + name2 + \" 100 mm right\",\n        title: \"100 mm right\"\n      }, \"\\u25B6\"));\n      blk.appendChild(row);\n      const row2 = el(\"div\", \"ub-lab__rslide2\");\n      row2.appendChild(field(o, \"x\", \"From left corner\", [50, max]));\n      row2.appendChild(el(\"button\", \"ub-lab__btn ub-lab__rnudge ub-lab__rcentre\", {\n        type: \"button\",\n        \"data-ub-roomopid\": o.id,\n        \"data-ub-roomopnudge\": \"centre\",\n        \"aria-label\": \"Centre the \" + name2 + \" on its wall\"\n      }, \"Centre\"));\n      blk.appendChild(row2);\n      return blk;\n    }\n    function buildList(ops) {\n      E.list.textContent = \"\";\n      const r = room(), sz = roomSize();\n      for (const o of ops) {\n        const li = el(\"li\", \"ub-lab__rop\" + (st.open === o.id ? \" is-open\" : \"\"), { \"data-ub-roomopitem\": o.id });\n        const head = el(\"div\", \"ub-lab__rophead\");\n        const open = st.open === o.id;\n        const tog = el(\"button\", \"ub-lab__roptog\", {\n          type: \"button\",\n          \"data-ub-roomop\": o.id,\n          \"aria-expanded\": open ? \"true\" : \"false\",\n          \"aria-controls\": \"ub-rop-\" + o.id,\n          \"aria-label\": openingLabel(r, o) + \", \" + summary2(o) + \" - \" + (open ? \"close\" : \"open\") + \" to move or resize it\"\n        });\n        tog.appendChild(el(\"span\", \"ub-lab__ropicon ub-lab__ropicon--\" + o.kind, { \"aria-hidden\": \"true\" }));\n        tog.appendChild(el(\"strong\", null, null, openingLabel(r, o)));\n        tog.appendChild(el(\"span\", \"ub-lab__ropsum ub-lab__sr\", { \"data-ub-roomopsum\": o.id }, summary2(o)));\n        head.appendChild(tog);\n        head.appendChild(el(\"button\", \"ub-lab__btn ub-lab__ropdel\" + (open ? \"\" : \" ub-lab__ropdel--x\"), {\n          type: \"button\",\n          \"data-ub-roomopdel\": o.id,\n          \"aria-label\": \"Remove \" + openingLabel(r, o).toLowerCase(),\n          title: \"Remove \" + openingLabel(r, o).toLowerCase()\n        }, open ? \"Remove\" : \"\\xD7\"));\n        li.appendChild(head);\n        const body2 = el(\"div\", \"ub-lab__ropbody\", { id: \"ub-rop-\" + o.id, role: \"group\", \"aria-label\": openingLabel(r, o) + \" place and size\" });\n        if (!open) body2.hidden = true;\n        if (open) {\n          const lim = openingLimits(o.kind, sz, o.wall);\n          body2.appendChild(placeBlock(o, sz));\n          const size3 = el(\"div\", \"ub-lab__rsize\");\n          size3.appendChild(field(o, \"w\", \"Width\", lim.w));\n          size3.appendChild(field(o, \"h\", \"Height\", lim.h));\n          if (o.kind === \"window\") size3.appendChild(field(o, \"y\", \"Sill height\", lim.y));\n          body2.appendChild(size3);\n          body2.appendChild(el(\n            \"p\",\n            \"ub-lab__note ub-lab__ropnote ub-lab__sr\",\n            null,\n            \"Outlined in orange in the 3D view - double-click it there to move it, then drag. Measured standing in the room facing the wall. \" + OPENING_KINDS[o.kind].name + \"s keep 50 mm from corners, 100 mm from each other and clear of cabinets on that wall.\"\n          ));\n        }\n        li.appendChild(body2);\n        E.list.appendChild(li);\n      }\n    }\n    function sync() {\n      const r = room();\n      const wc = wallColourOf(r), ff = floorFinishOf(r), fc = floorColourOf(r);\n      if (E.walls) for (const b of E.walls.querySelectorAll(\"[data-ub-roomsw]\")) {\n        const on = b.getAttribute(\"data-ub-val\") === wc.id;\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      }\n      if (E.wallName) E.wallName.textContent = wc.name;\n      if (E.fin) for (const b of E.fin.querySelectorAll(\"[data-ub-roomfin]\")) {\n        const on = b.getAttribute(\"data-ub-roomfin\") === ff.id;\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      }\n      buildColours(ff);\n      if (E.cols) for (const b of E.cols.querySelectorAll(\"[data-ub-roomsw]\")) {\n        const on = b.getAttribute(\"data-ub-val\") === fc.id;\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      }\n      if (E.colName) E.colName.textContent = ff.name + \", \" + fc.name.toLowerCase();\n      for (const b of E.add) b.setAttribute(\"aria-label\", \"Add a \" + b.getAttribute(\"data-ub-roomadd\") + \" - on a free stretch of wall, or drag it onto the wall you want\");\n      const picked = adopt();\n      if (!E.list) {\n        syncObjs();\n        highlight();\n        return;\n      }\n      const ops = openingsOf(r);\n      if (st.open && !ops.some((o) => o.id === st.open)) setOpen(null);\n      const sz = roomSize();\n      const sig = JSON.stringify([ops.map((o) => [o.id, o.kind, o.wall]), st.open, sz]);\n      const keepFocus = doc2.activeElement && E.list.contains(doc2.activeElement) ? doc2.activeElement.id : null;\n      if (sig !== st.listSig && !st.sliding) {\n        const top = scroller ? scroller.scrollTop : 0;\n        st.listSig = sig;\n        buildList(ops);\n        if (scroller) scroller.scrollTop = top;\n        if (keepFocus) {\n          const f = doc2.getElementById ? doc2.getElementById(keepFocus) : null;\n          if (f && f.focus) f.focus();\n        }\n      } else {\n        for (const o of ops) {\n          const s = E.list.querySelector('[data-ub-roomopsum=\"' + o.id + '\"]');\n          if (s) s.textContent = summary2(o);\n          for (const inp of E.list.querySelectorAll('input[data-ub-roomopid=\"' + o.id + '\"]')) {\n            const k = inp.getAttribute(\"data-ub-roomopk\");\n            if (!focused(inp)) {\n              inp.value = String(o[k]);\n              inp.removeAttribute(\"data-ub-sent\");\n            }\n            if (k === \"x\") inp.max = String(Math.max(50, wallFrame(o.wall, sz).len - 50 - o.w));\n          }\n        }\n      }\n      for (const b of E.add) b.disabled = ops.length >= 12;\n      syncObjs();\n      if (picked && st.open) reveal(st.open);\n      highlight();\n    }\n    let wasOpen = false;\n    function shown() {\n      highlight();\n      place2();\n      const open = !!strip && !strip.hidden;\n      if (open && !wasOpen) showTab(st.sec);\n      wasOpen = open;\n    }\n    return { sync, shown, section: setSection, sectionNow: () => st.sec, place: place2 };\n  }\n\n  // v2/src/ui/room-layout-plan.js\n  var HIT_CORNER = 14;\n  var HIT_WALL = 10;\n  var HIT_MID = 11;\n  function fitPlan(o, w, h, pad) {\n    pad = pad == null ? 56 : pad;\n    const B = outlineBounds(o), W2 = Math.max(1, B.x1 - B.x0), D2 = Math.max(1, B.z1 - B.z0);\n    const s = Math.max(0.01, Math.min((w - 2 * pad) / W2, (h - 2 * pad) / D2));\n    return { s, ox: Math.round((w - W2 * s) / 2 - B.x0 * s), oy: Math.round((h - D2 * s) / 2 - B.z0 * s) };\n  }\n  var toPx = (f, x, z) => [f.ox + x * f.s, f.oy + z * f.s];\n  var toMm = (f, px, py) => [(px - f.ox) / f.s, (py - f.oy) / f.s];\n  function distSeg(px, py, a, b) {\n    const dx = b[0] - a[0], dy = b[1] - a[1], L2 = dx * dx + dy * dy;\n    const t = L2 ? Math.max(0, Math.min(1, ((px - a[0]) * dx + (py - a[1]) * dy) / L2)) : 0;\n    return { d: Math.hypot(px - a[0] - t * dx, py - a[1] - t * dy), t };\n  }\n  function hitPlan(o, f, px, py, scale) {\n    const k = scale || 1;\n    let best = null;\n    for (const p of o.walls) {\n      const q = toPx(f, p.x, p.z), d = Math.hypot(px - q[0], py - q[1]);\n      if (d <= HIT_CORNER * k && (!best || d < best.d)) best = { type: \"corner\", id: p.id, d };\n    }\n    if (best) return best;\n    for (const g2 of segments(o)) {\n      const a = toPx(f, g2.start[0], g2.start[1]), b = toPx(f, g2.end[0], g2.end[1]), m = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n      const d = Math.hypot(px - m[0], py - m[1]);\n      if (d <= HIT_MID * k && (!best || d < best.d)) best = { type: \"mid\", id: g2.id, d };\n    }\n    if (best) return best;\n    for (const g2 of segments(o)) {\n      const r = distSeg(px, py, toPx(f, g2.start[0], g2.start[1]), toPx(f, g2.end[0], g2.end[1]));\n      if (r.d <= HIT_WALL * k && (!best || r.d < best.d)) best = { type: \"wall\", id: g2.id, d: r.d, t: r.t };\n    }\n    return best;\n  }\n  function planLabels(o, f) {\n    const walls = segments(o).map((g2) => {\n      const mid = g2.pt(g2.len / 2, 0), p = toPx(f, mid[0], mid[1]), off = 18;\n      return { id: g2.id, len: g2.len, angle: g2.angle, x: p[0] + g2.inward[0] * off, y: p[1] + g2.inward[1] * off, along: [g2.dir[0], g2.dir[1]] };\n    });\n    const corners = o.walls.map((p, i) => {\n      const q = toPx(f, p.x, p.z), n = o.walls.length, a = o.walls[(i - 1 + n) % n], b = o.walls[(i + 1) % n];\n      const u = [a.x - p.x, a.z - p.z], v = [b.x - p.x, b.z - p.z], lu = Math.hypot(u[0], u[1]) || 1, lv = Math.hypot(v[0], v[1]) || 1;\n      let bx2 = u[0] / lu + v[0] / lv, by = u[1] / lu + v[1] / lv;\n      const lb = Math.hypot(bx2, by);\n      const ang = cornerAngle(o, i);\n      if (lb < 1e-6) {\n        bx2 = -v[1] / lv;\n        by = v[0] / lv;\n      } else {\n        bx2 /= lb;\n        by /= lb;\n      }\n      if (ang > 180) {\n        bx2 = -bx2;\n        by = -by;\n      }\n      return { id: p.id, angle: ang, x: q[0] + bx2 * 34, y: q[1] + by * 34, px: q[0], py: q[1] };\n    });\n    return { walls, corners };\n  }\n  function createPlanGesture(session) {\n    let g2 = null;\n    const api = {\n      square: true,\n      active: () => g2,\n      /* draw tool state lives here too: the corners tapped so far, in mm */\n      drawing: null,\n      /* target: \"room\" (the outer boundary - Close shape replaces it), \"wall\" (walls inside: Finish wall keeps an open chain, Close\n         shape an enclosure) or \"solid\" (a solid block - Close shape). An inside item never replaces the room. */\n      startDraw(target) {\n        api.drawing = { pts: [], target: target || \"room\" };\n        g2 = null;\n      },\n      /* a point drawn inside: put onto a wall of the room or of another inside wall when within reach (the editor sets it) */\n      snapTo: null,\n      stopDraw() {\n        api.drawing = null;\n      },\n      down(f, px, py, opts) {\n        opts = opts || {};\n        const o = session.draft();\n        if (api.drawing) return api.drawTap(f, px, py, opts);\n        const h = hitPlan(o, f, px, py, opts.scale);\n        if (!h) {\n          g2 = null;\n          return null;\n        }\n        const [mx, mz] = toMm(f, px, py);\n        const type = h.type === \"mid\" && api.square ? \"wall\" : h.type;\n        g2 = { type, id: h.id, f, base: o, from: [mx, mz], preview: null, why: null, moved: false };\n        return h;\n      },\n      move(px, py, opts) {\n        if (!g2) return null;\n        opts = opts || {};\n        const [mx, mz] = toMm(g2.f, px, py), free = !!opts.free;\n        if (!g2.moved && Math.hypot(mx - g2.from[0], mz - g2.from[1]) * g2.f.s < 3) return { preview: null };\n        g2.moved = true;\n        let r;\n        if (g2.type === \"corner\") {\n          if (api.square) {\n            const p = free ? { x: Math.round(mx), z: Math.round(mz) } : snapPoint(mx, mz);\n            g2.to = [p.x, p.z];\n            g2.snapped = \"square\";\n            g2.ortho = true;\n            r = orthoMoveCorner(g2.base, g2.id, p.x, p.z);\n          } else {\n            const p = free ? { x: Math.round(mx), z: Math.round(mz) } : snapCorner(g2.base, g2.id, mx, mz);\n            g2.to = [p.x, p.z];\n            g2.snapped = p.snapped || null;\n            g2.ortho = false;\n            r = moveCorner(g2.base, g2.id, p.x, p.z);\n          }\n        } else if (g2.type === \"wall\") {\n          const fr = segments(g2.base).find((s) => s.id === g2.id);\n          let by = -((mx - g2.from[0]) * fr.inward[0] + (mz - g2.from[1]) * fr.inward[1]);\n          by = free ? Math.round(by) : Math.round(by / SNAP_MM2) * SNAP_MM2;\n          g2.by = by;\n          r = by ? pushWall(g2.base, g2.id, by) : { ok: true, outline: g2.base };\n        } else {\n          const p = free ? { x: Math.round(mx), z: Math.round(mz) } : snapPoint(mx, mz);\n          g2.to = [p.x, p.z];\n          r = bendWall(g2.base, g2.id, p.x, p.z);\n        }\n        g2.preview = r.ok ? r.outline : null;\n        g2.why = r.ok ? null : r.why;\n        return { preview: g2.preview, why: g2.why };\n      },\n      /* the gesture ends: ONE editor step, or nothing (a refused edit, or no movement) */\n      up(opts) {\n        const done2 = g2;\n        g2 = null;\n        if (!done2 || !done2.moved) return { ok: false, none: true, hit: done2 ? { type: done2.type, id: done2.id } : null };\n        if (!done2.preview) return { ok: false, why: done2.why };\n        const free = !!(opts && opts.free);\n        if (done2.type === \"corner\") return done2.ortho ? session.orthoMove(done2.id, done2.to[0], done2.to[1]) : session.moveCorner(done2.id, done2.to[0], done2.to[1], false);\n        if (done2.type === \"wall\") return done2.by ? session.pushWall(done2.id, done2.by) : { ok: false, none: true };\n        return session.bend(done2.id, done2.to[0], done2.to[1], free ? false : void 0);\n      },\n      cancel() {\n        g2 = null;\n      },\n      /* DRAW: a tap adds a corner; a tap on the first one closes the shape (>= 3 corners) */\n      drawTap(f, px, py, opts) {\n        const d = api.drawing, [mx, mz] = toMm(f, px, py);\n        if (d.pts.length >= 3) {\n          const q = toPx(f, d.pts[0].x, d.pts[0].z);\n          if (Math.hypot(px - q[0], py - q[1]) <= HIT_CORNER * (opts && opts.scale || 1)) return api.closeDraw();\n        }\n        let p = opts && opts.free ? { x: Math.round(mx), z: Math.round(mz) } : snapPoint(mx, mz);\n        const last = d.pts[d.pts.length - 1], first = d.pts[0];\n        if (last && api.square) {\n          p = squareFrom(last, p.x, p.z);\n          if (d.pts.length >= 2) {\n            if (p.z === last.z && Math.abs(p.x - first.x) <= SNAP_ALIGN) p.x = first.x;\n            if (p.x === last.x && Math.abs(p.z - first.z) <= SNAP_ALIGN) p.z = first.z;\n          }\n        } else if (last && !(opts && opts.free)) {\n          if (Math.abs(p.x - last.x) <= SNAP_ALIGN) p.x = last.x;\n          if (Math.abs(p.z - last.z) <= SNAP_ALIGN) p.z = last.z;\n          if (d.pts.length >= 2 && Math.abs(p.x - first.x) <= SNAP_ALIGN) p.x = first.x;\n          if (d.pts.length >= 2 && Math.abs(p.z - first.z) <= SNAP_ALIGN) p.z = first.z;\n        }\n        if (d.target !== \"room\" && api.snapTo) p = api.snapTo(p, last) || p;\n        if (last && p.x === last.x && p.z === last.z) return { type: \"draw\", same: true };\n        d.pts.push(p);\n        return { type: \"draw\", n: d.pts.length };\n      },\n      undoDraw() {\n        if (api.drawing && api.drawing.pts.length) {\n          api.drawing.pts.pop();\n          return true;\n        }\n        return false;\n      },\n      /* FINISH WALL (inside walls only): the corners so far kept as an OPEN wall - the drawing is let go, ready for the next item */\n      finishDraw() {\n        const d = api.drawing;\n        if (!d || d.target !== \"wall\") return { type: \"draw\", ok: false, why: \"Finish wall is for walls inside the room - a room outline closes with Close shape\" };\n        if (d.pts.length < 2) return { type: \"draw\", ok: false, why: \"Draw at least two points - the wall's start and end\" };\n        const r = session.addPart(\"wall\", d.pts);\n        if (r.ok) d.pts = [];\n        return Object.assign({ type: \"draw\", finished: !!r.ok }, r);\n      },\n      closeDraw() {\n        const d = api.drawing;\n        if (!d || d.pts.length < 3) return { type: \"draw\", ok: false, why: d && d.target === \"wall\" ? \"Close shape needs three corners - for a single wall use Finish wall\" : \"Draw at least three corners, then tap the first one\" + (d && d.target === \"room\" ? \" (a wall inside the room: use Inside wall)\" : \"\") };\n        if (d.target !== \"room\") {\n          let pts2 = d.pts;\n          if (api.square) {\n            const a = pts2[pts2.length - 1], b = pts2[0];\n            if (a.x !== b.x && a.z !== b.z) {\n              const prev = pts2[pts2.length - 2];\n              pts2 = pts2.concat([prev && prev.x === a.x ? { x: a.x, z: b.z } : { x: b.x, z: a.z }]);\n            }\n          }\n          const r2 = session.addPart(d.target === \"solid\" ? \"solid\" : \"enclosure\", pts2);\n          if (r2.ok) d.pts = [];\n          return Object.assign({ type: \"draw\", closed: !!r2.ok, inside: true }, r2);\n        }\n        let pts = d.pts;\n        if (api.square) {\n          const a = pts[pts.length - 1], b = pts[0];\n          if (a.x !== b.x && a.z !== b.z) {\n            const c1 = { x: b.x, z: a.z }, c2 = { x: a.x, z: b.z };\n            const prev = pts[pts.length - 2];\n            const c = prev && prev.x === a.x ? c2 : c1;\n            pts = pts.concat([c]);\n          }\n        }\n        const r = session.drawn(pts);\n        if (r.ok) api.drawing = null;\n        return Object.assign({ type: \"draw\", closed: !!r.ok }, r);\n      }\n    };\n    return api;\n  }\n\n  // v2/src/model/pdf-images.js\n  var td = (b, a, z) => {\n    let s = \"\";\n    for (let i = a; i < z; i++) s += String.fromCharCode(b[i]);\n    return s;\n  };\n  function indexOf(b, str, from) {\n    const n = str.length, c0 = str.charCodeAt(0);\n    outer: for (let i = from || 0; i <= b.length - n; i++) {\n      if (b[i] !== c0) continue;\n      for (let k = 1; k < n; k++) if (b[i + k] !== str.charCodeAt(k)) continue outer;\n      return i;\n    }\n    return -1;\n  }\n  var num5 = (dict, key) => {\n    const m = new RegExp(\"/\" + key + \"\\\\s+(\\\\d+)\\\\b(?!\\\\s+\\\\d+\\\\s+R)\").exec(dict);\n    return m ? Number(m[1]) : null;\n  };\n  var name = (dict, key) => {\n    const m = new RegExp(\"/\" + key + \"\\\\s*/([A-Za-z0-9]+)\").exec(dict);\n    return m ? m[1] : null;\n  };\n  function pdfImages(bytes) {\n    const b = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n    if (td(b, 0, Math.min(b.length, 1024)).indexOf(\"%PDF-\") < 0) return { ok: false, why: \"That file is not a PDF\" };\n    if (indexOf(b, \"/Encrypt\") >= 0) return { ok: false, why: \"That PDF is protected (encrypted) - save the plan as a PNG or JPG and choose that\" };\n    const out = [];\n    let at = 0;\n    for (let guard = 0; guard < 2e4; guard++) {\n      const s = indexOf(b, \"stream\", at);\n      if (s < 0) break;\n      if (s >= 3 && td(b, s - 3, s) === \"end\") {\n        at = s + 6;\n        continue;\n      }\n      const d0 = td(b, Math.max(0, s - 2048), s);\n      const objAt = d0.lastIndexOf(\" obj\");\n      const dict = objAt >= 0 ? d0.slice(objAt) : d0.slice(Math.max(0, d0.lastIndexOf(\"<<\")));\n      let p = s + 6;\n      if (b[p] === 13) p++;\n      if (b[p] === 10) p++;\n      const len = num5(dict, \"Length\");\n      let e = len != null && p + len <= b.length && td(b, p + len, Math.min(b.length, p + len + 12)).indexOf(\"endstream\") >= 0 ? p + len : indexOf(b, \"endstream\", p);\n      if (e < 0) break;\n      at = e + 9;\n      if (!/\\/Subtype\\s*\\/Image/.test(dict)) continue;\n      let end = e;\n      if (len == null) {\n        while (end > p && (b[end - 1] === 10 || b[end - 1] === 13)) end--;\n      }\n      const filterArr = /\\/Filter\\s*\\[([^\\]]*)\\]/.exec(dict);\n      const filter = filterArr ? filterArr[1].trim().split(/\\s*\\//).filter(Boolean).join(\"+\") : name(dict, \"Filter\");\n      out.push({\n        w: num5(dict, \"Width\"),\n        h: num5(dict, \"Height\"),\n        filter: filter || \"none\",\n        bpc: num5(dict, \"BitsPerComponent\"),\n        cs: name(dict, \"ColorSpace\") || (/\\/ColorSpace\\s*\\[/.test(dict) ? \"array\" : null),\n        predictor: /\\/Predictor\\s+(\\d+)/.test(dict),\n        mask: /\\/ImageMask\\s+true/.test(dict),\n        bytes: b.subarray(p, end)\n      });\n    }\n    const imgs = out.filter((q) => q.w > 0 && q.h > 0 && !q.mask).sort((q, r) => r.w * r.h - q.w * q.h);\n    if (!imgs.length) return { ok: false, why: \"That PDF has no picture inside - its page is drawn in lines (a CAD drawing). Export the page as a PNG or JPG and choose that\" };\n    return { ok: true, images: imgs };\n  }\n  async function pdfPlanImage(bytes, inflate) {\n    const r = pdfImages(bytes);\n    if (!r.ok) return r;\n    for (const im of r.images) {\n      if (im.filter === \"DCTDecode\") return { ok: true, kind: \"jpeg\", w: im.w, h: im.h, bytes: im.bytes, of: r.images.length };\n      if (im.filter === \"FlateDecode\" && im.bpc === 8 && !im.predictor && (im.cs === \"DeviceRGB\" || im.cs === \"DeviceGray\") && inflate) {\n        let raw;\n        try {\n          raw = await inflate(im.bytes);\n        } catch {\n          continue;\n        }\n        const ch = im.cs === \"DeviceRGB\" ? 3 : 1;\n        if (!raw || raw.length < im.w * im.h * ch) continue;\n        const rgba = new Uint8ClampedArray(im.w * im.h * 4);\n        for (let i = 0, j = 0; i < im.w * im.h; i++, j += ch) {\n          rgba[i * 4] = raw[j];\n          rgba[i * 4 + 1] = raw[ch === 3 ? j + 1 : j];\n          rgba[i * 4 + 2] = raw[ch === 3 ? j + 2 : j];\n          rgba[i * 4 + 3] = 255;\n        }\n        return { ok: true, kind: \"raw\", w: im.w, h: im.h, rgba, of: r.images.length };\n      }\n    }\n    const f = r.images[0];\n    return { ok: false, why: \"That PDF's picture is stored in a way the planner cannot open (\" + f.filter + (f.bpc ? \", \" + f.bpc + \" bit\" : \"\") + \") - save the plan as a PNG or JPG and choose that\" };\n  }\n\n  // v2/src/model/room-trace.js\n  function otsu(gray) {\n    const hist = new Array(256).fill(0);\n    for (let i = 0; i < gray.length; i++) hist[gray[i]]++;\n    const total = gray.length;\n    let sum = 0;\n    for (let t = 0; t < 256; t++) sum += t * hist[t];\n    let sumB = 0, wB = 0, best = 0, thr = 128;\n    for (let t = 0; t < 256; t++) {\n      wB += hist[t];\n      if (!wB) continue;\n      const wF = total - wB;\n      if (!wF) break;\n      sumB += t * hist[t];\n      const mB = sumB / wB, mF = (sum - sumB) / wF, v = wB * wF * (mB - mF) * (mB - mF);\n      if (v > best) {\n        best = v;\n        thr = t;\n      }\n    }\n    return thr;\n  }\n  function roomRegion(gray, w, h, seed, opts) {\n    opts = opts || {};\n    const thr = opts.threshold != null ? opts.threshold : Math.min(200, Math.max(40, otsu(gray)));\n    const close = opts.close != null ? opts.close : Math.max(1, Math.round(Math.min(w, h) / 300));\n    const wall = new Uint8Array(w * h);\n    for (let i = 0; i < w * h; i++) if (gray[i] <= thr) wall[i] = 1;\n    const thick = new Uint8Array(w * h);\n    if (close > 0) {\n      const row = new Uint8Array(w * h);\n      for (let y = 0; y < h; y++) {\n        let run = -1;\n        for (let x = 0; x < w; x++) if (wall[y * w + x]) run = x;\n        else if (run >= 0 && x - run <= close) row[y * w + x] = 1;\n        run = -1;\n        for (let x = w - 1; x >= 0; x--) if (wall[y * w + x]) run = x;\n        else if (run >= 0 && run - x <= close) row[y * w + x] = 1;\n        for (let x = 0; x < w; x++) if (wall[y * w + x]) row[y * w + x] = 1;\n      }\n      for (let x = 0; x < w; x++) {\n        let run = -1;\n        for (let y = 0; y < h; y++) if (row[y * w + x]) run = y;\n        else if (run >= 0 && y - run <= close) thick[y * w + x] = 1;\n        run = -1;\n        for (let y = h - 1; y >= 0; y--) if (row[y * w + x]) run = y;\n        else if (run >= 0 && run - y <= close) thick[y * w + x] = 1;\n        for (let y = 0; y < h; y++) if (row[y * w + x]) thick[y * w + x] = 1;\n      }\n    } else thick.set(wall);\n    const sx = Math.round(seed[0]), sy = Math.round(seed[1]);\n    if (sx < 0 || sy < 0 || sx >= w || sy >= h) return { ok: false, why: \"Tap inside the room on the picture\" };\n    if (thick[sy * w + sx]) return { ok: false, why: \"That is on a wall line - tap in the middle of the room's floor on the picture\" };\n    const mask = new Uint8Array(w * h), stack = [sy * w + sx];\n    mask[sy * w + sx] = 1;\n    let area = 0, edge = false;\n    while (stack.length) {\n      const i = stack.pop();\n      area++;\n      const x = i % w, y = (i - x) / w;\n      if (x === 0 || y === 0 || x === w - 1 || y === h - 1) edge = true;\n      if (x > 0 && !mask[i - 1] && !thick[i - 1]) {\n        mask[i - 1] = 1;\n        stack.push(i - 1);\n      }\n      if (x < w - 1 && !mask[i + 1] && !thick[i + 1]) {\n        mask[i + 1] = 1;\n        stack.push(i + 1);\n      }\n      if (y > 0 && !mask[i - w] && !thick[i - w]) {\n        mask[i - w] = 1;\n        stack.push(i - w);\n      }\n      if (y < h - 1 && !mask[i + w] && !thick[i + w]) {\n        mask[i + w] = 1;\n        stack.push(i + w);\n      }\n    }\n    if (edge) return { ok: false, why: \"The room is not closed in the picture (its floor reaches the picture's edge - a doorway drawn as a gap, or a cropped plan). Trace it by hand, or draw the missing wall on the picture first\" };\n    if (area < (opts.minArea || Math.max(400, w * h * 2e-3))) return { ok: false, why: \"That area is too small to be a room - tap in the middle of the floor\" };\n    if (close > 0) {\n      const grown = mask.slice();\n      for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\n        const i = y * w + x;\n        if (mask[i] || wall[i]) continue;\n        for (let d = 1; d <= close; d++) {\n          if (x - d >= 0 && mask[i - d] || x + d < w && mask[i + d] || y - d >= 0 && mask[i - d * w] || y + d < h && mask[i + d * w]) {\n            grown[i] = 1;\n            break;\n          }\n        }\n      }\n      return { ok: true, mask: grown, area, threshold: thr };\n    }\n    return { ok: true, mask, area, threshold: thr };\n  }\n  function regionOutline(mask, w, h, opts) {\n    opts = opts || {};\n    const c = opts.cell || Math.max(1, Math.round(Math.min(w, h) / 160));\n    const gw = Math.ceil(w / c) + 2, gh = Math.ceil(h / c) + 2;\n    const cell = new Uint8Array(gw * gh);\n    for (let gy = 1; gy < gh - 1; gy++) for (let gx = 1; gx < gw - 1; gx++) {\n      let n = 0, t = 0;\n      for (let y = (gy - 1) * c; y < Math.min(h, gy * c); y++) for (let x = (gx - 1) * c; x < Math.min(w, gx * c); x++) {\n        t++;\n        n += mask[y * w + x];\n      }\n      if (t && n * 2 >= t) cell[gy * gw + gx] = 1;\n    }\n    const out = new Uint8Array(gw * gh), st = [0];\n    out[0] = 1;\n    while (st.length) {\n      const i = st.pop(), x = i % gw, y = (i - x) / gw;\n      for (const j of [x > 0 ? i - 1 : -1, x < gw - 1 ? i + 1 : -1, y > 0 ? i - gw : -1, y < gh - 1 ? i + gw : -1])\n        if (j >= 0 && !out[j] && !cell[j]) {\n          out[j] = 1;\n          st.push(j);\n        }\n    }\n    const ins = (x, y) => x >= 0 && y >= 0 && x < gw && y < gh && !out[y * gw + x];\n    const next = /* @__PURE__ */ new Map();\n    const key = (x, y) => x + \",\" + y;\n    const add = (a, b) => {\n      const k = key(a[0], a[1]);\n      if (!next.has(k)) next.set(k, []);\n      next.get(k).push(b);\n    };\n    for (let y = 0; y < gh; y++) for (let x = 0; x < gw; x++) {\n      if (!ins(x, y)) continue;\n      if (!ins(x, y - 1)) add([x, y], [x + 1, y]);\n      if (!ins(x + 1, y)) add([x + 1, y], [x + 1, y + 1]);\n      if (!ins(x, y + 1)) add([x + 1, y + 1], [x, y + 1]);\n      if (!ins(x - 1, y)) add([x, y + 1], [x, y]);\n    }\n    if (!next.size) return { ok: false, why: \"No room outline found\" };\n    let start2 = null;\n    for (const k of next.keys()) {\n      const [x, y] = k.split(\",\").map(Number);\n      if (!start2 || y < start2[1] || y === start2[1] && x < start2[0]) start2 = [x, y];\n    }\n    const loop = [start2];\n    let cur = start2, prevDir = [1, 0];\n    for (let guard = 0; guard < gw * gh * 4; guard++) {\n      const opts2 = next.get(key(cur[0], cur[1])) || [];\n      if (!opts2.length) break;\n      let pick = opts2[0];\n      if (opts2.length > 1) {\n        const turn = (b) => {\n          const d = [b[0] - cur[0], b[1] - cur[1]];\n          return prevDir[0] * d[1] - prevDir[1] * d[0];\n        };\n        pick = opts2.slice().sort((a, b) => turn(b) - turn(a))[0];\n      }\n      opts2.splice(opts2.indexOf(pick), 1);\n      prevDir = [pick[0] - cur[0], pick[1] - cur[1]];\n      if (pick[0] === start2[0] && pick[1] === start2[1]) break;\n      loop.push(pick);\n      cur = pick;\n    }\n    let pts = loop.map(([x, y]) => [(x - 1) * c, (y - 1) * c]);\n    pts = simplify(pts, opts.tolerance != null ? opts.tolerance : Math.max(2, c * 1.5));\n    pts = squareUp(pts, opts.squareDeg != null ? opts.squareDeg : 8);\n    return { ok: pts.length >= 3, why: pts.length >= 3 ? null : \"No room outline found\", points: pts, cell: c };\n  }\n  function simplify(P2, tol) {\n    if (P2.length < 4) return P2;\n    let a = 0, b = 0, best = -1;\n    for (let i = 0; i < P2.length; i++) {\n      const d = (P2[i][0] - P2[0][0]) ** 2 + (P2[i][1] - P2[0][1]) ** 2;\n      if (d > best) {\n        best = d;\n        b = i;\n      }\n    }\n    const dp = (pts) => {\n      if (pts.length < 3) return pts;\n      const [p, q] = [pts[0], pts[pts.length - 1]], L = Math.hypot(q[0] - p[0], q[1] - p[1]) || 1;\n      let far = 0, fi = 0;\n      for (let i = 1; i < pts.length - 1; i++) {\n        const d = Math.abs((q[0] - p[0]) * (p[1] - pts[i][1]) - (p[0] - pts[i][0]) * (q[1] - p[1])) / L;\n        if (d > far) {\n          far = d;\n          fi = i;\n        }\n      }\n      if (far <= tol) return [p, q];\n      const l = dp(pts.slice(0, fi + 1)), r = dp(pts.slice(fi));\n      return l.slice(0, -1).concat(r);\n    };\n    const one = dp(P2.slice(a, b + 1)), two = dp(P2.slice(b).concat([P2[a]]));\n    const out = one.slice(0, -1).concat(two.slice(0, -1));\n    return out;\n  }\n  function squareUp(P2, deg) {\n    const t = Math.tan(deg * Math.PI / 180);\n    const Q = P2.map((p) => p.slice());\n    for (let pass = 0; pass < 2; pass++) {\n      for (let i = 0; i < Q.length; i++) {\n        const p = Q[i], q = Q[(i + 1) % Q.length], dx = q[0] - p[0], dy = q[1] - p[1];\n        if (Math.abs(dy) <= Math.abs(dx) * t) {\n          const m = (p[1] + q[1]) / 2;\n          p[1] = m;\n          q[1] = m;\n        } else if (Math.abs(dx) <= Math.abs(dy) * t) {\n          const m = (p[0] + q[0]) / 2;\n          p[0] = m;\n          q[0] = m;\n        }\n      }\n    }\n    const R4 = [];\n    for (let i = 0; i < Q.length; i++) {\n      const a = Q[(i - 1 + Q.length) % Q.length], b = Q[i], c = Q[(i + 1) % Q.length];\n      const cr = (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0]);\n      if (Math.abs(cr) > 1e-6 * (Math.hypot(b[0] - a[0], b[1] - a[1]) * Math.hypot(c[0] - b[0], c[1] - b[1]) + 1)) R4.push(b);\n    }\n    return R4;\n  }\n  function proposeOutline(gray, w, h, seed, under, opts) {\n    opts = opts || {};\n    if (!under || !under.calibrated) return { ok: false, why: \"Calibrate the picture first (two points a known distance apart) - an uncalibrated picture would only guess the sizes\" };\n    const reg = roomRegion(gray, w, h, seed, opts);\n    if (!reg.ok) return reg;\n    const ol = regionOutline(reg.mask, w, h, opts);\n    if (!ol.ok) return ol;\n    const k = (opts.scale || 1) * under.mmpp;\n    const points = ol.points.map(([x, y]) => ({ x: Math.round((under.ox + x * k) / 10) * 10, z: Math.round((under.oy + y * k) / 10) * 10 }));\n    return { ok: true, points, corners: points.length, threshold: reg.threshold, cell: ol.cell };\n  }\n\n  // v2/src/ui/room-layout-editor.js\n  var NS6 = \"http://www.w3.org/2000/svg\";\n  function createRoomLayoutEditor(ctx) {\n    let ed = {};\n    try {\n      ed = buildRoomLayoutEditor(ctx);\n    } catch (e) {\n      return { error: e };\n    }\n    return {\n      sync() {\n        try {\n          if (ed.sync) ed.sync();\n        } catch (e) {\n          ed.error = e;\n        }\n      },\n      open() {\n        return ed.open ? ed.open() : false;\n      },\n      close(apply) {\n        return ed.close ? ed.close(apply) : false;\n      },\n      session() {\n        return ed.session ? ed.session() : null;\n      },\n      gesture() {\n        return ed.gesture ? ed.gesture() : null;\n      },\n      isOpen() {\n        return ed.isOpen ? ed.isOpen() : false;\n      },\n      fit() {\n        return ed.fit ? ed.fit() : null;\n      },\n      underlay() {\n        return ed.underlay ? ed.underlay() : null;\n      },\n      _underlayPixels(gray, w, h) {\n        return ed._underlayPixels ? ed._underlayPixels(gray, w, h) : false;\n      },\n      _pdf(bytes, inflate) {\n        return ed._pdf ? ed._pdf(bytes, inflate) : null;\n      },\n      proposal() {\n        return ed.proposal ? ed.proposal() : null;\n      },\n      _underlay(href, w, h) {\n        return ed._underlay ? ed._underlay(href, w, h) : false;\n      },\n      error: () => ed.error || null\n    };\n  }\n  function buildRoomLayoutEditor(ctx) {\n    const root = ctx.root, doc2 = ctx.doc;\n    if (!root || !doc2 || !doc2.createElementNS) return {};\n    const el = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const sv = (tag, attrs) => {\n      const n = doc2.createElementNS(NS6, tag);\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, String(attrs[k]));\n      return n;\n    };\n    const box3 = el(\"div\", \"ub-lab__rlay\", { \"data-ub-rlay\": \"\", role: \"dialog\", \"aria-modal\": \"true\", \"aria-labelledby\": \"ub-rlay-title\", tabindex: \"-1\" });\n    box3.hidden = true;\n    const bar = el(\"div\", \"ub-lab__rlaybar\");\n    bar.appendChild(el(\"h2\", \"ub-lab__rlaytitle\", { id: \"ub-rlay-title\" }, \"Set room layout\"));\n    const tools = el(\"div\", \"ub-lab__rlaytools\", { role: \"group\", \"aria-label\": \"Shape tools\" });\n    const TOOLS3 = [\n      [\"select\", \"Select\", \"Drag a corner or a wall - walls stay square; click a length to type it\"],\n      [\"draw\", \"Draw room\", \"The room's own outline: tap corner after corner - every wall square to the one before; tap the first corner (or Enter) to close\"],\n      [\"wall\", \"Inside wall\", \"A wall INSIDE the room - tap its points, then Finish wall (an open wall, e.g. a partition with a doorway), or tap the first point / Close shape for an enclosure (a WC, a bathroom)\"],\n      [\"solid\", \"Solid block\", \"A solid block inside the room - a free-standing chimney breast, a column, a duct: tap its corners, then Close shape\"],\n      [\"rect\", \"Rectangle\", \"Make the room a rectangle of its present width and depth\"],\n      [\"L\", \"L-shape\", \"Cut the front-right corner away: an L-shaped room (or choose a wall and Add step)\"],\n      [\"underlay\", \"Underlay\", \"Put a photo, drawing or PDF of the room under the plan, scale it by a known distance and trace the walls over it\"],\n      [\"angles\", \"Angles\", \"Advanced: angled walls - corner angles shown and typed, corners dragged freely, a wall's middle dot bends it\"]\n    ];\n    const B = {};\n    for (const [id, label, tip] of TOOLS3) {\n      B[id] = el(\"button\", \"ub-lab__btn ub-lab__rlaytool\", { type: \"button\", \"data-ub-rlaytool\": id, title: tip, \"aria-pressed\": \"false\" }, label);\n      tools.appendChild(B[id]);\n    }\n    const file = el(\"input\", null, { type: \"file\", accept: \"image/*,application/pdf,.pdf\", \"data-ub-rlayfile\": \"\", \"aria-label\": \"Choose a photo, drawing or PDF of the room plan\" });\n    file.hidden = true;\n    bar.appendChild(file);\n    const hist = el(\"div\", \"ub-lab__rlayhist\", { role: \"group\", \"aria-label\": \"Layout history\" });\n    B.undo = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayundo\": \"\", title: \"Undo the last layout change (Ctrl+Z)\" }, \"Undo\");\n    B.redo = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayredo\": \"\", title: \"Redo (Ctrl+Y)\" }, \"Redo\");\n    hist.appendChild(B.undo);\n    hist.appendChild(B.redo);\n    bar.appendChild(hist);\n    const end = el(\"div\", \"ub-lab__rlayend\");\n    B.cancel = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaycancel\": \"\" }, \"Cancel\");\n    B.apply = el(\"button\", \"ub-lab__btn ub-lab__btn--primary ub-lab__rlayapply\", { type: \"button\", \"data-ub-rlayapply\": \"\" }, \"Apply\");\n    end.appendChild(B.cancel);\n    end.appendChild(B.apply);\n    bar.appendChild(end);\n    box3.appendChild(bar);\n    const main = el(\"div\", \"ub-lab__rlaymain\");\n    const stage = el(\"div\", \"ub-lab__rlaystage\", { \"data-ub-rlaystage\": \"\" });\n    const svg2 = sv(\"svg\", { class: \"ub-lab__rlaysvg\", \"data-ub-rlaysvg\": \"\", role: \"img\", \"aria-label\": \"Room plan seen from above, back wall at the top\" });\n    const layer2 = el(\"div\", \"ub-lab__rlaylabels\", { \"data-ub-rlaylabels\": \"\" });\n    stage.appendChild(svg2);\n    stage.appendChild(layer2);\n    main.appendChild(stage);\n    box3.appendChild(main);\n    const strip = el(\"div\", \"ub-lab__rlaystrip\", { \"data-ub-rlaystrip\": \"\" });\n    strip.appendChild(tools);\n    const side = el(\"div\", \"ub-lab__rlayside\", { \"data-ub-rlayside\": \"\", role: \"group\", \"aria-label\": \"The chosen wall or corner\" });\n    strip.appendChild(side);\n    box3.appendChild(strip);\n    const footBar = el(\"div\", \"ub-lab__rlayfoot\");\n    const msg = el(\"div\", \"ub-lab__rlaymsg\", { \"data-ub-rlaymsg\": \"\", role: \"status\", \"aria-live\": \"polite\" });\n    const status = el(\"div\", \"ub-lab__rlaystatus\", { \"data-ub-rlaystatus\": \"\", role: \"status\", \"aria-live\": \"polite\", \"aria-describedby\": \"ub-rlay-issues\" });\n    footBar.appendChild(msg);\n    footBar.appendChild(status);\n    box3.appendChild(footBar);\n    const issuesBox = el(\"ul\", \"ub-lab__rlayissues ub-lab__sr\", { \"data-ub-rlayissues\": \"\", id: \"ub-rlay-issues\", \"aria-label\": \"Why Apply is not possible yet\" });\n    box3.appendChild(issuesBox);\n    (root.querySelector(\".ub-lab__stage\") || root).appendChild(box3);\n    box3.__fit = () => st && st.fit ? Object.assign({}, st.fit) : null;\n    const st = {\n      open: false,\n      tool: \"select\",\n      sel: null,\n      fit: null,\n      preview: null,\n      why: null,\n      editing: null,\n      opener: null,\n      hover: null,\n      msg: \"\",\n      angles: false,\n      form: null,\n      /* angles: the advanced angled-wall mode; form: the open step / breast / recess form */\n      /* THE TRACING UNDERLAY (owner 12.10.2026: \u00ABupload calibrated tracing underlay\u00BB): an image under the plan, href + its size in\n         pixels, mm per pixel and where its top-left corner is (mm); calib: the two points tapped to scale it; moving: the image\n         follows a drag. View state of this editor only: never saved with the plan, never a step, never a measurement itself -\n         the walls are what is typed or dragged over it. */\n      under: null,\n      calib: null,\n      underMove: false,\n      underDrag: null\n    };\n    let session = null, gesture = null;\n    const scene = () => ctx.scene && ctx.scene() || {};\n    const room = () => scene().room || { on: true, width: roomSize().width, depth: roomSize().depth, height: roomSize().height };\n    const boxes = () => (scene().units || []).map((u) => {\n      const vs = unitVSpan(u);\n      return Object.assign({ id: u.id, label: displayName(scene().units, u), v0: vs[0], v1: vs[1] }, foot(u));\n    });\n    const stageSize = () => {\n      const r = stage.getBoundingClientRect ? stage.getBoundingClientRect() : null;\n      return { w: r && r.width || 900, h: r && r.height || 600 };\n    };\n    function refit(force) {\n      const s = stageSize(), key = JSON.stringify(outlineBounds(session.draft()));\n      if (!force && st.fit && st.fitKey === key) return;\n      st.fit = fitPlan(session.draft(), s.w, s.h);\n      st.fitKey = key;\n    }\n    function say(t) {\n      st.msg = t || \"\";\n      msg.textContent = st.msg;\n    }\n    function open() {\n      if (st.open) return true;\n      session = createLayoutSession(room(), roomSize());\n      gesture = createPlanGesture(session);\n      st.open = true;\n      st.tool = \"select\";\n      st.sel = null;\n      st.preview = null;\n      st.why = null;\n      st.editing = null;\n      st.form = null;\n      st.angles = !session.isOrtho();\n      gesture.square = !st.angles;\n      gesture.snapTo = snapInside;\n      st.partDrag = null;\n      st.partPreview = null;\n      st.opener = doc2.activeElement || null;\n      box3.hidden = false;\n      if (root.classList) root.classList.add(\"is-rlay\");\n      refit(true);\n      draw();\n      say(\"Drag a corner or a wall - walls stay square. Click a wall for Add step, Chimney breast or Recess. Nothing changes until Apply.\");\n      if (box3.focus) box3.focus();\n      return true;\n    }\n    function close(apply) {\n      if (!st.open) return false;\n      if (apply) {\n        const r = session.changed() ? ctx.act(\"room.layout.apply\", { outline: session.draft(), partitions: session.parts() }) || {} : { ok: true, unchanged: true };\n        if (!r.ok) {\n          const list = r.issues || [];\n          say(\"Not applied - \" + (list.length ? list.map((q) => q.why).join(\"; \") : \"see the message\") + \". Nothing changed.\");\n          drawIssues(list);\n          return false;\n        }\n      }\n      st.open = false;\n      box3.hidden = true;\n      session = null;\n      gesture = null;\n      if (root.classList) root.classList.remove(\"is-rlay\");\n      if (!apply && ctx.cue) ctx.cue(\"Room layout: cancelled - nothing changed.\");\n      const back = st.opener;\n      st.opener = null;\n      if (back && back.focus && back.isConnected !== false) back.focus();\n      return true;\n    }\n    function clear(n) {\n      while (n.firstChild) n.removeChild(n.firstChild);\n    }\n    function poly(o) {\n      return o.walls.map((p) => toPx(st.fit, p.x, p.z).map((v) => v.toFixed(1)).join(\",\")).join(\" \");\n    }\n    function line(a, b, cls, extra) {\n      return sv(\"line\", Object.assign({ x1: a[0].toFixed(1), y1: a[1].toFixed(1), x2: b[0].toFixed(1), y2: b[1].toFixed(1), class: cls }, extra || {}));\n    }\n    function drawIssues(list) {\n      clear(issuesBox);\n      for (const q of list) issuesBox.appendChild(el(\"li\", \"ub-lab__rlayissue\", { \"data-ub-rlayissue\": q.kind || \"\" }, q.why));\n      status.textContent = statusText(list);\n      status.title = list.map((q) => q.why).join(\"; \");\n      status.classList.toggle(\"is-bad\", !!list.length);\n    }\n    function statusText(list) {\n      if (!list.length) return session && session.changed() ? \"Ready - Apply puts this layout in your plan (one Undo).\" : \"No change yet.\";\n      const cab = new Set(list.filter((q) => q.kind === \"cabinet\").map((q) => q.id)).size, oth = list.filter((q) => ![\"cabinet\", \"outline\", \"stage\", \"partition\"].includes(q.kind)).length;\n      const shape2 = list.find((q) => q.kind === \"outline\" || q.kind === \"stage\" || q.kind === \"partition\");\n      const parts = [];\n      if (cab) parts.push(cab + \" cabinet\" + (cab > 1 ? \"s\" : \"\") + \" in the way (red on the plan)\");\n      if (oth) parts.push(oth + \" window / door / boiler\" + (oth > 1 ? \"s\" : \"\") + \" without a wall (red)\");\n      if (shape2) parts.push(shape2.why);\n      return \"Can't apply: \" + parts.join(\" \\xB7 \") + \".\";\n    }\n    function draw() {\n      if (!st.open) return;\n      const f = st.fit, o = st.preview || session.draft();\n      clear(svg2);\n      clear(layer2);\n      const s = stageSize();\n      svg2.setAttribute(\"viewBox\", \"0 0 \" + s.w + \" \" + s.h);\n      svg2.setAttribute(\"width\", s.w);\n      svg2.setAttribute(\"height\", s.h);\n      const grid = sv(\"g\", { class: \"ub-lab__rlaygrid\" });\n      const [gx0, gz0] = toMm(f, 0, 0), [gx1, gz1] = toMm(f, s.w, s.h);\n      for (let x = Math.ceil(gx0 / 500) * 500; x <= gx1; x += 500) grid.appendChild(line(toPx(f, x, gz0), toPx(f, x, gz1), \"ub-lab__rlaygl\"));\n      for (let z = Math.ceil(gz0 / 500) * 500; z <= gz1; z += 500) grid.appendChild(line(toPx(f, gx0, z), toPx(f, gx1, z), \"ub-lab__rlaygl\"));\n      svg2.appendChild(grid);\n      if (st.under) {\n        const U = st.under, a = toPx(f, U.ox, U.oy);\n        svg2.appendChild(sv(\"image\", {\n          href: U.href,\n          x: a[0].toFixed(1),\n          y: a[1].toFixed(1),\n          width: (U.w * U.mmpp * f.s).toFixed(1),\n          height: (U.h * U.mmpp * f.s).toFixed(1),\n          opacity: U.opacity,\n          preserveAspectRatio: \"none\",\n          class: \"ub-lab__rlayunder\",\n          \"data-ub-rlayunder\": \"\"\n        }));\n      }\n      if (st.calib) for (const p of st.calib) {\n        const q = toPx(f, p[0], p[1]);\n        svg2.appendChild(sv(\"circle\", { cx: q[0].toFixed(1), cy: q[1].toFixed(1), r: 6, class: \"ub-lab__rlaycalpt\", \"data-ub-rlaycalpt\": \"\" }));\n      }\n      if (st.calib && st.calib.length === 2) svg2.appendChild(line(toPx(f, st.calib[0][0], st.calib[0][1]), toPx(f, st.calib[1][0], st.calib[1][1]), \"ub-lab__rlaycalline\"));\n      if (st.preview) svg2.appendChild(sv(\"polygon\", { points: poly(session.draft()), class: \"ub-lab__rlayghost\" }));\n      if (st.form) {\n        const fg = segmentFrame(session.draft(), st.form.wall);\n        const fr0 = fg ? formResult(fg) : null;\n        st.formPreview = fr0 && fr0.ok ? fr0.outline : null;\n      }\n      if (!st.preview && st.form && st.formPreview) svg2.appendChild(sv(\"polygon\", { points: poly(st.formPreview), class: \"ub-lab__rlayformghost\", \"data-ub-rlayformghost\": \"\" }));\n      svg2.appendChild(sv(\"polygon\", { points: poly(o), class: \"ub-lab__rlayfloor\" + (st.why ? \" is-bad\" : \"\") + (st.under ? \" is-under\" : \"\"), \"data-ub-rlayfloor\": \"\" }));\n      for (const b of boxes()) {\n        const a = toPx(f, b.x0, b.z0), c = toPx(f, b.x1, b.z1);\n        svg2.appendChild(sv(\"rect\", { x: a[0].toFixed(1), y: a[1].toFixed(1), width: (c[0] - a[0]).toFixed(1), height: (c[1] - a[1]).toFixed(1), class: \"ub-lab__rlaycab\", \"data-ub-rlaycab\": b.id }));\n      }\n      const issues = session.issues(boxes(), openingsOf(room()), roomObjectsOf(room()));\n      const badCab = new Set(issues.filter((q) => q.kind === \"cabinet\").map((q) => q.id));\n      const badPart = new Set(issues.filter((q) => q.kind === \"partition\" && q.id).map((q) => q.id));\n      for (const r of svg2.querySelectorAll(\"[data-ub-rlaycab]\")) if (badCab.has(r.getAttribute(\"data-ub-rlaycab\"))) r.setAttribute(\"class\", \"ub-lab__rlaycab is-bad\");\n      for (const g2 of segments(o)) {\n        const a = toPx(f, g2.start[0], g2.start[1]), b = toPx(f, g2.end[0], g2.end[1]);\n        svg2.appendChild(line(a, b, \"ub-lab__rlaywall\" + (st.sel && st.sel.type === \"wall\" && st.sel.id === g2.id ? \" is-sel\" : \"\"), { \"data-ub-rlaywall\": g2.id }));\n      }\n      const atts = [].concat(session.carried(openingsOf(room())), session.carried(roomObjectsOf(room())));\n      for (const q of atts) {\n        const fr = segmentFrame(o, q.wall);\n        if (!fr) continue;\n        const p0 = fr.pt(Math.max(0, q.x), 0), p1 = fr.pt(Math.min(fr.len, q.x + q.w), 0);\n        if (q.kind === \"boiler\") {\n          const p2 = fr.pt(Math.min(fr.len, q.x + q.w), q.d), p3 = fr.pt(Math.max(0, q.x), q.d);\n          svg2.appendChild(sv(\"polygon\", { points: [p0, p1, p2, p3].map((p) => toPx(f, p[0], p[1]).map((v) => v.toFixed(1)).join(\",\")).join(\" \"), class: \"ub-lab__rlayboiler\", \"data-ub-rlayatt\": q.id }));\n        } else svg2.appendChild(line(toPx(f, p0[0], p0[1]), toPx(f, p1[0], p1[1]), \"ub-lab__rlay\" + q.kind, { \"data-ub-rlayatt\": q.id }));\n      }\n      const badAtt = new Set(issues.filter((q) => q.kind !== \"cabinet\" && q.id).map((q) => q.id));\n      for (const n of svg2.querySelectorAll(\"[data-ub-rlayatt]\")) if (badAtt.has(n.getAttribute(\"data-ub-rlayatt\"))) n.setAttribute(\"class\", n.getAttribute(\"class\") + \" is-bad\");\n      if (st.sel && st.sel.type === \"wall\") {\n        const g2 = segmentFrame(o, st.sel.id);\n        if (g2) {\n          const q = toPx(f, g2.start[0], g2.start[1]), qi = toPx(f, g2.pt(0, 0)[0] + g2.inward[0] * 120 + g2.dir[0] * 120, g2.pt(0, 0)[1] + g2.inward[1] * 120 + g2.dir[1] * 120);\n          svg2.appendChild(sv(\"circle\", { cx: q[0].toFixed(1), cy: q[1].toFixed(1), r: 10, class: \"ub-lab__rlaystart\", \"data-ub-rlaystart\": g2.id }));\n          const tx = sv(\"text\", { x: qi[0].toFixed(1), y: qi[1].toFixed(1), class: \"ub-lab__rlaystarttxt\" });\n          tx.textContent = \"left end\";\n          svg2.appendChild(tx);\n        }\n      }\n      const parts = st.partPreview || session.parts();\n      for (const p of parts) if (p.kind === \"enclosure\") svg2.appendChild(sv(\"polygon\", { points: p.pts.map((q) => toPx(f, q.x, q.z).map((v) => v.toFixed(1)).join(\",\")).join(\" \"), class: \"ub-lab__rlayencl\", \"data-ub-rlayencl\": p.id }));\n      const selP = st.sel && st.sel.type === \"part\" ? st.sel.id : null;\n      for (const pc of solidPieces(parts, session.ceiling())) if (pc.kind !== \"over\") svg2.appendChild(sv(\"polygon\", {\n        points: pc.poly.map((q) => toPx(f, q.x, q.z).map((v) => v.toFixed(1)).join(\",\")).join(\" \"),\n        class: (pc.kind === \"solid\" ? \"ub-lab__rlaysolid\" : \"ub-lab__rlaypart\") + (pc.id === selP ? \" is-sel\" : \"\") + (badPart.has(pc.id) ? \" is-bad\" : \"\"),\n        \"data-ub-rlaypart\": pc.id\n      }));\n      for (const p of parts) for (const d of p.doors || []) {\n        const sg = partSegments(p).find((q) => q.seg === d.seg);\n        if (!sg) continue;\n        const a = toPx(f, sg.a.x + sg.dir[0] * d.at, sg.a.z + sg.dir[1] * d.at), b = toPx(f, sg.a.x + sg.dir[0] * (d.at + d.w), sg.a.z + sg.dir[1] * (d.at + d.w));\n        svg2.appendChild(line(a, b, \"ub-lab__rlaypartdoor\", { \"data-ub-rlaypartdoor\": p.id + \":\" + d.id, \"aria-label\": \"Opening \" + d.w + \" \\xD7 \" + d.h + \" mm - no door leaf\" }));\n        if (st.sel && st.sel.type === \"part\" && st.sel.id === p.id) {\n          const m = toPx(f, sg.a.x + sg.dir[0] * (d.at + d.w / 2) - sg.nrm[0] * 260, sg.a.z + sg.dir[1] * (d.at + d.w / 2) - sg.nrm[1] * 260);\n          layer2.appendChild(chip(\"ub-lab__rlaylen ub-lab__rlaygapchip\", { \"data-ub-rlaygap\": p.id + \":\" + d.id, tabindex: \"-1\" }, \"opening \" + d.w + \"\\xD7\" + d.h, m[0], m[1]));\n        }\n      }\n      if (selP) {\n        const p = parts.find((q) => q.id === selP);\n        if (p) {\n          p.pts.forEach((q, i) => {\n            const c = toPx(f, q.x, q.z);\n            svg2.appendChild(sv(\"circle\", { cx: c[0].toFixed(1), cy: c[1].toFixed(1), r: 6, class: \"ub-lab__rlaycorner is-sel\", \"data-ub-rlaypartpt\": p.id + \":\" + i }));\n          });\n          for (const sg of partSegments(p)) {\n            const m = toPx(f, (sg.a.x + sg.b.x) / 2 + sg.nrm[0] * 220, (sg.a.z + sg.b.z) / 2 + sg.nrm[1] * 220);\n            layer2.appendChild(chip(\"ub-lab__rlaylen ub-lab__rlaypartlen\", { \"data-ub-rlaypartlen\": p.id + \":\" + sg.seg, tabindex: \"-1\", \"aria-label\": \"Inside wall \" + sg.len + \" mm\" }, sg.len + \"\", m[0], m[1]));\n          }\n        }\n      }\n      if (!gesture.drawing) {\n        for (const g2 of segments(o)) {\n          const m = toPx(f, (g2.start[0] + g2.end[0]) / 2, (g2.start[1] + g2.end[1]) / 2);\n          svg2.appendChild(sv(\"circle\", { cx: m[0].toFixed(1), cy: m[1].toFixed(1), r: 4.5, class: \"ub-lab__rlaymid\", \"data-ub-rlaymid\": g2.id }));\n        }\n        for (const p of o.walls) {\n          const q = toPx(f, p.x, p.z);\n          svg2.appendChild(sv(\"circle\", { cx: q[0].toFixed(1), cy: q[1].toFixed(1), r: 7, class: \"ub-lab__rlaycorner\" + (st.sel && st.sel.type === \"corner\" && st.sel.id === p.id ? \" is-sel\" : \"\"), \"data-ub-rlaycorner\": p.id }));\n        }\n      }\n      if (gesture.drawing) {\n        const pts = gesture.drawing.pts.map((p) => toPx(f, p.x, p.z));\n        if (pts.length) svg2.appendChild(sv(\"polyline\", { points: pts.concat(st.hover ? [st.hover] : []).map((p) => p.map((v) => v.toFixed(1)).join(\",\")).join(\" \"), class: \"ub-lab__rlaydraw\" }));\n        pts.forEach((p, k) => svg2.appendChild(sv(\"circle\", { cx: p[0].toFixed(1), cy: p[1].toFixed(1), r: k === 0 ? 8 : 5, class: \"ub-lab__rlaydrawpt\" + (k === 0 ? \" is-first\" : \"\") })));\n      }\n      const L = planLabels(o, f);\n      if (!gesture.drawing) {\n        for (const w of L.walls) {\n          const ed = st.editing && st.editing.k === \"len\" && st.editing.id === w.id;\n          layer2.appendChild(ed ? editor(\"len\", w.id, w.len, w.x, w.y, \"Length of \" + wallNameOf({ outline: o }, w.id).toLowerCase() + \", mm\") : chip(\"ub-lab__rlaylen\", { \"data-ub-rlaylen\": w.id, \"aria-label\": wallNameOf({ outline: o }, w.id) + \": \" + w.len + \" mm - type a length\" }, w.len + \"\", w.x, w.y));\n        }\n        for (const c of L.corners) {\n          if (!st.angles && (Math.abs(c.angle - 90) < 0.05 || Math.abs(c.angle - 270) < 0.05)) continue;\n          const ed = st.editing && st.editing.k === \"ang\" && st.editing.id === c.id;\n          layer2.appendChild(ed ? editor(\"ang\", c.id, c.angle, c.x, c.y, \"Inside angle at this corner, degrees\") : chip(\"ub-lab__rlayang\", { \"data-ub-rlayang\": c.id, \"aria-label\": \"Corner: \" + c.angle + \" degrees - type an angle\" }, c.angle + \"\\xB0\", c.x, c.y));\n        }\n      }\n      drawIssues(issues);\n      B.apply.disabled = !!issues.length;\n      B.apply.title = issues.length ? \"Not yet - \" + issues.map((q) => q.why).join(\"; \") : session.changed() ? \"Apply this layout to the plan (one Undo)\" : \"No change - close\";\n      B.undo.disabled = !session.canUndo();\n      B.redo.disabled = !session.canRedo();\n      for (const [id] of TOOLS3) {\n        const dt = gesture.drawing && gesture.drawing.target;\n        const on = id === \"draw\" && dt === \"room\" || id === \"wall\" && dt === \"wall\" || id === \"solid\" && dt === \"solid\" || id === \"select\" && !gesture.drawing && st.tool === \"select\" || id === \"underlay\" && st.tool === \"underlay\" || id === \"angles\" && st.angles;\n        B[id].setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        B[id].classList.toggle(\"is-active\", on);\n      }\n      drawSide();\n      if (strip.classList) strip.classList.toggle(\"is-drawing\", !!gesture.drawing);\n      if (gesture.drawing) strip.scrollLeft = 0;\n      const chosenKey = !gesture.drawing && st.sel && st.sel.type === \"wall\" ? st.sel.id + \"|\" + (st.form && st.form.wall === st.sel.id ? st.form.kind : \"\") : \"\";\n      if (strip.classList) strip.classList.toggle(\"is-chosen\", !!chosenKey);\n      if (chosenKey && chosenKey !== st.chosenKey) strip.scrollLeft = 0;\n      st.chosenKey = chosenKey;\n    }\n    function chip(cls, attrs, text, x, y) {\n      const b = el(\"button\", \"ub-lab__rlaychip \" + cls, Object.assign({ type: \"button\" }, attrs), text);\n      b.setAttribute(\"style\", \"left:\" + Math.round(x) + \"px;top:\" + Math.round(y) + \"px\");\n      return b;\n    }\n    function editor(k, id, value, x, y, label) {\n      const inp = el(\"input\", \"ub-lab__rlayin\", {\n        type: \"number\",\n        inputmode: \"decimal\",\n        \"data-ub-rlayin\": k,\n        \"data-ub-rlayid\": id,\n        \"aria-label\": label,\n        step: k === \"len\" ? \"10\" : \"1\",\n        min: k === \"len\" ? String(WALL_MIN) : String(ANGLE_MIN),\n        max: k === \"len\" ? \"8000\" : String(360 - ANGLE_MIN)\n      });\n      inp.value = String(value);\n      inp.setAttribute(\"style\", \"left:\" + Math.round(x) + \"px;top:\" + Math.round(y) + \"px\");\n      return inp;\n    }\n    const note = (text, attrs) => {\n      const n = el(\"span\", \"ub-lab__rlaynote\", Object.assign({ title: text }, attrs || {}), text);\n      return n;\n    };\n    function drawSide() {\n      clear(side);\n      const o = session.draft();\n      if (gesture.drawing) {\n        const D2 = gesture.drawing, n = D2.pts.length, what = { room: \"Room outline\", wall: \"Inside wall\", solid: \"Solid block\" }[D2.target];\n        if (D2.target === \"wall\") {\n          const fw = el(\"button\", \"ub-lab__btn ub-lab__rlayadd\", { type: \"button\", \"data-ub-rlayfinish\": \"\", title: \"Keep the points drawn as one open wall and start the next item\" }, \"Finish wall\");\n          fw.disabled = n < 2;\n          side.appendChild(fw);\n        }\n        const c = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaydrawclose\": \"\" }, \"Close shape\");\n        c.disabled = n < 3;\n        side.appendChild(c);\n        side.appendChild(el(\"strong\", \"ub-lab__rlayh\", null, what));\n        side.appendChild(note(n + \" point\" + (n === 1 ? \"\" : \"s\") + (gesture.square ? \" - each square to the one before\" : \"\") + (D2.target === \"wall\" ? \". Finish wall keeps it open; Close shape (or the first point) makes an enclosure.\" : \". Tap the first point or Close shape.\") + \" Backspace takes one back; Escape stops.\"));\n        return;\n      }\n      if (st.sel && st.sel.type === \"part\") return drawPartSide();\n      if (st.tool === \"underlay\") return drawUnderSide();\n      if (!st.sel) {\n        side.appendChild(note(o.walls.length + \" walls. Click a wall to step it, add a chimney breast or a recess; drag corners and walls - they stay square.\"));\n        angledNote(o);\n        return;\n      }\n      if (st.sel.type === \"wall\") {\n        const g2 = segmentFrame(o, st.sel.id);\n        if (!g2) {\n          st.sel = null;\n          st.form = null;\n          return drawSide();\n        }\n        side.appendChild(el(\"strong\", \"ub-lab__rlayh\", null, wallNameOf({ outline: o }, g2.id)));\n        if (st.form && st.form.wall === g2.id) return drawForm(g2);\n        if (!g2.axis) side.appendChild(note(\"At an angle (\" + g2.angle + \"\\xB0): solid, but cabinets only stand against square walls for now.\", { \"data-ub-rlayangled\": g2.id }));\n        side.appendChild(num6(\"Length\", \"len\", g2.id, g2.len, \"mm\"));\n        side.appendChild(num6(\"Move wall out (+) / in (\\u2212)\", \"push\", g2.id, 0, \"mm\"));\n        for (const [k, label, tip] of [\n          [\"step\", \"Add step\", \"A square step in this wall - how an L is made: part of the wall moves in or out, the walls stay square\"],\n          [\"breast\", \"Chimney breast\", \"A chimney breast standing INTO the room - width, depth, centred or from the left end; the alcoves either side shown\"],\n          [\"recess\", \"Recess\", \"A recess going OUT of the room (an alcove, a bay) - width, depth, centred or from the left end\"]\n        ]) {\n          const b = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayform\": k, title: tip }, label);\n          b.disabled = !g2.axis;\n          side.appendChild(b);\n        }\n      } else {\n        const i = o.walls.findIndex((p2) => p2.id === st.sel.id);\n        if (i < 0) {\n          st.sel = null;\n          return drawSide();\n        }\n        const p = o.walls[i];\n        side.appendChild(el(\"strong\", \"ub-lab__rlayh\", null, \"Corner\"));\n        side.appendChild(num6(\"Across (x)\", \"cx\", p.id, p.x, \"mm\"));\n        side.appendChild(num6(\"Back to front (z)\", \"cz\", p.id, p.z, \"mm\"));\n        if (st.angles) side.appendChild(num6(\"Inside angle\", \"ang\", p.id, planLabels(o, st.fit).corners[i].angle, \"\\xB0\"));\n        const del = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaytool\": \"delcorner\", title: \"Take this corner away - in a square room the step or the breast / recess it belongs to goes and the walls stay square\" }, \"Remove corner\");\n        del.disabled = o.walls.length <= 3;\n        side.appendChild(del);\n      }\n    }\n    function formVals() {\n      const F = st.form || {}, key = { ffrom: \"from\", fwidth: \"width\", fdepth: \"depth\", fat: \"at\" };\n      const v = (k) => {\n        const i = side.querySelector('[data-ub-rlayf=\"' + k + '\"]');\n        return i ? Number(String(i.value).replace(\",\", \".\")) : Number(F[key[k]]);\n      };\n      return { from: v(\"ffrom\"), width: v(\"fwidth\"), depth: v(\"fdepth\"), at: v(\"fat\") };\n    }\n    function formResult(g2) {\n      const F = st.form, v = formVals();\n      if (F.kind === \"step\") return stepWall(session.draft(), g2.id, v.at, v.depth, F.dir, F.side);\n      return wallFeature(session.draft(), g2.id, { kind: F.kind, width: v.width, depth: v.depth, centred: F.centred, from: v.from });\n    }\n    function drawForm(g2) {\n      const F = st.form;\n      const pick = (opt2, val, label, tip) => {\n        const b = el(\"button\", \"ub-lab__btn ub-lab__rlayopt\", { type: \"button\", \"data-ub-rlayopt\": opt2 + \":\" + val, \"aria-pressed\": F[opt2] === val ? \"true\" : \"false\", title: tip || label }, label);\n        return b;\n      };\n      const head = { step: \"Add step\", breast: \"Chimney breast (into the room)\", recess: \"Recess (out of the room)\" }[F.kind];\n      side.appendChild(el(\"span\", \"ub-lab__rlayformh\", null, head));\n      if (F.kind === \"step\") {\n        side.appendChild(num6(\"At\", \"fat\", g2.id, F.at, \"mm from left end\"));\n        side.appendChild(num6(\"Depth\", \"fdepth\", g2.id, F.depth, \"mm\"));\n        side.appendChild(pick(\"dir\", \"in\", \"Into the room\"));\n        side.appendChild(pick(\"dir\", \"out\", \"Out of the room\"));\n        side.appendChild(pick(\"side\", \"end\", \"Right part moves\", \"The part of the wall right of the step (towards its right end) moves\"));\n        side.appendChild(pick(\"side\", \"start\", \"Left part moves\", \"The part of the wall left of the step (towards its left end) moves\"));\n      } else {\n        side.appendChild(pick(\"centred\", true, \"Centred\"));\n        side.appendChild(pick(\"centred\", false, \"From left end\"));\n        const fr = num6(\"From left end\", \"ffrom\", g2.id, F.from, \"mm\");\n        if (F.centred) fr.querySelector(\"input\").disabled = true;\n        side.appendChild(fr);\n        side.appendChild(num6(\"Width\", \"fwidth\", g2.id, F.width, \"mm\"));\n        side.appendChild(num6(F.kind === \"breast\" ? \"Depth into the room\" : \"Depth out of the room\", \"fdepth\", g2.id, F.depth, \"mm\"));\n      }\n      const r = formResult(g2);\n      st.formPreview = r.ok ? r.outline : null;\n      side.appendChild(note(r.ok ? F.kind === \"step\" ? \"Shown dashed on the plan.\" : \"Left alcove \" + r.left + \" mm \\xB7 \" + (F.kind === \"breast\" ? \"breast \" : \"recess \") + r.width + \" mm \\xB7 right alcove \" + r.right + \" mm\" : \"Not possible - \" + r.why, { \"data-ub-rlayalcoves\": \"\", class: \"ub-lab__rlaynote\" + (r.ok ? \"\" : \" is-bad\") }));\n      const add = el(\"button\", \"ub-lab__btn ub-lab__rlayadd\", { type: \"button\", \"data-ub-rlayformadd\": F.kind }, F.kind === \"step\" ? \"Add step\" : F.kind === \"breast\" ? \"Add chimney breast\" : \"Add recess\");\n      add.disabled = !r.ok;\n      side.appendChild(add);\n      side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayformback\": \"\" }, \"Back\"));\n    }\n    function openForm(kind) {\n      if (!(st.sel && st.sel.type === \"wall\")) {\n        say(\"Choose a wall first\");\n        return draw();\n      }\n      const g2 = segmentFrame(session.draft(), st.sel.id);\n      const w = Math.max(WALL_MIN, Math.min(1470, Math.round(g2.len / 3 / 10) * 10));\n      st.form = kind === \"step\" ? { kind, wall: g2.id, at: Math.round(g2.len * 2 / 3 / 10) * 10, depth: 1e3, dir: \"in\", side: \"end\" } : { kind, wall: g2.id, centred: true, from: Math.round((g2.len - w) / 2), width: w, depth: kind === \"breast\" ? 400 : 300 };\n      say(kind === \"step\" ? \"Add step: where along the wall, how deep, in or out, and which part moves - shown dashed before you add it.\" : (kind === \"breast\" ? \"Chimney breast: \" : \"Recess: \") + \"width and depth in mm, centred or from the left end - the alcoves either side are shown.\");\n      draw();\n    }\n    function addForm() {\n      const F = st.form, g2 = F && segmentFrame(session.draft(), F.wall);\n      if (!g2) return { ok: false };\n      const v = formVals();\n      const r = F.kind === \"step\" ? session.stepWall(g2.id, v.at, v.depth, F.dir, F.side) : session.feature(g2.id, { kind: F.kind, width: v.width, depth: v.depth, centred: F.centred, from: v.from });\n      if (r.ok) {\n        st.form = null;\n        st.formPreview = null;\n      }\n      return result(r, F.kind === \"step\" ? \"Step added - \" + Math.round(v.depth) + \" mm \" + (F.dir === \"out\" ? \"out\" : \"in\") + \"; Undo takes it away.\" : (F.kind === \"breast\" ? \"Chimney breast \" : \"Recess \") + r.width + \" \\xD7 \" + r.depth + \" mm added - alcoves \" + r.left + \" and \" + r.right + \" mm.\");\n    }\n    const PART_NAME = { wall: \"Inside wall\", enclosure: \"Enclosure (a room inside - WC / bathroom)\", solid: \"Solid block\" };\n    function partOf(id) {\n      return session.parts().find((p) => p.id === id) || null;\n    }\n    function drawPartSide() {\n      const p = partOf(st.sel.id);\n      if (!p) {\n        st.sel = null;\n        return drawSide();\n      }\n      side.appendChild(el(\"strong\", \"ub-lab__rlayh\", null, PART_NAME[p.kind] + \" \" + p.id));\n      const ceil = session.ceiling(), wallH = partHeight(p, ceil);\n      side.appendChild(num6(\"Height\", \"pheight\", p.id, p.h != null ? p.h : \"\", \"mm (empty: to the ceiling, \" + ceil + \")\"));\n      if (p.kind !== \"solid\") {\n        side.appendChild(num6(\"Thickness\", \"pthick\", p.id, p.thick || PART_THICK.def, \"mm\"));\n        const seg = partSegments(p).find((q) => q.seg === st.sel.seg) || partSegments(p)[0];\n        const D0 = doorDefault();\n        side.appendChild(num6(\"Opening\", \"pdw\", p.id, Math.min(D0.w, seg.len), \"mm wide\"));\n        side.appendChild(num6(\"high\", \"pdh\", p.id, Math.min(D0.h, wallH), \"mm\"));\n        side.appendChild(num6(\"from its start\", \"pdat\", p.id, \"\", \"mm (empty: centred)\"));\n        side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaypartdoor\": p.id + \":\" + seg.seg, title: \"An opening in the wall you clicked (\" + seg.len + \" mm): a gap from the floor to its height, the wall above it. No door leaf is drawn.\" }, \"Add opening\"));\n        for (const d of p.doors || []) {\n          const row = el(\"div\", \"ub-lab__rlaydoorrow\", { \"data-ub-rlaydoorrow\": p.id + \":\" + d.id });\n          row.appendChild(el(\"span\", \"ub-lab__rlaydoorname\", null, \"Opening \" + d.id + \" (no door leaf)\"));\n          row.appendChild(num6(\"wide\", \"dw\", p.id + \":\" + d.id, d.w, \"mm\"));\n          row.appendChild(num6(\"high\", \"dh\", p.id + \":\" + d.id, d.h, \"mm\"));\n          row.appendChild(num6(\"from start\", \"dat\", p.id + \":\" + d.id, d.at, \"mm\"));\n          row.appendChild(el(\"button\", \"ub-lab__btn ub-lab__rlaydoorchip\", { type: \"button\", \"data-ub-rlaydoordel\": p.id + \":\" + d.id, title: \"Remove this opening\" }, \"Remove opening\"));\n          side.appendChild(row);\n        }\n      }\n      side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaypartdel\": p.id }, \"Remove\"));\n      side.appendChild(note(\"Drag it to move it, its corners to reshape it (kept square). Cabinets keep clear of it - in height too: a wall cabinet over a low wall is fine, one in an opening meets the wall above it. Cabinets do not stand against inside walls yet.\", { \"data-ub-rlaypartnote\": \"\" }));\n    }\n    function snapInside(p, last) {\n      const reach = Math.max(40, 12 / (st.fit && st.fit.s || 0.1));\n      const lines = segments(session.draft()).map((g2) => ({ a: { x: g2.start[0], z: g2.start[1] }, b: { x: g2.end[0], z: g2.end[1] } }));\n      for (const q of session.parts()) for (const g2 of partSegments(q)) lines.push({ a: g2.a, b: g2.b });\n      let best = null;\n      for (const L of lines) {\n        if (Math.abs(L.a.z - L.b.z) < 0.5) {\n          if (last && p.z === last.z && p.x !== last.x) continue;\n          const d = Math.abs(p.z - L.a.z);\n          if (d <= reach && p.x >= Math.min(L.a.x, L.b.x) - reach && p.x <= Math.max(L.a.x, L.b.x) + reach && (!best || d < best.d)) best = { d, x: p.x, z: L.a.z };\n        } else if (Math.abs(L.a.x - L.b.x) < 0.5) {\n          if (last && p.x === last.x && p.z !== last.z) continue;\n          const d = Math.abs(p.x - L.a.x);\n          if (d <= reach && p.z >= Math.min(L.a.z, L.b.z) - reach && p.z <= Math.max(L.a.z, L.b.z) + reach && (!best || d < best.d)) best = { d, x: L.a.x, z: p.z };\n        }\n      }\n      return best ? { x: best.x, z: best.z } : p;\n    }\n    function drawUnderSide() {\n      side.appendChild(el(\"strong\", \"ub-lab__rlayh\", null, \"Tracing underlay\"));\n      if (!st.under) {\n        side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayunderpick\": \"\" }, \"Choose image or PDF\\u2026\"));\n        side.appendChild(note(\"A photo of a floor plan, a sketch, an estate agent's drawing or a PDF of one (its picture is used; a PDF drawn only in lines needs exporting as an image first). It is a guide only: it stays on this screen and is not saved with your plan.\"));\n        return;\n      }\n      const op = el(\"label\", \"ub-lab__rlayf\");\n      op.appendChild(el(\"span\", null, null, \"See-through\"));\n      const r = el(\"input\", null, { type: \"range\", min: \"10\", max: \"100\", step: \"5\", \"data-ub-rlayunderop\": \"\", \"aria-label\": \"How strongly the underlay shows, per cent\" });\n      r.value = String(Math.round(st.under.opacity * 100));\n      op.appendChild(r);\n      side.appendChild(op);\n      const cal = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaycalib\": \"\", \"aria-pressed\": st.calib ? \"true\" : \"false\" }, st.calib ? \"Calibrating\\u2026\" : \"Calibrate scale\");\n      side.appendChild(cal);\n      if (st.calib && st.calib.length < 2) side.appendChild(note(\"Tap two points on the image whose real distance you know (\" + st.calib.length + \" of 2).\"));\n      if (st.calib && st.calib.length === 2) {\n        side.appendChild(num6(\"Real distance between them\", \"calib\", \"\", Math.round(calibMeasured()), \"mm\"));\n        side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlaycalset\": \"\" }, \"Set scale\"));\n      }\n      const sug = el(\"button\", \"ub-lab__btn\", {\n        type: \"button\",\n        \"data-ub-rlaysuggest\": \"\",\n        \"aria-pressed\": st.seedMode ? \"true\" : \"false\",\n        title: st.under.calibrated ? \"Tap inside the room on the picture: its walls are proposed as the outline, for you to check\" : \"Calibrate the picture first\"\n      }, st.seedMode ? \"Tap inside the room\\u2026\" : \"Suggest outline from picture\");\n      sug.disabled = !st.under.calibrated;\n      side.appendChild(sug);\n      if (st.proposal && st.proposal.draft === session.draft()) side.appendChild(note(\"PROPOSED from the picture (\" + st.proposal.corners + \" corners) - not measured. Check every length against the room before Apply; Undo takes the proposal away.\", { \"data-ub-rlayproposal\": \"\" }));\n      side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayundermove\": \"\", \"aria-pressed\": st.underMove ? \"true\" : \"false\" }, st.underMove ? \"Moving image - drag it\" : \"Move image\"));\n      side.appendChild(el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-rlayunderdel\": \"\" }, \"Remove image\"));\n      side.appendChild(note(\"Scale \" + st.under.mmpp.toFixed(2) + \" mm per image pixel\" + (st.under.calibrated ? \" (calibrated)\" : \" (a guess - calibrate it)\") + \". Trace by dragging corners and walls over it, then check the lengths: the image is a guide only, not a measurement, and is not saved with your plan.\", { \"data-ub-rlayundernote\": \"\" }));\n    }\n    function calibMeasured() {\n      const c = st.calib;\n      return c && c.length === 2 ? Math.hypot(c[1][0] - c[0][0], c[1][1] - c[0][1]) : 0;\n    }\n    function setUnderlay(href, w, h) {\n      if (!(w > 0 && h > 0)) {\n        say(\"That image could not be read\");\n        return false;\n      }\n      const o = session.draft(), xs = o.walls.map((p) => p.x), zs = o.walls.map((p) => p.z), W2 = Math.max(...xs) - Math.min(...xs);\n      st.under = { href, w, h, mmpp: W2 / w, ox: Math.min(...xs), oy: Math.min(...zs), opacity: 0.5, calibrated: false, pix: null, img: null, from: \"image\" };\n      st.calib = null;\n      st.underMove = false;\n      st.seedMode = false;\n      st.proposal = null;\n      say(\"Image under the plan - calibrate its scale with two points a known distance apart, then trace the walls over it.\");\n      draw();\n      return true;\n    }\n    function setScale(real) {\n      const m = calibMeasured();\n      if (!st.under || !(m > 0)) {\n        say(\"Tap two points on the image first\");\n        return false;\n      }\n      if (!(real >= 100 && real <= 5e4)) {\n        say(\"Type the real distance in mm (100 to 50000)\");\n        return false;\n      }\n      const k = real / m, p = st.calib[0], U = st.under;\n      U.mmpp *= k;\n      U.ox = p[0] + (U.ox - p[0]) * k;\n      U.oy = p[1] + (U.oy - p[1]) * k;\n      U.calibrated = true;\n      st.calib = null;\n      say(\"Scale set: those two points are \" + Math.round(real) + \" mm apart. Trace the walls over the image.\");\n      draw();\n      return true;\n    }\n    function pixelsOf(U) {\n      if (U.pix) return U.pix;\n      const d = ctx.doc, im = U.img;\n      if (!im || !d || !d.createElement) return null;\n      const k = Math.min(1, 900 / Math.max(U.w, U.h)), cw = Math.max(1, Math.round(U.w * k)), ch = Math.max(1, Math.round(U.h * k));\n      const cv = d.createElement(\"canvas\");\n      cv.width = cw;\n      cv.height = ch;\n      const g2 = cv.getContext && cv.getContext(\"2d\");\n      if (!g2) return null;\n      g2.fillStyle = \"#fff\";\n      g2.fillRect(0, 0, cw, ch);\n      g2.drawImage(im, 0, 0, cw, ch);\n      const px = g2.getImageData(0, 0, cw, ch).data, gray = new Uint8Array(cw * ch);\n      for (let i = 0; i < cw * ch; i++) gray[i] = Math.round(0.299 * px[i * 4] + 0.587 * px[i * 4 + 1] + 0.114 * px[i * 4 + 2]);\n      U.pix = { gray, w: cw, h: ch, scale: U.w / cw };\n      return U.pix;\n    }\n    function grayOf(rgba, w, h) {\n      const g2 = new Uint8Array(w * h);\n      for (let i = 0; i < w * h; i++) g2[i] = Math.round(0.299 * rgba[i * 4] + 0.587 * rgba[i * 4 + 1] + 0.114 * rgba[i * 4 + 2]);\n      return g2;\n    }\n    function suggestAt(mm) {\n      const U = st.under;\n      st.seedMode = false;\n      if (!U || !U.calibrated) {\n        say(\"Calibrate the picture first - an uncalibrated picture would only guess the sizes\");\n        draw();\n        return { ok: false };\n      }\n      const P2 = pixelsOf(U);\n      if (!P2) {\n        say(\"This browser cannot read the picture's pixels - trace it by hand\");\n        draw();\n        return { ok: false };\n      }\n      const ix = (mm[0] - U.ox) / U.mmpp / P2.scale, iy = (mm[1] - U.oy) / U.mmpp / P2.scale;\n      const r = proposeOutline(P2.gray, P2.w, P2.h, [ix, iy], U, { scale: P2.scale });\n      if (!r.ok) {\n        say(\"No outline proposed - \" + r.why + \".\");\n        draw();\n        return r;\n      }\n      const d = session.drawn(r.points);\n      if (!d.ok) {\n        say(\"The picture's outline is not a room the planner can take - \" + d.why + \". Trace it by hand.\");\n        draw();\n        return d;\n      }\n      st.proposal = { corners: session.draft().walls.length, draft: session.draft() };\n      st.tool = \"underlay\";\n      refit(true);\n      say(\"Outline PROPOSED from the picture: \" + st.proposal.corners + \" corners. Check every length against the room - it is read from the picture, not measured - then Apply, or Undo.\");\n      draw();\n      return { ok: true, corners: st.proposal.corners };\n    }\n    async function fromPdf(bytes, inflate) {\n      const r = await pdfPlanImage(bytes, inflate || browserInflate);\n      if (!r.ok) {\n        say(\"Can't use that PDF - \" + r.why + \".\");\n        draw();\n        return r;\n      }\n      if (r.kind === \"jpeg\") {\n        let bin = \"\";\n        for (let i = 0; i < r.bytes.length; i++) bin += String.fromCharCode(r.bytes[i]);\n        const href = \"data:image/jpeg;base64,\" + (ctx.win && ctx.win.btoa ? ctx.win.btoa(bin) : Buffer.from(r.bytes).toString(\"base64\"));\n        setUnderlay(href, r.w, r.h);\n        if (st.under) {\n          st.under.from = \"pdf\";\n          loadImg(href);\n        }\n      } else {\n        const d = ctx.doc, cv = d && d.createElement ? d.createElement(\"canvas\") : null, g2 = cv && cv.getContext ? (cv.width = r.w, cv.height = r.h, cv.getContext(\"2d\")) : null;\n        let href = \"\";\n        if (g2 && ctx.win && ctx.win.ImageData) {\n          g2.putImageData(new ctx.win.ImageData(r.rgba, r.w, r.h), 0, 0);\n          href = cv.toDataURL(\"image/png\");\n        }\n        setUnderlay(href, r.w, r.h);\n        if (st.under) {\n          st.under.from = \"pdf\";\n          st.under.pix = { gray: grayOf(r.rgba, r.w, r.h), w: r.w, h: r.h, scale: 1 };\n        }\n      }\n      if (st.under) say(\"The plan's picture from the PDF is under the plan - calibrate it with two points a known distance apart.\");\n      draw();\n      return r;\n    }\n    function browserInflate(b) {\n      const W2 = ctx.win;\n      if (!W2 || !W2.DecompressionStream || !W2.Response || !W2.Blob) return Promise.reject(new Error(\"no inflate\"));\n      return new W2.Response(new W2.Blob([b]).stream().pipeThrough(new W2.DecompressionStream(\"deflate\"))).arrayBuffer().then((a) => new Uint8Array(a));\n    }\n    function loadImg(href) {\n      const Img = ctx.win && ctx.win.Image;\n      if (!Img || !st.under) return;\n      const im = new Img(), U = st.under;\n      im.onload = function() {\n        U.img = im;\n      };\n      im.src = href;\n    }\n    function pickFile() {\n      const fl = file.files && file.files[0];\n      if (!fl || !ctx.win || !ctx.win.FileReader) return;\n      if (/pdf$/i.test(fl.type || \"\") || /\\.pdf$/i.test(fl.name || \"\")) {\n        const rp = new ctx.win.FileReader();\n        rp.onload = function() {\n          fromPdf(new Uint8Array(rp.result));\n        };\n        rp.readAsArrayBuffer(fl);\n        file.value = \"\";\n        return;\n      }\n      const rd = new ctx.win.FileReader();\n      rd.onload = function() {\n        const href = String(rd.result || \"\");\n        const Img = ctx.win.Image;\n        if (!Img) {\n          say(\"This browser cannot show the image\");\n          return;\n        }\n        const im = new Img();\n        im.onload = function() {\n          if (setUnderlay(href, im.naturalWidth || im.width, im.naturalHeight || im.height)) st.under.img = im;\n        };\n        im.onerror = function() {\n          say(\"That file is not an image this browser can show\");\n        };\n        im.src = href;\n      };\n      rd.readAsDataURL(fl);\n      file.value = \"\";\n    }\n    file.addEventListener(\"change\", pickFile);\n    function angledNote(o) {\n      const n = segments(o).filter((g2) => !g2.axis).length;\n      if (n) side.appendChild(note(n + \" angled wall\" + (n > 1 ? \"s\" : \"\") + \": solid, but cabinets are only seated against the square walls for now.\", { \"data-ub-rlayangled\": \"\" }));\n    }\n    function num6(label, k, id, v, unit2) {\n      const wrap = el(\"label\", \"ub-lab__rlayf\");\n      wrap.appendChild(el(\"span\", null, null, label));\n      const inp = el(\"input\", \"ub-lab__secw\", { type: \"number\", inputmode: \"decimal\", \"data-ub-rlayf\": k, \"data-ub-rlayid\": id, step: unit2 === \"\\xB0\" ? \"1\" : \"10\" });\n      inp.value = String(v);\n      wrap.appendChild(inp);\n      wrap.appendChild(el(\"span\", \"ub-lab__rlayunit\", null, unit2));\n      return wrap;\n    }\n    function result(r, okText) {\n      if (r && r.ok) {\n        st.preview = null;\n        st.why = null;\n        refit();\n        say(okText || \"Changed - Apply to put it in your plan, or Undo.\");\n      } else if (r && r.why) say(\"Not possible - \" + r.why + \". Nothing changed.\");\n      draw();\n      return r;\n    }\n    function typed(k, id, raw) {\n      const v = Number(String(raw).replace(\",\", \".\"));\n      if (!isFinite(v)) {\n        say(\"Type a number\");\n        return { ok: false };\n      }\n      const o = session.draft();\n      if (k === \"len\") return result(session.setLength(id, v), \"Wall length set to \" + Math.round(v) + \" mm.\");\n      if (k === \"pthick\") return result(session.partThick(id, v), \"Thickness \" + Math.round(v) + \" mm.\");\n      if (k === \"pheight\") return result(session.partHeight(id, v), \"Height \" + Math.round(v) + \" mm.\");\n      if (k === \"dw\" || k === \"dh\" || k === \"dat\") {\n        const [pid, did] = String(id).split(\":\");\n        const o2 = {};\n        o2[k === \"dw\" ? \"w\" : k === \"dh\" ? \"h\" : \"at\"] = v;\n        return result(session.setPartDoor(pid, did, o2), \"Opening \" + (k === \"dw\" ? \"width\" : k === \"dh\" ? \"height\" : \"place\") + \" \" + Math.round(v) + \" mm.\");\n      }\n      if (k === \"ang\") return result(session.setAngle(id, v), \"Corner angle set to \" + v + \"\\xB0.\");\n      if (k === \"push\") return v ? result(session.pushWall(id, v), \"Wall moved \" + Math.abs(Math.round(v)) + \" mm \" + (v > 0 ? \"out\" : \"in\") + \".\") : { ok: true };\n      if (k === \"cx\" || k === \"cz\") {\n        const p = o.walls.find((q) => q.id === id);\n        return result(gesture.square ? session.orthoMove(id, k === \"cx\" ? v : p.x, k === \"cz\" ? v : p.z) : session.moveCorner(id, k === \"cx\" ? v : p.x, k === \"cz\" ? v : p.z, false), \"Corner moved.\");\n      }\n      return { ok: false };\n    }\n    function tool(id) {\n      if (id === \"underlay\") {\n        gesture.stopDraw();\n        st.sel = null;\n        st.tool = \"underlay\";\n        say(st.under ? \"The underlay: calibrate, move or remove it.\" : \"Choose a photo or drawing of the room to trace over.\");\n        return draw();\n      }\n      if (id === \"select\") {\n        gesture.stopDraw();\n        st.tool = \"select\";\n        st.calib = null;\n        st.underMove = false;\n        st.seedMode = false;\n        say(\"Drag a corner or a wall; click a length or an angle to type it.\");\n        return draw();\n      }\n      if (id === \"draw\") {\n        gesture.startDraw(\"room\");\n        st.sel = null;\n        say(\"Tap the corners of the room's outline in order; tap the first corner (or Enter) to close it.\");\n        return draw();\n      }\n      if (id === \"wall\") {\n        gesture.startDraw(\"wall\");\n        st.sel = null;\n        say(\"Inside wall: tap its points (each square to the one before). Finish wall keeps it open; tap the first point or Close shape for an enclosure (a WC). The room's own walls stay.\");\n        return draw();\n      }\n      if (id === \"solid\") {\n        gesture.startDraw(\"solid\");\n        st.sel = null;\n        say(\"Solid block: tap its corners, then Close shape - nothing can stand in it (a free-standing chimney breast, a column).\");\n        return draw();\n      }\n      if (id === \"rect\") return result(session.preset(\"rect\"), \"A rectangle \" + sizeText() + \".\");\n      if (id === \"L\") return result(session.preset(\"L\"), \"An L-shaped room - drag its corners or type its lengths.\");\n      if (id === \"angles\") {\n        st.angles = !st.angles;\n        gesture.square = !st.angles;\n        st.form = null;\n        say(st.angles ? \"Angles: corner angles shown and typed, corners dragged freely, a wall's middle dot bends it.\" : \"Square corners: walls stay square as you drag and draw.\");\n        return draw();\n      }\n      if (id === \"delcorner\") {\n        if (!(st.sel && st.sel.type === \"corner\")) {\n          say(\"Choose a corner first\");\n          return draw();\n        }\n        const r = result(gesture.square ? session.orthoRemove(st.sel.id) : session.removeCorner(st.sel.id), gesture.square ? \"Corner removed - the walls stay square.\" : \"Corner removed - its two walls are one.\");\n        if (r.ok) st.sel = null;\n        return draw();\n      }\n    }\n    function sizeText() {\n      const o = session.draft(), xs = o.walls.map((p) => p.x), zs = o.walls.map((p) => p.z);\n      return Math.max(...xs) - Math.min(...xs) + \" \\xD7 \" + (Math.max(...zs) - Math.min(...zs)) + \" mm\";\n    }\n    box3.addEventListener(\"click\", function(e) {\n      if (st.eatClick) {\n        st.eatClick = false;\n        if (e.target && e.target.closest && e.target.closest(\".ub-lab__rlaychip\")) return;\n      }\n      const t = e.target && e.target.closest ? e.target.closest(\"button\") : null;\n      if (!t || !box3.contains(t)) return;\n      if (t.hasAttribute(\"data-ub-rlaycancel\")) {\n        close(false);\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayapply\")) {\n        close(true);\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayundo\")) {\n        if (session.undo()) {\n          refit();\n          say(\"Undone.\");\n        }\n        draw();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayredo\")) {\n        if (session.redo()) {\n          refit();\n          say(\"Redone.\");\n        }\n        draw();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlaydrawclose\")) {\n        const r = gesture.closeDraw();\n        result(r, r.inside ? (gesture.drawing && gesture.drawing.target === \"solid\" ? \"Solid block added\" : \"Enclosure added (a room inside)\") + \" - draw the next one, or Select.\" : \"The new outline is drawn - Apply to use it.\");\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayfinish\")) {\n        result(gesture.finishDraw(), \"Wall added (open) - draw the next one, or Select to choose it and add an opening.\");\n        return;\n      }\n      const pdel = t.getAttribute(\"data-ub-rlaypartdel\");\n      if (pdel) {\n        const r = result(session.removePart(pdel), \"Removed.\");\n        if (r.ok) st.sel = null;\n        draw();\n        return;\n      }\n      const pdoor = t.getAttribute(\"data-ub-rlaypartdoor\");\n      if (pdoor) {\n        const [pid, sg] = pdoor.split(\":\");\n        const val = (k) => (side.querySelector('[data-ub-rlayf=\"' + k + '\"]') || {}).value;\n        const w = Number(val(\"pdw\")), h = Number(val(\"pdh\")), at = val(\"pdat\");\n        const r = session.addPartDoor(pid, Number(sg), w, at === \"\" || at == null ? null : Number(at), h);\n        const d = r.ok ? ((partOf(pid) || {}).doors || []).slice(-1)[0] : null;\n        result(r, d ? \"Opening added - \" + d.w + \" \\xD7 \" + d.h + \" mm (a gap, no door leaf).\" : \"\");\n        return;\n      }\n      const ddel = t.getAttribute(\"data-ub-rlaydoordel\");\n      if (ddel) {\n        const [pid, did] = ddel.split(\":\");\n        result(session.removePartDoor(pid, did), \"Opening removed.\");\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayunderpick\")) {\n        if (file.click) file.click();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlaycalib\")) {\n        st.calib = st.calib ? null : [];\n        st.underMove = false;\n        draw();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlaycalset\")) {\n        const i = side.querySelector('[data-ub-rlayf=\"calib\"]');\n        setScale(Number(i && i.value));\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayundermove\")) {\n        st.underMove = !st.underMove;\n        st.calib = null;\n        draw();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayunderdel\")) {\n        st.under = null;\n        st.calib = null;\n        st.underMove = false;\n        st.seedMode = false;\n        st.proposal = null;\n        say(\"Underlay removed.\");\n        draw();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlaysuggest\")) {\n        if (st.under && st.under.calibrated) {\n          st.seedMode = !st.seedMode;\n          st.calib = null;\n          st.underMove = false;\n          say(st.seedMode ? \"Tap inside the room on the picture.\" : \"\");\n        }\n        draw();\n        return;\n      }\n      const fk = t.getAttribute(\"data-ub-rlayform\");\n      if (fk) {\n        openForm(fk);\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayformback\")) {\n        st.form = null;\n        st.formPreview = null;\n        draw();\n        return;\n      }\n      if (t.hasAttribute(\"data-ub-rlayformadd\")) {\n        addForm();\n        return;\n      }\n      const op = t.getAttribute(\"data-ub-rlayopt\");\n      if (op && st.form) {\n        const [k, v] = op.split(\":\");\n        keepForm();\n        st.form[k] = v === \"true\" ? true : v === \"false\" ? false : v;\n        draw();\n        return;\n      }\n      const tl = t.getAttribute(\"data-ub-rlaytool\");\n      if (tl) {\n        tool(tl);\n        return;\n      }\n      const len = t.getAttribute(\"data-ub-rlaylen\"), ang = t.getAttribute(\"data-ub-rlayang\");\n      if (len || ang) {\n        st.editing = { k: len ? \"len\" : \"ang\", id: len || ang };\n        draw();\n        const i = layer2.querySelector(\"[data-ub-rlayin]\");\n        if (i && i.focus) {\n          i.focus();\n          if (i.select) i.select();\n        }\n      }\n    });\n    function keepForm() {\n      if (!st.form) return;\n      const v = formVals(), F = st.form;\n      if (isFinite(v.from)) F.from = v.from;\n      if (isFinite(v.width)) F.width = v.width;\n      if (isFinite(v.depth)) F.depth = v.depth;\n      if (isFinite(v.at)) F.at = v.at;\n    }\n    function commitInput(inp) {\n      if (inp.getAttribute(\"data-ub-sent\") === \"1\") return;\n      inp.setAttribute(\"data-ub-sent\", \"1\");\n      const k = inp.getAttribute(\"data-ub-rlayin\") || inp.getAttribute(\"data-ub-rlayf\"), id = inp.getAttribute(\"data-ub-rlayid\");\n      if (inp.hasAttribute(\"data-ub-rlayin\")) st.editing = null;\n      if (/^f(from|width|depth|at)$/.test(k)) {\n        keepForm();\n        refreshForm();\n        return;\n      }\n      if (k === \"pdw\" || k === \"pdat\" || k === \"pdh\") return;\n      if (k === \"pheight\" && String(inp.value).trim() === \"\") {\n        result(session.partHeight(id, null), \"Height: up to the ceiling.\");\n        return;\n      }\n      if (k === \"calib\") {\n        setScale(Number(inp.value));\n        return;\n      }\n      typed(k, id, inp.value);\n    }\n    box3.addEventListener(\"keydown\", function(e) {\n      const t = e.target, k = e.key || \"\";\n      if (e.stopPropagation) e.stopPropagation();\n      const isIn = t && t.tagName === \"INPUT\";\n      if (isIn && k === \"Enter\") {\n        e.preventDefault();\n        commitInput(t);\n        return;\n      }\n      if (isIn && k === \"Escape\") {\n        e.preventDefault();\n        if (t.hasAttribute(\"data-ub-rlayin\")) {\n          st.editing = null;\n          t.setAttribute(\"data-ub-sent\", \"1\");\n          draw();\n        } else t.blur && t.blur();\n        return;\n      }\n      if (isIn) return;\n      if ((e.ctrlKey || e.metaKey) && /^z$/i.test(k)) {\n        e.preventDefault();\n        if (e.shiftKey ? session.redo() : session.undo()) refit();\n        draw();\n        return;\n      }\n      if ((e.ctrlKey || e.metaKey) && /^y$/i.test(k)) {\n        e.preventDefault();\n        if (session.redo()) refit();\n        draw();\n        return;\n      }\n      if (k === \"Escape\") {\n        e.preventDefault();\n        if (gesture.active()) {\n          gesture.cancel();\n          st.preview = null;\n          st.why = null;\n          draw();\n          return;\n        }\n        if (gesture.drawing) {\n          gesture.stopDraw();\n          st.hover = null;\n          say(\"Drawing stopped - nothing changed.\");\n          draw();\n          return;\n        }\n        close(false);\n        return;\n      }\n      if (gesture.drawing && k === \"Enter\") {\n        e.preventDefault();\n        if (gesture.drawing.target === \"wall\") {\n          result(gesture.finishDraw(), \"Wall added (open) - draw the next one, or Select.\");\n          return;\n        }\n        const r = gesture.closeDraw();\n        result(r, r.inside ? \"Solid block added - draw the next one, or Select.\" : \"The new outline is drawn - Apply to use it.\");\n        return;\n      }\n      if (gesture.drawing && k === \"Backspace\") {\n        e.preventDefault();\n        gesture.undoDraw();\n        draw();\n        return;\n      }\n      if (st.sel && st.sel.type === \"corner\" && /^Arrow/.test(k)) {\n        e.preventDefault();\n        const p = session.draft().walls.find((q) => q.id === st.sel.id), d = e.shiftKey ? 100 : 10;\n        const dx = k === \"ArrowLeft\" ? -d : k === \"ArrowRight\" ? d : 0, dz = k === \"ArrowUp\" ? -d : k === \"ArrowDown\" ? d : 0;\n        result(gesture.square ? session.orthoMove(p.id, p.x + dx, p.z + dz) : session.moveCorner(p.id, p.x + dx, p.z + dz, false), \"Corner moved \" + d + \" mm.\");\n        return;\n      }\n      if (st.sel && st.sel.type === \"corner\" && (k === \"Delete\" || k === \"Backspace\")) {\n        e.preventDefault();\n        tool(\"delcorner\");\n      }\n    });\n    box3.addEventListener(\"focusout\", function(e) {\n      const t = e.target;\n      if (t && t.tagName === \"INPUT\" && (t.hasAttribute(\"data-ub-rlayin\") || /^(len|push|ang|cx|cz|pthick|pheight|dw|dh|dat)$/.test(t.getAttribute(\"data-ub-rlayf\") || \"\"))) commitInput(t);\n    });\n    box3.addEventListener(\"input\", function(e) {\n      const t = e.target;\n      if (t && t.hasAttribute && t.hasAttribute(\"data-ub-rlayunderop\") && st.under) {\n        st.under.opacity = Math.max(0.1, Math.min(1, Number(t.value) / 100));\n        const im = svg2.querySelector(\"[data-ub-rlayunder]\");\n        if (im) im.setAttribute(\"opacity\", st.under.opacity);\n        return;\n      }\n      if (t && t.removeAttribute) t.removeAttribute(\"data-ub-sent\");\n      if (t && t.getAttribute && /^f(from|width|depth|at)$/.test(t.getAttribute(\"data-ub-rlayf\") || \"\")) {\n        keepForm();\n        refreshForm();\n      }\n    });\n    function refreshForm() {\n      if (!st.form) return;\n      const g2 = segmentFrame(session.draft(), st.form.wall);\n      if (!g2) return;\n      const r = formResult(g2);\n      st.formPreview = r.ok ? r.outline : null;\n      const n = side.querySelector(\"[data-ub-rlayalcoves]\"), add = side.querySelector(\"[data-ub-rlayformadd]\");\n      const F = st.form;\n      if (n) {\n        n.textContent = r.ok ? F.kind === \"step\" ? \"Shown dashed on the plan.\" : \"Left alcove \" + r.left + \" mm \\xB7 \" + (F.kind === \"breast\" ? \"breast \" : \"recess \") + r.width + \" mm \\xB7 right alcove \" + r.right + \" mm\" : \"Not possible - \" + r.why;\n        n.title = n.textContent;\n        n.classList.toggle(\"is-bad\", !r.ok);\n      }\n      if (add) add.disabled = !r.ok;\n      const gh = svg2.querySelector(\"[data-ub-rlayformghost]\");\n      if (gh) gh.remove();\n      if (st.formPreview) svg2.appendChild(sv(\"polygon\", { points: poly(st.formPreview), class: \"ub-lab__rlayformghost\", \"data-ub-rlayformghost\": \"\" }));\n    }\n    const local = (e) => {\n      const r = stage.getBoundingClientRect ? stage.getBoundingClientRect() : { left: 0, top: 0 };\n      return [e.clientX - r.left, e.clientY - r.top];\n    };\n    const opt = (e) => ({ free: !!(e.shiftKey || e.altKey), scale: e.pointerType === \"touch\" ? 1.7 : 1 });\n    function down(e) {\n      if (!st.open || e.button != null && e.button > 0) return;\n      const [px, py] = local(e);\n      if (e.target && e.target.closest && e.target.closest(\".ub-lab__rlaychip, .ub-lab__rlayin\")) {\n        const hc = !gesture.drawing && hitPlan(session.draft(), st.fit, px, py, opt(e).scale);\n        if (!(hc && hc.type === \"corner\")) return;\n        st.eatClick = true;\n      }\n      if (st.tool === \"underlay\" && st.calib && st.calib.length < 2) {\n        st.calib.push(toMm(st.fit, px, py));\n        draw();\n        return;\n      }\n      if (st.tool === \"underlay\" && st.seedMode && st.under) {\n        suggestAt(toMm(st.fit, px, py));\n        return;\n      }\n      if (st.tool === \"underlay\" && st.underMove && st.under) {\n        st.underDrag = { from: toMm(st.fit, px, py), ox: st.under.ox, oy: st.under.oy };\n        if (e.preventDefault) e.preventDefault();\n        return;\n      }\n      if (!gesture.drawing && st.tool !== \"underlay\") {\n        const [mx, mz] = toMm(st.fit, px, py), k = opt(e).scale;\n        const selP = st.sel && st.sel.type === \"part\" ? partOf(st.sel.id) : null;\n        let pi = -1;\n        if (selP) selP.pts.forEach((q, i) => {\n          const c = toPx(st.fit, q.x, q.z);\n          if (pi < 0 && Math.hypot(px - c[0], py - c[1]) <= 12 * k) pi = i;\n        });\n        const hc = hitPlan(session.draft(), st.fit, px, py, k);\n        const hp = pi >= 0 ? { id: selP.id, seg: st.sel.seg } : !(hc && hc.type === \"corner\") ? partAt(session.parts(), mx, mz, 10 * k / st.fit.s) : null;\n        if (hp) {\n          st.sel = { type: \"part\", id: hp.id, seg: hp.seg != null ? hp.seg : st.sel && st.sel.seg || 0 };\n          st.form = null;\n          st.partDrag = { id: hp.id, i: pi, from: [mx, mz], moved: false };\n          if (e.preventDefault) e.preventDefault();\n          if (stage.setPointerCapture && e.pointerId != null) try {\n            stage.setPointerCapture(e.pointerId);\n          } catch {\n          }\n          draw();\n          return;\n        }\n      }\n      const h = gesture.down(st.fit, px, py, opt(e));\n      stage.setAttribute(\"data-ub-rlaydown\", (e.pointerType || \"mouse\") + \":\" + (h ? h.type + \":\" + (h.id || \"\") : \"none\") + \"@\" + Math.round(px) + \",\" + Math.round(py));\n      if (h && h.closed !== void 0) {\n        result(h, h.inside ? (gesture.drawing && gesture.drawing.target === \"solid\" ? \"Solid block added\" : \"Enclosure added (a room inside)\") + \" - draw the next one, or Select.\" : \"The new outline is drawn - Apply to use it.\");\n        return;\n      }\n      if (h && h.type === \"draw\") {\n        draw();\n        return;\n      }\n      if (h && h.type !== \"draw\") {\n        st.sel = { type: h.type === \"mid\" ? \"wall\" : h.type, id: h.id };\n        if (st.form && st.form.wall !== h.id) {\n          st.form = null;\n          st.formPreview = null;\n        }\n        if (e.preventDefault) e.preventDefault();\n        if (stage.setPointerCapture && e.pointerId != null) try {\n          stage.setPointerCapture(e.pointerId);\n        } catch {\n        }\n      } else {\n        st.sel = null;\n        st.form = null;\n        st.formPreview = null;\n      }\n      draw();\n    }\n    function move(e) {\n      if (!st.open) return;\n      const [px, py] = local(e);\n      if (st.partDrag) {\n        const D2 = st.partDrag, m = toMm(st.fit, px, py), dx = m[0] - D2.from[0], dz = m[1] - D2.from[1];\n        if (!D2.moved && Math.hypot(dx, dz) * st.fit.s < 3) return;\n        D2.moved = true;\n        const snap3 = (v) => Math.round(v / 10) * 10;\n        const r2 = D2.i >= 0 ? movePartPoint(session.parts(), session.draft(), D2.id, D2.i, snap3(m[0]), snap3(m[1]), gesture.square) : movePartition(session.parts(), session.draft(), D2.id, snap3(dx), snap3(dz));\n        st.partPreview = r2.ok ? r2.parts : null;\n        st.why = r2.ok ? null : r2.why;\n        D2.to = D2.i >= 0 ? [snap3(m[0]), snap3(m[1])] : [snap3(dx), snap3(dz)];\n        say(r2.ok ? D2.i >= 0 ? \"Corner to \" + D2.to[0] + \", \" + D2.to[1] + \" mm\" : \"Moved \" + D2.to[0] + \", \" + D2.to[1] + \" mm\" : \"Not possible here - \" + r2.why);\n        draw();\n        return;\n      }\n      if (st.underDrag) {\n        const m = toMm(st.fit, px, py);\n        st.under.ox = Math.round(st.underDrag.ox + m[0] - st.underDrag.from[0]);\n        st.under.oy = Math.round(st.underDrag.oy + m[1] - st.underDrag.from[1]);\n        draw();\n        return;\n      }\n      if (gesture.drawing) {\n        st.hover = [px, py];\n        draw();\n        return;\n      }\n      if (!gesture.active()) {\n        const h = hitPlan(session.draft(), st.fit, px, py, opt(e).scale);\n        stage.setAttribute(\"data-ub-rlayhover\", h ? h.type : \"\");\n        return;\n      }\n      const r = gesture.move(px, py, opt(e));\n      if (!r || r.preview === null && !r.why) return;\n      st.preview = r.preview;\n      st.why = r.why || null;\n      if (r.why) say(\"Not possible here - \" + r.why);\n      else say(previewText());\n      draw();\n    }\n    function previewText() {\n      const g2 = gesture.active();\n      if (!g2) return \"\";\n      if (g2.type === \"corner\") return \"Corner to \" + g2.to[0] + \", \" + g2.to[1] + \" mm\" + (g2.snapped ? \" - squared up\" : \"\") + \" (Shift: no snapping)\";\n      if (g2.type === \"wall\") return \"Wall \" + Math.abs(g2.by) + \" mm \" + (g2.by >= 0 ? \"out\" : \"in\");\n      return \"New corner at \" + g2.to[0] + \", \" + g2.to[1] + \" mm\";\n    }\n    function up(e) {\n      if (st.partDrag) {\n        const D2 = st.partDrag;\n        st.partDrag = null;\n        const ok2 = !!st.partPreview;\n        st.partPreview = null;\n        st.why = null;\n        if (!D2.moved) {\n          draw();\n          return;\n        }\n        if (!ok2) {\n          say(\"Not possible - nothing changed.\");\n          draw();\n          return;\n        }\n        result(D2.i >= 0 ? session.movePartPoint(D2.id, D2.i, D2.to[0], D2.to[1], gesture.square) : session.movePart(D2.id, D2.to[0], D2.to[1]), \"Moved.\");\n        return;\n      }\n      if (st.underDrag) {\n        st.underDrag = null;\n        say(\"Image moved - it is a guide only.\");\n        draw();\n        return;\n      }\n      if (!st.open || !gesture.active()) return;\n      const r = gesture.up(opt(e || {}));\n      st.preview = null;\n      if (r.none) {\n        st.why = null;\n        draw();\n        return;\n      }\n      if (!r.ok) {\n        st.why = null;\n        say(\"Not possible - \" + (r.why || \"that shape\") + \". Nothing changed.\");\n        draw();\n        return;\n      }\n      result(r);\n    }\n    stage.addEventListener(\"pointerdown\", down);\n    stage.addEventListener(\"pointermove\", move);\n    stage.addEventListener(\"pointerup\", up);\n    st.touchCarry = false;\n    stage.addEventListener(\"pointercancel\", function(e) {\n      if (e && e.pointerType === \"touch\" && gesture && (gesture.active() || st.underDrag)) {\n        st.touchCarry = true;\n        return;\n      }\n      if (gesture) gesture.cancel();\n      st.preview = null;\n      st.why = null;\n      if (st.open) draw();\n    });\n    const touchPt = (e) => {\n      const t = e.touches && e.touches[0] || e.changedTouches && e.changedTouches[0];\n      return t ? { clientX: t.clientX, clientY: t.clientY, pointerType: \"touch\" } : null;\n    };\n    stage.addEventListener(\"touchmove\", function(e) {\n      if (!st.touchCarry) return;\n      if (e.cancelable && e.preventDefault) e.preventDefault();\n      const p = touchPt(e);\n      if (p) move(p);\n    }, { passive: false });\n    stage.addEventListener(\"touchend\", function(e) {\n      if (!st.touchCarry) return;\n      st.touchCarry = false;\n      up(touchPt(e) || {});\n    });\n    stage.addEventListener(\"touchcancel\", function() {\n      if (!st.touchCarry) return;\n      st.touchCarry = false;\n      if (gesture) gesture.cancel();\n      st.underDrag = null;\n      st.preview = null;\n      st.why = null;\n      if (st.open) draw();\n    });\n    for (const ev of [\"mousedown\", \"pointerdown\", \"touchstart\", \"wheel\", \"dblclick\", \"contextmenu\"])\n      box3.addEventListener(ev, function(e) {\n        if (e.stopPropagation) e.stopPropagation();\n      }, ev === \"touchstart\" || ev === \"wheel\" ? { passive: true } : false);\n    if (ctx.win && ctx.win.addEventListener) ctx.win.addEventListener(\"resize\", function() {\n      if (st.open && !gesture.active()) {\n        refit(true);\n        draw();\n      }\n    });\n    root.addEventListener(\"click\", function(e) {\n      const t = e.target && e.target.closest ? e.target.closest(\"[data-ub-roomlayout]\") : null;\n      if (t && root.contains(t)) {\n        open();\n      }\n    });\n    return {\n      open,\n      close,\n      isOpen: () => st.open,\n      session: () => session,\n      gesture: () => gesture,\n      fit: () => st.fit,\n      sync() {\n        if (st.open && !gesture.active()) draw();\n      },\n      /* tests: a gesture by plan coordinates */\n      _down: down,\n      _move: move,\n      _up: up,\n      _typed: typed,\n      _tool: tool,\n      /* tests: an image put under the plan without a file dialog; the underlay's state */\n      _underlay: (href, w, h) => setUnderlay(href, w, h),\n      underlay: () => st.under ? Object.assign({}, st.under) : null,\n      _underlayPixels: (gray, w, h) => {\n        if (!st.under) return false;\n        st.under.pix = { gray, w, h, scale: st.under.w / w };\n        return true;\n      },\n      _pdf: (bytes, inflate) => fromPdf(bytes, inflate),\n      proposal: () => st.proposal && session && st.proposal.draft === session.draft() ? { corners: st.proposal.corners } : null\n    };\n  }\n\n  // v2/src/ui/decor-hover.js\n  var SCALE = 3;\n  var OFF = 16;\n  var PAD3 = 4;\n  var CAP = 18;\n  var EDGE3 = 6;\n  function attachDecorHover(listEl, opts) {\n    const o = opts || {};\n    const doc2 = listEl && listEl.ownerDocument || o.doc || null;\n    const win2 = doc2 && doc2.defaultView || o.win || null;\n    if (!listEl || !doc2 || !win2 || typeof doc2.createElement !== \"function\" || !listEl.addEventListener) return { hide() {\n    }, detach() {\n    }, el: null };\n    const itemSel = o.item || \"button\";\n    const scale = o.scale || SCALE;\n    let card = null, img = null, cap2 = null, cur = null, size3 = null, raf = 0, last = null, mode = null;\n    function build3() {\n      if (card) return;\n      card = doc2.createElement(\"div\");\n      card.className = \"ub-dhover\";\n      card.setAttribute(\"aria-hidden\", \"true\");\n      card.setAttribute(\"data-ub-dhover\", \"\");\n      card.hidden = true;\n      img = doc2.createElement(\"img\");\n      img.alt = \"\";\n      img.decoding = \"async\";\n      try {\n        img.referrerPolicy = \"no-referrer\";\n      } catch {\n      }\n      img.setAttribute(\"referrerpolicy\", \"no-referrer\");\n      cap2 = doc2.createElement(\"span\");\n      card.appendChild(img);\n      card.appendChild(cap2);\n      (doc2.body || doc2.documentElement).appendChild(card);\n    }\n    const tileOf2 = (t) => {\n      try {\n        const e = t && t.closest ? t.closest(itemSel) : null;\n        return e && listEl.contains(e) ? e : null;\n      } catch {\n        return null;\n      }\n    };\n    function measure(tile) {\n      const pic = tile.querySelector(\"img\") || tile;\n      const r = pic.getBoundingClientRect();\n      let w = r.width, h = r.height;\n      const nw = pic.naturalWidth, nh = pic.naturalHeight;\n      if (nw && nh && w) h = w * nh / nw;\n      return { w: Math.round(w * scale), h: Math.round(h * scale), drawn: Math.max(r.width, r.height), natural: Math.max(nw || 0, nh || 0) };\n    }\n    function show2(tile) {\n      const inf = o.info ? o.info(tile) : null;\n      if (!inf || !inf.src) {\n        hide();\n        return;\n      }\n      build3();\n      const m = measure(tile);\n      if (!m.w || !m.h) {\n        hide();\n        return;\n      }\n      if (cur !== tile) {\n        cur = tile;\n        size3 = m;\n        img.style.width = m.w + \"px\";\n        img.style.height = m.h + \"px\";\n        if (img.getAttribute(\"src\") !== inf.src) img.setAttribute(\"src\", inf.src);\n        cap2.textContent = inf.name || \"\";\n        if (inf.full && inf.full !== inf.src && m.natural && m.natural < Math.max(m.w, m.h)) {\n          const want = inf.full, pre = new win2.Image();\n          try {\n            pre.referrerPolicy = \"no-referrer\";\n          } catch {\n          }\n          pre.onload = () => {\n            if (cur === tile && card && !card.hidden) img.setAttribute(\"src\", want);\n          };\n          pre.src = want;\n        }\n      }\n      card.hidden = false;\n    }\n    function place2(x, y) {\n      if (!card || card.hidden || !size3) return;\n      const vw = win2.innerWidth || 0, vh = win2.innerHeight || 0;\n      const cw = size3.w + PAD3 * 2, ch = size3.h + PAD3 * 2 + CAP;\n      let left = x + OFF, top = y + OFF;\n      if (left + cw > vw - EDGE3) left = x - OFF - cw;\n      if (top + ch > vh - EDGE3) top = y - OFF - ch;\n      left = Math.max(EDGE3, Math.min(left, vw - cw - EDGE3));\n      top = Math.max(EDGE3, Math.min(top, vh - ch - EDGE3));\n      card.style.left = Math.round(left) + \"px\";\n      card.style.top = Math.round(top) + \"px\";\n    }\n    function placeBy(tile) {\n      const r = tile.getBoundingClientRect();\n      if (!size3) return;\n      const ch = size3.h + PAD3 * 2 + CAP;\n      const x = r.left + r.width / 2 - (size3.w + PAD3 * 2) / 2 - OFF, y = r.top - ch - OFF * 2;\n      place2(x, y >= EDGE3 ? y : r.bottom);\n    }\n    function hide() {\n      if (card) card.hidden = true;\n      cur = null;\n      size3 = null;\n      mode = null;\n    }\n    const onMove = (e) => {\n      if (!e || e.pointerType && e.pointerType !== \"mouse\" && e.pointerType !== \"pen\") return;\n      const tile = tileOf2(e.target);\n      if (!tile) {\n        let ctl = null;\n        try {\n          ctl = e.target && e.target.closest ? e.target.closest(\"button,input,select,a,label\") : null;\n        } catch {\n          ctl = null;\n        }\n        if (ctl && mode === \"pointer\") {\n          hide();\n          return;\n        }\n        if (mode !== \"pointer\") return;\n      } else if (tile !== cur) show2(tile);\n      mode = \"pointer\";\n      last = { x: e.clientX, y: e.clientY };\n      if (raf) return;\n      const go = () => {\n        raf = 0;\n        if (last) place2(last.x, last.y);\n      };\n      if (win2.requestAnimationFrame) raf = win2.requestAnimationFrame(go);\n      else go();\n    };\n    const onLeave = (e) => {\n      if (mode === \"pointer\" && (!e || !e.relatedTarget || !listEl.contains(e.relatedTarget))) hide();\n    };\n    const onFocus = (e) => {\n      const tile = tileOf2(e && e.target);\n      if (!tile) return;\n      try {\n        if (tile.matches && !tile.matches(\":focus-visible\")) return;\n      } catch {\n      }\n      mode = \"focus\";\n      cur = null;\n      show2(tile);\n      placeBy(tile);\n    };\n    const onBlur = (e) => {\n      if (mode === \"focus\" && (!e || !e.relatedTarget || !tileOf2(e.relatedTarget))) hide();\n    };\n    const onKey = (e) => {\n      if (e && e.key === \"Escape\" && card && !card.hidden) {\n        hide();\n        if (e.stopPropagation) e.stopPropagation();\n        if (e.preventDefault) e.preventDefault();\n      }\n    };\n    const onScroll = () => {\n      if (card && !card.hidden) hide();\n    };\n    const onDown = (e) => {\n      if (e && e.pointerType === \"touch\") hide();\n    };\n    listEl.addEventListener(\"pointermove\", onMove, { passive: true });\n    listEl.addEventListener(\"pointerover\", onMove, { passive: true });\n    listEl.addEventListener(\"pointerout\", onLeave, { passive: true });\n    listEl.addEventListener(\"pointerleave\", onLeave, { passive: true });\n    listEl.addEventListener(\"pointerdown\", onDown, { passive: true });\n    listEl.addEventListener(\"focusin\", onFocus);\n    listEl.addEventListener(\"focusout\", onBlur);\n    doc2.addEventListener(\"keydown\", onKey, true);\n    win2.addEventListener(\"scroll\", onScroll, { passive: true, capture: true });\n    let mo = null;\n    try {\n      const host = o.hideWith || listEl.closest && listEl.closest(\"[data-ub-flyout],[hidden]\") || null;\n      if (host && win2.MutationObserver) {\n        mo = new win2.MutationObserver(() => {\n          if (host.hidden) hide();\n        });\n        mo.observe(host, { attributes: true, attributeFilter: [\"hidden\"] });\n      }\n    } catch {\n      mo = null;\n    }\n    return {\n      el: () => card,\n      hide,\n      detach() {\n        hide();\n        listEl.removeEventListener(\"pointermove\", onMove);\n        listEl.removeEventListener(\"pointerover\", onMove);\n        listEl.removeEventListener(\"pointerout\", onLeave);\n        listEl.removeEventListener(\"pointerleave\", onLeave);\n        listEl.removeEventListener(\"pointerdown\", onDown);\n        listEl.removeEventListener(\"focusin\", onFocus);\n        listEl.removeEventListener(\"focusout\", onBlur);\n        doc2.removeEventListener(\"keydown\", onKey, true);\n        win2.removeEventListener(\"scroll\", onScroll, true);\n        if (mo) mo.disconnect();\n        if (card && card.parentNode) card.parentNode.removeChild(card);\n        card = null;\n      }\n    };\n  }\n\n  // v2/src/ui/kitchen-materials.js\n  var DECORS = [\"white\", \"w1100\", \"oak\"];\n  var DECOR_NAME = { white: \"White\", w1100: \"W1100 Egger ST9\", oak: \"Casella Oak\" };\n  var DECOR_HEX = { white: \"#f4f4f1\", w1100: \"#ffffff\", oak: \"#b08b65\" };\n  var hexCss3 = (h) => \"#\" + h.toString(16).padStart(6, \"0\");\n  function createKitchenMaterials(ctx) {\n    let ed = {};\n    try {\n      ed = build2(ctx);\n    } catch (e) {\n      return { error: e };\n    }\n    return {\n      sync() {\n        try {\n          if (ed.sync) ed.sync();\n        } catch (e) {\n          ed.error = e;\n        }\n      },\n      open(which) {\n        if (ed.open) ed.open(which);\n      },\n      close() {\n        if (ed.close) ed.close();\n      },\n      isOpen() {\n        return ed.isOpen ? ed.isOpen() : null;\n      }\n    };\n  }\n  function swatchCss(kind, k, oakTex) {\n    if (kind === \"doors\" && k.frontMat === \"mdf-paint\") {\n      const t = hexCss3(toneOf(k.paint.tone).hex);\n      return paintFinishOf(k.paint.finish).gloss ? \"radial-gradient(circle at 32% 28%, rgba(255,255,255,.75) 0, rgba(255,255,255,0) 42%), \" + t : t;\n    }\n    const key = kind === \"doors\" ? k.fronts : k.carcass;\n    if (key === \"oak\" && oakTex) return 'url(\"' + String(oakTex).replace(/[\"\\\\]/g, \"\") + '\") center / 260% auto, ' + DECOR_HEX.oak;\n    if (DECOR_HEX[key]) return DECOR_HEX[key];\n    return decorOf(key) ? decorSwatchCss(decorOf(key), 96) : DECOR_HEX.white;\n  }\n  function swatchShort(kind, k) {\n    if (kind === \"doors\" && k.frontMat === \"mdf-paint\") return \"Painted, \" + toneOf(k.paint.tone).name;\n    const key = kind === \"doors\" ? k.fronts : k.carcass;\n    return DECOR_NAME[key] || finishShort(key);\n  }\n  function swatchWords(kind, k) {\n    if (kind === \"doors\" && k.frontMat === \"mdf-paint\")\n      return \"Painted MDF (supplied primed), preview \" + paintFinishOf(k.paint.finish).name.toLowerCase() + \", \" + (k.paint.ref ? \"colour \" + k.paint.ref : \"previewed in \" + toneOf(k.paint.tone).name.toLowerCase());\n    const key = kind === \"doors\" ? k.fronts : k.carcass;\n    return finishLabel(key);\n  }\n  function build2(ctx) {\n    const root = ctx.root, doc2 = ctx.doc;\n    const wrap = root.querySelector(\"[data-ub-kmats]\");\n    const pop = root.querySelector(\"[data-ub-kmatpop]\");\n    const box3 = pop && pop.querySelector(\"[data-ub-kitmat]\");\n    if (!wrap || !pop || !box3 || !doc2) return {};\n    const btns = {}, dots = {};\n    wrap.querySelectorAll(\"[data-ub-kmat]\").forEach((b) => {\n      btns[b.getAttribute(\"data-ub-kmat\")] = b;\n      dots[b.getAttribute(\"data-ub-kmat\")] = b.querySelector(\"[data-ub-kmatdot]\");\n    });\n    const title = pop.querySelector(\"[data-ub-kmattitle]\");\n    const oakHost = root.closest ? root.closest(\"[data-ub-oak-tex]\") || root.querySelector(\"[data-ub-oak-tex]\") : null;\n    const oakTex = root.getAttribute && root.getAttribute(\"data-ub-oak-tex\") || oakHost && oakHost.getAttribute(\"data-ub-oak-tex\") || \"\";\n    const el = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const act = (args) => ctx.act(\"kitchen.materials\", args);\n    const kitchen = () => kitchenOf2(ctx.scene().kitchen);\n    const st = { open: null };\n    const pressed2 = [];\n    function choice(parent, cls, attrs, isOn, args) {\n      const b = el(\"button\", cls, Object.assign({ type: \"button\", \"aria-pressed\": \"false\" }, attrs));\n      b.addEventListener(\"click\", () => act(args()));\n      parent.appendChild(b);\n      pressed2.push([b, isOn]);\n      return b;\n    }\n    function decorChoice(parent, km, key, isOn, args) {\n      const dd = decorOf(key);\n      const cell = el(\"span\", \"ub-lab__kcell\", { \"data-ub-kcell\": key });\n      parent.appendChild(cell);\n      const b = choice(cell, \"ub-lab__kopt\", { \"data-ub-km\": km, \"data-ub-val\": key, title: MATERIALS[key].label }, isOn, args);\n      b.appendChild(el(\"span\", \"ub-lab__kdot\", {\n        \"aria-hidden\": \"true\",\n        style: \"background:\" + swatchCss(\"carcass\", { carcass: key }, oakTex)\n      }));\n      b.appendChild(el(\"span\", \"ub-lab__koptname\", {}, DECOR_NAME[key]));\n      if (dd) {\n        b.appendChild(el(\"span\", \"ub-lab__dpkcode\", { \"aria-hidden\": \"true\" }, dd.code));\n        const z = el(\"button\", \"ub-lab__dpkzoom\", {\n          type: \"button\",\n          \"data-ub-dpkzoom\": key,\n          \"aria-label\": \"View whole board: \" + dd.code + \" \" + dd.tex + \" \" + dd.name,\n          title: \"View whole board - \" + dd.code + \" \" + dd.tex\n        });\n        z.innerHTML = '<svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M8.5 3a5.5 5.5 0 1 1 0 11a5.5 5.5 0 0 1 0-11zm0 2.6v5.8M5.6 8.5h5.8M12.6 12.6l4.4 4.4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n        z.addEventListener(\"click\", (e) => {\n          if (e && e.stopPropagation) e.stopPropagation();\n          decorViewerFor(doc2, root).open(dd, { opener: z, onUse: null });\n        });\n        cell.appendChild(z);\n      }\n      return b;\n    }\n    const scopeLine = (parent, what) => {\n      const p = el(\"p\", \"ub-lab__kscope\", {});\n      p.appendChild(el(\"b\", \"ub-lab__kchip\", { title: what + \" - the whole kitchen and every cabinet you add\" }, \"Whole kitchen\"));\n      p.appendChild(el(\"span\", \"\", { \"data-ub-kscopetext\": \"\" }));\n      parent.appendChild(p);\n      return p;\n    };\n    function safePicker(parent, o) {\n      try {\n        const p = createDecorPicker(doc2, Object.assign({ viewOnly: true }, o));\n        parent.appendChild(p.el);\n        return p;\n      } catch {\n        return { sync() {\n        } };\n      }\n    }\n    const tabs = [];\n    const rows = (sec) => {\n      const top = el(\"div\", \"ub-lab__ktop\", { \"data-ub-ktop\": \"\" }), row = el(\"div\", \"ub-lab__krow\", { \"data-ub-krow\": \"\" });\n      sec.appendChild(top);\n      sec.appendChild(row);\n      const sw = el(\"div\", \"ub-lab__ktabs\", { role: \"group\", \"aria-label\": \"Material for\" });\n      for (const [k, word] of [[\"carcass\", \"Carcass\"], [\"doors\", \"Doors\"]]) {\n        const t = el(\"button\", \"ub-lab__btn ub-lab__ktab\", { type: \"button\", \"data-ub-kmattab\": k, \"aria-pressed\": \"false\" }, word);\n        t.addEventListener(\"click\", () => {\n          if (st.open !== k) open(k);\n        });\n        sw.appendChild(t);\n        tabs.push(t);\n      }\n      top.appendChild(sw);\n      return [top, row];\n    };\n    const group = (row, caption, cls) => {\n      const g2 = el(\"div\", \"ub-lab__kgrp\" + (cls ? \" \" + cls : \"\"), {});\n      g2.appendChild(el(\"span\", \"ub-lab__rsub\", {}, caption));\n      row.appendChild(g2);\n      return g2;\n    };\n    const liftPicker = (pk, top) => {\n      if (!pk || !pk.el || !pk.search) return;\n      const chips = pk.el.querySelector(\".ub-lab__dpkgroups\"), count = pk.el.querySelector(\".ub-lab__dpkcount\");\n      if (pk.viewBtn) top.appendChild(pk.viewBtn);\n      top.appendChild(pk.search);\n      if (chips) top.appendChild(chips);\n      if (count) top.appendChild(count);\n    };\n    const secC = el(\"div\", \"ub-lab__ksec\", { \"data-ub-kmsec\": \"carcass\" });\n    box3.appendChild(secC);\n    const [topC, rowCs] = rows(secC);\n    scopeLine(topC, \"Carcasses\");\n    const rowC = el(\"div\", \"ub-lab__kopts\", { role: \"group\", \"aria-label\": \"Carcass decor\" });\n    group(rowCs, \"Egger MFC\").appendChild(rowC);\n    for (const key of DECORS) decorChoice(rowC, \"carcass\", key, () => kitchen().carcass === key, () => ({ carcass: key }));\n    const pickC = safePicker(group(rowCs, \"All Egger decors\", \"ub-lab__kgrp--all\"), {\n      id: \"carcass\",\n      label: \"Carcass decor, all Egger MFC\",\n      isOn: (key) => kitchen().carcass === key,\n      onPick: (key) => act({ carcass: key })\n    });\n    liftPicker(pickC, topC);\n    const secD = el(\"div\", \"ub-lab__ksec\", { \"data-ub-kmsec\": \"doors\" });\n    box3.appendChild(secD);\n    const [topD, rowDs] = rows(secD);\n    scopeLine(topD, \"Doors\");\n    const rowD = el(\"div\", \"ub-lab__kopts\", { role: \"group\", \"aria-label\": \"Door decor, Egger MFC\" });\n    group(rowDs, \"Egger MFC\").appendChild(rowD);\n    for (const key of DECORS)\n      decorChoice(rowD, \"fronts\", key, () => kitchen().frontMat === \"mfc\" && kitchen().fronts === key, () => ({ fronts: key }));\n    const rowT = el(\"div\", \"ub-lab__kopts\", { role: \"group\", \"aria-label\": \"Painted MDF preview colour\" });\n    group(rowDs, \"Painted MDF \\xB7 primed only, colour is a preview \\xB7 quoted\").appendChild(rowT);\n    const pickD = safePicker(group(rowDs, \"All Egger decors\", \"ub-lab__kgrp--all\"), {\n      id: \"fronts\",\n      label: \"Door decor, all Egger MFC\",\n      isOn: (key) => kitchen().frontMat === \"mfc\" && kitchen().fronts === key,\n      onPick: (key) => act({ fronts: key })\n    });\n    liftPicker(pickD, topD);\n    if (pickD && pickD.el) attachDecorHover(pickD.el, { item: \".ub-lab__dpkrow\", info: (b) => {\n      const d = decorOf(b.getAttribute(\"data-ub-decor\")), im = b.querySelector(\"img\");\n      const src = im && (im.currentSrc || im.getAttribute(\"src\"));\n      if (!d || !src) return null;\n      return { src, full: decorImageUrl(d, 640), name: d.code + \" \" + d.name };\n    } });\n    const flatNote = el(\n      \"p\",\n      \"ub-lab__knote\",\n      { \"data-ub-kmflat\": \"\" },\n      \"Egger MFC doors are flat: choosing one also sets flat fronts.\"\n    );\n    for (const t of PAINT_TONES) {\n      const b = choice(\n        rowT,\n        \"ub-lab__kopt\",\n        { \"data-ub-km\": \"tone\", \"data-ub-val\": t.id, title: \"Painted MDF, previewed in \" + t.name },\n        () => kitchen().frontMat === \"mdf-paint\" && kitchen().paint.tone === t.id,\n        () => ({ paint: { tone: t.id } })\n      );\n      b.appendChild(el(\"span\", \"ub-lab__kdot\", { \"aria-hidden\": \"true\", style: \"background:\" + hexCss3(t.hex) }));\n      b.appendChild(el(\"span\", \"ub-lab__koptname\", {}, t.name));\n    }\n    const paintBox = el(\"div\", \"ub-lab__kpaint\", { \"data-ub-kpaint\": \"\" });\n    topD.insertBefore(paintBox, topD.children[2] || null);\n    paintBox.appendChild(el(\"span\", \"ub-lab__rsub\", {}, \"Preview sheen\"));\n    const rowF = el(\"div\", \"ub-lab__kchips\", { role: \"group\", \"aria-label\": \"Preview sheen\" });\n    paintBox.appendChild(rowF);\n    for (const f of PAINT_FINISHES) {\n      const b = choice(\n        rowF,\n        \"ub-lab__btn ub-lab__kbtn\",\n        {\n          \"data-ub-km\": \"paintFinish\",\n          \"data-ub-val\": f.id,\n          title: f.name + \" - preview only: the MDF is supplied with a water-based primer, not a finished colour\"\n        },\n        () => kitchen().frontMat === \"mdf-paint\" && kitchen().paint.finish === f.id,\n        () => ({ paint: { finish: f.id } })\n      );\n      b.textContent = f.name;\n    }\n    const refLab = el(\"label\", \"ub-lab__kref\", {});\n    refLab.appendChild(el(\"span\", \"ub-lab__rsub\", {}, \"Your colour (RAL, NCS or brand name) - for the preview\"));\n    const ref = el(\"input\", \"ub-lab__secw\", {\n      type: \"text\",\n      maxlength: \"40\",\n      \"data-ub-kmref\": \"\",\n      placeholder: \"e.g. RAL 9010 - we supply primed MDF, not painted\",\n      autocomplete: \"off\"\n    });\n    refLab.appendChild(ref);\n    paintBox.appendChild(refLab);\n    const applyRef = () => {\n      const k = kitchen();\n      if ((k.paint && k.paint.ref) !== ref.value.trim()) act({ paint: { ref: ref.value } });\n    };\n    ref.addEventListener(\"change\", applyRef);\n    ref.addEventListener(\"keydown\", (e) => {\n      if (e && e.key === \"Enter\") {\n        if (e.preventDefault) e.preventDefault();\n        applyRef();\n      }\n    });\n    const note = el(\"p\", \"ub-lab__knote\", { \"data-ub-kmnote\": \"\", \"aria-live\": \"polite\" });\n    topD.appendChild(flatNote);\n    topD.appendChild(note);\n    const exc = el(\"p\", \"ub-lab__knote ub-lab__kexc\", { \"data-ub-kmexc\": \"\" });\n    box3.appendChild(exc);\n    function place2() {\n      if (!st.open) return;\n      try {\n        placeBottom(root, pop);\n      } catch {\n      }\n    }\n    function slimRow(sec) {\n      if (!sec || !sec.querySelectorAll) return;\n      try {\n        const s2 = sec.querySelector(\"[data-ub-dpksearch]\");\n        if (s2 && s2.value) {\n          s2.value = \"\";\n          const E = win2 && win2.Event || globalThis.Event;\n          if (E) s2.dispatchEvent(new E(\"input\", { bubbles: true }));\n        }\n        const all = sec.querySelector('[data-ub-dpkgroup=\"all\"]');\n        if (all && all.getAttribute(\"aria-pressed\") !== \"true\" && all.click) all.click();\n      } catch {\n      }\n      for (const b of sec.querySelectorAll(\".ub-lab__kopt, .ub-lab__dpkrow\")) {\n        if (b.getAttribute(\"aria-label\")) continue;\n        const t = (b.getAttribute(\"title\") || b.textContent || \"\").trim();\n        if (t) b.setAttribute(\"aria-label\", t);\n      }\n    }\n    function open(which) {\n      if (!btns[which]) return;\n      if (root.__ubDocks) {\n        try {\n          root.__ubDocks.show(null);\n          root.__ubDocks.eye(false);\n        } catch {\n        }\n      }\n      st.open = which;\n      secC.hidden = which !== \"carcass\";\n      secD.hidden = which !== \"doors\";\n      if (title) title.textContent = which === \"carcass\" ? \"Carcass\" : \"Doors & drawer fronts\";\n      pop.setAttribute(\"aria-label\", (which === \"carcass\" ? \"Carcasses\" : \"Doors and drawer fronts\") + \" material, whole kitchen\");\n      pop.removeAttribute(\"hidden\");\n      for (const t of tabs) {\n        const on = t.getAttribute(\"data-ub-kmattab\") === which;\n        t.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        t.classList.toggle(\"is-active\", on);\n      }\n      for (const r of pop.querySelectorAll(\"[data-ub-ktop], [data-ub-krow]\")) r.scrollLeft = 0;\n      sync();\n      slimRow(which === \"carcass\" ? secC : secD);\n      place2();\n      const first = pop.querySelector('[data-ub-kmsec=\"' + which + '\"] [aria-pressed=\"true\"]') || pop.querySelector('[data-ub-kmsec=\"' + which + '\"] button');\n      if (first && first.focus) first.focus();\n    }\n    function close(back) {\n      if (!st.open) return;\n      const was = btns[st.open];\n      st.open = null;\n      pop.setAttribute(\"hidden\", \"\");\n      sync();\n      if (back && was && was.focus) was.focus();\n    }\n    for (const k of Object.keys(btns)) btns[k].addEventListener(\"click\", (e) => {\n      if (e && e.stopPropagation) e.stopPropagation();\n      if (st.open === k) close(false);\n      else open(k);\n    });\n    const x = pop.querySelector(\"[data-ub-kmatclose]\");\n    if (x) x.addEventListener(\"click\", () => close(true));\n    const win2 = ctx.win || doc2.defaultView;\n    if (win2) {\n      win2.addEventListener(\"keydown\", (e) => {\n        if (e && e.key === \"Escape\" && st.open) close(true);\n      });\n      doc2.addEventListener(\"pointerdown\", (e) => {\n        if (!st.open) return;\n        const t = e && e.target;\n        if (t && (pop.contains(t) || wrap.contains(t))) return;\n        if (t && t.closest && t.closest(\"[data-ub-dview]\")) return;\n        close(false);\n      }, true);\n    }\n    root.querySelectorAll(\"[data-ub-fly], [data-ub-eye]\").forEach((b) => b.addEventListener(\"click\", () => close(false)));\n    function sync() {\n      const s = ctx.scene(), k = kitchen(), units = s.units || [];\n      for (const kind of Object.keys(btns)) {\n        const words2 = swatchWords(kind, k), name2 = kind === \"carcass\" ? \"Carcass\" : \"Doors\";\n        const b = btns[kind];\n        b.setAttribute(\"aria-label\", name2 + \": \" + words2 + \" - whole kitchen\");\n        b.setAttribute(\"title\", name2 + \": \" + swatchShort(kind, k));\n        b.setAttribute(\"aria-expanded\", st.open === kind ? \"true\" : \"false\");\n        b.setAttribute(\"data-ub-kmatval\", kind === \"doors\" && k.frontMat === \"mdf-paint\" ? \"paint:\" + k.paint.tone : kind === \"doors\" ? k.fronts : k.carcass);\n        b.classList.toggle(\"is-active\", st.open === kind);\n        if (dots[kind]) dots[kind].setAttribute(\"style\", \"background:\" + swatchCss(kind, k, oakTex));\n      }\n      try {\n        if (st.open === \"carcass\") pickC.sync();\n        if (st.open === \"doors\") pickD.sync();\n      } catch {\n      }\n      for (const [b, isOn] of pressed2) {\n        const on = !!isOn();\n        b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      }\n      const n = units.length;\n      pop.querySelectorAll(\"[data-ub-kscopetext]\").forEach((t) => {\n        t.textContent = \" \\xB7 all \" + n + \" cabinet\" + (n === 1 ? \"\" : \"s\") + \", islands included, and every cabinet you add.\";\n      });\n      const painted = k.frontMat === \"mdf-paint\";\n      if (painted) paintBox.removeAttribute(\"hidden\");\n      else paintBox.setAttribute(\"hidden\", \"\");\n      flatNote.hidden = !styleOf(k.frontStyle).routed;\n      flatNote.textContent = k.frontStyle === \"jpull\" ? \"J-pull fronts are painted MDF only: choosing an Egger MFC decor also sets flat fronts.\" : \"Egger MFC doors are flat: choosing one also sets flat fronts.\";\n      if (doc2.activeElement !== ref) ref.value = k.paint.ref || \"\";\n      note.textContent = painted ? \"Painted MDF doors are supplied with a water-based primer only, ready for your painter - we do not supply a top coat, a colour or a sheen; the colour and sheen here are a preview. The primed MDF doors are quoted: not in the cut-list price, they go to the enquiry with their sizes. Carcasses stay priced.\" : \"Egger MFC doors are in the cut-list price, cut and edged like the carcasses.\";\n      note.title = note.textContent;\n      const own2 = units.filter(isCustom);\n      exc.textContent = own2.length ? \"Set on its own: \" + own2.map((v) => displayName(units, v)).join(\", \") + \". A choice here applies to them too; set one cabinet with its finishes button.\" : \"For one cabinet only, select it and use its finishes button.\";\n      exc.title = exc.textContent;\n      if (st.open) place2();\n    }\n    sync();\n    if (ctx.win && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n      try {\n        qaFromAddress();\n        sync();\n      } catch {\n      }\n    }, 600);\n    return { sync, open, close: () => close(false), isOpen: () => st.open };\n    function qaFromAddress() {\n      const loc = ctx.win && ctx.win.location || {};\n      const hm = /^#ub-(carcass|doors)$/.exec(String(loc.hash || \"\"));\n      if (hm) open(hm[1]);\n      if (!loc.search || !/^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\"))) return;\n      const q = (k) => {\n        const m = new RegExp(\"[?&]\" + k + \"=([a-z0-9-]+)\").exec(loc.search);\n        return m ? m[1] : null;\n      };\n      const c = q(\"qa_carcass\"), d = q(\"qa_doors\"), args = {};\n      if (c && finishLabel(c) !== c) args.carcass = c;\n      if (d && finishLabel(d) !== d) args.fronts = d;\n      if (args.carcass || args.fronts) act(args);\n      const op = q(\"qa_open\");\n      if (op === \"carcass\" || op === \"doors\") open(op);\n      const qv = q(\"qa_view\");\n      if (qv && st.open) {\n        const z = pop.querySelector('[data-ub-kmsec=\"' + st.open + '\"] [data-ub-dpkzoom=\"' + qv + '\"]');\n        if (z) {\n          if (z.scrollIntoView) z.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n          z.click();\n        }\n      }\n      const num6 = (k) => {\n        const m = new RegExp(\"[?&]\" + k + \"=(\\\\d{1,4})\\\\b\").exec(loc.search);\n        return m ? m[1] : null;\n      };\n      const n = num6(\"qa_unit\"), units = ctx.scene().units || [];\n      if (n && units[Number(n) - 1]) ctx.act(\"select\", { id: units[Number(n) - 1].id });\n      for (const [k, v] of [[\"w\", num6(\"qa_w\")], [\"h\", num6(\"qa_h\")]]) if (v) ctx.act(\"unit.dim\", { k, raw: v });\n      if (/[?&]qa_diag=1/.test(loc.search) && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        try {\n          const sc = ctx.scene(), u = (sc.units || []).find((v) => v.id === sc.selectedId), V3 = ctx.view;\n          const cs = V3.canvasSize(), cv = root.querySelector(\".ub-lab__canvas\"), r = cv ? cv.getBoundingClientRect() : null;\n          const pj = (w) => {\n            const nd = V3.worldToNdc(w);\n            return nd ? [Math.round((nd[0] + 1) / 2 * cs.w), Math.round((1 - nd[1]) / 2 * cs.h)] : null;\n          };\n          const out = {\n            sel: u && [u.type, u.x, u.y, u.z, u.w, u.h, u.d, u.rot],\n            cs: [cs.w, cs.h],\n            rect: r && [Math.round(r.left), Math.round(r.top), Math.round(r.width), Math.round(r.height)],\n            all: (sc.units || []).map((v) => [v.type, v.x, v.z, v.rot, v.dispX || 0]),\n            fl: u && pj([u.x, u.y || 0, u.z + u.d]),\n            fr: u && pj([u.x + u.w, u.y || 0, u.z + u.d]),\n            tl: u && pj([u.x, (u.y || 0) + u.h, u.z + u.d])\n          };\n          ctx.win.document.title = \"QA \" + JSON.stringify(out);\n        } catch (e) {\n          ctx.win.document.title = \"QA err \" + (e && e.message);\n        }\n      }, 2500);\n      const dm = /[?&]qa_dbl=(rotate|pan|size|cabinet|all)\\b/.exec(loc.search);\n      if (dm && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [];\n        try {\n          const P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj, sc = P2.sceneRef(), ia = P2.__v2.interaction();\n          const us = sc.units.slice().sort((x2, y) => x2.x - y.x), c1 = us[0], c2 = us.find((u) => u.type === \"base-drawer\") || us[1];\n          sc.selectedId = c1.id;\n          c1.door = true;\n          ia.commands.run(\"addDrawer\", {});\n          sc.selectedId = null;\n          P2.setCam(0.3, 0.3);\n          sc.zoom = 1;\n          P2.render();\n          const modes = dm[1] === \"all\" ? [\"rotate\", \"pan\", \"size\", \"cabinet\"] : [dm[1]];\n          for (const md of modes) {\n            ia.setMode(md);\n            P2.render();\n            out.push(\"-- \" + md);\n            const cv = D2.querySelector(\".ub-lab__canvas\"), R4 = cv.getBoundingClientRect(), V3 = ctx.view, cs = V3.canvasSize();\n            const at = (u, f) => {\n              for (const fx of [0.78, 0.65, 0.85, 0.55, 0.7, 0.9, 0.6, 0.4, 0.3]) {\n                const nd = V3.worldToNdc([u.x + u.w * fx, (u.y || 0) + (f.y0 + f.y1) / 2, (u.z || 0) + u.d + 18]);\n                if (!nd) continue;\n                const xy = [R4.left + (nd[0] + 1) / 2 * R4.width, R4.top + (1 - nd[1]) / 2 * R4.height], el2 = D2.elementFromPoint(xy[0], xy[1]);\n                if (el2 === cv) return xy;\n              }\n              return null;\n            };\n            const fire = (x2, y) => {\n              const el2 = D2.elementFromPoint(x2, y);\n              const o = { clientX: x2, clientY: y, bubbles: true, cancelable: true, view: W2, button: 0 };\n              for (const k of [1, 2]) {\n                el2.dispatchEvent(new W2.PointerEvent(\"pointerdown\", { ...o, buttons: 1, pointerId: 7, pointerType: \"mouse\", isPrimary: true }));\n                el2.dispatchEvent(new W2.MouseEvent(\"mousedown\", { ...o, buttons: 1, detail: k }));\n                el2.dispatchEvent(new W2.PointerEvent(\"pointerup\", { ...o, buttons: 0, pointerId: 7, pointerType: \"mouse\", isPrimary: true }));\n                el2.dispatchEvent(new W2.MouseEvent(\"mouseup\", { ...o, buttons: 0, detail: k }));\n                el2.dispatchEvent(new W2.MouseEvent(\"click\", { ...o, buttons: 0, detail: k }));\n              }\n              el2.dispatchEvent(new W2.MouseEvent(\"dblclick\", { ...o, buttons: 0, detail: 2 }));\n              return el2;\n            };\n            const st2 = () => JSON.stringify(sc.units.map((u) => [!!u.doorOpen, !!u.drawerOpen, (u.xopen || []).length]));\n            for (const k of [\"door\", \"preset\", \"added\"]) {\n              const u = k === \"preset\" ? c2 : c1, g2 = ia.commands.run(\"drawerGeometry\", { id: u.id });\n              const f = k === \"door\" ? g2.doors.slice().sort((x2, y) => y.h - x2.h)[0] : k === \"added\" ? g2.fronts.find((q2) => /^Drawer \\d+ front$/.test(q2.name)) : g2.fronts[0];\n              const xy = f && at(u, f);\n              if (!xy) {\n                out.push(k + \": off screen\");\n                continue;\n              }\n              const s0 = st2(), d0 = P2.histDepth().past, el2 = fire(xy[0], xy[1]);\n              const s1 = st2(), d1 = P2.histDepth().past, el22 = fire(xy[0], xy[1]);\n              out.push(k + \" @\" + xy.map(Math.round) + \" on <\" + el2.tagName.toLowerCase() + (el2.className && el2.className.baseVal == null ? \".\" + String(el2.className).split(\" \")[0] : \"\") + \"> open \" + (s1 !== s0) + \" d+\" + (d1 - d0) + \" sel \" + (sc.selectedId === u.id) + \" saw \" + JSON.stringify(ia.ctx.st.lastDbl || null) + \" | 2nd on <\" + el22.tagName.toLowerCase() + \"> back \" + (st2() === s0) + \" d+\" + (P2.histDepth().past - d0) + \" | \" + (P2.histLabels() || []).slice(-3).join(\",\"));\n            }\n          }\n          out.push(\"mode \" + ia.mode() + \" cue \" + (ia.cue() || \"\"));\n        } catch (e) {\n          out.push(\"err \" + (e && e.message));\n        }\n        const box4 = D2.createElement(\"pre\");\n        box4.setAttribute(\"data-ub-qadbl\", \"\");\n        box4.style.cssText = \"position:fixed;left:0;top:0;right:0;z-index:99999;margin:0;padding:6px;background:#111;color:#0f0;font:12px/1.35 monospace;white-space:pre-wrap\";\n        box4.textContent = \"qa_dbl \" + dm[1] + \"\\n\" + out.join(\"\\n\");\n        D2.body.appendChild(box4);\n      }, 2600);\n      const dm2 = /[?&]qa_dsel=(select|top-mid|top-after|undo|bottom-mid|bottom-after)\\b/.exec(loc.search);\n      if (dm2 && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [], phase = dm2[1];\n        let P2 = null, ia = null, c1 = null, d0 = 0;\n        const line = () => {\n          const g2 = ia.commands.run(\"drawerGeometry\", { id: c1.id }), d2 = (nm) => (g2.drawers || []).find((q2) => q2.name === nm), door = (g2.doors || []).find((q2) => q2.name === \"Door\");\n          const f = (q2) => q2 ? q2.fh + \"@\" + q2.fy0 + \" box \" + q2.box : \"-\";\n          return \"D1 \" + f(d2(\"Drawer 1\")) + \" \\xB7 D2 \" + f(d2(\"Drawer 2\")) + \" \\xB7 Door \" + (door ? door.h : \"-\") + \" \\xB7 Undo +\" + (P2.histDepth().past - d0);\n        };\n        const box4 = (txt) => {\n          const b = D2.createElement(\"pre\");\n          b.setAttribute(\"data-ub-qadsel\", \"\");\n          b.style.cssText = \"position:fixed;left:0;top:0;right:0;z-index:99999;margin:0;padding:2px 6px;background:rgba(17,17,17,.82);color:#9effa0;font:10px/1.25 monospace;white-space:pre-wrap\";\n          b.textContent = txt;\n          D2.body.appendChild(b);\n        };\n        try {\n          P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj;\n          ia = P2.__v2.interaction();\n          const sc = P2.sceneRef();\n          c1 = sc.units.slice().sort((x2, y) => x2.x - y.x)[0];\n          c1.door = true;\n          c1.w = 600;\n          c1.h = 720;\n          c1.d = 560;\n          c1.xdr = [{ n: 1, band: 0, col: 0, y: 2, fh: 228, bh: 124 }, { n: 2, band: 0, col: 0, y: 234, fh: 203, bh: 99 }];\n          sc.drawerBox = null;\n          ctx.act(\"select\", { id: c1.id });\n          const cv = D2.querySelector(\".ub-lab__canvas\"), R4 = P2.__v2.renderer();\n          const co = D2.querySelector(\".ub-lab__coach\"), cb = co && co.querySelector(\"button\");\n          if (cb) cb.click();\n          P2.setCam(0.3, 0.22);\n          P2.render();\n          if (W2.innerWidth < 600) {\n            ia.view.fitKitchen(true);\n            P2.render();\n            cv.scrollIntoView({ block: \"center\", inline: \"nearest\" });\n            const want = () => {\n              const r = cv.getBoundingClientRect(), mx = Math.max(r.left, 0) + (Math.min(r.right, W2.innerWidth) - Math.max(r.left, 0)) / 2, my = Math.max(r.top, 0) + (Math.min(r.bottom, W2.innerHeight) - Math.max(r.top, 0)) * 0.45;\n              return [(mx - r.left) / r.width * 2 - 1, 1 - (my - r.top) / r.height * 2];\n            };\n            const proj = () => {\n              R4.renderNow();\n              const I = R4.inspect();\n              I.camera.updateMatrixWorld();\n              const v = new I.THREE.Vector3(c1.x + c1.w / 2, (c1.y || 0) + 330, (c1.z || 0) + c1.d).project(I.camera);\n              return [v.x, v.y];\n            };\n            const centre3 = () => {\n              const t = want();\n              for (let it = 0; it < 5; it++) {\n                const p0 = proj();\n                if (Math.abs(p0[0] - t[0]) < 0.04 && Math.abs(p0[1] - t[1]) < 0.06) break;\n                for (const k of [\"panX\", \"panY\"]) {\n                  const a = k === \"panX\" ? 0 : 1, q0 = proj(), b0 = sc[k] || 0;\n                  sc[k] = b0 + 40;\n                  P2.render();\n                  const q1 = proj(), dd = (q1[a] - q0[a]) / 40;\n                  sc[k] = Math.abs(dd) > 1e-7 ? b0 + (t[a] - q0[a]) / dd : b0;\n                  P2.render();\n                }\n              }\n            };\n            centre3();\n            sc.zoom = (sc.zoom || 1) * 1.5;\n            P2.render();\n            centre3();\n          } else if (R4.focusOn) {\n            R4.focusOn(c1.id);\n            P2.render();\n          }\n          d0 = P2.histDepth().past;\n        } catch (e) {\n          out.push(\"setup err \" + (e && e.message));\n        }\n        W2.setTimeout(() => {\n          try {\n            const g2 = ia.commands.run(\"drawerGeometry\", { id: c1.id }), f = (g2.fronts || []).find((q2) => /^Drawer 2\\b/.test(q2.name));\n            const R4 = P2.__v2.renderer();\n            R4.renderNow();\n            const I = R4.inspect();\n            I.camera.updateMatrixWorld();\n            const cv = D2.querySelector(\".ub-lab__canvas\"), r = cv.getBoundingClientRect();\n            let at = null;\n            for (const fx of [0.35, 0.5, 0.25, 0.65]) {\n              const v = new I.THREE.Vector3(c1.x + c1.w * fx, (c1.y || 0) + (f.y0 + f.y1) / 2, (c1.z || 0) + c1.d + 18).project(I.camera);\n              const x2 = r.left + (v.x + 1) / 2 * r.width, y = r.top + (1 - v.y) / 2 * r.height;\n              if (D2.elementFromPoint(x2, y) === cv) {\n                at = [x2, y];\n                break;\n              }\n            }\n            if (at) {\n              const o = { clientX: at[0], clientY: at[1], bubbles: true, cancelable: true, view: W2, button: 0 };\n              cv.dispatchEvent(new W2.MouseEvent(\"mousedown\", { ...o, buttons: 1 }));\n              W2.dispatchEvent(new W2.MouseEvent(\"mouseup\", { ...o, buttons: 0 }));\n            }\n            const sc = P2.sceneRef();\n            out.push(\"SYNTHETIC replay on the stand (real handlers; trusted proof = server browser-flows) \\xB7 click Drawer 2 -> chosen \" + (sc.drawerBox && sc.drawerBox.id === c1.id ? \"Drawer \" + (((g2.drawers || []).find((q2) => q2.i === sc.drawerBox.i) || {}).name || \"?\").replace(\"Drawer \", \"\") : \"none\") + \" \\xB7 \" + line());\n            if (phase !== \"select\") {\n              W2.setTimeout(() => {\n                try {\n                  const edge = /^bottom/.test(phase) ? \"bottom\" : \"top\";\n                  const el2 = D2.querySelector('[data-ub-seam][data-ub-edge=\"' + edge + '\"]');\n                  if (!el2 || el2.hidden) {\n                    out.push(edge + \" edge strip not on screen\");\n                    box4(out.join(\"\\n\"));\n                    return;\n                  }\n                  const q2 = el2.getBoundingClientRect(), x2 = q2.left + q2.width / 2, y = q2.top + q2.height / 2, dy = edge === \"top\" ? -30 : 30;\n                  const o = (yy, b) => ({ clientX: x2, clientY: yy, bubbles: true, cancelable: true, view: W2, button: 0, buttons: b, pointerId: 9, pointerType: \"mouse\", isPrimary: true });\n                  el2.dispatchEvent(new W2.PointerEvent(\"pointerenter\", o(y, 0)));\n                  el2.dispatchEvent(new W2.PointerEvent(\"pointerdown\", o(y, 1)));\n                  for (let k = 1; k <= 6; k++) W2.dispatchEvent(new W2.PointerEvent(\"pointermove\", o(y + dy * k / 6, 1)));\n                  out.push(edge + \" edge pressed, moved \" + Math.abs(dy) + \" px \" + (dy < 0 ? \"up\" : \"down\") + (/-mid$/.test(phase) ? \", HELD: \" : \", released: \") + line());\n                  if (!/-mid$/.test(phase)) {\n                    W2.dispatchEvent(new W2.PointerEvent(\"pointerup\", o(y + dy, 0)));\n                    el2.dispatchEvent(new W2.PointerEvent(\"pointerleave\", o(y + dy, 0)));\n                    out[out.length - 1] = edge + \" edge dragged \" + Math.abs(dy) + \" px \" + (dy < 0 ? \"up\" : \"down\") + \" and released: \" + line();\n                    if (phase === \"undo\") {\n                      const ub = D2.querySelector(\"[data-ub-undo]\");\n                      if (ub) ub.click();\n                      out.push(\"then Undo: \" + line());\n                    }\n                  }\n                  P2.render();\n                } catch (e) {\n                  out.push(\"gesture err \" + (e && e.message));\n                }\n                box4(out.join(\"\\n\"));\n              }, 600);\n            } else box4(out.join(\"\\n\"));\n          } catch (e) {\n            out.push(\"click err \" + (e && e.message));\n            box4(out.join(\"\\n\"));\n          }\n        }, 1400);\n      }, 2600);\n      const sm2 = /[?&]qa_seam=(before|up|bottom|cancel|undo)\\b/.exec(loc.search);\n      if (sm2 && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [], phase = sm2[1];\n        let P2 = null, ia = null, c1 = null;\n        const geo = () => {\n          const g2 = ia.commands.run(\"drawerGeometry\", { id: c1.id });\n          const door = (g2.doors || []).find((q2) => q2.name === \"Door\") || (g2.doors || [])[0];\n          return { g: g2, line: (g2.drawers || []).slice().sort((a, b) => a.fy0 - b.fy0).map((d2) => d2.name + \" front \" + d2.fh + \" at \" + d2.fy0 + \", box \" + (d2.box && d2.box.h != null ? d2.box.h : JSON.stringify(d2.box)) + \" from \" + d2.by0).join(\" | \") + \" | Door \" + (door ? door.h + \" (\" + door.y0 + \"-\" + door.y1 + \")\" : \"none\") };\n        };\n        try {\n          P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj;\n          ia = P2.__v2.interaction();\n          const sc = P2.sceneRef();\n          c1 = sc.units.slice().sort((x2, y) => x2.x - y.x)[0];\n          c1.door = true;\n          c1.w = 600;\n          c1.h = 720;\n          c1.d = 560;\n          c1.xdr = [{ n: 1, band: 0, col: 0, y: 2, fh: 228, bh: 124 }, { n: 2, band: 0, col: 0, y: 234, fh: 203, bh: 99 }];\n          ctx.act(\"select\", { id: c1.id });\n          P2.setCam(0.12, 0.1);\n          P2.render();\n          const R0 = P2.__v2.renderer && P2.__v2.renderer();\n          if (R0 && R0.focusOn) {\n            R0.focusOn(c1.id);\n            P2.render();\n          }\n          if (root.__ubDocks) root.__ubDocks.show(\"drawers\");\n          ctx.act(\"drawer.box\", { i: 1 });\n          out.push(\"FIXTURE (set, not a gesture): Cabinet 1 \" + [c1.w, c1.h, c1.d].join(\" x \") + \"  shelf \" + JSON.stringify((c1.interior || {}).shelves));\n          out.push(\"before: \" + geo().line + \"   Undo steps \" + P2.histDepth().past);\n        } catch (e) {\n          out.push(\"setup err \" + (e && e.message));\n        }\n        W2.setTimeout(() => {\n          try {\n            if (phase !== \"before\") {\n              const g2 = geo().g, seams = g2.seams || [];\n              const want = phase === \"bottom\" ? 232 : 439;\n              const s = seams.slice().sort((a, b) => Math.abs(a.y - want) - Math.abs(b.y - want))[0];\n              const el2 = s && [...D2.querySelectorAll(\"[data-ub-seam]\")].find((q2) => q2.getAttribute(\"data-ub-seam\") === s.key && !q2.hasAttribute(\"hidden\"));\n              out.push(\"GESTURE (synthetic pointer events through the real joint strip): seam \" + (s ? s.key + \" at \" + s.y + \" (\" + s.a + \" / \" + s.b + \")\" : \"none\") + (el2 ? \"\" : \" - strip not on screen\"));\n              if (el2) {\n                const r = el2.getBoundingClientRect(), x2 = r.left + r.width / 2, y = r.top + r.height / 2, d0 = P2.histDepth().past;\n                const o = (yy, b) => ({ clientX: x2, clientY: yy, bubbles: true, cancelable: true, view: W2, button: 0, buttons: b, pointerId: 9, pointerType: \"mouse\", isPrimary: true });\n                el2.dispatchEvent(new W2.PointerEvent(\"pointerdown\", o(y, 1)));\n                const dy = phase === \"bottom\" ? -24 : -36;\n                for (let k = 1; k <= 8; k++) W2.dispatchEvent(new W2.PointerEvent(\"pointermove\", o(y + dy * k / 8, 1)));\n                out.push(\"mid-drag: \" + geo().line);\n                if (phase === \"cancel\") W2.dispatchEvent(new W2.KeyboardEvent(\"keydown\", { key: \"Escape\", bubbles: true, cancelable: true }));\n                else W2.dispatchEvent(new W2.PointerEvent(\"pointerup\", o(y + dy, 0)));\n                out.push((phase === \"cancel\" ? \"after Escape: \" : \"after release: \") + geo().line + \"   Undo steps +\" + (P2.histDepth().past - d0) + \" \" + JSON.stringify((P2.histLabels() || []).slice(-1)));\n                if (phase === \"undo\") {\n                  const ub = D2.querySelector(\"[data-ub-undo]\");\n                  if (ub) ub.click();\n                  out.push(\"after one Undo: \" + geo().line + \"   Undo steps +\" + (P2.histDepth().past - d0));\n                }\n              }\n            }\n            P2.render();\n          } catch (e) {\n            out.push(\"gesture err \" + (e && e.message));\n          }\n          const box4 = D2.createElement(\"pre\");\n          box4.setAttribute(\"data-ub-qaseam\", \"\");\n          box4.style.cssText = \"position:fixed;left:0;top:0;right:0;z-index:99999;margin:0;padding:4px 6px;background:rgba(17,17,17,.88);color:#7CFC00;font:11px/1.3 monospace;white-space:pre-wrap\";\n          box4.textContent = \"qa_seam \" + phase + \"\\n\" + out.join(\"\\n\");\n          D2.body.appendChild(box4);\n        }, 1200);\n      }, 2600);\n      const qs = /[?&]qa_shelf=(closed|open|selected|edited|shut|room|back)\\b/.exec(loc.search);\n      if (qs && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [], later = [], phase = qs[1], ORDER = [\"closed\", \"open\", \"selected\", \"edited\", \"shut\"];\n        const side = phase === \"room\" || phase === \"back\";\n        const upto = (p) => side ? ORDER.indexOf(p) <= ORDER.indexOf(\"selected\") : ORDER.indexOf(phase) >= ORDER.indexOf(p);\n        try {\n          const P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj, sc = P2.sceneRef(), ia = P2.__v2.interaction(), pr = ia.inside.probe;\n          const c1 = sc.units.slice().sort((x2, y) => x2.x - y.x)[0];\n          c1.door = true;\n          c1.doorOpen = false;\n          c1.interior = { shelves: 2, shelfList: [{ id: \"S1\", cell: \"0.0\", y: 229 }, { id: \"S2\", cell: \"0.0\", y: 421 }] };\n          sc.selectedId = c1.id;\n          sc.selPart = null;\n          ia.setMode(\"rotate\");\n          P2.setCam(-0.32, 0.22);\n          sc.zoom = 1;\n          const R0 = P2.__v2.renderer && P2.__v2.renderer();\n          if (R0 && R0.focusOn) R0.focusOn(c1.id);\n          const zm = /[?&]qa_zoom=([\\d.]+)/.exec(loc.search);\n          sc.zoom = zm ? +zm[1] : 0.3;\n          P2.render();\n          const cv = D2.querySelector(\".ub-lab__canvas\");\n          W2.scrollTo(0, cv.getBoundingClientRect().top + W2.scrollY - 8);\n          const R4 = cv.getBoundingClientRect(), V3 = ctx.view, B = pr.bounds(c1);\n          const scr = (w) => {\n            const nd = V3.worldToNdc(w);\n            return nd ? [R4.left + (nd[0] + 1) / 2 * R4.width, R4.top + (1 - nd[1]) / 2 * R4.height] : null;\n          };\n          const fire = (x2, y) => {\n            const el2 = D2.elementFromPoint(x2, y);\n            const o = { clientX: x2, clientY: y, bubbles: true, cancelable: true, view: W2, button: 0 };\n            for (const k of [1, 2]) {\n              el2.dispatchEvent(new W2.PointerEvent(\"pointerdown\", { ...o, buttons: 1, pointerId: 7, pointerType: \"mouse\", isPrimary: true }));\n              el2.dispatchEvent(new W2.MouseEvent(\"mousedown\", { ...o, buttons: 1, detail: k }));\n              el2.dispatchEvent(new W2.PointerEvent(\"pointerup\", { ...o, buttons: 0, pointerId: 7, pointerType: \"mouse\", isPrimary: true }));\n              el2.dispatchEvent(new W2.MouseEvent(\"mouseup\", { ...o, buttons: 0, detail: k }));\n              el2.dispatchEvent(new W2.MouseEvent(\"click\", { ...o, buttons: 0, detail: k }));\n            }\n            el2.dispatchEvent(new W2.MouseEvent(\"dblclick\", { ...o, buttons: 0, detail: 2 }));\n            return el2.tagName.toLowerCase() + (el2 === cv ? \"(canvas)\" : \"\");\n          };\n          const state2 = () => {\n            const sl = (c1.interior || {}).shelfList || [];\n            return \"door \" + (c1.doorOpen ? \"OPEN\" : \"shut\") + \" | selected \" + (sc.selPart || \"none\") + \" | tool \" + (ia.inside.tool() || \"none\") + \" | mode \" + ia.mode() + \"\\n  shelves: \" + sl.map((q2) => {\n              return q2.id + \" y\" + q2.y + (q2.setback != null ? \" setback \" + q2.setback : \"\") + (q2.depth != null ? \" depth \" + q2.depth : \"\");\n            }).join(\" ; \") + \"\\n  Undo steps \" + P2.histDepth().past + \" \" + JSON.stringify((P2.histLabels() || []).slice(-3));\n          };\n          out.push(\"FIXTURE: Cabinet 1 \" + [c1.w, c1.h, c1.d].join(\" x \") + \", door shut, shelves at 229 and 421 mm\");\n          out.push(\"closed: \" + state2());\n          const shelfPt = () => scr(pr.toWorld(c1, [B.x0 + B.w * 0.62, B.y0 + 421 + 18, B.z1 - 45]));\n          if (upto(\"open\")) {\n            const p = scr(pr.toWorld(c1, [c1.w * 0.75, c1.h * 0.55, c1.d + 18]));\n            out.push(\"open: double-click the shut door on <\" + fire(p[0], p[1]) + \"> -> \" + state2());\n          }\n          if (upto(\"selected\")) {\n            const p = shelfPt();\n            out.push(\"selected: double-click the upper shelf in the opening on <\" + fire(p[0], p[1]) + \"> -> \" + state2());\n          }\n          if (upto(\"edited\")) {\n            W2.dispatchEvent(new W2.KeyboardEvent(\"keydown\", { key: \"ArrowUp\", bubbles: true, cancelable: true }));\n            out.push(\"edited: ArrowUp -> \" + state2());\n            const lab = D2.querySelector('button[data-ub-idim=\"depth\"]');\n            if (lab) {\n              lab.click();\n              const inp = D2.querySelector(\".ub-lab__idiminput\");\n              if (inp) {\n                inp.value = \"300\";\n                inp.dispatchEvent(new W2.KeyboardEvent(\"keydown\", { key: \"Enter\", bubbles: true, cancelable: true }));\n              }\n            }\n            out.push(\"edited: typed 300 on its depth number\" + (lab ? \"\" : \" (number not on screen)\") + \" -> \" + state2());\n          }\n          const barState = () => {\n            const b = D2.querySelector(\"[data-ub-itoolbar]\"), rs = D2.querySelector('[data-ub-flyout=\"room\"]'), c2 = cv.getBoundingClientRect();\n            const br = b && !b.hidden ? b.getBoundingClientRect() : null, rr = rs && !rs.hidden ? rs.getBoundingClientRect() : null;\n            const overlap2 = !!(br && rr && br.left < rr.right && rr.left < br.right && br.top < rr.bottom && rr.top < br.bottom);\n            return \"shelf bar \" + (br ? \"shown, bottom gap \" + Math.round(c2.bottom - br.bottom) + \" px, top \" + Math.round(br.top - c2.top) + \" of \" + Math.round(c2.height) : \"hidden\") + \" | Room strip \" + (rr ? \"shown\" : \"hidden\") + (overlap2 ? \" | OVERLAP\" : \" | no overlap\");\n          };\n          if (side) {\n            later.push(() => out.push(\"selected: \" + barState()));\n            later.push(() => {\n              const rb = D2.querySelector('[data-ub-fly=\"room\"]');\n              if (rb) rb.click();\n            });\n            later.push(() => out.push(\"room: pressed Room -> \" + barState() + \" | \" + state2().split(\"\\n\")[0]));\n            if (phase === \"back\") {\n              later.push(() => {\n                const rb = D2.querySelector('[data-ub-fly=\"room\"]');\n                if (rb) rb.click();\n              });\n              later.push(() => out.push(\"back: pressed Room again -> \" + barState() + \" | \" + state2().split(\"\\n\")[0]));\n            }\n          }\n          if (upto(\"shut\") && !side) {\n            let dp = null;\n            for (let y = R4.top + 10; y < R4.bottom - 10 && !dp; y += 8) for (let x2 = R4.left + 10; x2 < R4.right - 10; x2 += 8) {\n              const h = ia.ctx.parts.openFrontUnderPointer(x2, y);\n              if (h && h.u === c1 && h.part.kind === \"door\" && D2.elementFromPoint(x2, y) === cv) {\n                dp = [x2, y];\n                break;\n              }\n            }\n            out.push(dp ? \"shut: double-click the OPEN door where it has swung to on <\" + fire(dp[0], dp[1]) + \"> -> \" + state2() : \"shut: open door not on screen\");\n          }\n          P2.render();\n        } catch (e) {\n          out.push(\"err \" + (e && e.message));\n        }\n        const box4 = D2.createElement(\"pre\");\n        box4.setAttribute(\"data-ub-qashelf\", \"\");\n        box4.style.cssText = \"position:fixed;left:0;bottom:0;right:0;z-index:99999;margin:0;padding:4px 6px;background:rgba(17,17,17,.88);color:#7CFC00;font:11px/1.3 monospace;white-space:pre-wrap\";\n        box4.textContent = \"qa_shelf \" + phase + \"\\n\" + out.join(\"\\n\");\n        D2.body.appendChild(box4);\n        later.forEach((fn, i) => W2.setTimeout(() => {\n          try {\n            fn();\n          } catch (e) {\n            out.push(\"err \" + (e && e.message));\n          }\n          box4.textContent = \"qa_shelf \" + phase + \"\\n\" + out.join(\"\\n\");\n        }, 600 * (i + 1)));\n      }, 2600);\n      const qi = /[?&]qa_inside=(first|again)\\b/.exec(loc.search);\n      if (qi && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [];\n        let P2 = null, ia = null;\n        const st2 = () => {\n          const b = D2.querySelector(\"[data-ub-itoolbar]\"), fl = D2.querySelector('[data-ub-flyout=\"inside\"]'), c2 = D2.querySelector(\".ub-lab__canvas\").getBoundingClientRect();\n          const br = b && !b.hidden ? b.getBoundingClientRect() : null;\n          return \"strip \" + (br ? \"SHOWN at bottom gap \" + Math.round(c2.bottom - br.bottom) + \" px\" : \"hidden\") + \" | Inside panel \" + (fl && !fl.hidden ? \"SHOWN\" : \"hidden\") + \" | tool \" + (ia.inside.tool() || \"none\") + \" | Undo steps \" + P2.histDepth().past + \" | plan \" + P2.sceneRef().units.map((u) => u.type + \" \" + u.w + \"x\" + u.h + \"x\" + u.d + (u.door ? \" door\" + (u.doorOpen ? \" open\" : \"\") : \"\")).join(\"; \");\n        };\n        try {\n          P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj;\n          ia = P2.__v2.interaction();\n          const cv = D2.querySelector(\".ub-lab__canvas\");\n          W2.scrollTo(0, cv.getBoundingClientRect().top + W2.scrollY - 8);\n          out.push(\"before: \" + st2());\n          const btn = D2.querySelector('[data-ub-fly=\"inside\"]');\n          btn.click();\n          out.push(\"pressed Shelves & dividers: \" + st2());\n          if (qi[1] === \"again\") {\n            const done2 = D2.querySelector('[data-ub-itoolbar] [data-ub-itool=\"off\"]');\n            if (done2) done2.click();\n            out.push(\"Done: \" + st2());\n            btn.click();\n            out.push(\"pressed again: \" + st2());\n          }\n        } catch (e) {\n          out.push(\"err \" + (e && e.message));\n        }\n        W2.setTimeout(() => {\n          try {\n            out.push(\"after the next frames: \" + st2());\n          } catch {\n          }\n          const box4 = D2.createElement(\"pre\");\n          box4.setAttribute(\"data-ub-qainside\", \"\");\n          box4.style.cssText = \"position:fixed;left:0;bottom:0;right:0;z-index:99999;margin:0;padding:4px 6px;background:rgba(17,17,17,.88);color:#7CFC00;font:11px/1.3 monospace;white-space:pre-wrap\";\n          box4.textContent = \"qa_inside \" + qi[1] + \"\\n\" + out.join(\"\\n\");\n          D2.body.appendChild(box4);\n        }, 700);\n      }, 2600);\n      const qe = /[?&]qa_edit=(active|away|plain|again)\\b/.exec(loc.search);\n      if (qe && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [], ORDER = [\"active\", \"away\", \"plain\", \"again\"], upto = (p) => ORDER.indexOf(qe[1]) >= ORDER.indexOf(p);\n        const kind = (/[?&]qa_part=(vdiv|hdiv|shelf)\\b/.exec(loc.search) || [0, \"vdiv\"])[1];\n        try {\n          const P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj, sc = P2.sceneRef(), ia = P2.__v2.interaction(), pr = ia.inside.probe;\n          const c1 = sc.units.slice().sort((x2, y) => x2.x - y.x)[0];\n          c1.door = true;\n          c1.doorOpen = true;\n          c1.interior = kind === \"vdiv\" ? { shelves: 0, shelfList: [], vDiv: [280], dividers: [280], hDiv: [] } : kind === \"hdiv\" ? { shelves: 0, shelfList: [], vDiv: [], dividers: [], hDiv: [250] } : { shelves: 1, shelfList: [{ id: \"S1\", cell: \"0.0\", y: 293 }] };\n          sc.selectedId = c1.id;\n          ia.setMode(\"rotate\");\n          P2.setCam(-0.3, 0.22);\n          const R0 = P2.__v2.renderer && P2.__v2.renderer();\n          if (R0 && R0.focusOn) R0.focusOn(c1.id);\n          sc.zoom = 0.32;\n          P2.render();\n          const cv = D2.querySelector(\".ub-lab__canvas\");\n          W2.scrollTo(0, cv.getBoundingClientRect().top + W2.scrollY - 8);\n          const R4 = cv.getBoundingClientRect(), V3 = ctx.view, B = pr.bounds(c1);\n          const scr = (lp) => {\n            const nd = V3.worldToNdc(pr.toWorld(c1, lp));\n            return [R4.left + (nd[0] + 1) / 2 * R4.width, R4.top + (1 - nd[1]) / 2 * R4.height];\n          };\n          const want = () => kind === \"vdiv\" ? scr([B.x0 + 280 + 9, B.y0 + B.h * 0.45, B.z1 - 2]) : kind === \"hdiv\" ? scr([B.x0 + B.w * 0.6, B.y0 + 250 + 9, B.z1 - 2]) : scr([B.x0 + B.w * 0.6, B.y0 + 293 + 18, B.z1 - 40]);\n          const KIND = kind === \"vdiv\" ? \"fixed-v\" : kind === \"hdiv\" ? \"fixed-h\" : \"shelf\";\n          const ptOn = () => {\n            const w = want();\n            let best = null;\n            for (let y = Math.ceil(R4.top + 2); y < Math.min(R4.bottom - 2, W2.innerHeight - 4); y += 4) for (let x2 = Math.ceil(R4.left + 2); x2 < R4.right - 2; x2 += 4) {\n              if (D2.elementFromPoint(x2, y) !== cv) continue;\n              const hit2 = ia.ctx.parts.realPartAt(x2, y);\n              if (!hit2 || hit2.part.kind !== KIND) continue;\n              const d2 = Math.hypot(x2 - w[0], y - w[1]);\n              if (!best || d2 < best.d) best = { x: x2, y, d: d2 };\n            }\n            return best ? [best.x, best.y] : w;\n          };\n          const evs = (x2, y, n2) => {\n            const el2 = D2.elementFromPoint(x2, y), o = { clientX: x2, clientY: y, bubbles: true, cancelable: true, view: W2, button: 0 };\n            for (let k = 1; k <= n2; k++) {\n              el2.dispatchEvent(new W2.PointerEvent(\"pointerdown\", { ...o, buttons: 1, pointerId: 8, pointerType: \"mouse\", isPrimary: true }));\n              el2.dispatchEvent(new W2.MouseEvent(\"mousedown\", { ...o, buttons: 1, detail: k }));\n              el2.dispatchEvent(new W2.PointerEvent(\"pointerup\", { ...o, buttons: 0, pointerId: 8, pointerType: \"mouse\", isPrimary: true }));\n              el2.dispatchEvent(new W2.MouseEvent(\"mouseup\", { ...o, buttons: 0, detail: k }));\n              el2.dispatchEvent(new W2.MouseEvent(\"click\", { ...o, buttons: 0, detail: k }));\n            }\n            if (n2 === 2) el2.dispatchEvent(new W2.MouseEvent(\"dblclick\", { ...o, buttons: 0, detail: 2 }));\n          };\n          const st2 = () => \"editing \" + (ia.inside.editing() ? \"TRUE\" : \"false\") + \" | selected \" + (sc.selPart || \"none\") + \" | numbers on screen \" + D2.querySelectorAll(\"[data-ub-idim]:not([style*='display: none'])\").length + \" | strip \" + (D2.querySelector(\"[data-ub-itoolbar]\").hidden ? \"hidden\" : \"SHOWN\") + \" | Undo steps \" + P2.histDepth().past + \" | interior \" + JSON.stringify(c1.interior.vDiv && c1.interior.vDiv.length ? { vDiv: c1.interior.vDiv } : c1.interior.hDiv && c1.interior.hDiv.length ? { hDiv: c1.interior.hDiv } : { shelves: c1.interior.shelfList });\n          out.push(\"FIXTURE: Cabinet 1 \" + c1.w + \" wide, door open, one \" + kind);\n          const away = scr([B.x0 + B.w + 400, B.y0 + B.h + 300, B.z1]);\n          const steps = [];\n          steps.push(() => {\n            const p = ptOn();\n            evs(p[0], p[1], 2);\n            out.push(\"active: double-click on the \" + kind + \" -> \" + st2());\n          });\n          if (upto(\"away\")) steps.push(() => {\n            evs(away[0], away[1], 1);\n            out.push(\"away: one click away -> \" + st2());\n          });\n          if (upto(\"plain\")) steps.push(() => {\n            const p = ptOn();\n            evs(p[0], p[1], 1);\n            out.push(\"plain: one click on the \" + kind + \" -> \" + st2());\n          });\n          if (upto(\"again\")) steps.push(() => {\n            const p = ptOn();\n            evs(p[0], p[1], 2);\n            out.push(\"again: double-click on the \" + kind + \" -> \" + st2());\n          });\n          const box4 = D2.createElement(\"pre\");\n          box4.setAttribute(\"data-ub-qaedit\", \"\");\n          box4.style.cssText = \"position:fixed;left:0;bottom:0;right:0;z-index:99999;margin:0;padding:4px 6px;background:rgba(17,17,17,.88);color:#7CFC00;font:11px/1.3 monospace;white-space:pre-wrap\";\n          out.push(\"before: \" + st2());\n          box4.textContent = \"qa_edit \" + qe[1] + \"\\n\" + out.join(\"\\n\");\n          D2.body.appendChild(box4);\n          steps.forEach((fn, i) => W2.setTimeout(() => {\n            try {\n              fn();\n            } catch (e) {\n              out.push(\"err \" + (e && e.message));\n            }\n            P2.render();\n            box4.textContent = \"qa_edit \" + qe[1] + \"\\n\" + out.join(\"\\n\");\n          }, 700 * (i + 1)));\n        } catch (e) {\n          out.push(\"err \" + (e && e.message));\n        }\n      }, 2600);\n      if (/[?&]qa_hit=[12]\\b/.test(loc.search) && ctx.win.setTimeout) ctx.win.setTimeout(() => {\n        const W2 = ctx.win, D2 = W2.document, out = [];\n        try {\n          const P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj, sc = P2.sceneRef(), us = sc.units.slice().sort((x2, y) => x2.x - y.x), c1 = us[0];\n          c1.door = true;\n          sc.selectedId = c1.id;\n          P2.dropUnit(\"base-4drawer\", 2600, 1400);\n          sc.selectedId = c1.id;\n          P2.setCam(0.25, 0.25);\n          P2.render();\n          if (/[?&]qa_hit=2\\b/.test(loc.search)) {\n            const R0 = P2.__v2.renderer && P2.__v2.renderer();\n            if (R0 && R0.focusOn) {\n              R0.focusOn(c1.id);\n              P2.render();\n            }\n          } else {\n            P2.__v2.interaction().view.fitKitchen(true);\n            P2.render();\n          }\n          if (root.__ubDocks) root.__ubDocks.show(\"drawers\");\n          W2.setTimeout(() => {\n            const R4 = P2.__v2.renderer();\n            R4.renderNow();\n            const I = R4.inspect();\n            I.camera.updateMatrixWorld();\n            const cv = D2.querySelector(\".ub-lab__canvas\"), r = cv.getBoundingClientRect();\n            out.push(\"canvas \" + [r.left, r.top, r.width, r.height].map(Math.round) + \" vp \" + W2.innerWidth + \"x\" + W2.innerHeight + \" scrollY \" + Math.round(W2.scrollY) + \" c1 \" + [c1.x, c1.z, c1.w, c1.h, c1.d, c1.rot || 0]);\n            for (const share of [0.25, 0.35, 0.6]) {\n              const row = [];\n              for (const fx of [0.22, 0.5, 0.78]) {\n                const v = new I.THREE.Vector3(c1.x + c1.w * fx, (c1.y || 0) + c1.h * share, (c1.z || 0) + c1.d + 18).project(I.camera);\n                const x2 = r.left + (v.x + 1) / 2 * r.width, y = r.top + (1 - v.y) / 2 * r.height, el2 = D2.elementFromPoint(x2, y);\n                row.push(fx + \"@\" + Math.round(x2) + \",\" + Math.round(y) + (Math.abs(v.x) > 0.95 || Math.abs(v.y) > 0.95 ? \"(off)\" : \"\") + \"=\" + (el2 ? el2.tagName.toLowerCase() + \".\" + String(el2.className && el2.className.baseVal != null ? el2.className.baseVal : el2.className).split(\" \")[0] : \"none\"));\n              }\n              out.push(\"h\" + share + \" \" + row.join(\"  \"));\n            }\n          }, 900);\n        } catch (e) {\n          out.push(\"err \" + (e && e.message));\n        }\n        W2.setTimeout(() => {\n          const box4 = D2.createElement(\"pre\");\n          box4.setAttribute(\"data-ub-qahit\", \"\");\n          box4.style.cssText = \"position:fixed;left:0;top:0;right:0;z-index:99999;margin:0;padding:6px;background:#111;color:#0f0;font:11px/1.35 monospace;white-space:pre-wrap\";\n          box4.textContent = \"qa_hit\\n\" + out.join(\"\\n\");\n          D2.body.appendChild(box4);\n        }, 1500);\n      }, 2600);\n      const dh = /[?&]qa_dh=(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,4})\\b/.exec(loc.search);\n      if (dh && units[Number(dh[1]) - 1]) {\n        ctx.act(\"select\", { id: units[Number(dh[1]) - 1].id });\n        ctx.act(\"drawer.box\", { i: Number(dh[2]) });\n        ctx.act(\"drawer.height\", { i: Number(dh[2]), h: Number(dh[3]) });\n        if (root.__ubDocks) root.__ubDocks.show(\"drawers\");\n        if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n      }\n    }\n  }\n\n  // v2/src/ui/rail-settings.js\n  function createRailSettings(ctx) {\n    const root = ctx.root;\n    const btn = root && root.querySelector ? root.querySelector(\"[data-ub-settings]\") : null;\n    if (!btn) return { sync() {\n    }, frame() {\n    } };\n    const pop = () => root.querySelector(\"[data-ub-kmatpop]\");\n    const isOpen = () => {\n      const p = pop();\n      return !!(p && !p.hidden);\n    };\n    btn.addEventListener(\"click\", () => {\n      if (isOpen()) {\n        const x = root.querySelector(\"[data-ub-kmatpop] .ub-lab__close, [data-ub-kmatpop] [data-ub-kmatclose]\");\n        if (x) x.click();\n        else {\n          const p = pop();\n          if (p) p.hidden = true;\n        }\n      } else {\n        const sw = root.querySelector('[data-ub-kmat=\"carcass\"]');\n        if (sw) sw.click();\n      }\n      sync();\n    });\n    function sync() {\n      const v = isOpen() ? \"true\" : \"false\";\n      if (btn.getAttribute(\"aria-expanded\") !== v) btn.setAttribute(\"aria-expanded\", v);\n    }\n    return { sync, frame: sync };\n  }\n\n  // v2/src/ui/view-inset.js\n  var FINGER_PX = 8;\n  var CONTROLS = 'button, [role=\"button\"], a[href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n  function measureTopInset(root, win2) {\n    const cv = root && root.querySelector ? root.querySelector(\".ub-lab__canvas\") : null;\n    const dock = root && root.querySelector ? root.querySelector(\".ub-lab__dock--top\") : null;\n    if (!cv || !dock || !cv.getBoundingClientRect) return 0;\n    const c = cv.getBoundingClientRect();\n    if (!(c.width > 0) || !(c.height > 0)) return 0;\n    const narrow = c.width <= 640;\n    let coarse = false;\n    try {\n      coarse = !!(win2 && win2.matchMedia && win2.matchMedia(\"(pointer: coarse)\").matches);\n    } catch {\n      coarse = false;\n    }\n    if (!narrow && !coarse) return 0;\n    let bottom = -Infinity;\n    for (const el of dock.querySelectorAll(CONTROLS)) {\n      if (el.hidden || el.offsetParent === null) continue;\n      const r = el.getBoundingClientRect();\n      if (!(r.width > 0) || !(r.height > 0)) continue;\n      if (r.right <= c.left || r.left >= c.right || r.bottom <= c.top || r.top >= c.bottom) continue;\n      bottom = Math.max(bottom, r.bottom);\n    }\n    if (!Number.isFinite(bottom)) return 0;\n    return Math.max(0, Math.round(bottom - c.top + FINGER_PX));\n  }\n  function measureBottomInset(root, win2) {\n    const cv = root && root.querySelector ? root.querySelector(\".ub-lab__canvas\") : null;\n    if (!cv || !cv.getBoundingClientRect || !root.querySelectorAll) return 0;\n    const c = cv.getBoundingClientRect();\n    if (!(c.width > 0) || !(c.height > 0)) return 0;\n    const narrow = c.width <= 640;\n    let coarse = false;\n    try {\n      coarse = !!(win2 && win2.matchMedia && win2.matchMedia(\"(pointer: coarse)\").matches);\n    } catch {\n      coarse = false;\n    }\n    if (!narrow && !coarse) return 0;\n    let top = Infinity;\n    for (const el of root.querySelectorAll(\".ub-lab__flyout\")) {\n      if (el.hidden || el.offsetParent === null) continue;\n      const r = el.getBoundingClientRect();\n      if (!(r.width > 0) || !(r.height > 0)) continue;\n      if (r.right <= c.left || r.left >= c.right) continue;\n      if (r.bottom < c.bottom - 2 || r.top <= c.top || r.top >= c.bottom) continue;\n      top = Math.min(top, r.top);\n    }\n    if (!Number.isFinite(top)) return 0;\n    return Math.max(0, Math.round(c.bottom - top));\n  }\n  function createViewInset(ctx) {\n    const root = ctx.root, win2 = ctx.win;\n    if (!root) return { sync() {\n    }, frame() {\n    } };\n    function frame2() {\n      let v = 0, b = 0;\n      try {\n        v = measureTopInset(root, win2);\n        b = measureBottomInset(root, win2);\n      } catch {\n        return;\n      }\n      const sc = ctx.scene ? ctx.scene() : null;\n      if (!sc) return;\n      const now = Number(sc.insetTop) || 0, nowB = Number(sc.insetBottom) || 0;\n      if (Math.abs(v - now) < 1 && Math.abs(b - nowB) < 1) return;\n      if (v > 0) sc.insetTop = v;\n      else delete sc.insetTop;\n      if (b > 0) sc.insetBottom = b;\n      else delete sc.insetBottom;\n      if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n    }\n    root.__ubViewInset = () => ctx.scene && ctx.scene() ? Number(ctx.scene().insetTop) || 0 : 0;\n    root.__ubViewInsetBottom = () => ctx.scene && ctx.scene() ? Number(ctx.scene().insetBottom) || 0 : 0;\n    return { sync: frame2, frame: frame2 };\n  }\n\n  // v2/src/ui/show-kitchen.js\n  var SHOTS = [\n    { n: \"Overview\", dur: 6.5, pose: (k, u) => ({ yaw: k.yaw - 0.55 + 1.1 * u, pitch: 0.28, zoom: k.fitZoom }) },\n    { n: \"Inside the cabinets\", dur: 5.5, see: true, pose: (k, u) => ({ yaw: k.yaw + 0.55 - 0.35 * u, pitch: 0.22, zoom: k.fitZoom * (0.95 - 0.2 * u) }) },\n    { n: \"Doors and drawers\", dur: 6, open: true, pose: (k, u) => ({ yaw: k.yaw + 0.35 - 0.7 * u, pitch: 0.16, zoom: k.fitZoom * 0.85 }) },\n    { n: \"Plan from above\", dur: 5, pose: (k, u) => ({ yaw: k.yaw + 0.2 - 0.4 * u, pitch: 1.2, zoom: k.fitZoom * 1.05 }) },\n    { n: \"Evening light\", dur: 6.5, evening: true, pose: (k, u) => ({ yaw: k.yaw - 0.2 + 0.4 * u, pitch: 0.3, zoom: k.fitZoom * 0.95 }) }\n  ];\n  var sm = (x) => 0.5 - 0.5 * Math.cos(Math.PI * Math.max(0, Math.min(1, x)));\n  var PLAY = '<path d=\"M8 5.5v13l10.5-6.5z\"/>';\n  var STOP = '<rect x=\"6.5\" y=\"6.5\" width=\"11\" height=\"11\" rx=\"1.5\"/>';\n  var MOON = '<path d=\"M19.5 14.2A7.8 7.8 0 1 1 9.8 4.5a6.2 6.2 0 0 0 9.7 9.7z\"/>';\n  var SUN = '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2.5v2.2M12 19.3v2.2M2.5 12h2.2M19.3 12h2.2M5.3 5.3l1.6 1.6M17.1 17.1l1.6 1.6M5.3 18.7l1.6-1.6M17.1 6.9l1.6-1.6\"/>';\n  function createShowKitchen(ctx) {\n    const root = ctx.root, win2 = ctx.win;\n    const showBtn = root && root.querySelector ? root.querySelector(\"[data-ub-show]\") : null;\n    const lightBtn = root && root.querySelector ? root.querySelector(\"[data-ub-light]\") : null;\n    if (!showBtn && !lightBtn) return { sync() {\n    }, frame() {\n    } };\n    const cap2 = root.querySelector(\"[data-ub-showcap]\"), capN = root.querySelector(\"[data-ub-showcapn]\"), capT = root.querySelector(\"[data-ub-showcapt]\");\n    const stopBtn = root.querySelector(\"[data-ub-showstop]\");\n    const P2 = () => root.__ubProj || null;\n    const sc = () => ctx.scene ? ctx.scene() : null;\n    const render = () => {\n      try {\n        if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n        const p = P2();\n        if (p && p.render) p.render();\n      } catch {\n      }\n    };\n    let show2 = null;\n    const reduced = () => {\n      try {\n        return !!(win2 && win2.matchMedia && win2.matchMedia(\"(prefers-reduced-motion: reduce)\").matches);\n      } catch {\n        return false;\n      }\n    };\n    const unitsN = () => {\n      const s = sc();\n      return s && s.units && s.units.length || 0;\n    };\n    function paintShow() {\n      if (!showBtn || show2) return;\n      const none = unitsN() === 0, t = none ? \"Show kitchen - add a cabinet first\" : \"Show kitchen\";\n      if (showBtn.getAttribute(\"aria-disabled\") !== String(none)) showBtn.setAttribute(\"aria-disabled\", String(none));\n      if (showBtn.getAttribute(\"title\") !== t) showBtn.setAttribute(\"title\", t);\n      if (showBtn.classList) showBtn.classList.toggle(\"is-off\", none);\n    }\n    function setEvening(on) {\n      const s = sc();\n      if (!s) return;\n      s.evening = !!on;\n      paintLight();\n      render();\n    }\n    function paintLight() {\n      if (!lightBtn) return;\n      const eve = !!(sc() && sc().evening);\n      const word = eve ? \"Day\" : \"Evening\", name2 = eve ? \"Daylight\" : \"Evening light\";\n      const svg2 = lightBtn.querySelector(\"svg\");\n      if (svg2) svg2.innerHTML = eve ? SUN : MOON;\n      const w = lightBtn.querySelector(\"[data-ub-lightword]\");\n      if (w && w.textContent !== word) w.textContent = word;\n      lightBtn.setAttribute(\"aria-label\", name2);\n      lightBtn.setAttribute(\"title\", name2);\n      lightBtn.setAttribute(\"aria-pressed\", eve ? \"true\" : \"false\");\n    }\n    if (lightBtn) lightBtn.addEventListener(\"click\", () => setEvening(!(sc() && sc().evening)));\n    function poseNow() {\n      const s = sc();\n      return { yaw: s.yaw || 0, pitch: s.pitch || 0, zoom: s.zoom || 1, panX: s.panX || 0, panY: s.panY || 0, panZ: s.panZ || 0, pivot: s.pivot ? { p: s.pivot.p.slice() } : null };\n    }\n    function apply(p) {\n      const pj = P2(), s = sc();\n      if (!pj || !s) return;\n      if (pj.setCam) pj.setCam(p.yaw, p.pitch);\n      else {\n        s.yaw = p.yaw;\n        s.pitch = p.pitch;\n      }\n      s.zoom = p.zoom;\n      render();\n    }\n    function start2() {\n      const pj = P2(), s = sc();\n      if (show2 || !pj || !s || !unitsN()) return;\n      const keep = Object.assign(poseNow(), { evening: !!s.evening, see: !!s.frontsSeeThrough, sel: s.selectedId || null, camHold: s.camHold || null });\n      let fitZoom2 = keep.zoom;\n      try {\n        const ia = pj.__v2 && pj.__v2.interaction ? pj.__v2.interaction() : null;\n        if (ia && ia.view && ia.view.fitKitchen) {\n          ia.view.fitKitchen(true);\n          fitZoom2 = s.zoom || fitZoom2;\n        }\n      } catch {\n      }\n      s.panX = 0;\n      s.panY = 0;\n      if (\"panZ\" in s) s.panZ = 0;\n      s.selectedId = null;\n      show2 = { t0: now(), i: -1, keep, base: { yaw: keep.yaw, fitZoom: fitZoom2 }, from: poseNow() };\n      showBtn.setAttribute(\"aria-pressed\", \"true\");\n      showBtn.setAttribute(\"aria-label\", \"Stop show\");\n      showBtn.setAttribute(\"title\", \"Stop show\");\n      const svg2 = showBtn.querySelector(\"svg\");\n      if (svg2) svg2.innerHTML = STOP;\n      const w = showBtn.querySelector(\"span\");\n      if (w) w.textContent = \"Stop show\";\n      if (root.classList) root.classList.add(\"ub-lab--showing\");\n      if (cap2) cap2.hidden = false;\n      try {\n        const ae = root.ownerDocument && root.ownerDocument.activeElement;\n        if (stopBtn && ae && root.contains(ae)) stopBtn.focus({ preventScroll: true });\n      } catch {\n      }\n      step();\n    }\n    function stop() {\n      if (!show2) return;\n      const k = show2.keep, s = sc();\n      show2 = null;\n      if (s) {\n        s.frontsSeeThrough = k.see;\n        s.evening = k.evening;\n        s.selectedId = k.sel;\n        delete s.showOpen;\n        s.panX = k.panX;\n        s.panY = k.panY;\n        if (\"panZ\" in s) s.panZ = k.panZ;\n        s.pivot = k.pivot || null;\n        if (k.camHold) s.camHold = k.camHold;\n      }\n      apply(k);\n      showBtn.setAttribute(\"aria-pressed\", \"false\");\n      showBtn.setAttribute(\"aria-label\", \"Show kitchen\");\n      showBtn.setAttribute(\"title\", \"Show kitchen\");\n      const svg2 = showBtn.querySelector(\"svg\");\n      if (svg2) svg2.innerHTML = PLAY;\n      const w = showBtn.querySelector(\"span\");\n      if (w) w.textContent = \"Show kitchen\";\n      if (root.classList) root.classList.remove(\"ub-lab--showing\");\n      if (cap2) cap2.hidden = true;\n      try {\n        const ae = root.ownerDocument && root.ownerDocument.activeElement;\n        if (ae === stopBtn && showBtn.focus) showBtn.focus({ preventScroll: true });\n      } catch {\n      }\n      paintLight();\n      try {\n        if (ctx.ui && ctx.ui.syncControls) ctx.ui.syncControls();\n      } catch {\n      }\n      render();\n    }\n    function subtitle(sh) {\n      const s = sc(), us = s && s.units || [];\n      const pl = (n, w) => n + \" \" + w + (n === 1 ? \"\" : \"s\");\n      if (sh.open) {\n        let d = 0, r = 0;\n        for (const u of us) {\n          if (u.door) d++;\n          if (u.type === \"base-drawer\") r++;\n          if (u.type === \"base-4drawer\") r += 4;\n          if (Array.isArray(u.xdr)) r += u.xdr.length;\n        }\n        const t = [d ? pl(d, \"door\") : \"\", r ? pl(r, \"drawer\") : \"\"].filter(Boolean).join(\" \\xB7 \");\n        return t ? \" \\xB7 \" + t : \"\";\n      }\n      if (sh.n === \"Overview\") return us.length ? \" \\xB7 \" + pl(us.length, \"cabinet\") : \"\";\n      return \"\";\n    }\n    function now() {\n      return win2 && win2.performance && win2.performance.now ? win2.performance.now() : Date.now();\n    }\n    const total = SHOTS.reduce((t, x) => t + x.dur, 0);\n    function step() {\n      if (!show2) return;\n      const s = sc();\n      if (!s) {\n        stop();\n        return;\n      }\n      let t = (now() - show2.t0) / 1e3 % total, i = 0;\n      while (i < SHOTS.length - 1 && t > SHOTS[i].dur) {\n        t -= SHOTS[i].dur;\n        i++;\n      }\n      const sh = SHOTS[i];\n      if (i !== show2.i) {\n        if (show2.i >= 0) show2.from = poseNow();\n        show2.i = i;\n        show2.ts = now();\n        s.frontsSeeThrough = !!sh.see || show2.keep.see;\n        s.evening = sh.evening ? true : show2.keep.evening;\n        s.showOpen = !!sh.open;\n        if (capN) capN.textContent = String(i + 1).padStart(2, \"0\") + \" / \" + String(SHOTS.length).padStart(2, \"0\");\n        if (capT) capT.textContent = sh.n + subtitle(sh);\n        paintLight();\n      }\n      const still = reduced();\n      const p = sh.pose(show2.base, still ? 0.5 : sm(t / sh.dur)), b = still ? 1 : sm(t / 1.3), f = show2.from;\n      apply({ yaw: f.yaw + (p.yaw - f.yaw) * b, pitch: f.pitch + (p.pitch - f.pitch) * b, zoom: f.zoom + (p.zoom - f.zoom) * b });\n      if (win2 && win2.requestAnimationFrame) win2.requestAnimationFrame(step);\n      else if (win2 && win2.setTimeout) win2.setTimeout(step, 33);\n    }\n    if (showBtn) showBtn.addEventListener(\"click\", () => show2 ? stop() : start2());\n    if (stopBtn) stopBtn.addEventListener(\"click\", stop);\n    if (win2 && win2.addEventListener) win2.addEventListener(\"keydown\", (e) => {\n      if (show2 && e && e.key === \"Escape\") {\n        stop();\n      }\n    }, true);\n    const canvas = root.querySelector(\".ub-lab__canvas\");\n    if (canvas && canvas.addEventListener) canvas.addEventListener(\"pointerdown\", () => {\n      if (show2) stop();\n    }, true);\n    function goto(i) {\n      if (!show2 || !(i >= 0 && i < SHOTS.length)) return false;\n      let t = 0;\n      for (let j = 0; j < i; j++) t += SHOTS[j].dur;\n      show2.t0 = now() - t * 1e3 - 20;\n      return true;\n    }\n    root.__ubShow = { start: start2, stop, goto, playing: () => !!show2, shot: () => show2 ? SHOTS[show2.i] && SHOTS[show2.i].n : null, shots: () => SHOTS.map((x) => x.n), setEvening };\n    paintLight();\n    paintShow();\n    return { sync() {\n      paintLight();\n      paintShow();\n    }, frame() {\n      paintShow();\n    } };\n  }\n\n  // v2/src/ui/kmat-price.js\n  function createKmatPrice(ctx) {\n    const root = ctx.root, doc2 = root && root.ownerDocument;\n    const kmats = root && root.querySelector ? root.querySelector(\".ub-lab__dock [data-ub-kmats]\") : null;\n    if (!kmats || !doc2 || !doc2.createElement) return { sync() {\n    }, frame() {\n    } };\n    const note = doc2.createElement(\"p\");\n    note.className = \"ub-lab__kprice\";\n    note.setAttribute(\"data-ub-kprice\", \"\");\n    note.setAttribute(\"aria-live\", \"polite\");\n    note.hidden = true;\n    const strip = root.querySelector(\"[data-ub-status]\");\n    if (strip && strip.appendChild) {\n      note.classList.add(\"ub-lab__kprice--strip\");\n      strip.appendChild(note);\n    } else if (kmats.parentNode && kmats.parentNode.insertBefore) kmats.parentNode.insertBefore(note, kmats.nextSibling);\n    const priceEl = () => root.querySelector(\".ub-lab__price\"), labelEl = () => root.querySelector(\"[data-ub-price-label]\");\n    const money2 = (t) => /\u00A3\\s?\\d/.test(t || \"\");\n    const sig = () => {\n      try {\n        const k = ctx.scene && ctx.scene().kitchen || {};\n        return JSON.stringify([k.carcass, k.fronts, k.frontMat, k.paint && k.paint.tone, k.paintFinish]);\n      } catch {\n        return \"\";\n      }\n    };\n    let last = sig(), wait = null, hideAt = 0, poll = null;\n    const nowMs = () => Date.now();\n    function show2(text, state2) {\n      note.textContent = text;\n      note.setAttribute(\"data-state\", state2);\n      note.hidden = false;\n    }\n    function frame2() {\n      const s = sig();\n      if (s !== last) {\n        last = s;\n        const p = priceEl();\n        wait = { was: p ? p.textContent.trim() : \"\", seenPending: false, t0: nowMs() };\n        show2(\"Updating price\\u2026\", \"pending\");\n        hideAt = 0;\n        const w = root.ownerDocument && root.ownerDocument.defaultView;\n        if (w && w.setInterval && !poll) poll = w.setInterval(() => {\n          frame2();\n          if (!wait && poll) {\n            w.clearInterval(poll);\n            poll = null;\n          }\n        }, 250);\n        return;\n      }\n      if (wait) {\n        const p = priceEl(), l = labelEl(), txt = p ? p.textContent.trim() : \"\", pending = !money2(txt) || /pending/i.test(l ? l.textContent : \"\");\n        if (pending) wait.seenPending = true;\n        if (!pending && money2(txt) && (wait.seenPending || money2(wait.was) && txt !== wait.was)) {\n          show2(wait.was && money2(wait.was) && wait.was !== txt ? \"Now \" + txt + \" (was \" + wait.was + \")\" : \"Price \" + txt, \"ok\");\n          wait = null;\n          hideAt = nowMs() + 9e3;\n        } else if (nowMs() - wait.t0 > 15e3) {\n          show2(\"Price pending\", \"pending\");\n          wait = null;\n          hideAt = nowMs() + 6e3;\n        }\n      } else if (hideAt && nowMs() > hideAt) {\n        note.hidden = true;\n        hideAt = 0;\n      }\n    }\n    return { sync: frame2, frame: frame2 };\n  }\n\n  // v2/src/ui/finishing-strip.js\n  function matWords(key) {\n    if (isPaintKey(key)) return paintKeyShort(key);\n    const d = decorOf(key);\n    return d ? d.code + \" \" + d.tex + \" \" + d.name : finishLabel(key);\n  }\n  function createFinishingStrip(ctx) {\n    const root = ctx.root;\n    const q = (s) => root.querySelector(s), qa = (s) => Array.prototype.slice.call(root.querySelectorAll(s));\n    const strip = q('[data-ub-flyout=\"finishing\"]');\n    if (!strip) return { sync() {\n    } };\n    const show2 = (el, on) => {\n      if (el) {\n        if (on) el.removeAttribute(\"hidden\");\n        else el.setAttribute(\"hidden\", \"\");\n      }\n    };\n    const press = (b, on) => {\n      b.classList.toggle(\"is-active\", !!on);\n      b.setAttribute(\"aria-pressed\", on ? \"true\" : \"false\");\n    };\n    const selected2 = () => {\n      const s = ctx.scene();\n      return (s.units || []).find((u) => u.id === s.selectedId) || null;\n    };\n    const E = {\n      cab: q(\"[data-ub-fcab]\"),\n      dims: q(\"[data-ub-fdims]\"),\n      note: q(\"[data-ub-fnote]\"),\n      all: q(\"[data-ub-fall]\"),\n      dropRow: q(\"[data-ub-fdroprow]\"),\n      matRow: q(\"[data-ub-fmatrow]\"),\n      decor: q(\"[data-ub-fdecor]\")\n    };\n    const ends = qa(\"[data-ub-fend]\"), states = qa(\"[data-ub-fstate]\"), drops = qa(\"[data-ub-fdrop]\"), mats = qa(\"[data-ub-fmat]\");\n    const doc2 = E.decor && E.decor.ownerDocument;\n    if (E.decor && doc2 && doc2.createElement && E.decor.querySelectorAll(\"option\").length < 2) {\n      EGGER_DECORS.filter((d) => !d.retired).slice().sort((a, b) => a.label < b.label ? -1 : 1).forEach((d) => {\n        const o = doc2.createElement(\"option\");\n        o.value = d.key;\n        o.textContent = d.code + \" \" + d.tex + \" \" + d.name;\n        E.decor.appendChild(o);\n      });\n    }\n    let tapeKeep = \"\";\n    function tapeFilter() {\n      if (!E.decor) return;\n      E.decor.querySelectorAll(\"option\").forEach((o) => {\n        if (!o.value) return;\n        const off = decorWithoutTape(decorOf(o.value)) && o.value !== tapeKeep;\n        o.hidden = off;\n        o.disabled = off;\n      });\n    }\n    if (E.decor) {\n      onDecorTape(tapeFilter);\n      loadDecorTape(doc2 && doc2.defaultView);\n    }\n    ends.forEach((b) => b.addEventListener(\"click\", () => {\n      const u = selected2();\n      if (!u) return;\n      const side = b.getAttribute(\"data-ub-fend\");\n      const on = !finishingOf(u)[side === \"L\" ? \"endL\" : \"endR\"];\n      ctx.act(\"finishing.endSet\", { side, on });\n    }));\n    drops.forEach((b) => b.addEventListener(\"click\", () => ctx.act(\"finishing.endDrop\", { drop: b.getAttribute(\"data-ub-fdrop\") === \"1\" })));\n    mats.forEach((b) => b.addEventListener(\"click\", () => ctx.act(\"finishing.endMat\", { value: b.getAttribute(\"data-ub-fmat\") })));\n    if (E.decor) E.decor.addEventListener(\"change\", () => {\n      if (E.decor.value) ctx.act(\"finishing.endMat\", { value: E.decor.value });\n    });\n    if (E.all) E.all.addEventListener(\"click\", () => ctx.act(\"finishing.all\", {}));\n    try {\n      qaEndPanels(ctx, root, newUnit);\n    } catch (e) {\n    }\n    try {\n      qaDragIn(ctx, root);\n    } catch (e) {\n    }\n    function sync() {\n      sync1();\n      if (E.note) E.note.title = E.note.textContent;\n    }\n    function sync1() {\n      const scene = ctx.scene(), u = selected2();\n      const open = openRunEnds(scene.units || []);\n      if (E.all) {\n        E.all.disabled = !open.length;\n        E.all.textContent = open.length ? \"Finish all exposed ends (\" + open.length + \")\" : \"No open run ends\";\n      }\n      if (!u) {\n        if (E.cab) E.cab.textContent = \"Select a cabinet\";\n        ends.forEach((b) => {\n          b.disabled = true;\n          press(b, false);\n        });\n        states.forEach((s) => {\n          s.textContent = \"\";\n        });\n        show2(E.dropRow, false);\n        show2(E.matRow, false);\n        if (E.dims) E.dims.textContent = \"\";\n        if (E.note) E.note.textContent = open.length ? open.length + \" exposed run end\" + (open.length === 1 ? \"\" : \"s\") + \" in the plan without an end panel.\" : \"\";\n        return;\n      }\n      const name2 = displayName(scene.units, u);\n      if (E.cab) E.cab.textContent = name2;\n      if (u.type === \"island\") {\n        const ex2 = exposedEnds(scene.units, u);\n        ends.forEach((b) => {\n          b.disabled = true;\n          press(b, true);\n          b.textContent = (b.getAttribute(\"data-ub-fend\") === \"L\" ? \"Left\" : \"Right\") + \" end (built in)\";\n        });\n        states.forEach((s) => {\n          const e = ex2[s.getAttribute(\"data-ub-fstate\")];\n          s.textContent = exposureText(e);\n          s.setAttribute(\"data-state\", e.state);\n        });\n        show2(E.dropRow, true);\n        show2(E.matRow, false);\n        drops.forEach((b) => press(b, b.getAttribute(\"data-ub-fdrop\") === \"1\" === !!u.skinDrop));\n        const sp = islandSkinParts(u);\n        if (E.dims) E.dims.textContent = Math.round(sp[0].y1 - sp[0].y0) + \" \\xD7 \" + Math.round(sp[0].z1 - sp[0].z0) + \" \\xD7 18 mm \\xD72 + back \" + Math.round(sp[2].x1 - sp[2].x0) + \" \\xD7 \" + Math.round(sp[2].y1 - sp[2].y0) + \" \\xB7 overall \" + u.w + \" mm (unchanged)\";\n        if (E.note) E.note.textContent = (u.skinDrop ? \"Island ends and back to the floor - the legs are hidden; the front plinth stops against the end panels.\" : \"Island ends and back stop at the cabinet - the legs show below them. To floor hides them.\") + \" Material: \" + matWords(u.skinFinish || u.frontFinish) + \" (the island's panel finish).\" + (isPaintKey(u.skinFinish) ? \" Painted panels are quoted with the painted doors.\" : \"\") + \" Fixing: to be confirmed by the workshop.\";\n        return;\n      }\n      const able = canFinishing(u);\n      const g2 = finishingOf(u);\n      const ex = able ? exposedEnds(scene.units, u) : null;\n      ends.forEach((b) => {\n        const side = b.getAttribute(\"data-ub-fend\");\n        const on = able && (side === \"L\" ? g2.endL : g2.endR);\n        b.disabled = !able;\n        press(b, on);\n        b.textContent = (side === \"L\" ? \"Left\" : \"Right\") + (on ? \" panel \\u2713\" : \" panel\");\n      });\n      states.forEach((s) => {\n        const side = s.getAttribute(\"data-ub-fstate\");\n        const e = ex && ex[side];\n        s.textContent = e ? exposureText(e) : \"\";\n        s.setAttribute(\"data-state\", e ? e.state : \"\");\n      });\n      const any = able && (g2.endL || g2.endR);\n      const wall = u.family === \"wall\";\n      show2(E.dropRow, any && !wall);\n      drops.forEach((b) => press(b, any && b.getAttribute(\"data-ub-fdrop\") === \"1\" === !!g2.endDrop));\n      show2(E.matRow, any);\n      const choice = endMatChoice(u);\n      mats.forEach((b) => press(b, any && b.getAttribute(\"data-ub-fmat\") === choice));\n      if (E.decor) {\n        const isDecor = choice.indexOf(\"decor:\") === 0;\n        tapeKeep = isDecor ? choice.slice(6) : \"\";\n        tapeFilter();\n        E.decor.value = isDecor ? choice.slice(6) : \"\";\n        E.decor.classList.toggle(\"is-active\", isDecor);\n      }\n      const spec = able ? endPanelSpec(u) : [];\n      if (E.dims) E.dims.textContent = spec.length ? spec[0].finished.h + \" \\xD7 \" + spec[0].finished.d + \" \\xD7 \" + spec[0].finished.t + \" mm\" + (spec.length > 1 ? \" \\xD72\" : \"\") + \" \\xB7 overall \" + overallWidth(u) + \" mm\" : \"\";\n      if (!E.note) return;\n      if (!able) {\n        E.note.textContent = finishingWhy(u) || \"\";\n        return;\n      }\n      if (!any) {\n        const want = [\"L\", \"R\"].filter((s) => ex[s].state === \"exposed\");\n        E.note.textContent = want.length ? name2 + \": \" + (want.length === 2 ? \"both sides are\" : want[0] === \"L\" ? \"the left side is\" : \"the right side is\") + \" a run end. An end panel \" + (wall ? \"covers the cabinet's side.\" : \"goes down to the floor and hides the side legs; the plinth stops against it.\") : name2 + \" has no exposed side.\";\n        return;\n      }\n      const key = endKeyOf(u);\n      const heightWhy = wall ? \"Wall cabinet: the panel covers the cabinet only.\" : g2.endDrop ? g2.dropSet ? \"To floor - your choice.\" : \"To floor - automatic: it hides the legs.\" : g2.dropSet ? \"Carcass height - your choice: the side legs show.\" : \"Carcass height (an older plan): the side legs show.\";\n      const matWhy = choice === \"fronts\" ? \"Match fronts - automatic: \" + matWords(key) + \".\" : \"Your choice: \" + matWords(key) + \".\";\n      E.note.textContent = heightWhy + \" \" + matWhy + (isPaintKey(key) ? \" The painted panel is quoted with the painted doors.\" : \"\") + \" Fixing to the cabinet: to be confirmed by the workshop.\";\n    }\n    return { sync };\n  }\n  function islandSkin(u) {\n    return islandSkinParts(u).map((q) => ({ w: Math.round(q.x1 - q.x0), h: Math.round(q.y1 - q.y0), d: Math.round(q.z1 - q.z0) }));\n  }\n  function qaEndPanels(ctx, root, make) {\n    const W2 = ctx.win, loc = W2 && W2.location || {};\n    if (!loc.search || !/^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\"))) return;\n    const m = /[?&]qa_end=(before|after|painted|cycle|isle0|isle1|islepaint)\\b/.exec(loc.search);\n    if (!m || !W2.setTimeout) return;\n    const phase = m[1];\n    W2.setTimeout(() => {\n      const D2 = W2.document, out = [];\n      let P2 = null;\n      const side = (u, s) => {\n        const e = exposedEnds(ctx.scene().units, u)[s];\n        return s + \":\" + e.state + (e.panel ? \"+panel\" : \"\");\n      };\n      const line = () => ctx.scene().units.filter((u) => u.family !== \"wall\").map((u) => displayName(ctx.scene().units, u) + \" x\" + Math.round(u.x) + \" rot\" + (u.rot || 0) + \" [\" + side(u, \"L\") + \" \" + side(u, \"R\") + \"] overall \" + overallWidth(u)).join(\" | \");\n      try {\n        P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj;\n        const sc = ctx.scene();\n        sc.room = Object.assign({}, sc.room || {}, { on: true, width: 4200, depth: 3e3 });\n        sc.units.length = 0;\n        [900, 1500, 2100].forEach((x, i) => {\n          const u = make(i === 2 ? \"base-drawer\" : \"base\", x, 0);\n          u.x = x;\n          u.z = 0;\n          u.w = 600;\n          u.door = true;\n          sc.units.push(u);\n        });\n        [900, 1500, 2100].forEach((x) => {\n          const u = make(\"wall\", x, 0);\n          u.x = x;\n          u.z = 0;\n          u.w = 600;\n          u.door = true;\n          sc.units.push(u);\n        });\n        const isle = /^isle/.test(phase) ? make(\"island\", 1200, 1500) : null;\n        if (isle) {\n          isle.x = 1200;\n          isle.z = 1500;\n          delete isle.skinDrop;\n          sc.units.push(isle);\n        }\n        sc.selectedId = (isle || sc.units[0]).id;\n        resolveFinishes(sc.units, sc.kitchen);\n        if (phase === \"painted\" || phase === \"islepaint\") {\n          ctx.act(\"kitchen.materials\", { frontMat: \"mdf-paint\" });\n          ctx.act(\"kitchen.materials\", { paint: { tone: \"dark-grey\", ref: \"RAL 7016\" } });\n        }\n        ctx.refresh();\n        out.push(\"FIXTURE: 3 base + 3 wall cabinets, run x 900-2700 on the back wall (room 4200 x 3000). before: \" + line());\n        if (root.__ubDocks) root.__ubDocks.show(\"finishing\");\n        if (isle && phase !== \"isle0\") {\n          const b = D2.querySelector('[data-ub-fdrop=\"1\"]');\n          if (b) b.click();\n          const sk = islandSkin(isle);\n          out.push(\"pressed \\xAB\" + (b ? b.textContent : \"?\") + \"\\xBB on the island -> skinDrop \" + !!isle.skinDrop + \"; end panel \" + sk[0].h + \" x \" + sk[0].d + \", back \" + sk[2].w + \" x \" + sk[2].h + \", material \" + isle.skinFinish + \"; plinth \" + plinthRuns(sc.units).filter((r) => r.units.indexOf(isle.id) >= 0).map((r) => r.lo + \"-\" + r.hi).join(\", \") + \" (island x \" + isle.x + \"-\" + (isle.x + isle.w) + \")\");\n        } else if (isle) out.push(\"island saved before: panels at carcass height, plinth \" + plinthRuns(sc.units).filter((r) => r.units.indexOf(isle.id) >= 0).map((r) => r.lo + \"-\" + r.hi).join(\", \"));\n        if (phase === \"after\" || phase === \"painted\") {\n          const b = D2.querySelector(\"[data-ub-fall]\");\n          if (b) b.click();\n          out.push(\"pressed \\xAB\" + (b ? b.textContent : \"?\") + \"\\xBB -> \" + line());\n          const c1 = sc.units[0];\n          endPanelSpec(c1).forEach((s) => out.push(s.name + \": finished \" + s.finished.h + \"x\" + s.finished.d + \"x\" + s.finished.t + \", cut \" + s.cut.h + \"x\" + s.cut.d + \", \" + (s.paint ? s.paintText : s.board) + \", grain \" + s.grain + \", to floor \" + s.toFloor));\n          out.push(\"plinth: \" + plinthRuns(sc.units).map((r) => r.lo + \"-\" + r.hi + \" (\" + r.length + \" mm, \" + r.finish + \")\").join(\"; \"));\n        }\n        if (phase === \"cycle\") {\n          const C3 = (n, a) => {\n            const r = ctx.act(n, a || {});\n            return r && r.ok === false ? \"refused\" : \"ok\";\n          };\n          const ia = P2.__v2.interaction(), d0 = ia.hist.depth().past;\n          const c1 = sc.units[0];\n          for (let k = 0; k < 3; k++) {\n            ctx.act(\"select\", { id: c1.id });\n            out.push(\"round \" + (k + 1) + \": add L \" + C3(\"finishing.endSet\", { side: \"L\", on: true }) + \", add R \" + C3(\"finishing.endSet\", { side: \"R\", on: true }) + \" (Cabinet 2 flush), remove L \" + C3(\"finishing.endSet\", { side: \"L\", on: false }) + \", Undo \" + (ia.hist.undo() ? \"ok\" : \"no\") + \", Redo \" + (ia.hist.redo() ? \"ok\" : \"no\") + \" -> \" + side(c1, \"L\") + \" \" + side(c1, \"R\"));\n          }\n          out.push(\"finish all: \" + C3(\"finishing.all\") + \" -> \" + line());\n          ctx.act(\"select\", { id: sc.units[2].id });\n          out.push(\"turn Cabinet 3 left: \" + C3(\"unit.turn\", { dir: \"left\" }) + \" -> \" + line());\n          ia.hist.undo();\n          out.push(\"Undo the turn -> \" + line());\n          ctx.act(\"select\", { id: c1.id });\n          out.push(\"resize Cabinet 1 to 500: \" + (ia.size.commitSize(\"w\", \"500\") !== void 0 ? \"ok\" : \"refused\") + \" -> \" + line());\n          out.push(\"Save \" + (ia.ctx.persist.saveState() ? \"ok\" : \"no\") + \", Undo steps \" + (ia.hist.depth().past - d0));\n          out.push(\"Restore \" + (ia.ctx.persist.loadState() ? \"ok\" : \"no\") + \" -> \" + line());\n        }\n        const R0 = P2.__v2.renderer && P2.__v2.renderer();\n        const cm = /[?&]qa_cam=(-?[\\d.]+),(-?[\\d.]+)/.exec(loc.search), zm = /[?&]qa_zoom=(\\d)/.exec(loc.search);\n        P2.__v2.interaction().view.fitKitchen(true);\n        if (zm) {\n          sc.selectedId = sc.units[Number(zm[1])].id;\n          if (R0 && R0.focusOn) R0.focusOn(sc.selectedId);\n        }\n        P2.setCam(cm ? Number(cm[1]) * Math.PI / 180 : 0.9, cm ? Number(cm[2]) * Math.PI / 180 : 0.12);\n        if (R0 && R0.renderNow) R0.renderNow();\n        else P2.render();\n        {\n          const mn = D2.querySelector(\".ub-lab__main\");\n          if (mn && W2.scrollTo) W2.scrollTo(0, mn.getBoundingClientRect().top + (W2.scrollY || 0) - 4);\n        }\n        if (/[?&]qa_close=1/.test(loc.search)) {\n          const fl = D2.querySelector('[data-ub-flyout=\"finishing\"]');\n          if (fl) fl.setAttribute(\"hidden\", \"\");\n        }\n        W2.setTimeout(() => {\n          P2.setCam(cm ? Number(cm[1]) * Math.PI / 180 : 0.9, cm ? Number(cm[2]) * Math.PI / 180 : 0.12);\n          if (zm && R0 && R0.focusOn) R0.focusOn(sc.units[Number(zm[1])].id);\n          P2.render();\n        }, 400);\n      } catch (e) {\n        out.push(\"err \" + (e && e.message));\n      }\n      W2.setTimeout(() => {\n        const box3 = D2.createElement(\"pre\");\n        box3.setAttribute(\"data-ub-qaend\", \"\");\n        box3.style.cssText = \"position:fixed;left:0;top:0;right:0;z-index:99999;margin:0;padding:4px 6px;background:rgba(17,17,17,.85);color:#7CFC00;font:11px/1.3 monospace;white-space:pre-wrap\";\n        box3.textContent = \"qa_end \" + phase + \"\\n\" + out.join(\"\\n\");\n        D2.body.appendChild(box3);\n      }, 900);\n    }, 2600);\n  }\n  function qaDragIn(ctx, root) {\n    const W2 = ctx.win, loc = W2 && W2.location || {};\n    if (!loc.search || !/^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\"))) return;\n    const m = /[?&]qa_dragin=([01])\\b/.exec(loc.search);\n    if (!m || !W2.setTimeout) return;\n    const D2 = W2.document, out = [];\n    const wait = (ms) => new Promise((r) => W2.setTimeout(r, ms));\n    W2.setTimeout(async () => {\n      try {\n        if (m[1] === \"0\") {\n          const b = D2.querySelector('[data-ub-fly=\"finishing\"]');\n          if (b) b.style.display = \"none\";\n        }\n        const mn = D2.querySelector(\".ub-lab__main\");\n        W2.scrollTo(0, mn.getBoundingClientRect().top + W2.scrollY - 16);\n        const pj = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj, s = pj.sceneRef(), ia = pj.__v2.interaction();\n        for (const kind of [\"shelf\", \"divider\", \"hdivider\"]) {\n          let u = null;\n          for (const [x, z] of [[2600, 1400], [600, 2600], [2600, 2600], [4200, 2600], [1200, 3600], [3400, 3600]]) {\n            u = pj.dropUnit(\"base\", x, z);\n            if (u) break;\n          }\n          s.selectedId = u.id;\n          pj.syncControls();\n          u.door = true;\n          u.w = 800;\n          u.interior = { shelves: 0, vDiv: [], hDiv: [] };\n          ia.view.fitKitchen(true);\n          pj.render();\n          if (!ia.ctx.st.insideTool) ia.commands.run(\"insideTool\", { tool: \"select\" });\n          await wait(700);\n          const c = D2.querySelector(\".ub-lab__canvas\").getBoundingClientRect(), B = ia.ctx.inside.probe.bounds(u);\n          const on = (l) => {\n            const nd = ia.ctx.worldToNdc(ia.ctx.inside.probe.toWorld(u, l));\n            if (!nd) return [\"off\"];\n            const p = [c.left + (nd[0] + 1) / 2 * c.width, c.top + (1 - nd[1]) / 2 * c.height], el = D2.elementFromPoint(p[0], p[1]);\n            return [Math.round(p[0]) + \",\" + Math.round(p[1]), el ? el.tagName === \"CANVAS\" ? \"C\" : el.getAttribute(\"data-ub-fly\") || el.getAttribute(\"data-ub-itool\") || String(el.className || el.tagName).split(\" \")[0] : \"none\"];\n          };\n          const pairs = kind === \"divider\" ? [[[0.3, 0.5], [0.7, 0.5]], [[0.3, 0.75], [0.7, 0.75]], [[0.3, 0.25], [0.7, 0.25]], [[0.25, 0.85], [0.75, 0.85]], [[0.25, 0.15], [0.75, 0.15]]] : [[[0.5, 0.3], [0.5, 0.7]], [[0.5, 0.5], [0.5, 0.85]], [[0.25, 0.5], [0.25, 0.85]], [[0.75, 0.5], [0.75, 0.85]], [[0.5, 0.55], [0.5, 0.9]]];\n          let found = null;\n          const tried = [];\n          for (const [q1, q2] of pairs) {\n            const a1 = on([B.x0 + B.w * q1[0], B.y0 + B.h * q1[1], B.z1]), a2 = on([B.x0 + B.w * q2[0], B.y0 + B.h * q2[1], B.z1]);\n            tried.push(a1.join(\"=\") + \"|\" + a2.join(\"=\"));\n            if (a1[1] === \"C\" && a2[1] === \"C\") {\n              found = tried[tried.length - 1];\n              break;\n            }\n          }\n          out.push(kind + \" at \" + Math.round(u.x) + \",\" + Math.round(u.z) + \": \" + (found ? \"OK \" + found : \"NONE \" + tried.join(\"  \")));\n        }\n        const L = D2.querySelector(\".ub-lab__dock--left\").getBoundingClientRect(), tb = D2.querySelector(\"[data-ub-itoolbar]\");\n        out.push(\"canvas \" + [Math.round(D2.querySelector(\".ub-lab__canvas\").getBoundingClientRect().top), Math.round(D2.querySelector(\".ub-lab__canvas\").getBoundingClientRect().bottom)] + \" left dock \" + [L.left, L.top, L.right, L.bottom].map(Math.round) + (tb && tb.offsetParent ? \" itoolbar \" + [tb.getBoundingClientRect().top, tb.getBoundingClientRect().bottom].map(Math.round) : \"\"));\n      } catch (e) {\n        out.push(\"err \" + (e && e.message));\n      }\n      const box3 = D2.createElement(\"pre\");\n      box3.setAttribute(\"data-ub-qadragin\", \"\");\n      box3.style.cssText = \"position:fixed;left:0;bottom:0;right:0;z-index:99999;margin:0;padding:4px;background:rgba(17,17,17,.88);color:#7CFC00;font:9.5px/1.2 monospace;white-space:pre-wrap\";\n      box3.textContent = \"qa_dragin \" + m[1] + \"\\n\" + out.join(\"\\n\");\n      D2.body.appendChild(box3);\n    }, 2600);\n  }\n\n  // v2/src/ui/worktop-panel.js\n  var FAMILIES = [[\"38pf\", \"38 mm postformed\"], [\"38fw\", \"38 mm Feelwood square edge\"], [\"25sq\", \"25 mm square edge\"], [\"20pa\", \"20 mm PerfectSense Ambiance\"]];\n  function sizesText(L) {\n    const p = L.sizes.filter((s) => !s.bar).map((s) => s.l + \" x \" + s.d), b = L.sizes.filter((s) => s.bar).map((s) => s.l + \" x \" + s.d);\n    return \"Boards \" + p.join(\", \") + (b.length ? \"; breakfast bar \" + b.join(\", \") : \"\") + \" mm\";\n  }\n  function priceText(L) {\n    const priced = L.sizes.filter((s) => s.shop);\n    return priced.length ? priced.map((s) => s.l + \" x \" + s.d + \" \\xA3\" + s.shop[0].price.toFixed(2)).join(\", \") + \" (our shop); other sizes quoted separately\" : \"Price: quoted separately (no shop price for this worktop)\";\n  }\n  function supplierLink(doc2, label, url) {\n    const win2 = doc2.defaultView || (typeof window !== \"undefined\" ? window : null);\n    const a = doc2.createElement(\"a\");\n    a.textContent = label;\n    if (!/\\/products\\//i.test(String(url || \"\"))) {\n      a.setAttribute(\"href\", url);\n      a.setAttribute(\"target\", \"_blank\");\n      a.setAttribute(\"rel\", \"noopener\");\n      return a;\n    }\n    a.setAttribute(\"role\", \"link\");\n    a.setAttribute(\"tabindex\", \"0\");\n    a.setAttribute(\"data-ub-href\", url);\n    a.style.cursor = \"pointer\";\n    const open = () => {\n      if (win2 && typeof win2.open === \"function\") win2.open(url, \"_blank\", \"noopener\");\n    };\n    a.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      open();\n    });\n    a.addEventListener(\"keydown\", (e) => {\n      if (e.key === \"Enter\") {\n        e.preventDefault();\n        open();\n      }\n    });\n    return a;\n  }\n  function thumbOf(L) {\n    if (L.thumb) return L.thumb;\n    const u = String(L.image || \"\");\n    return /^https:\\/\\/panelco\\.com\\/wp-content\\/uploads\\/.+\\.(jpe?g|png|webp)$/i.test(u) && !/-\\d+x\\d+\\.[a-z]+$/i.test(u) ? u.replace(/\\.([a-z]+)$/i, \"-150x150.$1\") : u;\n  }\n  function createWorktopPanel(ctx) {\n    const root = ctx.root;\n    const q = (s) => root.querySelector(s);\n    const tray = q('[data-ub-flyout=\"worktop\"]');\n    if (!tray) return { sync() {\n    } };\n    const doc2 = tray.ownerDocument || ctx.doc || (typeof document !== \"undefined\" ? document : null);\n    const canMake = !!(doc2 && typeof doc2.createElement === \"function\");\n    const E = {\n      sum: q(\"[data-ub-wtsum]\"),\n      img: q(\"[data-ub-wtimg]\"),\n      name: q(\"[data-ub-wtname]\"),\n      spec: q(\"[data-ub-wtspec]\"),\n      sizes: q(\"[data-ub-wtsizes]\"),\n      price: q(\"[data-ub-wtprice]\"),\n      src: q(\"[data-ub-wtsrc]\"),\n      on: q(\"[data-ub-wton]\"),\n      front: q(\"[data-ub-wtfront]\"),\n      side: q(\"[data-ub-wtside]\"),\n      note: q(\"[data-ub-wtnote]\"),\n      list: q(\"[data-ub-wtlist]\"),\n      large: q(\"[data-ub-wtlarge]\"),\n      big: q(\"[data-ub-wtbig]\"),\n      bigImg: q(\"[data-ub-wtbigimg]\"),\n      bigTxt: q(\"[data-ub-wtbigtxt]\"),\n      bigClose: q(\"[data-ub-wtbigclose]\"),\n      dot: q(\"[data-ub-wtdot]\")\n    };\n    const mk = (tag, cls, attrs) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      for (const k in attrs || {}) e.setAttribute(k, attrs[k]);\n      return e;\n    };\n    const tiles = [];\n    if (E.list && canMake) {\n      for (const [fid, flabel] of FAMILIES) {\n        const lines = WT_LINES.filter((L) => L.family === fid);\n        if (!lines.length) continue;\n        const g2 = mk(\"div\", \"ub-lab__wtgrp\", { role: \"group\", \"aria-label\": flabel });\n        const h = mk(\"span\", \"ub-lab__wtgrph\");\n        h.textContent = flabel + \" (\" + lines.length + \")\";\n        g2.appendChild(h);\n        for (const L of lines) {\n          const b = mk(\"button\", \"ub-lab__wttile\", {\n            type: \"button\",\n            role: \"option\",\n            \"aria-selected\": \"false\",\n            \"data-ub-wtline\": L.id,\n            title: L.decor + \" \" + L.tex + \" \" + L.name + \" - \" + L.familyLabel\n          });\n          const im = mk(\"img\", \"\", { alt: \"\", width: \"56\", height: \"56\", decoding: \"async\", referrerpolicy: \"no-referrer\", \"data-src\": thumbOf(L), \"data-ub-wtfull\": L.image });\n          b.setAttribute(\"data-ub-wtpic\", \"wait\");\n          const t = mk(\"span\");\n          t.textContent = L.decor;\n          b.appendChild(im);\n          b.appendChild(t);\n          if (L.t) {\n            const th = mk(\"span\", \"ub-lab__wtth\", { \"aria-hidden\": \"true\" });\n            th.textContent = String(L.t);\n            b.appendChild(th);\n            b.setAttribute(\"title\", L.decor + \" \" + L.tex + \" \" + L.name + \" - \" + L.t + \" mm, \" + L.familyLabel);\n            b.setAttribute(\"aria-label\", L.decor + \" \" + L.tex + \" \" + L.name + \", \" + L.t + \" mm\");\n          }\n          b.addEventListener(\"click\", () => ctx.act(\"kitchen.worktop\", { line: L.id }));\n          const cell = mk(\"span\", \"ub-lab__kcell\", { \"data-ub-kcell\": L.id });\n          cell.appendChild(b);\n          const z = mk(\"button\", \"ub-lab__dpkzoom\", { type: \"button\", \"data-ub-wtzoom\": L.id, \"aria-label\": \"View large: \" + L.decor + \" \" + L.tex + \" \" + L.name, title: \"View large - \" + L.decor + \" \" + L.tex });\n          z.innerHTML = '<svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M8.5 3a5.5 5.5 0 1 1 0 11a5.5 5.5 0 0 1 0-11zm0 2.6v5.8M5.6 8.5h5.8M12.6 12.6l4.4 4.4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>';\n          z.addEventListener(\"click\", (e) => {\n            if (e && e.stopPropagation) e.stopPropagation();\n            showLarge(L, z);\n          });\n          cell.appendChild(z);\n          g2.appendChild(cell);\n          tiles.push(b);\n        }\n        E.list.appendChild(g2);\n      }\n    }\n    if (E.list) attachDecorHover(E.list, { item: \"[data-ub-wtline]\", info: (b) => {\n      const im = b.querySelector(\"img\");\n      const src = im && (im.currentSrc || im.getAttribute(\"src\"));\n      if (!src || b.getAttribute(\"data-ub-wtpic\") === \"failed\") return null;\n      return { src, full: im.getAttribute(\"data-ub-wtfull\") || null, name: b.getAttribute(\"aria-label\") || b.getAttribute(\"title\") || \"\" };\n    } });\n    let loaded = false;\n    const picState = (b, s) => {\n      b.setAttribute(\"data-ub-wtpic\", s);\n      if (s === \"loading\") b.setAttribute(\"aria-busy\", \"true\");\n      else b.removeAttribute(\"aria-busy\");\n    };\n    function loadOne(b) {\n      const im = b.querySelector(\"img\");\n      if (!im || !im.getAttribute(\"data-src\")) return;\n      const full = im.getAttribute(\"data-ub-wtfull\"), first = im.getAttribute(\"data-src\");\n      const done2 = () => {\n        if (im.naturalWidth) picState(b, \"ok\");\n      };\n      const fail2 = () => {\n        if (full && im.getAttribute(\"src\") !== full) {\n          im.setAttribute(\"src\", full);\n          return;\n        }\n        picState(b, \"failed\");\n        const t = b.getAttribute(\"title\") || \"\";\n        if (t.indexOf(\"photo unavailable\") < 0) b.setAttribute(\"title\", t + \" (photo unavailable)\");\n      };\n      if (im.addEventListener) {\n        im.addEventListener(\"load\", done2);\n        im.addEventListener(\"error\", fail2);\n      }\n      picState(b, \"loading\");\n      try {\n        im.loading = \"eager\";\n      } catch {\n      }\n      im.setAttribute(\"src\", first);\n      if (im.complete && im.naturalWidth) picState(b, \"ok\");\n    }\n    function loadImages() {\n      if (loaded) return;\n      loaded = true;\n      for (const b of tiles) loadOne(b);\n    }\n    try {\n      const W2 = ctx.win || tray && tray.ownerDocument && tray.ownerDocument.defaultView;\n      if (tray && W2 && W2.MutationObserver) new W2.MutationObserver(() => {\n        if (!tray.hidden) loadImages();\n      }).observe(tray, { attributes: true, attributeFilter: [\"hidden\"] });\n    } catch {\n    }\n    try {\n      for (const wb of root.querySelectorAll('[data-ub-fly=\"worktop\"]')) for (const ev of [\"pointerenter\", \"pointerdown\", \"touchstart\", \"focus\", \"click\"]) wb.addEventListener(ev, loadImages, { passive: true });\n    } catch {\n    }\n    if (E.on) E.on.addEventListener(\"click\", () => ctx.act(\"kitchen.worktop\", { on: !worktopOf(ctx.scene().kitchen).on }));\n    const num6 = (el, k) => {\n      if (!el) return;\n      el.addEventListener(\"change\", () => ctx.act(\"kitchen.worktop\", { [k]: el.value }));\n    };\n    num6(E.front, \"front\");\n    num6(E.side, \"side\");\n    const ctlEl = q(\".ub-lab__wtctl\"), ohBtn = q(\"[data-ub-wtoh]\"), ohVal = q(\"[data-ub-wtohval]\");\n    const ohSet = (on) => {\n      if (!ctlEl || !ctlEl.classList) return;\n      ctlEl.classList.toggle(\"is-ohopen\", !!on);\n      if (ohBtn) ohBtn.setAttribute(\"aria-expanded\", on ? \"true\" : \"false\");\n    };\n    if (ohBtn && ohBtn.addEventListener) ohBtn.addEventListener(\"click\", () => {\n      const on = !(ctlEl && ctlEl.classList.contains(\"is-ohopen\"));\n      ohSet(on);\n      if (on && E.front && E.front.focus) {\n        try {\n          E.front.focus({ preventScroll: true });\n        } catch {\n        }\n      }\n    });\n    if (ctlEl && ctlEl.addEventListener) ctlEl.addEventListener(\"keydown\", (e) => {\n      if (e && e.key === \"Escape\" && ctlEl.classList.contains(\"is-ohopen\")) {\n        ohSet(false);\n        if (e.stopPropagation) e.stopPropagation();\n        if (ohBtn && ohBtn.focus) ohBtn.focus();\n      }\n    });\n    try {\n      if (doc2 && doc2.addEventListener) doc2.addEventListener(\"pointerdown\", (e) => {\n        if (ctlEl && ctlEl.classList.contains(\"is-ohopen\") && e && e.target && !ctlEl.contains(e.target)) ohSet(false);\n      }, true);\n      const W0 = ctx.win || doc2 && doc2.defaultView;\n      if (W0 && W0.MutationObserver) new W0.MutationObserver(() => {\n        if (tray.hidden) ohSet(false);\n      }).observe(tray, { attributes: true, attributeFilter: [\"hidden\"] });\n    } catch {\n    }\n    let bigOpener = null;\n    const showBig = (on) => {\n      if (!E.big) return;\n      if (on) E.big.removeAttribute(\"hidden\");\n      else {\n        E.big.setAttribute(\"hidden\", \"\");\n        if (bigOpener && bigOpener.focus) {\n          try {\n            bigOpener.focus();\n          } catch {\n          }\n        }\n        bigOpener = null;\n      }\n    };\n    function showLarge(L, opener) {\n      if (E.bigImg) {\n        E.bigImg.setAttribute(\"src\", L.image);\n        E.bigImg.setAttribute(\"alt\", L.decor + \" \" + L.tex + \" \" + L.name);\n      }\n      if (E.bigTxt) E.bigTxt.textContent = L.decor + \" \" + L.tex + \" \" + L.name + (L.t ? \" - \" + L.t + \" mm\" : \"\") + \" - \" + L.familyLabel + \". Photo: Panelco (\" + L.image + \")\";\n      bigOpener = opener || null;\n      showBig(true);\n      if (E.bigClose && E.bigClose.focus) {\n        try {\n          E.bigClose.focus();\n        } catch {\n        }\n      }\n    }\n    if (E.big && E.big.addEventListener) E.big.addEventListener(\"keydown\", (e) => {\n      if (e && e.key === \"Escape\") {\n        if (e.stopPropagation) e.stopPropagation();\n        if (e.preventDefault) e.preventDefault();\n        showBig(false);\n      }\n    });\n    if (E.large) E.large.addEventListener(\"click\", () => {\n      const L = lineOf(worktopOf(ctx.scene().kitchen).line);\n      if (E.bigImg) E.bigImg.setAttribute(\"src\", L.image);\n      if (E.bigTxt) E.bigTxt.textContent = L.decor + \" \" + L.tex + \" \" + L.name + \" - \" + L.familyLabel + \". Photo: Panelco (\" + L.image + \")\";\n      showBig(true);\n    });\n    if (E.bigClose) E.bigClose.addEventListener(\"click\", () => showBig(false));\n    try {\n      qaWorktop(ctx, root, newUnit);\n    } catch (e) {\n    }\n    function sync() {\n      const sc = ctx.scene(), W2 = worktopOf(sc.kitchen), L = lineOf(W2.line);\n      if (!tray.hidden) loadImages();\n      if (E.dot) {\n        E.dot.style.backgroundImage = W2.on ? 'url(\"' + L.image + '\")' : \"none\";\n        E.dot.style.backgroundSize = \"cover\";\n        E.dot.classList.toggle(\"is-none\", !W2.on);\n      }\n      if (E.img && E.img.getAttribute(\"src\") !== L.image && !tray.hidden) E.img.setAttribute(\"src\", L.image);\n      if (E.name) E.name.textContent = L.decor + \" \" + L.tex + \" \" + L.name;\n      if (E.spec) E.spec.textContent = L.familyLabel + \" - \" + L.edge + (L.core ? \"; core \" + L.core.toLowerCase() : \"\");\n      if (E.sizes) E.sizes.textContent = sizesText(L);\n      if (E.price) E.price.textContent = priceText(L);\n      if (E.src && canMake) {\n        E.src.textContent = \"\";\n        const a1 = supplierLink(doc2, \"Panelco\", L.panelco);\n        const a2 = supplierLink(doc2, \"EGGER\", L.egger);\n        const t1 = mk(\"span\");\n        t1.textContent = \"Supplier data \" + WT_SOURCE.read + \": \";\n        const t2 = mk(\"span\");\n        t2.textContent = \" \\xB7 \";\n        E.src.appendChild(t1);\n        E.src.appendChild(a1);\n        E.src.appendChild(t2);\n        E.src.appendChild(a2);\n      }\n      if (E.on) {\n        E.on.setAttribute(\"aria-checked\", W2.on ? \"true\" : \"false\");\n        E.on.classList.toggle(\"is-active\", W2.on);\n        if (E.on.getAttribute(\"role\") !== \"switch\") E.on.textContent = W2.on ? \"Worktops on\" : \"Add worktops\";\n        E.on.setAttribute(\"title\", W2.on ? \"Worktops on - press to take them off\" : \"No worktops - press to add them\");\n      }\n      if (E.front && (!doc2 || doc2.activeElement !== E.front)) E.front.value = String(W2.front);\n      if (E.side && (!doc2 || doc2.activeElement !== E.side)) E.side.value = String(W2.side);\n      const menuMode = !!(ctlEl && ctlEl.classList && ctlEl.classList.contains(\"ub-lab__wtctl--menu\"));\n      if (ohVal) ohVal.textContent = menuMode ? \"Worktop\" : W2.front + \"\\xB7\" + W2.side;\n      if (ohBtn && ohBtn.classList) ohBtn.classList.toggle(\"is-wton\", !!W2.on);\n      if (ohBtn) {\n        ohBtn.setAttribute(\"title\", (menuMode ? \"Worktops \" + (W2.on ? \"on\" : \"off\") + \", \" : \"\") + \"front \" + W2.front + \" mm, side \" + W2.side + \" mm - press to change\");\n        ohBtn.setAttribute(\"aria-label\", menuMode ? \"Worktop settings: switch, front and side overhang\" : \"Overhangs: front and side, mm\");\n      }\n      for (const b of tiles) {\n        const on = b.getAttribute(\"data-ub-wtline\") === W2.line;\n        b.classList.toggle(\"is-active\", on);\n        b.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\n      }\n      const runs = W2.on ? worktopRuns(sc.units || [], sc.kitchen) : [];\n      const len = runs.reduce((t, r) => t + r.length, 0), pieces = runs.reduce((t, r) => t + r.pieces.length, 0);\n      const joints = runs.reduce((t, r) => t + Math.max(0, r.pieces.length - 1) + (r.ends.lo === \"corner-butt\" ? 1 : 0) + (r.ends.hi === \"corner-butt\" ? 1 : 0), 0);\n      if (E.sum) E.sum.textContent = W2.on ? runs.length + \" worktop\" + (runs.length === 1 ? \"\" : \"s\") + \", \" + (len / 1e3).toFixed(2) + \" m running, \" + pieces + \" board\" + (pieces === 1 ? \"\" : \"s\") : \"none\";\n      if (E.note) {\n        const flags = [];\n        runs.forEach((r) => r.flags.forEach((f) => flags.push(r.id + \": \" + f)));\n        E.note.textContent = !W2.on ? \"No worktops in this plan. Choose one below or switch Worktop on - Carcass and Doors stay as they are.\" : (joints ? joints + \" joint\" + (joints === 1 ? \"\" : \"s\") + \" (where a run is longer than a board, and at corners) - their type is the workshop's to decide. \" : \"\") + (flags.length ? flags.join(\". \") + \". \" : \"\") + \"No sink or hob cut-outs are planned. Worktops are not in the cut-list price: \" + priceText(L).toLowerCase().replace(/^price: /, \"\") + \".\";\n      }\n    }\n    return { sync };\n  }\n  function qaWorktop(ctx, root, make) {\n    const W2 = ctx.win, loc = W2 && W2.location || {};\n    if (!loc.search || !/^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\"))) return;\n    const m = /[?&]qa_wt=(off|on)\\b/.exec(loc.search);\n    if (!m || !W2.setTimeout) return;\n    const lm = /[?&]qa_line=([A-Za-z0-9-]+)/.exec(loc.search), line = lm ? lm[1] : \"F186ST9-38pf\";\n    W2.setTimeout(() => {\n      const D2 = W2.document, out = [];\n      try {\n        const P2 = root.__ubProj || (D2.querySelector(\".ub-lab\") || {}).__ubProj, sc = ctx.scene();\n        sc.room = Object.assign({}, sc.room || {}, { on: true, width: 4600, depth: 4200 });\n        sc.units.length = 0;\n        const put = (t, x, z, o) => {\n          const u = make(t, x, z);\n          u.x = x;\n          u.z = z;\n          u.door = t !== \"island\";\n          Object.assign(u, o || {});\n          sc.units.push(u);\n          return u;\n        };\n        const oven = /[?&]qa_oven=1/.test(loc.search);\n        put(\"base\", 560, 0);\n        if (oven) {\n          const o = put(\"base-oven\", 1160, 0);\n          o.door = false;\n          o.hood = true;\n        } else put(\"base\", 1160, 0);\n        put(\"base-drawer\", 1760, 0, { finishing: { endR: true, endDrop: true } });\n        put(\"tall-pantry\", 2600, 0);\n        put(\"base\", 0, 560, { rot: 3 });\n        put(\"base\", 0, 1160, { rot: 3 });\n        put(\"island\", 1500, 2300);\n        if (oven) {\n          put(\"wall\", 560, 0);\n          put(\"wall\", 1760, 0);\n        }\n        sc.selectedId = sc.units[0].id;\n        const sp = /[?&]qa_sp=(glass|tiles)(?::([0-9a-f]{6}))?(?::([0-9x]+))?(?::([a-z]+))?(?::([a-z]+))?/i.exec(loc.search);\n        if (sp) ctx.act(\"kitchen.splash\", Object.assign(\n          { kind: sp[1] },\n          sp[2] ? { colour: \"#\" + sp[2] } : {},\n          sp[3] ? { size: sp[3] } : {},\n          sp[4] ? { layout: sp[4] } : {},\n          sp[5] ? { grout: sp[5] } : {}\n        ));\n        if (/[?&]qa_paint=1/.test(loc.search)) {\n          ctx.act(\"kitchen.materials\", { frontMat: \"mdf-paint\" });\n          ctx.act(\"kitchen.materials\", { paint: { tone: \"dark-grey\" } });\n        }\n        ctx.refresh();\n        if (root.__ubDocks) root.__ubDocks.show(\"worktop\");\n        if (m[1] === \"on\") {\n          const b = D2.querySelector('[data-ub-wtline=\"' + line + '\"]');\n          if (b) b.click();\n          out.push(\"pressed the tile \" + line + (b ? \"\" : \" (not found)\"));\n        }\n        if (/[?&]qa_tray=splash\\b/.test(loc.search) && root.__ubDocks) root.__ubDocks.show(\"splash\");\n        if (/[?&]qa_wtlayout=split\\b/.test(loc.search)) {\n          const c = D2.querySelector(\".ub-lab__wtctl\");\n          if (c) c.classList.remove(\"ub-lab__wtctl--menu\");\n          ctx.refresh();\n          out.push(\"worktop controls: option A (switch + overhang button)\");\n        }\n        if (/[?&]qa_oh=1/.test(loc.search)) W2.setTimeout(() => {\n          const b = D2.querySelector(\"[data-ub-wtoh]\");\n          if (b && b.offsetParent !== null) b.click();\n          out.push(\"overhang button \" + (b && b.offsetParent !== null ? \"pressed\" : \"not shown (wide view)\"));\n        }, 900);\n        const hv = /[?&]qa_hover=([A-Za-z0-9-]+)/.exec(loc.search);\n        if (hv) W2.setTimeout(() => {\n          const t = D2.querySelector('[data-ub-wtline=\"' + hv[1] + '\"]');\n          if (!t || !W2.PointerEvent) return;\n          t.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n          W2.setTimeout(() => {\n            const r = t.getBoundingClientRect(), x = r.left + r.width / 2, y = r.top + r.height / 2;\n            for (const ty of [\"pointerover\", \"pointermove\"]) t.dispatchEvent(new W2.PointerEvent(ty, { bubbles: true, pointerType: \"mouse\", clientX: x, clientY: y }));\n          }, 300);\n        }, 1200);\n        const runs = worktopRuns(sc.units, sc.kitchen);\n        runs.forEach((r) => out.push(r.id + \" \" + r.kind + \" \" + r.axis + \" \" + Math.round(r.lo) + \"-\" + Math.round(r.hi) + \" (\" + r.length + \" x \" + Math.round(r.depth) + \" x \" + r.t + \") ends \" + r.ends.lo + \"/\" + r.ends.hi + \" boards \" + r.pieces.map((p) => p.board ? p.board.sku + \" \" + p.board.l + \"x\" + p.board.d : \"none\").join(\" + \") + (r.flags.length ? \" FLAGS \" + r.flags.join(\"; \") : \"\")));\n        if (!runs.length) out.push(\"no worktops (\" + (worktopOf(sc.kitchen).on ? \"on\" : \"off\") + \")\");\n        const cm = /[?&]qa_cam=(-?[\\d.]+),(-?[\\d.]+)/.exec(loc.search);\n        P2.__v2.interaction().view.fitKitchen(true);\n        P2.setCam(cm ? Number(cm[1]) * Math.PI / 180 : -0.6, cm ? Number(cm[2]) * Math.PI / 180 : 0.45);\n        P2.render();\n        const zm = /[?&]qa_zoom=(\\d{1,2})\\b/.exec(loc.search);\n        W2.setTimeout(() => {\n          P2.setCam(cm ? Number(cm[1]) * Math.PI / 180 : -0.6, cm ? Number(cm[2]) * Math.PI / 180 : 0.45);\n          if (zm) {\n            const v = P2.__v2.interaction().view;\n            for (let i = 0; i < Number(zm[1]) && !v.zoomButtons().inDisabled; i++) v.zoomIn();\n          }\n          P2.render();\n        }, 400);\n        if (/[?&]qa_close=1/.test(loc.search) && root.__ubDocks) W2.setTimeout(() => root.__ubDocks.show(null), 300);\n        {\n          const mn = D2.querySelector(\".ub-lab__main\");\n          if (mn && W2.scrollTo) W2.scrollTo(0, mn.getBoundingClientRect().top + (W2.scrollY || 0) - 4);\n        }\n      } catch (e) {\n        out.push(\"err \" + (e && e.message));\n      }\n      W2.setTimeout(() => {\n        const box3 = D2.createElement(\"pre\");\n        box3.setAttribute(\"data-ub-qawt\", \"\");\n        box3.style.cssText = \"position:fixed;left:0;top:0;right:0;z-index:99999;margin:0;padding:4px 6px;background:rgba(17,17,17,.85);color:#7CFC00;font:10.5px/1.3 monospace;white-space:pre-wrap\";\n        box3.textContent = \"qa_wt \" + m[1] + \" \" + line + \"\\n\" + out.join(\"\\n\");\n        D2.body.appendChild(box3);\n      }, 900);\n    }, 2600);\n  }\n\n  // v2/src/ui/splash-panel.js\n  function createSplashPanel(ctx) {\n    const root = ctx.root, q = (s) => root.querySelector(s);\n    const tray = q('[data-ub-flyout=\"splash\"]');\n    if (!tray) return { sync() {\n    } };\n    const doc2 = tray.ownerDocument || ctx.doc || (typeof document !== \"undefined\" ? document : null);\n    const canMake = !!(doc2 && typeof doc2.createElement === \"function\");\n    const E = {\n      on: q(\"[data-ub-spon]\"),\n      kinds: Array.from(root.querySelectorAll(\"[data-ub-spkind]\") || []),\n      sw: q(\"[data-ub-spsw]\"),\n      custom: q(\"[data-ub-spcustom]\"),\n      tile: q(\"[data-ub-sptile]\"),\n      size: q(\"[data-ub-spsize]\"),\n      layout: q(\"[data-ub-splayout]\"),\n      grout: q(\"[data-ub-spgrout]\"),\n      dot: q(\"[data-ub-spdot]\"),\n      dot2: q(\"[data-ub-spdot2]\"),\n      open2: q(\"[data-ub-spopen]\")\n    };\n    const act = (a) => ctx.act(\"kitchen.splash\", a);\n    const mk = (tag, cls, attrs) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      for (const k in attrs || {}) e.setAttribute(k, attrs[k]);\n      return e;\n    };\n    let swKind = null;\n    function swatches(kind) {\n      if (!E.sw || !canMake || swKind === kind) return;\n      swKind = kind;\n      E.sw.textContent = \"\";\n      (kind === \"tiles\" ? SPLASH.TILE_COLOURS : SPLASH.GLASS).forEach((c) => {\n        const b = mk(\"button\", \"ub-lab__spswatch\", { type: \"button\", role: \"radio\", \"aria-checked\": \"false\", \"data-ub-spcolour\": c.hex, title: c.name, \"aria-label\": c.name });\n        b.style.backgroundColor = c.hex;\n        b.addEventListener(\"click\", () => act({ colour: c.hex }));\n        E.sw.appendChild(b);\n      });\n    }\n    const kids = (el) => Array.from(el && el.children || []);\n    if (canMake && E.size && !kids(E.size).length) SPLASH.SIZES.forEach((s) => {\n      const o = mk(\"option\", \"\", { value: s.id });\n      o.textContent = s.name;\n      E.size.appendChild(o);\n    });\n    if (canMake && E.layout && !kids(E.layout).length) SPLASH.LAYOUTS.forEach((s) => {\n      const o = mk(\"option\", \"\", { value: s.id });\n      o.textContent = s.name;\n      E.layout.appendChild(o);\n    });\n    if (canMake && E.grout && !kids(E.grout).length) SPLASH.GROUTS.forEach((g2) => {\n      const b = mk(\"button\", \"ub-lab__spswatch ub-lab__spswatch--grout\", { type: \"button\", role: \"radio\", \"aria-checked\": \"false\", \"data-ub-spgroutid\": g2.id, title: g2.name, \"aria-label\": g2.name });\n      b.style.backgroundColor = g2.hex;\n      b.addEventListener(\"click\", () => act({ grout: g2.id }));\n      E.grout.appendChild(b);\n    });\n    if (E.open2 && E.open2.addEventListener) E.open2.addEventListener(\"click\", () => {\n      const D2 = root.__ubDocks;\n      if (D2 && typeof D2.show === \"function\") D2.show(\"splash\");\n    });\n    if (E.on) E.on.addEventListener(\"click\", () => act({ on: !splashOf(ctx.scene().kitchen).on }));\n    E.kinds.forEach((b) => b.addEventListener(\"click\", () => act({ kind: b.getAttribute(\"data-ub-spkind\") })));\n    if (E.custom) E.custom.addEventListener(\"change\", () => act({ colour: E.custom.value }));\n    if (E.size) E.size.addEventListener(\"change\", () => act({ size: E.size.value }));\n    if (E.layout) E.layout.addEventListener(\"change\", () => act({ layout: E.layout.value }));\n    function sync() {\n      const S2 = splashOf(ctx.scene().kitchen);\n      swatches(S2.kind);\n      [E.dot, E.dot2].forEach((d) => {\n        if (!d || !d.classList || !d.style) return;\n        d.classList.toggle(\"is-none\", !S2.on);\n        d.style.backgroundImage = S2.on && S2.kind === \"tiles\" ? \"repeating-linear-gradient(0deg, transparent 0 5px, rgba(0,0,0,.25) 5px 6px), repeating-linear-gradient(90deg, transparent 0 7px, rgba(0,0,0,.25) 7px 8px)\" : S2.on ? \"none\" : \"\";\n        d.style.backgroundColor = S2.on ? S2.colour : \"\";\n      });\n      if (E.open2 && E.open2.setAttribute) E.open2.setAttribute(\"aria-description\", S2.on ? splashName(S2) : \"No splashback\");\n      if (E.on) {\n        E.on.setAttribute(\"aria-pressed\", S2.on ? \"true\" : \"false\");\n        E.on.classList.toggle(\"is-active\", S2.on);\n        E.on.textContent = S2.on ? \"Splashback on\" : \"Add splashback\";\n        E.on.title = S2.on ? splashName(S2) : \"No splashback\";\n      }\n      E.kinds.forEach((b) => {\n        const on = b.getAttribute(\"data-ub-spkind\") === S2.kind;\n        b.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      });\n      if (E.sw) kids(E.sw).forEach((b) => {\n        const on = b.getAttribute(\"data-ub-spcolour\") === S2.colour;\n        b.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      });\n      if (E.custom && (!doc2 || doc2.activeElement !== E.custom)) E.custom.value = S2.colour;\n      if (E.tile) {\n        if (S2.kind === \"tiles\") E.tile.removeAttribute(\"hidden\");\n        else E.tile.setAttribute(\"hidden\", \"\");\n      }\n      if (E.size) E.size.value = S2.tile.size;\n      if (E.layout) E.layout.value = S2.tile.layout;\n      if (E.grout) kids(E.grout).forEach((b) => {\n        const on = b.getAttribute(\"data-ub-spgroutid\") === S2.tile.grout;\n        b.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n        b.classList.toggle(\"is-active\", on);\n      });\n    }\n    sync();\n    return { sync };\n  }\n\n  // v2/src/ui/project-file.js\n  var PROJECT_FILE_FORMAT = \"uniboards.project\";\n  var PROJECT_FILE_VERSION = 1;\n  var PROJECT_FILE_MAX_BYTES = 2 * 1024 * 1024;\n  var plain = (x) => x == null ? null : JSON.parse(JSON.stringify(x));\n  function buildLabProjectFile(o) {\n    const sc = o.scene || {};\n    const units = Array.isArray(sc.units) ? sc.units : [];\n    const plan = workshopDocumentOf(sc) || {\n      v: 1,\n      units: plain(units),\n      kitchen: plain(sc.kitchen || null),\n      room: plain(sc.room || null),\n      activeRun: sc.activeRun || \"main\",\n      drilling: sc.drilling === true\n    };\n    const planScene = { v: 1, units, kitchen: sc.kitchen || null, room: sc.room || null };\n    let worktops = null, appliances = null, splashbacks = null;\n    if (sc.workshop) return { format: PROJECT_FILE_FORMAT, format_version: PROJECT_FILE_VERSION, saved_at: (o.now || /* @__PURE__ */ new Date()).toISOString(), saved_by: { app: \"cabinet-lab\", app_version: o.appVersion || \"\" }, name: o.name || \"Workshop cabinet\", length_unit: \"mm\", plan, plan_parts: null, cutlist: null, model3d: null };\n    try {\n      worktops = calcWorktopBoards(planScene);\n    } catch {\n      worktops = null;\n    }\n    try {\n      appliances = calcApplianceList(planScene);\n    } catch {\n      appliances = null;\n    }\n    try {\n      splashbacks = calcSplashList(planScene);\n    } catch {\n      splashbacks = null;\n    }\n    return {\n      format: PROJECT_FILE_FORMAT,\n      format_version: PROJECT_FILE_VERSION,\n      saved_at: (o.now || /* @__PURE__ */ new Date()).toISOString(),\n      saved_by: { app: \"cabinet-lab\", app_version: o.appVersion || \"\" },\n      name: o.name || \"Cabinet Lab kitchen \\u2014 \" + units.length + \" unit\" + (units.length === 1 ? \"\" : \"s\"),\n      length_unit: \"mm\",\n      plan,\n      plan_parts: { parts: plain(Array.isArray(o.parts) ? o.parts : []), worktops: plain(worktops), appliances: plain(appliances), splashbacks: plain(splashbacks) },\n      cutlist: null,\n      model3d: null\n    };\n  }\n  function readProjectFile(text) {\n    if (typeof text !== \"string\" || !text) return { ok: false, why: \"The file is empty.\" };\n    if (text.length > PROJECT_FILE_MAX_BYTES) return { ok: false, why: \"The file is over 2 MB \\u2014 that is not a project file.\" };\n    let doc2;\n    try {\n      doc2 = JSON.parse(text);\n    } catch {\n      return { ok: false, why: \"This is not a project file \\u2014 pick a .cutspan file.\" };\n    }\n    if (!doc2 || typeof doc2 !== \"object\" || doc2.format !== PROJECT_FILE_FORMAT) return { ok: false, why: \"This is not a CutSpan project file \\u2014 pick a .cutspan file.\" };\n    const v = Number(doc2.format_version);\n    if (!(v >= 1) || Math.floor(v) !== v) return { ok: false, why: \"The project file has no format version.\" };\n    if (v > PROJECT_FILE_VERSION) return { ok: false, why: \"This project file was made by a newer version (format \" + v + \"). Reload the page and try again.\" };\n    const plan = doc2.plan;\n    if (!plan || plan.v !== 1 || !Array.isArray(plan.units) || !plan.units.length) {\n      return { ok: false, why: doc2.cutlist ? \"This project file is a cut list without a Cabinet Lab kitchen \\u2014 open it in the cut-list calculator (Open project file there).\" : \"The project file has no kitchen in it.\" };\n    }\n    for (const u of plan.units) {\n      if (!u || typeof u.type !== \"string\" || !isFinite(u.w) || !isFinite(u.h)) return { ok: false, why: \"The kitchen in the file has a cabinet this page cannot read.\" };\n    }\n    return { ok: true, doc: doc2, plan };\n  }\n  function fileName(doc2) {\n    const base = String(doc2.name || \"kitchen\").replace(/[^A-Za-z0-9 _.-]+/g, \" \").replace(/\\s+/g, \" \").trim().slice(0, 60) || \"kitchen\";\n    return base + \".cutspan\";\n  }\n  function pickerFilter(win2) {\n    const nav = win2 && win2.navigator || {};\n    const ua = String(nav.userAgent || \"\");\n    const touchMac = /Macintosh/.test(ua) && nav.maxTouchPoints > 1;\n    return !(/Android|iPhone|iPad|iPod|Mobile/i.test(ua) || touchMac);\n  }\n  function createProjectFile(ctx) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win;\n    if (!root || !doc2 || !win2) return { sync() {\n    } };\n    const anchor = root.querySelector(\"[data-ub-wandbox]\") || root.querySelector(\".ub-lab__sec--units\");\n    if (!anchor || !anchor.parentNode) return { sync() {\n    } };\n    const box3 = doc2.createElement(\"div\");\n    box3.className = \"ub-lab__pfile\";\n    box3.setAttribute(\"data-ub-pfile\", \"\");\n    box3.innerHTML = '<button type=\"button\" class=\"ub-lab__btn\" data-ub-pfile-down>Download project file</button><button type=\"button\" class=\"ub-lab__btn\" data-ub-pfile-open>Open project file</button><input type=\"file\" data-ub-pfile-input hidden><p class=\"ub-lab__pfilemsg\" data-ub-pfile-msg aria-live=\"polite\"></p>';\n    anchor.parentNode.insertBefore(box3, anchor.nextSibling);\n    const q = (s) => box3.querySelector(s);\n    if (pickerFilter(win2)) q(\"[data-ub-pfile-input]\").setAttribute(\"accept\", \".cutspan,.json,application/json\");\n    const msg = (t) => {\n      q(\"[data-ub-pfile-msg]\").textContent = t || \"\";\n    };\n    function build3() {\n      let parts = [];\n      try {\n        parts = ctx.planParts ? ctx.planParts() : [];\n      } catch {\n        parts = [];\n      }\n      return buildLabProjectFile({ scene: ctx.scene(), parts, appVersion: String(root.getAttribute(\"data-ub-build\") || \"\") });\n    }\n    function download() {\n      const d = build3();\n      if (!d.plan.units.length) {\n        msg(\"There is no kitchen to save yet.\");\n        return null;\n      }\n      const blob = new win2.Blob([JSON.stringify(d, null, 1)], { type: \"application/octet-stream\" });\n      const a = doc2.createElement(\"a\");\n      a.href = win2.URL.createObjectURL(blob);\n      a.download = fileName(d);\n      doc2.body.appendChild(a);\n      a.click();\n      win2.setTimeout(() => {\n        win2.URL.revokeObjectURL(a.href);\n        a.remove();\n      }, 1e3);\n      msg(\"Project file saved: \" + a.download + \". Send it to anyone \\u2014 it opens with Open project file, here or in the cut-list calculator.\");\n      return d;\n    }\n    function openText(text) {\n      const r = readProjectFile(text);\n      if (!r.ok) {\n        msg(r.why + \" Nothing was changed.\");\n        return r;\n      }\n      const out = ctx.act(\"plan.open\", {\n        plan: r.plan,\n        meta: { reason: \"file\" },\n        cue: \"Opened the project file \\u2014 your plan before is kept in this browser\"\n      }) || {};\n      if (out.ok === false) {\n        msg(\"That kitchen could not be opened \\u2014 nothing changed.\");\n        return { ok: false, why: \"unreadable\" };\n      }\n      msg(\"Opened \\xAB\" + (r.doc.name || \"project file\") + \"\\xBB: \" + r.plan.units.length + \" cabinets. It is a new plan here; the one before is kept in this browser.\");\n      return { ok: true, plan: r.plan };\n    }\n    q(\"[data-ub-pfile-down]\").addEventListener(\"click\", download);\n    q(\"[data-ub-pfile-open]\").addEventListener(\"click\", () => {\n      const i = q(\"[data-ub-pfile-input]\");\n      i.value = \"\";\n      i.click();\n    });\n    q(\"[data-ub-pfile-input]\").addEventListener(\"change\", () => {\n      const i = q(\"[data-ub-pfile-input]\"), f = i.files && i.files[0];\n      if (!f) return;\n      if (f.size > PROJECT_FILE_MAX_BYTES) {\n        msg(\"The file is over 2 MB \\u2014 that is not a project file. Nothing was changed.\");\n        return;\n      }\n      const fr = new win2.FileReader();\n      fr.onload = () => openText(String(fr.result || \"\"));\n      fr.onerror = () => msg(\"The file could not be read. Nothing was changed.\");\n      fr.readAsText(f);\n    });\n    root.__ubProjectFile = { build: build3, download, openText };\n    return { sync() {\n    } };\n  }\n\n  // v2/src/ui/file-menu.js\n  var FILE_MENU_IDS = Object.freeze({ button: \"data-ub-file\", menu: \"data-ub-filemenu\" });\n  function fileGuard(s) {\n    const st = s || {};\n    if (st.untouched) return { kind: \"none\", text: \"\", actions: [\"go\"] };\n    if (st.notKept) return {\n      kind: \"lost\",\n      text: \"This browser is not keeping your plan - without a saved copy it is lost.\",\n      actions: [\"file\", \"discard\", \"cancel\"]\n    };\n    if (st.signedIn && st.synced) return {\n      kind: \"account\",\n      text: \"Your plan is saved to your account\" + (st.name ? \" as \\xAB\" + st.name + \"\\xBB\" : \"\") + \".\",\n      actions: [\"go\", \"cancel\"]\n    };\n    if (st.signedIn) return {\n      kind: \"unsynced\",\n      text: \"Your latest changes are not saved to your account yet.\",\n      actions: [\"save\", \"keep\", \"cancel\"]\n    };\n    return { kind: \"browser\", text: \"Your plan is kept in this browser only - not in an account.\", actions: [\"file\", \"keep\", \"cancel\"], signIn: true };\n  }\n  var LABEL2 = {\n    go: \"Continue\",\n    save: \"Save, then continue\",\n    keep: \"Don't save - keep it in this browser\",\n    discard: \"Discard it\",\n    file: \"Download project file first\",\n    cancel: \"Cancel\"\n  };\n  function createFileMenu(ctx) {\n    const root = ctx.root, doc2 = ctx.doc, win2 = ctx.win;\n    if (!root || !doc2 || !win2 || !root.querySelector) return { sync() {\n    } };\n    const dock = root.querySelector(\".ub-lab__dock--top\");\n    if (!dock || !dock.parentNode) return { sync() {\n    } };\n    const acct = () => ctx.account || null;\n    const R4 = () => ctx.recovery || ctx.persist && ctx.persist.recovery || null;\n    const btn = doc2.createElement(\"button\");\n    btn.type = \"button\";\n    btn.className = \"ub-lab__tool ub-lab__filebtn\";\n    btn.setAttribute(FILE_MENU_IDS.button, \"\");\n    btn.setAttribute(\"aria-haspopup\", \"dialog\");\n    btn.setAttribute(\"aria-expanded\", \"false\");\n    btn.setAttribute(\"aria-controls\", \"ub-lab-filemenu\");\n    btn.setAttribute(\"title\", \"File\");\n    btn.setAttribute(\"aria-label\", \"File\");\n    btn.textContent = \"File\";\n    dock.insertBefore(btn, dock.firstChild);\n    const saveBtn = doc2.createElement(\"button\");\n    saveBtn.type = \"button\";\n    saveBtn.className = \"ub-lab__tool ub-lab__savebtn\";\n    saveBtn.setAttribute(\"data-ub-file-quicksave\", \"\");\n    saveBtn.setAttribute(\"aria-controls\", \"ub-lab-filemenu\");\n    saveBtn.setAttribute(\"title\", \"Save project\");\n    saveBtn.setAttribute(\"aria-label\", \"Save project\");\n    saveBtn.textContent = \"Save\";\n    dock.insertBefore(saveBtn, btn.nextSibling);\n    const go = (url) => {\n      if (typeof ctx.navigate === \"function\") return ctx.navigate(url);\n      win2.location.assign(url);\n      return true;\n    };\n    const box3 = doc2.createElement(\"div\");\n    box3.className = \"ub-lab__filemenu\";\n    box3.id = \"ub-lab-filemenu\";\n    box3.setAttribute(FILE_MENU_IDS.menu, \"\");\n    box3.setAttribute(\"role\", \"dialog\");\n    box3.setAttribute(\"aria-label\", \"File\");\n    box3.hidden = true;\n    dock.parentNode.insertBefore(box3, dock.nextSibling);\n    let view = \"main\", busy = false, msgText = \"\";\n    const el = (tag, cls, text) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      if (text != null) e.textContent = text;\n      return e;\n    };\n    const button = (label, attr, onClick, cls) => {\n      const b = el(\"button\", \"ub-lab__btn ub-lab__fileitem\" + (cls ? \" \" + cls : \"\"), label);\n      b.type = \"button\";\n      b.setAttribute(attr, \"\");\n      if (busy) b.disabled = true;\n      b.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n        if (!busy) onClick();\n      });\n      return b;\n    };\n    function state2() {\n      const a = acct();\n      const r = R4();\n      let s = {};\n      try {\n        s = a ? a.state() : {};\n      } catch {\n        s = {};\n      }\n      let planId = null;\n      try {\n        planId = r ? r.state().planId : null;\n      } catch {\n        planId = null;\n      }\n      let failed = false;\n      try {\n        failed = !!(r && (r.state().failed || !r.state().storage));\n      } catch {\n        failed = false;\n      }\n      return {\n        signedIn: !!s.signedIn,\n        synced: !!s.syncedToAccount,\n        kept: !!s.keptInBrowser || !!planId,\n        notKept: !!s.notKept || failed && !!planId,\n        untouched: !planId && !failed,\n        error: s.error || \"\",\n        email: s.email || \"\"\n      };\n    }\n    function where() {\n      const s = state2();\n      if (s.notKept) return \"This browser is not keeping your plan.\";\n      if (s.signedIn) return s.synced ? \"Saved to your account\" + (s.email ? \" (\" + s.email + \")\" : \"\") + \".\" : s.error || \"Not yet saved to your account.\";\n      if (s.untouched) return \"A new plan - nothing to save yet.\";\n      return \"Kept in this browser only.\";\n    }\n    function open() {\n      if (!box3.hidden) return;\n      view = \"main\";\n      msgText = \"\";\n      render();\n      try {\n        const host = dock.parentNode, hr = host.getBoundingClientRect(), dr = dock.getBoundingClientRect();\n        const left = root.querySelector(\".ub-lab__dock--left\");\n        const lr = left && left.offsetParent ? left.getBoundingClientRect() : null;\n        box3.style.top = Math.max(0, Math.round(dr.bottom - hr.top + 6)) + \"px\";\n        box3.style.left = Math.max(8, Math.round((lr ? lr.right : dr.left) - hr.left + 6)) + \"px\";\n        box3.style.width = \"min(300px, calc(100% - \" + (Math.max(8, Math.round((lr ? lr.right : dr.left) - hr.left + 6)) + 8) + \"px))\";\n      } catch {\n      }\n      box3.hidden = false;\n      btn.setAttribute(\"aria-expanded\", \"true\");\n      const first = box3.querySelector(\"button\");\n      if (first) first.focus();\n    }\n    function close(focusBack) {\n      if (box3.hidden) return;\n      box3.hidden = true;\n      btn.setAttribute(\"aria-expanded\", \"false\");\n      view = \"main\";\n      busy = false;\n      msgText = \"\";\n      if (focusBack) btn.focus();\n    }\n    function say(t) {\n      msgText = t || \"\";\n      render();\n    }\n    function head(title, back) {\n      const h = el(\"div\", \"ub-lab__filehead\");\n      if (back) h.appendChild(button(\"\\u2039 Back\", \"data-ub-file-back\", () => {\n        view = \"main\";\n        msgText = \"\";\n        render();\n      }, \"ub-lab__fileback\"));\n      h.appendChild(el(\"span\", \"ub-lab__filetitle\", title));\n      const x = el(\"button\", \"ub-lab__close\", \"\\xD7\");\n      x.type = \"button\";\n      x.setAttribute(\"aria-label\", \"Close\");\n      x.setAttribute(\"title\", \"Close\");\n      x.addEventListener(\"click\", () => close(true));\n      h.appendChild(x);\n      return h;\n    }\n    function guard(what, go2) {\n      const s = state2();\n      const g2 = fileGuard({ untouched: s.untouched, notKept: s.notKept, signedIn: s.signedIn, synced: s.synced });\n      if (g2.kind === \"none\") {\n        go2();\n        return;\n      }\n      view = { guard: g2, what, go: go2 };\n      msgText = \"\";\n      render();\n    }\n    function runGuardAction(k, v) {\n      if (k === \"cancel\") {\n        view = \"main\";\n        msgText = \"\";\n        render();\n        return;\n      }\n      if (k === \"go\" || k === \"keep\" || k === \"discard\") {\n        v.go();\n        return;\n      }\n      if (k === \"file\") {\n        const pf = root.__ubProjectFile;\n        const d = pf && pf.download ? pf.download() : null;\n        if (!d) {\n          say(\"The project file could not be made - nothing was changed.\");\n          return;\n        }\n        v.go();\n        return;\n      }\n      if (k === \"save\") {\n        const a = acct();\n        if (!a) {\n          say(\"Saving to your account is not available here - nothing was changed.\");\n          return;\n        }\n        busy = true;\n        say(\"Saving to your account\\u2026\");\n        Promise.resolve(a.flush ? a.flush(15e3) : a.saveNow()).then(() => {\n          busy = false;\n          if (state2().synced) v.go();\n          else say((state2().error || \"Not saved to your account just now.\") + \" Nothing was changed - try again, or keep it in this browser.\");\n        }, () => {\n          busy = false;\n          say(\"Not saved to your account just now. Nothing was changed - try again.\");\n        });\n      }\n    }\n    function doNew() {\n      guard(\"new\", () => {\n        const nb = root.querySelector(\"[data-ub-newplan]\");\n        if (nb) nb.click();\n        else if (ctx.act) ctx.act(\"plan.reset\", {});\n        close(true);\n      });\n    }\n    function doSave() {\n      const a = acct(), s = state2();\n      if (s.untouched) {\n        view = \"save\";\n        say(\"There is nothing to save yet - add a cabinet first.\");\n        return;\n      }\n      if (!s.signedIn || !a) {\n        view = \"save\";\n        msgText = \"\";\n        render();\n        return;\n      }\n      if (a.offline && a.offline()) {\n        view = \"save\";\n        say(\"You are offline - your plan is kept in this browser and goes to your account when you are back online.\");\n        return;\n      }\n      view = \"save\";\n      busy = true;\n      say(\"Saving to your account\\u2026\");\n      Promise.resolve(a.flush ? a.flush(15e3) : a.saveNow()).then(() => {\n        busy = false;\n        say(state2().synced ? \"Saved to your account.\" : (state2().error || \"Not saved to your account just now.\") + \" It is kept in this browser.\");\n      }, () => {\n        busy = false;\n        say(\"Not saved to your account just now. It is kept in this browser.\");\n      });\n    }\n    function doOpen() {\n      view = \"open\";\n      msgText = \"\";\n      listing = null;\n      render();\n      const a = acct();\n      if (a && state2().signedIn && a.listProjects) {\n        listing = { loading: true, items: [] };\n        render();\n        a.listProjects().then(\n          (r) => {\n            listing = r && r.ok ? { items: r.items } : { error: true, items: [] };\n            render();\n          },\n          () => {\n            listing = { error: true, items: [] };\n            render();\n          }\n        );\n      }\n    }\n    let listing = null;\n    function openAccount(token, name2) {\n      guard(\"open\", () => {\n        const a = acct();\n        if (!a) return;\n        busy = true;\n        view = \"open\";\n        say(\"Opening \\xAB\" + name2 + \"\\xBB\\u2026\");\n        a.openProject(token).then((o) => {\n          busy = false;\n          if (o && o.ok) close(true);\n          else say(\"\\xAB\" + name2 + \"\\xBB could not be opened - nothing was changed.\");\n        }, () => {\n          busy = false;\n          say(\"\\xAB\" + name2 + \"\\xBB could not be opened - nothing was changed.\");\n        });\n      });\n    }\n    function openBrowser(id) {\n      guard(\"open\", () => {\n        const out = ctx.act ? ctx.act(\"plan.switch\", { id }) : null;\n        if (out && out.ok !== false) close(true);\n        else {\n          view = \"open\";\n          say(\"That plan could not be opened - nothing was changed.\");\n        }\n      });\n    }\n    function openFile() {\n      guard(\"open\", () => {\n        const b = root.querySelector(\"[data-ub-pfile-open]\");\n        close(false);\n        if (b) b.click();\n      });\n    }\n    function render() {\n      box3.textContent = \"\";\n      if (view && view.guard) {\n        const g2 = view.guard;\n        box3.appendChild(head(view.what === \"new\" ? \"New project\" : \"Open project\", true));\n        box3.appendChild(el(\"p\", \"ub-lab__filetext\", g2.text));\n        const list = el(\"div\", \"ub-lab__filelist\");\n        for (const k of g2.actions) list.appendChild(button(LABEL2[k], \"data-ub-file-\" + k, () => runGuardAction(k, view)));\n        box3.appendChild(list);\n        if (g2.signIn) signInLink();\n      } else if (view === \"save\") {\n        box3.appendChild(head(\"Save project\", true));\n        const s = state2(), a = acct();\n        if (!s.signedIn && !s.untouched && a && a.newAccounts && a.prepareSignIn) {\n          box3.appendChild(el(\"p\", \"ub-lab__filetext\", \"Saved in this browser. Sign in to save to your account - your plan stays here while you sign in and comes back with you.\"));\n          const list = el(\"div\", \"ub-lab__filelist\");\n          list.appendChild(button(\"Sign in and save\", \"data-ub-file-signin\", () => {\n            const r = a.prepareSignIn();\n            if (r && r.ok) {\n              say(\"Opening sign-in\\u2026\");\n              go(r.url);\n            } else say(r && r.message || \"Your plan could not be kept for the sign-in - download a project file first.\");\n          }, \"ub-lab__btn--main\"));\n          list.appendChild(button(\"Download project file\", \"data-ub-file-download\", () => {\n            const pf = root.__ubProjectFile;\n            const d = pf && pf.download ? pf.download() : null;\n            say(d ? \"Project file downloaded.\" : \"The project file could not be made.\");\n          }));\n          box3.appendChild(list);\n        } else if (!s.signedIn && !s.untouched) {\n          box3.appendChild(el(\"p\", \"ub-lab__filetext\", \"Your plan is kept in this browser only. Sign in to save it to your account and open it on any device, or download a project file.\"));\n          const list = el(\"div\", \"ub-lab__filelist\");\n          list.appendChild(button(\"Download project file\", \"data-ub-file-download\", () => {\n            const pf = root.__ubProjectFile;\n            const d = pf && pf.download ? pf.download() : null;\n            say(d ? \"Project file downloaded.\" : \"The project file could not be made.\");\n          }));\n          box3.appendChild(list);\n          signInLink();\n        } else if (s.signedIn && !busy && !s.synced && msgText) {\n          const list = el(\"div\", \"ub-lab__filelist\");\n          list.appendChild(button(\"Try again\", \"data-ub-file-retry\", doSave));\n          box3.appendChild(list);\n        }\n        void a;\n      } else if (view === \"open\") {\n        box3.appendChild(head(\"Open project\", true));\n        const s = state2();\n        if (s.signedIn) {\n          box3.appendChild(el(\"p\", \"ub-lab__filesub\", \"Your account\"));\n          const list2 = el(\"div\", \"ub-lab__filelist\");\n          if (!listing || listing.loading) list2.appendChild(el(\"p\", \"ub-lab__filetext\", \"Loading your projects\\u2026\"));\n          else if (listing.error) list2.appendChild(el(\"p\", \"ub-lab__filetext\", \"Your projects could not be listed just now.\"));\n          else if (!listing.items.length) list2.appendChild(el(\"p\", \"ub-lab__filetext\", \"No projects in your account yet.\"));\n          else for (const it of listing.items.slice(0, 20)) {\n            const label = it.name + (it.updatedAt ? \" \\xB7 \" + when(it.updatedAt) : \"\") + (it.current ? \" (open now)\" : \"\");\n            const b = button(label, \"data-ub-file-acct\", () => openAccount(it.token, it.name));\n            if (it.current) b.disabled = true;\n            list2.appendChild(b);\n          }\n          box3.appendChild(list2);\n        }\n        const r = R4();\n        let others2 = [];\n        try {\n          others2 = r && r.others ? r.others() : [];\n        } catch {\n          others2 = [];\n        }\n        if (others2.length) {\n          box3.appendChild(el(\"p\", \"ub-lab__filesub\", \"In this browser\"));\n          const list2 = el(\"div\", \"ub-lab__filelist\");\n          for (const o of others2.slice(0, 10)) list2.appendChild(button(\"Plan of \" + (o.n || 0) + \" cabinet\" + (o.n === 1 ? \"\" : \"s\") + (o.at ? \" \\xB7 \" + when(o.at) : \"\"), \"data-ub-file-local\", () => openBrowser(o.id)));\n          box3.appendChild(list2);\n        }\n        const list = el(\"div\", \"ub-lab__filelist\");\n        if (root.querySelector(\"[data-ub-pfile-open]\")) list.appendChild(button(\"Open project file\\u2026\", \"data-ub-file-openfile\", openFile));\n        box3.appendChild(list);\n        if (!s.signedIn) signInLink(\"Sign in to see the projects saved to your account\");\n      } else {\n        box3.appendChild(head(\"File\", false));\n        const list = el(\"div\", \"ub-lab__filelist\");\n        list.appendChild(button(\"New project\", \"data-ub-file-new\", doNew));\n        list.appendChild(button(\"Open project\\u2026\", \"data-ub-file-open\", doOpen));\n        list.appendChild(button(\"Save project\", \"data-ub-file-save\", doSave));\n        box3.appendChild(list);\n        box3.appendChild(el(\"p\", \"ub-lab__filestate\", where()));\n      }\n      if (msgText) {\n        const m = el(\"p\", \"ub-lab__filemsg\", msgText);\n        m.setAttribute(\"role\", \"status\");\n        box3.appendChild(m);\n      }\n    }\n    function signInLink(text) {\n      const a = acct();\n      if (!a || !a.signInUrl) return;\n      const l = el(\"a\", \"ub-lab__filelink\", text || \"Sign in to save to your account\");\n      l.setAttribute(\"href\", a.signInUrl());\n      if (a.newAccounts && a.prepareSignIn) l.addEventListener(\"click\", (e) => {\n        const r = a.prepareSignIn();\n        if (!(r && r.ok) && !(r && r.why === \"empty\")) {\n          e.preventDefault();\n          say(r && r.message || \"Your plan could not be kept for the sign-in - download a project file first.\");\n        }\n      });\n      box3.appendChild(l);\n    }\n    function when(iso) {\n      const d = new Date(iso);\n      if (isNaN(d.getTime())) return \"\";\n      try {\n        return d.toLocaleString(\"en-GB\", { day: \"numeric\", month: \"short\", hour: \"2-digit\", minute: \"2-digit\" });\n      } catch {\n        return d.toISOString().slice(0, 16);\n      }\n    }\n    btn.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      if (box3.hidden) open();\n      else close(true);\n    });\n    saveBtn.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      if (box3.hidden) open();\n      doSave();\n    });\n    box3.addEventListener(\"keydown\", (e) => {\n      if (e.key === \"Escape\") {\n        e.preventDefault();\n        e.stopPropagation();\n        close(true);\n        return;\n      }\n      if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n        const items = [...box3.querySelectorAll(\"button:not([disabled])\")];\n        const i = items.indexOf(doc2.activeElement);\n        const n = items.length;\n        if (!n) return;\n        e.preventDefault();\n        items[(i + (e.key === \"ArrowDown\" ? 1 : -1) + n) % n].focus();\n      }\n    });\n    doc2.addEventListener(\"pointerdown\", (e) => {\n      if (box3.hidden) return;\n      const t = e.target;\n      if (t && (box3.contains(t) || btn.contains(t) || saveBtn.contains(t))) return;\n      close(false);\n    }, true);\n    root.__ubFileMenu = { open, close, state: state2, save: doSave, view: () => view && view.guard ? \"guard:\" + view.guard.kind : view };\n    return { sync() {\n      if (!box3.hidden && view === \"main\") render();\n    } };\n  }\n\n  // v2/src/ui/build-settings.js\n  var HEADS = { carcass: \"Top and bottom\", back: \"Back panel\" };\n  var NOTE = \"These choices apply where the cabinet construction supports them. Standard keeps each type's current workshop construction. Inspect build lists remaining differences and workshop checks.\";\n  function createBuildSettings(ctx) {\n    if (editionOf(ctx.root) !== PRO) return {};\n    const doc2 = ctx.doc;\n    const folds = ctx.root.querySelector(\".ub-lab__sec--folds\");\n    if (!doc2 || !folds || !folds.parentNode) return {};\n    const sec = doc2.createElement(\"section\");\n    sec.className = \"ub-lab__sec ub-lab__sec--build\";\n    sec.setAttribute(\"data-ub-build-settings\", \"\");\n    const h = doc2.createElement(\"h3\");\n    h.className = \"ub-lab__sechead\";\n    h.textContent = \"Construction\";\n    sec.appendChild(h);\n    const buttons = [];\n    for (const k of Object.keys(BUILD_CHOICES)) {\n      const row = doc2.createElement(\"div\");\n      row.className = \"ub-lab__optrow\";\n      row.setAttribute(\"role\", \"group\");\n      row.setAttribute(\"aria-label\", HEADS[k]);\n      const lab = doc2.createElement(\"span\");\n      lab.className = \"ub-lab__optlabel\";\n      lab.textContent = HEADS[k];\n      row.appendChild(lab);\n      const opts = doc2.createElement(\"div\");\n      opts.className = \"ub-lab__opts\";\n      for (const [v, text] of [[\"standard\", \"Standard\"], ...BUILD_CHOICES[k]]) {\n        const b = doc2.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"ub-lab__btn\";\n        b.textContent = text;\n        b.setAttribute(\"data-ub-buildopt\", k + \":\" + v);\n        b.setAttribute(\"aria-pressed\", \"false\");\n        b.addEventListener(\"click\", () => ctx.act(\"kitchen.build\", { [k]: v }));\n        opts.appendChild(b);\n        buttons.push([k, v, b]);\n      }\n      row.appendChild(opts);\n      sec.appendChild(row);\n    }\n    const note = doc2.createElement(\"p\");\n    note.className = \"ub-lab__note\";\n    note.textContent = NOTE;\n    sec.appendChild(note);\n    const xrow = doc2.createElement(\"div\");\n    xrow.className = \"ub-lab__optrow\";\n    const xl = doc2.createElement(\"span\");\n    xl.className = \"ub-lab__optlabel\";\n    xl.textContent = \"View\";\n    xrow.appendChild(xl);\n    const xo = doc2.createElement(\"div\");\n    xo.className = \"ub-lab__opts\";\n    const xb = doc2.createElement(\"button\");\n    xb.type = \"button\";\n    xb.className = \"ub-lab__btn\";\n    xb.textContent = \"Hardware X-ray\";\n    xb.setAttribute(\"data-ub-hwxray\", \"\");\n    xb.setAttribute(\"aria-pressed\", \"false\");\n    xb.title = \"Every board faint: the hinges, runners and legs show through\";\n    xb.addEventListener(\"click\", () => ctx.act(\"view.hardwareXray\", {}));\n    xo.appendChild(xb);\n    xrow.appendChild(xo);\n    sec.insertBefore(xrow, note);\n    folds.parentNode.insertBefore(sec, folds);\n    return {\n      sync() {\n        const b = normBuild(kitchenOf2(ctx.scene().kitchen).build);\n        for (const [k, v, el] of buttons) el.setAttribute(\"aria-pressed\", String((b[k] || \"standard\") === v));\n        xb.setAttribute(\"aria-pressed\", String(!!ctx.scene().hardwareXray));\n      },\n      destroy() {\n        if (sec.parentNode) sec.parentNode.removeChild(sec);\n      }\n    };\n  }\n\n  // v2/src/ui/production-hardware-state.js\n  var wanted = (s) => !!(s.hardwareXray || fixingsShown(s) || s.inspectProduction);\n  var productionOf = (result) => {\n    const p = result && result.production;\n    return p && Array.isArray(p.rows) && Array.isArray(p.cabinets) ? p : null;\n  };\n  function createHardwareState({ scene, publish, request, hash, delay = 300, schedule = setTimeout, cancel = clearTimeout }) {\n    let seq = 0, timer = null, controller = null, current = null, cached2 = null, stopped = false;\n    const set = (state2) => {\n      current = state2;\n      publish({ enabled: true, ...state2 });\n    };\n    function stopRequest() {\n      seq++;\n      if (timer != null) cancel(timer);\n      timer = null;\n      controller == null ? void 0 : controller.abort();\n      controller = null;\n    }\n    function sync() {\n      if (stopped) return;\n      const s = scene();\n      if (!wanted(s)) {\n        if ((current == null ? void 0 : current.status) !== \"idle\") {\n          stopRequest();\n          set({ status: \"idle\", key: null, packet: null });\n        }\n        return;\n      }\n      const key = hardwareKey(s);\n      if ((current == null ? void 0 : current.key) === key && current.status !== \"idle\") return;\n      stopRequest();\n      if ((cached2 == null ? void 0 : cached2.key) === key) {\n        set({ status: \"ready\", key, packet: cached2.packet, production: cached2.production });\n        return;\n      }\n      if (!request) {\n        set({ status: \"error\", key, packet: null, message: \"Production hardware service is not connected.\" });\n        return;\n      }\n      set({ status: \"loading\", key, packet: null });\n      const id = seq;\n      timer = schedule(async () => {\n        var _a, _b, _c;\n        timer = null;\n        controller = new AbortController();\n        try {\n          const expected = await hash(key);\n          if (stopped || id !== seq) return;\n          const result = await request(JSON.parse(key), controller.signal);\n          if (stopped || id !== seq || !wanted(scene()) || hardwareKey(scene()) !== key) return;\n          const packet = result == null ? void 0 : result.hardware;\n          if (!(result == null ? void 0 : result.ok) || (packet == null ? void 0 : packet.v) !== 1 || ((_a = packet.frame) == null ? void 0 : _a.origin) !== \"workshop-floor\" || ((_b = packet.frame) == null ? void 0 : _b.units) !== \"mm\" || ((_c = packet.frame) == null ? void 0 : _c.assembly) !== \"closed\" || packet.sourceSha256 !== expected || !Array.isArray(packet.cabinets) || packet.cabinets.some((c) => !Array.isArray(c.panels))) throw new Error(\"Production hardware response does not match this plan.\");\n          const ids = packet.cabinets.map((c) => String(c.unitId));\n          if (new Set(ids).size !== ids.length) throw new Error(\"Production hardware has ambiguous cabinet identities.\");\n          const production = productionOf(result);\n          if (production && production.sourceSha256 && production.sourceSha256 !== expected) throw new Error(\"Workshop parts do not match this plan.\");\n          cached2 = { key, packet, production };\n          set({ status: \"ready\", key, packet, production });\n        } catch (e) {\n          if (!stopped && id === seq && wanted(scene()) && hardwareKey(scene()) === key)\n            set({ status: \"error\", key, packet: null, message: String(e.message || e) });\n        }\n      }, delay);\n    }\n    return { sync, destroy() {\n      stopped = true;\n      stopRequest();\n      cached2 = null;\n    }, retry() {\n      current = null;\n      sync();\n    } };\n  }\n\n  // v2/src/ui/production-hardware.js\n  function createProductionHardware(ctx) {\n    var _a, _b;\n    if (editionOf(ctx.root) !== PRO) return {};\n    const sec = ctx.root.querySelector(\"[data-ub-build-settings]\");\n    if (!sec || !ctx.doc) return {};\n    const note = ctx.doc.createElement(\"p\");\n    note.className = \"ub-lab__note\";\n    note.setAttribute(\"data-ub-production-hardware\", \"\");\n    note.setAttribute(\"aria-live\", \"polite\");\n    sec.appendChild(note);\n    const retry = ctx.doc.createElement(\"button\");\n    retry.type = \"button\";\n    retry.className = \"ub-lab__btn\";\n    retry.textContent = \"Retry hardware\";\n    retry.hidden = true;\n    sec.appendChild(retry);\n    const win2 = ctx.win || globalThis;\n    let endpoint = null;\n    try {\n      const u = new URL((_a = ctx.config) == null ? void 0 : _a.hardwareEndpoint, win2.location.href);\n      if (((_b = ctx.config) == null ? void 0 : _b.hardwareEndpoint) && u.origin === win2.location.origin) endpoint = u.href;\n    } catch {\n    }\n    const controller = createHardwareState({\n      scene: () => ctx.scene(),\n      publish: (state2) => {\n        var _a2;\n        ctx.scene().productionHardware = state2;\n        drawNote();\n        (_a2 = ctx.view) == null ? void 0 : _a2.requestRender();\n      },\n      hash: async (raw) => Array.from(new Uint8Array(await win2.crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(raw))), (b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n      request: endpoint && (async (scene, signal) => {\n        const r = await win2.fetch(endpoint, { method: \"POST\", credentials: \"omit\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify({ scene }), signal });\n        if (!r.ok) throw new Error(\"Production hardware is unavailable (HTTP \" + r.status + \").\");\n        return r.json();\n      })\n    });\n    function drawNote() {\n      const s = ctx.scene(), state2 = s.productionHardware;\n      let text = \"\", detail = \"\";\n      if (s.hardwareXray && (state2 == null ? void 0 : state2.status) === \"loading\") text = \"Loading production hardware\\u2026\";\n      if (s.hardwareXray && (state2 == null ? void 0 : state2.status) === \"error\") text = state2.message;\n      if (s.hardwareXray && (state2 == null ? void 0 : state2.status) === \"ready\") {\n        const p = hardwarePrimitives(s, state2);\n        text = \"Production hardware: \" + (p.items.length - p.envelopes) + \" silhouettes; \" + (p.envelopes + p.paths.length) + \" Cabineo machining envelopes (orange).\";\n        if (p.skipped || p.pending || p.unsupported.length) text += \" Not shown: \" + p.skipped + \" on differently built parts, \" + p.pending + \" pending operations, \" + p.unsupported.length + \" unsupported cabinets.\";\n        detail = \"Blue/green/steel: fitting silhouettes at production coordinates. Orange: confirmed machined seats, not an exact Cabineo product mesh.\\n\" + p.unsupported.map((u) => String(u.id) + \": \" + u.why).concat(p.warnings).join(\"\\n\");\n      }\n      const fx = !s.hardwareXray && fixingsShown(s);\n      if (fx && (state2 == null ? void 0 : state2.status) === \"loading\") text = \"Loading the chosen fixings from the workshop\\u2026\";\n      if (fx && (state2 == null ? void 0 : state2.status) === \"error\") text = state2.message;\n      if (fx && (state2 == null ? void 0 : state2.status) === \"ready\") {\n        const p = fixingPrimitives(s, state2);\n        text = \"Fixings: \" + p.envelopes + \" Cabineo seats and \" + p.paths.length + \" collar envelopes (orange) at the workshop's positions - machining outlines, not the Cabineo product.\" + (p.notBuilt.length ? \" Not joined with Cabineo by the workshop yet: \" + p.notBuilt.join(\", \") + \" - nothing drawn for them.\" : \"\");\n        detail = \"\";\n      }\n      if (note.textContent !== text) note.textContent = text;\n      note.title = detail;\n      note.hidden = !(s.hardwareXray || fx);\n      retry.hidden = !((s.hardwareXray || fx) && (state2 == null ? void 0 : state2.status) === \"error\");\n    }\n    retry.addEventListener(\"click\", () => controller.retry());\n    return {\n      sync() {\n        controller.sync();\n        drawNote();\n      },\n      frame() {\n        controller.sync();\n      },\n      destroy() {\n        controller.destroy();\n        delete ctx.scene().productionHardware;\n        note.remove();\n        retry.remove();\n      }\n    };\n  }\n\n  // v2/src/ui/build-inspect.js\n  function whyNotCut(p, s, cfg) {\n    if (p.kind === \"leg\") return \"Hardware (adjustable leg) - not a cut board\";\n    if (p.kind === \"drawer-box\") return \"Drawer box - \" + MODEL1.name + \" boards below; bought in / quoted, not in the priced cut list\";\n    if ((p.kind === \"door\" || p.kind === \"drawer-front\") && !cfg.includeFronts) return \"Fronts are not in this cut list\";\n    if ((p.kind === \"door\" || p.kind === \"drawer-front\") && s.frontMat === \"mdf-paint\") return \"Painted MDF front - quoted, not priced as a board\";\n    if (p.kind === \"door\") return \"Glass door frame - quoted, not priced as a board\";\n    if (p.kind === \"finishing\") return \"Painted end / scribe panel - quoted with the painted doors\";\n    return \"Not in the priced cut list\";\n  }\n  function inspectUnit(src) {\n    if (typeof src === \"string\") {\n      const u = newUnit(src, 0, 0);\n      u.id = \"inspect\";\n      return calcShut(u);\n    }\n    const c = JSON.parse(JSON.stringify(src || {}));\n    return calcShut(c);\n  }\n  function buildInspection(src, opts) {\n    opts = opts || {};\n    const cfg = opts.cfg || CALC_DEFAULTS;\n    const u = inspectUnit(src);\n    const out = { unit: u, parts: [], extraRows: [], drawerBoxes: [], supported: true, unsupported: [], construction: null };\n    if (isIsland(u)) {\n      out.supported = false;\n      out.unsupported.push(\"Island: its bays and skin are listed by sections in the cut list; the build inspector does not draw islands yet.\");\n    }\n    const parts = cabinetParts(u);\n    const rows = isIsland(u) ? [] : calcUnitRows(u, cfg);\n    const used = rows.map(() => false);\n    let n = 0;\n    parts.forEach(function(p) {\n      let ri = -1;\n      for (let i = 0; i < rows.length; i++) if (!used[i] && rows[i].name === p.name) {\n        ri = i;\n        break;\n      }\n      if (ri >= 0) used[ri] = true;\n      const row = ri >= 0 ? rows[ri] : null;\n      n++;\n      out.parts.push({\n        ref: \"P\" + n,\n        pid: p.pid,\n        name: p.name,\n        kind: p.kind,\n        label: PART_KIND_LABEL[p.kind] || p.label || \"Part\",\n        material: p.material,\n        materialLabel: row ? row.material : finishLabel(p.material || \"white\"),\n        local: p.local,\n        ex: p.ex,\n        mm: p.mm,\n        thickness: row ? row.thickness : p.thickness,\n        notches: p.notches || null,\n        xn: p.xn == null ? null : p.xn,\n        // an added drawer's canonical number (model/parts.js), its box's identity\n        ops: wsOps(u, p.name),\n        // the workshop's operations on this board, where its rules define them\n        row,\n        inCutList: !!row,\n        why: row ? \"\" : whyNotCut(p, u, cfg)\n      });\n    });\n    rows.forEach(function(r, i) {\n      if (!used[i]) out.extraRows.push(r);\n    });\n    drawerBoxes(u).forEach(function(b) {\n      out.drawerBoxes.push({\n        i: b.i,\n        xn: b.xn == null ? null : b.xn,\n        name: b.name,\n        w: b.w,\n        l: b.l,\n        h: b.h,\n        x0: b.x0,\n        x1: b.x1,\n        by0: b.by0,\n        by1: b.by1,\n        parts: model1Parts(b.w, b.l, b.h).parts\n      });\n    });\n    const match = matchDrawerBoxes(out.parts, out.drawerBoxes);\n    out.parts.forEach(function(p, pi) {\n      if (p.kind !== \"drawer-box\") return;\n      const k = match[pi].k;\n      if (k < 0) {\n        p.box = null;\n        p.boxBasis = \"none\";\n        return;\n      }\n      const basis = match[pi].basis, b = out.drawerBoxes[k];\n      p.box = { i: b.i, xn: b.xn == null ? null : b.xn, name: b.name, w: b.w, l: b.l, h: b.h };\n      p.boxBasis = basis;\n      p.subs = b.parts.map(function(q, j) {\n        return { ref: p.ref + \".\" + (j + 1), name: q.name, qty: q.qty, L: q.L, W: q.W, ops: q.ops };\n      });\n    });\n    out.source = typeof src === \"string\" ? { kind: \"catalogue\", type: src } : { kind: \"placed\", id: src && src.id != null ? String(src.id) : null, type: u.type };\n    out.construction = constructionOf(u, opts.kitchen || (u.build ? { build: u.build } : null));\n    return out;\n  }\n  function matchDrawerBoxes(parts, boxes) {\n    const near2 = function(a, b) {\n      return a != null && b != null && Math.abs(a - b) <= 0.6;\n    };\n    const taken = /* @__PURE__ */ new Set(), idx = boxes.map(function(b, j) {\n      return j;\n    });\n    return parts.map(function(p) {\n      if (p.kind !== \"drawer-box\") return { k: -1, basis: \"none\" };\n      const c = p.xn != null ? idx.filter(function(j) {\n        return !taken.has(j) && boxes[j].xn === p.xn;\n      }) : idx.filter(function(j) {\n        const b = boxes[j];\n        return !taken.has(j) && b.xn == null && near2(p.local.x0, b.x0) && near2(p.local.x1, b.x1) && near2(p.local.y0, b.by0) && near2(p.local.y1, b.by1);\n      });\n      if (c.length !== 1) return { k: -1, basis: \"none\" };\n      taken.add(c[0]);\n      return { k: c[0], basis: p.xn != null ? \"drawer-id\" : \"position\" };\n    });\n  }\n  function constructionOf(u, kitchen) {\n    const b = normBuild(kitchen && kitchen.build);\n    const choice = Object.keys(b).map(function(k) {\n      const c = BUILD_CHOICES[k].find(function(x) {\n        return x[0] === b[k];\n      });\n      return (k === \"carcass\" ? \"Top and bottom: \" : \"Back: \") + (c ? c[1] : b[k]);\n    });\n    const base = u.family === \"base\" || /^base/.test(u.type || \"\");\n    const wall = u.family === \"wall\";\n    const known = [\n      \"Boards as drawn and listed: 18 mm board unless the row says otherwise; sizes, material, edging and grain are the cut list's own.\",\n      u.build && u.build.carcass === \"over\" && /^(base|base-double|base-drawer|base-4drawer|wall|tall-pantry)$/.test(u.type) ? \"Top and bottom run over the sides; the sides sit between them, as drawn.\" : \"Sides run the full height; the bottom (and a wall unit's top) sit between them - the Lab's standard geometry, as drawn.\",\n      \"Where Cabineo is used (owner 05.09 / 13.09.2026): the part presenting its EDGE carries the male, the face the female, cups facing out - per joint. Which joints of THIS cabinet use it is not in this model.\",\n      \"Finished depth = the side panels' depth; one back panel only (owner 31.08.2026).\"\n    ];\n    if (base) known.push(\"Base: no full top (owner 05.09 / 11.09.2026) - the drawing shows the Lab's rails at the top.\");\n    if (wall) known.push(\"Wall: keeps a full top (owner 05.09 / 11.09.2026).\");\n    if (drawerBoxes(u).length) known.push(\"Drawer boxes: \" + MODEL1.name + \" (owner 13.09.2026) - the base in 18 x 6 side grooves 16 mm up, front and back on the base, no groove.\");\n    const bk = wsBack(u), aligned = wsAligned(u);\n    const unresolved = [\n      \"Joint positions and counts are not part of this model (two Cabineo per joint on 05.09 vs one per rail end in later notes)\",\n      \"Hinge, runner, shelf-pin and connector drilling - not part of this model (no CNC claim)\",\n      \"Back fixing in the owner's dated rules: inset 18 mm (31.08), let-in groove / rebate (05.09) or screw-on (11.09) - drawn: \" + (bk ? \"as the workshop builds it (\" + bk.mode + \")\" : \"the Lab's own back board\")\n    ];\n    if (base) unresolved.push(\"Top rails: one front rail ~100 mm (owner 11.09.2026) vs two rails in the Lab and the workshop converter (05.10.2026) - not reconciled\");\n    if (wall) unresolved.push(\"Wall back: 18 mm inset (owner 31.08.2026) vs the workshop's 3 mm grooved back - drawn as the workshop builds it\");\n    drawerBoxes(u).length && MODEL1_OPEN.forEach(function(x) {\n      unresolved.push(\"Drawer box: \" + x);\n    });\n    const fx = fixingOf(u);\n    known.push(\"Fixings: \" + fx.label + \" - \" + fx.ops + \".\");\n    if (fx.pilot) fx.pilot.known.forEach(function(x) {\n      known.push(\"Screws: \" + x);\n    });\n    fx.pending.forEach(function(x) {\n      unresolved.push(\"Screws: \" + x);\n    });\n    return {\n      shown: aligned ? \"As the workshop builds it (the Furniture Configurator's rules for this cabinet\" + (choice.length ? \" and this construction\" : \"\") + \")\" : \"The Lab's own boards - not yet the workshop's for this cabinet type (see the differences)\",\n      aligned,\n      diffs: buildDiffs(u),\n      choice,\n      choiceNote: choice.length ? aligned ? \"Chosen in the Construction settings - drawn and listed as the workshop builds it.\" : \"Chosen in the Construction settings and sent to the workshop - not drawn for this cabinet type.\" : \"\",\n      known,\n      unresolved,\n      ready: false,\n      readyNote: \"Not a manufacturing drawing: joints and machining are not defined here.\"\n    };\n  }\n  function inspectionParity(ins, cfg) {\n    const rows = isIsland(ins.unit) ? [] : calcUnitRows(ins.unit, cfg || CALC_DEFAULTS);\n    const listed = ins.parts.filter(function(p) {\n      return p.row;\n    }).map(function(p) {\n      return p.row;\n    }).concat(ins.extraRows);\n    const key = function(r) {\n      return [r.name, r.material, r.thickness, r.length, r.width, r.grain, JSON.stringify(r.edging)].join(\"|\");\n    };\n    const a = rows.map(key).sort(), b = listed.map(key).sort();\n    return { ok: a.length === b.length && a.every(function(k, i) {\n      return k === b[i];\n    }), rows: a.length, listed: b.length };\n  }\n\n  // v2/src/ui/binsp-viewer.js\n  var PITCH_MAX = Math.PI / 2 - 87e-4;\n  var VIEW0 = { yaw: -0.6, pitch: 0.38 };\n  function viewerUnit(u, explode) {\n    const c = JSON.parse(JSON.stringify(u));\n    c.x = 0;\n    c.z = 0;\n    c.rot = 0;\n    c.dispX = 0;\n    c.dispY = 0;\n    c.dispZ = 0;\n    c.explode = explode || 0;\n    return c;\n  }\n  function viewerPartBoxes(c) {\n    const off = explodeMM(c);\n    return cabinetParts(c).map((p) => {\n      const e = !off || !p.ex || p.exFixed || EXPLODE_FIXED[p.name] ? [0, 0, 0] : [p.ex[0] * off, p.ex[1] * off, p.ex[2] * off];\n      const b = p.box;\n      return { pid: p.pid, name: p.name, x0: b.x0 + e[0], x1: b.x1 + e[0], y0: b.y0 + e[1], y1: b.y1 + e[1], z0: b.z0 + e[2], z1: b.z1 + e[2] };\n    });\n  }\n  function orbitEye(o) {\n    const cp = Math.cos(o.pitch), sp = Math.sin(o.pitch);\n    return [o.tx + o.dist * cp * Math.sin(o.yaw), o.ty + o.dist * sp, o.tz + o.dist * cp * Math.cos(o.yaw)];\n  }\n  function clampPitch2(p) {\n    return Math.max(-PITCH_MAX, Math.min(PITCH_MAX, p));\n  }\n  function createBinspViewer(opts) {\n    const THREE = opts.three, canvas = opts.canvas, win2 = opts.window || canvas.ownerDocument && canvas.ownerDocument.defaultView;\n    const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: false, preserveDrawingBuffer: !!opts.keepBuffer });\n    renderer.setPixelRatio(Math.min(2, win2 && win2.devicePixelRatio || 1));\n    const scene = new THREE.Scene();\n    scene.background = new THREE.Color(14672872);\n    const camera = new THREE.PerspectiveCamera(35, 1, 10, 1e5);\n    scene.add(new THREE.HemisphereLight(16777215, 10133672, 1.25));\n    const key = new THREE.DirectionalLight(16777215, 2.1), fill = new THREE.DirectionalLight(16777215, 0.55);\n    camera.add(key);\n    key.position.set(-0.6, 0.8, 0.5);\n    camera.add(fill);\n    fill.position.set(0.7, -0.2, 0.6);\n    scene.add(camera);\n    const group = new THREE.Group();\n    scene.add(group);\n    let mesh = null, outline2 = null, edges = null, boxes = [], unit2 = null, selPid = null;\n    const o = { yaw: VIEW0.yaw, pitch: VIEW0.pitch, dist: 2e3, tx: 0, ty: 0, tz: 0, fitR: 600, fitC: [0, 0, 0] };\n    let mode = \"rotate\", dirty = true, raf = 0, disposed = false;\n    const listeners = [];\n    const on = (el, ev, fn, o2) => {\n      el.addEventListener(ev, fn, o2);\n      listeners.push([el, ev, fn, o2]);\n    };\n    function size3() {\n      const w = Math.max(1, Math.round(canvas.clientWidth || 600)), h = Math.max(1, Math.round(canvas.clientHeight || 400));\n      const c = renderer.getSize(new THREE.Vector2());\n      if (c.x !== w || c.y !== h) renderer.setSize(w, h, false);\n      camera.aspect = w / h;\n      camera.updateProjectionMatrix();\n    }\n    function place2() {\n      const e = orbitEye(o);\n      camera.position.set(e[0], e[1], e[2]);\n      camera.up.set(0, 1, 0);\n      camera.lookAt(o.tx, o.ty, o.tz);\n      camera.near = Math.max(1, o.dist / 200);\n      camera.far = o.dist * 20 + o.fitR * 20;\n      camera.updateProjectionMatrix();\n    }\n    function frame2() {\n      raf = 0;\n      if (disposed) return;\n      size3();\n      place2();\n      renderer.render(scene, camera);\n      if (opts.onFrame) opts.onFrame(state2());\n    }\n    function request() {\n      dirty = true;\n      if (!raf && win2 && win2.requestAnimationFrame) raf = win2.requestAnimationFrame(frame2);\n      else if (!win2 || !win2.requestAnimationFrame) frame2();\n    }\n    function build3(u, explode) {\n      unit2 = viewerUnit(u, explode);\n      const d = [];\n      emitUnitLayer(d, unit2);\n      const n = Math.floor(d.length / 12);\n      const pos = new Float32Array(n * 3), nrm = new Float32Array(n * 3), col = new Float32Array(n * 3);\n      let cmax = 0;\n      for (let i = 0; i < n; i++) {\n        for (let k = 0; k < 3; k++) {\n          pos[i * 3 + k] = d[i * 12 + k];\n          nrm[i * 3 + k] = d[i * 12 + 3 + k];\n          col[i * 3 + k] = d[i * 12 + 6 + k];\n          if (d[i * 12 + 6 + k] > cmax) cmax = d[i * 12 + 6 + k];\n        }\n      }\n      if (cmax > 1.5) for (let i = 0; i < col.length; i++) col[i] /= 255;\n      const g2 = new THREE.BufferGeometry();\n      g2.setAttribute(\"position\", new THREE.BufferAttribute(pos, 3));\n      g2.setAttribute(\"normal\", new THREE.BufferAttribute(nrm, 3));\n      g2.setAttribute(\"color\", new THREE.BufferAttribute(col, 3));\n      g2.computeBoundingSphere();\n      if (mesh) {\n        group.remove(mesh);\n        mesh.geometry.dispose();\n        mesh.material.dispose();\n      }\n      mesh = new THREE.Mesh(g2, new THREE.MeshLambertMaterial({ vertexColors: true, side: THREE.DoubleSide }));\n      group.add(mesh);\n      boxes = viewerPartBoxes(unit2);\n      if (edges) {\n        group.remove(edges);\n        edges.geometry.dispose();\n        edges.material.dispose();\n        edges = null;\n      }\n      const ep = [];\n      for (const b of boxes) {\n        const X = [b.x0, b.x1], Y = [b.y0, b.y1], Z = [b.z0, b.z1];\n        for (const y of Y) for (const z of Z) ep.push(X[0], y, z, X[1], y, z);\n        for (const x of X) for (const z of Z) ep.push(x, Y[0], z, x, Y[1], z);\n        for (const x of X) for (const y of Y) ep.push(x, y, Z[0], x, y, Z[1]);\n      }\n      const eg = new THREE.BufferGeometry();\n      eg.setAttribute(\"position\", new THREE.BufferAttribute(new Float32Array(ep), 3));\n      edges = new THREE.LineSegments(eg, new THREE.LineBasicMaterial({ color: 4937059, transparent: true, opacity: 0.55 }));\n      group.add(edges);\n      const bs = g2.boundingSphere;\n      o.fitR = Math.max(100, bs ? bs.radius : 600);\n      o.fitC = bs ? [bs.center.x, bs.center.y, bs.center.z] : [0, 0, 0];\n      drawOutline();\n    }\n    function drawOutline() {\n      if (outline2) {\n        group.remove(outline2);\n        outline2.geometry.dispose();\n        outline2.material.dispose();\n        outline2 = null;\n      }\n      const b = selPid && boxes.find((q) => q.pid === selPid);\n      if (!b) return;\n      const g2 = new THREE.BoxGeometry(Math.max(1, b.x1 - b.x0), Math.max(1, b.y1 - b.y0), Math.max(1, b.z1 - b.z0));\n      outline2 = new THREE.LineSegments(new THREE.EdgesGeometry(g2), new THREE.LineBasicMaterial({ color: 16747008, depthTest: false }));\n      outline2.renderOrder = 10;\n      g2.dispose();\n      outline2.position.set((b.x0 + b.x1) / 2, (b.y0 + b.y1) / 2, (b.z0 + b.z1) / 2);\n      group.add(outline2);\n    }\n    function fit(keepAngle) {\n      size3();\n      const half = THREE.MathUtils.degToRad(camera.fov / 2), fitH = Math.min(half, Math.atan(Math.tan(half) * camera.aspect));\n      o.dist = o.fitR / Math.sin(fitH) * 1.08;\n      o.tx = o.fitC[0];\n      o.ty = o.fitC[1];\n      o.tz = o.fitC[2];\n      if (!keepAngle) {\n        o.yaw = VIEW0.yaw;\n        o.pitch = VIEW0.pitch;\n      }\n      request();\n    }\n    function zoomBy(f) {\n      o.dist = Math.max(o.fitR * 0.35, Math.min(o.fitR * 14, o.dist * f));\n      request();\n    }\n    function turn(dx, dy) {\n      o.yaw -= dx * 8e-3;\n      o.pitch = clampPitch2(o.pitch + dy * 8e-3);\n      request();\n    }\n    function pan(dx, dy) {\n      size3();\n      const h = Math.max(1, canvas.clientHeight || 400), per = 2 * o.dist * Math.tan(THREE.MathUtils.degToRad(camera.fov / 2)) / h;\n      place2();\n      const right = new THREE.Vector3().setFromMatrixColumn(camera.matrixWorld, 0), up = new THREE.Vector3().setFromMatrixColumn(camera.matrixWorld, 1);\n      o.tx += (-dx * right.x + dy * up.x) * per;\n      o.ty += (-dx * right.y + dy * up.y) * per;\n      o.tz += (-dx * right.z + dy * up.z) * per;\n      request();\n    }\n    function pick(clientX, clientY) {\n      if (!boxes.length) return null;\n      size3();\n      place2();\n      camera.updateMatrixWorld();\n      const r = canvas.getBoundingClientRect();\n      const v = new THREE.Vector2((clientX - r.left) / Math.max(1, r.width) * 2 - 1, -((clientY - r.top) / Math.max(1, r.height)) * 2 + 1);\n      const ray = new THREE.Raycaster();\n      ray.setFromCamera(v, camera);\n      let best = null, bt = Infinity;\n      const hit2 = new THREE.Vector3();\n      for (const b of boxes) {\n        const B = new THREE.Box3(new THREE.Vector3(b.x0, b.y0, b.z0), new THREE.Vector3(b.x1, b.y1, b.z1));\n        if (ray.ray.intersectBox(B, hit2)) {\n          const t = hit2.distanceTo(ray.ray.origin);\n          if (t < bt) {\n            bt = t;\n            best = b;\n          }\n        }\n      }\n      return best ? best.pid : null;\n    }\n    const ptrs = /* @__PURE__ */ new Map();\n    let drag = null;\n    on(canvas, \"pointerdown\", (e) => {\n      if (e.button === 2 || e.button === 1) e.preventDefault();\n      try {\n        canvas.setPointerCapture(e.pointerId);\n      } catch {\n      }\n      ptrs.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      const how = e.button === 2 || e.button === 1 || e.shiftKey ? \"pan\" : mode;\n      drag = { how, x: e.clientX, y: e.clientY, moved: 0, multi: ptrs.size > 1, pinch: null };\n      if (ptrs.size === 2) {\n        const [a, b] = [...ptrs.values()];\n        drag.pinch = { d: Math.hypot(a.x - b.x, a.y - b.y), mx: (a.x + b.x) / 2, my: (a.y + b.y) / 2 };\n        drag.multi = true;\n      }\n    });\n    on(canvas, \"pointermove\", (e) => {\n      if (!drag || !ptrs.has(e.pointerId)) return;\n      const p = ptrs.get(e.pointerId);\n      const dx = e.clientX - p.x, dy = e.clientY - p.y;\n      p.x = e.clientX;\n      p.y = e.clientY;\n      if (ptrs.size >= 2 && drag.pinch) {\n        const [a, b] = [...ptrs.values()];\n        const d = Math.hypot(a.x - b.x, a.y - b.y), mx = (a.x + b.x) / 2, my = (a.y + b.y) / 2;\n        if (drag.pinch.d > 0 && d > 0) zoomBy(drag.pinch.d / d);\n        pan(mx - drag.pinch.mx, my - drag.pinch.my);\n        drag.pinch = { d, mx, my };\n        drag.moved += 10;\n        return;\n      }\n      drag.moved += Math.abs(dx) + Math.abs(dy);\n      if (drag.how === \"pan\") pan(dx, dy);\n      else turn(dx, dy);\n    });\n    const end = (e) => {\n      ptrs.delete(e.pointerId);\n      try {\n        canvas.releasePointerCapture(e.pointerId);\n      } catch {\n      }\n      if (drag && !ptrs.size) {\n        const tap = drag.moved < 5 && !drag.multi && e.type === \"pointerup\";\n        drag = null;\n        if (tap && opts.onPick) {\n          const pid = pick(e.clientX, e.clientY);\n          if (pid) opts.onPick(pid);\n        }\n      } else if (drag && ptrs.size === 1) {\n        drag.pinch = null;\n      }\n    };\n    on(canvas, \"pointerup\", end);\n    on(canvas, \"pointercancel\", end);\n    on(canvas, \"contextmenu\", (e) => e.preventDefault());\n    on(canvas, \"wheel\", (e) => {\n      e.preventDefault();\n      zoomBy(Math.pow(1.0015, e.deltaY));\n    }, { passive: false });\n    on(canvas, \"keydown\", (e) => {\n      const k = e.key, st = 24;\n      if (k === \"ArrowLeft\") {\n        e.shiftKey ? pan(st, 0) : turn(st, 0);\n      } else if (k === \"ArrowRight\") {\n        e.shiftKey ? pan(-st, 0) : turn(-st, 0);\n      } else if (k === \"ArrowUp\") {\n        e.shiftKey ? pan(0, st) : turn(0, st);\n      } else if (k === \"ArrowDown\") {\n        e.shiftKey ? pan(0, -st) : turn(0, -st);\n      } else if (k === \"+\" || k === \"=\") zoomBy(1 / 1.2);\n      else if (k === \"-\" || k === \"_\") zoomBy(1.2);\n      else if (k === \"f\" || k === \"F\" || k === \"0\") fit();\n      else return;\n      e.preventDefault();\n    });\n    let ro = null;\n    if (win2 && win2.ResizeObserver) {\n      ro = new win2.ResizeObserver(() => request());\n      ro.observe(canvas);\n    }\n    function state2() {\n      return {\n        yaw: o.yaw,\n        pitch: o.pitch,\n        dist: o.dist,\n        target: [o.tx, o.ty, o.tz],\n        fitR: o.fitR,\n        fitC: o.fitC.slice(),\n        mode,\n        sel: selPid,\n        eye: orbitEye(o),\n        parts: boxes.length,\n        explode: unit2 ? unit2.explode : 0,\n        unitId: unit2 ? unit2.id : null,\n        size: [canvas.clientWidth, canvas.clientHeight],\n        tris: mesh ? mesh.geometry.attributes.position.count / 3 : 0\n      };\n    }\n    return {\n      show(u, a) {\n        a = a || {};\n        const first = !unit2;\n        build3(u, a.explode || 0);\n        if (first) fit();\n        else if (a.refit) fit(!!a.keepAngle);\n        else request();\n      },\n      setSelection(pid) {\n        selPid = pid || null;\n        drawOutline();\n        request();\n      },\n      setMode(m) {\n        mode = m === \"pan\" ? \"pan\" : \"rotate\";\n        return mode;\n      },\n      zoomIn() {\n        zoomBy(1 / 1.25);\n      },\n      zoomOut() {\n        zoomBy(1.25);\n      },\n      fit: () => fit(),\n      turn,\n      pan,\n      zoomBy,\n      pick,\n      state: state2,\n      setView(v) {\n        if (v.yaw != null) o.yaw = v.yaw;\n        if (v.pitch != null) o.pitch = clampPitch2(v.pitch);\n        if (v.dist != null) o.dist = v.dist;\n        request();\n      },\n      renderNow() {\n        size3();\n        place2();\n        renderer.render(scene, camera);\n      },\n      /* the colour drawn at a canvas point (0..1 across, 0..1 down), read right after a render - for the browser proof\n         that nothing but the cabinet is drawn (no wall, no floor) */\n      sample(nx, ny) {\n        size3();\n        place2();\n        renderer.render(scene, camera);\n        const gl = renderer.getContext(), w = gl.drawingBufferWidth, h = gl.drawingBufferHeight, px = new Uint8Array(4);\n        gl.readPixels(Math.max(0, Math.min(w - 1, Math.round(nx * (w - 1)))), Math.max(0, Math.min(h - 1, Math.round((1 - ny) * (h - 1)))), 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);\n        return [px[0], px[1], px[2]];\n      },\n      /* many points from ONE render (the browser proof's coverage grids) */\n      samples(pts) {\n        size3();\n        place2();\n        renderer.render(scene, camera);\n        const gl = renderer.getContext(), w = gl.drawingBufferWidth, h = gl.drawingBufferHeight, px = new Uint8Array(4);\n        return pts.map(([nx, ny]) => {\n          gl.readPixels(Math.max(0, Math.min(w - 1, Math.round(nx * (w - 1)))), Math.max(0, Math.min(h - 1, Math.round((1 - ny) * (h - 1)))), 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);\n          return [px[0], px[1], px[2]];\n        });\n      },\n      /* where a world point lands on the canvas (client px) - for real-mouse tests that aim at the cabinet */\n      toScreen(p) {\n        size3();\n        place2();\n        camera.updateMatrixWorld();\n        const v = new THREE.Vector3(p[0], p[1], p[2]).project(camera), r = canvas.getBoundingClientRect();\n        return { x: r.left + (v.x + 1) / 2 * r.width, y: r.top + (1 - v.y) / 2 * r.height, inFront: v.z < 1 };\n      },\n      dispose() {\n        disposed = true;\n        if (raf && win2 && win2.cancelAnimationFrame) win2.cancelAnimationFrame(raf);\n        for (const [el, ev, fn, o2] of listeners) el.removeEventListener(ev, fn, o2);\n        if (ro) ro.disconnect();\n        if (mesh) {\n          mesh.geometry.dispose();\n          mesh.material.dispose();\n        }\n        if (outline2) {\n          outline2.geometry.dispose();\n          outline2.material.dispose();\n        }\n        if (edges) {\n          edges.geometry.dispose();\n          edges.material.dispose();\n        }\n        renderer.dispose();\n        try {\n          const ext = renderer.getContext().getExtension(\"WEBGL_lose_context\");\n          if (ext) ext.loseContext();\n        } catch {\n        }\n      }\n    };\n  }\n\n  // v2/src/ui/build-edit.js\n  var clamp5 = (v, a, b) => Math.min(b, Math.max(a, v));\n  function editFields(u) {\n    if (!u) return [];\n    const L = limitsFor(u) || {};\n    const out = [];\n    for (const [k, label] of [[\"w\", \"Width\"], [\"h\", \"Height\"], [\"d\", \"Depth\"]]) {\n      const r = L[k];\n      if (Array.isArray(r) && u[k] != null) out.push({ key: k, label, min: r[0], max: r[1], value: u[k], unit: \"mm\" });\n    }\n    if (canInterior(u)) out.push({ key: \"shelves\", label: \"Adjustable shelves\", min: 0, max: maxShelvesFor(u), value: interiorOf(u).shelves, unit: \"\" });\n    if (typeof u.door === \"boolean\" && u.type !== \"base-4drawer\") out.push({ key: \"door\", label: \"Door\", value: !!u.door, bool: true });\n    return out;\n  }\n  function draftOf(u) {\n    const d = {};\n    editFields(u).forEach((f) => {\n      d[f.key] = f.value;\n    });\n    return d;\n  }\n  function draftUnit(u, d) {\n    const c = JSON.parse(JSON.stringify(u));\n    const F = editFields(u);\n    F.forEach((f) => {\n      if (!(f.key in (d || {}))) return;\n      if (f.bool) {\n        c.door = !!d.door;\n        if (!c.door) c.doorOpen = false;\n        return;\n      }\n      const v = Math.round(Number(d[f.key]));\n      if (!isFinite(v)) return;\n      if (f.key === \"shelves\") {\n        const I = interiorOf(c);\n        c.interior = { ...c.interior || {}, shelves: clamp5(v, 0, maxShelvesFor(c)), vDiv: I.vDiv.slice(), hDiv: I.hDiv.slice() };\n        delete c.interior.shelfList;\n      } else c[f.key] = clamp5(v, f.min, f.max);\n    });\n    return c;\n  }\n  function draftChanges(u, d) {\n    const out = [];\n    editFields(u).forEach((f) => {\n      if (!(f.key in (d || {}))) return;\n      const now = f.bool ? !!d[f.key] : Math.round(Number(d[f.key]));\n      if (now !== f.value) out.push(f.label + \": \" + (f.bool ? f.value ? \"on\" : \"off\" : f.value) + \" -> \" + (f.bool ? now ? \"on\" : \"off\" : now + (f.unit ? \" \" + f.unit : \"\")));\n    });\n    return out;\n  }\n\n  // v2/src/model/workshop-parts.js\n  function workshopPartsFor(scene, state2, unitId) {\n    var _a;\n    if (unitId == null) return { status: \"catalogue\", rows: [], why: \"A catalogue cabinet is not in the kitchen, so the workshop has not built it. Add it to see the workshop's parts.\" };\n    if (!state2 || state2.status === \"idle\" || !state2.status) return { status: \"none\", rows: [], why: \"The workshop's parts are not loaded here.\" };\n    if (state2.status === \"loading\") return { status: \"loading\", rows: [], why: \"Loading the workshop's parts\\u2026\" };\n    if (state2.status === \"error\") return { status: \"error\", rows: [], why: state2.message || \"The workshop's parts could not be loaded.\" };\n    if (state2.key !== hardwareKey(scene)) return { status: \"stale\", rows: [], why: \"The kitchen changed since the workshop built it - its parts are being fetched again.\" };\n    const pr = state2.production;\n    if (!pr || !Array.isArray(pr.rows) || !Array.isArray(pr.cabinets)) return { status: \"none\", rows: [], why: \"This workshop answer carries no parts (an older calculator).\" };\n    const cab = pr.cabinets.filter((c) => String(c.labUnit) === String(unitId));\n    if (cab.length !== 1) return {\n      status: \"unsupported\",\n      rows: [],\n      why: cab.length ? \"Ambiguous: two workshop cabinets claim this unit.\" : \"The workshop did not build this cabinet (see its notes).\",\n      notes: (pr.notes || []).filter((n) => String(n).startsWith(String(unitId) + \":\"))\n    };\n    const cid = String(cab[0].id);\n    const rows = pr.rows.filter((r) => r && r.source3d && String(r.source3d.cabinet_id) === cid);\n    return {\n      status: \"ready\",\n      rows,\n      cabinetId: cid,\n      unitId: String(unitId),\n      sourceSha256: pr.sourceSha256 || ((_a = state2.packet) == null ? void 0 : _a.sourceSha256) || null,\n      revision: rows.length ? rows[0].source3d.revision : null,\n      notes: (pr.notes || []).filter((n) => String(n).startsWith(String(unitId) + \":\"))\n    };\n  }\n  function opPoints(op, L, W2) {\n    if (!op) return [];\n    if (op.kind === \"holes-row\") {\n      const inset = Number(op.inset) || 0, pitch = Number(op.pitch) || 32, start2 = Number(op.start) || 0, count = Math.max(0, Math.round(Number(op.count) || 0));\n      const out = [];\n      for (let i = 0; i < count; i++) {\n        const pos = start2 + i * pitch;\n        out.push(op.edge === \"L1\" ? [pos, inset] : op.edge === \"L2\" ? [pos, W2 - inset] : op.edge === \"W1\" ? [inset, pos] : [L - inset, pos]);\n      }\n      return out;\n    }\n    if (op.kind === \"hole\") {\n      let x = Number(op.x) || 0, y = Number(op.y) || 0;\n      const c = op.corner || \"BL\";\n      if (c === \"BR\" || c === \"TR\") x = L - x;\n      if (c === \"TL\" || c === \"TR\") y = W2 - y;\n      const times = Math.max(1, Math.round(Number(op.repeat) || 1)), sx = c === \"BR\" || c === \"TR\" ? -1 : 1, sy = c === \"TL\" || c === \"TR\" ? -1 : 1;\n      const out = [];\n      for (let k = 0; k < times; k++) out.push([x + sx * (Number(op.stepX) || 0) * k, y + sy * (Number(op.stepY) || 0) * k]);\n      return out;\n    }\n    if (op.kind === \"path\") {\n      const out = [[Number(op.startX), Number(op.startY)]];\n      for (const s of op.segments || []) {\n        if (s.type === \"arc\") out.push([Number(s.viaX), Number(s.viaY)]);\n        out.push([Number(s.x), Number(s.y)]);\n      }\n      return out;\n    }\n    return [];\n  }\n  function opText(op, L, W2) {\n    const side = op.side === \"B\" ? \"face B\" : op.side === \"A\" ? \"face A\" : op.edge && op.kind === \"edge-holes\" ? \"edge \" + op.edge : \"face \" + (op.side || \"?\");\n    const r111 = (v) => Math.round(Number(v) * 10) / 10;\n    if (op.kind === \"hole\") {\n      const p = opPoints(op, L, W2)[0];\n      return \"Hole \\xD8\" + r111(op.diameter) + \" \\xD7 \" + r111(op.depth) + (op.through ? \" through\" : \"\") + \", \" + side + \", at \" + r111(p[0]) + \", \" + r111(p[1]) + (op.breakout ? \" (breaks out at the edge)\" : \"\") + (op.note ? \" - \" + op.note : \"\");\n    }\n    if (op.kind === \"holes-row\") return \"Row of \" + op.count + \" holes \\xD8\" + r111(op.diameter) + \" \\xD7 \" + r111(op.depth) + \", pitch \" + r111(op.pitch) + \", \" + r111(op.inset) + \" in from \" + op.edge + \", \" + side + (op.note ? \" - \" + op.note : \"\");\n    if (op.kind === \"path\") return \"Routed path \" + (op.tool || \"\\xD8\" + r111(op.diameter)) + \" \\xD7 \" + r111(op.depth) + \", \" + side + \", \" + (op.segments || []).length + \" segments, from \" + r111(op.startX) + \", \" + r111(op.startY) + (op.note ? \" - \" + op.note : \"\");\n    return (op.kind || \"operation\") + \", \" + side + (op.note ? \" - \" + op.note : \"\");\n  }\n\n  // v2/src/ui/binsp-workshop.js\n  var r110 = (v) => Math.round(Number(v) * 10) / 10;\n  var rowKey = (r) => r && r.source3d && Array.isArray(r.source3d.panel_keys) && r.source3d.panel_keys.length ? \"k:\" + r.source3d.panel_keys.join(\"|\") : r && r.partid != null ? \"p:\" + r.partid : \"u:\" + (r && r.uid);\n  function renderWorkshop(box3, info, h, sel, onChoose) {\n    const { el, sv } = h;\n    box3.textContent = \"\";\n    box3.appendChild(el(\"p\", \"ub-lab__binsp-small\", { \"data-ub-binsp-wsstatus\": info.status }, info.status === \"ready\" ? \"The workshop's own parts for this cabinet - the rows the CNC files are written from. Plan \" + String(info.sourceSha256 || \"?\").slice(0, 12) + \", workshop model \" + (info.revision || \"?\") + \", workshop cabinet \" + info.cabinetId + \" = \" + info.unitId + \". Not proven on the machine.\" : info.why));\n    (info.notes || []).forEach((n) => box3.appendChild(el(\"p\", \"ub-lab__binsp-small\", { \"data-ub-binsp-wsnote\": \"\" }, String(n))));\n    if (info.status !== \"ready\") return;\n    const tbl = el(\"table\", \"ub-lab__binsp-table\", { \"data-ub-binsp-wstable\": \"\" });\n    const hr = el(\"tr\");\n    for (const t of [\"Row\", \"Part\", \"Cut L x W mm\", \"Material\", \"Edging\", \"Operations\", \"Outline\"]) hr.appendChild(el(\"th\", \"\", { scope: \"col\" }, t));\n    const th = el(\"thead\");\n    th.appendChild(hr);\n    tbl.appendChild(th);\n    const tb = el(\"tbody\");\n    tbl.appendChild(tb);\n    info.rows.forEach((r2) => {\n      const tr = el(\"tr\", \"\", { \"data-ub-binsp-wsrow\": String(r2.uid), \"data-ub-binsp-wskey\": rowKey(r2), tabindex: \"0\", \"aria-selected\": String(sel === rowKey(r2)) });\n      const edges = [\"l1\", \"l2\", \"w1\", \"w2\"].filter((k) => r2[k] && String(r2[k]) !== \"0\").map((k) => k.toUpperCase()).join(\" \") || \"none\";\n      const faces = { A: 0, B: 0 };\n      (r2.machining || []).forEach((o) => {\n        if (o.side === \"B\") faces.B++;\n        else faces.A++;\n      });\n      for (const c of [\n        String(r2.uid),\n        r2.title,\n        r110(r2.length) + \" x \" + r110(r2.width),\n        String(r2.material),\n        edges,\n        (r2.machining || []).length ? (r2.machining || []).length + \" (A \" + faces.A + \", B \" + faces.B + \")\" : \"none\",\n        r2.contour ? \"shaped (contour, \" + r2.contour.length + \" points)\" : \"rectangle\"\n      ]) tr.appendChild(el(\"td\", \"\", {}, c));\n      tr.addEventListener(\"click\", () => onChoose(rowKey(r2)));\n      tb.appendChild(tr);\n    });\n    box3.appendChild(tbl);\n    const r = info.rows.find((x) => rowKey(x) === sel);\n    if (r) box3.appendChild(sheet(r, h));\n  }\n  function sheet(r, h) {\n    const { el, sv } = h;\n    const L = Number(r.length), W2 = Number(r.width), sc = Math.min(440 / L, 260 / W2), pad = 34;\n    const X = (x) => pad + x * sc, Y = (y) => pad + (W2 - y) * sc;\n    const wrap = el(\"div\", \"\", { \"data-ub-binsp-wssheet\": String(r.uid), \"data-ub-binsp-wssheetkey\": rowKey(r) });\n    wrap.appendChild(el(\"p\", \"ub-lab__binsp-dcap\", {}, \"Row \" + r.uid + \" \" + r.title + \" - \" + r110(L) + \" x \" + r110(W2) + \" mm, origin bottom-left, x along the length; face A solid, face B dashed\"));\n    const svg2 = sv(\"svg\", {\n      viewBox: \"0 0 \" + (L * sc + pad * 2) + \" \" + (W2 * sc + pad * 2),\n      class: \"ub-lab__binsp-svg ub-lab__binsp-svg--part\",\n      role: \"img\",\n      \"aria-label\": \"Workshop part \" + r.title + \" \" + r110(L) + \" by \" + r110(W2) + \" mm with its operations\"\n    });\n    if (Array.isArray(r.contour) && r.contour.length > 2) {\n      svg2.appendChild(sv(\"polygon\", { points: r.contour.map((p) => X(Number(p.x)) + \",\" + Y(Number(p.y))).join(\" \"), class: \"ub-lab__binsp-board\", \"data-ub-binsp-wsoutline\": \"contour\" }));\n    } else {\n      svg2.appendChild(sv(\"rect\", { x: X(0), y: Y(W2), width: L * sc, height: W2 * sc, class: \"ub-lab__binsp-board\", \"data-ub-binsp-wsoutline\": \"rectangle\" }));\n    }\n    (r.machining || []).forEach((op, i) => {\n      const pts = opPoints(op, L, W2), dash = op.side === \"B\" ? \"3 2\" : \"\", cls = \"ub-lab__binsp-wsop\" + (op.side === \"B\" ? \" ub-lab__binsp-wsop--b\" : \"\");\n      if (op.kind === \"path\" && pts.length > 1) {\n        svg2.appendChild(sv(\"polyline\", { points: pts.map((p) => X(p[0]) + \",\" + Y(p[1])).join(\" \"), fill: \"none\", class: cls, \"stroke-dasharray\": dash, \"data-ub-binsp-wsop\": String(i) }));\n      } else {\n        const rad = Math.max(0.8, (Number(op.diameter) || 1) / 2 * sc);\n        pts.forEach((p) => svg2.appendChild(sv(\"circle\", { cx: X(p[0]), cy: Y(p[1]), r: rad, fill: \"none\", class: cls, \"stroke-dasharray\": dash, \"data-ub-binsp-wsop\": String(i) })));\n      }\n    });\n    wrap.appendChild(svg2);\n    const ul = el(\"ul\", \"ub-lab__binsp-small\", { \"data-ub-binsp-wsops\": \"\" });\n    (r.machining || []).forEach((op) => ul.appendChild(el(\"li\", \"\", {}, opText(op, L, W2))));\n    if (!(r.machining || []).length) ul.appendChild(el(\"li\", \"\", {}, \"No operations on this part in the files.\"));\n    wrap.appendChild(ul);\n    if (r.source3d) wrap.appendChild(el(\"p\", \"ub-lab__binsp-small\", {}, \"Source: workshop model \" + r.source3d.revision + \", panel \" + (r.source3d.panel_keys || []).join(\", \") + \", part \" + r.partid + \".\"));\n    return wrap;\n  }\n\n  // v2/src/ui/build-inspector.js\n  var EXPLODED = 0.6;\n  function plainCopy(u, plain2) {\n    const c = JSON.parse(JSON.stringify(u));\n    if (plain2) {\n      for (const k of [\"finish\", \"frontFinish\", \"doorFinish\", \"plinthFinish\", \"skinFinish\"]) if (k in c || k === \"finish\") c[k] = \"white\";\n    }\n    return c;\n  }\n  var f1 = (v) => (Math.round(v * 10) / 10).toString();\n  function createBuildInspector(ctx) {\n    const doc2 = ctx.doc, root = ctx.root, win2 = ctx.win || doc2 && doc2.defaultView;\n    if (!doc2 || !root || !root.querySelector) return {};\n    const el = (tag, cls, attrs, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const NS7 = \"http://www.w3.org/2000/svg\";\n    const sv = (tag, attrs, text) => {\n      const n = doc2.createElementNS ? doc2.createElementNS(NS7, tag) : doc2.createElement(tag);\n      for (const k of Object.keys(attrs || {})) n.setAttribute(k, attrs[k]);\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    function lens() {\n      return el(\"span\", \"ub-lab__trayinspect\", { \"data-ub-tray-inspect\": \"\", title: \"Inspect how it is built (3D, drawing, parts) - adds nothing\", \"aria-hidden\": \"true\" });\n    }\n    const st = {\n      open: false,\n      ins: null,\n      sel: null,\n      explode: 0,\n      plain: true,\n      V: null,\n      tool: \"rotate\",\n      fitKey: null,\n      opener: null,\n      tab: \"parts\",\n      base: null,\n      draft: null,\n      target: null,\n      fp: \"\",\n      type: null,\n      label: \"\"\n    };\n    let back = null, dlg = null, title = null, canvas = null, note3d = null, tableBody = null, drawBox = null, buildBox = null, parity = null, tabs = {}, editBox = null, wsBox = null;\n    const pro = editionOf(root) === PRO;\n    function build3() {\n      back = el(\"div\", \"ub-binsp\", { \"data-ub-binsp\": \"\", hidden: \"\" });\n      dlg = el(\"div\", \"ub-lab__binsp\", { role: \"dialog\", \"aria-modal\": \"true\", \"aria-labelledby\": \"ub-binsp-title\", tabindex: \"-1\" });\n      const head = el(\"div\", \"ub-lab__binsp-head\");\n      title = el(\"h2\", \"ub-lab__binsp-title\", { id: \"ub-binsp-title\" });\n      const close = el(\"button\", \"ub-lab__btn ub-lab__binsp-close\", { type: \"button\", \"data-ub-binsp-close\": \"\", \"aria-label\": \"Close the build inspector\" }, \"Close\");\n      close.addEventListener(\"click\", hide);\n      head.appendChild(title);\n      head.appendChild(close);\n      const viewOnly = el(\n        \"p\",\n        \"ub-lab__binsp-note\",\n        { \"data-ub-binsp-viewonly\": \"\" },\n        \"Nothing here changes your kitchen until you press Apply (Edit). Not a manufacturing drawing: joints and drilling are not defined in this model.\"\n      );\n      const body = el(\"div\", \"ub-lab__binsp-body\");\n      const left = el(\"div\", \"ub-lab__binsp-3d\");\n      const stage = el(\"div\", \"ub-lab__binsp-stage\", { \"data-ub-binsp-stage\": \"\" });\n      canvas = el(\"canvas\", \"ub-lab__binsp-canvas\", {\n        \"data-ub-binsp-canvas\": \"\",\n        tabindex: \"0\",\n        \"aria-label\": \"3D view of this cabinet - drag to turn it all the way round; arrow keys turn, Shift + arrows move the view, + and - zoom, F fits\"\n      });\n      const tools = el(\"div\", \"ub-lab__binsp-tools\", { role: \"toolbar\", \"aria-label\": \"3D view tools\", \"data-ub-binsp-tools\": \"\" });\n      const tool = (attrs, label, title2, fn) => {\n        const b = el(\"button\", \"ub-lab__binsp-tool\", Object.assign({ type: \"button\", title: title2, \"aria-label\": title2 }, attrs), label);\n        let press = null, owed = null;\n        const fingerish = (t) => t === \"touch\" || t === \"pen\";\n        b.addEventListener(\"pointerdown\", (e) => {\n          if (!fingerish(e.pointerType)) return;\n          if (press && e.isPrimary === false) return;\n          press = { id: e.pointerId, x: e.clientX, y: e.clientY };\n        });\n        b.addEventListener(\"pointercancel\", (e) => {\n          if (press && press.id === e.pointerId) press = null;\n        });\n        b.addEventListener(\"pointerup\", (e) => {\n          if (!press || press.id !== e.pointerId) return;\n          const p = press;\n          press = null;\n          if (Math.hypot(e.clientX - p.x, e.clientY - p.y) >= 10) return;\n          const r = b.getBoundingClientRect();\n          if (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom) return;\n          owed = { at: e.timeStamp, x: e.clientX, y: e.clientY };\n          fn();\n        });\n        b.addEventListener(\"click\", (e) => {\n          const o = owed;\n          if (o && e.detail !== 0 && e.timeStamp - o.at < 800) {\n            const t = e.pointerType;\n            const same = fingerish(t) || !t && Math.hypot(e.clientX - o.x, e.clientY - o.y) < 10;\n            if (same) {\n              owed = null;\n              return;\n            }\n          }\n          if (o && e.timeStamp - o.at >= 800) owed = null;\n          fn();\n        });\n        tools.appendChild(b);\n        return b;\n      };\n      const modeBtn = (m, label, title2) => tool({ \"data-ub-binsp-tool\": m, \"aria-pressed\": m === \"rotate\" ? \"true\" : \"false\" }, label, title2, () => setTool(m));\n      modeBtn(\"rotate\", \"Rotate view\", \"Rotate view - drag to turn the cabinet all the way round\");\n      modeBtn(\"pan\", \"Move view\", \"Move view - drag to slide the view (the cabinet stays where it is)\");\n      tool({ \"data-ub-binsp-zoom\": \"in\" }, \"+\", \"Zoom in\", () => {\n        if (st.V) st.V.zoomIn();\n      });\n      tool({ \"data-ub-binsp-zoom\": \"out\" }, \"\\u2212\", \"Zoom out\", () => {\n        if (st.V) st.V.zoomOut();\n      });\n      tool({ \"data-ub-binsp-fit\": \"\" }, \"Fit\", \"Fit - the whole cabinet in view again\", () => {\n        if (st.V) st.V.fit();\n      });\n      stage.appendChild(canvas);\n      stage.appendChild(tools);\n      note3d = el(\"p\", \"ub-lab__binsp-3dnote\", { \"data-ub-binsp-3dnote\": \"\" });\n      const bar = el(\"div\", \"ub-lab__binsp-bar\", { role: \"group\", \"aria-label\": \"3D view\" });\n      const mk = (key, label) => {\n        const b = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-binsp-view\": key, \"aria-pressed\": \"false\" }, label);\n        b.addEventListener(\"click\", () => setView(key));\n        bar.appendChild(b);\n        return b;\n      };\n      mk(\"assembled\", \"Assembled\");\n      mk(\"exploded\", \"Exploded\");\n      const pl = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-binsp-plain\": \"\", \"aria-pressed\": \"true\" }, \"Plain board\");\n      pl.addEventListener(\"click\", () => {\n        st.plain = !st.plain;\n        pl.setAttribute(\"aria-pressed\", st.plain ? \"true\" : \"false\");\n        push3d();\n      });\n      bar.appendChild(pl);\n      left.appendChild(stage);\n      left.appendChild(bar);\n      left.appendChild(note3d);\n      const right = el(\"div\", \"ub-lab__binsp-side\");\n      const tl = el(\"div\", \"ub-lab__binsp-tabs\", { role: \"tablist\" });\n      for (const [k, label] of [[\"parts\", \"Parts\"], [\"drawing\", \"Drawing\"], [\"build\", \"How it is built\"], [\"edit\", \"Edit\"]].concat(pro ? [[\"workshop\", \"Workshop parts\"]] : [])) {\n        const b = el(\"button\", \"ub-lab__btn\", { type: \"button\", role: \"tab\", \"data-ub-binsp-tab\": k, \"aria-selected\": \"false\" }, label);\n        b.addEventListener(\"click\", () => setTab(k));\n        tl.appendChild(b);\n        tabs[k] = b;\n      }\n      const pane = el(\"div\", \"ub-lab__binsp-pane\");\n      const tbl = el(\"table\", \"ub-lab__binsp-table\", { \"data-ub-binsp-table\": \"\" });\n      const th = el(\"thead\");\n      const hr = el(\"tr\");\n      for (const h of [\"Ref\", \"Part\", \"Material\", \"L x W x T mm\", \"Edging\", \"Grain\", \"Machining (workshop)\", \"Cut list\"]) hr.appendChild(el(\"th\", \"\", { scope: \"col\" }, h));\n      th.appendChild(hr);\n      tbl.appendChild(th);\n      tableBody = el(\"tbody\");\n      tbl.appendChild(tableBody);\n      parity = el(\"p\", \"ub-lab__binsp-parity\", { \"data-ub-binsp-parity\": \"\" });\n      const partsPane = el(\"div\", \"\", { \"data-ub-binsp-pane\": \"parts\" });\n      partsPane.appendChild(tbl);\n      partsPane.appendChild(parity);\n      drawBox = el(\"div\", \"\", { \"data-ub-binsp-pane\": \"drawing\" });\n      buildBox = el(\"div\", \"ub-lab__binsp-build\", { \"data-ub-binsp-pane\": \"build\" });\n      editBox = el(\"div\", \"ub-lab__binsp-edit\", { \"data-ub-binsp-pane\": \"edit\" });\n      pane.appendChild(partsPane);\n      pane.appendChild(drawBox);\n      pane.appendChild(buildBox);\n      pane.appendChild(editBox);\n      if (pro) {\n        wsBox = el(\"div\", \"ub-lab__binsp-ws\", { \"data-ub-binsp-pane\": \"workshop\" });\n        pane.appendChild(wsBox);\n      }\n      right.appendChild(tl);\n      right.appendChild(pane);\n      body.appendChild(left);\n      body.appendChild(right);\n      dlg.appendChild(head);\n      dlg.appendChild(viewOnly);\n      dlg.appendChild(body);\n      back.appendChild(dlg);\n      back.addEventListener(\"click\", (e) => {\n        if (e.target === back) hide();\n      });\n      dlg.addEventListener(\"keydown\", (e) => {\n        e.stopPropagation();\n        if (e.key === \"Escape\") {\n          e.preventDefault();\n          hide();\n        }\n      });\n      for (const ev of [\"keyup\", \"wheel\", \"mouseup\", \"mousemove\"]) dlg.addEventListener(ev, (e) => e.stopPropagation());\n      (doc2.body || root).appendChild(back);\n    }\n    function setTab(k) {\n      st.tab = k;\n      for (const key of Object.keys(tabs)) tabs[key].setAttribute(\"aria-selected\", key === k ? \"true\" : \"false\");\n      dlg.querySelectorAll(\"[data-ub-binsp-pane]\").forEach((p) => {\n        p.hidden = p.getAttribute(\"data-ub-binsp-pane\") !== k;\n      });\n    }\n    function setTool(m) {\n      st.tool = m === \"pan\" ? \"pan\" : \"rotate\";\n      if (st.V) st.V.setMode(st.tool);\n      dlg.querySelectorAll(\"[data-ub-binsp-tool]\").forEach((b) => b.setAttribute(\"aria-pressed\", b.getAttribute(\"data-ub-binsp-tool\") === st.tool ? \"true\" : \"false\"));\n    }\n    function setView(key) {\n      st.explode = key === \"exploded\" ? EXPLODED : 0;\n      dlg.querySelectorAll(\"[data-ub-binsp-view]\").forEach((b) => b.setAttribute(\"aria-pressed\", b.getAttribute(\"data-ub-binsp-view\") === key ? \"true\" : \"false\"));\n      push3d();\n    }\n    function three() {\n      try {\n        const P2 = root.__ubProj, R4 = P2 && P2.__v2 && P2.__v2.renderer && P2.__v2.renderer();\n        const I = R4 && R4.inspect && R4.inspect();\n        return I && I.THREE ? I.THREE : null;\n      } catch {\n        return null;\n      }\n    }\n    function push3d() {\n      if (!st.ins) return;\n      const u = plainCopy(st.ins.unit, st.plain);\n      if (!st.V) {\n        const THREE = three();\n        if (!THREE) {\n          note3d.textContent = \"The 3D view is not available on this device - the parts list and drawings below are complete.\";\n          return;\n        }\n        try {\n          st.V = createBinspViewer({ three: THREE, canvas, window: win2, onPick: (pid) => choose(pid, \"3d\") });\n          st.V.setMode(st.tool || \"rotate\");\n          st.fitKey = null;\n        } catch (err) {\n          st.V = null;\n          note3d.textContent = \"The 3D view could not start - the parts list and drawings below are complete.\";\n          return;\n        }\n      }\n      const key = [u.id, u.w, u.h, u.d, st.explode].join(\"|\");\n      const first = st.fitKey == null, refit = st.fitKey !== key;\n      st.fitKey = key;\n      st.V.show(u, { explode: st.explode, refit, keepAngle: !first });\n      st.V.setSelection(st.sel);\n      note3d.textContent = (st.explode ? \"Exploded: the parts moved apart along their own directions - presentation only. \" : \"\") + \"Drag to turn it all the way round; Move view slides the view; wheel or pinch zooms; Fit frames it again. \" + (st.sel ? \"Outlined: \" + partOf(st.sel).ref + \" \" + partOf(st.sel).name + \".\" : \"Choose a part in the list or on the model.\");\n    }\n    const partOf = (pid) => st.ins && st.ins.parts.find((p) => p.pid === pid) || { ref: \"\", name: \"\" };\n    const edgeText = (e) => {\n      if (!e) return \"-\";\n      const s = [\"L1\", \"L2\", \"W1\", \"W2\"].filter((k) => e[k] > 0);\n      return s.length ? s.join(\" \") + \" (\" + e[s[0]] + \" mm)\" : \"none\";\n    };\n    function fillTable() {\n      tableBody.textContent = \"\";\n      st.ins.parts.forEach((p) => {\n        const tr = el(\"tr\", p.inCutList ? \"\" : \"ub-lab__binsp-off\", { \"data-ub-binsp-part\": p.pid, tabindex: \"0\", \"aria-selected\": \"false\" });\n        const r = p.row;\n        const size3 = r ? f1(r.length) + \" x \" + f1(r.width) + \" x \" + r.thickness : p.mm.w + \" x \" + p.mm.h + \" x \" + p.mm.d + \" (box)\";\n        for (const c of [p.ref, p.name + \" - \" + p.label, p.materialLabel, size3, r ? edgeText(r.edging) : \"-\", r ? r.grain ? \"yes\" : \"no\" : \"-\", p.ops && p.ops.length ? p.ops.join(\"; \") : \"-\", p.inCutList ? \"yes\" : p.why]) tr.appendChild(el(\"td\", \"\", {}, c));\n        tr.addEventListener(\"click\", () => choose(p.pid, \"table\"));\n        tr.addEventListener(\"keydown\", (e) => {\n          if (e.key === \"Enter\" || e.key === \" \") {\n            e.preventDefault();\n            choose(p.pid, \"table\");\n          }\n        });\n        tableBody.appendChild(tr);\n        if (p.kind === \"drawer-box\") {\n          (p.subs || []).forEach((q) => {\n            const sub4 = el(\"tr\", \"ub-lab__binsp-sub\", { \"data-ub-binsp-sub\": p.pid, \"data-ub-binsp-subref\": q.ref });\n            for (const c of [q.ref, \"  \" + q.name + \" x\" + q.qty, \"18 mm board\", f1(q.L) + \" x \" + f1(q.W) + \" x 18\", \"-\", \"-\", q.ops, \"Drawer box\"]) sub4.appendChild(el(\"td\", \"\", {}, c));\n            tableBody.appendChild(sub4);\n          });\n          if (!p.subs) {\n            const sub4 = el(\"tr\", \"ub-lab__binsp-sub\", { \"data-ub-binsp-sub\": p.pid });\n            sub4.appendChild(el(\"td\", \"\", { colspan: \"8\" }, \"This box's boards could not be matched to it - not listed rather than guessed.\"));\n            tableBody.appendChild(sub4);\n          }\n        }\n      });\n      st.ins.extraRows.forEach((r, i) => {\n        const tr = el(\"tr\", \"\", { \"data-ub-binsp-extra\": String(i) });\n        for (const c of [\"C\" + (i + 1), r.name + \" - drawn by the door pass\", r.material, f1(r.length) + \" x \" + f1(r.width) + \" x \" + r.thickness, edgeText(r.edging), r.grain ? \"yes\" : \"no\", \"-\", \"yes\"]) tr.appendChild(el(\"td\", \"\", {}, c));\n        tableBody.appendChild(tr);\n      });\n      const par = inspectionParity(st.ins);\n      const nCut = st.ins.parts.filter((p) => p.inCutList).length + st.ins.extraRows.length;\n      parity.textContent = (par.ok ? \"Same as the cut list: \" : \"MISMATCH with the cut list: \") + nCut + \" board\" + (nCut === 1 ? \"\" : \"s\") + \" listed here = \" + par.rows + \" row\" + (par.rows === 1 ? \"\" : \"s\") + \" the calculator prices for this cabinet (sizes, material, edging, grain).\";\n      parity.setAttribute(\"data-ok\", par.ok ? \"1\" : \"0\");\n    }\n    function choose(pid, from) {\n      st.sel = pid;\n      tableBody.querySelectorAll(\"[data-ub-binsp-part]\").forEach((tr) => {\n        const on = tr.getAttribute(\"data-ub-binsp-part\") === pid;\n        tr.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\n        if (on && from === \"3d\" && tr.scrollIntoView) tr.scrollIntoView({ block: \"nearest\" });\n      });\n      drawPart();\n      push3d();\n    }\n    function dimLine(g2, x1, y1, x2, y2, text, side) {\n      g2.appendChild(sv(\"line\", { x1, y1, x2, y2, class: \"ub-lab__binsp-dim\" }));\n      for (const [x, y] of [[x1, y1], [x2, y2]]) g2.appendChild(sv(\"circle\", { cx: x, cy: y, r: 1.6, class: \"ub-lab__binsp-dimdot\" }));\n      const tx = (x1 + x2) / 2 + (side === \"v\" ? -6 : 0), ty = (y1 + y2) / 2 + (side === \"v\" ? 4 : -5);\n      g2.appendChild(sv(\"text\", { x: tx, y: ty, \"text-anchor\": side === \"v\" ? \"end\" : \"middle\", class: \"ub-lab__binsp-dimtext\" }, text));\n    }\n    const VIEWS2 = {\n      front: { h: \"x\", v: \"y\", depth: (p) => p.local.z1, flipV: true },\n      side: { h: \"z\", v: \"y\", depth: (p) => p.local.x1, flipV: true },\n      top: { h: \"x\", v: \"z\", depth: (p) => p.local.y1, flipV: false }\n    };\n    function elevation(view, label) {\n      const V3 = VIEWS2[view], ps = st.ins.parts;\n      const lo = (p, a) => p.local[a + \"0\"], hi = (p, a) => p.local[a + \"1\"];\n      const X0 = Math.min(...ps.map((p) => lo(p, V3.h))), X1 = Math.max(...ps.map((p) => hi(p, V3.h)));\n      const Y0 = Math.min(...ps.map((p) => lo(p, V3.v))), Y1 = Math.max(...ps.map((p) => hi(p, V3.v)));\n      const W2 = 260, s = Math.min(W2 / Math.max(1, X1 - X0), 230 / Math.max(1, Y1 - Y0)), pad = 44;\n      const svg2 = sv(\"svg\", { viewBox: \"0 0 \" + (W2 + pad * 2) + \" \" + ((Y1 - Y0) * s + pad * 2), class: \"ub-lab__binsp-svg\", \"data-ub-binsp-elev\": view, role: \"img\", \"aria-label\": label });\n      const g2 = sv(\"g\", {});\n      svg2.appendChild(g2);\n      const px = (x) => pad + (x - X0) * s;\n      const py = (y) => V3.flipV ? pad + (Y1 - y) * s : pad + (y - Y0) * s;\n      const order = ps.map((p, i) => ({ p, i })).sort((a, b) => V3.depth(a.p) - V3.depth(b.p) || a.i - b.i);\n      const labels = [], rects = [];\n      order.forEach(({ p }) => {\n        const on = p.pid === st.sel;\n        const x = px(lo(p, V3.h)), w = Math.max(0.5, (hi(p, V3.h) - lo(p, V3.h)) * s), h = Math.max(0.5, (hi(p, V3.v) - lo(p, V3.v)) * s);\n        const y = V3.flipV ? py(hi(p, V3.v)) : py(lo(p, V3.v));\n        g2.appendChild(sv(\"rect\", {\n          x,\n          y,\n          width: w,\n          height: h,\n          class: \"ub-lab__binsp-box\" + (on ? \" ub-lab__binsp-box--on\" : \"\") + (p.inCutList ? \"\" : \" ub-lab__binsp-box--off\") + (p.notches && p.notches.length ? \" ub-lab__binsp-box--shaped\" : \"\"),\n          \"data-ub-binsp-boxpid\": p.pid,\n          \"data-ub-binsp-boxref\": p.ref\n        }));\n        rects.push({ x, y, w, h });\n        if (w >= 16 && h >= 9) labels.push({ x: x + w / 2, y: y + h / 2, k: rects.length - 1, ref: p.ref, pid: p.pid });\n      });\n      const under = (l) => rects.some((r, k) => k > l.k && l.x > r.x && l.x < r.x + r.w && l.y > r.y && l.y < r.y + r.h);\n      labels.filter((l) => !under(l)).forEach((l) => g2.appendChild(sv(\"text\", { x: l.x, y: l.y + 3, \"text-anchor\": \"middle\", class: \"ub-lab__binsp-ref\", \"data-ub-binsp-refof\": l.pid }, l.ref)));\n      const yb = V3.flipV ? py(Y0) : py(Y1);\n      dimLine(g2, px(X0), yb + 18, px(X1), yb + 18, f1(X1 - X0), \"h\");\n      dimLine(g2, px(X0) - 16, V3.flipV ? py(Y0) : py(Y1), px(X0) - 16, V3.flipV ? py(Y1) : py(Y0), f1(Y1 - Y0), \"v\");\n      g2.appendChild(sv(\"text\", { x: pad, y: 16, class: \"ub-lab__binsp-cap\" }, label));\n      return svg2;\n    }\n    function drawPart() {\n      drawBox.textContent = \"\";\n      const p = st.sel ? partOf(st.sel) : null;\n      if (p && p.ref) {\n        const r = p.row;\n        const L = r ? r.length : Math.max(p.mm.w, p.mm.h, p.mm.d), Wd = r ? r.width : [p.mm.w, p.mm.h, p.mm.d].sort((a, b) => b - a)[1];\n        const sc = Math.min(420 / L, 220 / Wd), pad = 40, w = L * sc, h = Wd * sc;\n        const svg2 = sv(\"svg\", {\n          viewBox: \"0 0 \" + (w + pad * 2) + \" \" + (h + pad * 2),\n          class: \"ub-lab__binsp-svg ub-lab__binsp-svg--part\",\n          \"data-ub-binsp-partdrawing\": p.pid,\n          role: \"img\",\n          \"aria-label\": p.ref + \" \" + p.name + \" \" + f1(L) + \" by \" + f1(Wd) + \" mm\"\n        });\n        const g2 = sv(\"g\", {});\n        svg2.appendChild(g2);\n        g2.appendChild(sv(\"rect\", { x: pad, y: pad, width: w, height: h, class: \"ub-lab__binsp-board\" }));\n        if (r) {\n          const E = r.edging || {};\n          const edges = { L1: [pad, pad + h, pad + w, pad + h], L2: [pad, pad, pad + w, pad], W1: [pad, pad, pad, pad + h], W2: [pad + w, pad, pad + w, pad + h] };\n          for (const k of Object.keys(edges)) if (E[k] > 0) {\n            const c = edges[k];\n            g2.appendChild(sv(\"line\", { x1: c[0], y1: c[1], x2: c[2], y2: c[3], class: \"ub-lab__binsp-edge\", \"data-ub-binsp-edge\": k }));\n          }\n          if (r.grain) g2.appendChild(sv(\"text\", { x: pad + w / 2, y: pad + h / 2 + 4, \"text-anchor\": \"middle\", class: \"ub-lab__binsp-grain\" }, \"grain along the length\"));\n        }\n        dimLine(g2, pad, pad + h + 18, pad + w, pad + h + 18, f1(L), \"h\");\n        dimLine(g2, pad - 16, pad + h, pad - 16, pad, f1(Wd), \"v\");\n        drawBox.appendChild(el(\"p\", \"ub-lab__binsp-dcap\", { \"data-ub-binsp-dcap\": \"\" }, p.ref + \" \" + p.name + \" - \" + (r ? r.thickness : p.thickness) + \" mm \" + p.materialLabel));\n        drawBox.appendChild(svg2);\n        if (p.notches && p.notches.length) {\n          svg2.setAttribute(\"data-ub-binsp-shaped\", String(p.notches.length));\n          drawBox.appendChild(el(\"p\", \"ub-lab__binsp-small\", { \"data-ub-binsp-shapednote\": \"\" }, \"Shaped board: \" + p.notches.length + \" notch\" + (p.notches.length === 1 ? \"\" : \"es\") + \" cut from this outline. The rectangle above is the board's cut size, not its finished outline - the notches are not drawn here.\"));\n        }\n        drawBox.appendChild(el(\"p\", \"ub-lab__binsp-small\", {}, r ? \"Edged: \" + edgeText(r.edging) + \" (heavy orange edges). Cut-list size, mm. Machining: \" + (p.ops && p.ops.length ? p.ops.join(\"; \") + \" (workshop rule); joints and drilling not defined.\" : \"not defined in this model.\") : p.why));\n      } else drawBox.appendChild(el(\"p\", \"ub-lab__binsp-small\", {}, \"Choose a part in the list or on the model to draw it.\"));\n      const pair = el(\"div\", \"ub-lab__binsp-elevs\");\n      pair.appendChild(elevation(\"front\", \"Front view, mm\"));\n      pair.appendChild(elevation(\"side\", \"Side view from the right, mm\"));\n      pair.appendChild(elevation(\"top\", \"Top view, front at the bottom, mm\"));\n      drawBox.appendChild(el(\"p\", \"ub-lab__binsp-small\", { \"data-ub-binsp-viewnote\": \"\" }, \"Each board drawn to scale from the parts list, nearer boards over farther ones; refs as in the parts table. Dashed: a shaped board - its extent is drawn, not its outline.\"));\n      drawBox.appendChild(pair);\n    }\n    function fillBuild() {\n      const c = st.ins.construction;\n      buildBox.textContent = \"\";\n      const sec = (h, items, attr) => {\n        buildBox.appendChild(el(\"h3\", \"ub-lab__binsp-h3\", {}, h));\n        const ul = el(\"ul\", \"\", attr || {});\n        items.forEach((t) => ul.appendChild(el(\"li\", \"\", {}, t)));\n        buildBox.appendChild(ul);\n      };\n      buildBox.appendChild(el(\"p\", \"\", {}, \"Shown: \" + c.shown + \". \" + c.readyNote));\n      if (c.choice.length) sec(\"Construction chosen for this kitchen\", c.choice.concat([c.choiceNote]));\n      sec(\"Known from the saved construction rules\", c.known, { \"data-ub-binsp-known\": \"\" });\n      sec(\"Not decided yet - not shown as fact\", c.unresolved, { \"data-ub-binsp-unresolved\": \"\" });\n      if (c.diffs && c.diffs.length) sec(\"Differences from the workshop's build\", c.diffs, { \"data-ub-binsp-diffs\": \"\" });\n      if (!st.ins.supported) sec(\"Not supported here\", st.ins.unsupported);\n    }\n    let editMsg = null;\n    function kitchenSays() {\n      st.resolved = Object.assign({}, st.draft);\n      st.refused = null;\n      st.notes = {};\n      if (st.type || !st.target) return;\n      let r = null;\n      try {\n        r = ctx.act(\"unit.editPreview\", { id: st.target, draft: st.draft }, { controls: false, render: false, out: false });\n      } catch {\n        r = null;\n      }\n      const F = r && r.fields || {};\n      for (const k of Object.keys(F)) {\n        const x = F[k], what = (editFields(st.base).find((q) => q.key === k) || { label: k }).label;\n        if (x.refused) {\n          st.refused = what + \": \" + x.refused;\n          st.notes[k] = \"Apply would refuse: \" + x.refused;\n          break;\n        }\n        if (Math.abs(x.value - x.asked) > 0.05) {\n          st.resolved[k] = x.value;\n          st.notes[k] = \"Will be \" + Math.round(x.value * 10) / 10 + \" mm\" + ((x.said || []).filter(Boolean).length ? \" - \" + x.said.filter(Boolean).join(\" \\xB7 \") : \" in this kitchen\");\n        }\n      }\n      if (r && r.ok === false && r.why) st.refused = r.why;\n    }\n    function refreshFromDraft() {\n      kitchenSays();\n      const u = draftUnit(st.base, st.resolved);\n      st.ins = buildInspection(u, { kitchen: sceneNow() && sceneNow().kitchen });\n      if (st.sel && !st.ins.parts.some((p) => p.pid === st.sel)) st.sel = null;\n      fillTable();\n      drawPart();\n      fillBuild();\n      push3d();\n      const ch = draftChanges(st.base, st.resolved);\n      editBox.querySelectorAll(\"[data-ub-binsp-fnote]\").forEach((n) => {\n        const k = n.getAttribute(\"data-ub-binsp-fnote\");\n        n.textContent = st.notes[k] || \"\";\n        n.hidden = !st.notes[k];\n      });\n      if (st.refused) {\n        editMsg.textContent = \"Apply would change nothing: \" + st.refused + \".\";\n        editMsg.setAttribute(\"data-ok\", \"0\");\n      } else {\n        editMsg.textContent = ch.length ? \"Preview (not applied): \" + ch.join(\"; \") + \".\" : \"No changes.\";\n        editMsg.removeAttribute(\"data-ok\");\n      }\n      editBox.querySelector(\"[data-ub-binsp-apply]\").disabled = !st.refused && !ch.length && !st.type;\n    }\n    function fillEdit() {\n      editBox.textContent = \"\";\n      editBox.appendChild(el(\"p\", \"ub-lab__binsp-small\", {}, st.type ? \"Change this cabinet here first if you like - nothing is added until you press Add to my kitchen.\" : \"Change this cabinet here - the 3D, parts and drawings show the result at once. Your kitchen changes only when you press Apply, as one Undo step.\"));\n      const F = editFields(st.base);\n      if (!F.length) editBox.appendChild(el(\"p\", \"\", {}, \"This cabinet has nothing that can be changed here.\"));\n      F.forEach((f) => {\n        const row = el(\"label\", \"ub-lab__binsp-erow\");\n        row.appendChild(el(\"span\", \"\", {}, f.label + (f.unit ? \" (\" + f.unit + \")\" : \"\")));\n        const inp = f.bool ? el(\"input\", \"\", { type: \"checkbox\", \"data-ub-binsp-field\": f.key }) : el(\"input\", \"\", { type: \"number\", min: String(f.min), max: String(f.max), step: \"1\", value: String(f.value), \"data-ub-binsp-field\": f.key });\n        if (f.bool) inp.checked = !!f.value;\n        const on = () => {\n          st.draft[f.key] = f.bool ? !!inp.checked : Number(inp.value);\n          refreshFromDraft();\n        };\n        inp.addEventListener(\"change\", on);\n        if (!f.bool) inp.addEventListener(\"input\", () => {\n          if (inp.value !== \"\" && isFinite(Number(inp.value))) on();\n        });\n        row.appendChild(inp);\n        if (!f.bool) row.appendChild(el(\"span\", \"ub-lab__binsp-small\", {}, f.min + \" - \" + f.max));\n        editBox.appendChild(row);\n        const note = el(\"p\", \"ub-lab__binsp-fnote\", { \"data-ub-binsp-fnote\": f.key, role: \"status\" });\n        note.hidden = true;\n        editBox.appendChild(note);\n      });\n      const bar = el(\"div\", \"ub-lab__binsp-bar\");\n      const apply = el(\"button\", \"\", { type: \"button\", \"data-ub-binsp-apply\": \"\" }, st.type ? \"Add to my kitchen\" : \"Apply to this cabinet\");\n      const reset = el(\"button\", \"\", { type: \"button\", \"data-ub-binsp-reset\": \"\" }, \"Reset\");\n      apply.addEventListener(\"click\", applyDraftNow);\n      reset.addEventListener(\"click\", () => {\n        st.draft = draftOf(st.base);\n        fillEdit();\n        refreshFromDraft();\n      });\n      bar.appendChild(apply);\n      bar.appendChild(reset);\n      editBox.appendChild(bar);\n      editMsg = el(\"p\", \"ub-lab__binsp-small\", { \"data-ub-binsp-editmsg\": \"\", role: \"status\" }, \"No changes.\");\n      editBox.appendChild(editMsg);\n      apply.disabled = !st.type;\n    }\n    function applyDraftNow() {\n      kitchenSays();\n      const draft = Object.assign({}, st.refused ? st.draft : st.resolved);\n      const r = st.type ? ctx.act(\"unit.editApply\", { type: st.type, draft }) : ctx.act(\"unit.editApply\", { id: st.target, fingerprint: st.fp, draft });\n      if (!r || r.ok === false) {\n        editMsg.textContent = r && r.why || \"Nothing changed.\";\n        editMsg.setAttribute(\"data-ok\", \"0\");\n        return r;\n      }\n      const sc = sceneNow(), u = sc && sc.units && sc.units.find((v) => v.id === r.id);\n      if (u) {\n        const tab = st.tab;\n        const was = st.opener;\n        open(u, { opener: was, tab });\n      }\n      editMsg.textContent = r.changed ? st.type ? \"Added to your kitchen - one Undo step.\" : \"Applied to the cabinet - one Undo step.\" : \"Nothing to change.\";\n      editMsg.setAttribute(\"data-ok\", \"1\");\n      return r;\n    }\n    function open(src, o) {\n      o = o || {};\n      if (!back) build3();\n      const ins = buildInspection(src, { kitchen: sceneNow() && sceneNow().kitchen });\n      st.ins = ins;\n      st.sel = null;\n      st.opener = o.opener || null;\n      st.explode = 0;\n      st.open = true;\n      st.type = typeof src === \"string\" ? src : null;\n      st.target = typeof src === \"string\" ? null : src.id;\n      st.fp = typeof src === \"string\" ? \"\" : unitFingerprint(src);\n      st.base = ins.unit;\n      st.draft = draftOf(ins.unit);\n      st.resolved = Object.assign({}, st.draft);\n      st.refused = null;\n      st.notes = {};\n      st.label = o.label || \"\";\n      const u = ins.unit;\n      const lab = o.label || safeLabel(u);\n      const from = ins.source && ins.source.kind === \"placed\" ? \"cabinet in your kitchen (a copy - the kitchen is not changed)\" : \"catalogue cabinet, default sizes (not in your kitchen)\";\n      title.textContent = \"How it is built - \" + lab + (/\\d\\s*[x\u00D7]\\s*\\d/.test(lab) ? \"\" : \", \" + u.w + \" x \" + u.h + \" x \" + u.d + \" mm\") + \" - \" + from;\n      title.setAttribute(\"data-ub-binsp-source\", ins.source ? ins.source.kind : \"\");\n      back.hidden = false;\n      st.wsSel = null;\n      fillTable();\n      drawPart();\n      fillBuild();\n      fillEdit();\n      fillWorkshop();\n      setTab(o.tab || \"parts\");\n      setView(\"assembled\");\n      watchWorkshop(true);\n      if (dlg.focus) dlg.focus();\n      return ins;\n    }\n    function fillWorkshop() {\n      if (!wsBox) return;\n      const sc = sceneNow();\n      const info = workshopPartsFor(sc || {}, sc && sc.productionHardware, st.type ? null : st.target);\n      if (info.status === \"ready\" && draftChanges(st.base, st.resolved || st.draft).length)\n        info.notes = [\"These are the kitchen's parts as it is now - not the Edit preview (Apply first to send it to the workshop).\"].concat(info.notes || []);\n      renderWorkshop(wsBox, info, { el, sv }, st.wsSel, (key) => {\n        st.wsSel = key;\n        fillWorkshop();\n      });\n    }\n    function watchWorkshop(on) {\n      const sc = sceneNow();\n      if (st.wsTimer) {\n        win2.clearInterval(st.wsTimer);\n        st.wsTimer = null;\n      }\n      if (!pro || !sc) return;\n      if (!on) {\n        delete sc.inspectProduction;\n        return;\n      }\n      sc.inspectProduction = true;\n      st.wsSeen = void 0;\n      const nudge = () => {\n        if (ctx.view && ctx.view.requestRender) ctx.view.requestRender();\n      };\n      nudge();\n      st.wsTimer = win2.setInterval(() => {\n        const s = sceneNow(), ps = s && s.productionHardware;\n        if (ps !== st.wsSeen) {\n          st.wsSeen = ps;\n          fillWorkshop();\n        }\n        if (!ps || ps.status !== \"ready\") nudge();\n      }, 400);\n    }\n    function hide() {\n      if (!st.open) return;\n      st.open = false;\n      watchWorkshop(false);\n      back.hidden = true;\n      if (st.V) {\n        try {\n          st.V.dispose();\n        } catch {\n        }\n        st.V = null;\n      }\n      if (canvas && canvas.parentNode && canvas.cloneNode) {\n        const fresh = canvas.cloneNode(false);\n        canvas.parentNode.replaceChild(fresh, canvas);\n        canvas = fresh;\n      }\n      st.fitKey = null;\n      if (st.opener && st.opener.focus) st.opener.focus();\n    }\n    function sceneNow() {\n      try {\n        return typeof ctx.scene === \"function\" ? ctx.scene() : ctx.scene;\n      } catch {\n        return null;\n      }\n    }\n    const safeLabel = (u) => {\n      try {\n        return unitLabel(u);\n      } catch {\n        return u.type;\n      }\n    };\n    (root.querySelectorAll ? Array.from(root.querySelectorAll(\"[data-ub-tray-add]\")) : []).forEach((tile) => {\n      if (!tile || !tile.appendChild || !tile.addEventListener || tile.querySelector && tile.querySelector(\"[data-ub-tray-inspect]\")) return;\n      const type = tile.getAttribute(\"data-ub-tray-add\");\n      const z = lens();\n      z.setAttribute(\"data-ub-tray-inspect\", type);\n      tile.appendChild(z);\n      const stop = (e) => {\n        if (e.target && e.target.closest && e.target.closest(\"[data-ub-tray-inspect]\")) {\n          e.stopPropagation();\n          if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n          return true;\n        }\n        return false;\n      };\n      for (const ev of [\"pointerdown\", \"mousedown\", \"touchstart\"]) tile.addEventListener(ev, stop, true);\n      tile.addEventListener(\"click\", (e) => {\n        if (stop(e)) {\n          if (e.preventDefault) e.preventDefault();\n          open(type, { opener: tile, label: (tile.textContent || \"\").trim() });\n        }\n      }, true);\n      tile.addEventListener(\"keydown\", (e) => {\n        if (e.key === \"i\" || e.key === \"I\") {\n          e.preventDefault();\n          e.stopPropagation();\n          open(type, { opener: tile, label: (tile.textContent || \"\").trim() });\n        }\n      }, true);\n    });\n    const dup = root.querySelector(\"[data-ub-duplicate]\");\n    if (dup && dup.parentNode && dup.parentNode.insertBefore && typeof doc2.createElement === \"function\" && !root.querySelector(\"[data-ub-inspect]\")) {\n      const b = el(\"button\", \"ub-lab__btn\", { type: \"button\", \"data-ub-inspect\": \"\", title: \"See this cabinet alone: 3D, drawing and its parts (view only)\" }, \"Inspect build\");\n      b.addEventListener(\"click\", () => {\n        const s = sceneNow(), u = s && s.units && s.units.find((v) => v.id === s.selectedId);\n        if (u) open(u, { opener: b });\n      });\n      dup.parentNode.insertBefore(b, dup);\n    }\n    const api = {\n      open,\n      close: hide,\n      state: () => ({\n        open: st.open,\n        sel: st.sel,\n        explode: st.explode,\n        plain: st.plain,\n        tab: st.tab,\n        has3d: !!st.V,\n        view: st.V ? st.V.state() : null,\n        tool: st.tool || \"rotate\",\n        unitId: st.ins && st.ins.unit.id,\n        parts: st.ins ? st.ins.parts.length : 0,\n        draft: st.draft && Object.assign({}, st.draft),\n        resolved: st.resolved && Object.assign({}, st.resolved),\n        refused: st.refused || null,\n        notes: Object.assign({}, st.notes || {}),\n        target: st.target,\n        type: st.type\n      }),\n      choose: (pid) => choose(pid, \"api\"),\n      setView,\n      setTab,\n      setTool,\n      viewer: () => st.V,\n      inspection: () => st.ins,\n      apply: () => applyDraftNow()\n    };\n    root.__ubBuildInspector = api;\n    try {\n      const loc = win2 && win2.location, m = loc && /^cut\\.uniboards\\.co\\.uk$/i.test(String(loc.hostname || \"\")) && /^#ub-binsp=([\\w,=-]+)$/.exec(String(loc.hash || \"\"));\n      if (m && win2.setTimeout) win2.setTimeout(() => {\n        const bits = m[1].split(\",\"), what = bits[0];\n        if (what === \"selected\") {\n          const sc = sceneNow(), u = sc && sc.units && (sc.units.find((v) => v.id === sc.selectedId) || sc.units[0]);\n          if (u) open(u, {});\n        } else open(what, {});\n        const pn = bits.find((b) => /^part=\\d+$/.test(b));\n        if (pn && st.ins) {\n          const p = st.ins.parts[Number(pn.slice(5)) - 1];\n          if (p) choose(p.pid, \"api\");\n        }\n        if (bits.includes(\"exploded\")) setView(\"exploded\");\n        if (bits.includes(\"drawing\")) setTab(\"drawing\");\n        else if (bits.includes(\"build\")) setTab(\"build\");\n      }, 2500);\n    } catch {\n    }\n    return api;\n  }\n\n  // v2/src/ui/cutouts-editor.js\n  var SNAP_MM3 = 5;\n  var SVGNS = \"http://www.w3.org/2000/svg\";\n  var AXES2 = { \"side-left\": [\"front\", \"underside\"], \"side-right\": [\"front\", \"underside\"], back: [\"left face\", \"underside\"], bottom: [\"left face\", \"front\"], top: [\"left face\", \"front\"] };\n  function snapPoint2(p, rect2, snapEdge) {\n    const s = (v) => Math.round(v / SNAP_MM3) * SNAP_MM3;\n    let x = s(p[0]), y = s(p[1]);\n    const ex = snapEdge != null ? snapEdge : Math.max(8, 0.03 * Math.max(rect2.x1 - rect2.x0, rect2.y1 - rect2.y0));\n    if (Math.abs(p[0] - rect2.x0) <= ex) x = rect2.x0;\n    else if (Math.abs(p[0] - rect2.x1) <= ex) x = rect2.x1;\n    if (Math.abs(p[1] - rect2.y0) <= ex) y = rect2.y0;\n    else if (Math.abs(p[1] - rect2.y1) <= ex) y = rect2.y1;\n    return [Math.round(x * 10) / 10, Math.round(y * 10) / 10];\n  }\n  function createCutoutsEditor(ctx) {\n    if (editionOf(ctx.root) !== PRO) return {};\n    const doc2 = ctx.doc;\n    const folds = ctx.root.querySelector(\".ub-lab__sec--folds\");\n    if (!doc2 || !folds || !folds.parentNode) return {};\n    const el = (tag, cls, text) => {\n      const e = doc2.createElement(tag);\n      if (cls) e.className = cls;\n      if (text != null) e.textContent = text;\n      return e;\n    };\n    const sec = el(\"section\", \"ub-lab__sec ub-lab__sec--cutouts\");\n    sec.setAttribute(\"data-ub-cutouts\", \"\");\n    sec.appendChild(el(\"h3\", \"ub-lab__sechead\", \"Cut-outs\"));\n    const status = el(\"p\", \"ub-lab__note\");\n    status.setAttribute(\"data-ub-cutstatus\", \"\");\n    sec.appendChild(status);\n    const panels = el(\"div\", \"ub-lab__opts\");\n    panels.setAttribute(\"role\", \"group\");\n    panels.setAttribute(\"aria-label\", \"Board\");\n    sec.appendChild(panels);\n    const svg2 = doc2.createElementNS(SVGNS, \"svg\");\n    svg2.setAttribute(\"data-ub-cutsketch\", \"\");\n    svg2.setAttribute(\"class\", \"ub-lab__cutsketch\");\n    svg2.setAttribute(\"role\", \"img\");\n    sec.appendChild(svg2);\n    const xy = el(\"div\", \"ub-lab__cutxy\");\n    const ix = el(\"input\");\n    ix.type = \"number\";\n    ix.step = \"1\";\n    ix.placeholder = \"x mm\";\n    ix.setAttribute(\"data-ub-cutx\", \"\");\n    ix.setAttribute(\"aria-label\", \"x, mm\");\n    const iy = el(\"input\");\n    iy.type = \"number\";\n    iy.step = \"1\";\n    iy.placeholder = \"y mm\";\n    iy.setAttribute(\"data-ub-cuty\", \"\");\n    iy.setAttribute(\"aria-label\", \"y, mm\");\n    const addPt = el(\"button\", \"ub-lab__btn\", \"Add corner\");\n    addPt.type = \"button\";\n    addPt.setAttribute(\"data-ub-cutaddpt\", \"\");\n    xy.appendChild(ix);\n    xy.appendChild(iy);\n    xy.appendChild(addPt);\n    sec.appendChild(xy);\n    const acts = el(\"div\", \"ub-lab__opts\");\n    const apply = el(\"button\", \"ub-lab__btn\", \"Cut it\");\n    apply.type = \"button\";\n    apply.setAttribute(\"data-ub-cutapply\", \"\");\n    const undoPt = el(\"button\", \"ub-lab__btn\", \"Undo corner\");\n    undoPt.type = \"button\";\n    undoPt.setAttribute(\"data-ub-cutundo\", \"\");\n    const clear = el(\"button\", \"ub-lab__btn\", \"Clear\");\n    clear.type = \"button\";\n    clear.setAttribute(\"data-ub-cutclear\", \"\");\n    acts.appendChild(apply);\n    acts.appendChild(undoPt);\n    acts.appendChild(clear);\n    sec.appendChild(acts);\n    const list = el(\"ul\", \"ub-lab__cutlist\");\n    list.setAttribute(\"data-ub-cutlist\", \"\");\n    sec.appendChild(list);\n    sec.appendChild(el(\"p\", \"ub-lab__note\", \"Corners inside the board make a hole; corners on its edge make a notch. Cut through the board, with the workshop's routing cutter - inside corners come out rounded to its radius.\"));\n    const build3 = ctx.root.querySelector(\"[data-ub-build-settings]\");\n    if (build3 && build3.parentNode) build3.parentNode.insertBefore(sec, build3.nextSibling);\n    else folds.parentNode.insertBefore(sec, folds);\n    const st = { unit: null, panel: null, draft: [] };\n    const sel = () => {\n      const sc = ctx.scene();\n      return (sc.units || []).find((u) => u.id === sc.selectedId) || null;\n    };\n    const rectOf = (u, panel) => u && panel ? panelRect(u, carcassRawFor(u), u.d, panel) : null;\n    let view = null;\n    function draw() {\n      while (svg2.firstChild) svg2.removeChild(svg2.firstChild);\n      const u = sel(), r = rectOf(u, st.panel);\n      if (!r) {\n        svg2.setAttribute(\"hidden\", \"\");\n        view = null;\n        return;\n      }\n      svg2.removeAttribute(\"hidden\");\n      const w = r.x1 - r.x0, h = r.y1 - r.y0, m = 0.08 * Math.max(w, h);\n      view = { x: r.x0 - m, y: r.y0 - m, w: w + 2 * m, h: h + 2 * m, r };\n      svg2.setAttribute(\"viewBox\", [view.x, -(view.y + view.h), view.w, view.h].join(\" \"));\n      const ns = (tag, attrs, text) => {\n        const e = doc2.createElementNS(SVGNS, tag);\n        for (const k in attrs) e.setAttribute(k, attrs[k]);\n        if (text != null) e.textContent = text;\n        svg2.appendChild(e);\n        return e;\n      };\n      const pts = (list2) => list2.map((p) => p[0] + \",\" + -p[1]).join(\" \");\n      const sw = Math.max(w, h) / 300;\n      ns(\"rect\", { x: r.x0, y: -r.y1, width: w, height: h, fill: \"#f4f1ea\", stroke: \"#222\", \"stroke-width\": sw, \"data-ub-cutboard\": \"\" });\n      for (const c of normCutouts(u.cutouts).filter((c2) => c2.panel === st.panel)) {\n        ns(\"polygon\", { points: pts(c.pts), fill: \"#fff\", stroke: \"#b42318\", \"stroke-width\": sw, \"data-ub-cutshape\": c.id });\n      }\n      if (st.draft.length) {\n        ns(st.draft.length > 2 ? \"polygon\" : \"polyline\", { points: pts(st.draft), fill: st.draft.length > 2 ? \"rgba(180,35,24,0.12)\" : \"none\", stroke: \"#b42318\", \"stroke-width\": sw, \"stroke-dasharray\": 4 * sw + \" \" + 3 * sw, \"data-ub-cutdraft\": \"\" });\n        st.draft.forEach((p) => ns(\"circle\", { cx: p[0], cy: -p[1], r: 3 * sw, fill: \"#b42318\" }));\n      }\n      const fs = Math.max(w, h) / 22, [ax, ay] = AXES2[st.panel];\n      ns(\"text\", { x: r.x0, y: -r.y0 + fs * 1.2, \"font-size\": fs, fill: \"#555\" }, \"0 = \" + ax + \" / \" + ay);\n      ns(\"text\", { x: r.x1, y: -r.y0 + fs * 1.2, \"font-size\": fs, fill: \"#555\", \"text-anchor\": \"end\" }, Math.round(w) + \" x \" + Math.round(h) + \" mm\");\n    }\n    function sync() {\n      const u = sel();\n      const can = u ? cutoutPanelsOf(u) : [];\n      if (!u || u.id !== st.unit) {\n        st.unit = u ? u.id : null;\n        st.draft = [];\n        st.panel = can[0] || null;\n      }\n      if (st.panel && !can.includes(st.panel)) st.panel = can[0] || null;\n      status.textContent = !u ? \"Select a cabinet to draw a cut-out on one of its boards.\" : !can.length ? displayName(ctx.scene().units || [], u) + \": cut-outs are not available on this cabinet type yet.\" : displayName(ctx.scene().units || [], u) + \" - \" + PANEL_LABEL[st.panel].toLowerCase() + (st.draft.length ? \": \" + st.draft.length + \" corner\" + (st.draft.length === 1 ? \"\" : \"s\") : \": click the drawing to put corners\");\n      while (panels.firstChild) panels.removeChild(panels.firstChild);\n      for (const p of can) {\n        const b = el(\"button\", \"ub-lab__btn\", PANEL_LABEL[p]);\n        b.type = \"button\";\n        b.setAttribute(\"data-ub-cutpanel\", p);\n        b.setAttribute(\"aria-pressed\", String(p === st.panel));\n        b.addEventListener(\"click\", () => {\n          st.panel = p;\n          st.draft = [];\n          sync();\n        });\n        panels.appendChild(b);\n      }\n      while (list.firstChild) list.removeChild(list.firstChild);\n      if (u) {\n        for (const v of cutoutVerdicts(u, carcassRawFor(u), u.d)) {\n          const li = el(\"li\", \"ub-lab__cutitem\", (v.kind === \"hole\" ? \"Hole\" : v.kind === \"notch\" ? \"Notch\" : \"Not cut\") + \" - \" + PANEL_LABEL[v.panel].toLowerCase() + (v.why ? \" (\" + v.why + \")\" : \"\"));\n          const rm = el(\"button\", \"ub-lab__btn\", \"Remove\");\n          rm.type = \"button\";\n          rm.setAttribute(\"data-ub-cutremove\", v.id);\n          rm.addEventListener(\"click\", () => ctx.act(\"unit.cutout.remove\", { id: u.id, cut: v.id }));\n          li.appendChild(rm);\n          list.appendChild(li);\n        }\n      }\n      const on = !!(u && st.panel);\n      xy.hidden = !on;\n      acts.hidden = !on;\n      apply.disabled = st.draft.length < 3;\n      undoPt.disabled = !st.draft.length;\n      clear.disabled = !st.draft.length;\n      draw();\n    }\n    function put(p) {\n      const u = sel(), r = rectOf(u, st.panel);\n      if (!r) return;\n      st.draft.push(snapPoint2(p, r));\n      sync();\n    }\n    svg2.addEventListener(\"click\", (e) => {\n      if (!view) return;\n      const b = svg2.getBoundingClientRect();\n      if (!(b.width > 0 && b.height > 0)) return;\n      const k = Math.min(b.width / view.w, b.height / view.h), ox = (b.width - view.w * k) / 2, oy = (b.height - view.h * k) / 2;\n      const x = view.x + (e.clientX - b.left - ox) / k, y = view.y + view.h - (e.clientY - b.top - oy) / k;\n      put([x, y]);\n    });\n    addPt.addEventListener(\"click\", () => {\n      const x = Number(ix.value), y = Number(iy.value);\n      if (ix.value === \"\" || iy.value === \"\" || !Number.isFinite(x) || !Number.isFinite(y)) return;\n      st.draft.push([Math.round(x * 10) / 10, Math.round(y * 10) / 10]);\n      ix.value = \"\";\n      iy.value = \"\";\n      sync();\n    });\n    undoPt.addEventListener(\"click\", () => {\n      st.draft.pop();\n      sync();\n    });\n    clear.addEventListener(\"click\", () => {\n      st.draft = [];\n      sync();\n    });\n    apply.addEventListener(\"click\", () => {\n      const u = sel();\n      if (!u || st.draft.length < 3) return;\n      const res = ctx.act(\"unit.cutout.add\", { id: u.id, panel: st.panel, pts: st.draft.slice() });\n      if (!res || res.ok !== false) st.draft = [];\n      sync();\n    });\n    return {\n      sync,\n      destroy() {\n        if (sec.parentNode) sec.parentNode.removeChild(sec);\n      }\n    };\n  }\n\n  // v2/src/product/catalogue.js\n  var ELIGIBLE_TILES = Object.freeze([\"base\", \"base-double\", \"base-drawer\", \"base-4drawer\", \"wall\", \"wall-double\", \"tall-pantry\"]);\n  var HELD_TILES = Object.freeze({\n    island: \"A three-section island (1836 mm, drawers / doors / drawers) - the workshop builds it, but its sections are a kitchen layout, not a single-cabinet editor; held for a later product.\"\n  });\n  var NOT_A_PRODUCT = Object.freeze({\n    /* the source of every reason: the workshop converter's UNSUPPORTED_TYPES (Furniture Configurator public/js/labConvert.js) -\n       the words below are shown to shoppers, so they carry no code names */\n    \"corner-l\": \"L-shaped carcass: our workshop makes rectangular carcasses only.\",\n    \"corner-wall\": \"L-shaped wall carcass: not made by our workshop yet.\",\n    \"corner-blind\": \"Blind corner needs a fixed blanking panel our workshop does not make yet.\",\n    \"corner-tall\": \"Tall L corner: not made by our workshop yet.\",\n    \"tall-fridge\": \"Appliance housing: needs the appliance model (open back, fixed deck) - not made by our workshop yet.\",\n    \"tall-oven\": \"Oven tower: an appliance niche sized to the appliance - not made by our workshop yet.\",\n    \"base-oven\": \"Oven + hob base: sized to one Bosch model - depends on the appliance - not made by our workshop yet.\",\n    \"base-oven-hood\": \"Oven, hob + hood: depends on the appliance - not made by our workshop yet.\"\n  });\n  function isProductTile(tile) {\n    return ELIGIBLE_TILES.indexOf(tile) >= 0;\n  }\n  function tileName(tile) {\n    return TILE_NAME[tile] || tile;\n  }\n  function catalogueUnit(tile) {\n    const spec = libSpec(tile), u = newUnit(spec.type);\n    if (spec.doors) u.doors = spec.doors;\n    if (spec.w) u.w = spec.w;\n    if (spec.type !== \"base-4drawer\" && spec.type !== \"island\" && spec.type !== \"base-oven\") u.door = true;\n    if (spec.hood) u.hood = true;\n    return u;\n  }\n  function sizeLimits(u) {\n    const L = limitsFor(u);\n    return { w: [Math.max(L.w[0], structuralWidthMin(u)), L.w[1]], h: L.h.slice(), d: L.d.slice() };\n  }\n  function facts(u) {\n    const floor = u.family !== \"wall\";\n    const parts = cabinetParts(u) || [];\n    const count = (k) => parts.filter((p) => p.kind === k).length;\n    return {\n      floor,\n      legs: floor ? 4 : 0,\n      legH: floor ? LEG_H : 0,\n      hung: !floor,\n      mountY: floor ? 0 : u.y,\n      doors: u.door ? u.type === \"tall-pantry\" ? 1 : u.doors || 1 : 0,\n      drawers: count(\"drawer-front\"),\n      shelves: count(\"shelf\"),\n      panels: parts.filter((p) => p.kind !== \"leg\" && p.kind !== \"drawer-box\").length\n    };\n  }\n  function fnv(s) {\n    let h = 2166136261;\n    for (let i = 0; i < s.length; i++) {\n      h ^= s.charCodeAt(i);\n      h = Math.imul(h, 16777619) >>> 0;\n    }\n    return h.toString(16).padStart(8, \"0\");\n  }\n  function tileRevision(tile) {\n    const u = catalogueUnit(tile);\n    const shape2 = {\n      type: u.type,\n      doors: u.doors,\n      door: u.door,\n      w: u.w,\n      h: u.h,\n      d: u.d,\n      y: u.y,\n      lim: sizeLimits(u),\n      parts: (cabinetParts(u) || []).map((p) => [p.kind, p.name, p.local && [p.local.x0, p.local.x1, p.local.y0, p.local.y1, p.local.z0, p.local.z1].map(Math.round)])\n    };\n    return fnv(JSON.stringify(shape2));\n  }\n\n  // v2/src/product/config.js\n  var KITCHEN = Object.freeze({ carcass: \"white\", fronts: \"white\" });\n  var MAX_DIVIDERS = 4;\n  function boardDecors() {\n    return OFFERED_DECORS.filter((d) => (d.variants || []).some((v) => Number(v[0]) >= 18 && Number(v[0]) < 19));\n  }\n  function decorGroups() {\n    const list = boardDecors();\n    return DECOR_GROUPS.map(([id, label]) => ({ id, label, decors: list.filter((d) => d.group === id) })).filter((g2) => g2.decors.length);\n  }\n  function newConfig(tile) {\n    if (!isProductTile(tile)) return null;\n    const u = catalogueUnit(tile);\n    makeCarcassOnly(u);\n    u.id = \"K1\";\n    return finish2({ tile, rev: tileRevision(tile), unit: u });\n  }\n  function finish2(c) {\n    try {\n      settleEqual([c.unit]);\n    } catch {\n    }\n    resolveFinishes([c.unit], KITCHEN);\n    return c;\n  }\n  var KIT_TILES = Object.freeze([\"base\", \"base-double\"]);\n  var KIT_CHECKED = Object.freeze({ maxDepth: 580, maxHeight: 720 });\n  function limitsOf(c) {\n    const L = sizeLimits(c.unit);\n    if (!KIT_TILES.includes(c.tile)) return L;\n    return { ...L, h: [L.h[0], Math.min(L.h[1], KIT_CHECKED.maxHeight)], d: [L.d[0], Math.min(L.d[1], KIT_CHECKED.maxDepth)] };\n  }\n  function setSize(c, k, raw) {\n    const u = c.unit, lim = limitsOf(c)[k];\n    if (!lim) return { ok: false, why: \"unknown size\" };\n    let v = parseInt(String(raw).replace(/[^0-9-]/g, \"\"), 10);\n    if (!isFinite(v)) return { ok: false, value: u[k], why: \"Type a size in millimetres\" };\n    if (k === \"w\" && v < lim[0]) return { ok: false, value: u[k], why: \"The narrowest this cabinet can be is \" + lim[0] + \" mm\" };\n    const want = v;\n    v = clamp4(v, lim[0], lim[1]);\n    u[k] = v;\n    finish2(c);\n    return { ok: true, value: v, why: v !== want ? (k === \"w\" ? \"Width\" : k === \"h\" ? \"Height\" : \"Depth\") + \" runs \" + lim[0] + \"\\u2013\" + lim[1] + \" mm - set to \" + v + \" mm\" : null };\n  }\n  function interiorState(c) {\n    const u = c.unit;\n    if (!canInterior(u)) return { can: false, why: interiorWhy(u), shelves: 0, dividers: 0, maxShelves: 0, maxDividers: 0 };\n    const I = interiorOf(u);\n    let maxD = 0;\n    for (let n = 1; n <= MAX_DIVIDERS; n++) {\n      const P2 = splitPlan(u, \"v\", n);\n      if (P2.ok) maxD = n;\n      else break;\n    }\n    return { can: true, why: null, shelves: I.shelves, dividers: I.vDiv.length, maxShelves: maxShelvesFor(u), maxDividers: Math.max(maxD, I.vDiv.length) };\n  }\n  function setShelves(c, n) {\n    const u = c.unit;\n    if (!canInterior(u)) return { ok: false, why: interiorWhy(u) };\n    const I = interiorOf(u), want = clamp4(Math.round(Number(n) || 0), 0, maxShelvesFor(u));\n    if (want === I.shelves) return { ok: true, value: want, changed: false };\n    const next = { ...u.interior || {}, shelves: want, vDiv: I.vDiv.slice(), hDiv: I.hDiv.slice() };\n    next.dividers = next.vDiv;\n    next.vSb = carrySetbacks(I.vDiv, I.vSb, next.vDiv);\n    next.hSb = carrySetbacks(I.hDiv, I.hSb, next.hDiv);\n    next.shelfList = reconcileShelfCount(u, want);\n    if (next.shelfList) next.shelves = shelvesPerCell(u, next.shelfList);\n    setInterior(u, next);\n    finish2(c);\n    return { ok: true, value: interiorOf(u).shelves, changed: true };\n  }\n  function setDividers(c, n) {\n    const u = c.unit;\n    if (!canInterior(u)) return { ok: false, why: interiorWhy(u) };\n    const I = interiorOf(u), want = clamp4(Math.round(Number(n) || 0), 0, MAX_DIVIDERS);\n    if (want === I.vDiv.length) return { ok: true, value: want, changed: false };\n    if (want > 0) {\n      const P2 = splitPlan(u, \"v\", want);\n      if (!P2.ok) return { ok: false, why: P2.why };\n    }\n    const next = { shelves: I.shelves, vDiv: new Array(want).fill(0).map((_, i) => i), hDiv: I.hDiv.slice(), shelfList: null };\n    next.dividers = next.vDiv;\n    next.vSb = next.vDiv.map(() => null);\n    next.hSb = carrySetbacks(I.hDiv, I.hSb, next.hDiv);\n    setInterior(u, next);\n    if (want > 0) {\n      const r = splitEqually(u, \"v\");\n      if (!r.ok) return { ok: false, why: r.why };\n    }\n    finish2(c);\n    return { ok: true, value: interiorOf(u).vDiv.length, changed: true };\n  }\n  function setDecor(c, which, key) {\n    if (!decorOf(key)) return { ok: false, why: \"Unknown finish\" };\n    if (boardDecors().indexOf(decorOf(key)) < 0) return { ok: false, why: \"That decor has no 18 mm board\" };\n    if (which === \"carcass\") c.unit.ovCarcass = key === KITCHEN.carcass ? null : key;\n    else if (which === \"fronts\") c.unit.ovFronts = key === KITCHEN.fronts ? null : key;\n    else return { ok: false, why: \"carcass or fronts\" };\n    finish2(c);\n    return { ok: true };\n  }\n  function decorKeys(c) {\n    return { carcass: c.unit.finish, fronts: c.unit.doorFinish };\n  }\n  function frontsOn(c) {\n    return anyFrontsOn(c.unit);\n  }\n  function frontsWord(c) {\n    const t = c.unit.type;\n    return t === \"base-oven\" ? \"panel below the oven\" : t === \"base-4drawer\" ? \"drawer fronts\" : t === \"base-drawer\" ? \"door and drawer front\" : c.unit.doors === 2 && t !== \"tall-pantry\" ? \"doors\" : t === \"tall-pantry\" ? \"doors\" : \"door\";\n  }\n  function setFronts(c, on) {\n    const u = c.unit;\n    if (on) {\n      if (u.type !== \"base-4drawer\" && u.type !== \"base-oven\") u.door = true;\n      delete u.drawerFronts;\n    } else makeCarcassOnly(u);\n    finish2(c);\n    return { ok: true, on: frontsOn(c) };\n  }\n  function setFixing(c, v) {\n    if (!fixingOk(v)) return { ok: false, why: \"Lamello Cabineo 12 or screws\" };\n    c.unit.fixing = v;\n    return { ok: true };\n  }\n  function fixingOf2(c) {\n    return c.unit.fixing === \"screws\" ? \"screws\" : \"cabineo\";\n  }\n  function fixingNote(c) {\n    return fixingOf(c.unit);\n  }\n  function workshopNotes(c) {\n    try {\n      return buildDiffs(c.unit).filter((t) => !/^Edge banding/.test(t));\n    } catch {\n      return [];\n    }\n  }\n  function customised(c) {\n    const d = catalogueUnit(c.tile), u = c.unit;\n    return u.w !== d.w || u.h !== d.h || u.d !== d.d || !!u.ovCarcass || !!u.ovFronts || !!u.interior || u.fixing === \"screws\" || anyFrontsOn(u);\n  }\n  var KEEP = [\"type\", \"family\", \"w\", \"h\", \"d\", \"y\", \"doors\", \"door\", \"drawerFronts\", \"hood\", \"ovCarcass\", \"ovFronts\", \"interior\", \"shelves\", \"fixing\", \"drawers\"];\n  function serialize(c) {\n    const u = {};\n    for (const k of KEEP) if (c.unit[k] !== void 0 && c.unit[k] !== null) u[k] = JSON.parse(JSON.stringify(c.unit[k]));\n    return { tile: c.tile, rev: c.rev, unit: u };\n  }\n  function restore(saved) {\n    if (!saved || !isProductTile(saved.tile)) return null;\n    const c = newConfig(saved.tile), s = saved.unit || {};\n    c.rev = typeof saved.rev === \"string\" ? saved.rev : c.rev;\n    for (const k of [\"w\", \"h\", \"d\"]) if (s[k] != null) setSize(c, k, s[k]);\n    if (s.ovCarcass) setDecor(c, \"carcass\", s.ovCarcass);\n    if (s.ovFronts) setDecor(c, \"fronts\", s.ovFronts);\n    if (s.interior) {\n      const I = s.interior;\n      if (Array.isArray(I.vDiv) && I.vDiv.length) setDividers(c, I.vDiv.length);\n      if (I.shelves != null) setShelves(c, I.shelves);\n    } else if (s.type === \"tall-pantry\" && s.shelves != null) setShelves(c, s.shelves);\n    if (s.fixing) setFixing(c, s.fixing);\n    if (s.door === true || s.type === \"base-4drawer\" && s.drawerFronts !== false && s.door !== void 0) setFronts(c, true);\n    return c;\n  }\n\n  // v2/src/product/basket.js\n  var BASKET_KEY = \"ub-kitchen-basket:v1\";\n  var HANDOFF_KEY = \"ub-kitchen-basket:handoff\";\n  var HANDOFF_MAX_MS = 30 * 60 * 1e3;\n  var MAX_ITEMS = 40;\n  var MAX_QTY = 20;\n  var MINIMUM_EX_VAT = 300;\n  function readJ(store, k) {\n    try {\n      const v = store && store.getItem(k);\n      return v ? JSON.parse(v) : null;\n    } catch {\n      return null;\n    }\n  }\n  function writeJ(store, k, v) {\n    try {\n      store.setItem(k, JSON.stringify(v));\n      return true;\n    } catch {\n      return false;\n    }\n  }\n  function rid() {\n    return \"B\" + Date.now().toString(36) + Math.floor(Math.random() * 1e6).toString(36);\n  }\n  function createBasket(store) {\n    let items = load();\n    function load() {\n      const raw = readJ(store, BASKET_KEY);\n      const list = raw && raw.v === 1 && Array.isArray(raw.items) ? raw.items : [];\n      const out = [];\n      for (const it of list.slice(0, MAX_ITEMS)) {\n        const c = restore(it);\n        if (!c) continue;\n        out.push({ id: typeof it.id === \"string\" ? it.id : rid(), cfg: c, qty: clampQty(it.qty), name: typeof it.name === \"string\" ? it.name.slice(0, 80) : tileName(c.tile) });\n      }\n      return out;\n    }\n    function save() {\n      return writeJ(store, BASKET_KEY, { v: 1, items: items.map((i) => ({ id: i.id, qty: i.qty, name: i.name, ...serialize(i.cfg) })) });\n    }\n    function clampQty(q) {\n      q = Math.round(Number(q) || 1);\n      return q < 1 ? 1 : q > MAX_QTY ? MAX_QTY : q;\n    }\n    const api = {\n      items: () => items.slice(),\n      count: () => items.reduce((n, i) => n + i.qty, 0),\n      add(cfg, qty, name2) {\n        if (items.length >= MAX_ITEMS) return { ok: false, why: \"The basket holds up to \" + MAX_ITEMS + \" different cabinets\" };\n        const it = { id: rid(), cfg: restore(serialize(cfg)), qty: clampQty(qty), name: name2 || tileName(cfg.tile) };\n        items.push(it);\n        return { ok: save(), id: it.id };\n      },\n      replace(id, cfg) {\n        const it = items.find((i) => i.id === id);\n        if (!it) return { ok: false };\n        it.cfg = restore(serialize(cfg));\n        return { ok: save() };\n      },\n      setQty(id, q) {\n        const it = items.find((i) => i.id === id);\n        if (!it) return { ok: false };\n        it.qty = clampQty(q);\n        return { ok: save() };\n      },\n      remove(id) {\n        const n = items.length;\n        items = items.filter((i) => i.id !== id);\n        save();\n        return { ok: items.length < n };\n      },\n      reload() {\n        items = load();\n        return items.slice();\n      }\n    };\n    return api;\n  }\n  function planUnits(entries) {\n    const floor = [], wall = [];\n    let n = 0;\n    for (const e of entries) {\n      for (let k = 0; k < e.qty; k++) {\n        const u = JSON.parse(JSON.stringify(e.cfg.unit));\n        u.id = \"U\" + ++n;\n        u.rot = 0;\n        u.z = 0;\n        u.run = \"main\";\n        u.label = e.name;\n        u.kitchenProduct = { tile: e.cfg.tile, rev: e.cfg.rev, item: e.id || null };\n        (u.family === \"wall\" ? wall : floor).push(u);\n      }\n    }\n    let x = 0;\n    for (const u of floor) {\n      u.x = x;\n      x += u.w;\n    }\n    let xw = 0;\n    for (const u of wall) {\n      u.x = xw;\n      xw += u.w;\n    }\n    return floor.concat(wall);\n  }\n  function isKit(entries) {\n    return entries.length > 0 && entries.every((e) => e && e.cfg && KIT_TILES.includes(e.cfg.tile) && e.cfg.unit && e.cfg.unit.fixing !== \"screws\");\n  }\n  function planOf2(entries) {\n    const units = planUnits(entries);\n    const run = units.reduce((m, u) => Math.max(m, u.x + u.w), 0);\n    const deep = units.reduce((m, u) => Math.max(m, u.d), 0);\n    const kit = isKit(entries);\n    return {\n      v: 1,\n      units,\n      kitchen: { carcass: \"white\", fronts: \"white\" },\n      room: { on: true, width: Math.max(3600, Math.ceil((run + 600) / 100) * 100), depth: Math.max(3e3, deep + 1500), height: 2400 },\n      activeRun: \"main\",\n      drilling: kit,\n      ...kit ? { hardware: \"kit\" } : {}\n    };\n  }\n  function quoteBody(entries, cfg) {\n    const plan = planOf2(entries);\n    const parts = calcSceneParts(plan.units, cfg || calcConfig());\n    const body = { parts, machining: false, scene: plan };\n    if (plan.drilling) body.drilling = true;\n    if (plan.hardware) body.hardware = plan.hardware;\n    return { body, rows: parts.length, units: plan.units.length, kit: plan.hardware === \"kit\" };\n  }\n  function readQuote(j) {\n    if (!j || j.ok === false) return { ok: false, why: j && j.error || \"No price\" };\n    const lines = Array.isArray(j.lines) ? j.lines : [];\n    const priced = lines.filter((l) => l.status === \"priced\").map((l) => ({ label: l.label, qty: l.qty, ex: l.amount_ex_vat, kind: l.kind, note: l.note || \"\" }));\n    const missing = lines.filter((l) => l.status !== \"priced\" && l.status !== \"excluded\").map((l) => ({ label: l.label, note: l.note || \"\" }));\n    const excluded = lines.filter((l) => l.status === \"excluded\").map((l) => l.label);\n    const t = j.totals || {}, terms = j.terms || {};\n    return {\n      ok: true,\n      complete: j.complete === true,\n      ex: t.ex_vat,\n      inc: t.inc_vat,\n      vat: t.vat,\n      lines: priced,\n      missing,\n      excluded,\n      minimum: terms.minimum_ex_vat != null ? terms.minimum_ex_vat : MINIMUM_EX_VAT,\n      belowMinimum: terms.below_minimum === true,\n      madeToOrder: terms.made_to_order || \"\",\n      quoteId: j.quote_id || null,\n      unmapped: j.unmapped_materials || []\n    };\n  }\n  function writeHandoff(store, entries, intent, now) {\n    const plan = planOf2(entries);\n    const it = intent === \"checkout\" || intent === \"quote\" ? intent : \"open\";\n    return writeJ(store, HANDOFF_KEY, { v: 1, at: now || Date.now(), intent: it, count: plan.units.length, plan });\n  }\n  function takeHandoff(store, now) {\n    const h = readJ(store, HANDOFF_KEY);\n    try {\n      store.removeItem(HANDOFF_KEY);\n    } catch {\n    }\n    if (!h || h.v !== 1 || !h.plan || !Array.isArray(h.plan.units) || !h.plan.units.length) return null;\n    if (!(h.at > 0) || (now || Date.now()) - h.at > HANDOFF_MAX_MS) return null;\n    return h;\n  }\n\n  // v2/src/ui/kitchen-handoff.js\n  function createKitchenHandoff(ctx) {\n    const win2 = ctx.win, root = ctx.root;\n    let store = null;\n    try {\n      store = win2 && win2.localStorage;\n    } catch {\n      store = null;\n    }\n    if (!store || !ctx.act) return { sync() {\n    } };\n    let h = null;\n    try {\n      h = takeHandoff(store);\n    } catch {\n      h = null;\n    }\n    if (!h) return { sync() {\n    } };\n    const ready = ctx.account && ctx.account.ready && typeof ctx.account.ready.then === \"function\" ? ctx.account.ready : Promise.resolve();\n    const n = h.plan.units.length;\n    const quote = h.intent === \"quote\";\n    const open = () => {\n      const r = ctx.act(\"plan.open\", {\n        plan: h.plan,\n        meta: { reason: quote ? \"kitchen-quote\" : \"kitchen-basket\" },\n        cue: quote ? \"Your cabinet is open for a quote. Add your details and press Send enquiry below - we price made-to-order cabinets by hand. Your plan before is kept in this browser (File > Open).\" : \"Your kitchen basket is open: \" + n + \" cabinet\" + (n === 1 ? \"\" : \"s\") + \". Your plan before is kept in this browser (File > Open).\"\n      }) || {};\n      if (root) root.setAttribute(\"data-ub-kitchen-basket\", r.ok === false ? \"refused\" : quote ? \"quote\" : \"opened\");\n      if (r.ok !== false && quote) {\n        const m = win2.document && win2.document.querySelector(\"[data-ub-message]\");\n        const form = m && m.closest ? m.closest(\"form\") : null;\n        if (form || m) win2.setTimeout(() => {\n          try {\n            (form || m).scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n          } catch {\n          }\n        }, 600);\n      }\n      if (r.ok !== false && h.intent === \"checkout\" && root) {\n        const slot = root.querySelector(\"[data-ub-calc-order-slot]\") || root.querySelector(\"[data-ub-calc-slot]\");\n        if (slot && slot.scrollIntoView) win2.setTimeout(() => {\n          try {\n            slot.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n          } catch {\n          }\n        }, 600);\n      }\n      return r;\n    };\n    ready.then(open, open);\n    return { sync() {\n    }, handoff: () => h };\n  }\n\n  // v2/src/ui/fixing-preview.js\n  function createFixingPreview({ three: THREE, canvas, window: win2 }) {\n    const renderer = new THREE.WebGLRenderer({ canvas, antialias: true, alpha: true });\n    renderer.setPixelRatio(Math.min(2, win2 && win2.devicePixelRatio || 1));\n    const scene = new THREE.Scene();\n    scene.add(new THREE.HemisphereLight(16777215, 8952234, 1.1));\n    const sun = new THREE.DirectionalLight(16777215, 1.4);\n    sun.position.set(40, 60, 80);\n    scene.add(sun);\n    const camera = new THREE.PerspectiveCamera(30, 1, 1, 1e3);\n    const { pos, idx } = cabineoMesh();\n    const geo = new THREE.BufferGeometry();\n    geo.setAttribute(\"position\", new THREE.BufferAttribute(pos, 3));\n    geo.setIndex(new THREE.BufferAttribute(idx, 1));\n    geo.computeVertexNormals();\n    const b = CABINEO_MESH.bbox, c = [0, 1, 2].map((a) => (b.min[a] + b.max[a]) / 2);\n    const mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({ color: 13225169, metalness: 0.15, roughness: 0.55 }));\n    mesh.position.set(-c[0], -c[2], c[1]);\n    mesh.rotation.x = -Math.PI / 2;\n    const pivot = new THREE.Group();\n    pivot.add(mesh);\n    scene.add(pivot);\n    const st = { yaw: -0.6, pitch: 0.5, dist: 95, drag: null, frames: 0 };\n    function draw() {\n      const w = canvas.clientWidth || 260, h = canvas.clientHeight || 180;\n      renderer.setSize(w, h, false);\n      camera.aspect = w / h;\n      camera.updateProjectionMatrix();\n      camera.position.set(st.dist * Math.cos(st.pitch) * Math.sin(st.yaw), st.dist * Math.sin(st.pitch), st.dist * Math.cos(st.pitch) * Math.cos(st.yaw));\n      camera.lookAt(0, 0, 0);\n      renderer.render(scene, camera);\n      st.frames++;\n    }\n    const down = (e) => {\n      st.drag = { x: e.clientX, y: e.clientY };\n      if (canvas.setPointerCapture && e.pointerId != null) try {\n        canvas.setPointerCapture(e.pointerId);\n      } catch {\n      }\n    };\n    const move = (e) => {\n      if (!st.drag) return;\n      st.yaw -= (e.clientX - st.drag.x) * 0.01;\n      st.pitch = Math.max(-1.45, Math.min(1.45, st.pitch + (e.clientY - st.drag.y) * 0.01));\n      st.drag = { x: e.clientX, y: e.clientY };\n      draw();\n    };\n    const up = () => {\n      st.drag = null;\n    };\n    const wheel = (e) => {\n      e.preventDefault();\n      st.dist = Math.max(40, Math.min(250, st.dist * (e.deltaY > 0 ? 1.1 : 0.9)));\n      draw();\n    };\n    canvas.addEventListener(\"pointerdown\", down);\n    canvas.addEventListener(\"pointermove\", move);\n    canvas.addEventListener(\"pointerup\", up);\n    canvas.addEventListener(\"pointercancel\", up);\n    canvas.addEventListener(\"wheel\", wheel, { passive: false });\n    return {\n      show() {\n        draw();\n      },\n      turn(dx, dy) {\n        st.yaw += dx;\n        st.pitch = Math.max(-1.45, Math.min(1.45, st.pitch + dy));\n        draw();\n      },\n      state: () => ({ yaw: st.yaw, pitch: st.pitch, dist: st.dist, frames: st.frames, triangles: idx.length / 3 }),\n      dispose() {\n        canvas.removeEventListener(\"pointerdown\", down);\n        canvas.removeEventListener(\"pointermove\", move);\n        canvas.removeEventListener(\"pointerup\", up);\n        canvas.removeEventListener(\"pointercancel\", up);\n        canvas.removeEventListener(\"wheel\", wheel);\n        geo.dispose();\n        mesh.material.dispose();\n        renderer.dispose();\n      }\n    };\n  }\n\n  // v2/src/ui/ironmongery.js\n  function createIronmongery(ctx) {\n    if (editionOf(ctx.root) !== PRO) return {};\n    const doc2 = ctx.doc;\n    const folds = ctx.root.querySelector(\".ub-lab__sec--folds\");\n    if (!doc2 || !folds || !folds.parentNode) return {};\n    const el = (tag, cls, text) => {\n      const n = doc2.createElement(tag);\n      if (cls) n.className = cls;\n      if (text != null) n.textContent = text;\n      return n;\n    };\n    const sec = el(\"section\", \"ub-lab__sec ub-lab__sec--ironmongery\");\n    sec.setAttribute(\"data-ub-ironmongery\", \"\");\n    sec.appendChild(el(\"h3\", \"ub-lab__sechead\", \"Ironmongery\"));\n    const row = el(\"div\", \"ub-lab__optrow\");\n    row.setAttribute(\"role\", \"group\");\n    row.setAttribute(\"aria-label\", \"Fixings\");\n    row.appendChild(el(\"span\", \"ub-lab__optlabel\", \"Fixings\"));\n    const opts = el(\"div\", \"ub-lab__opts\");\n    const buttons = FIXINGS.map(([v, text]) => {\n      const b = el(\"button\", \"ub-lab__btn\", text);\n      b.type = \"button\";\n      b.setAttribute(\"data-ub-fixing\", v);\n      b.setAttribute(\"aria-pressed\", \"false\");\n      b.addEventListener(\"click\", () => ctx.act(\"unit.fixing\", { fixing: v }));\n      opts.appendChild(b);\n      return [v, b];\n    });\n    row.appendChild(opts);\n    sec.appendChild(row);\n    const note = el(\"p\", \"ub-lab__note\");\n    note.setAttribute(\"data-ub-fixing-note\", \"\");\n    note.setAttribute(\"aria-live\", \"polite\");\n    sec.appendChild(note);\n    const pending = el(\"ul\", \"ub-lab__note\");\n    pending.setAttribute(\"data-ub-fixing-pending\", \"\");\n    sec.appendChild(pending);\n    const prevBtn = el(\"button\", \"ub-lab__btn\", \"Cabineo 12 in 3D\");\n    prevBtn.type = \"button\";\n    prevBtn.setAttribute(\"data-ub-fixing-preview\", \"\");\n    prevBtn.setAttribute(\"aria-pressed\", \"false\");\n    const prevBox = el(\"div\", \"ub-lab__fixprev\");\n    prevBox.hidden = true;\n    prevBox.setAttribute(\"data-ub-fixing-previewbox\", \"\");\n    const prevCanvas = el(\"canvas\", \"ub-lab__fixprev-canvas\");\n    prevCanvas.setAttribute(\"aria-label\", \"Lamello Cabineo 12 in 3D - drag to turn it, wheel to zoom\");\n    prevCanvas.setAttribute(\"data-ub-fixing-canvas\", \"\");\n    const prevNote = el(\"p\", \"ub-lab__note\", \"Lamello's own 3D model (their published STEP file) - the connector itself, not the drilling. Drag to turn it, wheel to zoom.\");\n    prevNote.setAttribute(\"data-ub-fixing-previewnote\", \"\");\n    prevBox.appendChild(prevCanvas);\n    prevBox.appendChild(prevNote);\n    sec.appendChild(prevBtn);\n    sec.appendChild(prevBox);\n    let preview = null;\n    const three = () => {\n      try {\n        const R4 = ctx.root.__ubProj && ctx.root.__ubProj.__v2 && ctx.root.__ubProj.__v2.renderer && ctx.root.__ubProj.__v2.renderer();\n        const I = R4 && R4.inspect && R4.inspect();\n        return I && I.THREE ? I.THREE : null;\n      } catch {\n        return null;\n      }\n    };\n    prevBtn.addEventListener(\"click\", () => {\n      const on = prevBox.hidden;\n      prevBox.hidden = !on;\n      prevBtn.setAttribute(\"aria-pressed\", String(on));\n      if (!on) {\n        if (preview) {\n          preview.dispose();\n          preview = null;\n        }\n        return;\n      }\n      const T3 = three();\n      if (!T3) {\n        prevNote.textContent = \"The 3D view is not available on this device.\";\n        return;\n      }\n      try {\n        preview = createFixingPreview({ three: T3, canvas: prevCanvas, window: doc2.defaultView });\n        preview.show();\n      } catch {\n        preview = null;\n        prevNote.textContent = \"The 3D view could not start on this device.\";\n      }\n    });\n    const build3 = ctx.root.querySelector(\"[data-ub-build-settings]\");\n    if (build3 && build3.parentNode) build3.parentNode.insertBefore(sec, build3.nextSibling);\n    else folds.parentNode.insertBefore(sec, folds);\n    const sel = () => {\n      const sc = ctx.scene();\n      return (sc.units || []).find((u) => u.id === sc.selectedId) || null;\n    };\n    return {\n      sync() {\n        const u = sel(), f = fixingOf(u);\n        sec.hidden = !u;\n        for (const [v, b] of buttons) {\n          b.setAttribute(\"aria-pressed\", String(f.choice === v));\n          b.disabled = !u;\n        }\n        const text = !u ? \"\" : \"This cabinet: \" + f.label + \" - \" + f.ops + \".\";\n        if (note.textContent !== text) note.textContent = text;\n        pending.textContent = \"\";\n        f.pending.forEach((p) => pending.appendChild(el(\"li\", \"\", \"Open: \" + p)));\n        pending.hidden = !f.pending.length;\n      },\n      preview: () => preview ? preview.state() : null,\n      destroy() {\n        if (preview) {\n          preview.dispose();\n          preview = null;\n        }\n        if (sec.parentNode) sec.parentNode.removeChild(sec);\n      }\n    };\n  }\n\n  // v2/src/ui/parts.js\n  function partList() {\n    return [\n      [\"guides\", createGuides],\n      // frame first: old render() drew the guides before the size UI\n      [\"tray\", createLibraryTray],\n      // before docks: a flyout opens the tray\n      [\"thumbcut\", createThumbCutout],\n      // the catalogue pictures without their studio square (task 1791402649701)\n      [\"thumbzoom\", createThumbZoom],\n      // the bottom-menu thumbnails at 1.7x on hover, pointer-transparent (task 1791963905535)\n      [\"controls\", createControls],\n      [\"wand\", createWand],\n      [\"chef\", createChef],\n      // Chef on the storefront: quick phrases here, the narrow server helper for the rest (task 1791544612807)               // the magic wand and the kitchen score under the panel title (task 1791544612807)\n      [\"room\", createRoomEditor],\n      // Room setup: walls, floor, windows and doors (task 1790876476355)\n      [\"roomlayout\", createRoomLayoutEditor],\n      // Set room layout: the full-screen 2D outline editor (task 1791759626144)\n      [\"kitmat\", createKitchenMaterials],\n      // Kitchen materials & door styles, whole kitchen (task 1790895487998)\n      [\"railset\", createRailSettings],\n      [\"stripart\", createStripArt],\n      // miniature 3D part pictures in every bottom menu (task 1791402649701)\n      [\"bstrip\", createBottomStripState],\n      [\"show\", createShowKitchen],\n      [\"kmatprice\", createKmatPrice],\n      // the price line under the Carcass / Doors swatches, from the real quote (task 1791402649701)        // Show kitchen tour + Day / Evening light (task 1791402649701) // root.__ubBottomStrip() / --ub-bottom-strip-h for the camera reveal (task 1791402649701 / 1791223318552)    // left rail Settings: opens the whole kitchen materials tray (task 1791402649701)\n      [\"finish\", createFinishPopup],\n      [\"unitdel\", createUnitRemove],\n      // Remove on the selected cabinet itself, beside the finish button (task 1790952097733)\n      [\"fronts\", createFrontsPanel],\n      // Fronts / Drawers panels, Add complete or carcass only (task 1791045019714)\n      [\"gola\", createGolaPanel],\n      // Gola handleless profiles on the Fronts tray (task 1791235842445)\n      [\"drawerbox\", createDrawerBox],\n      // drawer box height: grab bar + number on the cabinet (task 1791045019714)\n      [\"glassdrag\", createGlassDrag],\n      // Glass sample dragged onto ONE cabinet, or pressed for the selected one (task 1791491928266)\n      [\"interiordrag\", createInteriorDrag],\n      // shelf / divider dragged in from the menu: ghosted fronts, orange board edges (task 1791222646469)\n      [\"endpanels\", createFinishingStrip],\n      // End panels strip: exposed run ends, panel on / off, height, material (task 1791235365921)\n      [\"worktop\", createWorktopPanel],\n      // the Worktop tray: Panelco EGGER worktops, overhangs, runs (task 1791478310196)\n      [\"splash\", createSplashPanel],\n      // the Splashback tray: glass colours or tiles (task 1791557195336)\n      [\"pfile\", createProjectFile],\n      [\"filemenu\", createFileMenu],\n      // File on the canvas top bar: New / Open / Save project, the same account + browser + file pieces (card 1792316430371)\n      [\"workshop\", createWorkshopPanel],\n      // Download / Open project file, behind ?projectfile=1 (card 1791542376600)\n      [\"binsp\", createBuildInspector],\n      // the build inspector pop-out: one cabinet, 3D, drawings, its cut-list parts (task 1791963906042)\n      [\"build\", createBuildSettings],\n      // pro edition only: Construction - top and bottom, the back (card 1791885434176)\n      [\"productionHardware\", createProductionHardware],\n      // pro-only, authoritative positions from the workshop\n      [\"ironmongery\", createIronmongery],\n      // pro edition only: Ironmongery - Fixings of the selected cabinet (task 1791963906042)\n      [\"cutouts\", createCutoutsEditor],\n      // pro edition only: bespoke cut-outs drawn on a carcass board (card 1792055030187)\n      [\"radial\", createRadialMenu],\n      // the four-mode radial menu on a background double-click (task 1790952562758)\n      [\"size\", createSizeOverlay],\n      [\"cabdims\", createCabDims],\n      // the selected cabinet's W / H / D as a drawing; All dimensions: every cabinet (task 1791223318552)\n      [\"docks\", createDocks],\n      [\"viewinset\", createViewInset],\n      // the top band the docks cover on a phone: the picture is framed below it (task 1791557195336)\n      [\"qaradial\", createQaRadial],\n      // preview stand only: ?qa_radial= evidence of the neutral double-click menu (task 1791223318552)\n      [\"qamenus\", createQaMenus],\n      // preview stand only: ?qa_menus= measured menu heights / gaps / opacities (task 1791402649701)\n      [\"kbasket\", createKitchenHandoff]\n      // a cabinet product page's basket opens here as a new plan, the plan before kept (task 1792963645529)\n    ];\n  }\n\n  // v2/src/ui/index.js\n  var CUE_MS = 7e3;\n  var NO_VIEW = Object.freeze({\n    worldToNdc() {\n      return null;\n    },\n    canvasSize() {\n      return { w: 600, h: 440 };\n    },\n    unitAABB() {\n      return null;\n    },\n    atMinDist() {\n      return false;\n    },\n    zoomInDisabled() {\n      return false;\n    },\n    clientToNdc() {\n      return [0, 0];\n    },\n    screenToFloor() {\n      return null;\n    },\n    liveRect() {\n      return null;\n    },\n    pickAt() {\n      return null;\n    },\n    requestRender() {\n    },\n    ZOOM,\n    // one set of zoom bounds (render/view-constants.js)\n    clampZoom(z) {\n      return z;\n    }\n  });\n  function createUi(root, opts) {\n    if (!root) return null;\n    const doc2 = opts.doc || root.ownerDocument, win2 = opts.win || doc2 && doc2.defaultView;\n    const config = opts.config || {};\n    let cueTimer = null;\n    const ctx = {\n      root,\n      doc: doc2,\n      win: win2,\n      config,\n      scene: opts.scene,\n      recovery: opts.recovery || null,\n      commands: opts.commands,\n      view: opts.view || NO_VIEW,\n      /* the one status line under the canvas (old cue() in 25-controls.js) */\n      cue(msg) {\n        const c = root.querySelector(\"[data-ub-cue]\");\n        if (c) {\n          c.textContent = msg || \"\";\n          c.style.display = msg ? \"\" : \"none\";\n        }\n        if (win2 && win2.clearTimeout) win2.clearTimeout(cueTimer);\n        if (c && msg && win2 && win2.setTimeout) {\n          cueTimer = win2.setTimeout(function() {\n            if (c.textContent === msg) {\n              c.textContent = \"\";\n              c.style.display = \"none\";\n            }\n          }, CUE_MS);\n        }\n      },\n      /* run a command, show what it says, bring every panel up to date, ask for a frame.\n         This is what every old handler did by hand: mutate; cue(...); syncControls(); refresh(). */\n      /* what an old handler did when it changed nothing: syncControls(); refresh() */\n      refresh() {\n        ui.syncControls();\n        ctx.view.requestRender();\n        ui.syncOut();\n      },\n      act(name2, args, what) {\n        const r = (ctx.commands && ctx.commands.run ? ctx.commands.run(name2, args || {}) : null) || {};\n        if (Object.prototype.hasOwnProperty.call(r, \"cue\")) ctx.cue(r.cue);\n        const w = what || {};\n        if (r.sync !== false && w.controls !== false) ui.syncControls();\n        if (r.render !== false && w.render !== false) ctx.view.requestRender();\n        if (r.sync !== false && w.out !== false) ui.syncOut();\n        return r;\n      }\n    };\n    const parts = {};\n    const PARTS = partList();\n    const header = config.stickyHeader === false ? null : tameStickyHeader(doc2, win2);\n    parts.estimate = createEstimatePanel(ctx, {\n      calculatorMain: config.calc !== false && ((config.calc || {}).priceMode || CALC_DEFAULTS.priceMode) === \"calculator-main\"\n    });\n    if (config.calc !== false) {\n      parts.calc = createCalculatorPanel(ctx, config.calc || {});\n      ctx.onPriced = () => parts.calc.onChange();\n    }\n    if (parts.calc && parts.calc.parts) ctx.planParts = () => parts.calc.parts();\n    if (config.account !== false) {\n      try {\n        parts.account = createAccount(ctx, config.account || {});\n        ctx.account = parts.account;\n        const priced = ctx.onPriced;\n        ctx.onPriced = () => {\n          if (priced) priced();\n          parts.account.onChange();\n        };\n      } catch (e) {\n        parts.account = null;\n      }\n    }\n    for (const [name2, make] of PARTS) parts[name2] = make(ctx, parts);\n    const head = config.stickyHeader === false ? null : watchHead(root, doc2, win2, () => ctx.view.requestRender());\n    const empty = () => !ctx.scene().units.length;\n    const stateFirst = () => {\n      if (opts.syncState) opts.syncState();\n    };\n    const ui = {\n      ctx,\n      parts,\n      cue: ctx.cue,\n      act: ctx.act,\n      /* the sidebar (old syncControls) and then the price panel (old syncOut) */\n      sync() {\n        stateFirst();\n        if (empty()) return;\n        for (const [name2] of PARTS) if (parts[name2].sync) parts[name2].sync();\n        parts.estimate.sync();\n      },\n      /* o.noState \u2014 \u0432\u044B\u0437\u043E\u0432 \u0438\u0437 \u0441\u043B\u043E\u044F \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F (\u0435\u0433\u043E onChange): \u0442\u0430\u043C syncState \u0443\u0436\u0435 \u043E\u0442\u0440\u0430\u0431\u043E\u0442\u0430\u043B\n         \u0442\u0430\u043C, \u0433\u0434\u0435 \u0435\u0433\u043E \u0437\u0432\u0430\u043B \u0441\u0442\u0430\u0440\u044B\u0439 \u043A\u043E\u0434, \u0430 \u043F\u043E\u0441\u0440\u0435\u0434\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u044B (\u0437\u0430\u043F\u0438\u0441\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u0438) \u043E\u043D \u0441\u0434\u0432\u0438\u043D\u0443\u043B \u0431\u044B\n         \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0440\u0430\u043D\u044C\u0448\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 (\u0431\u0440\u043E\u0441\u043E\u043A L-\u0443\u0433\u043B\u0430: activeRun \u00ABreturn\u00BB \u043F\u0435\u0440\u0435\u0442\u0438\u0440\u0430\u043B\u0441\u044F \u0431\u044B u.run) */\n      syncControls(o) {\n        if (!(o && o.noState)) stateFirst();\n        if (empty()) return;\n        for (const [name2] of PARTS) if (parts[name2].sync) parts[name2].sync();\n      },\n      syncOut() {\n        if (!empty()) parts.estimate.sync();\n      },\n      /* camera-bound overlays, after every frame */\n      frame() {\n        for (const [name2] of PARTS) if (parts[name2].frame) parts[name2].frame();\n      },\n      destroy() {\n        if (header) header.stop();\n        if (head) head.stop();\n        for (const [name2] of PARTS) if (parts[name2].destroy) parts[name2].destroy();\n      }\n    };\n    return ui;\n  }\n\n  // v2/src/ui/surface.js\n  var legacyExports3 = {\n    measureHead: function(root) {\n      return measureHead(root, globalThis.document, globalThis.window);\n    },\n    tameStickyHeader: function() {\n      const r = tameStickyHeader(globalThis.document, globalThis.window);\n      return r ? r.header : null;\n    }\n  };\n  function attach3(ctx) {\n    const inst = ctx.inst, root = ctx.root, canvas = ctx.canvas;\n    const U = { ui: null };\n    const fire = (el2, type, ev) => {\n      if (!el2) return;\n      if (typeof el2.fire === \"function\") el2.fire(type, ev || {});\n      else el2.dispatchEvent(Object.assign(new ctx.win.Event(type, { bubbles: true, cancelable: true }), ev || {}));\n    };\n    const view = {\n      worldToNdc: (p) => inst.worldToNdc ? inst.worldToNdc(p) : null,\n      worldClipZ: (p) => inst.worldClipZ ? inst.worldClipZ(p) : null,\n      // depth: a point behind the eye is not drawn (ui/cab-dims.js)\n      canvasSize: () => ({ w: canvas && canvas.clientWidth || 600, h: canvas && canvas.clientHeight || 440 }),\n      unitAABB: (u) => inst.unitAABB ? inst.unitAABB(u) : null,\n      atMinDist: () => !!(inst.atMinDist && inst.atMinDist()),\n      /* the + button's own stop (interact/view.js zoomButtons, 05.10.2026): it holds the middle of the view and stops\n         VIEW_MIN_MM from it, or earlier on plain board - the camera's clearance alone is the wheel's limit */\n      zoomInDisabled: () => {\n        const ia = inst.interaction;\n        try {\n          return !!(ia && ia.view && ia.view.zoomButtons && ia.view.zoomButtons().inDisabled);\n        } catch {\n          return false;\n        }\n      },\n      liveRect: () => inst.liveRect ? inst.liveRect() : null,\n      clientToNdc: (cx, cy) => {\n        const r = view.liveRect();\n        if (!r) return [0, 0];\n        return [(cx - r.left) / r.width * 2 - 1, -((cy - r.top) / r.height * 2 - 1)];\n      },\n      screenToFloor: (nx, ny, y) => inst.screenToFloor ? inst.screenToFloor(nx, ny, y) : null,\n      /* the cabinet under a page point - the interaction layer's own pick (the boxes a click selects); the action\n         badges follow it (badge-hover.js, task 1791047272722) */\n      pickAt: (cx, cy) => {\n        const ia = inst.interaction;\n        try {\n          return ia && ia.pointer && ia.pointer.pickAt ? ia.pointer.pickAt(cx, cy) : null;\n        } catch {\n          return null;\n        }\n      },\n      /* the orange size arrows as drawn this frame (interaction layer, canvas pixels) - the size\n         numbers are laid out round them (ui/size-labels.js) */\n      sizeArrows: () => {\n        const ia = inst.interaction;\n        if (!ia || !ia.handles || !ia.handles.layout) return [];\n        try {\n          return ia.handles.layout().filter((it) => it.visible && it.kind === \"size\");\n        } catch {\n          return [];\n        }\n      },\n      /* a frame, then everything that hangs on the camera. The renderer also calls\n         inst.afterFrame after frames it draws on its own (orbit, zoom). */\n      requestRender: () => {\n        if (inst.render) {\n          try {\n            inst.render();\n          } catch {\n          }\n        }\n        if (U.ui) U.ui.frame();\n      },\n      ZOOM,\n      clampZoom\n    };\n    const syncState = () => {\n      const ia = inst.interaction;\n      if (ia && ia.ctx && ia.ctx.syncState) ia.ctx.syncState();\n    };\n    const recovery = inst.interaction && inst.interaction.persist ? inst.interaction.persist.recovery || null : null;\n    const ui = createUi(root, {\n      scene: () => ctx.scene,\n      commands: inst.commands || null,\n      view,\n      syncState,\n      recovery,\n      doc: ctx.doc,\n      win: ctx.win,\n      config: configOf(root)\n    });\n    U.ui = ui;\n    inst.afterFrame = () => ui.frame();\n    ui.syncControls();\n    syncRoom(ctx.scene.units);\n    if (inst.update) {\n      try {\n        inst.update();\n      } catch {\n      }\n    }\n    view.requestRender();\n    ui.syncOut();\n    const size3 = ui.parts.size;\n    const el = (k) => {\n      const e = size3.els();\n      return e && e[k] ? e[k] : null;\n    };\n    return {\n      syncControls: () => ui.syncControls(),\n      specText: () => specText(ctx.scene.units),\n      setMode: (m) => ui.act(\"view.mode\", { mode: m }),\n      /* the popup is gone: exact entry is the on-cabinet number, so this now routes to\n         that same commit path */\n      commitPmm: (v) => ui.act(\"unit.resize\", { k: \"w\", raw: v }).ok !== false,\n      pmmVisible: () => false,\n      dimText: (k) => {\n        const e = el(k);\n        return e && e.num ? e.num.textContent : null;\n      },\n      dimEditing: (k) => {\n        const e = el(k);\n        return !!e && !!e.inp && e.inp.getAttribute(\"hidden\") === null;\n      },\n      dimClick: (k) => {\n        const e = el(k);\n        if (!e || !e.num) return false;\n        fire(e.num, \"click\", { preventDefault() {\n        }, stopPropagation() {\n        } });\n        return true;\n      },\n      dimType: (k, v) => {\n        const e = el(k);\n        if (!e || !e.inp) return false;\n        e.inp.value = String(v);\n        return true;\n      },\n      dimKey: (k, key) => {\n        const e = el(k);\n        if (!e || !e.inp) return false;\n        fire(e.inp, \"keydown\", { key, preventDefault() {\n        }, stopPropagation() {\n        } });\n        return true;\n      },\n      dimBlur: (k) => {\n        const e = el(k);\n        if (!e || !e.inp) return false;\n        fire(e.inp, \"blur\", {});\n        return true;\n      },\n      partInfo: () => {\n        const p = root.querySelector(\"[data-ub-partinfo]\");\n        return p ? p.textContent : \"\";\n      },\n      sizeHint: () => {\n        const h = size3.hint();\n        return h && h.style.display !== \"none\" ? h.textContent || \"\" : \"\";\n      },\n      sizeFields: () => size3.fields(),\n      /* the sizing control is the ARROW (interaction layer); the number, the input and\n         the lines are the interface's. inst.arrowFor, when the interaction layer gives\n         it, hands back the arrows exactly as the old sizeEl did in Size mode. */\n      sizeEl: (k) => {\n        const e = el(k);\n        if (!e) return null;\n        if (ctx.scene.sizeMode && inst.arrowFor)\n          return { k: e.k, val: e.val, num: e.num, inp: e.inp, wrap: e.wrap, grip: inst.arrowFor(k, \"hi\"), grip0: inst.arrowFor(k, \"lo\") };\n        return e;\n      },\n      sizeSpecs: sizeSpecs2,\n      sizeSpecs2: (u) => sizeSpecs2(u),\n      /* service, not on __ubProj: the whole interface object */\n      ui\n    };\n  }\n\n  // v2/src/api/layers.js\n  function layer(name2, ns) {\n    const present = !!ns && (typeof ns.attach === \"function\" || !!ns.legacyExports);\n    return {\n      name: name2,\n      present,\n      legacyExports: ns && ns.legacyExports || {},\n      attach: present && typeof ns.attach === \"function\" ? ns.attach : null\n    };\n  }\n  var cache2 = { layers: null };\n  function loadLayers() {\n    if (!cache2.layers) cache2.layers = [layer(\"render\", surface_exports), layer(\"interact\", surface_exports2), layer(\"ui\", surface_exports3)];\n    return cache2.layers;\n  }\n\n  // v2/src/api/names.js\n  var LEGACY_EXPORTS = [\n    \"buildMeshData\",\n    \"buildParts\",\n    \"estimate\",\n    \"MET\",\n    \"HINGE\",\n    \"snapUnit\",\n    \"snapDim\",\n    \"placeNew\",\n    \"sceneFrame\",\n    \"newUnit\",\n    \"overlaps\",\n    \"drawerParts\",\n    \"SNAP\",\n    \"ZOOM\",\n    \"clampZoom\",\n    \"FIT_PAD\",\n    \"FOVY\",\n    \"PRICING\",\n    \"MATERIALS\",\n    \"boardAreaSplit\",\n    \"edgeMetres\",\n    \"drawer4Parts\",\n    \"buildParts4\",\n    \"edgeMetres4\",\n    \"DRW4\",\n    \"cornerLegCentres\",\n    \"cornerLegWorld\",\n    \"cornerDoorSlabs\",\n    \"swingXf\",\n    \"composeXf\",\n    \"DOOR_OPEN_DEG\",\n    \"cornerLParts\",\n    \"cornerBlindParts\",\n    \"cornerLDoors\",\n    \"cornerBlindDoor\",\n    \"blindSplit\",\n    \"CORNER\",\n    \"islandBayW\",\n    \"islandBayD\",\n    \"islandBayKinds\",\n    \"cornerCanTransfer\",\n    \"cornerAtRoomCorner\",\n    \"roomCornerSeatedBy\",\n    \"cabinetParts\",\n    \"openFrontParts\",\n    \"openFrontBox\",\n    \"doorSwingRad\",\n    \"partById\",\n    \"pickPartIn\",\n    \"system32Snap\",\n    \"hDivDragTo\",\n    \"partReadout\",\n    \"shelfListOf\",\n    \"legacyShelfYs\",\n    \"materialiseShelves\",\n    \"shelfAdd\",\n    \"shelfMoveTo\",\n    \"shelfRemove\",\n    \"shelfCellKey\",\n    \"shelvesPerCell\",\n    \"cloneShelfList\",\n    \"shelfRangeIn\",\n    \"validateShelfList\",\n    \"reconcileShelfCount\",\n    \"nextShelfId\",\n    \"editHandles\",\n    \"vDivDragTo\",\n    \"handleInset\",\n    \"emitContactShadows\",\n    \"SHADOW_STEPS\",\n    \"xrayOn\",\n    \"xrayActive\",\n    \"xraySplit\",\n    \"VS\",\n    \"FS\",\n    \"partWorldBox\",\n    \"carcassPartsFor\",\n    \"partMaterialOf\",\n    \"PART_KIND_LABEL\",\n    \"seatCornerAutomatically\",\n    \"seatAtInferredCorner\",\n    \"fitCornerArms\",\n    \"cornerArmMin\",\n    \"cornerArmsFit\",\n    \"resizeFromEdge\",\n    \"resizeClamp\",\n    \"resizeBase\",\n    \"resizeSnap\",\n    \"resizeSnapTargets\",\n    \"RESIZE_SNAP\",\n    \"inheritRunDims\",\n    \"runDonorFor\",\n    \"runInheritCue\",\n    \"runInheritEligible\",\n    \"resizeLegal\",\n    \"resizeApply\",\n    \"gapOffer\",\n    \"gapBeside\",\n    \"gapFillExtend\",\n    \"gapFillShare\",\n    \"gapRunOf\",\n    \"gapEligible\",\n    \"gapContiguousRun\",\n    \"attachToRoomWall\",\n    \"wallsByDistance\",\n    \"WALL_ROT\",\n    \"hugCornerOf\",\n    \"hugPointOf\",\n    \"seatSharingCorner\",\n    \"cornerDestinations\",\n    \"nearestRoomCorner\",\n    \"cornerTransferPreview\",\n    \"roomOn\",\n    \"roomSize\",\n    \"roomWallList\",\n    \"roomCorners\",\n    \"roomWalls\",\n    \"ROOM_LIMITS\",\n    \"upperLowerGuides\",\n    \"ulSnapAlong\",\n    \"ulTier\",\n    \"ulEdges\",\n    \"ulWallKey\",\n    \"UL_TOL\",\n    \"UL_SNAP\",\n    \"runTier\",\n    \"runElevation\",\n    \"runMembers\",\n    \"runSibling\",\n    \"runRange\",\n    \"runValue\",\n    \"applyRunDim\",\n    \"runDepthBlock\",\n    \"RUN_GAP\",\n    \"finishingOf\",\n    \"finishingParts\",\n    \"finishingWhy\",\n    \"canFinishing\",\n    \"finishingReach\",\n    \"overallWidth\",\n    \"finishingExtras\",\n    \"finishingText\",\n    \"withFinishing\",\n    \"hasFinishing\",\n    \"FINISH_KIT\",\n    \"baselineShelves\",\n    \"stripStockShelves\",\n    \"maxShelvesFor\",\n    \"interiorOf\",\n    \"bands\",\n    \"cells\",\n    \"cellsAcross\",\n    \"interiorCounts\",\n    \"hDividerRange\",\n    \"canAddHDivider\",\n    \"interiorParts\",\n    \"interiorBounds\",\n    \"interiorWhy\",\n    \"canInterior\",\n    \"canAddDivider\",\n    \"compartments\",\n    \"interiorExtras\",\n    \"interiorText\",\n    \"dividerRange\",\n    \"INTERIOR\",\n    \"withInterior\",\n    \"isTall\",\n    \"isHousing\",\n    \"tallParts\",\n    \"tallLeaves\",\n    \"tallShelves\",\n    \"tallProvisos\",\n    \"ovenNiche\",\n    \"fridgeSplitY\",\n    \"TALL\",\n    \"sameLevel\",\n    \"vSpan\",\n    \"islandAisle\",\n    \"islandBayList\",\n    \"islandBodyW\",\n    \"islandSync\",\n    \"islandBayWidths\",\n    \"ISLAND_BAY_LIMITS\",\n    \"islandBays\",\n    \"islandSkinParts\",\n    \"isIsland\",\n    \"ISLAND\",\n    \"footBoxes\",\n    \"foot\",\n    \"planXf\",\n    \"cornerEnvelope\",\n    \"armA\",\n    \"armB\",\n    \"unitEnvelope\",\n    \"unitXf\",\n    \"emitDiscXf\",\n    \"hingePoints\",\n    \"moveClamped\",\n    \"blockedAt\",\n    \"turnUnit\",\n    \"flipUnit\",\n    \"levelKey\",\n    \"alignCues\",\n    \"alignGroups\",\n    \"frontFaces\",\n    \"facesJoin\",\n    \"frontSnap\",\n    \"validCues\",\n    \"frontPlane\",\n    \"topY\",\n    \"nearbyUnits\",\n    \"ALIGN\",\n    \"cueText\",\n    \"connectedRun\",\n    \"runExtent\",\n    \"adjoinGap\",\n    \"ROOM\",\n    \"behindWall\",\n    \"wallPush\",\n    \"retWall\",\n    \"syncRoom\",\n    \"pushIntoRoom\",\n    \"protrusion\",\n    \"placeReturn\",\n    \"returnRot\",\n    \"revalidateRoom\",\n    \"MAIN_WALL\",\n    \"sceneValid\",\n    \"atomicRoomOp\",\n    \"measureHead\",\n    \"tameStickyHeader\",\n    \"effCarcass\",\n    \"effFronts\",\n    \"isCustom\",\n    \"resolveFinishes\",\n    \"migrateFinishes\",\n    \"applySpread\",\n    \"runRot\",\n    \"orientForRun\",\n    \"flushToRun\",\n    \"isCornerUnit\",\n    \"runWallDist\",\n    \"decideAttach\",\n    \"wallFlushOf\",\n    \"placeAlongWall\",\n    \"placeByAnchor\",\n    \"sideContacts\",\n    \"priceKey\",\n    \"typeName\",\n    \"unitLabel\",\n    \"nudgeClear\",\n    \"swapUnits\",\n    \"relayoutRow\",\n    \"rowNeighbour\",\n    \"rowGroup\",\n    \"wallParts\",\n    \"WALL\",\n    \"sleep\",\n    \"wake\",\n    \"glLost\",\n    \"glAsleep\"\n  ];\n  var EXPORT_LAYER = {\n    ZOOM: \"view\",\n    clampZoom: \"view\",\n    FIT_PAD: \"view\",\n    FOVY: \"view\",\n    buildMeshData: \"render\",\n    MET: \"render\",\n    HINGE: \"render\",\n    sceneFrame: \"render\",\n    emitContactShadows: \"render\",\n    SHADOW_STEPS: \"render\",\n    xrayOn: \"render\",\n    xrayActive: \"render\",\n    xraySplit: \"render\",\n    emitDiscXf: \"render\",\n    hingePoints: \"render\",\n    VS: \"render\",\n    FS: \"render\",\n    measureHead: \"ui\",\n    tameStickyHeader: \"ui\",\n    sleep: \"api\",\n    wake: \"api\",\n    glLost: \"api\",\n    glAsleep: \"api\"\n  };\n  var INSTANCE_API = {\n    sleep: \"api\",\n    wake: \"api\",\n    glLost: \"api\",\n    glAsleep: \"api\",\n    screenToFloor: \"render\",\n    screenToWall: \"render\",\n    worldToNdc: \"render\",\n    worldClipZ: \"render\",\n    screenToPlane: \"render\",\n    wallPlaneFor: \"interact\",\n    runAxisFor: \"interact\",\n    placeWallAlong: \"interact\",\n    pickNdc: \"interact\",\n    unitAABB: \"render\",\n    sceneRef: \"api\",\n    pickDebug: \"interact\",\n    setCam: \"render\",\n    holdCamera: \"render\",\n    releaseCamera: \"render\",\n    nudgeLimit: \"interact\",\n    nudge: \"interact\",\n    undo: \"interact\",\n    redo: \"interact\",\n    partAt: \"interact\",\n    handles: \"interact\",\n    shownHandles: \"interact\",\n    handleNode: \"interact\",\n    handleLabel: \"interact\",\n    handleVisible: \"interact\",\n    handleSize: \"interact\",\n    handleAt: \"interact\",\n    activeHandle: \"interact\",\n    startHandleDrag: \"interact\",\n    mmToPx: \"interact\",\n    cancelHandleDrag: \"interact\",\n    cancelPartDrag: \"interact\",\n    setActiveHandle: \"interact\",\n    commitPmm: \"ui\",\n    pmmVisible: \"ui\",\n    dimText: \"ui\",\n    dimEditing: \"ui\",\n    dimClick: \"ui\",\n    dimType: \"ui\",\n    dimKey: \"ui\",\n    dimBlur: \"ui\",\n    drawPartHandles: \"interact\",\n    eye: \"render\",\n    renderStats: \"render\",\n    resetStats: \"render\",\n    hoverPart: \"interact\",\n    selPart: \"interact\",\n    setSelPart: \"interact\",\n    partInfo: \"ui\",\n    commitShelfMm: \"interact\",\n    removeSelectedShelf: \"interact\",\n    selectedCellKey: \"interact\",\n    canUndo: \"interact\",\n    canRedo: \"interact\",\n    histDepth: \"interact\",\n    histLabels: \"interact\",\n    histBegin: \"interact\",\n    histCommit: \"interact\",\n    nudgeArrows: \"interact\",\n    nudgeEl: \"interact\",\n    sizeHint: \"ui\",\n    render: \"render\",\n    camHeld: \"render\",\n    cam: \"render\",\n    camEye: \"render\",\n    atMinDist: \"render\",\n    setZoom: \"render\",\n    refit: \"render\",\n    dropUnit: \"interact\",\n    sizeFields: \"ui\",\n    sizeEl: \"ui\",\n    dragLog: \"interact\",\n    dragLogSet: \"interact\",\n    sizeSpecs2: \"ui\",\n    unitPickBoxes: \"interact\",\n    pickAtClient: \"interact\",\n    liveRect: \"render\",\n    applyDim: \"interact\",\n    dimLimits: \"interact\",\n    sizeSpecs: \"ui\",\n    setMode: \"ui\",\n    resize: \"render\",\n    specText: \"ui\",\n    syncControls: \"ui\",\n    ZOOM: \"view\",\n    sceneFrame: \"render\"\n  };\n  function exportLayer(name2) {\n    return EXPORT_LAYER[name2] || \"model\";\n  }\n\n  // v2/src/api/legacy-exports.js\n  function buildLegacyExports(layers, lifecycle2) {\n    const bySource = { model: model_exports, view: view_constants_exports, api: lifecycle2 };\n    for (const L of layers) bySource[L.name] = L.legacyExports;\n    const out = {}, linked = [], waiting = [];\n    for (const name2 of LEGACY_EXPORTS) {\n      const layerName = exportLayer(name2);\n      const src = bySource[layerName];\n      if (src && name2 in src) {\n        out[name2] = src[name2];\n        linked.push(name2);\n      } else waiting.push({ name: name2, layer: layerName });\n    }\n    Object.defineProperty(out, \"__v2\", {\n      enumerable: false,\n      value: {\n        engine: \"v2\",\n        linked: linked.length,\n        total: LEGACY_EXPORTS.length,\n        waiting,\n        layers: layers.map((L) => ({ name: L.name, present: L.present }))\n      }\n    });\n    return out;\n  }\n\n  // v2/src/api/version-guard.js\n  var TRIED = \"ub-cabinet-lab:v2-reloaded-to\";\n  var API3 = \"https://chat.uniboards.co.uk/api/cabinet-lab/version\";\n  var HOSTS = /(^|\\.)uniboards\\.co\\.uk$|\\.myshopify\\.com$/;\n  function installVersionGuard(win2, el) {\n    if (!win2 || !el || typeof win2.fetch !== \"function\" || !win2.location) return null;\n    const mine = el.getAttribute && el.getAttribute(\"data-ub-build\");\n    if (!mine || /__UB/.test(mine)) return null;\n    if (!HOSTS.test(String(win2.location.hostname || \"\"))) return null;\n    const doc2 = win2.document;\n    let busy = false, last = 0, banner = null;\n    const used = () => !!(el.classList && el.classList.contains(\"ub-lab--used\"));\n    const store = (k, v) => {\n      try {\n        if (v === void 0) return win2.sessionStorage.getItem(k);\n        win2.sessionStorage.setItem(k, v);\n      } catch {\n        return null;\n      }\n      return null;\n    };\n    function goTo(live) {\n      const u = new win2.URL(win2.location.href);\n      u.searchParams.set(\"ubv\", live);\n      win2.location.replace(u.toString());\n    }\n    function showBanner(live) {\n      if (banner || !doc2) return;\n      banner = doc2.createElement(\"div\");\n      banner.className = \"ub-lab__update\";\n      banner.setAttribute(\"role\", \"status\");\n      const t = doc2.createElement(\"span\");\n      t.textContent = \"A newer version of the planner is available.\";\n      const go = doc2.createElement(\"button\");\n      go.type = \"button\";\n      go.className = \"ub-lab__btn ub-lab__cta\";\n      go.textContent = \"Reload\";\n      go.addEventListener(\"click\", function() {\n        goTo(live);\n      });\n      const later = doc2.createElement(\"button\");\n      later.type = \"button\";\n      later.className = \"ub-lab__btn\";\n      later.textContent = \"Later\";\n      later.addEventListener(\"click\", function() {\n        banner.remove();\n      });\n      banner.appendChild(t);\n      banner.appendChild(go);\n      banner.appendChild(later);\n      el.insertBefore(banner, el.firstChild);\n    }\n    function check(firstLoad) {\n      if (busy) return null;\n      busy = true;\n      last = Date.now();\n      return win2.fetch(API3 + \"?t=\" + last, { cache: \"no-store\", credentials: \"omit\" }).then(function(r) {\n        return r && r.ok ? r.json() : null;\n      }).then(function(j) {\n        busy = false;\n        const live = j && j.build;\n        if (!live || live === mine) return \"current\";\n        if (firstLoad && !used() && store(TRIED) !== live) {\n          store(TRIED, live);\n          goTo(live);\n          return \"reloaded\";\n        }\n        showBanner(live);\n        return \"banner\";\n      }, function() {\n        busy = false;\n        return \"unreachable\";\n      });\n    }\n    if (doc2 && doc2.addEventListener) {\n      doc2.addEventListener(\"visibilitychange\", function() {\n        if (!doc2.hidden && Date.now() - last > 6e4) check(false);\n      });\n    }\n    return { check, first: check(true), banner: () => banner };\n  }\n\n  // v2/src/api/scene-state.js\n  var LS_KEY2 = \"ub-cabinet-lab:v1\";\n  function createScene() {\n    return useScene({\n      units: [],\n      selectedId: null,\n      explode: 0,\n      hinge: false,\n      hingeZoom: false,\n      moveMode: false,\n      panMode: false,\n      sizeMode: false,\n      panX: 0,\n      panY: 0,\n      cues: null,\n      snap: true,\n      alignView: false,\n      alignTemp: false,\n      room: { on: false, width: 3600, depth: 3e3 },\n      kitchen: { carcass: \"white\", fronts: \"white\" },\n      frame: null,\n      zoom: 1,\n      activeRun: \"main\",\n      yaw: DEFAULTS.yaw,\n      pitch: DEFAULTS.pitch,\n      /* Keys the old init added next, in its order: buildDocks (flyout, eyeOpen), then the\n         first syncControls (_lastSel), then the opening view (fitWide, render). The\n         interface writes the first three and the renderer the last, but the renderer is\n         attached FIRST - so the order of the old scene is kept by naming them here\n         (the interface sets their values; api-names.mjs checks the order). */\n      flyout: null,\n      eyeOpen: false,\n      _lastSel: null\n    });\n  }\n  function initialScene(scene, frameOf3) {\n    setUid(1);\n    const a = newUnit(\"base\");\n    a.x = 0;\n    a.door = true;\n    const b = newUnit(\"base-drawer\");\n    b.x = a.w;\n    b.z = a.z;\n    b.door = true;\n    scene.units = [a, b];\n    scene.selectedId = a.id;\n    migrateFinishes(scene.units, scene.kitchen);\n    scene.frame = frameOf3 ? frameOf3(scene.units) : null;\n  }\n  function migrateRoom(scene) {\n    const r = scene.room;\n    if (r && r.on && r.width && r.depth) {\n      if (!r.height) r.height = ROOM_DEFAULT.height;\n      return false;\n    }\n    let needW = 0, needD = 0, needH = 0;\n    for (const v of scene.units) {\n      const fb = foot(v);\n      needW = Math.max(needW, fb.x1);\n      needD = Math.max(needD, fb.z1);\n      needH = Math.max(needH, (v.y || 0) + v.h);\n    }\n    scene.room = {\n      on: true,\n      width: clamp4(\n        Math.max(r && r.width || 0, Math.ceil((needW + 600) / 100) * 100),\n        ROOM_LIMITS.width[0],\n        ROOM_LIMITS.width[1]\n      ),\n      depth: clamp4(\n        Math.max(r && r.depth || 0, Math.ceil((needD + 900) / 100) * 100),\n        ROOM_LIMITS.depth[0],\n        ROOM_LIMITS.depth[1]\n      ),\n      height: clamp4(Math.max(\n        r && r.height || 0,\n        Math.ceil((needH + 300) / 100) * 100,\n        ROOM_DEFAULT.height\n      ), ROOM_LIMITS.height[0], ROOM_LIMITS.height[1])\n    };\n    return true;\n  }\n  function createPlanStore(scene, getStorage, frameOf3, currentUid) {\n    function store() {\n      try {\n        return getStorage() || null;\n      } catch {\n        return null;\n      }\n    }\n    function saveState2() {\n      const s = store();\n      if (!s) return false;\n      try {\n        const now = /* @__PURE__ */ new Date();\n        s.setItem(LS_KEY2, JSON.stringify({\n          v: 1,\n          uid: currentUid(),\n          units: scene.units,\n          // every field, verbatim\n          room: scene.room || null,\n          kitchen: scene.kitchen || null,\n          activeRun: scene.activeRun || \"main\",\n          selectedId: scene.selectedId || null,\n          n: scene.units.length,\n          when: now.toLocaleString(\"en-GB\", { hour12: false })\n        }));\n        return true;\n      } catch {\n        return false;\n      }\n    }\n    function clearState() {\n      const s = store();\n      if (s) {\n        try {\n          s.removeItem(LS_KEY2);\n        } catch {\n        }\n      }\n    }\n    function loadState2() {\n      var _a, _b;\n      const s = store();\n      if (!s) return false;\n      let raw;\n      try {\n        raw = s.getItem(LS_KEY2);\n      } catch {\n        return false;\n      }\n      if (!raw) return false;\n      try {\n        const d = JSON.parse(raw);\n        if ((d == null ? void 0 : d.workshop) || ((_b = (_a = d == null ? void 0 : d.units) == null ? void 0 : _a.some) == null ? void 0 : _b.call(_a, (u) => (u == null ? void 0 : u.type) === \"workshop\"))) return false;\n        if (!d || d.v !== 1 || !d.units || !d.units.length) return false;\n        for (let i = 0; i < d.units.length; i++) {\n          const u = d.units[i];\n          if (!u || typeof u.type !== \"string\" || !isFinite(u.w) || !isFinite(u.h)) return false;\n        }\n        scene.units = d.units;\n        scene.room = d.room || null;\n        if (d.kitchen) scene.kitchen = d.kitchen;\n        scene.activeRun = d.activeRun || \"main\";\n        scene.selectedId = d.selectedId || scene.units[0].id;\n        let maxId = 0;\n        for (const v of scene.units) {\n          const n = parseInt(String(v.id).replace(/\\D/g, \"\"), 10);\n          if (isFinite(n)) maxId = Math.max(maxId, n);\n        }\n        setUid(Math.max(d.uid || 0, maxId) + 0);\n        migrateFinishes(scene.units, scene.kitchen);\n        migrateRoom(scene);\n        syncRoom(scene.units);\n        scene.frame = frameOf3 ? frameOf3(scene.units) : null;\n        return true;\n      } catch {\n        return false;\n      }\n    }\n    return { saveState: saveState2, loadState: loadState2, clearState, key: LS_KEY2 };\n  }\n\n  // v2/src/api/instance.js\n  function createInstance(root, env2, layers) {\n    const win2 = env2.win, doc2 = env2.doc;\n    const canvas = root.querySelector(\".ub-lab__canvas\");\n    const renderLayer = layers.filter((L) => L.name === \"render\")[0];\n    const frameOf3 = renderLayer && renderLayer.legacyExports.sceneFrame || null;\n    const scene = createScene();\n    initialScene(scene, frameOf3);\n    migrateRoom(scene);\n    const store = createPlanStore(scene, () => win2 && win2.localStorage, frameOf3, () => UID);\n    const inst = { sceneRef: () => scene, store };\n    const errors = [];\n    const ctx = { root, canvas, scene, inst, store, frameOf: frameOf3, win: win2, doc: doc2, three: env2.three || null };\n    for (const L of layers) {\n      if (!L.attach) continue;\n      try {\n        Object.assign(inst, L.attach(ctx) || {});\n      } catch (e) {\n        errors.push({ layer: L.name, message: String(e && e.message || e) });\n        try {\n          env2.console.error(\"Cabinet Lab v2: \\u0441\\u043B\\u043E\\u0439 \" + L.name + \" \\u043D\\u0435 \\u0437\\u0430\\u043F\\u0443\\u0441\\u0442\\u0438\\u043B\\u0441\\u044F\", e);\n        } catch {\n        }\n      }\n    }\n    const glLost = () => !!(inst.contextLost && inst.contextLost());\n    const life = {\n      sleep: function() {\n      },\n      wake: function() {\n        if (!glLost() && inst.render) {\n          try {\n            inst.render();\n          } catch {\n          }\n        }\n      },\n      glLost,\n      glAsleep: function() {\n        return false;\n      },\n      sceneRef: inst.sceneRef\n    };\n    const proj = {}, waiting = [];\n    for (const name2 of Object.keys(INSTANCE_API)) {\n      const layer2 = INSTANCE_API[name2];\n      if (layer2 === \"api\") proj[name2] = life[name2];\n      else if (name2 === \"ZOOM\") proj[name2] = ZOOM;\n      else if (name2 === \"sceneFrame\" && frameOf3) proj[name2] = frameOf3;\n      else if (name2 in inst) proj[name2] = inst[name2];\n      else waiting.push({ name: name2, layer: layer2 });\n    }\n    Object.defineProperty(proj, \"__v2\", {\n      enumerable: false,\n      value: {\n        engine: \"v2\",\n        waiting,\n        errors,\n        layers: layers.map((L) => ({ name: L.name, present: L.present })),\n        /* \u043E\u0431\u044A\u0435\u043A\u0442 \u0440\u0435\u043D\u0434\u0435\u0440\u0430 Three.js (render/index.js) \u2014 \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435; null, \u043F\u043E\u043A\u0430 Three.js\n           \u043D\u0435 \u0437\u0430\u043F\u0443\u0449\u0435\u043D \u0438\u043B\u0438 \u0432 node */\n        renderer: () => inst.renderer ? inst.renderer() : null,\n        /* the interaction layer (commands, history, Inside tools) - for browser checks */\n        interaction: () => inst.interaction || null,\n        /* Pure shared core only; this does not enable importing unsupported units into the scene. */\n        construction: root.getAttribute && root.getAttribute(\"data-ub-edition\") === \"pro\" ? { ...workshop_exports, documentOf: workshopDocumentOf } : null\n      }\n    });\n    return proj;\n  }\n\n  // v2/src/product/sync.js\n  var KNOWN_TILES = Object.freeze(ELIGIBLE_TILES.concat(Object.keys(HELD_TILES), Object.keys(NOT_A_PRODUCT)));\n  function parseRevision(v) {\n    const m = /^([0-9a-f]{8})@([0-9a-f]{7,40})$/.exec(String(v || \"\").trim());\n    return m ? { rev: m[1], commit: m[2] } : null;\n  }\n\n  // v2/src/product/editor.js\n  var esc = (s) => String(s == null ? \"\" : s).replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]);\n  var DIMS = [[\"w\", \"Width\"], [\"h\", \"Height\"], [\"d\", \"Depth\"]];\n  var QUOTE_MS = 900;\n  var STAND_HOSTS = Object.freeze([\"cut.uniboards.co.uk\", \"127.0.0.1\", \"localhost\"]);\n  function standProductMount(win2, doc2) {\n    if (!win2 || !win2.location || STAND_HOSTS.indexOf(win2.location.hostname) < 0) return null;\n    const m = /[?&]kcab=([a-z0-9-]+)/.exec(win2.location.search || \"\");\n    const lab = m && doc2.querySelector(\".ub-lab\");\n    if (!lab || lab.__ubV2Init) return null;\n    const el = doc2.createElement(\"div\");\n    el.className = \"ub-kcab\";\n    for (const k of [\"data-ub-three-lib\", \"data-ub-oak-tex\"]) if (lab.getAttribute(k)) el.setAttribute(k, lab.getAttribute(k));\n    el.setAttribute(\"data-ub-kcab-stand\", \"1\");\n    el.setAttribute(\"data-ub-kcab-tile\", m[1]);\n    el.setAttribute(\"data-ub-kcab-state\", \"eligible\");\n    el.setAttribute(\"data-ub-kcab-orderable\", \"0\");\n    el.setAttribute(\"data-ub-kcab-planner\", \"./\");\n    lab.parentNode.replaceChild(el, lab);\n    return el;\n  }\n  function mountCabinetProduct(root, env2) {\n    const win2 = env2.win, doc2 = env2.doc;\n    const stand = root.getAttribute(\"data-ub-kcab-stand\") === \"1\";\n    const qp = (k) => {\n      const m = new RegExp(\"[?&]\" + k + \"=([a-z0-9-]+)\").exec(win2.location && win2.location.search || \"\");\n      return m ? m[1] : null;\n    };\n    if (stand && qp(\"kc_tile\")) root.setAttribute(\"data-ub-kcab-tile\", qp(\"kc_tile\"));\n    if (stand && qp(\"kc_state\")) root.setAttribute(\"data-ub-kcab-state\", qp(\"kc_state\"));\n    const tile = root.getAttribute(\"data-ub-kcab-tile\") || \"\";\n    const kitTile = KIT_TILES.includes(tile);\n    const known = isProductTile(tile) || !!HELD_TILES[tile] || !!NOT_A_PRODUCT[tile];\n    if (!known) {\n      root.setAttribute(\"data-ub-kcab-error\", \"unknown tile\");\n      return null;\n    }\n    const search = win2.location && win2.location.search || \"\";\n    const shot = /[?&]kc_shot=1\\b/.test(search) || root.getAttribute(\"data-ub-kcab-shot\") === \"1\";\n    const held = root.getAttribute(\"data-ub-kcab-state\") === \"held\" || !isProductTile(tile);\n    const name2 = root.getAttribute(\"data-ub-kcab-name\") || tileName(tile);\n    const orderable = root.getAttribute(\"data-ub-kcab-orderable\") === \"1\";\n    const plannerUrl = root.getAttribute(\"data-ub-kcab-planner\") || \"/products/white-melamine-mdf-smooth-finsa?view=cabinet-lab\";\n    const store = (() => {\n      try {\n        return win2.localStorage;\n      } catch {\n        return null;\n      }\n    })();\n    const cfgCalc = calcConfig();\n    const quoteOnly = !kitTile;\n    root.setAttribute(\"data-ub-kcab-mode\", held ? \"held\" : quoteOnly ? \"quote\" : \"kit\");\n    const basket = held || shot || quoteOnly ? null : createBasket(store);\n    function requestQuote(cfg, n) {\n      const ok2 = writeHandoff(store, [{ id: null, cfg, qty: n || 1, name: name2 }], \"quote\");\n      if (ok2) win2.location.href = String(plannerUrl).split(\"#\")[0] + \"#ub-kitchen-basket\";\n      return ok2;\n    }\n    const QUOTE_NOTE = '<p class=\"ub-kcab__pmain\" data-ub-kcab-quote>Made to order &middot; priced on request</p><p class=\"ub-kcab__pnote\">This cabinet is not sold online yet, so there is no online price or checkout. Press <strong>Request a quote</strong>: your cabinet opens in our kitchen planner with the enquiry form - add your details, send it, and we reply with a price.</p>';\n    let C3 = isProductTile(tile) ? newConfig(tile) : { tile, rev: null, unit: Object.assign(catalogueUnit(tile), { id: \"K1\" }) };\n    if (stand && isProductTile(tile) && qp(\"kc_doors\") === \"1\") setFronts(C3, true);\n    if (stand && isProductTile(tile)) {\n      if (qp(\"kc_carcass\")) setDecor(C3, \"carcass\", qp(\"kc_carcass\"));\n      if (qp(\"kc_fronts\")) setDecor(C3, \"fronts\", qp(\"kc_fronts\"));\n    }\n    if (stand) {\n      const t = doc2.querySelector(\"[data-ub-kcab-standtitle]\");\n      if (t) t.textContent = tileName(tile);\n    }\n    const snap3 = root.getAttribute(\"data-ub-kcab-snapshot-rev\");\n    const stale = snap3 != null && !stand && (!parseRevision(snap3) || parseRevision(snap3).rev !== tileRevision(tile));\n    if (snap3 != null) root.setAttribute(\"data-ub-kcab-stale\", stale ? \"1\" : \"0\");\n    if (stale) {\n      const g2 = doc2.querySelector(\"[data-ub-kcab-gallery]\");\n      if (g2) g2.classList.add(\"ub-kcab-gallery--stale\");\n    }\n    let editing = null;\n    let qty = 1;\n    root.classList.remove(\"ub-kcab--loading\");\n    root.classList.add(\"ub-kcab--ready\");\n    if (shot) root.classList.add(\"ub-kcab--shot\");\n    root.innerHTML = '<div class=\"ub-kcab__grid\"><div class=\"ub-kcab__view\" data-ub-kcab-view><canvas class=\"ub-kcab__canvas\" data-ub-kcab-canvas aria-label=\"3D view of the ' + esc(name2) + '\" role=\"img\"></canvas>' + (shot ? \"\" : '<div class=\"ub-kcab__viewbar\"><button type=\"button\" class=\"ub-kcab__chip\" data-ub-kcab-open aria-pressed=\"false\">Open doors</button><button type=\"button\" class=\"ub-kcab__chip\" data-ub-kcab-reset>Reset view</button></div><p class=\"ub-kcab__hint\">Drag to turn &middot; scroll or pinch to zoom</p>') + '<p class=\"ub-kcab__nogl\" data-ub-kcab-nogl hidden>The 3D view could not start on this device - the photos above show this cabinet.</p></div>' + (shot ? \"\" : '<div class=\"ub-kcab__panel\" data-ub-kcab-panel></div>') + \"</div>\" + (shot || held || quoteOnly ? \"\" : '<section class=\"ub-kcab__basket\" data-ub-kcab-basket aria-label=\"Your kitchen basket\"></section>');\n    const q = (s) => root.querySelector(s);\n    const canvas = q(\"[data-ub-kcab-canvas]\");\n    const scene = { units: [C3.unit], showOpen: false };\n    let R4 = null;\n    const lib = root.getAttribute(\"data-ub-three-lib\");\n    const threeP = lib ? import(\n      /* webpackIgnore: true */\n      lib\n    ) : Promise.reject(new Error(\"no three\"));\n    const shown = () => scene.showOpen ? openCopy(C3.unit) : C3.unit;\n    threeP.then((THREE) => {\n      R4 = createBinspViewer({ three: THREE, canvas, window: win2, keepBuffer: shot });\n      R4.setMode(\"rotate\");\n      if (/[?&]kc_open=1\\b/.test(search)) scene.showOpen = true;\n      R4.show(shown());\n      const yaw = /[?&]kc_yaw=(-?[0-9.]+)/.exec(search), pitch = /[?&]kc_pitch=(-?[0-9.]+)/.exec(search);\n      if (yaw || pitch) R4.setView({ yaw: yaw ? Number(yaw[1]) : void 0, pitch: pitch ? Number(pitch[1]) : void 0 });\n      R4.renderNow();\n      root.setAttribute(\"data-ub-kcab-drawn\", \"1\");\n    }).catch(() => {\n      const n = q(\"[data-ub-kcab-nogl]\");\n      if (n) n.hidden = false;\n      root.setAttribute(\"data-ub-kcab-drawn\", \"0\");\n    });\n    function redraw(refit) {\n      scene.units = [C3.unit];\n      if (!R4) return;\n      R4.show(shown(), { refit: !!refit, keepAngle: true });\n    }\n    if (shot) {\n      root.__ubKcab = { config: () => C3, scene: () => scene, renderer: () => R4 };\n      return root.__ubKcab;\n    }\n    const panel = q(\"[data-ub-kcab-panel]\");\n    const F = facts(C3.unit);\n    const factOf = (u) => (F.floor ? \"Floor cabinet on 4 adjustable legs of \" + F.legH + \" mm: \" + u.h + \" mm carcass, \" + (u.h + F.legH) + \" mm overall\" : \"Wall cabinet, \" + u.h + \" mm high, hung on the wall\") + \" \\xB7 18 mm Egger board, made to your sizes\";\n    const factLine = factOf(C3.unit);\n    if (held) {\n      panel.innerHTML = (stale ? '<p class=\"ub-kcab__stale\" data-ub-kcab-stalenote>The photos show an earlier version of this cabinet - the 3D view is current.</p>' : \"\") + '<p class=\"ub-kcab__facts\">' + esc(factLine) + '</p><p class=\"ub-kcab__size\">' + C3.unit.w + \" \\xD7 \" + C3.unit.h + \" \\xD7 \" + C3.unit.d + ` mm (width \\xD7 height \\xD7 depth) in the planner's library</p><div class=\"ub-kcab__held\" data-ub-kcab-held><p><strong>Made to order - quote only.</strong> Not available to buy online. ` + esc(HELD_TILES[tile] || NOT_A_PRODUCT[tile] || \"\") + '</p></div><div class=\"ub-kcab__buy\">' + QUOTE_NOTE + '<button type=\"button\" class=\"ub-kcab__add\" data-ub-kcab-request>Request a quote</button></div><a class=\"ub-kcab__cta\" data-ub-kcab-planner href=\"' + esc(plannerUrl) + '\">Plan it in the full kitchen planner &rarr;</a>';\n      q(\"[data-ub-kcab-request]\").addEventListener(\"click\", () => {\n        if (!requestQuote(C3, 1)) win2.location.href = plannerUrl;\n      });\n      root.__ubKcab = { config: () => C3, scene: () => scene, renderer: () => R4, held: true, quoteOnly: true };\n      return root.__ubKcab;\n    }\n    const groups = decorGroups();\n    const decorSelect = (which) => '<select class=\"ub-kcab__select\" data-ub-kcab-decor=\"' + which + '\">' + groups.map((g2) => '<optgroup label=\"' + esc(g2.label) + '\">' + g2.decors.map((d) => '<option value=\"' + esc(d.key) + '\">' + esc(d.code + \" \" + d.tex + \" \" + d.name) + \"</option>\").join(\"\") + \"</optgroup>\").join(\"\") + \"</select>\";\n    panel.innerHTML = (stale ? '<p class=\"ub-kcab__stale\" data-ub-kcab-stalenote>The photos show an earlier version of this cabinet - the 3D view, sizes and price here are current.</p>' : \"\") + '<p class=\"ub-kcab__facts\" data-ub-kcab-facts>' + esc(factLine) + '</p><fieldset class=\"ub-kcab__sec\"><legend>Size</legend>' + DIMS.map(([k, label]) => {\n      const L = limitsOf(C3)[k];\n      return '<div class=\"ub-kcab__dim\"><label for=\"kc-' + k + '\">' + label + '</label><input type=\"range\" data-ub-kcab-range=\"' + k + '\" min=\"' + L[0] + '\" max=\"' + L[1] + '\" step=\"1\" aria-label=\"' + label + ' slider\"><span class=\"ub-kcab__num\"><input id=\"kc-' + k + '\" type=\"number\" inputmode=\"numeric\" data-ub-kcab-num=\"' + k + '\" min=\"' + L[0] + '\" max=\"' + L[1] + '\"> mm</span><small class=\"ub-kcab__lim\">' + L[0] + \"\\u2013\" + L[1] + \"</small></div>\";\n    }).join(\"\") + '<p class=\"ub-kcab__msg\" data-ub-kcab-sizemsg aria-live=\"polite\"></p></fieldset><fieldset class=\"ub-kcab__sec\" data-ub-kcab-inside><legend>Inside</legend><div class=\"ub-kcab__step\"><span>Shelves</span><button type=\"button\" data-ub-kcab-shelf=\"-1\" aria-label=\"One shelf fewer\">&minus;</button><output data-ub-kcab-shelves>0</output><button type=\"button\" data-ub-kcab-shelf=\"1\" aria-label=\"One more shelf\">+</button></div>' + (kitTile ? '<p class=\"ub-kcab__msg ub-kcab__msg--info\" data-ub-kcab-nodiv>Dividers are not available in a complete kit yet.</p>' : '<div class=\"ub-kcab__step\"><span>Dividers</span><button type=\"button\" data-ub-kcab-div=\"-1\" aria-label=\"One divider fewer\">&minus;</button><output data-ub-kcab-dividers>0</output><button type=\"button\" data-ub-kcab-div=\"1\" aria-label=\"One more divider\">+</button></div>') + '<p class=\"ub-kcab__msg\" data-ub-kcab-insidemsg aria-live=\"polite\"></p></fieldset><fieldset class=\"ub-kcab__sec\" data-ub-kcab-frontsec><legend>Doors</legend><div class=\"ub-kcab__seg\" role=\"radiogroup\" aria-label=\"Doors\"><button type=\"button\" role=\"radio\" data-ub-kcab-fronts=\"0\">Carcass only</button><button type=\"button\" role=\"radio\" data-ub-kcab-fronts=\"1\">With ' + esc(frontsWord(C3)) + '</button></div><p class=\"ub-kcab__msg ub-kcab__msg--info\" data-ub-kcab-frontmsg></p></fieldset><fieldset class=\"ub-kcab__sec\"><legend>Finish</legend><div class=\"ub-kcab__fin\"><span class=\"ub-kcab__sw\" data-ub-kcab-sw=\"carcass\"></span><label>Carcass ' + decorSelect(\"carcass\") + '</label></div><div class=\"ub-kcab__fin\" data-ub-kcab-frontfin><span class=\"ub-kcab__sw\" data-ub-kcab-sw=\"fronts\"></span><label>' + (C3.unit.type === \"base-4drawer\" ? \"Drawer fronts \" : \"Doors &amp; fronts \") + decorSelect(\"fronts\") + '</label></div></fieldset><fieldset class=\"ub-kcab__sec\"><legend>Assembly fixings</legend>' + (kitTile ? FIXINGS.filter(([v]) => v === \"cabineo\") : FIXINGS).map(([v, label]) => '<label class=\"ub-kcab__radio\"><input type=\"radio\" name=\"kc-fixing\" value=\"' + v + '\" data-ub-kcab-fixing> ' + esc(label) + (v === \"cabineo\" ? \" <small>(our standard)</small>\" : \" <small>(\\xD83 mm pilot holes)</small>\") + \"</label>\").join(\"\") + '<p class=\"ub-kcab__msg ub-kcab__msg--info\" data-ub-kcab-fixmsg></p></fieldset><p class=\"ub-kcab__notes\" data-ub-kcab-notes></p><div class=\"ub-kcab__buy\"><div class=\"ub-kcab__step ub-kcab__qty\"><span>Quantity</span><button type=\"button\" data-ub-kcab-qty=\"-1\" aria-label=\"One fewer\">&minus;</button><output data-ub-kcab-qtyv>1</output><button type=\"button\" data-ub-kcab-qty=\"1\" aria-label=\"One more\">+</button></div>' + (quoteOnly ? QUOTE_NOTE + '<button type=\"button\" class=\"ub-kcab__add\" data-ub-kcab-request>Request a quote</button></div>' : '<div class=\"ub-kcab__price\" data-ub-kcab-price aria-live=\"polite\"></div><button type=\"button\" class=\"ub-kcab__add\" data-ub-kcab-add>Add to kitchen basket</button><button type=\"button\" class=\"ub-kcab__link\" data-ub-kcab-cancel hidden>Cancel editing</button></div>') + '<a class=\"ub-kcab__cta\" data-ub-kcab-planner href=\"' + esc(plannerUrl) + '\">Design the whole kitchen in our planner &rarr;</a>';\n    function paintPanel() {\n      const u = C3.unit, L = limitsOf(C3);\n      for (const [k] of DIMS) {\n        const r = q('[data-ub-kcab-range=\"' + k + '\"]'), n = q('[data-ub-kcab-num=\"' + k + '\"]');\n        r.min = L[k][0];\n        r.max = L[k][1];\n        r.value = u[k];\n        if (doc2.activeElement !== n) n.value = u[k];\n      }\n      const I = interiorState(C3);\n      q(\"[data-ub-kcab-inside]\").hidden = !I.can;\n      q(\"[data-ub-kcab-shelves]\").textContent = String(I.shelves);\n      if (q(\"[data-ub-kcab-dividers]\")) q(\"[data-ub-kcab-dividers]\").textContent = String(I.dividers);\n      q('[data-ub-kcab-shelf=\"-1\"]').disabled = !I.can || I.shelves <= 0;\n      q('[data-ub-kcab-shelf=\"1\"]').disabled = !I.can || I.shelves >= I.maxShelves;\n      if (q('[data-ub-kcab-div=\"1\"]')) {\n        q('[data-ub-kcab-div=\"-1\"]').disabled = !I.can || I.dividers <= 0;\n        q('[data-ub-kcab-div=\"1\"]').disabled = !I.can || I.dividers >= I.maxDividers;\n      }\n      const K2 = decorKeys(C3);\n      for (const w of [\"carcass\", \"fronts\"]) {\n        q('[data-ub-kcab-decor=\"' + w + '\"]').value = K2[w];\n        const d = decorOf(K2[w]), sw = q('[data-ub-kcab-sw=\"' + w + '\"]');\n        const img = d && d.kind === \"texture\" ? decorImageUrl(d, 120) : null;\n        sw.style.background = img ? \"url(\" + img + \") center/cover\" : \"#\" + (d && (d.shopHex || d.hex) || \"eee\");\n        sw.title = finishShort(K2[w]);\n      }\n      q(\"[data-ub-kcab-facts]\").textContent = factOf(u);\n      const fo = frontsOn(C3);\n      for (const b of root.querySelectorAll(\"[data-ub-kcab-fronts]\")) {\n        const on = b.getAttribute(\"data-ub-kcab-fronts\") === \"1\";\n        b.setAttribute(\"aria-checked\", String(on === fo));\n      }\n      q(\"[data-ub-kcab-frontfin]\").hidden = !fo;\n      q(\"[data-ub-kcab-open]\") && (q(\"[data-ub-kcab-open]\").hidden = !fo);\n      for (const r of root.querySelectorAll(\"[data-ub-kcab-fixing]\")) r.checked = r.value === fixingOf2(C3);\n      q(\"[data-ub-kcab-fixmsg]\").textContent = fixingOf2(C3) === \"screws\" ? fixingNote(C3).ops + \".\" : kitTile ? \"Lamello Cabineo 12 connectors are included in the kit, with their seats CNC drilled. Screw fixing is not offered yet.\" : \"Lamello Cabineo 12 - the connector our workshop builds these cabinets with.\";\n      const notes = workshopNotes(C3).filter((t) => /dividers|fixed shelves|Four-drawer/.test(t));\n      q(\"[data-ub-kcab-notes]\").textContent = notes.join(\" \");\n      q(\"[data-ub-kcab-qtyv]\").textContent = String(qty);\n      if (!quoteOnly) {\n        q(\"[data-ub-kcab-add]\").textContent = editing ? \"Update this cabinet in the basket\" : \"Add to kitchen basket\";\n        q(\"[data-ub-kcab-cancel]\").hidden = !editing;\n      }\n      root.setAttribute(\"data-ub-kcab-custom\", customised(C3) ? \"1\" : \"0\");\n    }\n    function sizeMsg(t) {\n      q(\"[data-ub-kcab-sizemsg]\").textContent = t || \"\";\n    }\n    function insideMsg(t) {\n      q(\"[data-ub-kcab-insidemsg]\").textContent = t || \"\";\n    }\n    const P2 = { seq: 0, timer: null, mine: null, all: null, base: null };\n    function entries(withCurrent) {\n      const list = basket.items().filter((i) => !editing || i.id !== editing).map((i) => ({ id: i.id, cfg: i.cfg, qty: i.qty, name: i.name }));\n      if (withCurrent) list.push({ id: editing || null, cfg: C3, qty, name: name2 });\n      return list;\n    }\n    function ask(list) {\n      if (!list.length) return Promise.resolve(null);\n      return calcPost(win2, cfgCalc, \"/quote\", quoteBody(list, cfgCalc).body).then(\n        (r) => r && r.ok && r.json && r.json.ok !== false ? readQuote(r.json) : { ok: false, why: calcReason(r) },\n        (e) => ({ ok: false, why: e && e.calcReason || \"The price could not be worked out just now.\" })\n      );\n    }\n    function requote() {\n      if (quoteOnly) return;\n      const my = ++P2.seq;\n      if (P2.timer) win2.clearTimeout(P2.timer);\n      paintPrice({ loading: true });\n      P2.timer = win2.setTimeout(() => {\n        P2.timer = null;\n        const others2 = entries(false);\n        const alt = restore(serialize(C3));\n        setFronts(alt, !frontsOn(C3));\n        Promise.all([ask([{ cfg: C3, qty, name: name2 }]), ask(others2.concat([{ id: editing, cfg: C3, qty, name: name2 }])), ask(others2), ask([{ cfg: alt, qty, name: name2 }])]).then(([mine, all, base, other]) => {\n          if (my !== P2.seq) return;\n          P2.mine = mine;\n          P2.all = all;\n          P2.base = base;\n          P2.other = other;\n          paintPrice({});\n        });\n      }, QUOTE_MS);\n    }\n    function money2(qt) {\n      return calcMoney(qt.inc) + \" <small>inc VAT (\" + calcMoney(qt.ex) + \" ex VAT)</small>\";\n    }\n    function paintPrice(st) {\n      const box3 = q(\"[data-ub-kcab-price]\");\n      if (st.loading) {\n        box3.innerHTML = '<p class=\"ub-kcab__pmuted\">Working out the price\\u2026</p>';\n        box3.setAttribute(\"data-ub-kcab-pstate\", \"loading\");\n        return;\n      }\n      const m = P2.mine, a = P2.all, b = P2.base;\n      if (!m || !m.ok) {\n        box3.innerHTML = '<p class=\"ub-kcab__pmuted\">' + esc(m && m.why || \"No price yet.\") + \"</p>\";\n        box3.setAttribute(\"data-ub-kcab-pstate\", \"unavailable\");\n        return;\n      }\n      if (!m.complete) {\n        box3.innerHTML = '<p class=\"ub-kcab__pmuted\">This finish cannot be priced online yet - ask us for a quote.</p>';\n        box3.setAttribute(\"data-ub-kcab-pstate\", \"incomplete\");\n        return;\n      }\n      let h = '<p class=\"ub-kcab__pmain\">' + (qty > 1 ? qty + \" cabinets on their own: \" : \"On its own: \") + money2(m) + \"</p>\";\n      const others2 = basket.count() - (editing ? (basket.items().find((i) => i.id === editing) || { qty: 0 }).qty : 0);\n      if (others2 > 0 && a && a.ok && b && b.ok && a.complete && b.complete) {\n        const add = Math.max(0, Math.round((a.inc - b.inc) * 100) / 100);\n        h += '<p class=\"ub-kcab__pline\">With your basket (' + (others2 + qty) + \" cabinets): \" + money2(a) + \" - this adds <strong>\" + calcMoney(add) + \"</strong></p>\";\n      }\n      const total = a && a.ok ? a : m;\n      if (total.ex < (total.minimum || MINIMUM_EX_VAT)) h += '<p class=\"ub-kcab__pmin\">Minimum order \\xA3' + (total.minimum || MINIMUM_EX_VAT) + \" ex VAT - \" + calcMoney((total.minimum || MINIMUM_EX_VAT) - total.ex) + \" to go.</p>\";\n      const o = P2.other;\n      if (o && o.ok && o.complete) {\n        const d = Math.round((frontsOn(C3) ? m.inc - o.inc : o.inc - m.inc) * 100) / 100;\n        h += '<p class=\"ub-kcab__pline\" data-ub-kcab-frontdelta>' + (frontsOn(C3) ? \"As a carcass only: \" : \"With \" + esc(frontsWord(C3)) + \": \") + calcMoney(o.inc) + \" inc VAT\" + (d === 0 ? \" - \" + esc(frontsWord(C3)) + (/s$/.test(frontsWord(C3)) ? \" fit\" : \" fits\") + \" on the same boards\" : \" (\" + esc(frontsWord(C3)) + \" \" + (d > 0 ? \"+\" : \"\") + calcMoney(d) + \")\") + \"</p>\";\n      }\n      h += kitTile ? '<p class=\"ub-kcab__pnote\" data-ub-kcab-scope=\"kit\">Complete flat-pack kit: boards cut to your sizes, edged and CNC drilled, with hinges, legs, Lamello Cabineo 12 connectors and shelf supports included at no extra charge. Assembly is not included; delivery is priced at checkout. Cabinets in the same decor share boards, so each one you add can cost less.</p>' : '<p class=\"ub-kcab__pnote\">Boards cut and edged to your sizes. Cabinets in the same decor share boards, so each one you add can cost less.</p>';\n      box3.innerHTML = h;\n      box3.setAttribute(\"data-ub-kcab-pstate\", \"ok\");\n    }\n    const B = { seq: 0, q: null };\n    const bEl = q(\"[data-ub-kcab-basket]\");\n    function describe(c) {\n      const u = c.unit, K2 = decorKeys(c), I = interiorState(c);\n      return u.w + \" \\xD7 \" + u.h + \" \\xD7 \" + u.d + \" mm \\xB7 \" + finishShort(K2.carcass) + (K2.fronts !== K2.carcass ? \" / \" + finishShort(K2.fronts) : \"\") + (I.can && (I.shelves || I.dividers) ? \" \\xB7 \" + I.shelves + \" shelf\" + (I.shelves === 1 ? \"\" : \"s\") + (I.dividers ? \", \" + I.dividers + \" divider\" + (I.dividers === 1 ? \"\" : \"s\") : \"\") : \"\") + (frontsOn(c) ? \" \\xB7 with \" + frontsWord(c) : \" \\xB7 carcass only\") + (fixingOf2(c) === \"screws\" ? \" \\xB7 screws\" : \"\");\n    }\n    function paintBasket() {\n      const items = basket.items();\n      root.setAttribute(\"data-ub-kcab-count\", String(basket.count()));\n      if (!items.length) {\n        bEl.innerHTML = '<h2 class=\"ub-kcab__bh\">Your kitchen basket</h2><p class=\"ub-kcab__pmuted\">Empty - configure a cabinet and add it. Cabinets added from any of our cabinet pages are priced together.</p>';\n        return;\n      }\n      const Q = B.q;\n      let h = '<h2 class=\"ub-kcab__bh\">Your kitchen basket <small>(' + basket.count() + \" cabinet\" + (basket.count() === 1 ? \"\" : \"s\") + ')</small></h2><ol class=\"ub-kcab__items\">';\n      for (const it of items) {\n        h += '<li data-ub-kcab-item=\"' + esc(it.id) + '\"><div><strong>' + esc(it.name) + \"</strong>\" + (it.qty > 1 ? \" \\xD7 \" + it.qty : \"\") + \"<br><small>\" + esc(describe(it.cfg)) + '</small></div><div class=\"ub-kcab__iact\"><button type=\"button\" data-ub-kcab-edit=\"' + esc(it.id) + '\"' + (it.cfg.tile === tile ? \"\" : \" hidden\") + '>Edit</button><button type=\"button\" data-ub-kcab-remove=\"' + esc(it.id) + '\" aria-label=\"Remove ' + esc(it.name) + '\">Remove</button></div></li>';\n      }\n      h += \"</ol>\";\n      if (!Q) h += '<p class=\"ub-kcab__pmuted\" data-ub-kcab-bstate=\"loading\">Working out the basket price\\u2026</p>';\n      else if (!Q.ok) h += '<p class=\"ub-kcab__pmuted\" data-ub-kcab-bstate=\"unavailable\">' + esc(Q.why) + \"</p>\";\n      else {\n        h += '<p class=\"ub-kcab__btotal\" data-ub-kcab-bstate=\"' + (Q.complete ? \"ok\" : \"incomplete\") + '\">' + (Q.complete ? \"Total \" + money2(Q) : \"Part of this basket cannot be priced online - ask us for a quote.\") + \"</p>\";\n        if (Q.complete && Q.ex < Q.minimum) h += '<p class=\"ub-kcab__pmin\">Minimum order \\xA3' + Q.minimum + \" ex VAT - \" + calcMoney(Q.minimum - Q.ex) + \" to go.</p>\";\n        h += '<details class=\"ub-kcab__break\"><summary>Cost breakdown</summary><table><tbody>' + Q.lines.map((l) => \"<tr><td>\" + esc(l.label) + (l.note ? \"<br><small>\" + esc(l.note) + \"</small>\" : \"\") + \"</td><td>\" + (l.qty != null ? \"\\xD7 \" + l.qty : \"\") + \"</td><td>\" + calcMoney(l.ex) + \"</td></tr>\").join(\"\") + '</tbody><tfoot><tr><td colspan=\"2\">Ex VAT</td><td>' + calcMoney(Q.ex) + '</td></tr><tr><td colspan=\"2\">Inc VAT</td><td>' + calcMoney(Q.inc) + \"</td></tr></tfoot></table>\" + (Q.missing.length ? '<p class=\"ub-kcab__pmuted\">Not in this price: ' + esc(Q.missing.map((m) => m.label).join(\", \")) + \".</p>\" : \"\") + '<p class=\"ub-kcab__pmuted\">Boards are priced whole per decor and thickness across the basket, so cabinets in the same decor share material.</p></details>';\n      }\n      h += orderable ? '<div class=\"ub-kcab__bgo\"><button type=\"button\" class=\"ub-kcab__add\" data-ub-kcab-checkout>Continue to checkout</button><p class=\"ub-kcab__pmuted\">Your cabinets open in our kitchen planner for the final price and secure checkout - nothing in your basket is changed.</p></div>' : '<div class=\"ub-kcab__bgo\"><button type=\"button\" class=\"ub-kcab__btn2\" data-ub-kcab-openplan>Open my basket in the planner</button><p class=\"ub-kcab__pmuted\">Online ordering from these pages opens soon. Your cabinets open in the planner as a new plan - nothing in your basket is changed.</p></div>';\n      bEl.innerHTML = h;\n    }\n    function requoteBasket() {\n      if (!basket) return;\n      const my = ++B.seq;\n      B.q = null;\n      paintBasket();\n      const all = basket.items().map((i) => ({ id: i.id, cfg: i.cfg, qty: i.qty, name: i.name }));\n      if (!all.length) return;\n      ask(all).then((r) => {\n        if (my !== B.seq) return;\n        B.q = r;\n        paintBasket();\n      });\n    }\n    function changed(refit) {\n      paintPanel();\n      redraw(refit);\n      requote();\n    }\n    for (const [k] of DIMS) {\n      const r = q('[data-ub-kcab-range=\"' + k + '\"]'), n = q('[data-ub-kcab-num=\"' + k + '\"]');\n      r.addEventListener(\"input\", () => {\n        const res = setSize(C3, k, r.value);\n        sizeMsg(res.why);\n        changed(false);\n      });\n      r.addEventListener(\"change\", () => redraw(true));\n      const commit = () => {\n        const res = setSize(C3, k, n.value);\n        sizeMsg(res.why);\n        n.value = C3.unit[k];\n        changed(true);\n      };\n      n.addEventListener(\"change\", commit);\n      n.addEventListener(\"keydown\", (e) => {\n        if (e.key === \"Enter\") {\n          e.preventDefault();\n          commit();\n        }\n      });\n    }\n    for (const b of root.querySelectorAll(\"[data-ub-kcab-shelf]\")) b.addEventListener(\"click\", () => {\n      const r = setShelves(C3, interiorState(C3).shelves + Number(b.getAttribute(\"data-ub-kcab-shelf\")));\n      insideMsg(r.ok ? \"\" : r.why);\n      changed(false);\n    });\n    for (const b of root.querySelectorAll(\"[data-ub-kcab-div]\")) b.addEventListener(\"click\", () => {\n      const r = setDividers(C3, interiorState(C3).dividers + Number(b.getAttribute(\"data-ub-kcab-div\")));\n      insideMsg(r.ok ? \"\" : r.why);\n      changed(false);\n    });\n    for (const s of root.querySelectorAll(\"[data-ub-kcab-decor]\")) s.addEventListener(\"change\", () => {\n      setDecor(C3, s.getAttribute(\"data-ub-kcab-decor\"), s.value);\n      changed(false);\n    });\n    for (const b of root.querySelectorAll(\"[data-ub-kcab-fronts]\")) b.addEventListener(\"click\", () => {\n      setFronts(C3, b.getAttribute(\"data-ub-kcab-fronts\") === \"1\");\n      if (!frontsOn(C3)) scene.showOpen = false;\n      changed(false);\n    });\n    for (const r of root.querySelectorAll(\"[data-ub-kcab-fixing]\")) r.addEventListener(\"change\", () => {\n      if (r.checked) {\n        setFixing(C3, r.value);\n        changed(false);\n      }\n    });\n    for (const b of root.querySelectorAll(\"[data-ub-kcab-qty]\")) b.addEventListener(\"click\", () => {\n      qty = Math.max(1, Math.min(20, qty + Number(b.getAttribute(\"data-ub-kcab-qty\"))));\n      paintPanel();\n      requote();\n    });\n    q(\"[data-ub-kcab-open]\").addEventListener(\"click\", (e) => {\n      scene.showOpen = !scene.showOpen;\n      e.currentTarget.setAttribute(\"aria-pressed\", String(scene.showOpen));\n      e.currentTarget.textContent = scene.showOpen ? \"Close doors\" : \"Open doors\";\n      redraw(false);\n    });\n    q(\"[data-ub-kcab-reset]\").addEventListener(\"click\", () => {\n      if (R4) {\n        R4.setView({ yaw: -0.6, pitch: 0.38 });\n        R4.fit();\n      }\n    });\n    if (quoteOnly) {\n      q(\"[data-ub-kcab-request]\").addEventListener(\"click\", () => {\n        if (!requestQuote(C3, qty)) insideMsg(\"Your cabinet could not be handed to the planner in this browser - please use the planner link below.\");\n      });\n      q(\"[data-ub-kcab-planner]\").addEventListener(\"click\", (e) => {\n        if (writeHandoff(store, [{ id: null, cfg: C3, qty, name: name2 }], \"open\")) {\n          e.preventDefault();\n          win2.location.href = String(plannerUrl).split(\"#\")[0] + \"#ub-kitchen-basket\";\n        }\n      });\n    } else {\n      let handOff = function(intent) {\n        const list = basket.items().map((i) => ({ id: i.id, cfg: i.cfg, qty: i.qty, name: i.name }));\n        if (!list.length) return;\n        if (writeHandoff(store, list, intent)) win2.location.href = withHash(plannerUrl);\n      }, withHash = function(u) {\n        return String(u).split(\"#\")[0] + \"#ub-kitchen-basket\";\n      };\n      q(\"[data-ub-kcab-add]\").addEventListener(\"click\", () => {\n        const r = editing ? basket.replace(editing, C3) : basket.add(C3, qty, name2);\n        if (editing && r.ok) basket.setQty(editing, qty);\n        if (!r.ok) {\n          insideMsg(r.why || \"The basket could not be saved in this browser.\");\n          return;\n        }\n        editing = null;\n        qty = 1;\n        C3 = newConfig(tile);\n        paintPanel();\n        redraw(true);\n        requote();\n        requoteBasket();\n        const msg = q(\"[data-ub-kcab-sizemsg]\");\n        msg.textContent = \"Added to your kitchen basket.\";\n      });\n      q(\"[data-ub-kcab-cancel]\").addEventListener(\"click\", () => {\n        editing = null;\n        qty = 1;\n        C3 = newConfig(tile);\n        changed(true);\n      });\n      bEl.addEventListener(\"click\", (e) => {\n        const t = e.target && e.target.closest ? e.target.closest(\"button\") : null;\n        if (!t) return;\n        const rm = t.getAttribute(\"data-ub-kcab-remove\"), ed = t.getAttribute(\"data-ub-kcab-edit\");\n        if (rm) {\n          basket.remove(rm);\n          if (editing === rm) {\n            editing = null;\n            C3 = newConfig(tile);\n          }\n          requoteBasket();\n          changed(false);\n        } else if (ed) {\n          const it = basket.items().find((i) => i.id === ed);\n          if (it) {\n            editing = ed;\n            qty = it.qty;\n            C3 = restore(serialize(it.cfg));\n            if (kitTile) {\n              if (fixingOf2(C3) === \"screws\") setFixing(C3, \"cabineo\");\n              if (interiorState(C3).dividers) setDividers(C3, 0);\n            }\n            changed(true);\n            if (root.scrollIntoView) root.scrollIntoView({ block: \"start\", behavior: \"smooth\" });\n          }\n        } else if (t.hasAttribute(\"data-ub-kcab-checkout\")) handOff(\"checkout\");\n        else if (t.hasAttribute(\"data-ub-kcab-openplan\")) handOff(\"open\");\n      });\n      q(\"[data-ub-kcab-planner]\").addEventListener(\"click\", (e) => {\n        const list = basket.items().map((i) => ({ id: i.id, cfg: i.cfg, qty: i.qty, name: i.name })).filter((i) => !editing || i.id !== editing);\n        if (customised(C3) || editing || !list.length) list.push({ id: editing, cfg: C3, qty, name: name2 });\n        if (writeHandoff(store, list, \"open\")) {\n          e.preventDefault();\n          win2.location.href = withHash(plannerUrl);\n        }\n      });\n      if (win2.addEventListener) win2.addEventListener(\"storage\", (e) => {\n        if (e && e.key && e.key.indexOf(\"ub-kitchen-basket\") === 0) {\n          basket.reload();\n          requoteBasket();\n          requote();\n        }\n      });\n    }\n    paintPanel();\n    requote();\n    requoteBasket();\n    root.__ubKcab = { config: () => C3, scene: () => scene, renderer: () => R4, basket, orderable, quoteOnly, state: () => ({ price: P2, basket: B.q, editing, qty }) };\n    return root.__ubKcab;\n  }\n\n  // v2/src/api/boot.js\n  var g = globalThis;\n  var doc = g.document;\n  var win = g.window;\n  var env = { doc, win, console: g.console };\n  var UB_INSTANCES = [];\n  var state = { last: null, exports: null };\n  function ubEachInstance(fn) {\n    for (const r of UB_INSTANCES.slice()) {\n      try {\n        fn(r);\n      } catch {\n      }\n    }\n  }\n  var lifecycle = {\n    sleep: function() {\n    },\n    wake: function() {\n      if (state.last) state.last.wake();\n    },\n    glLost: function() {\n      return state.last ? state.last.glLost() : false;\n    },\n    glAsleep: function() {\n      return false;\n    }\n  };\n  function getLegacyExports() {\n    if (!state.exports) {\n      state.exports = buildLegacyExports(loadLayers(), lifecycle);\n      state.exports.__v2.instances = function() {\n        return UB_INSTANCES.length;\n      };\n    }\n    return state.exports;\n  }\n  function start(el, three) {\n    const proj = createInstance(el, three ? Object.assign({}, env, { three }) : env, loadLayers());\n    el.__ubProj = proj;\n    if (el.classList) el.classList.remove(\"ub-lab--loading\");\n    state.last = proj;\n    if (UB_INSTANCES.indexOf(proj) < 0) UB_INSTANCES.push(proj);\n    return proj;\n  }\n  var threeLoads = {};\n  function loadThree(lib) {\n    if (!threeLoads[lib]) threeLoads[lib] = import(\n      /* webpackIgnore: true */\n      lib\n    );\n    return threeLoads[lib];\n  }\n  function fallBack(el, err) {\n    try {\n      env.console.error(\"Cabinet Lab v2: Three.js \\u043D\\u0435 \\u0437\\u0430\\u0433\\u0440\\u0443\\u0437\\u0438\\u043B\\u0441\\u044F \\u2014 \\u044D\\u0442\\u043E\\u0442 \\u043F\\u043B\\u0430\\u043D\\u0438\\u0440\\u043E\\u0432\\u0449\\u0438\\u043A \\u043F\\u0435\\u0440\\u0435\\u0445\\u043E\\u0434\\u0438\\u0442 \\u043D\\u0430 \\u0441\\u0442\\u0430\\u0440\\u044B\\u0439 \\u0440\\u0435\\u0434\\u0430\\u043A\\u0442\\u043E\\u0440\", err);\n    } catch {\n    }\n    el.__ubV2Fallback = true;\n    if (el.classList) {\n      el.classList.remove(\"ub-lab--loading\");\n      el.classList.add(\"ub-lab--failed\");\n    }\n    try {\n      delete el.__ubV2Init;\n      delete el.__ubInit;\n    } catch {\n    }\n    const tell = function() {\n      if (el.__ubProj) return;\n      const c = el.querySelector && el.querySelector(\"[data-ub-cue]\");\n      if (c) {\n        c.textContent = \"The 3D view could not start \\u2014 please reload the page to carry on.\";\n        if (c.style) c.style.display = \"\";\n      }\n    };\n    try {\n      const ev = typeof win.CustomEvent === \"function\" ? new win.CustomEvent(\"shopify:section:load\") : null;\n      if (ev) doc.dispatchEvent(ev);\n    } catch {\n    }\n    if (doc.readyState === \"loading\") doc.addEventListener(\"DOMContentLoaded\", function() {\n      win.setTimeout(tell, 0);\n    });\n    else win.setTimeout(tell, 0);\n  }\n  function init(el) {\n    if (!el || el.__ubV2Init || el.__ubV2Fallback) return;\n    el.__ubV2Init = true;\n    el.__ubInit = true;\n    const lib = win && win.document && el.getAttribute && el.getAttribute(\"data-ub-three-lib\");\n    if (lib) {\n      loadThree(lib).then(\n        function(THREE) {\n          if (el.__ubV2Init && !el.__ubProj) start(el, THREE);\n        },\n        function(err) {\n          if (el.__ubV2Init && !el.__ubProj) fallBack(el, err);\n        }\n      );\n      return;\n    }\n    start(el, null);\n  }\n  if (doc && doc.addEventListener) {\n    doc.addEventListener(\"visibilitychange\", function() {\n      if (!doc.hidden) ubEachInstance(function(r) {\n        if (r.wake) r.wake();\n      });\n    });\n    if (win && win.addEventListener) win.addEventListener(\"pageshow\", function() {\n      ubEachInstance(function(r) {\n        if (r.wake) r.wake();\n      });\n    });\n    doc.addEventListener(\"shopify:section:unload\", function(e) {\n      const root = e && e.target;\n      if (!root || !root.querySelectorAll) return;\n      root.querySelectorAll(\".ub-lab\").forEach(function(el) {\n        const api = el.__ubProj;\n        const i = api ? UB_INSTANCES.indexOf(api) : -1;\n        if (i >= 0) UB_INSTANCES.splice(i, 1);\n        try {\n          delete el.__ubV2Init;\n          delete el.__ubV2Fallback;\n          delete el.__ubInit;\n          delete el.__ubProj;\n        } catch {\n        }\n      });\n    });\n  }\n  function bootProducts() {\n    doc.querySelectorAll(\".ub-kcab\").forEach(function(el) {\n      if (el.__ubKcabInit) return;\n      el.__ubKcabInit = true;\n      try {\n        mountCabinetProduct(el, env);\n      } catch (e) {\n        try {\n          env.console.error(\"Cabinet product page did not start\", e);\n        } catch {\n        }\n        el.setAttribute(\"data-ub-kcab-error\", String(e && e.message || e));\n      }\n    });\n  }\n  function boot() {\n    try {\n      standProductMount(win, doc);\n    } catch {\n    }\n    bootProducts();\n    doc.querySelectorAll(\".ub-lab\").forEach(function(el) {\n      init(el);\n      if (!el.__ubVersionGuard) {\n        el.__ubVersionGuard = true;\n        try {\n          installVersionGuard(win, el);\n        } catch {\n        }\n      }\n      const api = el.__ubProj;\n      if (api && UB_INSTANCES.indexOf(api) < 0) UB_INSTANCES.push(api);\n    });\n  }\n  if (doc && doc.querySelectorAll) {\n    if (doc.readyState === \"loading\") doc.addEventListener(\"DOMContentLoaded\", boot);\n    else boot();\n    doc.addEventListener(\"shopify:section:load\", boot);\n  }\n  return __toCommonJS(boot_exports);\n})();\nif (typeof module !== \"undefined\" && module.exports) module.exports = __UbCabinetLabV2.getLegacyExports();\n})();\n//# sourceMappingURL=ub-cabinet-lab-v2.js.map\n"],
  "mappings": "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uBACA,gBACA,eACA,gBACA,iBACA,cACA,aACA,aACA,oBACA,cACA,iBACA,cACA,gBACA,qBACA,cACA,cACA,WACA,YACA,gBACA,eACA,WACA,cACA,mBACA,mBACA,kBACA,WACA,cACA,aACA,oBACA,qBACA,oBACA,wBACA,SACA,WACA,eACA,cACA,YACA,cACA,mBACA,cACA,SACA,UACA,YACA,SACA,UACA,UACA,eACA,aACA,aACA,WACA,WACA,cACA,gBACA,UACA,cACA,iBACA,eACA,eACA,iBACA,eACA,kBACA,gBACA,gBACA,eACA,aACA,kBACA,oBACA,gBACA,aACA,QACA,QACA,cACA,iBACA,gBACA,iBACA,gBACA,iBACA,cACA,cACA,gBACA,eACA,iBACA,eACA,eACA,WACA,eACA,SACA,YACA,YACA,aACA,cACA,eACA,YACA,eACA,OACA,YACA,QACA,cACA,gBACA,cACA,aACA,kBACA,oBACA,aACA,kBACA,WACA,SACA,YACA,OACA,SACA,iBACA,OACA,OACA,eACA,SACA,aACA,cACA,cACA,YACA,WACA,WACA,WACA,YACA,cACA,aACA,YACA,YACA,YACA,aACA,OACA,cACA,QACA,UACA,eACA,YACA,YACA,OACA,aACA,WACA,UACA,WACA,eACA,aACA,cACA,YACA,iBACA,YACA,aACA,eACA,cACA,mBACA,aACA,YACA,WACA,kBACA,kBACA,cACA,SACA,eACA,aACA,eACA,cACA,eACA,cACA,iBACA,gBACA,eACA,WACA,WACA,YACA,aACA,YACA,cACA,eACA,WACA,YACA,OACA,QACA,OACA,SACA,UACF,EACI,aAAe,CACjB,KAAM,OACN,UAAW,OACX,QAAS,OACT,KAAM,OACN,cAAe,SACf,IAAK,SACL,MAAO,SACP,WAAY,SACZ,mBAAoB,SACpB,aAAc,SACd,OAAQ,SACR,WAAY,SACZ,UAAW,SACX,WAAY,SACZ,YAAa,SACb,GAAI,SACJ,GAAI,SACJ,YAAa,KACb,iBAAkB,KAClB,MAAO,MACP,KAAM,MACN,OAAQ,MACR,SAAU,KACZ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",
  "names": []
}
