accessify-widget 0.2.22 → 0.3.0

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,6 +3441,13 @@ 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
+ }
3444
3451
  function append(anchor, dom) {
3445
3452
  if (anchor === null) {
3446
3453
  return;
@@ -3450,11 +3457,11 @@ function append(anchor, dom) {
3450
3457
  dom
3451
3458
  );
3452
3459
  }
3453
- function set_text(text, value) {
3460
+ function set_text(text2, value) {
3454
3461
  var str = value == null ? "" : typeof value === "object" ? `${value}` : value;
3455
- if (str !== (text.__t ?? (text.__t = text.nodeValue))) {
3456
- text.__t = str;
3457
- text.nodeValue = `${str}`;
3462
+ if (str !== (text2.__t ?? (text2.__t = text2.nodeValue))) {
3463
+ text2.__t = str;
3464
+ text2.nodeValue = `${str}`;
3458
3465
  }
3459
3466
  }
3460
3467
  function mount(component, options) {
@@ -4794,7 +4801,16 @@ const deJson = {
4794
4801
  "footer.disclaimer": "Dieses Widget verbessert die Barrierefreiheit, ersetzt aber keine barrierefreie Webentwicklung.",
4795
4802
  "footer.docs": "Dokumentation",
4796
4803
  "footer.github": "GitHub",
4797
- "bfsg.notice": "Hinweis: Dieses Overlay-Tool allein erfüllt nicht die Anforderungen des BFSG. Professionelle Barrierefreiheit erfordert strukturelle Änderungen am Quellcode."
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"
4798
4814
  };
4799
4815
  const enJson = {
4800
4816
  "widget.title": "Accessibility",
@@ -4883,7 +4899,16 @@ const enJson = {
4883
4899
  "footer.disclaimer": "This widget enhances accessibility but does not replace accessible web development.",
4884
4900
  "footer.docs": "Documentation",
4885
4901
  "footer.github": "GitHub",
4886
- "bfsg.notice": "Note: This overlay tool alone does not meet BFSG requirements. Full accessibility requires structural changes to the source code."
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"
4887
4912
  };
4888
4913
  const EN_BASE = {
4889
4914
  ...enJson,
@@ -5758,10 +5783,11 @@ function t(key, lang = "en") {
5758
5783
  const resolved = getSupportedLang(lang);
5759
5784
  return locales[resolved]?.[key] || EN_BASE[key] || key;
5760
5785
  }
5761
- var root$5 = /* @__PURE__ */ from_html(`<button></button>`);
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>`);
5762
5788
  function TriggerButton($$anchor, $$props) {
5763
5789
  push($$props, true);
5764
- let lang = prop($$props, "lang", 3, "en"), el = prop($$props, "el", 15, null);
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);
5765
5791
  let isDragging = /* @__PURE__ */ state(false);
5766
5792
  onMount(() => {
5767
5793
  const btn = el();
@@ -5773,7 +5799,6 @@ function TriggerButton($$anchor, $$props) {
5773
5799
  let hasMoved = false;
5774
5800
  let pointerId = null;
5775
5801
  function onDown(e) {
5776
- if ($$props.isOpen) return;
5777
5802
  const rect = btn.getBoundingClientRect();
5778
5803
  dragStartX = e.clientX;
5779
5804
  dragStartY = e.clientY;
@@ -5822,12 +5847,29 @@ function TriggerButton($$anchor, $$props) {
5822
5847
  });
5823
5848
  var button = root$5();
5824
5849
  let classes;
5825
- html(button, () => $$props.isOpen ? iconClose() : iconAccessibility(), true);
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
+ }
5826
5864
  bind_this(button, ($$value) => el($$value), () => el());
5827
5865
  template_effect(
5828
5866
  ($0) => {
5829
- classes = set_class(button, 1, "accessify-trigger", null, classes, { "accessify-trigger--dragging": get(isDragging) });
5830
- set_attribute(button, "aria-expanded", $$props.isOpen);
5867
+ classes = set_class(button, 1, "accessify-trigger", null, classes, {
5868
+ "accessify-trigger--dragging": get(isDragging),
5869
+ "accessify-trigger--hidden": $$props.isOpen && !isMinimized(),
5870
+ "accessify-trigger--minimized": isMinimized()
5871
+ });
5872
+ set_attribute(button, "aria-expanded", $$props.isOpen && !isMinimized());
5831
5873
  set_attribute(button, "aria-label", $0);
5832
5874
  },
5833
5875
  [
@@ -5837,31 +5879,49 @@ function TriggerButton($$anchor, $$props) {
5837
5879
  append($$anchor, button);
5838
5880
  pop();
5839
5881
  }
5840
- 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"></button> <button class="accessify-header-btn accessify-header-btn--icon accessify-header-btn--close"></button></div></header>`);
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>`);
5841
5883
  function PanelHeader($$anchor, $$props) {
5842
5884
  push($$props, true);
5843
5885
  let lang = prop($$props, "lang", 3, "en");
5844
5886
  prop($$props, "activeCount", 3, 0);
5887
+ let currentDock = prop($$props, "currentDock", 3, "right");
5845
5888
  var header = root$4();
5846
5889
  var div = sibling(child(header), 2);
5847
- var button = child(div);
5848
- html(button, iconReset, true);
5890
+ var div_1 = child(div);
5891
+ var button = child(div_1);
5849
5892
  var button_1 = sibling(button, 2);
5850
- html(button_1, iconClose, true);
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);
5851
5898
  template_effect(
5852
5899
  ($0, $1) => {
5853
- set_attribute(button, "aria-label", $0);
5854
- set_attribute(button_1, "aria-label", $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);
5855
5910
  },
5856
5911
  [
5857
5912
  () => t("widget.reset", lang()),
5858
5913
  () => t("widget.close", lang())
5859
5914
  ]
5860
5915
  );
5861
- delegated("click", button, function(...$$args) {
5916
+ delegated("click", button, () => $$props.ondockchange("left"));
5917
+ delegated("click", button_1, () => $$props.ondockchange("right"));
5918
+ delegated("click", button_2, function(...$$args) {
5862
5919
  $$props.onreset?.apply(this, $$args);
5863
5920
  });
5864
- delegated("click", button_1, function(...$$args) {
5921
+ delegated("click", button_3, function(...$$args) {
5922
+ $$props.onminimize?.apply(this, $$args);
5923
+ });
5924
+ delegated("click", button_4, function(...$$args) {
5865
5925
  $$props.onclose?.apply(this, $$args);
5866
5926
  });
5867
5927
  append($$anchor, header);
@@ -5925,7 +5985,7 @@ function ProfileSection($$anchor, $$props) {
5925
5985
  var button = child(div);
5926
5986
  var span = child(button);
5927
5987
  var span_1 = sibling(child(span), 2);
5928
- var text = child(span_1);
5988
+ var text2 = child(span_1);
5929
5989
  var svg = sibling(span, 2);
5930
5990
  let classes;
5931
5991
  var node = sibling(button, 2);
@@ -5978,7 +6038,7 @@ function ProfileSection($$anchor, $$props) {
5978
6038
  ($0, $1) => {
5979
6039
  set_attribute(div, "aria-label", $0);
5980
6040
  set_attribute(button, "aria-expanded", get(isOpen));
5981
- set_text(text, $1);
6041
+ set_text(text2, $1);
5982
6042
  classes = set_class(svg, 0, "accessify-accordion-chevron", null, classes, { "accessify-accordion-chevron--open": get(isOpen) });
5983
6043
  },
5984
6044
  [
@@ -6015,8 +6075,8 @@ function createProxyService(siteKey, proxyUrl) {
6015
6075
  "X-Site-Key": siteKey
6016
6076
  };
6017
6077
  return {
6018
- async simplifyText(text, level = "einfache", lang = "de") {
6019
- const blockId = `b-${simpleHash(text)}`;
6078
+ async simplifyText(text2, level = "einfache", lang = "de") {
6079
+ const blockId = `b-${simpleHash(text2)}`;
6020
6080
  const variant = lang.startsWith("de") ? `de-${level}` : "en-plain";
6021
6081
  try {
6022
6082
  const cacheRes = await fetch(`${base}/v1/cache/query`, {
@@ -6026,7 +6086,7 @@ function createProxyService(siteKey, proxyUrl) {
6026
6086
  pageUrl: typeof window !== "undefined" ? window.location.href : "",
6027
6087
  feature: "simplify",
6028
6088
  variant,
6029
- blocks: [{ id: blockId, text }]
6089
+ blocks: [{ id: blockId, text: text2 }]
6030
6090
  })
6031
6091
  });
6032
6092
  if (cacheRes.ok) {
@@ -6043,7 +6103,7 @@ function createProxyService(siteKey, proxyUrl) {
6043
6103
  pageUrl: typeof window !== "undefined" ? window.location.href : "",
6044
6104
  feature: "simplify",
6045
6105
  variant,
6046
- blocks: [{ id: blockId, text }]
6106
+ blocks: [{ id: blockId, text: text2 }]
6047
6107
  })
6048
6108
  });
6049
6109
  if (processRes.ok) {
@@ -6055,7 +6115,7 @@ function createProxyService(siteKey, proxyUrl) {
6055
6115
  const res = await fetch(`${base}/v1/ai/simplify`, {
6056
6116
  method: "POST",
6057
6117
  headers,
6058
- body: JSON.stringify({ text, level, lang })
6118
+ body: JSON.stringify({ text: text2, level, lang })
6059
6119
  });
6060
6120
  if (!res.ok) {
6061
6121
  const err = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
@@ -6122,7 +6182,7 @@ function createDirectService(config2) {
6122
6182
  "X-Title": "Accessify Widget"
6123
6183
  };
6124
6184
  return {
6125
- async simplifyText(text, level = "einfache", lang = "de") {
6185
+ async simplifyText(text2, level = "einfache", lang = "de") {
6126
6186
  const systemPrompt = lang.startsWith("de") ? getGermanSimplificationPrompt(level) : getEnglishSimplificationPrompt();
6127
6187
  const response = await fetch(`${OPENROUTER_BASE}/chat/completions`, {
6128
6188
  method: "POST",
@@ -6131,7 +6191,7 @@ function createDirectService(config2) {
6131
6191
  model: config2.textModel || DEFAULTS.textModel,
6132
6192
  messages: [
6133
6193
  { role: "system", content: systemPrompt },
6134
- { role: "user", content: text }
6194
+ { role: "user", content: text2 }
6135
6195
  ],
6136
6196
  stream: false,
6137
6197
  max_tokens: 2e3
@@ -6351,14 +6411,14 @@ function FeatureGrid($$anchor, $$props) {
6351
6411
  const FEATURE_LOADERS = {
6352
6412
  contrast: () => import("./contrast-CqsICAkU.js"),
6353
6413
  "text-size": () => import("./text-size-C6OFhCGi.js"),
6354
- "keyboard-nav": () => import("./keyboard-nav-cvuhPLSY.js"),
6414
+ "keyboard-nav": () => import("./keyboard-nav-CE8luwx_.js"),
6355
6415
  "link-highlight": () => import("./link-highlight-DBGm067Y.js"),
6356
6416
  "reading-guide": () => import("./reading-guide-VT8NciIL.js"),
6357
6417
  "reading-mask": () => import("./reading-mask-BABChuCz.js"),
6358
6418
  "animation-stop": () => import("./animation-stop-C0MwseK0.js"),
6359
6419
  "hide-images": () => import("./hide-images-B_LeCBcd.js"),
6360
6420
  "big-cursor": () => import("./big-cursor-B2UKu9dQ.js"),
6361
- "page-structure": () => import("./page-structure-XImoLRLq.js"),
6421
+ "page-structure": () => import("./page-structure-C25HU_D7.js"),
6362
6422
  tts: () => import("./tts-CjszLRnb.js"),
6363
6423
  "text-simplify": () => import("./text-simplify-Cvhpio7g.js"),
6364
6424
  "alt-text": () => Promise.resolve().then(() => altText)
@@ -6509,7 +6569,7 @@ function FeatureGrid($$anchor, $$props) {
6509
6569
  var span = child(div_1);
6510
6570
  html(span, () => getIcon("contrast"), true);
6511
6571
  var span_1 = sibling(span, 2);
6512
- var text = child(span_1);
6572
+ var text2 = child(span_1);
6513
6573
  var div_2 = sibling(div_1, 2);
6514
6574
  each(div_2, 21, () => CONTRAST_MODES, index, ($$anchor3, mode) => {
6515
6575
  var button = root_2$1();
@@ -6531,7 +6591,7 @@ function FeatureGrid($$anchor, $$props) {
6531
6591
  template_effect(
6532
6592
  ($0, $1) => {
6533
6593
  set_attribute(div, "aria-label", $0);
6534
- set_text(text, $1);
6594
+ set_text(text2, $1);
6535
6595
  },
6536
6596
  [
6537
6597
  () => t("feature.contrast", $$props.config.lang),
@@ -6636,35 +6696,57 @@ function FeatureGrid($$anchor, $$props) {
6636
6696
  }
6637
6697
  delegate(["click"]);
6638
6698
  var root_1$1 = /* @__PURE__ */ from_html(`<span aria-hidden="true">&middot;</span> <a target="_blank" rel="noopener noreferrer"> </a>`, 1);
6639
- var root$1 = /* @__PURE__ */ from_html(`<div class="accessify-footer"><a target="_blank" rel="noopener noreferrer">Accessify Dashboard</a> <!></div>`);
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);
6640
6700
  function PanelFooter($$anchor, $$props) {
6641
6701
  push($$props, true);
6642
6702
  let lang = prop($$props, "lang", 3, "en");
6643
- var div = root$1();
6644
- var a = child(div);
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);
6712
+ var a = child(div_1);
6645
6713
  var node = sibling(a, 2);
6646
6714
  {
6647
6715
  var consequent = ($$anchor2) => {
6648
- var fragment = root_1$1();
6649
- var a_1 = sibling(first_child(fragment), 2);
6650
- var text = child(a_1);
6716
+ var fragment_1 = root_1$1();
6717
+ var a_1 = sibling(first_child(fragment_1), 2);
6718
+ var text_2 = child(a_1);
6651
6719
  template_effect(
6652
6720
  ($0) => {
6653
6721
  set_attribute(a_1, "href", $$props.statementUrl);
6654
- set_text(text, $0);
6722
+ set_text(text_2, $0);
6655
6723
  },
6656
6724
  [() => t("widget.statement", lang())]
6657
6725
  );
6658
- append($$anchor2, fragment);
6726
+ append($$anchor2, fragment_1);
6659
6727
  };
6660
6728
  if_block(node, ($$render) => {
6661
6729
  if ($$props.statementUrl) $$render(consequent);
6662
6730
  });
6663
6731
  }
6664
- template_effect(() => set_attribute(a, "href", $$props.dashboardUrl || "https://accessify-dashboard.pages.dev"));
6665
- append($$anchor, div);
6732
+ template_effect(
6733
+ ($0) => {
6734
+ set_text(text2, lang() === "de" ? "Minimieren" : "Minimize");
6735
+ set_text(text_1, $0);
6736
+ set_attribute(a, "href", $$props.dashboardUrl || "https://accessify-dashboard.pages.dev");
6737
+ },
6738
+ [() => t("widget.close", lang())]
6739
+ );
6740
+ delegated("click", button, function(...$$args) {
6741
+ $$props.onminimize?.apply(this, $$args);
6742
+ });
6743
+ delegated("click", button_1, function(...$$args) {
6744
+ $$props.onclose?.apply(this, $$args);
6745
+ });
6746
+ append($$anchor, fragment);
6666
6747
  pop();
6667
6748
  }
6749
+ delegate(["click"]);
6668
6750
  let savedTextNodes = [];
6669
6751
  let savedAttrs = [];
6670
6752
  let currentTranslateLang = null;
@@ -6684,13 +6766,13 @@ const TRANSLATABLE_ATTRS = [
6684
6766
  "aria-valuetext"
6685
6767
  ];
6686
6768
  const TRANSLATE_URL = "https://translate.googleapis.com/translate_a/single";
6687
- async function translateSingleText(text, sourceLang, targetLang) {
6769
+ async function translateSingleText(text2, sourceLang, targetLang) {
6688
6770
  const params = new URLSearchParams({
6689
6771
  client: "gtx",
6690
6772
  sl: sourceLang,
6691
6773
  tl: targetLang,
6692
6774
  dt: "t",
6693
- q: text
6775
+ q: text2
6694
6776
  });
6695
6777
  try {
6696
6778
  const res = await fetch(`${TRANSLATE_URL}?${params.toString()}`);
@@ -6705,9 +6787,9 @@ async function translateSingleText(text, sourceLang, targetLang) {
6705
6787
  }
6706
6788
  return parts.join("");
6707
6789
  }
6708
- return text;
6790
+ return text2;
6709
6791
  } catch {
6710
- return text;
6792
+ return text2;
6711
6793
  }
6712
6794
  }
6713
6795
  async function translateTexts(texts, sourceLang, targetLang) {
@@ -6716,7 +6798,7 @@ async function translateTexts(texts, sourceLang, targetLang) {
6716
6798
  for (let start = 0; start < texts.length; start += CONCURRENCY) {
6717
6799
  const batch = texts.slice(start, start + CONCURRENCY);
6718
6800
  const translated = await Promise.all(
6719
- batch.map((text) => translateSingleText(text, sourceLang, targetLang))
6801
+ batch.map((text2) => translateSingleText(text2, sourceLang, targetLang))
6720
6802
  );
6721
6803
  for (let j = 0; j < translated.length; j++) {
6722
6804
  results[start + j] = translated[j];
@@ -6791,9 +6873,9 @@ async function translatePage(targetLang) {
6791
6873
  if (uniqueTexts.length === 0) return;
6792
6874
  const translated = await translateTexts(uniqueTexts, pageLang, targetLang);
6793
6875
  const lookup = /* @__PURE__ */ new Map();
6794
- uniqueTexts.forEach((text, i) => {
6795
- if (translated[i] && translated[i] !== text) {
6796
- lookup.set(text, translated[i]);
6876
+ uniqueTexts.forEach((text2, i) => {
6877
+ if (translated[i] && translated[i] !== text2) {
6878
+ lookup.set(text2, translated[i]);
6797
6879
  }
6798
6880
  });
6799
6881
  observerPaused = true;
@@ -6936,12 +7018,17 @@ function createTextTransformService() {
6936
7018
  }
6937
7019
  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>`);
6938
7020
  var root_2 = /* @__PURE__ */ from_html(`<button class="accessify-lang-option" role="option"><span> </span> <!></button>`);
6939
- var root_1 = /* @__PURE__ */ from_html(`<div class="accessify-lang-list" role="listbox"></div>`);
6940
- 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"><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);
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);
6941
7027
  function WidgetApp($$anchor, $$props) {
6942
7028
  push($$props, true);
6943
7029
  let config2 = prop($$props, "config", 7);
6944
7030
  let isOpen = /* @__PURE__ */ state(false);
7031
+ let isMinimized = /* @__PURE__ */ state(false);
6945
7032
  let activeFeatures = /* @__PURE__ */ state(proxy(/* @__PURE__ */ new Map()));
6946
7033
  let currentTheme = /* @__PURE__ */ state("light");
6947
7034
  let panelEl = /* @__PURE__ */ state(null);
@@ -6949,11 +7036,93 @@ function WidgetApp($$anchor, $$props) {
6949
7036
  let announcement = /* @__PURE__ */ state("");
6950
7037
  let widgetLang = /* @__PURE__ */ state("en");
6951
7038
  let activeProfileId = /* @__PURE__ */ state(null);
6952
- let langDropdownOpen = /* @__PURE__ */ state(false);
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);
6953
7044
  const textTransformService = createTextTransformService();
6954
7045
  const STORAGE_KEY = "accessify-prefs";
7046
+ const DOCK_KEY = "accessify-dock";
6955
7047
  let activeCount = /* @__PURE__ */ user_derived(() => Array.from(get(activeFeatures).values()).filter(Boolean).length);
6956
7048
  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
+ ];
6957
7126
  function announce(message) {
6958
7127
  set(announcement, "");
6959
7128
  requestAnimationFrame(() => {
@@ -6967,6 +7136,12 @@ function WidgetApp($$anchor, $$props) {
6967
7136
  const prefs = JSON.parse(saved);
6968
7137
  set(activeFeatures, new Map(Object.entries(prefs)), true);
6969
7138
  }
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);
7144
+ }
6970
7145
  } catch {
6971
7146
  }
6972
7147
  }
@@ -7011,6 +7186,7 @@ function WidgetApp($$anchor, $$props) {
7011
7186
  }
7012
7187
  function open() {
7013
7188
  set(isOpen, true);
7189
+ set(isMinimized, false);
7014
7190
  requestAnimationFrame(() => {
7015
7191
  if (get(panelEl)) {
7016
7192
  const first = get(panelEl).querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
@@ -7020,12 +7196,40 @@ function WidgetApp($$anchor, $$props) {
7020
7196
  }
7021
7197
  function close() {
7022
7198
  set(isOpen, false);
7023
- const trigger = $$props.shadow.querySelector(".accessify-trigger");
7024
- trigger?.focus();
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);
7212
+ requestAnimationFrame(() => {
7213
+ const trigger = $$props.shadow.querySelector(".accessify-trigger");
7214
+ trigger?.focus();
7215
+ });
7025
7216
  }
7026
7217
  function toggleOpen() {
7027
- if (get(isOpen)) close();
7028
- else open();
7218
+ if (get(isOpen)) {
7219
+ minimize();
7220
+ } else {
7221
+ open();
7222
+ }
7223
+ }
7224
+ function handleDockChange(dock) {
7225
+ set(currentDock, dock, true);
7226
+ try {
7227
+ localStorage.setItem(DOCK_KEY, dock);
7228
+ } catch {
7229
+ }
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 } }));
7029
7233
  }
7030
7234
  function handleFeatureToggle(id, enabled) {
7031
7235
  get(activeFeatures).set(id, enabled);
@@ -7041,6 +7245,8 @@ function WidgetApp($$anchor, $$props) {
7041
7245
  set(activeProfileId, null);
7042
7246
  savePrefs();
7043
7247
  textTransformService.restore();
7248
+ set(pageTranslateActive, false);
7249
+ set(pageTranslateLang, null);
7044
7250
  window.dispatchEvent(new CustomEvent("accessify:reset"));
7045
7251
  announce(t("widget.resetConfirm", get(widgetLang)));
7046
7252
  }
@@ -7064,23 +7270,58 @@ function WidgetApp($$anchor, $$props) {
7064
7270
  savePrefs();
7065
7271
  announce(`${t(profile.nameKey, get(widgetLang))} ${t("status.activated", get(widgetLang))}`);
7066
7272
  }
7067
- function handleLangChange(newLang) {
7273
+ function handleWidgetLangChange(newLang) {
7068
7274
  set(widgetLang, getSupportedLang(newLang), true);
7069
7275
  config2().lang = get(widgetLang);
7070
- set(langDropdownOpen, false);
7276
+ set(widgetLangDropdownOpen, false);
7071
7277
  applyLanguage();
7278
+ announce(get(widgetLang) === "de" ? `Widget-Sprache: ${get(currentLangOption)?.label}` : `Widget language: ${get(currentLangOption)?.label}`);
7279
+ }
7280
+ function handlePageTranslate(targetLang) {
7072
7281
  const pageLang = document.documentElement.lang?.split("-")[0] || "en";
7073
- if (get(widgetLang) !== pageLang) {
7074
- textTransformService.translate(get(widgetLang));
7075
- } else {
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) {
7076
7291
  textTransformService.restore();
7292
+ set(pageTranslateActive, false);
7293
+ set(pageTranslateLang, null);
7294
+ return;
7077
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);
7078
7307
  }
7079
7308
  function handleKeydown(e) {
7080
- if (e.key === "Escape" && get(isOpen)) {
7081
- e.preventDefault();
7082
- close();
7083
- return;
7309
+ 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);
7317
+ e.preventDefault();
7318
+ return;
7319
+ }
7320
+ if (get(isOpen)) {
7321
+ e.preventDefault();
7322
+ minimize();
7323
+ return;
7324
+ }
7084
7325
  }
7085
7326
  if (e.key === "Tab" && get(isOpen) && get(panelEl)) {
7086
7327
  const focusable = get(panelEl).querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
@@ -7108,12 +7349,18 @@ function WidgetApp($$anchor, $$props) {
7108
7349
  var fragment = root();
7109
7350
  event("keydown", $window, handleKeydown);
7110
7351
  var div = first_child(fragment);
7111
- var text = child(div);
7352
+ var text$1 = child(div);
7112
7353
  var node = sibling(div, 2);
7113
7354
  TriggerButton(node, {
7114
7355
  get isOpen() {
7115
7356
  return get(isOpen);
7116
7357
  },
7358
+ get isMinimized() {
7359
+ return get(isMinimized);
7360
+ },
7361
+ get activeCount() {
7362
+ return get(activeCount);
7363
+ },
7117
7364
  get lang() {
7118
7365
  return get(widgetLang);
7119
7366
  },
@@ -7126,6 +7373,7 @@ function WidgetApp($$anchor, $$props) {
7126
7373
  }
7127
7374
  });
7128
7375
  var div_1 = sibling(node, 2);
7376
+ let classes;
7129
7377
  var node_1 = child(div_1);
7130
7378
  PanelHeader(node_1, {
7131
7379
  get lang() {
@@ -7135,27 +7383,35 @@ function WidgetApp($$anchor, $$props) {
7135
7383
  return get(activeCount);
7136
7384
  },
7137
7385
  onclose: close,
7138
- onreset: resetAll
7386
+ onreset: resetAll,
7387
+ onminimize: minimize,
7388
+ ondockchange: handleDockChange,
7389
+ get currentDock() {
7390
+ return get(currentDock);
7391
+ }
7139
7392
  });
7140
7393
  var div_2 = sibling(node_1, 2);
7141
7394
  var div_3 = child(div_2);
7142
- var button = child(div_3);
7143
- var span = child(button);
7144
- var node_2 = child(span);
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);
7145
7401
  html(node_2, iconGlobe);
7146
- var span_1 = sibling(node_2, 2);
7147
- var text_1 = child(span_1);
7148
- var svg = sibling(span, 2);
7149
- let classes;
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;
7150
7406
  var node_3 = sibling(button, 2);
7151
7407
  {
7152
7408
  var consequent_1 = ($$anchor2) => {
7153
- var div_4 = root_1();
7154
- each(div_4, 21, () => LANGUAGE_OPTIONS, index, ($$anchor3, option) => {
7409
+ var div_5 = root_1();
7410
+ each(div_5, 21, () => LANGUAGE_OPTIONS, index, ($$anchor3, option) => {
7155
7411
  var button_1 = root_2();
7156
- var span_2 = child(button_1);
7157
- var text_2 = child(span_2);
7158
- var node_4 = sibling(span_2, 2);
7412
+ var span_3 = child(button_1);
7413
+ var text_3 = child(span_3);
7414
+ var node_4 = sibling(span_3, 2);
7159
7415
  {
7160
7416
  var consequent = ($$anchor4) => {
7161
7417
  var svg_1 = root_3();
@@ -7168,20 +7424,113 @@ function WidgetApp($$anchor, $$props) {
7168
7424
  template_effect(() => {
7169
7425
  set_attribute(button_1, "aria-selected", get(widgetLang) === get(option).code);
7170
7426
  set_attribute(button_1, "data-active", get(widgetLang) === get(option).code);
7171
- set_text(text_2, `${(get(option).flag || "") ?? ""} ${get(option).label ?? ""}`);
7427
+ set_text(text_3, `${(get(option).flag || "") ?? ""} ${get(option).label ?? ""}`);
7172
7428
  });
7173
- delegated("click", button_1, () => handleLangChange(get(option).code));
7429
+ delegated("click", button_1, () => handleWidgetLangChange(get(option).code));
7174
7430
  append($$anchor3, button_1);
7175
7431
  });
7176
- template_effect(($0) => set_attribute(div_4, "aria-label", $0), [() => t("widget.widgetLang", get(widgetLang))]);
7177
- append($$anchor2, div_4);
7432
+ template_effect(() => set_attribute(div_5, "aria-label", get(widgetLang) === "de" ? "Widget-Sprache wählen" : "Select widget language"));
7433
+ append($$anchor2, div_5);
7178
7434
  };
7179
7435
  if_block(node_3, ($$render) => {
7180
- if (get(langDropdownOpen)) $$render(consequent_1);
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);
7181
7530
  });
7182
7531
  }
7183
- var node_5 = sibling(div_3, 4);
7184
- ProfileSection(node_5, {
7532
+ var node_9 = sibling(div_6, 4);
7533
+ ProfileSection(node_9, {
7185
7534
  get lang() {
7186
7535
  return get(widgetLang);
7187
7536
  },
@@ -7190,10 +7539,10 @@ function WidgetApp($$anchor, $$props) {
7190
7539
  },
7191
7540
  onactivate: handleProfileActivate
7192
7541
  });
7193
- var node_6 = sibling(node_5, 4);
7542
+ var node_10 = sibling(node_9, 4);
7194
7543
  {
7195
7544
  let $0 = /* @__PURE__ */ user_derived(() => ({ ...config2(), lang: get(widgetLang) }));
7196
- FeatureGrid(node_6, {
7545
+ FeatureGrid(node_10, {
7197
7546
  get config() {
7198
7547
  return get($0);
7199
7548
  },
@@ -7203,8 +7552,8 @@ function WidgetApp($$anchor, $$props) {
7203
7552
  ontoggle: handleFeatureToggle
7204
7553
  });
7205
7554
  }
7206
- var node_7 = sibling(div_2, 2);
7207
- PanelFooter(node_7, {
7555
+ var node_11 = sibling(div_2, 2);
7556
+ PanelFooter(node_11, {
7208
7557
  get lang() {
7209
7558
  return get(widgetLang);
7210
7559
  },
@@ -7213,18 +7562,30 @@ function WidgetApp($$anchor, $$props) {
7213
7562
  },
7214
7563
  get dashboardUrl() {
7215
7564
  return config2().dashboardUrl;
7216
- }
7565
+ },
7566
+ onclose: close,
7567
+ onminimize: minimize
7217
7568
  });
7218
7569
  bind_this(div_1, ($$value) => set(panelEl, $$value), () => get(panelEl));
7219
7570
  template_effect(
7220
7571
  ($0, $1) => {
7221
- set_text(text, get(announcement));
7572
+ set_text(text$1, get(announcement));
7573
+ classes = set_class(div_1, 1, "accessify-panel", null, classes, { "accessify-panel--left": get(currentDock) === "left" });
7222
7574
  set_attribute(div_1, "aria-label", $0);
7223
7575
  set_attribute(div_1, "aria-hidden", !get(isOpen));
7224
7576
  set_attribute(div_1, "dir", $1);
7225
- set_attribute(button, "aria-expanded", get(langDropdownOpen));
7226
- set_text(text_1, `${(get(currentLangOption)?.flag || "") ?? ""} ${(get(currentLangOption)?.label || get(widgetLang)) ?? ""}`);
7227
- classes = set_class(svg, 0, "accessify-lang-chevron", null, classes, { "accessify-lang-chevron--open": get(langDropdownOpen) });
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) });
7228
7589
  div_1.dir = div_1.dir;
7229
7590
  },
7230
7591
  [
@@ -7233,7 +7594,12 @@ function WidgetApp($$anchor, $$props) {
7233
7594
  ]
7234
7595
  );
7235
7596
  delegated("click", button, () => {
7236
- set(langDropdownOpen, !get(langDropdownOpen));
7597
+ set(widgetLangDropdownOpen, !get(widgetLangDropdownOpen));
7598
+ set(translateDropdownOpen, false);
7599
+ });
7600
+ delegated("click", button_2, () => {
7601
+ set(translateDropdownOpen, !get(translateDropdownOpen));
7602
+ set(widgetLangDropdownOpen, false);
7237
7603
  });
7238
7604
  append($$anchor, fragment);
7239
7605
  return pop($$exports);
@@ -7317,10 +7683,24 @@ function createWidgetStyles(config2) {
7317
7683
  }
7318
7684
  .accessify-trigger:hover { transform: translateY(-2px); box-shadow: 0 8px 28px rgba(50,60,100,0.6); }
7319
7685
  .accessify-trigger:active { transform: scale(0.96); }
7320
- .accessify-trigger[aria-expanded="true"] { opacity:0; pointer-events:none; transform:scale(0.9); }
7686
+ .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; }
7321
7692
  .accessify-trigger svg { width: 26px; height: 26px; }
7322
7693
  .accessify-trigger--dragging { cursor: grabbing !important; opacity: 0.85; }
7323
7694
 
7695
+ /* Active count badge on trigger */
7696
+ .accessify-trigger-badge {
7697
+ position: absolute; top: -4px; right: -4px;
7698
+ min-width: 20px; height: 20px; padding: 0 5px;
7699
+ border-radius: 999px; background: var(--accent); color: #fff;
7700
+ font-size: 11px; font-weight: 700; line-height: 20px; text-align: center;
7701
+ pointer-events: none;
7702
+ }
7703
+
7324
7704
  /* ─── Panel ─── */
7325
7705
  .accessify-panel {
7326
7706
  position: fixed; top: 0; bottom: 0;
@@ -7334,6 +7714,15 @@ function createWidgetStyles(config2) {
7334
7714
  box-shadow: var(--shadow);
7335
7715
  transition: opacity 200ms ease, transform 200ms ease;
7336
7716
  }
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
+ }
7337
7726
  .accessify-panel[aria-hidden="true"] { opacity:0; transform:${hiddenTransform}; pointer-events:none; display:none; }
7338
7727
  .accessify-panel[aria-hidden="false"] { opacity:1; transform:translateX(0); }
7339
7728
 
@@ -7363,6 +7752,31 @@ function createWidgetStyles(config2) {
7363
7752
  .accessify-header-btn--icon { padding: 0; }
7364
7753
  .accessify-header-btn--close { background: transparent; border-color: transparent; }
7365
7754
 
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;
7778
+ }
7779
+
7366
7780
  /* ─── Shared Accordion (Language + Profiles) ─── */
7367
7781
  .accessify-lang-dropdown,
7368
7782
  .accessify-accordion {
@@ -7372,6 +7786,7 @@ function createWidgetStyles(config2) {
7372
7786
  }
7373
7787
 
7374
7788
  .accessify-lang-toggle,
7789
+ .accessify-translate-toggle,
7375
7790
  .accessify-accordion-toggle {
7376
7791
  display: flex; align-items: center; justify-content: space-between;
7377
7792
  width: 100%; padding: 14px 14px;
@@ -7381,8 +7796,32 @@ function createWidgetStyles(config2) {
7381
7796
  transition: background var(--fast);
7382
7797
  }
7383
7798
  .accessify-lang-toggle:hover,
7799
+ .accessify-translate-toggle:hover,
7384
7800
  .accessify-accordion-toggle:hover { background: var(--surface-hover); }
7385
7801
 
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
+
7386
7825
  .accessify-lang-toggle-left,
7387
7826
  .accessify-accordion-toggle-left {
7388
7827
  display: flex; align-items: center; gap: 10px;
@@ -7419,6 +7858,7 @@ function createWidgetStyles(config2) {
7419
7858
  color: var(--text); cursor: pointer;
7420
7859
  font-size: 14px; font-weight: 500; font-family: inherit;
7421
7860
  transition: background var(--fast);
7861
+ min-height: 44px; /* Hit area */
7422
7862
  }
7423
7863
  .accessify-lang-option:hover { background: var(--surface-hover); }
7424
7864
  .accessify-lang-option[data-active="true"] { color: var(--accent); font-weight: 700; }
@@ -7597,6 +8037,26 @@ function createWidgetStyles(config2) {
7597
8037
  flex-shrink: 0;
7598
8038
  }
7599
8039
 
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
+
7600
8060
  /* ─── Footer ─── */
7601
8061
  .accessify-footer {
7602
8062
  display: flex; align-items: center; justify-content: center; gap: 8px;
@@ -7616,6 +8076,7 @@ function createWidgetStyles(config2) {
7616
8076
  /* ─── Mobile ─── */
7617
8077
  @media (max-width: 640px) {
7618
8078
  .accessify-panel { width: 100vw; border-radius: 0; }
8079
+ .accessify-panel--left { border-radius: 0; }
7619
8080
  .accessify-features { gap: 8px; }
7620
8081
  .accessify-body { padding: 8px 12px; }
7621
8082
  .accessify-trigger {
@@ -7623,6 +8084,7 @@ function createWidgetStyles(config2) {
7623
8084
  ${isRight ? "right: 16px" : "left: 16px"};
7624
8085
  width: 50px; height: 50px; border-radius: 14px;
7625
8086
  }
8087
+ .accessify-dock-group { display: none; }
7626
8088
  }
7627
8089
  `;
7628
8090
  }
@@ -8002,7 +8464,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8002
8464
  styleEl = null;
8003
8465
  document.getElementById(STYLE_ID)?.remove();
8004
8466
  }
8005
- function showDescribeTooltip(text, rect, loading = false) {
8467
+ function showDescribeTooltip(text2, rect, loading = false) {
8006
8468
  hideDescribeTooltip();
8007
8469
  const tip = document.createElement("div");
8008
8470
  tip.className = "accessify-describe-tooltip";
@@ -8022,7 +8484,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8022
8484
  tip.appendChild(loadingEl);
8023
8485
  } else {
8024
8486
  const textEl = document.createElement("div");
8025
- textEl.textContent = text;
8487
+ textEl.textContent = text2;
8026
8488
  tip.appendChild(textEl);
8027
8489
  }
8028
8490
  document.body.appendChild(tip);
@@ -8318,7 +8780,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8318
8780
  );
8319
8781
  }
8320
8782
  }
8321
- function showBadge(text, color, count) {
8783
+ function showBadge(text2, color, count) {
8322
8784
  const badge = document.createElement("div");
8323
8785
  badge.className = "accessify-alt-badge";
8324
8786
  badge.setAttribute("role", "status");
@@ -8331,7 +8793,7 @@ function createAltTextModule(aiService, initialLang = "de", serverConfig) {
8331
8793
  badge.appendChild(c);
8332
8794
  }
8333
8795
  const label = document.createElement("span");
8334
- label.textContent = text;
8796
+ label.textContent = text2;
8335
8797
  badge.appendChild(label);
8336
8798
  document.body.appendChild(badge);
8337
8799
  badgeEl = badge;
@@ -8630,4 +9092,4 @@ export {
8630
9092
  init as i,
8631
9093
  t
8632
9094
  };
8633
- //# sourceMappingURL=index-B9BgMU66.js.map
9095
+ //# sourceMappingURL=index-BiF0o7li.js.map