Skip to content

ui: Object stores, a base component library, and dark-mode fixes#79

Merged
nfebe merged 4 commits into
mainfrom
feat/backup-remote-s3
Jul 9, 2026
Merged

ui: Object stores, a base component library, and dark-mode fixes#79
nfebe merged 4 commits into
mainfrom
feat/backup-remote-s3

Conversation

@nfebe

@nfebe nfebe commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

This pairs with flatrun/agent#168, which adds remote S3 backups, and does three related things on the UI side.

Object stores are now a first-class area. Managing S3 credentials and backup destinations outgrew a settings tab, so Storage moved to the main sidebar (Databases and Object Stores), with an Overview of connected stores and configuration behind a Settings sub-tab whose forms open in dialogs rather than sitting expanded. Each backup shows where it lives, local and any remotes.

The dark-mode fixes are the reason for the new base components. Inputs and dropdowns were rendering white in dark mode because several screens hardcoded light colors. A small set of theme-aware components (button, input, select, textarea, field, card) built on the design tokens makes them correct by construction, and the offending screens (the deployment-detail dropdowns, the DNS screens, the settings inputs, and many status panels) now use tokens. AGENTS.md records the reuse-first rule and a review checklist so this does not recur.

The sidebar was also reordered so the most-used areas sit on top and DNS drops to just above Administration, and every sub-item gained an icon.

nfebe added 4 commits July 7, 2026 18:31
Adds a Storage & Backups settings section to register S3-compatible object
storage credentials (AWS S3, Cloudflare R2, Backblaze B2, MinIO) and configure
remote backup destinations that reference them, with a per-destination
reachability test before saving. Secrets are entered once and never returned.

Each backup now shows where it lives (local and any remote destinations) so a
mirrored or remote-only backup is visible at a glance.
Object storage moves out of Settings into the main sidebar as its own
Storage section (Databases and Object Stores). Object Stores opens on an
Overview of connected stores, with configuration behind a Settings sub-tab,
and credential/destination forms now open in dialogs instead of sitting
expanded and eating space. Settings returns to its own tabs.

The sidebar groups are reordered so the most-used areas sit on top and DNS
drops to just above Administration, and every sub-item now carries an icon.

A small set of theme-aware base components (button, input, select, textarea,
field, card) now backs these screens, so inputs and dropdowns are correct in
dark mode by construction. Alongside that, many screens that hardcoded light
colors (form inputs, the deployment-detail dropdowns, the DNS screens, and
numerous status panels) now use theme tokens and read correctly in both
light and dark.

Adds AGENTS.md documenting the reuse-first component rule, the theming
tokens, and a review checklist so this drift does not recur.
Object stores now show whether FlatRun runs them (Managed) or only connects to
them (External). Adding a store lets you register an external endpoint or tag a
managed one linked to the deployment that runs it, and the overview offers
deploying a local store from a template.
@sourceant

sourceant Bot commented Jul 9, 2026

Copy link
Copy Markdown

Code Review Summary

This PR successfully introduces a standardized component library and moves storage management to a first-class citizen in the UI. It addresses widespread dark-mode inconsistencies by replacing hardcoded colors with a semantic token system.

🚀 Key Improvements

  • Introduction of BaseButton, BaseInput, BaseSelect, etc., in src/components/base/ to enforce UI consistency.
  • Migration of storage/backup configuration to its own dedicated view (ObjectStoresView.vue) and sidebar section.
  • Systematic replacement of hex codes with var(--token) across dozens of CSS blocks for robust dark-mode support.
  • Addition of AGENTS.md to document UI best practices for future contributors.

💡 Minor Suggestions

  • Trimming of secret keys in StorageBackupsSettings.vue.
  • Minor adjustment to the fallback text in credName during loading states.

@sourceant sourceant Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review complete. See the overview comment for a summary.

const canSubmitDest = computed(() => destForm.name.trim() && destForm.bucket.trim() && destForm.credential_id);

function credName(id: string): string {
return creds.value.find((c) => c.id === id)?.name || "missing credential";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When a credential is not found, returning 'missing credential' is good for the UI, but it might be better to handle this fallback more explicitly to prevent potential layout shifts or confusion if the ID exists but the list hasn't loaded yet.

Suggested change
return creds.value.find((c) => c.id === id)?.name || "missing credential";
return creds.value.find((c) => c.id === id)?.name || (loadingCreds.value ? 'Loading...' : 'Unknown credential');

@nfebe nfebe merged commit c39dfce into main Jul 9, 2026
5 checks passed
@nfebe nfebe deleted the feat/backup-remote-s3 branch July 9, 2026 00:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant