Skip to content

Release v1.2.0#210

Merged
careck merged 58 commits into
masterfrom
development
Jun 2, 2026
Merged

Release v1.2.0#210
careck merged 58 commits into
masterfrom
development

Conversation

@careck

@careck careck commented Jun 2, 2026

Copy link
Copy Markdown
Member

Summary

Merge development into master for the v1.2.0 release.

Highlights

Test plan

  • cargo test -p krillnotes-core passes
  • cargo clippy --workspace -- -D warnings clean
  • Desktop app launches and opens a workspace
  • CI passes on all platforms

careck and others added 30 commits May 12, 2026 11:22
Remap Cmd+N from New Workspace to Add Sibling Note — sibling creation
is far more frequent. Cmd+Shift+N remains Add Child Note. New Workspace
stays in the File menu without a shortcut.

Additional UX improvements:
- AddNoteDialog auto-focuses the type dropdown on open
- Adding a sibling pre-selects the reference note's schema type
- Edit mode focuses the first schema field when title is hidden
- Tag input no longer traps Tab/Enter when empty, allowing natural
  keyboard navigation and quick save via Enter
Focus the tree container after initial note selection so keyboard
navigation works immediately without needing a mouse click.
feat: Cmd+N for sibling notes, edit focus improvements
…owners

Workspace metadata changes (author, license, description, etc.) were
written directly to workspace_meta without creating an Operation, so
they never propagated to peers. Non-owners could also edit the form
(only to get an error on save).

- Add UpdateWorkspaceMetadata operation variant with signed op logging
- Apply incoming metadata ops in apply_incoming_operation (owner-gated)
- Include workspace_metadata in WorkspaceSnapshot for initial peer sync
- Gate WorkspacePropertiesDialog as read-only for non-owners with hint
… gate

- cargo fmt on menu.rs after merge with development
- Add UpdateWorkspaceMetadata to rbac gate resolve_scope (workspace-level, no note scope)
Covers device ID migration, Tauri mobile scaffolding, adaptive
layout (phone/tablet/desktop), and phased scope for iOS + Android.
Plan 1a: Device ID migration (replace MAC with persisted UUID)
Plan 1b: Tauri mobile scaffolding + adaptive layout
Remove `mac_address` crate dependency and replace `get_device_id()` with
a persisted UUID seed file (`{data_dir}/device_id`). New API:
- `get_or_create_seed_device_id(data_dir)` — read/create seed file
- `resolve_device_id(conn, data_dir)` — priority chain: workspace_meta →
  operations table → seed file → generate new
- `seed_file_exists(data_dir)` — check for existing seed

Migration gate in `create_workspace` blocks new workspace creation when
existing workspaces exist but no seed file is present, forcing user to
open an existing workspace first to extract and persist the device ID.

All Workspace constructors and `import_workspace` gain a `data_dir`
parameter. All 21 desktop `get_device_id()` call sites replaced with
`get_or_create_seed_device_id(&home_dir())`.

Prerequisite for mobile support — iOS/Android don't expose MAC addresses.
Run `tauri ios init` to generate Xcode project under gen/apple/.
Change bundle identifier from com.2pisoftware to com.twopisoftware
(mobile identifiers cannot start a segment with a digit).
Gate native menu bar, multi-window creation, file-open handlers,
and paste/close commands behind #[cfg(desktop)] so the crate
compiles for aarch64-apple-ios-sim. On mobile, create_workspace_window
returns the existing main window instead of spawning a new one.
- On mobile, store workspace under "main" label (single-window arch)
- Emit workspace-opened event so frontend refreshes after open/create
- Add action buttons to EmptyState for mobile (no native menu)
- Add i18n keys for launcher buttons (all 7 locales)
- Fix Xcode build script PATH for npm/cargo discovery
- Add useLayout hook (phone/tablet/desktop breakpoints)
- WorkspaceView renders full-screen stack nav on phone:
  tree fills screen, tapping a note slides right to detail view,
  back button returns to tree
- Extract shared dialogs to avoid duplication between layouts
- Add mobile.backButton i18n key (all 7 locales)
Set font-size: 16px on inputs/textareas/selects for iOS devices.
Safari auto-zooms any field below 16px.
- TreeNode: long-press (500ms) triggers context menu on touch
- ContextMenu: renders as bottom sheet on phone with larger tap targets
- Phone tree header: add (+) button next to search bar for new root notes
On phone, the InfoPanel header switches from a horizontal row to a
vertical stack — title fills full width, Save/Cancel/Edit buttons
sit below as full-width touch targets.
Add a ☰ menu button to the phone tree header with access to:
- New/Open Workspace
- Workspace Properties, Manage Scripts, Operations Log
- Manage Identities, Settings

Callbacks passed from App.tsx to WorkspaceView via new props.
Add CSS media query that forces all dialog panels (children of
fixed inset-0 overlays) to fit within the phone viewport with
scroll when content overflows.
On phone, operations render as compact cards (target + type + time).
Tapping a card expands it inline to show author, verified-by, and
all operation detail fields. Desktop keeps the existing table + side
panel layout.
Add key={workspace.filename} so React destroys and recreates
the component when a different workspace is opened, ensuring
all hooks re-run and load the new workspace's data.
careck and others added 28 commits June 2, 2026 14:08
Run `tauri android init` to generate Gradle project under gen/android/.
Debug APK builds successfully for aarch64-linux-android.
On mobile, dirs::home_dir() returns a read-only path (Android)
or is unavailable. Use dirs::data_dir() via a OnceLock set before
AppState initialization. Both breadcrumb_dir and default_home_dir
check the mobile override first.
On Android, the dirs crate doesn't resolve data_dir. Fall back to
$HOME env var, then hardcoded app-private files directory.
Add viewport-fit=cover to enable edge-to-edge layout, then pad
the phone layout container with safe-area-inset-top (min 24px
fallback for Android where env() may not report insets).
Android WebView doesn't expose safe area insets via CSS env().
Remove enableEdgeToEdge() so the system handles status bar insets.
On API 35+ edge-to-edge is enforced. Use WindowInsetsCompat to
pad the content view below the status bar and above the nav bar.
- Fix Xcode build phase to use rustup cargo/rustc instead of Homebrew
  (set CARGO/RUSTC env vars explicitly in project.yml)
- Remove viewport-fit=cover to let WKWebView handle safe areas natively,
  fixing cursor offset bug in text inputs
- Prevent iOS auto-zoom via viewport meta tag instead of font-size hack
- Update mobile dialog CSS selector for reliable full-screen on phone
- Add ios-dev.sh convenience script for simulator launches
# Conflicts:
#	krillnotes-desktop/package-lock.json
feat: mobile support — iOS and Android
fix: sync workspace properties via op log + read-only gate
Add Move Up, Move Down, Indent (move into sibling above), and Outdent
(move out of parent) to the long-press context menu on mobile/tablet.
Replaces drag-and-drop which isn't available on touch devices.

Also fixes: Android build identifier (com.2pisoftware → com.twopisoftware),
#[cfg(desktop)] gate on manage_scripts_menu_item, and android-dev.sh
--device/--emulator flags.
Four buttons (Copy Note, Tree Actions, Invite, Share) used regular
quotes instead of backticks, so itemClass wasn't interpolated —
causing inconsistent padding and font sizes.
Add outline-none to suppress the browser's default black border on
the tabIndex={0} tree div. The focus-visible ring still shows on
keyboard navigation.
The tree div is just a keyboard event target — the selected node
already highlights, so a container-level focus ring is redundant
and visually distracting.
feat: mobile note move actions via context menu
The previous com.twopisoftware.krillnotes identifier used a domain
we don't own. Switch to io.opswarm.krillnotes across Tauri config,
iOS project.yml, Android build.gradle.kts, and Rust fallback path.
Instead of failing when no emulator is running, pick the first
available AVD, launch it in the background, and wait for boot
to complete before starting the Tauri build.
feat: mobile polish — identifier, emulator, context menu fixes
Update version in krillnotes-core, krillnotes-desktop, and
tauri.conf.json. Move Unreleased changelog entries to [1.2.0] section
and add missing compare links for 1.0.1–1.1.1.
@careck careck merged commit 6d96162 into master Jun 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant