// ==UserScript== // @name OPFS 文件上传助手 // @namespace https://scriptcat.org/ // @version 0.4.0 // @description 通过脚本猫菜单上传文件或文件夹到指定OPFS目录,带美观UI界面 // @author ScriptCat Agent // @match *://*/* // @grant GM_registerMenuCommand // @grant GM_addStyle // @grant CAT.agent.opfs // ==/UserScript== "use strict"; // UI样式 const UI_STYLES = ` #opfs-uploader-overlay { position: fixed !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; background: rgba(0, 0, 0, 0.5) !important; display: flex !important; justify-content: center !important; align-items: center !important; z-index: 2147483647 !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important; } #opfs-uploader-dialog { background: white !important; border-radius: 12px !important; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3) !important; width: 500px !important; max-width: 90vw !important; max-height: 80vh !important; overflow: hidden !important; animation: opfs-slideIn 0.3s ease !important; } @keyframes opfs-slideIn { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } } #opfs-uploader-header { padding: 20px 24px !important; border-bottom: 1px solid #e5e7eb !important; display: flex !important; justify-content: space-between !important; align-items: center !important; } #opfs-uploader-title { margin: 0 !important; font-size: 18px !important; font-weight: 600 !important; color: #1f2937 !important; } #opfs-uploader-close { width: 32px !important; height: 32px !important; border: none !important; background: #f3f4f6 !important; border-radius: 8px !important; cursor: pointer !important; font-size: 20px !important; color: #6b7280 !important; display: flex !important; align-items: center !important; justify-content: center !important; transition: all 0.2s !important; } #opfs-uploader-close:hover { background: #e5e7eb !important; color: #374151 !important; } #opfs-uploader-body { padding: 24px !important; max-height: 50vh !important; overflow-y: auto !important; } #opfs-uploader-input-group { margin-bottom: 20px !important; } #opfs-uploader-label { display: block !important; margin-bottom: 8px !important; font-size: 14px !important; font-weight: 500 !important; color: #374151 !important; } #opfs-uploader-path-input { width: 100% !important; padding: 10px 14px !important; border: 2px solid #e5e7eb !important; border-radius: 8px !important; font-size: 14px !important; box-sizing: border-box !important; transition: border-color 0.2s !important; } #opfs-uploader-path-input:focus { outline: none !important; border-color: #3b82f6 !important; } #opfs-uploader-dirs { margin-top: 16px !important; } #opfs-uploader-dirs-title { font-size: 13px !important; font-weight: 500 !important; color: #6b7280 !important; margin-bottom: 8px !important; } #opfs-uploader-dirs-list { display: flex !important; flex-wrap: wrap !important; gap: 8px !important; } .opfs-uploader-dir-btn { padding: 6px 12px !important; background: #f3f4f6 !important; border: 1px solid #e5e7eb !important; border-radius: 6px !important; font-size: 13px !important; color: #374151 !important; cursor: pointer !important; transition: all 0.2s !important; } .opfs-uploader-dir-btn:hover { background: #e5e7eb !important; border-color: #d1d5db !important; } #opfs-uploader-footer { padding: 16px 24px !important; border-top: 1px solid #e5e7eb !important; display: flex !important; justify-content: flex-end !important; gap: 12px !important; } .opfs-uploader-btn { padding: 10px 20px !important; border: none !important; border-radius: 8px !important; font-size: 14px !important; font-weight: 500 !important; cursor: pointer !important; transition: all 0.2s !important; } #opfs-uploader-cancel { background: #f3f4f6 !important; color: #374151 !important; } #opfs-uploader-cancel:hover { background: #e5e7eb !important; } #opfs-uploader-confirm { background: #3b82f6 !important; color: white !important; } #opfs-uploader-confirm:hover { background: #2563eb !important; } #opfs-uploader-empty { color: #9ca3af !important; font-size: 13px !important; font-style: italic !important; } `; // 创建UI界面 async function createFolderSelectUI(defaultPath = '') { const styleEl = document.createElement('style'); styleEl.textContent = UI_STYLES + ` #opfs-folder-browser { border: 1px solid #e5e7eb !important; border-radius: 8px !important; overflow: hidden !important; } #opfs-folder-current { padding: 10px 12px !important; background: #f9fafb !important; border-bottom: 1px solid #e5e7eb !important; font-size: 13px !important; color: #374151 !important; } #opfs-folder-list { max-height: 260px !important; overflow-y: auto !important; } .opfs-folder-item { width: 100% !important; padding: 12px 14px !important; border: none !important; background: white !important; text-align: left !important; cursor: pointer !important; font-size: 14px !important; color: #1f2937 !important; border-bottom: 1px solid #f3f4f6 !important; } .opfs-folder-item:hover { background: #f3f4f6 !important; } .opfs-folder-actions { display: flex !important; gap: 8px !important; margin-bottom: 12px !important; } .opfs-folder-action-btn { padding: 8px 12px !important; border: 1px solid #e5e7eb !important; border-radius: 6px !important; background: #f9fafb !important; cursor: pointer !important; font-size: 13px !important; } `; document.head.appendChild(styleEl); let currentPath = defaultPath || ''; const overlay = document.createElement('div'); overlay.id = 'opfs-uploader-overlay'; overlay.innerHTML = `