// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2026 Karim Gabriele Varano import { useEffect, useState } from 'react' import Icon from './components/Icon' import { notifyReady, runRhinoCommand } from './lib/rhinoBridge' // Anzeige-Modus der Kacheln, geteilt mit Elemente-Panel via localStorage. const TILE_MODE_KEY = 'dossier_tile_mode' // 'both' | 'icon' | 'text' function readTileMode() { try { return localStorage.getItem(TILE_MODE_KEY) || 'both' } catch { return 'both' } } function writeTileMode(m) { try { localStorage.setItem(TILE_MODE_KEY, m) } catch { /* WebView ohne Storage */ } } const TILE_MIN_COL = { icon: 40, text: 64, both: 86 } const TILE_MIN_H = { icon: 32, text: 30, both: 32 } // Tool-Definitionen: [icon, label, rhino-command, tooltip] // Material-Symbol-Namen siehe https://fonts.google.com/icons const TOOLS = { '2D Zeichnen': [ ['horizontal_rule', 'Line', '_Line', 'Linie zwischen zwei Punkten'], ['polyline', 'Polyline', '_Polyline', 'Polylinie'], ['rectangle', 'Rect', '_Rectangle', 'Rechteck'], ['radio_button_unchecked', 'Circle', '_Circle', 'Kreis'], ['network_intelligence', 'Arc', '_Arc', 'Bogen'], ['gesture', 'Curve', '_Curve', 'Freie Kurve (Spline)'], ['text_fields', 'Text', '_Text', 'Text'], ['grid_view', 'Hatch', '_Hatch', 'Schraffur'], ['straighten', 'Dim', '_Dim', 'Linearbemassung'], ], '2D Editieren': [ ['open_with', 'Move', '_Move', 'Verschieben'], ['content_copy', 'Copy', '_Copy', 'Kopieren'], ['rotate_right', 'Rotate', '_Rotate', 'Drehen'], ['aspect_ratio', 'Scale', '_Scale', 'Skalieren'], ['flip', 'Mirror', '_Mirror', 'Spiegeln'], ['padding', 'Offset', '_Offset', 'Parallelversatz'], ['content_cut', 'Trim', '_Trim', 'Stutzen'], ['swipe_right_alt', 'Extend', '_Extend', 'Verlängern'], ['link', 'Join', '_Join', 'Verbinden'], ['scatter_plot', 'Explode', '_Explode', 'Auflösen'], ['rounded_corner', 'Fillet', '_Fillet', 'Verrunden (Ecke abrunden)'], ['apps', 'Array', '_ArrayPolar','Polar-Array'], ], '3D Modellieren': [ ['vertical_align_top','Extrude', '_ExtrudeCrv', 'Kurve zu 3D extrudieren'], ['square', 'Box', '_Box', 'Quader'], ['join_inner', 'Union', '_BooleanUnion', 'Boolean-Vereinigung'], ['remove', 'Diff', '_BooleanDifference', 'Boolean-Differenz'], ['gradient', 'Intersect','_BooleanIntersection','Boolean-Schnittmenge'], ['roofing', 'Cap', '_Cap', 'Planare Loecher schliessen'], ['cut', 'Section', '_Section', 'Schnittlinien erzeugen'], ['unfold_more', 'Loft', '_Loft', 'Loft (Kurven verbinden)'], ], 'Auswahl': [ ['add_link', 'Chain', '_SelChain', 'Tangentiale Kurvenkette wählen'], ['filter_alt', 'Dup', '_SelDup', 'Doppelte Objekte wählen'], ['loop', 'Closed', '_SelClosedCrv', 'Geschlossene Kurven wählen'], ['compare_arrows', 'Invert', '_Invert', 'Auswahl invertieren'], ['select_all', 'All', '_SelAll', 'Alle auswählen'], ['deselect', 'None', '_SelNone', 'Auswahl aufheben'], ], } // --------------------------------------------------------------------------- function ToolTile({ icon, label, cmd, tip, mode }) { const showIcon = mode !== 'text' const showLabel = mode !== 'icon' return ( ) } function GridSection({ label, mode, children }) { return (