diff --git a/README-zh.md b/README-zh.md
index ff21db5..05cd77d 100644
--- a/README-zh.md
+++ b/README-zh.md
@@ -1,6 +1,6 @@
> 🌐 在线体验: http://39.105.110.128:0721 , 这是我一个空闲的2c2g3m的云主机没有cdn
>
-# Stable-Diffusion-WebUI无边图像浏览
+# 无边图像浏览
[查看近期更新](https://github.com/zanllp/sd-webui-infinite-image-browsing/wiki/Change-log)
@@ -69,6 +69,27 @@
### 🧠 Topic/Tag 分析
- 标签关系图可视化与主题聚类联动。
+### 🗂️ 智能整理
+AI 驱动的自动文件整理
+
+- **语义聚类**:基于 AI 向量化技术,自动将语义相似的图片分组
+- **智能命名**:AI 自动生成有意义的文件夹名称,支持多语言
+- **预览确认**:执行前可预览整理方案,支持跳过或调整特定分组
+- **后台处理**:大文件夹在后台异步处理,不影响继续使用
+- **灵活配置**:支持移动/复制、设置最小聚类大小、递归处理子文件夹
+
+**使用方法:**
+1. 进入需要整理的文件夹
+2. 点击地址栏中的「智能整理」按钮
+3. 配置选项(目标文件夹、最小聚类大小等)
+4. 等待 AI 分析完成
+5. 预览整理方案
+6. 确认执行
+
+> **前置条件**:与自然语言搜索相同 - 需要配置 `OPENAI_BASE_URL`、`OPENAI_API_KEY`,以及 Python 依赖 `numpy`、`hnswlib`
+>
+> 📸 查看下方[智能整理预览](#智能整理-1)获取截图和视频演示
+
### 🌐 多语言支持
- 目前支持简体中文/繁体中文/英文/德语。
- 如果您希望添加新的语言,请参考 [i18n.ts](https://github.com/zanllp/sd-webui-infinite-image-browsing/blob/main/vue/src/i18n/zh-hans.ts) 并提交相关的代码。
@@ -173,6 +194,20 @@ https://user-images.githubusercontent.com/25872019/230768207-daab786b-d4ab-489f-
+## 智能整理
+
+AI 驱动的自动文件整理 - 自动将相似图片分组并创建有意义的文件夹。
+
+
+
+
+
+
+
+
+
+https://github.com/user-attachments/assets/c1279556-d255-4e71-b230-48523a4859bf
+
## 自然语言分类&搜索(实验性)
这个功能用于把图片按**提示词语义相似度**自动分组(主题),并支持用一句自然语言做**语义检索**(类似 RAG 的召回阶段)。
diff --git a/README.md b/README.md
index 9c746a6..ff75073 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
[Installation / Running](#installation--running)
-# Stable Diffusion webui Infinite Image Browsing
+# Infinite Image Browsing (IIB)
### Software Support and Development Progress Overview
| Software | Support | Provided by |
@@ -84,6 +84,27 @@ If you would like to support more software, please refer to: [parsers](https://g
### 🧠 Topic/Tag Analysis
- Tag relationship graph visualization for topic clusters.
+### 🗂️ Smart Organize
+AI-powered automatic file organization
+
+- **Semantic Clustering**: Automatically groups similar images based on prompt semantics using AI embeddings
+- **Auto-Generated Folder Names**: AI generates meaningful folder names in your preferred language
+- **Preview Before Action**: Review the proposed organization before confirming - skip or adjust as needed
+- **Background Processing**: Large folders are processed in the background, you can continue working
+- **Flexible Options**: Choose between move or copy, set minimum cluster size, include subfolders recursively
+
+**How to use:**
+1. Navigate to the folder you want to organize
+2. Click the "Smart Organize" button in the address bar
+3. Configure options (target folder, min cluster size, etc.)
+4. Wait for AI analysis to complete
+5. Preview the proposed organization
+6. Confirm to execute
+
+> **Requirements**: Same as Topic Search - requires `OPENAI_BASE_URL`, `OPENAI_API_KEY`, and Python dependencies `numpy`, `hnswlib`
+>
+> 📸 See [Smart Organize Preview](#smart-organize) below for screenshots and video demo.
+
### 🌐 Multilingual Support
- Currently supports Simplified Chinese/Traditional Chinese/English/German.
- If you would like to add a new language, please refer to [i18n.ts](https://github.com/zanllp/sd-webui-infinite-image-browsing/blob/main/vue/src/i18n/zh-hans.ts) and submit the relevant code.
@@ -190,6 +211,20 @@ https://user-images.githubusercontent.com/25872019/230768207-daab786b-d4ab-489f-
+## Smart Organize
+
+AI-powered automatic file organization - groups similar images and creates meaningful folders.
+
+
+
+
+
+
+
+
+
+https://github.com/user-attachments/assets/c1279556-d255-4e71-b230-48523a4859bf
+
## Natural Language Categorization & Search (Experimental)
This feature groups images by **semantic similarity of prompts** and supports **natural-language retrieval** (similar to the retrieval stage in RAG).
diff --git a/change.log.md b/change.log.md
index 64a3abb..af4ac94 100644
--- a/change.log.md
+++ b/change.log.md
@@ -1,5 +1,42 @@
[跳到中文](#中文)
-# English
+# English
+
+## 2026-02-17
+### 🗂️ Smart Organize - AI-Powered File Organization \
+
+Automatically organize scattered images into meaningful folders using AI.
+
+**Features:**
+- **Semantic Clustering**: Groups images based on prompt similarity using AI embeddings
+- **Auto-Generated Names**: AI creates meaningful folder names in your preferred language
+- **Preview & Confirm**: Review the proposed organization before executing - skip or adjust any cluster
+- **Background Processing**: Large folders process asynchronously without blocking your workflow
+- **Flexible Options**: Move or copy, set minimum cluster size, include subfolders recursively
+
+**How to use:**
+1. Navigate to the folder you want to organize
+2. Click **"Smart Organize"** button in the address bar
+3. Configure options in the modal
+4. Wait for AI analysis (embedding → clustering → title generation)
+5. Preview the result - hover over filenames to see image thumbnails
+6. Confirm to execute
+
+
+
+
+
+
+
+
+
+https://github.com/user-attachments/assets/c1279556-d255-4e71-b230-48523a4859bf
+
+> Requirements: Same as Topic Search - `OPENAI_BASE_URL`, `OPENAI_API_KEY`, Python deps `numpy`, `hnswlib`
+
+### Flatten Folder
+New feature to move all files from subfolders to the current folder with conflict detection.
+
+
## 2026-02-01
### Drag-and-drop into folders and safer move/copy
@@ -654,6 +691,42 @@ Triggered under the same circumstances as above, there will be a button to updat
# 中文
+## 2026-02-17
+### 🗂️ 智能整理 - AI 驱动的文件整理
+
+使用 AI 自动将零散图片整理到有意义的文件夹中。
+
+**功能特性:**
+- **语义聚类**:基于 AI 向量化技术,自动将语义相似的图片分组
+- **智能命名**:AI 自动生成有意义的文件夹名称,支持多语言
+- **预览确认**:执行前可预览整理方案,支持跳过或调整特定分组
+- **后台处理**:大文件夹在后台异步处理,不影响继续使用
+- **灵活配置**:支持移动/复制、设置最小聚类大小、递归处理子文件夹
+
+**使用方法:**
+1. 进入需要整理的文件夹
+2. 点击地址栏中的「智能整理」按钮
+3. 在弹窗中配置选项
+4. 等待 AI 分析(向量化 → 聚类 → 生成标题)
+5. 预览整理方案 - 鼠标悬停文件名可查看缩略图
+6. 确认执行
+
+
+
+
+
+
+
+
+
+https://github.com/user-attachments/assets/c1279556-d255-4e71-b230-48523a4859bf
+
+> 前置条件:与自然语言搜索相同 - `OPENAI_BASE_URL`、`OPENAI_API_KEY`、Python 依赖 `numpy`、`hnswlib`
+
+### 压平文件夹
+新功能:将所有子文件夹中的文件移动到当前文件夹,支持文件名冲突检测。
+
+
## 2026-02-01
### 支持拖拽到文件夹与更安全的移动/复制
- 支持拖拽文件到文件夹,并修复右侧打开文件夹与界面细节。
diff --git a/docs/imgs/smart-organize-config-modal.png b/docs/imgs/smart-organize-config-modal.png
new file mode 100644
index 0000000..a5e6806
Binary files /dev/null and b/docs/imgs/smart-organize-config-modal.png differ
diff --git a/docs/imgs/smart-organize-generate-title.png b/docs/imgs/smart-organize-generate-title.png
new file mode 100644
index 0000000..439d73c
Binary files /dev/null and b/docs/imgs/smart-organize-generate-title.png differ
diff --git a/docs/imgs/smart-organize-preview-list.png b/docs/imgs/smart-organize-preview-list.png
new file mode 100644
index 0000000..872f701
Binary files /dev/null and b/docs/imgs/smart-organize-preview-list.png differ
diff --git a/docs/imgs/smart-organize-preview.png b/docs/imgs/smart-organize-preview.png
new file mode 100644
index 0000000..67029e2
Binary files /dev/null and b/docs/imgs/smart-organize-preview.png differ
diff --git a/javascript/index.js b/javascript/index.js
index 572ec9a..82132d8 100644
--- a/javascript/index.js
+++ b/javascript/index.js
@@ -13,8 +13,8 @@ Promise.resolve().then(async () => {
MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",wan:"#=$0&o.]0F4@5X5b6*628u9p -+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",bie:"-/A-/;fGe2`#M'M!$!#I",pao:"-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",geng:"-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",shua:"-//-%j",cuo:"-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",kei:"-.woU",la:"-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",pou:"-.l-'_-&[{]twtO]+]&Z+YGJS/<",tuan:"-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",zuan:"-.)XOTt",keng:"-,x-([|t|kvIZCXlVgBF/C",gao:"-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",lang:"-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",weng:"-,@-#oyxv{kfU!Pd9o'N'&",tao:"-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=) ${M} MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",wan:"#=$0&o.]0F4@5X5b6*628u9p -+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",bie:"-/A-/;fGe2`#M'M!$!#I",pao:"-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",geng:"-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",shua:"-//-%j",cuo:"-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",kei:"-.woU",la:"-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",pou:"-.l-'_-&[{]twtO]+]&Z+YGJS/<",tuan:"-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",zuan:"-.)XOTt",keng:"-,x-([|t|kvIZCXlVgBF/C",gao:"-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",lang:"-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",weng:"-,@-#oyxv{kfU!Pd9o'N'&",tao:"-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=) ${z}ZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",tuo:"%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",zhe:"#'%+%E'P2f2|
}I-*S-+S-0~-2b-5X-8{",cou:"@ThJiK",chuang:"'_,H,L,q{+{E",piao:"$+).1D7a:;
lMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#
{let t=0,n=1;for(let i=e.length;i--;)t+=n*$a.indexOf(e.charAt(i)),n*=91;return t},rn=(e,t)=>{let n,i,l,p,o;for(n in e)if(e.hasOwnProperty(n))for(i=e[n].match(Ea),l=0;l
');continue}const J=X[M];T||(T=J.includes("("));const oe=["tag"];T&&oe.push("has-parentheses"),J.length<32&&oe.push("short-tag"),I.push(`${J}`),T&&(T=!J.includes(")"))}return I.join(i.showCommaInInfoPanel?",":" ")}St("load",a=>{const g=a.target;g.className==="ant-image-preview-img"&&(r.value=`${g.naturalWidth} x ${g.naturalHeight}`)},{capture:!0});const h=re(()=>{const a=[{name:ie("fileSize"),val:n.file.size}];return r.value&&a.push({name:ie("resolution"),val:r.value}),a}),L=()=>{const a="Negative prompt:",g=C.value.includes(a)?C.value.split(a)[0]:K.value[0]??"";ze(it(g.trim()))},P=()=>document.body.requestFullscreen(),U=a=>{ze(typeof a=="object"?JSON.stringify(a,null,4):a)},ae=a=>{a.key.startsWith("Arrow")?(a.stopPropagation(),a.preventDefault(),document.dispatchEvent(new KeyboardEvent("keydown",a))):a.key==="Escape"&&document.fullscreenElement&&document.exitFullscreen()};St("dblclick",a=>{var g;((g=a.target)==null?void 0:g.className)==="ant-image-preview-img"&&Ot()});const se=re(()=>ee.value||A.value.expanded),ve=De(rt+"contextShowFullPath",!1),V=re(()=>ve.value?n.file.fullpath:n.file.name),te=De(rt+"tagA2ZClassify",!1),Be=re(()=>{var X;const a=(X=i.conf)==null?void 0:X.all_custom_tags.map(I=>{var M,J;return{char:((M=I.display_name)==null?void 0:M[0])||((J=I.name)==null?void 0:J[0]),...I}}).reduce((I,T)=>{var J;let M="#";if(/[a-z]/i.test(T.char))M=T.char.toUpperCase();else if(/[\u4e00-\u9fa5]/.test(T.char))try{M=((J=/^\[?(\w)/.exec(xa(T.char)+""))==null?void 0:J[1])??"#"}catch(oe){console.log("err",oe)}return M=M.toUpperCase(),I[M]||(I[M]=[]),I[M].push(T),I},{});return Object.entries(a??{}).sort((I,T)=>I[0].charCodeAt(0)-T[0].charCodeAt(0))}),Oe=()=>{Ot(),t("contextMenuClick",{key:"tiktokView"},n.file,n.idx)},ke=ue(!1),Qe=async()=>{var a,g;if(!S.value.prompt){be.warning(ie("aiAnalyzeTagsNoPrompt"));return}if(!((g=(a=i.conf)==null?void 0:a.all_custom_tags)!=null&&g.length)){be.warning(ie("aiAnalyzeTagsNoCustomTags"));return}ke.value=!0;try{const X=S.value.prompt,T=`You are a professional AI assistant responsible for analyzing Stable Diffusion prompts and categorizing them into appropriate tags.
+*/let sn=19968,ba=(40896-sn)/2,rt="",We=",",$a=(()=>{let e=[];for(let t=33;t<127;t++)t!=34&&t!=92&&t!=45&&e.push(String.fromCharCode(t));return e.join(rt)})(),bt={a:{yi:"!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;TZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",tuo:"%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",zhe:"#'%+%E'P2f2|
}I-*S-+S-0~-2b-5X-8{",cou:"@ThJiK",chuang:"'_,H,L,q{+{E",piao:"$+).1D7a:;
lMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#
{let t=0,n=1;for(let i=e.length;i--;)t+=n*$a.indexOf(e.charAt(i)),n*=91;return t},on=(e,t)=>{let n,i,c,p,s;for(n in e)if(e.hasOwnProperty(n))for(i=e[n].match(wa),c=0;c
');continue}const j=X[z];x||(x=j.includes("("));const re=["tag"];x&&re.push("has-parentheses"),j.length<32&&re.push("short-tag"),R.push(`${j}`),x&&(x=!j.includes(")"))}return R.join(i.showCommaInInfoPanel?",":" ")}xt("load",a=>{const g=a.target;g.className==="ant-image-preview-img"&&(o.value=`${g.naturalWidth} x ${g.naturalHeight}`)},{capture:!0});const r=ie(()=>{const a=[{name:ne("fileSize"),val:n.file.size}];return o.value&&a.push({name:ne("resolution"),val:o.value}),a}),h=()=>{const a="Negative prompt:",g=S.value.includes(a)?S.value.split(a)[0]:K.value[0]??"";De(nt(g.trim()))},T=()=>document.body.requestFullscreen(),I=a=>{De(typeof a=="object"?JSON.stringify(a,null,4):a)},F=a=>{a.key.startsWith("Arrow")?(a.stopPropagation(),a.preventDefault(),document.dispatchEvent(new KeyboardEvent("keydown",a))):a.key==="Escape"&&document.fullscreenElement&&document.exitFullscreen()};xt("dblclick",a=>{var g;((g=a.target)==null?void 0:g.className)==="ant-image-preview-img"&&Et()});const Z=ie(()=>te.value||C.value.expanded),ae=Ne(ot+"contextShowFullPath",!1),pe=ie(()=>ae.value?n.file.fullpath:n.file.name),J=Ne(ot+"tagA2ZClassify",!1),se=ie(()=>{var X;const a=(X=i.conf)==null?void 0:X.all_custom_tags.map(R=>{var z,j;return{char:((z=R.display_name)==null?void 0:z[0])||((j=R.name)==null?void 0:j[0]),...R}}).reduce((R,x)=>{var j;let z="#";if(/[a-z]/i.test(x.char))z=x.char.toUpperCase();else if(/[\u4e00-\u9fa5]/.test(x.char))try{z=((j=/^\[?(\w)/.exec(xa(x.char)+""))==null?void 0:j[1])??"#"}catch(re){console.log("err",re)}return z=z.toUpperCase(),R[z]||(R[z]=[]),R[z].push(x),R},{});return Object.entries(a??{}).sort((R,x)=>R[0].charCodeAt(0)-x[0].charCodeAt(0))}),Oe=()=>{Et(),t("contextMenuClick",{key:"tiktokView"},n.file,n.idx)},Me=ce(!1),Re=async()=>{var a,g;if(!M.value.prompt){be.warning(ne("aiAnalyzeTagsNoPrompt"));return}if(!((g=(a=i.conf)==null?void 0:a.all_custom_tags)!=null&&g.length)){be.warning(ne("aiAnalyzeTagsNoCustomTags"));return}Me.value=!0;try{const X=M.value.prompt,x=`You are a professional AI assistant responsible for analyzing Stable Diffusion prompts and categorizing them into appropriate tags.
Your task is:
1. Analyze the given prompt
@@ -14,6 +13,6 @@ Your task is:
4. If no tags match, return an empty string
5. Tag matching should be based on semantic similarity and thematic relevance
-Available tags: ${i.conf.all_custom_tags.map(E=>E.name).join(", ")}
+Available tags: ${i.conf.all_custom_tags.map(L=>L.name).join(", ")}
-Please return only tag names, do not include any other content.`,J=(await Mn({messages:[{role:"system",content:T},{role:"user",content:`Please analyze this prompt and return matching tags: ${X}`}],temperature:.3,max_tokens:200})).choices[0].message.content.trim();if(!J){be.info(ie("aiAnalyzeTagsNoMatchedTags"));return}const oe=J.split(",").map(E=>E.trim()).filter(E=>E),b=i.conf.all_custom_tags.filter(E=>oe.some(le=>E.name.toLowerCase()===le.toLowerCase()||E.name.toLowerCase().includes(le.toLowerCase())||le.toLowerCase().includes(E.name.toLowerCase()))),ye=new Set(o.value.map(E=>E.id)),R=b.filter(E=>!ye.has(E.id));if(R.length===0){b.length>0?be.info(ie("aiAnalyzeTagsAllTagsAlreadyAdded")):be.info(ie("aiAnalyzeTagsNoValidTags"));return}for(const E of R)t("contextMenuClick",{key:`toggle-tag-${E.id}`},n.file,n.idx);be.success(ie("aiAnalyzeTagsSuccess",[R.length.toString(),R.map(E=>E.name).join(", ")]))}catch(X){console.error("AI分析标签失败:",X),be.error(ie("aiAnalyzeTagsFailed"))}finally{ke.value=!1}};return(a,g)=>{var u,f,x;const X=jn,I=Fe,T=xn,M=Sn,J=Tn,oe=Cn,b=Fe,ye=Pn,R=In,E=Ln,le=An,he=zn,Le=Ne,Ae=Dn;return _(),O("div",{ref_key:"el",ref:p,class:nt(["full-screen-menu",{"unset-size":!v(A).expanded,lr:v(ee),"always-on":v(fe),"mouse-in":Ce.value}]),onWheelCapture:g[13]||(g[13]=Mt(()=>{},["stop"])),onKeydownCapture:ae},[v(ee)?(_(),O("div",Sa)):H("",!0),$("div",Ta,[$("div",Ca,[v(ee)?H("",!0):(_(),O("div",{key:0,ref_key:"dragHandle",ref:y,class:"icon",style:{cursor:"grab"},title:v(ie)("dragToMovePanel")},[m(v(Zn))],8,La)),v(ee)?H("",!0):(_(),O("div",{key:1,class:"icon",style:{cursor:"pointer"},onClick:g[0]||(g[0]=c=>v(A).expanded=!v(A).expanded),title:v(ie)("clickToToggleMaximizeMinimize")},[se.value?(_(),de(v(En),{key:0})):(_(),de(v(wn),{key:1}))],8,Aa)),$("div",{style:{display:"flex","flex-direction":"column","align-items":"center",cursor:"grab"},class:"icon",title:v(ie)("fullscreenview"),onClick:P},[$("img",{src:v(li),style:{width:"21px",height:"21px","padding-bottom":"2px"},alt:""},null,8,Da)],8,za),m(X,{"get-popup-container":je},{overlay:k(()=>[m(Bn,{file:a.file,idx:a.idx,"selected-tag":o.value,onContextMenuClick:g[1]||(g[1]=(c,z,F)=>t("contextMenuClick",c,z,F))},null,8,["file","idx","selected-tag"])]),default:k(()=>[v(A).expanded?H("",!0):(_(),O("div",Na,[m(v(kt))]))]),_:1}),se.value?(_(),O("div",Ia)):H("",!0),se.value?(_(),O("div",Pa,[m(X,{trigger:["hover"],"get-popup-container":je},{overlay:k(()=>[m(oe,{onClick:g[2]||(g[2]=c=>t("contextMenuClick",c,a.file,a.idx))},{default:k(()=>{var c;return[((c=v(i).conf)==null?void 0:c.launch_mode)!=="server"?(_(),O(Y,{key:0},[m(T,{key:"send2txt2img"},{default:k(()=>[N(w(a.$t("sendToTxt2img")),1)]),_:1}),m(T,{key:"send2img2img"},{default:k(()=>[N(w(a.$t("sendToImg2img")),1)]),_:1}),m(T,{key:"send2inpaint"},{default:k(()=>[N(w(a.$t("sendToInpaint")),1)]),_:1}),m(T,{key:"send2extras"},{default:k(()=>[N(w(a.$t("sendToExtraFeatures")),1)]),_:1}),m(M,{key:"sendToThirdPartyExtension",title:a.$t("sendToThirdPartyExtension")},{default:k(()=>[m(T,{key:"send2controlnet-txt2img"},{default:k(()=>[N("ControlNet - "+w(a.$t("t2i")),1)]),_:1}),m(T,{key:"send2controlnet-img2img"},{default:k(()=>[N("ControlNet - "+w(a.$t("i2i")),1)]),_:1}),m(T,{key:"send2outpaint"},{default:k(()=>[N("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):H("",!0),m(T,{key:"send2BatchDownload"},{default:k(()=>[N(w(a.$t("sendToBatchDownload")),1)]),_:1}),m(M,{key:"copy2target",title:a.$t("copyTo")},{default:k(()=>[(_(!0),O(Y,null,ge(v(i).quickMovePaths,z=>(_(),de(T,{key:`copy-to-${z.dir}`},{default:k(()=>[N(w(z.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),m(M,{key:"move2target",title:a.$t("moveTo")},{default:k(()=>[(_(!0),O(Y,null,ge(v(i).quickMovePaths,z=>(_(),de(T,{key:`move-to-${z.dir}`},{default:k(()=>[N(w(z.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),m(J),m(T,{key:"deleteFiles"},{default:k(()=>[N(w(a.$t("deleteSelected")),1)]),_:1}),m(T,{key:"openWithDefaultApp"},{default:k(()=>[N(w(a.$t("openWithDefaultApp")),1)]),_:1}),m(T,{key:"previewInNewWindow"},{default:k(()=>[N(w(a.$t("previewInNewWindow")),1)]),_:1}),m(T,{key:"copyPreviewUrl"},{default:k(()=>[N(w(a.$t("copySourceFilePreviewLink")),1)]),_:1}),m(T,{key:"copyFilePath"},{default:k(()=>[N(w(a.$t("copyFilePath")),1)]),_:1}),m(J),m(T,{key:"tiktokView",onClick:Oe},{default:k(()=>[N(w(a.$t("tiktokView")),1)]),_:1})]}),_:1})]),default:k(()=>[m(I,null,{default:k(()=>[N(w(v(ie)("openContextMenu")),1)]),_:1})]),_:1}),m(b,{onClick:g[3]||(g[3]=c=>t("contextMenuClick",{key:"download"},n.file,n.idx))},{default:k(()=>[N(w(a.$t("download")),1)]),_:1}),C.value?(_(),de(I,{key:0,onClick:g[4]||(g[4]=c=>v(ze)(C.value))},{default:k(()=>[N(w(a.$t("copyPrompt")),1)]),_:1})):H("",!0),C.value?(_(),de(I,{key:1,onClick:L},{default:k(()=>[N(w(a.$t("copyPositivePrompt")),1)]),_:1})):H("",!0),C.value&&((f=(u=v(i).conf)==null?void 0:u.all_custom_tags)!=null&&f.length)?(_(),de(I,{key:2,onClick:Qe,type:"primary",loading:ke.value},{default:k(()=>[N(w(a.$t("aiAnalyzeTags")),1)]),_:1},8,["loading"])):H("",!0),m(I,{onClick:Oe,onTouchstart:Mt(Oe,["prevent"]),type:"default"},{default:k(()=>[N(w(a.$t("tiktokView")),1)]),_:1},8,["onTouchstart"])])):H("",!0)]),se.value?(_(),O("div",ja,[$("div",Ba,[$("span",Ra,[$("span",Ua,w(a.$t("fileName")),1),$("span",{class:"value",title:V.value,onDblclick:g[5]||(g[5]=c=>v(ze)(V.value))},w(V.value),41,Ha),$("span",{style:{margin:"0 8px",cursor:"pointer"},title:"Click to expand full path",onClick:g[6]||(g[6]=c=>ve.value=!v(ve))},[m(v(kt))])]),(_(!0),O(Y,null,ge(h.value,c=>(_(),O("span",{class:"info-tag",key:c.name},[$("span",Wa,w(c.name),1),$("span",{class:"value",title:c.val,onDblclick:z=>v(ze)(c.val)},w(c.val),41,Fa)]))),128))]),(x=v(i).conf)!=null&&x.all_custom_tags?(_(),O("div",Xa,[$("div",{class:"sort-tag-switch",onClick:g[7]||(g[7]=c=>te.value=!v(te))},[v(te)?(_(),de(v(On),{key:1})):(_(),de(v(ri),{key:0}))]),$("div",{class:"tag",onClick:g[8]||(g[8]=(...c)=>v(xt)&&v(xt)(...c)),style:tt({"--tag-color":"var(--zp-luminous)"})},"+ "+w(a.$t("add")),5),v(te)?(_(!0),O(Y,{key:0},ge(Be.value,([c,z])=>(_(),O("div",{key:c,class:"tag-alpha-item"},[$("h4",qa,w(c)+" : ",1),$("div",null,[(_(!0),O(Y,null,ge(z,F=>(_(),O("div",{class:nt(["tag",{selected:o.value.some(Re=>Re.id===F.id)}]),onClick:Re=>t("contextMenuClick",{key:`toggle-tag-${F.id}`},a.file,a.idx),key:F.id,style:tt({"--tag-color":v(l).getColor(F)})},w(F.name),15,Ja))),128))])]))),128)):(_(!0),O(Y,{key:1},ge(v(i).conf.all_custom_tags,c=>(_(),O("div",{class:nt(["tag",{selected:o.value.some(z=>z.id===c.id)}]),onClick:z=>t("contextMenuClick",{key:`toggle-tag-${c.id}`},a.file,a.idx),key:c.id,style:tt({"--tag-color":v(l).getColor(c)})},w(c.name),15,Ga))),128))])):H("",!0),$("div",Va,[$("div",Ya,[N(w(a.$t("experimentalLRLayout"))+": ",1),m(ye,{checked:v(ee),"onUpdate:checked":g[9]||(g[9]=c=>Ue(ee)?ee.value=c:null),size:"small"},null,8,["checked"])]),v(ee)?(_(),O(Y,{key:0},[$("div",Za,[N(w(a.$t("width"))+": ",1),m(R,{value:v(ne),"onUpdate:value":g[10]||(g[10]=c=>Ue(ne)?ne.value=c:null),style:{width:"64px"},step:16,min:128,max:1024},null,8,["value"])]),m(E,{title:a.$t("alwaysOnTooltipInfo")},{default:k(()=>[$("div",Ka,[N(w(a.$t("alwaysOn"))+": ",1),m(ye,{checked:v(fe),"onUpdate:checked":g[11]||(g[11]=c=>Ue(fe)?fe.value=c:null),size:"small"},null,8,["checked"])])]),_:1},8,["title"])],64)):H("",!0)]),m(Ae,{activeKey:v(q),"onUpdate:activeKey":g[12]||(g[12]=c=>Ue(q)?q.value=c:null)},{default:k(()=>[m(le,{key:"structedData",tab:a.$t("structuredData")},{default:k(()=>[$("div",null,[S.value.prompt?(_(),O(Y,{key:0},[Qa,es,$("code",{innerHTML:s(S.value.prompt??"")},null,8,ts)],64)):H("",!0),S.value.negativePrompt?(_(),O(Y,{key:1},[ns,is,$("code",{innerHTML:s(S.value.negativePrompt??"")},null,8,as)],64)):H("",!0)]),Object.keys(j.value).length?(_(),O(Y,{key:0},[ss,os,$("table",null,[(_(!0),O(Y,null,ge(j.value,(c,z)=>(_(),O("tr",{key:z,class:"gen-info-frag"},[$("td",rs,w(z),1),typeof c=="object"?(_(),O("td",{key:0,style:{cursor:"pointer"},onDblclick:F=>U(c)},[$("code",null,w(c),1)],40,ls)):(_(),O("td",{key:1,style:{cursor:"pointer"},onDblclick:F=>U(v(it)(c))},w(v(it)(c)),41,cs))]))),128))])],64)):H("",!0),W.value&&Object.keys(W.value).length?(_(),O(Y,{key:1},[us,ds,$("table",gs,[(_(!0),O(Y,null,ge(W.value,(c,z)=>(_(),O("tr",{key:z,class:"gen-info-frag"},[$("td",fs,w(z),1),$("td",{style:{cursor:"pointer"},onDblclick:F=>U(c)},[$("code",ps,w(typeof c=="string"?c:JSON.stringify(c,null,2)),1)],40,hs)]))),128))])],64)):H("",!0)]),_:1},8,["tab"]),m(le,{key:"sourceText",tab:a.$t("sourceText")},{default:k(()=>[$("code",null,w(C.value),1)]),_:1},8,["tab"]),m(le,{key:"exif",tab:"EXIF"},{default:k(()=>[m(Le,{spinning:Z.value},{default:k(()=>[D.value&&Object.keys(D.value).length?(_(),O("div",vs,[m(va,{data:D.value},null,8,["data"])])):Z.value?H("",!0):(_(),O("div",_s,[m(he,{description:"No EXIF data available"})]))]),_:1},8,["spinning"])]),_:1})]),_:1},8,["activeKey"])])):H("",!0)]),v(A).expanded&&!v(ee)?(_(),O("div",{key:1,class:"mouse-sensor",ref_key:"resizeHandle",ref:ce,title:v(ie)("dragToResizePanel")},[m(v(Jn))],8,ms)):H("",!0)],34)}}});const Ns=ut(ys,[["__scopeId","data-v-006d4d7c"]]),bs={key:0,class:"float-panel"},$s={key:0,class:"select-actions"},Es={key:1},ws=ct({__name:"MultiSelectKeep",props:{show:{type:Boolean}},emits:["selectAll","reverseSelect","clearAllSelected"],setup(e,{emit:t}){const n=Ge(),i=()=>{t("clearAllSelected"),n.keepMultiSelect=!1},l=()=>{n.keepMultiSelect=!0};return(p,o)=>{const r=Fe;return p.show?(_(),O("div",bs,[v(n).keepMultiSelect?(_(),O("div",$s,[m(r,{size:"small",onClick:o[0]||(o[0]=d=>t("selectAll"))},{default:k(()=>[N(w(p.$t("select-all")),1)]),_:1}),m(r,{size:"small",onClick:o[1]||(o[1]=d=>t("reverseSelect"))},{default:k(()=>[N(w(p.$t("rerverse-select")),1)]),_:1}),m(r,{size:"small",onClick:o[2]||(o[2]=d=>t("clearAllSelected"))},{default:k(()=>[N(w(p.$t("clear-all-selected")),1)]),_:1}),m(r,{size:"small",onClick:i},{default:k(()=>[N(w(p.$t("exit")),1)]),_:1})])):(_(),O("div",Es,[m(r,{size:"small",type:"primary",onClick:l},{default:k(()=>[N(w(p.$t("keep-multi-selected")),1)]),_:1})]))])):H("",!0)}}});const Is=ut(ws,[["__scopeId","data-v-b04c3508"]]);export{zs as L,Is as M,Ds as R,Ns as f};
+Please return only tag names, do not include any other content.`,j=(await Mn({messages:[{role:"system",content:x},{role:"user",content:`Please analyze this prompt and return matching tags: ${X}`}],temperature:.3,max_tokens:200})).choices[0].message.content.trim();if(!j){be.info(ne("aiAnalyzeTagsNoMatchedTags"));return}const re=j.split(",").map(L=>L.trim()).filter(L=>L),ve=i.conf.all_custom_tags.filter(L=>re.some(D=>L.name.toLowerCase()===D.toLowerCase()||L.name.toLowerCase().includes(D.toLowerCase())||D.toLowerCase().includes(L.name.toLowerCase()))),$=new Set(s.value.map(L=>L.id)),ge=ve.filter(L=>!$.has(L.id));if(ge.length===0){ve.length>0?be.info(ne("aiAnalyzeTagsAllTagsAlreadyAdded")):be.info(ne("aiAnalyzeTagsNoValidTags"));return}for(const L of ge)t("contextMenuClick",{key:`toggle-tag-${L.id}`},n.file,n.idx);be.success(ne("aiAnalyzeTagsSuccess",[ge.length.toString(),ge.map(L=>L.name).join(", ")]))}catch(X){console.error("AI分析标签失败:",X),be.error(ne("aiAnalyzeTagsFailed"))}finally{Me.value=!1}};return(a,g)=>{var Se,u,f;const X=Pn,R=Fe,x=xn,z=Sn,j=Tn,re=Ln,ve=Fe,$=Cn,ge=An,L=zn,D=Dn,xe=Nn,fe=In,ze=jn;return _(),k("div",{ref_key:"el",ref:p,class:tt(["full-screen-menu",{"unset-size":!v(C).expanded,lr:v(te),"always-on":v(ee),"mouse-in":Ee.value}]),onWheelCapture:g[13]||(g[13]=Ot(()=>{},["stop"])),onKeydownCapture:F},[v(te)?(_(),k("div",Sa)):H("",!0),w("div",Ta,[w("div",La,[v(te)?H("",!0):(_(),k("div",{key:0,ref_key:"dragHandle",ref:y,class:"icon",style:{cursor:"grab"},title:v(ne)("dragToMovePanel")},[m(v(Zn))],8,Ca)),v(te)?H("",!0):(_(),k("div",{key:1,class:"icon",style:{cursor:"pointer"},onClick:g[0]||(g[0]=l=>v(C).expanded=!v(C).expanded),title:v(ne)("clickToToggleMaximizeMinimize")},[Z.value?(_(),ue(v(wn),{key:0})):(_(),ue(v(En),{key:1}))],8,Aa)),w("div",{style:{display:"flex","flex-direction":"column","align-items":"center",cursor:"grab"},class:"icon",title:v(ne)("fullscreenview"),onClick:T},[w("img",{src:v(li),style:{width:"21px",height:"21px","padding-bottom":"2px"},alt:""},null,8,Da)],8,za),m(X,{"get-popup-container":Pe},{overlay:O(()=>[m(Bn,{file:a.file,idx:a.idx,"selected-tag":s.value,onContextMenuClick:g[1]||(g[1]=(l,b,P)=>t("contextMenuClick",l,b,P))},null,8,["file","idx","selected-tag"])]),default:O(()=>[v(C).expanded?H("",!0):(_(),k("div",Na,[m(v(kt))]))]),_:1}),Z.value?(_(),k("div",Ia)):H("",!0),Z.value?(_(),k("div",ja,[m(X,{trigger:["hover"],"get-popup-container":Pe},{overlay:O(()=>[m(re,{onClick:g[2]||(g[2]=l=>t("contextMenuClick",l,a.file,a.idx))},{default:O(()=>{var l;return[((l=v(i).conf)==null?void 0:l.launch_mode)!=="server"?(_(),k(V,{key:0},[m(x,{key:"send2txt2img"},{default:O(()=>[N(E(a.$t("sendToTxt2img")),1)]),_:1}),m(x,{key:"send2img2img"},{default:O(()=>[N(E(a.$t("sendToImg2img")),1)]),_:1}),m(x,{key:"send2inpaint"},{default:O(()=>[N(E(a.$t("sendToInpaint")),1)]),_:1}),m(x,{key:"send2extras"},{default:O(()=>[N(E(a.$t("sendToExtraFeatures")),1)]),_:1}),m(z,{key:"sendToThirdPartyExtension",title:a.$t("sendToThirdPartyExtension")},{default:O(()=>[m(x,{key:"send2controlnet-txt2img"},{default:O(()=>[N("ControlNet - "+E(a.$t("t2i")),1)]),_:1}),m(x,{key:"send2controlnet-img2img"},{default:O(()=>[N("ControlNet - "+E(a.$t("i2i")),1)]),_:1}),m(x,{key:"send2outpaint"},{default:O(()=>[N("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):H("",!0),m(x,{key:"send2BatchDownload"},{default:O(()=>[N(E(a.$t("sendToBatchDownload")),1)]),_:1}),m(z,{key:"copy2target",title:a.$t("copyTo")},{default:O(()=>[(_(!0),k(V,null,de(v(i).quickMovePaths,b=>(_(),ue(x,{key:`copy-to-${b.dir}`},{default:O(()=>[N(E(b.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),m(z,{key:"move2target",title:a.$t("moveTo")},{default:O(()=>[(_(!0),k(V,null,de(v(i).quickMovePaths,b=>(_(),ue(x,{key:`move-to-${b.dir}`},{default:O(()=>[N(E(b.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),m(j),m(x,{key:"deleteFiles"},{default:O(()=>[N(E(a.$t("deleteSelected")),1)]),_:1}),m(x,{key:"openWithDefaultApp"},{default:O(()=>[N(E(a.$t("openWithDefaultApp")),1)]),_:1}),m(x,{key:"previewInNewWindow"},{default:O(()=>[N(E(a.$t("previewInNewWindow")),1)]),_:1}),m(x,{key:"copyPreviewUrl"},{default:O(()=>[N(E(a.$t("copySourceFilePreviewLink")),1)]),_:1}),m(x,{key:"copyFilePath"},{default:O(()=>[N(E(a.$t("copyFilePath")),1)]),_:1}),m(j),m(x,{key:"tiktokView",onClick:Oe},{default:O(()=>[N(E(a.$t("tiktokView")),1)]),_:1})]}),_:1})]),default:O(()=>[m(R,null,{default:O(()=>[N(E(v(ne)("openContextMenu")),1)]),_:1})]),_:1}),m(ve,{onClick:g[3]||(g[3]=l=>t("contextMenuClick",{key:"download"},n.file,n.idx))},{default:O(()=>[N(E(a.$t("download")),1)]),_:1}),S.value?(_(),ue(R,{key:0,onClick:g[4]||(g[4]=l=>v(De)(S.value))},{default:O(()=>[N(E(a.$t("copyPrompt")),1)]),_:1})):H("",!0),S.value?(_(),ue(R,{key:1,onClick:h},{default:O(()=>[N(E(a.$t("copyPositivePrompt")),1)]),_:1})):H("",!0),S.value&&((u=(Se=v(i).conf)==null?void 0:Se.all_custom_tags)!=null&&u.length)?(_(),ue(R,{key:2,onClick:Re,type:"primary",loading:Me.value},{default:O(()=>[N(E(a.$t("aiAnalyzeTags")),1)]),_:1},8,["loading"])):H("",!0),m(R,{onClick:Oe,onTouchstart:Ot(Oe,["prevent"]),type:"default"},{default:O(()=>[N(E(a.$t("tiktokView")),1)]),_:1},8,["onTouchstart"])])):H("",!0)]),Z.value?(_(),k("div",Pa,[w("div",Ba,[w("span",Ra,[w("span",Ua,E(a.$t("fileName")),1),w("span",{class:"value",title:pe.value,onDblclick:g[5]||(g[5]=l=>v(De)(pe.value))},E(pe.value),41,Ha),w("span",{style:{margin:"0 8px",cursor:"pointer"},title:"Click to expand full path",onClick:g[6]||(g[6]=l=>ae.value=!v(ae))},[m(v(kt))])]),(_(!0),k(V,null,de(r.value,l=>(_(),k("span",{class:"info-tag",key:l.name},[w("span",Wa,E(l.name),1),w("span",{class:"value",title:l.val,onDblclick:b=>v(De)(l.val)},E(l.val),41,Fa)]))),128))]),(f=v(i).conf)!=null&&f.all_custom_tags?(_(),k("div",Xa,[w("div",{class:"sort-tag-switch",onClick:g[7]||(g[7]=l=>J.value=!v(J))},[v(J)?(_(),ue(v(kn),{key:1})):(_(),ue(v(ri),{key:0}))]),w("div",{class:"tag",onClick:g[8]||(g[8]=(...l)=>v(Mt)&&v(Mt)(...l)),style:et({"--tag-color":"var(--zp-luminous)"})},"+ "+E(a.$t("add")),5),v(J)?(_(!0),k(V,{key:0},de(se.value,([l,b])=>(_(),k("div",{key:l,class:"tag-alpha-item"},[w("h4",qa,E(l)+" : ",1),w("div",null,[(_(!0),k(V,null,de(b,P=>(_(),k("div",{class:tt(["tag",{selected:s.value.some(oe=>oe.id===P.id)}]),onClick:oe=>t("contextMenuClick",{key:`toggle-tag-${P.id}`},a.file,a.idx),key:P.id,style:et({"--tag-color":v(c).getColor(P)})},E(P.name),15,Ja))),128))])]))),128)):(_(!0),k(V,{key:1},de(v(i).conf.all_custom_tags,l=>(_(),k("div",{class:tt(["tag",{selected:s.value.some(b=>b.id===l.id)}]),onClick:b=>t("contextMenuClick",{key:`toggle-tag-${l.id}`},a.file,a.idx),key:l.id,style:et({"--tag-color":v(c).getColor(l)})},E(l.name),15,Ga))),128))])):H("",!0),w("div",Va,[w("div",Ya,[N(E(a.$t("experimentalLRLayout"))+": ",1),m($,{checked:v(te),"onUpdate:checked":g[9]||(g[9]=l=>Ue(te)?te.value=l:null),size:"small"},null,8,["checked"])]),v(te)?(_(),k(V,{key:0},[w("div",Za,[N(E(a.$t("width"))+": ",1),m(ge,{value:v(ye),"onUpdate:value":g[10]||(g[10]=l=>Ue(ye)?ye.value=l:null),style:{width:"64px"},step:16,min:128,max:1024},null,8,["value"])]),m(L,{title:a.$t("alwaysOnTooltipInfo")},{default:O(()=>[w("div",Ka,[N(E(a.$t("alwaysOn"))+": ",1),m($,{checked:v(ee),"onUpdate:checked":g[11]||(g[11]=l=>Ue(ee)?ee.value=l:null),size:"small"},null,8,["checked"])])]),_:1},8,["title"])],64)):H("",!0)]),m(ze,{activeKey:v(q),"onUpdate:activeKey":g[12]||(g[12]=l=>Ue(q)?q.value=l:null)},{default:O(()=>[m(D,{key:"structedData",tab:a.$t("structuredData")},{default:O(()=>[w("div",null,[M.value.prompt?(_(),k(V,{key:0},[Qa,es,w("code",{innerHTML:Be(M.value.prompt??"")},null,8,ts)],64)):H("",!0),M.value.negativePrompt?(_(),k(V,{key:1},[ns,is,w("code",{innerHTML:Be(M.value.negativePrompt??"")},null,8,as)],64)):H("",!0)]),Object.keys(B.value).length?(_(),k(V,{key:0},[ss,os,w("table",null,[(_(!0),k(V,null,de(B.value,(l,b)=>(_(),k("tr",{key:b,class:"gen-info-frag"},[w("td",rs,E(b),1),typeof l=="object"?(_(),k("td",{key:0,style:{cursor:"pointer"},onDblclick:P=>I(l)},[w("code",null,E(l),1)],40,ls)):(_(),k("td",{key:1,style:{cursor:"pointer"},onDblclick:P=>I(v(nt)(l))},E(v(nt)(l)),41,cs))]))),128))])],64)):H("",!0),W.value&&Object.keys(W.value).length?(_(),k(V,{key:1},[us,ds,w("table",gs,[(_(!0),k(V,null,de(W.value,(l,b)=>(_(),k("tr",{key:b,class:"gen-info-frag"},[w("td",fs,E(b),1),w("td",{style:{cursor:"pointer"},onDblclick:P=>I(l)},[w("code",ps,E(typeof l=="string"?l:JSON.stringify(l,null,2)),1)],40,hs)]))),128))])],64)):H("",!0)]),_:1},8,["tab"]),m(D,{key:"sourceText",tab:a.$t("sourceText")},{default:O(()=>[w("code",null,E(S.value),1)]),_:1},8,["tab"]),m(D,{key:"exif",tab:"EXIF"},{default:O(()=>[m(fe,{spinning:Y.value},{default:O(()=>[A.value&&Object.keys(A.value).length?(_(),k("div",vs,[m(va,{data:A.value},null,8,["data"])])):Y.value?H("",!0):(_(),k("div",_s,[m(xe,{description:"No EXIF data available"})]))]),_:1},8,["spinning"])]),_:1})]),_:1},8,["activeKey"])])):H("",!0)]),v(C).expanded&&!v(te)?(_(),k("div",{key:1,class:"mouse-sensor",ref_key:"resizeHandle",ref:le,title:v(ne)("dragToResizePanel")},[m(v(Jn))],8,ms)):H("",!0)],34)}}});const Cs=ct(ys,[["__scopeId","data-v-94026b33"]]),bs={key:0,class:"float-panel"},$s={key:0,class:"select-actions"},ws={key:1},Es=lt({__name:"MultiSelectKeep",props:{show:{type:Boolean}},emits:["selectAll","reverseSelect","clearAllSelected"],setup(e,{emit:t}){const n=Ge(),i=()=>{t("clearAllSelected"),n.keepMultiSelect=!1},c=()=>{n.keepMultiSelect=!0};return(p,s)=>{const o=Fe;return p.show?(_(),k("div",bs,[v(n).keepMultiSelect?(_(),k("div",$s,[m(o,{size:"small",onClick:s[0]||(s[0]=d=>t("selectAll"))},{default:O(()=>[N(E(p.$t("select-all")),1)]),_:1}),m(o,{size:"small",onClick:s[1]||(s[1]=d=>t("reverseSelect"))},{default:O(()=>[N(E(p.$t("rerverse-select")),1)]),_:1}),m(o,{size:"small",onClick:s[2]||(s[2]=d=>t("clearAllSelected"))},{default:O(()=>[N(E(p.$t("clear-all-selected")),1)]),_:1}),m(o,{size:"small",onClick:i},{default:O(()=>[N(E(p.$t("exit")),1)]),_:1})])):(_(),k("div",ws,[m(o,{size:"small",type:"primary",onClick:c},{default:O(()=>[N(E(p.$t("keep-multi-selected")),1)]),_:1})]))])):H("",!0)}}});const As=ct(Es,[["__scopeId","data-v-b6f9a67c"]]);export{Ts as L,As as M,Ls as R,Cs as f};
diff --git a/vue/dist/assets/SubstrSearch-56649a80.css b/vue/dist/assets/SubstrSearch-56649a80.css
new file mode 100644
index 0000000..5b93bdd
--- /dev/null
+++ b/vue/dist/assets/SubstrSearch-56649a80.css
@@ -0,0 +1 @@
+[data-v-9726dd9e] .float-panel{position:fixed}.regex-icon[data-v-9726dd9e]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-9726dd9e]{height:1.5em}.regex-icon[data-v-9726dd9e]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-9726dd9e]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-9726dd9e]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-9726dd9e]{padding-bottom:8px}.search-bar .form-name[data-v-9726dd9e]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-9726dd9e]{margin-right:4px}.container[data-v-9726dd9e]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-9726dd9e]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}
diff --git a/vue/dist/assets/SubstrSearch-9fd55bc1.js b/vue/dist/assets/SubstrSearch-9fd55bc1.js
new file mode 100644
index 0000000..2cdd735
--- /dev/null
+++ b/vue/dist/assets/SubstrSearch-9fd55bc1.js
@@ -0,0 +1 @@
+import{c as a,A as Ee,d as He,bk as Pe,az as Ge,r as w,ak as Ke,bo as se,s as Le,bq as je,br as qe,aH as Ne,R as Je,T as We,bp as ne,bs as Qe,p as Xe,o as u,j as z,x as t,y as e,k as d,l as i,t as o,v as _,m as v,z as G,bA as Ye,Q as F,F as oe,B as ie,C as Ze,O as et,V as re,$ as ue,as as tt,Z as at,bB as lt,X as st,bw as nt,Y as ot,a4 as it,at as rt,au as ut,bC as dt,n as pt}from"./index-c24b5c8e.js";/* empty css *//* empty css */import{s as ct,F as ft}from"./FileItem-c62b10f3.js";import{M as vt,L as mt,R as gt,f as _t}from"./MultiSelectKeep-ea31915e.js";import{c as ht,u as yt}from"./hook-4227849e.js";import{g as kt,o as bt}from"./index-47a4d52c.js";import{f as U,H as de,_ as wt,a as St}from"./searchHistory-f42938f6.js";import"./index-5130babf.js";import"./shortcut-4e374057.js";import"./_isIterateeCall-19da1ec8.js";var Ct={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M952 474H829.8C812.5 327.6 696.4 211.5 550 194.2V72c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v122.2C327.6 211.5 211.5 327.6 194.2 474H72c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h122.2C211.5 696.4 327.6 812.5 474 829.8V952c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V829.8C696.4 812.5 812.5 696.4 829.8 550H952c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM512 756c-134.8 0-244-109.2-244-244s109.2-244 244-244 244 109.2 244 244-109.2 244-244 244z"}},{tag:"path",attrs:{d:"M512 392c-32.1 0-62.1 12.4-84.8 35.2-22.7 22.7-35.2 52.7-35.2 84.8s12.5 62.1 35.2 84.8C449.9 619.4 480 632 512 632s62.1-12.5 84.8-35.2C619.4 574.1 632 544 632 512s-12.5-62.1-35.2-84.8A118.57 118.57 0 00512 392z"}}]},name:"aim",theme:"outlined"};const xt=Ct;function pe(p){for(var c=1;c{{ globalStore.smartOrganizeConfigPath }}
+
+
{{ t('smartOrganizePreview') }}
+ {{ preview.dest_folder }}
+