solid-panes 5.0.0 → 5.1.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -2
- package/dist/RDFXMLPane2.cjs.js.map +1 -1
- package/dist/_virtual/~icons/lucide/cake.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/cake.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/cake.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/cake.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/camera.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/camera.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/camera.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/camera.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/circle-user-round.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/circle-user-round.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/circle-user-round.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/circle-user-round.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/mail.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/mail.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/mail.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/mail.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/map-pin.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/map-pin.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/map-pin.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/map-pin.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/phone.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/phone.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/phone.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/phone.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/user-round-plus.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/user-round-plus.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/user-round-plus.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/user-round-plus.esm.js.map +1 -0
- package/dist/_virtual/~icons/lucide/x.cjs.js +2 -0
- package/dist/_virtual/~icons/lucide/x.cjs.js.map +1 -0
- package/dist/_virtual/~icons/lucide/x.esm.js +11 -0
- package/dist/_virtual/~icons/lucide/x.esm.js.map +1 -0
- package/dist/audio/audioPane.cjs.js +1 -1
- package/dist/audio/audioPane.cjs.js.map +1 -1
- package/dist/audio/audioPane.esm.js +1 -5
- package/dist/audio/audioPane.esm.js.map +1 -1
- package/dist/classInstancePane.cjs.js.map +1 -1
- package/dist/components/editor-card/EditorCard.cjs.js +1 -1
- package/dist/components/editor-card/EditorCard.cjs.js.map +1 -1
- package/dist/components/editor-card/EditorCard.esm.js +4 -7
- package/dist/components/editor-card/EditorCard.esm.js.map +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js.map +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeader.esm.js +2 -2
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js.map +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js +2 -2
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js.map +1 -1
- package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js +2 -2
- package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js +5 -5
- package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js.map +1 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.d.ts.map +1 -1
- package/dist/components/file-explorer-header/FileExplorerProvider.esm.js +97 -96
- package/dist/components/file-explorer-header/FileExplorerProvider.esm.js.map +1 -1
- package/dist/components/header/Header.cjs.js +1 -1
- package/dist/components/header/Header.cjs.js.map +1 -1
- package/dist/components/header/Header.esm.js +2 -2
- package/dist/components/header/Header.styles.cjs.js +1 -1
- package/dist/components/header/Header.styles.cjs.js.map +1 -1
- package/dist/components/header/Header.styles.esm.js +1 -1
- package/dist/components/header/Header.styles.esm.js.map +1 -1
- package/dist/components/navbar/Navbar.cjs.js +1 -1
- package/dist/components/navbar/Navbar.cjs.js.map +1 -1
- package/dist/components/navbar/Navbar.d.ts +2 -0
- package/dist/components/navbar/Navbar.d.ts.map +1 -1
- package/dist/components/navbar/Navbar.esm.js +2 -2
- package/dist/components/navbar/Navbar.esm.js.map +1 -1
- package/dist/components/navbar/Navbar.styles.cjs.js +1 -1
- package/dist/components/navbar/Navbar.styles.cjs.js.map +1 -1
- package/dist/components/navbar/Navbar.styles.esm.js +1 -1
- package/dist/components/navbar/Navbar.styles.esm.js.map +1 -1
- package/dist/components/profile-heading/ProfileHeading.cjs.js +95 -0
- package/dist/components/profile-heading/ProfileHeading.cjs.js.map +1 -0
- package/dist/components/profile-heading/ProfileHeading.d.ts +45 -0
- package/dist/components/profile-heading/ProfileHeading.d.ts.map +1 -0
- package/dist/components/profile-heading/ProfileHeading.esm.js +480 -0
- package/dist/components/profile-heading/ProfileHeading.esm.js.map +1 -0
- package/dist/components/profile-heading/ProfileHeading.styles.cjs.js +2 -0
- package/dist/components/profile-heading/ProfileHeading.styles.cjs.js.map +1 -0
- package/dist/components/profile-heading/ProfileHeading.styles.esm.js +7 -0
- package/dist/components/profile-heading/ProfileHeading.styles.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/index.d.ts +3 -0
- package/dist/components/profile-heading/editor/index.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/contactInfo/types.d.ts +44 -0
- package/dist/components/profile-heading/editor/sections/contactInfo/types.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.cjs.js +297 -0
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.d.ts +5 -0
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.esm.js +642 -0
- package/dist/components/profile-heading/editor/sections/heading/HeadingEditDialog.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.d.ts +4 -0
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.esm.js +16 -0
- package/dist/components/profile-heading/editor/sections/heading/dateHelpers.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.d.ts +5 -0
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.esm.js +76 -0
- package/dist/components/profile-heading/editor/sections/heading/imageHelpers.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.cjs.js +19 -0
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.d.ts +2 -0
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.esm.js +28 -0
- package/dist/components/profile-heading/editor/sections/heading/imagePreview.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/mutations.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/heading/mutations.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/mutations.d.ts +4 -0
- package/dist/components/profile-heading/editor/sections/heading/mutations.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/mutations.esm.js +151 -0
- package/dist/components/profile-heading/editor/sections/heading/mutations.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/heading/types.d.ts +34 -0
- package/dist/components/profile-heading/editor/sections/heading/types.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.d.ts +7 -0
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.esm.js +20 -0
- package/dist/components/profile-heading/editor/sections/shared/contactTypeUtils.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.d.ts +3 -0
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.esm.js +11 -0
- package/dist/components/profile-heading/editor/sections/shared/idNodeFactory.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.d.ts +20 -0
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.esm.js +1291 -0
- package/dist/components/profile-heading/editor/sections/shared/phoneCountries.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.d.ts +45 -0
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.esm.js +211 -0
- package/dist/components/profile-heading/editor/sections/shared/rdfMutationHelpers.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/rowState.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/shared/rowState.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/rowState.d.ts +21 -0
- package/dist/components/profile-heading/editor/sections/shared/rowState.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/rowState.esm.js +18 -0
- package/dist/components/profile-heading/editor/sections/shared/rowState.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.cjs.js +2 -0
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.d.ts +5 -0
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.esm.js +18 -0
- package/dist/components/profile-heading/editor/sections/shared/sanitizeUtils.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/sections/shared/types.d.ts +31 -0
- package/dist/components/profile-heading/editor/sections/shared/types.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/textUtils.cjs.js +2 -0
- package/dist/components/profile-heading/editor/textUtils.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/textUtils.d.ts +6 -0
- package/dist/components/profile-heading/editor/textUtils.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/textUtils.esm.js +26 -0
- package/dist/components/profile-heading/editor/textUtils.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/texts/buttonTexts.d.ts +9 -0
- package/dist/components/profile-heading/editor/texts/buttonTexts.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/texts/dialogTexts.cjs.js +2 -0
- package/dist/components/profile-heading/editor/texts/dialogTexts.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/texts/dialogTexts.d.ts +14 -0
- package/dist/components/profile-heading/editor/texts/dialogTexts.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/texts/dialogTexts.esm.js +6 -0
- package/dist/components/profile-heading/editor/texts/dialogTexts.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/texts/messageTexts.cjs.js +2 -0
- package/dist/components/profile-heading/editor/texts/messageTexts.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/texts/messageTexts.d.ts +42 -0
- package/dist/components/profile-heading/editor/texts/messageTexts.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/texts/messageTexts.esm.js +6 -0
- package/dist/components/profile-heading/editor/texts/messageTexts.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/texts/profileTexts.d.ts +14 -0
- package/dist/components/profile-heading/editor/texts/profileTexts.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/texts/qrCodeTexts.d.ts +2 -0
- package/dist/components/profile-heading/editor/texts/qrCodeTexts.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/texts.d.ts +6 -0
- package/dist/components/profile-heading/editor/texts.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/ui/dialog.d.ts +41 -0
- package/dist/components/profile-heading/editor/ui/dialog.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/ui/dialog2.cjs.js +17 -0
- package/dist/components/profile-heading/editor/ui/dialog2.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/ui/dialog2.esm.js +263 -0
- package/dist/components/profile-heading/editor/ui/dialog2.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/ui/spinner.cjs.js +5 -0
- package/dist/components/profile-heading/editor/ui/spinner.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/ui/spinner.d.ts +3 -0
- package/dist/components/profile-heading/editor/ui/spinner.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/ui/spinner.esm.js +12 -0
- package/dist/components/profile-heading/editor/ui/spinner.esm.js.map +1 -0
- package/dist/components/profile-heading/editor/utils/errorDisplay.cjs.js +2 -0
- package/dist/components/profile-heading/editor/utils/errorDisplay.cjs.js.map +1 -0
- package/dist/components/profile-heading/editor/utils/errorDisplay.d.ts +2 -0
- package/dist/components/profile-heading/editor/utils/errorDisplay.d.ts.map +1 -0
- package/dist/components/profile-heading/editor/utils/errorDisplay.esm.js +18 -0
- package/dist/components/profile-heading/editor/utils/errorDisplay.esm.js.map +1 -0
- package/dist/components/profile-heading/friendActions.cjs.js +2 -0
- package/dist/components/profile-heading/friendActions.cjs.js.map +1 -0
- package/dist/components/profile-heading/friendActions.d.ts +11 -0
- package/dist/components/profile-heading/friendActions.d.ts.map +1 -0
- package/dist/components/profile-heading/friendActions.esm.js +32 -0
- package/dist/components/profile-heading/friendActions.esm.js.map +1 -0
- package/dist/components/profile-heading/index.cjs.js +1 -0
- package/dist/components/profile-heading/index.d.ts +5 -0
- package/dist/components/profile-heading/index.d.ts.map +1 -0
- package/dist/components/profile-heading/index.esm.js +1 -0
- package/dist/components/profile-heading/profileHeadingData.cjs.js +2 -0
- package/dist/components/profile-heading/profileHeadingData.cjs.js.map +1 -0
- package/dist/components/profile-heading/profileHeadingData.d.ts +6 -0
- package/dist/components/profile-heading/profileHeadingData.d.ts.map +1 -0
- package/dist/components/profile-heading/profileHeadingData.esm.js +81 -0
- package/dist/components/profile-heading/profileHeadingData.esm.js.map +1 -0
- package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js +1 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js.map +1 -1
- package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js +2 -2
- package/dist/dashboard/basicPreferences.cjs.js.map +1 -1
- package/dist/dashboard/dashboardPane.cjs.js.map +1 -1
- package/dist/dashboard/homepage.cjs.js.map +1 -1
- package/dist/dataContentPane2.cjs.js.map +1 -1
- package/dist/defaultPane2.cjs.js.map +1 -1
- package/dist/dokieli/dokieliPane.cjs.js.map +1 -1
- package/dist/form/pane.cjs.js.map +1 -1
- package/dist/home/homePane.cjs.js.map +1 -1
- package/dist/humanReadablePane2.cjs.js.map +1 -1
- package/dist/icons/folder.cjs.js.map +1 -1
- package/dist/icons/friends.cjs.js.map +1 -1
- package/dist/icons/person.cjs.js.map +1 -1
- package/dist/imagePane2.cjs.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +15 -14
- package/dist/index.esm.js.map +1 -1
- package/dist/internal/internalPane2.cjs.js +1 -1
- package/dist/internal/internalPane2.cjs.js.map +1 -1
- package/dist/internal/internalPane2.esm.js +2 -5
- package/dist/internal/internalPane2.esm.js.map +1 -1
- package/dist/mainPage/header.cjs.js +1 -1
- package/dist/mainPage/header.cjs.js.map +1 -1
- package/dist/mainPage/header.d.ts +2 -2
- package/dist/mainPage/header.d.ts.map +1 -1
- package/dist/mainPage/header.esm.js +48 -44
- package/dist/mainPage/header.esm.js.map +1 -1
- package/dist/mainPage/index.cjs.js +1 -1
- package/dist/mainPage/index.cjs.js.map +1 -1
- package/dist/mainPage/index.d.ts.map +1 -1
- package/dist/mainPage/index.esm.js +27 -21
- package/dist/mainPage/index.esm.js.map +1 -1
- package/dist/mainPage/navbar.cjs.js +1 -1
- package/dist/mainPage/navbar.cjs.js.map +1 -1
- package/dist/mainPage/navbar.d.ts +3 -2
- package/dist/mainPage/navbar.d.ts.map +1 -1
- package/dist/mainPage/navbar.esm.js +77 -42
- package/dist/mainPage/navbar.esm.js.map +1 -1
- package/dist/mainPage/navigation.cjs.js +2 -0
- package/dist/mainPage/navigation.cjs.js.map +1 -0
- package/dist/mainPage/navigation.d.ts +6 -0
- package/dist/mainPage/navigation.d.ts.map +1 -0
- package/dist/mainPage/navigation.esm.js +22 -0
- package/dist/mainPage/navigation.esm.js.map +1 -0
- package/dist/mainPage/profileHeading.d.ts +5 -0
- package/dist/mainPage/profileHeading.d.ts.map +1 -0
- package/dist/mainPage/profileHeading2.cjs.js +2 -0
- package/dist/mainPage/profileHeading2.cjs.js.map +1 -0
- package/dist/mainPage/profileHeading2.esm.js +158 -0
- package/dist/mainPage/profileHeading2.esm.js.map +1 -0
- package/dist/n3Pane2.cjs.js.map +1 -1
- package/dist/navigation/browserEvents.cjs.js +2 -0
- package/dist/navigation/browserEvents.cjs.js.map +1 -0
- package/dist/navigation/browserEvents.d.ts +15 -0
- package/dist/navigation/browserEvents.d.ts.map +1 -0
- package/dist/navigation/browserEvents.esm.js +32 -0
- package/dist/navigation/browserEvents.esm.js.map +1 -0
- package/dist/navigation/chrome.cjs.js +2 -0
- package/dist/navigation/chrome.cjs.js.map +1 -0
- package/dist/navigation/chrome.d.ts +69 -0
- package/dist/navigation/chrome.d.ts.map +1 -0
- package/dist/navigation/chrome.esm.js +43 -0
- package/dist/navigation/chrome.esm.js.map +1 -0
- package/dist/navigation/controller.cjs.js +2 -0
- package/dist/navigation/controller.cjs.js.map +1 -0
- package/dist/navigation/controller.d.ts +51 -0
- package/dist/navigation/controller.d.ts.map +1 -0
- package/dist/navigation/controller.esm.js +45 -0
- package/dist/navigation/controller.esm.js.map +1 -0
- package/dist/navigation/events.cjs.js +2 -0
- package/dist/navigation/events.cjs.js.map +1 -0
- package/dist/navigation/events.d.ts +17 -0
- package/dist/navigation/events.d.ts.map +1 -0
- package/dist/navigation/events.esm.js +18 -0
- package/dist/navigation/events.esm.js.map +1 -0
- package/dist/navigation/navbarVisibility.cjs.js +2 -0
- package/dist/navigation/navbarVisibility.cjs.js.map +1 -0
- package/dist/navigation/navbarVisibility.d.ts +5 -0
- package/dist/navigation/navbarVisibility.d.ts.map +1 -0
- package/dist/navigation/navbarVisibility.esm.js +26 -0
- package/dist/navigation/navbarVisibility.esm.js.map +1 -0
- package/dist/navigation/options.cjs.js +2 -0
- package/dist/navigation/options.cjs.js.map +1 -0
- package/dist/navigation/options.d.ts +16 -0
- package/dist/navigation/options.d.ts.map +1 -0
- package/dist/navigation/options.esm.js +8 -0
- package/dist/navigation/options.esm.js.map +1 -0
- package/dist/navigation/podContext.cjs.js +2 -0
- package/dist/navigation/podContext.cjs.js.map +1 -0
- package/dist/navigation/podContext.d.ts +21 -0
- package/dist/navigation/podContext.d.ts.map +1 -0
- package/dist/navigation/podContext.esm.js +62 -0
- package/dist/navigation/podContext.esm.js.map +1 -0
- package/dist/navigation/state.cjs.js +2 -0
- package/dist/navigation/state.cjs.js.map +1 -0
- package/dist/navigation/state.d.ts +40 -0
- package/dist/navigation/state.d.ts.map +1 -0
- package/dist/navigation/state.esm.js +41 -0
- package/dist/navigation/state.esm.js.map +1 -0
- package/dist/outline/context.cjs.js.map +1 -1
- package/dist/outline/manager2.cjs.js +1 -1
- package/dist/outline/manager2.cjs.js.map +1 -1
- package/dist/outline/manager2.esm.js +387 -353
- package/dist/outline/manager2.esm.js.map +1 -1
- package/dist/outline/outlineIcons.cjs.js.map +1 -1
- package/dist/outline/propertyViews.cjs.js.map +1 -1
- package/dist/outline/queryByExample.cjs.js.map +1 -1
- package/dist/outline/userInput.cjs.js +1 -1
- package/dist/outline/userInput.cjs.js.map +1 -1
- package/dist/outline/userInput.esm.js +12 -13
- package/dist/outline/userInput.esm.js.map +1 -1
- package/dist/outline/viewAsImage.cjs.js.map +1 -1
- package/dist/outline/viewAsMbox.cjs.js.map +1 -1
- package/dist/pad/padPane2.cjs.js +1 -1
- package/dist/pad/padPane2.cjs.js.map +1 -1
- package/dist/pad/padPane2.esm.js +2 -6
- package/dist/pad/padPane2.esm.js.map +1 -1
- package/dist/playlist/playlistPane.cjs.js.map +1 -1
- package/dist/registerPanes.cjs.js.map +1 -1
- package/dist/schedule/schedulePane2.cjs.js +1 -1
- package/dist/schedule/schedulePane2.cjs.js.map +1 -1
- package/dist/schedule/schedulePane2.esm.js +1 -5
- package/dist/schedule/schedulePane2.esm.js.map +1 -1
- package/dist/sharing/sharingPane.cjs.js.map +1 -1
- package/dist/slideshow/slideshowPane.cjs.js.map +1 -1
- package/dist/social/editProfileDetails.cjs.js +1 -1
- package/dist/social/editProfileDetails.cjs.js.map +1 -1
- package/dist/social/editProfileDetails.esm.js +0 -2
- package/dist/social/editProfileDetails.esm.js.map +1 -1
- package/dist/social/icons.cjs.js +4 -4
- package/dist/social/icons.cjs.js.map +1 -1
- package/dist/social/icons.esm.js +5 -5
- package/dist/social/icons.esm.js.map +1 -1
- package/dist/social/socialPane.d.ts +0 -1
- package/dist/social/socialPane.d.ts.map +1 -1
- package/dist/social/socialPane2.cjs.js +3 -3
- package/dist/social/socialPane2.cjs.js.map +1 -1
- package/dist/social/socialPane2.esm.js +97 -154
- package/dist/social/socialPane2.esm.js.map +1 -1
- package/dist/social/socialSections.cjs.js +1 -1
- package/dist/social/socialSections.cjs.js.map +1 -1
- package/dist/social/socialSections.d.ts +2 -1
- package/dist/social/socialSections.d.ts.map +1 -1
- package/dist/social/socialSections.esm.js +54 -129
- package/dist/social/socialSections.esm.js.map +1 -1
- package/dist/social/triage.cjs.js.map +1 -1
- package/dist/tabbed/tabbedPane.cjs.js.map +1 -1
- package/dist/tableViewPane.cjs.js.map +1 -1
- package/dist/transaction/pane.cjs.js.map +1 -1
- package/dist/transaction/pane.esm.js +1 -1
- package/dist/transaction/pane.esm.js.map +1 -1
- package/dist/transaction/period.cjs.js.map +1 -1
- package/dist/trip/tripPane.cjs.js.map +1 -1
- package/dist/trustedApplications/trustedApplications.dom.cjs.js.map +1 -1
- package/dist/trustedApplications/trustedApplications.utils.cjs.js.map +1 -1
- package/dist/trustedApplications/trustedApplications.view.cjs.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/ui/pane.cjs.js +1 -1
- package/dist/ui/pane.cjs.js.map +1 -1
- package/dist/ui/pane.esm.js +2 -5
- package/dist/ui/pane.esm.js.map +1 -1
- package/dist/utils/paneUtils.cjs.js +1 -1
- package/dist/utils/paneUtils.cjs.js.map +1 -1
- package/dist/utils/paneUtils.esm.js +4 -4
- package/dist/utils/paneUtils.esm.js.map +1 -1
- package/dist/utils/podUtils.cjs.js.map +1 -1
- package/dist/utils/viewerUtils.cjs.js +2 -0
- package/dist/utils/viewerUtils.cjs.js.map +1 -0
- package/dist/utils/viewerUtils.d.ts +5 -0
- package/dist/utils/viewerUtils.d.ts.map +1 -0
- package/dist/utils/viewerUtils.esm.js +13 -0
- package/dist/utils/viewerUtils.esm.js.map +1 -0
- package/dist/utils/webIdUtils.cjs.js +1 -1
- package/dist/utils/webIdUtils.cjs.js.map +1 -1
- package/dist/utils/webIdUtils.d.ts +1 -0
- package/dist/utils/webIdUtils.d.ts.map +1 -1
- package/dist/utils/webIdUtils.esm.js +23 -19
- package/dist/utils/webIdUtils.esm.js.map +1 -1
- package/dist/versionInfo.cjs.js +1 -1
- package/dist/versionInfo.cjs.js.map +1 -1
- package/dist/versionInfo.esm.js +11 -11
- package/dist/versionInfo.esm.js.map +1 -1
- package/dist/video/videoPane.cjs.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socialPane2.cjs.js","names":["icons","ns","authn","utils","createHeaderSection","locationIcon","createMutualSection","createAllFriendsSection","triageFriends","createRequestsSection","loadFriendshipTriage","widgets","require_icons","require_socialSections","require_triage","solid_ui","solid_logic","applyEnvironmentAttributes","layout","context","theme","inputMode","element","socialPane","types","subject","dom","common","both","i","x","j","y","uniqueNodes","seen","unique","node","nodes","link","uri","contents","a","text","str","refreshRelationshipUi","buildCheckboxForm","f","label","input","tx","lab","options","state","outliner","statement","success","errorBody","kb","foaf","vcard","me","meUri","thisIsYou","s","knows","familiar","uniqueFriends","myFriends","mutualConnections","friend","mutualFriendCount","viewerMode","getViewerMode","profile","editable","incoming","outgoing","structure","primary","tabs","allFriendsTab","mutualTab","works","message","doc","cme","outgoingSt","shouldShowHeaderAddFriendAction","mode","canEditOwnedProfile","canManageRelationship","canModifyFriendsTab","headerControls","header","setActivePanel","selectProfileData","friendDetailsByUri","nextCache","friendNodes","friendNode","toFriendDetails","key","value","renderSupportingInfo","target","container","renderDom","jobAndOrganization","jobLine","locationLine","renderNameSuffix","pronouns","suffix","mutualSection","mutualFriends","mutualContent","allFriendsSection","allFriends","friendsList","requestsTriage","requestsSection","requestsPanel","requestsTab","activePanel","showRequestsTab","panel","showMutual","showAllFriends","showRequests","rebuildMutualSection","nextMutualSection","applyViewerMode","showMutualTab","refreshFriendsList","refresh","refreshMutualFriends","streamedFriends","streamFriends","confirmedViewerMode","webId","confirmedCanEditOwnedProfile","FRIEND_BATCH_SIZE","pronounsAsText","store","them","formatLocation","countryName","locality","name","nickname","dateOfBirth","imageSrc","jobTitle","orgName","address","location","fetcher","uniqueFriendNodes","friends","batchSize","currentUserUri","currentUser"],"sources":["../../src/social/socialPane.ts"],"sourcesContent":["/* Social Pane\n **\n ** This outline pane provides social network functions\n ** Using for example the FOAF ontology.\n ** Goal: A *distributed* version of facebook, advogato, etc etc\n ** - Similarly easy user interface, but data storage distributed\n ** - Read and write both user-private (address book) and public data clearly\n ** -- todo: use common code to get username and load profile and set 'me'\n */\n\nimport './socialPane.css'\nimport { icons, utils, ns, log, widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, Statement } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { locationIcon } from './icons'\nimport {\n createAllFriendsSection,\n createHeaderSection,\n FriendRowRenderers,\n createMutualSection,\n createRequestsSection,\n HeaderControls,\n SocialHeaderElement\n} from './socialSections'\nimport type { ViewerMode } from './socialSections'\nimport { FriendshipTriage, loadFriendshipTriage, triageFriends } from './triage'\n\nfunction applyEnvironmentAttributes (\n element: HTMLElement,\n context: DataBrowserContext\n): void {\n const layout = context.environment?.layout ?? 'desktop'\n const theme = context.environment?.theme ?? 'light'\n const inputMode = context.environment?.inputMode ?? 'pointer'\n\n element.classList.add('social-pane-host')\n element.dataset.layout = layout\n element.dataset.theme = theme\n element.dataset.inputMode = inputMode\n}\n\nexport const socialPane = {\n icon: icons.originalIconBase + 'foaf/foafTiny.gif',\n\n name: 'social',\n\n label: function (subject, context) {\n const kb = context.session.store\n const types = kb.findTypeURIs(subject)\n if (\n types[ns.foaf('Person').uri] ||\n types[ns.vcard('Individual').uri]\n ) {\n return 'Friends'\n }\n return null\n },\n global: false,\n\n render: function (s, context) {\n const dom = context.dom\n const common = function (x: NamedNode[], y: NamedNode[]) {\n // Find common members of two lists\n const both: NamedNode[] = []\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n if (y[j].sameTerm(x[i])) {\n both.push(y[j])\n break\n }\n }\n }\n return both\n }\n\n const uniqueNodes = function (nodes: NamedNode[]) {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n for (const node of nodes) {\n if (!node?.value || seen.has(node.value)) continue\n seen.add(node.value)\n unique.push(node)\n }\n return unique\n }\n\n const link = function (contents: Node, uri: string | null | undefined) {\n if (!uri) return contents\n const a = dom.createElement('a')\n a.setAttribute('href', uri)\n a.appendChild(contents)\n return a\n }\n\n const text = function (str: string) {\n return dom.createTextNode(str)\n }\n\n let refreshRelationshipUi = function () {}\n\n const buildCheckboxForm = function (\n lab: string | Node,\n statement: Statement,\n state: boolean,\n options: { disabled?: boolean, disabledTitle?: string } = {}\n ) {\n const f = dom.createElement('form')\n const label = dom.createElement('label')\n const input = dom.createElement('input')\n const tx = dom.createElement('span')\n tx.className = 'question'\n if (typeof lab === 'string') {\n tx.textContent = lab\n } else {\n tx.appendChild(lab)\n }\n input.setAttribute('type', 'checkbox')\n if (options.disabled) {\n input.disabled = true\n if (options.disabledTitle) {\n input.title = options.disabledTitle\n input.setAttribute('aria-label', options.disabledTitle)\n }\n }\n label.appendChild(tx)\n label.appendChild(input)\n f.appendChild(label)\n const boxHandler = function (this: HTMLInputElement, _e: Event) {\n if (this.checked) {\n try {\n outliner.UserInput.sparqler.insert_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while inserting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = false // rollback UI\n return\n }\n kb.add(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n })\n } catch (e) {\n log.error('Data write fails:' + e)\n log.alert('Data write fails:' + e)\n input.checked = false // rollback UI\n tx.className = 'question'\n }\n } else {\n try {\n outliner.UserInput.sparqler.delete_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while deleting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = true // Rollback UI\n } else {\n kb.removeMany(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n }\n })\n } catch (e) {\n log.alert('Delete fails:' + e)\n input.checked = true // Rollback UI\n // return\n }\n }\n }\n input.checked = state\n input.addEventListener('click', boxHandler, false)\n return f\n }\n\n // ////////// Body of render():\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const socialPane = dom.createElement('div')\n socialPane.classList.add('social-pane', 'flex-column', 'gap-xxs')\n applyEnvironmentAttributes(socialPane, context)\n const foaf = ns.foaf\n const vcard = ns.vcard\n const me = authn.currentUser()\n const meUri = me ? me.uri : null\n\n const thisIsYou = me && kb.sameThings(me, s)\n\n const knows = foaf('knows')\n // var givenName = kb.sym('http://www.w3.org/2000/10/swap/pim/contact#givenName')\n const familiar =\n kb.anyValue(s, foaf('givenname')) ||\n kb.anyValue(s, foaf('firstName')) ||\n kb.anyValue(s, foaf('nick')) ||\n kb.anyValue(s, foaf('name')) ||\n kb.anyValue(s, vcard('fn'))\n const friends = kb.each(s, knows)\n const uniqueFriends = uniqueNodes(friends as NamedNode[])\n const myFriends = me ? uniqueNodes(kb.each(me, foaf('knows')) as NamedNode[]) : []\n const mutualConnections = me && !thisIsYou\n ? uniqueNodes(common(uniqueFriends, myFriends)).filter(friend => !kb.sameThings(friend, me))\n : []\n const mutualFriendCount = me && !thisIsYou ? mutualConnections.length : null\n const viewerMode = getViewerMode(s, me)\n\n // Do I have a public profile document?\n let profile: NamedNode | null = null // This could be SPARQL { ?me foaf:primaryTopic [ a foaf:PersonalProfileDocument ] }\n let editable = false\n let incoming: boolean | NamedNode[] = false\n let outgoing: boolean | NamedNode[] = false\n\n const structure = socialPane.appendChild(dom.createElement('div'))\n structure.className = 'social-layout'\n const primary = structure.appendChild(dom.createElement('div'))\n primary.className = 'social-primary'\n\n const tabs = primary.appendChild(dom.createElement('div'))\n tabs.classList.add('social-primary__tabs', 'flex-center')\n tabs.setAttribute('role', 'tablist')\n tabs.setAttribute('aria-label', 'Social sections')\n\n const allFriendsTab = tabs.appendChild(dom.createElement('button'))\n allFriendsTab.className = 'social-primary__tab'\n allFriendsTab.type = 'button'\n allFriendsTab.id = 'social-tab-all-friends'\n allFriendsTab.textContent = 'All Friends'\n allFriendsTab.setAttribute('role', 'tab')\n allFriendsTab.setAttribute('aria-controls', 'social-panel-all-friends')\n allFriendsTab.setAttribute('aria-selected', 'true')\n allFriendsTab.tabIndex = 0\n\n const mutualTab = tabs.appendChild(dom.createElement('button'))\n mutualTab.className = 'social-primary__tab'\n mutualTab.type = 'button'\n mutualTab.id = 'social-tab-mutual'\n mutualTab.textContent = 'Mutual'\n mutualTab.setAttribute('role', 'tab')\n mutualTab.setAttribute('aria-controls', 'social-panel-mutual')\n mutualTab.setAttribute('aria-selected', 'false')\n mutualTab.tabIndex = -1\n\n if (me) {\n // The definition of FOAF personal profile document is ..\n const works = kb.each(undefined, foaf('primaryTopic'), me) // having me as primary topic\n let message = ''\n for (let i = 0; i < works.length; i++) {\n if (\n kb.whether(\n works[i],\n ns.rdf('type'),\n foaf('PersonalProfileDocument')\n )\n ) {\n const doc = works[i]\n editable = outliner.UserInput.sparqler.editable(doc.uri, kb)\n if (!editable) {\n message +=\n 'Your profile <' +\n utils.escapeForXML(doc.uri) +\n '> is not remotely editable.'\n } else {\n profile = doc\n break\n }\n }\n }\n\n /*\n if (!profile) {\n say(\n message + '\\nI couldn\\'t find your editable personal profile document.'\n )\n } else {\n say('Editing your profile ' + profile + '.')\n editable = outliner.UserInput.sparqler.editable(profile.uri, kb)\n }\n */\n\n if (thisIsYou) {\n // This is about me\n // pass... @@\n } else {\n // This is about someone else\n // My relationship with this person\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n outgoing = false\n const outgoingSt = kb.statementsMatching(cme, knows, s)\n if (outgoingSt.length) {\n outgoing = true\n if (!profile) profile = outgoingSt[0].why\n }\n } // About someone else\n } // me is defined\n // End of you and s\n\n const shouldShowHeaderAddFriendAction = (mode: ViewerMode) => {\n return mode === 'authenticated' && !thisIsYou && !outgoing\n }\n\n const canEditOwnedProfile = viewerMode === 'owner' && editable\n const canManageRelationship = viewerMode === 'authenticated' && !thisIsYou && editable && Boolean(profile)\n const canModifyFriendsTab = canEditOwnedProfile\n\n let headerControls: HeaderControls = {\n canEdit: canEditOwnedProfile,\n viewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(viewerMode)\n }\n\n const header = createHeaderSection(context, s, headerControls, {\n friendCount: uniqueFriends.length,\n mutualFriendCount,\n onSelectFriends: function () {\n setActivePanel('all-friends')\n },\n onSelectMutual: typeof mutualFriendCount === 'number'\n ? function () {\n setActivePanel('mutual')\n }\n : undefined\n }, function () {\n return selectProfileData(context, s)\n })\n header.classList.add('social-pane__header-section', 'flex-column')\n socialPane.prepend(header)\n\n // div.appendChild(dom.createTextNode(plural(friends.length, 'acquaintance') +'. '))\n\n // ///////////////////////////////////////////// Main block\n //\n // Should: Find the intersection and difference sets\n\n const friendDetailsByUri = new Map<string, FriendDetails>()\n\n const hydrateFriendDetailsCache = function (friendNodes: NamedNode[]) {\n const nextCache = new Map<string, FriendDetails>()\n\n friendNodes.forEach(friendNode => {\n if (!friendNode?.value || friendNode.value === s.value) return\n nextCache.set(friendNode.value, toFriendDetails(kb, friendNode))\n })\n\n friendDetailsByUri.clear()\n nextCache.forEach((value, key) => {\n friendDetailsByUri.set(key, value)\n })\n }\n\n hydrateFriendDetailsCache(uniqueFriends)\n\n const renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n\n const container = renderDom.createElement('div')\n const jobAndOrganization = [friend.jobTitle, friend.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = container.appendChild(renderDom.createElement('div'))\n jobLine.className = 'social-friend-job-org'\n jobLine.textContent = jobAndOrganization\n }\n\n if (friend.location) {\n const locationLine = container.appendChild(renderDom.createElement('div'))\n locationLine.className = 'social-friend-location'\n locationLine.innerHTML = `${locationIcon} ${friend.location}`\n }\n\n if (!container.childNodes.length) return null\n\n return container\n }\n\n const renderNameSuffix: FriendRowRenderers['renderNameSuffix'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n const pronouns = friend.pronouns\n if (!pronouns) return null\n\n const suffix = renderDom.createElement('span')\n suffix.className = 'social-friend-pronouns'\n suffix.textContent = `(${pronouns})`\n return suffix\n }\n\n let mutualSection = me && !thisIsYou\n ? createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n : {\n section: dom.createElement('section'),\n content: dom.createElement('div'),\n refreshMutualFriends: function () {}\n }\n\n let mutualFriends = mutualSection.section\n let mutualContent = mutualSection.content\n if (!mutualFriends.className) {\n mutualFriends.className = 'social-pane__mutual-friends social-primary__panel'\n mutualFriends.id = 'social-panel-mutual'\n mutualFriends.setAttribute('role', 'tabpanel')\n mutualFriends.setAttribute('aria-labelledby', 'social-tab-mutual')\n mutualContent.className = 'social-main social-main--mutual'\n mutualFriends.appendChild(mutualContent)\n }\n primary.appendChild(mutualFriends)\n\n const allFriendsSection = createAllFriendsSection({\n dom,\n subject: s,\n profile: canModifyFriendsTab ? profile : null,\n editable: canModifyFriendsTab,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n const allFriends = allFriendsSection.section\n const friendsList = allFriendsSection.friendsList\n primary.appendChild(allFriends)\n\n let requestsTriage: FriendshipTriage = triageFriends(kb, s)\n const requestsSection = createRequestsSection({\n dom,\n triage: requestsTriage,\n renderSupportingInfo,\n renderNameSuffix\n })\n const requestsPanel = requestsSection.section\n primary.appendChild(requestsPanel)\n\n const requestsTab = tabs.appendChild(dom.createElement('button'))\n requestsTab.className = 'social-primary__tab'\n requestsTab.type = 'button'\n requestsTab.id = 'social-tab-requests'\n requestsTab.textContent = 'Requests'\n requestsTab.setAttribute('role', 'tab')\n requestsTab.setAttribute('aria-controls', 'social-panel-requests')\n requestsTab.setAttribute('aria-selected', 'false')\n requestsTab.tabIndex = -1\n\n type SocialPanel = 'mutual' | 'all-friends' | 'requests'\n let activePanel: SocialPanel = 'all-friends'\n let showRequestsTab = viewerMode === 'owner'\n\n const setActivePanel = function (panel: SocialPanel) {\n activePanel = panel\n const showMutual = panel === 'mutual'\n const showAllFriends = panel === 'all-friends'\n const showRequests = showRequestsTab && panel === 'requests'\n mutualTab.classList.toggle('social-primary__tab--active', showMutual)\n mutualTab.setAttribute('aria-selected', String(showMutual))\n mutualTab.tabIndex = showMutual ? 0 : -1\n\n allFriendsTab.classList.toggle('social-primary__tab--active', showAllFriends)\n allFriendsTab.setAttribute('aria-selected', String(showAllFriends))\n allFriendsTab.tabIndex = showAllFriends ? 0 : -1\n\n requestsTab.classList.toggle('social-primary__tab--active', showRequests)\n requestsTab.setAttribute('aria-selected', String(showRequests))\n requestsTab.tabIndex = showRequests ? 0 : -1\n\n mutualFriends.classList.toggle('social-primary__panel--active', showMutual)\n mutualFriends.setAttribute('aria-hidden', String(!showMutual))\n\n allFriends.classList.toggle('social-primary__panel--active', showAllFriends)\n allFriends.setAttribute('aria-hidden', String(!showAllFriends))\n\n requestsPanel.classList.toggle('social-primary__panel--active', showRequests)\n requestsPanel.setAttribute('aria-hidden', String(!showRequests))\n requestsPanel.hidden = !showRequestsTab || !showRequests\n }\n const rebuildMutualSection = function () {\n if (!me || thisIsYou) return\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n\n const outgoingStatements = kb.statementsMatching(cme, knows, s)\n outgoing = outgoingStatements.length > 0\n\n const nextMutualSection = createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n mutualFriends.replaceWith(nextMutualSection.section)\n mutualSection = nextMutualSection\n mutualFriends = nextMutualSection.section\n mutualContent = nextMutualSection.content\n }\n\n refreshRelationshipUi = function () {\n rebuildMutualSection()\n headerControls = {\n ...headerControls,\n showAddFriendAction: shouldShowHeaderAddFriendAction(headerControls.viewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n requestsTriage = triageFriends(kb, s)\n requestsSection.refreshRequests(requestsTriage)\n setActivePanel(activePanel)\n }\n\n setActivePanel('all-friends')\n\n const applyViewerMode = function (mode: ViewerMode) {\n const showMutualTab = mode === 'authenticated' && !thisIsYou\n showRequestsTab = mode === 'owner'\n mutualTab.hidden = !showMutualTab\n requestsTab.hidden = !showRequestsTab\n if (!showRequestsTab && activePanel === 'requests') {\n setActivePanel('all-friends')\n return\n }\n setActivePanel('all-friends')\n }\n\n mutualTab.addEventListener('click', function () {\n setActivePanel('mutual')\n })\n\n allFriendsTab.addEventListener('click', function () {\n setActivePanel('all-friends')\n })\n\n requestsTab.addEventListener('click', function () {\n setActivePanel('requests')\n })\n\n const refreshFriendsList = function () {\n const refresh = (friendsList as HTMLTableElement & { refresh?: () => void }).refresh\n if (typeof refresh !== 'function') return\n\n refresh.call(friendsList)\n }\n\n const refreshMutualFriends = function () {\n mutualSection.refreshMutualFriends()\n }\n\n ;(async () => {\n try {\n for await (const streamedFriends of streamFriends(context, s)) {\n friendDetailsByUri.clear()\n streamedFriends.forEach(friend => {\n friendDetailsByUri.set(friend.url, friend)\n })\n refreshFriendsList()\n refreshMutualFriends()\n }\n } catch {\n // Keep the initial snapshot if async friend loading fails.\n }\n })()\n\n ;(async () => {\n try {\n requestsTriage = await loadFriendshipTriage(context, s)\n requestsSection.refreshRequests(requestsTriage)\n refreshFriendsList()\n refreshMutualFriends()\n } catch {\n // Keep the initial requests snapshot if additional loading fails.\n }\n })()\n\n // Older triage logic is preserved below as a reusable data helper.\n\n applyViewerMode('anonymous')\n\n authn.checkUser()\n .then(webId => {\n const confirmedViewerMode = getViewerMode(s, webId)\n applyViewerMode(confirmedViewerMode)\n const confirmedCanEditOwnedProfile = confirmedViewerMode === 'owner' && editable\n headerControls = {\n ...headerControls,\n canEdit: confirmedCanEditOwnedProfile,\n viewerMode: confirmedViewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(confirmedViewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n .catch(() => {\n applyViewerMode('anonymous')\n headerControls = {\n ...headerControls,\n canEdit: false,\n viewerMode: 'anonymous',\n showAddFriendAction: false\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n\n return socialPane\n } // render()\n} //\n// ends\n// ***************** Social Pane Selectors **********/\n/* Should move to another file, but will leave for now */\n/* Will create a social pane folder or maybe repo later */\n\nconst FRIEND_BATCH_SIZE = 3\n\nexport interface ProfileDetails {\n url: string\n imageUrl?: string\n name?: string\n nickname?: string\n jobTitle?: string\n organization?: string\n location?: string | null\n pronouns?: string\n birthdate?: string\n}\n\nexport interface FriendDetails extends ProfileDetails {\n subjectNode: NamedNode\n}\n\n/* pronounsAsText and formatLocation were copied from HeadingSection selectors */\nexport function pronounsAsText (store: LiveStore, subject: NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation (countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction toFriendDetails (store: any, friendNode: NamedNode): FriendDetails {\n const name =\n store.anyValue(friendNode, ns.vcard('fn')) ||\n store.anyValue(friendNode, ns.foaf('name')) ||\n null\n const nickname =\n store.anyValue(friendNode, ns.vcard('nickname')) ||\n store.anyValue(friendNode, ns.foaf('nick')) ||\n null\n const dateOfBirth = store.anyValue(friendNode, ns.vcard('bday')) || null\n const imageSrc = widgets.findImage(friendNode)\n const jobTitle = store.anyValue(friendNode, ns.vcard('role')) || null\n const orgName = store.anyValue(friendNode, ns.vcard('organization-name')) || null\n const primaryAddressEntryNode = store.any(friendNode, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : null\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, friendNode)\n\n return {\n url: friendNode.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns,\n subjectNode: friendNode\n }\n}\n\nexport async function * streamFriends (\n context: DataBrowserContext,\n subject: NamedNode,\n batchSize = FRIEND_BATCH_SIZE\n): AsyncGenerator<FriendDetails[], void, void> {\n const store = context.session.store\n const fetcher = (store as any)?.fetcher\n\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with whatever is already in the store.\n }\n }\n\n const seen = new Set<string>()\n const friendNodes = store.each(subject, ns.foaf('knows'), null, subject.doc())\n const uniqueFriendNodes: NamedNode[] = []\n\n for (const friendNode of friendNodes) {\n const key = friendNode?.value\n if (!key || seen.has(key) || subject.value === key) continue\n seen.add(key)\n uniqueFriendNodes.push(friendNode as NamedNode)\n }\n\n const friends: FriendDetails[] = []\n\n for (const friendNode of uniqueFriendNodes) {\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(friendNode.doc())\n } catch {\n // Keep partial friend data when one linked document fails to load.\n }\n }\n\n friends.push(toFriendDetails(store, friendNode))\n\n if (friends.length % batchSize === 0) {\n yield [...friends]\n }\n }\n\n if (friends.length > 0 && friends.length % batchSize !== 0) {\n yield [...friends]\n }\n}\n\nexport async function extractFriends (context: DataBrowserContext, subject: NamedNode): Promise<FriendDetails[] | null> {\n let latestFriends: FriendDetails[] | null = null\n\n for await (const friends of streamFriends(context, subject)) {\n latestFriends = friends\n }\n\n return latestFriends\n}\n\nexport function selectProfileData (context: DataBrowserContext, subject: NamedNode): ProfileDetails | null {\n const store = context.session.store\n\n const name =\n store.anyValue(subject, ns.vcard('fn')) ||\n store.anyValue(subject, ns.foaf('name')) ||\n undefined\n const nickname =\n store.anyValue(subject, ns.vcard('nickname')) ||\n store.anyValue(subject, ns.foaf('nick')) ||\n undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : undefined\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : undefined\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, subject)\n return {\n url: subject.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns\n }\n}\n\nexport type { ViewerMode } from './socialSections'\n\nfunction getViewerMode (subject: NamedNode, currentUser: unknown = authn.currentUser()): ViewerMode {\n const currentUserUri =\n typeof currentUser === 'string'\n ? currentUser\n : typeof currentUser === 'object' && currentUser !== null\n ? ((currentUser as { value?: string, uri?: string }).value ||\n (currentUser as { value?: string, uri?: string }).uri ||\n null)\n : null\n let mode: ViewerMode = 'anonymous'\n if (currentUserUri === subject.value) mode = 'owner'\n if (currentUserUri && currentUserUri !== subject.value) mode = 'authenticated'\n return mode\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socialPane2.cjs.js","names":["icons","ns","authn","getViewerRelation","utils","locationIcon","createMutualSection","createAllFriendsSection","triageFriends","createRequestsSection","loadFriendshipTriage","widgets","require_icons","require_socialSections","require_viewerUtils","require_triage","solid_ui","solid_logic","applyEnvironmentAttributes","layout","context","theme","inputMode","element","socialPane","types","subject","dom","common","both","i","x","j","y","uniqueNodes","seen","unique","node","nodes","link","uri","contents","a","text","str","refreshRelationshipUi","buildCheckboxForm","f","label","input","tx","lab","options","state","outliner","statement","success","kb","errorBody","foaf","vcard","me","meUri","thisIsYou","knows","familiar","uniqueFriends","myFriends","mutualConnections","friend","viewerMode","profile","editable","incoming","outgoing","structure","primary","tabs","allFriendsTab","mutualTab","works","message","doc","cme","outgoingSt","canEditOwnedProfile","canManageRelationship","canModifyFriendsTab","friendDetailsByUri","nextCache","friendNodes","friendNode","toFriendDetails","key","value","renderSupportingInfo","target","container","renderDom","jobAndOrganization","jobLine","locationLine","renderNameSuffix","pronouns","suffix","mutualSection","mutualFriends","mutualContent","allFriendsSection","allFriends","friendsList","requestsTriage","requestsSection","requestsPanel","requestsTab","activePanel","showRequestsTab","setActivePanel","panel","showMutual","showAllFriends","showRequests","rebuildMutualSection","nextMutualSection","applyViewerMode","showMutualTab","mode","refreshFriendsList","refresh","refreshMutualFriends","streamedFriends","streamFriends","confirmedViewerMode","webId","FRIEND_BATCH_SIZE","pronounsAsText","store","them","formatLocation","countryName","locality","name","nickname","dateOfBirth","imageSrc","jobTitle","orgName","address","location","fetcher","uniqueFriendNodes","friends","batchSize"],"sources":["../../src/social/socialPane.ts"],"sourcesContent":["/* Social Pane\n **\n ** This outline pane provides social network functions\n ** Using for example the FOAF ontology.\n ** Goal: A *distributed* version of facebook, advogato, etc etc\n ** - Similarly easy user interface, but data storage distributed\n ** - Read and write both user-private (address book) and public data clearly\n ** -- todo: use common code to get username and load profile and set 'me'\n */\n\nimport './socialPane.css'\nimport { icons, utils, ns, log, widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, Statement } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { locationIcon } from './icons'\nimport {\n createAllFriendsSection,\n FriendRowRenderers,\n createMutualSection,\n createRequestsSection\n} from './socialSections'\nimport type { ViewerMode } from '../types'\nimport { getViewerRelation } from '../utils/viewerUtils'\nimport { FriendshipTriage, loadFriendshipTriage, triageFriends } from './triage'\n\nfunction applyEnvironmentAttributes (\n element: HTMLElement,\n context: DataBrowserContext\n): void {\n const layout = context.environment?.layout ?? 'desktop'\n const theme = context.environment?.theme ?? 'light'\n const inputMode = context.environment?.inputMode ?? 'pointer'\n\n element.classList.add('social-pane-host')\n element.dataset.layout = layout\n element.dataset.theme = theme\n element.dataset.inputMode = inputMode\n}\n\nexport const socialPane = {\n icon: icons.originalIconBase + 'foaf/foafTiny.gif',\n\n name: 'social',\n\n label: function (subject, context) {\n const kb = context.session.store\n const types = kb.findTypeURIs(subject)\n if (\n types[ns.foaf('Person').uri] ||\n types[ns.vcard('Individual').uri]\n ) {\n return 'Friends'\n }\n return null\n },\n global: false,\n\n render: function (s, context) {\n const dom = context.dom\n const common = function (x: NamedNode[], y: NamedNode[]) {\n // Find common members of two lists\n const both: NamedNode[] = []\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n if (y[j].sameTerm(x[i])) {\n both.push(y[j])\n break\n }\n }\n }\n return both\n }\n\n const uniqueNodes = function (nodes: NamedNode[]) {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n for (const node of nodes) {\n if (!node?.value || seen.has(node.value)) continue\n seen.add(node.value)\n unique.push(node)\n }\n return unique\n }\n\n const link = function (contents: Node, uri: string | null | undefined) {\n if (!uri) return contents\n const a = dom.createElement('a')\n a.setAttribute('href', uri)\n a.appendChild(contents)\n return a\n }\n\n const text = function (str: string) {\n return dom.createTextNode(str)\n }\n\n let refreshRelationshipUi = function () {}\n\n const buildCheckboxForm = function (\n lab: string | Node,\n statement: Statement,\n state: boolean,\n options: { disabled?: boolean, disabledTitle?: string } = {}\n ) {\n const f = dom.createElement('form')\n const label = dom.createElement('label')\n const input = dom.createElement('input')\n const tx = dom.createElement('span')\n tx.className = 'question'\n if (typeof lab === 'string') {\n tx.textContent = lab\n } else {\n tx.appendChild(lab)\n }\n input.setAttribute('type', 'checkbox')\n if (options.disabled) {\n input.disabled = true\n if (options.disabledTitle) {\n input.title = options.disabledTitle\n input.setAttribute('aria-label', options.disabledTitle)\n }\n }\n label.appendChild(tx)\n label.appendChild(input)\n f.appendChild(label)\n const boxHandler = function (this: HTMLInputElement, _e: Event) {\n if (this.checked) {\n try {\n outliner.UserInput.sparqler.insert_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while inserting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = false // rollback UI\n return\n }\n kb.add(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n })\n } catch (e) {\n log.error('Data write fails:' + e)\n log.alert('Data write fails:' + e)\n input.checked = false // rollback UI\n tx.className = 'question'\n }\n } else {\n try {\n outliner.UserInput.sparqler.delete_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while deleting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = true // Rollback UI\n } else {\n kb.removeMany(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n }\n })\n } catch (e) {\n log.alert('Delete fails:' + e)\n input.checked = true // Rollback UI\n // return\n }\n }\n }\n input.checked = state\n input.addEventListener('click', boxHandler, false)\n return f\n }\n\n // ////////// Body of render():\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const socialPane = dom.createElement('div')\n socialPane.classList.add('social-pane', 'flex-column', 'gap-xxs')\n applyEnvironmentAttributes(socialPane, context)\n const foaf = ns.foaf\n const vcard = ns.vcard\n const me = authn.currentUser()\n const meUri = me ? me.uri : null\n\n const thisIsYou = me && kb.sameThings(me, s)\n\n const knows = foaf('knows')\n // var givenName = kb.sym('http://www.w3.org/2000/10/swap/pim/contact#givenName')\n const familiar =\n kb.anyValue(s, foaf('givenname')) ||\n kb.anyValue(s, foaf('firstName')) ||\n kb.anyValue(s, foaf('nick')) ||\n kb.anyValue(s, foaf('name')) ||\n kb.anyValue(s, vcard('fn'))\n const friends = kb.each(s, knows)\n const uniqueFriends = uniqueNodes(friends as NamedNode[])\n const myFriends = me ? uniqueNodes(kb.each(me, foaf('knows')) as NamedNode[]) : []\n const mutualConnections = me && !thisIsYou\n ? uniqueNodes(common(uniqueFriends, myFriends)).filter(friend => !kb.sameThings(friend, me))\n : []\n const viewerMode = getViewerRelation(s, me)\n\n // Do I have a public profile document?\n let profile: NamedNode | null = null // This could be SPARQL { ?me foaf:primaryTopic [ a foaf:PersonalProfileDocument ] }\n let editable = false\n let incoming: boolean | NamedNode[] = false\n let outgoing: boolean | NamedNode[] = false\n\n const structure = socialPane.appendChild(dom.createElement('div'))\n structure.className = 'social-layout'\n const primary = structure.appendChild(dom.createElement('div'))\n primary.className = 'social-primary'\n\n const tabs = primary.appendChild(dom.createElement('div'))\n tabs.classList.add('social-primary__tabs', 'flex-center')\n tabs.setAttribute('role', 'tablist')\n tabs.setAttribute('aria-label', 'Social sections')\n\n const allFriendsTab = tabs.appendChild(dom.createElement('button'))\n allFriendsTab.className = 'social-primary__tab'\n allFriendsTab.type = 'button'\n allFriendsTab.id = 'social-tab-all-friends'\n allFriendsTab.textContent = 'All Friends'\n allFriendsTab.setAttribute('role', 'tab')\n allFriendsTab.setAttribute('aria-controls', 'social-panel-all-friends')\n allFriendsTab.setAttribute('aria-selected', 'true')\n allFriendsTab.tabIndex = 0\n\n const mutualTab = tabs.appendChild(dom.createElement('button'))\n mutualTab.className = 'social-primary__tab'\n mutualTab.type = 'button'\n mutualTab.id = 'social-tab-mutual'\n mutualTab.textContent = 'Mutual'\n mutualTab.setAttribute('role', 'tab')\n mutualTab.setAttribute('aria-controls', 'social-panel-mutual')\n mutualTab.setAttribute('aria-selected', 'false')\n mutualTab.tabIndex = -1\n\n if (me) {\n // The definition of FOAF personal profile document is ..\n const works = kb.each(undefined, foaf('primaryTopic'), me) // having me as primary topic\n let message = ''\n for (let i = 0; i < works.length; i++) {\n if (\n kb.whether(\n works[i],\n ns.rdf('type'),\n foaf('PersonalProfileDocument')\n )\n ) {\n const doc = works[i]\n editable = outliner.UserInput.sparqler.editable(doc.uri, kb)\n if (!editable) {\n message +=\n 'Your profile <' +\n utils.escapeForXML(doc.uri) +\n '> is not remotely editable.'\n } else {\n profile = doc\n break\n }\n }\n }\n\n /*\n if (!profile) {\n say(\n message + '\\nI couldn\\'t find your editable personal profile document.'\n )\n } else {\n say('Editing your profile ' + profile + '.')\n editable = outliner.UserInput.sparqler.editable(profile.uri, kb)\n }\n */\n\n if (thisIsYou) {\n // This is about me\n // pass... @@\n } else {\n // This is about someone else\n // My relationship with this person\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n outgoing = false\n const outgoingSt = kb.statementsMatching(cme, knows, s)\n if (outgoingSt.length) {\n outgoing = true\n if (!profile) profile = outgoingSt[0].why\n }\n } // About someone else\n } // me is defined\n // End of you and s\n\n const canEditOwnedProfile = viewerMode === 'owner' && editable\n const canManageRelationship = viewerMode === 'authenticated' && !thisIsYou && editable && Boolean(profile)\n const canModifyFriendsTab = canEditOwnedProfile\n\n // div.appendChild(dom.createTextNode(plural(friends.length, 'acquaintance') +'. '))\n\n // ///////////////////////////////////////////// Main block\n //\n // Should: Find the intersection and difference sets\n\n const friendDetailsByUri = new Map<string, FriendDetails>()\n\n const hydrateFriendDetailsCache = function (friendNodes: NamedNode[]) {\n const nextCache = new Map<string, FriendDetails>()\n\n friendNodes.forEach(friendNode => {\n if (!friendNode?.value || friendNode.value === s.value) return\n nextCache.set(friendNode.value, toFriendDetails(kb, friendNode))\n })\n\n friendDetailsByUri.clear()\n nextCache.forEach((value, key) => {\n friendDetailsByUri.set(key, value)\n })\n }\n\n hydrateFriendDetailsCache(uniqueFriends)\n\n const renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n\n const container = renderDom.createElement('div')\n const jobAndOrganization = [friend.jobTitle, friend.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = container.appendChild(renderDom.createElement('div'))\n jobLine.className = 'social-friend-job-org'\n jobLine.textContent = jobAndOrganization\n }\n\n if (friend.location) {\n const locationLine = container.appendChild(renderDom.createElement('div'))\n locationLine.className = 'social-friend-location'\n locationLine.innerHTML = `${locationIcon} ${friend.location}`\n }\n\n if (!container.childNodes.length) return null\n\n return container\n }\n\n const renderNameSuffix: FriendRowRenderers['renderNameSuffix'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n const pronouns = friend.pronouns\n if (!pronouns) return null\n\n const suffix = renderDom.createElement('span')\n suffix.className = 'social-friend-pronouns'\n suffix.textContent = `(${pronouns})`\n return suffix\n }\n\n let mutualSection = me && !thisIsYou\n ? createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n : {\n section: dom.createElement('section'),\n content: dom.createElement('div'),\n refreshMutualFriends: function () {}\n }\n\n let mutualFriends = mutualSection.section\n let mutualContent = mutualSection.content\n if (!mutualFriends.className) {\n mutualFriends.className = 'social-pane__mutual-friends social-primary__panel'\n mutualFriends.id = 'social-panel-mutual'\n mutualFriends.setAttribute('role', 'tabpanel')\n mutualFriends.setAttribute('aria-labelledby', 'social-tab-mutual')\n mutualContent.className = 'social-main social-main--mutual'\n mutualFriends.appendChild(mutualContent)\n }\n primary.appendChild(mutualFriends)\n\n const allFriendsSection = createAllFriendsSection({\n dom,\n subject: s,\n profile: canModifyFriendsTab ? profile : null,\n editable: canModifyFriendsTab,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n const allFriends = allFriendsSection.section\n const friendsList = allFriendsSection.friendsList\n primary.appendChild(allFriends)\n\n let requestsTriage: FriendshipTriage = triageFriends(kb, s)\n const requestsSection = createRequestsSection({\n dom,\n triage: requestsTriage,\n renderSupportingInfo,\n renderNameSuffix\n })\n const requestsPanel = requestsSection.section\n primary.appendChild(requestsPanel)\n\n const requestsTab = tabs.appendChild(dom.createElement('button'))\n requestsTab.className = 'social-primary__tab'\n requestsTab.type = 'button'\n requestsTab.id = 'social-tab-requests'\n requestsTab.textContent = 'Requests'\n requestsTab.setAttribute('role', 'tab')\n requestsTab.setAttribute('aria-controls', 'social-panel-requests')\n requestsTab.setAttribute('aria-selected', 'false')\n requestsTab.tabIndex = -1\n\n type SocialPanel = 'mutual' | 'all-friends' | 'requests'\n let activePanel: SocialPanel = 'all-friends'\n let showRequestsTab = viewerMode === 'owner'\n\n const setActivePanel = function (panel: SocialPanel) {\n activePanel = panel\n const showMutual = panel === 'mutual'\n const showAllFriends = panel === 'all-friends'\n const showRequests = showRequestsTab && panel === 'requests'\n mutualTab.classList.toggle('social-primary__tab--active', showMutual)\n mutualTab.setAttribute('aria-selected', String(showMutual))\n mutualTab.tabIndex = showMutual ? 0 : -1\n\n allFriendsTab.classList.toggle('social-primary__tab--active', showAllFriends)\n allFriendsTab.setAttribute('aria-selected', String(showAllFriends))\n allFriendsTab.tabIndex = showAllFriends ? 0 : -1\n\n requestsTab.classList.toggle('social-primary__tab--active', showRequests)\n requestsTab.setAttribute('aria-selected', String(showRequests))\n requestsTab.tabIndex = showRequests ? 0 : -1\n\n mutualFriends.classList.toggle('social-primary__panel--active', showMutual)\n mutualFriends.setAttribute('aria-hidden', String(!showMutual))\n\n allFriends.classList.toggle('social-primary__panel--active', showAllFriends)\n allFriends.setAttribute('aria-hidden', String(!showAllFriends))\n\n requestsPanel.classList.toggle('social-primary__panel--active', showRequests)\n requestsPanel.setAttribute('aria-hidden', String(!showRequests))\n requestsPanel.hidden = !showRequestsTab || !showRequests\n }\n const rebuildMutualSection = function () {\n if (!me || thisIsYou) return\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n\n const outgoingStatements = kb.statementsMatching(cme, knows, s)\n outgoing = outgoingStatements.length > 0\n\n const nextMutualSection = createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n mutualFriends.replaceWith(nextMutualSection.section)\n mutualSection = nextMutualSection\n mutualFriends = nextMutualSection.section\n mutualContent = nextMutualSection.content\n }\n\n refreshRelationshipUi = function () {\n rebuildMutualSection()\n requestsTriage = triageFriends(kb, s)\n requestsSection.refreshRequests(requestsTriage)\n setActivePanel(activePanel)\n }\n\n setActivePanel('all-friends')\n\n const applyViewerMode = function (mode: ViewerMode) {\n const showMutualTab = mode === 'authenticated' && !thisIsYou\n showRequestsTab = mode === 'owner'\n mutualTab.hidden = !showMutualTab\n requestsTab.hidden = !showRequestsTab\n if (!showRequestsTab && activePanel === 'requests') {\n setActivePanel('all-friends')\n return\n }\n setActivePanel('all-friends')\n }\n\n mutualTab.addEventListener('click', function () {\n setActivePanel('mutual')\n })\n\n allFriendsTab.addEventListener('click', function () {\n setActivePanel('all-friends')\n })\n\n requestsTab.addEventListener('click', function () {\n setActivePanel('requests')\n })\n\n const refreshFriendsList = function () {\n const refresh = (friendsList as HTMLTableElement & { refresh?: () => void }).refresh\n if (typeof refresh !== 'function') return\n\n refresh.call(friendsList)\n }\n\n const refreshMutualFriends = function () {\n mutualSection.refreshMutualFriends()\n }\n\n ;(async () => {\n try {\n for await (const streamedFriends of streamFriends(context, s)) {\n friendDetailsByUri.clear()\n streamedFriends.forEach(friend => {\n friendDetailsByUri.set(friend.url, friend)\n })\n refreshFriendsList()\n refreshMutualFriends()\n }\n } catch {\n // Keep the initial snapshot if async friend loading fails.\n }\n })()\n\n ;(async () => {\n try {\n requestsTriage = await loadFriendshipTriage(context, s)\n requestsSection.refreshRequests(requestsTriage)\n refreshFriendsList()\n refreshMutualFriends()\n } catch {\n // Keep the initial requests snapshot if additional loading fails.\n }\n })()\n\n // Older triage logic is preserved below as a reusable data helper.\n\n applyViewerMode('anonymous')\n\n authn.checkUser()\n .then(webId => {\n const confirmedViewerMode = getViewerRelation(s, webId)\n applyViewerMode(confirmedViewerMode)\n })\n .catch(() => {\n applyViewerMode('anonymous')\n })\n\n return socialPane\n } // render()\n} //\n// ends\n// ***************** Social Pane Selectors **********/\n/* Should move to another file, but will leave for now */\n/* Will create a social pane folder or maybe repo later */\n\nconst FRIEND_BATCH_SIZE = 3\n\nexport interface ProfileDetails {\n url: string\n imageUrl?: string\n name?: string\n nickname?: string\n jobTitle?: string\n organization?: string\n location?: string | null\n pronouns?: string\n birthdate?: string\n}\n\nexport interface FriendDetails extends ProfileDetails {\n subjectNode: NamedNode\n}\n\n/* pronounsAsText and formatLocation were copied from HeadingSection selectors */\nexport function pronounsAsText (store: LiveStore, subject: NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation (countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction toFriendDetails (store: any, friendNode: NamedNode): FriendDetails {\n const name =\n store.anyValue(friendNode, ns.vcard('fn')) ||\n store.anyValue(friendNode, ns.foaf('name')) ||\n null\n const nickname =\n store.anyValue(friendNode, ns.vcard('nickname')) ||\n store.anyValue(friendNode, ns.foaf('nick')) ||\n null\n const dateOfBirth = store.anyValue(friendNode, ns.vcard('bday')) || null\n const imageSrc = widgets.findImage(friendNode)\n const jobTitle = store.anyValue(friendNode, ns.vcard('role')) || null\n const orgName = store.anyValue(friendNode, ns.vcard('organization-name')) || null\n const primaryAddressEntryNode = store.any(friendNode, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : null\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, friendNode)\n\n return {\n url: friendNode.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns,\n subjectNode: friendNode\n }\n}\n\nexport async function * streamFriends (\n context: DataBrowserContext,\n subject: NamedNode,\n batchSize = FRIEND_BATCH_SIZE\n): AsyncGenerator<FriendDetails[], void, void> {\n const store = context.session.store\n const fetcher = (store as any)?.fetcher\n\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with whatever is already in the store.\n }\n }\n\n const seen = new Set<string>()\n const friendNodes = store.each(subject, ns.foaf('knows'), null, subject.doc())\n const uniqueFriendNodes: NamedNode[] = []\n\n for (const friendNode of friendNodes) {\n const key = friendNode?.value\n if (!key || seen.has(key) || subject.value === key) continue\n seen.add(key)\n uniqueFriendNodes.push(friendNode as NamedNode)\n }\n\n const friends: FriendDetails[] = []\n\n for (const friendNode of uniqueFriendNodes) {\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(friendNode.doc())\n } catch {\n // Keep partial friend data when one linked document fails to load.\n }\n }\n\n friends.push(toFriendDetails(store, friendNode))\n\n if (friends.length % batchSize === 0) {\n yield [...friends]\n }\n }\n\n if (friends.length > 0 && friends.length % batchSize !== 0) {\n yield [...friends]\n }\n}\n\nexport async function extractFriends (context: DataBrowserContext, subject: NamedNode): Promise<FriendDetails[] | null> {\n let latestFriends: FriendDetails[] | null = null\n\n for await (const friends of streamFriends(context, subject)) {\n latestFriends = friends\n }\n\n return latestFriends\n}\n\nexport function selectProfileData (context: DataBrowserContext, subject: NamedNode): ProfileDetails | null {\n const store = context.session.store\n\n const name =\n store.anyValue(subject, ns.vcard('fn')) ||\n store.anyValue(subject, ns.foaf('name')) ||\n undefined\n const nickname =\n store.anyValue(subject, ns.vcard('nickname')) ||\n store.anyValue(subject, ns.foaf('nick')) ||\n undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : undefined\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : undefined\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, subject)\n return {\n url: subject.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns\n }\n}\n"],"mappings":"A,+NA0BA,SAASkB,EACP,EACA,EACM,CACN,IAAMC,EAASC,EAAQ,aAAa,QAAU,UACxCC,EAAQD,EAAQ,aAAa,OAAS,QACtCE,EAAYF,EAAQ,aAAa,WAAa,UAEpDG,EAAQ,UAAU,IAAI,kBAAkB,EACxC,EAAQ,QAAQ,OAASJ,EACzB,EAAQ,QAAQ,MAAQE,EACxB,EAAQ,QAAQ,UAAYC,CAC9B,CAEA,IAAaE,EAAa,CACxB,KAAMxB,EAAAA,MAAM,iBAAmB,oBAE/B,KAAM,SAEN,MAAO,SAAU,EAAS,EAAS,CAEjC,IAAMyB,EADKL,EAAQ,QAAQ,MACV,aAAaM,CAAO,EAOrC,OALED,EAAMxB,EAAAA,GAAG,KAAK,QAAQ,CAAC,CAAC,MACxBwB,EAAMxB,EAAAA,GAAG,MAAM,YAAY,CAAC,CAAC,KAEtB,UAEF,IACT,EACA,OAAQ,GAER,OAAQ,SAAU,EAAG,EAAS,CAC5B,IAAM0B,EAAMP,EAAQ,IACdQ,EAAS,SAAU,EAAgB,EAAgB,CAEvD,IAAMC,EAAoB,CAAC,EAC3B,IAAK,IAAIC,EAAI,EAAGA,EAAIC,EAAE,OAAQ,IAC5B,IAAK,IAAIC,EAAI,EAAGA,EAAIC,EAAE,OAAQ,IAC5B,GAAIA,EAAED,EAAE,CAAC,SAASD,EAAED,EAAE,EAAG,CACvBD,EAAK,KAAKI,EAAED,EAAE,EACd,KACF,CAGJ,OAAOH,CACT,EAEMK,EAAc,SAAU,EAAoB,CAChD,IAAMC,EAAO,IAAI,IACXC,EAAsB,CAAC,EAC7B,IAAK,IAAMC,KAAQC,EACZD,GAAM,OAAS,GAAK,IAAIA,EAAK,KAAK,IACvCF,EAAK,IAAIE,EAAK,KAAK,EACnBD,EAAO,KAAKC,CAAI,GAElB,OAAOD,CACT,EAEMG,EAAO,SAAU,EAAgB,EAAgC,CACrE,GAAI,CAACC,EAAK,OAAOC,EACjB,IAAMC,EAAIf,EAAI,cAAc,GAAG,EAG/B,OAFAe,EAAE,aAAa,OAAQF,CAAG,EAC1BE,EAAE,YAAYD,CAAQ,EACfC,CACT,EAEMC,EAAO,SAAU,EAAa,CAClC,OAAOhB,EAAI,eAAeiB,CAAG,CAC/B,EAEIC,EAAwB,UAAY,CAAC,EAEnCC,EAAoB,SACxB,EACA,EACA,EACA,EAA0D,CAAC,EAC3D,CACA,IAAMC,EAAIpB,EAAI,cAAc,MAAM,EAC5BqB,EAAQrB,EAAI,cAAc,OAAO,EACjCsB,EAAQtB,EAAI,cAAc,OAAO,EACjCuB,EAAKvB,EAAI,cAAc,MAAM,EAsFnC,MArFA,GAAG,UAAY,WACX,OAAOwB,GAAQ,SACjB,EAAG,YAAcA,EAEjBD,EAAG,YAAYC,CAAG,EAEpBF,EAAM,aAAa,OAAQ,UAAU,EACjCG,EAAQ,WACV,EAAM,SAAW,GACbA,EAAQ,gBACV,EAAM,MAAQA,EAAQ,cACtBH,EAAM,aAAa,aAAcG,EAAQ,aAAa,IAG1DJ,EAAM,YAAYE,CAAE,EACpBF,EAAM,YAAYC,CAAK,EACvBF,EAAE,YAAYC,CAAK,EAmEnB,EAAM,QAAUK,EAChBJ,EAAM,iBAAiB,QAAS,SAnEqB,EAAW,CAC9D,GAAI,KAAK,QACP,GAAI,CACFK,EAAS,UAAU,SAAS,iBAAiBC,EAAW,SACtD,EACA,EACA,EACA,CACA,EAAG,UAAY,WACVC,GAULC,EAAG,IACDF,EAAU,QACVA,EAAU,UACVA,EAAU,OACVA,EAAU,GACZ,EACAV,EAAsB,IAfpB7B,EAAA,IAAI,MACF,gCACEuC,EACA;;EACAG,CACJ,EACA,EAAM,QAAU,GAUpB,CAAC,CACH,OAAS,EAAG,CACV1C,EAAA,IAAI,MAAM,oBAAsB,CAAC,EACjCA,EAAA,IAAI,MAAM,oBAAsB,CAAC,EACjC,EAAM,QAAU,GAChB,EAAG,UAAY,UACjB,MAEA,GAAI,CACFsC,EAAS,UAAU,SAAS,iBAAiBC,EAAW,SACtD,EACA,EACA,EACA,CACA,EAAG,UAAY,WACVC,GASHC,EAAG,WACDF,EAAU,QACVA,EAAU,UACVA,EAAU,OACVA,EAAU,GACZ,EACAV,EAAsB,IAdtB7B,EAAA,IAAI,MACF,+BACEuC,EACA;;EACAG,CACJ,EACA,EAAM,QAAU,GAUpB,CAAC,CACH,OAAS,EAAG,CACV1C,EAAA,IAAI,MAAM,gBAAkB,CAAC,EAC7B,EAAM,QAAU,EAElB,CAEJ,EAE4C,EAAK,EAC1C+B,CACT,EAIMO,EAAWlC,EAAQ,YAAYO,CAAG,EAClC8B,EAAKrC,EAAQ,QAAQ,MACrBI,EAAaG,EAAI,cAAc,KAAK,EAC1CH,EAAW,UAAU,IAAI,cAAe,cAAe,SAAS,EAChEN,EAA2BM,EAAYJ,CAAO,EAC9C,IAAMuC,EAAO1D,EAAAA,GAAG,KACV2D,GAAQ3D,EAAAA,GAAG,MACX4D,EAAK3D,EAAAA,MAAM,YAAY,EACvB4D,EAAQD,EAAKA,EAAG,IAAM,KAEtBE,EAAYF,GAAMJ,EAAG,WAAWI,EAAI,CAAC,EAErCG,EAAQL,EAAK,OAAO,EAEpBM,GACJR,EAAG,SAAS,EAAGE,EAAK,WAAW,CAAC,GAChCF,EAAG,SAAS,EAAGE,EAAK,WAAW,CAAC,GAChCF,EAAG,SAAS,EAAGE,EAAK,MAAM,CAAC,GAC3BF,EAAG,SAAS,EAAGE,EAAK,MAAM,CAAC,GAC3BF,EAAG,SAAS,EAAGG,GAAM,IAAI,CAAC,EAEtBM,GAAgBhC,EADNuB,EAAG,KAAK,EAAGO,CACO,CAAsB,EAClDG,GAAYN,EAAK3B,EAAYuB,EAAG,KAAKI,EAAIF,EAAK,OAAO,CAAC,CAAgB,EAAI,CAAC,EAC3ES,EAAoBP,GAAM,CAACE,EAC7B7B,EAAYN,EAAOsC,GAAeC,EAAS,CAAC,CAAC,CAAC,OAAO,GAAU,CAACV,EAAG,WAAWY,EAAQR,CAAE,CAAC,EACzF,CAAC,EACCS,EAAanE,EAAAA,kBAAkB,EAAG0D,CAAE,EAGtCU,EAA4B,KAC5BC,EAAW,GACXC,EAAkC,GAClCC,EAAkC,GAEhCC,EAAYnD,EAAW,YAAYG,EAAI,cAAc,KAAK,CAAC,EACjE,EAAU,UAAY,gBACtB,IAAMiD,EAAUD,EAAU,YAAYhD,EAAI,cAAc,KAAK,CAAC,EAC9D,EAAQ,UAAY,iBAEpB,IAAMkD,EAAOD,EAAQ,YAAYjD,EAAI,cAAc,KAAK,CAAC,EACzDkD,EAAK,UAAU,IAAI,uBAAwB,aAAa,EACxDA,EAAK,aAAa,OAAQ,SAAS,EACnCA,EAAK,aAAa,aAAc,iBAAiB,EAEjD,IAAMC,EAAgBD,EAAK,YAAYlD,EAAI,cAAc,QAAQ,CAAC,EAClE,EAAc,UAAY,sBAC1B,EAAc,KAAO,SACrB,EAAc,GAAK,yBACnB,EAAc,YAAc,cAC5BmD,EAAc,aAAa,OAAQ,KAAK,EACxCA,EAAc,aAAa,gBAAiB,0BAA0B,EACtEA,EAAc,aAAa,gBAAiB,MAAM,EAClD,EAAc,SAAW,EAEzB,IAAMC,EAAYF,EAAK,YAAYlD,EAAI,cAAc,QAAQ,CAAC,EAU9D,GATA,EAAU,UAAY,sBACtB,EAAU,KAAO,SACjB,EAAU,GAAK,oBACf,EAAU,YAAc,SACxBoD,EAAU,aAAa,OAAQ,KAAK,EACpCA,EAAU,aAAa,gBAAiB,qBAAqB,EAC7DA,EAAU,aAAa,gBAAiB,OAAO,EAC/C,EAAU,SAAW,GAEjBlB,EAAI,CAEN,IAAMmB,EAAQvB,EAAG,KAAK,IAAA,GAAWE,EAAK,cAAc,EAAGE,CAAE,EACrDoB,EAAU,GACd,IAAK,IAAInD,EAAI,EAAGA,EAAIkD,EAAM,OAAQ,IAChC,GACEvB,EAAG,QACDuB,EAAMlD,GACN7B,EAAAA,GAAG,IAAI,MAAM,EACb0D,EAAK,yBAAyB,CAChC,EACA,CACA,IAAMuB,EAAMF,EAAMlD,GAElB,GADA,EAAWwB,EAAS,UAAU,SAAS,SAAS4B,EAAI,IAAKzB,CAAE,EACvD,CAACe,EACH,GACE,iBACApE,EAAAA,MAAM,aAAa8E,EAAI,GAAG,EAC1B,kCACG,CACL,EAAUA,EACV,KACF,CACF,CAcF,GAAI,GAGG,CAIL,IAAMC,EAAM1B,EAAG,MAAMI,CAAE,EACvB,EAAWJ,EAAG,QAAQ,EAAGO,EAAOmB,CAAG,EACnC,EAAW,GACX,IAAMC,EAAa3B,EAAG,mBAAmB0B,EAAKnB,EAAO,CAAC,EAClDoB,EAAW,SACb,EAAW,GACX,AAAcb,IAAUa,EAAW,EAAE,CAAC,IAE1C,CACF,CAGA,IAAMC,GAAsBf,IAAe,SAAWE,EAChDc,EAAwBhB,IAAe,iBAAmB,CAACP,GAAaS,GAAY,EAAQD,EAC5FgB,GAAsBF,GAQtBG,EAAqB,IAAI,KAgB/B,SAd4C,EAA0B,CACpE,IAAMC,EAAY,IAAI,IAEtBC,EAAY,QAAQ,GAAc,CAC3BC,GAAY,OAASA,EAAW,QAAU,EAAE,OACjDF,EAAU,IAAIE,EAAW,MAAOC,EAAgBnC,EAAIkC,CAAU,CAAC,CACjE,CAAC,EAEDH,EAAmB,MAAM,EACzBC,EAAU,SAAS,EAAO,IAAQ,CAChCD,EAAmB,IAAIK,EAAKC,CAAK,CACnC,CAAC,CACH,EAEA,CAA0B5B,EAAa,EAEvC,IAAM6B,EAAmE,SAAU,EAAmB,EAAyB,CAC7H,IAAM1B,EAASmB,EAAmB,IAAIQ,EAAO,KAAK,GAAKJ,EAAgBnC,EAAIuC,CAAM,EACjFR,EAAmB,IAAIQ,EAAO,MAAO3B,CAAM,EAE3C,IAAM4B,EAAYC,EAAU,cAAc,KAAK,EACzCC,EAAqB,CAAC9B,EAAO,SAAUA,EAAO,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,EAC5F,GAAI8B,EAAoB,CACtB,IAAMC,EAAUH,EAAU,YAAYC,EAAU,cAAc,KAAK,CAAC,EACpE,EAAQ,UAAY,wBACpB,EAAQ,YAAcC,CACxB,CAEA,GAAI9B,EAAO,SAAU,CACnB,IAAMgC,EAAeJ,EAAU,YAAYC,EAAU,cAAc,KAAK,CAAC,EACzE,EAAa,UAAY,yBACzB,EAAa,UAAY,GAAG7F,EAAAA,aAAa,GAAGgE,EAAO,UACrD,CAIA,OAFK4B,EAAU,WAAW,OAEnBA,EAFkC,IAG3C,EAEMK,EAA2D,SAAU,EAAmB,EAAyB,CACrH,IAAMjC,EAASmB,EAAmB,IAAIQ,EAAO,KAAK,GAAKJ,EAAgBnC,EAAIuC,CAAM,EACjFR,EAAmB,IAAIQ,EAAO,MAAO3B,CAAM,EAC3C,IAAMkC,EAAWlC,EAAO,SACxB,GAAI,CAACkC,EAAU,OAAO,KAEtB,IAAMC,EAASN,EAAU,cAAc,MAAM,EAG7C,MAFA,GAAO,UAAY,yBACnB,EAAO,YAAc,IAAIK,EAAS,GAC3BC,CACT,EAEIC,EAAgB5C,GAAM,CAACE,EACvBzD,EAAAA,oBAAoB,CACpB,MACA,QAAS,EACT,YACA,KACA,QACA,WACA,WACA,SAAUgF,EACV,UACA,QACA,oBACA,OACA,OACA,oBACA,uBACA,kBACF,CAAC,EACC,CACE,QAAS3D,EAAI,cAAc,SAAS,EACpC,QAASA,EAAI,cAAc,KAAK,EAChC,qBAAsB,UAAY,CAAC,CACrC,EAEA+E,EAAgBD,EAAc,QAC9BE,EAAgBF,EAAc,QAC7BC,EAAc,YACjB,EAAc,UAAY,oDAC1B,EAAc,GAAK,sBACnBA,EAAc,aAAa,OAAQ,UAAU,EAC7CA,EAAc,aAAa,kBAAmB,mBAAmB,EACjE,EAAc,UAAY,kCAC1BA,EAAc,YAAYC,CAAa,GAEzC/B,EAAQ,YAAY8B,CAAa,EAEjC,IAAME,EAAoBrG,EAAAA,wBAAwB,CAChD,MACA,QAAS,EACT,QAASgF,GAAsBhB,EAAU,KACzC,SAAUgB,GACV,uBACA,kBACF,CAAC,EAEKsB,EAAaD,EAAkB,QAC/BE,EAAcF,EAAkB,YACtChC,EAAQ,YAAYiC,CAAU,EAE9B,IAAIE,EAAmCvG,EAAAA,cAAciD,EAAI,CAAC,EACpDuD,EAAkBvG,EAAAA,sBAAsB,CAC5C,MACA,OAAQsG,EACR,uBACA,kBACF,CAAC,EACKE,EAAgBD,EAAgB,QACtCpC,EAAQ,YAAYqC,CAAa,EAEjC,IAAMC,EAAcrC,EAAK,YAAYlD,EAAI,cAAc,QAAQ,CAAC,EAChE,EAAY,UAAY,sBACxB,EAAY,KAAO,SACnB,EAAY,GAAK,sBACjB,EAAY,YAAc,WAC1BuF,EAAY,aAAa,OAAQ,KAAK,EACtCA,EAAY,aAAa,gBAAiB,uBAAuB,EACjEA,EAAY,aAAa,gBAAiB,OAAO,EACjD,EAAY,SAAW,GAGvB,IAAIC,GAA2B,cAC3BC,EAAkB9C,IAAe,QAE/B+C,EAAiB,SAAU,EAAoB,CACnD,GAAcC,EACd,IAAMC,EAAaD,IAAU,SACvBE,EAAiBF,IAAU,cAC3BG,EAAeL,GAAmBE,IAAU,WAClDvC,EAAU,UAAU,OAAO,8BAA+BwC,CAAU,EACpExC,EAAU,aAAa,gBAAiB,OAAOwC,CAAU,CAAC,EAC1D,EAAU,SAAWA,EAAa,EAAI,GAEtCzC,EAAc,UAAU,OAAO,8BAA+B0C,CAAc,EAC5E1C,EAAc,aAAa,gBAAiB,OAAO0C,CAAc,CAAC,EAClE,EAAc,SAAWA,EAAiB,EAAI,GAE9CN,EAAY,UAAU,OAAO,8BAA+BO,CAAY,EACxEP,EAAY,aAAa,gBAAiB,OAAOO,CAAY,CAAC,EAC9D,EAAY,SAAWA,EAAe,EAAI,GAE1Cf,EAAc,UAAU,OAAO,gCAAiCa,CAAU,EAC1Eb,EAAc,aAAa,cAAe,OAAO,CAACa,CAAU,CAAC,EAE7DV,EAAW,UAAU,OAAO,gCAAiCW,CAAc,EAC3EX,EAAW,aAAa,cAAe,OAAO,CAACW,CAAc,CAAC,EAE9DP,EAAc,UAAU,OAAO,gCAAiCQ,CAAY,EAC5ER,EAAc,aAAa,cAAe,OAAO,CAACQ,CAAY,CAAC,EAC/D,EAAc,OAAS,CAACL,GAAmB,CAACK,CAC9C,EACMC,GAAuB,UAAY,CACvC,GAAI,CAAC7D,GAAME,EAAW,OAEtB,IAAMoB,EAAM1B,EAAG,MAAMI,CAAE,EACvB,EAAWJ,EAAG,QAAQ,EAAGO,EAAOmB,CAAG,EAGnC,EAD2B1B,EAAG,mBAAmB0B,EAAKnB,EAAO,CAClD,CAAA,CAAmB,OAAS,EAEvC,IAAM2D,EAAoBrH,EAAAA,oBAAoB,CAC5C,MACA,QAAS,EACT,YACA,KACA,QACA,WACA,WACA,SAAUgF,EACV,UACA,QACA,oBACA,OACA,OACA,oBACA,uBACA,kBACF,CAAC,EAEDoB,EAAc,YAAYiB,EAAkB,OAAO,EACnD,EAAgBA,EAChB,EAAgBA,EAAkB,QAClC,EAAgBA,EAAkB,OACpC,EAEA,EAAwB,UAAY,CAClCD,GAAqB,EACrB,EAAiBlH,EAAAA,cAAciD,EAAI,CAAC,EACpCuD,EAAgB,gBAAgBD,CAAc,EAC9CM,EAAeF,EAAW,CAC5B,EAEAE,EAAe,aAAa,EAE5B,IAAMO,EAAkB,SAAU,EAAkB,CAClD,IAAMC,EAAgBC,IAAS,iBAAmB,CAAC/D,EACnD,EAAkB+D,IAAS,QAC3B,EAAU,OAAS,CAACD,EACpB,EAAY,OAAS,CAACT,EAEpBC,EAAe,aAEjB,CAEF,EAEAtC,EAAU,iBAAiB,QAAS,UAAY,CAC9CsC,EAAe,QAAQ,CACzB,CAAC,EAEDvC,EAAc,iBAAiB,QAAS,UAAY,CAClDuC,EAAe,aAAa,CAC9B,CAAC,EAEDH,EAAY,iBAAiB,QAAS,UAAY,CAChDG,EAAe,UAAU,CAC3B,CAAC,EAED,IAAMU,GAAqB,UAAY,CACrC,IAAMC,EAAWlB,EAA4D,QACzE,OAAOkB,GAAY,YAEvBA,EAAQ,KAAKlB,CAAW,CAC1B,EAEMmB,GAAuB,UAAY,CACvCxB,EAAc,qBAAqB,CACrC,EAyCA,OAvCE,SAAY,CACZ,GAAI,CACF,UAAW,IAAMyB,KAAmBC,EAAc/G,EAAS,CAAC,EAC1DoE,EAAmB,MAAM,EACzB0C,EAAgB,QAAQ,GAAU,CAChC1C,EAAmB,IAAInB,EAAO,IAAKA,CAAM,CAC3C,CAAC,EACD0D,GAAmB,EACnBE,GAAqB,CAEzB,MAAQ,CAER,CACF,EAAA,CAAG,GAED,SAAY,CACZ,GAAI,CACF,EAAiB,MAAMvH,EAAAA,qBAAqBU,EAAS,CAAC,EACtD4F,EAAgB,gBAAgBD,CAAc,EAC9CgB,GAAmB,EACnBE,GAAqB,CACvB,MAAQ,CAER,CACF,EAAA,CAAG,EAIHL,EAAgB,WAAW,EAE3B3G,EAAA,MAAM,UAAU,CAAC,CACd,KAAK,GAAS,CACb,IAAMmH,EAAsBjI,EAAAA,kBAAkB,EAAGkI,CAAK,EACtDT,EAAgBQ,CAAmB,CACrC,CAAC,CAAC,CACD,UAAY,CACXR,EAAgB,WAAW,CAC7B,CAAC,EAEIpG,CACT,CACF,EAMM8G,EAAoB,EAmB1B,SAAgBC,EAAgB,EAAkB,EAA4B,CAC5E,IAAIhC,EAAWiC,EAAM,MAAM9G,EAASzB,EAAAA,GAAG,MAAM,yBAAyB,CAAC,GAAK,GAC5E,GAAIsG,EAAU,CACZ,IAAMkC,EAAOD,EAAM,MAAM9G,EAASzB,EAAAA,GAAG,MAAM,wBAAwB,CAAC,EAChEwI,IACF,GAAY,IAAMA,EAEtB,CACA,OAAOlC,GAAY,EACrB,CAEA,SAASmC,EAAgB,EAA4B,EAAyB,CAC5E,OAAOC,GAAeC,EAClB,GAAGA,EAAS,IAAID,IAChBA,GAAeC,GAAY,IACjC,CAEA,SAAShD,EAAiB,EAAY,EAAsC,CAC1E,IAAMiD,EACJL,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,MAAM,IAAI,CAAC,GACzCuI,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,KAAK,MAAM,CAAC,GAC1C,KACI6I,EACJN,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,MAAM,UAAU,CAAC,GAC/CuI,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,KAAK,MAAM,CAAC,GAC1C,KACI8I,EAAcP,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,MAAM,MAAM,CAAC,GAAK,KAC9D+I,EAAWrI,EAAAA,QAAQ,UAAUgF,CAAU,EACvCsD,EAAWT,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,MAAM,MAAM,CAAC,GAAK,KAC3DiJ,EAAUV,EAAM,SAAS7C,EAAY1F,EAAAA,GAAG,MAAM,mBAAmB,CAAC,GAAK,KAEvEkJ,EAD0BX,EAAM,IAAI7C,EAAY1F,EAAAA,GAAG,MAAM,YAAY,CACzC,GAA2B,KAUvDmJ,EAAWV,EARbS,GAAW,KAEP,KADAX,EAAM,SAASW,EAASlJ,EAAAA,GAAG,MAAM,cAAc,CAAC,EAGtDkJ,GAAW,KAEP,KADAX,EAAM,SAASW,EAASlJ,EAAAA,GAAG,MAAM,UAAU,CAAC,CAGG,EAC/CsG,EAAWgC,EAAeC,EAAO7C,CAAU,EAEjD,MAAO,CACL,IAAKA,EAAW,MAChB,SAAUqD,EACV,OACA,WACA,WACA,aAAcE,EACd,UAAWH,EACX,WACA,WACA,YAAapD,CACf,CACF,CAEA,eAAwBwC,EACtB,EACA,EACA,EAAYG,EACiC,CAC7C,IAAME,EAAQpH,EAAQ,QAAQ,MACxBiI,EAAWb,GAAe,QAEhC,GAAIa,GAAW,OAAOA,EAAQ,MAAS,WACrC,GAAI,CACF,MAAMA,EAAQ,KAAK3H,EAAQ,IAAI,CAAC,CAClC,MAAQ,CAER,CAGF,IAAMS,EAAO,IAAI,IACXuD,EAAc8C,EAAM,KAAK9G,EAASzB,EAAAA,GAAG,KAAK,OAAO,EAAG,KAAMyB,EAAQ,IAAI,CAAC,EACvE4H,EAAiC,CAAC,EAExC,IAAK,IAAM3D,KAAcD,EAAa,CACpC,IAAMG,EAAMF,GAAY,MACnBE,GAAO,GAAK,IAAIA,CAAG,GAAKnE,EAAQ,QAAUmE,IAC/C1D,EAAK,IAAI0D,CAAG,EACZyD,EAAkB,KAAK3D,CAAuB,EAChD,CAEA,IAAM4D,EAA2B,CAAC,EAElC,IAAK,IAAM5D,KAAc2D,EAAmB,CAC1C,GAAID,GAAW,OAAOA,EAAQ,MAAS,WACrC,GAAI,CACF,MAAMA,EAAQ,KAAK1D,EAAW,IAAI,CAAC,CACrC,MAAQ,CAER,CAGF4D,EAAQ,KAAK3D,EAAgB4C,EAAO7C,CAAU,CAAC,EAE3C4D,EAAQ,OAASC,IAAc,IACjC,KAAM,CAAC,GAAGD,CAAO,EAErB,CAEIA,EAAQ,OAAS,GAAKA,EAAQ,OAASC,IAAc,IACvD,KAAM,CAAC,GAAGD,CAAO,EAErB,C"}
|