Browse Source

更新popup样式

zxlie 9 months ago
parent
commit
68face34e0
7 changed files with 348 additions and 1078 deletions
  1. 0 234
      apps/options/index.css
  2. 285 144
      apps/options/index.html
  3. 0 329
      apps/options/index.js
  4. 1 0
      apps/options/market.css
  5. 0 327
      apps/options/market.html
  6. 55 31
      apps/popup/index.css
  7. 7 13
      apps/popup/index.html

+ 0 - 234
apps/options/index.css

@@ -1,234 +0,0 @@
-@import "../static/css/bootstrap.min.css";
-
-.wrapper {
-    width:auto;
-}
-
-#pageContainer .panel-body {
-    margin: 0 auto;
-    width: 960px;
-    padding: 15px;
-}
-.mod-header {
-    position: sticky;
-    top:0;
-    z-index: 100;
-    background-color: #fff;
-    box-shadow: 0 1px 2px rgba(0,0,0,0.05);
-    margin-bottom: 10px;
-}
-#pageContainer label {
-    font-weight: normal;
-    margin-bottom: 0;
-}
-
-#pageContainer h4 {
-    color: #333;
-    font-size: 18px;
-    margin-top: 25px;
-    margin-bottom: 12px;
-    padding-bottom: 8px;
-    border-bottom : 1px solid #eee;
-}
-
-h5,h4 {
-    padding-bottom: 5px;
-}
-.t-hlt {
-    color:#f00;
-    font-style: italic;
-}
-
-#MAX_JSON_KEYS_NUMBER {
-    width: 80px;
-    height: auto;
-    display: inline-block;
-    padding: 4px 10px;
-}
-.x-disabled {
-    opacity: 0.2;
-}
-.box-config {
-    padding: 10px;
-    border: 1px solid #e5e5e5;
-    border-radius: 8px;
-    border-top: 0;
-}
-
-#setShortcuts {
-    font-size: 14px;
-    text-decoration: none;
-    color: #007bff;
-    display: inline-block;
-    margin-bottom: 5px;
-}
-#setShortcuts:hover {
-    color:#0056b3;
-    text-decoration: underline;
-}
-.x-tips {
-    font-size: 12px;
-    color: #999;
-}
-.x-tips b i {
-    text-decoration: underline;
-}
-.x-donate {
-    font-size: 14px;
-    color: #d00;
-    margin-left: 10px;
-    text-decoration: underline;
-    text-decoration-style: double;
-    cursor: default;
-}
-.box-donate .x-donate-img {
-    width: 360px;
-}
-.btn-donate {
-    padding: 0 20px;
-}
-.mod-dynamic-tool {
-    padding-left: 0;
-    border: 1px solid #eee;
-    border-radius: 4px;
-    overflow: hidden;
-}
-.mod-dynamic-tool li {
-    list-style: none;
-    border-bottom: 1px solid #eee;
-    padding: 8px 12px;
-    display: flex;
-    align-items: center;
-    gap: 8px;
-    background-color: #fff;
-}
-.mod-dynamic-tool li:last-child {
-    border-bottom: none;
-}
-.mod-dynamic-tool li:hover {
-    border-bottom-color: #eee;
-    background-color: #f8f9fa;
-}
-.mod-dynamic-tool li .x-btn-box {
-    text-align: right;
-    min-width: auto;
-    margin-left: auto;
-    display: flex;
-    gap: 5px;
-}
-.mod-dynamic-tool li i {
-    width: 16px;
-    height: 16px;
-    display: inline-flex;
-    align-items: center;
-    justify-content: center;
-    margin-right: 4px;
-    color: #495057;
-    font-style: normal;
-    font-size: 14px;
-    flex-shrink: 0;
-}
-.mod-dynamic-tool li b {
-    width: auto;
-    flex-shrink: 0;
-    color: #333;
-}
-.mod-dynamic-tool li .x-tips {
-    flex-grow: 1;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    color: #999;
-}
-.mod-dynamic-tool .btn-xs {
-    padding: 2px 8px;
-    font-size: 12px;
-    border-radius: 3px;
-}
-.mod-dynamic-tool .btn {
-    position: relative;
-}
-.st-item {
-    margin-bottom: 10px;
-}
-.st-item input[type="checkbox"] {
-    margin-right: 5px;
-}
-.st-item label {
-    line-height: normal;
-}
-.st-item label .x-tips {
-}
-.st-item .box-inner {
-}
-.st-item .a-btn {
-    font-size: 12px;
-    text-decoration: underline;
-}
-.btn-disabled,
-.btn-disabled:hover,
-.btn-disabled:active,
-.btn-disabled:focus{
-    color: #aaa;
-    background-color: #ddd;
-    border-color: #ddd;
-    cursor:not-allowed;
-}
-.x-sort-box {
-    margin-right: 10px;
-    user-select: none;
-    display: flex;
-    align-items: center;
-    gap: 5px;
-}
-.x-sort-box i {
-    cursor: pointer;
-    font-weight: bold;
-}
-.x-sort-box i:hover {
-    color:#007bff;
-}
-.x-sort-box i.x-hidden {
-    opacity: 0.2;
-    cursor: default;
-}
-.x-cur-version {
-    font-size: 12px;
-    margin-top: 4px;
-}
-.x-cur-version b,.x-cur-version i {
-    background: #6c757d;
-    padding: 2px 6px;
-    border-radius: 3px 0 0 3px;
-    color: #fff;
-    font-weight: normal;
-    font-style: normal;
-    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
-    line-height: 1.5;
-}
-.x-cur-version i {
-    border-radius: 0 3px 3px 0;
-    background: #007bff;
-}
-[v-cloak] {
-    display: none;
-}
-.x-count-down {
-    color:#f00;
-    font-size: 12px;
-}
-.x-count-down b {
-    color:#0b0;
-}
-.panel-low-version {
-    text-align: center;
-    padding-top: 200px;
-    color: #bbb;
-}
-.panel-low-version a {
-    text-decoration: underline;
-}
-.panel-low-version b {
-    color:#888;
-    font-weight: normal;
-}

+ 285 - 144
apps/options/index.html

@@ -1,186 +1,327 @@
 <!DOCTYPE HTML>
 <html lang="zh-CN">
 <head>
-    <title>FeHelper-插件配置</title>
+    <title>FeHelper-插件市场</title>
     <meta charset="utf-8">
     <link rel="stylesheet" href="index.css"/>
+    <link rel="stylesheet" href="market.css"/>
     <script type="text/javascript" src="../static/vendor/evalCore.min.js"></script>
     <script type="text/javascript" src="../static/vendor/vue/vue.js"></script>
 </head>
 <body>
 
-<div class="wrapper" id="pageContainer">
-
-    <div class="panel-low-version" v-if="!es6Support">
-        FeHelper无法在<b>此低版本</b>的浏览器上正常工作!建议<b>升级到最新版</b>后再继续使用哦~~~
-    </div>
-
-    <div v-cloak v-if="es6Support">
-        <div class="panel panel-default mod-header">
-            <div class="panel-heading">
-                <h3 class="panel-title">
-                    <a href="https://www.baidufe.com/fehelper/index/index.html" target="_blank" class="x-a-high">
-                        <img src="../static/img/fe-16.png" alt="fehelper"/> FeHelper</a>:插件配置
-                    <span class="ui-fl-r x-cur-version"><b>当前版本</b><i>v{{manifest.version}}</i></span>
-                </h3>
+<div class="wrapper" id="marketContainer">
+    <div class="main-navbar">
+        <div class="navbar-brand">
+            <a href="https://www.baidufe.com/fehelper/index/index.html" target="_blank" class="brand-link">
+                <img src="../static/img/fe-16.png" alt="fehelper"/> 
+                <span class="brand-text">FeHelper</span>
+                <span class="brand-subtitle">插件市场</span>
+            </a>
+        </div>
+        <div class="navbar-actions">
+            <a href="#" @click="openDonateModal" class="nav-item donate-link">
+                <i class="nav-icon">❤</i>
+                <span>打赏鼓励</span>
+            </a>
+            <a href="#" @click="showSettings" class="nav-item settings-link">
+                <i class="nav-icon">⚙</i>
+                <span>插件设置</span>
+            </a>
+            <div class="version-info">
+                <!-- 当版本相同时显示简化信息 -->
+                <div v-if="latestVersion && !needUpdate" class="version-latest">
+                    <i class="version-check-icon">✓</i>
+                    <span>当前已是最新版 </span>
+                    <span class="version-number">v{{manifest.version}}</span>
+                </div>
+                
+                <!-- 当版本不同或未获取到最新版本时显示详细信息 -->
+                <template v-else>
+                    <div class="version-details">
+                        <div class="version-label">当前版本:</div>
+                        <div class="current-version">v{{manifest.version}}</div>
+                    </div>
+                    <div class="version-details">
+                        <div class="version-label">最新版本:</div>
+                        <div class="latest-version-text" v-if="latestVersion">v{{latestVersion}}</div>
+                        <div class="latest-version-container" v-else>
+                            <img class="latest-version-img" @click="openStorePage" src="https://img.shields.io/chrome-web-store/v/pkgccpejnmalmdinmhkkfafefagiiiad?style=flat-square&label=%20" alt="最新版本">
+                        </div>
+                    </div>
+                    <button v-if="needUpdate" @click="openStorePage" class="update-btn">立即更新</button>
+                </template>
             </div>
         </div>
+    </div>
 
-        <div class="panel-body mod-content">
-
-        <!-- ==============开发者板块============== -->
-        <div class="row">
-            <h4># 打赏一下鼓励升级!  <span class="x-tips">(很高兴这个插件能帮助到大家,也感谢大家对这个产品的认可,我尽量抽时间保持更新😄)</span></h4>
+    <div class="market-container" v-cloak>
 
-            <div class="row ui-mt-10 btn-donate">
-                <button class="btn btn-success" @click="donateToggle(1)">码农不易,来杯咖啡☕️ </button>
-                <button class="btn btn-danger"  @click="donateToggle(0)">我先用着,以后再说😄</button>
-            </div>
+        <!-- 设置弹窗 -->
+        <div class="settings-modal" v-if="showSettingsModal" v-cloak>
+            <div class="settings-dialog">
+                <div class="settings-header">
+                    <h3>FeHelper插件配置</h3>
+                    <span class="close-btn" @click="closeSettings">&times;</span>
+                </div>
+                <div class="settings-body">
+                    <!-- FH快捷键设置 -->
+                    <div class="settings-section">
+                        <h4># FH快捷键 <span class="x-tips">(设置一些快捷键,用起来会更方便些)</span></h4>
+                        <a href="#" @click="setShortcuts" id="setShortcuts">&gt;&gt; 点击配置FeHelper快捷键(当前快捷键为:{{ defaultKey }})&gt;&gt;</a> <br>
+                        <div class="x-tips">
+                            Tips:按下<b>快捷键</b>,自动打开FeHelper工具!然后用「上/下」方向键选择功能,「回车键」直接打开!
+                        </div>
+                    </div>
 
-            <div class="box-donate hide" ref="boxDonate">
-                <img :src="donate.image" alt="donate" class="x-donate-img">
+                    <!-- FH基本配置 -->
+                    <div class="settings-section">
+                        <h4># FH基本配置 <span class="x-tips">(插件的一些基础配置,可以在这里统一操作)</span></h4>
+                        <div class="box-config">
+                            <div class="st-item">
+                                <input type="checkbox" value="OPT_ITEM_CONTEXTMENUS" id="opt_item_contextMenus" v-model="selectedOpts"/>
+                                <label for="opt_item_contextMenus">将&nbsp;<b><i>FeHelper工具</i></b>&nbsp;添加到右键菜单<span class="x-tips">(如果你喜欢用右键菜单来使用FeHelper的方式,那可以在这里开启)</span></label> <br/>
+
+                                <div class="box-inner row ui-ml-20" :class="{'x-disabled':!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')}">
+                                    <div class="row-line">
+                                        <input type="checkbox" id="MENU_DOWNLOAD_CRX" v-model="menuDownloadCrx" :disabled="!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')"/>
+                                        <label for="MENU_DOWNLOAD_CRX">将&nbsp;<b><i>插件分享/下载</i></b>&nbsp;添加到右键菜单</label>
+                                    </div>
+                                    <div class="row-line">
+                                        <input type="checkbox" id="MENU_FEHELPER_SETTING" v-model="menuFeHelperSeting" :disabled="!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')"/>
+                                        <label for="MENU_FEHELPER_SETTING">将&nbsp;<b><i>FeHelper设置</i></b>&nbsp;添加到右键菜单</label>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="st-item">
+                                <input type="checkbox" value="FORBID_OPEN_IN_NEW_TAB" id="FORBID_OPEN_IN_NEW_TAB" v-model="selectedOpts"/>
+                                <label for="FORBID_OPEN_IN_NEW_TAB">禁止在多个 Tab页/窗口 同时打开<span class="x-tips">(如果同一个工具,您只希望保留一个活动窗口,那可以勾选上)</span></label> <br/>
+                            </div>
+
+                            <div class="st-item">
+                                <input type="checkbox" value="CONTENT_SCRIPT_ALLOW_ALL_FRAMES" id="CONTENT_SCRIPT_ALLOW_ALL_FRAMES" v-model="selectedOpts"/>
+                                <label for="CONTENT_SCRIPT_ALLOW_ALL_FRAMES">授权FeHelper访问页面所有iframe<span class="x-tips">(默认不对网页内嵌的iframe支持,如果有需要可自行开启)</span></label> <br/>
+                            </div>
+
+                            <div class="st-item">
+                                <input type="checkbox" value="JSON_PAGE_FORMAT" id="JSON_PAGE_FORMAT" v-model="selectedOpts"/>
+                                <label for="JSON_PAGE_FORMAT">开启JSON自动美化功能(页面自动检测并格式化,你可在JSON自动美化后进行工具高级定制,包括皮肤等)</label> <br/>
+                            </div>
+
+                            <div class="st-item" v-if="!isFirefox">
+                                <input type="checkbox" value="AUTO_DARK_MODE" id="AUTO_DARK_MODE" v-model="selectedOpts"/>
+                                <label for="AUTO_DARK_MODE">自动开启夜间模式(<span class="x-tips">眼睛保卫战,晚上<b><i>19:00~06:00</i></b>使用工具的时候自动开启夜间模式)</span></label>
+                                <a href="#" class="a-btn" @click="turnLight($event)">体验一下夜间模式!</a>
+                                <span class="x-count-down" v-cloak v-if="countDown>0">本次体验将在<b>{{countDown}}秒</b>后自动结束...</span> <br/>
+
+                                <div class="box-inner row ui-ml-20" :class="{'x-disabled':!selectedOpts.includes('AUTO_DARK_MODE')}">
+                                    <div class="row-line">
+                                        <input type="checkbox" value="ALWAYS_DARK_MODE" id="ALWAYS_DARK_MODE" v-model="selectedOpts" :disabled="!selectedOpts.includes('AUTO_DARK_MODE')"/>
+                                        <label for="ALWAYS_DARK_MODE">始终开启夜间模式(<span class="x-tips">忽略时间限制,随时Dark Mode)</span></label>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="settings-footer">
+                    <button class="btn btn-success" @click="saveSettings">保存</button>
+                    <button class="btn btn-danger" @click="closeSettings">取消</button>
+                </div>
             </div>
-            
         </div>
 
-        <div class="row ui-mt-20">
-            <h4># FH快捷键  <span class="x-tips">(设置一些快捷键,用起来会更方便些)</span></h4>
-
-            <a href="#" @click="setShortcuts" id="setShortcuts">&gt;&gt; 点击配置FeHelper快捷键(当前快捷键为:{{ defaultKey }})&gt;&gt;</a> <br>
-            <div class="x-tips">
-                Tips:按下<b>快捷键</b>,自动打开FeHelper工具!然后用「上/下」方向键选择功能,「回车键」直接打开!
+        <!-- 打赏模态框 -->
+        <div class="settings-modal donate-modal" v-if="showDonateModal" v-cloak>
+            <div class="settings-dialog">
+                <div class="settings-header">
+                    <h3># 打赏一下鼓励升级!</h3>
+                    <span class="close-btn" @click="closeDonateModal">&times;</span>
+                </div>
+                <div class="settings-body">
+                    <div class="donate-content">
+                        <p class="donate-desc">很高兴这个插件能帮助到大家,也感谢大家对这个产品的认可,我尽量抽时间保持更新😄</p>
+                        <div class="donate-qrcode">
+                            <img :src="donate.image" alt="微信打赏二维码" class="donate-image">
+                            <p class="donate-text">{{donate.text}}</p>
+                        </div>
+                    </div>
+                </div>
+                <div class="settings-footer">
+                    <button class="btn btn-success" @click="closeDonateModal">我已打赏</button>
+                    <button class="btn btn-danger" @click="closeDonateModal">以后再说</button>
+                </div>
             </div>
         </div>
 
-        <div class="row ui-mt-20">
-            <h4># FH基本配置 <span class="x-tips">(插件的一些基础配置,可以在这里统一操作)</span></h4>
-
-            <div class="box-config">
-
-                <div class="st-item">
-                    <input type="checkbox" value="OPT_ITEM_CONTEXTMENUS" id="opt_item_contextMenus" v-model="selectedOpts"/>
-                    <label for="opt_item_contextMenus">将&nbsp;<b><i>FeHelper工具</i></b>&nbsp;添加到右键菜单<span class="x-tips">(如果你喜欢用右键菜单来使用FeHelper的方式,那可以在这里开启)</span></label> <br/>
-
-                    <div class="box-inner row ui-ml-20" :class="{'x-disabled':!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')}">
-                        <div class="row-line">
-                            <input type="checkbox" id="MENU_DOWNLOAD_CRX" v-model="menuDownloadCrx" :disabled="!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')"/>
-                            <label for="MENU_DOWNLOAD_CRX">将&nbsp;<b><i>插件分享/下载</i></b>&nbsp;添加到右键菜单</label>
-                        </div>
-                        <div class="row-line">
-                            <input type="checkbox" id="MENU_FEHELPER_SETTING" v-model="menuFeHelperSeting" :disabled="!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')"/>
-                            <label for="MENU_FEHELPER_SETTING">将&nbsp;<b><i>FeHelper设置</i></b>&nbsp;添加到右键菜单</label>
-                        </div>
+        <!-- 自定义确认对话框 -->
+        <div class="settings-modal confirm-modal" v-if="confirmDialog.show" v-cloak>
+            <div class="settings-dialog">
+                <div class="settings-header">
+                    <h3>{{ confirmDialog.title }}</h3>
+                    <span class="close-btn" @click="cancelConfirm">&times;</span>
+                </div>
+                <div class="settings-body">
+                    <div class="confirm-content">
+                        <div class="confirm-icon">❓</div>
+                        <p class="confirm-message">{{ confirmDialog.message }}</p>
                     </div>
                 </div>
-
-                <div class="st-item">
-                    <input type="checkbox" value="FORBID_OPEN_IN_NEW_TAB" id="FORBID_OPEN_IN_NEW_TAB" v-model="selectedOpts"/>
-                    <label for="FORBID_OPEN_IN_NEW_TAB">禁止在多个 Tab页/窗口 同时打开<span class="x-tips">(如果同一个工具,您只希望保留一个活动窗口,那可以勾选上)</span></label> <br/>
+                <div class="settings-footer">
+                    <button class="btn btn-success" @click="confirmAction">确定</button>
+                    <button class="btn btn-danger" @click="cancelConfirm">取消</button>
                 </div>
+            </div>
+        </div>
 
-                <div class="st-item">
-                    <input type="checkbox" value="CONTENT_SCRIPT_ALLOW_ALL_FRAMES" id="CONTENT_SCRIPT_ALLOW_ALL_FRAMES" v-model="selectedOpts"/>
-                    <label for="CONTENT_SCRIPT_ALLOW_ALL_FRAMES">授权FeHelper访问页面所有iframe<span class="x-tips">(默认不对网页内嵌的iframe支持,如果有需要可自行开启)</span></label> <br/>
+        <!-- 推荐位和广告位 -->
+        <div class="recommendation-container">
+            <div class="recommendation-section hot-tools">
+                <div class="recommendation-card" @click="installTool('json-format')">
+                    <div class="rec-icon">🔍</div>
+                    <div class="rec-content">
+                        <h4>JSON格式化</h4>
+                        <p>最受欢迎的JSON数据查看和美化工具</p>
+                        <span class="must-tag">必装</span>
+                    </div>
                 </div>
-
-                <div class="st-item">
-                    <input type="checkbox" value="JSON_PAGE_FORMAT" id="JSON_PAGE_FORMAT" v-model="selectedOpts"/>
-                    <label for="JSON_PAGE_FORMAT">开启JSON自动美化功能(<span class="x-tips">页面<b><i>自动检测并格式化</i></b>,您可在JSON自动美化页面进行工具<b><i>高级定制</i></b>,包括皮肤自定义等)</span></label> <br/>
+                <div class="recommendation-card" @click="installTool('chart')">
+                    <div class="rec-icon">📊</div>
+                    <div class="rec-content">
+                        <h4>图表制作工具</h4>
+                        <p>支持多种数据可视化图表,快速生成专业图表</p>
+                        <span class="new-tag">最新</span>
+                    </div>
                 </div>
-
-                <div class="st-item" v-if="!isFirefox">
-                    <input type="checkbox" value="AUTO_DARK_MODE" id="AUTO_DARK_MODE" v-model="selectedOpts"/>
-                    <label for="AUTO_DARK_MODE">自动开启夜间模式(<span class="x-tips">眼睛保卫战,晚上<b><i>19:00~06:00</i></b>使用工具的时候自动开启夜间模式)</span></label>
-                    <a href="#" class="a-btn" @click="turnLight($event)">体验一下夜间模式!</a>
-                    <span class="x-count-down" v-cloak v-if="countDown>0">本次体验将在<b>{{countDown}}秒</b>后自动结束...</span> <br/>
-
-                    <div class="box-inner row ui-ml-20" :class="{'x-disabled':!selectedOpts.includes('AUTO_DARK_MODE')}">
-                        <div class="row-line">
-                            <input type="checkbox" value="ALWAYS_DARK_MODE" id="ALWAYS_DARK_MODE" v-model="selectedOpts" :disabled="!selectedOpts.includes('AUTO_DARK_MODE')"/>
-                            <label for="ALWAYS_DARK_MODE">始终开启夜间模式(<span class="x-tips">忽略时间限制,随时Dark Mode)</span></label>
-                        </div>
+                <div class="recommendation-card" @click="installTool('qr-code')">
+                    <div class="rec-icon">📱</div>
+                    <div class="rec-content">
+                        <h4>二维码工具</h4>
+                        <p>快速生成和识别二维码,支持自定义样式</p>
+                        <span class="recommend-tag">推荐</span>
                     </div>
                 </div>
-
-                <div class="ui-mt-10">
-                    <button class="btn btn-success" @click="save()">保存</button>
-                    <button class="btn btn-danger"  @click="cancel()">放弃</button>
+                <div class="recommendation-card ad-card">
+                    <div class="rec-icon ad-icon">🔔</div>
+                    <div class="rec-content">
+                        <h4>推广位</h4>
+                        <p>高效的开发工具套件,助力开发者提升效率</p>
+                        <span class="ad-tag">广告</span>
+                    </div>
                 </div>
-                    
             </div>
         </div>
 
-
-        <!-- ==============FH插件市场板块============== -->
-        <div class="row ui-mt-20">
-            <h4># FH应用市场 <span class="x-tips">(严格遵循Google官方要求的插件<span class="t-hlt">「单一用途原则」</span>,所以就按需安装吧!当然,你也可以<a href="#" @click="openFeOnline()">&nbsp;去官网使用在线免安装版&gt;&gt;</a>)</span></h4>
-
-            <ul class="mod-dynamic-tool">
-                <!-- 先展示已安装的 -->
-                <li v-for="(tool,index) in Object.keys(fhTools)" v-if="!fhTools[tool]._devTool && tool !== 'devtools' && fhTools[tool].installed">
-                    <i>{{fhTools[tool].menuConfig && fhTools[tool].menuConfig[0] && fhTools[tool].menuConfig[0].icon || '@'}}</i>
-                    <b>{{fhTools[tool].name}}</b>
-                    <span class="x-tips">({{fhTools[tool].tips}})</span>
-
-                    <span class="ui-fl-r x-btn-box">
-                        <button class="btn btn-danger btn-xs" @click="offLoad(tool,$event)" v-if="!fhTools[tool].systemInstalled">卸载</button>
-                        <button class="btn btn-disabled btn-xs" v-if="fhTools[tool].systemInstalled" title="系统预装,不可被卸载">卸载</button>
-                        <button class="btn btn-xs" :class="fhTools[tool].menu ? 'btn-warning' : 'btn-info'" @click="menuMgr(tool,$event)">{{fhTools[tool].menu ? '移出' : '加入'}}右键</button>
-                    </span>
-
-                    <span class="ui-fl-r x-sort-box" v-if="fhTools[tool].installed">
-                        <i title="上移" :class="index === 0 ? 'x-hidden' : ''" @click="sortUp(index)">⇧</i>
-                        <i title="下移" :class="index === sortArray.length-1 ? 'x-hidden' : ''" @click="sortDown(index)">⇩</i>
-                    </span>
-                </li>
-
-                <!-- 再展示未安装的 -->
-                <li v-for="(tool,index) in Object.keys(fhTools)" v-if="!fhTools[tool]._devTool && tool !== 'devtools' && !fhTools[tool].installed">
-                    <i>{{fhTools[tool].menuConfig && fhTools[tool].menuConfig[0] && fhTools[tool].menuConfig[0].icon || '@'}}</i>
-                    <b>{{fhTools[tool].name}}</b>
-                    <span class="x-tips">({{fhTools[tool].tips}})</span>
-
-                    <span class="ui-fl-r x-btn-box">
-                        <button class="btn btn-success btn-xs" @click="install(tool,$event)">安装<span class="x-progress"></span></button>
-                    </span>
-                </li>
-            </ul>
+        
+        <!-- 顶部搜索和筛选区 -->
+        <div class="market-header">
+            <div class="search-filters-container">
+                <div class="search-box">
+                    <i class="search-icon">🔍</i>
+                    <input type="text" v-model="searchKey" placeholder="搜索工具..." @input="handleSearch">
+                </div>
+                <div class="filter-group">
+                    <select v-model="currentCategory" @change="handleCategoryChange(currentCategory)" class="filter-select">
+                        <option value="">全部分类</option>
+                        <option v-for="category in categories" :value="category.key">{{category.name}}</option>
+                    </select>
+                </div>
+                <div class="filter-group">
+                    <select v-model="sortType" @change="handleSort" class="filter-select">
+                        <option value="default">默认排序</option>
+                        <option value="newest">最新</option>
+                        <option value="hot">最热</option>
+                    </select>
+                </div>
+                <div class="view-toggle">
+                    <span class="view-btn" :class="{ active: viewMode === 'grid' }" @click="saveViewMode('grid')">网格视图</span>
+                    <span class="view-btn" :class="{ active: viewMode === 'list' }" @click="saveViewMode('list')">列表视图</span>
+                </div>
+            </div>
         </div>
+        
+        <!-- 主体内容区 -->
+        <div class="market-content">
+            <!-- 侧边栏 -->
+            <div class="market-sidebar">
+                <div class="sidebar-section">
+                    <h4>工具分类</h4>
+                    <ul class="category-list">
+                        <li :class="{active: currentCategory === ''}" 
+                            @click="handleCategoryChange('')">
+                            全部分类
+                            <span class="count">({{Object.keys(originalTools).length}})</span>
+                        </li>
+                        <li v-for="category in categories" 
+                            :class="{active: currentCategory === category.key}"
+                            @click="handleCategoryChange(category.key)">
+                            {{category.name}}
+                            <span class="count">({{getCategoryCount(category.key)}})</span>
+                        </li>
+                    </ul>
+                </div>
+                <div class="sidebar-section">
+                    <h4>我的工具</h4>
+                    <ul class="my-tools">
+                        <li @click="showMyInstalled">
+                            已安装
+                            <span class="count">({{installedCount}})</span>
+                        </li>
+                        <li @click="showMyFavorites">
+                            我的收藏
+                            <span class="count">({{getFavoritesCount()}})</span>
+                        </li>
+                        <li @click="showRecentUsed">
+                            最近使用
+                            <span class="count">({{getRecentCount()}})</span>
+                        </li>
+                    </ul>
+                </div>
+            </div>
 
-        <!-- ==============开发者板块============== -->
-        <div class="row ui-mt-10">
-            <hr>
-            <h4># FH开发者板块  <span class="x-tips">(FeHelper开放平台化,你可以在安装<span class="t-hlt">「{{fhTools.devtools && fhTools.devtools.name}}」</span>后,开发属于你自己的FH工具!)</span></h4>
-
-            <ul class="mod-dynamic-tool">
-                <li v-for="(tool,index) in Object.keys(fhTools)" v-if="fhTools[tool]._devTool || tool === 'devtools'">
-                    <i>{{fhTools[tool].menuConfig && fhTools[tool].menuConfig[0] && fhTools[tool].menuConfig[0].icon || '@'}}</i>
-                    <b>{{fhTools[tool].name}}</b>
-                    <span class="x-tips">({{fhTools[tool].tips}})</span>
-
-                    <span class="ui-fl-r x-btn-box">
-                        <template v-if="tool === 'devtools'">
-                            <button class="btn btn-success btn-xs" @click="install(tool,$event)" v-if="!fhTools[tool].installed">安装<span class="x-progress"></span></button>
-                            <button class="btn btn-danger btn-xs" @click="offLoad(tool,$event)" v-if="fhTools[tool].installed">卸载</button>
-                            <button class="btn btn-xs" :class="fhTools[tool].menu ? 'btn-warning' : 'btn-info'" @click="menuMgr(tool,$event)" v-if="fhTools[tool].installed">{{fhTools[tool].menu ? '移出' : '加入'}}右键</button>
-                        </template>
-
-                        <template v-if="tool !== 'devtools'">
-                            <button class="btn btn-xs" :class="fhTools[tool]._enable ? 'btn-success' : 'btn-default'" style="cursor: default">{{fhTools[tool]._enable ? '启用中' : '已停用'}}</button>
-                            <button class="btn btn-xs" :class="fhTools[tool].menu ? 'btn-warning' : 'btn-info'" @click="menuMgr(tool,$event)" v-if="fhTools[tool]._enable">{{fhTools[tool].menu ? '移出' : '加入'}}右键</button>
-                        </template>
-                    </span>
-                </li>
-            </ul>
+            <!-- 工具展示区 -->
+            <div class="tools-grid">
+                <div :class="['tools-container', viewMode]">
+                    <div v-for="tool in filteredTools" 
+                         :key="tool.key" 
+                         class="tool-card"
+                         :data-category="getToolCategory(tool.key)">
+                        <div class="tool-info">
+                            <h3>
+                                <span class="tool-icon">{{tool.menuConfig[0].icon}}</span>
+                                {{tool.name}}
+                            </h3>
+                            <p class="tool-desc">{{tool.tips}}</p>
+                        </div>
+                        <div class="tool-actions">
+                            <button :class="['btn', tool.installed ? 'btn-danger' : 'btn-success', 'btn-xs']"
+                                    @click="tool.installed ? uninstallTool(tool.key) : installTool(tool.key)"
+                                    :disabled="tool.systemInstalled && tool.installed"
+                                    :data-tool="tool.key">
+                                {{tool.installed ? '卸载' : '安装'}}<span class="x-progress"></span>
+                            </button>
+                            <button class="btn btn-xs" :class="tool.inContextMenu ? 'btn-warning' : 'btn-info'"
+                                    v-if="tool.installed"
+                                    @click="toggleContextMenu(tool.key)">
+                                {{tool.inContextMenu ? '移出右键' : '加入右键'}}
+                            </button>
+                            <button class="btn btn-default btn-xs" 
+                                    :class="{active: tool.favorite}"
+                                    @click="toggleFavorite(tool.key)">
+                                <span class="favorite-icon">❤</span>
+                                {{tool.favorite ? '已收藏' : '收藏'}}
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
         </div>
-
-
-    </div>
     </div>
 </div>
 
 <script src="../static/js/dark-mode.js"></script>
-<script type="module" src="index.js"></script>
+<script type="module" src="market.js"></script>
 
 </body>
-</html>
+</html> 

+ 0 - 329
apps/options/index.js

@@ -1,329 +0,0 @@
-/**
- * FeHelper Options Page
- */
-
-import Settings from './settings.js';
-import Awesome from '../background/awesome.js'
-import MSG_TYPE from '../static/js/common.js';
-
-new Vue({
-    el: '#pageContainer',
-    data: {
-        es6Support:true,
-        defaultKey: 'Alt+Shift+J',
-        selectedOpts: [],
-        manifest: {},
-        fhTools: {},
-        menuFeHelperSeting: false,
-        menuDownloadCrx: false,
-        sortArray: [],
-        donate: {
-            text: '微信打赏!鼓励升级!',
-            image: './donate.jpeg'
-        },
-        countDown: 0,
-        isFirefox: /Firefox/.test(navigator.userAgent)
-    },
-
-    created: function () {
-        // 页面滤镜:关掉
-        !this.isFirefox && DarkModeMgr.turnLightAuto();
-
-        this.initData().then(() => {
-            this.shortCut();
-            this.remoteHotFix();
-        });
-    },
-
-    methods: {
-
-        initData: async function () {
-
-            this.manifest = chrome.runtime.getManifest();
-
-            Settings.getOptions((opts) => {
-                this.selectedOpts = Object.keys(opts).filter(k => String(opts[k]) === 'true');
-            });
-
-            this.sortArray = await Awesome.SortToolMgr.get();
-
-            // 获取两个特殊右键菜单项的安装情况
-            Awesome.menuMgr('fehelper-setting', 'get').then(value => {
-                this.menuFeHelperSeting = String(value) !== '0';
-            });
-            Awesome.menuMgr('download-crx', 'get').then(value => {
-                this.menuDownloadCrx = String(value) === '1';
-            });
-
-            Awesome.getAllTools().then(tools => {
-                this.fhTools = tools;
-                let isSortArrEmpty = !this.sortArray.length;
-
-                Object.keys(tools).forEach(tool => {                    
-                    if (tools[tool] && tools[tool].installed) {
-                        isSortArrEmpty && (tool !== 'devtools') && this.sortArray.push(tool);
-                    }
-                });
-                this.sortTools();
-            });
-        },
-
-        shortCut: function () {
-            // 获取当前热键
-            chrome.commands && chrome.commands.getAll && chrome.commands.getAll(keys => {
-                keys.some(key => {
-                    if (key.name === '_execute_browser_action' && key.shortcut) {
-                        this.defaultKey = key.shortcut;
-                        return true;
-                    }
-                });
-            });
-        },
-
-        sortTools: function (repaintMenu) {
-
-            let tools = {};
-            let installed = {};
-            Object.keys(this.fhTools).forEach(tool => {
-                if (this.fhTools[tool] && this.fhTools[tool].installed) {
-                    installed[tool] = this.fhTools[tool];
-                }
-            });
-            if (this.sortArray.length) {
-                this.sortArray.forEach(tool => {
-                    if (this.fhTools[tool]) {
-                        tools[tool] = installed[tool];
-                    }else{
-                        Awesome.offLoad(tool);
-                    }
-                });
-                Awesome.SortToolMgr.set(this.sortArray);
-            } else {
-                tools = installed;
-            }
-
-            Object.keys(this.fhTools).forEach(tool => {
-                if (!tools[tool]) {
-                    tools[tool] = this.fhTools[tool];
-                }
-            });
-            this.fhTools = tools;
-            this.$forceUpdate();
-
-            // 重绘右键菜单,以确保排序实时更新
-            repaintMenu && chrome.runtime.sendMessage({
-                type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
-                action: `menu-upgrade`,
-                showTips: false,
-                menuOnly: true
-            });
-        },
-        sortUp: function (index) {
-            if(index == 0) return;
-            this.sortArray[index] = this.sortArray.splice(index - 1, 1, this.sortArray[index])[0];
-            this.sortTools(true);
-        },
-        sortDown: function (index) {
-            if(index == this.sortArray.length-1) return;
-            this.sortArray[index] = this.sortArray.splice(index + 1, 1, this.sortArray[index])[0];
-            this.sortTools(true);
-        },
-
-        remoteHotFix: function () {
-            let hotfix = () => {
-                // 从服务器同步最新添加的一些工具,实现远程更新,无需提审FeHelper
-                let remoteHotfixUrl = `${this.manifest.homepage_url}/static/js/hotfix.js?cur_ver=${new Date().toLocaleDateString()}`;
-                fetch(remoteHotfixUrl).then(resp => resp.text()).then(jsText => {
-                    try {
-                        if (!jsText) return false;
-                        window.evalCore.getEvalInstance(window)(jsText);
-                    } catch (e) {
-                    }
-                }).catch(error => console.log('远程热修复失败:', error));
-            };
-            setTimeout(hotfix, 2000);
-        },
-
-        close: () => {
-            chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
-                chrome.tabs.remove(tabs[0].id);
-            });
-        },
-
-        cancel: function () {
-            this.close();
-        },
-
-        save: function () {
-            // 还要保存两个特殊的菜单配置项
-            let settingAction = this.menuFeHelperSeting ? 'install' : 'offload';
-            let crxAction = this.menuDownloadCrx ? 'install' : 'offload';
-            Awesome.menuMgr('fehelper-setting', settingAction).then(() => {
-                Awesome.menuMgr('download-crx', crxAction).then(() => {
-                    chrome.runtime.sendMessage({
-                        type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
-                        action: `menu-${crxAction}`,
-                        showTips: false,
-                        menuOnly: true
-                    }).then(() => {
-                        Settings.setOptions(this.selectedOpts, () => {
-                            // 保存成功提示,同时更新Menu
-                            chrome.runtime.sendMessage({
-                                type: MSG_TYPE.DYNAMIC_ANY_THING,
-                                thing: 'save-options'
-                            });
-
-                            // 自动开关灯一次
-                            DarkModeMgr.turnLightAuto();
-                        });
-                    });
-                });
-            });
-        },
-
-        setShortcuts: function () {
-            chrome.tabs.create({
-                url: 'chrome://extensions/shortcuts'
-            });
-            return false;
-        },
-
-        donateToggle: function (type) {
-            let box = this.$refs.boxDonate;
-            if (type === 1) {
-                box.classList.remove('hide');
-            } else {
-                box.classList.add('hide');
-            }
-        },
-
-        install: function (tool, event) {
-
-            let btn = event.target;
-            if (btn.tagName.toLowerCase() === 'i') {
-                btn = btn.parentNode;
-            }
-
-            if (btn.getAttribute('data-undergoing') === '1') {
-                return false;
-            }
-            btn.setAttribute('data-undergoing', 1);
-            let elProgress = btn.querySelector('span.x-progress');
-
-            // 显示安装进度
-            let pt = 1;
-            Awesome.install(tool).then(() => {
-                elProgress.textContent = `(${pt}%)`;
-                let ptInterval = setInterval(() => {
-                    elProgress.textContent = `(${pt}%)`;
-                    pt+= Math.floor(Math.random() * 20);
-                    if(pt>100) {
-                        clearInterval(ptInterval);
-                        elProgress.textContent = ``;
-                        this.fhTools[tool].installed = true;
-                        if (!this.sortArray.includes(tool) && (tool !== 'devtools')) {
-                            this.sortArray.push(tool);
-                        }
-                        // 按照安装状态进行排序
-                        this.sortTools();
-                        btn.setAttribute('data-undergoing', 0);
-
-                        chrome.runtime.sendMessage({
-                            type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
-                            toolName: tool,
-                            action: 'install',
-                            showTips: true
-                        });
-                    }
-                },100);
-            });
-        },
-
-        offLoad: function (tool, event) {
-
-            if(!confirm('防止误操作;请再次确认是否要卸载这个工具?')) {
-                return;
-            }
-
-            if (event.target.getAttribute('data-undergoing') === '1') {
-                return false;
-            }
-            event.target.setAttribute('data-undergoing', 1);
-
-            Awesome.offLoad(tool).then(() => {
-                chrome.runtime.sendMessage({
-                    type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
-                    action: 'offload',
-                    showTips: true
-                });
-
-                this.fhTools[tool].installed = false;
-                event.target.setAttribute('data-undergoing', 0);
-                let index = this.sortArray.indexOf(tool);
-                index !== -1 && this.sortArray.splice(index, 1);
-
-                // 继续移除右键菜单
-                Awesome.menuMgr(tool, 'offload').then(() => {
-                    this.fhTools[tool].menu = false;
-
-                    chrome.runtime.sendMessage({
-                        type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
-                        action: `menu-offload`,
-                        showTips: false,
-                        menuOnly: true
-                    });
-
-                    // 按照安装状态进行排序
-                    this.sortTools();
-                });
-            });
-        },
-
-        menuMgr: function (tool, event) {
-
-            if (event.target.getAttribute('data-undergoing') === '1') {
-                return false;
-            }
-            event.target.setAttribute('data-undergoing', 1);
-
-            let offLoadMode = this.fhTools[tool].menu;
-            let action = offLoadMode ? 'offload' : 'install';
-
-            Awesome.menuMgr(tool, action).then(() => {
-                chrome.runtime.sendMessage({
-                    type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
-                    action: `menu-${action}`,
-                    showTips: true,
-                    menuOnly: true
-                });
-
-                this.fhTools[tool].menu = !offLoadMode;
-                event.target.setAttribute('data-undergoing', 0);
-
-                // 页面强制刷新渲染
-                this.$forceUpdate();
-            });
-        },
-
-        turnLight(event) {
-            event.preventDefault();
-            event.stopPropagation();
-            DarkModeMgr.turnLight(true);
-            this.countDown = 5;
-            let intervalId = setInterval(() => {
-                if (this.countDown === 0) {
-                    DarkModeMgr.turnLight(false);
-                    clearInterval(intervalId);
-                } else {
-                    this.countDown--;
-                }
-            }, 1000);
-        },
-
-        openFeOnline: function () {
-            chrome.tabs.create({
-                url: this.manifest.homepage_url
-            });
-        }
-    }
-});

+ 1 - 0
apps/options/market.css

@@ -455,6 +455,7 @@
     box-shadow: 0 2px 8px rgba(0,0,0,0.1);
     cursor: pointer;
     transition: all 0.3s ease;
+    position: relative;
 }
 
 .recommendation-card:hover {

+ 0 - 327
apps/options/market.html

@@ -1,327 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="zh-CN">
-<head>
-    <title>FeHelper-插件市场</title>
-    <meta charset="utf-8">
-    <link rel="stylesheet" href="index.css"/>
-    <link rel="stylesheet" href="market.css"/>
-    <script type="text/javascript" src="../static/vendor/evalCore.min.js"></script>
-    <script type="text/javascript" src="../static/vendor/vue/vue.js"></script>
-</head>
-<body>
-
-<div class="wrapper" id="marketContainer">
-    <div class="main-navbar">
-        <div class="navbar-brand">
-            <a href="https://www.baidufe.com/fehelper/index/index.html" target="_blank" class="brand-link">
-                <img src="../static/img/fe-16.png" alt="fehelper"/> 
-                <span class="brand-text">FeHelper</span>
-                <span class="brand-subtitle">插件市场</span>
-            </a>
-        </div>
-        <div class="navbar-actions">
-            <a href="#" @click="openDonateModal" class="nav-item donate-link">
-                <i class="nav-icon">❤</i>
-                <span>打赏鼓励</span>
-            </a>
-            <a href="#" @click="showSettings" class="nav-item settings-link">
-                <i class="nav-icon">⚙</i>
-                <span>插件设置</span>
-            </a>
-            <div class="version-info">
-                <!-- 当版本相同时显示简化信息 -->
-                <div v-if="latestVersion && !needUpdate" class="version-latest">
-                    <i class="version-check-icon">✓</i>
-                    <span>当前已是最新版 </span>
-                    <span class="version-number">v{{manifest.version}}</span>
-                </div>
-                
-                <!-- 当版本不同或未获取到最新版本时显示详细信息 -->
-                <template v-else>
-                    <div class="version-details">
-                        <div class="version-label">当前版本:</div>
-                        <div class="current-version">v{{manifest.version}}</div>
-                    </div>
-                    <div class="version-details">
-                        <div class="version-label">最新版本:</div>
-                        <div class="latest-version-text" v-if="latestVersion">v{{latestVersion}}</div>
-                        <div class="latest-version-container" v-else>
-                            <img class="latest-version-img" @click="openStorePage" src="https://img.shields.io/chrome-web-store/v/pkgccpejnmalmdinmhkkfafefagiiiad?style=flat-square&label=%20" alt="最新版本">
-                        </div>
-                    </div>
-                    <button v-if="needUpdate" @click="openStorePage" class="update-btn">立即更新</button>
-                </template>
-            </div>
-        </div>
-    </div>
-
-    <div class="market-container" v-cloak>
-
-        <!-- 设置弹窗 -->
-        <div class="settings-modal" v-if="showSettingsModal" v-cloak>
-            <div class="settings-dialog">
-                <div class="settings-header">
-                    <h3>FeHelper插件配置</h3>
-                    <span class="close-btn" @click="closeSettings">&times;</span>
-                </div>
-                <div class="settings-body">
-                    <!-- FH快捷键设置 -->
-                    <div class="settings-section">
-                        <h4># FH快捷键 <span class="x-tips">(设置一些快捷键,用起来会更方便些)</span></h4>
-                        <a href="#" @click="setShortcuts" id="setShortcuts">&gt;&gt; 点击配置FeHelper快捷键(当前快捷键为:{{ defaultKey }})&gt;&gt;</a> <br>
-                        <div class="x-tips">
-                            Tips:按下<b>快捷键</b>,自动打开FeHelper工具!然后用「上/下」方向键选择功能,「回车键」直接打开!
-                        </div>
-                    </div>
-
-                    <!-- FH基本配置 -->
-                    <div class="settings-section">
-                        <h4># FH基本配置 <span class="x-tips">(插件的一些基础配置,可以在这里统一操作)</span></h4>
-                        <div class="box-config">
-                            <div class="st-item">
-                                <input type="checkbox" value="OPT_ITEM_CONTEXTMENUS" id="opt_item_contextMenus" v-model="selectedOpts"/>
-                                <label for="opt_item_contextMenus">将&nbsp;<b><i>FeHelper工具</i></b>&nbsp;添加到右键菜单<span class="x-tips">(如果你喜欢用右键菜单来使用FeHelper的方式,那可以在这里开启)</span></label> <br/>
-
-                                <div class="box-inner row ui-ml-20" :class="{'x-disabled':!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')}">
-                                    <div class="row-line">
-                                        <input type="checkbox" id="MENU_DOWNLOAD_CRX" v-model="menuDownloadCrx" :disabled="!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')"/>
-                                        <label for="MENU_DOWNLOAD_CRX">将&nbsp;<b><i>插件分享/下载</i></b>&nbsp;添加到右键菜单</label>
-                                    </div>
-                                    <div class="row-line">
-                                        <input type="checkbox" id="MENU_FEHELPER_SETTING" v-model="menuFeHelperSeting" :disabled="!selectedOpts.includes('OPT_ITEM_CONTEXTMENUS')"/>
-                                        <label for="MENU_FEHELPER_SETTING">将&nbsp;<b><i>FeHelper设置</i></b>&nbsp;添加到右键菜单</label>
-                                    </div>
-                                </div>
-                            </div>
-
-                            <div class="st-item">
-                                <input type="checkbox" value="FORBID_OPEN_IN_NEW_TAB" id="FORBID_OPEN_IN_NEW_TAB" v-model="selectedOpts"/>
-                                <label for="FORBID_OPEN_IN_NEW_TAB">禁止在多个 Tab页/窗口 同时打开<span class="x-tips">(如果同一个工具,您只希望保留一个活动窗口,那可以勾选上)</span></label> <br/>
-                            </div>
-
-                            <div class="st-item">
-                                <input type="checkbox" value="CONTENT_SCRIPT_ALLOW_ALL_FRAMES" id="CONTENT_SCRIPT_ALLOW_ALL_FRAMES" v-model="selectedOpts"/>
-                                <label for="CONTENT_SCRIPT_ALLOW_ALL_FRAMES">授权FeHelper访问页面所有iframe<span class="x-tips">(默认不对网页内嵌的iframe支持,如果有需要可自行开启)</span></label> <br/>
-                            </div>
-
-                            <div class="st-item">
-                                <input type="checkbox" value="JSON_PAGE_FORMAT" id="JSON_PAGE_FORMAT" v-model="selectedOpts"/>
-                                <label for="JSON_PAGE_FORMAT">开启JSON自动美化功能(页面自动检测并格式化,你可在JSON自动美化后进行工具高级定制,包括皮肤等)</label> <br/>
-                            </div>
-
-                            <div class="st-item" v-if="!isFirefox">
-                                <input type="checkbox" value="AUTO_DARK_MODE" id="AUTO_DARK_MODE" v-model="selectedOpts"/>
-                                <label for="AUTO_DARK_MODE">自动开启夜间模式(<span class="x-tips">眼睛保卫战,晚上<b><i>19:00~06:00</i></b>使用工具的时候自动开启夜间模式)</span></label>
-                                <a href="#" class="a-btn" @click="turnLight($event)">体验一下夜间模式!</a>
-                                <span class="x-count-down" v-cloak v-if="countDown>0">本次体验将在<b>{{countDown}}秒</b>后自动结束...</span> <br/>
-
-                                <div class="box-inner row ui-ml-20" :class="{'x-disabled':!selectedOpts.includes('AUTO_DARK_MODE')}">
-                                    <div class="row-line">
-                                        <input type="checkbox" value="ALWAYS_DARK_MODE" id="ALWAYS_DARK_MODE" v-model="selectedOpts" :disabled="!selectedOpts.includes('AUTO_DARK_MODE')"/>
-                                        <label for="ALWAYS_DARK_MODE">始终开启夜间模式(<span class="x-tips">忽略时间限制,随时Dark Mode)</span></label>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="settings-footer">
-                    <button class="btn btn-success" @click="saveSettings">保存</button>
-                    <button class="btn btn-danger" @click="closeSettings">取消</button>
-                </div>
-            </div>
-        </div>
-
-        <!-- 打赏模态框 -->
-        <div class="settings-modal donate-modal" v-if="showDonateModal" v-cloak>
-            <div class="settings-dialog">
-                <div class="settings-header">
-                    <h3># 打赏一下鼓励升级!</h3>
-                    <span class="close-btn" @click="closeDonateModal">&times;</span>
-                </div>
-                <div class="settings-body">
-                    <div class="donate-content">
-                        <p class="donate-desc">很高兴这个插件能帮助到大家,也感谢大家对这个产品的认可,我尽量抽时间保持更新😄</p>
-                        <div class="donate-qrcode">
-                            <img :src="donate.image" alt="微信打赏二维码" class="donate-image">
-                            <p class="donate-text">{{donate.text}}</p>
-                        </div>
-                    </div>
-                </div>
-                <div class="settings-footer">
-                    <button class="btn btn-success" @click="closeDonateModal">我已打赏</button>
-                    <button class="btn btn-danger" @click="closeDonateModal">以后再说</button>
-                </div>
-            </div>
-        </div>
-
-        <!-- 自定义确认对话框 -->
-        <div class="settings-modal confirm-modal" v-if="confirmDialog.show" v-cloak>
-            <div class="settings-dialog">
-                <div class="settings-header">
-                    <h3>{{ confirmDialog.title }}</h3>
-                    <span class="close-btn" @click="cancelConfirm">&times;</span>
-                </div>
-                <div class="settings-body">
-                    <div class="confirm-content">
-                        <div class="confirm-icon">❓</div>
-                        <p class="confirm-message">{{ confirmDialog.message }}</p>
-                    </div>
-                </div>
-                <div class="settings-footer">
-                    <button class="btn btn-success" @click="confirmAction">确定</button>
-                    <button class="btn btn-danger" @click="cancelConfirm">取消</button>
-                </div>
-            </div>
-        </div>
-
-        <!-- 推荐位和广告位 -->
-        <div class="recommendation-container">
-            <div class="recommendation-section hot-tools">
-                <div class="recommendation-card" @click="installTool('json-format')">
-                    <div class="rec-icon">🔍</div>
-                    <div class="rec-content">
-                        <h4>JSON格式化</h4>
-                        <p>最受欢迎的JSON数据查看和美化工具</p>
-                        <span class="must-tag">必装</span>
-                    </div>
-                </div>
-                <div class="recommendation-card" @click="installTool('chart')">
-                    <div class="rec-icon">📊</div>
-                    <div class="rec-content">
-                        <h4>图表制作工具</h4>
-                        <p>支持多种数据可视化图表,快速生成专业图表</p>
-                        <span class="new-tag">最新</span>
-                    </div>
-                </div>
-                <div class="recommendation-card" @click="installTool('qr-code')">
-                    <div class="rec-icon">📱</div>
-                    <div class="rec-content">
-                        <h4>二维码工具</h4>
-                        <p>快速生成和识别二维码,支持自定义样式</p>
-                        <span class="recommend-tag">推荐</span>
-                    </div>
-                </div>
-                <div class="recommendation-card ad-card">
-                    <div class="rec-icon ad-icon">🔔</div>
-                    <div class="rec-content">
-                        <h4>推广位</h4>
-                        <p>高效的开发工具套件,助力开发者提升效率</p>
-                        <span class="ad-tag">广告</span>
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        
-        <!-- 顶部搜索和筛选区 -->
-        <div class="market-header">
-            <div class="search-filters-container">
-                <div class="search-box">
-                    <i class="search-icon">🔍</i>
-                    <input type="text" v-model="searchKey" placeholder="搜索工具..." @input="handleSearch">
-                </div>
-                <div class="filter-group">
-                    <select v-model="currentCategory" @change="handleCategoryChange(currentCategory)" class="filter-select">
-                        <option value="">全部分类</option>
-                        <option v-for="category in categories" :value="category.key">{{category.name}}</option>
-                    </select>
-                </div>
-                <div class="filter-group">
-                    <select v-model="sortType" @change="handleSort" class="filter-select">
-                        <option value="default">默认排序</option>
-                        <option value="newest">最新</option>
-                        <option value="hot">最热</option>
-                    </select>
-                </div>
-                <div class="view-toggle">
-                    <span class="view-btn" :class="{ active: viewMode === 'grid' }" @click="saveViewMode('grid')">网格视图</span>
-                    <span class="view-btn" :class="{ active: viewMode === 'list' }" @click="saveViewMode('list')">列表视图</span>
-                </div>
-            </div>
-        </div>
-        
-        <!-- 主体内容区 -->
-        <div class="market-content">
-            <!-- 侧边栏 -->
-            <div class="market-sidebar">
-                <div class="sidebar-section">
-                    <h4>工具分类</h4>
-                    <ul class="category-list">
-                        <li :class="{active: currentCategory === ''}" 
-                            @click="handleCategoryChange('')">
-                            全部分类
-                            <span class="count">({{Object.keys(originalTools).length}})</span>
-                        </li>
-                        <li v-for="category in categories" 
-                            :class="{active: currentCategory === category.key}"
-                            @click="handleCategoryChange(category.key)">
-                            {{category.name}}
-                            <span class="count">({{getCategoryCount(category.key)}})</span>
-                        </li>
-                    </ul>
-                </div>
-                <div class="sidebar-section">
-                    <h4>我的工具</h4>
-                    <ul class="my-tools">
-                        <li @click="showMyInstalled">
-                            已安装
-                            <span class="count">({{installedCount}})</span>
-                        </li>
-                        <li @click="showMyFavorites">
-                            我的收藏
-                            <span class="count">({{getFavoritesCount()}})</span>
-                        </li>
-                        <li @click="showRecentUsed">
-                            最近使用
-                            <span class="count">({{getRecentCount()}})</span>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-
-            <!-- 工具展示区 -->
-            <div class="tools-grid">
-                <div :class="['tools-container', viewMode]">
-                    <div v-for="tool in filteredTools" 
-                         :key="tool.key" 
-                         class="tool-card"
-                         :data-category="getToolCategory(tool.key)">
-                        <div class="tool-info">
-                            <h3>
-                                <span class="tool-icon">{{tool.menuConfig[0].icon}}</span>
-                                {{tool.name}}
-                            </h3>
-                            <p class="tool-desc">{{tool.tips}}</p>
-                        </div>
-                        <div class="tool-actions">
-                            <button :class="['btn', tool.installed ? 'btn-danger' : 'btn-success', 'btn-xs']"
-                                    @click="tool.installed ? uninstallTool(tool.key) : installTool(tool.key)"
-                                    :disabled="tool.systemInstalled && tool.installed"
-                                    :data-tool="tool.key">
-                                {{tool.installed ? '卸载' : '安装'}}<span class="x-progress"></span>
-                            </button>
-                            <button class="btn btn-xs" :class="tool.inContextMenu ? 'btn-warning' : 'btn-info'"
-                                    v-if="tool.installed"
-                                    @click="toggleContextMenu(tool.key)">
-                                {{tool.inContextMenu ? '移出右键' : '加入右键'}}
-                            </button>
-                            <button class="btn btn-default btn-xs" 
-                                    :class="{active: tool.favorite}"
-                                    @click="toggleFavorite(tool.key)">
-                                <span class="favorite-icon">❤</span>
-                                {{tool.favorite ? '已收藏' : '收藏'}}
-                            </button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-<script src="../static/js/dark-mode.js"></script>
-<script type="module" src="market.js"></script>
-
-</body>
-</html> 

+ 55 - 31
apps/popup/index.css

@@ -13,38 +13,43 @@
 }
 
 .fe-function-title {
-    padding: 5px;
-    color: #522;
-    font-weight: bolder;
+    padding: 8px 12px;
+    color: #2b2d42;
+    font-weight: 600;
     cursor: default;
-    border-bottom: 1px dotted #aaa;
-    text-align: center;
+    border-bottom: 1px solid rgba(67, 97, 238, 0.1);
+    background: linear-gradient(to right, #f8f9ff, #f0f2ff);
     font-size: 12px;
+    letter-spacing: 0.5px;
 }
 
 .fe-function-title span {
     font-weight: normal;
-    color: #e1e1e1;
+    color: #999;
+    font-size: 10px;
 }
 
 ul.fe-function-list {
-    padding: 0 10px;
+    padding: 0;
     list-style: none;
-    width: 130px;
+    width: 100%;
+    margin: 0;
 }
 
 ul.fe-function-list li {
-    padding: 3px 5px 3px 5px;
+    padding: 2px 16px 2px 40px;
     cursor: pointer;
-    color: #555;
-    -webkit-transition: all .4s ease;
-    text-align: justify;
+    color: #4a4c6d;
+    transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
     display: block;
-    height: 20px;
-    line-height: 20px;
-    width: 120px;
-    border-bottom: 1px dashed #e5e5e5;
-    overflow: hidden;
+    align-items: center;
+    height: 28px;
+    border-radius: 6px;
+    margin: 2px 0;
+    border-bottom: 1px solid rgba(67, 97, 238, 0.05);
+    text-align: justify;
+    position: relative;
+    line-height: 28px;
 }
 
 ul.fe-function-list li:last-child {
@@ -53,8 +58,10 @@ ul.fe-function-list li:last-child {
 
 ul.fe-function-list li.x-hovered,
 ul.fe-function-list li:hover {
-    color: #ff3C11;
-    background: #f1f1f1;
+    color: #000;
+    background: rgba(67, 97, 238, 0.08);
+    box-shadow: 0 2px 6px rgba(67, 97, 238, 0.08);
+    font-weight: 600;
 }
 
 ul.fe-function-list li > span {
@@ -70,12 +77,26 @@ ul.fe-function-list li:after {
 }
 
 ul.fe-function-list li > b {
-    width: 14px;
-    height: 14px;
-    -webkit-transition: all .5s ease;
-    display: inline-block;
-    margin-right: 5px;
-    color:#48f;
+    width: 20px;
+    height: 20px;
+    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    background: rgba(0,0,0,0.1);
+    padding: 0px;
+    border-radius: 50%;
+    margin-right: 2px;
+    color: currentColor;
+    filter: drop-shadow(0 2px 4px rgba(67, 97, 238, 0.1));
+    position: absolute;
+    left: 10px;
+    top: 6px;
+}
+
+/* 暗黑模式适配 */
+.dark-mode .fe-function-list li > b {
+    background: rgba(255,255,255,0.1);
 }
 
 ul.fe-function-list li:hover > b {
@@ -89,15 +110,17 @@ ul.fe-function-list li i {
 }
 
 .fe-feedback {
-    font-size: 12px;
-    border-top: 1px dotted #ddd;
-    padding: 5px 15px;
-    line-height: 20px;
-    color: #888;
+    font-size: 13px;
+    border-top: 1px solid rgba(67, 97, 238, 0.08);
+    padding: 8px 16px;
+    margin-top: 0px;
+    background: linear-gradient(to right, rgba(67, 97, 238, 0.05), rgba(67, 97, 238, 0.05));
+    color: var(--text-color);
+    opacity: 0.9;
 }
 
 .fe-feedback a {
-    color: #888;
+    color: #666;
     text-decoration: none;
     text-align: left;
 }
@@ -132,6 +155,7 @@ svg:not(:root) {
     margin-left: 5px;
     display: inline-flex;
     align-items: center;
+    color: #666;
 }
 
 .fe-feedback .x-settings:hover {

+ 7 - 13
apps/popup/index.html

@@ -17,22 +17,16 @@
             </ul>
             <div class="fe-feedback">
 
-                <a href="https://github.com/zxlie/FeHelper" @click="openUrl($event)" target="_blank" tabindex="-1" class="x-github" title="访问Github">
-                    <svg height="16" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="16" aria-hidden="true">
-                        <path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path>
-                    </svg>
-                </a>
-
-                <span class="x-settings" @click="openOptionsPage()" title="FeHelper配置">
-                    <svg aria-hidden="true" height="16" version="1.1" viewBox="0 0 14 16" width="14">
-                        <path fill-rule="evenodd" d="M14 8.77v-1.6l-1.94-.64-.45-1.09.88-1.84-1.13-1.13-1.81.91-1.09-.45-.69-1.92h-1.6l-.63 1.94-1.11.45-1.84-.88-1.13 1.13.91 1.81-.45 1.09L0 7.23v1.59l1.94.64.45 1.09-.88 1.84 1.13 1.13 1.81-.91 1.09.45.69 1.92h1.59l.63-1.94 1.11-.45 1.84.88 1.13-1.13-.92-1.81.47-1.09L14 8.75v.02zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"></path>
-                    </svg>插件市场</span>
-
-                <!-- <a href="https://github.com/zxlie/FeHelper/issues" @click="openUrl($event)" target="_blank" tabindex="-1" class="x-fb" title="提交意见反馈">
+                <a href="https://github.com/zxlie/FeHelper/issues" @click="openUrl($event)" target="_blank" tabindex="-1" class="x-github" title="提交意见反馈">
                     <svg version="1.1" width="14" height="14" viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve">
                         <path d="M384,0H42.667C19.093,0,0.213,19.093,0.213,42.667L0,426.667l85.333-85.333H384c23.573,0,42.667-19.093,42.667-42.667v-256C426.667,19.093,407.573,0,384,0z M234.667,256H192v-42.667h42.667V256z M234.667,170.667H192V85.333h42.667V170.667z"/>
                     </svg>反馈
-                </a> -->
+                </a> 
+
+                <span class="x-settings" @click="openOptionsPage()" title="FeHelper配置">
+                    <svg aria-hidden="true" height="16" version="1.1" viewBox="0 0 14 16" width="14">
+                        <path fill="currentColor" d="M12 2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2zm-1 9H5V9h6v2zm0-4H5V5h6v2z"/>
+                    </svg>市场</span>
             </div>
         </div>
         <script src="../static/js/dark-mode.js"></script>