/** * Shared URL allow-list for the card family (AgendaCard, MessageCard, * NotificationCard, TaskCard, …). Lifted from the per-card `isSafe*Url` * duplicates so every entity card guards deep links the same way. * * Only http(s) absolute URLs, single-leading-slash same-origin paths, and * in-page hash anchors pass. Protocol-relative (`//host`), `javascript:`, * `data:`, and `mailto:` URLs are rejected — an unsafe URL makes the card * fall back to a `