Projekt-Settings-Dialog + Library Phase A + Material-Merger

- Project-Settings-Dialog (Voreinstellungen Geschoss/Schnitt + Material-Editor)
  ueber Zahnrad-Icon in Oberleiste; Defaults werden in schnitte.pick_schnitt
  + GeschossManager als Vorgabe genommen, pro-Element-Werte unangetastet
- Dossier-Library Phase A (lokal, read-only): rhino/library.py + LibraryBrowser
  Satellite; Seed-Manifest unter ~/Library/Application Support/Dossier/library/
- Material-Merger: _get_all_materials(doc) merged builtin _MATERIAL_LIBRARY
  mit Projekt-Settings-Materialien (inkl. Library-Imports); Wand-Erstellung,
  Sub-Layer-Anlage + Elemente-Material-Dropdown ziehen jetzt aus dem Merge

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-24 02:19:09 +02:00
parent ee01c7ebdc
commit a308ba62d2
13 changed files with 1087 additions and 56 deletions
+32
View File
@@ -0,0 +1,32 @@
import { useState, useEffect } from 'react'
import LibraryBrowser from './components/LibraryBrowser'
import { notifyReady, onMessage, send } from './lib/rhinoBridge'
export default function LibraryApp() {
const [manifest, setManifest] = useState({ items: [] })
const [importedIds, setImportedIds] = useState([])
const [libraryRoot, setLibraryRoot] = useState('')
useEffect(() => {
onMessage('LIBRARY_STATE', ({ manifest, importedIds, libraryRoot }) => {
if (manifest) setManifest(manifest)
if (importedIds) setImportedIds(importedIds)
if (libraryRoot) setLibraryRoot(libraryRoot)
})
notifyReady()
const blockContext = (ev) => ev.preventDefault()
document.addEventListener('contextmenu', blockContext)
return () => document.removeEventListener('contextmenu', blockContext)
}, [])
return (
<LibraryBrowser
manifest={manifest}
importedIds={importedIds}
libraryRoot={libraryRoot}
onImport={(id) => send('IMPORT_ITEM', { id })}
onReload={() => send('RELOAD', {})}
onClose={() => send('CLOSE', {})}
/>
)
}