8fd8987b70
Neuer GPU-Renderer fuer den Grundriss (src/plan/glPlan/): Earcut-Tessellierung (konkav-faehig), gehrte Linienzuege (Miter), echte Papier-mm-Strichbreiten im Massstab (repliziert den SVG-printStrokeVb-Pfad), Hybrid mit scharfem SVG-Text- Overlay. GPU ist der Standardpfad; der SVG-Renderer bleibt automatischer Fallback, falls WebGL2/Shader nicht verfuegbar sind. Imperativer Pan (rAF + CSS-transform) fuer fluessige Interaktion ohne React-Re-Render je Frame. Enthaelt zudem den bisher nicht committeten Arbeitsstand des Browser-BIM (Oeffnungen, Treppen, Raeume, Decken, DXF-Export, Materialbibliothek, Kontext- Import, Tauri-Compute-Boundary-PoC).
90 lines
3.5 KiB
JavaScript
90 lines
3.5 KiB
JavaScript
import puppeteer from "puppeteer";
|
|
const b = await puppeteer.launch({
|
|
headless: "new",
|
|
args: ["--no-sandbox", "--use-gl=swiftshader", "--enable-unsafe-swiftshader"],
|
|
});
|
|
const p = await b.newPage();
|
|
await p.setViewport({ width: 1500, height: 220, deviceScaleFactor: 2 });
|
|
await p.goto("http://localhost:5187/", { waitUntil: "networkidle0", timeout: 20000 }).catch(() => {});
|
|
await new Promise((r) => setTimeout(r, 900));
|
|
|
|
// Versuch: in eine Geschoss-/Grundriss-Ansicht wechseln, damit der Linien-Modus
|
|
// (nur im Grundriss) aktiv ist. Klick auf das erste "grundriss"-View-Icon.
|
|
const grund = await p.$('.view-icon[aria-label]');
|
|
const tb = await p.$(".topbar");
|
|
let box = await tb.boundingBox();
|
|
const H = Math.ceil(box.height) + 10;
|
|
|
|
// 1) Topbar im Ruhezustand.
|
|
await p.screenshot({ path: "scripts/probe-pills-1-topbar.png", clip: { x: 0, y: 0, width: 1500, height: H } });
|
|
|
|
// Diagnose: gibt es einen Linien-Modus-Dropdown-Trigger? (Label-Text.)
|
|
const diag = await p.evaluate(() => {
|
|
const triggers = [...document.querySelectorAll(".tb-dd-trigger")].map((t) => t.textContent.trim());
|
|
const btns = [...document.querySelectorAll(".tb-btn")].map((b) => ({
|
|
text: b.textContent.trim(),
|
|
radius: getComputedStyle(b).borderRadius,
|
|
border: getComputedStyle(b).borderTopWidth,
|
|
bg: getComputedStyle(b).backgroundColor,
|
|
}));
|
|
// Hat irgendein Dropdown die Linien-Modus-Werte Display/Print?
|
|
return { triggers, btns };
|
|
});
|
|
console.log("TRIGGERS:", JSON.stringify(diag.triggers));
|
|
console.log("BTNS:", JSON.stringify(diag.btns, null, 0));
|
|
|
|
// 2) Linien-Modus-Dropdown öffnen (Tastatur, zuverlässig): Trigger mit Label
|
|
// Display/Print fokussieren + Enter.
|
|
const sel = await p.evaluate(() => {
|
|
const t = [...document.querySelectorAll(".tb-dd-trigger")].find((t) => {
|
|
const tx = t.textContent.trim();
|
|
return tx === "Display" || tx === "Print";
|
|
});
|
|
if (!t) return null;
|
|
t.id = "linemode-trigger-probe";
|
|
return "#linemode-trigger-probe";
|
|
});
|
|
console.log("LINEMODE DROPDOWN FOUND:", !!sel);
|
|
if (sel) {
|
|
await p.focus(sel);
|
|
await p.keyboard.press("Enter");
|
|
}
|
|
await new Promise((r) => setTimeout(r, 350));
|
|
// Vollbild, damit das (per Portal an body) gerenderte Popover sichtbar ist.
|
|
await p.screenshot({ path: "scripts/probe-pills-2-linemode-open.png" });
|
|
|
|
// Popover-Inhalt prüfen (Optionen + Häkchen).
|
|
const pop = await p.evaluate(() => {
|
|
const menu = document.querySelector(".tb-dd-menu");
|
|
if (!menu) return null;
|
|
const items = [...menu.querySelectorAll(".tb-dd-item")].map((i) => ({
|
|
label: i.querySelector(".ctx-item-label")?.textContent.trim(),
|
|
checked: !!i.querySelector(".tb-dd-check"),
|
|
}));
|
|
return items;
|
|
});
|
|
console.log("LINEMODE OPTIONS:", JSON.stringify(pop));
|
|
|
|
// Menü schließen.
|
|
await p.keyboard.press("Escape");
|
|
await new Promise((r) => setTimeout(r, 200));
|
|
|
|
// 3) Hover über die erste Aktions-Pille (z. B. 100%), Hover-Optik zeigen.
|
|
const hovered = await p.evaluate(() => {
|
|
const btn = document.querySelector(".tb-btn:not(:disabled)");
|
|
if (!btn) return null;
|
|
btn.scrollIntoView({ block: "center", inline: "center" });
|
|
return true;
|
|
});
|
|
const firstBtn = await p.$(".tb-btn");
|
|
if (firstBtn) {
|
|
const bb = await firstBtn.boundingBox();
|
|
if (bb) await p.mouse.move(bb.x + bb.width / 2, bb.y + bb.height / 2);
|
|
}
|
|
await new Promise((r) => setTimeout(r, 250));
|
|
box = await tb.boundingBox();
|
|
await p.screenshot({ path: "scripts/probe-pills-3-btn-hover.png", clip: { x: 0, y: 0, width: 1500, height: Math.ceil(box.height) + 10 } });
|
|
console.log("HOVERED BTN:", hovered);
|
|
|
|
await b.close();
|