solid-panes 4.4.2-1 → 4.4.2-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/dist/RDFXMLPane.d.ts +2 -3
- package/dist/RDFXMLPane2.cjs.js +3 -0
- package/dist/RDFXMLPane2.cjs.js.map +1 -0
- package/dist/RDFXMLPane2.esm.js +55 -0
- package/dist/RDFXMLPane2.esm.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.cjs.js +1 -0
- package/dist/_virtual/~icons/lucide/user.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/user.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/user.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/user.esm.js.map +1 -0
- package/dist/audio/audioPane.cjs.js +2 -0
- package/dist/audio/audioPane.cjs.js.map +1 -0
- package/dist/audio/audioPane.esm.js +96 -0
- package/dist/audio/audioPane.esm.js.map +1 -0
- package/dist/classInstancePane.cjs.js +2 -0
- package/dist/classInstancePane.cjs.js.map +1 -0
- package/dist/classInstancePane.esm.js +50 -0
- package/dist/classInstancePane.esm.js.map +1 -0
- package/dist/components/header/Header.d.ts +8 -0
- package/dist/components/header/Header.d.ts.map +1 -0
- package/dist/components/header/index.d.ts +4 -0
- package/dist/components/header/index.d.ts.map +1 -0
- package/dist/dashboard/basicPreferences.cjs.js +2 -0
- package/dist/dashboard/basicPreferences.cjs.js.map +1 -0
- package/dist/dashboard/basicPreferences.d.ts +1 -1
- package/dist/dashboard/basicPreferences.esm.js +70 -0
- package/dist/dashboard/basicPreferences.esm.js.map +1 -0
- package/dist/dashboard/dashboardPane.d.ts +1 -1
- package/dist/dashboard/homepage.d.ts +1 -1
- package/dist/dashboard/ontologyData.cjs.js +37 -0
- package/dist/dashboard/ontologyData.cjs.js.map +1 -0
- package/dist/dashboard/ontologyData.esm.js +6 -0
- package/dist/dashboard/ontologyData.esm.js.map +1 -0
- package/dist/dashboard/preferencesFormText.cjs.js +20 -0
- package/dist/dashboard/preferencesFormText.cjs.js.map +1 -0
- package/dist/dashboard/preferencesFormText.esm.js +6 -0
- package/dist/dashboard/preferencesFormText.esm.js.map +1 -0
- package/dist/dataContentPane.d.ts +2 -3
- package/dist/dataContentPane2.cjs.js +2 -0
- package/dist/dataContentPane2.cjs.js.map +1 -0
- package/dist/dataContentPane2.esm.js +109 -0
- package/dist/dataContentPane2.esm.js.map +1 -0
- package/dist/defaultPane.d.ts +2 -3
- package/dist/defaultPane2.cjs.js +2 -0
- package/dist/defaultPane2.cjs.js.map +1 -0
- package/dist/defaultPane2.esm.js +41 -0
- package/dist/defaultPane2.esm.js.map +1 -0
- package/dist/dev.d.ts +10 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dokieli/dokieliPane.cjs.js +2 -0
- package/dist/dokieli/dokieliPane.cjs.js.map +1 -0
- package/dist/dokieli/dokieliPane.esm.js +39 -0
- package/dist/dokieli/dokieliPane.esm.js.map +1 -0
- package/dist/dokieli/{new.js → new.cjs.js} +4 -10
- package/dist/dokieli/new.cjs.js.map +1 -0
- package/dist/dokieli/new.esm.js +6 -0
- package/dist/dokieli/new.esm.js.map +1 -0
- package/dist/form/pane.cjs.js +4 -0
- package/dist/form/pane.cjs.js.map +1 -0
- package/dist/form/pane.d.ts +1 -2
- package/dist/form/pane.esm.js +121 -0
- package/dist/form/pane.esm.js.map +1 -0
- package/dist/home/homePane.cjs.js +2 -0
- package/dist/home/homePane.cjs.js.map +1 -0
- package/dist/home/homePane.d.ts +1 -1
- package/dist/home/homePane.esm.js +35 -0
- package/dist/home/homePane.esm.js.map +1 -0
- package/dist/humanReadablePane.d.ts +2 -3
- package/dist/humanReadablePane2.cjs.js +2 -0
- package/dist/humanReadablePane2.cjs.js.map +1 -0
- package/dist/humanReadablePane2.esm.js +123 -0
- package/dist/humanReadablePane2.esm.js.map +1 -0
- package/dist/icons/dashboard.cjs.js +2 -0
- package/dist/icons/dashboard.cjs.js.map +1 -0
- package/dist/icons/dashboard.esm.js +6 -0
- package/dist/icons/dashboard.esm.js.map +1 -0
- package/dist/icons/folder.cjs.js +2 -0
- package/dist/icons/folder.cjs.js.map +1 -0
- package/dist/icons/folder.esm.js +6 -0
- package/dist/icons/folder.esm.js.map +1 -0
- package/dist/icons/friends.cjs.js +2 -0
- package/dist/icons/friends.cjs.js.map +1 -0
- package/dist/icons/friends.esm.js +6 -0
- package/dist/icons/friends.esm.js.map +1 -0
- package/dist/icons/iconHelper.cjs.js +2 -0
- package/dist/icons/iconHelper.cjs.js.map +1 -0
- package/dist/icons/iconHelper.esm.js +17 -0
- package/dist/icons/iconHelper.esm.js.map +1 -0
- package/dist/icons/{menu.svg → menu.cjs.js} +3 -2
- package/dist/icons/menu.cjs.js.map +1 -0
- package/dist/icons/menu.esm.js +6 -0
- package/dist/icons/menu.esm.js.map +1 -0
- package/dist/icons/person.cjs.js +2 -0
- package/dist/icons/person.cjs.js.map +1 -0
- package/dist/icons/person.esm.js +6 -0
- package/dist/icons/person.esm.js.map +1 -0
- package/dist/imagePane.d.ts +2 -3
- package/dist/imagePane2.cjs.js +2 -0
- package/dist/imagePane2.cjs.js.map +1 -0
- package/dist/imagePane2.esm.js +32 -0
- package/dist/imagePane2.esm.js.map +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.esm.js +26 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/internal/internalPane.d.ts +1 -2
- package/dist/internal/internalPane2.cjs.js +2 -0
- package/dist/internal/internalPane2.cjs.js.map +1 -0
- package/dist/internal/internalPane2.esm.js +104 -0
- package/dist/internal/internalPane2.esm.js.map +1 -0
- package/dist/mainPage/footer.cjs.js +2 -0
- package/dist/mainPage/footer.cjs.js.map +1 -0
- package/dist/mainPage/footer.d.ts +1 -3
- package/dist/mainPage/footer.esm.js +18 -0
- package/dist/mainPage/footer.esm.js.map +1 -0
- package/dist/mainPage/header.cjs.js +2 -0
- package/dist/mainPage/header.cjs.js.map +1 -0
- package/dist/mainPage/header.d.ts +1 -15
- package/dist/mainPage/header.d.ts.map +1 -1
- package/dist/mainPage/header.esm.js +24 -0
- package/dist/mainPage/header.esm.js.map +1 -0
- package/dist/mainPage/index.cjs.js +2 -0
- package/dist/mainPage/index.cjs.js.map +1 -0
- package/dist/mainPage/index.d.ts +3 -7
- package/dist/mainPage/index.d.ts.map +1 -1
- package/dist/mainPage/index.esm.js +38 -0
- package/dist/mainPage/index.esm.js.map +1 -0
- package/dist/mainPage/menu.d.ts +1 -2
- package/dist/mainPage/menu2.cjs.js +2 -0
- package/dist/mainPage/menu2.cjs.js.map +1 -0
- package/dist/mainPage/menu2.esm.js +184 -0
- package/dist/mainPage/menu2.esm.js.map +1 -0
- package/dist/n3Pane.d.ts +2 -3
- package/dist/n3Pane2.cjs.js +3 -0
- package/dist/n3Pane2.cjs.js.map +1 -0
- package/dist/n3Pane2.esm.js +52 -0
- package/dist/n3Pane2.esm.js.map +1 -0
- package/dist/outline/context.cjs.js +2 -0
- package/dist/outline/context.cjs.js.map +1 -0
- package/dist/outline/context.d.ts +3 -3
- package/dist/outline/context.esm.js +18 -0
- package/dist/outline/context.esm.js.map +1 -0
- package/dist/outline/manager2.cjs.js +3 -0
- package/dist/outline/manager2.cjs.js.map +1 -0
- package/dist/outline/manager2.esm.js +875 -0
- package/dist/outline/manager2.esm.js.map +1 -0
- package/dist/outline/outlineIcons.cjs.js +2 -0
- package/dist/outline/outlineIcons.cjs.js.map +1 -0
- package/dist/outline/outlineIcons.esm.js +10 -0
- package/dist/outline/outlineIcons.esm.js.map +1 -0
- package/dist/outline/propertyViews.cjs.js +2 -0
- package/dist/outline/propertyViews.cjs.js.map +1 -0
- package/dist/outline/propertyViews.esm.js +19 -0
- package/dist/outline/propertyViews.esm.js.map +1 -0
- package/dist/outline/queryByExample.cjs.js +2 -0
- package/dist/outline/queryByExample.cjs.js.map +1 -0
- package/dist/outline/queryByExample.esm.js +25 -0
- package/dist/outline/queryByExample.esm.js.map +1 -0
- package/dist/outline/userInput.cjs.js +61 -0
- package/dist/outline/userInput.cjs.js.map +1 -0
- package/dist/outline/userInput.esm.js +784 -0
- package/dist/outline/userInput.esm.js.map +1 -0
- package/dist/outline/viewAsImage.cjs.js +2 -0
- package/dist/outline/viewAsImage.cjs.js.map +1 -0
- package/dist/outline/viewAsImage.esm.js +10 -0
- package/dist/outline/viewAsImage.esm.js.map +1 -0
- package/dist/outline/viewAsMbox.cjs.js +2 -0
- package/dist/outline/viewAsMbox.cjs.js.map +1 -0
- package/dist/outline/viewAsMbox.esm.js +9 -0
- package/dist/outline/viewAsMbox.esm.js.map +1 -0
- package/dist/pad/padPane.d.ts +1 -2
- package/dist/pad/padPane2.cjs.js +2 -0
- package/dist/pad/padPane2.cjs.js.map +1 -0
- package/dist/pad/padPane2.esm.js +172 -0
- package/dist/pad/padPane2.esm.js.map +1 -0
- package/dist/playlist/playlistPane.cjs.js +2 -0
- package/dist/playlist/playlistPane.cjs.js.map +1 -0
- package/dist/playlist/playlistPane.esm.js +49 -0
- package/dist/playlist/playlistPane.esm.js.map +1 -0
- package/dist/profileUtils/ownerProfile.cjs.js +2 -0
- package/dist/profileUtils/ownerProfile.cjs.js.map +1 -0
- package/dist/profileUtils/ownerProfile.d.ts +1 -1
- package/dist/profileUtils/ownerProfile.esm.js +50 -0
- package/dist/profileUtils/ownerProfile.esm.js.map +1 -0
- package/dist/registerPanes.cjs.js +2 -0
- package/dist/registerPanes.cjs.js.map +1 -0
- package/dist/registerPanes.esm.js +45 -0
- package/dist/registerPanes.esm.js.map +1 -0
- package/dist/schedule/formsForSchedule.cjs.js +117 -0
- package/dist/schedule/formsForSchedule.cjs.js.map +1 -0
- package/dist/schedule/formsForSchedule.esm.js +6 -0
- package/dist/schedule/formsForSchedule.esm.js.map +1 -0
- package/dist/schedule/schedulePane.d.ts +2 -4
- package/dist/schedule/schedulePane2.cjs.js +8 -0
- package/dist/schedule/schedulePane2.cjs.js.map +1 -0
- package/dist/schedule/schedulePane2.esm.js +384 -0
- package/dist/schedule/schedulePane2.esm.js.map +1 -0
- package/dist/sharing/sharingPane.cjs.js +2 -0
- package/dist/sharing/sharingPane.cjs.js.map +1 -0
- package/dist/sharing/sharingPane.esm.js +22 -0
- package/dist/sharing/sharingPane.esm.js.map +1 -0
- package/dist/slideshow/slideshowPane.cjs.js +2 -0
- package/dist/slideshow/slideshowPane.cjs.js.map +1 -0
- package/dist/slideshow/slideshowPane.esm.js +46 -0
- package/dist/slideshow/slideshowPane.esm.js.map +1 -0
- package/dist/social/editProfileDetails.cjs.js +2 -0
- package/dist/social/editProfileDetails.cjs.js.map +1 -0
- package/dist/social/editProfileDetails.d.ts +1 -2
- package/dist/social/editProfileDetails.esm.js +10 -0
- package/dist/social/editProfileDetails.esm.js.map +1 -0
- package/dist/social/icons.cjs.js +82 -0
- package/dist/social/icons.cjs.js.map +1 -0
- package/dist/social/{icons.js → icons.esm.js} +12 -18
- package/dist/social/icons.esm.js.map +1 -0
- package/dist/social/socialPane.d.ts +2 -3
- package/dist/social/socialPane2.cjs.js +6 -0
- package/dist/social/socialPane2.cjs.js.map +1 -0
- package/dist/social/socialPane2.esm.js +326 -0
- package/dist/social/socialPane2.esm.js.map +1 -0
- package/dist/social/socialSections.cjs.js +2 -0
- package/dist/social/socialSections.cjs.js.map +1 -0
- package/dist/social/socialSections.d.ts +2 -2
- package/dist/social/socialSections.esm.js +221 -0
- package/dist/social/socialSections.esm.js.map +1 -0
- package/dist/social/triage.cjs.js +2 -0
- package/dist/social/triage.cjs.js.map +1 -0
- package/dist/social/triage.d.ts +2 -2
- package/dist/social/triage.esm.js +44 -0
- package/dist/social/triage.esm.js.map +1 -0
- package/dist/tabbed/tabbedPane.cjs.js +2 -0
- package/dist/tabbed/tabbedPane.cjs.js.map +1 -0
- package/dist/tabbed/tabbedPane.d.ts +1 -1
- package/dist/tabbed/tabbedPane.esm.js +38 -0
- package/dist/tabbed/tabbedPane.esm.js.map +1 -0
- package/dist/tableViewPane.cjs.js +2 -0
- package/dist/tableViewPane.cjs.js.map +1 -0
- package/dist/tableViewPane.esm.js +20 -0
- package/dist/tableViewPane.esm.js.map +1 -0
- package/dist/transaction/pane.cjs.js +8 -0
- package/dist/transaction/pane.cjs.js.map +1 -0
- package/dist/transaction/pane.esm.js +212 -0
- package/dist/transaction/pane.esm.js.map +1 -0
- package/dist/transaction/period.cjs.js +4 -0
- package/dist/transaction/period.cjs.js.map +1 -0
- package/dist/transaction/period.esm.js +126 -0
- package/dist/transaction/period.esm.js.map +1 -0
- package/dist/trip/tripPane.cjs.js +2 -0
- package/dist/trip/tripPane.cjs.js.map +1 -0
- package/dist/trip/tripPane.esm.js +85 -0
- package/dist/trip/tripPane.esm.js.map +1 -0
- package/dist/trustedApplications/trustedApplications.dom.cjs.js +2 -0
- package/dist/trustedApplications/trustedApplications.dom.cjs.js.map +1 -0
- package/dist/trustedApplications/trustedApplications.dom.d.ts +1 -1
- package/dist/trustedApplications/trustedApplications.dom.esm.js +108 -0
- package/dist/trustedApplications/trustedApplications.dom.esm.js.map +1 -0
- package/dist/trustedApplications/trustedApplications.utils.cjs.js +2 -0
- package/dist/trustedApplications/trustedApplications.utils.cjs.js.map +1 -0
- package/dist/trustedApplications/trustedApplications.utils.d.ts +1 -1
- package/dist/trustedApplications/trustedApplications.utils.esm.js +20 -0
- package/dist/trustedApplications/trustedApplications.utils.esm.js.map +1 -0
- package/dist/trustedApplications/trustedApplications.view.cjs.js +2 -0
- package/dist/trustedApplications/trustedApplications.view.cjs.js.map +1 -0
- package/dist/trustedApplications/trustedApplications.view.d.ts +1 -1
- package/dist/trustedApplications/trustedApplications.view.esm.js +41 -0
- package/dist/trustedApplications/trustedApplications.view.esm.js.map +1 -0
- package/dist/ui/pane.cjs.js +4 -0
- package/dist/ui/pane.cjs.js.map +1 -0
- package/dist/ui/pane.esm.js +56 -0
- package/dist/ui/pane.esm.js.map +1 -0
- package/dist/versionInfo.cjs.js +2 -0
- package/dist/versionInfo.cjs.js.map +1 -0
- package/dist/versionInfo.esm.js +40 -0
- package/dist/versionInfo.esm.js.map +1 -0
- package/dist/video/videoPane.cjs.js +2 -0
- package/dist/video/videoPane.cjs.js.map +1 -0
- package/dist/video/videoPane.esm.js +25 -0
- package/dist/video/videoPane.esm.js.map +1 -0
- package/package.json +50 -61
- package/dist/0314353e28ce6e5539af.svg +0 -9
- package/dist/04567ff683933c35c465.png +0 -0
- package/dist/10163fd9b5a0e00d63a0.png +0 -0
- package/dist/1234dcb2eec2e45f252b.png +0 -0
- package/dist/20899934157df4db56cb.png +0 -0
- package/dist/33760bf79f097f449da5.png +0 -0
- package/dist/4cceba29ab33b1ddd9bb.svg +0 -6
- package/dist/578d2b6ed32e7624164e.png +0 -0
- package/dist/5f62a5b2b7e99b9640c7.png +0 -0
- package/dist/6525766ecd288ec60129.png +0 -0
- package/dist/7800be6f6c4b5b0f4f20.png +0 -0
- package/dist/7b7538c6f6b317968009.svg +0 -9
- package/dist/92d03142abe6efc0b42d.svg +0 -6
- package/dist/976473cf5fe24d657d4b.png +0 -0
- package/dist/RDFXMLPane.css +0 -70
- package/dist/RDFXMLPane.js +0 -100
- package/dist/argument/argumentPane.js +0 -60
- package/dist/attach/attachPane.js +0 -393
- package/dist/audio/audioPane.js +0 -181
- package/dist/bda84f59e7216675a208.png +0 -0
- package/dist/cd68e8f3990ba8b2139e.png +0 -0
- package/dist/classInstancePane.js +0 -91
- package/dist/dashboard/basicPreferences.js +0 -147
- package/dist/dashboard/dashboardPane.js +0 -73
- package/dist/dashboard/homepage.js +0 -42
- package/dist/dataContentPane.css +0 -271
- package/dist/dataContentPane.js +0 -226
- package/dist/defaultPane.css +0 -97
- package/dist/defaultPane.js +0 -81
- package/dist/dokieli/dokieliPane.js +0 -74
- package/dist/e7074a7e2cb69e51cfd3.png +0 -0
- package/dist/f3772696fb7ee53c23d8.png +0 -0
- package/dist/form/formPane.css +0 -120
- package/dist/form/pane.js +0 -250
- package/dist/home/homePane.js +0 -74
- package/dist/humanReadablePane.css +0 -129
- package/dist/humanReadablePane.js +0 -243
- package/dist/icons/clock.svg +0 -7
- package/dist/icons/comment.svg +0 -6
- package/dist/icons/dashboard.svg +0 -9
- package/dist/icons/downArrow.svg +0 -6
- package/dist/icons/folder.svg +0 -6
- package/dist/icons/friends.svg +0 -9
- package/dist/icons/help.svg +0 -8
- package/dist/icons/iconHelper.js +0 -23
- package/dist/icons/person.svg +0 -6
- package/dist/icons/personInCircle.svg +0 -8
- package/dist/icons/sharing.svg +0 -10
- package/dist/icons/signOut.svg +0 -8
- package/dist/icons/signUp.svg +0 -9
- package/dist/icons/star.svg +0 -3
- package/dist/imagePane.css +0 -4
- package/dist/imagePane.js +0 -67
- package/dist/index.js +0 -123
- package/dist/internal/internalPane.css +0 -14
- package/dist/internal/internalPane.js +0 -183
- package/dist/mainPage/footer.js +0 -29
- package/dist/mainPage/header.js +0 -203
- package/dist/mainPage/index.js +0 -78
- package/dist/mainPage/menu.css +0 -243
- package/dist/mainPage/menu.js +0 -449
- package/dist/microblogPane/mbStyle.css +0 -267
- package/dist/microblogPane/microblogPane.js +0 -1031
- package/dist/n3Pane.css +0 -49
- package/dist/n3Pane.js +0 -88
- package/dist/outline/context.js +0 -21
- package/dist/outline/manager.css +0 -78
- package/dist/outline/manager.js +0 -2115
- package/dist/outline/outlineIcons.js +0 -126
- package/dist/outline/propertyViews.js +0 -43
- package/dist/outline/queryByExample.js +0 -285
- package/dist/outline/userInput.js +0 -1821
- package/dist/outline/viewAsImage.js +0 -14
- package/dist/outline/viewAsMbox.js +0 -21
- package/dist/pad/padPane.css +0 -40
- package/dist/pad/padPane.js +0 -421
- package/dist/playlist/playlistPane.js +0 -119
- package/dist/profileUtils/ownerProfile.js +0 -84
- package/dist/registerPanes.js +0 -145
- package/dist/schedule/schedulePane.css +0 -294
- package/dist/schedule/schedulePane.js +0 -1022
- package/dist/sharing/sharingPane.js +0 -48
- package/dist/slideshow/slideshowPane.js +0 -79
- package/dist/social/editProfileDetails.js +0 -362
- package/dist/social/socialPane.css +0 -1464
- package/dist/social/socialPane.js +0 -651
- package/dist/social/socialSections.js +0 -393
- package/dist/social/spinner.js +0 -13
- package/dist/social/triage.js +0 -79
- package/dist/solid-panes.js +0 -87502
- package/dist/solid-panes.js.map +0 -1
- package/dist/solid-panes.min.js +0 -3811
- package/dist/solid-panes.min.js.map +0 -1
- package/dist/styles/tabbedtab.css +0 -1066
- package/dist/styles/utilities.css +0 -5
- package/dist/tabbed/tabbedPane.js +0 -59
- package/dist/tableViewPane.js +0 -56
- package/dist/transaction/pane.js +0 -477
- package/dist/transaction/period.js +0 -323
- package/dist/trip/tripPane.js +0 -174
- package/dist/trustedApplications/trustedApplications.dom.js +0 -145
- package/dist/trustedApplications/trustedApplications.utils.js +0 -23
- package/dist/trustedApplications/trustedApplications.view.js +0 -55
- package/dist/ui/pane.js +0 -146
- package/dist/versionInfo.js +0 -41
- package/dist/video/videoPane.js +0 -42
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
(function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`.social-pane-host,.social-pane{--profile-interactive-cursor:pointer;background:var(--color-background,#f8f9fb);border-radius:var(--border-radius-base,.3125rem);box-sizing:border-box;width:100%;min-width:100%;max-width:none;margin:0;display:block;overflow:visible}.social-pane__header-content{align-items:flex-start;column-gap:var(--spacing-md,1.25rem);row-gap:var(--spacing-xxs,.3125rem);grid-template-columns:auto minmax(0,1fr) auto;width:100%;min-width:0;display:grid}.social-pane__header-media{grid-area:1/1}.social-pane__header-details{flex-direction:column;grid-area:1/2;align-items:flex-start;min-width:0;display:flex}.social-pane__header-actions{place-self:flex-start end;align-items:flex-start;gap:var(--spacing-xs,.5rem);flex-wrap:wrap;grid-area:1/3;margin-left:auto;display:flex}.social-pane__header-actions--friend{justify-content:center}.social-pane__header-actions--friend>solid-ui-button{--button-border-radius:var(--border-radius-md,.5rem);--button-hover-text:var(--color-primary,#7c4dff);--button-hover-border:var(--color-primary,#7c4dff);margin-inline:auto}.social-pane__header-summary{align-items:flex-start;gap:var(--spacing-xxs,.125rem);flex-direction:column;width:100%;max-width:100%;display:flex}.social-pane__header-stats{gap:var(--spacing-xs,.75rem);margin-top:var(--spacing-xxs,.3125rem);flex-wrap:wrap;justify-content:flex-start;align-self:flex-start;display:flex}.social-pane__header-stat{appearance:none;cursor:var(--profile-interactive-cursor,pointer);color:var(--slate-700,#314158);font-size:var(--font-size-sm,.875rem);font-weight:var(--font-weight-bold,600);line-height:var(--line-height-tight,1.4);background:0 0;border:0;padding:0;text-decoration:none}.social-pane__header-stat+.social-pane__header-stat:before{content:"◆";color:var(--gray-400,#99a1af);margin-right:var(--spacing-xs,.75rem);vertical-align:middle;font-size:.5rem}.social-pane__header-stat:hover .social-pane__header-stat-label{text-decoration:underline}.social-pane__header-stat:focus-visible{outline:var(--border-width-medium,2px) solid #111827;outline-offset:2px}.social-pane__edit-button{--button-height-sm:0;--button-padding-sm:var(--spacing-xxs,.3125rem);--button-background:transparent;--button-border:transparent;--button-border-width:0;--button-hover-background:transparent;--button-hover-border:transparent;--button-text:var(--color-primary,#7c4dff);--button-hover-text:var(--color-primary,#7c4dff);--button-font-size-sm:var(--font-size-sm,.875rem);--button-font-weight:var(--font-weight-regular,400);--button-line-height:var(--line-height-base,1.5);--button-icon-size-sm:.875rem;width:auto;min-width:0;max-width:none;display:inline-block;position:static}.social-pane__edit-button::part(button):hover{text-decoration:underline}.social-pane__edit-button::part(button):focus-visible{outline:var(--border-width-medium,2px) solid var(--color-primary,#7c4dff);outline-offset:2px}.social-pane__edit-button-label{align-items:center;gap:var(--spacing-xxs,.3125rem);display:inline-flex}.social-pane__edit-button .profile-section-collapsible__edit-icon,.social-pane__edit-button-icon{line-height:0;display:none}.social-pane__edit-button-label svg,.social-pane__edit-button-icon svg,.social-pane__edit-button .profile-section-collapsible__edit-icon svg{vertical-align:middle;flex:none;width:.875rem;height:.875rem;display:inline-block}.social-pane__edit-button-label svg path,.social-pane__edit-button-icon svg path,.social-pane__edit-button .profile-section-collapsible__edit-icon svg path{fill:var(--color-primary,#7c4dff);stroke:none}.social-pane__dialog-backdrop{z-index:1000;background:#0f172a73;padding:1rem;position:fixed;inset:0}.social-pane__dialog{background:var(--white,#fff);width:min(32rem,100%);max-height:calc(100vh - 2rem);color:var(--color-text,#111827);padding:var(--spacing-md,1.25rem);border-radius:1rem;position:relative;overflow:auto;box-shadow:0 20px 45px #0f172a40}.social-pane__dialog-header{justify-content:space-between;align-items:flex-start;gap:var(--spacing-md,1rem);padding-bottom:var(--spacing-base,.5rem);margin-bottom:var(--spacing-sm,.938rem);border-bottom:var(--border-width-sm,.1rem) solid var(--slate-200,#e2e8f0);display:flex}.social-pane__dialog-title{margin:0 0 var(--spacing-base,.5rem)}.social-pane__dialog-close{--button-background:transparent;--button-border:transparent;--button-border-width:0;--button-hover-background:transparent;--button-hover-border:transparent;color:var(--color-text-subheading,#6b7280);cursor:pointer;flex:none;padding:0;line-height:0}.social-pane__dialog-close:hover{color:var(--color-text-primary,#364153)}.social-pane__dialog-close:focus-visible{outline:var(--border-width-medium,2px) solid var(--color-text-primary,#364153);outline-offset:2px}.social-pane__dialog-close svg{width:var(--icon-xxxs,.75rem);height:var(--icon-xxxs,.75rem)}.social-pane__dialog-close svg path{fill:currentColor}.social-pane__dialog-form{gap:var(--spacing-sm,.938rem)}.social-pane__dialog-fields{gap:var(--spacing-sm,.938rem);flex-direction:column;display:flex}.social-pane__dialog-field{gap:.2rem}.social-pane__dialog-field-header{justify-content:space-between;align-items:center;gap:var(--spacing-xs,.75rem);display:flex}.social-pane__dialog-row-list{flex-direction:column;gap:.2rem;display:flex}.social-pane__dialog-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:.45rem;display:grid}.social-pane__dialog-label{color:var(--gray-700,#364153);font-size:var(--font-size-md,1rem);font-weight:var(--font-weight-md,500);margin:0;line-height:normal}.social-pane__dialog-input{box-sizing:border-box;resize:none;width:100%;min-height:auto}.social-pane__dialog-error{min-height:1.25rem;color:var(--color-warning,red);margin:0}.social-pane__dialog-saving-overlay{z-index:10;background:#ffffffc7;place-items:center;display:grid;position:absolute;inset:0}.social-pane__dialog-saving-overlay[hidden]{display:none}.social-pane__dialog.modal--saving .social-pane__dialog-form{opacity:.45;pointer-events:none}.social-pane__dialog .modal__saving-indicator{gap:0}.social-pane__dialog-row-button-icon{flex:none;justify-content:center;align-items:center;line-height:0;display:inline-flex}.social-pane__dialog-row-button-icon svg{display:block}.social-pane__dialog-field-header solid-ui-button.social-pane__dialog-row-button--add{box-sizing:border-box;--button-min-height:auto;--button-padding-sm:var(--spacing-xxs,.3125rem);--button-background:transparent;--button-border:transparent;--button-border-width:0;--button-hover-background:transparent;--button-hover-border:transparent;--button-text:var(--color-primary,#7c4dff);--button-hover-text:var(--color-primary,#7c4dff);--button-height-sm:auto;--button-font-weight:var(--font-weight-md,500);--button-font-size-sm:var(--font-size-sm,.875rem);--button-line-height:var(--line-height-base,1.5);flex:none;justify-self:flex-start;width:auto;min-width:0;max-width:none;margin-left:auto}.social-pane__dialog-field-header solid-ui-button.social-pane__dialog-row-button--add::part(button){min-height:auto;padding:var(--spacing-xxs,.3125rem);color:var(--color-primary,#7c4dff);font-weight:var(--font-weight-md,500);background:0 0;border:none}.social-pane__dialog-field-header solid-ui-button.social-pane__dialog-row-button--add:hover::part(button){text-decoration:underline}.social-pane__add-more-content{display:inline}.social-pane__add-more-inline{white-space:normal;display:inline}.social-pane__add-more-icon{width:var(--icon-xxxs,.75rem);height:var(--icon-xxxs,.75rem);margin-right:var(--spacing-xxs,.3125rem);vertical-align:text-top;line-height:0;display:inline-block}.social-pane__add-more-icon svg{width:100%;height:100%;display:block}.social-pane__dialog-row-list solid-ui-button.social-pane__dialog-row-button--remove{min-height:var(--min-touch-target,44px);min-width:var(--min-touch-target,44px);color:var(--gray-300,#d1d5dc);--button-background:transparent;--button-box-shadow:none;--button-active-box-shadow:none;--button-active-transform:none;--button-border:transparent;--button-border-width:0;--button-border-radius:var(--border-radius-base,.3125rem);--button-hover-background:var(--lavender-300,#e6dcff);--button-hover-border:transparent;--button-hover-text:var(--color-primary,#7c4dff);--button-hover-box-shadow:none;--button-text:currentColor;--button-height-md:var(--min-touch-target,44px);--button-padding-md:0;--button-padding-x-sm:0;--button-icon-size-md:var(--icon-xxs,1rem);--button-icon-size-lg:var(--icon-xxs,1rem)}.social-pane__dialog-row-list solid-ui-button.social-pane__dialog-row-button--remove:hover,.social-pane__dialog-row-list solid-ui-button.social-pane__dialog-row-button--remove:focus-within{color:var(--gray-300,#d1d5dc)}.social-pane__dialog-row-button-icon--remove svg{width:1rem;height:1rem}.social-pane__dialog-row-button-icon--remove svg path{stroke:currentColor}.social-pane__dialog-actions{justify-content:flex-end;gap:var(--spacing-xs,.75rem);padding-top:var(--spacing-base,.5rem);border-top:var(--border-width-sm,.1rem) solid var(--slate-200,#e2e8f0);margin-top:0;display:flex}.social-pane__dialog-actions>solid-ui-button{--button-border-width:1px;--button-border-radius:var(--border-radius-base,.3125rem);--button-box-shadow:none;--button-hover-box-shadow:none;--button-active-box-shadow:none;--button-active-transform:none;width:10.8rem}.social-pane__dialog-actions solid-ui-button.social-pane__dialog-button--save{--button-font-size-md:var(--font-size-lg,1.125rem);--button-background:var(--color-primary,#7c4dff);--button-border:var(--color-primary,#7c4dff);--button-text:var(--white,#fff);--button-hover-background:color-mix(in srgb, var(--color-primary,#7c4dff) 90%, black);--button-hover-border:color-mix(in srgb, var(--color-primary,#7c4dff) 90%, black);--button-hover-text:var(--white,#fff)}.social-pane__dialog-actions solid-ui-button.social-pane__dialog-button--cancel{--button-background:var(--white,#fff);--button-border:var(--gray-300,#d1d5dc);--button-font-weight:var(--font-weight-normal,normal);--button-text:var(--gray-800,#1e2939);--button-hover-background:var(--blue-900,#083575);--button-hover-border:var(--blue-900,#083575);--button-hover-text:var(--white,#fff);--button-font-size-md:var(--font-size-sm,.875rem)}.social-pane__header-name{color:var(--color-text-heading,#000);font-size:var(--font-size-xxl,1.75rem);font-weight:var(--font-weight-bold,600);text-indent:0;text-align:left;overflow-wrap:anywhere;margin:0;padding:0;line-height:1.2;transform:translate(-4px)}.social-pane__header-location{align-items:center;gap:var(--spacing-2xs,.625rem);color:var(--color-text-secondary,#4a5565);font-size:var(--font-size-sm,.875rem);font-weight:var(--font-weight-normal,400);line-height:1.2;display:inline-flex}.social-pane__header-job-org{color:var(--color-text-subheading,#101828);white-space:normal;width:100%;font-size:var(--font-size-lg,1.125rem);font-weight:var(--font-weight-md,500);text-align:left;margin:0;line-height:1.25}.social-pane__header-location-icon{line-height:0}.social-pane__header-location-icon svg{width:var(--icon-xxs,1rem);height:var(--icon-xxs,1rem)}.social-profile-links{grid-template-columns:repeat(2,max-content);align-items:start;gap:.15rem 1rem;display:grid}.social-pane__header-hero{border-radius:var(--border-radius-full,.625rem);border:var(--border-width-sm,.1rem) solid var(--color-primary,#7c4dff);background:var(--gray-200,#e5e7eb) 50% / cover no-repeat;object-fit:cover;object-position:center;background-position:50%;width:140px;height:140px}.social-pane__header-hero-icon{border:var(--border-width-sm,.1rem) solid var(--color-primary,#7c4dff);background:var(--color-card-bg);flex-shrink:0;width:140px;height:140px;line-height:0;border-radius:var(--border-radius-full,.625rem)!important}.social-pane__header-hero-icon svg{width:100%;height:100%;display:block}.social-pane .social-layout{align-items:flex-start;gap:1rem;width:100%;display:flex}.social-pane .social-primary{flex:70%;grid-template-rows:auto minmax(0,auto);grid-template-columns:minmax(0,1fr);align-items:start;gap:0;min-width:0;display:grid}.social-pane .social-primary__tabs{align-items:center;gap:var(--spacing-base,.5rem);z-index:1;background:0 0;grid-area:1/1;width:fit-content;max-width:100%;margin-bottom:0;padding:0;display:flex;position:relative}.social-pane .social-primary__tab{appearance:none;border:0;border-bottom:var(--border-width-sm,.1rem) solid transparent;color:#374151;cursor:pointer;font:inherit;font-weight:var(--font-weight-bold,600);padding:var(--spacing-2xs,.625rem) 1rem;background:0 0;border-radius:0;transition:background-color .12s,color .12s,box-shadow .12s;box-shadow:none!important}.social-pane .social-primary__tab:hover{color:var(--grey-purple-900,#332746);background:var(--lavender-300,#e6dcff)!important;box-shadow:none!important}.social-pane .social-primary__tab[aria-selected=true],.social-pane .social-primary__tab--active{color:var(--grey-purple-900,#332746);border-bottom-color:var(--color-primary,#7c4dff);background:0 0;box-shadow:none!important}.social-pane .social-primary__tab:focus-visible{outline-offset:2px;outline:none;box-shadow:none!important}.social-pane .social-primary__panel{opacity:0;visibility:hidden;pointer-events:none;grid-area:2/1;transition:opacity .16s,transform .16s,visibility 0s linear .16s;display:none;transform:translateY(.35rem)}.social-pane .social-primary__panel--active{opacity:1;visibility:visible;pointer-events:auto;border:0;border-bottom:var(--border-width-sm,.1rem) solid transparent;transition:opacity .18s,transform .18s;display:block;transform:translateY(0)}.social-pane .social-pane__mutual-friends,.social-pane .social-pane__all-friends{padding-top:var(--spacing-xxxs,.2rem);margin-top:0}.social-pane .social-main{background-color:var(--color-card-bg,#fff);color:var(--color-text-primary,#364153);box-sizing:border-box;border-collapse:collapse;border:0;width:100%;padding:0;display:table}.social-pane .social-main--mutual{gap:var(--spacing-xs,.75rem);border-radius:var(--border-radius-lg,.75rem);margin-top:1em;margin-bottom:1em;padding:1rem}.social-pane .social-main--requests{gap:var(--spacing-md,1rem);border-radius:var(--border-radius-lg,.75rem);flex-direction:column;margin-top:.75rem;margin-bottom:1rem;padding:1rem;display:flex}.social-requests__note{color:var(--color-text-subheading,#475467);font-size:var(--font-size-sm,.875rem);margin:0;line-height:1.5}.social-requests__group{gap:var(--spacing-sm,.938rem)}.social-requests__group-header{flex-direction:column;gap:.125rem;display:flex}.social-requests__group-title{color:var(--color-text-heading,#101828);font-size:var(--font-size-lg,1.125rem);margin:0;line-height:1.25}.social-requests__group-description,.social-requests__empty{color:var(--color-text-subheading,#667085);font-size:var(--font-size-sm,.875rem);margin:0;line-height:1.5}.social-requests__table{margin-top:0}.social-pane .social-mutual-summary{gap:var(--spacing-base,.5rem)}.social-pane .social-mutual-summary-line{color:var(--slate-700,#314158);font-size:var(--font-size-sm,.95rem);line-height:var(--line-height-base,1.5);justify-content:flex-start;padding:1rem}.social-pane .social-mutual-summary-line--action{gap:var(--spacing-xxs,.75rem);flex-wrap:wrap}.social-pane .social-mutual-confirm-prompt{align-items:center;gap:var(--spacing-xxxs,.2rem);font-weight:var(--font-weight-semibold,600);flex-wrap:wrap;display:inline-flex}.social-pane .social-pane__friend-action--inline{z-index:auto;align-self:flex-start;position:static;top:auto;right:auto}.social-pane .social-mutual-checkbox-form{margin:0;padding:0 1rem 1rem;display:block}.social-pane .social-mutual-checkbox-form label{align-items:center;gap:var(--spacing-2xs,.65rem);color:var(--slate-700,#374151);font-size:var(--font-size-sm,.875rem);flex-wrap:wrap;line-height:1.4;display:inline-flex}.social-pane .social-mutual-checkbox-form input[type=checkbox]{width:1rem;height:1rem;accent-color:var(--color-primary,#7c4dff);margin:0}.social-pane .social-mutual-checkbox-form input[type=checkbox]:disabled{opacity:.65;cursor:not-allowed}.social-pane .social-friends-list{width:100%;margin-top:0}.social-pane .social-friends-grid{table-layout:fixed;border-collapse:separate;border-spacing:0;align-items:stretch;gap:var(--spacing-xs,.75rem);flex-wrap:wrap;width:100%;display:flex}.social-pane .social-friends-grid>tbody{align-items:stretch;gap:var(--spacing-xs,.75rem);flex-wrap:wrap;width:100%;display:flex}.social-pane .social-friends-grid>tr,.social-pane .social-friends-grid>tbody>tr{table-layout:fixed;box-sizing:border-box;width:calc(50% - .375rem);display:inline-table}.social-pane .social-friends-grid>tr,.social-pane .social-friends-grid>tbody>tr,.social-pane .social-friend-card{border:1px solid var(--gray-200,#e5e7eb);background:var(--white,#fff);border-radius:var(--border-radius-lg,.75rem);transition:box-shadow .14s,border-color .14s,transform .14s;overflow:visible;box-shadow:0 1px 3px #00000014}.social-pane .social-friends-grid>tr:hover,.social-pane .social-friends-grid>tbody>tr:hover,.social-pane .social-friend-card:hover{border-color:var(--gray-300,#d1d5dc);transform:translateY(-1px);box-shadow:0 6px 18px #0000001a}.social-pane .social-friends-grid>tr td,.social-pane .social-friends-grid>tbody>tr td,.social-pane .social-friend-card td{background:var(--color-background,#f8f9fb);box-sizing:border-box}.social-pane .social-friends-grid>tr>td:nth-child(2),.social-pane .social-friends-grid>tbody>tr>td:nth-child(2){width:auto;min-width:0;padding-left:1.4rem}.social-pane .social-friends-grid>tr>td:nth-child(3),.social-pane .social-friends-grid>tbody>tr>td:nth-child(3){vertical-align:top;width:2.5rem;min-width:2.5rem;padding-left:.25rem}.social-pane .social-friends-grid>tr>td:first-child,.social-pane .social-friends-grid>tbody>tr>td:first-child{padding-right:1.2rem}.social-pane .social-friends-grid td>div>div{overflow-wrap:anywhere;white-space:normal!important;width:100%!important;min-width:0!important;max-width:100%!important}.social-pane .social-friends-grid td>div>div button{white-space:normal!important}.social-pane .social-friends-grid>tr>td:nth-child(2)>div:first-child,.social-pane .social-friends-grid>tbody>tr>td:nth-child(2)>div:first-child{flex-wrap:wrap;align-items:flex-start;gap:.2rem .4rem;min-width:0;display:flex}.social-pane .social-friends-grid>tr>td:nth-child(2)>div:first-child>span:first-of-type,.social-pane .social-friends-grid>tbody>tr>td:nth-child(2)>div:first-child>span:first-of-type{vertical-align:text-top;max-width:100%;font-size:var(--font-size-lg,1.125rem);font-weight:var(--font-weight-bold,600);line-height:var(--line-height-tight);text-overflow:clip;white-space:normal;overflow-wrap:anywhere;margin-top:0;margin-bottom:0;display:inline-block;overflow:visible}.social-pane .social-friend-pronouns{margin-left:var(--spacing-xs,.25rem);color:var(--color-text-secondary,#4a5565);font-size:var(--font-size-sm,.875rem);font-weight:var(--font-weight-regular,400);text-align:left;line-height:1.2;display:inline}.social-pane .social-friend-job-org{white-space:normal;overflow-wrap:anywhere;width:100%;min-width:0;color:var(--color-text-subheading,#101828);font-size:var(--font-size-sm,.875rem);font-weight:var(--font-weight-medium,500);text-align:left;margin:0;line-height:1.25}.social-pane .social-friend-location{color:var(--color-text-secondary,#6b7280);font-size:var(--font-size-xs,.8125rem);overflow-wrap:anywhere;line-height:1.3}@media (width<=960px){.social-pane .social-friends-grid>tr,.social-pane .social-friends-grid>tbody>tr{width:100%}}.social-pane .social-friends-header{padding:0 var(--spacing-xs,.75rem) var(--spacing-base,.5rem);background-color:var(--gray-100,#f3f4f6);caption-side:top;justify-content:space-between;align-items:center;margin-top:0;display:flex}.social-pane .social-friends-header-title{font-size:var(--font-size-md,1rem);font-weight:var(--font-weight-bold,600);color:var(--color-text-primary,#364153)}.social-pane .social-friends-header-actions{justify-content:flex-end;align-items:center;display:inline-flex}.social-pane .social-friends-header-actions--standalone{align-items:center;gap:var(--spacing-xs,.75rem);justify-content:flex-start;padding:.7rem 1rem 0;display:flex}.social-pane .social-friends-header-dropzone{border-collapse:collapse}.social-pane .social-friends-header-dropzone-cell{padding:0}.social-pane .social-friends-header-hint{color:var(--color-text-secondary,#4a5565);font-size:var(--font-size-sm,.875rem);line-height:1.4}.social-pane .social-friends-header-actions button{justify-content:center;align-items:center;display:inline-flex;overflow:hidden;border-width:0!important;width:2rem!important;min-width:2rem!important;height:2rem!important;margin:0!important;padding:0!important}.social-pane .social-friends-header-actions button img{object-fit:contain;pointer-events:none;display:block;width:100%!important;height:100%!important}div.social-pane{margin:0;padding-top:0;padding-bottom:0}.social-pane a{color:var(--color-primary,#7c4dff);font-weight:700;text-decoration:none}.social-pane a:hover{color:var(--color-primary,#7c4dff);font-weight:700;text-decoration:underline}.social-pane a:active{color:var(--color-primary,#7c4dff);text-decoration:none}.social-pane__link-button{white-space:nowrap;width:fit-content;max-width:100%;padding:var(--spacing-xxxs,.2rem) var(--spacing-base,.5rem);text-align:left;background-color:#0000;border:none;margin-top:0;margin-bottom:0;display:inline-flex}.social-pane__link-button>a{white-space:normal;overflow-wrap:anywhere;max-width:100%;color:var(--color-primary,#7c4dff);background-color:#0000;display:inline-flex}.social-pane__link-button>a:link,.social-pane__link-button>a:visited,.social-pane__link-button>a:hover{color:var(--color-primary,#7c4dff)}.social-pane__link-button>a:hover{text-decoration:underline}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-content{align-items:start;column-gap:var(--spacing-md,1rem);grid-template-columns:4.375rem minmax(0,1fr) auto;row-gap:.25rem;padding:1rem 1rem 0;display:grid}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-media{display:contents}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-details{flex-direction:column;grid-area:1/2;align-items:flex-start;gap:.125rem;min-width:0;display:flex}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-actions{justify-content:flex-end;justify-self:end;gap:var(--spacing-2xs,.3125rem);grid-area:1/3;width:auto;margin-left:0}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-actions--friend{grid-area:3/1/auto/-1;justify-content:center;justify-self:stretch;width:100%;margin-top:.125rem;margin-left:0}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-summary{flex-direction:column;gap:0;width:100%;display:flex}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__header-name,.social-pane__header-job-org,.social-pane__header-location){text-align:left;justify-content:flex-start;width:100%}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-stats{justify-content:flex-start;align-self:flex-start;gap:var(--spacing-xs,.5rem);width:100%;margin-top:-.4375rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-profile-links{row-gap:var(--spacing-xxxs,.2rem);grid-area:2/1/auto/-1;grid-template-columns:1fr;justify-items:start;margin-top:-.375rem;padding-left:0}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane .social-primary__tabs,:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-primary__tabs{margin-top:-.5rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__link-button{justify-self:start;padding-left:0;padding-right:0}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__link-button>a{font-size:var(--font-size-sm,.875rem);text-align:left}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__dialog-field-header{grid-template-columns:minmax(0,1fr)}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__header-hero,.social-pane__header-hero-icon){aspect-ratio:1;grid-area:1/1;width:5rem;height:5rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-name{font-size:var(--font-size-xl,1.375rem);line-height:1.15}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__header-job-org{font-size:var(--font-size-md,1rem);line-height:1.25}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane .social-friend-pronouns{font-size:.6875rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__header-location,.social-pane__header-stat),:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane .social-friend-location{font-size:var(--font-size-xxs,.75rem)}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__edit-button-label,.social-pane__edit-button .profile-section-collapsible__edit-label){display:none!important}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__edit-button{--button-background:transparent;--button-border-width:0;--button-border:transparent;--button-text:var(--color-text,#1a1a1a);--button-hover-background:var(--lavender-300,#e6dcff);--button-hover-border:transparent;--button-hover-text:var(--color-text,#1a1a1a);--button-font-size-sm:clamp(.9rem, 2.1vw, 1rem);--button-font-weight:var(--font-weight-regular,400);--button-icon-size-sm:.875rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__edit-button-icon,.social-pane__edit-button .profile-section-collapsible__edit-icon){justify-content:center;align-items:center;width:.875rem;height:.875rem;line-height:0;display:inline-flex}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__edit-button-icon svg,.social-pane__edit-button .profile-section-collapsible__edit-icon svg){width:.875rem;height:.875rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane__edit-button-icon svg path,.social-pane__edit-button .profile-section-collapsible__edit-icon svg path){fill:var(--color-text,#1a1a1a);stroke:none}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__dialog-actions{justify-content:center;align-items:center;gap:var(--spacing-sm,.938rem);padding:var(--spacing-md,1rem) 0 0;margin:var(--spacing-md,1rem) auto 0;box-sizing:border-box;flex-direction:row;width:100%}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__dialog-actions>solid-ui-button{flex:none;width:10.8rem;min-width:8.5rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane__dialog-field-header solid-ui-button.social-pane__dialog-row-button--add::part(button){font-size:var(--font-size-sm,.875rem);line-height:var(--line-height-base,1.5)}:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane .social-friends-header-actions--standalone{gap:var(--spacing-2xs,.625rem);flex-wrap:wrap;padding-top:.35rem}:is(.social-pane-host,.social-pane)[data-layout=mobile] :is(.social-pane .social-layout,.social-pane .social-primary,.social-layout,.social-primary),:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-pane .social-friends-grid,:is(.social-pane-host,.social-pane)[data-layout=mobile] .social-friends-grid{display:block}:is(.social-pane-host,.social-pane)[data-input-mode=touch]{--profile-interactive-cursor:auto}:is(.social-pane-host,.social-pane)[data-input-mode=pointer]{--profile-interactive-cursor:pointer}@media (width<=600px){.social-pane__header-content{align-items:start;column-gap:var(--spacing-md,1rem);grid-template-columns:4.375rem minmax(0,1fr) auto;row-gap:.25rem;padding:1rem 1rem 0;display:grid}.social-pane__header-media{display:contents}.social-pane__header-details{flex-direction:column;grid-area:1/2;align-items:flex-start;gap:.125rem;min-width:0;display:flex}.social-pane__header-actions{justify-content:flex-end;justify-self:end;gap:var(--spacing-2xs,.3125rem);grid-area:1/3;width:auto;margin-left:0}.social-pane__header-actions--friend{grid-area:3/1/auto/-1;justify-content:center;justify-self:stretch;width:100%;margin-top:.125rem;margin-left:0}.social-pane__header-summary{flex-direction:column;gap:0;width:100%;display:flex}.social-pane__header-name,.social-pane__header-job-org,.social-pane__header-location{text-align:left;justify-content:flex-start;width:100%}.social-pane__header-stats{justify-content:flex-start;align-self:flex-start;gap:var(--spacing-xs,.5rem);width:100%;margin-top:-.4375rem}.social-profile-links{row-gap:var(--spacing-xxxs,.2rem);grid-area:2/1/auto/-1;grid-template-columns:1fr;justify-items:start;margin-top:-.375rem;padding-left:0}.social-pane .social-primary__tabs{margin-top:-.5rem}.social-pane__link-button{justify-self:start;padding-left:0;padding-right:0}.social-pane__link-button>a{font-size:var(--font-size-sm,.875rem);text-align:left}.social-pane__dialog-field-header{grid-template-columns:minmax(0,1fr)}.social-pane__header-hero,.social-pane__header-hero-icon{aspect-ratio:1;grid-area:1/1;width:5rem;height:5rem}.social-pane__header-name{font-size:var(--font-size-xl,1.375rem);line-height:1.15}.social-pane__header-job-org{font-size:var(--font-size-md,1rem);line-height:1.25}.social-pane .social-friend-pronouns{font-size:.6875rem}.social-pane__header-location,.social-pane__header-stat,.social-pane .social-friend-location{font-size:var(--font-size-xxs,.75rem)}.social-pane__friend-action{--button-padding-sm:var(--spacing-xxxs,.2rem) var(--spacing-xxs-old,.3rem);--button-font-size-sm:var(--font-size-xs,.813rem);--button-border-radius-sm:var(--border-radius-base,.3125rem)}.social-pane__edit-button-label,.social-pane__edit-button .profile-section-collapsible__edit-label{display:none!important}.social-pane__edit-button{--button-background:transparent;--button-border-width:0;--button-border:transparent;--button-text:var(--color-text,#1a1a1a);--button-hover-background:var(--lavender-300,#e6dcff);--button-hover-border:transparent;--button-hover-text:var(--color-text,#1a1a1a);--button-font-size-sm:clamp(.9rem, 2.1vw, 1rem);--button-font-weight:var(--font-weight-regular,400);--button-icon-size-sm:.875rem}.social-pane__edit-button-icon,.social-pane__edit-button .profile-section-collapsible__edit-icon{justify-content:center;align-items:center;width:.875rem;height:.875rem;line-height:0;display:inline-flex}.social-pane__edit-button-icon svg,.social-pane__edit-button .profile-section-collapsible__edit-icon svg{width:.875rem;height:.875rem}.social-pane__edit-button-icon svg path,.social-pane__edit-button .profile-section-collapsible__edit-icon svg path{fill:var(--color-text,#1a1a1a);stroke:none}.social-pane__dialog-actions{justify-content:center;align-items:center;gap:var(--spacing-sm,.938rem);padding:var(--spacing-md,1rem) 0 0;margin:var(--spacing-md,1rem) auto 0;box-sizing:border-box;flex-direction:row;width:100%}.social-pane__dialog-actions>solid-ui-button{flex:none;width:10.8rem;min-width:8.5rem}.social-pane__dialog-field-header solid-ui-button.social-pane__dialog-row-button--add::part(button){font-size:var(--font-size-sm,.875rem);line-height:var(--line-height-base,1.5)}.social-pane .social-friends-header-actions--standalone{gap:var(--spacing-2xs,.625rem);flex-wrap:wrap;padding-top:.35rem}.social-pane .social-layout,.social-pane .social-primary,.social-pane .social-friends-grid{display:block}.social-pane .social-friends-grid>tr,.social-pane .social-friends-grid>tbody>tr{width:100%;margin-bottom:var(--spacing-xs,.75rem);display:table}.social-pane .social-friends-grid>tr:last-child,.social-pane .social-friends-grid>tbody>tr:last-child{margin-bottom:0}.social-pane .social-main{width:100%}}`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();
|
|
2
|
+
import { locationIcon as e } from "./icons.esm.js";
|
|
3
|
+
import { createAllFriendsSection as t, createHeaderSection as n, createMutualSection as r, createRequestsSection as i } from "./socialSections.esm.js";
|
|
4
|
+
import { loadFriendshipTriage as a, triageFriends as o } from "./triage.esm.js";
|
|
5
|
+
import { icons as s, log as c, ns as l, utils as u, widgets as d } from "solid-ui";
|
|
6
|
+
import { authn as f } from "solid-logic";
|
|
7
|
+
//#region src/social/socialPane.ts
|
|
8
|
+
function ee(e, t) {
|
|
9
|
+
let n = t.environment?.layout ?? "desktop", r = t.environment?.theme ?? "light", i = t.environment?.inputMode ?? "pointer";
|
|
10
|
+
e.classList.add("social-pane-host"), e.dataset.layout = n, e.dataset.theme = r, e.dataset.inputMode = i;
|
|
11
|
+
}
|
|
12
|
+
var p = {
|
|
13
|
+
icon: s.originalIconBase + "foaf/foafTiny.gif",
|
|
14
|
+
name: "social",
|
|
15
|
+
label: function(e, t) {
|
|
16
|
+
let n = t.session.store.findTypeURIs(e);
|
|
17
|
+
return n[l.foaf("Person").uri] || n[l.vcard("Individual").uri] ? "Friends" : null;
|
|
18
|
+
},
|
|
19
|
+
global: !1,
|
|
20
|
+
render: function(s, d) {
|
|
21
|
+
let p = d.dom, te = function(e, t) {
|
|
22
|
+
let n = [];
|
|
23
|
+
for (let r = 0; r < e.length; r++) for (let i = 0; i < t.length; i++) if (t[i].sameTerm(e[r])) {
|
|
24
|
+
n.push(t[i]);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
return n;
|
|
28
|
+
}, m = function(e) {
|
|
29
|
+
let t = /* @__PURE__ */ new Set(), n = [];
|
|
30
|
+
for (let r of e) !r?.value || t.has(r.value) || (t.add(r.value), n.push(r));
|
|
31
|
+
return n;
|
|
32
|
+
}, h = function(e, t) {
|
|
33
|
+
if (!t) return e;
|
|
34
|
+
let n = p.createElement("a");
|
|
35
|
+
return n.setAttribute("href", t), n.appendChild(e), n;
|
|
36
|
+
}, ae = function(e) {
|
|
37
|
+
return p.createTextNode(e);
|
|
38
|
+
}, _ = function() {}, oe = function(e, t, n, r = {}) {
|
|
39
|
+
let i = p.createElement("form"), a = p.createElement("label"), o = p.createElement("input"), s = p.createElement("span");
|
|
40
|
+
return s.className = "question", typeof e == "string" ? s.textContent = e : s.appendChild(e), o.setAttribute("type", "checkbox"), r.disabled && (o.disabled = !0, r.disabledTitle && (o.title = r.disabledTitle, o.setAttribute("aria-label", r.disabledTitle))), a.appendChild(s), a.appendChild(o), i.appendChild(a), o.checked = n, o.addEventListener("click", function(e) {
|
|
41
|
+
if (this.checked) try {
|
|
42
|
+
v.UserInput.sparqler.insert_statement(t, function(e, n, r) {
|
|
43
|
+
if (s.className = "question", !n) {
|
|
44
|
+
c.alert("Error occurs while inserting " + t + "\n\n" + r), o.checked = !1;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
y.add(t.subject, t.predicate, t.object, t.why), _();
|
|
48
|
+
});
|
|
49
|
+
} catch (e) {
|
|
50
|
+
c.error("Data write fails:" + e), c.alert("Data write fails:" + e), o.checked = !1, s.className = "question";
|
|
51
|
+
}
|
|
52
|
+
else try {
|
|
53
|
+
v.UserInput.sparqler.delete_statement(t, function(e, n, r) {
|
|
54
|
+
s.className = "question", n ? (y.removeMany(t.subject, t.predicate, t.object, t.why), _()) : (c.alert("Error occurs while deleting " + t + "\n\n" + r), o.checked = !0);
|
|
55
|
+
});
|
|
56
|
+
} catch (e) {
|
|
57
|
+
c.alert("Delete fails:" + e), o.checked = !0;
|
|
58
|
+
}
|
|
59
|
+
}, !1), i;
|
|
60
|
+
}, v = d.getOutliner(p), y = d.session.store, b = p.createElement("div");
|
|
61
|
+
b.classList.add("social-pane", "flex-column", "gap-xxs"), ee(b, d);
|
|
62
|
+
let x = l.foaf, se = l.vcard, S = f.currentUser(), ce = S ? S.uri : null, C = S && y.sameThings(S, s), w = x("knows"), le = y.anyValue(s, x("givenname")) || y.anyValue(s, x("firstName")) || y.anyValue(s, x("nick")) || y.anyValue(s, x("name")) || y.anyValue(s, se("fn")), T = m(y.each(s, w)), ue = S ? m(y.each(S, x("knows"))) : [], E = S && !C ? m(te(T, ue)).filter((e) => !y.sameThings(e, S)) : [], de = S && !C ? E.length : null, D = ie(s, S), O = null, k = !1, A = !1, j = !1, fe = b.appendChild(p.createElement("div"));
|
|
63
|
+
fe.className = "social-layout";
|
|
64
|
+
let M = fe.appendChild(p.createElement("div"));
|
|
65
|
+
M.className = "social-primary";
|
|
66
|
+
let N = M.appendChild(p.createElement("div"));
|
|
67
|
+
N.classList.add("social-primary__tabs", "flex-center"), N.setAttribute("role", "tablist"), N.setAttribute("aria-label", "Social sections");
|
|
68
|
+
let P = N.appendChild(p.createElement("button"));
|
|
69
|
+
P.className = "social-primary__tab", P.type = "button", P.id = "social-tab-all-friends", P.textContent = "All Friends", P.setAttribute("role", "tab"), P.setAttribute("aria-controls", "social-panel-all-friends"), P.setAttribute("aria-selected", "true"), P.tabIndex = 0;
|
|
70
|
+
let F = N.appendChild(p.createElement("button"));
|
|
71
|
+
if (F.className = "social-primary__tab", F.type = "button", F.id = "social-tab-mutual", F.textContent = "Mutual", F.setAttribute("role", "tab"), F.setAttribute("aria-controls", "social-panel-mutual"), F.setAttribute("aria-selected", "false"), F.tabIndex = -1, S) {
|
|
72
|
+
let e = y.each(void 0, x("primaryTopic"), S), t = "";
|
|
73
|
+
for (let n = 0; n < e.length; n++) if (y.whether(e[n], l.rdf("type"), x("PersonalProfileDocument"))) {
|
|
74
|
+
let r = e[n];
|
|
75
|
+
if (k = v.UserInput.sparqler.editable(r.uri, y), !k) t += "Your profile <" + u.escapeForXML(r.uri) + "> is not remotely editable.";
|
|
76
|
+
else {
|
|
77
|
+
O = r;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!C) {
|
|
82
|
+
let e = y.canon(S);
|
|
83
|
+
A = y.whether(s, w, e), j = !1;
|
|
84
|
+
let t = y.statementsMatching(e, w, s);
|
|
85
|
+
t.length && (j = !0, O ||= t[0].why);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
let I = (e) => e === "authenticated" && !C && !j, pe = D === "owner" && k, me = D === "authenticated" && !C && k && !!O, he = pe, L = {
|
|
89
|
+
canEdit: pe,
|
|
90
|
+
viewerMode: D,
|
|
91
|
+
showAddFriendAction: I(D)
|
|
92
|
+
}, R = n(d, s, L, {
|
|
93
|
+
friendCount: T.length,
|
|
94
|
+
mutualFriendCount: de,
|
|
95
|
+
onSelectFriends: function() {
|
|
96
|
+
Q("all-friends");
|
|
97
|
+
},
|
|
98
|
+
onSelectMutual: typeof de == "number" ? function() {
|
|
99
|
+
Q("mutual");
|
|
100
|
+
} : void 0
|
|
101
|
+
}, function() {
|
|
102
|
+
return re(d, s);
|
|
103
|
+
});
|
|
104
|
+
R.classList.add("social-pane__header-section", "flex-column"), b.prepend(R);
|
|
105
|
+
let z = /* @__PURE__ */ new Map();
|
|
106
|
+
(function(e) {
|
|
107
|
+
let t = /* @__PURE__ */ new Map();
|
|
108
|
+
e.forEach((e) => {
|
|
109
|
+
!e?.value || e.value === s.value || t.set(e.value, g(y, e));
|
|
110
|
+
}), z.clear(), t.forEach((e, t) => {
|
|
111
|
+
z.set(t, e);
|
|
112
|
+
});
|
|
113
|
+
})(T);
|
|
114
|
+
let B = function(t, n) {
|
|
115
|
+
let r = z.get(t.value) || g(y, t);
|
|
116
|
+
z.set(t.value, r);
|
|
117
|
+
let i = n.createElement("div"), a = [r.jobTitle, r.organization].filter(Boolean).join(" | ");
|
|
118
|
+
if (a) {
|
|
119
|
+
let e = i.appendChild(n.createElement("div"));
|
|
120
|
+
e.className = "social-friend-job-org", e.textContent = a;
|
|
121
|
+
}
|
|
122
|
+
if (r.location) {
|
|
123
|
+
let t = i.appendChild(n.createElement("div"));
|
|
124
|
+
t.className = "social-friend-location", t.innerHTML = `${e} ${r.location}`;
|
|
125
|
+
}
|
|
126
|
+
return i.childNodes.length ? i : null;
|
|
127
|
+
}, V = function(e, t) {
|
|
128
|
+
let n = z.get(e.value) || g(y, e);
|
|
129
|
+
z.set(e.value, n);
|
|
130
|
+
let r = n.pronouns;
|
|
131
|
+
if (!r) return null;
|
|
132
|
+
let i = t.createElement("span");
|
|
133
|
+
return i.className = "social-friend-pronouns", i.textContent = `(${r})`, i;
|
|
134
|
+
}, H = S && !C ? r({
|
|
135
|
+
dom: p,
|
|
136
|
+
subject: s,
|
|
137
|
+
familiar: le,
|
|
138
|
+
me: S,
|
|
139
|
+
meUri: ce,
|
|
140
|
+
incoming: A,
|
|
141
|
+
outgoing: j,
|
|
142
|
+
editable: me,
|
|
143
|
+
profile: O,
|
|
144
|
+
knows: w,
|
|
145
|
+
mutualConnections: E,
|
|
146
|
+
link: h,
|
|
147
|
+
text: ae,
|
|
148
|
+
buildCheckboxForm: oe,
|
|
149
|
+
renderSupportingInfo: B,
|
|
150
|
+
renderNameSuffix: V
|
|
151
|
+
}) : {
|
|
152
|
+
section: p.createElement("section"),
|
|
153
|
+
content: p.createElement("div"),
|
|
154
|
+
refreshMutualFriends: function() {}
|
|
155
|
+
}, U = H.section, W = H.content;
|
|
156
|
+
U.className || (U.className = "social-pane__mutual-friends social-primary__panel", U.id = "social-panel-mutual", U.setAttribute("role", "tabpanel"), U.setAttribute("aria-labelledby", "social-tab-mutual"), W.className = "social-main social-main--mutual", U.appendChild(W)), M.appendChild(U);
|
|
157
|
+
let ge = t({
|
|
158
|
+
dom: p,
|
|
159
|
+
subject: s,
|
|
160
|
+
profile: he ? O : null,
|
|
161
|
+
editable: he,
|
|
162
|
+
renderSupportingInfo: B,
|
|
163
|
+
renderNameSuffix: V
|
|
164
|
+
}), G = ge.section, _e = ge.friendsList;
|
|
165
|
+
M.appendChild(G);
|
|
166
|
+
let K = o(y, s), q = i({
|
|
167
|
+
dom: p,
|
|
168
|
+
triage: K,
|
|
169
|
+
renderSupportingInfo: B,
|
|
170
|
+
renderNameSuffix: V
|
|
171
|
+
}), J = q.section;
|
|
172
|
+
M.appendChild(J);
|
|
173
|
+
let Y = N.appendChild(p.createElement("button"));
|
|
174
|
+
Y.className = "social-primary__tab", Y.type = "button", Y.id = "social-tab-requests", Y.textContent = "Requests", Y.setAttribute("role", "tab"), Y.setAttribute("aria-controls", "social-panel-requests"), Y.setAttribute("aria-selected", "false"), Y.tabIndex = -1;
|
|
175
|
+
let X = "all-friends", Z = D === "owner", Q = function(e) {
|
|
176
|
+
X = e;
|
|
177
|
+
let t = e === "mutual", n = e === "all-friends", r = Z && e === "requests";
|
|
178
|
+
F.classList.toggle("social-primary__tab--active", t), F.setAttribute("aria-selected", String(t)), F.tabIndex = t ? 0 : -1, P.classList.toggle("social-primary__tab--active", n), P.setAttribute("aria-selected", String(n)), P.tabIndex = n ? 0 : -1, Y.classList.toggle("social-primary__tab--active", r), Y.setAttribute("aria-selected", String(r)), Y.tabIndex = r ? 0 : -1, U.classList.toggle("social-primary__panel--active", t), U.setAttribute("aria-hidden", String(!t)), G.classList.toggle("social-primary__panel--active", n), G.setAttribute("aria-hidden", String(!n)), J.classList.toggle("social-primary__panel--active", r), J.setAttribute("aria-hidden", String(!r)), J.hidden = !Z || !r;
|
|
179
|
+
}, ve = function() {
|
|
180
|
+
if (!S || C) return;
|
|
181
|
+
let e = y.canon(S);
|
|
182
|
+
A = y.whether(s, w, e), j = y.statementsMatching(e, w, s).length > 0;
|
|
183
|
+
let t = r({
|
|
184
|
+
dom: p,
|
|
185
|
+
subject: s,
|
|
186
|
+
familiar: le,
|
|
187
|
+
me: S,
|
|
188
|
+
meUri: ce,
|
|
189
|
+
incoming: A,
|
|
190
|
+
outgoing: j,
|
|
191
|
+
editable: me,
|
|
192
|
+
profile: O,
|
|
193
|
+
knows: w,
|
|
194
|
+
mutualConnections: E,
|
|
195
|
+
link: h,
|
|
196
|
+
text: ae,
|
|
197
|
+
buildCheckboxForm: oe,
|
|
198
|
+
renderSupportingInfo: B,
|
|
199
|
+
renderNameSuffix: V
|
|
200
|
+
});
|
|
201
|
+
U.replaceWith(t.section), H = t, U = t.section, W = t.content;
|
|
202
|
+
};
|
|
203
|
+
_ = function() {
|
|
204
|
+
ve(), L = {
|
|
205
|
+
...L,
|
|
206
|
+
showAddFriendAction: I(L.viewerMode)
|
|
207
|
+
}, R.refreshSocialHeader?.(L), K = o(y, s), q.refreshRequests(K), Q(X);
|
|
208
|
+
}, Q("all-friends");
|
|
209
|
+
let $ = function(e) {
|
|
210
|
+
let t = e === "authenticated" && !C;
|
|
211
|
+
if (Z = e === "owner", F.hidden = !t, Y.hidden = !Z, !Z && X === "requests") {
|
|
212
|
+
Q("all-friends");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
Q("all-friends");
|
|
216
|
+
};
|
|
217
|
+
F.addEventListener("click", function() {
|
|
218
|
+
Q("mutual");
|
|
219
|
+
}), P.addEventListener("click", function() {
|
|
220
|
+
Q("all-friends");
|
|
221
|
+
}), Y.addEventListener("click", function() {
|
|
222
|
+
Q("requests");
|
|
223
|
+
});
|
|
224
|
+
let ye = function() {
|
|
225
|
+
let e = _e.refresh;
|
|
226
|
+
typeof e == "function" && e.call(_e);
|
|
227
|
+
}, be = function() {
|
|
228
|
+
H.refreshMutualFriends();
|
|
229
|
+
};
|
|
230
|
+
return (async () => {
|
|
231
|
+
try {
|
|
232
|
+
for await (let e of ne(d, s)) z.clear(), e.forEach((e) => {
|
|
233
|
+
z.set(e.url, e);
|
|
234
|
+
}), ye(), be();
|
|
235
|
+
} catch {}
|
|
236
|
+
})(), (async () => {
|
|
237
|
+
try {
|
|
238
|
+
K = await a(d, s), q.refreshRequests(K), ye(), be();
|
|
239
|
+
} catch {}
|
|
240
|
+
})(), $("anonymous"), f.checkUser().then((e) => {
|
|
241
|
+
let t = ie(s, e);
|
|
242
|
+
$(t);
|
|
243
|
+
let n = t === "owner" && k;
|
|
244
|
+
L = {
|
|
245
|
+
...L,
|
|
246
|
+
canEdit: n,
|
|
247
|
+
viewerMode: t,
|
|
248
|
+
showAddFriendAction: I(t)
|
|
249
|
+
}, R.refreshSocialHeader?.(L);
|
|
250
|
+
}).catch(() => {
|
|
251
|
+
$("anonymous"), L = {
|
|
252
|
+
...L,
|
|
253
|
+
canEdit: !1,
|
|
254
|
+
viewerMode: "anonymous",
|
|
255
|
+
showAddFriendAction: !1
|
|
256
|
+
}, R.refreshSocialHeader?.(L);
|
|
257
|
+
}), b;
|
|
258
|
+
}
|
|
259
|
+
}, te = 3;
|
|
260
|
+
function m(e, t) {
|
|
261
|
+
let n = e.anyJS(t, l.solid("preferredSubjectPronoun")) || "";
|
|
262
|
+
if (n) {
|
|
263
|
+
let r = e.anyJS(t, l.solid("preferredObjectPronoun"));
|
|
264
|
+
r && (n += "/" + r);
|
|
265
|
+
}
|
|
266
|
+
return n || "";
|
|
267
|
+
}
|
|
268
|
+
function h(e, t) {
|
|
269
|
+
return e && t ? `${t}, ${e}` : e || t || null;
|
|
270
|
+
}
|
|
271
|
+
function g(e, t) {
|
|
272
|
+
let n = e.anyValue(t, l.vcard("fn")) || e.anyValue(t, l.foaf("name")) || null, r = e.anyValue(t, l.vcard("nickname")) || e.anyValue(t, l.foaf("nick")) || null, i = e.anyValue(t, l.vcard("bday")) || null, a = d.findImage(t), o = e.anyValue(t, l.vcard("role")) || null, s = e.anyValue(t, l.vcard("organization-name")) || null, c = e.any(t, l.vcard("hasAddress")) || null, u = h(c == null ? null : e.anyValue(c, l.vcard("country-name")), c == null ? null : e.anyValue(c, l.vcard("locality"))), f = m(e, t);
|
|
273
|
+
return {
|
|
274
|
+
url: t.value,
|
|
275
|
+
imageUrl: a,
|
|
276
|
+
name: n,
|
|
277
|
+
nickname: r,
|
|
278
|
+
jobTitle: o,
|
|
279
|
+
organization: s,
|
|
280
|
+
birthdate: i,
|
|
281
|
+
location: u,
|
|
282
|
+
pronouns: f,
|
|
283
|
+
subjectNode: t
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
async function* ne(e, t, n = te) {
|
|
287
|
+
let r = e.session.store, i = r?.fetcher;
|
|
288
|
+
if (i && typeof i.load == "function") try {
|
|
289
|
+
await i.load(t.doc());
|
|
290
|
+
} catch {}
|
|
291
|
+
let a = /* @__PURE__ */ new Set(), o = r.each(t, l.foaf("knows"), null, t.doc()), s = [];
|
|
292
|
+
for (let e of o) {
|
|
293
|
+
let n = e?.value;
|
|
294
|
+
!n || a.has(n) || t.value === n || (a.add(n), s.push(e));
|
|
295
|
+
}
|
|
296
|
+
let c = [];
|
|
297
|
+
for (let e of s) {
|
|
298
|
+
if (i && typeof i.load == "function") try {
|
|
299
|
+
await i.load(e.doc());
|
|
300
|
+
} catch {}
|
|
301
|
+
c.push(g(r, e)), c.length % n === 0 && (yield [...c]);
|
|
302
|
+
}
|
|
303
|
+
c.length > 0 && c.length % n !== 0 && (yield [...c]);
|
|
304
|
+
}
|
|
305
|
+
function re(e, t) {
|
|
306
|
+
let n = e.session.store, r = n.anyValue(t, l.vcard("fn")) || n.anyValue(t, l.foaf("name")) || void 0, i = n.anyValue(t, l.vcard("nickname")) || n.anyValue(t, l.foaf("nick")) || void 0, a = n.anyValue(t, l.vcard("bday")) || void 0, o = d.findImage(t), s = n.anyValue(t, l.vcard("role")) || void 0, c = n.anyValue(t, l.vcard("organization-name")) || void 0, u = n.any(t, l.vcard("hasAddress")) || null, f = h(u == null ? void 0 : n.anyValue(u, l.vcard("country-name")), u == null ? void 0 : n.anyValue(u, l.vcard("locality"))), ee = m(n, t);
|
|
307
|
+
return {
|
|
308
|
+
url: t.value,
|
|
309
|
+
imageUrl: o,
|
|
310
|
+
name: r,
|
|
311
|
+
nickname: i,
|
|
312
|
+
jobTitle: s,
|
|
313
|
+
organization: c,
|
|
314
|
+
birthdate: a,
|
|
315
|
+
location: f,
|
|
316
|
+
pronouns: ee
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function ie(e, t = f.currentUser()) {
|
|
320
|
+
let n = typeof t == "string" ? t : typeof t == "object" && t && (t.value || t.uri) || null, r = "anonymous";
|
|
321
|
+
return n === e.value && (r = "owner"), n && n !== e.value && (r = "authenticated"), r;
|
|
322
|
+
}
|
|
323
|
+
//#endregion
|
|
324
|
+
export { m as pronounsAsText, re as selectProfileData, p as socialPane, ne as streamFriends };
|
|
325
|
+
|
|
326
|
+
//# sourceMappingURL=socialPane2.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socialPane2.esm.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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./icons.cjs.js");require("./editProfileDetails.cjs.js");let t=require("solid-ui"),n=require("rdflib"),r=require("profile-pane");function i(n,i,o,s,c){let l=n.dom;n.session.store;let u=l.createElement(`header`);u.className=`social-pane__header`;let d=o,f=function(){u.replaceChildren();let o=c(),f=l.createElement(`div`);f.className=`social-pane__header-content`;let p=l.createElement(`div`);if(p.className=`social-pane__header-actions profile__actions profile__heading-actions`,!d.canEdit&&d.viewerMode===`authenticated`&&d.showAddFriendAction){p.classList.add(`social-pane__header-actions--friend`);let e=(0,r.createAddMeToYourFriendsButton)(i,n);e.classList.add(`flex-center`),p.appendChild(e)}u.appendChild(f);let m=l.createElement(`div`);m.className=`social-pane__header-media`,f.appendChild(m),o&&m.appendChild(a(l,o.imageUrl,o.name));let h=l.createElement(`div`);h.className=`social-pane__header-details`,f.appendChild(h),p.childNodes.length>0&&f.appendChild(p);let g=l.createElement(`div`);g.classList.add(`social-pane__header-summary`,`flex-column`),h.appendChild(g);let _=o?.name||t.utils.label(i),v=l.createElement(`h1`);v.classList.add(`social-pane__header-name`),v.appendChild(l.createTextNode(_)),g.appendChild(v);let y=[o?.jobTitle,o?.organization].filter(Boolean).join(` | `);if(y){let e=l.createElement(`div`);e.className=`social-pane__header-job-org`,e.textContent=y,g.appendChild(e)}if(o?.location){let t=l.createElement(`div`);t.className=`social-pane__header-location`;let n=l.createElement(`span`);n.classList.add(`social-pane__header-location-icon`,`inline-flex-row`),n.innerHTML=e.locationIcon,t.appendChild(n),t.appendChild(l.createTextNode(o.location)),g.appendChild(t)}let b=l.createElement(`div`);b.className=`social-pane__header-stats`;let x=l.createElement(`button`);x.className=`social-pane__header-stat`,x.type=`button`;let S=l.createElement(`span`);if(S.className=`social-pane__header-stat-label`,S.textContent=`${s.friendCount} friend${s.friendCount===1?``:`s`}`,x.appendChild(S),s.onSelectFriends&&x.addEventListener(`click`,s.onSelectFriends),b.appendChild(x),typeof s.mutualFriendCount==`number`){let e=l.createElement(`button`);e.className=`social-pane__header-stat`,e.type=`button`;let t=l.createElement(`span`);t.className=`social-pane__header-stat-label`,t.textContent=`${s.mutualFriendCount} mutual friend${s.mutualFriendCount===1?``:`s`}`,e.appendChild(t),s.onSelectMutual&&e.addEventListener(`click`,s.onSelectMutual),b.appendChild(e)}g.appendChild(b)};return u.refreshSocialHeader=function(e){d=e,f()},f(),u}function a(t,n,r=``){if(n){let e=t.createElement(`img`);return e.className=`social-pane__header-hero`,e.src=n,e.alt=r,e.width=180,e.height=180,e.loading=`eager`,e}let i=t.createElement(`div`);i.className=`social-pane__header-hero-alt flex-center`,i.setAttribute(`role`,`img`),i.setAttribute(`aria-label`,r),i.tabIndex=0;let a=t.createElement(`span`);return a.classList.add(`social-pane__header-hero-icon`,`inline-flex-row`),a.innerHTML=e.personInCircleIcon,i.appendChild(a),i}function o(e){let{dom:r,subject:i,familiar:a,me:o,meUri:s,incoming:c,outgoing:l,editable:u,profile:d,knows:f,mutualConnections:p,link:m,text:h,buildCheckboxForm:g,renderSupportingInfo:_,renderNameSuffix:v}=e,y=function(){},b=r.createElement(`section`);b.className=`social-pane__mutual-friends social-primary__panel`,b.id=`social-panel-mutual`,b.setAttribute(`role`,`tabpanel`),b.setAttribute(`aria-labelledby`,`social-tab-mutual`);let x=b.appendChild(r.createElement(`div`));x.classList.add(`social-main`,`social-main--mutual`,`flex-column`);let S=r.createElement(`div`);S.classList.add(`social-mutual-summary`,`flex-column`),x.appendChild(S);let C=function(){let e=S.appendChild(r.createElement(`div`));return e.classList.add(`social-mutual-summary-line`),e},w=function(){let e=C();return e.appendChild(m(h(`You`),s)),e.appendChild(h(` and `)),e.appendChild(m(h(a),i.uri)),e};if(!c)if(!l)w().appendChild(h(` have not said you know each other.`));else{let e=C();e.appendChild(m(h(`You`),s)),e.appendChild(h(` know `)),e.appendChild(m(h(a),i.uri)),e.appendChild(h(` (unconfirmed).`))}else if(l)w().appendChild(h(` say you know each other.`));else{S.classList.add(`social-mutual-summary--confirm`);let e=S.appendChild(r.createElement(`div`));e.classList.add(`social-mutual-summary-line`),e.appendChild(m(h(a),i.uri)),e.appendChild(h(` knows `)),e.appendChild(m(h(`you`),s)),e.appendChild(h(` (unconfirmed).`))}if(c&&!l){let e=r.createElement(`span`);e.className=`social-mutual-confirm-prompt`,e.appendChild(h(`Confirm you know `)),e.appendChild(m(h(a),i.uri));let t=g(e,new n.Statement(o,f,i,d??void 0),!!l,{disabled:!u,disabledTitle:u?void 0:`Your profile is not editable`});t.classList.add(`social-mutual-checkbox-form`),x.appendChild(t)}if(p.length){let e=x.appendChild(r.createElement(`table`));e.className=`social-main social-friends-list social-friends-grid`;let n=function(e){return t.widgets.personTR(r,t.ns.foaf(`knows`),e,{renderSupportingInfo:_,renderNameSuffix:v})};y=function(){let r=[...p].sort((e,n)=>{let r=t.utils.label(e)||e.value,i=t.utils.label(n)||n.value;return r.localeCompare(i)});t.utils.syncTableToArray(e,r,n,function(e,t){return n(t)})},y()}return{section:b,content:x,refreshMutualFriends:y}}function s(e){let{dom:n,subject:r,profile:i,editable:a,renderSupportingInfo:o,renderNameSuffix:s}=e,c=n.createElement(`section`);c.className=`social-pane__all-friends social-primary__panel`,c.id=`social-panel-all-friends`,c.setAttribute(`role`,`tabpanel`),c.setAttribute(`aria-labelledby`,`social-tab-all-friends`);let l=c.appendChild(n.createElement(`table`));l.className=`social-main`;let u=t.widgets.attachmentList(n,r,l,{doc:i,modify:!!a,predicate:t.ns.foaf(`knows`),noun:`friend`,refreshOnDocumentLoad:!1,renderSupportingInfo:o,renderNameSuffix:s});u.classList.add(`social-friends-list`),u.style.marginTop=`0`;let d=u.querySelector(`tr`),f=d?.children?.[0],p=d?.children?.[1],m=n.createElement(`div`);if(m.classList.add(`social-friends-header-actions`),f instanceof HTMLTableCellElement){f.classList.add(`social-friends-header-dropzone-cell`);let e=n.createElement(`table`);e.className=`social-friends-header-dropzone`,e.setAttribute(`role`,`presentation`),e.appendChild(n.createElement(`tbody`)).appendChild(n.createElement(`tr`)).appendChild(f),m.appendChild(e)}else if(f instanceof HTMLElement){for(;f.firstChild;)m.appendChild(f.firstChild);f.remove()}let h=m.querySelectorAll(`button`);if(a&&h.length>0){h.forEach(e=>{e.setAttribute(`title`,`Drop friend here`),e.setAttribute(`aria-label`,`Drop friend here`),e.querySelectorAll(`img`).forEach(e=>{e.setAttribute(`title`,`Drop friend here`),e.setAttribute(`alt`,`Drop friend here`)})});let e=n.createElement(`div`);e.className=`social-friends-header-actions social-friends-header-actions--standalone`,e.appendChild(m);let t=n.createElement(`span`);t.className=`social-friends-header-hint`,t.textContent=`Drag a WebId on the target to add a friend.`,e.appendChild(t),c.prepend(e)}p instanceof HTMLTableCellElement&&(p.colSpan=2);let g=u.querySelector(`td table`);return g instanceof HTMLTableElement&&g.classList.add(`social-friends-grid`),{section:c,mainTable:l,friendsList:u}}function c(e){let{dom:n,triage:r,renderSupportingInfo:i,renderNameSuffix:a}=e,o=n.createElement(`section`);o.className=`social-pane__requests social-primary__panel`,o.id=`social-panel-requests`,o.setAttribute(`role`,`tabpanel`),o.setAttribute(`aria-labelledby`,`social-tab-requests`);let s=o.appendChild(n.createElement(`div`));s.classList.add(`social-main`,`social-main--requests`,`flex-column`);let c=s.appendChild(n.createElement(`p`));c.className=`social-requests__note`,c.textContent=`Best effort preview: this view only reflects profile documents that are currently loaded. A dedicated inbox would still be needed for complete request discovery.`;let l=function(e,t,r){let i=s.appendChild(n.createElement(`section`));i.classList.add(`social-requests__group`,`flex-column`);let a=i.appendChild(n.createElement(`div`));a.className=`social-requests__group-header`;let o=a.appendChild(n.createElement(`h2`));o.className=`social-requests__group-title`,o.textContent=e;let c=a.appendChild(n.createElement(`p`));c.className=`social-requests__group-description`,c.textContent=t;let l=i.appendChild(n.createElement(`p`));l.className=`social-requests__empty`,l.textContent=r;let u=i.appendChild(n.createElement(`table`));return u.className=`social-main social-friends-list social-friends-grid social-requests__table`,{empty:l,table:u}},u=l(`Incoming requests`,`People who say they know this profile, but have not been confirmed yet.`,`No incoming requests are visible from the currently loaded data.`),d=l(`Awaiting confirmation`,`People this profile knows who have not linked back yet.`,`Nothing is waiting for confirmation right now.`),f=function(e){return t.widgets.personTR(n,t.ns.foaf(`knows`),e,{renderSupportingInfo:i,renderNameSuffix:a})},p=function(e){return[...e].sort((e,n)=>{let r=t.utils.label(e)||e.value,i=t.utils.label(n)||n.value;return r.localeCompare(i)})},m=function(e,n){let r=p(n);e.empty.hidden=r.length>0,e.table.hidden=r.length===0,t.utils.syncTableToArray(e.table,r,f,function(e,t){return f(t)})},h=function(e){m(u,e.requests),m(d,e.unconfirmed)};return h(r),{section:o,refreshRequests:h}}exports.createAllFriendsSection=s,exports.createHeaderSection=i,exports.createMutualSection=o,exports.createRequestsSection=c;
|
|
2
|
+
//# sourceMappingURL=socialSections.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socialSections.cjs.js","names":[],"sources":["../../src/social/socialSections.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { createAddMeToYourFriendsButton } from 'profile-pane'\nimport { Statement, NamedNode } from 'rdflib'\nimport { ns, utils, widgets } from 'solid-ui'\nimport { appendProfileLinks } from './editProfileDetails'\nimport { locationIcon, personInCircleIcon as personInCircleIconSvg } from './icons'\nimport { FriendshipTriage } from './triage'\n\nexport type ViewerMode = 'owner' | 'authenticated' | 'anonymous'\n\nexport type HeaderControls = {\n canEdit: boolean,\n viewerMode: ViewerMode,\n showAddFriendAction?: boolean\n}\n\nexport type SocialHeaderElement = HTMLElement & {\n refreshSocialHeader?: (controls: HeaderControls) => void\n}\n\nexport type HeaderStats = {\n friendCount: number,\n mutualFriendCount: number | null,\n onSelectFriends?: () => void,\n onSelectMutual?: () => void\n}\n\nexport type HeaderProfileData = {\n imageUrl?: string,\n name?: string,\n jobTitle?: string,\n organization?: string,\n location?: string | null\n} | null\n\nexport type FriendRowRenderers = {\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}\n\nexport function createHeaderSection (\n context: DataBrowserContext,\n subject: NamedNode,\n controls: HeaderControls,\n stats: HeaderStats,\n getProfileData: () => HeaderProfileData\n): SocialHeaderElement {\n const dom = context.dom\n const kb = context.session.store\n const header = dom.createElement('header') as SocialHeaderElement\n header.className = 'social-pane__header'\n let headerControls = controls\n\n const renderHeader = function () {\n header.replaceChildren()\n const profileData = getProfileData()\n\n const headerContent = dom.createElement('div')\n headerContent.className = 'social-pane__header-content'\n\n const headerActions = dom.createElement('div')\n headerActions.className = 'social-pane__header-actions profile__actions profile__heading-actions'\n\n if (headerControls.canEdit) {\n // Hidden for now because the social pane header edit control does not match the new design.\n // Revisit later if we decide to restore profile-link editing here.\n } else if (headerControls.viewerMode === 'authenticated' && headerControls.showAddFriendAction) {\n headerActions.classList.add('social-pane__header-actions--friend')\n const addToFriendsButton = createAddMeToYourFriendsButton(subject, context)\n addToFriendsButton.classList.add('flex-center')\n headerActions.appendChild(addToFriendsButton)\n }\n\n header.appendChild(headerContent)\n\n const headerMedia = dom.createElement('div')\n headerMedia.className = 'social-pane__header-media'\n headerContent.appendChild(headerMedia)\n\n if (profileData) {\n headerMedia.appendChild(createImage(dom, profileData.imageUrl, profileData.name))\n }\n\n const headerDetails = dom.createElement('div')\n headerDetails.className = 'social-pane__header-details'\n headerContent.appendChild(headerDetails)\n\n if (headerActions.childNodes.length > 0) {\n headerContent.appendChild(headerActions)\n }\n\n const headerSummary = dom.createElement('div')\n headerSummary.classList.add('social-pane__header-summary', 'flex-column')\n headerDetails.appendChild(headerSummary)\n\n const name = profileData?.name || utils.label(subject)\n const h1 = dom.createElement('h1')\n h1.classList.add('social-pane__header-name')\n h1.appendChild(dom.createTextNode(name))\n headerSummary.appendChild(h1)\n\n const jobAndOrganization = [profileData?.jobTitle, profileData?.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = dom.createElement('div')\n jobLine.className = 'social-pane__header-job-org'\n jobLine.textContent = jobAndOrganization\n headerSummary.appendChild(jobLine)\n }\n\n if (profileData?.location) {\n const locationLine = dom.createElement('div')\n locationLine.className = 'social-pane__header-location'\n\n const locationIconSpan = dom.createElement('span')\n locationIconSpan.classList.add('social-pane__header-location-icon', 'inline-flex-row')\n locationIconSpan.innerHTML = locationIcon\n locationLine.appendChild(locationIconSpan)\n locationLine.appendChild(dom.createTextNode(profileData.location))\n\n headerSummary.appendChild(locationLine)\n }\n\n const statsRow = dom.createElement('div')\n statsRow.className = 'social-pane__header-stats'\n\n const friendCount = dom.createElement('button')\n friendCount.className = 'social-pane__header-stat'\n friendCount.type = 'button'\n const friendCountLabel = dom.createElement('span')\n friendCountLabel.className = 'social-pane__header-stat-label'\n friendCountLabel.textContent = `${stats.friendCount} friend${stats.friendCount === 1 ? '' : 's'}`\n friendCount.appendChild(friendCountLabel)\n if (stats.onSelectFriends) {\n friendCount.addEventListener('click', stats.onSelectFriends)\n }\n statsRow.appendChild(friendCount)\n\n if (typeof stats.mutualFriendCount === 'number') {\n const mutualCount = dom.createElement('button')\n mutualCount.className = 'social-pane__header-stat'\n mutualCount.type = 'button'\n const mutualCountLabel = dom.createElement('span')\n mutualCountLabel.className = 'social-pane__header-stat-label'\n mutualCountLabel.textContent = `${stats.mutualFriendCount} mutual friend${stats.mutualFriendCount === 1 ? '' : 's'}`\n mutualCount.appendChild(mutualCountLabel)\n if (stats.onSelectMutual) {\n mutualCount.addEventListener('click', stats.onSelectMutual)\n }\n statsRow.appendChild(mutualCount)\n }\n\n headerSummary.appendChild(statsRow)\n appendProfileLinks(headerMedia, dom, kb, subject)\n }\n\n header.refreshSocialHeader = function (nextControls: HeaderControls) {\n headerControls = nextControls\n renderHeader()\n }\n\n renderHeader()\n\n return header\n}\n\nfunction createImage (dom: HTMLDocument, src: string | null | undefined, alt = ''): HTMLElement {\n if (src) {\n const img = dom.createElement('img')\n img.className = 'social-pane__header-hero'\n img.src = src\n img.alt = alt\n img.width = 180\n img.height = 180\n img.loading = 'eager'\n return img\n }\n\n const fallback = dom.createElement('div')\n fallback.className = 'social-pane__header-hero-alt flex-center'\n fallback.setAttribute('role', 'img')\n fallback.setAttribute('aria-label', alt)\n fallback.tabIndex = 0\n\n const icon = dom.createElement('span')\n icon.classList.add('social-pane__header-hero-icon', 'inline-flex-row')\n icon.innerHTML = personInCircleIconSvg\n fallback.appendChild(icon)\n\n return fallback\n}\n\nexport function createMutualSection (options: {\n dom: HTMLDocument,\n subject: NamedNode,\n familiar: string,\n me: NamedNode,\n meUri: string | null,\n incoming: boolean | NamedNode[] | undefined,\n outgoing: boolean | NamedNode[] | undefined,\n editable: boolean,\n profile: NamedNode | null,\n knows: NamedNode,\n mutualConnections: NamedNode[],\n link: (contents: Node, uri: string | null | undefined) => Node,\n text: (value: string) => Text,\n buildCheckboxForm: (\n label: string | Node,\n statement: Statement,\n state: boolean,\n options?: { disabled?: boolean, disabledTitle?: string }\n ) => HTMLElement,\n renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'],\n renderNameSuffix: FriendRowRenderers['renderNameSuffix']\n}): { section: HTMLElement, content: HTMLElement, refreshMutualFriends: () => void } {\n const {\n dom,\n subject,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n } = options\n\n let refreshMutualFriends = function () {}\n\n const mutualSection = dom.createElement('section')\n mutualSection.className = 'social-pane__mutual-friends social-primary__panel'\n mutualSection.id = 'social-panel-mutual'\n mutualSection.setAttribute('role', 'tabpanel')\n mutualSection.setAttribute('aria-labelledby', 'social-tab-mutual')\n\n const mutualContent = mutualSection.appendChild(dom.createElement('div'))\n mutualContent.classList.add('social-main', 'social-main--mutual', 'flex-column')\n\n const relationshipSummary = dom.createElement('div')\n relationshipSummary.classList.add('social-mutual-summary', 'flex-column')\n mutualContent.appendChild(relationshipSummary)\n\n const createRelationshipLine = function () {\n const line = relationshipSummary.appendChild(dom.createElement('div'))\n line.classList.add('social-mutual-summary-line')\n return line\n }\n\n const youAndThem = function () {\n const line = createRelationshipLine()\n line.appendChild(link(text('You'), meUri))\n line.appendChild(text(' and '))\n line.appendChild(link(text(familiar), subject.uri))\n return line\n }\n\n if (!incoming) {\n if (!outgoing) {\n const line = youAndThem()\n line.appendChild(text(' have not said you know each other.'))\n } else {\n const line = createRelationshipLine()\n line.appendChild(link(text('You'), meUri))\n line.appendChild(text(' know '))\n line.appendChild(link(text(familiar), subject.uri))\n line.appendChild(text(' (unconfirmed).'))\n }\n } else if (!outgoing) {\n relationshipSummary.classList.add('social-mutual-summary--confirm')\n\n const incomingLine = relationshipSummary.appendChild(dom.createElement('div'))\n incomingLine.classList.add('social-mutual-summary-line')\n incomingLine.appendChild(link(text(familiar), subject.uri))\n incomingLine.appendChild(text(' knows '))\n incomingLine.appendChild(link(text('you'), meUri))\n incomingLine.appendChild(text(' (unconfirmed).'))\n } else {\n const line = youAndThem()\n line.appendChild(text(' say you know each other.'))\n }\n\n const shouldShowCheckboxPreview = Boolean(incoming) && !outgoing\n if (shouldShowCheckboxPreview) {\n const confirmLabel = dom.createElement('span')\n confirmLabel.className = 'social-mutual-confirm-prompt'\n confirmLabel.appendChild(text('Confirm you know '))\n confirmLabel.appendChild(link(text(familiar), subject.uri))\n\n const relationshipForm = buildCheckboxForm(\n confirmLabel,\n new Statement(me, knows, subject, profile ?? undefined),\n Boolean(outgoing),\n {\n disabled: !editable,\n disabledTitle: !editable ? 'Your profile is not editable' : undefined\n }\n )\n relationshipForm.classList.add('social-mutual-checkbox-form')\n\n mutualContent.appendChild(relationshipForm)\n }\n\n if (mutualConnections.length) {\n const mutualFriendsTable = mutualContent.appendChild(dom.createElement('table'))\n mutualFriendsTable.className = 'social-main social-friends-list social-friends-grid'\n\n const createMutualRow = function (target: NamedNode) {\n return widgets.personTR(dom, ns.foaf('knows'), target, {\n renderSupportingInfo,\n renderNameSuffix\n })\n }\n\n refreshMutualFriends = function () {\n const sortedMutualConnections = [...mutualConnections].sort((left, right) => {\n const leftLabel = utils.label(left) || left.value\n const rightLabel = utils.label(right) || right.value\n return leftLabel.localeCompare(rightLabel)\n })\n\n utils.syncTableToArray(\n mutualFriendsTable,\n sortedMutualConnections,\n createMutualRow,\n function (row, thing) {\n const replacement = createMutualRow(thing)\n return replacement\n }\n )\n }\n\n refreshMutualFriends()\n }\n\n return { section: mutualSection, content: mutualContent, refreshMutualFriends }\n}\n\nexport function createAllFriendsSection (options: {\n dom: HTMLDocument,\n subject: NamedNode,\n profile: NamedNode | null,\n editable: boolean,\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}): { section: HTMLElement, mainTable: HTMLTableElement, friendsList: HTMLElement } {\n const { dom, subject, profile, editable, renderSupportingInfo, renderNameSuffix } = options\n\n const allFriends = dom.createElement('section')\n allFriends.className = 'social-pane__all-friends social-primary__panel'\n allFriends.id = 'social-panel-all-friends'\n allFriends.setAttribute('role', 'tabpanel')\n allFriends.setAttribute('aria-labelledby', 'social-tab-all-friends')\n\n const mainTable = allFriends.appendChild(dom.createElement('table'))\n mainTable.className = 'social-main'\n\n const friendsList = widgets.attachmentList(dom, subject, mainTable, {\n doc: profile,\n modify: !!editable,\n predicate: ns.foaf('knows'),\n noun: 'friend',\n // Social pane already owns the async refresh cycle for friend data in\n // socialPane.ts. Leave attachmentList's generic follow-up rerender disabled\n // here or each fetched friend profile will trigger an extra whole-table refresh\n // on top of the pane's own batched updates.\n refreshOnDocumentLoad: false,\n renderSupportingInfo,\n renderNameSuffix\n })\n friendsList.classList.add('social-friends-list')\n friendsList.style.marginTop = '0'\n\n const friendsListRow = friendsList.querySelector('tr')\n const friendsListPromptCell = friendsListRow?.children?.[0]\n const friendsListRightCell = friendsListRow?.children?.[1]\n const friendsHeaderActions = dom.createElement('div')\n friendsHeaderActions.classList.add('social-friends-header-actions')\n\n if (friendsListPromptCell instanceof HTMLTableCellElement) {\n friendsListPromptCell.classList.add('social-friends-header-dropzone-cell')\n const friendsHeaderDropzone = dom.createElement('table')\n friendsHeaderDropzone.className = 'social-friends-header-dropzone'\n friendsHeaderDropzone.setAttribute('role', 'presentation')\n const friendsHeaderDropzoneBody = friendsHeaderDropzone.appendChild(dom.createElement('tbody'))\n const friendsHeaderDropzoneRow = friendsHeaderDropzoneBody.appendChild(dom.createElement('tr'))\n friendsHeaderDropzoneRow.appendChild(friendsListPromptCell)\n friendsHeaderActions.appendChild(friendsHeaderDropzone)\n } else if (friendsListPromptCell instanceof HTMLElement) {\n while (friendsListPromptCell.firstChild) {\n friendsHeaderActions.appendChild(friendsListPromptCell.firstChild)\n }\n friendsListPromptCell.remove()\n }\n\n const friendDropButtons = friendsHeaderActions.querySelectorAll('button')\n if (editable && friendDropButtons.length > 0) {\n friendDropButtons.forEach((button) => {\n button.setAttribute('title', 'Drop friend here')\n button.setAttribute('aria-label', 'Drop friend here')\n const buttonImages = button.querySelectorAll('img')\n buttonImages.forEach((image) => {\n image.setAttribute('title', 'Drop friend here')\n image.setAttribute('alt', 'Drop friend here')\n })\n })\n\n const friendsActionsRow = dom.createElement('div')\n friendsActionsRow.className = 'social-friends-header-actions social-friends-header-actions--standalone'\n friendsActionsRow.appendChild(friendsHeaderActions)\n const dropHint = dom.createElement('span')\n dropHint.className = 'social-friends-header-hint'\n dropHint.textContent = 'Drag a WebId on the target to add a friend.'\n friendsActionsRow.appendChild(dropHint)\n allFriends.prepend(friendsActionsRow)\n }\n\n if (friendsListRightCell instanceof HTMLTableCellElement) {\n friendsListRightCell.colSpan = 2\n }\n\n const friendsItemsTable = friendsList.querySelector('td table')\n if (friendsItemsTable instanceof HTMLTableElement) {\n friendsItemsTable.classList.add('social-friends-grid')\n }\n\n return { section: allFriends, mainTable, friendsList }\n}\n\nexport function createRequestsSection (options: {\n dom: HTMLDocument,\n triage: FriendshipTriage,\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}): { section: HTMLElement, refreshRequests: (triage: FriendshipTriage) => void } {\n const { dom, triage, renderSupportingInfo, renderNameSuffix } = options\n\n const requestsSection = dom.createElement('section')\n requestsSection.className = 'social-pane__requests social-primary__panel'\n requestsSection.id = 'social-panel-requests'\n requestsSection.setAttribute('role', 'tabpanel')\n requestsSection.setAttribute('aria-labelledby', 'social-tab-requests')\n\n const requestsContent = requestsSection.appendChild(dom.createElement('div'))\n requestsContent.classList.add('social-main', 'social-main--requests', 'flex-column')\n\n const note = requestsContent.appendChild(dom.createElement('p'))\n note.className = 'social-requests__note'\n note.textContent = 'Best effort preview: this view only reflects profile documents that are currently loaded. A dedicated inbox would still be needed for complete request discovery.'\n\n const createRequestGroup = function (title: string, description: string, emptyText: string) {\n const group = requestsContent.appendChild(dom.createElement('section'))\n group.classList.add('social-requests__group', 'flex-column')\n\n const header = group.appendChild(dom.createElement('div'))\n header.className = 'social-requests__group-header'\n\n const heading = header.appendChild(dom.createElement('h2'))\n heading.className = 'social-requests__group-title'\n heading.textContent = title\n\n const blurb = header.appendChild(dom.createElement('p'))\n blurb.className = 'social-requests__group-description'\n blurb.textContent = description\n\n const empty = group.appendChild(dom.createElement('p'))\n empty.className = 'social-requests__empty'\n empty.textContent = emptyText\n\n const table = group.appendChild(dom.createElement('table'))\n table.className = 'social-main social-friends-list social-friends-grid social-requests__table'\n\n return { empty, table }\n }\n\n const incomingGroup = createRequestGroup(\n 'Incoming requests',\n 'People who say they know this profile, but have not been confirmed yet.',\n 'No incoming requests are visible from the currently loaded data.'\n )\n const pendingGroup = createRequestGroup(\n 'Awaiting confirmation',\n 'People this profile knows who have not linked back yet.',\n 'Nothing is waiting for confirmation right now.'\n )\n\n const createPersonRow = function (target: NamedNode) {\n return widgets.personTR(dom, ns.foaf('knows'), target, {\n renderSupportingInfo,\n renderNameSuffix\n })\n }\n\n const sortNodes = function (nodes: NamedNode[]) {\n return [...nodes].sort((left, right) => {\n const leftLabel = utils.label(left) || left.value\n const rightLabel = utils.label(right) || right.value\n return leftLabel.localeCompare(rightLabel)\n })\n }\n\n const syncRequestGroup = function (\n group: { empty: HTMLElement, table: HTMLTableElement },\n nodes: NamedNode[]\n ) {\n const sortedNodes = sortNodes(nodes)\n group.empty.hidden = sortedNodes.length > 0\n group.table.hidden = sortedNodes.length === 0\n\n utils.syncTableToArray(\n group.table,\n sortedNodes,\n createPersonRow,\n function (_row, thing) {\n return createPersonRow(thing)\n }\n )\n }\n\n const refreshRequests = function (nextTriage: FriendshipTriage) {\n syncRequestGroup(incomingGroup, nextTriage.requests)\n syncRequestGroup(pendingGroup, nextTriage.unconfirmed)\n }\n\n refreshRequests(triage)\n\n return { section: requestsSection, refreshRequests }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DataBrowserContext } from 'pane-registry';
|
|
2
|
-
import { Statement, NamedNode } from 'rdflib';
|
|
1
|
+
import { DataBrowserContext } from '../../node_modules/pane-registry';
|
|
2
|
+
import { Statement, NamedNode } from '../../node_modules/rdflib';
|
|
3
3
|
import { FriendshipTriage } from './triage';
|
|
4
4
|
export type ViewerMode = 'owner' | 'authenticated' | 'anonymous';
|
|
5
5
|
export type HeaderControls = {
|