@semiont/cli 0.4.18 → 0.4.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/cli.mjs +14 -42
  2. package/dist/frontend/dist/assets/{CookiePreferences-ebe4eB-e.js → CookiePreferences-BBb5XMuG.js} +2 -2
  3. package/dist/frontend/dist/assets/{CookiePreferences-ebe4eB-e.js.map → CookiePreferences-BBb5XMuG.js.map} +1 -1
  4. package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CHDCGQBR-BGx2owZ0.js → PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js} +2 -2
  5. package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-CHDCGQBR-BGx2owZ0.js.map → PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js.map} +1 -1
  6. package/dist/frontend/dist/assets/ToolbarPanels-CfaOVIc9.js +2 -0
  7. package/dist/frontend/dist/assets/ToolbarPanels-CfaOVIc9.js.map +1 -0
  8. package/dist/frontend/dist/assets/{client-8eRsF4aG.js → client-CWwdB0xQ.js} +2 -2
  9. package/dist/frontend/dist/assets/{client-8eRsF4aG.js.map → client-CWwdB0xQ.js.map} +1 -1
  10. package/dist/frontend/dist/assets/{client-D4vbUf7k.js → client-Cgz-uiSd.js} +2 -2
  11. package/dist/frontend/dist/assets/{client-D4vbUf7k.js.map → client-Cgz-uiSd.js.map} +1 -1
  12. package/dist/frontend/dist/assets/{client-Zl8uXOB2.js → client-D3W9xTBT.js} +2 -2
  13. package/dist/frontend/dist/assets/{client-Zl8uXOB2.js.map → client-D3W9xTBT.js.map} +1 -1
  14. package/dist/frontend/dist/assets/{client-BwxrodJP.js → client-DeL0szs5.js} +2 -2
  15. package/dist/frontend/dist/assets/{client-BwxrodJP.js.map → client-DeL0szs5.js.map} +1 -1
  16. package/dist/frontend/dist/assets/{index-DESF7by4.js → index-C5oI0kaf.js} +49 -49
  17. package/dist/frontend/dist/assets/index-C5oI0kaf.js.map +1 -0
  18. package/dist/frontend/dist/assets/{layout-BInmmVVD.js → layout-B_JLc3yI.js} +2 -2
  19. package/dist/frontend/dist/assets/{layout-BInmmVVD.js.map → layout-B_JLc3yI.js.map} +1 -1
  20. package/dist/frontend/dist/assets/{layout-DvfgC4ds.js → layout-DJI7aibW.js} +2 -2
  21. package/dist/frontend/dist/assets/{layout-DvfgC4ds.js.map → layout-DJI7aibW.js.map} +1 -1
  22. package/dist/frontend/dist/assets/{layout-Bc0HvP9q.js → layout-DXY8hCsB.js} +2 -2
  23. package/dist/frontend/dist/assets/{layout-Bc0HvP9q.js.map → layout-DXY8hCsB.js.map} +1 -1
  24. package/dist/frontend/dist/assets/{layout-CFCI5ndn.js → layout-VBQ97DvJ.js} +2 -2
  25. package/dist/frontend/dist/assets/{layout-CFCI5ndn.js.map → layout-VBQ97DvJ.js.map} +1 -1
  26. package/dist/frontend/dist/assets/{not-found-B-h8U0AW.js → not-found-BKG2_Fv3.js} +2 -2
  27. package/dist/frontend/dist/assets/{not-found-B-h8U0AW.js.map → not-found-BKG2_Fv3.js.map} +1 -1
  28. package/dist/frontend/dist/assets/{page-CwB528Up.js → page-8OrS1-4-.js} +2 -2
  29. package/dist/frontend/dist/assets/{page-CwB528Up.js.map → page-8OrS1-4-.js.map} +1 -1
  30. package/dist/frontend/dist/assets/{page-BRnMt7o2.js → page-B4Qu9WPd.js} +2 -2
  31. package/dist/frontend/dist/assets/{page-BRnMt7o2.js.map → page-B4Qu9WPd.js.map} +1 -1
  32. package/dist/frontend/dist/assets/page-BNJp__R7.js +2 -0
  33. package/dist/frontend/dist/assets/{page-DLQK_cX5.js.map → page-BNJp__R7.js.map} +1 -1
  34. package/dist/frontend/dist/assets/{page-CkjHPT8p.js → page-BRTi-f95.js} +2 -2
  35. package/dist/frontend/dist/assets/{page-CkjHPT8p.js.map → page-BRTi-f95.js.map} +1 -1
  36. package/dist/frontend/dist/assets/{page-B4bD7iN0.js → page-BSB8GP79.js} +2 -2
  37. package/dist/frontend/dist/assets/{page-B4bD7iN0.js.map → page-BSB8GP79.js.map} +1 -1
  38. package/dist/frontend/dist/assets/{page-zo4BeIjA.js → page-Bx8QAzic.js} +2 -2
  39. package/dist/frontend/dist/assets/{page-zo4BeIjA.js.map → page-Bx8QAzic.js.map} +1 -1
  40. package/dist/frontend/dist/assets/page-CDSGl6uY.js +2 -0
  41. package/dist/frontend/dist/assets/{page-EgwcfkeK.js.map → page-CDSGl6uY.js.map} +1 -1
  42. package/dist/frontend/dist/assets/{page-DRQxmzY-.js → page-CJLuuiG8.js} +2 -2
  43. package/dist/frontend/dist/assets/{page-DRQxmzY-.js.map → page-CJLuuiG8.js.map} +1 -1
  44. package/dist/frontend/dist/assets/{page-CNftu-l4.js → page-CyFJt2nP.js} +2 -2
  45. package/dist/frontend/dist/assets/{page-CNftu-l4.js.map → page-CyFJt2nP.js.map} +1 -1
  46. package/dist/frontend/dist/assets/{page-CnYCXW-A.js → page-D1q6VB02.js} +2 -2
  47. package/dist/frontend/dist/assets/{page-CnYCXW-A.js.map → page-D1q6VB02.js.map} +1 -1
  48. package/dist/frontend/dist/assets/{page-DFS-DvYi.js → page-D3THDsqd.js} +2 -2
  49. package/dist/frontend/dist/assets/{page-DFS-DvYi.js.map → page-D3THDsqd.js.map} +1 -1
  50. package/dist/frontend/dist/assets/{page-4JzRN2Q4.js → page-DCxg1lHk.js} +2 -2
  51. package/dist/frontend/dist/assets/{page-4JzRN2Q4.js.map → page-DCxg1lHk.js.map} +1 -1
  52. package/dist/frontend/dist/assets/{page-hTDMMHds.js → page-DbwQv5n_.js} +2 -2
  53. package/dist/frontend/dist/assets/{page-hTDMMHds.js.map → page-DbwQv5n_.js.map} +1 -1
  54. package/dist/frontend/dist/assets/{page-tm2w2bTu.js → page-DddZ9Yxm.js} +2 -2
  55. package/dist/frontend/dist/assets/{page-tm2w2bTu.js.map → page-DddZ9Yxm.js.map} +1 -1
  56. package/dist/frontend/dist/assets/{page-BeWKvJpC.js → page-DzoXV-AN.js} +2 -2
  57. package/dist/frontend/dist/assets/{page-BeWKvJpC.js.map → page-DzoXV-AN.js.map} +1 -1
  58. package/dist/frontend/dist/assets/{page-BD_lMtdf.js → page-IgGNB4a9.js} +2 -2
  59. package/dist/frontend/dist/assets/{page-BD_lMtdf.js.map → page-IgGNB4a9.js.map} +1 -1
  60. package/dist/frontend/dist/assets/{page-BKt53Kee.js → page-aKPxuWo3.js} +2 -2
  61. package/dist/frontend/dist/assets/{page-BKt53Kee.js.map → page-aKPxuWo3.js.map} +1 -1
  62. package/dist/frontend/dist/assets/{page-BRpbSm6U.js → page-jxC42AIR.js} +2 -2
  63. package/dist/frontend/dist/assets/{page-BRpbSm6U.js.map → page-jxC42AIR.js.map} +1 -1
  64. package/dist/frontend/dist/assets/{privacy-DS6wXZXA.js → privacy-BAxopuZI.js} +2 -2
  65. package/dist/frontend/dist/assets/{privacy-DS6wXZXA.js.map → privacy-BAxopuZI.js.map} +1 -1
  66. package/dist/frontend/dist/assets/{routing-DDJ3KSPT.js → routing-Cm_oCwum.js} +2 -2
  67. package/dist/frontend/dist/assets/{routing-DDJ3KSPT.js.map → routing-Cm_oCwum.js.map} +1 -1
  68. package/dist/frontend/dist/assets/{routing-NOxgO9NV.js → routing-rYtBowvy.js} +2 -2
  69. package/dist/frontend/dist/assets/{routing-NOxgO9NV.js.map → routing-rYtBowvy.js.map} +1 -1
  70. package/dist/frontend/dist/index.html +1 -1
  71. package/dist/frontend/dist/messages/ar.json +2 -1
  72. package/dist/frontend/dist/messages/bn.json +2 -1
  73. package/dist/frontend/dist/messages/cs.json +2 -1
  74. package/dist/frontend/dist/messages/da.json +2 -1
  75. package/dist/frontend/dist/messages/de.json +2 -1
  76. package/dist/frontend/dist/messages/el.json +2 -1
  77. package/dist/frontend/dist/messages/en.json +2 -1
  78. package/dist/frontend/dist/messages/es.json +2 -1
  79. package/dist/frontend/dist/messages/fa.json +2 -1
  80. package/dist/frontend/dist/messages/fi.json +2 -1
  81. package/dist/frontend/dist/messages/fr.json +2 -1
  82. package/dist/frontend/dist/messages/he.json +2 -1
  83. package/dist/frontend/dist/messages/hi.json +2 -1
  84. package/dist/frontend/dist/messages/id.json +2 -1
  85. package/dist/frontend/dist/messages/it.json +2 -1
  86. package/dist/frontend/dist/messages/ja.json +2 -1
  87. package/dist/frontend/dist/messages/ko.json +2 -1
  88. package/dist/frontend/dist/messages/ms.json +2 -1
  89. package/dist/frontend/dist/messages/nl.json +2 -1
  90. package/dist/frontend/dist/messages/no.json +2 -1
  91. package/dist/frontend/dist/messages/pl.json +2 -1
  92. package/dist/frontend/dist/messages/pt.json +2 -1
  93. package/dist/frontend/dist/messages/ro.json +2 -1
  94. package/dist/frontend/dist/messages/sv.json +2 -1
  95. package/dist/frontend/dist/messages/th.json +2 -1
  96. package/dist/frontend/dist/messages/tr.json +2 -1
  97. package/dist/frontend/dist/messages/uk.json +2 -1
  98. package/dist/frontend/dist/messages/vi.json +2 -1
  99. package/dist/frontend/dist/messages/zh.json +2 -1
  100. package/dist/frontend/package.json +1 -1
  101. package/package.json +7 -7
  102. package/dist/frontend/dist/assets/ToolbarPanels-C9r6ZyGY.js +0 -2
  103. package/dist/frontend/dist/assets/ToolbarPanels-C9r6ZyGY.js.map +0 -1
  104. package/dist/frontend/dist/assets/index-DESF7by4.js.map +0 -1
  105. package/dist/frontend/dist/assets/page-DLQK_cX5.js +0 -2
  106. package/dist/frontend/dist/assets/page-EgwcfkeK.js +0 -2
package/dist/cli.mjs CHANGED
@@ -31683,7 +31683,7 @@ var require_package = __commonJS({
31683
31683
  "package.json"(exports, module) {
31684
31684
  module.exports = {
31685
31685
  name: "@semiont/cli",
31686
- version: "0.4.18",
31686
+ version: "0.4.20",
31687
31687
  description: "Semiont CLI - Unified environment management tool",
31688
31688
  _comment: "AWS SDK dependencies (@aws-sdk/*) are only used by platforms/aws",
31689
31689
  type: "module",
@@ -31730,12 +31730,12 @@ var require_package = __commonJS({
31730
31730
  "test:watch:unit": "vitest --watch --config vitest.config.unit.ts"
31731
31731
  },
31732
31732
  dependencies: {
31733
- "@semiont/api-client": "0.4.18",
31734
- "@semiont/content": "0.4.18",
31735
- "@semiont/core": "0.4.18",
31736
- "@semiont/event-sourcing": "0.4.18",
31737
- "@semiont/graph": "0.4.18",
31738
- "@semiont/make-meaning": "0.4.18",
31733
+ "@semiont/api-client": "0.4.20",
31734
+ "@semiont/content": "0.4.20",
31735
+ "@semiont/core": "0.4.20",
31736
+ "@semiont/event-sourcing": "0.4.20",
31737
+ "@semiont/graph": "0.4.20",
31738
+ "@semiont/make-meaning": "0.4.20",
31739
31739
  arg: "^5.0.2",
31740
31740
  argon2: "^0.44.0",
31741
31741
  express: "^5.2.1",
@@ -33222,7 +33222,7 @@ async function runRestore(options) {
33222
33222
  const result = await importBackup(input, { eventBus, contentStore: kb.content, logger });
33223
33223
  if (!options.quiet) {
33224
33224
  printSuccess(
33225
- `Restore complete: ${result.stats.eventsReplayed} events, ${result.stats.resourcesCreated} resources, ${result.stats.annotationsCreated} annotations` + (result.hashChainValid ? "" : " (WARNING: hash chain invalid)")
33225
+ `Restore complete: ${result.stats.eventsReplayed} events, ${result.stats.resourcesCreated} resources, ${result.stats.annotationsCreated} annotations`
33226
33226
  );
33227
33227
  }
33228
33228
  const duration = Date.now() - startTime;
@@ -33235,14 +33235,14 @@ async function runRestore(options) {
33235
33235
  succeeded: 1,
33236
33236
  failed: 0,
33237
33237
  total: 1,
33238
- warnings: result.hashChainValid ? 0 : 1
33238
+ warnings: 0
33239
33239
  },
33240
33240
  executionContext: { user: process.env.USER || "unknown", workingDirectory: process.cwd(), dryRun: options.dryRun },
33241
33241
  results: [{
33242
33242
  entity: filePath,
33243
33243
  platform: "posix",
33244
33244
  success: true,
33245
- metadata: { format: "backup", ...result.stats, hashChainValid: result.hashChainValid },
33245
+ metadata: { format: "backup", ...result.stats },
33246
33246
  duration
33247
33247
  }]
33248
33248
  };
@@ -33330,7 +33330,6 @@ async function runVerify(options) {
33330
33330
  printInfo(`Stats: ${header.stats.streams} streams, ${header.stats.events} events, ${header.stats.blobs} blobs`);
33331
33331
  }
33332
33332
  const streamSummaries = manifestLines.slice(1).map((line) => JSON.parse(line));
33333
- let totalChainBreaks = 0;
33334
33333
  let totalEventsChecked = 0;
33335
33334
  const warnings = [];
33336
33335
  for (const summary of streamSummaries) {
@@ -33343,30 +33342,6 @@ async function runVerify(options) {
33343
33342
  const lines = streamData.toString("utf8").trim().split("\n");
33344
33343
  const events = lines.map((line) => JSON.parse(line));
33345
33344
  totalEventsChecked += events.length;
33346
- let chainBreaks = 0;
33347
- for (let i = 1; i < events.length; i++) {
33348
- const prev = events[i - 1];
33349
- const curr = events[i];
33350
- if (curr.metadata.prevEventHash && prev.metadata.checksum) {
33351
- if (curr.metadata.prevEventHash !== prev.metadata.checksum) {
33352
- chainBreaks++;
33353
- }
33354
- }
33355
- }
33356
- if (chainBreaks > 0) {
33357
- warnings.push(`Stream ${summary.stream}: ${chainBreaks} hash chain break(s)`);
33358
- totalChainBreaks += chainBreaks;
33359
- }
33360
- if (events.length > 0) {
33361
- const firstChecksum = events[0].metadata.checksum || "";
33362
- const lastChecksum = events[events.length - 1].metadata.checksum || "";
33363
- if (summary.firstChecksum && firstChecksum !== summary.firstChecksum) {
33364
- warnings.push(`Stream ${summary.stream}: first checksum mismatch`);
33365
- }
33366
- if (summary.lastChecksum && lastChecksum !== summary.lastChecksum) {
33367
- warnings.push(`Stream ${summary.stream}: last checksum mismatch`);
33368
- }
33369
- }
33370
33345
  if (events.length !== summary.eventCount) {
33371
33346
  warnings.push(`Stream ${summary.stream}: expected ${summary.eventCount} events, found ${events.length}`);
33372
33347
  }
@@ -33383,14 +33358,14 @@ async function runVerify(options) {
33383
33358
  printWarning(w);
33384
33359
  }
33385
33360
  }
33386
- if (totalChainBreaks === 0 && warnings.length === 0) {
33361
+ if (warnings.length === 0) {
33387
33362
  printSuccess("Backup is valid");
33388
33363
  } else {
33389
33364
  printError(`Verification found ${warnings.length} issue(s)`);
33390
33365
  }
33391
33366
  }
33392
33367
  const duration = Date.now() - startTime;
33393
- const success = totalChainBreaks === 0 && warnings.length === 0;
33368
+ const success = warnings.length === 0;
33394
33369
  return {
33395
33370
  command: "verify",
33396
33371
  environment: options.environment || "n/a",
@@ -33413,7 +33388,6 @@ async function runVerify(options) {
33413
33388
  streams: streamSummaries.length,
33414
33389
  eventsChecked: totalEventsChecked,
33415
33390
  contentBlobs: contentEntries.length,
33416
- hashChainBreaks: totalChainBreaks,
33417
33391
  warnings
33418
33392
  },
33419
33393
  duration
@@ -35518,9 +35492,7 @@ async function runListen(options) {
35518
35492
  "job:started",
35519
35493
  "job:progress",
35520
35494
  "job:completed",
35521
- "job:failed",
35522
- "embedding:computed",
35523
- "embedding:deleted"
35495
+ "job:failed"
35524
35496
  ];
35525
35497
  for (const eventType of allEventTypes) {
35526
35498
  eventBus.get(eventType).subscribe((event) => {
@@ -36798,7 +36770,7 @@ async function generateGlobalHelp() {
36798
36770
  }
36799
36771
 
36800
36772
  // src/cli.ts
36801
- var VERSION = "0.4.18";
36773
+ var VERSION = "0.4.20";
36802
36774
  function printVersion() {
36803
36775
  console.log(`Semiont CLI v${VERSION}`);
36804
36776
  }
@@ -1,2 +1,2 @@
1
- import{j as e}from"./query-B6BuIB0M.js";import{r}from"./vendor-DJo4KD8w.js";import{g as v,C as N,e as k,s as C,d as E}from"./privacy-DS6wXZXA.js";import{u as D}from"./i18n-BbpF47i1.js";import{F as L,a as g}from"./XMarkIcon-KMKD47CF.js";function R({title:a,titleId:n,...l},t){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":n},l),a?r.createElement("title",{id:n},a):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"}))}const M=r.forwardRef(R);function S({title:a,titleId:n,...l},t){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":n},l),a?r.createElement("title",{id:n},a):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495"}))}const A=r.forwardRef(S);function F({title:a,titleId:n,...l},t){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":n},l),a?r.createElement("title",{id:n},a):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z"}))}const $=r.forwardRef(F);function H({isOpen:a,onClose:n}){const{t:l}=D(),t=(s,i)=>l(`CookiePreferences.${s}`,i),[o,m]=r.useState(null),[d,u]=r.useState(!1),[b,x]=r.useState(!1),f=r.useRef(n);r.useEffect(()=>{f.current=n}),r.useEffect(()=>{if(a){const s=v();m(s||{necessary:!0,analytics:!1,marketing:!1,preferences:!1,timestamp:new Date().toISOString(),version:"1.0"})}},[a]),r.useEffect(()=>{if(!a)return;const s=i=>{i.key==="Escape"&&f.current()};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s)}},[a]);const p=async()=>{o&&(u(!0),C(o),u(!1),n())},j=s=>{s==="necessary"||!o||m(i=>i?{...i,[s]:!i[s]}:null)},y=()=>{const s=k(),i=new Blob([JSON.stringify(s,null,2)],{type:"application/json"}),h=URL.createObjectURL(i),c=document.createElement("a");c.href=h,c.download=`semiont-user-data-${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(h)},w=()=>{E()};return!a||!o?null:e.jsxs("div",{className:"fixed inset-0 z-50 overflow-y-auto",children:[e.jsxs("div",{className:"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[e.jsx("div",{className:"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75",onClick:n}),e.jsxs("div",{className:"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-2xl sm:w-full sm:p-6 relative",children:[e.jsx("button",{onClick:n,className:"absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded-lg p-1","aria-label":"Close",children:e.jsx(L,{className:"h-6 w-6"})}),e.jsxs("div",{className:"sm:flex sm:items-start",children:[e.jsx("div",{className:"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10",children:e.jsx(A,{className:"h-6 w-6 text-blue-600"})}),e.jsxs("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left flex-1 pr-8",children:[e.jsx("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:t("title")}),e.jsx("div",{className:"mt-2",children:e.jsx("p",{className:"text-sm text-gray-500",children:t("description")})})]})]}),e.jsx("div",{className:"mt-6",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"bg-gray-50 rounded-lg p-4",children:[e.jsxs("div",{className:"flex items-center",children:[e.jsx($,{className:"h-5 w-5 text-green-500 mr-2"}),e.jsx("span",{className:"text-sm font-medium text-gray-900",children:t("currentSettings")})]}),e.jsxs("div",{className:"mt-2 text-xs text-gray-600",children:[e.jsx("p",{children:t("lastUpdated",{date:new Date(o.timestamp).toLocaleDateString()})}),e.jsx("p",{children:t("version",{version:o.version})})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h4",{className:"text-base font-medium text-gray-900",children:t("cookieCategories")}),N.map(s=>e.jsx("div",{className:"border border-gray-200 rounded-lg p-4",children:e.jsx("div",{className:"flex items-start justify-between",children:e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center",children:[e.jsx("input",{id:`pref-${s.id}`,type:"checkbox",checked:o[s.id]||!1,onChange:()=>j(s.id),disabled:s.required||d,className:"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded-sm disabled:opacity-50"}),e.jsxs("label",{htmlFor:`pref-${s.id}`,className:"ml-3 text-sm font-medium text-gray-900 cursor-pointer",children:[s.name,s.required&&e.jsx("span",{className:"text-xs text-gray-500 ml-1",children:t("required")})]})]}),e.jsx("p",{className:"mt-1 text-sm text-gray-600",children:s.description}),e.jsxs("details",{className:"mt-2",children:[e.jsx("summary",{className:"text-xs text-blue-600 cursor-pointer hover:text-blue-800",children:t("viewCookies",{count:s.cookies.length})}),e.jsx("div",{className:"mt-1 text-xs text-gray-500 bg-gray-50 rounded-sm p-2",children:e.jsx("ul",{className:"list-disc list-inside space-y-1",children:s.cookies.map(i=>e.jsx("li",{children:i},i))})})]})]})})},s.id))]}),e.jsxs("div",{className:"border-t border-gray-200 pt-6",children:[e.jsx("h4",{className:"text-base font-medium text-gray-900 mb-4",children:t("dataManagement")}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("button",{onClick:y,className:"flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-xs text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500",children:[e.jsx(M,{className:"h-4 w-4 mr-2"}),t("exportMyData")]}),e.jsxs("button",{onClick:()=>x(!0),className:"flex items-center justify-center px-4 py-2 border border-red-300 rounded-md shadow-xs text-sm font-medium text-red-700 bg-white hover:bg-red-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500",children:[e.jsx(g,{className:"h-4 w-4 mr-2"}),t("deleteAllData")]})]}),e.jsx("p",{className:"mt-2 text-xs text-gray-500",children:t("dataManagementDescription")})]})]})}),e.jsxs("div",{className:"mt-6 flex flex-wrap gap-2 justify-center",children:[e.jsx("button",{type:"button",onClick:()=>{m(s=>s?{...s,necessary:!0,analytics:!1,marketing:!1,preferences:!1}:null)},disabled:d,className:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors",children:t("rejectAll")}),e.jsx("button",{type:"button",onClick:()=>{m(s=>s?{...s,necessary:!0,analytics:!0,marketing:!0,preferences:!0}:null)},disabled:d,className:"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors",children:t("acceptAll")})]}),e.jsxs("div",{className:"mt-6 sm:flex sm:flex-row-reverse",children:[e.jsx("button",{type:"button",onClick:p,disabled:d,className:"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50",children:t(d?"saving":"saveChanges")}),e.jsx("button",{type:"button",onClick:n,className:"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm",children:t("cancel")})]})]})]}),b&&e.jsx("div",{className:"fixed inset-0 z-60 overflow-y-auto",children:e.jsxs("div",{className:"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[e.jsx("div",{className:"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75"}),e.jsxs("div",{className:"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6",children:[e.jsxs("div",{className:"sm:flex sm:items-start",children:[e.jsx("div",{className:"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10",children:e.jsx(g,{className:"h-6 w-6 text-red-600"})}),e.jsxs("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[e.jsx("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:t("deleteConfirmTitle")}),e.jsx("div",{className:"mt-2",children:e.jsx("p",{className:"text-sm text-gray-500",children:t("deleteConfirmDescription")})})]})]}),e.jsxs("div",{className:"mt-5 sm:mt-4 sm:flex sm:flex-row-reverse",children:[e.jsx("button",{type:"button",onClick:w,className:"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm",children:t("deleteAllData")}),e.jsx("button",{type:"button",onClick:()=>x(!1),className:"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm",children:t("cancel")})]})]})]})})]})}export{H as C,$ as F};
2
- //# sourceMappingURL=CookiePreferences-ebe4eB-e.js.map
1
+ import{j as e}from"./query-B6BuIB0M.js";import{r}from"./vendor-DJo4KD8w.js";import{g as v,C as N,e as k,s as C,d as E}from"./privacy-BAxopuZI.js";import{u as D}from"./i18n-BbpF47i1.js";import{F as L,a as g}from"./XMarkIcon-KMKD47CF.js";function R({title:a,titleId:n,...l},t){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":n},l),a?r.createElement("title",{id:n},a):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"}))}const M=r.forwardRef(R);function S({title:a,titleId:n,...l},t){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":n},l),a?r.createElement("title",{id:n},a):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495"}))}const A=r.forwardRef(S);function F({title:a,titleId:n,...l},t){return r.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:t,"aria-labelledby":n},l),a?r.createElement("title",{id:n},a):null,r.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z"}))}const $=r.forwardRef(F);function H({isOpen:a,onClose:n}){const{t:l}=D(),t=(s,i)=>l(`CookiePreferences.${s}`,i),[o,m]=r.useState(null),[d,u]=r.useState(!1),[b,x]=r.useState(!1),f=r.useRef(n);r.useEffect(()=>{f.current=n}),r.useEffect(()=>{if(a){const s=v();m(s||{necessary:!0,analytics:!1,marketing:!1,preferences:!1,timestamp:new Date().toISOString(),version:"1.0"})}},[a]),r.useEffect(()=>{if(!a)return;const s=i=>{i.key==="Escape"&&f.current()};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s)}},[a]);const p=async()=>{o&&(u(!0),C(o),u(!1),n())},j=s=>{s==="necessary"||!o||m(i=>i?{...i,[s]:!i[s]}:null)},y=()=>{const s=k(),i=new Blob([JSON.stringify(s,null,2)],{type:"application/json"}),h=URL.createObjectURL(i),c=document.createElement("a");c.href=h,c.download=`semiont-user-data-${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(h)},w=()=>{E()};return!a||!o?null:e.jsxs("div",{className:"fixed inset-0 z-50 overflow-y-auto",children:[e.jsxs("div",{className:"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[e.jsx("div",{className:"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75",onClick:n}),e.jsxs("div",{className:"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-2xl sm:w-full sm:p-6 relative",children:[e.jsx("button",{onClick:n,className:"absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded-lg p-1","aria-label":"Close",children:e.jsx(L,{className:"h-6 w-6"})}),e.jsxs("div",{className:"sm:flex sm:items-start",children:[e.jsx("div",{className:"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10",children:e.jsx(A,{className:"h-6 w-6 text-blue-600"})}),e.jsxs("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left flex-1 pr-8",children:[e.jsx("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:t("title")}),e.jsx("div",{className:"mt-2",children:e.jsx("p",{className:"text-sm text-gray-500",children:t("description")})})]})]}),e.jsx("div",{className:"mt-6",children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"bg-gray-50 rounded-lg p-4",children:[e.jsxs("div",{className:"flex items-center",children:[e.jsx($,{className:"h-5 w-5 text-green-500 mr-2"}),e.jsx("span",{className:"text-sm font-medium text-gray-900",children:t("currentSettings")})]}),e.jsxs("div",{className:"mt-2 text-xs text-gray-600",children:[e.jsx("p",{children:t("lastUpdated",{date:new Date(o.timestamp).toLocaleDateString()})}),e.jsx("p",{children:t("version",{version:o.version})})]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h4",{className:"text-base font-medium text-gray-900",children:t("cookieCategories")}),N.map(s=>e.jsx("div",{className:"border border-gray-200 rounded-lg p-4",children:e.jsx("div",{className:"flex items-start justify-between",children:e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center",children:[e.jsx("input",{id:`pref-${s.id}`,type:"checkbox",checked:o[s.id]||!1,onChange:()=>j(s.id),disabled:s.required||d,className:"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded-sm disabled:opacity-50"}),e.jsxs("label",{htmlFor:`pref-${s.id}`,className:"ml-3 text-sm font-medium text-gray-900 cursor-pointer",children:[s.name,s.required&&e.jsx("span",{className:"text-xs text-gray-500 ml-1",children:t("required")})]})]}),e.jsx("p",{className:"mt-1 text-sm text-gray-600",children:s.description}),e.jsxs("details",{className:"mt-2",children:[e.jsx("summary",{className:"text-xs text-blue-600 cursor-pointer hover:text-blue-800",children:t("viewCookies",{count:s.cookies.length})}),e.jsx("div",{className:"mt-1 text-xs text-gray-500 bg-gray-50 rounded-sm p-2",children:e.jsx("ul",{className:"list-disc list-inside space-y-1",children:s.cookies.map(i=>e.jsx("li",{children:i},i))})})]})]})})},s.id))]}),e.jsxs("div",{className:"border-t border-gray-200 pt-6",children:[e.jsx("h4",{className:"text-base font-medium text-gray-900 mb-4",children:t("dataManagement")}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[e.jsxs("button",{onClick:y,className:"flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-xs text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500",children:[e.jsx(M,{className:"h-4 w-4 mr-2"}),t("exportMyData")]}),e.jsxs("button",{onClick:()=>x(!0),className:"flex items-center justify-center px-4 py-2 border border-red-300 rounded-md shadow-xs text-sm font-medium text-red-700 bg-white hover:bg-red-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500",children:[e.jsx(g,{className:"h-4 w-4 mr-2"}),t("deleteAllData")]})]}),e.jsx("p",{className:"mt-2 text-xs text-gray-500",children:t("dataManagementDescription")})]})]})}),e.jsxs("div",{className:"mt-6 flex flex-wrap gap-2 justify-center",children:[e.jsx("button",{type:"button",onClick:()=>{m(s=>s?{...s,necessary:!0,analytics:!1,marketing:!1,preferences:!1}:null)},disabled:d,className:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors",children:t("rejectAll")}),e.jsx("button",{type:"button",onClick:()=>{m(s=>s?{...s,necessary:!0,analytics:!0,marketing:!0,preferences:!0}:null)},disabled:d,className:"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors",children:t("acceptAll")})]}),e.jsxs("div",{className:"mt-6 sm:flex sm:flex-row-reverse",children:[e.jsx("button",{type:"button",onClick:p,disabled:d,className:"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50",children:t(d?"saving":"saveChanges")}),e.jsx("button",{type:"button",onClick:n,className:"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm",children:t("cancel")})]})]})]}),b&&e.jsx("div",{className:"fixed inset-0 z-60 overflow-y-auto",children:e.jsxs("div",{className:"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0",children:[e.jsx("div",{className:"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75"}),e.jsxs("div",{className:"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6",children:[e.jsxs("div",{className:"sm:flex sm:items-start",children:[e.jsx("div",{className:"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10",children:e.jsx(g,{className:"h-6 w-6 text-red-600"})}),e.jsxs("div",{className:"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left",children:[e.jsx("h3",{className:"text-lg leading-6 font-medium text-gray-900",children:t("deleteConfirmTitle")}),e.jsx("div",{className:"mt-2",children:e.jsx("p",{className:"text-sm text-gray-500",children:t("deleteConfirmDescription")})})]})]}),e.jsxs("div",{className:"mt-5 sm:mt-4 sm:flex sm:flex-row-reverse",children:[e.jsx("button",{type:"button",onClick:w,className:"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm",children:t("deleteAllData")}),e.jsx("button",{type:"button",onClick:()=>x(!1),className:"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm",children:t("cancel")})]})]})]})})]})}export{H as C,$ as F};
2
+ //# sourceMappingURL=CookiePreferences-BBb5XMuG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookiePreferences-ebe4eB-e.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowDownTrayIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CogIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ShieldCheckIcon.js","../../src/components/CookiePreferences.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowDownTrayIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowDownTrayIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CogIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CogIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ShieldCheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ShieldCheckIcon);\nexport default ForwardRef;","\"use client\";\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n getCookieConsent,\n setCookieConsent,\n COOKIE_CATEGORIES,\n CookieConsent,\n exportUserData,\n deleteAllUserData,\n type CookieCategory\n} from '@/lib/cookies';\nimport {\n CogIcon,\n TrashIcon,\n ArrowDownTrayIcon,\n ShieldCheckIcon,\n XMarkIcon\n} from '@heroicons/react/24/outline';\n\ninterface CookiePreferencesProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport function CookiePreferences({ isOpen, onClose }: CookiePreferencesProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`CookiePreferences.${k}`, p as any) as string;\n const [consent, setConsent] = useState<CookieConsent | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n // Store callback in ref to avoid including in dependency arrays\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n });\n\n useEffect(() => {\n if (isOpen) {\n const currentConsent = getCookieConsent();\n setConsent(currentConsent || {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false,\n timestamp: new Date().toISOString(),\n version: '1.0'\n });\n }\n }, [isOpen]);\n\n // Handle ESC key to close modal\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n const handleEsc = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onCloseRef.current();\n }\n };\n\n document.addEventListener('keydown', handleEsc);\n return () => {\n document.removeEventListener('keydown', handleEsc);\n };\n }, [isOpen]);\n\n const handleSave = async () => {\n if (!consent) return;\n \n setIsLoading(true);\n setCookieConsent(consent);\n setIsLoading(false);\n onClose();\n };\n\n const handleCategoryToggle = (categoryId: keyof Omit<CookieConsent, 'timestamp' | 'version'>) => {\n if (categoryId === 'necessary' || !consent) return;\n \n setConsent(prev => prev ? {\n ...prev,\n [categoryId]: !prev[categoryId]\n } : null);\n };\n\n const handleExportData = () => {\n const data = exportUserData();\n const blob = new Blob([JSON.stringify(data, null, 2)], { \n type: 'application/json' \n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `semiont-user-data-${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n const handleDeleteAllData = () => {\n deleteAllUserData();\n };\n\n if (!isOpen || !consent) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n {/* Background overlay */}\n <div \n className=\"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75\"\n onClick={onClose}\n />\n\n {/* Modal panel */}\n <div className=\"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-2xl sm:w-full sm:p-6 relative\">\n {/* Close button in upper right */}\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded-lg p-1\"\n aria-label=\"Close\"\n >\n <XMarkIcon className=\"h-6 w-6\" />\n </button>\n\n <div className=\"sm:flex sm:items-start\">\n <div className=\"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10\">\n <CogIcon className=\"h-6 w-6 text-blue-600\" />\n </div>\n <div className=\"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left flex-1 pr-8\">\n <h3 className=\"text-lg leading-6 font-medium text-gray-900\">\n {t('title')}\n </h3>\n <div className=\"mt-2\">\n <p className=\"text-sm text-gray-500\">\n {t('description')}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"mt-6\">\n <div className=\"space-y-6\">\n {/* Current consent info */}\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <div className=\"flex items-center\">\n <ShieldCheckIcon className=\"h-5 w-5 text-green-500 mr-2\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {t('currentSettings')}\n </span>\n </div>\n <div className=\"mt-2 text-xs text-gray-600\">\n <p>{t('lastUpdated', { date: new Date(consent.timestamp).toLocaleDateString() })}</p>\n <p>{t('version', { version: consent.version })}</p>\n </div>\n </div>\n\n {/* Cookie categories */}\n <div className=\"space-y-4\">\n <h4 className=\"text-base font-medium text-gray-900\">\n {t('cookieCategories')}\n </h4>\n \n {COOKIE_CATEGORIES.map((category: CookieCategory) => (\n <div key={category.id} className=\"border border-gray-200 rounded-lg p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <div className=\"flex items-center\">\n <input\n id={`pref-${category.id}`}\n type=\"checkbox\"\n checked={consent[category.id] || false}\n onChange={() => handleCategoryToggle(category.id)}\n disabled={category.required || isLoading}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded-sm disabled:opacity-50\"\n />\n <label\n htmlFor={`pref-${category.id}`}\n className=\"ml-3 text-sm font-medium text-gray-900 cursor-pointer\"\n >\n {category.name}\n {category.required && (\n <span className=\"text-xs text-gray-500 ml-1\">{t('required')}</span>\n )}\n </label>\n </div>\n <p className=\"mt-1 text-sm text-gray-600\">\n {category.description}\n </p>\n <details className=\"mt-2\">\n <summary className=\"text-xs text-blue-600 cursor-pointer hover:text-blue-800\">\n {t('viewCookies', { count: category.cookies.length })}\n </summary>\n <div className=\"mt-1 text-xs text-gray-500 bg-gray-50 rounded-sm p-2\">\n <ul className=\"list-disc list-inside space-y-1\">\n {category.cookies.map(cookie => (\n <li key={cookie}>{cookie}</li>\n ))}\n </ul>\n </div>\n </details>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {/* Data management section */}\n <div className=\"border-t border-gray-200 pt-6\">\n <h4 className=\"text-base font-medium text-gray-900 mb-4\">\n {t('dataManagement')}\n </h4>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <button\n onClick={handleExportData}\n className=\"flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-xs text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <ArrowDownTrayIcon className=\"h-4 w-4 mr-2\" />\n {t('exportMyData')}\n </button>\n\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"flex items-center justify-center px-4 py-2 border border-red-300 rounded-md shadow-xs text-sm font-medium text-red-700 bg-white hover:bg-red-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500\"\n >\n <TrashIcon className=\"h-4 w-4 mr-2\" />\n {t('deleteAllData')}\n </button>\n </div>\n\n <p className=\"mt-2 text-xs text-gray-500\">\n {t('dataManagementDescription')}\n </p>\n </div>\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"mt-6 flex flex-wrap gap-2 justify-center\">\n <button\n type=\"button\"\n onClick={() => {\n setConsent(prev => prev ? {\n ...prev,\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n } : null);\n }}\n disabled={isLoading}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors\"\n >\n {t('rejectAll')}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setConsent(prev => prev ? {\n ...prev,\n necessary: true,\n analytics: true,\n marketing: true,\n preferences: true\n } : null);\n }}\n disabled={isLoading}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors\"\n >\n {t('acceptAll')}\n </button>\n </div>\n\n {/* Action buttons */}\n <div className=\"mt-6 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={isLoading}\n className=\"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50\"\n >\n {isLoading ? t('saving') : t('saveChanges')}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm\"\n >\n {t('cancel')}\n </button>\n </div>\n </div>\n </div>\n\n {/* Delete confirmation modal */}\n {showDeleteConfirm && (\n <div className=\"fixed inset-0 z-60 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n <div className=\"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75\" />\n <div className=\"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6\">\n <div className=\"sm:flex sm:items-start\">\n <div className=\"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10\">\n <TrashIcon className=\"h-6 w-6 text-red-600\" />\n </div>\n <div className=\"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left\">\n <h3 className=\"text-lg leading-6 font-medium text-gray-900\">\n {t('deleteConfirmTitle')}\n </h3>\n <div className=\"mt-2\">\n <p className=\"text-sm text-gray-500\">\n {t('deleteConfirmDescription')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"mt-5 sm:mt-4 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onClick={handleDeleteAllData}\n className=\"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm\"\n >\n {t('deleteAllData')}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowDeleteConfirm(false)}\n className=\"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm\"\n >\n {t('cancel')}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default CookiePreferences;"],"names":["ArrowDownTrayIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CogIcon","ShieldCheckIcon","CookiePreferences","isOpen","onClose","_t","useTranslation","k","p","consent","setConsent","useState","isLoading","setIsLoading","showDeleteConfirm","setShowDeleteConfirm","onCloseRef","useRef","useEffect","currentConsent","getCookieConsent","handleEsc","event","handleSave","setCookieConsent","handleCategoryToggle","categoryId","prev","handleExportData","data","exportUserData","blob","url","a","handleDeleteAllData","deleteAllUserData","jsxs","jsx","XMarkIcon","COOKIE_CATEGORIES","category","cookie","TrashIcon"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"CookiePreferences-BBb5XMuG.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowDownTrayIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CogIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ShieldCheckIcon.js","../../src/components/CookiePreferences.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowDownTrayIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowDownTrayIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CogIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CogIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ShieldCheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ShieldCheckIcon);\nexport default ForwardRef;","\"use client\";\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n getCookieConsent,\n setCookieConsent,\n COOKIE_CATEGORIES,\n CookieConsent,\n exportUserData,\n deleteAllUserData,\n type CookieCategory\n} from '@/lib/cookies';\nimport {\n CogIcon,\n TrashIcon,\n ArrowDownTrayIcon,\n ShieldCheckIcon,\n XMarkIcon\n} from '@heroicons/react/24/outline';\n\ninterface CookiePreferencesProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport function CookiePreferences({ isOpen, onClose }: CookiePreferencesProps) {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`CookiePreferences.${k}`, p as any) as string;\n const [consent, setConsent] = useState<CookieConsent | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n // Store callback in ref to avoid including in dependency arrays\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n });\n\n useEffect(() => {\n if (isOpen) {\n const currentConsent = getCookieConsent();\n setConsent(currentConsent || {\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false,\n timestamp: new Date().toISOString(),\n version: '1.0'\n });\n }\n }, [isOpen]);\n\n // Handle ESC key to close modal\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n const handleEsc = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onCloseRef.current();\n }\n };\n\n document.addEventListener('keydown', handleEsc);\n return () => {\n document.removeEventListener('keydown', handleEsc);\n };\n }, [isOpen]);\n\n const handleSave = async () => {\n if (!consent) return;\n \n setIsLoading(true);\n setCookieConsent(consent);\n setIsLoading(false);\n onClose();\n };\n\n const handleCategoryToggle = (categoryId: keyof Omit<CookieConsent, 'timestamp' | 'version'>) => {\n if (categoryId === 'necessary' || !consent) return;\n \n setConsent(prev => prev ? {\n ...prev,\n [categoryId]: !prev[categoryId]\n } : null);\n };\n\n const handleExportData = () => {\n const data = exportUserData();\n const blob = new Blob([JSON.stringify(data, null, 2)], { \n type: 'application/json' \n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `semiont-user-data-${new Date().toISOString().split('T')[0]}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n const handleDeleteAllData = () => {\n deleteAllUserData();\n };\n\n if (!isOpen || !consent) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n {/* Background overlay */}\n <div \n className=\"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75\"\n onClick={onClose}\n />\n\n {/* Modal panel */}\n <div className=\"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-2xl sm:w-full sm:p-6 relative\">\n {/* Close button in upper right */}\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded-lg p-1\"\n aria-label=\"Close\"\n >\n <XMarkIcon className=\"h-6 w-6\" />\n </button>\n\n <div className=\"sm:flex sm:items-start\">\n <div className=\"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10\">\n <CogIcon className=\"h-6 w-6 text-blue-600\" />\n </div>\n <div className=\"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left flex-1 pr-8\">\n <h3 className=\"text-lg leading-6 font-medium text-gray-900\">\n {t('title')}\n </h3>\n <div className=\"mt-2\">\n <p className=\"text-sm text-gray-500\">\n {t('description')}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"mt-6\">\n <div className=\"space-y-6\">\n {/* Current consent info */}\n <div className=\"bg-gray-50 rounded-lg p-4\">\n <div className=\"flex items-center\">\n <ShieldCheckIcon className=\"h-5 w-5 text-green-500 mr-2\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {t('currentSettings')}\n </span>\n </div>\n <div className=\"mt-2 text-xs text-gray-600\">\n <p>{t('lastUpdated', { date: new Date(consent.timestamp).toLocaleDateString() })}</p>\n <p>{t('version', { version: consent.version })}</p>\n </div>\n </div>\n\n {/* Cookie categories */}\n <div className=\"space-y-4\">\n <h4 className=\"text-base font-medium text-gray-900\">\n {t('cookieCategories')}\n </h4>\n \n {COOKIE_CATEGORIES.map((category: CookieCategory) => (\n <div key={category.id} className=\"border border-gray-200 rounded-lg p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <div className=\"flex items-center\">\n <input\n id={`pref-${category.id}`}\n type=\"checkbox\"\n checked={consent[category.id] || false}\n onChange={() => handleCategoryToggle(category.id)}\n disabled={category.required || isLoading}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded-sm disabled:opacity-50\"\n />\n <label\n htmlFor={`pref-${category.id}`}\n className=\"ml-3 text-sm font-medium text-gray-900 cursor-pointer\"\n >\n {category.name}\n {category.required && (\n <span className=\"text-xs text-gray-500 ml-1\">{t('required')}</span>\n )}\n </label>\n </div>\n <p className=\"mt-1 text-sm text-gray-600\">\n {category.description}\n </p>\n <details className=\"mt-2\">\n <summary className=\"text-xs text-blue-600 cursor-pointer hover:text-blue-800\">\n {t('viewCookies', { count: category.cookies.length })}\n </summary>\n <div className=\"mt-1 text-xs text-gray-500 bg-gray-50 rounded-sm p-2\">\n <ul className=\"list-disc list-inside space-y-1\">\n {category.cookies.map(cookie => (\n <li key={cookie}>{cookie}</li>\n ))}\n </ul>\n </div>\n </details>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {/* Data management section */}\n <div className=\"border-t border-gray-200 pt-6\">\n <h4 className=\"text-base font-medium text-gray-900 mb-4\">\n {t('dataManagement')}\n </h4>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <button\n onClick={handleExportData}\n className=\"flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-xs text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <ArrowDownTrayIcon className=\"h-4 w-4 mr-2\" />\n {t('exportMyData')}\n </button>\n\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"flex items-center justify-center px-4 py-2 border border-red-300 rounded-md shadow-xs text-sm font-medium text-red-700 bg-white hover:bg-red-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500\"\n >\n <TrashIcon className=\"h-4 w-4 mr-2\" />\n {t('deleteAllData')}\n </button>\n </div>\n\n <p className=\"mt-2 text-xs text-gray-500\">\n {t('dataManagementDescription')}\n </p>\n </div>\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"mt-6 flex flex-wrap gap-2 justify-center\">\n <button\n type=\"button\"\n onClick={() => {\n setConsent(prev => prev ? {\n ...prev,\n necessary: true,\n analytics: false,\n marketing: false,\n preferences: false\n } : null);\n }}\n disabled={isLoading}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors\"\n >\n {t('rejectAll')}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setConsent(prev => prev ? {\n ...prev,\n necessary: true,\n analytics: true,\n marketing: true,\n preferences: true\n } : null);\n }}\n disabled={isLoading}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 transition-colors\"\n >\n {t('acceptAll')}\n </button>\n </div>\n\n {/* Action buttons */}\n <div className=\"mt-6 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={isLoading}\n className=\"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50\"\n >\n {isLoading ? t('saving') : t('saveChanges')}\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm\"\n >\n {t('cancel')}\n </button>\n </div>\n </div>\n </div>\n\n {/* Delete confirmation modal */}\n {showDeleteConfirm && (\n <div className=\"fixed inset-0 z-60 overflow-y-auto\">\n <div className=\"flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0\">\n <div className=\"fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75\" />\n <div className=\"inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6\">\n <div className=\"sm:flex sm:items-start\">\n <div className=\"mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10\">\n <TrashIcon className=\"h-6 w-6 text-red-600\" />\n </div>\n <div className=\"mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left\">\n <h3 className=\"text-lg leading-6 font-medium text-gray-900\">\n {t('deleteConfirmTitle')}\n </h3>\n <div className=\"mt-2\">\n <p className=\"text-sm text-gray-500\">\n {t('deleteConfirmDescription')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"mt-5 sm:mt-4 sm:flex sm:flex-row-reverse\">\n <button\n type=\"button\"\n onClick={handleDeleteAllData}\n className=\"w-full inline-flex justify-center rounded-md border border-transparent shadow-xs px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm\"\n >\n {t('deleteAllData')}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowDeleteConfirm(false)}\n className=\"mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-xs px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-hidden focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm\"\n >\n {t('cancel')}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default CookiePreferences;"],"names":["ArrowDownTrayIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CogIcon","ShieldCheckIcon","CookiePreferences","isOpen","onClose","_t","useTranslation","k","p","consent","setConsent","useState","isLoading","setIsLoading","showDeleteConfirm","setShowDeleteConfirm","onCloseRef","useRef","useEffect","currentConsent","getCookieConsent","handleEsc","event","handleSave","setCookieConsent","handleCategoryToggle","categoryId","prev","handleExportData","data","exportUserData","blob","url","a","handleDeleteAllData","deleteAllUserData","jsxs","jsx","XMarkIcon","COOKIE_CATEGORIES","category","cookie","TrashIcon"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1,2 +1,2 @@
1
- import{K as lt,M as dt}from"./index-DESF7by4.js";import{r as l}from"./vendor-DJo4KD8w.js";import{j as u}from"./query-B6BuIB0M.js";import"./i18n-BbpF47i1.js";function ut(t,d,s,o,a=1){const w=Math.min(t.startX,t.endX),j=Math.min(t.startY,t.endY),S=Math.max(t.startX,t.endX),b=Math.max(t.startY,t.endY),F=w/a,D=(S-w)/a,E=o-b/a,h=(b-j)/a;return{page:d,x:Math.round(F),y:Math.round(E),width:Math.round(D),height:Math.round(h)}}function V(t,d,s=1){const o=t.x*s,a=t.width*s,w=(d-t.y-t.height)*s,j=t.height*s;return{x:o,y:w,width:a,height:j}}function ht(t){return`page=${t.page}&viewrect=${t.x},${t.y},${t.width},${t.height}`}function J(t){try{const d=t.match(/page=(\d+)/);if(!d)return null;const s=parseInt(d[1],10),o=t.match(/viewrect=([\d.]+),([\d.]+),([\d.]+),([\d.]+)/);return o?{page:s,x:parseFloat(o[1]),y:parseFloat(o[2]),width:parseFloat(o[3]),height:parseFloat(o[4])}:null}catch{return null}}function ft(t){const d=t.match(/page=(\d+)/);return d?parseInt(d[1],10):null}async function gt(){return typeof window<"u"&&window.pdfjsLib?window.pdfjsLib:new Promise((t,d)=>{const s=document.createElement("script");s.src="/pdfjs/pdf.min.mjs",s.type="module",s.onload=()=>{const o=window.pdfjsLib;if(!o){d(new Error("PDF.js loaded but pdfjsLib not available"));return}o.GlobalWorkerOptions.workerSrc="/pdfjs/pdf.worker.min.mjs",t(o)},s.onerror=()=>{d(new Error("Failed to load PDF.js from /pdfjs/pdf.min.mjs"))},document.head.appendChild(s)})}async function mt(t){return(await gt()).getDocument({url:t}).promise}async function pt(t,d=1){const s=t.getViewport({scale:d}),o=document.createElement("canvas"),a=o.getContext("2d");if(!a)throw new Error("Failed to get 2D context");return o.width=s.width,o.height=s.height,await t.render({canvasContext:a,viewport:s}).promise,{dataUrl:o.toDataURL("image/png"),width:s.width,height:s.height}}function K(t){if(!t)return{stroke:"rgb(156, 163, 175)",fill:"rgba(156, 163, 175, 0.2)"};switch(t){case"highlighting":return{stroke:"rgb(250, 204, 21)",fill:"rgba(250, 204, 21, 0.3)"};case"linking":return{stroke:"rgb(59, 130, 246)",fill:"rgba(59, 130, 246, 0.2)"};case"assessing":return{stroke:"rgb(239, 68, 68)",fill:"rgba(239, 68, 68, 0.2)"};case"commenting":return{stroke:"rgb(255, 255, 255)",fill:"rgba(255, 255, 255, 0.2)"};default:return{stroke:"rgb(156, 163, 175)",fill:"rgba(156, 163, 175, 0.2)"}}}function xt({pdfUrl:t,existingAnnotations:d=[],drawingMode:s,selectedMotivation:o,eventBus:a,hoveredAnnotationId:w,selectedAnnotationId:j,hoverDelayMs:S=150}){const[b,F]=l.useState(null),[D,E]=l.useState(0),[h,W]=l.useState(1),[N,Q]=l.useState(null),[A,C]=l.useState(!0),[H,L]=l.useState(null),[f,Z]=l.useState(null),[m,U]=l.useState(null),[z]=l.useState(1.5),[M,v]=l.useState(!1),[r,y]=l.useState(null),B=l.useRef(null),g=l.useRef(null);l.useEffect(()=>{let e=!1;async function n(){try{C(!0),L(null);const c=await mt(t);if(e)return;F(c),E(c.numPages),C(!1)}catch(c){if(e)return;console.error("Error loading PDF:",c),L("Failed to load PDF"),C(!1)}}return n(),()=>{e=!0}},[t]),l.useEffect(()=>{if(!b)return;let e=!1;const n=b;async function c(){try{const i=await n.getPage(h);if(e)return;const p=i.getViewport({scale:1});Z({width:p.width,height:p.height});const{dataUrl:x}=await pt(i,z);if(e)return;Q(x)}catch(i){if(e)return;console.error("Error loading page:",i),L("Failed to load page")}}return c(),()=>{e=!0}},[b,h,z]),l.useEffect(()=>{const e=()=>{g.current&&U({width:g.current.clientWidth,height:g.current.clientHeight})};e();let n=null;try{n=new ResizeObserver(e),g.current&&n.observe(g.current)}catch{console.warn("ResizeObserver not supported, falling back to window resize listener"),window.addEventListener("resize",e)}return()=>{n?n.disconnect():window.removeEventListener("resize",e)}},[N]);const tt=l.useCallback(e=>{if(!s||!g.current)return;const n=g.current.getBoundingClientRect(),c=e.clientX-n.left,i=e.clientY-n.top;v(!0),y({startX:c,startY:i,endX:c,endY:i})},[s]),et=l.useCallback(e=>{if(!M||!r||!g.current)return;const n=g.current.getBoundingClientRect();y({...r,endX:e.clientX-n.left,endY:e.clientY-n.top})},[M,r]),nt=l.useCallback(()=>{if(!M||!r||!f||!m||!a){v(!1),y(null);return}if(Math.sqrt(Math.pow(r.endX-r.startX,2)+Math.pow(r.endY-r.startY,2))<10){if(d.length>0){const k=$.find(T=>{const Y=I(T.target);if(!Y)return!1;const _=J(Y.value);if(!_)return!1;const P=V(_,f.height,1),R=m.width/f.width,q=m.height/f.height,O=P.x*R,G=P.y*q,it=P.width*R,ct=P.height*q;return r.endX>=O&&r.endX<=O+it&&r.endY>=G&&r.endY<=G+ct});if(k){a==null||a.get("browse:click").next({annotationId:k.id,motivation:k.motivation}),v(!1),y(null);return}}v(!1),y(null);return}const c=f.width/m.width,i=f.height/m.height,p={startX:r.startX*c,startY:r.startY*i,endX:r.endX*c,endY:r.endY*i},x=ut(p,h,f.width,f.height,1),X=ht(x);o&&a.get("mark:requested").next({selector:{type:"FragmentSelector",conformsTo:"http://tools.ietf.org/rfc/rfc3778",value:X},motivation:o}),v(!1)},[M,r,h,f,m,o,d]),I=e=>{const n=lt(e);if(!n)return null;const i=(Array.isArray(n)?n:[n]).find(p=>p.type==="FragmentSelector");return!i||i.type!=="FragmentSelector"?null:i},$=d.filter(e=>{const n=I(e.target);return n?ft(n.value)===h:!1}),{handleMouseEnter:rt,handleMouseLeave:st}=l.useMemo(()=>dt(e=>a==null?void 0:a.get("beckon:hover").next({annotationId:e}),S),[a,S]),{stroke:ot,fill:at}=K(o??null);return H?u.jsx("div",{className:"semiont-pdf-annotation-canvas__error",children:H}):u.jsxs("div",{className:"semiont-pdf-annotation-canvas",children:[A&&u.jsx("div",{className:"semiont-pdf-annotation-canvas__loading",children:"Loading PDF..."}),u.jsxs("div",{ref:B,className:"semiont-pdf-annotation-canvas__container",style:{display:A?"none":void 0},onMouseDown:tt,onMouseMove:et,onMouseUp:nt,onMouseLeave:()=>{M&&(v(!1),y(null))},"data-drawing-mode":s||"none",children:[N&&u.jsx("img",{ref:g,src:N,alt:`PDF page ${h}`,className:"semiont-pdf-annotation-canvas__image",draggable:!1,style:{pointerEvents:"none"},onLoad:()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{g.current&&U({width:g.current.clientWidth,height:g.current.clientHeight})})})}}),m&&f&&u.jsx("div",{className:"semiont-pdf-annotation-canvas__overlay-container",children:u.jsx("div",{className:"semiont-pdf-annotation-canvas__overlay",children:u.jsxs("svg",{className:"semiont-pdf-annotation-canvas__svg",width:m.width,height:m.height,children:[$.map(e=>{const n=I(e.target);if(!n)return null;const c=J(n.value);if(!c)return null;const i=V(c,f.height,1),p=m.width/f.width,x=m.height/f.height,X=e.id===w,k=e.id===j,T=e.motivation,{stroke:Y,fill:_}=K(T);return u.jsx("rect",{x:i.x*p,y:i.y*x,width:i.width*p,height:i.height*x,stroke:Y,strokeWidth:k?4:X?3:2,fill:_,style:{pointerEvents:"auto",cursor:"pointer",opacity:k?1:X?.9:.7},onClick:()=>a==null?void 0:a.get("browse:click").next({annotationId:e.id,motivation:e.motivation}),onMouseEnter:()=>rt(e.id),onMouseLeave:st},e.id)}),r&&(()=>{const e=Math.min(r.startX,r.endX),n=Math.min(r.startY,r.endY),c=Math.abs(r.endX-r.startX),i=Math.abs(r.endY-r.startY);return u.jsx("rect",{x:e,y:n,width:c,height:i,stroke:ot,strokeWidth:2,strokeDasharray:"5,5",fill:at,pointerEvents:"none"})})()]})})})]}),D>0&&u.jsxs("div",{className:"semiont-pdf-annotation-canvas__controls",children:[u.jsx("button",{disabled:h<=1,onClick:()=>W(h-1),className:"semiont-pdf-annotation-canvas__button",children:"Previous"}),u.jsxs("span",{className:"semiont-pdf-annotation-canvas__page-info",children:["Page ",h," of ",D]}),u.jsx("button",{disabled:h>=D,onClick:()=>W(h+1),className:"semiont-pdf-annotation-canvas__button",children:"Next"})]})]})}export{xt as PdfAnnotationCanvas};
2
- //# sourceMappingURL=PdfAnnotationCanvas.client-CHDCGQBR-BGx2owZ0.js.map
1
+ import{K as lt,M as dt}from"./index-C5oI0kaf.js";import{r as l}from"./vendor-DJo4KD8w.js";import{j as u}from"./query-B6BuIB0M.js";import"./i18n-BbpF47i1.js";function ut(t,d,s,o,a=1){const w=Math.min(t.startX,t.endX),j=Math.min(t.startY,t.endY),S=Math.max(t.startX,t.endX),b=Math.max(t.startY,t.endY),F=w/a,D=(S-w)/a,E=o-b/a,h=(b-j)/a;return{page:d,x:Math.round(F),y:Math.round(E),width:Math.round(D),height:Math.round(h)}}function V(t,d,s=1){const o=t.x*s,a=t.width*s,w=(d-t.y-t.height)*s,j=t.height*s;return{x:o,y:w,width:a,height:j}}function ht(t){return`page=${t.page}&viewrect=${t.x},${t.y},${t.width},${t.height}`}function J(t){try{const d=t.match(/page=(\d+)/);if(!d)return null;const s=parseInt(d[1],10),o=t.match(/viewrect=([\d.]+),([\d.]+),([\d.]+),([\d.]+)/);return o?{page:s,x:parseFloat(o[1]),y:parseFloat(o[2]),width:parseFloat(o[3]),height:parseFloat(o[4])}:null}catch{return null}}function ft(t){const d=t.match(/page=(\d+)/);return d?parseInt(d[1],10):null}async function gt(){return typeof window<"u"&&window.pdfjsLib?window.pdfjsLib:new Promise((t,d)=>{const s=document.createElement("script");s.src="/pdfjs/pdf.min.mjs",s.type="module",s.onload=()=>{const o=window.pdfjsLib;if(!o){d(new Error("PDF.js loaded but pdfjsLib not available"));return}o.GlobalWorkerOptions.workerSrc="/pdfjs/pdf.worker.min.mjs",t(o)},s.onerror=()=>{d(new Error("Failed to load PDF.js from /pdfjs/pdf.min.mjs"))},document.head.appendChild(s)})}async function mt(t){return(await gt()).getDocument({url:t}).promise}async function pt(t,d=1){const s=t.getViewport({scale:d}),o=document.createElement("canvas"),a=o.getContext("2d");if(!a)throw new Error("Failed to get 2D context");return o.width=s.width,o.height=s.height,await t.render({canvasContext:a,viewport:s}).promise,{dataUrl:o.toDataURL("image/png"),width:s.width,height:s.height}}function K(t){if(!t)return{stroke:"rgb(156, 163, 175)",fill:"rgba(156, 163, 175, 0.2)"};switch(t){case"highlighting":return{stroke:"rgb(250, 204, 21)",fill:"rgba(250, 204, 21, 0.3)"};case"linking":return{stroke:"rgb(59, 130, 246)",fill:"rgba(59, 130, 246, 0.2)"};case"assessing":return{stroke:"rgb(239, 68, 68)",fill:"rgba(239, 68, 68, 0.2)"};case"commenting":return{stroke:"rgb(255, 255, 255)",fill:"rgba(255, 255, 255, 0.2)"};default:return{stroke:"rgb(156, 163, 175)",fill:"rgba(156, 163, 175, 0.2)"}}}function xt({pdfUrl:t,existingAnnotations:d=[],drawingMode:s,selectedMotivation:o,eventBus:a,hoveredAnnotationId:w,selectedAnnotationId:j,hoverDelayMs:S=150}){const[b,F]=l.useState(null),[D,E]=l.useState(0),[h,W]=l.useState(1),[N,Q]=l.useState(null),[A,C]=l.useState(!0),[H,L]=l.useState(null),[f,Z]=l.useState(null),[m,U]=l.useState(null),[z]=l.useState(1.5),[M,v]=l.useState(!1),[r,y]=l.useState(null),B=l.useRef(null),g=l.useRef(null);l.useEffect(()=>{let e=!1;async function n(){try{C(!0),L(null);const c=await mt(t);if(e)return;F(c),E(c.numPages),C(!1)}catch(c){if(e)return;console.error("Error loading PDF:",c),L("Failed to load PDF"),C(!1)}}return n(),()=>{e=!0}},[t]),l.useEffect(()=>{if(!b)return;let e=!1;const n=b;async function c(){try{const i=await n.getPage(h);if(e)return;const p=i.getViewport({scale:1});Z({width:p.width,height:p.height});const{dataUrl:x}=await pt(i,z);if(e)return;Q(x)}catch(i){if(e)return;console.error("Error loading page:",i),L("Failed to load page")}}return c(),()=>{e=!0}},[b,h,z]),l.useEffect(()=>{const e=()=>{g.current&&U({width:g.current.clientWidth,height:g.current.clientHeight})};e();let n=null;try{n=new ResizeObserver(e),g.current&&n.observe(g.current)}catch{console.warn("ResizeObserver not supported, falling back to window resize listener"),window.addEventListener("resize",e)}return()=>{n?n.disconnect():window.removeEventListener("resize",e)}},[N]);const tt=l.useCallback(e=>{if(!s||!g.current)return;const n=g.current.getBoundingClientRect(),c=e.clientX-n.left,i=e.clientY-n.top;v(!0),y({startX:c,startY:i,endX:c,endY:i})},[s]),et=l.useCallback(e=>{if(!M||!r||!g.current)return;const n=g.current.getBoundingClientRect();y({...r,endX:e.clientX-n.left,endY:e.clientY-n.top})},[M,r]),nt=l.useCallback(()=>{if(!M||!r||!f||!m||!a){v(!1),y(null);return}if(Math.sqrt(Math.pow(r.endX-r.startX,2)+Math.pow(r.endY-r.startY,2))<10){if(d.length>0){const k=$.find(T=>{const Y=I(T.target);if(!Y)return!1;const _=J(Y.value);if(!_)return!1;const P=V(_,f.height,1),R=m.width/f.width,q=m.height/f.height,O=P.x*R,G=P.y*q,it=P.width*R,ct=P.height*q;return r.endX>=O&&r.endX<=O+it&&r.endY>=G&&r.endY<=G+ct});if(k){a==null||a.get("browse:click").next({annotationId:k.id,motivation:k.motivation}),v(!1),y(null);return}}v(!1),y(null);return}const c=f.width/m.width,i=f.height/m.height,p={startX:r.startX*c,startY:r.startY*i,endX:r.endX*c,endY:r.endY*i},x=ut(p,h,f.width,f.height,1),X=ht(x);o&&a.get("mark:requested").next({selector:{type:"FragmentSelector",conformsTo:"http://tools.ietf.org/rfc/rfc3778",value:X},motivation:o}),v(!1)},[M,r,h,f,m,o,d]),I=e=>{const n=lt(e);if(!n)return null;const i=(Array.isArray(n)?n:[n]).find(p=>p.type==="FragmentSelector");return!i||i.type!=="FragmentSelector"?null:i},$=d.filter(e=>{const n=I(e.target);return n?ft(n.value)===h:!1}),{handleMouseEnter:rt,handleMouseLeave:st}=l.useMemo(()=>dt(e=>a==null?void 0:a.get("beckon:hover").next({annotationId:e}),S),[a,S]),{stroke:ot,fill:at}=K(o??null);return H?u.jsx("div",{className:"semiont-pdf-annotation-canvas__error",children:H}):u.jsxs("div",{className:"semiont-pdf-annotation-canvas",children:[A&&u.jsx("div",{className:"semiont-pdf-annotation-canvas__loading",children:"Loading PDF..."}),u.jsxs("div",{ref:B,className:"semiont-pdf-annotation-canvas__container",style:{display:A?"none":void 0},onMouseDown:tt,onMouseMove:et,onMouseUp:nt,onMouseLeave:()=>{M&&(v(!1),y(null))},"data-drawing-mode":s||"none",children:[N&&u.jsx("img",{ref:g,src:N,alt:`PDF page ${h}`,className:"semiont-pdf-annotation-canvas__image",draggable:!1,style:{pointerEvents:"none"},onLoad:()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{g.current&&U({width:g.current.clientWidth,height:g.current.clientHeight})})})}}),m&&f&&u.jsx("div",{className:"semiont-pdf-annotation-canvas__overlay-container",children:u.jsx("div",{className:"semiont-pdf-annotation-canvas__overlay",children:u.jsxs("svg",{className:"semiont-pdf-annotation-canvas__svg",width:m.width,height:m.height,children:[$.map(e=>{const n=I(e.target);if(!n)return null;const c=J(n.value);if(!c)return null;const i=V(c,f.height,1),p=m.width/f.width,x=m.height/f.height,X=e.id===w,k=e.id===j,T=e.motivation,{stroke:Y,fill:_}=K(T);return u.jsx("rect",{x:i.x*p,y:i.y*x,width:i.width*p,height:i.height*x,stroke:Y,strokeWidth:k?4:X?3:2,fill:_,style:{pointerEvents:"auto",cursor:"pointer",opacity:k?1:X?.9:.7},onClick:()=>a==null?void 0:a.get("browse:click").next({annotationId:e.id,motivation:e.motivation}),onMouseEnter:()=>rt(e.id),onMouseLeave:st},e.id)}),r&&(()=>{const e=Math.min(r.startX,r.endX),n=Math.min(r.startY,r.endY),c=Math.abs(r.endX-r.startX),i=Math.abs(r.endY-r.startY);return u.jsx("rect",{x:e,y:n,width:c,height:i,stroke:ot,strokeWidth:2,strokeDasharray:"5,5",fill:at,pointerEvents:"none"})})()]})})})]}),D>0&&u.jsxs("div",{className:"semiont-pdf-annotation-canvas__controls",children:[u.jsx("button",{disabled:h<=1,onClick:()=>W(h-1),className:"semiont-pdf-annotation-canvas__button",children:"Previous"}),u.jsxs("span",{className:"semiont-pdf-annotation-canvas__page-info",children:["Page ",h," of ",D]}),u.jsx("button",{disabled:h>=D,onClick:()=>W(h+1),className:"semiont-pdf-annotation-canvas__button",children:"Next"})]})]})}export{xt as PdfAnnotationCanvas};
2
+ //# sourceMappingURL=PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PdfAnnotationCanvas.client-CHDCGQBR-BGx2owZ0.js","sources":["../../../../packages/react-ui/dist/PdfAnnotationCanvas.client-CHDCGQBR.mjs"],"sourcesContent":["'use client';\n\"use client\";\nimport {\n createHoverHandlers\n} from \"./chunk-VN5NY4SN.mjs\";\nimport \"./chunk-OZICDVH7.mjs\";\nimport \"./chunk-D4GAAQMM.mjs\";\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { useRef, useState, useCallback, useEffect, useMemo } from \"react\";\nimport { getTargetSelector } from \"@semiont/api-client\";\n\n// src/lib/pdf-coordinates.ts\nfunction canvasToPdfCoordinates(canvasRect, page, _pageWidth, pageHeight, scale = 1) {\n const x1 = Math.min(canvasRect.startX, canvasRect.endX);\n const y1 = Math.min(canvasRect.startY, canvasRect.endY);\n const x2 = Math.max(canvasRect.startX, canvasRect.endX);\n const y2 = Math.max(canvasRect.startY, canvasRect.endY);\n const pdfX = x1 / scale;\n const pdfWidth = (x2 - x1) / scale;\n const pdfY = pageHeight - y2 / scale;\n const pdfHeight = (y2 - y1) / scale;\n return {\n page,\n x: Math.round(pdfX),\n y: Math.round(pdfY),\n width: Math.round(pdfWidth),\n height: Math.round(pdfHeight)\n };\n}\nfunction pdfToCanvasCoordinates(pdfCoord, pageHeight, scale = 1) {\n const canvasX = pdfCoord.x * scale;\n const canvasWidth = pdfCoord.width * scale;\n const canvasY = (pageHeight - pdfCoord.y - pdfCoord.height) * scale;\n const canvasHeight = pdfCoord.height * scale;\n return {\n x: canvasX,\n y: canvasY,\n width: canvasWidth,\n height: canvasHeight\n };\n}\nfunction createFragmentSelector(coord) {\n return `page=${coord.page}&viewrect=${coord.x},${coord.y},${coord.width},${coord.height}`;\n}\nfunction parseFragmentSelector(fragment) {\n try {\n const pageMatch = fragment.match(/page=(\\d+)/);\n if (!pageMatch) return null;\n const page = parseInt(pageMatch[1], 10);\n const viewrectMatch = fragment.match(/viewrect=([\\d.]+),([\\d.]+),([\\d.]+),([\\d.]+)/);\n if (!viewrectMatch) return null;\n return {\n page,\n x: parseFloat(viewrectMatch[1]),\n y: parseFloat(viewrectMatch[2]),\n width: parseFloat(viewrectMatch[3]),\n height: parseFloat(viewrectMatch[4])\n };\n } catch {\n return null;\n }\n}\nfunction getPageFromFragment(fragment) {\n const match = fragment.match(/page=(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\n// src/lib/browser-pdfjs.ts\nasync function ensurePdfJs() {\n if (typeof window !== \"undefined\" && window.pdfjsLib) {\n return window.pdfjsLib;\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"/pdfjs/pdf.min.mjs\";\n script.type = \"module\";\n script.onload = () => {\n const pdfjsLib = window.pdfjsLib;\n if (!pdfjsLib) {\n reject(new Error(\"PDF.js loaded but pdfjsLib not available\"));\n return;\n }\n pdfjsLib.GlobalWorkerOptions.workerSrc = \"/pdfjs/pdf.worker.min.mjs\";\n resolve(pdfjsLib);\n };\n script.onerror = () => {\n reject(new Error(\"Failed to load PDF.js from /pdfjs/pdf.min.mjs\"));\n };\n document.head.appendChild(script);\n });\n}\nasync function loadPdfDocument(url) {\n const pdfjsLib = await ensurePdfJs();\n const loadingTask = pdfjsLib.getDocument({ url });\n return loadingTask.promise;\n}\nasync function renderPdfPageToDataUrl(page, scale = 1) {\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Failed to get 2D context\");\n }\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const renderTask = page.render({\n canvasContext: context,\n viewport\n });\n await renderTask.promise;\n return {\n dataUrl: canvas.toDataURL(\"image/png\"),\n width: viewport.width,\n height: viewport.height\n };\n}\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nfunction getMotivationColor(motivation) {\n if (!motivation) {\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n switch (motivation) {\n case \"highlighting\":\n return { stroke: \"rgb(250, 204, 21)\", fill: \"rgba(250, 204, 21, 0.3)\" };\n case \"linking\":\n return { stroke: \"rgb(59, 130, 246)\", fill: \"rgba(59, 130, 246, 0.2)\" };\n case \"assessing\":\n return { stroke: \"rgb(239, 68, 68)\", fill: \"rgba(239, 68, 68, 0.2)\" };\n case \"commenting\":\n return { stroke: \"rgb(255, 255, 255)\", fill: \"rgba(255, 255, 255, 0.2)\" };\n default:\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n}\nfunction PdfAnnotationCanvas({\n pdfUrl,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n eventBus,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs = 150\n}) {\n const [pdfDoc, setPdfDoc] = useState(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [pageImageUrl, setPageImageUrl] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n const [pageDimensions, setPageDimensions] = useState(null);\n const [displayDimensions, setDisplayDimensions] = useState(null);\n const [scale] = useState(1.5);\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState(null);\n const containerRef = useRef(null);\n const imageRef = useRef(null);\n useEffect(() => {\n let cancelled = false;\n async function loadPdf() {\n try {\n setIsLoading(true);\n setError(null);\n const doc = await loadPdfDocument(pdfUrl);\n if (cancelled) return;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading PDF:\", err);\n setError(\"Failed to load PDF\");\n setIsLoading(false);\n }\n }\n loadPdf();\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n async function loadPage() {\n try {\n const page = await doc.getPage(pageNumber);\n if (cancelled) return;\n const viewport = page.getViewport({ scale: 1 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height\n });\n const { dataUrl } = await renderPdfPageToDataUrl(page, scale);\n if (cancelled) return;\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading page:\", err);\n setError(\"Failed to load page\");\n }\n }\n loadPage();\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, pageNumber, scale]);\n useEffect(() => {\n const updateDisplayDimensions = () => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n };\n updateDisplayDimensions();\n let resizeObserver = null;\n try {\n resizeObserver = new ResizeObserver(updateDisplayDimensions);\n if (imageRef.current) {\n resizeObserver.observe(imageRef.current);\n }\n } catch (error2) {\n console.warn(\"ResizeObserver not supported, falling back to window resize listener\");\n window.addEventListener(\"resize\", updateDisplayDimensions);\n }\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else {\n window.removeEventListener(\"resize\", updateDisplayDimensions);\n }\n };\n }, [pageImageUrl]);\n const handleMouseDown = useCallback((e) => {\n if (!drawingMode) return;\n if (!imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setIsDrawing(true);\n setSelection({\n startX: x,\n startY: y,\n endX: x,\n endY: y\n });\n }, [drawingMode]);\n const handleMouseMove = useCallback((e) => {\n if (!isDrawing || !selection || !imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n setSelection({\n ...selection,\n endX: e.clientX - rect.left,\n endY: e.clientY - rect.top\n });\n }, [isDrawing, selection]);\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !selection || !pageDimensions || !displayDimensions || !eventBus) {\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const dragDistance = Math.sqrt(\n Math.pow(selection.endX - selection.startX, 2) + Math.pow(selection.endY - selection.startY, 2)\n );\n const MIN_DRAG_DISTANCE = 10;\n if (dragDistance < MIN_DRAG_DISTANCE) {\n if (existingAnnotations.length > 0) {\n const clickedAnnotation = pageAnnotations.find((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const pdfCoord2 = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord2) return false;\n const rect = pdfToCanvasCoordinates(pdfCoord2, pageDimensions.height, 1);\n const scaleX2 = displayDimensions.width / pageDimensions.width;\n const scaleY2 = displayDimensions.height / pageDimensions.height;\n const displayX = rect.x * scaleX2;\n const displayY = rect.y * scaleY2;\n const displayWidth = rect.width * scaleX2;\n const displayHeight = rect.height * scaleY2;\n return selection.endX >= displayX && selection.endX <= displayX + displayWidth && selection.endY >= displayY && selection.endY <= displayY + displayHeight;\n });\n if (clickedAnnotation) {\n eventBus?.get(\"browse:click\").next({ annotationId: clickedAnnotation.id, motivation: clickedAnnotation.motivation });\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n }\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const scaleX = pageDimensions.width / displayDimensions.width;\n const scaleY = pageDimensions.height / displayDimensions.height;\n const nativeSelection = {\n startX: selection.startX * scaleX,\n startY: selection.startY * scaleY,\n endX: selection.endX * scaleX,\n endY: selection.endY * scaleY\n };\n const pdfCoord = canvasToPdfCoordinates(\n nativeSelection,\n pageNumber,\n pageDimensions.width,\n pageDimensions.height,\n 1\n // Use scale 1.0 since we already scaled to native coords\n );\n const fragmentSelector = createFragmentSelector(pdfCoord);\n if (selectedMotivation) {\n eventBus.get(\"mark:requested\").next({\n selector: {\n type: \"FragmentSelector\",\n conformsTo: \"http://tools.ietf.org/rfc/rfc3778\",\n value: fragmentSelector\n },\n motivation: selectedMotivation\n });\n }\n setIsDrawing(false);\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, selectedMotivation, existingAnnotations]);\n const getFragmentSelector = (target) => {\n const selector = getTargetSelector(target);\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find((s) => s.type === \"FragmentSelector\");\n if (!found || found.type !== \"FragmentSelector\") return null;\n return found;\n };\n const pageAnnotations = existingAnnotations.filter((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const page = getPageFromFragment(fragmentSel.value);\n return page === pageNumber;\n });\n const { handleMouseEnter, handleMouseLeave } = useMemo(\n () => createHoverHandlers((annotationId) => eventBus?.get(\"beckon:hover\").next({ annotationId }), hoverDelayMs),\n [eventBus, hoverDelayMs]\n );\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n if (error) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__error\", children: error });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas\", children: [\n isLoading && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__loading\", children: \"Loading PDF...\" }),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n ref: containerRef,\n className: \"semiont-pdf-annotation-canvas__container\",\n style: { display: isLoading ? \"none\" : void 0 },\n onMouseDown: handleMouseDown,\n onMouseMove: handleMouseMove,\n onMouseUp: handleMouseUp,\n onMouseLeave: () => {\n if (isDrawing) {\n setIsDrawing(false);\n setSelection(null);\n }\n },\n \"data-drawing-mode\": drawingMode || \"none\",\n children: [\n pageImageUrl && /* @__PURE__ */ jsx(\n \"img\",\n {\n ref: imageRef,\n src: pageImageUrl,\n alt: `PDF page ${pageNumber}`,\n className: \"semiont-pdf-annotation-canvas__image\",\n draggable: false,\n style: { pointerEvents: \"none\" },\n onLoad: () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n });\n });\n }\n }\n ),\n displayDimensions && pageDimensions && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay-container\", children: /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"semiont-pdf-annotation-canvas__svg\",\n width: displayDimensions.width,\n height: displayDimensions.height,\n children: [\n pageAnnotations.map((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return null;\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return null;\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1);\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n const isHovered = ann.id === hoveredAnnotationId;\n const isSelected = ann.id === selectedAnnotationId;\n const annMotivation = ann.motivation;\n const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rect.x * scaleX,\n y: rect.y * scaleY,\n width: rect.width * scaleX,\n height: rect.height * scaleY,\n stroke: annStroke,\n strokeWidth: isSelected ? 4 : isHovered ? 3 : 2,\n fill: annFill,\n style: {\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7\n },\n onClick: () => eventBus?.get(\"browse:click\").next({ annotationId: ann.id, motivation: ann.motivation }),\n onMouseEnter: () => handleMouseEnter(ann.id),\n onMouseLeave: handleMouseLeave\n },\n ann.id\n );\n }),\n selection && (() => {\n const rectX = Math.min(selection.startX, selection.endX);\n const rectY = Math.min(selection.startY, selection.endY);\n const rectWidth = Math.abs(selection.endX - selection.startX);\n const rectHeight = Math.abs(selection.endY - selection.startY);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n stroke,\n strokeWidth: 2,\n strokeDasharray: \"5,5\",\n fill,\n pointerEvents: \"none\"\n }\n );\n })()\n ]\n }\n ) }) })\n ]\n }\n ),\n numPages > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas__controls\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber <= 1,\n onClick: () => setPageNumber(pageNumber - 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Previous\"\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"semiont-pdf-annotation-canvas__page-info\", children: [\n \"Page \",\n pageNumber,\n \" of \",\n numPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber >= numPages,\n onClick: () => setPageNumber(pageNumber + 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Next\"\n }\n )\n ] })\n ] });\n}\nexport {\n PdfAnnotationCanvas\n};\n//# sourceMappingURL=PdfAnnotationCanvas.client-CHDCGQBR.mjs.map"],"names":["canvasToPdfCoordinates","canvasRect","page","_pageWidth","pageHeight","scale","x1","y1","x2","y2","pdfX","pdfWidth","pdfY","pdfHeight","pdfToCanvasCoordinates","pdfCoord","canvasX","canvasWidth","canvasY","canvasHeight","createFragmentSelector","coord","parseFragmentSelector","fragment","pageMatch","viewrectMatch","getPageFromFragment","match","ensurePdfJs","resolve","reject","script","pdfjsLib","loadPdfDocument","url","renderPdfPageToDataUrl","viewport","canvas","context","getMotivationColor","motivation","PdfAnnotationCanvas","pdfUrl","existingAnnotations","drawingMode","selectedMotivation","eventBus","hoveredAnnotationId","selectedAnnotationId","hoverDelayMs","pdfDoc","setPdfDoc","useState","numPages","setNumPages","pageNumber","setPageNumber","pageImageUrl","setPageImageUrl","isLoading","setIsLoading","error","setError","pageDimensions","setPageDimensions","displayDimensions","setDisplayDimensions","isDrawing","setIsDrawing","selection","setSelection","containerRef","useRef","imageRef","useEffect","cancelled","loadPdf","doc","err","loadPage","dataUrl","updateDisplayDimensions","resizeObserver","handleMouseDown","useCallback","rect","x","y","handleMouseMove","handleMouseUp","clickedAnnotation","pageAnnotations","ann","fragmentSel","getFragmentSelector","pdfCoord2","scaleX2","scaleY2","displayX","displayY","displayWidth","displayHeight","scaleX","scaleY","nativeSelection","fragmentSelector","target","selector","getTargetSelector","found","s","handleMouseEnter","handleMouseLeave","useMemo","createHoverHandlers","annotationId","stroke","fill","jsx","jsxs","isHovered","isSelected","annMotivation","annStroke","annFill","rectX","rectY","rectWidth","rectHeight"],"mappings":"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"}
1
+ {"version":3,"file":"PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js","sources":["../../../../packages/react-ui/dist/PdfAnnotationCanvas.client-CHDCGQBR.mjs"],"sourcesContent":["'use client';\n\"use client\";\nimport {\n createHoverHandlers\n} from \"./chunk-VN5NY4SN.mjs\";\nimport \"./chunk-OZICDVH7.mjs\";\nimport \"./chunk-D4GAAQMM.mjs\";\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { useRef, useState, useCallback, useEffect, useMemo } from \"react\";\nimport { getTargetSelector } from \"@semiont/api-client\";\n\n// src/lib/pdf-coordinates.ts\nfunction canvasToPdfCoordinates(canvasRect, page, _pageWidth, pageHeight, scale = 1) {\n const x1 = Math.min(canvasRect.startX, canvasRect.endX);\n const y1 = Math.min(canvasRect.startY, canvasRect.endY);\n const x2 = Math.max(canvasRect.startX, canvasRect.endX);\n const y2 = Math.max(canvasRect.startY, canvasRect.endY);\n const pdfX = x1 / scale;\n const pdfWidth = (x2 - x1) / scale;\n const pdfY = pageHeight - y2 / scale;\n const pdfHeight = (y2 - y1) / scale;\n return {\n page,\n x: Math.round(pdfX),\n y: Math.round(pdfY),\n width: Math.round(pdfWidth),\n height: Math.round(pdfHeight)\n };\n}\nfunction pdfToCanvasCoordinates(pdfCoord, pageHeight, scale = 1) {\n const canvasX = pdfCoord.x * scale;\n const canvasWidth = pdfCoord.width * scale;\n const canvasY = (pageHeight - pdfCoord.y - pdfCoord.height) * scale;\n const canvasHeight = pdfCoord.height * scale;\n return {\n x: canvasX,\n y: canvasY,\n width: canvasWidth,\n height: canvasHeight\n };\n}\nfunction createFragmentSelector(coord) {\n return `page=${coord.page}&viewrect=${coord.x},${coord.y},${coord.width},${coord.height}`;\n}\nfunction parseFragmentSelector(fragment) {\n try {\n const pageMatch = fragment.match(/page=(\\d+)/);\n if (!pageMatch) return null;\n const page = parseInt(pageMatch[1], 10);\n const viewrectMatch = fragment.match(/viewrect=([\\d.]+),([\\d.]+),([\\d.]+),([\\d.]+)/);\n if (!viewrectMatch) return null;\n return {\n page,\n x: parseFloat(viewrectMatch[1]),\n y: parseFloat(viewrectMatch[2]),\n width: parseFloat(viewrectMatch[3]),\n height: parseFloat(viewrectMatch[4])\n };\n } catch {\n return null;\n }\n}\nfunction getPageFromFragment(fragment) {\n const match = fragment.match(/page=(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\n// src/lib/browser-pdfjs.ts\nasync function ensurePdfJs() {\n if (typeof window !== \"undefined\" && window.pdfjsLib) {\n return window.pdfjsLib;\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"/pdfjs/pdf.min.mjs\";\n script.type = \"module\";\n script.onload = () => {\n const pdfjsLib = window.pdfjsLib;\n if (!pdfjsLib) {\n reject(new Error(\"PDF.js loaded but pdfjsLib not available\"));\n return;\n }\n pdfjsLib.GlobalWorkerOptions.workerSrc = \"/pdfjs/pdf.worker.min.mjs\";\n resolve(pdfjsLib);\n };\n script.onerror = () => {\n reject(new Error(\"Failed to load PDF.js from /pdfjs/pdf.min.mjs\"));\n };\n document.head.appendChild(script);\n });\n}\nasync function loadPdfDocument(url) {\n const pdfjsLib = await ensurePdfJs();\n const loadingTask = pdfjsLib.getDocument({ url });\n return loadingTask.promise;\n}\nasync function renderPdfPageToDataUrl(page, scale = 1) {\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Failed to get 2D context\");\n }\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const renderTask = page.render({\n canvasContext: context,\n viewport\n });\n await renderTask.promise;\n return {\n dataUrl: canvas.toDataURL(\"image/png\"),\n width: viewport.width,\n height: viewport.height\n };\n}\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nfunction getMotivationColor(motivation) {\n if (!motivation) {\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n switch (motivation) {\n case \"highlighting\":\n return { stroke: \"rgb(250, 204, 21)\", fill: \"rgba(250, 204, 21, 0.3)\" };\n case \"linking\":\n return { stroke: \"rgb(59, 130, 246)\", fill: \"rgba(59, 130, 246, 0.2)\" };\n case \"assessing\":\n return { stroke: \"rgb(239, 68, 68)\", fill: \"rgba(239, 68, 68, 0.2)\" };\n case \"commenting\":\n return { stroke: \"rgb(255, 255, 255)\", fill: \"rgba(255, 255, 255, 0.2)\" };\n default:\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n}\nfunction PdfAnnotationCanvas({\n pdfUrl,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n eventBus,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs = 150\n}) {\n const [pdfDoc, setPdfDoc] = useState(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [pageImageUrl, setPageImageUrl] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n const [pageDimensions, setPageDimensions] = useState(null);\n const [displayDimensions, setDisplayDimensions] = useState(null);\n const [scale] = useState(1.5);\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState(null);\n const containerRef = useRef(null);\n const imageRef = useRef(null);\n useEffect(() => {\n let cancelled = false;\n async function loadPdf() {\n try {\n setIsLoading(true);\n setError(null);\n const doc = await loadPdfDocument(pdfUrl);\n if (cancelled) return;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading PDF:\", err);\n setError(\"Failed to load PDF\");\n setIsLoading(false);\n }\n }\n loadPdf();\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n async function loadPage() {\n try {\n const page = await doc.getPage(pageNumber);\n if (cancelled) return;\n const viewport = page.getViewport({ scale: 1 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height\n });\n const { dataUrl } = await renderPdfPageToDataUrl(page, scale);\n if (cancelled) return;\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading page:\", err);\n setError(\"Failed to load page\");\n }\n }\n loadPage();\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, pageNumber, scale]);\n useEffect(() => {\n const updateDisplayDimensions = () => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n };\n updateDisplayDimensions();\n let resizeObserver = null;\n try {\n resizeObserver = new ResizeObserver(updateDisplayDimensions);\n if (imageRef.current) {\n resizeObserver.observe(imageRef.current);\n }\n } catch (error2) {\n console.warn(\"ResizeObserver not supported, falling back to window resize listener\");\n window.addEventListener(\"resize\", updateDisplayDimensions);\n }\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else {\n window.removeEventListener(\"resize\", updateDisplayDimensions);\n }\n };\n }, [pageImageUrl]);\n const handleMouseDown = useCallback((e) => {\n if (!drawingMode) return;\n if (!imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setIsDrawing(true);\n setSelection({\n startX: x,\n startY: y,\n endX: x,\n endY: y\n });\n }, [drawingMode]);\n const handleMouseMove = useCallback((e) => {\n if (!isDrawing || !selection || !imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n setSelection({\n ...selection,\n endX: e.clientX - rect.left,\n endY: e.clientY - rect.top\n });\n }, [isDrawing, selection]);\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !selection || !pageDimensions || !displayDimensions || !eventBus) {\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const dragDistance = Math.sqrt(\n Math.pow(selection.endX - selection.startX, 2) + Math.pow(selection.endY - selection.startY, 2)\n );\n const MIN_DRAG_DISTANCE = 10;\n if (dragDistance < MIN_DRAG_DISTANCE) {\n if (existingAnnotations.length > 0) {\n const clickedAnnotation = pageAnnotations.find((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const pdfCoord2 = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord2) return false;\n const rect = pdfToCanvasCoordinates(pdfCoord2, pageDimensions.height, 1);\n const scaleX2 = displayDimensions.width / pageDimensions.width;\n const scaleY2 = displayDimensions.height / pageDimensions.height;\n const displayX = rect.x * scaleX2;\n const displayY = rect.y * scaleY2;\n const displayWidth = rect.width * scaleX2;\n const displayHeight = rect.height * scaleY2;\n return selection.endX >= displayX && selection.endX <= displayX + displayWidth && selection.endY >= displayY && selection.endY <= displayY + displayHeight;\n });\n if (clickedAnnotation) {\n eventBus?.get(\"browse:click\").next({ annotationId: clickedAnnotation.id, motivation: clickedAnnotation.motivation });\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n }\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const scaleX = pageDimensions.width / displayDimensions.width;\n const scaleY = pageDimensions.height / displayDimensions.height;\n const nativeSelection = {\n startX: selection.startX * scaleX,\n startY: selection.startY * scaleY,\n endX: selection.endX * scaleX,\n endY: selection.endY * scaleY\n };\n const pdfCoord = canvasToPdfCoordinates(\n nativeSelection,\n pageNumber,\n pageDimensions.width,\n pageDimensions.height,\n 1\n // Use scale 1.0 since we already scaled to native coords\n );\n const fragmentSelector = createFragmentSelector(pdfCoord);\n if (selectedMotivation) {\n eventBus.get(\"mark:requested\").next({\n selector: {\n type: \"FragmentSelector\",\n conformsTo: \"http://tools.ietf.org/rfc/rfc3778\",\n value: fragmentSelector\n },\n motivation: selectedMotivation\n });\n }\n setIsDrawing(false);\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, selectedMotivation, existingAnnotations]);\n const getFragmentSelector = (target) => {\n const selector = getTargetSelector(target);\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find((s) => s.type === \"FragmentSelector\");\n if (!found || found.type !== \"FragmentSelector\") return null;\n return found;\n };\n const pageAnnotations = existingAnnotations.filter((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const page = getPageFromFragment(fragmentSel.value);\n return page === pageNumber;\n });\n const { handleMouseEnter, handleMouseLeave } = useMemo(\n () => createHoverHandlers((annotationId) => eventBus?.get(\"beckon:hover\").next({ annotationId }), hoverDelayMs),\n [eventBus, hoverDelayMs]\n );\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n if (error) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__error\", children: error });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas\", children: [\n isLoading && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__loading\", children: \"Loading PDF...\" }),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n ref: containerRef,\n className: \"semiont-pdf-annotation-canvas__container\",\n style: { display: isLoading ? \"none\" : void 0 },\n onMouseDown: handleMouseDown,\n onMouseMove: handleMouseMove,\n onMouseUp: handleMouseUp,\n onMouseLeave: () => {\n if (isDrawing) {\n setIsDrawing(false);\n setSelection(null);\n }\n },\n \"data-drawing-mode\": drawingMode || \"none\",\n children: [\n pageImageUrl && /* @__PURE__ */ jsx(\n \"img\",\n {\n ref: imageRef,\n src: pageImageUrl,\n alt: `PDF page ${pageNumber}`,\n className: \"semiont-pdf-annotation-canvas__image\",\n draggable: false,\n style: { pointerEvents: \"none\" },\n onLoad: () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n });\n });\n }\n }\n ),\n displayDimensions && pageDimensions && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay-container\", children: /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"semiont-pdf-annotation-canvas__svg\",\n width: displayDimensions.width,\n height: displayDimensions.height,\n children: [\n pageAnnotations.map((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return null;\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return null;\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1);\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n const isHovered = ann.id === hoveredAnnotationId;\n const isSelected = ann.id === selectedAnnotationId;\n const annMotivation = ann.motivation;\n const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rect.x * scaleX,\n y: rect.y * scaleY,\n width: rect.width * scaleX,\n height: rect.height * scaleY,\n stroke: annStroke,\n strokeWidth: isSelected ? 4 : isHovered ? 3 : 2,\n fill: annFill,\n style: {\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7\n },\n onClick: () => eventBus?.get(\"browse:click\").next({ annotationId: ann.id, motivation: ann.motivation }),\n onMouseEnter: () => handleMouseEnter(ann.id),\n onMouseLeave: handleMouseLeave\n },\n ann.id\n );\n }),\n selection && (() => {\n const rectX = Math.min(selection.startX, selection.endX);\n const rectY = Math.min(selection.startY, selection.endY);\n const rectWidth = Math.abs(selection.endX - selection.startX);\n const rectHeight = Math.abs(selection.endY - selection.startY);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n stroke,\n strokeWidth: 2,\n strokeDasharray: \"5,5\",\n fill,\n pointerEvents: \"none\"\n }\n );\n })()\n ]\n }\n ) }) })\n ]\n }\n ),\n numPages > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas__controls\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber <= 1,\n onClick: () => setPageNumber(pageNumber - 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Previous\"\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"semiont-pdf-annotation-canvas__page-info\", children: [\n \"Page \",\n pageNumber,\n \" of \",\n numPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber >= numPages,\n onClick: () => setPageNumber(pageNumber + 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Next\"\n }\n )\n ] })\n ] });\n}\nexport {\n PdfAnnotationCanvas\n};\n//# sourceMappingURL=PdfAnnotationCanvas.client-CHDCGQBR.mjs.map"],"names":["canvasToPdfCoordinates","canvasRect","page","_pageWidth","pageHeight","scale","x1","y1","x2","y2","pdfX","pdfWidth","pdfY","pdfHeight","pdfToCanvasCoordinates","pdfCoord","canvasX","canvasWidth","canvasY","canvasHeight","createFragmentSelector","coord","parseFragmentSelector","fragment","pageMatch","viewrectMatch","getPageFromFragment","match","ensurePdfJs","resolve","reject","script","pdfjsLib","loadPdfDocument","url","renderPdfPageToDataUrl","viewport","canvas","context","getMotivationColor","motivation","PdfAnnotationCanvas","pdfUrl","existingAnnotations","drawingMode","selectedMotivation","eventBus","hoveredAnnotationId","selectedAnnotationId","hoverDelayMs","pdfDoc","setPdfDoc","useState","numPages","setNumPages","pageNumber","setPageNumber","pageImageUrl","setPageImageUrl","isLoading","setIsLoading","error","setError","pageDimensions","setPageDimensions","displayDimensions","setDisplayDimensions","isDrawing","setIsDrawing","selection","setSelection","containerRef","useRef","imageRef","useEffect","cancelled","loadPdf","doc","err","loadPage","dataUrl","updateDisplayDimensions","resizeObserver","handleMouseDown","useCallback","rect","x","y","handleMouseMove","handleMouseUp","clickedAnnotation","pageAnnotations","ann","fragmentSel","getFragmentSelector","pdfCoord2","scaleX2","scaleY2","displayX","displayY","displayWidth","displayHeight","scaleX","scaleY","nativeSelection","fragmentSelector","target","selector","getTargetSelector","found","s","handleMouseEnter","handleMouseLeave","useMemo","createHoverHandlers","annotationId","stroke","fill","jsx","jsxs","isHovered","isSelected","annMotivation","annStroke","annFill","rectX","rectY","rectWidth","rectHeight"],"mappings":"6JAaA,SAASA,GAAuBC,EAAYC,EAAMC,EAAYC,EAAYC,EAAQ,EAAG,CACnF,MAAMC,EAAK,KAAK,IAAIL,EAAW,OAAQA,EAAW,IAAI,EAChDM,EAAK,KAAK,IAAIN,EAAW,OAAQA,EAAW,IAAI,EAChDO,EAAK,KAAK,IAAIP,EAAW,OAAQA,EAAW,IAAI,EAChDQ,EAAK,KAAK,IAAIR,EAAW,OAAQA,EAAW,IAAI,EAChDS,EAAOJ,EAAKD,EACZM,GAAYH,EAAKF,GAAMD,EACvBO,EAAOR,EAAaK,EAAKJ,EACzBQ,GAAaJ,EAAKF,GAAMF,EAC9B,MAAO,CACL,KAAAH,EACA,EAAG,KAAK,MAAMQ,CAAI,EAClB,EAAG,KAAK,MAAME,CAAI,EAClB,MAAO,KAAK,MAAMD,CAAQ,EAC1B,OAAQ,KAAK,MAAME,CAAS,CAChC,CACA,CACA,SAASC,EAAuBC,EAAUX,EAAYC,EAAQ,EAAG,CAC/D,MAAMW,EAAUD,EAAS,EAAIV,EACvBY,EAAcF,EAAS,MAAQV,EAC/Ba,GAAWd,EAAaW,EAAS,EAAIA,EAAS,QAAUV,EACxDc,EAAeJ,EAAS,OAASV,EACvC,MAAO,CACL,EAAGW,EACH,EAAGE,EACH,MAAOD,EACP,OAAQE,CACZ,CACA,CACA,SAASC,GAAuBC,EAAO,CACrC,MAAO,QAAQA,EAAM,IAAI,aAAaA,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,KAAK,IAAIA,EAAM,MAAM,EACzF,CACA,SAASC,EAAsBC,EAAU,CACvC,GAAI,CACF,MAAMC,EAAYD,EAAS,MAAM,YAAY,EAC7C,GAAI,CAACC,EAAW,OAAO,KACvB,MAAMtB,EAAO,SAASsB,EAAU,CAAC,EAAG,EAAE,EAChCC,EAAgBF,EAAS,MAAM,8CAA8C,EACnF,OAAKE,EACE,CACL,KAAAvB,EACA,EAAG,WAAWuB,EAAc,CAAC,CAAC,EAC9B,EAAG,WAAWA,EAAc,CAAC,CAAC,EAC9B,MAAO,WAAWA,EAAc,CAAC,CAAC,EAClC,OAAQ,WAAWA,EAAc,CAAC,CAAC,CACzC,EAP+B,IAQ7B,MAAQ,CACN,OAAO,IACT,CACF,CACA,SAASC,GAAoBH,EAAU,CACrC,MAAMI,EAAQJ,EAAS,MAAM,YAAY,EACzC,OAAOI,EAAQ,SAASA,EAAM,CAAC,EAAG,EAAE,EAAI,IAC1C,CAGA,eAAeC,IAAc,CAC3B,OAAI,OAAO,OAAW,KAAe,OAAO,SACnC,OAAO,SAET,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,MAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,IAAM,qBACbA,EAAO,KAAO,SACdA,EAAO,OAAS,IAAM,CACpB,MAAMC,EAAW,OAAO,SACxB,GAAI,CAACA,EAAU,CACbF,EAAO,IAAI,MAAM,0CAA0C,CAAC,EAC5D,MACF,CACAE,EAAS,oBAAoB,UAAY,4BACzCH,EAAQG,CAAQ,CAClB,EACAD,EAAO,QAAU,IAAM,CACrBD,EAAO,IAAI,MAAM,+CAA+C,CAAC,CACnE,EACA,SAAS,KAAK,YAAYC,CAAM,CAClC,CAAC,CACH,CACA,eAAeE,GAAgBC,EAAK,CAGlC,OAFiB,MAAMN,GAAW,GACL,YAAY,CAAE,IAAAM,CAAG,CAAE,EAC7B,OACrB,CACA,eAAeC,GAAuBjC,EAAMG,EAAQ,EAAG,CACrD,MAAM+B,EAAWlC,EAAK,YAAY,CAAE,MAAAG,CAAK,CAAE,EACrCgC,EAAS,SAAS,cAAc,QAAQ,EACxCC,EAAUD,EAAO,WAAW,IAAI,EACtC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,0BAA0B,EAE5C,OAAAD,EAAO,MAAQD,EAAS,MACxBC,EAAO,OAASD,EAAS,OAKzB,MAJmBlC,EAAK,OAAO,CAC7B,cAAeoC,EACf,SAAAF,CACJ,CAAG,EACgB,QACV,CACL,QAASC,EAAO,UAAU,WAAW,EACrC,MAAOD,EAAS,MAChB,OAAQA,EAAS,MACrB,CACA,CAIA,SAASG,EAAmBC,EAAY,CACtC,GAAI,CAACA,EACH,MAAO,CAAE,OAAQ,qBAAsB,KAAM,0BAA0B,EAEzE,OAAQA,EAAU,CAChB,IAAK,eACH,MAAO,CAAE,OAAQ,oBAAqB,KAAM,yBAAyB,EACvE,IAAK,UACH,MAAO,CAAE,OAAQ,oBAAqB,KAAM,yBAAyB,EACvE,IAAK,YACH,MAAO,CAAE,OAAQ,mBAAoB,KAAM,wBAAwB,EACrE,IAAK,aACH,MAAO,CAAE,OAAQ,qBAAsB,KAAM,0BAA0B,EACzE,QACE,MAAO,CAAE,OAAQ,qBAAsB,KAAM,0BAA0B,CAC7E,CACA,CACA,SAASC,GAAoB,CAC3B,OAAAC,EACA,oBAAAC,EAAsB,CAAA,EACtB,YAAAC,EACA,mBAAAC,EACA,SAAAC,EACA,oBAAAC,EACA,qBAAAC,EACA,aAAAC,EAAe,GACjB,EAAG,CACD,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,IAAI,EACnC,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAAS,CAAC,EACpC,CAACG,EAAYC,CAAa,EAAIJ,EAAAA,SAAS,CAAC,EACxC,CAACK,EAAcC,CAAe,EAAIN,EAAAA,SAAS,IAAI,EAC/C,CAACO,EAAWC,CAAY,EAAIR,EAAAA,SAAS,EAAI,EACzC,CAACS,EAAOC,CAAQ,EAAIV,EAAAA,SAAS,IAAI,EACjC,CAACW,EAAgBC,CAAiB,EAAIZ,EAAAA,SAAS,IAAI,EACnD,CAACa,EAAmBC,CAAoB,EAAId,EAAAA,SAAS,IAAI,EACzD,CAAC/C,CAAK,EAAI+C,EAAAA,SAAS,GAAG,EACtB,CAACe,EAAWC,CAAY,EAAIhB,EAAAA,SAAS,EAAK,EAC1C,CAACiB,EAAWC,CAAY,EAAIlB,EAAAA,SAAS,IAAI,EACzCmB,EAAeC,EAAAA,OAAO,IAAI,EAC1BC,EAAWD,EAAAA,OAAO,IAAI,EAC5BE,EAAAA,UAAU,IAAM,CACd,IAAIC,EAAY,GAChB,eAAeC,GAAU,CACvB,GAAI,CACFhB,EAAa,EAAI,EACjBE,EAAS,IAAI,EACb,MAAMe,EAAM,MAAM5C,GAAgBS,CAAM,EACxC,GAAIiC,EAAW,OACfxB,EAAU0B,CAAG,EACbvB,EAAYuB,EAAI,QAAQ,EACxBjB,EAAa,EAAK,CACpB,OAASkB,EAAK,CACZ,GAAIH,EAAW,OACf,QAAQ,MAAM,qBAAsBG,CAAG,EACvChB,EAAS,oBAAoB,EAC7BF,EAAa,EAAK,CACpB,CACF,CACA,OAAAgB,EAAO,EACA,IAAM,CACXD,EAAY,EACd,CACF,EAAG,CAACjC,CAAM,CAAC,EACXgC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACxB,EAAQ,OACb,IAAIyB,EAAY,GAChB,MAAME,EAAM3B,EACZ,eAAe6B,GAAW,CACxB,GAAI,CACF,MAAM7E,EAAO,MAAM2E,EAAI,QAAQtB,CAAU,EACzC,GAAIoB,EAAW,OACf,MAAMvC,EAAWlC,EAAK,YAAY,CAAE,MAAO,CAAC,CAAE,EAC9C8D,EAAkB,CAChB,MAAO5B,EAAS,MAChB,OAAQA,EAAS,MAC3B,CAAS,EACD,KAAM,CAAE,QAAA4C,CAAO,EAAK,MAAM7C,GAAuBjC,EAAMG,CAAK,EAC5D,GAAIsE,EAAW,OACfjB,EAAgBsB,CAAO,CACzB,OAASF,EAAK,CACZ,GAAIH,EAAW,OACf,QAAQ,MAAM,sBAAuBG,CAAG,EACxChB,EAAS,qBAAqB,CAChC,CACF,CACA,OAAAiB,EAAQ,EACD,IAAM,CACXJ,EAAY,EACd,CACF,EAAG,CAACzB,EAAQK,EAAYlD,CAAK,CAAC,EAC9BqE,EAAAA,UAAU,IAAM,CACd,MAAMO,EAA0B,IAAM,CAChCR,EAAS,SACXP,EAAqB,CACnB,MAAOO,EAAS,QAAQ,YACxB,OAAQA,EAAS,QAAQ,YACnC,CAAS,CAEL,EACAQ,EAAuB,EACvB,IAAIC,EAAiB,KACrB,GAAI,CACFA,EAAiB,IAAI,eAAeD,CAAuB,EACvDR,EAAS,SACXS,EAAe,QAAQT,EAAS,OAAO,CAE3C,MAAiB,CACf,QAAQ,KAAK,sEAAsE,EACnF,OAAO,iBAAiB,SAAUQ,CAAuB,CAC3D,CACA,MAAO,IAAM,CACPC,EACFA,EAAe,WAAU,EAEzB,OAAO,oBAAoB,SAAUD,CAAuB,CAEhE,CACF,EAAG,CAACxB,CAAY,CAAC,EACjB,MAAM0B,GAAkBC,cAAa,GAAM,CAEzC,GADI,CAACxC,GACD,CAAC6B,EAAS,QAAS,OACvB,MAAMY,EAAOZ,EAAS,QAAQ,sBAAqB,EAC7Ca,EAAI,EAAE,QAAUD,EAAK,KACrBE,EAAI,EAAE,QAAUF,EAAK,IAC3BjB,EAAa,EAAI,EACjBE,EAAa,CACX,OAAQgB,EACR,OAAQC,EACR,KAAMD,EACN,KAAMC,CACZ,CAAK,CACH,EAAG,CAAC3C,CAAW,CAAC,EACV4C,GAAkBJ,cAAa,GAAM,CACzC,GAAI,CAACjB,GAAa,CAACE,GAAa,CAACI,EAAS,QAAS,OACnD,MAAMY,EAAOZ,EAAS,QAAQ,sBAAqB,EACnDH,EAAa,CACX,GAAGD,EACH,KAAM,EAAE,QAAUgB,EAAK,KACvB,KAAM,EAAE,QAAUA,EAAK,GAC7B,CAAK,CACH,EAAG,CAAClB,EAAWE,CAAS,CAAC,EACnBoB,GAAgBL,EAAAA,YAAY,IAAM,CACtC,GAAI,CAACjB,GAAa,CAACE,GAAa,CAACN,GAAkB,CAACE,GAAqB,CAACnB,EAAU,CAClFsB,EAAa,EAAK,EAClBE,EAAa,IAAI,EACjB,MACF,CAKA,GAJqB,KAAK,KACxB,KAAK,IAAID,EAAU,KAAOA,EAAU,OAAQ,CAAC,EAAI,KAAK,IAAIA,EAAU,KAAOA,EAAU,OAAQ,CAAC,CACpG,EAC8B,GACY,CACpC,GAAI1B,EAAoB,OAAS,EAAG,CAClC,MAAM+C,EAAoBC,EAAgB,KAAMC,GAAQ,CACtD,MAAMC,EAAcC,EAAoBF,EAAI,MAAM,EAClD,GAAI,CAACC,EAAa,MAAO,GACzB,MAAME,EAAYzE,EAAsBuE,EAAY,KAAK,EACzD,GAAI,CAACE,EAAW,MAAO,GACvB,MAAMV,EAAOvE,EAAuBiF,EAAWhC,EAAe,OAAQ,CAAC,EACjEiC,EAAU/B,EAAkB,MAAQF,EAAe,MACnDkC,EAAUhC,EAAkB,OAASF,EAAe,OACpDmC,EAAWb,EAAK,EAAIW,EACpBG,EAAWd,EAAK,EAAIY,EACpBG,GAAef,EAAK,MAAQW,EAC5BK,GAAgBhB,EAAK,OAASY,EACpC,OAAO5B,EAAU,MAAQ6B,GAAY7B,EAAU,MAAQ6B,EAAWE,IAAgB/B,EAAU,MAAQ8B,GAAY9B,EAAU,MAAQ8B,EAAWE,EAC/I,CAAC,EACD,GAAIX,EAAmB,CACrB5C,GAAA,MAAAA,EAAU,IAAI,gBAAgB,KAAK,CAAE,aAAc4C,EAAkB,GAAI,WAAYA,EAAkB,UAAU,GACjHtB,EAAa,EAAK,EAClBE,EAAa,IAAI,EACjB,MACF,CACF,CACAF,EAAa,EAAK,EAClBE,EAAa,IAAI,EACjB,MACF,CACA,MAAMgC,EAASvC,EAAe,MAAQE,EAAkB,MAClDsC,EAASxC,EAAe,OAASE,EAAkB,OACnDuC,EAAkB,CACtB,OAAQnC,EAAU,OAASiC,EAC3B,OAAQjC,EAAU,OAASkC,EAC3B,KAAMlC,EAAU,KAAOiC,EACvB,KAAMjC,EAAU,KAAOkC,CAC7B,EACUxF,EAAWf,GACfwG,EACAjD,EACAQ,EAAe,MACfA,EAAe,OACf,CAEN,EACU0C,EAAmBrF,GAAuBL,CAAQ,EACpD8B,GACFC,EAAS,IAAI,gBAAgB,EAAE,KAAK,CAClC,SAAU,CACR,KAAM,mBACN,WAAY,oCACZ,MAAO2D,CACjB,EACQ,WAAY5D,CACpB,CAAO,EAEHuB,EAAa,EAAK,CACpB,EAAG,CAACD,EAAWE,EAAWd,EAAYQ,EAAgBE,EAAmBpB,EAAoBF,CAAmB,CAAC,EAC3GmD,EAAuBY,GAAW,CACtC,MAAMC,EAAWC,GAAkBF,CAAM,EACzC,GAAI,CAACC,EAAU,OAAO,KAEtB,MAAME,GADY,MAAM,QAAQF,CAAQ,EAAIA,EAAW,CAACA,CAAQ,GACxC,KAAMG,GAAMA,EAAE,OAAS,kBAAkB,EACjE,MAAI,CAACD,GAASA,EAAM,OAAS,mBAA2B,KACjDA,CACT,EACMlB,EAAkBhD,EAAoB,OAAQiD,GAAQ,CAC1D,MAAMC,EAAcC,EAAoBF,EAAI,MAAM,EAClD,OAAKC,EACQnE,GAAoBmE,EAAY,KAAK,IAClCtC,EAFS,EAG3B,CAAC,EACK,CAAE,iBAAAwD,GAAkB,iBAAAC,EAAgB,EAAKC,EAAAA,QAC7C,IAAMC,GAAqBC,GAAiBrE,GAAA,YAAAA,EAAU,IAAI,gBAAgB,KAAK,CAAE,aAAAqE,CAAY,GAAKlE,CAAY,EAC9G,CAACH,EAAUG,CAAY,CAC3B,EACQ,CAAE,OAAAmE,GAAQ,KAAAC,EAAI,EAAK9E,EAAmBM,GAAsB,IAAI,EACtE,OAAIgB,EACqByD,EAAAA,IAAI,MAAO,CAAE,UAAW,uCAAwC,SAAUzD,EAAO,EAEnF0D,EAAAA,KAAK,MAAO,CAAE,UAAW,gCAAiC,SAAU,CACzF5D,GAA6B2D,EAAAA,IAAI,MAAO,CAAE,UAAW,yCAA0C,SAAU,iBAAkB,EAC3GC,EAAAA,KACd,MACA,CACE,IAAKhD,EACL,UAAW,2CACX,MAAO,CAAE,QAASZ,EAAY,OAAS,MAAM,EAC7C,YAAawB,GACb,YAAaK,GACb,UAAWC,GACX,aAAc,IAAM,CACdtB,IACFC,EAAa,EAAK,EAClBE,EAAa,IAAI,EAErB,EACA,oBAAqB1B,GAAe,OACpC,SAAU,CACRa,GAAgC6D,EAAAA,IAC9B,MACA,CACE,IAAK7C,EACL,IAAKhB,EACL,IAAK,YAAYF,CAAU,GAC3B,UAAW,uCACX,UAAW,GACX,MAAO,CAAE,cAAe,MAAM,EAC9B,OAAQ,IAAM,CACZ,sBAAsB,IAAM,CAC1B,sBAAsB,IAAM,CACtBkB,EAAS,SACXP,EAAqB,CACnB,MAAOO,EAAS,QAAQ,YACxB,OAAQA,EAAS,QAAQ,YACjD,CAAuB,CAEL,CAAC,CACH,CAAC,CACH,CACd,CACA,EACUR,GAAqBF,GAAkCuD,EAAAA,IAAI,MAAO,CAAE,UAAW,mDAAoD,SAA0BA,EAAAA,IAAI,MAAO,CAAE,UAAW,yCAA0C,SAA0BC,EAAAA,KACvP,MACA,CACE,UAAW,qCACX,MAAOtD,EAAkB,MACzB,OAAQA,EAAkB,OAC1B,SAAU,CACR0B,EAAgB,IAAKC,GAAQ,CAC3B,MAAMC,EAAcC,EAAoBF,EAAI,MAAM,EAClD,GAAI,CAACC,EAAa,OAAO,KACzB,MAAM9E,EAAWO,EAAsBuE,EAAY,KAAK,EACxD,GAAI,CAAC9E,EAAU,OAAO,KACtB,MAAMsE,EAAOvE,EAAuBC,EAAUgD,EAAe,OAAQ,CAAC,EAChEuC,EAASrC,EAAkB,MAAQF,EAAe,MAClDwC,EAAStC,EAAkB,OAASF,EAAe,OACnDyD,EAAY5B,EAAI,KAAO7C,EACvB0E,EAAa7B,EAAI,KAAO5C,EACxB0E,EAAgB9B,EAAI,WACpB,CAAE,OAAQ+B,EAAW,KAAMC,CAAO,EAAKrF,EAAmBmF,CAAa,EAC7E,OAAuBJ,EAAAA,IACrB,OACA,CACE,EAAGjC,EAAK,EAAIiB,EACZ,EAAGjB,EAAK,EAAIkB,EACZ,MAAOlB,EAAK,MAAQiB,EACpB,OAAQjB,EAAK,OAASkB,EACtB,OAAQoB,EACR,YAAaF,EAAa,EAAID,EAAY,EAAI,EAC9C,KAAMI,EACN,MAAO,CACL,cAAe,OACf,OAAQ,UACR,QAASH,EAAa,EAAID,EAAY,GAAM,EACpE,EACsB,QAAS,IAAM1E,GAAA,YAAAA,EAAU,IAAI,gBAAgB,KAAK,CAAE,aAAc8C,EAAI,GAAI,WAAYA,EAAI,UAAU,GACpG,aAAc,IAAMmB,GAAiBnB,EAAI,EAAE,EAC3C,aAAcoB,EACpC,EACoBpB,EAAI,EACxB,CACgB,CAAC,EACDvB,IAAc,IAAM,CAClB,MAAMwD,EAAQ,KAAK,IAAIxD,EAAU,OAAQA,EAAU,IAAI,EACjDyD,EAAQ,KAAK,IAAIzD,EAAU,OAAQA,EAAU,IAAI,EACjD0D,EAAY,KAAK,IAAI1D,EAAU,KAAOA,EAAU,MAAM,EACtD2D,EAAa,KAAK,IAAI3D,EAAU,KAAOA,EAAU,MAAM,EAC7D,OAAuBiD,EAAAA,IACrB,OACA,CACE,EAAGO,EACH,EAAGC,EACH,MAAOC,EACP,OAAQC,EACR,OAAAZ,GACA,YAAa,EACb,gBAAiB,MACjB,KAAAC,GACA,cAAe,MACrC,CACA,CACgB,GAAC,CACjB,CACA,CACA,CAAW,CAAE,CAAC,CAAE,CAChB,CACA,CACA,EACIhE,EAAW,GAAqBkE,OAAK,MAAO,CAAE,UAAW,0CAA2C,SAAU,CAC5FD,EAAAA,IACd,SACA,CACE,SAAU/D,GAAc,EACxB,QAAS,IAAMC,EAAcD,EAAa,CAAC,EAC3C,UAAW,wCACX,SAAU,UACpB,CACA,EACsBgE,EAAAA,KAAK,OAAQ,CAAE,UAAW,2CAA4C,SAAU,CAC9F,QACAhE,EACA,OACAF,CACR,EAAS,EACaiE,EAAAA,IACd,SACA,CACE,SAAU/D,GAAcF,EACxB,QAAS,IAAMG,EAAcD,EAAa,CAAC,EAC3C,UAAW,wCACX,SAAU,MACpB,CACA,CACA,CAAK,CAAE,CACP,EAAK,CACL"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./query-B6BuIB0M.js";import{r as a}from"./vendor-DJo4KD8w.js";import{u as L,e as Y,ae as V,af as J,ag as X,a9 as O,ah as U,ai as B,aj as q,ak as ee,al as te,am as se,an as ne,ao as ae,i as ie,ap as re,aq as oe,ar as le}from"./index-C5oI0kaf.js";import{u as F,a as ce,b as de}from"./routing-Cm_oCwum.js";import{u as P}from"./i18n-BbpF47i1.js";import{a as me,F as ue}from"./XMarkIcon-KMKD47CF.js";function he({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9"}))}const ge=a.forwardRef(he);function pe({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 12.75 6 6 9-13.5"}))}const xe=a.forwardRef(pe);function fe({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const je=a.forwardRef(fe),K="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==";function ve(){const{t:n}=P(),t=(j,E)=>n(`UserPanel.${j}`,E),{displayName:i,avatarUrl:r,userDomain:h,isAdmin:g,isModerator:p,activeKnowledgeBase:o,signOut:l}=L(),y=Y(),u=F(),[c,f]=a.useState(!1),{timeRemaining:w}=V(),I=X(w)??"Unknown",N=(()=>{if(!r||c)return K;const j=J(r);return j||(console.warn("Invalid profile image URL detected, using fallback"),K)})(),A=async()=>{try{await y.logout()}catch{}o&&l(o.id),u.push("/")};return e.jsxs("div",{className:"semiont-user-panel",children:[e.jsx("h3",{className:"semiont-user-panel__title",children:t("account")}),o&&e.jsx("div",{style:{padding:"0 0.75rem 0.5rem",fontSize:"0.8rem",color:"var(--semiont-color-neutral-400)"},children:o.label}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:N,alt:t("profileAlt",{name:i||t("user")}),width:48,height:48,className:"w-12 h-12 rounded-full object-cover",onError:()=>f(!0)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"semiont-panel-text",children:i||t("user")}),h&&e.jsxs("div",{className:"semiont-panel-text-secondary",children:["@",h]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("session")}),e.jsx("div",{className:"semiont-session-box",children:e.jsx("div",{className:"semiont-panel-hint",children:t("expiresIn",{time:I})})})]}),(g||p)&&e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("privileges")}),e.jsxs("div",{className:"space-y-1",children:[g&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--admin",children:e.jsx("span",{className:"semiont-privilege-text",children:t("administrator")})}),p&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--moderator",children:e.jsx("span",{className:"semiont-privilege-text",children:t("moderator")})})]})]}),e.jsx("div",{className:"semiont-panel-divider",children:e.jsx("button",{onClick:A,className:"semiont-signout-button",children:t("signOut")})})]})]})}const ye={authenticated:"var(--semiont-color-success-500, #22c55e)",expired:"var(--semiont-color-warning-500, #eab308)","signed-out":"var(--semiont-color-neutral-400, #9ca3af)",unreachable:"var(--semiont-color-error-500, #ef4444)"},be={authenticated:"statusConnected",expired:"statusExpired","signed-out":"statusSignedOut",unreachable:"statusUnreachable"};function we({status:n,t}){return e.jsx("span",{title:t(be[n]),style:{width:"0.5rem",height:"0.5rem",borderRadius:"50%",backgroundColor:ye[n],flexShrink:0}})}function Ne({t:n,onSubmit:t,onCancel:i,error:r,isSubmitting:h,autoFocus:g,pulsing:p,initialHost:o="localhost",initialPort:l=4e3,initialEmail:y="admin@example.com"}){const[u,c]=a.useState(o),[f,w]=a.useState(String(l)),[I,N]=a.useState(U(o)),[A,j]=a.useState(y),[E,C]=a.useState(""),T=d=>{c(d),N(U(d))};return e.jsxs("div",{className:p?"semiont-panel__login-form--pulsing":"",style:{margin:"0.5rem",padding:"0.75rem",border:"1px solid var(--semiont-color-neutral-200, #e5e7eb)",borderRadius:"var(--semiont-panel-border-radius, 0.5rem)",background:"var(--semiont-bg-secondary, transparent)"},children:[e.jsx("h3",{style:{fontSize:"0.8rem",fontWeight:600,marginBottom:"0.5rem"},children:n("connectTitle")}),e.jsxs("form",{onSubmit:d=>{d.preventDefault(),B(u)&&t(u,parseInt(f,10)||4e3,I,A,E)},style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:[e.jsxs("select",{value:I,onChange:d=>N(d.target.value),className:"semiont-input",children:[e.jsx("option",{value:"http",children:"HTTP"}),e.jsx("option",{value:"https",children:"HTTPS"})]}),e.jsx("input",{type:"text",value:u,onChange:d=>T(d.target.value),placeholder:"Host",className:"semiont-input",autoFocus:g}),e.jsx("input",{type:"number",value:f,onChange:d=>w(d.target.value),placeholder:"Port",className:"semiont-input"}),u&&!B(u)&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:n("invalidHost")}),e.jsx("input",{type:"email",value:A,onChange:d=>j(d.target.value),placeholder:"Email",className:"semiont-input"}),e.jsx("input",{type:"password",value:E,onChange:d=>C(d.target.value),placeholder:"Password",className:"semiont-input"}),r&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:r}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1},disabled:h||!B(u),children:n(h?"connecting":"connect")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:i,children:e.jsx(ue,{style:{width:"1rem",height:"1rem"}})})]})]})]})}function Se({t:n,kb:t,onSubmit:i,onCancel:r,error:h,isSubmitting:g}){const[p,o]=a.useState("");return e.jsxs("form",{onSubmit:l=>{l.preventDefault(),i(p)},style:{padding:"0.5rem 0.75rem",display:"flex",flexDirection:"column",gap:"0.375rem"},children:[e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--semiont-color-neutral-400)"},children:t.email}),e.jsx("input",{type:"password",value:p,onChange:l=>o(l.target.value),placeholder:"Password",className:"semiont-input",style:{fontSize:"0.8rem"},autoFocus:!0}),h&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:h}),e.jsxs("div",{style:{display:"flex",gap:"0.375rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1,fontSize:"0.8rem"},disabled:g,children:n(g?"signingIn":"signIn")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:r,style:{fontSize:"0.8rem"},children:n("cancel")})]})]})}async function D(n,t,i,r,h){const g=`${i}://${n}:${t}`,p=new q({baseUrl:te(g),eventBus:new ee}),o=await p.authenticatePassword(se(r),h),l=o.token??o.accessToken,y=o.refreshToken;if(!l)throw new Error("No access token received");if(!y)throw new Error("No refresh token received");let u=`${n}:${t}`,c;try{const f=await p.getStatus({auth:ne(l)});f.projectName&&(u=f.projectName),f.gitBranch&&(c=f.gitBranch)}catch{}return{token:l,refreshToken:y,label:u,...c?{gitBranch:c}:{}}}function Ie(){const{t:n}=P(),t=(s,x)=>n(`KnowledgeBasePanel.${s}`,x),{knowledgeBases:i,activeKnowledgeBase:r,setActiveKnowledgeBase:h,addKnowledgeBase:g,removeKnowledgeBase:p,updateKnowledgeBase:o,signIn:l,signOut:y}=L(),[u,c]=a.useState(!1),[f,w]=a.useState(null),[I,N]=a.useState(!1),[A,j]=a.useState(null),[E,C]=a.useState(null),[T,d]=a.useState(!1),[H,R]=a.useState(null),[,W]=a.useState(0);a.useEffect(()=>{i.length===0&&c(!0)},[i.length]),a.useEffect(()=>{const s=setInterval(()=>W(x=>x+1),3e4);return()=>clearInterval(s)},[]);const $=()=>{c(!0),j(null),w(null)},Z=async(s,x,b,v,S)=>{w(null),N(!0);const k=i.find(m=>m.host===s&&m.port===x);if(k){try{const{token:m,refreshToken:z,gitBranch:M}=await D(s,x,b,v,S);o(k.id,{...M?{gitBranch:M}:{}}),l(k.id,m,z),c(!1)}catch(m){w(m instanceof Error?m.message:String(m))}finally{N(!1)}return}try{const{token:m,refreshToken:z,label:M,gitBranch:_}=await D(s,x,b,v,S);g({label:M,host:s,port:x,protocol:b,email:v,..._?{gitBranch:_}:{}},m,z),c(!1)}catch(m){w(m instanceof Error?m.message:String(m))}finally{N(!1)}},G=async(s,x)=>{const b=i.find(v=>v.id===s);if(b){C(null),d(!0);try{const{token:v,refreshToken:S,label:k,gitBranch:m}=await D(b.host,b.port,b.protocol,b.email,x);o(s,{label:k,...m?{gitBranch:m}:{}}),l(s,v,S),j(null)}catch(v){C(v instanceof Error?v.message:String(v))}finally{d(!1)}}},Q=s=>{O(s.id)==="authenticated"?h(s.id):(j(s.id),c(!1),C(null))};return e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsxs("h2",{className:"semiont-panel-header__title",children:[e.jsx("span",{className:"semiont-panel-header__text",children:t("title")}),e.jsxs("span",{className:"semiont-panel-header__count",children:["(",i.length,")"]})]})}),e.jsxs("div",{className:"semiont-panel__content",children:[e.jsx("div",{className:"semiont-panel__list",children:i.map(s=>{const x=O(s.id),b=s.id===(r==null?void 0:r.id),v=A===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`semiont-panel-item semiont-panel-item--clickable${b?" semiont-panel-item--selected":""}`,style:{display:"flex",flexDirection:"column",gap:"0.25rem",cursor:"pointer",padding:"0.5rem 0.75rem"},onClick:()=>Q(s),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[e.jsx(we,{status:x,t}),e.jsx("span",{className:"semiont-panel-text",style:{flex:1,fontWeight:500},children:s.label}),b&&e.jsx(xe,{style:{width:"1rem",height:"1rem",color:"var(--semiont-color-primary-500)",flexShrink:0}}),x==="authenticated"&&e.jsx("button",{onClick:S=>{S.stopPropagation(),y(s.id)},title:t("signOut"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(ge,{style:{width:"0.875rem",height:"0.875rem"}})}),e.jsx("button",{onClick:S=>{S.stopPropagation(),R(s.id)},title:t("remove"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(me,{style:{width:"0.875rem",height:"0.875rem"}})})]}),e.jsxs("span",{className:"semiont-panel-text-secondary",style:{fontSize:"0.7rem",paddingLeft:"1rem"},children:[s.host,":",s.port,s.gitBranch?` · ${s.gitBranch}`:""]})]}),H===s.id&&e.jsxs("div",{style:{padding:"0.5rem 0.75rem",fontSize:"0.8rem",display:"flex",alignItems:"center",gap:"0.5rem",background:"var(--semiont-bg-secondary, #f9fafb)",borderBottom:"1px solid var(--semiont-color-neutral-200, #e5e7eb)"},children:[e.jsx("span",{style:{flex:1,color:"var(--semiont-color-neutral-500)"},children:t("removeConfirm",{label:s.label})}),e.jsx("button",{onClick:()=>{p(s.id),R(null)},className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem",color:"var(--semiont-color-error-500, #ef4444)"},children:t("remove")}),e.jsx("button",{onClick:()=>R(null),className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem"},children:t("cancel")})]}),v&&e.jsx(Se,{t,kb:s,onSubmit:S=>G(s.id,S),onCancel:()=>j(null),error:E,isSubmitting:T})]},s.id)})}),u&&e.jsx(Ne,{t,onSubmit:Z,onCancel:()=>c(!1),error:f,isSubmitting:I,autoFocus:i.length===0,pulsing:i.length===0})]}),!u&&e.jsx("div",{className:"semiont-panel-footer",children:e.jsxs("button",{onClick:$,className:"semiont-panel-item semiont-panel-item--clickable",style:{width:"100%",display:"flex",alignItems:"center",gap:"0.5rem",color:"var(--semiont-color-primary-600)"},children:[e.jsx(je,{style:{width:"1rem",height:"1rem",flexShrink:0}}),e.jsx("span",{className:"semiont-panel-text",style:{color:"inherit"},children:t("addKnowledgeBase")})]})})]})}function Re({activePanel:n,theme:t,showLineNumbers:i,hoverDelayMs:r,children:h}){const{t:g}=P(),{isAuthenticated:p}=L(),o=ce(),l=F(),y=de(),[u,c]=a.useTransition(),{width:f,setWidth:w,minWidth:I,maxWidth:N}=ae(),A=a.useCallback(({locale:j})=>{y&&c(()=>{l.replace(y,{locale:j})})},[y,l,c]);return ie({"settings:locale-changed":A}),!n||!h&&!re.includes(n)?null:e.jsxs("div",{className:"semiont-toolbar-panels",style:{width:`${f}px`,position:"relative"},children:[e.jsx(oe,{onResize:w,minWidth:I,maxWidth:N,position:"left",ariaLabel:"Resize right panel"}),e.jsxs("div",{className:"semiont-toolbar-panels__content",children:[h,n==="knowledge-base"&&e.jsx(Ie,{}),n==="user"&&(p?e.jsx(ve,{}):e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsx("h2",{className:"semiont-panel-header__title",children:e.jsx("span",{className:"semiont-panel-header__text",children:g("UserPanel.account")})})}),e.jsx("div",{className:"semiont-panel__content",style:{padding:"1rem",textAlign:"center"},children:e.jsx("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:g("AccountPanel.notAuthenticated")})})]})),n==="settings"&&e.jsx(le,{showLineNumbers:i,theme:t,hoverDelayMs:r,locale:o,isPendingLocaleChange:u})]})]})}export{je as F,Re as T};
2
+ //# sourceMappingURL=ToolbarPanels-CfaOVIc9.js.map