@consenti/api 0.3.0 → 0.4.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.
- package/README.md +212 -74
- package/dist/chunk-COR72NFQ.js +2 -0
- package/dist/chunk-COR72NFQ.js.map +1 -0
- package/dist/chunk-S2IEYESR.js +2 -0
- package/dist/chunk-S2IEYESR.js.map +1 -0
- package/dist/dashboard/assets/ApiConfig-CZMtYRfK.js +1 -0
- package/dist/dashboard/assets/{ArchivedProfileList-Bw-fx-BD.js → ArchivedProfileList-BlQ2gEWz.js} +1 -1
- package/dist/dashboard/assets/AuditLog-BpZoAFOe.js +1 -0
- package/dist/dashboard/assets/{ChangePassword-D2rPkzD1.js → ChangePassword-BZkP2dXQ.js} +1 -1
- package/dist/dashboard/assets/{ConfirmDialog-DTtw7VJ-.js → ConfirmDialog-BDlnfTdx.js} +1 -1
- package/dist/dashboard/assets/ConsentList-DgJMrhih.js +1 -0
- package/dist/dashboard/assets/ConsentTemplateEditor-DA7B5aI_.js +1 -0
- package/dist/dashboard/assets/ConsentTemplateList-DMPd2y5s.js +1 -0
- package/dist/dashboard/assets/HeadingTagInput-D2S9xDMJ.js +1 -0
- package/dist/dashboard/assets/{HowItWorks-AeyjfQGO.js → HowItWorks-CJCrdr3o.js} +1 -1
- package/dist/dashboard/assets/PermissionGate-C69dhwV1.js +1 -0
- package/dist/dashboard/assets/PreviewPane-D7mDeBT8.js +38 -0
- package/dist/dashboard/assets/ProfileEditor-CSFdOweN.js +2 -0
- package/dist/dashboard/assets/ProfileList-C4cIDrM6.js +1 -0
- package/dist/dashboard/assets/{ProfileVersionHistory-1h8sUgog.js → ProfileVersionHistory-CX5-Oupy.js} +2 -2
- package/dist/dashboard/assets/{RecordDetailModal-FaFhzQXi.js → RecordDetailModal-DIpGxfqA.js} +1 -1
- package/dist/dashboard/assets/Reports-B1Ww0ovT.js +1 -0
- package/dist/dashboard/assets/RoleList-CQ1GjR0W.js +1 -0
- package/dist/dashboard/assets/{Select-DjJNwlbY.js → Select-C_JusbT5.js} +1 -1
- package/dist/dashboard/assets/Settings-sIMVWQ0V.js +1 -0
- package/dist/dashboard/assets/SetupWizard-ChFBxqo3.js +1 -0
- package/dist/dashboard/assets/Table-BUxoz0YR.js +1 -0
- package/dist/dashboard/assets/TenantList-DCsT7ghb.js +1 -0
- package/dist/dashboard/assets/UITemplateEditor-BAaMnuOU.js +2 -0
- package/dist/dashboard/assets/UITemplateList-C3UMbnfs.js +1 -0
- package/dist/dashboard/assets/UserList-CHGNnS50.js +1 -0
- package/dist/dashboard/assets/VendorList-C-sswM1A.js +1 -0
- package/dist/dashboard/assets/VisitorList-DNB9Ia72.js +1 -0
- package/dist/dashboard/assets/check-D0g4XvmN.js +1 -0
- package/dist/dashboard/assets/client-CYntrO2g.js +1 -0
- package/dist/dashboard/assets/{copy-C01KoUUH.js → copy-DEi_W2TM.js} +1 -1
- package/dist/dashboard/assets/createLucideIcon-DAiYBrnd.js +1 -0
- package/dist/dashboard/assets/de-jwngydrC.js +25 -0
- package/dist/dashboard/assets/dist-GoiMJCTt.js +1 -0
- package/dist/dashboard/assets/es-B6Jp0OPe.js +25 -0
- package/dist/dashboard/assets/{external-link-DVe00ZBK.js → external-link-CFZxxe3W.js} +1 -1
- package/dist/dashboard/assets/fr-CshYcQPW.js +25 -0
- package/dist/dashboard/assets/index-Cr5M1Qy_.css +2 -0
- package/dist/dashboard/assets/index-Tr_BcjkN.js +26 -0
- package/dist/dashboard/assets/ja-CgjZNBrc.js +25 -0
- package/dist/dashboard/assets/{profiles-DmrdGv7t.js → profiles-C_SuoLJD.js} +1 -1
- package/dist/dashboard/assets/{roles-C0dJPFl4.js → roles-D7L936FV.js} +1 -1
- package/dist/dashboard/assets/rotate-ccw-clock-6y2NDrJ7.js +1 -0
- package/dist/dashboard/assets/search-DKwfLBOv.js +1 -0
- package/dist/dashboard/assets/templates-CIyMjskA.js +1 -0
- package/dist/dashboard/assets/{templates-B2xiivh4.js → templates-DY68xNys.js} +1 -1
- package/dist/dashboard/assets/{trash-2-BBnkdgm_.js → trash-2-eX9s6x8V.js} +1 -1
- package/dist/dashboard/assets/{trash-Dj1jhzHJ.js → trash-O30ycMcz.js} +1 -1
- package/dist/dashboard/assets/{useHashQuery-B5ytMIMp.js → useHashQuery-BDjUPXDR.js} +1 -1
- package/dist/dashboard/assets/{users-czK8LRVh.js → users-BRrNOK0W.js} +1 -1
- package/dist/dashboard/assets/x-BhZiH8AL.js +1 -0
- package/dist/dashboard/assets/zh-CN-BnLZkfBC.js +25 -0
- package/dist/dashboard/index.html +4 -4
- package/dist/dist-QJYW5KUK.js +2 -0
- package/dist/index.cjs +68 -68
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +214 -52
- package/dist/index.d.ts +214 -52
- package/dist/index.js +65 -65
- package/dist/index.js.map +1 -1
- package/dist/profiles-FCX454HS.js +2 -0
- package/dist/widget/widget.css +1 -1
- package/dist/widget/widget.js +1 -1
- package/package.json +24 -9
- package/dist/chunk-IY4L6MNB.js +0 -2
- package/dist/chunk-IY4L6MNB.js.map +0 -1
- package/dist/chunk-O5UG4OYI.js +0 -2
- package/dist/chunk-O5UG4OYI.js.map +0 -1
- package/dist/dashboard/assets/ApiConfig-CE-Noelz.js +0 -1
- package/dist/dashboard/assets/AuditLog-D6HiTQ1o.js +0 -1
- package/dist/dashboard/assets/ConsentList-BWOvPOMG.js +0 -1
- package/dist/dashboard/assets/ConsentTemplateEditor-BKIEnLmA.js +0 -1
- package/dist/dashboard/assets/ConsentTemplateList-DCys2nM3.js +0 -1
- package/dist/dashboard/assets/HeadingTagInput-BTjrdzlS.js +0 -1
- package/dist/dashboard/assets/PermissionGate-Bhhf7SMh.js +0 -1
- package/dist/dashboard/assets/PreviewPane-Dq5K1h2L.js +0 -35
- package/dist/dashboard/assets/ProfileEditor-BXtaE0tL.js +0 -2
- package/dist/dashboard/assets/ProfileList-CWKSAgu0.js +0 -1
- package/dist/dashboard/assets/Reports-DWEjQOKh.js +0 -1
- package/dist/dashboard/assets/RoleList-BSGoqlzp.js +0 -1
- package/dist/dashboard/assets/Settings-CVYrlyLm.js +0 -1
- package/dist/dashboard/assets/SetupWizard-4NTb5bZj.js +0 -1
- package/dist/dashboard/assets/Table-DH_jh8_N.js +0 -1
- package/dist/dashboard/assets/TenantList-5AwFtoHf.js +0 -1
- package/dist/dashboard/assets/UITemplateEditor-9A55scBe.js +0 -1
- package/dist/dashboard/assets/UITemplateList-BS7X4u4F.js +0 -1
- package/dist/dashboard/assets/UserList-SPkMyFRy.js +0 -1
- package/dist/dashboard/assets/VendorList-C5fPhr6U.js +0 -1
- package/dist/dashboard/assets/VisitorList-COP1SyNd.js +0 -1
- package/dist/dashboard/assets/check-o5cp1s2J.js +0 -1
- package/dist/dashboard/assets/client-ymc9nwWr.js +0 -1
- package/dist/dashboard/assets/createLucideIcon-MdjI3m3u.js +0 -1
- package/dist/dashboard/assets/de-DET92Jb5.js +0 -5
- package/dist/dashboard/assets/dist-DlhLroYC.js +0 -1
- package/dist/dashboard/assets/es-CJNunrnU.js +0 -5
- package/dist/dashboard/assets/fr-akfTuf5x.js +0 -5
- package/dist/dashboard/assets/history-CHTts_m2.js +0 -1
- package/dist/dashboard/assets/index-DW3qOrry.css +0 -2
- package/dist/dashboard/assets/index-H_Zm0X-u.js +0 -6
- package/dist/dashboard/assets/ja-B0nLWkOd.js +0 -5
- package/dist/dashboard/assets/search-Bd2RdDRh.js +0 -1
- package/dist/dashboard/assets/templates-CnMoLavN.js +0 -1
- package/dist/dashboard/assets/x-BRuyBEQP.js +0 -1
- package/dist/dashboard/assets/zh-CN-Dxg3G-BL.js +0 -5
- package/dist/dist-Z5RVTVBT.js +0 -2
- package/dist/profiles-XTYPWLVC.js +0 -2
- /package/dist/{dist-Z5RVTVBT.js.map → dist-QJYW5KUK.js.map} +0 -0
- /package/dist/{profiles-XTYPWLVC.js.map → profiles-FCX454HS.js.map} +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Reports-B1Ww0ovT.js","assets/createLucideIcon-DAiYBrnd.js","assets/client-CYntrO2g.js","assets/ProfileList-C4cIDrM6.js","assets/check-D0g4XvmN.js","assets/copy-DEi_W2TM.js","assets/rotate-ccw-clock-6y2NDrJ7.js","assets/trash-O30ycMcz.js","assets/ConfirmDialog-BDlnfTdx.js","assets/Table-BUxoz0YR.js","assets/search-DKwfLBOv.js","assets/profiles-C_SuoLJD.js","assets/dist-GoiMJCTt.js","assets/PermissionGate-C69dhwV1.js","assets/ProfileEditor-CSFdOweN.js","assets/PreviewPane-D7mDeBT8.js","assets/x-BhZiH8AL.js","assets/templates-DY68xNys.js","assets/templates-CIyMjskA.js","assets/Select-C_JusbT5.js","assets/ProfileVersionHistory-CX5-Oupy.js","assets/ArchivedProfileList-BlQ2gEWz.js","assets/ConsentTemplateList-DMPd2y5s.js","assets/ConsentTemplateEditor-DA7B5aI_.js","assets/HeadingTagInput-D2S9xDMJ.js","assets/debounce-DlvAAT2V.js","assets/UITemplateList-C3UMbnfs.js","assets/UITemplateEditor-BAaMnuOU.js","assets/ConsentList-DgJMrhih.js","assets/useHashQuery-BDjUPXDR.js","assets/RecordDetailModal-DIpGxfqA.js","assets/VisitorList-DNB9Ia72.js","assets/UserList-CHGNnS50.js","assets/users-BRrNOK0W.js","assets/roles-D7L936FV.js","assets/RoleList-CQ1GjR0W.js","assets/trash-2-eX9s6x8V.js","assets/TenantList-DCsT7ghb.js","assets/VendorList-C-sswM1A.js","assets/AuditLog-BpZoAFOe.js","assets/Settings-sIMVWQ0V.js","assets/ChangePassword-BZkP2dXQ.js","assets/ApiConfig-CZMtYRfK.js","assets/external-link-CFZxxe3W.js","assets/HowItWorks-CJCrdr3o.js","assets/SetupWizard-ChFBxqo3.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e,c as t,d as n,f as r,i,l as a,m as o,o as s,p as c,r as l,t as u}from"./createLucideIcon-DAiYBrnd.js";import{a as d,n as f}from"./client-CYntrO2g.js";(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 p=`consenti_token`,m=18e5,h=6e4,g=[`mousemove`,`keydown`,`click`,`scroll`,`touchstart`];function _(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 v=o({user:null,token:null,login:()=>{},logout:()=>{}});function y({children:n}){let[r,i]=t(()=>localStorage.getItem(p)),[o,c]=t(()=>_(localStorage.getItem(p))),l=s(Date.now()),u=e=>{localStorage.setItem(p,e),i(e),c(_(e))},y=()=>{localStorage.removeItem(p),i(null),c(null),window.location.hash=`#/login`};return a(()=>(window.addEventListener(f,y),()=>window.removeEventListener(f,y)),[]),a(()=>{let e=()=>{l.current=Date.now()};for(let t of g)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of g)window.removeEventListener(t,e)}},[]),a(()=>{let e=setInterval(()=>{if(localStorage.getItem(p)){if(Date.now()-l.current>=m){y();return}d(`/auth/refresh`,{method:`POST`}).then(e=>u(e.token)).catch(()=>{})}},h);return()=>clearInterval(e)},[]),e(v.Provider,{value:{user:o,token:r,login:u,logout:y},children:n})}function b(){return n(v)}var x=o({theme:`light`,toggle:()=>{}});function ee({children:n}){let[r,i]=t(()=>{try{return localStorage.getItem(`dashboard-theme`)??`light`}catch{return`light`}});return a(()=>{document.documentElement.classList.toggle(`dark`,r===`dark`);try{localStorage.setItem(`dashboard-theme`,r)}catch{}},[r]),e(x.Provider,{value:{theme:r,toggle:()=>i(e=>e===`dark`?`light`:`dark`)},children:n})}var S=()=>n(x),C={appName:`Consenti`,appLogoPath:`./logo-dark.svg`,hidePoweredBy:!1};function te(){let e=window.__CONSENTI_CONFIG__;return e?{appName:e.appName,appLogoPath:e.appLogoPath,hidePoweredBy:e.hidePoweredBy}:C}var ne=o(C);function re({children:n}){let[r]=t(te);return e(ne.Provider,{value:r,children:n})}function w(){return n(ne)}var ie=u(`chart-column`,[[`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`}]]),T=u(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),E=u(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]),D=u(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),ae=u(`circle-question-mark`,[[`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`}]]),oe=u(`clipboard-list`,[[`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`}]]),O=u(`cookie`,[[`path`,{d:`M12 2a10 10 0 1 0 10 10 4 4 0 0 1-5-5 4 4 0 0 1-5-5`,key:`laymnq`}],[`path`,{d:`M8.5 8.5v.01`,key:`ue8clq`}],[`path`,{d:`M16 15.5v.01`,key:`14dtrp`}],[`path`,{d:`M12 12v.01`,key:`u5ubse`}],[`path`,{d:`M11 17v.01`,key:`1hyl5a`}],[`path`,{d:`M7 14v.01`,key:`uct60s`}]]),k=u(`eye-off`,[[`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`}]]),A=u(`eye`,[[`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`}]]),j=u(`globe`,[[`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`}]]),se=u(`key`,[[`path`,{d:`m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4`,key:`g0fldk`}],[`path`,{d:`m21 2-9.6 9.6`,key:`1j0ho8`}],[`circle`,{cx:`7.5`,cy:`15.5`,r:`5.5`,key:`yqb3hr`}]]),ce=u(`layout-dashboard`,[[`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`}]]),M=u(`log-out`,[[`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`}]]),le=u(`moon`,[[`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`}]]),N=u(`palette`,[[`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`}]]),ue=u(`plug`,[[`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`}]]),de=u(`satellite-dish`,[[`path`,{d:`M4 10a7.31 7.31 0 0 0 10 10Z`,key:`1fzpp3`}],[`path`,{d:`m9 15 3-3`,key:`88sc13`}],[`path`,{d:`M17 13a6 6 0 0 0-6-6`,key:`15cc6u`}],[`path`,{d:`M21 13A10 10 0 0 0 11 3`,key:`11nf8s`}]]),fe=u(`scroll-text`,[[`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`}]]),pe=u(`settings`,[[`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`}]]),P=u(`shield-check`,[[`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`}]]),me=u(`shield`,[[`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`}]]),he=u(`sun`,[[`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`}]]),ge=u(`ticket-slash`,[[`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`}]]),_e=u(`users`,[[`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`}]]),F={_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
|
+
|
|
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}}.
|
|
5
|
+
|
|
6
|
+
Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`Step {{step}} of {{total}}`,"uiTemplates.editor.wizard.next":`Next`,"uiTemplates.editor.wizard.back":`Back`,"uiTemplates.editor.stackButtonsOnBreakpoint":`Stack Buttons Below (px)`,"uiTemplates.editor.stackButtonsOnBreakpointHint":`Buttons stack vertically below this viewport width. Set to 0 to disable. Default: 576.`,"uiTemplates.editor.trapFocus":`Trap Focus`,"uiTemplates.editor.trapFocusHint":`Confines keyboard Tab focus within the consent root while this banner or modal is visible.`,"uiTemplates.editor.showForgetMe":`🗑️ Show "Forget me" button`,"uiTemplates.editor.showForgetMeHint":`Adds a self-service erasure control to the preference modal for visitors who already have a stored consent decision — the widget-side entry point for GDPR Art. 17, CCPA/CPRA, LGPD Art. 18, UK GDPR, DPDPA, KVKK, POPIA, PDPA-TH, and APPI erasure-equivalent rights. Erases via the same endpoint as the API's DELETE /consent/:visitorId.`,"uiTemplates.editor.fieldInfo.title":`Field reference`,"uiTemplates.editor.fieldInfo.headingTag.label":`Heading Tag`,"uiTemplates.editor.fieldInfo.headingTag.description":`The HTML tag used for the banner or modal's main heading. Controls the document outline and how screen readers announce the region.`,"uiTemplates.editor.fieldInfo.headingTag.highlights":`Pick h1–h6 to match your page's heading hierarchy — don't skip levels (e.g. h4 after a page h1).
|
|
7
|
+
A custom tag name is allowed (e.g. div, p) if you don't want it exposed as a heading at all.
|
|
8
|
+
Applies independently to the Main Banner, GPC Banner, and Preference Modal.`,"uiTemplates.editor.fieldInfo.style.label":`Style`,"uiTemplates.editor.fieldInfo.style.description":`The visual weight given to a button — Primary, Secondary, Accent, or Text. Purely cosmetic; it doesn't change what the button does.`,"uiTemplates.editor.fieldInfo.style.highlights":`Primary: highest-emphasis, typically your main call-to-action (e.g. Accept All).
|
|
9
|
+
Secondary: lower emphasis, neutral background matching your theme — for alternative choices (e.g. Manage Preferences).
|
|
10
|
+
Accent: a distinct highlight color, separate from Primary/Secondary — defaults to red unless you set a custom accent color, so reserve it for a strong call-out like Reject All.
|
|
11
|
+
Text: minimal, link-like styling — Consenti defaults Link-action buttons to this style automatically.`,"uiTemplates.editor.fieldInfo.action.label":`Action`,"uiTemplates.editor.fieldInfo.action.description":`What happens when the visitor clicks this button.`,"uiTemplates.editor.fieldInfo.action.highlights":`Custom: grants or denies the cookies selected below — used for Accept All / Reject All / Accept Selected.
|
|
12
|
+
Submit: saves whatever toggles the visitor has set in the Preference Modal.
|
|
13
|
+
Manage: opens the Preference Modal from a banner button.
|
|
14
|
+
Close: dismisses the banner or modal without changing consent.
|
|
15
|
+
Link: opens an external URL (e.g. Privacy Policy) — defaults to Text style.`,"uiTemplates.editor.fieldInfo.cookies.label":`Cookies to grant`,"uiTemplates.editor.fieldInfo.cookies.description":`Which cookie purposes this Custom-action button grants or denies when clicked.`,"uiTemplates.editor.fieldInfo.cookies.highlights":`Required whenever Action is set to Custom.
|
|
16
|
+
Use * to target every defined cookie purpose (e.g. Accept All / Reject All).
|
|
17
|
+
Select specific purposes to build partial-consent buttons like "Accept Analytics Only".`,"uiTemplates.editor.fieldInfo.trapFocus.label":`Trap Focus`,"uiTemplates.editor.fieldInfo.trapFocus.description":`Confines keyboard Tab focus within the consent root while this banner or modal is visible.`,"uiTemplates.editor.fieldInfo.trapFocus.highlights":`Prevents Tab / Shift+Tab from moving focus to page content hidden behind the overlay.
|
|
18
|
+
Recommended for modals and any overlay banner, so keyboard and screen-reader users can't tab into inaccessible content.
|
|
19
|
+
Not required for non-blocking banners without an overlay.`,"uiTemplates.editor.fieldInfo.buttonId.label":`Button ID`,"uiTemplates.editor.fieldInfo.buttonId.description":`A unique machine-readable identifier for this button, e.g. accept-all or reject-all.`,"uiTemplates.editor.fieldInfo.buttonId.highlights":`Not display text — the visible label is authored per-locale in the profile's content step.
|
|
20
|
+
Must be unique within its own section (Main Banner, GPC Banner, Preference Modal); the same id can be reused across sections since they never render together.
|
|
21
|
+
Used by consent logs and analytics to identify which button a visitor clicked.`,"uiTemplates.editor.fieldInfo.localeSwitcher.label":`Show locale switcher`,"uiTemplates.editor.fieldInfo.localeSwitcher.description":`Displays a language dropdown on this banner or modal so visitors can switch locale without leaving the consent flow.`,"uiTemplates.editor.fieldInfo.localeSwitcher.highlights":`Only useful once the profile has more than one locale configured in its content step.
|
|
22
|
+
Can be toggled independently for the Main Banner, GPC Banner, and Preference Modal.`,"uiTemplates.editor.fieldInfo.forgetMe.label":`Forget me`,"uiTemplates.editor.fieldInfo.forgetMe.description":`Renders a button in the preference modal, below the categories, letting a returning visitor erase their stored consent record without the host wiring a link elsewhere on the site.`,"uiTemplates.editor.fieldInfo.forgetMe.highlights":`Only shown to visitors who already have a stored consent decision — nothing to erase otherwise.
|
|
23
|
+
Erases via the same DELETE /consent/:visitorId endpoint as widget.deleteConsent()/reConsent().
|
|
24
|
+
The button's label is authored per-locale on the profile's content step, not here.
|
|
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 ve(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 ye=`modulepreload`,be=function(e){return`/consenti/`+e},I={},L=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),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?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=be(t,n),t=s(t),t in I)return;I[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:ye,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}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)})},R={en:`English (en)`,es:`Español (es)`,fr:`Français (fr)`,de:`Deutsch (de)`,ja:`日本語 (ja)`,"zh-CN":`中文 (zh-CN)`},z=Object.keys(R),xe={es:()=>L(()=>import(`./es-B6Jp0OPe.js`).then(e=>e.default),[]),fr:()=>L(()=>import(`./fr-CshYcQPW.js`).then(e=>e.default),[]),de:()=>L(()=>import(`./de-jwngydrC.js`).then(e=>e.default),[]),ja:()=>L(()=>import(`./ja-CgjZNBrc.js`).then(e=>e.default),[]),"zh-CN":()=>L(()=>import(`./zh-CN-BnLZkfBC.js`).then(e=>e.default),[])},B={en:F};function V(e){if(B[e])return Promise.resolve(B[e]);let t=xe[e];return t?t().then(t=>(B[e]=t,t)):Promise.resolve(F)}var H=o({locale:`en`,setLocale:()=>{},t:e=>e});function Se({children:n}){let[r,i]=t(()=>{try{let e=localStorage.getItem(`dashboard-locale`);return e&&z.includes(e)?e:`en`}catch{return`en`}}),[o,s]=t(B[r]??F);return a(()=>{r!==`en`&&!B[r]&&V(r).then(s)},[]),e(H.Provider,{value:{locale:r,setLocale:e=>{if(e!==r){i(e);try{localStorage.setItem(`dashboard-locale`,e)}catch{}B[e]?s(B[e]):V(e).then(s)}},t:(e,t)=>ve(o,e,t)},children:n})}var Ce=()=>n(H),U=()=>n(H).t,we=j;function Te(){let{locale:t,setLocale:n,t:r}=Ce();return e(`div`,{class:`flex items-center gap-1`,title:r(`locale.switcherAria`),children:[e(we,{size:13,className:`text-gray-400 dark:text-gray-500 shrink-0`,"aria-hidden":`true`}),e(`select`,{value:t,onChange:e=>n(e.target.value),"aria-label":r(`locale.switcherAria`),disabled:z.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:z.map(t=>e(`option`,{value:t,children:R[t]},t))})]})}var W=o(()=>{});function Ee({setTitle:t,children:n}){return e(W.Provider,{value:t,children:n})}function G(e){let t=n(W);a(()=>{t(e)},[e,t])}var K=[{key:`nav.dashboard`,hash:`#/`,Icon:ce},{key:`nav.reports`,hash:`#/reports`,Icon:ie,perm:`stats:view`},{type:`group`,key:`nav.consentBanners`,baseHash:`#/banners`,Icon:ge,children:[{key:`nav.consentTemplates`,hash:`#/banners/consent-templates`,Icon:O},{key:`nav.uiTemplates`,hash:`#/banners/ui-templates`,Icon:N},{key:`nav.profiles`,hash:`#/banners/profiles`,Icon:oe}]},{key:`nav.consents`,hash:`#/consents`,Icon:P},{key:`nav.visitors`,hash:`#/visitors`,Icon:_e},{key:`nav.users`,hash:`#/users`,Icon:se,perm:`user:view`},{key:`nav.roles`,hash:`#/roles`,Icon:me,perm:`role:view`},{key:`nav.sites`,hash:`#/tenants`,Icon:j,perm:`settings:update`,superadminOnly:!0},{key:`nav.vendors`,hash:`#/vendors`,Icon:de,perm:`consent:view`},{key:`nav.audit`,hash:`#/audit`,Icon:fe,perm:`audit:view`},{key:`nav.api`,hash:`#/api/config`,Icon:ue,perm:`settings:update`},{key:`nav.settings`,hash:`#/settings`,Icon:pe},{key:`nav.howItWorks`,hash:`#/how-it-works`,Icon:ae}];function De({current:n,collapsed:r,onToggle:i}){let{user:a,logout:o}=b(),{appName:s,appLogoPath:l,hidePoweredBy:u}=w(),d=U(),[f,p]=t(()=>{let e=new Set;for(let t of K)`type`in t&&t.type===`group`&&n.startsWith(t.baseHash)&&e.add(t.baseHash);return e}),m=e=>{p(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},h=e=>n===e||e!==`#/`&&n.startsWith(e),g=e=>n.startsWith(e.baseHash),_=a?.roles.includes(`super_admin`)??!1,v=(e,t)=>(!t||_)&&(!e||a?.permissions.includes(e));return e(`aside`,{class:`${r?`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":d(`nav.adminDashboard`),children:[e(`div`,{class:`px-3 py-5 border-b border-gray-700 flex items-center gap-2`,children:r?e(`div`,{class:`w-full flex justify-center`,children:l?e(`img`,{src:l,alt:s,class:`h-7 w-7 object-contain rounded`}):e(`img`,{src:`/icon.svg`,alt:s,class:`h-7 w-7`})}):e(`div`,{class:`min-w-0`,children:[l?e(`img`,{src:l,alt:s,class:`h-7 w-auto object-contain`}):e(`img`,{src:`/logo-dark.svg`,alt:s,class:`h-7 w-auto`}),e(`p`,{class:`text-xs text-gray-400 mt-0.5`,children:d(`nav.adminDashboard`)})]})}),e(`nav`,{class:`flex-1 py-4 overflow-y-auto`,"aria-label":d(`nav.adminDashboard`),children:K.filter(e=>v(e.perm,e.superadminOnly)).map(t=>{if(`type`in t&&t.type===`group`){let n=!r&&f.has(t.baseHash),i=g(t),a=t.children.filter(e=>v(e.perm));if(a.length===0)return null;let o=d(t.key);return e(`div`,{children:[e(`button`,{type:`button`,onClick:()=>{r?window.location.hash=a[0].hash:m(t.baseHash)},"aria-expanded":r?void 0:n,"aria-label":r?o:void 0,title:r?o:void 0,class:`w-full flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${r?`justify-center`:`justify-between`} ${i?`text-white bg-gray-800`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[e(`div`,{class:`flex items-center gap-3 ${r?``:`min-w-0`}`,children:[e(t.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!r&&e(`span`,{class:`truncate`,children:o})]}),!r&&e(T,{size:13,className:`shrink-0 text-gray-500 transition-transform ${n?`rotate-180`:``}`,"aria-hidden":`true`})]}),n&&e(`div`,{class:`bg-gray-950/30`,children:a.map(t=>{let n=h(t.hash),r=d(t.key);return e(`a`,{href:t.hash,"aria-current":n?`page`:void 0,class:`flex items-center gap-3 pl-8 pr-3 py-2 text-sm transition-colors ${n?`bg-blue-600 text-white`:`text-gray-400 hover:bg-gray-800 hover:text-white`}`,children:[e(t.Icon,{size:14,className:`shrink-0`,"aria-hidden":`true`}),r]},t.hash)})})]},t.baseHash)}let n=t,i=h(n.hash),a=d(n.key);return e(`a`,{href:n.hash,"aria-current":i?`page`:void 0,"aria-label":r?a:void 0,title:r?a:void 0,class:`flex items-center gap-3 px-3 py-2.5 text-sm transition-colors ${r?`justify-center`:``} ${i?`bg-blue-600 text-white`:`text-gray-300 hover:bg-gray-800 hover:text-white`}`,children:[e(n.Icon,{size:16,className:`shrink-0`,"aria-hidden":`true`}),!r&&a]},n.hash)})}),e(`div`,{class:`px-3 py-4 border-t border-gray-700 ${r?`flex justify-center`:``}`,children:[!r&&e(c,{children:[e(`p`,{class:`text-xs text-gray-400 truncate`,children:[a?.email,e(`br`,{}),e(`i`,{class:`text-gray-500`,children:a?.roles})]}),!u&&e(`p`,{class:`text-[10px] text-gray-600 mt-2`,children:[d(`layout.poweredBy`),` `,e(`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`})]})]}),r&&e(`button`,{onClick:o,"aria-label":d(`layout.signOut`),title:d(`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:e(M,{size:16,"aria-hidden":`true`})})]})]})}var q=le,J=he;function Oe({collapsed:t}){let{theme:n,toggle:r}=S(),i=U(),a=n===`dark`,o=i(a?`layout.toggleLight`:`layout.toggleDark`);return t?e(`button`,{onClick:r,"aria-label":o,title:o,class:`w-8 h-8 flex items-center justify-center rounded hover:bg-gray-700 text-gray-400 hover:text-white transition-colors`,children:a?e(q,{size:16,className:`text-cyan-400`}):e(J,{size:16,className:`text-gray-400`})}):e(`button`,{onClick:r,"aria-label":o,title:o,"aria-pressed":a,class:`relative flex items-center w-8 h-6 rounded-full px-0.5 transition-all duration-300 ${a?`bg-gray-900 ring-2 ring-cyan-400`:`bg-gray-600`}`,children:e(`span`,{class:`w-5 h-5 rounded-full flex items-center justify-center transition-all duration-300 ${a?`translate-x-2 bg-gray-800`:`translate-x-0 bg-white shadow`}`,children:a?e(q,{size:11,className:`text-cyan-400`}):e(J,{size:11,className:`text-amber-500`})})})}var ke=M,Ae=D,je=E;function Y(){return typeof window<`u`&&window.innerWidth<768}function Me({children:n,title:r,current:i}){let[o,s]=t(()=>Y()),c=()=>s(e=>!e),{logout:l}=b(),u=U();return a(()=>{let e=()=>{Y()&&s(!0)};return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),e(`div`,{class:`flex h-screen overflow-hidden dark:bg-gray-900`,children:[e(`div`,{class:`relative shrink-0`,children:[e(De,{current:i,collapsed:o,onToggle:c}),e(`button`,{onClick:c,"aria-label":u(o?`layout.expandSidebar`:`layout.collapseSidebar`),title:u(o?`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:e(o?Ae:je,{size:13})})]}),e(`div`,{class:`flex-1 flex flex-col min-w-0 overflow-hidden`,children:[e(`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:[r?e(`h1`,{class:`text-xl font-semibold text-gray-800 dark:text-gray-100`,children:r}):e(`span`,{}),e(`div`,{class:`flex items-center gap-3`,children:[e(Oe,{}),e(Te,{}),e(`button`,{onClick:l,"aria-label":u(`layout.signOut`),title:u(`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:[e(ke,{size:14,"aria-hidden":`true`}),u(`layout.signOut`)]})]})]}),e(`main`,{class:`flex-1 overflow-y-auto`,children:e(`div`,{class:`p-6`,children:n})})]})]})}var Ne=A,Pe=k;function Fe(){let{login:n}=b(),{appName:r,appLogoPath:i,hidePoweredBy:a}=w(),o=U(),[s,c]=t(``),[l,u]=t(``),[f,p]=t(!1),[m,h]=t(``),[g,_]=t(!1),v=async(e,t)=>{h(``),_(!0);try{let{token:r}=await d(`/auth/login`,{method:`POST`,body:JSON.stringify({email:e,password:t})});n(r),window.location.hash=`#/`}catch{h(o(`login.error.invalid`))}finally{_(!1)}};return e(`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:[i?e(`img`,{src:i,alt:r,class:`h-14 w-auto mx-auto mb-3 object-contain`}):null,e(`div`,{class:`bg-white rounded-xl shadow-sm border border-gray-200 p-8 w-full max-w-sm`,children:[e(`div`,{class:`mb-6 text-center`,children:[e(`h1`,{class:`text-xl font-bold text-gray-900`,children:o(`login.title`,{appName:r})}),e(`p`,{class:`text-sm text-gray-500 mt-1`,children:o(`login.subtitle`)})]}),e(`form`,{onSubmit:e=>{e.preventDefault(),v(s,l)},class:`space-y-4`,children:[e(`div`,{children:[e(`label`,{for:`login-email`,class:`block text-sm font-medium text-gray-700 mb-1`,children:o(`login.email`)}),e(`input`,{id:`login-email`,type:`email`,required:!0,value:s,onInput:e=>c(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:o(`login.emailPlaceholder`),autocomplete:`email`})]}),e(`div`,{children:[e(`label`,{for:`login-password`,class:`block text-sm font-medium text-gray-700 mb-1`,children:o(`login.password`)}),e(`div`,{class:`relative`,children:[e(`input`,{id:`login-password`,type:f?`text`:`password`,required:!0,value:l,onInput:e=>u(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`}),e(`button`,{type:`button`,onClick:()=>p(e=>!e),"aria-label":o(f?`login.hidePassword`:`login.showPassword`),class:`absolute inset-y-0 right-0 flex items-center px-3 text-gray-400 hover:text-gray-600`,children:e(f?Pe:Ne,{size:16})})]})]}),m&&e(`p`,{role:`alert`,class:`text-sm text-red-600 bg-red-50 border border-red-200 rounded px-3 py-2`,children:m}),e(`button`,{type:`submit`,disabled:g,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:o(g?`login.submitting`:`login.submit`)})]}),!1,a||e(`p`,{class:`mt-5 text-center text-[11px] text-gray-400`,children:[o(`layout.poweredBy`),` `,e(`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 X({label:t,value:n,sub:r}){return e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[e(`p`,{class:`text-sm text-gray-500 dark:text-gray-400`,children:t}),e(`p`,{class:`text-3xl font-bold text-gray-900 dark:text-gray-100 mt-1`,children:n}),r&&e(`p`,{class:`text-xs text-gray-400 dark:text-gray-500 mt-1`,children:r})]})}function Ie({data:t,ariaLabel:n,noDataLabel:r}){if(t.length===0)return e(`p`,{class:`text-sm text-gray-400`,children:r});let i=Math.max(...t.map(e=>e.count),1),a=552/Math.max(t.length-1,1),o=t.map((e,t)=>({x:24+t*a,y:96-e.count/i*72,label:e.date.slice(5),count:e.count})),s=o.map((e,t)=>`${t===0?`M`:`L`} ${e.x} ${e.y}`).join(` `),c=`${s} L ${o[o.length-1].x} 96 L ${o[0].x} 96 Z`;return e(`svg`,{viewBox:`0 0 600 120`,class:`w-full`,role:`img`,"aria-label":n,children:[e(`defs`,{children:e(`linearGradient`,{id:`tl-grad`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[e(`stop`,{offset:`0%`,"stop-color":`#6366f1`,"stop-opacity":`0.3`}),e(`stop`,{offset:`100%`,"stop-color":`#6366f1`,"stop-opacity":`0.02`})]})}),e(`path`,{d:c,fill:`url(#tl-grad)`}),e(`path`,{d:s,fill:`none`,stroke:`#6366f1`,"stroke-width":`2`,"stroke-linejoin":`round`}),o.map((n,r)=>e(`g`,{children:[e(`circle`,{cx:n.x,cy:n.y,r:`3`,fill:`#6366f1`}),r%Math.max(Math.floor(t.length/6),1)===0&&e(`text`,{x:n.x,y:116,"text-anchor":`middle`,"font-size":`8`,fill:`#9ca3af`,children:n.label})]},r))]})}function Le({data:t,noDataLabel:n}){if(t.length===0)return e(`p`,{class:`text-sm text-gray-400`,children:n});let r=t.slice(0,8),i=Math.max(...r.map(e=>e.count),1);return e(`div`,{class:`space-y-2`,children:r.map(t=>e(`div`,{class:`flex items-center gap-2`,children:[e(`span`,{class:`text-xs text-gray-500 w-8 text-right`,children:t.country}),e(`div`,{class:`flex-1 bg-gray-100 rounded h-3 overflow-hidden`,children:e(`div`,{class:`h-full bg-indigo-500 rounded`,style:{width:`${t.count/i*100}%`},"aria-hidden":`true`})}),e(`span`,{class:`text-xs text-gray-600 w-8`,children:t.count})]},t.country))})}function Re({data:t,label:n,sub:r}){let i=2*Math.PI*36,a=t.rate/100*i;return e(`div`,{class:`flex items-center gap-4`,children:[e(`svg`,{width:`88`,height:`88`,viewBox:`0 0 88 88`,role:`img`,"aria-label":`${n}: ${t.rate}%`,children:[e(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#e5e7eb`,"stroke-width":`8`}),e(`circle`,{cx:`44`,cy:`44`,r:36,fill:`none`,stroke:`#6366f1`,"stroke-width":`8`,"stroke-dasharray":`${a} ${i}`,"stroke-linecap":`round`,transform:`rotate(-90 44 44)`}),e(`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:[t.rate,`%`]})]}),e(`div`,{children:[e(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300`,children:n}),e(`p`,{class:`text-xs text-gray-500 dark:text-gray-400`,children:r})]})]})}function ze({rows:t,noDataLabel:n,grantedLabel:r,deniedLabel:i,objectedLabel:a}){if(t.length===0)return e(`p`,{class:`text-sm text-gray-400`,children:n});let o=Math.max(...t.map(e=>e.granted+e.denied+e.objected),1);return e(`div`,{class:`space-y-3`,children:[e(`div`,{class:`flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400`,children:[e(`span`,{class:`flex items-center gap-1`,children:[e(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-emerald-500 inline-block`,"aria-hidden":`true`}),r]}),e(`span`,{class:`flex items-center gap-1`,children:[e(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-rose-500 inline-block`,"aria-hidden":`true`}),i]}),e(`span`,{class:`flex items-center gap-1`,children:[e(`span`,{class:`w-2.5 h-2.5 rounded-sm bg-amber-500 inline-block`,"aria-hidden":`true`}),a]})]}),t.map(t=>{let n=t.granted+t.denied+t.objected;return e(`div`,{class:`flex items-center gap-2`,children:[e(`span`,{class:`text-xs text-gray-600 dark:text-gray-300 w-28 truncate`,title:t.label,children:t.label}),e(`div`,{class:`flex-1 bg-gray-100 dark:bg-gray-700 rounded h-3 overflow-hidden flex`,children:n>0&&e(c,{children:[e(`div`,{class:`h-full bg-emerald-500`,style:{width:`${t.granted/o*100}%`},"aria-hidden":`true`}),e(`div`,{class:`h-full bg-rose-500`,style:{width:`${t.denied/o*100}%`},"aria-hidden":`true`}),e(`div`,{class:`h-full bg-amber-500`,style:{width:`${t.objected/o*100}%`},"aria-hidden":`true`})]})}),e(`span`,{class:`text-xs text-gray-500 dark:text-gray-400 w-10 text-right`,children:n})]},t.label)})]})}var Z={overview:()=>d(`/stats/overview`),categories:()=>d(`/stats/categories`),timeline:(e=30)=>d(`/stats/timeline?days=${e}`),countries:()=>d(`/stats/countries`),gpc:()=>d(`/stats/gpc`)};function Be({current:n}){let r=U();G(r(`dashboard.title`));let[i,o]=t(null),[s,l]=t([]),[u,d]=t([]),[f,p]=t(null),[m,h]=t(!0);return a(()=>{Promise.all([Z.overview().then(o).catch(()=>{}),Z.timeline(30).then(l).catch(()=>{}),Z.countries().then(d).catch(()=>{}),Z.gpc().then(p).catch(()=>{})]).finally(()=>h(!1))},[]),e(c,{children:m?e(`p`,{role:`status`,"aria-live":`polite`,class:`text-gray-400 text-sm`,children:r(`common.loading`)}):e(`div`,{class:`space-y-6`,children:[i&&e(`div`,{class:`grid grid-cols-2 lg:grid-cols-4 gap-4`,children:[e(X,{label:r(`dashboard.stats.totalConsents`),value:i.totalConsents}),e(X,{label:r(`dashboard.stats.totalVisitors`),value:i.totalVisitors}),e(X,{label:r(`dashboard.stats.accepted`),value:`${i.acceptedPct}%`,sub:r(`dashboard.stats.acceptedSub`)}),e(X,{label:r(`dashboard.stats.rejected`),value:`${i.rejectedPct}%`,sub:r(`dashboard.stats.rejectedSub`)})]}),e(`div`,{class:`grid grid-cols-1 lg:grid-cols-2 gap-6`,children:[e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[e(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:r(`dashboard.chart.timeline`)}),e(Ie,{data:s,ariaLabel:r(`dashboard.chart.timelineAria`),noDataLabel:r(`dashboard.chart.noData`)})]}),e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:[e(`p`,{class:`text-sm font-medium text-gray-700 dark:text-gray-300 mb-3`,children:r(`dashboard.chart.countries`)}),e(Le,{data:u,noDataLabel:r(`dashboard.chart.noCountryData`)})]})]}),f&&e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:e(Re,{data:f,label:r(`dashboard.gpc.label`),sub:r(`dashboard.gpc.sub`,{detected:f.detected,total:f.total})})}),e(`div`,{class:`bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-5`,children:e(`a`,{href:`#/reports`,class:`text-sm text-blue-600 dark:text-blue-400 hover:underline`,children:r(`dashboard.viewReports`)})})]})})}var Ve={status:()=>d(`/setup/status`),config:()=>d(`/setup/config`),complianceGroups:()=>d(`/setup/compliance-groups`),seedProfiles:e=>d(`/setup/seed-profiles`,{method:`POST`,body:JSON.stringify({groups:e})}),complete:()=>d(`/setup/complete`,{method:`POST`})},Q={Reports:()=>L(()=>import(`./Reports-B1Ww0ovT.js`),__vite__mapDeps([0,1,2])),ProfileList:()=>L(()=>import(`./ProfileList-C4cIDrM6.js`),__vite__mapDeps([3,1,2,4,5,6,7,8,9,10,11,12,13])),ProfileEditor:()=>L(()=>import(`./ProfileEditor-CSFdOweN.js`),__vite__mapDeps([14,1,2,4,5,15,8,16,11,12,17,18,19,10])),ProfileVersionHistory:()=>L(()=>import(`./ProfileVersionHistory-CX5-Oupy.js`),__vite__mapDeps([20,1,16,11,2,19,10])),ArchivedProfileList:()=>L(()=>import(`./ArchivedProfileList-BlQ2gEWz.js`),__vite__mapDeps([21,1,9,10,11,2])),ConsentTemplateList:()=>L(()=>import(`./ConsentTemplateList-DMPd2y5s.js`),__vite__mapDeps([22,1,2,5,7,8,9,10,12,17])),ConsentTemplateEditor:()=>L(()=>import(`./ConsentTemplateEditor-DA7B5aI_.js`),__vite__mapDeps([23,1,2,24,4,17,8,12,25,18])),UITemplateList:()=>L(()=>import(`./UITemplateList-C3UMbnfs.js`),__vite__mapDeps([26,1,2,5,7,8,9,10,17])),UITemplateEditor:()=>L(()=>import(`./UITemplateEditor-BAaMnuOU.js`),__vite__mapDeps([27,1,2,24,4,17,15,8,16,18])),ConsentList:()=>L(()=>import(`./ConsentList-DgJMrhih.js`),__vite__mapDeps([28,1,2,29,10,9,30,16])),VisitorList:()=>L(()=>import(`./VisitorList-DNB9Ia72.js`),__vite__mapDeps([31,1,2,29,10,9,30,16])),UserList:()=>L(()=>import(`./UserList-CHGNnS50.js`),__vite__mapDeps([32,1,2,8,9,10,30,16,33,13,34])),RoleList:()=>L(()=>import(`./RoleList-CQ1GjR0W.js`),__vite__mapDeps([35,1,2,4,36,8,16,34])),TenantList:()=>L(()=>import(`./TenantList-DCsT7ghb.js`),__vite__mapDeps([37,1,2,8,9,10])),VendorList:()=>L(()=>import(`./VendorList-C-sswM1A.js`),__vite__mapDeps([38,1,2,25,13])),AuditLog:()=>L(()=>import(`./AuditLog-BpZoAFOe.js`),__vite__mapDeps([39,1,2,6,29,10,9,30,16])),Settings:()=>L(()=>import(`./Settings-sIMVWQ0V.js`),__vite__mapDeps([40,1,2])),ChangePassword:()=>L(()=>import(`./ChangePassword-BZkP2dXQ.js`),__vite__mapDeps([41,1,33,2])),ApiConfig:()=>L(()=>import(`./ApiConfig-CZMtYRfK.js`),__vite__mapDeps([42,1,2,4,5,43,36,8])),HowItWorks:()=>L(()=>import(`./HowItWorks-CJCrdr3o.js`),__vite__mapDeps([44,1])),SetupWizard:()=>L(()=>import(`./SetupWizard-ChFBxqo3.js`),__vite__mapDeps([45,1,2,4,43]))},He=i(()=>Q.Reports().then(e=>({default:e.Reports}))),Ue=i(()=>Q.ProfileList().then(e=>({default:e.ProfileList}))),We=i(()=>Q.ProfileEditor().then(e=>({default:e.ProfileEditor}))),Ge=i(()=>Q.ProfileVersionHistory().then(e=>({default:e.ProfileVersionHistory}))),Ke=i(()=>Q.ArchivedProfileList().then(e=>({default:e.ArchivedProfileList}))),qe=i(()=>Q.ConsentTemplateList().then(e=>({default:e.ConsentTemplateList}))),Je=i(()=>Q.ConsentTemplateEditor().then(e=>({default:e.ConsentTemplateEditor}))),Ye=i(()=>Q.UITemplateList().then(e=>({default:e.UITemplateList}))),Xe=i(()=>Q.UITemplateEditor().then(e=>({default:e.UITemplateEditor}))),Ze=i(()=>Q.ConsentList().then(e=>({default:e.ConsentList}))),Qe=i(()=>Q.VisitorList().then(e=>({default:e.VisitorList}))),$e=i(()=>Q.UserList().then(e=>({default:e.UserList}))),et=i(()=>Q.RoleList().then(e=>({default:e.RoleList}))),tt=i(()=>Q.TenantList().then(e=>({default:e.TenantList}))),nt=i(()=>Q.VendorList().then(e=>({default:e.VendorList}))),rt=i(()=>Q.AuditLog().then(e=>({default:e.AuditLogPage}))),it=i(()=>Q.Settings().then(e=>({default:e.Settings}))),at=i(()=>Q.ChangePassword().then(e=>({default:e.ChangePassword}))),ot=i(()=>Q.ApiConfig().then(e=>({default:e.ApiConfig}))),st=i(()=>Q.HowItWorks().then(e=>({default:e.HowItWorks}))),ct=i(()=>Q.SetupWizard().then(e=>({default:e.SetupWizard})));function lt(){for(let e of Object.values(Q))e().catch(()=>{})}function ut(e){typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e):window.setTimeout(e,1)}var dt=e(`div`,{class:`p-6 text-sm text-gray-400`,children:`Loading…`});function $(){return window.location.hash||`#/`}function ft(){let{user:n}=b(),[r,i]=t($),[o,s]=t(null),[c,u]=t(``);return a(()=>{let e=()=>i($());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),a(()=>{if(!n){s(null);return}Ve.status().then(({completed:e})=>s(e)).catch(()=>s(!0))},[n]),a(()=>{n&&ut(lt)},[n]),n?r===`#/setup`?o===!0?(window.location.hash=`#/`,null):e(l,{fallback:dt,children:e(ct,{onComplete:()=>s(!0)})}):o===!1?(r!==`#/setup`&&(window.location.hash=`#/setup`),null):r===`#/login`?(window.location.hash=`#/`,null):e(Ee,{setTitle:u,children:e(Me,{title:c,current:r,children:e(l,{fallback:dt,children:pt(r)})})}):(r!==`#/login`&&(window.location.hash=`#/login`),e(Fe,{}))}function pt(t){if(t===`#/`||t===`#`)return e(Be,{current:t});if(t===`#/reports`)return e(He,{current:t});if(t===`#/banners/profiles`)return e(Ue,{current:t});if(t===`#/banners/profiles/new`)return e(We,{current:t});if(t===`#/banners/profiles/archived`)return e(Ke,{current:t});{let n=t.match(/^#\/banners\/profiles\/([^/]+)\/history(?:\?(.*))?$/);if(n){let r=new URLSearchParams(n[2]??``),i=e=>{let t=r.get(e);return t!==null&&Number.isInteger(Number(t))?Number(t):void 0},a=i(`version`),o=i(`compare`);return e(Ge,{id:n[1],current:t,...a===void 0?{}:{initialVersion:a},...o===void 0?{}:{compareVersion:o}})}}return t.startsWith(`#/banners/profiles/`)?e(We,{id:t.slice(19),current:t}):t===`#/banners/consent-templates`?e(qe,{current:t}):t===`#/banners/consent-templates/new`?e(Je,{current:t}):t.startsWith(`#/banners/consent-templates/`)?e(Je,{id:t.slice(28),current:t}):t===`#/banners/ui-templates`?e(Ye,{current:t}):t===`#/banners/ui-templates/new`?e(Xe,{current:t}):t.startsWith(`#/banners/ui-templates/`)?e(Xe,{id:t.slice(23),current:t}):t===`#/consents`||t.startsWith(`#/consents?`)?e(Ze,{current:t}):t===`#/visitors`||t.startsWith(`#/visitors?`)?e(Qe,{current:t}):t===`#/users`?e($e,{current:t}):t===`#/roles`?e(et,{current:t}):t===`#/tenants`?e(tt,{current:t}):t===`#/vendors`||t.startsWith(`#/vendors?`)?e(nt,{current:t}):t===`#/audit`||t.startsWith(`#/audit?`)?e(rt,{current:t}):t===`#/api/config`?e(ot,{current:t}):t===`#/settings`?e(it,{current:t}):t===`#/settings/change-password`?e(at,{current:t}):t===`#/how-it-works`?e(st,{current:t}):e(Be,{current:`#/`})}function mt(){return e(ee,{children:e(re,{children:e(Se,{children:e(y,{children:e(ft,{})})})})})}r(e(mt,{}),document.getElementById(`app`));export{w as _,Ie as a,P as c,A as d,k as f,T as g,E as h,X as i,N as l,D as m,Z as n,G as o,O as p,ze as r,U as s,Ve as t,j as u,S as v,b as y};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var e={_section_nav:`── ナビゲーション ─────────────────────────────────────`,"nav.dashboard":`ダッシュボード`,"nav.consentBanners":`同意バナー`,"nav.consentTemplates":`Cookie テンプレート`,"nav.uiTemplates":`UI テンプレート`,"nav.profiles":`プロファイル`,"nav.consents":`同意記録`,"nav.visitors":`訪問者`,"nav.users":`ユーザー`,"nav.roles":`ロール`,"nav.sites":`サイト`,"nav.vendors":`TCF ベンダー`,"nav.reports":`レポート`,"nav.audit":`監査ログ`,"nav.api":`API`,"nav.settings":`設定`,"nav.adminDashboard":`管理ダッシュボード`,_section_layout:`── レイアウト ─────────────────────────────────────`,"layout.expandSidebar":`サイドバーを展開`,"layout.collapseSidebar":`サイドバーを折りたたむ`,"layout.signOut":`サインアウト`,"layout.toggleDark":`ダークモードに切り替え`,"layout.toggleLight":`ライトモードに切り替え`,"layout.poweredBy":`提供元`,_section_common:`── 共通 ─────────────────────────────────────────`,"common.loading":`読み込み中…`,"common.searching":`検索中…`,"common.save":`保存`,"common.saving":`保存中…`,"common.cancel":`キャンセル`,"common.close":`閉じる`,"common.delete":`削除`,"common.edit":`編集`,"common.create":`作成`,"common.confirm":`確認`,"common.noData":`データがありません`,"common.search":`Search…`,"common.perPage":`1ページあたり`,"common.goToPage":`ページに移動`,"common.pageOfTotal":`{{total}} ページ中 {{page}} ページ目`,"common.noResults":`No results match your search.`,"common.exportCsv":`CSV をエクスポート`,"common.duplicate":`複製`,"common.active":`有効`,"common.inactive":`無効`,"common.name":`名前`,"common.email":`メール`,"common.status":`ステータス`,"common.created":`作成日時`,"common.id":`ID`,"common.add":`追加`,"common.remove":`削除`,"common.revoke":`取り消す`,"common.required":`必須`,"common.version":`バージョン`,"common.locale":`ロケール`,"common.country":`国`,"common.source":`ソース`,"common.grantAll":`すべて許可`,"common.revokeAll":`すべて取り消す`,"common.granted":`許可済み`,"common.page":`ページ {{n}}`,"common.prev":`前へ`,"common.next":`次へ`,"common.you":`あなた`,"common.default":`デフォルト`,"common.hide":`非表示`,"common.show":`表示`,"common.activate":`有効化`,"common.deactivate":`無効化`,"common.newRole":`新しいロール`,"common.copyToClipboard":`クリップボードにコピー`,"common.back":`戻る`,"common.copyId":`ID をコピー`,"common.mandatory":`必須`,"common.optional":`任意`,"common.roles":`ロール`,"common.showPassword":`パスワードを表示`,"common.hidePassword":`パスワードを非表示`,"common.updated":`更新済み`,"common.locked":`ロック済み`,_section_locale:`── 言語切り替え ─────────────────────────────────`,"locale.en":`英語`,"locale.switcherAria":`言語を切り替える`,_section_login:`── ログイン ─────────────────────────────────────`,"login.title":`{{appName}} 管理画面`,"login.subtitle":`アカウントにサインインしてください`,"login.email":`メール`,"login.emailPlaceholder":`admin@example.com`,"login.password":`パスワード`,"login.submit":`サインイン`,"login.submitting":`サインイン中…`,"login.error.invalid":`メールアドレスまたはパスワードが無効です`,"login.devSignIn":`⚡ 開発用: user@consenti.dev としてサインイン`,_section_setupWizard:`── セットアップウィザード ─────────────────────`,"setupWizard.welcome.title":`{{appName}} へようこそ`,"setupWizard.welcome.body":`同意管理のセットアップを行いましょう。数分で完了します。現在の設定内容を確認し、コンプライアンスプロファイルの初期セットをインストールするお手伝いをします。`,"setupWizard.welcome.docsLink":`ドキュメントを見る`,"setupWizard.welcome.howItWorksLink":`Consenti の仕組みを見る`,"setupWizard.welcome.getStarted":`始める`,"setupWizard.welcome.skip":`セットアップをスキップ`,"setupWizard.config.title":`現在の設定`,"setupWizard.config.subtitle":`設定ファイルと環境変数から解決された内容と既定値をマージした結果です。機密情報は非表示になっています。`,"setupWizard.back":`戻る`,"setupWizard.continue":`続ける`,"setupWizard.profiles.title":`デフォルトのコンプライアンスプロファイル`,"setupWizard.profiles.subtitle":`Consenti には、主要なプライバシー規制に対応した8種類のコンプライアンスプロファイルが用意されています。今インストールするものを選択してください。後から追加することもできます。`,"setupWizard.profiles.selectAll":`8種類すべてのデフォルトプロファイルをインストール`,"setupWizard.profiles.installAndContinue":`インストールして続ける`,"setupWizard.profiles.skipAndContinue":`スキップして続ける`,"setupWizard.profiles.error":`選択したプロファイルをインストールできませんでした。後でプロファイル画面から再試行できます。`,"setupWizard.confirmation.title":`準備が整いました`,"setupWizard.confirmation.seededSummary":`{{count}} 件のコンプライアンスプロファイルをインストールしました。`,"setupWizard.confirmation.noneSeeded":`プロファイルはインストールされませんでした。プロファイル画面からいつでも作成できます。`,"setupWizard.confirmation.readinessTitle":`本番運用前に`,"setupWizard.confirmation.readinessJsonStorage":`現在 JSON ファイルストレージドライバーを使用しています。開発には適していますが、本番環境ではデータベースドライバー(node:sqlite、PostgreSQL、MySQL、MongoDB)への切り替えを推奨します。`,"setupWizard.confirmation.readinessDefaultCredentials":`管理者の認証情報が設定されていないため、Consenti はデモ用の認証情報を使用しています。本番運用前に CONSENTI_ADMIN_EMAIL と CONSENTI_ADMIN_PASSWORD を設定してください。`,"setupWizard.confirmation.howItWorks":`Consenti の仕組みを見る`,"setupWizard.confirmation.goToDashboard":`ダッシュボードへ`,_section_dashboard:`── ダッシュボード ─────────────────────────────`,"dashboard.title":`ダッシュボード`,"dashboard.stats.totalConsents":`同意の合計`,"dashboard.stats.totalVisitors":`訪問者数合計`,"dashboard.stats.accepted":`承認`,"dashboard.stats.acceptedSub":`≥80% の Cookie が許可済み`,"dashboard.stats.rejected":`拒否`,"dashboard.stats.rejectedSub":`≤20% の Cookie が許可済み`,"dashboard.chart.timeline":`同意(過去30日)`,"dashboard.chart.timelineAria":`同意タイムラインのグラフ`,"dashboard.chart.countries":`上位の国`,"dashboard.chart.noData":`データがありません。`,"dashboard.chart.noCountryData":`国別データがありません。`,"dashboard.gpc.label":`GPC 検出率`,"dashboard.gpc.sub":`{{detected}} / {{total}} 件の同意`,"dashboard.viewReports":`詳細レポートを見る →`,_section_reports:`── レポート ──────────────────────────────────────────`,"reports.title":`レポート`,"reports.filters.from":`開始日`,"reports.filters.to":`終了日`,"reports.filters.apply":`適用`,"reports.optin.total":`合計決定数`,"reports.optin.granted":`許可`,"reports.optin.denied":`拒否`,"reports.optin.managed":`一部管理`,"reports.optin.byDate":`オプトイン推移`,"reports.optin.byDateAria":`期間ごとのオプトイン決定`,"reports.optin.byLocale":`ロケール別`,"reports.category.title":`カテゴリ別`,"reports.legend.granted":`許可`,"reports.legend.denied":`拒否`,"reports.legend.objected":`異議あり`,"reports.legend.managed":`管理済み`,_section_consents:`── 同意記録 ───────────────────────────────────`,"consents.title":`同意記録`,"consents.filterFrom":`開始`,"consents.filterTo":`終了`,"consents.filterGpc":`GPC のみ`,"consents.records":`{{n}} 件の記録`,"consents.empty":`まだ同意記録はありません。`,"consents.col.visitorId":`訪問者 ID`,"consents.col.profile":`プロファイル`,"consents.col.locale":`ロケール`,"consents.col.gpc":`GPC`,"consents.col.age":`年齢`,"consents.col.source":`ソース`,"consents.col.created":`作成日時`,"consents.gpcYes":`はい`,"consents.ageVerified":`確認済み`,"consents.searchPlaceholder":`訪問者、プロファイル、ロケール、ソースを検索…`,"consents.detail.title":`同意記録`,"consents.detail.updated":`更新日時`,"consents.detail.consentJson":`同意データ`,"consents.detail.signature":`署名`,"consents.detail.signed":`署名済み`,"consents.detail.unsigned":`未署名`,_section_visitors:`── 訪問者 ─────────────────────────────────────`,"visitors.title":`訪問者`,"visitors.empty":`まだ訪問者は記録されていません。`,"visitors.col.visitorId":`訪問者 ID`,"visitors.col.country":`国`,"visitors.col.firstSeen":`初回訪問`,"visitors.col.lastSeen":`最終訪問`,"visitors.searchPlaceholder":`訪問者ID、国を検索…`,"visitors.detail.title":`訪問者`,"visitors.detail.region":`地域`,"visitors.detail.city":`市区町村`,_section_users:`── ユーザー ───────────────────────────────────`,"users.title":`ユーザー`,"users.count":`{{n}} 人のユーザー`,"users.newUser":`+ 新規ユーザー`,"users.createForm.title":`ユーザー作成`,"users.createForm.namePlaceholder":`名前`,"users.createForm.emailPlaceholder":`メール`,"users.createForm.passwordPlaceholder":`パスワード`,"users.createForm.confirmPasswordPlaceholder":`パスワードを確認`,"users.createForm.selectRole":`ロールを選択…`,"users.createForm.passwordMismatch":`パスワードが一致しません`,"users.createForm.error":`ユーザーの作成に失敗しました`,"users.col.status":`ステータス`,"users.status.active":`有効`,"users.status.inactive":`無効`,"users.action.activate":`有効化`,"users.action.deactivate":`無効化`,"users.dialog.delete.title":`ユーザー「{{name}}」を削除しますか?`,"users.dialog.delete.message":`このユーザーアカウントは完全に削除されます。`,_section_roles:`── ロールと権限 ─────────────────────────────`,"roles.title":`ロールと権限`,"roles.list.heading":`ロール`,"roles.list.empty":`まだロールがありません。まず1つ作成してください。`,"roles.form.roleNameLabel":`ロール名`,"roles.form.roleNamePlaceholder":`例: Editor`,"roles.form.descriptionLabel":`説明`,"roles.form.descriptionPlaceholder":`任意の説明`,"roles.perms.heading":`権限 — {{name}}`,"roles.perms.selectPrompt":`権限を管理するロールを選択してください`,"roles.perms.clickPrompt":`左側のロールをクリックして、権限の確認と管理を行ってください。`,"roles.perms.noPerms":`システムに定義された権限はありません。`,"roles.error.load":`ロールの読み込みに失敗しました。`,"roles.error.create":`ロールの作成に失敗しました。`,"roles.error.update":`ロールの更新に失敗しました。`,"roles.error.delete":`ロールの削除に失敗しました。`,"roles.error.perm":`権限の更新に失敗しました。`,"roles.dialog.delete.title":`ロール「{{name}}」を削除しますか?`,"roles.dialog.delete.message":`このロールが割り当てられたユーザーは、権限を直ちに失います。`,"roles.aria.editRole":`ロールを編集`,"roles.aria.deleteRole":`ロールを削除`,"roles.superAdminLocked":`「super_admin」ロールは保護されており、名前の変更、削除、権限の変更はできません。`,_section_profiles:`── プロファイル ───────────────────────────────`,"profiles.title":`プロファイル`,"profiles.count":`{{n}} 件のプロファイル`,"profiles.countSingular":`{{n}} 件のプロファイル`,"profiles.newProfile":`+ 新しいプロファイル`,"profiles.empty":`まだプロファイルがありません。まず1つ作成してください。`,"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":`名前`,"profiles.col.defaultLocale":`既定ロケール`,"profiles.col.templates":`テンプレート`,"profiles.col.created":`作成日時`,"profiles.template.cookie":`Cookie:`,"profiles.template.ui":`UI:`,"profiles.action.copyId":`プロファイル ID をコピー`,"profiles.action.copySlug":`Copy compliance group slug`,"profiles.action.copying":`コピー中…`,"profiles.dialog.delete.title":`「{{name}}」を削除しますか?`,"profiles.dialog.delete.message":`このプロファイルとそのすべてのロケール内容は完全に削除されます。`,"profiles.dialog.copy.title":`「{{name}}」を複製しますか?`,"profiles.dialog.copy.message":`このプロファイルとそのすべてのロケール内容が複製されます。`,"profiles.error.copy":`プロファイルのコピーに失敗しました。`,"profiles.error.activate":`プロファイルの有効化に失敗しました。`,"profiles.error.deactivate":`プロファイルの無効化に失敗しました。`,_section_profileEditor:`── プロファイルエディタ ─────────────────────`,"profileEditor.title.new":`新しいプロファイル`,"profileEditor.title.edit":`プロファイルを編集`,"profileEditor.title.loading":`プロファイルエディタ`,"profileEditor.step.config":`プロファイル設定`,"profileEditor.step.templates":`テンプレート`,"profileEditor.step.ageGateModal":`年齢確認`,"profileEditor.step.content":`コンテンツ`,"profileEditor.step.mainBanner":`メインバナー`,"profileEditor.step.gpcBanner":`GPCバナー`,"profileEditor.step.prefModal":`設定モーダル`,"profileEditor.config.profileName":`プロファイル名`,"profileEditor.config.profileNamePlaceholder":`My Website`,"profileEditor.config.defaultLocale":`既定ロケール`,"profileEditor.config.allowedDomains":`許可ドメイン`,"profileEditor.config.allowedDomainsHint":`*.example.com のようなワイルドカードに対応しています。すべて許可する場合は空欄にしてください。`,"profileEditor.config.regulations":`準拠規制`,"profileEditor.config.reg.gdprLabel":`GDPR`,"profileEditor.config.reg.gdprDesc":`EU/EEA のオプトイン。同意が与えられるまでトラッキングしません。初回訪問時にバナーを表示します。`,"profileEditor.config.reg.ccpaLabel":`CCPA`,"profileEditor.config.reg.ccpaDesc":`カリフォルニアのオプトアウト。Cookie は既定で許可されます。「Do Not Sell」トリガーを提供してください。`,"profileEditor.config.reg.cpraLabel":`CPRA`,"profileEditor.config.reg.cpraDesc":`カリフォルニア 2023。販売/共有はオプトアウト、機微データはオプトイン。GPC を尊重します。`,"profileEditor.config.reg.dpdpaLabel":`DPDPA`,"profileEditor.config.reg.dpdpaDesc":`インド 2023。GDPR と同様のオプトイン。GPC は認識されません。データ受託者の通知が必要です。`,"profileEditor.config.darkMode":`ダークモードを有効にする`,"profileEditor.config.darkModeHint":`ダークテーマのサイト向けに、同意ウィジェットへダークカラーのトークンを適用します。`,"profileEditor.config.dpdpa.heading":`DPDPA — 同意通知に必要な項目`,"profileEditor.config.dpdpa.fiduciary":`データ受託者名`,"profileEditor.config.dpdpa.fiduciaryPlaceholder":`Acme Corp Pvt Ltd`,"profileEditor.config.dpdpa.grievanceEmail":`苦情担当者のメール`,"profileEditor.config.dpdpa.grievanceEmailPlaceholder":`grievance@acme.com`,"profileEditor.config.dpdpa.purpose":`利用目的の説明`,"profileEditor.config.dpdpa.purposePlaceholder":`お客様の体験をパーソナライズするためにデータを収集します…`,"profileEditor.config.ageGate":`年齢確認を有効にする`,"profileEditor.config.ageGateHint":`同意の選択肢を表示する前に、訪問者に年齢の確認を求めます。最低年齢は規制により異なります — 13歳(COPPA)、16歳(GDPR第8条の既定値)。`,"profileEditor.config.ageGateSection.heading":`年齢確認 — 必須項目`,"profileEditor.config.ageGateSection.minimumAge":`最低年齢`,"profileEditor.config.ageGateSection.minimumAgeHint":`一般的な値: 13歳(COPPA)、16歳(GDPR第8条の既定値)。`,"profileEditor.config.ageGateSection.requireParentalConsent":`保護者の同意を必須にする`,"profileEditor.config.ageGateSection.requireParentalConsentHint":`拒否された場合、すべて拒否する代わりに保護者同意のリクエストを送信します。`,"profileEditor.templates.cookieTemplate":`Cookie テンプレート`,"profileEditor.templates.cookieTemplateHint":`設定モーダルに表示する Cookie / 目的を定義します。すべての項目はテンプレートから派生し、プロファイル内では読み取り専用です。`,"profileEditor.templates.selectCookie":`— Cookie テンプレートを選択 —`,"profileEditor.templates.uiTemplate":`UI テンプレート`,"profileEditor.templates.uiTemplateHint":`バナー/モーダルのレイアウト、ボタン数、カテゴリ構造を定義します。テキスト内容はステップ 3〜5 で追加します。`,"profileEditor.templates.selectUi":`— UI テンプレートを選択 —`,"profileEditor.templates.noTemplate":`テンプレートが選択されていません。`,"profileEditor.templates.previewPrompt":`ライブプレビューを表示するには、Cookie テンプレートと UI テンプレートの両方を選択してください。`,"profileEditor.templates.categoriesCount":`カテゴリ`,"profileEditor.templates.buttonsTotal":`合計ボタン数`,"profileEditor.content.loadDefaults":`デフォルト値を読み込む`,"profileEditor.content.loadDefaultsTitle":`コンプライアンス対応の英語デフォルト値でこのセクションを埋める`,"profileEditor.content.loadDefaultsNotice":`デフォルト値は英語のみです — 上のロケールタブで翻訳してください。`,"profileEditor.content.importError":`アップロードされたファイルを解析できませんでした。Consenti のロケールテンプレート形式に一致していることを確認してください。`,"profileEditor.content.mainBanner":`メインバナー`,"profileEditor.content.gpcBanner":`GPC バナー`,"profileEditor.content.prefModal":`設定モーダル`,"profileEditor.content.heading":`見出し`,"profileEditor.content.subheading":`サブ見出し`,"profileEditor.content.bodyText":`本文テキスト`,"profileEditor.content.introText":`導入文(任意)`,"profileEditor.content.buttonLabels":`ボタンラベル`,"profileEditor.content.categoryHeading":`カテゴリ見出し`,"profileEditor.content.categoryDesc":`カテゴリ説明`,"profileEditor.content.categoryFallback":`カテゴリ {{n}}`,"profileEditor.content.buttonLabelPlaceholder":`ボタンのテキスト…`,"profileEditor.content.categoryDescPlaceholder":`この Cookie カテゴリの説明…`,"profileEditor.content.liDescription":`正当な利益の説明(任意)`,"profileEditor.content.liDescriptionPlaceholder":`正当な利益に基づく理由…`,"profileEditor.content.liDescriptionHint":`正当な利益に基づく処理の GDPR 比較衡量テストの根拠を、訪問者に表示します。任意 — 上記のカテゴリ説明に含めることもできます。`,"profileEditor.content.mainBannerHeadingPlaceholder":`お客様のプライバシーを大切にしています`,"profileEditor.content.mainBannerBodyPlaceholder":`体験を向上させるために Cookie を使用しています…`,"profileEditor.content.gpcHeadingPlaceholder":`Global Privacy Control を検出しました`,"profileEditor.content.prefHeadingPlaceholder":`プライバシー設定`,"profileEditor.content.prefSubheadingPlaceholder":`以下で Cookie 設定を管理してください。`,"profileEditor.content.prefIntroPlaceholder":`カテゴリの上に表示する任意の導入文…`,"profileEditor.content.noContent":`コンテンツ編集を開始するには、ステップ 2 で UI テンプレートを選択してください。`,"profileEditor.content.loadingTemplate":`テンプレートを読み込み中…`,"profileEditor.nav.nextTemplates":`次へ: テンプレート`,"profileEditor.nav.nextContent":`次へ: コンテンツ`,"profileEditor.nav.nextAgeGate":`次へ: 年齢確認`,"profileEditor.nav.nextMainBanner":`次へ: メインバナー`,"profileEditor.nav.nextGpcBanner":`次へ: GPCバナー`,"profileEditor.nav.nextPrefModal":`次へ: 設定モーダル`,"profileEditor.action.create":`プロファイルを作成`,"profileEditor.action.save":`プロファイルを保存`,"profileEditor.error.nameRequired":`プロファイル名は必須です。`,"profileEditor.error.nameRequiredContinue":`次に進むにはプロファイル名が必要です。`,"profileEditor.error.cookieRequired":`Cookie テンプレートを選択してください。`,"profileEditor.error.cookieContinue":`続行するには Cookie テンプレートを選択してください。`,"profileEditor.error.uiRequired":`UI テンプレートを選択してください。`,"profileEditor.error.uiContinue":`続行するには UI テンプレートを選択してください。`,"profileEditor.error.failed":`プロファイルの保存に失敗しました。`,"profileEditor.error.load":`プロファイルの読み込みに失敗しました。`,"profileEditor.table.noNoCookies":`このテンプレートには Cookie が定義されていません。`,"profileEditor.table.id":`ID`,"profileEditor.table.legalBasis":`法的根拠`,"profileEditor.table.mandatory":`必須`,"profileEditor.table.gpc":`GPC`,"profileEditor.table.tcfVendor":`TCF ベンダー`,"profileEditor.table.cpraCategory":`CPRA カテゴリ`,"profileEditor.table.cookies":`Cookie`,"profileEditor.export.json":`JSON`,"profileEditor.export.csv":`CSV`,"profileEditor.export.import":`インポート`,"profileEditor.export.jsonTitle":`ロケール内容を JSON でダウンロード`,"profileEditor.export.csvTitle":`翻訳用にロケール内容を CSV でダウンロード`,"profileEditor.export.importTitle":`翻訳済みの JSON または CSV をアップロード`,"profileEditor.newLink":`+ 新規 ↗`,_section_consentTemplates:`── Cookie テンプレート ─────────────────────────`,"consentTemplates.title":`Cookie テンプレート`,"consentTemplates.count":`{{n}} 件のテンプレート`,"consentTemplates.countSingular":`{{n}} 件のテンプレート`,"consentTemplates.new":`+ 新しい Cookie テンプレート`,"consentTemplates.empty.title":`まだ Cookie テンプレートがありません。`,"consentTemplates.empty.hint":`Cookie テンプレートは、同意プロファイルで使用する Cookie / 目的の一覧を定義します。1つ作成して複数のプロファイルで再利用してください。`,"consentTemplates.search.placeholder":`Search consent templates…`,"consentTemplates.col.name":`Name`,"consentTemplates.col.cookies":`Cookies`,"consentTemplates.col.categories":`Categories`,"consentTemplates.required":`必須`,"consentTemplates.dialog.delete.title":`「{{name}}」を削除しますか?`,"consentTemplates.dialog.delete.message":`この Cookie テンプレートは完全に削除されます。紐づくプロファイルは Cookie 定義を失います。`,"consentTemplates.editor.title.new":`新しい Cookie テンプレート`,"consentTemplates.editor.title.edit":`Cookie テンプレートを編集`,"consentTemplates.editor.name":`テンプレート名`,"consentTemplates.editor.namePlaceholder":`例: Google Analytics + Ads`,"consentTemplates.editor.nameRequired":`テンプレート名は必須です。`,"consentTemplates.editor.definitions":`Cookie 定義`,"consentTemplates.editor.empty":`まだ Cookie が定義されていません。上で追加してください。`,"consentTemplates.editor.addCookie":`+ Cookie を追加`,"consentTemplates.editor.idNoMatches":`一致する既知のキーがありません — カスタム ID をそのまま入力できます`,"consentTemplates.editor.error.allIds":`すべての Cookie に ID が必要です。`,"consentTemplates.editor.error.uniqueIds":`Cookie ID は一意である必要があります。`,"consentTemplates.editor.error.failed":`テンプレートの保存に失敗しました。`,"consentTemplates.editor.error.notFound":`テンプレートが見つかりません。`,"consentTemplates.editor.action.create":`テンプレートを作成`,"consentTemplates.editor.action.save":`テンプレートを保存`,"consentTemplates.editor.showTcf":`TCF ベンダー`,"consentTemplates.editor.showCpra":`CPRA カテゴリ`,"consentTemplates.editor.infoHint":`詳細を確認するには列見出しをクリックしてください`,"consentTemplates.editor.infoUsage":`用途`,"consentTemplates.editor.infoLaws":`規制ガイダンス`,"consentTemplates.editor.infoExamples":`例`,"consentTemplates.col.id":`Cookie ID`,"consentTemplates.col.idShort":`ID / 名前`,"consentTemplates.col.gpc":`GPC シグナルを尊重`,"consentTemplates.col.gpcShort":`GPC`,"consentTemplates.col.tcfVendor":`TCF ベンダー ID`,"consentTemplates.col.cpraCategory":`CPRA データカテゴリ`,"consentTemplates.col.tcfVendorShort":`TCF ベンダー`,"consentTemplates.col.cpraCategoryShort":`CPRA カテゴリ`,"consentTemplates.col.purpose":`Cookie の目的`,"consentTemplates.col.purposeShort":`目的`,"consentTemplates.purpose.necessary":`必須`,"consentTemplates.purpose.functional":`機能`,"consentTemplates.purpose.preferences":`設定`,"consentTemplates.purpose.analytics":`分析`,"consentTemplates.purpose.marketing":`マーケティング`,"consentTemplates.editor.purposePlaceholder":`目的を選択…`,"consentTemplates.editor.error.purpose":`すべての Cookie に目的を設定してください。`,_section_uiTemplates:`── UI テンプレート ───────────────────────────`,"uiTemplates.title":`UI テンプレート`,"uiTemplates.count":`{{n}} 件のテンプレート`,"uiTemplates.countSingular":`{{n}} 件のテンプレート`,"uiTemplates.new":`+ 新しい UI テンプレート`,"uiTemplates.empty.title":`まだ UI テンプレートがありません。`,"uiTemplates.empty.hint":`UI テンプレートは、同意バナーやモーダルの視覚的設定 — 位置、ボタン、カテゴリ — を定義します。`,"uiTemplates.search.placeholder":`Search UI templates…`,"uiTemplates.col.name":`Name`,"uiTemplates.col.positions":`Positions`,"uiTemplates.col.buttons":`Buttons`,"uiTemplates.mainBanner":`メインバナー:`,"uiTemplates.gpcBanner":`GPC バナー:`,"uiTemplates.modal":`モーダル:`,"uiTemplates.categories":`{{n}} カテゴリ`,"uiTemplates.dialog.delete.title":`「{{name}}」を削除しますか?`,"uiTemplates.dialog.delete.message":`この UI テンプレートは完全に削除されます。紐づくプロファイルは UI 設定を失います。`,"uiTemplates.editor.title.new":`新しい UI テンプレート`,"uiTemplates.editor.title.edit":`UI テンプレートを編集`,"uiTemplates.editor.name":`テンプレート名`,"uiTemplates.editor.nameRequired":`テンプレート名は必須です。`,"uiTemplates.editor.namePlaceholder":`例: 標準 GDPR レイアウト`,"uiTemplates.editor.loading":`テンプレートを読み込み中…`,"uiTemplates.editor.tabMain":`メインバナー`,"uiTemplates.editor.tabGpc":`GPC バナー`,"uiTemplates.editor.tabModal":`設定モーダル`,"uiTemplates.editor.mainBannerHint":`同意がまだ記録されていない初回訪問時に表示されます。`,"uiTemplates.editor.gpcBannerHint":`GPC シグナルが検出された場合、メインバナーの代わりに表示されます(autoHonorGPC 有効時)。`,"uiTemplates.editor.error.notFound":`テンプレートが見つかりません。`,"uiTemplates.editor.error.buttons":`すべてのボタンに ID が必要です。`,"uiTemplates.editor.error.uniqueButtonIds":`Button IDs must be unique.`,"uiTemplates.editor.error.customButtons":`すべての「custom」アクションボタンには Cookie の選択が必要です。`,"uiTemplates.editor.error.catIds":`すべてのカテゴリ ID は必須です。`,"uiTemplates.editor.error.uniqueCatIds":`カテゴリ ID は一意である必要があります。`,"uiTemplates.editor.error.catCookies":`各カテゴリには少なくとも 1 つの Cookie が必要です。`,"uiTemplates.editor.error.failed":`テンプレートの保存に失敗しました。`,"uiTemplates.editor.action.create":`テンプレートを作成`,"uiTemplates.editor.action.save":`テンプレートを保存`,_section_sites:`── サイト / テナント ───────────────────────────`,"sites.title":`サイト / テナント`,"sites.createNew":`新しいサイトを作成`,"sites.namePlaceholder":`サイト名`,"sites.slugPlaceholder":`slug(例: site-a)`,"sites.col.name":`名前`,"sites.col.slug":`Slug`,"sites.col.id":`ID`,"sites.col.created":`作成日時`,"sites.empty":`まだサイトがありません。`,"sites.dialog.delete.title":`「{{name}}」を削除しますか?`,"sites.dialog.delete.message":`このサイトと関連データはすべて完全に削除されます。元に戻すことはできません。`,"sites.error.create":`サイトの作成に失敗しました。`,_section_vendors:`── TCF ベンダー ─────────────────────────────────`,"vendors.title":`TCF ベンダー一覧`,"vendors.info.title":`TCF ベンダー一覧とは?`,"vendors.searchPlaceholder":`ベンダーを検索…`,"vendors.gvlMeta":`GVL v{{version}} · 合計 {{total}} ベンダー`,"vendors.loading":`ベンダー一覧を読み込み中…`,"vendors.noResults":`ベンダーが見つかりません。`,"vendors.col.id":`ID`,"vendors.col.name":`名前`,"vendors.col.purposes":`目的`,"vendors.col.liPurposes":`正当な利益の目的`,"vendors.col.specialPurposes":`特別目的`,"vendors.pagination":`ページ {{page}} / {{totalPages}} · 合計 {{total}} ベンダー`,"vendors.prev":`← 前へ`,"vendors.next":`次へ →`,"tcfRegistration.title":`TCF登録の再確認が必要です`,"tcfRegistration.body":`compliance.tcf は cmpId {{cmpId}}(バージョン {{cmpVersion}})で有効になっていますが、この登録はまだ確認されていません — TCF は無効として扱われます:ウィジェットに window.__tcfapi は追加されず、同意記録に tcfString も付与されません。`,"tcfRegistration.deregistered":`この cmpId は {{date}} に IAB Europe への登録が抹消されました。新しい cmpId を登録し、サーバー設定を更新するまで確認はブロックされます。`,"tcfRegistration.notFound":`この cmpId はまだキャッシュ済みの IAB CMP リストに見つかりません。登録の反映には時間がかかる場合があります — しばらくしてから「ステータスを更新」をお試しください。`,"tcfRegistration.checkbox":`TCF は有効であり、この cmpId({{cmpId}}、バージョン {{cmpVersion}})を IAB Europe に登録済みです。`,"tcfRegistration.confirmButton":`登録を確認`,"tcfRegistration.refreshStatus":`ステータスを更新`,"tcfRegistration.loadError":`TCF登録ステータスを読み込めませんでした。`,"tcfRegistration.confirmError":`TCF登録を確認できませんでした。`,"gppRegistration.title":`GPP登録の再確認が必要です`,"gppRegistration.body":`compliance.gpp は cmpId {{cmpId}}(バージョン {{cmpVersion}})で有効になっていますが、この登録はまだ確認されていません — GPP は無効として扱われます:ウィジェットに window.__gpp は追加されず、同意記録に gppString も付与されません。`,"gppRegistration.checkbox":`GPP は有効であり、この cmpId({{cmpId}}、バージョン {{cmpVersion}})を登録済みです。`,"gppRegistration.confirmButton":`登録を確認`,"gppRegistration.loadError":`GPP登録ステータスを読み込めませんでした。`,"gppRegistration.confirmError":`GPP登録を確認できませんでした。`,_section_audit:`── 監査ログ ─────────────────────────────────────`,"audit.title":`監査ログ`,"audit.empty":`まだ監査イベントはありません。`,"audit.col.time":`時刻`,"audit.col.action":`操作`,"audit.col.resource":`リソース`,"audit.col.resourceId":`リソース ID`,"audit.col.actor":`実行者`,"audit.actor.system":`システム`,"audit.viewHistory":`比較`,"audit.searchPlaceholder":`アクション、リソース、実行者を検索…`,"audit.detail.title":`監査エントリ`,"audit.detail.oldData":`変更前データ`,"audit.detail.newData":`変更後データ`,_section_apiConfig:`── API 設定 ────────────────────────────────────`,"apiConfig.title":`API 設定`,"apiConfig.public.heading":`公開 API`,"apiConfig.public.about.text":`ウィジェットが同意の送信・管理に使用します。認証トークンはなく、下記の許可オリジンが唯一のアクセス制御です。`,"apiConfig.public.about.link":`consenti.dev で公開 API リファレンスを開く`,"apiConfig.admin.heading":`管理 API`,"apiConfig.admin.about.text":`これらのトークンを使用して、スクリプト、CI/CD、またはサーバーサイドの連携から Consenti 管理 API を呼び出せます。すべてのルート、リクエスト/レスポンスの形式、認証ヘッダーは consenti.dev で文書化されています。`,"apiConfig.admin.about.link":`consenti.dev で管理 API リファレンスを開く`,"apiConfig.endpoint.heading":`エンドポイント`,"apiConfig.endpoint.hint":`この環境の設定から解決されたベース URL です。`,"apiConfig.origins.heading":`許可オリジン`,"apiConfig.origins.hint":`これらのオリジンからのリクエストのみが受け付けられます。* を使用するとすべて許可できます(本番環境では非推奨)。`,"apiConfig.origins.publicNote":`公開 API には認証トークンがありません。このリストが唯一のアクセス制御です。`,"apiConfig.origins.adminNote":`Bearer トークン認証に加えた追加のレイヤーです。このダッシュボード自身のオリジン({{origin}})を含めないと、自分自身がアクセスできなくなる可能性があります。`,"apiConfig.origins.placeholder":`https://example.com`,"apiConfig.origins.empty":`オリジンが設定されていません。現在はすべてのオリジンが許可されています。`,"apiConfig.origins.errorDuplicate":`すでにリストにあります。`,"apiConfig.origins.errorSave":`保存に失敗しました。もう一度お試しください。`,"apiConfig.origins.remove":`削除`,"apiConfig.tokens.heading":`管理 API トークン`,"apiConfig.tokens.hint":`Consenti 管理 API へのサーバーサイドおよび CI/CD アクセス用の Bearer トークンです。Authorization: Bearer <token> として渡してください。クライアント側コードには絶対に公開しないでください。完全な管理権限を付与します。`,"apiConfig.tokens.created":`トークンが作成されました。今すぐコピーしてください。再表示されません。`,"apiConfig.tokens.placeholder":`トークン名(例: CI デプロイ)`,"apiConfig.tokens.empty":`まだトークンはありません。`,"apiConfig.tokens.errorName":`名前は必須です`,"apiConfig.tokens.errorCreate":`トークンの作成に失敗しました`,"apiConfig.tokens.col.name":`名前`,"apiConfig.tokens.col.status":`ステータス`,"apiConfig.tokens.col.created":`作成日時`,"apiConfig.tokens.status.active":`有効`,"apiConfig.tokens.status.revoked":`取り消し済み`,"apiConfig.tokens.status.expired":`Expired`,"apiConfig.tokens.col.expires":`Expires`,"apiConfig.tokens.expiresLabel":`Expires (optional)`,"apiConfig.tokens.expiresNever":`Never`,"apiConfig.tokens.dialog.title":`この API トークンを取り消しますか?`,"apiConfig.tokens.dialog.message":`このトークンを使用しているアプリケーションは、ただちにアクセス権を失います。`,"apiConfig.tokens.reactivate":`再有効化`,"apiConfig.tokens.deleteDialog.title":`この API トークンを完全に削除しますか?`,"apiConfig.tokens.deleteDialog.message":`トークンの記録が完全に削除され、元に戻すことはできません。再有効化もできなくなります。`,_section_settings:`── 設定 ────────────────────────────────────────`,"settings.title":`設定`,"settings.account.heading":`アカウント`,"settings.account.email":`メール:`,"settings.account.roles":`ロール:`,"settings.account.id":`ID:`,"settings.account.changePassword":`パスワードを変更`,"settings.export.heading":`データのエクスポート`,"settings.export.hint":`すべての同意記録または監査ログをダウンロードします。`,"settings.export.consentCsv":`同意 CSV`,"settings.export.consentXlsx":`同意 XLSX`,"settings.export.consentJson":`同意 JSON`,"settings.export.auditCsv":`監査 CSV`,"settings.about.heading":`概要`,"settings.about.text":`Consenti v0.1.0 — GDPRスタイルのオープンソース同意管理プラットフォーム。`,"settings.about.license":`Apache 2.0 ライセンス。`,_section_changePassword:`── パスワード変更 ─────────────────────────────`,"changePassword.title":`パスワード変更`,"changePassword.hint":`12文字以上の強力なパスワードを選んでください。`,"changePassword.success":`パスワードが正常に更新されました。`,"changePassword.newPassword":`新しいパスワード`,"changePassword.newPasswordPlaceholder":`12文字以上`,"changePassword.confirmPassword":`新しいパスワードを確認`,"changePassword.confirmPasswordPlaceholder":`新しいパスワードを再入力`,"changePassword.submit":`パスワードを更新`,"changePassword.submitting":`保存中…`,"changePassword.error.minLength":`パスワードは12文字以上である必要があります。`,"changePassword.error.mismatch":`パスワードが一致しません。`,"changePassword.error.failed":`パスワードの更新に失敗しました。`,"login.showPassword":`Show password`,"login.hidePassword":`Hide password`,"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":`パスワードをリセット`,"users.edit.resetPasswordHint":`(現在のパスワードを維持する場合は空欄のまま)`,"users.edit.newPassword":`新しいパスワード`,"users.edit.confirmNewPassword":`新しいパスワードの確認`,"users.edit.passwordTooShort":`パスワードは12文字以上である必要があります`,"users.superAdminLocked":`スーパー管理者アカウントは保護されており、編集または削除できません。`,"users.detail.title":`ユーザー`,"users.detail.allSites":`すべてのサイト`,"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.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 PDF receipt of their consent choices.`,"profileEditor.config.enhanceAccessibility":`アクセシビリティ強化`,"profileEditor.config.enhanceAccessibilityHint":`WCAG 2.1 AAのボタンサイズ(最小高さ44px)、フォーカスリング、スクリーンリーダーラベルを同意ウィジェットに適用します。`,"profileEditor.config.showFooterMetadata":`フッターメタデータを表示`,"profileEditor.config.showFooterMetadataHint":`バナーとモーダルに同意ID、日付、プロファイルバージョン、プライバシー設定へのリンクを表示します。`,"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":`ロケールコンテンツをコピー`,"profileEditor.content.copyLocaleTitle":`このセクションの内容を作成済みの別のロケールからコピーします`,"profileEditor.copyLocale.confirmTitle":`既存の内容を置き換えますか?`,"profileEditor.copyLocale.confirmMessage":`このセクションには{{locale}}に既に内容があります。{{source}}からコピーすると、それが削除されて完全に置き換えられます。`,"profileEditor.copyLocale.confirmAction":`置き換える`,_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.`,"consentTemplates.editor.gpcMandatoryTitle":`Mandatory cookies are never auto-denied by GPC`,"consentTemplates.editor.loadDefaultsBtn":`Click here to load default cookies list`,"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}}.
|
|
2
|
+
|
|
3
|
+
Saving will update cookie definitions for all profiles using this template. Continue?`,"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}}.
|
|
4
|
+
|
|
5
|
+
Saving will apply UI changes to all profiles using this template. Continue?`,"uiTemplates.editor.wizard.stepOf":`ステップ {{step}} / {{total}}`,"uiTemplates.editor.wizard.next":`次へ`,"uiTemplates.editor.wizard.back":`戻る`,"uiTemplates.editor.stackButtonsOnBreakpoint":`ボタンの縦積み幅 (px)`,"uiTemplates.editor.stackButtonsOnBreakpointHint":`この幅以下でボタンを縦に積み重ねます。0で無効化。デフォルト: 400。`,"uiTemplates.editor.trapFocus":`フォーカスを閉じ込める`,"uiTemplates.editor.trapFocusHint":`このバナーまたはモーダルが表示されている間、キーボードのTabフォーカスを同意ルート内に制限します。`,"uiTemplates.editor.showForgetMe":`🗑️「私を忘れて」ボタンを表示`,"uiTemplates.editor.showForgetMeHint":`同意の決定を既に保存している訪問者向けに、優先設定モーダルにセルフサービスの消去コントロールを追加します。GDPR第17条、CCPA/CPRA、LGPD第18条、UK GDPR、DPDPA、KVKK、POPIA、PDPA-TH、APPIの消去に相当する権利へのウィジェット側の入口です。APIのDELETE /consent/:visitorIdと同じエンドポイントで消去します。`,"uiTemplates.editor.fieldInfo.title":`フィールド解説`,"uiTemplates.editor.fieldInfo.headingTag.label":`見出しタグ`,"uiTemplates.editor.fieldInfo.headingTag.description":`バナーまたはモーダルのメイン見出しに使われるHTMLタグです。文書のアウトラインと、スクリーンリーダーがこの領域をどう読み上げるかを決めます。`,"uiTemplates.editor.fieldInfo.headingTag.highlights":`ページの見出し階層に合わせてh1〜h6を選び、レベルを飛ばさないようにしてください(例:ページのh1の直後にh4を使わない)。
|
|
6
|
+
見出しとして読み上げさせたくない場合は、div や p などのカスタムタグも指定できます。
|
|
7
|
+
メインバナー、GPCバナー、優先設定モーダルにそれぞれ個別に適用されます。`,"uiTemplates.editor.fieldInfo.style.label":`スタイル`,"uiTemplates.editor.fieldInfo.style.description":`ボタンの視覚的な強調度(プライマリー、セカンダリー、アクセント、テキスト)です。見た目だけの設定で、ボタンの動作は変わりません。`,"uiTemplates.editor.fieldInfo.style.highlights":`プライマリー:最も強調され、通常はメインの行動喚起(例:すべて同意)に使います。
|
|
8
|
+
セカンダリー:控えめな強調で、テーマに合わせたニュートラルな背景色です。代替の選択肢(例:設定を管理)に使います。
|
|
9
|
+
アクセント:プライマリー/セカンダリーとは別の、独立した強調色です。カスタムのアクセントカラーを設定しない限り既定では赤になるため、「すべて拒否」のような強い訴求に使うことを想定しています。
|
|
10
|
+
テキスト:リンクのような最小限のスタイルです。アクションが「リンク」のボタンは自動的にこのスタイルになります。`,"uiTemplates.editor.fieldInfo.action.label":`アクション`,"uiTemplates.editor.fieldInfo.action.description":`訪問者がこのボタンをクリックしたときに起こる動作です。`,"uiTemplates.editor.fieldInfo.action.highlights":`カスタム:下で選択したCookieを許可または拒否します(すべて同意/すべて拒否/選択した項目に同意、で使用)。
|
|
11
|
+
送信:優先設定モーダルで訪問者が設定したトグルを保存します。
|
|
12
|
+
管理:バナーのボタンから優先設定モーダルを開きます。
|
|
13
|
+
閉じる:同意内容を変更せずにバナーまたはモーダルを閉じます。
|
|
14
|
+
リンク:外部URL(例:プライバシーポリシー)を開きます。デフォルトでテキストスタイルになります。`,"uiTemplates.editor.fieldInfo.cookies.label":`許可/拒否するCookie`,"uiTemplates.editor.fieldInfo.cookies.description":`このカスタムアクションのボタンをクリックしたときに、どのCookie目的を許可または拒否するかです。`,"uiTemplates.editor.fieldInfo.cookies.highlights":`アクションが「カスタム」の場合は必須です。
|
|
15
|
+
定義済みのすべてのCookie目的を対象にするには * を使用します(例:すべて同意/すべて拒否)。
|
|
16
|
+
特定の目的のみを選択すれば、「アナリティクスのみ同意」のような部分同意ボタンも作成できます。`,"uiTemplates.editor.fieldInfo.trapFocus.label":`フォーカスを閉じ込める`,"uiTemplates.editor.fieldInfo.trapFocus.description":`このバナーまたはモーダルが表示されている間、キーボードのTabフォーカスを同意ルート内に制限します。`,"uiTemplates.editor.fieldInfo.trapFocus.highlights":`Tab/Shift+Tabでフォーカスがオーバーレイの背後に隠れたページ内容へ移動するのを防ぎます。
|
|
17
|
+
モーダルや、オーバーレイのあるバナーには推奨設定です。キーボードやスクリーンリーダーの利用者が操作できない内容にフォーカスが移らないようにします。
|
|
18
|
+
オーバーレイのない非ブロッキングなバナーでは不要です。`,"uiTemplates.editor.fieldInfo.buttonId.label":`ボタンID`,"uiTemplates.editor.fieldInfo.buttonId.description":`このボタンの一意な機械可読識別子です(例:accept-all、reject-all)。`,"uiTemplates.editor.fieldInfo.buttonId.highlights":`画面に表示されるテキストではありません。表示ラベルはプロファイルのコンテンツ設定手順でロケールごとに入力します。
|
|
19
|
+
同じセクション(メインバナー、GPCバナー、優先設定モーダル)内で一意である必要があります。各セクションは同時に表示されないため、セクションをまたいで同じIDを再利用しても問題ありません。
|
|
20
|
+
同意ログや分析で、訪問者がどのボタンをクリックしたかを識別するために使われます。`,"uiTemplates.editor.fieldInfo.localeSwitcher.label":`言語切り替えを表示`,"uiTemplates.editor.fieldInfo.localeSwitcher.description":`このバナーまたはモーダルに言語切り替えのドロップダウンを表示し、訪問者が同意フローを離れずに言語を変更できるようにします。`,"uiTemplates.editor.fieldInfo.localeSwitcher.highlights":`プロファイルのコンテンツ設定手順で複数の言語が設定されている場合にのみ有効です。
|
|
21
|
+
メインバナー、GPCバナー、優先設定モーダルでそれぞれ個別に切り替えられます。`,"uiTemplates.editor.fieldInfo.forgetMe.label":`私を忘れて`,"uiTemplates.editor.fieldInfo.forgetMe.description":`優先設定モーダルのカテゴリー下にボタンを表示し、再訪問者がサイトの他の場所にリンクを用意しなくても、保存された同意記録を消去できるようにします。`,"uiTemplates.editor.fieldInfo.forgetMe.highlights":`既に同意の決定を保存している訪問者にのみ表示されます。それ以外は消去する対象がありません。
|
|
22
|
+
widget.deleteConsent()/reConsent()と同じDELETE /consent/:visitorIdエンドポイントで消去します。
|
|
23
|
+
ボタンのラベルはここではなく、プロファイルのコンテンツ設定手順でロケールごとに作成します。
|
|
24
|
+
実行前にconsenti:forgetMeRequestedを、実行後にconsenti:forgottenを発火します。ホストアプリはこれらを利用して、他システムにまたがる独自の本人確認済み消去フローを実行できます。
|
|
25
|
+
優先設定モーダル専用です。メインバナーやGPCバナーには相当する機能はありません。`,_section_howItWorks:`── Consientiの使い方 ─────────────────────────────────`,"nav.howItWorks":`Consientiの使い方`,"howItWorks.title":`Consientiの使い方`,"howItWorks.intro":`ConsientiはオープンソースのGDPRスタイル同意管理プラットフォームです。ウェブサイトのCookie同意の収集・保存・レポートを管理します。このガイドでは主なワークフローと各ダッシュボードセクションについて説明します。`,"howItWorks.workflow.heading":`基本ワークフロー`,"howItWorks.workflow.step1.title":`Cookieカテゴリを定義する`,"howItWorks.workflow.step1.desc":`同意バナー → Cookieテンプレートに移動し、サイトで使用するCookieカテゴリ(例:アナリティクス、マーケティング)を一覧にしたテンプレートを作成します。各カテゴリの法的根拠と有効期限を設定します。`,"howItWorks.workflow.step2.title":`同意UIをデザインする`,"howItWorks.workflow.step2.desc":`同意バナー → UIテンプレートに移動し、バナーと設定モーダルの視覚的レイアウトを設定します。ボタンラベル、カラー、レイアウトスタイル、カテゴリ表示を構成します。`,"howItWorks.workflow.step3.title":`同意プロファイルを作成する`,"howItWorks.workflow.step3.desc":`同意バナー → プロファイルに移動し、CookieテンプレートとUIテンプレートを組み合わせます。サポートするロケールごとに翻訳テキストを追加し、必要な規制(GDPR、CCPA、DPDPA)を有効にして公開します。`,"howItWorks.workflow.step4.title":`ウィジェットを埋め込む`,"howItWorks.workflow.step4.desc":`API → 設定からAPIキーをコピーし、ConsientiのスクリプトタグをウェブサイトのHTMLに追加します。ウィジェットが公開済みプロファイルを取得し、同意バナーを自動表示します。`,"howItWorks.workflow.step5.title":`監視と監査`,"howItWorks.workflow.step5.desc":`同意一覧と訪問者ページでリアルタイムの同意記録を確認します。監査ログで全管理操作の改ざん不可能な履歴をコンプライアンス証拠として確認できます。`,"howItWorks.features.heading":`ダッシュボード機能`,"howItWorks.features.dashboard.title":`ダッシュボード`,"howItWorks.features.dashboard.desc":`ホーム画面にリアルタイムKPI(同意総数、承認率、拒否率、時系列グラフ)が表示されます。トレンド把握やバナー変更の効果測定にご利用ください。`,"howItWorks.features.reports.title":`レポート`,"howItWorks.features.reports.desc":`期間ごとのオプトイン推移に加え、カテゴリ・ロケール別の内訳(許可/拒否/異議)を表示します。stats:view権限が必要です。`,"howItWorks.features.consentTemplates.title":`Cookieテンプレート`,"howItWorks.features.consentTemplates.desc":`Cookieカテゴリの再利用可能なリストです。各カテゴリにはID、法的根拠(同意、正当な利益、必要)、GPC信号処理、有効期限、オプションのTCFベンダーまたはCPRAカテゴリマッピングがあります。`,"howItWorks.features.uiTemplates.title":`UIテンプレート`,"howItWorks.features.uiTemplates.desc":`同意バナー、GPC通知、設定モーダルの外観を制御します。ボタンセット、見出しタグ、オーバーレイ不透明度、カテゴリ表示順序を設定できます。`,"howItWorks.features.profiles.title":`プロファイル`,"howItWorks.features.profiles.desc":`プロファイルはデプロイ可能な単位です。CookieテンプレートとUIテンプレートを結合し、多言語コンテンツを保存し、ロールバック用のバージョン番号を追跡します。ドメインごとに1つのプロファイルのみアクティブにできます。`,"howItWorks.features.consents.title":`同意一覧`,"howItWorks.features.consents.desc":`訪問者が送信した全同意記録の検索・フィルタリング可能なログです。各記録には訪問者ID、使用プロファイル、ロケール、GPC信号、同意選択、タイムスタンプが表示されます。`,"howItWorks.features.visitors.title":`訪問者`,"howItWorks.features.visitors.desc":`サイト全体のユニーク訪問者識別子のリストで、国、初回閲覧日、最終閲覧日が含まれます。訪問者IDはIPアドレスを保存しない仮名UUIDです。`,"howItWorks.features.users.title":`ユーザー`,"howItWorks.features.users.desc":`ダッシュボードにログインできる管理者アカウントを管理します。ロールの割り当て、アカウントの有効化・無効化、マルチテナント環境での特定サイトへのユーザー制限が行えます。`,"howItWorks.features.roles.title":`ロール`,"howItWorks.features.roles.desc":`名前付き権限セット(例:閲覧者、編集者、管理者)を定義します。consent:view、profile:edit、audit:viewなどの細かい権限を各ロールに割り当て、ユーザーにロールを付与します。`,"howItWorks.features.vendors.title":`ベンダー`,"howItWorks.features.vendors.desc":`IABグローバルベンダーリスト(GVL)を参照して、TCFベンダーID、宣言された目的、正当な利益の目的を調べます。テンプレートのCookieカテゴリ設定時にこれらのIDを使用します。`,"howItWorks.features.audit.title":`監査ログ`,"howItWorks.features.audit.desc":`プロファイル保存、ユーザー変更、APIキー作成など全管理操作の追記専用・改ざん不可能なログです。GDPRの説明責任義務に必要です。`,"howItWorks.features.api.title":`APIとキー`,"howItWorks.features.api.desc":`APIトークンの生成・失効、公開同意APIの許可CORSオリジン設定、インタラクティブなOpenAPIリファレンスによる各エンドポイントの確認が行えます。`,"howItWorks.features.settings.title":`設定`,"howItWorks.features.settings.desc":`アカウント情報の確認、パスワード変更、同意・監査データのCSV・XLSX・JSON形式でのエクスポート(オフライン分析や規制当局への提出用)が行えます。`,"howItWorks.docs.heading":`詳細ドキュメント`,"howItWorks.docs.text":`詳細なガイド、設定リファレンス、インテグレーション例、ライブプレイグラウンドはConsientiドキュメントサイトでご覧いただけます。`,"howItWorks.docs.link":`consenti.dev/docs を開く →`,"howItWorks.consentFlow.heading":`エンドツーエンドの同意フロー`,"howItWorks.consentFlow.step1.title":`ウィジェットの初期化`,"howItWorks.consentFlow.step1.desc":`Consentiスクリプトが訪問者のブラウザに読み込まれ、設定(APIキー、compliance.type)を読み取ります。有効期限内の同意クッキーがすでに存在する場合、ウィジェットはサイレントに終了し、バナーは表示されません。`,"howItWorks.consentFlow.step2.title":`管轄の検出`,"howItWorks.consentFlow.step2.desc":`compliance.typeが'auto'の場合、ウィジェットはGET /resolve-profileを呼び出し、訪問者のタイムゾーン、Accept-Languageヘッダー、IPアドレスを送信します。サーバーはこれらのシグナルを、組み込みの国→コンプライアンスマップを使用してcomplianceGroupにマッピングします。`,"howItWorks.consentFlow.step3.title":`プロファイルの取得`,"howItWorks.consentFlow.step3.desc":`ウィジェットは、解決されたcomplianceGroupと訪問者のロケールに対応するアクティブなプロファイルを取得します。レスポンスは、バナーテキスト、クッキーカテゴリ、UI設定、規制フラグをすべて含むフラットなJSONオブジェクトです。`,"howItWorks.consentFlow.step4.title":`バナーの表示`,"howItWorks.consentFlow.step4.desc":`ウィジェットはプロファイルのUIテンプレートに基づいてバナーまたは設定モーダルをレンダリングします。必須カテゴリは事前にチェックされており、選択を解除できません。オプションカテゴリは法的根拠(同意または正当な利益)を表示します。`,"howItWorks.consentFlow.step5.title":`同意の送信`,"howItWorks.consentFlow.step5.desc":`訪問者が操作(すべて承認、すべて拒否、または設定を保存)した際、ウィジェットはAPIに同意レコードをPOSTします。レコードには訪問者ID、プロファイルバージョン、カテゴリごとのステータス(granted/denied/objected)、GPCシグナル、タイムスタンプ、ロケールが含まれます。`,"howItWorks.consentFlow.step6.title":`保存と監査`,"howItWorks.consentFlow.step6.desc":`APIはペイロードを検証し、同意レコードを保存して、追記専用の監査ログにエントリを追加します。訪問者レコードは国と最初/最後のアクセス日時でアップサートされます。ウィジェットは同意クッキーを書き込み、以降の訪問でバナーをスキップします。`,"howItWorks.profileResolution.heading":`プロファイル解決アルゴリズム`,"howItWorks.profileResolution.intro":`訪問者が訪れると、Consentiは5つのステップで表示する同意プロファイルを解決します。`,"howItWorks.profileResolution.step1.title":`地理シグナルの収集`,"howItWorks.profileResolution.step1.desc":`ウィジェットはGET /resolve-profileに3つのシグナルを送信します:ブラウザのIntl.DateTimeFormatタイムゾーン、Accept-Languageヘッダー(またはlangクエリパラメータ)、サーバーサイドのIPアドレス。`,"howItWorks.profileResolution.step2.title":`国の特定`,"howItWorks.profileResolution.step2.desc":`サーバーは順番に試みます:(1) 設定されたgeoDataProviderによるIPジオロケーション;(2) タイムゾーン→国のルックアップテーブル;(3) 言語タグ→国のヒューリスティック(例:'ja' → JP)。最初の非空の結果が採用されます。`,"howItWorks.profileResolution.step3.title":`コンプライアンスグループのマッピング`,"howItWorks.profileResolution.step3.desc":`ISO-3166-1 alpha-2の国コード(オプションの地域/州コード付き)が、埋め込みの国→コンプライアンスグループマップで検索されます。地域オーバーライド(例:US/CA → optOutCalifornia)は国のデフォルトより優先されます。`,"howItWorks.profileResolution.step4.title":`アクティブなプロファイルの特定`,"howItWorks.profileResolution.step4.desc":`システムは、解決されたグループに一致するcomplianceGroupを持つアクティブなプロファイルをデータベースで検索します。complianceGroupごとにアクティブにできるプロファイルは1つだけです。存在しない場合は404が返され、ウィジェットはprofileOverrideにフォールバックする場合があります。`,"howItWorks.profileResolution.step5.title":`ロケールの解決`,"howItWorks.profileResolution.step5.desc":`最適なロケールは以下の順で選択されます:(1) ウィジェットのリクエストロケールとの完全一致;(2) 言語プレフィックスの一致(例:'ja-JP' → 'ja');(3) プロバイダーから解決されたロケール;(4) プロファイルのdefaultLocale。解決されたJSONは静的ファイル(公開済みプロファイル)またはデータベースから直接(プレビュー)提供されます。`,"howItWorks.complianceGroups.heading":`コンプライアンスグループ`,"howItWorks.complianceGroups.intro":`世界のすべての国が8つのコンプライアンスグループのいずれかにマッピングされています。各グループはウィジェットが従うべき同意モデルを決定します。`,"howItWorks.complianceGroups.optIn.title":`optIn — GDPR / ePrivacy 厳格なオプトイン`,"howItWorks.complianceGroups.optIn.desc":`非必須クッキーを設定する前に事前の同意が必要です。訪問者は拒否する本物の選択肢を与えられなければならず、同意の撤回は同意と同じくらい簡単でなければならず、カテゴリ単位の詳細な選択が必須です。`,"howItWorks.complianceGroups.optIn.laws":`GDPR、ePrivacy指令、UK GDPR、PECR、revFADP(スイス)、KVKK(トルコ)、PDPA(タイ)、その他の厳格な国内法`,"howItWorks.complianceGroups.optIn.countries":`全EUメンバー国、英国、スイス、トルコ、タイ、アイスランド、リヒテンシュタイン、ノルウェー、ガーンジー、ジブラルタル、その他ePrivacy規則が厳格な国々`,"howItWorks.complianceGroups.optInDPDPA.title":`optInDPDPA — インドDPDPA`,"howItWorks.complianceGroups.optInDPDPA.desc":`インドの2023年デジタル個人データ保護法は明示的なオプトイン同意を要求します。追加義務:データ受託者の指名、専用の同意通知の提供、データ主体の権利のサポート。プロファイルにdpdpaDataFiduciaryフィールドを設定してください。`,"howItWorks.complianceGroups.optInDPDPA.laws":`デジタル個人データ保護法2023(DPDPA)`,"howItWorks.complianceGroups.optInDPDPA.countries":`インド(IN)`,"howItWorks.complianceGroups.optInChina.title":`optInChina — 中国マルチ法スタック`,"howItWorks.complianceGroups.optInChina.desc":`中国のデータガバナンスはPIPL下での明示的な同意に加え、データセキュリティ法(DSL)とサイバーセキュリティ法(CSL)からの義務を組み合わせています。越境データ転送とデータ分類に関する追加要件が適用されます。`,"howItWorks.complianceGroups.optInChina.laws":`個人情報保護法(PIPL)、データセキュリティ法(DSL)、サイバーセキュリティ法(CSL)`,"howItWorks.complianceGroups.optInChina.countries":`中国(CN)`,"howItWorks.complianceGroups.optOutCalifornia.title":`optOutCalifornia — カリフォルニアCCPA / CPRA`,"howItWorks.complianceGroups.optOutCalifornia.desc":`デフォルトでデータを収集できますが、消費者には個人情報の販売または共有の明確なオプトアウト選択肢を提供する必要があります。グローバルプライバシーコントロール(GPC)ブラウザシグナルは有効なオプトアウトとして尊重されなければなりません。`,"howItWorks.complianceGroups.optOutCalifornia.laws":`CCPA、CPRA(カリフォルニア消費者プライバシー法 / カリフォルニアプライバシー権利法)`,"howItWorks.complianceGroups.optOutCalifornia.countries":`アメリカ合衆国 — カリフォルニア(US/CA)`,"howItWorks.complianceGroups.optOutUSState.title":`optOutUSState — その他の米国州法`,"howItWorks.complianceGroups.optOutUSState.desc":`カリフォルニアのオプトアウトフレームワークをモデルにしています。消費者はターゲット広告と個人データの販売をオプトアウトできます。いくつかの州ではGPCシグナルを尊重することが必要です。`,"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":`アメリカ合衆国 — VA、CO、CT、UT、TX、DE、NJ、OR、MN、MD、KY、TN、NE、IA、IN、MT、NH、RI`,"howItWorks.complianceGroups.generalPrivacyConsent.title":`generalPrivacyConsent — 一般プライバシー / 同意`,"howItWorks.complianceGroups.generalPrivacyConsent.desc":`一般的なプライバシー法が適用されますが、PECR/ePrivacy方式の厳格なクッキーバナー要件は課されません。非必須クッキーの同意選択肢と明確なプライバシー通知を提供することがベストプラクティスですが、法的な閾値はGDPRオプトインより低いです。`,"howItWorks.complianceGroups.generalPrivacyConsent.laws":`PIPEDA / 法律25(CA)、LGPD(BR — hybridBrazilを使用)、POPIA(ZA)、APPI(JP)、プライバシー法(AU/NZ)、PDPA-SG、PDPA-MY、PIPA-KR、PDPD-VN、DPA-PH、PDP-IDなど`,"howItWorks.complianceGroups.generalPrivacyConsent.countries":`カナダ、オーストラリア、ニュージーランド、日本、韓国、シンガポール、マレーシア、南アフリカ、ならびに多くのラテンアメリカ、アフリカ、アジアの国々`,"howItWorks.complianceGroups.hybridBrazil.title":`hybridBrazil — ブラジルLGPD`,"howItWorks.complianceGroups.hybridBrazil.desc":`ブラジルのLGPDはGDPRと概ね類似していますが、データ管理者の評価によっては分析・広告クッキーを正当な利益の法的根拠として扱うことができます。バナーは表示されますが、カテゴリレベルの法的根拠は厳格なGDPRオプトインより柔軟に設定できます。`,"howItWorks.complianceGroups.hybridBrazil.laws":`Lei Geral de Proteção de Dados (LGPD)`,"howItWorks.complianceGroups.hybridBrazil.countries":`ブラジル(BR)`,"howItWorks.complianceGroups.noticeOnly.title":`noticeOnly — プライバシー通知のみ`,"howItWorks.complianceGroups.noticeOnly.desc":`専用のクッキー規制が適用されないか、既存の制度がプライバシー通知のみを要求しています(オプトインまたはオプトアウトバナー不要)。同意バナーの表示は透明性のためにも推奨されますが、法律で厳密には義務付けられていません。`,"howItWorks.complianceGroups.noticeOnly.laws":`様々 — 専用のクッキー/ePrivacy規制のない国々`,"howItWorks.complianceGroups.noticeOnly.countries":`上記のグループに含まれないアフリカ、中央アジア、カリブ海、太平洋地域の多くの国々`,"howItWorks.enums.heading":`主要値リファレンス`,"howItWorks.enums.legalBasis.heading":`legalBasis(クッキーカテゴリ)`,"howItWorks.enums.legalBasis.mandatory":`mandatory — 同意に関わらずカテゴリは常にアクティブです(例:セッション、認証)。GPCやオプトアウトシグナルによってブロックされることはありません。`,"howItWorks.enums.legalBasis.consent":`consent — 訪問者の明示的なオプトインが必要です。デフォルトでブロック;すべてのオプトイン管轄でGPCによりブロック。`,"howItWorks.enums.legalBasis.legitimateInterest":`legitimate_interest — 管理者の正当な利益に基づきます。デフォルトでアクティブ;訪問者は異議を申し立てることができます。一部の管轄(EU、UK)ではGPCによりソフトブロック。`,"howItWorks.enums.consentStatus.heading":`ConsentStatus(カテゴリレコードごと)`,"howItWorks.enums.consentStatus.granted":`granted — 訪問者がこのカテゴリに明示的に同意しました。`,"howItWorks.enums.consentStatus.denied":`denied — 訪問者がこのカテゴリへの同意を明示的に拒否しました。`,"howItWorks.enums.consentStatus.objected":`objected — 訪問者が正当な利益カテゴリに異議を申し立てました(オプトアウト。同意の拒否ではありません)。`,"howItWorks.enums.geoProvider.heading":`geoDataProviderのオプション`,"howItWorks.enums.geoProvider.default":`default / timezone — ブラウザのタイムゾーン(Intl.DateTimeFormat)を使用して国を推定し、Accept-Languageにフォールバックします。追加依存関係なし。`,"howItWorks.enums.geoProvider.language":`language — Accept-Languageヘッダーのみから国を導出します(例:'ja' → JP、'pt' → BR)。高速ですが精度が低いです。`,"howItWorks.enums.geoProvider.geoip":`geoip — バンドルされたMaxMind Liteデータベースとともにnpmパッケージgeoip-liteを使用します。必要:npm install geoip-lite。`,"howItWorks.enums.geoProvider.hostedGeoipLite":`hosted-geoip-lite — 組み込みのHTTPS経由でipinfo.ioを呼び出します(追加依存関係なし)。初回訪問ごとに約50〜200ミリ秒追加されます。`,"howItWorks.enums.geoProvider.maxmind":`maxmind — ローカルのGeoLite2-City.mmdbファイルとともにnpmパッケージmaxmindを使用します。最も正確。MAXMIND_DB_PATH環境変数とnpm install maxmindが必要。`,"howItWorks.enums.geoProvider.custom":`カスタム関数 — CountryResolverFnをcompliance.geoDataProviderに渡して、任意のGeo-IPまたはCDNプロバイダーを統合します。`,"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.`,"cookieTemplates.editor.trackerDetected":`検出: {{vendor}}`,"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":`「私を忘れて」ボタン`,"profileEditor.content.forgetMeHint":`リンクされたUIテンプレートの優先設定モーダル手順で「『私を忘れて』ボタンを表示」が有効な場合に、優先設定モーダルのカテゴリー下に表示されます。`,"profileEditor.content.forgetMeLabel":`ボタンラベル`,"profileEditor.content.ageGateModal.heading":`年齢確認ダイアログ`,"profileEditor.content.ageGateModal.headingPlaceholder":`あなたは16歳以上ですか?`,"profileEditor.content.ageGateModal.bodyText":`本文`,"profileEditor.content.ageGateModal.bodyPlaceholder":`Cookie設定を表示する前に年齢をご確認ください。`,"profileEditor.content.ageGateModal.confirmButtonLabel":`「はい」ボタンのラベル`,"profileEditor.content.ageGateModal.confirmButtonPlaceholder":`はい`,"profileEditor.content.ageGateModal.denyButtonLabel":`「いいえ」ボタンのラベル`,"profileEditor.content.ageGateModal.denyButtonPlaceholder":`いいえ`,"profileEditor.content.ageGateModal.parentalConsent.heading":`保護者同意メッセージ`,"profileEditor.content.ageGateModal.parentalConsent.headingPlaceholder":`保護者の同意が必要です`,"profileEditor.content.ageGateModal.parentalConsent.bodyText":`本文`,"profileEditor.content.ageGateModal.parentalConsent.bodyPlaceholder":`保護者が同意を確認するまで、厳密に必要なCookieのみが使用されます。`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonLabel":`「OK」ボタンのラベル`,"profileEditor.content.ageGateModal.parentalConsent.confirmButtonPlaceholder":`OK`,"profileEditor.content.ageGateModal.loadDefaultsTitle":`この言語向けの汎用デフォルトテキストでこのセクションを埋める`,"profileEditor.error.missingRequiredContent":`ロケール「{{locale}}」の必須コンテンツが不足しています。ハイライトされたタブをご確認ください。`,"profileEditor.error.saveFailedMoreFields":`(他に{{count}}件のフィールドに対応が必要です)`,"profileEditor.nudge.title":`任意項目が空白です`,"profileEditor.nudge.headingBlank":`見出しが空白のままです。訪問者には見出しなしでバナーが表示されます。`,"profileEditor.nudge.introBlank":`導入テキストが空白のままです。訪問者には説明なしで設定パネルが表示されます。`,"profileEditor.nudge.addNow":`今追加する`,"profileEditor.nudge.ignore":`無視する`,"profiles.error.delete":`プロファイルの削除に失敗しました。`};export{e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as e}from"./client-CYntrO2g.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{
|
|
1
|
+
import{a as e}from"./client-CYntrO2g.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-DAiYBrnd.js";var t=e(`rotate-ccw-clock`,[[`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`}]]);export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-DAiYBrnd.js";var t=e(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]);export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){let t={};for(let n of e)t[n.id]={...n.purpose===void 0?{}:{purpose:n.purpose},listenGpc:n.listenGpc,...n.preGrant===void 0?{}:{preGrant:n.preGrant},...n.tcfVendorId===void 0?{}:{tcfVendorId:n.tcfVendorId},...n.tcfPurposes===void 0?{}:{tcfPurposes:n.tcfPurposes},...n.cpraCategory===void 0?{}:{cpraCategory:n.cpraCategory}};return t}function t(e){return Object.entries(e).map(([e,t])=>({id:e,listenGpc:!1,...t}))}function n(e){let t={};for(let{id:n,headingTag:r,legalBasis:i,cookies:a}of e)t[n]={heading:n,htmlText:``,headingTag:r,legalBasis:i,cookies:a};return t}function r(e){return Object.entries(e).map(([e,t])=>({id:e,headingTag:t.headingTag??`h3`,legalBasis:t.legalBasis,cookies:t.cookies}))}function i(e){let t={};for(let{id:n,type:r,action:i,cookies:a,url:o}of e)t[n]={type:r,action:i,...a===void 0?{}:{cookies:a},...o===void 0?{}:{url:o}};return t}function a(e){return Object.entries(e).map(([e,t])=>({id:e,type:t.type??`primary`,action:t.action,...t.cookies===void 0?{}:{cookies:t.cookies},...t.url===void 0?{}:{url:t.url}}))}function o(){return[{id:`security_storage`,purpose:`necessary`,listenGpc:!1},{id:`functionality_storage`,purpose:`functional`,listenGpc:!1},{id:`personalization_storage`,purpose:`preferences`,listenGpc:!1},{id:`analytics_storage`,purpose:`analytics`,listenGpc:!0},{id:`ad_storage`,purpose:`marketing`,listenGpc:!0,cpraCategory:`sharing`},{id:`ad_user_data`,purpose:`marketing`,listenGpc:!0,cpraCategory:`sale`},{id:`ad_personalization`,purpose:`marketing`,listenGpc:!0,cpraCategory:`sharing`}]}function s(){return[{id:`necessary`,headingTag:`h3`,legalBasis:`mandatory`,cookies:[`security_storage`]},{id:`functional`,headingTag:`h3`,legalBasis:`legitimate_interest`,cookies:[`functionality_storage`,`personalization_storage`]},{id:`analytics`,headingTag:`h3`,legalBasis:`consent`,cookies:[`analytics_storage`]},{id:`marketing`,headingTag:`h3`,legalBasis:`consent`,cookies:[`ad_storage`,`ad_user_data`,`ad_personalization`]}]}function c(){return{mainBanner:{position:`bottom`,overlayOpacity:0,showClose:!1,headingTag:`h2`,buttons:[{id:`accept-all`,type:`primary`,action:`custom`,cookies:`*`},{id:`reject-optional`,type:`primary`,action:`custom`,cookies:`!`},{id:`customize`,type:`secondary`,action:`manage`}]},gpcBanner:{position:`bottom`,overlayOpacity:0,showClose:!1,headingTag:`h2`,buttons:[{id:`accept-all`,type:`primary`,action:`custom`,cookies:`*`},{id:`continue-with-gpc`,type:`accent`,action:`custom`,cookies:`!`}]},preferenceModal:{position:`right`,overlayOpacity:50,showClose:!0,persistent:!1,headingTag:`h2`,hasSubheading:!0,buttons:[{id:`save-preferences`,type:`primary`,action:`submit`},{id:`accept-all`,type:`secondary`,action:`custom`,cookies:`*`}],showForgetMe:!0}}}var l={"accept-all":`Accept All`,"reject-optional":`Reject Optional`,customize:`Customize`,"continue-with-gpc":`Continue with GPC`,"save-preferences":`Save Preferences`};function u(e){return l[e]??e.split(`-`).filter(Boolean).map(e=>e[0].toUpperCase()+e.slice(1)).join(` `)}var d=`Sample heading text`,f=`This is sample description text, this text and <b>above heading</b> can be configured in the profile editor`;function p(e){let t={};for(let n of e)t[n.id]=u(n.id);return t}function m(e,t){let n={necessary:{heading:`Necessary`,htmlText:`Essential cookies required for the website to function properly. These cannot be disabled.`},functional:{heading:`Functional`,htmlText:`Cookies for optional features and remembering your preferences. The site works without them.`},analytics:{heading:`Analytics`,htmlText:`Cookies that help us understand how visitors interact with our website.`},marketing:{heading:`Marketing`,htmlText:`Cookies used for advertising and tracking across websites.`}};return{mainBanner:{heading:d,htmlText:f,buttonLabels:t?p(t.mainBanner.buttons):{}},gpcBanner:{heading:d,htmlText:f,buttonLabels:t?p(t.gpcBanner.buttons):{}},preferenceModal:{heading:d,subheading:f,htmlText:``,buttonLabels:t?p(t.preferenceModal.buttons):{},categories:e.map(e=>({id:e.id,heading:n[e.id]?.heading??e.id,htmlText:n[e.id]?.htmlText??``})),receiptLabel:`Get a copy of my consent choices (JSON)`,receiptDescription:`A JSON file will be downloaded to your device when you save your preferences.`,forgetMeLabel:`Forget me`}}}function h(e,t){let n={};for(let r of e)n[r.id]={text:t[r.id]||``,style:r.type,action:r.action,...r.cookies===void 0?{}:{cookies:r.cookies},...r.url===void 0?{}:{url:r.url}};return n}function g(t,n,r,i,a,o,s,c,l,u){let d={};for(let[e,t]of Object.entries(a))d[e]={mainBanner:{position:r.mainBanner.position,overlayOpacity:r.mainBanner.overlayOpacity,showClose:r.mainBanner.showClose,...r.mainBanner.showLocaleSwitcher?{showLocaleSwitcher:!0}:{},headingTag:r.mainBanner.headingTag,heading:t.mainBanner.heading,htmlText:t.mainBanner.htmlText,buttons:h(r.mainBanner.buttons,t.mainBanner.buttonLabels)},gpcBanner:{position:r.gpcBanner.position,overlayOpacity:r.gpcBanner.overlayOpacity,showClose:r.gpcBanner.showClose,...r.gpcBanner.showLocaleSwitcher?{showLocaleSwitcher:!0}:{},headingTag:r.gpcBanner.headingTag,heading:t.gpcBanner.heading,htmlText:t.gpcBanner.htmlText,buttons:h(r.gpcBanner.buttons,t.gpcBanner.buttonLabels)},preferenceModal:{position:r.preferenceModal.position,overlayOpacity:r.preferenceModal.overlayOpacity,showClose:r.preferenceModal.showClose,...r.preferenceModal.showLocaleSwitcher?{showLocaleSwitcher:!0}:{},...r.preferenceModal.showForgetMe?{showForgetMe:!0}:{},persistent:r.preferenceModal.persistent,headingTag:r.preferenceModal.headingTag,heading:t.preferenceModal.heading,...r.preferenceModal.hasSubheading&&t.preferenceModal.subheading?{subheading:t.preferenceModal.subheading}:{},...t.preferenceModal.htmlText?{htmlText:t.preferenceModal.htmlText}:{},...t.preferenceModal.receiptLabel?{receiptLabel:t.preferenceModal.receiptLabel}:{},...t.preferenceModal.receiptDescription?{receiptDescription:t.preferenceModal.receiptDescription}:{},...t.preferenceModal.forgetMeLabel?{forgetMeLabel:t.preferenceModal.forgetMeLabel}:{},buttons:h(r.preferenceModal.buttons,t.preferenceModal.buttonLabels),categories:Object.fromEntries(n.map(e=>{let n=t.preferenceModal.categories.find(t=>t.id===e.id);return[e.id,{heading:n?.heading??e.id,headingTag:e.headingTag,htmlText:n?.htmlText??``,legalBasis:e.legalBasis,...e.legalBasis===`legitimate_interest`&&n?.legitimateInterestDescription?{legitimateInterestDescription:n.legitimateInterestDescription}:{},cookies:e.cookies}]}))}};return{_meta:o,cookies:e(t),defaultLocale:i,...s===void 0?{}:{expiryDays:s},translations:d,...c&&c.length>0?{allowedOrigins:c}:{},...l&&l.length>0?{regulations:l}:{},...u?{dpdpa:u}:{}}}export{g as a,s as c,c as d,a as f,n as i,o as l,t as m,d as n,e as o,r as p,i as r,u as s,f as t,m as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as e}from"./client-CYntrO2g.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{t as e}from"./createLucideIcon-
|
|
1
|
+
import{t as e}from"./createLucideIcon-DAiYBrnd.js";var t=e(`trash-2`,[[`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`}]]);export{t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-
|
|
1
|
+
import{t as e}from"./createLucideIcon-DAiYBrnd.js";var t=e(`square-pen`,[[`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`}]]),n=e(`trash`,[[`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`}]]);export{t as n,n as t};
|