You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add Sparkle auto-updates; move Multi-Verse into themes; UI polish
Auto-updates (Sparkle 2, reusable for future apps):
- SPUStandardUpdaterController wrapper (UpdateController) with launch +
interval checks, opt-out, cadence, beta channel, silent auto-download,
and a "Check for Updates…" menu command; guarded so it only starts once
a real EdDSA key is set (never in the test host).
- Settings ▸ Actualizări tab + in-app Versions picker (install / roll back
to any release through Sparkle, signature-verified).
- Info.plist Sparkle keys (real SUPublicEDKey), sandbox entitlements
(network.client + Sparkle mach-lookup exceptions), Sparkle SPM dep.
- CI: ad-hoc sign + monotonic CFBundleVersion; sign & publish a signed
appcast to GitHub Pages (scripts/publish_appcast.sh + appcast_upsert.py),
guarded on the SPARKLE_PRIVATE_KEY secret so CI stays green until set.
- UPDATES.md runbook (setup, ad-hoc caveat, Developer ID upgrade path).
Multi-Verse options now live in the theme (verse cassette), not globals:
- ContentOptions gains multiVerseLayout / showNumbers / customEnabled /
customText; edited in the Layout Editor on the verse cassette, carried by
theme export/import, and read by every previewer and the live output.
- Custom text supports {verses} {ref} {n} tokens when 2+ verses show.
Right sidebar / settings cleanup:
- Removed the dead "Afișează verse numbers/cross-refs/footnotes" toggles
(they bound to keys nothing read); kept the working interlinear toggle.
- Rewired the Settings footnotes toggle to the key BibleView actually uses.
- Preview panel ~10% wider; button labels no longer wrap to two lines.
Library / Bible polish:
- Song source file + web link in the DB and header; clickable info chips;
redesigned song detail header; subtle section headings in list & grid.
- Bible tab title shows the language before the version, e.g. "(RO) EDC100".
Copy file name to clipboardExpand all lines: AGENTS.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -186,6 +186,7 @@ TopPresenter/
186
186
-**Sidebar (v10.2)** = `SidebarItem.contentItems` (bible/songs/media/schedule/customSlides) in the top `List`, + a PINNED bottom group (`utilityItems` = `.history`, `.account` as selectable destinations, plus a **Settings** button via `@Environment(\.openSettings)`). `.history`→`HistoryView`, `.account`→`ProfileView` (local prefs, `@AppStorage` only — no login) route through `ContentAreaView`; both return `EmptyView` in `PreviewPanelView` and the preview column is HIDDEN for them in `MainControlView` (full-width). Any new switch over `SidebarItem` must handle `.history` + `.account`
187
187
-**Single output window**: locate it via `presentationWindows` (plural) and call `dedupePresentationWindows()` (closes extras) at the top of `showPresentationWindow`/`movePresentationWindow`/`positionOnScreen` + after the launch auto-open (guarded by `hasPresentationWindow`); the presentation `WindowGroup` is `.restorationBehavior(.disabled)`. This killed the "two overlapping outputs" (state-restoration + auto-open) bug — don't reintroduce an unguarded `openWindow(.presentation)`
188
188
- **Song verified flag + edit log (v10.2)**: `Song.verified` (Bool, round-trips through GOAT — `songDictV2` writes `"verified"`, `TopPresenterSongImporter` reads it), `Song.modifiedDate` (drives the Recente sort), `Song.editLogJSON`→`editLog: [SongEditEntry]` (coarse change log, INTERNAL — not exported). The song editor snapshots the song to GOAT on open (`ExportService.exportSongToTopPresenterJSON`); **Renunță** reverts via `ImportService.applyResult(_:to:modelContext:)` (the GOAT→Song builder extracted from `createSongFromResult` — clears + rebuilds versions/sections, reused by import too); **Gata** diffs old↔new via `ImportService.summarizeChanges(old:new:)` → appends edit-log entries. `SectionEditorCard` uses `@FocusState` so clicking a section drives the editor preview. Library: verified badge in `songBadges`, "Doar verificate" filter + `verificat`/✓ search token, sort header chips (`SongSortKey` = A-Z/Artist/Carte/Limbă/Recente). Song slide thumbnails have PREVIEW + trash (delete = remove the section behind the slide, `.confirmationDialog`)
189
+
-**Song library browse (v10.3)**: the browser search lives on `LibraryManager.songLibraryQuery` (SHARED — NOT the Quick Search `songSearchQuery`), so detail-panel chips can set it. `SongDetailPanel` chips are clickable `searchChip(_:query:)`/`searchText(_:query:)` that set `songLibraryQuery` (find similar by artist/book/language/style/theme). `filtered` is grouped into subtle `Section` headers by the active `SortKey` (`grouped` + `initialLetter` diacritic-folded; Recente = ungrouped) in BOTH list and grid (grid uses `pinnedViews: [.sectionHeaders]`). `Song.sourceFile` (filename, stamped in `parseDirectory` default + `ImportService` single-file paths, set in `applyResult`) + `Song.webURL` (best-effort URL dug out of `_extensions`) show above the slides; the detail header is Title · book · artist(≤~half width) left, history "Prezentat ×" + key/chords + Edit (large) right
189
190
-**Unified z-order for EVERY box** (sections + custom + media interleaved): per-profile `boxOrder` token list ("section:<raw>" / "custom:<uuid>" / "media:<uuid>"), reconciled via `orderedBoxTokens()` (pure — safe in view body; new boxes land on top, media defaults to the back). ALL render paths (output `orderedBoxes`, preview card, editor canvas) iterate this order — never hardcode section/media layering again. Reorder via drag in the Casete list (front-first, `reorderBoxToken(_:above:)`) or the Ordonare context menu on any box (canvas + list)
190
191
- Custom + media boxes are renamable (`name` field, context-menu Redenumește); translation & subtitle rows have a trash button that HIDES them (built-ins are never deleted)
191
192
- Hidden boxes are COMPLETELY invisible everywhere — preview card AND editor canvas pass `showsHiddenBoxes: false`; the only place a hidden box appears is the Casete list (dimmed, eye to re-enable)
Copy file name to clipboardExpand all lines: README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -104,7 +104,7 @@ The design studio behind everything you see on screen:
104
104
105
105
### 🪟 Multi-Window Tabs
106
106
107
-
⌘T opens native tabs — each with its own module, Bible translation, and selection. Tabs are titled by **type + name + reference** (e.g. *Bible - EDC100 - Ioan 3:16*, *Songs — Înaintea Ta venim*), or rename any tab manually. One output, driven by whichever tab presses Show.
107
+
⌘T opens native tabs — each with its own module, Bible translation, and selection. Tabs are titled by **type + (lang) version + reference** (e.g. *Bible - (RO) EDC100 - Ioan 3:16*, *Songs — Înaintea Ta venim*), or rename any tab manually. One output, driven by whichever tab presses Show.
0 commit comments