Commit Graph

41 Commits

Author SHA1 Message Date
lucaronin
67b8d1830c design: properties-inspector wireframes
Two frames showing the visual distinction between editable properties
and read-only Info section:
- Frame 1: Full inspector with editable properties (hover states,
  cursor pointer) and Info section (muted, non-interactive)
- Frame 2: Side-by-side comparison of editable vs read-only styling

Product decisions:
- Separate "Info" section for derived metadata (Modified, Created,
  Words, Size)
- Info uses --text-muted color, no hover/click states
- Editable properties keep interactive styling (hover bg, pointer)
- Type row stays at top of Properties section as identity element

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:15:50 +01:00
Luca Rossi
5ebcf41d47 feat: auto-build, GitHub Release, and in-app updater (#14)
* ci: auto-release workflow on merge to main

Rewrite .github/workflows/release.yml to trigger on every push to main
instead of manual tag pushes. The workflow now:

- Computes version as 0.YYYYMMDD.GITHUB_RUN_NUMBER
- Builds aarch64-apple-darwin and x86_64-apple-darwin in parallel
- Merges them into a universal binary using lipo
- Creates a universal .dmg and signed updater tarball
- Generates latest.json with per-arch and universal platform entries
- Publishes a GitHub Release with auto-generated release notes
- Updates a GitHub Pages release history site (gh-pages branch)

Product decisions:
- Universal binary approach: copy arm64 .app as base, lipo the main
  executable, keep everything else from arm64 (shared frameworks are
  architecture-independent). This is the standard Tauri pattern.
- Per-arch updater tarballs are also uploaded so the Tauri updater can
  download the correct arch-specific build (smaller download).
- Release notes are auto-generated from git log since last tag.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: github pages with release history

Use peaceiris/actions-gh-pages@v4 to deploy a release history site.
The page fetches releases.json (also deployed) and renders each release
with date, notes, and download links for .dmg files.

This handles the gh-pages branch creation automatically on first run.
The page is available at https://refactoringhq.github.io/laputa-app/

Product decision: used fetch() to load releases.json at runtime instead
of inlining it, which is cleaner and avoids shell escaping issues with
release note content. The releases.json is deployed alongside index.html.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: in-app update notification UI

Replace the old window.confirm updater with a proper React-based
update notification system:

- useUpdater hook now exposes state machine (idle → available →
  downloading → ready) and actions (startDownload, openReleaseNotes,
  dismiss)
- UpdateBanner component renders at the top of the app shell:
  - "Available" state: shows version, Release Notes link, Update Now
    button, dismiss X
  - "Downloading" state: animated spinner, progress bar with percentage
  - "Ready" state: Restart Now button to apply the update
- Silently checks on startup after 3s delay; fails silently on
  network errors or 404
- Release Notes link opens the GitHub Pages release history site

Product decisions:
- Banner at top of app (not a modal) — non-intrusive, visible but
  not blocking. User can dismiss and continue working.
- Progress bar shows during download so user knows it's working.
- Separate "Restart Now" state after download so user controls when
  the app restarts (they may have unsaved work).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test: updater component tests

Rewrite useUpdater hook tests and add UpdateBanner component tests:

Hook tests (10 cases):
- Starts in idle state
- Does nothing when not in Tauri
- Checks for updates after 3s delay
- Stays idle when no update available
- Transitions to available when update found
- Handles missing release body gracefully
- Stays idle on network error (fails silently)
- Dismiss returns to idle
- openReleaseNotes opens correct URL
- startDownload transitions through downloading to ready

Component tests (10 cases):
- Renders nothing when idle
- Renders nothing on error
- Shows version and buttons when available
- Update Now calls startDownload
- Release Notes calls openReleaseNotes
- Dismiss button works
- Shows progress bar during download
- Shows 0% at start of download
- Shows restart button when ready
- Restart button calls restartApp

All 457 tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* design: auto-build-release wireframes

Copy ui-design.pen as base. Frames to be added for:

1. Update notification banner (visible state) — horizontal bar at
   top of app shell with version text, Release Notes link, Update
   Now button, and dismiss X
2. Update download progress state — spinner icon, progress bar with
   percentage, downloading text
3. "Restart to apply" state — green accent, version text, Restart
   Now button

Note: Pencil editor was not available during this session. The base
design file is committed; frames will be added when the editor is
accessible. The implemented component (UpdateBanner.tsx) serves as
the source of truth for the design.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: update ARCHITECTURE.md with release/update system

Add comprehensive documentation for:
- Release pipeline (4-phase workflow: version → build → release → pages)
- Versioning scheme (0.YYYYMMDD.RUN_NUMBER)
- Universal binary strategy (lipo merge)
- Updater endpoint and latest.json manifest
- In-app update UI state machine
- GitHub Pages release history site

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: rustfmt formatting

* fix: rustfmt build.rs

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 10:50:36 +00:00
lucaronin
b4cd95f0b4 design: collapsible sidebar wireframes
Four frames showing collapse states:
1. All panels visible (default with collapse button)
2. Sidebar collapsed (note list + editor)
3. Editor only (⌥1)
4. Editor + notes (⌥2)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 08:35:31 +01:00
lucaronin
158c5a0089 design: fix improve-sort wireframes — sort dropdown with direction arrows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 08:35:31 +01:00
lucaronin
8b91db3466 design: improve-sort wireframes
Shows sort dropdown with direction arrows (↑/↓) per option,
active state highlighting, and header button reflecting current direction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 08:35:30 +01:00
Luca Rossi
53c881278e Merge pull request #13 from refactoringhq/task/vault-from-github
feat: vault from GitHub — create or clone a vault from a GitHub repo
2026-02-23 08:35:10 +01:00
lucaronin
e1734e67b0 design: fix-note-mutation wireframes
Copied from ui-design.pen as template. Contains existing 4-panel layout
frames showing sidebar, note list, editor, and inspector — the areas
where property sync and wikilink updates are now reflected immediately.

Note: Pencil app not available for interactive editing. Two logical
frames to call out:
1. Property sync: Inspector change → immediate sidebar/notelist update
2. Wikilink sync: rename → open tabs show updated wikilinks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 08:34:14 +01:00
lucaronin
36996366cf design: vault-from-github wireframes
Four frames covering the GitHub vault modal flow:
1. Modal empty state — initial view with Clone/Create tabs
2. Clone repo list — browsing user repos with search
3. Create new repo — name input, visibility toggle, local path
4. Clone in progress — spinner, progress bar, status text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 08:34:14 +01:00
lucaronin
c029b87cdc design: settings panel wireframes
Settings modal with header, 3 API key input fields (Anthropic, OpenAI,
Google AI), masked key display with clear button, and footer with
Cmd+, hint and Save button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 13:31:19 +01:00
lucaronin
ee4faa1874 feat: border between macOS title bar and sidebar content 2026-02-22 12:31:51 +01:00
lucaronin
4d0840c6c6 feat: add border between macOS title bar and sidebar content
The macOS window frame (transparent title bar, 38px) and the sidebar
share the same background color (#F7F6F3), making them visually
indistinguishable. Replace the sidebar's paddingTop: 38 with a
dedicated spacer div that has a bottom border (1px solid var(--border)),
matching the border style used between all other panels. The spacer
also serves as a drag region for window movement.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 12:11:39 +01:00
lucaronin
f64d941b0e feat: rename note by double-clicking its tab — inline edit, updates filename + wiki-links
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 12:10:17 +01:00
lucaronin
08bcab17c0 feat: leaner note creation — immediate Untitled note, no dialog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 11:38:03 +01:00
lucaronin
df3e4a787e feat: git history — clickable commit hashes with diff view 2026-02-22 10:02:35 +01:00
lucaronin
b0657bc3f5 feat: archive notes button + cmd+e shortcut 2026-02-22 10:02:17 +01:00
lucaronin
800e89dd06 design: git-history wireframes
Two frames added to design/git-history.pen:
- "Git History — Commit List": shows inspector panel with clickable
  hashes (primary color, underlined), relative dates, commit messages,
  and author name (muted, small) on each commit row
- "Git History — Diff Open": shows diff view with breadcrumb bar
  displaying file path and commit badge, plus colored diff lines
  (red for removed, green for added)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 22:31:45 +01:00
lucaronin
8c28ea1214 design: leaner note creation before/after wireframes
Two frames added:
- "Note Creation — Before (dialog)" — old flow with CreateNoteDialog
- "Note Creation — After (immediate)" — new flow with instant Untitled note

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 19:17:57 +01:00
lucaronin
caa26b658b design: rename-note-tab wireframes
Three frames showing the tab rename interaction:
1. Normal tab state (double-click hint)
2. Editing mode (inline input with ring border, text selected)
3. Saved state (new title, file renamed, wiki links updated)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 19:08:03 +01:00
lucaronin
4d457b5f6e design: archive notes button wireframes
Add two frames to design/archive-notes-button.pen:
- "Archive Notes — Breadcrumb button (normal note)" — shows Archive icon
- "Archive Notes — Breadcrumb button (archived note, shows Unarchive)" — shows
  ArrowUUpLeft icon with ARCHIVED badge in breadcrumb

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 18:46:45 +01:00
lucaronin
540a2d8123 design: customize-sections-design wireframes
Added before/after frames to design/customize-sections-design.pen showing
the sidebar section header redesign:
- Before: "Customize sections" button with inline icon + text
- After: "SECTIONS" uppercase heading label with settings icon right-aligned

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 18:42:22 +01:00
lucaronin
cc1631c368 feat: draggable section groups in sidebar 2026-02-21 18:36:28 +01:00
lucaronin
66754c2dcd feat: draggable tabs with localStorage persistence 2026-02-21 18:35:13 +01:00
lucaronin
09609eff55 feat: trash notes — sidebar filter, breadcrumb buttons, cmd+del shortcut, demo vault data 2026-02-21 18:34:40 +01:00
lucaronin
580ce5bcc0 design: draggable section groups wireframes
Three frames showing drag interaction flow:
1. Default sidebar with grip-vertical drag handles on section headers
2. Mid-drag state with blue drop indicator line and floating section overlay
3. After-drop state showing reordered sections

Order persisted as "order" property in Type document frontmatter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 17:21:49 +01:00
lucaronin
f8cc097a58 design: draggable tabs wireframes
Three frames added to design/draggable-tabs.pen:
1. Default state — tabs with grab cursor hint
2. Dragging state — tab at 0.5 opacity, 2px primary-color drop indicator
3. After drop — reordered tabs, localStorage persistence note

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 17:21:38 +01:00
lucaronin
4868972093 design: sort-notes wireframes
Two feature frames added:
- "Sort Notes — picker closed": default state with sort button in subsection header
- "Sort Notes — picker open": dropdown popover with sort options (Modified, Created, Title, Status)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 17:08:39 +01:00
lucaronin
1c0e471839 design: sort-notes wireframes
Shows sort control UI for relationship subsection headers:
- Default state: sort icon + current sort label in header bar
- Open state: dropdown popover with options (Modified, Created, Title, Status)
- Selected option highlighted with check icon

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 17:06:30 +01:00
lucaronin
7bee41847f design: trash notes wireframes
Added 4 frames to design/trash-notes.pen:
- Sidebar filter showing Trash with count badge and destructive color
- Note list view with TRASHED badge and 30-day warning state
- Relationship indicator with trash icon prefix for trashed refs
- 30-day auto-delete warning banner

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 16:50:39 +01:00
lucaronin
311c5e434b feat: archive notes — filter sidebar, hide archived, relationship indicators 2026-02-21 16:44:09 +01:00
lucaronin
07e730f172 feat: customize which type sections are shown in sidebar 2026-02-21 16:41:34 +01:00
lucaronin
cc3dff7d47 design: archive notes wireframes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 16:35:59 +01:00
lucaronin
1fa29738e7 design: customize sidebar types wireframes
Three frames showing the feature flow:
1. Button placement — "Customize sections" link above section groups
2. Popover open — toggles for each type section (People & Events OFF)
3. Result — sidebar with hidden sections removed entirely

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 16:35:34 +01:00
lucaronin
356797d410 feat: tag-pill UI for array properties in inspector 2026-02-21 16:29:48 +01:00
lucaronin
df6aa7241f feat: color and icon customization for sidebar type sections 2026-02-21 16:27:43 +01:00
lucaronin
692bc8edc4 feat: move properties icon to toolbar when inspector panel is closed 2026-02-21 13:16:31 +01:00
lucaronin
a7addf127e design: color & icon customization for types wireframes
Four frames added to design/color-icon-for-types.pen:
1. Right-click context menu on sidebar section group headers
2. Icon & color picker popover (color swatches + icon grid)
3. Sidebar with custom icons & colors applied
4. Frontmatter persistence model (icon/color in type YAML)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 13:14:18 +01:00
lucaronin
4d90fb5dc0 design: array property tag-pill wireframes
Three frames showing:
- Before: vertical list of plain text items
- After: horizontal wrapped pills with × remove and + add button
- Pill states: normal, hover (darker bg, red ×), + button, add input active

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:19:47 +01:00
lucaronin
e8e2b7f97a design: move-properties-icon wireframes
Shows before/after states:
- Before: Properties icon in separate 40px collapsed panel sliver
- After: Properties icon moved into BreadcrumbBar toolbar icons

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:18:14 +01:00
lucaronin
df64d45152 design: keyboard navigation wireframes
Two frames showing tab switching shortcuts (Cmd+Opt+Left/Right in Tauri,
Cmd+Shift+Left/Right in browser) and note list navigation (Cmd+Opt+Up/Down
replaces current tab).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 10:44:17 +01:00
lucaronin
3957d524e5 design: allow-create-new-types wireframes
Three wireframe sections:
1. Create Type Dialog — simple modal with name field, triggered by + on Types section
2. Dynamic Sidebar Sections — custom types auto-appear as new sidebar sections
3. Updated Create Note Dialog — type selector includes custom types with blue accent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 09:37:17 +01:00
lucaronin
3a88993c14 design: create-from-sidebar wireframes
Shows sidebar section headers in two states:
- Default: icon + label + chevron
- Hover: icon + label + [+] button + chevron

The + button opens CreateNoteDialog pre-filled with the section type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 23:52:44 +01:00