ima2-gen 3.13.1 → 3.14.0
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/.env.example +10 -0
- package/CHANGELOG.md +14 -0
- package/README.md +15 -2
- package/bin/commands/capabilities.js +5 -3
- package/bin/commands/config.js +15 -4
- package/bin/commands/defaults.js +7 -5
- package/bin/commands/doctor.js +88 -39
- package/bin/commands/gen.js +21 -4
- package/bin/commands/models.js +2 -2
- package/bin/commands/ping.js +1 -1
- package/bin/commands/prompt.js +5 -3
- package/bin/commands/service.js +32 -4
- package/bin/commands/tools.js +19 -3
- package/bin/commands/upscale.js +18 -4
- package/bin/commands/video.js +37 -50
- package/bin/ima2.js +28 -9
- package/bin/lib/characterResolve.js +2 -1
- package/bin/lib/client.js +155 -20
- package/bin/lib/config-store.js +40 -7
- package/bin/lib/doctor-bundle.js +6 -2
- package/bin/lib/doctor-checks.js +13 -29
- package/bin/lib/doctor-media.js +3 -3
- package/bin/lib/doctor-providers.js +48 -35
- package/bin/lib/doctor-report.js +78 -0
- package/bin/lib/doctor-runtime.js +173 -0
- package/bin/lib/mcpJob.js +19 -7
- package/bin/lib/output.js +3 -0
- package/bin/lib/platform.js +12 -9
- package/bin/lib/recover-output.js +9 -2
- package/bin/lib/sse.js +9 -1
- package/bin/lib/videoMcp.js +16 -8
- package/config.js +41 -5
- package/docs/API.md +154 -16
- package/docs/CLI.md +65 -1
- package/docs/DOCKER.md +19 -4
- package/docs/DOCKER.zh-CN.md +11 -4
- package/docs/DOCKER.zh-TW.md +11 -4
- package/docs/FAQ.md +13 -0
- package/docs/NPX_QUICKSTART.md +6 -0
- package/docs/README.ja.md +15 -2
- package/docs/README.ko.md +15 -2
- package/docs/README.zh-CN.md +15 -2
- package/docs/README.zh-TW.md +15 -2
- package/docs/migration/runtime-test-inventory.md +79 -8
- package/lib/agyArtifact.js +82 -0
- package/lib/agyArtifactRead.js +249 -0
- package/lib/agyImageAdapter.js +2 -329
- package/lib/agyProcess.js +122 -0
- package/lib/apiRequestBudget.js +48 -0
- package/lib/assetLifecycle.js +42 -9
- package/lib/canvasVersionStore.js +46 -14
- package/lib/capabilities.js +7 -1
- package/lib/configKeys.js +2 -0
- package/lib/errors/providerMap.js +26 -0
- package/lib/eventBus.js +10 -6
- package/lib/eventsPolicy.js +9 -0
- package/lib/geminiApiImageAdapter.js +1 -214
- package/lib/generatePipeline.js +39 -165
- package/lib/generatedMediaAccess.js +74 -0
- package/lib/generationErrors.js +3 -22
- package/lib/grokImageAdapter.js +2 -353
- package/lib/grokImageCore.js +1 -57
- package/lib/grokImageDownload.js +159 -0
- package/lib/grokImageDownloadPolicy.js +124 -0
- package/lib/grokImagePlanner.js +301 -0
- package/lib/grokMultimodeAdapter.js +1 -75
- package/lib/grokVideoDownload.js +137 -34
- package/lib/inflight.js +112 -112
- package/lib/jobs/terminalStore.js +45 -0
- package/lib/lanSessionStore.js +131 -0
- package/lib/localAccessPolicy.js +180 -0
- package/lib/localLanAccess.js +281 -0
- package/lib/logger.js +22 -13
- package/lib/mcp/downloadMediaResult.js +72 -78
- package/lib/multimodePipeline.js +39 -126
- package/lib/nodeGeneration.js +44 -101
- package/lib/nodeStore.js +25 -11
- package/lib/nodeValidation.js +5 -1
- package/lib/pinnedHttpGet.js +174 -0
- package/lib/promptImport/githubFolder.js +32 -18
- package/lib/promptImport/githubSource.js +14 -10
- package/lib/promptImport/parsePromptCandidates.js +32 -2
- package/lib/providers/adapters/agyOperations.js +179 -0
- package/lib/providers/adapters/comfy.js +1 -0
- package/lib/providers/adapters/geminiOperations.js +214 -0
- package/lib/providers/adapters/googleExecution.js +97 -0
- package/lib/providers/adapters/grokExecution.js +137 -0
- package/lib/providers/adapters/grokMultimodeOperations.js +83 -0
- package/lib/providers/adapters/grokOperations.js +63 -0
- package/lib/providers/adapters/openaiExecution.js +118 -0
- package/lib/providers/adapters/openaiOperations.js +201 -0
- package/lib/providers/adapters/openaiTypes.js +1 -0
- package/lib/providers/derive.js +4 -0
- package/lib/providers/deriveCore.js +2 -7
- package/lib/providers/execution/admission.js +25 -0
- package/lib/providers/execution/index.js +34 -0
- package/lib/providers/execution/legacy.js +17 -0
- package/lib/providers/execution/legacyClassic.js +66 -0
- package/lib/providers/execution/legacyEdit.js +30 -0
- package/lib/providers/execution/legacyMultimode.js +34 -0
- package/lib/providers/execution/legacyNode.js +41 -0
- package/lib/providers/execution/types.js +1 -0
- package/lib/providers/registry.js +19 -14
- package/lib/providers/surfaceSupport.js +22 -0
- package/lib/responsesImageAdapter.js +1 -389
- package/lib/responsesTransport.js +190 -0
- package/lib/spriteJobEvents.js +20 -2
- package/lib/ssePublish.js +5 -4
- package/lib/videoExtendI2vOperation.js +76 -0
- package/package.json +5 -2
- package/routes/edit.js +31 -123
- package/routes/events.js +140 -63
- package/routes/mcpMedia.js +10 -2
- package/routes/models.js +28 -25
- package/routes/videoExtended.js +9 -68
- package/server.js +24 -46
- package/ui/dist/.vite/manifest.json +90 -63
- package/ui/dist/assets/{AgentWorkspace-PbBytTeV.js → AgentWorkspace-CL3MLv3l.js} +2 -2
- package/ui/dist/assets/App-B9cEM6dJ.js +9 -0
- package/ui/dist/assets/AssetGenWorkspace-swWPvXrx.js +2 -0
- package/ui/dist/assets/AssetsWorkspace-CRVeYU2F.js +1 -0
- package/ui/dist/assets/{CardNewsWorkspace-BS3jKOja.js → CardNewsWorkspace-BAOxWLKf.js} +2 -2
- package/ui/dist/assets/GenerationRequestLogPanel-DZtYZm-D.js +1 -0
- package/ui/dist/assets/HomeWorkspace-BeZ1s0Jm.js +1 -0
- package/ui/dist/assets/KeyingPanel-ZyBSXioh.js +1 -0
- package/ui/dist/assets/NodeCanvas-BvvcCErf.js +7 -0
- package/ui/dist/assets/{PromptBuilderPanel-D97A4pwB.js → PromptBuilderPanel-DBycmShA.js} +2 -2
- package/ui/dist/assets/PromptImportDialog-ChvMv7ek.js +2 -0
- package/ui/dist/assets/PromptImportDiscoverySection-60py7whH.js +1 -0
- package/ui/dist/assets/PromptImportFolderSection-CCRh_-_7.js +1 -0
- package/ui/dist/assets/PromptLibraryPanel-BFWQO8OT.js +2 -0
- package/ui/dist/assets/SettingsWorkspace-B5Ghsgdj.js +1 -0
- package/ui/dist/assets/SpriteRecipeWorkspace-DRWdkmwU.js +1 -0
- package/ui/dist/assets/index-7ngEOVxt.js +5 -0
- package/ui/dist/assets/index-B5jy7ePg.css +1 -0
- package/ui/dist/assets/index-gxh_02DQ.js +22 -0
- package/ui/dist/assets/{pptxgen.es-D4pedbwM.js → pptxgen.es-OUNhQLEV.js} +1 -1
- package/ui/dist/assets/promptBuilderStore-BTUUzbBT.js +1 -0
- package/ui/dist/assets/useAgentDialogFocus-DSc2qY8p.js +1 -0
- package/ui/dist/index.html +3 -2
- package/ui/dist/assets/AssetGenWorkspace-B-TGlvVb.js +0 -2
- package/ui/dist/assets/AssetsWorkspace-LnGaW151.js +0 -1
- package/ui/dist/assets/GenerationRequestLogPanel-DuDWD_ic.js +0 -1
- package/ui/dist/assets/HomeWorkspace-DVP7UG6O.js +0 -1
- package/ui/dist/assets/KeyingPanel-5bRUFQaq.js +0 -1
- package/ui/dist/assets/NodeCanvas-BBEpERTb.js +0 -7
- package/ui/dist/assets/PromptImportDialog-C89MN5JY.js +0 -2
- package/ui/dist/assets/PromptImportDiscoverySection-BgRfDOs2.js +0 -1
- package/ui/dist/assets/PromptImportFolderSection-zTMyriT1.js +0 -1
- package/ui/dist/assets/PromptLibraryPanel-BD96qZu_.js +0 -2
- package/ui/dist/assets/SettingsWorkspace-BAOk3X_8.js +0 -1
- package/ui/dist/assets/SpriteRecipeWorkspace-ClIM5QRo.js +0 -1
- package/ui/dist/assets/index-0fpfY8vu.css +0 -1
- package/ui/dist/assets/index-BFciPGTn.js +0 -5
- package/ui/dist/assets/index-BbykeXR9.js +0 -30
- package/ui/dist/assets/promptBuilderStore-Do7M8g7J.js +0 -1
- package/ui/dist/assets/useAgentDialogFocus-B6-QgEVI.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`));
|
|
1
|
+
import{j as e,f as x}from"./index-gxh_02DQ.js";import{a as d,u,r as I}from"./App-B9cEM6dJ.js";import{u as a}from"./promptBuilderStore-BTUUzbBT.js";function y(t){return t?.filename??t?.url??t?.image??null}function C(t){const s=t.split(/[\\/]/).pop()??t;return s.length<=32?s:`${s.slice(0,14)}...${s.slice(-12)}`}function S(){const t=a(c=>c.scope),s=a(c=>c.clearImageScope),o=d(c=>c.currentImage),n=d(c=>c.history),{t:i}=u();if(t.kind==="draft")return e.jsx("span",{className:"prompt-builder__scope",children:i("promptBuilder.scopeDraft")});const p=y(o)===t.imageKey?o:n.find(c=>y(c)===t.imageKey)??null;if(!p)return e.jsx("span",{className:"prompt-builder__scope",children:i("promptBuilder.scopeDraft")});const h=i("promptBuilder.scopeImage",{name:C(t.imageKey)||i("promptBuilder.scopeImageFallback")});return e.jsxs("div",{className:"prompt-builder__scope-card",children:[e.jsx("img",{className:"prompt-builder__scope-thumb",src:p.thumb||p.url||p.image,alt:""}),e.jsx("span",{className:"prompt-builder__scope-name",children:h}),e.jsx("button",{type:"button",className:"prompt-builder__scope-remove",onClick:s,"aria-label":i("promptBuilder.removeScopeImage"),title:i("promptBuilder.removeScopeImage"),children:"×"})]})}function A(){const t=a(l=>l.model),s=a(l=>l.modelOptions),o=a(l=>l.backend),n=a(l=>l.updateConfig),{t:i}=u();return e.jsx(I,{className:"prompt-builder__model-picker",items:s.map(l=>({value:l,label:l==="auto"?i("promptBuilder.modelAuto"):l})),value:t,onChange:l=>{n(o,l)},ariaLabel:i("promptBuilder.model"),portal:!0})}const E={"Brief Intent Summary":"summary","Final Prompt - Korean":"ko","Final Prompt - English":"en",Notes:"notes"},T=/^(Brief Intent Summary|Final Prompt - Korean|Final Prompt - English|Notes):\s*(.*)$/gim;function K(t){const s=t.trim();return(s.match(/^```(?:[a-zA-Z0-9_-]+)?\s*([\s\S]*?)\s*```$/)?.[1]??s).trim()}function M(t){const s={},o=Array.from(t.matchAll(T));for(let n=0;n<o.length;n+=1){const i=o[n],l=i[1]??"",p=E[l];if(!p||typeof i.index!="number")continue;const h=i[2]?.trim()??"",c=i.index+i[0].length,m=o[n+1]?.index??t.length,f=K([h,t.slice(c,m)].filter(Boolean).join(`
|
|
2
|
+
`));f&&(s[p]=f)}return s}function $(t){const s=M(t),o=[];return s.ko&&o.push({language:"ko",heading:"Final Prompt - Korean",text:s.ko}),s.en&&o.push({language:"en",heading:"Final Prompt - English",text:s.en}),o.length===0?null:{summary:s.summary,prompts:o,notes:s.notes}}function F({messageId:t,prompt:s}){const o=d(m=>m.setPrompt),n=d(m=>m.insertPromptToComposer),i=d(m=>m.showToast),{t:l}=u(),p=s.language==="ko"?l("promptBuilder.finalKoreanPrompt"):l("promptBuilder.finalEnglishPrompt"),h=()=>{o(s.text),i(l("promptBuilder.applied"))},c=()=>{n({id:`builder_${t}_${s.language}`,name:p,text:s.text,placement:"after"}),i(l("promptBuilder.inserted"))};return e.jsxs("section",{className:"prompt-builder__structured-card","aria-label":p,children:[e.jsxs("div",{className:"prompt-builder__structured-card-header",children:[e.jsx("strong",{children:p}),e.jsx("span",{children:s.language.toUpperCase()})]}),e.jsx("p",{children:s.text}),e.jsxs("div",{className:"prompt-builder__structured-actions",children:[e.jsx("button",{type:"button",onClick:h,children:l("promptBuilder.applyToPrompt")}),e.jsx("button",{type:"button",onClick:c,children:l("promptBuilder.insertAsBlock")})]})]})}function D(t){return t.kind==="image"?"IMG":t.kind==="text"?"TXT":"FILE"}function R({message:t}){const{t:s}=u(),o=t.role==="assistant"?$(t.content):null;return e.jsxs("article",{className:`prompt-builder__message prompt-builder__message--${t.role}`,children:[e.jsx("div",{className:"prompt-builder__message-role",children:t.role==="user"?s("promptBuilder.user"):s("promptBuilder.assistant")}),o?e.jsxs("div",{className:"prompt-builder__structured-prompts",children:[o.summary?e.jsx("p",{className:"prompt-builder__structured-summary",children:o.summary}):null,o.prompts.map(n=>e.jsx(F,{messageId:t.id,prompt:n},`${t.id}-${n.language}`)),o.notes?e.jsx("p",{className:"prompt-builder__structured-notes",children:o.notes}):null]}):e.jsx("p",{children:t.content}),t.attachments&&t.attachments.length>0?e.jsx("div",{className:"prompt-builder__message-attachments",children:t.attachments.map(n=>e.jsxs("span",{className:"prompt-builder__message-attachment",children:[n.kind==="image"&&n.dataUrl?e.jsx("img",{src:n.dataUrl,alt:""}):e.jsx("span",{children:D(n)}),e.jsx("em",{children:n.name})]},n.id))}):null]})}function L(){const t=a(l=>l.messages),s=a(l=>l.loading),o=a(l=>l.error),n=x.useRef(null),{t:i}=u();return x.useEffect(()=>{const l=n.current;l&&(l.scrollTop=l.scrollHeight)},[t.length,s]),e.jsxs("div",{ref:n,className:"prompt-builder__messages",children:[t.length===0&&e.jsx("div",{className:"prompt-builder__empty",children:i("promptBuilder.empty")}),t.map(l=>e.jsx(R,{message:l},l.id)),s&&e.jsxs("div",{className:"prompt-builder__thinking",role:"status","aria-live":"polite",children:[e.jsxs("span",{className:"prompt-builder__thinking-dots","aria-hidden":"true",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}),e.jsx("span",{children:i("promptBuilder.thinking")})]}),o?e.jsx("div",{className:"prompt-builder__empty prompt-builder__error",role:"alert",children:o}):null]})}function U(t){return t.kind==="image"?"IMG":t.kind==="text"?"TXT":"FILE"}function z(){const t=a(n=>n.attachments),s=a(n=>n.removeAttachment),{t:o}=u();return t.length===0?null:e.jsx("div",{className:"prompt-builder__attachments",children:t.map(n=>e.jsxs("span",{className:"prompt-builder__attachment",children:[n.kind==="image"&&n.dataUrl?e.jsx("img",{src:n.dataUrl,alt:""}):e.jsx("span",{children:U(n)}),e.jsx("em",{children:n.name}),e.jsx("button",{type:"button",onClick:()=>s(n.id),"aria-label":o("promptBuilder.removeAttachment",{name:n.name}),title:o("promptBuilder.removeAttachment",{name:n.name}),children:"×"})]},n.id))})}function O(){const t=a(r=>r.draft),s=a(r=>r.setDraft),o=a(r=>r.loading),n=a(r=>r.configLoaded),i=a(r=>r.addAttachments),l=a(r=>r.sendMessage),p=a(r=>r.messages),h=a(r=>r.clearMessages),c=a(r=>r.attachments),m=d(r=>r.prompt),f=d(r=>r.insertedPrompts),N=d(r=>r.quality),k=d(r=>r.getResolvedSize),v=d(r=>r.currentImage),b=x.useRef(null),{t:g}=u(),_=()=>{!t.trim()&&c.length===0||o||!n||l({currentPrompt:m,insertedPrompts:f.map(r=>({name:r.name,text:r.text})),settings:{quality:N,size:k()},currentResultPrompt:v?.prompt??null})},j=r=>{r.length!==0&&i(r)},P=r=>{const B=Array.from(r.clipboardData?.files??[]);B.length!==0&&(r.preventDefault(),j(B))};return e.jsxs("div",{className:"prompt-builder__composer",children:[e.jsx(z,{}),e.jsx("textarea",{value:t,placeholder:g("promptBuilder.placeholder"),onChange:r=>s(r.target.value),onPaste:P,onKeyDown:r=>{r.key==="Enter"&&(r.ctrlKey||r.metaKey)&&(r.preventDefault(),_())}}),e.jsx("input",{ref:b,type:"file",multiple:!0,hidden:!0,onChange:r=>{j(Array.from(r.target.files??[])),r.target.value=""}}),e.jsxs("div",{className:"prompt-builder__composer-actions",children:[e.jsx("button",{type:"button",className:"prompt-builder__attach",onClick:()=>b.current?.click(),disabled:o,"aria-label":g("promptBuilder.attach"),title:g("promptBuilder.attach"),children:"+"}),e.jsx("button",{type:"button",className:"prompt-builder__clear",onClick:h,disabled:p.length===0||o,children:g("promptBuilder.clear")}),e.jsx("button",{type:"button",className:"prompt-builder__send",onClick:_,disabled:!t.trim()&&c.length===0||o||!n,children:g(o?"promptBuilder.sending":"promptBuilder.send")})]})]})}function H({variant:t="panel"}){const{t:s}=u(),o=a(i=>i.lastBackend),n=a(i=>i.loadConfig);return x.useEffect(()=>{n()},[n]),e.jsxs("section",{className:`prompt-builder prompt-builder--${t}`,"aria-label":s("promptBuilder.title"),children:[e.jsxs("div",{className:"prompt-builder__header",children:[e.jsxs("div",{children:[e.jsx("span",{className:"section-title",children:s("promptBuilder.title")}),e.jsx(S,{}),o?e.jsx("span",{className:"prompt-builder__scope prompt-builder__backend-badge",children:s("promptBuilder.viaBackend",{backend:s(`promptBuilder.backends.${o==="grok-api"?"grokApi":o}`)})}):null]}),e.jsx("div",{className:"prompt-builder__header-actions",children:e.jsx(A,{})})]}),e.jsx(L,{}),e.jsx(O,{})]})}export{H as PromptBuilderPanel};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PromptImportDiscoverySection-60py7whH.js","assets/index-gxh_02DQ.js","assets/index-B5jy7ePg.css","assets/App-B9cEM6dJ.js","assets/PromptImportFolderSection-CCRh_-_7.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{j as e,f as o,_ as J}from"./index-gxh_02DQ.js";import{u as O,a as ne,k as ce,aN as M,aO as U,aP as pe,aQ as de,aR as me}from"./App-B9cEM6dJ.js";function ue(i){const t=i.source;if(!t)return"";if(t.owner&&t.repo){const h=t.ref?`@${t.ref}`:"",s=t.path?`:${t.path}`:"";return`${t.owner}/${t.repo}${h}${s}`}return t.filename??t.sourceId??t.kind??""}function he(i,t){const h=i.tags.find(s=>s.toLowerCase().startsWith(t));return h?h.slice(t.length):null}function be(i){return i.tags.includes("attribution-required")||i.warnings?.some(t=>t.toLowerCase().includes("attribution"))===!0}function ge({candidate:i,selected:t,disabled:h=!1,onToggleSelected:s,onImportOne:g}){const{t:c}=O();if(!i)return e.jsx("aside",{className:"prompt-import-dialog__candidate-preview","aria-label":c("promptLibrary.previewPrompt"),children:e.jsx("div",{className:"prompt-import-dialog__empty",children:c("promptLibrary.importPreviewEmpty")})});const x=ue(i),b=he(i,"license:"),v=be(i);return e.jsxs("aside",{className:"prompt-import-dialog__candidate-preview","aria-label":c("promptLibrary.previewPrompt"),children:[e.jsxs("div",{className:"prompt-import-dialog__preview-header",children:[e.jsxs("div",{children:[e.jsx("span",{children:c("promptLibrary.previewPrompt")}),e.jsx("h4",{children:i.name})]}),e.jsx("button",{type:"button",onClick:()=>g(i),disabled:h,children:c("promptLibrary.importThisPrompt")})]}),e.jsxs("label",{className:"prompt-import-dialog__preview-select",children:[e.jsx("input",{type:"checkbox",checked:t,disabled:h,onChange:l=>s(i.id,l.target.checked)}),e.jsx("span",{children:c(t?"promptLibrary.selectedPrompt":"promptLibrary.selectPrompt")})]}),e.jsxs("div",{className:"prompt-import-dialog__preview-field",children:[e.jsx("strong",{children:c("promptLibrary.promptText")}),e.jsx("p",{children:i.text})]}),i.tags.length>0?e.jsxs("div",{className:"prompt-import-dialog__preview-field",children:[e.jsx("strong",{children:c("promptLibrary.tags")}),e.jsx("div",{className:"prompt-import-dialog__preview-chips",children:i.tags.map(l=>e.jsx("em",{children:l},l))})]}):null,i.warnings?.length?e.jsxs("div",{className:"prompt-import-dialog__preview-field",children:[e.jsx("strong",{children:c("promptLibrary.compatibilityWarnings")}),e.jsx("div",{className:"prompt-import-dialog__preview-chips",children:i.warnings.map(l=>e.jsx("b",{children:l},l))})]}):null,x||b||v?e.jsxs("div",{className:"prompt-import-dialog__preview-field",children:[e.jsx("strong",{children:c("promptLibrary.sourceDetails")}),x?e.jsx("small",{children:x}):null,b?e.jsxs("small",{children:[c("promptLibrary.license"),": ",b]}):null,v?e.jsx("small",{children:c("promptLibrary.attributionRequired")}):null]}):null]})}function xe(i){const t=i.source;if(!t)return"";if(t.owner&&t.repo){const h=t.path?` · ${t.path}`:"";return`github · ${t.owner}/${t.repo}${h}`}return t.filename?t.filename:t.sourceId?t.sourceId:t.kind??""}function ye(i){const t=i.replace(/\s+/g," ").trim();return t.length>220?`${t.slice(0,220)}...`:t}function fe({candidates:i,selectedIds:t,activeCandidateId:h,busy:s=!1,onSelectCandidate:g,onToggleSelected:c,onSelectAll:x,onClearSelection:b,onImportOne:v}){const{t:l}=O();if(i.length===0)return e.jsx("section",{className:"prompt-import-dialog__results","aria-label":l("promptLibrary.searchResults"),children:e.jsx("div",{className:"prompt-import-dialog__empty",children:l("promptLibrary.importPreviewEmpty")})});const R=i.every(n=>t.has(n.id));return e.jsxs("section",{className:"prompt-import-dialog__results","aria-label":l("promptLibrary.searchResults"),children:[e.jsxs("header",{className:"prompt-import-dialog__results-header",children:[e.jsx("strong",{children:l("promptLibrary.searchResultsHeader",{count:i.length})}),e.jsxs("div",{className:"prompt-import-dialog__results-header-actions",children:[e.jsx("button",{type:"button",onClick:x,disabled:R,children:l("promptLibrary.selectAllCandidates")}),e.jsx("button",{type:"button",onClick:b,disabled:t.size===0,children:l("promptLibrary.clearCandidateSelection")})]})]}),i.map(n=>{const y=t.has(n.id),j=h===n.id,L=xe(n);return e.jsxs("article",{className:`prompt-import-dialog__result-card${j?" active":""}`,children:[e.jsxs("button",{type:"button",className:"prompt-import-dialog__result-main",onClick:()=>g(n),children:[e.jsx("strong",{children:n.name}),e.jsx("span",{children:ye(n.text)}),L?e.jsx("small",{children:L}):null]}),e.jsxs("div",{className:"prompt-import-dialog__result-meta",children:[n.warnings?.slice(0,2).map(m=>e.jsx("b",{className:"prompt-import-dialog__hint-chip",children:m},m)),n.tags.slice(0,4).map(m=>e.jsx("em",{children:m},m))]}),e.jsxs("div",{className:"prompt-import-dialog__result-actions",children:[e.jsxs("label",{children:[e.jsx("input",{type:"checkbox",checked:y,onChange:m=>c(n.id,m.target.checked)}),e.jsx("span",{children:l(y?"promptLibrary.selectedPrompt":"promptLibrary.selectPrompt")})]}),e.jsx("button",{type:"button",onClick:()=>g(n),children:l("promptLibrary.previewPrompt")}),e.jsx("button",{type:"button",onClick:()=>v(n),disabled:s,children:l("promptLibrary.importThisPrompt")})]})]},n.id)})]})}const ve=o.lazy(()=>J(()=>import("./PromptImportDiscoverySection-60py7whH.js"),__vite__mapDeps([0,1,2,3])).then(i=>({default:i.PromptImportDiscoverySection}))),je=o.lazy(()=>J(()=>import("./PromptImportFolderSection-CCRh_-_7.js"),__vite__mapDeps([4,1,2,3])).then(i=>({default:i.PromptImportFolderSection}))),_e=/\.(txt|md|markdown)$/i;function Le({open:i,onClose:t,onImported:h}){const{t:s}=O(),g=ne(r=>r.showToast),c=o.useRef(null),x=ce(i,t),[b,v]=o.useState(""),[l,R]=o.useState([]),[n,y]=o.useState(new Set),[j,L]=o.useState(null),[m,_]=o.useState(!1),[V,u]=o.useState(null),[K,C]=o.useState(!1),[X,T]=o.useState([]),[A,Y]=o.useState(""),[k,$]=o.useState(new Set),[z,N]=o.useState(!1),[W,P]=o.useState([]),[w,q]=o.useState("curated"),[B,Z]=o.useState(!1),G=l.length>0,I=!G||B,ee=o.useCallback(async()=>{const r=await M();T(r.sources),$(new Set)},[]);o.useEffect(()=>{if(!i)return;let r=!1;return M().then(a=>{r||(T(a.sources),$(new Set))}).catch(()=>{r||T([])}),()=>{r=!0}},[i]);const f=o.useCallback(r=>{R(a=>{const p=new Set(a.map(S=>S.id)),d=[...a];for(const S of r)p.has(S.id)||d.push(S);return L(S=>S??d[0]?.id??null),d})},[]),E=o.useCallback(async r=>{const a=r.filter(p=>_e.test(p.name));if(a.length===0){u(s("promptLibrary.importNoValidFiles"));return}_(!0),u(null);try{const p=[];for(const d of a)p.push(await U({source:{kind:"local",filename:d.name,text:await d.text()}}));f(p.flatMap(d=>d.candidates))}catch(p){u(p instanceof Error?p.message:s("promptLibrary.importFailed"))}finally{_(!1)}},[f,s]),re=o.useCallback(async()=>{if(b.trim()){_(!0),u(null);try{const r=await U({source:{kind:"github",input:b.trim()}});f(r.candidates)}catch(r){u(r instanceof Error?r.message:s("promptLibrary.importFailed"))}finally{_(!1)}}},[f,b,s]),te=o.useCallback(async()=>{N(!0),u(null),P([]);try{const r=await pe({q:A.trim(),sourceIds:[...k]});f(r.results),P(r.warnings),r.results.length===0&&u(s("promptLibrary.noCuratedResults"))}catch(r){u(r instanceof Error?r.message:s("promptLibrary.importFailed"))}finally{N(!1)}},[f,A,k,s]),se=o.useCallback(async r=>{N(!0),u(null),P([]);try{const a=await de({sourceId:r});P(a.warnings),g(s("promptLibrary.curatedRefreshed",{count:a.candidateCount}))}catch(a){u(a instanceof Error?a.message:s("promptLibrary.importFailed"))}finally{N(!1)}},[g,s]),H=o.useCallback((r,a)=>{y(p=>{const d=new Set(p);return a?d.add(r):d.delete(r),d})},[]),ie=o.useCallback(()=>{y(new Set(l.map(r=>r.id)))},[l]),oe=o.useCallback(()=>{y(new Set)},[]),D=o.useCallback(async r=>{if(r.length===0){u(s("promptLibrary.importSelectAtLeastOne"));return}_(!0),u(null);try{const a=await me({candidates:r});await h(),g(s("promptLibrary.imported",{count:a.promptsImported})),t()}catch(a){u(a instanceof Error?a.message:s("promptLibrary.importFailed"))}finally{_(!1)}},[t,h,g,s]),ae=o.useCallback(async()=>{const r=l.filter(a=>n.has(a.id));await D(r)},[l,D,n]),Q=o.useCallback(r=>{y(new Set([r.id])),D([r])},[D]),le=o.useCallback(r=>{const a=Array.from(r.target.files??[]);a.length>0&&E(a),r.target.value=""},[E]),F=o.useCallback(r=>{r.preventDefault(),r.stopPropagation(),C(!1);const a=Array.from(r.dataTransfer?.files??[]);a.length>0&&E(a)},[E]);return o.useEffect(()=>{if(!i)return;const r=p=>{p.preventDefault(),C(!0)},a=p=>{p.relatedTarget===null&&C(!1)};return window.addEventListener("dragover",r),window.addEventListener("dragleave",a),window.addEventListener("drop",F),()=>{window.removeEventListener("dragover",r),window.removeEventListener("dragleave",a),window.removeEventListener("drop",F)}},[F,i]),i?e.jsxs("div",{className:"prompt-import-dialog",role:"presentation",children:[e.jsx("div",{className:"prompt-import-dialog__backdrop",onClick:t}),e.jsxs("div",{ref:x,className:"prompt-import-dialog__panel",role:"dialog","aria-modal":"true","aria-labelledby":"prompt-import-title",tabIndex:-1,children:[e.jsxs("div",{className:"prompt-import-dialog__header",children:[e.jsx("h3",{id:"prompt-import-title",children:s("promptLibrary.importTitle")}),e.jsx("button",{type:"button",onClick:t,"aria-label":s("common.close"),children:"×"})]}),I&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`prompt-import-dialog__dropzone${K?" active":""}`,onDragOver:r=>{r.preventDefault(),C(!0)},onDragLeave:()=>C(!1),onDrop:F,children:[e.jsx("strong",{children:s("promptLibrary.importDropTitle")}),e.jsx("span",{children:s("promptLibrary.importDropHint")}),e.jsx("button",{type:"button",onClick:()=>c.current?.click(),children:s("promptLibrary.importChooseFiles")}),e.jsx("input",{ref:c,className:"prompt-library-panel__file-input",type:"file",accept:".txt,.md,.markdown,text/plain,text/markdown",multiple:!0,onChange:le})]}),e.jsxs("div",{className:"prompt-import-dialog__github",children:[e.jsx("label",{htmlFor:"prompt-import-github",children:s("promptLibrary.importGithubLabel")}),e.jsxs("div",{children:[e.jsx("input",{id:"prompt-import-github",type:"text",value:b,onChange:r=>v(r.target.value),placeholder:"owner/repo:path/to/prompts.md"}),e.jsx("button",{type:"button",onClick:()=>{re()},disabled:m||!b.trim(),children:s("promptLibrary.importPreview")})]})]}),e.jsx(o.Suspense,{fallback:null,children:e.jsx(je,{input:b,disabled:m,onCandidates:f,onError:u})}),e.jsxs("div",{className:"prompt-import-dialog__source-tabs",role:"tablist","aria-label":s("promptLibrary.curatedSources"),children:[e.jsx("button",{type:"button",className:w==="curated"?"active":"",onClick:()=>q("curated"),"aria-pressed":w==="curated",children:s("promptLibrary.curatedSources")}),e.jsx("button",{type:"button",className:w==="discovery"?"active":"",onClick:()=>q("discovery"),"aria-pressed":w==="discovery",children:s("promptLibrary.discovery")})]})]}),(I?w==="curated":!0)&&e.jsxs("div",{className:"prompt-import-dialog__curated",children:[I&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"prompt-import-dialog__section-title",children:[e.jsx("strong",{children:s("promptLibrary.curatedSources")}),e.jsx("span",{children:s("promptLibrary.curatedSourcesHint")})]}),e.jsx("div",{className:"prompt-import-dialog__source-list",children:X.filter(r=>r.trustTier!=="manual-review").map(r=>e.jsxs("label",{className:"prompt-import-dialog__source",children:[e.jsx("input",{type:"checkbox",checked:k.has(r.id),onChange:a=>{$(p=>{const d=new Set(p);return a.target.checked?d.add(r.id):d.delete(r.id),d})}}),e.jsxs("span",{children:[e.jsx("strong",{children:r.displayName}),e.jsxs("small",{children:[r.licenseSpdx," · ",r.trustTier]})]}),e.jsx("button",{type:"button",onClick:()=>{se(r.id)},disabled:z,children:s("promptLibrary.refreshSource")})]},r.id))})]}),e.jsxs("div",{className:"prompt-import-dialog__search-results",children:[e.jsx("input",{type:"text",value:A,onChange:r=>Y(r.target.value),placeholder:s("promptLibrary.curatedSearchPlaceholder"),"aria-label":s("promptLibrary.curatedSearch")}),e.jsx("button",{type:"button",onClick:()=>{te()},disabled:z||k.size===0,children:s(z?"common.loading":"promptLibrary.curatedSearch")})]}),W.length>0?e.jsx("div",{className:"prompt-import-dialog__warning",children:W.slice(0,3).join(" · ")}):null]}),I&&w==="discovery"&&e.jsx(o.Suspense,{fallback:e.jsx("div",{className:"prompt-import-dialog__empty",children:s("common.loading")}),children:e.jsx(ve,{disabled:m,onError:u,onSourcesChanged:ee})}),G&&!B&&e.jsx("button",{type:"button",className:"prompt-import-dialog__add-source-toggle",onClick:()=>Z(!0),children:s("promptLibrary.addAnotherSource")}),V?e.jsx("div",{className:"prompt-import-dialog__error",role:"alert",children:V}):null,e.jsxs("div",{className:"prompt-import-dialog__workspace","aria-live":"polite",children:[e.jsx(fe,{candidates:l,selectedIds:n,activeCandidateId:j,busy:m,onSelectCandidate:r=>L(r.id),onToggleSelected:H,onSelectAll:ie,onClearSelection:oe,onImportOne:Q}),e.jsx(ge,{candidate:l.find(r=>r.id===j)??null,selected:j?n.has(j):!1,disabled:m,onToggleSelected:H,onImportOne:Q})]}),e.jsxs("div",{className:"prompt-import-dialog__footer",children:[e.jsx("button",{type:"button",onClick:t,children:s("common.cancel")}),e.jsx("button",{type:"button",onClick:()=>{ae()},disabled:m||n.size===0,children:m?s("common.loading"):s("promptLibrary.importSelected",{count:n.size})})]})]})]}):null}export{Le as PromptImportDialog};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as t,j as r}from"./index-gxh_02DQ.js";import{u as L,aS as S,aT as C,aU as P}from"./App-B9cEM6dJ.js";const R=["gpt-image-2 prompt","nano banana prompts","typography image prompt"];function I({disabled:d=!1,onError:a,onSourcesChanged:y}){const{t:s}=L(),[l,N]=t.useState("gpt-image-2 prompt"),[v,p]=t.useState([]),[n,c]=t.useState(!1),[g,m]=t.useState([]),[h,_]=t.useState({});t.useEffect(()=>{let e=!1;return S().then(i=>{e||p(i.candidates)}).catch(()=>{e||p([])}),()=>{e=!0}},[]);const w=t.useCallback(async()=>{c(!0),m([]),a(null);try{const e=await C({q:l.trim(),seeds:R});p(e.candidates),m([...e.warnings,...e.rateLimit?.remaining===0?["github-rate-limit-exhausted"]:[]]),e.candidates.length===0&&a(s("promptLibrary.discoveryNoResults"))}catch(e){a(e instanceof Error?e.message:s("promptLibrary.importFailed"))}finally{c(!1)}},[a,l,s]),x=t.useCallback(async(e,i)=>{c(!0),m([]),a(null);try{const j=(h[e.fullName]||"").split(/\r?\n|,/).map(u=>u.trim()).filter(Boolean),b=await P({repo:e.fullName,status:i,allowedPaths:i==="approved"?j:[],defaultSearch:i==="approved"&&j.length>0});m(b.warnings),p(u=>u.map(f=>f.fullName===e.fullName?b.candidate:f)),await y()}catch(o){a(o instanceof Error?o.message:s("promptLibrary.importFailed"))}finally{c(!1)}},[h,a,y,s]);return r.jsxs("div",{className:"prompt-import-dialog__discovery",children:[r.jsxs("div",{className:"prompt-import-dialog__section-title",children:[r.jsx("strong",{children:s("promptLibrary.discovery")}),r.jsx("span",{children:s("promptLibrary.discoveryReviewQueue")})]}),r.jsxs("div",{className:"prompt-import-dialog__discovery-actions",children:[r.jsx("input",{type:"text",value:l,onChange:e=>N(e.target.value),placeholder:s("promptLibrary.discoverySearchPlaceholder"),"aria-label":s("promptLibrary.discoverySearch")}),r.jsx("button",{type:"button",onClick:()=>{w()},disabled:d||n||!l.trim(),children:s(n?"common.loading":"promptLibrary.discoverySearch")})]}),g.length>0?r.jsx("div",{className:"prompt-import-dialog__discovery-warning",children:g.slice(0,3).join(" · ")}):null,v.length===0?r.jsx("div",{className:"prompt-import-dialog__empty",children:s("promptLibrary.discoveryNoResults")}):r.jsx("div",{className:"prompt-import-dialog__discovery-list",children:v.map(e=>r.jsxs("article",{className:"prompt-import-dialog__discovery-candidate",children:[r.jsxs("div",{children:[r.jsx("strong",{children:e.fullName}),r.jsx("small",{children:e.description||e.htmlUrl})]}),r.jsxs("div",{className:"prompt-import-dialog__score",children:[r.jsxs("span",{children:[s("promptLibrary.discoveryScore"),": ",e.score]}),r.jsx("span",{children:e.licenseSpdx}),r.jsx("span",{children:e.status})]}),e.scoreReasons.length>0?r.jsx("em",{children:e.scoreReasons.slice(0,3).join(" · ")}):null,e.warnings.length>0?r.jsx("b",{children:e.warnings.slice(0,2).join(" · ")}):null,r.jsx("textarea",{value:h[e.fullName]||"",onChange:i=>_(o=>({...o,[e.fullName]:i.target.value})),placeholder:"README.md, prompts/example.md","aria-label":s("promptLibrary.discoveryRequiresPaths")}),r.jsxs("div",{className:"prompt-import-dialog__review-actions",children:[r.jsx("button",{type:"button",onClick:()=>{x(e,"approved")},disabled:d||n,children:s("promptLibrary.discoveryApprove")}),r.jsx("button",{type:"button",onClick:()=>{x(e,"rejected")},disabled:d||n,children:s("promptLibrary.discoveryReject")})]})]},e.fullName))})]})}export{I as PromptImportDiscoverySection};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as a,j as t}from"./index-gxh_02DQ.js";import{u as w,aV as S,aW as _}from"./App-B9cEM6dJ.js";function k({input:i,disabled:h=!1,onCandidates:u,onError:l}){const{t:s}=w(),[f,g]=a.useState([]),[o,p]=a.useState(new Set),[d,n]=a.useState(!1),[x,c]=a.useState([]),y=a.useCallback(async()=>{if(i.trim()){n(!0),c([]),l(null);try{const e=await S({source:{kind:"github-folder",input:i.trim()}});g(e.files),p(new Set(e.files.slice(0,5).map(r=>r.path))),c(e.warnings),e.files.length===0&&l(s("promptLibrary.folderFilesEmpty"))}catch(e){g([]),p(new Set),l(e instanceof Error?e.message:s("promptLibrary.folderUnsupported"))}finally{n(!1)}}},[i,l,s]),b=a.useCallback(async()=>{const e=[...o];if(e.length===0){l(s("promptLibrary.folderNoSelection"));return}n(!0),c([]),l(null);try{const r=await _({source:{kind:"github-folder",input:i.trim()},paths:e});c(r.warnings),u(r.candidates)}catch(r){l(r instanceof Error?r.message:s("promptLibrary.importFailed"))}finally{n(!1)}},[i,u,l,o,s]);return t.jsxs("div",{className:"prompt-import-dialog__folder",children:[t.jsxs("div",{className:"prompt-import-dialog__section-title",children:[t.jsx("strong",{children:s("promptLibrary.folderFiles")}),t.jsx("span",{children:s("promptLibrary.folderBrowseHint")})]}),t.jsxs("div",{className:"prompt-import-dialog__folder-actions",children:[t.jsx("button",{type:"button",onClick:()=>{y()},disabled:h||d||!i.trim(),children:s(d?"common.loading":"promptLibrary.folderBrowse")}),t.jsx("button",{type:"button",onClick:()=>{b()},disabled:h||d||o.size===0,children:s("promptLibrary.folderPreviewSelected")}),t.jsx("span",{children:s("promptLibrary.folderSelectedCount",{count:o.size})})]}),f.length>0?t.jsx("div",{className:"prompt-import-dialog__folder-list",children:f.map(e=>t.jsxs("label",{className:"prompt-import-dialog__folder-file",children:[t.jsx("input",{type:"checkbox",checked:o.has(e.path),onChange:r=>{p(j=>{const m=new Set(j);return r.target.checked?m.add(e.path):m.delete(e.path),m})}}),t.jsxs("span",{children:[t.jsx("strong",{children:e.name}),t.jsx("small",{children:e.path})]}),t.jsxs("em",{children:[Math.ceil(e.sizeBytes/1024)," KB"]})]},e.path))}):null,x.length>0?t.jsx("div",{className:"prompt-import-dialog__folder-warning",children:x.slice(0,3).join(" · ")}):null]})}export{k as PromptImportFolderSection};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PromptImportDialog-ChvMv7ek.js","assets/index-gxh_02DQ.js","assets/index-B5jy7ePg.css","assets/App-B9cEM6dJ.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{j as e,f as i,_ as R}from"./index-gxh_02DQ.js";import{u as v,k as $,at as j,a as s,S as A}from"./App-B9cEM6dJ.js";function z({prompt:a,onClose:d,onLoad:c,onInsert:t,onDelete:b,onToggleFavorite:l}){const{t:o}=v(),n=$(!0,d),m=async()=>{try{await navigator.clipboard.writeText(a.text)}catch{}};return e.jsxs("div",{className:"prompt-detail-modal",role:"presentation",children:[e.jsx("div",{className:"prompt-detail-modal__backdrop",onClick:d}),e.jsxs("div",{ref:n,className:"prompt-detail-modal__content",role:"dialog","aria-modal":"true","aria-labelledby":"prompt-detail-title",tabIndex:-1,children:[e.jsxs("div",{className:"prompt-detail-modal__header",children:[e.jsx("h2",{id:"prompt-detail-title",className:"prompt-detail-modal__title",children:a.name||o("promptLibrary.untitled")}),e.jsx("button",{className:"prompt-detail-modal__close",onClick:d,"aria-label":o("common.close"),children:"×"})]}),e.jsxs("div",{className:"prompt-detail-modal__body",children:[e.jsx("div",{className:"prompt-detail-modal__label",children:o("promptLibrary.content")}),e.jsx("div",{className:"prompt-detail-modal__prompt",children:a.text}),a.tags.length>0&&e.jsxs("div",{className:"prompt-detail-modal__tags",children:[e.jsx("div",{className:"prompt-detail-modal__label",children:o("promptLibrary.tags")}),e.jsx("div",{className:"prompt-detail-modal__tag-list",children:a.tags.map(p=>e.jsxs("span",{className:"prompt-detail-modal__tag",children:["#",p]},p))})]})]}),e.jsxs("div",{className:"prompt-detail-modal__footer",children:[e.jsx("button",{className:"prompt-detail-modal__load",onClick:c,children:o("promptLibrary.load")}),e.jsx("button",{className:"prompt-detail-modal__copy",onClick:m,children:o("promptLibrary.copy")}),e.jsxs("button",{className:"prompt-detail-modal__insert",onClick:t,children:["+ ",o("promptLibrary.insert")]}),e.jsxs("button",{className:`prompt-detail-modal__favorite${a.isFavorite?" prompt-detail-modal__favorite--on":""}`,onClick:l,"aria-pressed":a.isFavorite,children:[e.jsx(j,{}),a.isFavorite?o("promptLibrary.unfavorite"):o("promptLibrary.favorite")]}),e.jsx("button",{className:"prompt-detail-modal__delete",onClick:b,children:o("common.delete")})]})]})]})}function M({prompt:a,onLoad:d,onInsert:c,onDelete:t,onToggleFavorite:b}){const{t:l}=v(),[o,n]=i.useState(!1),m=a.text.length>45?a.text.slice(0,45)+"...":a.text;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"prompt-library-row",onClick:()=>n(!0),children:[e.jsxs("div",{className:"prompt-library-row__main",children:[e.jsx("div",{className:"prompt-library-row__title",children:a.name||l("promptLibrary.untitled")}),e.jsx("div",{className:"prompt-library-row__preview",children:m})]}),e.jsxs("div",{className:"prompt-library-row__actions",children:[e.jsx("button",{className:"prompt-library-row__insert",onClick:p=>{p.stopPropagation(),c()},title:l("promptLibrary.insert"),"aria-label":l("promptLibrary.insert"),children:"+"}),e.jsx("button",{className:`prompt-library-row__star${a.isFavorite?" prompt-library-row__star--on":""}`,onClick:p=>{p.stopPropagation(),b()},"aria-label":a.isFavorite?l("promptLibrary.unfavorite"):l("promptLibrary.favorite"),"aria-pressed":a.isFavorite,children:e.jsx(j,{})}),e.jsx("span",{className:"prompt-library-row__chevron",children:"›"})]})]}),o&&e.jsx(z,{prompt:a,onClose:()=>n(!1),onLoad:()=>{d(),n(!1)},onInsert:()=>{c(),n(!1)},onDelete:t,onToggleFavorite:b})]})}const V=i.lazy(()=>R(()=>import("./PromptImportDialog-ChvMv7ek.js"),__vite__mapDeps([0,1,2,3])).then(a=>({default:a.PromptImportDialog})));function G({variant:a="overlay",forceOpen:d=!1,onRequestClose:c}){const{t}=v(),b=s(r=>r.promptLibraryOpen),l=s(r=>r.togglePromptLibrary),o=s(r=>r.promptLibrary),n=s(r=>r.promptLibraryLoading),m=s(r=>r.loadPromptLibrary),p=s(r=>r.deletePromptFromLibrary),w=s(r=>r.togglePromptFavorite),k=s(r=>r.setPrompt),L=s(r=>r.insertPromptToComposer),F=s(r=>r.clearInsertedPrompts),N=s(r=>r.showToast),[y,I]=i.useState(""),[x,S]=i.useState(!1),[O,f]=i.useState(!1),[g,C]=i.useState(!1),h=d||b,_=c??l;i.useEffect(()=>{h&&m()},[h,m]);const D=i.useCallback(r=>{L({id:r.id,name:r.name||t("promptLibrary.untitled"),text:r.text}),N(t("promptLibrary.inserted")),_()},[_,L,N,t]);if(!h)return null;const P=o.prompts.filter(r=>{if(x&&!r.isFavorite)return!1;if(!y.trim())return!0;const u=y.toLowerCase();return r.name.toLowerCase().includes(u)||r.text.toLowerCase().includes(u)||r.tags.some(E=>E.toLowerCase().includes(u))}),T=e.jsxs("div",{className:"prompt-library-panel__drawer",children:[e.jsxs("div",{className:"prompt-library-panel__header",children:[e.jsx("h3",{children:t("promptLibrary.title")}),e.jsxs("div",{className:"prompt-library-panel__actions",children:[e.jsx("button",{className:"prompt-library-panel__add",onClick:()=>f(r=>!r),title:t("promptLibrary.addNew"),"aria-label":t("promptLibrary.addNew"),children:"+"}),e.jsx("button",{className:"prompt-library-panel__import",onClick:()=>C(!0),title:t("promptLibrary.importFiles"),"aria-label":t("promptLibrary.importFiles"),children:t("promptLibrary.import")}),e.jsx("button",{onClick:_,"aria-label":t("common.close"),children:"×"})]}),O&&e.jsx(A,{text:"",onClose:()=>f(!1)})]}),e.jsxs("div",{className:"prompt-library-panel__search",children:[e.jsx("input",{type:"text",placeholder:t("promptLibrary.search"),value:y,onChange:r=>I(r.target.value)}),e.jsxs("button",{type:"button",className:`prompt-library-panel__filter-toggle${x?" active":""}`,"aria-pressed":x,title:t("promptLibrary.favorites"),onClick:()=>S(r=>!r),children:[e.jsx(j,{}),e.jsx("span",{children:t("promptLibrary.favorites")})]})]}),n?e.jsx("div",{className:"prompt-library-panel__loading",children:t("common.loading")}):e.jsx("div",{className:"prompt-library-panel__list",children:P.length===0?e.jsx("div",{className:"prompt-library-panel__empty",children:t("promptLibrary.empty")}):P.map(r=>e.jsx(M,{prompt:r,onLoad:()=>{F(),k(r.text),l()},onInsert:()=>D(r),onDelete:()=>p(r.id),onToggleFavorite:()=>w(r.id)},r.id))}),g?e.jsx(i.Suspense,{fallback:null,children:e.jsx(V,{open:g,onClose:()=>C(!1),onImported:m})}):null]});return e.jsxs("div",{className:`prompt-library-panel prompt-library-panel--${a}`,children:[a==="overlay"?e.jsx("div",{className:"prompt-library-panel__backdrop",onClick:_}):null,T]})}export{G as PromptLibraryPanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as r,i as R,g as D,j as e,L as H,S as ue,u as ge,o as me}from"./index-gxh_02DQ.js";import{q as B,u as C,r as z,s as he,t as pe,v as fe,x as xe,a as S,I as ye,R as Y,V,y as se,z as je,O as Z,G as te,A as ve,U as be,B as _e,C as we,D as Ne,E as ke,F as Se,H as Le,J as Ce,K as ne,L as Ee,M as Ke,N as Te,W as Ie}from"./App-B9cEM6dJ.js";import{u as P}from"./promptBuilderStore-BTUUzbBT.js";function Ae(){const[s,n]=r.useState(null);return r.useEffect(()=>{if(R())return;const i=D();let t=!1;return(async()=>{try{const h=await B("/api/agy/status");if(t)return;const u=await h.json();if(t||R()||i!==D())return;n(u)}catch{!t&&!R()&&i===D()&&n({installed:!1})}})(),()=>{t=!0}},[]),s}function G({provider:s,label:n,placeholder:i,maskedKey:t,source:a,configured:h,onSaved:u}){const{t:d}=C(),[j,y]=r.useState(""),[p,c]=r.useState(!1),[v,x]=r.useState(!1),[l,f]=r.useState(null),[b,L]=r.useState(!1),E=a==="env",w=j.trim().length>0,O=h&&!p&&!w,q=r.useCallback(async()=>{if(w){x(!0),f(null),L(!1);try{const _=await(await B(`/api/keys/${s}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:j.trim()})})).json();_.ok?(y(""),c(!1),L(!0),u(),setTimeout(()=>L(!1),3e3)):f(_.error||d("settings.apiKeys.saveFailed"))}catch(o){if(o?.code==="LAN_TOKEN_REQUIRED")return;f(d("settings.apiKeys.networkError"))}finally{x(!1)}}},[j,s,w,u,d]),K=r.useCallback(async()=>{try{if(!(await B(`/api/keys/${s}`,{method:"DELETE"})).ok){f(d("settings.apiKeys.removeFailed"));return}y(""),c(!1),u()}catch(o){if(o?.code==="LAN_TOKEN_REQUIRED")return;f(d("settings.apiKeys.networkError"))}},[s,u,d]),M=r.useCallback(()=>{h&&c(!0)},[h]),F=r.useCallback(()=>{w||c(!1)},[w]);return e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("p",{className:"settings-eyebrow",children:d(E?"settings.apiKeys.envSource":"settings.apiKeys.configSource")}),e.jsx("h4",{children:n}),e.jsxs("div",{className:"api-key-input-group",children:[O?e.jsx("input",{type:"text",className:"api-key-input is-masked",value:t||"●●●●●●",readOnly:!0,onFocus:M,onClick:M}):e.jsx("input",{type:"password",className:`api-key-input${l?" is-invalid":""}`,placeholder:i,value:j,onChange:o=>{y(o.target.value),f(null)},onBlur:F,readOnly:!1,autoComplete:"off",autoFocus:p,spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true","data-form-type":"other"}),e.jsxs("div",{className:"api-key-actions",children:[e.jsx("button",{type:"button",className:"settings-action-btn",onClick:q,disabled:!w||v,children:d(v?"settings.apiKeys.saving":b?"settings.apiKeys.saved":"settings.apiKeys.save")}),h&&!E&&e.jsx("button",{type:"button",className:"settings-action-btn settings-action-btn--danger",onClick:K,children:d("settings.apiKeys.remove")})]})]}),l&&e.jsx("p",{className:"api-key-error",children:l})]}),e.jsxs("div",{className:`settings-status${h?" is-ok":""}`,children:[e.jsx("span",{"aria-hidden":"true"}),d(h?"settings.apiKeys.status.valid":"settings.apiKeys.status.notConfigured")]})]})}function Oe({configured:s,maskedKey:n,source:i,onSaved:t}){const{t:a}=C(),[h,u]=r.useState(""),[d,j]=r.useState(!1),[y,p]=r.useState(!1),[c,v]=r.useState(null),[x,l]=r.useState(!1),f=i==="env",b=h.trim().length>0,L=s&&!d&&!b,E=r.useCallback(async()=>{if(b){p(!0),v(null),l(!1);try{const M=await(await B("/api/keys/vertex",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceAccountJson:h.trim()})})).json();M.ok?(u(""),j(!1),l(!0),t(),setTimeout(()=>l(!1),3e3)):v(M.error||a("settings.apiKeys.saveFailed"))}catch(K){if(K?.code==="LAN_TOKEN_REQUIRED")return;v(a("settings.apiKeys.networkError"))}finally{p(!1)}}},[h,b,t,a]),w=r.useCallback(async()=>{try{if(!(await B("/api/keys/vertex",{method:"DELETE"})).ok){v(a("settings.apiKeys.removeFailed"));return}u(""),j(!1),t()}catch(K){if(K?.code==="LAN_TOKEN_REQUIRED")return;v(a("settings.apiKeys.networkError"))}},[t,a]),O=r.useCallback(()=>{s&&!f&&j(!0)},[s,f]),q=r.useCallback(()=>{b||j(!1)},[b]);return e.jsxs("div",{className:"vertex-json-section",children:[e.jsx("p",{className:"settings-eyebrow",children:a(f?"settings.apiKeys.envSource":"settings.apiKeys.configSource")}),s&&n&&e.jsx("p",{className:"vertex-project-id",children:n}),L?e.jsx("textarea",{className:"vertex-json-textarea is-masked",value:`●●● (${a("settings.apiKeys.configuredReplace")})`,readOnly:!0,onFocus:O,onClick:O}):e.jsx("textarea",{className:`vertex-json-textarea${c?" is-invalid":""}`,placeholder:a("settings.apiKeys.vertex.placeholder"),value:h,onChange:K=>{u(K.target.value),v(null)},onBlur:q,readOnly:f,autoFocus:d,spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true","data-form-type":"other"}),e.jsxs("div",{className:"api-key-actions",style:{marginTop:8},children:[!f&&e.jsx("button",{type:"button",className:"settings-action-btn",onClick:E,disabled:!b||y,children:a(y?"settings.apiKeys.saving":x?"settings.apiKeys.saved":"settings.apiKeys.save")}),s&&!f&&e.jsx("button",{type:"button",className:"settings-action-btn settings-action-btn--danger",onClick:w,children:a("settings.apiKeys.remove")})]}),c&&e.jsx("p",{className:"api-key-error",children:c}),e.jsxs("div",{className:`settings-status${s?" is-ok":""}`,style:{marginTop:8},children:[e.jsx("span",{"aria-hidden":"true"}),a(s?"settings.apiKeys.status.valid":"settings.apiKeys.status.notConfigured")]})]})}function Me({keyStatus:s,onSaved:n}){const{t:i}=C(),t=s.vertex?.configured??!1,a=s.gemini?.configured??!1,h=s.geminiAuthMode==="vertex"?"vertex":"apikey",[u,d]=r.useState(h),[j,y]=r.useState(!1);r.useEffect(()=>{j||d(h)},[h,j]);const p=c=>{y(!0),d(c),B("/api/keys/gemini-auth-mode",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({mode:c})}).catch(()=>{})};return e.jsxs("div",{className:"gemini-key-section",children:[e.jsxs("div",{className:"gemini-key-section__header",children:[e.jsx("h5",{children:i("settings.apiKeys.gemini.label")}),e.jsx(z,{value:u,onChange:p,items:[{value:"apikey",label:i("settings.apiKeys.vertex.authModeApiKey")},{value:"vertex",label:i("settings.apiKeys.vertex.authModeVertex")}]})]}),u==="apikey"?e.jsx(G,{provider:"gemini",label:"",placeholder:i("settings.apiKeys.gemini.placeholder"),maskedKey:s.gemini?.maskedKey??null,source:s.gemini?.source??"none",configured:a,onSaved:n}):e.jsx(Oe,{configured:t,maskedKey:s.vertex?.maskedKey??null,source:s.vertex?.source??"none",onSaved:n})]})}function Re(s){return s>80?"var(--red)":s>50?"var(--amber)":"var(--blue)"}function Be(s){if(!s)return"";const n=new Date(s);return`${n.getMonth()+1}/${n.getDate()} ${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function oe({window:s}){const n=Be(s.resetsAt);return e.jsxs("div",{className:"quota-bar",children:[e.jsx("span",{className:"quota-bar__label",children:s.label}),e.jsx("div",{className:"quota-bar__track",children:e.jsx("div",{className:"quota-bar__fill",style:{width:`${Math.min(s.percent,100)}%`,background:Re(s.percent)}})}),e.jsxs("span",{className:"quota-bar__pct",children:[s.percent,"%"]}),n&&e.jsx("span",{className:"quota-bar__reset",children:n})]})}function ce({provider:s,onComplete:n}){const{t:i}=C(),[t,a]=r.useState({phase:"idle"}),[h,u]=r.useState(!1),d=r.useRef(!1),j=r.useCallback(async()=>{if(d.current||R())return;const y=D();d.current=!0,a({phase:"starting"});try{const p=await B("/api/auth/switch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:s})});if(!p.ok){const v=await p.json().catch(()=>({error:i("settings.quota.switchFailed")}));a({phase:"error",error:v.error||`HTTP ${p.status}`});return}const c=await p.json();if(R()||y!==D())return;a({phase:"waiting",...c}),window.open(c.verificationUrl,"_blank")}catch(p){if(d.current=!1,p?.code==="LAN_TOKEN_REQUIRED")return;a({phase:"error",error:p.message})}},[s]);return r.useEffect(()=>{if(t.phase!=="waiting"||!t.sessionId||R())return;const y=D();let p=!1,c;const v=()=>{p=!0,clearTimeout(c),window.removeEventListener(H,v)},x=async()=>{if(!(p||R()||y!==D())){try{const f=await(await B(`/api/auth/switch/${t.sessionId}`)).json();if(p||R()||y!==D())return;if(f.status==="complete"){a({phase:"complete"});return}if(f.status==="error"||f.status==="expired"){a({phase:"error",error:f.error||f.status});return}}catch{}!p&&!R()&&y===D()&&(c=setTimeout(x,3e3))}};return window.addEventListener(H,v),c=setTimeout(x,3e3),v},[t.phase,t.sessionId,n]),r.useEffect(()=>{if(t.phase!=="complete"||R())return;const y=setTimeout(()=>{p(),n()},1e3),p=()=>{clearTimeout(y),window.removeEventListener(H,p)};return window.addEventListener(H,p),p},[t.phase,n]),t.phase==="idle"?e.jsx("button",{type:"button",className:"settings-action-btn",style:{width:"100%",marginTop:"6px"},onClick:j,children:i("settings.quota.switchAccount",{provider:s==="grok"?"Grok":"Codex"})}):t.phase==="starting"?e.jsx("div",{className:"quota-card__hint",style:{textAlign:"center",marginTop:"6px"},children:i("settings.quota.startingLogin")}):t.phase==="waiting"?e.jsxs("div",{style:{marginTop:"6px",padding:"8px",background:"var(--surface, #f5f5f5)",borderRadius:"var(--r-sm)",fontSize:"12px"},children:[e.jsx("div",{style:{textAlign:"center",marginBottom:"4px"},children:i("settings.quota.enterCode")}),e.jsx("div",{style:{textAlign:"center",fontSize:"18px",fontWeight:700,fontFamily:"monospace",letterSpacing:"2px",margin:"6px 0"},children:t.userCode}),t.verificationUrl&&e.jsxs("div",{style:{display:"flex",gap:"4px",margin:"6px 0"},children:[e.jsx("button",{type:"button",className:"settings-action-btn",style:{flex:1,fontSize:"11px"},onClick:()=>{d.current=!1,j()},children:i("settings.quota.retry")}),e.jsx("button",{type:"button",className:"settings-action-btn",style:{flex:1,fontSize:"11px"},onClick:()=>{navigator.clipboard?.writeText(t.verificationUrl).then(()=>{u(!0),setTimeout(()=>u(!1),2e3)})},children:i(h?"settings.quota.copied":"settings.quota.copyLink")})]}),e.jsx("div",{style:{textAlign:"center",color:"var(--text-dim, #888)",fontSize:"11px"},children:i("settings.quota.waitingApproval")})]}):t.phase==="complete"?e.jsx("div",{className:"quota-card__hint",style:{textAlign:"center",marginTop:"6px",color:"var(--green)"},children:i("settings.quota.switchComplete")}):t.phase==="error"?e.jsxs("div",{style:{marginTop:"6px"},children:[e.jsx("div",{className:"quota-card__hint",style:{color:"var(--red)",marginBottom:"4px"},children:t.error||i("settings.quota.switchFailed")}),e.jsx("button",{type:"button",className:"settings-action-btn",style:{width:"100%",fontSize:"11px"},onClick:()=>{d.current=!1,a({phase:"idle"})},children:i("settings.quota.tryAgain")})]}):null}function Pe(){const[s,n]=r.useState(null),[i,t]=r.useState(!0),a=r.useCallback(()=>{t(!0),B("/api/quota").then(h=>h.json()).then(n).catch(()=>n(null)).finally(()=>t(!1))},[]);return r.useEffect(()=>{if(R())return;const h=setTimeout(()=>{u(),a()},1500),u=()=>{clearTimeout(h),window.removeEventListener(H,u)};return window.addEventListener(H,u),u},[a]),{data:s,loading:i,refreshQuota:a}}function $e({data:s,loading:n,onRefresh:i}){const{t}=C(),a=s?.codex,h=a?.windows&&a.windows.length>0,u=a?.account?[a.account.email,a.account.plan].filter(Boolean).join(" · "):null;return e.jsxs("div",{className:"quota-card",children:[u?e.jsx("div",{className:"quota-card__header",children:e.jsx("span",{className:"quota-card__account",children:u})}):null,n?e.jsx("span",{className:"quota-card__loading",children:t("common.loading")}):h?a.windows.map(d=>e.jsx(oe,{window:d},d.label)):a?.authenticated===!1?e.jsx("span",{className:"quota-card__hint",children:t("settings.quota.codexNotLoggedIn")}):a?.error?e.jsx("span",{className:"quota-card__hint",children:t("settings.quota.fetchError")}):e.jsx("span",{className:"quota-card__hint",children:t("settings.quota.noData")}),e.jsx(ce,{provider:"codex",onComplete:i})]})}function De({data:s,loading:n,onRefresh:i}){const{t}=C(),a=s?.grok,h=a?.windows&&a.windows.length>0,u=a?.account?[a.account.email,a.account.plan].filter(Boolean).join(" · "):null;return e.jsxs("div",{className:"quota-card",children:[u||a?.billing?e.jsxs("div",{className:"quota-card__header",style:{display:"flex",alignItems:"center"},children:[u&&e.jsx("span",{className:"quota-card__account",children:u}),a?.billing&&e.jsxs("span",{style:{marginLeft:"auto",fontSize:"11px",color:"var(--text-dim, #888)",whiteSpace:"nowrap"},children:["$",a.billing.usedUsd.toFixed(1),"/$",a.billing.limitUsd]})]}):null,n?e.jsx("span",{className:"quota-card__loading",children:t("common.loading")}):h?a.windows.map(d=>e.jsx(oe,{window:d},d.label)):a?.authenticated===!1?e.jsx("span",{className:"quota-card__hint",children:t("settings.quota.codexNotLoggedIn")}):e.jsx("a",{href:"https://grok.com/?_s=usage",target:"_blank",rel:"noopener noreferrer",className:"settings-action-btn",children:t("settings.quota.grokUsageLink")}),e.jsx(ce,{provider:"grok",onComplete:i})]})}function ae(){return e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:e.jsx("path",{d:"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.998 5.998 0 0 0-3.998 2.9 6.049 6.049 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855l-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023l-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135l-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365l2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.612-1.5z"})})}function qe(){return e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",fillRule:"evenodd","aria-hidden":"true",children:e.jsx("path",{d:"M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815"})})}function Fe(){return e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:e.jsx("path",{d:"M12 24A14.304 14.304 0 0 0 0 12 14.304 14.304 0 0 0 12 0a14.305 14.305 0 0 0 12 12 14.305 14.305 0 0 0-12 12"})})}function ie(s,n){return s(n==="ready"?"settings.account.status.ready":n==="auth_required"?"settings.account.status.authRequired":n==="starting"?"settings.account.status.starting":n==="offline"?"settings.account.status.offline":n==="no_image_model"?"settings.account.status.noImageModel":n==="error"?"settings.account.status.error":"settings.account.status.checking")}function re(s){return s==="ready"?"ok":s==="error"||s==="offline"?"err":"warn"}function Ue(){const{t:s}=C(),n=he(),i=pe(),t=Ae(),{data:a,error:h}=fe(),{data:u,mutate:d}=xe(),j=Pe(),[y,p]=r.useState(!1),c=a?.apiKeySource==="env"||a?.apiKeySource==="config"||a?.apiKeyValid===!0,v=a?.apiKeySource==="config"?s("settings.account.apiSourceConfig"):s("settings.account.apiSourceEnv"),x=a?.apiKeyValid===!0;return e.jsxs(e.Fragment,{children:[e.jsxs("article",{className:"provider-card",children:[e.jsxs("div",{className:"provider-card__head",children:[e.jsx("span",{className:"provider-card__brand",children:e.jsx(ae,{})}),e.jsx("h4",{children:s("settings.account.oauthTitle")}),e.jsx("span",{className:"provider-card__eyebrow",children:s("settings.account.primaryEyebrow")}),e.jsx("span",{className:`provider-chip provider-chip--${re(n?.status)}`,children:ie(s,n?.status)})]}),e.jsx("div",{className:"settings-row__copy",children:e.jsx("p",{children:s("settings.account.oauthBody")})}),e.jsx($e,{data:j.data,loading:j.loading,onRefresh:j.refreshQuota})]}),c?e.jsxs("article",{className:"provider-card",children:[e.jsxs("div",{className:"provider-card__head",children:[e.jsx("span",{className:"provider-card__brand",children:e.jsx(ae,{})}),e.jsx("h4",{children:s("settings.account.apiTitle")}),e.jsx("span",{className:"provider-card__eyebrow",children:v}),e.jsx("span",{className:`provider-chip provider-chip--${h?"err":x?"ok":"warn"}`,children:s(h?"settings.account.apiUnknown":x?"settings.account.apiReady":"settings.account.apiUnavailable")})]}),e.jsx("div",{className:"settings-row__copy",children:e.jsx("p",{children:s("settings.account.apiBody")})})]}):null,e.jsxs("article",{className:"provider-card",children:[e.jsxs("div",{className:"provider-card__head",children:[e.jsx("span",{className:"provider-card__brand",children:e.jsx(qe,{})}),e.jsx("h4",{children:s("settings.account.grokTitle")}),e.jsx("span",{className:"provider-card__eyebrow",children:s("settings.account.grokEyebrow")}),e.jsx("span",{className:`provider-chip provider-chip--${re(i?.status)}`,children:ie(s,i?.status)})]}),e.jsx("div",{className:"settings-row__copy",children:e.jsx("p",{children:s("settings.account.grokBody")})}),e.jsx(De,{data:j.data,loading:j.loading,onRefresh:j.refreshQuota})]}),e.jsxs("article",{className:"provider-card",children:[e.jsxs("div",{className:"provider-card__head",children:[e.jsx("span",{className:"provider-card__brand",children:e.jsx(Fe,{})}),e.jsx("h4",{children:s("settings.account.agyTitle")}),e.jsx("span",{className:"provider-card__eyebrow",children:s("settings.account.agyEyebrow")}),e.jsx("span",{className:`provider-chip provider-chip--${t?.installed?"ok":"warn"}`,children:t?.installed?s("settings.account.agyInstalled"):s("settings.account.agyMissing")})]}),e.jsxs("div",{className:"settings-row__copy",children:[t?.installed?e.jsx("p",{children:s("settings.account.agyInstalledBody")}):e.jsxs("p",{children:[s("settings.account.agyMissingBody")," ",e.jsx("a",{href:"https://antigravity.google/docs/cli-install",target:"_blank",rel:"noopener noreferrer",children:s("settings.account.agyMissingLink")})]}),e.jsx("p",{style:{fontSize:"12px",color:"var(--text-dim, #888)",marginTop:"4px"},children:s("settings.account.agyFineprint")})]})]}),u&&e.jsxs("article",{className:"settings-row settings-accordion",children:[e.jsxs("button",{type:"button",className:"settings-accordion__trigger",onClick:()=>p(!y),children:[e.jsx("h4",{children:s("settings.apiKeys.accordionTitle")}),e.jsx("span",{className:`settings-accordion__arrow${y?" is-open":""}`,children:"▼"})]}),y&&e.jsxs("div",{className:"settings-accordion__body",children:[e.jsx(G,{provider:"openai",label:s("settings.apiKeys.openai.label"),placeholder:s("settings.apiKeys.openai.placeholder"),maskedKey:u.openai?.maskedKey??null,source:u.openai?.source??"none",configured:u.openai?.configured??!1,onSaved:d}),e.jsx(G,{provider:"xai",label:s("settings.apiKeys.xai.label"),placeholder:s("settings.apiKeys.xai.placeholder"),maskedKey:u.xai?.maskedKey??null,source:u.xai?.source??"none",configured:u.xai?.configured??!1,onSaved:d}),e.jsx(G,{provider:"atlascloud",label:s("settings.apiKeys.atlascloud.label"),placeholder:s("settings.apiKeys.atlascloud.placeholder"),maskedKey:u.atlascloud?.maskedKey??null,source:u.atlascloud?.source??"none",configured:u.atlascloud?.configured??!1,onSaved:d}),e.jsx(G,{provider:"minimax",label:s("settings.apiKeys.minimax.label"),placeholder:s("settings.apiKeys.minimax.placeholder"),maskedKey:u.minimax?.maskedKey??null,source:u.minimax?.source??"none",configured:u.minimax?.configured??!1,onSaved:d}),e.jsx(G,{provider:"nai",label:s("settings.apiKeys.nai.label"),placeholder:s("settings.apiKeys.nai.placeholder"),maskedKey:u.nai?.maskedKey??null,source:u.nai?.source??"none",configured:u.nai?.configured??!1,onSaved:d}),e.jsx(Me,{keyStatus:u,onSaved:d})]})]})]})}function ze({variant:s}){const{t:n}=C(),[i,t]=r.useState(!1),a=r.useRef(null),h=r.useRef(null),u=r.useRef(null),d=r.useRef([]),[j,y]=r.useState({top:0,left:12,width:280,maxHeight:480}),p=S(o=>o.imageModel),c=S(o=>o.provider),v=S(o=>o.setImageModel),x=S(o=>o.setProvider),l=S(o=>o.videoModelSelected),f=S(o=>o.selectVideoModel),b=S(o=>o.reasoningEffort),L=S(o=>o.setReasoningEffort),E=s==="settings"?"settings-image-model":"sidebar-image-model",w=ye,O=w.find(o=>o.value===p&&(!o.providerHint||o.providerHint===c))??w.find(o=>o.value===p)??w[0],q=Y.find(o=>o.value===b)??Y[0],K=()=>d.current.filter(o=>o!==null),M=o=>{const _=K();if(_.length===0)return;const m=(o+_.length)%_.length;_[m]?.focus()},F=o=>{const _=K();if(_.length===0)return;const m=_.findIndex(I=>I===document.activeElement),N=_.length-1;if(o.key==="ArrowDown"||o.key==="ArrowRight"){o.preventDefault(),M(m>=0?m+1:0);return}if(o.key==="ArrowUp"||o.key==="ArrowLeft"){o.preventDefault(),M(m>=0?m-1:N);return}if(o.key==="Home"){o.preventDefault(),M(0);return}if(o.key==="End"){o.preventDefault(),M(N);return}o.key==="Escape"&&(o.preventDefault(),t(!1),h.current?.focus())};if(r.useEffect(()=>{if(s!=="sidebar"||!i)return;const o=m=>{const N=m.target;N instanceof Node&&(a.current?.contains(N)||u.current?.contains(N)||t(!1))},_=m=>{m.key==="Escape"&&t(!1)};return document.addEventListener("pointerdown",o),document.addEventListener("keydown",_),()=>{document.removeEventListener("pointerdown",o),document.removeEventListener("keydown",_)}},[i,s]),r.useLayoutEffect(()=>{if(s!=="sidebar"||!i)return;(()=>{const N=h.current?.getBoundingClientRect();if(N){const $=Math.min(280,Math.max(218,window.innerWidth-24)),W=N.right-$,X=window.innerWidth-$-12,g=Math.max(12,Math.min(W,X)),k=N.bottom+7,T=Math.max(160,window.innerHeight-k-12);y({top:k,left:g,width:$,maxHeight:T})}})();const _=N=>{N&&u.current?.contains(N.target)||t(!1)},m=document.querySelector(".sidebar__scroll");return m?.addEventListener("scroll",_,{passive:!0}),window.addEventListener("scroll",_,!0),window.addEventListener("resize",_),()=>{m?.removeEventListener("scroll",_),window.removeEventListener("scroll",_,!0),window.removeEventListener("resize",_)}},[i,s]),r.useEffect(()=>{if(s!=="sidebar"||!i)return;const o=w.findIndex(m=>m.value===p),_=requestAnimationFrame(()=>{M(o>=0?o:0)});return()=>cancelAnimationFrame(_)},[p,w,i,s]),s==="sidebar"){const o=l?V.find(m=>m.value===l)?.shortLabel??V[0].shortLabel:O.shortLabel.split(" ")[0],_=se(p)?O.shortLabel.split(" ")[1]||"":q.shortLabel;return e.jsxs("div",{ref:a,className:"image-model-select image-model-select--sidebar",children:[e.jsxs("button",{ref:h,id:E,type:"button",className:"image-model-select__trigger image-model-select__trigger--pill","aria-haspopup":"menu","aria-expanded":i,"aria-label":n("sidebar.quickSettingsAria",{model:o,effort:_}),onClick:()=>t(m=>!m),children:[e.jsxs("span",{className:"image-model-select__trigger-top",children:[e.jsx("span",{className:"image-model-select__trigger-model",children:o}),e.jsx("span",{className:"image-model-select__trigger-chevron","aria-hidden":"true",children:"▾"})]}),e.jsx("span",{className:"image-model-select__trigger-effort",children:_})]}),i?je.createPortal(e.jsxs("div",{ref:u,className:"image-model-select__menu",role:"menu","aria-label":n("sidebar.quickSettingsMenu"),onKeyDown:F,style:{position:"fixed",top:j.top,left:j.left,width:j.width,maxHeight:j.maxHeight,overflowY:"auto",zIndex:160},children:[e.jsxs("div",{className:"image-model-select__section",role:"group","aria-label":n("sidebar.imageSectionLabel"),children:[e.jsx("div",{className:"image-model-select__section-title",children:n("sidebar.imageSectionLabel")}),e.jsx("div",{className:"image-model-select__subsection-title",children:n("sidebar.gptImageSubLabel")}),Z.map((m,N)=>e.jsxs("button",{ref:I=>{d.current[N]=I},type:"button",className:`image-model-select__item${m.value===p&&!l?" is-active":""}`,role:"menuitemradio","aria-checked":m.value===p&&!l,tabIndex:-1,onClick:()=>{v(m.value),t(!1)},children:[e.jsx("span",{children:m.shortLabel}),e.jsx("small",{children:n(m.fullLabelKey)})]},m.value)),e.jsx("div",{className:"image-model-select__subsection-title",children:n("sidebar.grokImageSubLabel")}),te.map((m,N)=>e.jsxs("button",{ref:I=>{d.current[Z.length+N]=I},type:"button",className:`image-model-select__item${m.value===p&&!l?" is-active":""}`,role:"menuitemradio","aria-checked":m.value===p&&!l,tabIndex:-1,onClick:()=>{v(m.value),t(!1)},children:[e.jsx("span",{children:m.shortLabel}),e.jsx("small",{children:n(m.fullLabelKey)})]},m.value)),e.jsx("div",{className:"image-model-select__subsection-title",children:n("sidebar.geminiImageSubLabel")}),ve.map((m,N)=>{const I=m.providerHint,$=m.value===p&&I===c&&!l;return e.jsxs("button",{ref:W=>{d.current[Z.length+te.length+N]=W},type:"button",className:`image-model-select__item${$?" is-active":""}`,role:"menuitemradio","aria-checked":$,tabIndex:-1,onClick:()=>{I&&x(I),v(m.value),t(!1)},children:[e.jsx("span",{children:m.shortLabel}),e.jsx("small",{children:n(m.fullLabelKey)})]},`${m.value}-${I||N}`)})]}),e.jsxs("div",{className:"image-model-select__section",role:"group","aria-label":n("sidebar.videoSectionLabel"),children:[e.jsx("div",{className:"image-model-select__section-title",children:n("sidebar.videoSectionLabel")}),V.map((m,N)=>e.jsxs("button",{ref:I=>{d.current[w.length+N]=I},type:"button",className:`image-model-select__item${l===m.value?" is-active":""}`,role:"menuitemradio","aria-checked":l===m.value,tabIndex:-1,onClick:()=>{f(m.value),t(!1)},children:[e.jsx("span",{children:m.shortLabel}),e.jsx("small",{children:n(m.fullLabelKey)})]},m.value))]}),!se(p)&&e.jsxs("details",{className:"image-model-select__section image-model-select__collapsible",children:[e.jsxs("summary",{className:"image-model-select__section-title image-model-select__section-title--toggle",children:[n("sidebar.reasoningLabel"),e.jsx("span",{className:"image-model-select__chevron","aria-hidden":"true",children:"▸"})]}),e.jsx("div",{role:"group","aria-label":n("sidebar.reasoningLabel"),children:Y.map((m,N)=>e.jsxs("button",{ref:I=>{d.current[w.length+V.length+N]=I},type:"button",className:`image-model-select__item${m.value===b?" is-active":""}`,role:"menuitemradio","aria-checked":m.value===b,tabIndex:-1,onClick:()=>{L(m.value),t(!1)},children:[e.jsx("span",{children:m.shortLabel}),e.jsx("small",{children:n(m.fullLabelKey)})]},m.value))})]})]}),document.body):null]})}return e.jsx("div",{className:"image-model-select image-model-select--settings",children:e.jsx(z,{id:E,value:p,onChange:o=>v(o),items:[...w.map(o=>({value:o.value,label:n(o.fullLabelKey)})),...be.map(o=>({value:o.value,label:n(o.fullLabelKey),disabled:!0}))]})})}function Ge(){const{t:s}=C(),n=S(a=>a.reasoningEffort),i=S(a=>a.setReasoningEffort),t=Y.map(a=>({value:a.value,label:s(a.fullLabelKey)}));return e.jsx("div",{className:"ctl-select-wrap settings-reasoning-effort",children:e.jsx(z,{id:"settings-reasoning-effort",items:t,value:n,onChange:i})})}const He={ko:"KO",en:"EN","zh-Hant":"正體","zh-Hans":"简体"};function We(){const{t:s,locale:n}=C(),i=S(t=>t.setLocale);return e.jsx("div",{className:"lang-toggle",role:"group","aria-label":s("language.label"),children:ue.map(t=>e.jsx("button",{type:"button",className:`lang-toggle__btn ${n===t?"is-active":""}`,onClick:()=>i(t),"aria-pressed":n===t,title:s(`language.${t}`),children:e.jsx("span",{className:"lang-toggle__label",children:He[t]})},t))})}const Ve=["light","dark","system"];function Qe(){const{t:s}=C(),{mode:n,setMode:i}=ge();return e.jsx("div",{className:"lang-toggle",role:"group","aria-label":s("settings.theme.label"),children:Ve.map(t=>e.jsx("button",{type:"button",className:`lang-toggle__btn ${n===t?"is-active":""}`,onClick:()=>i(t),"aria-pressed":n===t,title:s(`settings.theme.${t}`),children:e.jsx("span",{className:"lang-toggle__label",children:s(`settings.theme.${t}`)})},t))})}const Je=["rail","horizontal","sidebar"];function Ye(){const{t:s}=C(),n=S(t=>t.historyStripLayout),i=S(t=>t.setHistoryStripLayout);return e.jsx(_e,{className:"history-layout-toggle",items:Je.map(t=>({value:t,label:s(`settings.appearance.historyStripLayout.${t}`)})),value:n,onChange:i})}const Xe=[{value:"default",labelKey:"workspace.defaultLabel",descKey:"workspace.defaultDesc"},{value:"prompt-studio",labelKey:"workspace.promptStudioLabel",descKey:"workspace.promptStudioDesc"}];function Ze(){const s=S(t=>t.workspaceProfile),n=S(t=>t.setWorkspaceProfile),{t:i}=C();return e.jsx("div",{className:"settings-field",children:e.jsx(z,{id:"workspace-profile-select",value:s,onChange:t=>n(t),ariaLabel:i("workspace.profileLabel"),items:Xe.map(t=>({value:t.value,label:i(t.labelKey)}))})})}function es(){const{t:s}=C(),[n,i]=r.useState(null);r.useEffect(()=>{B("/api/config/grok-planner").then(a=>a.json()).then(i).catch(()=>{})},[]);const t=async a=>{try{await B("/api/config/grok-planner",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:a})}),i(h=>h?{...h,model:a}:null)}catch{}};return n?e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.grokPlanner.title")}),e.jsx("p",{children:s("settings.grokPlanner.body")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(z,{items:n.options.map(a=>({value:a,label:a})),value:n.model,onChange:a=>{t(a)},ariaLabel:s("settings.grokPlanner.title")})})]}):null}function ss(s){return s==="connected"?"ok":s==="error"||s==="offline"?"err":"warn"}function ts(s){const n=s.status.snapshotDiff;return n?n.drifted.length+n.missing.length+n.added.length:0}function ns(){const{t:s}=C(),{providers:n,loading:i,error:t,refresh:a}=we(),[h,u]=r.useState(null),[d,j]=r.useState(!1),[y,p]=r.useState(null),c=async()=>{if(!d){j(!0);try{await a()}finally{j(!1)}}},v=async(x,l)=>{u({provider:x.id,action:l}),p(null);try{l==="connect"?await Ne(x.id):l==="refresh"?await ke(x.id):await Se(x.id),await a()}catch(f){const b=f instanceof Error&&f.message==="MCP_POPUP_BLOCKED"?s("mcp.popupBlocked"):s("mcp.connectionActionFailed");p({provider:x.id,message:b})}finally{u(null)}};return e.jsxs("div",{"aria-labelledby":"mcp-provider-connections-title",children:[e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{id:"mcp-provider-connections-title",children:s("mcp.connectionsTitle")}),e.jsx("p",{children:s("mcp.connectionsBody")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx("button",{type:"button",className:"settings-action-btn",onClick:()=>{c()},disabled:i||d,"aria-busy":i||d,children:s(i||d?"mcp.loadingProviders":"mcp.refreshList")})})]}),t?e.jsx("p",{role:"alert",className:"settings-row__microcopy",children:s("mcp.providersLoadFailed")}):null,n.map(x=>{const l=x.status.state,f=!x.enabled||x.executable===!1,b=h?.provider===x.id?h.action:null,L=b!==null,E=ts(x);return e.jsxs("article",{className:"provider-card",children:[e.jsxs("div",{className:"provider-card__head",children:[e.jsx("h4",{children:x.id}),e.jsx("span",{className:"provider-card__eyebrow",children:"MCP"}),e.jsx("span",{className:`provider-chip provider-chip--${ss(l)}`,children:s(`mcp.status.${l}`)})]}),e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("p",{children:x.endpoint}),e.jsxs("p",{children:[typeof x.status.toolCount=="number"?s("mcp.toolCount",{count:x.status.toolCount}):s("mcp.toolCountUnknown"),E>0?` · ${s("mcp.snapshotChanges",{count:E})}`:""]}),f?e.jsx("p",{className:"settings-row__microcopy",children:x.enabled?x.lockReason??s("mcp.higgsfieldLocked"):s("mcp.disabledProvider")}):x.status.detail?e.jsx("p",{className:"settings-row__microcopy",children:x.status.detail}):null,y?.provider===x.id?e.jsx("p",{role:"alert",className:"settings-row__microcopy",children:y.message}):null]}),e.jsxs("div",{className:"provider-card__head",children:[e.jsx("span",{className:"provider-card__eyebrow",children:s("mcp.billingLabel")}),e.jsx("span",{className:"provider-chip provider-chip--warn",children:s("mcp.billingUnknown")})]}),e.jsx("div",{className:"settings-row__control","aria-live":"polite",children:l==="connected"&&!f?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"settings-action-btn",onClick:()=>{v(x,"refresh")},disabled:L,"aria-busy":b==="refresh",children:s(b==="refresh"?"mcp.refreshingConnection":"mcp.refreshConnection")}),e.jsx("button",{type:"button",className:"settings-action-btn settings-action-btn--danger",onClick:()=>{v(x,"disconnect")},disabled:L,"aria-busy":b==="disconnect",children:s("mcp.disconnect")})]}):e.jsx("button",{type:"button",className:"settings-action-btn",onClick:()=>{v(x,"connect")},disabled:L||f,"aria-busy":b==="connect",title:s(f?"mcp.higgsfieldLocked":"mcp.connectOpensBrowser"),children:s(b==="connect"?"mcp.connecting":"mcp.connect")})})]},x.id)})]})}const as=[137,80,78,71,13,10,26,10];async function is(s){const n=new Uint8Array(await s.arrayBuffer());if(as.every((t,a)=>n[a]===t)){let t="";for(const a of n)t+=String.fromCharCode(a);return{pngBase64:btoa(t)}}return{graph:JSON.parse(new TextDecoder().decode(n))}}const le=["prompt","negativePrompt","width","height","seed","refImage","output"];function Q(s){return s.input?`${s.node}.${s.input}`:s.node}function rs(){const{t:s}=C(),[n,i]=r.useState([]),[t,a]=r.useState(!0),[h,u]=r.useState(null),[d,j]=r.useState(null),[y,p]=r.useState({}),[c,v]=r.useState(""),[x,l]=r.useState(""),[f,b]=r.useState("image"),[L,E]=r.useState("http://127.0.0.1:8188"),[w,O]=r.useState({kind:"idle"}),[q,K]=r.useState(null),[M,F]=r.useState(!1),o=r.useRef(null),_=r.useCallback(async()=>{a(!0);try{const g=await Le();i(g.workflows)}catch{i([])}finally{a(!1)}},[]);r.useEffect(()=>{_()},[_]);const m=async g=>{if(g){K(null);try{const k=await is(g),T=await Ee(k);j(k),u(T),b(T.mediaKind??"image");const U={};for(const A of T.candidates)A.unambiguous&&(U[A.field]=Q(A));p(U),c||v(g.name.replace(/\.[^.]+$/,"").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").slice(0,64))}catch(k){u(null),j(null),K(k instanceof Error?k.message:s("comfy.inspectFailed"))}}},N=async()=>{O({kind:"idle"});try{const g=await Ke(L);O(g.health.ok?{kind:"ok",...g.health.version?{detail:g.health.version}:{}}:{kind:"unreachable"})}catch(g){O({kind:"invalid",detail:g instanceof Error?g.message:void 0})}},I=(h?.candidates??[]).filter(g=>!g.unambiguous).map(g=>g.field).filter((g,k,T)=>T.indexOf(g)===k).filter(g=>!y[g]),$=!!(h&&c&&y.prompt&&y.output&&I.length===0&&!M),W=async()=>{if(!(!$||!d)){F(!0),K(null);try{const g={};for(const k of le){const T=y[k];if(!T)continue;if(k==="output"){g.output={node:T};continue}const U=T.indexOf(".");g[k]={node:T.slice(0,U),input:T.slice(U+1)}}await Te({...d,id:c,...x?{label:x}:{},origin:L,mediaKind:f,bind:g}),u(null),j(null),p({}),v(""),l(""),b("image"),o.current&&(o.current.value=""),await Promise.all([_(),ne()])}catch(g){K(g instanceof Error?g.message:s("comfy.registerFailed"))}finally{F(!1)}}},X=async g=>{F(!0);try{await Ce(g),await Promise.all([_(),ne()])}catch(k){K(k instanceof Error?k.message:s("comfy.removeFailed"))}finally{F(!1)}};return e.jsxs("div",{"aria-labelledby":"comfy-workflow-manager-title",children:[e.jsx("article",{className:"settings-row",children:e.jsxs("div",{className:"settings-row-main",children:[e.jsx("div",{className:"section-title",id:"comfy-workflow-manager-title",children:s("comfy.workflowsTitle")}),t?e.jsx("div",{className:"muted",children:s("comfy.loading")}):null,!t&&n.length===0?e.jsx("div",{className:"muted",children:s("comfy.empty")}):null,n.length>0?e.jsxs("table",{className:"comfy-workflow-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",children:s("comfy.colId")}),e.jsx("th",{scope:"col",children:s("comfy.colKind")}),e.jsx("th",{scope:"col",children:s("comfy.colOrigin")}),e.jsx("th",{scope:"col",children:s("comfy.colStatus")}),e.jsx("th",{scope:"col",children:e.jsx("span",{className:"sr-only",children:s("comfy.colActions")})})]})}),e.jsx("tbody",{children:n.map(g=>{const k=g.health?.ok===!0,T=`comfy-status-${g.id}`;return e.jsxs("tr",{children:[e.jsx("td",{children:g.label||g.id}),e.jsx("td",{children:s(g.mediaKind==="video"?"comfy.kindVideo":"comfy.kindImage")}),e.jsx("td",{className:"mono",children:g.origin}),e.jsx("td",{id:T,children:e.jsx("span",{className:k?"status-ok":"status-warn",children:s(k?"comfy.statusReady":"comfy.statusOffline")})}),e.jsx("td",{children:e.jsx("button",{type:"button",onClick:()=>{X(g.id)},disabled:M,"aria-describedby":T,children:s("comfy.remove")})})]},g.id)})})]}):null]})}),e.jsx("article",{className:"settings-row",children:e.jsxs("div",{className:"settings-row-main",children:[e.jsx("div",{className:"section-title",children:s("comfy.addTitle")}),e.jsxs("div",{className:"comfy-field",children:[e.jsx("label",{htmlFor:"comfy-file",children:s("comfy.fileLabel")}),e.jsx("input",{id:"comfy-file",ref:o,type:"file",accept:".json,.png,application/json,image/png",onChange:g=>{m(g.target.files?.[0])}})]}),e.jsxs("div",{className:"comfy-field",children:[e.jsx("label",{htmlFor:"comfy-origin",children:s("comfy.originLabel")}),e.jsxs("div",{className:"comfy-origin-row",children:[e.jsx("input",{id:"comfy-origin",value:L,onChange:g=>{E(g.target.value),O({kind:"idle"})},spellCheck:!1}),e.jsx("button",{type:"button",onClick:()=>{N()},children:s("comfy.checkOrigin")})]})]}),w.kind==="ok"?e.jsxs("div",{className:"status-ok",children:[s("comfy.originReachable"),w.detail?` (${w.detail})`:""]}):null,w.kind==="unreachable"?e.jsx("div",{className:"status-warn",children:s("comfy.originUnreachable")}):null,w.kind==="invalid"?e.jsx("div",{className:"status-err",children:s("comfy.originInvalid")}):null,h?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"comfy-field",children:[e.jsx("label",{htmlFor:"comfy-id",children:s("comfy.idLabel")}),e.jsx("input",{id:"comfy-id",value:c,onChange:g=>v(g.target.value),spellCheck:!1})]}),e.jsxs("div",{className:"comfy-field",children:[e.jsx("label",{htmlFor:"comfy-label",children:s("comfy.labelLabel")}),e.jsx("input",{id:"comfy-label",value:x,onChange:g=>l(g.target.value)})]}),e.jsxs("div",{className:"comfy-field",children:[e.jsx("label",{htmlFor:"comfy-kind",children:s("comfy.kindLabel")}),e.jsxs("select",{id:"comfy-kind",value:f,onChange:g=>b(g.target.value),children:[e.jsx("option",{value:"image",children:s("comfy.kindImage")}),e.jsx("option",{value:"video",children:s("comfy.kindVideo")})]}),f==="video"?e.jsx("div",{className:"muted",children:s("comfy.videoKindHint")}):null]}),e.jsx("div",{className:"section-title",children:s("comfy.bindTitle")}),h.needsConfirmation?e.jsx("div",{className:"muted",children:s("comfy.bindAmbiguous")}):null,le.map(g=>{const k=h.candidates.filter(A=>A.field===g);if(k.length===0)return null;const T=k.some(A=>!A.unambiguous),U=`comfy-bind-${g}`;return e.jsxs("div",{className:"comfy-bind-row",children:[e.jsx("label",{htmlFor:U,children:s(`comfy.field.${g}`)}),e.jsxs("select",{id:U,value:y[g]??"",onChange:A=>p(de=>({...de,[g]:A.target.value})),"aria-invalid":T&&!y[g],children:[e.jsx("option",{value:"",children:s("comfy.choose")}),k.map(A=>e.jsxs("option",{value:Q(A),children:[Q(A)," — ",A.classType,A.title?` "${A.title}"`:""]},Q(A)))]})]},g)}),e.jsx("button",{type:"button",onClick:()=>{W()},disabled:!$,children:s("comfy.register")})]}):null,q?e.jsx("div",{className:"status-err",role:"alert",children:q}):null]})})]})}function ls(s,n){return n(s==="auto"?"promptBuilder.backends.auto":s==="oauth"?"promptBuilder.backends.oauth":s==="grok"?"promptBuilder.backends.grok":s==="api"?"promptBuilder.backends.api":"promptBuilder.backends.grokApi")}function os(){const{t:s}=C(),n=P(c=>c.backend),i=P(c=>c.model),t=P(c=>c.backendOptions),a=P(c=>c.modelOptions),h=P(c=>c.locked),u=P(c=>c.configLoaded),d=P(c=>c.configLoading),j=P(c=>c.error),y=P(c=>c.loadConfig),p=P(c=>c.updateConfig);return r.useEffect(()=>{y()},[y]),e.jsxs(e.Fragment,{children:[e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.promptBuilder.title")}),e.jsx("p",{children:s("settings.promptBuilder.body")}),h.backend||h.model?e.jsx("p",{className:"settings-row__microcopy",children:s("settings.promptBuilder.envLocked")}):null,d?e.jsx("p",{className:"settings-row__microcopy",children:s("promptBuilder.configLoading")}):null,j?e.jsx("p",{className:"settings-row__microcopy",role:"alert",children:j}):null]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(z,{value:n,items:t.map(c=>({value:c,label:ls(c,s)})),onChange:c=>{p(c)},ariaLabel:s("settings.promptBuilder.backendLabel"),disabled:!u||d||h.backend||h.model})})]}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.promptBuilder.modelLabel")}),e.jsx("p",{children:s("settings.promptBuilder.modelBody")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(z,{value:i,items:a.map(c=>({value:c,label:c==="auto"?s("promptBuilder.modelAuto"):c})),onChange:c=>{p(n,c)},ariaLabel:s("settings.promptBuilder.modelLabel"),disabled:!u||d||h.model})})]})]})}const J=["providers","workspace","general"];function ee({id:s,setRef:n,children:i}){const{t}=C();return e.jsxs("section",{id:s,ref:a=>n(s,a),className:"settings-section","aria-labelledby":`settings-section-${s}`,children:[e.jsx("header",{className:"settings-section__header",children:e.jsx("h3",{id:`settings-section-${s}`,children:t(`settings.sections.${s}.title`)})}),e.jsx("div",{className:"settings-section__body",children:i})]})}function gs(){const{t:s}=C(),n=S(l=>l.activeSettingsSection),i=S(l=>l.setActiveSettingsSection),t=S(l=>l.closeSettings),a=S(l=>l.openReadinessPopup),h=S(l=>l.galleryDefaultScope),u=S(l=>l.setGalleryDefaultScope),d=S(l=>l.provider),j=r.useRef(null),y=r.useRef(null),p=r.useRef(!1),c=r.useRef({providers:null,workspace:null,general:null}),v=(l,f)=>{c.current[l]=f},x=l=>{i(l),p.current=!0;const f=j.current,b=c.current[l];if(f&&b){const L=f.getBoundingClientRect().top,E=b.getBoundingClientRect().top,w=Number.parseFloat(window.getComputedStyle(b).scrollMarginTop)||0;f.scrollTo({top:f.scrollTop+E-L-w,behavior:"auto"})}y.current!==null&&window.clearTimeout(y.current),y.current=window.setTimeout(()=>{p.current=!1,y.current=null},120)};return r.useEffect(()=>{const l=f=>{f.key==="Escape"&&t()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[t]),r.useEffect(()=>{const l=j.current;if(!l||typeof IntersectionObserver!="function")return;const f=new IntersectionObserver(b=>{if(p.current)return;const E=b.filter(w=>w.isIntersecting).sort((w,O)=>O.intersectionRatio-w.intersectionRatio)[0]?.target.id;E&&J.includes(E)&&i(E)},{root:l,threshold:[.35,.6]});for(const b of J){const L=c.current[b];L&&f.observe(L)}return()=>f.disconnect()},[i]),r.useEffect(()=>()=>{y.current!==null&&window.clearTimeout(y.current)},[]),e.jsx("main",{className:"settings-workspace","aria-labelledby":"settings-title",children:e.jsxs("div",{className:"settings-shell",children:[e.jsxs("header",{className:"settings-header",children:[e.jsx("div",{children:e.jsx("h2",{id:"settings-title",children:s("settings.title")})}),e.jsx("button",{type:"button",className:"settings-close",onClick:t,"aria-label":s("settings.closeAria"),title:s("settings.closeTitle"),children:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":"true",children:[e.jsx("path",{d:"M18 6 6 18"}),e.jsx("path",{d:"m6 6 12 12"})]})})]}),e.jsxs("div",{className:"settings-layout",children:[e.jsx("nav",{className:"settings-nav settings-nav--mobile","aria-label":s("settings.navAria"),children:e.jsx("div",{className:"settings-mobile-nav",role:"list",children:J.map(l=>e.jsxs("button",{type:"button",className:`settings-mobile-nav__item${n===l?" is-active":""}`,onClick:()=>x(l),"aria-current":n===l?"true":void 0,children:[e.jsx("span",{children:s(`settings.sections.${l}.title`)}),e.jsx("small",{children:s(`settings.sections.${l}.hint`)})]},l))})}),e.jsx("nav",{className:"settings-nav","aria-label":s("settings.navAria"),children:J.map(l=>e.jsxs("button",{type:"button",className:`settings-nav__item${n===l?" is-active":""}`,onClick:()=>x(l),"aria-label":s("settings.jumpTo",{section:s(`settings.sections.${l}.title`)}),children:[e.jsx("span",{children:s(`settings.sections.${l}.title`)}),e.jsx("small",{children:s(`settings.sections.${l}.hint`)})]},l))}),e.jsxs("section",{ref:j,className:"settings-content","aria-label":s("settings.contentAria"),children:[e.jsxs(ee,{id:"providers",setRef:v,children:[e.jsx(Ue,{}),e.jsx(ns,{}),e.jsx(rs,{}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("readiness.settingsTitle")}),e.jsx("p",{children:s("readiness.settingsBody")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx("button",{type:"button",className:"settings-action-btn",onClick:a,children:s("readiness.open")})})]}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.imageModel.title")}),e.jsx("p",{children:s("settings.imageModel.body")}),e.jsx("p",{className:"settings-row__microcopy",children:s("settings.imageModel.unsupportedHelp")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(ze,{variant:"settings"})})]}),e.jsx(os,{}),d==="grok"?e.jsxs(e.Fragment,{children:[e.jsx("article",{className:"settings-row",children:e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.grokCompatibility.title")}),e.jsx("p",{children:s("settings.grokCompatibility.body")})]})}),e.jsx(es,{})]}):d==="agy"||d==="gemini-api"?e.jsx("article",{className:"settings-row",children:e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s(d==="gemini-api"?"provider.geminiApiCompatTitle":"provider.agyCompatTitle")}),e.jsx("p",{children:s(d==="gemini-api"?"provider.geminiApiCompatBodyLong":"provider.agyCompatBodyLong")})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.reasoning.title")}),e.jsx("p",{children:s("settings.reasoning.body")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(Ge,{})})]}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.webSearch.title")}),e.jsx("p",{children:s("settings.webSearch.body")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(Ie,{})})]})]})]}),e.jsxs(ee,{id:"workspace",setRef:v,children:[e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("workspace.sectionTitle")}),e.jsx("p",{children:s("workspace.sectionBody")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(Ze,{})})]}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.appearance.historyStripLayoutTitle")}),e.jsx("p",{children:s("settings.appearance.historyStripLayoutBody")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(Ye,{})})]}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.gallery.defaultScopeTitle")}),e.jsx("p",{children:s("settings.gallery.defaultScopeBody")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(z,{ariaLabel:s("settings.gallery.defaultScopeTitle"),value:h,onChange:l=>u(l),items:[{value:"current-session",label:s("gallery.scope.current")},{value:"all",label:s("gallery.scope.all")}]})})]})]}),e.jsxs(ee,{id:"general",setRef:v,children:[e.jsx(me,{}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.language.title")}),e.jsx("p",{children:s("settings.language.body")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(We,{})})]}),e.jsxs("article",{className:"settings-row",children:[e.jsxs("div",{className:"settings-row__copy",children:[e.jsx("h4",{children:s("settings.theme.title")}),e.jsx("p",{children:s("settings.theme.body")})]}),e.jsx("div",{className:"settings-row__control",children:e.jsx(Qe,{})})]})]})]})]})]})})}export{gs as SettingsWorkspace};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e,f as x}from"./index-gxh_02DQ.js";import{u as d,k as j,a as m}from"./App-B9cEM6dJ.js";import{P as v}from"./AssetGenWorkspace-swWPvXrx.js";import"./KeyingPanel-ZyBSXioh.js";import"./useAgentDialogFocus-DSc2qY8p.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 N(){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{N as SpriteRecipeWorkspace};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pptxgen.es-OUNhQLEV.js","assets/index-gxh_02DQ.js","assets/index-B5jy7ePg.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{f as i,j as o,_ as Sn}from"./index-gxh_02DQ.js";import{u as fe,k as Bn,f as jn,au as Tn,av as Pn,aw as An,ax as Ht,ay as ut,az as me,aA as Dn,a as A,aB as Vt,aC as Ct,aD as Rn,aE as Kt,aF as Nn,g as In,aG as On,aH as Ln}from"./App-B9cEM6dJ.js";const $e=2,Ke=1e-6;function $n({paths:e,points:t,radius:n,makeId:a=()=>crypto.randomUUID()}){if(e.length===0||t.length===0||n<=0)return{paths:e,changed:!1};let r=!1;const l=[];for(const c of e){const s=Un(c,t,n,a);(s.length!==1||s[0]!==c)&&(r=!0),l.push(...s)}return{paths:l,changed:r}}function Un(e,t,n,a=()=>crypto.randomUUID()){if(e.points.length<$e||t.length===0||n<=0)return[e];const r=[];let l=Re(e.points[0],t,n)?[]:[e.points[0]];for(let s=1;s<e.points.length;s+=1){const d=e.points[s-1],u=e.points[s],m=Re(u,t,n),f=Wn(d,u,t,n);if(f){l.length===0&&!Re(d,t,n)&&(l=[d]),l.length>0&&f.leftT>Ke&&Mt(l,Ie(d,u,f.leftT)),l.length>=$e&&r.push(l),l=[],f.rightT<1-Ke&&!m&&(l=[Ie(d,u,f.rightT),u]);continue}if(m){l.length>=$e&&r.push(l),l=[];continue}l.length===0&&!Re(d,t,n)&&(l=[d]),Mt(l,u)}if(l.length>=$e&&r.push(l),r.length===0)return[];if(r.length===1&&r[0].length===e.points.length)return[e];const c=e.tool==="arrow"?r.length-1:-1;return r.map((s,d)=>({...e,id:d===0?e.id:a(),tool:e.tool==="arrow"&&d!==c?"pen":e.tool,points:s}))}function Re(e,t,n){if(t.length===1)return we(e,t[0])<=n;for(let a=1;a<t.length;a+=1)if(Fn(e,t[a-1],t[a])<=n)return!0;return!1}function we(e,t){const n=e.x-t.x,a=e.y-t.y;return Math.sqrt(n*n+a*a)}function Wn(e,t,n,a){const r=we(e,t);if(r<=Ke)return Re(e,n,a)?{leftT:0,rightT:1}:null;let l=null,c=Number.POSITIVE_INFINITY;for(const d of n){const u=_t(d,e,t),m=Ie(e,t,u),f=we(d,m);f<c&&(c=f,l=u)}for(let d=1;d<n.length;d+=1){const u=[0,.25,.5,.75,1];for(const m of u){const f=Ie(n[d-1],n[d],m),g=_t(f,e,t),E=Ie(e,t,g),C=we(f,E);C<c&&(c=C,l=g)}}if(l===null||c>a)return null;const s=Math.max(a/r,.01);return{leftT:Math.max(0,l-s),rightT:Math.min(1,l+s)}}function _t(e,t,n){const a=n.x-t.x,r=n.y-t.y,l=e.x-t.x,c=e.y-t.y,s=a*a+r*r;return s===0?0:Math.max(0,Math.min(1,(l*a+c*r)/s))}function Ie(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Mt(e,t){const n=e.at(-1);(!n||we(n,t)>Ke)&&e.push(t)}function Fn(e,t,n){const a=n.x-t.x,r=n.y-t.y,l=e.x-t.x,c=e.y-t.y,s=a*a+r*r;if(s===0)return we(e,t);const d=Math.max(0,Math.min(1,(l*a+c*r)/s));return we(e,{x:t.x+d*a,y:t.y+d*r})}function vt(e,t){return`${e}:${t}`}function bt(e){const t=e.indexOf(":");if(t<=0)return null;const n=e.slice(0,t),a=e.slice(t+1);return!a||n!=="path"&&n!=="box"&&n!=="memo"?null:{kind:n,id:a}}function zt(e){return vt("path",e.id)}function qt(e){return vt("box",e.id)}function Xt(e){return vt("memo",e.id)}function pe(e,t,n){const a=bt(e);return a?.kind===t&&a.id===n}const Gt="ima2.canvas.annotationStyle.v1",Yt=["#ef4444","#f97316","#eab308","#22c55e","#38bdf8","#6366f1","#a855f7","#111827","#ffffff"],Zt=[2,3,5,8],Te={color:"#ef4444",strokeWidth:3};function Hn(){if(typeof window>"u")return Te;try{const e=window.localStorage.getItem(Gt);if(!e)return Te;const t=JSON.parse(e),n=typeof t.color=="string"&&Yt.includes(t.color)?t.color:Te.color,a=typeof t.strokeWidth=="number"&&Zt.includes(t.strokeWidth)?t.strokeWidth:Te.strokeWidth;return{color:n,strokeWidth:a}}catch{return Te}}function Vn(e){if(!(typeof window>"u"))try{window.localStorage.setItem(Gt,JSON.stringify(e))}catch{}}const Et=Hn(),dt={activeTool:"select",toolColor:Et.color,strokeWidth:Et.strokeWidth,paths:[],boxes:[],memos:[],activeMemoId:null,activePath:null,activeBox:null,eraserMode:"object",activeEraserStroke:null,eraserBaseline:null,selectionBox:null,selectedIds:[],past:[],future:[],memoBaseline:null,moveBaseline:null,isDirty:!1};function ye(e){return{paths:e.paths,boxes:e.boxes,memos:e.memos}}function xe(e){return{...e,past:[...e.past.slice(-49),ye(e)],future:[]}}function at(e,t){return{...e,past:[...e.past.slice(-49),t],future:[]}}function Kn(e,t){return JSON.stringify(e)===JSON.stringify(t)}function St(e,t){return{...e,...t,activeMemoId:null,activePath:null,activeBox:null,selectionBox:null,selectedIds:[],isDirty:!0}}function zn(e,t,n){const{start:a,current:r}=e,l=Math.min(a.x,r.x),c=Math.min(a.y,r.y),s=Math.abs(r.x-a.x),d=Math.abs(r.y-a.y);return s<.01||d<.01?null:{id:crypto.randomUUID(),x:l,y:c,width:s,height:d,color:t,strokeWidth:n}}function qn(e,t){return{...e,x:Math.min(1-e.width,Math.max(0,e.x+t.x)),y:Math.min(1-e.height,Math.max(0,e.y+t.y))}}function rt(e,t){return{x:Math.min(1,Math.max(0,e.x+t.x)),y:Math.min(1,Math.max(0,e.y+t.y))}}function Xn(e,t){switch(t.type){case"SET_TOOL":return{...e,activeTool:t.tool};case"SET_ERASER_MODE":return{...e,eraserMode:t.mode};case"SET_STYLE":return{...e,toolColor:t.style.color,strokeWidth:t.style.strokeWidth};case"START_PATH":return{...e,isDirty:!0,activePath:{id:crypto.randomUUID(),tool:e.activeTool,points:[t.point],color:e.toolColor,strokeWidth:e.strokeWidth}};case"ADD_POINT":return e.activePath?{...e,activePath:{...e.activePath,points:[...e.activePath.points,t.point]}}:e;case"END_PATH":return!e.activePath||e.activePath.points.length<2?{...e,activePath:null}:{...xe(e),isDirty:!0,paths:[...e.paths,e.activePath],activePath:null};case"START_BOX":return{...e,isDirty:!0,activeBox:{start:t.point,current:t.point}};case"UPDATE_BOX":return e.activeBox?{...e,activeBox:{...e.activeBox,current:t.point}}:e;case"END_BOX":{if(!e.activeBox)return e;const n=zn(e.activeBox,e.toolColor,e.strokeWidth);return n?{...xe(e),isDirty:!0,boxes:[...e.boxes,n],activeBox:null}:{...e,activeBox:null}}case"CREATE_MEMO":{const n=crypto.randomUUID(),a={id:n,x:t.point.x,y:t.point.y,text:"",color:e.toolColor};return{...xe(e),isDirty:!0,memos:[...e.memos,a],activeMemoId:n}}case"UPDATE_MEMO":return{...e,isDirty:!0,memos:e.memos.map(n=>n.id===t.id?{...n,text:t.text}:n)};case"COMMIT_MEMO_EDIT":return e.memoBaseline?Kn(e.memoBaseline,ye(e))?{...e,memoBaseline:null,activeMemoId:null}:{...at(e,e.memoBaseline),memoBaseline:null,activeMemoId:null,isDirty:!0}:{...e,activeMemoId:null};case"DELETE_MEMO":return{...xe(e),isDirty:!0,memos:e.memos.filter(n=>n.id!==t.id),activeMemoId:e.activeMemoId===t.id?null:e.activeMemoId,selectedIds:e.selectedIds.filter(n=>!pe(n,"memo",t.id))};case"FOCUS_MEMO":return{...e,activeMemoId:t.id,memoBaseline:t.id&&e.activeMemoId!==t.id&&!e.memoBaseline?ye(e):e.memoBaseline};case"CLEAR":return{...xe(e),isDirty:!0,paths:[],boxes:[],memos:[],activeMemoId:null,activePath:null,activeBox:null,selectionBox:null,selectedIds:[]};case"LOAD":return{...dt,activeTool:e.activeTool,eraserMode:e.eraserMode,toolColor:e.toolColor,strokeWidth:e.strokeWidth,...t.payload};case"MARK_SAVED":return{...e,isDirty:!1};case"RESET_LOCAL":return{...dt,activeTool:e.activeTool,eraserMode:e.eraserMode,toolColor:e.toolColor,strokeWidth:e.strokeWidth};case"UNDO":{const n=e.past.at(-1);return n?{...St(e,n),past:e.past.slice(0,-1),future:[ye(e),...e.future]}:e}case"REDO":{const n=e.future[0];return n?{...St(e,n),past:[...e.past.slice(-49),ye(e)],future:e.future.slice(1)}:e}case"SELECT_ONE":return{...e,selectedIds:[t.id],selectionBox:null};case"TOGGLE_SELECTED":return{...e,selectedIds:e.selectedIds.includes(t.id)?e.selectedIds.filter(n=>n!==t.id):[...e.selectedIds,t.id],selectionBox:null};case"CLEAR_SELECTION":return{...e,selectedIds:[],selectionBox:null};case"DELETE_SELECTED":return e.selectedIds.length===0?e:{...xe(e),isDirty:!0,paths:e.paths.filter(n=>!e.selectedIds.some(a=>pe(a,"path",n.id))),boxes:e.boxes.filter(n=>!e.selectedIds.some(a=>pe(a,"box",n.id))),memos:e.memos.filter(n=>!e.selectedIds.some(a=>pe(a,"memo",n.id))),selectedIds:[]};case"MOVE_SELECTED":return e.selectedIds.length===0?e:{...e,isDirty:!0,paths:e.paths.map(n=>e.selectedIds.some(a=>pe(a,"path",n.id))?{...n,points:n.points.map(a=>rt(a,t.delta))}:n),boxes:e.boxes.map(n=>e.selectedIds.some(a=>pe(a,"box",n.id))?qn(n,t.delta):n),memos:e.memos.map(n=>e.selectedIds.some(a=>pe(a,"memo",n.id))?{...n,x:rt(n,t.delta).x,y:rt(n,t.delta).y}:n)};case"START_SELECTED_MOVE":return{...e,moveBaseline:ye(e)};case"COMMIT_SELECTED_MOVE":return e.moveBaseline?{...at(e,e.moveBaseline),moveBaseline:null,isDirty:!0}:e;case"START_SELECTION_BOX":return{...e,selectionBox:{start:t.point,current:t.point},selectedIds:[]};case"UPDATE_SELECTION_BOX":return e.selectionBox?{...e,selectionBox:{...e.selectionBox,current:t.point}}:e;case"END_SELECTION_BOX":return{...e,selectionBox:null,selectedIds:t.ids};case"ERASE_OBJECT":{const n=bt(t.id);return!n||!(n.kind==="path"?e.paths.some(r=>r.id===n.id):n.kind==="box"?e.boxes.some(r=>r.id===n.id):e.memos.some(r=>r.id===n.id))?e:{...xe(e),isDirty:!0,paths:n.kind==="path"?e.paths.filter(r=>r.id!==n.id):e.paths,boxes:n.kind==="box"?e.boxes.filter(r=>r.id!==n.id):e.boxes,memos:n.kind==="memo"?e.memos.filter(r=>r.id!==n.id):e.memos,selectedIds:e.selectedIds.filter(r=>r!==t.id)}}case"START_ERASER_STROKE":return{...e,activeEraserStroke:{points:[t.point],radius:.018},eraserBaseline:ye(e)};case"UPDATE_ERASER_STROKE":return e.activeEraserStroke?{...e,activeEraserStroke:{...e.activeEraserStroke,points:[...e.activeEraserStroke.points,t.point]}}:e;case"END_ERASER_STROKE":{if(!e.activeEraserStroke||!e.eraserBaseline)return{...e,activeEraserStroke:null,eraserBaseline:null};const n=$n({paths:e.paths,points:e.activeEraserStroke.points,radius:e.activeEraserStroke.radius});return n.changed?{...at(e,e.eraserBaseline),paths:n.paths,activeEraserStroke:null,eraserBaseline:null,selectedIds:[],isDirty:!0}:{...e,activeEraserStroke:null,eraserBaseline:null}}default:return e}}function Gn(){const[e,t]=i.useReducer(Xn,dt),n=i.useMemo(()=>e.paths.length>0||e.boxes.length>0||e.memos.length>0,[e.paths.length,e.boxes.length,e.memos.length]),a=e.past.length>0,r=e.future.length>0,l=i.useCallback(k=>t({type:"SET_TOOL",tool:k}),[]),c=i.useCallback(k=>{Vn(k),t({type:"SET_STYLE",style:k})},[]),s=i.useCallback(()=>t({type:"CLEAR"}),[]),d=i.useCallback(k=>t({type:"LOAD",payload:k}),[]),u=i.useCallback(()=>t({type:"MARK_SAVED"}),[]),m=i.useCallback(()=>t({type:"RESET_LOCAL"}),[]),f=i.useCallback(()=>t({type:"UNDO"}),[]),g=i.useCallback(()=>t({type:"REDO"}),[]),E=i.useCallback(()=>t({type:"COMMIT_MEMO_EDIT"}),[]),C=i.useCallback(()=>t({type:"START_SELECTED_MOVE"}),[]),L=i.useCallback(()=>t({type:"COMMIT_SELECTED_MOVE"}),[]),U=i.useCallback(k=>{e.activeTool==="pen"||e.activeTool==="arrow"?t({type:"START_PATH",point:k}):e.activeTool==="box"&&t({type:"START_BOX",point:k})},[e.activeTool]),N=i.useCallback(k=>{e.activePath?t({type:"ADD_POINT",point:k}):e.activeBox&&t({type:"UPDATE_BOX",point:k})},[e.activePath,e.activeBox]),p=i.useCallback(()=>{e.activePath?t({type:"END_PATH"}):e.activeBox&&t({type:"END_BOX"})},[e.activePath,e.activeBox]),_=i.useCallback(k=>t({type:"CREATE_MEMO",point:k}),[]),S=i.useCallback((k,G)=>t({type:"UPDATE_MEMO",id:k,text:G}),[]),y=i.useCallback(k=>t({type:"DELETE_MEMO",id:k}),[]),v=i.useCallback(k=>t({type:"FOCUS_MEMO",id:k}),[]),ee=i.useCallback(k=>t({type:"SET_ERASER_MODE",mode:k}),[]),I=i.useCallback(k=>t({type:"SELECT_ONE",id:k}),[]),z=i.useCallback(k=>t({type:"TOGGLE_SELECTED",id:k}),[]),Q=i.useCallback(()=>t({type:"CLEAR_SELECTION"}),[]),b=i.useCallback(()=>t({type:"DELETE_SELECTED"}),[]),W=i.useCallback(k=>t({type:"MOVE_SELECTED",delta:k}),[]),T=i.useCallback(k=>t({type:"START_SELECTION_BOX",point:k}),[]),D=i.useCallback(k=>t({type:"UPDATE_SELECTION_BOX",point:k}),[]),R=i.useCallback(k=>t({type:"END_SELECTION_BOX",ids:k}),[]),te=i.useCallback(k=>t({type:"ERASE_OBJECT",id:k}),[]),oe=i.useCallback(k=>t({type:"START_ERASER_STROKE",point:k}),[]),ie=i.useCallback(k=>t({type:"UPDATE_ERASER_STROKE",point:k}),[]),ue=i.useCallback(()=>t({type:"END_ERASER_STROKE"}),[]),de=i.useCallback(()=>({paths:e.paths,boxes:e.boxes,memos:e.memos}),[e.paths,e.boxes,e.memos]);return{...e,canUndo:a,canRedo:r,hasAnnotations:n,setTool:l,setStyle:c,setEraserMode:ee,startDrawing:U,moveDrawing:N,endDrawing:p,createMemo:_,updateMemo:S,commitMemoEdit:E,deleteMemo:y,focusMemo:v,clear:s,load:d,toPayload:de,markSaved:u,resetLocal:m,undo:f,redo:g,selectOne:I,toggleSelected:z,clearSelection:Q,deleteSelected:b,moveSelected:W,startSelectedMove:C,commitSelectedMove:L,startSelectionBox:T,updateSelectionBox:D,endSelectionBox:R,eraseObjectAtPoint:te,startEraserStroke:oe,updateEraserStroke:ie,endEraserStroke:ue}}function Ne(e,t){return{x:e.x*t.width,y:e.y*t.height}}function Jt(e,t,n){const a=Math.atan2(t.y-e.y,t.x-e.x),r=Math.max(12,n*4),l=Math.PI/7;return[{x:t.x,y:t.y},{x:t.x-r*Math.cos(a-l),y:t.y-r*Math.sin(a-l)},{x:t.x-r*Math.cos(a+l),y:t.y-r*Math.sin(a+l)}]}function ht(e,t,n){if(t.points.length<2)return;const a=Ne(t.points[0],n);e.save(),e.beginPath(),e.strokeStyle=t.color,e.lineWidth=t.strokeWidth,e.lineCap="round",e.lineJoin="round",e.moveTo(a.x,a.y);for(const r of t.points.slice(1)){const l=Ne(r,n);e.lineTo(l.x,l.y)}if(e.stroke(),t.tool==="arrow"){const r=Ne(t.points[t.points.length-1],n),l=Ne(t.points[t.points.length-2],n);Jn(e,l,r,t.color,t.strokeWidth)}e.restore()}function ft(e,t,n,a){const r="start"in t?{x:Math.min(t.start.x,t.current.x),y:Math.min(t.start.y,t.current.y),width:Math.abs(t.current.x-t.start.x),height:Math.abs(t.current.y-t.start.y),color:"#64c8ff",strokeWidth:2}:t;e.save(),e.strokeStyle=r.color,e.lineWidth=a==="active"?Math.max(2,r.strokeWidth):r.strokeWidth,a==="active"&&e.setLineDash([8,6]),e.strokeRect(r.x*n.width,r.y*n.height,r.width*n.width,r.height*n.height),e.restore()}function Yn(e,t,n){const a=t.x*n.width,r=t.y*n.height,l=Math.min(260,Math.max(150,n.width*.22)),c=12,s=18;e.save(),e.font="14px sans-serif";const d=Qn(e,t.text.trim()||" ",l-c*2),u=Math.max(52,c*2+d.length*s);e.fillStyle="rgba(255, 246, 179, 0.96)",e.strokeStyle="rgba(44, 37, 12, 0.28)",e.lineWidth=1,ea(e,a,r,l,u,8),e.fill(),e.stroke(),e.fillStyle="#2f2a13",e.textBaseline="top",d.forEach((m,f)=>{e.fillText(m,a+c,r+c+f*s)}),e.restore()}function Bt(e,t){const n=bt(e);if(!n)return null;if(n.kind==="box")return t.boxes.find(u=>u.id===n.id)??null;const a=n.kind==="memo"?t.memos.find(u=>u.id===n.id):null;if(a)return{id:a.id,x:a.x,y:a.y,width:.18,height:.12,color:a.color,strokeWidth:1};if(n.kind!=="path")return null;const r=t.paths.find(u=>u.id===n.id);if(!r||r.points.length===0)return null;const l=r.points.map(u=>u.x),c=r.points.map(u=>u.y),s=Math.min(...l),d=Math.min(...c);return{id:r.id,x:s,y:d,width:Math.max(.01,Math.max(...l)-s),height:Math.max(.01,Math.max(...c)-d),color:r.color,strokeWidth:r.strokeWidth}}function jt(e,t,n){const a="start"in t?{x:Math.min(t.start.x,t.current.x),y:Math.min(t.start.y,t.current.y),width:Math.abs(t.current.x-t.start.x),height:Math.abs(t.current.y-t.start.y)}:t;e.save(),e.strokeStyle="#64c8ff",e.lineWidth=2,e.setLineDash([5,5]),e.strokeRect(a.x*n.width,a.y*n.height,a.width*n.width,a.height*n.height),e.restore()}function Zn(e,t,n){e.save(),e.strokeStyle="rgba(100, 200, 255, 0.5)",e.lineWidth=1.5,e.setLineDash([3,4]),e.strokeRect(t.x*n.width,t.y*n.height,t.width*n.width,t.height*n.height),e.restore()}function Jn(e,t,n,a,r){const[l,c,s]=Jt(t,n,r);e.save(),e.fillStyle=a,e.beginPath(),e.moveTo(l.x,l.y),e.lineTo(c.x,c.y),e.lineTo(s.x,s.y),e.closePath(),e.fill(),e.restore()}function Qn(e,t,n){const a=t.split(/\s+/).filter(Boolean);if(a.length===0)return[""];const r=[];let l="";for(const c of a){const s=l?`${l} ${c}`:c;if(e.measureText(s).width<=n||l===""){l=s;continue}r.push(l),l=c}return l&&r.push(l),r}function ea(e,t,n,a,r,l){const c=Math.min(l,a/2,r/2);e.beginPath(),e.moveTo(t+c,n),e.lineTo(t+a-c,n),e.quadraticCurveTo(t+a,n,t+a,n+c),e.lineTo(t+a,n+r-c),e.quadraticCurveTo(t+a,n+r,t+a-c,n+r),e.lineTo(t+c,n+r),e.quadraticCurveTo(t,n+r,t,n+r-c),e.lineTo(t,n+c),e.quadraticCurveTo(t,n,t+c,n),e.closePath()}function ta({paths:e,boxes:t,memos:n=[],selectedIds:a=[],selectionBox:r=null,hoveredId:l=null,activePath:c,activeBox:s}){const d=i.useRef(null);return i.useEffect(()=>{const u=d.current;if(!u)return;const m=u.getBoundingClientRect(),f=window.devicePixelRatio||1;u.width=Math.max(1,Math.round(m.width*f)),u.height=Math.max(1,Math.round(m.height*f));const g=u.getContext("2d");if(!g)return;g.setTransform(f,0,0,f,0,0),g.clearRect(0,0,m.width,m.height);const E={width:m.width,height:m.height};for(const C of e)ht(g,C,E);for(const C of t)ft(g,C,E,"committed");for(const C of a){const L=Bt(C,{paths:e,boxes:t,memos:n});L&&jt(g,L,E)}if(r&&jt(g,r,E),l&&!a.includes(l)){const C=Bt(l,{paths:e,boxes:t,memos:n});C&&Zn(g,C,E)}c&&ht(g,c,E),s&&ft(g,s,E,"active")},[e,t,n,a,r,l,c,s]),o.jsx("canvas",{ref:d,className:"canvas-annotation-layer","aria-hidden":"true"})}function Ue(e){e.stopPropagation()}function na({memos:e,activeMemoId:t,onUpdate:n,onDelete:a,onFocus:r,onCommit:l}){const{t:c}=fe();return o.jsx("div",{className:"canvas-memo-overlay",children:e.map(s=>o.jsx("textarea",{className:`canvas-memo${t===s.id?" canvas-memo--active":""}`,value:s.text,style:{left:`${s.x*100}%`,top:`${s.y*100}%`},autoFocus:t===s.id,onFocus:()=>r(s.id),onPointerDown:Ue,onPointerMove:Ue,onPointerUp:Ue,onPointerCancel:Ue,onChange:d=>n(s.id,d.currentTarget.value),onBlur:()=>{l?.(),s.text.trim()===""&&a(s.id)},"aria-label":c("common.canvasMemo")},s.id))})}function aa({annotationFrameRef:e,imageElementRef:t,frameClassName:n,frameStyle:a,imageKey:r,imageSrc:l,fallbackImage:c,alt:s,canvasOpen:d,maskOverlayUrl:u,cleanupLayer:m,annotations:f,hoveredAnnotationId:g=null,onOpenCanvas:E,onPointerDown:C,onPointerMove:L,onPointerUp:U,onPointerLeave:N}){return o.jsxs("div",{ref:e,className:n,onPointerDown:C,onPointerMove:L,onPointerUp:U,onPointerCancel:U,onPointerLeave:N,style:a,children:[o.jsx("img",{ref:t,className:"result-img",src:l??c,alt:s,decoding:"async",onDoubleClick:p=>{p.stopPropagation(),E()}},r),d&&u?o.jsx("img",{className:"canvas-background-cleanup-mask",src:u,alt:"","aria-hidden":"true",decoding:"async"}):null,d?m:null,d&&o.jsxs(o.Fragment,{children:[o.jsx(ta,{paths:f.paths,boxes:f.boxes,memos:f.memos,selectedIds:f.selectedIds,selectionBox:f.selectionBox,hoveredId:g,activePath:f.activePath,activeBox:f.activeBox}),o.jsx(na,{memos:f.memos,activeMemoId:f.activeMemoId,onUpdate:f.updateMemo,onDelete:f.deleteMemo,onFocus:f.focusMemo,onCommit:f.commitMemoEdit})]})]})}function ra(e){return`${e.x*100} ${e.y*100}`}function oa(e){return e.map(ra).join(" ")}function sa({seeds:e,brushStrokes:t,brushCursor:n,brushRadius:a,active:r}){if(!r&&e.length===0&&t.length===0)return null;const l=a*100;return o.jsxs("svg",{className:"canvas-cleanup-overlay",viewBox:"0 0 100 100",preserveAspectRatio:"none","aria-hidden":"true",children:[t.map(c=>o.jsx("polyline",{className:`canvas-cleanup-overlay__stroke canvas-cleanup-overlay__stroke--${c.intent}`,points:oa(c.points),strokeWidth:Math.max(.3,c.radius*200),vectorEffect:"non-scaling-stroke"},c.id)),r&&n?o.jsx("circle",{className:"canvas-cleanup-cursor",cx:n.x*100,cy:n.y*100,r:Math.max(.6,l),vectorEffect:"non-scaling-stroke"}):null]})}function la({mode:e,matteColor:t,onModeChange:n,onMatteColorChange:a}){const{t:r}=fe();return o.jsxs("div",{className:"canvas-toolbar__bg",role:"group","aria-label":r("canvas.toolbar.bgGroup"),children:[o.jsx("button",{type:"button",className:`canvas-toolbar__bg-tab${e==="alpha"?" active":""}`,onClick:()=>n("alpha"),children:r("canvas.toolbar.bgAlpha")}),o.jsx("button",{type:"button",className:`canvas-toolbar__bg-tab${e==="matte"?" active":""}`,onClick:()=>n("matte"),children:r("canvas.toolbar.bgMatte")}),e==="matte"?o.jsx("input",{type:"color","aria-label":r("canvas.toolbar.bgMatteColor"),value:t,onChange:l=>a(l.target.value)}):null]})}function Tt({label:e,value:t,options:n,onChange:a}){return o.jsxs("div",{className:"canvas-toolbar__segmented-row",children:[o.jsx("span",{className:"canvas-toolbar__segmented-label",children:e}),o.jsx("div",{className:"canvas-toolbar__segmented",role:"group","aria-label":e,children:n.map(r=>o.jsx("button",{type:"button",className:"canvas-toolbar__segmented-button","data-value":r.value,"aria-pressed":t===r.value,onClick:()=>a(r.value),children:r.label},r.value))})]})}function ca({seedCount:e,tolerance:t,stats:n,hasPreview:a,isPickingSeed:r,intent:l,tool:c,brushRadius:s,isPreviewing:d,isApplying:u,keepOpen:m,disabled:f,onAutoSample:g,onPickSeed:E,onIntentChange:C,onToolChange:L,onBrushRadiusChange:U,onToleranceChange:N,onPreview:p,onApply:_,onReset:S}){const{t:y}=fe(),[v,ee]=i.useState(!1),I=i.useRef(null),z=n?Math.round(n.removedPercent*1e3)/10:0,Q=r||c==="brush";return i.useEffect(()=>{if(!v)return;const b=W=>{m||I.current?.contains(W.target)||ee(!1)};return window.addEventListener("pointerdown",b),()=>window.removeEventListener("pointerdown",b)},[m,v]),o.jsxs("div",{className:"canvas-toolbar__cleanup",ref:I,children:[o.jsx("button",{type:"button",className:`canvas-toolbar__button${v||a?" canvas-toolbar__button--active":""}`,onClick:()=>ee(b=>!b),disabled:f,"aria-expanded":v,"aria-label":y("canvas.toolbar.cleanup"),title:y("canvas.toolbar.cleanup"),children:o.jsx(ia,{})}),v?o.jsxs("div",{className:"canvas-toolbar__cleanup-panel",role:"group","aria-label":y("canvas.toolbar.cleanup"),children:[o.jsxs("div",{className:"canvas-toolbar__cleanup-row",children:[o.jsx("span",{className:"canvas-toolbar__cleanup-title",children:y("canvas.toolbar.cleanup")}),o.jsx("span",{className:"canvas-toolbar__cleanup-meta",children:y("canvas.toolbar.cleanupSeedCount",{n:e})})]}),o.jsx(Tt,{label:y("canvas.toolbar.cleanupMark"),value:l,options:[{value:"remove",label:y("canvas.toolbar.cleanupRemove")},{value:"preserve",label:y("canvas.toolbar.cleanupPreserve")}],onChange:C}),o.jsx(Tt,{label:y("canvas.toolbar.cleanupInput"),value:c,options:[{value:"click",label:y("canvas.toolbar.cleanupClick")},{value:"brush",label:y("canvas.toolbar.cleanupBrush")}],onChange:L}),o.jsxs("label",{className:"canvas-toolbar__cleanup-slider",children:[o.jsx("span",{children:y("canvas.toolbar.cleanupTolerance")}),o.jsx("input",{type:"range",min:"0",max:"96",value:t,onChange:b=>N(Number(b.target.value))}),o.jsx("output",{children:t})]}),c==="brush"?o.jsxs("label",{className:"canvas-toolbar__cleanup-slider",children:[o.jsx("span",{children:y("canvas.toolbar.cleanupBrushSize")}),o.jsx("input",{type:"range",min:"0.006",max:"0.06",step:"0.002",value:s,onChange:b=>U(Number(b.target.value))}),o.jsx("output",{children:Math.round(s*1e3)})]}):null,o.jsxs("div",{className:"canvas-toolbar__cleanup-actions",children:[o.jsx("button",{type:"button",onClick:g,children:y("canvas.toolbar.cleanupAutoSample")}),o.jsx("button",{type:"button",className:r?"active":"",onClick:E,children:y(Q?"canvas.toolbar.cleanupActive":"canvas.toolbar.cleanupPickSeed")})]}),o.jsxs("div",{className:"canvas-toolbar__cleanup-actions",children:[o.jsx("button",{type:"button",onClick:p,disabled:d||e===0,children:y(d?"canvas.toolbar.cleanupPreviewing":"canvas.toolbar.cleanupPreview")}),o.jsx("button",{type:"button",onClick:_,disabled:u||!a&&e===0,children:y(u?"canvas.toolbar.cleanupApplying":"canvas.toolbar.cleanupApply")}),o.jsx("button",{type:"button",onClick:S,disabled:!a&&e===0,children:y("canvas.toolbar.cleanupReset")})]}),Q?o.jsx("div",{className:"canvas-toolbar__cleanup-status canvas-toolbar__cleanup-status--active",children:y(c==="brush"?"canvas.toolbar.cleanupBrushHint":"canvas.toolbar.cleanupPickHint")}):n&&!a?o.jsx("div",{className:"canvas-toolbar__cleanup-status canvas-toolbar__cleanup-status--active",children:y("canvas.toolbar.cleanupMaskHint")}):null,n?o.jsx("div",{className:"canvas-toolbar__cleanup-status",children:y("canvas.toolbar.cleanupRemoved",{n:z})}):null]}):null]})}function ia(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M5 7.5h14"}),o.jsx("path",{d:"M7 12h10"}),o.jsx("path",{d:"M10 16.5h4"}),o.jsx("path",{d:"M7.5 5.5 9 4l1.5 1.5L9 7 7.5 5.5Z"}),o.jsx("path",{d:"M13.5 11 15 9.5l1.5 1.5L15 12.5 13.5 11Z"}),o.jsx("path",{d:"M4.5 15.5 6 14l1.5 1.5L6 17 4.5 15.5Z"})]})}const ua=[{id:"png",kind:"export"},{id:"svg",kind:"export"},{id:"vector",kind:"trace"},{id:"pptx",kind:"export"}];function da({onExport:e,onTrace:t,disabled:n,isExporting:a}){const{t:r}=fe(),[l,c]=i.useState(!1),s=i.useRef(null),d=i.useRef(null),u=i.useId();i.useEffect(()=>{if(!l)return;const g=()=>Array.from(d.current?.querySelectorAll("[role='menuitem']")??[]);window.requestAnimationFrame(()=>g()[0]?.focus());const E=C=>{const L=C.target;d.current?.contains(L)||s.current?.contains(L)||c(!1)};return document.addEventListener("pointerdown",E,!0),()=>document.removeEventListener("pointerdown",E,!0)},[l]);const m=g=>{c(!1),s.current?.focus()},f=g=>{if(g.key==="Escape"){g.preventDefault(),m();return}if(!["ArrowDown","ArrowUp","Home","End"].includes(g.key))return;g.preventDefault();const C=Array.from(d.current?.querySelectorAll("[role='menuitem']")??[]);if(C.length===0)return;const L=C.indexOf(document.activeElement),U=g.key==="Home"?0:g.key==="End"?C.length-1:L<0?0:(L+(g.key==="ArrowDown"?1:-1)+C.length)%C.length;C[U]?.focus()};return o.jsxs("div",{className:"canvas-export-menu",children:[o.jsx("button",{ref:s,type:"button",className:`canvas-toolbar__button${a?" canvas-toolbar__button--busy":""}`,onClick:()=>c(g=>!g),disabled:n||a,"aria-haspopup":"menu","aria-expanded":l,"aria-controls":l?u:void 0,"aria-busy":a||void 0,"aria-label":r("canvas.toolbar.export"),title:r("canvas.toolbar.export"),children:o.jsx(ha,{})}),l?o.jsx("div",{ref:d,id:u,role:"menu",className:"canvas-export-menu__list","aria-label":r("canvas.toolbar.exportFormat"),onKeyDown:f,children:ua.map(g=>o.jsx("button",{type:"button",role:"menuitem",className:"canvas-export-menu__item",onClick:()=>{m(),g.kind==="trace"?t():e(g.id)},children:r(`canvas.toolbar.exportAs.${g.id}`)},g.id))}):null]})}function ha(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false",children:[o.jsx("path",{d:"M12 4v11"}),o.jsx("path",{d:"m8 11 4 4 4-4"}),o.jsx("path",{d:"M5 20h14"})]})}function fa({style:e,onStyleChange:t}){const{t:n}=fe(),[a,r]=i.useState(!1),l=Bn(a,()=>{r(!1)},{trap:!1,restoreFocus:s=>s!=="outsidePointer"}),c=i.useRef(null);return i.useEffect(()=>{if(!a)return;const s=d=>{c.current?.contains(d.target)||r(!1)};return window.addEventListener("pointerdown",s),()=>window.removeEventListener("pointerdown",s)},[a]),o.jsxs("div",{ref:c,className:`canvas-toolbar__split-button${a?" canvas-toolbar__split-button--active":""}`,children:[o.jsxs("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__style-trigger",onClick:()=>r(s=>!s),"aria-haspopup":"dialog","aria-expanded":a,"aria-label":n("canvas.toolbar.style"),title:n("canvas.toolbar.style"),children:[o.jsx("span",{className:"canvas-style-trigger__swatch",style:{background:e.color},"aria-hidden":"true"}),o.jsx("span",{className:"canvas-style-trigger__width",style:{height:`${Math.min(8,Math.max(2,e.strokeWidth))}px`},"aria-hidden":"true"})]}),a?o.jsxs("div",{ref:l,className:"canvas-style-popover",role:"dialog","aria-label":n("canvas.toolbar.style"),children:[o.jsx("div",{className:"canvas-style-popover__row",role:"group","aria-label":n("canvas.toolbar.color"),children:Yt.map(s=>o.jsx("button",{type:"button",className:`canvas-style-swatch${e.color===s?" canvas-style-swatch--active":""}`,style:{background:s},onClick:()=>t({...e,color:s}),"aria-pressed":e.color===s,"aria-label":s,title:s},s))}),o.jsx("div",{className:"canvas-style-popover__row",role:"group","aria-label":n("canvas.toolbar.strokeWidth"),children:Zt.map(s=>o.jsx("button",{type:"button",className:`canvas-style-width${e.strokeWidth===s?" canvas-style-width--active":""}`,onClick:()=>t({...e,strokeWidth:s}),"aria-pressed":e.strokeWidth===s,"aria-label":`${s}px`,title:`${s}px`,children:o.jsx("span",{style:{height:`${s}px`,background:e.color}})},s))})]}):null]})}function pa({tools:e,activeTool:t,onToolChange:n}){const[a,r]=i.useState(!1),l=i.useRef(null),c=e.find(d=>d.id===t)??e[0],s=c.icon;return i.useEffect(()=>{if(!a)return;const d=u=>{l.current?.contains(u.target)||r(!1)};return window.addEventListener("pointerdown",d),()=>window.removeEventListener("pointerdown",d)},[a]),o.jsxs("div",{ref:l,className:"canvas-tool-picker",children:[o.jsxs("button",{type:"button",className:`canvas-toolbar__button canvas-tool-picker__trigger${t!=="eraser"?" canvas-toolbar__button--active":""}`,onClick:()=>r(d=>!d),"aria-label":`${c.label} (${c.shortcut})`,"aria-pressed":t===c.id,"aria-haspopup":"menu","aria-expanded":a,title:`${c.label} (${c.shortcut})`,children:[o.jsx(s,{}),o.jsx("span",{className:"canvas-toolbar__shortcut","aria-hidden":"true",children:c.shortcut})]}),a?o.jsx("div",{className:"canvas-tool-picker__menu",role:"menu",children:e.map(d=>{const u=d.icon,m=t===d.id;return o.jsxs("button",{type:"button",className:`canvas-tool-picker__item${m?" active":""}`,role:"menuitemradio","aria-checked":m,onClick:()=>{n(d.id),r(!1)},children:[o.jsx(u,{}),o.jsx("span",{children:d.label}),o.jsx("kbd",{children:d.shortcut})]},d.id)})}):null]})}function ma({activeTool:e,hasAnnotations:t,hasExportableContent:n,onToolChange:a,eraserMode:r="object",onEraserModeChange:l,style:c,onStyleChange:s,onClear:d,onApply:u,onRevertAnnotations:m,onExport:f,onTrace:g,onUndo:E,onRedo:C,canUndo:L,canRedo:U,onDeleteSelected:N,selectedCount:p=0,onEditWithMask:_,canEditWithMask:S,isEditingWithMask:y,onGptTransparency:v,isTransparencyRunning:ee,isApplying:I,isExporting:z,exportBackground:Q="alpha",exportMatteColor:b="#ffffff",onExportBackgroundChange:W,onExportMatteColorChange:T,cleanupTolerance:D=28,cleanupSeedCount:R=0,cleanupStats:te=null,cleanupHasPreview:oe=!1,isCleanupPickingSeed:ie=!1,isCleanupActive:ue=!1,cleanupIntent:de="remove",cleanupTool:k="click",cleanupBrushRadius:G=.018,isCleanupPreviewing:se=!1,isCleanupApplying:B=!1,onCleanupAutoSample:j,onCleanupPickSeed:O,onCleanupIntentChange:q,onCleanupToolChange:K,onCleanupBrushRadiusChange:J,onCleanupToleranceChange:$,onCleanupPreview:F,onCleanupApply:ne,onCleanupReset:H}){const{t:M}=fe(),[V,X]=i.useState(!1),he=i.useRef(null),ve=t??!1,_e=n??ve,be=M(r==="object"?"canvas.toolbar.objectEraser":"canvas.toolbar.brushEraser"),Me=[{id:"select",shortcut:"1",label:M("canvas.toolbar.select"),icon:va},{id:"pen",shortcut:"2",label:M("canvas.toolbar.pen"),icon:ba},{id:"box",shortcut:"3",label:M("canvas.toolbar.box"),icon:ga},{id:"arrow",shortcut:"4",label:M("canvas.toolbar.arrow"),icon:xa},{id:"memo",shortcut:"5",label:M("canvas.toolbar.memo"),icon:ya}];i.useEffect(()=>{if(!V)return;const le=Ee=>{he.current?.contains(Ee.target)||X(!1)};return window.addEventListener("pointerdown",le),()=>window.removeEventListener("pointerdown",le)},[V]);const ke=le=>{l?.(le),a("eraser"),X(!1)};return o.jsxs("div",{className:"canvas-toolbar","aria-label":M("canvas.toolbar.label"),children:[o.jsx(pa,{tools:Me,activeTool:e,onToolChange:a}),o.jsx(fa,{style:c,onStyleChange:s}),o.jsxs("div",{ref:he,className:`canvas-toolbar__split-button${e==="eraser"?" canvas-toolbar__split-button--active":""}`,onKeyDown:le=>{le.key==="Escape"&&V&&(le.preventDefault(),X(!1))},children:[o.jsxs("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--split-main${e==="eraser"?" canvas-toolbar__button--active":""}`,onClick:()=>a("eraser"),"aria-label":`${be} (6)`,"aria-pressed":e==="eraser",title:`${be} (6)`,children:[o.jsx(wa,{}),o.jsx("span",{className:"canvas-toolbar__shortcut","aria-hidden":"true",children:"6"})]}),o.jsx("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__button--split-menu",onClick:()=>X(le=>!le),"aria-label":M("canvas.toolbar.eraserMenu"),"aria-haspopup":"menu","aria-expanded":V,"aria-controls":"canvas-eraser-menu",title:M("canvas.toolbar.eraserMenu"),children:o.jsx(ka,{})}),V?o.jsxs("div",{id:"canvas-eraser-menu",className:"canvas-toolbar__eraser-menu",role:"menu",children:[o.jsx("button",{type:"button",className:`canvas-toolbar__eraser-menu-item${r==="object"?" canvas-toolbar__eraser-menu-item--active":""}`,role:"menuitemradio","aria-checked":r==="object",onClick:()=>ke("object"),children:M("canvas.toolbar.objectEraser")}),o.jsx("button",{type:"button",className:`canvas-toolbar__eraser-menu-item${r==="brush"?" canvas-toolbar__eraser-menu-item--active":""}`,role:"menuitemradio","aria-checked":r==="brush",onClick:()=>ke("brush"),children:M("canvas.toolbar.brushEraser")})]}):null]}),o.jsx("span",{className:"canvas-toolbar__divider","aria-hidden":"true"}),u?o.jsx("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--primary${I?" canvas-toolbar__button--busy":""}`,onClick:u,disabled:!ve||I,"aria-label":M("canvas.toolbar.apply"),title:M("canvas.toolbar.apply"),children:o.jsx(Ca,{})}):null,m?o.jsx("button",{type:"button",className:"canvas-toolbar__button",onClick:m,disabled:I,"aria-label":M("canvas.revert.action"),title:M("canvas.revert.action"),children:o.jsx(At,{})}):null,_?o.jsx("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--primary canvas-toolbar__button--mask${y?" canvas-toolbar__button--busy":""}`,onClick:_,disabled:!S||y,"aria-label":M(S?"canvas.toolbar.editMask":"canvas.toolbar.editMaskDisabled"),title:M(S?"canvas.toolbar.editMask":"canvas.toolbar.editMaskDisabled"),children:o.jsx(Ma,{})}):null,E?o.jsx("button",{type:"button",className:"canvas-toolbar__button",onClick:E,disabled:!L,"aria-label":M("canvas.toolbar.undo"),title:M("canvas.toolbar.undo"),children:o.jsx(At,{})}):null,C?o.jsx("button",{type:"button",className:"canvas-toolbar__button",onClick:C,disabled:!U,"aria-label":M("canvas.toolbar.redo"),title:M("canvas.toolbar.redo"),children:o.jsx(_a,{})}):null,N?o.jsx("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__button--danger",onClick:N,disabled:p===0,"aria-label":M("canvas.toolbar.deleteSelected"),title:M("canvas.toolbar.deleteSelected"),children:o.jsx(Pt,{})}):null,f&&W&&T?o.jsx(la,{mode:Q,matteColor:b,onModeChange:W,onMatteColorChange:T}):null,j&&O&&q&&K&&J&&$&&F&&ne&&H?o.jsx(ca,{seedCount:R,tolerance:D,stats:te,hasPreview:oe,isPickingSeed:ie,intent:de,tool:k,brushRadius:G,isPreviewing:se,isApplying:B,keepOpen:ue,disabled:I||z,onAutoSample:j,onPickSeed:O,onIntentChange:q,onToolChange:K,onBrushRadiusChange:J,onToleranceChange:$,onPreview:F,onApply:ne,onReset:H}):null,v?o.jsx("button",{type:"button",className:`canvas-toolbar__button canvas-toolbar__button--transparency${ee?" canvas-toolbar__button--busy":""}`,onClick:v,disabled:ee||I||y,"aria-label":M("canvas.toolbar.gptTransparency"),title:M("canvas.toolbar.gptTransparency"),children:ee?o.jsx("span",{className:"canvas-toolbar__spinner","aria-hidden":"true"}):o.jsx(Ea,{})}):null,f&&g?o.jsx(da,{onExport:f,onTrace:g,disabled:!_e,isExporting:!!z}):null,o.jsx("button",{type:"button",className:"canvas-toolbar__button canvas-toolbar__button--danger",onClick:d,disabled:!ve,"aria-label":M("canvas.toolbar.clear"),title:M("canvas.toolbar.clear"),children:o.jsx(Pt,{})})]})}function va(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M8 12.5V7a2 2 0 0 1 4 0v4"}),o.jsx("path",{d:"M12 11V5a2 2 0 0 1 4 0v7"}),o.jsx("path",{d:"M16 12V8a2 2 0 0 1 4 0v5.5A6.5 6.5 0 0 1 13.5 20H12a6 6 0 0 1-4.24-1.76L4.7 15.18a1.7 1.7 0 0 1 2.4-2.4L9 14.68"})]})}function ba(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"m4 20 4.2-1.1L19.5 7.6a2.2 2.2 0 0 0-3.1-3.1L5.1 15.8 4 20Z"}),o.jsx("path",{d:"m14.5 6.5 3 3"})]})}function ga(){return o.jsx("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("rect",{x:"5",y:"5",width:"14",height:"14",rx:"2"})})}function xa(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M5 19 19 5"}),o.jsx("path",{d:"M10 5h9v9"})]})}function ya(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M6 4h12v16H6z"}),o.jsx("path",{d:"M9 8h6"}),o.jsx("path",{d:"M9 12h5"}),o.jsx("path",{d:"M9 16h3"})]})}function wa(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"m4 15 8.5-8.5a2.1 2.1 0 0 1 3 0l2 2a2.1 2.1 0 0 1 0 3L10 19H6.5L4 16.5V15Z"}),o.jsx("path",{d:"M10 19h10"}),o.jsx("path",{d:"m8.5 10.5 5 5"})]})}function ka(){return o.jsx("svg",{className:"canvas-toolbar__icon canvas-toolbar__icon--small",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("path",{d:"m7 14 5-5 5 5"})})}function Ca(){return o.jsx("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("path",{d:"M5 12.5 10 17 19 7"})})}function Pt(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M4 7h16"}),o.jsx("path",{d:"M9 7V5h6v2"}),o.jsx("path",{d:"M7 7l1 13h8l1-13"}),o.jsx("path",{d:"M10 11v5"}),o.jsx("path",{d:"M14 11v5"})]})}function At(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M9 7 5 11l4 4"}),o.jsx("path",{d:"M5 11h9a5 5 0 0 1 0 10h-2"})]})}function _a(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"m15 7 4 4-4 4"}),o.jsx("path",{d:"M19 11h-9a5 5 0 0 0 0 10h2"})]})}function Ma(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("rect",{x:"5",y:"5",width:"14",height:"14",rx:"2"}),o.jsx("path",{d:"M9 9h6v6H9z"})]})}function Ea(){return o.jsxs("svg",{className:"canvas-toolbar__icon",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",fill:"none"}),o.jsx("path",{d:"M4 8h4V4M12 4v4h4v4h4M4 12h4v4H4M12 12v4h-4M12 20v-4h4v4M20 16h-4",opacity:"0.55"})]})}function Sa({annotations:e,backgroundCleanup:t,backgroundCleanupPreview:n,canvasState:a,actions:r}){return o.jsx(ma,{activeTool:e.activeTool,eraserMode:e.eraserMode,onEraserModeChange:e.setEraserMode,style:{color:e.toolColor,strokeWidth:e.strokeWidth},onStyleChange:e.setStyle,hasAnnotations:e.hasAnnotations,hasExportableContent:!0,onToolChange:e.setTool,onClear:e.clear,onApply:()=>{r.handleApplyCanvas()},onRevertAnnotations:a.canRevertAnnotations?()=>{r.handleRevertAnnotations()}:void 0,onExport:l=>{r.handleExportCanvas(l)},onTrace:()=>{r.handleTraceCanvas()},onUndo:e.undo,onRedo:e.redo,canUndo:e.canUndo,canRedo:e.canRedo,onDeleteSelected:e.deleteSelected,selectedCount:e.selectedIds.length,onEditWithMask:()=>{r.handleEditWithMask()},canEditWithMask:e.boxes.length>0,isEditingWithMask:a.isEditingWithMask,onGptTransparency:()=>{r.handleGptTransparency()},isTransparencyRunning:a.isTransparencyRunning,isApplying:a.isApplying,isExporting:a.isExporting,exportBackground:a.exportBackground,exportMatteColor:a.exportMatteColor,onExportBackgroundChange:r.setExportBackground,onExportMatteColorChange:r.setExportMatteColor,cleanupTolerance:t.backgroundCleanupTolerance,cleanupSeedCount:t.backgroundCleanupSeeds.length,cleanupStats:t.backgroundCleanupStats,cleanupHasPreview:!!n,isCleanupPickingSeed:t.isBackgroundCleanupPickingSeed,isCleanupActive:t.isBackgroundCleanupActive,cleanupIntent:t.cleanupIntent,cleanupTool:t.cleanupTool,cleanupBrushRadius:t.cleanupBrushRadius,isCleanupPreviewing:t.isBackgroundCleanupPreviewing,isCleanupApplying:t.isBackgroundCleanupApplying,onCleanupAutoSample:t.handleBackgroundCleanupAutoSample,onCleanupPickSeed:t.handleBackgroundCleanupPickSeed,onCleanupIntentChange:t.setCleanupIntent,onCleanupToolChange:l=>{t.setCleanupTool(l),t.setIsBackgroundCleanupActive(!0)},onCleanupBrushRadiusChange:t.setCleanupBrushRadius,onCleanupToleranceChange:t.handleBackgroundCleanupToleranceChange,onCleanupPreview:()=>{t.runBackgroundCleanupPreview()},onCleanupApply:()=>{t.handleBackgroundCleanupApply()},onCleanupReset:t.handleBackgroundCleanupReset})}function Ba({currentImage:e,canvasDisplayImage:t,canvasOpen:n,displayQuality:a,displaySize:r,displayModel:l,onAfterDeleteFocus:c,onCopyPrompt:s}){const{t:d}=fe(),u=[e.elapsed!=null?`${e.elapsed}s`:null,e.usage?d("canvas.tokens",{n:e.usage.total_tokens??"?"}):null,jn(e.reasoningEffort),a,r,l].filter(m=>!!m).join(" · ");return o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"result-meta",children:u}),o.jsx(Tn,{imageOverride:n?t:null,onAfterDeleteFocus:c}),e.prompt?o.jsx(Pn,{prompt:e.prompt,onCopy:s}):null]})}function ja({zoom:e,onZoomIn:t,onZoomOut:n,onZoomReset:a}){const{t:r}=fe(),l=Math.round(e*100);return o.jsxs("div",{className:"canvas-toolbar__zoom",role:"group","aria-label":r("canvas.toolbar.zoomGroup"),children:[o.jsx("button",{type:"button",className:"canvas-toolbar__zoom-button",onClick:n,"aria-label":r("canvas.toolbar.zoomOut"),title:r("canvas.toolbar.zoomOut"),children:o.jsx(Ta,{})}),o.jsxs("button",{type:"button",className:"canvas-toolbar__zoom-value",onClick:a,"aria-label":r("canvas.toolbar.zoomReset"),title:r("canvas.toolbar.zoomReset"),children:[l,"%"]}),o.jsx("button",{type:"button",className:"canvas-toolbar__zoom-button",onClick:t,"aria-label":r("canvas.toolbar.zoomIn"),title:r("canvas.toolbar.zoomIn"),children:o.jsx(Pa,{})})]})}function Ta(){return o.jsx("svg",{className:"canvas-toolbar__icon canvas-toolbar__icon--small",viewBox:"0 0 24 24","aria-hidden":"true",children:o.jsx("path",{d:"M5 12h14"})})}function Pa(){return o.jsxs("svg",{className:"canvas-toolbar__icon canvas-toolbar__icon--small",viewBox:"0 0 24 24","aria-hidden":"true",children:[o.jsx("path",{d:"M12 5v14"}),o.jsx("path",{d:"M5 12h14"})]})}function Aa({zoom:e,modeLabel:t,closeLabel:n,blankCanvasLabel:a,blankCanvasAriaLabel:r,blankCanvasShortcut:l,blankCanvasBusy:c,shortcutHint:s,onZoomIn:d,onZoomOut:u,onZoomReset:m,onCreateBlankCanvas:f,onClose:g}){return o.jsxs("div",{className:"canvas-mode-topbar",children:[o.jsxs("div",{className:"canvas-mode-topbar__stack",children:[o.jsx("span",{className:"canvas-mode-topbar__label",children:t}),o.jsx(ja,{zoom:e,onZoomIn:d,onZoomOut:u,onZoomReset:m}),o.jsx("span",{className:"canvas-mode-topbar__shortcuts",children:s})]}),o.jsx("div",{className:"canvas-mode-topbar__center",children:o.jsxs("button",{type:"button",className:"canvas-mode-blank",onClick:f,disabled:c,"aria-label":r,title:r,children:[o.jsx("span",{"aria-hidden":"true",children:"+"}),o.jsx("span",{children:a}),o.jsx("kbd",{children:l})]})}),o.jsxs("button",{type:"button",className:"canvas-mode-close",onClick:g,"aria-label":n,children:[o.jsx("kbd",{children:"ESC"}),o.jsx("span",{children:n})]})]})}function ot(e,t,n){return Math.max(t,Math.min(n,e))}function Da({zoom:e,panX:t,panY:n}){const a=ot(100/Math.max(1,e),18,100),r=a/2,l=ot(50-t/40,r,100-r),c=ot(50-n/40,r,100-r);return{width:`${a}%`,height:`${a}%`,left:`${l}%`,top:`${c}%`}}function Ra({imageSrc:e,zoom:t,panX:n,panY:a,resetLabel:r,onReset:l}){return o.jsxs("button",{type:"button",className:"canvas-viewport-minimap",onClick:l,"aria-label":r,title:r,children:[o.jsx("img",{src:e,alt:"","aria-hidden":"true"}),o.jsx("span",{className:"canvas-viewport-minimap__window",style:Da({zoom:t,panX:n,panY:a}),"aria-hidden":"true"})]})}function We(e){return Math.min(1,Math.max(0,e))}function Na(e){return new Promise((t,n)=>{e.toBlob(a=>{a?t(a):n(new Error("mask_blob_unavailable"))},"image/png")})}async function Ia(e){const t=e.imageElement.naturalWidth,n=e.imageElement.naturalHeight;if(!t||!n)throw new Error("mask_source_size_unavailable");if(e.boxes.length===0)throw new Error("mask_boxes_required");const a=document.createElement("canvas");a.width=t,a.height=n;const r=a.getContext("2d");if(!r)throw new Error("mask_context_unavailable");r.fillStyle="rgba(0, 0, 0, 1)",r.fillRect(0,0,t,n),r.globalCompositeOperation="destination-out";for(const l of e.boxes){const c=We(l.x)*t,s=We(l.y)*n,d=We(l.width)*t,u=We(l.height)*n;d>0&&u>0&&r.fillRect(c,s,d,u)}return Na(a)}async function Oa(e){const t=e.naturalWidth,n=e.naturalHeight;if(!t||!n)throw new Error("image_source_size_unavailable");const a=document.createElement("canvas");a.width=t,a.height=n;const r=a.getContext("2d");if(!r)throw new Error("image_context_unavailable");return r.drawImage(e,0,0,t,n),a.toDataURL("image/png")}function gt(e){return new Promise((t,n)=>{const a=new FileReader;a.onerror=()=>n(new Error("mask_blob_read_failed")),a.onload=()=>t(String(a.result)),a.readAsDataURL(e)})}const La=`url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Ccircle cx='14' cy='14' r='8' fill='white' fill-opacity='0.16' stroke='black' stroke-width='3'/%3E%3Ccircle cx='14' cy='14' r='8' fill='none' stroke='white' stroke-width='1.5'/%3E%3Ccircle cx='14' cy='14' r='2' fill='white' stroke='black' stroke-width='1'/%3E%3C/svg%3E") 14 14, auto`,$a=`url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Ccircle cx='14' cy='14' r='8' fill='white' fill-opacity='0.18' stroke='black' stroke-width='3'/%3E%3Ccircle cx='14' cy='14' r='8' fill='none' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E") 14 14, auto`;function Ua(e){return e==="low"?"l":e==="medium"?"m":e==="high"?"h":e??null}function Wa(e){if(!e)return null;const t=e.match(/^(\d+)x\1$/);return t?`${t[1]}²`:e.replace("x","×")}function Fa(e){const t=e.url??e.image;if(!e.canvasVersion||!e.canvasMergedAt||t.startsWith("data:"))return t;const n=t.includes("?")?"&":"?";return`${t}${n}canvasMergedAt=${e.canvasMergedAt}`}function Ha(e){const t=e.canvasSourceFilename??e.filename;return t?`/generated/${encodeURIComponent(t)}`:e.url??e.image}async function st(e){const t=Ha(e);if(t.startsWith("data:image/png;"))return t;const n=new Image;return await new Promise((a,r)=>{n.onload=()=>a(),n.onerror=()=>r(new Error("clean_source_load_failed")),n.src=t}),Oa(n)}function ze(e,t){return!e.canvasVersion||e.prompt||!t?.prompt?e:{...e,prompt:t.prompt}}function Va(e,t){if(!t?.filename)return null;const n=e.find(a=>a.canvasVersion&&(a.canvasSourceFilename===t.filename||a.canvasEditableFilename===t.filename))??null;return n?ze(n,t):null}function Dt(e,t){if(An(e)){const n=e.images[0];if(!n)throw new Error("edit_empty_response");return{...n,prompt:t,reasoningEffort:e.reasoningEffort,provider:e.provider,quality:e.quality,size:e.size,moderation:e.moderation,model:e.model,usage:e.usage,alphaVerified:e.alphaVerified,alphaReason:e.alphaReason,kind:"edit",createdAt:Date.now()}}return{image:e.image,url:e.filename?`/generated/${e.filename}`:e.image,thumb:e.image,filename:e.filename,prompt:t,elapsed:e.elapsed,reasoningEffort:e.reasoningEffort,provider:e.provider,quality:e.quality,size:e.size,moderation:e.moderation,model:e.model,usage:e.usage,revisedPrompt:e.revisedPrompt??null,promptMode:e.promptMode??null,alphaVerified:e.alphaVerified,alphaReason:e.alphaReason,kind:"edit",createdAt:Date.now()}}const lt=new WeakMap;function Ka(e){if(!e.complete||!e.naturalWidth||!e.naturalHeight)return!1;const t=lt.get(e);if(t&&t.src===e.currentSrc&&t.width===e.naturalWidth&&t.height===e.naturalHeight)return t.result;const n=64,a=Math.min(n,e.naturalWidth),r=Math.min(n,e.naturalHeight),l=document.createElement("canvas");l.width=a,l.height=r;const c=l.getContext("2d",{willReadFrequently:!0});if(!c)return!1;try{c.drawImage(e,0,0,a,r);const s=c.getImageData(0,0,a,r).data;for(let d=3;d<s.length;d+=4)if(s[d]<250)return lt.set(e,{src:e.currentSrc,width:e.naturalWidth,height:e.naturalHeight,result:!0}),!0;return lt.set(e,{src:e.currentSrc,width:e.naturalWidth,height:e.naturalHeight,result:!1}),!1}catch{return!1}}function za(e,t){if(e.width!==t.width||e.height!==t.height||e.data.length!==t.data.length)throw new Error("cleanup_mask_size_mismatch")}function Rt(e,t){return{width:e,height:t,data:new Uint8Array(e*t)}}function pt(e){return{width:e.width,height:e.height,data:new Uint8Array(e.data)}}function qa(e,t){za(e,t);for(let n=0;n<e.data.length;n+=1)(t.data[n]??0)>0&&(e.data[n]=0)}function Pe(e,t){if(!e)return null;const n=pt(e);return t&&qa(n,t),n}function Xa(e,t){if(e.width!==t.width||e.height!==t.height)throw new Error("cleanup_mask_size_mismatch");const n=new ImageData(new Uint8ClampedArray(e.data),e.width,e.height);for(let a=0;a<t.data.length;a+=1)(t.data[a]??0)>0&&(n.data[a*4+3]=0);return n}const xt=[{x:0,y:0},{x:1,y:0},{x:0,y:1},{x:1,y:1}],Ga=1024;function Ya(e){return Math.max(0,Math.min(255,Math.round(e)))}function Qt(e,t,n){const a=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+a}function Za(e,t){return(t.length>0?t:xt).map(a=>{const r=Qt(a,e.width,e.height)*4;return{r:e.data[r]??0,g:e.data[r+1]??0,b:e.data[r+2]??0}})}function Ja(e,t,n,a){for(const r of n)if(Math.max(Math.abs((e[t]??0)-r.r),Math.abs((e[t+1]??0)-r.g),Math.abs((e[t+2]??0)-r.b))<=a)return!0;return!1}function Ae(e,t,n,a,r,l,c){if(e<0||e>=a.length||a[e])return r;const s=e*4;return(t.data[s+3]??0)===0?(a[e]=1,r):Ja(t.data,s,l,c)?(a[e]=1,n[r]=e,r+1):r}function ct(){return xt.map(e=>({...e}))}function Nt(e,t,n,a){if(e.width!==t.width||e.height!==t.height)throw new Error("cleanup_mask_size_mismatch");const{width:r,height:l}=t,c=r*l,s=new Uint8Array(c),d=new Int32Array(c),u=Za(t,n),m=Ya(a);let f=0;for(const g of n.length>0?n:xt)f=Ae(Qt(g,r,l),t,d,s,f,u,m);for(;f>0;){const g=d[--f];e.data[g]=255;const E=g%r;E>0&&(f=Ae(g-1,t,d,s,f,u,m)),E<r-1&&(f=Ae(g+1,t,d,s,f,u,m)),g>=r&&(f=Ae(g-r,t,d,s,f,u,m)),g<c-r&&(f=Ae(g+r,t,d,s,f,u,m))}}function Qa(e,t){const n=new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),a=Xa(n,t),r=t.data.reduce((l,c)=>l+(c>0?1:0),0);return{imageData:{width:e.width,height:e.height,data:a.data},stats:{width:e.width,height:e.height,removedPixels:r,removedPercent:t.data.length>0?r/t.data.length:0}}}function en(e){return new Promise((t,n)=>{e.toBlob(a=>{a?t(a):n(new Error("background_cleanup_blob_failed"))},"image/png")})}function tn(e,t){const n=e.naturalWidth,a=e.naturalHeight;if(n<=0||a<=0)throw new Error("background_cleanup_image_not_ready");const r=t&&t>0?Math.min(1,t/Math.max(n,a)):1,l=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(a*r)),s=document.createElement("canvas");s.width=l,s.height=c;const d=s.getContext("2d",{willReadFrequently:!0});if(!d)throw new Error("background_cleanup_context_failed");return d.drawImage(e,0,0,l,c),{canvas:s,context:d,width:l,height:c}}async function It({imageElement:e,mask:t}){try{const{canvas:n,context:a,width:r,height:l}=tn(e),c=a.getImageData(0,0,r,l),s=Qa({width:r,height:l,data:c.data},t),d=a.createImageData(r,l);d.data.set(s.imageData.data),a.putImageData(d,0,0);const u=await en(n);return{blob:u,dataUrl:await gt(u),stats:s.stats}}catch(n){throw n instanceof Error?n:new Error("background_cleanup_failed")}}async function er({imageElement:e,mask:t}){try{const{width:n,height:a}=tn(e,Ga),r=document.createElement("canvas");r.width=n,r.height=a;const l=r.getContext("2d");if(!l)throw new Error("background_cleanup_context_failed");const c=l.createImageData(n,a);let s=0;for(let u=0;u<a;u+=1)for(let m=0;m<n;m+=1){const f=Math.min(t.width-1,Math.floor(m/n*t.width)),g=Math.min(t.height-1,Math.floor(u/a*t.height));if((t.data[g*t.width+f]??0)===0)continue;const E=(u*n+m)*4;c.data[E]=168,c.data[E+1]=85,c.data[E+2]=247,c.data[E+3]=150,s+=1}l.putImageData(c,0,0);const d=await en(r);return{dataUrl:await gt(d),stats:{width:t.width,height:t.height,removedPixels:t.data.reduce((u,m)=>u+(m>0?1:0),0),removedPercent:t.data.length>0?s/(n*a):0}}}catch(n){throw n instanceof Error?n:new Error("background_cleanup_failed")}}function Ot(e){return{...e,seeds:e.seeds.map(t=>({intent:t.intent,point:{...t.point}})),brushStrokes:e.brushStrokes.map(t=>({...t,points:t.points.map(n=>({...n}))})),brushCursor:e.brushCursor?{...e.brushCursor}:null,removeMask:e.removeMask?pt(e.removeMask):null,preserveMask:e.preserveMask?pt(e.preserveMask):null}}function tr(){return`cleanup_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function Fe(e){return Math.max(0,Math.min(1,e))}function nr(e){const t=[],n=Math.max(0,e.radius*.55);for(const a of e.points)t.push({...a}),!(n<=0)&&t.push({x:Fe(a.x-n),y:a.y},{x:Fe(a.x+n),y:a.y},{x:a.x,y:Fe(a.y-n)},{x:a.x,y:Fe(a.y+n)});return t}function ar(e){const t=e.naturalWidth,n=e.naturalHeight;if(t<=0||n<=0)throw new Error("background_cleanup_image_not_ready");const a=document.createElement("canvas");a.width=t,a.height=n;const r=a.getContext("2d",{willReadFrequently:!0});if(!r)throw new Error("background_cleanup_context_failed");r.drawImage(e,0,0,t,n);const l=r.getImageData(0,0,t,n);return{width:t,height:n,data:l.data}}function rr({canvasOpen:e,currentImage:t,canvasDisplayImage:n,imageElementRef:a,canvasSourceImageRef:r,lastMergedDataUrlRef:l,setCanvasSaveState:c,setCanvasVersionItem:s,applyMergedCanvasImage:d,attachCanvasVersionReference:u,showToast:m,t:f}){const[g,E]=i.useState(!1),[C,L]=i.useState("remove"),[U,N]=i.useState("click"),[p,_]=i.useState("flat-flood-fill"),[S,y]=i.useState([]),[v,ee]=i.useState([]),[I,z]=i.useState(28),[Q,b]=i.useState(null),[W,T]=i.useState(null),[D,R]=i.useState(null),[te,oe]=i.useState(!1),[ie,ue]=i.useState(.018),[de,k]=i.useState(null),[G,se]=i.useState(!1),[B,j]=i.useState(!1),O=i.useRef(null),q=i.useRef(null),K=i.useRef(null),J=i.useRef({past:[],future:[]}),$=i.useRef(0),F=i.useRef(null),ne=i.useCallback(()=>Ot({intent:C,tool:U,engine:p,seeds:S,brushStrokes:v,brushRadius:ie,tolerance:I,removeMask:O.current,preserveMask:q.current,preview:Q,maskOverlay:W,stats:D,active:te,brushCursor:de}),[v,W,Q,S,D,I,de,ie,p,C,U,te]),H=i.useCallback(()=>{J.current={past:[...J.current.past.slice(-19),ne()],future:[]}},[ne]),M=i.useCallback(w=>{const x=Ot(w);O.current=x.removeMask,q.current=x.preserveMask,K.current=null,L(x.intent),N(x.tool),_(x.engine),y(x.seeds),ee(x.brushStrokes),ue(x.brushRadius),z(x.tolerance),b(x.preview),T(x.maskOverlay),R(x.stats),oe(x.active),k(x.brushCursor),se(!1),j(!1)},[]),V=i.useCallback(async()=>{if(!a.current||!t)return;const w=Pe(O.current,q.current);if(!w){T(null),R(null);return}const x=$.current+1;$.current=x,se(!0);try{const P=await er({imageElement:a.current,mask:w});if($.current!==x)return;T(P),R(P.stats)}catch{if($.current!==x)return;m(f("canvas.toolbar.cleanupFailed"),!0)}finally{$.current===x&&se(!1)}},[t,a,m,f]),X=i.useCallback(async(w,x,P)=>{if(!a.current)return;const ae=ar(a.current),Z=Rt(ae.width,ae.height),Se=Rt(ae.width,ae.height);for(const ge of w){const Ce=ge.intent==="remove"?Z:Se;Nt(Ce,ae,[ge.point],P)}for(const ge of x){const Ce=ge.intent==="remove"?Z:Se;Nt(Ce,ae,nr(ge),P)}O.current=Z,q.current=Se},[a]),he=i.useCallback(()=>{$.current+=1,F.current!=null&&(window.clearTimeout(F.current),F.current=null),O.current=null,q.current=null,K.current=null,J.current={past:[],future:[]},y([]),ee([]),b(null),T(null),R(null),oe(!1),k(null),se(!1),j(!1)},[]),ve=i.useCallback(()=>{const w=J.current.past.pop();return w?(J.current.future=[ne(),...J.current.future.slice(0,19)],M(w),!0):!1},[ne,M]),_e=i.useCallback(()=>{const w=J.current.future.shift();return w?(J.current.past=[...J.current.past.slice(-19),ne()],M(w),!0):!1},[ne,M]),be=i.useCallback(w=>{H();const x=[...S,{point:w,intent:C}];y(x),b(null),X(x,v,I).then(V)},[v,S,I,C,H,X,V]),Me=i.useCallback(()=>{H();const w=ct().map(x=>({point:x,intent:"remove"}));y(w),b(null),oe(!1),X(w,v,I).then(V)},[v,I,H,X,V]),ke=i.useCallback(()=>{H(),N("click"),oe(w=>!w)},[H]),le=i.useCallback(w=>{H(),F.current!=null&&window.clearTimeout(F.current),z(w),b(null),F.current=window.setTimeout(()=>{F.current=null,X(S,v,w).then(V)},180)},[v,S,H,X,V]),Ee=i.useCallback(async()=>{if(!a.current||!t)return null;let w=Pe(O.current,q.current);if(!w){const P=ct().map(ae=>({point:ae,intent:"remove"}));y(P),await X(P,v,I),w=Pe(O.current,q.current)}if(!w)return null;H();const x=$.current+1;$.current=x,se(!0);try{const P=await It({imageElement:a.current,mask:w});return $.current!==x?null:(b(P),T(null),R(P.stats),P)}catch{return $.current!==x||m(f("canvas.toolbar.cleanupFailed"),!0),null}finally{$.current===x&&se(!1)}},[v,I,t,a,H,X,m,f]),qe=i.useCallback(()=>{H(),he()},[H,he]),Y=i.useCallback(w=>{H();const x={id:tr(),intent:C,points:[{...w}],radius:ie};K.current=x,k(w),ee(P=>[...P,x])},[ie,C,H]),Xe=i.useCallback(w=>{const x=K.current;if(!x){k(w);return}x.points=[...x.points,{...w}],k(w),ee(P=>P.map(ae=>ae.id===x.id?{...x,points:x.points.map(Z=>({...Z}))}:ae)),X(S,v.map(P=>P.id===x.id?x:P),I).then(V)},[v,S,I,X,V]),Ge=i.useCallback(()=>{K.current=null,X(S,v,I).then(V)},[v,S,I,X,V]),Ye=i.useCallback(async()=>{if(!t||!a.current)return;const w=r.current??t;if(!w?.filename){m(f("canvas.toolbar.cleanupFailed"),!0);return}let x=Pe(O.current,q.current);if(!x){const P=ct().map(ae=>({point:ae,intent:"remove"}));y(P),await X(P,v,I),x=Pe(O.current,q.current)}if(x){j(!0),c("saving");try{H();const P=await It({imageElement:a.current,mask:x}),ae=n?.canvasVersion&&n.filename?await Ht(n.filename,{sourceFilename:w.canvasSourceFilename??w.filename,image:P.blob,prompt:w.prompt,pixelEdited:!0}):await ut({sourceFilename:w.canvasSourceFilename??w.filename,image:P.blob,prompt:w.prompt}),Z=ze(ae.item,w);l.current=P.dataUrl,s(Z),d(Z),await u(Z),c("saved"),b(null),T(null),R(P.stats),oe(!1),m(f("canvas.toolbar.cleanupApplied"))}catch{c("error"),m(f("canvas.toolbar.cleanupFailed"),!0)}finally{j(!1)}}},[d,u,v,I,n,r,t,a,l,H,X,c,s,m,f]),Ze=i.useCallback(()=>te?(K.current=null,oe(!1),k(null),!0):!1,[te]);return i.useEffect(()=>{const w=a.current;if(!w||!e){E(!1);return}const x=()=>E(Ka(w));if(w.complete)x();else return w.addEventListener("load",x),()=>w.removeEventListener("load",x)},[e,n?.canvasMergedAt,n?.filename,n?.image,n?.url,Q?.dataUrl,a]),{imageHasAlpha:g,backgroundCleanupSeeds:S,backgroundCleanupBrushStrokes:v,backgroundCleanupTolerance:I,backgroundCleanupPreview:Q,backgroundCleanupMaskOverlay:W,backgroundCleanupStats:D,cleanupIntent:C,setCleanupIntent:L,cleanupTool:U,setCleanupTool:N,cleanupClickEngine:p,setCleanupClickEngine:_,cleanupBrushRadius:ie,setCleanupBrushRadius:ue,cleanupBrushCursor:de,setCleanupBrushCursor:k,isBackgroundCleanupActive:te,setIsBackgroundCleanupActive:oe,isBackgroundCleanupPickingSeed:te&&U==="click",isBackgroundCleanupPreviewing:G,isBackgroundCleanupApplying:B,hasActiveCleanupStroke:!!K.current,canUndoBackgroundCleanup:J.current.past.length>0,canRedoBackgroundCleanup:J.current.future.length>0,resetBackgroundCleanup:he,undoBackgroundCleanup:ve,redoBackgroundCleanup:_e,addBackgroundCleanupClick:be,addBackgroundCleanupSeed:be,runBackgroundCleanupPreview:Ee,handleBackgroundCleanupAutoSample:Me,handleBackgroundCleanupPickSeed:ke,handleBackgroundCleanupToleranceChange:le,handleBackgroundCleanupReset:qe,handleBackgroundCleanupApply:Ye,handleBackgroundCleanupEscape:Ze,startBackgroundCleanupBrushStroke:Y,updateBackgroundCleanupBrushStroke:Xe,endBackgroundCleanupBrushStroke:Ge}}function Lt(e){return Math.min(1,Math.max(0,e))}function $t(e,t){const n=t.getBoundingClientRect();return{x:Lt((e.clientX-n.left)/n.width),y:Lt((e.clientY-n.top)/n.height)}}const or=.18,sr=.12;function lr(e){return{id:"selection-box",x:Math.min(e.start.x,e.current.x),y:Math.min(e.start.y,e.current.y),width:Math.abs(e.current.x-e.start.x),height:Math.abs(e.current.y-e.start.y),color:"#64c8ff",strokeWidth:2}}function mt(e,t,n=0){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}function nn(e){return{id:e.id,x:e.x,y:e.y,width:or,height:sr,color:e.color,strokeWidth:1}}function cr(e,t,n){const a=n.x-t.x,r=n.y-t.y,l=e.x-t.x,c=e.y-t.y,s=a*a+r*r;if(s===0)return Math.hypot(e.x-t.x,e.y-t.y);const d=Math.max(0,Math.min(1,(l*a+c*r)/s));return Math.hypot(e.x-(t.x+d*a),e.y-(t.y+d*r))}function ir(e,t,n){for(let a=1;a<t.points.length;a+=1)if(cr(e,t.points[a-1],t.points[a])<=n)return!0;return!1}function Ut(e,t){return e.x<=t.x+t.width&&e.x+e.width>=t.x&&e.y<=t.y+t.height&&e.y+e.height>=t.y}function ur(e,t){return e.points.some(n=>mt(n,t))}function it(e){const t=e.tolerance??.015;for(const n of[...e.memos].reverse())if(mt(e.point,nn(n),t))return Xt(n);for(const n of[...e.boxes].reverse())if(mt(e.point,n,t))return qt(n);for(const n of[...e.paths].reverse())if(ir(e.point,n,t))return zt(n);return null}function dr(e){const t=[];for(const n of e.annotations.paths)ur(n,e.box)&&t.push(zt(n));for(const n of e.annotations.boxes)Ut(n,e.box)&&t.push(qt(n));for(const n of e.annotations.memos)Ut(nn(n),e.box)&&t.push(Xt(n));return t}function hr({canvasOpen:e,canvasZoom:t,canvasPanX:n,canvasPanY:a,spaceHeld:r,canDragViewportWithSelect:l,isBackgroundCleanupActive:c,cleanupTool:s,annotationFrameRef:d,annotations:u,setCanvasPan:m,addBackgroundCleanupClick:f,startBackgroundCleanupBrushStroke:g,updateBackgroundCleanupBrushStroke:E,endBackgroundCleanupBrushStroke:C,setCleanupBrushCursor:L,setHoveredAnnotationId:U}){const N=i.useRef({mode:null,lastPoint:null,didMove:!1}),p=i.useRef({active:!1,startX:0,startY:0,basePanX:0,basePanY:0,pointerId:null}),[_,S]=i.useState(!1),y=b=>{b.currentTarget.setPointerCapture(b.pointerId),p.current={active:!0,startX:b.clientX,startY:b.clientY,basePanX:n,basePanY:a,pointerId:b.pointerId},S(!0)};return{viewportPanActive:_,resetPointerSession:()=>{N.current={mode:null,lastPoint:null,didMove:!1},p.current={active:!1,startX:0,startY:0,basePanX:0,basePanY:0,pointerId:null},S(!1),U(null)},handleAnnotationPointerDown:b=>{if(!e||me(b.target)||!d.current)return;const W=b.button===1;if(r||W){b.preventDefault(),y(b);return}b.preventDefault();const T=$t(b,d.current);if(c){s==="click"?f(T):(b.currentTarget.setPointerCapture(b.pointerId),g(T));return}if(u.activeTool==="select"){const D=it({point:T,paths:u.paths,boxes:u.boxes,memos:u.memos});if(D)b.shiftKey?u.toggleSelected(D):u.selectOne(D),u.startSelectedMove(),N.current={mode:"move",lastPoint:T,didMove:!1};else if(l&&t>1.01){y(b);return}else u.clearSelection(),u.startSelectionBox(T),N.current={mode:"box",lastPoint:T,didMove:!1};b.currentTarget.setPointerCapture(b.pointerId);return}if(u.activeTool==="memo"){u.createMemo(T),requestAnimationFrame(()=>{d.current?.querySelector(".canvas-memo--active")?.focus()});return}if(u.activeTool==="eraser"){if(u.eraserMode==="object"){const D=it({point:T,paths:u.paths,boxes:u.boxes,memos:u.memos});D&&u.eraseObjectAtPoint(D);return}b.currentTarget.setPointerCapture(b.pointerId),u.startEraserStroke(T);return}b.currentTarget.setPointerCapture(b.pointerId),u.startDrawing(T)},handleAnnotationPointerMove:b=>{if(!e||me(b.target)||!d.current)return;if(p.current.active){const T=b.clientX-p.current.startX,D=b.clientY-p.current.startY;m(p.current.basePanX+T,p.current.basePanY+D);return}const W=$t(b,d.current);if(c){U(null),s==="brush"?E(W):L(W);return}if(u.activeTool==="select"){if(N.current.mode===null){const T=it({point:W,paths:u.paths,boxes:u.boxes,memos:u.memos});U(T)}else U(null);if(N.current.mode==="move"&&N.current.lastPoint){const T={x:W.x-N.current.lastPoint.x,y:W.y-N.current.lastPoint.y};(Math.abs(T.x)>5e-4||Math.abs(T.y)>5e-4)&&(u.moveSelected(T),N.current.didMove=!0),N.current.lastPoint=W}else N.current.mode==="box"&&u.updateSelectionBox(W);return}if(u.activeTool!=="memo"){if(u.activeTool==="eraser"){u.eraserMode==="brush"&&u.updateEraserStroke(W);return}u.moveDrawing(W)}},handleAnnotationPointerUp:b=>{if(e&&!me(b.target)){if(p.current.active&&p.current.pointerId===b.pointerId){b.currentTarget.hasPointerCapture(b.pointerId)&&b.currentTarget.releasePointerCapture(b.pointerId),p.current={active:!1,startX:0,startY:0,basePanX:0,basePanY:0,pointerId:null},S(!1);return}if(b.currentTarget.hasPointerCapture(b.pointerId)&&b.currentTarget.releasePointerCapture(b.pointerId),c){s==="brush"&&C();return}if(u.activeTool==="select"){N.current.mode==="move"&&N.current.didMove&&u.commitSelectedMove(),N.current.mode==="box"&&u.selectionBox&&u.endSelectionBox(dr({box:lr(u.selectionBox),annotations:u.toPayload()})),N.current={mode:null,lastPoint:null,didMove:!1};return}if(u.activeTool!=="memo"){if(u.activeTool==="eraser"){u.eraserMode==="brush"&&u.endEraserStroke();return}u.endDrawing()}}},handleAnnotationPointerLeave:()=>{c&&L(null),U(null)}}}function fr({canvasOpen:e,canvasZoom:t,currentImage:n,annotations:a,undoBackgroundCleanup:r,redoBackgroundCleanup:l,handleBackgroundCleanupEscape:c,handleCloseCanvas:s,selectHistoryShortcutTarget:d,trashHistoryItem:u,permanentlyDeleteHistoryItemByShortcut:m,setCanvasZoom:f,resetCanvasZoom:g,onCreateBlankCanvas:E,isCreatingBlankCanvas:C}){const[L,U]=i.useState(!1);return i.useEffect(()=>{if(!e)return;const p=v=>{v.preventDefault()},_=v=>{v.ctrlKey&&v.preventDefault()},S={passive:!1,capture:!0},y={passive:!1};return window.addEventListener("wheel",_,S),window.addEventListener("gesturestart",p,y),window.addEventListener("gesturechange",p,y),window.addEventListener("gestureend",p,y),()=>{window.removeEventListener("wheel",_,S),window.removeEventListener("gesturestart",p,y),window.removeEventListener("gesturechange",p,y),window.removeEventListener("gestureend",p,y)}},[e]),i.useEffect(()=>{if(!e)return;const p=S=>{S.code==="Space"&&(me(S.target)||(L||U(!0),S.preventDefault()))},_=S=>{S.code==="Space"&&U(!1)};return window.addEventListener("keydown",p),window.addEventListener("keyup",_),()=>{window.removeEventListener("keydown",p),window.removeEventListener("keyup",_)}},[e,L]),i.useEffect(()=>{if(!e)return;const p=_=>{if(!_.defaultPrevented){if(me(_.target)){_.key==="Escape"&&(_.preventDefault(),_.target.blur(),a.focusMemo(null));return}if(_.key==="Escape"){if(_.preventDefault(),c())return;s();return}if(_.shiftKey&&!_.metaKey&&!_.ctrlKey&&!_.altKey&&_.key.toLowerCase()==="b"){_.preventDefault(),!C&&!_.repeat&&E();return}if((_.metaKey||_.ctrlKey)&&_.key.toLowerCase()==="z"){if(_.preventDefault(),_.shiftKey){if(l())return;a.redo();return}if(r())return;a.undo()}}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[a,a.focusMemo,a.redo,a.undo,e,s,c,C,E,l,r]),{spaceHeld:L,handleViewerKeyDown:p=>{if(me(p.target)){p.key==="Escape"&&(p.preventDefault(),p.target.blur(),a.focusMemo(null));return}if(e&&["1","2","3","4","5","6"].includes(p.key)){p.preventDefault();const _=["select","pen","box","arrow","memo","eraser"];a.setTool(_[Number(p.key)-1]);return}if(e&&p.key==="Escape"){if(p.preventDefault(),p.stopPropagation(),c())return;s();return}if(e&&p.key==="]"){p.preventDefault(),f(t+.1);return}if(e&&p.key==="["){p.preventDefault(),f(t-.1);return}if(e&&p.key==="0"){p.preventDefault(),g();return}if(p.key==="Delete"||p.key==="Backspace"){if(!n||p.target!==p.currentTarget)return;if(p.preventDefault(),p.shiftKey){m(n);return}u(n);return}p.key!=="ArrowLeft"&&p.key!=="ArrowRight"&&p.key!=="Home"&&p.key!=="End"||p.target===p.currentTarget&&(me(p.target)||(p.preventDefault(),p.key==="ArrowLeft"?d("previous"):p.key==="ArrowRight"?d("next"):p.key==="Home"?d("first"):p.key==="End"&&d("last")))}}}function pr(e,t){return new Promise((n,a)=>{e.toBlob(r=>{if(r){n(r);return}a(new Error("canvas_blob_unavailable"))},t)})}async function Oe(e){const t=document.createElement("canvas");t.width=e.imageElement.naturalWidth,t.height=e.imageElement.naturalHeight;const n=t.getContext("2d");if(!n)throw new Error("canvas_context_unavailable");e.background?.mode==="matte"&&(n.fillStyle=e.background.color,n.fillRect(0,0,t.width,t.height)),n.drawImage(e.imageElement,0,0,t.width,t.height);const a={width:t.width,height:t.height};for(const l of e.paths)ht(n,l,a);for(const l of e.boxes)ft(n,l,a,"committed");for(const l of e.memos)Yn(n,l,a);return{blob:await pr(t,"image/png"),dataUrl:t.toDataURL("image/png")}}const mr=["left","center","right"],vr=["top","middle","bottom"];function br(e,t){const n=mr[Math.min(2,Math.max(0,Math.floor(e*3)))],a=vr[Math.min(2,Math.max(0,Math.floor(t*3)))];return`${a==="middle"&&n==="center"?"center":`${a} ${n}`} area (x: ${Math.round(e*100)}%, y: ${Math.round(t*100)}% from top-left)`}function Wt(e){const t=e.map(n=>({...n,text:n.text.trim()})).filter(n=>n.text.length>0);return t.length===0?"":["The numbered notes below are temporary editing instructions written on the image. They are not image content: interpret each one to locate and apply the requested change (percentages are relative to image width and height).",...t.map((n,a)=>`${a+1}. At the ${br(n.x,n.y)}: ${n.text}`),"After applying every numbered instruction, remove all annotation markup. Do not render any annotation text, sticky notes, boxes, arrows, or markup in the output image. Where markup covered the image, show the underlying content reconstructed to match the surrounding texture, lighting, and perspective, with no residue, outline, or discoloration.","Keep everything not named in the numbered instructions exactly the same as the source image: composition, subjects, lighting, colors, and background."].join(`
|
|
3
|
+
`)}const Ft=18,De=12,gr="14px sans-serif";function Le(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function re(e){return Math.round(e*100)/100}function xr(e,t){if(e.points.length<2)return"";const n=e.points.map(s=>Ne(s,t)),a=n.map((s,d)=>`${d===0?"M":"L"}${re(s.x)} ${re(s.y)}`).join(" "),r=`stroke="${Le(e.color)}" stroke-width="${e.strokeWidth}" stroke-linecap="round" stroke-linejoin="round" fill="none"`,l=`<path d="${a}" ${r} />`;if(e.tool!=="arrow")return l;const c=Jt(n[n.length-2],n[n.length-1],e.strokeWidth).map(s=>`${re(s.x)},${re(s.y)}`).join(" ");return`${l}<polygon points="${c}" fill="${Le(e.color)}" />`}function yr(e,t){return`<rect x="${re(e.x*t.width)}" y="${re(e.y*t.height)}" width="${re(e.width*t.width)}" height="${re(e.height*t.height)}" fill="none" stroke="${Le(e.color)}" stroke-width="${e.strokeWidth}" />`}function wr(e,t){const n=e.trim();if(!n)return[""];const a=[];let r="";for(const l of n.split(/\s+/)){if(l.length>t){r&&(a.push(r),r="");for(let s=0;s<l.length;s+=t)a.push(l.slice(s,s+t));continue}const c=r?`${r} ${l}`:l;c.length<=t?r=c:(a.push(r),r=l)}return r&&a.push(r),a.length>0?a:[""]}function kr(e,t){const n=re(e.x*t.width),a=re(e.y*t.height),r=re(Math.min(260,Math.max(150,t.width*.22))),l=Math.max(8,Math.floor((r-De*2)/7.5)),c=wr(e.text,l),s=re(Math.max(52,De*2+c.length*Ft)),d=c.map((u,m)=>`<tspan x="${re(n+De)}" dy="${m===0?0:Ft}">${Le(u)}</tspan>`).join("");return`<g><rect x="${n}" y="${a}" width="${r}" height="${s}" rx="8" fill="rgba(255, 246, 179, 0.96)" stroke="rgba(44, 37, 12, 0.28)" stroke-width="1" /><text x="${re(n+De)}" y="${re(a+De+14)}" font="${gr}" font-family="sans-serif" font-size="14" fill="#2f2a13">${d}</text></g>`}function Cr(e){const{imageSize:t,annotations:n}=e,a=[`<image href="${Le(e.imageDataUrl)}" x="0" y="0" width="${t.width}" height="${t.height}" preserveAspectRatio="none" />`,...n.paths.map(r=>xr(r,t)),...n.boxes.map(r=>yr(r,t)),...n.memos.map(r=>kr(r,t))].filter(Boolean);return`<svg xmlns="http://www.w3.org/2000/svg" width="${t.width}" height="${t.height}" viewBox="0 0 ${t.width} ${t.height}">`+a.join("")+"</svg>"}const He=10,Ve=5.625;function _r(e){const t=e.width/e.height,n=He/Ve,a=t>=n?He:Ve*t,r=t>=n?He/t:Ve;return{x:(He-a)/2,y:(Ve-r)/2,w:a,h:r}}function Mr(e,t){const n=Math.min(2.6,t.w*.24);return{x:t.x+e.x*t.w,y:t.y+e.y*t.h,w:n,h:.55}}async function Er(e){const{default:t}=await Sn(async()=>{const{default:c}=await import("./pptxgen.es-OUNhQLEV.js");return{default:c}},__vite__mapDeps([0,1,2])),n=new t;n.layout="LAYOUT_16x9";const a=n.addSlide(),r=_r(e.imageSize);a.addImage({data:e.mergedDataUrl,...r});for(const c of e.memos){const s=c.text.trim();s&&a.addText(s,{...Mr(c,r),fontSize:11,color:"2F2A13",fill:{color:"FFF6B3"},line:{color:"2C250C",width:.5},align:"left",valign:"top",shrinkText:!0})}return await n.write({outputType:"blob"})}async function Sr(e){return(await Oe(e)).blob}function Br(e={},t=new Date){const n=t.toISOString().slice(0,19).replace(/[-:T]/g,""),a=e.matte?"-flat":"";return`canvas-export-${n}${a}.${e.format??"png"}`}async function jr(e,t,n){const a={width:t.imageElement.naturalWidth,height:t.imageElement.naturalHeight};if(e==="svg"){const c=await Oe({...t,paths:[],boxes:[],memos:[]}),s=Cr({imageDataUrl:c.dataUrl,imageSize:a,annotations:n});return new Blob([s],{type:"image/svg+xml"})}const r=await Oe(t);if(e==="png")return r.blob;const l=await Oe({...t,memos:[]});return Er({mergedDataUrl:l.dataUrl,imageSize:a,memos:n.memos})}function Tr(e,t){const n=URL.createObjectURL(e);try{const a=document.createElement("a");a.href=n,a.download=t,a.click()}finally{URL.revokeObjectURL(n)}}function Pr({imageElementRef:e,currentImage:t,canvasDisplayImage:n,canvasSourceImageRef:a,lastMergedDataUrlRef:r,lastCleanDataUrlRef:l,canvasVersionItem:c,annotations:s,exportBackground:d,exportMatteColor:u,quality:m,format:f,moderation:g,provider:E,imageModel:C,reasoningEffort:L,promptMode:U,webSearchEnabled:N,getResolvedSize:p,setCanvasVersionItem:_,setCanvasSaveState:S,setIsApplying:y,setIsExporting:v,setIsEditingWithMask:ee,setIsTransparencyRunning:I,applyMergedCanvasImage:z,addGeneratedHistoryItem:Q,attachCanvasVersionReference:b,closeCanvas:W,resetCanvasSession:T,showToast:D,t:R}){const te=i.useCallback(async()=>{if(!e.current||!t)return null;const B=a.current??t;if(!B?.filename)return D(R("canvas.version.failed"),!0),null;y(!0),S("saving");try{const j=await Oe({imageElement:e.current,paths:s.paths,boxes:s.boxes,memos:s.memos});r.current=j.dataUrl;const O=await st(B);l.current=O;const q=c?.filename?await Ht(c.filename,{image:j.blob,sourceFilename:B.canvasSourceFilename??B.filename,prompt:B.prompt}):await ut({sourceFilename:B.filename,image:j.blob,prompt:B.prompt}),K=s.toPayload(),J=!c||!!c.annotationOnly,$=await Dn(q.item.filename,K,J),F=ze($.item,B);_(F),z(F),await b(F,O);const ne=Wt(s.memos),H=`canvas-annotations:${B.canvasSourceFilename??B.filename}`,{insertPromptToComposer:M,removeInsertedPromptFromComposer:V}=A.getState();return V(H),ne&&M({id:H,name:R("canvas.annotationInstructionsChip"),text:ne,placement:"after"}),await Vt(B.filename).catch(()=>{}),s.resetLocal(),s.markSaved(),S("saved"),D(R("canvas.version.saved")),F}catch{return S("error"),D(R("canvas.version.failed"),!0),null}finally{y(!1)}},[s,z,b,a,c?.filename,t,e,r,l,S,_,y,D,R]);return{saveCanvasVersionAndUseReference:te,handleApplyCanvas:async()=>{await te()},handleRevertAnnotations:async()=>{if(!(!c?.filename||!c.annotationsBaked)&&!(!c.annotationOnly&&!window.confirm(R("canvas.revert.mixedConfirm")))){y(!0),S("saving");try{const B=await Rn(c.filename),j=a.current??t??c,O=ze(B.item,j);if(_(O),z(O),r.current=null,B.annotationOnly&&B.snapshot){s.load(B.snapshot);const q=O.canvasSourceFilename??j.filename;q&&await Kt(q,B.snapshot),D(R("canvas.revert.restored"))}else s.resetLocal(),D(R("canvas.revert.completed"));S("saved")}catch{S("error"),D(R("canvas.revert.failed"),!0)}finally{y(!1)}}},handleCloseCanvas:async()=>{(s.hasAnnotations||s.isDirty)&&!await te()||(W(),T())},handleExportCanvas:async(B="png")=>{if(!(!e.current||!t)){v(!0);try{const j=d==="matte",O=await jr(B,{imageElement:e.current,paths:s.paths,boxes:s.boxes,memos:s.memos,background:j?{mode:"matte",color:u}:{mode:"alpha"}},{paths:s.paths,boxes:s.boxes,memos:s.memos});Tr(O,Br({matte:j,format:B}))}catch{D(R("canvas.toolbar.exportFailed"),!0)}finally{v(!1)}}},handleTraceCanvas:async()=>{if(!(!e.current||!t?.filename)){v(!0);try{const B=d==="matte",j=await Sr({imageElement:e.current,paths:s.paths,boxes:s.boxes,memos:s.memos,background:B?{mode:"matte",color:u}:{mode:"alpha"}}),{item:O}=await ut({sourceFilename:a.current?.filename??t.filename,image:j,prompt:t.prompt});A.getState().setVectorizeTarget(O)}catch(B){const j=B instanceof Error?B.message:R("canvas.toolbar.tracePrepareFailed");D(j,!0)}finally{v(!1)}}},handleEditWithMask:async()=>{if(!(!e.current||!n||s.boxes.length===0)){ee(!0);try{const B=s.memos;let j=l.current;if(E==="nai"){D(R("toast.naiEditUnsupported"),!0);return}if(s.isDirty||s.hasAnnotations){if(!await te())return;j=l.current}j||(j=await st(a.current??n));const O=s.boxes.filter(M=>s.selectedIds.some(V=>pe(V,"box",M.id))),q=await Ia({imageElement:e.current,boxes:O.length>0?O:s.boxes}),K=Wt(B),$=[(n.prompt??t?.prompt??"").trim(),K].filter(Boolean).join(`
|
|
4
|
+
|
|
5
|
+
`);if(!$.trim()){D(R("toast.noPromptToFork"),!0);return}const F=n.size??t?.size??null,ne=F&&/^\d+x\d+$/.test(F)?F:p(),H=await Ct({image:j,mask:await gt(q),prompt:$,quality:m,size:ne,format:f,moderation:g,provider:E,n:1,model:C,reasoningEffort:L,mode:U,webSearchEnabled:N});await Q(Dt(H,$))}catch(B){const j=B.code;D(R(j==="EDIT_MASK_NOT_SUPPORTED"?"canvas.toolbar.editMaskUnsupported":"canvas.toolbar.editMaskFailed"),!0)}finally{ee(!1)}}},handleGptTransparency:async()=>{if(!(!n&&!t)){I(!0);try{const B=await st(n??a.current??t),j=n?.size??t?.size??null,O=j&&/^\d+x\d+$/.test(j)?j:p(),q=await Ct({image:B,prompt:"Remove the background completely. Output a PNG with a fully transparent background (real alpha channel). Keep the subject pixel-identical — do not redraw, restyle, or crop the subject.",quality:"high",size:O,format:f,moderation:g,provider:"oauth",n:1,mode:"direct",webSearchEnabled:!1}),K=Dt(q,n?.prompt??t?.prompt??"transparent background");await Q(K),D(K.alphaVerified?R("canvas.toolbar.transparencyVerified"):K.alphaReason==="undetectable"?R("canvas.toolbar.transparencyUnverifiable"):R("canvas.toolbar.transparencyNoAlpha"),!K.alphaVerified)}catch(B){console.error("[canvas] gpt transparency failed",B);const j=B.code;D(j?`${R("canvas.toolbar.transparencyFailed")} (${j})`:R("canvas.toolbar.transparencyFailed"),!0)}finally{I(!1)}}}}}function Rr(e){const t=A(h=>h.currentImage),n=A(h=>h.history),a=A(h=>h.importLocalImageToHistory),[r,l]=i.useState(!1),c=A(h=>{const ce=h.multimodePreviewFlightId;return ce?h.multimodeSequences[ce]??null:null}),s=A(h=>h.selectHistoryShortcutTarget),d=A(h=>h.trashHistoryItem),u=A(h=>h.permanentlyDeleteHistoryItemByShortcut),m=A(h=>h.markGeneratedResultsSeen),f=A(h=>h.activeGenerations),g=A(h=>h.quality),E=A(h=>h.format),C=A(h=>h.moderation),L=A(h=>h.provider),U=A(h=>h.imageModel),N=A(h=>h.reasoningEffort),p=A(h=>h.promptMode),_=A(h=>h.webSearchEnabled),S=A(h=>h.getResolvedSize),y=A(h=>h.showToast),v=A(h=>h.canvasOpen),ee=A(h=>h.openCanvas),I=A(h=>h.closeCanvas),z=A(h=>h.canvasZoom),Q=A(h=>h.canvasPanX),b=A(h=>h.canvasPanY),W=A(h=>h.setCanvasPan),T=A(h=>h.setCanvasZoom),D=A(h=>h.resetCanvasZoom),R=A(h=>h.canvasExportBackground),te=A(h=>h.canvasExportMatteColor),oe=A(h=>h.setCanvasExportBackground),ie=A(h=>h.setCanvasExportMatteColor),ue=A(h=>h.applyMergedCanvasImage),de=A(h=>h.addGeneratedHistoryItem),k=A(h=>h.attachCanvasVersionReference),{t:G}=fe(),{creatingBlankCanvas:se,createBlankCanvas:B}=Nn(),j=i.useRef(null),O=i.useRef(null),q=i.useRef(null),K=i.useRef(null),J=i.useRef(null),$=i.useRef(null),F=i.useRef(null),ne=i.useRef(null),H=i.useRef(null),[M,V]=i.useState(null),[X,he]=i.useState("idle"),[ve,_e]=i.useState(!1),[be,Me]=i.useState(!1),[ke,le]=i.useState(!1),[Ee,qe]=i.useState(!1),Y=Gn(),Xe=()=>{t?.prompt&&(navigator.clipboard.writeText(t.prompt),y(G("toast.promptCopied")))},Ge=Ua(t?.quality),Ye=Wa(t?.size),Ze=In(t?.model),w=t?.filename??t?.url??t?.image??null,x=Va(n,t),P=v?M??x??t:t,ae=P?Fa(P):null,Z=rr({canvasOpen:v,currentImage:t,canvasDisplayImage:P,imageElementRef:O,canvasSourceImageRef:F,lastMergedDataUrlRef:ne,setCanvasSaveState:he,setCanvasVersionItem:V,applyMergedCanvasImage:ue,attachCanvasVersionReference:k,showToast:y,t:G}),{imageHasAlpha:Se,backgroundCleanupSeeds:ge,backgroundCleanupPreview:Ce,backgroundCleanupMaskOverlay:yt,backgroundCleanupBrushStrokes:an,cleanupTool:rn,cleanupBrushRadius:on,cleanupBrushCursor:sn,isBackgroundCleanupActive:Be}=Z,Je=Z.backgroundCleanupPreview?.dataUrl??ae,Qe=()=>{F.current=null,J.current=null,$.current!=null&&(window.clearTimeout($.current),$.current=null),V(null),he("idle"),Z.resetBackgroundCleanup(),ne.current=null,H.current=null,kn()};i.useEffect(()=>{if(!v){K.current=w,Qe();return}if(K.current===null){K.current=w,F.current=t,V(x);return}K.current!==w&&(Y.resetLocal(),Qe(),F.current=t,V(x),K.current=w)},[Y.resetLocal,v,t,w,x]),i.useEffect(()=>{!v||!t||F.current||(F.current=t,V(x))},[v,t,x]),i.useEffect(()=>{if(!v||!t?.filename||t.canvasVersion)return;const h=t.filename;if(J.current===h)return;J.current=h;let ce=!1;return On(h).then(je=>{!ce&&je.annotations&&Y.load(je.annotations)}).catch(()=>{}),()=>{ce=!0}},[Y.load,v,t?.canvasVersion,t?.filename]),i.useEffect(()=>{if(!v||!t?.filename||t.canvasVersion||!Y.isDirty)return;const h=t.filename;return $.current!=null&&window.clearTimeout($.current),$.current=window.setTimeout(()=>{const ce=Y.toPayload();(Y.hasAnnotations?Kt(h,ce):Vt(h)).then(()=>Y.markSaved()).catch(()=>{})},500),()=>{$.current!=null&&(window.clearTimeout($.current),$.current=null)}},[Y,Y.hasAnnotations,Y.isDirty,v,t?.canvasVersion,t?.filename]);const ln=h=>{me(h.target)||(m(),h.currentTarget.focus())},cn=i.useCallback(()=>{window.requestAnimationFrame(()=>q.current?.focus())},[]),un=h=>{if(v){if(h.preventDefault(),h.ctrlKey){T(z-h.deltaY*.01);return}W(Q-h.deltaX,b-h.deltaY)}},dn=i.useCallback(h=>{Array.from(h.dataTransfer.types).includes("Files")&&(h.preventDefault(),l(ce=>ce||!0))},[]),hn=i.useCallback(h=>{h.currentTarget.contains(h.relatedTarget)||l(!1)},[]),fn=i.useCallback(async h=>{if(!Array.from(h.dataTransfer.types).includes("Files"))return;h.preventDefault(),l(!1);const ce=Array.from(h.dataTransfer.files).filter(je=>/^image\/(png|jpeg|webp)$/.test(je.type));ce.length!==0&&await a(ce[0])},[a]),{handleApplyCanvas:pn,handleRevertAnnotations:mn,handleCloseCanvas:wt,handleExportCanvas:vn,handleTraceCanvas:bn,handleEditWithMask:gn,handleGptTransparency:xn}=Pr({imageElementRef:O,currentImage:t,canvasDisplayImage:P,canvasSourceImageRef:F,lastMergedDataUrlRef:ne,lastCleanDataUrlRef:H,canvasVersionItem:M,annotations:Y,exportBackground:R,exportMatteColor:te,quality:g,format:E,moderation:C,provider:L,imageModel:U,reasoningEffort:N,promptMode:p,webSearchEnabled:_,getResolvedSize:S,setCanvasVersionItem:V,setCanvasSaveState:he,setIsApplying:_e,setIsExporting:Me,setIsEditingWithMask:le,setIsTransparencyRunning:qe,applyMergedCanvasImage:ue,addGeneratedHistoryItem:de,attachCanvasVersionReference:k,closeCanvas:I,resetCanvasSession:Qe,showToast:y,t:G}),{spaceHeld:et,handleViewerKeyDown:yn}=fr({canvasOpen:v,canvasZoom:z,currentImage:t,annotations:Y,undoBackgroundCleanup:Z.undoBackgroundCleanup,redoBackgroundCleanup:Z.redoBackgroundCleanup,handleBackgroundCleanupEscape:Z.handleBackgroundCleanupEscape,handleCloseCanvas:wt,selectHistoryShortcutTarget:s,trashHistoryItem:d,permanentlyDeleteHistoryItemByShortcut:u,setCanvasZoom:T,resetCanvasZoom:D,onCreateBlankCanvas:B,isCreatingBlankCanvas:se}),tt=v&&z>1.01&&Y.activeTool==="select"&&!Be,[kt,wn]=i.useState(null),{viewportPanActive:nt,resetPointerSession:kn,handleAnnotationPointerDown:Cn,handleAnnotationPointerMove:_n,handleAnnotationPointerUp:Mn,handleAnnotationPointerLeave:En}=hr({canvasOpen:v,canvasZoom:z,canvasPanX:Q,canvasPanY:b,spaceHeld:et,canDragViewportWithSelect:tt,isBackgroundCleanupActive:Be,cleanupTool:rn,annotationFrameRef:j,annotations:Y,setCanvasPan:W,addBackgroundCleanupClick:Z.addBackgroundCleanupClick,startBackgroundCleanupBrushStroke:Z.startBackgroundCleanupBrushStroke,updateBackgroundCleanupBrushStroke:Z.updateBackgroundCleanupBrushStroke,endBackgroundCleanupBrushStroke:Z.endBackgroundCleanupBrushStroke,setCleanupBrushCursor:Z.setCleanupBrushCursor,setHoveredAnnotationId:wn});return o.jsxs("main",{className:`canvas${v?" canvas--mode-open":""}${r?" canvas--drop-active":""}${et?" canvas--space-held":""}${nt?" canvas--pan-active":""}${tt?" canvas--zoom-hand":""}`,onDragOver:dn,onDragLeave:hn,onDrop:fn,children:[r?o.jsx("div",{className:"canvas__drop-overlay","aria-hidden":!0,children:o.jsx("span",{className:"canvas__drop-hint",children:G("canvas.drop.hint")})}):null,v&&o.jsx(Aa,{zoom:z,modeLabel:G("canvas.modeTitle"),closeLabel:G("canvas.close"),blankCanvasLabel:G("canvas.blank.title"),blankCanvasAriaLabel:`${G(se?"canvas.blank.creating":"canvas.blank.create")} (Shift+B)`,blankCanvasShortcut:"Shift+B",blankCanvasBusy:se,shortcutHint:G("canvas.toolbar.zoomShortcutHint"),onZoomIn:()=>T(z+.1),onZoomOut:()=>T(z-.1),onZoomReset:D,onCreateBlankCanvas:()=>{B()},onClose:()=>{wt()}}),o.jsx("div",{className:`progress-bar${f>0?" active":""}`}),c?o.jsx(Ln,{}):t?o.jsxs("div",{ref:q,className:"result-container visible",tabIndex:0,onMouseDown:ln,onWheel:un,onKeyDown:yn,"aria-label":G("canvas.imageViewerAria"),children:[o.jsx(aa,{annotationFrameRef:j,imageElementRef:O,frameClassName:`canvas-annotation-frame${(Se||Ce)&&v?" canvas-annotation-frame--alpha":""}${Be&&v?" canvas-annotation-frame--cleanup-picking":""}${yt&&v?" canvas-annotation-frame--cleanup-mask":""}`,frameStyle:{cursor:nt?"grabbing":et||tt?"grab":v?Be?"crosshair":Y.activeTool==="select"?kt?"move":"default":Y.activeTool==="eraser"?Y.eraserMode==="object"?La:$a:"crosshair":"zoom-in",transform:v?`translate(${Q}px, ${b}px) scale(${z})`:void 0,transition:v&&!nt?"transform 0.2s ease":void 0},imageKey:`${P?.filename??P?.url??P?.image}:${P?.canvasMergedAt??""}`,imageSrc:Je??t.image,fallbackImage:t.image,alt:G("canvas.resultAlt"),canvasOpen:v,maskOverlayUrl:yt?.dataUrl??null,cleanupLayer:o.jsx(sa,{seeds:ge,brushStrokes:an,brushCursor:sn,brushRadius:on,active:Be}),annotations:Y,hoveredAnnotationId:kt,onOpenCanvas:ee,onPointerDown:Cn,onPointerMove:_n,onPointerUp:Mn,onPointerLeave:En}),v&&Je?o.jsx(Ra,{imageSrc:Je,zoom:z,panX:Q,panY:b,resetLabel:G("canvas.toolbar.zoomReset"),onReset:D}):null,v&&o.jsx(Sa,{annotations:Y,backgroundCleanup:Z,backgroundCleanupPreview:Ce,canvasState:{exportBackground:R,exportMatteColor:te,isApplying:ve,isExporting:be,isEditingWithMask:ke,isTransparencyRunning:Ee,canRevertAnnotations:!!M?.annotationsBaked},actions:{handleApplyCanvas:pn,handleRevertAnnotations:mn,handleExportCanvas:vn,handleTraceCanvas:bn,handleEditWithMask:gn,handleGptTransparency:xn,setExportBackground:oe,setExportMatteColor:ie}}),v&&X!=="idle"?o.jsx("div",{className:`canvas-save-state canvas-save-state--${X}`,children:G(X==="saving"?"canvas.version.saving":X==="saved"?"canvas.version.saved":"canvas.version.failed")}):null,o.jsx(Ba,{currentImage:t,canvasDisplayImage:P,canvasOpen:v,displayQuality:Ge,displaySize:Ye,displayModel:Ze,onAfterDeleteFocus:cn,onCopyPrompt:Xe})]}):null]})}export{Rr as CanvasModeWorkspace};
|