diff --git a/Dockerfile b/Dockerfile
index 1f34c157..311638e8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -50,7 +50,7 @@ COPY templates templates
ARG DATABASE_URL="postgres://postgres:postgres@localhost/oxicloud"
RUN DATABASE_URL="${DATABASE_URL}" cargo build --release
# The SPA is built by the frontend stage; bring it in for the runtime copy below.
-# (build.rs no longer generates static-dist unless OXICLOUD_LEGACY_ASSETS=1.)
+# (build.rs no longer generates static-dist unless OXICLOUD_RUST_ASSETS=1.)
COPY --from=frontend /static-dist ./static-dist
# ─── Stage 4: Minimal runtime image ──────────────────────────────────────────
diff --git a/build.rs b/build.rs
index 1ae891bb..64333458 100644
--- a/build.rs
+++ b/build.rs
@@ -40,15 +40,15 @@ fn main() {
println!("cargo:rerun-if-changed=static");
println!("cargo:rerun-if-changed=build.rs");
- println!("cargo:rerun-if-env-changed=OXICLOUD_LEGACY_ASSETS");
+ println!("cargo:rerun-if-env-changed=OXICLOUD_RUST_ASSETS");
git_status();
- // Post-cutover (Svelte/Vite): the frontend is built by Vite into
- // `static-dist/` and the Rust web layer serves it directly — no `include_str!`
- // HTML, no Rust-side bundling. The legacy pure-Rust asset pipeline below is
- // retained, behind `OXICLOUD_LEGACY_ASSETS=1`, for one-release rollback only.
- if env_or("OXICLOUD_LEGACY_ASSETS", "0") != "1" {
+ // The frontend is built by Vite into `static-dist/` and the Rust web layer
+ // serves it directly — no `include_str!` HTML, no Rust-side bundling. The
+ // pure-Rust asset pipeline below is retained, behind `OXICLOUD_RUST_ASSETS=1`,
+ // for one-release rollback only.
+ if env_or("OXICLOUD_RUST_ASSETS", "0") != "1" {
return;
}
diff --git a/frontend/.prettierignore b/frontend/.prettierignore
index 1ddced4a..45415cfe 100644
--- a/frontend/.prettierignore
+++ b/frontend/.prettierignore
@@ -7,7 +7,9 @@ package-lock.json
src/lib/i18n/locales/
# vendored / generated — kept byte-faithful to their source
src/lib/styles/base/
-src/lib/styles/legacy/
-src/lib/styles/legacy.css
+src/lib/styles/ported/
+src/lib/styles/ported.css
src/lib/icons/registry.ts
static/locales/
+static/vendors/
+static/workers/
diff --git a/frontend/.stylelintignore b/frontend/.stylelintignore
index 7020a179..8c2dc071 100644
--- a/frontend/.stylelintignore
+++ b/frontend/.stylelintignore
@@ -4,5 +4,5 @@ node_modules/
# Ported verbatim from static/css/base — treated as vendored design tokens.
# New component styles (Svelte
diff --git a/frontend/src/lib/components/CommandPalette.svelte b/frontend/src/lib/components/CommandPalette.svelte
new file mode 100644
index 00000000..43958019
--- /dev/null
+++ b/frontend/src/lib/components/CommandPalette.svelte
@@ -0,0 +1,384 @@
+
+
+
{t('cmdk.no_results', 'No matching commands')}
+ {:else} +{c.opts.message}
+ {/if} + + {#if dialogs.error} +{dialogs.error}
+ {/if} + + {#snippet footer()} + + {#if c.kind === 'prompt'} + + {:else} + + {/if} + {/snippet} +{t('common.loading', 'Loading…')}
+ {:else} +{textContent}
+ {/if}
+ {:else}
+ {t('files.no_preview', 'No preview available for this file type.')}
+{t('common.loading', 'Loading…')}
+ {:else if folders.length === 0} +{t('files.no_subfolders', 'No subfolders here.')}
+ {:else} +{error}
+{emptyText ?? t('common.empty', 'Nothing here yet.')}
+ {#if emptyHint}{emptyHint}
{/if} +{error}
- {:else if loading && empty} -{t('common.loading', 'Loading…')}
- {:else if empty} -{emptyText ?? t('common.empty', 'Nothing here yet.')}
- {:else} -+ {t('share.directoryUnavailable', 'User directory unavailable')} +
+ {:else} +{t('share.no_people', 'Not shared with anyone yet.')}
+ {:else} + {#each memberGroups as group (group.role)} +{t('share.none', 'No public links yet.')}
+ {:else} +