Use bg-white for card backgrounds across all WHM pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shuki
2026-03-04 05:34:34 +02:00
parent 100bad0599
commit 3805b87300
8 changed files with 35 additions and 35 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
<!-- Tailwind/DaisyUI class safelist for gniza WHM plugin -->
<div class="alert alert-error alert-info alert-success alert-warning badge badge-error badge-sm badge-success badge-warning bg-base-100 bg-base-200 bg-neutral bg-primary/10 border border-base-300 border-base-content/5 breadcrumbs btn btn-error btn-ghost btn-primary btn-secondary btn-sm btn-xs card card-body card-title checkbox checkbox-sm cursor-pointer flex flex-1 flex-col flex-wrap font-bold font-medium font-mono font-semibold gap-1 gap-2 gap-3 hidden inline input input-bordered input-sm items-center items-start mx-auto join join-item link list-disc loading loading-spinner loading-xs max-h-48 max-w-2xl max-w-xs mb-1 mb-2.5 mb-3 mb-4 mb-5 mb-6 ml-2 modal modal-action modal-backdrop modal-box mt-2 mt-3 mt-4 mt-5 my-2 my-4 overflow-x-auto overflow-y-auto p-3 p-4 pt-1 pt-2 pl-5 px-4 py-1 py-3 py-4 radio radio-sm rounded-box rounded-lg select select-bordered select-sm shadow-sm steps tab tab-content table hover tabs tabs-box tabs-lg tab-active text-center text-error text-lg textarea textarea-bordered textarea-sm text-base-content/60 text-neutral-content text-sm text-xl text-xs toggle toggle-sm toggle-success w-11/12 w-44 w-full whitespace-pre-wrap font-sans text-[2.3rem] text-warning badge-info badge-neutral btn-active leading-relaxed inline-flex items-stretch w-fit bg-[#fafafa] px-5 max-h-[360px] m-0 no-underline"></div>
<div class="alert alert-error alert-info alert-success alert-warning badge badge-error badge-sm badge-success badge-warning bg-base-100 bg-base-200 bg-neutral bg-primary/10 border border-base-300 border-base-content/5 breadcrumbs btn btn-error btn-ghost btn-primary btn-secondary btn-sm btn-xs card card-body card-title checkbox checkbox-sm cursor-pointer flex flex-1 flex-col flex-wrap font-bold font-medium font-mono font-semibold gap-1 gap-2 gap-3 hidden inline input input-bordered input-sm items-center items-start mx-auto join join-item link list-disc loading loading-spinner loading-xs max-h-48 max-w-2xl max-w-xs mb-1 mb-2.5 mb-3 mb-4 mb-5 mb-6 ml-2 modal modal-action modal-backdrop modal-box mt-2 mt-3 mt-4 mt-5 my-2 my-4 overflow-x-auto overflow-y-auto p-3 p-4 pt-1 pt-2 pl-5 px-4 py-1 py-3 py-4 radio radio-sm rounded-box rounded-lg select select-bordered select-sm shadow-sm steps tab tab-content table hover tabs tabs-box tabs-lg tab-active text-center text-error text-lg textarea textarea-bordered textarea-sm text-base-content/60 text-neutral-content text-sm text-xl text-xs toggle toggle-sm toggle-success w-11/12 w-44 w-full whitespace-pre-wrap font-sans text-[2.3rem] text-warning badge-info badge-neutral btn-active leading-relaxed inline-flex items-stretch w-fit bg-[#fafafa] px-5 max-h-[360px] m-0 no-underline bg-white"></div>

View File

@@ -33,7 +33,7 @@ print qq{</div>\n};
# Remote destinations
my @remotes = GnizaWHM::UI::list_remotes();
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Configured Remotes</h2>\n};
if (@remotes) {
print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100"><table class="table">\n};
@@ -55,7 +55,7 @@ print qq{</div>\n</div>\n};
# Active schedules
my $schedules = GnizaWHM::Cron::get_current_schedules();
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Active Cron Schedules</h2>\n};
if (keys %$schedules) {
print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100"><table class="table">\n};
@@ -76,7 +76,7 @@ print qq{</div>\n</div>\n};
# Overview
my $version = GnizaWHM::UI::get_gniza_version();
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Overview</h2>\n};
print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100"><table class="table">\n};
print qq{<tr><td class="font-semibold w-44">gniza version</td><td>} . GnizaWHM::UI::esc($version) . qq{</td></tr>\n};

View File

@@ -138,7 +138,7 @@ sub handle_list {
my @remotes = GnizaWHM::UI::list_remotes();
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
if (@remotes) {
print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100"><table class="table">\n};
@@ -506,7 +506,7 @@ sub render_remote_form {
}
# Remote name
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Remote Identity</h2>\n};
print qq{<div class="flex items-center gap-3 mb-2.5">\n};
print qq{ <label class="w-44 font-medium text-sm" for="remote_name">Remote Name</label>\n};
@@ -551,7 +551,7 @@ sub render_remote_form {
my $pw_hidden = ($auth_method ne 'password') ? ' hidden' : '';
print qq{<div id="type-ssh-fields"$ssh_hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">SSH Connection</h2>\n};
_field($conf, 'REMOTE_HOST', 'Hostname / IP', 'Required');
_field($conf, 'REMOTE_PORT', 'SSH Port', 'Default: 22');
@@ -588,7 +588,7 @@ sub render_remote_form {
my $s3_hidden = ($remote_type ne 's3') ? ' hidden' : '';
print qq{<div id="type-s3-fields"$s3_hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Amazon S3 / S3-Compatible</h2>\n};
_field($conf, 'S3_ACCESS_KEY_ID', 'Access Key ID', 'Required');
_password_field($conf, 'S3_SECRET_ACCESS_KEY', 'Secret Access Key', 'Required');
@@ -603,7 +603,7 @@ sub render_remote_form {
my $gdrive_hidden = ($remote_type ne 'gdrive') ? ' hidden' : '';
print qq{<div id="type-gdrive-fields"$gdrive_hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Google Drive</h2>\n};
_field($conf, 'GDRIVE_SERVICE_ACCOUNT_FILE', 'Service Account JSON', 'Absolute path, required');
_field($conf, 'GDRIVE_ROOT_FOLDER_ID', 'Root Folder ID', 'Optional');
@@ -612,13 +612,13 @@ sub render_remote_form {
print qq{</div>\n};
# ── Common fields ─────────────────────────────────────────
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Storage Path</h2>\n};
_field($conf, 'REMOTE_BASE', 'Remote Base Dir', 'Default: /backups');
print qq{</div>\n</div>\n};
# Transfer
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Transfer Settings</h2>\n};
_field($conf, 'BWLIMIT', 'Bandwidth Limit', 'KB/s, 0 = unlimited');
print qq{<div id="rsync-opts-field"$ssh_hidden>\n};
@@ -627,7 +627,7 @@ sub render_remote_form {
print qq{</div>\n</div>\n};
# Retention
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Retention</h2>\n};
_field($conf, 'RETENTION_COUNT', 'Snapshots to Keep', 'Default: 30');
print qq{</div>\n</div>\n};

View File

@@ -128,7 +128,7 @@ sub handle_step1 {
print qq{<form method="GET" action="restore.cgi">\n};
print qq{<input type="hidden" name="restore_step" value="2">\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Step 1: Select Source</h2>\n};
# Remote dropdown
@@ -219,7 +219,7 @@ sub handle_step2 {
print qq{<input type="hidden" name="remote" value="$esc_remote">\n};
print qq{<input type="hidden" name="account" value="$esc_account">\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Step 2: Choose Restore Options</h2>\n};
print qq{<p class="text-sm mb-3">Account: <strong>$esc_account</strong> on remote <strong>$esc_remote</strong></p>\n};
@@ -275,7 +275,7 @@ sub handle_step2 {
# Sub-field cards per type
print qq{<div id="field-path" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">Files</h3>\n};
print qq{ <div class="flex items-center gap-3">\n};
@@ -291,7 +291,7 @@ sub handle_step2 {
print qq{</div>\n};
print qq{<div id="field-dbname" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">Databases</h3>\n};
print qq{ <input type="hidden" id="dbnames" name="dbnames">\n};
@@ -303,7 +303,7 @@ sub handle_step2 {
print qq{</div>\n};
print qq{<div id="field-email" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">Mailboxes</h3>\n};
print qq{ <input type="hidden" id="emails" name="emails">\n};
@@ -315,7 +315,7 @@ sub handle_step2 {
print qq{</div>\n};
print qq{<div id="field-dbusers" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">Database Users</h3>\n};
print qq{ <input type="hidden" id="dbuser_names" name="dbuser_names">\n};
@@ -327,7 +327,7 @@ sub handle_step2 {
print qq{</div>\n};
print qq{<div id="field-cron" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">Cron Jobs</h3>\n};
print qq{ <div id="cron-list" class="max-h-48 overflow-y-auto">\n};
@@ -338,7 +338,7 @@ sub handle_step2 {
print qq{</div>\n};
print qq{<div id="field-domains" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">Domains</h3>\n};
print qq{ <input type="hidden" id="domain_names" name="domain_names">\n};
@@ -350,7 +350,7 @@ sub handle_step2 {
print qq{</div>\n};
print qq{<div id="field-ssl" hidden>\n};
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-3">\n};
print qq{<div class="card-body py-3 px-4">\n};
print qq{ <h3 class="card-title text-sm">SSL Certificates</h3>\n};
print qq{ <input type="hidden" id="ssl_names" name="ssl_names">\n};
@@ -793,7 +793,7 @@ sub handle_step3 {
my $types_display = join(', ', map { GnizaWHM::UI::esc($TYPE_LABELS{$_} // $_) } @selected_types);
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Step 3: Confirm Restore</h2>\n};
print qq{<div class="overflow-x-auto rounded-box border border-base-content/5 bg-base-100"><table class="table">\n};
print qq{<tr><td class="font-medium w-44">Remote</td><td>$esc_remote</td></tr>\n};
@@ -1002,7 +1002,7 @@ sub handle_step4 {
? '<span class="badge badge-success badge-sm">OK</span>'
: '<span class="badge badge-error badge-sm">Failed</span>';
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-4">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-4">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">$esc_label $badge</h2>\n};
my $output = $r->{stdout} . ($r->{stderr} =~ /\S/ ? "\n$r->{stderr}" : '');
$output = '(no output)' unless $output =~ /\S/;

View File

@@ -42,7 +42,7 @@ sub handle_list {
my @schedules = GnizaWHM::UI::list_schedules();
my $cron_schedules = GnizaWHM::Cron::get_current_schedules();
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Configured Schedules</h2>\n};
if (@schedules) {
@@ -483,7 +483,7 @@ sub render_schedule_form {
}
# Schedule name
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Schedule Identity</h2>\n};
print qq{<div class="flex items-center gap-3 mb-2.5">\n};
print qq{ <label class="w-44 font-medium text-sm" for="schedule_name">Schedule Name</label>\n};
@@ -497,7 +497,7 @@ sub render_schedule_form {
print qq{</div>\n</div>\n};
# Schedule settings
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Schedule Settings</h2>\n};
my $sched = $conf->{SCHEDULE} // '';
@@ -524,7 +524,7 @@ sub render_schedule_form {
print qq{</div>\n</div>\n};
# Target remotes
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Target Remotes</h2>\n};
print qq{<p class="text-xs text-base-content/60 mb-3">Select which remotes this schedule targets. Leave all unchecked to target all remotes.</p>\n};

View File

@@ -156,13 +156,13 @@ print qq{<form method="POST" action="settings.cgi">\n};
print GnizaWHM::UI::csrf_hidden_field();
# Section: Local Settings
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Local Settings</h2>\n};
field_text('TEMP_DIR', 'Working Directory', 'Default: /usr/local/gniza/workdir');
print qq{</div>\n</div>\n};
# Section: Account Filtering
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Account Filtering</h2>\n};
my $inc_val = GnizaWHM::UI::esc($conf->{INCLUDE_ACCOUNTS} // '');
my $exc_val = GnizaWHM::UI::esc($conf->{EXCLUDE_ACCOUNTS} // '');
@@ -184,7 +184,7 @@ if (@accounts) {
print qq{</div>\n</div>\n};
# Section: Logging
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Logging</h2>\n};
field_text('LOG_DIR', 'Log Directory', 'Default: /var/log/gniza');
field_select('LOG_LEVEL', 'Log Level', ['debug', 'info', 'warn', 'error']);
@@ -192,14 +192,14 @@ field_text('LOG_RETAIN', 'Log Retention (days)', 'Default: 90');
print qq{</div>\n</div>\n};
# Section: Notifications
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Notifications</h2>\n};
field_text('NOTIFY_EMAIL', 'Email Address(es)', 'Comma-separated, empty = disabled');
field_select('NOTIFY_ON', 'Notify On', ['always', 'failure', 'never']);
print qq{</div>\n</div>\n};
# Section: SMTP Settings
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">SMTP Settings</h2>\n};
print qq{<p class="text-xs text-base-content/60 mb-3">Optional. When SMTP Host is empty, system mail/sendmail is used.</p>\n};
field_text('SMTP_HOST', 'SMTP Host', 'e.g. smtp.gmail.com');
@@ -223,7 +223,7 @@ print qq{<div id="gniza-smtp-alert" class="mt-3"></div>\n};
print qq{</div>\n</div>\n};
# Section: Advanced
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Advanced</h2>\n};
field_text('LOCK_FILE', 'Lock File', 'Default: /var/run/gniza.lock');
field_text('SSH_TIMEOUT', 'SSH Timeout (seconds)', 'Default: 30');

View File

@@ -25,7 +25,7 @@ sub handle_step1 {
my $keys = GnizaWHM::UI::detect_ssh_keys();
print qq{<div class="card bg-base-100 shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<div class="card bg-white shadow-sm border border-base-300 mb-6">\n<div class="card-body">\n};
print qq{<h2 class="card-title text-sm">Step 1: SSH Key</h2>\n};
print qq{<p>gniza uses SSH keys to connect to remote backup destinations. Select an existing key or create one first.</p>\n};