diff --git a/meshchatx/src/frontend/components/blocked/BlockedPage.vue b/meshchatx/src/frontend/components/blocked/BlockedPage.vue
index 8777fa5..f8d9ac9 100644
--- a/meshchatx/src/frontend/components/blocked/BlockedPage.vue
+++ b/meshchatx/src/frontend/components/blocked/BlockedPage.vue
@@ -43,7 +43,10 @@
+
"{{ identity.rns_reason }}"
{
if (identity.identity_hash.toLowerCase().includes(query)) return true;
if ((identity.display_name || "").toLowerCase().includes(query)) return true;
- return identity.blocked_destinations.some((d) =>
- d.destination_hash.toLowerCase().includes(query)
- );
+ return identity.blocked_destinations.some((d) => d.destination_hash.toLowerCase().includes(query));
});
},
},
@@ -313,7 +320,9 @@ export default {
async onUnblock(identity) {
if (
!(await DialogUtils.confirm(
- this.$t("banishment.lift_banishment_confirm", { name: identity.display_name || identity.identity_hash })
+ this.$t("banishment.lift_banishment_confirm", {
+ name: identity.display_name || identity.identity_hash,
+ })
))
) {
return;
@@ -321,9 +330,10 @@ export default {
try {
// Use the first blocked destination hash, or fall back to identity hash
- const targetHash = identity.blocked_destinations.length > 0
- ? identity.blocked_destinations[0].destination_hash
- : identity.identity_hash;
+ const targetHash =
+ identity.blocked_destinations.length > 0
+ ? identity.blocked_destinations[0].destination_hash
+ : identity.identity_hash;
await window.api.delete(`/api/v1/blocked-destinations/${targetHash}`);
await this.loadBlockedDestinations();
diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
index 39c42c2..9cb185b 100644
--- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
+++ b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue
@@ -1962,6 +1962,16 @@ export default {
}
}
+ // parse relative page/file urls (e.g. /file/artifact`g=reticulum|r=lxmf)
+ if (url.startsWith("/page/") || url.startsWith("/file/")) {
+ const queryIndex = url.indexOf("?");
+ return {
+ destination_hash: null,
+ path: queryIndex >= 0 ? url.substring(0, queryIndex) : url,
+ query: queryIndex >= 0 ? url.substring(queryIndex + 1) : null,
+ };
+ }
+
// parse node id only
if (url.length === 32) {
return {
diff --git a/meshchatx/src/frontend/js/NomadPageRenderer.js b/meshchatx/src/frontend/js/NomadPageRenderer.js
index 11d8f36..5493eb9 100644
--- a/meshchatx/src/frontend/js/NomadPageRenderer.js
+++ b/meshchatx/src/frontend/js/NomadPageRenderer.js
@@ -160,6 +160,15 @@ export function isolateNomadLinksInHtml(html, destinationHash) {
a.classList.add("nomadnet-link", "text-blue-600", "dark:text-blue-400", "hover:underline");
} else {
a.setAttribute("href", "#");
+ // For micron parser links with data-destination, update title so hover shows the full URL
+ const dataDest = a.getAttribute("data-destination");
+ if (dataDest) {
+ let titleUrl = dataDest.trim();
+ if (!/^[a-f0-9]{32}:/i.test(titleUrl)) {
+ titleUrl = `${dh}:${titleUrl.startsWith(":") ? titleUrl.slice(1) : titleUrl}`;
+ }
+ a.setAttribute("title", titleUrl);
+ }
}
a.removeAttribute("target");
a.removeAttribute("rel");