mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-09-11 04:00:38 +00:00
Discovery proved only that a composition parsed, so a preset naming a package a later rename took away kept a healthy card and its place in every picker until a person switched to it. It now resolves each row it can prove will start, reading the package off disk and falling back to the resolver only for names that look absent — the resolver costs a synchronous hooks-thread round-trip under the source launch's tsx hook, which the walk avoids for every row it clears. The mount diagnostic followed `AggregateError.errors` but never a cause, so a group that failed on two rows named neither. It now follows a cause that carries more than its own message. A refused switch left the chip's label snapping back with no account of why, which is the only account there can be for a preset that resolves and then refuses. It announces through the shared Toast, which gained a caller-set hold for a cause that names packages and rows.
68 lines
1.6 KiB
CSS
68 lines
1.6 KiB
CSS
/* The fade delay comes from the component as `--dsh-toast-hold`, so one value
|
|
drives both the unmount timer and this animation; the fallback matches the
|
|
component's own default. The fade DURATION still has to agree with FADE_MS
|
|
in Toast.tsx, which no owner varies. */
|
|
|
|
.toast {
|
|
position: fixed;
|
|
top: 120px;
|
|
left: 50%;
|
|
/* Above the 1000 the image lightbox backdrop uses: a failure reported while
|
|
a preview is open must stay readable. */
|
|
z-index: 1100;
|
|
/* Announcements never intercept clicks. */
|
|
pointer-events: none;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
max-width: min(560px, calc(100vw - 48px));
|
|
padding: 12px 16px;
|
|
border-radius: 14px;
|
|
background: var(--dsw-alias-button-contrast-fill);
|
|
color: var(--dsw-alias-label-primary-inverted);
|
|
font-size: 14px;
|
|
line-height: 22px;
|
|
box-shadow: var(--dsw-shadow-lv3);
|
|
transform: translateX(-50%);
|
|
animation:
|
|
dsh-toast-in 160ms ease-out,
|
|
dsh-toast-fade 1000ms ease var(--dsh-toast-hold, 3000ms) forwards;
|
|
}
|
|
|
|
.icon {
|
|
display: grid;
|
|
place-items: center;
|
|
flex: none;
|
|
color: var(--dsw-alias-state-warn-label);
|
|
}
|
|
|
|
.text {
|
|
min-width: 0;
|
|
}
|
|
|
|
@keyframes dsh-toast-in {
|
|
from {
|
|
opacity: 0;
|
|
transform: translate(-50%, -6px);
|
|
}
|
|
|
|
to {
|
|
opacity: 1;
|
|
transform: translate(-50%, 0);
|
|
}
|
|
}
|
|
|
|
@keyframes dsh-toast-fade {
|
|
to {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
/* Reduced motion drops the slide-in; the delayed fade (an opacity change,
|
|
not movement) still ends the banner before the timed unmount. */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.toast {
|
|
animation: dsh-toast-fade 1000ms ease var(--dsh-toast-hold, 3000ms) forwards;
|
|
}
|
|
}
|