@damian-buho/support-ukraine 1.3.3 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,6 +11,7 @@ SPDX-License-Identifier: MIT
11
11
  ![NPM Downloads](https://img.shields.io/npm/dm/%40damian-buho%2Fsupport-ukraine?style=flat-square)
12
12
  ![NPM License](https://img.shields.io/npm/l/%40damian-buho%2Fsupport-ukraine?style=flat-square)
13
13
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
14
+ ![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/damian-buho/support-ukraine)
14
15
 
15
16
  [![Pipeline](https://github.com/damian-buho/support-ukraine/actions/workflows/pipeline.yaml/badge.svg)](https://github.com/damian-buho/support-ukraine/actions/workflows/pipeline.yaml)
16
17
  [![CodeQL](https://github.com/damian-buho/support-ukraine/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/damian-buho/support-ukraine/actions/workflows/github-code-scanning/codeql)
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var j=["military","humanitarian","animals"];function p(e,t){if(!e)throw new Error(t)}function h(e,t){p(typeof e=="string",`${t} must be a string`),p(e.length>0,`${t} must not be empty`)}function G(e,t){h(e,t);try{new URL(e)}catch{throw new Error(`${t} must be a valid URL`)}}function J(e){return p(j.includes(e),`Invalid tag: ${String(e)}. Must be one of: ${j.join(", ")}`),e}function O(e){p(e!==null&&typeof e=="object","Charity must be an object");let t=e;return h(t.id,"id"),h(t.name,"name"),h(t.tagline,"tagline"),G(t.url,"url"),p(Array.isArray(t.tags),"tags must be an array"),p(t.tags.length>0,"tags must not be empty"),{id:t.id,name:t.name,tagline:t.tagline,url:t.url,tags:t.tags.map(r=>J(r))}}var W={parse:O},U={parse(e){return p(Array.isArray(e),"Charities must be an array"),e.map(t=>O(t))}};var I=[{id:"united24",name:"United24",tagline:"Official fundraising platform of Ukraine",url:"https://u24.gov.ua",tags:["humanitarian"]},{id:"come-back-alive",name:"Come Back Alive",tagline:"Supporting the Ukrainian Armed Forces since 2014",url:"https://www.comebackalive.in.ua",tags:["military"]},{id:"razom-for-ukraine",name:"Razom for Ukraine",tagline:"Emergency response and humanitarian aid",url:"https://www.razomforukraine.org",tags:["humanitarian"]},{id:"ukrainian-red-cross",name:"Ukrainian Red Cross",tagline:"Humanitarian assistance in conflict zones",url:"https://redcross.org.ua/en/",tags:["humanitarian"]},{id:"nova-ukraine",name:"Nova Ukraine",tagline:"Humanitarian aid and advocacy",url:"https://novaukraine.org",tags:["humanitarian"]},{id:"voices-of-children",name:"Voices of Children",tagline:"Psychological support for children affected by war",url:"https://voices.org.ua/en/",tags:["humanitarian"]},{id:"prytula-foundation",name:"Prytula Foundation",tagline:"Defence technology and equipment for Ukraine",url:"https://prytulafoundation.org/en",tags:["military"]},{id:"army-of-drones",name:"Army of Drones",tagline:"Reconnaissance drones for the frontline",url:"https://armyofdrones.com",tags:["military"]},{id:"world-central-kitchen",name:"World Central Kitchen",tagline:"Fresh meals for people in conflict zones",url:"https://wck.org/relief/activation-chefs-for-ukraine/",tags:["humanitarian"]},{id:"cats-of-kyiv",name:"Cats of Kyiv",tagline:"Cat shelter rescuing and rehoming cats in Kyiv",url:"https://cats.kiev.ua",tags:["animals"]},{id:"uanimals",name:"UAnimals",tagline:"Animal rescue and advocacy organization in Ukraine",url:"https://uanimals.org",tags:["animals"]},{id:"hospitallers",name:"Hospitallers",tagline:"Ukrainian voluntary paramedics providing first aid and evacuation",url:"https://www.hospitallers.org.uk",tags:["humanitarian"]},{id:"sternenko-fund",name:"Sternenko Fund",tagline:"FPV drone supply for Ukrainian defence forces",url:"https://www.sternenkofund.org",tags:["military"]},{id:"life-robots-ukraine",name:"Life Robots Ukraine",tagline:"Robots for demining Ukraine",url:"https://liferobots.com.ua",tags:["humanitarian"]},{id:"sirius-shelter",name:"Sirius",tagline:"Ukraine's largest animal shelter for dogs and cats",url:"https://dogcat.com.ua",tags:["animals"]},{id:"dignitas",name:"Dignitas",tagline:"Technology and support for Ukrainian defenders and veterans",url:"https://dignitas.fund",tags:["military"]},{id:"leleka",name:"Leleka Foundation",tagline:"Tactical medical supplies for Ukraine's frontline medics",url:"https://leleka.care/en",tags:["humanitarian"]},{id:"superhumans",name:"Superhumans Center",tagline:"Prosthetics, surgery, and rehabilitation for war survivors",url:"https://superhumans.com/en/",tags:["humanitarian"]}];var P=":host{display:block;margin:0;padding:0;border:none;font-size:16px;width:100%;min-height:2.5rem;line-height:1.4;box-sizing:border-box;z-index:2147483647}header.support-ukraine-block{margin:0;padding:0;border:none;border-radius:0;width:100%;min-height:2.5rem;display:flex;align-items:center;justify-content:center;font-family:system-ui,-apple-system,sans-serif;text-decoration:none;box-sizing:border-box;line-height:1.4;overflow:visible;background:#0057b7 none}@media(prefers-color-scheme: dark){header.support-ukraine-block{background-color:gold}}header.support-ukraine-block--shift,header.support-ukraine-block--replace{position:relative}header.support-ukraine-block--overlap{position:fixed;top:0;left:0}header.support-ukraine-block .support-ukraine-block__link{display:inline-flex;align-items:center;flex-wrap:wrap;gap:0 .25em;text-decoration:none;flex:1;height:100%;justify-content:flex-start;text-align:left;padding:.5rem 1rem;box-sizing:border-box;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}@media(prefers-color-scheme: dark){header.support-ukraine-block .support-ukraine-block__link{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}}header.support-ukraine-block .support-ukraine-block__link:hover{opacity:.9}header.support-ukraine-block .support-ukraine-block__flag{white-space:nowrap}header.support-ukraine-block .support-ukraine-block__prefix,header.support-ukraine-block .support-ukraine-block__info,header.support-ukraine-block .support-ukraine-block__colon,header.support-ukraine-block .support-ukraine-block__tagline{min-width:0}header.support-ukraine-block .support-ukraine-block__more{display:inline-flex;align-items:center;text-decoration:none;padding:.5rem 1rem;box-sizing:border-box;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4);white-space:nowrap;opacity:.8}@media(prefers-color-scheme: dark){header.support-ukraine-block .support-ukraine-block__more{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}}header.support-ukraine-block .support-ukraine-block__more:hover{opacity:1}header.support-ukraine-block .support-ukraine-block__more-ellipsis{display:none}header.support-ukraine-block .support-ukraine-block__name{font-weight:bold}@media(max-width: 58rem){header.support-ukraine-block .support-ukraine-block__prefix,header.support-ukraine-block .support-ukraine-block__name,header.support-ukraine-block .support-ukraine-block__colon,header.support-ukraine-block .support-ukraine-block__more{display:none}}@media(max-width: 35rem){header.support-ukraine-block .support-ukraine-block__name,header.support-ukraine-block .support-ukraine-block__colon{display:initial}header.support-ukraine-block .support-ukraine-block__tagline{display:none}}[dir=rtl] header.support-ukraine-block .support-ukraine-block__link{text-align:right;justify-content:flex-end}[dir=rtl] header.support-ukraine-block .support-ukraine-block__more{text-align:right}:host-context([data-theme=dark]) header.support-ukraine-block{background-color:gold}:host-context([data-theme=dark]) header.support-ukraine-block .support-ukraine-block__link{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}:host-context([data-theme=dark]) header.support-ukraine-block .support-ukraine-block__more{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}:host-context([data-theme=light]) header.support-ukraine-block{background-color:#0057b7}:host-context([data-theme=light]) header.support-ukraine-block .support-ukraine-block__link{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}:host-context([data-theme=light]) header.support-ukraine-block .support-ukraine-block__more{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}";var $={en:()=>import("./en-XEYUXDZC.js"),es:()=>import("./es-2TNXRX7L.js"),fr:()=>import("./fr-WYUY4RVW.js"),de:()=>import("./de-UQQGP72D.js"),pt:()=>import("./pt-CUUZBCTW.js"),it:()=>import("./it-CLJVALSB.js"),pl:()=>import("./pl-XURP2KRF.js"),nl:()=>import("./nl-UEAZGDNS.js"),sv:()=>import("./sv-2OAYXTBX.js"),uk:()=>import("./uk-ROGYZ5DP.js"),ar:()=>import("./ar-DFGXHOXS.js"),zh:()=>import("./zh-XNBYUOPO.js"),hi:()=>import("./hi-W4VOU6QX.js"),th:()=>import("./th-INAFEQUW.js"),ja:()=>import("./ja-UCBCB3HB.js"),ko:()=>import("./ko-IA3NH3I4.js")},A=["ar"];function c(e){let t=(e.split("-",1)[0]??"").toLowerCase();return Object.hasOwn($,t)?t:"en"}var B=new Map;function R(e){if(e)return c(e);if(typeof navigator<"u"&&navigator.languages)for(let t of navigator.languages){let r=c(t);if(r!=="en")return r}if(typeof navigator<"u"&&navigator.language){let t=c(navigator.language);if(t!=="en")return t}return"en"}async function k(e){let t=c(e),r=B.get(t);if(r)return r;try{let n=await $[t]();return B.set(t,n.default),n.default}catch{if(t!=="en")return k("en");throw new Error(`[support-ukraine] Failed to load locale "${t}"`)}}function z(e,t){return e.map(r=>{let n=t.charities[r.id];return n?.tagline?{...r,tagline:n.tagline}:r})}function M(e){let t=c(e);return A.includes(t)}function X(e,t){return`\u{1F1FA}\u{1F1E6} ${t.supportUkraine} ${e.name}: ${e.tagline}`}var Y=U.parse(I),a="support-ukraine-block",H="support-ukraine-seen";function Q(){try{let e=localStorage.getItem(H);return e?new Set(JSON.parse(e)):new Set}catch{return new Set}}function Z(e){try{localStorage.setItem(H,JSON.stringify([...e]))}catch{}}function D(e){let t=Q();e(t),Z(t)}function ee(e){if(e.length===0)throw new Error("randomItem: cannot pick from an empty array");return e[Math.floor(Math.random()*e.length)]}function te(e){let t=`${a}-styles`;if(e.querySelector(`#${t}`))return;let r=e.ownerDocument.createElement("style");r.id=t,r.textContent=P,e.append(r)}async function de(e={}){let{mode:t="shift",fontSize:r="0.875rem",tags:n,dontRepeat:F=!0,isInConsole:q=!0,locale:K}=e,f=R(K),b=await k(f),y=z(Y,b),d=n&&n.length>0?y.filter(o=>o.tags.some(g=>n.includes(g))):y;d.length===0&&(d=y),F&&D(o=>{let g=d.filter(V=>!o.has(V.url));g.length>0?d=g:o.clear()});let i=ee(d);F&&D(o=>{o.add(i.url)});let m=document.createElement("div"),N=m.attachShadow({mode:"open"});te(N);let u=document.createElement("header");u.className=`${a} ${a}--${t}`,u.lang=f,M(f)&&u.setAttribute("dir","rtl");let s=document.createElement("a");s.className=`${a}__link`,s.href=i.url,s.target="_blank",s.rel="noopener noreferrer",s.style.fontSize=r;let x=document.createElement("span");x.className=`${a}__flag`,x.textContent="\u{1F1FA}\u{1F1E6} ";let _=document.createElement("span");_.className=`${a}__prefix`,_.textContent=`${b.supportUkraine} `;let w=document.createElement("span");w.className=`${a}__info`;let S=document.createElement("span");S.className=`${a}__name`,S.textContent=i.name;let L=document.createElement("span");L.className=`${a}__colon`,L.textContent=": ";let C=document.createElement("span");C.className=`${a}__tagline`,C.textContent=i.tagline,w.append(S,L,C),s.append(x,_,w),u.append(s);let l=document.createElement("a");l.className=`${a}__more`,l.href="https://damian-buho.github.io/support-ukraine/",l.target="_blank",l.rel="noopener noreferrer",l.style.fontSize=r;let v=document.createElement("span");v.className=`${a}__more-text`,v.textContent=b.more;let E=document.createElement("span");E.className=`${a}__more-ellipsis`,E.textContent="\u2026",l.append(v,E),u.append(l),N.append(u);let T=e.element??document.body;if(t==="replace"){let o=T.querySelector(`header.${a}`);o?o.replaceWith(m):T.prepend(m)}else T.prepend(m);return q&&console.info("[support-ukraine] banner",`${i.name}: ${i.tagline}`,i.url),m}export{Y as DEFAULT_CHARITIES,A as RTL_LOCALES,U as charitiesSchema,W as charitySchema,R as detectLocale,X as formatBannerText,M as isRTL,k as loadLocale,z as mergeCharities,ee as randomItem,c as resolveLocale,de as supportUkraineBlock};
1
+ var D=["military","humanitarian","animals"];function c(t,e){if(!t)throw new Error(e)}function b(t,e){c(typeof t=="string",`${e} must be a string`),c(t.length>0,`${e} must not be empty`)}function ee(t,e){b(t,e);try{new URL(t)}catch{throw new Error(`${e} must be a valid URL`)}}function te(t){return c(D.includes(t),`Invalid tag: ${String(t)}. Must be one of: ${D.join(", ")}`),t}function q(t){c(t!==null&&typeof t=="object","Charity must be an object");let e=t;return b(e.id,"id"),b(e.name,"name"),b(e.tagline,"tagline"),ee(e.url,"url"),c(Array.isArray(e.tags),"tags must be an array"),c(e.tags.length>0,"tags must not be empty"),{id:e.id,name:e.name,tagline:e.tagline,url:e.url,tags:e.tags.map(r=>te(r))}}var re={parse:q},A={parse(t){return c(Array.isArray(t),"Charities must be an array"),t.map(e=>q(e))}};var G=[{id:"united24",name:"United24",tagline:"Official fundraising platform of Ukraine",url:"https://u24.gov.ua",tags:["humanitarian"]},{id:"come-back-alive",name:"Come Back Alive",tagline:"Supporting the Ukrainian Armed Forces since 2014",url:"https://www.comebackalive.in.ua",tags:["military"]},{id:"razom-for-ukraine",name:"Razom for Ukraine",tagline:"Emergency response and humanitarian aid",url:"https://www.razomforukraine.org",tags:["humanitarian"]},{id:"ukrainian-red-cross",name:"Ukrainian Red Cross",tagline:"Humanitarian assistance in conflict zones",url:"https://redcross.org.ua/en/",tags:["humanitarian"]},{id:"nova-ukraine",name:"Nova Ukraine",tagline:"Humanitarian aid and advocacy",url:"https://novaukraine.org",tags:["humanitarian"]},{id:"voices-of-children",name:"Voices of Children",tagline:"Psychological support for children affected by war",url:"https://voices.org.ua/en/",tags:["humanitarian"]},{id:"prytula-foundation",name:"Prytula Foundation",tagline:"Defence technology and equipment for Ukraine",url:"https://prytulafoundation.org/en",tags:["military"]},{id:"army-of-drones",name:"Army of Drones",tagline:"Reconnaissance drones for the frontline",url:"https://armyofdrones.com",tags:["military"]},{id:"world-central-kitchen",name:"World Central Kitchen",tagline:"Fresh meals for people in conflict zones",url:"https://wck.org/relief/activation-chefs-for-ukraine/",tags:["humanitarian"]},{id:"cats-of-kyiv",name:"Cats of Kyiv",tagline:"Cat shelter rescuing and rehoming cats in Kyiv",url:"https://cats.kiev.ua",tags:["animals"]},{id:"uanimals",name:"UAnimals",tagline:"Animal rescue and advocacy organization in Ukraine",url:"https://uanimals.org",tags:["animals"]},{id:"hospitallers",name:"Hospitallers",tagline:"Ukrainian voluntary paramedics providing first aid and evacuation",url:"https://www.hospitallers.org.uk",tags:["humanitarian"]},{id:"sternenko-fund",name:"Sternenko Fund",tagline:"FPV drone supply for Ukrainian defence forces",url:"https://www.sternenkofund.org",tags:["military"]},{id:"life-robots-ukraine",name:"Life Robots Ukraine",tagline:"Robots for demining Ukraine",url:"https://liferobots.com.ua",tags:["humanitarian"]},{id:"sirius-shelter",name:"Sirius",tagline:"Ukraine's largest animal shelter for dogs and cats",url:"https://dogcat.com.ua",tags:["animals"]},{id:"dignitas",name:"Dignitas",tagline:"Technology and support for Ukrainian defenders and veterans",url:"https://dignitas.fund",tags:["military"]},{id:"leleka",name:"Leleka Foundation",tagline:"Tactical medical supplies for Ukraine's frontline medics",url:"https://leleka.care/en",tags:["humanitarian"]},{id:"superhumans",name:"Superhumans Center",tagline:"Prosthetics, surgery, and rehabilitation for war survivors",url:"https://superhumans.com/en/",tags:["humanitarian"]}];var K=":host{display:block;margin:0;padding:0;border:none;font-size:16px;width:100%;min-height:2.5rem;line-height:1.4;box-sizing:border-box;z-index:2147483647}header.support-ukraine-block{margin:0;padding:0;border:none;border-radius:0;width:100%;min-height:2.5rem;display:flex;align-items:center;justify-content:center;font-family:system-ui,-apple-system,sans-serif;text-decoration:none;box-sizing:border-box;line-height:1.4;overflow:visible;background:#0057b7 none}@media(prefers-color-scheme: dark){header.support-ukraine-block{background-color:gold}}header.support-ukraine-block--shift,header.support-ukraine-block--replace{position:relative}header.support-ukraine-block--overlap{position:fixed;top:0;left:0}header.support-ukraine-block--refreshing .support-ukraine-block__link{opacity:0}header.support-ukraine-block .support-ukraine-block__link{display:inline-flex;align-items:center;flex-wrap:wrap;gap:0 .25em;text-decoration:none;flex:1;height:100%;justify-content:flex-start;text-align:left;padding:.5rem 1rem;box-sizing:border-box;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}@media(prefers-reduced-motion: no-preference){header.support-ukraine-block .support-ukraine-block__link{transition:opacity .2s ease-in-out}}@media(prefers-color-scheme: dark){header.support-ukraine-block .support-ukraine-block__link{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}}header.support-ukraine-block .support-ukraine-block__link:hover{opacity:.9}header.support-ukraine-block .support-ukraine-block__flag{white-space:nowrap}header.support-ukraine-block .support-ukraine-block__prefix,header.support-ukraine-block .support-ukraine-block__info,header.support-ukraine-block .support-ukraine-block__colon,header.support-ukraine-block .support-ukraine-block__tagline{min-width:0}header.support-ukraine-block .support-ukraine-block__more{display:inline-flex;align-items:center;text-decoration:none;padding:.5rem 1rem;box-sizing:border-box;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4);white-space:nowrap;opacity:.8}@media(prefers-color-scheme: dark){header.support-ukraine-block .support-ukraine-block__more{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}}header.support-ukraine-block .support-ukraine-block__more:hover{opacity:1}header.support-ukraine-block .support-ukraine-block__more-ellipsis{display:none}header.support-ukraine-block .support-ukraine-block__refresh{display:inline-flex;align-items:center;background:none;border:none;text-decoration:none;padding:.5rem .5rem .5rem 1rem;box-sizing:border-box;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4);white-space:nowrap;opacity:.8;cursor:pointer;font-size:inherit;line-height:1}@media(prefers-color-scheme: dark){header.support-ukraine-block .support-ukraine-block__refresh{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}}header.support-ukraine-block .support-ukraine-block__refresh:hover{opacity:1}header.support-ukraine-block .support-ukraine-block__name{font-weight:bold}@media(max-width: 58rem){header.support-ukraine-block .support-ukraine-block__prefix,header.support-ukraine-block .support-ukraine-block__name,header.support-ukraine-block .support-ukraine-block__colon,header.support-ukraine-block .support-ukraine-block__more,header.support-ukraine-block .support-ukraine-block__refresh{display:none}}@media(max-width: 35rem){header.support-ukraine-block .support-ukraine-block__name,header.support-ukraine-block .support-ukraine-block__colon{display:initial}header.support-ukraine-block .support-ukraine-block__tagline{display:none}}[dir=rtl] header.support-ukraine-block .support-ukraine-block__link{text-align:right;justify-content:flex-end}[dir=rtl] header.support-ukraine-block .support-ukraine-block__more{text-align:right}[dir=rtl] header.support-ukraine-block .support-ukraine-block__refresh{text-align:right}:host-context([data-theme=dark]) header.support-ukraine-block{background-color:gold}:host-context([data-theme=dark]) header.support-ukraine-block .support-ukraine-block__link{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}:host-context([data-theme=dark]) header.support-ukraine-block .support-ukraine-block__more{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}:host-context([data-theme=dark]) header.support-ukraine-block .support-ukraine-block__refresh{color:#000;text-shadow:0 1px 2px rgba(255,255,255,.4)}:host-context([data-theme=light]) header.support-ukraine-block{background-color:#0057b7}:host-context([data-theme=light]) header.support-ukraine-block .support-ukraine-block__link{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}:host-context([data-theme=light]) header.support-ukraine-block .support-ukraine-block__more{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}:host-context([data-theme=light]) header.support-ukraine-block .support-ukraine-block__refresh{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}";var z={en:()=>import("./en-XEYUXDZC.js"),es:()=>import("./es-2TNXRX7L.js"),fr:()=>import("./fr-WYUY4RVW.js"),de:()=>import("./de-UQQGP72D.js"),pt:()=>import("./pt-CUUZBCTW.js"),it:()=>import("./it-CLJVALSB.js"),pl:()=>import("./pl-XURP2KRF.js"),nl:()=>import("./nl-UEAZGDNS.js"),sv:()=>import("./sv-2OAYXTBX.js"),uk:()=>import("./uk-ROGYZ5DP.js"),ar:()=>import("./ar-DFGXHOXS.js"),zh:()=>import("./zh-XNBYUOPO.js"),hi:()=>import("./hi-W4VOU6QX.js"),th:()=>import("./th-INAFEQUW.js"),ja:()=>import("./ja-UCBCB3HB.js"),ko:()=>import("./ko-IA3NH3I4.js")},I=["ar"];function u(t){let e=(t.split("-",1)[0]??"").toLowerCase();return Object.hasOwn(z,e)?e:"en"}var V=new Map;function F(t){if(t)return u(t);if(typeof navigator<"u"&&navigator.languages)for(let e of navigator.languages){let r=u(e);if(r!=="en")return r}if(typeof navigator<"u"&&navigator.language){let e=u(navigator.language);if(e!=="en")return e}return"en"}async function y(t){let e=u(t),r=V.get(e);if(r)return r;try{let o=await z[e]();return V.set(e,o.default),o.default}catch{if(e!=="en")return y("en");throw new Error(`[support-ukraine] Failed to load locale "${e}"`)}}function M(t,e){return t.map(r=>{let o=e.charities[r.id];return o?.tagline?{...r,tagline:o.tagline}:r})}function N(t){let e=u(t);return I.includes(e)}function ae(t,e){return`\u{1F1FA}\u{1F1E6} ${e.supportUkraine} ${t.name}: ${t.tagline}`}var ne=A.parse(G),n="support-ukraine-block",Y="support-ukraine-seen",oe="\u27F3";function ie(){try{let t=localStorage.getItem(Y);return t?new Set(JSON.parse(t)):new Set}catch{return new Set}}function se(t){try{localStorage.setItem(Y,JSON.stringify([...t]))}catch{}}function J(t){let e=ie();t(e),se(e)}function le(t){if(t.length===0)throw new Error("randomItem: cannot pick from an empty array");return t[Math.floor(Math.random()*t.length)]}function W(t,e){let r=t;e&&J(p=>{let h=r.filter(x=>!p.has(x.url));h.length>0?r=h:p.clear()});let o=le(r);return e&&J(p=>{p.add(o.url)}),o}function pe(t){let e=`${n}-styles`;if(t.querySelector(`#${e}`))return;let r=t.ownerDocument.createElement("style");r.id=e,r.textContent=K,t.append(r)}async function xe(t={}){let{mode:e="shift",fontSize:r="0.875rem",tags:o,dontRepeat:p=!0,isInConsole:h=!0,showRefreshButton:x=!1,autoRefreshInterval:j=0,showRefreshAnimation:X=!1,locale:Q}=t,_=F(Q),w=await y(_),L=M(ne,w),k=o&&o.length>0?L.filter(a=>a.tags.some(Z=>o.includes(Z))):L;k.length===0&&(k=L);let d=W(k,p),m=document.createElement("div"),O=m.attachShadow({mode:"open"});pe(O);let i=document.createElement("header");i.className=`${n} ${n}--${e}`,i.lang=_,N(_)&&i.setAttribute("dir","rtl");let s=document.createElement("a");s.className=`${n}__link`,s.href=d.url,s.target="_blank",s.rel="noopener noreferrer",s.style.fontSize=r;let C=document.createElement("span");C.className=`${n}__flag`,C.textContent="\u{1F1FA}\u{1F1E6} ";let S=document.createElement("span");S.className=`${n}__prefix`,S.textContent=`${w.supportUkraine} `;let v=document.createElement("span");v.className=`${n}__info`;let g=document.createElement("span");g.className=`${n}__name`,g.textContent=d.name;let E=document.createElement("span");E.className=`${n}__colon`,E.textContent=": ";let f=document.createElement("span");f.className=`${n}__tagline`,f.textContent=d.tagline,v.append(g,E,f),s.append(C,S,v),i.append(s);let l=document.createElement("a");l.className=`${n}__more`,l.href="https://damian-buho.github.io/support-ukraine/",l.target="_blank",l.rel="noopener noreferrer",l.style.fontSize=r;let T=document.createElement("span");T.className=`${n}__more-text`,T.textContent=w.more;let $=document.createElement("span");$.className=`${n}__more-ellipsis`,$.textContent="\u2026",l.append(T,$),i.append(l);function B(a){s.href=a.url,g.textContent=a.name,f.textContent=a.tagline,h&&console.info("[support-ukraine] banner",`${a.name}: ${a.tagline}`,a.url)}function H(){let a=W(k,p);X?(i.classList.add(`${n}--refreshing`),setTimeout(()=>{B(a),i.classList.remove(`${n}--refreshing`)},200)):B(a)}if(x){let a=document.createElement("button");a.className=`${n}__refresh`,a.type="button",a.textContent=oe,a.style.fontSize=r,a.addEventListener("click",H),i.insertBefore(a,l)}O.append(i);let U=t.element??document.body;if(e==="replace"){let a=U.querySelector(`header.${n}`);a?a.replaceWith(m):U.prepend(m)}else U.prepend(m);h&&console.info("[support-ukraine] banner",`${d.name}: ${d.tagline}`,d.url),m.dataset.supportUkraine="";let R;j>0&&(R=setInterval(H,j));let P=m;return P.destroy=()=>{R!==void 0&&clearInterval(R)},P}export{ne as DEFAULT_CHARITIES,I as RTL_LOCALES,A as charitiesSchema,re as charitySchema,F as detectLocale,ae as formatBannerText,N as isRTL,y as loadLocale,M as mergeCharities,le as randomItem,u as resolveLocale,xe as supportUkraineBlock};
package/dist/types.d.ts CHANGED
@@ -42,6 +42,12 @@ export interface SupportUkraineBlockOptions {
42
42
  dontRepeat?: boolean;
43
43
  /** Log a message to the dev console. */
44
44
  isInConsole?: boolean;
45
+ /** Show a refresh button that loads the next random charity. */
46
+ showRefreshButton?: boolean;
47
+ /** Auto-refresh interval in milliseconds. 0 = off (default). Set e.g. 15000 for 15 seconds. */
48
+ autoRefreshInterval?: number;
49
+ /** Show a fade animation when the charity changes (respects prefers-reduced-motion). */
50
+ showRefreshAnimation?: boolean;
45
51
  /**
46
52
  * Override the auto-detected locale (BCP 47 language tag).
47
53
  * If omitted the locale is detected from `navigator.language`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damian-buho/support-ukraine",
3
- "version": "1.3.3",
3
+ "version": "1.4.1",
4
4
  "type": "module",
5
5
  "description": "Browser library that adds a Ukraine-support charity banner to any website.",
6
6
  "main": "dist/index.js",
@@ -31,7 +31,8 @@
31
31
  "lint": "eslint ./",
32
32
  "fix": "eslint ./ --fix",
33
33
  "format": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'",
34
- "format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'"
34
+ "format:check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'",
35
+ "serve": "npx serve ."
35
36
  },
36
37
  "keywords": [
37
38
  "ukraine",
@@ -58,9 +59,9 @@
58
59
  "homepage": "https://github.com/damian-buho/support-ukraine#readme",
59
60
  "devDependencies": {
60
61
  "@eslint/js": "10.0.1",
61
- "@size-limit/preset-small-lib": "13.0.1",
62
+ "@size-limit/preset-small-lib": "13.0.2",
62
63
  "@types/eslint": "9.6.1",
63
- "@types/node": "26.1.1",
64
+ "@types/node": "26.1.2",
64
65
  "esbuild": "0.28.1",
65
66
  "eslint": "10.8.0",
66
67
  "eslint-config-prettier": "10.1.8",
@@ -72,7 +73,7 @@
72
73
  "globals": "17.8.0",
73
74
  "prettier": "3.9.6",
74
75
  "sass": "1.102.0",
75
- "size-limit": "13.0.1",
76
+ "size-limit": "13.0.2",
76
77
  "tsup": "8.5.1",
77
78
  "typescript": "6.0.3",
78
79
  "typescript-eslint": "8.65.0",