NOTE: This document is deprecated in favor of podman-desktop/podman-desktop#14590
This is the analysis of all potential danger button candidates to determine which buttons should be styled as danger (red) buttons.
Only buttons that immediately perform destructive actions should be danger buttons. Buttons that open confirmation dialogs should remain primary/secondary styled, with the confirmation button in the dialog being danger styled instead.
All buttons (not just danger ones) should be reworded to quickly explain the action. Especially a destructive button with the label Yes is dangerous. The user must understand the action without reading the explanation above the button just by reading the button label. Note: this is out of the scope of this task, here we just discuss changing buttons to danger ones.
There are three group of buttons based on what we need (or need not) to do:
- Group A: Buttons that open dialogs first
- Group B: Buttons that perform immediate destructive actions
- Group C: Buttons that should not be danger but currently are
Do not style as danger buttons.
These buttons only trigger a confirmation dialog. The destructive action requires a second click in the dialog. The button inside the dialog (e.g., Yes, Ok, Confirm) should be danger styled instead.
- Prune Button (1 button, 4 resource types)
- File: packages/renderer/src/lib/engine/Prune.svelte:98
- Function:
openPruneDialog()at line 16 - Pattern: Shows
window.showMessageBoxwithYes/Cancelor image-specific options - Dialog Buttons:
Yes/All unused images/All untagged imagesbuttons should be danger styled - Resource Types: containers, images, pods, volumes
All these use the withConfirmation() helper which shows a Yes/Cancel confirmation dialog before executing:
-
Delete Container
- File: packages/renderer/src/lib/container/ContainerActions.svelte:206
- Pattern:
withConfirmation(deleteContainer, 'delete container ${container.name}')
-
Delete Image
- File: packages/renderer/src/lib/image/ImageActions.svelte:117
- Pattern:
withConfirmation(deleteImage, 'delete image ${image.name}:${image.tag}')
-
Delete Pod
- File: packages/renderer/src/lib/pod/PodActions.svelte:159
- Pattern:
withConfirmation(deletePod, 'delete pod ${pod.name}')
-
Delete Volume
- File: packages/renderer/src/lib/volume/VolumeActions.svelte:26
- Pattern:
withConfirmation(removeVolume, 'delete volume ${volume.name}')
-
Delete Manifest
- File: packages/renderer/src/lib/image/ManifestActions.svelte:47
- Pattern:
withConfirmation(deleteManifest, 'delete manifest ${manifest.name}')
-
Delete Compose
- File: packages/renderer/src/lib/compose/ComposeActions.svelte:158
- Pattern:
withConfirmation(deleteCompose, 'delete compose ${compose.name}')
-
Delete Deployment
- File: packages/renderer/src/lib/deployments/DeploymentActions.svelte:25
- Pattern:
withConfirmation(deleteDeployment, 'delete deployment ${deployment.name}')
-
Delete Service
- File: packages/renderer/src/lib/service/ServiceActions.svelte:21
- Pattern:
withConfirmation(deleteService, 'delete service ${service.name}')
-
Delete Job
- File: packages/renderer/src/lib/job/JobActions.svelte:24
- Pattern:
withConfirmation(deleteJob, 'delete job ${job.name}')
-
Delete CronJob
- File: packages/renderer/src/lib/cronjob/CronJobActions.svelte:24
- Pattern:
withConfirmation(deleteCronJob, 'delete cronjob ${cronjob.name}')
-
Delete Pod (Kubernetes)
- File: packages/renderer/src/lib/kube/pods/PodActions.svelte:61
- Pattern:
withConfirmation(deletePod, 'delete pod ${pod.name}')
-
Delete ConfigMap/Secret
- File: packages/renderer/src/lib/configmaps-secrets/ConfigMapSecretActions.svelte:28
- Pattern:
withConfirmation(deleteConfigMapSecret, 'delete ${type} ${name}')
-
Delete Ingress/Route
- File: packages/renderer/src/lib/ingresses-routes/IngressRouteActions.svelte:28
- Pattern:
withConfirmation(deleteIngressRoute, 'delete ${type} ${name}')
-
Delete PersistentVolumeClaim
- File: packages/renderer/src/lib/pvc/PVCActions.svelte:21
- Pattern:
withConfirmation(deletePVC, 'delete pvc ${pvc.name}')
-
Delete Port Forward
- File: packages/renderer/src/lib/kubernetes-port-forward/PortForwardActions.svelte:43
- Pattern:
withConfirmation(deletePortForward, 'Delete port forward')
These use withBulkConfirmation() which conditionally shows a confirmation dialog based on user settings:
-
Delete Selected Pods
- File: packages/renderer/src/lib/pod/PodsList.svelte:172
- Pattern:
withBulkConfirmation(deleteSelectedPods, 'delete ${n} pod(s)')
-
Delete Selected Tasks
- File: packages/renderer/src/lib/task-manager/button/TaskManagerBulkDeleteButton.svelte:36
- Pattern:
withBulkConfirmation(deleteSelectedTasks, ...)
-
Delete Selected Volumes
- File: packages/renderer/src/lib/volume/VolumesList.svelte:200
- Pattern:
withBulkConfirmation(deleteSelectedVolumes, ...)
-
Delete Selected Kubernetes Objects
- File: packages/renderer/src/lib/objects/KubernetesObjectsList.svelte:137
- Pattern:
withBulkConfirmation(deleteSelectedObjects, ...)
-
Delete Selected Containers
- File: packages/renderer/src/lib/container/ContainerList.svelte:407
- Pattern:
withBulkConfirmation(deleteSelectedContainers, ...)
-
Delete Selected Extension Folders
- File: packages/renderer/src/lib/extensions/dev-mode/table/ListTable.svelte:66
- Pattern:
withBulkConfirmation(deleteSelectedFolders, ...)
-
Delete Selected Images
- File: packages/renderer/src/lib/image/ImagesList.svelte:307
- Pattern:
withBulkConfirmation(deleteSelectedImages, ...)
- Delete Kubernetes Context
- File: packages/renderer/src/lib/preferences/PreferencesKubernetesContextsRendering.svelte:278
- Function:
handleDeleteContext()at line 94 - Pattern: Shows
window.showMessageBoxif deleting current context - Dialog Button:
Yesbutton should be danger styled
- Cancel Setup Button
- File: packages/renderer/src/lib/onboarding/Onboarding.svelte:501
- Function:
setDisplayCancelSetup(true)shows custom modal - Modal: Lines 508-530 show
Skip the entire setup?dialog - Modal Button:
Okbutton at line 526 should be danger styled (callscancelSetup()) - Note: The
Cancelbutton that opens the dialog should remain secondary
These should be styled as danger buttons.
These buttons execute destructive operations directly without showing a confirmation dialog first.
-
Extension Uninstall
⚠️ - File: packages/renderer/src/lib/extensions/InstalledExtensionCardLeftLifecycleDelete.svelte:28
- Function:
deleteExtension()at line 16 - Pattern: Directly calls
window.ddExtensionDelete()orwindow.removeExtension()with no confirmation - Component: Uses
LoadingIconButton - Severity: HIGH - permanently removes extensions
- Recommendation: Should be danger
- Where to find it in: Extensions → Find any installed extension card → action buttons on the left side of each extension card → The trash icon button
-
Extension Folder Untrack (Individual)
⚠️ - File: packages/renderer/src/lib/extensions/dev-mode/selectable/ActionUntrack.svelte:21-25
- Function:
untrackExtensionFolder() - Pattern: Directly removes folder tracking with no confirmation
- Severity: MEDIUM - only affects dev mode
- Recommendation: Should be danger
- Where to find it: Extensions → Local Extensions → trash icon on the right side of each extension folder row (only visible when extension is stopped)
- CLI Tool Uninstall
⚠️ - File: packages/renderer/src/lib/preferences/PreferencesCliTool.svelte:207-217
- Pattern: Directly calls uninstall operation with no confirmation
- Component: Uses
LoadingIconButton - Severity: HIGH - removes CLI tools
- Recommendation: Should be danger
- Where to find it: Settings → CLI Tools → Find any installed CLI tool (e.g., kubectl, helm, podman, docker) → Look for the trash icon button (only visible for installed CLI tools that support uninstall)
- Registry Removal
⚠️ - File: packages/renderer/src/lib/preferences/PreferencesRegistriesEditing.svelte:366
- Function:
removeExistingRegistry()at line 227 - Pattern: Directly calls
window.unregisterImageRegistry()with no confirmation - Component: Uses
DropdownMenu.Item - Severity: MEDIUM - removes registry configuration
- Recommendation: Should be danger
- Where to find it: Settings → Registries → Find any configured registry (e.g., docker.io, quay.io, custom registries) → Click the three-dot menu → Look for
Removeoption in the dropdown menu (Note: this is a menu item and not a button, but it's still useful to list it here)
- Task Manager Clear All 🔶
- File: packages/renderer/src/lib/task-manager/button/TaskManagerClearAllButton.svelte:8
- Function:
clearNotifications()from stores - Pattern: Directly clears all notifications with no confirmation
- Severity: LOW - only clears UI notifications, not user data
- Recommendation: Maybe be danger (lower priority)
- Where to find it: Bell icon in the bottom-right corner → The Task Manager panel slides up from the bottom → Look at the top-right corner →
Clear all
-
Task/Notification Individual Delete 🔶
- File: packages/renderer/src/lib/task-manager/table/action/TaskManagerActionsDelete.svelte:17
- Function:
removeTask()at line 12 - Pattern: Directly calls
window.clearTask()with no confirmation - Note: Only shown for completed tasks
- Severity: VERY LOW - archives completed tasks
- Recommendation: Maybe be danger (very low priority)
- Where to find it: Bell icon in the bottom-right corner → The Task Manager panel slides up → Find any completed task in the list (green checkmark) → Look for the trash icon button in the actions column on the right (Note: Only visible for completed tasks, not running or failed tasks)
-
Log/Terminal Clear 🔶
- File: packages/renderer/src/lib/container/ContainerDetailsLogsClear.svelte:57-62
- Function:
clear() - Action: Clears log display in UI
- Severity: VERY LOW - only clears UI state, logs remain
- Recommendation: Maybe be danger (very low priority)
- Cleanup/Purge Data
- File: packages/renderer/src/lib/troubleshooting/TroubleshootingRepairCleanup.svelte:64
- Type:
dangerThis button shouldn't be danger since it opens a dialog - Function:
openCleanupDialog()at line 21 - Status: Remove danger
- Where to find it: Settings → Troubleshooting →
Clean / Purge datasection
- Task Manager Clear All: Is clearing all notifications considered destructive enough for danger styling? It doesn't delete user data, just UI notifications.
- Reversible operations: Extension uninstall and CLI tool uninstall can be reversed by reinstalling. Should they still be danger buttons?
- Cleanup/Purge button exception: Should we maintain the current pattern where this button is danger styled even though it shows a dialog, due to its prominent warnings?
- Component support: Should
ListItemButtonIcon,LoadingIconButton, andDropdownMenu.Itemcomponents support danger styling?
- Button component: packages/ui/src/lib/button/Button.svelte
- Button types: packages/ui/src/lib/button/Button.ts
- Confirmation utilities: packages/renderer/src/lib/dialogs/messagebox-utils.ts
- Bulk actions: packages/renderer/src/lib/actions/BulkActions.ts
This analysis was assisted by Claude Code.