feat(release): prepare 1.1.0 candidate

This commit is contained in:
Yun Chan 2026-08-29 18:33:45 +09:00
parent 5a34f66981
commit 5205dcdfa9
736 changed files with 115667 additions and 12203 deletions

View file

@ -19,14 +19,12 @@ import {
Pencil,
CircleCheck,
Play,
Link,
Zap,
ArrowRight,
Sparkles,
CheckCircle2,
Mic,
Cpu,
CornerDownRight,
ClipboardCopy,
} from 'lucide-react'
import {
@ -38,8 +36,7 @@ import {
TactileBadge,
} from '@d3ro/ui/components/ds'
import { PageHeader, EmptyStateCard } from '../components/shared'
import { isImeComposingEvent } from '../utils/keyboard'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { d3roPalette, d3roFontSans, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import { TemplateSection } from '../components/TemplateSection'
@ -241,7 +238,7 @@ export function CommandsPage(): React.ReactElement {
sx={{
fontFamily: d3roFontSans,
fontSize: '18px',
fontWeight: 700,
fontWeight: 500,
color: activeInstruction ? d3roPalette.text.primary : d3roPalette.text.disabled,
}}
>
@ -431,7 +428,7 @@ export function CommandsPage(): React.ReactElement {
<Box
sx={{
fontSize: d3roTypo.heading.size,
fontWeight: 700,
fontWeight: 500,
fontFamily: d3roFontSans,
color: isActive ? d3roPalette.accent.light : d3roPalette.text.primary,
mb: 0.5,
@ -571,7 +568,7 @@ export function CommandsPage(): React.ReactElement {
},
}}
>
<DialogTitle sx={{ fontWeight: 700, fontFamily: d3roFontSans, color: d3roPalette.text.primary, pt: 2, px: 2.5 }}>
<DialogTitle sx={{ fontWeight: 500, fontFamily: d3roFontSans, color: d3roPalette.text.primary, pt: 2, px: 2.5 }}>
{editId ? t('commands.editTitle') : t('commands.addTitle')}
</DialogTitle>
<DialogContent sx={{ px: 2.5 }}>

View file

@ -3,7 +3,7 @@
// High-End Agency Architecture: DoubleBezel Hero / 4-Tile Bento / Multi-Engine Hub / Telemetry
import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react'
import { Box, Button, Typography, Tooltip } from '@mui/material'
import { Box, Typography } from '@mui/material'
import {
Mic,
BookOpen,
@ -15,7 +15,6 @@ import {
Star,
Check,
Cpu,
Sparkles,
Zap,
Activity,
Radio,
@ -34,7 +33,7 @@ import {
AudioVisualizerBar,
} from '@d3ro/ui/components/ds'
import { EmptyStateCard, HistoryEntryCard } from '../components/shared'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roRadius, d3roShadow, d3roTypo, typoSx } from '@d3ro/ui/theme'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roRadius, d3roShadow, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import { formatRecordingTime, formatRecordingTimeUnit, formatNumber, getDateKey } from '../utils/formatters'
import { formatHotkeyLabel } from '../utils/format-hotkey'
@ -286,7 +285,7 @@ export function DashboardPage(): React.ReactElement {
boxShadow: d3roShadow.inset,
fontFamily: d3roFontMono,
fontSize: '12px',
fontWeight: 700,
fontWeight: 500,
color: d3roPalette.accent.light,
letterSpacing: '0.04em',
}}
@ -332,7 +331,7 @@ export function DashboardPage(): React.ReactElement {
sx={{
fontFamily: d3roFontSans,
fontSize: '34px',
fontWeight: 700,
fontWeight: 500,
lineHeight: 1,
color: d3roPalette.text.primary,
fontVariantNumeric: 'tabular-nums',
@ -402,7 +401,7 @@ export function DashboardPage(): React.ReactElement {
sx={{
fontFamily: d3roFontSans,
fontSize: '26px',
fontWeight: 700,
fontWeight: 500,
lineHeight: 1,
color: d3roPalette.text.primary,
fontVariantNumeric: 'tabular-nums',
@ -492,7 +491,7 @@ export function DashboardPage(): React.ReactElement {
sx={{
fontFamily: d3roFontSans,
fontSize: '28px',
fontWeight: 800,
fontWeight: 600,
color: d3roPalette.text.primary,
lineHeight: 1,
letterSpacing: '-0.02em',

View file

@ -3,15 +3,13 @@
import React, { useState, useEffect, useCallback, useRef } from 'react'
import { Box, TextField, Dialog, DialogTitle, DialogContent, DialogActions, IconButton, Tooltip } from '@mui/material'
import { Plus, Trash2, Pencil, BookA, Sparkles } from 'lucide-react'
import { Plus, Trash2, Pencil, BookA } from 'lucide-react'
import { MetalCard, PhosphorText, PhysicalButton, TactileBadge } from '@d3ro/ui/components/ds'
import { PageHeader, SearchInput, EmptyStateCard } from '../components/shared'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { d3roPalette, d3roFontSans, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import type { DictionaryEntry, DictionaryPage as DictPageData } from '@d3ro/core/types'
const PAGE_SIZE = 50
export function DictionaryPage(): React.ReactElement {
const { t } = useI18n()
const [data, setData] = useState<DictPageData | null>(null)
@ -23,7 +21,6 @@ export function DictionaryPage(): React.ReactElement {
const [formPronunciation, setFormPronunciation] = useState('')
const [saving, setSaving] = useState(false)
const isSavingRef = useRef(false)
const isDeletingRef = useRef(false)
const loadData = useCallback(async () => {
setLoading(true)
@ -77,17 +74,6 @@ export function DictionaryPage(): React.ReactElement {
}
}
const handleDelete = async (id: string) => {
if (isDeletingRef.current) return
isDeletingRef.current = true
try {
await window.electronAPI.dictionary.delete({ id })
loadData()
} finally {
isDeletingRef.current = false
}
}
return (
<Box sx={{ maxWidth: 1060, mx: 'auto', p: { xs: 2.5, md: 4 }, pb: 10 }}>
<PageHeader
@ -131,7 +117,7 @@ export function DictionaryPage(): React.ReactElement {
<Box
sx={{
fontSize: d3roTypo.heading.size,
fontWeight: 700,
fontWeight: 500,
fontFamily: d3roFontSans,
color: d3roPalette.text.primary,
}}
@ -212,7 +198,7 @@ export function DictionaryPage(): React.ReactElement {
},
}}
>
<DialogTitle sx={{ fontWeight: 700, fontFamily: d3roFontSans, color: d3roPalette.text.primary, pt: 2, px: 2.5 }}>
<DialogTitle sx={{ fontWeight: 500, fontFamily: d3roFontSans, color: d3roPalette.text.primary, pt: 2, px: 2.5 }}>
{editId ? t('dictionary.editTitle') : t('dictionary.addTitle')}
</DialogTitle>
<DialogContent sx={{ px: 2.5 }}>

View file

@ -2,10 +2,10 @@
// High-End Agency Dictation History & Memory Timeline
import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react'
import { Box, Chip, IconButton, Tooltip } from '@mui/material'
import { Download, Trash2, Tag as TagIcon, Clock, Filter } from 'lucide-react'
import { PhosphorText, TactileBadge, DoubleBezelCard, PhysicalButton } from '@d3ro/ui/components/ds'
import { d3roPalette, d3roTypo, d3roFontMono, d3roFontSans, d3roRadius } from '@d3ro/ui/theme'
import { Box, IconButton, Tooltip } from '@mui/material'
import { Download, Trash2, Clock, Filter } from 'lucide-react'
import { PhosphorText, TactileBadge, PhysicalButton } from '@d3ro/ui/components/ds'
import { d3roPalette, d3roTypo } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import { getDateKey } from '../utils/formatters'
import { EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard } from '../components/shared'

View file

@ -3,11 +3,11 @@
import React, { useState, useEffect, useCallback, useRef } from 'react'
import { Box, TextField, IconButton, Tooltip, LinearProgress } from '@mui/material'
import { Plus, Trash2, RefreshCw, Search, Send, FileText, Database, Sparkles, CheckCircle2 } from 'lucide-react'
import { MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel, DoubleBezelCard, TactileBadge } from '@d3ro/ui/components/ds'
import { Plus, Trash2, RefreshCw, Search, Send, FileText, Database, Sparkles } from 'lucide-react'
import { MetalCard, PhosphorText, Led, PhysicalButton, DoubleBezelCard, TactileBadge } from '@d3ro/ui/components/ds'
import { PageHeader, EmptyStateCard } from '../components/shared'
import { isImeComposingEvent } from '../utils/keyboard'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { d3roPalette, d3roFontSans, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import type { RAGDocument, RAGQueryResult, RAGIndexProgress } from '@d3ro/core/types'

View file

@ -9,8 +9,6 @@ import {
Snackbar,
Alert,
Typography,
IconButton,
Tooltip,
Dialog,
DialogTitle,
DialogContent,
@ -28,8 +26,6 @@ import {
FileText,
Sparkles,
Mic,
Activity,
Trash2,
Tag,
CheckCircle2,
ListTodo,
@ -39,12 +35,10 @@ import {
Settings,
RefreshCw,
Cpu,
SlidersHorizontal,
} from 'lucide-react'
import {
MetalCard,
PhosphorText,
Led,
PhysicalButton,
ScreenPanel,
DoubleBezelCard,
@ -55,7 +49,7 @@ import { MeetingDetailTabs } from '../components/meeting/MeetingDetailTabs'
import { EditableSegment } from '../components/meeting/EditableSegment'
import { PageHeader, EmptyStateCard } from '../components/shared'
import { isImeComposingEvent } from '../utils/keyboard'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import type {
MeetingSessionSummary,
@ -91,14 +85,14 @@ export function MeetingModePage(): React.ReactElement {
const [sessions, setSessions] = useState<MeetingSessionSummary[]>([])
const [totalSessions, setTotalSessions] = useState(0)
const [loading, setLoading] = useState(true)
const [page, setPage] = useState(1)
const [page] = useState(1)
const pageSize = 20
// 사전 점검 및 기동 상태
const [isStarting, setIsStarting] = useState(false)
const [errorInfo, setErrorInfo] = useState<MeetingErrorInfo | null>(null)
const [sttProvider, setSttProvider] = useState<string>('local')
const [sttEngineState, setSttEngineState] = useState<string>('ready')
const [, setSttEngineState] = useState<string>('ready')
const [micDeviceName, setMicDeviceName] = useState<string>('')
// 녹음 뷰 상태
@ -424,7 +418,7 @@ export function MeetingModePage(): React.ReactElement {
>
<DialogTitle sx={{ display: 'flex', alignItems: 'center', gap: 1.5, pb: 1 }}>
<AlertCircle size={22} style={{ color: d3roPalette.tag.red }} />
<Typography sx={{ fontFamily: d3roFontSans, fontWeight: 700, fontSize: '17px', color: d3roPalette.text.primary }}>
<Typography sx={{ fontFamily: d3roFontSans, fontWeight: 500, fontSize: '17px', color: d3roPalette.text.primary }}>
{errorInfo?.title}
</Typography>
</DialogTitle>
@ -455,7 +449,7 @@ export function MeetingModePage(): React.ReactElement {
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 1, mt: 1.5 }}>
<Box sx={{ display: 'flex', gap: 1.2, alignItems: 'flex-start' }}>
<Typography sx={{ fontSize: '12px', fontWeight: 700, color: d3roPalette.tag.orange, minWidth: 65 }}>
<Typography sx={{ fontSize: '12px', fontWeight: 500, color: d3roPalette.tag.orange, minWidth: 65 }}>
발생 원인
</Typography>
<Typography sx={{ fontSize: '12.5px', color: d3roPalette.text.primary, lineHeight: 1.4 }}>
@ -463,7 +457,7 @@ export function MeetingModePage(): React.ReactElement {
</Typography>
</Box>
<Box sx={{ display: 'flex', gap: 1.2, alignItems: 'flex-start' }}>
<Typography sx={{ fontSize: '12px', fontWeight: 700, color: d3roPalette.tag.green, minWidth: 65 }}>
<Typography sx={{ fontSize: '12px', fontWeight: 500, color: d3roPalette.tag.green, minWidth: 65 }}>
해결 조치
</Typography>
<Typography sx={{ fontSize: '12.5px', color: d3roPalette.text.primary, lineHeight: 1.4 }}>
@ -636,7 +630,7 @@ export function MeetingModePage(): React.ReactElement {
sx={{
fontFamily: d3roFontSans,
fontSize: '15px',
fontWeight: 700,
fontWeight: 500,
color: d3roPalette.text.primary,
lineHeight: 1.35,
display: '-webkit-box',
@ -716,7 +710,7 @@ export function MeetingModePage(): React.ReactElement {
sx={{
fontFamily: d3roFontMono,
fontSize: '20px',
fontWeight: 700,
fontWeight: 500,
color: d3roPalette.text.primary,
fontVariantNumeric: 'tabular-nums',
}}

View file

@ -3,22 +3,18 @@
import React, { useState, useEffect, useCallback, useRef } from 'react'
import { Alert, Box, IconButton, Snackbar, TextField, Tooltip, Typography } from '@mui/material'
import { Mic, Square, Send, Trash2, XCircle, Bot, User, Sparkles, Volume2 } from 'lucide-react'
import { Mic, Square, Send, Trash2, XCircle, Bot } from 'lucide-react'
import {
MetalCard,
PhosphorText,
Led,
PhysicalButton,
ScreenPanel,
DoubleBezelCard,
TactileBadge,
AudioVisualizerBar,
} from '@d3ro/ui/components/ds'
import { PageHeader } from '../components/shared'
import { VoiceRecordingPanel } from '../components/voice-conversation/VoiceRecordingPanel'
import { useRealtimeConversation } from '../hooks/useRealtimeConversation'
import { isImeComposingEvent } from '../utils/keyboard'
import { d3roPalette, d3roFontSans, d3roFontMono, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { d3roPalette, d3roFontSans, d3roTypo, d3roRadius, d3roShadow } from '@d3ro/ui/theme'
import { useI18n } from '@d3ro/i18n'
import type {
ConversationState,
@ -334,7 +330,7 @@ export function VoiceConversationPage(): React.ReactElement {
>
<Bot size={32} />
</Box>
<Typography sx={{ fontFamily: d3roFontSans, fontSize: '18px', fontWeight: 700, color: d3roPalette.text.primary, mb: 1 }}>
<Typography sx={{ fontFamily: d3roFontSans, fontSize: '18px', fontWeight: 500, color: d3roPalette.text.primary, mb: 1 }}>
{t('conversation.empty')}
</Typography>
<Typography sx={{ fontFamily: d3roFontSans, fontSize: '13px', color: d3roPalette.text.secondary, maxWidth: 400, mx: 'auto' }}>