diff --git a/.agents/README.md b/.agents/README.md index 5286f2530..2cda28b69 100644 --- a/.agents/README.md +++ b/.agents/README.md @@ -1,7 +1,7 @@ # .agents index -Agent guidance only. End-user docs: `docs/en/`. -Entry: root `AGENTS.md`. +Agent guidance only. End-user docs: docs/en/. +Entry: root AGENTS.md. Always-on rules: .agents/conventions/core.md and .agents/conventions/reticulum-zen.md. ## Open by need @@ -11,14 +11,14 @@ Entry: root `AGENTS.md`. | Domain to manager / HTTP / WS / tests | [module-ownership.md](module-ownership.md) | | Mesh Zen gates | [conventions/reticulum-zen.md](conventions/reticulum-zen.md) | | Always-on standards | [conventions/core.md](conventions/core.md) | -| Vue UI | [conventions/frontend.md](conventions/frontend.md) | +| Frontend (Svelte 5) | [conventions/frontend.md](conventions/frontend.md) | | Python / HTTP / SQLite | [conventions/backend.md](conventions/backend.md) | | Local FS jail | [conventions/path-jail.md](conventions/path-jail.md) | | Android WebView | [conventions/android.md](conventions/android.md) | -| Tests / references / contracts | [conventions/tests.md](conventions/tests.md) | +| Tests / references / contracts | [conventions/tests.md](conventions/tests.md) | | Commit messages | [conventions/commits.md](conventions/commits.md) | -Skills: one file each at `skills//SKILL.md`. Open the matching skill before coding that surface. +Skills: one file each at skills//SKILL.md. Open the matching skill before coding that surface. ## Skills (trigger to path) @@ -38,7 +38,7 @@ Skills: one file each at `skills//SKILL.md`. Open the matching skill befor | privacy mode / clearnet HTTP | [privacy-mode-clearnet](skills/privacy-mode-clearnet/SKILL.md) | | new page, toast, i18n | [page-toast-tests](skills/page-toast-tests/SKILL.md) | | nav, tools, commands, WS registry | [contribution-registries](skills/contribution-registries/SKILL.md) | -| Vue mega-page extract | [vue-mega-page-split](skills/vue-mega-page-split/SKILL.md) | +| Svelte 5 / feature modules | [svelte-feature-modules](skills/svelte-feature-modules/SKILL.md) | | HTTP/WS extract from meshchat.py | [meshchat-orchestration-split](skills/meshchat-orchestration-split/SKILL.md) | | identity key vs zip restore | [identity-restore](skills/identity-restore/SKILL.md) | | identity switch teardown | [identity-switch-teardown](skills/identity-switch-teardown/SKILL.md) | @@ -52,7 +52,7 @@ Skills: one file each at `skills//SKILL.md`. Open the matching skill befor | Electron frozen packaging | [electron-frozen-packaging](skills/electron-frozen-packaging/SKILL.md) | | Android bridge | [android-webview-bridge](skills/android-webview-bridge/SKILL.md) | | focused test loops | [test-loop](skills/test-loop/SKILL.md) | -| property / fuzz references | [test-oracles](skills/test-oracles/SKILL.md) | +| property / fuzz references | [test-oracles](skills/test-oracles/SKILL.md) | | exploratory bug hunt | [exploratory-testing](skills/exploratory-testing/SKILL.md) | | releases, tags, immutability | [release-immutability](skills/release-immutability/SKILL.md) | | experimental WebTransport live | [webtransport-experimental](skills/webtransport-experimental/SKILL.md) | diff --git a/.agents/conventions/android.md b/.agents/conventions/android.md index 891fa337d..4fc100111 100644 --- a/.agents/conventions/android.md +++ b/.agents/conventions/android.md @@ -1,9 +1,9 @@ # Android conventions -Applies when editing `android/**/*.{java,kt}`. +Applies when editing android/**/*.{java,kt}. -- WebView `accept` extension tokens are not valid MIME types. Map `.ext` to `application/octet-stream` / `*/*` before `EXTRA_MIME_TYPES`. -- Set `EXTRA_ALLOW_MULTIPLE` only when the chooser mode is multi-open. -- Prefer existing bridge patterns in `MainActivity` for storage, file pick, and push. +- WebView accept extension tokens are not valid MIME types. Map .ext to application/octet-stream / _/_ before EXTRA_MIME_TYPES. +- Set EXTRA_ALLOW_MULTIPLE only when the chooser mode is multi-open. +- Prefer existing bridge patterns in MainActivity for storage, file pick, and push. - After Android bridge changes, note whether emulator smoke or unit coverage is needed. -- WebView navigation uses `RemoteBackendUrl.isAllowedShellNavigation` (backend origin only). Deny `data:` and userinfo. Keep file access off and mixed content never-allow. The JS bridge follows every loaded page. See `.agents/skills/url-origin-allowlists/SKILL.md`. +- WebView navigation uses RemoteBackendUrl.isAllowedShellNavigation (backend origin only). Deny data: and userinfo. Keep file access off and mixed content never-allow. The JS bridge follows every loaded page. See .agents/skills/url-origin-allowlists/SKILL.md. diff --git a/.agents/conventions/backend.md b/.agents/conventions/backend.md index b131dc5d5..a243d251e 100644 --- a/.agents/conventions/backend.md +++ b/.agents/conventions/backend.md @@ -1,23 +1,24 @@ # Backend conventions -Applies when editing `meshchatx/**/*.py`. +Applies when editing meshchatx/**/*.py. -- Prefer `uv run` / `task` for pytest and ruff. -- HTTP handlers: return 400 for `ValueError` / bad input, 503 for retryable SQLite/Landlock unavailability, 500 only for unexpected failures. -- Thin HTTP handlers live under `meshchatx/src/backend/http/routes/`. Parse the request, call a manager or app method, map errors. Do not add new business logic in route modules. -- Shared HTTP helpers: `backend/http/errors.py`, `backend/http/context.py`, `backend/http/middleware.py`, `backend/http/register.py`, `backend/http/uploads.py`. Wire constants (`API_V1_PREFIX`, `WsInboundType`) live in `backend/constants.py`. -- JSON error responses go through `errors.py` helpers (`http_bad_request` / `http_unavailable` / `http_not_found` / `http_error_from_exception` ...). Canonical payload is `{"error", "code", "message"}`; the contract test `test_http_error_shape_contract.py` enforces it. -- In `except` blocks use `http_error_from_exception(exc)` instead of reflecting `str(exc)`; it maps PathJailError reasons to 400/403/404 and keeps OSError internals server-side. Pass `key=`/`extra=` to preserve route payload shapes. -- Client-supplied bodies and multipart fields must flow through `uploads.py` (`read_json_limited` for JSON bodies, `read_field_limited`/`read_field_text_limited` for multipart fields, `write_field_to_path` for streamed uploads) with an explicit per-endpoint byte cap from the `UPLOAD_LIMITS` table or a feature-owned constant. -- When splitting or moving handlers among `routes/.py`, follow `.agents/skills/meshchat-orchestration-split/SKILL.md` and `.agents/module-ownership.md`. Mechanical moves only (no behaviour change in the same change). +- Prefer uv run / task for pytest and ruff. +- HTTP handlers: return 400 for ValueError / bad input, 503 for retryable SQLite/Landlock unavailability, 500 only for unexpected failures. +- Thin HTTP handlers live under meshchatx/src/backend/http/routes/. Parse the request, call a manager or app method, map errors. Do not add new business logic in route modules. +- Shared HTTP helpers: backend/http/errors.py, backend/http/context.py, backend/http/middleware.py, backend/http/register.py, backend/http/uploads.py, backend/http/meshchat_names.py. Wire constants (API_V1_PREFIX, WsInboundType) live in backend/constants.py. +- errors.py and context.py are intentional scaffolding. Adopt http_bad_request / http_unavailable / http_unexpected only when a handler is already thin. Do not refactor fat handlers only to call them. +- JSON error responses go through errors.py helpers (http_bad_request / http_unavailable / http_not_found / http_error_from_exception ...). Canonical payload is {"error", "code", "message"}; the contract test test_http_error_shape_contract.py enforces it. +- In except blocks use http_error_from_exception(exc) instead of reflecting str(exc); it maps PathJailError reasons to 400/403/404 and keeps OSError internals server-side. Pass key=/extra= to preserve route payload shapes. +- Client-supplied bodies and multipart fields must flow through uploads.py (read_json_limited for JSON bodies, read_field_limited/read_field_text_limited for multipart fields, write_field_to_path for streamed uploads) with an explicit per-endpoint byte cap from the UPLOAD_LIMITS table or a feature-owned constant. +- When splitting or moving handlers among routes/.py, follow .agents/skills/meshchat-orchestration-split/SKILL.md and .agents/module-ownership.md. Mechanical moves only (no behaviour change in the same change). - Multipart parsers must not assume field order. -- SQLite worker connections must set `temp_store=MEMORY` in `DatabaseProvider` (Landlock-safe). +- SQLite worker connections must set temp_store=MEMORY in DatabaseProvider (Landlock-safe). - Under Landlock, memory-pressure must not force FILE temp for conversation queries. -- Subprocess or user-local CLI features must remain usable under Landlock. Extend `landlock_sandbox.py` read/RW roots and add a probe in `tests/backend/test_landlock_integration_surfaces.py` (see `landlock-sqlite` skill). -- Keep conversation list queries slim: truncate content, derive attachment flags in SQL, avoid shipping full `fields` blobs. +- Subprocess or user-local CLI features must remain usable under Landlock. Extend landlock_sandbox.py read/RW roots and add a probe in tests/backend/test_landlock_integration_surfaces.py (see landlock-sqlite skill). +- Keep conversation list queries slim: truncate content, derive attachment flags in SQL, avoid shipping full fields blobs. - Identity restore validates size and empty payloads. Preserve existing identity metadata on re-import. - No backticks in code comments. Prefer plain words or quoted identifiers. -- RRC / LXMF / LXST changes: open the matching skill under `.agents/skills/` and run reference-style tests when behaviour changes. -- Local filesystem browse/upload/download/delete: follow `.agents/conventions/path-jail.md` and `.agents/skills/path-jail-local-fs/SKILL.md`. -- File persistence: write via `atomic_write_bytes`/`atomic_write_text` or `json_store.save_json`; read state via `json_store.load_json` (default on corrupt/missing) or `load_json_required` (raise). Do not hand-roll mkstemp+os.replace or bare open+json.load. -- Manager result envelopes use `backend/results.py` (`ok_result`, `err_result`, `err_result_from`); never return `str(exc)` from OSError to clients. +- RRC / LXMF / LXST changes: open the matching skill under .agents/skills/ and run oracle-style tests when behaviour changes. +- Local filesystem browse/upload/download/delete: follow .agents/conventions/path-jail.md and .agents/skills/path-jail-local-fs/SKILL.md. +- File persistence: write via atomic_write_bytes/atomic_write_text or json_store.save_json; read state via json_store.load_json (default on corrupt/missing) or load_json_required (raise). Do not hand-roll mkstemp+os.replace or bare open+json.load. +- Manager result envelopes use backend/results.py (ok_result, err_result, err_result_from); never return str(exc) from OSError to clients. diff --git a/.agents/conventions/commits.md b/.agents/conventions/commits.md index 319ed4cf8..181850db3 100644 --- a/.agents/conventions/commits.md +++ b/.agents/conventions/commits.md @@ -1,6 +1,6 @@ # Commit message conventions -MeshChatX uses [Conventional Commits](https://www.conventionalcommits.org/) for git history on GitHub. LXMF patch contributors can use any short message in their local commit before `git format-patch`. +MeshChatX uses [Conventional Commits](https://www.conventionalcommits.org/) for git history on GitHub. LXMF patch contributors can use any short message in their local commit before git format-patch. ## Format @@ -12,7 +12,7 @@ MeshChatX uses [Conventional Commits](https://www.conventionalcommits.org/) for [optional footer] ``` -- **type**: one of `feat`, `fix`, `refactor`, `chore`, `docs`, `test`, `ci`, `build`, `perf`, `style`, `revert` +- **type**: one of feat, fix, refactor, chore, docs, test, ci, build, perf, style, revert - **subject**: imperative, lowercase after the colon, no trailing period, max 120 characters for the full header - **body**: wrap at 72 characters when you need context. Mention AI tooling here if required by CONTRIBUTING.md @@ -36,15 +36,15 @@ This repo's local git config signs with rngcs (Reticulum identity, SSH signature ## Validation -- **manual**: `task check:commits` or `./node_modules/.bin/commitlint --from origin/master --to HEAD` -- **CI**: `task check:commits` on pull requests +- **manual**: task check:commits or ./node_modules/.bin/commitlint --from origin/master --to HEAD +- **CI**: task check:commits on pull requests ## Related commands -| Command | Purpose | -| ------------- | ------------------------------------------------- | -| `task format` | Format the full tree (Prettier, ESLint fix, Ruff) | -| `task lint` | Full lint gate (same as CI lint job) | -| `task check` | format, lint, and test before push | +| Command | Purpose | +| ----------- | ------------------------------------------------- | +| task format | Format the full tree (Prettier, ESLint fix, Ruff) | +| task lint | Full lint gate (same as CI lint job) | +| task check | format, lint, and test before push | -Config: `commitlint.config.cjs`. +Config: commitlint.config.cjs. diff --git a/.agents/conventions/core.md b/.agents/conventions/core.md index 67a436982..47ad1b676 100644 --- a/.agents/conventions/core.md +++ b/.agents/conventions/core.md @@ -1,12 +1,15 @@ # Core conventions -Progressive load: root `AGENTS.md`, then one skill and one surface convention. Full index: `.agents/README.md`. +Progressive load: root AGENTS.md, then one skill and one surface convention. Full index: .agents/README.md. -- Architecture / storage / security / env: `.agents/overview.md` (only when needed). -- Mesh-facing work: `.agents/conventions/reticulum-zen.md` then `.agents/skills/reticulum-design-gates/SKILL.md`. -- Prefer Taskfile targets (`format`, `lint`, `test:quick`, `test:backend`, `test:frontend`). -- Commit messages on GitHub: `.agents/conventions/commits.md`. -- Minimal diffs. Match nearby style. Keep SPDX headers on new project files (`0BSD` unless file already differs). +- Architecture / storage / security / env: .agents/overview.md (only when needed). +- Mesh-facing work: .agents/conventions/reticulum-zen.md then .agents/skills/reticulum-design-gates/SKILL.md. +- Prefer Taskfile targets (format, lint, test:quick, test:backend, test:frontend). +- Commit messages on GitHub: .agents/conventions/commits.md. + +Hard rules below are always on. + +- Minimal diffs. Match nearby style. Keep SPDX headers on new project files (0BSD unless file already differs). - No emojis in repo text or agent replies. No emoji arrows or decorative unicode arrows at all. - No TODO/FIXME comment noise. - No emdashes or semicolons in comments or docs you write. @@ -16,13 +19,15 @@ Progressive load: root `AGENTS.md`, then one skill and one surface convention. F - Do not commit/push unless asked. - User-visible UI strings: i18n keys. Action feedback: ToastUtils. - Do not invent install/run flows when Taskfile already covers them. -- Do not create markdown docs unless asked (except agent guidance under `.agents/` when requested). +- Do not create markdown docs unless asked (except agent guidance under .agents/ when requested). - Do not generate exploit PoCs, malware, or attack tooling. ## Prose -Before writing or editing prose, read `.agents/skills/no-ai-slop/SKILL.md` and self-check against `.agents/skills/no-ai-slop/references/ai-writing-detection.md`. The 24 rules are in `.agents/skills/no-ai-slop/references/rules.md`. +Before writing or editing prose, read .agents/skills/no-ai-slop/SKILL.md and self-check against .agents/skills/no-ai-slop/references/ai-writing-detection.md. The 24 rules are in .agents/skills/no-ai-slop/references/rules.md. Say what the thing is. Headings name the section contents. Every claim ends on a checkable detail (a path, an API, a status code, a measured quantity). Do not invent numbers, quotes, or incidents. -Load `.agents/skills/rossmann-voice/SKILL.md` only when the user asks for that voice. Do not rewrite MeshChatX technical docs into that voice by default. +When editing CHANGELOG.md, use the current CHANGELOG.md as the style reference: terse bullets, **Area**: detail, imperative mood, and specific checkable facts. + +Load .agents/skills/rossmann-voice/SKILL.md only when the user asks for that voice. Do not rewrite MeshChatX technical docs into that voice by default. diff --git a/.agents/conventions/frontend.md b/.agents/conventions/frontend.md index f7982a166..6052042e8 100644 --- a/.agents/conventions/frontend.md +++ b/.agents/conventions/frontend.md @@ -1,41 +1,45 @@ # Frontend conventions -Applies when editing `meshchatx/src/frontend/**/*.{vue,js}`. - -- Vue 3 Options API is dominant in existing pages. Match the file you edit there. New components use Composition API (` diff --git a/meshchatx/src/frontend/components/App.vue b/meshchatx/src/frontend/components/App.vue deleted file mode 100644 index ac34272c8..000000000 --- a/meshchatx/src/frontend/components/App.vue +++ /dev/null @@ -1,2904 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/AppModal.vue b/meshchatx/src/frontend/components/AppModal.vue deleted file mode 100644 index 2ab52130c..000000000 --- a/meshchatx/src/frontend/components/AppModal.vue +++ /dev/null @@ -1,186 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/AppUpdatePrompt.vue b/meshchatx/src/frontend/components/AppUpdatePrompt.vue deleted file mode 100644 index c6a8883ec..000000000 --- a/meshchatx/src/frontend/components/AppUpdatePrompt.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/ChangelogModal.vue b/meshchatx/src/frontend/components/ChangelogModal.vue deleted file mode 100644 index c4b70b782..000000000 --- a/meshchatx/src/frontend/components/ChangelogModal.vue +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/ChannelPromptModal.vue b/meshchatx/src/frontend/components/ChannelPromptModal.vue deleted file mode 100644 index 3b269a360..000000000 --- a/meshchatx/src/frontend/components/ChannelPromptModal.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/ClickPopover.vue b/meshchatx/src/frontend/components/ClickPopover.vue deleted file mode 100644 index 87b50257f..000000000 --- a/meshchatx/src/frontend/components/ClickPopover.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/ColourPickerDropdown.vue b/meshchatx/src/frontend/components/ColourPickerDropdown.vue deleted file mode 100644 index 891e670b7..000000000 --- a/meshchatx/src/frontend/components/ColourPickerDropdown.vue +++ /dev/null @@ -1,134 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/CommandPalette.vue b/meshchatx/src/frontend/components/CommandPalette.vue deleted file mode 100644 index 491e7a3a7..000000000 --- a/meshchatx/src/frontend/components/CommandPalette.vue +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/ConfirmDialog.vue b/meshchatx/src/frontend/components/ConfirmDialog.vue deleted file mode 100644 index 37bb345b0..000000000 --- a/meshchatx/src/frontend/components/ConfirmDialog.vue +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/DropDownMenu.vue b/meshchatx/src/frontend/components/DropDownMenu.vue deleted file mode 100644 index 180a6a4c6..000000000 --- a/meshchatx/src/frontend/components/DropDownMenu.vue +++ /dev/null @@ -1,133 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/DropDownMenuItem.vue b/meshchatx/src/frontend/components/DropDownMenuItem.vue deleted file mode 100644 index 07f770205..000000000 --- a/meshchatx/src/frontend/components/DropDownMenuItem.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/EmptyState.vue b/meshchatx/src/frontend/components/EmptyState.vue deleted file mode 100644 index 5136a5667..000000000 --- a/meshchatx/src/frontend/components/EmptyState.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/FatalErrorPage.vue b/meshchatx/src/frontend/components/FatalErrorPage.vue deleted file mode 100644 index 8a5892629..000000000 --- a/meshchatx/src/frontend/components/FatalErrorPage.vue +++ /dev/null @@ -1,145 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/IconButton.vue b/meshchatx/src/frontend/components/IconButton.vue deleted file mode 100644 index 7ad860239..000000000 --- a/meshchatx/src/frontend/components/IconButton.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/IntegrityWarningModal.vue b/meshchatx/src/frontend/components/IntegrityWarningModal.vue deleted file mode 100644 index b2d5b73e3..000000000 --- a/meshchatx/src/frontend/components/IntegrityWarningModal.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/LanguageSelector.vue b/meshchatx/src/frontend/components/LanguageSelector.vue deleted file mode 100644 index 0470a1c7d..000000000 --- a/meshchatx/src/frontend/components/LanguageSelector.vue +++ /dev/null @@ -1,147 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/LoadingState.vue b/meshchatx/src/frontend/components/LoadingState.vue deleted file mode 100644 index a8db9d5a7..000000000 --- a/meshchatx/src/frontend/components/LoadingState.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/LxmfIconEditor.vue b/meshchatx/src/frontend/components/LxmfIconEditor.vue deleted file mode 100644 index 573c54cc1..000000000 --- a/meshchatx/src/frontend/components/LxmfIconEditor.vue +++ /dev/null @@ -1,173 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/LxmfUserIcon.vue b/meshchatx/src/frontend/components/LxmfUserIcon.vue deleted file mode 100644 index a787cacbe..000000000 --- a/meshchatx/src/frontend/components/LxmfUserIcon.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/MaterialDesignIcon.vue b/meshchatx/src/frontend/components/MaterialDesignIcon.vue deleted file mode 100644 index c69c52bed..000000000 --- a/meshchatx/src/frontend/components/MaterialDesignIcon.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/MdiIconPickerModal.vue b/meshchatx/src/frontend/components/MdiIconPickerModal.vue deleted file mode 100644 index 4d5345535..000000000 --- a/meshchatx/src/frontend/components/MdiIconPickerModal.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/PostInstallPromptHost.vue b/meshchatx/src/frontend/components/PostInstallPromptHost.vue deleted file mode 100644 index 1e88153e6..000000000 --- a/meshchatx/src/frontend/components/PostInstallPromptHost.vue +++ /dev/null @@ -1,174 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/PromptDialog.vue b/meshchatx/src/frontend/components/PromptDialog.vue deleted file mode 100644 index 731b8d268..000000000 --- a/meshchatx/src/frontend/components/PromptDialog.vue +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/SearchInput.vue b/meshchatx/src/frontend/components/SearchInput.vue deleted file mode 100644 index 5e17ea201..000000000 --- a/meshchatx/src/frontend/components/SearchInput.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/SidebarLink.vue b/meshchatx/src/frontend/components/SidebarLink.vue deleted file mode 100644 index 885169bc1..000000000 --- a/meshchatx/src/frontend/components/SidebarLink.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/SidebarVirtualList.vue b/meshchatx/src/frontend/components/SidebarVirtualList.vue deleted file mode 100644 index c1c1b1446..000000000 --- a/meshchatx/src/frontend/components/SidebarVirtualList.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/Skeleton.vue b/meshchatx/src/frontend/components/Skeleton.vue deleted file mode 100644 index f09c0d63e..000000000 --- a/meshchatx/src/frontend/components/Skeleton.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/Toast.vue b/meshchatx/src/frontend/components/Toast.vue deleted file mode 100644 index 6fc56b223..000000000 --- a/meshchatx/src/frontend/components/Toast.vue +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/TutorialModal.vue b/meshchatx/src/frontend/components/TutorialModal.vue deleted file mode 100644 index fdbca7c9a..000000000 --- a/meshchatx/src/frontend/components/TutorialModal.vue +++ /dev/null @@ -1,3468 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/contacts/ContactsPage.vue b/meshchatx/src/frontend/components/contacts/ContactsPage.vue deleted file mode 100644 index 7d676970c..000000000 --- a/meshchatx/src/frontend/components/contacts/ContactsPage.vue +++ /dev/null @@ -1,1077 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/contextmenu/ContextMenuDivider.vue b/meshchatx/src/frontend/components/contextmenu/ContextMenuDivider.vue deleted file mode 100644 index 4c17218f5..000000000 --- a/meshchatx/src/frontend/components/contextmenu/ContextMenuDivider.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/contextmenu/ContextMenuItem.vue b/meshchatx/src/frontend/components/contextmenu/ContextMenuItem.vue deleted file mode 100644 index 6a108e6ff..000000000 --- a/meshchatx/src/frontend/components/contextmenu/ContextMenuItem.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/contextmenu/ContextMenuPanel.vue b/meshchatx/src/frontend/components/contextmenu/ContextMenuPanel.vue deleted file mode 100644 index 1b7791767..000000000 --- a/meshchatx/src/frontend/components/contextmenu/ContextMenuPanel.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/contextmenu/ContextMenuSectionLabel.vue b/meshchatx/src/frontend/components/contextmenu/ContextMenuSectionLabel.vue deleted file mode 100644 index 46753c8ac..000000000 --- a/meshchatx/src/frontend/components/contextmenu/ContextMenuSectionLabel.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/debug/DebugLogsPage.vue b/meshchatx/src/frontend/components/debug/DebugLogsPage.vue deleted file mode 100644 index 6e7748ed2..000000000 --- a/meshchatx/src/frontend/components/debug/DebugLogsPage.vue +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/docs/DocsPage.vue b/meshchatx/src/frontend/components/docs/DocsPage.vue deleted file mode 100644 index 641ba74ea..000000000 --- a/meshchatx/src/frontend/components/docs/DocsPage.vue +++ /dev/null @@ -1,1275 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/filesync/FilesyncDirectoryBrowserModal.vue b/meshchatx/src/frontend/components/filesync/FilesyncDirectoryBrowserModal.vue deleted file mode 100644 index 5bc310a69..000000000 --- a/meshchatx/src/frontend/components/filesync/FilesyncDirectoryBrowserModal.vue +++ /dev/null @@ -1,219 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/filesync/FilesyncFileManager.vue b/meshchatx/src/frontend/components/filesync/FilesyncFileManager.vue deleted file mode 100644 index 0bfa361fd..000000000 --- a/meshchatx/src/frontend/components/filesync/FilesyncFileManager.vue +++ /dev/null @@ -1,296 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/filesync/RnsFilesyncPage.vue b/meshchatx/src/frontend/components/filesync/RnsFilesyncPage.vue deleted file mode 100644 index ddd80cca3..000000000 --- a/meshchatx/src/frontend/components/filesync/RnsFilesyncPage.vue +++ /dev/null @@ -1,836 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/forms/FormLabel.vue b/meshchatx/src/frontend/components/forms/FormLabel.vue deleted file mode 100644 index afa03e460..000000000 --- a/meshchatx/src/frontend/components/forms/FormLabel.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/meshchatx/src/frontend/components/forms/FormSubLabel.vue b/meshchatx/src/frontend/components/forms/FormSubLabel.vue deleted file mode 100644 index 2393abade..000000000 --- a/meshchatx/src/frontend/components/forms/FormSubLabel.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/meshchatx/src/frontend/components/forms/Toggle.vue b/meshchatx/src/frontend/components/forms/Toggle.vue deleted file mode 100644 index 9e8c838fb..000000000 --- a/meshchatx/src/frontend/components/forms/Toggle.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/forwarder/ForwarderPage.vue b/meshchatx/src/frontend/components/forwarder/ForwarderPage.vue deleted file mode 100644 index b343d3083..000000000 --- a/meshchatx/src/frontend/components/forwarder/ForwarderPage.vue +++ /dev/null @@ -1,244 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue b/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue deleted file mode 100644 index 728256b09..000000000 --- a/meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue +++ /dev/null @@ -1,4003 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/interfaces/BundledDocsHint.vue b/meshchatx/src/frontend/components/interfaces/BundledDocsHint.vue deleted file mode 100644 index 193416a75..000000000 --- a/meshchatx/src/frontend/components/interfaces/BundledDocsHint.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/interfaces/ExpandingSection.vue b/meshchatx/src/frontend/components/interfaces/ExpandingSection.vue deleted file mode 100644 index 692616dc6..000000000 --- a/meshchatx/src/frontend/components/interfaces/ExpandingSection.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - diff --git a/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue b/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue deleted file mode 100644 index 8985deb17..000000000 --- a/meshchatx/src/frontend/components/interfaces/ImportInterfacesModal.vue +++ /dev/null @@ -1,274 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/interfaces/Interface.vue b/meshchatx/src/frontend/components/interfaces/Interface.vue deleted file mode 100644 index ef72c7b70..000000000 --- a/meshchatx/src/frontend/components/interfaces/Interface.vue +++ /dev/null @@ -1,449 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue b/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue deleted file mode 100644 index 95f0dc099..000000000 --- a/meshchatx/src/frontend/components/interfaces/InterfacesPage.vue +++ /dev/null @@ -1,1732 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/interfaces/internal/AddInterfaceDiscoveryPanel.vue b/meshchatx/src/frontend/components/interfaces/internal/AddInterfaceDiscoveryPanel.vue deleted file mode 100644 index 5b5235e92..000000000 --- a/meshchatx/src/frontend/components/interfaces/internal/AddInterfaceDiscoveryPanel.vue +++ /dev/null @@ -1,167 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/layout/AppIdentitySwitchOverlay.vue b/meshchatx/src/frontend/components/layout/AppIdentitySwitchOverlay.vue deleted file mode 100644 index 79eff649a..000000000 --- a/meshchatx/src/frontend/components/layout/AppIdentitySwitchOverlay.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/layout/AppShellBanners.vue b/meshchatx/src/frontend/components/layout/AppShellBanners.vue deleted file mode 100644 index 0bd738c10..000000000 --- a/meshchatx/src/frontend/components/layout/AppShellBanners.vue +++ /dev/null @@ -1,268 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/layout/AppSidebarAccountFooter.vue b/meshchatx/src/frontend/components/layout/AppSidebarAccountFooter.vue deleted file mode 100644 index 51bd716b0..000000000 --- a/meshchatx/src/frontend/components/layout/AppSidebarAccountFooter.vue +++ /dev/null @@ -1,196 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/layout/AppSidebarClassicFooter.vue b/meshchatx/src/frontend/components/layout/AppSidebarClassicFooter.vue deleted file mode 100644 index 7f60da20a..000000000 --- a/meshchatx/src/frontend/components/layout/AppSidebarClassicFooter.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/layout/AppSidebarClassicNav.vue b/meshchatx/src/frontend/components/layout/AppSidebarClassicNav.vue deleted file mode 100644 index 1e8183630..000000000 --- a/meshchatx/src/frontend/components/layout/AppSidebarClassicNav.vue +++ /dev/null @@ -1,176 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/layout/AppSidebarNav.vue b/meshchatx/src/frontend/components/layout/AppSidebarNav.vue deleted file mode 100644 index 7baa7ba81..000000000 --- a/meshchatx/src/frontend/components/layout/AppSidebarNav.vue +++ /dev/null @@ -1,377 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/licenses/LicensesPage.vue b/meshchatx/src/frontend/components/licenses/LicensesPage.vue deleted file mode 100644 index 8752b630d..000000000 --- a/meshchatx/src/frontend/components/licenses/LicensesPage.vue +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/map/MapBrowser.vue b/meshchatx/src/frontend/components/map/MapBrowser.vue deleted file mode 100644 index 392a08129..000000000 --- a/meshchatx/src/frontend/components/map/MapBrowser.vue +++ /dev/null @@ -1,540 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/MapPage.vue b/meshchatx/src/frontend/components/map/MapPage.vue deleted file mode 100644 index a0a5b572b..000000000 --- a/meshchatx/src/frontend/components/map/MapPage.vue +++ /dev/null @@ -1,6193 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/map/MiniChat.vue b/meshchatx/src/frontend/components/map/MiniChat.vue deleted file mode 100644 index 1f7c7277c..000000000 --- a/meshchatx/src/frontend/components/map/MiniChat.vue +++ /dev/null @@ -1,214 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapBearingInstructions.vue b/meshchatx/src/frontend/components/map/internal/MapBearingInstructions.vue deleted file mode 100644 index 282e34fb1..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapBearingInstructions.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapClusterPanel.vue b/meshchatx/src/frontend/components/map/internal/MapClusterPanel.vue deleted file mode 100644 index d730d060b..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapClusterPanel.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapDiscoverPanel.vue b/meshchatx/src/frontend/components/map/internal/MapDiscoverPanel.vue deleted file mode 100644 index abee16caf..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapDiscoverPanel.vue +++ /dev/null @@ -1,261 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapDrawingToolbar.vue b/meshchatx/src/frontend/components/map/internal/MapDrawingToolbar.vue deleted file mode 100644 index 0595b5219..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapDrawingToolbar.vue +++ /dev/null @@ -1,137 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapExportConfigPanel.vue b/meshchatx/src/frontend/components/map/internal/MapExportConfigPanel.vue deleted file mode 100644 index 881485013..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapExportConfigPanel.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapExportInstructions.vue b/meshchatx/src/frontend/components/map/internal/MapExportInstructions.vue deleted file mode 100644 index 28ef9523b..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapExportInstructions.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapExportProgressPanel.vue b/meshchatx/src/frontend/components/map/internal/MapExportProgressPanel.vue deleted file mode 100644 index 397e24626..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapExportProgressPanel.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapLayersPanel.vue b/meshchatx/src/frontend/components/map/internal/MapLayersPanel.vue deleted file mode 100644 index 7a6dbdeca..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapLayersPanel.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapLoadDrawingModal.vue b/meshchatx/src/frontend/components/map/internal/MapLoadDrawingModal.vue deleted file mode 100644 index 6d6f75500..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapLoadDrawingModal.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapLoadingOverlay.vue b/meshchatx/src/frontend/components/map/internal/MapLoadingOverlay.vue deleted file mode 100644 index 0572b8ad3..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapLoadingOverlay.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapMarkerPanel.vue b/meshchatx/src/frontend/components/map/internal/MapMarkerPanel.vue deleted file mode 100644 index 5788e61e7..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapMarkerPanel.vue +++ /dev/null @@ -1,227 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapMobileNoteModal.vue b/meshchatx/src/frontend/components/map/internal/MapMobileNoteModal.vue deleted file mode 100644 index c4e9a0958..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapMobileNoteModal.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapOfflinePanel.vue b/meshchatx/src/frontend/components/map/internal/MapOfflinePanel.vue deleted file mode 100644 index 613faea95..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapOfflinePanel.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapPublishPanel.vue b/meshchatx/src/frontend/components/map/internal/MapPublishPanel.vue deleted file mode 100644 index ac5c34964..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapPublishPanel.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/map/internal/MapRemoteOverlayPanel.vue b/meshchatx/src/frontend/components/map/internal/MapRemoteOverlayPanel.vue deleted file mode 100644 index 9b116a369..000000000 --- a/meshchatx/src/frontend/components/map/internal/MapRemoteOverlayPanel.vue +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/messages/InViewAnimatedImg.vue b/meshchatx/src/frontend/components/messages/InViewAnimatedImg.vue deleted file mode 100644 index bac46e4d9..000000000 --- a/meshchatx/src/frontend/components/messages/InViewAnimatedImg.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - diff --git a/meshchatx/src/frontend/components/messages/MessageReactionsOverlay.vue b/meshchatx/src/frontend/components/messages/MessageReactionsOverlay.vue deleted file mode 100644 index 312cbc07e..000000000 --- a/meshchatx/src/frontend/components/messages/MessageReactionsOverlay.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/MessagesPage.vue b/meshchatx/src/frontend/components/messages/MessagesPage.vue deleted file mode 100644 index 118e13545..000000000 --- a/meshchatx/src/frontend/components/messages/MessagesPage.vue +++ /dev/null @@ -1,1701 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/MessagesSidebar.vue b/meshchatx/src/frontend/components/messages/MessagesSidebar.vue deleted file mode 100644 index 73ed54c50..000000000 --- a/meshchatx/src/frontend/components/messages/MessagesSidebar.vue +++ /dev/null @@ -1,1719 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/composer/AddAudioButton.vue b/meshchatx/src/frontend/components/messages/composer/AddAudioButton.vue deleted file mode 100644 index ecbffd85b..000000000 --- a/meshchatx/src/frontend/components/messages/composer/AddAudioButton.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/composer/AddImageButton.vue b/meshchatx/src/frontend/components/messages/composer/AddImageButton.vue deleted file mode 100644 index 08f548f46..000000000 --- a/meshchatx/src/frontend/components/messages/composer/AddImageButton.vue +++ /dev/null @@ -1,172 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/composer/SendMessageButton.vue b/meshchatx/src/frontend/components/messages/composer/SendMessageButton.vue deleted file mode 100644 index cc0591887..000000000 --- a/meshchatx/src/frontend/components/messages/composer/SendMessageButton.vue +++ /dev/null @@ -1,277 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/conversationDisplayGroups.js b/meshchatx/src/frontend/components/messages/conversationDisplayGroups.js deleted file mode 100644 index b5526c64f..000000000 --- a/meshchatx/src/frontend/components/messages/conversationDisplayGroups.js +++ /dev/null @@ -1,180 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -/** Messages fetched per incremental history page. */ -export const CONVERSATION_MESSAGES_PAGE_SIZE = 50; - -/** - * @param {unknown} group - * @returns {unknown[]} - */ -export function itemsFromDisplayGroup(group) { - if (!group || typeof group !== "object") { - return []; - } - if (group.type === "single") { - return group.chatItem ? [group.chatItem] : []; - } - if (group.type === "imageGroup" && Array.isArray(group.items)) { - return group.items.slice(); - } - return []; -} - -/** - * Build display groups newest-first from peer chat items oldest-first. - * - * @param {unknown[]} itemsOldestFirst - * @param {(chatItem: unknown) => boolean} canMergeImageIntoImageStrip - * @returns {unknown[]} - */ -export function buildDisplayGroupsNewestFirst(itemsOldestFirst, canMergeImageIntoImageStrip) { - const items = itemsOldestFirst || []; - const n = items.length; - const groups = []; - let r = 0; - while (r < n) { - const item = items[n - 1 - r]; - if (canMergeImageIntoImageStrip(item)) { - const run = [item]; - let j = r + 1; - while (j < n && run.length < 12) { - const next = items[n - 1 - j]; - if (next.is_outbound !== item.is_outbound) { - break; - } - if (!canMergeImageIntoImageStrip(next)) { - break; - } - run.push(next); - j++; - } - if (run.length >= 2) { - groups.push({ - type: "imageGroup", - items: run, - key: run.map((x) => x.lxmf_message.hash).join("-"), - }); - r = j; - continue; - } - } - groups.push({ - type: "single", - chatItem: item, - key: item.lxmf_message.hash, - }); - r++; - } - return groups; -} - -/** - * Extend cached newest-first groups after prepending older peer chat items. - * - * @param {unknown[]} existingGroupsNewestFirst - * @param {unknown[]} prependedItemsOldestFirst - * @param {(chatItem: unknown) => boolean} canMergeImageIntoImageStrip - * @returns {unknown[]} - */ -export function prependDisplayGroupsNewestFirst( - existingGroupsNewestFirst, - prependedItemsOldestFirst, - canMergeImageIntoImageStrip -) { - const prepended = prependedItemsOldestFirst || []; - const existing = existingGroupsNewestFirst || []; - if (prepended.length === 0) { - return existing; - } - if (existing.length === 0) { - return buildDisplayGroupsNewestFirst(prepended, canMergeImageIntoImageStrip); - } - - const tailGroup = existing[existing.length - 1]; - const tailItemsNewestFirst = itemsFromDisplayGroup(tailGroup); - const tailItemsOldestFirst = tailItemsNewestFirst.slice().reverse(); - const boundaryItemsOldestFirst = prepended.concat(tailItemsOldestFirst); - const boundaryGroups = buildDisplayGroupsNewestFirst(boundaryItemsOldestFirst, canMergeImageIntoImageStrip); - const headGroups = existing.slice(0, -1); - return headGroups.concat(boundaryGroups); -} - -/** - * Flatten display groups to message hashes oldest-first (reference helper). - * - * @param {unknown[]} groupsNewestFirst - * @returns {string[]} - */ -export function displayGroupHashesOldestFirst(groupsNewestFirst) { - const hashes = []; - const groups = groupsNewestFirst || []; - for (let gi = groups.length - 1; gi >= 0; gi--) { - const group = groups[gi]; - if (!group || typeof group !== "object") { - continue; - } - if (group.type === "single") { - const hash = group.chatItem?.lxmf_message?.hash; - if (hash) { - hashes.push(hash); - } - continue; - } - if (group.type === "imageGroup" && Array.isArray(group.items)) { - for (let ii = group.items.length - 1; ii >= 0; ii--) { - const hash = group.items[ii]?.lxmf_message?.hash; - if (hash) { - hashes.push(hash); - } - } - } - } - return hashes; -} - -/** - * Simulate incremental page prepends from the newest end (matches ConversationViewer). - * pageSizesFromNewest: cumulative counts from the newest message backward. - * - * @param {unknown[]} allItemsOldestFirst - * @param {number[]} pageSizesFromNewest - * @param {(chatItem: unknown) => boolean} canMergeImageIntoImageStrip - * @returns {boolean} - */ -export function incrementalPrependMatchesFullRebuild( - allItemsOldestFirst, - pageSizesFromNewest, - canMergeImageIntoImageStrip -) { - const items = allItemsOldestFirst || []; - const n = items.length; - let loaded = []; - let cached = null; - for (const count of pageSizesFromNewest) { - if (count > n) { - return false; - } - const slice = items.slice(n - count); - const newOlderPrefix = slice.slice(0, slice.length - loaded.length); - loaded = slice; - if (cached === null || newOlderPrefix.length === loaded.length) { - cached = buildDisplayGroupsNewestFirst(loaded, canMergeImageIntoImageStrip); - } else { - cached = prependDisplayGroupsNewestFirst(cached, newOlderPrefix, canMergeImageIntoImageStrip); - } - } - const full = buildDisplayGroupsNewestFirst(loaded, canMergeImageIntoImageStrip); - const incKeys = (cached || []).map((g) => g.key); - const fullKeys = full.map((g) => g.key); - if (incKeys.length !== fullKeys.length) { - return false; - } - for (let i = 0; i < incKeys.length; i++) { - if (incKeys[i] !== fullKeys[i]) { - return false; - } - } - const incHashes = displayGroupHashesOldestFirst(cached); - const fullHashes = displayGroupHashesOldestFirst(full); - return incHashes.join("\u241e") === fullHashes.join("\u241e"); -} diff --git a/meshchatx/src/frontend/components/messages/conversationMessageHelpers.js b/meshchatx/src/frontend/components/messages/conversationMessageHelpers.js deleted file mode 100644 index 4f5e0ff77..000000000 --- a/meshchatx/src/frontend/components/messages/conversationMessageHelpers.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Pure helpers for LXMF message display predicates and clipboard/drag image extraction. - */ - -/** - * @param {object} msg - * @returns {boolean} - */ -export function hasFileAttachments(msg) { - const files = msg?.fields?.file_attachments; - return Array.isArray(files) && files.length > 0; -} - -/** - * @param {object} msg - * @returns {boolean} - */ -export function isTelemetryOnly(msg) { - const hasContent = msg.content && msg.content.trim() !== ""; - const hasAttachments = msg.fields?.image || msg.fields?.audio || hasFileAttachments(msg); - const hasTelemetry = msg.fields?.telemetry || msg.fields?.telemetry_stream; - const hasCommands = msg.fields?.commands && msg.fields.commands.some((c) => c["0x01"]); - - return !hasContent && !hasAttachments && !!(hasTelemetry || hasCommands); -} - -/** - * @param {object} msg - * @returns {boolean} - */ -export function hasRenderableContent(msg) { - if (msg.content && msg.content.trim() !== "") return true; - if (msg.fields?.image) return true; - if (msg.fields?.audio) return true; - if (hasFileAttachments(msg)) return true; - if (msg.fields?.telemetry || msg.fields?.telemetry_stream) return true; - if (msg.fields?.commands && msg.fields.commands.some((c) => c["0x01"] || c["1"] || c["0x1"])) return true; - return false; -} - -/** - * @param {object} chatItem - * @param {(item: object) => boolean} shouldHideAutoImageCaption - * @returns {boolean} - */ -export function isFileOnlyMessage(chatItem, shouldHideAutoImageCaption) { - const msg = chatItem.lxmf_message; - if (!hasFileAttachments(msg)) return false; - if (msg.fields?.image || msg.fields?.audio) return false; - const content = (msg.content || "").trim(); - if (content && !shouldHideAutoImageCaption(chatItem)) return false; - if (msg.reply_to_hash) return false; - if (msg.fields?.telemetry || msg.fields?.telemetry_stream) return false; - if (msg.fields?.commands && msg.fields.commands.some((c) => c["0x01"] || c["1"] || c["0x1"])) return false; - return true; -} - -/** - * @param {object} chatItem - * @param {(item: object) => boolean} shouldHideAutoImageCaption - * @returns {boolean} - */ -export function hasMessageBubble(chatItem, shouldHideAutoImageCaption) { - if (!chatItem?.lxmf_message) { - return false; - } - if (isImageOnlyMessage(chatItem, shouldHideAutoImageCaption)) { - return false; - } - return hasRenderableContent(chatItem.lxmf_message); -} - -/** - * @param {object} chatItem - * @param {(item: object) => boolean} shouldHideAutoImageCaption - * @returns {boolean} - */ -export function isImageOnlyMessage(chatItem, shouldHideAutoImageCaption) { - const msg = chatItem.lxmf_message; - if (!msg.fields?.image) return false; - if (msg.fields?.audio || hasFileAttachments(msg)) return false; - const content = (msg.content || "").trim(); - if (content && !shouldHideAutoImageCaption(chatItem)) return false; - if (msg.reply_to_hash) return false; - if (msg.fields?.telemetry || msg.fields?.telemetry_stream) return false; - if (msg.fields?.commands && msg.fields.commands.some((c) => c["0x01"] || c["1"] || c["0x1"])) return false; - return true; -} - -/** - * @param {DataTransfer | null | undefined} dt - * @returns {File[]} - */ -export function collectImageFilesFromDataTransfer(dt) { - if (!dt) { - return []; - } - const out = []; - const seen = new Set(); - const pushIfImage = (f) => { - if (!f?.type?.startsWith("image/")) { - return; - } - const k = `${f.name}:${f.size}:${f.lastModified}`; - if (seen.has(k)) { - return; - } - seen.add(k); - out.push(f); - }; - if (dt.files?.length) { - for (let i = 0; i < dt.files.length; i++) { - pushIfImage(dt.files[i]); - } - if (out.length > 0) { - return out; - } - } - if (dt.items?.length) { - for (let i = 0; i < dt.items.length; i++) { - const item = dt.items[i]; - if (item.kind === "file" && item.type?.startsWith("image/")) { - const f = item.getAsFile(); - pushIfImage(f); - } - } - } - return out; -} - -/** - * @param {ClipboardEvent} event - * @returns {File[]} - */ -export function extractClipboardImageFiles(event) { - const cd = event.clipboardData; - if (!cd?.items?.length) { - return []; - } - const imageBlobs = []; - for (let i = 0; i < cd.items.length; i++) { - const item = cd.items[i]; - if (item.kind === "file" && item.type.startsWith("image/")) { - const f = item.getAsFile(); - if (f) { - imageBlobs.push(f); - } - } - } - return imageBlobs; -} diff --git a/meshchatx/src/frontend/components/messages/conversationPaperIngest.js b/meshchatx/src/frontend/components/messages/conversationPaperIngest.js deleted file mode 100644 index c7ecd414c..000000000 --- a/meshchatx/src/frontend/components/messages/conversationPaperIngest.js +++ /dev/null @@ -1,107 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -const STORAGE_KEY = "meshchatx.paper_ingested_hashes"; -const MAX_HASHES_PER_IDENTITY = 500; - -/** - * @param {unknown} identityKey - * @returns {string} - */ -export function normalizePaperIngestIdentityKey(identityKey) { - return typeof identityKey === "string" && identityKey ? identityKey : "_"; -} - -/** - * @param {unknown} messageHash - * @returns {string} - */ -export function normalizePaperIngestMessageHash(messageHash) { - return typeof messageHash === "string" ? messageHash.trim().toLowerCase() : ""; -} - -/** - * @returns {Record} - */ -function readRoot() { - try { - const raw = JSON.parse(localStorage.getItem(STORAGE_KEY) || "{}"); - if (!raw || typeof raw !== "object" || Array.isArray(raw)) { - return {}; - } - return raw; - } catch { - return {}; - } -} - -/** - * @param {Record} root - */ -function writeRoot(root) { - try { - localStorage.setItem(STORAGE_KEY, JSON.stringify(root)); - } catch { - /* ignore quota / private mode */ - } -} - -/** - * @param {unknown} identityKey - * @returns {string[]} - */ -export function listIngestedPaperMessageHashes(identityKey) { - const key = normalizePaperIngestIdentityKey(identityKey); - const root = readRoot(); - const list = root[key]; - if (!Array.isArray(list)) { - return []; - } - return list.filter((h) => typeof h === "string" && h); -} - -/** - * @param {unknown} identityKey - * @param {unknown} messageHash - * @returns {boolean} - */ -export function isPaperMessageIngested(identityKey, messageHash) { - const hash = normalizePaperIngestMessageHash(messageHash); - if (!hash) { - return false; - } - return listIngestedPaperMessageHashes(identityKey).includes(hash); -} - -/** - * @param {unknown} identityKey - * @param {unknown} messageHash - * @returns {string[]} updated list for that identity - */ -export function markPaperMessageIngested(identityKey, messageHash) { - const key = normalizePaperIngestIdentityKey(identityKey); - const hash = normalizePaperIngestMessageHash(messageHash); - if (!hash) { - return listIngestedPaperMessageHashes(identityKey); - } - const root = readRoot(); - const prev = Array.isArray(root[key]) ? root[key].filter((h) => typeof h === "string" && h) : []; - if (prev.includes(hash)) { - return prev; - } - const next = [...prev, hash]; - while (next.length > MAX_HASHES_PER_IDENTITY) { - next.shift(); - } - root[key] = next; - writeRoot(root); - return next; -} - -/** - * Whether an ingest_uri result should mark the source bubble as ingested. - * @param {unknown} status - * @returns {boolean} - */ -export function shouldMarkPaperIngestFromResultStatus(status) { - return status === "success" || status === "info"; -} diff --git a/meshchatx/src/frontend/components/messages/conversationScroll.js b/meshchatx/src/frontend/components/messages/conversationScroll.js deleted file mode 100644 index f3f1b655e..000000000 --- a/meshchatx/src/frontend/components/messages/conversationScroll.js +++ /dev/null @@ -1,123 +0,0 @@ -/* SPDX-License-Identifier: 0BSD */ - -export const SCROLL_BOTTOM_EPS_PX = 8; - -export const LOAD_PREVIOUS_SCROLL_EDGE_PX = 500; - -/** - * True only when inverted scrollTop math applies: scrollTop 0 is the visual bottom (newest). - * - * That is the classic pattern where the *scrolling element* (or its direct child) is - * `flex-direction: column-reverse`. ConversationViewer now uses normal column flow for both - * virtual and non-virtual lists (oldest at top, newest at bottom), so this returns false there. - * @param {Element} container - * @returns {boolean} - */ -export function isScrollColumnReverse(container) { - if (!container) { - return false; - } - try { - if (getComputedStyle(container).flexDirection === "column-reverse") { - return true; - } - const inner = container.firstElementChild; - if (!inner) { - return false; - } - return getComputedStyle(inner).flexDirection === "column-reverse"; - } catch { - return false; - } -} - -/** - * Maximum valid scrollTop for a scroll container. - * @param {Element} container - * @returns {number} - */ -export function maxScrollTop(container) { - if (!container) { - return 0; - } - return Math.max(0, container.scrollHeight - container.clientHeight); -} - -/** - * Whether the viewport is within thresholdPx of the visual bottom (newest messages). - * @param {Element} container - * @param {number} [thresholdPx] - * @returns {boolean} - */ -export function isNearBottom(container, thresholdPx = SCROLL_BOTTOM_EPS_PX) { - if (!container) { - return true; - } - if (isScrollColumnReverse(container)) { - return container.scrollTop <= thresholdPx; - } - const max = maxScrollTop(container); - return max - container.scrollTop <= thresholdPx; -} - -/** - * Sets scroll position to the visual bottom (newest messages). - * @param {Element} container - */ -export function scrollContainerToBottom(container) { - if (!container) { - return; - } - if (isScrollColumnReverse(container)) { - container.scrollTop = 0; - } else { - container.scrollTop = maxScrollTop(container); - } -} - -/** - * Clears stale scroll position when reusing the same scroll element for another thread. - * `scrollMessagesToBottom` / `scrollContainerToBottom` run after content is mounted. - * @param {Element | null | undefined} container - */ -export function resetMessagesScrollSurface(container) { - if (!container) { - return; - } - container.scrollTop = 0; -} - -/** - * When the scroll area has no inner content yet, `isScrollColumnReverse` is false and - * `isNearBottom` is misleading (empty scroller looks "at bottom"). Do not use it to settle. - * @param {Element | null | undefined} container - * @returns {boolean} - */ -export function canTrustScrollNearBottomHeuristic(container) { - return Boolean(container?.firstElementChild); -} - -/** - * Whether the user has scrolled into the region where older messages should be loaded. - * @param {Element} container - * @returns {boolean} - */ -export function shouldLoadPreviousMessages(container) { - if (!container) { - return false; - } - if (isScrollColumnReverse(container)) { - const max = maxScrollTop(container); - if (max <= 0) { - return false; - } - const st = container.scrollTop; - if (max - st > LOAD_PREVIOUS_SCROLL_EDGE_PX) { - return false; - } - // Short threads: `max - st` is small even at the visual bottom (newest), because `max` itself - // is small. Require leaving the bottom band so we do not auto-load in a loop while pinned there. - return st > SCROLL_BOTTOM_EPS_PX; - } - return container.scrollTop <= LOAD_PREVIOUS_SCROLL_EDGE_PX; -} diff --git a/meshchatx/src/frontend/components/messages/lxmf/contactDisplay.js b/meshchatx/src/frontend/components/messages/lxmf/contactDisplay.js deleted file mode 100644 index be62af38a..000000000 --- a/meshchatx/src/frontend/components/messages/lxmf/contactDisplay.js +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -import Utils from "../../../js/Utils.js"; - -export function lxmfDeliveryDestinationHexFromContact(contact) { - if (!contact) return ""; - const order = [contact.remote_destination_hash, contact.lxmf_address, contact.remote_identity_hash]; - for (const c of order) { - const h = Utils.normalizeMeshchatHashHex(c); - if (h) { - return h; - } - } - return ""; -} - -export function lxmfContactResolvedIcon(contact, conversations = []) { - const empty = { iconName: "", foreground: "", background: "" }; - if (!contact) { - return empty; - } - const ri = contact.remote_icon; - if (ri?.icon_name) { - return { - iconName: ri.icon_name, - foreground: ri.foreground_colour || "", - background: ri.background_colour || "", - }; - } - const dest = lxmfDeliveryDestinationHexFromContact(contact); - if (!dest) { - return empty; - } - const conv = - (conversations || []).find((c) => Utils.normalizeMeshchatHashHex(c.destination_hash || "") === dest) || null; - const lu = conv?.lxmf_user_icon; - if (lu?.icon_name) { - return { - iconName: lu.icon_name, - foreground: lu.foreground_colour || "", - background: lu.background_colour || "", - }; - } - return empty; -} diff --git a/meshchatx/src/frontend/components/messages/lxmf/normalize.js b/meshchatx/src/frontend/components/messages/lxmf/normalize.js deleted file mode 100644 index 2b07e4f77..000000000 --- a/meshchatx/src/frontend/components/messages/lxmf/normalize.js +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: 0BSD - -export function normalizeLxmfMessage(msg, isOutbound) { - const normalized = { ...msg }; - if (!normalized.created_at && normalized.timestamp) { - normalized.created_at = new Date(normalized.timestamp * 1000).toISOString(); - } - if (isOutbound && normalized.state === "unknown") { - normalized.state = "outbound"; - } - return normalized; -} - -export function normalizeSidebandCommandKey(key) { - const raw = String(key ?? "").trim(); - if (!raw) { - return null; - } - const known = { - plugin: "0x00", - telemetry_request: "0x01", - request: "0x01", - location_request: "0x01", - ping: "0x02", - echo: "0x03", - signal_report: "0x04", - }; - if (Object.prototype.hasOwnProperty.call(known, raw.toLowerCase())) { - return known[raw.toLowerCase()]; - } - if (/^\d+$/.test(raw)) { - const n = Number.parseInt(raw, 10); - if (Number.isInteger(n) && n >= 0 && n <= 255) { - return `0x${n.toString(16).padStart(2, "0")}`; - } - } - if (/^0x[0-9a-f]{1,2}$/i.test(raw)) { - return `0x${raw.slice(2).toLowerCase().padStart(2, "0")}`; - } - return null; -} diff --git a/meshchatx/src/frontend/components/messages/messageListVirtual.js b/meshchatx/src/frontend/components/messages/messageListVirtual.js deleted file mode 100644 index 2c000bc0b..000000000 --- a/meshchatx/src/frontend/components/messages/messageListVirtual.js +++ /dev/null @@ -1,80 +0,0 @@ -export const MIN_VIRTUAL_DISPLAY_GROUPS = 48; - -/** - * Display groups from {@link selectedPeerChatDisplayGroups} are newest-first. - * Virtual + normal document flow use oldest at the top (index 0). - * @param {unknown[]} displayGroups - * @returns {unknown[]} - */ -export function displayGroupsOldestFirst(displayGroups) { - if (!displayGroups?.length) { - return []; - } - return displayGroups.slice().reverse(); -} - -/** - * Initial row height guess before measureElement runs (variable-height rows). - * @param {unknown} entry - * @returns {number} - */ -export function estimateGroupHeight(entry) { - if (!entry || typeof entry !== "object") { - return 96; - } - if (entry.type === "dateDivider") { - return 44; - } - if (entry.type === "imageGroup") { - return 340; - } - const msg = entry.chatItem?.lxmf_message; - const fields = msg?.fields; - if (fields?.image && !fields?.file_attachments?.length && !fields?.audio) { - return 280; - } - let height = 88; - const content = (msg?.content || "").trim(); - if (content) { - height += Math.min(160, Math.ceil(content.length / 40) * 18); - } - const fileCount = Array.isArray(fields?.file_attachments) ? fields.file_attachments.length : 0; - if (fileCount > 0) { - height += fileCount * 56; - } - if (fields?.audio) { - height += 72; - } - if (fields?.telemetry || fields?.telemetry_stream || fields?.commands?.length) { - height += 48; - } - return height; -} - -/** - * @param {unknown[]} groupsOldestFirst - * @param {string} hash - * @returns {number} - */ -export function findDisplayGroupIndexForMessageHash(groupsOldestFirst, hash) { - if (!groupsOldestFirst?.length || !hash) { - return -1; - } - for (let i = 0; i < groupsOldestFirst.length; i++) { - const g = groupsOldestFirst[i]; - if (!g || typeof g !== "object") { - continue; - } - if (g.type === "dateDivider") { - continue; - } - if (g.type === "imageGroup" && Array.isArray(g.items)) { - if (g.items.some((it) => it?.lxmf_message?.hash === hash)) { - return i; - } - } else if (g.type === "single" && g.chatItem?.lxmf_message?.hash === hash) { - return i; - } - } - return -1; -} diff --git a/meshchatx/src/frontend/components/messages/modals/ConversationImageModal.vue b/meshchatx/src/frontend/components/messages/modals/ConversationImageModal.vue deleted file mode 100644 index 39d9ed8c5..000000000 --- a/meshchatx/src/frontend/components/messages/modals/ConversationImageModal.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/modals/PaperMessageModal.vue b/meshchatx/src/frontend/components/messages/modals/PaperMessageModal.vue deleted file mode 100644 index 06f15ab34..000000000 --- a/meshchatx/src/frontend/components/messages/modals/PaperMessageModal.vue +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/messages/modals/ShareContactModal.vue b/meshchatx/src/frontend/components/messages/modals/ShareContactModal.vue deleted file mode 100644 index 94092275a..000000000 --- a/meshchatx/src/frontend/components/messages/modals/ShareContactModal.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/outbound/OutboundTransferProgressFooter.vue b/meshchatx/src/frontend/components/messages/outbound/OutboundTransferProgressFooter.vue deleted file mode 100644 index 168b73118..000000000 --- a/meshchatx/src/frontend/components/messages/outbound/OutboundTransferProgressFooter.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/telemetry/TelemetryBatteryChart.vue b/meshchatx/src/frontend/components/messages/telemetry/TelemetryBatteryChart.vue deleted file mode 100644 index f4ef0f29f..000000000 --- a/meshchatx/src/frontend/components/messages/telemetry/TelemetryBatteryChart.vue +++ /dev/null @@ -1,244 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/telemetry/TelemetryHistoryListItem.vue b/meshchatx/src/frontend/components/messages/telemetry/TelemetryHistoryListItem.vue deleted file mode 100644 index 35241272a..000000000 --- a/meshchatx/src/frontend/components/messages/telemetry/TelemetryHistoryListItem.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/messages/telemetry/TelemetryHistoryModal.vue b/meshchatx/src/frontend/components/messages/telemetry/TelemetryHistoryModal.vue deleted file mode 100644 index 5fc387771..000000000 --- a/meshchatx/src/frontend/components/messages/telemetry/TelemetryHistoryModal.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue b/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue deleted file mode 100644 index 1d7c9a10c..000000000 --- a/meshchatx/src/frontend/components/micron-editor/MicronEditorPage.vue +++ /dev/null @@ -1,1565 +0,0 @@ - - - - - - - - - diff --git a/meshchatx/src/frontend/components/micron-editor/PublishSiteModal.vue b/meshchatx/src/frontend/components/micron-editor/PublishSiteModal.vue deleted file mode 100644 index 1a13ef6b4..000000000 --- a/meshchatx/src/frontend/components/micron-editor/PublishSiteModal.vue +++ /dev/null @@ -1,290 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue b/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue deleted file mode 100644 index 97dcb426b..000000000 --- a/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiser.vue +++ /dev/null @@ -1,1993 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiserPage.vue b/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiserPage.vue deleted file mode 100644 index 233b890e6..000000000 --- a/meshchatx/src/frontend/components/network-visualiser/NetworkVisualiserPage.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserLegend.vue b/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserLegend.vue deleted file mode 100644 index 4dce77437..000000000 --- a/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserLegend.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserLoadingOverlay.vue b/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserLoadingOverlay.vue deleted file mode 100644 index fec8351aa..000000000 --- a/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserLoadingOverlay.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserToolbar.vue b/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserToolbar.vue deleted file mode 100644 index 9d059282c..000000000 --- a/meshchatx/src/frontend/components/network-visualiser/internal/NetworkVisualiserToolbar.vue +++ /dev/null @@ -1,478 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/network-visualiser/internal/hopMaxFilterSliderMap.js b/meshchatx/src/frontend/components/network-visualiser/internal/hopMaxFilterSliderMap.js deleted file mode 100644 index 03c2ea680..000000000 --- a/meshchatx/src/frontend/components/network-visualiser/internal/hopMaxFilterSliderMap.js +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: 0BSD AND MIT - -/** Rightmost slider index: no hop limit (show all paths). */ -export const HOP_SLIDER_POS_ALL = 2047; - -const LOW_MAX_POS = 1599; -const TRAN_POS = 1600; -const HIGH_END_POS = 2046; - -/** - * @param {number} pos - * @returns {number|null} Inclusive max hops, or null when unlimited. - */ -export function hopSliderPosToMaxHops(pos) { - const p = Math.round(Number(pos)); - if (!Number.isFinite(p) || p >= HOP_SLIDER_POS_ALL) return null; - if (p <= LOW_MAX_POS) { - return Math.min(32, Math.round((p / LOW_MAX_POS) * 32)); - } - if (p >= HIGH_END_POS) return 128; - const span = HIGH_END_POS - TRAN_POS; - const frac = span > 0 ? (p - TRAN_POS) / span : 1; - return Math.min(128, Math.max(33, Math.round(33 + frac * (128 - 33)))); -} - -/** - * @param {number|null|undefined} maxHops null = unlimited - * @returns {number} Slider position 0 .. HOP_SLIDER_POS_ALL - */ -export function hopMaxHopsToSliderPos(maxHops) { - if (maxHops === null || maxHops === undefined) return HOP_SLIDER_POS_ALL; - const h = Math.max(0, Math.min(128, Math.round(Number(maxHops)))); - if (h <= 32) { - return Math.round((h / 32) * LOW_MAX_POS); - } - const span = HIGH_END_POS - TRAN_POS; - return Math.min(HIGH_END_POS, TRAN_POS + Math.round(((h - 33) / (128 - 33)) * span)); -} diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadBrowserContextMenu.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadBrowserContextMenu.vue deleted file mode 100644 index c29a3ce2f..000000000 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadBrowserContextMenu.vue +++ /dev/null @@ -1,138 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadCrashTab.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadCrashTab.vue deleted file mode 100644 index d5da3d52f..000000000 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadCrashTab.vue +++ /dev/null @@ -1,905 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkBrowser.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkBrowser.vue deleted file mode 100644 index f8fa0fd75..000000000 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkBrowser.vue +++ /dev/null @@ -1,857 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue deleted file mode 100644 index 2d7d2ca55..000000000 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue +++ /dev/null @@ -1,4530 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue deleted file mode 100644 index 009cf98c5..000000000 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkSidebar.vue +++ /dev/null @@ -1,1715 +0,0 @@ - - - - - - - diff --git a/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue b/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue deleted file mode 100644 index 1f2f8a87c..000000000 --- a/meshchatx/src/frontend/components/page-nodes/PageNodesPage.vue +++ /dev/null @@ -1,827 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/ping/PingPage.vue b/meshchatx/src/frontend/components/ping/PingPage.vue deleted file mode 100644 index 5a67687e6..000000000 --- a/meshchatx/src/frontend/components/ping/PingPage.vue +++ /dev/null @@ -1,345 +0,0 @@ - - - - - diff --git a/meshchatx/src/frontend/components/plugins/PluginHtmlFrame.vue b/meshchatx/src/frontend/components/plugins/PluginHtmlFrame.vue deleted file mode 100644 index d558d8c08..000000000 --- a/meshchatx/src/frontend/components/plugins/PluginHtmlFrame.vue +++ /dev/null @@ -1,89 +0,0 @@ - - -