Dateien nach "frontend/src" hochladen
This commit is contained in:
@@ -459,10 +459,10 @@ function QuickLinks({ toast, mobile }) {
|
||||
|
||||
<a href={l.url} target="_blank" rel="noopener noreferrer"
|
||||
|
||||
style={{ display:'flex', flexDirection:'column', alignItems:'center', gap:4,
|
||||
style={{ display:'flex', flexDirection:'column', alignItems:'center', justifyContent:'center', gap:4,
|
||||
padding:'10px 14px', background:'rgba(255,255,255,0.04)',
|
||||
border:'1px solid rgba(255,255,255,0.08)', borderRadius:10,
|
||||
textDecoration:'none', minWidth:60, cursor:'pointer' }}>
|
||||
textDecoration:'none', minWidth:60, height:76, cursor:'pointer' }}>
|
||||
{l.icon && l.icon.startsWith('http')
|
||||
? <img src={l.icon} alt="" style={{width:26,height:26,objectFit:'contain'}} onError={e=>e.target.style.display='none'}/>
|
||||
: <span style={{ fontSize:26 }}>{l.icon}</span>}
|
||||
@@ -609,14 +609,14 @@ function Notepad({ toast }) {
|
||||
return (
|
||||
<div style={{ ...S.card }}>
|
||||
<button onClick={()=>setIsOpen(v=>!v)} style={{width:'100%',background:'transparent',border:'none',
|
||||
display:'flex',alignItems:'center',gap:8,cursor:'pointer',padding:0}}>
|
||||
<div style={S.head}>NOTIZEN</div>
|
||||
{!isOpen && content.length > 0 && (
|
||||
<span style={{color:'rgba(255,255,255,0.45)',fontFamily:'monospace',fontSize:10}}>
|
||||
{content.length} Zeichen
|
||||
</span>
|
||||
)}
|
||||
<span style={{color:'rgba(255,255,255,0.4)',fontSize:11,display:'inline-block',marginLeft:'auto',
|
||||
display:'flex',justifyContent:'space-between',alignItems:'center',cursor:'pointer',padding:0}}>
|
||||
<div style={{display:'flex',alignItems:'center',gap:8}}>
|
||||
<div style={S.head}>NOTIZEN</div>
|
||||
{!isOpen && content.length > 0 && (
|
||||
<span style={{color:'#4ecdc4',fontFamily:'monospace',fontSize:10}}>({content.length})</span>
|
||||
)}
|
||||
</div>
|
||||
<span style={{color:'rgba(255,255,255,0.4)',fontSize:11,display:'inline-block',
|
||||
transform:isOpen?'rotate(90deg)':'rotate(0)',transition:'transform 0.2s'}}>▶</span>
|
||||
</button>
|
||||
{isOpen && <div style={{ color: saved ? 'rgba(78,205,196,0.5)' : 'rgba(255,230,109,0.6)',
|
||||
@@ -1173,13 +1173,16 @@ export default function App() {
|
||||
const [updateInfo,setUpdateInfo]=useState(null);
|
||||
const [showUpd,setShowUpd]=useState(false);
|
||||
|
||||
const [authChecked, setAuthChecked] = useState(false);
|
||||
useEffect(()=>{
|
||||
const token=localStorage.getItem('sk_token');
|
||||
if(!token)return;
|
||||
try{const p=JSON.parse(atob(token.split('.')[1]));
|
||||
if(p.exp*1000>Date.now())setUser({id:p.id,username:p.username,role:p.role});
|
||||
else localStorage.removeItem('sk_token');
|
||||
}catch{localStorage.removeItem('sk_token');}
|
||||
if(token){
|
||||
try{const p=JSON.parse(atob(token.split('.')[1]));
|
||||
if(p.exp*1000>Date.now())setUser({id:p.id,username:p.username,role:p.role});
|
||||
else localStorage.removeItem('sk_token');
|
||||
}catch{localStorage.removeItem('sk_token');}
|
||||
}
|
||||
setAuthChecked(true);
|
||||
},[]);
|
||||
|
||||
useEffect(()=>{
|
||||
@@ -1196,6 +1199,7 @@ export default function App() {
|
||||
},[]);
|
||||
|
||||
if(splash) return <SplashScreen onDone={()=>{ setSplash(false); sessionStorage.setItem('splash_shown','1'); }}/>;
|
||||
if(!authChecked) return <div style={{background:'#0d0d0f',minHeight:'100vh'}}/>;
|
||||
if(!user) return <Login onLogin={u=>setUser(u)}/>;
|
||||
|
||||
const activeTool = TOOLS.find(t=>t.id===active);
|
||||
|
||||
@@ -215,10 +215,12 @@ export default function CalendarWidget() {
|
||||
<span style={{ color:'#fff', fontFamily:"'Space Mono',monospace", fontSize:13, fontWeight:700 }}>
|
||||
{MONTHS[cur.m]} {cur.y}
|
||||
</span>
|
||||
<button onClick={() => { setCur({ y:today.getFullYear(), m:today.getMonth() }); setSelected(new Date()); }}
|
||||
style={{ background:'rgba(78,205,196,0.15)', border:'1px solid rgba(78,205,196,0.3)',
|
||||
borderRadius:6, color:'#4ecdc4', fontFamily:'monospace', fontSize:9,
|
||||
cursor:'pointer', padding:'2px 8px' }}>Heute</button>
|
||||
{(cur.m !== today.getMonth() || cur.y !== today.getFullYear()) && (
|
||||
<button onClick={() => { setCur({ y:today.getFullYear(), m:today.getMonth() }); setSelected(new Date()); }}
|
||||
style={{ background:'rgba(78,205,196,0.15)', border:'1px solid rgba(78,205,196,0.3)',
|
||||
borderRadius:6, color:'#4ecdc4', fontFamily:'monospace', fontSize:9,
|
||||
cursor:'pointer', padding:'2px 8px' }}>Heute</button>
|
||||
)}
|
||||
</div>
|
||||
<button onClick={nextMonth} style={{ background:'transparent', border:'none', color:'rgba(255,255,255,0.5)',
|
||||
cursor:'pointer', fontSize:18, padding:'0 6px' }}>›</button>
|
||||
|
||||
Reference in New Issue
Block a user