// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2026 Karim Gabriele Varano import { useEffect, useState } from 'react' import { onMessage, notifyReady } from './lib/rhinoBridge' import { BarToggle, BarCombo, BAR_H } from './components/BarControls' function send(type, payload = {}) { if (!window.RHINO_MODE) { console.log('[AusschnittSettings] →', type, payload); return } document.title = 'RHINOMSG::' + JSON.stringify({ type, payload }) } const pillInput = { height: BAR_H, background: 'var(--bg-input)', border: '1px solid var(--border)', borderRadius: 999, color: 'var(--text-primary)', fontSize: 11, fontFamily: 'var(--font)', padding: '0 10px', outline: 'none', boxSizing: 'border-box', } function Field({ label, hint, children }) { return (
{label}
{children}
{hint && ( {hint} )}
) } function SectionLabel({ children }) { return (
{children}
) } export default function AusschnittSettingsApp() { const initial = (typeof window !== 'undefined' && window.PANEL_PARAMS) || {} const [snap, setSnap] = useState(initial.snap || {}) const [displayModes, setDisplayModes] = useState(initial.displayModes || []) const [overridesPresets, setOverridesPresets] = useState(initial.overridesPresets || []) const [layerKombis, setLayerKombis] = useState(initial.layerKombis || []) useEffect(() => { onMessage('AUSSCHNITT_SETTINGS_STATE', (p) => { if (p.snap) setSnap(p.snap) if (Array.isArray(p.displayModes)) setDisplayModes(p.displayModes) if (Array.isArray(p.overridesPresets)) setOverridesPresets(p.overridesPresets) if (Array.isArray(p.layerKombis)) setLayerKombis(p.layerKombis) }) notifyReady() const blockContext = (ev) => ev.preventDefault() document.addEventListener('contextmenu', blockContext) return () => document.removeEventListener('contextmenu', blockContext) }, []) const set = (patch) => setSnap(s => ({ ...s, ...patch })) const saveAndClose = () => { send('SAVE', { settings: { scale: snap.scale || '', displayMode: snap.displayMode || null, displayModeName: snap.displayModeName || null, applyOverrides: !!snap.applyOverrides, overridesEnabled: !!snap.overridesEnabled, overridesPreset: snap.overridesPreset || '', layerCombination: snap.layerCombination || '', darstellung: snap.darstellung || '', }, }) } return (
{/* Body */}
set({ scale: ev.target.value })} placeholder="1:50" style={{ ...pillInput, flex: 1, fontFamily: 'var(--font-mono)', minWidth: 0 }} /> set({ darstellung: v })}> { const dm = displayModes.find(d => d.id === v) set({ displayMode: v || null, displayModeName: dm ? dm.name : null, }) }}> {displayModes.map(dm => ( ))} Grafische Overrides set({ applyOverrides: ev.target.checked })} style={{ marginRight: 6 }} /> {snap.applyOverrides ? 'Overrides werden gesetzt' : 'Aktueller Overrides-Zustand bleibt'} {snap.applyOverrides && ( <> set({ overridesEnabled: true })} /> set({ overridesEnabled: false })} /> set({ overridesPreset: v })} disabled={!snap.overridesEnabled}> {overridesPresets.map(name => ( ))} )} Ebenenkombination set({ layerCombination: v })}> {layerKombis.map(name => ( ))}
{/* Footer */}
send('CANCEL', {})} />
) }