diff --git a/cpanel/gniza/lib/GnizaCPanel/UI.pm b/cpanel/gniza/lib/GnizaCPanel/UI.pm index 80fc7b2..b6c71f0 100644 --- a/cpanel/gniza/lib/GnizaCPanel/UI.pm +++ b/cpanel/gniza/lib/GnizaCPanel/UI.pm @@ -8,6 +8,12 @@ use Fcntl qw(:DEFAULT); my $CSS_FILE = '/usr/local/cpanel/base/frontend/jupiter/gniza/assets/gniza-whm.css'; my $LOGO_FILE = '/usr/local/cpanel/base/frontend/jupiter/gniza/assets/gniza-logo.svg'; +my $_logo_data_uri = ''; + +my @NAV_ITEMS = ( + { url => 'index.live.cgi', label => 'Select Source' }, + { url => 'restore.live.cgi', label => 'Restore' }, +); # ── HTML Escaping ───────────────────────────────────────────── @@ -22,6 +28,45 @@ sub esc { return $str; } +# ── Navigation ──────────────────────────────────────────────── + +sub render_nav { + my ($current_page) = @_; + my $logo = ''; + if ($_logo_data_uri) { + $logo = qq{
} + . qq{} + . qq{GNIZA Backup} + . qq{
}; + } + my $menu_items = ''; + for my $item (@NAV_ITEMS) { + my $active = ($item->{url} eq $current_page) ? ' active' : ''; + my $label = esc($item->{label}); + $menu_items .= qq{
  • $label
  • \n}; + } + + my $html = qq{\n}; + return $html; +} + # ── Current User ───────────────────────────────────────────── sub get_current_user { @@ -180,20 +225,17 @@ sub page_header { $css = _unwrap_layers($css); $css = _scope_to_container($css); - # Inline logo as base64 data URI - my $logo_html = ''; - if (open my $lfh, '<', $LOGO_FILE) { + # Pre-compute logo data URI for render_nav() + if (!$_logo_data_uri && open my $lfh, '<', $LOGO_FILE) { local $/; my $svg_data = <$lfh>; close $lfh; require MIME::Base64; - my $b64 = MIME::Base64::encode_base64($svg_data, ''); - $logo_html = qq{
    gniza
    \n}; + $_logo_data_uri = 'data:image/svg+xml;base64,' . MIME::Base64::encode_base64($svg_data, ''); } return qq{\n} - . qq{
    \n} - . $logo_html; + . qq{
    \n}; } sub page_footer {