Refonte complete du rice. Palette 100% originale (Mitsuri Kanroji inspired), zero emprunt Dracula/Catppuccin. 50 fichiers, 3200+ lignes. Palette v2: - palette.sh source de verite unique (dark + light) - 5 accents (magenta, lilac, mitsuri, lavande, champagne) - 4 semantiques derivees, 4 niveaux texte, 6 fonds - Gradient signature: magenta → lilac → lavande → mitsuri - Variante Light: fonds lavande, accents assombris WCAG Terminal: - kitty (remplace COSMIC Term comme principal) - Maple Mono NF (cursive italics, ligatures) - Cursor trail magenta, splits/layouts tiling, undercurl - Vi-mode zsh avec cursor shape adaptatif Shell: - starship 3 lignes (palette nommee, brain_name, battery, sudo) - zshrc v2 (nouveaux outils, fzf pimp, shell functions, vi-mode) - Commandes custom: proj, glog, fkill, colors, hotkeys, weather, y Desktop: - AGS config (bar 3-pills, OSD gradient, launcher, notifications) - COSMIC Dark + Light v2 (7 fichiers RON chacun) - COSMIC Term v2 (color schemes dark/light, Maple Mono NF) - GTK3/GTK4 dark + light css - Vivaldi theme v2 Outils: - +kitty +dust +procs +tokei +sd +hyperfine +gping +Maple Mono NF - Propagation palette sur: bat, btop, cava, yazi, lazygit, rofi, delta, fastfetch, atuin, ls-colors, vivaldi - Claude Code statusline brain-aware Docs: - README v2 complet (palette, structure, raccourcis, commandes) - help.md v2 (reference exhaustive)
106 lines
3.6 KiB
JavaScript
106 lines
3.6 KiB
JavaScript
// ── violet-chaton v2 — Notifications widget ─────────────────────────────────
|
|
// Popup notifications stylees — urgency-aware
|
|
|
|
const notifications = await Service.import("notifications");
|
|
|
|
// Ne pas déranger
|
|
notifications.popupTimeout = 5000;
|
|
notifications.cacheActions = true;
|
|
|
|
const NotificationIcon = (notif) => {
|
|
if (notif.image) {
|
|
return Widget.Box({
|
|
css: `
|
|
min-width: 48px; min-height: 48px;
|
|
background-image: url("${notif.image}");
|
|
background-size: cover;
|
|
background-position: center;
|
|
border-radius: 8px;
|
|
margin-right: 10px;
|
|
`,
|
|
});
|
|
}
|
|
return Widget.Icon({
|
|
icon: notif.appIcon || notif.appEntry || "dialog-information",
|
|
size: 36,
|
|
css: "margin-right: 10px;",
|
|
});
|
|
};
|
|
|
|
const Notification = (notif) => Widget.Box({
|
|
className: `notification ${notif.urgency}`,
|
|
vertical: true,
|
|
children: [
|
|
Widget.Box({
|
|
children: [
|
|
NotificationIcon(notif),
|
|
Widget.Box({
|
|
vertical: true,
|
|
hexpand: true,
|
|
children: [
|
|
Widget.Box({
|
|
children: [
|
|
Widget.Label({
|
|
className: "title",
|
|
label: notif.summary,
|
|
xalign: 0,
|
|
hexpand: true,
|
|
truncate: "end",
|
|
}),
|
|
Widget.Label({
|
|
className: "time",
|
|
label: new Date(notif.time * 1000)
|
|
.toLocaleTimeString("fr-FR", {
|
|
hour: "2-digit",
|
|
minute: "2-digit",
|
|
}),
|
|
}),
|
|
Widget.Button({
|
|
className: "close-btn",
|
|
label: "✕",
|
|
onClicked: () => notif.close(),
|
|
}),
|
|
],
|
|
}),
|
|
Widget.Label({
|
|
className: "app-name",
|
|
label: notif.appName || "",
|
|
xalign: 0,
|
|
}),
|
|
],
|
|
}),
|
|
],
|
|
}),
|
|
...(notif.body ? [Widget.Label({
|
|
className: "body",
|
|
label: notif.body,
|
|
xalign: 0,
|
|
wrap: true,
|
|
useMarkup: true,
|
|
})] : []),
|
|
...(notif.actions.length > 0 ? [Widget.Box({
|
|
className: "actions",
|
|
children: notif.actions.map((action) =>
|
|
Widget.Button({
|
|
label: action.label,
|
|
onClicked: () => notif.invoke(action.id),
|
|
})
|
|
),
|
|
})] : []),
|
|
],
|
|
});
|
|
|
|
export const Notifications = (monitor) => Widget.Window({
|
|
name: `notifications-${monitor}`,
|
|
monitor,
|
|
anchor: ["top", "right"],
|
|
layer: "overlay",
|
|
child: Widget.Box({
|
|
vertical: true,
|
|
css: "min-width: 350px;",
|
|
children: notifications.bind("popups").transform((popups) =>
|
|
popups.map(Notification)
|
|
),
|
|
}),
|
|
});
|