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
package/README.md
CHANGED
|
@@ -50,19 +50,20 @@ Volunteers are always welcome!
|
|
|
50
50
|
- [Conventions](./Documentation/conventions.md)
|
|
51
51
|
|
|
52
52
|
## Development
|
|
53
|
-
|
|
54
|
-
through https://github.com/nvm-sh/nvm),
|
|
55
|
-
|
|
53
|
+
|
|
54
|
+
To get started, make sure you have Node.js installed (for instance through [nvm](https://github.com/nvm-sh/nvm)), then:
|
|
55
|
+
|
|
56
|
+
1. Clone, install, and start the dev server:
|
|
57
|
+
|
|
56
58
|
```sh
|
|
57
59
|
git clone https://github.com/solidos/solid-panes
|
|
58
60
|
cd solid-panes
|
|
59
61
|
npm install
|
|
60
|
-
npm
|
|
62
|
+
npm start
|
|
61
63
|
```
|
|
62
|
-
2.
|
|
63
|
-
3. Once you arrive at the Solid Pane Tester page, the `profile-pane` will be loaded by default. Proceed to edit `solid-panes/dev/loader.ts` and, at line 5, you should see `import Pane from 'profile-pane'`. Simply change `'profile-pane'` to your preferred pane/directory containing the pane of choice; for example, you could choose `'source-pane'` and bam, it will load that pane. For those who are new, you can go to the `solid-panes/src` directory and manually navigate through each individual folder. In most folders, you simply look for any file that has `pane` in the title. Copy and paste the `pane.js` file of your choice into the `solid-panes/dev/pane` folder, or you can import directly from the `src` directory. For example, importing from `'../src/dokieli/dokieliPane'` will work just fine. Each time you save `solid-panes/dev/loader.ts` while importing a different pane, your browser at `http://localhost:9000/` should automatically refresh. It's a good idea to keep the developer console open in your web browser to ensure panes are loading and rendering properly.
|
|
64
|
+
2. Open http://localhost:5173 in your browser. You should see the pane development sandbox.
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
3. You can change the `subject` in the sandbox to determine which pane gets rendered. For example, the default subject loads the `profile-pane`.
|
|
66
67
|
|
|
67
68
|
## Contributing panes
|
|
68
69
|
When you created a pane, you can either add it as an npm dependency
|
|
@@ -80,8 +81,8 @@ pane. Any other pane which wants to deal with contacts can just use the pane wit
|
|
|
80
81
|
|
|
81
82
|
|
|
82
83
|
## Generative AI usage
|
|
83
|
-
The SolidOS team is using GitHub Copilot integrated in Visual Studio Code.
|
|
84
|
-
We have added comments in the code to make it explicit which parts are 100% written by AI.
|
|
84
|
+
The SolidOS team is using GitHub Copilot integrated in Visual Studio Code.
|
|
85
|
+
We have added comments in the code to make it explicit which parts are 100% written by AI.
|
|
85
86
|
|
|
86
87
|
### Prompt usage hitory:
|
|
87
88
|
* Model Claude Opus 4.6: Initially solid-panes is loaded into an HTML shell form mashlib that looks like ... Also, an iFrame is rendered inside the `<div class="TabulatorOutline" id="DummyUUID">` for “isolated pane rendering”. Analyze the solid-panes code for what it uses from this HTML and suggest a new HTML structure which is mobile and accessibility friendly. Let's go ahead and make changes in this code as suggested to accommodate the new databrowser HTML.
|
|
@@ -121,4 +122,3 @@ I want the menu to have a tiny button on the bottom margin left with an arrow to
|
|
|
121
122
|
* Raptor mini: Please always keep the footer at the bottom of the menu
|
|
122
123
|
|
|
123
124
|
* GPT-5.4 Model: Add a compatibility shim in the form pane for mixed `ui:Group` plus field typing.
|
|
124
|
-
|
package/dist/RDFXMLPane.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import './RDFXMLPane.css';
|
|
1
|
+
import { DataBrowserContext } from '../node_modules/pane-registry';
|
|
2
|
+
import { NamedNode } from '../node_modules/rdflib';
|
|
4
3
|
type RDFXMLPaneDefinition = {
|
|
5
4
|
icon: string;
|
|
6
5
|
name: string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`.rdfxml-pane{border-top:solid 2px var(--color-data-pane-border-top,black);border-left:solid 2px var(--color-data-pane-border-top,black);border-bottom:solid 2px var(--color-data-pane-border-side,#777);border-right:solid 2px var(--color-data-pane-border-side,#777);color:var(--color-text-brown,#440);box-sizing:border-box;padding:1rem}.rdfxml-pane__source{box-sizing:border-box;white-space:pre;max-width:100%;margin:0;font-family:monospace;font-size:120%;overflow-x:auto}.rdfxml-pane__line{grid-template-columns:var(--rdfxml-indent,0) minmax(max-content, auto);align-items:start;display:grid}.rdfxml-pane__line-indent{width:var(--rdfxml-indent,0);display:block}.rdfxml-pane__line-content{white-space:pre}.rdfxml-pane[data-layout=mobile] .rdfxml-pane__source{overflow-wrap:anywhere;word-break:break-word;white-space:normal}.rdfxml-pane[data-layout=mobile] .rdfxml-pane__line{grid-template-columns:var(--rdfxml-indent,0) minmax(0, 1fr)}.rdfxml-pane[data-layout=mobile] .rdfxml-pane__line-content{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;min-width:0}@media (width<=576px){.rdfxml-pane__source{overflow-wrap:anywhere;word-break:break-word;white-space:normal}.rdfxml-pane__line{grid-template-columns:var(--rdfxml-indent,0) minmax(0, 1fr)}.rdfxml-pane__line-content{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;min-width:0}}`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();const e=require("./_virtual/_rolldown/runtime.cjs.js");;let t=require("solid-ui");t=e.__toESM(t);let n=require("rdflib");n=e.__toESM(n);var r=t.ns;function i(e){if(e.trim().length===0)return 0;let t=0;for(let n of e){if(n===` `){t+=1;continue}if(n===` `){t+=2;continue}break}return Math.max(t,2)}function a(e){return e.replace(/^[ \t]+/,``)}var o={icon:t.icons.originalIconBase+`22-text-xml4.png`,name:`RDFXML`,audience:[r.solid(`Developer`)],label:function(e,t){let n=t.session.store;if(`http://www.w3.org/2007/ont/link#ProtocolEvent`in n.findTypeURIs(e))return null;let r=n.statementsMatching(void 0,void 0,void 0,e).length;return r===0?null:`As RDF/XML (`+r+`)`},render:function(e,t){let r=t.dom,o=t.session.store;function s(e){let n=t.environment??{};e.dataset.layout=n.layout??`desktop`}let c=r.createElement(`div`);c.setAttribute(`class`,`rdfxml-pane`),s(c);let l=o.statementsMatching(void 0,void 0,void 0,e),u=n.Serializer(o);u.suggestNamespaces(o.namespaces),u.setBase(e.uri);let d=u.statementsToXML(l),f=r.createElement(`div`);return f.classList.add(`rdfxml-pane__source`),d.split(`
|
|
2
|
+
`).forEach(e=>{let t=r.createElement(`div`),n=r.createElement(`span`),o=r.createElement(`span`),s=i(e);t.classList.add(`rdfxml-pane__line`),t.style.setProperty(`--rdfxml-indent`,`${s}ch`),n.classList.add(`rdfxml-pane__line-indent`),n.setAttribute(`aria-hidden`,`true`),o.classList.add(`rdfxml-pane__line-content`),o.textContent=e.length>0?a(e):` `,t.appendChild(n),t.appendChild(o),f.appendChild(t)}),c.appendChild(f),c}};exports.RDFXMLPane=o;
|
|
3
|
+
//# sourceMappingURL=RDFXMLPane2.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RDFXMLPane2.cjs.js","names":[],"sources":["../src/RDFXMLPane.ts"],"sourcesContent":["/* RDF/XML content Pane\n **\n ** This pane shows the content of a particular RDF resource\n ** or at least the RDF semantics we attribute to that resource,\n ** in generated N3 syntax.\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nimport type { DataBrowserContext, RenderEnvironment } from 'pane-registry'\nimport type { NamedNode, Statement } from 'rdflib'\nimport './RDFXMLPane.css'\n\nconst ns = UI.ns\n\ntype RDFXMLPaneDefinition = {\n icon: string\n name: string\n audience: NamedNode[]\n label: (subject: NamedNode, context: DataBrowserContext) => string | null\n render: (subject: NamedNode, context: DataBrowserContext) => HTMLDivElement\n}\n\nfunction leadingIndentWidth (line: string): number {\n if (line.trim().length === 0) {\n return 0\n }\n\n let width = 0\n for (const character of line) {\n if (character === ' ') {\n width += 1\n continue\n }\n if (character === '\\t') {\n width += 2\n continue\n }\n break\n }\n return Math.max(width, 2)\n}\n\nfunction trimLeadingIndent (line: string): string {\n return line.replace(/^[ \\t]+/, '')\n}\n\nexport const RDFXMLPane: RDFXMLPaneDefinition = {\n icon: UI.icons.originalIconBase + '22-text-xml4.png',\n\n name: 'RDFXML',\n\n audience: [ns.solid('Developer')],\n\n label: function (subject: NamedNode, context: DataBrowserContext): string | null {\n const store = context.session.store\n if (\n 'http://www.w3.org/2007/ont/link#ProtocolEvent' in\n store.findTypeURIs(subject)\n ) {\n return null\n }\n\n const n = store.statementsMatching(undefined, undefined, undefined, subject)\n .length\n if (n === 0) return null\n return 'As RDF/XML (' + n + ')'\n },\n\n render: function (\n subject: NamedNode,\n context: DataBrowserContext\n ): HTMLDivElement {\n const myDocument = context.dom\n const kb = context.session.store\n\n function applyEnvironmentAttributes (element: HTMLDivElement): void {\n const environment = (context.environment ?? {}) as Partial<RenderEnvironment>\n element.dataset.layout = environment.layout ?? 'desktop'\n }\n\n const div = myDocument.createElement('div')\n div.setAttribute('class', 'rdfxml-pane')\n applyEnvironmentAttributes(div)\n // Because of smushing etc, this will not be a copy of the original source\n // We could instead either fetch and re-parse the source,\n // or we could keep all the pre-smushed triples.\n const sts = kb.statementsMatching(\n undefined,\n undefined,\n undefined,\n subject\n ) as Statement[] // @@ slow with current store!\n /*\n var kludge = kb.formula([]) // No features\n for (var i=0; i< sts.length; i++) {\n s = sts[i]\n kludge.add(s.subject, s.predicate, s.object)\n }\n */\n const sz = $rdf.Serializer(kb)\n sz.suggestNamespaces(kb.namespaces)\n sz.setBase(subject.uri)\n const str = sz.statementsToXML(sts)\n const source = myDocument.createElement('div')\n source.classList.add('rdfxml-pane__source')\n\n str.split('\\n').forEach(line => {\n const lineElement = myDocument.createElement('div')\n const indentElement = myDocument.createElement('span')\n const contentElement = myDocument.createElement('span')\n const indentWidth = leadingIndentWidth(line)\n\n lineElement.classList.add('rdfxml-pane__line')\n lineElement.style.setProperty('--rdfxml-indent', `${indentWidth}ch`)\n\n indentElement.classList.add('rdfxml-pane__line-indent')\n indentElement.setAttribute('aria-hidden', 'true')\n\n contentElement.classList.add('rdfxml-pane__line-content')\n contentElement.textContent = line.length > 0 ? trimLeadingIndent(line) : ' '\n\n lineElement.appendChild(indentElement)\n lineElement.appendChild(contentElement)\n source.appendChild(lineElement)\n })\n\n div.appendChild(source)\n return div\n }\n}\n\n// ends\n"],"mappings":"sKAaA,IAAM,EAAK,EAAG,GAUd,SAAS,EAAoB,EAAsB,CACjD,GAAI,EAAK,KAAK,CAAC,CAAC,SAAW,EACzB,MAAO,GAGT,IAAI,EAAQ,EACZ,IAAK,IAAM,KAAa,EAAM,CAC5B,GAAI,IAAc,IAAK,CACrB,GAAS,EACT,QACF,CACA,GAAI,IAAc,IAAM,CACtB,GAAS,EACT,QACF,CACA,KACF,CACA,OAAO,KAAK,IAAI,EAAO,CAAC,CAC1B,CAEA,SAAS,EAAmB,EAAsB,CAChD,OAAO,EAAK,QAAQ,UAAW,EAAE,CACnC,CAEA,IAAa,EAAmC,CAC9C,KAAM,EAAG,MAAM,iBAAmB,mBAElC,KAAM,SAEN,SAAU,CAAC,EAAG,MAAM,WAAW,CAAC,EAEhC,MAAO,SAAU,EAAoB,EAA4C,CAC/E,IAAM,EAAQ,EAAQ,QAAQ,MAC9B,GACE,kDACA,EAAM,aAAa,CAAO,EAE1B,OAAO,KAGT,IAAM,EAAI,EAAM,mBAAmB,IAAA,GAAW,IAAA,GAAW,IAAA,GAAW,CAAO,CAAC,CACzE,OAEH,OADI,IAAM,EAAU,KACb,eAAiB,EAAI,GAC9B,EAEA,OAAQ,SACN,EACA,EACgB,CAChB,IAAM,EAAa,EAAQ,IACrB,EAAK,EAAQ,QAAQ,MAE3B,SAAS,EAA4B,EAA+B,CAClE,IAAM,EAAe,EAAQ,aAAe,CAAC,EAC7C,EAAQ,QAAQ,OAAS,EAAY,QAAU,SACjD,CAEA,IAAM,EAAM,EAAW,cAAc,KAAK,EAC1C,EAAI,aAAa,QAAS,aAAa,EACvC,EAA2B,CAAG,EAI9B,IAAM,EAAM,EAAG,mBACb,IAAA,GACA,IAAA,GACA,IAAA,GACA,CACF,EAQM,EAAK,EAAK,WAAW,CAAE,EAC7B,EAAG,kBAAkB,EAAG,UAAU,EAClC,EAAG,QAAQ,EAAQ,GAAG,EACtB,IAAM,EAAM,EAAG,gBAAgB,CAAG,EAC5B,EAAS,EAAW,cAAc,KAAK,EAwB7C,OAvBA,EAAO,UAAU,IAAI,qBAAqB,EAE1C,EAAI,MAAM;CAAI,CAAC,CAAC,QAAQ,GAAQ,CAC9B,IAAM,EAAc,EAAW,cAAc,KAAK,EAC5C,EAAgB,EAAW,cAAc,MAAM,EAC/C,EAAiB,EAAW,cAAc,MAAM,EAChD,EAAc,EAAmB,CAAI,EAE3C,EAAY,UAAU,IAAI,mBAAmB,EAC7C,EAAY,MAAM,YAAY,kBAAmB,GAAG,EAAY,GAAG,EAEnE,EAAc,UAAU,IAAI,0BAA0B,EACtD,EAAc,aAAa,cAAe,MAAM,EAEhD,EAAe,UAAU,IAAI,2BAA2B,EACxD,EAAe,YAAc,EAAK,OAAS,EAAI,EAAkB,CAAI,EAAI,IAEzE,EAAY,YAAY,CAAa,EACrC,EAAY,YAAY,CAAc,EACtC,EAAO,YAAY,CAAW,CAChC,CAAC,EAED,EAAI,YAAY,CAAM,EACf,CACT,CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
(function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`.rdfxml-pane{border-top:solid 2px var(--color-data-pane-border-top,black);border-left:solid 2px var(--color-data-pane-border-top,black);border-bottom:solid 2px var(--color-data-pane-border-side,#777);border-right:solid 2px var(--color-data-pane-border-side,#777);color:var(--color-text-brown,#440);box-sizing:border-box;padding:1rem}.rdfxml-pane__source{box-sizing:border-box;white-space:pre;max-width:100%;margin:0;font-family:monospace;font-size:120%;overflow-x:auto}.rdfxml-pane__line{grid-template-columns:var(--rdfxml-indent,0) minmax(max-content, auto);align-items:start;display:grid}.rdfxml-pane__line-indent{width:var(--rdfxml-indent,0);display:block}.rdfxml-pane__line-content{white-space:pre}.rdfxml-pane[data-layout=mobile] .rdfxml-pane__source{overflow-wrap:anywhere;word-break:break-word;white-space:normal}.rdfxml-pane[data-layout=mobile] .rdfxml-pane__line{grid-template-columns:var(--rdfxml-indent,0) minmax(0, 1fr)}.rdfxml-pane[data-layout=mobile] .rdfxml-pane__line-content{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;min-width:0}@media (width<=576px){.rdfxml-pane__source{overflow-wrap:anywhere;word-break:break-word;white-space:normal}.rdfxml-pane__line{grid-template-columns:var(--rdfxml-indent,0) minmax(0, 1fr)}.rdfxml-pane__line-content{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;min-width:0}}`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();
|
|
2
|
+
import * as e from "solid-ui";
|
|
3
|
+
import * as t from "rdflib";
|
|
4
|
+
//#region src/RDFXMLPane.ts
|
|
5
|
+
var n = e.ns;
|
|
6
|
+
function r(e) {
|
|
7
|
+
if (e.trim().length === 0) return 0;
|
|
8
|
+
let t = 0;
|
|
9
|
+
for (let n of e) {
|
|
10
|
+
if (n === " ") {
|
|
11
|
+
t += 1;
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
if (n === " ") {
|
|
15
|
+
t += 2;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
return Math.max(t, 2);
|
|
21
|
+
}
|
|
22
|
+
function i(e) {
|
|
23
|
+
return e.replace(/^[ \t]+/, "");
|
|
24
|
+
}
|
|
25
|
+
var a = {
|
|
26
|
+
icon: e.icons.originalIconBase + "22-text-xml4.png",
|
|
27
|
+
name: "RDFXML",
|
|
28
|
+
audience: [n.solid("Developer")],
|
|
29
|
+
label: function(e, t) {
|
|
30
|
+
let n = t.session.store;
|
|
31
|
+
if ("http://www.w3.org/2007/ont/link#ProtocolEvent" in n.findTypeURIs(e)) return null;
|
|
32
|
+
let r = n.statementsMatching(void 0, void 0, void 0, e).length;
|
|
33
|
+
return r === 0 ? null : "As RDF/XML (" + r + ")";
|
|
34
|
+
},
|
|
35
|
+
render: function(e, n) {
|
|
36
|
+
let a = n.dom, o = n.session.store;
|
|
37
|
+
function s(e) {
|
|
38
|
+
let t = n.environment ?? {};
|
|
39
|
+
e.dataset.layout = t.layout ?? "desktop";
|
|
40
|
+
}
|
|
41
|
+
let c = a.createElement("div");
|
|
42
|
+
c.setAttribute("class", "rdfxml-pane"), s(c);
|
|
43
|
+
let l = o.statementsMatching(void 0, void 0, void 0, e), u = t.Serializer(o);
|
|
44
|
+
u.suggestNamespaces(o.namespaces), u.setBase(e.uri);
|
|
45
|
+
let d = u.statementsToXML(l), f = a.createElement("div");
|
|
46
|
+
return f.classList.add("rdfxml-pane__source"), d.split("\n").forEach((e) => {
|
|
47
|
+
let t = a.createElement("div"), n = a.createElement("span"), o = a.createElement("span"), s = r(e);
|
|
48
|
+
t.classList.add("rdfxml-pane__line"), t.style.setProperty("--rdfxml-indent", `${s}ch`), n.classList.add("rdfxml-pane__line-indent"), n.setAttribute("aria-hidden", "true"), o.classList.add("rdfxml-pane__line-content"), o.textContent = e.length > 0 ? i(e) : " ", t.appendChild(n), t.appendChild(o), f.appendChild(t);
|
|
49
|
+
}), c.appendChild(f), c;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
//#endregion
|
|
53
|
+
export { a as RDFXMLPane };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=RDFXMLPane2.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RDFXMLPane2.esm.js","names":[],"sources":["../src/RDFXMLPane.ts"],"sourcesContent":["/* RDF/XML content Pane\n **\n ** This pane shows the content of a particular RDF resource\n ** or at least the RDF semantics we attribute to that resource,\n ** in generated N3 syntax.\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nimport type { DataBrowserContext, RenderEnvironment } from 'pane-registry'\nimport type { NamedNode, Statement } from 'rdflib'\nimport './RDFXMLPane.css'\n\nconst ns = UI.ns\n\ntype RDFXMLPaneDefinition = {\n icon: string\n name: string\n audience: NamedNode[]\n label: (subject: NamedNode, context: DataBrowserContext) => string | null\n render: (subject: NamedNode, context: DataBrowserContext) => HTMLDivElement\n}\n\nfunction leadingIndentWidth (line: string): number {\n if (line.trim().length === 0) {\n return 0\n }\n\n let width = 0\n for (const character of line) {\n if (character === ' ') {\n width += 1\n continue\n }\n if (character === '\\t') {\n width += 2\n continue\n }\n break\n }\n return Math.max(width, 2)\n}\n\nfunction trimLeadingIndent (line: string): string {\n return line.replace(/^[ \\t]+/, '')\n}\n\nexport const RDFXMLPane: RDFXMLPaneDefinition = {\n icon: UI.icons.originalIconBase + '22-text-xml4.png',\n\n name: 'RDFXML',\n\n audience: [ns.solid('Developer')],\n\n label: function (subject: NamedNode, context: DataBrowserContext): string | null {\n const store = context.session.store\n if (\n 'http://www.w3.org/2007/ont/link#ProtocolEvent' in\n store.findTypeURIs(subject)\n ) {\n return null\n }\n\n const n = store.statementsMatching(undefined, undefined, undefined, subject)\n .length\n if (n === 0) return null\n return 'As RDF/XML (' + n + ')'\n },\n\n render: function (\n subject: NamedNode,\n context: DataBrowserContext\n ): HTMLDivElement {\n const myDocument = context.dom\n const kb = context.session.store\n\n function applyEnvironmentAttributes (element: HTMLDivElement): void {\n const environment = (context.environment ?? {}) as Partial<RenderEnvironment>\n element.dataset.layout = environment.layout ?? 'desktop'\n }\n\n const div = myDocument.createElement('div')\n div.setAttribute('class', 'rdfxml-pane')\n applyEnvironmentAttributes(div)\n // Because of smushing etc, this will not be a copy of the original source\n // We could instead either fetch and re-parse the source,\n // or we could keep all the pre-smushed triples.\n const sts = kb.statementsMatching(\n undefined,\n undefined,\n undefined,\n subject\n ) as Statement[] // @@ slow with current store!\n /*\n var kludge = kb.formula([]) // No features\n for (var i=0; i< sts.length; i++) {\n s = sts[i]\n kludge.add(s.subject, s.predicate, s.object)\n }\n */\n const sz = $rdf.Serializer(kb)\n sz.suggestNamespaces(kb.namespaces)\n sz.setBase(subject.uri)\n const str = sz.statementsToXML(sts)\n const source = myDocument.createElement('div')\n source.classList.add('rdfxml-pane__source')\n\n str.split('\\n').forEach(line => {\n const lineElement = myDocument.createElement('div')\n const indentElement = myDocument.createElement('span')\n const contentElement = myDocument.createElement('span')\n const indentWidth = leadingIndentWidth(line)\n\n lineElement.classList.add('rdfxml-pane__line')\n lineElement.style.setProperty('--rdfxml-indent', `${indentWidth}ch`)\n\n indentElement.classList.add('rdfxml-pane__line-indent')\n indentElement.setAttribute('aria-hidden', 'true')\n\n contentElement.classList.add('rdfxml-pane__line-content')\n contentElement.textContent = line.length > 0 ? trimLeadingIndent(line) : ' '\n\n lineElement.appendChild(indentElement)\n lineElement.appendChild(contentElement)\n source.appendChild(lineElement)\n })\n\n div.appendChild(source)\n return div\n }\n}\n\n// ends\n"],"mappings":";;;;AAaA,IAAM,IAAK,EAAG;AAUd,SAAS,EAAoB,GAAsB;CACjD,IAAI,EAAK,KAAK,CAAC,CAAC,WAAW,GACzB,OAAO;CAGT,IAAI,IAAQ;CACZ,KAAK,IAAM,KAAa,GAAM;EAC5B,IAAI,MAAc,KAAK;GACrB,KAAS;GACT;EACF;EACA,IAAI,MAAc,KAAM;GACtB,KAAS;GACT;EACF;EACA;CACF;CACA,OAAO,KAAK,IAAI,GAAO,CAAC;AAC1B;AAEA,SAAS,EAAmB,GAAsB;CAChD,OAAO,EAAK,QAAQ,WAAW,EAAE;AACnC;AAEA,IAAa,IAAmC;CAC9C,MAAM,EAAG,MAAM,mBAAmB;CAElC,MAAM;CAEN,UAAU,CAAC,EAAG,MAAM,WAAW,CAAC;CAEhC,OAAO,SAAU,GAAoB,GAA4C;EAC/E,IAAM,IAAQ,EAAQ,QAAQ;EAC9B,IACE,mDACA,EAAM,aAAa,CAAO,GAE1B,OAAO;EAGT,IAAM,IAAI,EAAM,mBAAmB,KAAA,GAAW,KAAA,GAAW,KAAA,GAAW,CAAO,CAAC,CACzE;EAEH,OADI,MAAM,IAAU,OACb,iBAAiB,IAAI;CAC9B;CAEA,QAAQ,SACN,GACA,GACgB;EAChB,IAAM,IAAa,EAAQ,KACrB,IAAK,EAAQ,QAAQ;EAE3B,SAAS,EAA4B,GAA+B;GAClE,IAAM,IAAe,EAAQ,eAAe,CAAC;GAC7C,EAAQ,QAAQ,SAAS,EAAY,UAAU;EACjD;EAEA,IAAM,IAAM,EAAW,cAAc,KAAK;EAE1C,AADA,EAAI,aAAa,SAAS,aAAa,GACvC,EAA2B,CAAG;EAI9B,IAAM,IAAM,EAAG,mBACb,KAAA,GACA,KAAA,GACA,KAAA,GACA,CACF,GAQM,IAAK,EAAK,WAAW,CAAE;EAE7B,AADA,EAAG,kBAAkB,EAAG,UAAU,GAClC,EAAG,QAAQ,EAAQ,GAAG;EACtB,IAAM,IAAM,EAAG,gBAAgB,CAAG,GAC5B,IAAS,EAAW,cAAc,KAAK;EAwB7C,OAvBA,EAAO,UAAU,IAAI,qBAAqB,GAE1C,EAAI,MAAM,IAAI,CAAC,CAAC,SAAQ,MAAQ;GAC9B,IAAM,IAAc,EAAW,cAAc,KAAK,GAC5C,IAAgB,EAAW,cAAc,MAAM,GAC/C,IAAiB,EAAW,cAAc,MAAM,GAChD,IAAc,EAAmB,CAAI;GAa3C,AAXA,EAAY,UAAU,IAAI,mBAAmB,GAC7C,EAAY,MAAM,YAAY,mBAAmB,GAAG,EAAY,GAAG,GAEnE,EAAc,UAAU,IAAI,0BAA0B,GACtD,EAAc,aAAa,eAAe,MAAM,GAEhD,EAAe,UAAU,IAAI,2BAA2B,GACxD,EAAe,cAAc,EAAK,SAAS,IAAI,EAAkB,CAAI,IAAI,KAEzE,EAAY,YAAY,CAAa,GACrC,EAAY,YAAY,CAAc,GACtC,EAAO,YAAY,CAAW;EAChC,CAAC,GAED,EAAI,YAAY,CAAM,GACf;CACT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></g></svg>`}};customElements.get(`icon-lucide-user`)||customElements.define(`icon-lucide-user`,e),exports.default=e;
|
|
2
|
+
//# sourceMappingURL=user.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.cjs.js","names":[],"sources":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region ~icons/lucide/user
|
|
2
|
+
var e = class extends HTMLElement {
|
|
3
|
+
constructor() {
|
|
4
|
+
super(), this.attachShadow({ mode: "open" }).innerHTML = "<style>:host { display: inline-flex; }</style><svg viewBox=\"0 0 24 24\" width=\"100%\" height=\"100%\" ><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></g></svg>";
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
customElements.get("icon-lucide-user") || customElements.define("icon-lucide-user", e);
|
|
8
|
+
//#endregion
|
|
9
|
+
export { e as default };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=user.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.esm.js","names":[],"sources":[],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs.js");let t=require("solid-ui");t=e.__toESM(t);let n=require("rdflib");n=e.__toESM(n);var r=t.ns,i={icon:t.icons.iconBase+`noun_534313.svg`,name:`audio`,label:function(e,t){let r=t.session.store.findTypeURIs(e),i=n.Util.mediaTypeClass(`audio/*`).uri.split(`*`)[0];for(let e in r)if(e.startsWith(i))return`Play audio`;return null},render:function(e,t){let n=t.session.store,i=t.dom,a={autoplay:!1,chain:!0,chainAlbums:!0,loop:!1},o=function(e){let t=e.lastIndexOf(`.`);return t<0||t<e.lastIndexOf(`/`)?e:e.slice(0,t)},s=function(e){let t=n.any(void 0,r.ldp(`contains`),e);if(!t)return!1;let i=n.each(t,r.ldp(`contains`));if(i.length<2)return!1;let a=e.uri;for(let e=0;e<i.length;e++){let t=i[e].uri;if(a.length>t.length&&a.startsWith(o(t))||a.endsWith(`.m4a`)&&t.endsWith(`.mp3`)&&o(a)===o(t))return!0}return!1},c=function(e){let t=e.uri.split(`/`).slice(-3),n=function(e){try{return decodeURIComponent(e)}catch{return e}};h.textContent=n(t[0]),g.textContent=n(t[1]),_.textContent=n(o(t[2]))},l=function(e,t){return new Promise(function(i){if(t||=0,!a.chain)return i(null);let o=n.any(void 0,r.ldp(`contains`),e)||e.dir();if(!o)return i(null);n.fetcher.load(o).then(function(s){let c=n.each(o,r.ldp(`contains`)),u;c.sort();for(let s=0;s<c.length;s++)if(e.uri===c[s].uri)if(u=(s+1)%c.length,u===0)if(a.chainAlbums){if(t===1||!a.chainAlbums)return i(null);l(o,t+1).then(function(e){e&&n.fetcher.load(e).then(function(t){let a=n.each(e,r.ldp(`contains`));return a.length===0?i(null):(a.sort(),console.log(`New Album: `+e),i(a[0]))})})}else return a.loop?i(c[u]):i(null);else return i(c[u])})})},u=function(e){let t=n.sym(e.target.getAttribute(`src`));if(!a.chain)return;let r=function(t){let n=t;l(n).then(function(t){if(!t){console.log(`No successor to `+n);return}s(t)?(console.log(`Ignoring redundant `+t),r(t)):(console.log(`Moving on to `+t),c(t),v.appendChild(d(t,!0)),v.removeChild(e.target))})};r(t)},d=function(e,t){let r=i.createElement(`audio`);return r.setAttribute(`controls`,`yes`),n.fetcher._fetch(e.uri).then(function(e){return e.blob()}).then(function(e){let t=URL.createObjectURL(e);r.setAttribute(`src`,t)}),t&&r.setAttribute(`autoplay`,`autoplay`),r.addEventListener(`ended`,u,!1),r},f=i.createElement(`div`),p=f.appendChild(i.createElement(`table`)),m=`padding: 0.3em; color:white; background-color: black;`,h=p.appendChild(i.createElement(`tr`));h.style.cssText=m;let g=p.appendChild(i.createElement(`tr`));g.style.cssText=m;let _=p.appendChild(i.createElement(`tr`));_.style.cssText=m;let v=p.appendChild(i.createElement(`tr`));return c(e),v.appendChild(d(e,a.autoplay)),!n.holds(void 0,r.ldp(`contains`),e)&&e.dir()&&n.fetcher.load(e.dir()),f}};exports.default=i;
|
|
2
|
+
//# sourceMappingURL=audioPane.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioPane.cjs.js","names":["UI","$rdf"],"sources":["../../src/audio/audioPane.js"],"sourcesContent":["/* Single audio play Pane\n **\n */\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_534313.svg',\n\n name: 'audio',\n\n // Does the subject deserve an audio play pane?\n label: function (subject, context) {\n const kb = context.session.store\n const typeURIs = kb.findTypeURIs(subject)\n\n const prefix = $rdf.Util.mediaTypeClass('audio/*').uri.split('*')[0]\n for (const t in typeURIs) {\n if (t.startsWith(prefix)) return 'Play audio'\n }\n return null\n },\n\n render: function (subject, context) {\n const kb = context.session.store\n const dom = context.dom\n const options = {\n autoplay: false,\n chain: true,\n chainAlbums: true,\n loop: false\n }\n\n const removeExtension = function (str) {\n const dot = str.lastIndexOf('.')\n if (dot < 0) return str // if any\n const slash = str.lastIndexOf('/')\n if (dot < slash) return str\n return str.slice(0, dot)\n }\n\n // True if there is another file like song.mp3 when this is \"song 1.mp3\"\n // or this is song.m4a\n //\n const looksRedundant = function (x) {\n const folder = kb.any(undefined, ns.ldp('contains'), x)\n if (!folder) return false\n const contents = kb.each(folder, ns.ldp('contains'))\n if (contents.length < 2) return false\n const thisName = x.uri\n for (let k = 0; k < contents.length; k++) {\n const otherName = contents[k].uri\n if (\n thisName.length > otherName.length &&\n thisName.startsWith(removeExtension(otherName))\n ) {\n return true\n }\n if (\n thisName.endsWith('.m4a') &&\n otherName.endsWith('.mp3') &&\n removeExtension(thisName) === removeExtension(otherName)\n ) {\n return true\n }\n }\n return false\n }\n\n // Alternative methods could include:\n // Accesing metadata in the audio contol, or paring the audio file\n const guessNames = function (x) {\n const a = x.uri.split('/').slice(-3) // Hope artist, album, track\n const decode = function (str) {\n try {\n return decodeURIComponent(str)\n } catch (e) {\n return str\n }\n }\n artistRow.textContent = decode(a[0])\n albumRow.textContent = decode(a[1])\n trackRow.textContent = decode(removeExtension(a[2]))\n }\n\n const moveOn = function (current, level) {\n return new Promise(function (resolve) {\n level = level || 0\n if (!options.chain) return resolve(null)\n // Ideally navigate graph else cheat with URI munging:\n const folder =\n kb.any(undefined, ns.ldp('contains'), current) || current.dir()\n if (!folder) return resolve(null)\n kb.fetcher.load(folder).then(function (_xhr) {\n const contents = kb.each(folder, ns.ldp('contains')) // @@ load if not loaded\n // if (contents.length < 2) return resolve(null) NO might move on from 1-track album\n let j\n contents.sort() // sort by URI which hopefully will get tracks in order\n for (let i = 0; i < contents.length; i++) {\n if (current.uri === contents[i].uri) {\n j = (i + 1) % contents.length\n if (j === 0) {\n if (!options.chainAlbums) {\n if (options.loop) {\n return resolve(contents[j])\n }\n return resolve(null) // No more music needed\n } else {\n // chain albums\n if (level === 1 || !options.chainAlbums) return resolve(null) // limit of navigating treee\n moveOn(folder, level + 1).then(function (folder2) {\n if (folder2) {\n kb.fetcher.load(folder2).then(function (_xhr) {\n const contents = kb.each(folder2, ns.ldp('contains'))\n if (contents.length === 0) return resolve(null)\n contents.sort()\n console.log('New Album: ' + folder2)\n return resolve(contents[0]) // Start off new album\n })\n }\n })\n }\n } else {\n return resolve(contents[j])\n }\n }\n } // for\n })\n })\n }\n const endedListener = function (event) {\n const current = kb.sym(event.target.getAttribute('src'))\n if (!options.chain) return\n const tryNext = function (cur) {\n const current = cur\n moveOn(current).then(function (next) {\n if (!next) {\n console.log('No successor to ' + current)\n return\n }\n if (!looksRedundant(next)) {\n console.log('Moving on to ' + next)\n guessNames(next)\n controlRow.appendChild(audioControl(next, true)) // Force autoplay\n controlRow.removeChild(event.target)\n } else {\n console.log('Ignoring redundant ' + next)\n tryNext(next)\n }\n })\n }\n tryNext(current)\n }\n\n const audioControl = function (song, autoplay) {\n const audio = dom.createElement('audio')\n audio.setAttribute('controls', 'yes')\n // get audio with authenticated fetch\n kb.fetcher._fetch(song.uri)\n .then(function (response) {\n return response.blob()\n })\n .then(function (myBlob) {\n const objectURL = URL.createObjectURL(myBlob)\n audio.setAttribute('src', objectURL) // w640 h480 //\n })\n\n if (autoplay) {\n audio.setAttribute('autoplay', 'autoplay') // Make this a personal preference\n }\n audio.addEventListener('ended', endedListener, false)\n return audio\n }\n\n const div = dom.createElement('div')\n const table = div.appendChild(dom.createElement('table'))\n const labelStyle = 'padding: 0.3em; color:white; background-color: black;'\n const artistRow = table.appendChild(dom.createElement('tr'))\n artistRow.style.cssText = labelStyle\n const albumRow = table.appendChild(dom.createElement('tr'))\n albumRow.style.cssText = labelStyle\n const trackRow = table.appendChild(dom.createElement('tr'))\n trackRow.style.cssText = labelStyle\n const controlRow = table.appendChild(dom.createElement('tr'))\n guessNames(subject)\n controlRow.appendChild(audioControl(subject, options.autoplay))\n\n if (!kb.holds(undefined, ns.ldp('contains'), subject) && subject.dir()) {\n kb.fetcher.load(subject.dir()) // Prefetch enclosing @@ or playlist\n }\n\n return div\n }\n}\n\n// ends\n"],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as e from "solid-ui";
|
|
2
|
+
import * as t from "rdflib";
|
|
3
|
+
//#region src/audio/audioPane.js
|
|
4
|
+
var n = e.ns, r = {
|
|
5
|
+
icon: e.icons.iconBase + "noun_534313.svg",
|
|
6
|
+
name: "audio",
|
|
7
|
+
label: function(e, n) {
|
|
8
|
+
let r = n.session.store.findTypeURIs(e), i = t.Util.mediaTypeClass("audio/*").uri.split("*")[0];
|
|
9
|
+
for (let e in r) if (e.startsWith(i)) return "Play audio";
|
|
10
|
+
return null;
|
|
11
|
+
},
|
|
12
|
+
render: function(e, t) {
|
|
13
|
+
let r = t.session.store, i = t.dom, a = {
|
|
14
|
+
autoplay: !1,
|
|
15
|
+
chain: !0,
|
|
16
|
+
chainAlbums: !0,
|
|
17
|
+
loop: !1
|
|
18
|
+
}, o = function(e) {
|
|
19
|
+
let t = e.lastIndexOf(".");
|
|
20
|
+
return t < 0 || t < e.lastIndexOf("/") ? e : e.slice(0, t);
|
|
21
|
+
}, s = function(e) {
|
|
22
|
+
let t = r.any(void 0, n.ldp("contains"), e);
|
|
23
|
+
if (!t) return !1;
|
|
24
|
+
let i = r.each(t, n.ldp("contains"));
|
|
25
|
+
if (i.length < 2) return !1;
|
|
26
|
+
let a = e.uri;
|
|
27
|
+
for (let e = 0; e < i.length; e++) {
|
|
28
|
+
let t = i[e].uri;
|
|
29
|
+
if (a.length > t.length && a.startsWith(o(t)) || a.endsWith(".m4a") && t.endsWith(".mp3") && o(a) === o(t)) return !0;
|
|
30
|
+
}
|
|
31
|
+
return !1;
|
|
32
|
+
}, c = function(e) {
|
|
33
|
+
let t = e.uri.split("/").slice(-3), n = function(e) {
|
|
34
|
+
try {
|
|
35
|
+
return decodeURIComponent(e);
|
|
36
|
+
} catch {
|
|
37
|
+
return e;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
h.textContent = n(t[0]), g.textContent = n(t[1]), _.textContent = n(o(t[2]));
|
|
41
|
+
}, l = function(e, t) {
|
|
42
|
+
return new Promise(function(i) {
|
|
43
|
+
if (t ||= 0, !a.chain) return i(null);
|
|
44
|
+
let o = r.any(void 0, n.ldp("contains"), e) || e.dir();
|
|
45
|
+
if (!o) return i(null);
|
|
46
|
+
r.fetcher.load(o).then(function(s) {
|
|
47
|
+
let c = r.each(o, n.ldp("contains")), u;
|
|
48
|
+
c.sort();
|
|
49
|
+
for (let s = 0; s < c.length; s++) if (e.uri === c[s].uri) if (u = (s + 1) % c.length, u === 0) if (a.chainAlbums) {
|
|
50
|
+
if (t === 1 || !a.chainAlbums) return i(null);
|
|
51
|
+
l(o, t + 1).then(function(e) {
|
|
52
|
+
e && r.fetcher.load(e).then(function(t) {
|
|
53
|
+
let a = r.each(e, n.ldp("contains"));
|
|
54
|
+
return a.length === 0 ? i(null) : (a.sort(), console.log("New Album: " + e), i(a[0]));
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
} else return a.loop ? i(c[u]) : i(null);
|
|
58
|
+
else return i(c[u]);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}, u = function(e) {
|
|
62
|
+
let t = r.sym(e.target.getAttribute("src"));
|
|
63
|
+
if (!a.chain) return;
|
|
64
|
+
let n = function(t) {
|
|
65
|
+
let r = t;
|
|
66
|
+
l(r).then(function(t) {
|
|
67
|
+
if (!t) {
|
|
68
|
+
console.log("No successor to " + r);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
s(t) ? (console.log("Ignoring redundant " + t), n(t)) : (console.log("Moving on to " + t), c(t), v.appendChild(d(t, !0)), v.removeChild(e.target));
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
n(t);
|
|
75
|
+
}, d = function(e, t) {
|
|
76
|
+
let n = i.createElement("audio");
|
|
77
|
+
return n.setAttribute("controls", "yes"), r.fetcher._fetch(e.uri).then(function(e) {
|
|
78
|
+
return e.blob();
|
|
79
|
+
}).then(function(e) {
|
|
80
|
+
let t = URL.createObjectURL(e);
|
|
81
|
+
n.setAttribute("src", t);
|
|
82
|
+
}), t && n.setAttribute("autoplay", "autoplay"), n.addEventListener("ended", u, !1), n;
|
|
83
|
+
}, f = i.createElement("div"), p = f.appendChild(i.createElement("table")), m = "padding: 0.3em; color:white; background-color: black;", h = p.appendChild(i.createElement("tr"));
|
|
84
|
+
h.style.cssText = m;
|
|
85
|
+
let g = p.appendChild(i.createElement("tr"));
|
|
86
|
+
g.style.cssText = m;
|
|
87
|
+
let _ = p.appendChild(i.createElement("tr"));
|
|
88
|
+
_.style.cssText = m;
|
|
89
|
+
let v = p.appendChild(i.createElement("tr"));
|
|
90
|
+
return c(e), v.appendChild(d(e, a.autoplay)), !r.holds(void 0, n.ldp("contains"), e) && e.dir() && r.fetcher.load(e.dir()), f;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
//#endregion
|
|
94
|
+
export { r as default };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=audioPane.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioPane.esm.js","names":["ns"],"sources":["../../src/audio/audioPane.js"],"sourcesContent":["/* Single audio play Pane\n **\n */\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_534313.svg',\n\n name: 'audio',\n\n // Does the subject deserve an audio play pane?\n label: function (subject, context) {\n const kb = context.session.store\n const typeURIs = kb.findTypeURIs(subject)\n\n const prefix = $rdf.Util.mediaTypeClass('audio/*').uri.split('*')[0]\n for (const t in typeURIs) {\n if (t.startsWith(prefix)) return 'Play audio'\n }\n return null\n },\n\n render: function (subject, context) {\n const kb = context.session.store\n const dom = context.dom\n const options = {\n autoplay: false,\n chain: true,\n chainAlbums: true,\n loop: false\n }\n\n const removeExtension = function (str) {\n const dot = str.lastIndexOf('.')\n if (dot < 0) return str // if any\n const slash = str.lastIndexOf('/')\n if (dot < slash) return str\n return str.slice(0, dot)\n }\n\n // True if there is another file like song.mp3 when this is \"song 1.mp3\"\n // or this is song.m4a\n //\n const looksRedundant = function (x) {\n const folder = kb.any(undefined, ns.ldp('contains'), x)\n if (!folder) return false\n const contents = kb.each(folder, ns.ldp('contains'))\n if (contents.length < 2) return false\n const thisName = x.uri\n for (let k = 0; k < contents.length; k++) {\n const otherName = contents[k].uri\n if (\n thisName.length > otherName.length &&\n thisName.startsWith(removeExtension(otherName))\n ) {\n return true\n }\n if (\n thisName.endsWith('.m4a') &&\n otherName.endsWith('.mp3') &&\n removeExtension(thisName) === removeExtension(otherName)\n ) {\n return true\n }\n }\n return false\n }\n\n // Alternative methods could include:\n // Accesing metadata in the audio contol, or paring the audio file\n const guessNames = function (x) {\n const a = x.uri.split('/').slice(-3) // Hope artist, album, track\n const decode = function (str) {\n try {\n return decodeURIComponent(str)\n } catch (e) {\n return str\n }\n }\n artistRow.textContent = decode(a[0])\n albumRow.textContent = decode(a[1])\n trackRow.textContent = decode(removeExtension(a[2]))\n }\n\n const moveOn = function (current, level) {\n return new Promise(function (resolve) {\n level = level || 0\n if (!options.chain) return resolve(null)\n // Ideally navigate graph else cheat with URI munging:\n const folder =\n kb.any(undefined, ns.ldp('contains'), current) || current.dir()\n if (!folder) return resolve(null)\n kb.fetcher.load(folder).then(function (_xhr) {\n const contents = kb.each(folder, ns.ldp('contains')) // @@ load if not loaded\n // if (contents.length < 2) return resolve(null) NO might move on from 1-track album\n let j\n contents.sort() // sort by URI which hopefully will get tracks in order\n for (let i = 0; i < contents.length; i++) {\n if (current.uri === contents[i].uri) {\n j = (i + 1) % contents.length\n if (j === 0) {\n if (!options.chainAlbums) {\n if (options.loop) {\n return resolve(contents[j])\n }\n return resolve(null) // No more music needed\n } else {\n // chain albums\n if (level === 1 || !options.chainAlbums) return resolve(null) // limit of navigating treee\n moveOn(folder, level + 1).then(function (folder2) {\n if (folder2) {\n kb.fetcher.load(folder2).then(function (_xhr) {\n const contents = kb.each(folder2, ns.ldp('contains'))\n if (contents.length === 0) return resolve(null)\n contents.sort()\n console.log('New Album: ' + folder2)\n return resolve(contents[0]) // Start off new album\n })\n }\n })\n }\n } else {\n return resolve(contents[j])\n }\n }\n } // for\n })\n })\n }\n const endedListener = function (event) {\n const current = kb.sym(event.target.getAttribute('src'))\n if (!options.chain) return\n const tryNext = function (cur) {\n const current = cur\n moveOn(current).then(function (next) {\n if (!next) {\n console.log('No successor to ' + current)\n return\n }\n if (!looksRedundant(next)) {\n console.log('Moving on to ' + next)\n guessNames(next)\n controlRow.appendChild(audioControl(next, true)) // Force autoplay\n controlRow.removeChild(event.target)\n } else {\n console.log('Ignoring redundant ' + next)\n tryNext(next)\n }\n })\n }\n tryNext(current)\n }\n\n const audioControl = function (song, autoplay) {\n const audio = dom.createElement('audio')\n audio.setAttribute('controls', 'yes')\n // get audio with authenticated fetch\n kb.fetcher._fetch(song.uri)\n .then(function (response) {\n return response.blob()\n })\n .then(function (myBlob) {\n const objectURL = URL.createObjectURL(myBlob)\n audio.setAttribute('src', objectURL) // w640 h480 //\n })\n\n if (autoplay) {\n audio.setAttribute('autoplay', 'autoplay') // Make this a personal preference\n }\n audio.addEventListener('ended', endedListener, false)\n return audio\n }\n\n const div = dom.createElement('div')\n const table = div.appendChild(dom.createElement('table'))\n const labelStyle = 'padding: 0.3em; color:white; background-color: black;'\n const artistRow = table.appendChild(dom.createElement('tr'))\n artistRow.style.cssText = labelStyle\n const albumRow = table.appendChild(dom.createElement('tr'))\n albumRow.style.cssText = labelStyle\n const trackRow = table.appendChild(dom.createElement('tr'))\n trackRow.style.cssText = labelStyle\n const controlRow = table.appendChild(dom.createElement('tr'))\n guessNames(subject)\n controlRow.appendChild(audioControl(subject, options.autoplay))\n\n if (!kb.holds(undefined, ns.ldp('contains'), subject) && subject.dir()) {\n kb.fetcher.load(subject.dir()) // Prefetch enclosing @@ or playlist\n }\n\n return div\n }\n}\n\n// ends\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./_virtual/_rolldown/runtime.cjs.js");let t=require("solid-ui");t=e.__toESM(t);let n=require("rdflib");n=e.__toESM(n);var r=t.ns,i={icon:t.icons.originalIconBase+`tango/22-folder-open.png`,name:`classInstance`,audience:[r.solid(`PowerUser`)],label:function(e,t){let n=t.session.store.each(void 0,r.rdf(`type`),e).length;return n>0?`List (`+n+`)`:null},render:function(e,i){let a=i.dom,o=i.getOutliner(a),s=i.session.store,c=function(e,t){let n=a.createElement(`pre`);n.setAttribute(`style`,`background-color: `+t||`#eed;`),l.appendChild(n),n.appendChild(a.createTextNode(e))},l=a.createElement(`div`);l.setAttribute(`class`,`instancePane`),l.setAttribute(`style`,` border-top: solid 1px #777; border-bottom: solid 1px #777; margin-top: 0.5em; margin-bottom: 0.5em `);let u=s.statementsMatching(void 0,r.rdf(`type`),e);if(u.length>0){let i={},d=[];u.forEach(e=>{i[e.subject.toNT()]=e});for(let t in s.findMembersNT(e))i[t]||d.push(n.st(s.fromNT(t),r.rdf(`type`),e));if(d.length&&c(`There are `+u.length+` explicit and `+d.length+` implicit members of `+t.utils.label(e)),!e.sameTerm(r.rdf(`Property`))&&e.sameTerm(r.rdfs(`Class`))){let e=s.statementsMatching(void 0,r.rdf(`type`),void 0),t={};e.forEach(function(e){t[e.object]=e});let i=[];for(let e in t)i.push(n.st(n.sym(e),r.rdf(`type`),r.rdfs(`Class`)));c(`Total of `+e.length+` type statements and `+i.length+` unique types.`)}if(u.length>10){let e=a.createElement(`TR`);e.appendChild(a.createTextNode(``+u.length)),l.appendChild(e)}o.appendPropertyTRs(l,u,!0,function(e){return!0}),d.length&&(c(`Implicit:`),o.appendPropertyTRs(l,d,!0,function(e){return!0}))}return l}};exports.classInstancePane=i;
|
|
2
|
+
//# sourceMappingURL=classInstancePane.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classInstancePane.cjs.js","names":["UI","$rdf"],"sources":["../src/classInstancePane.js"],"sourcesContent":["/* Class member Pane\n **\n ** This outline pane lists the members of a class\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\nexport const classInstancePane = {\n icon: UI.icons.originalIconBase + 'tango/22-folder-open.png',\n\n name: 'classInstance',\n\n // Create a new folder in a Solid system,\n\n audience: [ns.solid('PowerUser')],\n\n label: function (subject, context) {\n const kb = context.session.store\n const n = kb.each(undefined, ns.rdf('type'), subject).length\n if (n > 0) return 'List (' + n + ')' // Show how many in hover text\n return null // Suppress pane otherwise\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const complain = function complain (message, color) {\n const pre = dom.createElement('pre')\n pre.setAttribute('style', 'background-color: ' + color || '#eed' + ';')\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const div = dom.createElement('div')\n div.setAttribute('class', 'instancePane')\n div.setAttribute(\n 'style',\n ' border-top: solid 1px #777; border-bottom: solid 1px #777; margin-top: 0.5em; margin-bottom: 0.5em '\n )\n\n // If this is a class, look for all both explicit and implicit\n const sts = kb.statementsMatching(undefined, ns.rdf('type'), subject)\n if (sts.length > 0) {\n const already = {}\n const more = []\n sts.forEach(st => {\n already[st.subject.toNT()] = st\n })\n for (const nt in kb.findMembersNT(subject)) {\n if (!already[nt]) {\n more.push($rdf.st(kb.fromNT(nt), ns.rdf('type'), subject)) // @@ no provenance\n }\n }\n if (more.length) {\n complain(\n 'There are ' +\n sts.length +\n ' explicit and ' +\n more.length +\n ' implicit members of ' +\n UI.utils.label(subject)\n )\n }\n if (subject.sameTerm(ns.rdf('Property'))) {\n // / Do not find all properties used as properties .. unless look at kb index\n } else if (subject.sameTerm(ns.rdfs('Class'))) {\n const uses = kb.statementsMatching(undefined, ns.rdf('type'), undefined)\n const usedTypes = {}\n uses.forEach(function (st) {\n usedTypes[st.object] = st\n }) // Get unique\n const used = []\n for (const i in usedTypes) {\n used.push($rdf.st($rdf.sym(i), ns.rdf('type'), ns.rdfs('Class')))\n }\n complain(\n 'Total of ' +\n uses.length +\n ' type statements and ' +\n used.length +\n ' unique types.'\n )\n }\n\n if (sts.length > 10) {\n const tr = dom.createElement('TR')\n tr.appendChild(dom.createTextNode('' + sts.length))\n // tr.AJAR_statement=sts[i]\n div.appendChild(tr)\n }\n\n outliner.appendPropertyTRs(div, sts, true, function (_pred) {\n return true\n })\n\n if (more.length) {\n complain('Implicit:')\n outliner.appendPropertyTRs(div, more, true, function (_pred) {\n return true\n })\n }\n }\n\n return div\n }\n}\n// ends\n"],"mappings":"uIAQA,IAAM,EAAKA,EAAG,GAED,EAAoB,CAC/B,KAAMA,EAAG,MAAM,iBAAmB,2BAElC,KAAM,gBAIN,SAAU,CAAC,EAAG,MAAM,WAAW,CAAC,EAEhC,MAAO,SAAU,EAAS,EAAS,CAEjC,IAAM,EADK,EAAQ,QAAQ,MACd,KAAK,IAAA,GAAW,EAAG,IAAI,MAAM,EAAG,CAAO,CAAC,CAAC,OAEtD,OADI,EAAI,EAAU,SAAW,EAAI,IAC1B,IACT,EAEA,OAAQ,SAAU,EAAS,EAAS,CAClC,IAAM,EAAM,EAAQ,IACd,EAAW,EAAQ,YAAY,CAAG,EAClC,EAAK,EAAQ,QAAQ,MACrB,EAAW,SAAmB,EAAS,EAAO,CAClD,IAAM,EAAM,EAAI,cAAc,KAAK,EACnC,EAAI,aAAa,QAAS,qBAAuB,GAAS,OAAY,EACtE,EAAI,YAAY,CAAG,EACnB,EAAI,YAAY,EAAI,eAAe,CAAO,CAAC,CAC7C,EACM,EAAM,EAAI,cAAc,KAAK,EACnC,EAAI,aAAa,QAAS,cAAc,EACxC,EAAI,aACF,QACA,uGACF,EAGA,IAAM,EAAM,EAAG,mBAAmB,IAAA,GAAW,EAAG,IAAI,MAAM,EAAG,CAAO,EACpE,GAAI,EAAI,OAAS,EAAG,CAClB,IAAM,EAAU,CAAC,EACX,EAAO,CAAC,EACd,EAAI,QAAQ,GAAM,CAChB,EAAQ,EAAG,QAAQ,KAAK,GAAK,CAC/B,CAAC,EACD,IAAK,IAAM,KAAM,EAAG,cAAc,CAAO,EAClC,EAAQ,IACX,EAAK,KAAKC,EAAK,GAAG,EAAG,OAAO,CAAE,EAAG,EAAG,IAAI,MAAM,EAAG,CAAO,CAAC,EAa7D,GAVI,EAAK,QACP,EACE,aACE,EAAI,OACJ,iBACA,EAAK,OACL,wBACAD,EAAG,MAAM,MAAM,CAAO,CAC1B,EAEE,GAAQ,SAAS,EAAG,IAAI,UAAU,CAAC,GAE5B,EAAQ,SAAS,EAAG,KAAK,OAAO,CAAC,EAAG,CAC7C,IAAM,EAAO,EAAG,mBAAmB,IAAA,GAAW,EAAG,IAAI,MAAM,EAAG,IAAA,EAAS,EACjE,EAAY,CAAC,EACnB,EAAK,QAAQ,SAAU,EAAI,CACzB,EAAU,EAAG,QAAU,CACzB,CAAC,EACD,IAAM,EAAO,CAAC,EACd,IAAK,IAAM,KAAK,EACd,EAAK,KAAKC,EAAK,GAAGA,EAAK,IAAI,CAAC,EAAG,EAAG,IAAI,MAAM,EAAG,EAAG,KAAK,OAAO,CAAC,CAAC,EAElE,EACE,YACE,EAAK,OACL,wBACA,EAAK,OACL,gBACJ,CACF,CAEA,GAAI,EAAI,OAAS,GAAI,CACnB,IAAM,EAAK,EAAI,cAAc,IAAI,EACjC,EAAG,YAAY,EAAI,eAAe,GAAK,EAAI,MAAM,CAAC,EAElD,EAAI,YAAY,CAAE,CACpB,CAEA,EAAS,kBAAkB,EAAK,EAAK,GAAM,SAAU,EAAO,CAC1D,MAAO,EACT,CAAC,EAEG,EAAK,SACP,EAAS,WAAW,EACpB,EAAS,kBAAkB,EAAK,EAAM,GAAM,SAAU,EAAO,CAC3D,MAAO,EACT,CAAC,EAEL,CAEA,OAAO,CACT,CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as e from "solid-ui";
|
|
2
|
+
import * as t from "rdflib";
|
|
3
|
+
//#region src/classInstancePane.js
|
|
4
|
+
var n = e.ns, r = {
|
|
5
|
+
icon: e.icons.originalIconBase + "tango/22-folder-open.png",
|
|
6
|
+
name: "classInstance",
|
|
7
|
+
audience: [n.solid("PowerUser")],
|
|
8
|
+
label: function(e, t) {
|
|
9
|
+
let r = t.session.store.each(void 0, n.rdf("type"), e).length;
|
|
10
|
+
return r > 0 ? "List (" + r + ")" : null;
|
|
11
|
+
},
|
|
12
|
+
render: function(r, i) {
|
|
13
|
+
let a = i.dom, o = i.getOutliner(a), s = i.session.store, c = function(e, t) {
|
|
14
|
+
let n = a.createElement("pre");
|
|
15
|
+
n.setAttribute("style", "background-color: " + t || "#eed;"), l.appendChild(n), n.appendChild(a.createTextNode(e));
|
|
16
|
+
}, l = a.createElement("div");
|
|
17
|
+
l.setAttribute("class", "instancePane"), l.setAttribute("style", " border-top: solid 1px #777; border-bottom: solid 1px #777; margin-top: 0.5em; margin-bottom: 0.5em ");
|
|
18
|
+
let u = s.statementsMatching(void 0, n.rdf("type"), r);
|
|
19
|
+
if (u.length > 0) {
|
|
20
|
+
let i = {}, d = [];
|
|
21
|
+
u.forEach((e) => {
|
|
22
|
+
i[e.subject.toNT()] = e;
|
|
23
|
+
});
|
|
24
|
+
for (let e in s.findMembersNT(r)) i[e] || d.push(t.st(s.fromNT(e), n.rdf("type"), r));
|
|
25
|
+
if (d.length && c("There are " + u.length + " explicit and " + d.length + " implicit members of " + e.utils.label(r)), !r.sameTerm(n.rdf("Property")) && r.sameTerm(n.rdfs("Class"))) {
|
|
26
|
+
let e = s.statementsMatching(void 0, n.rdf("type"), void 0), r = {};
|
|
27
|
+
e.forEach(function(e) {
|
|
28
|
+
r[e.object] = e;
|
|
29
|
+
});
|
|
30
|
+
let i = [];
|
|
31
|
+
for (let e in r) i.push(t.st(t.sym(e), n.rdf("type"), n.rdfs("Class")));
|
|
32
|
+
c("Total of " + e.length + " type statements and " + i.length + " unique types.");
|
|
33
|
+
}
|
|
34
|
+
if (u.length > 10) {
|
|
35
|
+
let e = a.createElement("TR");
|
|
36
|
+
e.appendChild(a.createTextNode("" + u.length)), l.appendChild(e);
|
|
37
|
+
}
|
|
38
|
+
o.appendPropertyTRs(l, u, !0, function(e) {
|
|
39
|
+
return !0;
|
|
40
|
+
}), d.length && (c("Implicit:"), o.appendPropertyTRs(l, d, !0, function(e) {
|
|
41
|
+
return !0;
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return l;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
//#endregion
|
|
48
|
+
export { r as classInstancePane };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=classInstancePane.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classInstancePane.esm.js","names":["ns"],"sources":["../src/classInstancePane.js"],"sourcesContent":["/* Class member Pane\n **\n ** This outline pane lists the members of a class\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\n\nconst ns = UI.ns\n\nexport const classInstancePane = {\n icon: UI.icons.originalIconBase + 'tango/22-folder-open.png',\n\n name: 'classInstance',\n\n // Create a new folder in a Solid system,\n\n audience: [ns.solid('PowerUser')],\n\n label: function (subject, context) {\n const kb = context.session.store\n const n = kb.each(undefined, ns.rdf('type'), subject).length\n if (n > 0) return 'List (' + n + ')' // Show how many in hover text\n return null // Suppress pane otherwise\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const complain = function complain (message, color) {\n const pre = dom.createElement('pre')\n pre.setAttribute('style', 'background-color: ' + color || '#eed' + ';')\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const div = dom.createElement('div')\n div.setAttribute('class', 'instancePane')\n div.setAttribute(\n 'style',\n ' border-top: solid 1px #777; border-bottom: solid 1px #777; margin-top: 0.5em; margin-bottom: 0.5em '\n )\n\n // If this is a class, look for all both explicit and implicit\n const sts = kb.statementsMatching(undefined, ns.rdf('type'), subject)\n if (sts.length > 0) {\n const already = {}\n const more = []\n sts.forEach(st => {\n already[st.subject.toNT()] = st\n })\n for (const nt in kb.findMembersNT(subject)) {\n if (!already[nt]) {\n more.push($rdf.st(kb.fromNT(nt), ns.rdf('type'), subject)) // @@ no provenance\n }\n }\n if (more.length) {\n complain(\n 'There are ' +\n sts.length +\n ' explicit and ' +\n more.length +\n ' implicit members of ' +\n UI.utils.label(subject)\n )\n }\n if (subject.sameTerm(ns.rdf('Property'))) {\n // / Do not find all properties used as properties .. unless look at kb index\n } else if (subject.sameTerm(ns.rdfs('Class'))) {\n const uses = kb.statementsMatching(undefined, ns.rdf('type'), undefined)\n const usedTypes = {}\n uses.forEach(function (st) {\n usedTypes[st.object] = st\n }) // Get unique\n const used = []\n for (const i in usedTypes) {\n used.push($rdf.st($rdf.sym(i), ns.rdf('type'), ns.rdfs('Class')))\n }\n complain(\n 'Total of ' +\n uses.length +\n ' type statements and ' +\n used.length +\n ' unique types.'\n )\n }\n\n if (sts.length > 10) {\n const tr = dom.createElement('TR')\n tr.appendChild(dom.createTextNode('' + sts.length))\n // tr.AJAR_statement=sts[i]\n div.appendChild(tr)\n }\n\n outliner.appendPropertyTRs(div, sts, true, function (_pred) {\n return true\n })\n\n if (more.length) {\n complain('Implicit:')\n outliner.appendPropertyTRs(div, more, true, function (_pred) {\n return true\n })\n }\n }\n\n return div\n }\n}\n// ends\n"],"mappings":";;;AAQA,IAAMA,IAAK,EAAG,IAED,IAAoB;CAC/B,MAAM,EAAG,MAAM,mBAAmB;CAElC,MAAM;CAIN,UAAU,CAACA,EAAG,MAAM,WAAW,CAAC;CAEhC,OAAO,SAAU,GAAS,GAAS;EAEjC,IAAM,IADK,EAAQ,QAAQ,MACd,KAAK,KAAA,GAAWA,EAAG,IAAI,MAAM,GAAG,CAAO,CAAC,CAAC;EAEtD,OADI,IAAI,IAAU,WAAW,IAAI,MAC1B;CACT;CAEA,QAAQ,SAAU,GAAS,GAAS;EAClC,IAAM,IAAM,EAAQ,KACd,IAAW,EAAQ,YAAY,CAAG,GAClC,IAAK,EAAQ,QAAQ,OACrB,IAAW,SAAmB,GAAS,GAAO;GAClD,IAAM,IAAM,EAAI,cAAc,KAAK;GAGnC,AAFA,EAAI,aAAa,SAAS,uBAAuB,KAAS,OAAY,GACtE,EAAI,YAAY,CAAG,GACnB,EAAI,YAAY,EAAI,eAAe,CAAO,CAAC;EAC7C,GACM,IAAM,EAAI,cAAc,KAAK;EAEnC,AADA,EAAI,aAAa,SAAS,cAAc,GACxC,EAAI,aACF,SACA,uGACF;EAGA,IAAM,IAAM,EAAG,mBAAmB,KAAA,GAAWA,EAAG,IAAI,MAAM,GAAG,CAAO;EACpE,IAAI,EAAI,SAAS,GAAG;GAClB,IAAM,IAAU,CAAC,GACX,IAAO,CAAC;GACd,EAAI,SAAQ,MAAM;IAChB,EAAQ,EAAG,QAAQ,KAAK,KAAK;GAC/B,CAAC;GACD,KAAK,IAAM,KAAM,EAAG,cAAc,CAAO,GACvC,AAAK,EAAQ,MACX,EAAK,KAAK,EAAK,GAAG,EAAG,OAAO,CAAE,GAAGA,EAAG,IAAI,MAAM,GAAG,CAAO,CAAC;GAa7D,IAVI,EAAK,UACP,EACE,eACE,EAAI,SACJ,mBACA,EAAK,SACL,0BACA,EAAG,MAAM,MAAM,CAAO,CAC1B,GAEE,GAAQ,SAASA,EAAG,IAAI,UAAU,CAAC,KAE5B,EAAQ,SAASA,EAAG,KAAK,OAAO,CAAC,GAAG;IAC7C,IAAM,IAAO,EAAG,mBAAmB,KAAA,GAAWA,EAAG,IAAI,MAAM,GAAG,KAAA,CAAS,GACjE,IAAY,CAAC;IACnB,EAAK,QAAQ,SAAU,GAAI;KACzB,EAAU,EAAG,UAAU;IACzB,CAAC;IACD,IAAM,IAAO,CAAC;IACd,KAAK,IAAM,KAAK,GACd,EAAK,KAAK,EAAK,GAAG,EAAK,IAAI,CAAC,GAAGA,EAAG,IAAI,MAAM,GAAGA,EAAG,KAAK,OAAO,CAAC,CAAC;IAElE,EACE,cACE,EAAK,SACL,0BACA,EAAK,SACL,gBACJ;GACF;GAEA,IAAI,EAAI,SAAS,IAAI;IACnB,IAAM,IAAK,EAAI,cAAc,IAAI;IAGjC,AAFA,EAAG,YAAY,EAAI,eAAe,KAAK,EAAI,MAAM,CAAC,GAElD,EAAI,YAAY,CAAE;GACpB;GAMA,AAJA,EAAS,kBAAkB,GAAK,GAAK,IAAM,SAAU,GAAO;IAC1D,OAAO;GACT,CAAC,GAEG,EAAK,WACP,EAAS,WAAW,GACpB,EAAS,kBAAkB,GAAK,GAAM,IAAM,SAAU,GAAO;IAC3D,OAAO;GACT,CAAC;EAEL;EAEA,OAAO;CACT;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WebComponent } from 'solid-ui';
|
|
2
|
+
import { AccountMenuItem } from 'solid-ui/components/account';
|
|
3
|
+
export default class Header extends WebComponent {
|
|
4
|
+
static styles: any;
|
|
5
|
+
accessor menuItems: AccountMenuItem[];
|
|
6
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/header/Header.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,UAAU,CAAA;AAGtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAElE,OAAO,6BAA6B,CAAA;AACpC,OAAO,4BAA4B,CAAA;AACnC,OAAO,+BAA+B,CAAA;AACtC,OAAO,0BAA0B,CAAA;AACjC,OAAO,kCAAkC,CAAA;AACzC,OAAO,2BAA2B,CAAA;AAKlC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAC9C,MAAM,CAAC,MAAM,MAAS;IAGtB,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAK;IAE1C,MAAM;CAoBP"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/header/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,UAAU,CAAA;AAE7B,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./ontologyData.cjs.js"),t=require("./preferencesFormText.cjs.js");let n=require("solid-ui"),r=require("rdflib");var i={icon:n.icons.iconBase+`noun_Sliders_341315_000000.svg`,name:`basicPreferences`,label:e=>null,render:(i,s)=>{let c=s.dom,l=s.session.store;function u(e,t){e||d.appendChild(n.widgets.errorMessageBlock(c,t,`#fee`))}let d=c.createElement(`div`),f=a(d,c);function p(e,t){e=e.doc(),l.holds(void 0,void 0,void 0,e)||(0,r.parse)(t,l,e.uri,`text/turtle`,null)}let m=l.sym(`urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597#this`);p(m,t.default),p(l.sym(`urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597-ONT`),e.default);async function h(){let e=await n.login.ensureLoadedPreferences({dom:c,div:d});if(!e.preferencesFile){console.log(`Not doing private class preferences as no access to preferences file. `+e.preferencesFileError);return}let t=n.widgets.appendForm(c,f,{},e.me,m,e.preferencesFile,u);t.style.borderStyle=`none`;let r=s.session.paneRegistry.byName(`trustedApplications`);r&&d.appendChild(r.render(null,s)),o(d,l,e.me,c)}return h(),d}};function a(e,t){let n=l(e,t,`User types`),r=n.appendChild(t.createElement(`p`));r.innerText=`Here you can self-assign user types to help the data browser know which views you would like to access.`;let i=n.appendChild(t.createElement(`a`));return i.href=`https://github.com/solidos/userguide/#role`,i.innerText=`Read more`,n.appendChild(t.createElement(`div`))}function o(e,t,r,i){let a=l(e,i,`Delete account`),o=t.each(r,n.ns.space(`storage`),null,r.doc()).map(e=>e.value),c=a.appendChild(i.createElement(`ul`));o.forEach(async e=>{let t=await s(e,i);t&&c.appendChild(i.createElement(`li`)).appendChild(t)})}async function s(e,t){let n=t.createElement(`a`);n.textContent=`Delete your account at ${e}`;let r=await c(e);return typeof r==`string`?(n.href=r,n):null}async function c(e){let t=new URL(e),n=new URL(e);return n.pathname=t.pathname=`/account/delete`,n.hostname=n.hostname.split(`.`).slice(1).join(`.`),(await fetch(n.href,{method:`HEAD`})).ok?n.href:(await fetch(t.href,{method:`HEAD`})).ok?t.href:null}function l(e,t,n){let r=e.appendChild(t.createElement(`div`));r.style.border=`0.3em solid #418d99`,r.style.borderRadius=`0.5em`,r.style.padding=`0.7em`,r.style.marginTop=`0.7em`;let i=r.appendChild(t.createElement(`h3`));return i.innerText=n,r}exports.basicPreferencesPane=i,exports.default=i;
|
|
2
|
+
//# sourceMappingURL=basicPreferences.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basicPreferences.cjs.js","names":[],"sources":["../../src/dashboard/basicPreferences.ts"],"sourcesContent":["import { PaneDefinition } from 'pane-registry'\nimport { IndexedFormula, NamedNode, parse, Store } from 'rdflib'\nimport { icons, login, ns, widgets } from 'solid-ui'\nimport ontologyData from './ontologyData.ttl'\nimport preferencesFormText from './preferencesFormText.ttl'\n\nexport const basicPreferencesPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_Sliders_341315_000000.svg',\n name: 'basicPreferences',\n label: _subject => {\n return null\n },\n\n // Render the pane\n // The subject should be the logged in user.\n render: (subject, context) => {\n const dom = context.dom\n // @ts-ignore\n const store = context.session.store as Store\n\n function complainIfBad (ok: Boolean, mess: any) {\n if (ok) return\n container.appendChild(widgets.errorMessageBlock(dom, mess, '#fee'))\n }\n\n const container = dom.createElement('div')\n\n const formArea = setupUserTypesSection(container, dom)\n\n function loadData (doc: NamedNode, turtle: String) {\n doc = doc.doc() // remove # from URI if nec\n if (!store.holds(undefined, undefined, undefined, doc)) {\n // If not loaded already\n ;(parse as any)(turtle, store, doc.uri, 'text/turtle', null) // Load form directly\n }\n }\n\n const preferencesForm = store.sym(\n 'urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597#this'\n )\n loadData(preferencesForm, preferencesFormText)\n\n const ontologyExtra = store.sym(\n 'urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597-ONT'\n )\n loadData(ontologyExtra, ontologyData)\n\n async function doRender () {\n const renderContext = await login.ensureLoadedPreferences({\n dom,\n div: container\n })\n if (!renderContext.preferencesFile) {\n // Could be CORS\n console.log(\n 'Not doing private class preferences as no access to preferences file. ' +\n renderContext.preferencesFileError\n )\n return\n }\n const appendedForm = widgets.appendForm(\n dom,\n formArea,\n {},\n renderContext.me,\n preferencesForm,\n renderContext.preferencesFile,\n complainIfBad\n )\n appendedForm.style.borderStyle = 'none'\n\n const trustedApplicationsView = context.session.paneRegistry.byName('trustedApplications')\n if (trustedApplicationsView) {\n container.appendChild(trustedApplicationsView.render(null, context))\n }\n\n // @@ TODO Remove need for casting as any and bang (!) syntax\n addDeleteSection(container, store, renderContext.me!, dom)\n }\n\n doRender()\n\n return container\n }\n}\n\nfunction setupUserTypesSection (\n container: Element,\n dom: HTMLDocument\n): Element {\n const formContainer = createSection(container, dom, 'User types')\n\n const description = formContainer.appendChild(dom.createElement('p'))\n description.innerText = 'Here you can self-assign user types to help the data browser know which views you would like to access.'\n\n const userTypesLink = formContainer.appendChild(dom.createElement('a'))\n userTypesLink.href = 'https://github.com/solidos/userguide/#role'\n userTypesLink.innerText = 'Read more'\n\n const formArea = formContainer.appendChild(dom.createElement('div'))\n\n return formArea\n}\n\nexport default basicPreferencesPane\n\n// ends\n\nfunction addDeleteSection (\n container: HTMLElement,\n store: IndexedFormula,\n profile: NamedNode,\n dom: HTMLDocument\n): void {\n const section = createSection(container, dom, 'Delete account')\n\n const podServerNodes = store.each(profile, ns.space('storage'), null, profile.doc())\n const podServers = podServerNodes.map(node => node.value)\n\n const list = section.appendChild(dom.createElement('ul'))\n\n podServers.forEach(async server => {\n const deletionLink = await generateDeletionLink(server, dom)\n if (deletionLink) {\n const listItem = list.appendChild(dom.createElement('li'))\n listItem.appendChild(deletionLink)\n }\n })\n}\n\nasync function generateDeletionLink (\n podServer: string,\n dom: HTMLDocument\n): Promise<HTMLElement | null> {\n const link = dom.createElement('a')\n link.textContent = `Delete your account at ${podServer}`\n const deletionUrl = await getDeletionUrlForServer(podServer)\n if (typeof deletionUrl !== 'string') {\n return null\n }\n link.href = deletionUrl\n return link\n}\n\n/**\n * Hacky way to get the deletion link to a Pod\n *\n * This function infers the deletion link by assuming the URL structure of Node Solid server.\n * In the future, Solid will hopefully provide a standardised way of discovering the deletion link:\n * https://github.com/solidos/data-interoperability-panel/issues/18\n *\n * If NSS is in multi-user mode (the case on inrupt.net and solid.community), the deletion URL for\n * vincent.dev.inrupt.net would be at dev.inrupt.net/account/delete. In single-user mode, the\n * deletion URL would be at vincent.dev.inrupt.net/account/delete.\n *\n * @param server Pod server containing the user's account.\n * @returns URL of the page that Node Solid Server would offer to delete the account, or null if\n * the URLs we tried give invalid responses.\n */\nasync function getDeletionUrlForServer (\n server: string\n): Promise<string | null> {\n const singleUserUrl = new URL(server)\n const multiUserUrl = new URL(server)\n multiUserUrl.pathname = singleUserUrl.pathname = '/account/delete'\n\n const hostnameParts = multiUserUrl.hostname.split('.')\n // Remove `vincent.` from `vincent.dev.inrupt.net`, for example:\n multiUserUrl.hostname = hostnameParts.slice(1).join('.')\n\n const multiUserNssResponse = await fetch(multiUserUrl.href, {\n method: 'HEAD'\n })\n if (multiUserNssResponse.ok) {\n return multiUserUrl.href\n }\n\n const singleUserNssResponse = await fetch(singleUserUrl.href, {\n method: 'HEAD'\n })\n if (singleUserNssResponse.ok) {\n return singleUserUrl.href\n }\n return null\n}\n\nfunction createSection (\n container: Element,\n dom: HTMLDocument,\n title: string\n): Element {\n const section = container.appendChild(dom.createElement('div'))\n section.style.border = '0.3em solid #418d99'\n section.style.borderRadius = '0.5em'\n section.style.padding = '0.7em'\n section.style.marginTop = '0.7em'\n\n const titleElement = section.appendChild(dom.createElement('h3'))\n titleElement.innerText = title\n\n return section\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import e from "./ontologyData.esm.js";
|
|
2
|
+
import t from "./preferencesFormText.esm.js";
|
|
3
|
+
import { icons as n, login as r, ns as i, widgets as a } from "solid-ui";
|
|
4
|
+
import { parse as o } from "rdflib";
|
|
5
|
+
//#region src/dashboard/basicPreferences.ts
|
|
6
|
+
var s = {
|
|
7
|
+
icon: n.iconBase + "noun_Sliders_341315_000000.svg",
|
|
8
|
+
name: "basicPreferences",
|
|
9
|
+
label: (e) => null,
|
|
10
|
+
render: (n, i) => {
|
|
11
|
+
let s = i.dom, u = i.session.store;
|
|
12
|
+
function d(e, t) {
|
|
13
|
+
e || f.appendChild(a.errorMessageBlock(s, t, "#fee"));
|
|
14
|
+
}
|
|
15
|
+
let f = s.createElement("div"), p = c(f, s);
|
|
16
|
+
function m(e, t) {
|
|
17
|
+
e = e.doc(), u.holds(void 0, void 0, void 0, e) || o(t, u, e.uri, "text/turtle", null);
|
|
18
|
+
}
|
|
19
|
+
let h = u.sym("urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597#this");
|
|
20
|
+
m(h, t), m(u.sym("urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597-ONT"), e);
|
|
21
|
+
async function g() {
|
|
22
|
+
let e = await r.ensureLoadedPreferences({
|
|
23
|
+
dom: s,
|
|
24
|
+
div: f
|
|
25
|
+
});
|
|
26
|
+
if (!e.preferencesFile) {
|
|
27
|
+
console.log("Not doing private class preferences as no access to preferences file. " + e.preferencesFileError);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let t = a.appendForm(s, p, {}, e.me, h, e.preferencesFile, d);
|
|
31
|
+
t.style.borderStyle = "none";
|
|
32
|
+
let n = i.session.paneRegistry.byName("trustedApplications");
|
|
33
|
+
n && f.appendChild(n.render(null, i)), l(f, u, e.me, s);
|
|
34
|
+
}
|
|
35
|
+
return g(), f;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function c(e, t) {
|
|
39
|
+
let n = f(e, t, "User types"), r = n.appendChild(t.createElement("p"));
|
|
40
|
+
r.innerText = "Here you can self-assign user types to help the data browser know which views you would like to access.";
|
|
41
|
+
let i = n.appendChild(t.createElement("a"));
|
|
42
|
+
return i.href = "https://github.com/solidos/userguide/#role", i.innerText = "Read more", n.appendChild(t.createElement("div"));
|
|
43
|
+
}
|
|
44
|
+
function l(e, t, n, r) {
|
|
45
|
+
let a = f(e, r, "Delete account"), o = t.each(n, i.space("storage"), null, n.doc()).map((e) => e.value), s = a.appendChild(r.createElement("ul"));
|
|
46
|
+
o.forEach(async (e) => {
|
|
47
|
+
let t = await u(e, r);
|
|
48
|
+
t && s.appendChild(r.createElement("li")).appendChild(t);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async function u(e, t) {
|
|
52
|
+
let n = t.createElement("a");
|
|
53
|
+
n.textContent = `Delete your account at ${e}`;
|
|
54
|
+
let r = await d(e);
|
|
55
|
+
return typeof r == "string" ? (n.href = r, n) : null;
|
|
56
|
+
}
|
|
57
|
+
async function d(e) {
|
|
58
|
+
let t = new URL(e), n = new URL(e);
|
|
59
|
+
return n.pathname = t.pathname = "/account/delete", n.hostname = n.hostname.split(".").slice(1).join("."), (await fetch(n.href, { method: "HEAD" })).ok ? n.href : (await fetch(t.href, { method: "HEAD" })).ok ? t.href : null;
|
|
60
|
+
}
|
|
61
|
+
function f(e, t, n) {
|
|
62
|
+
let r = e.appendChild(t.createElement("div"));
|
|
63
|
+
r.style.border = "0.3em solid #418d99", r.style.borderRadius = "0.5em", r.style.padding = "0.7em", r.style.marginTop = "0.7em";
|
|
64
|
+
let i = r.appendChild(t.createElement("h3"));
|
|
65
|
+
return i.innerText = n, r;
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { s as basicPreferencesPane, s as default };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=basicPreferences.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basicPreferences.esm.js","names":[],"sources":["../../src/dashboard/basicPreferences.ts"],"sourcesContent":["import { PaneDefinition } from 'pane-registry'\nimport { IndexedFormula, NamedNode, parse, Store } from 'rdflib'\nimport { icons, login, ns, widgets } from 'solid-ui'\nimport ontologyData from './ontologyData.ttl'\nimport preferencesFormText from './preferencesFormText.ttl'\n\nexport const basicPreferencesPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_Sliders_341315_000000.svg',\n name: 'basicPreferences',\n label: _subject => {\n return null\n },\n\n // Render the pane\n // The subject should be the logged in user.\n render: (subject, context) => {\n const dom = context.dom\n // @ts-ignore\n const store = context.session.store as Store\n\n function complainIfBad (ok: Boolean, mess: any) {\n if (ok) return\n container.appendChild(widgets.errorMessageBlock(dom, mess, '#fee'))\n }\n\n const container = dom.createElement('div')\n\n const formArea = setupUserTypesSection(container, dom)\n\n function loadData (doc: NamedNode, turtle: String) {\n doc = doc.doc() // remove # from URI if nec\n if (!store.holds(undefined, undefined, undefined, doc)) {\n // If not loaded already\n ;(parse as any)(turtle, store, doc.uri, 'text/turtle', null) // Load form directly\n }\n }\n\n const preferencesForm = store.sym(\n 'urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597#this'\n )\n loadData(preferencesForm, preferencesFormText)\n\n const ontologyExtra = store.sym(\n 'urn:uuid:93774ba1-d3b6-41f2-85b6-4ae27ffd2597-ONT'\n )\n loadData(ontologyExtra, ontologyData)\n\n async function doRender () {\n const renderContext = await login.ensureLoadedPreferences({\n dom,\n div: container\n })\n if (!renderContext.preferencesFile) {\n // Could be CORS\n console.log(\n 'Not doing private class preferences as no access to preferences file. ' +\n renderContext.preferencesFileError\n )\n return\n }\n const appendedForm = widgets.appendForm(\n dom,\n formArea,\n {},\n renderContext.me,\n preferencesForm,\n renderContext.preferencesFile,\n complainIfBad\n )\n appendedForm.style.borderStyle = 'none'\n\n const trustedApplicationsView = context.session.paneRegistry.byName('trustedApplications')\n if (trustedApplicationsView) {\n container.appendChild(trustedApplicationsView.render(null, context))\n }\n\n // @@ TODO Remove need for casting as any and bang (!) syntax\n addDeleteSection(container, store, renderContext.me!, dom)\n }\n\n doRender()\n\n return container\n }\n}\n\nfunction setupUserTypesSection (\n container: Element,\n dom: HTMLDocument\n): Element {\n const formContainer = createSection(container, dom, 'User types')\n\n const description = formContainer.appendChild(dom.createElement('p'))\n description.innerText = 'Here you can self-assign user types to help the data browser know which views you would like to access.'\n\n const userTypesLink = formContainer.appendChild(dom.createElement('a'))\n userTypesLink.href = 'https://github.com/solidos/userguide/#role'\n userTypesLink.innerText = 'Read more'\n\n const formArea = formContainer.appendChild(dom.createElement('div'))\n\n return formArea\n}\n\nexport default basicPreferencesPane\n\n// ends\n\nfunction addDeleteSection (\n container: HTMLElement,\n store: IndexedFormula,\n profile: NamedNode,\n dom: HTMLDocument\n): void {\n const section = createSection(container, dom, 'Delete account')\n\n const podServerNodes = store.each(profile, ns.space('storage'), null, profile.doc())\n const podServers = podServerNodes.map(node => node.value)\n\n const list = section.appendChild(dom.createElement('ul'))\n\n podServers.forEach(async server => {\n const deletionLink = await generateDeletionLink(server, dom)\n if (deletionLink) {\n const listItem = list.appendChild(dom.createElement('li'))\n listItem.appendChild(deletionLink)\n }\n })\n}\n\nasync function generateDeletionLink (\n podServer: string,\n dom: HTMLDocument\n): Promise<HTMLElement | null> {\n const link = dom.createElement('a')\n link.textContent = `Delete your account at ${podServer}`\n const deletionUrl = await getDeletionUrlForServer(podServer)\n if (typeof deletionUrl !== 'string') {\n return null\n }\n link.href = deletionUrl\n return link\n}\n\n/**\n * Hacky way to get the deletion link to a Pod\n *\n * This function infers the deletion link by assuming the URL structure of Node Solid server.\n * In the future, Solid will hopefully provide a standardised way of discovering the deletion link:\n * https://github.com/solidos/data-interoperability-panel/issues/18\n *\n * If NSS is in multi-user mode (the case on inrupt.net and solid.community), the deletion URL for\n * vincent.dev.inrupt.net would be at dev.inrupt.net/account/delete. In single-user mode, the\n * deletion URL would be at vincent.dev.inrupt.net/account/delete.\n *\n * @param server Pod server containing the user's account.\n * @returns URL of the page that Node Solid Server would offer to delete the account, or null if\n * the URLs we tried give invalid responses.\n */\nasync function getDeletionUrlForServer (\n server: string\n): Promise<string | null> {\n const singleUserUrl = new URL(server)\n const multiUserUrl = new URL(server)\n multiUserUrl.pathname = singleUserUrl.pathname = '/account/delete'\n\n const hostnameParts = multiUserUrl.hostname.split('.')\n // Remove `vincent.` from `vincent.dev.inrupt.net`, for example:\n multiUserUrl.hostname = hostnameParts.slice(1).join('.')\n\n const multiUserNssResponse = await fetch(multiUserUrl.href, {\n method: 'HEAD'\n })\n if (multiUserNssResponse.ok) {\n return multiUserUrl.href\n }\n\n const singleUserNssResponse = await fetch(singleUserUrl.href, {\n method: 'HEAD'\n })\n if (singleUserNssResponse.ok) {\n return singleUserUrl.href\n }\n return null\n}\n\nfunction createSection (\n container: Element,\n dom: HTMLDocument,\n title: string\n): Element {\n const section = container.appendChild(dom.createElement('div'))\n section.style.border = '0.3em solid #418d99'\n section.style.borderRadius = '0.5em'\n section.style.padding = '0.7em'\n section.style.marginTop = '0.7em'\n\n const titleElement = section.appendChild(dom.createElement('h3'))\n titleElement.innerText = title\n\n return section\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Fetcher, IndexedFormula, NamedNode } from 'rdflib';
|
|
1
|
+
import { Fetcher, IndexedFormula, NamedNode } from '../../node_modules/rdflib';
|
|
2
2
|
export declare function generateHomepage(uri: NamedNode, store: IndexedFormula, fetcher: Fetcher): Promise<HTMLElement>;
|
|
3
3
|
//# sourceMappingURL=homepage.d.ts.map
|