返回 oh-my-ppt
DynamicToolRow.tsx
根目录 / src / renderer / src / components / session-detail / workspace / toolbar / DynamicToolRow.tsx
1 import type { SessionWorkspaceTab } from '@renderer/store'
2 import { AiToolRow } from './tool-rows/AiToolRow'
3 import { AnimationToolRow } from './tool-rows/AnimationToolRow'
4 import { InsertToolRow } from './tool-rows/InsertToolRow'
5 import { PreviewToolRow } from './tool-rows/PreviewToolRow'
6 import { SpeechToolRow } from './tool-rows/SpeechToolRow'
7 import type { ToolRowProps } from './tool-rows/types'
8
9 const toolRows: Record<
10 SessionWorkspaceTab,
11 {
12 render: (props: ToolRowProps) => React.JSX.Element | null
13 hasContent: boolean
14 }
15 > = {
16 preview: { render: PreviewToolRow, hasContent: false },
17 browse: { render: PreviewToolRow, hasContent: false },
18 style: { render: PreviewToolRow, hasContent: false },
19 edit: { render: InsertToolRow, hasContent: true },
20 animation: { render: AnimationToolRow, hasContent: true },
21 speech: { render: SpeechToolRow, hasContent: false },
22 ai: { render: AiToolRow, hasContent: false }
23 }
24
25 const dynamicToolRowMotionStyles = `
26 @keyframes workspaceDynamicToolRowIn {
27 0% {
28 grid-template-rows: 0fr;
29 opacity: 0;
30 transform: translateY(-7px) scale(0.985);
31 filter: blur(3px);
32 }
33 58% {
34 grid-template-rows: 1fr;
35 opacity: 1;
36 transform: translateY(1px) scale(1.004);
37 filter: blur(0);
38 }
39 100% {
40 grid-template-rows: 1fr;
41 opacity: 1;
42 transform: translateY(0) scale(1);
43 filter: blur(0);
44 }
45 }
46
47 .workspace-dynamic-tool-row {
48 display: grid;
49 transform-origin: top center;
50 animation: workspaceDynamicToolRowIn 260ms cubic-bezier(0.2, 0.86, 0.28, 1) both;
51 }
52
53 @media (prefers-reduced-motion: reduce) {
54 .workspace-dynamic-tool-row {
55 animation: none;
56 }
57 }
58 `
59
60 function ensureDynamicToolRowMotionStyles(): void {
61 if (typeof document === 'undefined') return
62 if (document.getElementById('workspace-dynamic-tool-row-motion-styles')) return
63 const style = document.createElement('style')
64 style.id = 'workspace-dynamic-tool-row-motion-styles'
65 style.textContent = dynamicToolRowMotionStyles
66 document.head.appendChild(style)
67 }
68
69 ensureDynamicToolRowMotionStyles()
70
71 export function DynamicToolRow(props: ToolRowProps): React.JSX.Element | null {
72 const toolRow = toolRows[props.state.activeTab]
73
74 if (!toolRow.hasContent) return null
75
76 const ToolRow = toolRow.render
77
78 return (
79 <div key={props.state.activeTab} className="workspace-dynamic-tool-row">
80 <div className="min-h-0 overflow-hidden">
81 <ToolRow {...props} />
82 </div>
83 </div>
84 )
85 }
86
86 lines Plain Text