Packages
corex
0.1.1
0.1.2
0.1.1
0.1.0
0.1.0-rc.1
0.1.0-rc.0
0.1.0-beta.5
0.1.0-beta.4
0.1.0-beta.3
0.1.0-beta.2
0.1.0-beta.1
0.1.0-alpha.33
0.1.0-alpha.32
0.1.0-alpha.31
0.1.0-alpha.30
0.1.0-alpha.29
0.1.0-alpha.28
0.1.0-alpha.27
0.1.0-alpha.26
0.1.0-alpha.25
0.1.0-alpha.24
0.1.0-alpha.23
0.1.0-alpha.22
0.1.0-alpha.21
0.1.0-alpha.20
0.1.0-alpha.19
0.1.0-alpha.18
0.1.0-alpha.17
0.1.0-alpha.16
0.1.0-alpha.15
0.1.0-alpha.14
0.1.0-alpha.13
0.1.0-alpha.12
0.1.0-alpha.11
0.1.0-alpha.10
0.1.0-alpha.9
0.1.0-alpha.8
0.1.0-alpha.7
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
Accessible and unstyled UI components library written in Elixir and TypeScript that integrates Zag.js state machines into the Phoenix Framework.
Current section
Files
Jump to
Current section
Files
priv/static/chunks/chunk-HZLPIQBD.mjs
// lib/redirect.ts
var REDIRECT_MODES = ["href", "patch", "navigate"];
var SCHEME_PREFIX = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;
function isAllowedRedirectDestination(destination) {
const trimmed = destination.trim();
if (!trimmed) return false;
if (trimmed.startsWith("//")) return false;
const schemeMatch = SCHEME_PREFIX.exec(trimmed);
if (schemeMatch) {
const scheme = schemeMatch[0].slice(0, -1).toLowerCase();
return scheme === "http" || scheme === "https";
}
return true;
}
function readDomItemRedirect(itemEl, fallback) {
if (!itemEl) {
if (!fallback || !isAllowedRedirectDestination(fallback)) return null;
return { destination: fallback };
}
const dataRedirect = itemEl.getAttribute("data-redirect");
if (dataRedirect === "false") return null;
const destination = itemEl.getAttribute("data-to") || fallback || itemEl.getAttribute("data-value") || "";
if (!destination || !isAllowedRedirectDestination(destination)) return null;
const mode = REDIRECT_MODES.includes(dataRedirect) ? dataRedirect : void 0;
const newTab = itemEl.hasAttribute("data-new-tab");
return { destination, mode, newTab };
}
function performRedirect(input, ctx) {
if (!input || !input.destination || !isAllowedRedirectDestination(input.destination))
return false;
const { destination, newTab, mode } = input;
if (newTab) {
window.open(destination, "_blank", "noopener,noreferrer");
return true;
}
const main = ctx.liveSocket.main;
const connected = !main.isDead && main.isConnected();
if (!connected || !mode || mode === "href") {
window.location.href = destination;
return true;
}
const js = ctx.liveSocket.js();
if (mode === "patch") {
js.patch(destination);
} else {
js.navigate(destination);
}
return true;
}
export {
isAllowedRedirectDestination,
readDomItemRedirect,
performRedirect
};