@volter-ai-dev/supercode-ui 0.1.27 → 0.1.29
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/components.mjs +8 -5
- package/composer.mjs +2 -2
- package/core.mjs +3 -2
- package/embed.mjs +8 -5
- package/index.d.ts +2 -2
- package/messenger.mjs +8 -5
- package/package.json +1 -1
- package/sessions.mjs +5 -2
- package/styles.css +2 -1
package/components.mjs
CHANGED
|
@@ -550,7 +550,7 @@ function readSessions(value) {
|
|
|
550
550
|
messages: nullableNumber(row.messages),
|
|
551
551
|
active: row.active === true,
|
|
552
552
|
live: row.live === true,
|
|
553
|
-
runtimeStatus: row.runtimeStatus === "busy" || row.runtimeStatus === "idle" ? row.runtimeStatus : null
|
|
553
|
+
runtimeStatus: row.runtimeStatus === "running" || row.runtimeStatus === "busy" || row.runtimeStatus === "idle" ? row.runtimeStatus : null
|
|
554
554
|
}];
|
|
555
555
|
});
|
|
556
556
|
}
|
|
@@ -688,6 +688,7 @@ function sessionActivity(state, row) {
|
|
|
688
688
|
const attention = state.attention.find((item) => item.key === row.key)?.kind;
|
|
689
689
|
if (attention) return attention;
|
|
690
690
|
if (row.runtimeStatus === "busy") return "working";
|
|
691
|
+
if (row.runtimeStatus === "running") return "running";
|
|
691
692
|
if (row.live || row.runtimeStatus === "idle") return "recent";
|
|
692
693
|
return "idle";
|
|
693
694
|
}
|
|
@@ -745,7 +746,7 @@ function activitySummary(entries) {
|
|
|
745
746
|
function canContinueHere(state) {
|
|
746
747
|
if (state.mode !== "mirror" || state.canSend) return false;
|
|
747
748
|
const row = state.attached?.key ? state.sessions.find((item) => item.key === state.attached.key) : null;
|
|
748
|
-
return state.canResume && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
749
|
+
return state.canResume && row?.runtimeStatus !== "running" && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
749
750
|
}
|
|
750
751
|
function operationLabel(operation) {
|
|
751
752
|
if (!operation) return "";
|
|
@@ -1092,7 +1093,7 @@ function ContinuationBar({ state, adapter, labels = DEFAULT_LABELS }) {
|
|
|
1092
1093
|
if (state.mode !== "mirror" || state.canSend) return null;
|
|
1093
1094
|
const attached = state.attached;
|
|
1094
1095
|
const row = attached?.key ? state.sessions.find((item) => item.key === attached.key) : null;
|
|
1095
|
-
const activeElsewhere = row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
1096
|
+
const activeElsewhere = row?.runtimeStatus === "running" || row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
1096
1097
|
const resume = canContinueHere(state);
|
|
1097
1098
|
const join = state.canAttach;
|
|
1098
1099
|
const branch = state.canBranch;
|
|
@@ -1995,11 +1996,12 @@ var sessionListMemory = /* @__PURE__ */ new Map();
|
|
|
1995
1996
|
function sessionPathParts(value) {
|
|
1996
1997
|
const complete = String(value ?? "").replaceAll("\\", "/");
|
|
1997
1998
|
const boundary = complete.lastIndexOf("/");
|
|
1998
|
-
if (boundary
|
|
1999
|
+
if (boundary < 0) return { complete, leading: complete, separator: "", trailing: "" };
|
|
1999
2000
|
return {
|
|
2000
2001
|
complete,
|
|
2001
2002
|
leading: complete.slice(0, boundary),
|
|
2002
|
-
|
|
2003
|
+
separator: "/",
|
|
2004
|
+
trailing: complete.slice(boundary + 1)
|
|
2003
2005
|
};
|
|
2004
2006
|
}
|
|
2005
2007
|
function SessionRow({ row, state, onOpen }) {
|
|
@@ -2019,6 +2021,7 @@ function SessionRow({ row, state, onOpen }) {
|
|
|
2019
2021
|
] }),
|
|
2020
2022
|
path.complete ? /* @__PURE__ */ jsxs6("small", { class: "scui-session-path", title: row.cwd, children: [
|
|
2021
2023
|
/* @__PURE__ */ jsx7("span", { class: "scui-session-path-leading", children: path.leading }),
|
|
2024
|
+
path.separator ? /* @__PURE__ */ jsx7("span", { class: "scui-session-path-separator", children: path.separator }) : null,
|
|
2022
2025
|
path.trailing ? /* @__PURE__ */ jsx7("span", { class: "scui-session-path-trailing", children: path.trailing }) : null
|
|
2023
2026
|
] }) : null,
|
|
2024
2027
|
preview || unreadCount ? /* @__PURE__ */ jsxs6("span", { class: "scui-session-preview", children: [
|
package/composer.mjs
CHANGED
|
@@ -65,7 +65,7 @@ function harnessDisplayName(id) {
|
|
|
65
65
|
function canContinueHere(state) {
|
|
66
66
|
if (state.mode !== "mirror" || state.canSend) return false;
|
|
67
67
|
const row = state.attached?.key ? state.sessions.find((item) => item.key === state.attached.key) : null;
|
|
68
|
-
return state.canResume && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
68
|
+
return state.canResume && row?.runtimeStatus !== "running" && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
69
69
|
}
|
|
70
70
|
function isSendKey(event) {
|
|
71
71
|
return event.key === "Enter" && !event.shiftKey && !event.isComposing;
|
|
@@ -252,7 +252,7 @@ function ContinuationBar({ state, adapter, labels = DEFAULT_LABELS }) {
|
|
|
252
252
|
if (state.mode !== "mirror" || state.canSend) return null;
|
|
253
253
|
const attached = state.attached;
|
|
254
254
|
const row = attached?.key ? state.sessions.find((item) => item.key === attached.key) : null;
|
|
255
|
-
const activeElsewhere = row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
255
|
+
const activeElsewhere = row?.runtimeStatus === "running" || row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
256
256
|
const resume = canContinueHere(state);
|
|
257
257
|
const join = state.canAttach;
|
|
258
258
|
const branch = state.canBranch;
|
package/core.mjs
CHANGED
|
@@ -545,7 +545,7 @@ function readSessions(value) {
|
|
|
545
545
|
messages: nullableNumber(row.messages),
|
|
546
546
|
active: row.active === true,
|
|
547
547
|
live: row.live === true,
|
|
548
|
-
runtimeStatus: row.runtimeStatus === 'busy' || row.runtimeStatus === 'idle' ? row.runtimeStatus : null,
|
|
548
|
+
runtimeStatus: row.runtimeStatus === 'running' || row.runtimeStatus === 'busy' || row.runtimeStatus === 'idle' ? row.runtimeStatus : null,
|
|
549
549
|
}];
|
|
550
550
|
});
|
|
551
551
|
}
|
|
@@ -729,6 +729,7 @@ export function sessionActivity(state, row) {
|
|
|
729
729
|
const attention = state.attention.find((item) => item.key === row.key)?.kind;
|
|
730
730
|
if (attention) return attention;
|
|
731
731
|
if (row.runtimeStatus === 'busy') return 'working';
|
|
732
|
+
if (row.runtimeStatus === 'running') return 'running';
|
|
732
733
|
if (row.live || row.runtimeStatus === 'idle') return 'recent';
|
|
733
734
|
return 'idle';
|
|
734
735
|
}
|
|
@@ -793,7 +794,7 @@ export function activitySummary(entries) {
|
|
|
793
794
|
export function canContinueHere(state) {
|
|
794
795
|
if (state.mode !== 'mirror' || state.canSend) return false;
|
|
795
796
|
const row = state.attached?.key ? state.sessions.find((item) => item.key === state.attached.key) : null;
|
|
796
|
-
return state.canResume && row?.runtimeStatus !== 'busy' && row?.runtimeStatus !== 'idle';
|
|
797
|
+
return state.canResume && row?.runtimeStatus !== 'running' && row?.runtimeStatus !== 'busy' && row?.runtimeStatus !== 'idle';
|
|
797
798
|
}
|
|
798
799
|
|
|
799
800
|
export function operationLabel(operation) {
|
package/embed.mjs
CHANGED
|
@@ -553,7 +553,7 @@ function readSessions(value) {
|
|
|
553
553
|
messages: nullableNumber(row.messages),
|
|
554
554
|
active: row.active === true,
|
|
555
555
|
live: row.live === true,
|
|
556
|
-
runtimeStatus: row.runtimeStatus === "busy" || row.runtimeStatus === "idle" ? row.runtimeStatus : null
|
|
556
|
+
runtimeStatus: row.runtimeStatus === "running" || row.runtimeStatus === "busy" || row.runtimeStatus === "idle" ? row.runtimeStatus : null
|
|
557
557
|
}];
|
|
558
558
|
});
|
|
559
559
|
}
|
|
@@ -691,6 +691,7 @@ function sessionActivity(state, row) {
|
|
|
691
691
|
const attention = state.attention.find((item) => item.key === row.key)?.kind;
|
|
692
692
|
if (attention) return attention;
|
|
693
693
|
if (row.runtimeStatus === "busy") return "working";
|
|
694
|
+
if (row.runtimeStatus === "running") return "running";
|
|
694
695
|
if (row.live || row.runtimeStatus === "idle") return "recent";
|
|
695
696
|
return "idle";
|
|
696
697
|
}
|
|
@@ -748,7 +749,7 @@ function activitySummary(entries) {
|
|
|
748
749
|
function canContinueHere(state) {
|
|
749
750
|
if (state.mode !== "mirror" || state.canSend) return false;
|
|
750
751
|
const row = state.attached?.key ? state.sessions.find((item) => item.key === state.attached.key) : null;
|
|
751
|
-
return state.canResume && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
752
|
+
return state.canResume && row?.runtimeStatus !== "running" && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
752
753
|
}
|
|
753
754
|
function operationLabel(operation) {
|
|
754
755
|
if (!operation) return "";
|
|
@@ -1098,7 +1099,7 @@ function ContinuationBar({ state, adapter, labels = DEFAULT_LABELS }) {
|
|
|
1098
1099
|
if (state.mode !== "mirror" || state.canSend) return null;
|
|
1099
1100
|
const attached = state.attached;
|
|
1100
1101
|
const row = attached?.key ? state.sessions.find((item) => item.key === attached.key) : null;
|
|
1101
|
-
const activeElsewhere = row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
1102
|
+
const activeElsewhere = row?.runtimeStatus === "running" || row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
1102
1103
|
const resume = canContinueHere(state);
|
|
1103
1104
|
const join = state.canAttach;
|
|
1104
1105
|
const branch = state.canBranch;
|
|
@@ -1974,11 +1975,12 @@ var sessionListMemory = /* @__PURE__ */ new Map();
|
|
|
1974
1975
|
function sessionPathParts(value) {
|
|
1975
1976
|
const complete = String(value ?? "").replaceAll("\\", "/");
|
|
1976
1977
|
const boundary = complete.lastIndexOf("/");
|
|
1977
|
-
if (boundary
|
|
1978
|
+
if (boundary < 0) return { complete, leading: complete, separator: "", trailing: "" };
|
|
1978
1979
|
return {
|
|
1979
1980
|
complete,
|
|
1980
1981
|
leading: complete.slice(0, boundary),
|
|
1981
|
-
|
|
1982
|
+
separator: "/",
|
|
1983
|
+
trailing: complete.slice(boundary + 1)
|
|
1982
1984
|
};
|
|
1983
1985
|
}
|
|
1984
1986
|
function SessionRow({ row, state, onOpen }) {
|
|
@@ -1998,6 +2000,7 @@ function SessionRow({ row, state, onOpen }) {
|
|
|
1998
2000
|
] }),
|
|
1999
2001
|
path.complete ? /* @__PURE__ */ jsxs6("small", { class: "scui-session-path", title: row.cwd, children: [
|
|
2000
2002
|
/* @__PURE__ */ jsx7("span", { class: "scui-session-path-leading", children: path.leading }),
|
|
2003
|
+
path.separator ? /* @__PURE__ */ jsx7("span", { class: "scui-session-path-separator", children: path.separator }) : null,
|
|
2001
2004
|
path.trailing ? /* @__PURE__ */ jsx7("span", { class: "scui-session-path-trailing", children: path.trailing }) : null
|
|
2002
2005
|
] }) : null,
|
|
2003
2006
|
preview || unreadCount ? /* @__PURE__ */ jsxs6("span", { class: "scui-session-preview", children: [
|
package/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type UiTone = 'live' | 'warn' | 'dead' | 'off';
|
|
|
5
5
|
export type StartupPhase = 'connecting' | 'starting' | 'discovering' | 'ready';
|
|
6
6
|
export type SessionMode = 'none' | 'control' | 'mirror';
|
|
7
7
|
export type ControlStrategy = 'start' | 'resume' | 'attach' | 'branch' | 'reduce' | null;
|
|
8
|
-
export type SessionActivity = 'idle' | 'recent' | 'working' | 'needs-input' | 'finished' | 'failed' | 'unseen';
|
|
8
|
+
export type SessionActivity = 'idle' | 'recent' | 'running' | 'working' | 'needs-input' | 'finished' | 'failed' | 'unseen';
|
|
9
9
|
|
|
10
10
|
export interface HarnessOption {
|
|
11
11
|
id: HarnessId;
|
|
@@ -28,7 +28,7 @@ export interface SessionRowModel {
|
|
|
28
28
|
messages: number | null;
|
|
29
29
|
active: boolean;
|
|
30
30
|
live: boolean;
|
|
31
|
-
runtimeStatus: 'busy' | 'idle' | null;
|
|
31
|
+
runtimeStatus: 'running' | 'busy' | 'idle' | null;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export interface AttachedSessionModel {
|
package/messenger.mjs
CHANGED
|
@@ -550,7 +550,7 @@ function readSessions(value) {
|
|
|
550
550
|
messages: nullableNumber(row.messages),
|
|
551
551
|
active: row.active === true,
|
|
552
552
|
live: row.live === true,
|
|
553
|
-
runtimeStatus: row.runtimeStatus === "busy" || row.runtimeStatus === "idle" ? row.runtimeStatus : null
|
|
553
|
+
runtimeStatus: row.runtimeStatus === "running" || row.runtimeStatus === "busy" || row.runtimeStatus === "idle" ? row.runtimeStatus : null
|
|
554
554
|
}];
|
|
555
555
|
});
|
|
556
556
|
}
|
|
@@ -688,6 +688,7 @@ function sessionActivity(state, row) {
|
|
|
688
688
|
const attention = state.attention.find((item) => item.key === row.key)?.kind;
|
|
689
689
|
if (attention) return attention;
|
|
690
690
|
if (row.runtimeStatus === "busy") return "working";
|
|
691
|
+
if (row.runtimeStatus === "running") return "running";
|
|
691
692
|
if (row.live || row.runtimeStatus === "idle") return "recent";
|
|
692
693
|
return "idle";
|
|
693
694
|
}
|
|
@@ -745,7 +746,7 @@ function activitySummary(entries) {
|
|
|
745
746
|
function canContinueHere(state) {
|
|
746
747
|
if (state.mode !== "mirror" || state.canSend) return false;
|
|
747
748
|
const row = state.attached?.key ? state.sessions.find((item) => item.key === state.attached.key) : null;
|
|
748
|
-
return state.canResume && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
749
|
+
return state.canResume && row?.runtimeStatus !== "running" && row?.runtimeStatus !== "busy" && row?.runtimeStatus !== "idle";
|
|
749
750
|
}
|
|
750
751
|
function operationLabel(operation) {
|
|
751
752
|
if (!operation) return "";
|
|
@@ -1095,7 +1096,7 @@ function ContinuationBar({ state, adapter, labels = DEFAULT_LABELS }) {
|
|
|
1095
1096
|
if (state.mode !== "mirror" || state.canSend) return null;
|
|
1096
1097
|
const attached = state.attached;
|
|
1097
1098
|
const row = attached?.key ? state.sessions.find((item) => item.key === attached.key) : null;
|
|
1098
|
-
const activeElsewhere = row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
1099
|
+
const activeElsewhere = row?.runtimeStatus === "running" || row?.runtimeStatus === "busy" || row?.runtimeStatus === "idle";
|
|
1099
1100
|
const resume = canContinueHere(state);
|
|
1100
1101
|
const join = state.canAttach;
|
|
1101
1102
|
const branch = state.canBranch;
|
|
@@ -1971,11 +1972,12 @@ var sessionListMemory = /* @__PURE__ */ new Map();
|
|
|
1971
1972
|
function sessionPathParts(value) {
|
|
1972
1973
|
const complete = String(value ?? "").replaceAll("\\", "/");
|
|
1973
1974
|
const boundary = complete.lastIndexOf("/");
|
|
1974
|
-
if (boundary
|
|
1975
|
+
if (boundary < 0) return { complete, leading: complete, separator: "", trailing: "" };
|
|
1975
1976
|
return {
|
|
1976
1977
|
complete,
|
|
1977
1978
|
leading: complete.slice(0, boundary),
|
|
1978
|
-
|
|
1979
|
+
separator: "/",
|
|
1980
|
+
trailing: complete.slice(boundary + 1)
|
|
1979
1981
|
};
|
|
1980
1982
|
}
|
|
1981
1983
|
function SessionRow({ row, state, onOpen }) {
|
|
@@ -1995,6 +1997,7 @@ function SessionRow({ row, state, onOpen }) {
|
|
|
1995
1997
|
] }),
|
|
1996
1998
|
path.complete ? /* @__PURE__ */ jsxs6("small", { class: "scui-session-path", title: row.cwd, children: [
|
|
1997
1999
|
/* @__PURE__ */ jsx7("span", { class: "scui-session-path-leading", children: path.leading }),
|
|
2000
|
+
path.separator ? /* @__PURE__ */ jsx7("span", { class: "scui-session-path-separator", children: path.separator }) : null,
|
|
1998
2001
|
path.trailing ? /* @__PURE__ */ jsx7("span", { class: "scui-session-path-trailing", children: path.trailing }) : null
|
|
1999
2002
|
] }) : null,
|
|
2000
2003
|
preview || unreadCount ? /* @__PURE__ */ jsxs6("span", { class: "scui-session-preview", children: [
|
package/package.json
CHANGED
package/sessions.mjs
CHANGED
|
@@ -72,6 +72,7 @@ function sessionActivity(state, row) {
|
|
|
72
72
|
const attention = state.attention.find((item) => item.key === row.key)?.kind;
|
|
73
73
|
if (attention) return attention;
|
|
74
74
|
if (row.runtimeStatus === "busy") return "working";
|
|
75
|
+
if (row.runtimeStatus === "running") return "running";
|
|
75
76
|
if (row.live || row.runtimeStatus === "idle") return "recent";
|
|
76
77
|
return "idle";
|
|
77
78
|
}
|
|
@@ -282,11 +283,12 @@ var sessionListMemory = /* @__PURE__ */ new Map();
|
|
|
282
283
|
function sessionPathParts(value) {
|
|
283
284
|
const complete = String(value ?? "").replaceAll("\\", "/");
|
|
284
285
|
const boundary = complete.lastIndexOf("/");
|
|
285
|
-
if (boundary
|
|
286
|
+
if (boundary < 0) return { complete, leading: complete, separator: "", trailing: "" };
|
|
286
287
|
return {
|
|
287
288
|
complete,
|
|
288
289
|
leading: complete.slice(0, boundary),
|
|
289
|
-
|
|
290
|
+
separator: "/",
|
|
291
|
+
trailing: complete.slice(boundary + 1)
|
|
290
292
|
};
|
|
291
293
|
}
|
|
292
294
|
function SessionRow({ row, state, onOpen }) {
|
|
@@ -306,6 +308,7 @@ function SessionRow({ row, state, onOpen }) {
|
|
|
306
308
|
] }),
|
|
307
309
|
path.complete ? /* @__PURE__ */ jsxs5("small", { class: "scui-session-path", title: row.cwd, children: [
|
|
308
310
|
/* @__PURE__ */ jsx6("span", { class: "scui-session-path-leading", children: path.leading }),
|
|
311
|
+
path.separator ? /* @__PURE__ */ jsx6("span", { class: "scui-session-path-separator", children: path.separator }) : null,
|
|
309
312
|
path.trailing ? /* @__PURE__ */ jsx6("span", { class: "scui-session-path-trailing", children: path.trailing }) : null
|
|
310
313
|
] }) : null,
|
|
311
314
|
preview || unreadCount ? /* @__PURE__ */ jsxs5("span", { class: "scui-session-preview", children: [
|
package/styles.css
CHANGED
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
.scui-logo[data-harness="supercode"] { background:#111923 }
|
|
75
75
|
.scui-logo > i { position:absolute; right:-5%; bottom:-5%; width:32%; height:32%; border:2px solid var(--scui-bg); border-radius:50%; background:var(--scui-muted) }
|
|
76
76
|
.scui-logo[data-activity="working"] > i { background:var(--scui-accent); animation:scui-breathe 1.4s ease-in-out infinite }
|
|
77
|
+
.scui-logo[data-activity="running"] > i { background:var(--scui-positive) }
|
|
77
78
|
.scui-logo[data-activity="needs-input"] > i { background:var(--scui-warning) }
|
|
78
79
|
.scui-logo[data-activity="failed"] > i { background:var(--scui-danger) }
|
|
79
80
|
.scui-logo[data-activity="finished"] > i,.scui-logo[data-activity="unseen"] > i { background:var(--scui-positive) }
|
|
@@ -99,7 +100,7 @@
|
|
|
99
100
|
.scui-session-copy strong,.scui-session-copy span > small { overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
|
|
100
101
|
.scui-session-copy strong { flex:1; font-size:12.5px }.scui-session-title time { flex:none; color:var(--scui-muted); font-size:10px }
|
|
101
102
|
.scui-session-path { display:flex; min-width:0; overflow:hidden; color:var(--scui-muted); font-size:9.5px; white-space:nowrap }
|
|
102
|
-
.scui-session-path-leading { flex:0 1 auto; overflow:hidden; text-overflow:ellipsis }.scui-session-path-trailing { flex:none; max-width:58%; overflow:hidden; direction:rtl; text-align:left; text-overflow:ellipsis; unicode-bidi:plaintext }
|
|
103
|
+
.scui-session-path-leading { flex:0 1 auto; overflow:hidden; text-overflow:ellipsis }.scui-session-path-separator { flex:none }.scui-session-path-trailing { flex:none; max-width:58%; overflow:hidden; direction:rtl; text-align:left; text-overflow:ellipsis; unicode-bidi:plaintext }
|
|
103
104
|
.scui-session-preview small { flex:1; min-width:0; color:var(--scui-muted); font-size:10.5px }.scui-session-preview b { display:grid; flex:none; min-width:16px; height:16px; padding:0 4px; place-items:center; border-radius:8px; background:var(--scui-accent); color:var(--scui-bg); font-size:9px; line-height:16px }
|
|
104
105
|
.scui-session-copy em { overflow:hidden; color:var(--scui-danger); font-size:10px; font-style:normal; text-overflow:ellipsis; white-space:nowrap }
|
|
105
106
|
.scui-load { display:block; margin:7px auto; padding:5px 10px; border:1px solid var(--scui-border); border-radius:8px; background:var(--scui-bg-raised); color:var(--scui-muted); cursor:pointer }.scui-load:disabled { opacity:.65; cursor:default }
|