From b6f1f20c0d4771cc1d5c8089f05704367a7ddf4e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Jul 2026 16:26:13 +0000 Subject: [PATCH 1/2] fix(configurator): fit mobile header toolbar, share correct config link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The header's button cluster (Save…Theme toggle) had no shrink/scroll guard, so on narrow viewports the rightmost buttons — including the light/dark toggle — overflowed off-screen with no way to reach them. Made the cluster a shrink-safe, scrollable strip and dropped the Save button's text label below `sm` to reduce the common-case footprint. Also fixed the header's Share button: it copied the raw current page URL instead of building a proper share link, so shared configs never carried the override code. It now uses buildShareUrl() like the Export panel already does, and both share paths use a new getShareBaseUrl() so embedded hosts (e.g. the WP plugin, which persists overrides via REST instead of the URL hash) point the link at their public standalone configurator instead of a logged-in admin URL. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01QTPpAk2ynC74tuUAsVpYNf --- configurator/src/App.svelte | 1 + .../src/components/panels/ExportPanel.svelte | 3 +- .../src/components/shell/StudioHeader.svelte | 44 ++++++++++--------- configurator/src/lib/persistence.ts | 15 +++++++ configurator/src/vite-env.d.ts | 1 + configurator/tests-components/header.test.js | 35 ++++++++++++++- 6 files changed, 77 insertions(+), 22 deletions(-) diff --git a/configurator/src/App.svelte b/configurator/src/App.svelte index 10be2e5c..91dc2997 100644 --- a/configurator/src/App.svelte +++ b/configurator/src/App.svelte @@ -274,6 +274,7 @@
import { Check, Copy, Download, Link } from '@lucide/svelte'; import { generateCSS, buildShareUrl } from '../../lib/codec'; + import { getShareBaseUrl } from '../../lib/persistence'; let { overrides }: { overrides: Record; @@ -23,7 +24,7 @@ async function handleCopyLink() { try { - const url = buildShareUrl(overrides); + const url = buildShareUrl(overrides, getShareBaseUrl()); await navigator.clipboard.writeText(url); copiedLink = true; setTimeout(() => { copiedLink = false; }, 2000); diff --git a/configurator/src/components/shell/StudioHeader.svelte b/configurator/src/components/shell/StudioHeader.svelte index d23ff8c2..daf8e72c 100644 --- a/configurator/src/components/shell/StudioHeader.svelte +++ b/configurator/src/components/shell/StudioHeader.svelte @@ -2,10 +2,13 @@ import { tick } from 'svelte'; import { Undo2, Redo2, Trash2, Share2, FolderOpen, Check, Save, Loader2, AlertTriangle, Sun, Moon } from '@lucide/svelte'; import { themeState, toggleTheme } from '../../lib/theme.svelte'; + import { buildShareUrl } from '../../lib/codec'; + import { getShareBaseUrl } from '../../lib/persistence'; const version = typeof __SLASHED_VERSION__ !== "undefined" ? __SLASHED_VERSION__ : ""; - let { overridesCount, canUndo, canRedo, hasPendingChanges, saveState, onUndo, onRedo, onResetAll, onImport, onExport, onSave }: { + let { overrides, overridesCount, canUndo, canRedo, hasPendingChanges, saveState, onUndo, onRedo, onResetAll, onImport, onExport, onSave }: { + overrides: Record; overridesCount: number; canUndo: boolean; canRedo: boolean; @@ -32,7 +35,8 @@ async function handleShare() { try { - await navigator.clipboard.writeText(window.location.href); + const url = buildShareUrl(overrides, getShareBaseUrl()); + await navigator.clipboard.writeText(url); shareFeedback = true; setTimeout(() => { shareFeedback = false; }, 2000); } catch { @@ -83,13 +87,13 @@
-
+
@@ -118,7 +122,7 @@ onclick={onUndo} disabled={!canUndo} title="Undo (Ctrl+Z)" - class="p-1.5 rounded-lg text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white hover:bg-black/8 dark:hover:bg-white/8 disabled:opacity-25 disabled:pointer-events-none transition-all cursor-pointer" + class="p-1.5 rounded-lg text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white hover:bg-black/8 dark:hover:bg-white/8 disabled:opacity-25 disabled:pointer-events-none transition-all cursor-pointer shrink-0" > @@ -126,17 +130,17 @@ onclick={onRedo} disabled={!canRedo} title="Redo (Ctrl+Shift+Z)" - class="p-1.5 rounded-lg text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white hover:bg-black/8 dark:hover:bg-white/8 disabled:opacity-25 disabled:pointer-events-none transition-all cursor-pointer" + class="p-1.5 rounded-lg text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white hover:bg-black/8 dark:hover:bg-white/8 disabled:opacity-25 disabled:pointer-events-none transition-all cursor-pointer shrink-0" > -
+
@@ -157,19 +161,19 @@ onclick={handleResetAllClick} disabled={overridesCount === 0} title="Reset all overrides" - class="p-1.5 rounded-lg text-rose-600 dark:text-rose-400 hover:text-rose-700 dark:hover:text-rose-300 hover:bg-rose-500/10 disabled:opacity-25 disabled:pointer-events-none transition-all cursor-pointer" + class="p-1.5 rounded-lg text-rose-600 dark:text-rose-400 hover:text-rose-700 dark:hover:text-rose-300 hover:bg-rose-500/10 disabled:opacity-25 disabled:pointer-events-none transition-all cursor-pointer shrink-0" > -
+