ima2-gen 3.12.2 → 3.12.3

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.
Files changed (45) hide show
  1. package/bin/commands/vectorize.js +108 -0
  2. package/bin/ima2.js +5 -1
  3. package/docs/API.md +1 -1
  4. package/docs/API.zh-CN.md +1 -1
  5. package/docs/API.zh-TW.md +1 -1
  6. package/docs/CLI.md +1 -0
  7. package/docs/migration/runtime-test-inventory.md +6 -1
  8. package/lib/agentImageVideoGen.js +15 -1
  9. package/lib/agentQueueStore.js +11 -3
  10. package/lib/agentQueueWorker.js +6 -1
  11. package/lib/agentRuntime.js +4 -0
  12. package/lib/db.js +3 -0
  13. package/lib/imageThumb.js +9 -2
  14. package/lib/vectorizeImage.js +132 -0
  15. package/package.json +4 -3
  16. package/routes/assetDerived.js +79 -2
  17. package/server.js +8 -0
  18. package/skills/ima2/SKILL.md +37 -0
  19. package/ui/dist/.vite/manifest.json +33 -33
  20. package/ui/dist/assets/{AgentWorkspace-CW1x4uOl.js → AgentWorkspace-AJkVTaU5.js} +2 -2
  21. package/ui/dist/assets/AssetGenWorkspace-Cguej69V.js +2 -0
  22. package/ui/dist/assets/AssetsWorkspace-DIQ9wBuD.js +1 -0
  23. package/ui/dist/assets/{CardNewsWorkspace-nBKX5TXr.js → CardNewsWorkspace-C_Eb2g7d.js} +1 -1
  24. package/ui/dist/assets/{GenerationRequestLogPanel-CWqbfNis.js → GenerationRequestLogPanel-giH1e4hp.js} +1 -1
  25. package/ui/dist/assets/{HomeWorkspace-CxqIGhb9.js → HomeWorkspace-DHmXGtqC.js} +1 -1
  26. package/ui/dist/assets/{NodeCanvas-m41ECrFJ.js → NodeCanvas-CF_NHudI.js} +1 -1
  27. package/ui/dist/assets/{PromptBuilderPanel-ChOoMAVA.js → PromptBuilderPanel-D7NJto-1.js} +2 -2
  28. package/ui/dist/assets/{PromptImportDialog-8hDG8MeK.js → PromptImportDialog-B40X9UAa.js} +2 -2
  29. package/ui/dist/assets/{PromptImportDiscoverySection-D2_TAuLm.js → PromptImportDiscoverySection-BWoUDHj1.js} +1 -1
  30. package/ui/dist/assets/{PromptImportFolderSection-qv0qhTwq.js → PromptImportFolderSection-DBSEyJb-.js} +1 -1
  31. package/ui/dist/assets/{PromptLibraryPanel-BPOD61FZ.js → PromptLibraryPanel-DLywJBpt.js} +2 -2
  32. package/ui/dist/assets/{SettingsWorkspace-BKgXN2l9.js → SettingsWorkspace-BawWId1t.js} +1 -1
  33. package/ui/dist/assets/SpriteRecipeWorkspace-Biy2yRAk.js +1 -0
  34. package/ui/dist/assets/VectorizePanel-DdlVvwV1.js +1 -0
  35. package/ui/dist/assets/{index-Bzt4YWub.js → index-D05Ong5g.js} +3 -3
  36. package/ui/dist/assets/{index-DB9EfKr6.css → index-DGRIdnsL.css} +1 -1
  37. package/ui/dist/assets/{index-DTEhasVd.js → index-Sch70vBs.js} +17 -17
  38. package/ui/dist/assets/{pptxgen.es-BEVsR2-i.js → pptxgen.es-CSd_gCsx.js} +1 -1
  39. package/ui/dist/assets/useAgentDialogFocus-DcWwFfYd.js +1 -0
  40. package/ui/dist/index.html +2 -2
  41. package/ui/dist/assets/AssetGenWorkspace-BQkdilsH.js +0 -2
  42. package/ui/dist/assets/AssetsWorkspace-CYSkmYU-.js +0 -1
  43. package/ui/dist/assets/KeyingPanel-CtGvO6-u.js +0 -1
  44. package/ui/dist/assets/SpriteRecipeWorkspace-D8gHgnt8.js +0 -1
  45. package/ui/dist/assets/useAgentDialogFocus-Dyj_bA5Q.js +0 -1
@@ -1 +0,0 @@
1
- import{u as I,b as v,a as d,j as s,a1 as Q,a2 as q,m as de,a3 as ce,a4 as ue,a5 as me,a6 as he,o as pe,a7 as fe,a8 as ge,a9 as xe,aa as be,J as ve,t as je,q as ye,v as _e,ab as we,ac as ke,p as Ne}from"./index-DTEhasVd.js";import{K as Ae,A as Se}from"./KeyingPanel-CtGvO6-u.js";import"./useAgentDialogFocus-Dyj_bA5Q.js";function Ie({folder:e,depth:a}){const{t:r}=I(),l=v(t=>t.assetsFilters.folderId),p=v(t=>t.setAssetsFilters),f=v(t=>t.renameAssetFolder),j=v(t=>t.deleteAssetFolder),o=v(t=>t.showToast),[i,g]=d.useState(!1),[_,h]=d.useState(e.name),[x,b]=d.useState(!1),k=l===e.id;async function m(){const t=_.trim();if(!t||t===e.name){h(e.name),g(!1);return}await f(e.id,t)||o(r("assets.actionFailed"),!0),g(!1)}async function u(){if(!x){b(!0);return}await j(e.id)||o(r("assets.actionFailed"),!0),b(!1)}return s.jsxs("div",{className:"assets-folder-row",style:{"--folder-depth":a},children:[i?s.jsx("input",{className:"assets-folder-input",value:_,autoFocus:!0,"aria-label":r("assets.renameFolder"),onChange:t=>h(t.target.value),onBlur:()=>{m()},onKeyDown:t=>{t.key==="Enter"&&m(),t.key==="Escape"&&(h(e.name),g(!1))}}):s.jsx("button",{type:"button",className:`assets-folder-row__name${k?" is-active":""}`,"aria-current":k?"page":void 0,onClick:()=>p({folderId:e.id,kind:null}),children:e.name}),!i&&s.jsxs("span",{className:"assets-folder-row__actions",children:[s.jsx("button",{type:"button","aria-label":r("assets.renameFolder"),onClick:()=>g(!0),children:s.jsx(Q,{})}),s.jsx("button",{type:"button","aria-label":r(x?"assets.confirmDelete":"assets.deleteFolder"),className:x?"is-danger is-armed":"",onClick:()=>{u()},children:x?r("assets.confirmDelete"):"×"})]})]})}function Ce(){const{t:e}=I(),a=v(m=>m.assetsFolders),r=v(m=>m.assetsFilters.folderId),l=v(m=>m.assetsFilters.kind),p=v(m=>m.setAssetsFilters),f=v(m=>m.createAssetFolder),j=v(m=>m.showToast),[o,i]=d.useState(!1),[g,_]=d.useState(""),h=r===null&&l!=="element",x=r===null&&l==="element",b=d.useMemo(()=>{const m=[],u=(t,c)=>a.filter(y=>y.parentId===t).forEach(y=>{m.push({folder:y,depth:c}),u(y.id,c+1)});return u(null,0),m},[a]);async function k(){const m=g.trim();if(!m){i(!1);return}await f(m,r)||j(e("assets.actionFailed"),!0),_(""),i(!1)}return s.jsxs("aside",{className:"assets-folders","aria-label":e("assets.rootFolder"),children:[s.jsxs("div",{className:"assets-folders__heading",children:[s.jsx("span",{children:e("assets.rootFolder")}),s.jsx("button",{type:"button","aria-label":e("assets.newFolder"),onClick:()=>i(!0),children:"+"})]}),s.jsxs("div",{className:"assets-folders__rows",children:[s.jsx("button",{type:"button",className:`assets-folder-all${h?" is-active":""}`,"aria-current":h?"page":void 0,onClick:()=>p({folderId:null,kind:null}),children:e("assets.allAssets")}),s.jsxs("button",{type:"button",className:`assets-folder-all assets-folder-elements${x?" is-active":""}`,"aria-current":x?"page":void 0,onClick:()=>p({folderId:null,kind:"element"}),children:[s.jsx("span",{className:"assets-folder-elements__glyph","aria-hidden":"true",children:"@"}),e("assets.elementLibrary")]}),b.map(({folder:m,depth:u})=>s.jsx(Ie,{folder:m,depth:u},m.id)),o&&s.jsx("input",{className:"assets-folder-input assets-folder-input--new",value:g,autoFocus:!0,"aria-label":e("assets.newFolder"),placeholder:e("assets.newFolder"),onChange:m=>_(m.target.value),onBlur:()=>{g.trim()||i(!1)},onKeyDown:m=>{m.key==="Enter"&&k(),m.key==="Escape"&&(_(""),i(!1))}})]})]})}let T={status:"idle",elements:[]},P=null;const G=new Set;function M(e){T=e,G.forEach(a=>a())}function Fe(e){return G.add(e),()=>G.delete(e)}function O(e=!1){return!e&&T.status==="ready"?Promise.resolve(!0):P||(M({...T,status:"loading"}),P=de().then(a=>(M({status:"ready",elements:a}),!0)).catch(a=>(console.error("[ElementMembership] load failed",a),M({...T,status:"error"}),!1)).finally(()=>{P=null}),P)}function Te(e){const a=[e,...T.elements.filter(r=>r.id!==e.id)];M({status:"ready",elements:a})}function Y(e){M({status:"ready",elements:T.elements.filter(a=>a.id!==e)})}function Ee(e){e.stopPropagation()}function De(e){e.stopPropagation()}function Pe(e){(e.key==="Enter"||e.key===" ")&&e.stopPropagation()}async function Me(e,a){if(a){await ce(a.id),Y(a.id);return}const{asset:r}=await ue({result:{filePath:e.filePath??void 0},sourceAssetId:e.id,elementKind:"character",name:e.name,notes:e.notes??void 0,folderId:e.folderId,tags:[me(e.id)]});Te(r)}function z({active:e,busy:a,label:r,onToggle:l}){return s.jsx("button",{type:"button",className:`asset-element-toggle${e?" is-active":""}`,title:r,"aria-label":r,"aria-pressed":e,"aria-busy":a||void 0,disabled:a,onPointerDown:Ee,onDoubleClick:De,onKeyDown:Pe,onClick:p=>{p.stopPropagation(),l()},children:s.jsx("span",{className:"asset-element-toggle__glyph","aria-hidden":"true",children:"@"})})}function Re({item:e}){const{t:a}=I(),r=v(b=>b.showToast),l=v(b=>b.deleteAssetItem),[p,f]=d.useState(!1),j=e.kind==="element",o=j||(e.kind==="image"||e.kind==="video")&&!!e.filePath,i=a("assets.elementLibrary"),g=d.useSyncExternalStore(Fe,()=>T,()=>T),_=!j&&o?q(g.elements,e.id):null,h=p||g.status==="loading"||g.status==="idle";if(d.useEffect(()=>{o&&!j&&O()},[o,j]),j){const b=async()=>{if(!p){f(!0);try{await l(e.id)?Y(e.id):r(a("assets.actionFailed"),!0)}finally{f(!1)}}};return s.jsx(z,{active:!0,busy:p,label:a("assets.removeFromElements"),onToggle:()=>{b()}})}if(!o)return null;async function x(){if(p||g.status==="loading")return;if(g.status!=="ready"&&!await O(!0)){r(a("assets.actionFailed"),!0);return}const b=q(T.elements,e.id);f(!0);try{await Me(e,b)}catch(k){console.error("[ElementMembership] toggle failed",k),r(a("assets.actionFailed"),!0)}finally{f(!1)}}return s.jsx(z,{active:!!_,busy:h,label:i,onToggle:()=>{x()}})}const L=12,V=180;function $e(e){return`/generated/${e.split("/").map(encodeURIComponent).join("/")}`}function Be({item:e,selected:a,onSelect:r,onPreview:l}){const{t:p}=I(),f=v(w=>w.deleteAssetItem),j=v(w=>w.updateAssetItem),o=v(w=>w.showToast),[i,g]=d.useState(!1),[_,h]=d.useState(!1),[x,b]=d.useState(!1),k=d.useRef(null);d.useEffect(()=>{const w=k.current;if(!w||e.kind!=="video"||typeof IntersectionObserver>"u"){b(!0);return}const R=new IntersectionObserver(([D])=>{D?.isIntersecting&&b(!0)},{rootMargin:"300px"});return R.observe(w),()=>R.disconnect()},[e.kind]);const m=e.kind==="element"&&!e.filePath?pe(e):e.filePath,u=m?$e(m):null,t=e.kind==="video",c=p(t?"assetGen.videoFallback":"assetGen.imageFallback"),y=p(t?"assetGen.previewVideo":"assetGen.previewImage",{prompt:e.name.trim()||c});async function A(){if(!i){g(!0);return}await f(e.id)||o(p("assets.actionFailed"),!0),g(!1)}const N=e.tags.includes("starred");async function S(){if(!_){h(!0);try{const w=ge(e.tags,N);await j(e.id,{tags:w})||o(p("assets.actionFailed"),!0)}finally{h(!1)}}}return s.jsxs("article",{ref:k,className:`assets-tile${a?" is-selected":""}`,tabIndex:0,"aria-selected":a,onClick:()=>r?.(e.id),onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&r&&(w.preventDefault(),r(e.id))},children:[s.jsxs("div",{className:"assets-tile__media",children:[u?s.jsxs("button",{type:"button",className:"assets-tile__preview","aria-label":y,onClick:w=>{w.stopPropagation(),r?.(e.id),l?.(e)},onKeyDown:w=>w.stopPropagation(),children:[t?x?s.jsx("video",{src:u,preload:"metadata",muted:!0,playsInline:!0,"aria-hidden":"true"}):null:s.jsx("img",{src:u,alt:"",loading:"lazy",decoding:"async"}),s.jsx("span",{className:"assets-tile__preview-hint","aria-hidden":"true",children:p(t?"assetGen.openHintVideo":"assetGen.openHintImage")})]}):s.jsx("span",{className:"assets-tile__glyph","aria-hidden":"true",children:e.kind.slice(0,1).toUpperCase()}),s.jsx(fe,{variant:"asset",active:N,busy:_,label:p(N?"assets.unstarAsset":"assets.starAsset"),onToggle:S}),s.jsx(Re,{item:e}),s.jsx("button",{type:"button",className:`assets-tile__delete${i?" is-danger":""}`,"aria-label":p(i?"assets.confirmDelete":"assets.deleteAsset"),onClick:w=>{w.stopPropagation(),A()},children:i?p("assets.confirmDelete"):"×"})]}),s.jsxs("div",{className:"assets-tile__meta",children:[s.jsxs("div",{className:"assets-tile__title",children:[s.jsx("strong",{title:e.name,children:e.name}),s.jsx("span",{children:e.kind})]}),e.tags.length>0&&s.jsxs("div",{className:"assets-tile__tags",children:[e.tags.slice(0,2).map(w=>s.jsx("span",{children:w},w)),e.tags.length>2&&s.jsxs("span",{children:["+",e.tags.length-2]})]})]})]})}function Le({onSelectAsset:e,onPreviewAsset:a,selectedId:r}){const{t:l}=I(),p=v(c=>c.assets),f=v(c=>c.assetsLoading),j=v(c=>c.assetsCursor),o=v(c=>c.loadMoreAssets),i=d.useRef(null),[g,_]=d.useState(960),h=Math.max(1,Math.floor((g+L)/(V+L))),x=d.useMemo(()=>Array.from({length:Math.ceil(p.length/h)},(c,y)=>p.slice(y*h,(y+1)*h)),[p,h]);d.useEffect(()=>{const c=i.current;if(!c)return;const y=()=>{const N=getComputedStyle(c),S=(parseFloat(N.paddingLeft)||0)+(parseFloat(N.paddingRight)||0);_(Math.max(0,c.clientWidth-S))};y();const A=new ResizeObserver(y);return A.observe(c),()=>A.disconnect()},[]);const b=Math.max(V,(g-L*(h-1))/h)+70+L,k=he({count:x.length,getScrollElement:()=>i.current,estimateSize:()=>b,overscan:4}),m=k.getVirtualItems(),u=m.at(-1)?.index,t=d.useCallback(()=>{j&&!f&&o()},[j,f,o]);return d.useEffect(()=>{u===x.length-1&&t()},[u,t,x.length]),s.jsxs("div",{ref:i,className:"assets-grid-scroll",children:[s.jsx("div",{className:"assets-grid-virtual",style:{height:k.getTotalSize()},children:m.map(c=>s.jsx("div",{className:"assets-grid-row",style:{transform:`translateY(${c.start}px)`,gridTemplateColumns:`repeat(${h}, minmax(0, 1fr))`},children:x[c.index]?.map(y=>s.jsx(Be,{item:y,selected:y.id===r,onSelect:e,onPreview:a},y.id))},c.key))}),j&&s.jsx("button",{type:"button",className:"assets-load-more",disabled:f,onClick:t,children:l("assets.loadMore")})]})}const Ue=5e3;function Ke({refs:e,onChange:a,maxRefs:r=6}){const{t:l}=I(),[p,f]=d.useState(null),[j,o]=d.useState(null),[i,g]=d.useState(null),_=d.useRef(null);d.useEffect(()=>()=>{_.current&&window.clearTimeout(_.current)},[]);const h=(u,t)=>{if(t<0||t>=e.length||u===t)return;const c=[...e],[y]=c.splice(u,1);c.splice(t,0,y),a(c)},x=u=>{if(e.length<=1)return;const t=e[u];a(e.filter((c,y)=>y!==u)),g({ref:t,index:u}),_.current&&window.clearTimeout(_.current),_.current=window.setTimeout(()=>g(null),Ue)},b=()=>{if(!i||e.some(t=>t.path===i.ref.path))return;const u=[...e];u.splice(Math.min(i.index,u.length),0,i.ref),a(u.slice(0,r)),g(null)},k=(u,t)=>{u.preventDefault();const c=u.dataTransfer.getData("application/ima2-element-ref")||p,y=e.findIndex(S=>S.id===c);if(f(null),y<0||y===t)return;const A=e[y],N=e.find((S,w)=>w!==y&&S.path===A.path);if(N){o(N.id),window.setTimeout(()=>o(null),1200);return}h(y,t)},m=(u,t)=>a(e.map((c,y)=>y===u?{...c,alt:t}:c));return s.jsxs("section",{className:"element-ref-grid","aria-labelledby":"element-refs-title",children:[s.jsxs("div",{className:"element-detail__section-heading",children:[s.jsxs("div",{children:[s.jsx("h3",{id:"element-refs-title",children:l("element.refsTitle")}),s.jsx("p",{children:l("element.refsHelp")})]}),s.jsxs("span",{children:[e.length," / ",r]})]}),s.jsx("div",{className:"element-ref-grid__items",children:e.map((u,t)=>s.jsxs("div",{className:`element-ref-card${p===u.id?" is-dragging":""}${j===u.id?" is-duplicate":""}`,draggable:!0,onDragStart:c=>{f(u.id),c.dataTransfer.setData("application/ima2-element-ref",u.id),c.dataTransfer.effectAllowed="move"},onDragEnd:()=>f(null),onDragOver:c=>c.preventDefault(),onDrop:c=>k(c,t),children:[s.jsxs("div",{className:"element-ref-card__image",children:[s.jsx("img",{src:u.previewUrl||u.path,alt:u.alt||l("element.refAlt",{n:t+1})}),t===0?s.jsx("span",{children:l("element.refPrimary")}):null]}),s.jsxs("div",{className:"element-ref-card__controls",children:[s.jsxs("label",{children:[l("element.refLabel"),s.jsx("input",{value:u.alt,maxLength:80,placeholder:l("element.refLabelPlaceholder"),onChange:c=>m(t,c.target.value)})]}),s.jsxs("div",{children:[s.jsx("button",{type:"button",disabled:t===0,onClick:()=>h(t,t-1),"aria-label":l("element.refMoveUp",{n:t+1}),children:"↑"}),s.jsx("button",{type:"button",disabled:t===e.length-1,onClick:()=>h(t,t+1),"aria-label":l("element.refMoveDown",{n:t+1}),children:"↓"}),s.jsx("button",{type:"button",className:"is-danger",disabled:e.length<=1,onClick:()=>x(t),"aria-label":l("element.refRemove"),children:l("element.refRemove")})]})]})]},u.id))}),i?s.jsxs("div",{className:"element-ref-grid__undo",role:"status",children:[s.jsx("span",{children:l("element.refRemoved")}),s.jsx("button",{type:"button",onClick:b,children:l("element.refUndo")})]}):null]})}const Ge=/^[A-Za-z0-9_-]{1,32}$/;function He({bindings:e,refs:a,onSave:r}){const{t:l}=I(),p=e.find(b=>b.provider==="runway"),f=e.find(b=>b.provider==="higgsfield"),[j,o]=d.useState(p?.tag??""),[i,g]=d.useState(!1),[_,h]=d.useState(null),x=async()=>{const b=j.trim();if(b&&!Ge.test(b)){h(l("assets.bindingTagInvalid"));return}h(null),g(!0);try{const k=[{provider:"runway",mode:"stateless-refs",...b?{tag:b}:{}},...f?[f]:[]];await r(k)||h(l("assets.actionFailed"))}finally{g(!1)}};return s.jsxs("section",{className:"element-detail__section","data-testid":"character-bindings-card",children:[s.jsx("div",{className:"element-detail__section-heading",children:s.jsxs("div",{children:[s.jsx("h3",{children:l("assets.bindingsTitle")}),s.jsx("p",{children:l("assets.bindingsHelp")})]})}),s.jsxs("div",{className:"character-binding-row",children:[s.jsx("span",{className:"character-binding-row__provider",children:"Runway"}),s.jsx("span",{className:"character-binding-row__mode",children:l("assets.bindingStateless")}),s.jsx("input",{value:j,maxLength:32,placeholder:l("assets.bindingTagPlaceholder"),"aria-label":l("assets.bindingTagPlaceholder"),onChange:b=>o(b.target.value)}),s.jsx("button",{type:"button",disabled:i,onClick:()=>{x()},children:l(i?"assets.bindingSaving":"assets.bindingSave")})]}),xe(a)?s.jsx("p",{className:"element-detail__error",role:"alert",children:l("assets.bindingCapWarning",{count:a.length})}):null,s.jsxs("div",{className:"character-binding-row character-binding-row--locked",children:[s.jsx("span",{className:"character-binding-row__provider",children:"Higgsfield"}),f?.status?s.jsx("span",{className:"character-binding-row__status",children:f.status}):null,s.jsx("button",{type:"button",disabled:!0,title:l("assets.bindingTrainLockedHint"),children:l("assets.bindingTrain")}),s.jsx("span",{className:"character-binding-row__badge",children:l("assets.bindingPaidPlan")})]}),f&&be(a,f)?s.jsx("p",{className:"element-detail__error",role:"alert",children:l("assets.bindingDriftWarning")}):null,_?s.jsx("p",{className:"element-detail__error",role:"alert",children:_}):null]})}const qe=["character","product","style","scene"],W=e=>e[0].toUpperCase()+e.slice(1);function J(e){return{id:e?.id,name:e?.name??"",kind:e?.kind??"character",refs:(e?.refs??[]).filter(a=>typeof a=="string"&&a.length>0).map((a,r)=>({id:`${e?.id??"new"}-${r}-${a}`,path:a,previewUrl:`/generated/${a.split("/").map(encodeURIComponent).join("/")}`,alt:""})),notes:e?.notes??"",defaultStrength:e?.defaultStrength??.75}}function Oe({element:e,saving:a,testing:r,onSave:l,onDelete:p,onRunTestSheet:f,onSaveBindings:j}){const{t:o}=I(),[i,g]=d.useState(()=>J(e)),[_,h]=d.useState(null);d.useEffect(()=>{g(J(e)),h(null)},[e]);const x=800-i.notes.length,b=d.useMemo(()=>i.notes.trim()?`[Element: ${i.name.trim()||"Untitled"}] ${i.notes.trim()}`:null,[i.name,i.notes]),k=(t,c)=>g(y=>({...y,[t]:c})),m=async()=>{if(!i.name.trim())return h(o("element.errorName"));if(!i.refs.length)return h(o("element.errorRefs"));h(null),await l({...i,name:i.name.trim(),notes:i.notes.trim()?i.notes:""})},u=qe.map(t=>({value:t,label:o(`element.kind${W(t)}`)}));return s.jsxs("aside",{className:"element-detail","aria-label":o("element.ariaLabel"),children:[s.jsxs("header",{className:"element-detail__header",children:[s.jsxs("div",{children:[s.jsx("span",{children:o("element.title")}),s.jsx("h2",{children:o(e?"element.titleEdit":"element.titleNew")})]}),e?s.jsx("span",{className:"element-detail__status",children:o("element.saved")}):null]}),s.jsxs("label",{className:"element-detail__field",children:[o("element.name"),s.jsx("input",{value:i.name,maxLength:120,placeholder:o("element.namePlaceholder"),onChange:t=>k("name",t.target.value)})]}),s.jsx(ve,{title:o("element.kind"),items:u,value:i.kind,onChange:t=>k("kind",t)}),s.jsx("p",{className:"element-detail__kind-help",children:o(`element.help${W(i.kind)}`)}),s.jsx(Ke,{refs:i.refs,onChange:t=>k("refs",t),maxRefs:6}),e&&i.kind==="character"&&j?s.jsx(He,{bindings:e.characterBindings??[],refs:e.refs,onSave:t=>j(e.id,t)}):null,s.jsxs("section",{className:"element-detail__section",children:[s.jsxs("div",{className:"element-detail__section-heading",children:[s.jsxs("div",{children:[s.jsx("h3",{children:o("element.notes")}),s.jsx("p",{children:o("element.notesHelp")})]}),x<=100?s.jsx("span",{children:o("element.remaining",{n:x})}):null]}),s.jsx("textarea",{value:i.notes,maxLength:800,rows:6,placeholder:o("element.notesPlaceholder"),onChange:t=>k("notes",t.target.value)}),b?s.jsx("p",{className:"element-detail__note-preview",children:b}):null]}),s.jsxs("section",{className:"element-detail__section",children:[s.jsxs("div",{className:"element-detail__section-heading",children:[s.jsxs("div",{children:[s.jsx("h3",{children:o("element.strength")}),s.jsx("p",{children:o("element.strengthHelp")})]}),s.jsx("output",{children:i.defaultStrength.toFixed(2)})]}),s.jsx("input",{className:"element-detail__strength",type:"range",min:"0",max:"1",step:"0.05",value:i.defaultStrength,onChange:t=>k("defaultStrength",Number(t.target.value))}),s.jsx("button",{type:"button",className:"element-detail__reset",onClick:()=>k("defaultStrength",.75),children:o("element.resetDefault")})]}),_?s.jsx("p",{className:"element-detail__error",role:"alert",children:_}):null,s.jsxs("footer",{className:"element-detail__actions",children:[s.jsx("button",{type:"button",className:"element-detail__save",disabled:a,onClick:()=>{m()},children:o(a?"element.saving":"element.save")}),s.jsx("button",{type:"button",disabled:!e||r,onClick:()=>e&&void f(e.id),children:o(r?"element.testing":"element.runTest")}),e&&p?s.jsx("button",{type:"button",className:"is-danger",onClick:()=>{p(e.id)},children:o("element.delete")}):null]})]})}const ze=["image","video","element","preset","template"];function Ve(e,a){return Ne(e,a)}function Xe(){const{t:e}=I(),a=v(n=>n.assets),r=v(n=>n.assetsTags),l=v(n=>n.assetsFilters),p=v(n=>n.assetsLoading),f=v(n=>n.assetsLoadError),j=v(n=>n.loadAssets),o=v(n=>n.setUIMode),i=v(n=>n.setAssetsFilters),g=v(n=>n.updateAssetItem),_=v(n=>n.deleteAssetItem),h=v(n=>n.showToast),[x,b]=d.useState(l.q),[k,m]=d.useState(null),[u,t]=d.useState(null),[c,y]=d.useState(null),A=je(),N=v(n=>n.keyingTarget),S=v(n=>n.pendingAssetDetailId);d.useEffect(()=>{if(!S)return;const n=S;v.setState({pendingAssetDetailId:null});const E=v.getState().assets.find(F=>F.id===n)??null;y(E),i({kind:null,folderId:null,tag:null,q:""}),b(""),m(n),E||ye(n).then(({asset:F})=>{v.setState(K=>({assets:[F,...K.assets.filter(B=>B.id!==F.id)]})),y(F)}).catch(()=>{})},[S,i]);const w=d.useRef(!1);d.useEffect(()=>{if(N){w.current=!0;return}w.current&&(w.current=!1,j(!0))},[N,j]);const R=d.useMemo(()=>[{value:"",label:e("assets.kindAll")},...ze.map(n=>({value:n,label:e(`assets.kind${n[0].toUpperCase()}${n.slice(1)}`)}))],[e]);d.useEffect(()=>{j(!0)},[j]),d.useEffect(()=>{const n=window.setTimeout(()=>i({q:x}),300);return()=>window.clearTimeout(n)},[x,i]);const D=!!(l.q||l.kind||l.tag),Z=a.length===0&&!p,U=l.kind==="element"&&!l.folderId&&!l.q&&!l.tag,X=U?"assets.emptyElementsTitle":l.folderId?"assets.emptyFolderTitle":D?"assets.emptySearchTitle":"assets.emptyTitle",ee=U?"assets.emptyElementsBody":l.folderId?"assets.emptyFolderBody":D?"assets.emptySearchBody":"assets.emptyBody",C=a.find(n=>n.id===k)??(c?.id===k?c:null),H=C?.kind==="element"?Je(C):null,$=d.useCallback(()=>m(null),[]),se=Ve(!!(C&&A),$),te=d.useCallback(()=>t(null),[]),ae=async n=>{(!n.id||!await g(n.id,{name:n.name,notes:n.notes}))&&h(e("assets.actionFailed"),!0)},ne=async(n,E)=>{const K={...a.find(oe=>oe.id===n)?.metadata??{},characterBindings:E},B=await g(n,{metadata:K});return B||h(e("assets.actionFailed"),!0),B},le=async(n,E)=>{const F=await g(n,{name:E});return F||h(e("assets.actionFailed"),!0),F},ie=async n=>{await _(n)?$():h(e("assets.actionFailed"),!0)},re=async()=>h(e("assets.testSheetsUnavailable"),!0);return s.jsxs("section",{className:`assets-workspace${C?" assets-workspace--detail-open":""}`,"aria-labelledby":"assets-title",children:[s.jsx(Ce,{}),s.jsxs("main",{className:"assets-workspace__main",children:[s.jsxs("header",{className:"assets-toolbar",children:[s.jsxs("div",{className:"assets-toolbar__title",children:[s.jsx("h1",{id:"assets-title",children:e("assets.title")}),s.jsx("span",{children:e("assets.itemCount",{count:a.length})})]}),s.jsxs("div",{className:"assets-toolbar__controls",children:[s.jsx("input",{type:"search",value:x,placeholder:e("assets.searchPlaceholder"),"aria-label":e("assets.searchPlaceholder"),onChange:n=>b(n.target.value)}),s.jsx(_e,{items:R,value:l.kind??"",onChange:n=>i({kind:n||null}),ariaLabel:e("assets.kindAll")}),a.length>0&&s.jsx("button",{type:"button",className:"assets-clear-btn",onClick:async()=>{confirm(e("assets.clearConfirm"))&&(await we(),j(!0))},children:e("assets.clearAll")})]}),r.length>0&&s.jsx("div",{className:"assets-tag-filter",children:r.map(n=>s.jsx("button",{type:"button",className:l.tag===n?"is-active":"",onClick:()=>i({tag:l.tag===n?null:n}),children:n},n))})]}),f&&a.length===0?s.jsxs("div",{className:"assets-empty",role:"alert",children:[s.jsx("h2",{children:e("assets.loadErrorTitle")}),s.jsx("p",{children:e("assets.loadErrorBody")}),s.jsx("button",{type:"button",className:"assets-empty__cta",onClick:()=>{j(!0)},children:e("assets.retry")})]}):Z?s.jsxs("div",{className:"assets-empty",children:[s.jsx("h2",{children:e(X)}),s.jsx("p",{children:e(ee)}),U||!D&&!l.folderId?s.jsx("button",{type:"button",className:"assets-empty__cta",onClick:()=>o("classic"),children:e("nav.create")}):null]}):s.jsx(Le,{selectedId:k??void 0,onSelectAsset:m,onPreviewAsset:n=>t(ke(n))})]}),C&&A?s.jsx("button",{type:"button",className:"assets-workspace__detail-backdrop","aria-label":e("assets.detailClose"),onClick:$}):null,C&&s.jsxs("aside",{ref:se,className:"assets-workspace__detail",role:A?"dialog":void 0,"aria-modal":A?!0:void 0,"aria-label":e("assets.detailAria",{name:C.name}),children:[s.jsx("button",{type:"button",className:"assets-workspace__detail-close",onClick:$,"aria-label":e("assets.detailClose"),children:"×"}),H?s.jsx(Oe,{element:H,saving:!1,testing:!1,onSave:ae,onSaveBindings:ne,onDelete:ie,onRunTestSheet:re}):s.jsx(We,{asset:C,onRename:n=>le(C.id,n)})]}),s.jsx(Ae,{}),u?s.jsx(Se,{item:u,onClose:te}):null]})}function We({asset:e,onRename:a}){const{t:r,locale:l}=I(),[p,f]=d.useState(!1),[j,o]=d.useState(e.name),i=d.useRef(!1),g=typeof e.metadata?.prompt=="string"?e.metadata.prompt:null,_=typeof e.metadata?.provider=="string"?e.metadata.provider:null;d.useEffect(()=>{o(e.name),f(!1)},[e.id,e.name]);async function h(){if(i.current)return;const x=j.trim();if(!x||x===e.name){o(e.name),f(!1);return}i.current=!0;try{await a(x)||o(e.name)}finally{i.current=!1,f(!1)}}return s.jsxs("div",{className:"assets-workspace__detail-meta",children:[s.jsx("div",{className:"assets-workspace__detail-title",children:p?s.jsx("input",{className:"assets-folder-input assets-workspace__detail-name-input",value:j,autoFocus:!0,"aria-label":r("assets.renameAsset"),onChange:x=>o(x.target.value),onBlur:()=>{h()},onKeyDown:x=>{x.key==="Enter"&&h(),x.key==="Escape"&&(o(e.name),f(!1))}}):s.jsxs(s.Fragment,{children:[s.jsx("h2",{children:e.name}),s.jsx("button",{type:"button",className:"assets-workspace__detail-rename","aria-label":r("assets.renameAsset"),title:r("assets.renameAsset"),onClick:()=>f(!0),children:s.jsx(Q,{})})]})}),s.jsxs("dl",{children:[s.jsx("dt",{children:r("assets.detailKind")}),s.jsx("dd",{children:r(`assets.kind${e.kind[0].toUpperCase()}${e.kind.slice(1)}`)}),s.jsx("dt",{children:r("assets.detailCreated")}),s.jsx("dd",{children:new Intl.DateTimeFormat(l,{dateStyle:"medium",timeStyle:"short"}).format(new Date(e.createdAt))}),_?s.jsxs(s.Fragment,{children:[s.jsx("dt",{children:r("assets.detailProvider")}),s.jsx("dd",{children:_})]}):null,g?s.jsxs(s.Fragment,{children:[s.jsx("dt",{children:r("assets.detailPrompt")}),s.jsx("dd",{className:"assets-workspace__detail-prompt",children:g})]}):null,e.tags.length>0?s.jsxs(s.Fragment,{children:[s.jsx("dt",{children:r("assets.detailTags")}),s.jsx("dd",{children:e.tags.join(", ")})]}):null]})]})}function Je(e){const a=e.metadata??{},r=a.elementKind,l=a.refs,p=Array.isArray(a.characterBindings)?a.characterBindings:void 0;return{id:e.id,name:e.name,kind:r==="product"||r==="style"||r==="scene"?r:"character",refs:Array.isArray(l)?l.filter(f=>typeof f=="string"):e.filePath?[e.filePath]:[],notes:e.notes??void 0,defaultStrength:typeof a.defaultStrength=="number"?a.defaultStrength:void 0,characterBindings:p}}export{Xe as AssetsWorkspace};
@@ -1 +0,0 @@
1
- import{u as re,a as v,b as Y,q as fe,j as a,p as ge,ai as me,aj as pe,ak as ye}from"./index-DTEhasVd.js";import{u as xe}from"./useAgentDialogFocus-Dyj_bA5Q.js";function ke(){return a.jsx("svg",{viewBox:"0 0 24 24",width:"18",height:"18","aria-hidden":"true",children:a.jsx("path",{d:"M6 6l12 12M18 6 6 18",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round"})})}function be({zoomed:e}){return a.jsxs("svg",{viewBox:"0 0 24 24",width:"18",height:"18","aria-hidden":"true",children:[a.jsx("circle",{cx:"10.5",cy:"10.5",r:"6.5",fill:"none",stroke:"currentColor",strokeWidth:"1.7"}),a.jsx("path",{d:"M15.5 15.5 21 21M7.5 10.5h6",fill:"none",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round"}),e?null:a.jsx("path",{d:"M10.5 7.5v6",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round"})]})}function Pe({item:e,onClose:t}){const{t:n}=re(),[o,s]=v.useState(!1),l=e.metadata??null,[g,c]=v.useState(l),u=v.useId(),f=Y(C=>C.setKeyingTarget),h=Y(C=>C.setCuratorTarget),i=v.useCallback(()=>t(),[t]),p=xe(!0,i),r=e.mediaType==="video",m=e.kind!=="edit"&&!!e.filename&&e.backgroundPreset!=="transparent",b=l??g,_=typeof b?.spriteRunId=="string"?b.spriteRunId:null,w=typeof b?.manifestPath=="string"?b.manifestPath:null,G=!!(_&&w&&e.filename),K=n(r?"assetGen.videoFallback":"assetGen.imageFallback"),T=e.prompt?.trim()||K,j=v.useCallback(()=>{f(e),t()},[e,t,f]),L=v.useCallback(()=>{!_||!w||!e.filename||(h({runId:_,atlasFile:e.filename,manifestFile:w}),t())},[e.filename,w,t,h,_]);return v.useEffect(()=>{c(l);const C=e.requestId?.startsWith("asset:")?e.requestId.slice(6):null;if(!C||l)return;let P=!0;return fe(C).then(({asset:S})=>{P&&c(S.metadata)}).catch(()=>{P&&c(null)}),()=>{P=!1}},[l,e.requestId]),v.useEffect(()=>{const C=document.body.style.overflow,P=document.documentElement.style.overflow;return document.body.style.overflow="hidden",document.documentElement.style.overflow="hidden",()=>{document.body.style.overflow=C,document.documentElement.style.overflow=P}},[]),a.jsxs("div",{className:"assetgen-lightbox",role:"presentation",children:[a.jsx("button",{type:"button",className:"assetgen-lightbox__backdrop","aria-label":n("assetGen.closePreview"),onClick:i}),a.jsxs("section",{ref:p,className:"assetgen-lightbox__panel",role:"dialog","aria-modal":"true","aria-labelledby":u,children:[a.jsxs("header",{className:"assetgen-lightbox__header",children:[a.jsx("h2",{id:u,children:n("assetGen.previewDialogTitle",{prompt:T})}),a.jsx("button",{type:"button",className:"assetgen-lightbox__control","aria-label":n("assetGen.closePreview"),onClick:i,children:a.jsx(ke,{})})]}),a.jsx("div",{className:["assetgen-lightbox__stage",e.kind==="edit"?"is-keyed":"",o?"is-zoomed":""].filter(Boolean).join(" "),tabIndex:o?0:void 0,children:r?a.jsx("video",{src:e.url||e.image,poster:e.thumb||void 0,controls:!0,autoPlay:!0,muted:!0,playsInline:!0,preload:"metadata","aria-label":T}):a.jsx("img",{src:e.url||e.image,alt:T})}),!r||m||G?a.jsxs("footer",{className:"assetgen-lightbox__footer",children:[G?a.jsx("button",{type:"button",className:"assetgen-lightbox__zoom assetgen-lightbox__curate",onClick:L,children:n("spriteCurator.open")}):null,m?a.jsx("button",{type:"button",className:"assetgen-lightbox__zoom assetgen-lightbox__keybtn",onClick:j,children:n("keying.open")}):null,r?null:a.jsxs("button",{type:"button",className:"assetgen-lightbox__zoom","aria-pressed":o,"aria-label":n(o?"assetGen.zoomOut":"assetGen.zoomIn"),onClick:()=>s(C=>!C),children:[a.jsx(be,{zoomed:o}),a.jsx("span",{children:n(o?"assetGen.zoomOut":"assetGen.zoomIn")})]})]}):null]})]})}const H={tolerance:40,softness:10,spill:50};function te(e,t,n){const o=128-.168736*e-.331264*t+.5*n,s=128+.5*e-.418688*t-.081312*n;return[o,s]}function ne(e,t,n){return .299*e+.587*t+.114*n}function _e(e,t,n,o){const s=t*n,l=new Uint8Array(s);for(let i=0;i<s;i++)e[i]<o&&(l[i]=1);const g=new Uint8Array(s),c=new Int32Array(s);let u=0,f=0;const h=i=>{l[i]&&!g[i]&&(g[i]=1,c[f++]=i)};for(let i=0;i<t;i++)h(i),h((n-1)*t+i);for(let i=0;i<n;i++)h(i*t),h(i*t+t-1);for(;u<f;){const i=c[u++],p=i%t,r=(i-p)/t;p>0&&h(i-1),p<t-1&&h(i+1),r>0&&h(i-t),r<n-1&&h(i+t)}for(let i=0;i<s;i++)l[i]&&!g[i]&&(e[i]=o)}function oe(e){const{width:t,height:n,data:o}=e;if(t<2||n<2||o.length<t*n*4)throw new Error("colorKey: image too small or malformed pixel buffer");const s=4,l=[0,Math.max(0,t-s)],g=[0,Math.max(0,n-s)],c=[],u=[],f=[];for(const i of l)for(const p of g)for(let r=p;r<Math.min(p+s,n);r++)for(let m=i;m<Math.min(i+s,t);m++){const b=(r*t+m)*4;c.push(o[b]),u.push(o[b+1]),f.push(o[b+2])}const h=i=>{const p=[...i].sort((r,m)=>r-m);return p[Math.floor(p.length/2)]};return{r:h(c),g:h(u),b:h(f)}}function Me(e,t){const{width:n,height:o,data:s}=e;if(!n||!o||s.length!==n*o*4)throw new Error("colorKey: empty or malformed pixel buffer");const l=Math.max(0,Math.min(100,t.tolerance)),g=Math.max(0,Math.min(50,t.softness)),c=Math.max(0,Math.min(100,t.spill))/100,u=l/100*120,f=u+g/100*120,[h,i]=te(t.keyColor.r,t.keyColor.g,t.keyColor.b),p=t.keyColor.r,r=t.keyColor.g,m=t.keyColor.b,b=r>p+20&&r>m+20&&r>60,w=Math.max(p,r,m)-Math.min(p,r,m)<40,G=ne(p,r,m),K=10+l/100*15,T=400,j=n*o,L=new Float32Array(j);for(let k=0;k<j;k++){const x=k*4,N=s[x],R=s[x+1],E=s[x+2],[D,U]=te(N,R,E),M=Math.hypot(D-h,U-i);if(w)if(M>K)L[k]=T;else{const A=Math.abs(ne(N,R,E)-G)*.8;L[k]=Math.hypot(M,A)}else L[k]=M}const C=new Float32Array(j);for(let k=0;k<o;k++)for(let x=0;x<n;x++){const N=k*n+x;if(L[N]>=T){C[N]=T;continue}let R=0,E=0;for(let D=-1;D<=1;D++){const U=k+D;if(!(U<0||U>=o))for(let M=-1;M<=1;M++){const A=x+M;if(A<0||A>=n)continue;const B=L[U*n+A];B>=T||(R+=B,E++)}}C[N]=E>0?R/E:T}w&&_e(C,n,o,f);const P=f+c*120,S=new Uint8ClampedArray(s.length);for(let k=0;k<j;k++){const x=k*4,N=s[x],R=s[x+1],E=s[x+2],D=s[x+3],U=C[k];let M;U<=u?M=0:U<f?M=Math.pow((U-u)/(f-u),1.5)*255:M=255;let A=N,B=R,O=E;if(b&&c>0&&M>0){const W=P>u?Math.max(0,1-(U-u)/(P-u)):0;if(W>0){const X=(N+E)/2,d=Math.max(0,R-X)*W*c;B=Math.round(R-d);const y=d*.3;A=Math.min(255,Math.round(N+y)),O=Math.min(255,Math.round(E+y))}}S[x]=A,S[x+1]=B,S[x+2]=O,S[x+3]=Math.min(D,Math.round(M))}if(b&&c>0){let k=new Uint8Array(j);for(let x=0;x<o;x++)for(let N=0;N<n;N++){const R=x*n+N;if(S[R*4+3]===0)continue;let E=!1;e:for(let D=-1;D<=1;D++){const U=x+D;if(!(U<0||U>=o))for(let M=-1;M<=1;M++){const A=N+M;if(!(A<0||A>=n)&&S[(U*n+A)*4+3]===0){E=!0;break e}}}E&&(k[R]=1)}for(let x=0;x<3;x++){const N=new Uint8Array(j);for(let R=0;R<o;R++)for(let E=0;E<n;E++){const D=R*n+E;if(k[D]){N[D]=1;continue}if(S[D*4+3]===0)continue;let U=!1;for(let M=-1;M<=1&&!U;M++){const A=R+M;if(!(A<0||A>=o))for(let B=-1;B<=1&&!U;B++){const O=E+B;O<0||O>=n||k[A*n+O]&&(U=!0)}}U&&(N[D]=1)}k=N}for(let x=0;x<j;x++){if(!k[x])continue;const N=x*4,R=S[N],E=S[N+1],D=S[N+2],U=Math.max(R,D);if(E>U-8){const M=Math.max(0,U-4),A=Math.max(0,E-M);S[N+1]=Math.max(0,E-A),S[N]=Math.min(255,R+Math.round(A*.25)),S[N+2]=Math.min(255,D+Math.round(A*.25))}}}return{width:n,height:o,data:S}}function ve(e){return Math.round(Math.max(0,Math.min(100,e))*.7)}function ae(e,t,n){const o=Math.max(0,Math.min(t-1,Math.round(e.x*(t-1))));return Math.max(0,Math.min(n-1,Math.round(e.y*(n-1))))*t+o}function we(e,t,n,o){for(const s of n)if(Math.max(Math.abs(e[t]-s.r),Math.abs(e[t+1]-s.g),Math.abs(e[t+2]-s.b))<=o)return!0;return!1}function je(e,t,n){const{width:o,height:s,data:l}=e,g=o*s,c=new Uint8Array(g),u=new Uint8Array(g),f=new Int32Array(g),h=t.map(r=>{const m=ae(r,o,s)*4;return{r:l[m],g:l[m+1],b:l[m+2]}});let i=0;const p=r=>{u[r]||(u[r]=1,l[r*4+3]!==0&&we(l,r*4,h,n)&&(f[i++]=r))};for(const r of t)p(ae(r,o,s));for(;i>0;){const r=f[--i];c[r]=1;const m=r%o;m>0&&p(r-1),m<o-1&&p(r+1),r>=o&&p(r-o),r<g-o&&p(r+o)}return c}function Ce(e,t,n,o){if(n.length===0)return;if(e.width!==t.width||e.height!==t.height||e.data.length!==t.data.length)throw new Error("wandErase: target/source buffer size mismatch");const s=je(t,n,ve(o));for(let l=0;l<s.length;l++)s[l]&&(e.data[l*4+3]=0)}const Ne={reach:4,spillMaxFraction:.005},ie=18,Se=180,Ee=40,Ae=2,J=0,Ie=1,le=2,ce=3;function Q(e){const t=[e.r,e.g,e.b],n=[],o=[];for(let s=0;s<3;s++)if(t[s]>=192)n.push(s);else if(t[s]<64)o.push(s);else return null;return n.length===0||o.length===0?null:{keyed:n,unkeyed:o}}function V(e,t,n,o){const s=[e,t,n];let l=0;for(const c of o.keyed)l+=s[c];let g=0;for(const c of o.unkeyed)g+=s[c];return l/o.keyed.length-g/o.unkeyed.length}function Re(e,t,n,o){return Math.hypot(e-o.r,t-o.g,n-o.b)}function ue(e,t,n,o,s,l){const g=Math.min(l/s,1),c=1-g;if(c<=0)return[0,0,0,0];const u=(f,h)=>Math.min(255,Math.max(0,Math.round((f-g*h)/c)));return[c,u(e,o.r),u(t,o.g),u(n,o.b)]}function Ue(e,t,n,o){const s=t*n,l=255,g=new Uint8Array(s).fill(l);let c=[];for(let f=0;f<s;f++)e[f]&&(g[f]=0,c.push(f));let u=0;for(;c.length>0&&u<o;){u++;const f=[];for(const h of c){const i=h%t,p=(h-i)/t;for(let r=-1;r<=1;r++){const m=p+r;if(!(m<0||m>=n))for(let b=-1;b<=1;b++){const _=i+b;if(_<0||_>=t)continue;const w=m*t+_;g[w]===l&&(g[w]=u,f.push(w))}}}c=f}return g}function Te(e,t,n,o){const s=e.width*e.height,l=new Uint8Array(s),g=new Uint8Array(s);for(let c=0;c<s;c++){const u=c*4;if(t.data[u+3]===0){l[c]=J,g[c]=1;continue}const f=e.data[u],h=e.data[u+1],i=e.data[u+2];V(f,h,i,o)<ie?l[c]=Ie:Re(f,h,i,n)<=Se?l[c]=le:l[c]=ce}return{classes:l,keyedMask:g}}function Fe(e,t,n,o,s,l,g,c){const u=t.width*t.height,f=new Uint8Array(u);for(let h=0;h<u;h++){const i=l[h];if(!(i>0&&i<=c))continue;const p=g[h];if(p===le){if(i>Ae)continue}else if(p!==ce)continue;const r=h*4,m=t.data[r],b=t.data[r+1],_=t.data[r+2],w=V(m,b,_,o),[G,K,T,j]=ue(m,b,_,n,s,w),L=Math.round(t.data[r+3]*G);L<=0?(e.data[r]=0,e.data[r+1]=0,e.data[r+2]=0,e.data[r+3]=0):(e.data[r]=K,e.data[r+1]=T,e.data[r+2]=j,e.data[r+3]=L),f[h]=1}return f}function De(e,t,n,o,s,l,g,c){const{width:u,height:f}=t,h=u*f;let i=0;for(let _=0;_<h;_++)l[_]!==J&&i++;const p=Math.max(32,Math.round(i*c)),r=new Float32Array(h).fill(-1);for(let _=0;_<h;_++){if(g[_]||l[_]===J)continue;const w=_*4;if(e.data[w+3]===0)continue;const G=V(t.data[w],t.data[w+1],t.data[w+2],o);G>=ie&&(r[_]=G)}const m=new Uint8Array(h),b=[];for(let _=0;_<h;_++){if(r[_]<0||m[_])continue;m[_]=1,b.length=0,b.push(_);const w=[];let G=-1;for(;b.length>0;){const K=b.pop();w.push(K),r[K]>G&&(G=r[K]);const T=K%u,j=(K-T)/u;for(let L=-1;L<=1;L++){const C=j+L;if(!(C<0||C>=f))for(let P=-1;P<=1;P++){const S=T+P;if(S<0||S>=u)continue;const k=C*u+S;r[k]>=0&&!m[k]&&(m[k]=1,b.push(k))}}}if(!(w.length>p)&&!(G<=Ee))for(const K of w){const T=K*4,j=t.data[T],L=t.data[T+1],C=t.data[T+2],[P,S,k,x]=ue(j,L,C,n,s,r[K]);P<=0||(e.data[T]=S,e.data[T+1]=k,e.data[T+2]=x)}}}function Ke(e,t,n){if(!e.width||!e.height||e.width!==t.width||e.height!==t.height||e.data.length!==t.data.length||e.data.length!==e.width*e.height*4)throw new Error("softUnmix: empty or mismatched pixel buffers");const o=Q(n.keyColor);if(!o)return;const s=V(n.keyColor.r,n.keyColor.g,n.keyColor.b,o);if(s<=0)return;const l=Math.max(0,Math.min(254,Math.round(n.reach))),{classes:g,keyedMask:c}=Te(t,e,n.keyColor,o);let u;if(l>0){const f=Ue(c,t.width,t.height,l);u=Fe(e,t,n.keyColor,o,s,f,g,l)}else u=new Uint8Array(t.width*t.height);n.spillMaxFraction>0&&De(e,t,n.keyColor,o,s,g,u,n.spillMaxFraction)}function se(e,t,n){const o=`/generated/${encodeURIComponent(t)}`;return{...e,image:o,url:o,filename:t,mediaType:n,kind:"edit",requestId:`derived:${t}`,createdAt:Date.now(),providerUrl:null}}function Ge(){const{t:e}=re(),t=Y(d=>d.keyingTarget),n=Y(d=>d.setKeyingTarget),o=ge(!!t,()=>n(null)),s=Y(d=>d.addAssetGenDerivedItem),l=Y(d=>d.selectedProjectId),g=Y(d=>d.showToast),[c,u]=v.useState("loading"),[f,h]=v.useState(!1),[i,p]=v.useState(null),[r,m]=v.useState(null),[b,_]=v.useState(H.tolerance),[w,G]=v.useState(H.softness),[K,T]=v.useState(H.spill),[j,L]=v.useState(null),[C,P]=v.useState("erase"),[S,k]=v.useState([]),[x,N]=v.useState(!0),R=v.useRef(null),E=v.useRef(null),D=v.useRef(0),U=v.useRef(null),M=v.useRef(null),A=v.useCallback(()=>{U.current?.(),U.current=null},[]),B=t?.mediaType==="video",O=t?B&&t.filename?`/api/video/frame?file=${encodeURIComponent(t.filename)}&position=0`:t.url||t.image:null;v.useEffect(()=>{if(!O)return;let d=!0;u("loading"),R.current=null,L(null),k([]),P("erase");const y=new Image;return y.onload=()=>{if(d)try{const I=document.createElement("canvas");I.width=y.naturalWidth,I.height=y.naturalHeight;const F=I.getContext("2d");if(!F)throw new Error("no 2d context");F.drawImage(y,0,0);const z=F.getImageData(0,0,I.width,I.height);R.current=z,L(oe(z)),u("ready")}catch{d&&u("error")}},y.onerror=()=>{d&&u("error")},y.src=O,()=>{d=!1,y.onload=null,y.onerror=null}},[O]),v.useEffect(()=>(M.current=t?.filename??null,A(),h(!1),m(null),p(null),A),[A,t?.filename]),v.useEffect(()=>{if(!(c!=="ready"||!j))return cancelAnimationFrame(D.current),D.current=requestAnimationFrame(()=>{const d=R.current,y=E.current;if(!(!d||!y))try{const I=Me({width:d.width,height:d.height,data:d.data},{keyColor:j,tolerance:b,softness:w,spill:K});x&&Q(j)&&Ke(I,{width:d.width,height:d.height,data:d.data},{keyColor:j,...Ne}),S.length>0&&Ce(I,{width:d.width,height:d.height,data:d.data},S,b),y.width=I.width,y.height=I.height;const F=y.getContext("2d");if(!F)return;const z=F.createImageData(I.width,I.height);z.data.set(I.data),F.putImageData(z,0,0)}catch{u("error")}}),()=>cancelAnimationFrame(D.current)},[c,j,b,w,K,S,x]);const W=v.useCallback(d=>{const y=R.current,I=E.current;if(!y||!I)return;const F=I.getBoundingClientRect(),z=Math.max(0,Math.min(1,(d.clientX-F.left)/F.width)),q=Math.max(0,Math.min(1,(d.clientY-F.top)/F.height));if(C==="erase"&&!B){k(he=>[...he,{x:z,y:q}]);return}const $=Math.floor((d.clientX-F.left)/F.width*y.width),de=Math.floor((d.clientY-F.top)/F.height*y.height),Z=(Math.max(0,Math.min(y.height-1,de))*y.width+Math.max(0,Math.min(y.width-1,$)))*4;L({r:y.data[Z],g:y.data[Z+1],b:y.data[Z+2]})},[C,B]),X=v.useCallback(()=>{const d=E.current;d&&d.toBlob(y=>{if(!y)return;const I=URL.createObjectURL(y),F=document.createElement("a");F.href=I,F.download=`${(t?.filename||"asset").replace(/\.[a-z]+$/i,"")}-keyed.png`,F.click(),URL.revokeObjectURL(I)},"image/png")},[t]),ee=v.useCallback(()=>{const d=E.current;if(!(!d||!t?.filename||f)){if(h(!0),p(null),B){me({source:t.filename,keyParams:{tolerance:b,softness:w,keyColor:j??void 0},projectId:l,name:`${(t.prompt||"asset").trim().slice(0,60)} (keyed)`}).then(({requestId:y})=>{if(M.current!==t.filename)return;m(0),A();const I=pe(y,null,(F,z)=>{const q=z&&typeof z=="object"?z:{};if(F==="keying-progress"){const $=q.outTimeMs;m(typeof $=="number"&&Number.isFinite($)?$:0)}else if(F==="keying-done"){A();const $=q.filePath;if(typeof $=="string"&&$.trim()){s(se(t,$.trim(),"video")),h(!1),m(null),g(e("keying.videoSaved")),n(null);return}h(!1),m(null),p(e("keying.saveError"))}else F==="keying-error"&&(A(),h(!1),m(null),p(typeof q.error=="string"&&q.error?q.error:e("keying.saveError")))});U.current=I}).catch(y=>{M.current===t.filename&&(h(!1),p(y instanceof Error?y.message:e("keying.saveError")))});return}d.toBlob(y=>{if(M.current===t.filename){if(!y){h(!1),p(e("keying.saveError"));return}ye(y,{source:t.filename,projectId:l,name:`${(t.prompt||"asset").trim().slice(0,60)} (keyed)`,meta:{keyParams:{tolerance:b,softness:w,spill:K},prompt:t.prompt}}).then(({filePath:I})=>{if(M.current===t.filename){if(typeof I!="string"||!I.trim())throw new Error(e("keying.saveError"));s(se(t,I.trim(),"image")),g(e("keying.saved")),n(null)}}).catch(I=>{M.current===t.filename&&p(I instanceof Error?I.message:e("keying.saveError"))}).finally(()=>{M.current===t.filename&&h(!1)})}},"image/png")}},[t,f,B,j,l,b,w,K,A,s,g,n,e]);return t?a.jsx("div",{className:"assetgen-popup-backdrop",onClick:()=>n(null),children:a.jsxs("div",{ref:o,className:"keying-panel",role:"dialog","aria-modal":"true","aria-label":e("keying.title"),onClick:d=>d.stopPropagation(),children:[a.jsxs("header",{className:"keying-panel__head",children:[a.jsx("h2",{children:e("keying.title")}),j?a.jsxs("span",{className:"keying-panel__key",title:e("keying.keyColor"),children:[B?null:a.jsxs("span",{className:"keying-panel__modes",role:"group","aria-label":e("keying.clickMode"),children:[a.jsx("button",{type:"button",className:C==="erase"?"is-active":"","aria-pressed":C==="erase",onClick:()=>P("erase"),children:e("keying.modeErase")}),a.jsx("button",{type:"button",className:C==="pick"?"is-active":"","aria-pressed":C==="pick",onClick:()=>P("pick"),children:e("keying.modePick")})]}),S.length>0?a.jsx("button",{type:"button",className:"keying-panel__undo",onClick:()=>k(d=>d.slice(0,-1)),children:e("keying.undoClick",{count:String(S.length)})}):null,a.jsx("span",{className:"assetgen-bg-picker__swatch",style:{background:`rgb(${j.r},${j.g},${j.b})`},"aria-hidden":"true"}),a.jsx("span",{className:"keying-panel__hint",children:e(C==="erase"&&!B?"keying.eraseHint":"keying.pickHint")})]}):null]}),a.jsx("div",{className:"keying-panel__compare","aria-busy":c==="loading",children:c==="error"?a.jsxs("div",{className:"keying-panel__error",role:"alert",children:[a.jsx("p",{children:e("keying.loadError")}),a.jsx("button",{type:"button",onClick:()=>n(null),children:e("project.close")})]}):a.jsxs(a.Fragment,{children:[a.jsxs("figure",{className:"keying-panel__preview",children:[a.jsx("figcaption",{className:"keying-panel__preview-label",children:e("keying.original")}),a.jsx("div",{className:"keying-panel__stage keying-panel__stage--original",children:a.jsx("img",{src:O??"",alt:e("keying.originalAlt")})})]}),a.jsxs("figure",{className:"keying-panel__preview",children:[a.jsx("figcaption",{className:"keying-panel__preview-label",children:e("keying.removed")}),a.jsxs("div",{className:"keying-panel__stage",children:[a.jsx("canvas",{ref:E,className:"keying-panel__canvas",onClick:W,"aria-label":e("keying.previewAlt")}),c==="loading"?a.jsx("span",{className:"keying-panel__loading",role:"status",children:e("keying.previewLoading")}):null]})]})]})}),a.jsxs("details",{className:"keying-panel__advanced",children:[a.jsx("summary",{children:e("keying.advanced")}),a.jsxs("div",{className:"keying-panel__controls",children:[a.jsxs("label",{children:[e("keying.tolerance")," ",a.jsx("output",{children:b}),a.jsx("input",{type:"range",min:0,max:100,value:b,onChange:d=>_(Number(d.target.value))})]}),a.jsxs("label",{children:[e("keying.softness")," ",a.jsx("output",{children:w}),a.jsx("input",{type:"range",min:0,max:50,value:w,onChange:d=>G(Number(d.target.value))})]}),a.jsxs("label",{children:[e("keying.spill")," ",a.jsx("output",{children:K}),a.jsx("input",{type:"range",min:0,max:100,value:K,onChange:d=>T(Number(d.target.value))})]}),a.jsxs("label",{className:"keying-panel__unmix",children:[a.jsx("input",{type:"checkbox",checked:x,disabled:!j||!Q(j),onChange:d=>N(d.target.checked)}),e("keying.unmix"),a.jsx("span",{className:"keying-panel__hint",children:e("keying.unmixHint")})]}),a.jsx("button",{type:"button",className:"keying-panel__reset",onClick:()=>{_(H.tolerance),G(H.softness),T(H.spill),k([]),N(!0),R.current&&L(oe(R.current))},children:e("keying.reset")})]})]}),a.jsxs("footer",{className:"keying-panel__actions",children:[i?a.jsx("span",{className:"keying-panel__save-error",role:"alert",children:i}):null,a.jsx("button",{type:"button",className:"assetgen-generate",disabled:c!=="ready"||f||!t.filename,onClick:ee,children:f?r!==null?e("keying.videoKeying",{seconds:String(Math.round(r/1e3))}):e("keying.saving"):e(B?"keying.videoSave":"keying.save")}),B?null:a.jsx("button",{type:"button",className:"assetgen-popup__close",disabled:c!=="ready",onClick:X,children:e("keying.download")}),a.jsx("button",{type:"button",className:"assetgen-popup__close",onClick:()=>n(null),children:e("project.close")})]})]})}):null}export{Pe as A,Ge as K};
@@ -1 +0,0 @@
1
- import{u as d,j as e,a as x,p as j,b as m}from"./index-DTEhasVd.js";import{P as v}from"./AssetGenWorkspace-BQkdilsH.js";import"./KeyingPanel-CtGvO6-u.js";import"./useAgentDialogFocus-Dyj_bA5Q.js";function g({draft:i,disabled:s,errors:r,onChange:l,onSubmit:a}){const{t:n}=d(),c=t=>e.jsxs("label",{children:[n(`sprite.recipe.${t}`),e.jsx("input",{value:i[t],disabled:s,"aria-invalid":!!r[t],onChange:p=>l({[t]:p.target.value})}),r[t]?e.jsx("span",{role:"alert",children:r[t]}):null]});return e.jsxs("form",{className:"sprite-recipe-form",onSubmit:t=>{t.preventDefault(),a()},children:[c("name"),c("characterId"),c("description"),c("style"),c("baseAssetId"),e.jsxs("fieldset",{children:[e.jsx("legend",{children:n("sprite.cell.title")}),["width","height","safeMarginX","safeMarginY"].map(t=>e.jsxs("label",{children:[n(`sprite.cell.${t}`),e.jsx("input",{type:"number",min:"0",value:i.cell[t],onChange:p=>l({cell:{...i.cell,[t]:Number(p.target.value)}})})]},t))]}),e.jsxs("label",{children:[n("sprite.chroma.hex"),e.jsx("input",{type:"color",value:i.chroma.hex,onChange:t=>l({chroma:{...i.chroma,hex:t.target.value}})})]}),e.jsxs("fieldset",{children:[e.jsx("legend",{children:n("sprite.states.title")}),i.states.map((t,p)=>e.jsxs("div",{className:"sprite-state",children:[e.jsx("input",{"aria-label":n("sprite.states.key"),value:t.key,onChange:u=>l({states:i.states.map((o,h)=>h===p?{...o,key:u.target.value}:o)})}),e.jsx("input",{"aria-label":n("sprite.states.frames"),type:"number",min:"1",value:t.frames,onChange:u=>l({states:i.states.map((o,h)=>h===p?{...o,frames:Number(u.target.value)}:o)})}),e.jsx("button",{type:"button",onClick:()=>l({states:i.states.filter((u,o)=>o!==p)}),children:n("sprite.states.remove")})]},`${t.key}-${p}`)),e.jsx("button",{type:"button",onClick:()=>l({states:[...i.states,{key:"",frames:4,fps:8,loop:!0,action:""}]}),children:n("sprite.states.add")})]}),e.jsx("button",{className:"assetgen-generate",disabled:s||!i.name.trim()||!i.characterId.trim(),children:n(s?"sprite.recipe.saving":"sprite.recipe.save")})]})}function b({onCancel:i,onConfirm:s}){const{t:r}=d(),l=j(!0,i);return e.jsxs("div",{className:"sprite-anchor-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"sprite-confirm-title",ref:l,children:[e.jsx("h3",{id:"sprite-confirm-title",children:r("sprite.anchor.confirmTitle")}),e.jsx("p",{children:r("sprite.anchor.confirmBody")}),e.jsx("button",{"data-modal-initial-focus":!0,onClick:i,children:r("sprite.anchor.cancel")}),e.jsx("button",{onClick:s,children:r("sprite.anchor.confirm")})]})}function f({recipe:i,candidate:s,generating:r,onGenerate:l,onApprove:a}){const{t:n}=d(),[c,t]=x.useState(!1);return e.jsxs("section",{className:"sprite-anchor-gate","aria-labelledby":"sprite-anchor-title",children:[e.jsx("h2",{id:"sprite-anchor-title",children:n("sprite.anchor.title")}),s?e.jsxs(e.Fragment,{children:[e.jsx("img",{src:s.url,alt:""}),e.jsx("p",{children:n("sprite.anchor.candidate")}),e.jsx("button",{onClick:l,disabled:r,children:n("sprite.anchor.regenerate")}),e.jsx("button",{onClick:()=>t(!0),children:n("sprite.anchor.approve")})]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{children:n(i.anchorStatus==="approved"?"sprite.anchor.approved":"sprite.anchor.missing")}),e.jsx("button",{onClick:l,disabled:r,children:n(r?"sprite.anchor.generating":"sprite.anchor.generate")})]}),c?e.jsx(b,{onCancel:()=>t(!1),onConfirm:()=>{a(s.assetId),t(!1)}}):null]})}function S({recipe:i,selected:s,onSelectionChange:r,onGenerate:l,onCancel:a,onPreview:n}){const{t:c}=d();return e.jsxs("section",{className:"sprite-row-list","aria-live":"polite",children:[e.jsx("h2",{children:c("sprite.rows.title")}),e.jsxs("div",{className:"sprite-row-actions",children:[e.jsx("button",{onClick:()=>l(),children:c("sprite.rows.generateAll")}),e.jsx("button",{disabled:!s.length,onClick:()=>l(s),children:c("sprite.rows.generateSelected")})]}),i.rows.map(t=>e.jsxs("article",{children:[e.jsxs("label",{children:[e.jsx("input",{type:"checkbox",checked:s.includes(t.stateKey),onChange:()=>r(s.includes(t.stateKey)?s.filter(p=>p!==t.stateKey):[...s,t.stateKey])}),t.stateKey]}),e.jsx("span",{children:c(`sprite.rows.status.${t.status}`)}),t.progress!=null?e.jsx("progress",{value:t.progress,max:"100"}):null,t.imageUrl||t.previewUrl?e.jsxs("button",{onClick:()=>n(t),children:[e.jsx("img",{src:t.imageUrl||t.previewUrl,alt:""}),c("sprite.rows.preview")]}):null,t.status==="error"?e.jsx("button",{onClick:()=>l([t.stateKey]),children:c("sprite.rows.regenerate")}):null,t.requestId&&(t.status==="running"||t.status==="queued")?e.jsx("button",{onClick:()=>a(t.requestId),children:c("sprite.rows.cancel")}):null,t.error?e.jsx("p",{role:"alert",children:t.error}):null]},t.stateKey))]})}function I(){const{t:i}=d(),s=m();x.useEffect(()=>{s.loadSpriteRecipes()},[]);const r=s.activeSpriteRecipe,l=s.spriteRecipeDraft.name.trim()?{}:{name:i("sprite.error.INVALID_SPRITE_RECIPE")};return e.jsxs("section",{className:"sprite-recipe-workspace",children:[e.jsxs("aside",{children:[e.jsx(v,{}),e.jsxs("label",{children:[i("sprite.recipe.select"),e.jsxs("select",{value:s.activeSpriteRecipeId??"",onChange:a=>{s.selectSpriteRecipe(a.target.value||null)},children:[e.jsx("option",{value:"",children:i("sprite.recipe.new")}),s.spriteRecipes.map(a=>e.jsx("option",{value:a.id,children:a.name},a.id))]})]}),e.jsx(g,{draft:s.spriteRecipeDraft,disabled:s.spriteRecipeSaving,errors:l,onChange:s.updateSpriteRecipeDraft,onSubmit:()=>{s.saveSpriteRecipe()}})]}),e.jsxs("main",{children:[s.spriteRecipeError?e.jsxs("div",{role:"alert",children:[s.spriteRecipeError,e.jsx("button",{onClick:()=>{s.loadSpriteRecipes()},children:i("sprite.retry")})]}):null,s.spriteRecipeLoading?e.jsx("p",{role:"status",children:i("sprite.loading")}):r?r.anchorStatus!=="approved"?e.jsx(f,{recipe:r,candidate:r.candidate??null,generating:s.spriteRecipeGenerating,onGenerate:()=>{s.generateSpriteAnchor()},onApprove:a=>{s.approveSpriteAnchor(a)}}):e.jsx(S,{recipe:r,selected:s.spriteSelectedStates,onSelectionChange:a=>m.setState({spriteSelectedStates:a}),onGenerate:a=>{s.generateSpriteRows(a)},onCancel:a=>{s.cancelSpriteJob(a)},onPreview:()=>{}}):e.jsxs("div",{className:"sprite-empty",children:[e.jsx("h2",{children:i("sprite.empty.title")}),e.jsx("p",{children:i("sprite.empty.body")})]})]})]})}export{I as SpriteRecipeWorkspace};
@@ -1 +0,0 @@
1
- import{p as u}from"./index-DTEhasVd.js";function r(o,a,s={}){return u(o,a,{trap:s.modal!==!1})}export{r as u};