Files
gitea/web_src/css/install.css
T
petru 471cfdd161
release-nightly / nightly-binary (push) Has been cancelled
release-nightly / nightly-container (push) Has been cancelled
Modified - [install] [backup] [database] [recovery] Consolidated database backup and installer recovery support.
- 1 - Add: Gitea now creates timestamped database backup bundles under `[backup].PATH`, exposes the backup schedule in the installer, and surfaces the `database_backup` cron task in admin monitoring.
- 2 - Add: installed instances now use `.gitea-installed` and `.gitea-recovery.ini` to enter email-gated recovery instead of falling back to public install mode when configuration or database access is broken.
- 3 - Mod: the installer recovery flow now covers backup-bundle restore, bundled or manual `app.ini` reuse, uploaded SQL/GZ database restores, and repository-filesystem recovery with source-specific validation, confirmations, and preserved launcher state.
- 4 - Fix: recovery now restores bundled `app.ini` snapshots when needed, discovers backup bundles from both the active backup path and persisted `.gitea-recovery.ini` path, and preserves SMTP and other rebuilt settings correctly when `app.ini` is missing or incomplete.
- 5 - Fix: recovery validation and restore handling now accept either a selected backup bundle or an uploaded SQL/GZ dump, keep sensitive secrets and existing `LFS_JWT_SECRET` when appropriate, clear SQLite restore targets before import, and complete the post-install handoff without redirect loops.
- 6 - Mod: fresh installs now default recovery email authorization to enabled with first-admin fallback, and the install/recovery UI, styling, and EN/RO wording were refined to match the final launcher behavior.

Co-Authored-By: petru @ codex (GPT-5) <codex@openai.com>
(cherry picked from commit 9879caf2292691b0cb521d12e6fee924b066bae2)
2026-06-01 03:56:03 +03:00

465 lines
12 KiB
CSS

.page-content.install {
padding-bottom: calc(96px + env(safe-area-inset-bottom));
}
.page-content.install .install-config-container {
max-width: 900px;
margin: auto;
}
.page-footer.page-footer-install {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 30;
}
.page-content.install form.ui.form .inline.field > label {
text-align: right;
width: 30%;
padding-right: 10px;
margin-right: 0;
}
.page-content.install .ui.form .field > .help,
.page-content.install .ui.form .field > .ui.checkbox:first-child,
.page-content.install .ui.form .field > .right-content {
margin-left: calc(30% + 5px);
width: auto;
}
summary.right-content.tw-py-2 {
margin-top: 17px;
}
.page-content.install form.ui.form input:not([type="checkbox"],[type="radio"]),
.page-content.install form.ui.form .ui.selection.dropdown {
width: 60%;
}
.page-content.install form.ui.form .inline.field > .js-password-toggle-group {
width: 60%;
}
.page-content.install form.ui.form details.optional.field[open] {
padding-bottom: 10px;
}
/* start edit/add - by petru @ codex */
.page-content.install .install-recovery-entry {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1.5rem;
margin: 0 0 1.5rem;
padding: 1.25rem 1.5rem;
border: 1px solid var(--color-secondary-alpha-40);
border-radius: var(--border-radius-medium);
background: var(--color-box-body);
}
.page-content.install .install-recovery-entry-copy {
text-align: left;
}
.page-content.install .install-recovery-entry-copy .ui.header {
margin-bottom: 0.45rem;
}
.page-content.install .install-recovery-entry-copy p {
margin: 0;
color: var(--color-text-light-2);
}
.page-content.install .install-recovery-entry-actions {
flex: 0 0 auto;
}
.page-content.install .install-recovery-launcher-modal {
max-width: 760px;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-launcher-problem {
margin-bottom: 1rem;
}
.page-content.install .install-recovery-launcher-modal .content {
padding-top: 1.25rem;
}
.page-content.install .install-recovery-launcher-modal .ui.dividing.header {
margin-top: 0;
}
.page-content.install .install-recovery-launcher-modal .ui.raised.segment {
padding: 1rem 1rem 1.1rem;
}
.page-content.install .install-recovery-launcher-modal .ui.small.header {
margin-bottom: 0.85rem;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field {
display: flex !important;
align-items: center;
gap: 0.85rem;
width: 100%;
margin-bottom: 0;
flex-wrap: nowrap;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > label {
flex: 0 0 11rem;
margin: 0;
font-weight: var(--font-weight-semibold);
white-space: nowrap;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row {
display: flex;
align-items: center;
gap: 0.75rem;
flex: 1 1 auto;
width: auto;
min-width: 0;
flex-wrap: nowrap;
}
.install-recovery-inline-control-row > label {
text-align: right;
width: 30%;
padding-right: 12px;
margin-right: 0;
/* vertical-align: -webkit-baseline-middle; */
}
.install-recovery-select {
padding: .78571429em 3.2em .78571429em 1em;
width: 70% !important;
}
.install-recovery-inline-control-row > input {
width: 66% !important;
vertical-align: unset !important;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > input[type="file"],
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > select {
width: 100% !important;
min-width: 0;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > input[type="file"] {
flex: 1 1 auto;
min-width: 0;
padding: 0.35rem;
border: 1px solid var(--color-secondary-alpha-40);
border-radius: 0.85rem;
background: var(--color-box-body);
color: var(--color-text);
}
.install-recovery-inline-control-row > button {
font-size: 14px !important;
min-height: 42px !important;
background: #322226 !important;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > .button {
flex: 0 0 auto;
margin: 0 !important;
white-space: nowrap;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > input[type="file"]::file-selector-button {
margin-right: 0.85rem;
padding: 0.6rem 0.9rem;
border: 1px solid var(--color-secondary-alpha-40);
border-radius: 0.6rem;
background: var(--color-body);
color: var(--color-text);
cursor: pointer;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-control-row > input[type="file"]::-webkit-file-upload-button {
margin-right: 0.85rem;
padding: 0.6rem 0.9rem;
border: 1px solid var(--color-secondary-alpha-40);
border-radius: 0.6rem;
background: var(--color-body);
color: var(--color-text);
cursor: pointer;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-select {
display: block;
appearance: none;
min-height: 2.95rem;
padding: 0.8rem 3rem 0.8rem 1rem;
border: 1px solid var(--color-secondary-alpha-40);
border-radius: 0.85rem;
background-color: var(--color-box-body);
background-image: linear-gradient(45deg, transparent 50%, var(--color-text-light-2) 50%), linear-gradient(135deg, var(--color-text-light-2) 50%, transparent 50%);
background-position: calc(100% - 22px) calc(50% - 3px), calc(100% - 16px) calc(50% - 3px);
background-size: 6px 6px, 6px 6px;
background-repeat: no-repeat;
color: var(--color-text);
box-shadow: inset 0 1px 0 var(--color-secondary-alpha-20);
transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-select:hover {
border-color: var(--color-primary-light-2);
}
.page-content.install .install-recovery-launcher-modal .install-recovery-select:focus {
border-color: var(--color-primary);
box-shadow: 0 0 0 3px var(--color-primary-alpha-20), inset 0 1px 0 var(--color-secondary-alpha-20);
outline: none;
}
.page-content.install .install-recovery-launcher-layout {
display: grid;
gap: 1rem;
}
.page-content.install .install-recovery-launcher-section {
padding: 1rem 1.1rem;
border: 1px solid var(--color-secondary-alpha-40);
border-radius: var(--border-radius-medium);
background: var(--color-box-header);
}
.page-content.install .install-recovery-launcher-section-header {
margin-bottom: 0.85rem;
}
.page-content.install .install-recovery-launcher-section-header h5 {
margin: 0;
font-size: 1rem;
}
.page-content.install .install-recovery-launcher-section .field,
.page-content.install .install-recovery-launcher-section .reinstall-confirm {
width: 100%;
margin: 0;
}
.page-content.install .install-recovery-launcher-section .field + .reinstall-confirm,
.page-content.install .install-recovery-launcher-section .reinstall-confirm + .reinstall-confirm {
margin-top: 0.85rem;
}
.page-content.install .install-recovery-launcher-section label {
display: block;
margin-bottom: 0.4rem;
font-weight: var(--font-weight-semibold);
}
.page-content.install .install-recovery-launcher-section input[type="file"],
.page-content.install .install-recovery-launcher-section select {
width: 100%;
}
.page-content.install .install-recovery-launcher-section .help {
display: block;
margin-top: 0.45rem;
color: var(--color-text-light-2);
line-height: 1.45;
}
.page-content.install .install-recovery-launcher-section .ui.checkbox label {
margin-bottom: 0;
font-weight: var(--font-weight-normal);
}
.page-content.install .install-recovery-launcher-checkboxes {
display: grid;
gap: 0.75rem;
margin-top: 0.9rem;
}
/* end edit/add - by petru @ codex */
.page-content.install form.ui.form details.optional.field[open]:not(:last-child) {
border-bottom: 1px dashed var(--color-secondary);
}
.page-content.install form.ui.form details.optional.field[open] summary {
margin-bottom: 10px;
margin-top: 17px;
}
.page-content.install form.ui.form details.optional.field * {
box-sizing: border-box;
}
.page-content.install form.ui.form .field {
text-align: left;
}
.page-content.install .ui .reinstall-message {
width: 70%;
margin: 20px auto;
color: var(--color-red);
text-align: left;
font-weight: var(--font-weight-semibold);
}
.page-content.install .ui .reinstall-confirm {
width: 70%;
text-align: left;
margin: 10px auto;
}
/* start edit/add - by petru @ codex */
.page-content.install .install-reinstall-confirm-modal .content {
padding-top: 1.25rem;
}
.page-content.install .install-reinstall-confirm-modal .recovery-source-block {
margin-bottom: 1rem;
}
.page-content.install .install-reinstall-confirm-modal .recovery-source-option {
padding: 0.75rem 0;
border-top: 1px solid var(--color-secondary-alpha-40);
}
.page-content.install .install-reinstall-confirm-modal .recovery-source-option:first-of-type {
border-top: 0;
padding-top: 0.25rem;
}
.page-content.install .install-reinstall-confirm-modal .recovery-source-option .help {
display: block;
margin-top: 0.35rem;
margin-left: 1.5rem;
}
.page-content.install .install-reinstall-confirm-modal .js-install-recovery-confirm-panel {
display: none;
}
.page-content.install .install-reinstall-confirm-modal .js-install-recovery-confirm-panel.is-active {
display: block;
}
.ui.negative.message.install-reinstall-alert {
font-size: 19px;
}
.page-content.install .install-reinstall-confirm-modal .install-reinstall-alert {
margin-bottom: 1rem;
text-align: center;
font-weight: var(--font-weight-semibold);
}
.page-content.install .install-reinstall-confirm-modal .reinstall-message,
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm {
width: 100%;
margin-left: 0;
margin-right: 0;
}
.page-content.install .install-reinstall-confirm-modal .reinstall-message {
margin-top: 0;
margin-bottom: 1rem;
color: var(--color-error-text);
font-weight: var(--font-weight-semibold);
}
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm {
padding: 0;
}
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm + .reinstall-confirm {
margin-top: 0.6rem;
}
.page-content.install .install-reinstall-confirm-modal .reinstall-confirm .ui.checkbox label {
display: block;
padding-left: 1.5rem;
line-height: 1.5;
font-weight: var(--font-weight-normal);
}
.page-content.install .install-reinstall-confirm-modal .actions {
display: flex;
justify-content: flex-end;
gap: 0.75rem;
}
/* end edit/add - by petru @ codex */
.install-language-balloon {
position: fixed;
right: 10.5rem;
bottom: calc(56px + env(safe-area-inset-bottom));
z-index: 40;
max-width: 240px;
padding: 0.75rem 0.9rem;
border-radius: 8px;
background: var(--color-green);
color: var(--color-white);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
opacity: 0;
pointer-events: none;
transform: translateY(6px);
transition: opacity 0.15s ease, transform 0.15s ease;
}
.install-language-balloon::after {
content: "";
position: absolute;
right: 2rem;
bottom: -8px;
width: 16px;
height: 16px;
background: var(--color-green);
transform: rotate(45deg);
}
.install-language-balloon.is-visible {
opacity: 1;
transform: translateY(0);
}
.install-language-balloon.is-hidden {
opacity: 0;
transform: translateY(6px);
}
@media (max-width: 880px) {
.page-content.install {
padding-bottom: calc(150px + env(safe-area-inset-bottom));
}
/* start edit/add - by petru @ codex */
.page-content.install .install-recovery-entry {
flex-direction: column;
align-items: stretch;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field {
display: flex !important;
}
.page-content.install .install-recovery-launcher-modal .install-recovery-inline-field > label {
flex: 0 0 11rem;
}
.page-content.install .install-recovery-entry-actions .button {
width: 100%;
}
/* end edit/add - by petru @ codex */
.install-language-balloon {
right: 1rem;
bottom: calc(118px + env(safe-area-inset-bottom));
max-width: min(240px, calc(100vw - 2rem));
}
.install-language-balloon::after {
right: 1.5rem;
}
}