chore: rm implementation plan
- commit
- a405b8e8435800c651d3280787fca985ce2d38bf
- author
- brice · · 2026-07-24 04:26 UTC
- parent
- 5d0793d
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +0 -111
D docs/systemviews-wasm-crud-plan.md +0 -111
| @@ -1,111 +0,0 @@ | |||
| 1 | - | # Systemviews WASM CRUD and Architecture Plan | |
| 2 | - | ||
| 3 | - | This note captures the parity target for the `feat/systemviews-wasm` branch after merging `main`. | |
| 4 | - | ||
| 5 | - | ## Current branch baseline | |
| 6 | - | ||
| 7 | - | - Worktree: `.worktrees/feat/systemviews-wasm` | |
| 8 | - | - Branch: `feat/systemviews-wasm` | |
| 9 | - | - Merge baseline: `d84415e5` (`Merge branch 'main' into feat/systemviews-wasm`) | |
| 10 | - | - Vendor baseline: `go mod vendor` has been run in the worktree and `go list -mod=vendor ./...` succeeds there. | |
| 11 | - | - Root-checkout vendoring diagnostics were corrected separately with `go mod vendor`; branch validation should still use `-mod=vendor` after dependency changes. | |
| 12 | - | ||
| 13 | - | ## Clean architecture contract | |
| 14 | - | ||
| 15 | - | Keep the dependency direction explicit: | |
| 16 | - | ||
| 17 | - | | Layer | Role for systemviews | Must not do | | |
| 18 | - | | --- | --- | --- | | |
| 19 | - | | `internal/domain` | Pure entities/value objects and pure helpers such as history range parsing. | Import ports, usecases, adapters, GTK/CEF/WebKit, or config packages. | | |
| 20 | - | | `internal/application/usecase` | Own favorites/history/config/keybinding behavior and validation. | Import infrastructure adapters or UI packages. | | |
| 21 | - | | `internal/application/port` | Define the systemview-facing contracts and DTOs. | Depend on CEF/WebKit/SQLite/config concrete types. | | |
| 22 | - | | `internal/infrastructure/*` | Implement handlers, scheme serving, bridge transports, persistence, config payload readers. | Put UI workflow or business rules here. | | |
| 23 | - | | `internal/ui/systemviews` | Render and orchestrate WASM UI through ports. | Call repositories, config package, CEF/WebKit, or SQLite directly. | | |
| 24 | - | | `internal/ui/dispatcher` / coordinators | Convert native actions into pane/tab/navigation orchestration. | Bypass usecases for domain state changes. | | |
| 25 | - | ||
| 26 | - | Preferred direction for new work: | |
| 27 | - | ||
| 28 | - | 1. Add behavior to existing usecases first when it is business logic. | |
| 29 | - | 2. Expose it through application ports. | |
| 30 | - | 3. Implement WebUI/systemview handlers in `internal/infrastructure/handlers`. | |
| 31 | - | 4. Consume those handlers from `internal/infrastructure/systemviewsbridge`. | |
| 32 | - | 5. Render and bind user interactions in `internal/ui/systemviews`. | |
| 33 | - | ||
| 34 | - | ## Old Svelte UI CRUD matrix | |
| 35 | - | ||
| 36 | - | ### History (`webui/src/pages/homepage/*`) | |
| 37 | - | ||
| 38 | - | | Operation | Old Svelte surface | Backend message/API | Current WASM status | Gap | | |
| 39 | - | | --- | --- | --- | --- | --- | | |
| 40 | - | | Read timeline | `HistoryPanel.svelte`, `HistoryTimeline.svelte`, `HistoryItem.svelte` | `history_timeline` | Present, but bare list only (`internal/ui/systemviews/history_view.go`). | Add pagination, loading/error/empty states, row metadata, favicons, visit counts. | | |
| 41 | - | | Read/search | `HistorySearch.svelte`, `keyboard.ts` local fuzzy + FTS | `history_search_fts` | Bridge client supports it. | Add search UI, debounce/local filtering, FTS fallback, visible result count. | | |
| 42 | - | | Read filters/stats | `HistoryFilters.svelte`, `AnalyticsPanel.svelte` | `history_domain_stats`, `history_analytics` | Bridge client supports both; config route renders keybinding/config summaries only. | Add domain chips, stats summary, analytics cards/charts or text equivalent. | | |
| 43 | - | | Create | Browser navigation writes history outside the systemview UI. | Existing history repository/usecases. | Not a user-facing CRUD action. | No manual create needed. | | |
| 44 | - | | Update | Not supported in old UI. | None. | None. | Keep out of scope unless a future title-edit requirement appears. | | |
| 45 | - | | Delete one | `HistoryItem.svelte`, `keyboard.ts` | `history_delete_entry` | Bridge client supports it; UI not interactive. | Add row delete action with confirmation and refresh. | | |
| 46 | - | | Delete range/all | `HistoryCleanup.svelte`, `keyboard.ts` | `history_delete_range`, `history_clear_all` | Bridge client supports range; route UI not interactive. | Add cleanup modal/actions for hour/day/week/month/all. | | |
| 47 | - | | Delete domain | `keyboard.ts`, `HistoryFilters.svelte` | `history_delete_domain` | Bridge client supports it. | Add domain-action UI and confirmation. | | |
| 48 | - | | Open row | `navigateTo(entry.url)` | Browser navigation | Static links exist. | Add keyboard open and active-row focus management. | | |
| 49 | - | ||
| 50 | - | ### Favorites and tags (`webui/src/pages/homepage/favorites/*`) | |
| 51 | - | ||
| 52 | - | | Operation | Old Svelte surface | Backend message/API | Current WASM status | Gap | | |
| 53 | - | | --- | --- | --- | --- | --- | | |
| 54 | - | | Read favorites | `FavoritesPanel.svelte`, `FavoriteGrid.svelte`, `FavoriteCard.svelte` | `favorite_list` | Present, but bare link list (`favorites_view.go`) with tags-first data. | Add rich rows/cards, favicons, shortcut badges, and tag metadata. | | |
| 55 | - | | Create favorite | Old homepage hints imply adding/pinning from history; native omnibox toggle exists outside this page. | `ManageFavoritesUseCase.AddFavorite`, `port.HomepageFavorites`, `SystemviewFavoritesService`, homepage handlers, and bridge expose `favorite_create`. | Supported in WASM UI. | Keep validation/error states covered. | | |
| 56 | - | | Update favorite | `FavoriteEditor.svelte` locally updates title, shortcut, and tags. | `ManageFavoritesUseCase.UpdateFavorite`, `favorite_update`, `favorite_set_shortcut`, `tag_assign`, and `tag_remove` are exposed through the ports, handlers, and bridge. | Supported in WASM UI. | Keep shortcut/tag semantics covered by regression tests. | | |
| 57 | - | | Delete favorite | `FavoriteEditor.svelte` local-only delete placeholder. | `ManageFavoritesUseCase.DeleteFavorite`/`Remove`, `port.HomepageFavorites`, `SystemviewFavoritesService`, homepage handlers, and bridge expose `favorite_delete`. | Supported in WASM UI. | Keep destructive confirmation and refresh behavior covered. | | |
| 58 | - | | Read tags | `TagCloud.svelte` | `tag_list` | Present as static list. | Add color chips and selection. | | |
| 59 | - | | Create tag | `TagCloud.svelte` inline create | `tag_create` | Bridge and handler exist. | Add UI with color picker/palette. | | |
| 60 | - | | Update tag | Handler exists (`tag_update`). | `tag_update` | Bridge exists. | Add rename/color edit UI. | | |
| 61 | - | | Delete tag | Handler exists (`tag_delete`). | `tag_delete` | Bridge exists. | Add confirm UI and refresh assignments. | | |
| 62 | - | | Assign/remove tag | `FavoriteEditor.svelte` | `tag_assign`, `tag_remove` | Bridge exists. | Add editor UI. | | |
| 63 | - | ||
| 64 | - | ### Config and keybindings (`webui/src/pages/ConfigPage.svelte`, `webui/src/pages/config/*`) | |
| 65 | - | ||
| 66 | - | | Operation | Old Svelte surface | Backend message/API | Current WASM status | Gap | | |
| 67 | - | | --- | --- | --- | --- | --- | | |
| 68 | - | | Read config | `ConfigPage.svelte` | `/api/config` | Bridge supports direct API and route renders flattened values. | Replace flattened read-only view with grouped editable forms. | | |
| 69 | - | | Read defaults | Reset dialog in `ConfigPage.svelte` | `/api/config/default` | Bridge supports direct API. | Add reset-to-default flow. | | |
| 70 | - | | Save config | `save_config` via native bridge | `save_config` | Bridge supports it. Existing app config watcher hot-reloads appearance/keybindings/engine settings. | Add form save flow, validation, success/error UI, refresh after save. | | |
| 71 | - | | Appearance update | Fonts, UI scale, color scheme, palettes | `save_config` | Payload shape exists in `SystemviewConfigPayload`. | Add form controls and palette validation. | | |
| 72 | - | | Search shortcuts CRUD | `ShortcutsTable.svelte` | Saved inside config payload | Missing interactive UI. | Add table/list editing and `%s`/`{query}` validation. | | |
| 73 | - | | Performance update | Performance tab | `save_config` | Payload shape exists; CEF gating needed. | Add profile/custom fields and restart warning. | | |
| 74 | - | | Keybindings read | `KeybindingsTab.svelte` | `get_keybindings` | Route renders read-only keybinding groups. | Add editable keybinding UI. | | |
| 75 | - | | Keybindings update | `KeyCaptureModal.svelte` | `set_keybinding`, `reset_keybinding`, `reset_all_keybindings` | Bridge supports message types. | Add capture/reset UI and conflict display. | | |
| 76 | - | ||
| 77 | - | ## Native shortcut and split-pane target | |
| 78 | - | ||
| 79 | - | Add first-class global actions: | |
| 80 | - | ||
| 81 | - | | Action | Default key | Target behavior | | |
| 82 | - | | --- | --- | --- | | |
| 83 | - | | `toggle_history_systemview` | `ctrl+h` | Split active pane to the right with `dumb://history`, focus an existing history systemview pane, or close it if already active. | | |
| 84 | - | | `toggle_favorites_systemview` | Unset by default. | Split/focus/toggle `dumb://favorites`. | | |
| 85 | - | | `toggle_config_systemview` | Unset by default; user can bind in config. | Split/focus/toggle `dumb://config`. | | |
| 86 | - | ||
| 87 | - | Implementation path: | |
| 88 | - | ||
| 89 | - | 1. Add input actions in `internal/ui/input/shortcuts.go` and config defaults/schema in `internal/infrastructure/config`. | |
| 90 | - | 2. Map the actions in global shortcuts and keybinding DTOs. | |
| 91 | - | 3. Add a coordinator method such as `WorkspaceCoordinator.SplitURL(ctx, SplitRight, "dumb://history")` so dispatcher does not manipulate pane internals. | |
| 92 | - | 4. Use existing `ManagePanesUseCase.Split` with `SplitPaneInput.InitialURL` to keep domain/usecase clean. | |
| 93 | - | 5. Add tests in input, dispatcher, config defaults/schema, and workspace coordinator. | |
| 94 | - | ||
| 95 | - | ## Completed branch notes | |
| 96 | - | ||
| 97 | - | - Rendering now uses typed `github.com/a-h/templ` components under `internal/ui/systemviews/*.templ`; generated `*_templ.go` files are committed alongside source templates. | |
| 98 | - | - `make build-systemviews` runs `go tool templ generate -path internal/ui/systemviews -include-version=false` before building the WASM runtime. | |
| 99 | - | - History supports search, domain filters, pagination, analytics/domain summaries, single/range/domain deletion, row open actions, alerts, and keyboard navigation. | |
| 100 | - | - Favorites supports create/update/delete for favorites and tags; tag filters; shortcut editing; tag assignment/removal; alerts; and keyboard navigation. | |
| 101 | - | - Config supports editable appearance, search defaults, search shortcut CRUD, performance profile/custom values, keybinding set/reset/reset-all, success/error states, and refreshes the config payload/theme after save. | |
| 102 | - | - Native global actions use `toggle_*_systemview` names and open/focus/close History/Favorites/Config system views through the coordinator/right-split path. | |
| 103 | - | - Trust-boundary hardening includes templ HTML escaping, URL scheme sanitization for rendered links, sanitized CSS color use for tag swatches, serialized DOM action handling, and route-level error states. | |
| 104 | - | ||
| 105 | - | ## Implementation notes | |
| 106 | - | ||
| 107 | - | - Do not resurrect `webui/`; the branch intentionally removed Svelte assets. | |
| 108 | - | - Keep WASM UI code small and stateful. Avoid pushing business rules into HTML string helpers. | |
| 109 | - | - Prefer explicit bridge request methods over ad-hoc message strings in UI code. | |
| 110 | - | - Every destructive action needs confirmation and a visible refresh/error path. | |
| 111 | - | - Every feature should remain usable by keyboard because these pages are browser management surfaces, not marketing pages. | |
| @@ -1,111 +0,0 @@ | |||||
| 1 | - | # Systemviews WASM CRUD and Architecture Plan | |||
| 2 | - | ||||
| 3 | - | This note captures the parity target for the `feat/systemviews-wasm` branch after merging `main`. | |||
| 4 | - | ||||
| 5 | - | ## Current branch baseline | |||
| 6 | - | ||||
| 7 | - | - Worktree: `.worktrees/feat/systemviews-wasm` | |||
| 8 | - | - Branch: `feat/systemviews-wasm` | |||
| 9 | - | - Merge baseline: `d84415e5` (`Merge branch 'main' into feat/systemviews-wasm`) | |||
| 10 | - | - Vendor baseline: `go mod vendor` has been run in the worktree and `go list -mod=vendor ./...` succeeds there. | |||
| 11 | - | - Root-checkout vendoring diagnostics were corrected separately with `go mod vendor`; branch validation should still use `-mod=vendor` after dependency changes. | |||
| 12 | - | ||||
| 13 | - | ## Clean architecture contract | |||
| 14 | - | ||||
| 15 | - | Keep the dependency direction explicit: | |||
| 16 | - | ||||
| 17 | - | | Layer | Role for systemviews | Must not do | | |||
| 18 | - | | --- | --- | --- | | |||
| 19 | - | | `internal/domain` | Pure entities/value objects and pure helpers such as history range parsing. | Import ports, usecases, adapters, GTK/CEF/WebKit, or config packages. | | |||
| 20 | - | | `internal/application/usecase` | Own favorites/history/config/keybinding behavior and validation. | Import infrastructure adapters or UI packages. | | |||
| 21 | - | | `internal/application/port` | Define the systemview-facing contracts and DTOs. | Depend on CEF/WebKit/SQLite/config concrete types. | | |||
| 22 | - | | `internal/infrastructure/*` | Implement handlers, scheme serving, bridge transports, persistence, config payload readers. | Put UI workflow or business rules here. | | |||
| 23 | - | | `internal/ui/systemviews` | Render and orchestrate WASM UI through ports. | Call repositories, config package, CEF/WebKit, or SQLite directly. | | |||
| 24 | - | | `internal/ui/dispatcher` / coordinators | Convert native actions into pane/tab/navigation orchestration. | Bypass usecases for domain state changes. | | |||
| 25 | - | ||||
| 26 | - | Preferred direction for new work: | |||
| 27 | - | ||||
| 28 | - | 1. Add behavior to existing usecases first when it is business logic. | |||
| 29 | - | 2. Expose it through application ports. | |||
| 30 | - | 3. Implement WebUI/systemview handlers in `internal/infrastructure/handlers`. | |||
| 31 | - | 4. Consume those handlers from `internal/infrastructure/systemviewsbridge`. | |||
| 32 | - | 5. Render and bind user interactions in `internal/ui/systemviews`. | |||
| 33 | - | ||||
| 34 | - | ## Old Svelte UI CRUD matrix | |||
| 35 | - | ||||
| 36 | - | ### History (`webui/src/pages/homepage/*`) | |||
| 37 | - | ||||
| 38 | - | | Operation | Old Svelte surface | Backend message/API | Current WASM status | Gap | | |||
| 39 | - | | --- | --- | --- | --- | --- | | |||
| 40 | - | | Read timeline | `HistoryPanel.svelte`, `HistoryTimeline.svelte`, `HistoryItem.svelte` | `history_timeline` | Present, but bare list only (`internal/ui/systemviews/history_view.go`). | Add pagination, loading/error/empty states, row metadata, favicons, visit counts. | | |||
| 41 | - | | Read/search | `HistorySearch.svelte`, `keyboard.ts` local fuzzy + FTS | `history_search_fts` | Bridge client supports it. | Add search UI, debounce/local filtering, FTS fallback, visible result count. | | |||
| 42 | - | | Read filters/stats | `HistoryFilters.svelte`, `AnalyticsPanel.svelte` | `history_domain_stats`, `history_analytics` | Bridge client supports both; config route renders keybinding/config summaries only. | Add domain chips, stats summary, analytics cards/charts or text equivalent. | | |||
| 43 | - | | Create | Browser navigation writes history outside the systemview UI. | Existing history repository/usecases. | Not a user-facing CRUD action. | No manual create needed. | | |||
| 44 | - | | Update | Not supported in old UI. | None. | None. | Keep out of scope unless a future title-edit requirement appears. | | |||
| 45 | - | | Delete one | `HistoryItem.svelte`, `keyboard.ts` | `history_delete_entry` | Bridge client supports it; UI not interactive. | Add row delete action with confirmation and refresh. | | |||
| 46 | - | | Delete range/all | `HistoryCleanup.svelte`, `keyboard.ts` | `history_delete_range`, `history_clear_all` | Bridge client supports range; route UI not interactive. | Add cleanup modal/actions for hour/day/week/month/all. | | |||
| 47 | - | | Delete domain | `keyboard.ts`, `HistoryFilters.svelte` | `history_delete_domain` | Bridge client supports it. | Add domain-action UI and confirmation. | | |||
| 48 | - | | Open row | `navigateTo(entry.url)` | Browser navigation | Static links exist. | Add keyboard open and active-row focus management. | | |||
| 49 | - | ||||
| 50 | - | ### Favorites and tags (`webui/src/pages/homepage/favorites/*`) | |||
| 51 | - | ||||
| 52 | - | | Operation | Old Svelte surface | Backend message/API | Current WASM status | Gap | | |||
| 53 | - | | --- | --- | --- | --- | --- | | |||
| 54 | - | | Read favorites | `FavoritesPanel.svelte`, `FavoriteGrid.svelte`, `FavoriteCard.svelte` | `favorite_list` | Present, but bare link list (`favorites_view.go`) with tags-first data. | Add rich rows/cards, favicons, shortcut badges, and tag metadata. | | |||
| 55 | - | | Create favorite | Old homepage hints imply adding/pinning from history; native omnibox toggle exists outside this page. | `ManageFavoritesUseCase.AddFavorite`, `port.HomepageFavorites`, `SystemviewFavoritesService`, homepage handlers, and bridge expose `favorite_create`. | Supported in WASM UI. | Keep validation/error states covered. | | |||
| 56 | - | | Update favorite | `FavoriteEditor.svelte` locally updates title, shortcut, and tags. | `ManageFavoritesUseCase.UpdateFavorite`, `favorite_update`, `favorite_set_shortcut`, `tag_assign`, and `tag_remove` are exposed through the ports, handlers, and bridge. | Supported in WASM UI. | Keep shortcut/tag semantics covered by regression tests. | | |||
| 57 | - | | Delete favorite | `FavoriteEditor.svelte` local-only delete placeholder. | `ManageFavoritesUseCase.DeleteFavorite`/`Remove`, `port.HomepageFavorites`, `SystemviewFavoritesService`, homepage handlers, and bridge expose `favorite_delete`. | Supported in WASM UI. | Keep destructive confirmation and refresh behavior covered. | | |||
| 58 | - | | Read tags | `TagCloud.svelte` | `tag_list` | Present as static list. | Add color chips and selection. | | |||
| 59 | - | | Create tag | `TagCloud.svelte` inline create | `tag_create` | Bridge and handler exist. | Add UI with color picker/palette. | | |||
| 60 | - | | Update tag | Handler exists (`tag_update`). | `tag_update` | Bridge exists. | Add rename/color edit UI. | | |||
| 61 | - | | Delete tag | Handler exists (`tag_delete`). | `tag_delete` | Bridge exists. | Add confirm UI and refresh assignments. | | |||
| 62 | - | | Assign/remove tag | `FavoriteEditor.svelte` | `tag_assign`, `tag_remove` | Bridge exists. | Add editor UI. | | |||
| 63 | - | ||||
| 64 | - | ### Config and keybindings (`webui/src/pages/ConfigPage.svelte`, `webui/src/pages/config/*`) | |||
| 65 | - | ||||
| 66 | - | | Operation | Old Svelte surface | Backend message/API | Current WASM status | Gap | | |||
| 67 | - | | --- | --- | --- | --- | --- | | |||
| 68 | - | | Read config | `ConfigPage.svelte` | `/api/config` | Bridge supports direct API and route renders flattened values. | Replace flattened read-only view with grouped editable forms. | | |||
| 69 | - | | Read defaults | Reset dialog in `ConfigPage.svelte` | `/api/config/default` | Bridge supports direct API. | Add reset-to-default flow. | | |||
| 70 | - | | Save config | `save_config` via native bridge | `save_config` | Bridge supports it. Existing app config watcher hot-reloads appearance/keybindings/engine settings. | Add form save flow, validation, success/error UI, refresh after save. | | |||
| 71 | - | | Appearance update | Fonts, UI scale, color scheme, palettes | `save_config` | Payload shape exists in `SystemviewConfigPayload`. | Add form controls and palette validation. | | |||
| 72 | - | | Search shortcuts CRUD | `ShortcutsTable.svelte` | Saved inside config payload | Missing interactive UI. | Add table/list editing and `%s`/`{query}` validation. | | |||
| 73 | - | | Performance update | Performance tab | `save_config` | Payload shape exists; CEF gating needed. | Add profile/custom fields and restart warning. | | |||
| 74 | - | | Keybindings read | `KeybindingsTab.svelte` | `get_keybindings` | Route renders read-only keybinding groups. | Add editable keybinding UI. | | |||
| 75 | - | | Keybindings update | `KeyCaptureModal.svelte` | `set_keybinding`, `reset_keybinding`, `reset_all_keybindings` | Bridge supports message types. | Add capture/reset UI and conflict display. | | |||
| 76 | - | ||||
| 77 | - | ## Native shortcut and split-pane target | |||
| 78 | - | ||||
| 79 | - | Add first-class global actions: | |||
| 80 | - | ||||
| 81 | - | | Action | Default key | Target behavior | | |||
| 82 | - | | --- | --- | --- | | |||
| 83 | - | | `toggle_history_systemview` | `ctrl+h` | Split active pane to the right with `dumb://history`, focus an existing history systemview pane, or close it if already active. | | |||
| 84 | - | | `toggle_favorites_systemview` | Unset by default. | Split/focus/toggle `dumb://favorites`. | | |||
| 85 | - | | `toggle_config_systemview` | Unset by default; user can bind in config. | Split/focus/toggle `dumb://config`. | | |||
| 86 | - | ||||
| 87 | - | Implementation path: | |||
| 88 | - | ||||
| 89 | - | 1. Add input actions in `internal/ui/input/shortcuts.go` and config defaults/schema in `internal/infrastructure/config`. | |||
| 90 | - | 2. Map the actions in global shortcuts and keybinding DTOs. | |||
| 91 | - | 3. Add a coordinator method such as `WorkspaceCoordinator.SplitURL(ctx, SplitRight, "dumb://history")` so dispatcher does not manipulate pane internals. | |||
| 92 | - | 4. Use existing `ManagePanesUseCase.Split` with `SplitPaneInput.InitialURL` to keep domain/usecase clean. | |||
| 93 | - | 5. Add tests in input, dispatcher, config defaults/schema, and workspace coordinator. | |||
| 94 | - | ||||
| 95 | - | ## Completed branch notes | |||
| 96 | - | ||||
| 97 | - | - Rendering now uses typed `github.com/a-h/templ` components under `internal/ui/systemviews/*.templ`; generated `*_templ.go` files are committed alongside source templates. | |||
| 98 | - | - `make build-systemviews` runs `go tool templ generate -path internal/ui/systemviews -include-version=false` before building the WASM runtime. | |||
| 99 | - | - History supports search, domain filters, pagination, analytics/domain summaries, single/range/domain deletion, row open actions, alerts, and keyboard navigation. | |||
| 100 | - | - Favorites supports create/update/delete for favorites and tags; tag filters; shortcut editing; tag assignment/removal; alerts; and keyboard navigation. | |||
| 101 | - | - Config supports editable appearance, search defaults, search shortcut CRUD, performance profile/custom values, keybinding set/reset/reset-all, success/error states, and refreshes the config payload/theme after save. | |||
| 102 | - | - Native global actions use `toggle_*_systemview` names and open/focus/close History/Favorites/Config system views through the coordinator/right-split path. | |||
| 103 | - | - Trust-boundary hardening includes templ HTML escaping, URL scheme sanitization for rendered links, sanitized CSS color use for tag swatches, serialized DOM action handling, and route-level error states. | |||
| 104 | - | ||||
| 105 | - | ## Implementation notes | |||
| 106 | - | ||||
| 107 | - | - Do not resurrect `webui/`; the branch intentionally removed Svelte assets. | |||
| 108 | - | - Keep WASM UI code small and stateful. Avoid pushing business rules into HTML string helpers. | |||
| 109 | - | - Prefer explicit bridge request methods over ad-hoc message strings in UI code. | |||
| 110 | - | - Every destructive action needs confirmation and a visible refresh/error path. | |||
| 111 | - | - Every feature should remain usable by keyboard because these pages are browser management surfaces, not marketing pages. | |||