PageSourceSearch

https://rapidact.eu/rapidact-badge.js

js rapidact.eu collected 2026-10-04 00:02:17 UTC 15,776 bytes, 339 lines download raw bytes

1(function () {
2  "use strict";
3
4  if (document.getElementById("rapidact-ai-disclosure")) return;
5
6  var script = document.currentScript;
7  var pathLanguage = window.location.pathname.split("/")[1].toLowerCase();
8  var supportedLanguages = ["en", "es", "de", "fr", "it"];
9  var language = String(
10    (script && script.dataset.language) ||
11      (supportedLanguages.indexOf(pathLanguage) >= 0 && pathLanguage) ||
12      document.documentElement.lang ||
13      navigator.language ||
14      "en"
15  )
16    .toLowerCase()
17    .slice(0, 2);
18  if (supportedLanguages.indexOf(language) < 0) language = "en";
19
20  var words = {
21    en: {
22      title: "AI use disclosed",
23      message:
24        "This site uses an AI assistant. You are interacting with an AI system, not a person.",
25      eyebrow: "Clear AI-use notice",
26      open: "How AI is used",
27      close: "Close notice",
28      system: "System",
29      provider: "Responsible",
30      details: "Read the Article 50 guide",
31      install: "Add this notice",
32    },
33    es: {
34      title: "Uso de IA declarado",
35      message:
36        "Este sitio utiliza un asistente de IA. Estás interactuando con un sistema de IA, no con una persona.",
37      eyebrow: "Aviso claro sobre el uso de IA",
38      open: "Cómo se utiliza la IA",
39      close: "Cerrar aviso",
40      system: "Sistema",
41      provider: "Responsable",
42      details: "Leer la guía del artículo 50",
43      install: "Añadir este aviso",
44    },
45    de: {
46      title: "KI-Einsatz offengelegt",
47      message:
48        "Diese Website nutzt einen KI-Assistenten. Sie interagieren mit einem KI-System, nicht mit einer Person.",
49      eyebrow: "Klarer Hinweis zum KI-Einsatz",
50      open: "So wird KI eingesetzt",
51      close: "Hinweis schließen",
52      system: "System",
53      provider: "Verantwortlich",
54      details: "Artikel-50-Leitfaden lesen",
55      install: "Diesen Hinweis hinzufügen",
56    },
57    fr: {
58      title: "Usage de l’IA signalé",
59      message:
60        "Ce site utilise un assistant IA. Vous interagissez avec un système d’IA, et non avec une personne.",
61      eyebrow: "Information claire sur l’usage de l’IA",
62      open: "Comment l’IA est utilisée",
63      close: "Fermer l’avis",
64      system: "Système",
65      provider: "Responsable",
66      details: "Lire le guide de l’article 50",
67      install: "Ajouter cet avis",
68    },
69    it: {
70      title: "Uso dell’IA dichiarato",
71      message:
72        "Questo sito usa un assistente IA. Stai interagendo con un sistema di IA, non con una persona.",
73      eyebrow: "Avviso chiaro sull’uso dell’IA",
74      open: "Come viene usata l’IA",
75      close: "Chiudi avviso",
76      system: "Sistema",
77      provider: "Responsabile",
78      details: "Leggi la guida all’articolo 50",
79      install: "Aggiungi questo avviso",
80    },
81  };
82  var copybook = words[language];
83  var languageSuffix = language.charAt(0).toUpperCase() + language.slice(1);
84  var localizedTitle = script && script.dataset["title" + languageSuffix];
85  var localizedMessage = script && script.dataset["message" + languageSuffix];
86  var title =
87    localizedTitle || (script && script.dataset.title) || copybook.title;
88  var message =
89    localizedMessage || (script && script.dataset.message) || copybook.message;
90  var system = (script && script.dataset.system) || "";
91  var provider = (script && script.dataset.provider) || "";
92  var detailsUrl = (script && script.dataset.detailsUrl) || "";
93  var badgeId = (script && script.dataset.badgeId) || "";
94  var requestedDisplay = (script && script.dataset.display) || "bubble";
95  var supportedDisplays = ["bubble", "standard", "popup"];
96  var display =
97    supportedDisplays.indexOf(requestedDisplay) >= 0
98      ? requestedDisplay
99      : "bubble";
100  var targetSelector = (script && script.dataset.target) || "";
101  var showCredit =
102    !script || typeof script.dataset.showCredit === "undefined"
103      ? true
104      : script.dataset.showCredit === "true";
105  var position =
106    script && script.dataset.position === "left" ? "left" : "right";
107  var requestedAccent = (script && script.dataset.color) || "";
108  var accent = /^#[0-9a-f]{3,8}$/i.test(requestedAccent)
109    ? requestedAccent
110    : "#1f3a5f";
111  var escapeHtml = function (value) {
112    return String(value)
113      .replace(/&/g, "&amp;")
114      .replace(/</g, "&lt;")
115      .replace(/>/g, "&gt;")
116      .replace(/"/g, "&quot;")
117      .replace(/'/g, "&#039;");
118  };
119  var safeTitle = escapeHtml(title);
120  var defaultBrandUrl =
121    "https://rapidact.eu/brand/rapidact-exact-symbol-128.webp";
122  try {
123    if (script && script.src) {
124      defaultBrandUrl = new URL(
125        "brand/rapidact-exact-symbol-128.webp",
126        script.src
127      ).href;
128    }
129  } catch (_error) {
130    // The absolute production URL above remains the reliable fallback.
131  }
132  var brandUrl = (script && script.dataset.brandSrc) || defaultBrandUrl;
133  var safeBrandUrl = escapeHtml(brandUrl);
134
135  var host = document.createElement("div");
136  host.id = "rapidact-ai-disclosure";
137  if (badgeId) host.setAttribute("data-badge-id", badgeId);
138  host.setAttribute("data-display", display);
139  if (display === "standard") {
140    host.style.position = "relative";
141    host.style.display = "block";
142    host.style.width = "100%";
143  } else {
144    host.style.position = "fixed";
145    host.style[position] = "max(16px, env(safe-area-inset-" + position + "))";
146    host.style.bottom = "max(16px, env(safe-area-inset-bottom))";
147  }
148  host.style.zIndex = "2147483000";
149  host.style.fontFamily =
150    '"Manrope", "Avenir Next", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif';
151
152  var root = host.attachShadow ? host.attachShadow({ mode: "open" }) : host;
153  root.innerHTML =
154    "<style>" +
155    ":host{all:initial}" +
156    "*,*::before,*::after{box-sizing:border-box}" +
157    ".ra-wrap{display:flex;flex-direction:column;align-items:" +
158    (position === "left" ? "flex-start" : "flex-end") +
159    ";gap:13px}" +
160    ".ra-backdrop{display:none}" +
161    ".ra-panel{position:relative;display:none;width:min(390px,calc(100vw - 32px));overflow:hidden;border:1px solid #174a9b;border-radius:18px;background:#fff;color:#08152f;box-shadow:0 24px 70px rgba(1,17,58,.25),0 0 0 3px rgba(34,197,255,.08)}" +
162    ".ra-panel[data-open=true]{display:block}" +
163    ".ra-panel-brand{display:flex;min-height:78px;align-items:center;justify-content:space-between;gap:14px;border-bottom:1px solid rgba(67,206,255,.35);background:#03123d;padding:11px 15px}" +
164    ".ra-brand-lockup{display:flex;min-width:0;align-items:center;gap:10px}" +
165    ".ra-brand-actions{display:flex;align-items:center;gap:8px}" +
166    ".ra-brand-image{display:block;width:auto;height:54px;flex:none}" +
167    ".ra-brand-name{font-family:'Sora','Avenir Next',ui-sans-serif,system-ui,sans-serif;font-size:18px;line-height:1;font-weight:700;letter-spacing:-.045em;color:#fff;white-space:nowrap}" +
168    ".ra-brand-name-accent{color:#53ddff}" +
169    ".ra-brand-status{display:inline-flex;align-items:center;gap:6px;border:1px solid rgba(109,221,255,.5);border-radius:999px;background:rgba(11,76,169,.48);color:#e9f9ff;padding:6px 9px;font-size:9px;line-height:1;font-weight:800;letter-spacing:.09em;text-transform:uppercase;white-space:nowrap}" +
170    ".ra-brand-status::before{width:6px;height:6px;border-radius:50%;background:#53ddff;box-shadow:0 0 9px #53ddff;content:''}" +
171    ".ra-close{display:grid;width:44px;height:44px;place-items:center;border:1px solid rgba(109,221,255,.42);border-radius:999px;background:rgba(11,76,169,.3);color:#fff;cursor:pointer;font:700 22px/1 ui-sans-serif,system-ui,sans-serif}" +
172    ".ra-close:hover{background:rgba(34,116,221,.48)}" +
173    ".ra-close:focus-visible{outline:3px solid #53ddff;outline-offset:2px}" +
174    ".ra-panel-body{padding:19px 20px 20px}" +
175    ".ra-eyebrow{margin:0 0 7px;font-size:10px;line-height:1.2;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:#4c6286}" +
176    ".ra-title{margin:0;font-family:'Sora','Avenir Next',ui-sans-serif,system-ui,sans-serif;font-size:18px;line-height:1.3;font-weight:700;letter-spacing:-.025em}" +
177    ".ra-copy{margin:9px 0 0;font-size:14px;line-height:1.62;color:#43516a}" +
178    ".ra-meta{margin:14px 0 0;padding-top:12px;border-top:1px solid #dbe5f2;font-size:12px;line-height:1.5;color:#5d6c84}" +
179    ".ra-meta:empty{display:none}" +
180    ".ra-links{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-top:14px}" +
181    ".ra-link{color:" +
182    accent +
183    ";font-size:12px;line-height:1.4;font-weight:700;text-underline-offset:3px}" +
184    ".ra-button{position:relative;display:block;min-width:214px;min-height:62px;overflow:hidden;border:1px solid #4ba8ff;border-radius:999px;background:linear-gradient(115deg,#020b27 0%,#06235e 58%,#0b4ba9 100%);padding:7px 17px 7px 12px;cursor:pointer;font:inherit;box-shadow:0 14px 30px rgba(1,17,58,.3),inset 0 0 0 2px #061a48,inset 0 0 0 3px rgba(105,210,255,.78);
184transition:box-shadow .18s ease,transform .18s ease}" +
185    ".ra-button::before{position:absolute;inset:3px;border:1px solid rgba(255,255,255,.16);border-radius:999px;pointer-events:none;content:''}" +
186    ".ra-button::after{position:absolute;top:5px;right:18px;left:48px;height:1px;background:linear-gradient(90deg,transparent,rgba(143,226,255,.75),transparent);pointer-events:none;content:''}" +
187    ".ra-button:hover{box-shadow:0 17px 34px rgba(1,17,58,.38),inset 0 0 0 2px #061a48,inset 0 0 0 3px rgba(105,210,255,.95);transform:translateY(-2px)}" +
188    ".ra-button:focus-visible{outline:3px solid " +
189    accent +
190    "66;outline-offset:5px;border-radius:999px}" +
191    ".ra-button-lockup{position:relative;z-index:1;display:flex;align-items:center;gap:10px;text-align:left}" +
192    ".ra-button-image{display:block;width:auto;height:46px;flex:none;filter:drop-shadow(0 2px 5px rgba(0,0,0,.28))}" +
193    ".ra-button-copy{display:block;min-width:0}" +
194    ".ra-button-name{display:block;font-family:'Sora','Avenir Next',ui-sans-serif,system-ui,sans-serif;font-size:17px;line-height:1.05;font-weight:750;letter-spacing:-.045em;color:#fff;white-space:nowrap;text-shadow:0 1px 2px rgba(0,0,0,.3)}" +
195    ".ra-button-name-accent{color:#53ddff}" +
196    ".ra-button-status{display:block;margin-top:5px;max-width:145px;overflow:hidden;color:#dff8ff;font-size:8px;line-height:1;font-weight:800;letter-spacing:.085em;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}" +
197    ".ra-sr-only{position:absolute!important;width:1px!important;height:1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important}" +
198    "@media (max-width:520px){.ra-panel-brand{align-items:flex-start;flex-direction:column;gap:9px}.ra-links{align-items:flex-start;flex-direction:column;gap:9px}.ra-button{min-width:54px;min-height:54px;padding:6px}.ra-button-image{height:38px}.ra-button-copy{display:none}}" +
199    (display === "standard"
200      ? ".ra-wrap{display:block}.ra-panel{display:block;width:100%;max-width:760px;border-radius:14px;box-shadow:0 14px 42px rgba(1,17,58,.12)}.ra-button,.ra-close{display:none}"
201      : "") +
202    (display === "popup"
203      ? ".ra-backdrop[data-open=true]{position:fixed;z-index:0;inset:-100vh -100vw;display:block;background:rgba(3,18,61,.56);backdrop-filter:blur(4px)}.ra-panel{position:fixed;z-index:1;top:50%;left:50%;width:min(520px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow-y:auto;transform:translate(-50%,-50%)}"
204      : "") +
205    "@media (prefers-reduced-motion:no-preference){.ra-panel[data-open=true]{animation:ra-in .16s ease-out}@keyframes ra-in{from{opacity:0}to{opacity:1}}}" +
206    "</style>" +
207    '<div class="ra-wrap">' +
208    '<div class="ra-backdrop" data-open="false" aria-hidden="true"></div>' +
209    '<section class="ra-panel" role="' +
210    (display === "standard" ? "region" : "dialog") +
211    '" aria-label="' +
212    safeTitle +
213    '" aria-modal="' +
214    (display === "popup" ? "true" : "false") +
215    '" tabindex="-1" data-open="' +
216    (display === "standard" ? "true" : "false") +
217    '">' +
218    '<div class="ra-panel-brand">' +
219    '<div class="ra-brand-lockup">' +
220    '<img class="ra-brand-image" src="' +
221    safeBrandUrl +
222    '" alt="" aria-hidden="true" width="128" height="128">' +
223    '<span class="ra-brand-name">Rapid<span class="ra-brand-name-accent">Act</span></span>' +
224    "</div>" +
225    '<span class="ra-brand-actions">' +
226    '<span class="ra-brand-status">' +
227    safeTitle +
228    "</span>" +
229    '<button class="ra-close" type="button" aria-label="' +
230    copybook.close +
231    '">&times;</button>' +
232    "</span>" +
233    "</div>" +
234    '<div class="ra-panel-body">' +
235    '<p class="ra-eyebrow">' +
236    copybook.eyebrow +
237    "</p>" +
238    '<h2 class="ra-title">' +
239    safeTitle +
240    "</h2>" +
241    '<p class="ra-copy"></p>' +
242    '<p class="ra-meta"></p>' +
243    '<div class="ra-links">' +
244    '<a class="ra-link ra-details" target="_blank" rel="noopener"></a>' +
245    (showCredit
246      ? '<a class="ra-link" href="https://rapidact.eu/article-50#install" target="_blank" rel="noopener">' +
247        copybook.install +
248        "</a>"
249      : "") +
250    "</div>" +
251    "</div>" +
252    "</section>" +
253    '<button class="ra-button" type="button" aria-expanded="false">' +
254    '<span class="ra-button-lockup" aria-hidden="true">' +
255    '<img class="ra-button-image" src="' +
256    safeBrandUrl +
257    '" alt="" aria-hidden="true" width="128" height="128">' +
258    '<span class="ra-button-copy">' +
259    '<span class="ra-button-name">Rapid<span class="ra-button-name-accent">Act</span></span>' +
260    '<span class="ra-button-status">' +
261    safeTitle +
262    "</span>" +
263    "</span>" +
264    "</span>" +
265    '<span class="ra-sr-only ra-button-title">' +
266    safeTitle +
267    "</span>" +
268    '<span class="ra-sr-only ra-button-sub">' +
269    copybook.open +
270    "</span>" +
271    "</button>" +
272    "</div>";
273
274  var panel = root.querySelector(".ra-panel");
275  var button = root.querySelector(".ra-button");
276  var closeButton = root.querySelector(".ra-close");
277  var backdrop = root.querySelector(".ra-backdrop");
278  var copy = root.querySelector(".ra-copy");
279  var meta = root.querySelector(".ra-meta");
280  var details = root.querySelector(".ra-details");
281
282  copy.textContent = message;
283  meta.textContent = [
284    system && copybook.system + ": " + system,
285    provider && copybook.provider + ": " + provider,
286  ]
287    .filter(Boolean)
288    .join(" · ");
289
290  if (detailsUrl) {
291    details.href = detailsUrl;
292    details.textContent = copybook.details;
293  } else {
294    details.remove();
295  }
296
297  var setOpen = function (open, focusPanel) {
298    panel.setAttribute("data-open", String(open));
299    backdrop.setAttribute("data-open", String(open && display === "popup"));
300    button.setAttribute("aria-expanded", String(open));
301    button.querySelector(".ra-button-sub").textContent = open
302      ? copybook.close
303      : copybook.open;
304    if (open && focusPanel) closeButton.focus();
305  };
306
307  button.addEventListener("click", function () {
308    var open = panel.getAttribute("data-open") !== "true";
309    setOpen(open, open && display === "popup");
310  });
311
312  closeButton.addEventListener("click", function () {
313    setOpen(false, false);
314    button.focus();
315  });
316
317  backdrop.addEventListener("click", function () {
318    setOpen(false, false);
319    button.focus();
320  });
321
322  document.addEventListener("keydown", function (event) {
323    if (event.key !== "Escape") return;
324    if (panel.getAttribute("data-open") !== "true" || display === "standard")
325      return;
326    setOpen(false, false);
327    button.focus();
328  });
329
330  var mount = document.body;
331  if (display === "standard" && targetSelector) {
332    try {
333      mount = document.querySelector(targetSelector) || document.body;
334    } catch (_selectorError) {
335      mount = document.body;
336    }
337  }
338  mount.appendChild(host);
339})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.