feat(device-sync): manifest, cancel, font picker + sync status fix

- Write psysonic-sync.json to device after sync/deletions; auto-import
  on folder select when localStorage is empty (cross-platform handoff)
- Add cancel button during active sync: AtomicBool flag per job,
  tasks bail after acquiring semaphore, cancelled state in UI
- Fix sync status staying "pending": normalize template path separators
  to OS separator (Windows: '/' → '\') so compute_sync_paths and
  list_device_dir_files produce matching strings for Set comparison
- Add Geist and JetBrains Mono as variable fonts; font picker collapsible
- Fix device mount detection on Windows: removable drive letters (E:\)
  were incorrectly skipped alongside system roots; strip \?\ prefix
  from canonicalized paths before mount-point comparison

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-15 22:59:27 +02:00
parent e23280c013
commit 442ed9d191
16 changed files with 255 additions and 46 deletions
+13
View File
@@ -19,6 +19,9 @@
@import '@fontsource-variable/plus-jakarta-sans';
@import '@fontsource-variable/plus-jakarta-sans/wght-italic.css';
@import '@fontsource-variable/lexend';
@import '@fontsource-variable/geist';
@import '@fontsource-variable/jetbrains-mono';
@import '@fontsource-variable/jetbrains-mono/wght-italic.css';
/* ─── Catppuccin Mocha Variables ─── */
:root,
@@ -6399,6 +6402,16 @@ input[type="range"]:hover::-webkit-slider-thumb {
--font-display: 'Lexend Variable', sans-serif;
}
[data-font='geist'] {
--font-sans: 'Geist Variable', system-ui, sans-serif;
--font-display: 'Geist Variable', sans-serif;
}
[data-font='jetbrains-mono'] {
--font-sans: 'JetBrains Mono Variable', monospace;
--font-display: 'JetBrains Mono Variable', monospace;
}
/* ─── Equalizer bars animation ─── */
.eq-bar {
display: inline-block;