50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import PanelButton from "../PanelButton"
|
|
import options from "options"
|
|
import nix from "service/nix"
|
|
|
|
const { icon, label, action } = options.bar.launcher
|
|
|
|
function Spinner() {
|
|
const child = Widget.Icon({
|
|
icon: icon.icon.bind(),
|
|
class_name: Utils.merge([
|
|
icon.colored.bind(),
|
|
nix.bind("ready"),
|
|
], (c, r) => `${c ? "colored" : ""} ${r ? "" : "spinning"}`),
|
|
css: `
|
|
@keyframes spin {
|
|
to { -gtk-icon-transform: rotate(1turn); }
|
|
}
|
|
|
|
image.spinning {
|
|
animation-name: spin;
|
|
animation-duration: 1s;
|
|
animation-timing-function: linear;
|
|
animation-iteration-count: infinite;
|
|
}
|
|
`,
|
|
})
|
|
|
|
return Widget.Revealer({
|
|
transition: "slide_left",
|
|
child,
|
|
reveal_child: Utils.merge([
|
|
icon.icon.bind(),
|
|
nix.bind("ready"),
|
|
], (i, r) => Boolean(i || r)),
|
|
})
|
|
}
|
|
|
|
export default () => PanelButton({
|
|
window: "launcher",
|
|
on_clicked: action.bind(),
|
|
child: Widget.Box([
|
|
Spinner(),
|
|
Widget.Label({
|
|
class_name: label.colored.bind().as(c => c ? "colored" : ""),
|
|
visible: label.label.bind().as(v => !!v),
|
|
label: label.label.bind(),
|
|
}),
|
|
]),
|
|
})
|