accessify-widget 0.3.0 → 0.3.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.
@@ -3441,13 +3441,6 @@ function from_namespace(content, flags2, ns = "svg") {
3441
3441
  function from_svg(content, flags2) {
3442
3442
  return /* @__PURE__ */ from_namespace(content, flags2, "svg");
3443
3443
  }
3444
- function text(value = "") {
3445
- {
3446
- var t2 = create_text(value + "");
3447
- assign_nodes(t2, t2);
3448
- return t2;
3449
- }
3450
- }
3451
3444
  function append(anchor, dom) {
3452
3445
  if (anchor === null) {
3453
3446
  return;
@@ -3457,11 +3450,11 @@ function append(anchor, dom) {
3457
3450
  dom
3458
3451
  );
3459
3452
  }
3460
- function set_text(text2, value) {
3453
+ function set_text(text, value) {
3461
3454
  var str = value == null ? "" : typeof value === "object" ? `${value}` : value;
3462
- if (str !== (text2.__t ?? (text2.__t = text2.nodeValue))) {
3463
- text2.__t = str;
3464
- text2.nodeValue = `${str}`;
3455
+ if (str !== (text.__t ?? (text.__t = text.nodeValue))) {
3456
+ text.__t = str;
3457
+ text.nodeValue = `${str}`;
3465
3458
  }
3466
3459
  }
3467
3460
  function mount(component, options) {
@@ -4252,6 +4245,9 @@ function to_class(value, hash, directives) {
4252
4245
  }
4253
4246
  return classname === "" ? null : classname;
4254
4247
  }
4248
+ function to_style(value, styles) {
4249
+ return value == null ? null : String(value);
4250
+ }
4255
4251
  function set_class(dom, is_html, value, hash, prev_classes, next_classes) {
4256
4252
  var prev = dom.__className;
4257
4253
  if (prev !== value || prev === void 0) {
@@ -4276,6 +4272,21 @@ function set_class(dom, is_html, value, hash, prev_classes, next_classes) {
4276
4272
  }
4277
4273
  return next_classes;
4278
4274
  }
4275
+ function set_style(dom, value, prev_styles, next_styles) {
4276
+ var prev = dom.__style;
4277
+ if (prev !== value) {
4278
+ var next_style_attr = to_style(value);
4279
+ {
4280
+ if (next_style_attr == null) {
4281
+ dom.removeAttribute("style");
4282
+ } else {
4283
+ dom.style.cssText = next_style_attr;
4284
+ }
4285
+ }
4286
+ dom.__style = value;
4287
+ }
4288
+ return next_styles;
4289
+ }
4279
4290
  const IS_CUSTOM_ELEMENT = Symbol("is custom element");
4280
4291
  const IS_HTML = Symbol("is html");
4281
4292
  function set_attribute(element, attribute, value, skip_warning) {
@@ -4801,16 +4812,7 @@ const deJson = {
4801
4812
  "footer.disclaimer": "Dieses Widget verbessert die Barrierefreiheit, ersetzt aber keine barrierefreie Webentwicklung.",
4802
4813
  "footer.docs": "Dokumentation",
4803
4814
  "footer.github": "GitHub",
4804
- "bfsg.notice": "Hinweis: Dieses Overlay-Tool allein erfüllt nicht die Anforderungen des BFSG. Professionelle Barrierefreiheit erfordert strukturelle Änderungen am Quellcode.",
4805
- "widget.minimize": "Minimieren",
4806
- "widget.dockLeft": "Links andocken",
4807
- "widget.dockRight": "Rechts andocken",
4808
- "widget.widgetLang": "Widget-Sprache",
4809
- "widget.translatePage": "Seite übersetzen",
4810
- "widget.selectLang": "Sprache wählen...",
4811
- "widget.restoreOriginal": "Original wiederherstellen",
4812
- "widget.translating": "Seite wird übersetzt",
4813
- "widget.originalRestored": "Originalsprache wiederhergestellt"
4815
+ "bfsg.notice": "Hinweis: Dieses Overlay-Tool allein erfüllt nicht die Anforderungen des BFSG. Professionelle Barrierefreiheit erfordert strukturelle Änderungen am Quellcode."
4814
4816
  };
4815
4817
  const enJson = {
4816
4818
  "widget.title": "Accessibility",
@@ -4899,16 +4901,7 @@ const enJson = {
4899
4901
  "footer.disclaimer": "This widget enhances accessibility but does not replace accessible web development.",
4900
4902
  "footer.docs": "Documentation",
4901
4903
  "footer.github": "GitHub",
4902
- "bfsg.notice": "Note: This overlay tool alone does not meet BFSG requirements. Full accessibility requires structural changes to the source code.",
4903
- "widget.minimize": "Minimize",
4904
- "widget.dockLeft": "Dock left",
4905
- "widget.dockRight": "Dock right",
4906
- "widget.widgetLang": "Widget Language",
4907
- "widget.translatePage": "Translate Page",
4908
- "widget.selectLang": "Select language...",
4909
- "widget.restoreOriginal": "Restore original",
4910
- "widget.translating": "Translating page",
4911
- "widget.originalRestored": "Original language restored"
4904
+ "bfsg.notice": "Note: This overlay tool alone does not meet BFSG requirements. Full accessibility requires structural changes to the source code."
4912
4905
  };
4913
4906
  const EN_BASE = {
4914
4907
  ...enJson,
@@ -5783,11 +5776,10 @@ function t(key, lang = "en") {
5783
5776
  const resolved = getSupportedLang(lang);
5784
5777
  return locales[resolved]?.[key] || EN_BASE[key] || key;
5785
5778
  }
5786
- var root_1$4 = /* @__PURE__ */ from_html(`<span class="accessify-trigger-badge" aria-hidden="true"> </span>`);
5787
- var root$5 = /* @__PURE__ */ from_html(`<button><!> <!></button>`);
5779
+ var root$5 = /* @__PURE__ */ from_html(`<button></button>`);
5788
5780
  function TriggerButton($$anchor, $$props) {
5789
5781
  push($$props, true);
5790
- let isMinimized = prop($$props, "isMinimized", 3, false), activeCount = prop($$props, "activeCount", 3, 0), lang = prop($$props, "lang", 3, "en"), el = prop($$props, "el", 15, null);
5782
+ let lang = prop($$props, "lang", 3, "en"), el = prop($$props, "el", 15, null);
5791
5783
  let isDragging = /* @__PURE__ */ state(false);
5792
5784
  onMount(() => {
5793
5785
  const btn = el();
@@ -5847,29 +5839,15 @@ function TriggerButton($$anchor, $$props) {
5847
5839
  });
5848
5840
  var button = root$5();
5849
5841
  let classes;
5850
- var node = child(button);
5851
- html(node, iconAccessibility);
5852
- var node_1 = sibling(node, 2);
5853
- {
5854
- var consequent = ($$anchor2) => {
5855
- var span = root_1$4();
5856
- var text2 = child(span);
5857
- template_effect(() => set_text(text2, activeCount()));
5858
- append($$anchor2, span);
5859
- };
5860
- if_block(node_1, ($$render) => {
5861
- if (activeCount() > 0 && !$$props.isOpen) $$render(consequent);
5862
- });
5863
- }
5842
+ html(button, iconAccessibility, true);
5864
5843
  bind_this(button, ($$value) => el($$value), () => el());
5865
5844
  template_effect(
5866
5845
  ($0) => {
5867
5846
  classes = set_class(button, 1, "accessify-trigger", null, classes, {
5868
5847
  "accessify-trigger--dragging": get(isDragging),
5869
- "accessify-trigger--hidden": $$props.isOpen && !isMinimized(),
5870
- "accessify-trigger--minimized": isMinimized()
5848
+ "accessify-trigger--hidden": $$props.isOpen
5871
5849
  });
5872
- set_attribute(button, "aria-expanded", $$props.isOpen && !isMinimized());
5850
+ set_attribute(button, "aria-expanded", $$props.isOpen);
5873
5851
  set_attribute(button, "aria-label", $0);
5874
5852
  },
5875
5853
  [
@@ -5879,49 +5857,93 @@ function TriggerButton($$anchor, $$props) {
5879
5857
  append($$anchor, button);
5880
5858
  pop();
5881
5859
  }
5882
- var root$4 = /* @__PURE__ */ from_html(`<header class="accessify-header"><div class="accessify-header-left"><span class="accessify-logo" aria-label="Accessify"><svg viewBox="0 0 480 80" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><text x="0" y="64" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="72" font-weight="700" letter-spacing="-2">accessify</text></svg></span></div> <div class="accessify-header-actions"><div class="accessify-dock-group" role="radiogroup"><button class="accessify-dock-btn" role="radio"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="1" y="2" width="4" height="12" rx="1"></rect><rect x="1" y="2" width="14" height="12" rx="2" stroke-dasharray="2 2"></rect></svg></button> <button class="accessify-dock-btn" role="radio"><svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="11" y="2" width="4" height="12" rx="1"></rect><rect x="1" y="2" width="14" height="12" rx="2" stroke-dasharray="2 2"></rect></svg></button></div> <button class="accessify-header-btn"></button> <button class="accessify-header-btn accessify-header-btn--icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="5" y1="12" x2="19" y2="12"></line></svg></button> <button class="accessify-header-btn accessify-header-btn--icon accessify-header-btn--close"></button></div></header>`);
5860
+ var root$4 = /* @__PURE__ */ from_html(`<header class="accessify-header"><div class="accessify-header-left"><span class="accessify-logo" aria-label="Accessify"><svg viewBox="0 0 480 80" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><text x="0" y="64" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="72" font-weight="700" letter-spacing="-2">accessify</text></svg></span></div> <div class="accessify-header-actions"><button class="accessify-header-btn accessify-drag-handle"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="8" y1="6" x2="8" y2="6.01"></line><line x1="16" y1="6" x2="16" y2="6.01"></line><line x1="8" y1="12" x2="8" y2="12.01"></line><line x1="16" y1="12" x2="16" y2="12.01"></line><line x1="8" y1="18" x2="8" y2="18.01"></line><line x1="16" y1="18" x2="16" y2="18.01"></line></svg></button> <button class="accessify-header-btn"></button> <button class="accessify-header-btn accessify-header-btn--icon accessify-header-btn--close"></button></div></header>`);
5883
5861
  function PanelHeader($$anchor, $$props) {
5884
5862
  push($$props, true);
5885
5863
  let lang = prop($$props, "lang", 3, "en");
5886
5864
  prop($$props, "activeCount", 3, 0);
5887
- let currentDock = prop($$props, "currentDock", 3, "right");
5865
+ let panelEl = prop($$props, "panelEl", 3, null);
5866
+ let dragHandleEl = /* @__PURE__ */ state(null);
5867
+ onMount(() => {
5868
+ const handle = get(dragHandleEl);
5869
+ if (!handle) return;
5870
+ let dragStartX = 0;
5871
+ let startLeft = 0;
5872
+ let hasMoved = false;
5873
+ let pointerId = null;
5874
+ function onDown(e) {
5875
+ const panel = panelEl();
5876
+ if (!panel) return;
5877
+ const rect = panel.getBoundingClientRect();
5878
+ dragStartX = e.clientX;
5879
+ startLeft = rect.left;
5880
+ hasMoved = false;
5881
+ pointerId = e.pointerId;
5882
+ handle.setPointerCapture(e.pointerId);
5883
+ e.preventDefault();
5884
+ }
5885
+ function onMove(e) {
5886
+ if (pointerId === null || e.pointerId !== pointerId) return;
5887
+ const panel = panelEl();
5888
+ if (!panel) return;
5889
+ const dx = e.clientX - dragStartX;
5890
+ if (!hasMoved && Math.abs(dx) > 5) {
5891
+ hasMoved = true;
5892
+ panel.style.transition = "none";
5893
+ }
5894
+ if (hasMoved) {
5895
+ const panelW = panel.offsetWidth;
5896
+ const newLeft = Math.max(0, Math.min(window.innerWidth - panelW, startLeft + dx));
5897
+ panel.style.left = newLeft + "px";
5898
+ panel.style.right = "auto";
5899
+ }
5900
+ }
5901
+ function onUp(e) {
5902
+ if (pointerId === null || e.pointerId !== pointerId) return;
5903
+ handle.releasePointerCapture(e.pointerId);
5904
+ const panel = panelEl();
5905
+ if (panel) {
5906
+ panel.style.transition = "";
5907
+ if (hasMoved) {
5908
+ const rect = panel.getBoundingClientRect();
5909
+ $$props.ondrag(rect.left);
5910
+ }
5911
+ }
5912
+ pointerId = null;
5913
+ hasMoved = false;
5914
+ }
5915
+ handle.addEventListener("pointerdown", onDown);
5916
+ handle.addEventListener("pointermove", onMove);
5917
+ handle.addEventListener("pointerup", onUp);
5918
+ return () => {
5919
+ handle.removeEventListener("pointerdown", onDown);
5920
+ handle.removeEventListener("pointermove", onMove);
5921
+ handle.removeEventListener("pointerup", onUp);
5922
+ };
5923
+ });
5888
5924
  var header = root$4();
5889
5925
  var div = sibling(child(header), 2);
5890
- var div_1 = child(div);
5891
- var button = child(div_1);
5926
+ var button = child(div);
5927
+ bind_this(button, ($$value) => set(dragHandleEl, $$value), () => get(dragHandleEl));
5892
5928
  var button_1 = sibling(button, 2);
5893
- var button_2 = sibling(div_1, 2);
5894
- html(button_2, iconReset, true);
5895
- var button_3 = sibling(button_2, 2);
5896
- var button_4 = sibling(button_3, 2);
5897
- html(button_4, iconClose, true);
5929
+ html(button_1, iconReset, true);
5930
+ var button_2 = sibling(button_1, 2);
5931
+ html(button_2, iconClose, true);
5898
5932
  template_effect(
5899
5933
  ($0, $1) => {
5900
- set_attribute(div_1, "aria-label", lang() === "de" ? "Panel-Position" : "Panel position");
5901
- set_attribute(button, "aria-checked", currentDock() === "left");
5902
- set_attribute(button, "aria-label", lang() === "de" ? "Links andocken" : "Dock left");
5903
- set_attribute(button, "data-active", currentDock() === "left");
5904
- set_attribute(button_1, "aria-checked", currentDock() === "right");
5905
- set_attribute(button_1, "aria-label", lang() === "de" ? "Rechts andocken" : "Dock right");
5906
- set_attribute(button_1, "data-active", currentDock() === "right");
5907
- set_attribute(button_2, "aria-label", $0);
5908
- set_attribute(button_3, "aria-label", lang() === "de" ? "Minimieren" : "Minimize");
5909
- set_attribute(button_4, "aria-label", $1);
5934
+ set_attribute(button, "aria-label", lang() === "de" ? "Panel verschieben" : "Move panel");
5935
+ set_attribute(button_1, "aria-label", $0);
5936
+ set_attribute(button_2, "aria-label", $1);
5910
5937
  },
5911
5938
  [
5912
5939
  () => t("widget.reset", lang()),
5913
5940
  () => t("widget.close", lang())
5914
5941
  ]
5915
5942
  );
5916
- delegated("click", button, () => $$props.ondockchange("left"));
5917
- delegated("click", button_1, () => $$props.ondockchange("right"));
5918
- delegated("click", button_2, function(...$$args) {
5943
+ delegated("click", button_1, function(...$$args) {
5919
5944
  $$props.onreset?.apply(this, $$args);
5920
5945
  });
5921
- delegated("click", button_3, function(...$$args) {
5922
- $$props.onminimize?.apply(this, $$args);
5923
- });
5924
- delegated("click", button_4, function(...$$args) {
5946
+ delegated("click", button_2, function(...$$args) {
5925
5947
  $$props.onclose?.apply(this, $$args);
5926
5948
  });
5927
5949
  append($$anchor, header);
@@ -5985,7 +6007,7 @@ function ProfileSection($$anchor, $$props) {
5985
6007
  var button = child(div);
5986
6008
  var span = child(button);
5987
6009
  var span_1 = sibling(child(span), 2);
5988
- var text2 = child(span_1);
6010
+ var text = child(span_1);
5989
6011
  var svg = sibling(span, 2);
5990
6012
  let classes;
5991
6013
  var node = sibling(button, 2);
@@ -6038,7 +6060,7 @@ function ProfileSection($$anchor, $$props) {
6038
6060
  ($0, $1) => {
6039
6061
  set_attribute(div, "aria-label", $0);
6040
6062
  set_attribute(button, "aria-expanded", get(isOpen));
6041
- set_text(text2, $1);
6063
+ set_text(text, $1);
6042
6064
  classes = set_class(svg, 0, "accessify-accordion-chevron", null, classes, { "accessify-accordion-chevron--open": get(isOpen) });
6043
6065
  },
6044
6066
  [
@@ -6075,8 +6097,8 @@ function createProxyService(siteKey, proxyUrl) {
6075
6097
  "X-Site-Key": siteKey
6076
6098
  };
6077
6099
  return {
6078
- async simplifyText(text2, level = "einfache", lang = "de") {
6079
- const blockId = `b-${simpleHash(text2)}`;
6100
+ async simplifyText(text, level = "einfache", lang = "de") {
6101
+ const blockId = `b-${simpleHash(text)}`;
6080
6102
  const variant = lang.startsWith("de") ? `de-${level}` : "en-plain";
6081
6103
  try {
6082
6104
  const cacheRes = await fetch(`${base}/v1/cache/query`, {
@@ -6086,7 +6108,7 @@ function createProxyService(siteKey, proxyUrl) {
6086
6108
  pageUrl: typeof window !== "undefined" ? window.location.href : "",
6087
6109
  feature: "simplify",
6088
6110
  variant,
6089
- blocks: [{ id: blockId, text: text2 }]
6111
+ blocks: [{ id: blockId, text }]
6090
6112
  })
6091
6113
  });
6092
6114
  if (cacheRes.ok) {
@@ -6103,7 +6125,7 @@ function createProxyService(siteKey, proxyUrl) {
6103
6125
  pageUrl: typeof window !== "undefined" ? window.location.href : "",
6104
6126
  feature: "simplify",
6105
6127
  variant,
6106
- blocks: [{ id: blockId, text: text2 }]
6128
+ blocks: [{ id: blockId, text }]
6107
6129
  })
6108
6130
  });
6109
6131
  if (processRes.ok) {
@@ -6115,7 +6137,7 @@ function createProxyService(siteKey, proxyUrl) {
6115
6137
  const res = await fetch(`${base}/v1/ai/simplify`, {
6116
6138
  method: "POST",
6117
6139
  headers,
6118
- body: JSON.stringify({ text: text2, level, lang })
6140
+ body: JSON.stringify({ text, level, lang })
6119
6141
  });
6120
6142
  if (!res.ok) {
6121
6143
  const err = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
@@ -6182,7 +6204,7 @@ function createDirectService(config2) {
6182
6204
  "X-Title": "Accessify Widget"
6183
6205
  };
6184
6206
  return {
6185
- async simplifyText(text2, level = "einfache", lang = "de") {
6207
+ async simplifyText(text, level = "einfache", lang = "de") {
6186
6208
  const systemPrompt = lang.startsWith("de") ? getGermanSimplificationPrompt(level) : getEnglishSimplificationPrompt();
6187
6209
  const response = await fetch(`${OPENROUTER_BASE}/chat/completions`, {
6188
6210
  method: "POST",
@@ -6191,7 +6213,7 @@ function createDirectService(config2) {
6191
6213
  model: config2.textModel || DEFAULTS.textModel,
6192
6214
  messages: [
6193
6215
  { role: "system", content: systemPrompt },
6194
- { role: "user", content: text2 }
6216
+ { role: "user", content: text }
6195
6217
  ],
6196
6218
  stream: false,
6197
6219
  max_tokens: 2e3
@@ -6411,14 +6433,14 @@ function FeatureGrid($$anchor, $$props) {
6411
6433
  const FEATURE_LOADERS = {
6412
6434
  contrast: () => import("./contrast-CqsICAkU.js"),
6413
6435
  "text-size": () => import("./text-size-C6OFhCGi.js"),
6414
- "keyboard-nav": () => import("./keyboard-nav-CE8luwx_.js"),
6436
+ "keyboard-nav": () => import("./keyboard-nav-B66DnefL.js"),
6415
6437
  "link-highlight": () => import("./link-highlight-DBGm067Y.js"),
6416
6438
  "reading-guide": () => import("./reading-guide-VT8NciIL.js"),
6417
6439
  "reading-mask": () => import("./reading-mask-BABChuCz.js"),
6418
6440
  "animation-stop": () => import("./animation-stop-C0MwseK0.js"),
6419
6441
  "hide-images": () => import("./hide-images-B_LeCBcd.js"),
6420
6442
  "big-cursor": () => import("./big-cursor-B2UKu9dQ.js"),
6421
- "page-structure": () => import("./page-structure-C25HU_D7.js"),
6443
+ "page-structure": () => import("./page-structure-C76rueHv.js"),
6422
6444
  tts: () => import("./tts-CjszLRnb.js"),
6423
6445
  "text-simplify": () => import("./text-simplify-Cvhpio7g.js"),
6424
6446
  "alt-text": () => Promise.resolve().then(() => altText)
@@ -6569,7 +6591,7 @@ function FeatureGrid($$anchor, $$props) {
6569
6591
  var span = child(div_1);
6570
6592
  html(span, () => getIcon("contrast"), true);
6571
6593
  var span_1 = sibling(span, 2);
6572
- var text2 = child(span_1);
6594
+ var text = child(span_1);
6573
6595
  var div_2 = sibling(div_1, 2);
6574
6596
  each(div_2, 21, () => CONTRAST_MODES, index, ($$anchor3, mode) => {
6575
6597
  var button = root_2$1();
@@ -6591,7 +6613,7 @@ function FeatureGrid($$anchor, $$props) {
6591
6613
  template_effect(
6592
6614
  ($0, $1) => {
6593
6615
  set_attribute(div, "aria-label", $0);
6594
- set_text(text2, $1);
6616
+ set_text(text, $1);
6595
6617
  },
6596
6618
  [
6597
6619
  () => t("feature.contrast", $$props.config.lang),
@@ -6696,54 +6718,50 @@ function FeatureGrid($$anchor, $$props) {
6696
6718
  }
6697
6719
  delegate(["click"]);
6698
6720
  var root_1$1 = /* @__PURE__ */ from_html(`<span aria-hidden="true">&middot;</span> <a target="_blank" rel="noopener noreferrer"> </a>`, 1);
6699
- var root$1 = /* @__PURE__ */ from_html(`<div class="accessify-utility-bar"><button class="accessify-utility-btn accessify-utility-btn--minimize"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="5" y1="12" x2="19" y2="12"></line></svg> <span> </span></button> <button class="accessify-utility-btn accessify-utility-btn--close"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> <span> </span></button></div> <div class="accessify-footer"><a target="_blank" rel="noopener noreferrer">Accessify Dashboard</a> <!></div>`, 1);
6721
+ var root$1 = /* @__PURE__ */ from_html(`<div class="accessify-footer"><div class="accessify-footer-links"><a target="_blank" rel="noopener noreferrer">Accessify Dashboard</a> <!></div> <button class="accessify-footer-close"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> <span> </span></button></div>`);
6700
6722
  function PanelFooter($$anchor, $$props) {
6701
6723
  push($$props, true);
6702
6724
  let lang = prop($$props, "lang", 3, "en");
6703
- var fragment = root$1();
6704
- var div = first_child(fragment);
6705
- var button = child(div);
6706
- var span = sibling(child(button), 2);
6707
- var text2 = child(span);
6708
- var button_1 = sibling(button, 2);
6709
- var span_1 = sibling(child(button_1), 2);
6710
- var text_1 = child(span_1);
6711
- var div_1 = sibling(div, 2);
6725
+ var div = root$1();
6726
+ var div_1 = child(div);
6712
6727
  var a = child(div_1);
6713
6728
  var node = sibling(a, 2);
6714
6729
  {
6715
6730
  var consequent = ($$anchor2) => {
6716
- var fragment_1 = root_1$1();
6717
- var a_1 = sibling(first_child(fragment_1), 2);
6718
- var text_2 = child(a_1);
6731
+ var fragment = root_1$1();
6732
+ var a_1 = sibling(first_child(fragment), 2);
6733
+ var text = child(a_1);
6719
6734
  template_effect(
6720
6735
  ($0) => {
6721
6736
  set_attribute(a_1, "href", $$props.statementUrl);
6722
- set_text(text_2, $0);
6737
+ set_text(text, $0);
6723
6738
  },
6724
6739
  [() => t("widget.statement", lang())]
6725
6740
  );
6726
- append($$anchor2, fragment_1);
6741
+ append($$anchor2, fragment);
6727
6742
  };
6728
6743
  if_block(node, ($$render) => {
6729
6744
  if ($$props.statementUrl) $$render(consequent);
6730
6745
  });
6731
6746
  }
6747
+ var button = sibling(div_1, 2);
6748
+ var span = sibling(child(button), 2);
6749
+ var text_1 = child(span);
6732
6750
  template_effect(
6733
- ($0) => {
6734
- set_text(text2, lang() === "de" ? "Minimieren" : "Minimize");
6735
- set_text(text_1, $0);
6751
+ ($0, $1) => {
6736
6752
  set_attribute(a, "href", $$props.dashboardUrl || "https://accessify-dashboard.pages.dev");
6753
+ set_attribute(button, "aria-label", $0);
6754
+ set_text(text_1, $1);
6737
6755
  },
6738
- [() => t("widget.close", lang())]
6756
+ [
6757
+ () => t("widget.close", lang()),
6758
+ () => t("widget.close", lang())
6759
+ ]
6739
6760
  );
6740
6761
  delegated("click", button, function(...$$args) {
6741
- $$props.onminimize?.apply(this, $$args);
6742
- });
6743
- delegated("click", button_1, function(...$$args) {
6744
6762
  $$props.onclose?.apply(this, $$args);
6745
6763
  });
6746
- append($$anchor, fragment);
6764
+ append($$anchor, div);
6747
6765
  pop();
6748
6766
  }
6749
6767
  delegate(["click"]);
@@ -6766,13 +6784,13 @@ const TRANSLATABLE_ATTRS = [
6766
6784
  "aria-valuetext"
6767
6785
  ];
6768
6786
  const TRANSLATE_URL = "https://translate.googleapis.com/translate_a/single";
6769
- async function translateSingleText(text2, sourceLang, targetLang) {
6787
+ async function translateSingleText(text, sourceLang, targetLang) {
6770
6788
  const params = new URLSearchParams({
6771
6789
  client: "gtx",
6772
6790
  sl: sourceLang,
6773
6791
  tl: targetLang,
6774
6792
  dt: "t",
6775
- q: text2
6793
+ q: text
6776
6794
  });
6777
6795
  try {
6778
6796
  const res = await fetch(`${TRANSLATE_URL}?${params.toString()}`);
@@ -6787,9 +6805,9 @@ async function translateSingleText(text2, sourceLang, targetLang) {
6787
6805
  }
6788
6806
  return parts.join("");
6789
6807
  }
6790
- return text2;
6808
+ return text;
6791
6809
  } catch {
6792
- return text2;
6810
+ return text;
6793
6811
  }
6794
6812
  }
6795
6813
  async function translateTexts(texts, sourceLang, targetLang) {
@@ -6798,7 +6816,7 @@ async function translateTexts(texts, sourceLang, targetLang) {
6798
6816
  for (let start = 0; start < texts.length; start += CONCURRENCY) {
6799
6817
  const batch = texts.slice(start, start + CONCURRENCY);
6800
6818
  const translated = await Promise.all(
6801
- batch.map((text2) => translateSingleText(text2, sourceLang, targetLang))
6819
+ batch.map((text) => translateSingleText(text, sourceLang, targetLang))
6802
6820
  );
6803
6821
  for (let j = 0; j < translated.length; j++) {
6804
6822
  results[start + j] = translated[j];
@@ -6873,9 +6891,9 @@ async function translatePage(targetLang) {
6873
6891
  if (uniqueTexts.length === 0) return;
6874
6892
  const translated = await translateTexts(uniqueTexts, pageLang, targetLang);
6875
6893
  const lookup = /* @__PURE__ */ new Map();
6876
- uniqueTexts.forEach((text2, i) => {
6877
- if (translated[i] && translated[i] !== text2) {
6878
- lookup.set(text2, translated[i]);
6894
+ uniqueTexts.forEach((text, i) => {
6895
+ if (translated[i] && translated[i] !== text) {
6896
+ lookup.set(text, translated[i]);
6879
6897
  }
6880
6898
  });
6881
6899
  observerPaused = true;
@@ -7018,17 +7036,12 @@ function createTextTransformService() {
7018
7036
  }
7019
7037
  var root_3 = /* @__PURE__ */ from_svg(`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"></path></svg>`);
7020
7038
  var root_2 = /* @__PURE__ */ from_html(`<button class="accessify-lang-option" role="option"><span> </span> <!></button>`);
7021
- var root_1 = /* @__PURE__ */ from_html(`<div id="accessify-widget-lang-list" class="accessify-lang-list" role="listbox"></div>`);
7022
- var root_6 = /* @__PURE__ */ from_html(`<div class="accessify-translate-status"><span> </span> <button class="accessify-translate-restore"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> <span> </span></button></div>`);
7023
- var root_9 = /* @__PURE__ */ from_svg(`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"></path></svg>`);
7024
- var root_8 = /* @__PURE__ */ from_html(`<button class="accessify-lang-option" role="option"><span> </span> <!></button>`);
7025
- var root_7 = /* @__PURE__ */ from_html(`<div id="accessify-translate-lang-list" class="accessify-lang-list" role="listbox"></div>`);
7026
- var root = /* @__PURE__ */ from_html(`<div class="sr-only" role="status" aria-live="polite" aria-atomic="true"> </div> <!> <div role="dialog"><!> <div class="accessify-body"><div class="accessify-control-section"><span class="accessify-section-label"> </span> <div class="accessify-lang-dropdown"><button class="accessify-lang-toggle" aria-controls="accessify-widget-lang-list"><span class="accessify-lang-toggle-left"><!> <span> </span></span> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg></button> <!></div></div> <div class="accessify-control-section"><span class="accessify-section-label"> </span> <div class="accessify-lang-dropdown"><button aria-controls="accessify-translate-lang-list"><span class="accessify-lang-toggle-left"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 8 6 6"></path><path d="m4 14 6-6 2-3"></path><path d="M2 5h12"></path><path d="M7 2h1"></path><path d="m22 22-5-10-5 10"></path><path d="M14 18h6"></path></svg> <span><!></span></span> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg></button> <!> <!></div></div> <div class="accessify-section-divider"></div> <!> <div class="accessify-section-divider"></div> <!></div> <!></div>`, 1);
7039
+ var root_1 = /* @__PURE__ */ from_html(`<div id="accessify-lang-list" class="accessify-lang-list" role="listbox"></div>`);
7040
+ var root = /* @__PURE__ */ from_html(`<div class="sr-only" role="status" aria-live="polite" aria-atomic="true"> </div> <!> <div class="accessify-panel" role="dialog"><!> <div class="accessify-body"><div class="accessify-lang-dropdown"><button class="accessify-lang-toggle" aria-controls="accessify-lang-list"><span class="accessify-lang-toggle-left"><!> <span> </span></span> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg></button> <!></div> <div class="accessify-section-divider"></div> <!> <div class="accessify-section-divider"></div> <!></div> <!></div>`, 1);
7027
7041
  function WidgetApp($$anchor, $$props) {
7028
7042
  push($$props, true);
7029
7043
  let config2 = prop($$props, "config", 7);
7030
7044
  let isOpen = /* @__PURE__ */ state(false);
7031
- let isMinimized = /* @__PURE__ */ state(false);
7032
7045
  let activeFeatures = /* @__PURE__ */ state(proxy(/* @__PURE__ */ new Map()));
7033
7046
  let currentTheme = /* @__PURE__ */ state("light");
7034
7047
  let panelEl = /* @__PURE__ */ state(null);
@@ -7036,93 +7049,13 @@ function WidgetApp($$anchor, $$props) {
7036
7049
  let announcement = /* @__PURE__ */ state("");
7037
7050
  let widgetLang = /* @__PURE__ */ state("en");
7038
7051
  let activeProfileId = /* @__PURE__ */ state(null);
7039
- let widgetLangDropdownOpen = /* @__PURE__ */ state(false);
7040
- let translateDropdownOpen = /* @__PURE__ */ state(false);
7041
- let currentDock = /* @__PURE__ */ state("right");
7042
- let pageTranslateActive = /* @__PURE__ */ state(false);
7043
- let pageTranslateLang = /* @__PURE__ */ state(null);
7052
+ let langDropdownOpen = /* @__PURE__ */ state(false);
7053
+ let panelX = /* @__PURE__ */ state(null);
7054
+ const PANEL_X_KEY = "accessify-panel-x";
7044
7055
  const textTransformService = createTextTransformService();
7045
7056
  const STORAGE_KEY = "accessify-prefs";
7046
- const DOCK_KEY = "accessify-dock";
7047
7057
  let activeCount = /* @__PURE__ */ user_derived(() => Array.from(get(activeFeatures).values()).filter(Boolean).length);
7048
7058
  let currentLangOption = /* @__PURE__ */ user_derived(() => LANGUAGE_OPTIONS.find((o) => o.code === get(widgetLang)));
7049
- const TRANSLATE_LANGUAGES = [
7050
- {
7051
- code: "de",
7052
- flag: "🇩🇪",
7053
- label: "Deutsch"
7054
- },
7055
- {
7056
- code: "en",
7057
- flag: "🇬🇧",
7058
- label: "English"
7059
- },
7060
- {
7061
- code: "es",
7062
- flag: "🇪🇸",
7063
- label: "Español"
7064
- },
7065
- {
7066
- code: "fr",
7067
- flag: "🇫🇷",
7068
- label: "Français"
7069
- },
7070
- {
7071
- code: "it",
7072
- flag: "🇮🇹",
7073
- label: "Italiano"
7074
- },
7075
- {
7076
- code: "pt",
7077
- flag: "🇧🇷",
7078
- label: "Português"
7079
- },
7080
- {
7081
- code: "zh",
7082
- flag: "🇨🇳",
7083
- label: "中文"
7084
- },
7085
- {
7086
- code: "ja",
7087
- flag: "🇯🇵",
7088
- label: "日本語"
7089
- },
7090
- {
7091
- code: "ko",
7092
- flag: "🇰🇷",
7093
- label: "한국어"
7094
- },
7095
- {
7096
- code: "ar",
7097
- flag: "🇸🇦",
7098
- label: "العربية"
7099
- },
7100
- {
7101
- code: "ru",
7102
- flag: "🇷🇺",
7103
- label: "Русский"
7104
- },
7105
- {
7106
- code: "tr",
7107
- flag: "🇹🇷",
7108
- label: "Türkçe"
7109
- },
7110
- {
7111
- code: "pl",
7112
- flag: "🇵🇱",
7113
- label: "Polski"
7114
- },
7115
- {
7116
- code: "hi",
7117
- flag: "🇮🇳",
7118
- label: "हिन्दी"
7119
- },
7120
- {
7121
- code: "sv",
7122
- flag: "🇸🇪",
7123
- label: "Svenska"
7124
- }
7125
- ];
7126
7059
  function announce(message) {
7127
7060
  set(announcement, "");
7128
7061
  requestAnimationFrame(() => {
@@ -7136,11 +7069,9 @@ function WidgetApp($$anchor, $$props) {
7136
7069
  const prefs = JSON.parse(saved);
7137
7070
  set(activeFeatures, new Map(Object.entries(prefs)), true);
7138
7071
  }
7139
- const dock = localStorage.getItem(DOCK_KEY);
7140
- if (dock === "left" || dock === "right") {
7141
- set(currentDock, dock, true);
7142
- } else {
7143
- set(currentDock, config2().position?.includes("left") ? "left" : "right", true);
7072
+ const savedX = localStorage.getItem(PANEL_X_KEY);
7073
+ if (savedX !== null) {
7074
+ set(panelX, parseFloat(savedX), true);
7144
7075
  }
7145
7076
  } catch {
7146
7077
  }
@@ -7186,7 +7117,6 @@ function WidgetApp($$anchor, $$props) {
7186
7117
  }
7187
7118
  function open() {
7188
7119
  set(isOpen, true);
7189
- set(isMinimized, false);
7190
7120
  requestAnimationFrame(() => {
7191
7121
  if (get(panelEl)) {
7192
7122
  const first = get(panelEl).querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
@@ -7196,19 +7126,7 @@ function WidgetApp($$anchor, $$props) {
7196
7126
  }
7197
7127
  function close() {
7198
7128
  set(isOpen, false);
7199
- set(isMinimized, false);
7200
- set(widgetLangDropdownOpen, false);
7201
- set(translateDropdownOpen, false);
7202
- requestAnimationFrame(() => {
7203
- const trigger = $$props.shadow.querySelector(".accessify-trigger");
7204
- trigger?.focus();
7205
- });
7206
- }
7207
- function minimize() {
7208
- set(isOpen, false);
7209
- set(isMinimized, true);
7210
- set(widgetLangDropdownOpen, false);
7211
- set(translateDropdownOpen, false);
7129
+ set(langDropdownOpen, false);
7212
7130
  requestAnimationFrame(() => {
7213
7131
  const trigger = $$props.shadow.querySelector(".accessify-trigger");
7214
7132
  trigger?.focus();
@@ -7216,20 +7134,29 @@ function WidgetApp($$anchor, $$props) {
7216
7134
  }
7217
7135
  function toggleOpen() {
7218
7136
  if (get(isOpen)) {
7219
- minimize();
7137
+ close();
7220
7138
  } else {
7221
7139
  open();
7222
7140
  }
7223
7141
  }
7224
- function handleDockChange(dock) {
7225
- set(currentDock, dock, true);
7142
+ function handleLangChange(newLang) {
7143
+ set(widgetLang, getSupportedLang(newLang), true);
7144
+ config2().lang = get(widgetLang);
7145
+ set(langDropdownOpen, false);
7146
+ applyLanguage();
7147
+ const pageLang = document.documentElement.lang?.split("-")[0] || "en";
7148
+ if (get(widgetLang) !== pageLang) {
7149
+ textTransformService.translate(get(widgetLang));
7150
+ } else {
7151
+ textTransformService.restore();
7152
+ }
7153
+ }
7154
+ function handlePanelDrag(x) {
7155
+ set(panelX, x, true);
7226
7156
  try {
7227
- localStorage.setItem(DOCK_KEY, dock);
7157
+ localStorage.setItem(PANEL_X_KEY, String(x));
7228
7158
  } catch {
7229
7159
  }
7230
- const newPos = dock === "left" ? config2().position?.replace("right", "left") || "bottom-left" : config2().position?.replace("left", "right") || "bottom-right";
7231
- config2().position = newPos;
7232
- window.dispatchEvent(new CustomEvent("accessify:reposition", { detail: { position: newPos } }));
7233
7160
  }
7234
7161
  function handleFeatureToggle(id, enabled) {
7235
7162
  get(activeFeatures).set(id, enabled);
@@ -7245,8 +7172,6 @@ function WidgetApp($$anchor, $$props) {
7245
7172
  set(activeProfileId, null);
7246
7173
  savePrefs();
7247
7174
  textTransformService.restore();
7248
- set(pageTranslateActive, false);
7249
- set(pageTranslateLang, null);
7250
7175
  window.dispatchEvent(new CustomEvent("accessify:reset"));
7251
7176
  announce(t("widget.resetConfirm", get(widgetLang)));
7252
7177
  }
@@ -7270,56 +7195,16 @@ function WidgetApp($$anchor, $$props) {
7270
7195
  savePrefs();
7271
7196
  announce(`${t(profile.nameKey, get(widgetLang))} ${t("status.activated", get(widgetLang))}`);
7272
7197
  }
7273
- function handleWidgetLangChange(newLang) {
7274
- set(widgetLang, getSupportedLang(newLang), true);
7275
- config2().lang = get(widgetLang);
7276
- set(widgetLangDropdownOpen, false);
7277
- applyLanguage();
7278
- announce(get(widgetLang) === "de" ? `Widget-Sprache: ${get(currentLangOption)?.label}` : `Widget language: ${get(currentLangOption)?.label}`);
7279
- }
7280
- function handlePageTranslate(targetLang) {
7281
- const pageLang = document.documentElement.lang?.split("-")[0] || "en";
7282
- set(translateDropdownOpen, false);
7283
- if (get(pageTranslateLang) === targetLang) {
7284
- textTransformService.restore();
7285
- set(pageTranslateActive, false);
7286
- set(pageTranslateLang, null);
7287
- announce(get(widgetLang) === "de" ? "Originalsprache wiederhergestellt" : "Original language restored");
7288
- return;
7289
- }
7290
- if (targetLang === pageLang) {
7291
- textTransformService.restore();
7292
- set(pageTranslateActive, false);
7293
- set(pageTranslateLang, null);
7294
- return;
7295
- }
7296
- set(pageTranslateActive, true);
7297
- set(pageTranslateLang, targetLang, true);
7298
- textTransformService.translate(targetLang);
7299
- const langLabel = TRANSLATE_LANGUAGES.find((l) => l.code === targetLang)?.label || targetLang;
7300
- announce(get(widgetLang) === "de" ? `Seite wird übersetzt: ${langLabel}` : `Translating page: ${langLabel}`);
7301
- }
7302
- function restorePageTranslation() {
7303
- textTransformService.restore();
7304
- set(pageTranslateActive, false);
7305
- set(pageTranslateLang, null);
7306
- set(translateDropdownOpen, false);
7307
- }
7308
7198
  function handleKeydown(e) {
7309
7199
  if (e.key === "Escape") {
7310
- if (get(widgetLangDropdownOpen)) {
7311
- set(widgetLangDropdownOpen, false);
7312
- e.preventDefault();
7313
- return;
7314
- }
7315
- if (get(translateDropdownOpen)) {
7316
- set(translateDropdownOpen, false);
7200
+ if (get(langDropdownOpen)) {
7201
+ set(langDropdownOpen, false);
7317
7202
  e.preventDefault();
7318
7203
  return;
7319
7204
  }
7320
7205
  if (get(isOpen)) {
7321
7206
  e.preventDefault();
7322
- minimize();
7207
+ close();
7323
7208
  return;
7324
7209
  }
7325
7210
  }
@@ -7338,6 +7223,7 @@ function WidgetApp($$anchor, $$props) {
7338
7223
  }
7339
7224
  }
7340
7225
  }
7226
+ let panelStyle = /* @__PURE__ */ user_derived(() => get(panelX) !== null ? `left: ${get(panelX)}px; right: auto;` : "");
7341
7227
  onMount(() => {
7342
7228
  set(widgetLang, getSupportedLang(config2().lang || "en"), true);
7343
7229
  detectTheme();
@@ -7349,18 +7235,12 @@ function WidgetApp($$anchor, $$props) {
7349
7235
  var fragment = root();
7350
7236
  event("keydown", $window, handleKeydown);
7351
7237
  var div = first_child(fragment);
7352
- var text$1 = child(div);
7238
+ var text = child(div);
7353
7239
  var node = sibling(div, 2);
7354
7240
  TriggerButton(node, {
7355
7241
  get isOpen() {
7356
7242
  return get(isOpen);
7357
7243
  },
7358
- get isMinimized() {
7359
- return get(isMinimized);
7360
- },
7361
- get activeCount() {
7362
- return get(activeCount);
7363
- },
7364
7244
  get lang() {
7365
7245
  return get(widgetLang);
7366
7246
  },
@@ -7373,7 +7253,6 @@ function WidgetApp($$anchor, $$props) {
7373
7253
  }
7374
7254
  });
7375
7255
  var div_1 = sibling(node, 2);
7376
- let classes;
7377
7256
  var node_1 = child(div_1);
7378
7257
  PanelHeader(node_1, {
7379
7258
  get lang() {
@@ -7384,34 +7263,30 @@ function WidgetApp($$anchor, $$props) {
7384
7263
  },
7385
7264
  onclose: close,
7386
7265
  onreset: resetAll,
7387
- onminimize: minimize,
7388
- ondockchange: handleDockChange,
7389
- get currentDock() {
7390
- return get(currentDock);
7266
+ ondrag: handlePanelDrag,
7267
+ get panelEl() {
7268
+ return get(panelEl);
7391
7269
  }
7392
7270
  });
7393
7271
  var div_2 = sibling(node_1, 2);
7394
7272
  var div_3 = child(div_2);
7395
- var span = child(div_3);
7396
- var text_1 = child(span);
7397
- var div_4 = sibling(span, 2);
7398
- var button = child(div_4);
7399
- var span_1 = child(button);
7400
- var node_2 = child(span_1);
7273
+ var button = child(div_3);
7274
+ var span = child(button);
7275
+ var node_2 = child(span);
7401
7276
  html(node_2, iconGlobe);
7402
- var span_2 = sibling(node_2, 2);
7403
- var text_2 = child(span_2);
7404
- var svg = sibling(span_1, 2);
7405
- let classes_1;
7277
+ var span_1 = sibling(node_2, 2);
7278
+ var text_1 = child(span_1);
7279
+ var svg = sibling(span, 2);
7280
+ let classes;
7406
7281
  var node_3 = sibling(button, 2);
7407
7282
  {
7408
7283
  var consequent_1 = ($$anchor2) => {
7409
- var div_5 = root_1();
7410
- each(div_5, 21, () => LANGUAGE_OPTIONS, index, ($$anchor3, option) => {
7284
+ var div_4 = root_1();
7285
+ each(div_4, 21, () => LANGUAGE_OPTIONS, index, ($$anchor3, option) => {
7411
7286
  var button_1 = root_2();
7412
- var span_3 = child(button_1);
7413
- var text_3 = child(span_3);
7414
- var node_4 = sibling(span_3, 2);
7287
+ var span_2 = child(button_1);
7288
+ var text_2 = child(span_2);
7289
+ var node_4 = sibling(span_2, 2);
7415
7290
  {
7416
7291
  var consequent = ($$anchor4) => {
7417
7292
  var svg_1 = root_3();
@@ -7424,113 +7299,20 @@ function WidgetApp($$anchor, $$props) {
7424
7299
  template_effect(() => {
7425
7300
  set_attribute(button_1, "aria-selected", get(widgetLang) === get(option).code);
7426
7301
  set_attribute(button_1, "data-active", get(widgetLang) === get(option).code);
7427
- set_text(text_3, `${(get(option).flag || "") ?? ""} ${get(option).label ?? ""}`);
7302
+ set_text(text_2, `${(get(option).flag || "") ?? ""} ${get(option).label ?? ""}`);
7428
7303
  });
7429
- delegated("click", button_1, () => handleWidgetLangChange(get(option).code));
7304
+ delegated("click", button_1, () => handleLangChange(get(option).code));
7430
7305
  append($$anchor3, button_1);
7431
7306
  });
7432
- template_effect(() => set_attribute(div_5, "aria-label", get(widgetLang) === "de" ? "Widget-Sprache wählen" : "Select widget language"));
7433
- append($$anchor2, div_5);
7307
+ template_effect(($0) => set_attribute(div_4, "aria-label", $0), [() => t("widget.title", get(widgetLang))]);
7308
+ append($$anchor2, div_4);
7434
7309
  };
7435
7310
  if_block(node_3, ($$render) => {
7436
- if (get(widgetLangDropdownOpen)) $$render(consequent_1);
7437
- });
7438
- }
7439
- var div_6 = sibling(div_3, 2);
7440
- var span_4 = child(div_6);
7441
- var text_4 = child(span_4);
7442
- var div_7 = sibling(span_4, 2);
7443
- var button_2 = child(div_7);
7444
- let classes_2;
7445
- var span_5 = child(button_2);
7446
- var span_6 = sibling(child(span_5), 2);
7447
- var node_5 = child(span_6);
7448
- {
7449
- var consequent_2 = ($$anchor2) => {
7450
- var text_5 = text();
7451
- template_effect(
7452
- ($0, $1) => set_text(text_5, `${$0 ?? ""}
7453
- ${$1 ?? ""}`),
7454
- [
7455
- () => TRANSLATE_LANGUAGES.find((l) => l.code === get(pageTranslateLang))?.flag || "",
7456
- () => TRANSLATE_LANGUAGES.find((l) => l.code === get(pageTranslateLang))?.label || get(pageTranslateLang)
7457
- ]
7458
- );
7459
- append($$anchor2, text_5);
7460
- };
7461
- var alternate = ($$anchor2) => {
7462
- var text_6 = text();
7463
- template_effect(() => set_text(text_6, get(widgetLang) === "de" ? "Sprache wählen..." : "Select language..."));
7464
- append($$anchor2, text_6);
7465
- };
7466
- if_block(node_5, ($$render) => {
7467
- if (get(pageTranslateActive) && get(pageTranslateLang)) $$render(consequent_2);
7468
- else $$render(alternate, -1);
7469
- });
7470
- }
7471
- var svg_2 = sibling(span_5, 2);
7472
- let classes_3;
7473
- var node_6 = sibling(button_2, 2);
7474
- {
7475
- var consequent_3 = ($$anchor2) => {
7476
- var div_8 = root_6();
7477
- var span_7 = child(div_8);
7478
- var text_7 = child(span_7);
7479
- var button_3 = sibling(span_7, 2);
7480
- var span_8 = sibling(child(button_3), 2);
7481
- var text_8 = child(span_8);
7482
- template_effect(
7483
- ($0) => {
7484
- set_text(text_7, `${get(widgetLang) === "de" ? "Aktiv" : "Active"}: ${$0 ?? ""}`);
7485
- set_attribute(button_3, "aria-label", get(widgetLang) === "de" ? "Original wiederherstellen" : "Restore original");
7486
- set_text(text_8, get(widgetLang) === "de" ? "Zurücksetzen" : "Restore");
7487
- },
7488
- [
7489
- () => TRANSLATE_LANGUAGES.find((l) => l.code === get(pageTranslateLang))?.label || get(pageTranslateLang)
7490
- ]
7491
- );
7492
- delegated("click", button_3, restorePageTranslation);
7493
- append($$anchor2, div_8);
7494
- };
7495
- if_block(node_6, ($$render) => {
7496
- if (get(pageTranslateActive)) $$render(consequent_3);
7497
- });
7498
- }
7499
- var node_7 = sibling(node_6, 2);
7500
- {
7501
- var consequent_5 = ($$anchor2) => {
7502
- var div_9 = root_7();
7503
- each(div_9, 21, () => TRANSLATE_LANGUAGES, index, ($$anchor3, option) => {
7504
- var button_4 = root_8();
7505
- var span_9 = child(button_4);
7506
- var text_9 = child(span_9);
7507
- var node_8 = sibling(span_9, 2);
7508
- {
7509
- var consequent_4 = ($$anchor4) => {
7510
- var svg_3 = root_9();
7511
- append($$anchor4, svg_3);
7512
- };
7513
- if_block(node_8, ($$render) => {
7514
- if (get(pageTranslateLang) === get(option).code) $$render(consequent_4);
7515
- });
7516
- }
7517
- template_effect(() => {
7518
- set_attribute(button_4, "aria-selected", get(pageTranslateLang) === get(option).code);
7519
- set_attribute(button_4, "data-active", get(pageTranslateLang) === get(option).code);
7520
- set_text(text_9, `${get(option).flag ?? ""} ${get(option).label ?? ""}`);
7521
- });
7522
- delegated("click", button_4, () => handlePageTranslate(get(option).code));
7523
- append($$anchor3, button_4);
7524
- });
7525
- template_effect(() => set_attribute(div_9, "aria-label", get(widgetLang) === "de" ? "Zielsprache für Seitenübersetzung" : "Target language for page translation"));
7526
- append($$anchor2, div_9);
7527
- };
7528
- if_block(node_7, ($$render) => {
7529
- if (get(translateDropdownOpen)) $$render(consequent_5);
7311
+ if (get(langDropdownOpen)) $$render(consequent_1);
7530
7312
  });
7531
7313
  }
7532
- var node_9 = sibling(div_6, 4);
7533
- ProfileSection(node_9, {
7314
+ var node_5 = sibling(div_3, 4);
7315
+ ProfileSection(node_5, {
7534
7316
  get lang() {
7535
7317
  return get(widgetLang);
7536
7318
  },
@@ -7539,10 +7321,10 @@ function WidgetApp($$anchor, $$props) {
7539
7321
  },
7540
7322
  onactivate: handleProfileActivate
7541
7323
  });
7542
- var node_10 = sibling(node_9, 4);
7324
+ var node_6 = sibling(node_5, 4);
7543
7325
  {
7544
7326
  let $0 = /* @__PURE__ */ user_derived(() => ({ ...config2(), lang: get(widgetLang) }));
7545
- FeatureGrid(node_10, {
7327
+ FeatureGrid(node_6, {
7546
7328
  get config() {
7547
7329
  return get($0);
7548
7330
  },
@@ -7552,8 +7334,8 @@ function WidgetApp($$anchor, $$props) {
7552
7334
  ontoggle: handleFeatureToggle
7553
7335
  });
7554
7336
  }
7555
- var node_11 = sibling(div_2, 2);
7556
- PanelFooter(node_11, {
7337
+ var node_7 = sibling(div_2, 2);
7338
+ PanelFooter(node_7, {
7557
7339
  get lang() {
7558
7340
  return get(widgetLang);
7559
7341
  },
@@ -7563,29 +7345,19 @@ function WidgetApp($$anchor, $$props) {
7563
7345
  get dashboardUrl() {
7564
7346
  return config2().dashboardUrl;
7565
7347
  },
7566
- onclose: close,
7567
- onminimize: minimize
7348
+ onclose: close
7568
7349
  });
7569
7350
  bind_this(div_1, ($$value) => set(panelEl, $$value), () => get(panelEl));
7570
7351
  template_effect(
7571
7352
  ($0, $1) => {
7572
- set_text(text$1, get(announcement));
7573
- classes = set_class(div_1, 1, "accessify-panel", null, classes, { "accessify-panel--left": get(currentDock) === "left" });
7353
+ set_text(text, get(announcement));
7574
7354
  set_attribute(div_1, "aria-label", $0);
7575
7355
  set_attribute(div_1, "aria-hidden", !get(isOpen));
7576
7356
  set_attribute(div_1, "dir", $1);
7577
- set_text(text_1, get(widgetLang) === "de" ? "Widget-Sprache" : "Widget Language");
7578
- set_attribute(button, "aria-expanded", get(widgetLangDropdownOpen));
7579
- set_text(text_2, `${(get(currentLangOption)?.flag || "") ?? ""} ${(get(currentLangOption)?.label || get(widgetLang)) ?? ""}`);
7580
- classes_1 = set_class(svg, 0, "accessify-lang-chevron", null, classes_1, {
7581
- "accessify-lang-chevron--open": get(widgetLangDropdownOpen)
7582
- });
7583
- set_text(text_4, get(widgetLang) === "de" ? "Seite übersetzen" : "Translate Page");
7584
- classes_2 = set_class(button_2, 1, "accessify-translate-toggle", null, classes_2, {
7585
- "accessify-translate-toggle--active": get(pageTranslateActive)
7586
- });
7587
- set_attribute(button_2, "aria-expanded", get(translateDropdownOpen));
7588
- classes_3 = set_class(svg_2, 0, "accessify-lang-chevron", null, classes_3, { "accessify-lang-chevron--open": get(translateDropdownOpen) });
7357
+ set_style(div_1, get(panelStyle));
7358
+ set_attribute(button, "aria-expanded", get(langDropdownOpen));
7359
+ set_text(text_1, `${(get(currentLangOption)?.flag || "") ?? ""} ${(get(currentLangOption)?.label || get(widgetLang)) ?? ""}`);
7360
+ classes = set_class(svg, 0, "accessify-lang-chevron", null, classes, { "accessify-lang-chevron--open": get(langDropdownOpen) });
7589
7361
  div_1.dir = div_1.dir;
7590
7362
  },
7591
7363
  [
@@ -7594,12 +7366,7 @@ function WidgetApp($$anchor, $$props) {
7594
7366
  ]
7595
7367
  );
7596
7368
  delegated("click", button, () => {
7597
- set(widgetLangDropdownOpen, !get(widgetLangDropdownOpen));
7598
- set(translateDropdownOpen, false);
7599
- });
7600
- delegated("click", button_2, () => {
7601
- set(translateDropdownOpen, !get(translateDropdownOpen));
7602
- set(widgetLangDropdownOpen, false);
7369
+ set(langDropdownOpen, !get(langDropdownOpen));
7603
7370
  });
7604
7371
  append($$anchor, fragment);
7605
7372
  return pop($$exports);
@@ -7684,11 +7451,6 @@ function createWidgetStyles(config2) {
7684
7451
  .accessify-trigger:hover { transform: translateY(-2px); box-shadow: 0 8px 28px rgba(50,60,100,0.6); }
7685
7452
  .accessify-trigger:active { transform: scale(0.96); }
7686
7453
  .accessify-trigger--hidden { opacity:0; pointer-events:none; transform:scale(0.9); }
7687
- .accessify-trigger--minimized {
7688
- /* Minimized state: trigger stays visible as return button */
7689
- opacity: 1 !important; pointer-events: auto !important; transform: none !important;
7690
- }
7691
- .accessify-trigger--minimized:hover { transform: translateY(-2px) !important; }
7692
7454
  .accessify-trigger svg { width: 26px; height: 26px; }
7693
7455
  .accessify-trigger--dragging { cursor: grabbing !important; opacity: 0.85; }
7694
7456
 
@@ -7714,15 +7476,6 @@ function createWidgetStyles(config2) {
7714
7476
  box-shadow: var(--shadow);
7715
7477
  transition: opacity 200ms ease, transform 200ms ease;
7716
7478
  }
7717
- /* Dynamic dock override via class */
7718
- .accessify-panel--left {
7719
- left: 0; right: auto;
7720
- border-radius: 0 20px 20px 0;
7721
- }
7722
- .accessify-panel:not(.accessify-panel--left) {
7723
- right: 0; left: auto;
7724
- border-radius: 20px 0 0 20px;
7725
- }
7726
7479
  .accessify-panel[aria-hidden="true"] { opacity:0; transform:${hiddenTransform}; pointer-events:none; display:none; }
7727
7480
  .accessify-panel[aria-hidden="false"] { opacity:1; transform:translateX(0); }
7728
7481
 
@@ -7752,30 +7505,12 @@ function createWidgetStyles(config2) {
7752
7505
  .accessify-header-btn--icon { padding: 0; }
7753
7506
  .accessify-header-btn--close { background: transparent; border-color: transparent; }
7754
7507
 
7755
- /* ─── Docking buttons ─── */
7756
- .accessify-dock-group {
7757
- display: inline-flex; gap: 2px;
7758
- border-radius: 8px; border: 1px solid var(--border);
7759
- overflow: hidden;
7760
- }
7761
- .accessify-dock-btn {
7762
- display: inline-flex; align-items: center; justify-content: center;
7763
- width: 28px; height: 28px; border: none;
7764
- background: transparent; color: var(--text-dim);
7765
- cursor: pointer; transition: background var(--fast), color var(--fast);
7766
- }
7767
- .accessify-dock-btn:hover { background: var(--surface-hover); color: var(--text); }
7768
- .accessify-dock-btn[data-active="true"] { background: var(--accent-soft); color: var(--accent); }
7769
- .accessify-dock-btn svg { width: 14px; height: 14px; }
7770
-
7771
- /* ─── Section Labels ─── */
7772
- .accessify-control-section {
7773
- display: flex; flex-direction: column; gap: 6px;
7774
- }
7775
- .accessify-section-label {
7776
- font-size: 11px; font-weight: 700; text-transform: uppercase;
7777
- letter-spacing: 0.05em; color: var(--text-dim); padding-left: 2px;
7508
+ /* Drag handle */
7509
+ .accessify-drag-handle {
7510
+ cursor: grab; touch-action: none;
7778
7511
  }
7512
+ .accessify-drag-handle:active { cursor: grabbing; }
7513
+ .accessify-drag-handle svg { stroke-width: 3; }
7779
7514
 
7780
7515
  /* ─── Shared Accordion (Language + Profiles) ─── */
7781
7516
  .accessify-lang-dropdown,
@@ -7786,7 +7521,6 @@ function createWidgetStyles(config2) {
7786
7521
  }
7787
7522
 
7788
7523
  .accessify-lang-toggle,
7789
- .accessify-translate-toggle,
7790
7524
  .accessify-accordion-toggle {
7791
7525
  display: flex; align-items: center; justify-content: space-between;
7792
7526
  width: 100%; padding: 14px 14px;
@@ -7796,32 +7530,8 @@ function createWidgetStyles(config2) {
7796
7530
  transition: background var(--fast);
7797
7531
  }
7798
7532
  .accessify-lang-toggle:hover,
7799
- .accessify-translate-toggle:hover,
7800
7533
  .accessify-accordion-toggle:hover { background: var(--surface-hover); }
7801
7534
 
7802
- /* Active translation indicator */
7803
- .accessify-translate-toggle--active {
7804
- border-left: 3px solid var(--accent);
7805
- }
7806
-
7807
- /* Translation active status bar */
7808
- .accessify-translate-status {
7809
- display: flex; align-items: center; justify-content: space-between;
7810
- padding: 8px 12px;
7811
- background: var(--accent-soft);
7812
- border-top: 1px solid var(--border);
7813
- font-size: 12px; font-weight: 600; color: var(--accent);
7814
- }
7815
- .accessify-translate-restore {
7816
- display: inline-flex; align-items: center; gap: 4px;
7817
- padding: 4px 10px; border: none; border-radius: 6px;
7818
- background: var(--surface); color: var(--text-dim);
7819
- cursor: pointer; font-size: 11px; font-weight: 600; font-family: inherit;
7820
- transition: background var(--fast), color var(--fast);
7821
- }
7822
- .accessify-translate-restore:hover { background: var(--accent); color: #fff; }
7823
- .accessify-translate-restore svg { width: 12px; height: 12px; }
7824
-
7825
7535
  .accessify-lang-toggle-left,
7826
7536
  .accessify-accordion-toggle-left {
7827
7537
  display: flex; align-items: center; gap: 10px;
@@ -7858,7 +7568,7 @@ function createWidgetStyles(config2) {
7858
7568
  color: var(--text); cursor: pointer;
7859
7569
  font-size: 14px; font-weight: 500; font-family: inherit;
7860
7570
  transition: background var(--fast);
7861
- min-height: 44px; /* Hit area */
7571
+ min-height: 44px;
7862
7572
  }
7863
7573
  .accessify-lang-option:hover { background: var(--surface-hover); }
7864
7574
  .accessify-lang-option[data-active="true"] { color: var(--accent); font-weight: 700; }
@@ -8037,37 +7747,33 @@ function createWidgetStyles(config2) {
8037
7747
  flex-shrink: 0;
8038
7748
  }
8039
7749
 
8040
- /* ─── Utility Bar (bottom of panel) ─── */
8041
- .accessify-utility-bar {
8042
- display: flex; gap: 8px;
8043
- padding: 8px var(--pad);
8044
- border-top: 1px solid var(--border);
8045
- background: var(--surface-dim);
8046
- flex-shrink: 0;
8047
- }
8048
- .accessify-utility-btn {
8049
- flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
8050
- padding: 10px 12px; min-height: 40px;
8051
- border: 1px solid var(--border); border-radius: 10px;
8052
- background: var(--surface); color: var(--text-dim);
8053
- cursor: pointer; font-size: 13px; font-weight: 600; font-family: inherit;
8054
- transition: background var(--fast), color var(--fast), border-color var(--fast);
8055
- }
8056
- .accessify-utility-btn:hover { background: var(--surface-hover); color: var(--text); border-color: var(--border-hl); }
8057
- .accessify-utility-btn svg { width: 16px; height: 16px; flex-shrink: 0; }
8058
- .accessify-utility-btn--close:hover { border-color: var(--accent); color: var(--accent); }
8059
-
8060
7750
  /* ─── Footer ─── */
8061
7751
  .accessify-footer {
8062
- display: flex; align-items: center; justify-content: center; gap: 8px;
8063
- padding: 8px var(--pad);
7752
+ display: flex; align-items: center; justify-content: space-between;
7753
+ padding: 10px var(--pad);
8064
7754
  border-top: 1px solid var(--border);
8065
7755
  color: var(--text-dim); font-size: 11px;
8066
7756
  background: var(--surface-dim); flex-shrink: 0;
7757
+ gap: 8px;
7758
+ }
7759
+ .accessify-footer-links {
7760
+ display: flex; align-items: center; gap: 8px;
8067
7761
  }
8068
7762
  .accessify-footer a { color: var(--accent); text-decoration: none; font-weight: 600; }
8069
7763
  .accessify-footer a:hover { text-decoration: underline; }
8070
7764
 
7765
+ .accessify-footer-close {
7766
+ display: inline-flex; align-items: center; gap: 5px;
7767
+ padding: 6px 14px; min-height: 34px;
7768
+ border: 1px solid var(--border); border-radius: 10px;
7769
+ background: var(--surface); color: var(--text-dim);
7770
+ cursor: pointer; font-size: 12px; font-weight: 600; font-family: inherit;
7771
+ transition: background var(--fast), color var(--fast), border-color var(--fast);
7772
+ flex-shrink: 0;
7773
+ }
7774
+ .accessify-footer-close:hover { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
7775
+ .accessify-footer-close svg { width: 14px; height: 14px; flex-shrink: 0; }
7776
+
8071
7777
  /* ─── Reduced Motion ─── */
8072
7778
  @media (prefers-reduced-motion: reduce) {
8073
7779
  *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
@@ -8076,7 +7782,6 @@ function createWidgetStyles(config2) {
8076
7782
  /* ─── Mobile ─── */
8077
7783
  @media (max-width: 640px) {
8078
7784
  .accessify-panel { width: 100vw; border-radius: 0; }
8079
- .accessify-panel--left { border-radius: 0; }
8080
7785
  .accessify-features { gap: 8px; }
8081
7786
  .accessify-body { padding: 8px 12px; }
8082
7787
  .accessify-trigger {
@@ -8084,7 +7789,6 @@ function createWidgetStyles(config2) {
8084
7789
  ${isRight ? "right: 16px" : "left: 16px"};
8085
7790
  width: 50px; height: 50px; border-radius: 14px;
8086
7791
  }
8087
- .accessify-dock-group { display: none; }
8088
7792
  }
8089
7793
  `;
8090
7794
  }
@@ -8464,7 +8168,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8464
8168
  styleEl = null;
8465
8169
  document.getElementById(STYLE_ID)?.remove();
8466
8170
  }
8467
- function showDescribeTooltip(text2, rect, loading = false) {
8171
+ function showDescribeTooltip(text, rect, loading = false) {
8468
8172
  hideDescribeTooltip();
8469
8173
  const tip = document.createElement("div");
8470
8174
  tip.className = "accessify-describe-tooltip";
@@ -8484,7 +8188,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8484
8188
  tip.appendChild(loadingEl);
8485
8189
  } else {
8486
8190
  const textEl = document.createElement("div");
8487
- textEl.textContent = text2;
8191
+ textEl.textContent = text;
8488
8192
  tip.appendChild(textEl);
8489
8193
  }
8490
8194
  document.body.appendChild(tip);
@@ -8780,7 +8484,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8780
8484
  );
8781
8485
  }
8782
8486
  }
8783
- function showBadge(text2, color, count) {
8487
+ function showBadge(text, color, count) {
8784
8488
  const badge = document.createElement("div");
8785
8489
  badge.className = "accessify-alt-badge";
8786
8490
  badge.setAttribute("role", "status");
@@ -8793,7 +8497,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8793
8497
  badge.appendChild(c);
8794
8498
  }
8795
8499
  const label = document.createElement("span");
8796
- label.textContent = text2;
8500
+ label.textContent = text;
8797
8501
  badge.appendChild(label);
8798
8502
  document.body.appendChild(badge);
8799
8503
  badgeEl = badge;
@@ -9092,4 +8796,4 @@ export {
9092
8796
  init as i,
9093
8797
  t
9094
8798
  };
9095
- //# sourceMappingURL=index-BiF0o7li.js.map
8799
+ //# sourceMappingURL=index-CFoky8Ty.js.map