aitu-app 0.6.92 → 0.6.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/assets/{CanvasAudioPlayer-DRkc6-gV.js → CanvasAudioPlayer-DaNPbJyT.js} +1 -1
- package/assets/ComicCreator-DkeHdMnR.js +43 -0
- package/assets/{DeferredAIInputBar-79Zl5TYH.js → DeferredAIInputBar-lWK2fRaw.js} +2 -2
- package/assets/{DrawnixDeferredFeatures-CdqXxDpn.js → DrawnixDeferredFeatures-CbWSXV6C.js} +1 -1
- package/assets/{KnowledgeBaseContent-D7tD5QIb.js → KnowledgeBaseContent-BUr9he8d.js} +3 -3
- package/assets/{MVCreator-CdYVdw1H.js → MVCreator-BOzN-tXU.js} +1 -1
- package/assets/{ModelBenchmarkWorkbench-ClxiKEAt.js → ModelBenchmarkWorkbench-jUHEm6aS.js} +1 -1
- package/assets/{MusicAnalyzer-pz_nRr_N.js → MusicAnalyzer-BuGqo-5v.js} +1 -1
- package/assets/{ParametersDropdown-u7eqsc1Q.js → ParametersDropdown-yEFuMwP3.js} +1 -1
- package/assets/{PromptHistoryTool-D8EEDr6E.js → PromptHistoryTool-Bkam4jDq.js} +1 -1
- package/assets/{ResizableDivider-D2jvA5Zo.js → ResizableDivider-4YaXoujg.js} +1 -1
- package/assets/{TaskQueuePanel-DCirkK8s.js → TaskQueuePanel-B4n4yFrN.js} +1 -1
- package/assets/{VideoAnalyzer-CWE-342b.js → VideoAnalyzer-DD1ikZBf.js} +1 -1
- package/assets/{VideoAnalyzer-D750sFKx.js → VideoAnalyzer-Dw6JxzL_.js} +1 -1
- package/assets/{ai-chat-uRzexObv.js → ai-chat-CbA4VxVi.js} +5 -5
- package/assets/{ai-generation-preferences-service-DwGxjUfr.js → ai-generation-preferences-service-DvXSxpFD.js} +1 -1
- package/assets/batch-image-generation-C9zuT56U.js +8 -0
- package/assets/{diagram-engines-C-rboriL.js → diagram-engines-arQ_psja.js} +2 -2
- package/assets/{editor-engines-Capdu_nx.js → editor-engines-BXUe6h7p.js} +1 -1
- package/assets/{index-CtULm7ya.js → index-7v8cNwYN.js} +1 -1
- package/assets/{index-C686KJo4.js → index-CfHqQVdk.js} +1 -1
- package/assets/{index-B2XZmzPx.js → index-D6y0DVFb.js} +1 -1
- package/assets/{index-6AC4Fojx.js → index-DbzFDVbD.js} +1 -1
- package/assets/{index-B0RiB1-7.js → index-vRkGyT2X.js} +1 -1
- package/assets/{index.es-Bo5ocBO2.js → index.es-C8HW6iHn.js} +1 -1
- package/assets/{jspdf.es.min-DUhWLWwg.js → jspdf.es.min-ClNUHu_u.js} +2 -2
- package/assets/{markdown-to-drawnix-DS0YhAxe.js → markdown-to-drawnix-BCRkjrJ-.js} +2 -2
- package/assets/{mermaid-to-drawnix-BNrL9NFj.js → mermaid-to-drawnix-jTl2aB2R.js} +2 -2
- package/assets/{model-benchmark-launcher-B_WLdsDt.js → model-benchmark-launcher-Jt3muucM.js} +1 -1
- package/assets/{photo-wall-splitter-Ccoi24Ix.js → photo-wall-splitter-DmDAK7uj.js} +1 -1
- package/assets/{prompt-utils-DwgkgTEf.js → prompt-utils-CXPwwhv5.js} +1 -1
- package/assets/{retry-image-BIzhe-M5.js → retry-image-nmgTk8q5.js} +1 -1
- package/assets/{settings-dialog-BJ-lbelt.js → settings-dialog-D20-RzdV.js} +1 -1
- package/assets/{skill-dsl-parser-BQrGoqFO.js → skill-dsl-parser-BzXNppVj.js} +1 -1
- package/assets/{startup-app-BLBeQQh_.js → startup-app-BmKsISci.js} +456 -456
- package/assets/{task-sync-BPjCXo10.js → task-sync-OlH4BhNN.js} +1 -1
- package/assets/{tool-windows-DEonhoUG.js → tool-windows-BJIgtPhd.js} +5 -5
- package/assets/{ttd-dialog-DtRQ8ZC5.js → ttd-dialog-BC8TvOF6.js} +2 -2
- package/assets/{ttd-dialog-submit-shortcut-CQajKYbw.js → ttd-dialog-submit-shortcut-CtoAZbit.js} +1 -1
- package/assets/{useCharacters-B_AxGeF_.js → useCharacters-DYaygzmK.js} +1 -1
- package/assets/{useMediaViewer-CekCZAXB.js → useMediaViewer-g_sRo1wu.js} +1 -1
- package/assets/{useWorkflowSubmission-DEYma8V-.js → useWorkflowSubmission-DtY6AO0Y.js} +2 -2
- package/assets/{video-recovery-service-B3PHprTc.js → video-recovery-service-B1myHeGL.js} +1 -1
- package/assets/{workflow-generation-utils-BAPfL2fP.js → workflow-generation-utils-BzmNYqLw.js} +2 -2
- package/assets/{workflow-submission-service-ByqIXB9Z.js → workflow-submission-service-D54XS7uS.js} +1 -1
- package/changelog.json +15 -22
- package/idle-prefetch-manifest.json +288 -288
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +8 -8
- package/sw.js +1 -1
- package/version.json +3 -13
- package/assets/ComicCreator-Cv-YBMfn.js +0 -43
- package/assets/batch-image-generation-CU6AcTaw.js +0 -8
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Opentu CDN Assets v0.6.
|
|
1
|
+
# Opentu CDN Assets v0.6.93
|
|
2
2
|
|
|
3
3
|
> 静态资源包,不含 HTML 文件
|
|
4
4
|
|
|
5
|
-
- unpkg: https://unpkg.com/aitu-app@0.6.
|
|
6
|
-
- jsdelivr: https://cdn.jsdelivr.net/npm/aitu-app@0.6.
|
|
5
|
+
- unpkg: https://unpkg.com/aitu-app@0.6.93/
|
|
6
|
+
- jsdelivr: https://cdn.jsdelivr.net/npm/aitu-app@0.6.93/
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./startup-app-BruT4WBY.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{_ as ke}from"./startup-runtime-DTmhLESk.js";import{r as n,j as t,da as he,B as C,jf as Ae,fY as Se,dS as Te,dT as Le,de as ue,dc as J,eE as U,eu as Ee,o as de,cg as Ne,c0 as Ce,dV as Me,ey as Re,eG as oe,eH as pe,$ as ie,ez as _e,A as De,ax as $e,eI as ze,ex as Oe,m as Ue,eJ as Fe,eK as fe,eL as Ye,eF as le,jg as qe,jh as Ve,ji as Be,X as He,eN as Qe,eO as We,eP as Xe,eQ as Ke,eR as Ge}from"./startup-app-BLBeQQh_.js";import{u as Je,a as Ze,b as me,d as Z,e as et}from"./tool-windows-DEonhoUG.js";import{b as tt}from"./ai-chat-uRzexObv.js";const ye=5;function ve(e,i,s){const c=Math.max(0,window.innerWidth-i),f=Math.max(0,window.innerHeight-s);return{x:Math.max(0,Math.min(e.x,c)),y:Math.max(0,Math.min(e.y,f))}}function at(e){try{const i=localStorage.getItem(e);if(!i)return null;const s=JSON.parse(i);if(typeof s.x=="number"&&typeof s.y=="number")return s}catch{}return null}function nt(e,i){try{localStorage.setItem(e,JSON.stringify(i))}catch{}}function st(e){const{storageKey:i,enabled:s=!0}=e,[c,f]=n.useState(()=>s?at(i):null),[v,b]=n.useState(!1),w=n.useRef(!1),h=n.useRef(null),I=n.useRef(null),_=n.useCallback(m=>{if(!s||m.button!==0)return;const y=I.current;if(!y)return;const p=y.getBoundingClientRect();h.current={startPointerX:m.clientX,startPointerY:m.clientY,startElX:p.left,startElY:p.top,activated:!1,frameId:0}},[s]);n.useEffect(()=>{if(!s)return;const m=p=>{const u=h.current;if(!u)return;const g=p.clientX-u.startPointerX,M=p.clientY-u.startPointerY;if(!u.activated){if(Math.abs(g)<ye&&Math.abs(M)<ye)return;u.activated=!0,b(!0)}cancelAnimationFrame(u.frameId),u.frameId=requestAnimationFrame(()=>{const S=I.current;if(!S)return;const d=ve({x:u.startElX+g,y:u.startElY+M},S.offsetWidth,S.offsetHeight);f(d)})},y=()=>{const p=h.current;if(!p)return;cancelAnimationFrame(p.frameId);const u=p.activated;h.current=null,b(!1),u&&(w.current=!0,requestAnimationFrame(()=>{w.current=!1}),f(g=>(g&&nt(i,g),g)))};return window.addEventListener("pointermove",m),window.addEventListener("pointerup",y),()=>{window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",y)}},[s,i]),n.useEffect(()=>{if(!s||!c)return;const m=()=>{const y=I.current;y&&f(p=>p&&ve(p,y.offsetWidth,y.offsetHeight))};return window.addEventListener("resize",m),()=>window.removeEventListener("resize",m)},[s,!!c]);const P=n.useCallback(()=>{f(null);try{localStorage.removeItem(i)}catch{}},[i]);return{position:c,isDragging:v,wasDraggedRef:w,elementRef:I,handlePointerDown:_,resetPosition:P}}const ot=({volume:e,onVolumeChange:i})=>{const s=n.useRef(null),c=n.useRef(null),f=n.useRef(!1),v=n.useRef(!1),b=n.useRef(!1),[w,h]=n.useState(!1),[I,_]=n.useState(!1),[P,m]=n.useState(!1),y=Math.round(e*100),p={"--canvas-audio-progress":`${e*100}%`},u=()=>{c.current!==null&&(window.clearTimeout(c.current),c.current=null)},g=()=>{u(),h(!0)},M=()=>{u(),h(d=>!d)},S=()=>{u(),!(v.current||b.current)&&(c.current=window.setTimeout(()=>{h(!1)},180))};return n.useEffect(()=>{v.current=I},[I]),n.useEffect(()=>{b.current=P},[P]),n.useEffect(()=>()=>u(),[]),n.useEffect(()=>{if(!w)return;const d=x=>{var k;(k=s.current)!=null&&k.contains(x.target)||(u(),h(!1),m(!1),_(!1),f.current=!1)};return document.addEventListener("pointerdown",d,!0),()=>document.removeEventListener("pointerdown",d,!0)},[w]),n.useEffect(()=>{if(!P)return;const d=()=>{b.current=!1,m(!1),v.current||(u(),c.current=window.setTimeout(()=>{h(!1)},180))};return window.addEventListener("pointerup",d),()=>window.removeEventListener("pointerup",d)},[P]),t.jsx("div",{ref:s,className:he("canvas-audio-player__volume",{"canvas-audio-player__volume--expanded":w}),onPointerDown:d=>d.stopPropagation(),onMouseEnter:()=>{v.current=!0,_(!0),u()},onMouseLeave:()=>{v.current=!1,_(!1),S()},onBlur:d=>{var k;const x=d.relatedTarget;x&&((k=s.current)!=null&&k.contains(x))||S()},children:t.jsxs("div",{className:"canvas-audio-player__volume-shell",children:[t.jsx("div",{className:"canvas-audio-player__volume-slider-wrap",children:t.jsx("input",{type:"range",min:0,max:1,step:.01,value:e,onFocus:g,onPointerDown:d=>{d.stopPropagation(),b.current=!0,m(!0),g()},onChange:d=>i(Number(d.target.value)),className:"canvas-audio-player__slider canvas-audio-player__slider--volume",style:p,"aria-label":"Playback volume","aria-valuetext":`${y}%`})}),t.jsxs("span",{className:"canvas-audio-player__volume-value",children:[y,"%"]}),t.jsx(C,{content:"音量",children:t.jsx("button",{type:"button",className:"canvas-audio-player__volume-toggle",onPointerDown:d=>{d.stopPropagation(),f.current=!0},onClick:()=>{f.current=!1,M()},onFocus:()=>{f.current||g()},onBlur:()=>{f.current=!1},"aria-label":"Volume controls","aria-expanded":w,children:e<=.01?t.jsx(Ae,{size:16}):t.jsx(Se,{size:16})})})]})})},ge="asset:";function it(e){var i;return(i=e==null?void 0:e.elementId)!=null&&i.startsWith(ge)?e.elementId.slice(ge.length):null}function xe(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}function lt(e){var s;const i=((s=e.segments[e.segments.length-1])==null?void 0:s.endMs)||0;return xe(i/1e3)}const rt=({queue:e,activeQueueIndex:i,queueSource:s,activePlaylistId:c,playing:f=!1,activeReadingSourceId:v,onSelect:b,onPlayAllTracksItem:w})=>{const{assets:h}=Te(),{playlists:I,playlistItems:_,favoriteAssetIds:P,createPlaylist:m,addAssetToPlaylist:y,removeAssetFromPlaylist:p,toggleFavorite:u}=Le(),{contextMenu:g,openAt:M,close:S}=tt(),[d,x]=n.useState(!1),[k,E]=n.useState(""),[F,T]=n.useState(null),{noteMetas:$,loadReadingSource:W,buildReadingQueue:X}=Je(),[Y,q]=n.useState(s==="reading"?ue:J),V=Y===ue,R=s==="playlist"&&c?c:J,L=e.filter(a=>!U(a)),ee=Ze(L),K=a=>{const o=it(a);if(o)return o;if(!(a!=null&&a.audioUrl))return null;const r=h.find(j=>j.type===Me.AUDIO&&j.url===a.audioUrl);return(r==null?void 0:r.id)||null},B=n.useMemo(()=>new Set(R!==J?(_[R]||[]).map(a=>a.assetId?Ee({kind:"asset",assetId:a.assetId}):null).filter(a=>!!a):[]),[_,R]),D=n.useCallback(async a=>{if(w){w(a);return}const o=await W(a);o&&(await X(a),b(o))},[w,W,X,b]),z=n.useMemo(()=>$.map(a=>({id:a.id,title:a.title||"未命名笔记",subtitle:new Date(a.updatedAt).toLocaleDateString("zh-CN"),canFavorite:!1,isActive:(v==null?void 0:v.includes(a.id))===!0,isPlaying:f&&(v==null?void 0:v.includes(a.id))===!0})),[$,v,f]);return s==="reading"?t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(me,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:Y,allCount:L.length,allTracksCount:$.length,playlists:I,playlistItems:_,onSelect:q,onCreate:()=>{E(""),x(!0)}}),V?z.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(de,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:z,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:e.map((a,o)=>{const r=a;return{id:r.readingSourceId,title:r.title||"朗读轨道",subtitle:lt(r),previewImageUrl:r.previewImageUrl,isActive:o===i,isPlaying:o===i,canFavorite:!1}}),onSelect:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},onTogglePlayback:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},showPlaybackIndicator:!0})]}):t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(me,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:Y,allCount:L.length,allTracksCount:$.length,playlists:I,playlistItems:_,onSelect:q,onCreate:()=>{E(""),x(!0)}}),V?z.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(de,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:z,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:L.map((a,o)=>{const r=K(a);return{id:`${a.audioUrl}-${o}`,title:a.title||"未命名音频",subtitle:xe(ee.get(a.audioUrl)??a.duration),previewImageUrl:a.previewImageUrl,isActive:o===i,isPlaying:o===i,isFavorite:r?P.has(r):!1,canFavorite:!!r}}),onSelect:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},onContextMenu:(a,o)=>{const r=L.find((H,te)=>`${H.audioUrl}-${te}`===a.id),j=K(r);j&&(o.preventDefault(),o.stopPropagation(),M(o.clientX,o.clientY,{kind:"asset",assetId:j}))},onToggleFavorite:a=>{const o=L.find((j,H)=>`${j.audioUrl}-${H}`===a.id),r=K(o);r&&u(r)},onTogglePlayback:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},showFavoriteButton:!0,showPlaybackIndicator:!0}),t.jsx(et,{contextMenu:g?{x:g.x,y:g.y,item:g.payload}:null,playlists:I,playlistItems:_,favoriteAssetIds:P,selectedPlaylistId:R===J?null:R,currentPlaylistItemKeys:B,onClose:S,onToggleFavorite:a=>void u(a),onAddToPlaylist:(a,o)=>{a.kind==="asset"&&y(a.assetId,o)},onRemoveFromPlaylist:(a,o)=>{a.kind==="asset"&&p(a.assetId,o)},onCreatePlaylistAndAdd:a=>{a.kind==="asset"&&(T(a.assetId),E(""),x(!0))}}),t.jsx(Ne,{visible:d,header:"新建播放列表",onClose:()=>x(!1),onConfirm:async()=>{const a=await m(k);F&&await y(F,a.id),x(!1),E(""),T(null)},onCancel:()=>{x(!1),T(null)},confirmBtn:"确定",cancelBtn:"取消",children:t.jsx(Ce,{value:k,onChange:a=>E(String(a)),placeholder:"请输入播放列表名称"})})]})},we={sequential:t.jsx(Ge,{size:14}),"list-loop":t.jsx(Ke,{size:14}),"single-loop":t.jsx(Xe,{size:14}),shuffle:t.jsx(We,{size:14})},ct=Object.keys(le).map(e=>({value:e,content:le[e],prefixIcon:we[e]}));function ut(e,i){return Qe(i).map(s=>{const c=_e(s),f=Math.abs(s-e)<.001;return{value:s,content:f?`✓ ${c}`:c}})}function be(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}const vt=()=>{const e=Re(),i=n.useRef(null),[s,c]=n.useState(!1),[f,v]=n.useState(()=>{const l=oe.getToolState(pe);return(l==null?void 0:l.status)==="open"}),[b,w]=n.useState(()=>{try{return localStorage.getItem(ie.AUDIO_PLAYER_LAYOUT)==="vertical"?"vertical":"horizontal"}catch{return"horizontal"}}),[h,I]=n.useState(()=>typeof window<"u"?window.innerWidth:1024);n.useEffect(()=>{const l=()=>I(window.innerWidth);return window.addEventListener("resize",l),window.addEventListener("orientationchange",l),()=>{window.removeEventListener("resize",l),window.removeEventListener("orientationchange",l)}},[]);const _=h<=768?"vertical":b,[P,m]=n.useState(null),y=h<=768,{position:p,isDragging:u,wasDraggedRef:g,elementRef:M,handlePointerDown:S}=st({storageKey:ie.AUDIO_PLAYER_POSITION,enabled:!y}),d=n.useMemo(()=>!e.duration||e.duration<=0?0:Math.max(0,Math.min(100,e.currentTime/e.duration*100)),[e.currentTime,e.duration]),x=Number.isFinite(e.currentTime)?e.currentTime:0,k=Number.isFinite(e.duration)?e.duration:0,E=be(x),F=be(k),T=e.activeQueueIndex>=0?e.queue[e.activeQueueIndex]:null,$=e.activeTitle||(U(T)?T.title:void 0),W=e.activePreviewImageUrl||(U(T)?T.previewImageUrl:void 0),X=e.activeQueueIndex>0,Y=e.activeQueueIndex>=0&&e.activeQueueIndex<e.queue.length-1,q=e.queue.length>1&&e.activeQueueIndex>=0,V=q?`${e.activeQueueIndex+1}/${e.queue.length}`:null,R=e.queueSource==="playlist"?e.activePlaylistName||"播放列表":e.activePlaylistName||(e.queueSource==="reading"?"朗读轨道":"画布音频"),L=q?`${R} ${e.activeQueueIndex+1} / ${e.queue.length}`:R,ee=V?`${V} · ${E} / ${F}`:`${E} / ${F}`,B=e.queueSource==="reading"&&(!!e.activeReadingSourceId||T!==null&&U(T))||!!e.activeAudioUrl,D=e.mediaType==="audio",z=e.mediaType==="reading"?"reading":"audio",a=le[e.playbackMode],o=we[e.playbackMode],r=n.useMemo(()=>ut(e.effectivePlaybackRate,z),[e.effectivePlaybackRate,z]),j=_e(e.effectivePlaybackRate),H=`${e.mediaType==="reading"?"语音速度":"播放速度"} ${j}`,te={"--canvas-audio-progress":`${d}%`},Pe=n.useCallback(()=>{w(l=>{const A=l==="horizontal"?"vertical":"horizontal";try{localStorage.setItem(ie.AUDIO_PLAYER_LAYOUT,A)}catch{}return A})},[]),je=n.useCallback(async()=>{try{e.playing?e.pausePlayback():await e.resumePlayback()}catch{}},[e]);if(n.useEffect(()=>{if(!B){c(!1),m(null);return}let l=0;const A=()=>{const ce=document.querySelector(".ai-input-bar__container");if(!(ce instanceof HTMLElement)){m(null);return}const se=ce.getBoundingClientRect(),G={left:Math.round(se.left),width:Math.round(se.width),bottom:Math.max(0,Math.round(window.innerHeight-se.top))};m(Q=>Q&&Q.left===G.left&&Q.width===G.width&&Q.bottom===G.bottom?Q:G)},N=()=>{window.cancelAnimationFrame(l),l=window.requestAnimationFrame(A)},ae=document.querySelector(".ai-input-bar__container"),ne=document.querySelector(".ai-input-bar"),O=typeof ResizeObserver<"u"?new ResizeObserver(()=>N()):null;return O&&ae instanceof HTMLElement&&O.observe(ae),O&&ne instanceof HTMLElement&&ne!==ae&&O.observe(ne),N(),window.addEventListener("resize",N),window.addEventListener("orientationchange",N),()=>{window.cancelAnimationFrame(l),window.removeEventListener("resize",N),window.removeEventListener("orientationchange",N),O==null||O.disconnect()}},[B]),n.useEffect(()=>{if(!s)return;const l=A=>{var N;(N=i.current)!=null&&N.contains(A.target)||c(!1)};return document.addEventListener("pointerdown",l,!0),()=>document.removeEventListener("pointerdown",l,!0)},[s]),n.useEffect(()=>{M.current=i.current}),n.useEffect(()=>{const l=oe.observeToolStates().subscribe(()=>{const A=oe.getToolState(pe);v((A==null?void 0:A.status)==="open")});return()=>l.unsubscribe()},[]),!B||f)return null;const Ie=p&&!y?{left:p.x,top:p.y}:{},re={...P?{"--canvas-audio-mobile-left":`${P.left}px`,"--canvas-audio-mobile-width":`${P.width}px`,"--canvas-audio-mobile-offset":`${P.bottom}px`}:{},...Ie};return t.jsxs("div",{ref:i,className:he("canvas-audio-player",{"canvas-audio-player--playlist-open":s,"canvas-audio-player--positioned":!!p,"canvas-audio-player--dragging":u,"canvas-audio-player--vertical":_==="vertical"}),style:Object.keys(re).length>0?re:void 0,children:[t.jsxs("button",{type:"button",className:"canvas-audio-player__queue-trigger",onPointerDown:S,onClick:()=>{g.current||c(l=>!l)},"aria-expanded":s,"aria-label":"切换播放列表",children:[t.jsx("div",{className:"canvas-audio-player__cover",children:t.jsx(De,{src:W,alt:$||"Audio cover",fallbackClassName:"canvas-audio-player__cover-fallback",iconSize:16})}),t.jsxs("div",{className:"canvas-audio-player__meta",children:[t.jsx("div",{className:"canvas-audio-player__title",children:$||"未命名音频"}),t.jsxs("div",{className:"canvas-audio-player__subtitle",children:[t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--desktop",children:L}),t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--mobile",children:ee})]})]}),t.jsx("span",{className:"canvas-audio-player__queue-indicator","aria-hidden":"true",children:t.jsx($e,{size:14})})]}),t.jsxs("div",{className:"canvas-audio-player__controls",children:[t.jsx(C,{content:"上一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--previous",onClick:()=>void e.playPrevious(),disabled:!X,children:t.jsx(ze,{size:14})})}),t.jsx(C,{content:e.playing?"暂停":"播放",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--primary",onClick:()=>void je(),children:e.playing?t.jsx(Oe,{size:14}):t.jsx(Ue,{size:14})})}),t.jsx(C,{content:"下一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--next",onClick:()=>void e.playNext(),disabled:!Y,children:t.jsx(Fe,{size:14})})})]}),t.jsxs("div",{className:"canvas-audio-player__progress",children:[t.jsx("span",{className:"canvas-audio-player__time",children:E}),t.jsx("input",{type:"range",min:0,max:k||0,step:.1,value:Math.min(x,k||x),onChange:l=>{D&&e.seekTo(Number(l.target.value))},className:"canvas-audio-player__slider canvas-audio-player__slider--progress",style:te,"aria-label":D?"Audio progress":"Reading progress",disabled:!D}),t.jsx("span",{className:"canvas-audio-player__time",children:F})]}),t.jsx(ot,{volume:e.volume,onVolumeChange:e.setVolume}),t.jsx(fe,{options:r,trigger:"click",placement:"bottom",minColumnWidth:112,onClick:l=>e.setPlaybackRate(Number(l.value)),children:t.jsx(C,{content:H,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__speed-toggle","aria-label":`切换播放速度,当前${j}`,children:t.jsx(Ye,{size:14})})})}),t.jsx(fe,{options:ct,trigger:"click",placement:"bottom",minColumnWidth:132,onClick:l=>e.setPlaybackMode(l.value),children:t.jsx(C,{content:a,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__mode-toggle","aria-label":`切换播放模式,当前${a}`,children:o})})}),t.jsx(C,{content:"打开播放器工具",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__player-switch canvas-audio-player__switch-toggle",onClick:()=>{ke(async()=>{const{openMusicPlayerTool:l}=await import("./startup-app-BLBeQQh_.js").then(A=>A.mL);return{openMusicPlayerTool:l}},__vite__mapDeps([0]),import.meta.url).then(({openMusicPlayerTool:l})=>{l()})},"aria-label":"打开播放器工具",children:t.jsx(qe,{size:14})})}),t.jsx(C,{content:_==="horizontal"?"切换为垂直布局":"切换为水平布局",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__layout-toggle",onClick:Pe,style:{display:h<=768?"none":""},children:_==="horizontal"?t.jsx(Ve,{size:14}):t.jsx(Be,{size:14})})}),t.jsx(C,{content:"关闭播放器",children:t.jsx("button",{type:"button",className:"canvas-audio-player__close",onClick:e.stopPlayback,children:t.jsx(He,{size:14})})}),s?t.jsx(rt,{queue:e.queue,activeQueueIndex:e.activeQueueIndex,queueSource:e.queueSource,activePlaylistId:e.activePlaylistId,playing:e.playing,activeReadingSourceId:e.activeReadingSourceId,onSelect:l=>{U(l)?e.toggleReadingPlayback(l):e.togglePlayback(l),c(!1)}}):null]})};export{vt as CanvasAudioPlayer};
|
|
2
|
+
import{_ as ke}from"./startup-runtime-DTmhLESk.js";import{r as n,j as t,da as he,B as C,jf as Ae,fY as Se,dS as Te,dT as Le,de as ue,dc as J,eE as U,eu as Ee,o as de,cg as Ne,c0 as Ce,dV as Me,ey as Re,eG as oe,eH as pe,$ as ie,ez as _e,A as De,ax as $e,eI as ze,ex as Oe,m as Ue,eJ as Fe,eK as fe,eL as Ye,eF as le,jg as qe,jh as Ve,ji as Be,X as He,eN as Qe,eO as We,eP as Xe,eQ as Ke,eR as Ge}from"./startup-app-BmKsISci.js";import{u as Je,a as Ze,b as me,d as Z,e as et}from"./tool-windows-BJIgtPhd.js";import{b as tt}from"./ai-chat-CbA4VxVi.js";const ye=5;function ve(e,i,s){const c=Math.max(0,window.innerWidth-i),f=Math.max(0,window.innerHeight-s);return{x:Math.max(0,Math.min(e.x,c)),y:Math.max(0,Math.min(e.y,f))}}function at(e){try{const i=localStorage.getItem(e);if(!i)return null;const s=JSON.parse(i);if(typeof s.x=="number"&&typeof s.y=="number")return s}catch{}return null}function nt(e,i){try{localStorage.setItem(e,JSON.stringify(i))}catch{}}function st(e){const{storageKey:i,enabled:s=!0}=e,[c,f]=n.useState(()=>s?at(i):null),[v,b]=n.useState(!1),w=n.useRef(!1),h=n.useRef(null),I=n.useRef(null),_=n.useCallback(m=>{if(!s||m.button!==0)return;const y=I.current;if(!y)return;const p=y.getBoundingClientRect();h.current={startPointerX:m.clientX,startPointerY:m.clientY,startElX:p.left,startElY:p.top,activated:!1,frameId:0}},[s]);n.useEffect(()=>{if(!s)return;const m=p=>{const u=h.current;if(!u)return;const g=p.clientX-u.startPointerX,M=p.clientY-u.startPointerY;if(!u.activated){if(Math.abs(g)<ye&&Math.abs(M)<ye)return;u.activated=!0,b(!0)}cancelAnimationFrame(u.frameId),u.frameId=requestAnimationFrame(()=>{const S=I.current;if(!S)return;const d=ve({x:u.startElX+g,y:u.startElY+M},S.offsetWidth,S.offsetHeight);f(d)})},y=()=>{const p=h.current;if(!p)return;cancelAnimationFrame(p.frameId);const u=p.activated;h.current=null,b(!1),u&&(w.current=!0,requestAnimationFrame(()=>{w.current=!1}),f(g=>(g&&nt(i,g),g)))};return window.addEventListener("pointermove",m),window.addEventListener("pointerup",y),()=>{window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",y)}},[s,i]),n.useEffect(()=>{if(!s||!c)return;const m=()=>{const y=I.current;y&&f(p=>p&&ve(p,y.offsetWidth,y.offsetHeight))};return window.addEventListener("resize",m),()=>window.removeEventListener("resize",m)},[s,!!c]);const P=n.useCallback(()=>{f(null);try{localStorage.removeItem(i)}catch{}},[i]);return{position:c,isDragging:v,wasDraggedRef:w,elementRef:I,handlePointerDown:_,resetPosition:P}}const ot=({volume:e,onVolumeChange:i})=>{const s=n.useRef(null),c=n.useRef(null),f=n.useRef(!1),v=n.useRef(!1),b=n.useRef(!1),[w,h]=n.useState(!1),[I,_]=n.useState(!1),[P,m]=n.useState(!1),y=Math.round(e*100),p={"--canvas-audio-progress":`${e*100}%`},u=()=>{c.current!==null&&(window.clearTimeout(c.current),c.current=null)},g=()=>{u(),h(!0)},M=()=>{u(),h(d=>!d)},S=()=>{u(),!(v.current||b.current)&&(c.current=window.setTimeout(()=>{h(!1)},180))};return n.useEffect(()=>{v.current=I},[I]),n.useEffect(()=>{b.current=P},[P]),n.useEffect(()=>()=>u(),[]),n.useEffect(()=>{if(!w)return;const d=x=>{var k;(k=s.current)!=null&&k.contains(x.target)||(u(),h(!1),m(!1),_(!1),f.current=!1)};return document.addEventListener("pointerdown",d,!0),()=>document.removeEventListener("pointerdown",d,!0)},[w]),n.useEffect(()=>{if(!P)return;const d=()=>{b.current=!1,m(!1),v.current||(u(),c.current=window.setTimeout(()=>{h(!1)},180))};return window.addEventListener("pointerup",d),()=>window.removeEventListener("pointerup",d)},[P]),t.jsx("div",{ref:s,className:he("canvas-audio-player__volume",{"canvas-audio-player__volume--expanded":w}),onPointerDown:d=>d.stopPropagation(),onMouseEnter:()=>{v.current=!0,_(!0),u()},onMouseLeave:()=>{v.current=!1,_(!1),S()},onBlur:d=>{var k;const x=d.relatedTarget;x&&((k=s.current)!=null&&k.contains(x))||S()},children:t.jsxs("div",{className:"canvas-audio-player__volume-shell",children:[t.jsx("div",{className:"canvas-audio-player__volume-slider-wrap",children:t.jsx("input",{type:"range",min:0,max:1,step:.01,value:e,onFocus:g,onPointerDown:d=>{d.stopPropagation(),b.current=!0,m(!0),g()},onChange:d=>i(Number(d.target.value)),className:"canvas-audio-player__slider canvas-audio-player__slider--volume",style:p,"aria-label":"Playback volume","aria-valuetext":`${y}%`})}),t.jsxs("span",{className:"canvas-audio-player__volume-value",children:[y,"%"]}),t.jsx(C,{content:"音量",children:t.jsx("button",{type:"button",className:"canvas-audio-player__volume-toggle",onPointerDown:d=>{d.stopPropagation(),f.current=!0},onClick:()=>{f.current=!1,M()},onFocus:()=>{f.current||g()},onBlur:()=>{f.current=!1},"aria-label":"Volume controls","aria-expanded":w,children:e<=.01?t.jsx(Ae,{size:16}):t.jsx(Se,{size:16})})})]})})},ge="asset:";function it(e){var i;return(i=e==null?void 0:e.elementId)!=null&&i.startsWith(ge)?e.elementId.slice(ge.length):null}function xe(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}function lt(e){var s;const i=((s=e.segments[e.segments.length-1])==null?void 0:s.endMs)||0;return xe(i/1e3)}const rt=({queue:e,activeQueueIndex:i,queueSource:s,activePlaylistId:c,playing:f=!1,activeReadingSourceId:v,onSelect:b,onPlayAllTracksItem:w})=>{const{assets:h}=Te(),{playlists:I,playlistItems:_,favoriteAssetIds:P,createPlaylist:m,addAssetToPlaylist:y,removeAssetFromPlaylist:p,toggleFavorite:u}=Le(),{contextMenu:g,openAt:M,close:S}=tt(),[d,x]=n.useState(!1),[k,E]=n.useState(""),[F,T]=n.useState(null),{noteMetas:$,loadReadingSource:W,buildReadingQueue:X}=Je(),[Y,q]=n.useState(s==="reading"?ue:J),V=Y===ue,R=s==="playlist"&&c?c:J,L=e.filter(a=>!U(a)),ee=Ze(L),K=a=>{const o=it(a);if(o)return o;if(!(a!=null&&a.audioUrl))return null;const r=h.find(j=>j.type===Me.AUDIO&&j.url===a.audioUrl);return(r==null?void 0:r.id)||null},B=n.useMemo(()=>new Set(R!==J?(_[R]||[]).map(a=>a.assetId?Ee({kind:"asset",assetId:a.assetId}):null).filter(a=>!!a):[]),[_,R]),D=n.useCallback(async a=>{if(w){w(a);return}const o=await W(a);o&&(await X(a),b(o))},[w,W,X,b]),z=n.useMemo(()=>$.map(a=>({id:a.id,title:a.title||"未命名笔记",subtitle:new Date(a.updatedAt).toLocaleDateString("zh-CN"),canFavorite:!1,isActive:(v==null?void 0:v.includes(a.id))===!0,isPlaying:f&&(v==null?void 0:v.includes(a.id))===!0})),[$,v,f]);return s==="reading"?t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(me,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:Y,allCount:L.length,allTracksCount:$.length,playlists:I,playlistItems:_,onSelect:q,onCreate:()=>{E(""),x(!0)}}),V?z.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(de,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:z,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:e.map((a,o)=>{const r=a;return{id:r.readingSourceId,title:r.title||"朗读轨道",subtitle:lt(r),previewImageUrl:r.previewImageUrl,isActive:o===i,isPlaying:o===i,canFavorite:!1}}),onSelect:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},onTogglePlayback:a=>{const o=e.find(r=>U(r)&&r.readingSourceId===a.id);o&&b(o)},showPlaybackIndicator:!0})]}):t.jsxs("div",{className:"canvas-audio-player__playlist",children:[t.jsx(me,{className:"canvas-audio-player__playlist-tabs",selectedPlaylistId:Y,allCount:L.length,allTracksCount:$.length,playlists:I,playlistItems:_,onSelect:q,onCreate:()=>{E(""),x(!0)}}),V?z.length===0?t.jsxs("div",{className:"canvas-audio-player__playlist-empty",children:[t.jsx(de,{size:16}),t.jsx("span",{children:"知识库还没有笔记"})]}):t.jsx(Z,{className:"canvas-audio-player__playlist-list",items:z,onSelect:a=>void D(a.id),onTogglePlayback:a=>void D(a.id),showPlaybackIndicator:!0}):t.jsx(Z,{className:"canvas-audio-player__playlist-list audio-track-list--queue",items:L.map((a,o)=>{const r=K(a);return{id:`${a.audioUrl}-${o}`,title:a.title||"未命名音频",subtitle:xe(ee.get(a.audioUrl)??a.duration),previewImageUrl:a.previewImageUrl,isActive:o===i,isPlaying:o===i,isFavorite:r?P.has(r):!1,canFavorite:!!r}}),onSelect:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},onContextMenu:(a,o)=>{const r=L.find((H,te)=>`${H.audioUrl}-${te}`===a.id),j=K(r);j&&(o.preventDefault(),o.stopPropagation(),M(o.clientX,o.clientY,{kind:"asset",assetId:j}))},onToggleFavorite:a=>{const o=L.find((j,H)=>`${j.audioUrl}-${H}`===a.id),r=K(o);r&&u(r)},onTogglePlayback:a=>{const o=L.find((r,j)=>`${r.audioUrl}-${j}`===a.id);o&&b(o)},showFavoriteButton:!0,showPlaybackIndicator:!0}),t.jsx(et,{contextMenu:g?{x:g.x,y:g.y,item:g.payload}:null,playlists:I,playlistItems:_,favoriteAssetIds:P,selectedPlaylistId:R===J?null:R,currentPlaylistItemKeys:B,onClose:S,onToggleFavorite:a=>void u(a),onAddToPlaylist:(a,o)=>{a.kind==="asset"&&y(a.assetId,o)},onRemoveFromPlaylist:(a,o)=>{a.kind==="asset"&&p(a.assetId,o)},onCreatePlaylistAndAdd:a=>{a.kind==="asset"&&(T(a.assetId),E(""),x(!0))}}),t.jsx(Ne,{visible:d,header:"新建播放列表",onClose:()=>x(!1),onConfirm:async()=>{const a=await m(k);F&&await y(F,a.id),x(!1),E(""),T(null)},onCancel:()=>{x(!1),T(null)},confirmBtn:"确定",cancelBtn:"取消",children:t.jsx(Ce,{value:k,onChange:a=>E(String(a)),placeholder:"请输入播放列表名称"})})]})},we={sequential:t.jsx(Ge,{size:14}),"list-loop":t.jsx(Ke,{size:14}),"single-loop":t.jsx(Xe,{size:14}),shuffle:t.jsx(We,{size:14})},ct=Object.keys(le).map(e=>({value:e,content:le[e],prefixIcon:we[e]}));function ut(e,i){return Qe(i).map(s=>{const c=_e(s),f=Math.abs(s-e)<.001;return{value:s,content:f?`✓ ${c}`:c}})}function be(e){if(typeof e!="number"||!Number.isFinite(e)||e<=0)return"--:--";const i=Math.floor(e),s=Math.floor(i/60),c=i%60;return`${s}:${String(c).padStart(2,"0")}`}const vt=()=>{const e=Re(),i=n.useRef(null),[s,c]=n.useState(!1),[f,v]=n.useState(()=>{const l=oe.getToolState(pe);return(l==null?void 0:l.status)==="open"}),[b,w]=n.useState(()=>{try{return localStorage.getItem(ie.AUDIO_PLAYER_LAYOUT)==="vertical"?"vertical":"horizontal"}catch{return"horizontal"}}),[h,I]=n.useState(()=>typeof window<"u"?window.innerWidth:1024);n.useEffect(()=>{const l=()=>I(window.innerWidth);return window.addEventListener("resize",l),window.addEventListener("orientationchange",l),()=>{window.removeEventListener("resize",l),window.removeEventListener("orientationchange",l)}},[]);const _=h<=768?"vertical":b,[P,m]=n.useState(null),y=h<=768,{position:p,isDragging:u,wasDraggedRef:g,elementRef:M,handlePointerDown:S}=st({storageKey:ie.AUDIO_PLAYER_POSITION,enabled:!y}),d=n.useMemo(()=>!e.duration||e.duration<=0?0:Math.max(0,Math.min(100,e.currentTime/e.duration*100)),[e.currentTime,e.duration]),x=Number.isFinite(e.currentTime)?e.currentTime:0,k=Number.isFinite(e.duration)?e.duration:0,E=be(x),F=be(k),T=e.activeQueueIndex>=0?e.queue[e.activeQueueIndex]:null,$=e.activeTitle||(U(T)?T.title:void 0),W=e.activePreviewImageUrl||(U(T)?T.previewImageUrl:void 0),X=e.activeQueueIndex>0,Y=e.activeQueueIndex>=0&&e.activeQueueIndex<e.queue.length-1,q=e.queue.length>1&&e.activeQueueIndex>=0,V=q?`${e.activeQueueIndex+1}/${e.queue.length}`:null,R=e.queueSource==="playlist"?e.activePlaylistName||"播放列表":e.activePlaylistName||(e.queueSource==="reading"?"朗读轨道":"画布音频"),L=q?`${R} ${e.activeQueueIndex+1} / ${e.queue.length}`:R,ee=V?`${V} · ${E} / ${F}`:`${E} / ${F}`,B=e.queueSource==="reading"&&(!!e.activeReadingSourceId||T!==null&&U(T))||!!e.activeAudioUrl,D=e.mediaType==="audio",z=e.mediaType==="reading"?"reading":"audio",a=le[e.playbackMode],o=we[e.playbackMode],r=n.useMemo(()=>ut(e.effectivePlaybackRate,z),[e.effectivePlaybackRate,z]),j=_e(e.effectivePlaybackRate),H=`${e.mediaType==="reading"?"语音速度":"播放速度"} ${j}`,te={"--canvas-audio-progress":`${d}%`},Pe=n.useCallback(()=>{w(l=>{const A=l==="horizontal"?"vertical":"horizontal";try{localStorage.setItem(ie.AUDIO_PLAYER_LAYOUT,A)}catch{}return A})},[]),je=n.useCallback(async()=>{try{e.playing?e.pausePlayback():await e.resumePlayback()}catch{}},[e]);if(n.useEffect(()=>{if(!B){c(!1),m(null);return}let l=0;const A=()=>{const ce=document.querySelector(".ai-input-bar__container");if(!(ce instanceof HTMLElement)){m(null);return}const se=ce.getBoundingClientRect(),G={left:Math.round(se.left),width:Math.round(se.width),bottom:Math.max(0,Math.round(window.innerHeight-se.top))};m(Q=>Q&&Q.left===G.left&&Q.width===G.width&&Q.bottom===G.bottom?Q:G)},N=()=>{window.cancelAnimationFrame(l),l=window.requestAnimationFrame(A)},ae=document.querySelector(".ai-input-bar__container"),ne=document.querySelector(".ai-input-bar"),O=typeof ResizeObserver<"u"?new ResizeObserver(()=>N()):null;return O&&ae instanceof HTMLElement&&O.observe(ae),O&&ne instanceof HTMLElement&&ne!==ae&&O.observe(ne),N(),window.addEventListener("resize",N),window.addEventListener("orientationchange",N),()=>{window.cancelAnimationFrame(l),window.removeEventListener("resize",N),window.removeEventListener("orientationchange",N),O==null||O.disconnect()}},[B]),n.useEffect(()=>{if(!s)return;const l=A=>{var N;(N=i.current)!=null&&N.contains(A.target)||c(!1)};return document.addEventListener("pointerdown",l,!0),()=>document.removeEventListener("pointerdown",l,!0)},[s]),n.useEffect(()=>{M.current=i.current}),n.useEffect(()=>{const l=oe.observeToolStates().subscribe(()=>{const A=oe.getToolState(pe);v((A==null?void 0:A.status)==="open")});return()=>l.unsubscribe()},[]),!B||f)return null;const Ie=p&&!y?{left:p.x,top:p.y}:{},re={...P?{"--canvas-audio-mobile-left":`${P.left}px`,"--canvas-audio-mobile-width":`${P.width}px`,"--canvas-audio-mobile-offset":`${P.bottom}px`}:{},...Ie};return t.jsxs("div",{ref:i,className:he("canvas-audio-player",{"canvas-audio-player--playlist-open":s,"canvas-audio-player--positioned":!!p,"canvas-audio-player--dragging":u,"canvas-audio-player--vertical":_==="vertical"}),style:Object.keys(re).length>0?re:void 0,children:[t.jsxs("button",{type:"button",className:"canvas-audio-player__queue-trigger",onPointerDown:S,onClick:()=>{g.current||c(l=>!l)},"aria-expanded":s,"aria-label":"切换播放列表",children:[t.jsx("div",{className:"canvas-audio-player__cover",children:t.jsx(De,{src:W,alt:$||"Audio cover",fallbackClassName:"canvas-audio-player__cover-fallback",iconSize:16})}),t.jsxs("div",{className:"canvas-audio-player__meta",children:[t.jsx("div",{className:"canvas-audio-player__title",children:$||"未命名音频"}),t.jsxs("div",{className:"canvas-audio-player__subtitle",children:[t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--desktop",children:L}),t.jsx("span",{className:"canvas-audio-player__subtitle-text canvas-audio-player__subtitle-text--mobile",children:ee})]})]}),t.jsx("span",{className:"canvas-audio-player__queue-indicator","aria-hidden":"true",children:t.jsx($e,{size:14})})]}),t.jsxs("div",{className:"canvas-audio-player__controls",children:[t.jsx(C,{content:"上一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--previous",onClick:()=>void e.playPrevious(),disabled:!X,children:t.jsx(ze,{size:14})})}),t.jsx(C,{content:e.playing?"暂停":"播放",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--primary",onClick:()=>void je(),children:e.playing?t.jsx(Oe,{size:14}):t.jsx(Ue,{size:14})})}),t.jsx(C,{content:"下一首",children:t.jsx("button",{type:"button",className:"canvas-audio-player__action canvas-audio-player__action--next",onClick:()=>void e.playNext(),disabled:!Y,children:t.jsx(Fe,{size:14})})})]}),t.jsxs("div",{className:"canvas-audio-player__progress",children:[t.jsx("span",{className:"canvas-audio-player__time",children:E}),t.jsx("input",{type:"range",min:0,max:k||0,step:.1,value:Math.min(x,k||x),onChange:l=>{D&&e.seekTo(Number(l.target.value))},className:"canvas-audio-player__slider canvas-audio-player__slider--progress",style:te,"aria-label":D?"Audio progress":"Reading progress",disabled:!D}),t.jsx("span",{className:"canvas-audio-player__time",children:F})]}),t.jsx(ot,{volume:e.volume,onVolumeChange:e.setVolume}),t.jsx(fe,{options:r,trigger:"click",placement:"bottom",minColumnWidth:112,onClick:l=>e.setPlaybackRate(Number(l.value)),children:t.jsx(C,{content:H,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__speed-toggle","aria-label":`切换播放速度,当前${j}`,children:t.jsx(Ye,{size:14})})})}),t.jsx(fe,{options:ct,trigger:"click",placement:"bottom",minColumnWidth:132,onClick:l=>e.setPlaybackMode(l.value),children:t.jsx(C,{content:a,children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__mode-toggle","aria-label":`切换播放模式,当前${a}`,children:o})})}),t.jsx(C,{content:"打开播放器工具",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__player-switch canvas-audio-player__switch-toggle",onClick:()=>{ke(async()=>{const{openMusicPlayerTool:l}=await import("./startup-app-BmKsISci.js").then(A=>A.mL);return{openMusicPlayerTool:l}},__vite__mapDeps([0]),import.meta.url).then(({openMusicPlayerTool:l})=>{l()})},"aria-label":"打开播放器工具",children:t.jsx(qe,{size:14})})}),t.jsx(C,{content:_==="horizontal"?"切换为垂直布局":"切换为水平布局",children:t.jsx("button",{type:"button",className:"canvas-audio-player__toggle canvas-audio-player__layout-toggle",onClick:Pe,style:{display:h<=768?"none":""},children:_==="horizontal"?t.jsx(Ve,{size:14}):t.jsx(Be,{size:14})})}),t.jsx(C,{content:"关闭播放器",children:t.jsx("button",{type:"button",className:"canvas-audio-player__close",onClick:e.stopPlayback,children:t.jsx(He,{size:14})})}),s?t.jsx(rt,{queue:e.queue,activeQueueIndex:e.activeQueueIndex,queueSource:e.queueSource,activePlaylistId:e.activePlaylistId,playing:e.playing,activeReadingSourceId:e.activeReadingSourceId,onSelect:l=>{U(l)?e.toggleReadingPlayback(l):e.togglePlayback(l),c(!1)}}):null]})};export{vt as CanvasAudioPlayer};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./startup-app-BruT4WBY.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{mh as ja,mg as va,mi as ka,mf as Ma,bi as _t,lG as dt,dk as ee,lJ as $e,lL as Ta,lO as Aa,lC as Ia,lD as Ea,r as l,aM as tn,b_ as Fa,fo as Oa,il as rt,a9 as Ce,eV as bn,aQ as nn,dH as ot,M as O,a0 as mt,aA as $a,is as za,it as Da,mp as Ra,bz as ct,dV as an,gJ as La,gK as Ua,j as s,lE as Ba,a7 as sn,ad as Ga,mq as Va,ih as rn,B as z,X as Ja,mr as on,m as cn,f$ as Ha,k as Ka,le as Ya,lf as qa,d8 as ln,c$ as Wa,d4 as Xa,ms as Za,D as Qa,eo as ei}from"./startup-app-BmKsISci.js";import{au as ti,y as un,af as ni,H as gt,M as dn,T as mn}from"./ai-chat-CbA4VxVi.js";import{P as ai}from"./ParametersDropdown-yEFuMwP3.js";import{u as ii}from"./VideoAnalyzer-DD1ikZBf.js";import{u as si}from"./useMediaViewer-g_sRo1wu.js";import{M as ri}from"./tool-windows-BJIgtPhd.js";/* empty css *//* empty css */import{R as oi}from"./ResizableDivider-4YaXoujg.js";import{_ as Ue}from"./startup-runtime-DTmhLESk.js";/* empty css */const ze=6,ci=1,li=60,oe="16x9",ui=5;function Se(e){const a=typeof e=="number"?e:typeof e=="string"?Number.parseInt(e,10):Number.NaN;return Number.isFinite(a)?Math.min(li,Math.max(ci,Math.floor(a))):ze}function di(e){const a=Se(e.pageCount),t=String(e.userPrompt||"").trim(),r=String(e.stylePrompt||"").trim(),c=String(e.scenarioContext||"").trim(),u=String(e.pdfAttachmentName||"").trim(),g=e.inputMode||"text",f=["语言要求:","- 自动识别用户创作需求的主要语言,并使用同一种语言输出 title、commonPrompt、pages[].title、pages[].script、pages[].prompt 和 notes。","- 如果用户用中文提出需求,除 JSON 字段名、结构化对象键、品牌名、专有名词和必要技术标识外,所有可读内容都必须使用中文,不要把图片提示词改写成英文。","- pages[].prompt 是生成页唯一主要编辑入口,必须自包含:同时写清本页主题、画面主体、构图、必要文案/信息点、风格和色彩,不要依赖 pages[].script 才能理解画面。","- pages[].prompt 不要以「整套连环画统一设定」等全局设定开头;公共视觉基准放在 commonPrompt,每页 prompt 只写本页对应的场景引导和画面要求。","- 后续页面要延续创作场景和前文视觉/叙事语气,但必须给出本页独立的画面主体、构图、信息重点和情绪/文案引导。"].join(`
|
|
3
|
+
`),p=u?[`参考 PDF:本次请求附带 PDF「${u}」。`,"- 请优先阅读 PDF 内容,提取其中的事实信息、品牌/产品定位、结构层级、关键词、视觉线索和可转化为页面的重点。","- 用户创作需求用于限定目标和取舍;PDF 是主要素材来源。若两者冲突,以用户创作需求为准。","- 不要只复述 PDF 原文,要把 PDF 信息重组为适合当前创作场景的多页图文方案。"].join(`
|
|
4
|
+
`):"",v=g==="json"?["提示词类型:结构化 JSON 提示词。","- pages[].prompt 必须生成给图片模型使用的结构化 JSON,可直接返回对象,也可返回 JSON 字符串。","- 结构化 JSON 的字段名可保持英文,但所有字符串取值必须遵守语言要求。","- commonPrompt 可使用结构化对象描述全局视觉一致性,重点包含系列统一风格、色板、字体、角色/品牌一致性。","- 不要把用户输入当成 JSON schema 原样补全;请结合用户需求和 PDF 内容重新策划。",ti("zh")].join(`
|
|
5
|
+
`):["提示词类型:文本提示词。","- commonPrompt 和 pages[].prompt 使用自然语言图片提示词,表达完整画面、风格和一致性要求。","- pages[].prompt 必须是可直接送给图片模型的完整单页提示词。"].join(`
|
|
6
|
+
`);return`你是多页图文内容策划和图像提示词工程师。请根据用户创作需求、创作场景和参考资料,规划 ${a} 页可生成图片的图文方案,并只返回合法 JSON。
|
|
7
|
+
|
|
8
|
+
用户创作需求:
|
|
9
|
+
${t||"围绕一个完整主题创作多页连环图文。"}
|
|
10
|
+
|
|
11
|
+
${p?`${p}
|
|
12
|
+
`:""}
|
|
13
|
+
|
|
14
|
+
${c?`${c}
|
|
15
|
+
`:""}
|
|
16
|
+
${r?`风格补充:
|
|
17
|
+
${r}
|
|
18
|
+
`:""}
|
|
19
|
+
${f}
|
|
20
|
+
|
|
21
|
+
JSON 字段要求:
|
|
22
|
+
- title: 作品标题
|
|
23
|
+
- commonPrompt: 所有页面共用的角色、画风、时代、色彩、构图一致性提示词
|
|
24
|
+
- pages: 长度为 ${a} 的数组,每项包含 title、script、prompt,可选 notes
|
|
25
|
+
|
|
26
|
+
${v}
|
|
27
|
+
|
|
28
|
+
输出要求:
|
|
29
|
+
1. 只返回 JSON,不要 markdown。
|
|
30
|
+
2. pages 必须严格为 ${a} 页。
|
|
31
|
+
3. script 写本页文案、页面说明或画面内容,prompt 写给图像模型的单页画面提示词。
|
|
32
|
+
4. commonPrompt 不要重复塞进每页 prompt,但每页 prompt 要能独立表达画面。`}function mi(e){const a=String(e||"").trim();if(!a)throw new Error("响应为空,未找到有效 JSON");const t=a.match(/```(?:json)?\s*([\s\S]*?)```/i),r=(t==null?void 0:t[1])||a,c=r.indexOf("{"),u=r.lastIndexOf("}");if(c<0||u<=c)throw new Error("响应中未找到有效 JSON");return r.slice(c,u+1)}function pe(e){return typeof e=="string"?e.trim():""}function De(e){if(typeof e=="string")return e.trim();if(e&&typeof e=="object")try{return JSON.stringify(e,null,2)}catch{return""}return""}function gi(e,a="未生成"){const t=De(e);if(!t)return{text:a,isJson:!1};if(!/^[{[]/.test(t))return{text:t,isJson:!1};try{const r=JSON.parse(t);return!r||typeof r!="object"?{text:t,isJson:!1}:{text:JSON.stringify(r,null,2),isJson:!0}}catch{return{text:t,isJson:!1}}}function Ne(e,a){let t=pe(e);const r=/^第\s*\d+\s*页\s*[::、,,.\-\s]*/;for(;r.test(t);)t=t.replace(r,"").trim();return t||`第 ${a} 页(待补全)`}function pi(e,a){const t=JSON.parse(mi(e)),r=Se(a),u=(Array.isArray(t.pages)?t.pages:[]).slice(0,r).map((g,f)=>({title:Ne(g==null?void 0:g.title,f+1),script:pe(g==null?void 0:g.script),prompt:De(g==null?void 0:g.prompt),notes:pe(g==null?void 0:g.notes)}));for(;u.length<r;){const g=u.length+1;u.push({title:`第 ${g} 页(待补全)`,script:"",prompt:"",notes:""})}return{title:pe(t.title)||"未命名连环画",commonPrompt:De(t.commonPrompt),pages:u}}function fi(e){return e.pages.map((a,t)=>{const r=t+1;return{id:`page-${String(r).padStart(2,"0")}`,pageNumber:r,title:Ne(a.title,r),script:pe(a.script),prompt:De(a.prompt),notes:pe(a.notes)||void 0,status:"draft"}})}function hi(e){const a=H(e.commonPrompt||""),t=H(e.pagePrompt||""),r=H(e.script||""),c=H(e.title||""),u=Math.max(1,Math.floor(e.pageNumber||1)),g=Se(e.pageCount||u),f=H(e.size||oe);return[a?`【创作场景基准】
|
|
33
|
+
${a}`:"",`【当前页场景】第 ${u}/${g} 页${c?`:${c}`:""}`,r?`【本页内容引导】
|
|
34
|
+
${r}`:"",t?`【本页图像提示词】
|
|
35
|
+
${t}`:"",`【画面要求】画幅 ${f},整页连环画成品图,文字如需出现必须自然融入画面,不要出现提示词字段名、JSON 或说明文字。`].filter(Boolean).join(`
|
|
36
|
+
|
|
37
|
+
`)}function _i(e,a){return a<=0?0:e==="serial"?1:Math.min(ui,a)}function yi(e){const a=e.selectedPageIds||new Set;return e.pages.filter(t=>e.singlePageId?t.id===e.singlePageId:a.has(t.id)).slice().sort((t,r)=>t.pageNumber-r.pageNumber)}function yt(e){return typeof e=="string"&&e.startsWith("data:")}function Re(e,a){const t=String(e.url||"").trim();return!t||yt(t)?null:{id:e.id||e.taskId||`${t}-${e.generatedAt||""}-${a}`,url:t,mimeType:e.mimeType,generatedAt:e.generatedAt,taskId:e.taskId}}function bi(e){const a=String(e||"").trim();if(a)return a.includes("/")?a:`image/${a}`}function xn(e){const a=Array.isArray(e.urls)&&e.urls.length>0?e.urls:e.url?[e.url]:[],t=bi(e.format);return a.map((r,c)=>Re({id:e.taskId?c===0?e.taskId:`${e.taskId}-${c+1}`:void 0,url:r,mimeType:t,generatedAt:e.generatedAt,taskId:e.taskId},c)).filter(r=>!!r)}function K(e){const t=(Array.isArray(e.imageVariants)?e.imageVariants:[]).map((c,u)=>Re(c,u)).filter(c=>!!c);if(e.imageUrl&&!yt(e.imageUrl)){const c=Re({id:`${e.id}-current-${e.imageGeneratedAt||t.length}`,url:e.imageUrl,mimeType:e.imageMimeType,generatedAt:e.imageGeneratedAt},t.length);c&&t.push(c)}const r=new Set;return t.filter(c=>r.has(c.url)?!1:(r.add(c.url),!0))}function Cn(e){return(e==null?void 0:e.pages.filter(a=>K(a).length>0).length)||0}function pt(e){return(e==null?void 0:e.pages.reduce((a,t)=>a+K(t).length,0))||0}function ft(e,a){const t=K(e),r=new Set(t.map(g=>g.url)),c=[...t];a.forEach((g,f)=>{const p=Re(g,t.length+f);!p||r.has(p.url)||(r.add(p.url),c.push(p))});const u=c[c.length-1];return{...e,imageVariants:c.length>0?c:void 0,imageUrl:(u==null?void 0:u.url)||e.imageUrl,imageMimeType:(u==null?void 0:u.mimeType)||e.imageMimeType,imageGeneratedAt:(u==null?void 0:u.generatedAt)||e.imageGeneratedAt}}function xi(e,a){const t=K(e),r=t.find(c=>c.id===a);return r?{...e,imageVariants:t,imageUrl:r.url,imageMimeType:r.mimeType,imageGeneratedAt:r.generatedAt}:e}function H(e){return e.replace(/\r\n/g,`
|
|
38
|
+
`).trim()}function Ci(e){const a=[`# ${H(e.title)||"未命名连环画"}`],t=H(e.commonPrompt||"");t&&a.push("","## 通用提示词","",t),a.push("","## 分页脚本");for(const r of e.pages){a.push("",`### 第 ${r.pageNumber} 页:${H(r.title)||"未命名"}`,"","#### 脚本","",H(r.script)||"(空)","","#### 图像提示词","",H(r.prompt)||"(空)");const c=H(r.notes||"");c&&a.push("","#### 备注","",c)}return`${a.join(`
|
|
39
|
+
`)}
|
|
40
|
+
`}function wn(e){const a=K(e);if(!yt(e.imageUrl))return{...e,imageVariants:a.length>0?a:void 0};const{imageUrl:t,...r}=e;return{...r,imageVariants:a.length>0?a:void 0}}const Be="comic-creator:records",wi=50;function Ge(e){return{...e,starred:!!e.starred,pages:Array.isArray(e.pages)?e.pages.map(wn):[]}}async function bt(){return Ma(Be,{normalizeRecord:Ge})}async function Pi(e){return va(Be,e,wi,{normalizeRecord:Ge})}async function fe(e,a){return ja(Be,e,Ni(a),{normalizeRecord:Ge})}async function Si(e){return ka(Be,e,{normalizeRecord:Ge})}function Ni(e){return e.pages?{...e,pages:e.pages.map(wn)}:e}function xt(e){return Aa(e,"comicCreatorAction",["outline","page-image"])}function Pn(e){return xt(e)!==null}function Sn(e){var a,t,r;return((a=e.error)==null?void 0:a.message)||((r=(t=e.error)==null?void 0:t.details)==null?void 0:r.originalError)||"任务失败"}function ji(e){return Pn(e)&&(e.status===ee.COMPLETED||e.status===ee.FAILED||e.status===ee.CANCELLED)}async function vi(e){if(e.type!==_t.CHAT||xt(e)!=="outline")return null;const a=dt(e,"comicCreatorRecordId");if(!a)return null;const r=(await bt()).find(c=>c.id===a);if(!r||r.pendingOutlineTaskId!==e.id)return null;if(e.status===ee.FAILED||e.status===ee.CANCELLED)return $e(r,{pendingOutlineTaskId:null,outlineError:e.status===ee.CANCELLED?"提示词规划已取消":Sn(e),updatedAt:Date.now()},fe);if(e.status!==ee.COMPLETED)return null;try{const c=pi(Ta(e),e.params.comicCreatorPageCount||r.pageCount),u=fi(c);return $e(r,{title:c.title,commonPrompt:c.commonPrompt,pageCount:u.length,pages:u,textModel:String(e.params.model||r.textModel||""),textModelRef:e.params.modelRef||r.textModelRef||null,pendingOutlineTaskId:null,outlineError:void 0,updatedAt:Date.now()},fe)}catch(c){return $e(r,{pendingOutlineTaskId:null,outlineError:c instanceof Error?c.message:"提示词规划返回格式错误,请重试",updatedAt:Date.now()},fe)}}async function ki(e){if(e.type!==_t.IMAGE||xt(e)!=="page-image")return null;const a=dt(e,"comicCreatorRecordId"),t=dt(e,"comicCreatorPageId");if(!a||!t)return null;const c=(await bt()).find(p=>p.id===a);if(!c)return null;const u=c.pages.find(p=>p.id===t),g=new Set([u==null?void 0:u.taskId,...(u==null?void 0:u.taskIds)||[]].filter(p=>!!p));if(!u||!g.has(e.id))return null;const f=c.pages.map(p=>{var v;if(p.id!==t)return p;if(e.status===ee.COMPLETED&&((v=e.result)!=null&&v.url)){const y=xn({taskId:e.id,url:e.result.url,urls:e.result.urls,format:e.result.format,generatedAt:e.completedAt||Date.now()});return{...ft(p,y),status:"succeeded",error:void 0}}return e.status===ee.FAILED?{...p,status:"failed",error:Sn(e)}:e.status===ee.CANCELLED?{...p,status:"cancelled",error:"图片生成已取消"}:p});return f===c.pages?null:$e(c,{pages:f,updatedAt:Date.now()},fe)}const je="travel-brochure",Mi=[{id:"brochure",label:"宣传册",category:"商业宣传",description:"把产品、服务或目的地包装成多页宣传册。",audience:"潜在客户与合作伙伴",style:"高端品牌画册,版式清爽,视觉统一",pageFocus:["封面卖点","核心价值","场景展示","信任背书","行动号召"]},{id:"product-manual",label:"产品手册",category:"商业宣传",description:"拆解产品功能、优势和使用场景。",audience:"产品用户与销售团队",style:"科技产品说明图,干净专业,信息清晰",pageFocus:["产品概览","功能亮点","使用流程","对比优势","购买理由"]},{id:"investment-deck",label:"招商册",category:"商业宣传",description:"突出项目机会、商业模式和合作收益。",audience:"投资人、加盟商与渠道伙伴",style:"商务招商视觉,稳重可信,数据感强",pageFocus:["机会背景","项目优势","盈利模式","资源支持","合作邀请"]},{id:"brand-album",label:"品牌画册",category:"商业宣传",description:"展示品牌理念、调性和代表作品。",audience:"品牌客户与媒体访客",style:"品牌视觉大片,精致统一,具有识别度",pageFocus:["品牌理念","视觉资产","代表案例","用户感受","品牌愿景"]},{id:"company-profile",label:"企业介绍",category:"商业宣传",description:"讲清企业能力、团队和案例。",audience:"客户、候选人和合作方",style:"现代企业介绍,可信、简洁、有秩序",pageFocus:["企业定位","团队能力","产品服务","客户案例","未来方向"]},{id:"event-guide",label:"活动指南",category:"商业宣传",description:"为活动生成流程、亮点和现场指引。",audience:"活动参与者",style:"活力活动手册,明快、易读、导览感强",pageFocus:["活动入口","时间安排","重点环节","现场服务","结束回顾"]},{id:"course-intro",label:"课程介绍",category:"商业宣传",description:"介绍课程目标、内容和学习收获。",audience:"学习者和家长",style:"教育课程宣传,亲和、清晰、可信赖",pageFocus:["学习痛点","课程体系","课堂体验","成果展示","报名引导"]},{id:"expo-guide",label:"展会导览",category:"商业宣传",description:"生成展位、动线和重点展品导览。",audience:"展会观众和参展商",style:"展会导览图文,空间感强,信息密度适中",pageFocus:["入口导览","展区分布","重点展品","互动体验","离场信息"]},{id:"real-estate-space",label:"楼盘/空间介绍",category:"商业宣传",description:"展示楼盘、商业空间或文旅空间。",audience:"购房者、租户与参观者",style:"空间设计画册,明亮通透,质感高级",pageFocus:["区位入口","空间规划","生活场景","配套资源","预约参观"]},{id:"travel-brochure",label:"城市文旅宣传",category:"商业宣传",description:"把城市、路线或旅行产品做成多页文旅宣传图。",audience:"旅行者与高定游客户",style:"高定旅行连环画,明亮精致,地域文化突出",pageFocus:["目的地印象","路线亮点","美食体验","人文故事","旅行收束"]},{id:"storybook",label:"绘本",category:"儿童与教育",description:"生成适合儿童阅读的温暖绘本。",audience:"儿童与亲子共读家庭",style:"温暖绘本插画,角色可爱,色彩柔和",pageFocus:["角色登场","小冲突","探索过程","情感转折","温暖结尾"]},{id:"science-reader",label:"科普读物",category:"儿童与教育",description:"把知识点变成易懂的图文科普。",audience:"青少年和大众读者",style:"科普插画,准确清楚,富有好奇心",pageFocus:["问题引入","概念解释","过程拆解","生活例子","知识总结"]},{id:"knowledge-comic",label:"知识漫画",category:"儿童与教育",description:"用漫画方式讲一个知识主题。",audience:"学生和自学者",style:"轻松知识漫画,分镜清楚,重点突出",pageFocus:["提出问题","误区对比","核心知识","练习应用","复盘总结"]},{id:"history-story",label:"历史故事",category:"儿童与教育",description:"把历史事件或时代片段讲成连环画。",audience:"历史学习者",style:"历史插画,时代细节准确,叙事庄重",pageFocus:["时代背景","关键人物","事件推进","影响结果","历史启示"]},{id:"biography",label:"人物传记",category:"儿童与教育",description:"展现人物成长、选择和成就。",audience:"学生与人物故事读者",style:"传记插画,真实可信,情感克制",pageFocus:["童年背景","关键选择","重要挑战","代表成就","精神遗产"]},{id:"classroom-slides",label:"课堂课件",category:"儿童与教育",description:"生成适合课堂讲解的图文页。",audience:"教师和学生",style:"课堂视觉辅助,简洁明快,重点明确",pageFocus:["课程导入","知识讲解","案例演示","互动练习","课堂总结"]},{id:"parent-child-reading",label:"亲子阅读",category:"儿童与教育",description:"强调亲子陪伴和互动提问。",audience:"亲子家庭",style:"亲子阅读绘本,柔和、安全、互动感强",pageFocus:["亲子场景","共同发现","提问互动","情绪表达","陪伴结尾"]},{id:"language-learning",label:"语言学习",category:"儿童与教育",description:"用场景图帮助词汇、句型或对话学习。",audience:"语言学习者",style:"语言学习卡通图,场景明确,表达自然",pageFocus:["词汇场景","句型示范","角色对话","纠错提示","复习应用"]},{id:"experiment-steps",label:"实验步骤",category:"儿童与教育",description:"把实验过程拆成安全清晰的步骤图。",audience:"学生和实验课教师",style:"实验流程插图,步骤清楚,安全提示醒目",pageFocus:["材料准备","步骤一","观察变化","结果解释","安全收尾"]},{id:"campus-publication",label:"校园刊物",category:"儿童与教育",description:"做成校园报道、社团或班级刊物。",audience:"师生与家长",style:"校园刊物插画,青春、明亮、有记录感",pageFocus:["校园主题","人物活动","成果展示","同学声音","集体记忆"]},{id:"newspaper-serial",label:"报刊连载",category:"媒体出版",description:"生成连续报道或连载图文。",audience:"报刊读者",style:"报刊插画,黑白灰层次清楚,叙事紧凑",pageFocus:["导语","事件现场","人物观点","背景补充","结尾悬念"]},{id:"magazine-feature",label:"杂志专题",category:"媒体出版",description:"适合专题报道和视觉专题页。",audience:"杂志读者",style:"杂志专题视觉,构图讲究,图文高级",pageFocus:["专题封面","核心观点","人物/地点","细节特写","专题结论"]},{id:"travel-magazine",label:"旅行杂志",category:"媒体出版",description:"以杂志方式呈现目的地体验。",audience:"旅行爱好者",style:"旅行杂志插画,电影感、地域感、生活方式感",pageFocus:["目的地开场","路线体验","当地人物","美食风物","旅行建议"]},{id:"food-column",label:"美食栏目",category:"媒体出版",description:"围绕菜品、餐厅或城市美食展开。",audience:"美食读者",style:"美食栏目插画,食物诱人,氛围鲜活",pageFocus:["招牌食物","制作/来源","用餐场景","人物评价","推荐清单"]},{id:"interview-profile",label:"人物专访",category:"媒体出版",description:"用多页画面表现人物观点和故事。",audience:"媒体读者",style:"人物专访视觉,真实、克制、有镜头感",pageFocus:["人物出场","工作场景","关键观点","生活侧面","金句收尾"]},{id:"news-explainer",label:"新闻图解",category:"媒体出版",description:"把复杂新闻拆成可视化解释。",audience:"新闻读者",style:"新闻信息图插画,客观、清晰、结构化",pageFocus:["发生了什么","为何重要","相关各方","影响范围","后续关注"]},{id:"longform-report",label:"深度报道",category:"媒体出版",description:"呈现调查过程、人物和现场。",audience:"深度内容读者",style:"纪实插画,真实、细节丰富、叙事沉稳",pageFocus:["问题入口","现场证据","人物经历","结构原因","追问结尾"]},{id:"cover-story",label:"封面故事",category:"媒体出版",description:"适合杂志封面级主题故事。",audience:"杂志与内容平台用户",style:"封面故事视觉,强主视觉,高级排版感",pageFocus:["封面画面","主题展开","关键人物","反差细节","余韵收束"]},{id:"editorial-comic",label:"图文社评",category:"媒体出版",description:"用图文表达观点、立场和推理。",audience:"观点内容读者",style:"社评漫画,象征明确,表达克制有力",pageFocus:["观点提出","现象呈现","原因分析","反方提醒","观点落点"]},{id:"community-brief",label:"社区简报",category:"媒体出版",description:"记录社区公告、活动和公共服务。",audience:"社区居民",style:"社区简报插画,亲切、清楚、生活化",pageFocus:["公告主题","服务信息","居民参与","注意事项","联系方式"]},{id:"xhs-post",label:"小红书图文",category:"社交与营销",description:"生成适合小红书发布的多页图文。",audience:"小红书用户",style:"小红书图文,清新、强封面、信息密度适中",pageFocus:["封面钩子","痛点/亮点","步骤/清单","避坑建议","互动结尾"]},{id:"moments-long-image",label:"朋友圈长图",category:"社交与营销",description:"适合朋友圈传播的多页图文。",audience:"微信好友与私域客户",style:"朋友圈长图,温暖真实,轻营销",pageFocus:["情境开场","真实体验","重点信息","价值总结","轻行动"]},{id:"wechat-article-images",label:"公众号配图",category:"社交与营销",description:"为公众号文章生成段落配图。",audience:"公众号读者",style:"公众号配图,稳重耐看,主题统一",pageFocus:["文章开场","核心论点","案例场景","方法总结","结尾金句"]},{id:"short-video-storyboard",label:"短视频分镜",category:"社交与营销",description:"把短视频脚本拆为画面分镜。",audience:"短视频创作者",style:"短视频 storyboard,镜头明确,节奏强",pageFocus:["开头钩子","冲突/反差","展示过程","高潮画面","结尾转化"]},{id:"ad-storyboard",label:"广告 storyboard",category:"社交与营销",description:"用于广告片、TVC 或投放素材前期。",audience:"广告创意团队",style:"广告分镜图,商业质感,镜头语言清晰",pageFocus:["产品出现","用户痛点","解决方案","品牌记忆点","购买行动"]},{id:"festival-posters",label:"节日海报组图",category:"社交与营销",description:"生成节日主题连续海报或祝福组图。",audience:"品牌粉丝和社群用户",style:"节日海报插画,喜庆但不俗套,系列感强",pageFocus:["节日开场","传统元素","产品/品牌融入","祝福场景","收尾海报"]},{id:"event-recap",label:"活动回顾",category:"社交与营销",description:"把活动过程整理成复盘组图。",audience:"参与者、客户和内部团队",style:"活动回顾图文,现场感强,重点清楚",pageFocus:["活动开场","精彩瞬间","嘉宾/用户","成果数据","感谢收尾"]},{id:"case-breakdown",label:"案例拆解",category:"社交与营销",description:"拆解一个案例的方法、过程和结果。",audience:"行业读者和潜在客户",style:"案例拆解图文,专业、结构化、可复用",pageFocus:["案例背景","挑战问题","解决动作","结果展示","可复用经验"]},{id:"recommendation-note",label:"种草笔记",category:"社交与营销",description:"生成产品或目的地种草图文。",audience:"消费决策用户",style:"种草笔记插画,真实体验,细节丰富",pageFocus:["吸引点","使用/体验","细节优点","适合人群","购买/到访建议"]},{id:"checklist-guide",label:"清单攻略",category:"社交与营销",description:"把攻略、步骤或清单做成多页图。",audience:"收藏型内容用户",style:"攻略清单图文,清爽、实用、便于截图保存",pageFocus:["总览清单","准备事项","步骤拆解","避坑提醒","最终总结"]},{id:"classic-comic",label:"连环画",category:"叙事与娱乐",description:"传统多页连环画叙事。",audience:"漫画与故事读者",style:"经典连环画,分镜连贯,叙事清楚",pageFocus:["开端","人物关系","冲突升级","转折","结局"]},{id:"four-panel-comic",label:"四格漫画",category:"叙事与娱乐",description:"四格或短篇幽默漫画结构。",audience:"轻阅读用户",style:"四格漫画,表情夸张,节奏干净",pageFocus:["设定","误会","反转","笑点"]},{id:"multi-page-manga",label:"多页漫画",category:"叙事与娱乐",description:"更丰富的多页剧情漫画。",audience:"漫画读者",style:"现代漫画,镜头丰富,人物一致",pageFocus:["世界设定","角色行动","情绪推进","高潮","悬念"]},{id:"fantasy-adventure",label:"奇幻冒险",category:"叙事与娱乐",description:"奇幻世界、旅程和战斗冒险。",audience:"奇幻故事读者",style:"奇幻冒险插画,宏大、神秘、角色鲜明",pageFocus:["召唤/启程","陌生世界","同伴/敌人","危机战斗","发现秘密"]},{id:"mystery-story",label:"悬疑故事",category:"叙事与娱乐",description:"用多页画面铺设线索和反转。",audience:"悬疑读者",style:"悬疑漫画,光影强烈,线索可见但克制",pageFocus:["异常开场","线索出现","误导","逼近真相","反转"]},{id:"romance-story",label:"恋爱故事",category:"叙事与娱乐",description:"讲述关系、心动和情绪变化。",audience:"情感故事读者",style:"恋爱漫画,细腻、温柔、有生活感",pageFocus:["初遇","靠近","误会/试探","坦白","温柔结尾"]},{id:"urban-daily",label:"都市日常",category:"叙事与娱乐",description:"城市生活、职场和日常小故事。",audience:"都市生活读者",style:"都市日常漫画,真实、轻松、细节生活化",pageFocus:["日常场景","小问题","人物互动","情绪释放","生活感收尾"]},{id:"game-plot",label:"游戏剧情",category:"叙事与娱乐",description:"为游戏任务、剧情或关卡生成分镜。",audience:"游戏策划和玩家",style:"游戏剧情概念图,动作明确,世界观统一",pageFocus:["任务触发","地图探索","NPC 交互","挑战战斗","奖励/伏笔"]},{id:"character-set",label:"角色设定集",category:"叙事与娱乐",description:"多页展示角色外貌、性格和关系。",audience:"创作者和设定读者",style:"角色设定集,设计感强,人物统一",pageFocus:["角色正面","服装道具","性格动作","关系图","代表场景"]},{id:"worldbuilding",label:"世界观设定",category:"叙事与娱乐",description:"展示一个世界的地点、规则和势力。",audience:"创作者和设定爱好者",style:"世界观设定图,宏大、细节丰富、系统感强",pageFocus:["世界概览","地理空间","规则机制","势力人物","故事入口"]},{id:"how-to-guide",label:"操作指南",category:"实用说明",description:"把操作流程做成逐页说明。",audience:"普通用户",style:"操作指南图,步骤清晰,图标化辅助",pageFocus:["准备条件","步骤一","关键操作","常见问题","完成确认"]},{id:"sop-flow",label:"SOP 流程",category:"实用说明",description:"把标准作业流程可视化。",audience:"团队成员和管理者",style:"SOP 流程图文,严谨、清楚、可执行",pageFocus:["流程入口","职责分工","关键步骤","检查标准","异常处理"]},{id:"safety-training",label:"安全培训",category:"实用说明",description:"呈现安全风险、规范和应急动作。",audience:"员工、学生和公众",style:"安全培训插画,警示明确,动作规范",pageFocus:["风险识别","错误示范","正确操作","应急处理","复盘提醒"]},{id:"medical-science",label:"医疗科普",category:"实用说明",description:"把健康知识用非诊断方式讲清楚。",audience:"大众健康读者",style:"医疗科普插画,温和、准确、避免恐吓",pageFocus:["症状/问题","原理解释","日常建议","何时就医","提醒总结"]},{id:"legal-science",label:"法律科普",category:"实用说明",description:"解释法律概念、流程或权益。",audience:"普通公众",style:"法律科普图文,客观、清楚、案例化",pageFocus:["问题场景","法律概念","案例对照","处理步骤","风险提醒"]},{id:"policy-explainer",label:"政策解读",category:"实用说明",description:"把政策条款拆成易懂页面。",audience:"政策相关群体",style:"政策解读图文,正式、清晰、信息分层",pageFocus:["政策对象","核心变化","办理流程","影响说明","注意事项"]},{id:"user-manual",label:"用户手册",category:"实用说明",description:"为产品或服务生成用户手册。",audience:"产品用户",style:"用户手册插图,简洁、准确、低干扰",pageFocus:["功能入口","基础使用","高级功能","问题排查","支持渠道"]},{id:"emergency-plan",label:"应急预案",category:"实用说明",description:"展示突发事件下的行动流程。",audience:"组织成员和公众",style:"应急预案图文,醒目、冷静、步骤明确",pageFocus:["风险发生","第一反应","撤离/处置","联络协作","恢复复盘"]},{id:"recipe-tutorial",label:"菜谱教程",category:"实用说明",description:"把菜谱拆成逐步视觉教程。",audience:"家庭烹饪用户",style:"菜谱教程插画,食材清楚,步骤诱人",pageFocus:["食材准备","处理食材","烹饪过程","装盘细节","口味提示"]},{id:"fitness-plan",label:"健身计划",category:"实用说明",description:"展示训练动作、节奏和注意事项。",audience:"健身用户",style:"健身训练图,动作标准,健康积极",pageFocus:["热身","动作一","动作二","拉伸","计划建议"]}];function Ti(e){return[`请为「${e.label}」创作一组连贯的多页图文。`,"主题:请替换为你的具体主题、产品、地点或事件。",`目标读者:${e.audience}。`,`视觉风格:${e.style}。`,`页面重点依次覆盖:${e.pageFocus.join("、")}。`,"要求每页都给出清晰标题、画面剧情/文案、图片提示词,整套角色、色彩和版式保持一致。"].join(`
|
|
41
|
+
`)}function Ai(e){return JSON.stringify({title:`${e.label}标题`,theme:"请替换为你的具体主题、产品、地点或事件",scenario:e.label,audience:e.audience,style:e.style,characters:[{name:"主角或核心对象",description:"请描述人物、产品、品牌或地点的统一视觉特征"}],pages:e.pageFocus.map((a,t)=>({title:`${t+1}. ${a}`,script:`围绕“${a}”展开本页文案或画面剧情`,prompt:`表现“${a}”的关键画面,保持 ${e.style}`})),visualRules:["整套画风、角色、色彩和版式统一","每页画面重点明确,适合单独成图","如需文字,文字应自然融入画面,避免出现字段名"]},null,2)}const we=Mi.map(e=>({...e,textPrompt:Ti(e),jsonPrompt:Ai(e)}));function Pe(e){return we.find(a=>a.id===e)||we.find(a=>a.id===je)||we[0]}function Fe(e,a){const t=Pe(e);return a==="json"?t.jsonPrompt:t.textPrompt}function gn(e){const a=String(e||"").trim();return a?we.some(t=>t.textPrompt.trim()===a||t.jsonPrompt.trim()===a):!0}function Ii(e){const a=Pe(e),t=a.pageFocus.map((r,c)=>`第 ${c+1} 页:${r}`).join(";");return[`创作场景:${a.category} / ${a.label}`,`场景说明:${a.description}`,`目标读者:${a.audience}`,`场景风格:${a.style}`,`页面引导:${t}。如页数不同,请按该场景节奏扩展或合并。`,"生成要求:后续页面要延续创作场景和前文视觉/叙事语气,但每页必须有独立的场景引导、画面主体、构图和信息重点,避免只套用统一设定。"].join(`
|
|
42
|
+
`)}async function Ct(){return Ue(()=>import("./startup-app-BmKsISci.js").then(e=>e.mw),__vite__mapDeps([0]),import.meta.url)}async function Ei(){return Ue(()=>import("./office-data-BGeIlv11.js").then(e=>e.j),[],import.meta.url)}async function Fi(){return Ue(()=>import("./office-data-BGeIlv11.js").then(e=>e.p),[],import.meta.url)}async function Oi(){return Ue(()=>import("./jspdf.es.min-ClNUHu_u.js").then(e=>e.j),[],import.meta.url)}function Le(e,a="comic"){return String(e||"").trim().replace(/[\\/:*?"<>|]+/g,"-").replace(/\s+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,80)||a}function $i(e){return Le(e.title||"comic","comic")}function Nn(e){const a=Math.max(1,Math.floor(e.pageNumber||1)),t=String(a).padStart(2,"0"),r=Number.isFinite(e.variantNumber)?Math.max(1,Math.floor(e.variantNumber||1)):void 0,c=r?`-${r}`:"",u=Le(e.title||"","").replace(/^[||]\s*/,"").trim(),g=u?` ${u}`:"",f=Le(e.extension||"png","png");return`images/page-${t}${g}${c}.${f}`}function zi(e){var u,g;const t=String((e==null?void 0:e.mimeType)||"").toLowerCase().match(/^image\/([a-z0-9.+-]+)$/);if(t)return t[1].replace("jpeg","jpg").replace("svg+xml","svg");const r=String((e==null?void 0:e.url)||""),c=r.match(/^data:image\/([a-z0-9.+-]+)[;,]/i);if(c)return c[1].toLowerCase().replace("jpeg","jpg").replace("svg+xml","svg");try{const f=r.startsWith("/")||!r.includes("://")?r:new URL(r).pathname,p=(g=(u=f.split("/").pop())==null?void 0:u.split(".").pop())==null?void 0:g.toLowerCase();if(p&&p!==f&&/^[a-z0-9]{1,5}$/.test(p))return p}catch{}return"png"}function jn(e,a){return a.find(t=>vn(e,t))}function vn(e,a){return!!a.pageId&&a.pageId===e.id||!!a.pageNumber&&a.pageNumber===e.pageNumber}function Ve(e,a){return a!=null&&a.length?a:e.pages.filter(t=>!!t.imageUrl).map(t=>{var r;return{pageId:t.id,pageNumber:t.pageNumber,url:t.imageUrl,mimeType:t.imageMimeType,...(r=e.imageParams)!=null&&r.size?{aspectRatio:e.imageParams.size}:{}}})}function Di(e){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(typeof e!="string")return;const a=e.trim(),t=a.match(/^(\d+(?:\.\d+)?)\s*[:/xX]\s*(\d+(?:\.\d+)?)$/);if(t){const c=Number(t[1]),u=Number(t[2]);return c>0&&u>0?c/u:void 0}const r=Number(a);return Number.isFinite(r)&&r>0?r:void 0}function kn(e){const a=Number(e==null?void 0:e.width),t=Number(e==null?void 0:e.height);return Number.isFinite(a)&&Number.isFinite(t)&&a>0&&t>0?a/t:Di(e==null?void 0:e.aspectRatio)}function Mn(e){var a;return kn((a=e[0])==null?void 0:a.source)||16/9}function Tn(e,a){const t=Math.max(0,e.width),r=Math.max(0,e.height),c=a.width>0&&a.height>0?a.width/a.height:1,u=t>0&&r>0?t/r:c;if(c>u){const p=t,v=p/c;return{x:0,y:(r-v)/2,width:p,height:v}}const g=r,f=g*c;return{x:(t-f)/2,y:0,width:f,height:g}}function Ri(e,a){return e.pages.map(t=>({page:t,source:jn(t,a)}))}function Li(e,a){return e.pages.flatMap(t=>a.filter(r=>vn(t,r)).map(r=>({page:t,source:r})))}function An(e,a){return Ri(e,a).map(t=>{if(!t.source)throw new Error(`第 ${t.page.pageNumber} 页缺少图片,无法导出`);return{page:t.page,source:t.source}})}function Ui(e,a={}){const t=(a.now||new Date).toISOString(),r=Ve(e,a.imageSources),c=e.pages.map(u=>{const g=jn(u,r),f=zi(g),p=g?Nn({pageNumber:u.pageNumber,title:u.title,extension:f}):void 0;return{id:u.id,pageNumber:u.pageNumber,title:u.title,script:u.script,prompt:u.prompt,notes:u.notes,imageFilename:p,imageMimeType:(g==null?void 0:g.mimeType)||u.imageMimeType}});return{title:e.title,pageCount:e.pageCount,commonPrompt:e.commonPrompt,exportedAt:t,pages:c}}function wt(e,a){const t=Ui(e,a);return{baseName:a!=null&&a.filename?Le(a.filename):$i(e),manifest:t,manifestJson:`${JSON.stringify(t,null,2)}
|
|
43
|
+
`,markdown:Ci(e)}}async function Pt(e,a){const t=a.normalizeImageDataUrl(e.url),r=await fetch(t,{referrerPolicy:"no-referrer"});if(!r.ok)throw new Error(`图片下载失败:${r.status}`);return r.blob()}async function Bi(e,a={}){const[{default:t},r]=await Promise.all([Ei(),Ct()]),c=wt(e,a),u=new t;u.file("manifest.json",c.manifestJson),u.file("script.md",c.markdown);const g=Ve(e,a.imageSources),f=new Map(c.manifest.pages.map(y=>[y.id,y])),p=Li(e,g).map(y=>({page:f.get(y.page.id),source:y.source})).filter(y=>{var k;return!!(y.source&&((k=y.page)!=null&&k.imageFilename))});await r.processBatchWithConcurrency(p,async({page:y,source:k})=>{const B=await Pt(k,r),L=!k.variantNumber&&y.imageFilename?y.imageFilename:Nn({pageNumber:y.pageNumber,title:y.title,variantNumber:k.variantNumber,extension:r.getFileExtension(k.url,B.type||k.mimeType)});u.file(L,B)},Math.max(1,Math.min(3,a.imageConcurrency||1)));const v=await u.generateAsync({type:"blob"});r.downloadFromBlob(v,`${c.baseName}.zip`)}async function In(e){return new Promise((a,t)=>{const r=new FileReader;r.onerror=()=>t(r.error||new Error("图片读取失败")),r.onload=()=>a(String(r.result||"")),r.readAsDataURL(e)})}function Gi(e){const a=Mn(e),t=10;return{width:t,height:t/a}}function Vi(e){const a=Mn(e),t=297;return a>=1?{width:t,height:t/a}:{width:t*a,height:t}}function En(e,a){return{width:kn(e)||a,height:1}}function Ji(e){const a=String(e||"").toLowerCase();return a.includes("jpeg")||a.includes("jpg")?"JPEG":a.includes("webp")?"WEBP":"PNG"}async function Hi(e,a={}){var y,k;const[{default:t},r]=await Promise.all([Fi(),Ct()]),c=wt(e,a),u=Ve(e,a.imageSources),g=An(e,u),f=Gi(g),p=new t;(y=p.defineLayout)==null||y.call(p,{name:"COMIC_IMAGE_ONLY",width:f.width,height:f.height}),p.layout="COMIC_IMAGE_ONLY",p.author="Aitu",p.subject="Comic export",p.title=e.title;for(const{source:B}of g){const L=await Pt(B,r),ce=await In(L),V=p.addSlide(),ie=Tn(f,En(B,f.width/f.height));(k=V.addImage)==null||k.call(V,{data:ce,x:ie.x,y:ie.y,w:ie.width,h:ie.height})}const v=await p.write({outputType:"blob"});r.downloadFromBlob(v,`${c.baseName}.pptx`)}async function Ki(e,a={}){var y;const[{default:t},r]=await Promise.all([Oi(),Ct()]),c=wt(e,a),u=Ve(e,a.imageSources),g=An(e,u),f=Vi(g),p=f.width>=f.height?"landscape":"portrait",v=new t({unit:"mm",format:[f.width,f.height],orientation:p});for(let k=0;k<g.length;k+=1){const{source:B}=g[k];k>0&&v.addPage([f.width,f.height],p);const L=await Pt(B,r),ce=await In(L),V=Tn(f,En(B,f.width/f.height));(y=v.addImage)==null||y.call(v,ce,Ji(L.type||B.mimeType),V.x,V.y,V.width,V.height)}r.downloadFromBlob(v.output("blob"),`${c.baseName}.pdf`)}const pn="comic-creator:text-model",fn="comic-creator:image-model",ht="comic-creator:story-prompt",Fn="comic-creator:story-prompt-mode",On="comic-creator:scenario-id",Yi=20*1024*1024,St="multi_image_generation",Nt="comic_creator_tool",qi="multi_image_generation_action",Wi="multi_image_generation_page_view",Xi="multi_image_generation_unique_view",hn="comic-creator:analytics:daily-unique-view",$n=[1,2,3,4];function Zi(e=new Date){const a=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${a}-${t}-${r}`}function Qi(e){try{return localStorage.getItem(hn)===e?!1:(localStorage.setItem(hn,e),!0)}catch{return!1}}function re(e){return!Number.isFinite(e||0)||!e?"0":e<1024*1024?"<1MB":e<5*1024*1024?"1-5MB":e<10*1024*1024?"5-10MB":"10MB+"}function N(e){const a=(e==null?void 0:e.pages.length)||0,t=Cn(e),r=pt(e),c=(e==null?void 0:e.pages.filter(u=>u.status==="failed").length)||0;return{has_record:!!e,page_count:a,generated_count:r,generated_page_count:t,failed_count:c,completion_rate:a>0?t/a:0}}function w(e,a){Ce.track(qi,{category:"ai_generation",area:St,surface:Nt,tool_id:bn,tool_name:"多图生成",action:e,...a||{},timestamp:Date.now()})}function P(e,a){const t=a||{};Ce.trackUIInteraction({area:St,action:"click",control:e,source:Nt,metadata:t}),w("click",{control:e,event_type:"click",...t})}const es=[{id:"plan",label:"提示词"},{id:"generate",label:"生成"}];function ts(){try{return sessionStorage.getItem(ht)||""}catch{return""}}function ns(e){try{e.trim()?sessionStorage.setItem(ht,e):sessionStorage.removeItem(ht)}catch{}}function as(){try{return sessionStorage.getItem(Fn)==="json"?"json":"text"}catch{return"text"}}function is(e){try{sessionStorage.setItem(Fn,e)}catch{}}function ss(){try{return sessionStorage.getItem(On)||je}catch{return je}}function rs(e){try{sessionStorage.setItem(On,e)}catch{}}function os(e){const a=`${e.id} ${e.label} ${e.shortLabel||""} ${e.sourceProfileName||""}`.toLowerCase();return e.vendor===sn.GEMINI||e.vendor===sn.GOOGLE||a.includes("gemini")}function _n(e){return e.sourceProfileId?Ga(e.sourceProfileId,e.id):null}function Oe(e,a,t){const r=gt(a,t);return e.some(c=>(c.selectionKey||c.id)===r)}function cs(e){return!Number.isFinite(e)||e<=0?"0 KB":e<1024*1024?`${Math.max(1,Math.round(e/1024))} KB`:`${(e/1024/1024).toFixed(1)} MB`}function ls(e){return e.reduce((a,t)=>{var r,c,u;if(t.id==="size"){const g=(r=t.options)==null?void 0:r.some(f=>f.value===oe);return a[t.id]=g?oe:t.defaultValue||((u=(c=t.options)==null?void 0:c[0])==null?void 0:u.value)||oe,a}return t.defaultValue&&(a[t.id]=t.defaultValue),a},{})}function lt(e,a){var u;const r={...ls(a)},c=e||{};for(const g of a){const f=c[g.id];f&&(g.valueType==="enum"&&((u=g.options)!=null&&u.length)&&!g.options.some(p=>p.value===f)||(r[g.id]=f))}return r.size||(r.size=oe),r}function ut(e){return e.map((a,t)=>({...a,pageNumber:t+1}))}function us(e){return{id:mt(),pageNumber:e,title:`第 ${e} 页`,script:"",prompt:"",status:"draft"}}function ds(e){const a=Ne(e.title,e.pageNumber);return a===`第 ${e.pageNumber} 页`?"":a}function yn(e,a){const t=gi(e,a),r=["comic-outline-preview__content",t.isJson?"comic-outline-preview__content--json":""].filter(Boolean).join(" ");return s.jsx("pre",{className:r,children:t.text})}function ms(e){var t;const a=zn((t=e.imageParams)==null?void 0:t.size);return e.pages.filter(r=>!!r.imageUrl).map(r=>({pageId:r.id,pageNumber:r.pageNumber,url:r.imageUrl,mimeType:r.imageMimeType,aspectRatio:a}))}function gs(e){var t;const a=zn((t=e.imageParams)==null?void 0:t.size);return e.pages.flatMap(r=>{const c=K(r);if(c.length===0)return[];const u=r.imageUrl?c.findIndex(p=>p.url===r.imageUrl):-1,g=c[u>=0?u:c.length-1];let f=1;return[g,...c.filter(p=>p.url!==g.url)].map(p=>{const v=p.url===g.url,y={pageId:r.id,pageNumber:r.pageNumber,url:p.url,mimeType:p.mimeType||r.imageMimeType,aspectRatio:a};return v||(y.variantNumber=f,f+=1),y})})}function ps(e){const a=e.data,t=e.task,r=[...Array.isArray(a==null?void 0:a.taskIds)?a.taskIds:[],a==null?void 0:a.taskId,e.taskId,t==null?void 0:t.id].filter(c=>typeof c=="string"&&c.length>0);return Array.from(new Set(r))}function fs(e){return $n.includes(e)?e:1}function zn(e){const a=String(e||"").trim().replace(/[xX]/g,":");return/^\d+(?:\.\d+)?:\d+(?:\.\d+)?$/.test(a)?a:void 0}function hs(e){return e.pendingOutlineTaskId?"规划中":e.pages.some(a=>a.status==="running"||a.status==="queued")?"生成中":e.pages.some(a=>a.status==="failed")?"有失败":e.pages.length>0&&e.pages.every(a=>K(a).length>0)?"已完成":e.pages.length>0?"已规划":"草稿"}function _s(e){return!Number.isFinite(e)||e<=0?"时间未知":new Date(e).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}const Ms=()=>{const{records:e,setRecords:a,currentRecord:t,showStarred:r,setShowStarred:c,starredCount:u,selectRecord:g,updateCurrentRecord:f,restart:p,applySyncedRecord:v}=Ia({loadRecords:bt,logPrefix:"[ComicCreator]"}),{page:y,setPage:k,navigateToStep:B,goToDefaultPage:L,openHistory:ce,openStarred:V,toggleStarred:ie}=Ea({initialPage:"plan",defaultPage:"plan",historyPage:"history",setShowStarred:c}),{openViewer:jt,viewerProps:Dn}=si({showNavbar:!0,showToolbar:!0,showTitle:!0}),b=l.useRef(null),le=l.useRef(new Set),te=l.useRef(null),vt=l.useRef(Promise.resolve()),ve=l.useRef(null),kt=l.useRef(null),Je=l.useRef(null),Mt=l.useRef(!1),Tt=l.useRef(null),He=un("text"),Rn=un("image"),U=l.useMemo(()=>He.filter(os),[He]),At=l.useMemo(()=>tn(pn,Fa),[]),Ke=l.useMemo(()=>tn(fn,Oa),[]),Ln=l.useMemo(()=>(t==null?void 0:t.sourcePromptMode)||as(),[]),It=l.useMemo(()=>Pe((t==null?void 0:t.scenarioId)||ss()).id,[]),[ne,ke]=l.useState(()=>(t==null?void 0:t.sourcePrompt)||ts()||Fe(It,"text")),[D,Ye]=l.useState(()=>Ln),[M,qe]=l.useState(It),[Me,Te]=l.useState(String(ze)),[A,Et]=l.useState(At.modelId),[R,Ft]=l.useState(At.modelRef),[x,Ot]=l.useState(null),[j,$t]=l.useState(Ke.modelId),[se,zt]=l.useState(Ke.modelRef),Ae=l.useMemo(()=>rt(j),[j]),[Y,We]=l.useState(()=>lt(void 0,rt(Ke.modelId))),[Xe,Dt]=l.useState([]),[I,Rt]=l.useState("serial"),[E,Un]=l.useState(1),[G,ue]=l.useState(new Set),[ae,Lt]=l.useState(!1),[T,de]=l.useState({running:!1,stopping:!1,current:0,total:0,message:""}),[me,Ut]=l.useState(null),[ge,Ze]=l.useState(null),[he,Bn]=l.useState(""),[q,Gn]=l.useState("all"),Qe=l.useMemo(()=>Pe(M),[M]),et=x?U:He,_e=l.useMemo(()=>{const n=Xe.map(i=>i.url.trim()).filter(Boolean);return Array.from(new Set(n))},[Xe]),Vn=l.useMemo(()=>{const n=new Map;for(const i of we){const o=n.get(i.category)||[];o.push(i),n.set(i.category,o)}return Array.from(n.entries())},[]),Jn=!gn(ne);l.useEffect(()=>{b.current=t},[t]),l.useEffect(()=>{if(Mt.current)return;Mt.current=!0;const n=Zi(),i={category:"ai_generation",area:St,surface:Nt,tool_id:bn,tool_name:"多图生成",metric:"pv",active_page:y,records_count:e.length,starred_count:u,view_date:n,...N(t),timestamp:Date.now()};Ce.track(Wi,i),Ce.isAnalyticsEnabled()&&Qi(n)&&Ce.track(Xi,{...i,metric:"uv",unique_period:"daily"})},[t,y,e.length,u]),l.useEffect(()=>{Tt.current!==y&&(Tt.current=y,w("step_view",{active_page:y,records_count:e.length,starred_count:u,...N(t)}))},[t,y,e.length,u]),l.useEffect(()=>{!t||t.pendingOutlineTaskId||t.pages.length===0||Je.current!==t.id||(Je.current=null,requestAnimationFrame(()=>{var n;(n=kt.current)==null||n.scrollIntoView({behavior:"smooth",block:"start"})}))},[t==null?void 0:t.id,t==null?void 0:t.pages.length,t==null?void 0:t.pendingOutlineTaskId]),l.useEffect(()=>{We(n=>lt(n,Ae))},[Ae]),l.useEffect(()=>{t&&(ke(t.sourcePrompt||""),Ye(t.sourcePromptMode||"text"),qe(Pe(t.scenarioId).id),Te(String(t.pageCount||ze)),Rt(t.generationMode||"serial"),t.textModel&&(Et(t.textModel),Ft(t.textModelRef||null)),t.imageModel&&($t(t.imageModel),zt(t.imageModelRef||null)),t.imageParams&&We(n=>lt({...n,...t.imageParams},rt(t.imageModel||j))))},[t==null?void 0:t.id]),l.useEffect(()=>{Dt([])},[t==null?void 0:t.id]),l.useEffect(()=>{t||(ns(ne),is(D),rs(M))},[t,D,M,ne]),l.useEffect(()=>{const n=(t==null?void 0:t.pages.map(i=>i.id))||[];ue(i=>{if(n.length===0)return new Set;const o=new Set([...i].filter(d=>n.includes(d)));return o.size===0&&n.forEach(d=>o.add(d)),o})},[t==null?void 0:t.pages]);const Hn=l.useCallback(async n=>Pn(n)?await vi(n)||ki(n):null,[]);ii({syncTask:Hn,applySyncedRecord:v,shouldHandleTask:ji,logPrefix:"[ComicCreator]"});const ye=l.useCallback((n,i)=>{Et(n),Ft(i||null),nn(pn,n,i)},[]),Kn=l.useCallback((n,i)=>{w("image_model_changed",{event_type:"select",image_model:n,previous_image_model:j}),$t(n),zt(i||null),nn(fn,n,i)},[j]),Yn=l.useCallback((n,i)=>{w("image_param_changed",{event_type:"change",image_model:j,param_id:n,param_value:i}),We(o=>({...o,[n]:i}))},[j]);l.useEffect(()=>{if(!x||U.length===0||Oe(U,A,R))return;const n=U[0];ye(n.id,_n(n))},[U,x,ye,A,R]);const tt=l.useCallback((n=M)=>{ke(Fe(n,"text"))},[M]),qn=l.useCallback(n=>{const i=gn(ne);w("scenario_changed",{event_type:"change",scenario_id:n,previous_scenario_id:M,auto_apply_template:i,has_record:!!b.current}),qe(n),i&&tt(n)},[tt,M,ne]),Bt=l.useCallback(n=>{w("prompt_mode_changed",{event_type:"click",prompt_input_mode:n,previous_prompt_input_mode:D,has_record:!!b.current}),Ye(n)},[D]),nt=l.useCallback(()=>{var i;const n=!((i=b.current)!=null&&i.pendingOutlineTaskId);P("remove_pdf_attachment",{has_pdf_attachment:!!x,pdf_size_bucket:re(x==null?void 0:x.size),should_delete_cache:n}),Ot(o=>(n&&(o!=null&&o.cacheUrl)&&ot.deleteCache(o.cacheUrl).catch(()=>{}),null)),ve.current&&(ve.current.value="")},[x]),Wn=l.useCallback(async n=>{var d;const i=(d=n.target.files)==null?void 0:d[0];if(n.target.value="",!i)return;if(!(i.type==="application/pdf"||i.name.toLowerCase().endsWith(".pdf"))){w("pdf_upload",{status:"failed",reason:"invalid_type",file_size_bucket:re(i.size)}),O.warning("请上传 PDF 文件");return}if(i.size>Yi){w("pdf_upload",{status:"failed",reason:"too_large",file_size_bucket:re(i.size)}),O.warning("PDF 不能超过 20MB");return}if(U.length===0){w("pdf_upload",{status:"failed",reason:"no_gemini_text_model",file_size_bucket:re(i.size)}),O.warning("PDF 入参需要 Gemini 文本模型,请先配置 Gemini 模型");return}try{const m=`comic-pdf-${mt()}.pdf`;if(await ot.cacheToCacheStorageOnly(m,i),Ot(h=>(h!=null&&h.cacheUrl&&ot.deleteCache(h.cacheUrl).catch(()=>{}),{cacheUrl:m,name:i.name,size:i.size,mimeType:i.type||"application/pdf"})),w("pdf_upload",{status:"success",file_size_bucket:re(i.size),switched_text_model:!Oe(U,A,R)}),!Oe(U,A,R)){const h=U[0];ye(h.id,_n(h))}O.success("PDF 已添加,将随提示词一起提交给 Gemini")}catch(m){w("pdf_upload",{status:"failed",reason:"cache_failed",file_size_bucket:re(i.size)}),O.error(m instanceof Error?m.message:"PDF 上传失败")}},[U,ye,A,R]),S=l.useCallback(async(n,i=b.current)=>{if(!i)return null;const o={...n,updatedAt:Date.now()},d={...i,...o};b.current=d,f(d),a(h=>h.map(_=>_.id===d.id?d:_));const m=vt.current.then(async()=>{const h=await fe(i.id,o),_=h.find(C=>C.id===i.id)||d;return b.current=_,a(h),f(_),_});return vt.current=m.then(()=>{},()=>{}),m},[a,f]),Gt=l.useCallback(async n=>{const i=n.sourcePrompt.trim(),o=n.pageCount,d=Date.now();if(b.current)return await S({sourcePrompt:i,sourcePromptMode:n.sourcePromptMode,scenarioId:n.scenarioId,pageCount:o,textModel:A,textModelRef:R})||b.current;const m={id:mt(),starred:!1,title:i.slice(0,28)||"未命名连环画",sourcePrompt:i,commonPrompt:"",pageCount:o,pages:[],textModel:A,textModelRef:R,imageModel:j,imageModelRef:se,imageParams:Y,generationMode:I,sourcePromptMode:n.sourcePromptMode,scenarioId:n.scenarioId,pendingOutlineTaskId:null,createdAt:d,updatedAt:d},h=await Pi(m),_=h.find(C=>C.id===m.id)||m;return a(h),f(_),b.current=_,_},[I,j,se,Y,S,a,A,R,f]),Xn=l.useCallback(async()=>{if(!ae){if(!ne.trim()){O.warning("请输入创作需求");return}if(x&&!Oe(U,A,R)){O.warning("PDF 入参仅支持 Gemini 文本模型");return}Lt(!0);try{const n=ne.trim(),i=Se(Me);if(await $a.waitForInitialization(),!za("text",R||A)&&!await Da()){w("generate_outline",{status:"cancelled",reason:"missing_api_key",scenario_id:M,prompt_input_mode:D,text_model:A,has_pdf_attachment:!!x}),O.warning("需要 API Key 才能生成提示词");return}P("generate_outline",{status:"start",scenario_id:M,prompt_input_mode:D,page_count:i,text_model:A,has_pdf_attachment:!!x,pdf_size_bucket:re(x==null?void 0:x.size),...Ra(n)});const o=await Gt({sourcePrompt:n,pageCount:i,sourcePromptMode:D,scenarioId:M}),d=di({userPrompt:n,pageCount:i,inputMode:D,scenarioContext:Ii(M),pdfAttachmentName:x==null?void 0:x.name});Je.current=o.id;const m=ct.createTask({prompt:d,model:A,modelRef:R,comicCreatorAction:"outline",comicCreatorRecordId:o.id,comicCreatorScenarioId:M,comicCreatorPageCount:i,...x?{pdfCacheUrl:x.cacheUrl,pdfMimeType:x.mimeType,pdfName:x.name}:{}},_t.CHAT);await S({sourcePrompt:n,sourcePromptMode:D,scenarioId:M,pageCount:i,textModel:A,textModelRef:R,pendingOutlineTaskId:m.id,outlineError:void 0},o),w("generate_outline",{status:"success",scenario_id:M,prompt_input_mode:D,page_count:i,text_model:A,has_pdf_attachment:!!x}),O.success("提示词规划任务已提交")}catch(n){w("generate_outline",{status:"failed",scenario_id:M,prompt_input_mode:D,text_model:A,has_pdf_attachment:!!x,error_type:n instanceof Error?n.name:"unknown"}),O.error(n instanceof Error?n.message:"提交失败")}finally{Lt(!1)}}},[Gt,Me,S,D,x,M,ne,ae,A,U,R]),Vt=l.useCallback((n,i)=>{const o=b.current;if(!o)return;const d=o.pages.map(m=>m.id===n?{...m,...i}:m);S({pages:d})},[S]),Jt=l.useCallback(n=>{S({commonPrompt:n})},[S]),Zn=l.useCallback(n=>{const i=b.current;if(!i)return;const o=i.pages.findIndex(h=>h.id===n),d=o>=0?o+1:i.pages.length,m=[...i.pages];m.splice(d,0,us(d+1)),P("add_page",{insert_index:d,page_count_before:i.pages.length,page_count_after:m.length,...N(i)}),S({pages:ut(m),pageCount:m.length})},[S]),Qn=l.useCallback(n=>{const i=b.current;if(!i||i.pages.length<=1)return;const o=ut(i.pages.filter(d=>d.id!==n));P("delete_page",{page_count_before:i.pages.length,page_count_after:o.length,...N(i)}),ue(d=>{const m=new Set(d);return m.delete(n),m}),S({pages:o,pageCount:o.length})},[S]),Ht=l.useCallback((n,i)=>{const o=b.current;if(!o)return;const d=o.pages.findIndex(C=>C.id===n),m=d+i;if(d<0||m<0||m>=o.pages.length)return;const h=[...o.pages],[_]=h.splice(d,1);h.splice(m,0,_),P("move_page",{direction:i<0?"up":"down",from_index:d,to_index:m,page_count:o.pages.length}),S({pages:ut(h)})},[S]),ea=l.useCallback(n=>{var o;const i=!G.has(n);P("toggle_page_selection",{selected:i,selected_page_count:i?G.size+1:Math.max(0,G.size-1),page_count:((o=b.current)==null?void 0:o.pages.length)||0}),ue(d=>{const m=new Set(d);return m.has(n)?m.delete(n):m.add(n),m})},[G]),ta=l.useCallback(()=>{var i;const n=((i=b.current)==null?void 0:i.pages.map(o=>o.id))||[];P("select_all_pages",{selected_page_count:n.length,page_count:n.length}),ue(new Set(n))},[]),na=l.useCallback(()=>{var n;P("clear_page_selection",{selected_page_count:G.size,page_count:((n=b.current)==null?void 0:n.pages.length)||0}),ue(new Set)},[G.size]),aa=l.useCallback(n=>{n!==I&&(w("generation_mode_changed",{event_type:"click",generation_mode:n,previous_generation_mode:I,...N(b.current)}),Rt(n))},[I]),ia=l.useCallback(n=>{const i=fs(Number(n));w("image_count_per_page_changed",{event_type:"change",image_count_per_page:i,...N(b.current)}),Un(i)},[]),sa=l.useCallback(n=>{const i=b.current;if(!i)return;const o=i.pages.slice().sort((h,_)=>h.pageNumber-_.pageNumber).flatMap(h=>{const _=K(h);return _.map((C,F)=>({pageItem:h,variant:C,variantIndex:F,variantCount:_.length}))}),d=i.pages.find(h=>h.id===n),m=o.findIndex(h=>h.pageItem.id===n&&(!(d!=null&&d.imageUrl)||h.variant.url===d.imageUrl));o.length===0||m<0||(P("preview_page_image",{image_count:o.length,initial_index:m,...N(i)}),jt(o.map(({pageItem:h,variantIndex:_,variantCount:C,variant:F})=>({url:F.url,type:"image",title:`第 ${h.pageNumber} 页:${Ne(h.title,h.pageNumber)}${C>1?`(图 ${_+1})`:""}`,alt:h.title||`第 ${h.pageNumber} 页`,prompt:h.prompt})),m))},[jt]),ra=l.useCallback((n,i)=>{const o=b.current;if(!o)return;const d=o.pages.map(m=>m.id===n?xi(m,i):m);P("select_page_image_variant",{page_id:n,...N(o)}),S({pages:d})},[S]),oa=l.useCallback(n=>{const i=b.current,o=i==null?void 0:i.pages.find(d=>d.id===n);P("open_page_media_library",{page_id:n,page_number:o==null?void 0:o.pageNumber,...N(i)}),Ze(n)},[]),ca=l.useCallback(async n=>{const i=b.current;if(!i||!ge)return;if(n.type!==an.IMAGE||!n.url){O.warning("请选择图片素材");return}const o=i.pages.find(m=>m.id===ge);if(!o)return;const d=i.pages.map(m=>m.id===ge?{...ft(m,[{url:n.url,mimeType:n.mimeType,generatedAt:n.createdAt||Date.now(),taskId:n.taskId}]),status:"succeeded",error:void 0}:m);await S({pages:d}),P("select_page_media_library_asset",{page_id:ge,page_number:o.pageNumber,asset_id:n.id,asset_source:n.source,...N({...i,pages:d})}),O.success("已从素材库补回当前页图片"),Ze(null)},[ge,S]),be=l.useCallback(async(n,i)=>{const o=b.current;if(!o)return null;const d=o.pages.map(m=>m.id===n?{...m,...i}:m);return S({pages:d})},[S]),Kt=l.useCallback(async(n,i,o)=>{const d=b.current;if(!d)return null;const m=d.pages.map(h=>h.id===n?{...ft(h,i),...o}:h);return S({pages:m})},[S]),at=l.useCallback(async(n,i)=>{var Wt,Xt,Zt,Qt;const o=b.current;if(!o||(Wt=te.current)!=null&&Wt.signal.aborted)return null;await be(n.id,{status:"running",error:void 0});const d=Y.size||oe,m=hi({commonPrompt:o.commonPrompt,pagePrompt:n.prompt,script:n.script,title:n.title,pageNumber:n.pageNumber,pageCount:o.pages.length,size:d}),h=i?Array.from(new Set([..._e,i])):_e;w("page_image_generation",{status:"start",page_number:n.pageNumber,page_count:o.pages.length,image_count_per_page:E,image_model:j,image_size:d,reference_image_count:h.length,has_previous_page_reference:!!i});const _=await La({prompt:m,size:d,count:E,model:j,modelRef:se,params:Y,referenceImages:h.length>0?h:void 0,autoInsertToCanvas:!1,comicCreatorAction:"page-image",comicCreatorRecordId:o.id,comicCreatorPageId:n.id}),C=ps(_),F=C[0];if(!_.success||!F)return await be(n.id,{status:"failed",error:_.error||"图片任务创建失败"}),w("page_image_generation",{status:"failed",reason:"task_create_failed",page_number:n.pageNumber,image_count_per_page:E,image_model:j,image_size:d}),null;C.forEach(Z=>le.current.add(Z)),await be(n.id,{taskId:F,taskIds:C,status:"running"});const $=await Promise.all(C.map(async Z=>{var Q;const Ee=await Ua(Z,{signal:(Q=te.current)==null?void 0:Q.signal,interval:1200});return le.current.delete(Z),{taskId:Z,waitResult:Ee}})),J=(Xt=te.current)==null?void 0:Xt.signal.aborted,W=$.flatMap(({taskId:Z,waitResult:Ee})=>{var en;if(!Ee.success)return[];const Q=Ee.task||ct.getTask(Z);return(en=Q==null?void 0:Q.result)!=null&&en.url?xn({taskId:Z,url:Q.result.url,urls:Q.result.urls,format:Q.result.format,generatedAt:Q.completedAt||Date.now()}):[]}),X=(Zt=$.find(({waitResult:Z})=>!Z.success))==null?void 0:Zt.waitResult.error;return W.length===0?(await be(n.id,{status:J?"cancelled":"failed",error:X||(J?"图片生成已取消":"图片任务完成但缺少图片 URL")}),w("page_image_generation",{status:J?"cancelled":"failed",reason:J?"user_cancelled":"task_failed",page_number:n.pageNumber,image_count_per_page:E,image_model:j,image_size:d}),null):(await Kt(n.id,W,{status:"succeeded",error:X?"部分图片生成失败":void 0}),w("page_image_generation",{status:"success",page_number:n.pageNumber,image_count_per_page:E,generated_image_count:W.length,image_model:j,image_size:d}),((Qt=W[W.length-1])==null?void 0:Qt.url)||null)},[Kt,E,j,se,Y,_e,be]),Yt=l.useCallback(async n=>{const i=b.current;if(!i)return null;const o=new Set(n.map(m=>m.id)),d=i.pages.map(m=>o.has(m.id)?{...m,status:"queued",error:void 0,taskId:null,taskIds:null}:m);return S({pages:d,imageModel:j,imageModelRef:se,imageParams:Y,generationMode:I})},[I,j,se,Y,S]),qt=l.useCallback(async n=>{var h;const i=b.current;if(!i||T.running)return;const o=yi({pages:i.pages,selectedPageIds:G,singlePageId:n}),d=o;if(o.length===0){w("generate_images",{status:"failed",reason:"no_selection",generation_mode:I,single_page:!!n,selected_page_count:G.size,...N(i)}),O.warning("请选择要生成的页面");return}const m=Date.now();P(n?"regenerate_page_image":"generate_selected_pages",{status:"start",generation_mode:I,single_page:!!n,selected_page_count:o.length,task_page_count:d.length,image_count_per_page:E,total_image_task_count:d.length*E,image_model:j,image_size:Y.size||oe,reference_image_count:_e.length,...N(i)}),te.current=new AbortController,le.current=new Set,de({running:!0,stopping:!1,current:0,total:d.length,message:`准备生成(每页 ${E} 张)`});try{if(!await Yt(d))return;if(I==="serial"){const C=d;for(let F=0;F<C.length&&!te.current.signal.aborted;F+=1){const $=C[F],J=(h=b.current)==null?void 0:h.pages.find(X=>X.pageNumber===$.pageNumber-1),W=J==null?void 0:J.imageUrl;de(X=>({...X,current:F+1,message:`生成第 ${$.pageNumber} 页(${E} 张)`})),await at($,W)}}else{let C=0,F=0;const $=Array.from({length:_i(I,d.length)}).map(async()=>{var J;for(;C<d.length;){if((J=te.current)!=null&&J.signal.aborted)return;const W=d[C];C+=1,de(X=>({...X,message:`生成第 ${W.pageNumber} 页(${E} 张)`})),await at(W),F+=1,de(X=>({...X,current:F}))}});await Promise.all($)}if(te.current.signal.aborted){const C=b.current;if(C){const F=new Set(d.map($=>$.id));await S({pages:C.pages.map($=>F.has($.id)&&($.status==="queued"||$.status==="running")?{...$,status:"cancelled",error:"图片生成已取消"}:$)})}w("generate_images",{status:"cancelled",duration_ms:Date.now()-m,generation_mode:I,single_page:!!n,task_page_count:d.length,image_count_per_page:E,total_image_task_count:d.length*E,...N(b.current)}),O.info("已停止生成")}else w("generate_images",{status:"success",duration_ms:Date.now()-m,generation_mode:I,single_page:!!n,task_page_count:d.length,image_count_per_page:E,total_image_task_count:d.length*E,...N(b.current)}),O.success("图片生成完成")}catch(_){w("generate_images",{status:"failed",duration_ms:Date.now()-m,generation_mode:I,single_page:!!n,task_page_count:d.length,image_count_per_page:E,total_image_task_count:d.length*E,error_type:_ instanceof Error?_.name:"unknown",...N(b.current)}),O.error(_ instanceof Error?_.message:"生成失败")}finally{le.current.clear(),te.current=null,de({running:!1,stopping:!1,current:0,total:0,message:""})}},[at,I,T.running,E,j,Y.size,Yt,S,_e.length,G]),la=l.useCallback(()=>{var n;P("stop_generation",{active_task_count:le.current.size,generation_mode:I,...N(b.current)}),(n=te.current)==null||n.abort(),le.current.forEach(i=>{ct.cancelTask(i)}),de(i=>({...i,stopping:!0,message:"正在停止"}))},[I]),it=l.useCallback(async n=>{const i=b.current;if(!i)return;const o=n==="zip"?gs(i):ms(i);if(o.length===0){w("export",{status:"failed",reason:"no_generated_images",export_kind:n,...N(i)}),O.warning("请先生成至少一页图片");return}const d=Date.now();P("export",{status:"start",export_kind:n,export_image_count:o.length,...N(i)}),Ut(n);try{const m={imageSources:o};n==="zip"&&await Bi(i,m),n==="pptx"&&await Hi(i,m),n==="pdf"&&await Ki(i,m),w("export",{status:"success",export_kind:n,export_image_count:o.length,duration_ms:Date.now()-d,...N(i)}),O.success("导出完成")}catch(m){w("export",{status:"failed",export_kind:n,export_image_count:o.length,duration_ms:Date.now()-d,error_type:m instanceof Error?m.name:"unknown",...N(i)}),O.error(m instanceof Error?m.message:"导出失败")}finally{Ut(null)}},[]),ua=l.useCallback(()=>{P("restart_project",{...N(b.current)}),p(),nt(),qe(je),Ye("text"),ke(Fe(je,"text")),Te(String(ze)),ue(new Set),L()},[nt,L,p]),da=l.useCallback(n=>{P("select_history_record",{...N(n)}),g(n),k(n.pages.length>0?"generate":"plan")},[g,k]),ma=l.useCallback(async n=>{P("toggle_star_record",{starred:!n.starred,...N(n)});const i=await fe(n.id,{starred:!n.starred,updatedAt:Date.now()});a(i);const o=i.find(d=>d.id===n.id);o&&(t==null?void 0:t.id)===n.id&&f(o)},[t==null?void 0:t.id,a,f]),ga=l.useCallback(async n=>{const i=e.find(d=>d.id===n);P("delete_history_record",{...N(i)});const o=await Si(n);a(o),(t==null?void 0:t.id)===n&&(p(),L())},[t==null?void 0:t.id,L,e,p,a]),st=!!(t!=null&&t.pages&&t.pages.length>0),pa=Cn(t),xe=pt(t),fa=l.useMemo(()=>es.map(n=>({...n,disabled:n.id==="generate"&&!st})),[st]),ha=l.useCallback(n=>{P("navigate_step",{from_page:y,to_page:n,...N(t)}),B(n)},[t,B,y]),_a=l.useCallback(()=>{P("back_from_history",{show_starred:r,records_count:e.length}),L()},[L,e.length,r]),ya=l.useCallback(()=>{P("open_history",{records_count:e.length,starred_count:u}),ce()},[ce,e.length,u]),ba=l.useCallback(()=>{P("open_starred_history",{records_count:e.length,starred_count:u}),V()},[V,e.length,u]),xa=l.useCallback(()=>{P("toggle_starred_filter",{show_starred:!r,records_count:e.length,starred_count:u}),ie()},[e.length,r,u,ie]),Ie=l.useMemo(()=>{const n=he.trim().toLowerCase();return e.filter(i=>r?i.starred:!0).filter(i=>n?i.title.toLowerCase().includes(n)||i.sourcePrompt.toLowerCase().includes(n):!0).filter(i=>q==="all"?!0:q==="done"?i.pages.length>0&&i.pages.every(o=>K(o).length>0):q==="failed"?i.pages.some(o=>o.status==="failed")||!!i.outlineError:q==="planned"?i.pages.length>0&&!i.pages.every(o=>K(o).length>0):!0).sort((i,o)=>o.createdAt-i.createdAt)},[he,q,e,r]),Ca=l.useCallback(()=>{const n=he.trim();n&&w("history_search",{event_type:"input",query_length:n.length,result_count:Ie.length,history_status:q,show_starred:r})},[Ie.length,he,q,r]),wa=l.useCallback(n=>{w("history_status_filter_changed",{event_type:"change",history_status:n,previous_history_status:q,show_starred:r}),Gn(n)},[q,r]),Pa=()=>s.jsxs("div",{className:"va-page comic-page",children:[s.jsxs("div",{className:"ma-card comic-plan-card",children:[s.jsxs("div",{className:"ma-card-header",children:[s.jsx("span",{children:"创作需求"}),s.jsxs("div",{className:"comic-header-actions",children:[Jn&&s.jsx("button",{className:"comic-link-btn",onClick:()=>{P("apply_scenario_template",{scenario_id:M,prompt_input_mode:D,has_record:!!t}),tt()},children:"套用模板"}),t&&s.jsx("button",{className:"comic-link-btn",onClick:ua,children:"新建"})]})]}),s.jsxs("div",{className:"comic-config-grid",children:[s.jsxs("label",{className:"comic-field comic-field--scenario",children:[s.jsx("span",{children:"创作场景"}),s.jsx("select",{className:"ma-select",value:M,onChange:n=>qn(n.target.value),disabled:ae||!!(t!=null&&t.pendingOutlineTaskId),children:Vn.map(([n,i])=>s.jsx("optgroup",{label:n,children:i.map(o=>s.jsx("option",{value:o.id,children:o.label},o.id))},n))})]}),s.jsxs("label",{className:"comic-field",children:[s.jsx("span",{children:"页数"}),s.jsx("input",{className:"ma-input",type:"number",min:1,max:60,value:Me,onChange:n=>Te(n.target.value),onBlur:()=>Te(String(Se(Me)))})]})]}),s.jsxs("div",{className:"comic-scenario-note",children:[s.jsxs("strong",{children:[Qe.category," / ",Qe.label]}),s.jsx("span",{children:Qe.description})]}),s.jsxs("div",{className:"comic-pdf-row",children:[s.jsx("input",{ref:ve,type:"file",accept:"application/pdf,.pdf",hidden:!0,onChange:Wn}),s.jsxs("button",{type:"button",className:"comic-pdf-upload-btn",onClick:()=>{var n;P("upload_pdf",{has_pdf_attachment:!!x,gemini_text_model_count:U.length}),(n=ve.current)==null||n.click()},disabled:ae||!!(t!=null&&t.pendingOutlineTaskId),children:[s.jsx(Va,{size:14}),x?"更换 PDF":"上传 PDF"]}),x?s.jsxs("div",{className:"comic-pdf-file",children:[s.jsx(rn,{size:14}),s.jsx(z,{content:x.name,showArrow:!1,children:s.jsxs("span",{children:[x.name," · ",cs(x.size)]})}),s.jsx("button",{type:"button",className:"comic-icon-btn",onClick:nt,"aria-label":"移除 PDF",disabled:ae||!!(t!=null&&t.pendingOutlineTaskId),children:s.jsx(Ja,{size:14})})]}):s.jsx("span",{className:"comic-pdf-hint",children:"可选,上传后文本模型仅可选择 Gemini"})]}),s.jsx("textarea",{className:"ma-textarea comic-story-input",value:ne,onChange:n=>ke(n.target.value),placeholder:Fe(M,"text"),spellCheck:!0}),(t==null?void 0:t.outlineError)&&s.jsx("div",{className:"ma-error",children:t.outlineError}),(t==null?void 0:t.pendingOutlineTaskId)&&s.jsx("div",{className:"ma-progress comic-plan-progress",children:"提示词规划中..."}),s.jsxs("div",{className:"comic-plan-control-row",children:[s.jsxs("div",{className:"comic-mode-control",children:[s.jsx("span",{children:"生成的提示词类型"}),s.jsxs("div",{className:"comic-segmented comic-segmented--mode",children:[s.jsx("button",{className:D==="text"?"active":"",type:"button",onClick:()=>Bt("text"),disabled:ae||!!(t!=null&&t.pendingOutlineTaskId),children:"文本提示词"}),s.jsx("button",{className:D==="json"?"active":"",type:"button",onClick:()=>Bt("json"),disabled:ae||!!(t!=null&&t.pendingOutlineTaskId),children:"结构化 JSON"})]})]}),s.jsx("label",{className:"comic-field comic-field--model comic-field--inline-model",children:s.jsx(dn,{variant:"form",selectedModel:A,selectedSelectionKey:gt(A,R),onSelect:ye,models:et,placement:"down",placeholder:x?"选择 Gemini 模型":"选择文本模型",disabled:ae||!!(t!=null&&t.pendingOutlineTaskId)||et.length===0})})]}),s.jsx("div",{className:"va-page-actions comic-plan-actions",children:s.jsxs("button",{className:"va-btn-primary",disabled:ae||!!(t!=null&&t.pendingOutlineTaskId)||!!x&&et.length===0,onClick:Xn,children:[s.jsx(on,{size:14}),"生成提示词"]})})]}),st&&t&&s.jsxs("div",{className:"ma-card",ref:kt,children:[s.jsxs("div",{className:"ma-card-header",children:[s.jsx("span",{children:t.title}),s.jsxs("span",{className:"ma-muted",children:["已规划 ",t.pages.length,"/",t.pageCount||t.pages.length," 页"]})]}),s.jsxs("div",{className:"comic-outline-preview",children:[s.jsxs("div",{className:"comic-outline-preview__item comic-outline-preview__item--common",children:[s.jsx("strong",{children:"公共提示词"}),yn(t.commonPrompt)]}),t.pages.map(n=>s.jsxs("div",{className:"comic-outline-preview__item",children:[s.jsxs("strong",{children:["第 ",n.pageNumber," 页:",Ne(n.title,n.pageNumber)]}),yn(n.prompt||n.script,"待补全")]},n.id))]}),s.jsx("div",{className:"va-page-actions comic-plan-actions comic-outline-actions",children:s.jsxs("button",{className:"va-btn-primary",onClick:()=>{P("go_to_generate_step",{...N(t)}),k("generate")},children:[s.jsx(cn,{size:14}),"去生成"]})})]})]}),Sa=()=>{if(!t)return s.jsx("div",{className:"va-page va-empty",children:"暂无连环画记录"});const n=t.pages.length>0&&t.pages.every(i=>G.has(i.id));return s.jsxs("div",{className:"va-page comic-page",children:[s.jsx("div",{className:"ma-card comic-reference-card",children:s.jsx(oi,{images:Xe,onImagesChange:Dt,multiple:!0,label:"参考图片(可选)",disabled:T.running})}),s.jsxs("div",{className:"ma-card",children:[s.jsxs("div",{className:"ma-card-header",children:[s.jsx("span",{children:"公共提示词"}),s.jsxs("div",{className:"comic-header-actions",children:[s.jsx(mn,{className:"ma-icon-btn comic-prompt-optimize-btn",originalPrompt:t.commonPrompt,language:"zh",scenarioId:"tool.image",historyType:"image",defaultMode:"polish",disabled:T.running,tooltipPlacement:"top",onApply:Jt}),s.jsxs("span",{className:"ma-muted",children:[pa,"/",t.pages.length," 页已生成 ·"," ",xe," 张图"]})]})]}),s.jsx("textarea",{className:"ma-textarea comic-common-prompt",value:t.commonPrompt,onChange:i=>Jt(i.target.value)})]}),T.running&&s.jsxs("div",{className:"ma-progress",children:[T.message," ",T.current,"/",T.total]}),s.jsxs("div",{className:"comic-batch-bar comic-batch-bar--generation",children:[s.jsx(z,{content:"选择或取消选择全部页面",showArrow:!1,children:s.jsxs("label",{className:"comic-check comic-selection-check",children:[s.jsx("input",{type:"checkbox",checked:n,onChange:()=>n?na():ta()}),s.jsxs("span",{children:["已选 ",G.size," 页"]})]})}),s.jsx(z,{content:"选择图片模型",showArrow:!1,children:s.jsx("div",{className:"comic-generation-model",children:s.jsx(dn,{selectedModel:j,selectedSelectionKey:gt(j,se),onSelect:Kn,models:Rn,placement:"down",header:"选择图片模型 (↑↓ Tab)"})})}),Ae.length>0&&s.jsx(z,{content:"图片生成参数",showArrow:!1,children:s.jsx("div",{className:"comic-generation-params",children:s.jsx(ai,{selectedParams:Y,onParamChange:Yn,compatibleParams:Ae,modelId:j,placement:"down"})})}),s.jsx(z,{content:I==="parallel"?"已启用并行:同时生成多页,速度更快":"当前串行:逐页生成,更稳更省并发",showArrow:!1,children:s.jsxs("label",{className:`comic-generation-mode-check${T.running?" is-disabled":""}`,children:[s.jsx("input",{type:"checkbox",checked:I==="parallel",onChange:i=>aa(i.target.checked?"parallel":"serial"),disabled:T.running,"aria-label":"并行生成"}),s.jsx("span",{children:"并行"})]})}),s.jsx(z,{content:"每页并发生成图片数量",showArrow:!1,children:s.jsxs("label",{className:"comic-generation-count",children:[s.jsx("span",{children:"每页"}),s.jsx("select",{className:"comic-generation-count-select",value:E,onChange:i=>ia(i.target.value),disabled:T.running,"aria-label":"每页生成图片数量",children:$n.map(i=>s.jsxs("option",{value:i,children:[i," 张"]},i))})]})}),T.running?s.jsx(z,{content:"停止生成",showArrow:!1,children:s.jsxs("button",{onClick:la,disabled:T.stopping,"aria-label":"停止生成",children:[s.jsx(Ha,{size:14}),"停止"]})}):s.jsx(z,{content:"生成已选页面",showArrow:!1,children:s.jsxs("button",{className:"comic-primary-btn",onClick:()=>void qt(),"aria-label":"生成",children:[s.jsx(cn,{size:14}),"生成"]})})]}),s.jsx("div",{className:"comic-page-list",children:t.pages.map((i,o)=>{const d=ds(i),m=K(i),h=m.find(_=>_.url===i.imageUrl)||m[m.length-1];return s.jsxs("div",{className:"comic-page-card",children:[s.jsxs("div",{className:"comic-page-card__head",children:[s.jsxs("div",{className:"comic-page-title-row",children:[s.jsxs("label",{className:"comic-check",children:[s.jsx("input",{type:"checkbox",checked:G.has(i.id),onChange:()=>ea(i.id)}),s.jsxs("span",{children:["第 ",i.pageNumber," 页"]})]}),d&&s.jsx(z,{content:d,showArrow:!1,children:s.jsx("span",{className:"comic-page-title-label",children:d})}),s.jsx(mn,{className:"comic-icon-btn comic-prompt-optimize-btn",iconSize:14,originalPrompt:i.prompt,language:"zh",scenarioId:"tool.image",historyType:"image",allowStructuredMode:!0,defaultMode:"structured",disabled:T.running,tooltipPlacement:"top",onApply:_=>Vt(i.id,{prompt:_})}),s.jsx(z,{content:`在第 ${i.pageNumber} 页后新增页`,showArrow:!1,children:s.jsx("button",{className:"comic-icon-btn comic-page-add-btn",onClick:()=>Zn(i.id),disabled:T.running,"aria-label":`在第 ${i.pageNumber} 页后新增页`,children:s.jsx(Ka,{size:14})})})]}),s.jsx("span",{className:`comic-status comic-status--${i.status||"draft"}`,children:i.status||"draft"}),o>0&&s.jsx(z,{content:"上移",showArrow:!1,children:s.jsx("button",{className:"ma-icon-btn",onClick:()=>Ht(i.id,-1),disabled:T.running,"aria-label":"上移页面",children:s.jsx(Ya,{size:14})})}),o<t.pages.length-1&&s.jsx(z,{content:"下移",showArrow:!1,children:s.jsx("button",{className:"ma-icon-btn",onClick:()=>Ht(i.id,1),disabled:T.running,"aria-label":"下移页面",children:s.jsx(qa,{size:14})})}),s.jsx(z,{content:"删除",showArrow:!1,children:s.jsx("button",{className:"ma-icon-btn",onClick:()=>Qn(i.id),disabled:t.pages.length<=1||T.running,"aria-label":"删除页面",children:s.jsx(ln,{size:14})})})]}),s.jsxs("div",{className:"comic-page-card__body",children:[s.jsxs("div",{className:"comic-page-preview-pane",children:[s.jsxs("div",{className:"comic-page-preview",children:[h?s.jsx("button",{type:"button",className:"comic-page-preview-image-btn",onClick:()=>sa(i.id),"aria-label":`预览第 ${i.pageNumber} 页`,children:s.jsx("img",{src:h.url,alt:i.title,referrerPolicy:"no-referrer"})}):s.jsx("div",{className:"comic-page-placeholder",children:s.jsx(Wa,{size:22})}),s.jsx(z,{content:"重新生成当前页",showArrow:!1,children:s.jsxs("button",{className:"comic-page-preview-action",onClick:()=>void qt(i.id),disabled:T.running,"aria-label":"重新生成当前页",children:[s.jsx(on,{size:14}),s.jsx("span",{children:"重生"})]})})]}),m.length>0&&s.jsx("div",{className:"comic-page-variant-strip","aria-label":`第 ${i.pageNumber} 页历史图片`,children:m.map((_,C)=>{const F=_.url===i.imageUrl;return s.jsx(z,{content:F?`当前图片 ${C+1}`:`设为第 ${C+1} 张图片`,showArrow:!1,children:s.jsxs("button",{type:"button",className:`comic-page-variant-thumb${F?" comic-page-variant-thumb--active":""}`,onClick:()=>ra(i.id,_.id),disabled:T.running,"aria-label":`选择第 ${i.pageNumber} 页第 ${C+1} 张图片`,children:[s.jsx("img",{src:_.url,alt:`${i.title} ${C+1}`,referrerPolicy:"no-referrer"}),s.jsx("span",{children:C+1})]})},_.id)})}),s.jsx("div",{className:"comic-page-library-fallback",children:s.jsx(z,{content:"从素材库补回图片",showArrow:!1,children:s.jsx("button",{type:"button",className:"comic-page-library-btn",onClick:()=>oa(i.id),"aria-label":`从素材库补回第 ${i.pageNumber} 页图片`,children:s.jsx(Xa,{size:18})})})})]}),s.jsxs("div",{className:"comic-page-editor",children:[s.jsx("textarea",{className:"ma-textarea comic-page-unified-prompt",value:i.prompt,onChange:_=>Vt(i.id,{prompt:_.target.value}),placeholder:"本页完整图片提示词:写清主题、画面主体、构图、必要文案、风格和色彩"}),i.error&&s.jsx("div",{className:"ma-error",children:i.error})]})]})]},i.id)})}),s.jsxs("div",{className:"ma-card comic-export-inline",children:[s.jsxs("div",{className:"ma-card-header",children:[s.jsx("span",{children:"导出"}),s.jsxs("span",{className:"ma-muted",children:["已生成 ",xe," 张,至少 1 张即可导出"]})]}),s.jsxs("div",{className:"comic-export-grid",children:[s.jsxs("button",{className:"comic-export-card",disabled:!!me||xe===0,onClick:()=>void it("zip"),children:[s.jsx(Za,{size:24}),s.jsx("span",{children:me==="zip"?"导出中...":"ZIP"})]}),s.jsxs("button",{className:"comic-export-card",disabled:!!me||xe===0,onClick:()=>void it("pptx"),children:[s.jsx(Qa,{size:24}),s.jsx("span",{children:me==="pptx"?"导出中...":"PPTX"})]}),s.jsxs("button",{className:"comic-export-card",disabled:!!me||xe===0,onClick:()=>void it("pdf"),children:[s.jsx(rn,{size:24}),s.jsx("span",{children:me==="pdf"?"导出中...":"PDF"})]})]})]}),s.jsx(ri,{isOpen:!!ge,onClose:()=>Ze(null),mode:ei.SELECT,filterType:an.IMAGE,onSelect:ca,selectButtonText:"补回此页"})]})},Na=()=>s.jsxs("div",{className:"va-page comic-page",children:[s.jsxs("div",{className:"comic-history-filters",children:[s.jsx("input",{className:"ma-input",value:he,onChange:n=>Bn(n.target.value),onBlur:Ca,placeholder:"搜索标题或提示词"}),s.jsxs("select",{className:"ma-select",value:q,onChange:n=>wa(n.target.value),children:[s.jsx("option",{value:"all",children:"全部"}),s.jsx("option",{value:"planned",children:"已规划"}),s.jsx("option",{value:"done",children:"已完成"}),s.jsx("option",{value:"failed",children:"有失败"})]})]}),Ie.length===0?s.jsx("div",{className:"va-empty comic-history-empty",children:"暂无记录"}):s.jsx("div",{className:"comic-history-list",children:Ie.map(n=>s.jsxs("div",{className:"comic-history-item",children:[s.jsxs("button",{className:"comic-history-main",onClick:()=>da(n),children:[s.jsx("strong",{children:n.title||"未命名连环画"}),s.jsxs("span",{children:["创建时间 ",_s(n.createdAt)]}),s.jsxs("span",{children:[hs(n)," · ",n.pageCount," 页 ·"," ",pt(n)," 张图"]}),s.jsx("p",{children:n.sourcePrompt})]}),s.jsxs("div",{className:"comic-history-actions",children:[s.jsx("button",{onClick:()=>void ma(n),children:n.starred?"★":"☆"}),s.jsx("button",{onClick:()=>void ga(n.id),children:s.jsx(ln,{size:14})})]})]},n.id))})]});return s.jsxs("div",{className:"video-analyzer music-analyzer comic-creator",children:[s.jsx(Ba,{isHistoryPage:y==="history",showStarred:r,recordsCount:e.length,starredCount:u,currentStep:y,steps:fa,onStepNavigate:ha,onBackFromHistory:_a,onOpenHistory:ya,onOpenStarred:ba,onToggleStarred:xa}),y==="plan"&&Pa(),y==="generate"&&Sa(),y==="history"&&Na(),s.jsx(ni,{...Dn})]})};export{Ms as default};
|