@dsh-plus/access-gate 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +523 -449
- package/package.json +4 -2
- package/src/client/card.tsx +147 -221
- package/src/client/client.ts +5 -84
- package/src/client/i18n.ts +7 -24
- package/src/client/styles.ts +13 -53
- package/src/client/scope.ts +0 -53
package/src/client/styles.ts
CHANGED
|
@@ -1,55 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* 配置卡片样式:基础规则走 @dsh-plus/shared/client 的 cardCss('dag'),
|
|
3
|
+
* 本文件只补插件特有规则(textarea / 诊断面板 / 警示条)。
|
|
4
|
+
* 沿用官方 data-plugin / data-plugin-css 约定(HMR 据此卸载)。
|
|
4
5
|
* @module access-gate/client/styles
|
|
5
6
|
*/
|
|
7
|
+
import { cardCss, injectCardStyle } from '@dsh-plus/shared/client'
|
|
6
8
|
|
|
7
9
|
export const PLUGIN_ID = '@dsh-plus/access-gate'
|
|
8
|
-
export const STYLE_TAG_ID = `${PLUGIN_ID}/card.css`
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
.dag-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}
|
|
12
|
-
.dag-card:hover{border-color:var(--dsw-alias-label-dimmed)}
|
|
13
|
-
.dag-cardOpen{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}
|
|
14
|
-
.dag-header{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}
|
|
15
|
-
.dag-header:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:-2px}
|
|
16
|
-
.dag-headText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}
|
|
17
|
-
.dag-name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}
|
|
18
|
-
.dag-description{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}
|
|
19
|
-
.dag-chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s;font-size:12px}
|
|
20
|
-
.dag-chevronOpen{transform:rotate(180deg)}
|
|
21
|
-
.dag-pending{white-space:nowrap;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}
|
|
22
|
-
.dag-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding-bottom:8px}
|
|
23
|
-
.dag-field{flex-direction:column;gap:6px;padding:12px 0;display:flex}
|
|
24
|
-
.dag-field+.dag-field{border-top:1px solid var(--dsw-alias-border-l2)}
|
|
25
|
-
.dag-head{align-items:center;gap:8px;display:flex}
|
|
26
|
-
.dag-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}
|
|
27
|
-
.dag-badge{white-space:nowrap;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}
|
|
28
|
-
.dag-badgeSet{background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary)}
|
|
29
|
-
.dag-badgeUnset{color:var(--dsw-alias-label-tertiary)}
|
|
30
|
-
.dag-input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 12px;font-size:13px}
|
|
31
|
-
.dag-input:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}
|
|
32
|
-
.dag-input:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}
|
|
33
|
-
.dag-inputInvalid{border-color:var(--dsw-alias-label-error)}
|
|
11
|
+
const extraCss = `
|
|
34
12
|
.dag-textarea{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;padding:8px 12px;font-size:13px;line-height:1.6;min-height:96px;resize:vertical;font-family:var(--dsw-alias-font-mono,ui-monospace,monospace)}
|
|
35
13
|
.dag-textarea:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}
|
|
36
14
|
.dag-textarea:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}
|
|
37
|
-
.dag-hint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.5}
|
|
38
|
-
.dag-invalid{color:var(--dsw-alias-label-error);margin:0;font-size:12px;line-height:1.5}
|
|
39
|
-
.dag-checkRow{align-items:center;gap:8px;display:flex;padding:6px 0}
|
|
40
|
-
.dag-checkRow input{accent-color:var(--dsw-alias-brand-primary)}
|
|
41
|
-
.dag-checkRow label{color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.5;cursor:pointer}
|
|
42
|
-
.dag-groupLabel{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600;padding:12px 0 2px;margin:0}
|
|
43
|
-
.dag-readOnly{color:var(--dsw-alias-label-tertiary);margin:12px 0 0;font-size:12px;line-height:1.5}
|
|
44
|
-
.dag-footer{border-top:1px solid var(--dsw-alias-border-l2);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex;flex-wrap:wrap}
|
|
45
|
-
.dag-status{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;margin:0;font-size:12px;line-height:1.5}
|
|
46
|
-
.dag-statusError{color:var(--dsw-alias-label-error)}
|
|
47
|
-
.dag-btn{appearance:none;font:inherit;cursor:pointer;border:1px solid #0000;border-radius:8px;padding:5px 14px;font-size:13px;line-height:1.5}
|
|
48
|
-
.dag-btnGhost{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:0 0}
|
|
49
|
-
.dag-btnGhost:hover:not(:disabled){color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-dimmed)}
|
|
50
|
-
.dag-btnPrimary{background:var(--dsh-plus-brand,#3d6dff);color:#fff}
|
|
51
|
-
.dag-btn:disabled{opacity:.4;cursor:default}
|
|
52
|
-
.dag-btn:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}
|
|
53
15
|
.dag-diag{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:10px 12px;margin:12px 0 0;flex-direction:column;gap:4px;display:flex}
|
|
54
16
|
.dag-diagTitle{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:600;margin:0}
|
|
55
17
|
.dag-diagRow{display:flex;gap:8px;font-size:12px;line-height:1.6}
|
|
@@ -57,18 +19,16 @@ export const cardCss = `
|
|
|
57
19
|
.dag-diagVal{color:var(--dsw-alias-label-primary);margin:0}
|
|
58
20
|
.dag-diagWarn{color:var(--dsw-alias-label-error);border-color:var(--dsw-alias-label-error)}
|
|
59
21
|
.dag-warn{color:var(--dsh-plus-warn,#c9503f);border:1px solid var(--dsh-plus-warn-border,rgba(201,80,63,.4));border-radius:8px;padding:8px 12px;margin:12px 0 0;font-size:12px;line-height:1.6}
|
|
22
|
+
@media (max-width:767px){
|
|
23
|
+
.dag-diagRow{flex-direction:column;gap:2px}
|
|
24
|
+
.dag-diagKey{min-width:0}
|
|
25
|
+
.dag-textarea{font-size:16px}
|
|
26
|
+
}
|
|
60
27
|
`
|
|
61
28
|
|
|
29
|
+
export const cardCssAll = cardCss('dag', extraCss)
|
|
30
|
+
|
|
62
31
|
/** 幂等注入样式标签;返回标签(已存在或环境无 document 时为 null)。 */
|
|
63
32
|
export function injectStyle(): HTMLStyleElement | null {
|
|
64
|
-
|
|
65
|
-
if (document.querySelector(`style[data-plugin-css=${JSON.stringify(STYLE_TAG_ID)}]`) !== null) {
|
|
66
|
-
return null
|
|
67
|
-
}
|
|
68
|
-
const tag = document.createElement('style')
|
|
69
|
-
tag.dataset.plugin = PLUGIN_ID
|
|
70
|
-
tag.dataset.pluginCss = STYLE_TAG_ID
|
|
71
|
-
tag.textContent = cardCss
|
|
72
|
-
document.head.append(tag)
|
|
73
|
-
return tag
|
|
33
|
+
return injectCardStyle(PLUGIN_ID, cardCssAll)
|
|
74
34
|
}
|
package/src/client/scope.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 浏览器半 settingsScope/connection 的最小本地接口声明(notify-email 同款)。
|
|
3
|
-
* 只声明本插件用到的窄面,避免为构建期类型引入整条官方 client 依赖树;
|
|
4
|
-
* 运行时契约以官方 dsh-client-connection 的 settings RPC 面为准。
|
|
5
|
-
* @module access-gate/client/scope
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/** settings 命名空间 scope 的快照(官方 SettingsScopeSnapshot 的最小投影)。 */
|
|
9
|
-
export interface ScopeSnapshot {
|
|
10
|
-
status: 'loading' | 'ready' | 'unavailable'
|
|
11
|
-
/** schema 解析后的配置值(secret 字段已脱敏剥除)。 */
|
|
12
|
-
value: unknown
|
|
13
|
-
/** 命名空间 revision,写操作 fencing 用;首次 Host 应答前为 undefined。 */
|
|
14
|
-
revision: number | undefined
|
|
15
|
-
/** Host 文档是否可写。 */
|
|
16
|
-
writable: boolean
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** settingsScope.bind({namespace}) 返回的控制器面(本插件由 api 直连实现)。 */
|
|
20
|
-
export interface Scope {
|
|
21
|
-
getSnapshot(): ScopeSnapshot
|
|
22
|
-
subscribe(listener: () => void): () => void
|
|
23
|
-
load(): Promise<void>
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** connection api.settings 的 RPC 面(本插件用到的三个方法)。 */
|
|
27
|
-
export interface SettingsApi {
|
|
28
|
-
describe(payload?: Record<string, never>): Promise<{
|
|
29
|
-
result: {
|
|
30
|
-
ok: boolean
|
|
31
|
-
value?: {
|
|
32
|
-
writable: boolean
|
|
33
|
-
namespaces: Array<{
|
|
34
|
-
ns: string
|
|
35
|
-
value: unknown
|
|
36
|
-
revision: number
|
|
37
|
-
secrets: Array<{ path: string[]; set: boolean }>
|
|
38
|
-
}>
|
|
39
|
-
}
|
|
40
|
-
error?: { message?: string }
|
|
41
|
-
}
|
|
42
|
-
}>
|
|
43
|
-
update(request: {
|
|
44
|
-
ns: string
|
|
45
|
-
patch: Record<string, unknown>
|
|
46
|
-
expectedRevision?: number
|
|
47
|
-
}): Promise<{ result: { ok: boolean; error?: { message?: string } } }>
|
|
48
|
-
replace(request: {
|
|
49
|
-
ns: string
|
|
50
|
-
section: Record<string, unknown>
|
|
51
|
-
expectedRevision?: number
|
|
52
|
-
}): Promise<{ result: { ok: boolean; error?: { message?: string } } }>
|
|
53
|
-
}
|