import { Theme } from "theme.slint"; import { GhostButton } from "widgets.slint"; // A destructive (red) action button, matching PrimaryButton's shape. component DangerButton inherits Rectangle { in property text; callback clicked(); height: 30px; min-width: 80px; border-radius: Theme.radius-sm; background: touch.pressed ? #c44a4a : (touch.has-hover ? #ec6a6a : Theme.danger); animate background { duration: 120ms; } HorizontalLayout { height: parent.height; padding-left: 14px; padding-right: 14px; alignment: center; Text { height: parent.height; text: root.text; color: white; font-size: Theme.fs-md; font-weight: 600; horizontal-alignment: center; vertical-alignment: center; } } touch := TouchArea { mouse-cursor: pointer; clicked => { root.clicked(); } } } // In-app modal confirmation dialog, styled to match the rest of meatshell // (a dark card over a dimmed backdrop, like SessionDialog). Purely // presentational: it emits `confirm` / `cancel` and the caller decides what // to do. Used for the irreversible SFTP delete (#28). export component ConfirmDialog inherits Rectangle { in-out property is-open: false; in property title: @tr("Please confirm"); in property message; in property detail; // optional, e.g. the file path in property confirm-label: @tr("Confirm"); callback confirm(); callback cancel(); visible: is-open; background: #000000aa; // Backdrop click cancels. TouchArea { width: 100%; height: 100%; clicked => { root.cancel(); } } Rectangle { width: 380px; height: card.preferred-height; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; background: Theme.bg-panel; border-radius: Theme.radius-lg; border-width: 1px; border-color: Theme.border-strong; drop-shadow-blur: 24px; drop-shadow-color: #00000080; // Swallow clicks inside the card so they don't hit the backdrop. TouchArea { width: 100%; height: 100%; } card := VerticalLayout { padding: 20px; spacing: 12px; HorizontalLayout { spacing: 8px; Text { text: "⚠"; color: Theme.danger; font-size: Theme.fs-xl; vertical-alignment: center; } Text { text: root.title; color: Theme.text-primary; font-size: Theme.fs-xl; font-weight: 600; vertical-alignment: center; } } Text { text: root.message; color: Theme.text-secondary; font-size: Theme.fs-md; wrap: word-wrap; } if root.detail != "" : Text { text: root.detail; color: Theme.text-primary; font-family: Theme.font-mono; font-size: Theme.fs-sm; wrap: word-wrap; } HorizontalLayout { height: 30px; alignment: end; spacing: 8px; GhostButton { text: @tr("Cancel"); clicked => { root.cancel(); } } DangerButton { text: root.confirm-label; clicked => { root.confirm(); } } } } } }