WebAuthn biometric + PWA widget + UI header fixes + mobile responsive

- WebAuthn: register/auth options, device management
- PWA widget page + manifest shortcuts
- Group schedule endpoint (timezones + locations)
- UI #3-#6: compact headers on tasks/calendar/projects/goals
- UI #9: mobile responsive top bars
- webauthn_credentials table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-30 01:54:54 +00:00
parent 6d68b68412
commit 926a584789
14 changed files with 692 additions and 62 deletions

View File

@@ -0,0 +1,25 @@
'use client';
import { useEffect, useState } from 'react';
export default function WidgetPage() {
const [tasks, setTasks] = useState<any[]>([]);
useEffect(() => {
const token = localStorage.getItem('taskteam_token');
if (token) {
fetch('/api/v1/tasks?limit=5&status=pending', { headers: { Authorization: 'Bearer ' + token } })
.then(r => r.json()).then(d => setTasks(d.data || []));
}
}, []);
return (
<div style={{ padding: 8, background: '#0F172A', minHeight: '100vh', color: 'white', fontSize: 14 }}>
<div style={{ fontWeight: 'bold', marginBottom: 8 }}>Task Team</div>
{tasks.map(t => (
<div key={t.id} style={{ padding: '6px 0', borderBottom: '1px solid #1E293B', display: 'flex', gap: 8, alignItems: 'center' }}>
<span style={{ width: 8, height: 8, borderRadius: '50%', background: t.status === 'in_progress' ? '#F59E0B' : '#6B7280', flexShrink: 0 }} />
<span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{t.title}</span>
</div>
))}
{!tasks.length && <div style={{ opacity: 0.5 }}>Zadne ukoly</div>}
</div>
);
}