From 54b2a470c28b42ddfcf0d0282ede0117bcd6e405 Mon Sep 17 00:00:00 2001 From: "yinjun.chen1" Date: Mon, 14 Sep 2026 14:40:59 +0800 Subject: [PATCH] no message --- env-store.js | 6 ++ popup.css | 156 +++++++++++++++++++++++++---- popup.html | 119 ++++++++++++---------- popup.js | 211 +++++++++++++++++++++++++++++++--------- tests/env-store.test.js | 12 +++ 5 files changed, 385 insertions(+), 119 deletions(-) diff --git a/env-store.js b/env-store.js index 1c2e9f7..35af4b2 100644 --- a/env-store.js +++ b/env-store.js @@ -63,8 +63,13 @@ await storage().set({ [ACTIVE_ENV_KEY]: envId }); } + const MAX_ENVIRONMENTS = 5; + async function createEnvironment(name) { const { environments } = await loadEnvironments(); + if (environments.length >= MAX_ENVIRONMENTS) { + throw new Error(`最多 ${MAX_ENVIRONMENTS} 个环境`); + } const env = { id: genId(), name, configs: [] }; environments.push(env); await saveEnvironments(environments, env.id); @@ -133,6 +138,7 @@ return { ENV_KEY, ACTIVE_ENV_KEY, + MAX_ENVIRONMENTS, loadEnvironments, saveEnvironments, getActiveEnv, diff --git a/popup.css b/popup.css index 59d021d..1601236 100644 --- a/popup.css +++ b/popup.css @@ -386,6 +386,13 @@ h2 { justify-content: center; } +.btn-lock { + position: fixed; + top: 8px; + right: 8px; + z-index: 10; +} + .form-group label { display: block; margin-bottom: 4px; @@ -422,57 +429,59 @@ h2 { font-size: 11px; } -.selector-help { +.advanced-options { background: #16213e; border: 1px solid #0f3460; border-radius: 6px; - padding: 8px 10px; + padding: 10px 12px; margin-bottom: 12px; } -.selector-help summary { +.advanced-options summary { cursor: pointer; color: #a0a0b0; font-size: 12px; user-select: none; list-style: none; + font-weight: 500; } -.selector-help summary::-webkit-details-marker { +.advanced-options summary::-webkit-details-marker { display: none; } -.selector-help summary::before { - content: "▶ "; +.advanced-options summary::before { + content: "▶"; color: #e94560; font-size: 10px; + margin-right: 10px; transition: transform 0.2s; display: inline-block; } -.selector-help[open] summary::before { - content: "▼ "; +.advanced-options[open] summary::before { + content: "▼"; } -.selector-help-body { - margin-top: 10px; - padding-top: 8px; +.advanced-options-body { + margin-top: 12px; + padding-top: 10px; border-top: 1px dashed #0f3460; } -.selector-help-body p { +.advanced-options-body p { font-size: 11px; line-height: 1.6; color: #a0a0b0; margin-bottom: 6px; } -.selector-help-body .help-tip { +.advanced-options-body .help-tip { color: #e94560; font-weight: 500; } -.selector-help-body code { +.advanced-options-body code { background: #0f1d3a; padding: 1px 4px; border-radius: 3px; @@ -481,7 +490,7 @@ h2 { font-family: Consolas, Monaco, monospace; } -.selector-help-body kbd { +.advanced-options-body kbd { background: #0f1d3a; border: 1px solid #0f3460; border-radius: 3px; @@ -491,7 +500,7 @@ h2 { font-family: Consolas, Monaco, monospace; } -.selector-help-body .icon-arrow { +.advanced-options-body .icon-arrow { display: inline-block; padding: 1px 5px; background: #0f3460; @@ -500,7 +509,7 @@ h2 { font-size: 11px; } -.selector-help-body .rule-tag { +.advanced-options-body .rule-tag { display: inline-block; padding: 1px 5px; margin: 0 2px; @@ -512,6 +521,14 @@ h2 { font-family: Consolas, Monaco, monospace; } +.selector-tutorial { + margin: 8px 0 10px; + padding: 8px 10px; + background: rgba(15, 52, 96, 0.25); + border-left: 3px solid #0f3460; + border-radius: 4px; +} + .password-wrapper { display: flex; gap: 6px; @@ -697,6 +714,47 @@ h2 { font-size: 13px; } +/* 空状态:缺省图标 */ +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 32px 16px 24px; + text-align: center; +} + +.empty-icon { + color: #0f3460; + margin-bottom: 14px; + opacity: 0.85; +} + +.empty-icon svg { + display: block; +} + +.empty-text { + font-size: 14px; + color: #a0a0b0; + margin-bottom: 6px; + font-weight: 500; +} + +.empty-sub { + font-size: 11px; + color: #555; + line-height: 1.6; +} + +/* 禁用按钮 */ +.btn-io.btn-disabled, +.btn-io:disabled { + opacity: 0.4; + cursor: not-allowed; + pointer-events: none; +} + .toast { position: fixed; bottom: 10px; @@ -810,6 +868,70 @@ h2 { flex: 1; } +/* 环境管理对话框列表 */ +.env-manage-list { + display: flex; + flex-direction: column; + gap: 6px; + max-height: 280px; + overflow-y: auto; + margin-bottom: 8px; +} + +.env-manage-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 10px; + background: #16213e; + border: 1px solid #0f3460; + border-radius: 4px; +} + +.env-manage-row.active { + border-color: #e94560; + background: rgba(233, 69, 96, 0.08); +} + +.env-manage-name { + font-size: 13px; + color: #e0e0e0; + display: flex; + align-items: center; + gap: 6px; +} + +.env-manage-count { + color: #a0a0b0; + font-size: 11px; +} + +.env-manage-active-mark { + display: inline-block; + padding: 1px 6px; + background: #e94560; + color: #fff; + font-size: 10px; + border-radius: 8px; +} + +.env-manage-actions { + display: flex; + gap: 6px; +} + +.env-manage-actions button { + padding: 4px 10px; + font-size: 12px; +} + +.env-manage-empty { + text-align: center; + color: #a0a0b0; + font-size: 12px; + padding: 20px; +} + .strength-block { margin-top: 10px; } diff --git a/popup.html b/popup.html index e14baf4..92d1368 100644 --- a/popup.html +++ b/popup.html @@ -28,23 +28,21 @@ -
- - - 方便识别该配置,留空则显示域名 -
@@ -70,57 +63,62 @@
-
-
- - -
-
- - - 关闭后该配置不再参与匹配(保留数据) -
-
- - - 某些页面(Ant Design、ASP.NET)需 JS 初始化,立即填充会失效 + + + 方便识别该配置,留空则显示域名
-
- 高级选项:自定义输入框和登录按钮位置(选填) -
-

下面三项通常留空即可,插件会自动找到登录框。只有当自动填充失败、或填错位置时才需要填。

-

1. 在登录页面按 F12 打开开发者工具,切到"Elements(元素)"标签

-

2. 点开发者工具左上角的 箭头图标,再去点页面上的输入框/按钮

-

3. 工具会跳到对应的 HTML 行,在 <input> 或 <button> 标签上看 id、name、class、type 属性

-

4. 按 #id、.class、[name=xxx]、tag[属性=值] 规则组合填写即可

+
+ 高级选项(选填,默认即可) +
+
+ + +
+
+ + + 禁用后该条配置将不会生效 +
+
+ + + 某些页面(Ant Design、ASP.NET)需 JS 初始化,立即填充会失效 +
+
+

下面三项通常留空即可,插件会自动找到登录框。只有当自动填充失败、或填错位置时才需要填。

+

1. 在登录页面按 F12 打开开发者工具,切到"Elements(元素)"标签

+

2. 点开发者工具左上角的 箭头图标,再去点页面上的输入框/按钮

+

3. 工具会跳到对应的 HTML 行,在 <input> 或 <button> 标签上看 id、name、class、type 属性

+

4. 按 #id、.class、[name=xxx]、tag[属性=值] 规则组合填写即可

+
+
+ + + 留空即可。填错会导致用户名填不进框。 +
+
+ + + 留空即可。填错会导致密码填不进框。 +
+
+ + + 留空即可。填错会导致不会自动点击登录。 +
-
- - - 留空即可。填错会导致用户名填不进框。 -
-
- - - 留空即可。填错会导致密码填不进框。 -
-
- - - 留空即可。填错会导致不会自动点击登录。 -
-
+

已配置域名

@@ -144,6 +142,19 @@
+ + +