solid-panes 5.0.0-1 → 5.1.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/README.md +67 -2
  2. package/dist/RDFXMLPane2.cjs.js.map +1 -1
  3. package/dist/RDFXMLPane2.esm.js.map +1 -1
  4. package/dist/_virtual/~icons/lucide/arrow-left.cjs.js.map +1 -1
  5. package/dist/_virtual/~icons/lucide/arrow-left.esm.js.map +1 -1
  6. package/dist/_virtual/~icons/lucide/cake.cjs.js +2 -0
  7. package/dist/_virtual/~icons/lucide/cake.cjs.js.map +1 -0
  8. package/dist/_virtual/~icons/lucide/cake.esm.js +11 -0
  9. package/dist/_virtual/~icons/lucide/cake.esm.js.map +1 -0
  10. package/dist/_virtual/~icons/lucide/camera.cjs.js +2 -0
  11. package/dist/_virtual/~icons/lucide/camera.cjs.js.map +1 -0
  12. package/dist/_virtual/~icons/lucide/camera.esm.js +11 -0
  13. package/dist/_virtual/~icons/lucide/camera.esm.js.map +1 -0
  14. package/dist/_virtual/~icons/lucide/circle-user-round.cjs.js +2 -0
  15. package/dist/_virtual/~icons/lucide/circle-user-round.cjs.js.map +1 -0
  16. package/dist/_virtual/~icons/lucide/circle-user-round.esm.js +11 -0
  17. package/dist/_virtual/~icons/lucide/circle-user-round.esm.js.map +1 -0
  18. package/dist/_virtual/~icons/lucide/ellipsis-vertical.cjs.js.map +1 -1
  19. package/dist/_virtual/~icons/lucide/ellipsis-vertical.esm.js.map +1 -1
  20. package/dist/_virtual/~icons/lucide/folder-open.cjs.js.map +1 -1
  21. package/dist/_virtual/~icons/lucide/folder-open.esm.js.map +1 -1
  22. package/dist/_virtual/~icons/lucide/folder.cjs.js.map +1 -1
  23. package/dist/_virtual/~icons/lucide/folder.esm.js.map +1 -1
  24. package/dist/_virtual/~icons/lucide/globe.cjs.js.map +1 -1
  25. package/dist/_virtual/~icons/lucide/globe.esm.js.map +1 -1
  26. package/dist/_virtual/~icons/lucide/help-circle.cjs.js.map +1 -1
  27. package/dist/_virtual/~icons/lucide/help-circle.esm.js.map +1 -1
  28. package/dist/_virtual/~icons/lucide/layout-dashboard.cjs.js.map +1 -1
  29. package/dist/_virtual/~icons/lucide/layout-dashboard.esm.js.map +1 -1
  30. package/dist/_virtual/~icons/lucide/lock-keyhole.cjs.js.map +1 -1
  31. package/dist/_virtual/~icons/lucide/lock-keyhole.esm.js.map +1 -1
  32. package/dist/_virtual/~icons/lucide/mail.cjs.js +2 -0
  33. package/dist/_virtual/~icons/lucide/mail.cjs.js.map +1 -0
  34. package/dist/_virtual/~icons/lucide/mail.esm.js +11 -0
  35. package/dist/_virtual/~icons/lucide/mail.esm.js.map +1 -0
  36. package/dist/_virtual/~icons/lucide/map-pin.cjs.js +2 -0
  37. package/dist/_virtual/~icons/lucide/map-pin.cjs.js.map +1 -0
  38. package/dist/_virtual/~icons/lucide/map-pin.esm.js +11 -0
  39. package/dist/_virtual/~icons/lucide/map-pin.esm.js.map +1 -0
  40. package/dist/_virtual/~icons/lucide/pencil.cjs.js.map +1 -1
  41. package/dist/_virtual/~icons/lucide/pencil.esm.js.map +1 -1
  42. package/dist/_virtual/~icons/lucide/phone.cjs.js +2 -0
  43. package/dist/_virtual/~icons/lucide/phone.cjs.js.map +1 -0
  44. package/dist/_virtual/~icons/lucide/phone.esm.js +11 -0
  45. package/dist/_virtual/~icons/lucide/phone.esm.js.map +1 -0
  46. package/dist/_virtual/~icons/lucide/settings-2.cjs.js.map +1 -1
  47. package/dist/_virtual/~icons/lucide/settings-2.esm.js.map +1 -1
  48. package/dist/_virtual/~icons/lucide/share-2.cjs.js.map +1 -1
  49. package/dist/_virtual/~icons/lucide/share-2.esm.js.map +1 -1
  50. package/dist/_virtual/~icons/lucide/user-round-cog.cjs.js.map +1 -1
  51. package/dist/_virtual/~icons/lucide/user-round-cog.esm.js.map +1 -1
  52. package/dist/_virtual/~icons/lucide/user-round-plus.cjs.js +2 -0
  53. package/dist/_virtual/~icons/lucide/user-round-plus.cjs.js.map +1 -0
  54. package/dist/_virtual/~icons/lucide/user-round-plus.esm.js +11 -0
  55. package/dist/_virtual/~icons/lucide/user-round-plus.esm.js.map +1 -0
  56. package/dist/_virtual/~icons/lucide/user.cjs.js.map +1 -1
  57. package/dist/_virtual/~icons/lucide/user.esm.js.map +1 -1
  58. package/dist/_virtual/~icons/lucide/users.cjs.js.map +1 -1
  59. package/dist/_virtual/~icons/lucide/users.esm.js.map +1 -1
  60. package/dist/_virtual/~icons/lucide/x.cjs.js +2 -0
  61. package/dist/_virtual/~icons/lucide/x.cjs.js.map +1 -0
  62. package/dist/_virtual/~icons/lucide/x.esm.js +11 -0
  63. package/dist/_virtual/~icons/lucide/x.esm.js.map +1 -0
  64. package/dist/audio/audioPane.cjs.js +1 -1
  65. package/dist/audio/audioPane.cjs.js.map +1 -1
  66. package/dist/audio/audioPane.esm.js +1 -5
  67. package/dist/audio/audioPane.esm.js.map +1 -1
  68. package/dist/classInstancePane.cjs.js.map +1 -1
  69. package/dist/classInstancePane.esm.js.map +1 -1
  70. package/dist/components/editor-card/EditorCard.cjs.js +1 -1
  71. package/dist/components/editor-card/EditorCard.cjs.js.map +1 -1
  72. package/dist/components/editor-card/EditorCard.esm.js +4 -7
  73. package/dist/components/editor-card/EditorCard.esm.js.map +1 -1
  74. package/dist/components/editor-card/EditorCard.styles.cjs.js.map +1 -1
  75. package/dist/components/editor-card/EditorCard.styles.esm.js.map +1 -1
  76. package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js +1 -1
  77. package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js.map +1 -1
  78. package/dist/components/file-explorer-header/FileExplorerHeader.esm.js +2 -2
  79. package/dist/components/file-explorer-header/FileExplorerHeader.esm.js.map +1 -1
  80. package/dist/components/file-explorer-header/FileExplorerHeader.styles.cjs.js.map +1 -1
  81. package/dist/components/file-explorer-header/FileExplorerHeader.styles.esm.js.map +1 -1
  82. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js +1 -1
  83. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js.map +1 -1
  84. package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js +3 -3
  85. package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js.map +1 -1
  86. package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.cjs.js.map +1 -1
  87. package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.esm.js.map +1 -1
  88. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js +1 -1
  89. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js.map +1 -1
  90. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js +2 -2
  91. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js.map +1 -1
  92. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.cjs.js.map +1 -1
  93. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.esm.js.map +1 -1
  94. package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js +5 -5
  95. package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js.map +1 -1
  96. package/dist/components/file-explorer-header/FileExplorerProvider.d.ts.map +1 -1
  97. package/dist/components/file-explorer-header/FileExplorerProvider.esm.js +97 -96
  98. package/dist/components/file-explorer-header/FileExplorerProvider.esm.js.map +1 -1
  99. package/dist/components/file-explorer-header/FileExplorerProvider.styles.cjs.js.map +1 -1
  100. package/dist/components/file-explorer-header/FileExplorerProvider.styles.esm.js.map +1 -1
  101. package/dist/components/header/Header.cjs.js +1 -1
  102. package/dist/components/header/Header.cjs.js.map +1 -1
  103. package/dist/components/header/Header.esm.js +2 -2
  104. package/dist/components/header/Header.esm.js.map +1 -1
  105. package/dist/components/header/Header.styles.cjs.js +1 -1
  106. package/dist/components/header/Header.styles.cjs.js.map +1 -1
  107. package/dist/components/header/Header.styles.esm.js +1 -1
  108. package/dist/components/header/Header.styles.esm.js.map +1 -1
  109. package/dist/components/navbar/Navbar.cjs.js +1 -1
  110. package/dist/components/navbar/Navbar.cjs.js.map +1 -1
  111. package/dist/components/navbar/Navbar.d.ts +2 -0
  112. package/dist/components/navbar/Navbar.d.ts.map +1 -1
  113. package/dist/components/navbar/Navbar.esm.js +2 -2
  114. package/dist/components/navbar/Navbar.esm.js.map +1 -1
  115. package/dist/components/navbar/Navbar.styles.cjs.js +1 -1
  116. package/dist/components/navbar/Navbar.styles.cjs.js.map +1 -1
  117. package/dist/components/navbar/Navbar.styles.esm.js +1 -1
  118. package/dist/components/navbar/Navbar.styles.esm.js.map +1 -1
  119. package/dist/components/profile-heading/ProfileHeading.cjs.js +95 -0
  120. package/dist/components/profile-heading/ProfileHeading.cjs.js.map +1 -0
  121. package/dist/components/profile-heading/ProfileHeading.d.ts +45 -0
  122. package/dist/components/profile-heading/ProfileHeading.d.ts.map +1 -0
  123. package/dist/components/profile-heading/ProfileHeading.esm.js +480 -0
  124. package/dist/components/profile-heading/ProfileHeading.esm.js.map +1 -0
  125. package/dist/components/profile-heading/ProfileHeading.styles.cjs.js +2 -0
  126. package/dist/components/profile-heading/ProfileHeading.styles.cjs.js.map +1 -0
  127. package/dist/components/profile-heading/ProfileHeading.styles.esm.js +7 -0
  128. package/dist/components/profile-heading/ProfileHeading.styles.esm.js.map +1 -0
  129. package/dist/components/profile-heading/editor/index.d.ts +3 -0
  130. package/dist/components/profile-heading/editor/index.d.ts.map +1 -0
  131. package/dist/components/profile-heading/editor/sections/contactInfo/types.d.ts +44 -0
  132. package/dist/components/profile-heading/editor/sections/contactInfo/types.d.ts.map +1 -0
  133. package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.cjs.js +297 -0
  134. package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.cjs.js.map +1 -0
  135. package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.d.ts +5 -0
  136. package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.d.ts.map +1 -0
  137. package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.esm.js +642 -0
  138. package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.esm.js.map +1 -0
  139. package/dist/components/profile-heading/editor/sections/heading/dateHelpers.cjs.js +2 -0
  140. package/dist/components/profile-heading/editor/sections/heading/dateHelpers.cjs.js.map +1 -0
  141. package/dist/components/profile-heading/editor/sections/heading/dateHelpers.d.ts +4 -0
  142. package/dist/components/profile-heading/editor/sections/heading/dateHelpers.d.ts.map +1 -0
  143. package/dist/components/profile-heading/editor/sections/heading/dateHelpers.esm.js +16 -0
  144. package/dist/components/profile-heading/editor/sections/heading/dateHelpers.esm.js.map +1 -0
  145. package/dist/components/profile-heading/editor/sections/heading/imageHelpers.cjs.js +2 -0
  146. package/dist/components/profile-heading/editor/sections/heading/imageHelpers.cjs.js.map +1 -0
  147. package/dist/components/profile-heading/editor/sections/heading/imageHelpers.d.ts +5 -0
  148. package/dist/components/profile-heading/editor/sections/heading/imageHelpers.d.ts.map +1 -0
  149. package/dist/components/profile-heading/editor/sections/heading/imageHelpers.esm.js +76 -0
  150. package/dist/components/profile-heading/editor/sections/heading/imageHelpers.esm.js.map +1 -0
  151. package/dist/components/profile-heading/editor/sections/heading/imagePreview.cjs.js +19 -0
  152. package/dist/components/profile-heading/editor/sections/heading/imagePreview.cjs.js.map +1 -0
  153. package/dist/components/profile-heading/editor/sections/heading/imagePreview.d.ts +2 -0
  154. package/dist/components/profile-heading/editor/sections/heading/imagePreview.d.ts.map +1 -0
  155. package/dist/components/profile-heading/editor/sections/heading/imagePreview.esm.js +28 -0
  156. package/dist/components/profile-heading/editor/sections/heading/imagePreview.esm.js.map +1 -0
  157. package/dist/components/profile-heading/editor/sections/heading/mutations.cjs.js +2 -0
  158. package/dist/components/profile-heading/editor/sections/heading/mutations.cjs.js.map +1 -0
  159. package/dist/components/profile-heading/editor/sections/heading/mutations.d.ts +4 -0
  160. package/dist/components/profile-heading/editor/sections/heading/mutations.d.ts.map +1 -0
  161. package/dist/components/profile-heading/editor/sections/heading/mutations.esm.js +151 -0
  162. package/dist/components/profile-heading/editor/sections/heading/mutations.esm.js.map +1 -0
  163. package/dist/components/profile-heading/editor/sections/heading/types.d.ts +34 -0
  164. package/dist/components/profile-heading/editor/sections/heading/types.d.ts.map +1 -0
  165. package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.cjs.js +2 -0
  166. package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.cjs.js.map +1 -0
  167. package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.d.ts +7 -0
  168. package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.d.ts.map +1 -0
  169. package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.esm.js +20 -0
  170. package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.esm.js.map +1 -0
  171. package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.cjs.js +2 -0
  172. package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.cjs.js.map +1 -0
  173. package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.d.ts +3 -0
  174. package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.d.ts.map +1 -0
  175. package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.esm.js +11 -0
  176. package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.esm.js.map +1 -0
  177. package/dist/components/profile-heading/editor/sections/shared/phoneCountries.cjs.js +2 -0
  178. package/dist/components/profile-heading/editor/sections/shared/phoneCountries.cjs.js.map +1 -0
  179. package/dist/components/profile-heading/editor/sections/shared/phoneCountries.d.ts +20 -0
  180. package/dist/components/profile-heading/editor/sections/shared/phoneCountries.d.ts.map +1 -0
  181. package/dist/components/profile-heading/editor/sections/shared/phoneCountries.esm.js +1291 -0
  182. package/dist/components/profile-heading/editor/sections/shared/phoneCountries.esm.js.map +1 -0
  183. package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.cjs.js +2 -0
  184. package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.cjs.js.map +1 -0
  185. package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.d.ts +45 -0
  186. package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.d.ts.map +1 -0
  187. package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.esm.js +211 -0
  188. package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.esm.js.map +1 -0
  189. package/dist/components/profile-heading/editor/sections/shared/rowState.cjs.js +2 -0
  190. package/dist/components/profile-heading/editor/sections/shared/rowState.cjs.js.map +1 -0
  191. package/dist/components/profile-heading/editor/sections/shared/rowState.d.ts +21 -0
  192. package/dist/components/profile-heading/editor/sections/shared/rowState.d.ts.map +1 -0
  193. package/dist/components/profile-heading/editor/sections/shared/rowState.esm.js +18 -0
  194. package/dist/components/profile-heading/editor/sections/shared/rowState.esm.js.map +1 -0
  195. package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.cjs.js +2 -0
  196. package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.cjs.js.map +1 -0
  197. package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.d.ts +5 -0
  198. package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.d.ts.map +1 -0
  199. package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.esm.js +18 -0
  200. package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.esm.js.map +1 -0
  201. package/dist/components/profile-heading/editor/sections/shared/types.d.ts +31 -0
  202. package/dist/components/profile-heading/editor/sections/shared/types.d.ts.map +1 -0
  203. package/dist/components/profile-heading/editor/textUtils.cjs.js +2 -0
  204. package/dist/components/profile-heading/editor/textUtils.cjs.js.map +1 -0
  205. package/dist/components/profile-heading/editor/textUtils.d.ts +6 -0
  206. package/dist/components/profile-heading/editor/textUtils.d.ts.map +1 -0
  207. package/dist/components/profile-heading/editor/textUtils.esm.js +26 -0
  208. package/dist/components/profile-heading/editor/textUtils.esm.js.map +1 -0
  209. package/dist/components/profile-heading/editor/texts/buttonTexts.d.ts +9 -0
  210. package/dist/components/profile-heading/editor/texts/buttonTexts.d.ts.map +1 -0
  211. package/dist/components/profile-heading/editor/texts/dialogTexts.cjs.js +2 -0
  212. package/dist/components/profile-heading/editor/texts/dialogTexts.cjs.js.map +1 -0
  213. package/dist/components/profile-heading/editor/texts/dialogTexts.d.ts +14 -0
  214. package/dist/components/profile-heading/editor/texts/dialogTexts.d.ts.map +1 -0
  215. package/dist/components/profile-heading/editor/texts/dialogTexts.esm.js +6 -0
  216. package/dist/components/profile-heading/editor/texts/dialogTexts.esm.js.map +1 -0
  217. package/dist/components/profile-heading/editor/texts/messageTexts.cjs.js +2 -0
  218. package/dist/components/profile-heading/editor/texts/messageTexts.cjs.js.map +1 -0
  219. package/dist/components/profile-heading/editor/texts/messageTexts.d.ts +42 -0
  220. package/dist/components/profile-heading/editor/texts/messageTexts.d.ts.map +1 -0
  221. package/dist/components/profile-heading/editor/texts/messageTexts.esm.js +6 -0
  222. package/dist/components/profile-heading/editor/texts/messageTexts.esm.js.map +1 -0
  223. package/dist/components/profile-heading/editor/texts/profileTexts.d.ts +14 -0
  224. package/dist/components/profile-heading/editor/texts/profileTexts.d.ts.map +1 -0
  225. package/dist/components/profile-heading/editor/texts/qrCodeTexts.d.ts +2 -0
  226. package/dist/components/profile-heading/editor/texts/qrCodeTexts.d.ts.map +1 -0
  227. package/dist/components/profile-heading/editor/texts.d.ts +6 -0
  228. package/dist/components/profile-heading/editor/texts.d.ts.map +1 -0
  229. package/dist/components/profile-heading/editor/ui/dialog.d.ts +41 -0
  230. package/dist/components/profile-heading/editor/ui/dialog.d.ts.map +1 -0
  231. package/dist/components/profile-heading/editor/ui/dialog2.cjs.js +17 -0
  232. package/dist/components/profile-heading/editor/ui/dialog2.cjs.js.map +1 -0
  233. package/dist/components/profile-heading/editor/ui/dialog2.esm.js +263 -0
  234. package/dist/components/profile-heading/editor/ui/dialog2.esm.js.map +1 -0
  235. package/dist/components/profile-heading/editor/ui/spinner.cjs.js +5 -0
  236. package/dist/components/profile-heading/editor/ui/spinner.cjs.js.map +1 -0
  237. package/dist/components/profile-heading/editor/ui/spinner.d.ts +3 -0
  238. package/dist/components/profile-heading/editor/ui/spinner.d.ts.map +1 -0
  239. package/dist/components/profile-heading/editor/ui/spinner.esm.js +12 -0
  240. package/dist/components/profile-heading/editor/ui/spinner.esm.js.map +1 -0
  241. package/dist/components/profile-heading/editor/utils/errorDisplay.cjs.js +2 -0
  242. package/dist/components/profile-heading/editor/utils/errorDisplay.cjs.js.map +1 -0
  243. package/dist/components/profile-heading/editor/utils/errorDisplay.d.ts +2 -0
  244. package/dist/components/profile-heading/editor/utils/errorDisplay.d.ts.map +1 -0
  245. package/dist/components/profile-heading/editor/utils/errorDisplay.esm.js +18 -0
  246. package/dist/components/profile-heading/editor/utils/errorDisplay.esm.js.map +1 -0
  247. package/dist/components/profile-heading/friendActions.cjs.js +2 -0
  248. package/dist/components/profile-heading/friendActions.cjs.js.map +1 -0
  249. package/dist/components/profile-heading/friendActions.d.ts +11 -0
  250. package/dist/components/profile-heading/friendActions.d.ts.map +1 -0
  251. package/dist/components/profile-heading/friendActions.esm.js +32 -0
  252. package/dist/components/profile-heading/friendActions.esm.js.map +1 -0
  253. package/dist/components/profile-heading/index.cjs.js +1 -0
  254. package/dist/components/profile-heading/index.d.ts +5 -0
  255. package/dist/components/profile-heading/index.d.ts.map +1 -0
  256. package/dist/components/profile-heading/index.esm.js +1 -0
  257. package/dist/components/profile-heading/profileHeadingData.cjs.js +2 -0
  258. package/dist/components/profile-heading/profileHeadingData.cjs.js.map +1 -0
  259. package/dist/components/profile-heading/profileHeadingData.d.ts +6 -0
  260. package/dist/components/profile-heading/profileHeadingData.d.ts.map +1 -0
  261. package/dist/components/profile-heading/profileHeadingData.esm.js +81 -0
  262. package/dist/components/profile-heading/profileHeadingData.esm.js.map +1 -0
  263. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js +1 -1
  264. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js.map +1 -1
  265. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js +2 -2
  266. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js.map +1 -1
  267. package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.cjs.js.map +1 -1
  268. package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.esm.js.map +1 -1
  269. package/dist/dashboard/basicPreferences.cjs.js.map +1 -1
  270. package/dist/dashboard/basicPreferences.esm.js.map +1 -1
  271. package/dist/dashboard/dashboardPane.cjs.js.map +1 -1
  272. package/dist/dashboard/dashboardPane.esm.js.map +1 -1
  273. package/dist/dashboard/homepage.cjs.js.map +1 -1
  274. package/dist/dashboard/homepage.esm.js.map +1 -1
  275. package/dist/dashboard/ontologyData.cjs.js.map +1 -1
  276. package/dist/dashboard/ontologyData.esm.js.map +1 -1
  277. package/dist/dashboard/preferencesFormText.cjs.js.map +1 -1
  278. package/dist/dashboard/preferencesFormText.esm.js.map +1 -1
  279. package/dist/dataContentPane2.cjs.js.map +1 -1
  280. package/dist/dataContentPane2.esm.js.map +1 -1
  281. package/dist/defaultPane2.cjs.js.map +1 -1
  282. package/dist/defaultPane2.esm.js.map +1 -1
  283. package/dist/dokieli/dokieliPane.cjs.js.map +1 -1
  284. package/dist/dokieli/dokieliPane.esm.js.map +1 -1
  285. package/dist/dokieli/new.cjs.js.map +1 -1
  286. package/dist/dokieli/new.esm.js.map +1 -1
  287. package/dist/form/pane.cjs.js.map +1 -1
  288. package/dist/form/pane.esm.js.map +1 -1
  289. package/dist/home/homePane.cjs.js.map +1 -1
  290. package/dist/home/homePane.esm.js.map +1 -1
  291. package/dist/humanReadablePane2.cjs.js.map +1 -1
  292. package/dist/humanReadablePane2.esm.js.map +1 -1
  293. package/dist/icons/folder.cjs.js.map +1 -1
  294. package/dist/icons/folder.esm.js.map +1 -1
  295. package/dist/icons/friends.cjs.js.map +1 -1
  296. package/dist/icons/friends.esm.js.map +1 -1
  297. package/dist/icons/person.cjs.js.map +1 -1
  298. package/dist/icons/person.esm.js.map +1 -1
  299. package/dist/imagePane2.cjs.js.map +1 -1
  300. package/dist/imagePane2.esm.js.map +1 -1
  301. package/dist/index.cjs.js +1 -1
  302. package/dist/index.cjs.js.map +1 -1
  303. package/dist/index.d.ts +2 -1
  304. package/dist/index.d.ts.map +1 -1
  305. package/dist/index.esm.js +15 -14
  306. package/dist/index.esm.js.map +1 -1
  307. package/dist/internal/internalPane2.cjs.js +1 -1
  308. package/dist/internal/internalPane2.cjs.js.map +1 -1
  309. package/dist/internal/internalPane2.esm.js +2 -5
  310. package/dist/internal/internalPane2.esm.js.map +1 -1
  311. package/dist/mainPage/header.cjs.js +1 -1
  312. package/dist/mainPage/header.cjs.js.map +1 -1
  313. package/dist/mainPage/header.d.ts +2 -2
  314. package/dist/mainPage/header.d.ts.map +1 -1
  315. package/dist/mainPage/header.esm.js +48 -44
  316. package/dist/mainPage/header.esm.js.map +1 -1
  317. package/dist/mainPage/index.cjs.js +1 -1
  318. package/dist/mainPage/index.cjs.js.map +1 -1
  319. package/dist/mainPage/index.d.ts.map +1 -1
  320. package/dist/mainPage/index.esm.js +27 -21
  321. package/dist/mainPage/index.esm.js.map +1 -1
  322. package/dist/mainPage/navbar.cjs.js +1 -1
  323. package/dist/mainPage/navbar.cjs.js.map +1 -1
  324. package/dist/mainPage/navbar.d.ts +3 -2
  325. package/dist/mainPage/navbar.d.ts.map +1 -1
  326. package/dist/mainPage/navbar.esm.js +77 -42
  327. package/dist/mainPage/navbar.esm.js.map +1 -1
  328. package/dist/mainPage/navigation.cjs.js +2 -0
  329. package/dist/mainPage/navigation.cjs.js.map +1 -0
  330. package/dist/mainPage/navigation.d.ts +6 -0
  331. package/dist/mainPage/navigation.d.ts.map +1 -0
  332. package/dist/mainPage/navigation.esm.js +22 -0
  333. package/dist/mainPage/navigation.esm.js.map +1 -0
  334. package/dist/mainPage/profileHeading.d.ts +5 -0
  335. package/dist/mainPage/profileHeading.d.ts.map +1 -0
  336. package/dist/mainPage/profileHeading2.cjs.js +2 -0
  337. package/dist/mainPage/profileHeading2.cjs.js.map +1 -0
  338. package/dist/mainPage/profileHeading2.esm.js +158 -0
  339. package/dist/mainPage/profileHeading2.esm.js.map +1 -0
  340. package/dist/n3Pane2.cjs.js.map +1 -1
  341. package/dist/n3Pane2.esm.js.map +1 -1
  342. package/dist/navigation/browserEvents.cjs.js +2 -0
  343. package/dist/navigation/browserEvents.cjs.js.map +1 -0
  344. package/dist/navigation/browserEvents.d.ts +15 -0
  345. package/dist/navigation/browserEvents.d.ts.map +1 -0
  346. package/dist/navigation/browserEvents.esm.js +32 -0
  347. package/dist/navigation/browserEvents.esm.js.map +1 -0
  348. package/dist/navigation/chrome.cjs.js +2 -0
  349. package/dist/navigation/chrome.cjs.js.map +1 -0
  350. package/dist/navigation/chrome.d.ts +69 -0
  351. package/dist/navigation/chrome.d.ts.map +1 -0
  352. package/dist/navigation/chrome.esm.js +43 -0
  353. package/dist/navigation/chrome.esm.js.map +1 -0
  354. package/dist/navigation/controller.cjs.js +2 -0
  355. package/dist/navigation/controller.cjs.js.map +1 -0
  356. package/dist/navigation/controller.d.ts +51 -0
  357. package/dist/navigation/controller.d.ts.map +1 -0
  358. package/dist/navigation/controller.esm.js +45 -0
  359. package/dist/navigation/controller.esm.js.map +1 -0
  360. package/dist/navigation/events.cjs.js +2 -0
  361. package/dist/navigation/events.cjs.js.map +1 -0
  362. package/dist/navigation/events.d.ts +17 -0
  363. package/dist/navigation/events.d.ts.map +1 -0
  364. package/dist/navigation/events.esm.js +18 -0
  365. package/dist/navigation/events.esm.js.map +1 -0
  366. package/dist/navigation/navbarVisibility.cjs.js +2 -0
  367. package/dist/navigation/navbarVisibility.cjs.js.map +1 -0
  368. package/dist/navigation/navbarVisibility.d.ts +5 -0
  369. package/dist/navigation/navbarVisibility.d.ts.map +1 -0
  370. package/dist/navigation/navbarVisibility.esm.js +26 -0
  371. package/dist/navigation/navbarVisibility.esm.js.map +1 -0
  372. package/dist/navigation/options.cjs.js +2 -0
  373. package/dist/navigation/options.cjs.js.map +1 -0
  374. package/dist/navigation/options.d.ts +16 -0
  375. package/dist/navigation/options.d.ts.map +1 -0
  376. package/dist/navigation/options.esm.js +8 -0
  377. package/dist/navigation/options.esm.js.map +1 -0
  378. package/dist/navigation/podContext.cjs.js +2 -0
  379. package/dist/navigation/podContext.cjs.js.map +1 -0
  380. package/dist/navigation/podContext.d.ts +21 -0
  381. package/dist/navigation/podContext.d.ts.map +1 -0
  382. package/dist/navigation/podContext.esm.js +62 -0
  383. package/dist/navigation/podContext.esm.js.map +1 -0
  384. package/dist/navigation/state.cjs.js +2 -0
  385. package/dist/navigation/state.cjs.js.map +1 -0
  386. package/dist/navigation/state.d.ts +40 -0
  387. package/dist/navigation/state.d.ts.map +1 -0
  388. package/dist/navigation/state.esm.js +41 -0
  389. package/dist/navigation/state.esm.js.map +1 -0
  390. package/dist/outline/context.cjs.js.map +1 -1
  391. package/dist/outline/context.esm.js.map +1 -1
  392. package/dist/outline/manager2.cjs.js +1 -1
  393. package/dist/outline/manager2.cjs.js.map +1 -1
  394. package/dist/outline/manager2.esm.js +388 -354
  395. package/dist/outline/manager2.esm.js.map +1 -1
  396. package/dist/outline/outlineIcons.cjs.js.map +1 -1
  397. package/dist/outline/outlineIcons.esm.js.map +1 -1
  398. package/dist/outline/propertyViews.cjs.js.map +1 -1
  399. package/dist/outline/propertyViews.esm.js.map +1 -1
  400. package/dist/outline/queryByExample.cjs.js.map +1 -1
  401. package/dist/outline/queryByExample.esm.js.map +1 -1
  402. package/dist/outline/userInput.cjs.js +1 -1
  403. package/dist/outline/userInput.cjs.js.map +1 -1
  404. package/dist/outline/userInput.esm.js +12 -13
  405. package/dist/outline/userInput.esm.js.map +1 -1
  406. package/dist/outline/viewAsImage.cjs.js.map +1 -1
  407. package/dist/outline/viewAsImage.esm.js.map +1 -1
  408. package/dist/outline/viewAsMbox.cjs.js.map +1 -1
  409. package/dist/outline/viewAsMbox.esm.js.map +1 -1
  410. package/dist/pad/padPane2.cjs.js +1 -1
  411. package/dist/pad/padPane2.cjs.js.map +1 -1
  412. package/dist/pad/padPane2.esm.js +2 -6
  413. package/dist/pad/padPane2.esm.js.map +1 -1
  414. package/dist/playlist/playlistPane.cjs.js.map +1 -1
  415. package/dist/playlist/playlistPane.esm.js.map +1 -1
  416. package/dist/registerPanes.cjs.js.map +1 -1
  417. package/dist/registerPanes.esm.js.map +1 -1
  418. package/dist/schedule/formsForSchedule.cjs.js.map +1 -1
  419. package/dist/schedule/formsForSchedule.esm.js.map +1 -1
  420. package/dist/schedule/schedulePane2.cjs.js +1 -1
  421. package/dist/schedule/schedulePane2.cjs.js.map +1 -1
  422. package/dist/schedule/schedulePane2.esm.js +1 -5
  423. package/dist/schedule/schedulePane2.esm.js.map +1 -1
  424. package/dist/sharing/sharingPane.cjs.js.map +1 -1
  425. package/dist/sharing/sharingPane.esm.js.map +1 -1
  426. package/dist/slideshow/slideshowPane.cjs.js.map +1 -1
  427. package/dist/slideshow/slideshowPane.esm.js.map +1 -1
  428. package/dist/social/editProfileDetails.cjs.js +1 -1
  429. package/dist/social/editProfileDetails.cjs.js.map +1 -1
  430. package/dist/social/editProfileDetails.esm.js +0 -2
  431. package/dist/social/editProfileDetails.esm.js.map +1 -1
  432. package/dist/social/icons.cjs.js +4 -4
  433. package/dist/social/icons.cjs.js.map +1 -1
  434. package/dist/social/icons.esm.js +5 -5
  435. package/dist/social/icons.esm.js.map +1 -1
  436. package/dist/social/socialPane.d.ts +0 -1
  437. package/dist/social/socialPane.d.ts.map +1 -1
  438. package/dist/social/socialPane2.cjs.js +3 -3
  439. package/dist/social/socialPane2.cjs.js.map +1 -1
  440. package/dist/social/socialPane2.esm.js +97 -154
  441. package/dist/social/socialPane2.esm.js.map +1 -1
  442. package/dist/social/socialSections.cjs.js +1 -1
  443. package/dist/social/socialSections.cjs.js.map +1 -1
  444. package/dist/social/socialSections.d.ts +2 -1
  445. package/dist/social/socialSections.d.ts.map +1 -1
  446. package/dist/social/socialSections.esm.js +54 -129
  447. package/dist/social/socialSections.esm.js.map +1 -1
  448. package/dist/social/triage.cjs.js.map +1 -1
  449. package/dist/social/triage.esm.js.map +1 -1
  450. package/dist/tabbed/tabbedPane.cjs.js.map +1 -1
  451. package/dist/tabbed/tabbedPane.esm.js.map +1 -1
  452. package/dist/tableViewPane.cjs.js.map +1 -1
  453. package/dist/tableViewPane.esm.js.map +1 -1
  454. package/dist/transaction/pane.cjs.js.map +1 -1
  455. package/dist/transaction/pane.esm.js +1 -1
  456. package/dist/transaction/pane.esm.js.map +1 -1
  457. package/dist/transaction/period.cjs.js.map +1 -1
  458. package/dist/transaction/period.esm.js.map +1 -1
  459. package/dist/trip/tripPane.cjs.js.map +1 -1
  460. package/dist/trip/tripPane.esm.js.map +1 -1
  461. package/dist/trustedApplications/trustedApplications.dom.cjs.js.map +1 -1
  462. package/dist/trustedApplications/trustedApplications.dom.esm.js.map +1 -1
  463. package/dist/trustedApplications/trustedApplications.utils.cjs.js.map +1 -1
  464. package/dist/trustedApplications/trustedApplications.utils.esm.js.map +1 -1
  465. package/dist/trustedApplications/trustedApplications.view.cjs.js.map +1 -1
  466. package/dist/trustedApplications/trustedApplications.view.esm.js.map +1 -1
  467. package/dist/types.d.ts +3 -0
  468. package/dist/types.d.ts.map +1 -0
  469. package/dist/ui/pane.cjs.js +1 -1
  470. package/dist/ui/pane.cjs.js.map +1 -1
  471. package/dist/ui/pane.esm.js +2 -5
  472. package/dist/ui/pane.esm.js.map +1 -1
  473. package/dist/utils/paneUtils.cjs.js +1 -1
  474. package/dist/utils/paneUtils.cjs.js.map +1 -1
  475. package/dist/utils/paneUtils.esm.js +4 -4
  476. package/dist/utils/paneUtils.esm.js.map +1 -1
  477. package/dist/utils/podUtils.cjs.js.map +1 -1
  478. package/dist/utils/podUtils.esm.js.map +1 -1
  479. package/dist/utils/viewerUtils.cjs.js +2 -0
  480. package/dist/utils/viewerUtils.cjs.js.map +1 -0
  481. package/dist/utils/viewerUtils.d.ts +5 -0
  482. package/dist/utils/viewerUtils.d.ts.map +1 -0
  483. package/dist/utils/viewerUtils.esm.js +13 -0
  484. package/dist/utils/viewerUtils.esm.js.map +1 -0
  485. package/dist/utils/webIdUtils.cjs.js +1 -1
  486. package/dist/utils/webIdUtils.cjs.js.map +1 -1
  487. package/dist/utils/webIdUtils.d.ts +1 -0
  488. package/dist/utils/webIdUtils.d.ts.map +1 -1
  489. package/dist/utils/webIdUtils.esm.js +23 -19
  490. package/dist/utils/webIdUtils.esm.js.map +1 -1
  491. package/dist/versionInfo.cjs.js +1 -1
  492. package/dist/versionInfo.cjs.js.map +1 -1
  493. package/dist/versionInfo.esm.js +11 -11
  494. package/dist/versionInfo.esm.js.map +1 -1
  495. package/dist/video/videoPane.cjs.js.map +1 -1
  496. package/dist/video/videoPane.esm.js.map +1 -1
  497. package/package.json +15 -14
@@ -1 +1 @@
1
- {"version":3,"file":"socialPane2.cjs.js","names":[],"sources":["../../src/social/socialPane.ts"],"sourcesContent":["/* Social Pane\n **\n ** This outline pane provides social network functions\n ** Using for example the FOAF ontology.\n ** Goal: A *distributed* version of facebook, advogato, etc etc\n ** - Similarly easy user interface, but data storage distributed\n ** - Read and write both user-private (address book) and public data clearly\n ** -- todo: use common code to get username and load profile and set 'me'\n */\n\nimport './socialPane.css'\nimport { icons, utils, ns, log, widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, Statement } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { locationIcon } from './icons'\nimport {\n createAllFriendsSection,\n createHeaderSection,\n FriendRowRenderers,\n createMutualSection,\n createRequestsSection,\n HeaderControls,\n SocialHeaderElement\n} from './socialSections'\nimport type { ViewerMode } from './socialSections'\nimport { FriendshipTriage, loadFriendshipTriage, triageFriends } from './triage'\n\nfunction applyEnvironmentAttributes (\n element: HTMLElement,\n context: DataBrowserContext\n): void {\n const layout = context.environment?.layout ?? 'desktop'\n const theme = context.environment?.theme ?? 'light'\n const inputMode = context.environment?.inputMode ?? 'pointer'\n\n element.classList.add('social-pane-host')\n element.dataset.layout = layout\n element.dataset.theme = theme\n element.dataset.inputMode = inputMode\n}\n\nexport const socialPane = {\n icon: icons.originalIconBase + 'foaf/foafTiny.gif',\n\n name: 'social',\n\n label: function (subject, context) {\n const kb = context.session.store\n const types = kb.findTypeURIs(subject)\n if (\n types[ns.foaf('Person').uri] ||\n types[ns.vcard('Individual').uri]\n ) {\n return 'Friends'\n }\n return null\n },\n global: false,\n\n render: function (s, context) {\n const dom = context.dom\n const common = function (x: NamedNode[], y: NamedNode[]) {\n // Find common members of two lists\n const both: NamedNode[] = []\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n if (y[j].sameTerm(x[i])) {\n both.push(y[j])\n break\n }\n }\n }\n return both\n }\n\n const uniqueNodes = function (nodes: NamedNode[]) {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n for (const node of nodes) {\n if (!node?.value || seen.has(node.value)) continue\n seen.add(node.value)\n unique.push(node)\n }\n return unique\n }\n\n const link = function (contents: Node, uri: string | null | undefined) {\n if (!uri) return contents\n const a = dom.createElement('a')\n a.setAttribute('href', uri)\n a.appendChild(contents)\n return a\n }\n\n const text = function (str: string) {\n return dom.createTextNode(str)\n }\n\n let refreshRelationshipUi = function () {}\n\n const buildCheckboxForm = function (\n lab: string | Node,\n statement: Statement,\n state: boolean,\n options: { disabled?: boolean, disabledTitle?: string } = {}\n ) {\n const f = dom.createElement('form')\n const label = dom.createElement('label')\n const input = dom.createElement('input')\n const tx = dom.createElement('span')\n tx.className = 'question'\n if (typeof lab === 'string') {\n tx.textContent = lab\n } else {\n tx.appendChild(lab)\n }\n input.setAttribute('type', 'checkbox')\n if (options.disabled) {\n input.disabled = true\n if (options.disabledTitle) {\n input.title = options.disabledTitle\n input.setAttribute('aria-label', options.disabledTitle)\n }\n }\n label.appendChild(tx)\n label.appendChild(input)\n f.appendChild(label)\n const boxHandler = function (this: HTMLInputElement, _e: Event) {\n if (this.checked) {\n try {\n outliner.UserInput.sparqler.insert_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while inserting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = false // rollback UI\n return\n }\n kb.add(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n })\n } catch (e) {\n log.error('Data write fails:' + e)\n log.alert('Data write fails:' + e)\n input.checked = false // rollback UI\n tx.className = 'question'\n }\n } else {\n try {\n outliner.UserInput.sparqler.delete_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while deleting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = true // Rollback UI\n } else {\n kb.removeMany(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n }\n })\n } catch (e) {\n log.alert('Delete fails:' + e)\n input.checked = true // Rollback UI\n // return\n }\n }\n }\n input.checked = state\n input.addEventListener('click', boxHandler, false)\n return f\n }\n\n // ////////// Body of render():\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const socialPane = dom.createElement('div')\n socialPane.classList.add('social-pane', 'flex-column', 'gap-xxs')\n applyEnvironmentAttributes(socialPane, context)\n const foaf = ns.foaf\n const vcard = ns.vcard\n const me = authn.currentUser()\n const meUri = me ? me.uri : null\n\n const thisIsYou = me && kb.sameThings(me, s)\n\n const knows = foaf('knows')\n // var givenName = kb.sym('http://www.w3.org/2000/10/swap/pim/contact#givenName')\n const familiar =\n kb.anyValue(s, foaf('givenname')) ||\n kb.anyValue(s, foaf('firstName')) ||\n kb.anyValue(s, foaf('nick')) ||\n kb.anyValue(s, foaf('name')) ||\n kb.anyValue(s, vcard('fn'))\n const friends = kb.each(s, knows)\n const uniqueFriends = uniqueNodes(friends as NamedNode[])\n const myFriends = me ? uniqueNodes(kb.each(me, foaf('knows')) as NamedNode[]) : []\n const mutualConnections = me && !thisIsYou\n ? uniqueNodes(common(uniqueFriends, myFriends)).filter(friend => !kb.sameThings(friend, me))\n : []\n const mutualFriendCount = me && !thisIsYou ? mutualConnections.length : null\n const viewerMode = getViewerMode(s, me)\n\n // Do I have a public profile document?\n let profile: NamedNode | null = null // This could be SPARQL { ?me foaf:primaryTopic [ a foaf:PersonalProfileDocument ] }\n let editable = false\n let incoming: boolean | NamedNode[] = false\n let outgoing: boolean | NamedNode[] = false\n\n const structure = socialPane.appendChild(dom.createElement('div'))\n structure.className = 'social-layout'\n const primary = structure.appendChild(dom.createElement('div'))\n primary.className = 'social-primary'\n\n const tabs = primary.appendChild(dom.createElement('div'))\n tabs.classList.add('social-primary__tabs', 'flex-center')\n tabs.setAttribute('role', 'tablist')\n tabs.setAttribute('aria-label', 'Social sections')\n\n const allFriendsTab = tabs.appendChild(dom.createElement('button'))\n allFriendsTab.className = 'social-primary__tab'\n allFriendsTab.type = 'button'\n allFriendsTab.id = 'social-tab-all-friends'\n allFriendsTab.textContent = 'All Friends'\n allFriendsTab.setAttribute('role', 'tab')\n allFriendsTab.setAttribute('aria-controls', 'social-panel-all-friends')\n allFriendsTab.setAttribute('aria-selected', 'true')\n allFriendsTab.tabIndex = 0\n\n const mutualTab = tabs.appendChild(dom.createElement('button'))\n mutualTab.className = 'social-primary__tab'\n mutualTab.type = 'button'\n mutualTab.id = 'social-tab-mutual'\n mutualTab.textContent = 'Mutual'\n mutualTab.setAttribute('role', 'tab')\n mutualTab.setAttribute('aria-controls', 'social-panel-mutual')\n mutualTab.setAttribute('aria-selected', 'false')\n mutualTab.tabIndex = -1\n\n if (me) {\n // The definition of FOAF personal profile document is ..\n const works = kb.each(undefined, foaf('primaryTopic'), me) // having me as primary topic\n let message = ''\n for (let i = 0; i < works.length; i++) {\n if (\n kb.whether(\n works[i],\n ns.rdf('type'),\n foaf('PersonalProfileDocument')\n )\n ) {\n const doc = works[i]\n editable = outliner.UserInput.sparqler.editable(doc.uri, kb)\n if (!editable) {\n message +=\n 'Your profile <' +\n utils.escapeForXML(doc.uri) +\n '> is not remotely editable.'\n } else {\n profile = doc\n break\n }\n }\n }\n\n /*\n if (!profile) {\n say(\n message + '\\nI couldn\\'t find your editable personal profile document.'\n )\n } else {\n say('Editing your profile ' + profile + '.')\n editable = outliner.UserInput.sparqler.editable(profile.uri, kb)\n }\n */\n\n if (thisIsYou) {\n // This is about me\n // pass... @@\n } else {\n // This is about someone else\n // My relationship with this person\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n outgoing = false\n const outgoingSt = kb.statementsMatching(cme, knows, s)\n if (outgoingSt.length) {\n outgoing = true\n if (!profile) profile = outgoingSt[0].why\n }\n } // About someone else\n } // me is defined\n // End of you and s\n\n const shouldShowHeaderAddFriendAction = (mode: ViewerMode) => {\n return mode === 'authenticated' && !thisIsYou && !outgoing\n }\n\n const canEditOwnedProfile = viewerMode === 'owner' && editable\n const canManageRelationship = viewerMode === 'authenticated' && !thisIsYou && editable && Boolean(profile)\n const canModifyFriendsTab = canEditOwnedProfile\n\n let headerControls: HeaderControls = {\n canEdit: canEditOwnedProfile,\n viewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(viewerMode)\n }\n\n const header = createHeaderSection(context, s, headerControls, {\n friendCount: uniqueFriends.length,\n mutualFriendCount,\n onSelectFriends: function () {\n setActivePanel('all-friends')\n },\n onSelectMutual: typeof mutualFriendCount === 'number'\n ? function () {\n setActivePanel('mutual')\n }\n : undefined\n }, function () {\n return selectProfileData(context, s)\n })\n header.classList.add('social-pane__header-section', 'flex-column')\n socialPane.prepend(header)\n\n // div.appendChild(dom.createTextNode(plural(friends.length, 'acquaintance') +'. '))\n\n // ///////////////////////////////////////////// Main block\n //\n // Should: Find the intersection and difference sets\n\n const friendDetailsByUri = new Map<string, FriendDetails>()\n\n const hydrateFriendDetailsCache = function (friendNodes: NamedNode[]) {\n const nextCache = new Map<string, FriendDetails>()\n\n friendNodes.forEach(friendNode => {\n if (!friendNode?.value || friendNode.value === s.value) return\n nextCache.set(friendNode.value, toFriendDetails(kb, friendNode))\n })\n\n friendDetailsByUri.clear()\n nextCache.forEach((value, key) => {\n friendDetailsByUri.set(key, value)\n })\n }\n\n hydrateFriendDetailsCache(uniqueFriends)\n\n const renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n\n const container = renderDom.createElement('div')\n const jobAndOrganization = [friend.jobTitle, friend.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = container.appendChild(renderDom.createElement('div'))\n jobLine.className = 'social-friend-job-org'\n jobLine.textContent = jobAndOrganization\n }\n\n if (friend.location) {\n const locationLine = container.appendChild(renderDom.createElement('div'))\n locationLine.className = 'social-friend-location'\n locationLine.innerHTML = `${locationIcon} ${friend.location}`\n }\n\n if (!container.childNodes.length) return null\n\n return container\n }\n\n const renderNameSuffix: FriendRowRenderers['renderNameSuffix'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n const pronouns = friend.pronouns\n if (!pronouns) return null\n\n const suffix = renderDom.createElement('span')\n suffix.className = 'social-friend-pronouns'\n suffix.textContent = `(${pronouns})`\n return suffix\n }\n\n let mutualSection = me && !thisIsYou\n ? createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n : {\n section: dom.createElement('section'),\n content: dom.createElement('div'),\n refreshMutualFriends: function () {}\n }\n\n let mutualFriends = mutualSection.section\n let mutualContent = mutualSection.content\n if (!mutualFriends.className) {\n mutualFriends.className = 'social-pane__mutual-friends social-primary__panel'\n mutualFriends.id = 'social-panel-mutual'\n mutualFriends.setAttribute('role', 'tabpanel')\n mutualFriends.setAttribute('aria-labelledby', 'social-tab-mutual')\n mutualContent.className = 'social-main social-main--mutual'\n mutualFriends.appendChild(mutualContent)\n }\n primary.appendChild(mutualFriends)\n\n const allFriendsSection = createAllFriendsSection({\n dom,\n subject: s,\n profile: canModifyFriendsTab ? profile : null,\n editable: canModifyFriendsTab,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n const allFriends = allFriendsSection.section\n const friendsList = allFriendsSection.friendsList\n primary.appendChild(allFriends)\n\n let requestsTriage: FriendshipTriage = triageFriends(kb, s)\n const requestsSection = createRequestsSection({\n dom,\n triage: requestsTriage,\n renderSupportingInfo,\n renderNameSuffix\n })\n const requestsPanel = requestsSection.section\n primary.appendChild(requestsPanel)\n\n const requestsTab = tabs.appendChild(dom.createElement('button'))\n requestsTab.className = 'social-primary__tab'\n requestsTab.type = 'button'\n requestsTab.id = 'social-tab-requests'\n requestsTab.textContent = 'Requests'\n requestsTab.setAttribute('role', 'tab')\n requestsTab.setAttribute('aria-controls', 'social-panel-requests')\n requestsTab.setAttribute('aria-selected', 'false')\n requestsTab.tabIndex = -1\n\n type SocialPanel = 'mutual' | 'all-friends' | 'requests'\n let activePanel: SocialPanel = 'all-friends'\n let showRequestsTab = viewerMode === 'owner'\n\n const setActivePanel = function (panel: SocialPanel) {\n activePanel = panel\n const showMutual = panel === 'mutual'\n const showAllFriends = panel === 'all-friends'\n const showRequests = showRequestsTab && panel === 'requests'\n mutualTab.classList.toggle('social-primary__tab--active', showMutual)\n mutualTab.setAttribute('aria-selected', String(showMutual))\n mutualTab.tabIndex = showMutual ? 0 : -1\n\n allFriendsTab.classList.toggle('social-primary__tab--active', showAllFriends)\n allFriendsTab.setAttribute('aria-selected', String(showAllFriends))\n allFriendsTab.tabIndex = showAllFriends ? 0 : -1\n\n requestsTab.classList.toggle('social-primary__tab--active', showRequests)\n requestsTab.setAttribute('aria-selected', String(showRequests))\n requestsTab.tabIndex = showRequests ? 0 : -1\n\n mutualFriends.classList.toggle('social-primary__panel--active', showMutual)\n mutualFriends.setAttribute('aria-hidden', String(!showMutual))\n\n allFriends.classList.toggle('social-primary__panel--active', showAllFriends)\n allFriends.setAttribute('aria-hidden', String(!showAllFriends))\n\n requestsPanel.classList.toggle('social-primary__panel--active', showRequests)\n requestsPanel.setAttribute('aria-hidden', String(!showRequests))\n requestsPanel.hidden = !showRequestsTab || !showRequests\n }\n const rebuildMutualSection = function () {\n if (!me || thisIsYou) return\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n\n const outgoingStatements = kb.statementsMatching(cme, knows, s)\n outgoing = outgoingStatements.length > 0\n\n const nextMutualSection = createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n mutualFriends.replaceWith(nextMutualSection.section)\n mutualSection = nextMutualSection\n mutualFriends = nextMutualSection.section\n mutualContent = nextMutualSection.content\n }\n\n refreshRelationshipUi = function () {\n rebuildMutualSection()\n headerControls = {\n ...headerControls,\n showAddFriendAction: shouldShowHeaderAddFriendAction(headerControls.viewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n requestsTriage = triageFriends(kb, s)\n requestsSection.refreshRequests(requestsTriage)\n setActivePanel(activePanel)\n }\n\n setActivePanel('all-friends')\n\n const applyViewerMode = function (mode: ViewerMode) {\n const showMutualTab = mode === 'authenticated' && !thisIsYou\n showRequestsTab = mode === 'owner'\n mutualTab.hidden = !showMutualTab\n requestsTab.hidden = !showRequestsTab\n if (!showRequestsTab && activePanel === 'requests') {\n setActivePanel('all-friends')\n return\n }\n setActivePanel('all-friends')\n }\n\n mutualTab.addEventListener('click', function () {\n setActivePanel('mutual')\n })\n\n allFriendsTab.addEventListener('click', function () {\n setActivePanel('all-friends')\n })\n\n requestsTab.addEventListener('click', function () {\n setActivePanel('requests')\n })\n\n const refreshFriendsList = function () {\n const refresh = (friendsList as HTMLTableElement & { refresh?: () => void }).refresh\n if (typeof refresh !== 'function') return\n\n refresh.call(friendsList)\n }\n\n const refreshMutualFriends = function () {\n mutualSection.refreshMutualFriends()\n }\n\n ;(async () => {\n try {\n for await (const streamedFriends of streamFriends(context, s)) {\n friendDetailsByUri.clear()\n streamedFriends.forEach(friend => {\n friendDetailsByUri.set(friend.url, friend)\n })\n refreshFriendsList()\n refreshMutualFriends()\n }\n } catch {\n // Keep the initial snapshot if async friend loading fails.\n }\n })()\n\n ;(async () => {\n try {\n requestsTriage = await loadFriendshipTriage(context, s)\n requestsSection.refreshRequests(requestsTriage)\n refreshFriendsList()\n refreshMutualFriends()\n } catch {\n // Keep the initial requests snapshot if additional loading fails.\n }\n })()\n\n // Older triage logic is preserved below as a reusable data helper.\n\n applyViewerMode('anonymous')\n\n authn.checkUser()\n .then(webId => {\n const confirmedViewerMode = getViewerMode(s, webId)\n applyViewerMode(confirmedViewerMode)\n const confirmedCanEditOwnedProfile = confirmedViewerMode === 'owner' && editable\n headerControls = {\n ...headerControls,\n canEdit: confirmedCanEditOwnedProfile,\n viewerMode: confirmedViewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(confirmedViewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n .catch(() => {\n applyViewerMode('anonymous')\n headerControls = {\n ...headerControls,\n canEdit: false,\n viewerMode: 'anonymous',\n showAddFriendAction: false\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n\n return socialPane\n } // render()\n} //\n// ends\n// ***************** Social Pane Selectors **********/\n/* Should move to another file, but will leave for now */\n/* Will create a social pane folder or maybe repo later */\n\nconst FRIEND_BATCH_SIZE = 3\n\nexport interface ProfileDetails {\n url: string\n imageUrl?: string\n name?: string\n nickname?: string\n jobTitle?: string\n organization?: string\n location?: string | null\n pronouns?: string\n birthdate?: string\n}\n\nexport interface FriendDetails extends ProfileDetails {\n subjectNode: NamedNode\n}\n\n/* pronounsAsText and formatLocation were copied from HeadingSection selectors */\nexport function pronounsAsText (store: LiveStore, subject: NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation (countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction toFriendDetails (store: any, friendNode: NamedNode): FriendDetails {\n const name =\n store.anyValue(friendNode, ns.vcard('fn')) ||\n store.anyValue(friendNode, ns.foaf('name')) ||\n null\n const nickname =\n store.anyValue(friendNode, ns.vcard('nickname')) ||\n store.anyValue(friendNode, ns.foaf('nick')) ||\n null\n const dateOfBirth = store.anyValue(friendNode, ns.vcard('bday')) || null\n const imageSrc = widgets.findImage(friendNode)\n const jobTitle = store.anyValue(friendNode, ns.vcard('role')) || null\n const orgName = store.anyValue(friendNode, ns.vcard('organization-name')) || null\n const primaryAddressEntryNode = store.any(friendNode, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : null\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, friendNode)\n\n return {\n url: friendNode.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns,\n subjectNode: friendNode\n }\n}\n\nexport async function * streamFriends (\n context: DataBrowserContext,\n subject: NamedNode,\n batchSize = FRIEND_BATCH_SIZE\n): AsyncGenerator<FriendDetails[], void, void> {\n const store = context.session.store\n const fetcher = (store as any)?.fetcher\n\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with whatever is already in the store.\n }\n }\n\n const seen = new Set<string>()\n const friendNodes = store.each(subject, ns.foaf('knows'), null, subject.doc())\n const uniqueFriendNodes: NamedNode[] = []\n\n for (const friendNode of friendNodes) {\n const key = friendNode?.value\n if (!key || seen.has(key) || subject.value === key) continue\n seen.add(key)\n uniqueFriendNodes.push(friendNode as NamedNode)\n }\n\n const friends: FriendDetails[] = []\n\n for (const friendNode of uniqueFriendNodes) {\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(friendNode.doc())\n } catch {\n // Keep partial friend data when one linked document fails to load.\n }\n }\n\n friends.push(toFriendDetails(store, friendNode))\n\n if (friends.length % batchSize === 0) {\n yield [...friends]\n }\n }\n\n if (friends.length > 0 && friends.length % batchSize !== 0) {\n yield [...friends]\n }\n}\n\nexport async function extractFriends (context: DataBrowserContext, subject: NamedNode): Promise<FriendDetails[] | null> {\n let latestFriends: FriendDetails[] | null = null\n\n for await (const friends of streamFriends(context, subject)) {\n latestFriends = friends\n }\n\n return latestFriends\n}\n\nexport function selectProfileData (context: DataBrowserContext, subject: NamedNode): ProfileDetails | null {\n const store = context.session.store\n\n const name =\n store.anyValue(subject, ns.vcard('fn')) ||\n store.anyValue(subject, ns.foaf('name')) ||\n undefined\n const nickname =\n store.anyValue(subject, ns.vcard('nickname')) ||\n store.anyValue(subject, ns.foaf('nick')) ||\n undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : undefined\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : undefined\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, subject)\n return {\n url: subject.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns\n }\n}\n\nexport type { ViewerMode } from './socialSections'\n\nfunction getViewerMode (subject: NamedNode, currentUser: unknown = authn.currentUser()): ViewerMode {\n const currentUserUri =\n typeof currentUser === 'string'\n ? currentUser\n : typeof currentUser === 'object' && currentUser !== null\n ? ((currentUser as { value?: string, uri?: string }).value ||\n (currentUser as { value?: string, uri?: string }).uri ||\n null)\n : null\n let mode: ViewerMode = 'anonymous'\n if (currentUserUri === subject.value) mode = 'owner'\n if (currentUserUri && currentUserUri !== subject.value) mode = 'authenticated'\n return mode\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"socialPane2.cjs.js","names":["icons","ns","authn","getViewerRelation","utils","locationIcon","createMutualSection","createAllFriendsSection","triageFriends","createRequestsSection","loadFriendshipTriage","widgets","require_icons","require_socialSections","require_viewerUtils","require_triage","solid_ui","solid_logic","applyEnvironmentAttributes","layout","context","theme","inputMode","element","socialPane","types","subject","dom","common","both","i","x","j","y","uniqueNodes","seen","unique","node","nodes","link","uri","contents","a","text","str","refreshRelationshipUi","buildCheckboxForm","f","label","input","tx","lab","options","state","outliner","statement","success","kb","errorBody","foaf","vcard","me","meUri","thisIsYou","knows","familiar","uniqueFriends","myFriends","mutualConnections","friend","viewerMode","profile","editable","incoming","outgoing","structure","primary","tabs","allFriendsTab","mutualTab","works","message","doc","cme","outgoingSt","canEditOwnedProfile","canManageRelationship","canModifyFriendsTab","friendDetailsByUri","nextCache","friendNodes","friendNode","toFriendDetails","key","value","renderSupportingInfo","target","container","renderDom","jobAndOrganization","jobLine","locationLine","renderNameSuffix","pronouns","suffix","mutualSection","mutualFriends","mutualContent","allFriendsSection","allFriends","friendsList","requestsTriage","requestsSection","requestsPanel","requestsTab","activePanel","showRequestsTab","setActivePanel","panel","showMutual","showAllFriends","showRequests","rebuildMutualSection","nextMutualSection","applyViewerMode","showMutualTab","mode","refreshFriendsList","refresh","refreshMutualFriends","streamedFriends","streamFriends","confirmedViewerMode","webId","FRIEND_BATCH_SIZE","pronounsAsText","store","them","formatLocation","countryName","locality","name","nickname","dateOfBirth","imageSrc","jobTitle","orgName","address","location","fetcher","uniqueFriendNodes","friends","batchSize"],"sources":["../../src/social/socialPane.ts"],"sourcesContent":["/* Social Pane\n **\n ** This outline pane provides social network functions\n ** Using for example the FOAF ontology.\n ** Goal: A *distributed* version of facebook, advogato, etc etc\n ** - Similarly easy user interface, but data storage distributed\n ** - Read and write both user-private (address book) and public data clearly\n ** -- todo: use common code to get username and load profile and set 'me'\n */\n\nimport './socialPane.css'\nimport { icons, utils, ns, log, widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, Statement } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { locationIcon } from './icons'\nimport {\n createAllFriendsSection,\n FriendRowRenderers,\n createMutualSection,\n createRequestsSection\n} from './socialSections'\nimport type { ViewerMode } from '../types'\nimport { getViewerRelation } from '../utils/viewerUtils'\nimport { FriendshipTriage, loadFriendshipTriage, triageFriends } from './triage'\n\nfunction applyEnvironmentAttributes (\n element: HTMLElement,\n context: DataBrowserContext\n): void {\n const layout = context.environment?.layout ?? 'desktop'\n const theme = context.environment?.theme ?? 'light'\n const inputMode = context.environment?.inputMode ?? 'pointer'\n\n element.classList.add('social-pane-host')\n element.dataset.layout = layout\n element.dataset.theme = theme\n element.dataset.inputMode = inputMode\n}\n\nexport const socialPane = {\n icon: icons.originalIconBase + 'foaf/foafTiny.gif',\n\n name: 'social',\n\n label: function (subject, context) {\n const kb = context.session.store\n const types = kb.findTypeURIs(subject)\n if (\n types[ns.foaf('Person').uri] ||\n types[ns.vcard('Individual').uri]\n ) {\n return 'Friends'\n }\n return null\n },\n global: false,\n\n render: function (s, context) {\n const dom = context.dom\n const common = function (x: NamedNode[], y: NamedNode[]) {\n // Find common members of two lists\n const both: NamedNode[] = []\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n if (y[j].sameTerm(x[i])) {\n both.push(y[j])\n break\n }\n }\n }\n return both\n }\n\n const uniqueNodes = function (nodes: NamedNode[]) {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n for (const node of nodes) {\n if (!node?.value || seen.has(node.value)) continue\n seen.add(node.value)\n unique.push(node)\n }\n return unique\n }\n\n const link = function (contents: Node, uri: string | null | undefined) {\n if (!uri) return contents\n const a = dom.createElement('a')\n a.setAttribute('href', uri)\n a.appendChild(contents)\n return a\n }\n\n const text = function (str: string) {\n return dom.createTextNode(str)\n }\n\n let refreshRelationshipUi = function () {}\n\n const buildCheckboxForm = function (\n lab: string | Node,\n statement: Statement,\n state: boolean,\n options: { disabled?: boolean, disabledTitle?: string } = {}\n ) {\n const f = dom.createElement('form')\n const label = dom.createElement('label')\n const input = dom.createElement('input')\n const tx = dom.createElement('span')\n tx.className = 'question'\n if (typeof lab === 'string') {\n tx.textContent = lab\n } else {\n tx.appendChild(lab)\n }\n input.setAttribute('type', 'checkbox')\n if (options.disabled) {\n input.disabled = true\n if (options.disabledTitle) {\n input.title = options.disabledTitle\n input.setAttribute('aria-label', options.disabledTitle)\n }\n }\n label.appendChild(tx)\n label.appendChild(input)\n f.appendChild(label)\n const boxHandler = function (this: HTMLInputElement, _e: Event) {\n if (this.checked) {\n try {\n outliner.UserInput.sparqler.insert_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while inserting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = false // rollback UI\n return\n }\n kb.add(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n })\n } catch (e) {\n log.error('Data write fails:' + e)\n log.alert('Data write fails:' + e)\n input.checked = false // rollback UI\n tx.className = 'question'\n }\n } else {\n try {\n outliner.UserInput.sparqler.delete_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while deleting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = true // Rollback UI\n } else {\n kb.removeMany(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n }\n })\n } catch (e) {\n log.alert('Delete fails:' + e)\n input.checked = true // Rollback UI\n // return\n }\n }\n }\n input.checked = state\n input.addEventListener('click', boxHandler, false)\n return f\n }\n\n // ////////// Body of render():\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const socialPane = dom.createElement('div')\n socialPane.classList.add('social-pane', 'flex-column', 'gap-xxs')\n applyEnvironmentAttributes(socialPane, context)\n const foaf = ns.foaf\n const vcard = ns.vcard\n const me = authn.currentUser()\n const meUri = me ? me.uri : null\n\n const thisIsYou = me && kb.sameThings(me, s)\n\n const knows = foaf('knows')\n // var givenName = kb.sym('http://www.w3.org/2000/10/swap/pim/contact#givenName')\n const familiar =\n kb.anyValue(s, foaf('givenname')) ||\n kb.anyValue(s, foaf('firstName')) ||\n kb.anyValue(s, foaf('nick')) ||\n kb.anyValue(s, foaf('name')) ||\n kb.anyValue(s, vcard('fn'))\n const friends = kb.each(s, knows)\n const uniqueFriends = uniqueNodes(friends as NamedNode[])\n const myFriends = me ? uniqueNodes(kb.each(me, foaf('knows')) as NamedNode[]) : []\n const mutualConnections = me && !thisIsYou\n ? uniqueNodes(common(uniqueFriends, myFriends)).filter(friend => !kb.sameThings(friend, me))\n : []\n const viewerMode = getViewerRelation(s, me)\n\n // Do I have a public profile document?\n let profile: NamedNode | null = null // This could be SPARQL { ?me foaf:primaryTopic [ a foaf:PersonalProfileDocument ] }\n let editable = false\n let incoming: boolean | NamedNode[] = false\n let outgoing: boolean | NamedNode[] = false\n\n const structure = socialPane.appendChild(dom.createElement('div'))\n structure.className = 'social-layout'\n const primary = structure.appendChild(dom.createElement('div'))\n primary.className = 'social-primary'\n\n const tabs = primary.appendChild(dom.createElement('div'))\n tabs.classList.add('social-primary__tabs', 'flex-center')\n tabs.setAttribute('role', 'tablist')\n tabs.setAttribute('aria-label', 'Social sections')\n\n const allFriendsTab = tabs.appendChild(dom.createElement('button'))\n allFriendsTab.className = 'social-primary__tab'\n allFriendsTab.type = 'button'\n allFriendsTab.id = 'social-tab-all-friends'\n allFriendsTab.textContent = 'All Friends'\n allFriendsTab.setAttribute('role', 'tab')\n allFriendsTab.setAttribute('aria-controls', 'social-panel-all-friends')\n allFriendsTab.setAttribute('aria-selected', 'true')\n allFriendsTab.tabIndex = 0\n\n const mutualTab = tabs.appendChild(dom.createElement('button'))\n mutualTab.className = 'social-primary__tab'\n mutualTab.type = 'button'\n mutualTab.id = 'social-tab-mutual'\n mutualTab.textContent = 'Mutual'\n mutualTab.setAttribute('role', 'tab')\n mutualTab.setAttribute('aria-controls', 'social-panel-mutual')\n mutualTab.setAttribute('aria-selected', 'false')\n mutualTab.tabIndex = -1\n\n if (me) {\n // The definition of FOAF personal profile document is ..\n const works = kb.each(undefined, foaf('primaryTopic'), me) // having me as primary topic\n let message = ''\n for (let i = 0; i < works.length; i++) {\n if (\n kb.whether(\n works[i],\n ns.rdf('type'),\n foaf('PersonalProfileDocument')\n )\n ) {\n const doc = works[i]\n editable = outliner.UserInput.sparqler.editable(doc.uri, kb)\n if (!editable) {\n message +=\n 'Your profile <' +\n utils.escapeForXML(doc.uri) +\n '> is not remotely editable.'\n } else {\n profile = doc\n break\n }\n }\n }\n\n /*\n if (!profile) {\n say(\n message + '\\nI couldn\\'t find your editable personal profile document.'\n )\n } else {\n say('Editing your profile ' + profile + '.')\n editable = outliner.UserInput.sparqler.editable(profile.uri, kb)\n }\n */\n\n if (thisIsYou) {\n // This is about me\n // pass... @@\n } else {\n // This is about someone else\n // My relationship with this person\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n outgoing = false\n const outgoingSt = kb.statementsMatching(cme, knows, s)\n if (outgoingSt.length) {\n outgoing = true\n if (!profile) profile = outgoingSt[0].why\n }\n } // About someone else\n } // me is defined\n // End of you and s\n\n const canEditOwnedProfile = viewerMode === 'owner' && editable\n const canManageRelationship = viewerMode === 'authenticated' && !thisIsYou && editable && Boolean(profile)\n const canModifyFriendsTab = canEditOwnedProfile\n\n // div.appendChild(dom.createTextNode(plural(friends.length, 'acquaintance') +'. '))\n\n // ///////////////////////////////////////////// Main block\n //\n // Should: Find the intersection and difference sets\n\n const friendDetailsByUri = new Map<string, FriendDetails>()\n\n const hydrateFriendDetailsCache = function (friendNodes: NamedNode[]) {\n const nextCache = new Map<string, FriendDetails>()\n\n friendNodes.forEach(friendNode => {\n if (!friendNode?.value || friendNode.value === s.value) return\n nextCache.set(friendNode.value, toFriendDetails(kb, friendNode))\n })\n\n friendDetailsByUri.clear()\n nextCache.forEach((value, key) => {\n friendDetailsByUri.set(key, value)\n })\n }\n\n hydrateFriendDetailsCache(uniqueFriends)\n\n const renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n\n const container = renderDom.createElement('div')\n const jobAndOrganization = [friend.jobTitle, friend.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = container.appendChild(renderDom.createElement('div'))\n jobLine.className = 'social-friend-job-org'\n jobLine.textContent = jobAndOrganization\n }\n\n if (friend.location) {\n const locationLine = container.appendChild(renderDom.createElement('div'))\n locationLine.className = 'social-friend-location'\n locationLine.innerHTML = `${locationIcon} ${friend.location}`\n }\n\n if (!container.childNodes.length) return null\n\n return container\n }\n\n const renderNameSuffix: FriendRowRenderers['renderNameSuffix'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n const pronouns = friend.pronouns\n if (!pronouns) return null\n\n const suffix = renderDom.createElement('span')\n suffix.className = 'social-friend-pronouns'\n suffix.textContent = `(${pronouns})`\n return suffix\n }\n\n let mutualSection = me && !thisIsYou\n ? createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n : {\n section: dom.createElement('section'),\n content: dom.createElement('div'),\n refreshMutualFriends: function () {}\n }\n\n let mutualFriends = mutualSection.section\n let mutualContent = mutualSection.content\n if (!mutualFriends.className) {\n mutualFriends.className = 'social-pane__mutual-friends social-primary__panel'\n mutualFriends.id = 'social-panel-mutual'\n mutualFriends.setAttribute('role', 'tabpanel')\n mutualFriends.setAttribute('aria-labelledby', 'social-tab-mutual')\n mutualContent.className = 'social-main social-main--mutual'\n mutualFriends.appendChild(mutualContent)\n }\n primary.appendChild(mutualFriends)\n\n const allFriendsSection = createAllFriendsSection({\n dom,\n subject: s,\n profile: canModifyFriendsTab ? profile : null,\n editable: canModifyFriendsTab,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n const allFriends = allFriendsSection.section\n const friendsList = allFriendsSection.friendsList\n primary.appendChild(allFriends)\n\n let requestsTriage: FriendshipTriage = triageFriends(kb, s)\n const requestsSection = createRequestsSection({\n dom,\n triage: requestsTriage,\n renderSupportingInfo,\n renderNameSuffix\n })\n const requestsPanel = requestsSection.section\n primary.appendChild(requestsPanel)\n\n const requestsTab = tabs.appendChild(dom.createElement('button'))\n requestsTab.className = 'social-primary__tab'\n requestsTab.type = 'button'\n requestsTab.id = 'social-tab-requests'\n requestsTab.textContent = 'Requests'\n requestsTab.setAttribute('role', 'tab')\n requestsTab.setAttribute('aria-controls', 'social-panel-requests')\n requestsTab.setAttribute('aria-selected', 'false')\n requestsTab.tabIndex = -1\n\n type SocialPanel = 'mutual' | 'all-friends' | 'requests'\n let activePanel: SocialPanel = 'all-friends'\n let showRequestsTab = viewerMode === 'owner'\n\n const setActivePanel = function (panel: SocialPanel) {\n activePanel = panel\n const showMutual = panel === 'mutual'\n const showAllFriends = panel === 'all-friends'\n const showRequests = showRequestsTab && panel === 'requests'\n mutualTab.classList.toggle('social-primary__tab--active', showMutual)\n mutualTab.setAttribute('aria-selected', String(showMutual))\n mutualTab.tabIndex = showMutual ? 0 : -1\n\n allFriendsTab.classList.toggle('social-primary__tab--active', showAllFriends)\n allFriendsTab.setAttribute('aria-selected', String(showAllFriends))\n allFriendsTab.tabIndex = showAllFriends ? 0 : -1\n\n requestsTab.classList.toggle('social-primary__tab--active', showRequests)\n requestsTab.setAttribute('aria-selected', String(showRequests))\n requestsTab.tabIndex = showRequests ? 0 : -1\n\n mutualFriends.classList.toggle('social-primary__panel--active', showMutual)\n mutualFriends.setAttribute('aria-hidden', String(!showMutual))\n\n allFriends.classList.toggle('social-primary__panel--active', showAllFriends)\n allFriends.setAttribute('aria-hidden', String(!showAllFriends))\n\n requestsPanel.classList.toggle('social-primary__panel--active', showRequests)\n requestsPanel.setAttribute('aria-hidden', String(!showRequests))\n requestsPanel.hidden = !showRequestsTab || !showRequests\n }\n const rebuildMutualSection = function () {\n if (!me || thisIsYou) return\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n\n const outgoingStatements = kb.statementsMatching(cme, knows, s)\n outgoing = outgoingStatements.length > 0\n\n const nextMutualSection = createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n mutualFriends.replaceWith(nextMutualSection.section)\n mutualSection = nextMutualSection\n mutualFriends = nextMutualSection.section\n mutualContent = nextMutualSection.content\n }\n\n refreshRelationshipUi = function () {\n rebuildMutualSection()\n requestsTriage = triageFriends(kb, s)\n requestsSection.refreshRequests(requestsTriage)\n setActivePanel(activePanel)\n }\n\n setActivePanel('all-friends')\n\n const applyViewerMode = function (mode: ViewerMode) {\n const showMutualTab = mode === 'authenticated' && !thisIsYou\n showRequestsTab = mode === 'owner'\n mutualTab.hidden = !showMutualTab\n requestsTab.hidden = !showRequestsTab\n if (!showRequestsTab && activePanel === 'requests') {\n setActivePanel('all-friends')\n return\n }\n setActivePanel('all-friends')\n }\n\n mutualTab.addEventListener('click', function () {\n setActivePanel('mutual')\n })\n\n allFriendsTab.addEventListener('click', function () {\n setActivePanel('all-friends')\n })\n\n requestsTab.addEventListener('click', function () {\n setActivePanel('requests')\n })\n\n const refreshFriendsList = function () {\n const refresh = (friendsList as HTMLTableElement & { refresh?: () => void }).refresh\n if (typeof refresh !== 'function') return\n\n refresh.call(friendsList)\n }\n\n const refreshMutualFriends = function () {\n mutualSection.refreshMutualFriends()\n }\n\n ;(async () => {\n try {\n for await (const streamedFriends of streamFriends(context, s)) {\n friendDetailsByUri.clear()\n streamedFriends.forEach(friend => {\n friendDetailsByUri.set(friend.url, friend)\n })\n refreshFriendsList()\n refreshMutualFriends()\n }\n } catch {\n // Keep the initial snapshot if async friend loading fails.\n }\n })()\n\n ;(async () => {\n try {\n requestsTriage = await loadFriendshipTriage(context, s)\n requestsSection.refreshRequests(requestsTriage)\n refreshFriendsList()\n refreshMutualFriends()\n } catch {\n // Keep the initial requests snapshot if additional loading fails.\n }\n })()\n\n // Older triage logic is preserved below as a reusable data helper.\n\n applyViewerMode('anonymous')\n\n authn.checkUser()\n .then(webId => {\n const confirmedViewerMode = getViewerRelation(s, webId)\n applyViewerMode(confirmedViewerMode)\n })\n .catch(() => {\n applyViewerMode('anonymous')\n })\n\n return socialPane\n } // render()\n} //\n// ends\n// ***************** Social Pane Selectors **********/\n/* Should move to another file, but will leave for now */\n/* Will create a social pane folder or maybe repo later */\n\nconst FRIEND_BATCH_SIZE = 3\n\nexport interface ProfileDetails {\n url: string\n imageUrl?: string\n name?: string\n nickname?: string\n jobTitle?: string\n organization?: string\n location?: string | null\n pronouns?: string\n birthdate?: string\n}\n\nexport interface FriendDetails extends ProfileDetails {\n subjectNode: NamedNode\n}\n\n/* pronounsAsText and formatLocation were copied from HeadingSection selectors */\nexport function pronounsAsText (store: LiveStore, subject: NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation (countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction toFriendDetails (store: any, friendNode: NamedNode): FriendDetails {\n const name =\n store.anyValue(friendNode, ns.vcard('fn')) ||\n store.anyValue(friendNode, ns.foaf('name')) ||\n null\n const nickname =\n store.anyValue(friendNode, ns.vcard('nickname')) ||\n store.anyValue(friendNode, ns.foaf('nick')) ||\n null\n const dateOfBirth = store.anyValue(friendNode, ns.vcard('bday')) || null\n const imageSrc = widgets.findImage(friendNode)\n const jobTitle = store.anyValue(friendNode, ns.vcard('role')) || null\n const orgName = store.anyValue(friendNode, ns.vcard('organization-name')) || null\n const primaryAddressEntryNode = store.any(friendNode, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : null\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, friendNode)\n\n return {\n url: friendNode.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns,\n subjectNode: friendNode\n }\n}\n\nexport async function * streamFriends (\n context: DataBrowserContext,\n subject: NamedNode,\n batchSize = FRIEND_BATCH_SIZE\n): AsyncGenerator<FriendDetails[], void, void> {\n const store = context.session.store\n const fetcher = (store as any)?.fetcher\n\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with whatever is already in the store.\n }\n }\n\n const seen = new Set<string>()\n const friendNodes = store.each(subject, ns.foaf('knows'), null, subject.doc())\n const uniqueFriendNodes: NamedNode[] = []\n\n for (const friendNode of friendNodes) {\n const key = friendNode?.value\n if (!key || seen.has(key) || subject.value === key) continue\n seen.add(key)\n uniqueFriendNodes.push(friendNode as NamedNode)\n }\n\n const friends: FriendDetails[] = []\n\n for (const friendNode of uniqueFriendNodes) {\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(friendNode.doc())\n } catch {\n // Keep partial friend data when one linked document fails to load.\n }\n }\n\n friends.push(toFriendDetails(store, friendNode))\n\n if (friends.length % batchSize === 0) {\n yield [...friends]\n }\n }\n\n if (friends.length > 0 && friends.length % batchSize !== 0) {\n yield [...friends]\n }\n}\n\nexport async function extractFriends (context: DataBrowserContext, subject: NamedNode): Promise<FriendDetails[] | null> {\n let latestFriends: FriendDetails[] | null = null\n\n for await (const friends of streamFriends(context, subject)) {\n latestFriends = friends\n }\n\n return latestFriends\n}\n\nexport function selectProfileData (context: DataBrowserContext, subject: NamedNode): ProfileDetails | null {\n const store = context.session.store\n\n const name =\n store.anyValue(subject, ns.vcard('fn')) ||\n store.anyValue(subject, ns.foaf('name')) ||\n undefined\n const nickname =\n store.anyValue(subject, ns.vcard('nickname')) ||\n store.anyValue(subject, ns.foaf('nick')) ||\n undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : undefined\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : undefined\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, subject)\n return {\n url: subject.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns\n }\n}\n"],"mappings":"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"}