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
Copy file name to clipboardExpand all lines: CHANGELOG.md
+48-1Lines changed: 48 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,9 +8,56 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
8
8
9
9
## [Unreleased]
10
10
11
+
## [0.10.0] - 2026-05-25
12
+
13
+
Major UI modernization. Old top-toolbar layout replaced with a sidebar shell + right-side drawers. The 5 legacy views (`*view.go`) have been removed and rebuilt as drawers and modals composed from a shared component library.
14
+
15
+
### Added
16
+
17
+
-**Sidebar shell** — left-aligned 200px sidebar with PROFILES section (active profile highlighted, inline `+` composer and inline rename), FILTERS section (`All / String / Path / URL / Secret` with live counts and Lucide icons), and Settings/About footer links.
18
+
-**Right-side drawer overlay** — replaces the previous full-pane navigation for Edit/New/Import/Export. Esc and scrim-tap both close. Drawer content swaps without re-mounting the shell.
19
+
-**Design token packages** — `app/internal/ui/tokens/` defines colors, spacing, and radii as the single source of truth. The theme proxies to tokens.
20
+
-**OS-native font loader** — Segoe UI on Windows (`segoeui.ttf` + `segoeuib.ttf`), SF Pro on macOS, with safe fallback to Fyne's default when files are missing. Path uses `%SystemRoot%` for portability.
21
+
-**Lucide icon set** — 28 outlined SVGs vendored via `tools/icons` fetcher tool and embedded via `//go:embed`. Replaces all `theme.*Icon()` callsites in the new UI surfaces.
22
+
-**Reusable component primitives** (`app/internal/ui/components/`): `Sidebar`+`SidebarItem`, `CardRow`, `Drawer`, `IconButton` (with hover-tint and tooltip), `InlineStateButton` (idle→busy→done/error state machine), `Modal`+`ShowDeleteConfirm`, `FieldRow` with inline error caption.
23
+
-**No-toast feedback contract** — `InlineStateButton` morphs on save/import/export; `CardRow.Flash()` tints rows on save/import/duplicate/copy; `CardRow.ConfirmCopy()` swaps copy icon to a check for 1s. Replaces transient toast notifications.
24
+
-**Inline validation** — `Entry.Validator` + `FieldRow.SetError` surface variable name and value errors under the field as the user types. Modal `dialog.ShowError` reduced to disk-IO last resort.
25
+
-**Auto-reload via fsnotify** — `vars.json` is watched; external edits refresh the list automatically.
26
+
-**Variable name collision check** — `SaveVariable` refuses to rename or create a variable that would clobber an existing one. Surfaces inline under the Name field via `ErrVariableExists` sentinel.
27
+
-**Auto-scroll to flashed row** — duplicate/save/import scrolls the list to bring the affected row into view (uses real `Position().Y`, not estimated row height).
28
+
-**Inline profile composer** — new-profile and rename happen as inline editable rows in the sidebar. Modal forms remain only for Import-as-Profile.
29
+
-**Sidebar filter icons** — Lucide `type/folder/link/lock` icons next to filter labels.
30
+
-**Code-block styling for variable values** — recessed `Surface1` background distinguishes value from description.
31
+
-**Tooltip layer** — IconButtons embed `ttwidget.ToolTipWidget` for hover tooltips on all actionable icons.
32
+
-**Browse File / Browse Folder split** — path-type variables now offer both file and folder pickers.
-**Quills extracted to its own repository at [shakedex/quills](https://github.com/shakedex/quills).** The `service/` and `quills/` directories, the Quills release workflow, and the combined "HedgeBuddy Suite" installer have been removed. Historical entries below that describe Quills work remain for context, but Quills development continues in the new repo.
37
+
-**Storage directory case-normalized to lowercase `hedgebuddy/`** on Windows and macOS. Existing `HedgeBuddy/` directories migrate automatically on first launch. Aligns Go side with Python side; eliminates case-sensitive filesystem mismatches.
38
+
-**Python check + update check sequenced** — update dialog only fires after the Python check completes or dismisses, eliminating modal stacking.
39
+
-**Export warning** — now mentions both `.env` and JSON formats (both write secrets in plain text).
-**Python/update dialogs** — two-button layout with inline "Don't remind me again" checkbox (was 3-4 stacked buttons).
42
+
-**Install Update** — shows "Launching updater…" inline for 600ms before quit instead of disappearing instantly.
43
+
-**Validator messages** — human language ("URLs must start with http:// or https://"; "can't find this path on this machine").
44
+
-**About modal** — softened disclaimer; less shouty.
45
+
-**Default and active profile** — Rename and Delete options disabled in the ⋯ menu instead of throwing errors after the click.
46
+
47
+
### Removed
48
+
49
+
-**6 legacy view files** — `aboutview.go`, `formview.go`, `importview.go`, `exportview.go`, `profileview.go`, `helpers.go`. Replaced by `aboutmodal.go`, `editdrawer.go`, `importdrawer.go`, `exportdrawer.go`, `profilemodal.go`, `settingsmodal.go`, and the new components package.
50
+
-**Linux branch of Python lib's `_get_base_dir()`** — raises `StorageNotFoundError` on Linux. The Go GUI doesn't ship for Linux, so the silent fallback was creating drift.
51
+
-**Toast notifications and `ShowStatus`** — replaced by the inline feedback contract.
52
+
-**Manual "Refresh" toolbar button** — fsnotify replaces it.
53
+
54
+
### Fixed
55
+
56
+
-**CRITICAL: rename collision data loss** — renaming variable `A` to an existing variable `B`'s name no longer silently overwrites `B`. (Pre-Phase-2 behavior would merge into `B`, losing its value.)
57
+
-**Drop-handler leak across views** — drop handler scoped to drawer lifecycle.
58
+
-**Confirm-delete modal text wrapping** — uses `widget.Label` with `TextWrapWord`.
59
+
-**`container.NewMax`** deprecated calls replaced with `container.NewStack`.
60
+
-**Manual string truncation** replaced with `widget.Label.Truncation = TextTruncateEllipsis`.
0 commit comments