diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 066c384..229d783 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1584,6 +1584,8 @@ const SEARCH_TOOL_INDEX = [ {type:'tool',label:'Linkliste',icon:'๐Ÿ”—',sub:'Werkzeuge',id:'linkliste',keywords:['link','url','lesezeichen','bookmark','webseite']}, {type:'tool',label:'Code-Schnipsel',icon:'๐Ÿ“„',sub:'Werkzeuge',id:'codeschnipsel',keywords:['code','snippet','skript','programmierung','source']}, {type:'tool',label:'CAD-Skizzen',icon:'๐Ÿ“',sub:'Werkzeuge',id:'skizze',keywords:['cad','skizze','zeichnung','sketch']}, + {type:'tool',label:'Kanban',icon:'๐Ÿ—‚',sub:'Werkzeuge',id:'kanban',keywords:['kanban','board','aufgaben','task','todo','karte','spalte','planung']}, + {type:'tool',label:'Whiteboard',icon:'๐Ÿ–Š',sub:'Werkzeuge',id:'whiteboard',keywords:['whiteboard','zeichnen','canvas','board','draw','skizze','malen','zeichen']}, {type:'tool',label:'Dev-Tools',icon:'๐Ÿ”ง',sub:'Werkzeuge',id:'devtools',keywords:['entwickler','developer','tools','werkzeuge']}, {type:'tool',label:'Paywall-Killer',icon:'๐Ÿ”“',sub:'Werkzeuge',id:'paywallkiller',keywords:['paywall','archiv','archive','artikel','zeitung','bild','waz','heise','spiegel','zeit','bypass','umgehen','lesen','gesperrt','bezahlschranke']}, {type:'tool',label:'Media',icon:'๐ŸŽฌ',sub:'Freizeit',id:'media',keywords:['kino','film','movie','streaming','demnรคchst','favoriten','cinema']}, diff --git a/frontend/src/tools/linkliste.jsx b/frontend/src/tools/linkliste.jsx index e2624ab..3614c80 100644 --- a/frontend/src/tools/linkliste.jsx +++ b/frontend/src/tools/linkliste.jsx @@ -10,6 +10,8 @@ const TOOL_ENTRIES = [ { url:'tool://bestellungen', label:'๐Ÿ“ฆ Bestellungen', group:'3D-Druck' }, { url:'tool://kalkulator3d', label:'๐Ÿงฎ Kostenrechner', group:'3D-Druck' }, { url:'tool://kanban', label:'๐Ÿ—‚ Kanban', group:'Werkzeuge' }, + { url:'tool://kanban', label:'๐Ÿ—‚ Kanban', group:'Werkzeuge' }, + { url:'tool://whiteboard', label:'๐Ÿ–Š Whiteboard', group:'Werkzeuge' }, { url:'tool://dateien', label:'๐Ÿ“ Dateien', group:'Werkzeuge' }, { url:'tool://nachrichten', label:'๐Ÿ’ฌ Nachrichten', group:'Werkzeuge' }, { url:'tool://linkliste', label:'๐Ÿ”— Linkliste', group:'Werkzeuge' }, diff --git a/frontend/src/tools/whiteboard.jsx b/frontend/src/tools/whiteboard.jsx index 3a036f9..c5c52c1 100644 --- a/frontend/src/tools/whiteboard.jsx +++ b/frontend/src/tools/whiteboard.jsx @@ -178,7 +178,7 @@ function renderElements(ctx, elements, vp, selectedId, forExport) { // Offscreen-Export (ohne Auswahl-Rahmen, original Viewport) function exportToPng(elements, title) { - // Bounding-Box aller Elemente berechnen + if (!elements?.length) return; // Nichts zu exportieren let minX=Infinity,minY=Infinity,maxX=-Infinity,maxY=-Infinity; for (const el of elements) { const b = getBounds(el); if (!b) continue; @@ -194,7 +194,9 @@ function exportToPng(elements, title) { const a = document.createElement('a'); a.href = offscreen.toDataURL('image/png'); a.download = (title||'whiteboard').replace(/[^\w\s-]/g,'').trim()+'.png'; + document.body.appendChild(a); a.click(); + document.body.removeChild(a); } // โ”€โ”€ Share-Modal โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -681,8 +683,7 @@ export default function Whiteboard({ toast, mobile }) {
-
+ }} style={S.btn('#4ECDC4',true)}>โœ“ + + + + ) : ( + // Desktop: direkt am Klick-Punkt, Canvas-relative Position +
+ { + if(e.key==='Enter'){ + const v=e.target.value; setTextInput(null); + if(v?.trim()) pushElement({id:getId(),type:'text',color,fontSize:FONT_SIZES[fontSize],text:v,x:textInput.x,y:textInput.y}); + } + if(e.key==='Escape') setTextInput(null); + }} + onBlur={e=>{ + const v=e.target.value; setTextInput(null); + if(v?.trim()) pushElement({id:getId(),type:'text',color,fontSize:FONT_SIZES[fontSize],text:v,x:textInput.x,y:textInput.y}); + }} + style={{background:'rgba(0,0,0,0.7)',border:'none', + outline:`1px dashed ${color}`,borderRadius:4,padding:'2px 6px', + color,fontSize:FONT_SIZES[fontSize],fontFamily:'monospace',minWidth:120}}/> +
+ ) )} {/* โ”€โ”€ Topbar โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */}