diff --git a/src/panels/AttributesPanel.tsx b/src/panels/AttributesPanel.tsx
index c525dc9..55b0549 100644
--- a/src/panels/AttributesPanel.tsx
+++ b/src/panels/AttributesPanel.tsx
@@ -30,6 +30,16 @@ import type { AttributeSource } from "../model/types";
import { usePanelHost } from "./host";
import { Dropdown } from "../ui/Dropdown";
import { ColorHexField } from "../ui/ColorHexField";
+// Element-spezifische Attribut-Abschnitte (Wand/Decke/Öffnung/Treppe/Raum) —
+// aus ObjectInfoPanel hierher verschoben (Ribbon Phase 3: ObjectInfo trägt nur
+// noch Bezugspunkt + Masse).
+import {
+ WallSection,
+ CeilingSection,
+ OpeningSection,
+ StairSection,
+ RoomSection,
+} from "./ObjectInfoPanel";
/** UI-Zustand des 3-Optionen-Quellen-Dropdowns (nicht 1:1 das Modell-Feld:
* „custom" ist abgeleitet aus „ist ein expliziter Wert gesetzt?", nicht
@@ -292,6 +302,15 @@ export function AttributesPanel() {
{t("attr.height")}
{formatM(bboxH)}
+
+ {/* Element-spezifische Abschnitte (aus ObjectInfo hierher verschoben) —
+ nur der jeweils passende erscheint. Nutzen weiter die `objinfo-*`-
+ Darstellung + die Host-Handler. */}
+ {sel.wall && }
+ {sel.ceiling && }
+ {sel.opening && }
+ {sel.stair && }
+ {sel.room && }
);
}
diff --git a/src/panels/ObjectInfoPanel.tsx b/src/panels/ObjectInfoPanel.tsx
index 05a4a60..0314d6f 100644
--- a/src/panels/ObjectInfoPanel.tsx
+++ b/src/panels/ObjectInfoPanel.tsx
@@ -82,40 +82,14 @@ export function ObjectInfoPanel() {
host.onResizeSelection(nextWidth, nextHeight, anchor);
}
- const wall = sel.wall;
- const ceiling = sel.ceiling;
- const opening = sel.opening;
- const stair = sel.stair;
- const room = sel.room;
-
return (
- {/* Kopfzeile: Typ + Kategorie. Bei einer Wand rechts oben das
- Referenzlinie-Dropdown (wo die Achse über die Dicke liegt). */}
+ {/* Kopfzeile: Typ + Kategorie. Die element-spezifischen Attribut-Abschnitte
+ (Wand/Decke/Öffnung/Treppe/Raum) liegen jetzt im Attribute-Panel;
+ ObjectInfo trägt nur noch Bezugspunkt + Masse. */}
{t(`objinfo.kind.${sel.kind}`)}
- {wall ? (
-
-
- {t("objinfo.wall.refLine")}
-
-
- host.onSetWallReferenceLine(v as WallReferenceLine)
- }
- options={[
- { value: "left", label: t("objinfo.wall.refLine.left") },
- { value: "center", label: t("objinfo.wall.refLine.center") },
- { value: "right", label: t("objinfo.wall.refLine.right") },
- ]}
- title={t("objinfo.wall.refLine")}
- width={120}
- />
-
- ) : (
-
{sel.categoryCode}
- )}
+
{sel.categoryCode}
@@ -174,21 +148,9 @@ export function ObjectInfoPanel() {
value={height}
onCommit={(h) => commitSize(width, h)}
/>
-
- {/* ── Wand-Abschnitt (nur bei genau einer Wand) ────────────────────── */}
- {wall &&
}
-
- {/* ── Decken-Abschnitt (nur bei genau einer Decke) ─────────────────── */}
- {ceiling &&
}
-
- {/* ── Öffnungs-Abschnitt (nur bei genau einer Öffnung) ─────────────── */}
- {opening &&
}
-
- {/* ── Treppen-Abschnitt (nur bei genau einer Treppe) ───────────────── */}
- {stair &&
}
-
- {/* ── Raum-Abschnitt (nur bei genau einem Raum) ────────────────────── */}
- {room &&
}
+ {/* Die element-spezifischen Abschnitte (Wand/Decke/Öffnung/Treppe/Raum)
+ werden jetzt im Attribute-Panel gerendert (AttributesPanel importiert
+ die exportierten *Section-Komponenten). */}
);
}
@@ -197,7 +159,7 @@ export function ObjectInfoPanel() {
// Editierbarer Name, SIA-416-Kategorie (5 Blatt-Kategorien), abgeleitete Fläche
// + Umfang (read-only), Referenzgeschoss, sowie ein Button, der den Rich-Text-
// Stempel-Editor öffnet. Alle Werte/Setter über den Host.
-function RoomSection({
+export function RoomSection({
room,
roomId,
host,
@@ -269,7 +231,7 @@ function RoomSection({
// ── Treppen-Attribut-Abschnitt ───────────────────────────────────────────────
// Grundform (gerade/L/Wendel), Laufbreite, Stufenanzahl, Steighöhe (+ abgeleitete
// Steigungshöhe/Auftrittstiefe), Laufrichtung; Referenzgeschoss + UK/OK read-only.
-function StairSection({
+export function StairSection({
stair,
host,
}: {
@@ -385,7 +347,7 @@ function StairSection({
// ── Öffnungs-Attribut-Abschnitt ──────────────────────────────────────────────
// Art (Fenster/Tür), Wirts-Wand, Position/Breite/Höhe/Brüstung, bei Türen
// zusätzlich Anschlag/Aufschlag/Richtung/Winkel; UK/OK read-only.
-function OpeningSection({
+export function OpeningSection({
opening,
host,
}: {
@@ -557,7 +519,7 @@ function OpeningSection({
// ── Decken-Attribut-Abschnitt ────────────────────────────────────────────────
// Aufbau-Typ (einschichtig/mehrschichtig), Dicke/Preset, Referenzgeschoss +
// OK-Bindung, Fläche. Alle Werte/Setter über den Host.
-function CeilingSection({
+export function CeilingSection({
ceiling,
host,
}: {
@@ -670,7 +632,7 @@ function CeilingSection({
// ── Wand-Attribut-Abschnitt ──────────────────────────────────────────────────
// Aufbau-Typ (einschichtig/mehrschichtig), Dicke/Preset, Referenzgeschoss +
// Oberverknüpfung, UK/OK je Modus-Umschalter. Alle Werte/Setter über den Host.
-function WallSection({
+export function WallSection({
wall,
host,
}: {
@@ -701,6 +663,23 @@ function WallSection({
{t("objinfo.wall.section")}
+ {/* Referenzlinie (wo die Achse über die Dicke liegt) — früher im ObjectInfo-
+ Kopf, jetzt hier bei den Wand-Attributen. */}
+
+ {t("objinfo.wall.refLine")}
+ host.onSetWallReferenceLine(v as WallReferenceLine)}
+ options={[
+ { value: "left", label: t("objinfo.wall.refLine.left") },
+ { value: "center", label: t("objinfo.wall.refLine.center") },
+ { value: "right", label: t("objinfo.wall.refLine.right") },
+ ]}
+ title={t("objinfo.wall.refLine")}
+ width={120}
+ />
+
+
{/* Aufbau-Typ-Segment. */}
{t("objinfo.wall.buildup")}