@semiont/cli 0.4.19 → 0.4.21

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 (155) hide show
  1. package/dist/cli.mjs +235 -181
  2. package/dist/frontend/dist/assets/{CookiePreferences-BBb5XMuG.js → CookiePreferences-CWvTznuy.js} +2 -2
  3. package/dist/frontend/dist/assets/{CookiePreferences-BBb5XMuG.js.map → CookiePreferences-CWvTznuy.js.map} +1 -1
  4. package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-6ZGFEN2N-Dnq2pEeZ.js +2 -0
  5. package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-6ZGFEN2N-Dnq2pEeZ.js.map +1 -0
  6. package/dist/frontend/dist/assets/ToolbarPanels-DQrfch_k.js +2 -0
  7. package/dist/frontend/dist/assets/ToolbarPanels-DQrfch_k.js.map +1 -0
  8. package/dist/frontend/dist/assets/client-9KMfqezG.js +2 -0
  9. package/dist/frontend/dist/assets/client-9KMfqezG.js.map +1 -0
  10. package/dist/frontend/dist/assets/client-Bvrf4lLa.js +2 -0
  11. package/dist/frontend/dist/assets/client-Bvrf4lLa.js.map +1 -0
  12. package/dist/frontend/dist/assets/client-D9qa8fAn.js +2 -0
  13. package/dist/frontend/dist/assets/client-D9qa8fAn.js.map +1 -0
  14. package/dist/frontend/dist/assets/client-kIBNRH2w.js +2 -0
  15. package/dist/frontend/dist/assets/client-kIBNRH2w.js.map +1 -0
  16. package/dist/frontend/dist/assets/index-DaA8-3Y1.js +169 -0
  17. package/dist/frontend/dist/assets/index-DaA8-3Y1.js.map +1 -0
  18. package/dist/frontend/dist/assets/{index-DNL392dn.css → index-fHqJXd_A.css} +1 -1
  19. package/dist/frontend/dist/assets/layout-BLGpzYwk.js +2 -0
  20. package/dist/frontend/dist/assets/layout-BLGpzYwk.js.map +1 -0
  21. package/dist/frontend/dist/assets/layout-BgHlzaj1.js +2 -0
  22. package/dist/frontend/dist/assets/layout-BgHlzaj1.js.map +1 -0
  23. package/dist/frontend/dist/assets/layout-Dj1MEjN6.js +2 -0
  24. package/dist/frontend/dist/assets/layout-Dj1MEjN6.js.map +1 -0
  25. package/dist/frontend/dist/assets/layout-easR0slx.js +2 -0
  26. package/dist/frontend/dist/assets/layout-easR0slx.js.map +1 -0
  27. package/dist/frontend/dist/assets/not-found-nC4IaXPt.js +2 -0
  28. package/dist/frontend/dist/assets/{not-found-BKG2_Fv3.js.map → not-found-nC4IaXPt.js.map} +1 -1
  29. package/dist/frontend/dist/assets/page-8zC_t3l-.js +2 -0
  30. package/dist/frontend/dist/assets/page-8zC_t3l-.js.map +1 -0
  31. package/dist/frontend/dist/assets/page-BD9EKRMV.js +2 -0
  32. package/dist/frontend/dist/assets/{page-DbwQv5n_.js.map → page-BD9EKRMV.js.map} +1 -1
  33. package/dist/frontend/dist/assets/page-BDMxGD5Z.js +8 -0
  34. package/dist/frontend/dist/assets/{page-aKPxuWo3.js.map → page-BDMxGD5Z.js.map} +1 -1
  35. package/dist/frontend/dist/assets/page-BwiRQxa7.js +2 -0
  36. package/dist/frontend/dist/assets/page-BwiRQxa7.js.map +1 -0
  37. package/dist/frontend/dist/assets/page-By8BIN8Q.js +2 -0
  38. package/dist/frontend/dist/assets/{page-IgGNB4a9.js.map → page-By8BIN8Q.js.map} +1 -1
  39. package/dist/frontend/dist/assets/{page-BRTi-f95.js → page-C8zOqZ8M.js} +3 -3
  40. package/dist/frontend/dist/assets/{page-BRTi-f95.js.map → page-C8zOqZ8M.js.map} +1 -1
  41. package/dist/frontend/dist/assets/page-CQsfujTh.js +2 -0
  42. package/dist/frontend/dist/assets/page-CQsfujTh.js.map +1 -0
  43. package/dist/frontend/dist/assets/page-CTvUxWH5.js +2 -0
  44. package/dist/frontend/dist/assets/{page-BSB8GP79.js.map → page-CTvUxWH5.js.map} +1 -1
  45. package/dist/frontend/dist/assets/page-ChjwiTJ8.js +2 -0
  46. package/dist/frontend/dist/assets/page-ChjwiTJ8.js.map +1 -0
  47. package/dist/frontend/dist/assets/page-D8JSCVFI.js +2 -0
  48. package/dist/frontend/dist/assets/{page-CDSGl6uY.js.map → page-D8JSCVFI.js.map} +1 -1
  49. package/dist/frontend/dist/assets/page-DB1HZ_Jr.js +2 -0
  50. package/dist/frontend/dist/assets/{page-D1q6VB02.js.map → page-DB1HZ_Jr.js.map} +1 -1
  51. package/dist/frontend/dist/assets/page-DBoIW_-n.js +2 -0
  52. package/dist/frontend/dist/assets/{page-DzoXV-AN.js.map → page-DBoIW_-n.js.map} +1 -1
  53. package/dist/frontend/dist/assets/page-DEHEdU59.js +2 -0
  54. package/dist/frontend/dist/assets/{page-BNJp__R7.js.map → page-DEHEdU59.js.map} +1 -1
  55. package/dist/frontend/dist/assets/page-DWS9ulKD.js +5 -0
  56. package/dist/frontend/dist/assets/{page-D3THDsqd.js.map → page-DWS9ulKD.js.map} +1 -1
  57. package/dist/frontend/dist/assets/page-DoqFVg4p.js +2 -0
  58. package/dist/frontend/dist/assets/page-DoqFVg4p.js.map +1 -0
  59. package/dist/frontend/dist/assets/page-btIB2WK4.js +2 -0
  60. package/dist/frontend/dist/assets/page-btIB2WK4.js.map +1 -0
  61. package/dist/frontend/dist/assets/page-jr_Rqa0A.js +2 -0
  62. package/dist/frontend/dist/assets/page-jr_Rqa0A.js.map +1 -0
  63. package/dist/frontend/dist/assets/page-kLVTeA46.js +2 -0
  64. package/dist/frontend/dist/assets/{page-CJLuuiG8.js.map → page-kLVTeA46.js.map} +1 -1
  65. package/dist/frontend/dist/assets/privacy-mpF0jllH.js +2 -0
  66. package/dist/frontend/dist/assets/{privacy-BAxopuZI.js.map → privacy-mpF0jllH.js.map} +1 -1
  67. package/dist/frontend/dist/assets/{routing-rYtBowvy.js → routing-BmJG4tNe.js} +2 -2
  68. package/dist/frontend/dist/assets/{routing-rYtBowvy.js.map → routing-BmJG4tNe.js.map} +1 -1
  69. package/dist/frontend/dist/assets/routing-JYkXODZK.js +2 -0
  70. package/dist/frontend/dist/assets/{routing-Cm_oCwum.js.map → routing-JYkXODZK.js.map} +1 -1
  71. package/dist/frontend/dist/index.html +2 -3
  72. package/dist/frontend/dist/messages/ar.json +0 -1
  73. package/dist/frontend/dist/messages/bn.json +0 -1
  74. package/dist/frontend/dist/messages/cs.json +0 -1
  75. package/dist/frontend/dist/messages/da.json +0 -1
  76. package/dist/frontend/dist/messages/de.json +0 -1
  77. package/dist/frontend/dist/messages/el.json +0 -1
  78. package/dist/frontend/dist/messages/en.json +0 -1
  79. package/dist/frontend/dist/messages/es.json +0 -1
  80. package/dist/frontend/dist/messages/fa.json +0 -1
  81. package/dist/frontend/dist/messages/fi.json +0 -1
  82. package/dist/frontend/dist/messages/fr.json +0 -1
  83. package/dist/frontend/dist/messages/he.json +0 -1
  84. package/dist/frontend/dist/messages/hi.json +0 -1
  85. package/dist/frontend/dist/messages/id.json +0 -1
  86. package/dist/frontend/dist/messages/it.json +0 -1
  87. package/dist/frontend/dist/messages/ja.json +0 -1
  88. package/dist/frontend/dist/messages/ko.json +0 -1
  89. package/dist/frontend/dist/messages/ms.json +0 -1
  90. package/dist/frontend/dist/messages/nl.json +0 -1
  91. package/dist/frontend/dist/messages/no.json +0 -1
  92. package/dist/frontend/dist/messages/pl.json +0 -1
  93. package/dist/frontend/dist/messages/pt.json +0 -1
  94. package/dist/frontend/dist/messages/ro.json +0 -1
  95. package/dist/frontend/dist/messages/sv.json +0 -1
  96. package/dist/frontend/dist/messages/th.json +0 -1
  97. package/dist/frontend/dist/messages/tr.json +0 -1
  98. package/dist/frontend/dist/messages/uk.json +0 -1
  99. package/dist/frontend/dist/messages/vi.json +0 -1
  100. package/dist/frontend/dist/messages/zh.json +0 -1
  101. package/dist/frontend/package.json +1 -1
  102. package/package.json +7 -7
  103. package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js +0 -2
  104. package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js.map +0 -1
  105. package/dist/frontend/dist/assets/StreamStatusContext-BNiTXRfJ.js +0 -2
  106. package/dist/frontend/dist/assets/StreamStatusContext-BNiTXRfJ.js.map +0 -1
  107. package/dist/frontend/dist/assets/ToolbarPanels-CfaOVIc9.js +0 -2
  108. package/dist/frontend/dist/assets/ToolbarPanels-CfaOVIc9.js.map +0 -1
  109. package/dist/frontend/dist/assets/client-CWwdB0xQ.js +0 -2
  110. package/dist/frontend/dist/assets/client-CWwdB0xQ.js.map +0 -1
  111. package/dist/frontend/dist/assets/client-Cgz-uiSd.js +0 -2
  112. package/dist/frontend/dist/assets/client-Cgz-uiSd.js.map +0 -1
  113. package/dist/frontend/dist/assets/client-D3W9xTBT.js +0 -2
  114. package/dist/frontend/dist/assets/client-D3W9xTBT.js.map +0 -1
  115. package/dist/frontend/dist/assets/client-DeL0szs5.js +0 -2
  116. package/dist/frontend/dist/assets/client-DeL0szs5.js.map +0 -1
  117. package/dist/frontend/dist/assets/index-C5oI0kaf.js +0 -161
  118. package/dist/frontend/dist/assets/index-C5oI0kaf.js.map +0 -1
  119. package/dist/frontend/dist/assets/layout-B_JLc3yI.js +0 -2
  120. package/dist/frontend/dist/assets/layout-B_JLc3yI.js.map +0 -1
  121. package/dist/frontend/dist/assets/layout-DJI7aibW.js +0 -2
  122. package/dist/frontend/dist/assets/layout-DJI7aibW.js.map +0 -1
  123. package/dist/frontend/dist/assets/layout-DXY8hCsB.js +0 -2
  124. package/dist/frontend/dist/assets/layout-DXY8hCsB.js.map +0 -1
  125. package/dist/frontend/dist/assets/layout-VBQ97DvJ.js +0 -2
  126. package/dist/frontend/dist/assets/layout-VBQ97DvJ.js.map +0 -1
  127. package/dist/frontend/dist/assets/not-found-BKG2_Fv3.js +0 -2
  128. package/dist/frontend/dist/assets/page-8OrS1-4-.js +0 -2
  129. package/dist/frontend/dist/assets/page-8OrS1-4-.js.map +0 -1
  130. package/dist/frontend/dist/assets/page-B4Qu9WPd.js +0 -2
  131. package/dist/frontend/dist/assets/page-B4Qu9WPd.js.map +0 -1
  132. package/dist/frontend/dist/assets/page-BNJp__R7.js +0 -2
  133. package/dist/frontend/dist/assets/page-BSB8GP79.js +0 -2
  134. package/dist/frontend/dist/assets/page-Bx8QAzic.js +0 -2
  135. package/dist/frontend/dist/assets/page-Bx8QAzic.js.map +0 -1
  136. package/dist/frontend/dist/assets/page-CDSGl6uY.js +0 -2
  137. package/dist/frontend/dist/assets/page-CJLuuiG8.js +0 -2
  138. package/dist/frontend/dist/assets/page-CyFJt2nP.js +0 -2
  139. package/dist/frontend/dist/assets/page-CyFJt2nP.js.map +0 -1
  140. package/dist/frontend/dist/assets/page-D1q6VB02.js +0 -2
  141. package/dist/frontend/dist/assets/page-D3THDsqd.js +0 -5
  142. package/dist/frontend/dist/assets/page-DCxg1lHk.js +0 -2
  143. package/dist/frontend/dist/assets/page-DCxg1lHk.js.map +0 -1
  144. package/dist/frontend/dist/assets/page-DbwQv5n_.js +0 -2
  145. package/dist/frontend/dist/assets/page-DddZ9Yxm.js +0 -2
  146. package/dist/frontend/dist/assets/page-DddZ9Yxm.js.map +0 -1
  147. package/dist/frontend/dist/assets/page-DzoXV-AN.js +0 -2
  148. package/dist/frontend/dist/assets/page-IgGNB4a9.js +0 -2
  149. package/dist/frontend/dist/assets/page-aKPxuWo3.js +0 -8
  150. package/dist/frontend/dist/assets/page-jxC42AIR.js +0 -2
  151. package/dist/frontend/dist/assets/page-jxC42AIR.js.map +0 -1
  152. package/dist/frontend/dist/assets/privacy-BAxopuZI.js +0 -2
  153. package/dist/frontend/dist/assets/query-B6BuIB0M.js +0 -10
  154. package/dist/frontend/dist/assets/query-B6BuIB0M.js.map +0 -1
  155. package/dist/frontend/dist/assets/routing-Cm_oCwum.js +0 -2
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "সম্পদের নাম লিখুন...",
649
649
  "entityTypes": "সত্তার ধরনের ট্যাগ",
650
650
  "entityTypesHint": "আপনার সম্পদে সত্তার ধরনের ট্যাগ যোগ করুন",
651
- "noEntityTypesAvailable": "কোনো সত্তার ধরন উপলব্ধ নেই",
652
651
  "contentSource": "বিষয়বস্তুর উৎস",
653
652
  "uploadFile": "ফাইল আপলোড করুন",
654
653
  "uploadFileDescription": "ছবি, নথি, পাঠ্য ফাইল",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Zadejte název zdroje...",
649
649
  "entityTypes": "Štítky typů entit",
650
650
  "entityTypesHint": "Označte svůj zdroj typy entit",
651
- "noEntityTypesAvailable": "Žádné typy entit nejsou k dispozici",
652
651
  "contentSource": "Zdroj obsahu",
653
652
  "uploadFile": "Nahrát soubor",
654
653
  "uploadFileDescription": "Obrázky, dokumenty, textové soubory",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Indtast ressourcenavn...",
649
649
  "entityTypes": "Enhedstypetags",
650
650
  "entityTypesHint": "Tag din ressource med enhedstyper",
651
- "noEntityTypesAvailable": "Ingen enhedstyper tilgængelige",
652
651
  "contentSource": "Indholdskilde",
653
652
  "uploadFile": "Upload fil",
654
653
  "uploadFileDescription": "Billeder, dokumenter, tekstfiler",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Ressourcenname eingeben...",
649
649
  "entityTypes": "Entitätstyp-Tags",
650
650
  "entityTypesHint": "Versehen Sie Ihre Ressource mit Entitätstyp-Tags",
651
- "noEntityTypesAvailable": "Keine Entitätstypen verfügbar",
652
651
  "contentSource": "Inhaltsquelle",
653
652
  "uploadFile": "Datei hochladen",
654
653
  "uploadFileDescription": "Bilder, Dokumente, Textdateien",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Εισαγάγετε όνομα πόρου...",
649
649
  "entityTypes": "Ετικέτες Τύπου Οντότητας",
650
650
  "entityTypesHint": "Προσθέστε ετικέτες τύπου οντότητας στον πόρο σας",
651
- "noEntityTypesAvailable": "Δεν υπάρχουν διαθέσιμοι τύποι οντοτήτων",
652
651
  "contentSource": "Πηγή Περιεχομένου",
653
652
  "uploadFile": "Μεταφόρτωση Αρχείου",
654
653
  "uploadFileDescription": "Εικόνες, έγγραφα, αρχεία κειμένου",
@@ -676,7 +676,6 @@
676
676
  "resourceNamePlaceholder": "Enter resource name...",
677
677
  "entityTypes": "Entity Type Tags",
678
678
  "entityTypesHint": "Tag your resource with entity types",
679
- "noEntityTypesAvailable": "No entity types available",
680
679
  "contentSource": "Content Source",
681
680
  "uploadFile": "Upload File",
682
681
  "uploadFileDescription": "Images, documents, text files",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Ingresa el nombre del recurso...",
649
649
  "entityTypes": "Etiquetas de Tipo de Entidad",
650
650
  "entityTypesHint": "Etiqueta tu documento con tipos de entidad",
651
- "noEntityTypesAvailable": "No hay tipos de entidad disponibles",
652
651
  "contentSource": "Fuente de Contenido",
653
652
  "uploadFile": "Subir Archivo",
654
653
  "uploadFileDescription": "Imágenes, documentos, archivos de texto",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "نام منبع را وارد کنید...",
649
649
  "entityTypes": "برچسب‌های نوع موجودیت",
650
650
  "entityTypesHint": "منبع خود را با انواع موجودیت برچسب‌گذاری کنید",
651
- "noEntityTypesAvailable": "نوع موجودیتی موجود نیست",
652
651
  "contentSource": "منبع محتوا",
653
652
  "uploadFile": "بارگذاری فایل",
654
653
  "uploadFileDescription": "تصاویر، اسناد، فایل‌های متنی",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Syötä resurssin nimi...",
649
649
  "entityTypes": "Entiteettityyppitunnisteet",
650
650
  "entityTypesHint": "Merkitse resurssisi entiteettityypeillä",
651
- "noEntityTypesAvailable": "Entiteettityyppejä ei ole saatavilla",
652
651
  "contentSource": "Sisällön lähde",
653
652
  "uploadFile": "Lataa tiedosto",
654
653
  "uploadFileDescription": "Kuvat, asiakirjat, tekstitiedostot",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Saisissez le nom de la ressource...",
649
649
  "entityTypes": "Étiquettes de type d'entité",
650
650
  "entityTypesHint": "Étiquetez votre ressource avec des types d'entité",
651
- "noEntityTypesAvailable": "Aucun type d'entité disponible",
652
651
  "contentSource": "Source du contenu",
653
652
  "uploadFile": "Téléverser un fichier",
654
653
  "uploadFileDescription": "Images, documents, fichiers texte",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "הזינו שם משאב...",
649
649
  "entityTypes": "תגיות סוג ישות",
650
650
  "entityTypesHint": "תייגו את המשאב שלכם עם סוגי ישויות",
651
- "noEntityTypesAvailable": "אין סוגי ישויות זמינים",
652
651
  "contentSource": "מקור תוכן",
653
652
  "uploadFile": "העלאת קובץ",
654
653
  "uploadFileDescription": "תמונות, מסמכים, קבצי טקסט",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "संसाधन का नाम दर्ज करें...",
649
649
  "entityTypes": "इकाई प्रकार टैग",
650
650
  "entityTypesHint": "अपने संसाधन को इकाई प्रकारों से टैग करें",
651
- "noEntityTypesAvailable": "कोई इकाई प्रकार उपलब्ध नहीं",
652
651
  "contentSource": "सामग्री स्रोत",
653
652
  "uploadFile": "फ़ाइल अपलोड करें",
654
653
  "uploadFileDescription": "चित्र, दस्तावेज़, टेक्स्ट फ़ाइलें",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Masukkan nama sumber daya...",
649
649
  "entityTypes": "Tag Tipe Entitas",
650
650
  "entityTypesHint": "Tandai sumber daya Anda dengan tipe entitas",
651
- "noEntityTypesAvailable": "Tidak ada tipe entitas yang tersedia",
652
651
  "contentSource": "Sumber Konten",
653
652
  "uploadFile": "Unggah Berkas",
654
653
  "uploadFileDescription": "Gambar, dokumen, berkas teks",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Inserisci il nome della risorsa...",
649
649
  "entityTypes": "Etichette Tipo di Entità",
650
650
  "entityTypesHint": "Etichetta la tua risorsa con tipi di entità",
651
- "noEntityTypesAvailable": "Nessun tipo di entità disponibile",
652
651
  "contentSource": "Origine del Contenuto",
653
652
  "uploadFile": "Carica File",
654
653
  "uploadFileDescription": "Immagini, documenti, file di testo",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "リソース名を入力...",
649
649
  "entityTypes": "エンティティタイプタグ",
650
650
  "entityTypesHint": "リソースにエンティティタイプをタグ付け",
651
- "noEntityTypesAvailable": "利用可能なエンティティタイプがありません",
652
651
  "contentSource": "コンテンツソース",
653
652
  "uploadFile": "ファイルをアップロード",
654
653
  "uploadFileDescription": "画像、ドキュメント、テキストファイル",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "리소스 이름 입력...",
649
649
  "entityTypes": "개체 유형 태그",
650
650
  "entityTypesHint": "리소스에 개체 유형 태그 지정",
651
- "noEntityTypesAvailable": "사용 가능한 개체 유형이 없습니다",
652
651
  "contentSource": "콘텐츠 소스",
653
652
  "uploadFile": "파일 업로드",
654
653
  "uploadFileDescription": "이미지, 문서, 텍스트 파일",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Masukkan nama sumber...",
649
649
  "entityTypes": "Tag Jenis Entiti",
650
650
  "entityTypesHint": "Tandai sumber anda dengan jenis entiti",
651
- "noEntityTypesAvailable": "Tiada jenis entiti tersedia",
652
651
  "contentSource": "Sumber Kandungan",
653
652
  "uploadFile": "Muat Naik Fail",
654
653
  "uploadFileDescription": "Imej, dokumen, fail teks",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Voer bronnaam in...",
649
649
  "entityTypes": "Entiteitstypelabels",
650
650
  "entityTypesHint": "Label je bron met entiteitstypen",
651
- "noEntityTypesAvailable": "Geen entiteitstypen beschikbaar",
652
651
  "contentSource": "Inhoudsbron",
653
652
  "uploadFile": "Bestand uploaden",
654
653
  "uploadFileDescription": "Afbeeldingen, documenten, tekstbestanden",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Skriv inn ressursnavn...",
649
649
  "entityTypes": "Entitetstypemerker",
650
650
  "entityTypesHint": "Merk ressursen din med entitetstyper",
651
- "noEntityTypesAvailable": "Ingen entitetstyper tilgjengelig",
652
651
  "contentSource": "Innholdskilde",
653
652
  "uploadFile": "Last opp fil",
654
653
  "uploadFileDescription": "Bilder, dokumenter, tekstfiler",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Wprowadź nazwę zasobu...",
649
649
  "entityTypes": "Tagi typów encji",
650
650
  "entityTypesHint": "Oznacz zasób tagami typów encji",
651
- "noEntityTypesAvailable": "Brak dostępnych typów encji",
652
651
  "contentSource": "Źródło treści",
653
652
  "uploadFile": "Prześlij plik",
654
653
  "uploadFileDescription": "Obrazy, dokumenty, pliki tekstowe",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Digite o nome do recurso...",
649
649
  "entityTypes": "Tags de Tipo de Entidade",
650
650
  "entityTypesHint": "Marque seu recurso com tipos de entidade",
651
- "noEntityTypesAvailable": "Nenhum tipo de entidade disponivel",
652
651
  "contentSource": "Origem do Conteudo",
653
652
  "uploadFile": "Enviar Arquivo",
654
653
  "uploadFileDescription": "Imagens, documentos, arquivos de texto",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Introduceți numele resursei...",
649
649
  "entityTypes": "Etichete de tip entitate",
650
650
  "entityTypesHint": "Etichetează resursa cu tipuri de entitate",
651
- "noEntityTypesAvailable": "Nu sunt disponibile tipuri de entitate",
652
651
  "contentSource": "Sursa conținutului",
653
652
  "uploadFile": "Încarcă fișier",
654
653
  "uploadFileDescription": "Imagini, documente, fișiere text",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Ange resursnamn...",
649
649
  "entityTypes": "Entitetstypstaggar",
650
650
  "entityTypesHint": "Tagga din resurs med entitetstyper",
651
- "noEntityTypesAvailable": "Inga entitetstyper tillgängliga",
652
651
  "contentSource": "Innehållskälla",
653
652
  "uploadFile": "Ladda upp fil",
654
653
  "uploadFileDescription": "Bilder, dokument, textfiler",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "กรอกชื่อทรัพยากร...",
649
649
  "entityTypes": "แท็กประเภทเอนทิตี",
650
650
  "entityTypesHint": "ติดแท็กทรัพยากรของคุณด้วยประเภทเอนทิตี",
651
- "noEntityTypesAvailable": "ไม่มีประเภทเอนทิตีที่พร้อมใช้งาน",
652
651
  "contentSource": "แหล่งเนื้อหา",
653
652
  "uploadFile": "อัปโหลดไฟล์",
654
653
  "uploadFileDescription": "รูปภาพ เอกสาร ไฟล์ข้อความ",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Kaynak adını girin...",
649
649
  "entityTypes": "Varlık Türü Etiketleri",
650
650
  "entityTypesHint": "Kaynağınızı varlık türleri ile etiketleyin",
651
- "noEntityTypesAvailable": "Kullanılabilir varlık türü yok",
652
651
  "contentSource": "İçerik Kaynağı",
653
652
  "uploadFile": "Dosya Yükle",
654
653
  "uploadFileDescription": "Resimler, belgeler, metin dosyaları",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Введіть назву ресурсу...",
649
649
  "entityTypes": "Теги типів сутностей",
650
650
  "entityTypesHint": "Позначте ваш ресурс тегами типів сутностей",
651
- "noEntityTypesAvailable": "Типи сутностей відсутні",
652
651
  "contentSource": "Джерело контенту",
653
652
  "uploadFile": "Завантажити файл",
654
653
  "uploadFileDescription": "Зображення, документи, текстові файли",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "Nhập tên tài nguyên...",
649
649
  "entityTypes": "Thẻ loại thực thể",
650
650
  "entityTypesHint": "Gắn thẻ loại thực thể cho tài nguyên của bạn",
651
- "noEntityTypesAvailable": "Không có loại thực thể nào",
652
651
  "contentSource": "Nguồn nội dung",
653
652
  "uploadFile": "Tải tệp lên",
654
653
  "uploadFileDescription": "Hình ảnh, tài liệu, tệp văn bản",
@@ -648,7 +648,6 @@
648
648
  "resourceNamePlaceholder": "输入资源名称...",
649
649
  "entityTypes": "实体类型标签",
650
650
  "entityTypesHint": "使用实体类型标记您的资源",
651
- "noEntityTypesAvailable": "没有可用的实体类型",
652
651
  "contentSource": "内容来源",
653
652
  "uploadFile": "上传文件",
654
653
  "uploadFileDescription": "图片、文档、文本文件",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semiont/frontend",
3
- "version": "0.4.19",
3
+ "version": "0.4.21",
4
4
  "description": "Semiont frontend - pre-built Vite SPA with static file server",
5
5
  "main": "server.js",
6
6
  "bin": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semiont/cli",
3
- "version": "0.4.19",
3
+ "version": "0.4.21",
4
4
  "description": "Semiont CLI - Unified environment management tool",
5
5
  "_comment": "AWS SDK dependencies (@aws-sdk/*) are only used by platforms/aws",
6
6
  "type": "module",
@@ -47,12 +47,12 @@
47
47
  "test:watch:unit": "vitest --watch --config vitest.config.unit.ts"
48
48
  },
49
49
  "dependencies": {
50
- "@semiont/api-client": "0.4.19",
51
- "@semiont/content": "0.4.19",
52
- "@semiont/core": "0.4.19",
53
- "@semiont/event-sourcing": "0.4.19",
54
- "@semiont/graph": "0.4.19",
55
- "@semiont/make-meaning": "0.4.19",
50
+ "@semiont/api-client": "0.4.21",
51
+ "@semiont/content": "0.4.21",
52
+ "@semiont/core": "0.4.21",
53
+ "@semiont/event-sourcing": "0.4.21",
54
+ "@semiont/graph": "0.4.21",
55
+ "@semiont/make-meaning": "0.4.21",
56
56
  "arg": "^5.0.2",
57
57
  "argon2": "^0.44.0",
58
58
  "express": "^5.2.1",
@@ -1,2 +0,0 @@
1
- import{K as lt,M as dt}from"./index-C5oI0kaf.js";import{r as l}from"./vendor-DJo4KD8w.js";import{j as u}from"./query-B6BuIB0M.js";import"./i18n-BbpF47i1.js";function ut(t,d,s,o,a=1){const w=Math.min(t.startX,t.endX),j=Math.min(t.startY,t.endY),S=Math.max(t.startX,t.endX),b=Math.max(t.startY,t.endY),F=w/a,D=(S-w)/a,E=o-b/a,h=(b-j)/a;return{page:d,x:Math.round(F),y:Math.round(E),width:Math.round(D),height:Math.round(h)}}function V(t,d,s=1){const o=t.x*s,a=t.width*s,w=(d-t.y-t.height)*s,j=t.height*s;return{x:o,y:w,width:a,height:j}}function ht(t){return`page=${t.page}&viewrect=${t.x},${t.y},${t.width},${t.height}`}function J(t){try{const d=t.match(/page=(\d+)/);if(!d)return null;const s=parseInt(d[1],10),o=t.match(/viewrect=([\d.]+),([\d.]+),([\d.]+),([\d.]+)/);return o?{page:s,x:parseFloat(o[1]),y:parseFloat(o[2]),width:parseFloat(o[3]),height:parseFloat(o[4])}:null}catch{return null}}function ft(t){const d=t.match(/page=(\d+)/);return d?parseInt(d[1],10):null}async function gt(){return typeof window<"u"&&window.pdfjsLib?window.pdfjsLib:new Promise((t,d)=>{const s=document.createElement("script");s.src="/pdfjs/pdf.min.mjs",s.type="module",s.onload=()=>{const o=window.pdfjsLib;if(!o){d(new Error("PDF.js loaded but pdfjsLib not available"));return}o.GlobalWorkerOptions.workerSrc="/pdfjs/pdf.worker.min.mjs",t(o)},s.onerror=()=>{d(new Error("Failed to load PDF.js from /pdfjs/pdf.min.mjs"))},document.head.appendChild(s)})}async function mt(t){return(await gt()).getDocument({url:t}).promise}async function pt(t,d=1){const s=t.getViewport({scale:d}),o=document.createElement("canvas"),a=o.getContext("2d");if(!a)throw new Error("Failed to get 2D context");return o.width=s.width,o.height=s.height,await t.render({canvasContext:a,viewport:s}).promise,{dataUrl:o.toDataURL("image/png"),width:s.width,height:s.height}}function K(t){if(!t)return{stroke:"rgb(156, 163, 175)",fill:"rgba(156, 163, 175, 0.2)"};switch(t){case"highlighting":return{stroke:"rgb(250, 204, 21)",fill:"rgba(250, 204, 21, 0.3)"};case"linking":return{stroke:"rgb(59, 130, 246)",fill:"rgba(59, 130, 246, 0.2)"};case"assessing":return{stroke:"rgb(239, 68, 68)",fill:"rgba(239, 68, 68, 0.2)"};case"commenting":return{stroke:"rgb(255, 255, 255)",fill:"rgba(255, 255, 255, 0.2)"};default:return{stroke:"rgb(156, 163, 175)",fill:"rgba(156, 163, 175, 0.2)"}}}function xt({pdfUrl:t,existingAnnotations:d=[],drawingMode:s,selectedMotivation:o,eventBus:a,hoveredAnnotationId:w,selectedAnnotationId:j,hoverDelayMs:S=150}){const[b,F]=l.useState(null),[D,E]=l.useState(0),[h,W]=l.useState(1),[N,Q]=l.useState(null),[A,C]=l.useState(!0),[H,L]=l.useState(null),[f,Z]=l.useState(null),[m,U]=l.useState(null),[z]=l.useState(1.5),[M,v]=l.useState(!1),[r,y]=l.useState(null),B=l.useRef(null),g=l.useRef(null);l.useEffect(()=>{let e=!1;async function n(){try{C(!0),L(null);const c=await mt(t);if(e)return;F(c),E(c.numPages),C(!1)}catch(c){if(e)return;console.error("Error loading PDF:",c),L("Failed to load PDF"),C(!1)}}return n(),()=>{e=!0}},[t]),l.useEffect(()=>{if(!b)return;let e=!1;const n=b;async function c(){try{const i=await n.getPage(h);if(e)return;const p=i.getViewport({scale:1});Z({width:p.width,height:p.height});const{dataUrl:x}=await pt(i,z);if(e)return;Q(x)}catch(i){if(e)return;console.error("Error loading page:",i),L("Failed to load page")}}return c(),()=>{e=!0}},[b,h,z]),l.useEffect(()=>{const e=()=>{g.current&&U({width:g.current.clientWidth,height:g.current.clientHeight})};e();let n=null;try{n=new ResizeObserver(e),g.current&&n.observe(g.current)}catch{console.warn("ResizeObserver not supported, falling back to window resize listener"),window.addEventListener("resize",e)}return()=>{n?n.disconnect():window.removeEventListener("resize",e)}},[N]);const tt=l.useCallback(e=>{if(!s||!g.current)return;const n=g.current.getBoundingClientRect(),c=e.clientX-n.left,i=e.clientY-n.top;v(!0),y({startX:c,startY:i,endX:c,endY:i})},[s]),et=l.useCallback(e=>{if(!M||!r||!g.current)return;const n=g.current.getBoundingClientRect();y({...r,endX:e.clientX-n.left,endY:e.clientY-n.top})},[M,r]),nt=l.useCallback(()=>{if(!M||!r||!f||!m||!a){v(!1),y(null);return}if(Math.sqrt(Math.pow(r.endX-r.startX,2)+Math.pow(r.endY-r.startY,2))<10){if(d.length>0){const k=$.find(T=>{const Y=I(T.target);if(!Y)return!1;const _=J(Y.value);if(!_)return!1;const P=V(_,f.height,1),R=m.width/f.width,q=m.height/f.height,O=P.x*R,G=P.y*q,it=P.width*R,ct=P.height*q;return r.endX>=O&&r.endX<=O+it&&r.endY>=G&&r.endY<=G+ct});if(k){a==null||a.get("browse:click").next({annotationId:k.id,motivation:k.motivation}),v(!1),y(null);return}}v(!1),y(null);return}const c=f.width/m.width,i=f.height/m.height,p={startX:r.startX*c,startY:r.startY*i,endX:r.endX*c,endY:r.endY*i},x=ut(p,h,f.width,f.height,1),X=ht(x);o&&a.get("mark:requested").next({selector:{type:"FragmentSelector",conformsTo:"http://tools.ietf.org/rfc/rfc3778",value:X},motivation:o}),v(!1)},[M,r,h,f,m,o,d]),I=e=>{const n=lt(e);if(!n)return null;const i=(Array.isArray(n)?n:[n]).find(p=>p.type==="FragmentSelector");return!i||i.type!=="FragmentSelector"?null:i},$=d.filter(e=>{const n=I(e.target);return n?ft(n.value)===h:!1}),{handleMouseEnter:rt,handleMouseLeave:st}=l.useMemo(()=>dt(e=>a==null?void 0:a.get("beckon:hover").next({annotationId:e}),S),[a,S]),{stroke:ot,fill:at}=K(o??null);return H?u.jsx("div",{className:"semiont-pdf-annotation-canvas__error",children:H}):u.jsxs("div",{className:"semiont-pdf-annotation-canvas",children:[A&&u.jsx("div",{className:"semiont-pdf-annotation-canvas__loading",children:"Loading PDF..."}),u.jsxs("div",{ref:B,className:"semiont-pdf-annotation-canvas__container",style:{display:A?"none":void 0},onMouseDown:tt,onMouseMove:et,onMouseUp:nt,onMouseLeave:()=>{M&&(v(!1),y(null))},"data-drawing-mode":s||"none",children:[N&&u.jsx("img",{ref:g,src:N,alt:`PDF page ${h}`,className:"semiont-pdf-annotation-canvas__image",draggable:!1,style:{pointerEvents:"none"},onLoad:()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{g.current&&U({width:g.current.clientWidth,height:g.current.clientHeight})})})}}),m&&f&&u.jsx("div",{className:"semiont-pdf-annotation-canvas__overlay-container",children:u.jsx("div",{className:"semiont-pdf-annotation-canvas__overlay",children:u.jsxs("svg",{className:"semiont-pdf-annotation-canvas__svg",width:m.width,height:m.height,children:[$.map(e=>{const n=I(e.target);if(!n)return null;const c=J(n.value);if(!c)return null;const i=V(c,f.height,1),p=m.width/f.width,x=m.height/f.height,X=e.id===w,k=e.id===j,T=e.motivation,{stroke:Y,fill:_}=K(T);return u.jsx("rect",{x:i.x*p,y:i.y*x,width:i.width*p,height:i.height*x,stroke:Y,strokeWidth:k?4:X?3:2,fill:_,style:{pointerEvents:"auto",cursor:"pointer",opacity:k?1:X?.9:.7},onClick:()=>a==null?void 0:a.get("browse:click").next({annotationId:e.id,motivation:e.motivation}),onMouseEnter:()=>rt(e.id),onMouseLeave:st},e.id)}),r&&(()=>{const e=Math.min(r.startX,r.endX),n=Math.min(r.startY,r.endY),c=Math.abs(r.endX-r.startX),i=Math.abs(r.endY-r.startY);return u.jsx("rect",{x:e,y:n,width:c,height:i,stroke:ot,strokeWidth:2,strokeDasharray:"5,5",fill:at,pointerEvents:"none"})})()]})})})]}),D>0&&u.jsxs("div",{className:"semiont-pdf-annotation-canvas__controls",children:[u.jsx("button",{disabled:h<=1,onClick:()=>W(h-1),className:"semiont-pdf-annotation-canvas__button",children:"Previous"}),u.jsxs("span",{className:"semiont-pdf-annotation-canvas__page-info",children:["Page ",h," of ",D]}),u.jsx("button",{disabled:h>=D,onClick:()=>W(h+1),className:"semiont-pdf-annotation-canvas__button",children:"Next"})]})]})}export{xt as PdfAnnotationCanvas};
2
- //# sourceMappingURL=PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PdfAnnotationCanvas.client-CHDCGQBR-mCGxablw.js","sources":["../../../../packages/react-ui/dist/PdfAnnotationCanvas.client-CHDCGQBR.mjs"],"sourcesContent":["'use client';\n\"use client\";\nimport {\n createHoverHandlers\n} from \"./chunk-VN5NY4SN.mjs\";\nimport \"./chunk-OZICDVH7.mjs\";\nimport \"./chunk-D4GAAQMM.mjs\";\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { useRef, useState, useCallback, useEffect, useMemo } from \"react\";\nimport { getTargetSelector } from \"@semiont/api-client\";\n\n// src/lib/pdf-coordinates.ts\nfunction canvasToPdfCoordinates(canvasRect, page, _pageWidth, pageHeight, scale = 1) {\n const x1 = Math.min(canvasRect.startX, canvasRect.endX);\n const y1 = Math.min(canvasRect.startY, canvasRect.endY);\n const x2 = Math.max(canvasRect.startX, canvasRect.endX);\n const y2 = Math.max(canvasRect.startY, canvasRect.endY);\n const pdfX = x1 / scale;\n const pdfWidth = (x2 - x1) / scale;\n const pdfY = pageHeight - y2 / scale;\n const pdfHeight = (y2 - y1) / scale;\n return {\n page,\n x: Math.round(pdfX),\n y: Math.round(pdfY),\n width: Math.round(pdfWidth),\n height: Math.round(pdfHeight)\n };\n}\nfunction pdfToCanvasCoordinates(pdfCoord, pageHeight, scale = 1) {\n const canvasX = pdfCoord.x * scale;\n const canvasWidth = pdfCoord.width * scale;\n const canvasY = (pageHeight - pdfCoord.y - pdfCoord.height) * scale;\n const canvasHeight = pdfCoord.height * scale;\n return {\n x: canvasX,\n y: canvasY,\n width: canvasWidth,\n height: canvasHeight\n };\n}\nfunction createFragmentSelector(coord) {\n return `page=${coord.page}&viewrect=${coord.x},${coord.y},${coord.width},${coord.height}`;\n}\nfunction parseFragmentSelector(fragment) {\n try {\n const pageMatch = fragment.match(/page=(\\d+)/);\n if (!pageMatch) return null;\n const page = parseInt(pageMatch[1], 10);\n const viewrectMatch = fragment.match(/viewrect=([\\d.]+),([\\d.]+),([\\d.]+),([\\d.]+)/);\n if (!viewrectMatch) return null;\n return {\n page,\n x: parseFloat(viewrectMatch[1]),\n y: parseFloat(viewrectMatch[2]),\n width: parseFloat(viewrectMatch[3]),\n height: parseFloat(viewrectMatch[4])\n };\n } catch {\n return null;\n }\n}\nfunction getPageFromFragment(fragment) {\n const match = fragment.match(/page=(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\n// src/lib/browser-pdfjs.ts\nasync function ensurePdfJs() {\n if (typeof window !== \"undefined\" && window.pdfjsLib) {\n return window.pdfjsLib;\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"/pdfjs/pdf.min.mjs\";\n script.type = \"module\";\n script.onload = () => {\n const pdfjsLib = window.pdfjsLib;\n if (!pdfjsLib) {\n reject(new Error(\"PDF.js loaded but pdfjsLib not available\"));\n return;\n }\n pdfjsLib.GlobalWorkerOptions.workerSrc = \"/pdfjs/pdf.worker.min.mjs\";\n resolve(pdfjsLib);\n };\n script.onerror = () => {\n reject(new Error(\"Failed to load PDF.js from /pdfjs/pdf.min.mjs\"));\n };\n document.head.appendChild(script);\n });\n}\nasync function loadPdfDocument(url) {\n const pdfjsLib = await ensurePdfJs();\n const loadingTask = pdfjsLib.getDocument({ url });\n return loadingTask.promise;\n}\nasync function renderPdfPageToDataUrl(page, scale = 1) {\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Failed to get 2D context\");\n }\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const renderTask = page.render({\n canvasContext: context,\n viewport\n });\n await renderTask.promise;\n return {\n dataUrl: canvas.toDataURL(\"image/png\"),\n width: viewport.width,\n height: viewport.height\n };\n}\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nfunction getMotivationColor(motivation) {\n if (!motivation) {\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n switch (motivation) {\n case \"highlighting\":\n return { stroke: \"rgb(250, 204, 21)\", fill: \"rgba(250, 204, 21, 0.3)\" };\n case \"linking\":\n return { stroke: \"rgb(59, 130, 246)\", fill: \"rgba(59, 130, 246, 0.2)\" };\n case \"assessing\":\n return { stroke: \"rgb(239, 68, 68)\", fill: \"rgba(239, 68, 68, 0.2)\" };\n case \"commenting\":\n return { stroke: \"rgb(255, 255, 255)\", fill: \"rgba(255, 255, 255, 0.2)\" };\n default:\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n}\nfunction PdfAnnotationCanvas({\n pdfUrl,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n eventBus,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs = 150\n}) {\n const [pdfDoc, setPdfDoc] = useState(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [pageImageUrl, setPageImageUrl] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n const [pageDimensions, setPageDimensions] = useState(null);\n const [displayDimensions, setDisplayDimensions] = useState(null);\n const [scale] = useState(1.5);\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState(null);\n const containerRef = useRef(null);\n const imageRef = useRef(null);\n useEffect(() => {\n let cancelled = false;\n async function loadPdf() {\n try {\n setIsLoading(true);\n setError(null);\n const doc = await loadPdfDocument(pdfUrl);\n if (cancelled) return;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading PDF:\", err);\n setError(\"Failed to load PDF\");\n setIsLoading(false);\n }\n }\n loadPdf();\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n async function loadPage() {\n try {\n const page = await doc.getPage(pageNumber);\n if (cancelled) return;\n const viewport = page.getViewport({ scale: 1 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height\n });\n const { dataUrl } = await renderPdfPageToDataUrl(page, scale);\n if (cancelled) return;\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading page:\", err);\n setError(\"Failed to load page\");\n }\n }\n loadPage();\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, pageNumber, scale]);\n useEffect(() => {\n const updateDisplayDimensions = () => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n };\n updateDisplayDimensions();\n let resizeObserver = null;\n try {\n resizeObserver = new ResizeObserver(updateDisplayDimensions);\n if (imageRef.current) {\n resizeObserver.observe(imageRef.current);\n }\n } catch (error2) {\n console.warn(\"ResizeObserver not supported, falling back to window resize listener\");\n window.addEventListener(\"resize\", updateDisplayDimensions);\n }\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else {\n window.removeEventListener(\"resize\", updateDisplayDimensions);\n }\n };\n }, [pageImageUrl]);\n const handleMouseDown = useCallback((e) => {\n if (!drawingMode) return;\n if (!imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setIsDrawing(true);\n setSelection({\n startX: x,\n startY: y,\n endX: x,\n endY: y\n });\n }, [drawingMode]);\n const handleMouseMove = useCallback((e) => {\n if (!isDrawing || !selection || !imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n setSelection({\n ...selection,\n endX: e.clientX - rect.left,\n endY: e.clientY - rect.top\n });\n }, [isDrawing, selection]);\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !selection || !pageDimensions || !displayDimensions || !eventBus) {\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const dragDistance = Math.sqrt(\n Math.pow(selection.endX - selection.startX, 2) + Math.pow(selection.endY - selection.startY, 2)\n );\n const MIN_DRAG_DISTANCE = 10;\n if (dragDistance < MIN_DRAG_DISTANCE) {\n if (existingAnnotations.length > 0) {\n const clickedAnnotation = pageAnnotations.find((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const pdfCoord2 = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord2) return false;\n const rect = pdfToCanvasCoordinates(pdfCoord2, pageDimensions.height, 1);\n const scaleX2 = displayDimensions.width / pageDimensions.width;\n const scaleY2 = displayDimensions.height / pageDimensions.height;\n const displayX = rect.x * scaleX2;\n const displayY = rect.y * scaleY2;\n const displayWidth = rect.width * scaleX2;\n const displayHeight = rect.height * scaleY2;\n return selection.endX >= displayX && selection.endX <= displayX + displayWidth && selection.endY >= displayY && selection.endY <= displayY + displayHeight;\n });\n if (clickedAnnotation) {\n eventBus?.get(\"browse:click\").next({ annotationId: clickedAnnotation.id, motivation: clickedAnnotation.motivation });\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n }\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const scaleX = pageDimensions.width / displayDimensions.width;\n const scaleY = pageDimensions.height / displayDimensions.height;\n const nativeSelection = {\n startX: selection.startX * scaleX,\n startY: selection.startY * scaleY,\n endX: selection.endX * scaleX,\n endY: selection.endY * scaleY\n };\n const pdfCoord = canvasToPdfCoordinates(\n nativeSelection,\n pageNumber,\n pageDimensions.width,\n pageDimensions.height,\n 1\n // Use scale 1.0 since we already scaled to native coords\n );\n const fragmentSelector = createFragmentSelector(pdfCoord);\n if (selectedMotivation) {\n eventBus.get(\"mark:requested\").next({\n selector: {\n type: \"FragmentSelector\",\n conformsTo: \"http://tools.ietf.org/rfc/rfc3778\",\n value: fragmentSelector\n },\n motivation: selectedMotivation\n });\n }\n setIsDrawing(false);\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, selectedMotivation, existingAnnotations]);\n const getFragmentSelector = (target) => {\n const selector = getTargetSelector(target);\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find((s) => s.type === \"FragmentSelector\");\n if (!found || found.type !== \"FragmentSelector\") return null;\n return found;\n };\n const pageAnnotations = existingAnnotations.filter((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const page = getPageFromFragment(fragmentSel.value);\n return page === pageNumber;\n });\n const { handleMouseEnter, handleMouseLeave } = useMemo(\n () => createHoverHandlers((annotationId) => eventBus?.get(\"beckon:hover\").next({ annotationId }), hoverDelayMs),\n [eventBus, hoverDelayMs]\n );\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n if (error) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__error\", children: error });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas\", children: [\n isLoading && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__loading\", children: \"Loading PDF...\" }),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n ref: containerRef,\n className: \"semiont-pdf-annotation-canvas__container\",\n style: { display: isLoading ? \"none\" : void 0 },\n onMouseDown: handleMouseDown,\n onMouseMove: handleMouseMove,\n onMouseUp: handleMouseUp,\n onMouseLeave: () => {\n if (isDrawing) {\n setIsDrawing(false);\n setSelection(null);\n }\n },\n \"data-drawing-mode\": drawingMode || \"none\",\n children: [\n pageImageUrl && /* @__PURE__ */ jsx(\n \"img\",\n {\n ref: imageRef,\n src: pageImageUrl,\n alt: `PDF page ${pageNumber}`,\n className: \"semiont-pdf-annotation-canvas__image\",\n draggable: false,\n style: { pointerEvents: \"none\" },\n onLoad: () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n });\n });\n }\n }\n ),\n displayDimensions && pageDimensions && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay-container\", children: /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"semiont-pdf-annotation-canvas__svg\",\n width: displayDimensions.width,\n height: displayDimensions.height,\n children: [\n pageAnnotations.map((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return null;\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return null;\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1);\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n const isHovered = ann.id === hoveredAnnotationId;\n const isSelected = ann.id === selectedAnnotationId;\n const annMotivation = ann.motivation;\n const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rect.x * scaleX,\n y: rect.y * scaleY,\n width: rect.width * scaleX,\n height: rect.height * scaleY,\n stroke: annStroke,\n strokeWidth: isSelected ? 4 : isHovered ? 3 : 2,\n fill: annFill,\n style: {\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7\n },\n onClick: () => eventBus?.get(\"browse:click\").next({ annotationId: ann.id, motivation: ann.motivation }),\n onMouseEnter: () => handleMouseEnter(ann.id),\n onMouseLeave: handleMouseLeave\n },\n ann.id\n );\n }),\n selection && (() => {\n const rectX = Math.min(selection.startX, selection.endX);\n const rectY = Math.min(selection.startY, selection.endY);\n const rectWidth = Math.abs(selection.endX - selection.startX);\n const rectHeight = Math.abs(selection.endY - selection.startY);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n stroke,\n strokeWidth: 2,\n strokeDasharray: \"5,5\",\n fill,\n pointerEvents: \"none\"\n }\n );\n })()\n ]\n }\n ) }) })\n ]\n }\n ),\n numPages > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas__controls\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber <= 1,\n onClick: () => setPageNumber(pageNumber - 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Previous\"\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"semiont-pdf-annotation-canvas__page-info\", children: [\n \"Page \",\n pageNumber,\n \" of \",\n numPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber >= numPages,\n onClick: () => setPageNumber(pageNumber + 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Next\"\n }\n )\n ] })\n ] });\n}\nexport {\n PdfAnnotationCanvas\n};\n//# sourceMappingURL=PdfAnnotationCanvas.client-CHDCGQBR.mjs.map"],"names":["canvasToPdfCoordinates","canvasRect","page","_pageWidth","pageHeight","scale","x1","y1","x2","y2","pdfX","pdfWidth","pdfY","pdfHeight","pdfToCanvasCoordinates","pdfCoord","canvasX","canvasWidth","canvasY","canvasHeight","createFragmentSelector","coord","parseFragmentSelector","fragment","pageMatch","viewrectMatch","getPageFromFragment","match","ensurePdfJs","resolve","reject","script","pdfjsLib","loadPdfDocument","url","renderPdfPageToDataUrl","viewport","canvas","context","getMotivationColor","motivation","PdfAnnotationCanvas","pdfUrl","existingAnnotations","drawingMode","selectedMotivation","eventBus","hoveredAnnotationId","selectedAnnotationId","hoverDelayMs","pdfDoc","setPdfDoc","useState","numPages","setNumPages","pageNumber","setPageNumber","pageImageUrl","setPageImageUrl","isLoading","setIsLoading","error","setError","pageDimensions","setPageDimensions","displayDimensions","setDisplayDimensions","isDrawing","setIsDrawing","selection","setSelection","containerRef","useRef","imageRef","useEffect","cancelled","loadPdf","doc","err","loadPage","dataUrl","updateDisplayDimensions","resizeObserver","handleMouseDown","useCallback","rect","x","y","handleMouseMove","handleMouseUp","clickedAnnotation","pageAnnotations","ann","fragmentSel","getFragmentSelector","pdfCoord2","scaleX2","scaleY2","displayX","displayY","displayWidth","displayHeight","scaleX","scaleY","nativeSelection","fragmentSelector","target","selector","getTargetSelector","found","s","handleMouseEnter","handleMouseLeave","useMemo","createHoverHandlers","annotationId","stroke","fill","jsx","jsxs","isHovered","isSelected","annMotivation","annStroke","annFill","rectX","rectY","rectWidth","rectHeight"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as t}from"./vendor-DJo4KD8w.js";const e=t.createContext("disconnected");function o(){return t.useContext(e)}export{e as S,o as u};
2
- //# sourceMappingURL=StreamStatusContext-BNiTXRfJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StreamStatusContext-BNiTXRfJ.js","sources":["../../src/contexts/StreamStatusContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { StreamStatus } from '@semiont/react-ui';\n\nexport const StreamStatusContext = createContext<StreamStatus>('disconnected');\n\nexport function useStreamStatus(): StreamStatus {\n return useContext(StreamStatusContext);\n}\n"],"names":["StreamStatusContext","createContext","useStreamStatus","useContext"],"mappings":"yCAGO,MAAMA,EAAsBC,EAAAA,cAA4B,cAAc,EAEtE,SAASC,GAAgC,CAC9C,OAAOC,EAAAA,WAAWH,CAAmB,CACvC"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./query-B6BuIB0M.js";import{r as a}from"./vendor-DJo4KD8w.js";import{u as L,e as Y,ae as V,af as J,ag as X,a9 as O,ah as U,ai as B,aj as q,ak as ee,al as te,am as se,an as ne,ao as ae,i as ie,ap as re,aq as oe,ar as le}from"./index-C5oI0kaf.js";import{u as F,a as ce,b as de}from"./routing-Cm_oCwum.js";import{u as P}from"./i18n-BbpF47i1.js";import{a as me,F as ue}from"./XMarkIcon-KMKD47CF.js";function he({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9"}))}const ge=a.forwardRef(he);function pe({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 12.75 6 6 9-13.5"}))}const xe=a.forwardRef(pe);function fe({title:n,titleId:t,...i},r){return a.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:r,"aria-labelledby":t},i),n?a.createElement("title",{id:t},n):null,a.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const je=a.forwardRef(fe),K="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==";function ve(){const{t:n}=P(),t=(j,E)=>n(`UserPanel.${j}`,E),{displayName:i,avatarUrl:r,userDomain:h,isAdmin:g,isModerator:p,activeKnowledgeBase:o,signOut:l}=L(),y=Y(),u=F(),[c,f]=a.useState(!1),{timeRemaining:w}=V(),I=X(w)??"Unknown",N=(()=>{if(!r||c)return K;const j=J(r);return j||(console.warn("Invalid profile image URL detected, using fallback"),K)})(),A=async()=>{try{await y.logout()}catch{}o&&l(o.id),u.push("/")};return e.jsxs("div",{className:"semiont-user-panel",children:[e.jsx("h3",{className:"semiont-user-panel__title",children:t("account")}),o&&e.jsx("div",{style:{padding:"0 0.75rem 0.5rem",fontSize:"0.8rem",color:"var(--semiont-color-neutral-400)"},children:o.label}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:N,alt:t("profileAlt",{name:i||t("user")}),width:48,height:48,className:"w-12 h-12 rounded-full object-cover",onError:()=>f(!0)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"semiont-panel-text",children:i||t("user")}),h&&e.jsxs("div",{className:"semiont-panel-text-secondary",children:["@",h]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("session")}),e.jsx("div",{className:"semiont-session-box",children:e.jsx("div",{className:"semiont-panel-hint",children:t("expiresIn",{time:I})})})]}),(g||p)&&e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("privileges")}),e.jsxs("div",{className:"space-y-1",children:[g&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--admin",children:e.jsx("span",{className:"semiont-privilege-text",children:t("administrator")})}),p&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--moderator",children:e.jsx("span",{className:"semiont-privilege-text",children:t("moderator")})})]})]}),e.jsx("div",{className:"semiont-panel-divider",children:e.jsx("button",{onClick:A,className:"semiont-signout-button",children:t("signOut")})})]})]})}const ye={authenticated:"var(--semiont-color-success-500, #22c55e)",expired:"var(--semiont-color-warning-500, #eab308)","signed-out":"var(--semiont-color-neutral-400, #9ca3af)",unreachable:"var(--semiont-color-error-500, #ef4444)"},be={authenticated:"statusConnected",expired:"statusExpired","signed-out":"statusSignedOut",unreachable:"statusUnreachable"};function we({status:n,t}){return e.jsx("span",{title:t(be[n]),style:{width:"0.5rem",height:"0.5rem",borderRadius:"50%",backgroundColor:ye[n],flexShrink:0}})}function Ne({t:n,onSubmit:t,onCancel:i,error:r,isSubmitting:h,autoFocus:g,pulsing:p,initialHost:o="localhost",initialPort:l=4e3,initialEmail:y="admin@example.com"}){const[u,c]=a.useState(o),[f,w]=a.useState(String(l)),[I,N]=a.useState(U(o)),[A,j]=a.useState(y),[E,C]=a.useState(""),T=d=>{c(d),N(U(d))};return e.jsxs("div",{className:p?"semiont-panel__login-form--pulsing":"",style:{margin:"0.5rem",padding:"0.75rem",border:"1px solid var(--semiont-color-neutral-200, #e5e7eb)",borderRadius:"var(--semiont-panel-border-radius, 0.5rem)",background:"var(--semiont-bg-secondary, transparent)"},children:[e.jsx("h3",{style:{fontSize:"0.8rem",fontWeight:600,marginBottom:"0.5rem"},children:n("connectTitle")}),e.jsxs("form",{onSubmit:d=>{d.preventDefault(),B(u)&&t(u,parseInt(f,10)||4e3,I,A,E)},style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:[e.jsxs("select",{value:I,onChange:d=>N(d.target.value),className:"semiont-input",children:[e.jsx("option",{value:"http",children:"HTTP"}),e.jsx("option",{value:"https",children:"HTTPS"})]}),e.jsx("input",{type:"text",value:u,onChange:d=>T(d.target.value),placeholder:"Host",className:"semiont-input",autoFocus:g}),e.jsx("input",{type:"number",value:f,onChange:d=>w(d.target.value),placeholder:"Port",className:"semiont-input"}),u&&!B(u)&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:n("invalidHost")}),e.jsx("input",{type:"email",value:A,onChange:d=>j(d.target.value),placeholder:"Email",className:"semiont-input"}),e.jsx("input",{type:"password",value:E,onChange:d=>C(d.target.value),placeholder:"Password",className:"semiont-input"}),r&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:r}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1},disabled:h||!B(u),children:n(h?"connecting":"connect")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:i,children:e.jsx(ue,{style:{width:"1rem",height:"1rem"}})})]})]})]})}function Se({t:n,kb:t,onSubmit:i,onCancel:r,error:h,isSubmitting:g}){const[p,o]=a.useState("");return e.jsxs("form",{onSubmit:l=>{l.preventDefault(),i(p)},style:{padding:"0.5rem 0.75rem",display:"flex",flexDirection:"column",gap:"0.375rem"},children:[e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--semiont-color-neutral-400)"},children:t.email}),e.jsx("input",{type:"password",value:p,onChange:l=>o(l.target.value),placeholder:"Password",className:"semiont-input",style:{fontSize:"0.8rem"},autoFocus:!0}),h&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:h}),e.jsxs("div",{style:{display:"flex",gap:"0.375rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1,fontSize:"0.8rem"},disabled:g,children:n(g?"signingIn":"signIn")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:r,style:{fontSize:"0.8rem"},children:n("cancel")})]})]})}async function D(n,t,i,r,h){const g=`${i}://${n}:${t}`,p=new q({baseUrl:te(g),eventBus:new ee}),o=await p.authenticatePassword(se(r),h),l=o.token??o.accessToken,y=o.refreshToken;if(!l)throw new Error("No access token received");if(!y)throw new Error("No refresh token received");let u=`${n}:${t}`,c;try{const f=await p.getStatus({auth:ne(l)});f.projectName&&(u=f.projectName),f.gitBranch&&(c=f.gitBranch)}catch{}return{token:l,refreshToken:y,label:u,...c?{gitBranch:c}:{}}}function Ie(){const{t:n}=P(),t=(s,x)=>n(`KnowledgeBasePanel.${s}`,x),{knowledgeBases:i,activeKnowledgeBase:r,setActiveKnowledgeBase:h,addKnowledgeBase:g,removeKnowledgeBase:p,updateKnowledgeBase:o,signIn:l,signOut:y}=L(),[u,c]=a.useState(!1),[f,w]=a.useState(null),[I,N]=a.useState(!1),[A,j]=a.useState(null),[E,C]=a.useState(null),[T,d]=a.useState(!1),[H,R]=a.useState(null),[,W]=a.useState(0);a.useEffect(()=>{i.length===0&&c(!0)},[i.length]),a.useEffect(()=>{const s=setInterval(()=>W(x=>x+1),3e4);return()=>clearInterval(s)},[]);const $=()=>{c(!0),j(null),w(null)},Z=async(s,x,b,v,S)=>{w(null),N(!0);const k=i.find(m=>m.host===s&&m.port===x);if(k){try{const{token:m,refreshToken:z,gitBranch:M}=await D(s,x,b,v,S);o(k.id,{...M?{gitBranch:M}:{}}),l(k.id,m,z),c(!1)}catch(m){w(m instanceof Error?m.message:String(m))}finally{N(!1)}return}try{const{token:m,refreshToken:z,label:M,gitBranch:_}=await D(s,x,b,v,S);g({label:M,host:s,port:x,protocol:b,email:v,..._?{gitBranch:_}:{}},m,z),c(!1)}catch(m){w(m instanceof Error?m.message:String(m))}finally{N(!1)}},G=async(s,x)=>{const b=i.find(v=>v.id===s);if(b){C(null),d(!0);try{const{token:v,refreshToken:S,label:k,gitBranch:m}=await D(b.host,b.port,b.protocol,b.email,x);o(s,{label:k,...m?{gitBranch:m}:{}}),l(s,v,S),j(null)}catch(v){C(v instanceof Error?v.message:String(v))}finally{d(!1)}}},Q=s=>{O(s.id)==="authenticated"?h(s.id):(j(s.id),c(!1),C(null))};return e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsxs("h2",{className:"semiont-panel-header__title",children:[e.jsx("span",{className:"semiont-panel-header__text",children:t("title")}),e.jsxs("span",{className:"semiont-panel-header__count",children:["(",i.length,")"]})]})}),e.jsxs("div",{className:"semiont-panel__content",children:[e.jsx("div",{className:"semiont-panel__list",children:i.map(s=>{const x=O(s.id),b=s.id===(r==null?void 0:r.id),v=A===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`semiont-panel-item semiont-panel-item--clickable${b?" semiont-panel-item--selected":""}`,style:{display:"flex",flexDirection:"column",gap:"0.25rem",cursor:"pointer",padding:"0.5rem 0.75rem"},onClick:()=>Q(s),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[e.jsx(we,{status:x,t}),e.jsx("span",{className:"semiont-panel-text",style:{flex:1,fontWeight:500},children:s.label}),b&&e.jsx(xe,{style:{width:"1rem",height:"1rem",color:"var(--semiont-color-primary-500)",flexShrink:0}}),x==="authenticated"&&e.jsx("button",{onClick:S=>{S.stopPropagation(),y(s.id)},title:t("signOut"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(ge,{style:{width:"0.875rem",height:"0.875rem"}})}),e.jsx("button",{onClick:S=>{S.stopPropagation(),R(s.id)},title:t("remove"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(me,{style:{width:"0.875rem",height:"0.875rem"}})})]}),e.jsxs("span",{className:"semiont-panel-text-secondary",style:{fontSize:"0.7rem",paddingLeft:"1rem"},children:[s.host,":",s.port,s.gitBranch?` · ${s.gitBranch}`:""]})]}),H===s.id&&e.jsxs("div",{style:{padding:"0.5rem 0.75rem",fontSize:"0.8rem",display:"flex",alignItems:"center",gap:"0.5rem",background:"var(--semiont-bg-secondary, #f9fafb)",borderBottom:"1px solid var(--semiont-color-neutral-200, #e5e7eb)"},children:[e.jsx("span",{style:{flex:1,color:"var(--semiont-color-neutral-500)"},children:t("removeConfirm",{label:s.label})}),e.jsx("button",{onClick:()=>{p(s.id),R(null)},className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem",color:"var(--semiont-color-error-500, #ef4444)"},children:t("remove")}),e.jsx("button",{onClick:()=>R(null),className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem"},children:t("cancel")})]}),v&&e.jsx(Se,{t,kb:s,onSubmit:S=>G(s.id,S),onCancel:()=>j(null),error:E,isSubmitting:T})]},s.id)})}),u&&e.jsx(Ne,{t,onSubmit:Z,onCancel:()=>c(!1),error:f,isSubmitting:I,autoFocus:i.length===0,pulsing:i.length===0})]}),!u&&e.jsx("div",{className:"semiont-panel-footer",children:e.jsxs("button",{onClick:$,className:"semiont-panel-item semiont-panel-item--clickable",style:{width:"100%",display:"flex",alignItems:"center",gap:"0.5rem",color:"var(--semiont-color-primary-600)"},children:[e.jsx(je,{style:{width:"1rem",height:"1rem",flexShrink:0}}),e.jsx("span",{className:"semiont-panel-text",style:{color:"inherit"},children:t("addKnowledgeBase")})]})})]})}function Re({activePanel:n,theme:t,showLineNumbers:i,hoverDelayMs:r,children:h}){const{t:g}=P(),{isAuthenticated:p}=L(),o=ce(),l=F(),y=de(),[u,c]=a.useTransition(),{width:f,setWidth:w,minWidth:I,maxWidth:N}=ae(),A=a.useCallback(({locale:j})=>{y&&c(()=>{l.replace(y,{locale:j})})},[y,l,c]);return ie({"settings:locale-changed":A}),!n||!h&&!re.includes(n)?null:e.jsxs("div",{className:"semiont-toolbar-panels",style:{width:`${f}px`,position:"relative"},children:[e.jsx(oe,{onResize:w,minWidth:I,maxWidth:N,position:"left",ariaLabel:"Resize right panel"}),e.jsxs("div",{className:"semiont-toolbar-panels__content",children:[h,n==="knowledge-base"&&e.jsx(Ie,{}),n==="user"&&(p?e.jsx(ve,{}):e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsx("h2",{className:"semiont-panel-header__title",children:e.jsx("span",{className:"semiont-panel-header__text",children:g("UserPanel.account")})})}),e.jsx("div",{className:"semiont-panel__content",style:{padding:"1rem",textAlign:"center"},children:e.jsx("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:g("AccountPanel.notAuthenticated")})})]})),n==="settings"&&e.jsx(le,{showLineNumbers:i,theme:t,hoverDelayMs:r,locale:o,isPendingLocaleChange:u})]})]})}export{je as F,Re as T};
2
- //# sourceMappingURL=ToolbarPanels-CfaOVIc9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolbarPanels-CfaOVIc9.js","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 React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useApiClient,\n useKnowledgeBaseSession,\n} from '@semiont/react-ui';\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 {\n displayName,\n avatarUrl,\n userDomain,\n isAdmin,\n isModerator,\n activeKnowledgeBase,\n signOut,\n } = useKnowledgeBaseSession();\n const apiClient = useApiClient();\n const router = useRouter();\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 const handleSignOut = async () => {\n try {\n await apiClient.logout();\n } catch {\n // best-effort — cookie already cleared server-side\n }\n if (activeKnowledgeBase) {\n signOut(activeKnowledgeBase.id);\n }\n router.push('/');\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 Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport { SemiontApiClient } from '@semiont/api-client';\nimport { baseUrl, email as makeEmail, accessToken, EventBus } from '@semiont/core';\nimport {\n useKnowledgeBaseSession,\n defaultProtocol,\n isValidHostname,\n getKbSessionStatus,\n type KnowledgeBase,\n type KbSessionStatus,\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\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, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\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' }}>{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\nasync function authenticateWithBackend(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n const client = new SemiontApiClient({ baseUrl: baseUrl(origin), eventBus: new EventBus() });\n\n const authResult = await client.authenticatePassword(makeEmail(emailStr), password);\n const token = (authResult as any).token ?? (authResult as any).accessToken;\n const refreshToken = (authResult as any).refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n\n let label = `${host}:${port}`;\n let gitBranch: string | undefined;\n try {\n const status = await client.getStatus({ auth: accessToken(token) });\n if ((status as any).projectName) label = (status as any).projectName;\n if ((status as any).gitBranch) gitBranch = (status as any).gitBranch;\n } catch { /* use default label */ }\n\n return { token, refreshToken, label, ...(gitBranch ? { gitBranch } : {}) };\n}\n\nexport function KnowledgeBasePanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const {\n knowledgeBases,\n activeKnowledgeBase,\n setActiveKnowledgeBase,\n addKnowledgeBase,\n removeKnowledgeBase,\n updateKnowledgeBase,\n signIn,\n signOut,\n } = useKnowledgeBaseSession();\n const [showAddForm, setShowAddForm] = useState(false);\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 useEffect(() => {\n if (knowledgeBases.length === 0) setShowAddForm(true);\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 = () => {\n setShowAddForm(true);\n setReauthKbId(null);\n setAddError(null);\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(kb => kb.host === host && kb.port === port);\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n addKnowledgeBase({ label, host, port, protocol, email, ...(gitBranch ? { gitBranch } : {}) }, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(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 try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(kb.host, kb.port, kb.protocol, kb.email, password);\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 = getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setShowAddForm(false);\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 = getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\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 <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label}</span>\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.host}:{kb.port}{kb.gitBranch ? ` · ${kb.gitBranch}` : ''}\n </span>\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 {showAddForm && (\n <LoginForm\n t={t}\n onSubmit={handleAdd}\n onCancel={() => setShowAddForm(false)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n />\n )}\n </div>\n\n {!showAddForm && (\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 useKnowledgeBaseSession,\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 /** Line numbers setting */\n showLineNumbers: boolean;\n /** Hover delay setting */\n hoverDelayMs: number;\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 * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\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 showLineNumbers,\n hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\n const { t: _t } = useTranslation();\n const { isAuthenticated } = useKnowledgeBaseSession();\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 // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\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 showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["ArrowRightStartOnRectangleIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CheckIcon","PlusIcon","FALLBACK_AVATAR","UserPanel","_t","useTranslation","k","p","displayName","avatarUrl","userDomain","isAdmin","isModerator","activeKnowledgeBase","signOut","useKnowledgeBaseSession","apiClient","useApiClient","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","STATUS_COLORS","STATUS_KEYS","StatusDot","status","LoginForm","t","onSubmit","onCancel","error","isSubmitting","autoFocus","pulsing","initialHost","initialPort","initialEmail","host","setHost","port","setPort","protocol","setProtocol","defaultProtocol","email","setEmail","password","setPassword","handleHostChange","newHost","e","isValidHostname","XMarkIcon","ReauthForm","kb","authenticateWithBackend","emailStr","origin","client","SemiontApiClient","baseUrl","EventBus","authResult","makeEmail","token","refreshToken","label","gitBranch","accessToken","KnowledgeBasePanel","knowledgeBases","setActiveKnowledgeBase","addKnowledgeBase","removeKnowledgeBase","updateKnowledgeBase","signIn","showAddForm","setShowAddForm","addError","setAddError","addSubmitting","setAddSubmitting","reauthKbId","setReauthKbId","reauthError","setReauthError","reauthSubmitting","setReauthSubmitting","confirmRemoveKbId","setConfirmRemoveKbId","setTick","useEffect","interval","openAddForm","handleAdd","existing","err","handleReauth","kbId","handleKbClick","getKbSessionStatus","isActive","isReauthing","TrashIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","isAuthenticated","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1,2 +0,0 @@
1
- import{u as P,j as k}from"./query-B6BuIB0M.js";import{r as u}from"./vendor-DJo4KD8w.js";import{f as D,g as E,h as N,i as S,z as j,B as F,b as Q,T as w}from"./index-C5oI0kaf.js";import{T as q}from"./ToolbarPanels-CfaOVIc9.js";import{u as B}from"./i18n-BbpF47i1.js";import"./routing-Cm_oCwum.js";import"./XMarkIcon-KMKD47CF.js";function G(){const{t:d}=B(),e=(s,r)=>d(`AdminUsers.${s}`,r),o=P(),{activePanel:m}=D(),{theme:c,setTheme:i}=E(),{showLineNumbers:U,toggleLineNumbers:l}=N(),g=u.useCallback(({theme:s})=>{i(s)},[i]),h=u.useCallback(()=>{l()},[l]);S({"settings:theme-changed":g,"settings:line-numbers-toggled":h});const t=j(),{data:n,isLoading:p}=t.users.list.useQuery(),{data:a,isLoading:v}=t.users.stats.useQuery(),C=t.users.update.useMutation(),b=(n==null?void 0:n.users)??[],y=(a==null?void 0:a.stats)??null,A=async(s,r)=>{try{await C.mutateAsync({id:s,data:r}),o.invalidateQueries({queryKey:["admin.users.list"]}),o.invalidateQueries({queryKey:["admin.users.stats"]})}catch(T){console.error("Failed to update user:",T)}},L=async s=>{console.warn("Delete user not implemented:",s),alert("Delete user functionality is not currently available")},x=()=>{console.log("Add user clicked")},f=()=>{console.log("Export users clicked")};return k.jsx(F,{users:b,userStats:y,isLoadingUsers:p,isLoadingStats:v,onUpdateUser:A,onDeleteUser:L,onAddUser:x,onExportUsers:f,theme:c,showLineNumbers:U,activePanel:m,translations:{title:e("title"),subtitle:e("subtitle"),addUser:e("addUser"),totalUsers:e("totalUsers"),activeUsers:e("activeUsers"),administrators:e("administrators"),recentUsers:e("recentUsers"),searchUsers:e("searchUsers"),searchPlaceholder:e("searchPlaceholder"),role:e("role"),allRoles:e("allRoles"),admin:e("admin"),user:e("user"),status:e("status"),allStatus:e("allStatus"),active:e("active"),inactive:e("inactive"),exportUsers:e("exportUsers"),loadingUsers:e("loadingUsers"),userColumn:e("userColumn"),domainColumn:e("domainColumn"),roleColumn:e("roleColumn"),statusColumn:e("statusColumn"),lastLoginColumn:e("lastLoginColumn"),joinedColumn:e("joinedColumn"),actionsColumn:e("actionsColumn"),noUsersFound:e("noUsersFound"),noUsersFoundDescription:e("noUsersFoundDescription"),noName:e("noName"),never:e("never"),removeAdmin:e("removeAdmin"),makeAdmin:e("makeAdmin"),deactivateUser:e("deactivateUser"),activateUser:e("activateUser"),deleteUser:e("deleteUser")},ToolbarPanels:q,Toolbar:w,buttonStyles:Q})}export{G as default};
2
- //# sourceMappingURL=client-CWwdB0xQ.js.map