diff --git a/languages/en.yaml b/languages/en.yaml
index 33555f4b..2f8a8d3d 100644
--- a/languages/en.yaml
+++ b/languages/en.yaml
@@ -542,7 +542,7 @@ PLUGIN_ADMIN:
SAFE_UPGRADE_STAGE_FINALIZING: "Finalizing changes"
SAFE_UPGRADE_STAGE_COMPLETE: "Upgrade complete"
SAFE_UPGRADE_STAGE_ERROR: "Upgrade encountered an error"
- SAFE_UPGRADE_RESULT_SUCCESS: "Grav upgraded to v%s"
+ SAFE_UPGRADE_RESULT_SUCCESS: "Grav Upgrade to v%s Successful!"
SAFE_UPGRADE_RESULT_MANIFEST: "Snapshot reference: %s"
SAFE_UPGRADE_RESULT_HINT: "Restore snapshots from Tools → Restore Grav."
SAFE_UPGRADE_RESULT_NOOP: "Grav is already up to date."
diff --git a/themes/grav/app/updates/safe-upgrade.js b/themes/grav/app/updates/safe-upgrade.js
index dae58a28..c9947d55 100644
--- a/themes/grav/app/updates/safe-upgrade.js
+++ b/themes/grav/app/updates/safe-upgrade.js
@@ -890,12 +890,21 @@ export default class SafeUpgrade {
const manifest = result.manifest || {};
const target = result.version || manifest.target_version || '';
const identifier = manifest.id || '';
+ this.ensureSuccessBannerStyles();
this.steps.result.html(`
-
${r('SAFE_UPGRADE_RESULT_SUCCESS', target, 'Grav upgraded to v%s')}
- ${identifier ? `
${r('SAFE_UPGRADE_RESULT_MANIFEST', identifier, 'Snapshot reference: %s')}
` : ''}
-
${t('SAFE_UPGRADE_RESULT_HINT', 'Restore snapshots from Tools → Restore Grav.')}
+
+
+
+
${t('SAFE_UPGRADE_STAGE_COMPLETE', 'Upgrade complete')}
+
${r('SAFE_UPGRADE_RESULT_SUCCESS', target, 'Grav Upgrade to v%s Successful!')}
+
+
+
+ ${identifier ? `
${r('SAFE_UPGRADE_RESULT_MANIFEST', identifier, 'Snapshot reference: %s')}
` : ''}
+
${t('SAFE_UPGRADE_RESULT_HINT', 'Restore snapshots from Tools → Restore Grav.')}
+
`);
@@ -932,6 +941,67 @@ export default class SafeUpgrade {
}
}
+ ensureSuccessBannerStyles() {
+ if ($('#safe-upgrade-success-banner-styles').length) {
+ return;
+ }
+
+ const css = `
+ .safe-upgrade-result.success {
+ background: rgba(41, 182, 94, 0.08);
+ border: 1px solid rgba(41, 182, 94, 0.24);
+ border-radius: 12px;
+ padding: 1.3rem 1.4rem;
+ box-shadow: 0 14px 32px rgba(41, 182, 94, 0.18);
+ margin-bottom: 1rem;
+ text-align: left;
+ }
+ .safe-upgrade-result.success .safe-upgrade-result__banner {
+ display: flex;
+ align-items: center;
+ gap: 0.9rem;
+ margin-bottom: 0.85rem;
+ }
+ .safe-upgrade-result.success .safe-upgrade-result__icon {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ background: #27ae60;
+ color: #fff;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.25rem;
+ box-shadow: 0 10px 22px rgba(39, 174, 96, 0.35);
+ }
+ .safe-upgrade-result.success .safe-upgrade-result__label {
+ font-size: 0.82rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ font-weight: 600;
+ margin: 0 0 0.15rem;
+ color: rgba(39, 174, 96, 0.85);
+ }
+ .safe-upgrade-result.success h3 {
+ margin: 0;
+ font-size: 1.2rem;
+ color: #14301d;
+ }
+ .safe-upgrade-result.success .safe-upgrade-result__details {
+ font-size: 0.95rem;
+ color: rgba(20, 48, 29, 0.9);
+ }
+ .safe-upgrade-result.success .safe-upgrade-result__details p {
+ margin: 0.4rem 0;
+ }
+ `;
+
+ $('