@consenti/api 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +143 -11
  2. package/dist/chunk-7NKW7UTJ.js +2 -0
  3. package/dist/chunk-7NKW7UTJ.js.map +1 -0
  4. package/dist/dashboard/assets/{ApiConfig-dmDLJNfI.js → ApiConfig-DLPkgWsM.js} +1 -1
  5. package/dist/dashboard/assets/{ArchivedProfileList-ChWp1RHE.js → ArchivedProfileList-fRvXAaWy.js} +1 -1
  6. package/dist/dashboard/assets/{AuditLog-3lekUOk8.js → AuditLog-9flkPiEQ.js} +1 -1
  7. package/dist/dashboard/assets/{ChangePassword-BYlF08cE.js → ChangePassword-D--mNLLR.js} +1 -1
  8. package/dist/dashboard/assets/{ConfirmDialog-sMBVcbiI.js → ConfirmDialog-CJAqYRfE.js} +1 -1
  9. package/dist/dashboard/assets/{ConsentList-DLDBSjxO.js → ConsentList-CyddMOrW.js} +1 -1
  10. package/dist/dashboard/assets/{ConsentTemplateEditor-0iB6G95-.js → ConsentTemplateEditor-DZGFzkTA.js} +1 -1
  11. package/dist/dashboard/assets/{ConsentTemplateList-BnU_nL8h.js → ConsentTemplateList-CwNVxHyZ.js} +1 -1
  12. package/dist/dashboard/assets/{HeadingTagInput-7owwn9Vj.js → HeadingTagInput-DGKZYLTR.js} +1 -1
  13. package/dist/dashboard/assets/{HowItWorks-B05y-6xX.js → HowItWorks-10CyO4Kp.js} +1 -1
  14. package/dist/dashboard/assets/{PermissionGate-D45f3WrO.js → PermissionGate-CkaZ9DKx.js} +1 -1
  15. package/dist/dashboard/assets/PreviewPane-ArCfR0c9.js +38 -0
  16. package/dist/dashboard/assets/{ProfileEditor-CuMRNzdM.js → ProfileEditor-BNUxXKMk.js} +1 -1
  17. package/dist/dashboard/assets/{ProfileList-CFZ_i1zk.js → ProfileList-Ti5ZML_L.js} +1 -1
  18. package/dist/dashboard/assets/{ProfileVersionHistory-40HtQSrd.js → ProfileVersionHistory-D2KtUROF.js} +1 -1
  19. package/dist/dashboard/assets/{RecordDetailModal-hpJgK02E.js → RecordDetailModal-4OyHjtux.js} +1 -1
  20. package/dist/dashboard/assets/{Reports-BlvcycZ8.js → Reports-CHpF_j2k.js} +1 -1
  21. package/dist/dashboard/assets/{RoleList-CTeQdx6f.js → RoleList-BICQW5gU.js} +1 -1
  22. package/dist/dashboard/assets/{Select-CeC6GRyb.js → Select-C7q2vevu.js} +1 -1
  23. package/dist/dashboard/assets/{Settings-DLsvGtMh.js → Settings-BlOcU0wL.js} +1 -1
  24. package/dist/dashboard/assets/{SetupWizard-BVzGrBm2.js → SetupWizard-DReZ5DWr.js} +1 -1
  25. package/dist/dashboard/assets/{Table-CcBP7eXS.js → Table-C59yMXY2.js} +1 -1
  26. package/dist/dashboard/assets/{TenantList-DLgPnlVv.js → TenantList-Bbwcxyo8.js} +1 -1
  27. package/dist/dashboard/assets/{UITemplateEditor-B9EBcvOB.js → UITemplateEditor-CR7TnHBH.js} +1 -1
  28. package/dist/dashboard/assets/{UITemplateList-CGYRRlCh.js → UITemplateList-NKwDQJAw.js} +1 -1
  29. package/dist/dashboard/assets/{UserList-BbpiUrVr.js → UserList-DMk0_UF0.js} +1 -1
  30. package/dist/dashboard/assets/{VendorList-mlOlW7ht.js → VendorList-BawJ8Kyc.js} +1 -1
  31. package/dist/dashboard/assets/{VisitorList-Dne7xkNx.js → VisitorList-BVSFRtul.js} +1 -1
  32. package/dist/dashboard/assets/check-BAoHs1bd.js +1 -0
  33. package/dist/dashboard/assets/{copy-FTaGH7-z.js → copy-DjZpSOQM.js} +1 -1
  34. package/dist/dashboard/assets/{external-link-5y29qnhn.js → external-link-CFayXpKz.js} +1 -1
  35. package/dist/dashboard/assets/{index-BaYVhd1M.js → index-D7qdwIxs.js} +2 -2
  36. package/dist/dashboard/assets/{profiles-D-hvl_fK.js → profiles-Jb6uV-0U.js} +1 -1
  37. package/dist/dashboard/assets/{roles-DZyZwZDr.js → roles-ChXEt79v.js} +1 -1
  38. package/dist/dashboard/assets/{rotate-ccw-clock-C5cVu2_f.js → rotate-ccw-clock-503u3yEE.js} +1 -1
  39. package/dist/dashboard/assets/{search-mdMD-WTj.js → search-B05qPv24.js} +1 -1
  40. package/dist/dashboard/assets/{square-pen-BoEcHaSW.js → square-pen-BX2H18m3.js} +1 -1
  41. package/dist/dashboard/assets/{templates-DLMsZs7d.js → templates-DalUjETH.js} +1 -1
  42. package/dist/dashboard/assets/{trash-BVDX09Xe.js → trash-Bfqti-Og.js} +1 -1
  43. package/dist/dashboard/assets/{useHashQuery-wXzkY-tk.js → useHashQuery-DzYBqPIg.js} +1 -1
  44. package/dist/dashboard/assets/{users-BLTbK4tk.js → users-CDdO4hYQ.js} +1 -1
  45. package/dist/dashboard/assets/x-Clw5rGTJ.js +1 -0
  46. package/dist/dashboard/index.html +1 -1
  47. package/dist/dist-MNR4WETI.js +2 -0
  48. package/dist/index.cjs +77 -75
  49. package/dist/index.cjs.map +1 -1
  50. package/dist/index.d.cts +45 -9
  51. package/dist/index.d.ts +45 -9
  52. package/dist/index.js +76 -74
  53. package/dist/index.js.map +1 -1
  54. package/dist/widget/widget.js +1 -1
  55. package/package.json +3 -2
  56. package/scripts/migrate-to-consenti-prefix.mjs +196 -0
  57. package/dist/chunk-COR72NFQ.js +0 -2
  58. package/dist/chunk-COR72NFQ.js.map +0 -1
  59. package/dist/dashboard/assets/PreviewPane-Czax39la.js +0 -38
  60. package/dist/dashboard/assets/check-IM5PInrX.js +0 -1
  61. package/dist/dashboard/assets/x-CtCy0YcJ.js +0 -1
  62. package/dist/dist-QJYW5KUK.js +0 -2
  63. /package/dist/{dist-QJYW5KUK.js.map → dist-MNR4WETI.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ProfileList-CFZ_i1zk.js","assets/check-IM5PInrX.js","assets/copy-FTaGH7-z.js","assets/rotate-ccw-clock-C5cVu2_f.js","assets/square-pen-BoEcHaSW.js","assets/trash-BVDX09Xe.js","assets/ConfirmDialog-sMBVcbiI.js","assets/Table-CcBP7eXS.js","assets/search-mdMD-WTj.js","assets/profiles-D-hvl_fK.js","assets/dist-GoiMJCTt.js","assets/PermissionGate-D45f3WrO.js","assets/ProfileEditor-CuMRNzdM.js","assets/PreviewPane-Czax39la.js","assets/x-CtCy0YcJ.js","assets/templates-DLMsZs7d.js","assets/templates-CIyMjskA.js","assets/Select-CeC6GRyb.js","assets/ProfileVersionHistory-40HtQSrd.js","assets/ArchivedProfileList-ChWp1RHE.js","assets/ConsentTemplateList-BnU_nL8h.js","assets/ConsentTemplateEditor-0iB6G95-.js","assets/HeadingTagInput-7owwn9Vj.js","assets/debounce-DlvAAT2V.js","assets/UITemplateList-CGYRRlCh.js","assets/UITemplateEditor-B9EBcvOB.js","assets/ConsentList-DLDBSjxO.js","assets/useHashQuery-wXzkY-tk.js","assets/RecordDetailModal-hpJgK02E.js","assets/VisitorList-Dne7xkNx.js","assets/UserList-BbpiUrVr.js","assets/users-BLTbK4tk.js","assets/roles-DZyZwZDr.js","assets/RoleList-CTeQdx6f.js","assets/TenantList-DLgPnlVv.js","assets/VendorList-mlOlW7ht.js","assets/AuditLog-3lekUOk8.js","assets/ChangePassword-BYlF08cE.js","assets/ApiConfig-dmDLJNfI.js","assets/external-link-5y29qnhn.js","assets/SetupWizard-BVzGrBm2.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ProfileList-Ti5ZML_L.js","assets/check-BAoHs1bd.js","assets/copy-DjZpSOQM.js","assets/rotate-ccw-clock-503u3yEE.js","assets/square-pen-BX2H18m3.js","assets/trash-Bfqti-Og.js","assets/ConfirmDialog-CJAqYRfE.js","assets/Table-C59yMXY2.js","assets/search-B05qPv24.js","assets/profiles-Jb6uV-0U.js","assets/dist-GoiMJCTt.js","assets/PermissionGate-CkaZ9DKx.js","assets/ProfileEditor-BNUxXKMk.js","assets/PreviewPane-ArCfR0c9.js","assets/x-Clw5rGTJ.js","assets/templates-DalUjETH.js","assets/templates-CIyMjskA.js","assets/Select-C7q2vevu.js","assets/ProfileVersionHistory-D2KtUROF.js","assets/ArchivedProfileList-fRvXAaWy.js","assets/ConsentTemplateList-CwNVxHyZ.js","assets/ConsentTemplateEditor-DZGFzkTA.js","assets/HeadingTagInput-DGKZYLTR.js","assets/debounce-DlvAAT2V.js","assets/UITemplateList-NKwDQJAw.js","assets/UITemplateEditor-CR7TnHBH.js","assets/ConsentList-CyddMOrW.js","assets/useHashQuery-DzYBqPIg.js","assets/RecordDetailModal-4OyHjtux.js","assets/VisitorList-BVSFRtul.js","assets/UserList-DMk0_UF0.js","assets/users-CDdO4hYQ.js","assets/roles-ChXEt79v.js","assets/RoleList-BICQW5gU.js","assets/TenantList-Bbwcxyo8.js","assets/VendorList-BawJ8Kyc.js","assets/AuditLog-9flkPiEQ.js","assets/ChangePassword-D--mNLLR.js","assets/ApiConfig-DLPkgWsM.js","assets/external-link-CFayXpKz.js","assets/SetupWizard-DReZ5DWr.js"])))=>i.map(i=>d[i]);
2
2
  (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h={},g=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v=Array.isArray;function y(e,t){for(var n in t)e[n]=t[n];return e}function b(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function x(t,n,r){var i,a,o,s={};for(o in n)o==`key`?i=n[o]:o==`ref`?a=n[o]:s[o]=n[o];if(arguments.length>2&&(s.children=arguments.length>3?e.call(arguments,2):r),typeof t==`function`&&t.defaultProps!=null)for(o in t.defaultProps)s[o]===void 0&&(s[o]=t.defaultProps[o]);return S(t,s,i,a,null)}function S(e,r,i,a,o){var s={type:e,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++n,__i:-1,__u:0};return o==null&&t.vnode!=null&&t.vnode(s),s}function C(e){return e.children}function w(e,t){this.props=e,this.context=t}function T(e,t){if(t==null)return e.__?T(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type==`function`?T(e):null}function E(e){if(e.__P&&e.__d){var n=e.__v,r=n.__e,i=[],a=[],o=y({},n);o.__v=n.__v+1,t.vnode&&t.vnode(o),ae(e.__P,o,n,e.__n,e.__P.namespaceURI,32&n.__u?[r]:null,i,r??T(n),!!(32&n.__u),a),o.__v=n.__v,o.__.__k[o.__i]=o,se(i,o,a),n.__e=n.__=null,o.__e!=r&&D(o)}}function D(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),D(e)}function O(e){(!e.__d&&(e.__d=!0)&&r.push(e)&&!k.__r++||i!=t.debounceRendering)&&((i=t.debounceRendering)||a)(k)}function k(){try{for(var e,t=1;r.length;)r.length>t&&r.sort(o),e=r.shift(),t=r.length,E(e)}finally{r.length=k.__r=0}}function ee(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,m,_,v,y=r&&r.__k||g,b=t.length;for(c=A(n,t,y,c,b),d=0;d<b;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&y[p.__i]||h,p.__i=d,v=ae(e,p,f,i,a,o,s,c,l,u),m=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&ue(f.ref,null,p),u.push(p.ref,p.__c||m,p)),_==null&&m!=null&&(_=m),4&p.__u?(c=te(p,c,e),f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:m&&(c=m.nextSibling),p.__u&=-7);return n.__e=_,c}function A(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=S(null,o,null,null,null):v(o)?o=e.__k[a]=S(C,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=S(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=ne(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=T(s)),de(s,s));return r}function te(e,t,n){var r,i;if(typeof e.type==`function`){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=te(r[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=T(e)),t=n.insertBefore(e.__e,t||null));do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function j(e,t){return t||=[],e==null||typeof e==`boolean`||(v(e)?e.some(function(e){j(e,t)}):t.push(e)),t}function ne(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&!(2&l.__u);if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function M(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||_.test(t)?n:n+`px`}function re(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||M(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||M(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(u,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[l]=r[l]:(n[l]=d,e.addEventListener(t,a?p:f,a)):e.removeEventListener(t,a?p:f,a);else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function ie(e){return function(n){if(this.l){var r=this.l[n.type+e];if(n[c]==null)n[c]=d++;else if(n[c]<r[l])return;return r(t.event?t.event(n):n)}}}function ae(e,n,r,i,a,o,s,c,l,u){var d,f,p,m,h,_,x,S,E,D,O,k,A,te,j,ne,M=n.type;if(n.constructor!==void 0)return null;128&r.__u&&(l=!!(32&r.__u),o=[c=n.__e=r.__e]),(d=t.__b)&&d(n);n:if(typeof M==`function`){f=s.length;try{if(E=n.props,D=M.prototype&&M.prototype.render,O=(d=M.contextType)&&i[d.__c],k=d?O?O.props.value:d.__:i,r.__c?S=(p=n.__c=r.__c).__=p.__E:(D?n.__c=p=new M(E,k):(n.__c=p=new w(E,k),p.constructor=M,p.render=fe),O&&O.sub(p),p.state||(p.state={}),p.__n=i,m=p.__d=!0,p.__h=[],p._sb=[]),D&&p.__s==null&&(p.__s=p.state),D&&M.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=y({},p.__s)),y(p.__s,M.getDerivedStateFromProps(E,p.__s))),h=p.props,_=p.state,p.__v=n,m)D&&M.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),D&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(D&&M.getDerivedStateFromProps==null&&E!==h&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(E,k),n.__v==r.__v||!p.__e&&p.shouldComponentUpdate!=null&&!1===p.shouldComponentUpdate(E,p.__s,k)){n.__v!=r.__v&&(p.props=E,p.state=p.__s,p.__d=!1),n.__e=r.__e,n.__k=r.__k,n.__k.some(function(e){e&&(e.__=n)}),g.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&s.push(p),c=T(r);break n}p.componentWillUpdate!=null&&p.componentWillUpdate(E,p.__s,k),D&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(h,_,x)})}if(p.context=k,p.props=E,p.__P=e,p.__e=!1,A=t.__r,te=0,D)p.state=p.__s,p.__d=!1,A&&A(n),d=p.render(p.props,p.state,p.context),g.push.apply(p.__h,p._sb),p._sb=[];else do p.__d=!1,A&&A(n),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++te<25);p.state=p.__s,p.getChildContext!=null&&(i=y(y({},i),p.getChildContext())),D&&!m&&p.getSnapshotBeforeUpdate!=null&&(x=p.getSnapshotBeforeUpdate(h,_)),j=d!=null&&d.type===C&&d.key==null?ce(d.props.children):d,c=ee(e,v(j)?j:[j],n,r,i,a,o,s,c,l,u),p.base=n.__e,n.__u&=-161,p.__h.length&&s.push(p),S&&(p.__E=p.__=null)}catch(e){if(s.length=f,n.__v=null,l||o!=null){if(e.then){for(n.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o!=null&&(o[o.indexOf(c)]=null),n.__e=c}else if(o!=null)for(ne=o.length;ne--;)b(o[ne])}else n.__e=r.__e;n.__k??=r.__k||[],e.then||oe(n),t.__e(e,n,r)}}else o==null&&n.__v==r.__v?(n.__k=r.__k,n.__e=r.__e):c=n.__e=le(r.__e,n,r,i,a,o,s,l,u);return(d=t.diffed)&&d(n),128&n.__u?void 0:c}function oe(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(oe))}function se(e,n,r){for(var i=0;i<r.length;i++)ue(r[i],r[++i],r[++i]);t.__c&&t.__c(n,e),e.some(function(n){try{e=n.__h,n.__h=[],e.some(function(e){e.call(n)})}catch(e){t.__e(e,n.__v)}})}function ce(e){return typeof e!=`object`||!e||e.__b>0?e:v(e)?e.map(ce):e.constructor===void 0?y({},e):null}function le(n,r,i,a,o,s,c,l,u){var d,f,p,m,g,_,y,x=i.props||h,S=r.props,C=r.type;if(C==`svg`?o=`http://www.w3.org/2000/svg`:C==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((g=s[d])&&`setAttribute`in g==!!C&&(C?g.localName==C:g.nodeType==3)){n=g,s[d]=null;break}}if(n==null){if(C==null)return document.createTextNode(S);n=document.createElementNS(o,C,S.is&&S),l&&=(t.__m&&t.__m(r,s),!1),s=null}if(C==null)x===S||l&&n.data==S||(n.data=S);else{if(s=C==`textarea`&&S.defaultValue!=null?null:s&&e.call(n.childNodes),!l&&s!=null)for(x={},d=0;d<n.attributes.length;d++)x[(g=n.attributes[d]).name]=g.value;for(d in x)g=x[d],d==`dangerouslySetInnerHTML`?p=g:d==`children`||d in S||d==`value`&&`defaultValue`in S||d==`checked`&&`defaultChecked`in S||re(n,d,null,g,o);for(d in S)g=S[d],d==`children`?m=g:d==`dangerouslySetInnerHTML`?f=g:d==`value`?_=g:d==`checked`?y=g:l&&typeof g!=`function`||x[d]===g||re(n,d,g,x[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==n.innerHTML)||(n.innerHTML=f.__html),r.__k=[];else if(p&&(n.innerHTML=``),ee(r.type==`template`?n.content:n,v(m)?m:[m],r,i,a,C==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&T(i,0),l,u),s!=null)for(d=s.length;d--;)b(s[d]);l&&C!=`textarea`||(d=`value`,C==`progress`&&_==null?n.removeAttribute(`value`):_!=null&&(_!==n[d]||C==`progress`&&!_||C==`option`&&_!=x[d])&&re(n,d,_,x[d],o),d=`checked`,y!=null&&y!=n[d]&&re(n,d,y,x[d],o))}return n}function ue(e,n,r){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&n==null||(e.__u=e(n))}else e.current=n}catch(e){t.__e(e,r)}}function de(e,n,r){var i,a;if(t.unmount&&t.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||ue(i,null,n)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){t.__e(e,n)}i.base=i.__P=i.__n=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&de(i[a],n,r||typeof e.type!=`function`);r||b(e.__e),e.__c=e.__=e.__e=void 0}function fe(e,t,n){return this.constructor(e,n)}function pe(n,r,i){var a,o,s,c;r==document&&(r=document.documentElement),t.__&&t.__(n,r),o=(a=typeof i==`function`)?null:i&&i.__k||r.__k,s=[],c=[],ae(r,n=(!a&&i||r).__k=x(C,null,[n]),o||h,h,r.namespaceURI,!a&&i?[i]:o?null:r.firstChild?e.call(r.childNodes):null,s,!a&&i?i:o?o.__e:r.firstChild,a,c),se(s,n,c),n.props.children=null}function N(e){function t(e){var n,r;return this.getChildContext||(n=new Set,(r={})[t.__c]=this,this.getChildContext=function(){return r},this.componentWillUnmount=function(){n=null},this.shouldComponentUpdate=function(e){this.props.value!=e.value&&n.forEach(function(e){e.__e=!0,O(e)})},this.sub=function(e){n.add(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n&&n.delete(e),t&&t.call(e)}}),e.children}return t.__c=`__cC`+m++,t.__=e,t.Provider=t.__l=(t.Consumer=function(e,t){return e.children(t)}).contextType=t,t}e=g.slice,t={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},n=0,w.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=y({},this.state);typeof e==`function`&&(e=e(y({},n),this.props)),e&&y(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),O(this))},w.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),O(this))},w.prototype.render=C,r=[],a=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,o=function(e,t){return e.__v.__b-t.__v.__b},k.__r=0,s=Math.random().toString(8),c=`__d`+s,l=`__a`+s,u=/(PointerCapture)$|Capture$/i,d=0,f=ie(!1),p=ie(!0),m=0;var P,F,me,he,I=0,ge=[],L=t,_e=L.__b,ve=L.__r,ye=L.diffed,be=L.__c,xe=L.unmount,Se=L.__;function Ce(e,t){L.__h&&L.__h(F,e,I||t),I=0;var n=F.__H||(F.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function R(e){return I=1,we(Pe,e)}function we(e,t,n){var r=Ce(P++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Pe(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=F,!F.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=!1,o=r.__c.props!==e;if(r.__c.__H.__.some(function(e){if(e.__N){i=!0;var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a){var s=a.call(this,e,t,n);return i?s||o:s}return!i||o};F.__f=!0;var a=F.shouldComponentUpdate,o=F.componentWillUpdate;F.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},F.shouldComponentUpdate=i}return r.__N||r.__}function z(e,t){var n=Ce(P++,3);!L.__s&&Ne(n.__H,t)&&(n.__=e,n.u=t,F.__H.__h.push(n))}function Te(e){return I=5,Ee(function(){return{current:e}},[])}function Ee(e,t){var n=Ce(P++,7);return Ne(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function De(e,t){return I=8,Ee(function(){return e},t)}function B(e){var t=F.context[e.__c],n=Ce(P++,9);return n.c=e,t?(n.__??(n.__=!0,t.sub(F)),t.props.value):e.__}function Oe(){for(var e;e=ge.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(je),t.__h.some(Me),t.__h=[]}catch(n){t.__h=[],L.__e(n,e.__v)}}}L.__b=function(e){F=null,_e&&_e(e)},L.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Se&&Se(e,t)},L.__r=function(e){ve&&ve(e),P=0;var t=(F=e.__c).__H;t&&(me===F?(t.__h=[],F.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(je),t.__h.some(Me),t.__h=[],P=0)),me=F},L.diffed=function(e){ye&&ye(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ge.push(t)!==1&&he===L.requestAnimationFrame||((he=L.requestAnimationFrame)||Ae)(Oe)),t.__H.__.some(function(e){e.u&&=(e.__H=e.u,void 0)})),me=F=null},L.__c=function(e,t){t.some(function(e){try{e.__h.some(je),e.__h=e.__h.filter(function(e){return!e.__||Me(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],L.__e(n,e.__v)}}),be&&be(e,t)},L.unmount=function(e){xe&&xe(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{je(e)}catch(e){t=e}}),n.__H=void 0,t&&L.__e(t,n.__v))};var ke=typeof requestAnimationFrame==`function`;function Ae(e){var t,n=function(){clearTimeout(r),ke&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);ke&&(t=requestAnimationFrame(n))}function je(e){var t=F,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),F=t}function Me(e){var t=F;e.__c=e.__(),F=t}function Ne(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function Pe(e,t){return typeof t==`function`?t(e):t}var Fe=`${window.__CONSENTI_CONFIG__?.basePath??`/consenti`}/admin/v1`,Ie=`consenti:session-expired`;function Le(){return localStorage.getItem(`consenti_token`)}var V=class extends Error{constructor(e,t){super(t),this.status=e}};function Re(e,t){if(e instanceof V)try{let t=JSON.parse(e.message);if(t.error)return t.error}catch{}return t}async function H(e,t){let n=Le(),r=await fetch(`${Fe}${e}`,{...t,headers:{"Content-Type":`application/json`,...n?{Authorization:`Bearer ${n}`}:{},...t?.headers}});if(r.status===401)throw window.dispatchEvent(new Event(Ie)),new V(401,`Unauthorized`);if(!r.ok){let e=await r.text().catch(()=>r.statusText);throw new V(r.status,e)}if(r.status!==204)return r.json()}function ze(e){return e?.match(/filename="?([^";]+)"?/)?.[1]??null}async function Be(e){let t=Le(),n=await fetch(`${Fe}${e}`,{headers:t?{Authorization:`Bearer ${t}`}:{}});if(n.status===401)throw window.dispatchEvent(new Event(Ie)),new V(401,`Unauthorized`);if(!n.ok){let e=await n.text().catch(()=>n.statusText);throw new V(n.status,e)}let r=await n.blob(),i=ze(n.headers.get(`content-disposition`))??`export`,a=URL.createObjectURL(r),o=document.createElement(`a`);o.href=a,o.download=i,o.style.display=`none`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(a)}var Ve=0;Array.isArray;function U(e,n,r,i,a,o){n||={};var s,c,l=n;if(`ref`in l)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:e,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Ve,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return t.vnode&&t.vnode(u),u}var W=`consenti_token`,He=18e5,Ue=6e4,We=[`mousemove`,`keydown`,`click`,`scroll`,`touchstart`];function Ge(e){if(!e)return null;try{let t=e.split(`.`)[1];if(!t)return null;let n=JSON.parse(atob(t.replace(/-/g,`+`).replace(/_/g,`/`))),r=n.exp;return r&&r<Math.floor(Date.now()/1e3)?null:{sub:n.sub,email:n.email,roles:n.roles??[],permissions:n.permissions??[]}}catch{return null}}var Ke=N({user:null,token:null,login:()=>{},logout:()=>{}});function qe({children:e}){let[t,n]=R(()=>localStorage.getItem(W)),[r,i]=R(()=>Ge(localStorage.getItem(W))),a=Te(Date.now()),o=e=>{localStorage.setItem(W,e),n(e),i(Ge(e))},s=()=>{localStorage.removeItem(W),n(null),i(null),window.location.hash=`#/login`};return z(()=>(window.addEventListener(Ie,s),()=>window.removeEventListener(Ie,s)),[]),z(()=>{let e=()=>{a.current=Date.now()};for(let t of We)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of We)window.removeEventListener(t,e)}},[]),z(()=>{let e=setInterval(()=>{localStorage.getItem(W)&&(Date.now()-a.current>=He?s():H(`/auth/refresh`,{method:`POST`}).then(e=>o(e.token)).catch(()=>{}))},Ue);return()=>clearInterval(e)},[]),U(Ke.Provider,{value:{user:r,token:t,login:o,logout:s},children:e})}function G(){return B(Ke)}var Je=N({theme:`light`,toggle:()=>{}});function Ye({children:e}){let[t,n]=R(()=>{try{return localStorage.getItem(`dashboard-theme`)??`light`}catch{return`light`}});return z(()=>{document.documentElement.classList.toggle(`dark`,t===`dark`);try{localStorage.setItem(`dashboard-theme`,t)}catch{}},[t]),U(Je.Provider,{value:{theme:t,toggle:()=>n(e=>e===`dark`?`light`:`dark`)},children:e})}var Xe=()=>B(Je),Ze={appName:`Consenti`,appLogoPath:`./logo-dark.svg`,hidePoweredBy:!1};function Qe(){let e=window.__CONSENTI_CONFIG__;return e?{appName:e.appName,appLogoPath:e.appLogoPath,hidePoweredBy:e.hidePoweredBy}:Ze}var $e=N(Ze);function et({children:e}){let[t]=R(Qe);return U($e.Provider,{value:t,children:e})}function tt(){return B($e)}function nt(e,t){for(var n in t)e[n]=t[n];return e}function rt(e,t){for(var n in e)if(n!==`__source`&&!(n in t))return!0;for(var r in t)if(r!==`__source`&&e[r]!==t[r])return!0;return!1}function it(e,t){this.props=e,this.context=t}(it.prototype=new w).isPureReactComponent=!0,it.prototype.shouldComponentUpdate=function(e,t){return rt(this.props,e)||rt(this.state,t)};var at=t.__b;t.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),at&&at(e)};var ot=typeof Symbol<`u`&&Symbol.for&&Symbol.for(`react.forward_ref`)||3911;function st(e){function t(t){var n=nt({},t);return delete n.ref,e(n,t.ref||null)}return t.$$typeof=ot,t.render=e,t.prototype.isReactComponent=t.__f=!0,t.displayName=`ForwardRef(`+(e.displayName||e.name)+`)`,t}var ct=t.__e;t.__e=function(e,t,n,r){if(e.then){for(var i,a=t;a=a.__;)if((i=a.__c)&&i.__c)return t.__e??(t.__e=n.__e,t.__k=n.__k||[]),i.__c(e,t)}ct(e,t,n,r)};var lt=t.unmount;function ut(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach(function(e){typeof e.__c==`function`&&e.__c()}),e.__c.__H=null),(e=nt({},e)).__c!=null&&(e.__c.__P===n&&(e.__c.__P=t),e.__c.__e=!0,e.__c=null),e.__k=e.__k&&e.__k.map(function(e){return ut(e,t,n)})),e}function dt(e,t,n){return e&&n&&(e.__v=null,e.__k=e.__k&&e.__k.map(function(e){return dt(e,t,n)}),e.__c&&e.__c.__P===t&&(e.__e&&n.appendChild(e.__e),e.__c.__e=!0,e.__c.__P=n)),e}function K(){this.__u=0,this.o=null,this.__b=null}function ft(e){var t=e.__&&e.__.__c;return t&&t.__a&&t.__a(e)}function q(e){var t,n,r,i=null;function a(a){if(t||(t=e()).then(function(e){e&&(i=e.default||e),r=!0},function(e){n=e,r=!0}),n)throw n;if(!r)throw t;return i?x(i,a):null}return a.displayName=`Lazy`,a.__f=!0,a}function pt(){this.i=null,this.l=null}t.unmount=function(e){var t=e.__c;t&&(t.__z=!0),t&&t.__R&&t.__R(),t&&32&e.__u&&(e.type=null),lt&&lt(e)},(K.prototype=new w).__c=function(e,t){var n=t.__c,r=this;r.o??=[],r.o.push(n);var i=ft(r.__v),a=!1,o=function(){a||r.__z||(a=!0,n.__R=null,i?i(c):c())};n.__R=o;var s=n.__P;n.__P=null;var c=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=dt(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.o.pop();)t.__P=s,t.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(o,o)},K.prototype.componentWillUnmount=function(){this.o=[]},K.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement(`div`),r=this.__v.__k[0].__c;this.__v.__k[0]=ut(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&x(C,null,e.fallback);return i&&(i.__u&=-33),[x(C,null,t.__a?null:e.children),i]};var mt=function(e,t,n){if(++n[1]===n[0]&&e.l.delete(t),e.props.revealOrder&&(e.props.revealOrder[0]!==`t`||!e.l.size))for(n=e.i;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;e.i=n=n[2]}};function ht(e){return this.getChildContext=function(){return e.context},e.children}function gt(e){var t=this,n=e.h;if(t.componentWillUnmount=function(){pe(null,t.v),t.v=null,t.h=null},t.h&&t.h!==n&&t.componentWillUnmount(),!t.v){for(var r=t.__v;r!==null&&!r.__m&&r.__!==null;)r=r.__;t.h=n,t.v={nodeType:1,parentNode:n,childNodes:[],__k:{__m:r.__m},contains:function(){return!0},namespaceURI:n.namespaceURI,insertBefore:function(e,n){this.childNodes.push(e),t.h.insertBefore(e,n)},removeChild:function(e){this.childNodes.splice(this.childNodes.indexOf(e)>>>1,1),t.h.removeChild(e)}}}pe(x(ht,{context:t.context},e.__v),t.v)}function _t(e,t){var n=x(gt,{__v:e,h:t});return n.containerInfo=t,n}(pt.prototype=new w).__a=function(e){var t=this,n=ft(t.__v),r=t.l.get(e);return r[0]++,function(i){var a=function(){t.props.revealOrder?(r.push(i),mt(t,e,r)):i()};n?n(a):a()}},pt.prototype.render=function(e){this.i=null,this.l=new Map;var t=j(e.children);e.revealOrder&&e.revealOrder[0]===`b`&&t.reverse();for(var n=t.length;n--;)this.l.set(t[n],this.i=[1,0,this.i]);return e.children},pt.prototype.componentDidUpdate=pt.prototype.componentDidMount=function(){var e=this;this.l.forEach(function(t,n){mt(e,n,t)})};var vt=typeof Symbol<`u`&&Symbol.for&&Symbol.for(`react.element`)||60103,yt=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,bt=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,xt=/[A-Z0-9]/g,St=typeof document<`u`,Ct=function(e){return(typeof Symbol<`u`&&typeof Symbol()==`symbol`?/fil|che|rad/:/fil|che|ra/).test(e)};w.prototype.isReactComponent=!0,[`componentWillMount`,`componentWillReceiveProps`,`componentWillUpdate`].forEach(function(e){Object.defineProperty(w.prototype,e,{configurable:!0,get:function(){return this[`UNSAFE_`+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var wt=t.event;t.event=function(e){return wt&&(e=wt(e)),e.persist=function(){},e.isPropagationStopped=function(){return this.cancelBubble},e.isDefaultPrevented=function(){return this.defaultPrevented},e.nativeEvent=e};var Tt={configurable:!0,get:function(){return this.class}},Et=t.vnode;t.vnode=function(e){typeof e.type==`string`&&function(e){var t=e.props,n=e.type,r={},i=n.indexOf(`-`)==-1;for(var a in t){var o=t[a];if(!(a===`value`&&`defaultValue`in t&&o==null||St&&a===`children`&&n===`noscript`||a===`class`||a===`className`)){var s=a.toLowerCase();a===`defaultValue`&&`value`in t&&t.value==null?a=`value`:a===`download`&&!0===o?o=``:s===`translate`&&o===`no`?o=!1:s[0]===`o`&&s[1]===`n`?s===`ondoubleclick`?a=`ondblclick`:s!==`onchange`||n!==`input`&&n!==`textarea`||Ct(t.type)?s===`onfocus`?a=`onfocusin`:s===`onblur`?a=`onfocusout`:bt.test(a)&&(a=s):s=a=`oninput`:i&&yt.test(a)?a=a.replace(xt,`-$&`).toLowerCase():o===null&&(o=void 0),s===`oninput`&&r[a=s]&&(a=`oninputCapture`),r[a]=o}}n==`select`&&(r.multiple&&Array.isArray(r.value)&&(r.value=j(t.children).forEach(function(e){e.props.selected=r.value.indexOf(e.props.value)!=-1})),r.defaultValue!=null&&(r.value=j(t.children).forEach(function(e){e.props.selected=r.multiple?r.defaultValue.indexOf(e.props.value)!=-1:r.defaultValue==e.props.value}))),t.class&&!t.className?(r.class=t.class,Object.defineProperty(r,"className",Tt)):t.className&&(r.class=r.className=t.className),e.props=r}(e),e.$$typeof=vt,Et&&Et(e)};var Dt=t.__r;t.__r=function(e){Dt&&Dt(e),e.__c};var Ot=t.diffed;t.diffed=function(e){Ot&&Ot(e);var t=e.props,n=e.__e;n!=null&&e.type===`textarea`&&`value`in t&&t.value!==n.value&&(n.value=t.value==null?``:t.value)};var kt=e=>e?.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase();function At(e,t,n=[]){if(t==null)throw Error(`[lucide]: iconNode is required when icon name is used`);return{name:kt(e),size:24,node:t,...n.length>0?{aliases:n}:{}}}var jt=e=>{let t=``,n=!1;for(let r of e)r===`-`||r===`_`||r<=` `?n=t.length>0:(t.length===0?t+=r.toLowerCase():t+=n?r.toUpperCase():r,n=!1);return t},Mt=e=>{let t=jt(e);return t.charAt(0).toUpperCase()+t.slice(1)},Nt=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),J={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`};function Pt(e){return e!=null}function Ft(e,t={}){let n=t.attributeNames??{},r=e=>n[e]??e,i=e.size??e.width??J.width,a=e.size??e.height??J.height,o=e.aliases?.filter(e=>typeof e==`string`&&e.trim()!==``).map(e=>`lucide-${e}`)??[],s=[...e.name?[`lucide-${e.name}`]:[],...o],c=t.className?.split(` `).filter(Boolean)??[],l=t.includeDefaultClasses===!1?Nt(...c):Nt(`lucide`,...s,...c),u=t.absoluteStrokeWidth?Number(t.strokeWidth??J[`stroke-width`])*Number(e.size??e.width??J.width)/Number(t.size??t.width??J.width):t.strokeWidth??J[`stroke-width`];return[`svg`,{...Object.entries(J).reduce((e,[t,n])=>(e[r(t)]=n,e),{}),...`color`in t&&t.color&&{[r(`stroke`)]:t.color},...`size`in t&&Pt(t.size)&&{[r(`width`)]:t.size,[r(`height`)]:t.size},...`width`in t&&Pt(t.width)&&{[r(`width`)]:t.width},...`height`in t&&Pt(t.height)&&{[r(`height`)]:t.height},[r(`stroke-width`)]:u,...l&&{[r(`class`)]:l},[r(`viewBox`)]:`0 0 ${i} ${a}`,...t.hasA11yProp===!1?{[r(`aria-hidden`)]:`true`}:{},...`attributes`in t&&t.attributes},e.node.map(e=>{let[n,i,a]=e,o=t.nonScalingStroke?{[r(`vector-effect`)]:`non-scaling-stroke`,...i}:i;return a?[n,o,a]:[n,o]})]}function It(e,t={}){return Ft(e,{...t,attributeNames:{...t.attributeNames,class:`className`,"stroke-width":`strokeWidth`,"stroke-linecap":`strokeLinecap`,"stroke-linejoin":`strokeLinejoin`,"vector-effect":`vectorEffect`}})}var Lt=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},Rt=N({}),zt=()=>B(Rt),Bt=st(({color:e,size:t,width:n,height:r,strokeWidth:i,absoluteStrokeWidth:a,nonScalingStroke:o,className:s=``,children:c,iconNode:l=[],icon:u={node:l,aliases:[],size:24},...d},f)=>{let{size:p=24,strokeWidth:m=2,absoluteStrokeWidth:h=!1,nonScalingStroke:g=!1,color:_=`currentColor`,className:v=``}=zt()??{},y=!!c||Lt(d),[b,S,C=[]]=It(u,{color:e??_,width:n??t??p,height:r??t??p,strokeWidth:i??m,absoluteStrokeWidth:a??h,nonScalingStroke:o??g,className:Nt(v,s),hasA11yProp:y,attributes:d});return x(b,{ref:f,...S},[...C.map(([e,t])=>x(e,t)),...Array.isArray(c)?c:[c]])});function Y(e,t=[],n=[]){let r=typeof e==`string`?At(e,t,n):e,i=st(({className:e,...t},n)=>x(Bt,{ref:n,icon:r,className:e,...t}));return r.name&&(i.displayName=Mt(r.name)),i}var Vt={name:`chart-column`,size:24,node:[[`path`,{d:`M3 3v16a2 2 0 0 0 2 2h16`,key:`c24i48`}],[`path`,{d:`M18 17V9`,key:`2bz60n`}],[`path`,{d:`M13 17V5`,key:`1frdt8`}],[`path`,{d:`M8 17v-3`,key:`17ska0`}]],aliases:[`bar-chart-3`]};Vt.node;var Ht=Y(Vt),Ut={name:`chevron-down`,size:24,node:[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]};Ut.node;var Wt=Y(Ut),Gt={name:`chevron-left`,size:24,node:[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]};Gt.node;var Kt=Y(Gt),qt={name:`chevron-right`,size:24,node:[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]};qt.node;var Jt=Y(qt),Yt={name:`circle-question-mark`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`help-circle`,`circle-help`]};Yt.node;var Xt=Y(Yt),Zt={name:`clipboard-list`,size:24,node:[[`rect`,{width:`8`,height:`4`,x:`8`,y:`2`,rx:`1`,ry:`1`,key:`tgr4d6`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2`,key:`116196`}],[`path`,{d:`M12 11h4`,key:`1jrz19`}],[`path`,{d:`M12 16h4`,key:`n85exb`}],[`path`,{d:`M8 11h.01`,key:`1dfujw`}],[`path`,{d:`M8 16h.01`,key:`18s6g9`}]]};Zt.node;var Qt=Y(Zt),$t={name:`cookie`,size:24,node:[[`path`,{d:`M11 17h.01`,key:`dukryu`}],[`path`,{d:`M11.496 2c.324-.016.558.292.529.615a4 4 0 004.235 4.368.713.713 0 01.758.757 4 4 0 004.366 4.237c.323-.03.63.204.614.527a10 10 0 01-2.915 6.566A1 1 0 114.93 4.918 10 10 0 0111.496 2`,key:`1x76et`}],[`path`,{d:`M12 12h.01`,key:`1mp3jc`}],[`path`,{d:`M16 16h.01`,key:`1f9h7w`}],[`path`,{d:`M16 3h.01`,key:`ll0zb8`}],[`path`,{d:`M21 4h.01`,key:`uw58yv`}],[`path`,{d:`M21 8h.01`,key:`17axm7`}],[`path`,{d:`M7 14h.01`,key:`1qa3f1`}],[`path`,{d:`M9 8h.01`,key:`1jwowd`}]]};$t.node;var en=Y($t),tn={name:`eye-off`,size:24,node:[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]};tn.node;var nn=Y(tn),rn={name:`eye`,size:24,node:[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]};rn.node;var an=Y(rn),on={name:`globe`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]};on.node;var sn=Y(on),cn={name:`key`,size:24,node:[[`path`,{d:`m2 21 9.6-9.6`,key:`9l79m3`}],[`path`,{d:`m7.5 15.5 2.3 2.3a1 1 0 0 1 0 1.4l-2.1 2.1a1 1 0 0 1-1.4 0L4 19`,key:`fw8biw`}],[`circle`,{cx:`15.5`,cy:`7.5`,r:`5.5`,key:`4wxmhb`}]]};cn.node;var ln=Y(cn),un={name:`layout-dashboard`,size:24,node:[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]};un.node;var dn=Y(un),fn={name:`log-out`,size:24,node:[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]};fn.node;var pn=Y(fn),mn={name:`moon`,size:24,node:[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]};mn.node;var hn=Y(mn),gn={name:`palette`,size:24,node:[[`path`,{d:`M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z`,key:`e79jfc`}],[`circle`,{cx:`13.5`,cy:`6.5`,r:`.5`,fill:`currentColor`,key:`1okk4w`}],[`circle`,{cx:`17.5`,cy:`10.5`,r:`.5`,fill:`currentColor`,key:`f64h9f`}],[`circle`,{cx:`6.5`,cy:`12.5`,r:`.5`,fill:`currentColor`,key:`qy21gx`}],[`circle`,{cx:`8.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`fotxhn`}]]};gn.node;var _n=Y(gn),vn={name:`plug`,size:24,node:[[`path`,{d:`M12 22v-5`,key:`1ega77`}],[`path`,{d:`M15 8V2`,key:`18g5xt`}],[`path`,{d:`M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z`,key:`1xoxul`}],[`path`,{d:`M9 8V2`,key:`14iosj`}]]};vn.node;var yn=Y(vn),bn={name:`satellite-dish`,size:24,node:[[`path`,{d:`M18 12a6 6 0 00-6-6`,key:`9b1kp8`}],[`path`,{d:`M2.824 10.459a8 8 0 0010.717 10.717c.558-.276.623-1.012.183-1.452l-9.448-9.448c-.44-.44-1.176-.375-1.452.183`,key:`1jwhal`}],[`path`,{d:`M22 12A10 10 0 0012 2`,key:`m7rnro`}],[`path`,{d:`m9 15 4-4`,key:`1tjxz5`}]]};bn.node;var xn=Y(bn),Sn={name:`scroll-text`,size:24,node:[[`path`,{d:`M15 12h-5`,key:`r7krc0`}],[`path`,{d:`M15 8h-5`,key:`1khuty`}],[`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`,key:`zz82l3`}],[`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3`,key:`1ph1d7`}]]};Sn.node;var Cn=Y(Sn),wn={name:`settings`,size:24,node:[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]};wn.node;var Tn=Y(wn),En={name:`shield-check`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]};En.node;var Dn=Y(En),On={name:`shield`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]};On.node;var kn=Y(On),An={name:`sun`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]};An.node;var jn=Y(An),Mn={name:`ticket-slash`,size:24,node:[[`path`,{d:`M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z`,key:`qn84l0`}],[`path`,{d:`m9.5 14.5 5-5`,key:`qviqfa`}]]};Mn.node;var Nn=Y(Mn),Pn={name:`users`,size:24,node:[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`path`,{d:`M16 3.128a4 4 0 0 1 0 7.744`,key:`16gr8j`}],[`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`,key:`kshegd`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}]]};Pn.node;var Fn=Y(Pn),In={_section_nav:`── Navigation ──────────────────────────────────────────`,"nav.dashboard":`Dashboard`,"nav.consentBanners":`Consent Banners`,"nav.consentTemplates":`Consent Templates`,"nav.uiTemplates":`UI Templates`,"nav.profiles":`Profiles`,"nav.consents":`Consents`,"nav.visitors":`Visitors`,"nav.users":`Users`,"nav.roles":`Roles`,"nav.sites":`Sites`,"nav.vendors":`TCF Vendors`,"nav.reports":`Reports`,"nav.audit":`Audit Log`,"nav.api":`API`,"nav.settings":`Settings`,"nav.adminDashboard":`Admin Dashboard`,_section_layout:`── Layout ───────────────────────────────────────────`,"layout.expandSidebar":`Expand sidebar`,"layout.collapseSidebar":`Collapse sidebar`,"layout.signOut":`Sign out`,"layout.toggleDark":`Switch to dark mode`,"layout.toggleLight":`Switch to light mode`,"layout.poweredBy":`Powered by`,_section_common:`── Common ───────────────────────────────────────────`,"common.loading":`Loading…`,"common.searching":`Searching…`,"common.save":`Save`,"common.saving":`Saving…`,"common.cancel":`Cancel`,"common.close":`Close`,"common.delete":`Delete`,"common.edit":`Edit`,"common.create":`Create`,"common.confirm":`Confirm`,"common.noData":`No data`,"common.search":`Search…`,"common.perPage":`Per page`,"common.goToPage":`Go to page`,"common.pageOfTotal":`Page {{page}} of {{total}}`,"common.noResults":`No results match your search.`,"common.exportCsv":`Export CSV`,"common.duplicate":`Duplicate`,"common.active":`Active`,"common.inactive":`Inactive`,"common.name":`Name`,"common.email":`Email`,"common.status":`Status`,"common.created":`Created`,"common.id":`ID`,"common.add":`Add`,"common.remove":`Remove`,"common.revoke":`Revoke`,"common.required":`Required`,"common.version":`Version`,"common.locale":`Locale`,"common.country":`Country`,"common.source":`Source`,"common.grantAll":`Grant all`,"common.revokeAll":`Revoke all`,"common.granted":`granted`,"common.page":`Page {{n}}`,"common.prev":`Prev`,"common.next":`Next`,"common.you":`You`,"common.default":`default`,"common.hide":`Hide`,"common.show":`Show`,"common.activate":`Activate`,"common.deactivate":`Deactivate`,"common.newRole":`New Role`,"common.copyToClipboard":`Copy to clipboard`,"common.back":`Back`,"common.copyId":`Copy ID`,"common.mandatory":`mandatory`,"common.optional":`Optional`,"common.roles":`Roles`,"common.showPassword":`Show password`,"common.hidePassword":`Hide password`,"common.updated":`Updated`,"common.locked":`Locked`,_section_locale:`── Locale Switcher ─────────────────────────────────`,"locale.en":`English`,"locale.switcherAria":`Switch language`,_section_login:`── Login ────────────────────────────────────────────`,"login.title":`{{appName}} Admin`,"login.subtitle":`Sign in to your account`,"login.email":`Email`,"login.emailPlaceholder":`admin@example.com`,"login.password":`Password`,"login.submit":`Sign in`,"login.submitting":`Signing in…`,"login.error.invalid":`Invalid email or password`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"login.devSignIn":`⚡ Dev: sign in as user@consenti.dev`,_section_setupWizard:`── Setup Wizard ─────────────────────────────────`,"setupWizard.welcome.title":`Welcome to {{appName}}`,"setupWizard.welcome.body":`Let's get your consent management set up. This will only take a minute — we'll show you what's configured and help you install a starter set of compliance profiles.`,"setupWizard.welcome.docsLink":`View documentation`,"setupWizard.welcome.howItWorksLink":`See how Consenti works`,"setupWizard.welcome.getStarted":`Get started`,"setupWizard.welcome.skip":`Skip setup`,"setupWizard.config.title":`Your configuration`,"setupWizard.config.subtitle":`Here's what Consenti resolved from your config and environment variables, merged with sensible defaults. Secrets are hidden.`,"setupWizard.back":`Back`,"setupWizard.continue":`Continue`,"setupWizard.profiles.title":`Default compliance profiles`,"setupWizard.profiles.subtitle":`Consenti ships 8 pre-built compliance profiles covering the major global privacy regulations. Choose which ones to install now — you can always add more later.`,"setupWizard.profiles.selectAll":`Install all 8 default profiles`,"setupWizard.profiles.installAndContinue":`Install & continue`,"setupWizard.profiles.skipAndContinue":`Skip & continue`,"setupWizard.profiles.error":`Could not install the selected profiles. You can try again later from Profiles.`,"setupWizard.confirmation.title":`You're all set`,"setupWizard.confirmation.seededSummary":`{{count}} compliance profile(s) installed.`,"setupWizard.confirmation.noneSeeded":`No profiles were installed — you can create one anytime from Profiles.`,"setupWizard.confirmation.readinessTitle":`Before you go live`,"setupWizard.confirmation.readinessJsonStorage":`You're using the JSON file storage driver — fine for development, but switch to a database driver (node:sqlite, PostgreSQL, MySQL, MongoDB) for production.`,"setupWizard.confirmation.readinessDefaultCredentials":`No admin credentials were configured — Consenti is using demo credentials. Set CONSENTI_ADMIN_EMAIL and CONSENTI_ADMIN_PASSWORD before going to production.`,"setupWizard.confirmation.howItWorks":`See How Consenti Works`,"setupWizard.confirmation.goToDashboard":`Go to Dashboard`,_section_dashboard:`── Dashboard ────────────────────────────────────`,"dashboard.title":`Dashboard`,"dashboard.stats.totalConsents":`Total Consents`,"dashboard.stats.totalVisitors":`Total Visitors`,"dashboard.stats.accepted":`Accepted`,"dashboard.stats.acceptedSub":`≥80% cookies granted`,"dashboard.stats.rejected":`Rejected`,"dashboard.stats.rejectedSub":`≤20% cookies granted`,"dashboard.chart.timeline":`Consents (last 30 days)`,"dashboard.chart.timelineAria":`Consent timeline chart`,"dashboard.chart.countries":`Top Countries`,"dashboard.chart.noData":`No data.`,"dashboard.chart.noCountryData":`No country data.`,"dashboard.gpc.label":`GPC Detection Rate`,"dashboard.gpc.sub":`{{detected}} of {{total}} consents`,"dashboard.viewReports":`View full reports →`,_section_reports:`── Reports ──────────────────────────────────────────`,"reports.title":`Reports`,"reports.filters.from":`From`,"reports.filters.to":`To`,"reports.filters.apply":`Apply`,"reports.optin.total":`Total Decisions`,"reports.optin.granted":`Granted`,"reports.optin.denied":`Denied`,"reports.optin.managed":`Partially Managed`,"reports.optin.byDate":`Opt-in trend`,"reports.optin.byDateAria":`Opt-in decisions over time`,"reports.optin.byLocale":`By locale`,"reports.category.title":`By category`,"reports.legend.granted":`Granted`,"reports.legend.denied":`Denied`,"reports.legend.objected":`Objected`,"reports.legend.managed":`Managed`,_section_consents:`── Consents ─────────────────────────────────────`,"consents.title":`Consent Records`,"consents.filterFrom":`From`,"consents.filterTo":`To`,"consents.filterGpc":`GPC only`,"consents.records":`{{n}} records`,"consents.empty":`No consent records yet.`,"consents.col.visitorId":`Visitor ID`,"consents.col.profile":`Profile`,"consents.col.locale":`Locale`,"consents.col.gpc":`GPC`,"consents.col.age":`Age`,"consents.col.source":`Source`,"consents.col.created":`Created`,"consents.gpcYes":`Yes`,"consents.ageVerified":`Verified`,"consents.searchPlaceholder":`Search visitor, profile, locale, source…`,"consents.detail.title":`Consent Record`,"consents.detail.updated":`Updated`,"consents.detail.consentJson":`Consent data`,"consents.detail.signature":`Signature`,"consents.detail.signed":`Signed`,"consents.detail.unsigned":`Not signed`,_section_visitors:`── Visitors ─────────────────────────────────────`,"visitors.title":`Visitors`,"visitors.empty":`No visitors recorded yet.`,"visitors.col.visitorId":`Visitor ID`,"visitors.col.country":`Country`,"visitors.col.firstSeen":`First Seen`,"visitors.col.lastSeen":`Last Seen`,"visitors.searchPlaceholder":`Search visitor ID, country…`,"visitors.detail.title":`Visitor`,"visitors.detail.region":`Region`,"visitors.detail.city":`City`,_section_users:`── Users ────────────────────────────────────────────`,"users.title":`Users`,"users.count":`{{n}} users`,"users.newUser":`+ New User`,"users.createForm.title":`Create User`,"users.createForm.namePlaceholder":`Name`,"users.createForm.emailPlaceholder":`Email`,"users.createForm.passwordPlaceholder":`Password`,"users.createForm.confirmPasswordPlaceholder":`Confirm password`,"users.createForm.selectRole":`Select role…`,"users.createForm.passwordMismatch":`Passwords do not match`,"users.createForm.error":`Failed to create user`,"users.col.status":`Status`,"users.status.active":`Active`,"users.status.inactive":`Inactive`,"users.action.activate":`Activate`,"users.action.deactivate":`Deactivate`,"users.dialog.delete.title":`Delete user "{{name}}"?`,"users.dialog.delete.message":`This user account will be permanently removed.`,"users.allowedSites":`Allowed Sites`,"users.allowedSitesHint":`(leave empty to allow all)`,"users.edit.title":`Edit User: {{name}}`,"users.edit.error.save":`Failed to save changes.`,"users.edit.resetPassword":`Reset Password`,"users.edit.resetPasswordHint":`(leave blank to keep current password)`,"users.edit.newPassword":`New password`,"users.edit.confirmNewPassword":`Confirm new password`,"users.edit.passwordTooShort":`Password must be at least 12 characters`,"users.superAdminLocked":`Super admin accounts are protected and cannot be edited or deleted.`,"users.detail.title":`User`,"users.detail.allSites":`All sites`,_section_roles:`── Roles & Permissions ──────────────────────────`,"roles.title":`Roles & Permissions`,"roles.list.heading":`Roles`,"roles.list.empty":`No roles yet. Create one to get started.`,"roles.form.roleNameLabel":`Role name`,"roles.form.roleNamePlaceholder":`e.g. Editor`,"roles.form.descriptionLabel":`Description`,"roles.form.descriptionPlaceholder":`Optional description`,"roles.perms.heading":`Permissions — {{name}}`,"roles.perms.selectPrompt":`Select a role to manage permissions`,"roles.perms.clickPrompt":`Click a role on the left to view and manage its permissions.`,"roles.perms.noPerms":`No permissions defined in the system.`,"roles.error.load":`Failed to load roles.`,"roles.error.create":`Failed to create role.`,"roles.error.update":`Failed to update role.`,"roles.error.delete":`Failed to delete role.`,"roles.error.perm":`Failed to update permission.`,"roles.dialog.delete.title":`Delete role "{{name}}"?`,"roles.dialog.delete.message":`Users assigned this role will lose its permissions immediately.`,"roles.aria.editRole":`Edit role`,"roles.aria.deleteRole":`Delete role`,"roles.superAdminLocked":`The super_admin role is protected — it cannot be renamed, deleted, or have its permissions changed.`,_section_profiles:`── Profiles ──────────────────────────────────────`,"profiles.title":`Profiles`,"profiles.count":`{{n}} profiles`,"profiles.countSingular":`{{n}} profile`,"profiles.newProfile":`+ New Profile`,"profiles.empty":`No profiles yet. Create one to get started.`,"profiles.search.placeholder":`Search profiles…`,"profiles.filter.status":`Status`,"profiles.filter.active":`Active`,"profiles.filter.inactive":`Inactive`,"profiles.archived.cta":`Archived Profiles`,"profiles.archived.title":`Archived Profiles`,"profiles.archived.back":`Back to profiles`,"profiles.archived.hint":`Profile-id directories found on disk with no matching database entry — deleted profiles whose version snapshots weren't. Click one to browse its version history.`,"profiles.archived.empty":`No archived profiles found.`,"profiles.archived.searchPlaceholder":`Search by profile ID…`,"profiles.archived.col.id":`Profile ID`,"profiles.archived.col.versions":`Versions`,"profiles.archived.col.lastModified":`Last Modified`,"profiles.archived.viewHistory":`View history`,"profiles.col.name":`Name`,"profiles.col.defaultLocale":`Default Locale`,"profiles.col.templates":`Templates`,"profiles.col.created":`Created`,"profiles.template.cookie":`Cookie:`,"profiles.template.ui":`UI:`,"profiles.action.copyId":`Copy profile ID`,"profiles.action.copySlug":`Copy compliance group slug`,"profiles.action.copying":`Copying…`,"profiles.dialog.delete.title":`Delete "{{name}}"?`,"profiles.dialog.delete.message":`This profile and all its locale content will be permanently removed.`,"profiles.dialog.copy.title":`Copy "{{name}}"?`,"profiles.dialog.copy.message":`This profile and all its locale content will be duplicated.`,"profiles.error.copy":`Failed to copy profile.`,"profiles.error.activate":`Failed to activate profile.`,"profiles.error.deactivate":`Failed to deactivate profile.`,_section_profileEditor:`── Profile Editor ───────────────────────────`,"profileEditor.title.new":`New Profile`,"profileEditor.title.edit":`Edit Profile`,"profileEditor.title.loading":`Profile Editor`,"profileEditor.step.config":`Profile Config`,"profileEditor.step.templates":`Templates`,"profileEditor.step.ageGateModal":`Age Gate`,"profileEditor.step.content":`Content`,"profileEditor.step.mainBanner":`Main Banner`,"profileEditor.step.gpcBanner":`GPC Banner`,"profileEditor.step.prefModal":`Pref Modal`,"profileEditor.config.profileName":`Profile Name`,"profileEditor.config.profileNamePlaceholder":`My Website`,"profileEditor.config.defaultLocale":`Default Locale`,"profileEditor.config.allowedDomains":`Allowed Domains`,"profileEditor.config.allowedDomainsHint":`Supports wildcards (*.example.com). Leave empty to allow all.`,"profileEditor.config.regulations":`Compliance Regulations`,"profileEditor.config.reg.gdprLabel":`GDPR`,"profileEditor.config.reg.gdprDesc":`EU/EEA opt-in. No tracking until consent is given. Banner shown on first visit.`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`California opt-out. Cookies default granted. Provide a "Do Not Sell" trigger.`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`California 2023. Opt-out for sale/sharing; opt-in for sensitive data. GPC honored.`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`India 2023. Opt-in like GDPR. GPC not recognised. Data Fiduciary notice required.`,"profileEditor.config.darkMode":`Enable Dark Mode`,"profileEditor.config.darkModeHint":`Applies dark colour tokens to the consent widget for sites with a dark theme.`,"profileEditor.config.dpdpa.heading":`DPDPA — Required Consent Notice Fields`,"profileEditor.config.dpdpa.fiduciary":`Data Fiduciary Name`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`Grievance Officer Email`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`Purpose Description`,"profileEditor.config.dpdpa.purposePlaceholder":`We collect your data to personalise your experience…`,"profileEditor.config.ageGate":`Enable age gate`,"profileEditor.config.ageGateHint":`Ask visitors to confirm their age before showing consent choices. Minimum age varies by regulation — 13 (COPPA), 16 (GDPR Article 8 default).`,"profileEditor.config.ageGateSection.heading":`Age Gate — Required Fields`,"profileEditor.config.ageGateSection.minimumAge":`Minimum age`,"profileEditor.config.ageGateSection.minimumAgeHint":`Common values: 13 (COPPA), 16 (GDPR Article 8 default).`,"profileEditor.config.ageGateSection.requireParentalConsent":`Require parental consent`,"profileEditor.config.ageGateSection.requireParentalConsentHint":`When declined, dispatch a parental-consent request instead of just denying all.`,"profileEditor.templates.cookieTemplate":`Consent Template`,"profileEditor.templates.cookieTemplateHint":`Defines which parameters and categories appear in the preference modal, and each category's legal basis. All fields are derived from the template — read-only in the profile.`,"profileEditor.templates.selectCookie":`— Select a consent template —`,"profileEditor.templates.uiTemplate":`UI Template`,"profileEditor.templates.uiTemplateHint":`Defines banner/modal layout, button count, and category structure. You add text content in Steps 3–5.`,"profileEditor.templates.selectUi":`— Select a UI template —`,"profileEditor.templates.noTemplate":`No template selected.`,"profileEditor.templates.previewPrompt":`Select both a cookie template and a UI template to see a live preview.`,"profileEditor.templates.categoriesCount":`categories`,"profileEditor.templates.buttonsTotal":`buttons total`,"profileEditor.content.loadDefaults":`Load Defaults`,"profileEditor.content.loadDefaultsTitle":`Fill this section with compliance-aware English defaults`,"profileEditor.content.loadDefaultsNotice":`Load Defaults fills English text only — translate using the locale tab bar above.`,"profileEditor.content.importError":`Could not parse the uploaded file. Make sure it matches the Consenti locale template format.`,"profileEditor.content.mainBanner":`Main Banner`,"profileEditor.content.gpcBanner":`GPC Banner`,"profileEditor.content.prefModal":`Preference Modal`,"profileEditor.content.heading":`Heading`,"profileEditor.content.subheading":`Subheading`,"profileEditor.content.bodyText":`Body Text`,"profileEditor.content.introText":`Intro Text (optional)`,"profileEditor.content.buttonLabels":`Button Labels`,"profileEditor.content.categoryHeading":`Category Heading`,"profileEditor.content.categoryDesc":`Category Description`,"profileEditor.content.categoryFallback":`Category {{n}}`,"profileEditor.content.buttonLabelPlaceholder":`Button text…`,"profileEditor.content.categoryDescPlaceholder":`Description of this cookie category…`,"profileEditor.content.liDescription":`Legitimate Interest Description (optional)`,"profileEditor.content.liDescriptionPlaceholder":`We rely on legitimate interest because…`,"profileEditor.content.liDescriptionHint":`Your GDPR balancing-test justification for relying on legitimate interest, shown to visitors. Optional — you can also cover this in the category description above.`,"profileEditor.content.mainBannerHeadingPlaceholder":`We value your privacy`,"profileEditor.content.mainBannerBodyPlaceholder":`We use cookies to improve your experience…`,"profileEditor.content.gpcHeadingPlaceholder":`Global Privacy Control Detected`,"profileEditor.content.prefHeadingPlaceholder":`Privacy Preferences`,"profileEditor.content.prefSubheadingPlaceholder":`Manage your cookie preferences below.`,"profileEditor.content.prefIntroPlaceholder":`Optional intro above categories…`,"profileEditor.content.noContent":`Select a UI template in step 2 to begin editing content.`,"profileEditor.content.loadingTemplate":`Loading template…`,"profileEditor.nav.nextTemplates":`Next: Templates`,"profileEditor.nav.nextContent":`Next: Content`,"profileEditor.nav.nextAgeGate":`Next: Age Gate`,"profileEditor.nav.nextMainBanner":`Next: Main Banner`,"profileEditor.nav.nextGpcBanner":`Next: GPC Banner`,"profileEditor.nav.nextPrefModal":`Next: Pref Modal`,"profileEditor.action.create":`Create Profile`,"profileEditor.action.save":`Save Profile`,"profileEditor.error.nameRequired":`Profile name is required.`,"profileEditor.error.nameRequiredContinue":`Profile name is required before continuing.`,"profileEditor.error.cookieRequired":`Select a consent template.`,"profileEditor.error.cookieContinue":`Select a consent template to continue.`,"profileEditor.error.uiRequired":`Select a UI template.`,"profileEditor.error.uiContinue":`Select a UI template to continue.`,"profileEditor.error.failed":`Failed to save profile.`,"profileEditor.error.load":`Failed to load profile.`,"profileEditor.table.noNoCookies":`No cookies defined in this template.`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`Legal Basis`,"profileEditor.table.mandatory":`Mandatory`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.tcfVendor":`TCF Vendor`,"profileEditor.table.cpraCategory":`CPRA Category`,"profileEditor.table.cookies":`Cookies`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`Import`,"profileEditor.export.jsonTitle":`Export all locale tabs as a single JSON file`,"profileEditor.export.csvTitle":`Download locale content as CSV for translation`,"profileEditor.export.importTitle":`Import JSON (all locales) or CSV (current locale)`,"profileEditor.import.imported":`Imported {{n}} locales: {{list}}`,"profileEditor.import.importedSingular":`Imported 1 locale: {{list}}`,"profileEditor.import.skipped":`Skipped {{n}} unrecognised locale keys: {{list}}`,"profileEditor.import.skippedSingular":`Skipped 1 unrecognised locale key: {{list}}`,"profileEditor.newLink":`+ New ↗`,"profileEditor.config.selectDefaultLocale":`Select default locale…`,"profileEditor.config.complianceGroup":`Compliance Group`,"profileEditor.config.complianceGroupNone":`None / Custom`,"profileEditor.config.customComplianceGroup":`Custom group name`,"profileEditor.config.customComplianceGroupPlaceholder":`e.g. internal-testing`,"profileEditor.config.customComplianceGroupHint":`Lower-kebab-case identifier. The widget's compliance.type config uses this to fetch the profile — required, since there's no other way to address it. Only one profile can be active per name at a time. No compliance-rule defaults are applied (those only exist for the built-in groups above).`,"profileEditor.config.gpcMode":`GPC Signal Mode`,"profileEditor.config.gpcModeDefault":`Default (inherit from compliance group)`,"profileEditor.config.gpcModePlaceholder":`Default`,"profileEditor.config.hidePoweredBy":`Hide "Powered by Consenti"`,"profileEditor.config.hidePoweredByHint":`Remove the branding link from the consent banner.`,"profileEditor.config.allowReceipt":`Allow consent receipt`,"profileEditor.config.allowReceiptHint":`Let visitors download a JSON receipt of their consent choices.`,"profileEditor.config.enhanceAccessibility":`Enhance Accessibility`,"profileEditor.config.enhanceAccessibilityHint":`Applies WCAG 2.1 AA button sizing (44px min-height), visible focus rings, and screen-reader labels to the consent widget.`,"profileEditor.config.showFooterMetadata":`Show Footer Metadata`,"profileEditor.config.showFooterMetadataHint":`Displays a strip in the banner and modal showing Consent ID, Date, Profile Version, and a Privacy Settings link.`,"profileEditor.conflict.title":`Active profile conflict`,"profileEditor.conflict.message":`Profile "{{name}}" is already active for this compliance group. Only one profile can be active per group.`,"profileEditor.conflict.deactivate":`Deactivate "{{name}}" and activate this one`,"profileEditor.conflict.saveInactive":`Save this profile as inactive`,"profileEditor.compliance.errors.heading":`Compliance errors — fix before continuing:`,"profileEditor.compliance.warnings.heading":`Compliance warnings:`,"profileEditor.compliance.warnings.acknowledge":`I acknowledge these warnings and wish to continue`,"profileEditor.compliance.preGrantOverridden":`Pre-grant was overridden for these parameters — this compliance group requires an explicit opt-in, so "Pre Grant" cannot stay enabled.`,"profileEditor.content.selectLocale":`Select locale…`,"profileEditor.content.addLocale":`+ Add locale`,"profileEditor.content.defaultLocaleLabel":`(default)`,"profileEditor.content.copyLocale":`Copy Locale Content`,"profileEditor.content.copyLocaleTitle":`Copy this section's content from another authored locale`,"profileEditor.copyLocale.confirmTitle":`Replace existing content?`,"profileEditor.copyLocale.confirmMessage":`This section already has content in {{locale}}. Copying from {{source}} will remove it and replace it entirely.`,"profileEditor.copyLocale.confirmAction":`Replace`,_section_readability:`── Readability Warnings ─────────────────────────`,"readability.headingTooLong":`Heading is {{n}} characters — keep it under 80 for readability.`,"readability.avgSentenceLong":`Average sentence length is {{n}} words — aim for 25 or fewer.`,"readability.totalWordsLong":`Text is {{n}} words long — consider keeping banner copy under 150 words.`,_section_consentTemplates:`── Consent Templates ─────────────────────────`,"consentTemplates.title":`Consent Templates`,"consentTemplates.count":`{{n}} templates`,"consentTemplates.countSingular":`{{n}} template`,"consentTemplates.new":`+ New Consent Template`,"consentTemplates.empty.title":`No consent templates yet.`,"consentTemplates.empty.hint":`Consent templates define the list of parameters and categories for your consent profiles. Create one to reuse across multiple profiles.`,"consentTemplates.search.placeholder":`Search consent templates…`,"consentTemplates.col.name":`Name`,"consentTemplates.col.cookies":`Cookies`,"consentTemplates.col.categories":`Categories`,"consentTemplates.required":`required`,"consentTemplates.dialog.delete.title":`Delete "{{name}}"?`,"consentTemplates.dialog.delete.message":`This consent template will be permanently removed. Profiles linked to it will lose their parameter and category definitions.`,"consentTemplates.editor.title.new":`New Consent Template`,"consentTemplates.editor.title.edit":`Edit Consent Template`,"consentTemplates.editor.name":`Template Name`,"consentTemplates.editor.namePlaceholder":`e.g. Google Analytics + Ads`,"consentTemplates.editor.nameRequired":`Template name is required.`,"consentTemplates.editor.definitions":`Cookie Definitions`,"consentTemplates.editor.empty":`No cookies defined yet. Add one above.`,"consentTemplates.editor.addCookie":`+ Add Cookie`,"consentTemplates.editor.idNoMatches":`No known keys match — you can still type a custom ID`,"consentTemplates.editor.error.allIds":`All cookies must have an ID.`,"consentTemplates.editor.error.uniqueIds":`Cookie IDs must be unique.`,"consentTemplates.editor.error.failed":`Failed to save template.`,"consentTemplates.editor.error.notFound":`Template not found.`,"consentTemplates.editor.action.create":`Create Template`,"consentTemplates.editor.action.save":`Save Template`,"consentTemplates.editor.showTcf":`TCF Vendors`,"consentTemplates.editor.showCpra":`CPRA Category`,"consentTemplates.editor.infoHint":`Click a column header to learn more`,"consentTemplates.editor.infoUsage":`Usage`,"consentTemplates.editor.infoLaws":`Regulatory guidance`,"consentTemplates.editor.infoExamples":`Examples`,"consentTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"consentTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default list of cookies based on Google Consent Mode`,"consentTemplates.editor.loadDefaultsBtn":`Load Defaults`,"consentTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"consentTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"consentTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
3
3
 
4
4
  Saving will update cookie definitions for all profiles using this template. Continue?`,"consentTemplates.col.id":`Cookie ID`,"cookieTemplates.editor.legalBasis.mandatoryUsage":`Mandatory (Strictly Necessary): The cookie is always granted — the visitor cannot turn it off. Use only for cookies genuinely required for the site to function (session tokens, CSRF, load balancing).`,"cookieTemplates.editor.legalBasis.mandatoryLawName":`ePrivacy Dir. Recital 25`,"cookieTemplates.editor.legalBasis.mandatoryLawText":`"Strictly necessary" cookies are exempt from consent. Do not mark analytics or advertising cookies as Mandatory.`,"cookieTemplates.editor.legalBasis.examples":`Consent: analytics_storage · ad_storage · Legitimate Interest: server-side analytics · Mandatory: session · csrf_token · load_balancer_id`,"cookieTemplates.editor.trackerDetected":`Detected: {{vendor}}`,"consentTemplates.col.idShort":`ID / Name`,"consentTemplates.col.gpc":`Honor GPC Signal`,"consentTemplates.col.gpcShort":`GPC`,"consentTemplates.col.tcfVendor":`TCF Vendor IDs`,"consentTemplates.col.cpraCategory":`CPRA Data Category`,"consentTemplates.col.tcfVendorShort":`TCF Vendor`,"consentTemplates.col.cpraCategoryShort":`CPRA Category`,"consentTemplates.col.purpose":`Cookie Purpose`,"consentTemplates.col.purposeShort":`Purpose`,"consentTemplates.purpose.necessary":`Necessary`,"consentTemplates.purpose.functional":`Functional`,"consentTemplates.purpose.preferences":`Preferences`,"consentTemplates.purpose.analytics":`Analytics`,"consentTemplates.purpose.marketing":`Marketing`,"consentTemplates.editor.purposePlaceholder":`Select purpose…`,"consentTemplates.editor.error.purpose":`Every cookie must have a purpose.`,_section_uiTemplates:`── UI Templates ─────────────────────────────────`,"uiTemplates.title":`UI Templates`,"uiTemplates.count":`{{n}} templates`,"uiTemplates.countSingular":`{{n}} template`,"uiTemplates.new":`+ New UI Template`,"uiTemplates.empty.title":`No UI templates yet.`,"uiTemplates.empty.hint":`UI templates define the visual configuration — positions, buttons, categories — for your consent banners and modals.`,"uiTemplates.search.placeholder":`Search UI templates…`,"uiTemplates.col.name":`Name`,"uiTemplates.col.positions":`Positions`,"uiTemplates.col.buttons":`Buttons`,"uiTemplates.mainBanner":`Main banner:`,"uiTemplates.gpcBanner":`GPC banner:`,"uiTemplates.modal":`Modal:`,"uiTemplates.categories":`{{n}} categories`,"uiTemplates.dialog.delete.title":`Delete "{{name}}"?`,"uiTemplates.dialog.delete.message":`This UI template will be permanently removed. Profiles linked to it will lose their UI settings.`,"uiTemplates.editor.title.new":`New UI Template`,"uiTemplates.editor.title.edit":`Edit UI Template`,"uiTemplates.editor.name":`Template Name`,"uiTemplates.editor.nameRequired":`Template name is required.`,"uiTemplates.editor.namePlaceholder":`e.g. Standard GDPR Layout`,"uiTemplates.editor.loading":`Loading template…`,"uiTemplates.editor.tabMain":`Main Banner`,"uiTemplates.editor.tabGpc":`GPC Banner`,"uiTemplates.editor.tabModal":`Preference Modal`,"uiTemplates.editor.mainBannerHint":`Shown on first visit when no consent has been recorded.`,"uiTemplates.editor.gpcBannerHint":`Shown instead of the main banner when a GPC signal is detected (autoHonorGPC enabled).`,"uiTemplates.editor.error.notFound":`Template not found.`,"uiTemplates.editor.error.buttons":`All buttons must have an id.`,"uiTemplates.editor.error.customButtons":`All "custom" action buttons must have cookies selected.`,"uiTemplates.editor.error.catIds":`All category IDs are required.`,"uiTemplates.editor.error.uniqueCatIds":`Category IDs must be unique.`,"uiTemplates.editor.error.catCookies":`Each category must include at least one cookie.`,"uiTemplates.editor.error.failed":`Failed to save template.`,"uiTemplates.editor.action.create":`Create Template`,"uiTemplates.editor.action.save":`Save Template`,"uiTemplates.editor.loadDefaultsPrompt":`Start from scratch, or load a sensible default structure (buttons, categories, positions).`,"uiTemplates.editor.loadDefaultsBtn":`Load Defaults`,"uiTemplates.editor.confirmUpdate.title":`Update template used by {{n}} profiles?`,"uiTemplates.editor.confirmUpdate.titleSingular":`Update template used by 1 profile?`,"uiTemplates.editor.confirmUpdate.message":`Profiles: {{names}}.
@@ -23,4 +23,4 @@ Can be toggled independently for the Main Banner, GPC Banner, and Preference Mod
23
23
  Erases via the same DELETE /consent/:visitorId endpoint as widget.deleteConsent()/reConsent().
24
24
  The button's label is authored per-locale on the profile's content step, not here.
25
25
  Fires consenti:forgetMeRequested before, and consenti:forgotten after — a host app can hook these to run its own identity-verified erasure workflow across other systems.
26
- Preference Modal only — there's no equivalent for the Main Banner or GPC Banner.`,_section_sites:`── Sites / Tenants ───────────────────────────────`,"sites.title":`Sites / Tenants`,"sites.createNew":`Create new site`,"sites.namePlaceholder":`Site name`,"sites.slugPlaceholder":`slug (e.g. site-a)`,"sites.col.name":`Name`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Created`,"sites.empty":`No sites yet.`,"sites.dialog.delete.title":`Delete "{{name}}"?`,"sites.dialog.delete.message":`This site and all associated data will be permanently removed. This cannot be undone.`,"sites.error.create":`Failed to create site.`,_section_vendors:`── TCF Vendors ───────────────────────────────────`,"vendors.title":`TCF Vendor List`,"vendors.info.title":`What is the TCF Vendor List?`,"vendors.searchPlaceholder":`Search vendors…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} vendors`,"vendors.loading":`Loading vendor list…`,"vendors.noResults":`No vendors found.`,"vendors.col.id":`ID`,"vendors.col.name":`Name`,"vendors.col.purposes":`Purposes`,"vendors.col.liPurposes":`LI Purposes`,"vendors.col.specialPurposes":`Special Purposes`,"vendors.pagination":`Page {{page}} of {{totalPages}} · {{total}} vendors total`,"vendors.prev":`← Prev`,"vendors.next":`Next →`,"tcfRegistration.title":`TCF registration needs to be reconfirmed`,"tcfRegistration.body":`compliance.tcf is enabled with cmpId {{cmpId}} (version {{cmpVersion}}), but this registration hasn't been confirmed yet — TCF is being treated as disabled: no window.__tcfapi in the widget, no tcfString on consent records.`,"tcfRegistration.deregistered":`This cmpId was deregistered with IAB Europe on {{date}}. Confirmation is blocked until you register a new cmpId and update your server config.`,"tcfRegistration.notFound":`This cmpId wasn't found in the cached IAB CMP List yet. Registration can take time to propagate — try "Refresh Status" in a little while.`,"tcfRegistration.checkbox":`TCF is enabled, and we have registered this cmpId ({{cmpId}}, version {{cmpVersion}}) with IAB Europe.`,"tcfRegistration.confirmButton":`Confirm registration`,"tcfRegistration.refreshStatus":`Refresh Status`,"tcfRegistration.loadError":`Could not load TCF registration status.`,"tcfRegistration.confirmError":`Could not confirm TCF registration.`,"gppRegistration.title":`GPP registration needs to be reconfirmed`,"gppRegistration.body":`compliance.gpp is enabled with cmpId {{cmpId}} (version {{cmpVersion}}), but this registration hasn't been confirmed yet — GPP is being treated as disabled: no window.__gpp in the widget, no gppString on consent records.`,"gppRegistration.checkbox":`GPP is enabled, and we have registered this cmpId ({{cmpId}}, version {{cmpVersion}}).`,"gppRegistration.confirmButton":`Confirm registration`,"gppRegistration.loadError":`Could not load GPP registration status.`,"gppRegistration.confirmError":`Could not confirm GPP registration.`,_section_audit:`── Audit Log ─────────────────────────────────────`,"audit.title":`Audit Log`,"audit.empty":`No audit events yet.`,"audit.col.time":`Time`,"audit.col.action":`Action`,"audit.col.resource":`Resource`,"audit.col.resourceId":`Resource ID`,"audit.col.actor":`Actor`,"audit.actor.system":`system`,"audit.viewHistory":`Compare`,"audit.searchPlaceholder":`Search action, resource, actor…`,"audit.detail.title":`Audit Entry`,"audit.detail.oldData":`Old data`,"audit.detail.newData":`New data`,_section_apiConfig:`── API Configuration ─────────────────────────`,"apiConfig.title":`API Configuration`,"apiConfig.public.heading":`Public API`,"apiConfig.public.about.text":`Used by the widget to submit and manage consent. There is no auth token — Allowed Origins below is its only access gate.`,"apiConfig.public.about.link":`Open Public API reference on consenti.dev`,"apiConfig.admin.heading":`Admin API`,"apiConfig.admin.about.text":`Use these tokens to call the Consenti admin API from scripts, CI/CD, or server-side integrations. Every route, request/response shape, and auth header is documented on consenti.dev.`,"apiConfig.admin.about.link":`Open Admin API reference on consenti.dev`,"apiConfig.endpoint.heading":`Endpoint`,"apiConfig.endpoint.hint":`Base URL for this deployment, resolved from your configuration.`,"apiConfig.origins.heading":`Allowed Origins`,"apiConfig.origins.hint":`Only requests from these origins will be accepted. Use * to allow all (not recommended for production).`,"apiConfig.origins.publicNote":`The public API has no auth token — this list is its only access gate.`,"apiConfig.origins.adminNote":`An extra layer on top of Bearer-token auth. Include this dashboard's own origin ({{origin}}) to avoid locking yourself out.`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`No origins configured — all origins are currently allowed.`,"apiConfig.origins.errorDuplicate":`Already in the list.`,"apiConfig.origins.errorSave":`Failed to save. Please try again.`,"apiConfig.origins.remove":`Remove`,"apiConfig.tokens.heading":`Admin API Tokens`,"apiConfig.tokens.hint":`Bearer tokens for server-side and CI/CD access to the Consenti admin API. Pass as Authorization: Bearer <token>. Never expose in client-side code — these grant full admin access.`,"apiConfig.tokens.created":`Token created — copy it now, it won't be shown again.`,"apiConfig.tokens.placeholder":`Token name (e.g. CI deploy)`,"apiConfig.tokens.empty":`No tokens yet.`,"apiConfig.tokens.errorName":`Name is required`,"apiConfig.tokens.errorCreate":`Failed to create token`,"apiConfig.tokens.col.name":`Name`,"apiConfig.tokens.col.status":`Status`,"apiConfig.tokens.col.created":`Created`,"apiConfig.tokens.status.active":`Active`,"apiConfig.tokens.status.revoked":`Revoked`,"apiConfig.tokens.status.expired":`Expired`,"apiConfig.tokens.col.expires":`Expires`,"apiConfig.tokens.expiresLabel":`Expires (optional)`,"apiConfig.tokens.expiresNever":`Never`,"apiConfig.tokens.dialog.title":`Revoke this API token?`,"apiConfig.tokens.dialog.message":`Any application using this token will immediately lose access.`,"apiConfig.tokens.reactivate":`Reactivate`,"apiConfig.tokens.deleteDialog.title":`Permanently delete this API token?`,"apiConfig.tokens.deleteDialog.message":`This removes the token record entirely and cannot be undone. Reactivation will no longer be possible.`,_section_settings:`── Settings ──────────────────────────────────────`,"settings.title":`Settings`,"settings.account.heading":`Account`,"settings.account.email":`Email:`,"settings.account.roles":`Roles:`,"settings.account.id":`ID:`,"settings.account.changePassword":`Change Password`,"settings.export.heading":`Export Data`,"settings.export.hint":`Download all consent records or audit logs.`,"settings.export.consentCsv":`Consent CSV`,"settings.export.consentXlsx":`Consent XLSX`,"settings.export.consentJson":`Consent JSON`,"settings.export.auditCsv":`Audit CSV`,"settings.about.heading":`About`,"settings.about.text":`Consenti v0.1.0 — Open-source, GDPR-style Consent Management Platform.`,"settings.about.license":`Apache 2.0 License.`,_section_changePassword:`── Change Password ───────────────────────────`,"changePassword.title":`Change Password`,"changePassword.hint":`Choose a strong password of at least 12 characters.`,"changePassword.success":`Password updated successfully.`,"changePassword.newPassword":`New Password`,"changePassword.newPasswordPlaceholder":`Min. 12 characters`,"changePassword.confirmPassword":`Confirm New Password`,"changePassword.confirmPasswordPlaceholder":`Repeat new password`,"changePassword.submit":`Update Password`,"changePassword.submitting":`Saving…`,"changePassword.error.minLength":`Password must be at least 12 characters.`,"changePassword.error.mismatch":`Passwords do not match.`,"changePassword.error.failed":`Failed to update password.`,_section_howItWorks:`── How Consenti Works ───────────────────────────────`,"nav.howItWorks":`How Consenti Works`,"howItWorks.title":`How Consenti Works`,"howItWorks.intro":`Consenti is an open-source, GDPR-style Consent Management Platform. It handles cookie consent collection, storage, and reporting for your websites. This guide walks you through the main workflow and describes every section of the dashboard.`,"howItWorks.workflow.heading":`Core Workflow`,"howItWorks.workflow.step1.title":`Define Cookie Categories`,"howItWorks.workflow.step1.desc":`Go to Consent Banners → Cookie Templates and create a template that lists every cookie category your site uses (e.g. analytics, marketing). Set the legal basis and expiry for each.`,"howItWorks.workflow.step2.title":`Design the Consent UI`,"howItWorks.workflow.step2.desc":`Go to Consent Banners → UI Templates and configure the visual layout of your banner and preference modal — button labels, colours, layout style, and category display.`,"howItWorks.workflow.step3.title":`Create a Consent Profile`,"howItWorks.workflow.step3.desc":`Go to Consent Banners → Profiles and combine a Cookie Template with a UI Template. Add translated text for every locale you support, enable the required regulations (GDPR, CCPA, DPDPA), and publish.`,"howItWorks.workflow.step4.title":`Embed the Widget`,"howItWorks.workflow.step4.desc":`Copy your API key from API → Config and add the Consenti script tag to your website. The widget fetches your published profile and shows the consent banner automatically.`,"howItWorks.workflow.step5.title":`Monitor and Audit`,"howItWorks.workflow.step5.desc":`Use the Consents and Visitors pages to review live consent records. Use the Audit Log for a tamper-evident history of all administrative actions for compliance evidence.`,"howItWorks.features.heading":`Dashboard Features`,"howItWorks.features.dashboard.title":`Dashboard`,"howItWorks.features.dashboard.desc":`The home screen shows real-time KPIs — total consents, acceptance rate, rejection rate, and a time-series chart. Use it to spot trends and gauge the impact of banner changes.`,"howItWorks.features.reports.title":`Reports`,"howItWorks.features.reports.desc":`Opt-in trend over a date range, plus category and locale breakdowns (granted/denied/objected). Requires the stats:view permission.`,"howItWorks.features.consentTemplates.title":`Consent Templates`,"howItWorks.features.consentTemplates.desc":`Reusable lists of consent parameters grouped into categories. Each category owns the legal basis (consent, legitimate interest, mandatory) for its parameters; parameters carry purpose, GPC signal handling, pre-grant, and optional TCF vendor or CPRA category mapping.`,"howItWorks.features.uiTemplates.title":`UI Templates`,"howItWorks.features.uiTemplates.desc":`Controls the look and feel of the consent banner, GPC notice, and preference modal. Configure button sets, heading tags, overlay opacity, and category display order.`,"howItWorks.features.profiles.title":`Profiles`,"howItWorks.features.profiles.desc":`A Profile is the deployable unit. It binds a Cookie Template + UI Template together, stores multi-locale content, and tracks a version number so you can roll back. Only one profile per domain can be active at a time.`,"howItWorks.features.consents.title":`Consents`,"howItWorks.features.consents.desc":`A searchable, filterable log of every individual consent record submitted by visitors. Each record shows the visitor ID, profile used, locale, GPC signal, consent choices, and timestamp.`,"howItWorks.features.visitors.title":`Visitors`,"howItWorks.features.visitors.desc":`A list of unique visitor identifiers seen across your sites, with their country, first-seen date, and last-seen date. Visitor IDs are pseudonymous UUIDs stored without raw IP addresses.`,"howItWorks.features.users.title":`Users`,"howItWorks.features.users.desc":`Manage the admin accounts that can log into this dashboard. Assign roles, activate or deactivate accounts, and restrict users to specific sites in multi-tenant deployments.`,"howItWorks.features.roles.title":`Roles`,"howItWorks.features.roles.desc":`Define named permission sets (e.g. Viewer, Editor, Admin). Assign granular permissions such as consent:view, profile:edit, or audit:view to each role, then assign roles to users.`,"howItWorks.features.vendors.title":`Vendors`,"howItWorks.features.vendors.desc":`Browse the IAB Global Vendor List (GVL) to look up TCF vendor IDs, declared purposes, and legitimate-interest purposes. Use these IDs when configuring cookie categories in your templates.`,"howItWorks.features.audit.title":`Audit Log`,"howItWorks.features.audit.desc":`An append-only, tamper-evident log of every administrative action — profile saves, user changes, API key creation, and more. Required for GDPR accountability obligations.`,"howItWorks.features.api.title":`API & Keys`,"howItWorks.features.api.desc":`Generate and revoke API tokens, configure allowed CORS origins for the public consent API, and browse the interactive OpenAPI reference to understand every endpoint.`,"howItWorks.features.settings.title":`Settings`,"howItWorks.features.settings.desc":`View your account details, change your password, and export consent or audit data as CSV, XLSX, or JSON for offline analysis or regulatory submission.`,"howItWorks.docs.heading":`Full Documentation`,"howItWorks.docs.text":`Detailed guides, configuration references, integration examples, and a live playground are available on the Consenti documentation site.`,"howItWorks.docs.link":`Open consenti.dev/docs →`,"howItWorks.consentFlow.heading":`End-to-End Consent Flow`,"howItWorks.consentFlow.step1.title":`Widget Initializes`,"howItWorks.consentFlow.step1.desc":`The Consenti script loads in the visitor's browser and reads your configuration (API key, compliance.type). If a valid, unexpired consent cookie already exists, the widget silently exits — no banner is shown.`,"howItWorks.consentFlow.step2.title":`Jurisdiction Detected`,"howItWorks.consentFlow.step2.desc":`If compliance.type is 'auto', the widget calls GET /resolve-profile passing the visitor's timezone, Accept-Language header, and IP address. The server maps these signals to a complianceGroup using the built-in country → compliance map.`,"howItWorks.consentFlow.step3.title":`Profile Fetched`,"howItWorks.consentFlow.step3.desc":`The widget fetches the active profile for the resolved complianceGroup and the visitor's locale. The response is a flat JSON object with all banner text, cookie categories, UI settings, and regulation flags — ready to render.`,"howItWorks.consentFlow.step4.title":`Banner Rendered`,"howItWorks.consentFlow.step4.desc":`The widget renders the banner or preference modal using the profile's UI template. Mandatory categories are pre-checked and cannot be deselected. Optional categories show their legal basis (consent or legitimate interest).`,"howItWorks.consentFlow.step5.title":`Consent Submitted`,"howItWorks.consentFlow.step5.desc":`When the visitor acts (Accept All, Reject Optional, or Save Preferences), the widget POSTs a consent record to the API with the visitor ID, profile version, per-category status (granted/denied/objected), GPC signal, timestamp, and locale.`,"howItWorks.consentFlow.step6.title":`Stored and Audited`,"howItWorks.consentFlow.step6.desc":`The API validates the payload, stores the consent record, and appends an entry to the append-only audit log. The visitor record is upserted with country and first/last-seen dates. The widget writes the consent cookie so future visits skip the banner.`,"howItWorks.profileResolution.heading":`Profile Resolution Algorithm`,"howItWorks.profileResolution.intro":`When a visitor arrives, Consenti resolves which consent profile to show in five steps.`,"howItWorks.profileResolution.step1.title":`Geo Signals Collected`,"howItWorks.profileResolution.step1.desc":`The widget sends three signals to GET /resolve-profile: the browser's Intl.DateTimeFormat timezone, the Accept-Language header (or lang query param), and the server-side IP address.`,"howItWorks.profileResolution.step2.title":`Country Determined`,"howItWorks.profileResolution.step2.desc":`The server tries in order: (1) IP geolocation via the configured geoDataProvider; (2) timezone → country table lookup; (3) language tag → country heuristic (e.g. 'de' → DE). The first non-empty match wins.`,"howItWorks.profileResolution.step3.title":`Compliance Group Mapped`,"howItWorks.profileResolution.step3.desc":`The ISO-3166-1 alpha-2 country code (plus optional region/state) is looked up in the embedded COUNTRY → COMPLIANCE_GROUP map. A region override (e.g. US/CA → optOutCalifornia) takes precedence over the country default.`,"howItWorks.profileResolution.step4.title":`Active Profile Located`,"howItWorks.profileResolution.step4.desc":`The system queries the database for the active profile whose complianceGroup matches the resolved group. Only one profile per complianceGroup may be active at a time. If none exists, a 404 is returned and the widget may fall back to a profileOverride.`,"howItWorks.profileResolution.step5.title":`Locale Resolved`,"howItWorks.profileResolution.step5.desc":`The best locale is picked by: (1) exact match with the widget's requested locale; (2) language-prefix match (e.g. 'de-AT' → 'de'); (3) geo-resolved locale from the provider; (4) the profile's defaultLocale. The resolved JSON is served from a static file (published profiles) or directly from the database (previews).`,"howItWorks.complianceGroups.heading":`Compliance Groups`,"howItWorks.complianceGroups.intro":`Every country in the world maps to one of eight compliance groups. Each group determines what Compliance Group the widget must follow.`,"howItWorks.complianceGroups.optIn.title":`optIn — GDPR / ePrivacy Strict Opt-In`,"howItWorks.complianceGroups.optIn.desc":`Prior consent is required before any non-essential cookie is set. Visitors must be given a genuine choice to reject, withdrawal must be as easy as giving consent, and granular per-category choices are mandatory.`,"howItWorks.complianceGroups.optIn.laws":`GDPR, ePrivacy Directive, UK GDPR, PECR, revFADP (CH), KVKK (TR), PDPA (TH), and other strict national laws`,"howItWorks.complianceGroups.optIn.countries":`All EU member states, UK, Switzerland, Turkey, Thailand, Iceland, Liechtenstein, Norway, Guernsey, Gibraltar, and other countries with strict ePrivacy rules`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — India DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`India's Digital Personal Data Protection Act 2023 requires explicit opt-in consent. Additional obligations include naming a Data Fiduciary, providing a dedicated consent notice, and supporting Data Principal rights. Set the dpdpaDataFiduciary extra field in your profile.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Digital Personal Data Protection Act 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`India (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — China Multi-Law Stack`,"howItWorks.complianceGroups.optInChina.desc":`China's data governance requires explicit consent under PIPL, combined with obligations from the Data Security Law (DSL) and Cybersecurity Law (CSL). Additional requirements apply to cross-border data transfers and data classification.`,"howItWorks.complianceGroups.optInChina.laws":`Personal Information Protection Law (PIPL), Data Security Law (DSL), Cybersecurity Law (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`China (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — California CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Data may be collected by default but consumers must be provided with a clear 'Do Not Sell or Share My Personal Information' opt-out. The Global Privacy Control (GPC) browser signal must be honoured as a valid opt-out.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`United States — California (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Other US State Laws`,"howItWorks.complianceGroups.optOutUSState.desc":`Modelled on California's opt-out framework. Consumers can opt out of targeted advertising and the sale of personal data. Several states require GPC to be honoured. Covered businesses must provide clear opt-out mechanisms.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`United States — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — General Privacy / Consent`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`A general privacy law applies but does not impose a strict PECR/ePrivacy-style cookie banner requirement. Best practice is to offer a consent choice for non-essential cookies and a clear privacy notice, but the legal threshold is lower than GDPR opt-in.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Law 25 (CA), LGPD (BR — use hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID and many others`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canada, Australia, New Zealand, Japan, South Korea, Singapore, Malaysia, South Africa, and many LatAm, African, and Asian countries`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brazil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`Brazil's LGPD is broadly similar to GDPR but analytics and advertising cookies may be treated under the legitimate interest legal basis depending on the data controller's assessment. The banner is shown, but the category-level legal basis can be more nuanced than strict GDPR opt-in.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brazil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Privacy Notice Only`,"howItWorks.complianceGroups.noticeOnly.desc":`No dedicated cookie regulation applies, or the existing regime requires only a privacy notice — not an opt-in or opt-out banner. Displaying a consent banner is still recommended for transparency, but is not strictly mandated by law.`,"howItWorks.complianceGroups.noticeOnly.laws":`Varies — countries with no dedicated cookie / ePrivacy regulation`,"howItWorks.complianceGroups.noticeOnly.countries":`Many countries in Africa, Central Asia, the Caribbean, and Pacific regions not covered by the above groups`,"howItWorks.enums.heading":`Key Values Reference`,"howItWorks.enums.legalBasis.heading":`legalBasis (cookie category)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — Category is always active regardless of consent (e.g. session, authentication). Never blocked by GPC or opt-out signals.`,"howItWorks.enums.legalBasis.consent":`consent — Requires explicit opt-in from the visitor. Blocked by default; blocked by GPC in all opt-in jurisdictions.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Relies on the controller's legitimate interest. Active by default; visitor can object. Soft-blocked by GPC in some jurisdictions (EU, UK).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (per category record)`,"howItWorks.enums.consentStatus.granted":`granted — Visitor gave explicit consent for this category.`,"howItWorks.enums.consentStatus.denied":`denied — Visitor explicitly refused consent for this category.`,"howItWorks.enums.consentStatus.objected":`objected — Visitor objected to a legitimate-interest category (opt-out, not a refusal of consent).`,"howItWorks.enums.geoProvider.heading":`geoDataProvider options`,"howItWorks.enums.geoProvider.default":`default / timezone — Uses the browser timezone (Intl.DateTimeFormat) to infer country, falling back to Accept-Language. No extra dependency.`,"howItWorks.enums.geoProvider.language":`language — Derives country from Accept-Language only (e.g. 'de' → DE, 'pt' → BR). Fast but imprecise.`,"howItWorks.enums.geoProvider.geoip":`geoip — Uses the geoip-lite npm package with a bundled MaxMind Lite database. Requires: npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Calls ipinfo.io via built-in HTTPS (zero extra dependency). Adds ~50–200 ms per first-visit request.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Uses the maxmind npm package with a local GeoLite2-City.mmdb file. Most accurate. Requires MAXMIND_DB_PATH env var and npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`custom function — Pass a CountryResolverFn to compliance.geoDataProvider to integrate any geo-IP or CDN provider.`,"consentTemplates.editor.categories":`Consent Categories`,"consentTemplates.editor.addCategory":`+ Add Category`,"consentTemplates.editor.noCategories":`No categories defined yet. Add one above.`,"consentTemplates.editor.error.noCategories":`At least one category is required.`,"consentTemplates.editor.error.catIds":`All categories must have an ID.`,"consentTemplates.editor.error.uniqueCatIds":`Category IDs must be unique.`,"consentTemplates.editor.error.catCookies":`Every category must contain at least one parameter.`,"consentTemplates.editor.error.uncategorized":`Parameter "{{id}}" is not assigned to any category.`,"consentTemplates.editor.error.multiCategory":`Parameter "{{id}}" is assigned to more than one category.`,"consentTemplates.editor.error.purposeLegalBasisMismatch":`Parameter "{{id}}" has a non-necessary purpose but is assigned to a Mandatory category — this grants a tracking parameter with no consent gate.`,"consentTemplates.editor.warning.necessaryNotMandatory":`Parameter "{{id}}" has purpose "necessary" but is assigned to a non-Mandatory category — this may break site functionality since it can be denied.`,"consentTemplates.col.preGrantShort":`Pre Grant`,"profileEditor.config.expiryDays":`Re-consent Interval (days)`,"profileEditor.config.expiryDaysHint":`How many days until stored consent expires and the visitor is asked again.`,"profileEditor.error.expiryDays":`Expiry (days) must be at least 1.`,"profileEditor.error.customComplianceGroupRequired":`Enter a custom group name, or pick a compliance group above.`,"profileEditor.table.preGrant":`Pre Grant`,"profileEditor.table.preGrantLocked":`Already effectively pre-granted — only editable when the category's legal basis is Consent`,"profileEditor.content.receiptHeading":`Consent Receipt Checkbox`,"profileEditor.content.receiptHint":`Shown in the preference modal when "Allow consent receipt" is enabled in Step 1.`,"profileEditor.content.receiptLabel":`Checkbox label`,"profileEditor.content.receiptDescription":`Description`,"profileEditor.content.forgetMeHeading":`Forget Me Button`,"profileEditor.content.forgetMeHint":`Shown in the preference modal, below the categories, when "Show 'Forget me' button" is enabled on the linked UI Template's Preference Modal step.`,"profileEditor.content.forgetMeLabel":`Button label`,"profileEditor.content.ageGateModal.heading":`Age Gate Modal`,"profileEditor.content.ageGateModal.headingPlaceholder":`Are you 16 or older?`,"profileEditor.content.ageGateModal.bodyText":`Body text`,"profileEditor.content.ageGateModal.bodyPlaceholder":`Please confirm your age before we show you cookie preferences.`,"profileEditor.content.ageGateModal.confirmButtonLabel":`"Yes" button label`,"profileEditor.content.ageGateModal.confirmButtonPlaceholder":`Yes`,"profileEditor.content.ageGateModal.denyButtonLabel":`"No" button label`,"profileEditor.content.ageGateModal.denyButtonPlaceholder":`No`,"profileEditor.content.ageGateModal.parentalConsent.heading":`Parental Consent Message`,"profileEditor.content.ageGateModal.parentalConsent.headingPlaceholder":`Parental consent required`,"profileEditor.content.ageGateModal.parentalConsent.bodyText":`Body text`,"profileEditor.content.ageGateModal.parentalConsent.bodyPlaceholder":`Only strictly necessary cookies will be used until a parent or guardian verifies consent on your behalf.`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonLabel":`"OK" button label`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonPlaceholder":`OK`,"profileEditor.content.ageGateModal.loadDefaultsTitle":`Fill this section with generic default text for this locale`,"profileEditor.error.missingRequiredContent":`Some required content is missing for locale "{{locale}}" — check the highlighted tab.`,"profileEditor.error.saveFailedMoreFields":`(and {{count}} more field(s) need attention)`,"profileEditor.nudge.title":`Optional field left blank`,"profileEditor.nudge.headingBlank":`You left the heading blank. Visitors will see the banner without one.`,"profileEditor.nudge.introBlank":`You left the intro text blank. Visitors will see the preferences panel without one.`,"profileEditor.nudge.addNow":`Add now`,"profileEditor.nudge.ignore":`Ignore`,"profiles.error.delete":`Failed to delete profile.`};function Ln(e,t,n){let r=e[t]??t;if(!n)return r;for(let[e,t]of Object.entries(n))r=r.split(`{{${e}}}`).join(String(t));return r}var Rn=`modulepreload`,zn=function(e){return`/consenti/`+e},Bn={},Vn=function(e){return e.pathname.endsWith(`.css`)},Hn=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},X=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=zn(t,n);let r=s(t),i=Vn(r);return Hn(Bn,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:Rn,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Un={en:`English (en)`,es:`Español (es)`,fr:`Français (fr)`,de:`Deutsch (de)`,ja:`日本語 (ja)`,"zh-CN":`中文 (zh-CN)`},Wn=Object.keys(Un),Gn={es:()=>X(()=>import(`./es-B6Jp0OPe.js`).then(e=>e.default),[]),fr:()=>X(()=>import(`./fr-CshYcQPW.js`).then(e=>e.default),[]),de:()=>X(()=>import(`./de-jwngydrC.js`).then(e=>e.default),[]),ja:()=>X(()=>import(`./ja-CgjZNBrc.js`).then(e=>e.default),[]),"zh-CN":()=>X(()=>import(`./zh-CN-BnLZkfBC.js`).then(e=>e.default),[])},Z={en:In};function Kn(e){if(Z[e])return Promise.resolve(Z[e]);let t=Gn[e];return t?t().then(t=>(Z[e]=t,t)):Promise.resolve(In)}var qn=N({locale:`en`,setLocale:()=>{},t:e=>e});function Jn({children:e}){let[t,n]=R(()=>{try{let e=localStorage.getItem(`dashboard-locale`);return e&&Wn.includes(e)?e:`en`}catch{return`en`}}),[r,i]=R(Z[t]??In);return z(()=>{t!==`en`&&!Z[t]&&Kn(t).then(i)},[]),U(qn.Provider,{value:{locale:t,setLocale:e=>{if(e!==t){n(e);try{localStorage.setItem(`dashboard-locale`,e)}catch{}Z[e]?i(Z[e]):Kn(e).then(i)}},t:(e,t)=>Ln(r,e,t)},children:e})}var Yn=()=>B(qn),Q=()=>B(qn).t,Xn=sn;function Zn(){let{locale:e,setLocale:t,t:n}=Yn();return U(`div`,{class:`flex items-center gap-1`,title:n(`locale.switcherAria`),children:[U(Xn,{size:13,className:`text-gray-400 dark:text-gray-500 shrink-0`,"aria-hidden":`true`}),U(`select`,{value:e,onChange:e=>t(e.target.value),"aria-label":n(`locale.switcherAria`),disabled:Wn.length<=1,class:`text-xs text-gray-600 dark:text-gray-300 bg-transparent border-none outline-none cursor-pointer hover:text-gray-900 dark:hover:text-white appearance-none disabled:cursor-default`,children:Wn.map(e=>U(`option`,{value:e,children:Un[e]},e))})]})}var Qn=N(()=>{});function $n({setTitle:e,children:t}){return U(Qn.Provider,{value:e,children:t})}function er(e){let t=B(Qn);z(()=>{t(e)},[e,t])}var tr=[{key:`nav.dashboard`,hash:`#/`,Icon:dn},{key:`nav.reports`,hash:`#/reports`,Icon:Ht,perm:`stats:view`},{type:`group`,key:`nav.consentBanners`,baseHash:`#/banners`,Icon:Nn,children:[{key:`nav.consentTemplates`,hash:`#/banners/consent-templates`,Icon:en},{key:`nav.uiTemplates`,hash:`#/banners/ui-templates`,Icon:_n},{key:`nav.profiles`,hash:`#/banners/profiles`,Icon:Qt}]},{key:`nav.consents`,hash:`#/consents`,Icon:Dn},{key:`nav.visitors`,hash:`#/visitors`,Icon:Fn},{key:`nav.users`,hash:`#/users`,Icon:ln,perm:`user:view`},{key:`nav.roles`,hash:`#/roles`,Icon:kn,perm:`role:view`},{key:`nav.sites`,hash:`#/tenants`,Icon:sn,perm:`settings:update`,superadminOnly:!0},{key:`nav.vendors`,hash:`#/vendors`,Icon:xn,perm:`consent:view`},{key:`nav.audit`,hash:`#/audit`,Icon:Cn,perm:`audit:view`},{key:`nav.api`,hash:`#/api/config`,Icon:yn,perm:`settings:update`},{key:`nav.settings`,hash:`#/settings`,Icon:Tn},{key:`nav.howItWorks`,hash:`#/how-it-works`,Icon:Xt}];function nr({current:e,collapsed:t,onToggle:n}){let{user:r,logout:i}=G(),{appName:a,appLogoPath:o,hidePoweredBy:s}=tt(),c=Q(),[l,u]=R(()=>{let t=new Set;for(let n of tr)`type`in n&&n.type===`group`&&e.startsWith(n.baseHash)&&t.add(n.baseHash);return t}),d=e=>{u(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},f=t=>e===t||t!==`#/`&&e.startsWith(t),p=t=>e.startsWith(t.baseHash),m=r?.roles.includes(`super_admin`)??!1,h=(e,t)=>(!t||m)&&(!e||r?.permissions.includes(e));return U(`aside`,{class:`${t?`w-14`:`w-56`} min-h-screen bg-gray-900 text-gray-100 flex flex-col transition-[width] duration-200 ease-in-out overflow-hidden shrink-0 border-r border-gray-700`,"aria-label":c(`nav.adminDashboard`),children:[U(`div`,{class:`px-3 py-5 border-b border-gray-700 flex items-center gap-2`,children:t?U(`div`,{class:`w-full flex justify-center`,children:o?U(`img`,{src:o,alt:a,class:`h-7 w-7 object-contain rounded`}):U(`img`,{src:`/icon.svg`,alt:a,class:`h-7 w-7`})}):U(`div`,{class:`min-w-0`,children:[o?U(`img`,{src:o,alt:a,class:`h-7 w-auto object-contain`}):U(`img`,{src:`/logo-dark.svg`,alt:a,class:`h-7 w-auto`}),U(`p`,{class:`text-xs text-gray-400 mt-0.5`,children:c(`nav.adminDashboard`)})]})}),U(`nav`,{class:`flex-1 py-4 overflow-y-auto`,"aria-label":c(`nav.adminDashboard`),children:tr.filter(e=>h(e.perm,e.superadminOnly)).map(e=>{if(`type`in e&&e.type===`group`){let n=!t&&l.has(e.baseHash),r=p(e),i=e.children.filter(e=>h(e.perm));if(i.length===0)return null;let a=c(e.key);return U(`div`,{children:[U(`button`,{type:`button`,onClick:()=>{t?window.location.hash=i[0].hash:d(e.baseHash)},"aria-expanded":t?void 0:n,"aria-label":t?a:void 0,title:t?a:void 0,class:`w-full flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${t?`justify-center`:`justify-between`} ${r?`text-white bg-gray-800`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[U(`div`,{class:`flex items-center gap-3 ${t?``:`min-w-0`}`,children:[U(e.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!t&&U(`span`,{class:`truncate`,children:a})]}),!t&&U(Wt,{size:13,className:`shrink-0 text-gray-500 transition-transform ${n?`rotate-180`:``}`,"aria-hidden":`true`})]}),n&&U(`div`,{class:`bg-gray-950/30`,children:i.map(e=>{let t=f(e.hash),n=c(e.key);return U(`a`,{href:e.hash,"aria-current":t?`page`:void 0,class:`flex items-center gap-3 pl-8 pr-3 py-2 text-sm transition-colors ${t?`bg-blue-600 text-white`:`text-gray-400 hover:bg-gray-800 hover:text-white`}`,children:[U(e.Icon,{size:14,className:`shrink-0`,"aria-hidden":`true`}),n]},e.hash)})})]},e.baseHash)}let n=e,r=f(n.hash),i=c(n.key);return U(`a`,{href:n.hash,"aria-current":r?`page`:void 0,"aria-label":t?i:void 0,title:t?i:void 0,class:`flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${t?`justify-center`:``} ${r?`bg-blue-600 text-white`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[U(n.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!t&&i]},n.hash)})}),U(`div`,{class:`px-3 py-4 border-t border-gray-700 ${t?`flex justify-center`:``}`,children:[!t&&U(C,{children:[U(`p`,{class:`text-xs text-gray-400 truncate`,children:[r?.email,U(`br`,{}),U(`i`,{class:`text-gray-500`,children:r?.roles})]}),!s&&U(`p`,{class:`text-[10px] text-gray-600 mt-2`,children:[c(`layout.poweredBy`),` `,U(`a`,{href:`https://consenti.dev/?utm_source=dashboard&utm_medium=powered-by&utm_campaign=consenti-api`,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-gray-400 transition-colors`,children:`Consenti`})]})]}),t&&U(`button`,{onClick:i,"aria-label":c(`layout.signOut`),title:c(`layout.signOut`),class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:U(pn,{size:16,"aria-hidden":`true`})})]})]})}var rr=hn,ir=jn;function ar({collapsed:e}){let{theme:t,toggle:n}=Xe(),r=Q(),i=t===`dark`,a=r(i?`layout.toggleLight`:`layout.toggleDark`);return e?U(`button`,{onClick:n,"aria-label":a,title:a,class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:i?U(rr,{size:16,className:`text-cyan-400`}):U(ir,{size:16,className:`text-gray-400`})}):U(`button`,{onClick:n,"aria-label":a,title:a,"aria-pressed":i,class:`relative flex items-center w-8 h-6 rounded-full px-0.5 transition-all duration-300 ${i?`bg-gray-900 ring-2 ring-cyan-400`:`bg-gray-600`}`,children:U(`span`,{class:`w-5 h-5 rounded-full flex items-center justify-center transition-all duration-300 ${i?`translate-x-2 bg-gray-800`:`translate-x-0 bg-white shadow`}`,children:i?U(rr,{size:11,className:`text-cyan-400`}):U(ir,{size:11,className:`text-amber-500`})})})}var or=pn,sr=Jt,cr=Kt;function lr(){return typeof window<`u`&&window.innerWidth<768}function ur({children:e,title:t,current:n}){let[r,i]=R(()=>lr()),a=()=>i(e=>!e),{logout:o}=G(),s=Q();return z(()=>{let e=()=>{lr()&&i(!0)};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),U(`div`,{class:`flex h-screen overflow-hidden dark:bg-gray-900`,children:[U(`div`,{class:`relative shrink-0`,children:[U(nr,{current:n,collapsed:r,onToggle:a}),U(`button`,{onClick:a,"aria-label":s(r?`layout.expandSidebar`:`layout.collapseSidebar`),title:s(r?`layout.expandSidebar`:`layout.collapseSidebar`),class:`absolute top-5 -right-3.5 z-20 w-7 h-7 flex items-center justify-center bg-gray-800 border border-gray-600 rounded-full text-gray-300 hover:text-white hover:bg-gray-700 shadow-md transition-colors`,children:U(r?sr:cr,{size:13})})]}),U(`div`,{class:`flex-1 flex flex-col min-w-0 overflow-hidden`,children:[U(`header`,{class:`shrink-0 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 px-6 py-3 flex items-center justify-between min-h-[56px]`,children:[t?U(`h1`,{class:`text-xl font-semibold text-gray-800 dark:text-gray-100`,children:t}):U(`span`,{}),U(`div`,{class:`flex items-center gap-3`,children:[U(ar,{}),U(Zn,{}),U(`button`,{onClick:o,"aria-label":s(`layout.signOut`),title:s(`layout.signOut`),class:`flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-white transition-colors`,children:[U(or,{size:14,"aria-hidden":`true`}),s(`layout.signOut`)]})]})]}),U(`main`,{class:`flex-1 overflow-y-auto`,children:U(`div`,{class:`p-6`,children:e})})]})]})}var dr=an,fr=nn;function pr(){let{login:e}=G(),{appName:t,appLogoPath:n,hidePoweredBy:r}=tt(),i=Q(),[a,o]=R(``),[s,c]=R(``),[l,u]=R(!1),[d,f]=R(``),[p,m]=R(!1),h=async(t,n)=>{f(``),m(!0);try{let{token:r}=await H(`/auth/login`,{method:`POST`,body:JSON.stringify({email:t,password:n})});e(r),window.location.hash=`#/`}catch{f(i(`login.error.invalid`))}finally{m(!1)}};return U(`div`,{class:`min-h-screen bg-gray-50 flex flex-col items-center justify-center p-4`,style:{background:`linear-gradient(135deg, rgb(2, 6, 23) 0%, rgb(26, 52, 96) 40%, rgb(21, 101, 192) 75%, rgb(67, 160, 71) 100%)`},children:[n?U(`img`,{src:n,alt:t,class:`h-14 w-auto mx-auto mb-3 object-contain`}):null,U(`div`,{class:`bg-white rounded-xl shadow-sm border border-gray-200 p-8 w-full max-w-sm`,children:[U(`div`,{class:`mb-6 text-center`,children:[U(`h1`,{class:`text-xl font-bold text-gray-900`,children:i(`login.title`,{appName:t})}),U(`p`,{class:`text-sm text-gray-500 mt-1`,children:i(`login.subtitle`)})]}),U(`form`,{onSubmit:e=>{e.preventDefault(),h(a,s)},class:`space-y-4`,children:[U(`div`,{children:[U(`label`,{for:`login-email`,class:`block text-sm font-medium text-gray-700 mb-1`,children:i(`login.email`)}),U(`input`,{id:`login-email`,type:`email`,required:!0,value:a,onInput:e=>o(e.target.value),class:`w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500`,placeholder:i(`login.emailPlaceholder`),autocomplete:`email`})]}),U(`div`,{children:[U(`label`,{for:`login-password`,class:`block text-sm font-medium text-gray-700 mb-1`,children:i(`login.password`)}),U(`div`,{class:`relative`,children:[U(`input`,{id:`login-password`,type:l?`text`:`password`,required:!0,value:s,onInput:e=>c(e.target.value),class:`w-full border border-gray-300 rounded-lg px-3 py-2 pr-10 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500`,autocomplete:`current-password`}),U(`button`,{type:`button`,onClick:()=>u(e=>!e),"aria-label":i(l?`login.hidePassword`:`login.showPassword`),class:`absolute inset-y-0 right-0 flex items-center px-3 text-gray-400 hover:text-gray-600`,children:U(l?fr:dr,{size:16})})]})]}),d&&U(`p`,{role:`alert`,class:`text-sm text-red-600 bg-red-50 border border-red-200 rounded px-3 py-2`,children:d}),U(`button`,{type:`submit`,disabled:p,class:`w-full bg-blue-600 text-white rounded-lg px-4 py-2.5 text-sm font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors`,children:i(p?`login.submitting`:`login.submit`)})]}),!1,r||U(`p`,{class:`mt-5 text-center text-[11px] text-gray-400`,children:[i(`layout.poweredBy`),` `,U(`a`,{href:`https://consenti.dev/?utm_source=dashboard&utm_medium=powered-by&utm_campaign=consenti-api`,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-blue-500 transition-colors`,children:`Consenti`})]})]})]})}function mr({label:e,value:t,sub:n}){return U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[U(`p`,{class:`text-sm text-gray-500 dark:text-gray-400`,children:e}),U(`p`,{class:`text-3xl font-bold text-gray-900 dark:text-gray-100 mt-1`,children:t}),n&&U(`p`,{class:`text-xs text-gray-400 dark:text-gray-500 mt-1`,children:n})]})}function hr({data:e,ariaLabel:t,noDataLabel:n}){if(e.length===0)return U(`p`,{class:`text-sm text-gray-400`,children:n});let r=Math.max(...e.map(e=>e.count),1),i=552/Math.max(e.length-1,1),a=e.map((e,t)=>({x:24+t*i,y:96-e.count/r*72,label:e.date.slice(5),count:e.count})),o=a.map((e,t)=>`${t===0?`M`:`L`} ${e.x} ${e.y}`).join(` `),s=`${o} L ${a[a.length-1].x} 96 L ${a[0].x} 96 Z`;return U(`svg`,{viewBox:`0 0 600 120`,class:`w-full`,role:`img`,"aria-label":t,children:[U(`defs`,{children:U(`linearGradient`,{id:`tl-grad`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[U(`stop`,{offset:`0%`,"stop-color":`#6366f1`,"stop-opacity":`0.3`}),U(`stop`,{offset:`100%`,"stop-color":`#6366f1`,"stop-opacity":`0.02`})]})}),U(`path`,{d:s,fill:`url(#tl-grad)`}),U(`path`,{d:o,fill:`none`,stroke:`#6366f1`,"stroke-width":`2`,"stroke-linejoin":`round`}),a.map((t,n)=>U(`g`,{children:[U(`circle`,{cx:t.x,cy:t.y,r:`3`,fill:`#6366f1`}),n%Math.max(Math.floor(e.length/6),1)===0&&U(`text`,{x:t.x,y:116,"text-anchor":`middle`,"font-size":`8`,fill:`#9ca3af`,children:t.label})]},n))]})}function gr({data:e,noDataLabel:t}){if(e.length===0)return U(`p`,{class:`text-sm text-gray-400`,children:t});let n=e.slice(0,8),r=Math.max(...n.map(e=>e.count),1);return U(`div`,{class:`space-y-2`,children:n.map(e=>U(`div`,{class:`flex items-center gap-2`,children:[U(`span`,{class:`text-xs text-gray-500 w-8 text-right`,children:e.country}),U(`div`,{class:`flex-1 bg-gray-100 rounded h-3 overflow-hidden`,children:U(`div`,{class:`h-full bg-indigo-500 rounded`,style:{width:`${e.count/r*100}%`},"aria-hidden":`true`})}),U(`span`,{class:`text-xs text-gray-600 w-8`,children:e.count})]},e.country))})}function _r({data:e,label:t,sub:n}){let r=2*Math.PI*36,i=e.rate/100*r;return U(`div`,{class:`flex items-center gap-4`,children:[U(`svg`,{width:`88`,height:`88`,viewBox:`0 0 88 88`,role:`img`,"aria-label":`${t}: ${e.rate}%`,children:[U(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#e5e7eb`,"stroke-width":`8`}),U(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#6366f1`,"stroke-width":`8`,"stroke-dasharray":`${i} ${r}`,"stroke-linecap":`round`,transform:`rotate(-90 44 44)`}),U(`text`,{x:`44`,y:`49`,"text-anchor":`middle`,"font-size":`16`,"font-weight":`bold`,fill:`currentColor`,class:`text-gray-800 dark:text-gray-100`,"aria-hidden":`true`,children:[e.rate,`%`]})]}),U(`div`,{children:[U(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300`,children:t}),U(`p`,{class:`text-xs text-gray-500 dark:text-gray-400`,children:n})]})]})}function vr({rows:e,noDataLabel:t,grantedLabel:n,deniedLabel:r,objectedLabel:i}){if(e.length===0)return U(`p`,{class:`text-sm text-gray-400`,children:t});let a=Math.max(...e.map(e=>e.granted+e.denied+e.objected),1);return U(`div`,{class:`space-y-3`,children:[U(`div`,{class:`flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400`,children:[U(`span`,{class:`flex items-center gap-1`,children:[U(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-emerald-500 inline-block`,"aria-hidden":`true`}),n]}),U(`span`,{class:`flex items-center gap-1`,children:[U(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-rose-500 inline-block`,"aria-hidden":`true`}),r]}),U(`span`,{class:`flex items-center gap-1`,children:[U(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-amber-500 inline-block`,"aria-hidden":`true`}),i]})]}),e.map(e=>{let t=e.granted+e.denied+e.objected;return U(`div`,{class:`flex items-center gap-2`,children:[U(`span`,{class:`text-xs text-gray-600 dark:text-gray-300 w-28 truncate`,title:e.label,children:e.label}),U(`div`,{class:`flex-1 bg-gray-100 dark:bg-gray-700 rounded h-3 overflow-hidden flex`,children:t>0&&U(C,{children:[U(`div`,{class:`h-full bg-emerald-500`,style:{width:`${e.granted/a*100}%`},"aria-hidden":`true`}),U(`div`,{class:`h-full bg-rose-500`,style:{width:`${e.denied/a*100}%`},"aria-hidden":`true`}),U(`div`,{class:`h-full bg-amber-500`,style:{width:`${e.objected/a*100}%`},"aria-hidden":`true`})]})}),U(`span`,{class:`text-xs text-gray-500 dark:text-gray-400 w-10 text-right`,children:t})]},e.label)})]})}var yr={overview:()=>H(`/stats/overview`),categories:()=>H(`/stats/categories`),timeline:(e=30)=>H(`/stats/timeline?days=${e}`),countries:()=>H(`/stats/countries`),gpc:()=>H(`/stats/gpc`)};function br({current:e}){let t=Q();er(t(`dashboard.title`));let[n,r]=R(null),[i,a]=R([]),[o,s]=R([]),[c,l]=R(null),[u,d]=R(!0);return z(()=>{Promise.all([yr.overview().then(r).catch(()=>{}),yr.timeline(30).then(a).catch(()=>{}),yr.countries().then(s).catch(()=>{}),yr.gpc().then(l).catch(()=>{})]).finally(()=>d(!1))},[]),U(C,{children:u?U(`p`,{role:`status`,"aria-live":`polite`,class:`text-gray-400 text-sm`,children:t(`common.loading`)}):U(`div`,{class:`space-y-6`,children:[n&&U(`div`,{class:`grid grid-cols-2 lg:grid-cols-4 gap-4`,children:[U(mr,{label:t(`dashboard.stats.totalConsents`),value:n.totalConsents}),U(mr,{label:t(`dashboard.stats.totalVisitors`),value:n.totalVisitors}),U(mr,{label:t(`dashboard.stats.accepted`),value:`${n.acceptedPct}%`,sub:t(`dashboard.stats.acceptedSub`)}),U(mr,{label:t(`dashboard.stats.rejected`),value:`${n.rejectedPct}%`,sub:t(`dashboard.stats.rejectedSub`)})]}),U(`div`,{class:`grid grid-cols-1 lg:grid-cols-2 gap-6`,children:[U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[U(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:t(`dashboard.chart.timeline`)}),U(hr,{data:i,ariaLabel:t(`dashboard.chart.timelineAria`),noDataLabel:t(`dashboard.chart.noData`)})]}),U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[U(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:t(`dashboard.chart.countries`)}),U(gr,{data:o,noDataLabel:t(`dashboard.chart.noCountryData`)})]})]}),c&&U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:U(_r,{data:c,label:t(`dashboard.gpc.label`),sub:t(`dashboard.gpc.sub`,{detected:c.detected,total:c.total})})}),U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:U(`a`,{href:`#/reports`,class:`text-sm text-blue-600 dark:text-blue-400 hover:underline`,children:t(`dashboard.viewReports`)})})]})})}var xr={status:()=>H(`/setup/status`),config:()=>H(`/setup/config`),complianceGroups:()=>H(`/setup/compliance-groups`),seedProfiles:e=>H(`/setup/seed-profiles`,{method:`POST`,body:JSON.stringify({groups:e})}),complete:()=>H(`/setup/complete`,{method:`POST`})},$={Reports:()=>X(()=>import(`./Reports-BlvcycZ8.js`),[]),ProfileList:()=>X(()=>import(`./ProfileList-CFZ_i1zk.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])),ProfileEditor:()=>X(()=>import(`./ProfileEditor-CuMRNzdM.js`),__vite__mapDeps([12,1,2,13,6,14,9,10,15,16,17,8])),ProfileVersionHistory:()=>X(()=>import(`./ProfileVersionHistory-40HtQSrd.js`),__vite__mapDeps([18,14,9,17,8])),ArchivedProfileList:()=>X(()=>import(`./ArchivedProfileList-ChWp1RHE.js`),__vite__mapDeps([19,7,8,9])),ConsentTemplateList:()=>X(()=>import(`./ConsentTemplateList-BnU_nL8h.js`),__vite__mapDeps([20,2,4,5,6,7,8,10,15])),ConsentTemplateEditor:()=>X(()=>import(`./ConsentTemplateEditor-0iB6G95-.js`),__vite__mapDeps([21,22,1,15,6,10,23,16])),UITemplateList:()=>X(()=>import(`./UITemplateList-CGYRRlCh.js`),__vite__mapDeps([24,2,4,5,6,7,8,15])),UITemplateEditor:()=>X(()=>import(`./UITemplateEditor-B9EBcvOB.js`),__vite__mapDeps([25,22,1,15,13,6,14,16])),ConsentList:()=>X(()=>import(`./ConsentList-DLDBSjxO.js`),__vite__mapDeps([26,27,8,7,28,14])),VisitorList:()=>X(()=>import(`./VisitorList-Dne7xkNx.js`),__vite__mapDeps([29,27,8,7,28,14])),UserList:()=>X(()=>import(`./UserList-BbpiUrVr.js`),__vite__mapDeps([30,6,7,8,28,14,31,11,32])),RoleList:()=>X(()=>import(`./RoleList-CTeQdx6f.js`),__vite__mapDeps([33,1,5,6,14,32])),TenantList:()=>X(()=>import(`./TenantList-DLgPnlVv.js`),__vite__mapDeps([34,6,7,8])),VendorList:()=>X(()=>import(`./VendorList-mlOlW7ht.js`),__vite__mapDeps([35,23,11])),AuditLog:()=>X(()=>import(`./AuditLog-3lekUOk8.js`),__vite__mapDeps([36,3,27,8,7,28,14])),Settings:()=>X(()=>import(`./Settings-DLsvGtMh.js`),[]),ChangePassword:()=>X(()=>import(`./ChangePassword-BYlF08cE.js`),__vite__mapDeps([37,31])),ApiConfig:()=>X(()=>import(`./ApiConfig-dmDLJNfI.js`),__vite__mapDeps([38,1,2,39,5,6])),HowItWorks:()=>X(()=>import(`./HowItWorks-B05y-6xX.js`),[]),SetupWizard:()=>X(()=>import(`./SetupWizard-BVzGrBm2.js`),__vite__mapDeps([40,1,39]))},Sr=q(()=>$.Reports().then(e=>({default:e.Reports}))),Cr=q(()=>$.ProfileList().then(e=>({default:e.ProfileList}))),wr=q(()=>$.ProfileEditor().then(e=>({default:e.ProfileEditor}))),Tr=q(()=>$.ProfileVersionHistory().then(e=>({default:e.ProfileVersionHistory}))),Er=q(()=>$.ArchivedProfileList().then(e=>({default:e.ArchivedProfileList}))),Dr=q(()=>$.ConsentTemplateList().then(e=>({default:e.ConsentTemplateList}))),Or=q(()=>$.ConsentTemplateEditor().then(e=>({default:e.ConsentTemplateEditor}))),kr=q(()=>$.UITemplateList().then(e=>({default:e.UITemplateList}))),Ar=q(()=>$.UITemplateEditor().then(e=>({default:e.UITemplateEditor}))),jr=q(()=>$.ConsentList().then(e=>({default:e.ConsentList}))),Mr=q(()=>$.VisitorList().then(e=>({default:e.VisitorList}))),Nr=q(()=>$.UserList().then(e=>({default:e.UserList}))),Pr=q(()=>$.RoleList().then(e=>({default:e.RoleList}))),Fr=q(()=>$.TenantList().then(e=>({default:e.TenantList}))),Ir=q(()=>$.VendorList().then(e=>({default:e.VendorList}))),Lr=q(()=>$.AuditLog().then(e=>({default:e.AuditLogPage}))),Rr=q(()=>$.Settings().then(e=>({default:e.Settings}))),zr=q(()=>$.ChangePassword().then(e=>({default:e.ChangePassword}))),Br=q(()=>$.ApiConfig().then(e=>({default:e.ApiConfig}))),Vr=q(()=>$.HowItWorks().then(e=>({default:e.HowItWorks}))),Hr=q(()=>$.SetupWizard().then(e=>({default:e.SetupWizard})));function Ur(){for(let e of Object.values($))e().catch(()=>{})}function Wr(e){typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e):window.setTimeout(e,1)}var Gr=U(`div`,{class:`p-6 text-sm text-gray-400`,children:`Loading…`});function Kr(){return window.location.hash||`#/`}function qr(){let{user:e}=G(),[t,n]=R(Kr),[r,i]=R(null),[a,o]=R(``);return z(()=>{let e=()=>n(Kr());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),z(()=>{e?xr.status().then(({completed:e})=>i(e)).catch(()=>i(!0)):i(null)},[e]),z(()=>{e&&Wr(Ur)},[e]),e?t===`#/setup`?r===!0?(window.location.hash=`#/`,null):U(K,{fallback:Gr,children:U(Hr,{onComplete:()=>i(!0)})}):r===!1?(t!==`#/setup`&&(window.location.hash=`#/setup`),null):t===`#/login`?(window.location.hash=`#/`,null):U($n,{setTitle:o,children:U(ur,{title:a,current:t,children:U(K,{fallback:Gr,children:Jr(t)})})}):(t!==`#/login`&&(window.location.hash=`#/login`),U(pr,{}))}function Jr(e){if(e===`#/`||e===`#`)return U(br,{current:e});if(e===`#/reports`)return U(Sr,{current:e});if(e===`#/banners/profiles`)return U(Cr,{current:e});if(e===`#/banners/profiles/new`)return U(wr,{current:e});if(e===`#/banners/profiles/archived`)return U(Er,{current:e});{let t=e.match(/^#\/banners\/profiles\/([^/]+)\/history(?:\?(.*))?$/);if(t){let n=new URLSearchParams(t[2]??``),r=e=>{let t=n.get(e);return t!==null&&Number.isInteger(Number(t))?Number(t):void 0},i=r(`version`),a=r(`compare`);return U(Tr,{id:t[1],current:e,...i===void 0?{}:{initialVersion:i},...a===void 0?{}:{compareVersion:a}})}}return e.startsWith(`#/banners/profiles/`)?U(wr,{id:e.slice(19),current:e}):e===`#/banners/consent-templates`?U(Dr,{current:e}):e===`#/banners/consent-templates/new`?U(Or,{current:e}):e.startsWith(`#/banners/consent-templates/`)?U(Or,{id:e.slice(28),current:e}):e===`#/banners/ui-templates`?U(kr,{current:e}):e===`#/banners/ui-templates/new`?U(Ar,{current:e}):e.startsWith(`#/banners/ui-templates/`)?U(Ar,{id:e.slice(23),current:e}):e===`#/consents`||e.startsWith(`#/consents?`)?U(jr,{current:e}):e===`#/visitors`||e.startsWith(`#/visitors?`)?U(Mr,{current:e}):e===`#/users`?U(Nr,{current:e}):e===`#/roles`?U(Pr,{current:e}):e===`#/tenants`?U(Fr,{current:e}):e===`#/vendors`||e.startsWith(`#/vendors?`)?U(Ir,{current:e}):e===`#/audit`||e.startsWith(`#/audit?`)?U(Lr,{current:e}):e===`#/api/config`?U(Br,{current:e}):e===`#/settings`?U(Rr,{current:e}):e===`#/settings/change-password`?U(zr,{current:e}):e===`#/how-it-works`?U(Vr,{current:e}):U(br,{current:`#/`})}function Yr(){return U(Ye,{children:U(et,{children:U(Jn,{children:U(qe,{children:U(qr,{})})})})})}pe(U(Yr,{}),document.getElementById(`app`));export{z as A,V as C,Te as D,H as E,C as M,Ee as O,U as S,Re as T,Y as _,hr as a,Xe as b,Dn as c,an as d,nn as f,Wt as g,Kt as h,mr as i,De as j,R as k,_n as l,Jt as m,yr as n,er as o,en as p,vr as r,Q as s,xr as t,sn as u,_t as v,Be as w,G as x,tt as y};
26
+ Preference Modal only — there's no equivalent for the Main Banner or GPC Banner.`,_section_sites:`── Sites / Tenants ───────────────────────────────`,"sites.title":`Sites / Tenants`,"sites.createNew":`Create new site`,"sites.namePlaceholder":`Site name`,"sites.slugPlaceholder":`slug (e.g. site-a)`,"sites.col.name":`Name`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`Created`,"sites.empty":`No sites yet.`,"sites.dialog.delete.title":`Delete "{{name}}"?`,"sites.dialog.delete.message":`This site and all associated data will be permanently removed. This cannot be undone.`,"sites.error.create":`Failed to create site.`,_section_vendors:`── TCF Vendors ───────────────────────────────────`,"vendors.title":`TCF Vendor List`,"vendors.info.title":`What is the TCF Vendor List?`,"vendors.searchPlaceholder":`Search vendors…`,"vendors.gvlMeta":`GVL v{{version}} · {{total}} vendors`,"vendors.loading":`Loading vendor list…`,"vendors.noResults":`No vendors found.`,"vendors.col.id":`ID`,"vendors.col.name":`Name`,"vendors.col.purposes":`Purposes`,"vendors.col.liPurposes":`LI Purposes`,"vendors.col.specialPurposes":`Special Purposes`,"vendors.pagination":`Page {{page}} of {{totalPages}} · {{total}} vendors total`,"vendors.prev":`← Prev`,"vendors.next":`Next →`,"tcfRegistration.title":`TCF registration needs to be reconfirmed`,"tcfRegistration.body":`compliance.tcf is enabled with cmpId {{cmpId}} (version {{cmpVersion}}), but this registration hasn't been confirmed yet — TCF is being treated as disabled: no window.__tcfapi in the widget, no tcfString on consent records.`,"tcfRegistration.deregistered":`This cmpId was deregistered with IAB Europe on {{date}}. Confirmation is blocked until you register a new cmpId and update your server config.`,"tcfRegistration.notFound":`This cmpId wasn't found in the cached IAB CMP List yet. Registration can take time to propagate — try "Refresh Status" in a little while.`,"tcfRegistration.checkbox":`TCF is enabled, and we have registered this cmpId ({{cmpId}}, version {{cmpVersion}}) with IAB Europe.`,"tcfRegistration.confirmButton":`Confirm registration`,"tcfRegistration.refreshStatus":`Refresh Status`,"tcfRegistration.loadError":`Could not load TCF registration status.`,"tcfRegistration.confirmError":`Could not confirm TCF registration.`,"gppRegistration.title":`GPP registration needs to be reconfirmed`,"gppRegistration.body":`compliance.gpp is enabled with cmpId {{cmpId}} (version {{cmpVersion}}), but this registration hasn't been confirmed yet — GPP is being treated as disabled: no window.__gpp in the widget, no gppString on consent records.`,"gppRegistration.checkbox":`GPP is enabled, and we have registered this cmpId ({{cmpId}}, version {{cmpVersion}}).`,"gppRegistration.confirmButton":`Confirm registration`,"gppRegistration.loadError":`Could not load GPP registration status.`,"gppRegistration.confirmError":`Could not confirm GPP registration.`,_section_audit:`── Audit Log ─────────────────────────────────────`,"audit.title":`Audit Log`,"audit.empty":`No audit events yet.`,"audit.col.time":`Time`,"audit.col.action":`Action`,"audit.col.resource":`Resource`,"audit.col.resourceId":`Resource ID`,"audit.col.actor":`Actor`,"audit.actor.system":`system`,"audit.viewHistory":`Compare`,"audit.searchPlaceholder":`Search action, resource, actor…`,"audit.detail.title":`Audit Entry`,"audit.detail.oldData":`Old data`,"audit.detail.newData":`New data`,_section_apiConfig:`── API Configuration ─────────────────────────`,"apiConfig.title":`API Configuration`,"apiConfig.public.heading":`Public API`,"apiConfig.public.about.text":`Used by the widget to submit and manage consent. There is no auth token — Allowed Origins below is its only access gate.`,"apiConfig.public.about.link":`Open Public API reference on consenti.dev`,"apiConfig.admin.heading":`Admin API`,"apiConfig.admin.about.text":`Use these tokens to call the Consenti admin API from scripts, CI/CD, or server-side integrations. Every route, request/response shape, and auth header is documented on consenti.dev.`,"apiConfig.admin.about.link":`Open Admin API reference on consenti.dev`,"apiConfig.endpoint.heading":`Endpoint`,"apiConfig.endpoint.hint":`Base URL for this deployment, resolved from your configuration.`,"apiConfig.origins.heading":`Allowed Origins`,"apiConfig.origins.hint":`Only requests from these origins will be accepted. Use * to allow all (not recommended for production).`,"apiConfig.origins.publicNote":`The public API has no auth token — this list is its only access gate.`,"apiConfig.origins.adminNote":`An extra layer on top of Bearer-token auth. Include this dashboard's own origin ({{origin}}) to avoid locking yourself out.`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`No origins configured — all origins are currently allowed.`,"apiConfig.origins.errorDuplicate":`Already in the list.`,"apiConfig.origins.errorSave":`Failed to save. Please try again.`,"apiConfig.origins.remove":`Remove`,"apiConfig.tokens.heading":`Admin API Tokens`,"apiConfig.tokens.hint":`Bearer tokens for server-side and CI/CD access to the Consenti admin API. Pass as Authorization: Bearer <token>. Never expose in client-side code — these grant full admin access.`,"apiConfig.tokens.created":`Token created — copy it now, it won't be shown again.`,"apiConfig.tokens.placeholder":`Token name (e.g. CI deploy)`,"apiConfig.tokens.empty":`No tokens yet.`,"apiConfig.tokens.errorName":`Name is required`,"apiConfig.tokens.errorCreate":`Failed to create token`,"apiConfig.tokens.col.name":`Name`,"apiConfig.tokens.col.status":`Status`,"apiConfig.tokens.col.created":`Created`,"apiConfig.tokens.status.active":`Active`,"apiConfig.tokens.status.revoked":`Revoked`,"apiConfig.tokens.status.expired":`Expired`,"apiConfig.tokens.col.expires":`Expires`,"apiConfig.tokens.expiresLabel":`Expires (optional)`,"apiConfig.tokens.expiresNever":`Never`,"apiConfig.tokens.dialog.title":`Revoke this API token?`,"apiConfig.tokens.dialog.message":`Any application using this token will immediately lose access.`,"apiConfig.tokens.reactivate":`Reactivate`,"apiConfig.tokens.deleteDialog.title":`Permanently delete this API token?`,"apiConfig.tokens.deleteDialog.message":`This removes the token record entirely and cannot be undone. Reactivation will no longer be possible.`,_section_settings:`── Settings ──────────────────────────────────────`,"settings.title":`Settings`,"settings.account.heading":`Account`,"settings.account.email":`Email:`,"settings.account.roles":`Roles:`,"settings.account.id":`ID:`,"settings.account.changePassword":`Change Password`,"settings.export.heading":`Export Data`,"settings.export.hint":`Download all consent records or audit logs.`,"settings.export.consentCsv":`Consent CSV`,"settings.export.consentXlsx":`Consent XLSX`,"settings.export.consentJson":`Consent JSON`,"settings.export.auditCsv":`Audit CSV`,"settings.about.heading":`About`,"settings.about.text":`Consenti v0.1.0 — Open-source, GDPR-style Consent Management Platform.`,"settings.about.license":`Apache 2.0 License.`,_section_changePassword:`── Change Password ───────────────────────────`,"changePassword.title":`Change Password`,"changePassword.hint":`Choose a strong password of at least 12 characters.`,"changePassword.success":`Password updated successfully.`,"changePassword.newPassword":`New Password`,"changePassword.newPasswordPlaceholder":`Min. 12 characters`,"changePassword.confirmPassword":`Confirm New Password`,"changePassword.confirmPasswordPlaceholder":`Repeat new password`,"changePassword.submit":`Update Password`,"changePassword.submitting":`Saving…`,"changePassword.error.minLength":`Password must be at least 12 characters.`,"changePassword.error.mismatch":`Passwords do not match.`,"changePassword.error.failed":`Failed to update password.`,_section_howItWorks:`── How Consenti Works ───────────────────────────────`,"nav.howItWorks":`How Consenti Works`,"howItWorks.title":`How Consenti Works`,"howItWorks.intro":`Consenti is an open-source, GDPR-style Consent Management Platform. It handles cookie consent collection, storage, and reporting for your websites. This guide walks you through the main workflow and describes every section of the dashboard.`,"howItWorks.workflow.heading":`Core Workflow`,"howItWorks.workflow.step1.title":`Define Cookie Categories`,"howItWorks.workflow.step1.desc":`Go to Consent Banners → Cookie Templates and create a template that lists every cookie category your site uses (e.g. analytics, marketing). Set the legal basis and expiry for each.`,"howItWorks.workflow.step2.title":`Design the Consent UI`,"howItWorks.workflow.step2.desc":`Go to Consent Banners → UI Templates and configure the visual layout of your banner and preference modal — button labels, colours, layout style, and category display.`,"howItWorks.workflow.step3.title":`Create a Consent Profile`,"howItWorks.workflow.step3.desc":`Go to Consent Banners → Profiles and combine a Cookie Template with a UI Template. Add translated text for every locale you support, enable the required regulations (GDPR, CCPA, DPDPA), and publish.`,"howItWorks.workflow.step4.title":`Embed the Widget`,"howItWorks.workflow.step4.desc":`Copy your API key from API → Config and add the Consenti script tag to your website. The widget fetches your published profile and shows the consent banner automatically.`,"howItWorks.workflow.step5.title":`Monitor and Audit`,"howItWorks.workflow.step5.desc":`Use the Consents and Visitors pages to review live consent records. Use the Audit Log for a tamper-evident history of all administrative actions for compliance evidence.`,"howItWorks.features.heading":`Dashboard Features`,"howItWorks.features.dashboard.title":`Dashboard`,"howItWorks.features.dashboard.desc":`The home screen shows real-time KPIs — total consents, acceptance rate, rejection rate, and a time-series chart. Use it to spot trends and gauge the impact of banner changes.`,"howItWorks.features.reports.title":`Reports`,"howItWorks.features.reports.desc":`Opt-in trend over a date range, plus category and locale breakdowns (granted/denied/objected). Requires the stats:view permission.`,"howItWorks.features.consentTemplates.title":`Consent Templates`,"howItWorks.features.consentTemplates.desc":`Reusable lists of consent parameters grouped into categories. Each category owns the legal basis (consent, legitimate interest, mandatory) for its parameters; parameters carry purpose, GPC signal handling, pre-grant, and optional TCF vendor or CPRA category mapping.`,"howItWorks.features.uiTemplates.title":`UI Templates`,"howItWorks.features.uiTemplates.desc":`Controls the look and feel of the consent banner, GPC notice, and preference modal. Configure button sets, heading tags, overlay opacity, and category display order.`,"howItWorks.features.profiles.title":`Profiles`,"howItWorks.features.profiles.desc":`A Profile is the deployable unit. It binds a Cookie Template + UI Template together, stores multi-locale content, and tracks a version number so you can roll back. Only one profile per domain can be active at a time.`,"howItWorks.features.consents.title":`Consents`,"howItWorks.features.consents.desc":`A searchable, filterable log of every individual consent record submitted by visitors. Each record shows the visitor ID, profile used, locale, GPC signal, consent choices, and timestamp.`,"howItWorks.features.visitors.title":`Visitors`,"howItWorks.features.visitors.desc":`A list of unique visitor identifiers seen across your sites, with their country, first-seen date, and last-seen date. Visitor IDs are pseudonymous UUIDs stored without raw IP addresses.`,"howItWorks.features.users.title":`Users`,"howItWorks.features.users.desc":`Manage the admin accounts that can log into this dashboard. Assign roles, activate or deactivate accounts, and restrict users to specific sites in multi-tenant deployments.`,"howItWorks.features.roles.title":`Roles`,"howItWorks.features.roles.desc":`Define named permission sets (e.g. Viewer, Editor, Admin). Assign granular permissions such as consent:view, profile:edit, or audit:view to each role, then assign roles to users.`,"howItWorks.features.vendors.title":`Vendors`,"howItWorks.features.vendors.desc":`Browse the IAB Global Vendor List (GVL) to look up TCF vendor IDs, declared purposes, and legitimate-interest purposes. Use these IDs when configuring cookie categories in your templates.`,"howItWorks.features.audit.title":`Audit Log`,"howItWorks.features.audit.desc":`An append-only, tamper-evident log of every administrative action — profile saves, user changes, API key creation, and more. Required for GDPR accountability obligations.`,"howItWorks.features.api.title":`API & Keys`,"howItWorks.features.api.desc":`Generate and revoke API tokens, configure allowed CORS origins for the public consent API, and browse the interactive OpenAPI reference to understand every endpoint.`,"howItWorks.features.settings.title":`Settings`,"howItWorks.features.settings.desc":`View your account details, change your password, and export consent or audit data as CSV, XLSX, or JSON for offline analysis or regulatory submission.`,"howItWorks.docs.heading":`Full Documentation`,"howItWorks.docs.text":`Detailed guides, configuration references, integration examples, and a live playground are available on the Consenti documentation site.`,"howItWorks.docs.link":`Open consenti.dev/docs →`,"howItWorks.consentFlow.heading":`End-to-End Consent Flow`,"howItWorks.consentFlow.step1.title":`Widget Initializes`,"howItWorks.consentFlow.step1.desc":`The Consenti script loads in the visitor's browser and reads your configuration (API key, compliance.type). If a valid, unexpired consent cookie already exists, the widget silently exits — no banner is shown.`,"howItWorks.consentFlow.step2.title":`Jurisdiction Detected`,"howItWorks.consentFlow.step2.desc":`If compliance.type is 'auto', the widget calls GET /resolve-profile passing the visitor's timezone, Accept-Language header, and IP address. The server maps these signals to a complianceGroup using the built-in country → compliance map.`,"howItWorks.consentFlow.step3.title":`Profile Fetched`,"howItWorks.consentFlow.step3.desc":`The widget fetches the active profile for the resolved complianceGroup and the visitor's locale. The response is a flat JSON object with all banner text, cookie categories, UI settings, and regulation flags — ready to render.`,"howItWorks.consentFlow.step4.title":`Banner Rendered`,"howItWorks.consentFlow.step4.desc":`The widget renders the banner or preference modal using the profile's UI template. Mandatory categories are pre-checked and cannot be deselected. Optional categories show their legal basis (consent or legitimate interest).`,"howItWorks.consentFlow.step5.title":`Consent Submitted`,"howItWorks.consentFlow.step5.desc":`When the visitor acts (Accept All, Reject Optional, or Save Preferences), the widget POSTs a consent record to the API with the visitor ID, profile version, per-category status (granted/denied/objected), GPC signal, timestamp, and locale.`,"howItWorks.consentFlow.step6.title":`Stored and Audited`,"howItWorks.consentFlow.step6.desc":`The API validates the payload, stores the consent record, and appends an entry to the append-only audit log. The visitor record is upserted with country and first/last-seen dates. The widget writes the consent cookie so future visits skip the banner.`,"howItWorks.profileResolution.heading":`Profile Resolution Algorithm`,"howItWorks.profileResolution.intro":`When a visitor arrives, Consenti resolves which consent profile to show in five steps.`,"howItWorks.profileResolution.step1.title":`Geo Signals Collected`,"howItWorks.profileResolution.step1.desc":`The widget sends three signals to GET /resolve-profile: the browser's Intl.DateTimeFormat timezone, the Accept-Language header (or lang query param), and the server-side IP address.`,"howItWorks.profileResolution.step2.title":`Country Determined`,"howItWorks.profileResolution.step2.desc":`The server tries in order: (1) IP geolocation via the configured geoDataProvider; (2) timezone → country table lookup; (3) language tag → country heuristic (e.g. 'de' → DE). The first non-empty match wins.`,"howItWorks.profileResolution.step3.title":`Compliance Group Mapped`,"howItWorks.profileResolution.step3.desc":`The ISO-3166-1 alpha-2 country code (plus optional region/state) is looked up in the embedded COUNTRY → COMPLIANCE_GROUP map. A region override (e.g. US/CA → optOutCalifornia) takes precedence over the country default.`,"howItWorks.profileResolution.step4.title":`Active Profile Located`,"howItWorks.profileResolution.step4.desc":`The system queries the database for the active profile whose complianceGroup matches the resolved group. Only one profile per complianceGroup may be active at a time. If none exists, a 404 is returned and the widget may fall back to a profileOverride.`,"howItWorks.profileResolution.step5.title":`Locale Resolved`,"howItWorks.profileResolution.step5.desc":`The best locale is picked by: (1) exact match with the widget's requested locale; (2) language-prefix match (e.g. 'de-AT' → 'de'); (3) geo-resolved locale from the provider; (4) the profile's defaultLocale. The resolved JSON is served from a static file (published profiles) or directly from the database (previews).`,"howItWorks.complianceGroups.heading":`Compliance Groups`,"howItWorks.complianceGroups.intro":`Every country in the world maps to one of eight compliance groups. Each group determines what Compliance Group the widget must follow.`,"howItWorks.complianceGroups.optIn.title":`optIn — GDPR / ePrivacy Strict Opt-In`,"howItWorks.complianceGroups.optIn.desc":`Prior consent is required before any non-essential cookie is set. Visitors must be given a genuine choice to reject, withdrawal must be as easy as giving consent, and granular per-category choices are mandatory.`,"howItWorks.complianceGroups.optIn.laws":`GDPR, ePrivacy Directive, UK GDPR, PECR, revFADP (CH), KVKK (TR), PDPA (TH), and other strict national laws`,"howItWorks.complianceGroups.optIn.countries":`All EU member states, UK, Switzerland, Turkey, Thailand, Iceland, Liechtenstein, Norway, Guernsey, Gibraltar, and other countries with strict ePrivacy rules`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — India DPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`India's Digital Personal Data Protection Act 2023 requires explicit opt-in consent. Additional obligations include naming a Data Fiduciary, providing a dedicated consent notice, and supporting Data Principal rights. Set the dpdpaDataFiduciary extra field in your profile.`,"howItWorks.complianceGroups.optInDPDPA.laws":`Digital Personal Data Protection Act 2023 (DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`India (IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — China Multi-Law Stack`,"howItWorks.complianceGroups.optInChina.desc":`China's data governance requires explicit consent under PIPL, combined with obligations from the Data Security Law (DSL) and Cybersecurity Law (CSL). Additional requirements apply to cross-border data transfers and data classification.`,"howItWorks.complianceGroups.optInChina.laws":`Personal Information Protection Law (PIPL), Data Security Law (DSL), Cybersecurity Law (CSL)`,"howItWorks.complianceGroups.optInChina.countries":`China (CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — California CCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`Data may be collected by default but consumers must be provided with a clear 'Do Not Sell or Share My Personal Information' opt-out. The Global Privacy Control (GPC) browser signal must be honoured as a valid opt-out.`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA, CPRA (California Consumer Privacy Act / California Privacy Rights Act)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`United States — California (US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — Other US State Laws`,"howItWorks.complianceGroups.optOutUSState.desc":`Modelled on California's opt-out framework. Consumers can opt out of targeted advertising and the sale of personal data. Several states require GPC to be honoured. Covered businesses must provide clear opt-out mechanisms.`,"howItWorks.complianceGroups.optOutUSState.laws":`CDPA (VA), CPA (CO), CTDPA (CT), UCPA (UT), TDPSA (TX), DPDPA (DE), NJDPA (NJ), OCPA (OR), MCDPA (MN), MODPA (MD), KCDPA (KY), TIPA (TN), NDPA (NE), ICDPA (IA/IN), MCDPA (MT), NHPA (NH), RIDTPA (RI)`,"howItWorks.complianceGroups.optOutUSState.countries":`United States — VA, CO, CT, UT, TX, DE, NJ, OR, MN, MD, KY, TN, NE, IA, IN, MT, NH, RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — General Privacy / Consent`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`A general privacy law applies but does not impose a strict PECR/ePrivacy-style cookie banner requirement. Best practice is to offer a consent choice for non-essential cookies and a clear privacy notice, but the legal threshold is lower than GDPR opt-in.`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / Law 25 (CA), LGPD (BR — use hybridBrazil), POPIA (ZA), APPI (JP), Privacy Act (AU/NZ), PDPA-SG, PDPA-MY, PIPA-KR, PDPD-VN, DPA-PH, PDP-ID and many others`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`Canada, Australia, New Zealand, Japan, South Korea, Singapore, Malaysia, South Africa, and many LatAm, African, and Asian countries`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — Brazil LGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`Brazil's LGPD is broadly similar to GDPR but analytics and advertising cookies may be treated under the legitimate interest legal basis depending on the data controller's assessment. The banner is shown, but the category-level legal basis can be more nuanced than strict GDPR opt-in.`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`Brazil (BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — Privacy Notice Only`,"howItWorks.complianceGroups.noticeOnly.desc":`No dedicated cookie regulation applies, or the existing regime requires only a privacy notice — not an opt-in or opt-out banner. Displaying a consent banner is still recommended for transparency, but is not strictly mandated by law.`,"howItWorks.complianceGroups.noticeOnly.laws":`Varies — countries with no dedicated cookie / ePrivacy regulation`,"howItWorks.complianceGroups.noticeOnly.countries":`Many countries in Africa, Central Asia, the Caribbean, and Pacific regions not covered by the above groups`,"howItWorks.enums.heading":`Key Values Reference`,"howItWorks.enums.legalBasis.heading":`legalBasis (cookie category)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — Category is always active regardless of consent (e.g. session, authentication). Never blocked by GPC or opt-out signals.`,"howItWorks.enums.legalBasis.consent":`consent — Requires explicit opt-in from the visitor. Blocked by default; blocked by GPC in all opt-in jurisdictions.`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — Relies on the controller's legitimate interest. Active by default; visitor can object. Soft-blocked by GPC in some jurisdictions (EU, UK).`,"howItWorks.enums.consentStatus.heading":`ConsentStatus (per category record)`,"howItWorks.enums.consentStatus.granted":`granted — Visitor gave explicit consent for this category.`,"howItWorks.enums.consentStatus.denied":`denied — Visitor explicitly refused consent for this category.`,"howItWorks.enums.consentStatus.objected":`objected — Visitor objected to a legitimate-interest category (opt-out, not a refusal of consent).`,"howItWorks.enums.geoProvider.heading":`geoDataProvider options`,"howItWorks.enums.geoProvider.default":`default / timezone — Uses the browser timezone (Intl.DateTimeFormat) to infer country, falling back to Accept-Language. No extra dependency.`,"howItWorks.enums.geoProvider.language":`language — Derives country from Accept-Language only (e.g. 'de' → DE, 'pt' → BR). Fast but imprecise.`,"howItWorks.enums.geoProvider.geoip":`geoip — Uses the geoip-lite npm package with a bundled MaxMind Lite database. Requires: npm install geoip-lite.`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — Calls ipinfo.io via built-in HTTPS (zero extra dependency). Adds ~50–200 ms per first-visit request.`,"howItWorks.enums.geoProvider.maxmind":`maxmind — Uses the maxmind npm package with a local GeoLite2-City.mmdb file. Most accurate. Requires MAXMIND_DB_PATH env var and npm install maxmind.`,"howItWorks.enums.geoProvider.custom":`custom function — Pass a CountryResolverFn to compliance.geoDataProvider to integrate any geo-IP or CDN provider.`,"consentTemplates.editor.categories":`Consent Categories`,"consentTemplates.editor.addCategory":`+ Add Category`,"consentTemplates.editor.noCategories":`No categories defined yet. Add one above.`,"consentTemplates.editor.error.noCategories":`At least one category is required.`,"consentTemplates.editor.error.catIds":`All categories must have an ID.`,"consentTemplates.editor.error.uniqueCatIds":`Category IDs must be unique.`,"consentTemplates.editor.error.catCookies":`Every category must contain at least one parameter.`,"consentTemplates.editor.error.uncategorized":`Parameter "{{id}}" is not assigned to any category.`,"consentTemplates.editor.error.multiCategory":`Parameter "{{id}}" is assigned to more than one category.`,"consentTemplates.editor.error.purposeLegalBasisMismatch":`Parameter "{{id}}" has a non-necessary purpose but is assigned to a Mandatory category — this grants a tracking parameter with no consent gate.`,"consentTemplates.editor.warning.necessaryNotMandatory":`Parameter "{{id}}" has purpose "necessary" but is assigned to a non-Mandatory category — this may break site functionality since it can be denied.`,"consentTemplates.col.preGrantShort":`Pre Grant`,"profileEditor.config.expiryDays":`Re-consent Interval (days)`,"profileEditor.config.expiryDaysHint":`How many days until stored consent expires and the visitor is asked again.`,"profileEditor.error.expiryDays":`Expiry (days) must be at least 1.`,"profileEditor.error.customComplianceGroupRequired":`Enter a custom group name, or pick a compliance group above.`,"profileEditor.table.preGrant":`Pre Grant`,"profileEditor.table.preGrantLocked":`Already effectively pre-granted — only editable when the category's legal basis is Consent`,"profileEditor.content.receiptHeading":`Consent Receipt Checkbox`,"profileEditor.content.receiptHint":`Shown in the preference modal when "Allow consent receipt" is enabled in Step 1.`,"profileEditor.content.receiptLabel":`Checkbox label`,"profileEditor.content.receiptDescription":`Description`,"profileEditor.content.forgetMeHeading":`Forget Me Button`,"profileEditor.content.forgetMeHint":`Shown in the preference modal, below the categories, when "Show 'Forget me' button" is enabled on the linked UI Template's Preference Modal step.`,"profileEditor.content.forgetMeLabel":`Button label`,"profileEditor.content.ageGateModal.heading":`Age Gate Modal`,"profileEditor.content.ageGateModal.headingPlaceholder":`Are you 16 or older?`,"profileEditor.content.ageGateModal.bodyText":`Body text`,"profileEditor.content.ageGateModal.bodyPlaceholder":`Please confirm your age before we show you cookie preferences.`,"profileEditor.content.ageGateModal.confirmButtonLabel":`"Yes" button label`,"profileEditor.content.ageGateModal.confirmButtonPlaceholder":`Yes`,"profileEditor.content.ageGateModal.denyButtonLabel":`"No" button label`,"profileEditor.content.ageGateModal.denyButtonPlaceholder":`No`,"profileEditor.content.ageGateModal.parentalConsent.heading":`Parental Consent Message`,"profileEditor.content.ageGateModal.parentalConsent.headingPlaceholder":`Parental consent required`,"profileEditor.content.ageGateModal.parentalConsent.bodyText":`Body text`,"profileEditor.content.ageGateModal.parentalConsent.bodyPlaceholder":`Only strictly necessary cookies will be used until a parent or guardian verifies consent on your behalf.`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonLabel":`"OK" button label`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonPlaceholder":`OK`,"profileEditor.content.ageGateModal.loadDefaultsTitle":`Fill this section with generic default text for this locale`,"profileEditor.error.missingRequiredContent":`Some required content is missing for locale "{{locale}}" — check the highlighted tab.`,"profileEditor.error.saveFailedMoreFields":`(and {{count}} more field(s) need attention)`,"profileEditor.nudge.title":`Optional field left blank`,"profileEditor.nudge.headingBlank":`You left the heading blank. Visitors will see the banner without one.`,"profileEditor.nudge.introBlank":`You left the intro text blank. Visitors will see the preferences panel without one.`,"profileEditor.nudge.addNow":`Add now`,"profileEditor.nudge.ignore":`Ignore`,"profiles.error.delete":`Failed to delete profile.`};function Ln(e,t,n){let r=e[t]??t;if(!n)return r;for(let[e,t]of Object.entries(n))r=r.split(`{{${e}}}`).join(String(t));return r}var Rn=`modulepreload`,zn=function(e){return`/consenti/`+e},Bn={},Vn=function(e){return e.pathname.endsWith(`.css`)},Hn=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},X=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=zn(t,n);let r=s(t),i=Vn(r);return Hn(Bn,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:Rn,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Un={en:`English (en)`,es:`Español (es)`,fr:`Français (fr)`,de:`Deutsch (de)`,ja:`日本語 (ja)`,"zh-CN":`中文 (zh-CN)`},Wn=Object.keys(Un),Gn={es:()=>X(()=>import(`./es-B6Jp0OPe.js`).then(e=>e.default),[]),fr:()=>X(()=>import(`./fr-CshYcQPW.js`).then(e=>e.default),[]),de:()=>X(()=>import(`./de-jwngydrC.js`).then(e=>e.default),[]),ja:()=>X(()=>import(`./ja-CgjZNBrc.js`).then(e=>e.default),[]),"zh-CN":()=>X(()=>import(`./zh-CN-BnLZkfBC.js`).then(e=>e.default),[])},Z={en:In};function Kn(e){if(Z[e])return Promise.resolve(Z[e]);let t=Gn[e];return t?t().then(t=>(Z[e]=t,t)):Promise.resolve(In)}var qn=N({locale:`en`,setLocale:()=>{},t:e=>e});function Jn({children:e}){let[t,n]=R(()=>{try{let e=localStorage.getItem(`dashboard-locale`);return e&&Wn.includes(e)?e:`en`}catch{return`en`}}),[r,i]=R(Z[t]??In);return z(()=>{t!==`en`&&!Z[t]&&Kn(t).then(i)},[]),U(qn.Provider,{value:{locale:t,setLocale:e=>{if(e!==t){n(e);try{localStorage.setItem(`dashboard-locale`,e)}catch{}Z[e]?i(Z[e]):Kn(e).then(i)}},t:(e,t)=>Ln(r,e,t)},children:e})}var Yn=()=>B(qn),Q=()=>B(qn).t,Xn=sn;function Zn(){let{locale:e,setLocale:t,t:n}=Yn();return U(`div`,{class:`flex items-center gap-1`,title:n(`locale.switcherAria`),children:[U(Xn,{size:13,className:`text-gray-400 dark:text-gray-500 shrink-0`,"aria-hidden":`true`}),U(`select`,{value:e,onChange:e=>t(e.target.value),"aria-label":n(`locale.switcherAria`),disabled:Wn.length<=1,class:`text-xs text-gray-600 dark:text-gray-300 bg-transparent border-none outline-none cursor-pointer hover:text-gray-900 dark:hover:text-white appearance-none disabled:cursor-default`,children:Wn.map(e=>U(`option`,{value:e,children:Un[e]},e))})]})}var Qn=N(()=>{});function $n({setTitle:e,children:t}){return U(Qn.Provider,{value:e,children:t})}function er(e){let t=B(Qn);z(()=>{t(e)},[e,t])}var tr=[{key:`nav.dashboard`,hash:`#/`,Icon:dn},{key:`nav.reports`,hash:`#/reports`,Icon:Ht,perm:`stats:view`},{type:`group`,key:`nav.consentBanners`,baseHash:`#/banners`,Icon:Nn,children:[{key:`nav.consentTemplates`,hash:`#/banners/consent-templates`,Icon:en},{key:`nav.uiTemplates`,hash:`#/banners/ui-templates`,Icon:_n},{key:`nav.profiles`,hash:`#/banners/profiles`,Icon:Qt}]},{key:`nav.consents`,hash:`#/consents`,Icon:Dn},{key:`nav.visitors`,hash:`#/visitors`,Icon:Fn},{key:`nav.users`,hash:`#/users`,Icon:ln,perm:`user:view`},{key:`nav.roles`,hash:`#/roles`,Icon:kn,perm:`role:view`},{key:`nav.sites`,hash:`#/tenants`,Icon:sn,perm:`settings:update`,superadminOnly:!0},{key:`nav.vendors`,hash:`#/vendors`,Icon:xn,perm:`consent:view`},{key:`nav.audit`,hash:`#/audit`,Icon:Cn,perm:`audit:view`},{key:`nav.api`,hash:`#/api/config`,Icon:yn,perm:`settings:update`},{key:`nav.settings`,hash:`#/settings`,Icon:Tn},{key:`nav.howItWorks`,hash:`#/how-it-works`,Icon:Xt}];function nr({current:e,collapsed:t,onToggle:n}){let{user:r,logout:i}=G(),{appName:a,appLogoPath:o,hidePoweredBy:s}=tt(),c=Q(),[l,u]=R(()=>{let t=new Set;for(let n of tr)`type`in n&&n.type===`group`&&e.startsWith(n.baseHash)&&t.add(n.baseHash);return t}),d=e=>{u(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},f=t=>e===t||t!==`#/`&&e.startsWith(t),p=t=>e.startsWith(t.baseHash),m=r?.roles.includes(`super_admin`)??!1,h=(e,t)=>(!t||m)&&(!e||r?.permissions.includes(e));return U(`aside`,{class:`${t?`w-14`:`w-56`} min-h-screen bg-gray-900 text-gray-100 flex flex-col transition-[width] duration-200 ease-in-out overflow-hidden shrink-0 border-r border-gray-700`,"aria-label":c(`nav.adminDashboard`),children:[U(`div`,{class:`px-3 py-5 border-b border-gray-700 flex items-center gap-2`,children:t?U(`div`,{class:`w-full flex justify-center`,children:o?U(`img`,{src:o,alt:a,class:`h-7 w-7 object-contain rounded`}):U(`img`,{src:`/icon.svg`,alt:a,class:`h-7 w-7`})}):U(`div`,{class:`min-w-0`,children:[o?U(`img`,{src:o,alt:a,class:`h-7 w-auto object-contain`}):U(`img`,{src:`/logo-dark.svg`,alt:a,class:`h-7 w-auto`}),U(`p`,{class:`text-xs text-gray-400 mt-0.5`,children:c(`nav.adminDashboard`)})]})}),U(`nav`,{class:`flex-1 py-4 overflow-y-auto`,"aria-label":c(`nav.adminDashboard`),children:tr.filter(e=>h(e.perm,e.superadminOnly)).map(e=>{if(`type`in e&&e.type===`group`){let n=!t&&l.has(e.baseHash),r=p(e),i=e.children.filter(e=>h(e.perm));if(i.length===0)return null;let a=c(e.key);return U(`div`,{children:[U(`button`,{type:`button`,onClick:()=>{t?window.location.hash=i[0].hash:d(e.baseHash)},"aria-expanded":t?void 0:n,"aria-label":t?a:void 0,title:t?a:void 0,class:`w-full flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${t?`justify-center`:`justify-between`} ${r?`text-white bg-gray-800`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[U(`div`,{class:`flex items-center gap-3 ${t?``:`min-w-0`}`,children:[U(e.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!t&&U(`span`,{class:`truncate`,children:a})]}),!t&&U(Wt,{size:13,className:`shrink-0 text-gray-500 transition-transform ${n?`rotate-180`:``}`,"aria-hidden":`true`})]}),n&&U(`div`,{class:`bg-gray-950/30`,children:i.map(e=>{let t=f(e.hash),n=c(e.key);return U(`a`,{href:e.hash,"aria-current":t?`page`:void 0,class:`flex items-center gap-3 pl-8 pr-3 py-2 text-sm transition-colors ${t?`bg-blue-600 text-white`:`text-gray-400 hover:bg-gray-800 hover:text-white`}`,children:[U(e.Icon,{size:14,className:`shrink-0`,"aria-hidden":`true`}),n]},e.hash)})})]},e.baseHash)}let n=e,r=f(n.hash),i=c(n.key);return U(`a`,{href:n.hash,"aria-current":r?`page`:void 0,"aria-label":t?i:void 0,title:t?i:void 0,class:`flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${t?`justify-center`:``} ${r?`bg-blue-600 text-white`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[U(n.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!t&&i]},n.hash)})}),U(`div`,{class:`px-3 py-4 border-t border-gray-700 ${t?`flex justify-center`:``}`,children:[!t&&U(C,{children:[U(`p`,{class:`text-xs text-gray-400 truncate`,children:[r?.email,U(`br`,{}),U(`i`,{class:`text-gray-500`,children:r?.roles})]}),!s&&U(`p`,{class:`text-[10px] text-gray-600 mt-2`,children:[c(`layout.poweredBy`),` `,U(`a`,{href:`https://consenti.dev/?utm_source=dashboard&utm_medium=powered-by&utm_campaign=consenti-api`,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-gray-400 transition-colors`,children:`Consenti`})]})]}),t&&U(`button`,{onClick:i,"aria-label":c(`layout.signOut`),title:c(`layout.signOut`),class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:U(pn,{size:16,"aria-hidden":`true`})})]})]})}var rr=hn,ir=jn;function ar({collapsed:e}){let{theme:t,toggle:n}=Xe(),r=Q(),i=t===`dark`,a=r(i?`layout.toggleLight`:`layout.toggleDark`);return e?U(`button`,{onClick:n,"aria-label":a,title:a,class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:i?U(rr,{size:16,className:`text-cyan-400`}):U(ir,{size:16,className:`text-gray-400`})}):U(`button`,{onClick:n,"aria-label":a,title:a,"aria-pressed":i,class:`relative flex items-center w-8 h-6 rounded-full px-0.5 transition-all duration-300 ${i?`bg-gray-900 ring-2 ring-cyan-400`:`bg-gray-600`}`,children:U(`span`,{class:`w-5 h-5 rounded-full flex items-center justify-center transition-all duration-300 ${i?`translate-x-2 bg-gray-800`:`translate-x-0 bg-white shadow`}`,children:i?U(rr,{size:11,className:`text-cyan-400`}):U(ir,{size:11,className:`text-amber-500`})})})}var or=pn,sr=Jt,cr=Kt;function lr(){return typeof window<`u`&&window.innerWidth<768}function ur({children:e,title:t,current:n}){let[r,i]=R(()=>lr()),a=()=>i(e=>!e),{logout:o}=G(),s=Q();return z(()=>{let e=()=>{lr()&&i(!0)};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),U(`div`,{class:`flex h-screen overflow-hidden dark:bg-gray-900`,children:[U(`div`,{class:`relative shrink-0`,children:[U(nr,{current:n,collapsed:r,onToggle:a}),U(`button`,{onClick:a,"aria-label":s(r?`layout.expandSidebar`:`layout.collapseSidebar`),title:s(r?`layout.expandSidebar`:`layout.collapseSidebar`),class:`absolute top-5 -right-3.5 z-20 w-7 h-7 flex items-center justify-center bg-gray-800 border border-gray-600 rounded-full text-gray-300 hover:text-white hover:bg-gray-700 shadow-md transition-colors`,children:U(r?sr:cr,{size:13})})]}),U(`div`,{class:`flex-1 flex flex-col min-w-0 overflow-hidden`,children:[U(`header`,{class:`shrink-0 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 px-6 py-3 flex items-center justify-between min-h-[56px]`,children:[t?U(`h1`,{class:`text-xl font-semibold text-gray-800 dark:text-gray-100`,children:t}):U(`span`,{}),U(`div`,{class:`flex items-center gap-3`,children:[U(ar,{}),U(Zn,{}),U(`button`,{onClick:o,"aria-label":s(`layout.signOut`),title:s(`layout.signOut`),class:`flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400 hover:text-gray-800 dark:hover:text-white transition-colors`,children:[U(or,{size:14,"aria-hidden":`true`}),s(`layout.signOut`)]})]})]}),U(`main`,{class:`flex-1 overflow-y-auto`,children:U(`div`,{class:`p-6`,children:e})})]})]})}var dr=an,fr=nn;function pr(){let{login:e}=G(),{appName:t,appLogoPath:n,hidePoweredBy:r}=tt(),i=Q(),[a,o]=R(``),[s,c]=R(``),[l,u]=R(!1),[d,f]=R(``),[p,m]=R(!1),h=async(t,n)=>{f(``),m(!0);try{let{token:r}=await H(`/auth/login`,{method:`POST`,body:JSON.stringify({email:t,password:n})});e(r),window.location.hash=`#/`}catch{f(i(`login.error.invalid`))}finally{m(!1)}};return U(`div`,{class:`min-h-screen bg-gray-50 flex flex-col items-center justify-center p-4`,style:{background:`linear-gradient(135deg, rgb(2, 6, 23) 0%, rgb(26, 52, 96) 40%, rgb(21, 101, 192) 75%, rgb(67, 160, 71) 100%)`},children:[n?U(`img`,{src:n,alt:t,class:`h-14 w-auto mx-auto mb-3 object-contain`}):null,U(`div`,{class:`bg-white rounded-xl shadow-sm border border-gray-200 p-8 w-full max-w-sm`,children:[U(`div`,{class:`mb-6 text-center`,children:[U(`h1`,{class:`text-xl font-bold text-gray-900`,children:i(`login.title`,{appName:t})}),U(`p`,{class:`text-sm text-gray-500 mt-1`,children:i(`login.subtitle`)})]}),U(`form`,{onSubmit:e=>{e.preventDefault(),h(a,s)},class:`space-y-4`,children:[U(`div`,{children:[U(`label`,{for:`login-email`,class:`block text-sm font-medium text-gray-700 mb-1`,children:i(`login.email`)}),U(`input`,{id:`login-email`,type:`email`,required:!0,value:a,onInput:e=>o(e.target.value),class:`w-full border border-gray-300 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500`,placeholder:i(`login.emailPlaceholder`),autocomplete:`email`})]}),U(`div`,{children:[U(`label`,{for:`login-password`,class:`block text-sm font-medium text-gray-700 mb-1`,children:i(`login.password`)}),U(`div`,{class:`relative`,children:[U(`input`,{id:`login-password`,type:l?`text`:`password`,required:!0,value:s,onInput:e=>c(e.target.value),class:`w-full border border-gray-300 rounded-lg px-3 py-2 pr-10 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500`,autocomplete:`current-password`}),U(`button`,{type:`button`,onClick:()=>u(e=>!e),"aria-label":i(l?`login.hidePassword`:`login.showPassword`),class:`absolute inset-y-0 right-0 flex items-center px-3 text-gray-400 hover:text-gray-600`,children:U(l?fr:dr,{size:16})})]})]}),d&&U(`p`,{role:`alert`,class:`text-sm text-red-600 bg-red-50 border border-red-200 rounded px-3 py-2`,children:d}),U(`button`,{type:`submit`,disabled:p,class:`w-full bg-blue-600 text-white rounded-lg px-4 py-2.5 text-sm font-medium hover:bg-blue-700 disabled:opacity-50 transition-colors`,children:i(p?`login.submitting`:`login.submit`)})]}),!1,r||U(`p`,{class:`mt-5 text-center text-[11px] text-gray-400`,children:[i(`layout.poweredBy`),` `,U(`a`,{href:`https://consenti.dev/?utm_source=dashboard&utm_medium=powered-by&utm_campaign=consenti-api`,target:`_blank`,rel:`noopener noreferrer`,class:`hover:text-blue-500 transition-colors`,children:`Consenti`})]})]})]})}function mr({label:e,value:t,sub:n}){return U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[U(`p`,{class:`text-sm text-gray-500 dark:text-gray-400`,children:e}),U(`p`,{class:`text-3xl font-bold text-gray-900 dark:text-gray-100 mt-1`,children:t}),n&&U(`p`,{class:`text-xs text-gray-400 dark:text-gray-500 mt-1`,children:n})]})}function hr({data:e,ariaLabel:t,noDataLabel:n}){if(e.length===0)return U(`p`,{class:`text-sm text-gray-400`,children:n});let r=Math.max(...e.map(e=>e.count),1),i=552/Math.max(e.length-1,1),a=e.map((e,t)=>({x:24+t*i,y:96-e.count/r*72,label:e.date.slice(5),count:e.count})),o=a.map((e,t)=>`${t===0?`M`:`L`} ${e.x} ${e.y}`).join(` `),s=`${o} L ${a[a.length-1].x} 96 L ${a[0].x} 96 Z`;return U(`svg`,{viewBox:`0 0 600 120`,class:`w-full`,role:`img`,"aria-label":t,children:[U(`defs`,{children:U(`linearGradient`,{id:`tl-grad`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[U(`stop`,{offset:`0%`,"stop-color":`#6366f1`,"stop-opacity":`0.3`}),U(`stop`,{offset:`100%`,"stop-color":`#6366f1`,"stop-opacity":`0.02`})]})}),U(`path`,{d:s,fill:`url(#tl-grad)`}),U(`path`,{d:o,fill:`none`,stroke:`#6366f1`,"stroke-width":`2`,"stroke-linejoin":`round`}),a.map((t,n)=>U(`g`,{children:[U(`circle`,{cx:t.x,cy:t.y,r:`3`,fill:`#6366f1`}),n%Math.max(Math.floor(e.length/6),1)===0&&U(`text`,{x:t.x,y:116,"text-anchor":`middle`,"font-size":`8`,fill:`#9ca3af`,children:t.label})]},n))]})}function gr({data:e,noDataLabel:t}){if(e.length===0)return U(`p`,{class:`text-sm text-gray-400`,children:t});let n=e.slice(0,8),r=Math.max(...n.map(e=>e.count),1);return U(`div`,{class:`space-y-2`,children:n.map(e=>U(`div`,{class:`flex items-center gap-2`,children:[U(`span`,{class:`text-xs text-gray-500 w-8 text-right`,children:e.country}),U(`div`,{class:`flex-1 bg-gray-100 rounded h-3 overflow-hidden`,children:U(`div`,{class:`h-full bg-indigo-500 rounded`,style:{width:`${e.count/r*100}%`},"aria-hidden":`true`})}),U(`span`,{class:`text-xs text-gray-600 w-8`,children:e.count})]},e.country))})}function _r({data:e,label:t,sub:n}){let r=2*Math.PI*36,i=e.rate/100*r;return U(`div`,{class:`flex items-center gap-4`,children:[U(`svg`,{width:`88`,height:`88`,viewBox:`0 0 88 88`,role:`img`,"aria-label":`${t}: ${e.rate}%`,children:[U(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#e5e7eb`,"stroke-width":`8`}),U(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#6366f1`,"stroke-width":`8`,"stroke-dasharray":`${i} ${r}`,"stroke-linecap":`round`,transform:`rotate(-90 44 44)`}),U(`text`,{x:`44`,y:`49`,"text-anchor":`middle`,"font-size":`16`,"font-weight":`bold`,fill:`currentColor`,class:`text-gray-800 dark:text-gray-100`,"aria-hidden":`true`,children:[e.rate,`%`]})]}),U(`div`,{children:[U(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300`,children:t}),U(`p`,{class:`text-xs text-gray-500 dark:text-gray-400`,children:n})]})]})}function vr({rows:e,noDataLabel:t,grantedLabel:n,deniedLabel:r,objectedLabel:i}){if(e.length===0)return U(`p`,{class:`text-sm text-gray-400`,children:t});let a=Math.max(...e.map(e=>e.granted+e.denied+e.objected),1);return U(`div`,{class:`space-y-3`,children:[U(`div`,{class:`flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400`,children:[U(`span`,{class:`flex items-center gap-1`,children:[U(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-emerald-500 inline-block`,"aria-hidden":`true`}),n]}),U(`span`,{class:`flex items-center gap-1`,children:[U(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-rose-500 inline-block`,"aria-hidden":`true`}),r]}),U(`span`,{class:`flex items-center gap-1`,children:[U(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-amber-500 inline-block`,"aria-hidden":`true`}),i]})]}),e.map(e=>{let t=e.granted+e.denied+e.objected;return U(`div`,{class:`flex items-center gap-2`,children:[U(`span`,{class:`text-xs text-gray-600 dark:text-gray-300 w-28 truncate`,title:e.label,children:e.label}),U(`div`,{class:`flex-1 bg-gray-100 dark:bg-gray-700 rounded h-3 overflow-hidden flex`,children:t>0&&U(C,{children:[U(`div`,{class:`h-full bg-emerald-500`,style:{width:`${e.granted/a*100}%`},"aria-hidden":`true`}),U(`div`,{class:`h-full bg-rose-500`,style:{width:`${e.denied/a*100}%`},"aria-hidden":`true`}),U(`div`,{class:`h-full bg-amber-500`,style:{width:`${e.objected/a*100}%`},"aria-hidden":`true`})]})}),U(`span`,{class:`text-xs text-gray-500 dark:text-gray-400 w-10 text-right`,children:t})]},e.label)})]})}var yr={overview:()=>H(`/stats/overview`),categories:()=>H(`/stats/categories`),timeline:(e=30)=>H(`/stats/timeline?days=${e}`),countries:()=>H(`/stats/countries`),gpc:()=>H(`/stats/gpc`)};function br({current:e}){let t=Q();er(t(`dashboard.title`));let[n,r]=R(null),[i,a]=R([]),[o,s]=R([]),[c,l]=R(null),[u,d]=R(!0);return z(()=>{Promise.all([yr.overview().then(r).catch(()=>{}),yr.timeline(30).then(a).catch(()=>{}),yr.countries().then(s).catch(()=>{}),yr.gpc().then(l).catch(()=>{})]).finally(()=>d(!1))},[]),U(C,{children:u?U(`p`,{role:`status`,"aria-live":`polite`,class:`text-gray-400 text-sm`,children:t(`common.loading`)}):U(`div`,{class:`space-y-6`,children:[n&&U(`div`,{class:`grid grid-cols-2 lg:grid-cols-4 gap-4`,children:[U(mr,{label:t(`dashboard.stats.totalConsents`),value:n.totalConsents}),U(mr,{label:t(`dashboard.stats.totalVisitors`),value:n.totalVisitors}),U(mr,{label:t(`dashboard.stats.accepted`),value:`${n.acceptedPct}%`,sub:t(`dashboard.stats.acceptedSub`)}),U(mr,{label:t(`dashboard.stats.rejected`),value:`${n.rejectedPct}%`,sub:t(`dashboard.stats.rejectedSub`)})]}),U(`div`,{class:`grid grid-cols-1 lg:grid-cols-2 gap-6`,children:[U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[U(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:t(`dashboard.chart.timeline`)}),U(hr,{data:i,ariaLabel:t(`dashboard.chart.timelineAria`),noDataLabel:t(`dashboard.chart.noData`)})]}),U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[U(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:t(`dashboard.chart.countries`)}),U(gr,{data:o,noDataLabel:t(`dashboard.chart.noCountryData`)})]})]}),c&&U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:U(_r,{data:c,label:t(`dashboard.gpc.label`),sub:t(`dashboard.gpc.sub`,{detected:c.detected,total:c.total})})}),U(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:U(`a`,{href:`#/reports`,class:`text-sm text-blue-600 dark:text-blue-400 hover:underline`,children:t(`dashboard.viewReports`)})})]})})}var xr={status:()=>H(`/setup/status`),config:()=>H(`/setup/config`),complianceGroups:()=>H(`/setup/compliance-groups`),seedProfiles:e=>H(`/setup/seed-profiles`,{method:`POST`,body:JSON.stringify({groups:e})}),complete:()=>H(`/setup/complete`,{method:`POST`})},$={Reports:()=>X(()=>import(`./Reports-CHpF_j2k.js`),[]),ProfileList:()=>X(()=>import(`./ProfileList-Ti5ZML_L.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11])),ProfileEditor:()=>X(()=>import(`./ProfileEditor-BNUxXKMk.js`),__vite__mapDeps([12,1,2,13,6,14,9,10,15,16,17,8])),ProfileVersionHistory:()=>X(()=>import(`./ProfileVersionHistory-D2KtUROF.js`),__vite__mapDeps([18,14,9,17,8])),ArchivedProfileList:()=>X(()=>import(`./ArchivedProfileList-fRvXAaWy.js`),__vite__mapDeps([19,7,8,9])),ConsentTemplateList:()=>X(()=>import(`./ConsentTemplateList-CwNVxHyZ.js`),__vite__mapDeps([20,2,4,5,6,7,8,10,15])),ConsentTemplateEditor:()=>X(()=>import(`./ConsentTemplateEditor-DZGFzkTA.js`),__vite__mapDeps([21,22,1,15,6,10,23,16])),UITemplateList:()=>X(()=>import(`./UITemplateList-NKwDQJAw.js`),__vite__mapDeps([24,2,4,5,6,7,8,15])),UITemplateEditor:()=>X(()=>import(`./UITemplateEditor-CR7TnHBH.js`),__vite__mapDeps([25,22,1,15,13,6,14,16])),ConsentList:()=>X(()=>import(`./ConsentList-CyddMOrW.js`),__vite__mapDeps([26,27,8,7,28,14])),VisitorList:()=>X(()=>import(`./VisitorList-BVSFRtul.js`),__vite__mapDeps([29,27,8,7,28,14])),UserList:()=>X(()=>import(`./UserList-DMk0_UF0.js`),__vite__mapDeps([30,6,7,8,28,14,31,11,32])),RoleList:()=>X(()=>import(`./RoleList-BICQW5gU.js`),__vite__mapDeps([33,1,5,6,14,32])),TenantList:()=>X(()=>import(`./TenantList-Bbwcxyo8.js`),__vite__mapDeps([34,6,7,8])),VendorList:()=>X(()=>import(`./VendorList-BawJ8Kyc.js`),__vite__mapDeps([35,23,11])),AuditLog:()=>X(()=>import(`./AuditLog-9flkPiEQ.js`),__vite__mapDeps([36,3,27,8,7,28,14])),Settings:()=>X(()=>import(`./Settings-BlOcU0wL.js`),[]),ChangePassword:()=>X(()=>import(`./ChangePassword-D--mNLLR.js`),__vite__mapDeps([37,31])),ApiConfig:()=>X(()=>import(`./ApiConfig-DLPkgWsM.js`),__vite__mapDeps([38,1,2,39,5,6])),HowItWorks:()=>X(()=>import(`./HowItWorks-10CyO4Kp.js`),[]),SetupWizard:()=>X(()=>import(`./SetupWizard-DReZ5DWr.js`),__vite__mapDeps([40,1,39]))},Sr=q(()=>$.Reports().then(e=>({default:e.Reports}))),Cr=q(()=>$.ProfileList().then(e=>({default:e.ProfileList}))),wr=q(()=>$.ProfileEditor().then(e=>({default:e.ProfileEditor}))),Tr=q(()=>$.ProfileVersionHistory().then(e=>({default:e.ProfileVersionHistory}))),Er=q(()=>$.ArchivedProfileList().then(e=>({default:e.ArchivedProfileList}))),Dr=q(()=>$.ConsentTemplateList().then(e=>({default:e.ConsentTemplateList}))),Or=q(()=>$.ConsentTemplateEditor().then(e=>({default:e.ConsentTemplateEditor}))),kr=q(()=>$.UITemplateList().then(e=>({default:e.UITemplateList}))),Ar=q(()=>$.UITemplateEditor().then(e=>({default:e.UITemplateEditor}))),jr=q(()=>$.ConsentList().then(e=>({default:e.ConsentList}))),Mr=q(()=>$.VisitorList().then(e=>({default:e.VisitorList}))),Nr=q(()=>$.UserList().then(e=>({default:e.UserList}))),Pr=q(()=>$.RoleList().then(e=>({default:e.RoleList}))),Fr=q(()=>$.TenantList().then(e=>({default:e.TenantList}))),Ir=q(()=>$.VendorList().then(e=>({default:e.VendorList}))),Lr=q(()=>$.AuditLog().then(e=>({default:e.AuditLogPage}))),Rr=q(()=>$.Settings().then(e=>({default:e.Settings}))),zr=q(()=>$.ChangePassword().then(e=>({default:e.ChangePassword}))),Br=q(()=>$.ApiConfig().then(e=>({default:e.ApiConfig}))),Vr=q(()=>$.HowItWorks().then(e=>({default:e.HowItWorks}))),Hr=q(()=>$.SetupWizard().then(e=>({default:e.SetupWizard})));function Ur(){for(let e of Object.values($))e().catch(()=>{})}function Wr(e){typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e):window.setTimeout(e,1)}var Gr=U(`div`,{class:`p-6 text-sm text-gray-400`,children:`Loading…`});function Kr(){return window.location.hash||`#/`}function qr(){let{user:e}=G(),[t,n]=R(Kr),[r,i]=R(null),[a,o]=R(``);return z(()=>{let e=()=>n(Kr());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),z(()=>{e?xr.status().then(({completed:e})=>i(e)).catch(()=>i(!0)):i(null)},[e]),z(()=>{e&&Wr(Ur)},[e]),e?t===`#/setup`?r===!0?(window.location.hash=`#/`,null):U(K,{fallback:Gr,children:U(Hr,{onComplete:()=>i(!0)})}):r===!1?(t!==`#/setup`&&(window.location.hash=`#/setup`),null):t===`#/login`?(window.location.hash=`#/`,null):U($n,{setTitle:o,children:U(ur,{title:a,current:t,children:U(K,{fallback:Gr,children:Jr(t)})})}):(t!==`#/login`&&(window.location.hash=`#/login`),U(pr,{}))}function Jr(e){if(e===`#/`||e===`#`)return U(br,{current:e});if(e===`#/reports`)return U(Sr,{current:e});if(e===`#/banners/profiles`)return U(Cr,{current:e});if(e===`#/banners/profiles/new`)return U(wr,{current:e});if(e===`#/banners/profiles/archived`)return U(Er,{current:e});{let t=e.match(/^#\/banners\/profiles\/([^/]+)\/history(?:\?(.*))?$/);if(t){let n=new URLSearchParams(t[2]??``),r=e=>{let t=n.get(e);return t!==null&&Number.isInteger(Number(t))?Number(t):void 0},i=r(`version`),a=r(`compare`);return U(Tr,{id:t[1],current:e,...i===void 0?{}:{initialVersion:i},...a===void 0?{}:{compareVersion:a}})}}return e.startsWith(`#/banners/profiles/`)?U(wr,{id:e.slice(19),current:e}):e===`#/banners/consent-templates`?U(Dr,{current:e}):e===`#/banners/consent-templates/new`?U(Or,{current:e}):e.startsWith(`#/banners/consent-templates/`)?U(Or,{id:e.slice(28),current:e}):e===`#/banners/ui-templates`?U(kr,{current:e}):e===`#/banners/ui-templates/new`?U(Ar,{current:e}):e.startsWith(`#/banners/ui-templates/`)?U(Ar,{id:e.slice(23),current:e}):e===`#/consents`||e.startsWith(`#/consents?`)?U(jr,{current:e}):e===`#/visitors`||e.startsWith(`#/visitors?`)?U(Mr,{current:e}):e===`#/users`?U(Nr,{current:e}):e===`#/roles`?U(Pr,{current:e}):e===`#/tenants`?U(Fr,{current:e}):e===`#/vendors`||e.startsWith(`#/vendors?`)?U(Ir,{current:e}):e===`#/audit`||e.startsWith(`#/audit?`)?U(Lr,{current:e}):e===`#/api/config`?U(Br,{current:e}):e===`#/settings`?U(Rr,{current:e}):e===`#/settings/change-password`?U(zr,{current:e}):e===`#/how-it-works`?U(Vr,{current:e}):U(br,{current:`#/`})}function Yr(){return U(Ye,{children:U(et,{children:U(Jn,{children:U(qe,{children:U(qr,{})})})})})}pe(U(Yr,{}),document.getElementById(`app`));export{z as A,V as C,Te as D,H as E,C as M,Ee as O,U as S,Re as T,Y as _,hr as a,Xe as b,Dn as c,an as d,nn as f,Wt as g,Kt as h,mr as i,De as j,R as k,_n as l,Jt as m,yr as n,er as o,en as p,vr as r,Q as s,xr as t,sn as u,_t as v,Be as w,G as x,tt as y};
@@ -1 +1 @@
1
- import{E as e}from"./index-BaYVhd1M.js";var t={list:()=>e(`/profiles`),listSummary:()=>e(`/profiles?summary=1`),get:t=>e(`/profiles/${t}`),create:t=>e(`/profiles`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/profiles/${t}`,{method:`PUT`,body:JSON.stringify(n)}),validateCompliance:t=>e(`/profiles/validate`,{method:`POST`,body:JSON.stringify(t)}),delete:t=>e(`/profiles/${t}`,{method:`DELETE`}),copy:(t,n)=>e(`/profiles/${t}/copy`,{method:`POST`,...n?{body:JSON.stringify({name:n})}:{}}),activate:(t,n)=>e(`/profiles/${t}/activate`,{method:`POST`,...n?{body:JSON.stringify(n)}:{}}),deactivate:t=>e(`/profiles/${t}/deactivate`,{method:`POST`}),listVersions:t=>e(`/profiles/${t}/versions`),listArchived:()=>e(`/profiles/archived`),getVersion:(t,n,r=`default`)=>e(`/profiles/${t}/versions/${n}?locale=${encodeURIComponent(r)}`),previewUrl:e=>`/consenti/api/profiles/preview?draft=${encodeURIComponent(JSON.stringify(e))}`};export{t};
1
+ import{E as e}from"./index-D7qdwIxs.js";var t={list:()=>e(`/profiles`),listSummary:()=>e(`/profiles?summary=1`),get:t=>e(`/profiles/${t}`),create:t=>e(`/profiles`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/profiles/${t}`,{method:`PUT`,body:JSON.stringify(n)}),validateCompliance:t=>e(`/profiles/validate`,{method:`POST`,body:JSON.stringify(t)}),delete:t=>e(`/profiles/${t}`,{method:`DELETE`}),copy:(t,n)=>e(`/profiles/${t}/copy`,{method:`POST`,...n?{body:JSON.stringify({name:n})}:{}}),activate:(t,n)=>e(`/profiles/${t}/activate`,{method:`POST`,...n?{body:JSON.stringify(n)}:{}}),deactivate:t=>e(`/profiles/${t}/deactivate`,{method:`POST`}),listVersions:t=>e(`/profiles/${t}/versions`),listArchived:()=>e(`/profiles/archived`),getVersion:(t,n,r=`default`)=>e(`/profiles/${t}/versions/${n}?locale=${encodeURIComponent(r)}`),previewUrl:e=>`/consenti/api/profiles/preview?draft=${encodeURIComponent(JSON.stringify(e))}`};export{t};
@@ -1 +1 @@
1
- import{E as e}from"./index-BaYVhd1M.js";var t={list:()=>e(`/roles`),permissions:t=>e(`/roles/${t}/permissions`),allPermissions:()=>e(`/permissions`),create:t=>e(`/roles`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/roles/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/roles/${t}`,{method:`DELETE`}),assignPermission:(t,n)=>e(`/roles/${t}/permissions`,{method:`POST`,body:JSON.stringify({permissionId:n})}),revokePermission:(t,n)=>e(`/roles/${t}/permissions/${n}`,{method:`DELETE`})};export{t};
1
+ import{E as e}from"./index-D7qdwIxs.js";var t={list:()=>e(`/roles`),permissions:t=>e(`/roles/${t}/permissions`),allPermissions:()=>e(`/permissions`),create:t=>e(`/roles`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/roles/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/roles/${t}`,{method:`DELETE`}),assignPermission:(t,n)=>e(`/roles/${t}/permissions`,{method:`POST`,body:JSON.stringify({permissionId:n})}),revokePermission:(t,n)=>e(`/roles/${t}/permissions/${n}`,{method:`DELETE`})};export{t};
@@ -1 +1 @@
1
- import{_ as e}from"./index-BaYVhd1M.js";var t={name:`rotate-ccw-clock`,size:24,node:[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]],aliases:[`history`]};t.node;var n=e(t);export{n as t};
1
+ import{_ as e}from"./index-D7qdwIxs.js";var t={name:`rotate-ccw-clock`,size:24,node:[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]],aliases:[`history`]};t.node;var n=e(t);export{n as t};
@@ -1 +1 @@
1
- import{_ as e}from"./index-BaYVhd1M.js";var t={name:`search`,size:24,node:[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]};t.node;var n=e(t);export{n as t};
1
+ import{_ as e}from"./index-D7qdwIxs.js";var t={name:`search`,size:24,node:[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]};t.node;var n=e(t);export{n as t};
@@ -1 +1 @@
1
- import{_ as e}from"./index-BaYVhd1M.js";var t={name:`square-pen`,size:24,node:[[`path`,{d:`M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`,key:`1m0v6g`}],[`path`,{d:`M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z`,key:`ohrbg2`}]],aliases:[`pen-box`,`edit`,`pen-square`]};t.node;var n=e(t);export{n as t};
1
+ import{_ as e}from"./index-D7qdwIxs.js";var t={name:`square-pen`,size:24,node:[[`path`,{d:`M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`,key:`1m0v6g`}],[`path`,{d:`M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z`,key:`ohrbg2`}]],aliases:[`pen-box`,`edit`,`pen-square`]};t.node;var n=e(t);export{n as t};
@@ -1 +1 @@
1
- import{E as e}from"./index-BaYVhd1M.js";var t={list:()=>e(`/consent-templates`),get:t=>e(`/consent-templates/${t}`),create:t=>e(`/consent-templates`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/consent-templates/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/consent-templates/${t}`,{method:`DELETE`}),copy:(t,n)=>e(`/consent-templates/${t}/copy`,{method:`POST`,body:JSON.stringify({name:n})}),profileUsage:t=>e(`/consent-templates/${t}/profile-usage`)},n={list:()=>e(`/ui-templates`),get:t=>e(`/ui-templates/${t}`),create:t=>e(`/ui-templates`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/ui-templates/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/ui-templates/${t}`,{method:`DELETE`}),copy:(t,n)=>e(`/ui-templates/${t}/copy`,{method:`POST`,body:JSON.stringify({name:n})}),profileUsage:t=>e(`/ui-templates/${t}/profile-usage`)};export{n,t};
1
+ import{E as e}from"./index-D7qdwIxs.js";var t={list:()=>e(`/consent-templates`),get:t=>e(`/consent-templates/${t}`),create:t=>e(`/consent-templates`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/consent-templates/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/consent-templates/${t}`,{method:`DELETE`}),copy:(t,n)=>e(`/consent-templates/${t}/copy`,{method:`POST`,body:JSON.stringify({name:n})}),profileUsage:t=>e(`/consent-templates/${t}/profile-usage`)},n={list:()=>e(`/ui-templates`),get:t=>e(`/ui-templates/${t}`),create:t=>e(`/ui-templates`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/ui-templates/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/ui-templates/${t}`,{method:`DELETE`}),copy:(t,n)=>e(`/ui-templates/${t}/copy`,{method:`POST`,body:JSON.stringify({name:n})}),profileUsage:t=>e(`/ui-templates/${t}/profile-usage`)};export{n,t};
@@ -1 +1 @@
1
- import{_ as e}from"./index-BaYVhd1M.js";var t={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};t.node;var n=e(t);export{n as t};
1
+ import{_ as e}from"./index-D7qdwIxs.js";var t={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};t.node;var n=e(t);export{n as t};
@@ -1 +1 @@
1
- import{t as e}from"./search-mdMD-WTj.js";import{A as t,S as n,h as r,j as i,k as a,m as o,s}from"./index-BaYVhd1M.js";import{t as c}from"./Table-CcBP7eXS.js";var l=[10,25,50,100],u=5;function d({page:e,totalPages:r,onPage:i}){let o=s(),[c,l]=a(String(e));return t(()=>{l(String(e))},[e]),n(`input`,{type:`number`,inputMode:`numeric`,min:1,max:r,value:c,"aria-label":o(`common.goToPage`),title:o(`common.goToPage`),onInput:e=>l(e.target.value),onBlur:()=>{let t=Number.parseInt(c,10),n=Number.isFinite(t)?Math.min(Math.max(t,1),r):e;l(String(n)),n!==e&&i(n)},onKeyDown:e=>{e.key===`Enter`&&e.target.blur()},class:`w-14 px-1.5 py-1 text-sm text-center rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200`})}function f({page:e,total:t,pageSize:i,onPage:a,onPageSize:c}){let f=s(),p=Math.max(1,Math.ceil(t/i)),m=Math.min(u,p),h=Array.from({length:m},(e,t)=>t+1),g=p>u;return n(`nav`,{"aria-label":`Pagination`,class:`flex items-center justify-between gap-2 mt-4 flex-wrap`,children:[n(`div`,{class:`flex items-center gap-1`,children:[n(`button`,{onClick:()=>a(e-1),disabled:e<=1,"aria-label":f(`common.prev`),class:`px-3 py-1.5 text-sm rounded border border-gray-300 dark:border-gray-600 disabled:opacity-40 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors flex items-center gap-1`,children:[n(r,{size:14,"aria-hidden":`true`}),` `,f(`common.prev`)]}),h.map(t=>n(`button`,{onClick:()=>a(t),"aria-current":t===e?`page`:void 0,class:`px-2.5 py-1.5 text-sm rounded border transition-colors ${t===e?`border-blue-500 bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-400 font-medium`:`border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700`}`,children:t},t)),g&&n(d,{page:e,totalPages:p,onPage:a}),n(`button`,{onClick:()=>a(e+1),disabled:e>=p,"aria-label":f(`common.next`),class:`px-3 py-1.5 text-sm rounded border border-gray-300 dark:border-gray-600 disabled:opacity-40 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors flex items-center gap-1`,children:[f(`common.next`),` `,n(o,{size:14,"aria-hidden":`true`})]}),n(`span`,{class:`ml-2 text-sm text-gray-500 dark:text-gray-400`,children:f(`common.pageOfTotal`,{page:e,total:p})})]}),c&&n(`label`,{class:`flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400`,children:[f(`common.perPage`),n(`select`,{value:i,onChange:e=>c(Number(e.target.value)),class:`border border-gray-300 dark:border-gray-600 rounded px-1.5 py-1 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200`,children:l.map(e=>n(`option`,{value:e,children:e},e))})]})]})}function p({loading:t,rows:r,columns:i,keyFn:a,emptyText:o,searchValue:l,onSearchChange:u,searchPlaceholder:d,filters:p,toolbarEnd:m,total:h,page:g,pageSize:_,onPage:v,onPageSize:y}){let b=s();return n(`div`,{children:[n(`div`,{class:`flex flex-wrap items-center gap-2 mb-3`,children:[n(`div`,{class:`relative flex-1 min-w-[200px] max-w-sm`,children:[n(e,{size:14,className:`absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-400`,"aria-hidden":`true`}),n(`input`,{type:`search`,value:l,onInput:e=>u(e.target.value),placeholder:d??b(`common.search`),"aria-label":d??b(`common.search`),class:`w-full pl-8 pr-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200`})]}),p,n(`div`,{class:`ml-auto flex items-center gap-3`,children:m})]}),n(c,{loading:t,keyFn:a,rows:r,columns:i,...o===void 0?{}:{emptyText:o}}),n(f,{page:g,total:h,pageSize:_,onPage:v,onPageSize:y})]})}function m(){return new URLSearchParams(window.location.hash.split(`?`)[1]??``)}function h(e){let[t,n]=a(m);return{params:t,setParams:i(t=>{let r=m();for(let[e,n]of Object.entries(t))n===void 0||n===``?r.delete(e):r.set(e,String(n));let i=r.toString(),a=i?`${e}?${i}`:e;window.location.hash!==a&&(window.location.hash=a),n(r)},[e])}}export{p as n,h as t};
1
+ import{t as e}from"./search-B05qPv24.js";import{A as t,S as n,h as r,j as i,k as a,m as o,s}from"./index-D7qdwIxs.js";import{t as c}from"./Table-C59yMXY2.js";var l=[10,25,50,100],u=5;function d({page:e,totalPages:r,onPage:i}){let o=s(),[c,l]=a(String(e));return t(()=>{l(String(e))},[e]),n(`input`,{type:`number`,inputMode:`numeric`,min:1,max:r,value:c,"aria-label":o(`common.goToPage`),title:o(`common.goToPage`),onInput:e=>l(e.target.value),onBlur:()=>{let t=Number.parseInt(c,10),n=Number.isFinite(t)?Math.min(Math.max(t,1),r):e;l(String(n)),n!==e&&i(n)},onKeyDown:e=>{e.key===`Enter`&&e.target.blur()},class:`w-14 px-1.5 py-1 text-sm text-center rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200`})}function f({page:e,total:t,pageSize:i,onPage:a,onPageSize:c}){let f=s(),p=Math.max(1,Math.ceil(t/i)),m=Math.min(u,p),h=Array.from({length:m},(e,t)=>t+1),g=p>u;return n(`nav`,{"aria-label":`Pagination`,class:`flex items-center justify-between gap-2 mt-4 flex-wrap`,children:[n(`div`,{class:`flex items-center gap-1`,children:[n(`button`,{onClick:()=>a(e-1),disabled:e<=1,"aria-label":f(`common.prev`),class:`px-3 py-1.5 text-sm rounded border border-gray-300 dark:border-gray-600 disabled:opacity-40 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors flex items-center gap-1`,children:[n(r,{size:14,"aria-hidden":`true`}),` `,f(`common.prev`)]}),h.map(t=>n(`button`,{onClick:()=>a(t),"aria-current":t===e?`page`:void 0,class:`px-2.5 py-1.5 text-sm rounded border transition-colors ${t===e?`border-blue-500 bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-400 font-medium`:`border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700`}`,children:t},t)),g&&n(d,{page:e,totalPages:p,onPage:a}),n(`button`,{onClick:()=>a(e+1),disabled:e>=p,"aria-label":f(`common.next`),class:`px-3 py-1.5 text-sm rounded border border-gray-300 dark:border-gray-600 disabled:opacity-40 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors flex items-center gap-1`,children:[f(`common.next`),` `,n(o,{size:14,"aria-hidden":`true`})]}),n(`span`,{class:`ml-2 text-sm text-gray-500 dark:text-gray-400`,children:f(`common.pageOfTotal`,{page:e,total:p})})]}),c&&n(`label`,{class:`flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400`,children:[f(`common.perPage`),n(`select`,{value:i,onChange:e=>c(Number(e.target.value)),class:`border border-gray-300 dark:border-gray-600 rounded px-1.5 py-1 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200`,children:l.map(e=>n(`option`,{value:e,children:e},e))})]})]})}function p({loading:t,rows:r,columns:i,keyFn:a,emptyText:o,searchValue:l,onSearchChange:u,searchPlaceholder:d,filters:p,toolbarEnd:m,total:h,page:g,pageSize:_,onPage:v,onPageSize:y}){let b=s();return n(`div`,{children:[n(`div`,{class:`flex flex-wrap items-center gap-2 mb-3`,children:[n(`div`,{class:`relative flex-1 min-w-[200px] max-w-sm`,children:[n(e,{size:14,className:`absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-400`,"aria-hidden":`true`}),n(`input`,{type:`search`,value:l,onInput:e=>u(e.target.value),placeholder:d??b(`common.search`),"aria-label":d??b(`common.search`),class:`w-full pl-8 pr-3 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200`})]}),p,n(`div`,{class:`ml-auto flex items-center gap-3`,children:m})]}),n(c,{loading:t,keyFn:a,rows:r,columns:i,...o===void 0?{}:{emptyText:o}}),n(f,{page:g,total:h,pageSize:_,onPage:v,onPageSize:y})]})}function m(){return new URLSearchParams(window.location.hash.split(`?`)[1]??``)}function h(e){let[t,n]=a(m);return{params:t,setParams:i(t=>{let r=m();for(let[e,n]of Object.entries(t))n===void 0||n===``?r.delete(e):r.set(e,String(n));let i=r.toString(),a=i?`${e}?${i}`:e;window.location.hash!==a&&(window.location.hash=a),n(r)},[e])}}export{p as n,h as t};
@@ -1 +1 @@
1
- import{E as e}from"./index-BaYVhd1M.js";var t={list:()=>e(`/users`),get:t=>e(`/users/${t}`),create:t=>e(`/users`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/users/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/users/${t}`,{method:`DELETE`}),assignRole:(t,n)=>e(`/users/${t}/roles`,{method:`POST`,body:JSON.stringify({roleId:n})}),revokeRole:(t,n)=>e(`/users/${t}/roles/${n}`,{method:`DELETE`})};export{t};
1
+ import{E as e}from"./index-D7qdwIxs.js";var t={list:()=>e(`/users`),get:t=>e(`/users/${t}`),create:t=>e(`/users`,{method:`POST`,body:JSON.stringify(t)}),update:(t,n)=>e(`/users/${t}`,{method:`PUT`,body:JSON.stringify(n)}),delete:t=>e(`/users/${t}`,{method:`DELETE`}),assignRole:(t,n)=>e(`/users/${t}/roles`,{method:`POST`,body:JSON.stringify({roleId:n})}),revokeRole:(t,n)=>e(`/users/${t}/roles/${n}`,{method:`DELETE`})};export{t};
@@ -0,0 +1 @@
1
+ import{_ as e}from"./index-D7qdwIxs.js";var t={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};t.node;var n=e(t);export{n as t};
@@ -6,7 +6,7 @@
6
6
  <title>Consenti Admin</title>
7
7
  <link rel="icon" type="image/x-icon" href="/consenti/favicon.ico" />
8
8
  <link rel="icon" type="image/svg+xml" href="/consenti/icon.svg" />
9
- <script type="module" crossorigin src="/consenti/assets/index-BaYVhd1M.js"></script>
9
+ <script type="module" crossorigin src="/consenti/assets/index-D7qdwIxs.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="/consenti/assets/index-Cr5M1Qy_.css">
11
11
  </head>
12
12
  <body>
@@ -0,0 +1,2 @@
1
+ import{A as B,B as C,C as D,D as E,E as F,F as G,G as H,H as I,I as J,J as K,K as L,L as M,a as b,b as c,c as d,d as e,e as f,f as g,g as h,h as i,i as j,j as k,k as l,l as m,m as n,n as o,o as p,p as q,q as r,r as s,s as t,t as u,u as v,v as w,w as x,x as y,y as z,z as A}from"./chunk-7NKW7UTJ.js";import{i as a}from"./chunk-S2IEYESR.js";export{h as COMPLIANCE_GROUPS,g as COMPLIANCE_GROUP_IDS,z as COMPLIANCE_REGULATION_IDS,w as COMPLIANCE_VALIDATION_RULES,m as COOKIE_PURPOSES,n as COOKIE_PURPOSE_DEFAULTS,l as COOKIE_PURPOSE_IDS,A as COUNTRY_CODES,k as CPRA_CATEGORIES,a as DEFAULT_PROFILES,x as EMBEDDED_COMPLIANCE_MAP,i as GPC_OPTIONS,o as KNOWN_COOKIE_PURPOSES,j as LEGAL_BASIS_OPTIONS,B as LOCALES,q as TCF_PURPOSES,r as TCF_SPECIAL_FEATURES,D as TRACKER_KNOWLEDGE_BASE,t as buildCookieCategoryIndex,d as color,b as debounce,L as decodeGppString,J as decodeTcString,K as encodeGppString,I as encodeTcString,s as findCategoryForCookie,y as findCountryEntry,f as formatLog,u as getCookieLegalBasis,H as hasVisibleText,p as inferCookiePurpose,v as isMandatoryCookie,F as jsonToHtml,E as matchTrackerKnowledge,G as renderContentText,C as resolveComplianceMapOverride,M as resolveTextDirection,e as statusLabel,c as throttle};
2
+ //# sourceMappingURL=dist-MNR4WETI.js.map