@semiont/browser 0.5.28

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 (204) hide show
  1. package/README.md +42 -0
  2. package/dist/apple-touch-icon.png +0 -0
  3. package/dist/assets/ChevronLeftIcon-BcDi-sgg.js +2 -0
  4. package/dist/assets/ChevronLeftIcon-BcDi-sgg.js.map +1 -0
  5. package/dist/assets/CommandLineIcon-O8NfVSEq.js +2 -0
  6. package/dist/assets/CommandLineIcon-O8NfVSEq.js.map +1 -0
  7. package/dist/assets/CookiePreferences-UVUl27XP.js +2 -0
  8. package/dist/assets/CookiePreferences-UVUl27XP.js.map +1 -0
  9. package/dist/assets/KeyboardShortcutsContext-D8VjaYfK.js +2 -0
  10. package/dist/assets/KeyboardShortcutsContext-D8VjaYfK.js.map +1 -0
  11. package/dist/assets/PdfAnnotationCanvas.client-LSH3PZPY-B8dnEIps.js +2 -0
  12. package/dist/assets/PdfAnnotationCanvas.client-LSH3PZPY-B8dnEIps.js.map +1 -0
  13. package/dist/assets/ToolbarPanels-Bf3f6THq.js +2 -0
  14. package/dist/assets/ToolbarPanels-Bf3f6THq.js.map +1 -0
  15. package/dist/assets/XMarkIcon-CVrfCz2h.js +2 -0
  16. package/dist/assets/XMarkIcon-CVrfCz2h.js.map +1 -0
  17. package/dist/assets/ar-AZBRADEB-CvnkaLQS.js +2 -0
  18. package/dist/assets/ar-AZBRADEB-CvnkaLQS.js.map +1 -0
  19. package/dist/assets/bn-CCEW6AOS-BCI1FG86.js +2 -0
  20. package/dist/assets/bn-CCEW6AOS-BCI1FG86.js.map +1 -0
  21. package/dist/assets/client-B2rbsRTh.js +2 -0
  22. package/dist/assets/client-B2rbsRTh.js.map +1 -0
  23. package/dist/assets/client-kvvQzQsd.js +2 -0
  24. package/dist/assets/client-kvvQzQsd.js.map +1 -0
  25. package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js +2 -0
  26. package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js.map +1 -0
  27. package/dist/assets/da-K5NTK7LH-D2rWDXq3.js +2 -0
  28. package/dist/assets/da-K5NTK7LH-D2rWDXq3.js.map +1 -0
  29. package/dist/assets/de-GMRQEDZI-CVlSEip_.js +2 -0
  30. package/dist/assets/de-GMRQEDZI-CVlSEip_.js.map +1 -0
  31. package/dist/assets/el-EUB4CI4G-C80i0753.js +2 -0
  32. package/dist/assets/el-EUB4CI4G-C80i0753.js.map +1 -0
  33. package/dist/assets/en-R5XA26NF-Cuox0uQn.js +1 -0
  34. package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js +2 -0
  35. package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js.map +1 -0
  36. package/dist/assets/fa-G7HN6B32-DdDi1TG_.js +2 -0
  37. package/dist/assets/fa-G7HN6B32-DdDi1TG_.js.map +1 -0
  38. package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js +2 -0
  39. package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js.map +1 -0
  40. package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js +2 -0
  41. package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js.map +1 -0
  42. package/dist/assets/he-WQQEY26B-2RRJq7To.js +2 -0
  43. package/dist/assets/he-WQQEY26B-2RRJq7To.js.map +1 -0
  44. package/dist/assets/hi-HJZ6W4JB-DPflxelg.js +2 -0
  45. package/dist/assets/hi-HJZ6W4JB-DPflxelg.js.map +1 -0
  46. package/dist/assets/i18n-zIDJOEfo.js +2 -0
  47. package/dist/assets/i18n-zIDJOEfo.js.map +1 -0
  48. package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js +2 -0
  49. package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js.map +1 -0
  50. package/dist/assets/index-BkTRe71w.js +142 -0
  51. package/dist/assets/index-BkTRe71w.js.map +1 -0
  52. package/dist/assets/index-C6tZC9XN.css +1 -0
  53. package/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  54. package/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  55. package/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  56. package/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  57. package/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  58. package/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  59. package/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  60. package/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  61. package/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  62. package/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  63. package/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  64. package/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  65. package/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  66. package/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  67. package/dist/assets/it-DT6UW66F-B7ZzCBm1.js +2 -0
  68. package/dist/assets/it-DT6UW66F-B7ZzCBm1.js.map +1 -0
  69. package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js +2 -0
  70. package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js.map +1 -0
  71. package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js +2 -0
  72. package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js.map +1 -0
  73. package/dist/assets/layout-5m7ZN_sv.js +2 -0
  74. package/dist/assets/layout-5m7ZN_sv.js.map +1 -0
  75. package/dist/assets/layout-ChREg3PD.js +2 -0
  76. package/dist/assets/layout-ChREg3PD.js.map +1 -0
  77. package/dist/assets/layout-DmBlX8Wv.js +2 -0
  78. package/dist/assets/layout-DmBlX8Wv.js.map +1 -0
  79. package/dist/assets/layout-xM3HYPpK.js +2 -0
  80. package/dist/assets/layout-xM3HYPpK.js.map +1 -0
  81. package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js +2 -0
  82. package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js.map +1 -0
  83. package/dist/assets/nl-OQEWIXNA-DiHanxnO.js +2 -0
  84. package/dist/assets/nl-OQEWIXNA-DiHanxnO.js.map +1 -0
  85. package/dist/assets/no-KPAYJZWY-DdGouMG_.js +2 -0
  86. package/dist/assets/no-KPAYJZWY-DdGouMG_.js.map +1 -0
  87. package/dist/assets/not-found-BOkh1PJR.js +2 -0
  88. package/dist/assets/not-found-BOkh1PJR.js.map +1 -0
  89. package/dist/assets/orbitron-latin-400-normal-DBk4Dmer.woff +0 -0
  90. package/dist/assets/orbitron-latin-400-normal-U6xZUhur.woff2 +0 -0
  91. package/dist/assets/page-B2tTEfKp.js +2 -0
  92. package/dist/assets/page-B2tTEfKp.js.map +1 -0
  93. package/dist/assets/page-BOgSgEl-.js +2 -0
  94. package/dist/assets/page-BOgSgEl-.js.map +1 -0
  95. package/dist/assets/page-Bfk44QuW.js +2 -0
  96. package/dist/assets/page-Bfk44QuW.js.map +1 -0
  97. package/dist/assets/page-BiEYKai0.js +8 -0
  98. package/dist/assets/page-BiEYKai0.js.map +1 -0
  99. package/dist/assets/page-C45jnN3u.js +2 -0
  100. package/dist/assets/page-C45jnN3u.js.map +1 -0
  101. package/dist/assets/page-C76A3Tvm.js +2 -0
  102. package/dist/assets/page-C76A3Tvm.js.map +1 -0
  103. package/dist/assets/page-C7fj48Yd.js +2 -0
  104. package/dist/assets/page-C7fj48Yd.js.map +1 -0
  105. package/dist/assets/page-CQJx-JXR.js +2 -0
  106. package/dist/assets/page-CQJx-JXR.js.map +1 -0
  107. package/dist/assets/page-CgiAumZ6.js +2 -0
  108. package/dist/assets/page-CgiAumZ6.js.map +1 -0
  109. package/dist/assets/page-CrXiz4-J.js +2 -0
  110. package/dist/assets/page-CrXiz4-J.js.map +1 -0
  111. package/dist/assets/page-DGXyF1RD.js +2 -0
  112. package/dist/assets/page-DGXyF1RD.js.map +1 -0
  113. package/dist/assets/page-DL5wQ3pG.js +20 -0
  114. package/dist/assets/page-DL5wQ3pG.js.map +1 -0
  115. package/dist/assets/page-DXZrFCmr.js +2 -0
  116. package/dist/assets/page-DXZrFCmr.js.map +1 -0
  117. package/dist/assets/page-De2leEHb.js +2 -0
  118. package/dist/assets/page-De2leEHb.js.map +1 -0
  119. package/dist/assets/page-KrH4sIjg.js +2 -0
  120. package/dist/assets/page-KrH4sIjg.js.map +1 -0
  121. package/dist/assets/page-ZPLCKgGQ.js +5 -0
  122. package/dist/assets/page-ZPLCKgGQ.js.map +1 -0
  123. package/dist/assets/page-_daGpD2K.js +2 -0
  124. package/dist/assets/page-_daGpD2K.js.map +1 -0
  125. package/dist/assets/page-zpMXForS.js +2 -0
  126. package/dist/assets/page-zpMXForS.js.map +1 -0
  127. package/dist/assets/pdf-Dicw8YoH.js +55 -0
  128. package/dist/assets/pdf-Dicw8YoH.js.map +1 -0
  129. package/dist/assets/pdf.worker.min-CHFwMXne.mjs +29 -0
  130. package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js +2 -0
  131. package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js.map +1 -0
  132. package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js +2 -0
  133. package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js.map +1 -0
  134. package/dist/assets/ro-3CGVMOC6-wdwqXMaO.js +2 -0
  135. package/dist/assets/ro-3CGVMOC6-wdwqXMaO.js.map +1 -0
  136. package/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  137. package/dist/assets/routing-BJiyORAR.js +2 -0
  138. package/dist/assets/routing-BJiyORAR.js.map +1 -0
  139. package/dist/assets/routing-CygMogfF.js +2 -0
  140. package/dist/assets/routing-CygMogfF.js.map +1 -0
  141. package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js +2 -0
  142. package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js.map +1 -0
  143. package/dist/assets/th-NZ4G352Z-ZMBwAbgb.js +2 -0
  144. package/dist/assets/th-NZ4G352Z-ZMBwAbgb.js.map +1 -0
  145. package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js +2 -0
  146. package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js.map +1 -0
  147. package/dist/assets/uk-AIX536L4-cREJjolM.js +2 -0
  148. package/dist/assets/uk-AIX536L4-cREJjolM.js.map +1 -0
  149. package/dist/assets/vendor-BVP6ONpk.js +10 -0
  150. package/dist/assets/vendor-BVP6ONpk.js.map +1 -0
  151. package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js +2 -0
  152. package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js.map +1 -0
  153. package/dist/assets/web-D6kqUluK.js +2 -0
  154. package/dist/assets/web-D6kqUluK.js.map +1 -0
  155. package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js +2 -0
  156. package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js.map +1 -0
  157. package/dist/favicon-16x16.png +0 -0
  158. package/dist/favicon-32x32.png +0 -0
  159. package/dist/favicon.ico +0 -0
  160. package/dist/favicon.svg +47 -0
  161. package/dist/favicons/android-chrome-192x192.png +0 -0
  162. package/dist/favicons/android-chrome-512x512.png +0 -0
  163. package/dist/favicons/apple-touch-icon.png +0 -0
  164. package/dist/favicons/favicon-128x128.png +0 -0
  165. package/dist/favicons/favicon-16x16.png +0 -0
  166. package/dist/favicons/favicon-32x32.png +0 -0
  167. package/dist/favicons/favicon-48x48.png +0 -0
  168. package/dist/favicons/favicon-64x64.png +0 -0
  169. package/dist/favicons/favicon-96x96.png +0 -0
  170. package/dist/favicons/favicon.ico +0 -0
  171. package/dist/favicons/favicon.svg +47 -0
  172. package/dist/favicons/site.webmanifest +19 -0
  173. package/dist/index.html +23 -0
  174. package/dist/messages/ar.json +1034 -0
  175. package/dist/messages/bn.json +1034 -0
  176. package/dist/messages/cs.json +1034 -0
  177. package/dist/messages/da.json +1034 -0
  178. package/dist/messages/de.json +1034 -0
  179. package/dist/messages/el.json +1034 -0
  180. package/dist/messages/en.json +1034 -0
  181. package/dist/messages/es.json +1034 -0
  182. package/dist/messages/fa.json +1034 -0
  183. package/dist/messages/fi.json +1034 -0
  184. package/dist/messages/fr.json +1034 -0
  185. package/dist/messages/he.json +1034 -0
  186. package/dist/messages/hi.json +1034 -0
  187. package/dist/messages/id.json +1034 -0
  188. package/dist/messages/it.json +1034 -0
  189. package/dist/messages/ja.json +1034 -0
  190. package/dist/messages/ko.json +1034 -0
  191. package/dist/messages/ms.json +1034 -0
  192. package/dist/messages/nl.json +1034 -0
  193. package/dist/messages/no.json +1034 -0
  194. package/dist/messages/pl.json +1034 -0
  195. package/dist/messages/pt.json +1034 -0
  196. package/dist/messages/ro.json +1034 -0
  197. package/dist/messages/sv.json +1034 -0
  198. package/dist/messages/th.json +1034 -0
  199. package/dist/messages/tr.json +1034 -0
  200. package/dist/messages/uk.json +1034 -0
  201. package/dist/messages/vi.json +1034 -0
  202. package/dist/messages/zh.json +1034 -0
  203. package/package.json +26 -0
  204. package/server.js +149 -0
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @semiont/browser
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@semiont/browser.svg)](https://www.npmjs.com/package/@semiont/browser)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@semiont/browser.svg)](https://www.npmjs.com/package/@semiont/browser)
5
+ [![License](https://img.shields.io/npm/l/@semiont/browser.svg)](https://github.com/The-AI-Alliance/semiont/blob/main/LICENSE)
6
+
7
+ Pre-built Semiont Browser as a Vite SPA with a zero-dependency Node.js static file server. This package contains the compiled Browser application ready to run with Node.js.
8
+
9
+ ## Running Semiont
10
+
11
+ Most people should **not** install this package directly. A Semiont stack is run with the `semiont`
12
+ launcher — a single static binary that pulls the published container images:
13
+
14
+ ```bash
15
+ brew install the-ai-alliance/semiont/semiont
16
+
17
+ cd /path/to/your-knowledge-base
18
+ semiont start
19
+ ```
20
+
21
+ This package is what the `semiont-browser` container image runs inside. To run just the browser
22
+ against an already-running knowledge base, use the published image directly:
23
+
24
+ ```bash
25
+ docker run --publish 3000:3000 -it ghcr.io/the-ai-alliance/semiont-browser:latest
26
+ ```
27
+
28
+ ## Direct usage
29
+
30
+ ```bash
31
+ npm install @semiont/browser
32
+ PORT=3000 node node_modules/@semiont/browser/server.js
33
+ ```
34
+
35
+ The SPA is gateway-agnostic: it connects to knowledge bases chosen in the browser at runtime, so the
36
+ only environment variable it needs is `PORT`.
37
+
38
+ ## Links
39
+
40
+ - [Semiont GitHub](https://github.com/The-AI-Alliance/semiont)
41
+ - [Semiont launcher](https://github.com/The-AI-Alliance/semiont/tree/main/apps/launcher)
42
+ - [Documentation](https://github.com/The-AI-Alliance/semiont#readme)
Binary file
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t}from"./i18n-zIDJOEfo.js";var n=e(t());function r({title:e,titleId:t,...r},i){return n.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:i,"aria-labelledby":t},r),e?n.createElement(`title`,{id:t},e):null,n.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5`}))}var i=n.forwardRef(r);function a({title:e,titleId:t,...r},i){return n.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:i,"aria-labelledby":t},r),e?n.createElement(`title`,{id:t},e):null,n.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M15.75 19.5 8.25 12l7.5-7.5`}))}var o=n.forwardRef(a);export{i as n,o as t};
2
+ //# sourceMappingURL=ChevronLeftIcon-BcDi-sgg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChevronLeftIcon-BcDi-sgg.js","names":["ForwardRef"],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/Bars3Icon.js","../../../../node_modules/@heroicons/react/24/outline/esm/ChevronLeftIcon.js"],"sourcesContent":["import * as React from \"react\";\nfunction Bars3Icon({\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.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(Bars3Icon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronLeftIcon({\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: \"M15.75 19.5 8.25 12l7.5-7.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronLeftIcon);\nexport default ForwardRef;"],"x_google_ignoreList":[0,1],"mappings":"uGACA,SAAS,EAAU,CACjB,QACA,UACA,GAAG,GACF,EAAQ,CACT,OAAoB,EAAM,cAAc,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAK,EACL,kBAAmB,CACrB,EAAG,CAAK,EAAG,EAAqB,EAAM,cAAc,QAAS,CAC3D,GAAI,CACN,EAAG,CAAK,EAAI,KAAmB,EAAM,cAAc,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,8CACL,CAAC,CAAC,CACJ,CACA,IAAMA,EAA2B,EAAM,WAAW,CAAS,ECvB3D,SAAS,EAAgB,CACvB,QACA,UACA,GAAG,GACF,EAAQ,CACT,OAAoB,EAAM,cAAc,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAK,EACL,kBAAmB,CACrB,EAAG,CAAK,EAAG,EAAqB,EAAM,cAAc,QAAS,CAC3D,GAAI,CACN,EAAG,CAAK,EAAI,KAAmB,EAAM,cAAc,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,6BACL,CAAC,CAAC,CACJ,CACA,IAAM,EAA2B,EAAM,WAAW,CAAe"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t}from"./i18n-zIDJOEfo.js";var n=e(t());function r({title:e,titleId:t,...r},i){return n.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:i,"aria-labelledby":t},r),e?n.createElement(`title`,{id:t},e):null,n.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z`}))}var i=n.forwardRef(r);export{i as t};
2
+ //# sourceMappingURL=CommandLineIcon-O8NfVSEq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandLineIcon-O8NfVSEq.js","names":[],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/CommandLineIcon.js"],"sourcesContent":["import * as React from \"react\";\nfunction CommandLineIcon({\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: \"m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CommandLineIcon);\nexport default ForwardRef;"],"x_google_ignoreList":[0],"mappings":"uGACA,SAAS,EAAgB,CACvB,QACA,UACA,GAAG,GACF,EAAQ,CACT,OAAoB,EAAM,cAAc,MAAO,OAAO,OAAO,CAC3D,MAAO,6BACP,KAAM,OACN,QAAS,YACT,YAAa,IACb,OAAQ,eACR,cAAe,OACf,YAAa,OACb,IAAK,EACL,kBAAmB,CACrB,EAAG,CAAK,EAAG,EAAqB,EAAM,cAAc,QAAS,CAC3D,GAAI,CACN,EAAG,CAAK,EAAI,KAAmB,EAAM,cAAc,OAAQ,CACzD,cAAe,QACf,eAAgB,QAChB,EAAG,uJACL,CAAC,CAAC,CACJ,CACA,IAAM,EAA2B,EAAM,WAAW,CAAe"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-zIDJOEfo.js";import{t as r}from"./vendor-BVP6ONpk.js";import{c as i,i as a,r as o,s,u as c}from"./KeyboardShortcutsContext-D8VjaYfK.js";import{n as l,t as u}from"./XMarkIcon-CVrfCz2h.js";var d=e(t());function f({title:e,titleId:t,...n},r){return d.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},n),e?d.createElement(`title`,{id:t},e):null,d.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`}))}var p=d.forwardRef(f);function m({title:e,titleId:t,...n},r){return d.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},n),e?d.createElement(`title`,{id:t},e):null,d.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`}))}var h=d.forwardRef(m);function g({title:e,titleId:t,...n},r){return d.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},n),e?d.createElement(`title`,{id:t},e):null,d.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`}))}var _=d.forwardRef(g),v=r();function y({isOpen:e,onClose:t}){let{t:r}=n(),f=(e,t)=>r(`CookiePreferences.${e}`,t),[m,g]=(0,d.useState)(null),[y,b]=(0,d.useState)(!1),[x,S]=(0,d.useState)(!1),C=(0,d.useRef)(t);(0,d.useEffect)(()=>{C.current=t}),(0,d.useEffect)(()=>{if(e){let e=s();g(e||{necessary:!0,analytics:!1,marketing:!1,preferences:!1,timestamp:new Date().toISOString(),version:`1.0`})}},[e]),(0,d.useEffect)(()=>{if(!e)return;let t=e=>{e.key===`Escape`&&C.current()};return document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`keydown`,t)}},[e]);let w=async()=>{m&&(b(!0),i(m),b(!1),t())},T=e=>{e===`necessary`||!m||g(t=>t?{...t,[e]:!t[e]}:null)};return!e||!m?null:(0,v.jsxs)(`div`,{className:`fixed inset-0 z-50 overflow-y-auto`,children:[(0,v.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:[(0,v.jsx)(`div`,{className:`fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75`,onClick:t}),(0,v.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:[(0,v.jsx)(`button`,{onClick:t,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:(0,v.jsx)(u,{className:`h-6 w-6`})}),(0,v.jsxs)(`div`,{className:`sm:flex sm:items-start`,children:[(0,v.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:(0,v.jsx)(h,{className:`h-6 w-6 text-blue-600`})}),(0,v.jsxs)(`div`,{className:`mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left flex-1 pr-8`,children:[(0,v.jsx)(`h3`,{className:`text-lg leading-6 font-medium text-gray-900`,children:f(`title`)}),(0,v.jsx)(`div`,{className:`mt-2`,children:(0,v.jsx)(`p`,{className:`text-sm text-gray-500`,children:f(`description`)})})]})]}),(0,v.jsx)(`div`,{className:`mt-6`,children:(0,v.jsxs)(`div`,{className:`space-y-6`,children:[(0,v.jsxs)(`div`,{className:`bg-gray-50 rounded-lg p-4`,children:[(0,v.jsxs)(`div`,{className:`flex items-center`,children:[(0,v.jsx)(_,{className:`h-5 w-5 text-green-500 mr-2`}),(0,v.jsx)(`span`,{className:`text-sm font-medium text-gray-900`,children:f(`currentSettings`)})]}),(0,v.jsxs)(`div`,{className:`mt-2 text-xs text-gray-600`,children:[(0,v.jsx)(`p`,{children:f(`lastUpdated`,{date:new Date(m.timestamp).toLocaleDateString()})}),(0,v.jsx)(`p`,{children:f(`version`,{version:m.version})})]})]}),(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsx)(`h4`,{className:`text-base font-medium text-gray-900`,children:f(`cookieCategories`)}),c.map(e=>(0,v.jsx)(`div`,{className:`border border-gray-200 rounded-lg p-4`,children:(0,v.jsx)(`div`,{className:`flex items-start justify-between`,children:(0,v.jsxs)(`div`,{className:`flex-1`,children:[(0,v.jsxs)(`div`,{className:`flex items-center`,children:[(0,v.jsx)(`input`,{id:`pref-${e.id}`,type:`checkbox`,checked:m[e.id]||!1,onChange:()=>T(e.id),disabled:e.required||y,className:`h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded-sm disabled:opacity-50`}),(0,v.jsxs)(`label`,{htmlFor:`pref-${e.id}`,className:`ml-3 text-sm font-medium text-gray-900 cursor-pointer`,children:[e.name,e.required&&(0,v.jsx)(`span`,{className:`text-xs text-gray-500 ml-1`,children:f(`required`)})]})]}),(0,v.jsx)(`p`,{className:`mt-1 text-sm text-gray-600`,children:e.description}),(0,v.jsxs)(`details`,{className:`mt-2`,children:[(0,v.jsx)(`summary`,{className:`text-xs text-blue-600 cursor-pointer hover:text-blue-800`,children:f(`viewCookies`,{count:e.cookies.length})}),(0,v.jsx)(`div`,{className:`mt-1 text-xs text-gray-500 bg-gray-50 rounded-sm p-2`,children:(0,v.jsx)(`ul`,{className:`list-disc list-inside space-y-1`,children:e.cookies.map(e=>(0,v.jsx)(`li`,{children:e},e))})})]})]})})},e.id))]}),(0,v.jsxs)(`div`,{className:`border-t border-gray-200 pt-6`,children:[(0,v.jsx)(`h4`,{className:`text-base font-medium text-gray-900 mb-4`,children:f(`dataManagement`)}),(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-4`,children:[(0,v.jsxs)(`button`,{onClick:()=>{let e=a(),t=new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`semiont-user-data-${new Date().toISOString().split(`T`)[0]}.json`,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(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`,children:[(0,v.jsx)(p,{className:`h-4 w-4 mr-2`}),f(`exportMyData`)]}),(0,v.jsxs)(`button`,{onClick:()=>S(!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:[(0,v.jsx)(l,{className:`h-4 w-4 mr-2`}),f(`deleteAllData`)]})]}),(0,v.jsx)(`p`,{className:`mt-2 text-xs text-gray-500`,children:f(`dataManagementDescription`)})]})]})}),(0,v.jsxs)(`div`,{className:`mt-6 flex flex-wrap gap-2 justify-center`,children:[(0,v.jsx)(`button`,{type:`button`,onClick:()=>{g(e=>e?{...e,necessary:!0,analytics:!1,marketing:!1,preferences:!1}:null)},disabled:y,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:f(`rejectAll`)}),(0,v.jsx)(`button`,{type:`button`,onClick:()=>{g(e=>e?{...e,necessary:!0,analytics:!0,marketing:!0,preferences:!0}:null)},disabled:y,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:f(`acceptAll`)})]}),(0,v.jsxs)(`div`,{className:`mt-6 sm:flex sm:flex-row-reverse`,children:[(0,v.jsx)(`button`,{type:`button`,onClick:w,disabled:y,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:f(y?`saving`:`saveChanges`)}),(0,v.jsx)(`button`,{type:`button`,onClick:t,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:f(`cancel`)})]})]})]}),x&&(0,v.jsx)(`div`,{className:`fixed inset-0 z-60 overflow-y-auto`,children:(0,v.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:[(0,v.jsx)(`div`,{className:`fixed inset-0 transition-opacity bg-gray-500 bg-opacity-75`}),(0,v.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:[(0,v.jsxs)(`div`,{className:`sm:flex sm:items-start`,children:[(0,v.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:(0,v.jsx)(l,{className:`h-6 w-6 text-red-600`})}),(0,v.jsxs)(`div`,{className:`mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left`,children:[(0,v.jsx)(`h3`,{className:`text-lg leading-6 font-medium text-gray-900`,children:f(`deleteConfirmTitle`)}),(0,v.jsx)(`div`,{className:`mt-2`,children:(0,v.jsx)(`p`,{className:`text-sm text-gray-500`,children:f(`deleteConfirmDescription`)})})]})]}),(0,v.jsxs)(`div`,{className:`mt-5 sm:mt-4 sm:flex sm:flex-row-reverse`,children:[(0,v.jsx)(`button`,{type:`button`,onClick:()=>{o()},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:f(`deleteAllData`)}),(0,v.jsx)(`button`,{type:`button`,onClick:()=>S(!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:f(`cancel`)})]})]})]})})]})}export{_ as n,y as t};
2
+ //# sourceMappingURL=CookiePreferences-UVUl27XP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookiePreferences-UVUl27XP.js","names":["ForwardRef","ForwardRef"],"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 { 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;"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-zIDJOEfo.js";import{t as r}from"./vendor-BVP6ONpk.js";import{J as i,S as a,W as o,u as s}from"./index-BkTRe71w.js";import{i as c}from"./routing-BJiyORAR.js";var l=[{id:`necessary`,name:`Strictly Necessary`,description:`These cookies are essential for the website to function properly. They enable core functionality such as security, network management, and accessibility.`,required:!0,cookies:[`semiont-token`,`consent-preferences`]},{id:`analytics`,name:`Analytics`,description:`These cookies help us understand how visitors interact with our website by collecting and reporting information anonymously.`,required:!1,cookies:[`_ga`,`_ga_*`,`_gid`,`_gat`,`lighthouse-*`]},{id:`marketing`,name:`Marketing`,description:`These cookies are used to track visitors across websites to display relevant advertisements and measure campaign effectiveness.`,required:!1,cookies:[`_fbp`,`_fbc`,`fr`,`ads-*`]},{id:`preferences`,name:`Preferences`,description:`These cookies remember your choices and preferences to provide a more personalized experience.`,required:!1,cookies:[`theme-preference`,`language-preference`,`ui-settings`]}],u=`semiont-cookie-consent`,d={necessary:!0,analytics:!1,marketing:!1,preferences:!1,timestamp:new Date().toISOString(),version:`1.0`},f=e=>{typeof window>`u`||l.forEach(t=>{t.required||e[t.id]||t.cookies.forEach(e=>{if(e.includes(`*`)){let t=e.replace(`*`,``);document.cookie.split(`;`).forEach(e=>{let n=e.split(`=`)[0]?.trim();n&&n.startsWith(t)&&p(n)})}else p(e)})})},p=e=>{document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`,document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${window.location.hostname}`;let t=window.location.hostname.split(`.`).slice(-2).join(`.`);document.cookie=`${e}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.${t}`},m=()=>{if(typeof window>`u`)return null;try{let e=localStorage.getItem(u);if(!e)return null;let t=JSON.parse(e);return t.version===`1.0`?t:null}catch(e){return console.warn(`Failed to parse cookie consent:`,e),null}},h=e=>{if(typeof window>`u`)return;let t={...d,...e,necessary:!0,timestamp:new Date().toISOString(),version:`1.0`};try{localStorage.setItem(u,JSON.stringify(t)),f(t),window.dispatchEvent(new CustomEvent(`cookieConsentChanged`,{detail:t}))}catch(e){console.error(`Failed to save cookie consent:`,e)}},g=()=>{let e=m();if(!e)return!1;let t=new Date(e.timestamp),n=new Date;return n.setMonth(n.getMonth()-13),t>n},_=()=>typeof window>`u`?!1:!g(),v=async()=>{try{let e=Intl.DateTimeFormat().resolvedOptions().timeZone;return e.includes(`Europe/`)?`EU`:e.includes(`America/Los_Angeles`)||e.includes(`America/Vancouver`)?`CA`:e.includes(`America/`)?`US`:`OTHER`}catch{return`OTHER`}},y=async()=>await v()===`CA`,b=async()=>await v()===`EU`,x=()=>{if(typeof window>`u`)return{};let e={};document.cookie.split(`;`).forEach(t=>{let[n,r]=t.trim().split(`=`);n&&r&&(e[`cookie_${n}`]=decodeURIComponent(r))});for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(e[`localStorage_${n}`]=localStorage.getItem(n)||``)}for(let t=0;t<sessionStorage.length;t++){let n=sessionStorage.key(t);n&&(e[`sessionStorage_${n}`]=sessionStorage.getItem(n)||``)}return e},S=()=>{typeof window>`u`||(localStorage.clear(),sessionStorage.clear(),document.cookie.split(`;`).forEach(e=>{let t=e.split(`=`)[0]?.trim();t&&p(t)}),window.location.reload())},C=e(t()),w=r();function T({isOpen:e,onClose:t}){let r=c(),{t:i}=n(),o=(e,t)=>i(`Search.${e}`,t);return(0,w.jsx)(a,{isOpen:e,onClose:t,onNavigate:(e,t)=>{e===`resource`?r.push(`/know/resource/${encodeURIComponent(t)}`):r.push(`/know/entity/${t}`)},translations:{placeholder:o(`placeholder`),searching:o(`searching`),noResults:o(`noResults`),startTyping:o(`startTyping`),navigate:o(`navigate`),select:o(`select`),close:o(`close`),enter:o(`enter`),esc:o(`esc`)}})}var E=(0,C.createContext)(null);function D({children:e}){let t=c(),[n,r]=(0,C.useState)(!1),[a,l]=(0,C.useState)(!1),[u,d]=(0,C.useState)([]),f=(0,C.useCallback)(()=>{r(!0)},[]),p=(0,C.useCallback)(()=>{l(!0)},[]),m=(0,C.useCallback)(()=>{r(!1),l(!1),u.forEach(e=>e()),d([])},[u]);i([{key:`k`,ctrlOrCmd:!0,handler:()=>{f()},description:`Open global search`},{key:`n`,ctrlOrCmd:!0,handler:()=>{t.push(`/know/compose`)},description:`Create new resource`},{key:`/`,handler:()=>{f()},description:`Open global search (alternative)`},{key:`?`,shift:!0,handler:()=>{p()},description:`Show keyboard shortcuts help`}]),o(`Escape`,m,300);let h={openGlobalSearch:f,openKeyboardHelp:p,closeAllOverlays:m};return(0,w.jsxs)(E.Provider,{value:h,children:[e,n&&(0,w.jsx)(T,{isOpen:n,onClose:()=>r(!1)}),a&&(0,w.jsx)(s,{isOpen:a,onClose:()=>l(!1)})]})}export{y as a,h as c,x as i,_ as l,D as n,b as o,S as r,m as s,E as t,l as u};
2
+ //# sourceMappingURL=KeyboardShortcutsContext-D8VjaYfK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyboardShortcutsContext-D8VjaYfK.js","names":[],"sources":["../../src/lib/cookies/constants.ts","../../src/lib/cookies/cleanup.ts","../../src/lib/cookies/consent.ts","../../src/lib/cookies/privacy.ts","../../src/components/modals/GlobalSearchModal.tsx","../../src/contexts/KeyboardShortcutsContext.tsx"],"sourcesContent":["import type { CookieCategory, CookieConsent } from './types';\n\n// Cookie categories with descriptions\nexport const COOKIE_CATEGORIES: CookieCategory[] = [\n {\n id: 'necessary',\n name: 'Strictly Necessary',\n description: 'These cookies are essential for the website to function properly. They enable core functionality such as security, network management, and accessibility.',\n required: true,\n cookies: ['semiont-token', 'consent-preferences']\n },\n {\n id: 'analytics',\n name: 'Analytics',\n description: 'These cookies help us understand how visitors interact with our website by collecting and reporting information anonymously.',\n required: false,\n cookies: ['_ga', '_ga_*', '_gid', '_gat', 'lighthouse-*']\n },\n {\n id: 'marketing',\n name: 'Marketing',\n description: 'These cookies are used to track visitors across websites to display relevant advertisements and measure campaign effectiveness.',\n required: false,\n cookies: ['_fbp', '_fbc', 'fr', 'ads-*']\n },\n {\n id: 'preferences',\n name: 'Preferences',\n description: 'These cookies remember your choices and preferences to provide a more personalized experience.',\n required: false,\n cookies: ['theme-preference', 'language-preference', 'ui-settings']\n }\n];\n\n// Current consent version (increment when privacy policy changes)\nexport const CONSENT_VERSION = '1.0';\n\n// Cookie names\nexport const CONSENT_COOKIE_NAME = 'semiont-cookie-consent';\nexport const PREFERENCES_COOKIE_NAME = 'semiont-cookie-preferences';\n\n// Default consent state\nexport const DEFAULT_CONSENT: CookieConsent = {\n necessary: true, // Always true, required for functionality\n analytics: false,\n marketing: false,\n preferences: false,\n timestamp: new Date().toISOString(),\n version: CONSENT_VERSION\n};\n","import type { CookieConsent } from './types';\nimport { COOKIE_CATEGORIES } from './constants';\n\n// Clean up cookies based on consent\nexport const cleanupCookies = (consent: CookieConsent): void => {\n if (typeof window === 'undefined') return;\n\n COOKIE_CATEGORIES.forEach(category => {\n if (category.required) return; // Never clean up required cookies\n\n const hasConsent = consent[category.id];\n if (!hasConsent) {\n // Remove cookies for this category\n category.cookies.forEach(cookieName => {\n if (cookieName.includes('*')) {\n // Handle wildcard cookies\n const prefix = cookieName.replace('*', '');\n document.cookie.split(';').forEach(cookie => {\n const name = cookie.split('=')[0]?.trim();\n if (name && name.startsWith(prefix)) {\n deleteCookie(name);\n }\n });\n } else {\n deleteCookie(cookieName);\n }\n });\n }\n });\n};\n\n// Delete a specific cookie\nexport const deleteCookie = (name: string): void => {\n // Delete for current domain\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;\n // Delete for parent domain\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${window.location.hostname}`;\n // Delete for root domain\n const rootDomain = window.location.hostname.split('.').slice(-2).join('.');\n document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.${rootDomain}`;\n};\n","import type { CookieConsent } from './types';\nimport { CONSENT_COOKIE_NAME, CONSENT_VERSION, DEFAULT_CONSENT } from './constants';\nimport { cleanupCookies } from './cleanup';\n\nexport const getCookieConsent = (): CookieConsent | null => {\n if (typeof window === 'undefined') return null;\n\n try {\n const consent = localStorage.getItem(CONSENT_COOKIE_NAME);\n if (!consent) return null;\n\n const parsed = JSON.parse(consent) as CookieConsent;\n\n // Check if consent is for current version\n if (parsed.version !== CONSENT_VERSION) {\n return null; // Force re-consent for new version\n }\n\n return parsed;\n } catch (error) {\n console.warn('Failed to parse cookie consent:', error);\n return null;\n }\n};\n\nexport const setCookieConsent = (consent: Partial<CookieConsent>): void => {\n if (typeof window === 'undefined') return;\n\n const fullConsent: CookieConsent = {\n ...DEFAULT_CONSENT,\n ...consent,\n necessary: true, // Always true\n timestamp: new Date().toISOString(),\n version: CONSENT_VERSION\n };\n\n try {\n localStorage.setItem(CONSENT_COOKIE_NAME, JSON.stringify(fullConsent));\n\n // Clean up cookies based on consent\n cleanupCookies(fullConsent);\n\n // Dispatch custom event for components to react to consent changes\n window.dispatchEvent(new CustomEvent('cookieConsentChanged', {\n detail: fullConsent\n }));\n } catch (error) {\n console.error('Failed to save cookie consent:', error);\n }\n};\n\nexport const hasValidConsent = (): boolean => {\n const consent = getCookieConsent();\n if (!consent) return false;\n\n // Check if consent is less than 13 months old (GDPR requirement)\n const consentDate = new Date(consent.timestamp);\n const thirteenMonthsAgo = new Date();\n thirteenMonthsAgo.setMonth(thirteenMonthsAgo.getMonth() - 13);\n\n return consentDate > thirteenMonthsAgo;\n};\n\nexport const shouldShowBanner = (): boolean => {\n if (typeof window === 'undefined') return false;\n return !hasValidConsent();\n};\n","import { deleteCookie } from './cleanup';\n\n// Get user's location for CCPA vs GDPR detection (simplified)\nexport const getUserLocation = async (): Promise<'EU' | 'CA' | 'US' | 'OTHER'> => {\n try {\n // In a real implementation, you'd use a geolocation service\n // For now, we'll detect based on timezone as a rough approximation\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n if (timezone.includes('Europe/')) return 'EU';\n if (timezone.includes('America/Los_Angeles') || timezone.includes('America/Vancouver')) return 'CA';\n if (timezone.includes('America/')) return 'US';\n\n return 'OTHER';\n } catch {\n return 'OTHER';\n }\n};\n\n// Check if CCPA applies (California residents)\nexport const isCCPAApplicable = async (): Promise<boolean> => {\n const location = await getUserLocation();\n return location === 'CA';\n};\n\n// Check if GDPR applies (EU residents)\nexport const isGDPRApplicable = async (): Promise<boolean> => {\n const location = await getUserLocation();\n return location === 'EU';\n};\n\n// Export all cookies currently set\nexport const exportUserData = (): Record<string, string> => {\n if (typeof window === 'undefined') return {};\n\n const data: Record<string, string> = {};\n\n // Get all cookies\n document.cookie.split(';').forEach(cookie => {\n const [name, value] = cookie.trim().split('=');\n if (name && value) {\n data[`cookie_${name}`] = decodeURIComponent(value);\n }\n });\n\n // Get localStorage data\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key) {\n data[`localStorage_${key}`] = localStorage.getItem(key) || '';\n }\n }\n\n // Get sessionStorage data\n for (let i = 0; i < sessionStorage.length; i++) {\n const key = sessionStorage.key(i);\n if (key) {\n data[`sessionStorage_${key}`] = sessionStorage.getItem(key) || '';\n }\n }\n\n return data;\n};\n\n// Delete all user data (GDPR right to be forgotten)\nexport const deleteAllUserData = (): void => {\n if (typeof window === 'undefined') return;\n\n // Clear all localStorage\n localStorage.clear();\n\n // Clear all sessionStorage\n sessionStorage.clear();\n\n // Delete all cookies\n document.cookie.split(';').forEach(cookie => {\n const name = cookie.split('=')[0]?.trim();\n if (name) {\n deleteCookie(name);\n }\n });\n\n // Reload page to ensure clean state\n window.location.reload();\n};\n","import { useRouter } from '@/i18n/routing';\nimport { SearchModal } from '@semiont/react-ui';\nimport { useTranslation } from 'react-i18next';\n\ninterface GlobalSearchModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport function GlobalSearchModal({ isOpen, onClose }: GlobalSearchModalProps) {\n const router = useRouter();\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`Search.${k}`, p as any) as string;\n\n const handleNavigate = (type: 'resource' | 'entity', id: string) => {\n if (type === 'resource') {\n router.push(`/know/resource/${encodeURIComponent(id)}`);\n } else {\n router.push(`/know/entity/${id}`);\n }\n };\n\n return (\n <SearchModal\n isOpen={isOpen}\n onClose={onClose}\n onNavigate={handleNavigate}\n translations={{\n placeholder: t('placeholder'),\n searching: t('searching'),\n noResults: t('noResults'),\n startTyping: t('startTyping'),\n navigate: t('navigate'),\n select: t('select'),\n close: t('close'),\n enter: t('enter'),\n esc: t('esc'),\n }}\n />\n );\n}","import React, { createContext, useContext, useState, useCallback } from 'react';\nimport { useRouter } from '@/i18n/routing';\nimport { useKeyboardShortcuts, useDoubleKeyPress, KeyboardShortcutsHelpModal } from '@semiont/react-ui';\nimport { GlobalSearchModal } from '../components/modals/GlobalSearchModal';\n\ninterface KeyboardShortcutsContextType {\n openGlobalSearch: () => void;\n openKeyboardHelp: () => void;\n closeAllOverlays: () => void;\n}\n\nexport const KeyboardShortcutsContext = createContext<KeyboardShortcutsContextType | null>(null);\n\nexport function useKeyboardShortcutsContext() {\n const context = useContext(KeyboardShortcutsContext);\n if (!context) {\n throw new Error('useKeyboardShortcutsContext must be used within KeyboardShortcutsProvider');\n }\n return context;\n}\n\ninterface KeyboardShortcutsProviderProps {\n children: React.ReactNode;\n}\n\nexport function KeyboardShortcutsProvider({ children }: KeyboardShortcutsProviderProps) {\n const router = useRouter();\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [isHelpOpen, setIsHelpOpen] = useState(false);\n const [overlayCloseCallbacks, setOverlayCloseCallbacks] = useState<(() => void)[]>([]);\n\n // Open global search\n const openGlobalSearch = useCallback(() => {\n setIsSearchOpen(true);\n }, []);\n\n // Open keyboard help\n const openKeyboardHelp = useCallback(() => {\n setIsHelpOpen(true);\n }, []);\n\n // Close all overlays\n const closeAllOverlays = useCallback(() => {\n // Close all modals\n setIsSearchOpen(false);\n setIsHelpOpen(false);\n\n // Call all registered overlay close callbacks\n overlayCloseCallbacks.forEach(callback => callback());\n\n // Clear the callbacks\n setOverlayCloseCallbacks([]);\n }, [overlayCloseCallbacks]);\n\n // Register global keyboard shortcuts\n useKeyboardShortcuts([\n {\n key: 'k',\n ctrlOrCmd: true,\n handler: () => {\n openGlobalSearch();\n },\n description: 'Open global search'\n },\n {\n key: 'n',\n ctrlOrCmd: true,\n handler: () => {\n // Navigate to compose page to create new resource\n router.push('/know/compose');\n },\n description: 'Create new resource'\n },\n {\n key: '/',\n handler: () => {\n // Alternative search trigger (like GitHub)\n openGlobalSearch();\n },\n description: 'Open global search (alternative)'\n },\n {\n key: '?',\n shift: true,\n handler: () => {\n // Open keyboard shortcuts help\n openKeyboardHelp();\n },\n description: 'Show keyboard shortcuts help'\n }\n ]);\n\n // Double Escape to close all overlays\n useDoubleKeyPress('Escape', closeAllOverlays, 300);\n\n const contextValue: KeyboardShortcutsContextType = {\n openGlobalSearch,\n openKeyboardHelp,\n closeAllOverlays\n };\n\n return (\n <KeyboardShortcutsContext.Provider value={contextValue}>\n {children}\n {isSearchOpen && (\n <GlobalSearchModal\n isOpen={isSearchOpen}\n onClose={() => setIsSearchOpen(false)}\n />\n )}\n {isHelpOpen && (\n <KeyboardShortcutsHelpModal\n isOpen={isHelpOpen}\n onClose={() => setIsHelpOpen(false)}\n />\n )}\n </KeyboardShortcutsContext.Provider>\n );\n}"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t}from"./i18n-zIDJOEfo.js";import{t as n}from"./vendor-BVP6ONpk.js";import{$t as r,Mt as i,an as a,dn as o,en as s,in as c,ln as l,nn as u,nt as d,rn as f,tn as p,un as m}from"./index-BkTRe71w.js";var h=e(t(),1),g=n();function _(e){let t=p(e);return t?(Array.isArray(t)?t:[t]).filter(e=>e.type===`FragmentSelector`).map(e=>e):[]}function v(e,t){let n=[];for(let r of e)_(r.target).forEach((e,i)=>{let a=f(e.value);a&&a.page===t&&n.push({annId:r.id,selectorIndex:i,coord:a,annotation:r})});return n}function y(e,t,n){return!e||!t||!n||e<=0||t<=0||n<=0?null:Math.round(Math.min(e,t)*n)}function b(e,t,n,r,i=1){let a=Math.min(e.startX,e.endX),o=Math.min(e.startY,e.endY),s=Math.max(e.startX,e.endX),c=Math.max(e.startY,e.endY),l=a/i,u=(s-a)/i,d=r-c/i,f=(c-o)/i;return{page:t,x:Math.round(l),y:Math.round(d),width:Math.round(u),height:Math.round(f)}}function x(e,t,n=1){let r=e.x*n,i=e.width*n;return{x:r,y:(t-e.y-e.height)*n,width:i,height:e.height*n}}var S=`100% 0px`,C=30,w=`vertical`;function T(e,t){typeof e?.scrollIntoView==`function`&&e.scrollIntoView(t)}function E(e){if(!e)return{stroke:`rgb(156, 163, 175)`,fill:`rgba(156, 163, 175, 0.2)`};switch(e){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 D({doc:e,pageNumber:t,scale:n,resourceUri:l,existingAnnotations:f,drawingMode:p,selectedMotivation:_,session:y,hoveredAnnotationId:S,selectedAnnotationId:C,hoverDelayMs:w,fetchResourceAnchored:T}){let[D,O]=(0,h.useState)(null),[k,A]=(0,h.useState)(null),[j,M]=(0,h.useState)(null),[N,P]=(0,h.useState)(null),[F,I]=(0,h.useState)(null),L=d(`PdfViewer`),[R,z]=(0,h.useState)(!1),[B,V]=(0,h.useState)(null),H=(0,h.useRef)(null);(0,h.useEffect)(()=>{let i=!1;async function a(e){try{let n=(await e.getTextContent()).items.filter(u);return n.length>0?r(n,t):await T()}catch{return null}}async function o(){try{let r=await e.getPage(t);if(i)return;let o=r.getViewport({scale:1});A({width:o.width,height:o.height});let[s,{dataUrl:c}]=await Promise.all([a(r),m(r,n)]);if(i)return;M(s),O(c)}catch(e){if(i)return;console.error(`Error loading page:`,e),I(`pageLoadFailed`)}}return o(),()=>{i=!0}},[e,t,n,T]),(0,h.useEffect)(()=>{let e=()=>{H.current&&P({width:H.current.clientWidth,height:H.current.clientHeight})};e();let t=null;try{t=new ResizeObserver(e),H.current&&t.observe(H.current)}catch{console.warn(`ResizeObserver not supported, falling back to window resize listener`),window.addEventListener(`resize`,e)}return()=>{t?t.disconnect():window.removeEventListener(`resize`,e)}},[D]);let U=(0,h.useCallback)(e=>{if(!p||!H.current)return;let t=H.current.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;z(!0),V({startX:n,startY:r,endX:n,endY:r})},[p]),W=(0,h.useCallback)(e=>{if(!R||!B||!H.current)return;let t=H.current.getBoundingClientRect();V({...B,endX:e.clientX-t.left,endY:e.clientY-t.top})},[R,B]),G=(0,h.useCallback)(()=>{if(!R||!B||!k||!N||!y){z(!1),V(null);return}if(Math.sqrt((B.endX-B.startX)**2+(B.endY-B.startY)**2)<10){if(f.length>0){let e,n=v(f,t).find(t=>{let n=x(t.coord,k.height,1),r=N.width/k.width,i=N.height/k.height,a=n.x*r,s=n.y*i,c=n.width*r,l=n.height*i,u=B.endX>=a&&B.endX<=a+c&&B.endY>=s&&B.endY<=s+l;return u&&H.current&&(e=o(H.current.getBoundingClientRect(),a,s,c,l)),u});if(n){y?.client.browse.click(n.annId,e),z(!1),V(null);return}}z(!1),V(null);return}let e=k.width/N.width,n=k.height/N.height,r=b({startX:B.startX*e,startY:B.startY*n,endX:B.endX*e,endY:B.endY*n},t,k.width,k.height,1),i=s(r),u=j?a(j,r):``;_&&y.client.mark.request(c(l),[{type:`FragmentSelector`,conformsTo:`http://tools.ietf.org/rfc/rfc3778`,value:i},...u?[{type:`TextQuoteSelector`,exact:u}]:[]],_),z(!1)},[R,B,t,k,N,_,f,y,l,j]),K=v(f,t),{handleMouseEnter:q,handleMouseLeave:J}=(0,h.useMemo)(()=>i(e=>y?.client.beckon.hover(e),w),[y,w]),{stroke:Y,fill:X}=E(_??null);return F?(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__error`,children:L(F)}):(0,g.jsxs)(`div`,{className:`semiont-pdf-annotation-canvas__container`,onMouseDown:U,onMouseMove:W,onMouseUp:G,onMouseLeave:()=>{R&&(z(!1),V(null))},"data-drawing-mode":p||`none`,children:[D&&(0,g.jsx)(`img`,{ref:H,src:D,alt:`PDF page ${t}`,className:`semiont-pdf-annotation-canvas__image`,draggable:!1,style:{pointerEvents:`none`},onLoad:()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{H.current&&P({width:H.current.clientWidth,height:H.current.clientHeight})})})}}),N&&k&&(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__overlay-container`,children:(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__overlay`,children:(0,g.jsxs)(`svg`,{className:`semiont-pdf-annotation-canvas__svg`,width:N.width,height:N.height,children:[K.map(e=>{let t=x(e.coord,k.height,1),n=N.width/k.width,r=N.height/k.height,i=e.annId===S,a=e.annId===C,o=e.annotation.motivation,{stroke:s,fill:c}=E(o);return(0,g.jsx)(`rect`,{x:t.x*n,y:t.y*r,width:t.width*n,height:t.height*r,stroke:s,strokeWidth:a?4:i?3:2,fill:c,style:{pointerEvents:`auto`,cursor:`pointer`,opacity:a?1:i?.9:.7},onClick:t=>y?.client.browse.click(e.annId,t.currentTarget.getBoundingClientRect()),onMouseEnter:()=>q(e.annId),onMouseLeave:J},`${e.annId}:${e.selectorIndex}`)}),B&&(()=>{let e=Math.min(B.startX,B.endX),t=Math.min(B.startY,B.endY),n=Math.abs(B.endX-B.startX),r=Math.abs(B.endY-B.startY);return(0,g.jsx)(`rect`,{x:e,y:t,width:n,height:r,stroke:Y,strokeWidth:2,strokeDasharray:`5,5`,fill:X,pointerEvents:`none`})})()]})})})]})}function O({pdfUrl:e,resourceUri:t,existingAnnotations:n=[],drawingMode:r,selectedMotivation:i,session:a,hoveredAnnotationId:o,selectedAnnotationId:s,hoverDelayMs:u=150,pageLayout:f=`paged`}){let[p,m]=(0,h.useState)(null),[_,v]=(0,h.useState)(0),[b,x]=(0,h.useState)(1),[E,O]=(0,h.useState)(!0),[k,A]=(0,h.useState)(null),j=d(`PdfViewer`),[M,N]=(0,h.useState)(null),[P,F]=(0,h.useState)(null),I=(0,h.useRef)(null),[L]=(0,h.useState)(1.5),[R,z]=(0,h.useState)(new Set),[B,V]=(0,h.useState)(new Set),H=(0,h.useRef)(new Map),U=(0,h.useRef)(null),W=(0,h.useRef)(null);(0,h.useEffect)(()=>{let t=!1;async function n(){try{O(!0),A(null);let n=await l(e);if(t)return;m(n),v(n.numPages),O(!1);try{let e=await n.getPage(1);if(t)return;let r=e.getViewport({scale:1});N({aspect:r.height/r.width,rasterWidth:e.getViewport({scale:L}).width})}catch{}}catch(e){if(t)return;console.error(`Error loading PDF:`,e),A(`loadFailed`),O(!1)}}return n(),()=>{t=!0}},[e,L]);let G=(0,h.useRef)(null),K=(0,h.useCallback)(()=>{if(!a)return Promise.resolve(null);let e=G.current;if(e&&e.uri===t)return e.outcome;let n=t,r=a.client.browse.resourceAnchoredText(c(n)).then(e=>e&&e.kind===`extracted`?e:null,()=>(G.current?.uri===n&&(G.current=null),null));return G.current={uri:n,outcome:r},r},[a,t]);(0,h.useEffect)(()=>{if(f!==`scroll`)return;let e=()=>{I.current&&F(I.current.clientWidth)};e();let t=null;try{t=new ResizeObserver(e),I.current&&t.observe(I.current)}catch{window.addEventListener(`resize`,e)}return()=>{t?t.disconnect():window.removeEventListener(`resize`,e)}},[f]);let q=y(P,M?.rasterWidth??null,M?.aspect??null)??(M?Math.round(M.rasterWidth*M.aspect):null);(0,h.useEffect)(()=>{if(f!==`scroll`||_===0)return;let e=null;try{e=new IntersectionObserver(e=>{z(t=>{let n=new Set(t);for(let t of e){let e=Number(t.target.dataset.page);e&&(t.isIntersecting?n.add(e):n.delete(e))}return n})},{rootMargin:S})}catch{z(new Set(Array.from({length:_},(e,t)=>t+1)));return}U.current=e;for(let t of H.current.values())e.observe(t);let t=null;try{t=new IntersectionObserver(e=>{V(t=>{let n=new Set(t);for(let t of e){let e=Number(t.target.dataset.page);e&&(t.isIntersecting?n.add(e):n.delete(e))}return n})}),W.current=t;for(let e of H.current.values())t.observe(e)}catch{V(new Set([1]))}return()=>{e.disconnect(),U.current=null,t?.disconnect(),W.current=null}},[f,_]);let J=(0,h.useCallback)(e=>t=>{let n=H.current.get(e);n&&(U.current?.unobserve(n),W.current?.unobserve(n)),t?(H.current.set(e,t),U.current?.observe(t),W.current?.observe(t)):H.current.delete(e)},[]),Y=(0,h.useRef)(null),X=(0,h.useCallback)(e=>{T(H.current.get(e),{block:`start`})},[]),Z=f===`scroll`?B.size>0?Math.min(...B):1:b;(0,h.useEffect)(()=>{if(_===0)return;let e=[`ArrowLeft`,`PageUp`],t=[`ArrowRight`,`PageDown`],n=n=>{if(!e.includes(n.key)&&!t.includes(n.key)||n.metaKey||n.ctrlKey||n.altKey)return;let r=n.target,i=r?.tagName;if(i===`INPUT`||i===`TEXTAREA`||i===`SELECT`||r?.isContentEditable)return;let a=t.includes(n.key)?Z+1:Z-1;a<1||a>_||(n.preventDefault(),f===`scroll`?X(a):x(a))};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[_,Z,f,X]);let Q=(0,h.useRef)(null);(0,h.useEffect)(()=>{let e=Q.current;if(f!==`scroll`||!e)return;let t=e.parentElement;for(;t;){let e=getComputedStyle(t).overflowY;if(e===`auto`||e===`scroll`)break;t=t.parentElement}if(!t)return;let n=t,r=()=>{e.style.maxHeight=`${n.clientHeight}px`};r();let i=null;try{i=new ResizeObserver(r),i.observe(n)}catch{window.addEventListener(`resize`,r)}return()=>{i?i.disconnect():window.removeEventListener(`resize`,r)}},[f,_,M]),(0,h.useEffect)(()=>{T(Y.current,{block:`nearest`,inline:`nearest`});let e=typeof document<`u`?document.activeElement:null;e&&Q.current?.contains(e)&&e!==Y.current&&Y.current?.focus()},[Z]);let $={scale:L,resourceUri:t,existingAnnotations:n,drawingMode:r,selectedMotivation:i,session:a,hoveredAnnotationId:o,selectedAnnotationId:s,hoverDelayMs:u,fetchResourceAnchored:K};return k?(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__error`,children:j(k)}):(0,g.jsxs)(`div`,{className:`semiont-pdf-annotation-canvas`,children:[E&&(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__loading`,children:j(`loading`)}),p&&f===`scroll`?(0,g.jsxs)(`div`,{className:`semiont-pdf-annotation-canvas__viewport`,"data-axis":w,children:[_>0&&M&&(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__strip`,"data-axis":w,"data-scroller":`true`,"aria-orientation":w,ref:Q,children:Array.from({length:_},(e,t)=>t+1).map(e=>(0,g.jsx)(`button`,{type:`button`,"data-page":e,className:`semiont-pdf-annotation-canvas__strip-page`,style:{height:`${Math.round(C*M.aspect)}px`},"aria-label":j(`pageOf`,{page:e,total:_}),tabIndex:e===Z?0:-1,...e===Z?{"aria-current":`page`}:{},ref:e===Z?Y:void 0,onClick:()=>X(e),children:e},e))}),(0,g.jsx)(`div`,{className:`semiont-pdf-annotation-canvas__column`,"data-axis":w,ref:I,children:Array.from({length:_},(e,t)=>t+1).map(e=>(0,g.jsx)(`div`,{ref:J(e),"data-page":e,className:`semiont-pdf-annotation-canvas__slot`,style:q?{minHeight:q}:void 0,children:R.has(e)&&(0,g.jsx)(D,{doc:p,pageNumber:e,...$})},e))})]}):p&&!E&&(0,g.jsx)(D,{doc:p,pageNumber:b,...$},b),_>0&&(0,g.jsxs)(`nav`,{className:`semiont-pdf-annotation-canvas__controls`,"aria-label":j(`pagination`),children:[(0,g.jsx)(`button`,{disabled:Z<=1,onClick:()=>f===`scroll`?X(Z-1):x(b-1),className:`semiont-pdf-annotation-canvas__button`,children:j(`previous`)}),(0,g.jsx)(`span`,{className:`semiont-pdf-annotation-canvas__page-info`,"aria-live":`polite`,children:j(`pageOf`,{page:Z,total:_})}),(0,g.jsx)(`button`,{disabled:Z>=_,onClick:()=>f===`scroll`?X(Z+1):x(b+1),className:`semiont-pdf-annotation-canvas__button`,children:j(`next`)})]})]})}export{O as PdfAnnotationCanvas};
2
+ //# sourceMappingURL=PdfAnnotationCanvas.client-LSH3PZPY-B8dnEIps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfAnnotationCanvas.client-LSH3PZPY-B8dnEIps.js","names":[],"sources":["../../../../packages/react-ui/dist/PdfAnnotationCanvas.client-LSH3PZPY.js"],"sourcesContent":["'use client';\n\"use client\";\nimport {\n loadPdfDocument,\n renderPdfPageToDataUrl,\n toViewportAnchorRect\n} from \"./chunk-3ZBKCWUZ.js\";\nimport {\n useTranslations\n} from \"./chunk-G4VHL4UA.js\";\nimport \"./chunk-SDKFZLEX.js\";\nimport \"./chunk-O23TLLXW.js\";\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { useRef, useState, useCallback, useEffect, useMemo } from \"react\";\nimport { resourceId as toResourceId } from \"@semiont/core\";\nimport { createFragmentSelector, anchorRuns, isTextRun, textUnder } from \"@semiont/core\";\n\n// src/components/pdf-annotation/rects-for-page.ts\nimport { getTargetSelector, parseFragmentSelector } from \"@semiont/core\";\nfunction fragmentSelectors(target) {\n const selector = getTargetSelector(target);\n if (!selector) return [];\n const selectors = Array.isArray(selector) ? selector : [selector];\n return selectors.filter((s) => s.type === \"FragmentSelector\").map((s) => s);\n}\nfunction rectsForPage(annotations, pageNumber) {\n const rects = [];\n for (const annotation of annotations) {\n fragmentSelectors(annotation.target).forEach((sel, selectorIndex) => {\n const coord = parseFragmentSelector(sel.value);\n if (coord && coord.page === pageNumber) {\n rects.push({ annId: annotation.id, selectorIndex, coord, annotation });\n }\n });\n }\n return rects;\n}\n\n// src/components/pdf-annotation/estimate-slot-height.ts\nfunction estimateSlotHeight(columnWidth, rasterWidth, aspect) {\n if (!columnWidth || !rasterWidth || !aspect) return null;\n if (columnWidth <= 0 || rasterWidth <= 0 || aspect <= 0) return null;\n return Math.round(Math.min(columnWidth, rasterWidth) * aspect);\n}\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { createHoverHandlers } from \"@semiont/sdk\";\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}\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar PRELOAD_MARGIN = \"100% 0px\";\nvar STRIP_PAGE_WIDTH = 30;\nvar SCROLL_AXIS = \"vertical\";\nfunction scrollElementIntoView(el, options) {\n if (typeof el?.scrollIntoView === \"function\") el.scrollIntoView(options);\n}\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 PdfPageView({\n doc,\n pageNumber,\n scale,\n resourceUri,\n existingAnnotations,\n drawingMode,\n selectedMotivation,\n session,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs,\n fetchResourceAnchored\n}) {\n const [pageImageUrl, setPageImageUrl] = useState(null);\n const [pageDimensions, setPageDimensions] = useState(null);\n const [pageAnchored, setPageAnchored] = useState(null);\n const [displayDimensions, setDisplayDimensions] = useState(null);\n const [errorKey, setErrorKey] = useState(null);\n const t = useTranslations(\"PdfViewer\");\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState(null);\n const imageRef = useRef(null);\n useEffect(() => {\n let cancelled = false;\n async function resolveAnchored(page) {\n try {\n const runs = (await page.getTextContent()).items.filter(isTextRun);\n if (runs.length > 0) return anchorRuns(runs, pageNumber);\n return await fetchResourceAnchored();\n } catch {\n return null;\n }\n }\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({ width: viewport.width, height: viewport.height });\n const [anchored, { dataUrl }] = await Promise.all([\n resolveAnchored(page),\n renderPdfPageToDataUrl(page, scale)\n ]);\n if (cancelled) return;\n setPageAnchored(anchored);\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading page:\", err);\n setErrorKey(\"pageLoadFailed\");\n }\n }\n loadPage();\n return () => {\n cancelled = true;\n };\n }, [doc, pageNumber, scale, fetchResourceAnchored]);\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 (error) {\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 || !session) {\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 let hitRect;\n const hit = rectsForPage(existingAnnotations, pageNumber).find((r) => {\n const rect = pdfToCanvasCoordinates(r.coord, 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 const inside = selection.endX >= displayX && selection.endX <= displayX + displayWidth && selection.endY >= displayY && selection.endY <= displayY + displayHeight;\n if (inside && imageRef.current) {\n hitRect = toViewportAnchorRect(imageRef.current.getBoundingClientRect(), displayX, displayY, displayWidth, displayHeight);\n }\n return inside;\n });\n if (hit) {\n session?.client.browse.click(hit.annId, hitRect);\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 const quoted = pageAnchored ? textUnder(pageAnchored, pdfCoord) : \"\";\n if (selectedMotivation) {\n session.client.mark.request(\n toResourceId(resourceUri),\n [\n {\n type: \"FragmentSelector\",\n conformsTo: \"http://tools.ietf.org/rfc/rfc3778\",\n value: fragmentSelector\n },\n ...quoted ? [{ type: \"TextQuoteSelector\", exact: quoted }] : []\n ],\n selectedMotivation\n );\n }\n setIsDrawing(false);\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, selectedMotivation, existingAnnotations, session, resourceUri, pageAnchored]);\n const pageRects = rectsForPage(existingAnnotations, pageNumber);\n const { handleMouseEnter, handleMouseLeave } = useMemo(\n () => createHoverHandlers((id) => session?.client.beckon.hover(id), hoverDelayMs),\n [session, hoverDelayMs]\n );\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n if (errorKey) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__error\", children: t(errorKey) });\n }\n return /* @__PURE__ */ jsxs(\n \"div\",\n {\n className: \"semiont-pdf-annotation-canvas__container\",\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 pageRects.map((r) => {\n const rect = pdfToCanvasCoordinates(r.coord, pageDimensions.height, 1);\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n const isHovered = r.annId === hoveredAnnotationId;\n const isSelected = r.annId === selectedAnnotationId;\n const annMotivation = r.annotation.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: (e) => session?.client.browse.click(r.annId, e.currentTarget.getBoundingClientRect()),\n onMouseEnter: () => handleMouseEnter(r.annId),\n onMouseLeave: handleMouseLeave\n },\n `${r.annId}:${r.selectorIndex}`\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}\nfunction PdfAnnotationCanvas({\n pdfUrl,\n resourceUri,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n session,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs = 150,\n pageLayout = \"paged\"\n}) {\n const [pdfDoc, setPdfDoc] = useState(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [isLoading, setIsLoading] = useState(true);\n const [errorKey, setErrorKey] = useState(null);\n const t = useTranslations(\"PdfViewer\");\n const [pageShape, setPageShape] = useState(null);\n const [columnWidth, setColumnWidth] = useState(null);\n const columnRef = useRef(null);\n const [scale] = useState(1.5);\n const [visiblePages, setVisiblePages] = useState(/* @__PURE__ */ new Set());\n const [onscreenPages, setOnscreenPages] = useState(/* @__PURE__ */ new Set());\n const slotRefs = useRef(/* @__PURE__ */ new Map());\n const observerRef = useRef(null);\n const onscreenRef = useRef(null);\n useEffect(() => {\n let cancelled = false;\n async function loadPdf() {\n try {\n setIsLoading(true);\n setErrorKey(null);\n const doc = await loadPdfDocument(pdfUrl);\n if (cancelled) return;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n try {\n const first = await doc.getPage(1);\n if (cancelled) return;\n const natural = first.getViewport({ scale: 1 });\n setPageShape({\n aspect: natural.height / natural.width,\n rasterWidth: first.getViewport({ scale }).width\n });\n } catch {\n }\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading PDF:\", err);\n setErrorKey(\"loadFailed\");\n setIsLoading(false);\n }\n }\n loadPdf();\n return () => {\n cancelled = true;\n };\n }, [pdfUrl, scale]);\n const resourceAnchoredRef = useRef(null);\n const fetchResourceAnchored = useCallback(() => {\n if (!session) return Promise.resolve(null);\n const cached = resourceAnchoredRef.current;\n if (cached && cached.uri === resourceUri) return cached.outcome;\n const uri = resourceUri;\n const outcome = session.client.browse.resourceAnchoredText(toResourceId(uri)).then(\n (served) => served && served.kind === \"extracted\" ? served : null,\n () => {\n if (resourceAnchoredRef.current?.uri === uri) resourceAnchoredRef.current = null;\n return null;\n }\n );\n resourceAnchoredRef.current = { uri, outcome };\n return outcome;\n }, [session, resourceUri]);\n useEffect(() => {\n if (pageLayout !== \"scroll\") return;\n const measure = () => {\n if (columnRef.current) setColumnWidth(columnRef.current.clientWidth);\n };\n measure();\n let observer = null;\n try {\n observer = new ResizeObserver(measure);\n if (columnRef.current) observer.observe(columnRef.current);\n } catch {\n window.addEventListener(\"resize\", measure);\n }\n return () => {\n if (observer) observer.disconnect();\n else window.removeEventListener(\"resize\", measure);\n };\n }, [pageLayout]);\n const slotHeight = estimateSlotHeight(columnWidth, pageShape?.rasterWidth ?? null, pageShape?.aspect ?? null) ?? (pageShape ? Math.round(pageShape.rasterWidth * pageShape.aspect) : null);\n useEffect(() => {\n if (pageLayout !== \"scroll\" || numPages === 0) return;\n let observer = null;\n try {\n observer = new IntersectionObserver(\n (entries) => {\n setVisiblePages((prev) => {\n const next = new Set(prev);\n for (const entry of entries) {\n const page = Number(entry.target.dataset.page);\n if (!page) continue;\n if (entry.isIntersecting) next.add(page);\n else next.delete(page);\n }\n return next;\n });\n },\n { rootMargin: PRELOAD_MARGIN }\n );\n } catch {\n setVisiblePages(new Set(Array.from({ length: numPages }, (_, i) => i + 1)));\n return;\n }\n observerRef.current = observer;\n for (const el of slotRefs.current.values()) observer.observe(el);\n let onscreen = null;\n try {\n onscreen = new IntersectionObserver((entries) => {\n setOnscreenPages((prev) => {\n const next = new Set(prev);\n for (const entry of entries) {\n const page = Number(entry.target.dataset.page);\n if (!page) continue;\n if (entry.isIntersecting) next.add(page);\n else next.delete(page);\n }\n return next;\n });\n });\n onscreenRef.current = onscreen;\n for (const el of slotRefs.current.values()) onscreen.observe(el);\n } catch {\n setOnscreenPages(/* @__PURE__ */ new Set([1]));\n }\n return () => {\n observer.disconnect();\n observerRef.current = null;\n onscreen?.disconnect();\n onscreenRef.current = null;\n };\n }, [pageLayout, numPages]);\n const registerSlot = useCallback((page) => (el) => {\n const previous = slotRefs.current.get(page);\n if (previous) {\n observerRef.current?.unobserve(previous);\n onscreenRef.current?.unobserve(previous);\n }\n if (el) {\n slotRefs.current.set(page, el);\n observerRef.current?.observe(el);\n onscreenRef.current?.observe(el);\n } else {\n slotRefs.current.delete(page);\n }\n }, []);\n const currentTickRef = useRef(null);\n const scrollToPage = useCallback((page) => {\n scrollElementIntoView(slotRefs.current.get(page), { block: \"start\" });\n }, []);\n const currentPage = pageLayout === \"scroll\" ? onscreenPages.size > 0 ? Math.min(...onscreenPages) : 1 : pageNumber;\n useEffect(() => {\n if (numPages === 0) return;\n const BACK = [\"ArrowLeft\", \"PageUp\"];\n const FORWARD = [\"ArrowRight\", \"PageDown\"];\n const onKeyDown = (e) => {\n if (!BACK.includes(e.key) && !FORWARD.includes(e.key)) return;\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n const el = e.target;\n const tag = el?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || tag === \"SELECT\" || el?.isContentEditable) return;\n const next = FORWARD.includes(e.key) ? currentPage + 1 : currentPage - 1;\n if (next < 1 || next > numPages) return;\n e.preventDefault();\n if (pageLayout === \"scroll\") scrollToPage(next);\n else setPageNumber(next);\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [numPages, currentPage, pageLayout, scrollToPage]);\n const stripRef = useRef(null);\n useEffect(() => {\n const strip = stripRef.current;\n if (pageLayout !== \"scroll\" || !strip) return;\n let scroller = strip.parentElement;\n while (scroller) {\n const overflowY = getComputedStyle(scroller).overflowY;\n if (overflowY === \"auto\" || overflowY === \"scroll\") break;\n scroller = scroller.parentElement;\n }\n if (!scroller) return;\n const clip = scroller;\n const size = () => {\n strip.style.maxHeight = `${clip.clientHeight}px`;\n };\n size();\n let observer = null;\n try {\n observer = new ResizeObserver(size);\n observer.observe(clip);\n } catch {\n window.addEventListener(\"resize\", size);\n }\n return () => {\n if (observer) observer.disconnect();\n else window.removeEventListener(\"resize\", size);\n };\n }, [pageLayout, numPages, pageShape]);\n useEffect(() => {\n scrollElementIntoView(currentTickRef.current, { block: \"nearest\", inline: \"nearest\" });\n const active = typeof document !== \"undefined\" ? document.activeElement : null;\n if (active && stripRef.current?.contains(active) && active !== currentTickRef.current) {\n currentTickRef.current?.focus();\n }\n }, [currentPage]);\n const pageProps = {\n scale,\n resourceUri,\n existingAnnotations,\n drawingMode,\n selectedMotivation,\n session,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs,\n fetchResourceAnchored\n };\n if (errorKey) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__error\", children: t(errorKey) });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas\", children: [\n isLoading && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__loading\", children: t(\"loading\") }),\n pdfDoc && pageLayout === \"scroll\" ? /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas__viewport\", \"data-axis\": SCROLL_AXIS, children: [\n numPages > 0 && pageShape && /* @__PURE__ */ jsx(\n \"div\",\n {\n className: \"semiont-pdf-annotation-canvas__strip\",\n \"data-axis\": SCROLL_AXIS,\n \"data-scroller\": \"true\",\n \"aria-orientation\": SCROLL_AXIS,\n ref: stripRef,\n children: Array.from({ length: numPages }, (_, i) => i + 1).map((page) => /* @__PURE__ */ jsx(\n \"button\",\n {\n type: \"button\",\n \"data-page\": page,\n className: \"semiont-pdf-annotation-canvas__strip-page\",\n style: { height: `${Math.round(STRIP_PAGE_WIDTH * pageShape.aspect)}px` },\n \"aria-label\": t(\"pageOf\", { page, total: numPages }),\n tabIndex: page === currentPage ? 0 : -1,\n ...page === currentPage ? { \"aria-current\": \"page\" } : {},\n ref: page === currentPage ? currentTickRef : void 0,\n onClick: () => scrollToPage(page),\n children: page\n },\n page\n ))\n }\n ),\n /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__column\", \"data-axis\": SCROLL_AXIS, ref: columnRef, children: Array.from({ length: numPages }, (_, i) => i + 1).map((page) => /* @__PURE__ */ jsx(\n \"div\",\n {\n ref: registerSlot(page),\n \"data-page\": page,\n className: \"semiont-pdf-annotation-canvas__slot\",\n style: slotHeight ? { minHeight: slotHeight } : void 0,\n children: visiblePages.has(page) && /* @__PURE__ */ jsx(PdfPageView, { doc: pdfDoc, pageNumber: page, ...pageProps })\n },\n page\n )) })\n ] }) : pdfDoc && !isLoading && // `key` is load-bearing: without it React reuses this instance\n // across page changes, so the previous page's raster, text map and\n // load error survive into the next page — a stale overlay, a quote\n // taken from the wrong page, and an error that never clears. Each\n // page is a different thing; mounting it as one resets all of it.\n /* @__PURE__ */ jsx(PdfPageView, { doc: pdfDoc, pageNumber, ...pageProps }, pageNumber),\n numPages > 0 && /* @__PURE__ */ jsxs(\"nav\", { className: \"semiont-pdf-annotation-canvas__controls\", \"aria-label\": t(\"pagination\"), children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: currentPage <= 1,\n onClick: () => pageLayout === \"scroll\" ? scrollToPage(currentPage - 1) : setPageNumber(pageNumber - 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: t(\"previous\")\n }\n ),\n /* @__PURE__ */ jsx(\"span\", { className: \"semiont-pdf-annotation-canvas__page-info\", \"aria-live\": \"polite\", children: t(\"pageOf\", { page: currentPage, total: numPages }) }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: currentPage >= numPages,\n onClick: () => pageLayout === \"scroll\" ? scrollToPage(currentPage + 1) : setPageNumber(pageNumber + 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: t(\"next\")\n }\n )\n ] })\n ] });\n}\nexport {\n PdfAnnotationCanvas\n};\n//# sourceMappingURL=PdfAnnotationCanvas.client-LSH3PZPY.js.map"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./i18n-zIDJOEfo.js";import{t as r}from"./vendor-BVP6ONpk.js";import{At as i,B as a,G as o,H as s,It as c,K as l,Lt as u,Nt as d,Pt as f,Q as p,Rt as m,U as h,X as g,Y as _,Z as v,a as y,cn as b,et as x,h as S,kt as C,on as w,q as T,sn as E,w as D}from"./index-BkTRe71w.js";import{n as O,t as k}from"./XMarkIcon-CVrfCz2h.js";import{i as A,n as j,r as M}from"./routing-BJiyORAR.js";var N=e(t());function P({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.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`}))}var F=N.forwardRef(P);function I({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m4.5 12.75 6 6 9-13.5`}))}var ee=N.forwardRef(I);function L({title:e,titleId:t,...n},r){return N.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},n),e?N.createElement(`title`,{id:t},e):null,N.createElement(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M12 4.5v15m7.5-7.5h-15`}))}var R=N.forwardRef(L),z=r(),B=`data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==`;function V(){let{t:e}=n(),t=(t,n)=>e(`UserPanel.${t}`,n),r=i(),a=_(r.activeSession$),o=_(a?.user$)??null,c=a?.kb??null,l=o?.name??o?.email?.split(`@`)[0]??`User`,u=o?.image??null,d=o?.domain||o?.email?.split(`@`)[1],f=o?.isAdmin??!1,p=o?.isModerator??!1,[m,g]=(0,N.useState)(!1),{timeRemaining:y}=v(),b=s(y)??`Unknown`,x=!u||m?B:h(u)||(console.warn(`Invalid profile image URL detected, using fallback`),B);return(0,z.jsxs)(`div`,{className:`semiont-user-panel`,children:[(0,z.jsx)(`h3`,{className:`semiont-user-panel__title`,children:t(`account`)}),c&&(0,z.jsx)(`div`,{style:{padding:`0 0.75rem 0.5rem`,fontSize:`0.8rem`,color:`var(--semiont-color-neutral-400)`},children:c.label}),(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,z.jsx)(`img`,{src:x,alt:t(`profileAlt`,{name:l||t(`user`)}),width:48,height:48,className:`w-12 h-12 rounded-full object-cover`,onError:()=>g(!0)}),(0,z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-text`,children:l||t(`user`)}),d&&(0,z.jsxs)(`div`,{className:`semiont-panel-text-secondary`,children:[`@`,d]})]})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`semiont-panel-label`,children:t(`session`)}),(0,z.jsx)(`div`,{className:`semiont-session-box`,children:(0,z.jsx)(`div`,{className:`semiont-panel-hint`,children:t(`expiresIn`,{time:b})})})]}),(f||p)&&(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`semiont-panel-label`,children:t(`privileges`)}),(0,z.jsxs)(`div`,{className:`space-y-1`,children:[f&&(0,z.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--admin`,children:(0,z.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`administrator`)})}),p&&(0,z.jsx)(`div`,{className:`semiont-privilege-badge semiont-privilege-badge--moderator`,children:(0,z.jsx)(`span`,{className:`semiont-privilege-text`,children:t(`moderator`)})})]})]}),a&&(0,z.jsx)(H,{session:a,label:t(`signOut`)},a.id)]})]})}function H({session:e,label:t}){let n=i(),r=A(),o=p(e??void 0,a);return(0,z.jsx)(`div`,{className:`semiont-panel-divider`,children:(0,z.jsx)(`button`,{onClick:async()=>{await o?.logout(),e.kb&&await n.signOut(e.kb.id),r.push(`/`)},className:`semiont-signout-button`,children:t})})}var U={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)`},W={authenticated:`statusConnected`,expired:`statusExpired`,"signed-out":`statusSignedOut`,unreachable:`statusUnreachable`},G=(e,t)=>`${e}:${t}`,K=`–`;function q({placement:e,t}){return(0,z.jsx)(`span`,{title:t(`managedBadge`),style:{fontSize:`0.65rem`,padding:`0 0.375rem`,borderRadius:`9999px`,border:`1px solid var(--semiont-color-primary-500, #3b82f6)`,color:`var(--semiont-color-primary-500, #3b82f6)`,flexShrink:0},children:t(e===`local`?`placementLocal`:`placementCodespace`)})}function te({status:e,t}){return(0,z.jsx)(`span`,{title:t(W[e]),style:{width:`0.5rem`,height:`0.5rem`,borderRadius:`50%`,backgroundColor:U[e],flexShrink:0}})}function ne({t:e,title:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a,autoFocus:o,pulsing:s,initialHost:l=`localhost`,initialPort:u=4e3,initialEmail:d=`admin@example.com`}){let[p,m]=(0,N.useState)(l),[h,g]=(0,N.useState)(String(u)),[_,v]=(0,N.useState)(f(l)),[y,b]=(0,N.useState)(d),[x,S]=(0,N.useState)(``),C=e=>{m(e),v(f(e))};return(0,z.jsxs)(`div`,{className:s?`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:[(0,z.jsx)(`h3`,{style:{fontSize:`0.8rem`,fontWeight:600,marginBottom:`0.5rem`},children:t??e(`connectTitle`)}),(0,z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),c(p)&&n(p,parseInt(h,10)||4e3,_,y,x)},style:{display:`flex`,flexDirection:`column`,gap:`0.5rem`},children:[(0,z.jsxs)(`select`,{value:_,onChange:e=>v(e.target.value),className:`semiont-input`,children:[(0,z.jsx)(`option`,{value:`http`,children:`HTTP`}),(0,z.jsx)(`option`,{value:`https`,children:`HTTPS`})]}),(0,z.jsx)(`input`,{type:`text`,value:p,onChange:e=>C(e.target.value),placeholder:`Host`,className:`semiont-input`,autoFocus:o}),(0,z.jsx)(`input`,{type:`number`,value:h,onChange:e=>g(e.target.value),placeholder:`Port`,className:`semiont-input`}),p&&!c(p)&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:e(`invalidHost`)}),(0,z.jsx)(`input`,{type:`email`,value:y,onChange:e=>b(e.target.value),placeholder:`Email`,className:`semiont-input`}),(0,z.jsx)(`input`,{type:`password`,value:x,onChange:e=>S(e.target.value),placeholder:`Password`,className:`semiont-input`}),i&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,z.jsxs)(`div`,{style:{display:`flex`,gap:`0.5rem`},children:[(0,z.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1},disabled:a||!c(p),children:e(a?`connecting`:`connect`)}),(0,z.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,children:(0,z.jsx)(k,{style:{width:`1rem`,height:`1rem`}})})]})]})]})}function re({t:e,kb:t,onSubmit:n,onCancel:r,error:i,isSubmitting:a}){let[o,s]=(0,N.useState)(``);return(0,z.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),n(o)},style:{padding:`0.5rem 0.75rem`,display:`flex`,flexDirection:`column`,gap:`0.375rem`},children:[(0,z.jsx)(`div`,{style:{fontSize:`0.75rem`,color:`var(--semiont-color-neutral-400)`},children:t.email}),(0,z.jsx)(`input`,{type:`password`,value:o,onChange:e=>s(e.target.value),placeholder:`Password`,className:`semiont-input`,style:{fontSize:`0.8rem`},autoFocus:!0}),i&&(0,z.jsx)(`div`,{style:{color:`var(--semiont-color-error-500, #ef4444)`,fontSize:`0.75rem`},children:i}),(0,z.jsxs)(`div`,{style:{display:`flex`,gap:`0.375rem`},children:[(0,z.jsx)(`button`,{type:`submit`,className:`semiont-button semiont-button--primary`,style:{flex:1,fontSize:`0.8rem`},disabled:a,children:e(a?`signingIn`:`signIn`)}),(0,z.jsx)(`button`,{type:`button`,className:`semiont-button`,onClick:r,style:{fontSize:`0.8rem`},children:e(`cancel`)})]})]})}var J=class extends Error{constructor(e,t){super(t),this.reason=e}};async function Y(e,t,n,r,i){let a=`${n}://${e}:${t}`,o=new b(null),s=new m({baseUrl:E(a),token$:o}),c=new d(s,new u(s),s);try{let e=await c.auth.password(r,i),t=e.token,n=e.refreshToken;if(!t)throw Error(`No access token received`);if(!n)throw Error(`No refresh token received`);o.next(w(t));let a;try{a=await c.admin.status()}catch(e){throw new J(`unreachable`,e instanceof Error?e.message:String(e))}if(!a.did)throw new J(`not-reported`,`status reported no did`);return{token:t,refreshToken:n,did:a.did,label:a.projectName??``,...a.gitBranch?{gitBranch:a.gitBranch}:{}}}finally{s.dispose(),o.complete()}}function X(){let e=M(),{t}=n(),r=(e,n)=>t(`KnowledgeBasePanel.${e}`,n),a=i(),o=_(a.kbs$)??[],s=_(a.activeSession$)?.kb??null,c=t=>{e.startsWith(`/know/resource/`)&&a.emit(`nav:push`,{path:`/know`,reason:`kb-switch`}),a.setActiveKb(t)},l=a.addKb.bind(a),u=a.removeKb.bind(a),d=a.updateKb.bind(a),f=(e,t,n)=>{a.signIn(e,t,n)},p=e=>{a.signOut(e)},[m,h]=(0,N.useState)(null),[g,v]=(0,N.useState)(null),[y,b]=(0,N.useState)(null),[x,S]=(0,N.useState)(!1),[C,w]=(0,N.useState)(null),[E,D]=(0,N.useState)(null),[k,A]=(0,N.useState)(!1),[j,P]=(0,N.useState)(null),[,I]=(0,N.useState)(0),{kbs:L}=T(),B=new Map;for(let e of L){let t=G(e.host,e.port),n=B.get(t);n?n.push(e):B.set(t,[e])}let V=e=>{let t=B.get(e);return t?.length===1?t[0]:void 0},H=e=>{if(e.endpoint.kind!==`http`)return;let t=V(G(e.endpoint.host,e.endpoint.port));return t&&t.did===e.did?t:void 0},U=new Set(o.flatMap(e=>e.endpoint.kind===`http`&&H(e)?[G(e.endpoint.host,e.endpoint.port)]:[])),W=L.filter(e=>!U.has(G(e.host,e.port))),X=new Set(o.map(e=>e.did)),Z=e=>X.has(e.did),ie=[...B.entries()].filter(([,e])=>e.length>1).map(([e,t])=>({address:e,count:t.length})),Q=m?.host!==void 0&&m.port!==void 0?G(m.host,m.port):null,ae=Q!==null&&(B.get(Q)?.length??0)>1;(0,N.useEffect)(()=>{o.length===0&&h({})},[o.length]),(0,N.useEffect)(()=>{let e=setInterval(()=>I(e=>e+1),3e4);return()=>clearInterval(e)},[]);let $=(e={})=>{h(e),w(null),b(null),v(null)},oe=e=>e instanceof J?e.reason===`unreachable`?r(`identityCheckFailed`):r(`identityNotReported`):e instanceof Error?e.message:String(e),se=async(e,t,n,i,a)=>{b(null),S(!0);let s=o.find(n=>n.endpoint.kind===`http`&&n.endpoint.host===e&&n.endpoint.port===t);if(s){try{let{token:r,refreshToken:o,gitBranch:c}=await Y(e,t,n,i,a);d(s.id,{...c?{gitBranch:c}:{}}),f(s.id,r,o),h(null)}catch(e){b(oe(e))}finally{S(!1)}return}try{let{token:o,refreshToken:s,did:c,label:u,gitBranch:d}=await Y(e,t,n,i,a),f=m?.expectedDid;f&&f!==c&&v(r(`connectedToOther`,{actual:u||r(`unknownName`),expected:m?.expectedName||r(`unknownName`)})),l({did:c,label:u,email:i,endpoint:{kind:`http`,host:e,port:t,protocol:n},...d?{gitBranch:d}:{}},o,s),h(null)}catch(e){b(oe(e))}finally{S(!1)}},ce=async(e,t)=>{let n=o.find(t=>t.id===e);if(n){if(D(null),A(!0),n.endpoint.kind!==`http`){D(`Re-auth is HTTP-only; KB endpoint kind "${n.endpoint.kind}" is not supported here.`),A(!1);return}try{let{token:r,refreshToken:i,label:a,gitBranch:o}=await Y(n.endpoint.host,n.endpoint.port,n.endpoint.protocol,n.email,t);d(e,{label:a,...o?{gitBranch:o}:{}}),f(e,r,i),w(null)}catch(e){D(e instanceof Error?e.message:String(e))}finally{A(!1)}}},le=e=>{a.getKbSessionStatus(e.id)===`authenticated`?c(e.id):(w(e.id),h(null),D(null))};return(0,z.jsxs)(`div`,{className:`semiont-panel`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-header`,children:(0,z.jsxs)(`h2`,{className:`semiont-panel-header__title`,children:[(0,z.jsx)(`span`,{className:`semiont-panel-header__text`,children:r(`title`)}),(0,z.jsxs)(`span`,{className:`semiont-panel-header__count`,children:[`(`,o.length,`)`]})]})}),(0,z.jsxs)(`div`,{className:`semiont-panel__content`,children:[(0,z.jsx)(`div`,{className:`semiont-panel__list`,children:o.map(e=>{let t=a.getKbSessionStatus(e.id),n=e.id===s?.id,i=C===e.id,o=H(e);return(0,z.jsxs)(`div`,{children:[(0,z.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable${n?` semiont-panel-item--selected`:``}`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>le(e),children:[(0,z.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,z.jsx)(te,{status:t,t:r}),(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.label||r(`unknownName`)}),o&&(0,z.jsx)(q,{placement:o.placement,t:r}),n&&(0,z.jsx)(ee,{style:{width:`1rem`,height:`1rem`,color:`var(--semiont-color-primary-500)`,flexShrink:0}}),t===`authenticated`&&(0,z.jsx)(`button`,{onClick:t=>{t.stopPropagation(),p(e.id)},title:r(`signOut`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,z.jsx)(F,{style:{width:`0.875rem`,height:`0.875rem`}})}),(0,z.jsx)(`button`,{onClick:t=>{t.stopPropagation(),P(e.id)},title:r(`remove`),style:{background:`none`,border:`none`,cursor:`pointer`,padding:`0.125rem`,color:`var(--semiont-color-neutral-400)`},children:(0,z.jsx)(O,{style:{width:`0.875rem`,height:`0.875rem`}})})]}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:e.endpoint.kind===`http`?`${e.endpoint.host}:${e.endpoint.port} · ${e.gitBranch??K}`:`local:${e.endpoint.kbId}`}),o&&(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,whiteSpace:`normal`,overflowWrap:`anywhere`},children:o.repo??K})]}),j===e.id&&(0,z.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:[(0,z.jsx)(`span`,{style:{flex:1,color:`var(--semiont-color-neutral-500)`},children:r(`removeConfirm`,{label:e.label})}),(0,z.jsx)(`button`,{onClick:()=>{u(e.id),P(null)},className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`,color:`var(--semiont-color-error-500, #ef4444)`},children:r(`remove`)}),(0,z.jsx)(`button`,{onClick:()=>P(null),className:`semiont-button`,style:{fontSize:`0.75rem`,padding:`0.2rem 0.5rem`},children:r(`cancel`)})]}),i&&(0,z.jsx)(re,{t:r,kb:e,onSubmit:t=>ce(e.id,t),onCancel:()=>w(null),error:E,isSubmitting:k})]},e.id)})}),W.length>0&&(0,z.jsxs)(`div`,{className:`semiont-panel__list`,children:[(0,z.jsx)(`h3`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,fontWeight:600,textTransform:`uppercase`,letterSpacing:`0.05em`,padding:`0.5rem 0.75rem 0.25rem`},children:r(`discoveredTitle`)}),ie.map(({address:e,count:t})=>(0,z.jsxs)(`div`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,padding:`0 0.75rem 0.375rem`,color:`var(--semiont-color-warning-500, #eab308)`,whiteSpace:`normal`},children:[`⚠ `,r(`addressConflict`,{count:t,address:e})]},`conflict-${e}`)),W.map(e=>(0,z.jsxs)(`div`,{className:`semiont-panel-item semiont-panel-item--clickable`,style:{display:`flex`,flexDirection:`column`,gap:`0.25rem`,cursor:`pointer`,padding:`0.5rem 0.75rem`},onClick:()=>$({host:e.host,port:e.port,expectedDid:e.did,...e.siteName===void 0?{}:{expectedName:e.siteName}}),...e.did===void 0?{}:{title:e.did},children:[(0,z.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:`0.5rem`},children:[(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{flex:1,fontWeight:500},children:e.siteName??K}),(0,z.jsx)(q,{placement:e.placement,t:r})]}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`},children:G(e.host,e.port)}),(0,z.jsx)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,whiteSpace:`normal`,overflowWrap:`anywhere`},children:e.repo??K}),Z(e)&&(0,z.jsxs)(`span`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.7rem`,paddingLeft:`1rem`,fontStyle:`italic`,whiteSpace:`normal`},children:[`↳ `,r(`anotherCopy`)]})]},`${e.did}@${G(e.host,e.port)}`))]}),g&&(0,z.jsx)(`div`,{className:`semiont-panel-text-secondary`,style:{fontSize:`0.75rem`,padding:`0.5rem 0.75rem`,color:`var(--semiont-color-warning-500, #eab308)`,whiteSpace:`normal`},children:g}),m!==null&&(0,z.jsx)(ne,{t:r,...ae&&Q?{title:r(`connectToAddress`,{address:Q})}:{},onSubmit:se,onCancel:()=>h(null),error:y,isSubmitting:x,autoFocus:o.length===0,pulsing:o.length===0,...m.host===void 0?{}:{initialHost:m.host},...m.port===void 0?{}:{initialPort:m.port}},`${m.host??``}:${m.port??``}`)]}),m===null&&(0,z.jsx)(`div`,{className:`semiont-panel-footer`,children:(0,z.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:[(0,z.jsx)(R,{style:{width:`1rem`,height:`1rem`,flexShrink:0}}),(0,z.jsx)(`span`,{className:`semiont-panel-text`,style:{color:`inherit`},children:r(`addKnowledgeBase`)})]})})]})}function Z({activePanel:e,theme:t,children:r}){let{hoverDelayMs:a}=l(),{t:s}=n(),c=_(i().activeSession$),u=!!_(c?.user$),d=j(),f=A(),p=M(),[m,h]=(0,N.useTransition)(),{width:v,setWidth:b,minWidth:w,maxWidth:T}=g(),E=(0,N.useCallback)(({locale:e})=>{p&&h(()=>{f.replace(p,{locale:e})})},[p,f,h]),{setTheme:O}=x(),{toggleLineNumbers:k}=C(),P=(0,N.useCallback)(({theme:e})=>O(e),[O]),F=(0,N.useCallback)(()=>k(),[k]);return o({"settings:locale-changed":E,"settings:theme-changed":P,"settings:line-numbers-toggled":F}),!e||!r&&!y.includes(e)?null:(0,z.jsxs)(`div`,{className:`semiont-toolbar-panels`,style:{width:`${v}px`,position:`relative`},children:[(0,z.jsx)(S,{onResize:b,minWidth:w,maxWidth:T,position:`left`,ariaLabel:`Resize right panel`}),(0,z.jsxs)(`div`,{className:`semiont-toolbar-panels__content`,children:[r,e===`knowledge-base`&&(0,z.jsx)(X,{}),e===`user`&&(u?(0,z.jsx)(V,{}):(0,z.jsxs)(`div`,{className:`semiont-panel`,children:[(0,z.jsx)(`div`,{className:`semiont-panel-header`,children:(0,z.jsx)(`h2`,{className:`semiont-panel-header__title`,children:(0,z.jsx)(`span`,{className:`semiont-panel-header__text`,children:s(`UserPanel.account`)})})}),(0,z.jsx)(`div`,{className:`semiont-panel__content`,style:{padding:`1rem`,textAlign:`center`},children:(0,z.jsx)(`p`,{style:{color:`var(--semiont-color-neutral-400)`,fontSize:`0.85rem`,lineHeight:1.5},children:s(`AccountPanel.notAuthenticated`)})})]})),e===`settings`&&(0,z.jsx)(D,{theme:t,hoverDelayMs:a,locale:d,isPendingLocaleChange:m})]})]})}export{R as n,Z as t};
2
+ //# sourceMappingURL=ToolbarPanels-Bf3f6THq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarPanels-Bf3f6THq.js","names":["ForwardRef","ForwardRef"],"sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowRightStartOnRectangleIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/PlusIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowRightStartOnRectangleIcon({\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: \"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\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowRightStartOnRectangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CheckIcon({\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 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction PlusIcon({\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: \"M12 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(PlusIcon);\nexport default ForwardRef;","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useSemiont,\n useObservable,\n createSessionStateUnit,\n useSessionStateUnit,\n} from '@semiont/react-ui';\nimport type { SemiontSession } from '@semiont/sdk';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const displayName = user?.name ?? user?.email?.split('@')[0] ?? 'User';\n const avatarUrl = user?.image ?? null;\n const userDomain = user?.domain || user?.email?.split('@')[1];\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n {activeKnowledgeBase && (\n <div style={{ padding: '0 0.75rem 0.5rem', fontSize: '0.8rem', color: 'var(--semiont-color-neutral-400)' }}>\n {activeKnowledgeBase.label}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out — only meaningful with a live session to sign out OF.\n Keyed on the session so the state unit is rebuilt against the\n replacement rather than holding the client it captured at mount. */}\n {session && (\n <SignOutButton\n key={session.id}\n session={session}\n label={t('signOut')}\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Owns the session state unit, so it is only ever constructed where a session\n * is guaranteed. `UserPanel` itself renders inside `ToolbarPanels`, which the\n * unauthenticated knowledge layout also mounts — there, `activeSession$` is\n * null and `createSessionStateUnit(session?.client)` would capture `undefined`\n * and blow up on click.\n * See .plans/bugs/resource-page-frozen-on-disposed-client-after-kb-switch.md\n */\nfunction SignOutButton({ session, label }: { session: SemiontSession; label: string }) {\n const semiont = useSemiont();\n const router = useRouter();\n const sessionStateUnit = useSessionStateUnit(session ?? undefined, createSessionStateUnit);\n\n const handleSignOut = async () => {\n await sessionStateUnit?.logout();\n if (session.kb) {\n await semiont.signOut(session.kb.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-panel-divider\">\n <button onClick={handleSignOut} className=\"semiont-signout-button\">\n {label}\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { BehaviorSubject } from 'rxjs';\nimport { SemiontClient, defaultProtocol, isValidHostname, type KnowledgeBase, type KbSessionStatus } from '@semiont/sdk';\nimport { usePathname } from '@/i18n/routing';\nimport { HttpContentTransport, HttpTransport } from '@semiont/http-transport';\nimport { accessToken, baseUrl, type AccessToken } from '@semiont/core';\nimport type { DiscoveredKB } from '@semiont/core';\nimport {\n useSemiont,\n useObservable,\n useKBDiscovery,\n} from '@semiont/react-ui';\n\ntype T = (key: string, params?: Record<string, unknown>) => string;\n\nconst STATUS_COLORS: Record<KbSessionStatus, string> = {\n authenticated: 'var(--semiont-color-success-500, #22c55e)',\n expired: 'var(--semiont-color-warning-500, #eab308)',\n 'signed-out': 'var(--semiont-color-neutral-400, #9ca3af)',\n unreachable: 'var(--semiont-color-error-500, #ef4444)',\n};\n\nconst STATUS_KEYS: Record<KbSessionStatus, string> = {\n authenticated: 'statusConnected',\n expired: 'statusExpired',\n 'signed-out': 'statusSignedOut',\n unreachable: 'statusUnreachable',\n};\n\nconst endpointKey = (host: string, port: number) => `${host}:${port}`;\n\n/**\n * Fixed-shape rendering: a field that should be present but isn't renders\n * this placeholder — a visible gap, never a semantic fallback to some other\n * field.\n */\nconst MISSING = '–';\n\n/** Placement badge — also the managed marker on an adopted registered row. */\nfunction PlacementBadge({ placement, t }: { placement: DiscoveredKB['placement']; t: T }) {\n return (\n <span\n title={t('managedBadge')}\n style={{\n fontSize: '0.65rem',\n padding: '0 0.375rem',\n borderRadius: '9999px',\n border: '1px solid var(--semiont-color-primary-500, #3b82f6)',\n color: 'var(--semiont-color-primary-500, #3b82f6)',\n flexShrink: 0,\n }}\n >\n {t(placement === 'local' ? 'placementLocal' : 'placementCodespace')}\n </span>\n );\n}\n\nfunction StatusDot({ status, t }: { status: KbSessionStatus; t: T }) {\n return (\n <span\n title={t(STATUS_KEYS[status])}\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: STATUS_COLORS[status],\n flexShrink: 0,\n }}\n />\n );\n}\n\nfunction LoginForm({ t, title, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n /** Overrides the generic heading — used to announce a contested ADDRESS (D). */\n title?: string;\n onSubmit: (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n autoFocus?: boolean;\n pulsing?: boolean;\n initialHost?: string;\n initialPort?: number;\n initialEmail?: string;\n}) {\n const [host, setHost] = useState(initialHost);\n const [port, setPort] = useState(String(initialPort));\n const [protocol, setProtocol] = useState<'http' | 'https'>(defaultProtocol(initialHost));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n const handleHostChange = (newHost: string) => {\n setHost(newHost);\n setProtocol(defaultProtocol(newHost));\n };\n\n return (\n <div\n className={pulsing ? 'semiont-panel__login-form--pulsing' : ''}\n style={{\n margin: '0.5rem',\n padding: '0.75rem',\n border: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n borderRadius: 'var(--semiont-panel-border-radius, 0.5rem)',\n background: 'var(--semiont-bg-secondary, transparent)',\n }}\n >\n <h3 style={{ fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.5rem' }}>{title ?? t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); if (isValidHostname(host)) onSubmit(host, parseInt(port, 10) || 4000, protocol, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <select value={protocol} onChange={e => setProtocol(e.target.value as 'http' | 'https')} className=\"semiont-input\">\n <option value=\"http\">HTTP</option>\n <option value=\"https\">HTTPS</option>\n </select>\n <input type=\"text\" value={host} onChange={e => handleHostChange(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" />\n {host && !isValidHostname(host) && (\n <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{t('invalidHost')}</div>\n )}\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)} placeholder=\"Email\" className=\"semiont-input\" />\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1 }} disabled={isSubmitting || !isValidHostname(host)}>\n {isSubmitting ? t('connecting') : t('connect')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel}>\n <XMarkIcon style={{ width: '1rem', height: '1rem' }} />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction ReauthForm({ t, kb, onSubmit, onCancel, error, isSubmitting }: {\n t: T;\n kb: KnowledgeBase;\n onSubmit: (password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n}) {\n const [password, setPassword] = useState('');\n\n return (\n <form onSubmit={(e) => { e.preventDefault(); onSubmit(password); }} style={{ padding: '0.5rem 0.75rem', display: 'flex', flexDirection: 'column', gap: '0.375rem' }}>\n <div style={{ fontSize: '0.75rem', color: 'var(--semiont-color-neutral-400)' }}>{kb.email}</div>\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" style={{ fontSize: '0.8rem' }} autoFocus />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.375rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1, fontSize: '0.8rem' }} disabled={isSubmitting}>\n {isSubmitting ? t('signingIn') : t('signIn')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel} style={{ fontSize: '0.8rem' }}>\n {t('cancel')}\n </button>\n </div>\n </form>\n );\n}\n\n/**\n * Thrown when authentication succeeds but the KB's identity cannot be\n * established. A registered KB REQUIRES a did (KB-IDENTITY-VS-ADDRESS\n * decision 8), and there is nothing legitimate to fall back to: inventing one\n * from the address is the exact category error that document exists to end.\n * Decision 7's third verification outcome, made explicit.\n *\n * The two reasons are kept apart deliberately: collapsing them into one\n * message made a live auth bug undiagnosable from the UI (2026-07-28).\n */\nclass IdentityUnverifiableError extends Error {\n constructor(readonly reason: 'unreachable' | 'not-reported', detail: string) {\n super(detail);\n }\n}\n\nasync function authenticateWithGateway(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; did: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n // `/api/status` REQUIRES authentication, so the transport needs a token\n // source: without one the identity check goes out unauthenticated and 401s\n // on every connect (found live 2026-07-28 — previously swallowed, which is\n // why labels silently fell back to `host:port`). Same pattern the session\n // factory's `performValidate` uses.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: baseUrl(origin), token$ });\n const client = new SemiontClient(transport, new HttpContentTransport(transport), transport);\n\n // The cleanup wraps EVERY exit, not just the status call. The transport\n // subscribes to token$ the moment it is constructed, so a throw before the\n // status check — a rejected password, a response missing either token —\n // leaked it. Scoping the finally to the narrow try covered the one failure\n // that happened to be on screen and none of the earlier ones.\n try {\n const authResult = await client.auth!.password(emailStr, password);\n const token = authResult.token;\n const refreshToken = authResult.refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n // Every later call on this client is now authenticated.\n token$.next(accessToken(token));\n\n // The KB names itself: identity is read from the KB we actually reached,\n // never inferred from the discovered row the user happened to click.\n let status;\n try {\n status = await client.admin!.status();\n } catch (e) {\n throw new IdentityUnverifiableError('unreachable', e instanceof Error ? e.message : String(e));\n }\n if (!status.did) throw new IdentityUnverifiableError('not-reported', 'status reported no did');\n\n return {\n token,\n refreshToken,\n did: status.did,\n // Absence is stored as absence — the WORD \"Unknown\" is a render concern\n // (decision 7), and `host:port` is an address, never a name.\n label: status.projectName ?? '',\n ...(status.gitBranch ? { gitBranch: status.gitBranch } : {}),\n };\n } finally {\n transport.dispose();\n token$.complete();\n }\n}\n\nexport function KnowledgeBasePanel() {\n const pathname = usePathname();\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const setActiveKnowledgeBase = (id: string) => {\n // Leave a resource route BEFORE switching. The URL carries the CURRENT\n // KB's resource id, which identifies nothing in the KB we're moving to —\n // loading it there earns a 404 and the B14/B15 retry-then-fail chain, and\n // a \"Try Again\" that can never succeed.\n //\n // This has to happen here, at the initiator. The resource page cannot\n // infer it after the fact: `KnowledgeLayout` gates `<Outlet />` on a live\n // session, so the page is unmounted the moment `activeSession$` goes null\n // and remounts fresh against the new KB — from its own point of view no\n // switch ever happened.\n // See .plans/bugs/resource-page-frozen-on-disposed-client-after-kb-switch.md\n if (pathname.startsWith('/know/resource/')) {\n semiont.emit('nav:push', { path: '/know', reason: 'kb-switch' });\n }\n void semiont.setActiveKb(id);\n };\n const addKnowledgeBase = semiont.addKb.bind(semiont);\n const removeKnowledgeBase = semiont.removeKb.bind(semiont);\n const updateKnowledgeBase = semiont.updateKb.bind(semiont);\n const signIn = (id: string, access: string, refresh: string) => { void semiont.signIn(id, access, refresh); };\n const signOut = (id: string) => { void semiont.signOut(id); };\n // null = closed; {} = blank form; {host, port} = prefilled from a discovered\n // row. `expected*` records WHAT THE USER BELIEVED they were connecting to, so\n // the outcome can be verified against the KB that actually answers (C).\n const [addForm, setAddForm] = useState<\n { host?: string; port?: number; expectedDid?: string; expectedName?: string } | null\n >(null);\n // Transient result of that verification — the form has closed by then.\n const [connectNotice, setConnectNotice] = useState<string | null>(null);\n const [addError, setAddError] = useState<string | null>(null);\n const [addSubmitting, setAddSubmitting] = useState(false);\n const [reauthKbId, setReauthKbId] = useState<string | null>(null);\n const [reauthError, setReauthError] = useState<string | null>(null);\n const [reauthSubmitting, setReauthSubmitting] = useState(false);\n const [confirmRemoveKbId, setConfirmRemoveKbId] = useState<string | null>(null);\n const [, setTick] = useState(0);\n\n // Launcher discovery (BROWSER-KB-DISCOVERY P5). The document is launcher\n // BELIEF — health stays this panel's own probe. Collision policy: a\n // discovered KB matching a registered endpoint is ADOPTED render-only (one\n // row, managed badge, registry untouched — fully reversible); removal is\n // projection-only (discovered rows vanish, adopted rows lose the badge).\n const { kbs: discoveredKbs } = useKBDiscovery();\n // The join (KB-IDENTITY-VS-ADDRESS decision 9): **look up by address, verify\n // by did.** The address is what is unique within a document (P1), so it\n // SELECTS; the did then confirms the copy we reached is the KB we meant. A\n // did can match several entries — one KB running in two places is normal and\n // expected — so it can never be the selector. Grouping survives from P0\n // because an older document can still contain duplicate addresses.\n const discoveredByEndpoint = new Map<string, DiscoveredKB[]>();\n for (const d of discoveredKbs) {\n const key = endpointKey(d.host, d.port);\n const bucket = discoveredByEndpoint.get(key);\n if (bucket) bucket.push(d);\n else discoveredByEndpoint.set(key, [d]);\n }\n const unambiguousAt = (key: string): DiscoveredKB | undefined => {\n const bucket = discoveredByEndpoint.get(key);\n return bucket?.length === 1 ? bucket[0] : undefined;\n };\n const managedFor = (kb: KnowledgeBase): DiscoveredKB | undefined => {\n if (kb.endpoint.kind !== 'http') return undefined;\n const entry = unambiguousAt(endpointKey(kb.endpoint.host, kb.endpoint.port));\n // Verification: an entry at my address that is a DIFFERENT knowledge base\n // is not mine to adopt — it is someone else standing where I connected.\n // (A registered KB whose address matches nothing is simply unmanaged; the\n // spelling-mismatch miss is accepted deliberately — see the plan.)\n return entry && entry.did === kb.did ? entry : undefined;\n };\n // Only an ADOPTED endpoint drops out of the discovered list; ambiguous ones\n // keep every claimant visible so the stale record is surfaced, not swallowed.\n const adoptedEndpoints = new Set(\n knowledgeBases.flatMap(kb =>\n kb.endpoint.kind === 'http' && managedFor(kb)\n ? [endpointKey(kb.endpoint.host, kb.endpoint.port)]\n : []),\n );\n const unregisteredDiscovered = discoveredKbs.filter(d => !adoptedEndpoints.has(endpointKey(d.host, d.port)));\n // One KB in two places is normal (decision 9), so a discovered row can carry\n // the same name as a KB you are already connected to. Say why, rather than\n // leaving it looking like a duplicate — the identity is what relates them.\n const registeredDids = new Set(knowledgeBases.map(kb => kb.did));\n const isAnotherCopy = (d: DiscoveredKB): boolean => registeredDids.has(d.did);\n // A duplicated ADDRESS is a conflict: only one process binds a port, so at\n // most one claimant's promise is true (decision 4, narrowed by 9 — a shared\n // DID is not a conflict). Producers no longer emit these; old documents can.\n const conflictedAddresses = [...discoveredByEndpoint.entries()]\n .filter(([, bucket]) => bucket.length > 1)\n .map(([address, bucket]) => ({ address, count: bucket.length }));\n // (D) A click was always an address; when the address is contested, the form\n // says so instead of carrying a KB name that is at most half true.\n const addFormAddress = addForm?.host !== undefined && addForm.port !== undefined\n ? endpointKey(addForm.host, addForm.port)\n : null;\n const addFormContested = addFormAddress !== null\n && (discoveredByEndpoint.get(addFormAddress)?.length ?? 0) > 1;\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setAddForm({});\n }, [knowledgeBases.length]);\n\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), 30_000);\n return () => clearInterval(interval);\n }, []);\n\n const openAddForm = (prefill: { host?: string; port?: number; expectedDid?: string; expectedName?: string } = {}) => {\n setAddForm(prefill);\n setReauthKbId(null);\n setAddError(null);\n setConnectNotice(null);\n };\n\n // An unreachable identity check and a KB that reports no identity are\n // different problems with different fixes; one message for both hid a live\n // auth bug for a whole release.\n const identityAwareMessage = (err: unknown): string => {\n if (err instanceof IdentityUnverifiableError) {\n return err.reason === 'unreachable' ? t('identityCheckFailed') : t('identityNotReported');\n }\n return err instanceof Error ? err.message : String(err);\n };\n\n const handleAdd = async (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const existing = knowledgeBases.find(\n kb => kb.endpoint.kind === 'http' && kb.endpoint.host === host && kb.endpoint.port === port,\n );\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithGateway(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setAddForm(null);\n } catch (err) {\n setAddError(identityAwareMessage(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, did, label, gitBranch } = await authenticateWithGateway(host, port, protocol, email, password);\n // (C) Verify the outcome against what the user believed they clicked.\n // Reports; never blocks — the KB that answered is the one they reached.\n const expectedDid = addForm?.expectedDid;\n if (expectedDid && expectedDid !== did) {\n setConnectNotice(t('connectedToOther', {\n actual: label || t('unknownName'),\n expected: addForm?.expectedName || t('unknownName'),\n }));\n }\n addKnowledgeBase(\n {\n did,\n label,\n email,\n endpoint: { kind: 'http', host, port, protocol },\n ...(gitBranch ? { gitBranch } : {}),\n },\n token,\n refreshToken,\n );\n setAddForm(null);\n } catch (err) {\n setAddError(identityAwareMessage(err));\n } finally {\n setAddSubmitting(false);\n }\n };\n\n const handleReauth = async (kbId: string, password: string) => {\n const kb = knowledgeBases.find(k => k.id === kbId);\n if (!kb) return;\n setReauthError(null);\n setReauthSubmitting(true);\n if (kb.endpoint.kind !== 'http') {\n setReauthError(`Re-auth is HTTP-only; KB endpoint kind \"${kb.endpoint.kind}\" is not supported here.`);\n setReauthSubmitting(false);\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithGateway(\n kb.endpoint.host, kb.endpoint.port, kb.endpoint.protocol, kb.email, password,\n );\n updateKnowledgeBase(kbId, { label, ...(gitBranch ? { gitBranch } : {}) });\n signIn(kbId, token, refreshToken);\n setReauthKbId(null);\n } catch (err) {\n setReauthError(err instanceof Error ? err.message : String(err));\n } finally {\n setReauthSubmitting(false);\n }\n };\n\n const handleKbClick = (kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setAddForm(null);\n setReauthError(null);\n }\n };\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{t('title')}</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n const managed = managedFor(kb);\n\n return (\n <div key={kb.id}>\n <div\n className={`semiont-panel-item semiont-panel-item--clickable${isActive ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => handleKbClick(kb)}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <StatusDot status={status} t={t} />\n {/* Decision 7: an unnamed KB reads \"Unknown\" — a state, not a\n blank — while the address stays on the address line below. */}\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label || t('unknownName')}</span>\n {managed && <PlacementBadge placement={managed.placement} t={t} />}\n {isActive && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n {status === 'authenticated' && (\n <button\n onClick={(e) => { e.stopPropagation(); signOut(kb.id); }}\n title={t('signOut')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <ArrowRightStartOnRectangleIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); setConfirmRemoveKbId(kb.id); }}\n title={t('remove')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <TrashIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {kb.endpoint.kind === 'http'\n ? `${kb.endpoint.host}:${kb.endpoint.port} · ${kb.gitBranch ?? MISSING}`\n : `local:${kb.endpoint.kbId}`}\n </span>\n {managed && (\n // The repo gets its own line — vertical space over width;\n // wrap instead of the class's nowrap-ellipsis.\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', whiteSpace: 'normal', overflowWrap: 'anywhere' }}>\n {managed.repo ?? MISSING}\n </span>\n )}\n </div>\n {confirmRemoveKbId === kb.id && (\n <div style={{\n padding: '0.5rem 0.75rem',\n fontSize: '0.8rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n background: 'var(--semiont-bg-secondary, #f9fafb)',\n borderBottom: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n }}>\n <span style={{ flex: 1, color: 'var(--semiont-color-neutral-500)' }}>{t('removeConfirm', { label: kb.label })}</span>\n <button\n onClick={() => { removeKnowledgeBase(kb.id); setConfirmRemoveKbId(null); }}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem', color: 'var(--semiont-color-error-500, #ef4444)' }}\n >\n {t('remove')}\n </button>\n <button\n onClick={() => setConfirmRemoveKbId(null)}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem' }}\n >\n {t('cancel')}\n </button>\n </div>\n )}\n {isReauthing && (\n <ReauthForm\n t={t}\n kb={kb}\n onSubmit={(password) => handleReauth(kb.id, password)}\n onCancel={() => setReauthKbId(null)}\n error={reauthError}\n isSubmitting={reauthSubmitting}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {unregisteredDiscovered.length > 0 && (\n <div className=\"semiont-panel__list\">\n <h3 className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.05em', padding: '0.5rem 0.75rem 0.25rem' }}>\n {t('discoveredTitle')}\n </h3>\n {conflictedAddresses.map(({ address, count }) => (\n <div\n key={`conflict-${address}`}\n className=\"semiont-panel-text-secondary\"\n style={{ fontSize: '0.7rem', padding: '0 0.75rem 0.375rem', color: 'var(--semiont-color-warning-500, #eab308)', whiteSpace: 'normal' }}\n >\n ⚠ {t('addressConflict', { count, address })}\n </div>\n ))}\n {unregisteredDiscovered.map((d) => (\n <div\n /* Key on the PAIR. Decision 9's table spells out why neither\n half works alone: a did repeats across copies of one KB, an\n address repeats across contested claimants — and this list\n deliberately renders both. Only did+address is unique. */\n key={`${d.did}@${endpointKey(d.host, d.port)}`}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => openAddForm({\n host: d.host,\n port: d.port,\n // Record the belief so the outcome can be verified (C) —\n // recording it is not the same as promising it (D).\n expectedDid: d.did,\n ...(d.siteName !== undefined ? { expectedName: d.siteName } : {}),\n })}\n {...(d.did !== undefined ? { title: d.did } : {})}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{d.siteName ?? MISSING}</span>\n <PlacementBadge placement={d.placement} t={t} />\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {endpointKey(d.host, d.port)}\n </span>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', whiteSpace: 'normal', overflowWrap: 'anywhere' }}>\n {d.repo ?? MISSING}\n </span>\n {isAnotherCopy(d) && (\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem', fontStyle: 'italic', whiteSpace: 'normal' }}>\n ↳ {t('anotherCopy')}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n\n {connectNotice && (\n <div\n className=\"semiont-panel-text-secondary\"\n style={{ fontSize: '0.75rem', padding: '0.5rem 0.75rem', color: 'var(--semiont-color-warning-500, #eab308)', whiteSpace: 'normal' }}\n >\n {connectNotice}\n </div>\n )}\n\n {addForm !== null && (\n <LoginForm\n key={`${addForm.host ?? ''}:${addForm.port ?? ''}`}\n t={t}\n {...(addFormContested && addFormAddress\n ? { title: t('connectToAddress', { address: addFormAddress }) }\n : {})}\n onSubmit={handleAdd}\n onCancel={() => setAddForm(null)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n {...(addForm.host !== undefined ? { initialHost: addForm.host } : {})}\n {...(addForm.port !== undefined ? { initialPort: addForm.port } : {})}\n />\n )}\n </div>\n\n {addForm === null && (\n <div className=\"semiont-panel-footer\">\n <button\n onClick={() => openAddForm()}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>{t('addKnowledgeBase')}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useTransition, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n SettingsPanel,\n ResizeHandle,\n usePanelWidth,\n useEventSubscriptions,\n useSemiont,\n useObservable,\n useHoverDelay,\n useTheme,\n useLineNumbers,\n} from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n children\n}: ToolbarPanelsProps) {\n // Source hover-delay from the shared hook so every page that mounts\n // ToolbarPanels gets the live value without prop-drilling. Previously\n // each page passed `hoverDelayMs` through as a prop; pages that forgot\n // (Discover, Admin, Moderation) rendered the Settings panel with\n // `undefined`, which surfaced as `{undefined}ms delay` after the\n // translation interpolation ran.\n const { hoverDelayMs } = useHoverDelay();\n const { t: _t } = useTranslation();\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // APPLYING the settings this panel emits is this component's job, exactly\n // like locale above. It used to be a per-route subscription — eleven\n // copies — and the signed-out knowledge layout never got one, so Theme and\n // Line Numbers were visibly dead when signed out while Language (handled\n // here) worked. Living here makes \"the panel is mounted\" and \"the panel\n // works\" the same condition; the route copies are deleted, not added to.\n // See .plans/bugs/settings-theme-and-line-numbers-inert-when-signed-out.md\n const { setTheme } = useTheme();\n const { toggleLineNumbers } = useLineNumbers();\n const handleThemeChanged = useCallback(\n ({ theme: newTheme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(newTheme),\n [setTheme],\n );\n const handleLineNumbersToggled = useCallback(() => toggleLineNumbers(), [toggleLineNumbers]);\n\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n 'settings:theme-changed': handleThemeChanged,\n 'settings:line-numbers-toggled': handleLineNumbersToggled,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - requires authentication */}\n {activePanel === 'user' && (\n isAuthenticated ? (\n <UserPanel />\n ) : (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{_t('UserPanel.account')}</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\" style={{ padding: '1rem', textAlign: 'center' }}>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {_t('AccountPanel.notAuthenticated')}\n </p>\n </div>\n </div>\n )\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}