dsh-plugin-subscription-usage 0.0.0-stage → 0.1.0
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/LICENSE +22 -0
- package/README.md +38 -2
- package/cordis.patch.yml +5 -0
- package/icon.svg +9 -0
- package/lib/auth/claude-code-creds.d.ts +23 -0
- package/lib/auth/claude-code-creds.js +172 -0
- package/lib/auth/device-flow.d.ts +55 -0
- package/lib/auth/device-flow.js +177 -0
- package/lib/auth/jwt.d.ts +10 -0
- package/lib/auth/jwt.js +25 -0
- package/lib/auth/oauth-flow.d.ts +91 -0
- package/lib/auth/oauth-flow.js +227 -0
- package/lib/auth/pkce.d.ts +31 -0
- package/lib/auth/pkce.js +35 -0
- package/lib/auth/rpc.d.ts +233 -0
- package/lib/auth/rpc.js +501 -0
- package/lib/auth/store.d.ts +198 -0
- package/lib/auth/store.js +473 -0
- package/lib/client/Footer.d.ts +3 -0
- package/lib/client/Footer.js +73 -0
- package/lib/client/Gauge.d.ts +28 -0
- package/lib/client/Gauge.js +139 -0
- package/lib/client/ImageGallery.d.ts +54 -0
- package/lib/client/ImageGallery.js +112 -0
- package/lib/client/ImageGenerateToolview.d.ts +48 -0
- package/lib/client/ImageGenerateToolview.js +130 -0
- package/lib/client/Notice.d.ts +15 -0
- package/lib/client/Notice.js +93 -0
- package/lib/client/ProviderCard.d.ts +35 -0
- package/lib/client/ProviderCard.js +240 -0
- package/lib/client/SpeedSelect.d.ts +72 -0
- package/lib/client/SpeedSelect.js +214 -0
- package/lib/client/Usage.d.ts +7 -0
- package/lib/client/Usage.js +83 -0
- package/lib/client/VideoGenerateToolview.d.ts +42 -0
- package/lib/client/VideoGenerateToolview.js +172 -0
- package/lib/client/context.d.ts +16 -0
- package/lib/client/context.js +11 -0
- package/lib/client/fast-command.d.ts +2 -0
- package/lib/client/fast-command.js +4 -0
- package/lib/client/hooks.d.ts +2 -0
- package/lib/client/hooks.js +10 -0
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.js +113 -0
- package/lib/client/locales.d.ts +139 -0
- package/lib/client/locales.js +267 -0
- package/lib/client/meter.d.ts +91 -0
- package/lib/client/meter.js +196 -0
- package/lib/client/prefs.d.ts +51 -0
- package/lib/client/prefs.js +71 -0
- package/lib/client/rpc.d.ts +161 -0
- package/lib/client/rpc.js +31 -0
- package/lib/client/store.d.ts +67 -0
- package/lib/client/store.js +129 -0
- package/lib/client/styles.d.ts +7 -0
- package/lib/client/styles.js +176 -0
- package/lib/client.js +3933 -0
- package/lib/client.js.map +1 -0
- package/lib/compat.d.ts +55 -0
- package/lib/compat.js +20 -0
- package/lib/http.d.ts +134 -0
- package/lib/http.js +431 -0
- package/lib/index.d.ts +121 -0
- package/lib/index.js +13210 -0
- package/lib/json-text.d.ts +2 -0
- package/lib/json-text.js +4 -0
- package/lib/model-defaults.d.ts +23 -0
- package/lib/model-defaults.js +238 -0
- package/lib/model-speeds.d.ts +10 -0
- package/lib/model-speeds.js +48 -0
- package/lib/models-directory.d.ts +17 -0
- package/lib/models-directory.js +25 -0
- package/lib/provider-settings.d.ts +55 -0
- package/lib/provider-settings.js +215 -0
- package/lib/providers/account-preferences.d.ts +46 -0
- package/lib/providers/account-preferences.js +188 -0
- package/lib/providers/accounts.d.ts +113 -0
- package/lib/providers/accounts.js +142 -0
- package/lib/providers/antigravity-oauth-client.d.ts +7 -0
- package/lib/providers/antigravity-oauth-client.js +7 -0
- package/lib/providers/antigravity.d.ts +119 -0
- package/lib/providers/antigravity.js +552 -0
- package/lib/providers/catalog-refresh.d.ts +4 -0
- package/lib/providers/catalog-refresh.js +30 -0
- package/lib/providers/catalog-store.d.ts +47 -0
- package/lib/providers/catalog-store.js +283 -0
- package/lib/providers/claude-cli-version.d.ts +15 -0
- package/lib/providers/claude-cli-version.js +24 -0
- package/lib/providers/claude.d.ts +212 -0
- package/lib/providers/claude.js +726 -0
- package/lib/providers/codex-client-version.d.ts +8 -0
- package/lib/providers/codex-client-version.js +17 -0
- package/lib/providers/codex-search.d.ts +29 -0
- package/lib/providers/codex-search.js +198 -0
- package/lib/providers/codex.d.ts +253 -0
- package/lib/providers/codex.js +930 -0
- package/lib/providers/common.d.ts +415 -0
- package/lib/providers/common.js +679 -0
- package/lib/providers/copilot.d.ts +365 -0
- package/lib/providers/copilot.js +956 -0
- package/lib/providers/grok.d.ts +214 -0
- package/lib/providers/grok.js +750 -0
- package/lib/providers/image-pool.d.ts +30 -0
- package/lib/providers/image-pool.js +89 -0
- package/lib/providers/npm-cli-version.d.ts +56 -0
- package/lib/providers/npm-cli-version.js +98 -0
- package/lib/providers/pool-family.d.ts +56 -0
- package/lib/providers/pool-family.js +45 -0
- package/lib/providers/pool-health.d.ts +91 -0
- package/lib/providers/pool-health.js +164 -0
- package/lib/providers/pool-usage.d.ts +106 -0
- package/lib/providers/pool-usage.js +302 -0
- package/lib/providers/pool.d.ts +115 -0
- package/lib/providers/pool.js +461 -0
- package/lib/providers/rate-limit.d.ts +192 -0
- package/lib/providers/rate-limit.js +338 -0
- package/lib/providers/replay.d.ts +4 -0
- package/lib/providers/replay.js +37 -0
- package/lib/providers/reset-redemption.d.ts +20 -0
- package/lib/providers/reset-redemption.js +70 -0
- package/lib/tools/image-generate.d.ts +128 -0
- package/lib/tools/image-generate.js +438 -0
- package/lib/tools/registration.d.ts +15 -0
- package/lib/tools/registration.js +24 -0
- package/lib/tools/video-generate.d.ts +89 -0
- package/lib/tools/video-generate.js +257 -0
- package/lib/tools/x-search.d.ts +58 -0
- package/lib/tools/x-search.js +197 -0
- package/lib/translate/anthropic.d.ts +180 -0
- package/lib/translate/anthropic.js +534 -0
- package/lib/translate/antigravity-images.d.ts +11 -0
- package/lib/translate/antigravity-images.js +62 -0
- package/lib/translate/antigravity-schema.d.ts +4 -0
- package/lib/translate/antigravity-schema.js +145 -0
- package/lib/translate/antigravity-thinking.d.ts +5 -0
- package/lib/translate/antigravity-thinking.js +44 -0
- package/lib/translate/antigravity.d.ts +120 -0
- package/lib/translate/antigravity.js +412 -0
- package/lib/translate/chat-completions.d.ts +120 -0
- package/lib/translate/chat-completions.js +382 -0
- package/lib/translate/resolved.d.ts +98 -0
- package/lib/translate/resolved.js +186 -0
- package/lib/translate/responses.d.ts +192 -0
- package/lib/translate/responses.js +443 -0
- package/lib/translate/sse.d.ts +21 -0
- package/lib/translate/sse.js +62 -0
- package/lib/usage/headers.d.ts +21 -0
- package/lib/usage/headers.js +64 -0
- package/lib/usage/pace.d.ts +53 -0
- package/lib/usage/pace.js +48 -0
- package/lib/usage/service.d.ts +64 -0
- package/lib/usage/service.js +104 -0
- package/lib/usage-providers/common.d.ts +23 -0
- package/lib/usage-providers/common.js +28 -0
- package/lib/usage-providers/index.d.ts +42 -0
- package/lib/usage-providers/index.js +71 -0
- package/lib/usage-providers/keys.d.ts +11 -0
- package/lib/usage-providers/keys.js +52 -0
- package/lib/usage-providers/kimi.d.ts +4 -0
- package/lib/usage-providers/kimi.js +52 -0
- package/lib/usage-providers/ollama-cloud.d.ts +4 -0
- package/lib/usage-providers/ollama-cloud.js +42 -0
- package/lib/usage-providers/zai.d.ts +5 -0
- package/lib/usage-providers/zai.js +53 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +115 -4
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { call, isMetered, USAGE_PROVIDERS } from './rpc.js';
|
|
2
|
+
export const POLL_MS = 5 * 60_000;
|
|
3
|
+
export const usageKey = (provider, account) => `${provider}/${account}`;
|
|
4
|
+
export class SubscriptionsStore {
|
|
5
|
+
rpc;
|
|
6
|
+
snapshot = { status: undefined, statusError: undefined, usage: new Map(), refreshing: new Set() };
|
|
7
|
+
listeners = new Set();
|
|
8
|
+
lastRevision = -1;
|
|
9
|
+
statusInFlight;
|
|
10
|
+
timer;
|
|
11
|
+
/** The session the gauge is showing, so `status` reports its serving account. */
|
|
12
|
+
sessionId;
|
|
13
|
+
constructor(rpc) {
|
|
14
|
+
this.rpc = rpc;
|
|
15
|
+
}
|
|
16
|
+
getSnapshot = () => this.snapshot;
|
|
17
|
+
subscribe = (listener) => {
|
|
18
|
+
this.listeners.add(listener);
|
|
19
|
+
if (this.listeners.size === 1)
|
|
20
|
+
this.start();
|
|
21
|
+
return () => {
|
|
22
|
+
this.listeners.delete(listener);
|
|
23
|
+
if (this.listeners.size === 0)
|
|
24
|
+
this.stop();
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
/** Report the session whose serving account the `status` read should name. */
|
|
28
|
+
focusSession(sessionId) {
|
|
29
|
+
if (this.sessionId === sessionId)
|
|
30
|
+
return;
|
|
31
|
+
this.sessionId = sessionId;
|
|
32
|
+
void this.refreshStatus();
|
|
33
|
+
}
|
|
34
|
+
/** Re-read login status; usage follows when the Host's revision moved. */
|
|
35
|
+
refreshStatus() {
|
|
36
|
+
this.statusInFlight ??= this.readStatus().finally(() => { this.statusInFlight = undefined; });
|
|
37
|
+
return this.statusInFlight;
|
|
38
|
+
}
|
|
39
|
+
/** Read every signed-in account's usage under one reason. */
|
|
40
|
+
async refreshUsage(reason, only) {
|
|
41
|
+
const status = this.snapshot.status;
|
|
42
|
+
if (status === undefined)
|
|
43
|
+
return;
|
|
44
|
+
await Promise.all(USAGE_PROVIDERS.filter(p => (only === undefined || p === only) && isMetered(status, p))
|
|
45
|
+
.flatMap(provider => (status.providers[provider]?.accounts ?? []).map(account => this.readUsage(provider, account.key, reason))));
|
|
46
|
+
}
|
|
47
|
+
async readStatus() {
|
|
48
|
+
try {
|
|
49
|
+
const status = await call(this.rpc, 'status', this.sessionId === undefined ? {} : { sessionId: this.sessionId });
|
|
50
|
+
const known = new Set(USAGE_PROVIDERS.flatMap(p => (status.providers[p]?.accounts ?? []).map(a => usageKey(p, a.key))));
|
|
51
|
+
const usage = new Map([...this.snapshot.usage].filter(([key]) => known.has(key)));
|
|
52
|
+
this.publish({ ...this.snapshot, status, statusError: undefined, usage });
|
|
53
|
+
if (status.usageRevision !== this.lastRevision) {
|
|
54
|
+
this.lastRevision = status.usageRevision;
|
|
55
|
+
await this.refreshUsage('poll');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.publish({ ...this.snapshot, statusError: error instanceof Error ? error.message : String(error) });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async readUsage(provider, account, reason) {
|
|
63
|
+
const key = usageKey(provider, account);
|
|
64
|
+
if (!this.snapshot.usage.has(key))
|
|
65
|
+
this.setUsage(key, { kind: 'loading' });
|
|
66
|
+
this.publish({ ...this.snapshot, refreshing: new Set([...this.snapshot.refreshing, key]) });
|
|
67
|
+
try {
|
|
68
|
+
const usage = await call(this.rpc, 'usage', { provider, account, reason });
|
|
69
|
+
this.setUsage(key, { kind: 'ready', usage, receivedAt: Date.now() });
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const previous = this.snapshot.usage.get(key);
|
|
73
|
+
// Keep showing a real snapshot through a failure; the Host already marks it stale.
|
|
74
|
+
if (previous?.kind !== 'ready')
|
|
75
|
+
this.setUsage(key, { kind: 'error', message: error instanceof Error ? error.message : String(error) });
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
const refreshing = new Set(this.snapshot.refreshing);
|
|
79
|
+
refreshing.delete(key);
|
|
80
|
+
this.publish({ ...this.snapshot, refreshing });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
setUsage(key, entry) {
|
|
84
|
+
const usage = new Map(this.snapshot.usage);
|
|
85
|
+
usage.set(key, entry);
|
|
86
|
+
this.publish({ ...this.snapshot, usage });
|
|
87
|
+
}
|
|
88
|
+
publish(next) {
|
|
89
|
+
this.snapshot = next;
|
|
90
|
+
for (const listener of this.listeners)
|
|
91
|
+
listener();
|
|
92
|
+
}
|
|
93
|
+
onVisibility = () => {
|
|
94
|
+
if (document.visibilityState === 'visible')
|
|
95
|
+
void this.refreshStatus();
|
|
96
|
+
};
|
|
97
|
+
start() {
|
|
98
|
+
void this.refreshStatus();
|
|
99
|
+
this.timer = setInterval(() => {
|
|
100
|
+
if (document.visibilityState !== 'visible')
|
|
101
|
+
return;
|
|
102
|
+
void this.refreshStatus().then(() => this.refreshUsage('poll'));
|
|
103
|
+
}, POLL_MS);
|
|
104
|
+
document.addEventListener('visibilitychange', this.onVisibility);
|
|
105
|
+
}
|
|
106
|
+
stop() {
|
|
107
|
+
if (this.timer !== undefined)
|
|
108
|
+
clearInterval(this.timer);
|
|
109
|
+
this.timer = undefined;
|
|
110
|
+
document.removeEventListener('visibilitychange', this.onVisibility);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** The account a provider is using now: the one that served last, else the default, else the first. */
|
|
114
|
+
export function activeAccountKey(status) {
|
|
115
|
+
if (status === undefined || status.accounts.length === 0)
|
|
116
|
+
return undefined;
|
|
117
|
+
const served = status.servingAccount;
|
|
118
|
+
if (served !== undefined && status.accounts.some(a => a.key === served))
|
|
119
|
+
return served;
|
|
120
|
+
return (status.accounts.find(a => a.isDefault) ?? status.accounts[0])?.key;
|
|
121
|
+
}
|
|
122
|
+
/** The active account shown in full, and the others that fold behind one row. */
|
|
123
|
+
export function splitAccounts(status) {
|
|
124
|
+
const key = activeAccountKey(status);
|
|
125
|
+
const active = status.accounts.find(a => a.key === key);
|
|
126
|
+
if (active === undefined)
|
|
127
|
+
return undefined;
|
|
128
|
+
return { active, rest: status.accounts.filter(a => a !== active) };
|
|
129
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One stylesheet for every surface, prefixed `dsm-`, colored only through
|
|
3
|
+
* `--dsw-alias-*` tokens. Card and button values copy the Models page
|
|
4
|
+
* (`dsh-client-ui-settings-models` 0.2.2-rc.1); meters follow
|
|
5
|
+
* design/usage-draft.html v3.
|
|
6
|
+
*/
|
|
7
|
+
export declare const css = "\n.dsm-sub { display: flex; flex-direction: column; gap: 8px; min-width: 0; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary); }\n.dsm-sub .dsm-card-error { color: var(--dsw-alias-state-error-primary); font-size: 12px; }\n.dsm-num, .dsm-w, .dsm-mini, .dsm-fresh { font-variant-numeric: tabular-nums; }\n\n.dsm-btn { box-sizing: border-box; height: 28px; padding: 0 10px; border-radius: var(--dsw-radius-sm); font: inherit; font-size: 12px; line-height: 18px;\n cursor: pointer; border: .5px solid var(--dsw-alias-border-l3); background: transparent; color: var(--dsw-alias-label-primary);\n display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }\n.dsm-btn:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-solid, var(--dsw-alias-interactive-bg-hover)); }\n.dsm-btn:disabled { opacity: .4; cursor: default; }\n.dsm-btn:focus-visible, .dsm-fold:focus-visible, .dsm-seg button:focus-visible, .dsm-switch:focus-visible, .dsm-chip:focus-visible, .dsm-gauge:focus-visible, .dsm-tab:focus-visible {\n box-shadow: 0 0 0 2px var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline: none; }\n.dsm-btn.dsm-primary { background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-label-primary)); color: var(--dsw-alias-label-primary-foreground, var(--dsw-alias-bg-base)); border-color: transparent; }\n.dsm-btn.dsm-primary:hover:not(:disabled) { background: var(--dsw-alias-button-primary-hover, var(--dsw-alias-label-primary)); }\n.dsm-btn.dsm-ghost { border-color: transparent; color: var(--dsw-alias-label-secondary); }\n.dsm-btn.dsm-danger { border-color: transparent; color: var(--dsw-alias-state-error-primary); }\n.dsm-btn.dsm-danger:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-danger, var(--dsw-alias-interactive-bg-hover)); }\n.dsm-btn.dsm-icon { width: 28px; padding: 0; justify-content: center; border-color: transparent; color: var(--dsw-alias-label-secondary); }\n.dsm-btn.dsm-icon.dsm-sm { width: 24px; height: 24px; }\n.dsm-spinning svg { animation: dsm-spin .7s linear infinite; }\n@keyframes dsm-spin { to { transform: rotate(360deg); } }\n\n.dsm-acct { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\n.dsm-acct-head { display: flex; align-items: center; gap: 6px; min-width: 0; color: var(--dsw-alias-label-secondary); }\n.dsm-acct-name { color: var(--dsw-alias-label-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.dsm-tag { flex: none; font-size: 11px; line-height: 16px; padding: 0 5px; border-radius: var(--dsw-radius-xs); border: .5px solid var(--dsw-alias-border-l3); color: var(--dsw-alias-label-secondary); }\n.dsm-glyph { display: inline-flex; flex: none; color: var(--dsw-alias-label-tertiary); }\n.dsm-glyph.dsm-star { color: var(--dsw-alias-state-warn-primary); }\n.dsm-glyph.dsm-live { color: var(--dsw-alias-state-business-primary); }\n.dsm-fresh { margin-left: auto; display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--dsw-alias-label-tertiary); white-space: nowrap; flex: none; }\n.dsm-fresh.dsm-stale { color: var(--dsw-alias-state-warn-primary); }\n.dsm-live-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-state-success-primary); }\n\n/* Fixed label, value and time columns, so bars line up across accounts and providers. */\n.dsm-wins { display: grid; grid-template-columns: fit-content(132px) minmax(48px, 1fr) 40px 92px; column-gap: 12px; row-gap: 6px; align-items: center; }\n.dsm-w { display: contents; font-size: 12px; line-height: 18px; }\n.dsm-wl { color: var(--dsw-alias-label-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 18px; }\n.dsm-wv { text-align: right; font-weight: 600; font-size: 13px; line-height: 18px; color: var(--dsw-alias-label-primary); }\n.dsm-wt { text-align: right; color: var(--dsw-alias-label-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 18px; }\n.dsm-w.dsm-tight .dsm-wv, .dsm-w.dsm-tight .dsm-wt { color: var(--dsw-alias-state-warn-primary); }\n.dsm-w.dsm-over .dsm-wv, .dsm-w.dsm-over .dsm-wt, .dsm-w.dsm-out .dsm-wv, .dsm-w.dsm-out .dsm-wt { color: var(--dsw-alias-state-error-primary); }\n\n.dsm-bar { position: relative; display: block; border-radius: 3px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); color: var(--dsw-alias-state-success-primary); }\n.dsm-fill { position: absolute; top: 0; bottom: 0; left: 0; border-radius: inherit; background: currentColor; transition: width .5s cubic-bezier(.16, 1, .3, 1); }\n.dsm-proj { position: absolute; top: 0; bottom: 0; background: repeating-linear-gradient(90deg, transparent 0 2px, color-mix(in srgb, currentColor 55%, transparent) 2px 3px); }\n.dsm-bar.dsm-tight { color: var(--dsw-alias-state-warn-primary); }\n.dsm-bar.dsm-over, .dsm-bar.dsm-out { color: var(--dsw-alias-state-error-primary); }\n.dsm-bar.dsm-unknown .dsm-fill { display: none; }\n\n.dsm-minis { display: inline-flex; gap: 14px; flex: none; }\n.dsm-mini { display: inline-grid; grid-template-columns: auto 32px 34px; align-items: center; gap: 5px; font-size: 11px; line-height: 16px; }\n.dsm-mini i { font-style: normal; color: var(--dsw-alias-label-tertiary); max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsm-mini b { font-weight: 500; text-align: right; color: var(--dsw-alias-label-primary); font-size: 12px; }\n.dsm-mini.dsm-tight b { color: var(--dsw-alias-state-warn-primary); }\n.dsm-mini.dsm-over b, .dsm-mini.dsm-out b { color: var(--dsw-alias-state-error-primary); }\n\n.dsm-fold { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; min-height: 32px; padding: 0 6px 0 2px;\n border: 0; background: none; text-align: left; cursor: pointer; border-radius: var(--dsw-radius-md); font: inherit; font-size: 12px; color: var(--dsw-alias-label-secondary); }\n.dsm-fold:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.dsm-fold .dsm-chev { color: var(--dsw-alias-label-tertiary); transition: transform .2s cubic-bezier(.16, 1, .3, 1); }\n.dsm-fold[aria-expanded=\"true\"] .dsm-chev { transform: rotate(90deg); }\n.dsm-fold-name { display: flex; align-items: center; gap: 6px; min-width: 0; }\n.dsm-fold-name > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsm-fold-body { display: flex; flex-direction: column; gap: 8px; padding: 2px 0 4px 24px; min-width: 0; }\n\n.dsm-foot { display: flex; align-items: center; gap: 6px; }\n.dsm-muted { color: var(--dsw-alias-label-tertiary); font-size: 12px; line-height: 18px; margin: 0; display: inline-flex; align-items: center; gap: 6px; }\n.dsm-alert { display: flex; gap: 8px; align-items: center; padding: 6px 6px 6px 10px; border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent); }\n.dsm-alert > svg { color: var(--dsw-alias-state-error-primary); }\n.dsm-alert .dsm-btn { margin-left: auto; }\n\n.dsm-panel { border-radius: var(--dsw-radius-lg); background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-2)); padding: 2px 12px 12px; display: flex; flex-direction: column; gap: 8px; }\n.dsm-tabs { display: flex; gap: 2px; border-bottom: .5px solid var(--dsw-alias-border-l2); margin: 0 -12px; padding: 0 8px; }\n.dsm-tab { border: 0; background: none; padding: 9px 8px 8px; font: inherit; font-size: 13px; color: var(--dsw-alias-label-tertiary); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -.5px; }\n.dsm-tab[aria-selected=\"true\"] { color: var(--dsw-alias-label-primary); border-bottom-color: var(--dsw-alias-label-primary); }\n.dsm-row { display: flex; align-items: center; gap: 10px; min-height: 36px; font-size: 13px; }\n.dsm-row + .dsm-row { border-top: .5px solid var(--dsw-alias-border-l1); }\n.dsm-grow { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; }\n.dsm-grow > .dsm-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }\n.dsm-note { color: var(--dsw-alias-label-tertiary); font-size: 12px; }\n.dsm-list { max-height: 280px; overflow-y: auto; }\n.dsm-switch { width: 30px; height: 18px; border-radius: 9px; background: var(--dsw-alias-state-idle-primary); border: 0; position: relative; cursor: pointer; flex: none; padding: 0; }\n.dsm-switch::after { content: \"\"; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; transition: transform .2s cubic-bezier(.16, 1, .3, 1); }\n.dsm-switch[aria-checked=\"true\"] { background: var(--dsw-alias-state-success-primary); }\n.dsm-switch[aria-checked=\"true\"]::after { transform: translateX(12px); }\n.dsm-switch:disabled { opacity: .4; cursor: default; }\n.dsm-input { box-sizing: border-box; height: 30px; width: 100%; border-radius: var(--dsw-radius-md); border: .5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); padding: 0 10px; font: inherit; font-size: 13px; }\n.dsm-select { height: 26px; border-radius: var(--dsw-radius-sm); border: .5px solid var(--dsw-alias-border-l3); background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; padding: 0 4px; max-width: 160px; }\n.dsm-panel-foot { display: flex; justify-content: flex-end; align-items: center; gap: 8px; padding-top: 4px; }\n.dsm-panel-foot .dsm-card-error { margin-right: auto; }\n.dsm-seg { display: inline-flex; padding: 2px; border-radius: 7px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); gap: 2px; flex: none; }\n.dsm-seg button { border: 0; background: transparent; height: 22px; padding: 0 9px; border-radius: 5px; font: inherit; font-size: 12px; color: var(--dsw-alias-label-secondary); cursor: pointer; }\n.dsm-seg button[aria-pressed=\"true\"] { background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); box-shadow: 0 1px 2px #0000002e; }\n.dsm-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.dsm-chip { height: 26px; padding: 0 10px 0 8px; border-radius: 13px; border: .5px solid var(--dsw-alias-border-l3); background: transparent; font: inherit; font-size: 12px;\n cursor: pointer; display: inline-flex; align-items: center; gap: 5px; color: var(--dsw-alias-label-secondary); }\n.dsm-chip[aria-pressed=\"true\"] { background: var(--dsw-alias-label-primary); color: var(--dsw-alias-bg-base); border-color: transparent; }\n.dsm-chip:disabled { opacity: .4; cursor: default; }\n\n.dsm-signin { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; border-radius: var(--dsw-radius-lg); background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-2)); }\n.dsm-steps { display: flex; gap: 16px; margin: 0; padding: 0; list-style: none; font-size: 12px; flex-wrap: wrap; }\n.dsm-steps li { display: inline-flex; gap: 6px; align-items: center; color: var(--dsw-alias-label-tertiary); }\n.dsm-steps li[data-s=\"done\"] { color: var(--dsw-alias-state-success-primary); }\n.dsm-steps li[data-s=\"now\"] { color: var(--dsw-alias-label-primary); }\n.dsm-spin { width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid var(--dsw-alias-border-l3); border-top-color: currentColor; animation: dsm-spin .8s linear infinite; flex: none; box-sizing: border-box; }\n.dsm-code { font: 600 20px/28px var(--dsw-font-family-mono, ui-monospace, Menlo, monospace); letter-spacing: .12em; padding: 4px 12px; border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1); border: .5px solid var(--dsw-alias-border-l2); }\n.dsm-fallback summary { cursor: pointer; color: var(--dsw-alias-label-tertiary); font-size: 12px; list-style: none; display: inline-flex; gap: 4px; align-items: center; }\n.dsm-fallback summary::-webkit-details-marker { display: none; }\n.dsm-fallback[open] summary { margin-bottom: 6px; }\n\n.dsm-footer-block { margin-top: 18px; padding-top: 14px; border-top: .5px solid var(--dsw-alias-border-l2); display: flex; flex-direction: column; max-width: 720px; }\n.dsm-footer-block h3 { margin: 0 0 4px; font-size: 14px; font-weight: 500; line-height: 22px; color: var(--dsw-alias-label-primary); }\n.dsm-footer-block .dsm-row { min-height: 40px; color: var(--dsw-alias-label-primary); }\n\n.dsm-gauge-slot { position: relative; display: inline-flex; }\n.dsm-gauge { display: inline-flex; align-items: center; gap: 10px; height: 24px; padding: 0 8px; border-radius: 12px; border: 0; background: transparent; cursor: pointer;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 12px; }\n.dsm-gauge:hover, .dsm-gauge[aria-expanded=\"true\"] { background: var(--dsw-alias-interactive-bg-hover); }\n.dsm-gp { display: inline-flex; align-items: center; gap: 8px; }\n.dsm-gp + .dsm-gp { padding-left: 10px; border-left: .5px solid var(--dsw-alias-border-l3); }\n.dsm-gp-name { color: var(--dsw-alias-label-primary); }\n.dsm-gp .dsm-minis { gap: 10px; }\n.dsm-gp .dsm-mini { grid-template-columns: auto 26px auto; }\n\n.dsm-pop { position: fixed; z-index: 1000; width: 420px; max-width: calc(100vw - 20px); box-sizing: border-box; background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay));\n backdrop-filter: var(--dsw-menu-backdrop-filter, none); border-radius: var(--dsw-radius-xl); box-shadow: var(--dsw-elevation-panel, 0 12px 32px #0006);\n border: .5px solid var(--dsw-alias-border-l2); padding: 6px; display: flex; flex-direction: column; color: var(--dsw-alias-label-primary);\n text-align: left; font-size: 13px; line-height: 20px; max-height: min(560px, calc(100vh - 24px)); overflow: hidden auto; }\n.dsm-pop-head { display: flex; align-items: center; gap: 2px; padding: 2px 2px 6px 8px; }\n.dsm-pop-head b { font-weight: 600; font-size: 13px; margin-right: auto; }\n.dsm-psec { border-top: .5px solid var(--dsw-alias-border-l2); padding: 4px 0; }\n.dsm-psec-head { display: flex; align-items: center; gap: 2px; }\n.dsm-psec-head .dsm-fold { flex: 1; }\n.dsm-psec-name { color: var(--dsw-alias-label-primary); font-weight: 500; font-size: 13px; }\n.dsm-psec .dsm-fold-body { padding: 0 8px 6px 26px; gap: 6px; }\n.dsm-psec .dsm-fold-body .dsm-fold-body { padding: 4px 0 0; }\n.dsm-psec .dsm-fold-body .dsm-fold { margin-left: -24px; width: calc(100% + 24px); }\n.dsm-pacct { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n.dsm-pacct .dsm-acct-head { font-size: 12px; line-height: 18px; }\n.dsm-others { padding-bottom: 0; }\n.dsm-others .dsm-psec { border-top: 0; padding: 0 0 0 16px; }\n.dsm-gauge > svg { color: var(--dsw-alias-label-secondary); }\n.dsm-pin { color: var(--dsw-alias-label-tertiary); }\n.dsm-pin[aria-pressed=\"true\"] { color: var(--dsw-alias-label-primary); }\n\n.dsm-notice { display: flex; gap: 8px; align-items: center; padding: 6px 6px 6px 12px; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary);\n background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay)); border-radius: var(--dsw-radius-lg); border: .5px solid var(--dsw-alias-border-l2);\n box-shadow: var(--dsw-elevation-panel, 0 12px 32px #0006); animation: dsm-drop .45s cubic-bezier(.16, 1, .3, 1); }\n.dsm-notice > svg { color: var(--dsw-alias-state-warn-primary); }\n.dsm-notice.dsm-err > svg { color: var(--dsw-alias-state-error-primary); }\n.dsm-notice-host { position: fixed; top: 52px; right: 20px; z-index: 1000; max-width: calc(100vw - 40px); }\n@keyframes dsm-drop { from { opacity: 0; transform: translateY(-8px); filter: blur(4px); } }\n\n.dsh-subscription-speed button:hover:not(:disabled) { --dsh-subscription-speed-hover: var(--dsw-alias-interactive-bg-hover); }\n.dsh-subscription-speed button:active:not(:disabled) { --dsh-subscription-speed-hover: var(--dsw-alias-interactive-bg-active); }\n.dsh-subscription-speed button:disabled { opacity: .4; cursor: default; }\n.dsh-subscription-speed button:focus-visible { outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline-offset: 2px; }\n\n@media (prefers-reduced-motion: reduce) { .dsm-sub *, .dsm-pop *, .dsm-notice, .dsm-fill { animation: none !important; transition: none !important; } }\n@media (max-width: 640px) {\n .dsm-wins { column-gap: 8px; grid-template-columns: fit-content(96px) minmax(40px, 1fr) 36px 84px; }\n .dsm-minis { gap: 8px; } .dsm-mini { grid-template-columns: auto 22px 32px; } .dsm-mini i { max-width: 56px; }\n .dsm-gp-name { display: none; }\n .dsm-footer-block .dsm-row { flex-wrap: wrap; padding: 6px 0; }\n}\n";
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One stylesheet for every surface, prefixed `dsm-`, colored only through
|
|
3
|
+
* `--dsw-alias-*` tokens. Card and button values copy the Models page
|
|
4
|
+
* (`dsh-client-ui-settings-models` 0.2.2-rc.1); meters follow
|
|
5
|
+
* design/usage-draft.html v3.
|
|
6
|
+
*/
|
|
7
|
+
export const css = `
|
|
8
|
+
.dsm-sub { display: flex; flex-direction: column; gap: 8px; min-width: 0; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary); }
|
|
9
|
+
.dsm-sub .dsm-card-error { color: var(--dsw-alias-state-error-primary); font-size: 12px; }
|
|
10
|
+
.dsm-num, .dsm-w, .dsm-mini, .dsm-fresh { font-variant-numeric: tabular-nums; }
|
|
11
|
+
|
|
12
|
+
.dsm-btn { box-sizing: border-box; height: 28px; padding: 0 10px; border-radius: var(--dsw-radius-sm); font: inherit; font-size: 12px; line-height: 18px;
|
|
13
|
+
cursor: pointer; border: .5px solid var(--dsw-alias-border-l3); background: transparent; color: var(--dsw-alias-label-primary);
|
|
14
|
+
display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
|
|
15
|
+
.dsm-btn:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-solid, var(--dsw-alias-interactive-bg-hover)); }
|
|
16
|
+
.dsm-btn:disabled { opacity: .4; cursor: default; }
|
|
17
|
+
.dsm-btn:focus-visible, .dsm-fold:focus-visible, .dsm-seg button:focus-visible, .dsm-switch:focus-visible, .dsm-chip:focus-visible, .dsm-gauge:focus-visible, .dsm-tab:focus-visible {
|
|
18
|
+
box-shadow: 0 0 0 2px var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline: none; }
|
|
19
|
+
.dsm-btn.dsm-primary { background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-label-primary)); color: var(--dsw-alias-label-primary-foreground, var(--dsw-alias-bg-base)); border-color: transparent; }
|
|
20
|
+
.dsm-btn.dsm-primary:hover:not(:disabled) { background: var(--dsw-alias-button-primary-hover, var(--dsw-alias-label-primary)); }
|
|
21
|
+
.dsm-btn.dsm-ghost { border-color: transparent; color: var(--dsw-alias-label-secondary); }
|
|
22
|
+
.dsm-btn.dsm-danger { border-color: transparent; color: var(--dsw-alias-state-error-primary); }
|
|
23
|
+
.dsm-btn.dsm-danger:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover-danger, var(--dsw-alias-interactive-bg-hover)); }
|
|
24
|
+
.dsm-btn.dsm-icon { width: 28px; padding: 0; justify-content: center; border-color: transparent; color: var(--dsw-alias-label-secondary); }
|
|
25
|
+
.dsm-btn.dsm-icon.dsm-sm { width: 24px; height: 24px; }
|
|
26
|
+
.dsm-spinning svg { animation: dsm-spin .7s linear infinite; }
|
|
27
|
+
@keyframes dsm-spin { to { transform: rotate(360deg); } }
|
|
28
|
+
|
|
29
|
+
.dsm-acct { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
|
|
30
|
+
.dsm-acct-head { display: flex; align-items: center; gap: 6px; min-width: 0; color: var(--dsw-alias-label-secondary); }
|
|
31
|
+
.dsm-acct-name { color: var(--dsw-alias-label-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
32
|
+
.dsm-tag { flex: none; font-size: 11px; line-height: 16px; padding: 0 5px; border-radius: var(--dsw-radius-xs); border: .5px solid var(--dsw-alias-border-l3); color: var(--dsw-alias-label-secondary); }
|
|
33
|
+
.dsm-glyph { display: inline-flex; flex: none; color: var(--dsw-alias-label-tertiary); }
|
|
34
|
+
.dsm-glyph.dsm-star { color: var(--dsw-alias-state-warn-primary); }
|
|
35
|
+
.dsm-glyph.dsm-live { color: var(--dsw-alias-state-business-primary); }
|
|
36
|
+
.dsm-fresh { margin-left: auto; display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--dsw-alias-label-tertiary); white-space: nowrap; flex: none; }
|
|
37
|
+
.dsm-fresh.dsm-stale { color: var(--dsw-alias-state-warn-primary); }
|
|
38
|
+
.dsm-live-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--dsw-alias-state-success-primary); }
|
|
39
|
+
|
|
40
|
+
/* Fixed label, value and time columns, so bars line up across accounts and providers. */
|
|
41
|
+
.dsm-wins { display: grid; grid-template-columns: fit-content(132px) minmax(48px, 1fr) 40px 92px; column-gap: 12px; row-gap: 6px; align-items: center; }
|
|
42
|
+
.dsm-w { display: contents; font-size: 12px; line-height: 18px; }
|
|
43
|
+
.dsm-wl { color: var(--dsw-alias-label-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 18px; }
|
|
44
|
+
.dsm-wv { text-align: right; font-weight: 600; font-size: 13px; line-height: 18px; color: var(--dsw-alias-label-primary); }
|
|
45
|
+
.dsm-wt { text-align: right; color: var(--dsw-alias-label-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 18px; }
|
|
46
|
+
.dsm-w.dsm-tight .dsm-wv, .dsm-w.dsm-tight .dsm-wt { color: var(--dsw-alias-state-warn-primary); }
|
|
47
|
+
.dsm-w.dsm-over .dsm-wv, .dsm-w.dsm-over .dsm-wt, .dsm-w.dsm-out .dsm-wv, .dsm-w.dsm-out .dsm-wt { color: var(--dsw-alias-state-error-primary); }
|
|
48
|
+
|
|
49
|
+
.dsm-bar { position: relative; display: block; border-radius: 3px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); color: var(--dsw-alias-state-success-primary); }
|
|
50
|
+
.dsm-fill { position: absolute; top: 0; bottom: 0; left: 0; border-radius: inherit; background: currentColor; transition: width .5s cubic-bezier(.16, 1, .3, 1); }
|
|
51
|
+
.dsm-proj { position: absolute; top: 0; bottom: 0; background: repeating-linear-gradient(90deg, transparent 0 2px, color-mix(in srgb, currentColor 55%, transparent) 2px 3px); }
|
|
52
|
+
.dsm-bar.dsm-tight { color: var(--dsw-alias-state-warn-primary); }
|
|
53
|
+
.dsm-bar.dsm-over, .dsm-bar.dsm-out { color: var(--dsw-alias-state-error-primary); }
|
|
54
|
+
.dsm-bar.dsm-unknown .dsm-fill { display: none; }
|
|
55
|
+
|
|
56
|
+
.dsm-minis { display: inline-flex; gap: 14px; flex: none; }
|
|
57
|
+
.dsm-mini { display: inline-grid; grid-template-columns: auto 32px 34px; align-items: center; gap: 5px; font-size: 11px; line-height: 16px; }
|
|
58
|
+
.dsm-mini i { font-style: normal; color: var(--dsw-alias-label-tertiary); max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
59
|
+
.dsm-mini b { font-weight: 500; text-align: right; color: var(--dsw-alias-label-primary); font-size: 12px; }
|
|
60
|
+
.dsm-mini.dsm-tight b { color: var(--dsw-alias-state-warn-primary); }
|
|
61
|
+
.dsm-mini.dsm-over b, .dsm-mini.dsm-out b { color: var(--dsw-alias-state-error-primary); }
|
|
62
|
+
|
|
63
|
+
.dsm-fold { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; min-height: 32px; padding: 0 6px 0 2px;
|
|
64
|
+
border: 0; background: none; text-align: left; cursor: pointer; border-radius: var(--dsw-radius-md); font: inherit; font-size: 12px; color: var(--dsw-alias-label-secondary); }
|
|
65
|
+
.dsm-fold:hover { background: var(--dsw-alias-interactive-bg-hover); }
|
|
66
|
+
.dsm-fold .dsm-chev { color: var(--dsw-alias-label-tertiary); transition: transform .2s cubic-bezier(.16, 1, .3, 1); }
|
|
67
|
+
.dsm-fold[aria-expanded="true"] .dsm-chev { transform: rotate(90deg); }
|
|
68
|
+
.dsm-fold-name { display: flex; align-items: center; gap: 6px; min-width: 0; }
|
|
69
|
+
.dsm-fold-name > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
70
|
+
.dsm-fold-body { display: flex; flex-direction: column; gap: 8px; padding: 2px 0 4px 24px; min-width: 0; }
|
|
71
|
+
|
|
72
|
+
.dsm-foot { display: flex; align-items: center; gap: 6px; }
|
|
73
|
+
.dsm-muted { color: var(--dsw-alias-label-tertiary); font-size: 12px; line-height: 18px; margin: 0; display: inline-flex; align-items: center; gap: 6px; }
|
|
74
|
+
.dsm-alert { display: flex; gap: 8px; align-items: center; padding: 6px 6px 6px 10px; border-radius: var(--dsw-radius-lg);
|
|
75
|
+
background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent); }
|
|
76
|
+
.dsm-alert > svg { color: var(--dsw-alias-state-error-primary); }
|
|
77
|
+
.dsm-alert .dsm-btn { margin-left: auto; }
|
|
78
|
+
|
|
79
|
+
.dsm-panel { border-radius: var(--dsw-radius-lg); background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-2)); padding: 2px 12px 12px; display: flex; flex-direction: column; gap: 8px; }
|
|
80
|
+
.dsm-tabs { display: flex; gap: 2px; border-bottom: .5px solid var(--dsw-alias-border-l2); margin: 0 -12px; padding: 0 8px; }
|
|
81
|
+
.dsm-tab { border: 0; background: none; padding: 9px 8px 8px; font: inherit; font-size: 13px; color: var(--dsw-alias-label-tertiary); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -.5px; }
|
|
82
|
+
.dsm-tab[aria-selected="true"] { color: var(--dsw-alias-label-primary); border-bottom-color: var(--dsw-alias-label-primary); }
|
|
83
|
+
.dsm-row { display: flex; align-items: center; gap: 10px; min-height: 36px; font-size: 13px; }
|
|
84
|
+
.dsm-row + .dsm-row { border-top: .5px solid var(--dsw-alias-border-l1); }
|
|
85
|
+
.dsm-grow { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; }
|
|
86
|
+
.dsm-grow > .dsm-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
87
|
+
.dsm-note { color: var(--dsw-alias-label-tertiary); font-size: 12px; }
|
|
88
|
+
.dsm-list { max-height: 280px; overflow-y: auto; }
|
|
89
|
+
.dsm-switch { width: 30px; height: 18px; border-radius: 9px; background: var(--dsw-alias-state-idle-primary); border: 0; position: relative; cursor: pointer; flex: none; padding: 0; }
|
|
90
|
+
.dsm-switch::after { content: ""; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff; transition: transform .2s cubic-bezier(.16, 1, .3, 1); }
|
|
91
|
+
.dsm-switch[aria-checked="true"] { background: var(--dsw-alias-state-success-primary); }
|
|
92
|
+
.dsm-switch[aria-checked="true"]::after { transform: translateX(12px); }
|
|
93
|
+
.dsm-switch:disabled { opacity: .4; cursor: default; }
|
|
94
|
+
.dsm-input { box-sizing: border-box; height: 30px; width: 100%; border-radius: var(--dsw-radius-md); border: .5px solid var(--dsw-alias-border-l3);
|
|
95
|
+
background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); padding: 0 10px; font: inherit; font-size: 13px; }
|
|
96
|
+
.dsm-select { height: 26px; border-radius: var(--dsw-radius-sm); border: .5px solid var(--dsw-alias-border-l3); background: var(--dsw-alias-bg-layer-1);
|
|
97
|
+
color: var(--dsw-alias-label-primary); font: inherit; font-size: 12px; padding: 0 4px; max-width: 160px; }
|
|
98
|
+
.dsm-panel-foot { display: flex; justify-content: flex-end; align-items: center; gap: 8px; padding-top: 4px; }
|
|
99
|
+
.dsm-panel-foot .dsm-card-error { margin-right: auto; }
|
|
100
|
+
.dsm-seg { display: inline-flex; padding: 2px; border-radius: 7px; background: color-mix(in srgb, var(--dsw-alias-label-primary) 9%, transparent); gap: 2px; flex: none; }
|
|
101
|
+
.dsm-seg button { border: 0; background: transparent; height: 22px; padding: 0 9px; border-radius: 5px; font: inherit; font-size: 12px; color: var(--dsw-alias-label-secondary); cursor: pointer; }
|
|
102
|
+
.dsm-seg button[aria-pressed="true"] { background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); box-shadow: 0 1px 2px #0000002e; }
|
|
103
|
+
.dsm-chips { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
104
|
+
.dsm-chip { height: 26px; padding: 0 10px 0 8px; border-radius: 13px; border: .5px solid var(--dsw-alias-border-l3); background: transparent; font: inherit; font-size: 12px;
|
|
105
|
+
cursor: pointer; display: inline-flex; align-items: center; gap: 5px; color: var(--dsw-alias-label-secondary); }
|
|
106
|
+
.dsm-chip[aria-pressed="true"] { background: var(--dsw-alias-label-primary); color: var(--dsw-alias-bg-base); border-color: transparent; }
|
|
107
|
+
.dsm-chip:disabled { opacity: .4; cursor: default; }
|
|
108
|
+
|
|
109
|
+
.dsm-signin { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; border-radius: var(--dsw-radius-lg); background: var(--dsw-alias-bg-module-platform, var(--dsw-alias-bg-layer-2)); }
|
|
110
|
+
.dsm-steps { display: flex; gap: 16px; margin: 0; padding: 0; list-style: none; font-size: 12px; flex-wrap: wrap; }
|
|
111
|
+
.dsm-steps li { display: inline-flex; gap: 6px; align-items: center; color: var(--dsw-alias-label-tertiary); }
|
|
112
|
+
.dsm-steps li[data-s="done"] { color: var(--dsw-alias-state-success-primary); }
|
|
113
|
+
.dsm-steps li[data-s="now"] { color: var(--dsw-alias-label-primary); }
|
|
114
|
+
.dsm-spin { width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid var(--dsw-alias-border-l3); border-top-color: currentColor; animation: dsm-spin .8s linear infinite; flex: none; box-sizing: border-box; }
|
|
115
|
+
.dsm-code { font: 600 20px/28px var(--dsw-font-family-mono, ui-monospace, Menlo, monospace); letter-spacing: .12em; padding: 4px 12px; border-radius: var(--dsw-radius-md);
|
|
116
|
+
background: var(--dsw-alias-bg-layer-1); border: .5px solid var(--dsw-alias-border-l2); }
|
|
117
|
+
.dsm-fallback summary { cursor: pointer; color: var(--dsw-alias-label-tertiary); font-size: 12px; list-style: none; display: inline-flex; gap: 4px; align-items: center; }
|
|
118
|
+
.dsm-fallback summary::-webkit-details-marker { display: none; }
|
|
119
|
+
.dsm-fallback[open] summary { margin-bottom: 6px; }
|
|
120
|
+
|
|
121
|
+
.dsm-footer-block { margin-top: 18px; padding-top: 14px; border-top: .5px solid var(--dsw-alias-border-l2); display: flex; flex-direction: column; max-width: 720px; }
|
|
122
|
+
.dsm-footer-block h3 { margin: 0 0 4px; font-size: 14px; font-weight: 500; line-height: 22px; color: var(--dsw-alias-label-primary); }
|
|
123
|
+
.dsm-footer-block .dsm-row { min-height: 40px; color: var(--dsw-alias-label-primary); }
|
|
124
|
+
|
|
125
|
+
.dsm-gauge-slot { position: relative; display: inline-flex; }
|
|
126
|
+
.dsm-gauge { display: inline-flex; align-items: center; gap: 10px; height: 24px; padding: 0 8px; border-radius: 12px; border: 0; background: transparent; cursor: pointer;
|
|
127
|
+
color: var(--dsw-alias-label-secondary); font: inherit; font-size: 12px; }
|
|
128
|
+
.dsm-gauge:hover, .dsm-gauge[aria-expanded="true"] { background: var(--dsw-alias-interactive-bg-hover); }
|
|
129
|
+
.dsm-gp { display: inline-flex; align-items: center; gap: 8px; }
|
|
130
|
+
.dsm-gp + .dsm-gp { padding-left: 10px; border-left: .5px solid var(--dsw-alias-border-l3); }
|
|
131
|
+
.dsm-gp-name { color: var(--dsw-alias-label-primary); }
|
|
132
|
+
.dsm-gp .dsm-minis { gap: 10px; }
|
|
133
|
+
.dsm-gp .dsm-mini { grid-template-columns: auto 26px auto; }
|
|
134
|
+
|
|
135
|
+
.dsm-pop { position: fixed; z-index: 1000; width: 420px; max-width: calc(100vw - 20px); box-sizing: border-box; background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay));
|
|
136
|
+
backdrop-filter: var(--dsw-menu-backdrop-filter, none); border-radius: var(--dsw-radius-xl); box-shadow: var(--dsw-elevation-panel, 0 12px 32px #0006);
|
|
137
|
+
border: .5px solid var(--dsw-alias-border-l2); padding: 6px; display: flex; flex-direction: column; color: var(--dsw-alias-label-primary);
|
|
138
|
+
text-align: left; font-size: 13px; line-height: 20px; max-height: min(560px, calc(100vh - 24px)); overflow: hidden auto; }
|
|
139
|
+
.dsm-pop-head { display: flex; align-items: center; gap: 2px; padding: 2px 2px 6px 8px; }
|
|
140
|
+
.dsm-pop-head b { font-weight: 600; font-size: 13px; margin-right: auto; }
|
|
141
|
+
.dsm-psec { border-top: .5px solid var(--dsw-alias-border-l2); padding: 4px 0; }
|
|
142
|
+
.dsm-psec-head { display: flex; align-items: center; gap: 2px; }
|
|
143
|
+
.dsm-psec-head .dsm-fold { flex: 1; }
|
|
144
|
+
.dsm-psec-name { color: var(--dsw-alias-label-primary); font-weight: 500; font-size: 13px; }
|
|
145
|
+
.dsm-psec .dsm-fold-body { padding: 0 8px 6px 26px; gap: 6px; }
|
|
146
|
+
.dsm-psec .dsm-fold-body .dsm-fold-body { padding: 4px 0 0; }
|
|
147
|
+
.dsm-psec .dsm-fold-body .dsm-fold { margin-left: -24px; width: calc(100% + 24px); }
|
|
148
|
+
.dsm-pacct { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
|
|
149
|
+
.dsm-pacct .dsm-acct-head { font-size: 12px; line-height: 18px; }
|
|
150
|
+
.dsm-others { padding-bottom: 0; }
|
|
151
|
+
.dsm-others .dsm-psec { border-top: 0; padding: 0 0 0 16px; }
|
|
152
|
+
.dsm-gauge > svg { color: var(--dsw-alias-label-secondary); }
|
|
153
|
+
.dsm-pin { color: var(--dsw-alias-label-tertiary); }
|
|
154
|
+
.dsm-pin[aria-pressed="true"] { color: var(--dsw-alias-label-primary); }
|
|
155
|
+
|
|
156
|
+
.dsm-notice { display: flex; gap: 8px; align-items: center; padding: 6px 6px 6px 12px; font-size: 13px; line-height: 20px; color: var(--dsw-alias-label-primary);
|
|
157
|
+
background: var(--dsw-specific-menu, var(--dsw-alias-bg-overlay)); border-radius: var(--dsw-radius-lg); border: .5px solid var(--dsw-alias-border-l2);
|
|
158
|
+
box-shadow: var(--dsw-elevation-panel, 0 12px 32px #0006); animation: dsm-drop .45s cubic-bezier(.16, 1, .3, 1); }
|
|
159
|
+
.dsm-notice > svg { color: var(--dsw-alias-state-warn-primary); }
|
|
160
|
+
.dsm-notice.dsm-err > svg { color: var(--dsw-alias-state-error-primary); }
|
|
161
|
+
.dsm-notice-host { position: fixed; top: 52px; right: 20px; z-index: 1000; max-width: calc(100vw - 40px); }
|
|
162
|
+
@keyframes dsm-drop { from { opacity: 0; transform: translateY(-8px); filter: blur(4px); } }
|
|
163
|
+
|
|
164
|
+
.dsh-subscription-speed button:hover:not(:disabled) { --dsh-subscription-speed-hover: var(--dsw-alias-interactive-bg-hover); }
|
|
165
|
+
.dsh-subscription-speed button:active:not(:disabled) { --dsh-subscription-speed-hover: var(--dsw-alias-interactive-bg-active); }
|
|
166
|
+
.dsh-subscription-speed button:disabled { opacity: .4; cursor: default; }
|
|
167
|
+
.dsh-subscription-speed button:focus-visible { outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary)); outline-offset: 2px; }
|
|
168
|
+
|
|
169
|
+
@media (prefers-reduced-motion: reduce) { .dsm-sub *, .dsm-pop *, .dsm-notice, .dsm-fill { animation: none !important; transition: none !important; } }
|
|
170
|
+
@media (max-width: 640px) {
|
|
171
|
+
.dsm-wins { column-gap: 8px; grid-template-columns: fit-content(96px) minmax(40px, 1fr) 36px 84px; }
|
|
172
|
+
.dsm-minis { gap: 8px; } .dsm-mini { grid-template-columns: auto 22px 32px; } .dsm-mini i { max-width: 56px; }
|
|
173
|
+
.dsm-gp-name { display: none; }
|
|
174
|
+
.dsm-footer-block .dsm-row { flex-wrap: wrap; padding: 6px 0; }
|
|
175
|
+
}
|
|
176
|
+
`;
|