@contember/echo 0.0.27 → 0.0.29

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.
Files changed (70) hide show
  1. package/dist/components/Echo.d.ts +3 -0
  2. package/dist/components/atoms/Button.d.ts +7 -0
  3. package/dist/components/atoms/Shape.d.ts +8 -0
  4. package/dist/components/atoms/index.d.ts +1 -0
  5. package/dist/components/atoms/inputs/CheckboxGroup.d.ts +9 -0
  6. package/dist/components/atoms/inputs/InputWrapper.d.ts +8 -0
  7. package/dist/components/atoms/inputs/RadioGroup.d.ts +9 -0
  8. package/dist/components/atoms/inputs/Select.d.ts +9 -0
  9. package/dist/components/atoms/inputs/TextArea.d.ts +9 -0
  10. package/dist/components/atoms/inputs/TextInput.d.ts +9 -0
  11. package/dist/components/icons/CheckCircleIcon.d.ts +3 -0
  12. package/dist/components/icons/ChevronRightIcon.d.ts +3 -0
  13. package/dist/components/icons/ContemberIcon.d.ts +3 -0
  14. package/dist/components/icons/ExternalLinkIcon.d.ts +3 -0
  15. package/dist/components/icons/HighlightIcon.d.ts +3 -0
  16. package/dist/components/icons/PenIcon.d.ts +3 -0
  17. package/dist/components/icons/TrashIcon.d.ts +3 -0
  18. package/dist/components/icons/XCircleIcon.d.ts +3 -0
  19. package/dist/components/icons/XIcon.d.ts +3 -0
  20. package/dist/components/icons/index.d.ts +8 -0
  21. package/dist/components/molecules/ColorSelector.d.ts +2 -0
  22. package/dist/components/molecules/CustomInput.d.ts +9 -0
  23. package/dist/components/molecules/DrawingToolbar.d.ts +2 -0
  24. package/dist/components/molecules/DrawingTooltip.d.ts +2 -0
  25. package/dist/components/molecules/LauncherButton.d.ts +2 -0
  26. package/dist/components/molecules/Notification.d.ts +2 -0
  27. package/dist/components/molecules/ShapeActions.d.ts +2 -0
  28. package/dist/components/molecules/StoredFeedback.d.ts +2 -0
  29. package/dist/components/molecules/WelcomeMessage.d.ts +2 -0
  30. package/dist/components/molecules/index.d.ts +8 -0
  31. package/dist/components/organisms/DrawingLayer.d.ts +2 -0
  32. package/dist/components/organisms/FeedbackForm.d.ts +2 -0
  33. package/dist/components/organisms/index.d.ts +2 -0
  34. package/dist/config/defaultText.d.ts +2 -0
  35. package/dist/config/drawingConfig.d.ts +13 -0
  36. package/dist/contexts/EchoContext.d.ts +9 -0
  37. package/dist/contexts/index.d.ts +1 -0
  38. package/dist/echo.es.js +1743 -1174
  39. package/dist/echo.umd.js +8 -9
  40. package/dist/hooks/useInputHandler.d.ts +7 -0
  41. package/dist/hooks/usePageHeight.d.ts +4 -0
  42. package/dist/hooks/usePageStateSync.d.ts +4 -0
  43. package/dist/index.d.ts +41 -2
  44. package/dist/stores/drawingStore.d.ts +39 -0
  45. package/dist/stores/echoStore.d.ts +15 -0
  46. package/dist/stores/feedbackStore.d.ts +17 -0
  47. package/dist/stores/index.d.ts +4 -0
  48. package/dist/stores/widgetStore.d.ts +21 -0
  49. package/dist/style.css +1 -1
  50. package/dist/types.d.ts +151 -0
  51. package/dist/utils/color.d.ts +2 -0
  52. package/dist/utils/common.d.ts +2 -0
  53. package/dist/utils/console.d.ts +4 -0
  54. package/dist/utils/device.d.ts +1 -0
  55. package/dist/utils/events.d.ts +5 -0
  56. package/dist/utils/format.d.ts +1 -0
  57. package/dist/utils/geometry.d.ts +8 -0
  58. package/dist/utils/index.d.ts +12 -0
  59. package/dist/utils/listeners.d.ts +24 -0
  60. package/dist/utils/metadata.d.ts +2 -0
  61. package/dist/utils/monkeyPatch.d.ts +4 -0
  62. package/dist/utils/notifications.d.ts +6 -0
  63. package/dist/utils/screenshot.d.ts +2 -0
  64. package/dist/utils/stateManagement.d.ts +8 -0
  65. package/dist/utils/storage.d.ts +30 -0
  66. package/dist/utils/svg.d.ts +13 -0
  67. package/dist/utils/validators.d.ts +2 -0
  68. package/package.json +1 -1
  69. package/dist/echo.es.js.map +0 -1
  70. package/dist/echo.umd.js.map +0 -1
package/dist/echo.umd.js CHANGED
@@ -1,9 +1,8 @@
1
- (function(E,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("solid-js"),require("html2canvas")):typeof define=="function"&&define.amd?define(["exports","solid-js","html2canvas"],l):(E=typeof globalThis<"u"?globalThis:E||self,l(E.Echo={},E.Solid,E.html2canvas))})(this,function(E,l,Ie){"use strict";const De=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected"],Ae=new Set(["className","value","readOnly","formNoValidate","isMap","noModule","playsInline",...De]),je=new Set(["innerHTML","textContent","innerText","children"]),Fe=Object.assign(Object.create(null),{className:"class",htmlFor:"for"}),Le=Object.assign(Object.create(null),{class:"className",formnovalidate:{$:"formNoValidate",BUTTON:1,INPUT:1},ismap:{$:"isMap",IMG:1},nomodule:{$:"noModule",SCRIPT:1},playsinline:{$:"playsInline",VIDEO:1},readonly:{$:"readOnly",INPUT:1,TEXTAREA:1}});function Ne(e,t){const n=Le[e];return typeof n=="object"?n[t]?n.$:void 0:n}const Re=new Set(["beforeinput","click","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"]);function Ye(e,t,n){let r=n.length,a=t.length,o=r,i=0,c=0,s=t[a-1].nextSibling,d=null;for(;i<a||c<o;){if(t[i]===n[c]){i++,c++;continue}for(;t[a-1]===n[o-1];)a--,o--;if(a===i){const h=o<r?c?n[c-1].nextSibling:n[o-c]:s;for(;c<o;)e.insertBefore(n[c++],h)}else if(o===c)for(;i<a;)(!d||!d.has(t[i]))&&t[i].remove(),i++;else if(t[i]===n[o-1]&&n[c]===t[a-1]){const h=t[--a].nextSibling;e.insertBefore(n[c++],t[i++].nextSibling),e.insertBefore(n[--o],h),t[a]=n[o]}else{if(!d){d=new Map;let f=c;for(;f<o;)d.set(n[f],f++)}const h=d.get(t[i]);if(h!=null)if(c<h&&h<o){let f=i,g=1,v;for(;++f<a&&f<o&&!((v=d.get(t[f]))==null||v!==h+g);)g++;if(g>h-c){const b=t[i];for(;c<h;)e.insertBefore(n[c++],b)}else e.replaceChild(n[c++],t[i++])}else i++;else t[i++].remove()}}}const ie="_$DX_DELEGATE";function Be(e,t,n,r={}){let a;return l.createRoot(o=>{a=o,t===document?e():m(t,e(),t.firstChild?null:void 0,n)},r.owner),()=>{a(),t.textContent=""}}function w(e,t,n){let r;const a=()=>{const i=document.createElement("template");return i.innerHTML=e,n?i.content.firstChild.firstChild:i.content.firstChild},o=t?()=>l.untrack(()=>document.importNode(r||(r=a()),!0)):()=>(r||(r=a())).cloneNode(!0);return o.cloneNode=o,o}function P(e,t=window.document){const n=t[ie]||(t[ie]=new Set);for(let r=0,a=e.length;r<a;r++){const o=e[r];n.has(o)||(n.add(o),t.addEventListener(o,Ke))}}function u(e,t,n){Y(e)||(n==null?e.removeAttribute(t):e.setAttribute(t,n))}function He(e,t,n){Y(e)||(n?e.setAttribute(t,""):e.removeAttribute(t))}function se(e,t){Y(e)||(t==null?e.removeAttribute("class"):e.className=t)}function N(e,t,n,r){if(r)Array.isArray(n)?(e[`$$${t}`]=n[0],e[`$$${t}Data`]=n[1]):e[`$$${t}`]=n;else if(Array.isArray(n)){const a=n[0];e.addEventListener(t,n[0]=o=>a.call(e,n[1],o))}else e.addEventListener(t,n,typeof n!="function"&&n)}function We(e,t,n={}){const r=Object.keys(t||{}),a=Object.keys(n);let o,i;for(o=0,i=a.length;o<i;o++){const c=a[o];!c||c==="undefined"||t[c]||(ce(e,c,!1),delete n[c])}for(o=0,i=r.length;o<i;o++){const c=r[o],s=!!t[c];!c||c==="undefined"||n[c]===s||!s||(ce(e,c,!0),n[c]=s)}return n}function x(e,t,n){if(!t)return n?u(e,"style"):t;const r=e.style;if(typeof t=="string")return r.cssText=t;typeof n=="string"&&(r.cssText=n=void 0),n||(n={}),t||(t={});let a,o;for(o in n)t[o]==null&&r.removeProperty(o),delete n[o];for(o in t)a=t[o],a!==n[o]&&(r.setProperty(o,a),n[o]=a);return n}function _e(e,t={},n,r){const a={};return l.createRenderEffect(()=>a.children=B(e,t.children,a.children)),l.createRenderEffect(()=>typeof t.ref=="function"&&R(t.ref,e)),l.createRenderEffect(()=>Ue(e,t,n,!0,a,!0)),a}function R(e,t,n){return l.untrack(()=>e(t,n))}function m(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!="function")return B(e,t,r,n);l.createRenderEffect(a=>B(e,t(),a,n),r)}function Ue(e,t,n,r,a={},o=!1){t||(t={});for(const i in a)if(!(i in t)){if(i==="children")continue;a[i]=le(e,i,null,a[i],n,o,t)}for(const i in t){if(i==="children")continue;const c=t[i];a[i]=le(e,i,c,a[i],n,o,t)}}function Y(e){return!!l.sharedConfig.context&&!l.sharedConfig.done&&(!e||e.isConnected)}function Xe(e){return e.toLowerCase().replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}function ce(e,t,n){const r=t.trim().split(/\s+/);for(let a=0,o=r.length;a<o;a++)e.classList.toggle(r[a],n)}function le(e,t,n,r,a,o,i){let c,s,d,h,f;if(t==="style")return x(e,n,r);if(t==="classList")return We(e,n,r);if(n===r)return r;if(t==="ref")o||n(e);else if(t.slice(0,3)==="on:"){const g=t.slice(3);r&&e.removeEventListener(g,r,typeof r!="function"&&r),n&&e.addEventListener(g,n,typeof n!="function"&&n)}else if(t.slice(0,10)==="oncapture:"){const g=t.slice(10);r&&e.removeEventListener(g,r,!0),n&&e.addEventListener(g,n,!0)}else if(t.slice(0,2)==="on"){const g=t.slice(2).toLowerCase(),v=Re.has(g);if(!v&&r){const b=Array.isArray(r)?r[0]:r;e.removeEventListener(g,b)}(v||n)&&(N(e,g,n,v),v&&P([g]))}else if(t.slice(0,5)==="attr:")u(e,t.slice(5),n);else if(t.slice(0,5)==="bool:")He(e,t.slice(5),n);else if((f=t.slice(0,5)==="prop:")||(d=je.has(t))||(h=Ne(t,e.tagName))||(s=Ae.has(t))||(c=e.nodeName.includes("-")||"is"in i)){if(f)t=t.slice(5),s=!0;else if(Y(e))return n;t==="class"||t==="className"?se(e,n):c&&!s&&!d?e[Xe(t)]=n:e[h||t]=n}else u(e,Fe[t]||t,n);return n}function Ke(e){if(l.sharedConfig.registry&&l.sharedConfig.events&&l.sharedConfig.events.find(([s,d])=>d===e))return;let t=e.target;const n=`$$${e.type}`,r=e.target,a=e.currentTarget,o=s=>Object.defineProperty(e,"target",{configurable:!0,value:s}),i=()=>{const s=t[n];if(s&&!t.disabled){const d=t[`${n}Data`];if(d!==void 0?s.call(t,d,e):s.call(t,e),e.cancelBubble)return}return t.host&&typeof t.host!="string"&&!t.host._$host&&t.contains(e.target)&&o(t.host),!0},c=()=>{for(;i()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get(){return t||document}}),l.sharedConfig.registry&&!l.sharedConfig.done&&(l.sharedConfig.done=_$HY.done=!0),e.composedPath){const s=e.composedPath();o(s[0]);for(let d=0;d<s.length-2&&(t=s[d],!!i());d++){if(t._$host){t=t._$host,c();break}if(t.parentNode===a)break}}else c();o(r)}function B(e,t,n,r,a){const o=Y(e);if(o){!n&&(n=[...e.childNodes]);let s=[];for(let d=0;d<n.length;d++){const h=n[d];h.nodeType===8&&h.data.slice(0,2)==="!$"?h.remove():s.push(h)}n=s}for(;typeof n=="function";)n=n();if(t===n)return n;const i=typeof t,c=r!==void 0;if(e=c&&n[0]&&n[0].parentNode||e,i==="string"||i==="number"){if(o||i==="number"&&(t=t.toString(),t===n))return n;if(c){let s=n[0];s&&s.nodeType===3?s.data!==t&&(s.data=t):s=document.createTextNode(t),n=I(e,n,r,s)}else n!==""&&typeof n=="string"?n=e.firstChild.data=t:n=e.textContent=t}else if(t==null||i==="boolean"){if(o)return n;n=I(e,n,r)}else{if(i==="function")return l.createRenderEffect(()=>{let s=t();for(;typeof s=="function";)s=s();n=B(e,s,n,r)}),()=>n;if(Array.isArray(t)){const s=[],d=n&&Array.isArray(n);if(Q(s,t,n,a))return l.createRenderEffect(()=>n=B(e,s,n,r,!0)),()=>n;if(o){if(!s.length)return n;if(r===void 0)return n=[...e.childNodes];let h=s[0];if(h.parentNode!==e)return n;const f=[h];for(;(h=h.nextSibling)!==r;)f.push(h);return n=f}if(s.length===0){if(n=I(e,n,r),c)return n}else d?n.length===0?de(e,s,r):Ye(e,n,s):(n&&I(e),de(e,s));n=s}else if(t.nodeType){if(o&&t.parentNode)return n=c?[t]:t;if(Array.isArray(n)){if(c)return n=I(e,n,r,t);I(e,n,null,t)}else n==null||n===""||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}}return n}function Q(e,t,n,r){let a=!1;for(let o=0,i=t.length;o<i;o++){let c=t[o],s=n&&n[e.length],d;if(!(c==null||c===!0||c===!1))if((d=typeof c)=="object"&&c.nodeType)e.push(c);else if(Array.isArray(c))a=Q(e,c,s)||a;else if(d==="function")if(r){for(;typeof c=="function";)c=c();a=Q(e,Array.isArray(c)?c:[c],Array.isArray(s)?s:[s])||a}else e.push(c),a=!0;else{const h=String(c);s&&s.nodeType===3&&s.data===h?e.push(s):e.push(document.createTextNode(h))}}return a}function de(e,t,n=null){for(let r=0,a=t.length;r<a;r++)e.insertBefore(t[r],n)}function I(e,t,n,r){if(n===void 0)return e.textContent="";const a=r||document.createTextNode("");if(t.length){let o=!1;for(let i=t.length-1;i>=0;i--){const c=t[i];if(a!==c){const s=c.parentNode===e;!o&&!i?s?e.replaceChild(a,c):e.insertBefore(a,n):s&&c.remove()}else o=!0}}else e.insertBefore(a,n);return[a]}const Ve="http://www.w3.org/2000/svg";function Ge(e,t=!1){return t?document.createElementNS(Ve,e):document.createElement(e)}function qe(e){const{useShadow:t}=e,n=document.createTextNode(""),r=()=>e.mount||document.body,a=l.getOwner();let o,i=!!l.sharedConfig.context;return l.createEffect(()=>{i&&(l.getOwner().user=i=!1),o||(o=l.runWithOwner(a,()=>l.createMemo(()=>e.children)));const c=r();if(c instanceof HTMLHeadElement){const[s,d]=l.createSignal(!1),h=()=>d(!0);l.createRoot(f=>m(c,()=>s()?f():o(),null)),l.onCleanup(h)}else{const s=Ge(e.isSVG?"g":"div",e.isSVG),d=t&&s.attachShadow?s.attachShadow({mode:"open"}):s;Object.defineProperty(s,"_$host",{get(){return n.parentNode},configurable:!0}),m(d,o),c.appendChild(s),e.ref&&e.ref(s),l.onCleanup(()=>c.removeChild(s))}},void 0,{render:!i}),n}const Qe=(e,t)=>{let n;return(...r)=>{clearTimeout(n),n=window.setTimeout(()=>e(...r),t)}},Ze=(e,t)=>{D({event:"keydown",callback:n=>{n.key===e&&t(n)}})},D=e=>{const{event:t,callback:n,onMount:r,onCleanup:a}=e,o=i=>{n(i)};l.onMount(()=>{r==null||r(),window.addEventListener(t,o)}),l.onCleanup(()=>{a==null||a(),window.removeEventListener(t,o)})},Z=e=>{const{target:t,options:n,callback:r,onMount:a,onCleanup:o}=e,i=new MutationObserver(r);l.onMount(()=>{a==null||a(),i.observe(t,n)}),l.onCleanup(()=>{o==null||o(),i.disconnect()})},Je="echo_",O="echo_page_state",he=()=>{window.dispatchEvent(new CustomEvent("echo-storage-change"))},ue=e=>`${Je}${e}`,fe=(e,t)=>{try{const n=localStorage.getItem(ue(e));return n?JSON.parse(n):t}catch{return t}},J=(e,t)=>{try{localStorage.setItem(ue(e),JSON.stringify(t))}catch(n){console.warn("Failed to save to localStorage:",n)}},ee=()=>window.location.pathname,et=(e,t)=>{try{const n=localStorage.getItem(O),r=n?JSON.parse(n):{};if(!t.feedback.comment&&(!t.drawing.shapes||t.drawing.shapes.length===0))delete r[e];else{const a=window.location.search||void 0,o={feedback:{comment:t.feedback.comment},drawing:{shapes:t.drawing.shapes},latestQuery:a};r[e]=o}localStorage.setItem(O,JSON.stringify(r)),he()}catch(n){console.error("Failed to save page state:",n)}},te=e=>{try{const t=localStorage.getItem(O);return t&&JSON.parse(t)[e]||null}catch(t){return console.error("Failed to load page state:",t),null}},ge=e=>{try{const t=localStorage.getItem(O);if(!t)return;const n=JSON.parse(t);delete n[e],localStorage.setItem(O,JSON.stringify(n)),he()}catch(t){console.error("Failed to clear page state:",t)}},me=()=>{try{const e=localStorage.getItem(O);if(!e)return 0;const t=JSON.parse(e);return Object.keys(t).length}catch(e){return console.error("Failed to get stored pages count:",e),0}},ne=()=>{try{const e=localStorage.getItem(O);if(!e)return[];const t=JSON.parse(e);return Object.entries(t).map(([n,r])=>({path:n,state:r}))}catch(e){return console.error("Failed to get stored pages:",e),[]}},re=Symbol("store-raw"),A=Symbol("store-node"),S=Symbol("store-has"),ve=Symbol("store-self");function we(e){let t=e[l.$PROXY];if(!t&&(Object.defineProperty(e,l.$PROXY,{value:t=new Proxy(e,rt)}),!Array.isArray(e))){const n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e);for(let a=0,o=n.length;a<o;a++){const i=n[a];r[i].get&&Object.defineProperty(e,i,{enumerable:r[i].enumerable,get:r[i].get.bind(t)})}}return t}function U(e){let t;return e!=null&&typeof e=="object"&&(e[l.$PROXY]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function H(e,t=new Set){let n,r,a,o;if(n=e!=null&&e[re])return n;if(!U(e)||t.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):t.add(e);for(let i=0,c=e.length;i<c;i++)a=e[i],(r=H(a,t))!==a&&(e[i]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):t.add(e);const i=Object.keys(e),c=Object.getOwnPropertyDescriptors(e);for(let s=0,d=i.length;s<d;s++)o=i[s],!c[o].get&&(a=e[o],(r=H(a,t))!==a&&(e[o]=r))}return e}function X(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function W(e,t,n){if(e[t])return e[t];const[r,a]=l.createSignal(n,{equals:!1,internal:!0});return r.$=a,e[t]=r}function tt(e,t){const n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===l.$PROXY||t===A||(delete n.value,delete n.writable,n.get=()=>e[l.$PROXY][t]),n}function be(e){l.getListener()&&W(X(e,A),ve)()}function nt(e){return be(e),Reflect.ownKeys(e)}const rt={get(e,t,n){if(t===re)return e;if(t===l.$PROXY)return n;if(t===l.$TRACK)return be(e),n;const r=X(e,A),a=r[t];let o=a?a():e[t];if(t===A||t===S||t==="__proto__")return o;if(!a){const i=Object.getOwnPropertyDescriptor(e,t);l.getListener()&&(typeof o!="function"||e.hasOwnProperty(t))&&!(i&&i.get)&&(o=W(r,t,o)())}return U(o)?we(o):o},has(e,t){return t===re||t===l.$PROXY||t===l.$TRACK||t===A||t===S||t==="__proto__"?!0:(l.getListener()&&W(X(e,S),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:nt,getOwnPropertyDescriptor:tt};function K(e,t,n,r=!1){if(!r&&e[t]===n)return;const a=e[t],o=e.length;n===void 0?(delete e[t],e[S]&&e[S][t]&&a!==void 0&&e[S][t].$()):(e[t]=n,e[S]&&e[S][t]&&a===void 0&&e[S][t].$());let i=X(e,A),c;if((c=W(i,t,a))&&c.$(()=>n),Array.isArray(e)&&e.length!==o){for(let s=e.length;s<o;s++)(c=i[s])&&c.$();(c=W(i,"length",o))&&c.$(e.length)}(c=i[ve])&&c.$()}function pe(e,t){const n=Object.keys(t);for(let r=0;r<n.length;r+=1){const a=n[r];K(e,a,t[a])}}function ot(e,t){if(typeof t=="function"&&(t=t(e)),t=H(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n<r;n++){const a=t[n];e[n]!==a&&K(e,n,a)}K(e,"length",r)}else pe(e,t)}function _(e,t,n=[]){let r,a=e;if(t.length>1){r=t.shift();const i=typeof r,c=Array.isArray(e);if(Array.isArray(r)){for(let s=0;s<r.length;s++)_(e,[r[s]].concat(t),n);return}else if(c&&i==="function"){for(let s=0;s<e.length;s++)r(e[s],s)&&_(e,[s].concat(t),n);return}else if(c&&i==="object"){const{from:s=0,to:d=e.length-1,by:h=1}=r;for(let f=s;f<=d;f+=h)_(e,[f].concat(t),n);return}else if(t.length>1){_(e[r],t,[r].concat(n));return}a=e[r],n=[r].concat(n)}let o=t[0];typeof o=="function"&&(o=o(a,n),o===a)||r===void 0&&o==null||(o=H(o),r===void 0||U(a)&&U(o)&&!Array.isArray(o)?pe(a,o):K(e,r,o))}function oe(...[e,t]){const n=H(e||{}),r=Array.isArray(n),a=we(n);function o(...i){l.batch(()=>{r&&i.length===1?ot(n,i[0]):_(n,i)})}return[a,o]}const $={rectangle:{id:"rectangle",label:"Highlight",getCursor:()=>"crosshair",strokeWidth:2,opacity:{selected:1,default:1}},path:{id:"path",label:"Pen",getCursor:e=>`url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none" stroke="${e.replace("#","%23")}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="24" cy="24" r="8"/></svg>') 24 24, auto`,strokeWidth:6,opacity:{selected:.6,default:1}}},at=e=>{const t=e.replace("#",""),n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,2),16)/255,a=Number.parseInt(t.slice(4,2),16)/255;return .2126*n+.7152*r+.0722*a},it=e=>at(e)<.5?"#FFFFFF":"#000000",ye=(e,t)=>{if(!t)return e;const n={...e};for(const r in t)t[r]&&typeof t[r]=="object"&&!Array.isArray(t[r])?n[r]=ye(e[r],t[r]):n[r]=t[r];return n};let C=[],k=null,j=null,F=null;const ae=(e,t)=>(...n)=>{const r=n.map(a=>typeof a=="string"?a:a instanceof Error?a.stack||a.message:JSON.stringify(a)).join(" ");C.push({type:e,message:r,timestamp:new Date().toISOString()}),C.length>1e3&&(C=C.slice(-1e3)),t.apply(console,n)},st=()=>{k||(k={log:console.log,warn:console.warn,error:console.error},j=window.onerror,F=window.onunhandledrejection,window.onerror=(e,t,n,r,a)=>{const o=(a==null?void 0:a.stack)||(a==null?void 0:a.message)||e;return C.push({type:"error",message:`Uncaught Error: ${o}
2
- Location: ${t}:${n}:${r}`,timestamp:new Date().toISOString()}),j?j(e,t,n,r,a):!1},window.onunhandledrejection=e=>{const t=e.reason;C.push({type:"error",message:`Unhandled Promise Rejection: ${(t==null?void 0:t.stack)||(t==null?void 0:t.message)||t}`,timestamp:new Date().toISOString()}),F&&F(e)},console.log=ae("log",k.log),console.warn=ae("warn",k.warn),console.error=ae("error",k.error),window.addEventListener("error",e=>{const{message:t,filename:n,lineno:r,colno:a,error:o}=e,i=(o==null?void 0:o.stack)||(o==null?void 0:o.message)||t;C.push({type:"error",message:`Uncaught Error: ${i}
3
- Location: ${n}:${r}:${a}`,timestamp:new Date().toISOString()})}))},ct=()=>{k&&(console.log=k.log,console.warn=k.warn,console.error=k.error,k=null),j&&(window.onerror=j,j=null),F&&(window.onunhandledrejection=F,F=null),window.removeEventListener("error",()=>{}),C=[]},xe=()=>[...C],lt=()=>{var e;return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||((e=window.matchMedia)==null?void 0:e.call(window,"(max-width: 768px)").matches)},V=(e,{useClientCoords:t=!1}={})=>{const r=typeof TouchEvent<"u"&&e instanceof TouchEvent?e.touches[0]:null;return{x:r?t?r.clientX:r.pageX:t?e.clientX:e.pageX,y:r?t?r.clientY:r.pageY:t?e.clientY:e.pageY}},ke=(e,t)=>{const n=t.x-e.x,r=t.y-e.y;return Math.sqrt(n*n+r*r)},Se=e=>{if(e.length!==2)return null;const[t,n]=e;return{x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)}},dt=e=>e.length<2?null:`M ${e[0].x} ${e[0].y} ${e.slice(1).map(t=>`L ${t.x} ${t.y}`).join(" ")}`,ht=(e,t)=>{const n=document.createElement("canvas");return n.width=e,n.height=t,n},ut=e=>e.hasAttribute("data-hide-when-drawing"),ft=async()=>{try{const e=await Ie(document.body,{backgroundColor:null,logging:!1,useCORS:!0,scale:1,allowTaint:!0,foreignObjectRendering:!0,ignoreElements:ut}),t=ht(e.width,e.height),n=t.getContext("2d");if(!n)throw new Error("Failed to get canvas context");return n.drawImage(e,0,0),t.toDataURL()}catch(e){console.error("Failed to capture screenshot:",e);return}},gt=(e,t,n)=>{let r=`M0 0 H${e.width} V${e.height} H0 Z`;if(t.length===2){const[a,o]=t;r+=` M${a.x} ${a.y} h${o.x-a.x} v${o.y-a.y} h${a.x-o.x} v${a.y-o.y}`}for(const a of n)if(a.type==="rectangle"){const[o,i]=a.points;r+=` M${o.x} ${o.y} h${i.x-o.x} v${i.y-o.y} h${o.x-i.x} v${o.y-i.y}`}return r},mt=e=>{if(typeof e!="object"||e===null)throw new Error("Echo initialization failed: options must be an object");if(typeof e.onSubmit!="function")throw new Error("Echo initialization failed: onSubmit must be a function");if(e.primaryColor&&!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(e.primaryColor))throw new Error("Echo initialization failed: primaryColor must be a valid hex color")},Ce=5,Ee=(e,t)=>$[e].getCursor(t),vt=(e,t,n)=>{var c,s;const[r,a]=oe({isDrawing:!1,currentPoints:[],selectedShapeId:null,selectedTool:"rectangle",showTooltip:!0,mousePosition:{x:0,y:0},selectedColor:e.primaryColor,shapes:((s=(c=te(t))==null?void 0:c.drawing)==null?void 0:s.shapes)||[],hasDrawn:!1,isDragging:!1,dragStartPos:null,initialClickPos:null,dragOffset:null,cursor:Ee("rectangle",e.primaryColor)}),o=(d,h=!1)=>{if(d.selectedTool||d.selectedColor){const f=d.selectedTool||r.selectedTool,g=d.selectedColor||r.selectedColor;d.cursor=Ee(f,g)}a(d),n==null||n(d,h)},i={startDrawing:d=>{o({isDrawing:!0,currentPoints:[d],selectedShapeId:null})},updateDrawing:d=>{r.selectedTool==="rectangle"?o({currentPoints:[r.currentPoints[0],d]}):r.selectedTool==="path"&&o({currentPoints:[...r.currentPoints,d]})},finishDrawing:()=>{if(r.currentPoints.length>=2){const d={id:Math.random().toString(36).substring(2),type:r.selectedTool,color:r.selectedColor,points:r.currentPoints};o({shapes:[...r.shapes,d]})}o({isDrawing:!1,currentPoints:[]})},handleShapeClick:d=>{},handleStart:d=>{if(d instanceof MouseEvent){const f=d.target;if(!f.classList.contains("echo-drawing-layer-mask")&&!f.classList.contains("echo-shape"))return}const h=V(d);if(d.target instanceof SVGElement&&d.target.classList.contains("echo-shape")){const f=d.target.dataset.shapeId;if(f&&r.selectedShapeId===f){const g=r.shapes.find(v=>v.id===f);if(g){i.startDrag(h),i.updateDragOffset(g,h);return}}}i.setInitialClick(h)},handleMove:d=>{const h=V(d,{useClientCoords:!0}),f=V(d);if(o({mousePosition:h}),r.isDragging&&r.selectedShapeId&&r.dragStartPos&&r.shapes.find(v=>v.id===r.selectedShapeId)){const v=f.x-r.dragStartPos.x,b=f.y-r.dragStartPos.y,y=r.shapes.map(M=>M.id===r.selectedShapeId?{...M,points:M.points.map(L=>({x:L.x+v,y:L.y+b}))}:M);o({shapes:y}),i.startDrag(f);return}if(r.initialClickPos&&!r.isDrawing){ke(r.initialClickPos,f)>=Ce&&i.startDrawing(r.initialClickPos);return}r.isDrawing&&i.updateDrawing(f)},handleEnd:d=>{if(r.isDragging){i.stopDrag();return}if(r.initialClickPos&&!r.isDrawing){const h=V(d);if(ke(r.initialClickPos,h)<Ce&&d.target instanceof SVGElement&&d.target.classList.contains("echo-shape")){const g=d.target.dataset.shapeId;g&&o({selectedShapeId:g})}}i.setInitialClick(null),i.finishDrawing()},handleEnter:d=>{d.target===d.currentTarget&&!r.hasDrawn&&o({showTooltip:!0})},handleLeave:d=>{d.target===d.currentTarget&&o({showTooltip:!1})},startDrag:d=>{o({isDragging:!0,dragStartPos:d})},stopDrag:()=>{o({isDragging:!1,dragStartPos:null,dragOffset:null})},setInitialClick:d=>{o({initialClickPos:d})},updateDragOffset:(d,h)=>{o({dragOffset:{x:h.x-d.points[0].x,y:h.y-d.points[0].y}})}};return{state:r,setState:o,methods:i}},wt=(e,t,n)=>{var i,c;const[r,a]=oe({comment:((c=(i=te(t))==null?void 0:i.feedback)==null?void 0:c.comment)||"",screenshot:void 0,isCapturing:!1,isMinimized:!1});return{state:r,setState:(s,d=!1)=>{a(s),n==null||n(s,d)}}},bt=(e,t)=>{const[n,r]=oe({text:e.textConfig,isOpen:!1,primaryColor:e.primaryColor,notification:{show:!1,type:null,message:null},dimensions:{width:document.documentElement.clientWidth,height:document.documentElement.scrollHeight},isStoredFeedbackOpen:!1,pagesCount:me(),welcomeMessageIsClosing:!1});return{state:n,setState:r}},pt=e=>{let t=ee();const n=Qe((d,h=!1)=>{(h||r.state.comment.trim().length>0||a.state.shapes.length>0)&&(et(d,{feedback:r.state,drawing:a.state}),o.setState({pagesCount:me()}))},1e3),r=wt(e,t,(d,h)=>{n(t,h)}),a=vt(e,t,(d,h)=>{n(t,h)}),o=bt(e),i=()=>{const d=ee();if(d!==t){t=d;const h=te(t);r.setState({comment:(h==null?void 0:h.feedback.comment)||""}),a.setState({shapes:(h==null?void 0:h.drawing.shapes)||[]})}};D({event:"popstate",callback:i}),Z({target:document.documentElement,options:{childList:!0,subtree:!0},callback:()=>{ee()!==t&&i()}});const c=()=>{ge(t),r.setState({comment:"",screenshot:void 0,isCapturing:!1,isMinimized:!1},!0),a.setState({isDrawing:!1,currentPoints:[],shapes:[],selectedShapeId:null,selectedTool:"rectangle",showTooltip:!0,mousePosition:{x:0,y:0},hasDrawn:!1,selectedColor:e.primaryColor,isDragging:!1,dragStartPos:null,initialClickPos:null,dragOffset:null},!0),o.setState({isOpen:!1})},s=d=>{o.setState({notification:{show:!0,type:d.type,message:d.message}}),setTimeout(()=>{o.setState({notification:{show:!1,type:d.type,message:d.message}})},5e3)};return{feedback:r,drawing:a,widget:o,methods:{reset:c,submit:async d=>{o.setState({isOpen:!1});try{const h=await e.onSubmit(d);return h instanceof Response&&!h.ok?(s({show:!0,type:"error",message:"Submission failed"}),h):(c(),s({show:!0,type:"success",message:"Feedback submitted"}),h)}catch{s({show:!0,type:"error",message:"Submission failed"})}}}}},Pe=l.createContext(),yt=e=>{const t=pt({primaryColor:e.primaryColor,onSubmit:e.onSubmit,textConfig:e.textConfig,position:e.position});return l.createComponent(Pe.Provider,{value:t,get children(){return e.children}})},p=()=>{const e=l.useContext(Pe);if(!e)throw new Error("useEchoStore must be used within EchoProvider");return e},xt='*,*:before,*:after{box-sizing:border-box}.echo-root{position:absolute;top:0;left:0;z-index:var(--z-root);isolation:isolate;pointer-events:none;--z-root: 999999;--z-launcher: 2;--z-overlay: 1;--z-drawing-toolbar: 3;--z-drawing-tooltip: 3;--z-shape-actions: 3;--z-notification: 2;--z-welcome-message: 2;--z-widget-button: 2;--z-feedback-form: 4;--primary-color: #000;--primary-text-color: #fff;--error-color: #f44336;--success-color: var(--primary-color);--text-dark: #1a1a1a;--text-medium: #333;--text-light: #666;--text-lighter: #999;--border-color: rgba(0, 0, 0, .1);--border-color-light: rgba(0, 0, 0, .05);--border-color-medium: rgba(0, 0, 0, .08);--primary-color-lighter: color-mix(in srgb, var(--primary-color) 100%, white 40%);--primary-color-lightest: color-mix(in srgb, var(--primary-color) 7%, white 100%);--hover-color: color-mix(in srgb, var(--primary-color) 80%, #fff);--shadow-color-dark: rgba(0, 0, 0, .6);--shadow-color-light: rgba(255, 255, 255, .1);--shadow-color-medium: rgba(0, 0, 0, .2);--shadow-sm: 0 1px 3px;--shadow-md: 0 4px 10px;--shadow-lg: 0 10px 20px;--shadow-black-sm: var(--shadow-sm) rgba(0, 0, 0, .5);--shadow-black-md: var(--shadow-md) rgba(0, 0, 0, .5);--shadow-black-lg: var(--shadow-lg) rgba(0, 0, 0, .5);--shadow-black-lightened-sm: var(--shadow-sm) var(--shadow-color-medium);--shadow-black-lightened-md: var(--shadow-md) var(--shadow-color-medium);--shadow-black-lightened-lg: var(--shadow-lg) var(--shadow-color-medium);--shadow-primary-sm: var(--shadow-sm) color-mix(in srgb, var(--primary-color) 60%, transparent 80%);--shadow-primary-md: var(--shadow-md) color-mix(in srgb, var(--primary-color) 50%, transparent 80%);--shadow-primary-lg: var(--shadow-lg) color-mix(in srgb, var(--primary-color) 40%, transparent 80%);--shadow-primary-lighter-sm: var(--shadow-sm) color-mix(in srgb, var(--primary-color-lighter) 70%, transparent 80%);--shadow-primary-lighter-md: var(--shadow-md) color-mix(in srgb, var(--primary-color-lighter) 60%, transparent 80%);--shadow-primary-lighter-lg: var(--shadow-lg) color-mix(in srgb, var(--primary-color-lighter) 50%, transparent 80%);--shadow-primary-lightest-sm: var(--shadow-sm) color-mix(in srgb, var(--primary-color-lightest) 70%, transparent 80%);--shadow-primary-lightest-md: var(--shadow-md) color-mix(in srgb, var(--primary-color-lightest) 60%, transparent 80%);--shadow-primary-lightest-lg: var(--shadow-lg) color-mix(in srgb, var(--primary-color-lightest) 50%, transparent 80%);--shadow-combined-sm: var(--shadow-primary-sm), var(--shadow-black-lightened-sm);--shadow-combined-md: var(--shadow-primary-md), var(--shadow-black-lightened-md);--shadow-combined-lg: var(--shadow-primary-lg), var(--shadow-black-lightened-lg);--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 12px;--spacing-lg: 16px;--spacing-xl: 20px;--spacing-2xl: 24px;--spacing-3xl: 32px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-full: 9999px;--font-xs: .8125rem;--font-sm: .875rem;--font-base: .9375rem;--font-md: 1rem;--font-lg: 1.125rem;--duration-fast: .1s;--duration-base: .2s;--duration-slow: .3s;--duration-slower: .4s;--duration-slowest: .6s;--ease-default: ease;--ease-in-out: ease-in-out;--ease-bounce: cubic-bezier(.34, 1.56, .64, 1);--ease-smooth: cubic-bezier(.4, 0, .2, 1);--ease-spring: cubic-bezier(.16, 1, .3, 1)}.echo-stored-feedback{position:absolute;display:flex;flex-direction:column;bottom:calc(100% + var(--spacing-lg));right:0;width:320px;background:#fff;border-radius:var(--radius-lg);box-shadow:var(--shadow-black-lightened-lg);animation:slideUpFade var(--duration-base) var(--ease-smooth);z-index:calc(var(--z-widget-button) + 1);transform-origin:bottom right;transition:all var(--duration-base) var(--ease-smooth)}.echo-stored-feedback-header{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-md) var(--spacing-lg)}.echo-stored-feedback-header h3{margin:0;font-size:var(--font-md);font-weight:600}.echo-stored-feedback-list{max-height:400px;overflow-y:auto;border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.echo-stored-feedback-item{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-md) var(--spacing-lg);border-bottom:1px solid var(--border-color-light);transition:all var(--duration-base) var(--ease-smooth);background:#fff;position:relative}.echo-stored-feedback-item:hover{background:var(--primary-color-lightest)}.echo-stored-feedback-item-current{background:var(--primary-color-lightest);padding-left:calc(var(--spacing-lg) - 3px)}.echo-stored-feedback-item-current:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--primary-color);border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.echo-stored-feedback-item:last-child{border-bottom:none;border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.echo-stored-feedback-item:last-child.echo-stored-feedback-item-current:before{border-bottom-left-radius:var(--radius-lg)}.echo-stored-feedback-content{flex:1;min-width:0;margin-right:var(--spacing-md)}.echo-stored-feedback-path{font-size:var(--font-sm);font-weight:500;color:var(--text-medium);margin-bottom:var(--spacing-xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.echo-stored-feedback-preview{font-size:var(--font-xs);color:var(--text-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.echo-stored-feedback-actions{display:flex;align-items:center;gap:var(--spacing-sm)}.echo-stored-feedback-link{color:var(--text-light)}.echo-stored-feedback-link:hover{color:var(--primary-color)}.echo-stored-feedback-delete{color:var(--text-light);font-size:var(--font-xs);padding:var(--spacing-xs) var(--spacing-md)}.echo-stored-feedback-delete:hover{color:var(--error-color);background:color-mix(in srgb,var(--error-color) 10%,transparent)}.echo-stored-feedback-empty{padding:var(--spacing-3xl) var(--spacing-lg);text-align:center;color:var(--text-light);font-size:var(--font-sm);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.echo-launcher{position:fixed;z-index:var(--z-launcher);bottom:var(--spacing-xl);right:var(--spacing-xl)}.echo-overlay{position:absolute;z-index:var(--z-overlay);top:0;left:0;right:0;bottom:0;border:3px solid var(--primary-color)}[data-hidden=true],[data-hidden=false]{transition:opacity var(--duration-slow) var(--ease-in-out),visibility var(--duration-slow) var(--ease-in-out)}[data-hidden=true]{opacity:0;visibility:hidden;pointer-events:none}[data-hidden=false]{opacity:1;visibility:visible;pointer-events:auto;user-select:none;-webkit-user-select:none}.echo-launcher-button{z-index:var(--z-widget-button);position:relative;display:flex;align-items:center;justify-content:center;cursor:pointer;background:radial-gradient(circle at 40% 40%,var(--primary-color) 0%,var(--primary-color-lighter) 65%,var(--primary-color-lighter) 100%);border:none;border-radius:var(--radius-full);width:48px;height:48px;box-shadow:var(--shadow-black-md);transition:all var(--duration-slow) var(--ease-default),left var(--duration-slower) var(--ease-smooth),opacity var(--duration-slow) var(--ease-in-out)}.echo-launcher-button:hover{box-shadow:var(--shadow-black-lg);transform:translateY(-2px)}.echo-launcher-button:active{transform:scale(.95)}.echo-launcher-button-count{position:absolute;top:calc(-1 * var(--spacing-xs));right:calc(-1 * var(--spacing-xs));background:var(--primary-color-lightest);color:var(--primary-color-lighter);border-radius:var(--radius-md);min-width:20px;height:20px;display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-black-sm);padding:0 var(--spacing-xs);font-weight:600;pointer-events:auto;cursor:pointer;transform-origin:center center;animation:popIn var(--duration-slow) var(--ease-bounce);transition:transform var(--duration-base) var(--ease-default)}.echo-launcher-button-count:hover{transform:scale(1.1)}.echo-feedback{position:fixed;bottom:var(--spacing-xl);right:var(--spacing-xl);width:min(calc(100vw - var(--spacing-2xl)),24rem);z-index:var(--z-feedback-form);box-shadow:var(--shadow-black-lightened-lg);display:flex;flex-direction:column;gap:var(--spacing-lg);background:#fff;border-radius:var(--radius-lg);will-change:transform;padding:var(--spacing-lg)}.echo-feedback[data-minimized=true]{transition:transform .4s var(--ease-default),box-shadow .4s var(--ease-default);transform:translate(calc(100% - 48px),calc(100% - 48px));box-shadow:0 8px 16px #0003}.echo-feedback[data-minimized=true]:hover{cursor:pointer;transform:translate(calc(100% - 48px),calc(100% - 48px)) rotate(-2deg) scale(1.1);box-shadow:0 12px 24px #00000040}.echo-feedback[data-minimized=false]{transition:transform .4s var(--ease-smooth),box-shadow .4s var(--ease-smooth);transform:translate(0)}.echo-feedback[style*=transition]{pointer-events:none}.echo-feedback-content{display:flex;flex-direction:column;gap:var(--spacing-lg)}.echo-feedback-header{display:flex;justify-content:space-between;align-items:center}.echo-feedback-title{font-size:var(--font-lg);font-weight:600;color:var(--text-dark);margin:0}.echo-feedback-header-actions{display:flex;gap:var(--spacing-xs);margin:calc(-1 * var(--spacing-sm)) calc(-1 * var(--spacing-sm)) calc(-1 * var(--spacing-sm)) 0}.echo-feedback-form-textarea{width:100%;min-height:120px;border-radius:var(--radius-md);border:1px solid var(--border-color);padding:var(--spacing-md);font-size:var(--font-base);resize:vertical;background:#fffc;font-family:inherit}.echo-feedback-form-textarea:focus{outline:none;border-color:var(--primary-color);background:#fff;box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 15%,transparent)}.echo-feedback-form-textarea::placeholder{color:var(--text-lighter)}[data-hide-when-drawing=true]{opacity:1;visibility:visible;transition:opacity .3s ease-in-out,visibility .3s ease-in-out}[data-drawing=true] [data-hide-when-drawing=true]{opacity:0;visibility:hidden;pointer-events:none;user-select:none;-webkit-user-select:none}.echo-drawing-layer,.echo-drawing-layer-container{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;user-select:none;-webkit-user-select:none}.echo-drawing-layer-container svg{pointer-events:auto}.echo-drawing-toolbar{position:fixed;top:var(--spacing-xl);left:var(--spacing-xl);display:flex;flex-direction:column;gap:var(--spacing-sm);z-index:var(--z-drawing-toolbar);opacity:1;transition:opacity var(--duration-base) var(--ease-default)}.echo-drawing-toolbar-button{width:50px;height:50px;border-radius:var(--radius-full);border:2px solid #ddd;background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:all var(--duration-base) var(--ease-default);box-shadow:var(--shadow-black-sm);position:relative}.echo-drawing-toolbar-icon{width:25px;height:25px;color:var(--primary-color);transition:color var(--duration-base) var(--ease-default)}.echo-drawing-toolbar-button:hover{transform:scale(1.05);border-color:var(--hover-color)}.echo-drawing-toolbar-button[data-selected=true]{background:var(--primary-color-lightest);border-color:var(--primary-color)}.echo-color-selector{position:relative}.echo-color-selector:hover .echo-drawing-toolbar-button{border-top-right-radius:0;border-bottom-right-radius:0;transform:scale(1.05);border-right-color:transparent;background:rgba(var(--primary-color),.9);border-color:var(--hover-color)}.echo-color-swatch-wrapper{position:absolute;left:calc(100% - 2px);top:50%;transform:translateY(-50%);height:52.5px;padding-right:var(--spacing-sm);display:none}.echo-color-selector:hover .echo-color-swatch-wrapper{display:block}.echo-color-swatch{height:100%;background:#fff;border-radius:var(--radius-md);border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--spacing-sm);padding-left:var(--spacing-md);box-shadow:var(--shadow-black-sm);display:flex;align-items:center;gap:var(--spacing-sm);border:2px solid #ddd;border-left:none}.echo-color-selector:hover .echo-color-swatch{border-color:var(--hover-color)}.echo-color-swatch-button{width:24px;height:24px;border-radius:var(--radius-full);border:2px solid transparent;cursor:pointer;padding:0;transition:transform var(--duration-base) var(--ease-default)}.echo-color-swatch-button:hover{transform:scale(1.1)}.echo-color-swatch-button[data-selected=true]{border-color:var(--primary-color)}.echo-drawing-tooltip{display:flex;text-wrap:nowrap;position:fixed;background:#fff;padding:var(--spacing-sm) var(--spacing-lg);border-radius:var(--radius-lg);box-shadow:var(--shadow-combined-sm);font-size:var(--font-sm);color:var(--primary-color);z-index:var(--z-drawing-tooltip);pointer-events:none;animation:slideDownFade var(--duration-slow) var(--ease-default);border:1px solid var(--primary-color);background:var(--primary-color-lightest)}.echo-shape-actions{position:fixed;z-index:var(--z-shape-actions);display:flex;gap:var(--spacing-xs);background:#fff;border-radius:var(--radius-lg);box-shadow:var(--shadow-combined-md);transform:translate(-50%,-100%) translateY(calc(-1 * var(--spacing-sm)));animation:popInSlideDown var(--duration-fast) var(--ease-default);cursor:default;pointer-events:auto;padding:var(--spacing-xs);border:1px solid var(--primary-color)}.echo-shape-actions-divider{width:1px;margin:var(--spacing-sm) 0;background:var(--border-color);pointer-events:none}.echo-shape-actions[hidden]{display:none}.echo-notification{position:absolute;z-index:var(--z-notification);bottom:70px;right:0;width:300px;padding:var(--spacing-2xl);border-radius:var(--radius-lg);font-size:var(--font-md);font-weight:500;box-shadow:var(--shadow-combined-md);background:#fff;border:1px solid var(--primary-color);transform-origin:bottom right;display:flex;flex-direction:column;align-items:center;gap:var(--spacing-xl);opacity:1;pointer-events:auto;transition:all var(--duration-base) var(--ease-smooth)}.echo-notification:not([data-empty=true]){animation:popInSlideUp var(--duration-slower) var(--ease-spring)}.echo-notification[data-empty=true]{opacity:0;pointer-events:none;transform:translateY(var(--spacing-sm)) scale(.95);transition:none}.echo-notification-hide{position:absolute;top:var(--spacing-lg);right:var(--spacing-lg);width:24px;height:24px;padding:var(--spacing-xs);border:none;background:transparent;color:var(--text-light);opacity:.7;cursor:pointer;border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;transition:all var(--duration-base) var(--ease-bounce);flex-shrink:0}.echo-notification-hide:hover{opacity:1;background:var(--primary-color-lightest);transform:scale(1.1);color:var(--primary-color)}.echo-notification-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transform:scale(1.5);background:var(--primary-color-lightest);padding:var(--spacing-md);border-radius:var(--radius-full);margin-top:var(--spacing-md);transition:all var(--duration-base) var(--ease-bounce)}.echo-notification[data-type=success]{border-color:var(--success-color)}.echo-notification[data-type=success] .echo-notification-icon{color:var(--success-color)}.echo-notification[data-type=error]{border-color:var(--error-color)}.echo-notification[data-type=error] .echo-notification-icon{color:var(--error-color);background:color-mix(in srgb,var(--error-color) 10%,white)}.echo-notification-content{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center;padding:0 12px}.echo-notification-title{font-size:1rem;font-weight:600;color:#1a1a1a}.echo-notification-message{font-size:.875rem;font-weight:400;color:#666;line-height:1.4;max-width:100%}@media (max-width: 768px){.echo-notification{right:0;width:calc(100vw - 40px);height:auto;min-height:180px;-webkit-backdrop-filter:none;backdrop-filter:none;font-size:.9375rem;padding:20px;gap:16px;bottom:calc(100% + 20px)}.echo-notification-icon{transform:scale(1.3);padding:10px;margin-top:8px}.echo-notification-title{font-size:.9375rem}.echo-notification-message{font-size:.8125rem}}.echo-welcome-message{display:flex;align-items:center;gap:var(--spacing-xs);position:fixed;z-index:var(--z-welcome-message);background:var(--primary-color-lightest);border:1px solid var(--primary-color);color:var(--primary-color);padding:var(--spacing-md) var(--spacing-lg);border-radius:var(--radius-lg);font-size:var(--font-sm);font-weight:500;box-shadow:var(--shadow-combined-md);opacity:1;transform:translateY(0) scale(1);transition:all var(--duration-slow) var(--ease-smooth);animation:bounceIn var(--duration-slowest) var(--ease-bounce);user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:pointer;text-align:left}.echo-welcome-message:hover{transform:translateY(-2px) scale(1.02);background:var(--primary-color-lightest);box-shadow:var(--shadow-combined-lg)}.echo-welcome-message:active{transform:translateY(0) scale(.98)}.echo-welcome-message-close{width:20px;height:20px;padding:2px;margin-left:var(--spacing-xs);border:none;background:transparent;opacity:.7;cursor:pointer;border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;transition:all var(--duration-base) var(--ease-default)}.echo-welcome-message-close:hover{opacity:1;background:var(--shadow-color-light);transform:scale(1.1)}.echo-welcome-message-close:active{transform:scale(.95)}.echo-welcome-message:after{content:"";position:absolute;bottom:-4px;right:17px;width:16px;height:16px;background:inherit;transform:rotate(45deg);border-radius:var(--radius-xs);border:1px solid var(--primary-color);z-index:-2}.echo-welcome-message:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:var(--primary-color-lightest);z-index:-1;border-radius:var(--radius-lg)}.echo-welcome-message-pulsar{content:"";display:inline-block;width:6px;height:6px;background:var(--primary-color);border-radius:50%;margin-right:8px;animation:pulse 1.5s var(--ease-in-out) infinite}.echo-button{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-md);font-weight:500;cursor:pointer;transition:all var(--duration-base) var(--ease-default);line-height:1}.echo-button:focus-visible{outline:2px solid var(--primary-color);outline-offset:2px}.echo-button-primary{background:var(--primary-color);color:#fff}.echo-button-primary:hover{background:var(--hover-color);transform:translateY(-1px)}.echo-button-primary:active{transform:translateY(0)}.echo-button-secondary{background:transparent;color:var(--text-light)}.echo-button-secondary:hover{background-color:var(--primary-color-lightest);color:var(--primary-color)}.echo-button-xs{padding:var(--spacing-xs);font-size:var(--font-xs)}.echo-button-sm{padding:var(--spacing-xs);font-size:var(--font-sm)}.echo-button-md{padding:var(--spacing-md) var(--spacing-2xl);font-size:var(--font-base)}.echo-button-lg{padding:var(--spacing-md) var(--spacing-3xl);font-size:var(--font-md)}@keyframes slideUpFade{0%{opacity:0;transform:translateY(var(--spacing-sm))}to{opacity:1;transform:translateY(0)}}@keyframes slideDownFade{0%{opacity:0;transform:translateY(calc(-1 * var(--spacing-sm)))}to{opacity:1;transform:translateY(0)}}@keyframes popIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes popInSlideUp{0%{opacity:0;transform:translateY(var(--spacing-sm)) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes popInSlideDown{0%{opacity:0;transform:translate(-50%,-100%) translateY(calc(-1 * var(--spacing-xs))) scale(.95)}to{opacity:1;transform:translate(-50%,-100%) translateY(calc(-1 * var(--spacing-sm))) scale(1)}}@keyframes bounceIn{0%{opacity:0;transform:translateY(var(--spacing-xl)) scale(.9)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.5}to{transform:scale(1);opacity:1}}';var kt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="m9 18 6-6-6-6">');const St=e=>(()=>{var t=kt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var Ct=w('<svg viewBox="0 0 64 66"fill=none><path d="M59.716 36.936L54.9 33l-6.17 5.108a77.278 77.278 0 00-12.744 13.469l-3.637 4.914-3.778-5.017a83.719 83.719 0 00-13.956-14.538L9.799 33l2.86-2.332A104.39 104.39 0 0030.1 12.5l2.24-2.98 1.736 2.298a111.905 111.905 0 0018.608 19.384l2.206 1.81 2.861-2.333a104.13 104.13 0 005.297-4.641C59.978 11.294 47.409.26 32.349.26 14.997.26.92 14.923.92 33c0 18.076 14.077 32.74 31.43 32.74 15.102 0 27.715-11.103 30.73-25.892a75.808 75.808 0 00-3.375-2.912h.011z">');const Et=e=>(()=>{var t=Ct(),n=t.firstChild;return l.createRenderEffect(r=>{var a=e.size??24,o=e.size??24,i=e.class,c=e.style,s=e.fill??"currentColor";return a!==r.e&&u(t,"width",r.e=a),o!==r.t&&u(t,"height",r.t=o),i!==r.a&&u(t,"class",r.a=i),r.o=x(t,c,r.o),s!==r.i&&u(n,"fill",r.i=s),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),t})();var Pt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M3 7V5a2 2 0 0 1 2-2h2"></path><path d="M17 3h2a2 2 0 0 1 2 2v2"></path><path d="M21 17v2a2 2 0 0 1-2 2h-2"></path><path d="M7 21H5a2 2 0 0 1-2-2v-2">');const $t=e=>(()=>{var t=Pt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var zt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z">');const Ot=e=>(()=>{var t=zt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var Mt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M3 6h18"></path><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"></path><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"></path><line x1=10 x2=10 y1=11 y2=17></line><line x1=14 x2=14 y1=11 y2=17>');const $e=e=>(()=>{var t=Mt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var Tt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=10></circle><path d="m9 12 2 2 4-4">');const It=e=>(()=>{var t=Tt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var Dt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=10></circle><path d="m15 9-6 6"></path><path d="m9 9 6 6">');const At=e=>(()=>{var t=Dt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var jt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M18 6 6 18"></path><path d="m6 6 12 12">');const G=e=>(()=>{var t=jt();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var Ft=w("<div class=echo-color-selector><button class=echo-drawing-toolbar-button title=Color></button><div class=echo-color-swatch-wrapper><div class=echo-color-swatch>"),Lt=w("<button class=echo-color-swatch-button>");const Nt=["#ff6b6b","#69db7c","#74c0fc","#ffd43b","#da77f2","#66d9e8","#ffa94d","#e599f7"],Rt=()=>{const e=p();return(()=>{var t=Ft(),n=t.firstChild,r=n.nextSibling,a=r.firstChild;return m(a,l.createComponent(l.For,{get each(){return[e.widget.state.primaryColor,...Nt]},children:o=>(()=>{var i=Lt();return i.$$click=()=>e.drawing.setState({selectedColor:o}),u(i,"title",`Select ${o} color`),o!=null?i.style.setProperty("background-color",o):i.style.removeProperty("background-color"),l.createRenderEffect(()=>u(i,"data-selected",e.drawing.state.selectedColor===o)),i})()})),l.createRenderEffect(o=>(o=e.drawing.state.selectedColor)!=null?n.style.setProperty("background-color",o):n.style.removeProperty("background-color")),t})()};P(["click"]);var Yt=w('<div class=echo-drawing-toolbar data-hide-when-drawing=true><button class=echo-drawing-toolbar-button title="Clear drawings">'),Bt=w("<button class=echo-drawing-toolbar-button>");const Ht={rectangle:$t,path:Ot},Wt=()=>{const e=p(),t=Object.values($);return(()=>{var n=Yt(),r=n.firstChild;return m(n,l.createComponent(l.For,{each:t,children:a=>{const o=Ht[a.id];return(()=>{var i=Bt();return i.$$click=()=>e.drawing.setState({selectedTool:a.id}),m(i,l.createComponent(o,{class:"echo-drawing-toolbar-icon"})),l.createRenderEffect(c=>{var s=a.label,d=e.drawing.state.selectedTool===a.id;return s!==c.e&&u(i,"title",c.e=s),d!==c.t&&u(i,"data-selected",c.t=d),c},{e:void 0,t:void 0}),i})()}}),r),m(n,l.createComponent(Rt,{}),r),r.$$click=()=>e.drawing.setState({shapes:[]},!0),m(r,l.createComponent($e,{class:"echo-drawing-toolbar-icon"})),n})()};P(["click"]);var _t=w("<button>");const z=e=>{const t=()=>e.variant||"primary",n=()=>e.size||"md";return(()=>{var r=_t();return _e(r,l.mergeProps(e,{get class(){return`echo-button echo-button-${t()} echo-button-${n()} ${e.class}`}}),!1),r})()};var Ut=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>');const Xt=e=>(()=>{var t=Ut();return l.createRenderEffect(n=>{var r=e.size??24,a=e.size??24,o=e.fill??"none",i=e.stroke??"currentColor",c=e.strokeWidth??2,s=e.class,d=e.style;return r!==n.e&&u(t,"width",n.e=r),a!==n.t&&u(t,"height",n.t=a),o!==n.a&&u(t,"fill",n.a=o),i!==n.o&&u(t,"stroke",n.o=i),c!==n.i&&u(t,"stroke-width",n.i=c),s!==n.n&&u(t,"class",n.n=s),n.s=x(t,d,n.s),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),t})();var Kt=w("<div class=echo-stored-feedback-empty>No unsubmitted feedback"),Vt=w("<div class=echo-stored-feedback><div class=echo-stored-feedback-header><h3>Unsubmitted Feedback</h3></div><div class=echo-stored-feedback-list>"),Gt=w("<div><div class=echo-stored-feedback-content><div class=echo-stored-feedback-path></div><div class=echo-stored-feedback-preview></div></div><div class=echo-stored-feedback-actions>");const qt=()=>{const e=p(),[t,n]=l.createSignal(ne()),[r,a]=l.createSignal(window.location.pathname),o=()=>{const h=ne();n(h),e.widget.setState({pagesCount:h.length})},i=()=>{a(window.location.pathname)};D({event:"echo-storage-change",callback:o}),D({event:"popstate",callback:i}),Z({target:document.documentElement,options:{childList:!0,subtree:!0},callback:()=>{a(window.location.pathname)}});const c=(h,f)=>{const g=f?`${h}${f}`:h;window.location.href=g,e.widget.setState({isStoredFeedbackOpen:!1})},s=h=>{r()===h&&e.methods.reset(),ge(h);const f=ne();n(f),e.widget.setState({pagesCount:f.length})},d=h=>{if(h==="/")return"/";const f=h.split("/");return f.length<=4?h:`/${f[1]}/.../${f[f.length-1]}`};return l.createComponent(l.Show,{get when(){return e.widget.state.isStoredFeedbackOpen},get children(){var h=Vt(),f=h.firstChild;f.firstChild;var g=f.nextSibling;return m(f,l.createComponent(z,{variant:"secondary",size:"sm",onClick:()=>e.widget.setState({isStoredFeedbackOpen:!1}),get children(){return l.createComponent(G,{size:20})}}),null),m(g,l.createComponent(l.For,{get each(){return t()},children:v=>{const b=l.createMemo(()=>v.path===r());return(()=>{var y=Gt(),M=y.firstChild,L=M.firstChild,$n=L.nextSibling,Oe=M.nextSibling;return m(L,()=>d(v.path)),m($n,()=>v.state.feedback.comment),m(Oe,(()=>{var T=l.createMemo(()=>!b());return()=>T()&&l.createComponent(z,{class:"echo-stored-feedback-link",variant:"secondary",size:"sm",onClick:()=>c(v.path,v.state.latestQuery),get children(){return l.createComponent(Xt,{})}})})(),null),m(Oe,l.createComponent(z,{class:"echo-stored-feedback-delete",variant:"secondary",size:"sm",onClick:()=>s(v.path),children:"Delete"}),null),l.createRenderEffect(T=>{var Me=`echo-stored-feedback-item ${b()?"echo-stored-feedback-item-current":""}`,Te=v.path;return Me!==T.e&&se(y,T.e=Me),Te!==T.t&&u(L,"title",T.t=Te),T},{e:void 0,t:void 0}),y})()}}),null),m(g,l.createComponent(l.Show,{get when(){return t().length===0},get children(){return Kt()}}),null),h}})};var Qt=w("<button class=echo-launcher-button>"),Zt=w("<span class=echo-launcher-button-count>");const Jt=()=>{const e=p(),[t,n]=l.createSignal(!1);let r;const a=()=>{r&&window.clearTimeout(r),r=window.setTimeout(()=>{const d=fe("welcome_message_shown",!1);!e.widget.state.isOpen&&!e.widget.state.isStoredFeedbackOpen&&d&&n(!0)},4e3)},o=()=>{n(!1)},i=()=>{a()},c=()=>{e.widget.setState({isOpen:!e.widget.state.isOpen}),e.widget.setState({welcomeMessageIsClosing:!0}),J("welcome_message_shown",!0)};l.createEffect(()=>{e.widget.state.isOpen||(n(!1),a()),e.widget.state.isStoredFeedbackOpen&&n(!1)});const s=d=>{d.stopPropagation(),e.widget.setState({isStoredFeedbackOpen:!e.widget.state.isStoredFeedbackOpen}),n(!1)};return[(()=>{var d=Qt();return d.addEventListener("pointerleave",i),d.addEventListener("pointerenter",o),d.$$click=c,m(d,l.createComponent(Et,{stroke:"white",fill:"#ffffff"}),null),m(d,(()=>{var h=l.createMemo(()=>e.widget.state.pagesCount>0);return()=>h()&&(()=>{var f=Zt();return f.$$click=s,m(f,()=>e.widget.state.pagesCount),f})()})(),null),l.createRenderEffect(h=>{var f=e.widget.state.isOpen,g=t()?"45px":"0";return f!==h.e&&u(d,"data-hidden",h.e=f),g!==h.t&&((h.t=g)!=null?d.style.setProperty("left",g):d.style.removeProperty("left")),h},{e:void 0,t:void 0}),d})(),l.createComponent(qt,{})]};P(["click"]);var en=w("<div class=echo-notification><div class=echo-notification-icon></div><div class=echo-notification-content><div class=echo-notification-title></div><div class=echo-notification-message>");const tn=()=>{const e=p(),t=()=>{e.widget.setState({notification:{...e.widget.state.notification,show:!1}})},n=()=>{switch(e.widget.state.notification.type){case"success":return e.widget.state.text.notification.successTitle;case"error":return e.widget.state.text.notification.errorTitle;default:return""}};return(()=>{var r=en(),a=r.firstChild,o=a.nextSibling,i=o.firstChild,c=i.nextSibling;return m(r,l.createComponent(z,{class:"echo-notification-hide",variant:"secondary",size:"sm",onClick:t,get title(){return e.widget.state.text.notification.hideTitle},get children(){return l.createComponent(G,{size:20})}}),a),m(a,(()=>{var s=l.createMemo(()=>e.widget.state.notification.type==="success");return()=>s()?l.createComponent(It,{size:32}):(()=>{var d=l.createMemo(()=>e.widget.state.notification.type==="error");return()=>d()?l.createComponent(At,{size:32}):null})()})()),m(i,n),m(c,()=>{var s;return(s=e.widget.state.notification)==null?void 0:s.message}),l.createRenderEffect(s=>{var d=e.widget.state.notification.type,h=!e.widget.state.notification.type,f=!e.widget.state.notification.show;return d!==s.e&&u(r,"data-type",s.e=d),h!==s.t&&u(r,"data-empty",s.t=h),f!==s.a&&u(r,"data-hidden",s.a=f),s},{e:void 0,t:void 0,a:void 0}),r})()};var nn=w("<button class=echo-welcome-message><span class=echo-welcome-message-pulsar></span><div class=echo-welcome-message-close role=button tabindex=0>");const rn=()=>{const e=p(),t=fe("welcome_message_shown",!1),n=a=>{a.stopPropagation(),e.widget.setState({welcomeMessageIsClosing:!0}),J("welcome_message_shown",!0)},r=()=>{e.widget.setState({isOpen:!0}),e.widget.setState({welcomeMessageIsClosing:!0}),J("welcome_message_shown",!0)};return t?null:(()=>{var a=nn(),o=a.firstChild,i=o.nextSibling;return a.$$click=r,a.style.setProperty("bottom","80px"),a.style.setProperty("right","20px"),m(a,()=>e.widget.state.text.welcomeMessage.text,i),i.$$keydown=c=>c.key==="Enter"&&n(c),i.$$click=n,m(i,l.createComponent(G,{size:16,strokeWidth:3})),l.createRenderEffect(c=>{var s=e.widget.state.welcomeMessageIsClosing,d=e.widget.state.text.welcomeMessage.closeAriaLabel;return s!==c.e&&u(a,"data-hidden",c.e=s),d!==c.t&&u(i,"aria-label",c.t=d),c},{e:void 0,t:void 0}),a})()};P(["click","keydown"]);var on=w("<svg><rect class=echo-shape fill=transparent vector-effect=non-scaling-stroke></svg>",!1,!0),an=w("<svg><path class=echo-shape fill=none vector-effect=non-scaling-stroke stroke-linecap=round></svg>",!1,!0);const ze=e=>{const t=l.createMemo(()=>e.id===e.selectedShapeId);return[l.createComponent(l.Show,{get when(){return e.type==="rectangle"},get children(){return l.createComponent(sn,l.mergeProps(e,{get isSelected(){return t()}}))}}),l.createComponent(l.Show,{get when(){return e.type==="path"},get children(){return l.createComponent(cn,l.mergeProps(e,{get isSelected(){return t()}}))}})]},sn=e=>{const t=l.createMemo(()=>Se(e.points));return l.createComponent(l.Show,{get when(){return t()},get children(){var n=on();return n.$$click=()=>{var r;return(r=e.onShapeClick)==null?void 0:r.call(e,e.id)},l.createRenderEffect(r=>{var a=e.id,o=e.isSelected,i=t().x,c=t().y,s=t().width,d=t().height,h=e.color,f=$.rectangle.strokeWidth,g=e.isSelected?$.rectangle.opacity.selected:$.rectangle.opacity.default,v=e.isSelected?"5,5":"none",b=e.isSelected?"move":"pointer";return a!==r.e&&u(n,"data-shape-id",r.e=a),o!==r.t&&u(n,"data-selected",r.t=o),i!==r.a&&u(n,"x",r.a=i),c!==r.o&&u(n,"y",r.o=c),s!==r.i&&u(n,"width",r.i=s),d!==r.n&&u(n,"height",r.n=d),h!==r.s&&u(n,"stroke",r.s=h),f!==r.h&&u(n,"stroke-width",r.h=f),g!==r.r&&u(n,"opacity",r.r=g),v!==r.d&&u(n,"stroke-dasharray",r.d=v),b!==r.l&&u(n,"cursor",r.l=b),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0}),n}})},cn=e=>{const t=l.createMemo(()=>dt(e.points));return l.createComponent(l.Show,{get when(){return t()},get children(){var n=an();return n.$$click=()=>{var r;return(r=e.onShapeClick)==null?void 0:r.call(e,e.id)},l.createRenderEffect(r=>{var a=e.id,o=e.isSelected,i=t(),c=e.color,s=$.path.strokeWidth,d=e.isSelected?$.path.opacity.selected:$.path.opacity.default,h=e.isSelected?"move":"pointer";return a!==r.e&&u(n,"data-shape-id",r.e=a),o!==r.t&&u(n,"data-selected",r.t=o),i!==r.a&&u(n,"d",r.a=i),c!==r.o&&u(n,"stroke",r.o=c),s!==r.i&&u(n,"stroke-width",r.i=s),d!==r.n&&u(n,"opacity",r.n=d),h!==r.s&&u(n,"cursor",r.s=h),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n}})};P(["click"]);var ln=w("<div class=echo-drawing-tooltip data-hide-when-drawing=true>");const dn=()=>{const e=p(),t=l.createMemo(()=>e.drawing.state.showTooltip&&e.drawing.state.mousePosition.y&&e.drawing.state.mousePosition.x&&e.widget.state.isOpen&&!lt());return l.createComponent(l.Show,{get when(){return t()},get children(){var n=ln();return m(n,()=>e.widget.state.text.drawingTooltip.text),l.createRenderEffect(r=>{var a=`${e.drawing.state.mousePosition.y+20}px`,o=`${e.drawing.state.mousePosition.x+10}px`;return a!==r.e&&((r.e=a)!=null?n.style.setProperty("top",a):n.style.removeProperty("top")),o!==r.t&&((r.t=o)!=null?n.style.setProperty("left",o):n.style.removeProperty("left")),r},{e:void 0,t:void 0}),n}})};var hn=w("<div class=echo-shape-actions data-hide-when-drawing=true>");const un=()=>{const e=p();let t;const[n,r]=l.createSignal({x:window.scrollX,y:window.scrollY});D({event:"scroll",callback:()=>{r({x:window.scrollX,y:window.scrollY})}});const o=()=>{e.drawing.state.selectedShapeId&&e.drawing.setState({shapes:e.drawing.state.shapes.filter(s=>s.id!==e.drawing.state.selectedShapeId),selectedShapeId:null})},i=l.createMemo(()=>e.drawing.state.selectedShapeId?e.drawing.state.shapes.find(s=>s.id===e.drawing.state.selectedShapeId):null),c=l.createMemo(()=>{const s=i(),d=t==null?void 0:t.getBoundingClientRect();if(!s||!d)return null;let h=null;if(s.type==="rectangle"){const v=Se(s.points);if(!v)return null;h={x:v.x+v.width/2,y:v.y}}else if(s.type==="path"&&s.points.length>0)h={x:s.points[0].x,y:s.points[0].y};else return null;const f=8,g=n();return{x:Math.max(d.width/2+f,Math.min(window.innerWidth-d.width/2-f,h.x-g.x)),y:Math.max(d.height+f,Math.min(window.innerHeight-f,h.y-g.y))}});return(()=>{var s=hn(),d=t;return typeof d=="function"?R(d,s):t=s,m(s,l.createComponent(z,{onClick:o,size:"sm",variant:"secondary",title:"Delete shape",get children(){return l.createComponent($e,{size:20})}})),l.createRenderEffect(h=>{var b,y;var f=!c(),g=c()?`${(b=c())==null?void 0:b.x}px`:"0",v=c()?`${(y=c())==null?void 0:y.y}px`:"0";return f!==h.e&&(s.hidden=h.e=f),g!==h.t&&((h.t=g)!=null?s.style.setProperty("left",g):s.style.removeProperty("left")),v!==h.a&&((h.a=v)!=null?s.style.setProperty("top",v):s.style.removeProperty("top")),h},{e:void 0,t:void 0,a:void 0}),s})()};var fn=w('<div class=echo-drawing-layer-container><svg width=100% height=100% class=echo-drawing-layer preserveAspectRatio=none><path class=echo-drawing-layer-mask fill="rgba(33, 43, 55, 1)"fill-opacity=0.2 fill-rule=evenodd>');const gn=()=>{const e=p();let t;return l.onMount(()=>{t==null||t.addEventListener("mousemove",e.drawing.methods.handleMove),t==null||t.addEventListener("mouseup",e.drawing.methods.handleEnd),t==null||t.addEventListener("touchmove",e.drawing.methods.handleMove,{passive:!1}),t==null||t.addEventListener("touchend",e.drawing.methods.handleEnd)}),l.onCleanup(()=>{t==null||t.removeEventListener("mousemove",e.drawing.methods.handleMove),t==null||t.removeEventListener("mouseup",e.drawing.methods.handleEnd),t==null||t.removeEventListener("touchmove",e.drawing.methods.handleMove),t==null||t.removeEventListener("touchend",e.drawing.methods.handleEnd)}),(()=>{var n=fn(),r=n.firstChild,a=r.firstChild,o=t;return typeof o=="function"?R(o,n):t=n,m(n,l.createComponent(dn,{}),r),m(n,l.createComponent(un,{}),r),N(r,"touchend",e.drawing.methods.handleLeave,!0),N(r,"mouseleave",e.drawing.methods.handleLeave),N(r,"mouseenter",e.drawing.methods.handleEnter),r.$$touchmove=i=>{i.preventDefault(),e.drawing.methods.handleMove(i)},N(r,"mousemove",e.drawing.methods.handleMove,!0),r.$$touchstart=i=>{i.preventDefault(),e.drawing.methods.handleStart(i),e.drawing.methods.handleEnter(i),e.drawing.setState({showTooltip:!1,hasDrawn:!0})},r.$$mousedown=i=>{e.drawing.methods.handleStart(i),e.drawing.setState({showTooltip:!1,hasDrawn:!0})},m(r,l.createComponent(l.For,{get each(){return e.drawing.state.shapes},children:i=>l.createComponent(ze,{get id(){return i.id},get type(){return i.type},get color(){return i.color},get points(){return i.points},get selectedShapeId(){return e.drawing.state.selectedShapeId},get onShapeClick(){return e.drawing.methods.handleShapeClick}})}),null),m(r,l.createComponent(ze,{id:"temp",get type(){return e.drawing.state.selectedTool},get color(){return e.drawing.state.selectedColor},get points(){return e.drawing.state.currentPoints},get selectedShapeId(){return e.drawing.state.selectedShapeId}}),null),l.createRenderEffect(i=>{var c=e.drawing.state.cursor,s=gt({width:e.widget.state.dimensions.width,height:e.widget.state.dimensions.height},e.drawing.state.currentPoints,e.drawing.state.shapes);return c!==i.e&&((i.e=c)!=null?n.style.setProperty("cursor",c):n.style.removeProperty("cursor")),s!==i.t&&u(a,"d",i.t=s),i},{e:void 0,t:void 0}),n})()};P(["mousedown","touchstart","mousemove","touchmove","touchend"]);var mn=w("<div class=echo-feedback data-hide-when-drawing=true><form class=echo-feedback-content><div class=echo-feedback-header><h3 class=echo-feedback-title></h3><div class=echo-feedback-header-actions></div></div><textarea class=echo-feedback-form-textarea required>");const vn=()=>{let e;const t=p(),n=async o=>{o.preventDefault();const i=await ft(),c={comment:t.feedback.state.comment,screenshot:i,metadata:{url:window.location.href,userAgent:navigator.userAgent,timestamp:new Date().toISOString(),browserInfo:{width:window.innerWidth,height:window.innerHeight,screenWidth:window.screen.width,screenHeight:window.screen.height}},console:xe()};t.methods.submit(c)};l.createEffect(()=>{e&&t.widget.state.isOpen&&e.focus()});const r=o=>{o.stopPropagation(),t.feedback.setState({isMinimized:!0})},a=()=>{t.feedback.setState({isMinimized:!1})};return(()=>{var o=mn(),i=o.firstChild,c=i.firstChild,s=c.firstChild,d=s.nextSibling,h=c.nextSibling;o.$$click=()=>t.feedback.state.isMinimized&&a(),i.addEventListener("submit",n),m(s,()=>t.widget.state.text.feedbackForm.title),m(d,l.createComponent(z,{type:"button",title:"Hide form",variant:"secondary",size:"sm",onClick:r,get children(){return l.createComponent(St,{size:20})}}),null),m(d,l.createComponent(z,{type:"button",title:"Close form",variant:"secondary",size:"sm",onClick:()=>t.widget.setState({isOpen:!1}),get children(){return l.createComponent(G,{size:20})}}),null),h.$$input=g=>t.feedback.setState({comment:g.currentTarget.value});var f=e;return typeof f=="function"?R(f,h):e=h,m(i,l.createComponent(z,{type:"submit",variant:"primary",size:"lg",style:{width:"100%"},get children(){return t.widget.state.text.feedbackForm.submitButton}}),null),l.createRenderEffect(g=>{var v=t.feedback.state.isMinimized,b=t.feedback.state.isMinimized?"pointer":"default",y=t.widget.state.text.feedbackForm.placeholder;return v!==g.e&&u(o,"data-minimized",g.e=v),b!==g.t&&((g.t=b)!=null?o.style.setProperty("cursor",b):o.style.removeProperty("cursor")),y!==g.a&&u(h,"placeholder",g.a=y),g},{e:void 0,t:void 0,a:void 0}),l.createRenderEffect(()=>h.value=t.feedback.state.comment),o})()};P(["click","input"]);var wn=w("<style>"),bn=w("<div class=echo-launcher>"),pn=w("<div class=echo-overlay>"),yn=w("<div class=echo-root>");const xn=e=>l.createComponent(qe,{useShadow:!0,get mount(){return document.body},get children(){return l.createComponent(yt,l.mergeProps(e,{get children(){return l.createComponent(Cn,{get children(){return[l.createComponent(kn,{get primaryColor(){return e.primaryColor}}),l.createComponent(Sn,{})]}})}}))}}),kn=e=>{const[t,n]=l.createSignal("");return l.createEffect(()=>{const r=`
4
- .echo-root {
5
- --primary-color: ${e.primaryColor};
6
- --primary-text-color: ${it(e.primaryColor)};
7
- }
8
- `;n(r)}),(()=>{var r=wn();return m(r,xt,null),m(r,t,null),r})()},Sn=()=>{const e=p();return[(()=>{var t=bn();return m(t,l.createComponent(Jt,{}),null),m(t,l.createComponent(rn,{}),null),m(t,l.createComponent(tn,{}),null),l.createRenderEffect(()=>u(t,"data-hidden",e.widget.state.isOpen)),t})(),(()=>{var t=pn();return m(t,l.createComponent(vn,{}),null),m(t,l.createComponent(Wt,{}),null),m(t,l.createComponent(gn,{}),null),l.createRenderEffect(()=>u(t,"data-hidden",!e.widget.state.isOpen)),t})()]},Cn=e=>{let t;const n=p(),r=()=>{requestAnimationFrame(()=>{t&&(t.style.height="0px",t.style.height=`${document.documentElement.scrollHeight}px`,n.widget.setState({dimensions:{width:document.documentElement.clientWidth,height:document.documentElement.scrollHeight}}))})};return D({event:"resize",callback:r,onMount:r}),Ze("Escape",()=>{n.widget.setState({isOpen:!1})}),Z({target:document.documentElement,options:{childList:!0,subtree:!0,attributes:!0},callback:()=>{r()}}),(()=>{var a=yn(),o=t;return typeof o=="function"?R(o,a):t=a,m(a,()=>e.children),l.createRenderEffect(i=>{var c=n.drawing.state.isDrawing,s=`${n.widget.state.dimensions.height}px`,d=`${n.widget.state.dimensions.width}px`;return c!==i.e&&u(a,"data-drawing",i.e=c),s!==i.t&&((i.t=s)!=null?a.style.setProperty("height",s):a.style.removeProperty("height")),d!==i.a&&((i.a=d)!=null?a.style.setProperty("width",d):a.style.removeProperty("width")),i},{e:void 0,t:void 0,a:void 0}),a})()},En={welcomeMessage:{text:"Click here to leave feedback",closeAriaLabel:"Close welcome message"},feedbackForm:{title:"Send Feedback",placeholder:"What's on your mind? We'd love to hear your feedback...",screenshotAlt:"Screenshot Preview",submitButton:"Send Feedback",minimizeTitle:"Minimize",expandTitle:"Expand",closeTitle:"Close",showFormTitle:"Show Feedback Form"},notification:{successTitle:"Thank you for your feedback!",errorTitle:"Something went wrong.",errorMessage:"Failed to send feedback. Please try again.",hideTitle:"Hide notification"},drawingTooltip:{text:"Click & drag to draw"}};let q=null;function Pn(e){q&&(console.warn("Echo widget is already initialized. Cleaning up previous instance..."),q());try{mt(e),st();const{position:t="bottom-right",primaryColor:n="#6227dc",onSubmit:r,textConfig:a={}}=e,o=ye(En,a),i=document.createElement("div");i.id="echo-container",document.body.appendChild(i);const c=Be(()=>l.createComponent(xn,{position:t,primaryColor:n,textConfig:o,onSubmit:async d=>await r({...d,console:xe()})}),i),s=()=>{c(),i.remove(),ct(),q=null};return window.addEventListener("unload",s,{once:!0}),q=s,s}catch(t){throw console.error("Echo initialization failed:",t),t}}E.initEcho=Pn,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"})});
9
- //# sourceMappingURL=echo.umd.js.map
1
+ (function(D,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("solid-js"),require("html2canvas")):typeof define=="function"&&define.amd?define(["exports","solid-js","html2canvas"],c):(D=typeof globalThis<"u"?globalThis:D||self,c(D.Echo={},D.Solid,D.html2canvas))})(this,function(D,c,He){"use strict";const Ue=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected"],Xe=new Set(["className","value","readOnly","formNoValidate","isMap","noModule","playsInline",...Ue]),Ke=new Set(["innerHTML","textContent","innerText","children"]),Ge=Object.assign(Object.create(null),{className:"class",htmlFor:"for"}),Ze=Object.assign(Object.create(null),{class:"className",formnovalidate:{$:"formNoValidate",BUTTON:1,INPUT:1},ismap:{$:"isMap",IMG:1},nomodule:{$:"noModule",SCRIPT:1},playsinline:{$:"playsInline",VIDEO:1},readonly:{$:"readOnly",INPUT:1,TEXTAREA:1}});function Qe(e,n){const t=Ze[e];return typeof t=="object"?t[n]?t.$:void 0:t}const Je=new Set(["beforeinput","click","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"]);function et(e,n,t){let r=t.length,o=n.length,a=r,i=0,l=0,s=n[o-1].nextSibling,d=null;for(;i<o||l<a;){if(n[i]===t[l]){i++,l++;continue}for(;n[o-1]===t[a-1];)o--,a--;if(o===i){const u=a<r?l?t[l-1].nextSibling:t[a-l]:s;for(;l<a;)e.insertBefore(t[l++],u)}else if(a===l)for(;i<o;)(!d||!d.has(n[i]))&&n[i].remove(),i++;else if(n[i]===t[a-1]&&t[l]===n[o-1]){const u=n[--o].nextSibling;e.insertBefore(t[l++],n[i++].nextSibling),e.insertBefore(t[--a],u),n[o]=t[a]}else{if(!d){d=new Map;let f=l;for(;f<a;)d.set(t[f],f++)}const u=d.get(n[i]);if(u!=null)if(l<u&&u<a){let f=i,g=1,m;for(;++f<o&&f<a&&!((m=d.get(n[f]))==null||m!==u+g);)g++;if(g>u-l){const b=n[i];for(;l<u;)e.insertBefore(t[l++],b)}else e.replaceChild(t[l++],n[i++])}else i++;else n[i++].remove()}}}const ye="_$DX_DELEGATE";function tt(e,n,t,r={}){let o;return c.createRoot(a=>{o=a,n===document?e():v(n,e(),n.firstChild?null:void 0,t)},r.owner),()=>{o(),n.textContent=""}}function w(e,n,t){let r;const o=()=>{const i=document.createElement("template");return i.innerHTML=e,t?i.content.firstChild.firstChild:i.content.firstChild},a=n?()=>c.untrack(()=>document.importNode(r||(r=o()),!0)):()=>(r||(r=o())).cloneNode(!0);return a.cloneNode=a,a}function E(e,n=window.document){const t=n[ye]||(n[ye]=new Set);for(let r=0,o=e.length;r<o;r++){const a=e[r];t.has(a)||(t.add(a),n.addEventListener(a,ct))}}function h(e,n,t){U(e)||(t==null?e.removeAttribute(n):e.setAttribute(n,t))}function nt(e,n,t){U(e)||(t?e.setAttribute(n,""):e.removeAttribute(n))}function xe(e,n){U(e)||(n==null?e.removeAttribute("class"):e.className=n)}function N(e,n,t,r){if(r)Array.isArray(t)?(e[`$$${n}`]=t[0],e[`$$${n}Data`]=t[1]):e[`$$${n}`]=t;else if(Array.isArray(t)){const o=t[0];e.addEventListener(n,t[0]=a=>o.call(e,t[1],a))}else e.addEventListener(n,t,typeof t!="function"&&t)}function rt(e,n,t={}){const r=Object.keys(n||{}),o=Object.keys(t);let a,i;for(a=0,i=o.length;a<i;a++){const l=o[a];!l||l==="undefined"||n[l]||(ke(e,l,!1),delete t[l])}for(a=0,i=r.length;a<i;a++){const l=r[a],s=!!n[l];!l||l==="undefined"||t[l]===s||!s||(ke(e,l,!0),t[l]=s)}return t}function z(e,n,t){if(!n)return t?h(e,"style"):n;const r=e.style;if(typeof n=="string")return r.cssText=n;typeof t=="string"&&(r.cssText=t=void 0),t||(t={}),n||(n={});let o,a;for(a in t)n[a]==null&&r.removeProperty(a),delete t[a];for(a in n)o=n[a],o!==t[a]&&(r.setProperty(a,o),t[a]=o);return t}function at(e,n={},t,r){const o={};return c.createRenderEffect(()=>o.children=X(e,n.children,o.children)),c.createRenderEffect(()=>typeof n.ref=="function"&&R(n.ref,e)),c.createRenderEffect(()=>ot(e,n,t,!0,o,!0)),o}function R(e,n,t){return c.untrack(()=>e(n,t))}function v(e,n,t,r){if(t!==void 0&&!r&&(r=[]),typeof n!="function")return X(e,n,r,t);c.createRenderEffect(o=>X(e,n(),o,t),r)}function ot(e,n,t,r,o={},a=!1){n||(n={});for(const i in o)if(!(i in n)){if(i==="children")continue;o[i]=Ce(e,i,null,o[i],t,a,n)}for(const i in n){if(i==="children")continue;const l=n[i];o[i]=Ce(e,i,l,o[i],t,a,n)}}function U(e){return!!c.sharedConfig.context&&!c.sharedConfig.done&&(!e||e.isConnected)}function it(e){return e.toLowerCase().replace(/-([a-z])/g,(n,t)=>t.toUpperCase())}function ke(e,n,t){const r=n.trim().split(/\s+/);for(let o=0,a=r.length;o<a;o++)e.classList.toggle(r[o],t)}function Ce(e,n,t,r,o,a,i){let l,s,d,u,f;if(n==="style")return z(e,t,r);if(n==="classList")return rt(e,t,r);if(t===r)return r;if(n==="ref")a||t(e);else if(n.slice(0,3)==="on:"){const g=n.slice(3);r&&e.removeEventListener(g,r,typeof r!="function"&&r),t&&e.addEventListener(g,t,typeof t!="function"&&t)}else if(n.slice(0,10)==="oncapture:"){const g=n.slice(10);r&&e.removeEventListener(g,r,!0),t&&e.addEventListener(g,t,!0)}else if(n.slice(0,2)==="on"){const g=n.slice(2).toLowerCase(),m=Je.has(g);if(!m&&r){const b=Array.isArray(r)?r[0]:r;e.removeEventListener(g,b)}(m||t)&&(N(e,g,t,m),m&&E([g]))}else if(n.slice(0,5)==="attr:")h(e,n.slice(5),t);else if(n.slice(0,5)==="bool:")nt(e,n.slice(5),t);else if((f=n.slice(0,5)==="prop:")||(d=Ke.has(n))||(u=Qe(n,e.tagName))||(s=Xe.has(n))||(l=e.nodeName.includes("-")||"is"in i)){if(f)n=n.slice(5),s=!0;else if(U(e))return t;n==="class"||n==="className"?xe(e,t):l&&!s&&!d?e[it(n)]=t:e[u||n]=t}else h(e,Ge[n]||n,t);return t}function ct(e){if(c.sharedConfig.registry&&c.sharedConfig.events&&c.sharedConfig.events.find(([s,d])=>d===e))return;let n=e.target;const t=`$$${e.type}`,r=e.target,o=e.currentTarget,a=s=>Object.defineProperty(e,"target",{configurable:!0,value:s}),i=()=>{const s=n[t];if(s&&!n.disabled){const d=n[`${t}Data`];if(d!==void 0?s.call(n,d,e):s.call(n,e),e.cancelBubble)return}return n.host&&typeof n.host!="string"&&!n.host._$host&&n.contains(e.target)&&a(n.host),!0},l=()=>{for(;i()&&(n=n._$host||n.parentNode||n.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get(){return n||document}}),c.sharedConfig.registry&&!c.sharedConfig.done&&(c.sharedConfig.done=_$HY.done=!0),e.composedPath){const s=e.composedPath();a(s[0]);for(let d=0;d<s.length-2&&(n=s[d],!!i());d++){if(n._$host){n=n._$host,l();break}if(n.parentNode===o)break}}else l();a(r)}function X(e,n,t,r,o){const a=U(e);if(a){!t&&(t=[...e.childNodes]);let s=[];for(let d=0;d<t.length;d++){const u=t[d];u.nodeType===8&&u.data.slice(0,2)==="!$"?u.remove():s.push(u)}t=s}for(;typeof t=="function";)t=t();if(n===t)return t;const i=typeof n,l=r!==void 0;if(e=l&&t[0]&&t[0].parentNode||e,i==="string"||i==="number"){if(a||i==="number"&&(n=n.toString(),n===t))return t;if(l){let s=t[0];s&&s.nodeType===3?s.data!==n&&(s.data=n):s=document.createTextNode(n),t=W(e,t,r,s)}else t!==""&&typeof t=="string"?t=e.firstChild.data=n:t=e.textContent=n}else if(n==null||i==="boolean"){if(a)return t;t=W(e,t,r)}else{if(i==="function")return c.createRenderEffect(()=>{let s=n();for(;typeof s=="function";)s=s();t=X(e,s,t,r)}),()=>t;if(Array.isArray(n)){const s=[],d=t&&Array.isArray(t);if(de(s,n,t,o))return c.createRenderEffect(()=>t=X(e,s,t,r,!0)),()=>t;if(a){if(!s.length)return t;if(r===void 0)return t=[...e.childNodes];let u=s[0];if(u.parentNode!==e)return t;const f=[u];for(;(u=u.nextSibling)!==r;)f.push(u);return t=f}if(s.length===0){if(t=W(e,t,r),l)return t}else d?t.length===0?Se(e,s,r):et(e,t,s):(t&&W(e),Se(e,s));t=s}else if(n.nodeType){if(a&&n.parentNode)return t=l?[n]:n;if(Array.isArray(t)){if(l)return t=W(e,t,r,n);W(e,t,null,n)}else t==null||t===""||!e.firstChild?e.appendChild(n):e.replaceChild(n,e.firstChild);t=n}}return t}function de(e,n,t,r){let o=!1;for(let a=0,i=n.length;a<i;a++){let l=n[a],s=t&&t[e.length],d;if(!(l==null||l===!0||l===!1))if((d=typeof l)=="object"&&l.nodeType)e.push(l);else if(Array.isArray(l))o=de(e,l,s)||o;else if(d==="function")if(r){for(;typeof l=="function";)l=l();o=de(e,Array.isArray(l)?l:[l],Array.isArray(s)?s:[s])||o}else e.push(l),o=!0;else{const u=String(l);s&&s.nodeType===3&&s.data===u?e.push(s):e.push(document.createTextNode(u))}}return o}function Se(e,n,t=null){for(let r=0,o=n.length;r<o;r++)e.insertBefore(n[r],t)}function W(e,n,t,r){if(t===void 0)return e.textContent="";const o=r||document.createTextNode("");if(n.length){let a=!1;for(let i=n.length-1;i>=0;i--){const l=n[i];if(o!==l){const s=l.parentNode===e;!a&&!i?s?e.replaceChild(o,l):e.insertBefore(o,t):s&&l.remove()}else a=!0}}else e.insertBefore(o,t);return[o]}const st="http://www.w3.org/2000/svg";function lt(e,n=!1){return n?document.createElementNS(st,e):document.createElement(e)}function dt(e){const{useShadow:n}=e,t=document.createTextNode(""),r=()=>e.mount||document.body,o=c.getOwner();let a,i=!!c.sharedConfig.context;return c.createEffect(()=>{i&&(c.getOwner().user=i=!1),a||(a=c.runWithOwner(o,()=>c.createMemo(()=>e.children)));const l=r();if(l instanceof HTMLHeadElement){const[s,d]=c.createSignal(!1),u=()=>d(!0);c.createRoot(f=>v(l,()=>s()?f():a(),null)),c.onCleanup(u)}else{const s=lt(e.isSVG?"g":"div",e.isSVG),d=n&&s.attachShadow?s.attachShadow({mode:"open"}):s;Object.defineProperty(s,"_$host",{get(){return t.parentNode},configurable:!0}),v(d,a),l.appendChild(s),e.ref&&e.ref(s),c.onCleanup(()=>l.removeChild(s))}},void 0,{render:!i}),t}const ut=5e3,ht=e=>{let n=null;const t=()=>{n!==null&&(window.clearTimeout(n),n=null)};return{show:r=>{t(),e.setState({notification:{...r,show:!0}}),n=window.setTimeout(()=>{e.setState({notification:{...r,show:!1}}),n=null},ut)},clear:()=>{t(),e.setState({notification:{show:!1,type:null,message:null}})}}},Ee=(e,n)=>{if(!n)return e;const t={...e};for(const r in n)n[r]&&typeof n[r]=="object"&&!Array.isArray(n[r])?t[r]=Ee(e[r],n[r]):t[r]=n[r];return t},ft=(e,n)=>{let t;return(...r)=>{clearTimeout(t),t=window.setTimeout(()=>e(...r),n)}},gt="echo_",q="echo-pages",$e=e=>{if(!e||e==="/")return"/";const n=e.split("/");return n.length<=4?e:`/${n[1]}/.../${n[n.length-1]}`},Pe=()=>{window.dispatchEvent(new Event("echo-storage-change"))},ze=e=>`${gt}${e}`,V=(e,n)=>{try{const t=localStorage.getItem(ze(e));return t?JSON.parse(t):n}catch{return n}},K=(e,n)=>{try{localStorage.setItem(ze(e),JSON.stringify(n))}catch(t){console.warn("Failed to save to localStorage:",t)}},ue=()=>{const e=window.location.pathname||"/",n=window.location.search;return`${e}${n}`},mt=(e,n)=>{try{if(!n.feedback.hasUserInteracted&&n.drawing.shapes.length<1)return;const t={message:n.feedback.message,customInputValues:n.feedback.customInputValues},r=V(q,{}),o=$e(e);(t||n.drawing.shapes.length>0)&&(r[o]={...r[o]||{},...t?{feedback:t}:{},drawing:{shapes:n.drawing.shapes}}),K(q,r),Pe()}catch(t){console.warn("Failed to save page state:",t)}},he=e=>{try{return V(q,{})[e]}catch(n){console.error("Failed to load page state:",n);return}},Te=e=>{try{const n=V(q,{});delete n[e],K(q,n),Pe()}catch(n){console.error("Failed to clear page state:",n)}},Oe=()=>{try{const e=V(q,{});return Object.keys(e).length}catch(e){return console.error("Failed to get stored pages count:",e),0}},fe=()=>{try{const e=V(q,{});return Object.entries(e).map(([n,t])=>({path:$e(n),state:t}))}catch(e){return console.error("Failed to get stored pages:",e),[]}},vt=e=>ft((n,t,r=!1)=>{(!r||t.feedback.message.trim().length>0||t.drawing.shapes.length>0)&&(mt(n,t),e.setState({pagesCount:Oe()}))},1e3),ge=Symbol("store-raw"),Y=Symbol("store-node"),M=Symbol("store-has"),Ie=Symbol("store-self");function Me(e){let n=e[c.$PROXY];if(!n&&(Object.defineProperty(e,c.$PROXY,{value:n=new Proxy(e,pt)}),!Array.isArray(e))){const t=Object.keys(e),r=Object.getOwnPropertyDescriptors(e);for(let o=0,a=t.length;o<a;o++){const i=t[o];r[i].get&&Object.defineProperty(e,i,{enumerable:r[i].enumerable,get:r[i].get.bind(n)})}}return n}function ne(e){let n;return e!=null&&typeof e=="object"&&(e[c.$PROXY]||!(n=Object.getPrototypeOf(e))||n===Object.prototype||Array.isArray(e))}function G(e,n=new Set){let t,r,o,a;if(t=e!=null&&e[ge])return t;if(!ne(e)||n.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):n.add(e);for(let i=0,l=e.length;i<l;i++)o=e[i],(r=G(o,n))!==o&&(e[i]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):n.add(e);const i=Object.keys(e),l=Object.getOwnPropertyDescriptors(e);for(let s=0,d=i.length;s<d;s++)a=i[s],!l[a].get&&(o=e[a],(r=G(o,n))!==o&&(e[a]=r))}return e}function re(e,n){let t=e[n];return t||Object.defineProperty(e,n,{value:t=Object.create(null)}),t}function Z(e,n,t){if(e[n])return e[n];const[r,o]=c.createSignal(t,{equals:!1,internal:!0});return r.$=o,e[n]=r}function wt(e,n){const t=Reflect.getOwnPropertyDescriptor(e,n);return!t||t.get||!t.configurable||n===c.$PROXY||n===Y||(delete t.value,delete t.writable,t.get=()=>e[c.$PROXY][n]),t}function Ae(e){c.getListener()&&Z(re(e,Y),Ie)()}function bt(e){return Ae(e),Reflect.ownKeys(e)}const pt={get(e,n,t){if(n===ge)return e;if(n===c.$PROXY)return t;if(n===c.$TRACK)return Ae(e),t;const r=re(e,Y),o=r[n];let a=o?o():e[n];if(n===Y||n===M||n==="__proto__")return a;if(!o){const i=Object.getOwnPropertyDescriptor(e,n);c.getListener()&&(typeof a!="function"||e.hasOwnProperty(n))&&!(i&&i.get)&&(a=Z(r,n,a)())}return ne(a)?Me(a):a},has(e,n){return n===ge||n===c.$PROXY||n===c.$TRACK||n===Y||n===M||n==="__proto__"?!0:(c.getListener()&&Z(re(e,M),n)(),n in e)},set(){return!0},deleteProperty(){return!0},ownKeys:bt,getOwnPropertyDescriptor:wt};function ae(e,n,t,r=!1){if(!r&&e[n]===t)return;const o=e[n],a=e.length;t===void 0?(delete e[n],e[M]&&e[M][n]&&o!==void 0&&e[M][n].$()):(e[n]=t,e[M]&&e[M][n]&&o===void 0&&e[M][n].$());let i=re(e,Y),l;if((l=Z(i,n,o))&&l.$(()=>t),Array.isArray(e)&&e.length!==a){for(let s=e.length;s<a;s++)(l=i[s])&&l.$();(l=Z(i,"length",a))&&l.$(e.length)}(l=i[Ie])&&l.$()}function De(e,n){const t=Object.keys(n);for(let r=0;r<t.length;r+=1){const o=t[r];ae(e,o,n[o])}}function yt(e,n){if(typeof n=="function"&&(n=n(e)),n=G(n),Array.isArray(n)){if(e===n)return;let t=0,r=n.length;for(;t<r;t++){const o=n[t];e[t]!==o&&ae(e,t,o)}ae(e,"length",r)}else De(e,n)}function Q(e,n,t=[]){let r,o=e;if(n.length>1){r=n.shift();const i=typeof r,l=Array.isArray(e);if(Array.isArray(r)){for(let s=0;s<r.length;s++)Q(e,[r[s]].concat(n),t);return}else if(l&&i==="function"){for(let s=0;s<e.length;s++)r(e[s],s)&&Q(e,[s].concat(n),t);return}else if(l&&i==="object"){const{from:s=0,to:d=e.length-1,by:u=1}=r;for(let f=s;f<=d;f+=u)Q(e,[f].concat(n),t);return}else if(n.length>1){Q(e[r],n,[r].concat(t));return}o=e[r],t=[r].concat(t)}let a=n[0];typeof a=="function"&&(a=a(o,t),a===o)||r===void 0&&a==null||(a=G(a),r===void 0||ne(o)&&ne(a)&&!Array.isArray(a)?De(o,a):ae(e,r,a))}function me(...[e,n]){const t=G(e||{}),r=Array.isArray(t),o=Me(t);function a(...i){c.batch(()=>{r&&i.length===1?yt(t,i[0]):Q(t,i)})}return[o,a]}const F={rectangle:{id:"rectangle",label:"Highlight",getCursor:()=>"crosshair",strokeWidth:2,opacity:{selected:1,default:1}},path:{id:"path",label:"Pen",getCursor:e=>`url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none" stroke="${e.replace("#","%23")}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="24" cy="24" r="8"/></svg>') 24 24, auto`,strokeWidth:6,opacity:{selected:.6,default:1}}},xt=e=>{const n=e.replace("#",""),t=Number.parseInt(n.slice(0,2),16)/255,r=Number.parseInt(n.slice(2,2),16)/255,o=Number.parseInt(n.slice(4,2),16)/255;return .2126*t+.7152*r+.0722*o},kt=e=>xt(e)<.5?"#FFFFFF":"#000000";let A=[],T=null,_=null,H=null;const ve=(e,n)=>(...t)=>{const r=a=>{if(typeof a=="string")return a;if(a instanceof Error)return a.stack||a.message;try{const i=new WeakSet;return JSON.stringify(a,(s,d)=>{if(typeof d=="object"&&d!==null){if(d instanceof Node)return`[${d.nodeName} Element]`;if(i.has(d))return"[Circular Reference]";i.add(d)}return d})}catch{return"[Unable to stringify value]"}},o=t.map(r).join(" ");A.push({type:e,message:o,timestamp:new Date().toISOString()}),A.length>1e3&&(A=A.slice(-1e3)),n.apply(console,t)},Ct=()=>{T||(T={log:console.log,warn:console.warn,error:console.error},_=window.onerror,H=window.onunhandledrejection,window.onerror=(e,n,t,r,o)=>{const a=(o==null?void 0:o.stack)||(o==null?void 0:o.message)||e;return A.push({type:"error",message:`Uncaught Error: ${a}
2
+ Location: ${n}:${t}:${r}`,timestamp:new Date().toISOString()}),_?_(e,n,t,r,o):!1},window.onunhandledrejection=e=>{const n=e.reason;A.push({type:"error",message:`Unhandled Promise Rejection: ${(n==null?void 0:n.stack)||(n==null?void 0:n.message)||n}`,timestamp:new Date().toISOString()}),H&&H(e)},console.log=ve("log",T.log),console.warn=ve("warn",T.warn),console.error=ve("error",T.error),window.addEventListener("error",e=>{const{message:n,filename:t,lineno:r,colno:o,error:a}=e,i=(a==null?void 0:a.stack)||(a==null?void 0:a.message)||n;A.push({type:"error",message:`Uncaught Error: ${i}
3
+ Location: ${t}:${r}:${o}`,timestamp:new Date().toISOString()})}))},St=()=>{T&&(console.log=T.log,console.warn=T.warn,console.error=T.error,T=null),_&&(window.onerror=_,_=null),H&&(window.onunhandledrejection=H,H=null),window.removeEventListener("error",()=>{}),A=[]},Et=()=>[...A],$t=()=>{var e;return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||((e=window.matchMedia)==null?void 0:e.call(window,"(max-width: 768px)").matches)},oe=(e,{useClientCoords:n=!1}={})=>{const r=typeof TouchEvent<"u"&&e instanceof TouchEvent?e.touches[0]:null;return{x:r?n?r.clientX:r.pageX:n?e.clientX:e.pageX,y:r?n?r.clientY:r.pageY:n?e.clientY:e.pageY}},Re=(e,n)=>{const t=n.x-e.x,r=n.y-e.y;return Math.sqrt(t*t+r*r)},Fe=e=>{if(e.length!==2)return null;const[n,t]=e;return{x:Math.min(n.x,t.x),y:Math.min(n.y,t.y),width:Math.abs(t.x-n.x),height:Math.abs(t.y-n.y)}},Pt=e=>e.length<2?null:`M ${e[0].x} ${e[0].y} ${e.slice(1).map(n=>`L ${n.x} ${n.y}`).join(" ")}`,we=window.EventTarget.prototype.addEventListener,ie=window.EventTarget.prototype.removeEventListener;let ce=!1;const zt=(e,n,t,r)=>{we.call(e,n,t,r)},Tt=(e,n,t,r)=>{ie.call(e,n,t,r)},J=new WeakMap,Ot=e=>{ce||(ce=!0,window.EventTarget.prototype.addEventListener=function(n,t,r){const o=Mt(t,e);J.has(this)||J.set(this,new WeakMap),J.get(this).set(t,o),we.call(this,n,o,r)},window.EventTarget.prototype.removeEventListener=function(n,t,r){var a,i;const o=(a=J.get(this))==null?void 0:a.get(t);o?(ie.call(this,n,o,r),(i=J.get(this))==null||i.delete(t)):ie.call(this,n,t,r)})},It=()=>{ce&&(window.EventTarget.prototype.addEventListener=we,window.EventTarget.prototype.removeEventListener=ie,ce=!1)},O=e=>{const{event:n,callback:t,onMount:r,onCleanup:o,useOriginal:a=!0}=e;c.onMount(()=>{r==null||r(),a?zt(window,n,t):window.addEventListener(n,t)}),c.onCleanup(()=>{o==null||o(),a?Tt(window,n,t):window.removeEventListener(n,t)})},be=e=>{const{target:n,options:t,callback:r,onMount:o,onCleanup:a}=e,i=new MutationObserver(r);c.onMount(()=>{o==null||o(),i.observe(n,t)}),c.onCleanup(()=>{a==null||a(),i.disconnect()})},Mt=(e,n)=>function(t){n(t),typeof e=="function"?e.call(this,t):e.handleEvent(t)},At=e=>e.hasAttribute("data-hide-when-drawing"),Dt=async()=>{var e;try{const n=document.createElement("style");document.head.appendChild(n),(e=n.sheet)==null||e.insertRule("body > div:last-child img { display: inline-block; }");const t=await He(document.body,{logging:!1,useCORS:!0,scale:window.devicePixelRatio,allowTaint:!0,ignoreElements:r=>At(r)});return n.remove(),t.toDataURL("image/png")}catch(n){console.error("Failed to capture screenshot:",n);return}},Rt=(e,n,t)=>{let r=`M0 0 H${e.width} V${e.height} H0 Z`;if(n.length===2){const[o,a]=n;r+=` M${o.x} ${o.y} h${a.x-o.x} v${a.y-o.y} h${o.x-a.x} v${o.y-a.y}`}for(const o of t)if(o.type==="rectangle"){const[a,i]=o.points;r+=` M${a.x} ${a.y} h${i.x-a.x} v${i.y-a.y} h${a.x-i.x} v${a.y-i.y}`}return r},Ft=e=>{if(typeof e!="object"||e===null)throw new Error("Echo initialization failed: options must be an object");if(typeof e.onSubmit!="function")throw new Error("Echo initialization failed: onSubmit must be a function");if(e.primaryColor&&!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(e.primaryColor))throw new Error("Echo initialization failed: primaryColor must be a valid hex color")},Le=5,je=(e,n)=>F[e].getCursor(n),Lt=(e,n,t)=>{var l,s;const[r,o]=me({isDrawing:!1,currentPoints:[],selectedShapeId:null,selectedTool:"rectangle",showTooltip:!0,mousePosition:{x:0,y:0},selectedColor:e.primaryColor,shapes:((s=(l=he(n))==null?void 0:l.drawing)==null?void 0:s.shapes)||[],hasDrawn:!1,isDragging:!1,dragStartPos:null,initialClickPos:null,dragOffset:null,cursor:je("rectangle",e.primaryColor)}),a=(d,u=!1)=>{if(d.selectedTool||d.selectedColor){const f=d.selectedTool||r.selectedTool,g=d.selectedColor||r.selectedColor;d.cursor=je(f,g)}o(d),t==null||t(d,u)},i={startDrawing:d=>{a({isDrawing:!0,currentPoints:[d],selectedShapeId:null})},updateDrawing:d=>{r.selectedTool==="rectangle"?a({currentPoints:[r.currentPoints[0],d]}):r.selectedTool==="path"&&a({currentPoints:[...r.currentPoints,d]})},finishDrawing:()=>{if(r.currentPoints.length>=2){const d={id:Math.random().toString(36).substring(2),type:r.selectedTool,color:r.selectedColor,points:r.currentPoints};a({shapes:[...r.shapes,d]})}a({isDrawing:!1,currentPoints:[]})},handleShapeClick:d=>{},handleStart:d=>{if(d instanceof MouseEvent){const f=d.target;if(!f.classList.contains("echo-drawing-layer-mask")&&!f.classList.contains("echo-shape"))return}const u=oe(d);if(d.target instanceof SVGElement&&d.target.classList.contains("echo-shape")){const f=d.target.dataset.shapeId;if(f&&r.selectedShapeId===f){const g=r.shapes.find(m=>m.id===f);if(g){i.startDrag(u),i.updateDragOffset(g,u);return}}}i.setInitialClick(u)},handleMove:d=>{const u=oe(d,{useClientCoords:!0}),f=oe(d);if(a({mousePosition:u}),r.isDragging&&r.selectedShapeId&&r.dragStartPos&&r.shapes.find(m=>m.id===r.selectedShapeId)){const m=f.x-r.dragStartPos.x,b=f.y-r.dragStartPos.y,y=r.shapes.map(C=>C.id===r.selectedShapeId?{...C,points:C.points.map(S=>({x:S.x+m,y:S.y+b}))}:C);a({shapes:y}),i.startDrag(f);return}if(r.initialClickPos&&!r.isDrawing){Re(r.initialClickPos,f)>=Le&&i.startDrawing(r.initialClickPos);return}r.isDrawing&&i.updateDrawing(f)},handleEnd:d=>{if(r.isDragging){i.stopDrag();return}if(r.initialClickPos&&!r.isDrawing){const u=oe(d);if(Re(r.initialClickPos,u)<Le&&d.target instanceof SVGElement&&d.target.classList.contains("echo-shape")){const g=d.target.dataset.shapeId;g&&a({selectedShapeId:g})}}i.setInitialClick(null),i.finishDrawing()},handleEnter:d=>{d.target===d.currentTarget&&!r.hasDrawn&&a({showTooltip:!0})},handleLeave:d=>{d.target===d.currentTarget&&a({showTooltip:!1})},startDrag:d=>{a({isDragging:!0,dragStartPos:d})},stopDrag:()=>{a({isDragging:!1,dragStartPos:null,dragOffset:null})},setInitialClick:d=>{a({initialClickPos:d})},updateDragOffset:(d,u)=>{a({dragOffset:{x:u.x-d.points[0].x,y:u.y-d.points[0].y}})}};return{state:r,setState:a,methods:i}},jt=(e,n,t,r)=>{var f;const o=(r==null?void 0:r.reduce((g,m)=>(g[m.id]=m.defaultValue??(m.type==="checkbox"?[]:""),g),{}))||{},a=he(n),i=(a==null?void 0:a.feedback.customInputValues)||{},l={...o,...i},[s,d]=me({message:((f=a==null?void 0:a.feedback)==null?void 0:f.message)||"",screenshot:void 0,isCapturing:!1,isMinimized:!1,customInputValues:l,hasUserInteracted:!1});return{state:s,setState:(g,m=!1)=>{const b="isCapturing"in g||"isMinimized"in g||m;!b&&!s.hasUserInteracted&&d({hasUserInteracted:!0}),d(g),(s.hasUserInteracted||b)&&(t==null||t(g,m))}}},Nt=(e,n)=>{const[t,r]=me({text:e.textConfig,isOpen:!1,primaryColor:e.primaryColor,notification:{show:!1,type:null,message:null},dimensions:{width:document.documentElement.clientWidth,height:document.documentElement.scrollHeight},isStoredFeedbackOpen:!1,pagesCount:Oe(),welcomeMessageIsClosing:!1,position:e.position,customInputs:e.customInputs});return{state:t,setState:r}},Ne=e=>{var n;return((n=e.customInputs)==null?void 0:n.reduce((t,r)=>(t[r.id]=r.defaultValue??(r.type==="checkbox"?[]:""),t),{}))||{}},qt=e=>{let n=ue();const t=Nt(e),r=vt(t),o=ht(t),a=jt(e,n,(d,u)=>{r(n,{feedback:{...a.state,...d},drawing:i.state},u)},e.customInputs),i=Lt(e,n,(d,u)=>{r(n,{feedback:a.state,drawing:{...i.state,...d}},u)}),l=d=>{n=d;const u=he(n),f={...Ne(e),...u==null?void 0:u.feedback.customInputValues};a.setState({message:(u==null?void 0:u.feedback.message)||"",customInputValues:f,hasUserInteracted:!1}),i.setState({shapes:(u==null?void 0:u.drawing.shapes)||[]})},s=()=>{Te(n);const d={feedback:{message:"",screenshot:void 0,isCapturing:!1,isMinimized:!1,hasUserInteracted:!1,customInputValues:Ne(e)},drawing:{isDrawing:!1,currentPoints:[],shapes:[],selectedShapeId:null,selectedTool:"rectangle",selectedColor:e.primaryColor,showTooltip:!0,mousePosition:{x:0,y:0},hasDrawn:!1,isDragging:!1,dragStartPos:null,initialClickPos:null,dragOffset:null,cursor:i.state.cursor},widget:{isOpen:!1}};a.setState(d.feedback,!0),i.setState(d.drawing,!0),t.setState(d.widget)};return{feedback:a,drawing:i,widget:t,methods:{reset:s,handlePageChange:l,submit:async d=>{t.setState({isOpen:!1});try{const u=await e.onSubmit(d);return u instanceof Response&&!u.ok?(o.show({type:"error",message:"Submission failed"}),u):(s(),o.show({type:"success",message:"Feedback submitted"}),u)}catch{o.show({type:"error",message:"Submission failed"})}}}}},qe=c.createContext(),Vt=e=>{const n=qt({primaryColor:e.primaryColor,onSubmit:e.onSubmit,textConfig:e.textConfig,position:e.position,customInputs:e.customInputs});return c.createComponent(qe.Provider,{value:n,get children(){return e.children}})},k=()=>{const e=c.useContext(qe);if(!e)throw new Error("useEchoStore must be used within EchoProvider");return e},Bt=e=>{const[n,t]=c.createSignal({width:document.documentElement.clientWidth,height:document.documentElement.scrollHeight}),r=()=>{requestAnimationFrame(()=>{const o=e();o&&(o.style.height="0px",o.style.height=`${document.documentElement.scrollHeight}px`,t({width:document.documentElement.clientWidth,height:document.documentElement.scrollHeight}))})};return O({event:"resize",callback:r,onMount:r}),be({target:document.documentElement,options:{childList:!0,subtree:!0,attributes:!0},callback:r}),n},Wt=({onUrlChange:e})=>{let n=ue();const t=()=>{const r=ue();r!==n&&(n=r,e(r))};O({event:"popstate",callback:t}),O({event:"pushstate",callback:t}),O({event:"replacestate",callback:t}),be({target:document.documentElement,options:{childList:!0,subtree:!0},callback:t})},Yt=`*,*:before,*:after{box-sizing:border-box}.echo-root{position:absolute;top:0;left:0;z-index:var(--z-root);isolation:isolate;pointer-events:none;--z-root: 999999;--z-launcher: 2;--z-overlay: 1;--z-drawing-toolbar: 3;--z-drawing-tooltip: 3;--z-shape-actions: 3;--z-notification: 2;--z-welcome-message: 2;--z-widget-button: 2;--z-feedback-form: 4;--primary-color: #000;--primary-text-color: #fff;--error-color: #f44336;--success-color: var(--primary-color);--text-dark: #1a1a1a;--text-medium: #333;--text-light: #666;--text-lighter: #999;--border-color: rgba(0, 0, 0, .1);--border-color-light: rgba(0, 0, 0, .05);--border-color-medium: rgba(0, 0, 0, .08);--primary-color-lighter: color-mix(in srgb, var(--primary-color) 100%, white 40%);--primary-color-lightest: color-mix(in srgb, var(--primary-color) 7%, white 100%);--hover-color: color-mix(in srgb, var(--primary-color) 80%, #fff);--shadow-color-dark: rgba(0, 0, 0, .6);--shadow-color-light: rgba(255, 255, 255, .1);--shadow-color-medium: rgba(0, 0, 0, .2);--shadow-sm: 0 1px 3px;--shadow-md: 0 4px 10px;--shadow-lg: 0 10px 20px;--shadow-black-sm: var(--shadow-sm) rgba(0, 0, 0, .5);--shadow-black-md: var(--shadow-md) rgba(0, 0, 0, .5);--shadow-black-lg: var(--shadow-lg) rgba(0, 0, 0, .5);--shadow-black-lightened-sm: var(--shadow-sm) var(--shadow-color-medium);--shadow-black-lightened-md: var(--shadow-md) var(--shadow-color-medium);--shadow-black-lightened-lg: var(--shadow-lg) var(--shadow-color-medium);--shadow-primary-sm: var(--shadow-sm) color-mix(in srgb, var(--primary-color) 60%, transparent 80%);--shadow-primary-md: var(--shadow-md) color-mix(in srgb, var(--primary-color) 50%, transparent 80%);--shadow-primary-lg: var(--shadow-lg) color-mix(in srgb, var(--primary-color) 40%, transparent 80%);--shadow-primary-lighter-sm: var(--shadow-sm) color-mix(in srgb, var(--primary-color-lighter) 70%, transparent 80%);--shadow-primary-lighter-md: var(--shadow-md) color-mix(in srgb, var(--primary-color-lighter) 60%, transparent 80%);--shadow-primary-lighter-lg: var(--shadow-lg) color-mix(in srgb, var(--primary-color-lighter) 50%, transparent 80%);--shadow-primary-lightest-sm: var(--shadow-sm) color-mix(in srgb, var(--primary-color-lightest) 70%, transparent 80%);--shadow-primary-lightest-md: var(--shadow-md) color-mix(in srgb, var(--primary-color-lightest) 60%, transparent 80%);--shadow-primary-lightest-lg: var(--shadow-lg) color-mix(in srgb, var(--primary-color-lightest) 50%, transparent 80%);--shadow-combined-sm: var(--shadow-primary-sm), var(--shadow-black-lightened-sm);--shadow-combined-md: var(--shadow-primary-md), var(--shadow-black-lightened-md);--shadow-combined-lg: var(--shadow-primary-lg), var(--shadow-black-lightened-lg);--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 12px;--spacing-lg: 16px;--spacing-xl: 20px;--spacing-2xl: 24px;--spacing-3xl: 32px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-full: 9999px;--font-xs: .8125rem;--font-sm: .875rem;--font-base: .9375rem;--font-md: 1rem;--font-lg: 1.125rem;--duration-fast: .1s;--duration-base: .2s;--duration-slow: .3s;--duration-slower: .4s;--duration-slowest: .6s;--ease-default: ease;--ease-in-out: ease-in-out;--ease-bounce: cubic-bezier(.34, 1.56, .64, 1);--ease-smooth: cubic-bezier(.4, 0, .2, 1);--ease-spring: cubic-bezier(.16, 1, .3, 1)}.echo-stored-feedback{position:absolute;display:flex;flex-direction:column;bottom:calc(100% + var(--spacing-lg));right:0;width:320px;background:#fff;border-radius:var(--radius-lg);box-shadow:var(--shadow-black-lightened-lg);animation:slideUpFade var(--duration-base) var(--ease-smooth);z-index:calc(var(--z-widget-button) + 1);transform-origin:bottom right;transition:all var(--duration-base) var(--ease-smooth)}.echo-stored-feedback-header{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-md) var(--spacing-lg)}.echo-stored-feedback-header h3{margin:0;font-size:var(--font-md);font-weight:600}.echo-stored-feedback-list{max-height:400px;overflow-y:auto;border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.echo-stored-feedback-item{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-md) var(--spacing-lg);border-bottom:1px solid var(--border-color-light);transition:all var(--duration-base) var(--ease-smooth);background:#fff;position:relative}.echo-stored-feedback-item:hover{background:var(--primary-color-lightest)}.echo-stored-feedback-item-current{background:var(--primary-color-lightest);padding-left:calc(var(--spacing-lg) - 3px)}.echo-stored-feedback-item-current:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--primary-color);border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.echo-stored-feedback-item:last-child{border-bottom:none;border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.echo-stored-feedback-item:last-child.echo-stored-feedback-item-current:before{border-bottom-left-radius:var(--radius-lg)}.echo-stored-feedback-content{flex:1;min-width:0;margin-right:var(--spacing-md)}.echo-stored-feedback-path{font-size:var(--font-sm);font-weight:500;color:var(--text-medium);margin-bottom:var(--spacing-xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.echo-stored-feedback-preview{font-size:var(--font-xs);color:var(--text-light);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.echo-stored-feedback-actions{display:flex;align-items:center;gap:var(--spacing-sm)}.echo-stored-feedback-link{color:var(--text-light)}.echo-stored-feedback-link:hover{color:var(--primary-color)}.echo-stored-feedback-delete{color:var(--text-light);font-size:var(--font-xs);padding:var(--spacing-xs) var(--spacing-md)}.echo-stored-feedback-delete:hover{color:var(--error-color);background:color-mix(in srgb,var(--error-color) 10%,transparent)}.echo-stored-feedback-empty{padding:var(--spacing-3xl) var(--spacing-lg);text-align:center;color:var(--text-light);font-size:var(--font-sm);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.echo-launcher{position:fixed;z-index:var(--z-launcher);bottom:var(--spacing-xl);right:var(--spacing-xl)}.echo-overlay{position:absolute;top:0;left:0;margin:0;padding:0;max-width:none;max-height:none;border:3px solid var(--primary-color);background:transparent}.echo-overlay::backdrop{background:transparent}[data-hidden=true],[data-hidden=false]{transition:opacity var(--duration-slow) var(--ease-in-out),visibility var(--duration-slow) var(--ease-in-out)}[data-hidden=true]{opacity:0;visibility:hidden;pointer-events:none}[data-hidden=false]{opacity:1;visibility:visible;pointer-events:auto;user-select:none;-webkit-user-select:none}.echo-launcher-button{z-index:var(--z-widget-button);position:relative;display:flex;align-items:center;justify-content:center;cursor:pointer;background:radial-gradient(circle at 40% 40%,var(--primary-color) 0%,var(--primary-color-lighter) 65%,var(--primary-color-lighter) 100%);border:none;border-radius:var(--radius-full);width:48px;height:48px;box-shadow:var(--shadow-black-md);transition:all var(--duration-slow) var(--ease-default),left var(--duration-slower) var(--ease-smooth),opacity var(--duration-slow) var(--ease-in-out)}.echo-launcher-button:hover{box-shadow:var(--shadow-black-lg);transform:translateY(-2px)}.echo-launcher-button:active{transform:scale(.95)}.echo-launcher-button-count{position:absolute;top:calc(-1 * var(--spacing-xs));right:calc(-1 * var(--spacing-xs));background:var(--primary-color-lightest);color:var(--primary-color-lighter);border-radius:var(--radius-md);min-width:20px;height:20px;display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-black-sm);padding:0 var(--spacing-xs);font-weight:600;pointer-events:auto;cursor:pointer;transform-origin:center center;animation:popIn var(--duration-slow) var(--ease-bounce);transition:transform var(--duration-base) var(--ease-default)}.echo-launcher-button-count:hover{transform:scale(1.1)}.echo-feedback{position:fixed;bottom:var(--spacing-xl);right:var(--spacing-xl);width:min(calc(100vw - var(--spacing-2xl)),24rem);z-index:var(--z-feedback-form);box-shadow:var(--shadow-black-lightened-lg);display:flex;flex-direction:column;gap:var(--spacing-lg);background:#fff;border-radius:var(--radius-lg);will-change:transform;padding:var(--spacing-lg)}.echo-feedback[data-minimized=true]{transition:transform .4s var(--ease-default),box-shadow .4s var(--ease-default);transform:translate(calc(100% - 48px),calc(100% - 48px));box-shadow:0 8px 16px #0003}.echo-feedback[data-minimized=true]:hover{cursor:pointer;transform:translate(calc(100% - 48px),calc(100% - 48px)) rotate(-2deg) scale(1.1);box-shadow:0 12px 24px #00000040}.echo-feedback[data-minimized=false]{transition:transform .4s var(--ease-smooth),box-shadow .4s var(--ease-smooth);transform:translate(0)}.echo-feedback[style*=transition]{pointer-events:none}.echo-feedback-content{display:flex;flex-direction:column;gap:var(--spacing-lg)}.echo-feedback-header{display:flex;justify-content:space-between;align-items:center}.echo-feedback-title{font-size:var(--font-lg);font-weight:600;color:var(--text-dark);margin:0}.echo-feedback-header-actions{display:flex;gap:var(--spacing-xs);margin:calc(-1 * var(--spacing-sm)) calc(-1 * var(--spacing-sm)) calc(-1 * var(--spacing-sm)) 0}.echo-feedback-form-textarea{width:100%;padding:.5rem;border:1px solid var(--border-color);border-radius:var(--radius-md);background-color:#fff;color:var(--text-medium);font-size:var(--font-sm);transition:all var(--duration-base) var(--ease-default);min-height:120px;resize:vertical;font-family:inherit}.echo-feedback-form-textarea:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 15%,transparent)}.echo-feedback-form-textarea::placeholder{color:var(--text-lighter)}[data-hide-when-drawing=true]{opacity:1;visibility:visible;transition:opacity .3s ease-in-out,visibility .3s ease-in-out}[data-drawing=true] [data-hide-when-drawing=true]{opacity:0;visibility:hidden;pointer-events:none;user-select:none;-webkit-user-select:none}.echo-drawing-layer,.echo-drawing-layer-container{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;user-select:none;-webkit-user-select:none}.echo-drawing-layer-container svg{pointer-events:auto}.echo-drawing-toolbar{position:fixed;top:var(--spacing-xl);left:var(--spacing-xl);display:flex;flex-direction:column;gap:var(--spacing-sm);z-index:var(--z-drawing-toolbar);opacity:1;transition:opacity var(--duration-base) var(--ease-default)}.echo-drawing-toolbar-button{width:50px;height:50px;border-radius:var(--radius-full);border:2px solid #ddd;background:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:all var(--duration-base) var(--ease-default);box-shadow:var(--shadow-black-sm);position:relative}.echo-drawing-toolbar-icon{width:25px;height:25px;color:var(--primary-color);transition:color var(--duration-base) var(--ease-default)}.echo-drawing-toolbar-button:hover{transform:scale(1.05);border-color:var(--hover-color)}.echo-drawing-toolbar-button[data-selected=true]{background:var(--primary-color-lightest);border-color:var(--primary-color)}.echo-color-selector{position:relative}.echo-color-selector:hover .echo-drawing-toolbar-button{border-top-right-radius:0;border-bottom-right-radius:0;transform:scale(1.05);border-right-color:transparent;background:rgba(var(--primary-color),.9);border-color:var(--hover-color)}.echo-color-swatch-wrapper{position:absolute;left:calc(100% - 2px);top:50%;transform:translateY(-50%);height:52.5px;padding-right:var(--spacing-sm);display:none}.echo-color-selector:hover .echo-color-swatch-wrapper{display:block}.echo-color-swatch{height:100%;background:#fff;border-radius:var(--radius-md);border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--spacing-sm);padding-left:var(--spacing-md);box-shadow:var(--shadow-black-sm);display:flex;align-items:center;gap:var(--spacing-sm);border:2px solid #ddd;border-left:none}.echo-color-selector:hover .echo-color-swatch{border-color:var(--hover-color)}.echo-color-swatch-button{width:24px;height:24px;border-radius:var(--radius-full);border:2px solid transparent;cursor:pointer;padding:0;transition:transform var(--duration-base) var(--ease-default)}.echo-color-swatch-button:hover{transform:scale(1.1)}.echo-color-swatch-button[data-selected=true]{border-color:var(--primary-color)}.echo-drawing-tooltip{display:flex;text-wrap:nowrap;position:fixed;background:#fff;padding:var(--spacing-sm) var(--spacing-lg);border-radius:var(--radius-lg);box-shadow:var(--shadow-combined-sm);font-size:var(--font-sm);color:var(--primary-color);z-index:var(--z-drawing-tooltip);pointer-events:none;animation:slideDownFade var(--duration-slow) var(--ease-default);border:1px solid var(--primary-color);background:var(--primary-color-lightest)}.echo-shape-actions{position:fixed;z-index:var(--z-shape-actions);display:flex;gap:var(--spacing-xs);background:#fff;border-radius:var(--radius-lg);box-shadow:var(--shadow-combined-md);transform:translate(-50%,-100%) translateY(calc(-1 * var(--spacing-sm)));animation:popInSlideDown var(--duration-fast) var(--ease-default);cursor:default;pointer-events:auto;padding:var(--spacing-xs);border:1px solid var(--primary-color)}.echo-shape-actions-divider{width:1px;margin:var(--spacing-sm) 0;background:var(--border-color);pointer-events:none}.echo-shape-actions[hidden]{display:none}.echo-notification{position:absolute;z-index:var(--z-notification);bottom:70px;right:0;width:300px;padding:var(--spacing-2xl);border-radius:var(--radius-lg);font-size:var(--font-md);font-weight:500;box-shadow:var(--shadow-combined-md);background:#fff;border:1px solid var(--primary-color);transform-origin:bottom right;display:flex;flex-direction:column;align-items:center;gap:var(--spacing-xl);opacity:1;pointer-events:auto;transition:all var(--duration-base) var(--ease-smooth)}.echo-notification:not([data-empty=true]){animation:popInSlideUp var(--duration-slower) var(--ease-spring)}.echo-notification[data-empty=true]{opacity:0;pointer-events:none;transform:translateY(var(--spacing-sm)) scale(.95);transition:none}.echo-notification-hide{position:absolute;top:var(--spacing-lg);right:var(--spacing-lg);width:24px;height:24px;padding:var(--spacing-xs);border:none;background:transparent;color:var(--text-light);opacity:.7;cursor:pointer;border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;transition:all var(--duration-base) var(--ease-bounce);flex-shrink:0}.echo-notification-hide:hover{opacity:1;background:var(--primary-color-lightest);transform:scale(1.1);color:var(--primary-color)}.echo-notification-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;transform:scale(1.5);background:var(--primary-color-lightest);padding:var(--spacing-md);border-radius:var(--radius-full);margin-top:var(--spacing-md);transition:all var(--duration-base) var(--ease-bounce)}.echo-notification[data-type=success]{border-color:var(--success-color)}.echo-notification[data-type=success] .echo-notification-icon{color:var(--success-color)}.echo-notification[data-type=error]{border-color:var(--error-color)}.echo-notification[data-type=error] .echo-notification-icon{color:var(--error-color);background:color-mix(in srgb,var(--error-color) 10%,white)}.echo-notification-content{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center;padding:0 12px}.echo-notification-title{font-size:1rem;font-weight:600;color:#1a1a1a}.echo-notification-message{font-size:.875rem;font-weight:400;color:#666;line-height:1.4;max-width:100%}@media (max-width: 768px){.echo-notification{right:0;width:calc(100vw - 40px);height:auto;min-height:180px;-webkit-backdrop-filter:none;backdrop-filter:none;font-size:.9375rem;padding:20px;gap:16px;bottom:calc(100% + 20px)}.echo-notification-icon{transform:scale(1.3);padding:10px;margin-top:8px}.echo-notification-title{font-size:.9375rem}.echo-notification-message{font-size:.8125rem}}.echo-welcome-message{display:flex;align-items:center;gap:var(--spacing-xs);position:fixed;z-index:var(--z-welcome-message);background:var(--primary-color-lightest);border:1px solid var(--primary-color);color:var(--primary-color);padding:var(--spacing-md) var(--spacing-lg);border-radius:var(--radius-lg);font-size:var(--font-sm);font-weight:500;box-shadow:var(--shadow-combined-md);opacity:1;transform:translateY(0) scale(1);transition:all var(--duration-slow) var(--ease-smooth);animation:bounceIn var(--duration-slowest) var(--ease-bounce);user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:pointer;text-align:left}.echo-welcome-message:hover{transform:translateY(-2px) scale(1.02);background:var(--primary-color-lightest);box-shadow:var(--shadow-combined-lg)}.echo-welcome-message:active{transform:translateY(0) scale(.98)}.echo-welcome-message-close{width:20px;height:20px;padding:2px;margin-left:var(--spacing-xs);border:none;background:transparent;opacity:.7;cursor:pointer;border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;transition:all var(--duration-base) var(--ease-default)}.echo-welcome-message-close:hover{opacity:1;background:var(--shadow-color-light);transform:scale(1.1)}.echo-welcome-message-close:active{transform:scale(.95)}.echo-welcome-message:after{content:"";position:absolute;bottom:-4px;right:17px;width:16px;height:16px;background:inherit;transform:rotate(45deg);border-radius:var(--radius-xs);border:1px solid var(--primary-color);z-index:-2}.echo-welcome-message:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:var(--primary-color-lightest);z-index:-1;border-radius:var(--radius-lg)}.echo-welcome-message-pulsar{content:"";display:inline-block;width:6px;height:6px;background:var(--primary-color);border-radius:50%;margin-right:8px;animation:pulse 1.5s var(--ease-in-out) infinite}.echo-button{display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:var(--radius-md);font-weight:500;cursor:pointer;transition:all var(--duration-base) var(--ease-default);line-height:1}.echo-button:focus-visible{outline:2px solid var(--primary-color);outline-offset:2px}.echo-button-primary{background:var(--primary-color);color:#fff}.echo-button-primary:hover{background:var(--hover-color);transform:translateY(-1px)}.echo-button-primary:active{transform:translateY(0)}.echo-button-secondary{background:transparent;color:var(--text-light)}.echo-button-secondary:hover{background-color:var(--primary-color-lightest);color:var(--primary-color)}.echo-button-xs{padding:var(--spacing-xs);font-size:var(--font-xs)}.echo-button-sm{padding:var(--spacing-xs);font-size:var(--font-sm)}.echo-button-md{padding:var(--spacing-md) var(--spacing-2xl);font-size:var(--font-base)}.echo-button-lg{padding:var(--spacing-md) var(--spacing-3xl);font-size:var(--font-md)}@keyframes slideUpFade{0%{opacity:0;transform:translateY(var(--spacing-sm))}to{opacity:1;transform:translateY(0)}}@keyframes slideDownFade{0%{opacity:0;transform:translateY(calc(-1 * var(--spacing-sm)))}to{opacity:1;transform:translateY(0)}}@keyframes popIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes popInSlideUp{0%{opacity:0;transform:translateY(var(--spacing-sm)) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes popInSlideDown{0%{opacity:0;transform:translate(-50%,-100%) translateY(calc(-1 * var(--spacing-xs))) scale(.95)}to{opacity:1;transform:translate(-50%,-100%) translateY(calc(-1 * var(--spacing-sm))) scale(1)}}@keyframes bounceIn{0%{opacity:0;transform:translateY(var(--spacing-xl)) scale(.9)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.5}to{transform:scale(1);opacity:1}}.echo-inputs{display:flex;flex-direction:column;gap:1rem;margin-bottom:1rem}.echo-input{display:flex;flex-direction:column;gap:.5rem}.echo-input-label{font-size:.875rem;font-weight:500;color:var(--text-color)}.echo-input-required{color:#dc2626;margin-left:.25rem}.echo-input-field{width:100%;padding:.5rem;border:1px solid var(--border-color);border-radius:var(--radius-md);background-color:#fff;color:var(--text-medium);font-size:var(--font-sm);transition:all var(--duration-base) var(--ease-default)}.echo-input-field:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 15%,transparent)}.echo-input-field::placeholder{color:var(--text-lighter)}select.echo-input-field{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center;padding-right:2.5rem;cursor:pointer}.echo-input-options{display:flex;flex-direction:column;gap:var(--spacing-sm);border:none;margin:0;padding:0}.echo-input-option{display:flex;align-items:center;gap:.5rem;cursor:pointer;padding:var(--spacing-xs);border-radius:var(--radius-sm);transition:all var(--duration-base) var(--ease-default)}.echo-input-option:hover{background:var(--primary-color-lightest)}.echo-input-option input[type=radio],.echo-input-option input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;width:18px;height:18px;border:1px solid var(--border-color);background-color:#fff;display:grid;place-content:center;cursor:pointer;transition:all var(--duration-base) var(--ease-default)}.echo-input-option input[type=radio]{border-radius:50%}.echo-input-option input[type=radio]:before{content:"";width:10px;height:10px;border-radius:50%;transform:scale(0);transition:transform var(--duration-base) var(--ease-default);background-color:var(--primary-color)}.echo-input-option input[type=radio]:checked:before{transform:scale(1)}.echo-input-option input[type=checkbox]{border-radius:var(--radius-sm)}.echo-input-option input[type=checkbox]:before{content:"";width:12px;height:12px;transform:scale(0);transition:all var(--duration-base) var(--ease-default);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");background-size:contain;background-repeat:no-repeat;background-position:center}.echo-input-option input[type=checkbox]:checked{background-color:var(--primary-color-lighter);border-color:var(--primary-color-lighter)}.echo-input-option input[type=checkbox]:checked:before{transform:scale(1)}.echo-input-option input[type=radio]:hover,.echo-input-option input[type=checkbox]:hover{border-color:var(--primary-color-lighter)}.echo-input-option input[type=radio]:focus,.echo-input-option input[type=checkbox]:focus{outline:none;border-color:var(--primary-color-lighter);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 15%,transparent)}.echo-input-option input[type=radio]:checked,.echo-input-option input[type=checkbox]:checked{border-color:var(--primary-color-lighter)}.echo-input-option span{font-size:var(--font-sm);color:var(--text-medium);-webkit-user-select:none;user-select:none}.echo-select{position:relative;width:100%}.echo-select-trigger{width:100%;padding:.5rem;border:1px solid var(--border-color);border-radius:var(--radius-md);background-color:#fff;color:var(--text-medium);font-size:var(--font-sm);transition:all var(--duration-base) var(--ease-default);cursor:pointer;text-align:left;display:flex;align-items:center;justify-content:space-between;gap:.5rem;outline:none}.echo-select-trigger[data-placeholder=true]{color:var(--text-lighter)}.echo-select-trigger:hover{border-color:var(--border-color-medium)}.echo-select-trigger:focus,.echo-select-trigger[data-open=true]{border-color:var(--primary-color);box-shadow:0 0 0 3px color-mix(in srgb,var(--primary-color) 15%,transparent)}.echo-select-arrow{flex-shrink:0;transition:transform var(--duration-base) var(--ease-default)}.echo-select-trigger[data-open=true] .echo-select-arrow{transform:rotate(180deg)}.echo-select-dropdown{position:absolute;top:calc(100% + .25rem);left:0;right:0;background:#fff;border:1px solid var(--border-color-medium);border-radius:var(--radius-md);box-shadow:var(--shadow-black-lightened-md);max-height:15rem;overflow-y:auto;z-index:10;animation:slideDownFade var(--duration-base) var(--ease-default);padding:var(--spacing-xs)}.echo-select-option{width:100%;padding:.5rem .75rem;background:none;border:none;text-align:left;color:var(--text-medium);font-size:var(--font-sm);cursor:pointer;transition:all var(--duration-base) var(--ease-default);outline:none;border-radius:var(--radius-sm)}.echo-select-option:hover{background:var(--primary-color-lightest)}.echo-select-option:focus{background:var(--primary-color-lightest);box-shadow:0 0 0 1px var(--primary-color) inset}.echo-select-option[data-selected=true]{background:var(--primary-color-lightest);color:var(--primary-color);font-weight:500}select.echo-input-field{display:none}.visually-hidden{position:absolute;left:50%;bottom:0;transform:translate(-50%);width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}`;var _t=w('<div class=echo-color-selector role=group aria-label="Color Selection"><button class=echo-drawing-toolbar-button title="Current Color"></button><div class=echo-color-swatch-wrapper role=listbox aria-label="Available Colors"><div class=echo-color-swatch>'),Ht=w("<button class=echo-color-swatch-button role=option>");const Ut=["#ff6b6b","#69db7c","#74c0fc","#ffd43b","#da77f2","#66d9e8","#ffa94d","#e599f7"],Xt={"#ff6b6b":"Soft Red","#69db7c":"Soft Green","#74c0fc":"Soft Blue","#ffd43b":"Soft Yellow","#da77f2":"Soft Purple","#66d9e8":"Soft Cyan","#ffa94d":"Soft Orange","#e599f7":"Soft Pink"},pe=e=>Xt[e]||"Primary",Kt=()=>{const e=k();return(()=>{var n=_t(),t=n.firstChild,r=t.nextSibling,o=r.firstChild;return h(t,"aria-expanded",!1),v(o,c.createComponent(c.For,{get each(){return[e.widget.state.primaryColor,...Ut]},children:a=>(()=>{var i=Ht();return i.$$click=()=>e.drawing.setState({selectedColor:a}),a!=null?i.style.setProperty("background-color",a):i.style.removeProperty("background-color"),c.createRenderEffect(l=>{var s=`Select ${pe(a)} color`,d=e.drawing.state.selectedColor===a,u=`${pe(a)} color`,f=e.drawing.state.selectedColor===a;return s!==l.e&&h(i,"title",l.e=s),d!==l.t&&h(i,"data-selected",l.t=d),u!==l.a&&h(i,"aria-label",l.a=u),f!==l.o&&h(i,"aria-selected",l.o=f),l},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()})),c.createRenderEffect(a=>{var i=`Current color: ${pe(e.drawing.state.selectedColor)}`,l=e.drawing.state.selectedColor;return i!==a.e&&h(t,"aria-label",a.e=i),l!==a.t&&((a.t=l)!=null?t.style.setProperty("background-color",l):t.style.removeProperty("background-color")),a},{e:void 0,t:void 0}),n})()};E(["click"]);var Gt=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="m9 18 6-6-6-6">');const Zt=e=>(()=>{var n=Gt();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var Qt=w('<svg viewBox="0 0 64 66"fill=none><path d="M59.716 36.936L54.9 33l-6.17 5.108a77.278 77.278 0 00-12.744 13.469l-3.637 4.914-3.778-5.017a83.719 83.719 0 00-13.956-14.538L9.799 33l2.86-2.332A104.39 104.39 0 0030.1 12.5l2.24-2.98 1.736 2.298a111.905 111.905 0 0018.608 19.384l2.206 1.81 2.861-2.333a104.13 104.13 0 005.297-4.641C59.978 11.294 47.409.26 32.349.26 14.997.26.92 14.923.92 33c0 18.076 14.077 32.74 31.43 32.74 15.102 0 27.715-11.103 30.73-25.892a75.808 75.808 0 00-3.375-2.912h.011z">');const Jt=e=>(()=>{var n=Qt(),t=n.firstChild;return c.createRenderEffect(r=>{var o=e.size??24,a=e.size??24,i=e.class,l=e.style,s=e.fill??"currentColor";return o!==r.e&&h(n,"width",r.e=o),a!==r.t&&h(n,"height",r.t=a),i!==r.a&&h(n,"class",r.a=i),r.o=z(n,l,r.o),s!==r.i&&h(t,"fill",r.i=s),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),n})();var en=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M3 7V5a2 2 0 0 1 2-2h2"></path><path d="M17 3h2a2 2 0 0 1 2 2v2"></path><path d="M21 17v2a2 2 0 0 1-2 2h-2"></path><path d="M7 21H5a2 2 0 0 1-2-2v-2">');const tn=e=>(()=>{var n=en();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var nn=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z">');const rn=e=>(()=>{var n=nn();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var an=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M3 6h18"></path><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"></path><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"></path><line x1=10 x2=10 y1=11 y2=17></line><line x1=14 x2=14 y1=11 y2=17>');const Ve=e=>(()=>{var n=an();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var on=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=10></circle><path d="m9 12 2 2 4-4">');const cn=e=>(()=>{var n=on();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var sn=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=10></circle><path d="m15 9-6 6"></path><path d="m9 9 6 6">');const ln=e=>(()=>{var n=sn();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var dn=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M18 6 6 18"></path><path d="m6 6 12 12">');const se=e=>(()=>{var n=dn();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var un=w('<div class=echo-drawing-toolbar data-hide-when-drawing=true role=toolbar aria-label="Drawing Tools"><button class=echo-drawing-toolbar-button title="Clear drawings"aria-label="Clear all drawings"role=button>'),hn=w("<button class=echo-drawing-toolbar-button role=button>");const fn={rectangle:tn,path:rn},gn=()=>{const e=k(),n=Object.values(F);return(()=>{var t=un(),r=t.firstChild;return v(t,c.createComponent(c.For,{each:n,children:o=>{const a=fn[o.id];return(()=>{var i=hn();return i.$$click=()=>e.drawing.setState({selectedTool:o.id}),v(i,c.createComponent(a,{class:"echo-drawing-toolbar-icon","aria-hidden":"true"})),c.createRenderEffect(l=>{var s=o.label,d=e.drawing.state.selectedTool===o.id,u=o.label,f=e.drawing.state.selectedTool===o.id;return s!==l.e&&h(i,"title",l.e=s),d!==l.t&&h(i,"data-selected",l.t=d),u!==l.a&&h(i,"aria-label",l.a=u),f!==l.o&&h(i,"aria-pressed",l.o=f),l},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()}}),r),v(t,c.createComponent(Kt,{}),r),r.$$click=()=>e.drawing.setState({shapes:[]},!0),v(r,c.createComponent(Ve,{class:"echo-drawing-toolbar-icon","aria-hidden":"true"})),t})()};E(["click"]);var mn=w("<div class=echo-drawing-tooltip data-hide-when-drawing=true>");const vn=()=>{const e=k(),n=c.createMemo(()=>e.drawing.state.showTooltip&&e.drawing.state.mousePosition.y&&e.drawing.state.mousePosition.x&&e.widget.state.isOpen&&!$t());return c.createComponent(c.Show,{get when(){return n()},get children(){var t=mn();return v(t,()=>e.widget.state.text.drawingTooltip.text),c.createRenderEffect(r=>{var o=`${e.drawing.state.mousePosition.y+20}px`,a=`${e.drawing.state.mousePosition.x+10}px`;return o!==r.e&&((r.e=o)!=null?t.style.setProperty("top",o):t.style.removeProperty("top")),a!==r.t&&((r.t=a)!=null?t.style.setProperty("left",a):t.style.removeProperty("left")),r},{e:void 0,t:void 0}),t}})};var wn=w("<button>");const L=e=>{const n=()=>e.variant||"primary",t=()=>e.size||"md";return(()=>{var r=wn();return at(r,c.mergeProps(e,{get class(){return`echo-button echo-button-${n()} echo-button-${t()} ${e.class}`}}),!1),r})()};var bn=w('<svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"stroke-linecap=round stroke-linejoin=round><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>');const pn=e=>(()=>{var n=bn();return c.createRenderEffect(t=>{var r=e.size??24,o=e.size??24,a=e.fill??"none",i=e.stroke??"currentColor",l=e.strokeWidth??2,s=e.class,d=e.style;return r!==t.e&&h(n,"width",t.e=r),o!==t.t&&h(n,"height",t.t=o),a!==t.a&&h(n,"fill",t.a=a),i!==t.o&&h(n,"stroke",t.o=i),l!==t.i&&h(n,"stroke-width",t.i=l),s!==t.n&&h(n,"class",t.n=s),t.s=z(n,d,t.s),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),n})();var yn=w("<div class=echo-stored-feedback-empty>No unsubmitted feedback"),xn=w("<div class=echo-stored-feedback><div class=echo-stored-feedback-header><h3>Unsubmitted Feedback</h3></div><div class=echo-stored-feedback-list>"),kn=w("<div><div class=echo-stored-feedback-content><div class=echo-stored-feedback-path></div><div class=echo-stored-feedback-preview></div></div><div class=echo-stored-feedback-actions>");const Cn=()=>{const e=k();let n;const[t,r]=c.createSignal(fe()),[o,a]=c.createSignal(window.location.pathname),i=m=>{m.key==="Escape"&&e.widget.state.isStoredFeedbackOpen&&e.widget.setState({isStoredFeedbackOpen:!1})},l=m=>{if(!e.widget.state.isStoredFeedbackOpen||!n)return;m.composedPath().includes(n)||e.widget.setState({isStoredFeedbackOpen:!1})},s=()=>{const m=fe();r(m),e.widget.setState({pagesCount:m.length})},d=()=>{a(window.location.pathname)};O({event:"echo-storage-change",callback:s}),O({event:"popstate",callback:d}),be({target:document.documentElement,options:{childList:!0,subtree:!0},callback:()=>{a(window.location.pathname)}}),O({event:"keydown",callback:i}),O({event:"click",callback:l});const u=(m,b)=>{const y=b?`${m}${b}`:m;window.location.href=y,e.widget.setState({isStoredFeedbackOpen:!1})},f=m=>{o()===m&&e.methods.reset(),Te(m);const b=fe();r(b),e.widget.setState({pagesCount:b.length})},g=m=>{if(m==="/")return"/";const b=m.split("/");return b.length<=4?m:`/${b[1]}/.../${b[b.length-1]}`};return c.createComponent(c.Show,{get when(){return e.widget.state.isStoredFeedbackOpen},get children(){var m=xn(),b=m.firstChild;b.firstChild;var y=b.nextSibling,C=n;return typeof C=="function"?R(C,m):n=m,v(b,c.createComponent(L,{variant:"secondary",size:"sm",onClick:()=>e.widget.setState({isStoredFeedbackOpen:!1}),get children(){return c.createComponent(se,{size:20})}}),null),v(y,c.createComponent(c.For,{get each(){return t()},children:S=>{const p=c.createMemo(()=>S.path===o());return(()=>{var $=kn(),P=$.firstChild,x=P.firstChild,B=x.nextSibling,j=P.nextSibling;return v(x,()=>g(S.path)),v(B,()=>S.state.feedback.message),v(j,(()=>{var I=c.createMemo(()=>!p());return()=>I()&&c.createComponent(L,{class:"echo-stored-feedback-link",variant:"secondary",size:"sm",onClick:()=>u(S.path,S.state.latestQuery),get children(){return c.createComponent(pn,{})}})})(),null),v(j,c.createComponent(L,{class:"echo-stored-feedback-delete",variant:"secondary",size:"sm",onClick:()=>f(S.path),children:"Delete"}),null),c.createRenderEffect(I=>{var Ye=`echo-stored-feedback-item ${p()?"echo-stored-feedback-item-current":""}`,_e=S.path;return Ye!==I.e&&xe($,I.e=Ye),_e!==I.t&&h(x,"title",I.t=_e),I},{e:void 0,t:void 0}),$})()}}),null),v(y,c.createComponent(c.Show,{get when(){return t().length===0},get children(){return yn()}}),null),m}})};var Sn=w('<button class=echo-launcher-button aria-label="Open feedback form"role=button>'),En=w("<span class=echo-launcher-button-count role=button tabindex=0>");const $n=()=>{const e=k(),[n,t]=c.createSignal(!1);let r;const o=()=>{r&&window.clearTimeout(r),r=window.setTimeout(()=>{const d=V("welcome_message_shown",!1);!e.widget.state.isOpen&&!e.widget.state.isStoredFeedbackOpen&&d&&t(!0)},4e3)},a=()=>{t(!1)},i=()=>{o()},l=()=>{e.widget.setState({isOpen:!e.widget.state.isOpen}),e.widget.setState({welcomeMessageIsClosing:!0}),K("welcome_message_shown",!0)};c.createEffect(()=>{e.widget.state.isOpen||(t(!1),o()),e.widget.state.isStoredFeedbackOpen&&t(!1)});const s=d=>{d.stopPropagation(),e.widget.setState({isStoredFeedbackOpen:!e.widget.state.isStoredFeedbackOpen}),t(!1)};return[(()=>{var d=Sn();return d.addEventListener("pointerleave",i),d.addEventListener("pointerenter",a),d.$$click=l,v(d,c.createComponent(Jt,{stroke:"white",fill:"#ffffff","aria-hidden":"true"}),null),v(d,(()=>{var u=c.createMemo(()=>e.widget.state.pagesCount>0);return()=>u()&&(()=>{var f=En();return f.$$click=s,v(f,()=>e.widget.state.pagesCount),c.createRenderEffect(()=>h(f,"aria-label",`View ${e.widget.state.pagesCount} stored feedback items`)),f})()})(),null),c.createRenderEffect(u=>{var f=e.widget.state.isOpen,g=n()?"45px":"0",m=e.widget.state.isOpen;return f!==u.e&&h(d,"data-hidden",u.e=f),g!==u.t&&((u.t=g)!=null?d.style.setProperty("left",g):d.style.removeProperty("left")),m!==u.a&&h(d,"aria-expanded",u.a=m),u},{e:void 0,t:void 0,a:void 0}),d})(),c.createComponent(Cn,{})]};E(["click"]);var Pn=w("<div class=echo-notification><div class=echo-notification-icon></div><div class=echo-notification-content><div class=echo-notification-title></div><div class=echo-notification-message>");const zn=()=>{const e=k(),n=()=>{e.widget.setState({notification:{...e.widget.state.notification,show:!1}})},t=()=>{switch(e.widget.state.notification.type){case"success":return e.widget.state.text.notification.successTitle;case"error":return e.widget.state.text.notification.errorTitle;default:return""}};return(()=>{var r=Pn(),o=r.firstChild,a=o.nextSibling,i=a.firstChild,l=i.nextSibling;return v(r,c.createComponent(L,{class:"echo-notification-hide",variant:"secondary",size:"sm",onClick:n,get title(){return e.widget.state.text.notification.hideTitle},get children(){return c.createComponent(se,{size:20})}}),o),v(o,(()=>{var s=c.createMemo(()=>e.widget.state.notification.type==="success");return()=>s()?c.createComponent(cn,{size:32}):(()=>{var d=c.createMemo(()=>e.widget.state.notification.type==="error");return()=>d()?c.createComponent(ln,{size:32}):null})()})()),v(i,t),v(l,()=>{var s;return(s=e.widget.state.notification)==null?void 0:s.message}),c.createRenderEffect(s=>{var d=e.widget.state.notification.type,u=!e.widget.state.notification.type,f=!e.widget.state.notification.show;return d!==s.e&&h(r,"data-type",s.e=d),u!==s.t&&h(r,"data-empty",s.t=u),f!==s.a&&h(r,"data-hidden",s.a=f),s},{e:void 0,t:void 0,a:void 0}),r})()};var Tn=w("<div class=echo-shape-actions data-hide-when-drawing=true>");const On=()=>{const e=k();let n;const[t,r]=c.createSignal({x:window.scrollX,y:window.scrollY});O({event:"scroll",callback:()=>{r({x:window.scrollX,y:window.scrollY})}});const a=()=>{e.drawing.state.selectedShapeId&&e.drawing.setState({shapes:e.drawing.state.shapes.filter(s=>s.id!==e.drawing.state.selectedShapeId),selectedShapeId:null})},i=c.createMemo(()=>e.drawing.state.selectedShapeId?e.drawing.state.shapes.find(s=>s.id===e.drawing.state.selectedShapeId):null),l=c.createMemo(()=>{const s=i(),d=n==null?void 0:n.getBoundingClientRect();if(!s||!d)return null;let u=null;if(s.type==="rectangle"){const m=Fe(s.points);if(!m)return null;u={x:m.x+m.width/2,y:m.y}}else if(s.type==="path"&&s.points.length>0)u={x:s.points[0].x,y:s.points[0].y};else return null;const f=8,g=t();return{x:Math.max(d.width/2+f,Math.min(window.innerWidth-d.width/2-f,u.x-g.x)),y:Math.max(d.height+f,Math.min(window.innerHeight-f,u.y-g.y))}});return(()=>{var s=Tn(),d=n;return typeof d=="function"?R(d,s):n=s,v(s,c.createComponent(L,{onClick:a,size:"sm",variant:"secondary",title:"Delete shape",get children(){return c.createComponent(Ve,{size:20})}})),c.createRenderEffect(u=>{var b,y;var f=!l(),g=l()?`${(b=l())==null?void 0:b.x}px`:"0",m=l()?`${(y=l())==null?void 0:y.y}px`:"0";return f!==u.e&&(s.hidden=u.e=f),g!==u.t&&((u.t=g)!=null?s.style.setProperty("left",g):s.style.removeProperty("left")),m!==u.a&&((u.a=m)!=null?s.style.setProperty("top",m):s.style.removeProperty("top")),u},{e:void 0,t:void 0,a:void 0}),s})()};var In=w("<button class=echo-welcome-message><span class=echo-welcome-message-pulsar></span><div class=echo-welcome-message-close role=button tabindex=0>");const Mn=()=>{const e=k(),n=V("welcome_message_shown",!1),t=o=>{o.stopPropagation(),e.widget.setState({welcomeMessageIsClosing:!0}),K("welcome_message_shown",!0)},r=()=>{e.widget.setState({isOpen:!0}),e.widget.setState({welcomeMessageIsClosing:!0}),K("welcome_message_shown",!0)};return n?null:(()=>{var o=In(),a=o.firstChild,i=a.nextSibling;return o.$$click=r,o.style.setProperty("bottom","80px"),o.style.setProperty("right","20px"),v(o,()=>e.widget.state.text.welcomeMessage.text,i),i.$$keydown=l=>l.key==="Enter"&&t(l),i.$$click=t,v(i,c.createComponent(se,{size:16,strokeWidth:3})),c.createRenderEffect(l=>{var s=e.widget.state.welcomeMessageIsClosing,d=e.widget.state.text.welcomeMessage.closeAriaLabel;return s!==l.e&&h(o,"data-hidden",l.e=s),d!==l.t&&h(i,"aria-label",l.t=d),l},{e:void 0,t:void 0}),o})()};E(["click","keydown"]);var An=w("<svg><rect class=echo-shape fill=transparent vector-effect=non-scaling-stroke role=img></svg>",!1,!0),Dn=w("<svg><path class=echo-shape fill=none vector-effect=non-scaling-stroke stroke-linecap=round role=img></svg>",!1,!0);const Be=e=>{const n=c.createMemo(()=>e.id===e.selectedShapeId);return[c.createComponent(c.Show,{get when(){return e.type==="rectangle"},get children(){return c.createComponent(Rn,c.mergeProps(e,{get isSelected(){return n()}}))}}),c.createComponent(c.Show,{get when(){return e.type==="path"},get children(){return c.createComponent(Fn,c.mergeProps(e,{get isSelected(){return n()}}))}})]},Rn=e=>{const n=c.createMemo(()=>Fe(e.points));return c.createComponent(c.Show,{get when(){return n()},get children(){var t=An();return t.$$keydown=r=>{var o;return r.key==="Enter"&&((o=e.onShapeClick)==null?void 0:o.call(e,e.id))},t.$$click=()=>{var r;return(r=e.onShapeClick)==null?void 0:r.call(e,e.id)},c.createRenderEffect(r=>{var o=e.id,a=e.isSelected,i=n().x,l=n().y,s=n().width,d=n().height,u=e.color,f=F.rectangle.strokeWidth,g=e.isSelected?F.rectangle.opacity.selected:F.rectangle.opacity.default,m=e.isSelected?"5,5":"none",b=e.isSelected?"move":"pointer",y=`Rectangle shape ${e.isSelected?"(selected)":""}`,C=e.onShapeClick?0:-1;return o!==r.e&&h(t,"data-shape-id",r.e=o),a!==r.t&&h(t,"data-selected",r.t=a),i!==r.a&&h(t,"x",r.a=i),l!==r.o&&h(t,"y",r.o=l),s!==r.i&&h(t,"width",r.i=s),d!==r.n&&h(t,"height",r.n=d),u!==r.s&&h(t,"stroke",r.s=u),f!==r.h&&h(t,"stroke-width",r.h=f),g!==r.r&&h(t,"opacity",r.r=g),m!==r.d&&h(t,"stroke-dasharray",r.d=m),b!==r.l&&h(t,"cursor",r.l=b),y!==r.u&&h(t,"aria-label",r.u=y),C!==r.c&&h(t,"tabindex",r.c=C),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0}),t}})},Fn=e=>{const n=c.createMemo(()=>Pt(e.points));return c.createComponent(c.Show,{get when(){return n()},get children(){var t=Dn();return t.$$keydown=r=>{var o;return r.key==="Enter"&&((o=e.onShapeClick)==null?void 0:o.call(e,e.id))},t.$$click=()=>{var r;return(r=e.onShapeClick)==null?void 0:r.call(e,e.id)},c.createRenderEffect(r=>{var o=e.id,a=e.isSelected,i=n(),l=e.color,s=F.path.strokeWidth,d=e.isSelected?F.path.opacity.selected:F.path.opacity.default,u=e.isSelected?"move":"pointer",f=`Freehand shape ${e.isSelected?"(selected)":""}`,g=e.onShapeClick?0:-1;return o!==r.e&&h(t,"data-shape-id",r.e=o),a!==r.t&&h(t,"data-selected",r.t=a),i!==r.a&&h(t,"d",r.a=i),l!==r.o&&h(t,"stroke",r.o=l),s!==r.i&&h(t,"stroke-width",r.i=s),d!==r.n&&h(t,"opacity",r.n=d),u!==r.s&&h(t,"cursor",r.s=u),f!==r.h&&h(t,"aria-label",r.h=f),g!==r.r&&h(t,"tabindex",r.r=g),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0}),t}})};E(["click","keydown"]);var Ln=w('<div class=echo-drawing-layer-container role=application aria-label="Drawing Canvas"><svg width=100% height=100% class=echo-drawing-layer preserveAspectRatio=none role=img aria-label="Drawing Area"><path class=echo-drawing-layer-mask fill="rgba(33, 43, 55, 1)"fill-opacity=0.2 fill-rule=evenodd aria-hidden=true>');const jn=()=>{const e=k();let n;return c.onMount(()=>{n==null||n.addEventListener("mousemove",e.drawing.methods.handleMove),n==null||n.addEventListener("mouseup",e.drawing.methods.handleEnd),n==null||n.addEventListener("touchmove",e.drawing.methods.handleMove,{passive:!1}),n==null||n.addEventListener("touchend",e.drawing.methods.handleEnd)}),c.onCleanup(()=>{n==null||n.removeEventListener("mousemove",e.drawing.methods.handleMove),n==null||n.removeEventListener("mouseup",e.drawing.methods.handleEnd),n==null||n.removeEventListener("touchmove",e.drawing.methods.handleMove),n==null||n.removeEventListener("touchend",e.drawing.methods.handleEnd)}),(()=>{var t=Ln(),r=t.firstChild,o=r.firstChild,a=n;return typeof a=="function"?R(a,t):n=t,v(t,c.createComponent(vn,{}),r),v(t,c.createComponent(On,{}),r),N(r,"touchend",e.drawing.methods.handleLeave,!0),N(r,"mouseleave",e.drawing.methods.handleLeave),N(r,"mouseenter",e.drawing.methods.handleEnter),r.$$touchmove=i=>{i.preventDefault(),e.drawing.methods.handleMove(i)},N(r,"mousemove",e.drawing.methods.handleMove,!0),r.$$touchstart=i=>{i.preventDefault(),e.drawing.methods.handleStart(i),e.drawing.methods.handleEnter(i),e.drawing.setState({showTooltip:!1,hasDrawn:!0})},r.$$mousedown=i=>{e.drawing.methods.handleStart(i),e.drawing.setState({showTooltip:!1,hasDrawn:!0})},v(r,c.createComponent(c.For,{get each(){return e.drawing.state.shapes},children:i=>c.createComponent(Be,{get id(){return i.id},get type(){return i.type},get color(){return i.color},get points(){return i.points},get selectedShapeId(){return e.drawing.state.selectedShapeId},get onShapeClick(){return e.drawing.methods.handleShapeClick}})}),null),v(r,c.createComponent(Be,{id:"temp",get type(){return e.drawing.state.selectedTool},get color(){return e.drawing.state.selectedColor},get points(){return e.drawing.state.currentPoints},get selectedShapeId(){return e.drawing.state.selectedShapeId}}),null),c.createRenderEffect(i=>{var l=e.drawing.state.cursor,s=Rt({width:e.widget.state.dimensions.width,height:e.widget.state.dimensions.height},e.drawing.state.currentPoints,e.drawing.state.shapes);return l!==i.e&&((i.e=l)!=null?t.style.setProperty("cursor",l):t.style.removeProperty("cursor")),s!==i.t&&h(o,"d",i.t=s),i},{e:void 0,t:void 0}),t})()};E(["mousedown","touchstart","mousemove","touchmove","touchend"]);const ee=e=>({handleTextChange:a=>{const i=a.target;e(i.value)},handleSelectChange:a=>{e(a)},handleCheckboxChange:(a,i,l)=>{const s=l?[...a,i]:a.filter(d=>d!==i);e(s)},getCheckboxValue:a=>Array.isArray(a)?a:[]});var Nn=w("<div class=echo-input role=group>"),qn=w("<label class=echo-input-label><span>"),Vn=w('<span class=echo-input-required aria-label="Required field">*');const te=e=>(()=>{var n=Nn();return v(n,(()=>{var t=c.createMemo(()=>!!e.label);return()=>t()&&(()=>{var r=qn(),o=r.firstChild;return v(o,()=>e.label),v(r,(()=>{var a=c.createMemo(()=>!!e.required);return()=>a()&&Vn()})(),null),r})()})(),null),v(n,()=>e.children,null),n})();var Bn=w("<textarea class=echo-input-field rows=5>"),Wn=w("<div class=visually-hidden>");const We=e=>{const{handleTextChange:n}=ee(e.onChange);return c.createComponent(te,{get label(){return e.config.label},get required(){return e.config.required},get children(){return[(()=>{var t=Bn();return N(t,"input",n,!0),c.createRenderEffect(r=>{var o=e.config.id,a=e.config.placeholder,i=e.config.required,l=e.config.label||e.config.placeholder,s=e.config.required,d=e.value==="",u=`${e.config.id}-description`;return o!==r.e&&h(t,"id",r.e=o),a!==r.t&&h(t,"placeholder",r.t=a),i!==r.a&&(t.required=r.a=i),l!==r.o&&h(t,"aria-label",r.o=l),s!==r.i&&h(t,"aria-required",r.i=s),d!==r.n&&h(t,"aria-invalid",r.n=d),u!==r.s&&h(t,"aria-describedby",r.s=u),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),c.createRenderEffect(()=>t.value=e.value===void 0?"":e.value),t})(),(()=>{var t=Wn();return v(t,()=>e.config.placeholder),c.createRenderEffect(()=>h(t,"id",`${e.config.id}-description`)),t})()]}})};E(["input"]);var Yn=w("<fieldset class=echo-input-options role=group>"),_n=w("<label class=echo-input-option><input type=checkbox><span>");const Hn=e=>{const{handleCheckboxChange:n,getCheckboxValue:t}=ee(e.onChange),r=()=>t(e.value),o=()=>r().length>0;return c.createComponent(te,{get label(){return e.config.label},get required(){return e.config.required},get children(){var a=Yn();return v(a,c.createComponent(c.For,{get each(){return e.config.options},children:(i,l)=>(()=>{var s=_n(),d=s.firstChild,u=d.nextSibling;return d.addEventListener("change",f=>n(r(),i.value,f.currentTarget.checked)),v(u,()=>i.label),c.createRenderEffect(()=>d.required=e.config.required&&!o()&&l()===0),c.createRenderEffect(()=>d.value=i.value),c.createRenderEffect(()=>d.checked=r().includes(i.value)),s})()})),c.createRenderEffect(()=>h(a,"aria-required",e.config.required)),a}})};var Un=w("<fieldset class=echo-input-options role=radiogroup>"),Xn=w("<label class=echo-input-option><input type=radio><span>");const Kn=e=>{const{handleSelectChange:n}=ee(e.onChange);return c.createComponent(te,{get label(){return e.config.label},get required(){return e.config.required},get children(){var t=Un();return v(t,c.createComponent(c.For,{get each(){return e.config.options},children:r=>(()=>{var o=Xn(),a=o.firstChild,i=a.nextSibling;return a.addEventListener("change",()=>n(r.value)),v(i,()=>r.label),c.createRenderEffect(l=>{var s=e.config.id,d=e.config.required;return s!==l.e&&h(a,"name",l.e=s),d!==l.t&&(a.required=l.t=d),l},{e:void 0,t:void 0}),c.createRenderEffect(()=>a.value=r.value),c.createRenderEffect(()=>a.checked=e.value===r.value),o})()})),c.createRenderEffect(()=>h(t,"aria-required",e.config.required)),t}})};var Gn=w("<div class=echo-select-dropdown role=listbox>"),Zn=w('<div class=echo-select><button type=button class=echo-select-trigger aria-haspopup=listbox><span></span><svg class=echo-select-arrow width=16 height=16 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="m6 9 6 6 6-6"></path></svg></button><input type=text class=visually-hidden aria-hidden=true>'),Qn=w("<button type=button class=echo-select-option role=option>");const Jn=e=>{const{handleSelectChange:n}=ee(e.onChange),[t,r]=c.createSignal(!1);let o,a,i;const l=()=>e.config.options.find(f=>f.value===(e.value===void 0?"":e.value)),s=(f,g)=>{g.stopPropagation(),f.value===e.value?e.config.required||n(""):n(f.value),r(!1)},d=()=>{r(!t())};return O({event:"mousedown",callback:f=>{if(!t()||!o)return;f.composedPath().includes(o)||r(!1)}}),c.createComponent(te,{get label(){return e.config.label},get required(){return e.config.required},get children(){var f=Zn(),g=f.firstChild,m=g.firstChild,b=g.nextSibling,y=o;typeof y=="function"?R(y,f):o=f,g.$$click=p=>{p.stopPropagation(),d()};var C=a;typeof C=="function"?R(C,g):a=g,v(m,()=>{var p;return((p=l())==null?void 0:p.label)||e.config.placeholder}),v(f,c.createComponent(c.Show,{get when(){return t()},get children(){var p=Gn();return v(p,c.createComponent(c.For,{get each(){return e.config.options},children:$=>(()=>{var P=Qn();return P.$$click=x=>s($,x),v(P,()=>$.label),c.createRenderEffect(x=>{var B=$.value===e.value,j=$.value===e.value;return B!==x.e&&h(P,"aria-selected",x.e=B),j!==x.t&&h(P,"data-selected",x.t=j),x},{e:void 0,t:void 0}),P})()})),p}}),b);var S=i;return typeof S=="function"?R(S,b):i=b,c.createRenderEffect(p=>{var $=t(),P=!e.value,x=e.config.required,B=t(),j=e.config.required,I=e.config.required;return $!==p.e&&h(g,"data-open",p.e=$),P!==p.t&&h(g,"data-placeholder",p.t=P),x!==p.a&&h(g,"data-required",p.a=x),B!==p.o&&h(g,"aria-expanded",p.o=B),j!==p.i&&h(g,"aria-required",p.i=j),I!==p.n&&(b.required=p.n=I),p},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),c.createRenderEffect(()=>b.value=e.value===void 0?"":e.value),f}})};E(["click"]);var er=w("<input type=text class=echo-input-field>");const tr=e=>{const{handleTextChange:n}=ee(e.onChange);return c.createComponent(te,{get label(){return e.config.label},get required(){return e.config.required},get children(){var t=er();return N(t,"input",n,!0),c.createRenderEffect(r=>{var o=e.config.placeholder,a=e.config.required;return o!==r.e&&h(t,"placeholder",r.e=o),a!==r.t&&(t.required=r.t=a),r},{e:void 0,t:void 0}),c.createRenderEffect(()=>t.value=e.value===void 0?"":e.value),t}})};E(["input"]);var nr=w("<div class=echo-input-error>Invalid input type"),rr=w("<div class=echo-input-error>Unsupported input type: ");const ar=e=>c.createComponent(c.Show,{get when(){return e.config.type},keyed:!0,get fallback(){return nr()},get children(){return c.createComponent(c.Switch,{get fallback(){return(()=>{var n=rr();return n.firstChild,v(n,()=>e.config.type,null),n})()},get children(){return[c.createComponent(c.Match,{get when(){return e.config.type==="text"},get children(){return c.createComponent(tr,{get config(){return e.config},get value(){return e.value},get onChange(){return e.onChange}})}}),c.createComponent(c.Match,{get when(){return e.config.type==="textarea"},get children(){return c.createComponent(We,{get config(){return e.config},get value(){return e.value},get onChange(){return e.onChange}})}}),c.createComponent(c.Match,{get when(){return e.config.type==="radio"},get children(){return c.createComponent(Kn,{get config(){return e.config},get value(){return e.value},get onChange(){return e.onChange}})}}),c.createComponent(c.Match,{get when(){return e.config.type==="checkbox"},get children(){return c.createComponent(Hn,{get config(){return e.config},get value(){return e.value},get onChange(){return e.onChange}})}}),c.createComponent(c.Match,{get when(){return e.config.type==="select"},get children(){return c.createComponent(Jn,{get config(){return e.config},get value(){return e.value},get onChange(){return e.onChange}})}})]}})}}),or=()=>{const e=navigator.connection;return{effectiveType:e==null?void 0:e.effectiveType,downlink:e==null?void 0:e.downlink,rtt:e==null?void 0:e.rtt,saveData:e==null?void 0:e.saveData}},ir=()=>({width:window.innerWidth,height:window.innerHeight,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language,languages:navigator.languages,doNotTrack:navigator.doNotTrack,cookiesEnabled:navigator.cookieEnabled,hardwareConcurrency:navigator.hardwareConcurrency,maxTouchPoints:navigator.maxTouchPoints,colorDepth:window.screen.colorDepth,pixelRatio:window.devicePixelRatio,availableWidth:window.screen.availWidth,availableHeight:window.screen.availHeight}),cr=()=>{const e=new URL(window.location.href),n={};return e.searchParams.forEach((t,r)=>{n[r]=t}),{url:e.href,origin:e.origin,pathname:e.pathname,searchParams:n,referrer:document.referrer}},sr=()=>({timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,localDateTime:new Date().toISOString()}),lr=()=>({userAgent:navigator.userAgent,browserInfo:ir(),networkInfo:or(),locationInfo:cr(),timeInfo:sr(),console:Et()});var dr=w("<fieldset class=echo-input-options><legend class=visually-hidden>Additional Information"),ur=w('<section class=echo-feedback data-hide-when-drawing=true role=dialog aria-label="Feedback Form"><form class=echo-feedback-content aria-label="Submit Feedback"><header class=echo-feedback-header><h3 class=echo-feedback-title id=feedback-form-title></h3><div class=echo-feedback-header-actions role=toolbar aria-label="Form controls"></div></header><fieldset class=echo-input-options><legend class=visually-hidden>Feedback Message');const hr=()=>{const e=k(),n=async o=>{o.preventDefault();const a=await Dt(),i={message:e.feedback.state.message,screenshot:a,metadata:lr(),customInputs:e.feedback.state.customInputValues};e.methods.submit(i)},t=o=>{o.stopPropagation(),e.feedback.setState({isMinimized:!0})},r=()=>{e.feedback.setState({isMinimized:!1})};return c.createEffect(()=>{e.widget.state.isOpen&&requestAnimationFrame(()=>{var o;(o=document.querySelector(".echo-input-field"))==null||o.focus()})}),(()=>{var o=ur(),a=o.firstChild,i=a.firstChild,l=i.firstChild,s=l.nextSibling,d=i.nextSibling;return d.firstChild,o.$$click=()=>e.feedback.state.isMinimized&&r(),a.addEventListener("submit",n),v(l,()=>e.widget.state.text.feedbackForm.title),v(s,c.createComponent(L,{type:"button",title:"Hide form",variant:"secondary",size:"sm",onClick:t,"aria-label":"Minimize feedback form",get children(){return c.createComponent(Zt,{size:20})}}),null),v(s,c.createComponent(L,{type:"button",title:"Close form",variant:"secondary",size:"sm",onClick:()=>e.widget.setState({isOpen:!1}),"aria-label":"Close feedback form",get children(){return c.createComponent(se,{size:20})}}),null),v(d,c.createComponent(We,{get config(){return{type:"textarea",id:"message",placeholder:e.widget.state.text.feedbackForm.placeholder,label:"Feedback Message",required:!0}},get value(){return e.feedback.state.message},onChange:u=>e.feedback.setState({message:u})}),null),v(a,c.createComponent(c.Show,{get when(){var u;return(u=e.widget.state.customInputs)==null?void 0:u.length},get children(){var u=dr();return u.firstChild,v(u,c.createComponent(c.For,{get each(){return e.widget.state.customInputs},children:f=>c.createComponent(ar,{config:f,get value(){return e.feedback.state.customInputValues[f.id]},onChange:g=>e.feedback.setState({customInputValues:{...e.feedback.state.customInputValues,[f.id]:g}})})}),null),u}}),null),v(a,c.createComponent(L,{type:"submit",variant:"primary",size:"lg",style:{width:"100%"},"aria-label":"Submit feedback",get children(){return e.widget.state.text.feedbackForm.submitButton}}),null),c.createRenderEffect(u=>{var f=e.feedback.state.isMinimized,g=e.feedback.state.isMinimized?"pointer":"default",m=!e.feedback.state.isMinimized;return f!==u.e&&h(o,"data-minimized",u.e=f),g!==u.t&&((u.t=g)!=null?o.style.setProperty("cursor",g):o.style.removeProperty("cursor")),m!==u.a&&h(o,"aria-expanded",u.a=m),u},{e:void 0,t:void 0,a:void 0}),o})()};E(["click"]);var fr=w("<style>"),gr=w("<div class=echo-launcher>"),mr=w("<dialog class=echo-overlay>"),vr=w("<div class=echo-root>");const wr=e=>c.createComponent(dt,{useShadow:!0,get mount(){return document.body},get children(){return c.createComponent(Vt,c.mergeProps(e,{get children(){return c.createComponent(xr,{get children(){return[c.createComponent(br,{get primaryColor(){return e.primaryColor}}),c.createComponent(pr,{})]}})}}))}}),br=e=>{const[n,t]=c.createSignal("");return c.createEffect(()=>{const r=`
4
+ .echo-root {
5
+ --primary-color: ${e.primaryColor};
6
+ --primary-text-color: ${kt(e.primaryColor)};
7
+ }
8
+ `;t(r)}),(()=>{var r=fr();return v(r,Yt,null),v(r,n,null),r})()},pr=()=>{const e=k();return c.createEffect(()=>{}),[(()=>{var n=gr();return v(n,c.createComponent($n,{}),null),v(n,c.createComponent(Mn,{}),null),v(n,c.createComponent(zn,{}),null),c.createRenderEffect(()=>h(n,"data-hidden",e.widget.state.isOpen)),n})(),c.createComponent(yr,{get children(){return[c.createComponent(hr,{}),c.createComponent(gn,{}),c.createComponent(jn,{})]}})]},yr=e=>{const[n,t]=c.createSignal(),r=k(),o=Bt(()=>n());return c.createEffect(()=>{n()&&r.widget.setState({dimensions:o()})}),c.createEffect(()=>{var a,i;r.widget.state.isOpen?(a=n())==null||a.showModal():(i=n())==null||i.close()}),(()=>{var a=mr();return a.addEventListener("close",()=>r.widget.setState({isOpen:!1})),R(t,a),v(a,()=>e.children),c.createRenderEffect(i=>{var l=`${o().height}px`,s=`${o().width}px`,d=!r.widget.state.isOpen;return l!==i.e&&((i.e=l)!=null?a.style.setProperty("height",l):a.style.removeProperty("height")),s!==i.t&&((i.t=s)!=null?a.style.setProperty("width",s):a.style.removeProperty("width")),d!==i.a&&h(a,"data-hidden",i.a=d),i},{e:void 0,t:void 0,a:void 0}),a})()},xr=e=>{const n=k();return Wt({onUrlChange:t=>n.methods.handlePageChange(t)}),c.onMount(()=>{Ct(),Ot(t=>{if(n.widget.state.isOpen&&t.type==="keydown")switch(t.key){case"Escape":t.stopImmediatePropagation();break}})}),c.onCleanup(()=>{St(),It()}),(()=>{var t=vr();return v(t,()=>e.children),c.createRenderEffect(()=>h(t,"data-drawing",n.drawing.state.isDrawing)),t})()},kr={welcomeMessage:{text:"Click here to leave feedback",closeAriaLabel:"Close welcome message"},feedbackForm:{title:"Send Feedback",placeholder:"What's on your mind? We'd love to hear your feedback...",screenshotAlt:"Screenshot Preview",submitButton:"Send Feedback",minimizeTitle:"Minimize",expandTitle:"Expand",closeTitle:"Close",showFormTitle:"Show Feedback Form"},notification:{successTitle:"Thank you for your feedback!",errorTitle:"Something went wrong.",errorMessage:"Failed to send feedback. Please try again.",hideTitle:"Hide notification"},drawingTooltip:{text:"Click & drag to draw"}};let le=null;function Cr(e){le&&(console.warn("Echo widget is already initialized. Cleaning up previous instance..."),le());try{Ft(e);const{position:n="bottom-right",primaryColor:t="#6227dc",onSubmit:r,textConfig:o={},customInputs:a=[]}=e,i=Ee(kr,o),l=document.createElement("div");l.id="echo-container",document.body.appendChild(l);const s=tt(()=>c.createComponent(wr,{position:n,primaryColor:t,textConfig:i,onSubmit:r,customInputs:a}),l),d=()=>{s(),l.remove(),le=null};return window.addEventListener("unload",d,{once:!0}),le=d,d}catch(n){throw console.error("Echo initialization failed:",n),n}}D.initEcho=Cr,Object.defineProperty(D,Symbol.toStringTag,{value:"Module"})});
@@ -0,0 +1,7 @@
1
+ import { CustomInputValue } from '~/types';
2
+ export declare const useInputHandler: <T extends CustomInputValue>(onChange: (value: T) => void) => {
3
+ handleTextChange: (e: Event) => void;
4
+ handleSelectChange: (value: string) => void;
5
+ handleCheckboxChange: (currentValues: string[], value: string, checked: boolean) => void;
6
+ getCheckboxValue: (value: CustomInputValue) => string[];
7
+ };
@@ -0,0 +1,4 @@
1
+ export declare const usePageHeight: (element: () => HTMLElement | undefined) => import("solid-js").Accessor<{
2
+ width: number;
3
+ height: number;
4
+ }>;
@@ -0,0 +1,4 @@
1
+ export type PageStateSyncProps = {
2
+ onUrlChange: (newPageKey: string) => void;
3
+ };
4
+ export declare const usePageStateSync: ({ onUrlChange }: PageStateSyncProps) => void;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,48 @@
1
1
  import { type EchoConfig, type FeedbackPayload } from './types';
2
2
  import './styles.css';
3
3
  /**
4
- * Initialize the Echo feedback widget.
4
+ * Initialize the Echo feedback widget with the provided configuration.
5
+ *
6
+ * @description
7
+ * This function creates and mounts the Echo feedback widget to your application.
8
+ * Only one instance of Echo can be active at a time. If called multiple times,
9
+ * the previous instance will be cleaned up before creating a new one.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * initEcho({
14
+ * onSubmit: async (data) => {
15
+ * const response = await fetch('/api/feedback', {
16
+ * method: 'POST',
17
+ * body: JSON.stringify(data)
18
+ * });
19
+ * return response; // Return response to handle success/error notifications
20
+ * },
21
+ * position: 'bottom-right',
22
+ * primaryColor: '#6227dc',
23
+ * customInputs: [
24
+ * {
25
+ * id: 'category',
26
+ * type: 'select',
27
+ * label: 'Category',
28
+ * options: [
29
+ * { value: 'bug', label: 'Bug Report' },
30
+ * { value: 'feature', label: 'Feature Request' }
31
+ * ]
32
+ * }
33
+ * ]
34
+ * });
35
+ * ```
36
+ *
37
+ * @param {EchoConfig} options - Configuration options for the Echo widget
38
+ * @param {Function} options.onSubmit - Required callback function that handles feedback submission. Return the API Response to enable success/error notifications
39
+ * @param {Position} [options.position='bottom-right'] - Widget position on the page
40
+ * @param {string} [options.primaryColor='#6227dc'] - Primary color for UI elements (must be a valid hex color)
41
+ * @param {Partial<TextConfig>} [options.textConfig] - Custom text configuration for UI elements
42
+ * @param {CustomInputConfig[]} [options.customInputs] - Configuration for custom input fields
43
+ *
5
44
  * @throws {Error} If initialization fails or invalid options are provided
6
- * @returns {() => void} Cleanup function to remove the widget
45
+ * @returns {() => void} Cleanup function that removes the widget when called
7
46
  */
8
47
  export declare function initEcho(options: EchoConfig): () => void;
9
48
  export type { FeedbackPayload, EchoConfig };
@@ -0,0 +1,39 @@
1
+ import type { DrawingTool, FullEchoConfig, Point, Shape } from '~/types';
2
+ export type DrawingState = {
3
+ isDrawing: boolean;
4
+ selectedShapeId: string | null;
5
+ selectedTool: DrawingTool;
6
+ selectedColor: string;
7
+ shapes: Shape[];
8
+ currentPoints: Point[];
9
+ showTooltip: boolean;
10
+ mousePosition: Point;
11
+ hasDrawn: boolean;
12
+ isDragging: boolean;
13
+ dragStartPos: Point | null;
14
+ initialClickPos: Point | null;
15
+ dragOffset: Point | null;
16
+ cursor: string;
17
+ };
18
+ export type DrawingStore = {
19
+ state: DrawingState;
20
+ setState: (state: Partial<DrawingState>, isClearing?: boolean) => void;
21
+ methods: {
22
+ startDrawing: (initialPoint: Point) => void;
23
+ updateDrawing: (point: Point) => void;
24
+ finishDrawing: () => void;
25
+ handleShapeClick: (shapeId: string) => void;
26
+ handleStart: (e: MouseEvent | TouchEvent) => void;
27
+ handleMove: (e: MouseEvent | TouchEvent) => void;
28
+ handleEnd: (e: MouseEvent | TouchEvent) => void;
29
+ handleEnter: (e: MouseEvent | TouchEvent) => void;
30
+ handleLeave: (e: MouseEvent | TouchEvent) => void;
31
+ startDrag: (point: Point) => void;
32
+ stopDrag: () => void;
33
+ setInitialClick: (point: Point | null) => void;
34
+ updateDragOffset: (shape: {
35
+ points: Point[];
36
+ }, point: Point) => void;
37
+ };
38
+ };
39
+ export declare const createDrawingStore: (config: FullEchoConfig, currentPageKey: string, onStateChange?: (state: Partial<DrawingState>, isClearing?: boolean) => void) => DrawingStore;
@@ -0,0 +1,15 @@
1
+ import type { EchoConfig, FullEchoConfig } from '~/types';
2
+ import { type DrawingStore } from './drawingStore';
3
+ import { type FeedbackStore } from './feedbackStore';
4
+ import { type WidgetStore } from './widgetStore';
5
+ export type EchoStore = {
6
+ feedback: FeedbackStore;
7
+ drawing: DrawingStore;
8
+ widget: WidgetStore;
9
+ methods: {
10
+ reset: () => void;
11
+ submit: EchoConfig['onSubmit'];
12
+ handlePageChange: (newPageKey: string) => void;
13
+ };
14
+ };
15
+ export declare const createEchoStore: (config: FullEchoConfig) => EchoStore;
@@ -0,0 +1,17 @@
1
+ import type { CustomInputConfig, CustomInputValue, FullEchoConfig, Screenshot } from '~/types';
2
+ export type FeedbackState = {
3
+ message: string;
4
+ screenshot?: Screenshot;
5
+ isCapturing: boolean;
6
+ isMinimized: boolean;
7
+ customInputValues: Record<string, CustomInputValue>;
8
+ hasUserInteracted: boolean;
9
+ };
10
+ export type FeedbackStore = {
11
+ state: FeedbackState;
12
+ setState: (state: Partial<FeedbackState>, isClearing?: boolean) => void;
13
+ };
14
+ export declare const createFeedbackStore: (config: FullEchoConfig, currentPageKey: string, onStateChange?: (state: Partial<FeedbackState>, isClearing?: boolean) => void, customInputs?: CustomInputConfig[]) => {
15
+ state: FeedbackState;
16
+ setState: (newState: Partial<FeedbackState>, isClearing?: boolean) => void;
17
+ };
@@ -0,0 +1,4 @@
1
+ export * from './echoStore';
2
+ export * from './drawingStore';
3
+ export * from './feedbackStore';
4
+ export * from './widgetStore';