Files
Will Miao 92820be4ad feat(first-run): gate the initial library scan behind a welcome page
Fresh installs no longer start a full library scan (with per-file SHA256
and sidecar writes) automatically at startup. Instead a welcome page
lists the configured model roots, estimates the scan cost from a quick
hash-free walk, and lets the user pick the sidecar storage layout and
UI language before confirming. Deferring shows an empty library; the
existing refresh button starts the scan later. Upgrading installs are
detected via a non-empty persisted cache snapshot (row-count check, so
the empty file created by scanner construction no longer masquerades
as an existing library) and keep the old behavior.

Bundled fixes surfaced by the new flow:

- broadcast an init-progress error when the startup scan fails instead
  of silently landing on an empty library; the initialization page now
  shows the error with a retry button
- skip the onboarding language modal/tutorial while the welcome or
  initialization page is up (its spotlight targets don't exist there,
  so the tour was silently auto-completed and never shown)
- promotional banners wait until onboarding is completed or skipped;
  alert banners (startup messages, cache health) are unaffected
- honor the hidden attribute in first-run/initialization CSS so the
  no-roots hint and error boxes don't render as empty frames
2026-10-25 09:02:57 +08:00

69 lines
2.3 KiB
CSS

/* Import Base Styles */
@import 'base.css';
/* Import Layout */
@import 'layout.css';
/* Import Components */
@import 'components/header.css';
@import 'components/banner.css';
@import 'components/card.css';
@import 'components/modal/_base.css';
@import 'components/modal/delete-modal.css';
@import 'components/modal/update-modal.css';
@import 'components/modal/settings-modal.css';
@import 'components/modal/doctor-modal.css';
@import 'components/modal/help-modal.css';
@import 'components/modal/relink-civitai-modal.css';
@import 'components/modal/example-access-modal.css';
@import 'components/modal/support-modal.css';
@import 'components/modal/download-modal.css';
@import 'components/modal/directory-picker-modal.css';
@import 'components/toast.css';
@import 'components/tooltip.css';
@import 'components/loading.css';
@import 'components/menu.css';
@import 'components/lora-modal/lora-modal.css';
@import 'components/lora-modal/description.css';
@import 'components/lora-modal/tag.css';
@import 'components/lora-modal/preset-tags.css';
@import 'components/lora-modal/showcase.css';
@import 'components/lora-modal/triggerwords.css';
@import 'components/lora-modal/versions.css';
@import 'components/shared/edit-metadata.css';
@import 'components/search-filter.css';
@import 'components/bulk.css';
@import 'components/shared.css';
@import 'components/filter-indicator.css';
@import 'components/initialization.css';
@import 'components/first_run.css';
@import 'components/progress-panel.css';
@import 'components/duplicates.css'; /* Add duplicates component */
@import 'components/statistics.css'; /* Add statistics component */
@import 'components/sidebar.css'; /* Add sidebar component */
@import 'components/media-viewer.css';
@import 'components/metadata-refresh-result.css';
@import 'components/download-batch-summary.css';
@import 'components/sidecar-migration-summary.css';
.initialization-notice {
display: flex;
justify-content: center;
align-items: center;
min-height: 200px;
margin: var(--space-3) 0;
padding: var(--space-3);
background: var(--lora-surface);
border: 1px solid var(--lora-border);
border-radius: var(--border-radius-base);
text-align: center;
}
/* Reuse existing loading-spinner styles */
.initialization-notice .loading-spinner {
margin-bottom: var(--space-2);
}
/* ---------- reused from shared styles ---------- */