Commit graph

1164 commits

Author SHA1 Message Date
Adam Brown
08c8b1791f
Replace vendored kzip with no.synth:kmp-zip dependency (#509)
Delete the in-tree de.jonasbroeckmann.kzip ZIP format implementation
(~700 lines across commonMain/jvmMain/iosMain) and the kompress.core
dependency, in favor of the published no.synth:kmp-zip 0.11.3 library
plus its okio adapter.

ZipUtils now wraps zipTo/unzipFrom for directory operations and uses
the synchronous ZipInputStream(ByteArray) constructor for the in-memory
extract path, removing the previous write-temp-file workaround. The
skipHiddenFiles parameter is dropped (production callers already passed
false) and the corresponding tests are removed.

Co-authored-by: Claude <noreply@anthropic.com>
2026-05-27 00:02:25 -07:00
Adam Brown
7f0aa8b1df
Fix timeline A-Z sort and add Z-A parity option
A-Z mode used a plain lexicographic compare, so "Chapter 10" sorted
before "Chapter 2". Switched to a natural-order comparator that
compares digit runs by numeric value, and added a TitleDesc mode so
title sort has the same asc/desc parity as sequence sort.
2026-05-25 12:22:35 -07:00
Adam Brown
2e411cd2b8
Epub:
- File picker now lets you set file name
- Added Table of Contents
- Cleaned up chapter spacing
2026-05-24 11:03:42 -07:00
Adam Brown
3ed57a5986
Style the epub export better 2026-05-24 10:45:58 -07:00
Adam Brown
b2871c188c
Fix iOS external file module 2026-05-24 10:30:49 -07:00
Adam Brown
88ffe142d5
Add epub export format
Also refactor the export system, much cleaner now
2026-05-24 10:22:05 -07:00
Adam Brown
ef86535b64
Route loadSceneMetadata through StrRes to fix headless CI
The static getString() call in loadSceneMetadata reaches
Toolkit.getScreenResolution() on Compose Desktop, which throws
HeadlessException on Linux CI and broke 8/9 integration tests.
RoundTripTestBase already stubbed StrRes for this exact reason;
this call was the one that bypassed it.
2026-05-24 01:27:06 -07:00
Adam Brown
dbd0b4d013
Added the ability to publish to a single store
We've run into many problems where everything publishes fine, except 1 store. This provides a way to unblock that one store without pushing to the rest.
2026-05-24 00:51:40 -07:00
Wavesonics
2ef911c1b4 Fix iOS crash from stale projectsDirectory across sandbox UUID changes
iOS sandbox container UUIDs can change between installs, dangling the
absolute projectsDirectory persisted by a prior install. Decorate the
iOS GlobalSettingsDatasource to re-anchor the post-/Documents/ suffix
under the live Documents dir on load and persist the correction.
2026-05-20 22:18:23 -07:00
Wavesonics
9a1b3a6c57 Merge branch 'claude/sharp-lalande-0c7fef' into develop
# Conflicts:
#	composeUi/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/notes/CreateNoteUi.kt
2026-05-20 22:11:58 -07:00
Wavesonics
191b9020cd Extract hard-coded CreateNoteUi labels to strings resource
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 22:08:21 -07:00
Wavesonics
bc035abea6 Move component funcs to default
iOS was hanging b/c they were running on main there
2026-05-20 22:01:54 -07:00
Wavesonics
a3b077824a Add iOS support via Compose Multiplatform
iOS now runs the same shared Compose UI as Android and Desktop. The
existing Decompose component graph (IosRoot, ProjectSelection,
ProjectRoot) is reused; the Swift app shrinks to an AppDelegate, a
Koin bootstrap, and a UIViewControllerRepresentable that hands off to
a Kotlin ComposeUIViewController. The SwiftUI starter under
/ios/ios/ui and /ios/ios/DecomposeHelpers is deleted.

Hammer.framework moves from :common to :composeUi so the framework
ships the Compose entry point; Xcode's Run Script invokes
:composeUi:embedAndSignAppleFrameworkForXcode. iosArm64 and
iosSimulatorArm64 targets are declared with libbacktrace source-info
so K/N crashes report file:line. 17 expects across composeUi get iOS
actuals (file pickers via filekit, image loading via Coil3,
LanguageUtil via NSLocale.preferredLanguages, etc).

The adaptive nav scaffolds — bottom bar at compact width, side nav
rail otherwise — are extracted from the Android activities into
shared ProjectSelectScaffold and ProjectRootScaffold in
composeUi/commonMain, along with their Modifier helpers and the
close-confirm dialogs. Android activities are now thin shells that
delegate to these; iOS calls the same scaffolds, so phone/tablet
layout is unified across all three platforms.

App icon and CFBundleDisplayName set so the home screen reads
"Hammer" with the brand logo instead of the blueprint placeholder.
2026-05-20 00:36:29 -07:00
Adam Brown
42f230694f
Add launch-time update notification with release-notes dialog
Lifts version check into VersionCheckRepository + GithubVersionCheckDataSource.
On launch, shows an update dialog when a newer release is available and the
tag hasn't been dismissed (tracked in GlobalSettings). Falls back to the
annotated tag message when the release body is empty. AboutApp's VersionCard
gains a button to open the same dialog on demand.
2026-05-19 23:29:39 -07:00
Wavesonics
cd70b28d26 Merge branch 'macos-release' into develop 2026-05-19 20:50:21 -07:00
Wavesonics
5c4da8909c Add Mac App Store packaging for the desktop module
Pass -PmacOsAppStoreRelease=true -PbuildNumber=N to produce a sandboxed,
signed .pkg ready for TestFlight upload via Transporter / iTMSTransporter.
Apple Silicon only for v1; JBR runtime stays.

- Sandbox-friendly entitlements (network.client + user-selected files
  for the app; JIT/unsigned-mem/disable-library-validation for the JVM).
- JNA libjnidispatch.jnilib is pre-extracted into desktop/resources/macos/
  and located via -Djna.boot.library.path so JNA never tries to extract
  to a temp dir at runtime (which would hang silently in the sandbox).
- com.apple.application-identifier / team-identifier baked into the app
  signature so it matches the embedded provisioning profile.
- UrlLauncher drops the Runtime.exec("open") fallback in favor of the
  Desktop API only.
- Projects-directory picker is hidden in App Store builds; the sandbox
  container's ~/Documents is the only writable location for v1.
- unquarantineMacApp Gradle task strips com.apple.quarantine xattrs
  before pkg packaging to avoid App Store validation errors.
- New helper: desktop/scripts/build-appstore.sh — pre-flight checks,
  one-shot build, codesign + pkgutil signature verification.

Signing assets and API key live in desktop/{embedded,runtime}.provisionprofile
and desktop/secrets/ (both gitignored).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:46:07 -07:00
Adam Brown
f3b6703d4b
More survivable handling of IO failures in scene cleanup 2026-05-19 00:10:46 -07:00
Adam Brown
7ccba47b60
Fix NodeNotFound crash in scene metadata panel after scene removal 2026-05-19 00:10:46 -07:00
Wavesonics
7664c1fe8d Upgrade to Gradle and AGP 9 2026-05-18 18:48:39 -07:00
Adam Brown
25c9e71efd
Fix project stats word counts and chapter count (#499)
countWordsInScene counted whitespace separators instead of words, undercounting every non-empty scene by 1. wordsByChapter was keyed by chapter name, so chapters with duplicate names collapsed into a single entry, under-reporting the total chapter count.

Schema bumped to v6 to invalidate stale caches.
2026-05-17 23:15:37 -07:00
Adam Brown
1f4b83ca6f
Added timestamps to metadata panel 2026-05-17 23:04:08 -07:00
Adam Brown
bbfc27efa2
Track last-edited scene per project and surface in stats
Adds `created` and `lastEdited` timestamps to SceneMetadata, stamped
on every autosave tick in SceneEditorRepository.recordSceneActivity.
StatisticsService rolls them up into a new "Last Edited" tile on the
project home dashboard, and the Android widget reads the same field
from the stats cache.

The timestamps ride the sync wire on ApiProjectEntity.SceneEntity and
participate in EntityHasher.hashScene. On download, local values are
preserved when the server didn't ship them. No conflict resolution —
last write wins.

EntityHasher hash functions had their defaults removed so call sites
can't silently miss a newly added field; this caught a latent bug in
the second markForSynchronization hash call that was relying on
defaults for archived/confirmedReferences/dismissedReferences.
2026-05-17 22:57:10 -07:00
Adam Brown
cdf19400c9
Fix scene id padding on unarchiveScene 2026-05-17 19:27:44 -07:00
Adam Brown
c014d9aaac
Fix initial stack configuration 2026-05-17 16:59:26 -07:00
Adam Brown
79d2b33cca
Encode scene/group names in v2 filename format
getSceneFileName still built `order-{rawName}-{id}` with the raw name,
so newly-allowed chars like `\` `/` `?` `*` `:` either split the path
(Windows treated `\` as a separator) or were rejected by the OS,
crashing scene creation. Switch it to the v2 `~`-delimited format with
encodeForFilename, matching SceneDatasource.buildSceneFileName.
2026-05-17 16:48:12 -07:00
Adam Brown
3f9c497657
Add recent-projects launcher menus for Linux (D-Bus quicklist) and macOS (Dock menu), reaching parity with the Windows jump list. All three platforms are now unified behind a QuickShortcuts interface so callers don't care which OS they're on. Pulled the shared "top N projects by lastAccessed" pipeline up onto ProjectsRepository.getRecentProjects() (used by the desktop and Android shortcut managers), and replaced scattered os.name string-matching with a typed HostOs enum. 2026-05-17 14:40:56 -07:00
Adam Brown
eccda2d340
Better settings abbreviation in navigation strings 2026-05-17 13:47:30 -07:00
Adam Brown
6762eb61e6
Add deep linking to Desktop!
You can now deep link to any project and even entity inside that project.
Added jumplist support for windows to deep link directly to a project
2026-05-17 13:35:40 -07:00
Adam Brown
146d7ec102
Extract more hardcoded strings 2026-05-17 12:09:44 -07:00
Adam Brown
26c6a484a3
Add a setting to control the initial project screen 2026-05-17 11:44:04 -07:00
Adam Brown
f01f6f97e0
Redundant experimental 2026-05-17 11:00:46 -07:00
Adam Brown
3ad728c19a
Reject duplicate scene IDs at tree-load time (#492)
Two scene files sharing one id crashed cleanupSceneOrder during
project open. validateScenePaths runs as part of loadSceneTree —
first file seen wins, later duplicates are refused and logged.
2026-05-17 01:10:09 -07:00
Adam Brown
2701c77523
New Crowdin updates (#475)
* New translations messages_en.properties (German)

* New translations strings_about_app.xml (German)

* New translations strings_account_settings.xml (German)

* New translations strings_drafts.xml (German)

* New translations strings_encyclopedia.xml (German)

* New translations strings_notes.xml (German)

* New translations strings_project_home.xml (German)

* New translations strings_projects_list.xml (German)

* New translations strings_timeline.xml (German)

* New translations strings.xml (German)

* New translations messages_en.properties (German)

* New translations strings_about_app.xml (French)

* New translations strings_about_app.xml (Spanish)

* New translations strings_about_app.xml (German)

* New translations strings_about_app.xml (Italian)

* New translations strings_about_app.xml (Ukrainian)

* New translations strings_about_app.xml (Chinese Simplified)

* New translations strings_about_app.xml (Portuguese, Brazilian)

* New translations strings_drafts.xml (German)

* New translations messages_en.properties (German)

* New translations strings_about_app.xml (French)

* New translations strings_about_app.xml (Spanish)

* New translations strings_about_app.xml (German)

* New translations strings_about_app.xml (Italian)

* New translations strings_about_app.xml (Ukrainian)

* New translations strings_about_app.xml (Chinese Simplified)

* New translations strings_about_app.xml (Portuguese, Brazilian)

* New translations strings_globalsearch.xml (French)

* New translations strings_globalsearch.xml (Spanish)

* New translations strings_globalsearch.xml (German)

* New translations strings_globalsearch.xml (Italian)

* New translations strings_globalsearch.xml (Ukrainian)

* New translations strings_globalsearch.xml (Chinese Simplified)

* New translations strings_globalsearch.xml (Portuguese, Brazilian)

* New translations strings_globalsearch.xml (French)

* New translations strings_globalsearch.xml (Spanish)

* New translations strings_globalsearch.xml (German)

* New translations strings_globalsearch.xml (Italian)

* New translations strings_globalsearch.xml (Ukrainian)

* New translations strings_globalsearch.xml (Chinese Simplified)

* New translations strings_globalsearch.xml (Portuguese, Brazilian)

* New translations strings_project_home.xml (French)

* New translations strings_project_home.xml (Spanish)

* New translations strings_project_home.xml (German)

* New translations strings_project_home.xml (Italian)

* New translations strings_project_home.xml (Ukrainian)

* New translations strings_project_home.xml (Chinese Simplified)

* New translations strings_project_home.xml (Portuguese, Brazilian)

* New translations strings_project_home.xml (French)

* New translations strings_project_home.xml (Spanish)

* New translations strings_project_home.xml (German)

* New translations strings_project_home.xml (Italian)

* New translations strings_project_home.xml (Ukrainian)

* New translations strings_project_home.xml (Chinese Simplified)

* New translations strings_project_home.xml (Portuguese, Brazilian)

* New translations strings_encyclopedia.xml (French)

* New translations strings_scene_editor.xml (French)

* New translations strings_sync.xml (French)

* New translations strings_encyclopedia.xml (Spanish)

* New translations strings_scene_editor.xml (Spanish)

* New translations strings_sync.xml (Spanish)

* New translations strings_encyclopedia.xml (German)

* New translations strings_scene_editor.xml (German)

* New translations strings_sync.xml (German)

* New translations strings_encyclopedia.xml (Italian)

* New translations strings_scene_editor.xml (Italian)

* New translations strings_sync.xml (Italian)

* New translations strings_encyclopedia.xml (Ukrainian)

* New translations strings_scene_editor.xml (Ukrainian)

* New translations strings_sync.xml (Ukrainian)

* New translations strings_encyclopedia.xml (Chinese Simplified)

* New translations strings_scene_editor.xml (Chinese Simplified)

* New translations strings_sync.xml (Chinese Simplified)

* New translations strings_encyclopedia.xml (Portuguese, Brazilian)

* New translations strings_scene_editor.xml (Portuguese, Brazilian)

* New translations strings_sync.xml (Portuguese, Brazilian)

* New translations strings_project_home.xml (French)

[ci skip]

* New translations strings_project_home.xml (Spanish)

[ci skip]

* New translations strings_project_home.xml (German)

[ci skip]

* New translations strings_project_home.xml (Italian)

[ci skip]

* New translations strings_project_home.xml (Ukrainian)

[ci skip]

* New translations strings_project_home.xml (Chinese Simplified)

[ci skip]

* New translations strings_project_home.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_sync.xml (French)

[ci skip]

* New translations strings_sync.xml (Spanish)

[ci skip]

* New translations strings_sync.xml (German)

[ci skip]

* New translations strings_sync.xml (Italian)

[ci skip]

* New translations strings_sync.xml (Ukrainian)

[ci skip]

* New translations strings_sync.xml (Chinese Simplified)

[ci skip]

* New translations strings_sync.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_encyclopedia.xml (French)

[ci skip]

* New translations strings_scene_editor.xml (French)

[ci skip]

* New translations strings_encyclopedia.xml (Spanish)

[ci skip]

* New translations strings_scene_editor.xml (Spanish)

[ci skip]

* New translations strings_encyclopedia.xml (German)

[ci skip]

* New translations strings_scene_editor.xml (German)

[ci skip]

* New translations strings_encyclopedia.xml (Italian)

[ci skip]

* New translations strings_scene_editor.xml (Italian)

[ci skip]

* New translations strings_encyclopedia.xml (Ukrainian)

[ci skip]

* New translations strings_scene_editor.xml (Ukrainian)

[ci skip]

* New translations strings_encyclopedia.xml (Chinese Simplified)

[ci skip]

* New translations strings_scene_editor.xml (Chinese Simplified)

[ci skip]

* New translations strings_encyclopedia.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_scene_editor.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_notes.xml (French)

[ci skip]

* New translations strings_project_navigation.xml (French)

[ci skip]

* New translations strings_scene_list.xml (French)

[ci skip]

* New translations strings_notes.xml (Spanish)

[ci skip]

* New translations strings_project_navigation.xml (Spanish)

[ci skip]

* New translations strings_scene_list.xml (Spanish)

[ci skip]

* New translations strings_notes.xml (German)

[ci skip]

* New translations strings_project_navigation.xml (German)

[ci skip]

* New translations strings_scene_list.xml (German)

[ci skip]

* New translations strings_notes.xml (Italian)

[ci skip]

* New translations strings_project_navigation.xml (Italian)

[ci skip]

* New translations strings_scene_list.xml (Italian)

[ci skip]

* New translations strings_notes.xml (Ukrainian)

[ci skip]

* New translations strings_project_navigation.xml (Ukrainian)

[ci skip]

* New translations strings_scene_list.xml (Ukrainian)

[ci skip]

* New translations strings_notes.xml (Chinese Simplified)

[ci skip]

* New translations strings_project_navigation.xml (Chinese Simplified)

[ci skip]

* New translations strings_scene_list.xml (Chinese Simplified)

[ci skip]

* New translations strings_notes.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_project_navigation.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_scene_list.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_globalsearch.xml (French)

[ci skip]

* New translations strings_globalsearch.xml (Spanish)

[ci skip]

* New translations strings_globalsearch.xml (German)

[ci skip]

* New translations strings_globalsearch.xml (Italian)

[ci skip]

* New translations strings_globalsearch.xml (Ukrainian)

[ci skip]

* New translations strings_globalsearch.xml (Chinese Simplified)

[ci skip]

* New translations strings_globalsearch.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_sync.xml (French)

[ci skip]

* New translations strings_sync.xml (Spanish)

[ci skip]

* New translations strings_sync.xml (German)

[ci skip]

* New translations strings_sync.xml (Italian)

[ci skip]

* New translations strings_sync.xml (Ukrainian)

[ci skip]

* New translations strings_sync.xml (Chinese Simplified)

[ci skip]

* New translations strings_sync.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_notes.xml (French)

[ci skip]

* New translations strings_scene_list.xml (French)

[ci skip]

* New translations strings_notes.xml (Spanish)

[ci skip]

* New translations strings_scene_list.xml (Spanish)

[ci skip]

* New translations strings_notes.xml (German)

[ci skip]

* New translations strings_scene_list.xml (German)

[ci skip]

* New translations strings_notes.xml (Italian)

[ci skip]

* New translations strings_scene_list.xml (Italian)

[ci skip]

* New translations strings_notes.xml (Ukrainian)

[ci skip]

* New translations strings_scene_list.xml (Ukrainian)

[ci skip]

* New translations strings_notes.xml (Chinese Simplified)

[ci skip]

* New translations strings_scene_list.xml (Chinese Simplified)

[ci skip]

* New translations strings_notes.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_scene_list.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_account_settings.xml (French)

[ci skip]

* New translations strings_timeline.xml (French)

[ci skip]

* New translations strings_account_settings.xml (Spanish)

[ci skip]

* New translations strings_timeline.xml (Spanish)

[ci skip]

* New translations strings_account_settings.xml (German)

[ci skip]

* New translations strings_timeline.xml (German)

[ci skip]

* New translations strings_account_settings.xml (Italian)

[ci skip]

* New translations strings_timeline.xml (Italian)

[ci skip]

* New translations strings_account_settings.xml (Ukrainian)

[ci skip]

* New translations strings_timeline.xml (Ukrainian)

[ci skip]

* New translations strings_account_settings.xml (Chinese Simplified)

[ci skip]

* New translations strings_timeline.xml (Chinese Simplified)

[ci skip]

* New translations strings_account_settings.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_timeline.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_account_settings.xml (German)

[ci skip]

* New translations strings_account_settings.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_sync.xml (French)

[ci skip]

* New translations strings_sync.xml (Spanish)

[ci skip]

* New translations strings_sync.xml (German)

[ci skip]

* New translations strings_sync.xml (Italian)

[ci skip]

* New translations strings_sync.xml (Ukrainian)

[ci skip]

* New translations strings_sync.xml (Chinese Simplified)

[ci skip]

* New translations strings_sync.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_projects_list.xml (French)

[ci skip]

* New translations strings_projects_list.xml (Spanish)

[ci skip]

* New translations strings_projects_list.xml (German)

[ci skip]

* New translations strings_projects_list.xml (Italian)

[ci skip]

* New translations strings_projects_list.xml (Ukrainian)

[ci skip]

* New translations strings_projects_list.xml (Chinese Simplified)

[ci skip]

* New translations strings_projects_list.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_globalsearch.xml (French)

[ci skip]

* New translations strings_globalsearch.xml (Spanish)

[ci skip]

* New translations strings_globalsearch.xml (German)

[ci skip]

* New translations strings_project_home.xml (French)

[ci skip]

* New translations strings_project_home.xml (Spanish)

[ci skip]

* New translations strings_project_home.xml (German)

[ci skip]

* New translations strings_project_home.xml (Italian)

[ci skip]

* New translations strings_scene_editor.xml (French)

[ci skip]

* New translations strings_scene_editor.xml (Spanish)

[ci skip]

* New translations strings_scene_editor.xml (German)

[ci skip]

* New translations strings_scene_editor.xml (Italian)

[ci skip]

* New translations strings_project_navigation.xml (French)

[ci skip]

* New translations strings_project_navigation.xml (Spanish)

[ci skip]

* New translations strings_project_navigation.xml (German)

[ci skip]

* New translations strings_project_navigation.xml (Italian)

[ci skip]

* New translations strings.xml (French)

[ci skip]

* New translations strings_project_select_navigation.xml (French)

[ci skip]

* New translations strings.xml (French)

[ci skip]

* New translations strings.xml (Spanish)

[ci skip]

* New translations strings_project_select_navigation.xml (Spanish)

[ci skip]

* New translations strings.xml (Spanish)

[ci skip]

* New translations strings.xml (German)

[ci skip]

* New translations strings_project_select_navigation.xml (German)

[ci skip]

* New translations strings.xml (German)

[ci skip]

* New translations strings.xml (Italian)

[ci skip]

* New translations strings_project_select_navigation.xml (Italian)

[ci skip]

* New translations strings.xml (Italian)

[ci skip]

* New translations strings_globalsearch.xml (Italian)

[ci skip]

* New translations strings_globalsearch.xml (Ukrainian)

[ci skip]

* New translations strings_globalsearch.xml (Chinese Simplified)

[ci skip]

* New translations strings_globalsearch.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_project_home.xml (Ukrainian)

[ci skip]

* New translations strings_project_home.xml (Chinese Simplified)

[ci skip]

* New translations strings_project_home.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_scene_editor.xml (Ukrainian)

[ci skip]

* New translations strings_scene_editor.xml (Chinese Simplified)

[ci skip]

* New translations strings_scene_editor.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_project_navigation.xml (Ukrainian)

[ci skip]

* New translations strings_project_navigation.xml (Chinese Simplified)

[ci skip]

* New translations strings_project_navigation.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings.xml (Ukrainian)

[ci skip]

* New translations strings_project_select_navigation.xml (Ukrainian)

[ci skip]

* New translations strings.xml (Ukrainian)

[ci skip]

* New translations strings.xml (Chinese Simplified)

[ci skip]

* New translations strings_project_select_navigation.xml (Chinese Simplified)

[ci skip]

* New translations strings.xml (Chinese Simplified)

[ci skip]

* New translations strings.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings_project_select_navigation.xml (Portuguese, Brazilian)

[ci skip]

* New translations strings.xml (Portuguese, Brazilian)

[ci skip]
2026-05-14 21:28:32 -07:00
Adam Brown
ff7fb7cce3
Fix android build 2026-05-14 21:11:23 -07:00
Adam Brown
7e9a8015f6
Clean up 2026-05-14 21:09:11 -07:00
Adam Brown
96f5db5e6b
Make project stats interactable
Tapping things will now deep link you to places
2026-05-14 21:00:40 -07:00
Wavesonics
5caf045b61 Bundle IBM Plex Mono; clickable scenes in outline overview
- Ships IBM Plex Mono (Regular/Medium/SemiBold, OFL) and routes
    the mono Typography + every explicit FontFamily.Monospace site
    through hammerMonoFontFamily(), so ← ↗ and other Unicode glyphs
    render the same on every platform.
  - Reverts the back-arrow icon shim (a4be47ba); ← renders correctly
    in Plex Mono now.
  - Swaps HdSearchField's ⌕ for Icons.Default.Search (U+2315 isn't
    in Plex Mono).
  - OutlineOverview: clicking a scene title dismisses the modal and
    opens that scene in the editor; trailing ↗ marks the affordance.
2026-05-14 19:47:17 -07:00
Wavesonics
1fc9f2df1d Add accidental discard protection to timeline events 2026-05-14 19:47:17 -07:00
Wavesonics
434e16202c Always show Close Project in project stats overflow menu 2026-05-14 19:47:17 -07:00
Adam Brown
25c9a61790
Correct init order 2026-05-13 23:09:35 -07:00
Adam Brown
244cc78e3c
Drop iosX64 target (removed from Compose Multiplatform 1.11) 2026-05-13 21:58:48 -07:00
Adam Brown
c25b1c6482
Expand allowed filename characters for projects and scenes 2026-05-13 21:58:47 -07:00
Wavesonics
e76be9c8a4 Updating logo and icons 2026-05-13 21:53:57 -07:00
Adam Brown
9468a5e4d5
Set example project word count goal to 30k per week 2026-05-13 20:57:47 -07:00
Adam Brown
23976563b5
Add "Close Project" menu item 2026-05-13 20:06:53 -07:00
Adam Brown
50f5dc8543
Address Codacy quality issues 2026-05-13 19:18:14 -07:00
Adam Brown
76fda3fdd0
Source Themes stats from TagIndexService instead of duplicating aggregation 2026-05-12 23:09:49 -07:00
Adam Brown
07b9299396
Extract BuildTagIndexUseCase from TagIndexService 2026-05-12 23:03:30 -07:00
Adam Brown
ae1fcfee67
Added tags to the project stats screen 2026-05-12 22:54:21 -07:00
Adam Brown
1d39309d53
Add Scenes to the tag system!
This is a ton of work to plumb it all through the sync system
2026-05-12 22:23:34 -07:00