// 自绘托盘菜单(248px、blur、hover accent 反白),规格见 doc/frontend-design.html 4.2 import { useEffect, useState } from 'react'; import { createRoot } from 'react-dom/client'; import '@dudu/design/styles.css'; import { Badge } from '@dudu/design/components/core/Badge'; import { invoke, listen } from '../shared/tauri'; import { setThemePref } from '../shared/theme'; function Item({ children, right, onClick }) { const [hover, setHover] = useState(false); return (
setHover(true)} onMouseLeave={() => setHover(false)} onClick={onClick} style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 18, padding: '7px 14px', cursor: 'default', fontSize: 'var(--text-sm)', background: hover ? 'var(--accent)' : 'transparent', color: hover ? 'var(--text-on-accent)' : 'var(--text-1)', transition: 'background var(--dur-fast) var(--ease-out)', }}> {children} {right && {right}}
); } const Sep = () =>
; function TrayApp() { const [me, setMe] = useState(null); const [paused, setPaused] = useState(false); useEffect(() => { // 启动应用主题:深色模式下托盘菜单不再停在浅色。 invoke('get_settings').then((s) => s && setThemePref(s.theme)); invoke('fetch_me').then((m) => m && setMe(m)); invoke('is_paused').then((p) => setPaused(!!p)); listen('account', ({ payload }) => setMe(payload)); }, []); const minutes = me ? Math.floor(me.balance_seconds / 60) : 0; return (
dudu 语音输入 {paused ? '已暂停' : '已就绪'}
按住说话 invoke('toggle_pause').then((p) => setPaused(!!p))}> {paused ? '继续使用' : '暂停使用'} invoke('open_settings')}>设置… 时长余额 invoke('open_login')}> {me ? `账号 ${me.nickname_masked}` : '微信登录'} invoke('check_update')}>检查更新 invoke('quit_app')}>退出 dudu
); } createRoot(document.getElementById('root')).render();