profile-pane 3.1.5 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/lib/04567ff683933c35c465.png +0 -0
- package/lib/10163fd9b5a0e00d63a0.png +0 -0
- package/lib/1234dcb2eec2e45f252b.png +0 -0
- package/lib/20899934157df4db56cb.png +0 -0
- package/lib/33760bf79f097f449da5.png +0 -0
- package/lib/578d2b6ed32e7624164e.png +0 -0
- package/lib/5f62a5b2b7e99b9640c7.png +0 -0
- package/lib/6525766ecd288ec60129.png +0 -0
- package/lib/7800be6f6c4b5b0f4f20.png +0 -0
- package/lib/976473cf5fe24d657d4b.png +0 -0
- package/lib/ChatWithMe.d.ts +2 -1
- package/lib/ChatWithMe.d.ts.map +1 -1
- package/lib/ChatWithMe.js +3 -3
- package/lib/ProfileView.d.ts +1 -1
- package/lib/ProfileView.d.ts.map +1 -1
- package/lib/ProfileView.js +71 -131
- package/lib/ProfileViewModelPresenter.d.ts +23 -0
- package/lib/ProfileViewModelPresenter.d.ts.map +1 -0
- package/lib/ProfileViewModelPresenter.js +37 -0
- package/lib/QRCodeCard.d.ts +3 -1
- package/lib/QRCodeCard.d.ts.map +1 -1
- package/lib/QRCodeCard.js +86 -66
- package/lib/addMeToYourFriends.d.ts +3 -3
- package/lib/addMeToYourFriends.d.ts.map +1 -1
- package/lib/addMeToYourFriends.js +14 -30
- package/lib/bda84f59e7216675a208.png +0 -0
- package/lib/buttonsHelper.js +1 -1
- package/lib/cd68e8f3990ba8b2139e.png +0 -0
- package/lib/e7074a7e2cb69e51cfd3.png +0 -0
- package/lib/editProfilePane/EditCVCard.d.ts +1 -0
- package/lib/editProfilePane/EditCVCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditCVCard.js +2 -1
- package/lib/editProfilePane/EditCommunitiesCard.d.ts +1 -1
- package/lib/editProfilePane/EditCommunitiesCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditCommunitiesCard.js +2 -1
- package/lib/editProfilePane/EditContactsCard.d.ts +1 -0
- package/lib/editProfilePane/EditContactsCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditContactsCard.js +2 -0
- package/lib/editProfilePane/EditFriendsCard.d.ts +1 -1
- package/lib/editProfilePane/EditFriendsCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditFriendsCard.js +2 -1
- package/lib/editProfilePane/EditOtherPreferences.d.ts +1 -0
- package/lib/editProfilePane/EditOtherPreferences.d.ts.map +1 -1
- package/lib/editProfilePane/EditOtherPreferences.js +1 -0
- package/lib/editProfilePane/EditProfileView.d.ts +1 -1
- package/lib/editProfilePane/EditProfileView.d.ts.map +1 -1
- package/lib/editProfilePane/EditProfileView.js +1 -1
- package/lib/editProfilePane/EditSocialCard.d.ts +1 -0
- package/lib/editProfilePane/EditSocialCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditSocialCard.js +2 -1
- package/lib/editProfilePane/editProfilePresenter.d.ts +1 -0
- package/lib/editProfilePane/editProfilePresenter.d.ts.map +1 -1
- package/lib/editProfilePane/editProfilePresenter.js +2 -0
- package/lib/f3772696fb7ee53c23d8.png +0 -0
- package/lib/icons-svg/contactIcons.d.ts +3 -0
- package/lib/icons-svg/contactIcons.d.ts.map +1 -0
- package/lib/icons-svg/contactIcons.js +32 -0
- package/lib/icons-svg/profileIcons.d.ts +22 -0
- package/lib/icons-svg/profileIcons.d.ts.map +1 -0
- package/lib/icons-svg/profileIcons.js +309 -0
- package/lib/index.d.ts +1 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +42 -19
- package/lib/profile-pane.js +15629 -5670
- package/lib/profile-pane.js.map +1 -1
- package/lib/profile-pane.min.js +2171 -230
- package/lib/profile-pane.min.js.map +1 -1
- package/lib/rdfFormsHelper.d.ts +1 -0
- package/lib/rdfFormsHelper.d.ts.map +1 -1
- package/lib/rdfFormsHelper.js +2 -0
- package/lib/sections/bio/BioEditDialog.d.ts +6 -0
- package/lib/sections/bio/BioEditDialog.d.ts.map +1 -0
- package/lib/sections/bio/BioEditDialog.js +119 -0
- package/lib/sections/bio/BioSection.d.ts +7 -0
- package/lib/sections/bio/BioSection.d.ts.map +1 -0
- package/lib/sections/bio/BioSection.js +131 -0
- package/lib/sections/bio/mutations.d.ts +4 -0
- package/lib/sections/bio/mutations.d.ts.map +1 -0
- package/lib/sections/bio/mutations.js +43 -0
- package/lib/sections/bio/selectors.d.ts +4 -0
- package/lib/sections/bio/selectors.d.ts.map +1 -0
- package/lib/sections/bio/selectors.js +15 -0
- package/lib/sections/bio/types.d.ts +15 -0
- package/lib/sections/bio/types.d.ts.map +1 -0
- package/lib/sections/bio/types.js +5 -0
- package/lib/sections/contactInfo/ContactInfoEditDialog.d.ts +7 -0
- package/lib/sections/contactInfo/ContactInfoEditDialog.d.ts.map +1 -0
- package/lib/sections/contactInfo/ContactInfoEditDialog.js +658 -0
- package/lib/sections/contactInfo/ContactInfoSection.d.ts +5 -0
- package/lib/sections/contactInfo/ContactInfoSection.d.ts.map +1 -0
- package/lib/sections/contactInfo/ContactInfoSection.js +229 -0
- package/lib/sections/contactInfo/mutations.d.ts +4 -0
- package/lib/sections/contactInfo/mutations.d.ts.map +1 -0
- package/lib/sections/contactInfo/mutations.js +150 -0
- package/lib/sections/contactInfo/selectors.d.ts +4 -0
- package/lib/sections/contactInfo/selectors.d.ts.map +1 -0
- package/lib/sections/contactInfo/selectors.js +104 -0
- package/lib/sections/contactInfo/types.d.ts +44 -0
- package/lib/sections/contactInfo/types.d.ts.map +1 -0
- package/lib/sections/contactInfo/types.js +5 -0
- package/lib/sections/education/EducationEditDialog.d.ts +7 -0
- package/lib/sections/education/EducationEditDialog.d.ts.map +1 -0
- package/lib/sections/education/EducationEditDialog.js +459 -0
- package/lib/sections/education/EducationSection.d.ts +7 -0
- package/lib/sections/education/EducationSection.d.ts.map +1 -0
- package/lib/sections/education/EducationSection.js +126 -0
- package/lib/sections/education/mutations.d.ts +4 -0
- package/lib/sections/education/mutations.d.ts.map +1 -0
- package/lib/sections/education/mutations.js +60 -0
- package/lib/sections/education/selectors.d.ts +4 -0
- package/lib/sections/education/selectors.d.ts.map +1 -0
- package/lib/sections/education/selectors.js +64 -0
- package/lib/sections/education/types.d.ts +20 -0
- package/lib/sections/education/types.d.ts.map +1 -0
- package/lib/sections/education/types.js +5 -0
- package/lib/sections/heading/HeadingEditDialog.d.ts +6 -0
- package/lib/sections/heading/HeadingEditDialog.d.ts.map +1 -0
- package/lib/sections/heading/HeadingEditDialog.js +742 -0
- package/lib/sections/heading/HeadingSection.d.ts +9 -0
- package/lib/sections/heading/HeadingSection.d.ts.map +1 -0
- package/lib/sections/heading/HeadingSection.js +97 -0
- package/lib/sections/heading/camera.d.ts +19 -0
- package/lib/sections/heading/camera.d.ts.map +1 -0
- package/lib/sections/heading/camera.js +199 -0
- package/lib/sections/heading/dateHelpers.d.ts +4 -0
- package/lib/sections/heading/dateHelpers.d.ts.map +1 -0
- package/lib/sections/heading/dateHelpers.js +48 -0
- package/lib/sections/heading/imageHelpers.d.ts +4 -0
- package/lib/sections/heading/imageHelpers.d.ts.map +1 -0
- package/lib/sections/heading/imageHelpers.js +81 -0
- package/lib/sections/heading/mutations.d.ts +4 -0
- package/lib/sections/heading/mutations.d.ts.map +1 -0
- package/lib/sections/heading/mutations.js +190 -0
- package/lib/sections/heading/selectors.d.ts +5 -0
- package/lib/sections/heading/selectors.d.ts.map +1 -0
- package/lib/sections/heading/selectors.js +157 -0
- package/lib/sections/heading/types.d.ts +36 -0
- package/lib/sections/heading/types.d.ts.map +1 -0
- package/lib/sections/heading/types.js +5 -0
- package/lib/sections/languages/LanguageEditDialog.d.ts +7 -0
- package/lib/sections/languages/LanguageEditDialog.d.ts.map +1 -0
- package/lib/sections/languages/LanguageEditDialog.js +457 -0
- package/lib/sections/languages/LanguageSection.d.ts +5 -0
- package/lib/sections/languages/LanguageSection.d.ts.map +1 -0
- package/lib/sections/languages/LanguageSection.js +137 -0
- package/lib/sections/languages/mutations.d.ts +6 -0
- package/lib/sections/languages/mutations.d.ts.map +1 -0
- package/lib/sections/languages/mutations.js +296 -0
- package/lib/sections/languages/selectors.d.ts +5 -0
- package/lib/sections/languages/selectors.d.ts.map +1 -0
- package/lib/sections/languages/selectors.js +146 -0
- package/lib/sections/languages/types.d.ts +15 -0
- package/lib/sections/languages/types.d.ts.map +1 -0
- package/lib/sections/languages/types.js +5 -0
- package/lib/sections/projects/ProjectEditDialog.d.ts +7 -0
- package/lib/sections/projects/ProjectEditDialog.d.ts.map +1 -0
- package/lib/sections/projects/ProjectEditDialog.js +182 -0
- package/lib/sections/projects/ProjectSection.d.ts +6 -0
- package/lib/sections/projects/ProjectSection.d.ts.map +1 -0
- package/lib/sections/projects/ProjectSection.js +220 -0
- package/lib/sections/projects/mutations.d.ts +4 -0
- package/lib/sections/projects/mutations.d.ts.map +1 -0
- package/lib/sections/projects/mutations.js +188 -0
- package/lib/sections/projects/selectors.d.ts +5 -0
- package/lib/sections/projects/selectors.d.ts.map +1 -0
- package/lib/sections/projects/selectors.js +163 -0
- package/lib/sections/projects/types.d.ts +28 -0
- package/lib/sections/projects/types.d.ts.map +1 -0
- package/lib/sections/projects/types.js +8 -0
- package/lib/sections/resume/ResumeEditDialog.d.ts +7 -0
- package/lib/sections/resume/ResumeEditDialog.d.ts.map +1 -0
- package/lib/sections/resume/ResumeEditDialog.js +629 -0
- package/lib/sections/resume/ResumeSection.d.ts +7 -0
- package/lib/sections/resume/ResumeSection.d.ts.map +1 -0
- package/lib/sections/resume/ResumeSection.js +160 -0
- package/lib/sections/resume/mutations.d.ts +6 -0
- package/lib/sections/resume/mutations.d.ts.map +1 -0
- package/lib/sections/resume/mutations.js +172 -0
- package/lib/sections/resume/selectors.d.ts +4 -0
- package/lib/sections/resume/selectors.d.ts.map +1 -0
- package/lib/sections/resume/selectors.js +142 -0
- package/lib/sections/resume/types.d.ts +33 -0
- package/lib/sections/resume/types.d.ts.map +1 -0
- package/lib/sections/resume/types.js +8 -0
- package/lib/sections/shared/collapsibleSection.d.ts +2 -0
- package/lib/sections/shared/collapsibleSection.d.ts.map +1 -0
- package/lib/sections/shared/collapsibleSection.js +24 -0
- package/lib/sections/shared/contactTypeUtils.d.ts +7 -0
- package/lib/sections/shared/contactTypeUtils.d.ts.map +1 -0
- package/lib/sections/shared/contactTypeUtils.js +48 -0
- package/lib/sections/shared/idNodeFactory.d.ts +3 -0
- package/lib/sections/shared/idNodeFactory.d.ts.map +1 -0
- package/lib/sections/shared/idNodeFactory.js +14 -0
- package/lib/sections/shared/phoneCountries.d.ts +20 -0
- package/lib/sections/shared/phoneCountries.d.ts.map +1 -0
- package/lib/sections/shared/phoneCountries.js +1080 -0
- package/lib/sections/shared/rdfList.d.ts +3 -0
- package/lib/sections/shared/rdfList.d.ts.map +1 -0
- package/lib/sections/shared/rdfList.js +34 -0
- package/lib/sections/shared/rdfMutationHelpers.d.ts +12 -0
- package/lib/sections/shared/rdfMutationHelpers.d.ts.map +1 -0
- package/lib/sections/shared/rdfMutationHelpers.js +82 -0
- package/lib/sections/shared/rowState.d.ts +21 -0
- package/lib/sections/shared/rowState.d.ts.map +1 -0
- package/lib/sections/shared/rowState.js +52 -0
- package/lib/sections/shared/sanitizeUtils.d.ts +5 -0
- package/lib/sections/shared/sanitizeUtils.d.ts.map +1 -0
- package/lib/sections/shared/sanitizeUtils.js +22 -0
- package/lib/sections/shared/sectionCardHelpers.d.ts +11 -0
- package/lib/sections/shared/sectionCardHelpers.d.ts.map +1 -0
- package/lib/sections/shared/sectionCardHelpers.js +105 -0
- package/lib/sections/shared/types.d.ts +7 -0
- package/lib/sections/shared/types.d.ts.map +1 -0
- package/lib/sections/shared/types.js +5 -0
- package/lib/sections/skills/SkillsEditDialog.d.ts +7 -0
- package/lib/sections/skills/SkillsEditDialog.d.ts.map +1 -0
- package/lib/sections/skills/SkillsEditDialog.js +340 -0
- package/lib/sections/skills/SkillsSection.d.ts +5 -0
- package/lib/sections/skills/SkillsSection.d.ts.map +1 -0
- package/lib/sections/skills/SkillsSection.js +169 -0
- package/lib/sections/skills/mutations.d.ts +6 -0
- package/lib/sections/skills/mutations.d.ts.map +1 -0
- package/lib/sections/skills/mutations.js +110 -0
- package/lib/sections/skills/selectors.d.ts +6 -0
- package/lib/sections/skills/selectors.d.ts.map +1 -0
- package/lib/sections/skills/selectors.js +37 -0
- package/lib/sections/skills/types.d.ts +14 -0
- package/lib/sections/skills/types.d.ts.map +1 -0
- package/lib/sections/skills/types.js +5 -0
- package/lib/sections/social/SocialEditDialog.d.ts +7 -0
- package/lib/sections/social/SocialEditDialog.d.ts.map +1 -0
- package/lib/sections/social/SocialEditDialog.js +362 -0
- package/lib/sections/social/SocialSection.d.ts +8 -0
- package/lib/sections/social/SocialSection.d.ts.map +1 -0
- package/lib/sections/social/SocialSection.js +201 -0
- package/lib/sections/social/constants.d.ts +3 -0
- package/lib/sections/social/constants.d.ts.map +1 -0
- package/lib/sections/social/constants.js +16 -0
- package/lib/sections/social/helpers.d.ts +15 -0
- package/lib/sections/social/helpers.d.ts.map +1 -0
- package/lib/sections/social/helpers.js +316 -0
- package/lib/sections/social/mutations.d.ts +4 -0
- package/lib/sections/social/mutations.d.ts.map +1 -0
- package/lib/sections/social/mutations.js +298 -0
- package/lib/sections/social/selectors.d.ts +4 -0
- package/lib/sections/social/selectors.d.ts.map +1 -0
- package/lib/sections/social/selectors.js +43 -0
- package/lib/sections/social/types.d.ts +19 -0
- package/lib/sections/social/types.d.ts.map +1 -0
- package/lib/sections/social/types.js +5 -0
- package/lib/styles/BioSection.css +77 -0
- package/lib/styles/CVCard.css +107 -2
- package/lib/styles/ContactInfoEditDialog.css +153 -0
- package/lib/styles/EditDialogs.css +1028 -0
- package/lib/styles/EducationCard.css +103 -0
- package/lib/styles/HeadingSection.css +309 -0
- package/lib/styles/ProfileCard.css +10 -42
- package/lib/styles/ProfileView.css +53 -8
- package/lib/styles/ProjectsCard.css +206 -0
- package/lib/styles/QRCodeCard.css +29 -10
- package/lib/styles/SocialCard.css +41 -13
- package/lib/styles/dialog.css +209 -0
- package/lib/styles/utilities.css +638 -256
- package/lib/textUtils.d.ts +6 -0
- package/lib/textUtils.d.ts.map +1 -0
- package/lib/textUtils.js +44 -0
- package/lib/texts.d.ts +45 -4
- package/lib/texts.d.ts.map +1 -1
- package/lib/texts.js +46 -5
- package/lib/types.d.ts +2 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +5 -0
- package/lib/ui/dialog.d.ts +29 -0
- package/lib/ui/dialog.d.ts.map +1 -0
- package/lib/ui/dialog.js +269 -0
- package/lib/ui/errors.d.ts +2 -0
- package/lib/ui/errors.d.ts.map +1 -0
- package/lib/ui/errors.js +10 -0
- package/package.json +6 -4
- package/lib/CVCard.d.ts +0 -4
- package/lib/CVCard.d.ts.map +0 -1
- package/lib/CVCard.js +0 -114
- package/lib/CVPresenter.d.ts +0 -25
- package/lib/CVPresenter.d.ts.map +0 -1
- package/lib/CVPresenter.js +0 -119
- package/lib/FriendList.d.ts +0 -6
- package/lib/FriendList.d.ts.map +0 -1
- package/lib/FriendList.js +0 -27
- package/lib/ProfileCard.d.ts +0 -6
- package/lib/ProfileCard.d.ts.map +0 -1
- package/lib/ProfileCard.js +0 -62
- package/lib/SocialCard.d.ts +0 -5
- package/lib/SocialCard.d.ts.map +0 -1
- package/lib/SocialCard.js +0 -51
- package/lib/SocialPresenter.d.ts +0 -11
- package/lib/SocialPresenter.d.ts.map +0 -1
- package/lib/SocialPresenter.js +0 -117
- package/lib/StuffCard.d.ts +0 -10
- package/lib/StuffCard.d.ts.map +0 -1
- package/lib/StuffCard.js +0 -52
- package/lib/StuffPresenter.d.ts +0 -14
- package/lib/StuffPresenter.d.ts.map +0 -1
- package/lib/StuffPresenter.js +0 -53
- package/lib/presenter.d.ts +0 -14
- package/lib/presenter.d.ts.map +0 -1
- package/lib/presenter.js +0 -68
- package/lib/styles/FriendList.css +0 -12
- package/lib/styles/StuffCard.css +0 -23
- package/lib/styles/editProfile.css +0 -62
- package/lib/styles/profileRDFFormsEnforced.css +0 -431
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-pane.min.js","mappings":"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","sources":["webpack://ProfilePane/webpack/universalModuleDefinition","webpack://ProfilePane/./src/styles/CVCard.css","webpack://ProfilePane/./src/styles/ChatWithMe.css","webpack://ProfilePane/./src/styles/FriendList.css","webpack://ProfilePane/./src/styles/ProfileCard.css","webpack://ProfilePane/./src/styles/ProfileView.css","webpack://ProfilePane/./src/styles/QRCodeCard.css","webpack://ProfilePane/./src/styles/SocialCard.css","webpack://ProfilePane/./src/styles/StuffCard.css","webpack://ProfilePane/./src/styles/editProfile.css","webpack://ProfilePane/./src/styles/profileRDFFormsEnforced.css","webpack://ProfilePane/./src/styles/utilities.css","webpack://ProfilePane/./node_modules/css-loader/dist/runtime/api.js","webpack://ProfilePane/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://ProfilePane/./node_modules/dijkstrajs/dijkstra.js","webpack://ProfilePane/./node_modules/qrcode/lib/browser.js","webpack://ProfilePane/./node_modules/qrcode/lib/can-promise.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/alignment-pattern.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/alphanumeric-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/bit-buffer.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/bit-matrix.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/byte-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/error-correction-code.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/error-correction-level.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/finder-pattern.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/format-info.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/galois-field.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/kanji-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/mask-pattern.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/mode.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/numeric-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/polynomial.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/qrcode.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/reed-solomon-encoder.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/regex.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/segments.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/utils.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/version-check.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/version.js","webpack://ProfilePane/./node_modules/qrcode/lib/renderer/canvas.js","webpack://ProfilePane/./node_modules/qrcode/lib/renderer/svg-tag.js","webpack://ProfilePane/./node_modules/qrcode/lib/renderer/utils.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://ProfilePane/./node_modules/validate-color/lib/index.js","webpack://ProfilePane/external umd \"SolidLogic\"","webpack://ProfilePane/external umd \"UI\"","webpack://ProfilePane/external umd \"rdflib\"","webpack://ProfilePane/webpack/bootstrap","webpack://ProfilePane/webpack/runtime/compat get default export","webpack://ProfilePane/webpack/runtime/define property getters","webpack://ProfilePane/webpack/runtime/hasOwnProperty shorthand","webpack://ProfilePane/webpack/runtime/nonce","webpack://ProfilePane/./src/styles/CVCard.css?991d","webpack://ProfilePane/./src/styles/ChatWithMe.css?2963","webpack://ProfilePane/./src/styles/FriendList.css?4665","webpack://ProfilePane/./src/styles/ProfileCard.css?4c2f","webpack://ProfilePane/./src/styles/ProfileView.css?48de","webpack://ProfilePane/./src/styles/QRCodeCard.css?9d8e","webpack://ProfilePane/./src/styles/SocialCard.css?9a5c","webpack://ProfilePane/./src/styles/StuffCard.css?8d30","webpack://ProfilePane/./src/styles/utilities.css?4cc3","webpack://ProfilePane/./node_modules/lit-html/lit-html.js","webpack://ProfilePane/./node_modules/lit-html/directive-helpers.js","webpack://ProfilePane/./node_modules/lit-html/directive.js","webpack://ProfilePane/./node_modules/lit-html/async-directive.js","webpack://ProfilePane/./node_modules/lit-html/directives/private-async-helpers.js","webpack://ProfilePane/./node_modules/lit-html/directives/async-replace.js","webpack://ProfilePane/./src/texts.ts","webpack://ProfilePane/./src/buttonsHelper.ts","webpack://ProfilePane/./src/addMeToYourFriends.ts","webpack://ProfilePane/./src/FriendList.ts","webpack://ProfilePane/./src/presenter.ts","webpack://ProfilePane/./src/CVPresenter.ts","webpack://ProfilePane/./src/rdfFormsHelper.ts","webpack://ProfilePane/./src/SocialPresenter.ts","webpack://ProfilePane/./src/StuffPresenter.ts","webpack://ProfilePane/./src/QRCodeCard.ts","webpack://ProfilePane/./src/ProfileCard.ts","webpack://ProfilePane/./src/CVCard.ts","webpack://ProfilePane/./src/SocialCard.ts","webpack://ProfilePane/./src/StuffCard.ts","webpack://ProfilePane/./src/ProfileView.ts","webpack://ProfilePane/./src/ChatWithMe.ts","webpack://ProfilePane/./src/editProfilePane/EditContactsCard.ts","webpack://ProfilePane/./src/styles/profileRDFFormsEnforced.css?9aaf","webpack://ProfilePane/./src/styles/editProfile.css?3f0e","webpack://ProfilePane/./src/editProfilePane/editProfilePresenter.ts","webpack://ProfilePane/./src/editProfilePane/EditFriendsCard.ts","webpack://ProfilePane/./src/editProfilePane/EditCommunitiesCard.ts","webpack://ProfilePane/./src/editProfilePane/EditProfileView.ts","webpack://ProfilePane/./src/editProfilePane/EditCVCard.ts","webpack://ProfilePane/./src/editProfilePane/EditSocialCard.ts","webpack://ProfilePane/./src/editProfilePane/EditOtherPreferences.ts","webpack://ProfilePane/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"UI\"), require(\"SolidLogic\"), require(\"rdflib\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"UI\", \"SolidLogic\", \"rdflib\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ProfilePane\"] = factory(require(\"UI\"), require(\"SolidLogic\"), require(\"rdflib\"));\n\telse\n\t\troot[\"ProfilePane\"] = factory(root[\"UI\"], root[\"SolidLogic\"], root[\"rdflib\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__9426__, __WEBPACK_EXTERNAL_MODULE__5663__, __WEBPACK_EXTERNAL_MODULE__5491__) => {\nreturn ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* CVCard.css */\n/* Note: Uses utilities: .section-title for cvOrg styling */\n\n.cvSection {\n margin-bottom: 1.25em;\n}\n\n.cvRole {\n margin: var(--spacing-xs) 0;\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n display: flex;\n flex-direction: column;\n gap: 0.2em;\n}\n\n.cvOrg {\n font-weight: 600;\n color: var(--color-primary);\n}\n\n.cvSkill, .cvLanguage {\n text-align: left;\n margin: var(--spacing-xs) 0;\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n}\n\n.cvSection h3 {\n color: var(--color-text);\n font-size: var(--font-size-lg);\n font-weight: 600;\n line-height: var(--line-height-tight);\n margin-bottom: var(--spacing-xs);\n border-bottom: 1px solid var(--color-border-pale);\n padding-bottom: var(--spacing-xs);\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/CVCard.css\"],\"names\":[],\"mappings\":\"AAAA,eAAe;AACf,2DAA2D;;AAE3D;EACE,qBAAqB;AACvB;;AAEA;EACE,2BAA2B;EAC3B,gCAAgC;EAChC,oCAAoC;EACpC,aAAa;EACb,sBAAsB;EACtB,UAAU;AACZ;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;EAC3B,gCAAgC;EAChC,oCAAoC;AACtC;;AAEA;EACE,wBAAwB;EACxB,8BAA8B;EAC9B,gBAAgB;EAChB,qCAAqC;EACrC,gCAAgC;EAChC,iDAAiD;EACjD,iCAAiC;AACnC\",\"sourcesContent\":[\"/* CVCard.css */\\n/* Note: Uses utilities: .section-title for cvOrg styling */\\n\\n.cvSection {\\n margin-bottom: 1.25em;\\n}\\n\\n.cvRole {\\n margin: var(--spacing-xs) 0;\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n display: flex;\\n flex-direction: column;\\n gap: 0.2em;\\n}\\n\\n.cvOrg {\\n font-weight: 600;\\n color: var(--color-primary);\\n}\\n\\n.cvSkill, .cvLanguage {\\n text-align: left;\\n margin: var(--spacing-xs) 0;\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n}\\n\\n.cvSection h3 {\\n color: var(--color-text);\\n font-size: var(--font-size-lg);\\n font-weight: 600;\\n line-height: var(--line-height-tight);\\n margin-bottom: var(--spacing-xs);\\n border-bottom: 1px solid var(--color-border-pale);\\n padding-bottom: var(--spacing-xs);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ChatWithMe.css */\n/* Uses utilities: .section-centered, .loading-text, .btn-primary, .btn-transparent */\n\n.chatSection {\n overflow-x: auto;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ChatWithMe.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,qFAAqF;;AAErF;EACE,gBAAgB;AAClB\",\"sourcesContent\":[\"/* ChatWithMe.css */\\n/* Uses utilities: .section-centered, .loading-text, .btn-primary, .btn-transparent */\\n\\n.chatSection {\\n overflow-x: auto;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* FriendList.css */\n/* Uses utilities: .list-reset, .section-title, .zebra-stripe, .flex, .gap-xs, .mb-md */\n\n.friendItem {\n padding: var(--spacing-xs) 0;\n font-size: 1em;\n color: var(--color-text-muted);\n}\n\n.friendItem:last-child {\n border-bottom: none;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/FriendList.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,uFAAuF;;AAEvF;EACE,4BAA4B;EAC5B,cAAc;EACd,8BAA8B;AAChC;;AAEA;EACE,mBAAmB;AACrB\",\"sourcesContent\":[\"/* FriendList.css */\\n/* Uses utilities: .list-reset, .section-title, .zebra-stripe, .flex, .gap-xs, .mb-md */\\n\\n.friendItem {\\n padding: var(--spacing-xs) 0;\\n font-size: 1em;\\n color: var(--color-text-muted);\\n}\\n\\n.friendItem:last-child {\\n border-bottom: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileCard.css */\n/* Uses utilities: .action-button-focus, .btn-primary, .flex-column-center, .text-truncate, .text-center, .text-wrap-anywhere, .section-centered, .btn-transparent */\n\n.profileCard {\n /* Component container */\n}\n\n.image {\n width: 160px;\n height: 160px;\n border-radius: 50%;\n object-fit: cover;\n margin-bottom: var(--spacing-sm);\n box-shadow: var(--box-shadow-sm);\n border: 3px solid var(--color-primary);\n background: var(--color-card-bg);\n box-sizing: border-box;\n}\n\n.image-alt {\n width: 160px;\n height: 160px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n margin-bottom: var(--spacing-sm);\n box-shadow: var(--box-shadow-sm);\n border: 3px solid var(--color-primary);\n background: var(--color-card-bg);\n box-sizing: border-box;\n color: var(--color-text-secondary);\n}\n\n.name {\n font-size: var(--font-size-xl);\n font-weight: 700;\n line-height: var(--line-height-tight);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n margin: 0;\n letter-spacing: var(--letter-spacing-wide);\n}\n\n.intro {\n color: var(--color-text-secondary);\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n margin-bottom: var(--spacing-xs);\n max-width: 40ch;\n margin-left: auto;\n margin-right: auto;\n}\n\n.buttonSection {\n color: var(--color-text-secondary);\n font-size: 1em;\n margin-bottom: var(--spacing-xs);\n}\n\n.buttonSubSection {\n width: 100%;\n min-width: 0;\n display: grid;\n}\n\n.buttonSubSection button {\n width: 100%;\n min-width: 0;\n}\n\n/* Ensure prompt inputs stretch to fit their container */\n.add-friend-button-container input[type=\"text\"] {\n width: 100%;\n box-sizing: border-box;\n}\n\n.qrCodeSection {\n color: var(--color-text-secondary);\n font-size: 1em;\n margin-bottom: var(--spacing-xs);\n}\n\n.details {\n color: var(--color-text-muted);\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n max-width: 45ch;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* ProfileCard styles as regular CSS */\n.profile-card {\n border: 1px solid #ccc;\n padding: 16px;\n background: white;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ProfileCard.css\"],\"names\":[],\"mappings\":\"AAAA,oBAAoB;AACpB,oKAAoK;;AAEpK;EACE,wBAAwB;AAC1B;;AAEA;EACE,YAAY;EACZ,aAAa;EACb,kBAAkB;EAClB,iBAAiB;EACjB,gCAAgC;EAChC,gCAAgC;EAChC,sCAAsC;EACtC,gCAAgC;EAChC,sBAAsB;AACxB;;AAEA;EACE,YAAY;EACZ,aAAa;EACb,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,kBAAkB;EAClB,gCAAgC;EAChC,gCAAgC;EAChC,sCAAsC;EACtC,gCAAgC;EAChC,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,8BAA8B;EAC9B,gBAAgB;EAChB,qCAAqC;EACrC,0BAA0B;EAC1B,4BAA4B;EAC5B,SAAS;EACT,0CAA0C;AAC5C;;AAEA;EACE,kCAAkC;EAClC,gCAAgC;EAChC,oCAAoC;EACpC,gCAAgC;EAChC,eAAe;EACf,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA;EACE,kCAAkC;EAClC,cAAc;EACd,gCAAgC;AAClC;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,aAAa;AACf;;AAEA;EACE,WAAW;EACX,YAAY;AACd;;AAEA,wDAAwD;AACxD;EACE,WAAW;EACX,sBAAsB;AACxB;;AAEA;EACE,kCAAkC;EAClC,cAAc;EACd,gCAAgC;AAClC;;AAEA;EACE,8BAA8B;EAC9B,gCAAgC;EAChC,oCAAoC;EACpC,eAAe;EACf,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA,sCAAsC;AACtC;EACE,sBAAsB;EACtB,aAAa;EACb,iBAAiB;AACnB\",\"sourcesContent\":[\"/* ProfileCard.css */\\n/* Uses utilities: .action-button-focus, .btn-primary, .flex-column-center, .text-truncate, .text-center, .text-wrap-anywhere, .section-centered, .btn-transparent */\\n\\n.profileCard {\\n /* Component container */\\n}\\n\\n.image {\\n width: 160px;\\n height: 160px;\\n border-radius: 50%;\\n object-fit: cover;\\n margin-bottom: var(--spacing-sm);\\n box-shadow: var(--box-shadow-sm);\\n border: 3px solid var(--color-primary);\\n background: var(--color-card-bg);\\n box-sizing: border-box;\\n}\\n\\n.image-alt {\\n width: 160px;\\n height: 160px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n border-radius: 50%;\\n margin-bottom: var(--spacing-sm);\\n box-shadow: var(--box-shadow-sm);\\n border: 3px solid var(--color-primary);\\n background: var(--color-card-bg);\\n box-sizing: border-box;\\n color: var(--color-text-secondary);\\n}\\n\\n.name {\\n font-size: var(--font-size-xl);\\n font-weight: 700;\\n line-height: var(--line-height-tight);\\n text-decoration: underline;\\n text-underline-offset: 0.2em;\\n margin: 0;\\n letter-spacing: var(--letter-spacing-wide);\\n}\\n\\n.intro {\\n color: var(--color-text-secondary);\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n margin-bottom: var(--spacing-xs);\\n max-width: 40ch;\\n margin-left: auto;\\n margin-right: auto;\\n}\\n\\n.buttonSection {\\n color: var(--color-text-secondary);\\n font-size: 1em;\\n margin-bottom: var(--spacing-xs);\\n}\\n\\n.buttonSubSection {\\n width: 100%;\\n min-width: 0;\\n display: grid;\\n}\\n\\n.buttonSubSection button {\\n width: 100%;\\n min-width: 0;\\n}\\n\\n/* Ensure prompt inputs stretch to fit their container */\\n.add-friend-button-container input[type=\\\"text\\\"] {\\n width: 100%;\\n box-sizing: border-box;\\n}\\n\\n.qrCodeSection {\\n color: var(--color-text-secondary);\\n font-size: 1em;\\n margin-bottom: var(--spacing-xs);\\n}\\n\\n.details {\\n color: var(--color-text-muted);\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n max-width: 45ch;\\n margin-left: auto;\\n margin-right: auto;\\n}\\n\\n/* ProfileCard styles as regular CSS */\\n.profile-card {\\n border: 1px solid #ccc;\\n padding: 16px;\\n background: white;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileView.css */\n/* Uses utilities: .section-bg, .text-center */\n\n/* Horizontal layout for cards */\n.profile-grid .profileSection {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box;\n margin-bottom: var(--spacing-md);\n box-sizing: border-box;\n margin-bottom: var(--spacing-md);\n overflow-wrap: anywhere;\n}\n\n@media (min-width: 900px) {\n .profile-grid .profileSection {\n margin-bottom: 0;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ProfileView.css\"],\"names\":[],\"mappings\":\"AAAA,oBAAoB;AACpB,8CAA8C;;AAE9C,gCAAgC;AAChC;EACE,WAAW;EACX,eAAe;EACf,YAAY;EACZ,sBAAsB;EACtB,gCAAgC;EAChC,sBAAsB;EACtB,gCAAgC;EAChC,uBAAuB;AACzB;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF\",\"sourcesContent\":[\"/* ProfileView.css */\\n/* Uses utilities: .section-bg, .text-center */\\n\\n/* Horizontal layout for cards */\\n.profile-grid .profileSection {\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n box-sizing: border-box;\\n margin-bottom: var(--spacing-md);\\n box-sizing: border-box;\\n margin-bottom: var(--spacing-md);\\n overflow-wrap: anywhere;\\n}\\n\\n@media (min-width: 900px) {\\n .profile-grid .profileSection {\\n margin-bottom: 0;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* QRCodeCard.css */\n/* Note: Uses utilities: .text-center */\n\n/* Caption under the QR code */\n.qrCaption {\n text-align: center;\n margin-top: 0;\n font-size: 0.95em;\n color: var(--color-text-secondary);\n}\n\n.QRCode {\n width: 100%;\n max-width: 320px;\n min-width: 180px;\n margin: 0 auto;\n display: block;\n}\n\n.QRCode [role=\"img\"]:focus {\n outline: 2px solid var(--color-primary, #7C4DFF);\n outline-offset: 2px;\n box-shadow: 0 0 0 2px rgba(124,77,255,0.2);\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/QRCodeCard.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,uCAAuC;;AAEvC,8BAA8B;AAC9B;EACE,kBAAkB;EAClB,aAAa;EACb,iBAAiB;EACjB,kCAAkC;AACpC;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;EACd,cAAc;AAChB;;AAEA;EACE,gDAAgD;EAChD,mBAAmB;EACnB,0CAA0C;AAC5C\",\"sourcesContent\":[\"/* QRCodeCard.css */\\n/* Note: Uses utilities: .text-center */\\n\\n/* Caption under the QR code */\\n.qrCaption {\\n text-align: center;\\n margin-top: 0;\\n font-size: 0.95em;\\n color: var(--color-text-secondary);\\n}\\n\\n.QRCode {\\n width: 100%;\\n max-width: 320px;\\n min-width: 180px;\\n margin: 0 auto;\\n display: block;\\n}\\n\\n.QRCode [role=\\\"img\\\"]:focus {\\n outline: 2px solid var(--color-primary, #7C4DFF);\\n outline-offset: 2px;\\n box-shadow: 0 0 0 2px rgba(124,77,255,0.2);\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* SocialCard.css */\n/* Uses utilities: .list-reset, .text-wrap-anywhere, .flex, .gap-sm, .gap-lg, .rounded-sm */\n\n.socialList {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--spacing-lg);\n justify-content: center;\n}\n\n.socialItem {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n font-size: 1.1em;\n}\n\n.socialItem span {\n min-width: 0;\n display: block;\n}\n\n.socialItem a {\n color: var(--color-primary);\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n min-height: var(--min-touch-target);\n padding: var(--spacing-xs);\n border-radius: var(--border-radius-base);\n transition: background-color var(--animation-duration) ease;\n position: relative;\n flex: 1;\n min-width: 0;\n}\n\n.socialItem a:hover,\n.socialItem a:focus {\n text-decoration: underline;\n background-color: rgba(124, 77, 255, 0.1);\n}\n\n/* Screen reader only external link indication */\n.socialItem a[href^=\"http\"]:after {\n content: \" (external link)\";\n position: absolute;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n}\n\n.socialIcon {\n width: 2.5em;\n height: 2.5em;\n border-radius: var(--border-radius-base);\n background: var(--color-card-bg);\n flex-shrink: 0;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/SocialCard.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,2FAA2F;;AAE3F;EACE,aAAa;EACb,mBAAmB;EACnB,eAAe;EACf,sBAAsB;EACtB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,2BAA2B;EAC3B,qBAAqB;EACrB,aAAa;EACb,mBAAmB;EACnB,sBAAsB;EACtB,mCAAmC;EACnC,0BAA0B;EAC1B,wCAAwC;EACxC,2DAA2D;EAC3D,kBAAkB;EAClB,OAAO;EACP,YAAY;AACd;;AAEA;;EAEE,0BAA0B;EAC1B,yCAAyC;AAC3C;;AAEA,gDAAgD;AAChD;EACE,2BAA2B;EAC3B,kBAAkB;EAClB,cAAc;EACd,UAAU;EACV,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,aAAa;EACb,wCAAwC;EACxC,gCAAgC;EAChC,cAAc;AAChB\",\"sourcesContent\":[\"/* SocialCard.css */\\n/* Uses utilities: .list-reset, .text-wrap-anywhere, .flex, .gap-sm, .gap-lg, .rounded-sm */\\n\\n.socialList {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap;\\n gap: var(--spacing-lg);\\n justify-content: center;\\n}\\n\\n.socialItem {\\n display: flex;\\n align-items: center;\\n gap: var(--spacing-sm);\\n font-size: 1.1em;\\n}\\n\\n.socialItem span {\\n min-width: 0;\\n display: block;\\n}\\n\\n.socialItem a {\\n color: var(--color-primary);\\n text-decoration: none;\\n display: flex;\\n align-items: center;\\n gap: var(--spacing-sm);\\n min-height: var(--min-touch-target);\\n padding: var(--spacing-xs);\\n border-radius: var(--border-radius-base);\\n transition: background-color var(--animation-duration) ease;\\n position: relative;\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.socialItem a:hover,\\n.socialItem a:focus {\\n text-decoration: underline;\\n background-color: rgba(124, 77, 255, 0.1);\\n}\\n\\n/* Screen reader only external link indication */\\n.socialItem a[href^=\\\"http\\\"]:after {\\n content: \\\" (external link)\\\";\\n position: absolute;\\n left: -10000px;\\n width: 1px;\\n height: 1px;\\n overflow: hidden;\\n}\\n\\n.socialIcon {\\n width: 2.5em;\\n height: 2.5em;\\n border-radius: var(--border-radius-base);\\n background: var(--color-card-bg);\\n flex-shrink: 0;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* StuffCard.css */\n/* Uses utilities: .zebra-stripe */\n\n.stuffTable {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: var(--spacing-md);\n caption-side: top;\n}\n\n.stuffTable caption {\n font-weight: 600;\n padding: var(--spacing-sm);\n text-align: left;\n color: var(--color-text);\n}\n\n.stuffTable th,\n.stuffTable td {\n padding: var(--spacing-sm) var(--spacing-md);\n text-align: left;\n line-height: 1.4;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/StuffCard.css\"],\"names\":[],\"mappings\":\"AAAA,kBAAkB;AAClB,kCAAkC;;AAElC;EACE,WAAW;EACX,yBAAyB;EACzB,gCAAgC;EAChC,iBAAiB;AACnB;;AAEA;EACE,gBAAgB;EAChB,0BAA0B;EAC1B,gBAAgB;EAChB,wBAAwB;AAC1B;;AAEA;;EAEE,4CAA4C;EAC5C,gBAAgB;EAChB,gBAAgB;AAClB\",\"sourcesContent\":[\"/* StuffCard.css */\\n/* Uses utilities: .zebra-stripe */\\n\\n.stuffTable {\\n width: 100%;\\n border-collapse: collapse;\\n margin-bottom: var(--spacing-md);\\n caption-side: top;\\n}\\n\\n.stuffTable caption {\\n font-weight: 600;\\n padding: var(--spacing-sm);\\n text-align: left;\\n color: var(--color-text);\\n}\\n\\n.stuffTable th,\\n.stuffTable td {\\n padding: var(--spacing-sm) var(--spacing-md);\\n text-align: left;\\n line-height: 1.4;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.profile-grid .add-friend-button-container,\n.profile-grid .add-community-button-container {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xxs);\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n/* Ensure the button container can shrink properly in narrow layouts */\n.profile-grid .add-community-button-container {\n min-width: 0;\n max-width: 100%;\n}\n\n/* Allow any direct children to shrink so no element forces overflow */\n.profile-grid .add-community-button-container > * {\n min-width: 0;\n max-width: 100%;\n}\n\n.profile-grid table {\n margin: 0 !important;\n}\n\n.profile-grid td {\n padding: 0;\n}\n\n.profile-grid .add-friend-button-container .span,\n.profile-grid .add-community-button-container .span {\n display: inline-flex;\n align-items: center;\n}\n\n.profile-grid .add-friend-button-container > div,\n.profile-grid .add-community-button-container > div {\n flex-basis: 100%;\n}\n\n/* Prevent the add-community input from overflowing its flex container */\n.profile-grid .add-community-button-container input {\n min-width: 0;\n max-width: 96%;\n flex: 1 1 0;\n word-break: break-word;\n}\n\n.profile-grid .profile-image {\n width: var( --profile-image-size);\n height: var( --profile-image-size);\n margin: var(--spacing-xxxs);\n border-radius: var(--spacing-lg);\n}\n\n.profile-grid .default-profile-image {\n width: 140%;\n height: 140%;\n object-fit: cover;\n margin-left: -0.6em;\n border-radius: var(--spacing-lg);\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/editProfile.css\"],\"names\":[],\"mappings\":\"AAAA;;EAEE,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;EACvB,eAAe;EACf,2BAA2B;AAC7B;;AAEA,sEAAsE;AACtE;EACE,YAAY;EACZ,eAAe;AACjB;;AAEA,sEAAsE;AACtE;EACE,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,oBAAoB;AACtB;;AAEA;EACE,UAAU;AACZ;;AAEA;;EAEE,oBAAoB;EACpB,mBAAmB;AACrB;;AAEA;;EAEE,gBAAgB;AAClB;;AAEA,wEAAwE;AACxE;EACE,YAAY;EACZ,cAAc;EACd,WAAW;EACX,sBAAsB;AACxB;;AAEA;EACE,iCAAiC;EACjC,kCAAkC;EAClC,2BAA2B;EAC3B,gCAAgC;AAClC;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,mBAAmB;EACnB,gCAAgC;AAClC\",\"sourcesContent\":[\".profile-grid .add-friend-button-container,\\n.profile-grid .add-community-button-container {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--spacing-xxs);\\n flex-wrap: wrap;\\n justify-content: flex-start;\\n}\\n\\n/* Ensure the button container can shrink properly in narrow layouts */\\n.profile-grid .add-community-button-container {\\n min-width: 0;\\n max-width: 100%;\\n}\\n\\n/* Allow any direct children to shrink so no element forces overflow */\\n.profile-grid .add-community-button-container > * {\\n min-width: 0;\\n max-width: 100%;\\n}\\n\\n.profile-grid table {\\n margin: 0 !important;\\n}\\n\\n.profile-grid td {\\n padding: 0;\\n}\\n\\n.profile-grid .add-friend-button-container .span,\\n.profile-grid .add-community-button-container .span {\\n display: inline-flex;\\n align-items: center;\\n}\\n\\n.profile-grid .add-friend-button-container > div,\\n.profile-grid .add-community-button-container > div {\\n flex-basis: 100%;\\n}\\n\\n/* Prevent the add-community input from overflowing its flex container */\\n.profile-grid .add-community-button-container input {\\n min-width: 0;\\n max-width: 96%;\\n flex: 1 1 0;\\n word-break: break-word;\\n}\\n\\n.profile-grid .profile-image {\\n width: var( --profile-image-size);\\n height: var( --profile-image-size);\\n margin: var(--spacing-xxxs);\\n border-radius: var(--spacing-lg);\\n}\\n\\n.profile-grid .default-profile-image {\\n width: 140%;\\n height: 140%;\\n object-fit: cover;\\n margin-left: -0.6em;\\n border-radius: var(--spacing-lg);\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Delete pop up*/\n/* Make the Solid-UI delete confirmation popup appear near the last click position.\n Keep the built-in Solid-UI styling (orange border, white background) so it looks like the original.\n*/\n.profile-grid div[style*=\"position: relative\"] > div[style*=\"display: grid\"] {\n/* only override positioning; keep styling (border/background/etc) from solid-ui */\n position: absolute !important;\n z-index: 9999 !important;\n top: 0 !important;\n right: 0 !important;\n left: auto !important;\n display: grid !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n visibility: visible !important;\n padding: 0.7em !important;\n min-width: 280px !important;\n max-width: 90vw !important;\n background: var(--color-background) !important;\n border: 0.1em solid var(--color-primary) !important;\n border-radius: var(--border-radius-base) !important;\n box-shadow: 0 0.5em 0.9em rgba(0, 0, 0, 0.2) !important;\n grid-template-columns: auto auto !important;\n gap: 0.3em !important;\n}\n\n/* Ensure SVG icons and their buttons inside the Solid-UI delete popup have transparent backgrounds */\n.profile-grid div[style*=\"position: relative\"] > div[style*=\"display: grid\"] img[src\\$=\".svg\"],\n.profile-grid div[style*=\"position: relative\"] > div[style*=\"display: grid\"] button {\n background: transparent !important;\n}\n\n.profile-form .individualPane {\n box-shadow: none !important;\n}\n\n.profile-form p {\n padding: 0 !important;\n}\n\n.profile-form .mb-md {\n margin-bottom: 0 !important;\n}\n\n.profile-form h2 {\n margin-bottom: 1em !important;\n}\n\n.profile-form h3 {\n color: var(--color-primary) !important;\n padding: 0 !important;\n font-size: 1em !important;\n font-weight: 600 !important;\n}\n\n/* Shared form layout rules are imported from rdfFormsCommon.css */\n/* Solid-UI form sizing fixes scoped to Edit CV section */\n.profile-form .hoverControl:not(:has(> img:first-child)) {\n border: 0.1em solid rgb(136, 136, 136) !important;\n flex-direction: column !important;\n}\n\n.profile-form .hoverControl:has(> img:first-child) {\n background-color: transparent !important;\n border: none !important;\n margin: 0 !important;\n border-radius: 0 !important;\n padding: 0.7em !important;\n min-height: var(--min-touch-target);\n min-width: var(--min-touch-target);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Make sure the delete icon floats in the top-right corner of the full hoverControl wrapper */\n.profile-form .hoverControl,\n.profile-grid .hoverControl {\n position: relative !important;\n}\n\n.profile-grid .hoverControl > img.hoverControlHide,\n.profile-grid .hoverControl > [data-testid=\"deleteButtonWithCheck\"] {\n position: absolute !important;\n top: 0.2em !important;\n right: 0.2em !important;\n width: 1.5em !important;\n height: 1.5em !important;\n align-items: center;\n justify-content: center;\n margin: 0 !important;\n float: none !important;\n transform: none !important;\n}\n\n/* When icon is 2nd or 3rd child (i.e. sibling elements exist), align it vertically to the previous item */\n.profile-grid .hoverControl > img.hoverControlHide:nth-child(1),\n.profile-grid .hoverControl > img.hoverControlHide:nth-child(2),\n.profile-grid .hoverControl > [data-testid=\"deleteButtonWithCheck\"]:nth-child(1),\n.profile-grid .hoverControl > [data-testid=\"deleteButtonWithCheck\"]:nth-child(2) {\n top: 50% !important;\n transform: translateY(-50%) !important;\n display: inline-flex !important;\n}\n\n/* Show the delete icon only when the container is hovered */\n.profile-grid .hoverControl:hover > img.hoverControlHide,\n.profile-grid .hoverControl:hover > [data-testid=\"deleteButtonWithCheck\"] {\n display: inline-flex !important;\n}\n\n/* Also show the delete icon when the entire row is hovered */\n.profile-grid .attachmentTable tr:hover .hoverControl > img.hoverControlHide,\n.profile-grid .attachmentTable tr:hover .hoverControl > [data-testid=\"deleteButtonWithCheck\"] {\n display: inline-flex !important;\n}\n\n/* Make the hover-control cell easier to hit */\n.profile-grid .hoverControl {\n padding: 0.75em !important;\n min-width: 2.5em !important;\n min-height: 2.5em !important;\n}\n\n/* When the hoverControl only contains the hidden delete icon, keep it out of layout so it doesn't create empty space */\n.profile-form .formFieldValue .hoverControl:has(> img.hoverControlHide) {\n min-width: 0 !important;\n min-height: 0 !important;\n width: 0 !important;\n height: 0 !important;\n padding: 0 !important;\n margin: 0 !important;\n overflow: visible !important;\n}\n\n/* Hide delete icon only in autocomplete fields */\n.profile-grid .formFieldValue:has(input[data-testid=\"autocomplete-input\"]) [data-testid=\"delete-button\"] {\n display: none !important;\n}\n\n/* Keep autocomplete cancel button hidden when the user is not interacting.\n This avoids the cancel button remaining visible when focus moves away. */\n.profile-grid .formFieldValue:not(:focus-within) [data-testid=\"cancel-button\"] {\n display: none !important;\n}\n\n.profile-grid .hoverControl:has(> img:first-child) > span {\n display: inline-flex;\n align-items: center;\n margin-left: 0.3em;\n}\n\n.profile-grid div[style*=\"padding: 0.5em\"]:has(> img) > span {\n margin-left: 0.3em;\n vertical-align: super !important;\n}\n\n.profile-grid .hoverControl:has(> img:first-child):hover {\n background-color: transparent !important;\n}\n\n.profile-grid button:has(> img[src\\$=\".svg\"]),\n.profile-grid .formFieldValue input[type =\"color\"] {\n background-color: var(--color-section-bg) !important;\n border: none !important;\n margin: 0 !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n padding: 0.5em !important;\n transition: background-color 0.2s ease, box-shadow 0.2s ease;\n padding: 0 !important;\n}\n\n/* Specific icon button should have no extra padding */\n.profile-grid button:has(> img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_1369241.svg\"]) {\n padding: 0 !important;\n}\n\n.profile-form button {\n min-height: var(--min-touch-target);\n min-width: var(--min-touch-target);\n}\n\n.profile-form input:not([type=\"color\"]) {\n width: 99%;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.profile-form input:not([type=\"color\"]),\n.profile-form textarea,\n.profile-form select {\n max-width: 96%;\n min-width: 0;\n box-sizing: border-box ;\n font: inherit;\n color: var(--color-text);\n background-color: var(--color-card-bg) !important;\n border: 1px solid var(--color-border-pale);\n}\n\n.profile-form textarea {\n border-color: var(--color-border-pale) !important;\n}\n\n.profile-form input[type=\"date\"],\n.profile-form input[type=\"month\"],\n.profile-form input[type=\"week\"],\n.profile-form input[type=\"time\"],\n.profile-form input[type=\"datetime-local\"] {\n min-height: var(--min-touch-target);\n}\n\n.profile-form .hoverControl:has(> img:first-child):focus-visible,\n.profile-form button:focus-visible,\n.profile-form input:not([type=\"color\"]):focus-visible,\n.profile-form textarea:focus-visible,\n.profile-form select:focus-visible {\n outline: var(--focus-ring-width) solid var(--color-primary) !important;\n outline-offset: 2px;\n box-shadow: 0 0 0 1px var(--color-background);\n}\n\n.profile-form input[type=\"url\"] {\n width: 100%;\n}\n\n.profile-form select#formSelect {\n width: 100%;\n max-width: 97%;\n box-sizing: border-box;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n/* Remove border/padding from the first wrapper div (and its first child wrapper). */\n.profile-form > div:first-of-type,\n.profile-form > div:first-of-type > div:first-of-type {\n border: none !important;\n padding: 0 !important;\n}\n\n/* Remove border/padding from the inner div of the first wrapper in the contact section. */\nsection[aria-labelledby=\"edit-profile-contact-heading\"] .profile-form > div:first-of-type > div:first-of-type {\n border: none !important;\n padding: 0 !important;\n}\n\n/* In contactPane, remove border/padding from all direct child divs. */\n.contactPane > div {\n border: none !important;\n padding: 0 !important;\n}\n\n/* Align schema.org, solid terms, FOAF, vCard, and org field labels with their input values. */\n.profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) {\n display: flex;\n}\n\n/* for the Resume inside corporation choice */\n/* Add space between classifierBox label and select box */\n.profile-form .choiceBox .classifierBox-label {\n /* Optional: ensure label doesn't have extra margin */\n margin-right: 0;\n padding-left: 0.3em;\n}\n.profile-form .choiceBox .choiceBox-selectBox select {\n margin-left: 2.1em !important;\n}\n\n/* for the Resume orga details */\n/* Add space between classifierBox label and select box */\n.profile-form .classifierBox .classifierBox-label {\n /* Match .formFieldName for alignment */\n margin-right: 0;\n padding-left: 0.3em;\n width: 8em;\n padding: 0.3em;\n vertical-align: middle;\n}\n.profile-form .classifierBox .classifierBox-selectBox {\n margin-left: 0 !important;\n}\n\n.profile-form .classifierBox .classifierBox-selectBox select {\n margin-left: 0 !important;\n}\n\n/* for the social media */\n/* Add space between classifierBox label and select box */\n.profile-grid section[data-testid=\"edit-social-section\"] .classifierBox-label {\n /* Optional: ensure label doesn't have extra margin */\n margin-right: 0;\n padding-left: 0.3em;\n}\n.profile-grid section[data-testid=\"edit-social-section\"] .classifierBox-selectBox select {\n margin-left: 0.7em !important;\n}\n\n.profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue {\n margin-bottom: 0;\n}\n\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]),\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]),\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]),\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]),\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/org#\"]) {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n}\n\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]) + .formFieldValue,\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]) + .formFieldValue,\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]) + .formFieldValue,\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]) + .formFieldValue,\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/org#\"]) + .formFieldValue {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n flex: 1;\n min-width: 0;\n}\n\n.profile-form textarea,\n.profile-form .formFieldValue textarea {\n appearance: none;\n -webkit-appearance: none;\n border: .05em solid #88c !important;\n border-style: solid !important;\n border-width: .05em !important;\n border-color: #88c !important;\n border-radius: 0.2em !important;\n width: 99%;\n box-sizing: border-box;\n margin-top: var(--spacing-xs);\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n/* Add horizontal gap between label and textarea for all label+textarea pairs. */\n.profile-form div:has(> a) + div:has(textarea) {\n margin-left: var(--spacing-sm);\n}\n\n/* Center textarea label vertically in flex rows. */\n.profile-form div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea) {\n align-items: flex-start;\n}\n\n.profile-form div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea) > div:has(> a) {\n padding-left: var(--spacing-xs);\n padding-top: var(--spacing-sm);\n}\n\n\n.profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) > .formFieldName {\n padding-top: 0.55em !important;\n}\n\n\n.profile-form input:disabled,\n.profile-form textarea:disabled,\n.profile-form select:disabled,\n.profile-form input[readonly],\n.profile-form textarea[readonly],\n.profile-form input:read-only,\n.profile-form textarea:read-only {\n background-color: var(--color-background) !important;\n cursor: not-allowed;\n opacity: 0.75;\n border: 0.05em solid white !important;\n}\n\n.webidControl table td div.contactPane.namedPane {\n border: none !important;\n}\n\n/* Hide the edit icon used by solid-ui (noun_253504.svg and noun_1180158.svg) when it appears as an <img> */\n.profile-form img[src*=\"noun_253504.svg\"],\n.profile-form img[src*=\"noun_1180158.svg\"],\n.webidControl img[src*=\"noun_253504.svg\"],\n.webidControl img[src*=\"noun_1180158.svg\"] {\n display: none !important;\n width: 0 !important;\n height: 0 !important;\n margin: 0 !important;\n padding: 0 !important;\n}\n\n/* Ensure the parent button for that icon doesn't add padding/margin or affect layout */\n.profile-form button:has(> img[src*=\"noun_253504.svg\"]),\n.profile-form button:has(> img[src*=\"noun_1180158.svg\"]),\n.webidControl button:has(> img[src*=\"noun_253504.svg\"]),\n.webidControl button:has(> img[src*=\"noun_1180158.svg\"]) {\n display: none !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n background: none !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n}\n\n/* Exceptions: allow these icons (and their buttons) when they're part of the add-friend or add-community flows. */\n.profile-grid .profileSection .add-friend-button-container img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\"],\n.profile-grid .profileSection .add-community-button-container img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\"],\n.profile-grid .profileSection .add-friend-button-container button:has(> img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\"]),\n.profile-grid .profileSection .add-community-button-container button:has(> img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\"]) {\n display: inline-flex !important;\n width: auto !important;\n height: auto !important;\n overflow: visible !important;\n}\n\n\n/* Exception: allow “Continue” buttons inside add-friend and add-community button containers. */\n.profile-grid .profileSection .add-friend-button-container button:has(> img[title=\"Continue\"]),\n.profile-grid .profileSection .add-community-button-container button:has(> img[title=\"Continue\"]),\n.profile-grid .profileSection .add-friend-button-container button:has(> img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\"]),\n.profile-grid .profileSection .add-community-button-container button:has(> img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\"]),\n.profile-grid .profileSection .add-friend-button-container img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\"],\n.profile-grid .profileSection .add-community-button-container img[src=\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\"] {\n display: inline-flex !important;\n width: 2em !important;\n height: 2em !important;\n overflow: visible !important;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/profileRDFFormsEnforced.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/* Delete pop up*/\\n/* Make the Solid-UI delete confirmation popup appear near the last click position.\\n Keep the built-in Solid-UI styling (orange border, white background) so it looks like the original.\\n*/\\n.profile-grid div[style*=\\\"position: relative\\\"] > div[style*=\\\"display: grid\\\"] {\\n/* only override positioning; keep styling (border/background/etc) from solid-ui */\\n position: absolute !important;\\n z-index: 9999 !important;\\n top: 0 !important;\\n right: 0 !important;\\n left: auto !important;\\n display: grid !important;\\n pointer-events: auto !important;\\n opacity: 1 !important;\\n visibility: visible !important;\\n padding: 0.7em !important;\\n min-width: 280px !important;\\n max-width: 90vw !important;\\n background: var(--color-background) !important;\\n border: 0.1em solid var(--color-primary) !important;\\n border-radius: var(--border-radius-base) !important;\\n box-shadow: 0 0.5em 0.9em rgba(0, 0, 0, 0.2) !important;\\n grid-template-columns: auto auto !important;\\n gap: 0.3em !important;\\n}\\n\\n/* Ensure SVG icons and their buttons inside the Solid-UI delete popup have transparent backgrounds */\\n.profile-grid div[style*=\\\"position: relative\\\"] > div[style*=\\\"display: grid\\\"] img[src$=\\\".svg\\\"],\\n.profile-grid div[style*=\\\"position: relative\\\"] > div[style*=\\\"display: grid\\\"] button {\\n background: transparent !important;\\n}\\n\\n.profile-form .individualPane {\\n box-shadow: none !important;\\n}\\n\\n.profile-form p {\\n padding: 0 !important;\\n}\\n\\n.profile-form .mb-md {\\n margin-bottom: 0 !important;\\n}\\n\\n.profile-form h2 {\\n margin-bottom: 1em !important;\\n}\\n\\n.profile-form h3 {\\n color: var(--color-primary) !important;\\n padding: 0 !important;\\n font-size: 1em !important;\\n font-weight: 600 !important;\\n}\\n\\n/* Shared form layout rules are imported from rdfFormsCommon.css */\\n/* Solid-UI form sizing fixes scoped to Edit CV section */\\n.profile-form .hoverControl:not(:has(> img:first-child)) {\\n border: 0.1em solid rgb(136, 136, 136) !important;\\n flex-direction: column !important;\\n}\\n\\n.profile-form .hoverControl:has(> img:first-child) {\\n background-color: transparent !important;\\n border: none !important;\\n margin: 0 !important;\\n border-radius: 0 !important;\\n padding: 0.7em !important;\\n min-height: var(--min-touch-target);\\n min-width: var(--min-touch-target);\\n cursor: pointer;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n/* Make sure the delete icon floats in the top-right corner of the full hoverControl wrapper */\\n.profile-form .hoverControl,\\n.profile-grid .hoverControl {\\n position: relative !important;\\n}\\n\\n.profile-grid .hoverControl > img.hoverControlHide,\\n.profile-grid .hoverControl > [data-testid=\\\"deleteButtonWithCheck\\\"] {\\n position: absolute !important;\\n top: 0.2em !important;\\n right: 0.2em !important;\\n width: 1.5em !important;\\n height: 1.5em !important;\\n align-items: center;\\n justify-content: center;\\n margin: 0 !important;\\n float: none !important;\\n transform: none !important;\\n}\\n\\n/* When icon is 2nd or 3rd child (i.e. sibling elements exist), align it vertically to the previous item */\\n.profile-grid .hoverControl > img.hoverControlHide:nth-child(1),\\n.profile-grid .hoverControl > img.hoverControlHide:nth-child(2),\\n.profile-grid .hoverControl > [data-testid=\\\"deleteButtonWithCheck\\\"]:nth-child(1),\\n.profile-grid .hoverControl > [data-testid=\\\"deleteButtonWithCheck\\\"]:nth-child(2) {\\n top: 50% !important;\\n transform: translateY(-50%) !important;\\n display: inline-flex !important;\\n}\\n\\n/* Show the delete icon only when the container is hovered */\\n.profile-grid .hoverControl:hover > img.hoverControlHide,\\n.profile-grid .hoverControl:hover > [data-testid=\\\"deleteButtonWithCheck\\\"] {\\n display: inline-flex !important;\\n}\\n\\n/* Also show the delete icon when the entire row is hovered */\\n.profile-grid .attachmentTable tr:hover .hoverControl > img.hoverControlHide,\\n.profile-grid .attachmentTable tr:hover .hoverControl > [data-testid=\\\"deleteButtonWithCheck\\\"] {\\n display: inline-flex !important;\\n}\\n\\n/* Make the hover-control cell easier to hit */\\n.profile-grid .hoverControl {\\n padding: 0.75em !important;\\n min-width: 2.5em !important;\\n min-height: 2.5em !important;\\n}\\n\\n/* When the hoverControl only contains the hidden delete icon, keep it out of layout so it doesn't create empty space */\\n.profile-form .formFieldValue .hoverControl:has(> img.hoverControlHide) {\\n min-width: 0 !important;\\n min-height: 0 !important;\\n width: 0 !important;\\n height: 0 !important;\\n padding: 0 !important;\\n margin: 0 !important;\\n overflow: visible !important;\\n}\\n\\n/* Hide delete icon only in autocomplete fields */\\n.profile-grid .formFieldValue:has(input[data-testid=\\\"autocomplete-input\\\"]) [data-testid=\\\"delete-button\\\"] {\\n display: none !important;\\n}\\n\\n/* Keep autocomplete cancel button hidden when the user is not interacting.\\n This avoids the cancel button remaining visible when focus moves away. */\\n.profile-grid .formFieldValue:not(:focus-within) [data-testid=\\\"cancel-button\\\"] {\\n display: none !important;\\n}\\n\\n.profile-grid .hoverControl:has(> img:first-child) > span {\\n display: inline-flex;\\n align-items: center;\\n margin-left: 0.3em;\\n}\\n\\n.profile-grid div[style*=\\\"padding: 0.5em\\\"]:has(> img) > span {\\n margin-left: 0.3em;\\n vertical-align: super !important;\\n}\\n\\n.profile-grid .hoverControl:has(> img:first-child):hover {\\n background-color: transparent !important;\\n}\\n\\n.profile-grid button:has(> img[src$=\\\".svg\\\"]),\\n.profile-grid .formFieldValue input[type =\\\"color\\\"] {\\n background-color: var(--color-section-bg) !important;\\n border: none !important;\\n margin: 0 !important;\\n border-radius: 0 !important;\\n box-shadow: none !important;\\n padding: 0.5em !important;\\n transition: background-color 0.2s ease, box-shadow 0.2s ease;\\n padding: 0 !important;\\n}\\n\\n/* Specific icon button should have no extra padding */\\n.profile-grid button:has(> img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_1369241.svg\\\"]) {\\n padding: 0 !important;\\n}\\n\\n.profile-form button {\\n min-height: var(--min-touch-target);\\n min-width: var(--min-touch-target);\\n}\\n\\n.profile-form input:not([type=\\\"color\\\"]) {\\n width: 99%;\\n margin-left: 0 !important;\\n margin-right: 0 !important;\\n}\\n\\n.profile-form input:not([type=\\\"color\\\"]),\\n.profile-form textarea,\\n.profile-form select {\\n max-width: 96%;\\n min-width: 0;\\n box-sizing: border-box ;\\n font: inherit;\\n color: var(--color-text);\\n background-color: var(--color-card-bg) !important;\\n border: 1px solid var(--color-border-pale);\\n}\\n\\n.profile-form textarea {\\n border-color: var(--color-border-pale) !important;\\n}\\n\\n.profile-form input[type=\\\"date\\\"],\\n.profile-form input[type=\\\"month\\\"],\\n.profile-form input[type=\\\"week\\\"],\\n.profile-form input[type=\\\"time\\\"],\\n.profile-form input[type=\\\"datetime-local\\\"] {\\n min-height: var(--min-touch-target);\\n}\\n\\n.profile-form .hoverControl:has(> img:first-child):focus-visible,\\n.profile-form button:focus-visible,\\n.profile-form input:not([type=\\\"color\\\"]):focus-visible,\\n.profile-form textarea:focus-visible,\\n.profile-form select:focus-visible {\\n outline: var(--focus-ring-width) solid var(--color-primary) !important;\\n outline-offset: 2px;\\n box-shadow: 0 0 0 1px var(--color-background);\\n}\\n\\n.profile-form input[type=\\\"url\\\"] {\\n width: 100%;\\n}\\n\\n.profile-form select#formSelect {\\n width: 100%;\\n max-width: 97%;\\n box-sizing: border-box;\\n margin-left: 0 !important;\\n margin-right: 0 !important;\\n}\\n\\n/* Remove border/padding from the first wrapper div (and its first child wrapper). */\\n.profile-form > div:first-of-type,\\n.profile-form > div:first-of-type > div:first-of-type {\\n border: none !important;\\n padding: 0 !important;\\n}\\n\\n/* Remove border/padding from the inner div of the first wrapper in the contact section. */\\nsection[aria-labelledby=\\\"edit-profile-contact-heading\\\"] .profile-form > div:first-of-type > div:first-of-type {\\n border: none !important;\\n padding: 0 !important;\\n}\\n\\n/* In contactPane, remove border/padding from all direct child divs. */\\n.contactPane > div {\\n border: none !important;\\n padding: 0 !important;\\n}\\n\\n/* Align schema.org, solid terms, FOAF, vCard, and org field labels with their input values. */\\n.profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) {\\n display: flex;\\n}\\n\\n/* for the Resume inside corporation choice */\\n/* Add space between classifierBox label and select box */\\n.profile-form .choiceBox .classifierBox-label {\\n /* Optional: ensure label doesn't have extra margin */\\n margin-right: 0;\\n padding-left: 0.3em;\\n}\\n.profile-form .choiceBox .choiceBox-selectBox select {\\n margin-left: 2.1em !important;\\n}\\n\\n/* for the Resume orga details */\\n/* Add space between classifierBox label and select box */\\n.profile-form .classifierBox .classifierBox-label {\\n /* Match .formFieldName for alignment */\\n margin-right: 0;\\n padding-left: 0.3em;\\n width: 8em;\\n padding: 0.3em;\\n vertical-align: middle;\\n}\\n.profile-form .classifierBox .classifierBox-selectBox {\\n margin-left: 0 !important;\\n}\\n\\n.profile-form .classifierBox .classifierBox-selectBox select {\\n margin-left: 0 !important;\\n}\\n\\n/* for the social media */\\n/* Add space between classifierBox label and select box */\\n.profile-grid section[data-testid=\\\"edit-social-section\\\"] .classifierBox-label {\\n /* Optional: ensure label doesn't have extra margin */\\n margin-right: 0;\\n padding-left: 0.3em;\\n}\\n.profile-grid section[data-testid=\\\"edit-social-section\\\"] .classifierBox-selectBox select {\\n margin-left: 0.7em !important;\\n}\\n\\n.profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue {\\n margin-bottom: 0;\\n}\\n\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://schema.org/\\\"]),\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://www.w3.org/ns/solid/terms#\\\"]),\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://xmlns.com/foaf/0.1/\\\"]),\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://www.w3.org/2006/vcard/ns\\\"]),\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://www.w3.org/ns/org#\\\"]) {\\n display: inline-flex;\\n align-items: center;\\n vertical-align: middle;\\n}\\n\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://schema.org/\\\"]) + .formFieldValue,\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://www.w3.org/ns/solid/terms#\\\"]) + .formFieldValue,\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://xmlns.com/foaf/0.1/\\\"]) + .formFieldValue,\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://www.w3.org/2006/vcard/ns\\\"]) + .formFieldValue,\\n.profile-form :not(.choiceBox) > .formFieldName:has(a[href*=\\\"http://www.w3.org/ns/org#\\\"]) + .formFieldValue {\\n display: inline-flex;\\n align-items: center;\\n vertical-align: middle;\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.profile-form textarea,\\n.profile-form .formFieldValue textarea {\\n appearance: none;\\n -webkit-appearance: none;\\n border: .05em solid #88c !important;\\n border-style: solid !important;\\n border-width: .05em !important;\\n border-color: #88c !important;\\n border-radius: 0.2em !important;\\n width: 99%;\\n box-sizing: border-box;\\n margin-top: var(--spacing-xs);\\n margin-left: 0 !important;\\n margin-right: 0 !important;\\n}\\n\\n/* Add horizontal gap between label and textarea for all label+textarea pairs. */\\n.profile-form div:has(> a) + div:has(textarea) {\\n margin-left: var(--spacing-sm);\\n}\\n\\n/* Center textarea label vertically in flex rows. */\\n.profile-form div[style*=\\\"display: flex\\\"][style*=\\\"flex-direction: row\\\"]:has(textarea) {\\n align-items: flex-start;\\n}\\n\\n.profile-form div[style*=\\\"display: flex\\\"][style*=\\\"flex-direction: row\\\"]:has(textarea) > div:has(> a) {\\n padding-left: var(--spacing-xs);\\n padding-top: var(--spacing-sm);\\n}\\n\\n\\n.profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid=\\\"autocomplete-input\\\"]) > .formFieldName {\\n padding-top: 0.55em !important;\\n}\\n\\n\\n.profile-form input:disabled,\\n.profile-form textarea:disabled,\\n.profile-form select:disabled,\\n.profile-form input[readonly],\\n.profile-form textarea[readonly],\\n.profile-form input:read-only,\\n.profile-form textarea:read-only {\\n background-color: var(--color-background) !important;\\n cursor: not-allowed;\\n opacity: 0.75;\\n border: 0.05em solid white !important;\\n}\\n\\n.webidControl table td div.contactPane.namedPane {\\n border: none !important;\\n}\\n\\n/* Hide the edit icon used by solid-ui (noun_253504.svg and noun_1180158.svg) when it appears as an <img> */\\n.profile-form img[src*=\\\"noun_253504.svg\\\"],\\n.profile-form img[src*=\\\"noun_1180158.svg\\\"],\\n.webidControl img[src*=\\\"noun_253504.svg\\\"],\\n.webidControl img[src*=\\\"noun_1180158.svg\\\"] {\\n display: none !important;\\n width: 0 !important;\\n height: 0 !important;\\n margin: 0 !important;\\n padding: 0 !important;\\n}\\n\\n/* Ensure the parent button for that icon doesn't add padding/margin or affect layout */\\n.profile-form button:has(> img[src*=\\\"noun_253504.svg\\\"]),\\n.profile-form button:has(> img[src*=\\\"noun_1180158.svg\\\"]),\\n.webidControl button:has(> img[src*=\\\"noun_253504.svg\\\"]),\\n.webidControl button:has(> img[src*=\\\"noun_1180158.svg\\\"]) {\\n display: none !important;\\n padding: 0 !important;\\n margin: 0 !important;\\n border: none !important;\\n background: none !important;\\n width: 0 !important;\\n height: 0 !important;\\n overflow: hidden !important;\\n}\\n\\n/* Exceptions: allow these icons (and their buttons) when they're part of the add-friend or add-community flows. */\\n.profile-grid .profileSection .add-friend-button-container img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\\\"],\\n.profile-grid .profileSection .add-community-button-container img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\\\"],\\n.profile-grid .profileSection .add-friend-button-container button:has(> img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\\\"]),\\n.profile-grid .profileSection .add-community-button-container button:has(> img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_253504.svg\\\"]) {\\n display: inline-flex !important;\\n width: auto !important;\\n height: auto !important;\\n overflow: visible !important;\\n}\\n\\n\\n/* Exception: allow “Continue” buttons inside add-friend and add-community button containers. */\\n.profile-grid .profileSection .add-friend-button-container button:has(> img[title=\\\"Continue\\\"]),\\n.profile-grid .profileSection .add-community-button-container button:has(> img[title=\\\"Continue\\\"]),\\n.profile-grid .profileSection .add-friend-button-container button:has(> img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\\\"]),\\n.profile-grid .profileSection .add-community-button-container button:has(> img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\\\"]),\\n.profile-grid .profileSection .add-friend-button-container img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\\\"],\\n.profile-grid .profileSection .add-community-button-container img[src=\\\"https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg\\\"] {\\n display: inline-flex !important;\\n width: 2em !important;\\n height: 2em !important;\\n overflow: visible !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layout, spacing, and responsiveness */\n\n:root {\n --profile-image-size: 3em;\n}\n\n@media (max-width: 1000px) {\n .profile-grid,\n .profile-grid * {\n font-size: 2rem !important;\n }\n\n .profile-grid .actionButton,\n .profile-grid .searchInput,\n .profile-grid .flatButton,\n .profile-grid .buttonSection button,\n .profile-grid .groupButtonsList button {\n min-height: calc(var(--min-touch-target) + 0.5em) !important;\n font-size: 2rem !important;\n padding: 1em 1em !important;\n }\n}\n\n.actionButton {\n width: 100%;\n min-width: 180px;\n max-width: 320px;\n box-sizing: border-box;\n display: inline-block;\n}\n\n/* ===========================================\n PROFILE GRID LAYOUT\n =========================================== */\n\n.profile-grid {\n display: grid;\n /* Allow the grid to shrink below 30em on small viewports to avoid overflow */\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 30em), 1fr));\n gap: var(--spacing-lg);\n background: var(--color-background);\n}\n\n.profile-header,\n.profile-footer {\n grid-column: 1 / -1;\n}\n\n.center {\n justify-content: center;\n align-items: center;\n}\n\n.flex {\n display: flex;\n}\n.grid {\n display: grid;\n}\n\n/* Spacing utilities using CSS variables */\n.gap-xs { gap: var(--spacing-xs); }\n.gap-sm { gap: var(--spacing-sm); }\n.gap-md { gap: var(--spacing-md); }\n.gap-lg { gap: var(--spacing-lg); }\n.gap-xl { gap: var(--spacing-xl); }\n\n.mt-xs { margin-top: var(--spacing-xs); }\n.mt-sm { margin-top: var(--spacing-sm); }\n.mt-md { margin-top: var(--spacing-md); }\n.mt-lg { margin-top: var(--spacing-lg); }\n\n.mb-xs { margin-bottom: var(--spacing-xs); }\n.mb-sm { margin-bottom: var(--spacing-sm); }\n.mb-md { margin-bottom: var(--spacing-md); }\n.mb-lg { margin-bottom: var(--spacing-lg); }\n\n.p-xs { padding: var(--spacing-xs); }\n.p-sm { padding: var(--spacing-sm); }\n.p-md { padding: var(--spacing-md); }\n.p-lg { padding: var(--spacing-lg); }\n\n.rounded { border-radius: var(--border-radius-full); }\n.rounded-sm { border-radius: var(--border-radius-base); }\n\n.shadow { box-shadow: var(--box-shadow); }\n.shadow-sm { box-shadow: var(--box-shadow-sm); }\n\n.bg-primary {\n background: var(--color-primary);\n color: #fff;\n}\n.bg-card {\n background: var(--color-card-bg);\n}\n\n/* Accessibility utilities */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.min-touch-target {\n min-height: var(--min-touch-target);\n min-width: var(--min-touch-target);\n}\n\n/* Enhanced accessibility utilities */\n.visually-hidden {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n.visually-hidden.focusable:focus,\n.visually-hidden.focusable:active {\n position: static !important;\n width: auto !important;\n height: auto !important;\n padding: inherit !important;\n margin: inherit !important;\n overflow: visible !important;\n clip: auto !important;\n white-space: inherit !important;\n}\n\n/* Skip links utility */\n.skip-links {\n position: absolute;\n top: -100px;\n left: 0;\n z-index: 1000;\n}\n\n.skip-links a {\n position: absolute;\n left: 6px;\n top: 6px;\n padding: var(--spacing-sm);\n background: var(--color-primary);\n color: white;\n text-decoration: none;\n border-radius: var(--border-radius-base);\n}\n\n.skip-links a:focus {\n top: 6px;\n}\n\n.reduced-motion {\n animation: none !important;\n transition: none !important;\n}\n\n/* Focus management */\n.focus-ring {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.no-focus-ring {\n outline: none;\n}\n\n.no-focus-ring:focus-visible {\n outline: none;\n box-shadow: none;\n}\n\n/* ARIA live regions */\n.live-region {\n position: absolute;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n}\n\n/* Note: Use aria-live=\"polite\" or aria-live=\"assertive\" HTML attributes with .live-region */\n\n/* Text scaling utilities */\n.text-scale-friendly {\n line-height: 1.5;\n max-width: 70ch; /* Optimal reading length */\n}\n\n/* Text accessibility utilities */\n.text-readable {\n line-height: var(--line-height-base);\n max-width: 65ch;\n}\n\n.text-lg {\n font-size: var(--font-size-lg);\n line-height: var(--line-height-base);\n}\n\n.text-small {\n font-size: max(var(--font-size-sm), var(--min-font-size));\n line-height: var(--min-line-height);\n}\n\n.text-contrast-high {\n color: var(--color-text);\n font-weight: 600;\n}\n\n:focus-visible {\n outline: var(--focus-ring-width) solid var(--color-primary);\n outline-offset: 2px;\n box-shadow: 0 0 0 1px var(--color-background);\n}\n\n:focus:not(:focus-visible) {\n outline: none;\n box-shadow: none;\n}\n\n/* Prevent labels from appearing focusable to keyboard users. */\nlabel:focus,\nlabel:focus-visible {\n outline: none !important;\n box-shadow: none !important;\n}\n\n/* Better focus for text elements */\n.focusable-text:focus {\n background-color: rgba(124, 77, 255, 0.1);\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n\n/* High contrast text */\n.high-contrast {\n color: var(--color-text);\n background: var(--color-background);\n border: 1px solid var(--color-border-pale);\n}\n\n/* ===========================================\n CONSOLIDATED COMPONENT PATTERNS\n =========================================== */\n\n/* Primary Button - used by ChatWithMe, ProfileCard */\n.btn-primary {\n min-height: var(--min-touch-target);\n padding: var(--spacing-sm) var(--spacing-md);\n border: 1px solid var(--color-primary);\n border-radius: var(--border-radius-base);\n background: var(--color-primary);\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n}\n\n.btn-primary:hover {\n background: color-mix(in srgb, var(--color-primary) 90%, black);\n box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);\n}\n\n.btn-primary:active {\n box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);\n}\n\n.btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n/* Action Button Focus - used by ChatWithMe, ProfileCard */\n.action-button-focus:focus,\n.action-button-focus:focus-visible {\n outline: 3px solid var(--color-primary) !important;\n outline-offset: 2px !important;\n box-shadow: 0 0 0 2px var(--color-background), 0 0 0 5px rgba(124, 77, 255, 0.25) !important;\n z-index: 1;\n}\n\n/* List Reset - used by FriendList, SocialCard, nav */\n.list-reset {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\n/* Zebra Striping - used by FriendList, StuffCard tables */\n.zebra-stripe tr:nth-child(even),\n.zebra-stripe > *:nth-child(even) {\n background-color: rgba(0, 0, 0, 0.02);\n}\n\n/* Section Title - primary colored heading */\n.section-title {\n font-size: 1.25em;\n font-weight: 600;\n color: var(--color-primary);\n margin: 0;\n}\n\n/* Text Overflow - used by ProfileCard, SocialCard */\n.text-truncate {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.text-wrap-anywhere {\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n/* Loading Text - primary colored centered loading indicator */\n.loading-text {\n color: var(--color-primary);\n text-align: center;\n margin: var(--spacing-md) 0;\n}\n\n/* Centered Section - flex column with center alignment */\n.section-centered {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Card Section Background */\n.section-bg {\n background: var(--color-section-bg);\n border-radius: var(--border-radius-full);\n box-shadow: var(--box-shadow);\n padding: var(--spacing-md);\n}\n\n\n/* Transparent button override (for solid-ui integration) */\n.btn-transparent {\n background-color: transparent;\n}\n\n.btn-transparent:hover {\n background-color: transparent;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/utilities.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/* Utility-first CSS classes for layout, spacing, and responsiveness */\\n\\n:root {\\n --profile-image-size: 3em;\\n}\\n\\n@media (max-width: 1000px) {\\n .profile-grid,\\n .profile-grid * {\\n font-size: 2rem !important;\\n }\\n\\n .profile-grid .actionButton,\\n .profile-grid .searchInput,\\n .profile-grid .flatButton,\\n .profile-grid .buttonSection button,\\n .profile-grid .groupButtonsList button {\\n min-height: calc(var(--min-touch-target) + 0.5em) !important;\\n font-size: 2rem !important;\\n padding: 1em 1em !important;\\n }\\n}\\n\\n.actionButton {\\n width: 100%;\\n min-width: 180px;\\n max-width: 320px;\\n box-sizing: border-box;\\n display: inline-block;\\n}\\n\\n/* ===========================================\\n PROFILE GRID LAYOUT\\n =========================================== */\\n\\n.profile-grid {\\n display: grid;\\n /* Allow the grid to shrink below 30em on small viewports to avoid overflow */\\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 30em), 1fr));\\n gap: var(--spacing-lg);\\n background: var(--color-background);\\n}\\n\\n.profile-header,\\n.profile-footer {\\n grid-column: 1 / -1;\\n}\\n\\n.center {\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.flex {\\n display: flex;\\n}\\n.grid {\\n display: grid;\\n}\\n\\n/* Spacing utilities using CSS variables */\\n.gap-xs { gap: var(--spacing-xs); }\\n.gap-sm { gap: var(--spacing-sm); }\\n.gap-md { gap: var(--spacing-md); }\\n.gap-lg { gap: var(--spacing-lg); }\\n.gap-xl { gap: var(--spacing-xl); }\\n\\n.mt-xs { margin-top: var(--spacing-xs); }\\n.mt-sm { margin-top: var(--spacing-sm); }\\n.mt-md { margin-top: var(--spacing-md); }\\n.mt-lg { margin-top: var(--spacing-lg); }\\n\\n.mb-xs { margin-bottom: var(--spacing-xs); }\\n.mb-sm { margin-bottom: var(--spacing-sm); }\\n.mb-md { margin-bottom: var(--spacing-md); }\\n.mb-lg { margin-bottom: var(--spacing-lg); }\\n\\n.p-xs { padding: var(--spacing-xs); }\\n.p-sm { padding: var(--spacing-sm); }\\n.p-md { padding: var(--spacing-md); }\\n.p-lg { padding: var(--spacing-lg); }\\n\\n.rounded { border-radius: var(--border-radius-full); }\\n.rounded-sm { border-radius: var(--border-radius-base); }\\n\\n.shadow { box-shadow: var(--box-shadow); }\\n.shadow-sm { box-shadow: var(--box-shadow-sm); }\\n\\n.bg-primary {\\n background: var(--color-primary);\\n color: #fff;\\n}\\n.bg-card {\\n background: var(--color-card-bg);\\n}\\n\\n/* Accessibility utilities */\\n.sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border: 0;\\n}\\n\\n.min-touch-target {\\n min-height: var(--min-touch-target);\\n min-width: var(--min-touch-target);\\n}\\n\\n/* Enhanced accessibility utilities */\\n.visually-hidden {\\n position: absolute !important;\\n width: 1px !important;\\n height: 1px !important;\\n padding: 0 !important;\\n margin: -1px !important;\\n overflow: hidden !important;\\n clip: rect(0, 0, 0, 0) !important;\\n white-space: nowrap !important;\\n border: 0 !important;\\n}\\n\\n.visually-hidden.focusable:focus,\\n.visually-hidden.focusable:active {\\n position: static !important;\\n width: auto !important;\\n height: auto !important;\\n padding: inherit !important;\\n margin: inherit !important;\\n overflow: visible !important;\\n clip: auto !important;\\n white-space: inherit !important;\\n}\\n\\n/* Skip links utility */\\n.skip-links {\\n position: absolute;\\n top: -100px;\\n left: 0;\\n z-index: 1000;\\n}\\n\\n.skip-links a {\\n position: absolute;\\n left: 6px;\\n top: 6px;\\n padding: var(--spacing-sm);\\n background: var(--color-primary);\\n color: white;\\n text-decoration: none;\\n border-radius: var(--border-radius-base);\\n}\\n\\n.skip-links a:focus {\\n top: 6px;\\n}\\n\\n.reduced-motion {\\n animation: none !important;\\n transition: none !important;\\n}\\n\\n/* Focus management */\\n.focus-ring {\\n outline: 2px solid var(--color-primary);\\n outline-offset: 2px;\\n}\\n\\n.no-focus-ring {\\n outline: none;\\n}\\n\\n.no-focus-ring:focus-visible {\\n outline: none;\\n box-shadow: none;\\n}\\n\\n/* ARIA live regions */\\n.live-region {\\n position: absolute;\\n left: -10000px;\\n width: 1px;\\n height: 1px;\\n overflow: hidden;\\n}\\n\\n/* Note: Use aria-live=\\\"polite\\\" or aria-live=\\\"assertive\\\" HTML attributes with .live-region */\\n\\n/* Text scaling utilities */\\n.text-scale-friendly {\\n line-height: 1.5;\\n max-width: 70ch; /* Optimal reading length */\\n}\\n\\n/* Text accessibility utilities */\\n.text-readable {\\n line-height: var(--line-height-base);\\n max-width: 65ch;\\n}\\n\\n.text-lg {\\n font-size: var(--font-size-lg);\\n line-height: var(--line-height-base);\\n}\\n\\n.text-small {\\n font-size: max(var(--font-size-sm), var(--min-font-size));\\n line-height: var(--min-line-height);\\n}\\n\\n.text-contrast-high {\\n color: var(--color-text);\\n font-weight: 600;\\n}\\n\\n:focus-visible {\\n outline: var(--focus-ring-width) solid var(--color-primary);\\n outline-offset: 2px;\\n box-shadow: 0 0 0 1px var(--color-background);\\n}\\n\\n:focus:not(:focus-visible) {\\n outline: none;\\n box-shadow: none;\\n}\\n\\n/* Prevent labels from appearing focusable to keyboard users. */\\nlabel:focus,\\nlabel:focus-visible {\\n outline: none !important;\\n box-shadow: none !important;\\n}\\n\\n/* Better focus for text elements */\\n.focusable-text:focus {\\n background-color: rgba(124, 77, 255, 0.1);\\n outline: 2px solid var(--color-primary);\\n outline-offset: 2px;\\n border-radius: 2px;\\n}\\n\\n/* High contrast text */\\n.high-contrast {\\n color: var(--color-text);\\n background: var(--color-background);\\n border: 1px solid var(--color-border-pale);\\n}\\n\\n/* ===========================================\\n CONSOLIDATED COMPONENT PATTERNS\\n =========================================== */\\n\\n/* Primary Button - used by ChatWithMe, ProfileCard */\\n.btn-primary {\\n min-height: var(--min-touch-target);\\n padding: var(--spacing-sm) var(--spacing-md);\\n border: 1px solid var(--color-primary);\\n border-radius: var(--border-radius-base);\\n background: var(--color-primary);\\n color: white;\\n font-weight: 600;\\n cursor: pointer;\\n transition: all var(--animation-duration) ease;\\n}\\n\\n.btn-primary:hover {\\n background: color-mix(in srgb, var(--color-primary) 90%, black);\\n box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);\\n}\\n\\n.btn-primary:active {\\n box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);\\n}\\n\\n.btn-primary:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n transform: none;\\n}\\n\\n/* Action Button Focus - used by ChatWithMe, ProfileCard */\\n.action-button-focus:focus,\\n.action-button-focus:focus-visible {\\n outline: 3px solid var(--color-primary) !important;\\n outline-offset: 2px !important;\\n box-shadow: 0 0 0 2px var(--color-background), 0 0 0 5px rgba(124, 77, 255, 0.25) !important;\\n z-index: 1;\\n}\\n\\n/* List Reset - used by FriendList, SocialCard, nav */\\n.list-reset {\\n list-style: none;\\n padding: 0;\\n margin: 0;\\n}\\n\\n/* Zebra Striping - used by FriendList, StuffCard tables */\\n.zebra-stripe tr:nth-child(even),\\n.zebra-stripe > *:nth-child(even) {\\n background-color: rgba(0, 0, 0, 0.02);\\n}\\n\\n/* Section Title - primary colored heading */\\n.section-title {\\n font-size: 1.25em;\\n font-weight: 600;\\n color: var(--color-primary);\\n margin: 0;\\n}\\n\\n/* Text Overflow - used by ProfileCard, SocialCard */\\n.text-truncate {\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n overflow: hidden;\\n}\\n\\n.text-wrap-anywhere {\\n overflow-wrap: anywhere;\\n word-break: break-word;\\n}\\n\\n/* Loading Text - primary colored centered loading indicator */\\n.loading-text {\\n color: var(--color-primary);\\n text-align: center;\\n margin: var(--spacing-md) 0;\\n}\\n\\n/* Centered Section - flex column with center alignment */\\n.section-centered {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n\\n/* Card Section Background */\\n.section-bg {\\n background: var(--color-section-bg);\\n border-radius: var(--border-radius-full);\\n box-shadow: var(--box-shadow);\\n padding: var(--spacing-md);\\n}\\n\\n\\n/* Transparent button override (for solid-ui integration) */\\n.btn-transparent {\\n background-color: transparent;\\n}\\n\\n.btn-transparent:hover {\\n background-color: transparent;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports=function(e){var r={};function t(n){if(r[n])return r[n].exports;var a=r[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:n})},t.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&r&&\"string\"!=typeof e)for(var a in e)t.d(n,a,function(r){return e[r]}.bind(null,a));return n},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,\"a\",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p=\"\",t(t.s=0)}([function(e,r,t){\"use strict\";t.r(r),t.d(r,\"validateHTMLColorName\",(function(){return l})),t.d(r,\"validateHTMLColorSpecialName\",(function(){return i})),t.d(r,\"validateHTMLColorHex\",(function(){return u})),t.d(r,\"validateHTMLColorRgb\",(function(){return g})),t.d(r,\"validateHTMLColorHsl\",(function(){return y})),t.d(r,\"validateHTMLColorHwb\",(function(){return L})),t.d(r,\"validateHTMLColorLab\",(function(){return S})),t.d(r,\"validateHTMLColorLch\",(function(){return m})),t.d(r,\"validateHTMLColor\",(function(){return G}));const n=e=>e&&\"string\"==typeof e,a=[\"AliceBlue\",\"AntiqueWhite\",\"Aqua\",\"Aquamarine\",\"Azure\",\"Beige\",\"Bisque\",\"Black\",\"BlanchedAlmond\",\"Blue\",\"BlueViolet\",\"Brown\",\"BurlyWood\",\"CadetBlue\",\"Chartreuse\",\"Chocolate\",\"Coral\",\"CornflowerBlue\",\"Cornsilk\",\"Crimson\",\"Cyan\",\"DarkBlue\",\"DarkCyan\",\"DarkGoldenrod\",\"DarkGray\",\"DarkGrey\",\"DarkGreen\",\"DarkKhaki\",\"DarkMagenta\",\"DarkOliveGreen\",\"DarkOrange\",\"DarkOrchid\",\"DarkRed\",\"DarkSalmon\",\"DarkSeaGreen\",\"DarkSlateBlue\",\"DarkSlateGray\",\"DarkSlateGrey\",\"DarkTurquoise\",\"DarkViolet\",\"DeepPink\",\"DeepSkyBlue\",\"DimGray\",\"DimGrey\",\"DodgerBlue\",\"FireBrick\",\"FloralWhite\",\"ForestGreen\",\"Fuchsia\",\"Gainsboro\",\"GhostWhite\",\"Gold\",\"Goldenrod\",\"Gray\",\"Grey\",\"Green\",\"GreenYellow\",\"HoneyDew\",\"HotPink\",\"IndianRed\",\"Indigo\",\"Ivory\",\"Khaki\",\"Lavender\",\"LavenderBlush\",\"LawnGreen\",\"LemonChiffon\",\"LightBlue\",\"LightCoral\",\"LightCyan\",\"LightGoldenrodYellow\",\"LightGray\",\"LightGrey\",\"LightGreen\",\"LightPink\",\"LightSalmon\",\"LightSalmon\",\"LightSeaGreen\",\"LightSkyBlue\",\"LightSlateGray\",\"LightSlateGrey\",\"LightSteelBlue\",\"LightYellow\",\"Lime\",\"LimeGreen\",\"Linen\",\"Magenta\",\"Maroon\",\"MediumAquamarine\",\"MediumBlue\",\"MediumOrchid\",\"MediumPurple\",\"MediumSeaGreen\",\"MediumSlateBlue\",\"MediumSlateBlue\",\"MediumSpringGreen\",\"MediumTurquoise\",\"MediumVioletRed\",\"MidnightBlue\",\"MintCream\",\"MistyRose\",\"Moccasin\",\"NavajoWhite\",\"Navy\",\"OldLace\",\"Olive\",\"OliveDrab\",\"Orange\",\"OrangeRed\",\"Orchid\",\"PaleGoldenrod\",\"PaleGreen\",\"PaleTurquoise\",\"PaleVioletRed\",\"PapayaWhip\",\"PeachPuff\",\"Peru\",\"Pink\",\"Plum\",\"PowderBlue\",\"Purple\",\"RebeccaPurple\",\"Red\",\"RosyBrown\",\"RoyalBlue\",\"SaddleBrown\",\"Salmon\",\"SandyBrown\",\"SeaGreen\",\"SeaShell\",\"Sienna\",\"Silver\",\"SkyBlue\",\"SlateBlue\",\"SlateGray\",\"SlateGrey\",\"Snow\",\"SpringGreen\",\"SteelBlue\",\"Tan\",\"Teal\",\"Thistle\",\"Tomato\",\"Turquoise\",\"Violet\",\"Wheat\",\"White\",\"WhiteSmoke\",\"Yellow\",\"YellowGreen\"],o=[\"currentColor\",\"inherit\",\"transparent\"],l=e=>{let r=!1;return n(e)&&a.map(t=>(e.toLowerCase()===t.toLowerCase()&&(r=!0),null)),r},i=e=>{let r=!1;return n(e)&&o.map(t=>(e.toLowerCase()===t.toLowerCase()&&(r=!0),null)),r},u=e=>{if(n(e)){const r=/^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i;return e&&r.test(e)}return!1},d=\"(([\\\\d]{0,5})((\\\\.([\\\\d]{1,5}))?))\",s=`(${d}%)`,c=\"(([0-9]|[1-9][0-9]|100)%)\",f=`(${c}|(0?((\\\\.([\\\\d]{1,5}))?))|1)`,h=`([\\\\s]{0,5})\\\\)?)(([\\\\s]{0,5})(\\\\/?)([\\\\s]{1,5})${`(((${c}))|(0?((\\\\.([\\\\d]{1,5}))?))|1))?`}([\\\\s]{0,5})\\\\)`,$=\"(-?(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-5][0-9])((\\\\.([\\\\d]{1,5}))?)|360)(deg)?)\",g=e=>{if(n(e)){const r=\"([\\\\s]{0,5})([\\\\d]{1,5})%?([\\\\s]{0,5}),?\",t=\"((([\\\\s]{0,5}),?([\\\\s]{0,5}))|(([\\\\s]{1,5})))\",n=new RegExp(`^(rgb)a?\\\\(${`${r}${t}`}${`${r}${t}`}${`${r}${t}`}(${\"(\\\\/?([\\\\s]{0,5})(0?\\\\.?([\\\\d]{1,5})%?([\\\\s]{0,5}))?|1|0)\"})?\\\\)$`);return e&&n.test(e)}return!1},y=e=>{if(n(e)){const r=new RegExp(`^(hsl)a?\\\\((([\\\\s]{0,5})(${$}|${\"(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-9][0-9]|400)grad)\"}|${\"((([0-5])?\\\\.([\\\\d]{1,5})|6\\\\.([0-9]|1[0-9]|2[0-8])|[0-6])rad)\"}|${\"((0?((\\\\.([\\\\d]{1,5}))?)|1)turn)\"})((([\\\\s]{0,5}),([\\\\s]{0,5}))|(([\\\\s]{1,5}))))(([\\\\s]{0,5})(0|${c})((([\\\\s]{0,5}),([\\\\s]{0,5}))|(([\\\\s]{1,5}))))(([\\\\s]{0,5})(0|${c})([\\\\s]{0,5})\\\\)?)(([\\\\s]{0,5})(\\\\/?|,?)([\\\\s]{0,5})(((${c}))|(0?((\\\\.([\\\\d]{1,5}))?))|1))?\\\\)$`);return e&&r.test(e)}return!1},L=e=>{if(n(e)){const r=new RegExp(`^(hwb\\\\(([\\\\s]{0,5})${$}([\\\\s]{1,5}))((0|${c})([\\\\s]{1,5}))((0|${c})${h}$`);return e&&r.test(e)}return!1},S=e=>{if(n(e)){const r=\"(-?(([0-9]|[1-9][0-9]|1[0-5][0-9])((\\\\.([\\\\d]{1,5}))?)?|160))\",t=new RegExp(`^(lab\\\\(([\\\\s]{0,5})${s}([\\\\s]{1,5})${r}([\\\\s]{1,5})${r}${h}$`);return e&&t.test(e)}return!1},m=e=>{if(n(e)){const r=\"((([0-9]|[1-9][0-9])?((\\\\.([\\\\d]{1,5}))?)|100)(%)?)\",t=\"\"+d,n=`((${$})|(0|${f})|(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9]|3[0-5][0-9])((\\\\.([\\\\d]{1,5}))?)|360))`,a=`(\\\\/([\\\\s]{0,5})${f})`,o=new RegExp(`^lch\\\\(${`(([\\\\s]{0,5})${r}([\\\\s]{1,5})${t}([\\\\s]{1,5})${n}([\\\\s]{0,5})(${a})?)`}\\\\)$`);return e&&o.test(e)}return!1},G=e=>!!(e&&u(e)||g(e)||y(e)||L(e)||S(e)||m(e));r.default=e=>!!(e&&u(e)||l(e)||i(e)||g(e)||y(e)||L(e)||S(e)||m(e))}]);","module.exports = __WEBPACK_EXTERNAL_MODULE__5663__;","module.exports = __WEBPACK_EXTERNAL_MODULE__9426__;","module.exports = __WEBPACK_EXTERNAL_MODULE__5491__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nc = undefined;","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./CVCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./CVCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ChatWithMe.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ChatWithMe.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./FriendList.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./FriendList.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileView.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileView.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./QRCodeCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./QRCodeCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./SocialCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./SocialCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./StuffCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./StuffCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./utilities.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./utilities.css\";\n export default content && content.locals ? content.locals : undefined;\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{isSingleExpression as i}from\"./directive-helpers.js\";import{Directive as t,PartType as e}from\"./directive.js\";export{directive}from\"./directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=(i,t)=>{const e=i._$AN;if(void 0===e)return!1;for(const i of e)i._$AO?.(t,!1),s(i,t);return!0},o=i=>{let t,e;do{if(void 0===(t=i._$AM))break;e=t._$AN,e.delete(i),i=t}while(0===e?.size)},r=i=>{for(let t;t=i._$AM;i=t){let e=t._$AN;if(void 0===e)t._$AN=e=new Set;else if(e.has(i))break;e.add(i),c(t)}};function h(i){void 0!==this._$AN?(o(this),this._$AM=i,r(this)):this._$AM=i}function n(i,t=!1,e=0){const r=this._$AH,h=this._$AN;if(void 0!==h&&0!==h.size)if(t)if(Array.isArray(r))for(let i=e;i<r.length;i++)s(r[i],!1),o(r[i]);else null!=r&&(s(r,!1),o(r));else s(this,i)}const c=i=>{i.type==e.CHILD&&(i._$AP??=n,i._$AQ??=h)};class f extends t{constructor(){super(...arguments),this._$AN=void 0}_$AT(i,t,e){super._$AT(i,t,e),r(this),this.isConnected=i._$AU}_$AO(i,t=!0){i!==this.isConnected&&(this.isConnected=i,i?this.reconnected?.():this.disconnected?.()),t&&(s(this,i),o(this))}setValue(t){if(i(this._$Ct))this._$Ct._$AI(t,this);else{const i=[...this._$Ct._$AH];i[this._$Ci]=t,this._$Ct._$AI(i,this,0)}}disconnected(){}reconnected(){}}export{f as AsyncDirective,t as Directive,e as PartType};\n//# sourceMappingURL=async-directive.js.map\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=async(t,s)=>{for await(const i of t)if(!1===await s(i))return};class s{constructor(t){this.G=t}disconnect(){this.G=void 0}reconnect(t){this.G=t}deref(){return this.G}}class i{constructor(){this.Y=void 0,this.Z=void 0}get(){return this.Y}pause(){this.Y??=new Promise(t=>this.Z=t)}resume(){this.Z?.(),this.Y=this.Z=void 0}}export{i as Pauser,s as PseudoWeakRef,t as forAwaitOf};\n//# sourceMappingURL=private-async-helpers.js.map\n","import{noChange as t}from\"../lit-html.js\";import{AsyncDirective as i}from\"../async-directive.js\";import{PseudoWeakRef as s,Pauser as r,forAwaitOf as e}from\"./private-async-helpers.js\";import{directive as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class o extends i{constructor(){super(...arguments),this._$CK=new s(this),this._$CX=new r}render(i,s){return t}update(i,[s,r]){if(this.isConnected||this.disconnected(),s===this._$CJ)return t;this._$CJ=s;let n=0;const{_$CK:o,_$CX:h}=this;return e(s,async t=>{for(;h.get();)await h.get();const i=o.deref();if(void 0!==i){if(i._$CJ!==s)return!1;void 0!==r&&(t=r(t,n)),i.commitValue(t,n),n++}return!0}),t}commitValue(t,i){this.setValue(t)}disconnected(){this._$CK.disconnect(),this._$CX.pause()}reconnected(){this._$CK.reconnect(this),this._$CX.resume()}}const h=n(o);export{o as AsyncReplaceDirective,h as asyncReplace};\n//# sourceMappingURL=async-replace.js.map\n","// QR CODE\nexport const scanQrToConnectText = 'Scan the QR code to connect with me'\n//ERRORS & SUCCESS\n//Same 'not logged in' error message like on 'Chat with me' button\nexport const userNotLoggedInErrorMessage = 'Current user not found! Not logged in?'\nexport const internalErrorMessage = 'An internal error occured!'\nexport const friendWasAddedSuccesMessage = 'Friend was added!'\n\n//OTHER\nexport const friendExistsMessage = 'Friend already exists'\nexport const loadingMessage = 'Loading...'\n\n//BUTTONS\nexport const addMeToYourFriendsButtonText = 'Add me to your friends'\nexport const logInAddMeToYourFriendsButtonText = 'Login to add me to your friends'\nexport const logInToChatWithMeButtonText = 'Login to chat with me'\nexport const friendExistsAlreadyButtonText = 'Already part of friends'\nexport const chatWithMeButtonText = 'Chat with me'\n\n// Profile & Edit profile texts \nexport const yourContactInformationHeading = 'Your profile'\nexport const otherPreferencesHeadingText = 'Other preferences'\nexport const communitiesHeadingText = 'Your communities'\nexport const resumeHeadingText = 'Resume'\nexport const socialAccountsHeadingText = 'Social accounts'\nexport const sharedItemsHeadingText = 'Shared items'\nexport const friendsHeadingText = 'Friends'\nexport const contactHeadingText = 'Contact'","import { DataBrowserContext } from 'pane-registry'\nimport { widgets } from 'solid-ui'\nimport { NamedNode } from 'rdflib'\n\nfunction complain(\n buttonContainer: HTMLDivElement,\n context: DataBrowserContext,\n error: string\n): void {\n const errorBlock = widgets.errorMessageBlock(context.dom, error)\n errorBlock.setAttribute('role', 'alert')\n errorBlock.setAttribute('aria-live', 'assertive')\n errorBlock.setAttribute('tabindex', '0')\n\n // Focus the error message for screen readers\n setTimeout(() => {\n errorBlock.focus()\n }, 100)\n\n buttonContainer.appendChild(errorBlock)\n}\n\nfunction mention(buttonContainer: HTMLDivElement, message: string): void {\n const positiveFrontendMessageDiv = <HTMLDivElement>document.createElement('div')\n positiveFrontendMessageDiv.setAttribute('role', 'status')\n positiveFrontendMessageDiv.setAttribute('aria-live', 'polite')\n positiveFrontendMessageDiv.setAttribute('tabindex', '0')\n positiveFrontendMessageDiv.classList.add('actionButton', 'licOkay')\n positiveFrontendMessageDiv.innerHTML = message\n\n // Focus the success message for screen readers\n setTimeout(() => {\n positiveFrontendMessageDiv.focus()\n }, 100)\n\n buttonContainer.appendChild(positiveFrontendMessageDiv)\n}\n\nfunction clearPreviousMessage(buttonContainer: HTMLDivElement): void {\n while (buttonContainer.childNodes.length > 2) {\n buttonContainer.removeChild(buttonContainer.lastChild)\n }\n}\n\nfunction checkIfAnyUserLoggedIn(me: NamedNode): boolean {\n if (me) return true\n else return false\n}\n\nexport { complain, mention, clearPreviousMessage, checkIfAnyUserLoggedIn }\n","import { html, TemplateResult } from 'lit-html'\nimport { DataBrowserContext } from 'pane-registry'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, st } from 'rdflib'\nimport { ns, widgets } from 'solid-ui'\nimport {\n clearPreviousMessage, complain,\n mention\n} from './buttonsHelper'\nimport {\n addMeToYourFriendsButtonText, friendExistsAlreadyButtonText, friendExistsMessage, friendWasAddedSuccesMessage, logInAddMeToYourFriendsButtonText, userNotLoggedInErrorMessage\n} from './texts'\nimport './styles/ProfileCard.css'\n\nlet buttonContainer = <HTMLDivElement>document.createElement('section')\n\nconst addMeToYourFriendsDiv = (\n subject: NamedNode,\n context: DataBrowserContext\n): TemplateResult => {\n\n buttonContainer = context.dom.createElement('section') as HTMLDivElement\n buttonContainer.setAttribute('class', 'buttonSubSection text-truncate text-center section-centered')\n buttonContainer.setAttribute('aria-labelledby', 'add-me-to-your-friends-button-section')\n buttonContainer.setAttribute('data-testid', 'button')\n\n // Add a visually hidden heading for accessibility\n const heading = context.dom.createElement('h3')\n heading.setAttribute('id', 'add-me-to-your-friends-button-section')\n heading.setAttribute('class', 'sr-only')\n heading.textContent = 'Add me to your friends actions'\n buttonContainer.appendChild(heading)\n\n const button = createAddMeToYourFriendsButton(subject, context)\n button.classList.add('actionButton', 'btn-primary', 'action-button-focus')\n buttonContainer.appendChild(button)\n return html`${buttonContainer}`\n}\n\nconst createAddMeToYourFriendsButton = (\n subject: NamedNode,\n context: DataBrowserContext\n): HTMLButtonElement => {\n const me = authn.currentUser()\n let label = checkIfAnyUserLoggedIn(me) ? addMeToYourFriendsButtonText.toUpperCase() : logInAddMeToYourFriendsButtonText.toUpperCase()\n const button = widgets.button(\n context.dom,\n undefined,\n label,\n setButtonHandler, //sets an onclick event listener\n {\n needsBorder: true,\n }\n )\n\n function setButtonHandler(event) {\n event.preventDefault()\n saveNewThing(subject, context, ns.foaf('knows'))\n .then(() => {\n clearPreviousMessage(buttonContainer)\n mention(buttonContainer, friendWasAddedSuccesMessage)\n refreshButton()\n })\n .catch((error) => {\n clearPreviousMessage(buttonContainer)\n //else UI.widgets.complain(buttonContainer, message); //displays an error message at the top of the window\n complain(buttonContainer, context, error)\n })\n }\n\n button.refresh = refreshButton()\n\n function refreshButton() {\n const me = authn.currentUser()\n const store: LiveStore = context.session.store\n\n if (checkIfAnyUserLoggedIn(me)) {\n checkIfThingExists(store, me, subject, ns.foaf('knows')).then((friendExists) => {\n if (friendExists) {\n //logged in and friend exists or friend was just added\n button.innerHTML = friendExistsAlreadyButtonText.toUpperCase()\n } else {\n //logged in and friend does not exist yet\n button.innerHTML = addMeToYourFriendsButtonText.toUpperCase()\n }\n })\n } else {\n //not logged in\n button.innerHTML = logInAddMeToYourFriendsButtonText.toUpperCase()\n }\n }\n\n return button\n}\n\nasync function saveNewThing(\n subject: NamedNode,\n context: DataBrowserContext,\n predicate: NamedNode\n): Promise<void> {\n const me = authn.currentUser()\n const store: LiveStore = context.session.store\n\n if (checkIfAnyUserLoggedIn(me)) {\n if (!(await checkIfThingExists(store , me, subject, predicate))) {\n //if friend does not exist, we add her/him\n await store.fetcher.load(me)\n const updater = store.updater\n const toBeInserted = [st(me, predicate, subject, me.doc())]\n try {\n await updater.update([], toBeInserted)\n } catch (error) {\n let errorMessage = error\n if (errorMessage.toString().includes('Unauthenticated'))\n errorMessage = userNotLoggedInErrorMessage\n throw new Error(errorMessage)\n }\n } else throw new Error(friendExistsMessage)\n } else throw new Error(userNotLoggedInErrorMessage)\n}\n\nfunction checkIfAnyUserLoggedIn(me: NamedNode): boolean {\n if (me) return true\n else return false\n}\n\nasync function checkIfThingExists(\n store: LiveStore,\n me: NamedNode,\n subject: NamedNode,\n predicate: NamedNode\n): Promise<boolean> {\n await store.fetcher.load(me)\n if (store.whether(me, predicate, subject, me.doc()) === 0)\n return false\n else return true\n}\n\nfunction extractFriends(editable: boolean, subject: NamedNode, { dom }: DataBrowserContext): HTMLDivElement | null {\n const target = dom.createElement('div')\n console.log('Extracting friends for subject:', subject.doc()) // Debug log to check the subject\n widgets.attachmentList(dom, subject, target, {\n doc: subject.doc(),\n modify: editable,\n predicate: ns.foaf('knows'),\n noun: 'friend',\n })\n if (target.textContent === '')\n return null\n console.log('Extracted friends:', target.innerHTML) // Debug log to check the generated HTML\n return target\n}\n\nexport {\n addMeToYourFriendsDiv,\n createAddMeToYourFriendsButton,\n saveNewThing,\n extractFriends,\n checkIfThingExists\n}\n","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { html, TemplateResult } from 'lit-html'\nimport './styles/FriendList.css'\nimport { extractFriends } from './addMeToYourFriends'\n\n\nexport const FriendList = (\n subject: NamedNode,\n context: DataBrowserContext\n): TemplateResult | null => {\n const friends = extractFriends(false, subject, context)\n if (!friends || !friends.textContent?.trim()) return null\n\n return html`\n <section\n class=\"friendListSection\"\n data-testid=\"friend-list\"\n >\n <h2 id=\"friends-section-title\" class=\"sr-only\">Friends</h2>\n <nav aria-label=\"Friend profiles\">\n <ul class=\"list-reset zebra-stripe\" role=\"list\">\n ${friends}\n </ul>\n </nav>\n </section>\n `\n}\n","import { NamedNode, LiveStore } from 'rdflib'\nimport { ns, utils, widgets } from 'solid-ui'\nimport { store } from 'solid-logic'\nimport { Node } from 'rdflib'\nimport { validateHTMLColorHex } from 'validate-color'\n\nexport interface ProfilePresentation {\n name: string;\n imageSrc?: string;\n introduction?: string;\n languages?: string;\n location?: string;\n pronouns?: string;\n backgroundColor: string;\n highlightColor: string;\n}\n\nexport function pronounsAsText (subject:NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n const their = store.anyJS(subject, ns.solid('preferredRelativePronoun'))\n if (their) {\n pronouns += '/' + their\n }\n }\n pronouns = ' (' + pronouns + ') '\n }\n return pronouns || ''\n}\n\nexport const presentProfile = (\n subject: NamedNode,\n store: LiveStore\n): ProfilePresentation => {\n const name = utils.label(subject)\n const imageSrc = widgets.findImage(subject)\n const role = store.anyValue(subject, ns.vcard('role'))\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) // @@ Search whole store\n\n const address: Node | null = store.any(subject, ns.vcard('hasAddress'))\n const countryName =\n address != null\n ? store.anyValue(address as NamedNode, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address as NamedNode, ns.vcard('locality'))\n : null\n const { backgroundColor, highlightColor } = getColors(subject, store)\n const pronouns = pronounsAsText(subject)\n return {\n name,\n imageSrc,\n introduction: formatIntroduction(role, orgName),\n location: formatLocation(countryName, locality),\n backgroundColor,\n pronouns,\n highlightColor,\n }\n}\n\nfunction formatLocation(countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction formatIntroduction(role: string | void, orgName: string | void) {\n return role && orgName ? `${role} at ${orgName}` : orgName || role || null\n}\n\nfunction getColors(subject: NamedNode, store: LiveStore) {\n const backgroundColor = store.anyValue(\n subject,\n ns.solid('profileBackgroundColor'),\n null,\n subject.doc()\n )\n\n const highlightColor = store.anyValue(\n subject,\n ns.solid('profileHighlightColor'),\n null,\n subject.doc()\n )\n return {\n // default colors are coming from the SolidOS theme, so we only want to set them here if they're valid colors\n backgroundColor: validColorOrDefault(backgroundColor, ''),\n highlightColor: validColorOrDefault(highlightColor, ''),\n }\n}\n\nfunction validColorOrDefault(color: string | void, fallback: string) {\n return color && validateHTMLColorHex(color) ? color : fallback\n}","import { LiveStore, NamedNode, Literal, Namespace, Node, Store } from 'rdflib'\nimport { ns, utils } from 'solid-ui'\n\nexport interface Role {\n startDate?: Literal,\n endDate: Literal,\n dates: string,\n orgName: string,\n roleText: string,\n orgHomePage?: string\n}\nexport interface CVPresentation { \n rolesByType: RolesByType;\n skills: string[];\n languages: string[];\n}\n\nexport interface RolesByType {\n PastRole: Role[];\n CurrentRole: Role[];\n FutureRole: Role[];\n}\n\nconst ORG = Namespace('http://www.w3.org/ns/org#')\n\nexport const typesOfRole = ['PastRole', 'CurrentRole', 'FutureRole']\n\nexport function skillAsText (store: Store, sk: Node):string {\n if (sk.termType === 'Literal') return sk.value // Not normal but allow this\n const publicId = store.anyJS(sk as NamedNode, ns.solid('publicId'))\n if (publicId) {\n const name = store.anyJS(publicId, ns.schema('name'))\n if (name) return name // @@ check language and get name in diff language if necessary\n }\n\n const manual = store.anyJS(sk as NamedNode, ns.vcard('role'))\n if (manual && manual[0] > '') return manual\n return ''\n}\n\nexport function languageAsText (store: Store, lan: Node):string {\n if (lan.termType === 'Literal') return lan.value // Not normal but allow this\n const publicId = store.anyJS(lan as NamedNode, ns.solid('publicId'))\n if (publicId)\n return utils.label(publicId, true) // @@ check language and get name in diff language if necessary\n return '' \n}\n\nexport function datesAsText (startDate?:Literal, endDate?:Literal):string {\n return startDate ? '(' + startDate.value.slice(0,10) + ' to ' +\n ( endDate ? endDate.value.slice(0,10) : '') +')'\n : '' \n}\n\nfunction expandRdfList(store: Store, node: Node): Node[] {\n const collectionElements = (node as { termType?: string; elements?: Node[] }).elements\n if (Array.isArray(collectionElements)) {\n return collectionElements.flatMap(element => expandRdfList(store, element))\n }\n\n const first = store.any(node as NamedNode, ns.rdf('first'))\n if (!first) return [node]\n\n const items: Node[] = []\n let current: Node | null = node\n while (current) {\n const value = store.any(current as NamedNode, ns.rdf('first')) as Node | null\n if (value) items.push(...expandRdfList(store, value))\n const rest = store.any(current as NamedNode, ns.rdf('rest')) as Node | null\n if (!rest || (rest.termType === 'NamedNode' && rest.value === ns.rdf('nil').value)) break\n current = rest\n }\n return items\n}\n\nfunction getRolesByType(\n store: LiveStore,\n subject: NamedNode\n): RolesByType {\n\n const memberships = store.each(null, ORG('member'), subject, null)\n\n const rolesByType = { PastRole: [], CurrentRole: [], FutureRole: [] }\n for (const membership of memberships) {\n let orgHomePage, orgNameGiven, publicIdName, roleName, publicId\n // Things should have start dates but we will be very lenient in this view\n const startDate = store.any(membership as NamedNode, ns.schema('startDate')) as Literal | null\n const endDate = store.any(membership as NamedNode, ns.schema('endDate')) as Literal | null\n const dates = datesAsText(startDate, endDate)\n\n const organization = store.any(membership as NamedNode, ORG('organization'))\n if (organization) {\n orgNameGiven = store.anyJS(organization as NamedNode, ns.schema('name'))\n orgHomePage = store.any(organization as NamedNode, ns.schema('uri'))\n publicId = store.any(organization as NamedNode, ns.solid('publicId'))\n }\n if (publicId) {\n publicIdName = store.anyJS(publicId as NamedNode, ns.schema('name'))\n }\n const orgName = publicIdName || orgNameGiven\n\n const escoRole = store.any(membership as NamedNode, ORG('role'))\n if (escoRole) {\n roleName = store.anyJS(escoRole as NamedNode, ns.schema('name')) as string | null\n }\n const roleText0 = store.anyJS(membership as NamedNode, ns.vcard('role'))\n const roleText = (roleText0 && roleName) ? roleName + ' - ' + roleText0\n : roleText0 || roleName\n\n const item: Role = {\n startDate: startDate as Literal, endDate, orgName, roleText, dates, orgHomePage\n }\n\n for (const t of typesOfRole) {\n if (store.holds(membership, ns.rdf('type'), ns.solid(t))) {\n rolesByType[t].push(item)\n }\n }\n }\n return rolesByType\n}\n\nexport function presentCV(\n subject: NamedNode,\n store: LiveStore\n): CVPresentation {\n \n const rolesByType = getRolesByType(store, subject)\n // Most recent thing most relevant -> sort by end date\n for (const t of typesOfRole) {\n rolesByType[t].sort(function (x, y) {\n if (x.endDate && y.endDate) {\n return x.endDate > y.endDate ? -1 : 1\n }\n return x.startDate > y.startDate ? -1 : 1\n })\n }\n\n const skills = store\n .each(subject, ns.schema('skills'))\n .map((sk) => skillAsText(store, sk))\n .filter((skill) => skill !== '')\n\n const languageNodes = store.each(subject, ns.schema('knowsLanguage'))\n const languages = languageNodes\n .flatMap(node => expandRdfList(store, node))\n .map(lan => languageAsText(store, lan))\n // Deduplicate languages\n const uniqueLanguages = Array.from(new Set(languages))\n\n return { rolesByType, skills, languages: uniqueLanguages }\n}\n","import { NamedNode, Store, Namespace, sym, parse } from 'rdflib'\nimport { widgets } from 'solid-ui'\n\nconst baseUri = 'https://solidos.github.io/profile-pane/src/ontology/'\n\nexport default function renderForm(\n div: HTMLElement,\n subject: NamedNode, // Represents the RDF that fills the form\n formSource: string, // The imported form Turtle source\n formName: string, // The name of the form file (e.g., 'socialMedia.ttl')\n store: Store,\n dom: Document,\n editableProfile: NamedNode | null,\n whichForm?: string ) {// Optional: specify which form to use if multiple 'a ui:Form' are present in the file{\n // --- Form resource setup ---\n const formUri = baseUri + formName // Full URI to the form file\n const exactForm = whichForm || 'this' // If there are more 'a ui:Form' elements in a form file\n const formThis = Namespace(formUri + '#')(exactForm) // NamedNode for #this in the form\n\n loadDocument(store, formSource, formName, formUri)\n\n widgets.appendForm(\n dom,\n div,\n {},\n subject,\n formThis,\n editableProfile,\n (ok, mes) => {\n if (!ok) widgets.errorMessageBlock(dom, mes)\n }\n )\n\n // Ensure that when a user clicks “Add skill” or “Add language”, the newly\n // created input receives focus. Solid-UI provides only a generic \"Add\" button.\n // We detect the \"add\" control by the plus icon it uses and focus the last\n // text input in the surrounding multiple-field container.\n enableFocusOnAdd(div)\n\n // Track the last click/tap position so popups (like solid-ui delete confirmations)\n // can be positioned closer to where the user clicked.\n let lastClick = { x: 0, y: 0 }\n div.addEventListener(\n 'pointerdown',\n (event) => {\n lastClick = { x: event.clientX, y: event.clientY }\n },\n { capture: true }\n )\n\n // Solid-UI injects a popup DIV (position:absolute, top:-1em) under a relative container.\n // Detect it and reposition it using last click coordinates.\n const repositionPopup = (popup: HTMLElement) => {\n const win = dom.defaultView || window\n const padding = 10\n const maxWidth = win.innerWidth - padding\n const maxHeight = win.innerHeight - padding\n\n // Force fixed positioning, then clamp to viewport so it doesn't get cut off.\n popup.style.position = 'fixed'\n popup.style.zIndex = '9999'\n popup.style.pointerEvents = 'auto'\n popup.style.opacity = '1'\n popup.style.visibility = 'visible'\n\n // Use getBoundingClientRect after it is in DOM; if it is 0x0, fall back to default offset.\n const rect = popup.getBoundingClientRect()\n const popupWidth = rect.width || 200\n const popupHeight = rect.height || 100\n\n const left = Math.min(Math.max(lastClick.x + padding, padding), maxWidth - popupWidth)\n const top = Math.min(Math.max(lastClick.y + padding, padding), maxHeight - popupHeight)\n\n popup.style.left = `${left}px`\n popup.style.top = `${top}px`\n }\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (!(node instanceof HTMLElement)) continue\n // Solid-UI popups are divs with inline position:absolute and grid display\n if (\n node.style.position === 'absolute' &&\n node.style.display === 'grid' &&\n node.style.top === '-1em'\n ) {\n repositionPopup(node)\n continue\n }\n // Also handle nested cases where the popup is not the direct added node\n const popup = node.querySelector<HTMLElement>('div[style*=\"position:absolute\"][style*=\"display:grid\"][style*=\"top:-1em\"]')\n if (popup) repositionPopup(popup)\n }\n }\n })\n\n observer.observe(div, { childList: true, subtree: true })\n } // renderForm\n\nfunction enableFocusOnAdd(root: HTMLElement) {\n const PLUS_ICON = 'noun_19460_green.svg'\n\n const isAddButton = (el: HTMLElement) => {\n const img = el.querySelector<HTMLImageElement>('img')\n const label = el.querySelector<HTMLElement>('span')\n return (\n img?.src.includes(PLUS_ICON) &&\n label?.textContent?.trim().toLowerCase().startsWith('add ')\n )\n }\n\n const buttons = Array.from(root.querySelectorAll<HTMLElement>('div')).filter(isAddButton)\n buttons.forEach((btn) => {\n btn.addEventListener('click', () => {\n const scope = (function findScope(el: HTMLElement | null): HTMLElement {\n let cur: HTMLElement | null = el\n while (cur && cur !== root) {\n if (cur.querySelector('input[data-testid=\"autocomplete-input\"]')) return cur\n cur = cur.parentElement\n }\n return root\n })(btn)\n\n const before = new Set(\n Array.from(scope.querySelectorAll<HTMLInputElement>('input[data-testid=\"autocomplete-input\"]'))\n )\n\n const start = Date.now()\n const interval = setInterval(() => {\n const current = Array.from(\n scope.querySelectorAll<HTMLInputElement>('input[data-testid=\"autocomplete-input\"]')\n )\n const newInput = current.find((el) => !before.has(el))\n\n if (newInput) {\n // New inputs are usually wrapped in a label/link; make sure focus jumps\n // straight to the input rather than the label link.\n skipLabelsFromTabbing(scope)\n newInput.focus()\n clearInterval(interval)\n return\n }\n\n if (Date.now() - start > 1000) {\n clearInterval(interval)\n }\n }, 50)\n })\n })\n}\n\n\n\n\n// we need to load into the store some additional information about Social Media accounts\nexport function loadDocument(\n store: Store,\n documentSource: string,\n documentName: string,\n documentURI?: string\n ) {\n const finalDocumentUri = documentURI || baseUri + documentName // Full URI to the file\n const document = sym(finalDocumentUri) // rdflib NamedNode for the document \n \n if (!store.holds(undefined, undefined, undefined, document)) {\n // we are using the social media form because it contains the information we need\n // the form can be used for both use cases: create UI for edit and render UI for display\n parse(documentSource, store, finalDocumentUri, 'text/turtle', () => null) // Load doc directly\n }\n}\n\nexport function skipLabelsFromTabbing(root: HTMLElement): void {\n // Many Solid-UI forms render field labels as focusable links (hrefs).\n // Make sure keyboard tabbing skips these label links entirely.\n const selectors = [\n 'label',\n '.formFieldName a',\n '.classifierBox-label a',\n '.choiceBox-label a',\n '.label a',\n // Skip focusable label-like links created by Solid-UI forms, including the vcard note link\n 'a[href=\"http://www.w3.org/2006/vcard/ns#note\"]',\n 'a[href$=\"#note\"]',\n ].join(', ')\n\n // querySelectorAll<HTMLElement> ensures the elements are typed correctly so we can access tabIndex.\n const nodes = root?.querySelectorAll<HTMLElement>(selectors)\n if (!nodes) return\n\n Array.from(nodes).forEach(el => {\n if (typeof el.tabIndex === 'number' && el.tabIndex !== -1) {\n el.tabIndex = -1\n }\n // Ensure those label links are not announced as focusable elements\n if (el.getAttribute('aria-hidden') !== 'true') {\n el.setAttribute('aria-hidden', 'true')\n }\n })\n}","import { LiveStore, NamedNode, Node } from 'rdflib'\nimport { ns, utils, icons } from 'solid-ui'\nimport socialMediaForm from './ontology/socialMedia.ttl'\nimport { loadDocument } from './rdfFormsHelper'\n\nconst socialMediaFormName = 'socialMedia.ttl' // The name of the file to upload\n\nconst DEFAULT_ICON_URI = icons.iconBase + 'noun_10636_grey.svg' // grey disc\nexport interface Account {\n name: string,\n icon: string,\n homepage: string,\n}\nexport interface SocialPresentation { \n accounts: Account[];\n}\n\nfunction expandRdfList(store: LiveStore, node: Node): Node[] {\n const visited = new Set<string>()\n function inner(node: Node): Node[] {\n const termType = (node as any).termType || typeof node\n const value = (node as any).value || String(node)\n const key = `${termType}:${value}`\n if (visited.has(key)) return []\n visited.add(key)\n\n const collectionElements = (node as { termType?: string; elements?: Node[] }).elements\n if (Array.isArray(collectionElements)) {\n return collectionElements.flatMap(element => inner(element))\n }\n\n const first = store.any(node as NamedNode, ns.rdf('first'))\n if (!first) return [node]\n\n const items: Node[] = []\n let current: Node | null = node\n while (current) {\n const value = store.any(current as NamedNode, ns.rdf('first')) as Node | null\n if (value) items.push(...inner(value))\n const rest = store.any(current as NamedNode, ns.rdf('rest')) as Node | null\n if (!rest || (rest.termType === 'NamedNode' && rest.value === ns.rdf('nil').value)) break\n current = rest\n }\n return items\n }\n return inner(node)\n}\n\nexport function presentSocial(\n subject: NamedNode,\n store: LiveStore\n): SocialPresentation {\n \n function nameForAccount (subject):string {\n const acName = store.any(subject, ns.foaf('name')) ||\n store.any(subject, ns.rdfs('label')) // on the account itself?\n if (acName) return acName.value\n const classes = store.each(subject, ns.rdf('type')) as NamedNode[]\n for (const k of classes) {\n const classIcon: Node = store.any(k as NamedNode, ns.rdfs('label'))\n if (classIcon) {\n return classIcon.value\n }\n return utils.label(k)\n }\n return 'Unknown Account'\n }\n\n function iconForAccount (subject):string {\n const acIcon = store.any(subject, ns.foaf('icon')) // on the account itself?\n if (acIcon) return acIcon.value\n const classes = store.each(subject, ns.rdf('type'))\n if (classes.length > 0) {\n \n for (const k of (classes as Node[])) {\n const classIcon: Node | null = store.any(k as any, ns.foaf('icon'))\n if (classIcon !== null) {\n return classIcon.value\n }\n }\n }\n return DEFAULT_ICON_URI\n }\n\n function homepageForAccount (subject):string {\n const acHomepage = store.any(subject, ns.foaf('homepage')) // on the account itself?\n if (acHomepage) return acHomepage.value\n const id = store.anyJS(subject, ns.foaf('accountName'), null, subject.doc()) || 'No_account_Name'\n const classes = store.each(subject, ns.rdf('type'))\n for (const k of classes) {\n // Fix: ensure k is a NamedNode for store.any\n if (k.termType === 'NamedNode') {\n const userProfilePrefix: Node | null = store.any(k as NamedNode, ns.foaf('userProfilePrefix'))\n if (userProfilePrefix) {\n return userProfilePrefix.value + id.trim()\n }\n }\n }\n return store.anyJS(subject, ns.foaf('homepage'), null, subject.doc()) || ''\n }\n\n function accountAsObject (ac) {\n return {\n name: nameForAccount(ac),\n icon: iconForAccount(ac),\n homepage: homepageForAccount(ac)\n }\n\n }\n \n // we need to load the social media accounts ontology to be able to query all data needed\n loadDocument(store, socialMediaForm, socialMediaFormName)\n\n const accountNodes = store.each(subject, ns.foaf('account'))\n let accountThings = accountNodes.flatMap(node => expandRdfList(store, node))\n // Deduplicate by foaf:accountName value\n const accountNameSet = new Set<string>()\n const accounts: Account[] = []\n for (const ac of accountThings) {\n if (ac.termType === 'NamedNode') {\n const accountNameNode = store.any(ac as NamedNode, ns.foaf('accountName'))\n const accountName = accountNameNode ? accountNameNode.value : ''\n if (!accountNameSet.has(accountName)) {\n accountNameSet.add(accountName)\n accounts.push(accountAsObject(ac))\n }\n }\n }\n if (!accounts.length) return { accounts: [] }\n return { accounts }\n}\n","import { NamedNode, uri } from 'rdflib'\nimport { ns, utils, widgets, icons } from 'solid-ui'\nimport { solidLogicSingleton } from 'solid-logic'\n\nconst { iconForClass } = widgets\nconst { typeIndex } = solidLogicSingleton\nconst { getScopedAppInstances } = typeIndex\n\n\nexport interface Item {\n href: string,\n name: string,\n icon: string,\n instance: NamedNode\n}\n\nexport interface StuffPresentation {\n stuff: Item[];\n}\n\nexport const iconForClassMap = {} // @@ move to buttons in solid-ui\nfor (const k in iconForClass) {\n const pref = k.split(':')[0]\n const id = k.split(':')[1]\n const theClass = ns[pref](id)\n iconForClassMap[theClass.uri] = uri.join(iconForClass[k], icons.iconBase)\n}\n\nexport function getIconForClass (klass:NamedNode) {\n const icon0 = iconForClassMap[klass.uri]\n return icon0 || icons.iconBase + 'noun_10636.svg' // fall back to black disk\n}\n\nexport async function presentStuff(\n subject: NamedNode\n): Promise<StuffPresentation> {\n\n const scopedItems = await getScopedAppInstances(null, subject)\n // console.log('scopedItems', scopedItems)\n\n const stuff = scopedItems.map(item => { // work with old or new solid-logic\n const icon = getIconForClass((item as any).type || ns.rdf('Resource')) \n const href = item.instance.uri\n const name = utils.label(item.instance)\n const instance = item.instance\n // console.log(` href=${href} name=${name} icon=${icon}`)\n return { href, name, icon, instance }\n })\n\n return { stuff }\n}\n","import { html, TemplateResult } from 'lit-html'\nimport { NamedNode } from 'rdflib'\nimport { utils } from 'solid-ui'\nimport './styles/QRCodeCard.css'\nimport { scanQrToConnectText } from './texts'\n\n\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n // Remove leading # if present\n hex = hex.replace(/^#/, '')\n if (hex.length === 3) {\n hex = hex.split('').map(x => x + x).join('')\n }\n if (hex.length !== 6) return null\n const num = parseInt(hex, 16)\n return {\n r: (num >> 16) & 255,\n g: (num >> 8) & 255,\n b: num & 255,\n }\n}\n\nfunction luminance({ r, g, b }: { r: number; g: number; b: number }): number {\n const a = [r, g, b].map(function (v) {\n v /= 255\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)\n })\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]\n}\n\nfunction contrastRatio(hex1: string, hex2: string): number {\n const rgb1 = hexToRgb(hex1)\n const rgb2 = hexToRgb(hex2)\n if (!rgb1 || !rgb2) return 1\n const lum1 = luminance(rgb1)\n const lum2 = luminance(rgb2)\n const brightest = Math.max(lum1, lum2)\n const darkest = Math.min(lum1, lum2)\n return (brightest + 0.05) / (darkest + 0.05)\n}\n\nexport const QRCodeCard = (\n highlightColor: string, \n backgroundColor: string,\n subject: NamedNode\n): TemplateResult => {\n const hC = highlightColor || '#000000'\n const bC = backgroundColor || '#ffffff'\n const name = utils.label(subject)\n\n // Color contrast check\n const ratio = contrastRatio(hC, bC)\n if (ratio < 4.5) {\n \n console.warn(\n `QRCodeCard: The contrast ratio between highlightColor (${hC}) and backgroundColor (${bC}) is ${ratio.toFixed(2)}, which is below the WCAG 2.1 recommended minimum of 4.5:1 for normal text.`\n )\n }\n\n const BEGIN = 'BEGIN:VCARD\\r\\n'\n const END = 'END:VCARD\\r\\n'\n const FN = 'FN:' + name + '\\r\\n'\n const URL = 'URL:' + subject.uri + 'r\\n'\n const VERSIONV = 'VERSION:4.0\\r\\n'\n\n // Accessibility check: Ensure QR code is rendered as an accessible image or canvas\n // This assumes the QR code is rendered inside the <div> below by another library or script.\n // If you use a library, ensure it sets role=\"img\" and an appropriate aria-label or alt attribute.\n // If not, warn the developer.\n setTimeout(() => {\n const container = document.querySelector('.QRCode [role=\"img\"]')\n if (container) {\n const hasAriaLabel = container.hasAttribute('aria-label')\n const hasAlt = container.hasAttribute('alt')\n if (!hasAriaLabel && !hasAlt) {\n \n console.warn('QRCodeCard: The QR code element should have an accessible label (aria-label or alt attribute) for screen readers.')\n }\n } else {\n \n console.warn('QRCodeCard: No element with role=\"img\" found for the QR code. Ensure the QR code is rendered as an <img> or <canvas> with proper ARIA attributes.')\n }\n }, 0)\n\n const vCard: string = BEGIN + FN + URL + END + VERSIONV\n\n // console.log(`@@ qrcodes colours highlightColor ${highlightColor}, backgroundColor ${backgroundColor}`)\n \n \n return html`\n <figure \n class=\"QRCode\"\n data-value=\"${vCard}\"\n highlightColor=\"${hC}\"\n backgroundColor=\"${bC}\"\n data-testid=\"qrcode-card\"\n aria-labelledby=\"qr-code-caption\"\n role=\"img\"\n aria-describedby=\"qr-code-description\"\n >\n <div \n aria-label=\"Static QR code containing contact information for ${name}\"\n role=\"img\"\n tabindex=\"0\"\n ></div>\n <figcaption \n id=\"qr-code-caption\" \n class=\"qrCaption\"\n >\n ${scanQrToConnectText}\n </figcaption>\n <div \n id=\"qr-code-description\" \n class=\"sr-only\"\n >\n This is a static QR code containing vCard information for ${name}, including profile URL ${subject.uri}. The QR code is not interactive.\n </div>\n </figure>\n `\n}\n","import { html, nothing } from 'lit-html'\nimport './styles/ProfileCard.css'\nimport { ProfilePresentation } from './presenter'\nimport { addMeToYourFriendsDiv } from './addMeToYourFriends'\nimport { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { QRCodeCard } from './QRCodeCard'\n\n\nexport const ProfileCard = ({\n name, imageSrc, introduction, location, pronouns, highlightColor, backgroundColor\n}: ProfilePresentation, context: DataBrowserContext, subject: NamedNode) => {\n\n return html`\n <article class=\"profileCard\" aria-labelledby=\"profile-name\">\n <h2 id=\"profile-name\" class=\"sr-only\">${name}</h2>\n <header class=\"header flex-column-center mb-md\" aria-label=\"Profile information\">\n ${Image(imageSrc, name)}\n </header>\n \n <section class=\"intro text-center\" aria-label=\"About\">\n ${Line(introduction, '', 'About')}\n ${Line(location, '🌐', 'Location')}\n ${Line(pronouns, '', 'Pronouns')}\n </section>\n \n <section class=\"buttonSection text-center\" aria-label=\"Actions\">\n ${addMeToYourFriendsDiv(subject, context)}\n </section>\n \n <div class=\"qrCodeSection section-centered\">\n ${QRCodeCard(highlightColor, backgroundColor, subject)}\n </div>\n </article>\n `\n}\n\nconst Line = (value, prefix: symbol | string = nothing, label: string = '') =>\n value ? html`\n <div class=\"details\" role=\"text\" ${label ? `aria-label=\"${label}: ${value}\"` : ''}>\n ${prefix} ${value}\n </div>\n ` : nothing\n\nconst Image = (src, alt) =>\n src\n ? html`\n <img\n class=\"image\"\n src=${src}\n alt=\"Profile photo of ${alt}\"\n width=\"160\"\n height=\"160\"\n loading=\"eager\"\n />\n `\n : html`\n <div class=\"image-alt\" role=\"img\" aria-label=\"${alt}\" tabindex=\"0\">\n ${alt}\n </div>\n `\n","import { html } from 'lit-html'\nimport { CVPresentation } from './CVPresenter'\nimport './styles/CVCard.css'\n\nexport const CVCard = (\n cvData: CVPresentation\n) => {\n const { rolesByType, skills, languages } = cvData\n\n const futureRolesArr = rolesByType['FutureRole'] || []\n const currentRolesArr = rolesByType['CurrentRole'] || []\n const pastRolesArr = rolesByType['PastRole'] || []\n const skillsArr = skills || []\n const languagesArr = languages || []\n\n const hasFutureRole = Array.isArray(futureRolesArr) && futureRolesArr.length > 0\n const hasCurrentRole = Array.isArray(currentRolesArr) && currentRolesArr.length > 0\n const hasPastRole = Array.isArray(pastRolesArr) && pastRolesArr.length > 0\n const hasSkills = Array.isArray(skillsArr) && skillsArr.length > 0\n const hasLanguages = Array.isArray(languagesArr) && languagesArr.length > 0\n\n if (!(hasFutureRole || hasCurrentRole || hasPastRole || hasSkills || hasLanguages)) return html``\n\n return html`\n <article class=\"cvCard\" aria-label=\"Resume\" data-testid=\"curriculum-vitae\">\n ${hasFutureRole ? html`\n <section class=\"cvSection\" aria-labelledby=\"cv-future-heading\">\n <h3 id=\"cv-future-heading\">Future Roles</h3>\n <ul role=\"list\" aria-label=\"Upcoming work experience\">\n ${renderRoles(futureRolesArr, true)}\n </ul>\n </section>\n ` : ''}\n \n ${hasCurrentRole ? html`\n <section class=\"cvSection\" aria-labelledby=\"cv-current-heading\">\n <h3 id=\"cv-current-heading\">Current Roles</h3>\n <ul role=\"list\" aria-label=\"Current work experience\">\n ${renderRoles(currentRolesArr, true)}\n </ul>\n </section>\n ` : ''}\n \n ${hasPastRole ? html`\n <section class=\"cvSection\" aria-labelledby=\"cv-past-heading\">\n <h3 id=\"cv-past-heading\">Past Roles</h3>\n <ul role=\"list\" aria-label=\"Previous work experience\">\n ${renderRoles(pastRolesArr, true)}\n </ul>\n </section>\n ` : ''}\n \n ${hasSkills ? html`\n <section class=\"cvSection\" aria-labelledby=\"cv-skills-heading\">\n <h3 id=\"cv-skills-heading\">Skills</h3>\n <ul role=\"list\" aria-label=\"Professional skills and competencies\">\n ${renderSkills(skillsArr, true)}\n </ul>\n </section>\n ` : ''}\n \n ${hasLanguages ? html`\n <section class=\"cvSection\" aria-labelledby=\"cv-languages-heading\">\n <h3 id=\"cv-languages-heading\">Languages</h3>\n <ul role=\"list\" aria-label=\"Known languages\">\n ${renderLanguages(languagesArr, true)}\n </ul>\n </section>\n ` : ''}\n </article>\n `\n}\n\nfunction renderRole(role, asList = false) {\n if (!role) return html``\n return asList\n ? html`\n <li class=\"cvRole\" role=\"listitem\">\n <strong class=\"cvOrg\" aria-label=\"Organization\">${role.orgName}</strong>\n <span aria-label=\"Role title\">${strToUpperCase(role.roleText)}</span>\n <time aria-label=\"Employment period\">${role.dates}</time>\n </li>`\n : html``\n}\n\nfunction renderRoles(roles, asList = false) {\n if (!roles || !roles.length || !roles[0]) return html``\n return html`${renderRole(roles[0], asList)}${roles.length > 1 ? renderRoles(roles.slice(1), asList) : html``}`\n}\n\nfunction renderSkill(skill, asList = false) {\n if (!skill) return html``\n return asList\n ? html`<li class=\"cvSkill\">${strToUpperCase(skill)}</li>`\n : html``\n}\n\nfunction renderSkills(skills, asList = false) {\n if (!skills || !skills.length || !skills[0]) return html``\n return html`${renderSkill(skills[0], asList)}${skills.length > 1 ? renderSkills(skills.slice(1), asList) : html``}`\n}\n\nfunction renderLan(language, asList = false) {\n if (!language) return html``\n return asList\n ? html`<li class=\"cvLanguage\">${language}</li>`\n : html``\n}\n\nfunction renderLanguages(languages, asList = false) {\n if (!languages || !languages.length || !languages[0]) return html``\n return html`${renderLan(languages[0], asList)}${languages.length > 1 ? renderLanguages(languages.slice(1), asList) : html``}`\n}\n\nfunction strToUpperCase(str) {\n if (str && str[0] > '') {\n const strCase = str.split(' ')\n for (let i = 0; i < strCase.length; i++) {\n strCase[i] = strCase[i].charAt(0).toUpperCase() +\n strCase[i].substring(1)\n }\n return strCase.join(' ')\n }\n return ''\n}\n","import { html, TemplateResult } from 'lit-html'\nimport { SocialPresentation } from './SocialPresenter'\nimport './styles/SocialCard.css'\n\n\nexport const SocialCard = (\n SocialData: SocialPresentation\n): TemplateResult => {\n \n const { accounts } = SocialData\n\n if(accounts.length){\n\n return html`\n <section\n class=\"socialCard\"\n aria-labelledby=\"social-card-title\"\n data-testid=\"social-media\"\n >\n <nav aria-label=\"Social media profiles\">\n <ul class=\"socialList list-reset\" role=\"list\">\n ${accounts.map(account => renderAccount(account))}\n </ul>\n </nav>\n </section>\n `\n }\n\n function renderAccount(account) {\n return account.homepage && account.name && account.icon\n ? html`\n <li class=\"socialItem\" role=\"listitem\">\n <a \n href=\"${account.homepage}\" \n target=\"_blank\" \n rel=\"noopener noreferrer\" \n aria-label=\"Visit ${account.name} profile (opens in new tab)\"\n >\n <img \n class=\"socialIcon\" \n src=\"${account.icon}\" \n alt=\"${account.name} icon\"\n width=\"40\"\n height=\"40\"\n loading=\"lazy\"\n />\n <span class=\"text-wrap-anywhere\">${account.name}</span>\n </a>\n </li>\n `\n : html``\n }\n\n}\n","import { html, TemplateResult } from 'lit-html'\nimport { NamedNode } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { widgets } from 'solid-ui'\nimport './styles/StuffCard.css'\nimport { ProfilePresentation } from './presenter'\n\n\nexport const StuffCard = (profileBasics: ProfilePresentation,\n context: DataBrowserContext,\n subject: NamedNode, stuffData): TemplateResult => {\n const { stuff } = stuffData\n const dom = context.dom || document\n return html`\n <section\n class=\"stuffCard\"\n aria-labelledby=\"stuff-card-title\"\n role=\"region\"\n data-testid=\"stuff\"\n >\n <header>\n <h3 id=\"stuff-card-title\" class=\"sr-only\">Shared Resources</h3>\n </header>\n <div>\n <table class=\"stuffTable\" data-testid=\"stuffTable\">\n <caption class=\"sr-only\">Files and resources shared by ${profileBasics.name}</caption>\n <tbody class=\"zebra-stripe\">\n ${renderThings(stuff, dom)}\n </tbody>\n </table>\n </div>\n </section>\n `\n}\n\nexport function renderThingAsDOM (thing, dom) {\n const options = {}\n // widgets.personTR returns a DOM node, so we need to convert it to HTML string\n const row = widgets.personTR(dom, null, thing.instance, options)\n return row\n}\n\nexport function renderThing (thing, dom) {\n return renderThingAsDOM(thing, dom)\n}\n\nexport function renderThings(things, dom) {\n if (things.length === 0) return html``\n return html`${renderThing(things[0], dom)}${things.length > 1 ? renderThings(things.slice(1), dom) : html``}`\n}","import { html, TemplateResult } from 'lit-html'\nimport { DataBrowserContext } from 'pane-registry'\nimport { NamedNode, LiveStore } from 'rdflib'\nimport './styles/ProfileView.css'\nimport { ChatWithMe } from './ChatWithMe'\nimport { FriendList } from './FriendList'\nimport { presentProfile } from './presenter'\nimport { presentCV } from './CVPresenter' // 20210527\nimport { presentSocial } from './SocialPresenter' // 20210527\nimport { presentStuff } from './StuffPresenter' // 20210527\nimport { ProfileCard } from './ProfileCard'\nimport { CVCard } from './CVCard'\nimport { SocialCard } from './SocialCard'\nimport { StuffCard } from './StuffCard'\nimport {\n resumeHeadingText,\n socialAccountsHeadingText,\n sharedItemsHeadingText,\n friendsHeadingText,\n contactHeadingText\n} from './texts'\n\n// The edit button switches to the editor pane\n/*\nfunction renderEditButton (subject) {\n return \n authn.currentUser() && authn.currentUser().sameTerm(subject) ?\n html `<button type=\"button\" class=\"ProfilePaneCVEditButton\">\n <img src=\"${editButtonURI}\">\n Edit</button>`\n : html``;\n}\n*/\n\nexport async function ProfileView (\n subject: NamedNode,\n context: DataBrowserContext\n): Promise <TemplateResult> {\n const store = context.session.store as LiveStore\n \n const profileBasics = presentProfile(subject, store)\n const rolesByType = presentCV(subject, store)\n const accounts = presentSocial(subject, store)\n const stuffData = await presentStuff(subject)\n\n return html` \n <main\n id=\"main-content\"\n class=\"profile-grid\"\n style=\"--profile-grid-bg: radial-gradient(circle, ${profileBasics.backgroundColor} 80%, ${profileBasics.highlightColor} 100%)\"\n role=\"main\"\n aria-label=\"Profile for ${profileBasics.name}\"\n tabindex=\"-1\"\n > \n\n <article \n aria-labelledby=\"profile-card-heading\" \n class=\"profileSection section-bg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n <header class=\"text-center mb-md\">\n <h2 id=\"profile-card-heading\" tabindex=\"-1\">${profileBasics.name}</h2>\n </header>\n ${ProfileCard(profileBasics, context, subject)}\n </article>\n\n ${(() => {\n const cv = CVCard(rolesByType)\n return cv && cv.strings && cv.strings.join('').trim() !== '' ? html`\n <section \n aria-labelledby=\"cv-heading\" \n class=\"profileSection section-bg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n <header class=\"text-center mb-md\">\n <h2 id=\"cv-heading\" tabindex=\"-1\">${resumeHeadingText}</h2>\n </header>\n <div>\n ${cv}\n </div>\n </section>\n ` : ''\n })()}\n\n ${accounts.accounts && accounts.accounts.length > 0 ? html`\n <aside \n aria-labelledby=\"social-heading\" \n class=\"profileSection section-bg\" \n role=\"complementary\"\n tabindex=\"-1\"\n >\n <header class=\"text-center mb-md\">\n <h2 id=\"social-heading\" tabindex=\"-1\">${socialAccountsHeadingText}</h2>\n </header>\n <nav aria-label=\"Social media links\">\n ${SocialCard(accounts)}\n </nav>\n </aside>\n ` : ''}\n\n ${stuffData.stuff && stuffData.stuff.length > 0 ? html`\n <section \n aria-labelledby=\"stuff-heading\" \n class=\"profileSection section-bg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n <header class=\"text-center mb-md\">\n <h2 id=\"stuff-heading\" tabindex=\"-1\">${sharedItemsHeadingText}</h2>\n </header>\n <div>\n ${StuffCard(profileBasics, context, subject, stuffData)}\n </div>\n </section>\n ` : ''}\n\n ${(() => {\n const friends = FriendList(subject, context)\n return friends ? html`\n <aside \n aria-labelledby=\"friends-heading\" \n class=\"profileSection section-bg\" \n role=\"complementary\"\n tabindex=\"-1\"\n >\n <header class=\"text-center mb-md\">\n <h2 id=\"friends-heading\" tabindex=\"-1\">${friendsHeadingText}</h2>\n </header>\n <div role=\"list\" aria-label=\"Friend connections\">\n ${friends}\n </div>\n </aside>\n ` : ''\n })()}\n\n <section \n aria-labelledby=\"chat-heading\" \n class=\"profileSection section-bg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n <header class=\"text-center mb-md\">\n <h2 id=\"chat-heading\" tabindex=\"-1\">${contactHeadingText}</h2>\n </header>\n <div>\n ${ChatWithMe(subject, context)}\n </div>\n </section>\n </main>\n `\n}\n","import { html, TemplateResult } from 'lit-html'\nimport { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { asyncReplace } from 'lit-html/directives/async-replace.js'\nimport { chatWithMeButtonText, logInToChatWithMeButtonText, loadingMessage } from './texts'\nimport { checkIfAnyUserLoggedIn, complain } from './buttonsHelper'\nimport './styles/ChatWithMe.css'\n\nexport const ChatWithMe = (\n subject: NamedNode,\n context: DataBrowserContext\n): TemplateResult => {\n const logic = context.session.logic\n const longChatPane = context.session.paneRegistry.byName('long chat')\n\n async function* chatContainer() {\n const chatContainer = context.dom.createElement('section') as HTMLDivElement\n chatContainer.setAttribute('class', 'chatSection section-centered')\n chatContainer.setAttribute('aria-labelledby', 'chat-section-title')\n chatContainer.setAttribute('role', 'region')\n chatContainer.setAttribute('data-testid', 'chat')\n\n // Add hidden title for screen readers\n const title = context.dom.createElement('h3')\n title.id = 'chat-section-title'\n title.className = 'sr-only'\n title.textContent = 'Communication'\n chatContainer.appendChild(title)\n\n let exists\n try {\n yield html`\n <div class=\"buttonSubSection\">\n <div class=\"actionButton loading-text center\" role=\"status\" aria-live=\"polite\">\n ${loadingMessage.toUpperCase()}\n </div>\n </div>\n `\n exists = await logic.chat.getChat(subject, false)\n } catch (e) {\n exists = false\n }\n \n if (exists) {\n const chatArea = context.dom.createElement('div')\n chatArea.setAttribute('role', 'log')\n chatArea.setAttribute('aria-label', 'Chat conversation')\n chatArea.appendChild(longChatPane.render(exists, context, {}))\n chatContainer.appendChild(chatArea)\n yield chatContainer\n } else {\n const me = authn.currentUser()\n let label = checkIfAnyUserLoggedIn(me) ? chatWithMeButtonText.toUpperCase() : logInToChatWithMeButtonText.toUpperCase()\n const button = widgets.button(\n context.dom,\n undefined,\n label,\n setButtonHandler,\n { needsBorder: true }\n )\n\n async function setButtonHandler(event) {\n event.preventDefault()\n try {\n const chat: NamedNode = await logic.chat.getChat(subject, true)\n chatContainer.innerHTML = ''\n chatContainer.appendChild(longChatPane.render(chat, context, {}))\n } catch (error) {\n complain(chatContainer, context, error)\n }\n }\n\n button.refresh = refreshButton()\n\n function refreshButton() {\n const me = authn.currentUser()\n \n if (checkIfAnyUserLoggedIn(me)) {\n button.innerHTML = chatWithMeButtonText.toUpperCase()\n } else {\n //not logged in\n button.innerHTML = logInToChatWithMeButtonText.toUpperCase()\n }\n }\n\n button.setAttribute('type', 'button')\n button.setAttribute('aria-describedby', 'chat-button-description')\n \n const description = context.dom.createElement('span')\n description.id = 'chat-button-description'\n description.className = 'sr-only'\n description.textContent = 'Start a new conversation or sign in to continue existing chat'\n \n button.classList.add('actionButton', 'btn-primary', 'action-button-focus')\n chatContainer.appendChild(button)\n chatContainer.appendChild(description)\n yield chatContainer\n }\n }\n\n return html` ${asyncReplace(chatContainer())} `\n}","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { yourContactInformationHeading } from '../texts'\n\nexport function EditContactsSection(context: DataBrowserContext, me: NamedNode): HTMLElement {\n const section = context.dom.createElement('section')\n section.setAttribute('aria-labelledby', 'edit-profile-contact-heading')\n section.classList.add('profileSection', 'section-bg', 'profile-form')\n\n const header = context.dom.createElement('header')\n header.classList.add('text-center', 'mb-md')\n const heading = context.dom.createElement('h2')\n heading.id = 'edit-profile-contact-heading'\n heading.classList.add('section-title')\n heading.textContent = yourContactInformationHeading\n header.appendChild(heading)\n section.appendChild(header)\n\n section.appendChild(paneDiv(context, me, 'contact'))\n\n return section\n}\n\nfunction paneDiv (\n context: DataBrowserContext, \n subject: NamedNode,\n paneName: string\n): HTMLElement {\n const view = context.session.paneRegistry.byName(paneName)\n if (!view) {\n const warning = context.dom.createElement('div')\n warning.innerText = `Unable to load view: ${paneName}`\n return warning\n }\n const viewContainer = view.render(subject, context)\n \n // Handle different node types\n let container: HTMLElement\n \n if (viewContainer && typeof viewContainer.setAttribute === 'function') {\n // It's already an Element node\n container = viewContainer as HTMLElement\n } else if (viewContainer && viewContainer.nodeType === Node.TEXT_NODE) {\n // It's a Text node, wrap it in a section for semantics\n container = context.dom.createElement('section')\n container.appendChild(viewContainer)\n } else {\n // Fallback for other cases\n container = context.dom.createElement('section')\n container.innerText = `View render did not return a valid Node for: ${paneName}`\n }\n\n container.setAttribute('role', 'region')\n container.setAttribute('aria-label', `${paneName} section`)\n return container\n}\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./profileRDFFormsEnforced.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./profileRDFFormsEnforced.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./editProfile.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./editProfile.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { NamedNode, sym } from 'rdflib'\nimport { store } from 'solid-logic'\nimport { ns, utils, widgets, icons } from 'solid-ui'\n\nconst DEFAULT_ICON_URI = icons.iconBase + 'noun_10636_grey.svg' // grey disc\n\nexport function refresh(dom: Document, attachmentTable: HTMLTableElement, me: NamedNode, editableProfile: NamedNode | null, predicate: NamedNode) {\n // Keep the RDF terms so downstream Solid-UI helpers (e.g. findImage) can call term.sameTerm().\n // We still sort by string value so the list order is stable.\n const friendsList = store.each(me, predicate)\n // Ensure profiles are loaded before we render rows, otherwise widgets.findImage / utils.label may return empty.\n void (async () => {\n if (store.fetcher) {\n await Promise.all(\n friendsList.map((friend) => {\n if (!store.holds(friend, null, null, null)) {\n return store.fetcher?.load(friend.value).catch(() => undefined)\n }\n return Promise.resolve()\n })\n )\n }\n friendsList.sort((a, b) => (a.value > b.value ? 1 : a.value < b.value ? -1 : 0))\n utils.syncTableToArray(attachmentTable, friendsList, (target) => createNewRow(dom, attachmentTable, target, me, editableProfile, predicate))\n })()\n}\n\nfunction createNewRow (dom: Document, attachmentTable: HTMLTableElement, target: any, me: NamedNode, editableProfile: NamedNode | null, predicate: NamedNode): HTMLTableRowElement {\n const theTarget = target\n const profileImg = dom.createElement('img')\n \n profileImg.src = getProfileImg(sym(target), profileImg)\n profileImg.alt = `Image of ${utils.label(sym(target))}`\n\n const opt: any = { \n image: profileImg,\n title: utils.label(sym(target)),\n link: true\n }\n if (!!editableProfile) {\n opt.deleteFunction = function () {\n deleteAttachment(dom, attachmentTable, me, editableProfile, theTarget, predicate)\n }\n }\n return widgets.renderAsRow(dom, predicate, target, opt)\n}\n\nfunction getProfileImg(subject: NamedNode, profileImg: HTMLImageElement): string {\n const img = widgets.findImage(subject)\n if (img) {\n profileImg.classList.add('profile-image')\n return img\n }\n profileImg.classList.add('default-profile-image')\n return DEFAULT_ICON_URI\n}\n\nasync function deleteAttachment(dom: Document, attachmentTable: HTMLTableElement, me: NamedNode, editableProfile: NamedNode | null, target: NamedNode, predicate: NamedNode) {\n if (!store.updater) {\n throw new Error('Store has no updater.')\n }\n\n // Delete the exact statements in the store so we don't rely on doc() matching\n const statementsToDelete = store.statementsMatching(me, predicate, target, null)\n\n if (!statementsToDelete.length) {\n console.warn('No matching statement found to delete for', target.value)\n refresh(dom, attachmentTable, me, editableProfile, predicate)\n return\n }\n\n try {\n await store.updater.update(statementsToDelete as any, [])\n\n // UpdateManager may mutate store asynchronously, so only remove locally if it still exists\n if (typeof store.removeStatements === 'function') {\n const stillThere = store.holds(me, predicate, target, null)\n if (stillThere) {\n try {\n store.removeStatements(statementsToDelete)\n } catch (e) {\n // Ignore if already gone\n }\n }\n }\n\n // Ensure store is up-to-date before re-rendering\n if (store.fetcher) await store.fetcher.load(me.doc())\n refresh(dom, attachmentTable, me, editableProfile, predicate)\n } catch (error) {\n console.error('Error deleting:', error)\n\n // If update failed, try to keep UI in sync anyway\n if (typeof store.removeStatements === 'function') {\n try {\n store.removeStatements(statementsToDelete)\n } catch (e) {\n /* ignore */\n }\n }\n\n if (store.fetcher) await store.fetcher.load(me.doc())\n refresh(dom, attachmentTable, me, editableProfile, predicate)\n }\n}\n\nexport function isAWebID(subject: NamedNode): boolean {\n if (subject && subject.doc) {\n const t = store.findTypeURIs(subject.doc())\n return !!t[ns.foaf('PersonalProfileDocument').uri]\n }\n return false\n}","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { ns, widgets, icons } from 'solid-ui'\nimport { friendsHeadingText } from '../texts'\nimport { saveNewThing } from '../addMeToYourFriends'\nimport '../styles/profileRDFFormsEnforced.css'\nimport '../styles/editProfile.css'\nimport { store } from 'solid-logic'\nimport {\n clearPreviousMessage, complain\n} from '../buttonsHelper'\nimport { isAWebID, refresh } from './editProfilePresenter'\n\nconst GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg'\n\nexport function EditFriendsSection(context: DataBrowserContext, me: NamedNode, editableProfile: NamedNode | null) {\n const section = context.dom.createElement('section')\n section.setAttribute('aria-labelledby', 'edit-profile-friends-heading')\n section.classList.add('profileSection', 'section-bg')\n\n const header = context.dom.createElement('header')\n header.classList.add('text-center', 'mb-md')\n\n const heading = context.dom.createElement('h2')\n heading.id = 'edit-profile-friends-heading'\n heading.classList.add('section-title')\n heading.textContent = friendsHeadingText\n\n header.appendChild(heading)\n section.appendChild(header)\n\n if (editableProfile) {\n let plusButtonDiv = context.dom.createElement('div')\n plusButtonDiv.classList.add('add-friend-button-container')\n\n createAddButton(plusButtonDiv, context)\n section.appendChild(plusButtonDiv)\n }\n\n const attachmentOuter = section.appendChild(context.dom.createElement('table'))\n attachmentOuter.classList.add('edit-friends-attachment-outer')\n const attachmentOne = attachmentOuter.appendChild(context.dom.createElement('tr'))\n const attachmentRight = attachmentOne.appendChild(context.dom.createElement('td'))\n const attachmentTable = attachmentRight.appendChild(context.dom.createElement('table'))\n attachmentTable.classList.add('attachmentTable', 'table', 'table-striped', 'table-hover')\n\n ;(attachmentOuter as any).refresh = refresh(context.dom, attachmentTable, me, editableProfile, ns.foaf('knows')) // Participate in downstream changes\n\n refresh(context.dom, attachmentTable, me, editableProfile, ns.foaf('knows'))\n\n function createAddButton(buttonContainer: HTMLDivElement, context: DataBrowserContext) {\n\n const plus = buttonContainer.appendChild(widgets.button(context.dom, GREEN_PLUS, 'Add a friend', greenButtonHandler))\n const predicate = ns.foaf('knows')\n\n plus.setAttribute('class', 'add-button')\n plus.setAttribute('aria-label', 'Add a friend')\n const span = context.dom.createElement('span')\n span.textContent = 'Add a friend' // for screen readers\n span.setAttribute('class','span')\n buttonContainer.appendChild(span)\n\n async function greenButtonHandler (_event) {\n const webid = await widgets.askName(context.dom, store, buttonContainer, predicate, undefined, 'WebID of the friend you')\n\n if (!webid) {\n return\n }\n\n try {\n new URL(webid)\n } catch {\n complain(buttonContainer, context, 'Not a URL')\n return\n }\n\n try {\n await store.fetcher.load(store.sym(webid))\n } catch {\n complain(buttonContainer, context, 'Not a valid WebID')\n return\n }\n\n if (!isAWebID(store.sym(webid))) {\n complain(buttonContainer, context, 'WebID does not seem to exist')\n return\n }\n\n return saveNewThing(webid, context, predicate)\n .then(() => {\n refresh(context.dom, attachmentTable, me, editableProfile, predicate) // Update the button state after adding a friend\n })\n .catch((error) => {\n clearPreviousMessage(buttonContainer)\n complain(buttonContainer, context, error)\n })\n }\n }\n\n return section\n}\n\n","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { ns, widgets, icons } from 'solid-ui'\nimport { communitiesHeadingText } from '../texts'\nimport { store } from 'solid-logic'\nimport '../styles/editProfile.css'\nimport '../styles/profileRDFFormsEnforced.css'\nimport {\n clearPreviousMessage, complain\n} from '../buttonsHelper'\nimport { saveNewThing } from '../addMeToYourFriends'\nimport { isAWebID, refresh } from './editProfilePresenter'\n\nconst GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg'\n\nexport function EditProfileCommunitiesSection(context: DataBrowserContext, me: NamedNode, editableProfile: NamedNode | null) {\n const section = context.dom.createElement('section')\n section.setAttribute('aria-labelledby', 'edit-profile-communities-heading')\n section.classList.add('profileSection', 'section-bg')\n\n const header = context.dom.createElement('header')\n header.classList.add('text-center', 'mb-md')\n\n const heading = context.dom.createElement('h2')\n heading.id = 'edit-profile-communities-heading'\n heading.classList.add('section-title')\n heading.textContent = communitiesHeadingText\n header.appendChild(heading)\n section.appendChild(header)\n\nif (editableProfile) {\n let plusButtonDiv = context.dom.createElement('div')\n plusButtonDiv.classList.add('add-community-button-container')\n\n createAddButton(plusButtonDiv, context)\n section.appendChild(plusButtonDiv)\n }\n\n const attachmentOuter = section.appendChild(context.dom.createElement('table'))\n attachmentOuter.classList.add('edit-community-attachment-outer')\n const attachmentOne = attachmentOuter.appendChild(context.dom.createElement('tr'))\n const attachmentRight = attachmentOne.appendChild(context.dom.createElement('td'))\n const attachmentTable = attachmentRight.appendChild(context.dom.createElement('table'))\n attachmentTable.classList.add('attachmentTable', 'table', 'table-striped', 'table-hover')\n\n ;(attachmentOuter as any).refresh = refresh(context.dom, attachmentTable, me, editableProfile, ns.solid('community')) // Participate in downstream changes\n\n refresh(context.dom, attachmentTable, me, editableProfile, ns.solid('community'))\n\n function createAddButton(buttonContainer: HTMLDivElement, context: DataBrowserContext) {\n\n const plus = buttonContainer.appendChild(widgets.button(context.dom, GREEN_PLUS, 'Add a project or community', greenButtonHandler))\n const predicate = ns.solid('community')\n \n plus.setAttribute('class', 'add-button')\n plus.setAttribute('aria-label', 'Add a new community')\n const span = context.dom.createElement('span')\n span.textContent = 'Add a community or project' // for screen readers\n span.setAttribute('class','span')\n buttonContainer.appendChild(span)\n\n async function greenButtonHandler (_event) {\n const webid = await widgets.askName(context.dom, store, buttonContainer, predicate, undefined, 'WebID of')\n if (!webid) {\n return\n }\n\n try {\n new URL(webid)\n } catch {\n complain(buttonContainer, context, 'Not a URL')\n return\n }\n\n try {\n await store.fetcher.load(store.sym(webid))\n } catch {\n complain(buttonContainer, context, 'Not a valid WebID')\n return\n }\n\n if (!isAWebID(store.sym(webid))) {\n complain(buttonContainer, context, 'WebID does not seem to exist')\n return\n }\n \n return saveNewThing(webid, context, predicate)\n .then(() => {\n refresh(context.dom, attachmentTable, me, editableProfile, predicate) // Update the button state after adding a community\n })\n .catch((error) => {\n clearPreviousMessage(buttonContainer)\n complain(buttonContainer, context, error)\n })\n\n }\n }\n\n return section\n}\n","/**\n * Profile Editing App Pane\n *\n * Unlike view panes, this is available any place whatever the real subject,\n * and allows the user to edit their own profile.\n *\n * Usage: paneRegistry.register('/profile/editProfile.view')\n * or standalone script adding onto existing mashlib.\n */\n\nimport { PaneDefinition } from 'pane-registry'\nimport { NamedNode, Store } from 'rdflib'\nimport { icons, login, ns, widgets } from 'solid-ui'\nimport { EditContactsSection } from './EditContactsCard'\nimport { EditFriendsSection } from './EditFriendsCard'\nimport { EditSocialSection } from './EditSocialCard'\nimport { EditProfileCommunitiesSection } from './EditCommunitiesCard'\nimport '../styles/utilities.css'\nimport '../styles/profileRDFFormsEnforced.css'\nimport { EditCVSection } from './EditCVCard'\nimport { EditOtherPreferencesSection } from './EditOtherPreferences'\nimport { skipLabelsFromTabbing } from '../rdfFormsHelper'\n\nconst editProfileView: PaneDefinition = {\n global: true,\n\n icon: icons.iconBase + 'noun_492246.svg',\n\n name: 'editProfile',\n\n label: () => null, // don't use this in the normal solid-panes dispatching\n\n render: function (subject, context) {\n //console.log('@@@ render edit profile pane: subject, context', subject, context)\n const dom = context.dom\n const store = context.session.store as Store\n\n // Use <section> as the main container for better semantics\n const div = dom.createElement('section')\n div.setAttribute('data-testid', 'profile-editor')\n div.setAttribute('role', 'region')\n div.setAttribute('aria-label', 'Edit your profile')\n let editableProfile: NamedNode | null\n\n // Use <main> for the main content area, styled as a grid like ProfileView\n const main = dom.createElement('main')\n main.setAttribute('id', 'profile-edit-main-content')\n main.setAttribute('aria-busy', 'true')\n main.setAttribute('tabindex', '-1')\n main.classList.add('profile-grid', 'no-focus-ring')\n const mainHeading = dom.createElement('h1')\n mainHeading.classList.add('visually-hidden')\n mainHeading.textContent = 'Edit Profile'\n main.appendChild(mainHeading)\n div.appendChild(main)\n\n // Use <aside> for the status area\n const statusArea = dom.createElement('aside')\n statusArea.classList.add('p-sm')\n statusArea.setAttribute('role', 'status')\n statusArea.setAttribute('aria-live', 'polite')\n statusArea.setAttribute('aria-atomic', 'true')\n const ensureStatusArea = () => {\n if (!statusArea.isConnected) {\n div.appendChild(statusArea)\n }\n }\n\n const profileContext = {\n dom: dom,\n div: main,\n statusArea: statusArea,\n me: null\n }\n\n login.ensureLoadedProfile(profileContext)\n .then(theContext => {\n const me = theContext.me!\n\n const profile = me.doc()\n if (!store.updater) {\n throw new Error('Store has no updater')\n }\n if (store.any(me, ns.solid('editableProfile'))) {\n editableProfile = store.any(me, ns.solid('editableProfile')) as NamedNode\n } else if (store.updater.editable(profile.uri, store)) {\n editableProfile = profile\n } else {\n ensureStatusArea()\n statusArea.appendChild(widgets.errorMessageBlock(dom, `⚠️ Your profile ${profile} is not editable, so we cannot do much here.`, 'straw'))\n return\n }\n\n // Render each section as a card with consistent classes\n // Your contact information Section\n main.appendChild(EditContactsSection(context, me))\n\n // Resume Section\n main.appendChild(EditCVSection(context, me, editableProfile, store))\n\n // Social Accounts Section\n main.appendChild(EditSocialSection(context, me, editableProfile, store))\n\n \n // Other preferences Section\n main.appendChild(EditOtherPreferencesSection(context, me, editableProfile, store))\n \n // People you know Section\n main.appendChild(EditFriendsSection(context, me, editableProfile))\n \n // Communities you participate in Section\n main.appendChild(EditProfileCommunitiesSection(context, me, editableProfile))\n\n // Ensure keyboard navigation skips labels (including those rendered as links).\n skipLabelsFromTabbing(main)\n\n main.setAttribute('aria-busy', 'false')\n main.focus()\n \n }).catch(error => {\n ensureStatusArea()\n statusArea.appendChild(widgets.errorMessageBlock(dom, error, '#fee'))\n main.setAttribute('aria-busy', 'false')\n })\n return div\n }\n}\n\nexport default editProfileView\n","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode, Store} from 'rdflib'\nimport resumeForm from '../ontology/resumeForm.ttl'\nimport renderForm from '../rdfFormsHelper'\nimport { resumeHeadingText } from '../texts'\n\nconst resumeFormName = 'resumeForm.ttl' // The name of the form file\n\nexport function EditCVSection(context: DataBrowserContext, me: NamedNode, editableProfile: NamedNode | null, store: Store) {\n const section = context.dom.createElement('section')\n section.setAttribute('data-testid', 'edit-cv-section')\n section.setAttribute('aria-labelledby', 'edit-profile-cv-heading')\n section.classList.add('profileSection', 'section-bg', 'profile-form')\n\n const header = context.dom.createElement('header')\n header.classList.add('text-center', 'mb-md')\n\n const heading = context.dom.createElement('h2')\n heading.id = 'edit-profile-cv-heading'\n heading.classList.add('section-title')\n heading.textContent = resumeHeadingText\n\n header.appendChild(heading)\n section.appendChild(header)\n\n if (!editableProfile) {\n const comment1 = context.dom.createElement('p')\n comment1.classList.add('p-md')\n comment1.textContent = 'Login to add resume information to your profile.'\n section.appendChild(comment1)\n }\n\n renderForm(section, me, resumeForm, resumeFormName, store, context.dom, editableProfile)\n\n return section\n}\n","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode, Store} from 'rdflib'\nimport socialMediaForm from '../ontology/socialMedia.ttl'\nimport renderForm from '../rdfFormsHelper'\nimport { socialAccountsHeadingText } from '../texts'\n\nconst socialMediaFormName = 'socialMedia.ttl' // The name of the form file\n\nexport function EditSocialSection(context: DataBrowserContext, me: NamedNode, editableProfile: NamedNode | null, store: Store) {\n const section = context.dom.createElement('section')\n section.setAttribute('data-testid', 'edit-social-section')\n section.setAttribute('aria-labelledby', 'edit-profile-social-heading')\n section.classList.add('profileSection', 'section-bg', 'profile-form')\n\n const header = context.dom.createElement('header')\n header.classList.add('text-center', 'mb-md')\n\n const heading = context.dom.createElement('h2')\n heading.id = 'edit-profile-social-heading'\n heading.classList.add('section-title')\n heading.textContent = socialAccountsHeadingText\n\n header.appendChild(heading)\n section.appendChild(header)\n\n if (!editableProfile) {\n const comment1 = context.dom.createElement('p')\n comment1.classList.add('p-md')\n comment1.textContent = 'Login to add social media accounts to your profile.'\n section.appendChild(comment1)\n }\n\n renderForm(section, me, socialMediaForm, socialMediaFormName, store, context.dom, editableProfile)\n\n return section\n}\n","import { DataBrowserContext } from 'pane-registry'\nimport { NamedNode, Store} from 'rdflib'\nimport otherPreferencesForm from '../ontology/otherPreferencesForm.ttl'\nimport renderForm from '../rdfFormsHelper'\nimport { otherPreferencesHeadingText } from '../texts'\n\nconst otherPreferencesFormName = 'otherPreferencesForm.ttl' // The name of the form file\n\nexport function EditOtherPreferencesSection(context: DataBrowserContext, me: NamedNode, editableProfile: NamedNode | null, store: Store) {\n const section = context.dom.createElement('section')\n section.setAttribute('data-testid', 'edit-other-preferences-section')\n section.setAttribute('aria-labelledby', 'edit-profile-other-preferences-heading')\n section.classList.add('profileSection', 'section-bg', 'profile-form')\n\n const header = context.dom.createElement('header')\n header.classList.add('text-center', 'mb-md')\n\n const heading = context.dom.createElement('h2')\n heading.id = 'edit-profile-other-preferences-heading'\n heading.classList.add('section-title')\n heading.textContent = otherPreferencesHeadingText\n\n header.appendChild(heading)\n section.appendChild(header)\n\n renderForm(section, me, otherPreferencesForm, otherPreferencesFormName, store, context.dom, editableProfile)\n\n return section\n}\n","import { DataBrowserContext } from 'pane-registry'\nimport './styles/CVCard.css'\nimport './styles/ChatWithMe.css'\nimport './styles/FriendList.css'\nimport './styles/ProfileCard.css'\nimport './styles/ProfileView.css'\nimport './styles/QRCodeCard.css'\nimport './styles/SocialCard.css'\nimport './styles/StuffCard.css'\nimport './styles/utilities.css'\nimport { NamedNode, LiveStore } from 'rdflib'\nimport { render } from 'lit-html'\nimport { ProfileView } from './ProfileView'\nimport editProfileView from './editProfilePane/EditProfileView'\nimport { icons, ns } from 'solid-ui'\nimport * as qrcode from 'qrcode'\n\nasync function loadExtendedProfile(store: LiveStore, subject: NamedNode) {\n const otherProfiles = store.each(\n subject,\n ns.rdfs('seeAlso'),\n null,\n subject.doc()\n ) as Array<NamedNode>\n if (otherProfiles.length > 0) {\n await store.fetcher.load(otherProfiles)\n }\n}\n\n\nconst Pane = {\n global: false,\n icon: icons.iconBase + 'noun_15059.svg',\n name: 'profile',\n label: function (\n subject: NamedNode,\n context: DataBrowserContext\n ): string | null {\n const t = context.session.store.findTypeURIs(subject)\n if (\n t[ns.vcard('Individual').uri] ||\n t[ns.foaf('Person').uri] ||\n t[ns.schema('Person').uri]\n ) {\n return 'Profile'\n }\n return null\n },\n editor: editProfileView, \n render: (subject: NamedNode, context: DataBrowserContext): HTMLElement => {\n const target = context.dom.createElement('div')\n const store = context.session.store\n\n loadExtendedProfile(store, subject).then(async () => {\n render(await ProfileView(subject, context), target)\n const QRCodeEles = Array.from(target.getElementsByClassName('QRCode')) // was context.dom\n if (!QRCodeEles.length) return console.error('QRCode Ele missing')\n for (const QRCodeElement of QRCodeEles as HTMLElement[]) {\n const value = QRCodeElement.getAttribute('data-value')\n if (!value) return console.error('QRCode data-value missing')\n const highlightColor = QRCodeElement.getAttribute('highlightColor') || '#000000'\n const backgroundColor = QRCodeElement.getAttribute('backgroundColor') || '#ffffff'\n // console.log(`@@ qrcodes2 colours highlightColor ${highlightColor}, backgroundColor ${backgroundColor}`)\n\n const options = {\n type: 'svg',\n color: {\n dark: highlightColor,\n light: backgroundColor\n }\n }\n\n qrcode.toString(value, options, function (error, svg) {\n if (error) {\n console.error('QRcode error!', error)\n } else {\n // console.log('QRcode success.', svg);\n QRCodeElement.innerHTML = svg\n QRCodeElement.style.width = '80%'\n QRCodeElement.style.height = '80%'\n QRCodeElement.style.margin = '10%'\n }\n })\n\n }\n })\n\n return target\n },\n}\n\nexport default Pane\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__9426__","__WEBPACK_EXTERNAL_MODULE__5663__","__WEBPACK_EXTERNAL_MODULE__5491__","___CSS_LOADER_EXPORT___","push","id","cssWithMappingToString","list","toString","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","dijkstra","single_source_shortest_paths","graph","s","d","predecessors","costs","closest","u","v","cost_of_s_to_u","adjacent_nodes","cost_of_s_to_u_plus_cost_of_e","cost_of_s_to_v","open","PriorityQueue","make","empty","pop","value","cost","hasOwnProperty","msg","Error","extract_shortest_path_from_predecessor_list","nodes","reverse","find_path","opts","key","T","t","queue","sorter","default_sorter","a","b","sort","shift","canPromise","QRCode","CanvasRenderer","SvgRenderer","renderCanvas","renderFunc","canvas","text","cb","args","slice","call","arguments","argsNum","isLastArgCb","getContext","Promise","resolve","reject","create","e","bind","render","renderToDataURL","_","prototype","then","getSymbolSize","getRowColCoords","version","posCount","Math","floor","size","intervals","ceil","positions","getPositions","coords","pos","posLength","j","Mode","ALPHA_NUM_CHARS","AlphanumericData","mode","ALPHANUMERIC","getBitsLength","getLength","write","bitBuffer","indexOf","put","BitBuffer","buffer","get","index","bufIndex","num","putBit","getLengthInBits","bit","BitMatrix","Uint8Array","reservedBit","set","row","col","reserved","xor","isReserved","ByteData","BYTE","TextEncoder","encode","l","ECLevel","EC_BLOCKS_TABLE","EC_CODEWORDS_TABLE","getBlocksCount","errorCorrectionLevel","L","M","Q","H","getTotalCodewordsCount","isValid","level","from","defaultValue","string","toLowerCase","fromString","Utils","G15_BCH","getBCHDigit","getEncodedBits","mask","EXP_TABLE","LOG_TABLE","x","log","n","exp","mul","y","KanjiData","KANJI","toSJIS","Patterns","PATTERN000","PATTERN001","PATTERN010","PATTERN011","PATTERN100","PATTERN101","PATTERN110","PATTERN111","PenaltyScores","getMaskAt","maskPattern","isNaN","parseInt","getPenaltyN1","points","sameCountCol","sameCountRow","lastCol","lastRow","getPenaltyN2","last","getPenaltyN3","bitsCol","bitsRow","getPenaltyN4","darkCount","modulesCount","abs","applyMask","pattern","getBestMask","setupFormatFunc","numPatterns","Object","keys","bestPattern","lowerPenalty","Infinity","p","penalty","VersionCheck","Regex","NUMERIC","ccBits","MIXED","getCharCountIndicator","getBestModeForData","dataStr","testNumeric","testAlphanumeric","testKanji","NumericData","group","substr","remainingNum","GF","p1","p2","coeff","mod","divident","divisor","result","offset","generateECPolynomial","degree","poly","AlignmentPattern","FinderPattern","MaskPattern","ECCode","ReedSolomonEncoder","Version","FormatInfo","Segments","setupFormatInfo","matrix","bits","createData","segments","forEach","dataTotalCodewordsBits","getSymbolTotalCodewords","remainingByte","totalCodewords","ecTotalCodewords","dataTotalCodewords","ecTotalBlocks","blocksInGroup2","blocksInGroup1","totalCodewordsInGroup1","dataCodewordsInGroup1","dataCodewordsInGroup2","ecCount","rs","dcData","Array","ecData","maxDataSize","dataSize","max","r","createCodewords","createSymbol","isArray","fromArray","estimatedVersion","rawSegments","rawSplit","getBestVersionForData","bestVersion","dataBits","moduleCount","c","setupFinderPattern","setupTimingPattern","setupAlignmentPattern","setupVersionInfo","inc","bitIndex","byteIndex","dark","setupData","options","toSJISFunc","setToSJISFunction","Polynomial","genPoly","initialize","paddedData","remainder","start","buff","numeric","kanji","replace","byte","RegExp","BYTE_KANJI","TEST_KANJI","TEST_NUMERIC","TEST_ALPHANUMERIC","str","test","getStringByteLength","getSegments","regex","exec","getSegmentsFromString","numSegs","alphaNumSegs","byteSegs","kanjiSegs","isKanjiModeEnabled","s1","s2","obj","getSegmentBitsLength","buildSingleSegment","modesHint","bestMode","array","reduce","acc","seg","segs","buildNodes","table","prevNodeIds","nodeGroup","currentNodeIds","node","lastCount","prevNodeId","end","buildGraph","path","optimizedSegs","curr","prevSeg","mergeSegments","toSJISFunction","CODEWORDS_COUNT","digit","f","G18_BCH","getReservedBitsCount","getTotalBitsFromDataArray","totalBits","reservedBits","getCapacity","usableBits","ecl","currentVersion","getBestVersionForMixedData","getBestVersionForDataLength","qrData","canvasEl","document","createElement","getCanvasElement","getOptions","getImageWidth","ctx","image","createImageData","qrToImageData","clearRect","width","height","style","clearCanvas","putImageData","type","rendererOpts","toDataURL","quality","getColorAttrib","color","attrib","alpha","hex","toFixed","svgCmd","cmd","qrcodesize","margin","bg","light","moveBy","newRow","lineLength","qrToPath","viewBox","svgTag","hex2rgba","hexCode","split","apply","hexValue","g","scale","getScale","qrSize","imgData","qr","symbolSize","scaledMargin","palette","posDst","pxColor","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","_i","_index","memo","insert","target","styleTarget","querySelector","window","HTMLIFrameElement","contentDocument","head","getTarget","appendChild","element","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","m","o","defineProperty","enumerable","Symbol","toStringTag","__esModule","default","S","G","h","$","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","definition","prop","nc","locals","globalThis","trustedTypes","createPolicy","createHTML","random","createComment","iterator","_$litType$","strings","values","E","for","A","C","WeakMap","P","createTreeWalker","V","N","lastIndex","startsWith","constructor","parts","el","currentNode","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","name","ctor","I","z","removeAttribute","tagName","textContent","emptyScript","append","innerHTML","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","_$AU","creationScope","importNode","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","isConnected","startNode","endNode","_$AR","O","insertBefore","_$AC","_$AP","setConnected","fill","String","super","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","D","U","B","F","litHtmlPolyfillSupport","litHtmlVersions","_$Ct","_$Ci","delete","Set","has","add","_$AQ","reconnected","disconnected","setValue","disconnect","reconnect","deref","Y","pause","resume","_$CK","_$CX","_$CJ","async","commitValue","userNotLoggedInErrorMessage","addMeToYourFriendsButtonText","logInAddMeToYourFriendsButtonText","logInToChatWithMeButtonText","chatWithMeButtonText","resumeHeadingText","socialAccountsHeadingText","friendsHeadingText","complain","buttonContainer","context","error","errorBlock","widgets","errorMessageBlock","dom","setTimeout","focus","clearPreviousMessage","lastChild","checkIfAnyUserLoggedIn","me","createAddMeToYourFriendsButton","subject","label","authn","currentUser","toUpperCase","button","event","preventDefault","saveNewThing","ns","foaf","message","positiveFrontendMessageDiv","classList","mention","refreshButton","catch","needsBorder","store","session","checkIfThingExists","friendExists","refresh","predicate","fetcher","load","toBeInserted","st","doc","errorMessage","includes","whether","friends","editable","console","attachmentList","modify","noun","extractFriends","trim","presentProfile","utils","imageSrc","findImage","role","anyValue","vcard","orgName","address","any","countryName","locality","backgroundColor","highlightColor","solid","validColorOrDefault","getColors","pronouns","anyJS","them","their","pronounsAsText","introduction","formatIntroduction","location","formatLocation","fallback","validateHTMLColorHex","ORG","Namespace","typesOfRole","datesAsText","startDate","endDate","expandRdfList","collectionElements","elements","flatMap","rdf","items","current","rest","termType","presentCV","rolesByType","memberships","each","PastRole","CurrentRole","FutureRole","membership","orgHomePage","orgNameGiven","publicIdName","roleName","publicId","schema","dates","organization","escoRole","roleText0","roleText","holds","getRolesByType","skills","sk","manual","skillAsText","filter","skill","languages","lan","languageAsText","baseUri","renderForm","div","formSource","formName","editableProfile","whichForm","formUri","exactForm","formThis","loadDocument","appendForm","ok","mes","PLUS_ICON","isAddButton","img","src","querySelectorAll","btn","scope","cur","parentElement","before","Date","now","interval","setInterval","newInput","find","skipLabelsFromTabbing","clearInterval","enableFocusOnAdd","lastClick","clientX","clientY","repositionPopup","popup","win","defaultView","padding","maxWidth","innerWidth","maxHeight","innerHeight","position","zIndex","pointerEvents","opacity","visibility","rect","getBoundingClientRect","popupWidth","popupHeight","left","min","top","MutationObserver","mutations","mutation","addedNodes","HTMLElement","display","observe","childList","subtree","documentSource","documentName","documentURI","finalDocumentUri","sym","parse","selectors","tabIndex","DEFAULT_ICON_URI","icons","iconBase","presentSocial","nameForAccount","acName","rdfs","classes","classIcon","iconForAccount","acIcon","homepageForAccount","acHomepage","userProfilePrefix","accountAsObject","ac","icon","homepage","accountThings","visited","inner","accountNameSet","accounts","accountNameNode","accountName","iconForClass","typeIndex","solidLogicSingleton","getScopedAppInstances","iconForClassMap","pref","theClass","uri","presentStuff","stuff","klass","href","instance","hexToRgb","luminance","pow","hC","bC","ratio","hex1","hex2","rgb1","rgb2","lum1","lum2","contrastRatio","warn","FN","URL","container","hasAriaLabel","hasAttribute","hasAlt","BEGIN","Image","Line","heading","addMeToYourFriendsDiv","prefix","alt","cvData","futureRolesArr","currentRolesArr","pastRolesArr","skillsArr","languagesArr","hasFutureRole","hasCurrentRole","hasPastRole","hasSkills","hasLanguages","renderRoles","renderSkills","renderLanguages","roles","asList","strToUpperCase","renderRole","renderSkill","language","renderLan","strCase","charAt","substring","SocialData","account","renderAccount","profileBasics","stuffData","renderThings","renderThing","thing","personTR","renderThingAsDOM","things","cv","logic","longChatPane","paneRegistry","byName","chatContainer","title","exists","className","chat","getChat","chatArea","setButtonHandler","description","EditContactsSection","section","header","paneName","view","warning","innerText","viewContainer","Node","TEXT_NODE","paneDiv","attachmentTable","friendsList","all","friend","syncTableToArray","theTarget","profileImg","getProfileImg","opt","link","deleteFunction","statementsToDelete","statementsMatching","removeStatements","deleteAttachment","renderAsRow","createNewRow","isAWebID","findTypeURIs","GREEN_PLUS","editProfileView","global","main","mainHeading","statusArea","ensureStatusArea","profileContext","login","ensureLoadedProfile","theContext","profile","comment1","EditCVSection","EditSocialSection","EditOtherPreferencesSection","plusButtonDiv","plus","greenButtonHandler","span","_event","webid","askName","createAddButton","attachmentOuter","EditFriendsSection","EditProfileCommunitiesSection","Pane","editor","otherProfiles","loadExtendedProfile","renderBefore","_$litPart$","QRCodeEles","getElementsByClassName","QRCodeElement","svg"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"profile-pane.min.js","mappings":"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","sources":["webpack://ProfilePane/webpack/universalModuleDefinition","webpack://ProfilePane/./src/styles/BioSection.css","webpack://ProfilePane/./src/styles/CVCard.css","webpack://ProfilePane/./src/styles/ChatWithMe.css","webpack://ProfilePane/./src/styles/ContactInfoEditDialog.css","webpack://ProfilePane/./src/styles/EditDialogs.css","webpack://ProfilePane/./src/styles/HeadingSection.css","webpack://ProfilePane/./src/styles/ProfileCard.css","webpack://ProfilePane/./src/styles/ProfileView.css","webpack://ProfilePane/./src/styles/ProjectsCard.css","webpack://ProfilePane/./src/styles/QRCodeCard.css","webpack://ProfilePane/./src/styles/SocialCard.css","webpack://ProfilePane/./src/styles/dialog.css","webpack://ProfilePane/./src/styles/utilities.css","webpack://ProfilePane/./node_modules/css-loader/dist/runtime/api.js","webpack://ProfilePane/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://ProfilePane/./node_modules/dijkstrajs/dijkstra.js","webpack://ProfilePane/./node_modules/qrcode/lib/browser.js","webpack://ProfilePane/./node_modules/qrcode/lib/can-promise.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/alignment-pattern.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/alphanumeric-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/bit-buffer.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/bit-matrix.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/byte-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/error-correction-code.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/error-correction-level.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/finder-pattern.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/format-info.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/galois-field.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/kanji-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/mask-pattern.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/mode.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/numeric-data.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/polynomial.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/qrcode.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/reed-solomon-encoder.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/regex.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/segments.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/utils.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/version-check.js","webpack://ProfilePane/./node_modules/qrcode/lib/core/version.js","webpack://ProfilePane/./node_modules/qrcode/lib/renderer/canvas.js","webpack://ProfilePane/./node_modules/qrcode/lib/renderer/svg-tag.js","webpack://ProfilePane/./node_modules/qrcode/lib/renderer/utils.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://ProfilePane/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://ProfilePane/external umd \"SolidLogic\"","webpack://ProfilePane/external umd \"UI\"","webpack://ProfilePane/external umd \"rdflib\"","webpack://ProfilePane/webpack/bootstrap","webpack://ProfilePane/webpack/runtime/compat get default export","webpack://ProfilePane/webpack/runtime/define property getters","webpack://ProfilePane/webpack/runtime/global","webpack://ProfilePane/webpack/runtime/hasOwnProperty shorthand","webpack://ProfilePane/webpack/runtime/publicPath","webpack://ProfilePane/webpack/runtime/nonce","webpack://ProfilePane/./src/styles/CVCard.css?991d","webpack://ProfilePane/./src/styles/ChatWithMe.css?2963","webpack://ProfilePane/./src/styles/ProfileCard.css?4c2f","webpack://ProfilePane/./src/styles/ProfileView.css?48de","webpack://ProfilePane/./src/styles/QRCodeCard.css?9d8e","webpack://ProfilePane/./src/styles/SocialCard.css?9a5c","webpack://ProfilePane/./src/styles/utilities.css?4cc3","webpack://ProfilePane/./node_modules/lit-html/lit-html.js","webpack://ProfilePane/./src/texts.ts","webpack://ProfilePane/./src/QRCodeCard.ts","webpack://ProfilePane/./src/sections/shared/rdfList.ts","webpack://ProfilePane/./src/icons-svg/profileIcons.ts","webpack://ProfilePane/./src/rdfFormsHelper.ts","webpack://ProfilePane/./src/sections/social/constants.ts","webpack://ProfilePane/./src/sections/social/helpers.ts","webpack://ProfilePane/./src/sections/social/selectors.ts","webpack://ProfilePane/./src/sections/skills/selectors.ts","webpack://ProfilePane/./src/sections/languages/selectors.ts","webpack://ProfilePane/./src/sections/resume/selectors.ts","webpack://ProfilePane/./src/sections/contactInfo/selectors.ts","webpack://ProfilePane/./src/sections/education/selectors.ts","webpack://ProfilePane/./src/sections/projects/selectors.ts","webpack://ProfilePane/./src/sections/heading/selectors.ts","webpack://ProfilePane/./src/ProfileViewModelPresenter.ts","webpack://ProfilePane/./src/sections/bio/selectors.ts","webpack://ProfilePane/./src/styles/dialog.css?7694","webpack://ProfilePane/./src/ui/dialog.ts","webpack://ProfilePane/./src/styles/EditDialogs.css?c1bf","webpack://ProfilePane/./src/styles/ContactInfoEditDialog.css?3e0f","webpack://ProfilePane/./src/sections/shared/rdfMutationHelpers.ts","webpack://ProfilePane/./src/sections/shared/idNodeFactory.ts","webpack://ProfilePane/./src/sections/contactInfo/mutations.ts","webpack://ProfilePane/./src/sections/shared/phoneCountries.ts","webpack://ProfilePane/./src/textUtils.ts","webpack://ProfilePane/./src/sections/shared/contactTypeUtils.ts","webpack://ProfilePane/./src/sections/shared/rowState.ts","webpack://ProfilePane/./src/sections/shared/sanitizeUtils.ts","webpack://ProfilePane/./src/icons-svg/contactIcons.ts","webpack://ProfilePane/./src/sections/contactInfo/ContactInfoEditDialog.ts","webpack://ProfilePane/./src/sections/shared/sectionCardHelpers.ts","webpack://ProfilePane/./src/sections/shared/collapsibleSection.ts","webpack://ProfilePane/./src/sections/contactInfo/ContactInfoSection.ts","webpack://ProfilePane/./src/sections/languages/mutations.ts","webpack://ProfilePane/./src/sections/languages/LanguageEditDialog.ts","webpack://ProfilePane/./src/sections/languages/LanguageSection.ts","webpack://ProfilePane/./src/sections/skills/mutations.ts","webpack://ProfilePane/./src/sections/skills/SkillsEditDialog.ts","webpack://ProfilePane/./src/sections/skills/SkillsSection.ts","webpack://ProfilePane/./src/sections/resume/mutations.ts","webpack://ProfilePane/./src/sections/resume/ResumeEditDialog.ts","webpack://ProfilePane/./src/sections/resume/ResumeSection.ts","webpack://ProfilePane/./src/sections/projects/mutations.ts","webpack://ProfilePane/./src/sections/projects/ProjectEditDialog.ts","webpack://ProfilePane/./src/styles/ProjectsCard.css?e0d2","webpack://ProfilePane/./src/sections/projects/ProjectSection.ts","webpack://ProfilePane/./src/styles/HeadingSection.css?be59","webpack://ProfilePane/./src/sections/heading/mutations.ts","webpack://ProfilePane/./src/sections/heading/dateHelpers.ts","webpack://ProfilePane/./src/sections/heading/imageHelpers.ts","webpack://ProfilePane/./src/sections/heading/camera.ts","webpack://ProfilePane/./src/sections/heading/HeadingEditDialog.ts","webpack://ProfilePane/./src/sections/heading/HeadingSection.ts","webpack://ProfilePane/./src/styles/BioSection.css?d9ea","webpack://ProfilePane/./src/sections/bio/mutations.ts","webpack://ProfilePane/./src/sections/bio/BioEditDialog.ts","webpack://ProfilePane/./src/sections/bio/BioSection.ts","webpack://ProfilePane/./src/sections/social/mutations.ts","webpack://ProfilePane/./src/sections/social/SocialEditDialog.ts","webpack://ProfilePane/./src/sections/social/SocialSection.ts","webpack://ProfilePane/./src/ProfileView.ts","webpack://ProfilePane/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"SolidLogic\"), require(\"UI\"), require(\"rdflib\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"SolidLogic\", \"UI\", \"rdflib\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ProfilePane\"] = factory(require(\"SolidLogic\"), require(\"UI\"), require(\"rdflib\"));\n\telse\n\t\troot[\"ProfilePane\"] = factory(root[\"SolidLogic\"], root[\"UI\"], root[\"rdflib\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__5663__, __WEBPACK_EXTERNAL_MODULE__9426__, __WEBPACK_EXTERNAL_MODULE__5491__) => {\nreturn ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.bioDescriptionWrap {\n\tmargin: 0;\n\tposition: relative;\n\tisolation: isolate;\n}\n\n.bioDescriptionText {\n\tmargin: 0;\n\twidth: 100%;\n\tmax-width: none;\n\tdisplay: -webkit-box;\n\t-webkit-box-orient: vertical;\n\t-webkit-line-clamp: 3;\n\tline-clamp: 3;\n\tline-height: var(--line-height-base, 1.5);\n\tposition: relative;\n\toverflow: hidden;\n}\n\n.bioDescriptionText:not(.isExpanded)::after {\n\tcontent: '';\n\tposition: absolute;\n\tright: 0;\n\ttop: calc(100% - 1.5em);\n\twidth: 50%;\n\theight: 1.5em;\n\tbackground: var(--color-card-bg);\n\tpointer-events: none;\n}\n\n.bioDescriptionText.isExpanded {\n\tdisplay: block;\n\t-webkit-line-clamp: unset;\n\tline-clamp: unset;\n\toverflow: visible;\n}\n\n.bioDescriptionToggle {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tcolor: var(--color-primary);\n\tcursor: pointer;\n\tfont: inherit;\n\tfont-size: var(--font-size-sm);\n\tline-height: var(--line-height-base, 1.5);\n\tposition: absolute;\n\tleft: 50%;\n\tbottom: 0;\n\tbackground-color: var(--color-card-bg);\n\twhite-space: nowrap;\n\tmin-height: auto;\n\tmin-width: auto;\n\tpadding-left: 0;\n\tpadding-right: 0;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tz-index: 0;\n}\n\n.bioDescriptionWrap .bioDescriptionText:not(.isExpanded) + .bioDescriptionToggle {\n\ttop: calc(100% - 1.5em + 0.28em - 12px);\n\tbottom: auto;\n\ttransform: translateY(7px);\n}\n\n.bioDescriptionText.isExpanded + .bioDescriptionToggle {\n\tposition: static;\n\tdisplay: inline;\n\tpadding-left: 0;\n\ttop: auto;\n\tbottom: auto;\n\ttransform: none;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/BioSection.css\"],\"names\":[],\"mappings\":\"AAAA;CACC,SAAS;CACT,kBAAkB;CAClB,kBAAkB;AACnB;;AAEA;CACC,SAAS;CACT,WAAW;CACX,eAAe;CACf,oBAAoB;CACpB,4BAA4B;CAC5B,qBAAqB;CACrB,aAAa;CACb,yCAAyC;CACzC,kBAAkB;CAClB,gBAAgB;AACjB;;AAEA;CACC,WAAW;CACX,kBAAkB;CAClB,QAAQ;CACR,uBAAuB;CACvB,UAAU;CACV,aAAa;CACb,gCAAgC;CAChC,oBAAoB;AACrB;;AAEA;CACC,cAAc;CACd,yBAAyB;CACzB,iBAAiB;CACjB,iBAAiB;AAClB;;AAEA;CACC,SAAS;CACT,UAAU;CACV,SAAS;CACT,gBAAgB;CAChB,2BAA2B;CAC3B,eAAe;CACf,aAAa;CACb,8BAA8B;CAC9B,yCAAyC;CACzC,kBAAkB;CAClB,SAAS;CACT,SAAS;CACT,sCAAsC;CACtC,mBAAmB;CACnB,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,UAAU;AACX;;AAEA;CACC,uCAAuC;CACvC,YAAY;CACZ,0BAA0B;AAC3B;;AAEA;CACC,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,SAAS;CACT,YAAY;CACZ,eAAe;AAChB\",\"sourcesContent\":[\".bioDescriptionWrap {\\n\\tmargin: 0;\\n\\tposition: relative;\\n\\tisolation: isolate;\\n}\\n\\n.bioDescriptionText {\\n\\tmargin: 0;\\n\\twidth: 100%;\\n\\tmax-width: none;\\n\\tdisplay: -webkit-box;\\n\\t-webkit-box-orient: vertical;\\n\\t-webkit-line-clamp: 3;\\n\\tline-clamp: 3;\\n\\tline-height: var(--line-height-base, 1.5);\\n\\tposition: relative;\\n\\toverflow: hidden;\\n}\\n\\n.bioDescriptionText:not(.isExpanded)::after {\\n\\tcontent: '';\\n\\tposition: absolute;\\n\\tright: 0;\\n\\ttop: calc(100% - 1.5em);\\n\\twidth: 50%;\\n\\theight: 1.5em;\\n\\tbackground: var(--color-card-bg);\\n\\tpointer-events: none;\\n}\\n\\n.bioDescriptionText.isExpanded {\\n\\tdisplay: block;\\n\\t-webkit-line-clamp: unset;\\n\\tline-clamp: unset;\\n\\toverflow: visible;\\n}\\n\\n.bioDescriptionToggle {\\n\\tmargin: 0;\\n\\tpadding: 0;\\n\\tborder: 0;\\n\\tbackground: none;\\n\\tcolor: var(--color-primary);\\n\\tcursor: pointer;\\n\\tfont: inherit;\\n\\tfont-size: var(--font-size-sm);\\n\\tline-height: var(--line-height-base, 1.5);\\n\\tposition: absolute;\\n\\tleft: 50%;\\n\\tbottom: 0;\\n\\tbackground-color: var(--color-card-bg);\\n\\twhite-space: nowrap;\\n\\tmin-height: auto;\\n\\tmin-width: auto;\\n\\tpadding-left: 0;\\n\\tpadding-right: 0;\\n\\tpadding-top: 0;\\n\\tpadding-bottom: 0;\\n\\tmargin-left: 0;\\n\\tmargin-right: 0;\\n\\tz-index: 0;\\n}\\n\\n.bioDescriptionWrap .bioDescriptionText:not(.isExpanded) + .bioDescriptionToggle {\\n\\ttop: calc(100% - 1.5em + 0.28em - 12px);\\n\\tbottom: auto;\\n\\ttransform: translateY(7px);\\n}\\n\\n.bioDescriptionText.isExpanded + .bioDescriptionToggle {\\n\\tposition: static;\\n\\tdisplay: inline;\\n\\tpadding-left: 0;\\n\\ttop: auto;\\n\\tbottom: auto;\\n\\ttransform: none;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* CVCard.css */\n/* Note: Uses utilities: .section-title for cvOrg styling */\n\n.cvSection {\n margin-bottom: 1.25em;\n}\n\n.cvSection > ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.cvRole {\n margin: 0 0 var(--spacing-xs) 0;\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n\n.cvRole:last-child {\n margin-bottom: 0;\n}\n\n.cvRoleHeader {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: baseline;\n gap: var(--spacing-sm);\n}\n\n.cvRoleHeader h4,\n.cvRoleHeader time {\n margin: 0;\n}\n\n.cvRolePeriod {\n margin: 0;\n font-size: var(--font-size-sm);\n line-height: var(--line-height-tight);\n}\n\n@media (max-width: 640px) {\n .cvRoleHeader {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n\n.cvOrg {\n font-weight: 600;\n color: var(--color-primary);\n margin: 0;\n}\n\n.cvDescriptionWrap {\n margin: 0;\n position: relative;\n isolation: isolate;\n}\n\n.cvDescriptionText {\n margin: 0;\n width: 100%;\n max-width: none;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n line-height: var(--line-height-base);\n padding-right: 4.5em;\n overflow: hidden;\n}\n\n.cvDescriptionText.isExpanded {\n display: block;\n -webkit-line-clamp: unset;\n line-clamp: unset;\n padding-right: 0;\n overflow: visible;\n}\n\n.cvDescriptionToggle {\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n color: var(--color-primary);\n cursor: pointer;\n font: inherit;\n font-size: var(--font-size-sm);\n line-height: var(--line-height-base, 1.5);\n position: absolute;\n right: 0;\n bottom: 0;\n background-color: var(--color-card-bg);\n white-space: nowrap;\n min-height: auto;\n min-width: auto;\n padding-left: 0;\n padding-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n margin-left: 0;\n margin-right: 0;\n z-index: 0;\n}\n\n.cvDescriptionWrap .cvDescriptionText:not(.isExpanded) + .cvDescriptionToggle {\n top: calc(100% - 1.5em + 0.28em - 11px);\n bottom: auto;\n transform: translateY(7px);\n}\n\n.cvDescriptionText.isExpanded + .cvDescriptionToggle {\n position: static;\n display: inline;\n padding-left: 0;\n top: auto;\n bottom: auto;\n transform: none;\n}\n\n.cvSkill, .cvLanguage {\n text-align: left;\n margin: var(--spacing-xs) 0;\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n}\n\n.cvSection h3 {\n color: var(--color-text);\n font-size: var(--font-size-lg);\n font-weight: 600;\n line-height: var(--line-height-tight);\n margin-bottom: var(--spacing-xs);\n border-bottom: 1px solid var(--color-border-pale);\n padding-bottom: var(--spacing-xs);\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/CVCard.css\"],\"names\":[],\"mappings\":\"AAAA,eAAe;AACf,2DAA2D;;AAE3D;EACE,qBAAqB;AACvB;;AAEA;EACE,gBAAgB;EAChB,SAAS;EACT,UAAU;AACZ;;AAEA;EACE,+BAA+B;EAC/B,gCAAgC;EAChC,oCAAoC;EACpC,aAAa;EACb,sBAAsB;EACtB,MAAM;AACR;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,qBAAqB;EACrB,sBAAsB;AACxB;;AAEA;;EAEE,SAAS;AACX;;AAEA;EACE,SAAS;EACT,8BAA8B;EAC9B,qCAAqC;AACvC;;AAEA;EACE;IACE,sBAAsB;IACtB,uBAAuB;EACzB;AACF;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;EAC3B,SAAS;AACX;;AAEA;EACE,SAAS;EACT,kBAAkB;EAClB,kBAAkB;AACpB;;AAEA;EACE,SAAS;EACT,WAAW;EACX,eAAe;EACf,oBAAoB;EACpB,4BAA4B;EAC5B,qBAAqB;EACrB,aAAa;EACb,oCAAoC;EACpC,oBAAoB;EACpB,gBAAgB;AAClB;;AAEA;EACE,cAAc;EACd,yBAAyB;EACzB,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,SAAS;EACT,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,2BAA2B;EAC3B,eAAe;EACf,aAAa;EACb,8BAA8B;EAC9B,yCAAyC;EACzC,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,sCAAsC;EACtC,mBAAmB;EACnB,gBAAgB;EAChB,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,cAAc;EACd,iBAAiB;EACjB,cAAc;EACd,eAAe;EACf,UAAU;AACZ;;AAEA;EACE,uCAAuC;EACvC,YAAY;EACZ,0BAA0B;AAC5B;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,eAAe;EACf,SAAS;EACT,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;EAC3B,gCAAgC;EAChC,oCAAoC;AACtC;;AAEA;EACE,wBAAwB;EACxB,8BAA8B;EAC9B,gBAAgB;EAChB,qCAAqC;EACrC,gCAAgC;EAChC,iDAAiD;EACjD,iCAAiC;AACnC\",\"sourcesContent\":[\"/* CVCard.css */\\n/* Note: Uses utilities: .section-title for cvOrg styling */\\n\\n.cvSection {\\n margin-bottom: 1.25em;\\n}\\n\\n.cvSection > ul {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.cvRole {\\n margin: 0 0 var(--spacing-xs) 0;\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n display: flex;\\n flex-direction: column;\\n gap: 0;\\n}\\n\\n.cvRole:last-child {\\n margin-bottom: 0;\\n}\\n\\n.cvRoleHeader {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n align-items: baseline;\\n gap: var(--spacing-sm);\\n}\\n\\n.cvRoleHeader h4,\\n.cvRoleHeader time {\\n margin: 0;\\n}\\n\\n.cvRolePeriod {\\n margin: 0;\\n font-size: var(--font-size-sm);\\n line-height: var(--line-height-tight);\\n}\\n\\n@media (max-width: 640px) {\\n .cvRoleHeader {\\n flex-direction: column;\\n align-items: flex-start;\\n }\\n}\\n\\n.cvOrg {\\n font-weight: 600;\\n color: var(--color-primary);\\n margin: 0;\\n}\\n\\n.cvDescriptionWrap {\\n margin: 0;\\n position: relative;\\n isolation: isolate;\\n}\\n\\n.cvDescriptionText {\\n margin: 0;\\n width: 100%;\\n max-width: none;\\n display: -webkit-box;\\n -webkit-box-orient: vertical;\\n -webkit-line-clamp: 2;\\n line-clamp: 2;\\n line-height: var(--line-height-base);\\n padding-right: 4.5em;\\n overflow: hidden;\\n}\\n\\n.cvDescriptionText.isExpanded {\\n display: block;\\n -webkit-line-clamp: unset;\\n line-clamp: unset;\\n padding-right: 0;\\n overflow: visible;\\n}\\n\\n.cvDescriptionToggle {\\n margin: 0;\\n padding: 0;\\n border: 0;\\n background: none;\\n color: var(--color-primary);\\n cursor: pointer;\\n font: inherit;\\n font-size: var(--font-size-sm);\\n line-height: var(--line-height-base, 1.5);\\n position: absolute;\\n right: 0;\\n bottom: 0;\\n background-color: var(--color-card-bg);\\n white-space: nowrap;\\n min-height: auto;\\n min-width: auto;\\n padding-left: 0;\\n padding-right: 0;\\n padding-top: 0;\\n padding-bottom: 0;\\n margin-left: 0;\\n margin-right: 0;\\n z-index: 0;\\n}\\n\\n.cvDescriptionWrap .cvDescriptionText:not(.isExpanded) + .cvDescriptionToggle {\\n top: calc(100% - 1.5em + 0.28em - 11px);\\n bottom: auto;\\n transform: translateY(7px);\\n}\\n\\n.cvDescriptionText.isExpanded + .cvDescriptionToggle {\\n position: static;\\n display: inline;\\n padding-left: 0;\\n top: auto;\\n bottom: auto;\\n transform: none;\\n}\\n\\n.cvSkill, .cvLanguage {\\n text-align: left;\\n margin: var(--spacing-xs) 0;\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n}\\n\\n.cvSection h3 {\\n color: var(--color-text);\\n font-size: var(--font-size-lg);\\n font-weight: 600;\\n line-height: var(--line-height-tight);\\n margin-bottom: var(--spacing-xs);\\n border-bottom: 1px solid var(--color-border-pale);\\n padding-bottom: var(--spacing-xs);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ChatWithMe.css */\n/* Uses utilities: .section-centered, .loading-text, .btn-primary, .btn-transparent */\n\n.chatSection {\n overflow-x: auto;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ChatWithMe.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,qFAAqF;;AAErF;EACE,gBAAgB;AAClB\",\"sourcesContent\":[\"/* ChatWithMe.css */\\n/* Uses utilities: .section-centered, .loading-text, .btn-primary, .btn-transparent */\\n\\n.chatSection {\\n overflow-x: auto;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.profile__edit-form--contact-info .profile-edit-dialog__section {\n gap: 0;\n}\n\n.profile__edit-form--contact-info .profile-edit-dialog__section + .profile-edit-dialog__section {\n border-top: var(--border-width-sm, 0.1rem) solid var(--slate-200, #E2E8F0);\n padding-top: var(--spacing-xs, 0.75rem);\n}\n\n.profile__edit-form--contact-info .profile__section-header {\n margin-bottom: 0;\n}\n\n.profile__edit-form--contact-info .profile-edit-dialog__section fieldset {\n margin-top: 0.25rem;\n gap: var(--spacing-xs, 0.75rem);\n}\n\n.profile__edit-form--contact-info .profile-edit-dialog__section-heading {\n margin: 0;\n color: var(--gray-700, #364153);\n font-size: var(--font-size-md, 1rem); /* 16px */\n font-weight: var(--font-weight-md, 500);\n line-height: normal;\n}\n\n.profile-edit-dialog__phone-prefix-field {\n flex: 0 0 6.1rem;\n margin: 0;\n}\n\n.phonePrefixSelect,\n.profile-edit-dialog__phone-local-input {\n border: 0 !important;\n background: transparent;\n min-height: calc(var(--min-touch-target, 44px) - 2px);\n height: calc(var(--min-touch-target, 44px) - 2px);\n}\n\n.phonePrefixSelect {\n padding: 0 0.2rem 0 0;\n}\n\n.phonePrefixSelect:focus,\n.profile-edit-dialog__phone-local-input:focus {\n outline: none;\n}\n\n.profile-edit-dialog__phone-type-row {\n flex: 0 0 7.5rem;\n}\n\n.profile-edit-dialog__row--contact-point {\n max-width: 100%;\n width: 100%;\n border: 0;\n outline: 0;\n box-shadow: none;\n}\n\n.profile-edit-dialog__section fieldset > .profile-edit-dialog__row--contact-point {\n margin-bottom: var(--spacing-xs, 0.75rem);\n}\n\n.profile-edit-dialog__section fieldset > .profile-edit-dialog__row--contact-point:last-child {\n margin-bottom: var(--spacing-sm, 0.9375rem);\n}\n\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field,\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type,\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field > .label {\n border: 0;\n outline: 0;\n box-shadow: none;\n background: transparent;\n}\n\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field > .label {\n display: block;\n width: 100%;\n}\n\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.profile-edit-dialog__phone-type-row {\n flex: 0 0 6.5rem;\n width: 6.5rem;\n min-width: 6.5rem;\n}\n\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.emailTypeRow {\n flex: 0 0 6.5rem;\n width: 6.5rem;\n min-width: 6.5rem;\n}\n\n.profile-edit-dialog__row--address-header.profile-edit-dialog__row--full {\n max-width: 100%;\n width: 100%;\n align-items: center;\n}\n\n.profile-edit-dialog__row--address-header.profile-edit-dialog__row--full .profile-edit-dialog__actions {\n align-self: center;\n}\n\n.profile-edit-dialog__row--address-header.profile-edit-dialog__row--full .profile-edit-dialog__delete-button,\n#profile-modal .modal .profile-edit-dialog__row--address-header.profile-edit-dialog__row--full button.profile-edit-dialog__delete-button {\n min-height: 1.75rem;\n min-width: 1.75rem;\n}\n\n.profile-edit-dialog__address-title {\n margin: 0;\n font-size: var(--font-size-sm, 0.875rem);\n font-weight: var(--font-weight-medium, 500);\n line-height: var(--line-height-base, 1.5);\n}\n\n@media (max-width: 640px) {\n .profile-edit-dialog__row--contact-point {\n flex-direction: row;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--spacing-2xs, 0.625rem);\n }\n\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field {\n flex: 1 1 0;\n min-width: 0;\n }\n\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.profile-edit-dialog__phone-type-row,\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.emailTypeRow {\n flex: 0 0 5.5rem;\n width: 5.5rem;\n min-width: 5.5rem;\n max-width: 5.5rem;\n }\n\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__actions {\n flex: 0 0 auto;\n margin-left: 0;\n justify-content: flex-end;\n }\n\n .profile-edit-dialog__phone-prefix-field {\n flex: 0 0 5.75rem;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ContactInfoEditDialog.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,MAAM;AACR;;AAEA;EACE,0EAA0E;EAC1E,uCAAuC;AACzC;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;EACnB,+BAA+B;AACjC;;AAEA;EACE,SAAS;EACT,+BAA+B;EAC/B,oCAAoC,EAAE,SAAS;EAC/C,uCAAuC;EACvC,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,SAAS;AACX;;AAEA;;EAEE,oBAAoB;EACpB,uBAAuB;EACvB,qDAAqD;EACrD,iDAAiD;AACnD;;AAEA;EACE,qBAAqB;AACvB;;AAEA;;EAEE,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,WAAW;EACX,SAAS;EACT,UAAU;EACV,gBAAgB;AAClB;;AAEA;EACE,yCAAyC;AAC3C;;AAEA;EACE,2CAA2C;AAC7C;;AAEA;;;EAGE,SAAS;EACT,UAAU;EACV,gBAAgB;EAChB,uBAAuB;AACzB;;AAEA;EACE,cAAc;EACd,YAAY;AACd;;AAEA;EACE,cAAc;EACd,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,WAAW;EACX,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;;EAEE,mBAAmB;EACnB,kBAAkB;AACpB;;AAEA;EACE,SAAS;EACT,wCAAwC;EACxC,2CAA2C;EAC3C,yCAAyC;AAC3C;;AAEA;EACE;IACE,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,iCAAiC;EACnC;;EAEA;IACE,WAAW;IACX,YAAY;EACd;;EAEA;;IAEE,gBAAgB;IAChB,aAAa;IACb,iBAAiB;IACjB,iBAAiB;EACnB;;EAEA;IACE,cAAc;IACd,cAAc;IACd,yBAAyB;EAC3B;;EAEA;IACE,iBAAiB;EACnB;AACF\",\"sourcesContent\":[\".profile__edit-form--contact-info .profile-edit-dialog__section {\\n gap: 0;\\n}\\n\\n.profile__edit-form--contact-info .profile-edit-dialog__section + .profile-edit-dialog__section {\\n border-top: var(--border-width-sm, 0.1rem) solid var(--slate-200, #E2E8F0);\\n padding-top: var(--spacing-xs, 0.75rem);\\n}\\n\\n.profile__edit-form--contact-info .profile__section-header {\\n margin-bottom: 0;\\n}\\n\\n.profile__edit-form--contact-info .profile-edit-dialog__section fieldset {\\n margin-top: 0.25rem;\\n gap: var(--spacing-xs, 0.75rem);\\n}\\n\\n.profile__edit-form--contact-info .profile-edit-dialog__section-heading {\\n margin: 0;\\n color: var(--gray-700, #364153);\\n font-size: var(--font-size-md, 1rem); /* 16px */\\n font-weight: var(--font-weight-md, 500);\\n line-height: normal;\\n}\\n\\n.profile-edit-dialog__phone-prefix-field {\\n flex: 0 0 6.1rem;\\n margin: 0;\\n}\\n\\n.phonePrefixSelect,\\n.profile-edit-dialog__phone-local-input {\\n border: 0 !important;\\n background: transparent;\\n min-height: calc(var(--min-touch-target, 44px) - 2px);\\n height: calc(var(--min-touch-target, 44px) - 2px);\\n}\\n\\n.phonePrefixSelect {\\n padding: 0 0.2rem 0 0;\\n}\\n\\n.phonePrefixSelect:focus,\\n.profile-edit-dialog__phone-local-input:focus {\\n outline: none;\\n}\\n\\n.profile-edit-dialog__phone-type-row {\\n flex: 0 0 7.5rem;\\n}\\n\\n.profile-edit-dialog__row--contact-point {\\n max-width: 100%;\\n width: 100%;\\n border: 0;\\n outline: 0;\\n box-shadow: none;\\n}\\n\\n.profile-edit-dialog__section fieldset > .profile-edit-dialog__row--contact-point {\\n margin-bottom: var(--spacing-xs, 0.75rem);\\n}\\n\\n.profile-edit-dialog__section fieldset > .profile-edit-dialog__row--contact-point:last-child {\\n margin-bottom: var(--spacing-sm, 0.9375rem);\\n}\\n\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field,\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type,\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field > .label {\\n border: 0;\\n outline: 0;\\n box-shadow: none;\\n background: transparent;\\n}\\n\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field {\\n flex: 1 1 auto;\\n min-width: 0;\\n}\\n\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field > .label {\\n display: block;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.profile-edit-dialog__phone-type-row {\\n flex: 0 0 6.5rem;\\n width: 6.5rem;\\n min-width: 6.5rem;\\n}\\n\\n.profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.emailTypeRow {\\n flex: 0 0 6.5rem;\\n width: 6.5rem;\\n min-width: 6.5rem;\\n}\\n\\n.profile-edit-dialog__row--address-header.profile-edit-dialog__row--full {\\n max-width: 100%;\\n width: 100%;\\n align-items: center;\\n}\\n\\n.profile-edit-dialog__row--address-header.profile-edit-dialog__row--full .profile-edit-dialog__actions {\\n align-self: center;\\n}\\n\\n.profile-edit-dialog__row--address-header.profile-edit-dialog__row--full .profile-edit-dialog__delete-button,\\n#profile-modal .modal .profile-edit-dialog__row--address-header.profile-edit-dialog__row--full button.profile-edit-dialog__delete-button {\\n min-height: 1.75rem;\\n min-width: 1.75rem;\\n}\\n\\n.profile-edit-dialog__address-title {\\n margin: 0;\\n font-size: var(--font-size-sm, 0.875rem);\\n font-weight: var(--font-weight-medium, 500);\\n line-height: var(--line-height-base, 1.5);\\n}\\n\\n@media (max-width: 640px) {\\n .profile-edit-dialog__row--contact-point {\\n flex-direction: row;\\n align-items: center;\\n flex-wrap: nowrap;\\n gap: var(--spacing-2xs, 0.625rem);\\n }\\n\\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field {\\n flex: 1 1 0;\\n min-width: 0;\\n }\\n\\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.profile-edit-dialog__phone-type-row,\\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.emailTypeRow {\\n flex: 0 0 5.5rem;\\n width: 5.5rem;\\n min-width: 5.5rem;\\n max-width: 5.5rem;\\n }\\n\\n .profile-edit-dialog__row--contact-point > .profile-edit-dialog__actions {\\n flex: 0 0 auto;\\n margin-left: 0;\\n justify-content: flex-end;\\n }\\n\\n .profile-edit-dialog__phone-prefix-field {\\n flex: 0 0 5.75rem;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.profile-edit-dialog__section {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n}\n\n.profile__edit-form {\n width: 100%;\n}\n\n.profile-edit-dialog__section h4 {\n margin: 0;\n}\n\n.profile-edit-dialog__section fieldset {\n width: 100%;\n margin: 0;\n display: grid;\n gap: var(--spacing-sm);\n border: 0;\n padding: 0;\n min-inline-size: 0;\n}\n.profile-edit-dialog__field-description {\n color: var(--gray-600, #4A5565);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-normal, normal);\n line-height: var(--line-height-base, 1.5); /* 21px */\n}\n\n.profile-edit-dialog__bio-field-container {\n display: flex;\n width: 100%;\n max-width: 34rem;\n padding: 0;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xs, 0.75rem);\n box-sizing: border-box;\n margin: 0;\n}\n\n.profile-edit-dialog__row {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-sm);\n max-width: 34rem;\n}\n\n.profile-edit-dialog__section--resume fieldset {\n gap: var(--spacing-xs, 0.75rem);\n}\n\n.profile-edit-dialog__row--language {\n margin-left: calc(-1 * var(--spacing-xs, 0.75rem));\n}\n\n.profile-edit-dialog__row--social {\n margin-left: calc(-1 * var(--spacing-2xs, 0.625rem));\n max-width: 100%;\n width: 100%;\n}\n\n.profile-edit-dialog__field--social-type {\n flex: 0 0 7rem;\n width: 7rem;\n max-width: 7rem;\n}\n\n.profile-edit-dialog__field--social-url {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.profile-edit-dialog__row--full {\n max-width: 100%;\n width: 100%;\n}\n\n.profile-edit-dialog__row--project {\n max-width: 100%;\n width: 100%;\n}\n\n.profile-edit-dialog__row--resume-entry-header {\n align-items: center;\n border-bottom: 1px solid var(--gray-400, #99A1AF);\n}\n\n.profile-edit-dialog__row--resume-entry-header > .profile-edit-dialog__entry-heading {\n margin: 0;\n}\n\n.profile-edit-dialog__entry-heading {\n margin: 0;\n color: var(--gray-700, #364153);\n font-size: var(--font-size-sm, 0.875rem);\n font-style: normal;\n font-weight: var(--font-weight-md, 500);\n line-height: normal;\n}\n\n.educationEditSection .profile-edit-dialog__section-heading {\n margin: 0;\n color: var(--gray-700, #364153);\n font-size: 16px;\n font-weight: 500;\n}\n\n.profile-edit-dialog__row--resume-entry-header .profile-edit-dialog__delete-button,\n#profile-modal .modal .profile-edit-dialog__row--resume-entry-header button.profile-edit-dialog__delete-button {\n min-height: 1.75rem;\n min-width: 1.75rem;\n}\n\n/* Force two direct children to split the row into equal columns. */\n.profile-edit-dialog__row--equal > .profile-edit-dialog__field,\n.profile-edit-dialog__row--equal > .profile-edit-dialog__field-type {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.profile-edit-dialog__image-preview {\n display: grid;\n gap: var(--spacing-xs);\n}\n\n.profile-edit-dialog__image-preview-label,\n.profile-edit-dialog__image-preview-description {\n margin: 0;\n}\n\n.profile-edit-dialog__image-preview-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-xs);\n}\n\n.profile-edit-dialog__image-frame {\n position: relative;\n display: inline-block;\n line-height: 0;\n}\n\n.profile-edit-dialog__image-camera-button {\n display: none;\n position: absolute;\n right: var(--spacing-2xs, 0.625rem);\n bottom: var(--spacing-2xs, 0.625rem);\n z-index: 1;\n}\n\n/* Override modal-wide button defaults for the small camera overlay control. */\n#profile-modal .modal button.profile-edit-dialog__image-camera-button {\n display: none !important;\n position: absolute;\n right: var(--spacing-2xs, 0.625rem);\n bottom: var(--spacing-2xs, 0.625rem);\n width: 1.25rem;\n height: 1.25rem;\n min-width: 1.25rem;\n min-height: 1.25rem;\n padding: 3px;\n background: var(--white, #FFF);\n border-radius: 3.333px;\n box-shadow: 0 0 4.444px 0 rgba(0, 0, 0, 0.25);\n flex-shrink: 0;\n}\n\n.profile-edit-dialog__image-camera-button svg {\n width: 0.875rem !important;\n height: 0.875rem !important;\n display: block;\n flex-shrink: 0;\n}\n.profile-edit-dialog__image-camera-capture-row {\n display: flex;\n justify-content: center;\n width: 100%;\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__image-camera-capture-row {\n margin-bottom: calc(var(--spacing-lg, 1.25rem) / -2);\n}\n\n.profile-edit-dialog__image-camera-capture-frame {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n margin-left: auto;\n margin-right: auto;\n margin-top: calc(var(--spacing-xs, 0.625rem) / 2);\n margin-bottom: var(--spacing-xs, 0.625rem);\n padding: 10px;\n box-sizing: border-box;\n border: 1px solid var(--gray-200, #E5E7EB);\n border-radius: 8px;\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__image-camera-capture-frame {\n margin-top: calc(var(--spacing-xs, 0.625rem) / 4);\n margin-bottom: calc(var(--spacing-xs, 0.625rem) / 2);\n}\n\n.profile-edit-dialog__image-camera-capture-frame[hidden] {\n display: none;\n}\n\n.profile-edit-dialog__image-camera-capture-frame table {\n border-collapse: collapse;\n width: 100%;\n table-layout: fixed;\n}\n\n.profile-edit-dialog__image-camera-capture-frame td {\n text-align: center;\n vertical-align: middle;\n}\n\n.profile-edit-dialog__image-camera-capture-frame tr:last-child {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: var(--spacing-2xs, 0.625rem);\n}\n\n.profile-edit-dialog__image-camera-capture-frame tr:last-child td {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: auto;\n}\n\n.profile-edit-dialog__image-camera-capture-frame tr:last-child td:first-child {\n margin-right: auto;\n}\n\n#profile-modal .modal .profile-edit-dialog__image-camera-capture-frame tr:last-child td:first-child button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.profile-edit-dialog__camera-control {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.profile-edit-dialog__camera-control-actions {\n display: flex;\n align-items: center;\n justify-content: center !important;\n gap: var(--spacing-2xs, 0.625rem);\n width: max-content;\n margin-left: auto;\n margin-right: auto;\n margin-top: calc(var(--spacing-2xs, 0.625rem) / 2);\n align-self: center;\n}\n\n.profile-edit-dialog__camera-control-cancel {\n position: absolute;\n top: 0;\n right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0 !important;\n background: transparent !important;\n box-shadow: none !important;\n color: var(--gray-600, #4A5565) !important;\n margin-right: 0 !important;\n}\n\n.profile-edit-dialog__camera-control-cancel svg {\n display: block;\n}\n\n#profile-modal .modal .profile-edit-dialog__camera-control-cancel:hover,\n#profile-modal .modal .profile-edit-dialog__camera-control-cancel:focus-visible {\n background: transparent !important;\n border: 0 !important;\n color: var(--gray-900, #101828) !important;\n}\n/* display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: 2rem;\n padding: 0.25rem 0.625rem;\n border: 1px solid var(--gray-300, #D5D7DA) !important;\n -- background: var(--gray-200, #E5E7EB) !important; \n background: var(--gray-100, #FFF) !important;\n color: var(--gray-700, #364153) !important;\n box-shadow: none !important;\n border-radius: 0.375rem;\n font-weight: var(--font-weight-md, 500); */\n.profile-edit-dialog__camera-control-action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-size: var(--font-size-xxs, 0.75rem) !important; /* 12 px */\n font-weight: var(--font-weight-xbold, 700) !important;\n line-height: var(--line-height-base, 1.5) !important; /* 150% */\n border-radius: var(--border-radius-base, 0.3125rem) !important;\n border: 0.8px solid var(--gray-300, #D1D5DC) !important;\n color: var(--gray-900, #101828) !important;\n background: var(--white, #FFF) !important;\n padding: 6.6px 11.075px 7px 12.8px !important;\n}\n\n#profile-modal .modal .profile-edit-dialog__camera-control-actions button:hover,\n#profile-modal .modal .profile-edit-dialog__camera-control-actions button:focus-visible {\n background: var(--gray-100, #F3F4F6) !important;\n border-color: var(--gray-400, #99A1AF) !important;\n}\n\n.profile-edit-dialog__image-camera-capture-frame video,\n.profile-edit-dialog__image-camera-capture-frame canvas {\n display: block;\n width: 100%;\n max-width: 260px;\n height: auto;\n border-radius: 0.5rem;\n margin: 0 auto;\n}\n\n#profile-modal .modal .profile-edit-dialog__image-camera-capture-frame button {\n font-size: var(--font-size-sm, 0.875rem);\n}\n\n.profile-edit-dialog__image-upload-button,\n.profile-edit-dialog__image-remove-button {\n min-height: var(--min-touch-target, 44px);\n padding: 0 var(--spacing-sm);\n}\n\n.profile-edit-dialog__field,\n.profile-edit-dialog__field-type {\n display: block;\n margin: 0;\n}\n\n.profile-edit-dialog__field-type {\n width: 100%;\n}\n\n.profile-edit-dialog__field {\n /* flex: 1 1 auto; */\n min-width: 0;\n}\n\n.profile__edit-form--resume .profile-edit-dialog__field,\n.profile__edit-form--resume .profile-edit-dialog__field-type:not(.hidden),\n.profile__edit-form--contact-info .profile-edit-dialog__field,\n.profile__edit-form--contact-info .profile-edit-dialog__field-type:not(.hidden) {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--spacing-xxs, 0.3125rem);\n flex: 1 0 0;\n}\n\n.profile__edit-form--resume .profile-edit-dialog__row {\n max-width: 100%;\n width: 100%;\n}\n\n.profile__edit-form--resume .profile-edit-dialog__section fieldset > .profile-edit-dialog__field {\n max-width: 100%;\n}\n\n.profile__edit-form--resume .profile-edit-dialog__field > input,\n.profile__edit-form--resume .profile-edit-dialog__field > select,\n.profile__edit-form--resume .profile-edit-dialog__field > textarea,\n.profile__edit-form--resume .profile-edit-dialog__field-type > input,\n.profile__edit-form--resume .profile-edit-dialog__field-type > select,\n.profile__edit-form--resume .profile-edit-dialog__field-type > textarea,\n.profile__edit-form--contact-info .profile-edit-dialog__field > input,\n.profile__edit-form--contact-info .profile-edit-dialog__field > select,\n.profile__edit-form--contact-info .profile-edit-dialog__field > textarea,\n.profile__edit-form--contact-info .profile-edit-dialog__field-type > input,\n.profile__edit-form--contact-info .profile-edit-dialog__field-type > select,\n.profile__edit-form--contact-info .profile-edit-dialog__field-type > textarea {\n align-self: stretch;\n}\n\n.profile-edit-dialog__field--resume-location {\n flex: 1 0 0;\n width: auto;\n max-width: none;\n}\n\n.profile-edit-dialog__row--resume-dates {\n max-width: 100%;\n width: 100%;\n}\n\n.profile-edit-dialog__field--date-group {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.profile-edit-dialog__date-pair {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n width: 100%;\n}\n\n.profile-edit-dialog__date-pair > select {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.profile-edit-dialog__field--stack {\n display: grid;\n gap: var(--spacing-xxs);\n}\n\n.profile-edit-dialog__field--stack > small {\n display: block;\n width: 100%;\n text-align: right;\n}\n\n.profile-edit-dialog__bio-field-container > small {\n align-self: flex-end;\n text-align: right;\n}\n\n.profile-edit-dialog__field--full {\n max-width: 100% !important;\n width: 100%;\n}\n\n.profile-edit-dialog__field--row-width {\n max-width: 34rem;\n width: 100%;\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__row,\n.profile-edit-dialog--heading .profile-edit-dialog__field--row-width {\n max-width: 100%;\n width: 100%;\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo {\n padding-bottom: calc(var(--spacing-sm, 0.938rem) / 2);\n margin-bottom: calc(var(--spacing-sm, 0.938rem) / 2);\n border-bottom: 1px solid var(--slate-200, #E2E8F0);\n}\n\n.profile-edit-dialog--heading .profile-edit {\n gap: calc(var(--spacing-lg, 1.25rem) / 2);\n}\n\n.profile-edit-dialog__login-message {\n margin: 0;\n font-size: var(--font-size-xs, 0.75rem);\n color: var(--red-600, #E7000B);\n}\n\n.profile-edit-dialog__section + .profile-edit-dialog__login-message {\n margin-top: var(--spacing-sm, 0.938rem);\n}\n\n.profile__edit-form--projects .profile-edit-dialog__login-message {\n margin-top: var(--spacing-sm, 0.938rem);\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point {\n max-width: 100%;\n width: 100%;\n gap: var(--spacing-2xs, 0.625rem);\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field {\n flex: 1 1 0;\n min-width: 0;\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field > .label {\n display: block;\n width: 100%;\n}\n\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point.profile-edit-dialog__row--equal > .profile-edit-dialog__field-type.profile-edit-dialog__field-type--contact-point {\n flex: 0 0 6.4375rem;\n width: 6.4375rem;\n min-width: 6.4375rem;\n max-width: 6.4375rem;\n}\n\n.profile-edit-dialog__field-type--contact-point select {\n width: auto;\n max-width: none;\n min-width: 6.4375rem;\n}\n\n.profile-edit-dialog__row--address-header {\n max-width: 34rem;\n align-items: flex-end;\n}\n\n.profile-edit-dialog__row--inline-end {\n justify-content: flex-end;\n max-width: 100%;\n}\n\n.profile-edit-dialog__checkbox-label {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-xs);\n margin-left: auto;\n cursor: pointer;\n}\n\n.profile-edit-dialog__checkbox-input {\n width: 1rem;\n height: 1rem;\n margin: 0;\n flex: 0 0 auto;\n accent-color: var(--color-primary, #7C4DFF);\n cursor: pointer;\n}\n\n.profile-edit-dialog__checkbox-input:focus-visible {\n outline: var(--focus-indicator-width, 2px) solid var(--color-primary, #7C4DFF);\n outline-offset: 2px;\n}\n\n.profile-edit-dialog__checkbox-input:disabled {\n opacity: var(--opacity-disabled, 0.5);\n}\n\n/* The street-address row is a standalone label, so cap its width like the flex rows. */\n.profile-edit-dialog__section fieldset > .profile-edit-dialog__field {\n max-width: 34rem;\n}\n\n.profile-edit-dialog__field-type--wide {\n flex: 1 1 auto;\n min-width: 0;\n width: 100%;\n max-width: 100%;\n}\n\n.profile-edit-dialog__field-type--contact-point {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n align-self: flex-start;\n}\n\n.profile-edit-dialog__actions {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.profile-edit-dialog__actions--edge {\n margin-left: auto;\n}\n\n.profile-edit-dialog__input-wrap {\n position: relative;\n width: 100%;\n}\n\n.profile-edit-dialog__input--with-action {\n width: 100%;\n box-sizing: border-box;\n padding-right: 7.5rem;\n}\n\n.profile-edit-dialog__input--with-leading-icon {\n width: 100%;\n box-sizing: border-box;\n padding-left: 2.1rem;\n}\n\n.profile-edit-dialog__search-icon {\n position: absolute;\n left: var(--spacing-2xs, 0.625rem);\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--gray-400, #99A1AF);\n pointer-events: none;\n z-index: 1;\n}\n\n.profile-edit-dialog__search-icon svg {\n display: block;\n width: 0.8125rem;\n height: 0.8125rem;\n}\n\n.profile-edit-dialog__delete-button {\n min-height: var(--min-touch-target, 44px);\n min-width: var(--min-touch-target, 44px);\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n#profile-modal .modal button.profile-edit-dialog__delete-button {\n min-height: var(--min-touch-target, 44px);\n min-width: var(--min-touch-target, 44px);\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: inherit;\n box-shadow: none;\n}\n\n.profile-edit-dialog__delete-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.1rem;\n height: 1.1rem;\n fill: currentColor;\n}\n\n.profile-edit-dialog__delete-icon svg {\n width: 1.1rem;\n height: 1.1rem;\n}\n\n.profile-edit-dialog__delete-button:hover,\n.profile-edit-dialog__delete-button:focus-visible {\n color: var(--color-danger, #b42318);\n}\n\n.profile-edit-dialog__image-button {\n text-align: center;\n font-size: var(--font-size-xxs, 0.75rem); /* 12 px */\n font-weight: var(--font-weight-xbold, 700);\n line-height: var(--line-height-base, 1.5); /* 150% */\n border-radius: var(--border-radius-base, 0.3125rem);\n border: 0.8px solid var(--gray-300, #D1D5DC);\n}\n\n.profile-edit-dialog__image-upload-button {\n color: var(--gray-900, #101828);\n border: 0.8px solid var(--gray-300, #D1D5DC);\n background: var(--white, #FFF);\n padding: 6.6px 11.075px 7px 12.8px;\n}\n\n.profile-edit-dialog__image-remove-button {\n color: var(--red-600, #E7000B);\n padding: 6.6px 13.037px 7px 13.8px;\n border: 0.8px solid rgba(0, 0, 0, 0.00);\n background: var(--gray-100, #F3F4F6);\n}\n\n#profile-modal .modal .profile-edit-dialog__image-upload-button:hover,\n#profile-modal .modal .profile-edit-dialog__image-upload-button:focus-visible,\n#profile-modal .modal .profile-edit-dialog__image-remove-button:hover,\n#profile-modal .modal .profile-edit-dialog__image-remove-button:focus-visible {\n background: var(--gray-100, #F3F4F6) !important;\n border-color: var(--gray-400, #99A1AF) !important;\n}\n\n/* Placeholder class for project paste action styling. */\n.profile-edit-dialog__paste-button {\n display: flex;\n padding: 0.25rem 0.375rem; /* 4px 6px */\n align-items: center;\n position: absolute;\n background: var(--white, #fff);\n border: 0;\n outline: none;\n white-space: nowrap;\n right: var(--spacing-2xs, 0.625rem);\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n color: var(--gray-500, #6A7282);\n font-size: 0.75rem; /* 12px */\n font-weight: var(--font-weight-normal, 400);\n}\n\n.profile-edit-dialog__paste-button:focus,\n.profile-edit-dialog__paste-button:focus-visible {\n outline: none;\n}\n\n/* remove the regular button styling for paste */\n#profile-modal .modal button.profile-edit-dialog__paste-button,\n#profile-modal .modal button.profile-edit-dialog__paste-button:hover,\n#profile-modal .modal button.profile-edit-dialog__paste-button:focus,\n#profile-modal .modal button.profile-edit-dialog__paste-button:focus-visible,\n#profile-modal .modal button.profile-edit-dialog__paste-button:active {\n border: 0;\n outline: none;\n box-shadow: none;\n -webkit-appearance: none;\n appearance: none;\n}\n.profile-edit-dialog__paste-icon {\n width: 0.694rem; /* 11.105px */\n height: 0.813rem; /* 13.038px */\n fill: var(--gray-500, #6A7282);\n}\n#profile-modal .modal button.profile-edit-dialog__drag-handle {\n min-height: 1.75rem;\n min-width: 1.75rem;\n padding: 0;\n border: 0;\n background: transparent;\n box-shadow: none;\n}\n\n.profile-edit-dialog__row--drop-target {\n outline: 1px dashed var(--gray-400, #99A1AF);\n outline-offset: 2px;\n}\n\n#profile-modal .modal button.profile-edit-dialog__delete-button:hover,\n#profile-modal .modal button.profile-edit-dialog__delete-button:focus-visible {\n border: 0;\n background: transparent;\n color: var(--color-danger, #b42318);\n}\n\n.profile-edit-dialog__field input,\n.profile-edit-dialog__field select,\n.profile-edit-dialog__field-type input,\n.profile-edit-dialog__field-type select {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n min-height: var(--min-touch-target, 44px);\n height: var(--min-touch-target, 44px);\n border-radius: var(--border-radius-base, 0.3125rem);\n border: 1px solid var(--gray-400, #99A1AF);\n background: var(--white, #FFF);\n color: var(--gray-900, #101828);\n font-size: var(--font-size-sm, 0.875rem);\n font-weight: var(--font-weight-medium, 500);\n padding: var(--spacing-2xs, 0.625rem);\n}\n\n.profile-edit-dialog__field input.profile-edit-dialog__input--with-leading-icon {\n padding-left: 2.1rem;\n}\n\n/* Keep phone/email contact-point type selects compact. */\n.profile-edit-dialog__field-type--contact-point > select {\n display: inline-block;\n width: auto !important;\n max-width: none !important;\n min-width: 0 !important;\n}\n\n/* In heading edit, force both type selects to fill the same fixed wrapper width. */\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.profile-edit-dialog__field-type--contact-point > select {\n display: block;\n width: 100% !important;\n min-width: 0 !important;\n max-width: 100% !important;\n}\n\n/* Keep phone/email type selects compact after the generic full-width rule above. */\n.profile-edit-dialog__field-type--contact-point select {\n width: fit-content;\n max-width: none;\n min-width: 6.4375rem;\n}\n\n.profile-edit-dialog__textarea {\n color: var(--gray-900, #101828);\n font-size: var(--font-size-sm, 0.875rem);\n font-weight: var(--font-weight-md, 500);\n line-height: var(--line-height-loose, 1.6); /* 22.4px */\n border-radius: var(--border-radius-base, 0.3125rem);\n border: var(--border-width-sm, 0.1rem) solid var(--gray-400, #99A1AF);\n background: var(--white, #FFF);\n}\n\n.profile-edit-dialog__field textarea,\n.profile-edit-dialog__field-type textarea {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n min-height: var(--min-touch-target, 44px);\n}\n\n/* Dedicated hook for the social account type select in SocialEditDialog. */\n.profile-edit-dialog__social-account-select {\n display: block;\n width: 100%;\n min-width: 0;\n max-width: 100%;\n box-sizing: border-box;\n min-height: var(--min-touch-target, 44px);\n height: var(--min-touch-target, 44px);\n border-radius: var(--border-radius-base, 0.3125rem);\n border: 1px solid var(--gray-400, #99A1AF);\n background: var(--white, #FFF);\n color: var(--gray-900, #101828);\n font-size: var(--font-size-sm, 0.875rem);\n font-weight: var(--font-weight-medium, 500);\n padding: var(--spacing-2xs, 0.625rem);\n\n\n}\n\n.profile-edit-dialog__bio-field-container textarea {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n min-height: var(--min-touch-target, 44px);\n}\n\n.profile-edit-dialog__textarea {\n min-height: 10rem !important;\n height: auto;\n resize: vertical;\n}\n\n.profile-edit-dialog__field--stack small {\n justify-self: end;\n text-align: right;\n}\n\n@media (max-width: 640px) {\n .profile-edit-dialog__row {\n max-width: 100%;\n flex-direction: column;\n align-items: stretch;\n }\n\n .profile-edit-dialog__row--equal > .profile-edit-dialog__field,\n .profile-edit-dialog__row--equal > .profile-edit-dialog__field-type {\n flex: 1 1 auto;\n }\n\n .profile-edit-dialog__field-type {\n flex: 1 1 auto;\n }\n\n .profile-edit-dialog__field-type--contact-point {\n flex: 1 1 auto;\n max-width: 100%;\n }\n\n .profile-edit-dialog__row--address-header {\n flex-direction: row;\n align-items: flex-end;\n }\n\n .profile-edit-dialog__row--social {\n margin-left: 0;\n gap: var(--spacing-2xs, 0.625rem);\n flex-direction: row;\n align-items: center;\n flex-wrap: nowrap;\n }\n\n .profile-edit-dialog__row--social .profile-edit-dialog__social-icon {\n width: 1.5rem;\n height: 1.5rem;\n }\n\n .profile-edit-dialog__field--social-type {\n flex: 0 0 5.5rem;\n width: 5.5rem;\n max-width: 5.5rem;\n }\n\n .profile-edit-dialog__field--social-url {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .profile-edit-dialog__field--resume-location {\n flex: 1 1 100%;\n width: 100%;\n max-width: 100%;\n }\n\n .profile-edit-dialog__row--language {\n flex-direction: row;\n align-items: center;\n flex-wrap: nowrap;\n }\n\n .profile-edit-dialog__row--language > .profile-edit-dialog__field {\n flex: 1 1 0;\n min-width: 0;\n }\n\n .profile-edit-dialog__row--resume-entry-header {\n flex-direction: row;\n align-items: center;\n flex-wrap: nowrap;\n width: 100%;\n max-width: 100%;\n }\n\n .profile-edit-dialog__row--resume-entry-header > .profile-edit-dialog__actions--edge {\n margin-left: auto;\n }\n\n .profile-edit-dialog__row--skill {\n flex-direction: row;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--spacing-2xs, 0.625rem);\n }\n\n .profile-edit-dialog__row--skill > .profile-edit-dialog__field {\n flex: 1 1 0;\n min-width: 0;\n }\n\n .profile-edit-dialog__row--skill > .profile-edit-dialog__actions {\n flex: 0 0 auto;\n margin-left: 0;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo {\n flex-direction: row;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--spacing-xs, 0.75rem);\n width: 100%;\n max-width: 100%;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo > header {\n margin-bottom: 0;\n flex: 0 0 auto;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile__hero,\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile__hero-alt {\n width: 5.5rem;\n height: 5.5rem;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile__hero-alt {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-camera-button {\n display: inline-flex;\n right: var(--spacing-xxs, 0.3125rem);\n bottom: var(--spacing-xxs, 0.3125rem);\n width: 1.875rem;\n min-width: 1.875rem;\n min-height: 1.875rem;\n }\n\n #profile-modal .modal button.profile-edit-dialog__image-camera-button {\n display: inline-flex !important;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview {\n flex: 1 1 auto;\n min-width: 0;\n gap: var(--spacing-xxs, 0.3125rem);\n width: 100%;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview-label {\n font-size: var(--font-size-sm, 0.875rem);\n line-height: var(--line-height-tight, 1.25);\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview-description {\n font-size: 10px;\n line-height: var(--line-height-base, 1.4);\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview-actions {\n flex-wrap: nowrap;\n gap: var(--spacing-xs, 0.5rem);\n width: 100%;\n }\n\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-button {\n flex: 1 1 0;\n width: 100%;\n padding: 0 0.75rem;\n }\n\n .profile-edit-dialog__row--inline-end {\n justify-content: flex-start;\n }\n\n .profile-edit-dialog__actions {\n justify-content: flex-start;\n }\n\n .profile-edit-dialog__row--address-header .profile-edit-dialog__actions {\n justify-content: flex-end;\n }\n\n .profile-edit-dialog__textarea {\n min-height: 15rem !important;\n }\n\n .profile-edit-dialog__input-help-text {\n display: none;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/EditDialogs.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\".profile-edit-dialog__section {\\n display: flex;\\n flex-direction: column;\\n gap: var(--spacing-xs);\\n}\\n\\n.profile__edit-form {\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__section h4 {\\n margin: 0;\\n}\\n\\n.profile-edit-dialog__section fieldset {\\n width: 100%;\\n margin: 0;\\n display: grid;\\n gap: var(--spacing-sm);\\n border: 0;\\n padding: 0;\\n min-inline-size: 0;\\n}\\n.profile-edit-dialog__field-description {\\n color: var(--gray-600, #4A5565);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-normal, normal);\\n line-height: var(--line-height-base, 1.5); /* 21px */\\n}\\n\\n.profile-edit-dialog__bio-field-container {\\n display: flex;\\n width: 100%;\\n max-width: 34rem;\\n padding: 0;\\n flex-direction: column;\\n align-items: flex-start;\\n gap: var(--spacing-xs, 0.75rem);\\n box-sizing: border-box;\\n margin: 0;\\n}\\n\\n.profile-edit-dialog__row {\\n display: flex;\\n align-items: flex-start;\\n gap: var(--spacing-sm);\\n max-width: 34rem;\\n}\\n\\n.profile-edit-dialog__section--resume fieldset {\\n gap: var(--spacing-xs, 0.75rem);\\n}\\n\\n.profile-edit-dialog__row--language {\\n margin-left: calc(-1 * var(--spacing-xs, 0.75rem));\\n}\\n\\n.profile-edit-dialog__row--social {\\n margin-left: calc(-1 * var(--spacing-2xs, 0.625rem));\\n max-width: 100%;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__field--social-type {\\n flex: 0 0 7rem;\\n width: 7rem;\\n max-width: 7rem;\\n}\\n\\n.profile-edit-dialog__field--social-url {\\n flex: 1 1 auto;\\n min-width: 0;\\n}\\n\\n.profile-edit-dialog__row--full {\\n max-width: 100%;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__row--project {\\n max-width: 100%;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__row--resume-entry-header {\\n align-items: center;\\n border-bottom: 1px solid var(--gray-400, #99A1AF);\\n}\\n\\n.profile-edit-dialog__row--resume-entry-header > .profile-edit-dialog__entry-heading {\\n margin: 0;\\n}\\n\\n.profile-edit-dialog__entry-heading {\\n margin: 0;\\n color: var(--gray-700, #364153);\\n font-size: var(--font-size-sm, 0.875rem);\\n font-style: normal;\\n font-weight: var(--font-weight-md, 500);\\n line-height: normal;\\n}\\n\\n.educationEditSection .profile-edit-dialog__section-heading {\\n margin: 0;\\n color: var(--gray-700, #364153);\\n font-size: 16px;\\n font-weight: 500;\\n}\\n\\n.profile-edit-dialog__row--resume-entry-header .profile-edit-dialog__delete-button,\\n#profile-modal .modal .profile-edit-dialog__row--resume-entry-header button.profile-edit-dialog__delete-button {\\n min-height: 1.75rem;\\n min-width: 1.75rem;\\n}\\n\\n/* Force two direct children to split the row into equal columns. */\\n.profile-edit-dialog__row--equal > .profile-edit-dialog__field,\\n.profile-edit-dialog__row--equal > .profile-edit-dialog__field-type {\\n flex: 1 1 0;\\n min-width: 0;\\n}\\n\\n.profile-edit-dialog__image-preview {\\n display: grid;\\n gap: var(--spacing-xs);\\n}\\n\\n.profile-edit-dialog__image-preview-label,\\n.profile-edit-dialog__image-preview-description {\\n margin: 0;\\n}\\n\\n.profile-edit-dialog__image-preview-actions {\\n display: flex;\\n align-items: center;\\n gap: var(--spacing-xs);\\n}\\n\\n.profile-edit-dialog__image-frame {\\n position: relative;\\n display: inline-block;\\n line-height: 0;\\n}\\n\\n.profile-edit-dialog__image-camera-button {\\n display: none;\\n position: absolute;\\n right: var(--spacing-2xs, 0.625rem);\\n bottom: var(--spacing-2xs, 0.625rem);\\n z-index: 1;\\n}\\n\\n/* Override modal-wide button defaults for the small camera overlay control. */\\n#profile-modal .modal button.profile-edit-dialog__image-camera-button {\\n display: none !important;\\n position: absolute;\\n right: var(--spacing-2xs, 0.625rem);\\n bottom: var(--spacing-2xs, 0.625rem);\\n width: 1.25rem;\\n height: 1.25rem;\\n min-width: 1.25rem;\\n min-height: 1.25rem;\\n padding: 3px;\\n background: var(--white, #FFF);\\n border-radius: 3.333px;\\n box-shadow: 0 0 4.444px 0 rgba(0, 0, 0, 0.25);\\n flex-shrink: 0;\\n}\\n\\n.profile-edit-dialog__image-camera-button svg {\\n width: 0.875rem !important;\\n height: 0.875rem !important;\\n display: block;\\n flex-shrink: 0;\\n}\\n.profile-edit-dialog__image-camera-capture-row {\\n display: flex;\\n justify-content: center;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__image-camera-capture-row {\\n margin-bottom: calc(var(--spacing-lg, 1.25rem) / -2);\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame {\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: center;\\n width: fit-content;\\n max-width: 100%;\\n margin-left: auto;\\n margin-right: auto;\\n margin-top: calc(var(--spacing-xs, 0.625rem) / 2);\\n margin-bottom: var(--spacing-xs, 0.625rem);\\n padding: 10px;\\n box-sizing: border-box;\\n border: 1px solid var(--gray-200, #E5E7EB);\\n border-radius: 8px;\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__image-camera-capture-frame {\\n margin-top: calc(var(--spacing-xs, 0.625rem) / 4);\\n margin-bottom: calc(var(--spacing-xs, 0.625rem) / 2);\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame[hidden] {\\n display: none;\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame table {\\n border-collapse: collapse;\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame td {\\n text-align: center;\\n vertical-align: middle;\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame tr:last-child {\\n display: flex;\\n justify-content: flex-end;\\n align-items: center;\\n gap: var(--spacing-2xs, 0.625rem);\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame tr:last-child td {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex: 0 0 auto;\\n width: auto;\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame tr:last-child td:first-child {\\n margin-right: auto;\\n}\\n\\n#profile-modal .modal .profile-edit-dialog__image-camera-capture-frame tr:last-child td:first-child button {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.profile-edit-dialog__camera-control {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n\\n.profile-edit-dialog__camera-control-actions {\\n display: flex;\\n align-items: center;\\n justify-content: center !important;\\n gap: var(--spacing-2xs, 0.625rem);\\n width: max-content;\\n margin-left: auto;\\n margin-right: auto;\\n margin-top: calc(var(--spacing-2xs, 0.625rem) / 2);\\n align-self: center;\\n}\\n\\n.profile-edit-dialog__camera-control-cancel {\\n position: absolute;\\n top: 0;\\n right: 0;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n padding: 0;\\n border: 0 !important;\\n background: transparent !important;\\n box-shadow: none !important;\\n color: var(--gray-600, #4A5565) !important;\\n margin-right: 0 !important;\\n}\\n\\n.profile-edit-dialog__camera-control-cancel svg {\\n display: block;\\n}\\n\\n#profile-modal .modal .profile-edit-dialog__camera-control-cancel:hover,\\n#profile-modal .modal .profile-edit-dialog__camera-control-cancel:focus-visible {\\n background: transparent !important;\\n border: 0 !important;\\n color: var(--gray-900, #101828) !important;\\n}\\n/* display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n min-height: 2rem;\\n padding: 0.25rem 0.625rem;\\n border: 1px solid var(--gray-300, #D5D7DA) !important;\\n -- background: var(--gray-200, #E5E7EB) !important; \\n background: var(--gray-100, #FFF) !important;\\n color: var(--gray-700, #364153) !important;\\n box-shadow: none !important;\\n border-radius: 0.375rem;\\n font-weight: var(--font-weight-md, 500); */\\n.profile-edit-dialog__camera-control-action {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n text-align: center;\\n font-size: var(--font-size-xxs, 0.75rem) !important; /* 12 px */\\n font-weight: var(--font-weight-xbold, 700) !important;\\n line-height: var(--line-height-base, 1.5) !important; /* 150% */\\n border-radius: var(--border-radius-base, 0.3125rem) !important;\\n border: 0.8px solid var(--gray-300, #D1D5DC) !important;\\n color: var(--gray-900, #101828) !important;\\n background: var(--white, #FFF) !important;\\n padding: 6.6px 11.075px 7px 12.8px !important;\\n}\\n\\n#profile-modal .modal .profile-edit-dialog__camera-control-actions button:hover,\\n#profile-modal .modal .profile-edit-dialog__camera-control-actions button:focus-visible {\\n background: var(--gray-100, #F3F4F6) !important;\\n border-color: var(--gray-400, #99A1AF) !important;\\n}\\n\\n.profile-edit-dialog__image-camera-capture-frame video,\\n.profile-edit-dialog__image-camera-capture-frame canvas {\\n display: block;\\n width: 100%;\\n max-width: 260px;\\n height: auto;\\n border-radius: 0.5rem;\\n margin: 0 auto;\\n}\\n\\n#profile-modal .modal .profile-edit-dialog__image-camera-capture-frame button {\\n font-size: var(--font-size-sm, 0.875rem);\\n}\\n\\n.profile-edit-dialog__image-upload-button,\\n.profile-edit-dialog__image-remove-button {\\n min-height: var(--min-touch-target, 44px);\\n padding: 0 var(--spacing-sm);\\n}\\n\\n.profile-edit-dialog__field,\\n.profile-edit-dialog__field-type {\\n display: block;\\n margin: 0;\\n}\\n\\n.profile-edit-dialog__field-type {\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__field {\\n /* flex: 1 1 auto; */\\n min-width: 0;\\n}\\n\\n.profile__edit-form--resume .profile-edit-dialog__field,\\n.profile__edit-form--resume .profile-edit-dialog__field-type:not(.hidden),\\n.profile__edit-form--contact-info .profile-edit-dialog__field,\\n.profile__edit-form--contact-info .profile-edit-dialog__field-type:not(.hidden) {\\n display: flex;\\n flex-direction: column;\\n align-items: flex-start;\\n gap: var(--spacing-xxs, 0.3125rem);\\n flex: 1 0 0;\\n}\\n\\n.profile__edit-form--resume .profile-edit-dialog__row {\\n max-width: 100%;\\n width: 100%;\\n}\\n\\n.profile__edit-form--resume .profile-edit-dialog__section fieldset > .profile-edit-dialog__field {\\n max-width: 100%;\\n}\\n\\n.profile__edit-form--resume .profile-edit-dialog__field > input,\\n.profile__edit-form--resume .profile-edit-dialog__field > select,\\n.profile__edit-form--resume .profile-edit-dialog__field > textarea,\\n.profile__edit-form--resume .profile-edit-dialog__field-type > input,\\n.profile__edit-form--resume .profile-edit-dialog__field-type > select,\\n.profile__edit-form--resume .profile-edit-dialog__field-type > textarea,\\n.profile__edit-form--contact-info .profile-edit-dialog__field > input,\\n.profile__edit-form--contact-info .profile-edit-dialog__field > select,\\n.profile__edit-form--contact-info .profile-edit-dialog__field > textarea,\\n.profile__edit-form--contact-info .profile-edit-dialog__field-type > input,\\n.profile__edit-form--contact-info .profile-edit-dialog__field-type > select,\\n.profile__edit-form--contact-info .profile-edit-dialog__field-type > textarea {\\n align-self: stretch;\\n}\\n\\n.profile-edit-dialog__field--resume-location {\\n flex: 1 0 0;\\n width: auto;\\n max-width: none;\\n}\\n\\n.profile-edit-dialog__row--resume-dates {\\n max-width: 100%;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__field--date-group {\\n flex: 1 1 0;\\n min-width: 0;\\n}\\n\\n.profile-edit-dialog__date-pair {\\n display: flex;\\n align-items: center;\\n gap: var(--spacing-sm);\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__date-pair > select {\\n flex: 1 1 0;\\n min-width: 0;\\n}\\n\\n.profile-edit-dialog__field--stack {\\n display: grid;\\n gap: var(--spacing-xxs);\\n}\\n\\n.profile-edit-dialog__field--stack > small {\\n display: block;\\n width: 100%;\\n text-align: right;\\n}\\n\\n.profile-edit-dialog__bio-field-container > small {\\n align-self: flex-end;\\n text-align: right;\\n}\\n\\n.profile-edit-dialog__field--full {\\n max-width: 100% !important;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__field--row-width {\\n max-width: 34rem;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__row,\\n.profile-edit-dialog--heading .profile-edit-dialog__field--row-width {\\n max-width: 100%;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo {\\n padding-bottom: calc(var(--spacing-sm, 0.938rem) / 2);\\n margin-bottom: calc(var(--spacing-sm, 0.938rem) / 2);\\n border-bottom: 1px solid var(--slate-200, #E2E8F0);\\n}\\n\\n.profile-edit-dialog--heading .profile-edit {\\n gap: calc(var(--spacing-lg, 1.25rem) / 2);\\n}\\n\\n.profile-edit-dialog__login-message {\\n margin: 0;\\n font-size: var(--font-size-xs, 0.75rem);\\n color: var(--red-600, #E7000B);\\n}\\n\\n.profile-edit-dialog__section + .profile-edit-dialog__login-message {\\n margin-top: var(--spacing-sm, 0.938rem);\\n}\\n\\n.profile__edit-form--projects .profile-edit-dialog__login-message {\\n margin-top: var(--spacing-sm, 0.938rem);\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point {\\n max-width: 100%;\\n width: 100%;\\n gap: var(--spacing-2xs, 0.625rem);\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field {\\n flex: 1 1 0;\\n min-width: 0;\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field > .label {\\n display: block;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point.profile-edit-dialog__row--equal > .profile-edit-dialog__field-type.profile-edit-dialog__field-type--contact-point {\\n flex: 0 0 6.4375rem;\\n width: 6.4375rem;\\n min-width: 6.4375rem;\\n max-width: 6.4375rem;\\n}\\n\\n.profile-edit-dialog__field-type--contact-point select {\\n width: auto;\\n max-width: none;\\n min-width: 6.4375rem;\\n}\\n\\n.profile-edit-dialog__row--address-header {\\n max-width: 34rem;\\n align-items: flex-end;\\n}\\n\\n.profile-edit-dialog__row--inline-end {\\n justify-content: flex-end;\\n max-width: 100%;\\n}\\n\\n.profile-edit-dialog__checkbox-label {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--spacing-xs);\\n margin-left: auto;\\n cursor: pointer;\\n}\\n\\n.profile-edit-dialog__checkbox-input {\\n width: 1rem;\\n height: 1rem;\\n margin: 0;\\n flex: 0 0 auto;\\n accent-color: var(--color-primary, #7C4DFF);\\n cursor: pointer;\\n}\\n\\n.profile-edit-dialog__checkbox-input:focus-visible {\\n outline: var(--focus-indicator-width, 2px) solid var(--color-primary, #7C4DFF);\\n outline-offset: 2px;\\n}\\n\\n.profile-edit-dialog__checkbox-input:disabled {\\n opacity: var(--opacity-disabled, 0.5);\\n}\\n\\n/* The street-address row is a standalone label, so cap its width like the flex rows. */\\n.profile-edit-dialog__section fieldset > .profile-edit-dialog__field {\\n max-width: 34rem;\\n}\\n\\n.profile-edit-dialog__field-type--wide {\\n flex: 1 1 auto;\\n min-width: 0;\\n width: 100%;\\n max-width: 100%;\\n}\\n\\n.profile-edit-dialog__field-type--contact-point {\\n flex: 0 0 auto;\\n width: auto;\\n max-width: none;\\n align-self: flex-start;\\n}\\n\\n.profile-edit-dialog__actions {\\n flex: 0 0 auto;\\n display: flex;\\n align-items: center;\\n justify-content: flex-end;\\n}\\n\\n.profile-edit-dialog__actions--edge {\\n margin-left: auto;\\n}\\n\\n.profile-edit-dialog__input-wrap {\\n position: relative;\\n width: 100%;\\n}\\n\\n.profile-edit-dialog__input--with-action {\\n width: 100%;\\n box-sizing: border-box;\\n padding-right: 7.5rem;\\n}\\n\\n.profile-edit-dialog__input--with-leading-icon {\\n width: 100%;\\n box-sizing: border-box;\\n padding-left: 2.1rem;\\n}\\n\\n.profile-edit-dialog__search-icon {\\n position: absolute;\\n left: var(--spacing-2xs, 0.625rem);\\n top: 50%;\\n transform: translateY(-50%);\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n color: var(--gray-400, #99A1AF);\\n pointer-events: none;\\n z-index: 1;\\n}\\n\\n.profile-edit-dialog__search-icon svg {\\n display: block;\\n width: 0.8125rem;\\n height: 0.8125rem;\\n}\\n\\n.profile-edit-dialog__delete-button {\\n min-height: var(--min-touch-target, 44px);\\n min-width: var(--min-touch-target, 44px);\\n padding: 0;\\n border: 0;\\n background: transparent;\\n color: inherit;\\n cursor: pointer;\\n}\\n\\n#profile-modal .modal button.profile-edit-dialog__delete-button {\\n min-height: var(--min-touch-target, 44px);\\n min-width: var(--min-touch-target, 44px);\\n padding: 0;\\n border: 0;\\n border-radius: 0;\\n background: transparent;\\n color: inherit;\\n box-shadow: none;\\n}\\n\\n.profile-edit-dialog__delete-icon {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 1.1rem;\\n height: 1.1rem;\\n fill: currentColor;\\n}\\n\\n.profile-edit-dialog__delete-icon svg {\\n width: 1.1rem;\\n height: 1.1rem;\\n}\\n\\n.profile-edit-dialog__delete-button:hover,\\n.profile-edit-dialog__delete-button:focus-visible {\\n color: var(--color-danger, #b42318);\\n}\\n\\n.profile-edit-dialog__image-button {\\n text-align: center;\\n font-size: var(--font-size-xxs, 0.75rem); /* 12 px */\\n font-weight: var(--font-weight-xbold, 700);\\n line-height: var(--line-height-base, 1.5); /* 150% */\\n border-radius: var(--border-radius-base, 0.3125rem);\\n border: 0.8px solid var(--gray-300, #D1D5DC);\\n}\\n\\n.profile-edit-dialog__image-upload-button {\\n color: var(--gray-900, #101828);\\n border: 0.8px solid var(--gray-300, #D1D5DC);\\n background: var(--white, #FFF);\\n padding: 6.6px 11.075px 7px 12.8px;\\n}\\n\\n.profile-edit-dialog__image-remove-button {\\n color: var(--red-600, #E7000B);\\n padding: 6.6px 13.037px 7px 13.8px;\\n border: 0.8px solid rgba(0, 0, 0, 0.00);\\n background: var(--gray-100, #F3F4F6);\\n}\\n\\n#profile-modal .modal .profile-edit-dialog__image-upload-button:hover,\\n#profile-modal .modal .profile-edit-dialog__image-upload-button:focus-visible,\\n#profile-modal .modal .profile-edit-dialog__image-remove-button:hover,\\n#profile-modal .modal .profile-edit-dialog__image-remove-button:focus-visible {\\n background: var(--gray-100, #F3F4F6) !important;\\n border-color: var(--gray-400, #99A1AF) !important;\\n}\\n\\n/* Placeholder class for project paste action styling. */\\n.profile-edit-dialog__paste-button {\\n display: flex;\\n padding: 0.25rem 0.375rem; /* 4px 6px */\\n align-items: center;\\n position: absolute;\\n background: var(--white, #fff);\\n border: 0;\\n outline: none;\\n white-space: nowrap;\\n right: var(--spacing-2xs, 0.625rem);\\n top: 50%;\\n transform: translateY(-50%);\\n z-index: 1;\\n color: var(--gray-500, #6A7282);\\n font-size: 0.75rem; /* 12px */\\n font-weight: var(--font-weight-normal, 400);\\n}\\n\\n.profile-edit-dialog__paste-button:focus,\\n.profile-edit-dialog__paste-button:focus-visible {\\n outline: none;\\n}\\n\\n/* remove the regular button styling for paste */\\n#profile-modal .modal button.profile-edit-dialog__paste-button,\\n#profile-modal .modal button.profile-edit-dialog__paste-button:hover,\\n#profile-modal .modal button.profile-edit-dialog__paste-button:focus,\\n#profile-modal .modal button.profile-edit-dialog__paste-button:focus-visible,\\n#profile-modal .modal button.profile-edit-dialog__paste-button:active {\\n border: 0;\\n outline: none;\\n box-shadow: none;\\n -webkit-appearance: none;\\n appearance: none;\\n}\\n.profile-edit-dialog__paste-icon {\\n width: 0.694rem; /* 11.105px */\\n height: 0.813rem; /* 13.038px */\\n fill: var(--gray-500, #6A7282);\\n}\\n#profile-modal .modal button.profile-edit-dialog__drag-handle {\\n min-height: 1.75rem;\\n min-width: 1.75rem;\\n padding: 0;\\n border: 0;\\n background: transparent;\\n box-shadow: none;\\n}\\n\\n.profile-edit-dialog__row--drop-target {\\n outline: 1px dashed var(--gray-400, #99A1AF);\\n outline-offset: 2px;\\n}\\n\\n#profile-modal .modal button.profile-edit-dialog__delete-button:hover,\\n#profile-modal .modal button.profile-edit-dialog__delete-button:focus-visible {\\n border: 0;\\n background: transparent;\\n color: var(--color-danger, #b42318);\\n}\\n\\n.profile-edit-dialog__field input,\\n.profile-edit-dialog__field select,\\n.profile-edit-dialog__field-type input,\\n.profile-edit-dialog__field-type select {\\n width: 100%;\\n max-width: 100%;\\n box-sizing: border-box;\\n min-height: var(--min-touch-target, 44px);\\n height: var(--min-touch-target, 44px);\\n border-radius: var(--border-radius-base, 0.3125rem);\\n border: 1px solid var(--gray-400, #99A1AF);\\n background: var(--white, #FFF);\\n color: var(--gray-900, #101828);\\n font-size: var(--font-size-sm, 0.875rem);\\n font-weight: var(--font-weight-medium, 500);\\n padding: var(--spacing-2xs, 0.625rem);\\n}\\n\\n.profile-edit-dialog__field input.profile-edit-dialog__input--with-leading-icon {\\n padding-left: 2.1rem;\\n}\\n\\n/* Keep phone/email contact-point type selects compact. */\\n.profile-edit-dialog__field-type--contact-point > select {\\n display: inline-block;\\n width: auto !important;\\n max-width: none !important;\\n min-width: 0 !important;\\n}\\n\\n/* In heading edit, force both type selects to fill the same fixed wrapper width. */\\n.profile-edit-dialog--heading .profile-edit-dialog__row--contact-point > .profile-edit-dialog__field-type.profile-edit-dialog__field-type--contact-point > select {\\n display: block;\\n width: 100% !important;\\n min-width: 0 !important;\\n max-width: 100% !important;\\n}\\n\\n/* Keep phone/email type selects compact after the generic full-width rule above. */\\n.profile-edit-dialog__field-type--contact-point select {\\n width: fit-content;\\n max-width: none;\\n min-width: 6.4375rem;\\n}\\n\\n.profile-edit-dialog__textarea {\\n color: var(--gray-900, #101828);\\n font-size: var(--font-size-sm, 0.875rem);\\n font-weight: var(--font-weight-md, 500);\\n line-height: var(--line-height-loose, 1.6); /* 22.4px */\\n border-radius: var(--border-radius-base, 0.3125rem);\\n border: var(--border-width-sm, 0.1rem) solid var(--gray-400, #99A1AF);\\n background: var(--white, #FFF);\\n}\\n\\n.profile-edit-dialog__field textarea,\\n.profile-edit-dialog__field-type textarea {\\n width: 100%;\\n max-width: 100%;\\n box-sizing: border-box;\\n min-height: var(--min-touch-target, 44px);\\n}\\n\\n/* Dedicated hook for the social account type select in SocialEditDialog. */\\n.profile-edit-dialog__social-account-select {\\n display: block;\\n width: 100%;\\n min-width: 0;\\n max-width: 100%;\\n box-sizing: border-box;\\n min-height: var(--min-touch-target, 44px);\\n height: var(--min-touch-target, 44px);\\n border-radius: var(--border-radius-base, 0.3125rem);\\n border: 1px solid var(--gray-400, #99A1AF);\\n background: var(--white, #FFF);\\n color: var(--gray-900, #101828);\\n font-size: var(--font-size-sm, 0.875rem);\\n font-weight: var(--font-weight-medium, 500);\\n padding: var(--spacing-2xs, 0.625rem);\\n\\n\\n}\\n\\n.profile-edit-dialog__bio-field-container textarea {\\n width: 100%;\\n max-width: 100%;\\n box-sizing: border-box;\\n min-height: var(--min-touch-target, 44px);\\n}\\n\\n.profile-edit-dialog__textarea {\\n min-height: 10rem !important;\\n height: auto;\\n resize: vertical;\\n}\\n\\n.profile-edit-dialog__field--stack small {\\n justify-self: end;\\n text-align: right;\\n}\\n\\n@media (max-width: 640px) {\\n .profile-edit-dialog__row {\\n max-width: 100%;\\n flex-direction: column;\\n align-items: stretch;\\n }\\n\\n .profile-edit-dialog__row--equal > .profile-edit-dialog__field,\\n .profile-edit-dialog__row--equal > .profile-edit-dialog__field-type {\\n flex: 1 1 auto;\\n }\\n\\n .profile-edit-dialog__field-type {\\n flex: 1 1 auto;\\n }\\n\\n .profile-edit-dialog__field-type--contact-point {\\n flex: 1 1 auto;\\n max-width: 100%;\\n }\\n\\n .profile-edit-dialog__row--address-header {\\n flex-direction: row;\\n align-items: flex-end;\\n }\\n\\n .profile-edit-dialog__row--social {\\n margin-left: 0;\\n gap: var(--spacing-2xs, 0.625rem);\\n flex-direction: row;\\n align-items: center;\\n flex-wrap: nowrap;\\n }\\n\\n .profile-edit-dialog__row--social .profile-edit-dialog__social-icon {\\n width: 1.5rem;\\n height: 1.5rem;\\n }\\n\\n .profile-edit-dialog__field--social-type {\\n flex: 0 0 5.5rem;\\n width: 5.5rem;\\n max-width: 5.5rem;\\n }\\n\\n .profile-edit-dialog__field--social-url {\\n flex: 1 1 auto;\\n min-width: 0;\\n }\\n\\n .profile-edit-dialog__field--resume-location {\\n flex: 1 1 100%;\\n width: 100%;\\n max-width: 100%;\\n }\\n\\n .profile-edit-dialog__row--language {\\n flex-direction: row;\\n align-items: center;\\n flex-wrap: nowrap;\\n }\\n\\n .profile-edit-dialog__row--language > .profile-edit-dialog__field {\\n flex: 1 1 0;\\n min-width: 0;\\n }\\n\\n .profile-edit-dialog__row--resume-entry-header {\\n flex-direction: row;\\n align-items: center;\\n flex-wrap: nowrap;\\n width: 100%;\\n max-width: 100%;\\n }\\n\\n .profile-edit-dialog__row--resume-entry-header > .profile-edit-dialog__actions--edge {\\n margin-left: auto;\\n }\\n\\n .profile-edit-dialog__row--skill {\\n flex-direction: row;\\n align-items: center;\\n flex-wrap: nowrap;\\n gap: var(--spacing-2xs, 0.625rem);\\n }\\n\\n .profile-edit-dialog__row--skill > .profile-edit-dialog__field {\\n flex: 1 1 0;\\n min-width: 0;\\n }\\n\\n .profile-edit-dialog__row--skill > .profile-edit-dialog__actions {\\n flex: 0 0 auto;\\n margin-left: 0;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo {\\n flex-direction: row;\\n align-items: center;\\n flex-wrap: nowrap;\\n gap: var(--spacing-xs, 0.75rem);\\n width: 100%;\\n max-width: 100%;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo > header {\\n margin-bottom: 0;\\n flex: 0 0 auto;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile__hero,\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile__hero-alt {\\n width: 5.5rem;\\n height: 5.5rem;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile__hero-alt {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 0;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-camera-button {\\n display: inline-flex;\\n right: var(--spacing-xxs, 0.3125rem);\\n bottom: var(--spacing-xxs, 0.3125rem);\\n width: 1.875rem;\\n min-width: 1.875rem;\\n min-height: 1.875rem;\\n }\\n\\n #profile-modal .modal button.profile-edit-dialog__image-camera-button {\\n display: inline-flex !important;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview {\\n flex: 1 1 auto;\\n min-width: 0;\\n gap: var(--spacing-xxs, 0.3125rem);\\n width: 100%;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview-label {\\n font-size: var(--font-size-sm, 0.875rem);\\n line-height: var(--line-height-tight, 1.25);\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview-description {\\n font-size: 10px;\\n line-height: var(--line-height-base, 1.4);\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-preview-actions {\\n flex-wrap: nowrap;\\n gap: var(--spacing-xs, 0.5rem);\\n width: 100%;\\n }\\n\\n .profile-edit-dialog--heading .profile-edit-dialog__row--heading-photo .profile-edit-dialog__image-button {\\n flex: 1 1 0;\\n width: 100%;\\n padding: 0 0.75rem;\\n }\\n\\n .profile-edit-dialog__row--inline-end {\\n justify-content: flex-start;\\n }\\n\\n .profile-edit-dialog__actions {\\n justify-content: flex-start;\\n }\\n\\n .profile-edit-dialog__row--address-header .profile-edit-dialog__actions {\\n justify-content: flex-end;\\n }\\n\\n .profile-edit-dialog__textarea {\\n min-height: 15rem !important;\\n }\\n\\n .profile-edit-dialog__input-help-text {\\n display: none;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.profile__avatar {\n flex: 0 0 auto;\n}\n\n.profile__heading-top {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-areas:\n \"avatar info actions\"\n \"avatar details details\";\n column-gap: var(--spacing-md, 1.25rem);\n row-gap: var(--spacing-sm, 0.75rem);\n align-items: start;\n width: 100%;\n}\n\n.profile__name {\ncolor: var(--color-text-heading, #000);\nfont-size: var(--font-size-xxl, 1.75rem); /* 28px */\nfont-weight: var(--font-weight-bold, 600);\nmargin: 0;\npadding: 0;\ntext-indent: 0;\nline-height: 1.2;\ntext-align: left;\ntransform: translateX(-4px);\n}\n\n.profile__info {\n grid-area: info;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-width: 0;\n align-items: flex-start;\n}\n\n.profile__details {\n grid-area: details;\n color: var(--color-text-secondary, #4A5565);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n display: flex;\n width: 100%;\n align-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: var(--spacing-sm, 0.75rem) 2rem; /* 12px vertical, 32px horizontal */\n}\n\n.profile__info > .profile__header-bar {\n margin-left: 0;\n padding-left: 0;\n align-self: stretch;\n}\n\n.profile__header-bar {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.125rem;\n width: 100%;\n margin: 0;\n padding: 0;\n}\n\n.profile__heading-actions {\n grid-area: actions;\n margin-left: auto;\n align-self: flex-start;\n}\n\n.profile__avatar {\n grid-area: avatar;\n}\n\n.profile__heading-action-button {\n position: static;\n min-width: 0;\n width: auto;\n max-width: none;\n padding: var(--spacing-xxs, 0.3125rem);\n}\n.profile__identity {\n display: flex;\n flex-direction: row;\n align-items: baseline;\n gap: 0.4375rem; /* 7px */\n justify-content: flex-start;\n width: 100%;\n flex-wrap: nowrap;\n}\n\n.profile__pronouns {\n color: var(--color-text-secondary, #4A5565);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-regular, 400);\n line-height: 1.2;\n}\n\n.profile__role-org {\n margin: 0;\n width: 100%;\n white-space: normal;\n color: var(--color-text-subheading, #101828);\n font-size: var(--font-size-base, 1rem);\n font-weight: var(--font-weight-medium, 500);\n line-height: 1.25;\n text-align: left;\n}\n\n.profile__meta-row,\n.profile__contact-row {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n justify-content: flex-start;\n column-gap: 0.25rem; /* 4px */\n row-gap: var(--spacing-xs, 0.5rem);\n align-items: start;\n margin: 0;\n padding: 0;\n width: 100%;\n}\n\n.profile__meta-row .profile__item,\n.profile__contact-row .profile__item {\n display: flex;\n align-items: center;\n gap: var(--spacing-2xs, 0.625rem);\n min-width: 0;\n}\n\n.profile__meta-row .profile__value,\n.profile__contact-row .profile__value {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-xxs, 0.3125rem);\n min-width: 0;\n white-space: normal !important;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n.profile__meta-row .profile__value-text,\n.profile__contact-row .profile__value-text {\n min-width: 0;\n white-space: normal !important;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n.profile__prefix-icon {\n display: inline-flex;\n align-items: center;\n margin-right: 0.125rem;\n}\n\n.profile__detail-icon {\n display: block;\n width: 1rem;\n height: 1rem;\n}\n\n.profile__hero {\n width: 140px;\n height: 140px;\n border-radius: var(--border-radius-full, 0.625rem); /* 10px */;\n border: var(--border-width-sm, 0.1rem) solid var(--color-primary, #7C4DFF);\n background: lightgray 50% / cover no-repeat;\n background-position: 50%;\n object-fit: cover;\n object-position: center;\n}\n\n.profile__hero-alt {\n width: 140px;\n height: 140px;\n padding: 0 36.4px; \n border-radius: var(--border-radius-full, 0.625rem); /* 10px */;\n border: 1.6px dashed #CBD5E1;\n background: #F8FAFC;\n box-sizing: border-box;\n}\n\n/* added because the icon wasn't centering on mobile\n due to styles in mashlib */\n.profile__hero-alt .profile__hero-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n}\n\n.profile__hero-alt .profile__hero-icon svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n@media (max-width: 640px) {\n .profile__heading-top {\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-areas:\n \"avatar info actions\"\n \"details details details\";\n column-gap: var(--spacing-sm, 0.75rem);\n row-gap: var(--spacing-sm, 0.75rem);\n }\n\n .profile__name {\n font-size: 1.5rem;\n line-height: 1.15;\n }\n\n .profile__identity {\n gap: 0.125rem;\n }\n\n .profile__pronouns {\n font-size: var(--font-size-xs, 0.75rem);\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .profile__hero,\n .profile__hero-alt {\n width: 112px;\n height: 112px;\n }\n\n .profile__hero-alt {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n\n .profile__hero-icon {\n display: block;\n margin: 0 auto;\n width: 48px;\n height: 48px;\n }\n\n .profile__details {\n gap: var(--spacing-xs, 0.5rem);\n }\n\n .profile__meta-row,\n .profile__contact-row {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n column-gap: 0.25rem;\n }\n}\n\n@container profile-pane (max-width: 640px) {\n .profile__heading-top {\n grid-template-columns: auto minmax(0, 1fr) auto;\n grid-template-areas:\n \"avatar info actions\"\n \"details details details\";\n column-gap: var(--spacing-sm, 0.75rem);\n row-gap: var(--spacing-sm, 0.75rem);\n }\n\n .profile__name {\n font-size: 1.5rem;\n line-height: 1.15;\n }\n\n .profile__identity {\n gap: 0.125rem;\n }\n\n .profile__pronouns {\n font-size: var(--font-size-xs, 0.75rem);\n line-height: 1.1;\n white-space: nowrap;\n }\n\n .profile__hero,\n .profile__hero-alt {\n width: 112px;\n height: 112px;\n }\n\n .profile__hero-alt {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n\n .profile__hero-icon {\n display: block;\n margin: 0 auto;\n width: 48px;\n height: 48px;\n }\n\n .profile__details {\n gap: var(--spacing-xs, 0.5rem);\n }\n\n .profile__meta-row,\n .profile__contact-row {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n column-gap: 0.25rem;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/HeadingSection.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\".profile__avatar {\\n flex: 0 0 auto;\\n}\\n\\n.profile__heading-top {\\n display: grid;\\n grid-template-columns: auto minmax(0, 1fr) auto;\\n grid-template-areas:\\n \\\"avatar info actions\\\"\\n \\\"avatar details details\\\";\\n column-gap: var(--spacing-md, 1.25rem);\\n row-gap: var(--spacing-sm, 0.75rem);\\n align-items: start;\\n width: 100%;\\n}\\n\\n.profile__name {\\ncolor: var(--color-text-heading, #000);\\nfont-size: var(--font-size-xxl, 1.75rem); /* 28px */\\nfont-weight: var(--font-weight-bold, 600);\\nmargin: 0;\\npadding: 0;\\ntext-indent: 0;\\nline-height: 1.2;\\ntext-align: left;\\ntransform: translateX(-4px);\\n}\\n\\n.profile__info {\\n grid-area: info;\\n display: flex;\\n flex-direction: column;\\n flex: 1 1 auto;\\n min-width: 0;\\n align-items: flex-start;\\n}\\n\\n.profile__details {\\n grid-area: details;\\n color: var(--color-text-secondary, #4A5565);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n display: flex;\\n width: 100%;\\n align-content: flex-start;\\n align-items: flex-start;\\n flex-wrap: wrap;\\n gap: var(--spacing-sm, 0.75rem) 2rem; /* 12px vertical, 32px horizontal */\\n}\\n\\n.profile__info > .profile__header-bar {\\n margin-left: 0;\\n padding-left: 0;\\n align-self: stretch;\\n}\\n\\n.profile__header-bar {\\n display: flex;\\n flex-direction: column;\\n align-items: flex-start;\\n gap: 0.125rem;\\n width: 100%;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.profile__heading-actions {\\n grid-area: actions;\\n margin-left: auto;\\n align-self: flex-start;\\n}\\n\\n.profile__avatar {\\n grid-area: avatar;\\n}\\n\\n.profile__heading-action-button {\\n position: static;\\n min-width: 0;\\n width: auto;\\n max-width: none;\\n padding: var(--spacing-xxs, 0.3125rem);\\n}\\n.profile__identity {\\n display: flex;\\n flex-direction: row;\\n align-items: baseline;\\n gap: 0.4375rem; /* 7px */\\n justify-content: flex-start;\\n width: 100%;\\n flex-wrap: nowrap;\\n}\\n\\n.profile__pronouns {\\n color: var(--color-text-secondary, #4A5565);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-regular, 400);\\n line-height: 1.2;\\n}\\n\\n.profile__role-org {\\n margin: 0;\\n width: 100%;\\n white-space: normal;\\n color: var(--color-text-subheading, #101828);\\n font-size: var(--font-size-base, 1rem);\\n font-weight: var(--font-weight-medium, 500);\\n line-height: 1.25;\\n text-align: left;\\n}\\n\\n.profile__meta-row,\\n.profile__contact-row {\\n display: grid;\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n justify-content: flex-start;\\n column-gap: 0.25rem; /* 4px */\\n row-gap: var(--spacing-xs, 0.5rem);\\n align-items: start;\\n margin: 0;\\n padding: 0;\\n width: 100%;\\n}\\n\\n.profile__meta-row .profile__item,\\n.profile__contact-row .profile__item {\\n display: flex;\\n align-items: center;\\n gap: var(--spacing-2xs, 0.625rem);\\n min-width: 0;\\n}\\n\\n.profile__meta-row .profile__value,\\n.profile__contact-row .profile__value {\\n display: flex;\\n align-items: flex-start;\\n gap: var(--spacing-xxs, 0.3125rem);\\n min-width: 0;\\n white-space: normal !important;\\n overflow-wrap: anywhere;\\n word-break: break-word;\\n}\\n\\n.profile__meta-row .profile__value-text,\\n.profile__contact-row .profile__value-text {\\n min-width: 0;\\n white-space: normal !important;\\n overflow-wrap: anywhere;\\n word-break: break-word;\\n}\\n\\n.profile__prefix-icon {\\n display: inline-flex;\\n align-items: center;\\n margin-right: 0.125rem;\\n}\\n\\n.profile__detail-icon {\\n display: block;\\n width: 1rem;\\n height: 1rem;\\n}\\n\\n.profile__hero {\\n width: 140px;\\n height: 140px;\\n border-radius: var(--border-radius-full, 0.625rem); /* 10px */;\\n border: var(--border-width-sm, 0.1rem) solid var(--color-primary, #7C4DFF);\\n background: lightgray 50% / cover no-repeat;\\n background-position: 50%;\\n object-fit: cover;\\n object-position: center;\\n}\\n\\n.profile__hero-alt {\\n width: 140px;\\n height: 140px;\\n padding: 0 36.4px; \\n border-radius: var(--border-radius-full, 0.625rem); /* 10px */;\\n border: 1.6px dashed #CBD5E1;\\n background: #F8FAFC;\\n box-sizing: border-box;\\n}\\n\\n/* added because the icon wasn't centering on mobile\\n due to styles in mashlib */\\n.profile__hero-alt .profile__hero-icon {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n line-height: 0;\\n}\\n\\n.profile__hero-alt .profile__hero-icon svg {\\n display: block;\\n width: 100%;\\n height: 100%;\\n}\\n\\n@media (max-width: 640px) {\\n .profile__heading-top {\\n grid-template-columns: auto minmax(0, 1fr) auto;\\n grid-template-areas:\\n \\\"avatar info actions\\\"\\n \\\"details details details\\\";\\n column-gap: var(--spacing-sm, 0.75rem);\\n row-gap: var(--spacing-sm, 0.75rem);\\n }\\n\\n .profile__name {\\n font-size: 1.5rem;\\n line-height: 1.15;\\n }\\n\\n .profile__identity {\\n gap: 0.125rem;\\n }\\n\\n .profile__pronouns {\\n font-size: var(--font-size-xs, 0.75rem);\\n line-height: 1.1;\\n white-space: nowrap;\\n }\\n\\n .profile__hero,\\n .profile__hero-alt {\\n width: 112px;\\n height: 112px;\\n }\\n\\n .profile__hero-alt {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 0;\\n }\\n\\n .profile__hero-icon {\\n display: block;\\n margin: 0 auto;\\n width: 48px;\\n height: 48px;\\n }\\n\\n .profile__details {\\n gap: var(--spacing-xs, 0.5rem);\\n }\\n\\n .profile__meta-row,\\n .profile__contact-row {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n column-gap: 0.25rem;\\n }\\n}\\n\\n@container profile-pane (max-width: 640px) {\\n .profile__heading-top {\\n grid-template-columns: auto minmax(0, 1fr) auto;\\n grid-template-areas:\\n \\\"avatar info actions\\\"\\n \\\"details details details\\\";\\n column-gap: var(--spacing-sm, 0.75rem);\\n row-gap: var(--spacing-sm, 0.75rem);\\n }\\n\\n .profile__name {\\n font-size: 1.5rem;\\n line-height: 1.15;\\n }\\n\\n .profile__identity {\\n gap: 0.125rem;\\n }\\n\\n .profile__pronouns {\\n font-size: var(--font-size-xs, 0.75rem);\\n line-height: 1.1;\\n white-space: nowrap;\\n }\\n\\n .profile__hero,\\n .profile__hero-alt {\\n width: 112px;\\n height: 112px;\\n }\\n\\n .profile__hero-alt {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: 0;\\n }\\n\\n .profile__hero-icon {\\n display: block;\\n margin: 0 auto;\\n width: 48px;\\n height: 48px;\\n }\\n\\n .profile__details {\\n gap: var(--spacing-xs, 0.5rem);\\n }\\n\\n .profile__meta-row,\\n .profile__contact-row {\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n column-gap: 0.25rem;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileCard.css */\n/* Uses utilities: .action-button-focus, .btn-primary, .flex-column-center, .text-truncate, .text-center, .text-wrap-anywhere, .section-centered, .btn-transparent */\n\n.profileCard {\n /* Component container */\n}\n\n.name {\n font-size: var(--font-size-xl);\n font-weight: 700;\n line-height: var(--line-height-tight);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n margin: 0;\n letter-spacing: var(--letter-spacing-wide);\n}\n\n.profile__actions {\n color: var(--color-text-secondary);\n font-size: var(--font-size-base, 1rem);\n margin-bottom: var(--spacing-xs);\n}\n\n.buttonSubSection {\n width: 100%;\n min-width: 0;\n display: grid;\n}\n\n.buttonSubSection button {\n width: 100%;\n min-width: 0;\n}\n\n/* Ensure prompt inputs stretch to fit their container */\n.add-friend-button-container input[type=\"text\"] {\n width: 100%;\n box-sizing: border-box;\n}\n\n.profile__qr-code {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n align-self: stretch;\n /* OLD color: var(--color-text-secondary);\n font-size: 1em;\n margin-bottom: var(--spacing-xs); */\n}\n\n.details {\n color: var(--color-text-muted);\n font-size: var(--font-size-base);\n line-height: var(--line-height-base);\n max-width: 45ch;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* ProfileCard styles as regular CSS */\n.profile-card {\n border: 1px solid #ccc;\n padding: 16px;\n background: white;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ProfileCard.css\"],\"names\":[],\"mappings\":\"AAAA,oBAAoB;AACpB,oKAAoK;;AAEpK;EACE,wBAAwB;AAC1B;;AAEA;EACE,8BAA8B;EAC9B,gBAAgB;EAChB,qCAAqC;EACrC,0BAA0B;EAC1B,4BAA4B;EAC5B,SAAS;EACT,0CAA0C;AAC5C;;AAEA;EACE,kCAAkC;EAClC,sCAAsC;EACtC,gCAAgC;AAClC;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,aAAa;AACf;;AAEA;EACE,WAAW;EACX,YAAY;AACd;;AAEA,wDAAwD;AACxD;EACE,WAAW;EACX,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,SAAS;EACT,mBAAmB;EACnB;;qCAEmC;AACrC;;AAEA;EACE,8BAA8B;EAC9B,gCAAgC;EAChC,oCAAoC;EACpC,eAAe;EACf,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA,sCAAsC;AACtC;EACE,sBAAsB;EACtB,aAAa;EACb,iBAAiB;AACnB\",\"sourcesContent\":[\"/* ProfileCard.css */\\n/* Uses utilities: .action-button-focus, .btn-primary, .flex-column-center, .text-truncate, .text-center, .text-wrap-anywhere, .section-centered, .btn-transparent */\\n\\n.profileCard {\\n /* Component container */\\n}\\n\\n.name {\\n font-size: var(--font-size-xl);\\n font-weight: 700;\\n line-height: var(--line-height-tight);\\n text-decoration: underline;\\n text-underline-offset: 0.2em;\\n margin: 0;\\n letter-spacing: var(--letter-spacing-wide);\\n}\\n\\n.profile__actions {\\n color: var(--color-text-secondary);\\n font-size: var(--font-size-base, 1rem);\\n margin-bottom: var(--spacing-xs);\\n}\\n\\n.buttonSubSection {\\n width: 100%;\\n min-width: 0;\\n display: grid;\\n}\\n\\n.buttonSubSection button {\\n width: 100%;\\n min-width: 0;\\n}\\n\\n/* Ensure prompt inputs stretch to fit their container */\\n.add-friend-button-container input[type=\\\"text\\\"] {\\n width: 100%;\\n box-sizing: border-box;\\n}\\n\\n.profile__qr-code {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n gap: 20px;\\n align-self: stretch;\\n /* OLD color: var(--color-text-secondary);\\n font-size: 1em;\\n margin-bottom: var(--spacing-xs); */\\n}\\n\\n.details {\\n color: var(--color-text-muted);\\n font-size: var(--font-size-base);\\n line-height: var(--line-height-base);\\n max-width: 45ch;\\n margin-left: auto;\\n margin-right: auto;\\n}\\n\\n/* ProfileCard styles as regular CSS */\\n.profile-card {\\n border: 1px solid #ccc;\\n padding: 16px;\\n background: white;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileView.css */\n/* Uses utilities: .section-bg, .text-center */\n\n\n.profile-grid .profile__main {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box;\n margin-bottom: 0;\n overflow-wrap: anywhere;\n align-items: flex-start;\n}\n\n.profile-grid .profile__sidebar {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n text-align: left;\n border-radius: var(--border-radius-base);\n background: var(--color-background, #F8F9FB);\n width: 100%;\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box;\n overflow-x: clip;\n}\n\n.profile-grid .profile__section {\n padding: var(--spacing-lg);\n border-radius: var(--border-radius-base);\n background: var(--white, #FFF);\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n overflow-x: clip;\n}\n\n.profile-grid .profile__section--empty {\n box-sizing: border-box;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n overflow-x: clip;\n}\n\n\n/* SAM Not sure this is needed, and potentially should be moved somewhere else */\n.profile-grid .phone-type {\n font-size: var(--font-size-sm);\n line-height: var(--line-height-base);\n color: var(--color-text-secondary);\n}\n\n@container profile-pane (max-width: 1000px) {\n #main-content.profile-grid {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin-inline: auto !important;\n padding-inline: var(--spacing-sm, 0.75rem) !important;\n }\n}\n\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ProfileView.css\"],\"names\":[],\"mappings\":\"AAAA,oBAAoB;AACpB,8CAA8C;;;AAG9C;EACE,WAAW;EACX,eAAe;EACf,YAAY;EACZ,sBAAsB;EACtB,gBAAgB;EAChB,uBAAuB;EACvB,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,oBAAoB;EACpB,gBAAgB;EAChB,wCAAwC;EACxC,4CAA4C;EAC5C,WAAW;EACX,eAAe;EACf,YAAY;EACZ,sBAAsB;EACtB,gBAAgB;AAClB;;AAEA;EACE,0BAA0B;EAC1B,wCAAwC;EACxC,8BAA8B;EAC9B,sBAAsB;EACtB,WAAW;EACX,eAAe;EACf,YAAY;EACZ,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;EACtB,WAAW;EACX,eAAe;EACf,YAAY;EACZ,gBAAgB;AAClB;;;AAGA,gFAAgF;AAChF;EACE,8BAA8B;EAC9B,oCAAoC;EACpC,kCAAkC;AACpC;;AAEA;EACE;IACE,WAAW;IACX,eAAe;IACf,sBAAsB;IACtB,8BAA8B;IAC9B,qDAAqD;EACvD;AACF\",\"sourcesContent\":[\"/* ProfileView.css */\\n/* Uses utilities: .section-bg, .text-center */\\n\\n\\n.profile-grid .profile__main {\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n box-sizing: border-box;\\n margin-bottom: 0;\\n overflow-wrap: anywhere;\\n align-items: flex-start;\\n}\\n\\n.profile-grid .profile__sidebar {\\n display: flex;\\n flex-direction: column;\\n align-items: stretch;\\n text-align: left;\\n border-radius: var(--border-radius-base);\\n background: var(--color-background, #F8F9FB);\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n box-sizing: border-box;\\n overflow-x: clip;\\n}\\n\\n.profile-grid .profile__section {\\n padding: var(--spacing-lg);\\n border-radius: var(--border-radius-base);\\n background: var(--white, #FFF);\\n box-sizing: border-box;\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n overflow-x: clip;\\n}\\n\\n.profile-grid .profile__section--empty {\\n box-sizing: border-box;\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n overflow-x: clip;\\n}\\n\\n\\n/* SAM Not sure this is needed, and potentially should be moved somewhere else */\\n.profile-grid .phone-type {\\n font-size: var(--font-size-sm);\\n line-height: var(--line-height-base);\\n color: var(--color-text-secondary);\\n}\\n\\n@container profile-pane (max-width: 1000px) {\\n #main-content.profile-grid {\\n width: 100%;\\n max-width: 100%;\\n box-sizing: border-box;\\n margin-inline: auto !important;\\n padding-inline: var(--spacing-sm, 0.75rem) !important;\\n }\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* The following are the original styles for the ProjectsCard section. */\n.project-card__rail {\n display: flex;\n gap: 1rem;\n overflow-x: auto;\n padding: 0;\n margin: 0;\n list-style: none;\n scroll-snap-type: x proximity;\n}\n.project-card__follow-button {\n width: auto;\n border-radius: var(--border-radius-md, 0.5rem);\n border: var(--border-width-sm, 0.1rem) solid var(--color-primary, #7C4DFF); \n padding: 0.5rem 0.625rem; /* ~8px 10px, increased by ~2px in rem */\n color: var(--color-primary, #7C4DFF);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-md, 500);\n background: var(--white, #FFF);\n cursor: pointer;\n}\n\n.project-card__follow-button:hover {\n background: var(--lavender-400, #cbb9ff);\n}\n\n.project-card__rail::-webkit-scrollbar {\n height: 8px;\n}\n\n.project-card__rail::-webkit-scrollbar-thumb {\n background: #b0b7c3;\n border-radius: 999px;\n}\n\n.project-card {\n flex: 0 0 min(420px, 88vw);\n scroll-snap-align: start;\n border-radius: var(--border-radius-md, 0.5rem);\n border: var(--border-width-sm, 0.1rem) solid var(--gray-200, #E5E7EB);\n padding: var(--spacing-md, 1.25rem);\n justify-content: center;\n align-items: flex-start;\n gap: var(--spacing-sm, 0.938rem);\n flex-shrink: 0;\n}\n\n.project-card__link {\n display: block;\n color: inherit;\n text-decoration: none;\n}\n\n.project-card__link:hover .project-card__title,\n.project-card__link:focus-visible .project-card__title {\n text-decoration: underline;\n}\n\n.project-card__wrapper {\n display: grid;\n grid-template-columns: 88px 1fr;\n gap: 0.9rem;\n align-items: start;\n padding-bottom: 0.563rem;\n border-radius: var(--border-radius-md, 0.5rem);\n border-bottom: 1px solid var(--gray-200, #E5E7EB);\n}\n\n.project-card__thumb {\n width: 66px;\n height: 66px;\n overflow: hidden;\n border-radius: var(--border-radius-base, 0.3125rem);\n background: var(--gray-200, #E5E7EB);\n padding: 0.656rem var(--spacing-2xs, 0.625rem);\n aspect-ratio: 1/1;\n}\n\n.project-card__thumb-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.project-card__thumb-fallback {\n width: 100%;\n height: 100%;\n font-size: 0.72rem;\n color: #5a6476;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.project-card__content {\n min-width: 0;\n}\n\n.project-card__title,\n.project-card__organization,\n.project-card__category,\n.project-card__meta,\n.project-card__description {\n margin: 0;\n}\n\n.project-card__title {\n overflow: hidden;\n color: var(--gray-900, #101828);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--font-size-lg, 1.125rem);\n font-weight: var(--font-weight-bold, 600);\n align-self: stretch;\n}\n\n.project-card__organization {\n margin-top: 0.35rem;\n color: var(--gray-700, #364153);\n font-size: var(--font-size-sm, 0.875rem);\n font-weight: var(--font-weight-md, 500);\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n line-height: 1.35;\n max-height: calc(1.35em * 2);\n align-self: stretch;\n}\n\n.project-card__category {\n font-size: var(--font-size-xxs, 0.75rem);\n font-weight: var(--font-weight-md, 500);\n}\n\n.project-card__category--project {\n color: var(--purple-500, #AD46FF);\n \n}\n\n.project-card__category--community {\n color: var(--yellow-700, #A65F00);\n}\n\n.project-card__category--unknown {\n color: var(--slate-700, #314158);\n}\n\n.project-card__meta {\n margin-top: 0.55rem;\n overflow-wrap: anywhere;\n font-size: 0.86rem;\n}\n\n.project-card__footer {\n margin-top: 0.8rem;\n padding: 0.75rem;\n\n}\n\n.project-card__more-button {\n display: none;\n}\n\n@media (max-width: 640px) {\n .project-card__rail {\n flex-wrap: wrap;\n overflow-x: visible;\n scroll-snap-type: none;\n }\n\n .project-card {\n flex: 1 1 100%;\n max-width: 100%;\n }\n\n .profile-section-collapsible[data-mobile-expanded=\"false\"] .project-card:nth-child(n + 3) {\n display: none;\n }\n\n .project-card__more-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.375rem;\n width: 100%;\n margin-top: 0.75rem;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--color-primary, #7C4DFF);\n font-size: var(--font-size-sm, 0.875rem);\n font-weight: var(--font-weight-bold, 600);\n cursor: pointer;\n }\n\n .project-card__more-button[data-mobile-expanded=\"true\"] .project-card__more-icon {\n transform: rotate(180deg);\n }\n\n .project-card__more-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--animation-duration, 0.2s) ease;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/ProjectsCard.css\"],\"names\":[],\"mappings\":\"AAAA,yEAAyE;AACzE;EACE,aAAa;EACb,SAAS;EACT,gBAAgB;EAChB,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,6BAA6B;AAC/B;AACA;EACE,WAAW;EACX,8CAA8C;EAC9C,0EAA0E;EAC1E,wBAAwB,EAAE,wCAAwC;EAClE,oCAAoC;EACpC,wCAAwC,EAAE,SAAS;EACnD,uCAAuC;EACvC,8BAA8B;EAC9B,eAAe;AACjB;;AAEA;EACE,wCAAwC;AAC1C;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,mBAAmB;EACnB,oBAAoB;AACtB;;AAEA;EACE,0BAA0B;EAC1B,wBAAwB;EACxB,8CAA8C;EAC9C,qEAAqE;EACrE,mCAAmC;EACnC,uBAAuB;EACvB,uBAAuB;EACvB,gCAAgC;EAChC,cAAc;AAChB;;AAEA;EACE,cAAc;EACd,cAAc;EACd,qBAAqB;AACvB;;AAEA;;EAEE,0BAA0B;AAC5B;;AAEA;EACE,aAAa;EACb,+BAA+B;EAC/B,WAAW;EACX,kBAAkB;EAClB,wBAAwB;EACxB,8CAA8C;EAC9C,iDAAiD;AACnD;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,mDAAmD;EACnD,oCAAoC;EACpC,8CAA8C;EAC9C,iBAAiB;AACnB;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,cAAc;AAChB;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,cAAc;EACd,yBAAyB;EACzB,sBAAsB;AACxB;;AAEA;EACE,YAAY;AACd;;AAEA;;;;;EAKE,SAAS;AACX;;AAEA;EACE,gBAAgB;EAChB,+BAA+B;EAC/B,uBAAuB;EACvB,mBAAmB;EACnB,wCAAwC;EACxC,yCAAyC;EACzC,mBAAmB;AACrB;;AAEA;EACE,mBAAmB;EACnB,+BAA+B;EAC/B,wCAAwC;EACxC,uCAAuC;EACvC,gBAAgB;EAChB,uBAAuB;EACvB,cAAc;EACd,iBAAiB;EACjB,4BAA4B;EAC5B,mBAAmB;AACrB;;AAEA;EACE,wCAAwC;EACxC,uCAAuC;AACzC;;AAEA;EACE,iCAAiC;;AAEnC;;AAEA;EACE,iCAAiC;AACnC;;AAEA;EACE,gCAAgC;AAClC;;AAEA;EACE,mBAAmB;EACnB,uBAAuB;EACvB,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;EAClB,gBAAgB;;AAElB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE;IACE,eAAe;IACf,mBAAmB;IACnB,sBAAsB;EACxB;;EAEA;IACE,cAAc;IACd,eAAe;EACjB;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,aAAa;IACb,WAAW;IACX,mBAAmB;IACnB,UAAU;IACV,SAAS;IACT,uBAAuB;IACvB,oCAAoC;IACpC,wCAAwC;IACxC,yCAAyC;IACzC,eAAe;EACjB;;EAEA;IACE,yBAAyB;EAC3B;;EAEA;IACE,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,0DAA0D;EAC5D;AACF\",\"sourcesContent\":[\"/* The following are the original styles for the ProjectsCard section. */\\n.project-card__rail {\\n display: flex;\\n gap: 1rem;\\n overflow-x: auto;\\n padding: 0;\\n margin: 0;\\n list-style: none;\\n scroll-snap-type: x proximity;\\n}\\n.project-card__follow-button {\\n width: auto;\\n border-radius: var(--border-radius-md, 0.5rem);\\n border: var(--border-width-sm, 0.1rem) solid var(--color-primary, #7C4DFF); \\n padding: 0.5rem 0.625rem; /* ~8px 10px, increased by ~2px in rem */\\n color: var(--color-primary, #7C4DFF);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-md, 500);\\n background: var(--white, #FFF);\\n cursor: pointer;\\n}\\n\\n.project-card__follow-button:hover {\\n background: var(--lavender-400, #cbb9ff);\\n}\\n\\n.project-card__rail::-webkit-scrollbar {\\n height: 8px;\\n}\\n\\n.project-card__rail::-webkit-scrollbar-thumb {\\n background: #b0b7c3;\\n border-radius: 999px;\\n}\\n\\n.project-card {\\n flex: 0 0 min(420px, 88vw);\\n scroll-snap-align: start;\\n border-radius: var(--border-radius-md, 0.5rem);\\n border: var(--border-width-sm, 0.1rem) solid var(--gray-200, #E5E7EB);\\n padding: var(--spacing-md, 1.25rem);\\n justify-content: center;\\n align-items: flex-start;\\n gap: var(--spacing-sm, 0.938rem);\\n flex-shrink: 0;\\n}\\n\\n.project-card__link {\\n display: block;\\n color: inherit;\\n text-decoration: none;\\n}\\n\\n.project-card__link:hover .project-card__title,\\n.project-card__link:focus-visible .project-card__title {\\n text-decoration: underline;\\n}\\n\\n.project-card__wrapper {\\n display: grid;\\n grid-template-columns: 88px 1fr;\\n gap: 0.9rem;\\n align-items: start;\\n padding-bottom: 0.563rem;\\n border-radius: var(--border-radius-md, 0.5rem);\\n border-bottom: 1px solid var(--gray-200, #E5E7EB);\\n}\\n\\n.project-card__thumb {\\n width: 66px;\\n height: 66px;\\n overflow: hidden;\\n border-radius: var(--border-radius-base, 0.3125rem);\\n background: var(--gray-200, #E5E7EB);\\n padding: 0.656rem var(--spacing-2xs, 0.625rem);\\n aspect-ratio: 1/1;\\n}\\n\\n.project-card__thumb-image {\\n width: 100%;\\n height: 100%;\\n object-fit: cover;\\n display: block;\\n}\\n\\n.project-card__thumb-fallback {\\n width: 100%;\\n height: 100%;\\n font-size: 0.72rem;\\n color: #5a6476;\\n text-transform: uppercase;\\n letter-spacing: 0.04em;\\n}\\n\\n.project-card__content {\\n min-width: 0;\\n}\\n\\n.project-card__title,\\n.project-card__organization,\\n.project-card__category,\\n.project-card__meta,\\n.project-card__description {\\n margin: 0;\\n}\\n\\n.project-card__title {\\n overflow: hidden;\\n color: var(--gray-900, #101828);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n font-size: var(--font-size-lg, 1.125rem);\\n font-weight: var(--font-weight-bold, 600);\\n align-self: stretch;\\n}\\n\\n.project-card__organization {\\n margin-top: 0.35rem;\\n color: var(--gray-700, #364153);\\n font-size: var(--font-size-sm, 0.875rem);\\n font-weight: var(--font-weight-md, 500);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: block;\\n line-height: 1.35;\\n max-height: calc(1.35em * 2);\\n align-self: stretch;\\n}\\n\\n.project-card__category {\\n font-size: var(--font-size-xxs, 0.75rem);\\n font-weight: var(--font-weight-md, 500);\\n}\\n\\n.project-card__category--project {\\n color: var(--purple-500, #AD46FF);\\n \\n}\\n\\n.project-card__category--community {\\n color: var(--yellow-700, #A65F00);\\n}\\n\\n.project-card__category--unknown {\\n color: var(--slate-700, #314158);\\n}\\n\\n.project-card__meta {\\n margin-top: 0.55rem;\\n overflow-wrap: anywhere;\\n font-size: 0.86rem;\\n}\\n\\n.project-card__footer {\\n margin-top: 0.8rem;\\n padding: 0.75rem;\\n\\n}\\n\\n.project-card__more-button {\\n display: none;\\n}\\n\\n@media (max-width: 640px) {\\n .project-card__rail {\\n flex-wrap: wrap;\\n overflow-x: visible;\\n scroll-snap-type: none;\\n }\\n\\n .project-card {\\n flex: 1 1 100%;\\n max-width: 100%;\\n }\\n\\n .profile-section-collapsible[data-mobile-expanded=\\\"false\\\"] .project-card:nth-child(n + 3) {\\n display: none;\\n }\\n\\n .project-card__more-button {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 0.375rem;\\n width: 100%;\\n margin-top: 0.75rem;\\n padding: 0;\\n border: 0;\\n background: transparent;\\n color: var(--color-primary, #7C4DFF);\\n font-size: var(--font-size-sm, 0.875rem);\\n font-weight: var(--font-weight-bold, 600);\\n cursor: pointer;\\n }\\n\\n .project-card__more-button[data-mobile-expanded=\\\"true\\\"] .project-card__more-icon {\\n transform: rotate(180deg);\\n }\\n\\n .project-card__more-icon {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n transition: transform var(--animation-duration, 0.2s) ease;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* QRCodeCard.css */\n/* Note: Uses utilities: .text-center */\n\n/* Caption under the QR code */\n.qrcode-card__caption {\n text-align: center;\n margin-top: 0;\n padding-bottom: 0.25rem;\n color: var(--gray-800, #1E2939);\n font-size: var(--font-size-md, 1rem); /* 16px */\n font-weight: var(--font-weight-md, 500);\n}\n\n.qrcode-card {\n width: 136px;\n margin: 0 auto;\n height: auto;\n flex-shrink: 0;\n}\n\n.qrcode-card__frame {\n padding: 1rem 1rem 1.25rem 1.063rem; /* 16px 16px 20px 17px */\n border-radius: var(--border-radius-base, 0.3125rem); /* 5px */\n border: var(--border-width-thin, 0.1rem) solid var(--gray-200, #E5E7EB);\n background: var(--gray-100, #F3F4F6);\n}\n\n.qrcode-card [role=\"img\"]:focus {\n outline: var(--border-width-medium, 2px) solid var(--color-primary, #7C4DFF);\n outline-offset: 2px;\n box-shadow: 0 0 0 2px rgba(124,77,255,0.2);\n}\n\n.qrcode-card [role=\"img\"] {\n width: 136px;\n height: 136px;\n}\n\n.qrcode-card [role=\"img\"] svg {\n width: 100%;\n height: 100%;\n display: block;\n}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/QRCodeCard.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,uCAAuC;;AAEvC,8BAA8B;AAC9B;EACE,kBAAkB;EAClB,aAAa;EACb,uBAAuB;EACvB,+BAA+B;EAC/B,oCAAoC,EAAE,SAAS;EAC/C,uCAAuC;AACzC;;AAEA;EACE,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,mCAAmC,EAAE,wBAAwB;EAC7D,mDAAmD,EAAE,QAAQ;EAC7D,uEAAuE;EACvE,oCAAoC;AACtC;;AAEA;EACE,4EAA4E;EAC5E,mBAAmB;EACnB,0CAA0C;AAC5C;;AAEA;EACE,YAAY;EACZ,aAAa;AACf;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,cAAc;AAChB\",\"sourcesContent\":[\"/* QRCodeCard.css */\\n/* Note: Uses utilities: .text-center */\\n\\n/* Caption under the QR code */\\n.qrcode-card__caption {\\n text-align: center;\\n margin-top: 0;\\n padding-bottom: 0.25rem;\\n color: var(--gray-800, #1E2939);\\n font-size: var(--font-size-md, 1rem); /* 16px */\\n font-weight: var(--font-weight-md, 500);\\n}\\n\\n.qrcode-card {\\n width: 136px;\\n margin: 0 auto;\\n height: auto;\\n flex-shrink: 0;\\n}\\n\\n.qrcode-card__frame {\\n padding: 1rem 1rem 1.25rem 1.063rem; /* 16px 16px 20px 17px */\\n border-radius: var(--border-radius-base, 0.3125rem); /* 5px */\\n border: var(--border-width-thin, 0.1rem) solid var(--gray-200, #E5E7EB);\\n background: var(--gray-100, #F3F4F6);\\n}\\n\\n.qrcode-card [role=\\\"img\\\"]:focus {\\n outline: var(--border-width-medium, 2px) solid var(--color-primary, #7C4DFF);\\n outline-offset: 2px;\\n box-shadow: 0 0 0 2px rgba(124,77,255,0.2);\\n}\\n\\n.qrcode-card [role=\\\"img\\\"] {\\n width: 136px;\\n height: 136px;\\n}\\n\\n.qrcode-card [role=\\\"img\\\"] svg {\\n width: 100%;\\n height: 100%;\\n display: block;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* SocialCard.css */\n/* Uses utilities: .list-reset, .text-wrap-anywhere, .flex, .gap-sm, .gap-lg, .rounded-sm */\n\n.socialList {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--spacing-xxs);\n justify-content: flex-start;\n}\n\n.socialItem {\n display: flex;\n align-items: center;\n}\n\n.socialItem a {\n color: var(--color-primary);\n text-decoration: none;\n display: flex;\n align-items: center;\n min-height: var(--min-touch-target);\n padding: var(--spacing-xxs); \n border-radius: var(--border-radius-base);\n transition: background-color var(--animation-duration) ease;\n position: relative;\n flex: 1;\n min-width: 0;\n}\n\n.socialItem a:hover,\n.socialItem a:focus {\n text-decoration: underline;\n background-color: rgba(124, 77, 255, 0.1);\n}\n\n/* Screen reader only external link indication */\n.socialItem a[href^=\"http\"]:after {\n content: \" (external link)\";\n position: absolute;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n}\n\n.socialIcon {\n width: var(--icon-base);\n height: var(--icon-base);\n border-radius: var(--border-radius-base);\n background: var(--color-card-bg);\n flex-shrink: 0;\n}\n\n.socialCard__more-button {\n display: none;\n}\n\n@media (max-width: 1000px) {\n .socialCard .socialList {\n display: grid;\n grid-template-columns: repeat(5, max-content);\n justify-content: flex-start;\n }\n\n .socialCard[data-mobile-expanded=\"true\"] .socialList {\n grid-template-columns: repeat(3, max-content);\n }\n\n .socialCard[data-mobile-expanded=\"false\"] .socialItem:nth-child(n + 11) {\n display: none;\n }\n\n .socialCard__more-button {\n display: inline-flex;\n margin-top: var(--spacing-xs);\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--color-primary, #7C4DFF);\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n }\n\n .socialCard[data-mobile-expanded=\"true\"] .socialCard__more-button {\n display: none;\n }\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/SocialCard.css\"],\"names\":[],\"mappings\":\"AAAA,mBAAmB;AACnB,2FAA2F;;AAE3F;EACE,aAAa;EACb,mBAAmB;EACnB,eAAe;EACf,uBAAuB;EACvB,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,2BAA2B;EAC3B,qBAAqB;EACrB,aAAa;EACb,mBAAmB;EACnB,mCAAmC;EACnC,2BAA2B;EAC3B,wCAAwC;EACxC,2DAA2D;EAC3D,kBAAkB;EAClB,OAAO;EACP,YAAY;AACd;;AAEA;;EAEE,0BAA0B;EAC1B,yCAAyC;AAC3C;;AAEA,gDAAgD;AAChD;EACE,2BAA2B;EAC3B,kBAAkB;EAClB,cAAc;EACd,UAAU;EACV,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,uBAAuB;EACvB,wBAAwB;EACxB,wCAAwC;EACxC,gCAAgC;EAChC,cAAc;AAChB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE;IACE,aAAa;IACb,6CAA6C;IAC7C,2BAA2B;EAC7B;;EAEA;IACE,6CAA6C;EAC/C;;EAEA;IACE,aAAa;EACf;;EAEA;IACE,oBAAoB;IACpB,6BAA6B;IAC7B,UAAU;IACV,SAAS;IACT,uBAAuB;IACvB,oCAAoC;IACpC,aAAa;IACb,gBAAgB;IAChB,eAAe;EACjB;;EAEA;IACE,aAAa;EACf;AACF\",\"sourcesContent\":[\"/* SocialCard.css */\\n/* Uses utilities: .list-reset, .text-wrap-anywhere, .flex, .gap-sm, .gap-lg, .rounded-sm */\\n\\n.socialList {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap;\\n gap: var(--spacing-xxs);\\n justify-content: flex-start;\\n}\\n\\n.socialItem {\\n display: flex;\\n align-items: center;\\n}\\n\\n.socialItem a {\\n color: var(--color-primary);\\n text-decoration: none;\\n display: flex;\\n align-items: center;\\n min-height: var(--min-touch-target);\\n padding: var(--spacing-xxs); \\n border-radius: var(--border-radius-base);\\n transition: background-color var(--animation-duration) ease;\\n position: relative;\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.socialItem a:hover,\\n.socialItem a:focus {\\n text-decoration: underline;\\n background-color: rgba(124, 77, 255, 0.1);\\n}\\n\\n/* Screen reader only external link indication */\\n.socialItem a[href^=\\\"http\\\"]:after {\\n content: \\\" (external link)\\\";\\n position: absolute;\\n left: -10000px;\\n width: 1px;\\n height: 1px;\\n overflow: hidden;\\n}\\n\\n.socialIcon {\\n width: var(--icon-base);\\n height: var(--icon-base);\\n border-radius: var(--border-radius-base);\\n background: var(--color-card-bg);\\n flex-shrink: 0;\\n}\\n\\n.socialCard__more-button {\\n display: none;\\n}\\n\\n@media (max-width: 1000px) {\\n .socialCard .socialList {\\n display: grid;\\n grid-template-columns: repeat(5, max-content);\\n justify-content: flex-start;\\n }\\n\\n .socialCard[data-mobile-expanded=\\\"true\\\"] .socialList {\\n grid-template-columns: repeat(3, max-content);\\n }\\n\\n .socialCard[data-mobile-expanded=\\\"false\\\"] .socialItem:nth-child(n + 11) {\\n display: none;\\n }\\n\\n .socialCard__more-button {\\n display: inline-flex;\\n margin-top: var(--spacing-xs);\\n padding: 0;\\n border: 0;\\n background: transparent;\\n color: var(--color-primary, #7C4DFF);\\n font: inherit;\\n font-weight: 600;\\n cursor: pointer;\\n }\\n\\n .socialCard[data-mobile-expanded=\\\"true\\\"] .socialCard__more-button {\\n display: none;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* CSS for the accessible modal dialogs created by dialog.ts */\n/* dialog host */\n#profile-modal {\n margin: 0;\n padding: 0;\n border: none;\n background: rgba(0, 0, 0, 0.5);\n max-width: none;\n max-height: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n position: fixed;\n inset: 0;\n display: grid;\n place-items: center;\n z-index: 9999;\n}\n\n#profile-modal:not([open]) {\n display: none;\n}\n\n#profile-modal::backdrop {\n background: rgba(0, 0, 0, 0.5);\n}\n\n#profile-modal .modal {\n box-sizing: border-box;\n margin: 0;\n background: var(--color-background);\n padding: var(--spacing-lg);\n border-radius: var(--border-radius-base);\n max-width: 100%;\n width: min(640px, 92vw);\n max-height: 85vh;\n overflow: auto;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n}\n\n#profile-modal .modal .modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-lg);\n margin: calc(-1 * var(--spacing-lg)) calc(-1 * var(--spacing-lg)) var(--spacing-sm) calc(-1 * var(--spacing-lg));\n padding: var(--spacing-lg);\n border-radius: var(--border-radius-base, 0.3125rem) var(--border-radius-base, 0.3125rem) 0 0;\n border: var(--border-width-sm, 0.1rem) solid var(--slate-200, #E2E8F0);\n background: var(--slate-50, #F8FAFC);\n}\n\n#profile-modal .modal #modal-title {\n margin: 0;\n}\n\n#profile-modal .modal #modal-header-action > button[aria-label=\"Close dialog\"] {\n min-height: 2rem;\n min-width: 2rem;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--color-text);\n font-size: 1.5rem;\n line-height: 1;\n cursor: pointer;\n}\n\n#profile-modal .modal #modal-header-action > button[aria-label=\"Close dialog\"]:hover {\n color: var(--color-primary);\n}\n\n#profile-modal .modal #modal-header-action {\n display: flex;\n align-items: center;\n}\n\n#profile-modal .modal .modal__header-action-button {\n min-height: auto;\n padding: var(--spacing-xxs);\n border: none;\n background: none;\n color: var(--color-primary);\n font-weight: 500;\n}\n\n#profile-modal .modal .modal__header-action-button:hover {\n text-decoration: underline;\n}\n\n/* button container: center buttons horizontally (uses id in markup) */\n#profile-modal #modal-buttons {\n display: flex;\n padding: 20px 0 20px 30px;\n justify-content: flex-end;\n align-items: center;\n gap: 15px;\n align-self: stretch;\n border-top: var(--border-width-sm, 0.1rem) solid var(--slate-200, #E2E8F0);\n background: var(--gray-50, #F9FAFB);\n}\n\n#profile-modal #modal-buttons button {\n width: 10.8rem;\n}\n\n#profile-modal .modal__error-section {\n margin-top: var(--spacing-sm);\n}\n\n#profile-modal .modal__error-section[hidden] {\n display: none !important;\n}\n\n\n/* buttons themselves use the shared btn-primary rules */\n#profile-modal .modal button {\n min-height: var(--min-touch-target);\n padding: var(--spacing-sm) var(--spacing-md);\n border: 1px solid var(--color-primary);\n border-radius: var(--border-radius-base);\n font-weight: 600;\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n}\n\n#profile-modal .modal button.btn-primary {\n background: var(--color-primary);\n color: var(--white, #FFF);\n font-size: var(--font-size-lg, 1.125rem); /* 18px */\n font-weight: var(--font-weight-bold, 600);\n}\n\n#profile-modal .modal button.btn-primary:hover {\n background: color-mix(in srgb, var(--color-primary) 90%, black);\n box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);\n}\n\n#profile-modal .modal button.btn-primary:active {\n box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);\n}\n\n#profile-modal .modal button:disabled {\n opacity: var(--opacity-disabled, 0.6);\n cursor: not-allowed;\n transform: none;\n}\n\n/* Keep text-style actions in section headers while preserving footer button styling. */\n#profile-modal .modal .profile__section-header .profile__action-button {\n min-height: auto;\n padding: var(--spacing-xxs);\n border: none;\n background: none;\n color: var(--color-primary);\n font-weight: 500;\n}\n\n#profile-modal .modal .profile__section-header .profile__action-button:hover {\n text-decoration: underline;\n}\n\n@media (max-width: 640px) {\n #profile-modal {\n padding-top: max(var(--spacing-sm), env(safe-area-inset-top));\n padding-right: var(--spacing-sm);\n padding-bottom: max(var(--spacing-sm), env(safe-area-inset-bottom));\n padding-left: var(--spacing-sm);\n place-items: center;\n }\n\n #profile-modal .modal {\n width: min(420px, calc(100% - 2 * var(--spacing-sm)));\n max-width: 420px;\n max-height: calc(100dvh - 2 * var(--spacing-sm));\n padding: var(--spacing-md);\n border-radius: calc(var(--border-radius-base) * 0.75);\n overscroll-behavior: contain;\n justify-self: center;\n align-self: center;\n margin: 0;\n }\n\n #profile-modal .modal .modal-header {\n gap: var(--spacing-md);\n margin: calc(-1 * var(--spacing-md)) calc(-1 * var(--spacing-md)) var(--spacing-sm) calc(-1 * var(--spacing-md));\n padding: var(--spacing-md);\n }\n\n #profile-modal #modal-buttons {\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-sm, 0.938rem);\n padding: var(--spacing-md) 0 0;\n margin: var(--spacing-md) auto 0;\n box-sizing: border-box;\n width: 100%;\n }\n\n #profile-modal #modal-buttons button {\n flex: 0 0 auto;\n width: 10.8rem;\n min-width: 8.5rem;\n padding: var(--spacing-sm) var(--spacing-md);\n font-size: var(--font-size-md, 1rem);\n }\n\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/dialog.css\"],\"names\":[],\"mappings\":\"AAAA,8DAA8D;AAC9D,gBAAgB;AAChB;EACE,SAAS;EACT,UAAU;EACV,YAAY;EACZ,8BAA8B;EAC9B,eAAe;EACf,gBAAgB;EAChB,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,eAAe;EACf,QAAQ;EACR,aAAa;EACb,mBAAmB;EACnB,aAAa;AACf;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,sBAAsB;EACtB,SAAS;EACT,mCAAmC;EACnC,0BAA0B;EAC1B,wCAAwC;EACxC,eAAe;EACf,uBAAuB;EACvB,gBAAgB;EAChB,cAAc;EACd,yCAAyC;AAC3C;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;EAC9B,sBAAsB;EACtB,gHAAgH;EAChH,0BAA0B;EAC1B,4FAA4F;EAC5F,sEAAsE;EACtE,oCAAoC;AACtC;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,UAAU;EACV,YAAY;EACZ,uBAAuB;EACvB,wBAAwB;EACxB,iBAAiB;EACjB,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;EAC3B,YAAY;EACZ,gBAAgB;EAChB,2BAA2B;EAC3B,gBAAgB;AAClB;;AAEA;EACE,0BAA0B;AAC5B;;AAEA,sEAAsE;AACtE;EACE,aAAa;EACb,yBAAyB;EACzB,yBAAyB;EACzB,mBAAmB;EACnB,SAAS;EACT,mBAAmB;EACnB,0EAA0E;EAC1E,mCAAmC;AACrC;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,wBAAwB;AAC1B;;;AAGA,wDAAwD;AACxD;EACE,mCAAmC;EACnC,4CAA4C;EAC5C,sCAAsC;EACtC,wCAAwC;EACxC,gBAAgB;EAChB,eAAe;EACf,8CAA8C;AAChD;;AAEA;EACE,gCAAgC;EAChC,yBAAyB;EACzB,wCAAwC,EAAE,SAAS;EACnD,yCAAyC;AAC3C;;AAEA;EACE,+DAA+D;EAC/D,6CAA6C;AAC/C;;AAEA;EACE,6CAA6C;AAC/C;;AAEA;EACE,qCAAqC;EACrC,mBAAmB;EACnB,eAAe;AACjB;;AAEA,uFAAuF;AACvF;EACE,gBAAgB;EAChB,2BAA2B;EAC3B,YAAY;EACZ,gBAAgB;EAChB,2BAA2B;EAC3B,gBAAgB;AAClB;;AAEA;EACE,0BAA0B;AAC5B;;AAEA;EACE;IACE,6DAA6D;IAC7D,gCAAgC;IAChC,mEAAmE;IACnE,+BAA+B;IAC/B,mBAAmB;EACrB;;EAEA;IACE,qDAAqD;IACrD,gBAAgB;IAChB,gDAAgD;IAChD,0BAA0B;IAC1B,qDAAqD;IACrD,4BAA4B;IAC5B,oBAAoB;IACpB,kBAAkB;IAClB,SAAS;EACX;;EAEA;IACE,sBAAsB;IACtB,gHAAgH;IAChH,0BAA0B;EAC5B;;EAEA;IACE,mBAAmB;IACnB,mBAAmB;IACnB,uBAAuB;IACvB,gCAAgC;IAChC,8BAA8B;IAC9B,gCAAgC;IAChC,sBAAsB;IACtB,WAAW;EACb;;EAEA;IACE,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,4CAA4C;IAC5C,oCAAoC;EACtC;;AAEF\",\"sourcesContent\":[\"/* CSS for the accessible modal dialogs created by dialog.ts */\\n/* dialog host */\\n#profile-modal {\\n margin: 0;\\n padding: 0;\\n border: none;\\n background: rgba(0, 0, 0, 0.5);\\n max-width: none;\\n max-height: none;\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n position: fixed;\\n inset: 0;\\n display: grid;\\n place-items: center;\\n z-index: 9999;\\n}\\n\\n#profile-modal:not([open]) {\\n display: none;\\n}\\n\\n#profile-modal::backdrop {\\n background: rgba(0, 0, 0, 0.5);\\n}\\n\\n#profile-modal .modal {\\n box-sizing: border-box;\\n margin: 0;\\n background: var(--color-background);\\n padding: var(--spacing-lg);\\n border-radius: var(--border-radius-base);\\n max-width: 100%;\\n width: min(640px, 92vw);\\n max-height: 85vh;\\n overflow: auto;\\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\\n}\\n\\n#profile-modal .modal .modal-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--spacing-lg);\\n margin: calc(-1 * var(--spacing-lg)) calc(-1 * var(--spacing-lg)) var(--spacing-sm) calc(-1 * var(--spacing-lg));\\n padding: var(--spacing-lg);\\n border-radius: var(--border-radius-base, 0.3125rem) var(--border-radius-base, 0.3125rem) 0 0;\\n border: var(--border-width-sm, 0.1rem) solid var(--slate-200, #E2E8F0);\\n background: var(--slate-50, #F8FAFC);\\n}\\n\\n#profile-modal .modal #modal-title {\\n margin: 0;\\n}\\n\\n#profile-modal .modal #modal-header-action > button[aria-label=\\\"Close dialog\\\"] {\\n min-height: 2rem;\\n min-width: 2rem;\\n padding: 0;\\n border: none;\\n background: transparent;\\n color: var(--color-text);\\n font-size: 1.5rem;\\n line-height: 1;\\n cursor: pointer;\\n}\\n\\n#profile-modal .modal #modal-header-action > button[aria-label=\\\"Close dialog\\\"]:hover {\\n color: var(--color-primary);\\n}\\n\\n#profile-modal .modal #modal-header-action {\\n display: flex;\\n align-items: center;\\n}\\n\\n#profile-modal .modal .modal__header-action-button {\\n min-height: auto;\\n padding: var(--spacing-xxs);\\n border: none;\\n background: none;\\n color: var(--color-primary);\\n font-weight: 500;\\n}\\n\\n#profile-modal .modal .modal__header-action-button:hover {\\n text-decoration: underline;\\n}\\n\\n/* button container: center buttons horizontally (uses id in markup) */\\n#profile-modal #modal-buttons {\\n display: flex;\\n padding: 20px 0 20px 30px;\\n justify-content: flex-end;\\n align-items: center;\\n gap: 15px;\\n align-self: stretch;\\n border-top: var(--border-width-sm, 0.1rem) solid var(--slate-200, #E2E8F0);\\n background: var(--gray-50, #F9FAFB);\\n}\\n\\n#profile-modal #modal-buttons button {\\n width: 10.8rem;\\n}\\n\\n#profile-modal .modal__error-section {\\n margin-top: var(--spacing-sm);\\n}\\n\\n#profile-modal .modal__error-section[hidden] {\\n display: none !important;\\n}\\n\\n\\n/* buttons themselves use the shared btn-primary rules */\\n#profile-modal .modal button {\\n min-height: var(--min-touch-target);\\n padding: var(--spacing-sm) var(--spacing-md);\\n border: 1px solid var(--color-primary);\\n border-radius: var(--border-radius-base);\\n font-weight: 600;\\n cursor: pointer;\\n transition: all var(--animation-duration) ease;\\n}\\n\\n#profile-modal .modal button.btn-primary {\\n background: var(--color-primary);\\n color: var(--white, #FFF);\\n font-size: var(--font-size-lg, 1.125rem); /* 18px */\\n font-weight: var(--font-weight-bold, 600);\\n}\\n\\n#profile-modal .modal button.btn-primary:hover {\\n background: color-mix(in srgb, var(--color-primary) 90%, black);\\n box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);\\n}\\n\\n#profile-modal .modal button.btn-primary:active {\\n box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);\\n}\\n\\n#profile-modal .modal button:disabled {\\n opacity: var(--opacity-disabled, 0.6);\\n cursor: not-allowed;\\n transform: none;\\n}\\n\\n/* Keep text-style actions in section headers while preserving footer button styling. */\\n#profile-modal .modal .profile__section-header .profile__action-button {\\n min-height: auto;\\n padding: var(--spacing-xxs);\\n border: none;\\n background: none;\\n color: var(--color-primary);\\n font-weight: 500;\\n}\\n\\n#profile-modal .modal .profile__section-header .profile__action-button:hover {\\n text-decoration: underline;\\n}\\n\\n@media (max-width: 640px) {\\n #profile-modal {\\n padding-top: max(var(--spacing-sm), env(safe-area-inset-top));\\n padding-right: var(--spacing-sm);\\n padding-bottom: max(var(--spacing-sm), env(safe-area-inset-bottom));\\n padding-left: var(--spacing-sm);\\n place-items: center;\\n }\\n\\n #profile-modal .modal {\\n width: min(420px, calc(100% - 2 * var(--spacing-sm)));\\n max-width: 420px;\\n max-height: calc(100dvh - 2 * var(--spacing-sm));\\n padding: var(--spacing-md);\\n border-radius: calc(var(--border-radius-base) * 0.75);\\n overscroll-behavior: contain;\\n justify-self: center;\\n align-self: center;\\n margin: 0;\\n }\\n\\n #profile-modal .modal .modal-header {\\n gap: var(--spacing-md);\\n margin: calc(-1 * var(--spacing-md)) calc(-1 * var(--spacing-md)) var(--spacing-sm) calc(-1 * var(--spacing-md));\\n padding: var(--spacing-md);\\n }\\n\\n #profile-modal #modal-buttons {\\n flex-direction: row;\\n align-items: center;\\n justify-content: center;\\n gap: var(--spacing-sm, 0.938rem);\\n padding: var(--spacing-md) 0 0;\\n margin: var(--spacing-md) auto 0;\\n box-sizing: border-box;\\n width: 100%;\\n }\\n\\n #profile-modal #modal-buttons button {\\n flex: 0 0 auto;\\n width: 10.8rem;\\n min-width: 8.5rem;\\n padding: var(--spacing-sm) var(--spacing-md);\\n font-size: var(--font-size-md, 1rem);\\n }\\n\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layout, spacing, and responsiveness */\n/* These utilities are designed specfically for the profile pane */\n/* Utilities that can be shared by all panes should be added to dev-globals.css \n and to mashlib repo mash-utilities.css and then updated accross all pane\n development environments */\n:root {\n --profile-image-size: 3em;\n}\n\n.profile-pane-host {\n display: block;\n width: 100%;\n min-width: 100%;\n max-width: none;\n box-sizing: border-box;\n}\n\n@media (max-width: 768px) {\n .profile-grid {\n font-size: clamp(0.9rem, 1.1vw + 0.65rem, 1rem);\n }\n\n .profile-grid .profile__action-button,\n .profile-grid .profile__actions button {\n min-height: calc(var(--min-touch-target, 44px) + 0.5em) !important;\n font-size: clamp(0.9rem, 2.1vw, 1rem) !important;\n padding: 0.75em 0.9em !important;\n }\n}\n\n/* ===========================================\n PROFILE GRID LAYOUT\n =========================================== */\n\n.profile-grid {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\n gap: var(--spacing-xxs, 0.3125rem);\n background: var(--color-background, #F8F9FB);\n}\n\n.profile-grid > * {\n min-width: 0;\n}\n\n.profile-pane-root {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n display: block;\n container-name: profile-pane;\n container-type: inline-size;\n}\n\n/* Embedded rendering inside SolidOS outline table cells needs a single-column fallback.\n The outline reserves space for icon/predicate columns, so the available content width\n is effectively much narrower than the viewport. */\ntd.obj .profile-pane-root {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n}\n\n@container profile-pane (max-width: 768px) {\n .profile-grid {\n font-size: clamp(0.9rem, 1.1vw + 0.65rem, 1rem);\n }\n\n .profile-grid .profile__action-button,\n .profile-grid .profile__actions button {\n min-height: calc(var(--min-touch-target, 44px) + 0.5em) !important;\n font-size: clamp(0.9rem, 2.1vw, 1rem) !important;\n padding: 0.75em 0.9em !important;\n }\n}\n\n@container profile-pane (max-width: 768px) {\n .profile-grid {\n grid-template-columns: 1fr;\n gap: var(--spacing-xxs, 0.3125rem);\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n padding-inline: var(--spacing-xxs, 0.3125rem);\n overflow-x: clip;\n }\n}\n\n@media (max-width: 768px) {\n .profile-grid {\n grid-template-columns: 1fr;\n gap: var(--spacing-xxs, 0.3125rem);\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin: 0 auto;\n padding-inline: var(--spacing-xxs, 0.3125rem);\n overflow-x: clip;\n }\n}\n\n/* END GRID LAYOUT */\n\n.profile__section {\n width: 100%;\n}\n\n.profile__section--empty {\n padding: var(--spacing-1xl, 2.5rem) var(--spacing-lg, 1.5625rem); /* 40px 25px */\n width: 100%;\n}\n\n.profile__section,\n.profile__section--empty,\n.profile__action-button--empty {\n background: var(--color-card-bg, #fff);\n}\n\n/* Header row layout utility for profile section headers */\n.profile__section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-xs, 0.75rem);\n width: 100%;\n}\n\n.profile__section-header h2,\n.profile__section-header h3,\n.profile__section-header h4 {\n margin: 0;\n}\n\n.profile__action-button {\n width: 100%;\n min-width: 11.25rem; /* 180px */\n max-width: 20rem; /* 320px */\n box-sizing: border-box;\n display: inline-block;\n}\n\n.profile__action-button--empty {\n /*padding: 6px 8px; Note: these are the styles from new design\n min-height: auto; however they don't meet accessibility guidelines \n min-width: 0; for touch target size */ \n width: fit-content;\n min-width: fit-content;\n max-width: fit-content;\n white-space: nowrap;\n box-sizing: border-box;\n border: var(--border-width-sm, 1px) solid var(--color-border-darker, #4A5565);\n color: var(--slate-700, #314158);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-medium, 500);\n line-height: var(--line-height-tight, 1.4);\n}\n.profile__empty-state-message {\n color: #62748E;\n text-align: center;\n font-size: var(--font-size-xs, 0.813rem); /* 13px */\n font-weight: var(--font-weight-normal, 400);\n line-height: var(--line-height-tight, 1.4); /* 140% from design 18.2px */\n}\n.contact-info__icon-wrapper {\n width: 36px;\n height: 36px;\n padding: 0 0.575rem; /* 9.2px - from design, but also ensures icons are centered in the circle */\n flex-shrink: 0;\n}\n\n.contact-info__icon {\n width: var(--icon-xxs, 1rem); /* 16px */\n height: var(--icon-xxs, 1rem); /* 16px */\n flex-shrink: 0;\n stroke-width: 1.333px;\n stroke: #90A1B9;\n}\n\n.contact-info__contact-point-value {\n color: var(--slate-800, #1D293D);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-bold, 600);\n white-space: normal !important;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n.contact-info__contact-point-type {\n color: var(--slate-500, #62748E);\n font-size: var(--font-size-xxs, 0.75rem); /* 12px */\n font-weight: var(--font-weight-md, 500);\n}\n\n.contact-info__address {\n color: var(--slate-800, #1D293D);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-bold, 600);\n}\n\n.contact-info__list {\n list-style: none;\n margin: 0;\n padding: 0 0 var(--spacing-2xs, 0.625rem) 0;\n gap: var(--spacing-2xs, 0.625rem);\n}\n\n.contact-info__list:last-of-type {\n padding-bottom: 0;\n}\n\n.contact-info__list + .contact-info__list {\n margin-top: var(--spacing-2xs, 0.625rem);\n}\n\n.contact-info__item {\n margin-inline-start: 0;\n}\n\n.contact-info__empty-icon svg {\n width: var(--icon-md, 2.5rem); /* 40px */\n height: var(--icon-md, 2.5rem); /* 40px */\n display: block;\n}\n\n.contact-info__empty-icon svg path {\n stroke-width: 0.25rem; /* 4px */\n stroke: #E5E7EB;\n}\n\n.contact-info__empty-message {\n color: #9CA3AF;\n text-align: center;\n font-size: var(--font-size-xs, 0.813rem); /* 13px */\n font-weight: var(--font-weight-normal, 400);\n line-height: var(--line-height-tight, 1.4); /* design says 1.2 */\n}\n\n.contact-info__empty-icon-wrapper {\n width: 3rem; /* 48px */\n flex: 1 0 0;\n}\n.profile__empty-state-content {\n gap: var(--spacing-2xs, 0.625rem); /* 10px */\n}\n\n.profile__empty-state-content > h2,\n.profile__empty-state-content > p {\n margin: 0;\n}\n\n/* SAM - generated by ai below need to check design and change */\n.profile__action-button--empty:hover {\n background: var(--color-primary, #7C4DFF);\n border-color: var(--color-primary, #7C4DFF);\n color: white;\n}\n\n.profile__add-more-content {\n gap: var(--spacing-xxs, 0.3125rem);\n}\n\n.profile__add-more-icon {\n width: var(--icon-xxxs, 0.75rem); /* 12px */\n height: var(--icon-xxxs, 0.75rem); /* 12px */\n line-height: 0;\n flex: 0 0 auto;\n}\n\n.profile__add-more-icon svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.skills__list {\n list-style: none;\n margin: 0;\n padding: 0;\n align-items: flex-start;\n gap: 0.5rem; /* 8px */\n}\n\n.skills__item {\n gap: 0.2rem;\n}\n\n.skills__item-label {\n color: var(--slate-900, #0F172B);\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\n font-weight: var(--font-weight-md, 500);\n line-height: 1.2;\n}\n\n.skills__remove-button {\n border: none;\n background: none;\n cursor: pointer;\n padding: 0;\n margin: 0;\n line-height: 1;\n}\n\n.languages__list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.languages__item-label {\n color: var(--gray-900, #101828);\n font-size: var(--font-size-md, 1rem); /* 16px */\n font-weight: var(--font-weight-md, 500);\n}\n\n.languages__empty-icon {\n width: var(--icon-xs, 1.5rem); /* 24px new design uses this */\n height: var(--icon-xs, 1.5rem); /* 24px new design uses this */\n flex-shrink: 0;\n}\n/* Add-me-to-friends button style shared across profile sections. */\n.profile__btn-friends {\n width: auto;\n min-width: 0;\n max-width: none;\n padding: 0.375rem 0.75rem;\n gap: var(--spacing-xxs, 0.3125rem);\n border-radius: var(--border-radius-md, 0.5rem);\n border: 1px solid var(--color-primary, #7C4DFF);\n background: transparent;\n color: var(--color-primary, #7C4DFF);\n}\n\n/* Text-style action button utility (used for section header/edit actions). */\n.profile-action-text {\n width: auto;\n min-width: 0;\n max-width: none;\n padding: var(--spacing-xxs, 0.3125rem);\n border: none;\n background: none;\n color: var(--color-primary, #7C4DFF);\n cursor: pointer;\n font-size: var(--font-size-sm, 0.875rem);\n}\n\n.profile-action-text:hover {\n text-decoration: underline;\n}\n\n.profile-section-collapsible {\n display: block;\n}\n\n.profile-section-collapsible__header {\n margin-bottom: 0;\n}\n\n.profile-section-collapsible__actions {\n gap: var(--spacing-xs, 0.75rem);\n margin-top: -0.25rem;\n}\n\n.profile-section-collapsible__edit-button {\n min-width: 0;\n}\n\n.profile-section-collapsible__edit-icon {\n display: none;\n}\n\n.profile-section-collapsible__actions > button.inline-flex-row {\n display: none !important;\n min-height: auto;\n min-width: auto;\n padding: var(--spacing-xxs, 0.3125rem);\n border: none;\n background: none;\n color: var(--color-text, #1A1A1A);\n cursor: pointer;\n}\n\n.profile-section-collapsible__chevron {\n display: inline-block;\n flex: 0 0 auto;\n transition: transform var(--animation-duration, 0.2s) ease;\n}\n\n.profile-section-collapsible__content {\n margin-top: var(--spacing-2xs, 0.625rem);\n width: 100%;\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box;\n}\n\n.profile-section-collapsible__content > :first-child {\n margin-top: 0;\n}\n\n.profile-section-collapsible__content > :last-child {\n margin-bottom: 0;\n}\n\n.bioCard,\n.bioSection,\n.socialCard,\n.socialList,\n.skills__list,\n.languages__list,\n.contact-info__list {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box;\n}\n\n@media (min-width: 769px) {\n .profile-section-collapsible > .profile-section-collapsible__content {\n display: block;\n }\n\n .profile-section-collapsible__edit-label svg,\n .profile__action-icon svg {\n width: 0.875rem;\n height: 0.875rem;\n }\n\n .profile-section-collapsible__edit-label svg path,\n .profile__action-icon svg path {\n fill: var(--color-primary, #7C4DFF);\n }\n\n .profile-section-collapsible__edit-label {\n display: inline;\n transform: translateY(-0.125rem);\n }\n\n .profile__add-more-icon {\n transform: translateY(-0.125rem);\n }\n\n .profile-section-collapsible__edit-icon {\n display: none;\n }\n}\n\n@media (max-width: 576px) {\n .profile-grid .profile__section-header h2,\n .profile-grid .profile__section-header h3,\n .profile-grid .profile__section-header h4,\n .profile-grid .profile__empty-state-content > h2,\n .profile-grid .cvSection h3,\n .profile-grid .profile__name,\n .profile-grid .friends-pane__header-name {\n font-family: inherit !important;\n }\n\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n }\n\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header h2 {\n margin: 0;\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions {\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n gap: 0.25rem;\n margin-top: 0;\n flex: 0 0 auto;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button {\n display: inline-flex !important;\n order: 1;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:active,\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus,\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus-visible {\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n background: transparent !important;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions > button.inline-flex-row {\n order: 2;\n }\n\n .profile__section-header h2,\n .profile__section-header h3,\n .profile__section-header h4 {\n font-size: var(--font-size-lg, 1.125rem) !important;\n line-height: 1.2 !important;\n }\n\n .profile-grid .profile__empty-state-content > h2,\n .profile-grid .cvSection h3 {\n font-size: var(--font-size-lg, 1.125rem) !important;\n line-height: 1.2 !important;\n }\n\n .profile-grid .profile__name,\n .profile-grid .friends-pane__header-name {\n font-size: 1.5rem !important;\n line-height: 1.15 !important;\n }\n\n .profile-grid .profile__pronouns,\n .profile-grid .friends-pane__header-pronouns,\n .profile-grid .friends-pane__friends-pronouns {\n font-family: inherit !important;\n font-size: 0.6875rem !important;\n line-height: 1.1 !important;\n }\n\n .profile-section-collapsible[data-expanded=\"false\"] .profile-section-collapsible__content {\n display: none;\n }\n\n .profile-section-collapsible__actions.flex-column {\n align-items: flex-end;\n gap: 0.25rem;\n }\n\n /* Keep empty-section mobile header controls in the same order as regular sections: toggle first, add/edit below. */\n .profile__section--empty .profile-section-collapsible__actions > button.inline-flex-row {\n order: 1;\n }\n\n .profile__section--empty .profile-section-collapsible__actions > .profile-section-collapsible__edit-button {\n order: 2;\n }\n\n .profile-section-collapsible[data-expanded=\"true\"] .profile-section-collapsible__chevron {\n transform: rotate(180deg);\n }\n\n .profile-section-collapsible__edit-label {\n display: none !important;\n }\n\n .profile-section-collapsible__edit-icon {\n display: inline;\n }\n\n /* Empty-state action buttons use icon-only mobile controls (plus sign). */\n .profile__section--empty .profile-section-collapsible__edit-label {\n display: none !important;\n }\n\n .profile__section--empty .profile-section-collapsible__edit-icon {\n display: inline !important;\n }\n\n .profile-section-collapsible .profile-section-collapsible__edit-button {\n display: none !important;\n order: 2;\n }\n\n .profile-section-collapsible[data-expanded=\"true\"] .profile-section-collapsible__edit-button {\n display: inline-flex !important;\n }\n /* Reassert toggle button layout in collapsible action rows on mobile \n so utility resets never hide/misalign the control. */\n .profile-section-collapsible__actions > button.inline-flex-row {\n display: inline-flex !important;\n align-items: center;\n justify-content: center;\n }\n\n .profile-section-collapsible__edit-icon--add svg path {\n fill: #1E2939 !important;\n stroke: #1E2939 !important;\n }\n\n .profile-section-collapsible__edit-icon--projects svg path {\n stroke-width: 1.714px !important;\n stroke: var(--gray-800, #1E2939) !important;\n fill: none !important;\n }\n\n}\n\n@container profile-pane (max-width: 576px) {\n .profile-grid .profile__section-header h2,\n .profile-grid .profile__section-header h3,\n .profile-grid .profile__section-header h4,\n .profile-grid .profile__empty-state-content > h2,\n .profile-grid .cvSection h3,\n .profile-grid .profile__name,\n .profile-grid .friends-pane__header-name {\n font-family: inherit !important;\n }\n\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n }\n\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header h2 {\n margin: 0;\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions {\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n gap: 0.25rem;\n margin-top: 0;\n flex: 0 0 auto;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button {\n order: 1;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:active,\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus,\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus-visible {\n border: none !important;\n outline: none !important;\n box-shadow: none !important;\n background: transparent !important;\n }\n\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions > button.inline-flex-row {\n order: 2;\n }\n\n .profile__section-header h2,\n .profile__section-header h3,\n .profile__section-header h4 {\n font-size: var(--font-size-lg, 1.125rem) !important;\n line-height: 1.2 !important;\n }\n\n .profile-grid .profile__empty-state-content > h2,\n .profile-grid .cvSection h3 {\n font-size: var(--font-size-lg, 1.125rem) !important;\n line-height: 1.2 !important;\n }\n\n .profile-grid .profile__name,\n .profile-grid .friends-pane__header-name {\n font-size: 1.5rem !important;\n line-height: 1.15 !important;\n }\n\n .profile-grid .profile__pronouns,\n .profile-grid .friends-pane__header-pronouns,\n .profile-grid .friends-pane__friends-pronouns {\n font-family: inherit !important;\n font-size: 0.6875rem !important;\n line-height: 1.1 !important;\n }\n\n .profile-section-collapsible[data-expanded=\"false\"] .profile-section-collapsible__content {\n display: none;\n }\n\n .profile-section-collapsible__actions.flex-column {\n align-items: flex-end;\n gap: 0.25rem;\n }\n\n .profile__section--empty .profile-section-collapsible__actions > button.inline-flex-row {\n order: 1;\n }\n\n .profile__section--empty .profile-section-collapsible__actions > .profile-section-collapsible__edit-button {\n order: 2;\n }\n\n .profile-section-collapsible[data-expanded=\"true\"] .profile-section-collapsible__chevron {\n transform: rotate(180deg);\n }\n\n .profile-section-collapsible__edit-label {\n display: none !important;\n }\n\n .profile-section-collapsible__edit-icon {\n display: inline;\n }\n\n .profile__section--empty .profile-section-collapsible__edit-label {\n display: none !important;\n }\n\n .profile__section--empty .profile-section-collapsible__edit-icon {\n display: inline !important;\n }\n\n .profile-section-collapsible .profile-section-collapsible__edit-button {\n display: none !important;\n order: 2;\n }\n\n .profile-section-collapsible[data-expanded=\"true\"] .profile-section-collapsible__edit-button {\n display: inline-flex !important;\n }\n\n .profile-section-collapsible__actions > button.inline-flex-row {\n display: inline-flex !important;\n align-items: center;\n justify-content: center;\n }\n\n .profile-section-collapsible__edit-icon--add svg path {\n fill: #1E2939 !important;\n stroke: #1E2939 !important;\n }\n\n .profile-section-collapsible__edit-icon--projects svg path {\n stroke-width: 1.714px !important;\n stroke: var(--gray-800, #1E2939) !important;\n fill: none !important;\n }\n}\n\n/* Zebra Striping - used by FriendList, StuffCard tables */\n.zebra-stripe tr:nth-child(even),\n.zebra-stripe > *:nth-child(even) {\n background-color: rgba(0, 0, 0, 0.02);\n}\n\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/utilities.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/* Utility-first CSS classes for layout, spacing, and responsiveness */\\n/* These utilities are designed specfically for the profile pane */\\n/* Utilities that can be shared by all panes should be added to dev-globals.css \\n and to mashlib repo mash-utilities.css and then updated accross all pane\\n development environments */\\n:root {\\n --profile-image-size: 3em;\\n}\\n\\n.profile-pane-host {\\n display: block;\\n width: 100%;\\n min-width: 100%;\\n max-width: none;\\n box-sizing: border-box;\\n}\\n\\n@media (max-width: 768px) {\\n .profile-grid {\\n font-size: clamp(0.9rem, 1.1vw + 0.65rem, 1rem);\\n }\\n\\n .profile-grid .profile__action-button,\\n .profile-grid .profile__actions button {\\n min-height: calc(var(--min-touch-target, 44px) + 0.5em) !important;\\n font-size: clamp(0.9rem, 2.1vw, 1rem) !important;\\n padding: 0.75em 0.9em !important;\\n }\\n}\\n\\n/* ===========================================\\n PROFILE GRID LAYOUT\\n =========================================== */\\n\\n.profile-grid {\\n display: grid;\\n grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);\\n gap: var(--spacing-xxs, 0.3125rem);\\n background: var(--color-background, #F8F9FB);\\n}\\n\\n.profile-grid > * {\\n min-width: 0;\\n}\\n\\n.profile-pane-root {\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n display: block;\\n container-name: profile-pane;\\n container-type: inline-size;\\n}\\n\\n/* Embedded rendering inside SolidOS outline table cells needs a single-column fallback.\\n The outline reserves space for icon/predicate columns, so the available content width\\n is effectively much narrower than the viewport. */\\ntd.obj .profile-pane-root {\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n}\\n\\n@container profile-pane (max-width: 768px) {\\n .profile-grid {\\n font-size: clamp(0.9rem, 1.1vw + 0.65rem, 1rem);\\n }\\n\\n .profile-grid .profile__action-button,\\n .profile-grid .profile__actions button {\\n min-height: calc(var(--min-touch-target, 44px) + 0.5em) !important;\\n font-size: clamp(0.9rem, 2.1vw, 1rem) !important;\\n padding: 0.75em 0.9em !important;\\n }\\n}\\n\\n@container profile-pane (max-width: 768px) {\\n .profile-grid {\\n grid-template-columns: 1fr;\\n gap: var(--spacing-xxs, 0.3125rem);\\n width: 100%;\\n max-width: 100%;\\n box-sizing: border-box;\\n margin: 0 auto;\\n padding-inline: var(--spacing-xxs, 0.3125rem);\\n overflow-x: clip;\\n }\\n}\\n\\n@media (max-width: 768px) {\\n .profile-grid {\\n grid-template-columns: 1fr;\\n gap: var(--spacing-xxs, 0.3125rem);\\n width: 100%;\\n max-width: 100%;\\n box-sizing: border-box;\\n margin: 0 auto;\\n padding-inline: var(--spacing-xxs, 0.3125rem);\\n overflow-x: clip;\\n }\\n}\\n\\n/* END GRID LAYOUT */\\n\\n.profile__section {\\n width: 100%;\\n}\\n\\n.profile__section--empty {\\n padding: var(--spacing-1xl, 2.5rem) var(--spacing-lg, 1.5625rem); /* 40px 25px */\\n width: 100%;\\n}\\n\\n.profile__section,\\n.profile__section--empty,\\n.profile__action-button--empty {\\n background: var(--color-card-bg, #fff);\\n}\\n\\n/* Header row layout utility for profile section headers */\\n.profile__section-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--spacing-xs, 0.75rem);\\n width: 100%;\\n}\\n\\n.profile__section-header h2,\\n.profile__section-header h3,\\n.profile__section-header h4 {\\n margin: 0;\\n}\\n\\n.profile__action-button {\\n width: 100%;\\n min-width: 11.25rem; /* 180px */\\n max-width: 20rem; /* 320px */\\n box-sizing: border-box;\\n display: inline-block;\\n}\\n\\n.profile__action-button--empty {\\n /*padding: 6px 8px; Note: these are the styles from new design\\n min-height: auto; however they don't meet accessibility guidelines \\n min-width: 0; for touch target size */ \\n width: fit-content;\\n min-width: fit-content;\\n max-width: fit-content;\\n white-space: nowrap;\\n box-sizing: border-box;\\n border: var(--border-width-sm, 1px) solid var(--color-border-darker, #4A5565);\\n color: var(--slate-700, #314158);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-medium, 500);\\n line-height: var(--line-height-tight, 1.4);\\n}\\n.profile__empty-state-message {\\n color: #62748E;\\n text-align: center;\\n font-size: var(--font-size-xs, 0.813rem); /* 13px */\\n font-weight: var(--font-weight-normal, 400);\\n line-height: var(--line-height-tight, 1.4); /* 140% from design 18.2px */\\n}\\n.contact-info__icon-wrapper {\\n width: 36px;\\n height: 36px;\\n padding: 0 0.575rem; /* 9.2px - from design, but also ensures icons are centered in the circle */\\n flex-shrink: 0;\\n}\\n\\n.contact-info__icon {\\n width: var(--icon-xxs, 1rem); /* 16px */\\n height: var(--icon-xxs, 1rem); /* 16px */\\n flex-shrink: 0;\\n stroke-width: 1.333px;\\n stroke: #90A1B9;\\n}\\n\\n.contact-info__contact-point-value {\\n color: var(--slate-800, #1D293D);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-bold, 600);\\n white-space: normal !important;\\n overflow-wrap: anywhere;\\n word-break: break-word;\\n}\\n\\n.contact-info__contact-point-type {\\n color: var(--slate-500, #62748E);\\n font-size: var(--font-size-xxs, 0.75rem); /* 12px */\\n font-weight: var(--font-weight-md, 500);\\n}\\n\\n.contact-info__address {\\n color: var(--slate-800, #1D293D);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-bold, 600);\\n}\\n\\n.contact-info__list {\\n list-style: none;\\n margin: 0;\\n padding: 0 0 var(--spacing-2xs, 0.625rem) 0;\\n gap: var(--spacing-2xs, 0.625rem);\\n}\\n\\n.contact-info__list:last-of-type {\\n padding-bottom: 0;\\n}\\n\\n.contact-info__list + .contact-info__list {\\n margin-top: var(--spacing-2xs, 0.625rem);\\n}\\n\\n.contact-info__item {\\n margin-inline-start: 0;\\n}\\n\\n.contact-info__empty-icon svg {\\n width: var(--icon-md, 2.5rem); /* 40px */\\n height: var(--icon-md, 2.5rem); /* 40px */\\n display: block;\\n}\\n\\n.contact-info__empty-icon svg path {\\n stroke-width: 0.25rem; /* 4px */\\n stroke: #E5E7EB;\\n}\\n\\n.contact-info__empty-message {\\n color: #9CA3AF;\\n text-align: center;\\n font-size: var(--font-size-xs, 0.813rem); /* 13px */\\n font-weight: var(--font-weight-normal, 400);\\n line-height: var(--line-height-tight, 1.4); /* design says 1.2 */\\n}\\n\\n.contact-info__empty-icon-wrapper {\\n width: 3rem; /* 48px */\\n flex: 1 0 0;\\n}\\n.profile__empty-state-content {\\n gap: var(--spacing-2xs, 0.625rem); /* 10px */\\n}\\n\\n.profile__empty-state-content > h2,\\n.profile__empty-state-content > p {\\n margin: 0;\\n}\\n\\n/* SAM - generated by ai below need to check design and change */\\n.profile__action-button--empty:hover {\\n background: var(--color-primary, #7C4DFF);\\n border-color: var(--color-primary, #7C4DFF);\\n color: white;\\n}\\n\\n.profile__add-more-content {\\n gap: var(--spacing-xxs, 0.3125rem);\\n}\\n\\n.profile__add-more-icon {\\n width: var(--icon-xxxs, 0.75rem); /* 12px */\\n height: var(--icon-xxxs, 0.75rem); /* 12px */\\n line-height: 0;\\n flex: 0 0 auto;\\n}\\n\\n.profile__add-more-icon svg {\\n width: 100%;\\n height: 100%;\\n display: block;\\n}\\n\\n.skills__list {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n align-items: flex-start;\\n gap: 0.5rem; /* 8px */\\n}\\n\\n.skills__item {\\n gap: 0.2rem;\\n}\\n\\n.skills__item-label {\\n color: var(--slate-900, #0F172B);\\n font-size: var(--font-size-sm, 0.875rem); /* 14px */\\n font-weight: var(--font-weight-md, 500);\\n line-height: 1.2;\\n}\\n\\n.skills__remove-button {\\n border: none;\\n background: none;\\n cursor: pointer;\\n padding: 0;\\n margin: 0;\\n line-height: 1;\\n}\\n\\n.languages__list {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.languages__item-label {\\n color: var(--gray-900, #101828);\\n font-size: var(--font-size-md, 1rem); /* 16px */\\n font-weight: var(--font-weight-md, 500);\\n}\\n\\n.languages__empty-icon {\\n width: var(--icon-xs, 1.5rem); /* 24px new design uses this */\\n height: var(--icon-xs, 1.5rem); /* 24px new design uses this */\\n flex-shrink: 0;\\n}\\n/* Add-me-to-friends button style shared across profile sections. */\\n.profile__btn-friends {\\n width: auto;\\n min-width: 0;\\n max-width: none;\\n padding: 0.375rem 0.75rem;\\n gap: var(--spacing-xxs, 0.3125rem);\\n border-radius: var(--border-radius-md, 0.5rem);\\n border: 1px solid var(--color-primary, #7C4DFF);\\n background: transparent;\\n color: var(--color-primary, #7C4DFF);\\n}\\n\\n/* Text-style action button utility (used for section header/edit actions). */\\n.profile-action-text {\\n width: auto;\\n min-width: 0;\\n max-width: none;\\n padding: var(--spacing-xxs, 0.3125rem);\\n border: none;\\n background: none;\\n color: var(--color-primary, #7C4DFF);\\n cursor: pointer;\\n font-size: var(--font-size-sm, 0.875rem);\\n}\\n\\n.profile-action-text:hover {\\n text-decoration: underline;\\n}\\n\\n.profile-section-collapsible {\\n display: block;\\n}\\n\\n.profile-section-collapsible__header {\\n margin-bottom: 0;\\n}\\n\\n.profile-section-collapsible__actions {\\n gap: var(--spacing-xs, 0.75rem);\\n margin-top: -0.25rem;\\n}\\n\\n.profile-section-collapsible__edit-button {\\n min-width: 0;\\n}\\n\\n.profile-section-collapsible__edit-icon {\\n display: none;\\n}\\n\\n.profile-section-collapsible__actions > button.inline-flex-row {\\n display: none !important;\\n min-height: auto;\\n min-width: auto;\\n padding: var(--spacing-xxs, 0.3125rem);\\n border: none;\\n background: none;\\n color: var(--color-text, #1A1A1A);\\n cursor: pointer;\\n}\\n\\n.profile-section-collapsible__chevron {\\n display: inline-block;\\n flex: 0 0 auto;\\n transition: transform var(--animation-duration, 0.2s) ease;\\n}\\n\\n.profile-section-collapsible__content {\\n margin-top: var(--spacing-2xs, 0.625rem);\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n box-sizing: border-box;\\n}\\n\\n.profile-section-collapsible__content > :first-child {\\n margin-top: 0;\\n}\\n\\n.profile-section-collapsible__content > :last-child {\\n margin-bottom: 0;\\n}\\n\\n.bioCard,\\n.bioSection,\\n.socialCard,\\n.socialList,\\n.skills__list,\\n.languages__list,\\n.contact-info__list {\\n width: 100%;\\n max-width: 100%;\\n min-width: 0;\\n box-sizing: border-box;\\n}\\n\\n@media (min-width: 769px) {\\n .profile-section-collapsible > .profile-section-collapsible__content {\\n display: block;\\n }\\n\\n .profile-section-collapsible__edit-label svg,\\n .profile__action-icon svg {\\n width: 0.875rem;\\n height: 0.875rem;\\n }\\n\\n .profile-section-collapsible__edit-label svg path,\\n .profile__action-icon svg path {\\n fill: var(--color-primary, #7C4DFF);\\n }\\n\\n .profile-section-collapsible__edit-label {\\n display: inline;\\n transform: translateY(-0.125rem);\\n }\\n\\n .profile__add-more-icon {\\n transform: translateY(-0.125rem);\\n }\\n\\n .profile-section-collapsible__edit-icon {\\n display: none;\\n }\\n}\\n\\n@media (max-width: 576px) {\\n .profile-grid .profile__section-header h2,\\n .profile-grid .profile__section-header h3,\\n .profile-grid .profile__section-header h4,\\n .profile-grid .profile__empty-state-content > h2,\\n .profile-grid .cvSection h3,\\n .profile-grid .profile__name,\\n .profile-grid .friends-pane__header-name {\\n font-family: inherit !important;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 0.5rem;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header h2 {\\n margin: 0;\\n flex: 1 1 auto;\\n min-width: 0;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions {\\n display: inline-flex;\\n flex-direction: row;\\n align-items: center;\\n gap: 0.25rem;\\n margin-top: 0;\\n flex: 0 0 auto;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button {\\n display: inline-flex !important;\\n order: 1;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:active,\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus,\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus-visible {\\n border: none !important;\\n outline: none !important;\\n box-shadow: none !important;\\n background: transparent !important;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions > button.inline-flex-row {\\n order: 2;\\n }\\n\\n .profile__section-header h2,\\n .profile__section-header h3,\\n .profile__section-header h4 {\\n font-size: var(--font-size-lg, 1.125rem) !important;\\n line-height: 1.2 !important;\\n }\\n\\n .profile-grid .profile__empty-state-content > h2,\\n .profile-grid .cvSection h3 {\\n font-size: var(--font-size-lg, 1.125rem) !important;\\n line-height: 1.2 !important;\\n }\\n\\n .profile-grid .profile__name,\\n .profile-grid .friends-pane__header-name {\\n font-size: 1.5rem !important;\\n line-height: 1.15 !important;\\n }\\n\\n .profile-grid .profile__pronouns,\\n .profile-grid .friends-pane__header-pronouns,\\n .profile-grid .friends-pane__friends-pronouns {\\n font-family: inherit !important;\\n font-size: 0.6875rem !important;\\n line-height: 1.1 !important;\\n }\\n\\n .profile-section-collapsible[data-expanded=\\\"false\\\"] .profile-section-collapsible__content {\\n display: none;\\n }\\n\\n .profile-section-collapsible__actions.flex-column {\\n align-items: flex-end;\\n gap: 0.25rem;\\n }\\n\\n /* Keep empty-section mobile header controls in the same order as regular sections: toggle first, add/edit below. */\\n .profile__section--empty .profile-section-collapsible__actions > button.inline-flex-row {\\n order: 1;\\n }\\n\\n .profile__section--empty .profile-section-collapsible__actions > .profile-section-collapsible__edit-button {\\n order: 2;\\n }\\n\\n .profile-section-collapsible[data-expanded=\\\"true\\\"] .profile-section-collapsible__chevron {\\n transform: rotate(180deg);\\n }\\n\\n .profile-section-collapsible__edit-label {\\n display: none !important;\\n }\\n\\n .profile-section-collapsible__edit-icon {\\n display: inline;\\n }\\n\\n /* Empty-state action buttons use icon-only mobile controls (plus sign). */\\n .profile__section--empty .profile-section-collapsible__edit-label {\\n display: none !important;\\n }\\n\\n .profile__section--empty .profile-section-collapsible__edit-icon {\\n display: inline !important;\\n }\\n\\n .profile-section-collapsible .profile-section-collapsible__edit-button {\\n display: none !important;\\n order: 2;\\n }\\n\\n .profile-section-collapsible[data-expanded=\\\"true\\\"] .profile-section-collapsible__edit-button {\\n display: inline-flex !important;\\n }\\n /* Reassert toggle button layout in collapsible action rows on mobile \\n so utility resets never hide/misalign the control. */\\n .profile-section-collapsible__actions > button.inline-flex-row {\\n display: inline-flex !important;\\n align-items: center;\\n justify-content: center;\\n }\\n\\n .profile-section-collapsible__edit-icon--add svg path {\\n fill: #1E2939 !important;\\n stroke: #1E2939 !important;\\n }\\n\\n .profile-section-collapsible__edit-icon--projects svg path {\\n stroke-width: 1.714px !important;\\n stroke: var(--gray-800, #1E2939) !important;\\n fill: none !important;\\n }\\n\\n}\\n\\n@container profile-pane (max-width: 576px) {\\n .profile-grid .profile__section-header h2,\\n .profile-grid .profile__section-header h3,\\n .profile-grid .profile__section-header h4,\\n .profile-grid .profile__empty-state-content > h2,\\n .profile-grid .cvSection h3,\\n .profile-grid .profile__name,\\n .profile-grid .friends-pane__header-name {\\n font-family: inherit !important;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 0.5rem;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions > .profile-section-collapsible__header h2 {\\n margin: 0;\\n flex: 1 1 auto;\\n min-width: 0;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions {\\n display: inline-flex;\\n flex-direction: row;\\n align-items: center;\\n gap: 0.25rem;\\n margin-top: 0;\\n flex: 0 0 auto;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button {\\n order: 1;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:active,\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus,\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__edit-button:focus-visible {\\n border: none !important;\\n outline: none !important;\\n box-shadow: none !important;\\n background: transparent !important;\\n }\\n\\n .profile-section-collapsible--inline-mobile-actions .profile-section-collapsible__actions > button.inline-flex-row {\\n order: 2;\\n }\\n\\n .profile__section-header h2,\\n .profile__section-header h3,\\n .profile__section-header h4 {\\n font-size: var(--font-size-lg, 1.125rem) !important;\\n line-height: 1.2 !important;\\n }\\n\\n .profile-grid .profile__empty-state-content > h2,\\n .profile-grid .cvSection h3 {\\n font-size: var(--font-size-lg, 1.125rem) !important;\\n line-height: 1.2 !important;\\n }\\n\\n .profile-grid .profile__name,\\n .profile-grid .friends-pane__header-name {\\n font-size: 1.5rem !important;\\n line-height: 1.15 !important;\\n }\\n\\n .profile-grid .profile__pronouns,\\n .profile-grid .friends-pane__header-pronouns,\\n .profile-grid .friends-pane__friends-pronouns {\\n font-family: inherit !important;\\n font-size: 0.6875rem !important;\\n line-height: 1.1 !important;\\n }\\n\\n .profile-section-collapsible[data-expanded=\\\"false\\\"] .profile-section-collapsible__content {\\n display: none;\\n }\\n\\n .profile-section-collapsible__actions.flex-column {\\n align-items: flex-end;\\n gap: 0.25rem;\\n }\\n\\n .profile__section--empty .profile-section-collapsible__actions > button.inline-flex-row {\\n order: 1;\\n }\\n\\n .profile__section--empty .profile-section-collapsible__actions > .profile-section-collapsible__edit-button {\\n order: 2;\\n }\\n\\n .profile-section-collapsible[data-expanded=\\\"true\\\"] .profile-section-collapsible__chevron {\\n transform: rotate(180deg);\\n }\\n\\n .profile-section-collapsible__edit-label {\\n display: none !important;\\n }\\n\\n .profile-section-collapsible__edit-icon {\\n display: inline;\\n }\\n\\n .profile__section--empty .profile-section-collapsible__edit-label {\\n display: none !important;\\n }\\n\\n .profile__section--empty .profile-section-collapsible__edit-icon {\\n display: inline !important;\\n }\\n\\n .profile-section-collapsible .profile-section-collapsible__edit-button {\\n display: none !important;\\n order: 2;\\n }\\n\\n .profile-section-collapsible[data-expanded=\\\"true\\\"] .profile-section-collapsible__edit-button {\\n display: inline-flex !important;\\n }\\n\\n .profile-section-collapsible__actions > button.inline-flex-row {\\n display: inline-flex !important;\\n align-items: center;\\n justify-content: center;\\n }\\n\\n .profile-section-collapsible__edit-icon--add svg path {\\n fill: #1E2939 !important;\\n stroke: #1E2939 !important;\\n }\\n\\n .profile-section-collapsible__edit-icon--projects svg path {\\n stroke-width: 1.714px !important;\\n stroke: var(--gray-800, #1E2939) !important;\\n fill: none !important;\\n }\\n}\\n\\n/* Zebra Striping - used by FriendList, StuffCard tables */\\n.zebra-stripe tr:nth-child(even),\\n.zebra-stripe > *:nth-child(even) {\\n background-color: rgba(0, 0, 0, 0.02);\\n}\\n\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","module.exports = __WEBPACK_EXTERNAL_MODULE__5663__;","module.exports = __WEBPACK_EXTERNAL_MODULE__9426__;","module.exports = __WEBPACK_EXTERNAL_MODULE__5491__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.nc = undefined;","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./CVCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./CVCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ChatWithMe.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ChatWithMe.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileView.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ProfileView.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./QRCodeCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./QRCodeCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./SocialCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./SocialCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./utilities.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./utilities.css\";\n export default content && content.locals ? content.locals : undefined;\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","// QR CODE\nexport const scanQrToConnectText = 'Link to Profile'\n//ERRORS & SUCCESS\n//Same 'not logged in' error message like on 'Chat with me' button\nexport const userNotLoggedInErrorMessage = 'Current user not found! Not logged in?'\nexport const internalErrorMessage = 'An internal error occured!'\nexport const friendWasAddedSuccesMessage = 'Friend was added!'\n\n//OTHER\nexport const friendExistsMessage = 'Friend already exists'\nexport const loadingMessage = 'Loading...'\n\n//BUTTONS\nexport const addMeToYourFriendsButtonText = 'Add as friend'\nexport const logInAddMeToYourFriendsButtonText = 'Log in to add as friend'\nexport const logInToChatWithMeButtonText = 'Login to chat with me'\nexport const friendExistsAlreadyButtonText = 'Already part of friends'\nexport const chatWithMeButtonText = 'Chat with me'\n\n// Profile & Edit profile texts \nexport const yourContactInformationHeading = 'Your profile'\nexport const otherPreferencesHeadingText = 'Other preferences'\nexport const communitiesHeadingText = 'Your communities'\nexport const resumeHeadingText = 'Resume'\nexport const bioHeadingText = 'Bio'\nexport const educationHeadingText = 'Education'\nexport const skillsHeadingText = 'Skills'\nexport const languagesHeadingText = 'Languages'\nexport const projectsHeadingText = 'Projects & Communities'\nexport const contactInfoHeadingText = 'More Contacts'\nexport const contactInfoEmptyHeadingText = 'Contact Info'\nexport const editSkillsDialogTitleText = 'Edit Skills'\nexport const editLanguagesDialogTitleText = 'Edit Languages'\nexport const editContactInfoDialogTitleText = 'Edit More Contacts'\nexport const editResumeDialogTitleText = 'Edit Resume'\nexport const editEducationDialogTitleText = 'Edit Education'\nexport const editProjectsDialogTitleText = 'Edit Projects & Communities'\nexport const editHeadingDialogTitleText = 'Edit Heading'\nexport const editSocialDialogTitleText = 'Edit Social Accounts'\nexport const editBioDialogTitleText = 'Edit Bio'\nexport const dialogSubmitLabelText = 'Save Changes'\nexport const dialogCancelLabelText = 'Cancel'\nexport const pasteEntryButtonTitleText = 'Paste'\nexport const deleteEntryButtonTitleText = 'Delete entry'\nexport const ownerLoginRequiredDialogMessageText = 'You need to log in as the profile owner to save contact updates.'\nexport const loginRequiredDialogTitleText = 'Login Required'\nexport const saveFailedDialogTitleText = 'Save Failed'\nexport const saveContactUpdatesFailedPrefixText = 'Could not save contact updates.'\nexport const saveHeadingUpdatesFailedPrefixText = 'Could not save heading updates.'\nexport const saveLanguageUpdatesFailedPrefixText = 'Could not save language updates.'\nexport const saveResumeUpdatesFailedPrefixText = 'Could not save resume updates.'\nexport const saveEducationUpdatesFailedPrefixText = 'Could not save education updates.'\nexport const saveProjectsUpdatesFailedPrefixText = 'Could not save projects updates.'\nexport const saveSocialUpdatesFailedPrefixText = 'Could not save social accounts updates.'\nexport const saveBioUpdatesFailedPrefixText = 'Could not save bio updates.'\nexport const mutationSaveContactInfoFailedPrefixText = 'Failed to save contact info:'\nexport const mutationSaveLanguagesFailedPrefixText = 'Failed to save languages:'\nexport const mutationSaveSkillsFailedPrefixText = 'Failed to save skills:'\nexport const mutationSaveResumeFailedPrefixText = 'Failed to save resume:'\nexport const mutationEducationFailedPrefixText = 'Failed to save education:'\nexport const mutationBioFailedPrefixText = 'Failed to save bio:'\nexport const resumeUpdateEntryNotFoundErrorMessageText = 'Could not find existing resume entry for update. Please reload profile data and try again.'\nexport const bioUpdateEntryNotFoundErrorMessageText = 'Could not find existing bio entry for update. Please reload profile data and try again.'\nexport const updaterUnsupportedStoreErrorMessageText = 'Store does not support updates'\nexport const fallbackSaveUpdatesErrorMessageText = 'Failed to save updates'\nexport const socialAccountsHeadingText = 'Follow me on'\nexport const sharedItemsHeadingText = 'Shared items'\nexport const friendsHeadingText = 'Friends'\nexport const contactHeadingText = 'Contact'","import { html, TemplateResult } from 'lit-html'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ns, utils } from 'solid-ui'\nimport './styles/QRCodeCard.css'\nimport { scanQrToConnectText } from './texts'\n/* Part of this code was generated by AI Model: GPT-5.3-Codex */\n/* Prompt: The QRCode has a label \"link to profile\" but it should\n be a VCARD with name, and link to profile. So when you scan it \n it goes into your contacts. That's the current way works, IIRC. */\ntype LegacySubjectArg = NamedNode | string\n\nfunction isNamedNodeLike(value: unknown): value is NamedNode {\n return Boolean(value && typeof value === 'object' && typeof (value as any).uri === 'string')\n}\n\nfunction isStoreLike(value: unknown): value is LiveStore {\n return Boolean(value && typeof value === 'object' && typeof (value as any).any === 'function')\n}\n\nfunction resolveQRCodeArgs(\n arg1: LegacySubjectArg,\n arg2?: unknown,\n arg3?: unknown\n): { subject: NamedNode, store?: LiveStore } {\n if (isNamedNodeLike(arg1)) {\n return {\n subject: arg1,\n store: isStoreLike(arg2) ? arg2 : undefined\n }\n }\n\n if (isNamedNodeLike(arg3)) {\n return {\n subject: arg3,\n store: isStoreLike(arg2) ? arg2 : undefined\n }\n }\n\n throw new Error('QRCodeCard requires a profile subject NamedNode.')\n}\n\nfunction normalizeEmail(value: string): string {\n return (value || '').trim().replace(/^mailto:/i, '')\n}\n\nfunction normalizeTelephone(value: string): string {\n return (value || '').trim().replace(/^tel:/i, '')\n}\n\nfunction isEmailValue(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n if (/^mailto:/i.test(normalized)) return true\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalized)\n}\n\nfunction isPhoneValue(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n if (/^tel:/i.test(normalized)) return true\n return /^[+()\\-\\s\\d]{5,}$/.test(normalized)\n}\n\nfunction firstContactValue(\n store: LiveStore | undefined,\n subject: NamedNode,\n predicate: NamedNode,\n kind: 'email' | 'tel'\n): string {\n if (!store) return ''\n\n const candidates = store.each(subject, predicate)\n const isExpectedValue = kind === 'email' ? isEmailValue : isPhoneValue\n for (const node of candidates) {\n if (!node) continue\n\n const direct = (node as any).value\n if (typeof direct === 'string' && isExpectedValue(direct)) {\n return kind === 'email' ? normalizeEmail(direct) : normalizeTelephone(direct)\n }\n\n if (node.termType === 'NamedNode' || node.termType === 'BlankNode') {\n const doc = subject.doc()\n const inDocStatements = store.statementsMatching(node as any, ns.vcard('value'), null, doc)\n const anyGraphStatements = store.statementsMatching(node as any, ns.vcard('value'))\n\n for (const statement of [...inDocStatements, ...anyGraphStatements]) {\n const viaValue = statement.object?.value\n if (typeof viaValue === 'string' && isExpectedValue(viaValue)) {\n return kind === 'email' ? normalizeEmail(viaValue) : normalizeTelephone(viaValue)\n }\n }\n }\n }\n\n return ''\n}\n\nexport const QRCodeCard = (\n arg1: LegacySubjectArg,\n arg2?: unknown,\n arg3?: unknown\n): TemplateResult => {\n const { subject, store } = resolveQRCodeArgs(arg1, arg2, arg3)\n const name = utils.label(subject)\n\n const escapeVCardValue = (value: string): string => {\n return (value || '')\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\r?\\n/g, '\\\\n')\n }\n\n const safeName = escapeVCardValue(name || subject.uri)\n const safeUrl = escapeVCardValue(subject.uri)\n const email = firstContactValue(store, subject, ns.vcard('hasEmail'), 'email')\n const telephone = firstContactValue(store, subject, ns.vcard('hasTelephone'), 'tel')\n const vCardLines = [\n 'BEGIN:VCARD',\n 'VERSION:4.0',\n `FN:${safeName}`,\n `URL:${safeUrl}`,\n ]\n\n if (email) {\n vCardLines.push(`EMAIL;TYPE=internet:${escapeVCardValue(email)}`)\n }\n\n if (telephone) {\n vCardLines.push(`TEL:${escapeVCardValue(telephone)}`)\n }\n\n vCardLines.push('END:VCARD')\n const vCard = vCardLines.join('\\r\\n')\n\n // console.log(`@@ qrcodes colours highlightColor ${highlightColor}, backgroundColor ${backgroundColor}`)\n \n \n return html`\n <figure \n class=\"qrcode-card flex-column-center\"\n data-value=\"${vCard}\"\n data-testid=\"qrcode-card\"\n aria-labelledby=\"qr-code-caption\"\n role=\"img\"\n aria-describedby=\"qr-code-description\"\n >\n <div \n aria-label=\"Static QR code containing contact information for ${name}\"\n role=\"img\"\n tabindex=\"0\"\n ></div>\n <figcaption \n id=\"qr-code-caption\" \n class=\"qrcode-card__caption\"\n >\n ${scanQrToConnectText}\n </figcaption>\n <div \n id=\"qr-code-description\" \n class=\"sr-only\"\n >\n This is a static QR code containing vCard information for ${name}, including profile URL ${subject.uri}. The QR code is not interactive.\n </div>\n </figure>\n `\n}\n","import { NamedNode, Node, Store } from 'rdflib'\nimport { ns } from 'solid-ui'\n\nexport function expandRdfList(store: Store, node: Node): Node[] {\n const visited = new Set<string>()\n\n function inner(currentNode: Node): Node[] {\n const termType = (currentNode as any).termType || typeof currentNode\n const value = (currentNode as any).value || String(currentNode)\n const key = `${termType}:${value}`\n if (visited.has(key)) return []\n visited.add(key)\n\n const collectionElements = (currentNode as { termType?: string; elements?: Node[] }).elements\n if (Array.isArray(collectionElements)) {\n return collectionElements.flatMap((element) => inner(element))\n }\n\n const first = store.any(currentNode as NamedNode, ns.rdf('first'))\n if (!first) return [currentNode]\n\n const items: Node[] = []\n let listNode: Node | null = currentNode\n while (listNode) {\n const listValue = store.any(listNode as NamedNode, ns.rdf('first')) as Node | null\n if (listValue) items.push(...inner(listValue))\n const rest = store.any(listNode as NamedNode, ns.rdf('rest')) as Node | null\n if (!rest || (rest.termType === 'NamedNode' && rest.value === ns.rdf('nil').value)) break\n listNode = rest\n }\n\n return items\n }\n\n return inner(node)\n}\n","import { html } from 'lit-html'\n\nexport const birthdayIcon = html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M13.3327 13.9999V8.66659C13.3327 8.31296 13.1922 7.97382 12.9422 7.72378C12.6921 7.47373 12.353 7.33325 11.9993 7.33325H3.99935C3.64573 7.33325 3.30659 7.47373 3.05654 7.72378C2.80649 7.97382 2.66602 8.31296 2.66602 8.66659V13.9999\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M2.66602 10.6667C2.66602 10.6667 2.99935 10 3.99935 10C4.99935 10 5.66602 11.3333 6.66602 11.3333C7.66602 11.3333 8.33268 10 9.33268 10C10.3327 10 10.9993 11.3333 11.9993 11.3333C12.9993 11.3333 13.3327 10.6667 13.3327 10.6667\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.33398 14H14.6673\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M4.66602 5.33325V7.33325\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5.33325V7.33325\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.334 5.33325V7.33325\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M4.66602 2.66675H4.67268\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 2.66675H8.00667\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.334 2.66675H11.3407\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const locationIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M13.3327 6.66659C13.3327 9.99525 9.64002 13.4619 8.40002 14.5326C8.2845 14.6194 8.14388 14.6664 7.99935 14.6664C7.85482 14.6664 7.7142 14.6194 7.59868 14.5326C6.35868 13.4619 2.66602 9.99525 2.66602 6.66659C2.66602 5.2521 3.22792 3.89554 4.22811 2.89535C5.22831 1.89516 6.58486 1.33325 7.99935 1.33325C9.41384 1.33325 10.7704 1.89516 11.7706 2.89535C12.7708 3.89554 13.3327 5.2521 13.3327 6.66659Z\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 8.66675C9.10457 8.66675 10 7.77132 10 6.66675C10 5.56218 9.10457 4.66675 8 4.66675C6.89543 4.66675 6 5.56218 6 6.66675C6 7.77132 6.89543 8.66675 8 8.66675Z\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const checkMarkIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 14 14\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M11.254 3.08785C11.4818 2.86004 11.8513 2.86004 12.0791 3.08785C12.3066 3.31559 12.3066 3.68451 12.0791 3.91226L5.66216 10.3292C5.55282 10.4385 5.40458 10.5 5.24996 10.5001C5.09525 10.5001 4.94646 10.4386 4.83707 10.3292L1.92085 7.41226C1.69305 7.18445 1.69305 6.81565 1.92085 6.58785C2.14866 6.36004 2.51746 6.36004 2.74527 6.58785L5.24927 9.09117L11.254 3.08785Z\" fill=\"#7C4DFF\"/>\n </svg>\n`\nexport const plusDarkIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 14 14\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M2.91602 7H11.0827\" stroke=\"#314158\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 2.9165V11.0832\" stroke=\"#314158\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\n\nexport const plusIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"12\" \n height=\"12\" \n viewBox=\"0 0 12 12\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <g clip-path=\"url(#clip0_3001_2564)\">\n <path d=\"M6.06055 0.10083C6.53372 0.101056 6.91793 0.485037 6.91797 0.958252V5.20532H11.165C11.6384 5.20532 12.0225 5.58936 12.0225 6.06274C12.0223 6.536 11.6383 6.92017 11.165 6.92017H6.91797V11.1663C6.91797 11.6395 6.53374 12.0235 6.06055 12.0237C5.58716 12.0237 5.20312 11.6396 5.20312 11.1663V6.92017H0.957031C0.483929 6.91994 0.0997601 6.53586 0.0996094 6.06274C0.0996094 5.5895 0.483837 5.20555 0.957031 5.20532H5.20312V0.958252C5.20316 0.484897 5.58718 0.10083 6.06055 0.10083Z\" fill=\"#7C4DFF\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_3001_2564\">\n <rect width=\"12\" height=\"12\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n`\nexport const searchIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"13\" \n height=\"13\" \n viewBox=\"0 0 13 13\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"5.5\" cy=\"5.5\" r=\"4.5\" stroke=\"#99A1AF\" stroke-width=\"1.2\" fill=\"none\"/>\n <path d=\"M9.1 9.1L12 12\" stroke=\"#99A1AF\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n </svg>\n`\nexport const trashIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"20\" \n height=\"20\" \n viewBox=\"0 0 20 20\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M8.33301 9.16675V14.1667\" stroke=\"#D1D5DC\" stroke-width=\"1.45833\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.667 9.16675V14.1667\" stroke=\"#D1D5DC\" stroke-width=\"1.45833\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M15.8337 5V16.6667C15.8337 17.1087 15.6581 17.5326 15.3455 17.8452C15.0329 18.1577 14.609 18.3333 14.167 18.3333H5.83366C5.39163 18.3333 4.96771 18.1577 4.65515 17.8452C4.34259 17.5326 4.16699 17.1087 4.16699 16.6667V5\" stroke=\"#D1D5DC\" stroke-width=\"1.45833\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M2.5 5H17.5\" stroke=\"#D1D5DC\" stroke-width=\"1.45833\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.66699 5.00008V3.33341C6.66699 2.89139 6.84259 2.46746 7.15515 2.1549C7.46771 1.84234 7.89163 1.66675 8.33366 1.66675H11.667C12.109 1.66675 12.5329 1.84234 12.8455 2.1549C13.1581 2.46746 13.3337 2.89139 13.3337 3.33341V5.00008\" stroke=\"#D1D5DC\" stroke-width=\"1.45833\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const bentoIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"18\" \n height=\"18\" \n viewBox=\"0 0 18 18\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M6.75 9.75C7.16421 9.75 7.5 9.41421 7.5 9C7.5 8.58579 7.16421 8.25 6.75 8.25C6.33579 8.25 6 8.58579 6 9C6 9.41421 6.33579 9.75 6.75 9.75Z\" stroke=\"#99A1AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.75 4.5C7.16421 4.5 7.5 4.16421 7.5 3.75C7.5 3.33579 7.16421 3 6.75 3C6.33579 3 6 3.33579 6 3.75C6 4.16421 6.33579 4.5 6.75 4.5Z\" stroke=\"#99A1AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.75 15C7.16421 15 7.5 14.6642 7.5 14.25C7.5 13.8358 7.16421 13.5 6.75 13.5C6.33579 13.5 6 13.8358 6 14.25C6 14.6642 6.33579 15 6.75 15Z\" stroke=\"#99A1AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.25 9.75C11.6642 9.75 12 9.41421 12 9C12 8.58579 11.6642 8.25 11.25 8.25C10.8358 8.25 10.5 8.58579 10.5 9C10.5 9.41421 10.8358 9.75 11.25 9.75Z\" stroke=\"#99A1AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.25 4.5C11.6642 4.5 12 4.16421 12 3.75C12 3.33579 11.6642 3 11.25 3C10.8358 3 10.5 3.33579 10.5 3.75C10.5 4.16421 10.8358 4.5 11.25 4.5Z\" stroke=\"#99A1AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M11.25 15C11.6642 15 12 14.6642 12 14.25C12 13.8358 11.6642 13.5 11.25 13.5C10.8358 13.5 10.5 13.8358 10.5 14.25C10.5 14.6642 10.8358 15 11.25 15Z\" stroke=\"#99A1AF\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const starIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"30\" \n height=\"30\" \n viewBox=\"0 0 30 30\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect width=\"30\" height=\"30\" rx=\"5\" fill=\"black\" fill-opacity=\"0.2\"/>\n <path d=\"M14.1093 6.74536C14.4804 6.01811 15.5196 6.01811 15.8907 6.74536L17.7665 10.4209C17.9118 10.7056 18.1844 10.9037 18.5001 10.9539L22.5754 11.6021C23.3817 11.7303 23.7028 12.7186 23.1259 13.2963L20.2099 16.216C19.984 16.4422 19.8798 16.7627 19.9296 17.0785L20.5726 21.1546C20.6998 21.9611 19.8591 22.5719 19.1314 22.2017L15.4534 20.3307C15.1685 20.1857 14.8315 20.1857 14.5466 20.3307L10.8686 22.2017C10.1409 22.5719 9.30023 21.9611 9.42744 21.1546L10.0704 17.0785C10.1202 16.7627 10.016 16.4422 9.79012 16.216L6.87413 13.2963C6.29716 12.7186 6.61827 11.7303 7.42462 11.6021L11.4999 10.9539C11.8156 10.9037 12.0882 10.7056 12.2335 10.4209L14.1093 6.74536Z\" fill=\"#F4F4F4\"/>\n </svg>\n`\nexport const addIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"12\" \n height=\"12\" \n viewBox=\"0 0 12 12\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <g clip-path=\"url(#clip0_3001_349)\">\n <path d=\"M6.06055 0.10083C6.53372 0.101056 6.91793 0.485037 6.91797 0.958252V5.20532H11.165C11.6384 5.20532 12.0225 5.58936 12.0225 6.06274C12.0223 6.536 11.6383 6.92017 11.165 6.92017H6.91797V11.1663C6.91797 11.6395 6.53374 12.0235 6.06055 12.0237C5.58716 12.0237 5.20312 11.6396 5.20312 11.1663V6.92017H0.957031C0.483929 6.91994 0.0997601 6.53586 0.0996094 6.06274C0.0996094 5.5895 0.483837 5.20555 0.957031 5.20532H5.20312V0.958252C5.20316 0.484897 5.58718 0.10083 6.06055 0.10083Z\" fill=\"#7C4DFF\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_3001_349\">\n <rect width=\"12\" height=\"12\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n`\nexport const personInCircleIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"64\" \n height=\"64\" \n viewBox=\"0 0 64 64\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M32.0007 58.6666C46.7282 58.6666 58.6673 46.7275 58.6673 31.9999C58.6673 17.2723 46.7282 5.33325 32.0007 5.33325C17.2731 5.33325 5.33398 17.2723 5.33398 31.9999C5.33398 46.7275 17.2731 58.6666 32.0007 58.6666Z\" stroke=\"#CBD5E1\" stroke-width=\"5.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M32 34.6667C36.4183 34.6667 40 31.085 40 26.6667C40 22.2485 36.4183 18.6667 32 18.6667C27.5817 18.6667 24 22.2485 24 26.6667C24 31.085 27.5817 34.6667 32 34.6667Z\" stroke=\"#CBD5E1\" stroke-width=\"5.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M18.666 55.0986V50.6666C18.666 49.2521 19.2279 47.8955 20.2281 46.8954C21.2283 45.8952 22.5849 45.3333 23.9993 45.3333H39.9993C41.4138 45.3333 42.7704 45.8952 43.7706 46.8954C44.7708 47.8955 45.3327 49.2521 45.3327 50.6666V55.0986\" stroke=\"#CBD5E1\" stroke-width=\"5.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const globeIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"48\" \n height=\"48\" \n viewBox=\"0 0 48 48\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z\" stroke=\"#E5E7EB\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M24 4C18.8645 9.39231 16 16.5535 16 24C16 31.4465 18.8645 38.6077 24 44C29.1355 38.6077 32 31.4465 32 24C32 16.5535 29.1355 9.39231 24 4Z\" stroke=\"#E5E7EB\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M4 24H44\" stroke=\"#E5E7EB\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const lighteningIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" \n width=\"33\" \n height=\"36\" \n viewBox=\"0 0 33 36\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4.48242 29.6799H28.4824V5.67993H4.48242V29.6799Z\" fill=\"url(#pattern0_1101_13838)\"/>\n <defs>\n <pattern id=\"pattern0_1101_13838\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlink:href=\"#image0_1101_13838\" transform=\"scale(0.00625)\"/>\n </pattern>\n <image id=\"image0_1101_13838\" width=\"160\" height=\"160\" preserveAspectRatio=\"none\" xlink:href=\"data:image/png;base64,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\"/>\n </defs>\n </svg>\n`\nexport const commentIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\" stroke=\"#E5E7EB\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const envelopeIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"48\" \n height=\"48\" \n viewBox=\"0 0 48 48\" \n fill=\"none\" \n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path d=\"M40 8H8C5.79086 8 4 9.79086 4 12V36C4 38.2091 5.79086 40 8 40H40C42.2091 40 44 38.2091 44 36V12C44 9.79086 42.2091 8 40 8Z\" stroke=\"#E5E7EB\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M44 14L26.06 25.4C25.4425 25.7869 24.7286 25.992 24 25.992C23.2714 25.992 22.5575 25.7869 21.94 25.4L4 14\" stroke=\"#E5E7EB\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const pasteIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"12\" \n height=\"14\" \n viewBox=\"0 0 12 14\" \n fill=\"none\"\n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path d=\"M10.7004 2.667L8.43806 0.404688C8.17731 0.143938 7.83038 0 7.46113 0H3.22613C2.464 0 1.84363 0.619938 1.84363 1.3825V1.84625H1.37988C0.619062 1.84625 0 2.46531 0 3.22613V11.6576C0 12.4184 0.619062 13.0375 1.37988 13.0375H7.882C8.64281 13.0375 9.26188 12.4184 9.26188 11.6576V11.1926H9.723C10.4847 11.1926 11.1046 10.5726 11.1046 9.81137V3.64306C11.1046 3.27994 10.9572 2.92381 10.7004 2.667ZM9.75888 2.83938H8.855C8.5295 2.83938 8.26438 2.57469 8.26438 2.24875V1.34488L9.75888 2.83938ZM8.47438 11.6576C8.47438 11.9844 8.20881 12.25 7.882 12.25H1.37988C1.0535 12.25 0.7875 11.9844 0.7875 11.6576V3.22613C0.7875 2.89931 1.05306 2.63375 1.37988 2.63375H1.84406V9.81181C1.84406 10.5731 2.464 11.1926 3.22525 11.1926H8.47438V11.6576ZM10.3171 9.81137C10.3171 10.1391 10.0511 10.4051 9.72344 10.4051H3.22525C2.898 10.4051 2.632 10.1391 2.632 9.81181V1.3825C2.632 1.05438 2.89844 0.7875 3.22656 0.7875H7.46156C7.46681 0.7875 7.47163 0.790563 7.47688 0.790563V2.24875C7.47688 3.00869 8.09506 3.62688 8.855 3.62688H10.3136C10.3136 3.63256 10.3167 3.63738 10.3167 3.64306V9.81137H10.3171Z\" fill=\"#6A7282\"/>\n </svg>\n`\n\nexport const closeIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"12\" \n height=\"12\" \n viewBox=\"0 0 12 12\" \n fill=\"none\"\n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.5301 0.244005C10.8555 -0.0813835 11.3834 -0.0812864 11.7088 0.244005C12.0338 0.569352 12.0338 1.09639 11.7088 1.42174L7.15416 5.97545L11.7088 10.5301C12.0341 10.8556 12.0342 11.3835 11.7088 11.7088C11.3835 12.0342 10.8556 12.0341 10.5301 11.7088L5.97545 7.15416L1.42174 11.7088C1.09639 12.0338 0.569351 12.0338 0.244004 11.7088C-0.0812866 11.3834 -0.0813828 10.8555 0.244004 10.5301L4.79772 5.97545L0.244004 1.42174C-0.0812866 1.09629 -0.0813828 0.569393 0.244004 0.244005C0.569393 -0.0813835 1.09629 -0.0812864 1.42174 0.244005L5.97545 4.79772L10.5301 0.244005Z\" fill=\"#4A5565\"/>\n </svg>\n`\n\nexport const editIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"20\" \n height=\"20\" \n viewBox=\"0 0 20 20\" \n fill=\"none\"\n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14.3063 3.34814C14.9271 3.34832 15.5236 3.59563 15.9625 4.03467C16.4012 4.47362 16.648 5.06935 16.6481 5.68994C16.648 6.31072 16.4004 6.90719 15.9615 7.34619L15.9606 7.34521L7.95373 15.355L7.95275 15.356C7.73845 15.5696 7.47464 15.7278 7.18517 15.8159H7.1842L4.57287 16.6079H4.57092C4.40678 16.6572 4.23224 16.6614 4.06603 16.6196C3.89974 16.5778 3.74793 16.4918 3.62658 16.3706C3.50526 16.2494 3.41865 16.0974 3.37658 15.9312C3.33472 15.7651 3.3383 15.5903 3.38732 15.4263L3.3883 15.4243L4.18127 12.813V12.811C4.27013 12.5215 4.42882 12.2574 4.64318 12.0435L12.651 4.03467V4.03369C13.09 3.59513 13.6857 3.34816 14.3063 3.34814ZM5.56213 12.9634C5.49841 13.0269 5.4509 13.1059 5.42443 13.1919L5.42345 13.1909L4.82189 15.1733L6.80627 14.5718C6.89221 14.5456 6.97114 14.4985 7.03478 14.4351L13.274 8.19482L11.8014 6.72217L5.56213 12.9634ZM14.3063 4.64893C14.0303 4.64894 13.7652 4.75864 13.5699 4.95361L12.7213 5.80225L14.194 7.2749L15.0426 6.42627L15.1119 6.3501C15.2635 6.16488 15.3473 5.93141 15.3473 5.68994C15.3472 5.41394 15.2377 5.14881 15.0426 4.95361C14.8474 4.75846 14.5823 4.64906 14.3063 4.64893Z\" fill=\"#1E2939\"/>\n </svg>\n`\nexport const deleteIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 14 14\" \n fill=\"none\"\n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path d=\"M10.5 3.5L3.5 10.5\" stroke=\"#6A7282\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.5 3.5L10.5 10.5\" stroke=\"#6A7282\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\nexport const cameraIcon = html`\n<svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"14\" \n height=\"14\" \n viewBox=\"0 0 14 14\" \n fill=\"none\"\n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path d=\"M8.16427 2.3335C8.37473 2.33349 8.58127 2.39042 8.76201 2.49825C8.94276 2.60608 9.09096 2.76079 9.19093 2.946L9.47443 3.471C9.5744 3.6562 9.72261 3.81091 9.90335 3.91874C10.0841 4.02657 10.2906 4.0835 10.5011 4.0835H11.666C11.9754 4.0835 12.2722 4.20641 12.491 4.4252C12.7098 4.644 12.8327 4.94074 12.8327 5.25016V10.5002C12.8327 10.8096 12.7098 11.1063 12.491 11.3251C12.2722 11.5439 11.9754 11.6668 11.666 11.6668H2.33268C2.02326 11.6668 1.72652 11.5439 1.50772 11.3251C1.28893 11.1063 1.16602 10.8096 1.16602 10.5002V5.25016C1.16602 4.94074 1.28893 4.644 1.50772 4.4252C1.72652 4.20641 2.02326 4.0835 2.33268 4.0835H3.4976C3.70784 4.08351 3.91419 4.0267 4.0948 3.91909C4.27542 3.81148 4.42361 3.65706 4.52368 3.47216L4.80893 2.94483C4.90901 2.75993 5.05719 2.60551 5.23781 2.4979C5.41843 2.39029 5.62477 2.33348 5.83502 2.3335H8.16427Z\" stroke=\"#1E2939\" stroke-width=\"1.02083\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7 9.33337C7.9665 9.33337 8.75 8.54987 8.75 7.58337C8.75 6.61688 7.9665 5.83337 7 5.83337C6.0335 5.83337 5.25 6.61688 5.25 7.58337C5.25 8.54987 6.0335 9.33337 7 9.33337Z\" stroke=\"#1E2939\" stroke-width=\"1.02083\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n`\n\nexport const twoDownArrowsIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n fill=\"none\"\n aria-hidden=\"true\" \n focusable=\"false\"\n >\n <path d=\"M3.5 4L8 8L12.5 4\" stroke=\"#7C4DFF\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.5 8L8 12L12.5 8\" stroke=\"#7C4DFF\" stroke-width=\"1.16667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n`\n","/** Project-local: currently unused component. Keep temporarily; do not add new usage. */\nimport { NamedNode, Store, Namespace, sym, parse } from 'rdflib'\nimport { widgets } from 'solid-ui'\n\nconst baseUri = 'https://solidos.github.io/profile-pane/src/ontology/'\n\nexport default function renderForm(\n div: HTMLElement,\n subject: NamedNode, // Represents the RDF that fills the form\n formSource: string, // The imported form Turtle source\n formName: string, // The name of the form file (e.g., 'socialMedia.ttl')\n store: Store,\n dom: Document,\n editableProfile: NamedNode | null,\n whichForm?: string ) {// Optional: specify which form to use if multiple 'a ui:Form' are present in the file{\n // --- Form resource setup ---\n const formUri = baseUri + formName // Full URI to the form file\n const exactForm = whichForm || 'this' // If there are more 'a ui:Form' elements in a form file\n const formThis = Namespace(formUri + '#')(exactForm) // NamedNode for #this in the form\n\n loadDocument(store, formSource, formName, formUri)\n\n widgets.appendForm(\n dom,\n div,\n {},\n subject,\n formThis,\n editableProfile,\n (ok, mes) => {\n if (!ok) widgets.errorMessageBlock(dom, mes)\n }\n )\n\n // Ensure that when a user clicks “Add skill” or “Add language”, the newly\n // created input receives focus. Solid-UI provides only a generic \"Add\" button.\n // We detect the \"add\" control by the plus icon it uses and focus the last\n // text input in the surrounding multiple-field container.\n enableFocusOnAdd(div)\n\n // Track the last click/tap position so popups (like solid-ui delete confirmations)\n // can be positioned closer to where the user clicked.\n let lastClick = { x: 0, y: 0 }\n div.addEventListener(\n 'pointerdown',\n (event) => {\n lastClick = { x: event.clientX, y: event.clientY }\n },\n { capture: true }\n )\n\n // Solid-UI injects a popup DIV (position:absolute, top:-1em) under a relative container.\n // Detect it and reposition it using last click coordinates.\n const repositionPopup = (popup: HTMLElement) => {\n const win = dom.defaultView || window\n const padding = 10\n const maxWidth = win.innerWidth - padding\n const maxHeight = win.innerHeight - padding\n\n // Force fixed positioning, then clamp to viewport so it doesn't get cut off.\n popup.style.position = 'fixed'\n popup.style.zIndex = '9999'\n popup.style.pointerEvents = 'auto'\n popup.style.opacity = '1'\n popup.style.visibility = 'visible'\n\n // Use getBoundingClientRect after it is in DOM; if it is 0x0, fall back to default offset.\n const rect = popup.getBoundingClientRect()\n const popupWidth = rect.width || 200\n const popupHeight = rect.height || 100\n\n const left = Math.min(Math.max(lastClick.x + padding, padding), maxWidth - popupWidth)\n const top = Math.min(Math.max(lastClick.y + padding, padding), maxHeight - popupHeight)\n\n popup.style.left = `${left}px`\n popup.style.top = `${top}px`\n }\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (!(node instanceof HTMLElement)) continue\n // Solid-UI popups are divs with inline position:absolute and grid display\n if (\n node.style.position === 'absolute' &&\n node.style.display === 'grid' &&\n node.style.top === '-1em'\n ) {\n repositionPopup(node)\n continue\n }\n // Also handle nested cases where the popup is not the direct added node\n const popup = node.querySelector<HTMLElement>('div[style*=\"position:absolute\"][style*=\"display:grid\"][style*=\"top:-1em\"]')\n if (popup) repositionPopup(popup)\n }\n }\n })\n\n observer.observe(div, { childList: true, subtree: true })\n } // renderForm\n\nfunction enableFocusOnAdd(root: HTMLElement) {\n const PLUS_ICON = 'noun_19460_green.svg'\n\n const isAddButton = (el: HTMLElement) => {\n const img = el.querySelector<HTMLImageElement>('img')\n const label = el.querySelector<HTMLElement>('span')\n return (\n img?.src.includes(PLUS_ICON) &&\n label?.textContent?.trim().toLowerCase().startsWith('add ')\n )\n }\n\n const buttons = Array.from(root.querySelectorAll<HTMLElement>('div')).filter(isAddButton)\n buttons.forEach((btn) => {\n btn.addEventListener('click', () => {\n const scope = (function findScope(el: HTMLElement | null): HTMLElement {\n let cur: HTMLElement | null = el\n while (cur && cur !== root) {\n if (cur.querySelector('input[data-testid=\"autocomplete-input\"]')) return cur\n cur = cur.parentElement\n }\n return root\n })(btn)\n\n const before = new Set(\n Array.from(scope.querySelectorAll<HTMLInputElement>('input[data-testid=\"autocomplete-input\"]'))\n )\n\n const start = Date.now()\n const interval = setInterval(() => {\n const current = Array.from(\n scope.querySelectorAll<HTMLInputElement>('input[data-testid=\"autocomplete-input\"]')\n )\n const newInput = current.find((el) => !before.has(el))\n\n if (newInput) {\n // New inputs are usually wrapped in a label/link; make sure focus jumps\n // straight to the input rather than the label link.\n skipLabelsFromTabbing(scope)\n newInput.focus()\n clearInterval(interval)\n return\n }\n\n if (Date.now() - start > 1000) {\n clearInterval(interval)\n }\n }, 50)\n })\n })\n}\n\n\n\n\n// we need to load into the store some additional information about Social Media accounts\nexport function loadDocument(\n store: Store,\n documentSource: string,\n documentName: string,\n documentURI?: string\n ) {\n const finalDocumentUri = documentURI || baseUri + documentName // Full URI to the file\n const document = sym(finalDocumentUri) // rdflib NamedNode for the document \n \n if (!store.holds(undefined, undefined, undefined, document)) {\n // we are using the social media form because it contains the information we need\n // the form can be used for both use cases: create UI for edit and render UI for display\n parse(documentSource, store, finalDocumentUri, 'text/turtle', () => null) // Load doc directly\n }\n}\n\nexport function skipLabelsFromTabbing(root: HTMLElement): void {\n // Many Solid-UI forms render field labels as focusable links (hrefs).\n // Make sure keyboard tabbing skips these label links entirely.\n const selectors = [\n 'label',\n '.formFieldName a',\n '.classifierBox-label a',\n '.choiceBox-label a',\n '.label a',\n // Skip focusable label-like links created by Solid-UI forms, including the vcard note link\n 'a[href=\"http://www.w3.org/2006/vcard/ns#note\"]',\n 'a[href$=\"#note\"]',\n ].join(', ')\n\n // querySelectorAll<HTMLElement> ensures the elements are typed correctly so we can access tabIndex.\n const nodes = root?.querySelectorAll<HTMLElement>(selectors)\n if (!nodes) return\n\n Array.from(nodes).forEach(el => {\n if (typeof el.tabIndex === 'number' && el.tabIndex !== -1) {\n el.tabIndex = -1\n }\n // Ensure those label links are not announced as focusable elements\n if (el.getAttribute('aria-hidden') !== 'true') {\n el.setAttribute('aria-hidden', 'true')\n }\n })\n}","import { icons } from 'solid-ui'\nimport { starIcon } from '../../icons-svg/profileIcons'\n\nexport const socialMediaFormName = 'socialMedia.ttl' // The name of the file to upload\n\nconst FALLBACK_ICON_URI = `${icons.iconBase}noun_10636_grey.svg` // grey disc\n\nexport const DEFAULT_ICON_URI = (() => {\n\tconst svgMarkup = (starIcon as any)?.strings?.join('') || ''\n\treturn svgMarkup ? `data:image/svg+xml;utf8,${encodeURIComponent(svgMarkup)}` : FALLBACK_ICON_URI\n})()\n","import { graph, LiveStore, NamedNode, parse, sym } from 'rdflib'\nimport { ns, utils } from 'solid-ui'\nimport socialMediaForm from '../../ontology/socialMedia.ttl'\nimport { starIcon } from '../../icons-svg/profileIcons'\nimport { loadDocument } from '../../rdfFormsHelper'\nimport { expandRdfList } from '../shared/rdfList'\nimport { DEFAULT_ICON_URI, socialMediaFormName } from './constants'\nimport discordIconAsset from '../../../icons-png/discord.png'\nimport dribbbleIconAsset from '../../../icons-png/dribbble.png'\nimport facebookIconAsset from '../../../icons-png/facebook.png'\nimport instagramIconAsset from '../../../icons-png/instagram.png'\nimport linkedinIconAsset from '../../../icons-png/linkedin.png'\nimport pinterestIconAsset from '../../../icons-png/pinterest.png'\nimport sharechatIconAsset from '../../../icons-png/sharechat.png'\nimport snapchatIconAsset from '../../../icons-png/snapchat.png'\nimport spotifyIconAsset from '../../../icons-png/spotify.png'\nimport telegramIconAsset from '../../../icons-png/telegram.png'\nimport tiktokIconAsset from '../../../icons-png/tiktok.png'\nimport whatsappIconAsset from '../../../icons-png/whatsapp.png'\nimport xIconAsset from '../../../icons-png/x.png'\nimport youtubeIconAsset from '../../../icons-png/youtube.png'\n\nconst OWL_DISJOINT_UNION_OF = sym('http://www.w3.org/2002/07/owl#disjointUnionOf')\nconst STAR_ICON_REF = 'urn:profile-pane:starIcon'\nconst ICON_KEY_REF_PREFIX = 'urn:profile-pane:icon:'\nconst SOCIAL_ONTOLOGY_URI = 'https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl'\nconst SOCIAL_CLASS_BASE = `${SOCIAL_ONTOLOGY_URI}#`\n\nconst STAR_ICON_URI = (() => {\n const svgMarkup = (starIcon as any)?.strings?.join('') || ''\n return svgMarkup ? `data:image/svg+xml;utf8,${encodeURIComponent(svgMarkup)}` : DEFAULT_ICON_URI\n})()\n\nlet cachedSocialOntologyStore: LiveStore | null = null\n\nconst FALLBACK_SOCIAL_OPTIONS: SocialAccountOption[] = [\n { classUri: `${SOCIAL_CLASS_BASE}FacebookAccount`, label: 'Facebook', icon: facebookIconAsset, userProfilePrefix: 'https://www.facebook.com/', homepage: 'https://www.facebook.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}InstagramAccount`, label: 'Instagram', icon: instagramIconAsset, userProfilePrefix: 'https://www.instagram.com/', homepage: 'https://www.instagram.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}LinkedInAccount`, label: 'LinkedIn', icon: linkedinIconAsset, userProfilePrefix: 'https://www.linkedin.com/in/', homepage: 'https://linkedin.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}TiktokAccount`, label: 'TikTok', icon: tiktokIconAsset, userProfilePrefix: 'https://www.tiktok.com/@', homepage: 'https://www.tiktok.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}TwitterAccount`, label: 'X', icon: xIconAsset, userProfilePrefix: 'https://x.com/', homepage: 'https://x.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}YouTubeAccount`, label: 'YouTube', icon: youtubeIconAsset, userProfilePrefix: 'https://www.youtube.com/', homepage: 'https://www.youtube.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}DiscordAccount`, label: 'Discord', icon: discordIconAsset, userProfilePrefix: 'https://discord.com/users/', homepage: 'https://discord.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}SnapchatAccount`, label: 'Snapchat', icon: snapchatIconAsset, userProfilePrefix: 'https://www.snapchat.com/add/', homepage: 'https://www.snapchat.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}PinterestAccount`, label: 'Pinterest', icon: pinterestIconAsset, userProfilePrefix: 'https://pin.it/', homepage: 'https://pinterest.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}SpotifyAccount`, label: 'Spotify', icon: spotifyIconAsset, userProfilePrefix: 'https://www.spotify.com/user/', homepage: 'https://www.spotify.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}TelegramAccount`, label: 'Telegram', icon: telegramIconAsset, userProfilePrefix: 'https://t.me/', homepage: 'https://telegram.org/' },\n { classUri: `${SOCIAL_CLASS_BASE}DribbleAccount`, label: 'Dribble', icon: dribbbleIconAsset, userProfilePrefix: 'https://dribbble.com/', homepage: 'https://dribbble.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}SharechatAccount`, label: 'ShareChat', icon: sharechatIconAsset, userProfilePrefix: 'https://www.sharechat.com/user/', homepage: 'https://sharechat.com/' },\n { classUri: `${SOCIAL_CLASS_BASE}WhatsAppAccount`, label: 'WhatsApp', icon: whatsappIconAsset, userProfilePrefix: 'https://wa.me/', homepage: 'https://www.whatsapp.com/' }\n]\n\n// Temporary icon mapping for locally bundled social PNG assets.\n// These icon assets are intended to move to a dedicated icons project later.\nconst ONTOLOGY_ICON_ASSETS: Record<string, string> = {\n // New key-based references used in socialMedia.ttl.\n 'discord': discordIconAsset,\n 'dribbble': dribbbleIconAsset,\n 'facebook': facebookIconAsset,\n 'instagram': instagramIconAsset,\n 'linkedin': linkedinIconAsset,\n 'pinterest': pinterestIconAsset,\n 'sharechat': sharechatIconAsset,\n 'snapchat': snapchatIconAsset,\n 'spotify': spotifyIconAsset,\n 'telegram': telegramIconAsset,\n 'tiktok': tiktokIconAsset,\n 'whatsapp': whatsappIconAsset,\n 'x': xIconAsset,\n 'youtube': youtubeIconAsset,\n // Backward compatibility for older path-based ontology values.\n 'discord.png': discordIconAsset,\n 'dribbble.png': dribbbleIconAsset,\n 'facebook.png': facebookIconAsset,\n 'instagram.png': instagramIconAsset,\n 'linkedin.png': linkedinIconAsset,\n 'pinterest.png': pinterestIconAsset,\n 'sharechat.png': sharechatIconAsset,\n 'snapchat.png': snapchatIconAsset,\n 'spotify.png': spotifyIconAsset,\n 'telegram.png': telegramIconAsset,\n 'tiktok.png': tiktokIconAsset,\n 'whatsapp.png': whatsappIconAsset,\n 'x.png': xIconAsset,\n 'youtube.png': youtubeIconAsset\n}\n\nfunction resolveBundledIconAsset(iconValue: string): string {\n if (!iconValue) return ''\n const normalized = iconValue.trim().toLowerCase()\n\n if (normalized.startsWith(ICON_KEY_REF_PREFIX)) {\n const key = normalized.slice(ICON_KEY_REF_PREFIX.length)\n return ONTOLOGY_ICON_ASSETS[key] || ''\n }\n\n const marker = 'icons-png/'\n const markerIndex = normalized.lastIndexOf(marker)\n if (markerIndex === -1) return ''\n\n const fileName = normalized.slice(markerIndex + marker.length)\n return ONTOLOGY_ICON_ASSETS[fileName] || ''\n}\n\nfunction resolveSocialIcon(classUri: string, iconValue: string): string {\n if (classUri.endsWith('#OtherAccount') || iconValue === STAR_ICON_REF) {\n return STAR_ICON_URI\n }\n const bundledIcon = resolveBundledIconAsset(iconValue)\n if (bundledIcon) return bundledIcon\n return iconValue || DEFAULT_ICON_URI\n}\n\nfunction getSocialOntologyStore(): LiveStore {\n if (cachedSocialOntologyStore) return cachedSocialOntologyStore\n\n const ontologyStore = graph() as unknown as LiveStore\n parse(socialMediaForm, ontologyStore as any, SOCIAL_ONTOLOGY_URI, 'text/turtle', () => null)\n cachedSocialOntologyStore = ontologyStore\n return ontologyStore\n}\n\nexport type SocialAccountOption = {\n classUri: string\n label: string\n icon: string\n homepage?: string\n userProfilePrefix?: string\n}\n\nfunction normalizeSocialOptionKey(value: string): string {\n return (value || '')\n .trim()\n .toLowerCase()\n .replace(/[#:/]/g, ' ')\n .replace(/account\\b/g, '')\n .replace(/[^a-z0-9]/g, '')\n}\n\nexport function findSocialAccountOption(options: SocialAccountOption[], value: string): SocialAccountOption | undefined {\n const rawValue = (value || '').trim()\n if (!rawValue) return undefined\n\n const lowerValue = rawValue.toLowerCase()\n const direct = options.find((option) => {\n return option.classUri.toLowerCase() === lowerValue || option.label.toLowerCase() === lowerValue\n })\n if (direct) return direct\n\n const key = normalizeSocialOptionKey(rawValue)\n if (!key) return undefined\n\n return options.find((option) => {\n const optionLabelKey = normalizeSocialOptionKey(option.label)\n const optionClassKey = normalizeSocialOptionKey(option.classUri)\n return optionLabelKey === key || optionClassKey === key\n })\n}\n\nexport function ensureSocialOntologyLoaded(store: LiveStore): void {\n loadDocument(store, socialMediaForm, socialMediaFormName)\n}\n\nexport function getSocialAccountOptions(store: LiveStore): SocialAccountOption[] {\n ensureSocialOntologyLoaded(store)\n const ontologyStore = getSocialOntologyStore()\n\n const classNodeMap = new Map<string, NamedNode>()\n\n const unionNode = ontologyStore.any(ns.foaf('Account'), OWL_DISJOINT_UNION_OF) as any\n if (unionNode) {\n const unionClassNodes = expandRdfList(ontologyStore, unionNode)\n .filter((node): node is NamedNode => node.termType === 'NamedNode')\n for (const classNode of unionClassNodes) {\n classNodeMap.set(classNode.value, classNode)\n }\n }\n\n // Fallback/augmentation: include any class declared as a foaf:Account subclass.\n const subclassStatements = ontologyStore.statementsMatching(undefined as any, ns.rdfs('subClassOf'), ns.foaf('Account'))\n for (const statement of subclassStatements) {\n const classNode = statement.subject\n if (classNode?.termType === 'NamedNode') {\n classNodeMap.set(classNode.value, classNode as NamedNode)\n }\n }\n\n const classNodes = Array.from(classNodeMap.values())\n if (!classNodes.length) return []\n\n const options: SocialAccountOption[] = classNodes.map((classNode) => {\n const label =\n ontologyStore.any(classNode, ns.rdfs('label'))?.value ||\n utils.label(classNode) ||\n classNode.value\n\n const iconValue = ontologyStore.any(classNode, ns.foaf('icon'))?.value || ''\n const icon = resolveSocialIcon(classNode.value, iconValue)\n const homepage = ontologyStore.any(classNode, ns.foaf('homepage'))?.value || ''\n const userProfilePrefix = ontologyStore.any(classNode, ns.foaf('userProfilePrefix'))?.value || ''\n\n return {\n classUri: classNode.value,\n label,\n icon,\n homepage: homepage || undefined,\n userProfilePrefix: userProfilePrefix || undefined\n }\n })\n\n // Keep labels stable and avoid duplicates if ontology data repeats.\n const seen = new Set<string>()\n const normalizedOptions = options.filter((option) => {\n const key = option.label.toLowerCase().trim()\n if (!key || seen.has(key)) return false\n seen.add(key)\n return true\n })\n\n for (const fallbackOption of FALLBACK_SOCIAL_OPTIONS) {\n const key = fallbackOption.label.toLowerCase().trim()\n if (!seen.has(key)) {\n normalizedOptions.push(fallbackOption)\n seen.add(key)\n }\n }\n\n return normalizedOptions\n}\n\nexport function nameForAccount(store: LiveStore, accountNode: any): string {\n const accountName = store.any(accountNode, ns.foaf('name')) || store.any(accountNode, ns.rdfs('label'))\n if (accountName) return accountName.value\n\n const classes = store.each(accountNode as any, ns.rdf('type')) as NamedNode[]\n for (const classNode of classes) {\n const classLabel = store.any(classNode, ns.rdfs('label'))\n if (classLabel) return classLabel.value\n return utils.label(classNode)\n }\n\n return 'Unknown Account'\n}\n\nexport function iconForAccount(store: LiveStore, accountNode: any): string {\n const accountIcon = store.any(accountNode, ns.foaf('icon'))\n if (accountIcon?.value === STAR_ICON_REF) return STAR_ICON_URI\n if (accountIcon) {\n const bundledIcon = resolveBundledIconAsset(accountIcon.value)\n if (bundledIcon) return bundledIcon\n return accountIcon.value\n }\n\n const classes = store.each(accountNode as any, ns.rdf('type')) as any[]\n for (const classNode of classes) {\n if (classNode?.value?.endsWith('#OtherAccount')) return STAR_ICON_URI\n const classIcon = store.any(classNode as any, ns.foaf('icon'))\n if (classIcon?.value === STAR_ICON_REF) return STAR_ICON_URI\n if (classIcon) {\n const bundledIcon = resolveBundledIconAsset(classIcon.value)\n if (bundledIcon) return bundledIcon\n return classIcon.value\n }\n }\n\n return DEFAULT_ICON_URI\n}\n\nexport function homepageForAccount(store: LiveStore, accountNode: any): string {\n const accountHomepage = store.any(accountNode, ns.foaf('homepage'))\n if (accountHomepage) return accountHomepage.value\n\n const id = String(store.anyJS(accountNode as any, ns.foaf('accountName'), null, accountNode.doc()) || 'No_account_Name').trim()\n if (/^https?:\\/\\//i.test(id)) return id\n\n const classes = store.each(accountNode as any, ns.rdf('type'))\n\n for (const classNode of classes) {\n if (classNode.termType === 'NamedNode') {\n const userProfilePrefix = store.any(classNode as NamedNode, ns.foaf('userProfilePrefix'))\n if (userProfilePrefix) {\n return userProfilePrefix.value + String(id).trim()\n }\n }\n }\n\n return store.anyJS(accountNode as any, ns.foaf('homepage'), null, accountNode.doc()) || ''\n}\n","import { LiveStore, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { Account, SocialPresentation } from './types'\nimport { expandRdfList } from '../shared/rdfList'\nimport {\n ensureSocialOntologyLoaded,\n homepageForAccount,\n iconForAccount,\n nameForAccount\n} from './helpers'\n\n\nexport function presentSocial(\n subject: NamedNode,\n store: LiveStore\n): SocialPresentation {\n function accountAsObject (ac: NamedNode): Account {\n return {\n name: nameForAccount(store, ac),\n icon: iconForAccount(store, ac),\n homepage: homepageForAccount(store, ac),\n entryNode: ac\n }\n\n }\n \n // we need to load the social media accounts ontology to be able to query all data needed\n ensureSocialOntologyLoaded(store)\n\n const accountNodes = store.each(subject, ns.foaf('account'))\n const accountThings = accountNodes.flatMap(node => expandRdfList(store, node))\n // Deduplicate by foaf:accountName value\n const accountNameSet = new Set<string>()\n const accounts: Account[] = []\n for (const ac of accountThings) {\n if (ac.termType === 'NamedNode') {\n const accountNameNode = store.any(ac as NamedNode, ns.foaf('accountName'))\n const dedupeKey = accountNameNode ? accountNameNode.value : ''\n if (!accountNameSet.has(dedupeKey)) {\n accountNameSet.add(dedupeKey)\n accounts.push(accountAsObject(ac as NamedNode))\n }\n }\n }\n if (!accounts.length) return { accounts: [] }\n return { accounts }\n}\n","import { LiveStore, NamedNode, Node, Store } from 'rdflib'\nimport { ns, utils } from 'solid-ui'\nimport { SkillDetails } from './types'\n\n\nexport function skillAsText (store: Store, sk: Node):string {\n if (sk.termType === 'Literal') return ''\n\n const directName = store.anyJS(sk as NamedNode, ns.schema('name'))\n if (directName) return directName\n\n // Canonical shape: entry node -> solid:publicId -> schema:name.\n const publicId = store.any(sk as NamedNode, ns.solid('publicId')) as Node | null\n if (publicId && publicId.termType === 'NamedNode') {\n const name = store.anyJS(publicId as NamedNode, ns.schema('name'))\n if (name) return name\n return utils.label(publicId, true)\n }\n\n return ''\n}\n\nexport function presentSkillDetails(subject: NamedNode, store: LiveStore): SkillDetails[] {\n return store\n .each(subject, ns.schema('skills'))\n .filter((sk) => sk.termType !== 'Literal')\n .map((sk) => {\n const publicId = store.any(sk as NamedNode, ns.solid('publicId')) as Node | null\n const publicIdUri = publicId ? publicId.value : ''\n return {\n name: skillAsText(store, sk),\n publicId: publicIdUri,\n entryNode: sk\n }\n })\n .filter((detail) => detail.name !== '')\n}\n\nexport function presentSkills(subject: NamedNode, store: LiveStore): string[] {\n return presentSkillDetails(subject, store).map((detail) => detail.name)\n}\n","import { NamedNode, Store, Node, LiveStore, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { LanguageDetails } from './types'\nimport { expandRdfList } from '../shared/rdfList'\n\nconst IANA_LANGUAGE_BASE = 'https://www.w3.org/ns/iana/language-code/'\n\nfunction normalizeText(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\nfunction isRdfListNode(store: Store, node: Node): boolean {\n const hasCollectionElements = Array.isArray((node as any)?.elements)\n if (hasCollectionElements) return true\n if (node.termType !== 'BlankNode' && node.termType !== 'NamedNode') return false\n return Boolean(store.any(node as NamedNode, ns.rdf('first')))\n}\n\nfunction normalizeLanguageCode(value: string): string {\n return (value || '').trim().toLowerCase()\n}\n\nfunction languageNameFromCode(code: string): string {\n const normalized = (code || '').trim().toLowerCase()\n if (!normalized) return ''\n\n try {\n const DisplayNamesCtor = (Intl as any)?.DisplayNames\n if (typeof DisplayNamesCtor === 'function') {\n const displayNames = new DisplayNamesCtor(['en'], { type: 'language' })\n const localized = displayNames.of(normalized)\n if (localized) return localized\n }\n } catch {\n // Fallback below.\n }\n\n return normalized\n}\n\nfunction languageNameFromPublicId(publicIdValue: string): string {\n const value = (publicIdValue || '').trim()\n if (!value) return ''\n\n if (value.startsWith(IANA_LANGUAGE_BASE)) {\n const code = normalizeLanguageCode(value.slice(IANA_LANGUAGE_BASE.length))\n return languageNameFromCode(code)\n }\n\n return languageNameFromCode(value)\n}\n\nfunction englishOrAnyLiteralValue(store: Store, subject: NamedNode, predicate: NamedNode): string {\n const values = store.statementsMatching(subject, predicate)\n const english = values.find((statement) => {\n const language = (statement.object as any)?.lang || ''\n return language.toLowerCase().startsWith('en')\n })\n if (english && typeof (english.object as any)?.value === 'string') {\n return (english.object as any).value\n }\n\n const firstLiteral = values.find((statement) => statement.object?.termType === 'Literal')\n if (firstLiteral && typeof (firstLiteral.object as any)?.value === 'string') {\n return (firstLiteral.object as any).value\n }\n\n return ''\n}\n\nfunction englishLabelForNode(store: Store, node: NamedNode): string {\n const labels = store.statementsMatching(node, ns.rdfs('label'))\n const english = labels.find((statement) => {\n const language = (statement.object as any)?.lang || ''\n return language.toLowerCase().startsWith('en')\n })\n if (english && english.object && typeof (english.object as any).value === 'string') {\n return (english.object as any).value\n }\n return ''\n}\n\nfunction languageNameFromIanaNode(store: Store, node: NamedNode): string {\n const schemaName = englishOrAnyLiteralValue(store, node, ns.schema('name'))\n if (schemaName) return normalizeText(schemaName)\n\n const localLabel = englishLabelForNode(store, node)\n if (localLabel) return normalizeText(localLabel)\n\n if (node.value.startsWith(IANA_LANGUAGE_BASE)) {\n return languageNameFromPublicId(node.value)\n }\n\n return ''\n}\n\nfunction toStoredPublicIdValue(lan: Node, publicIdNode: Node | undefined): string | undefined {\n if (publicIdNode?.termType === 'NamedNode') {\n return publicIdNode.value\n }\n\n if (publicIdNode?.termType === 'Literal') {\n const code = normalizeLanguageCode(publicIdNode.value)\n return code || undefined\n }\n\n if (lan.termType === 'NamedNode' && lan.value.startsWith(IANA_LANGUAGE_BASE)) {\n return lan.value\n }\n\n return undefined\n}\n\nfunction languageNameFromLanguageNode(store: Store, lan: Node, publicIdNode: Node | undefined): string {\n if (publicIdNode?.termType === 'NamedNode') {\n const nodeName = languageNameFromIanaNode(store, publicIdNode as NamedNode)\n if (nodeName) return nodeName\n return languageNameFromPublicId(publicIdNode.value)\n }\n\n if (publicIdNode?.termType === 'Literal') {\n const code = normalizeLanguageCode(publicIdNode.value)\n if (!code) return ''\n\n const ianaNode = sym(`${IANA_LANGUAGE_BASE}${code}`)\n const nodeName = languageNameFromIanaNode(store, ianaNode)\n if (nodeName) return nodeName\n return languageNameFromCode(code)\n }\n\n if (lan.termType === 'NamedNode') {\n const nodeName = languageNameFromIanaNode(store, lan as NamedNode)\n if (nodeName) return nodeName\n }\n\n return ''\n}\n\nexport function languageAsText (store: Store, lan: Node):string {\n if (lan.termType === 'Literal') return lan.value // Not normal but allow this\n\n if (lan.termType !== 'NamedNode' && lan.termType !== 'BlankNode') return ''\n\n const publicIdNode = store.any(lan as NamedNode, ns.solid('publicId')) || undefined\n return languageNameFromLanguageNode(store, lan, publicIdNode)\n}\n\nexport function presentLanguages(subject: NamedNode, store: LiveStore): LanguageDetails[] {\n const languageObjects = store.each(subject, ns.schema('knowsLanguage'))\n const expandedLists = languageObjects\n .filter((node) => isRdfListNode(store, node))\n .map((node) => expandRdfList(store, node))\n\n const longestList = expandedLists\n .sort((a, b) => b.length - a.length)[0] || []\n\n const standaloneNodes = languageObjects.filter((node) => !isRdfListNode(store, node))\n const languageNodes = [...longestList, ...standaloneNodes]\n\n const details: LanguageDetails[] = languageNodes\n .map((lan) => ({\n name: languageAsText(store, lan),\n publicId: toStoredPublicIdValue(lan, store.any(lan as NamedNode, ns.solid('publicId')) || undefined),\n proficiency: store.anyValue(lan as NamedNode, ns.schema('proficiencyLevel')) || undefined,\n entryNode: lan\n }))\n .filter((item) => Boolean(item.name))\n\n const dedupedByLanguage = new Map<string, LanguageDetails>()\n details.forEach((item) => {\n const key = item.publicId || item.name\n if (!dedupedByLanguage.has(key)) {\n dedupedByLanguage.set(key, item)\n }\n })\n\n return Array.from(dedupedByLanguage.values())\n}\n","import { LiveStore, NamedNode, Literal, Node } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { RoleDetails } from './types'\n\nconst educationMembershipType = ns.schema('EducationalOccupationalCredential')\nconst vcardOrganizationType = ns.vcard('Organization').value\nconst schemaNamespace = 'http://schema.org/'\n\nfunction localNameFromUri(uri: string): string {\n const value = (uri || '').trim()\n if (!value) return ''\n const fragmentMatch = value.match(/[#/]([^#/]+)$/)\n return fragmentMatch?.[1] || value\n}\n\nfunction nodeToDisplayText(store: LiveStore, node: Node | null | undefined, doc: NamedNode): string {\n if (!node) return ''\n if (node.termType === 'Literal') return node.value\n if (node.termType === 'NamedNode') {\n const label = store.anyJS(node as NamedNode, ns.rdfs('label'), null, doc) as string | null\n if (label) return label\n return localNameFromUri(node.value)\n }\n return ''\n}\n\nfunction roleTypeFromMembership(store: LiveStore, membership: NamedNode, doc: NamedNode): string {\n const roleTypes = store\n .each(membership, ns.rdf('type'), null, doc)\n .filter((node) => node.termType === 'NamedNode' && node.value.startsWith(ns.solid('').value))\n\n const matched = roleTypes.find((node) => {\n const local = localNameFromUri((node as NamedNode).value)\n return local === 'PastRole' || local === 'CurrentRole' || local === 'FutureRole'\n }) || roleTypes[0]\n\n return nodeToDisplayText(store, matched as Node | undefined, doc)\n}\n\nfunction organizationTypeFromNode(store: LiveStore, organization: NamedNode, doc: NamedNode): string {\n const classification = store.any(organization, ns.org('classification'), null, doc)\n const classificationText = nodeToDisplayText(store, classification as Node | null, doc)\n if (classificationText) return classificationText\n\n const organizationTypes = store\n .each(organization, ns.rdf('type'), null, doc)\n .filter((node) => node.termType === 'NamedNode')\n .filter((node) => (node as NamedNode).value !== vcardOrganizationType)\n\n const preferred = organizationTypes.find((node) => (node as NamedNode).value.startsWith(schemaNamespace)) || organizationTypes[0]\n return nodeToDisplayText(store, preferred as Node | undefined, doc)\n}\n\nfunction isEducationMembership(store: LiveStore, membership: Node, doc: NamedNode): boolean {\n return store.holds(membership as any, ns.rdf('type'), educationMembershipType, doc as any)\n}\n// Copied from CVPresenter and modified for new functionallity. \n/* Restructure for new design - notes */\n/* The design displays in reverse chronological order: removed rolesByType and \n just sort the Roles */\n/* Data */\n/* isCurrentRole: derive from no end date. Use to force behaviour of ui - enforcing an end date\n when not selected. */\n/* Dates: change to Month Year format: Leave dates as startDate and endDate, populate\n these dates by using the 1st day of the month for the month that is selected.\n Compute at render time */\n/* New Types: \n Organization type: use org:classification note on vocab it's noted that \n this is a somewhat unsettled type.\n Organization location: use org:location note: this is for a person's location inside\n an organization I'm thinking this is what we want here.\n Role description: use schema:description on the membership. Not sure if this is the best choice but what I could find.\n*/\n \nfunction getRoles(\n store: LiveStore,\n subject: NamedNode\n): RoleDetails[] {\n const roles: RoleDetails[] = []\n const deduped = new Map<string, RoleDetails>()\n const doc = subject.doc()\n const memberships = store\n .each(null, ns.org('member'), subject, doc)\n .filter((membership) => !isEducationMembership(store, membership as Node, doc))\n\n for (const membership of memberships) {\n let orgHomePage, orgNameGiven, publicIdName, roleName, publicId, orgType, orgLocation\n // Things should have start dates but we will be very lenient in this view\n const startDate = store.any(membership as NamedNode, ns.schema('startDate'), null, doc) as Literal | null\n const endDate = store.any(membership as NamedNode, ns.schema('endDate'), null, doc) as Literal | null\n const roleDescription = store.anyJS(membership as NamedNode, ns.schema('description'), null, doc) as string | null\n const isCurrentRole = !endDate\n const roleType = roleTypeFromMembership(store, membership as NamedNode, doc)\n\n const organization = store.any(membership as NamedNode, ns.org('organization'), null, doc)\n if (organization) {\n orgNameGiven = store.anyJS(organization as NamedNode, ns.schema('name'), null, doc)\n orgHomePage = store.any(organization as NamedNode, ns.schema('uri'), null, doc)\n orgType = organizationTypeFromNode(store, organization as NamedNode, doc)\n orgLocation = store.any(organization as NamedNode, ns.org('location'), null, doc)\n publicId = store.any(organization as NamedNode, ns.solid('publicId'), null, doc)\n }\n if (publicId) {\n publicIdName = store.anyJS(publicId as NamedNode, ns.schema('name'), null, doc)\n }\n const orgName = publicIdName || orgNameGiven\n\n const escoRole = store.any(membership as NamedNode, ns.org('role'), null, doc)\n if (escoRole) {\n roleName = store.anyJS(escoRole as NamedNode, ns.schema('name'), null, doc) as string | null\n }\n const roleText0 = store.anyJS(membership as NamedNode, ns.vcard('role'), null, doc)\n const title = (roleText0 && roleName) ? roleName + ' - ' + roleText0\n : roleText0 || roleName\n\n const item: RoleDetails = {\n title,\n roleType,\n entryNode: membership as Node,\n startDate: startDate as Literal,\n endDate,\n isCurrentRole,\n orgName,\n orgType,\n orgLocation,\n orgHomePage,\n description: roleDescription || undefined\n }\n\n const dedupeKey = [\n item.title || '',\n item.orgName || '',\n item.startDate?.value || '',\n item.endDate?.value || ''\n ].join('|')\n\n const existing = deduped.get(dedupeKey)\n if (!existing) {\n deduped.set(dedupeKey, item)\n continue\n }\n\n const existingIsNamed = (existing.entryNode as any).termType === 'NamedNode'\n const nextIsNamed = (item.entryNode as any).termType === 'NamedNode'\n if (!existingIsNamed && nextIsNamed) {\n deduped.set(dedupeKey, item)\n }\n }\n\n deduped.forEach((item) => roles.push(item))\n return roles\n}\n\nfunction sortRoles(roles: RoleDetails[]): RoleDetails[] {\n return roles.sort((x, y) => {\n // Current roles first\n const xIsCurrent = !x.endDate\n const yIsCurrent = !y.endDate\n if (xIsCurrent !== yIsCurrent) return xIsCurrent ? -1 : 1\n\n const xEnd = x.endDate?.value || ''\n const yEnd = y.endDate?.value || ''\n if (xEnd !== yEnd) return yEnd.localeCompare(xEnd)\n\n const xStart = x.startDate?.value || ''\n const yStart = y.startDate?.value || ''\n return yStart.localeCompare(xStart)\n })\n}\n\nexport function presentCV(\n subject: NamedNode,\n store: LiveStore\n): RoleDetails[] {\n \n const roles = getRoles(store, subject)\n // Most recent thing most relevant -> sort by end date\n const sortedRoles = sortRoles(roles)\n\n return sortedRoles\n}\n","import { LiveStore, NamedNode, Node } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { AddressDetails, ContactInfo, PointDetails } from './types'\n\n\nfunction termValue(term: any): string {\n if (!term) return ''\n if (typeof term === 'string') return term\n return term.value || ''\n}\n\nfunction isEmailValue(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n if (/^mailto:/i.test(normalized)) return true\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalized)\n}\n\nfunction isPhoneValue(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n if (/^tel:/i.test(normalized)) return true\n return /^[+()\\-\\s\\d]{5,}$/.test(normalized)\n}\n\nfunction resolvePointValueNode(\n store: LiveStore,\n entryNode: NamedNode,\n doc: NamedNode,\n kind: 'email' | 'phone'\n): Node | null {\n const expected = kind === 'email' ? isEmailValue : isPhoneValue\n\n const entryValue = termValue(entryNode)\n if (expected(entryValue)) return entryNode\n\n const inDocStatements = store.statementsMatching(entryNode, ns.vcard('value'), null, doc)\n const anyGraphStatements = store.statementsMatching(entryNode, ns.vcard('value'))\n\n for (const statement of [...inDocStatements, ...anyGraphStatements]) {\n const objectNode = statement.object as Node\n if (expected(termValue(objectNode))) {\n return objectNode\n }\n }\n\n return null\n}\n\nfunction selectEmails(subject: NamedNode, store: LiveStore): PointDetails[] {\n const emails: PointDetails[] = []\n \n const emailNodes = store.each(subject, ns.vcard('hasEmail'), null, subject.doc()) || null\n emailNodes.forEach((node) => {\n const valueNode = resolvePointValueNode(store, node as NamedNode, subject.doc(), 'email')\n if (!valueNode) return\n\n const type = store.any(node as NamedNode, ns.rdf('type'), null, subject.doc())\n emails.push({ entryNode: node, type, valueNode })\n })\n\n return emails\n}\n/* SAM need to look at this doesn't seem to be working \nalthough it was working in add-to-contacts button */\nfunction selectPhones(subject: NamedNode, store: LiveStore): PointDetails[] {\n const phoneNumbers: PointDetails[] = []\n\n const phoneNodes = store.each(subject, ns.vcard('hasTelephone'), null, subject.doc()) || null\n phoneNodes.forEach((node) => {\n const valueNode = resolvePointValueNode(store, node as NamedNode, subject.doc(), 'phone')\n if (!valueNode) return\n\n const type = store.any(node as NamedNode, ns.rdf('type'), null, subject.doc())\n phoneNumbers.push({ entryNode: node, type, valueNode })\n })\n\n return phoneNumbers\n}\n\nfunction selectAddresses(subject: NamedNode, store: LiveStore): AddressDetails[] {\n const addresses: AddressDetails[] = []\n\n const addressNodes = store.each(subject, ns.vcard('hasAddress'), null, subject.doc()) || null\n addressNodes.map((node) => {\n const streetAddress = termValue(\n store.any(node as NamedNode, ns.vcard('street-address'), null, subject.doc())\n )\n const locality = termValue(\n store.any(node as NamedNode, ns.vcard('locality'), null, subject.doc())\n )\n const region = termValue(\n store.any(node as NamedNode, ns.vcard('region'), null, subject.doc())\n )\n const postalCode = termValue(\n store.any(node as NamedNode, ns.vcard('postal-code'), null, subject.doc())\n )\n const countryName = termValue(\n store.any(node as NamedNode, ns.vcard('country-name'), null, subject.doc())\n )\n const type = store.any(node as NamedNode, ns.rdf('type'), null, subject.doc())\n\n addresses.push({\n entryNode: node,\n ...(type ? { type } : {}),\n streetAddress,\n locality,\n region,\n postalCode,\n countryName,\n })\n })\n return addresses\n}\n\nexport function presentContactInfo(subject: NamedNode, store: LiveStore): ContactInfo {\n const emails = selectEmails(subject, store)\n const phones = selectPhones(subject, store)\n const addresses = selectAddresses(subject, store)\n\n return { emails, phones, addresses }\n}\n","import { LiveStore, NamedNode, Node } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { EducationDetails } from './types'\n\nconst educationMembershipType = ns.schema('EducationalOccupationalCredential')\n\nfunction isEducationMembership(store: LiveStore, membership: Node, doc: NamedNode): boolean {\n return store.holds(membership as any, ns.rdf('type'), educationMembershipType, doc as any)\n}\n\nfunction getEducation(store: LiveStore, subject: NamedNode): EducationDetails[] {\n const education: EducationDetails[] = []\n const deduped = new Map<string, EducationDetails>()\n const doc = subject.doc()\n const memberships = store\n .each(null, ns.org('member'), subject, doc)\n .filter((membership) => isEducationMembership(store, membership as Node, doc))\n\n for (const membership of memberships) {\n const school = (store.anyJS(membership as NamedNode, ns.schema('name'), null, doc) as string | null) || ''\n const degree = (store.anyJS(membership as NamedNode, ns.schema('educationalCredentialAwarded'), null, doc) as string | null) || undefined\n const location = (store.anyJS(membership as NamedNode, ns.schema('location'), null, doc) as string | null) || undefined\n const startDate = (store.anyJS(membership as NamedNode, ns.schema('startDate'), null, doc) as string | null) || undefined\n const endDate = (store.anyJS(membership as NamedNode, ns.schema('endDate'), null, doc) as string | null) || undefined\n const description = (store.anyJS(membership as NamedNode, ns.schema('description'), null, doc) as string | null) || undefined\n\n const item: EducationDetails = {\n school,\n degree,\n location,\n startDate,\n endDate,\n description,\n entryNode: membership as Node\n }\n\n const dedupeKey = [\n item.school || '',\n item.degree || '',\n item.location || '',\n item.startDate || '',\n item.endDate || ''\n ].join('|')\n\n const existing = deduped.get(dedupeKey)\n if (!existing) {\n deduped.set(dedupeKey, item)\n continue\n }\n\n const existingIsNamed = (existing.entryNode as any).termType === 'NamedNode'\n const nextIsNamed = (item.entryNode as any).termType === 'NamedNode'\n if (!existingIsNamed && nextIsNamed) {\n deduped.set(dedupeKey, item)\n }\n }\n\n deduped.forEach((item) => education.push(item))\n return education\n}\n\nfunction sortEducation(education: EducationDetails[]): EducationDetails[] {\n return education.sort((x, y) => {\n const xIsCurrent = !x.endDate\n const yIsCurrent = !y.endDate\n if (xIsCurrent !== yIsCurrent) return xIsCurrent ? -1 : 1\n\n const xEnd = x.endDate || ''\n const yEnd = y.endDate || ''\n if (xEnd !== yEnd) return yEnd.localeCompare(xEnd)\n\n const xStart = x.startDate || ''\n const yStart = y.startDate || ''\n return yStart.localeCompare(xStart)\n })\n}\n\nexport function presentEducation(subject: NamedNode, store: LiveStore): EducationDetails[] {\n const education = getEducation(store, subject)\n return sortEducation(education)\n}\n","import { LiveStore, NamedNode, Node, sym } from 'rdflib'\nimport { ns, utils, widgets } from 'solid-ui'\nimport { ProjectDetails } from './types'\nimport { expandRdfList } from '../shared/rdfList'\n\n/* The following functions communityNodesForSubject and ensureProjectDocumentsLoaded \n and a few updates in presentProjects are generated by AI Model: GPT-5.3-Codex */\n/* Prompt: Image and business type are not displaying, could it be that I didn't load\n the document? */\nfunction communityNodesForSubject(subject: NamedNode, store: LiveStore, doc: NamedNode): Node[] {\n const inProfileDoc = store.each(subject, ns.solid('community'), null, doc) as Node[]\n const inAnyDoc = store.each(subject, ns.solid('community'), null, null) as Node[]\n const rawNodes = [...inProfileDoc, ...inAnyDoc]\n\n const expandedNodes = rawNodes.flatMap((node) => {\n const hasCollectionElements = Array.isArray((node as any)?.elements)\n const isListByTriples =\n (node.termType === 'BlankNode' || node.termType === 'NamedNode') &&\n Boolean(store.any(node as NamedNode, ns.rdf('first')))\n\n return hasCollectionElements || isListByTriples\n ? expandRdfList(store, node)\n : [node]\n })\n\n const seen = new Set<string>()\n const nodes: Node[] = []\n for (const node of expandedNodes) {\n const key = `${(node as any)?.termType || ''}:${(node as any)?.value || ''}`\n if (seen.has(key)) continue\n seen.add(key)\n nodes.push(node)\n }\n return nodes\n}\n\nfunction clearStaleRequestedState(fetcher: any, docUrl: string): unknown {\n const requested = fetcher?.requested\n if (!requested || typeof requested !== 'object') return undefined\n\n const previous = requested[docUrl]\n const shouldClear =\n (typeof previous === 'string' && previous !== 'requested' && previous !== 'done') ||\n (typeof previous === 'number' && previous >= 400)\n\n if (shouldClear) {\n delete requested[docUrl]\n }\n\n return previous\n}\n\nfunction linkedProjectNodeFromCommunityNode(node: Node, store: LiveStore): NamedNode | null {\n if (!node) return null\n if (node.termType === 'NamedNode') return node as NamedNode\n if (node.termType === 'Literal') {\n try {\n return sym(node.value)\n } catch {\n return null\n }\n }\n if (node.termType !== 'BlankNode') return null\n\n const candidatePredicates = [\n ns.solid('publicId'),\n ns.schema('url'),\n ns.foaf('homepage'),\n ns.rdfs('seeAlso'),\n ns.schema('sameAs'),\n ns.schema('mainEntityOfPage')\n ]\n\n for (const predicate of candidatePredicates) {\n const linked = store.any(node as NamedNode, predicate) as Node | null\n if (!linked?.value) continue\n\n if (linked.termType === 'NamedNode') {\n return linked as NamedNode\n }\n\n if (linked.termType === 'Literal') {\n try {\n return sym(linked.value)\n } catch {\n // Keep trying the next predicate.\n }\n }\n }\n\n const outgoing = store.statementsMatching(node as NamedNode, null, null, null)\n const firstNamedNode = outgoing.find((statement) => statement.object.termType === 'NamedNode')\n if (firstNamedNode?.object?.value) {\n return firstNamedNode.object as NamedNode\n }\n\n return null\n}\n\nexport async function ensureProjectDocumentsLoaded(subject: NamedNode, store: LiveStore): Promise<void> {\n const profileDoc = subject.doc()\n const fetcher = (store as any)?.fetcher\n\n if (!fetcher || typeof fetcher.load !== 'function') {\n return\n }\n\n const communityNodes = communityNodesForSubject(subject, store, profileDoc)\n\n const docsToLoad = new Map<string, NamedNode>()\n for (const node of communityNodes) {\n const linkedProjectNode = linkedProjectNodeFromCommunityNode(node, store)\n if (!linkedProjectNode) continue\n const projectDoc = linkedProjectNode.doc()\n docsToLoad.set(projectDoc.value, projectDoc)\n }\n\n if (!docsToLoad.size) {\n return\n }\n\n await Promise.all(\n Array.from(docsToLoad.values()).map(async (doc) => {\n const previousRequested = clearStaleRequestedState(fetcher, doc.value)\n try {\n void previousRequested\n await fetcher.load(doc)\n } catch {\n // Ignore individual project doc load failures so one bad doc doesn't block others.\n }\n })\n )\n}\n\nfunction projectNodeToUrl(node: Node): string {\n if (!node) return ''\n if ((node as any).termType === 'NamedNode') return (node as any).value || ''\n if ((node as any).termType === 'Literal') return (node as any).value || ''\n return ''\n}\n\nfunction normalizeUrlKey(value: string): string {\n const text = (value || '').trim()\n if (!text) return ''\n try {\n return new URL(text).href\n } catch {\n return text\n }\n}\n\nfunction toProjectNamedNode(node: Node, url: string): NamedNode | null {\n if (node && node.termType === 'NamedNode') return node as NamedNode\n try {\n return sym(url)\n } catch {\n return null\n }\n}\n\nexport async function presentProjects(subject: NamedNode, store: LiveStore): Promise<ProjectDetails[]> {\n await ensureProjectDocumentsLoaded(subject, store)\n\n const doc = subject.doc()\n const seen = new Set<string>()\n const communityNodes = communityNodesForSubject(subject, store, doc)\n\n const projects = communityNodes\n .map((communityNode) => {\n const linkedProjectNode = linkedProjectNodeFromCommunityNode(communityNode as Node, store)\n const url = linkedProjectNode?.value || projectNodeToUrl(communityNode as Node)\n const key = normalizeUrlKey(url)\n const projectNode = linkedProjectNode || toProjectNamedNode(communityNode as Node, url)\n const projectDoc = projectNode?.doc()\n\n const name = projectNode\n ? store.anyValue(projectNode, ns.foaf('name'), null, projectDoc || null) || undefined\n : undefined\n const orgName = projectNode\n ? store.anyValue(projectNode, ns.vcard('organization-name'), null, projectDoc || null) || undefined\n : undefined\n\n const title = name || (projectNode ? utils.label(projectNode) : utils.label(key))\n const imageUrl = projectNode\n ? widgets.findImage(projectNode) ||\n ((widgets as any).findImageFromURI?.(projectNode) ?? undefined)\n : undefined\n let types: NamedNode[] = []\n if (projectNode) {\n types = store.each(projectNode, ns.rdf('type'), null, projectDoc || null) as NamedNode[]\n }\n\n const category = types.find(\n (t) =>\n t.termType === 'NamedNode' &&\n (t.value === ns.schema('Project').value || t.value === ns.schema('Community').value)\n )\n\n const categoryValue: ProjectDetails['category'] =\n category?.value === ns.schema('Project').value\n ? 'project'\n : category?.value === ns.schema('Community').value\n ? 'community'\n : 'unknown'\n\n if (!url || !key || seen.has(key)) {\n return null\n }\n\n seen.add(key)\n\n return {\n url,\n title,\n name,\n orgName,\n imageUrl,\n category: categoryValue,\n entryNode: communityNode as Node\n } as ProjectDetails\n })\n .filter((project): project is ProjectDetails => Boolean(project))\n\n return projects\n}\n","\n/* Copied from presenter and modified for new functionallity */\nimport { NamedNode, Node, LiveStore } from 'rdflib'\nimport { utils, ns, widgets } from 'solid-ui'\nimport type { AddressDetails, PointDetails } from '../contactInfo/types'\nimport type { ProfileDetails } from './types'\n\nfunction termValue(term: unknown): string {\n if (!term) return ''\n if (typeof term === 'string') return term\n if (typeof term === 'object' && 'value' in (term as Record<string, unknown>)) {\n const value = (term as { value?: unknown }).value\n return typeof value === 'string' ? value : ''\n }\n return ''\n}\n\nfunction isEmailValue(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n if (/^mailto:/i.test(normalized)) return true\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalized)\n}\n\nfunction isPhoneValue(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n if (/^tel:/i.test(normalized)) return true\n return /^[+()\\-\\s\\d]{5,}$/.test(normalized)\n}\n\nfunction resolvePointValueNode(\n store: LiveStore,\n entryNode: Node | undefined,\n doc: NamedNode,\n kind: 'email' | 'phone'\n): Node | undefined {\n if (!entryNode) return undefined\n\n const expected = kind === 'email' ? isEmailValue : isPhoneValue\n\n const entryValue = termValue(entryNode)\n if (expected(entryValue)) return entryNode\n\n if ((entryNode as { termType?: string }).termType !== 'NamedNode') return undefined\n const inDocStatements = store.statementsMatching(entryNode as NamedNode, ns.vcard('value'), null, doc)\n const anyGraphStatements = store.statementsMatching(entryNode as NamedNode, ns.vcard('value'))\n\n for (const statement of [...inDocStatements, ...anyGraphStatements]) {\n if (expected(termValue(statement.object))) {\n return statement.object as Node\n }\n }\n\n return undefined\n}\n\nfunction resolvePointType(store: LiveStore, entryNode: Node, doc: NamedNode): Node | undefined {\n if ((entryNode as { termType?: string }).termType !== 'NamedNode') return undefined\n const inDocStatements = store.statementsMatching(entryNode as NamedNode, ns.rdf('type'), null, doc)\n if (inDocStatements.length > 0) return inDocStatements[0].object as Node\n\n const anyGraphStatements = store.statementsMatching(entryNode as NamedNode, ns.rdf('type'))\n if (anyGraphStatements.length > 0) return anyGraphStatements[0].object as Node\n\n return undefined\n}\n\n/* The following helpers were generated by AI Model: GPT-5.3-Codex. */\n/* Prompt: In header selectors select phone and email work type if it exists\n otherwise pick any. */\nfunction isWorkTypeTerm(term: Node | undefined): boolean {\n const value = termValue(term).trim().toLowerCase()\n if (!value) return false\n return value === 'work' || value.endsWith('#work') || value.endsWith('/work')\n}\n\nfunction hasWorkType(store: LiveStore, entryNode: Node, doc: NamedNode): boolean {\n if ((entryNode as { termType?: string }).termType !== 'NamedNode') return false\n const inDocStatements = store.statementsMatching(entryNode as NamedNode, ns.rdf('type'), null, doc)\n const anyGraphStatements = store.statementsMatching(entryNode as NamedNode, ns.rdf('type'))\n\n return [...inDocStatements, ...anyGraphStatements].some((statement) =>\n isWorkTypeTerm(statement.object as Node)\n )\n}\n\nfunction selectPrimaryPoint(\n store: LiveStore,\n subject: NamedNode,\n predicate: NamedNode,\n doc: NamedNode,\n kind: 'email' | 'phone',\n fallbackType: Node\n): PointDetails | undefined {\n const inDocStatements = store.statementsMatching(subject, predicate, null, doc)\n const anyGraphStatements = store.statementsMatching(subject, predicate)\n const nodes = [...inDocStatements, ...anyGraphStatements].map((statement) => statement.object as Node)\n const candidates: PointDetails[] = []\n\n const seen = new Set<string>()\n for (const entryNode of nodes) {\n const key = termValue(entryNode)\n if (key && seen.has(key)) continue\n if (key) seen.add(key)\n\n const valueNode = resolvePointValueNode(store, entryNode, doc, kind)\n if (!valueNode) continue\n\n const type = resolvePointType(store, entryNode, doc) || fallbackType\n candidates.push({ entryNode, type, valueNode })\n }\n\n const workCandidate = candidates.find((candidate) =>\n hasWorkType(store, candidate.entryNode, doc) || isWorkTypeTerm(candidate.type)\n )\n if (workCandidate) return workCandidate\n\n if (candidates.length > 0) return candidates[0]\n\n return undefined\n}\n\n\nexport function pronounsAsText (store: LiveStore, subject:NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation(countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nexport const presentProfile = (\n subject: NamedNode,\n store: LiveStore\n): ProfileDetails => {\n const name = utils.label(subject)\n // on contact-pane form it is foaf, but maybe another app saves with vcard.\n const nickname = store.anyValue(subject, ns.vcard('nickname')) || store.anyValue(subject, ns.foaf('nick')) || undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined // @@ Search whole store\n const doc = subject.doc()\n\n // Contact info - we will only show one of each type here\n // Just doing for now, but we should change to either store a primary\n // indicator or store it a bit differently in the store.\n const primaryPhone = selectPrimaryPoint(store, subject, ns.vcard('hasTelephone'), doc, 'phone', ns.vcard('Voice'))\n\n const primaryEmail = selectPrimaryPoint(store, subject, ns.vcard('hasEmail'), doc, 'email', ns.vcard('Internet'))\n\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as Node || undefined\n const primaryAddressType = primaryAddressEntryNode\n ? (store.any(primaryAddressEntryNode as NamedNode, ns.rdf('type')) as Node || undefined)\n : undefined\n const primaryStreetAddress = primaryAddressEntryNode\n ? (store.anyValue(primaryAddressEntryNode as NamedNode, ns.vcard('street-address')) || undefined)\n : undefined\n const primaryLocality = primaryAddressEntryNode\n ? (store.anyValue(primaryAddressEntryNode as NamedNode, ns.vcard('locality')) || undefined)\n : undefined\n const primaryRegion = primaryAddressEntryNode\n ? (store.anyValue(primaryAddressEntryNode as NamedNode, ns.vcard('region')) || undefined)\n : undefined\n const primaryPostalCode = primaryAddressEntryNode\n ? (store.anyValue(primaryAddressEntryNode as NamedNode, ns.vcard('postal-code')) || undefined)\n : undefined\n const primaryCountryName = primaryAddressEntryNode\n ? (store.anyValue(primaryAddressEntryNode as NamedNode, ns.vcard('country-name')) || undefined)\n : undefined\n const primaryAddress: AddressDetails | undefined = primaryAddressEntryNode\n ? {\n entryNode: primaryAddressEntryNode,\n type: primaryAddressType,\n streetAddress: primaryStreetAddress,\n locality: primaryLocality,\n region: primaryRegion,\n postalCode: primaryPostalCode,\n countryName: primaryCountryName\n }\n : undefined\n\n const address: Node | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address as NamedNode, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address as NamedNode, ns.vcard('locality'))\n : null\n\n \n const pronouns = pronounsAsText(store, subject)\n\n return {\n name,\n nickname,\n imageSrc,\n dateOfBirth,\n jobTitle,\n orgName,\n primaryPhone,\n primaryEmail,\n primaryAddress,\n location: formatLocation(countryName, locality),\n pronouns,\n entryNode: subject\n }\n}\n","import { NamedNode, LiveStore } from 'rdflib'\nimport { ContactInfo } from './sections/contactInfo/types'\nimport { presentSocial } from './sections/social/selectors'\nimport { SocialPresentation } from './sections/social/types'\nimport { presentSkillDetails } from './sections/skills/selectors'\nimport { SkillDetails } from './sections/skills/types'\nimport { presentLanguages } from './sections/languages/selectors'\nimport { LanguageDetails } from './sections/languages/types'\nimport { presentCV } from './sections/resume/selectors'\nimport { RoleDetails } from './sections/resume/types'\nimport { presentContactInfo } from './sections/contactInfo/selectors'\nimport { EducationDetails } from './sections/education/types'\nimport { presentEducation } from './sections/education/selectors'\nimport { ProjectDetails } from './sections/projects/types'\nimport { presentProjects } from './sections/projects/selectors'\nimport { presentProfile } from './sections/heading/selectors'\nimport { ProfileDetails } from './sections/heading/types'\nimport { BioDetails } from './sections/bio/types'\nimport { presentBio } from './sections/bio/selectors'\n\nexport type ProfileViewModel = {\n profileDetails: ProfileDetails,\n contactInfo: ContactInfo,\n skills: SkillDetails[],\n languages: LanguageDetails[], \n education: EducationDetails[],\n projects: ProjectDetails[],\n bioDetails: BioDetails,\n social: SocialPresentation,\n cvDetails: RoleDetails[]\n}\n\nexport async function presentProfileViewModel(subject: NamedNode, store: LiveStore): Promise<ProfileViewModel> {\n const profileDetails = presentProfile(subject, store)\n const contactInfo = presentContactInfo(subject, store)\n const skills = presentSkillDetails(subject, store)\n const languages = presentLanguages(subject, store)\n const education = presentEducation(subject, store)\n const projects = await presentProjects(subject, store)\n const bioDetails = presentBio(subject, store)\n const social = presentSocial(subject, store)\n const cvDetails = presentCV(subject, store)\n\n return { \n profileDetails,\n social,\n contactInfo,\n skills, \n languages,\n education,\n projects,\n bioDetails,\n cvDetails\n }\n}","import { ns} from 'solid-ui'\nimport type { BioDetails } from './types'\nimport { LiveStore, NamedNode } from 'rdflib'\n\n\nexport const presentBio = (\n subject: NamedNode,\n store: LiveStore\n): BioDetails => {\n\n const description = store.anyJS(subject, ns.vcard('note'))\n\n return {\n description,\n entryNode: subject\n }\n}\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./dialog.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./dialog.css\";\n export default content && content.locals ? content.locals : undefined;\n","import '../styles/dialog.css'\nimport { render } from 'lit-html'\nimport { closeIcon } from '../icons-svg/profileIcons'\n\n/* Copied from issue-pane, minor typescript adjustments */\n/* Changed modal from div to dialog element */\nlet modalDialog: HTMLDialogElement | null = null\nlet previousFocus: Element | null = null\n\ntype DialogButtonValue = boolean | 'save' | null\ntype DialogButton = {\n label: string,\n value: DialogButtonValue,\n primary?: boolean,\n cancel?: boolean,\n beforeClose?: () => Promise<boolean> | boolean\n}\n\ntype DialogHeaderAction =\n | { type: 'close' }\n | { type: 'none' }\n | {\n type: 'button',\n label: string,\n ariaLabel?: string,\n className?: string,\n onClick?: () => Promise<void> | void\n }\n\ntype DialogElements = {\n dialog: HTMLDialogElement,\n title: HTMLHeadingElement,\n headerAction: HTMLDivElement,\n description: HTMLDivElement,\n error: HTMLElement,\n buttons: HTMLDivElement\n}\n\nfunction ensureModalDialog (dom: Document): HTMLDialogElement {\n // if we previously created a dialog but it was removed from the document\n // (tests clear body), rebuild it. Checking presence ensures our reference\n // doesn't point at a detached element.\n if (modalDialog && dom.body.contains(modalDialog)) return modalDialog\n\n modalDialog = null\n modalDialog = dom.createElement('dialog')\n modalDialog.id = 'profile-modal'\n modalDialog.setAttribute('aria-modal', 'true')\n modalDialog.setAttribute('aria-labelledby', 'modal-title')\n modalDialog.setAttribute('aria-describedby', 'modal-desc')\n\n modalDialog.innerHTML = `\n <div class=\"modal\">\n <div class=\"modal-header\">\n <h2 id=\"modal-title\"></h2>\n <div id=\"modal-header-action\"></div>\n </div>\n <div id=\"modal-desc\"></div>\n <section id=\"modal-error\" class=\"modal__error-section\" aria-live=\"assertive\" role=\"alert\" hidden></section>\n <div id=\"modal-buttons\"></div>\n </div>\n `\n\n dom.body.appendChild(modalDialog)\n return modalDialog\n}\n\nfunction getDialogElements (dialog: HTMLDialogElement): DialogElements {\n return {\n dialog,\n title: dialog.querySelector('#modal-title') as HTMLHeadingElement,\n headerAction: dialog.querySelector('#modal-header-action') as HTMLDivElement,\n description: dialog.querySelector('#modal-desc') as HTMLDivElement,\n error: dialog.querySelector('#modal-error') as HTMLElement,\n buttons: dialog.querySelector('#modal-buttons') as HTMLDivElement\n }\n}\n\nfunction clearModalError(elements: DialogElements): void {\n elements.error.textContent = ''\n elements.error.hidden = true\n}\n\nfunction setModalError(elements: DialogElements, message: string): void {\n elements.error.textContent = message\n elements.error.hidden = false\n}\n\nfunction openDialogElement (dialog: HTMLDialogElement): void {\n if (typeof dialog.showModal === 'function') {\n try {\n if (!dialog.open) dialog.showModal()\n return\n } catch {\n // Fall back for jsdom or partial dialog implementations.\n }\n }\n\n dialog.setAttribute('open', '')\n}\n\nfunction closeDialogElement (dialog: HTMLDialogElement): void {\n if (typeof dialog.close === 'function' && dialog.open) {\n dialog.close()\n return\n }\n\n dialog.removeAttribute('open')\n}\n\nfunction findInitialContentFocusTarget(container: ParentNode): HTMLElement | null {\n const focusable = Array.from(\n container.querySelectorAll('input, select, textarea, [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])')\n ) as HTMLElement[]\n\n for (const el of focusable) {\n const isDisabled = el.hasAttribute('disabled') || el.getAttribute('aria-disabled') === 'true'\n const hiddenByAttr = el.hasAttribute('hidden') || el.getAttribute('aria-hidden') === 'true'\n if (!isDisabled && !hiddenByAttr) return el\n }\n\n return null\n}\n\nfunction focusInitialDialogTarget (description: HTMLDivElement, buttons: HTMLDivElement): void {\n const initialInput = findInitialContentFocusTarget(description)\n if (initialInput) {\n initialInput.focus()\n if (initialInput instanceof HTMLInputElement || initialInput instanceof HTMLTextAreaElement) {\n initialInput.select()\n }\n return\n }\n\n const firstButton = buttons.querySelector('button') as HTMLButtonElement | null\n if (firstButton) firstButton.focus()\n}\n\nfunction collectFormValues (form: HTMLFormElement): InputDialogValues {\n const data = new FormData(form)\n const values: InputDialogValues = {}\n data.forEach((value, key) => {\n values[key] = String(value)\n })\n return values\n}\n\nfunction openModal ({\n title,\n message,\n buttons,\n headerAction,\n dom\n}: {\n title?: string,\n message?: string | Node,\n buttons: DialogButton[],\n headerAction?: DialogHeaderAction,\n dom: Document\n}) {\n const dialog = ensureModalDialog(dom)\n const elements = getDialogElements(dialog)\n\n previousFocus = dom.activeElement\n openDialogElement(dialog)\n\n elements.title.textContent = title || ''\n elements.description.innerHTML = ''\n if (typeof message === 'string') {\n elements.description.textContent = message\n } else {\n elements.description.appendChild(message)\n }\n\n elements.buttons.innerHTML = ''\n clearModalError(elements)\n\n return new Promise<DialogButtonValue>((resolve) => {\n const finish = (value: DialogButtonValue) => {\n closeModal(value)\n resolve(value)\n }\n\n const requestCancel = () => {\n const cancelBtn = dialog.querySelector('button[data-cancel]') as HTMLButtonElement | null\n if (cancelBtn) {\n cancelBtn.click()\n return\n }\n\n finish(false)\n }\n\n dialog.oncancel = (event: Event) => {\n event.preventDefault()\n requestCancel()\n }\n\n elements.headerAction.innerHTML = ''\n const resolvedHeaderAction = headerAction || { type: 'close' as const }\n if (resolvedHeaderAction.type === 'close') {\n const closeButton = dom.createElement('button')\n closeButton.setAttribute('type', 'button')\n closeButton.setAttribute('aria-label', 'Close dialog')\n render(closeIcon, closeButton)\n closeButton.onclick = () => requestCancel()\n elements.headerAction.appendChild(closeButton)\n } else if (resolvedHeaderAction.type === 'button') {\n const actionButton = dom.createElement('button')\n actionButton.setAttribute('type', 'button')\n actionButton.className = resolvedHeaderAction.className || 'modal__header-action-button profile__action-button profile-action-text flex-center'\n actionButton.textContent = resolvedHeaderAction.label\n actionButton.setAttribute('aria-label', resolvedHeaderAction.ariaLabel || resolvedHeaderAction.label)\n actionButton.onclick = async () => {\n if (resolvedHeaderAction.onClick) {\n await resolvedHeaderAction.onClick()\n }\n }\n elements.headerAction.appendChild(actionButton)\n }\n\n buttons.forEach((btn) => {\n const b = dom.createElement('button')\n b.setAttribute('type', 'button')\n b.textContent = btn.label\n if (btn.primary) b.classList.add('btn-primary')\n if (btn.cancel) {\n b.classList.add('btn-light')\n b.setAttribute('data-cancel', 'true')\n }\n b.addEventListener('click', async () => {\n if (btn.beforeClose) {\n const shouldClose = await btn.beforeClose()\n if (!shouldClose) return\n }\n finish(btn.value)\n })\n elements.buttons.appendChild(b)\n })\n\n focusInitialDialogTarget(elements.description, elements.buttons)\n })\n}\n\nfunction closeModal (_result: DialogButtonValue): void {\n if (modalDialog) {\n closeDialogElement(modalDialog)\n modalDialog.oncancel = null\n const headerActionButton = modalDialog.querySelector('#modal-header-action button') as HTMLButtonElement | null\n if (headerActionButton) headerActionButton.onclick = null\n if (previousFocus && 'focus' in previousFocus) (previousFocus as HTMLElement).focus()\n }\n}\n\nexport function alertDialog (message: string, title = 'Information', dom: Document) {\n return openModal({\n title,\n message,\n buttons: [{ label: 'OK', value: true, primary: true }],\n dom\n })\n}\n\ntype OpenInputDialogCustom = {\n title: string,\n dom: Document,\n form: HTMLFormElement,\n submitLabel?: string,\n cancelLabel?: string,\n headerAction?: DialogHeaderAction,\n validate?: () => Promise<string | null> | string | null,\n onSave?: () => Promise<void> | void,\n formatSaveError?: (error: unknown) => string\n}\n\ntype InputDialogValues = Record<string, string>\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: write me a reusable function to open a dialog with a form and return the form values on submit. \nThe function should also support validation and display error messages in the dialog. \nIt should reuse the OpenModal function for consistency. Done in 2 passes */\nexport function openInputDialog (options: OpenInputDialogCustom): Promise<InputDialogValues | null> {\n const submitLabel = options.submitLabel || 'Save Changes'\n const cancelLabel = options.cancelLabel || 'Cancel'\n const dialog = ensureModalDialog(options.dom)\n const elements = getDialogElements(dialog)\n const submitProxy = options.dom.createElement('button')\n submitProxy.type = 'submit'\n submitProxy.hidden = true\n submitProxy.tabIndex = -1\n options.form.appendChild(submitProxy)\n\n const handleSubmit = (event: SubmitEvent) => {\n event.preventDefault()\n const saveButton = dialog.querySelector('#modal-buttons .btn-primary') as HTMLButtonElement | null\n saveButton?.click()\n }\n\n options.form.addEventListener('submit', handleSubmit)\n\n return openModal({\n title: options.title,\n message: options.form,\n headerAction: options.headerAction,\n buttons: [\n { label: cancelLabel, value: null, cancel: true },\n {\n label: submitLabel,\n value: 'save',\n primary: true,\n beforeClose: async () => {\n clearModalError(elements)\n\n if (options.validate) {\n const validationMessage = await options.validate()\n if (validationMessage) {\n setModalError(elements, validationMessage)\n return false\n }\n }\n\n if (!options.onSave) return true\n\n try {\n await options.onSave()\n return true\n } catch (error) {\n const fallback = error instanceof Error ? error.message : String(error)\n const message = options.formatSaveError ? options.formatSaveError(error) : fallback\n setModalError(elements, message)\n return false\n }\n }\n }\n ],\n dom: options.dom\n })\n .then((result) => {\n if (result !== 'save') return null\n return collectFormValues(options.form)\n })\n .finally(() => {\n options.form.removeEventListener('submit', handleSubmit)\n submitProxy.remove()\n })\n}\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./EditDialogs.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./EditDialogs.css\";\n export default content && content.locals ? content.locals : undefined;\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ContactInfoEditDialog.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ContactInfoEditDialog.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { LiveStore, NamedNode, Node, st } from 'rdflib'\nimport { fallbackSaveUpdatesErrorMessageText, updaterUnsupportedStoreErrorMessageText } from '../../texts'\n\nfunction normalizeNodeId(value: string): string {\n return value.startsWith('_:') ? value.slice(2) : value\n}\n\nexport function applyUpdaterPatch(store: LiveStore, deletions: any[], insertions: any[]) {\n if (!store.updater) {\n throw new Error(updaterUnsupportedStoreErrorMessageText)\n }\n\n const safeDeletions = (deletions || []).filter((statement: any) => {\n if (!statement || !statement.subject || !statement.predicate || !statement.object) return false\n const graph = statement.why\n return store.holds(statement.subject, statement.predicate, statement.object, graph)\n })\n\n const safeInsertions = (insertions || []).filter((statement: any) => {\n return Boolean(statement && statement.subject && statement.predicate && statement.object)\n })\n\n if (safeDeletions.length === 0 && safeInsertions.length === 0) {\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve, reject) => {\n try {\n ;(store.updater as any).update(\n safeDeletions as any,\n safeInsertions as any,\n (_uri: string, ok: boolean, message?: string) => {\n if (ok === true) {\n resolve()\n return\n }\n reject(new Error(message || fallbackSaveUpdatesErrorMessageText))\n }\n )\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n })\n}\n\nexport function collectNodeStatements(store: LiveStore, node: Node, doc: NamedNode) {\n return store.statementsMatching(node as any, null, null, doc as any)\n}\n\nexport function collectLinkStatements(\n store: LiveStore,\n subject: NamedNode,\n predicate: NamedNode,\n node: Node,\n doc: NamedNode\n) {\n return store.statementsMatching(subject, predicate, node as any, doc)\n}\n\n/* The following helper was generated by AI Model: GPT-5.3-Codex.\n Prompt: 'do you see anything I can do differently in the mutation code so that it's not so verbose and possible reusable accross sections' */\nexport function replacePredicateStatements(\n store: LiveStore,\n subject: NamedNode,\n predicate: NamedNode,\n doc: NamedNode,\n deletions: any[],\n insertions: any[],\n nextObject?: Node | null\n) {\n deletions.push(...store.statementsMatching(subject, predicate, null, doc))\n if (nextObject) {\n insertions.push(st(subject, predicate, nextObject as any, doc))\n }\n}\n\n/* The following helper was generated by AI Model: GPT-5.3-Codex.\n Prompt: 'do you see anything I can do differently in the mutation code so that it's not so verbose and possible reusable accross sections' */\nexport function collectLinkedNodeStatements(\n store: LiveStore,\n sourceNode: Node,\n predicate: NamedNode,\n doc: NamedNode\n) {\n const linkedNodes = store.each(sourceNode as any, predicate, null, doc) as Node[]\n const linkedStatements = linkedNodes.flatMap((linkedNode) => collectNodeStatements(store, linkedNode, doc))\n const linkStatements = store.statementsMatching(sourceNode as any, predicate, null, doc)\n\n return {\n linkedNodes,\n linkedStatements,\n linkStatements\n }\n}\n\nexport function findExistingNode(nodes: Node[], entryNode: string) {\n const normalizedEntryNode = normalizeNodeId(entryNode)\n return nodes.find((node) => {\n const nodeValue = normalizeNodeId(node.value)\n if (nodeValue === normalizedEntryNode) return true\n return node.value === entryNode\n })\n}\n","import { NamedNode, sym } from 'rdflib'\n\nlet lastIssuedTimestamp = 0\n\nexport function createIdNode(doc: NamedNode): NamedNode {\n const now = Date.now()\n const timestampId = now > lastIssuedTimestamp ? now : lastIssuedTimestamp + 1\n lastIssuedTimestamp = timestampId\n return sym(`${doc.uri}#id${timestampId}`) as NamedNode\n}\n","import { LiveStore, NamedNode, Node, st, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { ContactAddressRow, ContactMutationPlan, ContactPointRow } from './types'\nimport { MutationOps } from '../shared/types'\nimport { applyUpdaterPatch, collectLinkedNodeStatements, collectNodeStatements, findExistingNode } from '../shared/rdfMutationHelpers'\nimport { createIdNode } from '../shared/idNodeFactory'\nimport { mutationSaveContactInfoFailedPrefixText } from '../../texts'\n\nfunction buildPhoneStatements(subject: NamedNode, doc: NamedNode, node: Node, phone: ContactPointRow) {\n const normalizedValue = phone.value.startsWith('tel:') ? phone.value : `tel:${phone.value}`\n const valueNode = sym(normalizedValue)\n const inserts = [\n st(subject, ns.vcard('hasTelephone'), node as any, doc),\n st(node as any, ns.vcard('value'), valueNode as any, doc)\n ]\n\n if (phone.type) {\n inserts.push(st(node as any, ns.rdf('type'), ns.vcard(phone.type), doc))\n }\n\n return inserts\n}\n\nfunction buildEmailStatements(subject: NamedNode, doc: NamedNode, node: Node, email: ContactPointRow) {\n const normalizedValue = email.value.startsWith('mailto:') ? email.value : `mailto:${email.value}`\n const valueNode = sym(normalizedValue)\n const inserts = [\n st(subject, ns.vcard('hasEmail'), node as any, doc),\n st(node as any, ns.vcard('value'), valueNode as any, doc)\n ]\n\n if (email.type) {\n inserts.push(st(node as any, ns.rdf('type'), ns.vcard(email.type), doc))\n }\n\n return inserts\n}\n\nfunction buildAddressStatements(subject: NamedNode, doc: NamedNode, node: Node, address: ContactAddressRow) {\n const inserts = [st(subject, ns.vcard('hasAddress'), node as any, doc)]\n\n if (address.type) inserts.push(st(node as any, ns.rdf('type'), ns.vcard(address.type), doc))\n if (address.streetAddress) inserts.push(st(node as any, ns.vcard('street-address'), address.streetAddress as any, doc))\n if (address.locality) inserts.push(st(node as any, ns.vcard('locality'), address.locality as any, doc))\n if (address.region) inserts.push(st(node as any, ns.vcard('region'), address.region as any, doc))\n if (address.postalCode) inserts.push(st(node as any, ns.vcard('postal-code'), address.postalCode as any, doc))\n if (address.countryName) inserts.push(st(node as any, ns.vcard('country-name'), address.countryName as any, doc))\n\n return inserts\n}\n\nasync function mutatePhoneEntries(store: LiveStore, subject: NamedNode, phoneOps: MutationOps<ContactPointRow>) {\n const doc = subject.doc()\n const existingPhoneNodes = store.each(subject, ns.vcard('hasTelephone'), null, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n phoneOps.remove.forEach((phone) => {\n if (!phone.entryNode) return\n const existingNode = findExistingNode(existingPhoneNodes, phone.entryNode)\n if (existingNode) {\n const linkedPhoneStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasTelephone'), doc)\n const matchingLinkStatement = linkedPhoneStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n })\n\n phoneOps.update.forEach((phone) => {\n if (!phone.entryNode) return\n const existingNode = findExistingNode(existingPhoneNodes, phone.entryNode)\n if (!existingNode) {\n insertions.push(...buildPhoneStatements(subject, doc, createIdNode(doc), phone))\n return\n }\n const linkedPhoneStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasTelephone'), doc)\n const matchingLinkStatement = linkedPhoneStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n insertions.push(...buildPhoneStatements(subject, doc, existingNode, phone))\n })\n\n phoneOps.create.forEach((phone) => {\n insertions.push(...buildPhoneStatements(subject, doc, createIdNode(doc), phone))\n })\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nasync function mutateEmailEntries(store: LiveStore, subject: NamedNode, emailOps: MutationOps<ContactPointRow>) {\n const doc = subject.doc()\n const existingEmailNodes = store.each(subject, ns.vcard('hasEmail'), null, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n emailOps.remove.forEach((email) => {\n if (!email.entryNode) return\n const existingNode = findExistingNode(existingEmailNodes, email.entryNode)\n if (existingNode) {\n const linkedEmailStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasEmail'), doc)\n const matchingLinkStatement = linkedEmailStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n })\n\n emailOps.update.forEach((email) => {\n if (!email.entryNode) return\n const existingNode = findExistingNode(existingEmailNodes, email.entryNode)\n if (!existingNode) {\n insertions.push(...buildEmailStatements(subject, doc, createIdNode(doc), email))\n return\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n insertions.push(...buildEmailStatements(subject, doc, existingNode, email))\n })\n\n emailOps.create.forEach((email) => {\n insertions.push(...buildEmailStatements(subject, doc, createIdNode(doc), email))\n })\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nasync function mutateAddressEntries(store: LiveStore, subject: NamedNode, addressOps: MutationOps<ContactAddressRow>) {\n const doc = subject.doc()\n const existingAddressNodes = store.each(subject, ns.vcard('hasAddress'), null, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n addressOps.remove.forEach((address) => {\n if (!address.entryNode) return\n const existingNode = findExistingNode(existingAddressNodes, address.entryNode)\n if (existingNode) {\n const linkedAddressStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasAddress'), doc)\n const matchingLinkStatement = linkedAddressStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n })\n\n addressOps.update.forEach((address) => {\n if (!address.entryNode) return\n const existingNode = findExistingNode(existingAddressNodes, address.entryNode)\n if (!existingNode) {\n insertions.push(...buildAddressStatements(subject, doc, createIdNode(doc), address))\n return\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n insertions.push(...buildAddressStatements(subject, doc, existingNode, address))\n })\n\n addressOps.create.forEach((address) => {\n insertions.push(...buildAddressStatements(subject, doc, createIdNode(doc), address))\n })\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nexport async function processContactInfoMutations(store: LiveStore, subject: NamedNode, mutationPlan: ContactMutationPlan) {\n try {\n await mutatePhoneEntries(store, subject, mutationPlan.phoneOps)\n await mutateEmailEntries(store, subject, mutationPlan.emailOps)\n await mutateAddressEntries(store, subject, mutationPlan.addressOps)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${mutationSaveContactInfoFailedPrefixText} ${message}`)\n }\n} \n","export type CountryDialOption = {\n iso2: string\n dialCode: string\n name: string\n}\n\nexport const DEFAULT_DIAL_CODE = '+1'\n\nexport const COUNTRY_DIAL_OPTIONS: CountryDialOption[] = [\n { iso2: 'EG', dialCode: '+20', name: 'Egypt' },\n { iso2: 'ZA', dialCode: '+27', name: 'South Africa' },\n { iso2: 'GR', dialCode: '+30', name: 'Greece' },\n { iso2: 'NL', dialCode: '+31', name: 'Netherlands' },\n { iso2: 'BE', dialCode: '+32', name: 'Belgium' },\n { iso2: 'FR', dialCode: '+33', name: 'France' },\n { iso2: 'ES', dialCode: '+34', name: 'Spain' },\n { iso2: 'HU', dialCode: '+36', name: 'Hungary' },\n { iso2: 'IT', dialCode: '+39', name: 'Italy' },\n { iso2: 'RO', dialCode: '+40', name: 'Romania' },\n { iso2: 'CH', dialCode: '+41', name: 'Switzerland' },\n { iso2: 'AT', dialCode: '+43', name: 'Austria' },\n { iso2: 'GG', dialCode: '+44', name: 'Guernsey' },\n { iso2: 'IM', dialCode: '+44', name: 'Isle of Man' },\n { iso2: 'JE', dialCode: '+44', name: 'Jersey' },\n { iso2: 'GB', dialCode: '+44', name: 'United Kingdom' },\n { iso2: 'DK', dialCode: '+45', name: 'Denmark' },\n { iso2: 'SE', dialCode: '+46', name: 'Sweden' },\n { iso2: 'BV', dialCode: '+47', name: 'Bouvet Island' },\n { iso2: 'NO', dialCode: '+47', name: 'Norway' },\n { iso2: 'PL', dialCode: '+48', name: 'Poland' },\n { iso2: 'DE', dialCode: '+49', name: 'Germany' },\n { iso2: 'PE', dialCode: '+51', name: 'Peru' },\n { iso2: 'MX', dialCode: '+52', name: 'Mexico' },\n { iso2: 'CU', dialCode: '+53', name: 'Cuba' },\n { iso2: 'AR', dialCode: '+54', name: 'Argentina' },\n { iso2: 'BR', dialCode: '+55', name: 'Brazil' },\n { iso2: 'CL', dialCode: '+56', name: 'Chile' },\n { iso2: 'CO', dialCode: '+57', name: 'Colombia' },\n { iso2: 'VE', dialCode: '+58', name: 'Venezuela' },\n { iso2: 'MY', dialCode: '+60', name: 'Malaysia' },\n { iso2: 'AU', dialCode: '+61', name: 'Australia' },\n { iso2: 'CX', dialCode: '+61', name: 'Christmas Island' },\n { iso2: 'CC', dialCode: '+61', name: 'Cocos (Keeling) Islands' },\n { iso2: 'ID', dialCode: '+62', name: 'Indonesia' },\n { iso2: 'PH', dialCode: '+63', name: 'Philippines' },\n { iso2: 'NZ', dialCode: '+64', name: 'New Zealand' },\n { iso2: 'PN', dialCode: '+64', name: 'Pitcairn Islands' },\n { iso2: 'SG', dialCode: '+65', name: 'Singapore' },\n { iso2: 'TH', dialCode: '+66', name: 'Thailand' },\n { iso2: 'RU', dialCode: '+73', name: 'Russia' },\n { iso2: 'KZ', dialCode: '+76', name: 'Kazakhstan' },\n { iso2: 'JP', dialCode: '+81', name: 'Japan' },\n { iso2: 'KR', dialCode: '+82', name: 'South Korea' },\n { iso2: 'VN', dialCode: '+84', name: 'Vietnam' },\n { iso2: 'CN', dialCode: '+86', name: 'China' },\n { iso2: 'TR', dialCode: '+90', name: 'Turkiye' },\n { iso2: 'IN', dialCode: '+91', name: 'India' },\n { iso2: 'PK', dialCode: '+92', name: 'Pakistan' },\n { iso2: 'AF', dialCode: '+93', name: 'Afghanistan' },\n { iso2: 'LK', dialCode: '+94', name: 'Sri Lanka' },\n { iso2: 'MM', dialCode: '+95', name: 'Myanmar' },\n { iso2: 'IR', dialCode: '+98', name: 'Iran' },\n { iso2: 'SS', dialCode: '+211', name: 'South Sudan' },\n { iso2: 'MA', dialCode: '+212', name: 'Morocco' },\n { iso2: 'DZ', dialCode: '+213', name: 'Algeria' },\n { iso2: 'TN', dialCode: '+216', name: 'Tunisia' },\n { iso2: 'LY', dialCode: '+218', name: 'Libya' },\n { iso2: 'GM', dialCode: '+220', name: 'Gambia' },\n { iso2: 'SN', dialCode: '+221', name: 'Senegal' },\n { iso2: 'MR', dialCode: '+222', name: 'Mauritania' },\n { iso2: 'ML', dialCode: '+223', name: 'Mali' },\n { iso2: 'GN', dialCode: '+224', name: 'Guinea' },\n { iso2: 'CI', dialCode: '+225', name: 'Ivory Coast' },\n { iso2: 'BF', dialCode: '+226', name: 'Burkina Faso' },\n { iso2: 'NE', dialCode: '+227', name: 'Niger' },\n { iso2: 'TG', dialCode: '+228', name: 'Togo' },\n { iso2: 'BJ', dialCode: '+229', name: 'Benin' },\n { iso2: 'MU', dialCode: '+230', name: 'Mauritius' },\n { iso2: 'LR', dialCode: '+231', name: 'Liberia' },\n { iso2: 'SL', dialCode: '+232', name: 'Sierra Leone' },\n { iso2: 'GH', dialCode: '+233', name: 'Ghana' },\n { iso2: 'NG', dialCode: '+234', name: 'Nigeria' },\n { iso2: 'TD', dialCode: '+235', name: 'Chad' },\n { iso2: 'CF', dialCode: '+236', name: 'Central African Republic' },\n { iso2: 'CM', dialCode: '+237', name: 'Cameroon' },\n { iso2: 'CV', dialCode: '+238', name: 'Cape Verde' },\n { iso2: 'ST', dialCode: '+239', name: 'Sao Tome and Principe' },\n { iso2: 'GQ', dialCode: '+240', name: 'Equatorial Guinea' },\n { iso2: 'GA', dialCode: '+241', name: 'Gabon' },\n { iso2: 'CG', dialCode: '+242', name: 'Congo' },\n { iso2: 'CD', dialCode: '+243', name: 'DR Congo' },\n { iso2: 'AO', dialCode: '+244', name: 'Angola' },\n { iso2: 'GW', dialCode: '+245', name: 'Guinea-Bissau' },\n { iso2: 'IO', dialCode: '+246', name: 'British Indian Ocean Territory' },\n { iso2: 'SC', dialCode: '+248', name: 'Seychelles' },\n { iso2: 'SD', dialCode: '+249', name: 'Sudan' },\n { iso2: 'RW', dialCode: '+250', name: 'Rwanda' },\n { iso2: 'ET', dialCode: '+251', name: 'Ethiopia' },\n { iso2: 'SO', dialCode: '+252', name: 'Somalia' },\n { iso2: 'DJ', dialCode: '+253', name: 'Djibouti' },\n { iso2: 'KE', dialCode: '+254', name: 'Kenya' },\n { iso2: 'TZ', dialCode: '+255', name: 'Tanzania' },\n { iso2: 'UG', dialCode: '+256', name: 'Uganda' },\n { iso2: 'BI', dialCode: '+257', name: 'Burundi' },\n { iso2: 'MZ', dialCode: '+258', name: 'Mozambique' },\n { iso2: 'ZM', dialCode: '+260', name: 'Zambia' },\n { iso2: 'MG', dialCode: '+261', name: 'Madagascar' },\n { iso2: 'TF', dialCode: '+262', name: 'French Southern and Antarctic Lands' },\n { iso2: 'YT', dialCode: '+262', name: 'Mayotte' },\n { iso2: 'RE', dialCode: '+262', name: 'Reunion' },\n { iso2: 'ZW', dialCode: '+263', name: 'Zimbabwe' },\n { iso2: 'NA', dialCode: '+264', name: 'Namibia' },\n { iso2: 'MW', dialCode: '+265', name: 'Malawi' },\n { iso2: 'LS', dialCode: '+266', name: 'Lesotho' },\n { iso2: 'BW', dialCode: '+267', name: 'Botswana' },\n { iso2: 'SZ', dialCode: '+268', name: 'Eswatini' },\n { iso2: 'UM', dialCode: '+268', name: 'United States Minor Outlying Islands' },\n { iso2: 'KM', dialCode: '+269', name: 'Comoros' },\n { iso2: 'SH', dialCode: '+290', name: 'Saint Helena, Ascension and Tristan da Cunha' },\n { iso2: 'ER', dialCode: '+291', name: 'Eritrea' },\n { iso2: 'AW', dialCode: '+297', name: 'Aruba' },\n { iso2: 'FO', dialCode: '+298', name: 'Faroe Islands' },\n { iso2: 'GL', dialCode: '+299', name: 'Greenland' },\n { iso2: 'GI', dialCode: '+350', name: 'Gibraltar' },\n { iso2: 'PT', dialCode: '+351', name: 'Portugal' },\n { iso2: 'LU', dialCode: '+352', name: 'Luxembourg' },\n { iso2: 'IE', dialCode: '+353', name: 'Ireland' },\n { iso2: 'IS', dialCode: '+354', name: 'Iceland' },\n { iso2: 'AL', dialCode: '+355', name: 'Albania' },\n { iso2: 'MT', dialCode: '+356', name: 'Malta' },\n { iso2: 'CY', dialCode: '+357', name: 'Cyprus' },\n { iso2: 'FI', dialCode: '+358', name: 'Finland' },\n { iso2: 'BG', dialCode: '+359', name: 'Bulgaria' },\n { iso2: 'LT', dialCode: '+370', name: 'Lithuania' },\n { iso2: 'LV', dialCode: '+371', name: 'Latvia' },\n { iso2: 'EE', dialCode: '+372', name: 'Estonia' },\n { iso2: 'MD', dialCode: '+373', name: 'Moldova' },\n { iso2: 'AM', dialCode: '+374', name: 'Armenia' },\n { iso2: 'BY', dialCode: '+375', name: 'Belarus' },\n { iso2: 'AD', dialCode: '+376', name: 'Andorra' },\n { iso2: 'MC', dialCode: '+377', name: 'Monaco' },\n { iso2: 'SM', dialCode: '+378', name: 'San Marino' },\n { iso2: 'UA', dialCode: '+380', name: 'Ukraine' },\n { iso2: 'RS', dialCode: '+381', name: 'Serbia' },\n { iso2: 'ME', dialCode: '+382', name: 'Montenegro' },\n { iso2: 'XK', dialCode: '+383', name: 'Kosovo' },\n { iso2: 'HR', dialCode: '+385', name: 'Croatia' },\n { iso2: 'SI', dialCode: '+386', name: 'Slovenia' },\n { iso2: 'BA', dialCode: '+387', name: 'Bosnia and Herzegovina' },\n { iso2: 'MK', dialCode: '+389', name: 'North Macedonia' },\n { iso2: 'CZ', dialCode: '+420', name: 'Czechia' },\n { iso2: 'SK', dialCode: '+421', name: 'Slovakia' },\n { iso2: 'LI', dialCode: '+423', name: 'Liechtenstein' },\n { iso2: 'FK', dialCode: '+500', name: 'Falkland Islands' },\n { iso2: 'GS', dialCode: '+500', name: 'South Georgia' },\n { iso2: 'BZ', dialCode: '+501', name: 'Belize' },\n { iso2: 'GT', dialCode: '+502', name: 'Guatemala' },\n { iso2: 'SV', dialCode: '+503', name: 'El Salvador' },\n { iso2: 'HN', dialCode: '+504', name: 'Honduras' },\n { iso2: 'NI', dialCode: '+505', name: 'Nicaragua' },\n { iso2: 'CR', dialCode: '+506', name: 'Costa Rica' },\n { iso2: 'PA', dialCode: '+507', name: 'Panama' },\n { iso2: 'PM', dialCode: '+508', name: 'Saint Pierre and Miquelon' },\n { iso2: 'HT', dialCode: '+509', name: 'Haiti' },\n { iso2: 'GP', dialCode: '+590', name: 'Guadeloupe' },\n { iso2: 'BL', dialCode: '+590', name: 'Saint Barthelemy' },\n { iso2: 'MF', dialCode: '+590', name: 'Saint Martin' },\n { iso2: 'BO', dialCode: '+591', name: 'Bolivia' },\n { iso2: 'GY', dialCode: '+592', name: 'Guyana' },\n { iso2: 'EC', dialCode: '+593', name: 'Ecuador' },\n { iso2: 'GF', dialCode: '+594', name: 'French Guiana' },\n { iso2: 'PY', dialCode: '+595', name: 'Paraguay' },\n { iso2: 'MQ', dialCode: '+596', name: 'Martinique' },\n { iso2: 'SR', dialCode: '+597', name: 'Suriname' },\n { iso2: 'UY', dialCode: '+598', name: 'Uruguay' },\n { iso2: 'BQ', dialCode: '+599', name: 'Caribbean Netherlands' },\n { iso2: 'CW', dialCode: '+599', name: 'Curacao' },\n { iso2: 'TL', dialCode: '+670', name: 'Timor-Leste' },\n { iso2: 'NF', dialCode: '+672', name: 'Norfolk Island' },\n { iso2: 'BN', dialCode: '+673', name: 'Brunei' },\n { iso2: 'NR', dialCode: '+674', name: 'Nauru' },\n { iso2: 'PG', dialCode: '+675', name: 'Papua New Guinea' },\n { iso2: 'TO', dialCode: '+676', name: 'Tonga' },\n { iso2: 'SB', dialCode: '+677', name: 'Solomon Islands' },\n { iso2: 'VU', dialCode: '+678', name: 'Vanuatu' },\n { iso2: 'FJ', dialCode: '+679', name: 'Fiji' },\n { iso2: 'PW', dialCode: '+680', name: 'Palau' },\n { iso2: 'WF', dialCode: '+681', name: 'Wallis and Futuna' },\n { iso2: 'CK', dialCode: '+682', name: 'Cook Islands' },\n { iso2: 'NU', dialCode: '+683', name: 'Niue' },\n { iso2: 'WS', dialCode: '+685', name: 'Samoa' },\n { iso2: 'KI', dialCode: '+686', name: 'Kiribati' },\n { iso2: 'NC', dialCode: '+687', name: 'New Caledonia' },\n { iso2: 'TV', dialCode: '+688', name: 'Tuvalu' },\n { iso2: 'PF', dialCode: '+689', name: 'French Polynesia' },\n { iso2: 'TK', dialCode: '+690', name: 'Tokelau' },\n { iso2: 'FM', dialCode: '+691', name: 'Micronesia' },\n { iso2: 'MH', dialCode: '+692', name: 'Marshall Islands' },\n { iso2: 'KP', dialCode: '+850', name: 'North Korea' },\n { iso2: 'HK', dialCode: '+852', name: 'Hong Kong' },\n { iso2: 'MO', dialCode: '+853', name: 'Macau' },\n { iso2: 'KH', dialCode: '+855', name: 'Cambodia' },\n { iso2: 'LA', dialCode: '+856', name: 'Laos' },\n { iso2: 'BD', dialCode: '+880', name: 'Bangladesh' },\n { iso2: 'TW', dialCode: '+886', name: 'Taiwan' },\n { iso2: 'MV', dialCode: '+960', name: 'Maldives' },\n { iso2: 'LB', dialCode: '+961', name: 'Lebanon' },\n { iso2: 'JO', dialCode: '+962', name: 'Jordan' },\n { iso2: 'SY', dialCode: '+963', name: 'Syria' },\n { iso2: 'IQ', dialCode: '+964', name: 'Iraq' },\n { iso2: 'KW', dialCode: '+965', name: 'Kuwait' },\n { iso2: 'SA', dialCode: '+966', name: 'Saudi Arabia' },\n { iso2: 'YE', dialCode: '+967', name: 'Yemen' },\n { iso2: 'OM', dialCode: '+968', name: 'Oman' },\n { iso2: 'PS', dialCode: '+970', name: 'Palestine' },\n { iso2: 'AE', dialCode: '+971', name: 'United Arab Emirates' },\n { iso2: 'IL', dialCode: '+972', name: 'Israel' },\n { iso2: 'BH', dialCode: '+973', name: 'Bahrain' },\n { iso2: 'QA', dialCode: '+974', name: 'Qatar' },\n { iso2: 'BT', dialCode: '+975', name: 'Bhutan' },\n { iso2: 'MN', dialCode: '+976', name: 'Mongolia' },\n { iso2: 'NP', dialCode: '+977', name: 'Nepal' },\n { iso2: 'TJ', dialCode: '+992', name: 'Tajikistan' },\n { iso2: 'TM', dialCode: '+993', name: 'Turkmenistan' },\n { iso2: 'AZ', dialCode: '+994', name: 'Azerbaijan' },\n { iso2: 'GE', dialCode: '+995', name: 'Georgia' },\n { iso2: 'KG', dialCode: '+996', name: 'Kyrgyzstan' },\n { iso2: 'UZ', dialCode: '+998', name: 'Uzbekistan' },\n { iso2: 'US', dialCode: '+1201', name: 'United States' },\n { iso2: 'CA', dialCode: '+1204', name: 'Canada' },\n { iso2: 'BS', dialCode: '+1242', name: 'Bahamas' },\n { iso2: 'BB', dialCode: '+1246', name: 'Barbados' },\n { iso2: 'AI', dialCode: '+1264', name: 'Anguilla' },\n { iso2: 'AG', dialCode: '+1268', name: 'Antigua and Barbuda' },\n { iso2: 'VG', dialCode: '+1284', name: 'British Virgin Islands' },\n { iso2: 'VI', dialCode: '+1340', name: 'United States Virgin Islands' },\n { iso2: 'KY', dialCode: '+1345', name: 'Cayman Islands' },\n { iso2: 'BM', dialCode: '+1441', name: 'Bermuda' },\n { iso2: 'GD', dialCode: '+1473', name: 'Grenada' },\n { iso2: 'TC', dialCode: '+1649', name: 'Turks and Caicos Islands' },\n { iso2: 'MS', dialCode: '+1664', name: 'Montserrat' },\n { iso2: 'MP', dialCode: '+1670', name: 'Northern Mariana Islands' },\n { iso2: 'GU', dialCode: '+1671', name: 'Guam' },\n { iso2: 'AS', dialCode: '+1684', name: 'American Samoa' },\n { iso2: 'SX', dialCode: '+1721', name: 'Sint Maarten' },\n { iso2: 'LC', dialCode: '+1758', name: 'Saint Lucia' },\n { iso2: 'DM', dialCode: '+1767', name: 'Dominica' },\n { iso2: 'VC', dialCode: '+1784', name: 'Saint Vincent and the Grenadines' },\n { iso2: 'PR', dialCode: '+1787', name: 'Puerto Rico' },\n { iso2: 'DO', dialCode: '+1809', name: 'Dominican Republic' },\n { iso2: 'TT', dialCode: '+1868', name: 'Trinidad and Tobago' },\n { iso2: 'KN', dialCode: '+1869', name: 'Saint Kitts and Nevis' },\n { iso2: 'JM', dialCode: '+1876', name: 'Jamaica' },\n { iso2: 'SJ', dialCode: '+4779', name: 'Svalbard and Jan Mayen' },\n { iso2: 'AX', dialCode: '+35818', name: 'Aland Islands' },\n { iso2: 'EH', dialCode: '+2125288', name: 'Western Sahara' },\n { iso2: 'VA', dialCode: '+3906698', name: 'Vatican City' },\n]\n\nconst NON_USER_FACING_ISO2 = new Set([\n 'AQ', 'AX', 'BL', 'BM', 'BQ', 'BV', 'CC', 'CK', 'CP', 'CW', 'CX', 'EH', 'FK', 'FO',\n 'GF', 'GG', 'GI', 'GL', 'GP', 'GS', 'GU', 'HK', 'HM', 'IM', 'IO', 'JE', 'KY', 'MF',\n 'MO', 'MP', 'MQ', 'MS', 'NC', 'NF', 'NU', 'PF', 'PM', 'PN', 'PR', 'RE', 'SH', 'SJ',\n 'TC', 'TF', 'TK', 'UM', 'VG', 'VI', 'WF', 'YT'\n])\n\nfunction normalizeDialCode(rawDialCode: string): string {\n if (/^\\+1\\d{3,}$/.test(rawDialCode)) return '+1'\n if (/^\\+7\\d+$/.test(rawDialCode)) return '+7'\n if (/^\\+39\\d{3,}$/.test(rawDialCode)) return '+39'\n if (/^\\+358\\d+$/.test(rawDialCode)) return '+358'\n if (/^\\+47\\d+$/.test(rawDialCode)) return '+47'\n if (/^\\+212\\d+$/.test(rawDialCode)) return '+212'\n return rawDialCode\n}\n\nconst COUNTRY_DIAL_OPTIONS_USER = COUNTRY_DIAL_OPTIONS\n .filter((option) => !NON_USER_FACING_ISO2.has(option.iso2))\n .map((option) => ({ ...option, dialCode: normalizeDialCode(option.dialCode) }))\n .filter((option, index, source) => {\n const key = `${option.iso2}|${option.dialCode}`\n return source.findIndex((candidate) => `${candidate.iso2}|${candidate.dialCode}` === key) === index\n })\n\nexport const COUNTRY_DIAL_OPTIONS_ASC = [...COUNTRY_DIAL_OPTIONS_USER].sort((a, b) => {\n const codeA = Number.parseInt(a.dialCode.replace('+', ''), 10)\n const codeB = Number.parseInt(b.dialCode.replace('+', ''), 10)\n if (codeA !== codeB) return codeA - codeB\n return a.name.localeCompare(b.name)\n})\n\nconst PREFERRED_ISO_BY_DIAL_CODE: Record<string, string> = {\n '+1': 'US',\n '+7': 'RU'\n}\n\nexport const COUNTRY_PREFIX_OPTIONS = Array.from(\n COUNTRY_DIAL_OPTIONS_ASC.reduce((map, option) => {\n const current = map.get(option.dialCode)\n if (!current) {\n map.set(option.dialCode, option)\n return map\n }\n\n const preferredIso = PREFERRED_ISO_BY_DIAL_CODE[option.dialCode]\n if (preferredIso && option.iso2 === preferredIso) {\n map.set(option.dialCode, option)\n }\n\n return map\n }, new Map<string, CountryDialOption>()).values()\n)\n\nconst DIAL_CODES_DESC = Array.from(new Set(COUNTRY_DIAL_OPTIONS.map((option) => option.dialCode))).sort(\n (a, b) => b.length - a.length\n)\n\nexport function countryCodeToFlag(iso2: string): string {\n const normalized = iso2.toUpperCase()\n if (!/^[A-Z]{2}$/.test(normalized)) return ''\n const codePoints = [...normalized].map((char) => 127397 + char.charCodeAt(0))\n return String.fromCodePoint(...codePoints)\n}\n\nexport function splitPhoneValue(raw: string) {\n const value = raw.trim()\n if (!value) return { dialCode: DEFAULT_DIAL_CODE, localNumber: '' }\n if (!value.startsWith('+')) return { dialCode: DEFAULT_DIAL_CODE, localNumber: value }\n\n const matchedDialCode = DIAL_CODES_DESC.find((dialCode) => value.startsWith(dialCode))\n if (!matchedDialCode) {\n return { dialCode: DEFAULT_DIAL_CODE, localNumber: value }\n }\n\n const normalizedDialCode = normalizeDialCode(matchedDialCode)\n const localNumber = value.slice(matchedDialCode.length)\n const fallbackLocalNumber = value.slice(normalizedDialCode.length)\n\n return {\n dialCode: COUNTRY_PREFIX_OPTIONS.some((option) => option.dialCode === normalizedDialCode)\n ? normalizedDialCode\n : DEFAULT_DIAL_CODE,\n localNumber: matchedDialCode.length > normalizedDialCode.length ? fallbackLocalNumber : localNumber\n }\n}\n\nexport function combinePhoneValue(dialCode: string, localNumber: string): string {\n const trimmed = localNumber.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('+')) return trimmed\n return `${dialCode}${trimmed}`\n}\n","export function strToUpperCase(str: string) {\n if (str.trim().length > 0) {\n const strCase = str.split(' ')\n for (let i = 0; i < strCase.length; i++) {\n strCase[i] = strCase[i].charAt(0).toUpperCase() +\n strCase[i].substring(1)\n }\n return strCase.join(' ')\n }\n return ''\n}\n\nexport function toText(value: unknown): string {\n if (!value) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'object' && 'value' in (value as Record<string, unknown>)) {\n const nested = (value as { value?: unknown }).value\n return typeof nested === 'string' ? nested : ''\n }\n return ''\n}\n\nexport function toTypeLabel(value: unknown): string {\n const raw = toText(value).trim()\n if (!raw) return ''\n const withoutAngles = raw.replace(/^<|>$/g, '')\n const hashParts = withoutAngles.split('#')\n const lastByHash = hashParts[hashParts.length - 1]\n const slashParts = lastByHash.split('/')\n return slashParts[slashParts.length - 1]\n}\n\nexport function sanitizeTextValue(value: string): string {\n return value\n .replace(/[\\u0000-\\u001F\\u007F]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\nexport function hasNonEmptyText(value: string | undefined): boolean {\n return Boolean(value && value.trim() !== '')\n}\n","import { toTypeLabel } from '../../textUtils'\n\nexport function normalizePhoneTypeForEdit(value: unknown): string {\n const label = toTypeLabel(value).trim().toLowerCase()\n if (!label) return ''\n\n if (label === 'cell' || label === 'mobile') return 'Mobile'\n if (label === 'home') return 'Home'\n if (label === 'work' || label === 'office') return 'Work'\n return ''\n}\n\nexport function normalizePhoneTypeForContactInfoEdit(value: unknown): string {\n const label = toTypeLabel(value).trim().toLowerCase()\n if (!label) return ''\n\n if (label === 'cell' || label === 'mobile') return 'Cell'\n if (label === 'home') return 'Home'\n if (label === 'work' || label === 'office') return 'Work'\n return ''\n}\n\nexport function normalizeEmailTypeForEdit(value: unknown): string {\n const label = toTypeLabel(value).trim().toLowerCase()\n if (!label) return ''\n\n if (label === 'personal' || label === 'home') return 'Personal'\n if (label === 'office' || label === 'work') return 'Office'\n return ''\n}\n\nexport function normalizeEmailTypeForContactInfoEdit(value: unknown): string {\n const label = toTypeLabel(value).trim().toLowerCase()\n if (!label) return ''\n\n if (label === 'personal' || label === 'home') return 'Home'\n if (label === 'office' || label === 'work') return 'Office'\n return ''\n}\n\nexport function toSavedHeadingEmailType(type: string | undefined): string {\n return type === 'Personal' ? 'Home' : (type || '')\n}\n\nexport function toSavedHeadingPhoneType(type: string | undefined): string {\n return type === 'Mobile' ? 'Cell' : (type || '')\n}\n","import { RowStatus } from './types'\n\nexport type EditableRow = {\n entryNode: string\n status: RowStatus\n}\n\nexport type TypedEditableRow = EditableRow & {\n type: string\n}\n\ntype StringKeyOf<T> = {\n [K in keyof T]-?: T[K] extends string ? K : never\n}[keyof T]\n\nexport function deleteRow<T extends EditableRow>(rows: T[], index: number) {\n const row = rows[index]\n if (!row) return\n\n if (row.entryNode) {\n row.status = 'deleted'\n return\n }\n\n rows.splice(index, 1)\n}\n\nexport function applyRowSelectChange<T extends EditableRow, K extends StringKeyOf<T>>(\n row: T,\n field: K,\n nextValue: Extract<T[K], string>\n) {\n row[field] = nextValue.trim() as T[K]\n\n if (row.entryNode) {\n row.status = row.status === 'existing' || row.status === 'deleted' ? 'modified' : row.status\n return\n }\n\n row.status = 'new'\n}\n\nexport function summarizeRowOps<T extends EditableRow>(rows: T[], rowHasContent: (row: T) => boolean) {\n const create = rows.filter((row) => row.status === 'new' && rowHasContent(row))\n const update = rows.filter((row) => row.status === 'modified' && rowHasContent(row))\n const remove = rows.filter((row) => row.status === 'deleted')\n return { create, update, remove }\n}\n\n/* The following function was generated by AI Model: GPT-5.3-Codex */\n/* it was originally only for addresses but I made it more generic so it can be used for any type of rows */\n/* Prompt: can you have applyAddressFieldChange update the row status based on whether any fields have content */ \nexport function applyRowFieldChange<T extends EditableRow, K extends keyof T>(\n row: T,\n field: K,\n nextValue: T[K],\n hasContent: (row: T) => boolean\n) {\n row[field] = nextValue\n\n if (!hasContent(row)) {\n row.status = row.entryNode ? 'deleted' : 'new'\n return\n }\n\n if (row.entryNode) {\n row.status = row.status === 'existing' || row.status === 'deleted' ? 'modified' : row.status\n return\n }\n\n row.status = 'new'\n}\n","import { sanitizeTextValue } from '../../textUtils'\n\nexport function sanitizeEmailValue(value: string): string {\n return sanitizeTextValue(value).replace(/\\s+/g, '').toLowerCase()\n}\n\nexport function sanitizePhoneLocalValue(value: string): string {\n return sanitizeTextValue(value).replace(/[^0-9()\\-\\s.]/g, '')\n}\n\nexport function sanitizeAddressFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n\nexport function sanitizeBasicInputFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n","import { html } from 'lit-html'\n\nexport const phoneIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M9.22198 11.0453C9.35967 11.1085 9.51478 11.1229 9.66178 11.0862C9.80877 11.0495 9.93887 10.9638 10.0307 10.8433L10.2673 10.5333C10.3915 10.3677 10.5526 10.2333 10.7377 10.1407C10.9228 10.0481 11.127 9.99992 11.334 9.99992H13.334C13.6876 9.99992 14.0267 10.1404 14.2768 10.3904C14.5268 10.6405 14.6673 10.9796 14.6673 11.3333V13.3333C14.6673 13.6869 14.5268 14.026 14.2768 14.2761C14.0267 14.5261 13.6876 14.6666 13.334 14.6666C10.1514 14.6666 7.09914 13.4023 4.8487 11.1519C2.59827 8.90143 1.33398 5.84918 1.33398 2.66659C1.33398 2.31296 1.47446 1.97382 1.72451 1.72378C1.97456 1.47373 2.3137 1.33325 2.66732 1.33325H4.66732C5.02094 1.33325 5.36008 1.47373 5.61013 1.72378C5.86017 1.97382 6.00065 2.31296 6.00065 2.66659V4.66659C6.00065 4.87358 5.95246 5.07773 5.85989 5.26287C5.76732 5.44801 5.63291 5.60906 5.46732 5.73325L5.15532 5.96725C5.03293 6.0607 4.94666 6.19364 4.91118 6.34349C4.87569 6.49333 4.89317 6.65084 4.96065 6.78925C5.87177 8.63983 7.37027 10.1364 9.22198 11.0453Z\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n</svg>\n`\nexport const emailIcon = html`\n <svg xmlns=\"http://www.w3.org/2000/svg\" \n width=\"16\" \n height=\"16\" \n viewBox=\"0 0 16 16\" \n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M14.6673 4.66675L8.67332 8.48475C8.46991 8.60289 8.23888 8.66512 8.00365 8.66512C7.76843 8.66512 7.53739 8.60289 7.33398 8.48475L1.33398 4.66675\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M13.334 2.66675H2.66732C1.93094 2.66675 1.33398 3.2637 1.33398 4.00008V12.0001C1.33398 12.7365 1.93094 13.3334 2.66732 13.3334H13.334C14.0704 13.3334 14.6673 12.7365 14.6673 12.0001V4.00008C14.6673 3.2637 14.0704 2.66675 13.334 2.66675Z\" stroke=\"#4A5565\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n `\n ","import { openInputDialog } from '../../ui/dialog'\nimport { html, render } from 'lit-html'\nimport { ContactAddressRow, ContactInfo, ContactMutationPlan, ContactPointRow } from './types'\nimport '../../styles/EditDialogs.css'\nimport '../../styles/ContactInfoEditDialog.css'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { processContactInfoMutations } from './mutations'\nimport { ViewerMode } from '../../types'\nimport {\n combinePhoneValue,\n splitPhoneValue\n} from '../shared/phoneCountries'\nimport { normalizeEmailTypeForContactInfoEdit, normalizePhoneTypeForContactInfoEdit } from '../shared/contactTypeUtils'\nimport { applyRowFieldChange, applyRowSelectChange, deleteRow, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText } from '../../textUtils'\nimport {\n deleteEntryButtonTitleText,\n dialogCancelLabelText,\n dialogSubmitLabelText,\n editContactInfoDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n saveContactUpdatesFailedPrefixText\n} from '../../texts'\nimport { sanitizeAddressFieldValue, sanitizeEmailValue, sanitizePhoneLocalValue } from '../shared/sanitizeUtils'\nimport { addIcon, locationIcon, trashIcon } from '../../icons-svg/profileIcons'\nimport { emailIcon, phoneIcon } from '../../icons-svg/contactIcons'\n\n/* Some of the code in this file was generated by AI Model: GPT-5.3-Codex */\n/* Prompt: 1. are you able to create a little trash can icon at the end of \n each entry so for each phone, email and address line.\n 2. are you able to add all the country flags and prefix next to \n the phone numbers? \n 3. can you write functions to sanitize the input values for emails, phones, and addresses? */\n\ntype ContactInfoFormState = {\n emails: ContactPointRow[]\n phones: ContactPointRow[]\n addresses: ContactAddressRow[]\n}\n\ntype ContactInfoRerenderOptions = {\n focusSelector?: string\n}\n\nfunction isContactPointRow(row: ContactPointRow | ContactAddressRow): row is ContactPointRow {\n return 'value' in row\n}\n\nfunction rowHasContent(row: ContactPointRow | ContactAddressRow): boolean {\n if (isContactPointRow(row)) {\n return hasNonEmptyText(row.value)\n }\n\n return [\n row.streetAddress,\n row.locality,\n row.region,\n row.postalCode,\n row.countryName\n ].some(hasNonEmptyText)\n}\n\nfunction toFormState(contactInfo: ContactInfo): ContactInfoFormState {\n const emails = (contactInfo.emails || [])\n .map((email) => ({\n value: sanitizeEmailValue(toText(email.valueNode).replace(/^mailto:/i, '')),\n type: normalizeEmailTypeForContactInfoEdit(email.type),\n entryNode: toText(email.entryNode),\n status: toText(email.entryNode) ? 'existing' as const : 'new' as const\n }))\n .filter((email) => Boolean(email.value || email.entryNode || email.type))\n\n const phones = (contactInfo.phones || [])\n .map((phone) => ({\n value: sanitizeTextValue(toText(phone.valueNode).replace(/^tel:/i, '')),\n type: normalizePhoneTypeForContactInfoEdit(phone.type),\n entryNode: toText(phone.entryNode),\n status: 'existing' as const\n }))\n .filter((phone) => Boolean(phone.value))\n const addresses = (contactInfo.addresses || [])\n .map((address) => ({\n streetAddress: sanitizeAddressFieldValue(toText(address.streetAddress)),\n locality: sanitizeAddressFieldValue(toText(address.locality)),\n region: sanitizeAddressFieldValue(toText(address.region)),\n postalCode: sanitizeAddressFieldValue(toText(address.postalCode)),\n countryName: sanitizeAddressFieldValue(toText(address.countryName)),\n type: toText(address.type),\n entryNode: toText(address.entryNode),\n status: toText(address.entryNode) ? 'existing' as const : 'new' as const\n }))\n .filter((address) => rowHasContent(address) || Boolean(address.entryNode || address.type))\n\n return {\n emails: emails.length ? emails : [{ value: '', type: '', entryNode: '', status: 'new' }],\n phones: phones.length ? phones : [{ value: '', type: '', entryNode: '', status: 'new' }],\n addresses: addresses.length\n ? addresses\n : [{ streetAddress: '', locality: '', region: '', postalCode: '', countryName: '', type: '', entryNode: '', status: 'new' }]\n }\n}\n\ntype ContactAddressEditableField =\n | 'streetAddress'\n | 'locality'\n | 'region'\n | 'postalCode'\n | 'countryName'\n\ntype ContactPhoneInputRowProps = {\n phones: ContactPointRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n}\n\ntype ContactEmailInputRowProps = {\n emails: ContactPointRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n}\n\ntype ContactAddressInputRowProps = {\n addresses: ContactAddressRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n}\n/* not needed for now\nfunction renderCountryPrefixSelect(\n name: string,\n value: string,\n label: string,\n onChange: (event: Event) => void\n) {\n return html`\n <label class=\"label profile-edit-dialog__phone-prefix-field\" aria-label=${label}>\n <select class=\"phonePrefixSelect\" name=${name} .value=${value} @change=${onChange}>\n ${COUNTRY_PREFIX_OPTIONS.map((option) => html`\n <option value=${option.dialCode}>\n ${countryCodeToFlag(option.iso2)} ${option.dialCode}\n </option>\n `)}\n </select>\n </label>\n `\n} */\n\nfunction renderContactPhoneInputRow({\n phones,\n index,\n displayIndex,\n onDelete\n}: ContactPhoneInputRowProps) {\n const phoneRow = phones[index]\n const label = `Phone Number ${displayIndex + 1}`\n // const countryCodeLabel = `Country Calling Code ${displayIndex + 1}`\n const typeLabel = `Phone Type ${displayIndex + 1}`\n // const prefixInputName = `phone-prefix-${index}`\n const inputName = `phone-value-${index}`\n const typeInputName = `phone-type-${index}`\n const splitValue = splitPhoneValue(phoneRow?.value || '')\n let selectedDialCode = splitValue.dialCode\n\n const handleValueInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizePhoneLocalValue(target.value)\n if (phones[index]) {\n applyRowFieldChange(phones[index], 'value', combinePhoneValue(selectedDialCode, nextValue), rowHasContent)\n }\n }\n/* Not needed for now\n const handleCountryCodeInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n selectedDialCode = target.value\n\n if (phones[index]) {\n const localNumber = splitPhoneValue(phones[index].value).localNumber\n applyRowFieldChange(phones[index], 'value', combinePhoneValue(selectedDialCode, localNumber), rowHasContent)\n }\n } */\n\n const handleTypeInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n const nextType = target.value\n if (phones[index]) {\n applyRowSelectChange(phones[index], 'type', nextType)\n }\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--contact-point\">\n <div class=\"profile-edit-dialog__field\">\n <label aria-label=${label} class=\"label\">\n <input\n class=\"input\"\n type=\"tel\"\n name=${inputName}\n .value=${splitValue.localNumber}\n required\n data-contact-field=\"value\"\n data-entry-node=${phoneRow?.entryNode || ''}\n data-row-status=${phoneRow?.status || 'n/a'}\n placeholder=\"Phone Number\"\n autocomplete=\"tel-national\"\n inputmode=\"tel\"\n @input=${handleValueInput}\n />\n </label>\n </div>\n <label aria-label=${typeLabel} class=\"label profile-edit-dialog__field-type profile-edit-dialog__phone-type-row\">\n <select name=${typeInputName} id=\"phone-type-select-${inputName}\" @change=${handleTypeInput} .value=${phoneRow?.type || ''}>\n <option value=\"Cell\">Mobile</option>\n <option value=\"Home\">Home</option>\n <option value=\"Work\">Work</option>\n </select>\n </label>\n <div class=\"profile-edit-dialog__actions\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete phone number ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n `\n}\n\nfunction renderContactInfoPhoneSection(phones: ContactPointRow[], onAddRow: (options?: ContactInfoRerenderOptions) => void) {\n const createNewRow = (event: Event) => {\n event.preventDefault()\n phones.unshift({ value: '', type: '', entryNode: '', status: 'new' })\n onAddRow({ focusSelector: '[name=\"phone-value-0\"]' })\n }\n\n const visiblePhones = phones\n .map((phone, index) => ({ phone, index }))\n .filter(({ phone }) => phone.status !== 'deleted')\n\n return html`\n <section \n aria-labelledby=\"phone-numbers-heading\" \n class=\"profile-edit-dialog__section\">\n <header class=\"profile__section-header\">\n <h3 id=\"phone-numbers-heading\" class=\"profile-edit-dialog__section-heading\">\n <span class=\"sectionTitleIcon\" aria-hidden=\"true\">${phoneIcon}</span>\n Phone Numbers\n </h3>\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center\"\n aria-label=\"Add another phone number\"\n @click=${createNewRow}\n >\n <span class=\"profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add More\n </span>\n </button>\n </header>\n <fieldset>\n <legend class=\"sr-only\">Phone number entries</legend>\n ${visiblePhones.map(({ index }, displayIndex) => renderContactPhoneInputRow({\n phones,\n index,\n displayIndex,\n onDelete: () => {\n deleteRow(phones, index)\n onAddRow()\n }\n }))}\n </fieldset>\n </section>\n `\n}\n\nfunction renderContactEmailInputRow({\n emails,\n index,\n displayIndex,\n onDelete\n}: ContactEmailInputRowProps) {\n const emailRow = emails[index]\n const label = `Email Address ${displayIndex + 1}`\n const typeLabel = `Email Type ${displayIndex + 1}`\n const inputName = `email-value-${index}`\n const typeInputName = `email-type-${index}`\n\n const handleValueInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeEmailValue(target.value)\n if (emails[index]) {\n applyRowFieldChange(emails[index], 'value', nextValue, rowHasContent)\n }\n }\n\n const handleTypeInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n const nextType = target.value\n if (emails[index]) {\n applyRowSelectChange(emails[index], 'type', nextType)\n }\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--contact-point\">\n <label aria-label=${label} class=\"label profile-edit-dialog__field\">\n <input\n class=\"input\"\n type=\"email\"\n name=${inputName}\n .value=${emailRow?.value || ''}\n required\n data-contact-field=\"value\"\n data-entry-node=${emailRow?.entryNode || ''}\n data-row-status=${emailRow?.status || 'n/a'}\n placeholder=\"Email Address\"\n autocomplete=\"email\"\n inputmode=\"email\"\n @input=${handleValueInput}\n />\n </label>\n <label aria-label=${typeLabel} class=\"label profile-edit-dialog__field-type emailTypeRow\">\n <select name=${typeInputName} id=\"email-type-select-${inputName}\" @change=${handleTypeInput} .value=${emailRow?.type || ''}>\n <option value=\"Home\">Personal</option>\n <option value=\"Office\">Office</option>\n </select>\n </label>\n <div class=\"profile-edit-dialog__actions\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete email address ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n `\n}\n\nfunction renderContactInfoEmailSection(emails: ContactPointRow[], onAddRow: (options?: ContactInfoRerenderOptions) => void) {\n const createNewRow = (event: Event) => {\n event.preventDefault()\n emails.unshift({ value: '', type: '', entryNode: '', status: 'new' })\n onAddRow({ focusSelector: '[name=\"email-value-0\"]' })\n }\n\n const visibleEmails = emails\n .map((email, index) => ({ email, index }))\n .filter(({ email }) => email.status !== 'deleted')\n\n return html`\n <section \n aria-labelledby=\"email-addresses-heading\" \n class=\"profile-edit-dialog__section\">\n <header class=\"profile__section-header\">\n <h3 id=\"email-addresses-heading\" class=\"profile-edit-dialog__section-heading\">\n <span class=\"sectionTitleIcon\" aria-hidden=\"true\">${emailIcon}</span>\n Email Addresses\n </h3>\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center\"\n aria-label=\"Add another email address\"\n @click=${createNewRow}\n >\n <span class=\"profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add More\n </span>\n </button>\n </header>\n <fieldset>\n <legend class=\"sr-only\">Email address entries</legend>\n ${visibleEmails.map(({ index }, displayIndex) => renderContactEmailInputRow({\n emails,\n index,\n displayIndex,\n onDelete: () => {\n deleteRow(emails, index)\n onAddRow()\n }\n }))}\n </fieldset>\n </section>\n `\n}\n\nfunction renderContactAddressInputRow({\n addresses,\n index,\n displayIndex,\n onDelete\n}: ContactAddressInputRowProps) {\n const addressRow = addresses[index]\n const label = `Address ${displayIndex + 1}`\n const typeLabel = `Address Type ${displayIndex + 1}`\n const streetAddressName = `address-street-${index}`\n const localityName = `address-locality-${index}`\n const regionName = `address-region-${index}`\n const postalCodeName = `address-postal-${index}`\n const countryName = `address-country-${index}`\n const typeInputName = `address-type-${index}`\n const addressTypeSelectId = `address-type-select-${index}`\n\n const handleAddressInput = (field: ContactAddressEditableField) => (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeAddressFieldValue(target.value)\n if (addresses[index]) {\n applyRowFieldChange(addresses[index], field, nextValue, rowHasContent)\n }\n }\n\n const handleTypeInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n const nextType = target.value\n if (addresses[index]) {\n applyRowSelectChange(addresses[index], 'type', nextType)\n }\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--address-header profile-edit-dialog__row--full\">\n <p class=\"profile-edit-dialog__address-title\">${label}</p>\n <label aria-label=${typeLabel} class=\"label profile-edit-dialog__field-type profile-edit-dialog__field-type--wide hidden\">\n Address Type\n <select name=${typeInputName} id=${addressTypeSelectId} @change=${handleTypeInput} .value=${addressRow?.type || ''}>\n <option value=\"Home\">Home</option>\n <option value=\"Work\">Work</option>\n </select>\n </label>\n <div class=\"profile-edit-dialog__actions profile-edit-dialog__actions--edge\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete address ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--full\">\n <label aria-label=${`${label} Street`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--full\">\n Street Address\n <input\n class=\"input\"\n type=\"text\"\n name=${streetAddressName}\n .value=${addressRow?.streetAddress || ''}\n required\n data-contact-field=\"streetAddress\"\n data-entry-node=${addressRow?.entryNode || ''}\n data-row-status=${addressRow?.status || 'n/a'}\n placeholder=\"Street Address\"\n autocomplete=\"street-address\"\n inputmode=\"text\"\n @change=${handleAddressInput('streetAddress')}\n />\n </label>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--full profile-edit-dialog__row--equal\">\n <label aria-label=${`${label} Locality`} class=\"label profile-edit-dialog__field\">\n Locality\n <input\n class=\"input\"\n type=\"text\"\n name=${localityName}\n .value=${addressRow?.locality || ''}\n data-contact-field=\"locality\"\n data-entry-node=${addressRow?.entryNode || ''}\n data-row-status=${addressRow?.status || 'n/a'}\n placeholder=\"City / Locality\"\n autocomplete=\"address-level2\"\n inputmode=\"text\"\n @change=${handleAddressInput('locality')}\n />\n </label>\n <label aria-label=${`${label} Postal Code`} class=\"label profile-edit-dialog__field\">\n Postal Code\n <input\n class=\"input\"\n type=\"text\"\n name=${postalCodeName}\n .value=${addressRow?.postalCode || ''}\n data-contact-field=\"postalCode\"\n data-entry-node=${addressRow?.entryNode || ''}\n data-row-status=${addressRow?.status || 'n/a'}\n placeholder=\"Postal Code\"\n autocomplete=\"postal-code\"\n inputmode=\"text\"\n @change=${handleAddressInput('postalCode')}\n />\n </label>\n </div>\n\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--full profile-edit-dialog__row--equal\">\n <label aria-label=${`${label} Region`} class=\"label profile-edit-dialog__field\">\n Region\n <input\n class=\"input\"\n type=\"text\"\n name=${regionName}\n .value=${addressRow?.region || ''}\n data-contact-field=\"region\"\n data-entry-node=${addressRow?.entryNode || ''}\n data-row-status=${addressRow?.status || 'n/a'}\n placeholder=\"State / Region\"\n autocomplete=\"address-level1\"\n inputmode=\"text\"\n @change=${handleAddressInput('region')}\n />\n </label>\n <label aria-label=${`${label} Country`} class=\"label profile-edit-dialog__field\">\n Country\n <input\n class=\"input\"\n type=\"text\"\n name=${countryName}\n .value=${addressRow?.countryName || ''}\n data-contact-field=\"countryName\"\n data-entry-node=${addressRow?.entryNode || ''}\n data-row-status=${addressRow?.status || 'n/a'}\n placeholder=\"Country\"\n autocomplete=\"country-name\"\n inputmode=\"text\"\n @change=${handleAddressInput('countryName')}\n />\n </label>\n </div>\n `\n}\n\nfunction renderContactInfoAddressSection(addresses: ContactAddressRow[], onAddRow: (options?: ContactInfoRerenderOptions) => void) {\n const createNewRow = (event: Event) => {\n event.preventDefault()\n addresses.unshift({\n streetAddress: '',\n locality: '',\n region: '',\n postalCode: '',\n countryName: '',\n type: '',\n entryNode: '',\n status: 'new'\n })\n onAddRow({ focusSelector: '[name=\"address-street-0\"]' })\n }\n\n const visibleAddresses = addresses\n .map((address, index) => ({ address, index }))\n .filter(({ address }) => address.status !== 'deleted')\n\n return html`\n <section \n aria-labelledby=\"address-heading\" \n class=\"profile-edit-dialog__section\">\n <header class=\"profile__section-header\">\n <h3 id=\"address-heading\" class=\"profile-edit-dialog__section-heading\">\n <span class=\"sectionTitleIcon\" aria-hidden=\"true\">${locationIcon}</span>\n Addresses\n </h3>\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center\"\n aria-label=\"Add another address\"\n @click=${createNewRow}\n >\n <span class=\"profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add More\n </span>\n </button>\n </header>\n <fieldset>\n <legend class=\"sr-only\">Address entries</legend>\n ${visibleAddresses.map(({ index }, displayIndex) => renderContactAddressInputRow({\n addresses,\n index,\n displayIndex,\n onDelete: () => {\n deleteRow(addresses, index)\n onAddRow()\n }\n }))}\n </fieldset>\n </section>\n `\n}\n\nfunction focusContactInfoField(form: HTMLFormElement, selector: string): void {\n const nextField = form.querySelector(selector) as HTMLElement | null\n if (!nextField || typeof nextField.focus !== 'function') return\n\n nextField.scrollIntoView({ block: 'nearest', behavior: 'auto' })\n nextField.focus()\n if (nextField instanceof HTMLInputElement || nextField instanceof HTMLTextAreaElement) {\n nextField.select()\n }\n}\n\nfunction renderContactInfoEditTemplate(\n form: HTMLFormElement,\n formState: ContactInfoFormState,\n viewerMode: ViewerMode,\n options: ContactInfoRerenderOptions = {}\n) {\n const rerender = (nextOptions: ContactInfoRerenderOptions = {}) => renderContactInfoEditTemplate(form, formState, viewerMode, nextOptions)\n\n\n render(html`\n ${renderContactInfoPhoneSection(formState.phones, rerender)}\n ${renderContactInfoEmailSection(formState.emails, rerender)}\n ${renderContactInfoAddressSection(formState.addresses, rerender)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n\n if (options.focusSelector) {\n focusContactInfoField(form, options.focusSelector)\n }\n}\n\nfunction createContactInfoEditForm(contactInfo: ContactInfo, viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n form.classList.add('profile__edit-form--contact-info')\n\n const formState = toFormState(contactInfo)\n renderContactInfoEditTemplate(form, formState, viewerMode)\n\n return { form, formState }\n}\n\nfunction validateContactInfoBeforeSave(formState: ContactInfoFormState): string | null {\n const phoneOps = summarizeRowOps(formState.phones, rowHasContent)\n const emailOps = summarizeRowOps(formState.emails, rowHasContent)\n const addressOps = summarizeRowOps(formState.addresses, rowHasContent)\n const hasChanges =\n phoneOps.create.length > 0 || phoneOps.update.length > 0 || phoneOps.remove.length > 0 ||\n emailOps.create.length > 0 || emailOps.update.length > 0 || emailOps.remove.length > 0 ||\n addressOps.create.length > 0 || addressOps.update.length > 0 || addressOps.remove.length > 0\n\n if (!hasChanges) return 'No contact info changes detected.'\n return null\n}\n\n\nexport async function createContactInfoEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n contactInfo: ContactInfo,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState } = createContactInfoEditForm(contactInfo, viewerMode)\n\n const result = await openInputDialog({\n title: editContactInfoDialogTitleText,\n dom,\n form,\n headerAction: { type: 'close' },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n return validateContactInfoBeforeSave(formState)\n },\n onSave: async () => {\n const plan: ContactMutationPlan = {\n phoneOps: summarizeRowOps(formState.phones, rowHasContent),\n emailOps: summarizeRowOps(formState.emails, rowHasContent),\n addressOps: summarizeRowOps(formState.addresses, rowHasContent)\n }\n await processContactInfoMutations(store, subject, plan)\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveContactUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","type DateLike = string | { value?: string } | null | undefined\n\nlet descriptionResizeBound = false\n\nfunction toDateValue(date?: DateLike): string {\n if (!date) return ''\n if (typeof date === 'string') return date\n return date.value || ''\n}\n\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: the description needs to only show 2 lines and then more button\n please generate code for this. */\nexport function updateDescriptionOverflow(root: ParentNode = document) {\n const selectorGroups = [\n {\n wrap: '.cvDescriptionWrap',\n text: '.cvDescriptionText',\n toggle: '.cvDescriptionToggle'\n },\n {\n wrap: '.bioDescriptionWrap',\n text: '.bioDescriptionText',\n toggle: '.bioDescriptionToggle'\n }\n ]\n\n selectorGroups.forEach(({ wrap, text, toggle }) => {\n const wraps = root.querySelectorAll(wrap)\n wraps.forEach((container) => {\n const textEl = container.querySelector(text) as HTMLElement | null\n const button = container.querySelector(toggle) as HTMLButtonElement | null\n if (!textEl || !button) return\n\n const isExpanded = textEl.classList.contains('isExpanded')\n if (isExpanded) {\n button.hidden = false\n return\n }\n\n const isOverflowing = textEl.scrollHeight > textEl.clientHeight + 1\n button.hidden = !isOverflowing\n if (!isOverflowing) {\n button.setAttribute('aria-expanded', 'false')\n button.textContent = '...more'\n }\n })\n })\n}\n\nexport function scheduleDescriptionOverflowCheck() {\n if (typeof window === 'undefined') return\n window.requestAnimationFrame(() => updateDescriptionOverflow(window.document))\n\n if (!descriptionResizeBound) {\n window.addEventListener('resize', () => scheduleDescriptionOverflowCheck())\n descriptionResizeBound = true\n }\n}\n\nexport function toggleDescription(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n ;(event as any).stopImmediatePropagation?.()\n\n const button = event.currentTarget as HTMLButtonElement | null\n if (!button) return\n\n const descriptionId = button.getAttribute('aria-controls')\n if (!descriptionId) return\n\n const textEl = document.getElementById(descriptionId)\n if (!textEl) return\n\n const isExpanded = textEl.classList.toggle('isExpanded')\n button.setAttribute('aria-expanded', isExpanded ? 'true' : 'false')\n button.textContent = isExpanded ? '...less' : '...more'\n if (!isExpanded) {\n scheduleDescriptionOverflowCheck()\n }\n}\n\n/* Function below generated by AI Model: GPT-5.3-Codex */\n/* Prompt: write me a function to convert a date to Month, Year */\nexport function formatMonthYear(date?: DateLike): string {\n const value = toDateValue(date)\n if (!value) return ''\n\n const year = value.slice(0, 4)\n const month = value.slice(5, 7)\n const monthNames = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ]\n const monthIndex = Number(month) - 1\n\n if (!year || monthIndex < 0 || monthIndex > 11) return value\n return `${monthNames[monthIndex]}, ${year}`\n}\n\nexport function datesAsText(startDate?: DateLike, endDate?: DateLike): string {\n const startValue = toDateValue(startDate)\n if (!startValue) return ''\n\n const start = formatMonthYear(startDate)\n const end = toDateValue(endDate) ? formatMonthYear(endDate) : 'Present'\n return `${start} to ${end}`\n}\n\nexport function toMonthDateTime(date?: DateLike): string | undefined {\n const value = toDateValue(date)\n if (!value) return undefined\n return value.slice(0, 7)\n}\n","import { scheduleDescriptionOverflowCheck } from './sectionCardHelpers'\r\n\r\nexport function toggleCollapsibleSection(event: Event): void {\r\n const button = event.currentTarget as HTMLButtonElement | null\r\n const section = button?.closest('.profile-section-collapsible') as HTMLElement | null\r\n const panel = section?.querySelector('.profile-section-collapsible__content') as HTMLElement | null\r\n if (!button || !section || !panel) return\r\n\r\n const nextExpanded = section.getAttribute('data-expanded') !== 'true'\r\n section.setAttribute('data-expanded', String(nextExpanded))\r\n button.setAttribute('aria-expanded', String(nextExpanded))\r\n panel.setAttribute('aria-hidden', String(!nextExpanded))\r\n\r\n if (nextExpanded && typeof window !== 'undefined') {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n scheduleDescriptionOverflowCheck()\r\n })\r\n })\r\n }\r\n}","import { html } from 'lit-html'\nimport { ViewerMode } from '../../types'\nimport { createContactInfoEditDialog } from './ContactInfoEditDialog'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { contactInfoEmptyHeadingText, contactInfoHeadingText } from '../../texts'\nimport { toggleCollapsibleSection } from '../shared/collapsibleSection'\nimport { ContactInfo } from './types'\nimport { normalizeEmailTypeForEdit, normalizePhoneTypeForEdit } from '../shared/contactTypeUtils'\nimport { addIcon, editIcon, envelopeIcon, locationIcon, plusIcon } from '../../icons-svg/profileIcons'\nimport { emailIcon, phoneIcon } from '../../icons-svg/contactIcons'\n\nfunction toText(value: unknown): string {\n if (!value) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'object' && 'value' in (value as Record<string, unknown>)) {\n const v = (value as { value?: unknown }).value\n return typeof v === 'string' ? v : ''\n }\n return ''\n}\nfunction normalizeContactValue(rawValue: string, kind: 'email' | 'phone'): string {\n if (!rawValue) return ''\n return kind === 'email'\n ? rawValue.replace(/^mailto:/i, '')\n : rawValue.replace(/^tel:/i, '')\n}\n\nfunction resolveContactValue(store: LiveStore, point: any, kind: 'email' | 'phone'): string {\n if (!point) return ''\n\n const directValue = toText(point.valueNode || point.entryNode).trim()\n const looksLikeExpectedValue = kind === 'email'\n ? /^mailto:/i.test(directValue) || /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(directValue)\n : /^tel:/i.test(directValue) || /^[+()\\-\\s\\d]{5,}$/.test(directValue)\n\n if (looksLikeExpectedValue) {\n return normalizeContactValue(directValue, kind)\n }\n\n const entryNode = point.entryNode || point.valueNode\n if (entryNode) {\n const storedValueNode = store.any(entryNode as NamedNode, ns.vcard('value'))\n const storedValue = toText(storedValueNode).trim()\n if (storedValue) return normalizeContactValue(storedValue, kind)\n }\n\n return normalizeContactValue(directValue, kind)\n}\n\n\nfunction renderPhone(phone, store: LiveStore) {\n if (!phone) return html``\n const phoneValue = resolveContactValue(store, phone, 'phone')\n const phoneType = normalizePhoneTypeForEdit(phone.type)\n\n return html`<li class=\"contact-info__item flex gap-2xs\" role=\"listitem\">\n <div class=\"contact-info__icon-wrapper flex-center\">\n <span class=\"contact-info__icon\" aria-hidden=\"true\">${phoneIcon}</span>\n </div>\n <div class=\"flex-column\">\n <span class=\"contact-info__contact-point-value\">${phoneValue}</span>\n ${phoneType ? html`<span class=\"contact-info__contact-point-type\"> ${phoneType}</span>` : html``}\n </div>\n </li>`\n}\n\nfunction renderPhones(phones, store: LiveStore) {\n if (!phones || !phones.length || !phones[0]) return html``\n return html`${renderPhone(phones[0], store)}${phones.length > 1 ? renderPhones(phones.slice(1), store) : html``}`\n}\n\nfunction renderEmail(email, store: LiveStore) {\n if (!email) return html``\n const emailValue = resolveContactValue(store, email, 'email')\n const emailType = normalizeEmailTypeForEdit(email.type)\n\n return html`<li class=\"contact-info__item flex gap-2xs\" role=\"listitem\">\n <div class=\"contact-info__icon-wrapper flex-center\">\n <span class=\"contact-info__icon\" aria-hidden=\"true\">${emailIcon}</span>\n </div>\n <div class=\"flex-column\">\n <span class=\"contact-info__contact-point-value\">${emailValue}</span>\n ${emailType ? html`<span class=\"contact-info__contact-point-type\">${emailType}</span>` : html``}\n </div>\n </li>`\n}\n\nfunction renderEmails(emails, store: LiveStore) {\n if (!emails || !emails.length || !emails[0]) return html``\n return html`${renderEmail(emails[0], store)}${emails.length > 1 ? renderEmails(emails.slice(1), store) : html``}`\n}\n\nfunction renderAddress(address) {\n if (!address) return html``\n const streetAddress = toText(address.streetAddress || address.fullAddress).trim()\n const locality = toText(address.locality).trim()\n const region = toText(address.region).trim()\n const postalCode = toText(address.postalCode).trim()\n const countryName = toText(address.countryName).trim()\n\n const localityRegion = [locality, region].filter(Boolean).join(', ')\n const localityRegionPostal = [localityRegion, postalCode].filter(Boolean).join(' ')\n\n return html`\n <li class=\"contact-info__item flex gap-2xs\" role=\"listitem\">\n <div class=\"contact-info__icon-wrapper flex-center\">\n <span class=\"contact-info__icon\" aria-hidden=\"true\">${locationIcon}</span>\n </div>\n <span class=\"contact-info__address\">\n ${streetAddress ? html`${streetAddress}<br />` : html``}\n ${localityRegionPostal ? html`${localityRegionPostal}<br />` : html``}\n ${countryName}\n </span>\n </li>`\n}\n\nfunction renderAddresses(addresses) {\n if (!addresses || !addresses.length || !addresses[0]) return html``\n return html`${renderAddress(addresses[0])}${addresses.length > 1 ? renderAddresses(addresses.slice(1)) : html``}`\n}\n\nfunction renderContactInfoSectionDefault(\n store: LiveStore, \n subject: NamedNode, \n contactInfo: ContactInfo,\n viewerMode: ViewerMode, \n onSaved?: () => Promise<void> | void) {\n const hasAnyContactInfo =\n contactInfo?.emails.length > 0 ||\n contactInfo?.phones.length > 0 ||\n contactInfo?.addresses.length > 0\n const isOwner = viewerMode === 'owner'\n\n return html`\n <section\n aria-labelledby=\"contact-details-heading\"\n class=\"profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions\"\n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"contact-details-heading\" tabindex=\"-1\">${contactInfoHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n ${isOwner ? html`\n <button \n type=\"button\" \n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\" \n aria-label=\"Edit contact information\"\n @click=${(event: Event) => {\n return createContactInfoEditDialog(\n event,\n store,\n subject,\n contactInfo,\n viewerMode,\n onSaved\n )\n }}>\n <span class=\"profile-section-collapsible__edit-label\">${editIcon} Edit</span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n ` : html``}\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle contact information section\"\n aria-controls=\"contact-details-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"contact-details-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${contactInfo.phones.length > 0\n ? html`\n <ul class=\"contact-info__list flex-column\" role=\"list\" aria-label=\"Phone numbers\">\n ${renderPhones(contactInfo.phones, store)}\n </ul>\n `\n : html``}\n ${contactInfo.emails.length > 0\n ? html`\n <ul class=\"contact-info__list flex-column\" role=\"list\" aria-label=\"Email addresses\">\n ${renderEmails(contactInfo.emails, store)}\n </ul>\n `\n : html``}\n ${contactInfo.addresses.length > 0\n ? html`\n <ul class=\"contact-info__list flex-column\" role=\"list\" aria-label=\"Postal addresses\">\n ${renderAddresses(contactInfo.addresses)}\n </ul>\n `\n : html``}\n ${hasAnyContactInfo ? html`` : html`<p>No contact details added yet.</p>`}\n </div>\n </section>\n `\n}\n\nfunction renderOwnerEmptyContactInfoContent(\n _store: LiveStore,\n _subject: NamedNode,\n _contactInfo: ContactInfo,\n _viewerMode: ViewerMode,\n _onSaved?: () => Promise<void> | void\n) {\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty contact information section\"> \n <div class=\"contact-info__empty-icon-wrapper\">\n <span class=\"contact-info__empty-icon inline-flex-row\">${envelopeIcon}</span>\n </div>\n <p class=\"profile__empty-state-message contact-info__empty-message\">\n No additional contact info added yet.\n </p>\n </div>\n `\n}\n\nfunction renderOwnerEmptyContactInfoSection(\n store: LiveStore,\n subject: NamedNode,\n contactInfo: ContactInfo,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"contact-details-heading\" \n data-profile-section=\"contact-info\"\n class=\"profile__section--empty border-lighter rounded-md gap-lg profile-section-collapsible profile-section-collapsible--inline-mobile-actions\" \n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"contact-details-heading\" tabindex=\"-1\">${contactInfoEmptyHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add contact information\"\n @click=${(event: Event) => {\n return createContactInfoEditDialog(\n event,\n store,\n subject,\n contactInfo,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile-section-collapsible__edit-label\">${addIcon} Add Contact</span>\n <span class=\"profile-section-collapsible__edit-icon profile-section-collapsible__edit-icon--add\" aria-hidden=\"true\">${plusIcon}</span>\n </button>\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle contact information section\"\n aria-controls=\"contact-details-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"contact-details-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${renderOwnerEmptyContactInfoContent(store, subject, contactInfo, viewerMode, onSaved)}\n </div>\n </section>\n `\n}\n\nexport function renderContactInfoSection(\n store: LiveStore,\n subject: NamedNode,\n contactInfo: ContactInfo,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const safeContactInfo = {\n emails: contactInfo?.emails || [],\n phones: contactInfo?.phones || [],\n addresses: contactInfo?.addresses || []\n }\n const hasAnyContactInfo =\n safeContactInfo.emails.length > 0 ||\n safeContactInfo.phones.length > 0 ||\n safeContactInfo.addresses.length > 0\n const showOwnerEmptyContactInfo = !hasAnyContactInfo && viewerMode === 'owner'\n const showSection = true\n \n return showSection ? html`\n ${showOwnerEmptyContactInfo\n ? renderOwnerEmptyContactInfoSection(store, subject, safeContactInfo, viewerMode, onSaved)\n : renderContactInfoSectionDefault(store, subject, safeContactInfo, viewerMode, onSaved)}\n ` : ''\n \n}\n","import { blankNode, LiveStore, NamedNode, st, sym, literal } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { LanguageRow } from './types'\nimport { MutationOps } from '../shared/types'\nimport { presentLanguages } from './selectors'\nimport { expandRdfList } from '../shared/rdfList'\nimport { createIdNode } from '../shared/idNodeFactory'\nimport { mutationSaveLanguagesFailedPrefixText } from '../../texts'\n\nexport type LanguageMutationPlan = MutationOps<LanguageRow>\n// Language entries are serialized as an ordered rdf:List of id nodes, where\n// each id node points to an IANA URI via solid:publicId.\nconst LANGUAGE_IANA_NS = 'https://www.w3.org/ns/iana/language-code/'\n\nfunction ensureLanguagePrefix(store: LiveStore) {\n const registerPrefix = (target: any) => {\n if (!target) return\n if (typeof target.setPrefixForURI === 'function') {\n target.setPrefixForURI('l', LANGUAGE_IANA_NS)\n return\n }\n if (!target.namespaces) {\n target.namespaces = {}\n }\n target.namespaces.l = LANGUAGE_IANA_NS\n }\n\n const anyStore = store as any\n registerPrefix(anyStore)\n registerPrefix(anyStore?.updater?.store)\n}\n\nfunction normalizeText(value: string | undefined): string {\n return (value || '').trim()\n}\n\nfunction normalizeLanguageCode(value: string | undefined): string {\n const normalized = normalizeText(value).toLowerCase()\n if (!normalized) return ''\n\n if (normalized.startsWith(LANGUAGE_IANA_NS)) {\n return normalized.slice(LANGUAGE_IANA_NS.length)\n }\n\n return normalized\n}\n\nfunction rowsFromOrderedInput(orderedRows: LanguageRow[]): LanguageRow[] {\n return (orderedRows || [])\n .filter((row) => row.status !== 'deleted')\n .filter((row) => Boolean(normalizeText(row.publicId) || normalizeText(row.name) || normalizeText(row.entryNode)))\n .map((row) => ({\n ...row,\n name: normalizeText(row.name),\n publicId: normalizeText(row.publicId),\n proficiency: normalizeText(row.proficiency),\n entryNode: normalizeText(row.entryNode)\n }))\n}\n\nfunction buildRdfListStatements(items: NamedNode[], doc: NamedNode) {\n if (!items.length) {\n return {\n head: ns.rdf('nil'),\n statements: [] as any[]\n }\n }\n\n const listNodes = items.map(() => blankNode())\n const statements: any[] = []\n\n items.forEach((item, index) => {\n const current = listNodes[index]\n const next = listNodes[index + 1] || ns.rdf('nil')\n statements.push(st(current as any, ns.rdf('first'), item as any, doc))\n statements.push(st(current as any, ns.rdf('rest'), next as any, doc))\n })\n\n return {\n head: listNodes[0],\n statements\n }\n}\n\nfunction buildLanguageStatements(subject: NamedNode, doc: NamedNode, rows: LanguageRow[]) {\n const languageRows = rows\n .map((row) => ({\n name: normalizeText(row.name),\n publicId: normalizeLanguageCode(row.publicId),\n }))\n .filter((row) => Boolean(row.publicId))\n\n if (languageRows.length === 0) return []\n\n const entryNodes = languageRows.map(() => createIdNode(doc))\n const statements: any[] = []\n\n const rdfList = buildRdfListStatements(entryNodes, doc)\n statements.push(st(subject, ns.schema('knowsLanguage'), rdfList.head as any, doc))\n statements.push(...rdfList.statements)\n\n entryNodes.forEach((entryNode, index) => {\n const publicIdNode = sym(`${LANGUAGE_IANA_NS}${languageRows[index].publicId}`)\n statements.push(st(entryNode, ns.solid('publicId'), publicIdNode, doc))\n if (languageRows[index].name) {\n statements.push(st(publicIdNode, ns.schema('name'), literal(languageRows[index].name, 'en'), doc))\n }\n })\n\n return statements\n}\n\nfunction collectListChainNodes(store: LiveStore, listHead: any, doc: NamedNode): any[] {\n const visited = new Set<string>()\n const nodes: any[] = []\n let current = listHead\n\n while (current) {\n const key = `${current.termType}:${current.value}`\n if (visited.has(key)) break\n visited.add(key)\n nodes.push(current)\n\n const rest = store.any(current as NamedNode, ns.rdf('rest'), null, doc) as any\n if (!rest || (rest.termType === 'NamedNode' && rest.value === ns.rdf('nil').value)) {\n break\n }\n current = rest\n }\n\n return nodes\n}\n\nfunction isPatchFailure(message: string): boolean {\n const text = (message || '').toLowerCase()\n // Different pods surface PATCH incompatibility with different status codes/messages.\n return text.includes(' on patch ') || text.includes('web error: 501') || text.includes('web error: 405') || text.includes('web error: 400')\n}\n\nfunction isMissingGetRecordError(message: string): boolean {\n return (message || '').toLowerCase().includes('no record of our http get request for document')\n}\n\nfunction statementKey(statement: any): string {\n return `${statement.subject?.toNT?.() || statement.subject?.value} ${statement.predicate?.toNT?.() || statement.predicate?.value} ${statement.object?.toNT?.() || statement.object?.value} ${statement.why?.toNT?.() || statement.why?.value}`\n}\n\nfunction sanitizePatchStatements(store: LiveStore, deletions: any[], insertions: any[]) {\n const safeDeletions = Array.from(new Map(\n (deletions || [])\n .filter((statement) => {\n if (!statement || !statement.subject || !statement.predicate || !statement.object) return false\n if (store.holds(statement.subject, statement.predicate, statement.object, statement.why)) return true\n return store.statementsMatching(statement.subject, statement.predicate, statement.object, statement.why).length > 0\n })\n .map((statement) => [statementKey(statement), statement])\n ).values())\n\n const safeInsertions = Array.from(new Map(\n (insertions || [])\n .filter((statement) => Boolean(statement && statement.subject && statement.predicate && statement.object))\n .map((statement) => [statementKey(statement), statement])\n ).values())\n\n return { safeDeletions, safeInsertions }\n}\n\nasync function runPutFallback(store: LiveStore, doc: NamedNode, deletions: any[], insertions: any[]) {\n const updater = store.updater as any\n const fetcher = (store as any).fetcher\n\n if (!updater || typeof updater.serialize !== 'function' || !fetcher || typeof fetcher.webOperation !== 'function') {\n throw new Error('Language updates are not supported by this store updater.')\n }\n\n const currentStatements = store.statementsMatching(undefined, undefined, undefined, doc).slice()\n const deletionKeys = new Set((deletions || []).map((statement) => statementKey(statement)))\n // Rebuild full document state for PUT when patch-oriented flows cannot be used.\n const nextStatements = currentStatements.filter((statement) => !deletionKeys.has(statementKey(statement))).concat(insertions || [])\n\n const contentType = 'text/turtle'\n const body = updater.serialize(doc.value, nextStatements, contentType)\n const response = await fetcher.webOperation('PUT', doc.value, {\n noMeta: true,\n contentType,\n body\n })\n\n if (!response || response.ok !== true) {\n const status = response?.status || 'unknown'\n throw new Error(`Web error: ${status} on PUT of <${doc.value}>`)\n }\n\n // PUT bypasses UpdateManager's local-store patching, so apply the same changes locally.\n store.remove(deletions)\n insertions.forEach((statement) => {\n store.add(statement.subject, statement.predicate, statement.object, statement.why)\n })\n}\n\nasync function runUpdateWithDavFallback(store: LiveStore, doc: NamedNode, deletions: any[], insertions: any[]) {\n const updater = store.updater as any\n if (!updater || typeof updater.update !== 'function') {\n throw new Error('Language updates are not supported by this store updater.')\n }\n\n const { safeDeletions, safeInsertions } = sanitizePatchStatements(store, deletions, insertions)\n if (safeDeletions.length === 0 && safeInsertions.length === 0) {\n return\n }\n\n const tryUpdate = () => new Promise<void>((resolve, reject) => {\n updater.update(safeDeletions, safeInsertions, (_uri: string, ok: boolean, message?: string) => {\n if (ok === true) {\n resolve()\n return\n }\n reject(new Error(message || 'Failed to save languages'))\n })\n })\n\n try {\n // Preferred path: let rdflib pick the server-supported update protocol.\n await tryUpdate()\n return\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (!isPatchFailure(message) || typeof updater.updateDav !== 'function') {\n throw error\n }\n\n if (store.fetcher && typeof (store.fetcher as any).load === 'function') {\n try {\n await (store.fetcher as any).load(doc)\n } catch {\n // Continue; updateDav may still fail and we handle that below.\n }\n }\n\n try {\n // First fallback for PATCH failures: DAV-style whole-document update.\n await new Promise<void>((resolve, reject) => {\n updater.updateDav(doc, safeDeletions, safeInsertions, (_uri: string, ok: boolean, body?: string) => {\n if (ok === true) {\n resolve()\n return\n }\n reject(new Error(body || message || 'Failed to save languages'))\n })\n })\n } catch (davError) {\n const davMessage = davError instanceof Error ? davError.message : String(davError)\n if (!isMissingGetRecordError(davMessage)) {\n throw davError\n }\n // Some stores cannot run updateDav without prior fetch metadata; use direct PUT.\n await runPutFallback(store, doc, safeDeletions, safeInsertions)\n }\n }\n}\n\nfunction mergeLanguageOps(existingRows: LanguageRow[], languageOps: MutationOps<LanguageRow>): LanguageRow[] {\n const byEntryNode = new Map<string, LanguageRow>()\n existingRows.forEach((row) => {\n byEntryNode.set(row.entryNode, row)\n })\n\n languageOps.remove.forEach((row) => {\n if (!row.entryNode) return\n byEntryNode.delete(row.entryNode)\n })\n\n languageOps.update.forEach((row) => {\n if (!row.entryNode) return\n if (!byEntryNode.has(row.entryNode)) return\n byEntryNode.set(row.entryNode, row)\n })\n\n languageOps.create.forEach((row) => {\n if (!normalizeText(row.publicId)) return\n byEntryNode.set(`new:${row.name}:${Math.random()}`, {\n ...row,\n publicId: normalizeText(row.publicId),\n proficiency: normalizeText(row.proficiency)\n })\n })\n\n const dedupedByLanguage = new Map<string, LanguageRow>()\n Array.from(byEntryNode.values()).forEach((row) => {\n const publicId = normalizeText(row.publicId)\n if (!publicId) return\n if (!dedupedByLanguage.has(publicId)) {\n dedupedByLanguage.set(publicId, {\n ...row,\n publicId,\n proficiency: normalizeText(row.proficiency)\n })\n }\n })\n\n return Array.from(dedupedByLanguage.values())\n}\n\nasync function mutateLanguageEntries(\n store: LiveStore,\n subject: NamedNode,\n languageOps: MutationOps<LanguageRow>,\n orderedRows?: LanguageRow[]\n) {\n ensureLanguagePrefix(store)\n const doc = subject.doc()\n const existingRows = presentLanguages(subject, store).map((detail) => ({\n name: normalizeText(detail.name),\n publicId: normalizeText(detail.publicId),\n proficiency: normalizeText(detail.proficiency),\n entryNode: detail.entryNode.value,\n status: 'existing' as const\n }))\n const nextRows = orderedRows && orderedRows.length\n ? rowsFromOrderedInput(orderedRows)\n : mergeLanguageOps(existingRows, languageOps)\n\n const listObjects = store.each(subject, ns.schema('knowsLanguage'), null, doc)\n const existingListHeads = listObjects.filter((node) => node.termType === 'BlankNode' || node.termType === 'NamedNode')\n\n const existingListNodes = Array.from(new Map(\n existingListHeads\n .flatMap((node) => collectListChainNodes(store, node, doc))\n .map((node) => [`${node.termType}:${node.value}`, node])\n ).values())\n\n const existingLanguageNodes = Array.from(new Set(\n listObjects\n .flatMap((node) => expandRdfList(store, node))\n .filter((node) => node.termType === 'NamedNode' || node.termType === 'BlankNode')\n .map((node) => `${node.termType}:${node.value}`)\n )).map((key) => {\n const [termType, ...rest] = key.split(':')\n const value = rest.join(':')\n return termType === 'BlankNode' ? store.bnode(value) : store.sym(value)\n })\n\n const existingPublicIdNodes = Array.from(new Map(\n existingLanguageNodes\n .map((node) => store.any(node as NamedNode, ns.solid('publicId'), null, doc))\n .filter((node): node is NamedNode => Boolean(node && node.termType === 'NamedNode'))\n .map((node) => [`${node.termType}:${node.value}`, node])\n ).values())\n\n const deletions = store.statementsMatching(subject, ns.schema('knowsLanguage'), null, doc)\n existingListNodes.forEach((node) => {\n deletions.push(...store.statementsMatching(node as any, null, null, doc))\n })\n existingLanguageNodes.forEach((node) => {\n // Remove old language-entry statements so save always rewrites canonical shape.\n deletions.push(...store.statementsMatching(node as NamedNode, null, null, doc))\n })\n existingPublicIdNodes.forEach((node) => {\n // Language labels are attached to the publicId resource (l:xx) and should be removed for deleted rows.\n deletions.push(...store.statementsMatching(node as NamedNode, ns.schema('name'), null, doc))\n })\n const insertions = buildLanguageStatements(subject, doc, nextRows)\n\n await runUpdateWithDavFallback(store, doc, deletions, insertions)\n}\n\nexport async function processLanguageMutations(\n store: LiveStore,\n subject: NamedNode,\n mutationPlan: LanguageMutationPlan,\n orderedRows?: LanguageRow[]\n) {\n try {\n await mutateLanguageEntries(store, subject, mutationPlan, orderedRows)\n\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${mutationSaveLanguagesFailedPrefixText} ${message}`)\n }\n} \n","import { openInputDialog } from '../../ui/dialog'\nimport { html, render } from 'lit-html'\nimport { LanguageDetails, LanguageRow } from './types'\nimport '../../styles/EditDialogs.css'\nimport '../../styles/ContactInfoEditDialog.css'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { applyRowFieldChange, applyRowSelectChange, deleteRow, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText } from '../../textUtils'\nimport { MutationOps } from '../shared/types'\nimport { processLanguageMutations } from './mutations'\nimport { bentoIcon, trashIcon } from '../../icons-svg/profileIcons'\nimport {\n deleteEntryButtonTitleText,\n dialogCancelLabelText,\n dialogSubmitLabelText,\n editLanguagesDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n saveLanguageUpdatesFailedPrefixText,\n} from '../../texts'\n\ntype LanguageFormState = {\n languages: LanguageRow[]\n initialExistingOrder: string[]\n}\n\ntype LanguageSuggestion = {\n name: string\n publicId: string\n code: string\n}\n\nconst WIKIDATA_LANGUAGE_ENDPOINT = 'https://query.wikidata.org/sparql'\nconst LANGUAGE_OBJECT_URI_BASE = 'https://www.w3.org/ns/iana/language-code/'\n\ntype LanguageEditableField = 'name' | 'proficiency'\n\ntype LanguageRerenderOptions = {\n focusSelector?: string\n}\n\nfunction sanitizeLanguageFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n\nfunction rowHasContent(row: LanguageRow): boolean {\n return [\n row.name,\n row.publicId,\n row.proficiency\n ].some(hasNonEmptyText)\n}\n\nfunction normalizeLanguageCode(value: string): string {\n return (value || '').trim().toLowerCase()\n}\n\nfunction normalizeSuggestionKey(value: string): string {\n return sanitizeLanguageFieldValue(value)\n .toLowerCase()\n .replace(/\\(.*?\\)/g, ' ')\n .replace(/[^a-z\\s-]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\nfunction escapeSparqlRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction buildLanguageSearchQuery(name: string): string {\n const escapedName = escapeSparqlRegex(name)\n return `SELECT ?item ?subject ?name WHERE {\n ?item wdt:P305 ?subject .\n OPTIONAL {\n ?item rdfs:label ?name .\n FILTER(langMatches(lang(?name), \"en\"))\n }\n FILTER regex(?name, \"${escapedName}\", \"i\")\n FILTER regex(?subject, \"^..$\", \"i\")\n } LIMIT 12`\n}\n\nfunction buildLanguagePublicId(subjectValue: string): string {\n const value = (subjectValue || '').trim()\n if (!value) return ''\n if (value.startsWith('http://') || value.startsWith('https://')) return value\n return `${LANGUAGE_OBJECT_URI_BASE}${normalizeLanguageCode(value)}`\n}\n\nfunction preferredBindingValue(binding: any, key: string): string {\n const value = binding?.[key]?.value\n return typeof value === 'string' ? value : ''\n}\n\nasync function fetchLanguageSuggestions(term: string): Promise<LanguageSuggestion[]> {\n const queryTerm = sanitizeLanguageFieldValue(term)\n if (queryTerm.length < 2 || typeof fetch !== 'function') return []\n\n const params = new URLSearchParams({\n query: buildLanguageSearchQuery(queryTerm),\n format: 'json'\n })\n\n try {\n const response = await fetch(`${WIKIDATA_LANGUAGE_ENDPOINT}?${params.toString()}`, {\n headers: { Accept: 'application/sparql-results+json, application/json' }\n })\n if (!response.ok) return []\n\n const payload = await response.json() as any\n const bindings = Array.isArray(payload?.results?.bindings) ? payload.results.bindings : []\n const seen = new Set<string>()\n\n return bindings\n .map((binding: any) => {\n const code = normalizeLanguageCode(preferredBindingValue(binding, 'subject'))\n const publicId = buildLanguagePublicId(code)\n const name = sanitizeLanguageFieldValue(preferredBindingValue(binding, 'name') || code)\n return { name, publicId, code }\n })\n .filter((item: LanguageSuggestion) => {\n if (!item.name || !item.publicId || item.code.length !== 2) return false\n const key = item.publicId.toLowerCase()\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n } catch {\n return []\n }\n}\n\nfunction matchLanguageSuggestion(suggestions: LanguageSuggestion[], value: string): LanguageSuggestion | null {\n const normalized = sanitizeLanguageFieldValue(value).toLowerCase()\n if (!normalized) return null\n\n const exact = suggestions.find((suggestion) => suggestion.name.toLowerCase() === normalized)\n if (exact) return exact\n\n const normalizedKey = normalizeSuggestionKey(value)\n if (!normalizedKey) return null\n\n return suggestions.find((suggestion) => normalizeSuggestionKey(suggestion.name) === normalizedKey) || null\n}\n\nfunction toFormState(details: LanguageDetails[]): LanguageFormState {\n const rows = (details || [])\n .map((detail) => ({\n name: sanitizeLanguageFieldValue(toText(detail.name)),\n publicId: sanitizeLanguageFieldValue(toText(detail.publicId)),\n proficiency: sanitizeLanguageFieldValue(toText(detail.proficiency)),\n entryNode: toText(detail.entryNode),\n status: toText(detail.entryNode) ? 'existing' as const : 'new' as const\n }))\n .filter((row) => Boolean(row.name || row.entryNode || row.proficiency || row.publicId))\n\n \n return {\n languages: rows.length ? rows : [{ name: '', publicId: '', proficiency: '', entryNode: '', status: 'new' }],\n initialExistingOrder: [],\n }\n}\n\nfunction hasOrderChanged(rows: LanguageRow[], initialExistingOrder: string[]): boolean {\n const currentExistingOrder = rows\n .filter((row) => row.status !== 'deleted' && Boolean((row.entryNode || '').trim()))\n .map((row) => (row.entryNode || '').trim())\n\n if (currentExistingOrder.length !== initialExistingOrder.length) return true\n\n for (let i = 0; i < currentExistingOrder.length; i++) {\n if (currentExistingOrder[i] !== initialExistingOrder[i]) return true\n }\n\n return false\n}\n\nfunction validateLanguagesBeforeSave(rows: LanguageRow[], initialExistingOrder: string[]): string | null {\n const ops = summarizeRowOps(rows, rowHasContent)\n const hasChanges = ops.create.length > 0 || ops.update.length > 0 || ops.remove.length > 0\n const orderChanged = hasOrderChanged(rows, initialExistingOrder)\n if (!hasChanges && !orderChanged) return 'No language changes detected.'\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n if (!row || row.status === 'deleted') continue\n if (!hasNonEmptyText(row.name)) continue\n if (!hasNonEmptyText(row.publicId)) {\n return `Language ${i + 1}: please choose a language from the suggestions list.`\n }\n }\n\n return null\n}\n\nfunction hasInvalidLanguageSelection(rows: LanguageRow[]): boolean {\n return rows.some((row) => {\n if (!row || row.status === 'deleted') return false\n if (!hasNonEmptyText(row.name)) return false\n return !hasNonEmptyText(row.publicId)\n })\n}\n\nfunction updateLanguagesSubmitEnabled(rows: LanguageRow[]): void {\n const submitButton = document.querySelector('#profile-modal #modal-buttons button.btn-primary') as HTMLButtonElement | null\n if (!submitButton) return\n submitButton.disabled = hasInvalidLanguageSelection(rows)\n}\n\nfunction focusLanguageField(form: HTMLFormElement, selector: string): void {\n const nextField = form.querySelector(selector) as HTMLElement | null\n if (!nextField || typeof nextField.focus !== 'function') return\n\n nextField.scrollIntoView({ block: 'start', behavior: 'auto' })\n nextField.focus()\n if (nextField instanceof HTMLInputElement || nextField instanceof HTMLTextAreaElement) {\n nextField.select()\n }\n}\n\ntype ContactLanguageInputRowProps = {\n rows: LanguageRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n onChange: () => void\n onSearch: (index: number, term: string) => void\n suggestions: LanguageSuggestion[]\n onDragStart: (index: number) => void\n onDragOver: (event: DragEvent) => void\n onDrop: (index: number) => void\n onDragEnd: () => void\n isDropTarget: boolean\n}\n\nfunction renderLanguageInputRow({\n rows,\n index,\n displayIndex,\n onDelete,\n onChange,\n onSearch,\n suggestions,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n isDropTarget\n}: ContactLanguageInputRowProps) {\n const row = rows[index]\n const label = `Language ${displayIndex + 1}`\n const proficiencyLabel = `Language Proficiency ${displayIndex + 1}`\n const languageName = `language-${index}`\n const proficiencyInputName = `proficiency-${index}`\n const proficiencySelectId = `proficiency-${index}`\n const datalistId = `language-suggestions-${index}`\n const hasSelectionIssue = Boolean(row && row.status !== 'deleted' && hasNonEmptyText(row.name) && !hasNonEmptyText(row.publicId))\n\n const handleLanguageInput = (field: LanguageEditableField) => (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeLanguageFieldValue(target.value)\n if (rows[index]) {\n applyRowFieldChange(rows[index], field, nextValue, rowHasContent)\n const matchedSuggestion = matchLanguageSuggestion(suggestions, nextValue)\n rows[index].publicId = matchedSuggestion?.publicId || ''\n if (matchedSuggestion) {\n rows[index].name = sanitizeLanguageFieldValue(matchedSuggestion.name)\n }\n onSearch(index, nextValue)\n onChange()\n }\n }\n\n const handleLanguageChange = (field: LanguageEditableField) => (e: Event) => {\n handleLanguageInput(field)(e)\n }\n\n const handleProficiencyInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextType = target.value\n if (rows[index]) {\n applyRowSelectChange(rows[index], 'proficiency', nextType)\n onChange()\n }\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n return html`\n <div\n class=\"profile-edit-dialog__row profile-edit-dialog__row--language ${isDropTarget ? 'profile-edit-dialog__row--drop-target' : ''}\"\n @dragover=${(event: DragEvent) => onDragOver(event)}\n @drop=${() => onDrop(index)}\n >\n <button\n type=\"button\"\n class=\"profile-edit-dialog__drag-handle\"\n aria-label=${`Reorder language ${displayIndex + 1}`}\n title=\"Drag to reorder\"\n draggable=\"true\"\n @dragstart=${() => onDragStart(index)}\n @dragend=${() => onDragEnd()}\n >\n ${bentoIcon}\n </button>\n <label aria-label=${`${label} Language`} class=\"label profile-edit-dialog__field\">\n <input\n class=\"input\"\n type=\"text\"\n name=${languageName}\n .value=${row?.name || ''}\n required\n data-contact-field=\"name\"\n data-entry-node=${row?.entryNode || ''}\n data-row-status=${row?.status || 'n/a'}\n placeholder=\"Language\"\n autocomplete=\"off\"\n list=${datalistId}\n inputmode=\"text\"\n aria-invalid=${hasSelectionIssue ? 'true' : 'false'}\n @input=${handleLanguageInput('name')}\n @change=${handleLanguageChange('name')}\n />\n <datalist id=${datalistId}>\n ${suggestions.map((suggestion) => html`<option value=${suggestion.name}></option>`)}\n </datalist>\n <small class=\"profile-edit-dialog__input-help-text\">Type to search and select one language suggestion.</small>\n </label>\n <label aria-label=${proficiencyLabel} class=\"label\" hidden>\n <select name=${proficiencyInputName} id=${proficiencySelectId} @change=${handleProficiencyInput} .value=${row?.proficiency || ''}>\n <option value=\"Basic\">Basic</option>\n <option value=\"Intermediate\">Intermediate</option>\n <option value=\"Fluent\">Fluent</option>\n </select>\n </label>\n <div class=\"profile-edit-dialog__actions profile-edit-dialog__actions--edge\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete language ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n `\n}\n\nfunction renderLanguageSection(\n rows: LanguageRow[],\n onAddRow: (options?: LanguageRerenderOptions) => void,\n suggestionByIndex: Record<number, LanguageSuggestion[]>,\n onSearch: (index: number, term: string) => void\n) {\n let dragSourceIndex: number | null = null\n let dropTargetIndex: number | null = null\n\n const reorderRows = (from: number, to: number) => {\n if (from === to) return\n const row = rows[from]\n if (!row) return\n rows.splice(from, 1)\n rows.splice(to, 0, row)\n\n Object.keys(suggestionByIndex).forEach((key) => {\n delete suggestionByIndex[Number(key)]\n })\n }\n\n const handleDragStart = (index: number) => {\n dragSourceIndex = index\n dropTargetIndex = index\n }\n\n const handleDragOver = (event: DragEvent) => {\n event.preventDefault()\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move'\n }\n }\n\n const handleDrop = (index: number) => {\n if (dragSourceIndex === null) return\n reorderRows(dragSourceIndex, index)\n dragSourceIndex = null\n dropTargetIndex = null\n onAddRow()\n }\n\n const handleDragEnd = () => {\n dragSourceIndex = null\n dropTargetIndex = null\n }\n\n const visibleRows = rows\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => row.status !== 'deleted')\n\n return html`\n <section class=\"profile-edit-dialog__section\" aria-label=\"Languages\">\n <fieldset>\n <legend class=\"sr-only\">Language entries</legend>\n ${visibleRows.map(({ index }, displayIndex) => renderLanguageInputRow({\n rows,\n index,\n displayIndex,\n onChange: onAddRow,\n onSearch,\n suggestions: suggestionByIndex[index] || [],\n onDragStart: handleDragStart,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n onDragEnd: handleDragEnd,\n isDropTarget: dropTargetIndex === index,\n onDelete: () => {\n deleteRow(rows, index)\n delete suggestionByIndex[index]\n onAddRow()\n }\n }))}\n </fieldset>\n </section>\n `\n}\n\nfunction renderLanguageEditTemplate(\n form: HTMLFormElement,\n formState: LanguageFormState,\n viewerMode: ViewerMode,\n options: LanguageRerenderOptions = {}\n) {\n const formStateWithSearch = formState as LanguageFormState & {\n suggestionByIndex?: Record<number, LanguageSuggestion[]>\n searchSeqByIndex?: Record<number, number>\n searchTimerByIndex?: Record<number, ReturnType<typeof setTimeout>>\n }\n\n const suggestionByIndex = formStateWithSearch.suggestionByIndex || (formStateWithSearch.suggestionByIndex = {})\n const searchSeqByIndex = formStateWithSearch.searchSeqByIndex || (formStateWithSearch.searchSeqByIndex = {})\n const searchTimerByIndex = formStateWithSearch.searchTimerByIndex || (formStateWithSearch.searchTimerByIndex = {})\n\n const rerender = (nextOptions: LanguageRerenderOptions = {}) => renderLanguageEditTemplate(form, formState, viewerMode, nextOptions)\n const onSearch = (index: number, term: string) => {\n if (searchTimerByIndex[index]) {\n clearTimeout(searchTimerByIndex[index])\n }\n\n const normalized = sanitizeLanguageFieldValue(term)\n if (normalized.length < 2) {\n suggestionByIndex[index] = []\n rerender()\n return\n }\n\n const seq = (searchSeqByIndex[index] || 0) + 1\n searchSeqByIndex[index] = seq\n\n searchTimerByIndex[index] = setTimeout(async () => {\n const suggestions = await fetchLanguageSuggestions(normalized)\n if (searchSeqByIndex[index] !== seq) return\n suggestionByIndex[index] = suggestions\n\n const row = formState.languages[index]\n if (row) {\n const matchedSuggestion = matchLanguageSuggestion(suggestions, row.name)\n row.publicId = matchedSuggestion?.publicId || row.publicId\n }\n\n rerender()\n }, 220)\n }\n\n\n render(html`\n ${renderLanguageSection(formState.languages, rerender, suggestionByIndex, onSearch)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n\n updateLanguagesSubmitEnabled(formState.languages)\n\n if (options.focusSelector) {\n focusLanguageField(form, options.focusSelector)\n }\n}\n\nfunction createLanguageEditForm(details: LanguageDetails[], viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n\n const formState = toFormState(details)\n formState.initialExistingOrder = formState.languages\n .filter((row) => Boolean((row.entryNode || '').trim()))\n .map((row) => (row.entryNode || '').trim())\n renderLanguageEditTemplate(form, formState, viewerMode)\n\n const addRow = () => {\n formState.languages.unshift({\n name: '',\n publicId: '',\n proficiency: '',\n entryNode: '',\n status: 'new'\n })\n const formStateWithSearch = formState as LanguageFormState & {\n suggestionByIndex?: Record<number, LanguageSuggestion[]>\n searchSeqByIndex?: Record<number, number>\n searchTimerByIndex?: Record<number, ReturnType<typeof setTimeout>>\n }\n formStateWithSearch.suggestionByIndex = {}\n formStateWithSearch.searchSeqByIndex = {}\n formStateWithSearch.searchTimerByIndex = {}\n renderLanguageEditTemplate(form, formState, viewerMode, { focusSelector: '[name=\"language-0\"]' })\n }\n\n return { form, formState, addRow }\n}\n\n\nexport async function createLanguageEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n languages: LanguageDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState, addRow } = createLanguageEditForm(languages, viewerMode)\n\n const result = await openInputDialog({\n title: editLanguagesDialogTitleText,\n dom,\n form,\n headerAction: {\n type: 'button',\n label: '+ Add More',\n ariaLabel: 'Add another language',\n onClick: addRow\n },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n return validateLanguagesBeforeSave(formState.languages, formState.initialExistingOrder)\n },\n onSave: async () => {\n const languageOps = summarizeRowOps(formState.languages, rowHasContent)\n const plan: MutationOps<LanguageRow> = {\n create: languageOps.create,\n update: languageOps.update,\n remove: languageOps.remove\n }\n await processLanguageMutations(store, subject, plan, formState.languages)\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveLanguageUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","import { html } from 'lit-html'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { ViewerMode } from '../../types'\nimport { createLanguageEditDialog } from './LanguageEditDialog'\nimport { LanguageDetails } from './types'\nimport { addIcon, commentIcon, editIcon, plusIcon } from '../../icons-svg/profileIcons'\nimport { languagesHeadingText } from '../../texts'\nimport { toggleCollapsibleSection } from '../shared/collapsibleSection'\n\nfunction renderLan(language: LanguageDetails, asList = false) {\n if (!language) return html``\n return asList\n ? html`<li class=\"languages__item-label\" role=\"listitem\">${language.name}</li>`\n : html``\n}\n\nfunction renderLanguages(languages: LanguageDetails[], asList = false) {\n if (!languages || !languages.length || !languages[0]) return html``\n return html`${renderLan(languages[0], asList)}${languages.length > 1 ? renderLanguages(languages.slice(1), asList) : html``}`\n}\n\nfunction renderLanguagesSectionDefault(store: LiveStore, subject: NamedNode, languages: LanguageDetails[], viewerMode: ViewerMode, onSaved?: () => Promise<void> | void) {\n \n const hasLanguages = Array.isArray(languages) && languages.length > 0\n const hasLanguageLinks = store.each(subject, ns.schema('knowsLanguage')).length > 0\n const isOwner = viewerMode === 'owner'\n return html`\n <section\n class=\"profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions\"\n aria-labelledby=\"languages-heading\"\n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"languages-heading\">${languagesHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n ${isOwner ? html`\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add or edit languages\"\n @click=${(event: Event) => createLanguageEditDialog(event, store, subject, languages, viewerMode, onSaved)}\n >\n <span class=\"profile-section-collapsible__edit-label profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add More\n </span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n ` : html``}\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle languages section\"\n aria-controls=\"languages-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"languages-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${hasLanguages\n ? html`\n <ul class=\"languages__list\" role=\"list\" aria-label=\"Known languages\">\n ${renderLanguages(languages, true)}\n </ul>\n `\n : hasLanguageLinks\n ? html`<p>Language details are missing for one or more entries.</p>`\n : html`<p>No languages added yet.</p>`}\n </div>\n </section>\n `\n}\n\nfunction renderOwnerEmptyLanguagesContent(\n _store: LiveStore,\n _subject: NamedNode,\n _languages: LanguageDetails[],\n _viewerMode: ViewerMode,\n _onSaved?: () => Promise<void> | void\n) {\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty languages section\"> \n <div class=\"languages__empty-icon-wrapper\">\n <span class=\"languages__empty-icon inline-flex-row\">${commentIcon}</span>\n </div>\n <p class=\"profile__empty-state-message languages__empty-message\">\n No languages added yet.\n </p>\n </div>\n `\n}\n\nfunction renderOwnerEmptyLanguagesSection(\n store: LiveStore,\n subject: NamedNode,\n languages: LanguageDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"languages-heading\" \n data-profile-section=\"languages\"\n class=\"profile__section--empty border-lighter rounded-md gap-lg profile-section-collapsible profile-section-collapsible--inline-mobile-actions\" \n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"languages-heading\" tabindex=\"-1\">${languagesHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add languages\"\n @click=${(event: Event) => {\n return createLanguageEditDialog(\n event,\n store,\n subject,\n languages,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile-section-collapsible__edit-label profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add Languages\n </span>\n <span class=\"profile-section-collapsible__edit-icon profile-section-collapsible__edit-icon--add\" aria-hidden=\"true\">${plusIcon}</span>\n </button>\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle languages section\"\n aria-controls=\"languages-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"languages-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${renderOwnerEmptyLanguagesContent(store, subject, languages, viewerMode, onSaved)}\n </div>\n </section>\n `\n}\n\nexport function renderLanguageSection(\n store: LiveStore,\n subject: NamedNode,\n languages: LanguageDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const safeLanguages = languages || []\n const hasLanguages = Array.isArray(safeLanguages) && safeLanguages.length > 0\n\n const showOwnerEmptyLanguages = !hasLanguages && viewerMode === 'owner'\n const showSection = true\n \n return showSection ? html`\n ${showOwnerEmptyLanguages\n ? renderOwnerEmptyLanguagesSection(store, subject, safeLanguages, viewerMode, onSaved)\n : renderLanguagesSectionDefault(store, subject, safeLanguages, viewerMode, onSaved)}\n ` : ''\n \n}\n","import { LiveStore, NamedNode, st, literal, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { SkillRow } from './types'\nimport { MutationOps } from '../shared/types'\nimport { applyUpdaterPatch, collectLinkedNodeStatements, collectNodeStatements, findExistingNode } from '../shared/rdfMutationHelpers'\nimport { createIdNode } from '../shared/idNodeFactory'\nimport { mutationSaveSkillsFailedPrefixText } from '../../texts'\n\nexport type SkillMutationPlan = MutationOps<SkillRow>\n\nconst ESCO_SKILL_BASE_URI = 'http://data.europa.eu/esco/skill/'\nconst SKILL_PREFIX_BASE_URI = 'skill:'\n\nfunction ensureSkillPrefix(store: LiveStore) {\n const anyStore = store as any\n if (typeof anyStore.setPrefixForURI === 'function') {\n anyStore.setPrefixForURI('skill', SKILL_PREFIX_BASE_URI)\n return\n }\n if (!anyStore.namespaces) {\n anyStore.namespaces = {}\n }\n anyStore.namespaces.skill = SKILL_PREFIX_BASE_URI\n}\n\nfunction normalizeSkillPublicIdUri(publicId: string): string {\n const normalized = publicId.trim()\n if (!normalized) return normalized\n if (normalized.startsWith('skill:')) {\n return normalized\n }\n if (normalized.startsWith(ESCO_SKILL_BASE_URI)) {\n const suffix = normalized.slice(ESCO_SKILL_BASE_URI.length)\n return suffix ? `skill:${suffix}` : normalized\n }\n return normalized\n}\n\nfunction normalizeNodeId(value: string): string {\n return value.startsWith('_:') ? value.slice(2) : value\n}\n\nfunction collectSkillLinkStatementsByEntryValue(\n store: LiveStore,\n subject: NamedNode,\n doc: NamedNode,\n entryNode: string\n) {\n const normalizedEntryNode = normalizeNodeId(entryNode)\n return store\n .statementsMatching(subject, ns.schema('skills'), null, doc)\n .filter((statement) => {\n const objectValue = normalizeNodeId(statement.object.value)\n return objectValue === normalizedEntryNode || statement.object.value === entryNode\n })\n}\n\nfunction buildSkillsStatements(subject: NamedNode, doc: NamedNode, node: NamedNode, skill: SkillRow) {\n if (!skill.name) return []\n if (!skill.publicId) {\n throw new Error(`Missing skill publicId for skill: ${skill.name}`)\n }\n const publicIdNode = sym(normalizeSkillPublicIdUri(skill.publicId))\n\n return [\n st(subject, ns.schema('skills'), node, doc),\n st(node, ns.solid('publicId'), publicIdNode as any, doc),\n st(publicIdNode as any, ns.schema('name'), literal(skill.name), doc)\n ]\n}\n\nasync function mutateSkillsEntries(store: LiveStore, subject: NamedNode, skillOps: MutationOps<SkillRow>) {\n ensureSkillPrefix(store)\n const doc = subject.doc()\n const existingSkillNodes = store.each(subject, ns.schema('skills'))\n\n const deletions: any[] = []\n const insertions: any[] = []\n\n const collectLinkedPublicIdStatements = (skillNode: NamedNode) => {\n const linkedPublicIdStatements = collectLinkedNodeStatements(store, skillNode, ns.solid('publicId'), doc)\n deletions.push(...linkedPublicIdStatements.linkedStatements)\n }\n\n skillOps.remove.forEach((skill) => {\n if (!skill.entryNode) return\n const existingNode = findExistingNode(existingSkillNodes, skill.entryNode)\n deletions.push(...collectSkillLinkStatementsByEntryValue(store, subject, doc, skill.entryNode))\n if (existingNode) {\n if (existingNode.termType !== 'Literal') {\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n if (existingNode.termType === 'NamedNode') {\n collectLinkedPublicIdStatements(existingNode as NamedNode)\n }\n }\n }\n })\n\n skillOps.update.forEach((skill) => {\n if (!skill.entryNode) return\n const existingNode = findExistingNode(existingSkillNodes, skill.entryNode)\n if (!existingNode) {\n insertions.push(...buildSkillsStatements(subject, doc, createIdNode(doc), skill))\n return\n }\n deletions.push(...collectSkillLinkStatementsByEntryValue(store, subject, doc, skill.entryNode))\n if (existingNode.termType !== 'Literal') {\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n if (existingNode.termType === 'NamedNode') {\n collectLinkedPublicIdStatements(existingNode as NamedNode)\n }\n }\n if (existingNode.termType === 'NamedNode') {\n insertions.push(...buildSkillsStatements(subject, doc, existingNode as NamedNode, skill))\n return\n }\n insertions.push(...buildSkillsStatements(subject, doc, createIdNode(doc), skill))\n })\n\n skillOps.create.forEach((skill) => {\n insertions.push(...buildSkillsStatements(subject, doc, createIdNode(doc), skill))\n })\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nexport async function processSkillsMutations(store: LiveStore, subject: NamedNode, mutationPlan: SkillMutationPlan) {\n try {\n await mutateSkillsEntries(store, subject, mutationPlan)\n\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${mutationSaveSkillsFailedPrefixText} ${message}`)\n }\n} \n","import { openInputDialog } from '../../ui/dialog'\nimport { html, render } from 'lit-html'\nimport { SkillDetails, SkillRow } from './types'\nimport '../../styles/EditDialogs.css'\nimport '../../styles/ContactInfoEditDialog.css'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { applyRowFieldChange, deleteRow, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText } from '../../textUtils'\nimport { MutationOps } from '../shared/types'\nimport { processSkillsMutations } from './mutations'\nimport { searchIcon, trashIcon } from '../../icons-svg/profileIcons'\nimport {\n deleteEntryButtonTitleText,\n dialogCancelLabelText,\n dialogSubmitLabelText,\n editSkillsDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n saveContactUpdatesFailedPrefixText,\n} from '../../texts'\n\ntype SkillFormState = {\n skills: SkillRow[]\n}\n\ntype SkillSuggestion = {\n label: string\n uri: string\n}\n\ntype SkillRerenderOptions = {\n focusSelector?: string\n}\n\nconst ESCO_SKILL_SEARCH_URI = 'https://ec.europa.eu/esco/api/search?language=$(language)&limit=$(limit)&type=skill&text=$(name)'\nconst ESCO_SEARCH_LANGUAGE = 'en'\nconst ESCO_SEARCH_LIMIT = 8\nconst ESCO_SKILL_BASE_URI = 'http://data.europa.eu/esco/skill/'\n\nfunction normalizeSkillPublicId(value: string): string {\n const normalized = sanitizeSkillFieldValue(value)\n if (!normalized) return ''\n if (normalized.startsWith('skill:')) return normalized\n if (normalized.startsWith(ESCO_SKILL_BASE_URI)) {\n const suffix = normalized.slice(ESCO_SKILL_BASE_URI.length)\n return suffix ? `skill:${suffix}` : normalized\n }\n return normalized\n}\n\nfunction buildEscoSkillSearchUrl(name: string): string {\n return ESCO_SKILL_SEARCH_URI\n .replace('$(language)', encodeURIComponent(ESCO_SEARCH_LANGUAGE))\n .replace('$(limit)', encodeURIComponent(String(ESCO_SEARCH_LIMIT)))\n .replace('$(name)', encodeURIComponent(name))\n}\n\nfunction toSkillLabel(result: any): string {\n return result?.title || result?.searchHit || result?.preferredLabel?.en || result?.uri || ''\n}\n\nasync function fetchEscoSkillSuggestions(name: string): Promise<SkillSuggestion[]> {\n const query = sanitizeSkillFieldValue(name)\n if (query.length < 2 || typeof fetch !== 'function') return []\n\n try {\n const response = await fetch(buildEscoSkillSearchUrl(query), {\n headers: { Accept: 'application/json' }\n })\n if (!response.ok) return []\n\n const payload = await response.json() as any\n const results = Array.isArray(payload?._embedded?.results) ? payload._embedded.results : []\n const seen = new Set<string>()\n\n return results\n .map((result: any) => {\n const label = sanitizeSkillFieldValue(toSkillLabel(result))\n const uri = typeof result?.uri === 'string' ? result.uri : ''\n return { label, uri }\n })\n .filter((suggestion: SkillSuggestion) => {\n if (!suggestion.label) return false\n const key = suggestion.label.toLowerCase()\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n } catch {\n return []\n }\n}\n\ntype SkillEditableField = 'name'\n\nfunction sanitizeSkillFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n\nfunction rowHasContent(row: SkillRow): boolean {\n return [\n row.name\n ].some(hasNonEmptyText)\n}\n\nfunction toFormState(details: SkillDetails[]): SkillFormState {\n const rows = (details || [])\n .map((detail) => ({\n name: sanitizeSkillFieldValue(toText(detail.name)),\n publicId: normalizeSkillPublicId(toText(detail.publicId)),\n entryNode: toText(detail.entryNode),\n status: toText(detail.entryNode) ? 'existing' as const : 'new' as const\n }))\n .filter((row) => Boolean(row.name || row.publicId || row.entryNode))\n\n \n return {\n skills: rows.length ? rows : [{ name: '', publicId: '', entryNode: '', status: 'new' }],\n }\n}\n\nfunction matchSkillSuggestion(suggestions: SkillSuggestion[], value: string): SkillSuggestion | null {\n const normalized = sanitizeSkillFieldValue(value).toLowerCase()\n if (!normalized) return null\n return suggestions.find((suggestion) => suggestion.label.toLowerCase() === normalized) || null\n}\n\nfunction validateSkillsBeforeSave(rows: SkillRow[]): string | null {\n const ops = summarizeRowOps(rows, rowHasContent)\n const hasChanges = ops.create.length > 0 || ops.update.length > 0 || ops.remove.length > 0\n if (!hasChanges) return 'No skill changes detected.'\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n if (!row || row.status === 'deleted') continue\n if (!hasNonEmptyText(row.name)) continue\n\n if (row.status !== 'existing' && !hasNonEmptyText(row.publicId)) {\n return `Skill ${i + 1}: please select a skill from the ESCO suggestions.`\n }\n }\n\n return null\n}\n\nfunction hasInvalidSkillSelection(rows: SkillRow[]): boolean {\n return rows.some((row) => {\n if (!row || row.status === 'deleted') return false\n if (!hasNonEmptyText(row.name)) return false\n return !hasNonEmptyText(row.publicId)\n })\n}\n\nfunction updateSkillsSubmitEnabled(rows: SkillRow[]): void {\n const submitButton = document.querySelector('#profile-modal #modal-buttons button.btn-primary') as HTMLButtonElement | null\n if (!submitButton) return\n submitButton.disabled = hasInvalidSkillSelection(rows)\n}\n\nfunction focusSkillField(form: HTMLFormElement, selector: string): void {\n const nextField = form.querySelector(selector) as HTMLElement | null\n if (!nextField || typeof nextField.focus !== 'function') return\n\n nextField.scrollIntoView({ block: 'start', behavior: 'auto' })\n nextField.focus()\n if (nextField instanceof HTMLInputElement || nextField instanceof HTMLTextAreaElement) {\n nextField.select()\n }\n}\n\ntype SkillsInputRowProps = {\n rows: SkillRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n onChange: () => void\n onSkillSearch: (rowIndex: number, term: string) => void\n suggestions: SkillSuggestion[]\n}\n\nfunction renderSkillInputRow({\n rows,\n index,\n displayIndex,\n onDelete,\n onChange,\n onSkillSearch,\n suggestions\n}: SkillsInputRowProps) {\n const row = rows[index]\n const label = `Skill ${displayIndex + 1}`\n const skillName = `skill-${index}`\n const datalistId = `skill-suggestions-${index}`\n const hasSelectionIssue = Boolean(row && row.status !== 'deleted' && hasNonEmptyText(row.name) && !hasNonEmptyText(row.publicId))\n\n const handleSkillInput = (field: SkillEditableField) => (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeSkillFieldValue(target.value)\n if (rows[index]) {\n applyRowFieldChange(rows[index], field, nextValue, rowHasContent)\n const matchedSuggestion = matchSkillSuggestion(suggestions, nextValue)\n rows[index].publicId = normalizeSkillPublicId(matchedSuggestion?.uri || '')\n onSkillSearch(index, nextValue)\n onChange()\n }\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--full profile-edit-dialog__row--skill\">\n <label aria-label=${`${label} Name`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--full\">\n <div class=\"profile-edit-dialog__input-wrap\">\n <span class=\"profile-edit-dialog__search-icon\" aria-hidden=\"true\">${searchIcon}</span>\n <input\n class=\"input profile-edit-dialog__input--with-leading-icon\"\n type=\"text\"\n name=${skillName}\n .value=${row?.name || ''}\n required\n data-contact-field=\"name\"\n data-entry-node=${row?.entryNode || ''}\n data-row-status=${row?.status || 'n/a'}\n placeholder=\"Skill\"\n autocomplete=\"off\"\n list=${datalistId}\n inputmode=\"text\"\n aria-invalid=${hasSelectionIssue ? 'true' : 'false'}\n @input=${handleSkillInput('name')}\n />\n </div>\n <datalist id=${datalistId}>\n ${suggestions.map((suggestion) => html`<option value=${suggestion.label}></option>`)}\n </datalist>\n <small class=\"profile-edit-dialog__input-help-text\">Type to search ESCO and select one suggestion.</small>\n </label>\n <div class=\"profile-edit-dialog__actions profile-edit-dialog__actions--edge\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete skill ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n `\n}\n\nfunction renderSkillsSection(\n rows: SkillRow[],\n onAddRow: (options?: SkillRerenderOptions) => void,\n suggestionByIndex: Record<number, SkillSuggestion[]>,\n handleSearch: (rowIndex: number, term: string) => void\n) {\n const visibleRows = rows\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => row.status !== 'deleted')\n\n return html`\n <section class=\"profile-edit-dialog__section\" aria-label=\"Skills\">\n <fieldset>\n <legend class=\"sr-only\">Skill entries</legend>\n ${visibleRows.map(({ index }, displayIndex) => renderSkillInputRow({\n rows,\n index,\n displayIndex,\n onChange: onAddRow,\n onSkillSearch: handleSearch,\n suggestions: suggestionByIndex[index] || [],\n onDelete: () => {\n deleteRow(rows, index)\n delete suggestionByIndex[index]\n onAddRow()\n }\n }))}\n </fieldset>\n </section>\n `\n}\n\nfunction renderSkillsEditTemplate(\n form: HTMLFormElement,\n formState: SkillFormState,\n viewerMode: ViewerMode,\n options: SkillRerenderOptions = {}\n) {\n const formStateWithSearch = formState as SkillFormState & {\n suggestionByIndex?: Record<number, SkillSuggestion[]>\n searchSeqByIndex?: Record<number, number>\n searchTimerByIndex?: Record<number, ReturnType<typeof setTimeout>>\n }\n\n const suggestionByIndex = formStateWithSearch.suggestionByIndex || (formStateWithSearch.suggestionByIndex = {})\n const searchSeqByIndex = formStateWithSearch.searchSeqByIndex || (formStateWithSearch.searchSeqByIndex = {})\n const searchTimerByIndex = formStateWithSearch.searchTimerByIndex || (formStateWithSearch.searchTimerByIndex = {})\n\n const rerender = (nextOptions: SkillRerenderOptions = {}) => renderSkillsEditTemplate(form, formState, viewerMode, nextOptions)\n const handleSearch = (rowIndex: number, term: string) => {\n if (searchTimerByIndex[rowIndex]) {\n clearTimeout(searchTimerByIndex[rowIndex])\n }\n\n const normalized = sanitizeSkillFieldValue(term)\n if (normalized.length < 2) {\n suggestionByIndex[rowIndex] = []\n rerender()\n return\n }\n\n const seq = (searchSeqByIndex[rowIndex] || 0) + 1\n searchSeqByIndex[rowIndex] = seq\n\n searchTimerByIndex[rowIndex] = setTimeout(async () => {\n const suggestions = await fetchEscoSkillSuggestions(normalized)\n if (searchSeqByIndex[rowIndex] !== seq) return\n suggestionByIndex[rowIndex] = suggestions\n\n const row = formState.skills[rowIndex]\n if (row) {\n const matchedSuggestion = matchSkillSuggestion(suggestions, row.name)\n row.publicId = matchedSuggestion ? normalizeSkillPublicId(matchedSuggestion.uri) : row.publicId\n }\n\n rerender()\n }, 220)\n }\n\n\n render(html`\n ${renderSkillsSection(formState.skills, rerender, suggestionByIndex, handleSearch)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n\n updateSkillsSubmitEnabled(formState.skills)\n\n if (options.focusSelector) {\n focusSkillField(form, options.focusSelector)\n }\n}\n\nfunction createSkillsEditForm(details: SkillDetails[], viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n\n const formState = toFormState(details)\n renderSkillsEditTemplate(form, formState, viewerMode)\n\n const addRow = () => {\n formState.skills.unshift({\n name: '',\n publicId: '',\n entryNode: '',\n status: 'new'\n })\n const formStateWithSearch = formState as SkillFormState & {\n suggestionByIndex?: Record<number, SkillSuggestion[]>\n searchSeqByIndex?: Record<number, number>\n searchTimerByIndex?: Record<number, ReturnType<typeof setTimeout>>\n }\n formStateWithSearch.suggestionByIndex = {}\n formStateWithSearch.searchSeqByIndex = {}\n formStateWithSearch.searchTimerByIndex = {}\n renderSkillsEditTemplate(form, formState, viewerMode, { focusSelector: '[name=\"skill-0\"]' })\n }\n\n return { form, formState, addRow }\n}\n\n\nexport async function createSkillsEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n skills: SkillDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState, addRow } = createSkillsEditForm(skills, viewerMode)\n\n const result = await openInputDialog({\n title: editSkillsDialogTitleText,\n dom,\n form,\n headerAction: {\n type: 'button',\n label: '+ Add More',\n ariaLabel: 'Add another skill',\n onClick: addRow\n },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n return validateSkillsBeforeSave(formState.skills)\n },\n onSave: async () => {\n const skillOps = summarizeRowOps(formState.skills, rowHasContent)\n const plan: MutationOps<SkillRow> = {\n create: skillOps.create,\n update: skillOps.update,\n remove: skillOps.remove\n }\n await processSkillsMutations(store, subject, plan)\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveContactUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","import { html } from 'lit-html'\nimport { strToUpperCase } from '../../textUtils'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { createSkillsEditDialog } from './SkillsEditDialog'\nimport { SkillDetails, SkillRow } from './types'\nimport { addIcon, deleteIcon, editIcon, lighteningIcon } from '../../icons-svg/profileIcons'\nimport { skillsHeadingText } from '../../texts'\nimport { toggleCollapsibleSection } from '../shared/collapsibleSection'\nimport { processSkillsMutations } from './mutations'\n\nfunction renderSkillItem(\n detail: SkillDetails,\n store: LiveStore,\n subject: NamedNode,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n if (!detail) return html``\n\n const handleRemove = async (event: Event) => {\n event.preventDefault()\n if (viewerMode !== 'owner') return\n\n const removeRow: SkillRow = {\n name: detail.name,\n publicId: detail.publicId,\n entryNode: detail.entryNode.value,\n status: 'deleted'\n }\n\n await processSkillsMutations(store, subject, {\n create: [],\n update: [],\n remove: [removeRow]\n })\n\n if (onSaved) {\n await onSaved()\n }\n }\n\n return html`\n <li class=\"skills__item inline-flex-row\" role=\"listitem\">\n <span class=\"skills__item-label\">${strToUpperCase(detail.name)}</span>\n ${viewerMode === 'owner'\n ? html`\n <button\n type=\"button\"\n class=\"skills__remove-button inline-flex-row\"\n aria-label=\"Remove ${detail.name} skill\"\n @click=${handleRemove}\n >\n ${deleteIcon}\n </button>\n `\n : ''}\n </li>\n `\n}\n\nfunction renderSkillsSectionDefault(store: LiveStore, subject: NamedNode, skills: SkillDetails[], viewerMode: ViewerMode, onSaved?: () => Promise<void> | void) {\n const hasSkills = Array.isArray(skills) && skills.length > 0\n const isOwner = viewerMode === 'owner'\n\n return html`\n <section\n class=\"profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions\"\n aria-labelledby=\"skills-heading\"\n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"skills-heading\">${skillsHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n ${isOwner ? html`\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add or edit skills\"\n @click=${(event: Event) => createSkillsEditDialog(event, store, subject, skills, viewerMode, onSaved)}\n >\n <span class=\"profile-section-collapsible__edit-label profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add More\n </span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n ` : html``}\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle skills section\"\n aria-controls=\"skills-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div\n id=\"skills-panel\"\n class=\"profile-section-collapsible__content\"\n aria-hidden=\"true\"\n >\n ${hasSkills\n ? html`\n <ul class=\"skills__list flex-column\" role=\"list\" aria-label=\"Professional skills and competencies\">\n ${skills.map((detail) => renderSkillItem(detail, store, subject, viewerMode, onSaved))}\n </ul>\n `\n : html`<p>No skills added yet.</p>`}\n </div>\n </section>\n `\n}\n\nfunction renderOwnerEmptySkillsContent(\n _store: LiveStore,\n _subject: NamedNode,\n _skills: SkillDetails[],\n _viewerMode: ViewerMode,\n _onSaved?: () => Promise<void> | void\n) {\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty skills section\"> \n <div class=\"skills__empty-icon-wrapper\">\n <span class=\"skills__empty-icon inline-flex-row\">${lighteningIcon}</span>\n </div>\n <p class=\"profile__empty-state-message skills__empty-message\">\n No skills added yet.\n </p>\n </div>\n `\n}\n\nfunction renderOwnerEmptySkillsSection(\n store: LiveStore,\n subject: NamedNode,\n skills: SkillDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"skills-heading\" \n data-profile-section=\"skills\"\n class=\"profile__section--empty border-lighter rounded-md gap-lg profile-section-collapsible profile-section-collapsible--inline-mobile-actions\" \n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"skills-heading\" tabindex=\"-1\">${skillsHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add skills\"\n @click=${(event: Event) => {\n return createSkillsEditDialog(\n event,\n store,\n subject,\n skills,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile-section-collapsible__edit-label profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add Skills\n </span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle skills section\"\n aria-controls=\"skills-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"skills-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${renderOwnerEmptySkillsContent(store, subject, skills, viewerMode, onSaved)}\n </div>\n </section>\n `\n}\n\nexport function renderSkillsSection(\n store: LiveStore,\n subject: NamedNode,\n skills: SkillDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const safeSkills: SkillDetails[] = skills || []\n const hasSkills = Array.isArray(safeSkills) && safeSkills.length > 0\n const showOwnerEmptySkills = !hasSkills && viewerMode === 'owner'\n const showSection = true\n \n return showSection ? html`\n ${showOwnerEmptySkills\n ? renderOwnerEmptySkillsSection(store, subject, safeSkills, viewerMode, onSaved)\n : renderSkillsSectionDefault(store, subject, safeSkills, viewerMode, onSaved)}\n ` : ''\n}\n","import { LiveStore, NamedNode, Node, st, literal, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { ResumeRow } from './types'\nimport { MutationOps } from '../shared/types'\nimport { applyUpdaterPatch, collectLinkedNodeStatements, collectNodeStatements, findExistingNode, replacePredicateStatements } from '../shared/rdfMutationHelpers'\nimport { createIdNode } from '../shared/idNodeFactory'\nimport { mutationSaveResumeFailedPrefixText, resumeUpdateEntryNotFoundErrorMessageText } from '../../texts'\n\nfunction asXsdDateLiteral(dateLike: { value?: string } | null | undefined) {\n const value = (dateLike?.value || '').trim()\n if (!value) return null\n\n const dateOnly = value.slice(0, 10)\n return literal(dateOnly, ns.xsd('date'))\n}\n\n/* The following helper was generated by AI Model: GPT-5.3-Codex. */\n/* Prompt: write me a function to determine PastRole, CurrentRole, or FutureRole based on resume role date data. \n The function should return a NamedNode with the correct solid namespace and role type local name. \n The function should use the roleType field if it is set to one of those three values, \n otherwise it should infer the role type based on the start and end dates and isCurrentRole field. */\nfunction membershipTypeForRole(resumeData: ResumeRow): NamedNode {\n const normalizedRoleType = (resumeData.roleType || '').trim()\n if (normalizedRoleType === 'PastRole' || normalizedRoleType === 'CurrentRole' || normalizedRoleType === 'FutureRole') {\n return ns.solid(normalizedRoleType)\n }\n\n if (resumeData.isCurrentRole) return ns.solid('CurrentRole')\n\n const todayIso = new Date().toISOString().slice(0, 10)\n const startIso = resumeData.startDate?.value?.slice(0, 10) || ''\n const endIso = resumeData.endDate?.value?.slice(0, 10) || ''\n\n if (startIso && startIso > todayIso) return ns.solid('FutureRole')\n if (endIso && endIso < todayIso) return ns.solid('PastRole')\n return ns.solid('FutureRole')\n}\n\nfunction roleTypeNode(orgType: string): NamedNode | null {\n const text = (orgType || '').trim()\n if (!text) return null\n\n // These are membership role classes, not organization classes.\n if (text === 'PastRole' || text === 'CurrentRole' || text === 'FutureRole') {\n return null\n }\n\n if (text.startsWith('http://') || text.startsWith('https://')) {\n const local = text.split(/[#/]/).pop()\n if (local === 'PastRole' || local === 'CurrentRole' || local === 'FutureRole') {\n return null\n }\n return sym(text)\n }\n\n const prefixed = text.match(/^([a-zA-Z][\\w-]*):(.*)$/)\n if (prefixed) {\n const prefix = prefixed[1].toLowerCase()\n const local = prefixed[2].trim()\n if (!local) return null\n if (local === 'PastRole' || local === 'CurrentRole' || local === 'FutureRole') {\n return null\n }\n /* Organization types vary need to return the correct namespace */\n if (prefix === 'schema') return ns.schema(local)\n if (prefix === 'vcard') return ns.vcard(local)\n if (prefix === 'solid') return ns.solid(local)\n if (prefix === 'org') return ns.org(local)\n return null\n }\n\n // For plain values like \"Corporation\", map to schema:Corporation.\n return ns.schema(text)\n}\n\n/* The following helper was generated by AI Model: GPT-5.3-Codex.\n Prompt: 'do you see anything I can do differently in the mutation code so that it's not so verbose and possible reusable accross sections' */\nfunction buildOrganizationStatements(doc: NamedNode, membershipNode: Node, resumeData: ResumeRow) {\n if (!resumeData.orgName && !resumeData.orgType && !resumeData.orgLocation && !resumeData.orgHomePage) {\n return []\n }\n\n const organizationNode = createIdNode(doc)\n const inserts: any[] = [\n st(membershipNode as any, ns.org('organization'), organizationNode, doc)\n ]\n\n const organizationClassNode = roleTypeNode(resumeData.orgType || '')\n if (organizationClassNode) {\n inserts.push(st(organizationNode, ns.rdf('type'), organizationClassNode, doc))\n }\n\n inserts.push(st(organizationNode, ns.rdf('type'), ns.vcard('Organization'), doc))\n\n if (resumeData.orgName) {\n inserts.push(st(organizationNode, ns.schema('name'), literal(resumeData.orgName), doc))\n }\n if (resumeData.orgLocation) {\n inserts.push(st(organizationNode, ns.org('location'), literal(resumeData.orgLocation), doc))\n }\n if (resumeData.orgHomePage) {\n inserts.push(st(organizationNode, ns.schema('uri'), literal(resumeData.orgHomePage), doc))\n }\n\n return inserts\n}\n\n\nfunction buildResumeStatements(\n subject: NamedNode,\n doc: NamedNode,\n node: Node,\n resumeData: ResumeRow,\n includeMembershipLink = true\n) {\n const inserts: any[] = []\n\n if (includeMembershipLink) {\n inserts.push(st(node as any, ns.org('member'), subject, doc))\n }\n\n inserts.push(st(node as any, ns.rdf('type'), membershipTypeForRole(resumeData), doc))\n\n if (resumeData.title) {\n inserts.push(st(node as any, ns.vcard('role'), literal(resumeData.title), doc))\n }\n if (resumeData.startDate) {\n const startDateLiteral = asXsdDateLiteral(resumeData.startDate as any)\n if (startDateLiteral) {\n inserts.push(st(node as any, ns.schema('startDate'), startDateLiteral as any, doc))\n }\n }\n if (resumeData.endDate && !resumeData.isCurrentRole) {\n const endDateLiteral = asXsdDateLiteral(resumeData.endDate as any)\n if (endDateLiteral) {\n inserts.push(st(node as any, ns.schema('endDate'), endDateLiteral as any, doc))\n }\n }\n if (resumeData.description) {\n inserts.push(st(node as any, ns.schema('description'), literal(resumeData.description), doc))\n }\n\n inserts.push(...buildOrganizationStatements(doc, node, resumeData))\n\n return inserts\n}\n\nasync function mutateResumeEntries(store: LiveStore, subject: NamedNode, resumeOps: MutationOps<ResumeRow>) {\n const doc = subject.doc()\n const existingResumeNodes = store.each(null, ns.org('member'), subject, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n resumeOps.remove.forEach((resume) => {\n if (!resume.entryNode) return\n const existingNode = findExistingNode(existingResumeNodes, resume.entryNode)\n if (existingNode) {\n const linkedOrganizations = collectLinkedNodeStatements(store, existingNode, ns.org('organization'), doc)\n deletions.push(...linkedOrganizations.linkedStatements)\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n })\n\n resumeOps.update.forEach((resume) => {\n if (!resume.entryNode) return\n const existingNode = findExistingNode(existingResumeNodes, resume.entryNode)\n if (!existingNode) {\n throw new Error(resumeUpdateEntryNotFoundErrorMessageText)\n }\n\n if ((existingNode as any).termType === 'BlankNode') {\n // Blank node labels are not always stable for remote updates; migrate to a named node.\n const migratedNode = createIdNode(doc)\n insertions.push(...buildResumeStatements(subject, doc, migratedNode, resume, true))\n return\n }\n\n // For updates on existing named memberships, keep the membership link and replace only mutable fields.\n ;[ns.rdf('type'), ns.vcard('role'), ns.schema('startDate'), ns.schema('endDate'), ns.schema('description')]\n .forEach((predicate) => {\n replacePredicateStatements(store, existingNode as NamedNode, predicate, doc, deletions, insertions, null)\n })\n\n const linkedOrganizations = collectLinkedNodeStatements(store, existingNode, ns.org('organization'), doc)\n deletions.push(...linkedOrganizations.linkedStatements)\n deletions.push(...linkedOrganizations.linkStatements)\n\n insertions.push(...buildResumeStatements(subject, doc, existingNode, resume, false))\n })\n\n resumeOps.create.forEach((resume) => {\n insertions.push(...buildResumeStatements(subject, doc, createIdNode(doc), resume))\n })\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nexport type ResumeMutationPlan = MutationOps<ResumeRow>\n\nexport async function processResumeMutations(store: LiveStore, subject: NamedNode, mutationPlan: ResumeMutationPlan) {\n try {\n await mutateResumeEntries(store, subject, mutationPlan)\n\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${mutationSaveResumeFailedPrefixText} ${message}`)\n }\n} \n","import { alertDialog, openInputDialog } from '../../ui/dialog'\nimport { html, render } from 'lit-html'\nimport { RoleDetails, ResumeRow } from './types'\nimport '../../styles/EditDialogs.css'\nimport '../../styles/ContactInfoEditDialog.css'\nimport { LiveStore, NamedNode, literal } from 'rdflib'\nimport { processResumeMutations } from './mutations'\nimport { ViewerMode } from '../../types'\nimport { applyRowFieldChange, applyRowSelectChange, deleteRow, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText } from '../../textUtils'\nimport { MutationOps } from '../shared/types'\nimport { trashIcon } from '../../icons-svg/profileIcons'\nimport {\n deleteEntryButtonTitleText,\n dialogCancelLabelText,\n dialogSubmitLabelText,\n editResumeDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n saveResumeUpdatesFailedPrefixText\n} from '../../texts'\n\ntype ResumeFormState = {\n resumeData: ResumeRow[]\n}\n\ntype ResumeValidationResult = {\n ok: boolean\n message?: string\n}\n\nfunction sanitizeResumeFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n\nfunction parseYearMonthFromDateText(dateText: string): { year: string, month: string } {\n const normalized = (dateText || '').trim()\n if (!normalized) return { year: '', month: '' }\n\n const isoYearMonth = normalized.match(/^(\\d{4})-(\\d{2})/)\n if (isoYearMonth) {\n return { year: isoYearMonth[1], month: isoYearMonth[2] }\n }\n\n const fallbackYear = normalized.match(/(\\d{4})/)\n return {\n year: fallbackYear ? fallbackYear[1] : '',\n month: ''\n }\n}\n\nfunction rowHasContent(row: ResumeRow): boolean {\n\n return Boolean(row.isCurrentRole) || [\n row.title,\n row.roleType,\n toText(row.startDate),\n toText(row.endDate),\n row.orgName,\n row.orgType,\n row.orgLocation,\n row.orgHomePage,\n row.description\n ].some(hasNonEmptyText)\n}\n\nfunction toFormState(resumeData: RoleDetails[]): ResumeFormState {\n\n const roles = (resumeData || [])\n .map((role) => ({\n title: sanitizeResumeFieldValue(toText(role.title)),\n roleType: sanitizeResumeFieldValue(toText(role.roleType)),\n startDate: role.startDate,\n endDate: role.endDate,\n isCurrentRole: role.isCurrentRole ?? !role.endDate,\n orgName: sanitizeResumeFieldValue(toText(role.orgName)),\n orgType: sanitizeResumeFieldValue(toText(role.orgType)),\n orgLocation: sanitizeResumeFieldValue(toText(role.orgLocation)),\n orgHomePage: sanitizeResumeFieldValue(toText(role.orgHomePage)),\n description: sanitizeResumeFieldValue(toText(role.description)),\n entryNode: toText(role.entryNode),\n status: toText(role.entryNode) ? 'existing' as const : 'new' as const\n }))\n .filter((role) => rowHasContent(role) || Boolean(role.entryNode))\n\n return {\n resumeData: roles.length\n ? roles\n : [{\n title: '',\n roleType: '',\n startDate: undefined,\n endDate: undefined,\n isCurrentRole: false,\n orgName: '',\n orgType: '',\n orgLocation: '',\n orgHomePage: '',\n description: '',\n entryNode: '',\n status: 'new'\n }]\n }\n}\n\nfunction validateResumeBeforeSave(rows: ResumeRow[]): ResumeValidationResult {\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n if (!row || row.status === 'deleted') continue\n if (!rowHasContent(row)) continue\n\n const endDateText = toText(row.endDate).trim()\n if (!row.isCurrentRole && !endDateText) {\n return {\n ok: false,\n message: `Resume ${i + 1}: End Year is required unless \"I am currently working in this role\" is selected.`\n }\n }\n }\n\n return { ok: true }\n}\n\ntype ResumeEditableField =\n | 'title'\n | 'startDate'\n | 'endDate'\n | 'isCurrentRole'\n | 'orgName'\n | 'orgType'\n | 'orgLocation'\n | 'orgHomePage'\n | 'description'\n\ntype ResumeRowProps = {\n resumeData: ResumeRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n onChange: () => void\n}\n\nfunction renderResumeInputRow({\n resumeData,\n index,\n displayIndex,\n onDelete,\n onChange\n}: ResumeRowProps) {\n const resumeRow = resumeData[index]\n const label = `Resume ${displayIndex + 1}`\n const experienceHeadingId = `resume-experience-heading-${index}`\n \n const titleName = `resume-title-${index}`\n const organizationName = `resume-organization-${index}`\n const organizationTypeName = `resume-organization-type-${index}`\n const organizationTypeSelectId = `resume-organization-type-select-${index}`\n const companyUrlName = `resume-company-url-${index}`\n const orgLocationName = `resume-org-location-${index}`\n const descriptionName = `resume-description-${index}`\n const descriptionCounterId = `resume-description-counter-${index}`\n const descriptionMaxLength = 2000\n const descriptionCount = (resumeRow?.description || '').length\n\n const startMonthLabel = `Start Month ${displayIndex + 1}`\n const startMonthInputName = `resume-start-month-${index}`\n const startMonthSelectId = `resume-start-month-select-${index}`\n const startYearLabel = `Start Year ${displayIndex + 1}`\n const startYearInputName = `resume-start-year-${index}`\n const startYearSelectId = `resume-start-year-select-${index}`\n const startDateText = toText(resumeRow?.startDate)\n const startDateParts = parseYearMonthFromDateText(startDateText)\n const startMonthValue = startDateParts.month\n const startYearText = startDateParts.year\n const endMonthLabel = `End Month ${displayIndex + 1}`\n const endMonthInputName = `resume-end-month-${index}`\n const endMonthSelectId = `resume-end-month-select-${index}`\n const endDateText = toText(resumeRow?.endDate)\n const endYearLabel = `End Year ${displayIndex + 1}`\n const endYearInputName = `resume-end-year-${index}`\n const endYearSelectId = `resume-end-year-select-${index}`\n const endDateParts = parseYearMonthFromDateText(endDateText)\n const endMonthValue = endDateParts.month\n const endYearParsedText = endDateParts.year\n const isCurrentRoleId = `resume-current-role-${index}`\n const currentYear = new Date().getFullYear()\n const baseYearOptions = Array.from({ length: 120 }, (_, i) => String(currentYear - i))\n const yearOptions = Array.from(new Set([\n ...baseYearOptions,\n startYearText,\n endYearParsedText\n ].filter(Boolean))).sort((a, b) => Number(b) - Number(a))\n\n const monthOptions = [\n { value: '01', label: 'January' },\n { value: '02', label: 'February' },\n { value: '03', label: 'March' },\n { value: '04', label: 'April' },\n { value: '05', label: 'May' },\n { value: '06', label: 'June' },\n { value: '07', label: 'July' },\n { value: '08', label: 'August' },\n { value: '09', label: 'September' },\n { value: '10', label: 'October' },\n { value: '11', label: 'November' },\n { value: '12', label: 'December' }\n ]\n\n const renderMonthOptions = (selectedMonth: string, emptyLabel = 'Select Month') => html`\n <option value=\"\" ?selected=${!selectedMonth}>${emptyLabel}</option>\n ${monthOptions.map((month) => html`\n <option value=${month.value} ?selected=${month.value === selectedMonth}>${month.label}</option>\n `)}\n `\n\n const renderYearOptions = (selectedYear: string, emptyLabel = 'Select Year') => html`\n <option value=\"\" ?selected=${!selectedYear}>${emptyLabel}</option>\n ${yearOptions.map((year) => html`\n <option value=${year} ?selected=${year === selectedYear}>${year}</option>\n `)}\n `\n\n const handleResumeInput = (field: ResumeEditableField) => (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeResumeFieldValue(target.value)\n if (resumeRow) {\n applyRowFieldChange(resumeRow, field, nextValue, rowHasContent)\n onChange()\n }\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n const buildDateLiteral = (month: string, year: string) => {\n if (!month || !year) return undefined\n return literal(`${year}-${month}-01`)\n }\n\n /* The following function was generated by AI Model: GPT-5.3-Codex */\n /* Prompt: can you make this a month drop down for the start year */\n const handleStartMonthChange = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const month = target.value\n const year = parseYearMonthFromDateText(toText(resumeData[index]?.startDate)).year || String(currentYear)\n const nextStartDate = buildDateLiteral(month, year)\n if (resumeData[index]) {\n applyRowFieldChange(resumeData[index], 'startDate', nextStartDate, rowHasContent)\n onChange()\n }\n }\n\n const handleStartYearChange = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const year = target.value\n const month = parseYearMonthFromDateText(toText(resumeData[index]?.startDate)).month || '01'\n const nextStartDate = buildDateLiteral(month, year)\n if (resumeData[index]) {\n applyRowFieldChange(resumeData[index], 'startDate', nextStartDate, rowHasContent)\n onChange()\n }\n }\n\n const handleEndMonthChange = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const month = target.value\n const year = parseYearMonthFromDateText(toText(resumeData[index]?.endDate)).year || String(currentYear)\n const nextEndDate = buildDateLiteral(month, year)\n if (resumeData[index]) {\n applyRowFieldChange(resumeData[index], 'endDate', nextEndDate, rowHasContent)\n onChange()\n }\n }\n\n const handleEndYearChange = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const year = target.value\n const month = parseYearMonthFromDateText(toText(resumeData[index]?.endDate)).month || '01'\n const nextEndDate = buildDateLiteral(month, year)\n if (resumeData[index]) {\n applyRowFieldChange(resumeData[index], 'endDate', nextEndDate, rowHasContent)\n onChange()\n }\n }\n\n const handleDescriptionInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement\n const nextValue = sanitizeResumeFieldValue(target.value.slice(0, descriptionMaxLength))\n if (resumeData[index]) {\n applyRowFieldChange(resumeData[index], 'description', nextValue, rowHasContent)\n onChange()\n }\n }\n\n const handleCurrentRoleToggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n if (resumeData[index]) {\n applyRowFieldChange(resumeData[index], 'isCurrentRole', target.checked, rowHasContent)\n if (target.checked) {\n applyRowFieldChange(resumeData[index], 'endDate', undefined, rowHasContent)\n }\n\n const formRoot = target.form || target.closest('form')\n const endMonthSelect = formRoot?.querySelector(`#${endMonthSelectId}`) as HTMLSelectElement | null\n const endYearSelect = formRoot?.querySelector(`#${endYearSelectId}`) as HTMLSelectElement | null\n\n if (endMonthSelect) {\n endMonthSelect.disabled = target.checked\n endMonthSelect.value = ''\n const emptyOption = endMonthSelect.options[0]\n if (emptyOption) {\n emptyOption.text = target.checked ? 'Present' : 'Select Month'\n }\n }\n\n if (endYearSelect) {\n endYearSelect.disabled = target.checked\n endYearSelect.value = ''\n const emptyOption = endYearSelect.options[0]\n if (emptyOption) {\n emptyOption.text = target.checked ? '' : 'Select Year'\n }\n }\n }\n }\n\n const handleOrganizationTypeInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n const nextType = target.value\n if (resumeRow) {\n applyRowSelectChange(resumeRow, 'orgType', nextType)\n onChange()\n }\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--resume-entry-header\" role=\"group\" aria-labelledby=${experienceHeadingId}>\n <h3 id=${experienceHeadingId} class=\"profile-edit-dialog__entry-heading\">${label}</h3>\n <div class=\"profile-edit-dialog__actions profile-edit-dialog__actions--edge\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete resume ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n <label aria-label=${`${label} Title`} class=\"label profile-edit-dialog__field\">\n Title\n <input\n class=\"input\"\n type=\"text\"\n name=${titleName}\n .value=${resumeRow?.title || ''}\n data-contact-field=\"title\"\n data-entry-node=${resumeRow?.entryNode || ''}\n data-row-status=${resumeRow?.status || 'n/a'}\n placeholder=\"Title\"\n autocomplete=\"title\"\n inputmode=\"text\"\n @change=${handleResumeInput('title')}\n />\n </label>\n <div class=\"profile-edit-dialog__row\">\n <label aria-label=${`${label} Organization Name`} class=\"label profile-edit-dialog__field\">\n Company or Organization \n <input\n class=\"input\"\n type=\"text\"\n name=${organizationName}\n .value=${resumeRow?.orgName || ''}\n required\n data-contact-field=\"organizationName\"\n data-entry-node=${resumeRow?.entryNode || ''}\n data-row-status=${resumeRow?.status || 'n/a'}\n placeholder=\"Company or Organization\"\n autocomplete=\"organization\"\n inputmode=\"text\"\n @change=${handleResumeInput('orgName')}\n />\n </label>\n <label aria-label=${`${label} Organization Type`} class=\"label profile-edit-dialog__field\">\n Organization Type\n <select name=${organizationTypeName} id=${organizationTypeSelectId} @change=${handleOrganizationTypeInput} .value=${resumeRow?.orgType || ''}>\n <option value=\"Corporation\">Corporation</option>\n <option value=\"EducationalOrganization\">Educational Organization</option>\n <option value=\"ResearchOrganization\">Research Organization</option>\n <option value=\"GovernmentOrganization\">Government Organization</option>\n <option value=\"NGO\">NGO</option>\n <option value=\"PerformingGroup\">Performing Group</option>\n <option value=\"Project\">Project</option>\n <option value=\"SportsOrganization\">Sports Organization</option>\n <option value=\"Other\">Other</option>\n </select>\n </label>\n </div> \n <div class=\"profile-edit-dialog__row\">\n <label aria-label=${`${label} Company URL`} class=\"label profile-edit-dialog__field\">\n Company URL\n <input\n class=\"input\"\n type=\"text\"\n name=${companyUrlName}\n .value=${resumeRow?.orgHomePage || ''}\n data-contact-field=\"orgHomePage\"\n data-entry-node=${resumeRow?.entryNode || ''}\n data-row-status=${resumeRow?.status || 'n/a'}\n placeholder=\"Company URL\"\n autocomplete=\"url\"\n inputmode=\"text\"\n @change=${handleResumeInput('orgHomePage')}\n />\n </label>\n <label aria-label=${`${label} Location`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--resume-location\">\n Location\n <input\n class=\"input\"\n type=\"text\"\n name=${orgLocationName}\n .value=${resumeRow?.orgLocation || ''}\n data-contact-field=\"orgLocation\"\n data-entry-node=${resumeRow?.entryNode || ''}\n data-row-status=${resumeRow?.status || 'n/a'}\n placeholder=\"Location\"\n autocomplete=\"address-level2\"\n inputmode=\"text\"\n @change=${handleResumeInput('orgLocation')}\n />\n </label>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--resume-dates\">\n <label aria-label=${`Start Date ${displayIndex + 1}`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--date-group\">\n <span>Start Date</span>\n <div class=\"profile-edit-dialog__date-pair\">\n <select name=${startMonthInputName} id=${startMonthSelectId} aria-label=${startMonthLabel} @change=${handleStartMonthChange}>\n ${renderMonthOptions(startMonthValue)}\n </select>\n <select name=${startYearInputName} id=${startYearSelectId} aria-label=${startYearLabel} @change=${handleStartYearChange}>\n ${renderYearOptions(startYearText)}\n </select>\n </div>\n </label>\n <label aria-label=${`End Date ${displayIndex + 1}`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--date-group\">\n <span>End Date</span>\n <div class=\"profile-edit-dialog__date-pair\">\n <select\n name=${endMonthInputName}\n id=${endMonthSelectId}\n aria-label=${endMonthLabel}\n @change=${handleEndMonthChange}\n ?disabled=${Boolean(resumeRow?.isCurrentRole)}\n >\n ${renderMonthOptions(endMonthValue, resumeRow?.isCurrentRole ? 'Present' : 'Select Month')}\n </select>\n <select\n name=${endYearInputName}\n id=${endYearSelectId}\n aria-label=${endYearLabel}\n @change=${handleEndYearChange}\n ?disabled=${Boolean(resumeRow?.isCurrentRole)}\n >\n ${renderYearOptions(endYearParsedText, resumeRow?.isCurrentRole ? '' : 'Select Year')}\n </select>\n </div>\n </label>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--inline-end\">\n <label class=\"label profile-edit-dialog__checkbox-label\" for=${isCurrentRoleId}>\n <input\n class=\"profile-edit-dialog__checkbox-input\"\n type=\"checkbox\"\n id=${isCurrentRoleId}\n name=\"isCurrentRole\"\n .checked=${Boolean(resumeRow?.isCurrentRole)}\n @change=${handleCurrentRoleToggle}\n />\n <span>I am currently working in this role</span>\n </label>\n </div>\n <label aria-label=${`${label} Description`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--full profile-edit-dialog__field--stack\">\n <span>Description</span>\n <textarea\n class=\"profile-edit-dialog__textarea\"\n name=${descriptionName}\n rows=\"4\"\n .value=${resumeRow?.description || ''}\n maxlength=${descriptionMaxLength}\n aria-describedby=${descriptionCounterId}\n data-contact-field=\"description\"\n data-entry-node=${resumeRow?.entryNode || ''}\n data-row-status=${resumeRow?.status || 'n/a'}\n placeholder=\"Description\"\n autocomplete=\"off\"\n inputmode=\"text\"\n @input=${handleDescriptionInput}\n ></textarea>\n <small id=${descriptionCounterId} aria-live=\"polite\">${descriptionCount}/${descriptionMaxLength}</small>\n </label>\n `\n}\n\nfunction renderResumeSection(resumeData: ResumeRow[], onAddRow: () => void) {\n const visibleResumeRows = resumeData\n .map((resume, index) => ({ resume, index }))\n .filter(({ resume }) => resume.status !== 'deleted')\n\n return html`\n <section class=\"profile-edit-dialog__section profile-edit-dialog__section--resume\" aria-label=\"Resume\">\n <fieldset>\n <legend class=\"sr-only\">Resume entries</legend>\n ${visibleResumeRows.map(({ index }, displayIndex) => renderResumeInputRow({\n resumeData,\n index,\n displayIndex,\n onDelete: () => {\n deleteRow(resumeData, index)\n onAddRow()\n },\n onChange: onAddRow\n }))}\n </fieldset>\n </section>\n `\n}\n\nfunction renderResumeEditTemplate(\n form: HTMLFormElement,\n formState: ResumeFormState,\n rerender: () => void,\n viewerMode: ViewerMode\n) {\n render(html`\n ${renderResumeSection(formState.resumeData, rerender)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n}\n\ntype ResumeDialogRenderState = {\n dialogScrollTop: number\n descriptionScrollTop: number\n activeId: string\n activeName: string\n}\n\ntype ResumeRerenderOptions = {\n preserveState?: boolean\n focusSelector?: string\n}\n\nfunction captureResumeDialogRenderState(form: HTMLFormElement): ResumeDialogRenderState {\n const dialog = form.closest('dialog') as HTMLDialogElement | null\n const description = dialog?.querySelector('#modal-desc') as HTMLDivElement | null\n const activeElement = form.ownerDocument.activeElement as HTMLElement | null\n\n return {\n dialogScrollTop: dialog?.scrollTop || 0,\n descriptionScrollTop: description?.scrollTop || 0,\n activeId: activeElement?.id || '',\n activeName: activeElement?.getAttribute('name') || ''\n }\n}\n\nfunction restoreResumeDialogRenderState(form: HTMLFormElement, state: ResumeDialogRenderState): void {\n const dialog = form.closest('dialog') as HTMLDialogElement | null\n const description = dialog?.querySelector('#modal-desc') as HTMLDivElement | null\n\n if (dialog) dialog.scrollTop = state.dialogScrollTop\n if (description) description.scrollTop = state.descriptionScrollTop\n\n const escapedId = state.activeId && typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n ? CSS.escape(state.activeId)\n : state.activeId\n const escapedName = state.activeName && typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n ? CSS.escape(state.activeName)\n : state.activeName\n\n let nextActive: HTMLElement | null = null\n if (escapedId) {\n nextActive = form.querySelector(`#${escapedId}`) as HTMLElement | null\n }\n if (!nextActive && escapedName) {\n nextActive = form.querySelector(`[name=\"${escapedName}\"]`) as HTMLElement | null\n }\n\n if (nextActive && typeof nextActive.focus === 'function') {\n nextActive.focus({ preventScroll: true })\n }\n}\n\nfunction focusResumeField(form: HTMLFormElement, selector: string): void {\n const nextField = form.querySelector(selector) as HTMLElement | null\n if (!nextField || typeof nextField.focus !== 'function') return\n\n nextField.focus({ preventScroll: true })\n if (nextField instanceof HTMLInputElement || nextField instanceof HTMLTextAreaElement) {\n nextField.select()\n }\n}\n\nfunction createResumeEditForm(resumeData: RoleDetails[], viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n form.classList.add('profile__edit-form--resume')\n\n const formState = toFormState(resumeData)\n const rerender = (options: ResumeRerenderOptions = {}) => {\n const { preserveState = true, focusSelector } = options\n const renderState = preserveState ? captureResumeDialogRenderState(form) : null\n renderResumeEditTemplate(form, formState, rerender, viewerMode)\n if (renderState) {\n restoreResumeDialogRenderState(form, renderState)\n }\n if (focusSelector) {\n focusResumeField(form, focusSelector)\n }\n }\n rerender()\n\n const addRow = () => {\n formState.resumeData.unshift({\n title: '',\n roleType: '',\n startDate: undefined,\n endDate: undefined,\n isCurrentRole: false,\n orgName: '',\n orgType: '',\n orgLocation: '',\n orgHomePage: '',\n description: '',\n entryNode: '',\n status: 'new'\n })\n rerender({ preserveState: false, focusSelector: '[name=\"resume-title-0\"]' })\n }\n\n return { form, formState, rerender, addRow }\n}\n\n\nexport async function createResumeEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n resumeData: RoleDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState, rerender, addRow } = createResumeEditForm(resumeData, viewerMode)\n\n const result = await openInputDialog({\n title: editResumeDialogTitleText,\n dom,\n form,\n headerAction: {\n type: 'button',\n label: '+ Add More',\n ariaLabel: 'Add another resume entry',\n onClick: addRow\n },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: async () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n\n const plan: MutationOps<ResumeRow> = summarizeRowOps(formState.resumeData, rowHasContent)\n const hasChanges = plan.create.length > 0 || plan.update.length > 0 || plan.remove.length > 0\n if (!hasChanges) {\n return 'No resume changes detected.'\n }\n\n const validation = validateResumeBeforeSave(formState.resumeData)\n if (!validation.ok) {\n return validation.message || 'Please complete the required resume fields.'\n }\n\n return null\n },\n onSave: async () => {\n const plan: MutationOps<ResumeRow> = summarizeRowOps(formState.resumeData, rowHasContent)\n await processResumeMutations(store, subject, plan)\n rerender()\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveResumeUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n if (onSaved) {\n await onSaved()\n return\n }\n await alertDialog('Resume updates saved. Refresh to see latest values.', 'Saved', dom)\n}\n","import { html } from 'lit-html'\nimport { RoleDetails } from './types'\nimport { ViewerMode } from '../../types'\nimport '../../styles/CVCard.css'\nimport { resumeHeadingText } from '../../texts'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { createResumeEditDialog } from './ResumeEditDialog'\nimport {\n formatMonthYear,\n scheduleDescriptionOverflowCheck,\n toMonthDateTime,\n toggleDescription\n} from '../shared/sectionCardHelpers'\nimport { toggleCollapsibleSection } from '../shared/collapsibleSection'\nimport { editIcon, plusDarkIcon } from '../../icons-svg/profileIcons'\n\nfunction renderRole(role: RoleDetails, index: number) {\n if (!role) return html``\n const roleTitleId = `cv-role-title-${index}`\n const rolePeriodId = `cv-role-period-${index}`\n const roleOrgId = `cv-role-org-${index}`\n const roleDescriptionId = `cv-role-description-${index}`\n\n const ariaDescribedBy = role.description\n ? `${rolePeriodId} ${roleOrgId} ${roleDescriptionId}`\n : `${rolePeriodId} ${roleOrgId}`\n\n return html`\n <li class=\"cvRole\" role=\"listitem\" aria-labelledby=${roleTitleId} aria-describedby=${ariaDescribedBy}>\n <div class=\"cvRoleHeader\">\n <h4 id=${roleTitleId}>${role.title}</h4>\n <p id=${rolePeriodId} class=\"cvRolePeriod\">\n <time datetime=${toMonthDateTime(role.startDate)}>${formatMonthYear(role.startDate)}</time>\n <span aria-hidden=\"true\"> to </span>\n ${role.endDate\n ? html`<time datetime=${toMonthDateTime(role.endDate)}>${formatMonthYear(role.endDate)}</time>`\n : html`<span>Present</span>`}\n </p>\n </div>\n <p class=\"cvOrg\" id=${roleOrgId}>\n <strong>${role.orgName}</strong>${role.orgLocation ? html` | ${role.orgLocation}` : ''}\n </p>\n ${role.description ? html`\n <div class=\"cvDescriptionWrap\">\n <p class=\"cvDescriptionText\" id=${roleDescriptionId}>${role.description}</p>\n <button\n type=\"button\"\n class=\"cvDescriptionToggle\"\n aria-controls=${roleDescriptionId}\n aria-expanded=\"false\"\n hidden\n @click=${toggleDescription}\n >\n ...more\n </button>\n </div>\n ` : ''}\n </li>\n `\n}\n\nfunction renderRoles(roles: RoleDetails[]) {\n if (!roles || !roles.length) return html``\n return html`${roles.map((role, index) => renderRole(role, index))}`\n}\n\nexport const CVCard = (\n cvData: RoleDetails[],\n viewerMode: ViewerMode\n) => {\n void viewerMode\n const hasRoles = Array.isArray(cvData) && cvData.length > 0\n if (!hasRoles) return html``\n\n return html`\n <article class=\"cvCard\" aria-label=\"Resume\" data-testid=\"curriculum-vitae\">\n <section class=\"cvSection\">\n <ul role=\"list\" aria-label=\"Work experience in chronological order\">\n ${renderRoles(cvData)}\n </ul>\n </section>\n </article>\n `\n}\n\nfunction renderResumeSectionDefault(\n store: LiveStore, \n subject: NamedNode, \n resumeDetails: RoleDetails[], \n viewerMode: ViewerMode, \n onSaved?: () => Promise<void> | void) {\n scheduleDescriptionOverflowCheck()\n\n const hasResume = resumeDetails.length > 0\n const showSection = true\n const cv = hasResume ? CVCard(resumeDetails, viewerMode) : html``\n const isOwner = viewerMode === 'owner'\n\n return showSection ? html`\n <section \n aria-labelledby=\"cv-heading\" \n class=\"profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions\" \n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"cv-heading\" tabindex=\"-1\">${resumeHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n ${isOwner ? html`\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Edit resume details\"\n @click=${(event: Event) => createResumeEditDialog(event, store, subject, resumeDetails, viewerMode, onSaved)}\n >\n <span class=\"profile-section-collapsible__edit-label\">${editIcon} Edit</span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n ` : html``}\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle resume section\"\n aria-controls=\"cv-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"cv-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${hasResume ? cv : html`<p>No resume details added yet.</p>`}\n </div>\n </section>\n ` : ''\n}\n\nfunction renderOwnerEmptyResumeContent(\n store: LiveStore,\n subject: NamedNode,\n resumeDetails: RoleDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void) {\n\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty resume section\">\n <h2 id=\"resume-heading\" tabindex=\"-1\">${resumeHeadingText}</h2>\n <p class=\"profile__empty-state-message\">\n You haven't included any professional experience yet. Consider adding your work history to enhance your resume.\n </p>\n </div>\n <button\n type=\"button\"\n class=\"profile__action-button--empty\"\n aria-label=\"Add resume details\"\n @click=${(event: Event) => {\n return createResumeEditDialog(\n event,\n store,\n subject,\n resumeDetails,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile__action-icon\" aria-hidden=\"true\">${plusDarkIcon} Add Resume</span>\n </button>\n\n `\n}\n\nfunction renderOwnerEmptyResumeSection(\n store: LiveStore,\n subject: NamedNode,\n resumeDetails: RoleDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"resume-heading\" \n data-profile-section=\"resume\"\n class=\"profile__section--empty border-lighter flex-column-center rounded-md gap-lg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n ${renderOwnerEmptyResumeContent(store, subject, resumeDetails, viewerMode, onSaved)}\n </section>\n `\n}\n\nexport function renderCVSection(\n store: LiveStore,\n subject: NamedNode,\n roles: RoleDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n\n const resumeDetails: RoleDetails[] = roles || []\n const hasResume = resumeDetails.length > 0\n const showOwnerEmptyResume = !hasResume && viewerMode === 'owner'\n const showSection = true\n\n return showSection ? html`\n ${showOwnerEmptyResume\n ? renderOwnerEmptyResumeSection(store, subject, resumeDetails, viewerMode, onSaved)\n : renderResumeSectionDefault(store, subject, resumeDetails, viewerMode, onSaved)}\n ` : ''\n}\n","import { LiveStore, NamedNode, st, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { ProjectMutationPlan, ProjectRow } from './types'\nimport { MutationOps } from '../shared/types'\n\n/* This code is AI generated from Model: GPT-5.3-Codex */\n/* Prompt: I need to store Project data only the url of the project how\n should I store it please generate the code. Follow other sections */\nfunction toProjectUrlNode(project: ProjectRow): NamedNode | null {\n\tconst value = (project.url || '').trim()\n\tif (!value) return null\n\ttry {\n\t\treturn sym(new URL(value).href)\n\t} catch {\n\t\treturn null\n\t}\n}\n\nfunction normalizeProjectUrlKey(value: string): string {\n\tconst text = (value || '').trim()\n\tif (!text) return ''\n\ttry {\n\t\tconst parsed = new URL(text)\n\t\tparsed.hash = ''\n\t\treturn parsed.href\n\t} catch {\n\t\treturn text\n\t}\n}\n\nfunction isPatchFailure(message: string): boolean {\n\tconst text = (message || '').toLowerCase()\n\treturn (\n\t\ttext.includes(' on patch ') ||\n\t\ttext.includes('web error: 500') ||\n\t\ttext.includes('web error: 501') ||\n\t\ttext.includes('web error: 405') ||\n\t\ttext.includes('web error: 400')\n\t)\n}\n\nfunction isMissingGetRecordError(message: string): boolean {\n\treturn (message || '').toLowerCase().includes('no record of our http get request for document')\n}\n\nfunction statementKey(statement: any): string {\n\treturn `${statement.subject?.toNT?.() || statement.subject?.value} ${statement.predicate?.toNT?.() || statement.predicate?.value} ${statement.object?.toNT?.() || statement.object?.value} ${statement.why?.toNT?.() || statement.why?.value}`\n}\n\nfunction sanitizePatchStatements(store: LiveStore, deletions: any[], insertions: any[]) {\n\tconst safeDeletions = Array.from(new Map(\n\t\t(deletions || [])\n\t\t\t.filter((statement) => {\n\t\t\t\tif (!statement || !statement.subject || !statement.predicate || !statement.object) return false\n\t\t\t\treturn store.holds(statement.subject, statement.predicate, statement.object, statement.why)\n\t\t\t})\n\t\t\t.map((statement) => [statementKey(statement), statement])\n\t).values())\n\n\tconst safeInsertions = Array.from(new Map(\n\t\t(insertions || [])\n\t\t\t.filter((statement) => Boolean(statement && statement.subject && statement.predicate && statement.object))\n\t\t\t.map((statement) => [statementKey(statement), statement])\n\t).values())\n\n\treturn { safeDeletions, safeInsertions }\n}\n\nasync function runPutFallback(store: LiveStore, doc: NamedNode, deletions: any[], insertions: any[]) {\n\tconst updater = store.updater as any\n\tconst fetcher = (store as any).fetcher\n\n\tif (!updater || typeof updater.serialize !== 'function' || !fetcher || typeof fetcher.webOperation !== 'function') {\n\t\tthrow new Error('Project updates are not supported by this store updater.')\n\t}\n\n\tconst currentStatements = store.statementsMatching(undefined, undefined, undefined, doc).slice()\n\tconst deletionKeys = new Set((deletions || []).map((statement) => statementKey(statement)))\n\tconst nextStatements = currentStatements.filter((statement) => !deletionKeys.has(statementKey(statement))).concat(insertions || [])\n\n\tconst contentType = 'text/turtle'\n\tconst body = updater.serialize(doc.value, nextStatements, contentType)\n\tconst response = await fetcher.webOperation('PUT', doc.value, {\n\t\tnoMeta: true,\n\t\tcontentType,\n\t\tbody\n\t})\n\n\tif (!response || response.ok !== true) {\n\t\tconst status = response?.status || 'unknown'\n\t\tthrow new Error(`Web error: ${status} on PUT of <${doc.value}>`)\n\t}\n\n\tstore.remove(deletions)\n\tinsertions.forEach((statement) => {\n\t\tstore.add(statement.subject, statement.predicate, statement.object, statement.why)\n\t})\n}\n\nasync function runUpdateWithDavFallback(store: LiveStore, doc: NamedNode, deletions: any[], insertions: any[]) {\n\tconst updater = store.updater as any\n\tif (!updater || typeof updater.update !== 'function') {\n\t\tthrow new Error('Project updates are not supported by this store updater.')\n\t}\n\n\tconst { safeDeletions, safeInsertions } = sanitizePatchStatements(store, deletions, insertions)\n\tif (safeDeletions.length === 0 && safeInsertions.length === 0) {\n\t\treturn\n\t}\n\n\tconst tryUpdate = () => new Promise<void>((resolve, reject) => {\n\t\tupdater.update(safeDeletions, safeInsertions, (_uri: string, ok: boolean, message?: string) => {\n\t\t\tif (ok === true) {\n\t\t\t\tresolve()\n\t\t\t\treturn\n\t\t\t}\n\t\t\treject(new Error(message || 'Failed to save projects'))\n\t\t})\n\t})\n\n\ttry {\n\t\tawait tryUpdate()\n\t\treturn\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!isPatchFailure(message) || typeof updater.updateDav !== 'function') {\n\t\t\tthrow error\n\t\t}\n\n\t\tif (store.fetcher && typeof (store.fetcher as any).load === 'function') {\n\t\t\ttry {\n\t\t\t\tawait (store.fetcher as any).load(doc)\n\t\t\t} catch {\n\t\t\t\t// continue to fallback\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tupdater.updateDav(doc, safeDeletions, safeInsertions, (_uri: string, ok: boolean, body?: string) => {\n\t\t\t\t\tif (ok === true) {\n\t\t\t\t\t\tresolve()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\treject(new Error(body || message || 'Failed to save projects'))\n\t\t\t\t})\n\t\t\t})\n\t\t} catch (davError) {\n\t\t\tconst davMessage = davError instanceof Error ? davError.message : String(davError)\n\t\t\tif (!isMissingGetRecordError(davMessage)) {\n\t\t\t\tthrow davError\n\t\t\t}\n\t\t\tawait runPutFallback(store, doc, safeDeletions, safeInsertions)\n\t\t}\n\t}\n}\n\nasync function mutateProjectEntries(store: LiveStore, subject: NamedNode, projectOps: MutationOps<ProjectRow>) {\n\tconst doc = subject.doc()\n\tconst existingLinks = store.each(subject, ns.solid('community'), null, doc)\n\tconst existingByUrl = new Map<string, NamedNode>()\n\texistingLinks.forEach((linkNode: any) => {\n\t\tif (!linkNode || linkNode.termType !== 'NamedNode') return\n\t\tconst key = normalizeProjectUrlKey(linkNode.value)\n\t\tif (key && !existingByUrl.has(key)) {\n\t\t\texistingByUrl.set(key, linkNode as NamedNode)\n\t\t}\n\t})\n\n\tconst deletions: any[] = []\n\tconst insertions: any[] = []\n\tconst removeLink = (link: NamedNode) => {\n\t\tdeletions.push(st(subject, ns.solid('community'), link, doc))\n\t}\n\tconst addLink = (link: NamedNode) => {\n\t\tinsertions.push(st(subject, ns.solid('community'), link, doc))\n\t}\n\n\tprojectOps.remove.forEach((project) => {\n\t\tconst entryKey = normalizeProjectUrlKey(project.entryNode || '')\n\t\tconst urlKey = normalizeProjectUrlKey(project.url)\n\t\tconst existing = (entryKey && existingByUrl.get(entryKey)) || (urlKey && existingByUrl.get(urlKey))\n\t\tif (existing) removeLink(existing)\n\t})\n\n\tprojectOps.update.forEach((project) => {\n\t\tconst newLink = toProjectUrlNode(project)\n\t\tconst urlKey = normalizeProjectUrlKey(project.url)\n\t\tconst entryKey = normalizeProjectUrlKey(project.entryNode || '')\n\t\tconst existing = (entryKey && existingByUrl.get(entryKey)) || (urlKey && existingByUrl.get(urlKey))\n\t\tif (existing) removeLink(existing)\n\t\tif (newLink) addLink(newLink)\n\t})\n\n\tconst seenCreateUrlKeys = new Set<string>()\n\tprojectOps.create.forEach((project) => {\n\t\tconst urlKey = normalizeProjectUrlKey(project.url)\n\t\tif (urlKey && (existingByUrl.has(urlKey) || seenCreateUrlKeys.has(urlKey))) {\n\t\t\treturn\n\t\t}\n\t\tconst newLink = toProjectUrlNode(project)\n\t\tif (!newLink) return\n\t\taddLink(newLink)\n\t\tif (urlKey) {\n\t\t\tseenCreateUrlKeys.add(urlKey)\n\t\t}\n\t})\n\n\tawait runUpdateWithDavFallback(store, doc, deletions, insertions)\n}\n\nexport async function processProjectsMutations(store: LiveStore, subject: NamedNode, mutationPlan: ProjectMutationPlan) {\n\ttry {\n\t\tawait mutateProjectEntries(store, subject, mutationPlan)\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tthrow new Error(`Failed to save projects: ${message}`)\n\t}\n}\n","import { openInputDialog } from '../../ui/dialog'\nimport { html, render } from 'lit-html'\nimport { ProjectDetails, ProjectRow } from './types'\nimport '../../styles/EditDialogs.css'\nimport '../../styles/ContactInfoEditDialog.css'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { applyRowFieldChange, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue } from '../../textUtils'\nimport { MutationOps } from '../shared/types'\nimport { processProjectsMutations } from './mutations'\nimport { pasteIcon } from '../../icons-svg/profileIcons'\nimport {\n editProjectsDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n pasteEntryButtonTitleText,\n saveProjectsUpdatesFailedPrefixText,\n} from '../../texts'\n\ntype ProjectFormState = {\n project: ProjectRow\n}\n\nfunction sanitizeProjectFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n\nfunction isValidProjectUrl(value: string): boolean {\n const text = sanitizeProjectFieldValue(value)\n if (!text) return false\n\n try {\n const parsed = new URL(text)\n return (\n parsed.protocol === 'https:' &&\n parsed.pathname === '/profile/card' &&\n parsed.hash === '#me'\n )\n } catch {\n return false\n }\n}\n\nfunction rowHasContent(row: ProjectRow): boolean {\n return [row.url, row.entryNode].some(hasNonEmptyText)\n}\n\nasync function pasteWebIdIntoRow(row: ProjectRow): Promise<string> {\n const clipboardText = await navigator.clipboard.readText()\n const url = sanitizeProjectFieldValue(clipboardText)\n if (!url) return ''\n\n applyRowFieldChange(row, 'url', url, rowHasContent)\n\n return url\n}\n\nfunction toFormState(_details: ProjectDetails[]): ProjectFormState {\n return {\n project: { url: '', entryNode: '', status: 'new' }\n }\n}\n\nfunction validateProjectBeforeSave(row: ProjectRow): string | null {\n if (!hasNonEmptyText(row.url) && !hasNonEmptyText(row.entryNode)) {\n return 'Add a project WebID.'\n }\n if (!hasNonEmptyText(row.url)) {\n return 'WebID is required.'\n }\n if (!isValidProjectUrl(row.url)) {\n return 'Please enter a valid WebID in the form https://example.com/profile/card#me.'\n }\n return null\n}\n\nfunction renderProjectInputRow(row: ProjectRow, onChange: () => void) {\n const projectUrl = 'project-0'\n\n const handleUrlInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeProjectFieldValue(target.value)\n applyRowFieldChange(row, 'url', nextValue, rowHasContent)\n }\n\n const handlePaste = async (event: Event) => {\n event.preventDefault()\n\n try {\n const url = await pasteWebIdIntoRow(row)\n onChange()\n\n if (!isValidProjectUrl(url)) return\n\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const saveButton = dom.querySelector('#profile-modal #modal-buttons .btn-primary') as HTMLButtonElement | null\n saveButton?.click()\n } catch {\n // Clipboard access may fail due to browser permissions; keep dialog usable.\n }\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--project\">\n <label aria-label=\"Project or community WebID\" class=\"label profile-edit-dialog__field profile-edit-dialog__field--full\">\n <p>Type or paste a project or community WebID.</p> \n <div class=\"profile-edit-dialog__input-wrap\">\n <input\n class=\"input profile-edit-dialog__input--with-action\"\n type=\"text\"\n name=${projectUrl}\n .value=${row?.url || ''}\n required\n data-contact-field=\"url\"\n data-entry-node=${row?.entryNode || ''}\n data-row-status=${row?.status || 'n/a'}\n placeholder=\"Type or paste project/community WebID here\"\n autocomplete=\"off\"\n inputmode=\"text\"\n @input=${handleUrlInput}\n />\n <button\n type=\"button\"\n class=\"profile-edit-dialog__paste-button rounded-sm gap-xxs\"\n aria-label=\"Paste project or community URL from clipboard\"\n title=${pasteEntryButtonTitleText}\n @click=${handlePaste}\n >\n <span class=\"profile-edit-dialog__paste-icon\" aria-hidden=\"true\">${pasteIcon}</span>\n Paste\n </button>\n </div>\n </label>\n </div>\n `\n}\n\nfunction renderProjectsEditTemplate(form: HTMLFormElement, formState: ProjectFormState, viewerMode: ViewerMode) {\n const rerender = () => renderProjectsEditTemplate(form, formState, viewerMode)\n\n render(html`\n ${renderProjectInputRow(formState.project, rerender)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n}\n\nfunction createProjectsEditForm(details: ProjectDetails[], viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n form.classList.add('profile__edit-form--projects')\n\n const formState = toFormState(details)\n renderProjectsEditTemplate(form, formState, viewerMode)\n\n return { form, formState }\n}\n\n\nexport async function createProjectsEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n projects: ProjectDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState } = createProjectsEditForm(projects, viewerMode)\n\n const dialogPromise = openInputDialog({\n title: editProjectsDialogTitleText,\n dom,\n form,\n headerAction: { type: 'close' },\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n return validateProjectBeforeSave(formState.project)\n },\n onSave: async () => {\n const projectOps = summarizeRowOps([formState.project], rowHasContent)\n const plan: MutationOps<ProjectRow> = {\n create: projectOps.create,\n update: projectOps.update,\n remove: projectOps.remove\n }\n await processProjectsMutations(store, subject, plan)\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveProjectsUpdatesFailedPrefixText} ${message}`\n }\n })\n\n const modalButtons = dom.querySelector('#profile-modal #modal-buttons') as HTMLElement | null\n const previousButtonsDisplay = modalButtons?.style.display\n if (modalButtons) {\n modalButtons.style.display = 'none'\n }\n\n let result: Record<string, string> | null = null\n try {\n result = await dialogPromise\n } finally {\n if (modalButtons) {\n modalButtons.style.display = previousButtonsDisplay || ''\n }\n }\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./ProjectsCard.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./ProjectsCard.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { html } from 'lit-html'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { ProjectDetails, ProjectRow } from './types'\nimport { projectsHeadingText } from '../../texts'\nimport { createProjectsEditDialog } from './ProjectEditDialog'\nimport { processProjectsMutations } from './mutations'\nimport { addIcon, checkMarkIcon, plusDarkIcon, twoDownArrowsIcon } from '../../icons-svg/profileIcons'\nimport { MutationOps } from '../shared/types'\nimport '../../styles/ProjectsCard.css'\nimport { toggleCollapsibleSection } from '../shared/collapsibleSection'\n\nconst MAX_VISIBLE_PROJECTS_MOBILE = 2\n\nfunction toggleProjectsMobileList(event: Event): void {\n const button = event.currentTarget as HTMLButtonElement | null\n const section = button?.closest('.profile-section-collapsible') as HTMLElement | null\n if (!button || !section) return\n\n const nextExpanded = section.getAttribute('data-mobile-expanded') !== 'true'\n section.setAttribute('data-mobile-expanded', String(nextExpanded))\n button.setAttribute('aria-expanded', String(nextExpanded))\n button.setAttribute('data-mobile-expanded', String(nextExpanded))\n\n const label = button.querySelector('.project-card__more-label') as HTMLSpanElement | null\n if (label) {\n label.textContent = nextExpanded ? 'View Less' : 'View More'\n }\n}\n\nfunction renderProjectImage(src: string | undefined, altText: string) {\n return src\n ? html`\n <img\n class=\"project-card__thumb-image\"\n src=${src}\n alt=${altText}\n loading=\"lazy\"\n />\n `\n : html`\n <div class=\"project-card__thumb-fallback flex-center\" role=\"img\" aria-label=${altText} tabindex=\"0\">\n ${altText}\n </div>\n `\n}\n\nfunction toProjectRow(project: ProjectDetails, status: 'existing' | 'deleted'): ProjectRow {\n return {\n url: project.url,\n title: project.title,\n imageUrl: project.imageUrl,\n category: project.category,\n name: project.name,\n orgName: project.orgName,\n entryNode: (project.entryNode as any)?.value || '',\n status\n }\n}\n\nfunction renderProject(\n project: ProjectDetails,\n store: LiveStore,\n subject: NamedNode,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n if (!project) return html``\n\n const handleUnfollow = async (event: Event) => {\n event.preventDefault()\n if (viewerMode !== 'owner') return\n\n const removePlan: MutationOps<ProjectRow> = {\n create: [],\n update: [],\n remove: [toProjectRow(project, 'deleted')]\n }\n\n await processProjectsMutations(store, subject, removePlan)\n if (onSaved) {\n await onSaved()\n }\n }\n\n const normalizedCategory = (project.category || '').trim().toLowerCase()\n const categoryModifier = normalizedCategory === 'project'\n ? 'project'\n : normalizedCategory === 'community'\n ? 'community'\n : 'unknown'\n const categoryLabel = normalizedCategory && normalizedCategory !== 'unknown'\n ? normalizedCategory.charAt(0).toUpperCase() + normalizedCategory.slice(1)\n : 'Uncategorized'\n\n return html`\n <li class=\"project-card flex-column\" role=\"listitem\">\n <a\n class=\"project-card__link\"\n href=${project.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=${project.title ? `Open ${project.title}` : 'Open project link'}\n >\n <div class=\"project-card__wrapper\">\n <div class=\"project-card__thumb flex-center\">\n ${renderProjectImage(project.imageUrl, project.title || 'Project preview')}\n </div>\n <div class=\"project-card__content\">\n <p class=\"project-card__title\"><strong>${project.title || project.url}</strong></p>\n <p class=\"project-card__organization\">${project.orgName || 'Organization unknown'}</p>\n <p class=\"project-card__category project-card__category--${categoryModifier}\">${categoryLabel}</p>\n </div>\n </div>\n </a>\n ${viewerMode === 'owner' ? html`\n <div class=\"project-card__footer\">\n <button\n type=\"button\"\n class=\"project-card__follow-button flex-center gap-xxs\"\n aria-label=\"Unfollow project\"\n @click=${handleUnfollow}\n >\n <span>${checkMarkIcon} Following</span>\n </button>\n </div>\n ` : html``}\n </li>\n `\n}\n\nfunction renderOwnerEmptyProjectsContent(\n store: LiveStore,\n subject: NamedNode,\n projectData: ProjectDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const projectDetails: ProjectDetails[] = projectData\n\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty projects section\">\n <h2 id=\"projects-heading\" tabindex=\"-1\">${projectsHeadingText}</h2>\n <p class=\"profile__empty-state-message\">\n You haven't added any projects yet. Consider adding a project to boost your profile.\n </p>\n </div>\n <button\n type=\"button\"\n class=\"profile__action-button--empty\"\n aria-label=\"Add project details\"\n @click=${(event: Event) => {\n return createProjectsEditDialog(\n event,\n store,\n subject,\n projectDetails,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile__action-icon\" aria-hidden=\"true\">${plusDarkIcon} Add Project</span>\n </button>\n\n `\n}\n\nfunction renderOwnerEmptyProjectSection(\n store: LiveStore,\n subject: NamedNode,\n projectData: ProjectDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"projects-heading\" \n data-profile-section=\"projects\"\n class=\"profile__section--empty border-lighter flex-column-center rounded-md gap-lg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n ${renderOwnerEmptyProjectsContent(store, subject, projectData, viewerMode, onSaved)}\n </section>\n `\n}\n\nfunction renderProjectSectionContent(\n projects: ProjectDetails[],\n store: LiveStore,\n subject: NamedNode,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n if (!projects || !projects.length || !projects[0]) return html``\n\n return html`${renderProject(projects[0], store, subject, viewerMode, onSaved)}${projects.length > 1 ? renderProjectSectionContent(projects.slice(1), store, subject, viewerMode, onSaved) : html``}`\n}\n\nfunction renderProjectSectionDefault(\n store: LiveStore, \n subject: NamedNode, \n projects: ProjectDetails[], \n viewerMode: ViewerMode, \n onSaved?: () => Promise<void> | void) {\n const hasProjects = Array.isArray(projects) && projects.length > 0\n const hiddenProjectsCount = Math.max(0, projects.length - MAX_VISIBLE_PROJECTS_MOBILE)\n const isOwner = viewerMode === 'owner'\n\n return html`\n <section\n class=\"profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions\"\n aria-labelledby=\"projects-heading\"\n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n data-mobile-expanded=\"${hiddenProjectsCount > 0 ? 'false' : 'true'}\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"projects-heading\">${projectsHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n ${isOwner ? html`\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add or edit projects\"\n @click=${(event: Event) => {\n return createProjectsEditDialog(event, store, subject, projects, viewerMode, onSaved)\n }}\n >\n <span class=\"profile-section-collapsible__edit-label profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add More\n </span>\n <span class=\"profile-section-collapsible__edit-icon profile-section-collapsible__edit-icon--add profile-section-collapsible__edit-icon--projects\" aria-hidden=\"true\">${plusDarkIcon}</span>\n </button>\n ` : html``}\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle projects section\"\n aria-controls=\"projects-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"projects-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${hasProjects\n ? html`\n <ul id=\"projects-rail\" class=\"project-card__rail\" role=\"list\" aria-label=\"Known projects\">\n ${renderProjectSectionContent(\n projects,\n store,\n subject,\n viewerMode,\n onSaved\n )}\n </ul>\n ${hiddenProjectsCount > 0\n ? html`\n <button\n type=\"button\"\n class=\"project-card__more-button\"\n aria-controls=\"projects-rail\"\n aria-expanded=\"false\"\n data-mobile-expanded=\"false\"\n @click=${toggleProjectsMobileList}\n >\n <span class=\"project-card__more-icon\" aria-hidden=\"true\">${twoDownArrowsIcon}</span>\n <span class=\"project-card__more-label\">View More</span>\n </button>\n `\n : html``}\n `\n : html`<p>No projects added yet.</p>`}\n </div>\n </section>\n `\n}\n\nexport function renderProjectSection(\n store: LiveStore,\n subject: NamedNode,\n projects: ProjectDetails[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const hasProjects = Array.isArray(projects) && projects.length > 0\n const showOwnerEmptyProject = !hasProjects && viewerMode === 'owner'\n \n const showSection = true\n \n return showSection ? html`\n ${showOwnerEmptyProject\n ? renderOwnerEmptyProjectSection(store, subject, projects, viewerMode, onSaved)\n : renderProjectSectionDefault(store, subject, projects, viewerMode, onSaved)}\n ` : ''\n}\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./HeadingSection.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./HeadingSection.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { LiveStore, NamedNode, Node, st, literal, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { ProfileBasicRow, HeadingMutationPlan } from './types'\nimport { MutationOps } from '../shared/types'\nimport { applyUpdaterPatch, collectLinkedNodeStatements, collectNodeStatements, findExistingNode, replacePredicateStatements } from '../shared/rdfMutationHelpers'\nimport { createIdNode } from '../shared/idNodeFactory'\nimport { saveHeadingUpdatesFailedPrefixText } from '../../texts'\nimport { ContactAddressRow, ContactPointRow } from '../contactInfo/types'\n\nfunction buildPhoneStatements(subject: NamedNode, doc: NamedNode, node: Node, phone: ContactPointRow) {\n const normalizedValue = phone.value.startsWith('tel:') ? phone.value : `tel:${phone.value}`\n const valueNode = sym(normalizedValue)\n const inserts = [\n st(subject, ns.vcard('hasTelephone'), node as any, doc),\n st(node as any, ns.vcard('value'), valueNode as any, doc)\n ]\n\n if (phone.type) {\n inserts.push(st(node as any, ns.rdf('type'), ns.vcard(phone.type), doc))\n }\n\n return inserts\n}\n\nfunction buildEmailStatements(subject: NamedNode, doc: NamedNode, node: Node, email: ContactPointRow) {\n const normalizedValue = email.value.startsWith('mailto:') ? email.value : `mailto:${email.value}`\n const valueNode = sym(normalizedValue)\n const inserts = [\n st(subject, ns.vcard('hasEmail'), node as any, doc),\n st(node as any, ns.vcard('value'), valueNode as any, doc)\n ]\n\n if (email.type) {\n inserts.push(st(node as any, ns.rdf('type'), ns.vcard(email.type), doc))\n }\n\n return inserts\n}\n\nfunction buildAddressStatements(subject: NamedNode, doc: NamedNode, node: Node, address: ContactAddressRow) {\n const inserts = [st(subject, ns.vcard('hasAddress'), node as any, doc)]\n\n if (address.type) inserts.push(st(node as any, ns.rdf('type'), ns.vcard(address.type), doc))\n if (address.streetAddress) inserts.push(st(node as any, ns.vcard('street-address'), address.streetAddress as any, doc))\n if (address.locality) inserts.push(st(node as any, ns.vcard('locality'), address.locality as any, doc))\n if (address.region) inserts.push(st(node as any, ns.vcard('region'), address.region as any, doc))\n if (address.postalCode) inserts.push(st(node as any, ns.vcard('postal-code'), address.postalCode as any, doc))\n if (address.countryName) inserts.push(st(node as any, ns.vcard('country-name'), address.countryName as any, doc))\n\n return inserts\n}\n\nfunction findOpWithExistingEntry<T extends { entryNode: string }>(ops: T[], existingNodes: Node[]): T | undefined {\n return ops.find((op) => Boolean(op.entryNode) && Boolean(findExistingNode(existingNodes, op.entryNode)))\n}\n\nfunction findCreateOp<T extends { entryNode: string }>(ops: T[]): T | undefined {\n return ops.find((op) => !op.entryNode)\n}\n\nasync function mutatePhoneEntry(store: LiveStore, subject: NamedNode, phoneOps: MutationOps<ContactPointRow>) {\n const doc = subject.doc()\n const existingPhoneNodes = store.each(subject, ns.vcard('hasTelephone'), null, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n const removePhone = findOpWithExistingEntry(phoneOps.remove, existingPhoneNodes)\n const updatePhone = findOpWithExistingEntry(phoneOps.update, existingPhoneNodes)\n const createPhone = findCreateOp(phoneOps.create) || phoneOps.create[0]\n\n if (removePhone?.entryNode) {\n const existingNode = findExistingNode(existingPhoneNodes, removePhone.entryNode)\n if (existingNode) {\n const linkedPhoneStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasTelephone'), doc)\n const matchingLinkStatement = linkedPhoneStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n }\n\n if (updatePhone) {\n const existingNode = findExistingNode(existingPhoneNodes, updatePhone.entryNode)\n if (existingNode) {\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n insertions.push(...buildPhoneStatements(subject, doc, existingNode, updatePhone))\n }\n }\n\n if (createPhone) {\n insertions.push(...buildPhoneStatements(subject, doc, createIdNode(doc), createPhone))\n }\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nasync function mutateEmailEntry(store: LiveStore, subject: NamedNode, emailOps: MutationOps<ContactPointRow>) {\n const doc = subject.doc()\n const existingEmailNodes = store.each(subject, ns.vcard('hasEmail'), null, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n const removeEmail = findOpWithExistingEntry(emailOps.remove, existingEmailNodes)\n const updateEmail = findOpWithExistingEntry(emailOps.update, existingEmailNodes)\n const createEmail = findCreateOp(emailOps.create) || emailOps.create[0]\n\n if (removeEmail?.entryNode) {\n const existingNode = findExistingNode(existingEmailNodes, removeEmail.entryNode)\n if (existingNode) {\n const linkedEmailStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasEmail'), doc)\n const matchingLinkStatement = linkedEmailStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n }\n\n if (updateEmail) {\n const existingNode = findExistingNode(existingEmailNodes, updateEmail.entryNode)\n if (existingNode) {\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n insertions.push(...buildEmailStatements(subject, doc, existingNode, updateEmail))\n }\n }\n\n if (createEmail) {\n insertions.push(...buildEmailStatements(subject, doc, createIdNode(doc), createEmail))\n }\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nasync function mutateAddressEntry(store: LiveStore, subject: NamedNode, addressOps: MutationOps<ContactAddressRow>) {\n const doc = subject.doc()\n const existingAddressNodes = store.each(subject, ns.vcard('hasAddress'), null, doc) as Node[]\n const deletions: any[] = []\n const insertions: any[] = []\n\n const removeAddress = findOpWithExistingEntry(addressOps.remove, existingAddressNodes)\n const updateAddress = findOpWithExistingEntry(addressOps.update, existingAddressNodes)\n const createAddress = findCreateOp(addressOps.create) || addressOps.create[0]\n\n if (removeAddress?.entryNode) {\n const existingNode = findExistingNode(existingAddressNodes, removeAddress.entryNode)\n if (existingNode) {\n const linkedAddressStatements = collectLinkedNodeStatements(store, subject, ns.vcard('hasAddress'), doc)\n const matchingLinkStatement = linkedAddressStatements.linkStatements.find((statement) => statement.object?.value === existingNode.value)\n if (matchingLinkStatement) {\n deletions.push(matchingLinkStatement)\n }\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n }\n }\n\n if (updateAddress) {\n const existingNode = findExistingNode(existingAddressNodes, updateAddress.entryNode)\n if (existingNode) {\n deletions.push(...collectNodeStatements(store, existingNode, doc))\n insertions.push(...buildAddressStatements(subject, doc, existingNode, updateAddress))\n }\n }\n\n if (createAddress) {\n insertions.push(...buildAddressStatements(subject, doc, createIdNode(doc), createAddress))\n }\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nasync function mutateBasicProfileEntry(store: LiveStore, subject: NamedNode, basicOps: MutationOps<ProfileBasicRow>) {\n const doc = subject.doc()\n const deletions: any[] = []\n const insertions: any[] = []\n\n const replaceLiteralField = (predicate: NamedNode, value?: string) => {\n const normalized = (value || '').trim()\n const nextObject = normalized ? literal(normalized) : null\n replacePredicateStatements(store, subject, predicate, doc, deletions, insertions, nextObject)\n }\n\n const replacePhotoField = (value?: string) => {\n const normalized = (value || '').trim()\n const nextObject = !normalized\n ? null\n : (normalized.startsWith('http://') || normalized.startsWith('https://'))\n ? sym(normalized)\n : literal(normalized)\n replacePredicateStatements(store, subject, ns.vcard('hasPhoto'), doc, deletions, insertions, nextObject)\n }\n\n const applyBasics = (basic: ProfileBasicRow, clearAll = false) => {\n const data = clearAll\n ? {\n name: '',\n nickname: '',\n dateOfBirth: '',\n jobTitle: '',\n orgName: '',\n imageSrc: ''\n }\n : basic\n\n replaceLiteralField(ns.vcard('fn'), data.name)\n // Keep foaf:nick in sync where available in existing data.\n replaceLiteralField(ns.foaf('nick'), data.nickname)\n replaceLiteralField(ns.vcard('nickname'), data.nickname)\n replaceLiteralField(ns.vcard('bday'), data.dateOfBirth)\n replaceLiteralField(ns.vcard('role'), data.jobTitle)\n replaceLiteralField(ns.vcard('organization-name'), data.orgName)\n replacePhotoField(data.imageSrc)\n }\n\n const removeBasic = basicOps.remove[0]\n const updateBasic = basicOps.update[0]\n const createBasic = basicOps.create[0]\n\n const selectedBasic = updateBasic || createBasic || removeBasic\n if (selectedBasic) {\n applyBasics(selectedBasic, Boolean(removeBasic && !updateBasic && !createBasic))\n }\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nexport async function processHeadingMutations(store: LiveStore, subject: NamedNode, mutationPlan: HeadingMutationPlan) {\n try {\n await mutateBasicProfileEntry(store, subject, mutationPlan.basicOps)\n await mutatePhoneEntry(store, subject, mutationPlan.phoneOps)\n await mutateEmailEntry(store, subject, mutationPlan.emailOps)\n await mutateAddressEntry(store, subject, mutationPlan.addressOps)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${saveHeadingUpdatesFailedPrefixText} ${message}`)\n }\n} \n","function normalizeDmy(value: string): string {\n const dmyMatch = value.match(/^(\\d{2})[/-](\\d{2})[/-](\\d{4})$/)\n if (!dmyMatch) return ''\n\n const [, day, month, year] = dmyMatch\n return `${day}-${month}-${year}`\n}\n\nexport function toDisplayDateDMY(value: string | undefined, emptyFallback = ''): string {\n const raw = (value || '').trim()\n if (!raw) return emptyFallback\n\n const isoMatch = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})/)\n if (isoMatch) {\n const [, year, month, day] = isoMatch\n return `${day}-${month}-${year}`\n }\n\n const normalizedDmy = normalizeDmy(raw)\n if (normalizedDmy) return normalizedDmy\n\n return raw\n}\n\nexport function toEditableDateDMY(value: string | undefined): string {\n const raw = (value || '').trim()\n if (!raw) return ''\n\n const isoMatch = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n if (isoMatch) {\n const [, year, month, day] = isoMatch\n return `${day}-${month}-${year}`\n }\n\n return normalizeDmy(raw)\n}\n\nexport function toStorageDateISO(value: string | undefined): string {\n const raw = (value || '').trim()\n if (!raw) return ''\n\n const isoMatch = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\n if (isoMatch) return raw\n\n const dmyMatch = raw.match(/^(\\d{2})[/-](\\d{2})[/-](\\d{4})$/)\n if (dmyMatch) {\n const [, day, month, year] = dmyMatch\n return `${year}-${month}-${day}`\n }\n\n return ''\n}\n","import { LiveStore, NamedNode, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\n/* Code copied from contact-pane/src/mugshotGallery and modified to fit the needs of the new design */\nconst mimeMap: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/gif': 'gif',\n 'image/svg+xml': 'svg',\n 'image/webp': 'webp',\n 'image/bmp': 'bmp',\n 'image/tiff': 'tiff',\n 'application/pdf': 'pdf',\n 'text/plain': 'txt',\n 'text/html': 'html',\n 'application/json': 'json',\n 'application/octet-stream': 'bin'\n}\n\nconst extMap = Object.fromEntries(\n Object.entries(mimeMap).map(([contentType, extension]) => [extension, contentType])\n) as Record<string, string>\n\nconst mime = {\n extension: (contentType: string): string | false => mimeMap[contentType] || false,\n lookup: (filename: string): string | false => {\n const ext = filename.split('.').pop()?.toLowerCase() || ''\n return extMap[ext] || false\n }\n}\n\nfunction subjectDirectoryUri(subject: NamedNode): string {\n const docUri = subject.doc().uri\n const lastSlash = docUri.lastIndexOf('/')\n return lastSlash >= 0 ? docUri.slice(0, lastSlash + 1) : docUri\n}\n\nexport async function uploadPhotoFile(store: LiveStore, subject: NamedNode, file: File): Promise<string> {\n if (!store.fetcher) {\n throw new Error('Store has no fetcher.')\n }\n\n const detectedContentType = file.type || mime.lookup(file.name) || 'application/octet-stream'\n if (!detectedContentType.startsWith('image/')) {\n throw new Error('Selected file is not an image.')\n }\n\n const extension = mime.extension(detectedContentType) || 'bin'\n let filename = encodeURIComponent(file.name || `image.${extension}`)\n\n if (detectedContentType !== mime.lookup(file.name || '')) {\n filename += `_.${extension}`\n }\n\n const directoryUri = subjectDirectoryUri(subject)\n let candidateUri = `${directoryUri}${filename}`\n\n for (let index = 0; store.holds(subject, ns.vcard('hasPhoto'), sym(candidateUri)); index++) {\n const fallbackName = `image_${index}.${extension}`\n candidateUri = `${directoryUri}${fallbackName}`\n }\n try {\n const data = await file.arrayBuffer()\n const response = await store.fetcher.webOperation('PUT', candidateUri, {\n data: data as unknown as string,\n contentType: detectedContentType\n } as any)\n if (!response.ok) {\n throw new Error(`Error uploading picture: ${response.status} ${response.statusText}`)\n }\n } catch (error) {\n throw new Error(`Error uploading picture: ${error}`)\n }\n \n return candidateUri\n}\n\nexport async function deletePhotoFile(store: LiveStore, subject: NamedNode, photoUri: string): Promise<void> {\n void subject\n if (!photoUri) return\n\n if (store.fetcher) {\n try {\n await store.fetcher.webOperation('DELETE', photoUri)\n } catch (error) {\n console.error(`Error deleting picture: ${error}`)\n }\n \n }\n}\n\n","//\n// Media input widget\n//\n//\n// Workflow:\n// The HTML5 functionality (on mobile) is to prompt for either\n// a realtime camera capture, OR a selection from images already on the device\n// (eg camera roll).\n//\n// The solid alternative is to either take a photo\n// or access camera roll (etc) OR to access solid cloud storage of favorite photo albums.\n// (Especially latest taken ones)\n//\n\n// Copied from solid-ui needed to change somethings, have made a PR in solid-ui \nimport { widgets, icons, style } from 'solid-ui'\nimport { IndexedFormula, NamedNode } from 'rdflib'\nimport { render } from 'lit-html'\nimport { closeIcon } from '../../icons-svg/profileIcons'\n\nconst cameraIcon = icons.iconBase + 'noun_Camera_1618446_000000.svg' // Get it from github\nconst retakeIcon = icons.iconBase + 'noun_479395.svg' // Get it from github\n\nconst contentType = 'image/png'\n\n/** A control to capture a picture using camera\n * @param {Docuemnt} dom - The Document object\n * @param {IndexedForumla} store - The quadstore to store data in\n * @param {NamedNode} getImageDoc() - NN of the image file to be created\n * @param {function} doneCallback - Called when a picture has been taken\n */\nexport function cameraCaptureControl (\n dom: HTMLDocument,\n store: IndexedFormula,\n getImageDoc: () => NamedNode,\n doneCallback: (imageDoc: NamedNode | null) => Promise<void>\n) {\n const div = dom.createElement('div')\n div.className = 'profile-edit-dialog__camera-control flex-column-center'\n let destination, imageBlob, player, canvas\n\n const setButtonVisible = (button: HTMLElement, visible: boolean) => {\n button.style.display = visible ? 'inline-flex' : 'none'\n }\n\n const table = div.appendChild(dom.createElement('table'))\n const mainTR = table.appendChild(dom.createElement('tr'))\n const main = mainTR.appendChild(dom.createElement('td'))\n main.setAttribute('colspan', '4')\n main.style.textAlign = 'center'\n\n const actionBar = div.appendChild(dom.createElement('div'))\n actionBar.className = 'profile-edit-dialog__camera-control-actions'\n\n /* Had to move away from widgets.button because of styling */\n const cancelButton = div.appendChild(dom.createElement('button'))\n cancelButton.type = 'button'\n cancelButton.classList.add('profile-edit-dialog__camera-control-cancel')\n cancelButton.setAttribute('aria-label', 'Close camera')\n cancelButton.setAttribute('title', 'Close')\n render(closeIcon, cancelButton)\n cancelButton.addEventListener('click', _event => {\n stopVideo()\n doneCallback(null)\n })\n\n const retakeButton = actionBar.appendChild(widgets.button(dom, retakeIcon, 'Retake'))\n retakeButton.classList.add('profile-edit-dialog__camera-control-action')\n retakeButton.addEventListener('click', _event => {\n retake()\n })\n retakeButton.textContent = 'Retake'\n setButtonVisible(retakeButton, false)\n\n const shutterButton = actionBar.appendChild(\n widgets.button(dom, icons.iconBase + 'noun_10636.svg', 'Snap')\n )\n shutterButton.classList.add('profile-edit-dialog__camera-control-action')\n shutterButton.addEventListener('click', grabCanvas)\n shutterButton.textContent = 'Take Photo'\n setButtonVisible(shutterButton, false)\n\n const sendButton = actionBar.appendChild(widgets.continueButton(dom))\n sendButton.classList.add('profile-edit-dialog__camera-control-action')\n sendButton.addEventListener('click', _event => {\n saveBlob(imageBlob, destination)\n })\n sendButton.textContent = 'Use Photo'\n setButtonVisible(sendButton, false)\n\n function displayPlayer () {\n player = main.appendChild(dom.createElement('video'))\n player.setAttribute('controls', '1')\n player.setAttribute('autoplay', '1')\n player.setAttribute('style', style.controlStyle)\n if (!navigator.mediaDevices) {\n throw new Error('navigator.mediaDevices not available')\n }\n navigator.mediaDevices.getUserMedia(constraints).then(stream => {\n player.srcObject = stream\n setButtonVisible(shutterButton, true)\n setButtonVisible(sendButton, false)\n setButtonVisible(retakeButton, false)\n }).catch(err => {\n console.error('Unable to start camera preview', err)\n doneCallback(null)\n })\n }\n\n const constraints = {\n video: {\n facingMode: { ideal: 'environment' }\n }\n }\n\n function retake () {\n main.removeChild(canvas)\n displayPlayer() // Make new one as old one is stuck black\n }\n\n function grabCanvas () {\n // Draw the video frame to the canvas.\n canvas = dom.createElement('canvas')\n canvas.setAttribute('width', style.canvasWidth)\n canvas.setAttribute('height', style.canvasHeight)\n canvas.setAttribute('style', style.controlStyle)\n main.appendChild(canvas)\n\n const context = canvas.getContext('2d')\n if (!context) {\n throw new Error('Could not get canvas context for camera snapshot')\n }\n context.drawImage(player, 0, 0, canvas.width, canvas.height)\n stopVideo()\n\n player.parentNode.removeChild(player)\n\n canvas.toBlob(blob => {\n if (!blob) {\n throw new Error('Camera snapshot failed: no image blob produced')\n }\n const msg = `got blob type ${blob.type} size ${blob.size}`\n console.debug(msg)\n destination = getImageDoc()\n imageBlob = blob // save for review\n reviewImage()\n // alert(msg)\n }, contentType) // toBlob\n }\n\n function reviewImage () {\n setButtonVisible(sendButton, true)\n setButtonVisible(retakeButton, true)\n setButtonVisible(shutterButton, false)\n }\n\n function stopVideo () {\n if (player && player.srcObject) {\n player.srcObject.getVideoTracks().forEach(track => track.stop())\n }\n }\n function saveBlob (blob, destination) {\n if (!blob || !destination) return\n const contentType = blob.type\n // if (!confirm('Save picture to ' + destination + ' ?')) return\n console.debug(\n 'Putting ' + blob.size + ' bytes of ' + contentType + ' to ' + destination\n )\n // @@ TODO Remove casting\n ;(store as any).fetcher\n .webOperation('PUT', destination.uri, {\n data: blob,\n contentType\n })\n .then(\n _resp => {\n console.debug('ok saved ' + destination)\n stopVideo()\n doneCallback(destination)\n },\n err => {\n stopVideo()\n alert(err)\n }\n )\n }\n\n // Attach the video stream to the video element and autoplay.\n displayPlayer()\n return div\n}\n\n/** A button to capture a picture using camera\n * @param {Docuemnt} dom - The Document object\n * @param {IndexedForumla} store - The quadstore to store data in\n * @param {fuunction} getImageDoc - returns NN of the image file to be created\n * @param {function<Node>} doneCallback - called with the image taken\n * @returns {DomElement} - A div element with the button in it\n *\n * This expands the button to a large control when it is pressed\n */\n\nexport function cameraButton (\n dom: HTMLDocument,\n store: IndexedFormula,\n getImageDoc: () => NamedNode,\n doneCallback: (imageDoc: NamedNode | null) => Promise<void>\n): HTMLElement {\n const div = dom.createElement('div')\n const but = widgets.button(dom, cameraIcon, 'Take picture')\n let control\n async function restoreButton (imageDoc: NamedNode | null) {\n div.removeChild(control)\n div.appendChild(but)\n await doneCallback(imageDoc)\n }\n div.appendChild(but)\n but.addEventListener('click', _event => {\n div.removeChild(but)\n control = cameraCaptureControl(\n dom,\n store,\n getImageDoc,\n restoreButton\n )\n div.appendChild(control)\n })\n return div\n}\n","import { openInputDialog } from '../../ui/dialog'\nimport { html, render, TemplateResult } from 'lit-html'\nimport { ProfileDetails, HeadingMutationPlan, ProfileBasicRow } from './types'\nimport { Image } from './HeadingSection'\nimport '../../styles/EditDialogs.css'\nimport { LiveStore, NamedNode, sym } from 'rdflib'\nimport { processHeadingMutations } from './mutations'\nimport { ViewerMode } from '../../types'\nimport {\n combinePhoneValue,\n splitPhoneValue\n} from '../shared/phoneCountries'\nimport {\n normalizeEmailTypeForEdit,\n normalizePhoneTypeForEdit,\n toSavedHeadingEmailType,\n toSavedHeadingPhoneType\n} from '../shared/contactTypeUtils'\nimport { applyRowFieldChange, applyRowSelectChange, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText, toTypeLabel } from '../../textUtils'\nimport {\n dialogCancelLabelText,\n dialogSubmitLabelText,\n editHeadingDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n saveHeadingUpdatesFailedPrefixText\n} from '../../texts'\nimport { cameraIcon } from '../../icons-svg/profileIcons'\nimport { ContactAddressRow, ContactPointRow } from '../contactInfo/types'\nimport { sanitizeAddressFieldValue, sanitizeBasicInputFieldValue, sanitizeEmailValue, sanitizePhoneLocalValue } from '../shared/sanitizeUtils'\nimport { toStorageDateISO } from './dateHelpers'\nimport { deletePhotoFile, uploadPhotoFile } from './imageHelpers'\nimport { cameraCaptureControl } from './camera'\n/* Note: new design - has address type in More Edit Contacts for now we will leave\n out Address Type, but a ticket will be created to add type later\n so I will keep the code and just comment it out for now. \n new design - has country code, will comment out code for now and create a ticket to add later. */\n\ntype HeadingFormState = {\n basicInfo: ProfileBasicRow\n email: ContactPointRow\n phone: ContactPointRow\n address: ContactAddressRow\n}\n\ntype Row = ProfileBasicRow | ContactPointRow | ContactAddressRow\n\nfunction isContactPointRow(row: Row): row is ContactPointRow {\n return 'value' in row\n}\n\nfunction isAddressRow(row: Row): row is ContactAddressRow {\n return 'streetAddress' in row\n}\n\nfunction isProfileBasicRow(row: Row): row is ProfileBasicRow {\n return 'name' in row\n}\n\n\nfunction rowHasContent(row: Row): boolean {\n if (isContactPointRow(row)) {\n return hasNonEmptyText(row.value)\n }\n if (isAddressRow(row)) {\n return [\n row.streetAddress,\n row.locality,\n row.region,\n row.postalCode,\n row.countryName\n ].some(hasNonEmptyText)\n }\n if (isProfileBasicRow(row)) {\n return [\n row.name,\n row.nickname,\n row.imageSrc,\n row.location,\n row.pronouns,\n row.dateOfBirth,\n row.jobTitle,\n row.orgName\n ].some(hasNonEmptyText)\n }\n return false\n}\n\nfunction normalizePronounsValue(value: string | undefined): string {\n const normalized = sanitizeTextValue(value || '').toLowerCase().replace(/\\s+/g, '')\n if (!normalized) return ''\n if (normalized === 'he' || normalized === 'he/him') return 'He/Him'\n if (normalized === 'she' || normalized === 'she/her') return 'She/Her'\n if (normalized === 'they' || normalized === 'they/them') return 'They/Them'\n return value || ''\n}\n\nfunction toFormState(profileData: ProfileDetails): HeadingFormState {\n const basicInfo: ProfileBasicRow = {\n name: sanitizeTextValue(toText(profileData.name)),\n nickname: sanitizeTextValue(toText(profileData.nickname || '')),\n imageSrc: sanitizeTextValue(toText(profileData.imageSrc || '')),\n location: sanitizeTextValue(toText(profileData.location || '')),\n pronouns: normalizePronounsValue(toText(profileData.pronouns || '')),\n dateOfBirth: sanitizeTextValue(toText(profileData.dateOfBirth || '')),\n jobTitle: sanitizeTextValue(toText(profileData.jobTitle || '')),\n orgName: sanitizeTextValue(toText(profileData.orgName || '')),\n entryNode: toText(profileData.entryNode),\n status: toText(profileData.entryNode) ? 'existing' as const : 'new' as const\n }\n const primaryEmail = profileData.primaryEmail\n const primaryPhone = profileData.primaryPhone\n const primaryAddress = profileData.primaryAddress\n\n const normalizedEmailType = normalizeEmailTypeForEdit(primaryEmail?.type)\n const normalizedPhoneType = normalizePhoneTypeForEdit(primaryPhone?.type)\n\n const email: ContactPointRow = {\n value: sanitizeEmailValue(toText(primaryEmail?.valueNode).replace(/^mailto:/i, '')),\n type: normalizedEmailType,\n entryNode: toText(primaryEmail?.entryNode),\n status: toText(primaryEmail?.entryNode) ? 'existing' as const : 'new' as const\n }\n const phone: ContactPointRow = {\n value: sanitizeTextValue(\n toText(primaryPhone?.valueNode || primaryPhone?.entryNode || '').replace(/^tel:/i, '')\n ),\n type: normalizedPhoneType,\n entryNode: toText(primaryPhone?.entryNode || ''),\n status: toText(primaryPhone?.entryNode || '') ? 'existing' as const : 'new' as const\n }\n const address: ContactAddressRow = {\n streetAddress: sanitizeAddressFieldValue(toText(primaryAddress?.streetAddress)),\n locality: sanitizeAddressFieldValue(toText(primaryAddress?.locality)),\n region: sanitizeAddressFieldValue(toText(primaryAddress?.region)),\n postalCode: sanitizeAddressFieldValue(toText(primaryAddress?.postalCode)),\n countryName: sanitizeAddressFieldValue(toText(primaryAddress?.countryName)),\n type: toTypeLabel(primaryAddress?.type),\n entryNode: toText(primaryAddress?.entryNode),\n status: toText(primaryAddress?.entryNode) ? 'existing' as const : 'new' as const\n }\n\n return {\n basicInfo: (basicInfo) ? basicInfo : { name: '', nickname: '', imageSrc: '', location: '', pronouns: '', dateOfBirth: '', jobTitle: '', orgName: '', entryNode: '', status: 'new' },\n email: (email) ? email : { value: '', type: '', entryNode: '', status: 'new' },\n phone: (phone) ? phone : { value: '', type: '', entryNode: '', status: 'new' },\n address: (address) ? address : { streetAddress: '', locality: '', region: '', postalCode: '', countryName: '', type: '', entryNode: '', status: 'new' }\n }\n}\n\ntype ProfileBasicEditableField =\n | 'name'\n | 'nickname'\n | 'imageSrc'\n | 'pronouns'\n | 'dateOfBirth'\n | 'jobTitle'\n | 'orgName'\n\ntype ContactAddressEditableField =\n | 'streetAddress'\n | 'locality'\n | 'region'\n | 'postalCode'\n | 'countryName'\n\ntype ContactPhoneInputRowProps = {\n phone: ContactPointRow\n}\n\ntype ContactEmailInputRowProps = {\n email: ContactPointRow\n}\n\ntype ContactAddressInputRowProps = {\n address: ContactAddressRow\n}\n\nfunction mapEmailOpsForSave(ops: { create: ContactPointRow[], update: ContactPointRow[], remove: ContactPointRow[] }) {\n const mapRow = (row: ContactPointRow): ContactPointRow => ({\n ...row,\n type: toSavedHeadingEmailType(row.type)\n })\n\n return {\n create: ops.create.map(mapRow),\n update: ops.update.map(mapRow),\n remove: ops.remove.map(mapRow)\n }\n}\n\nfunction mapPhoneOpsForSave(ops: { create: ContactPointRow[], update: ContactPointRow[], remove: ContactPointRow[] }) {\n const mapRow = (row: ContactPointRow): ContactPointRow => ({\n ...row,\n type: toSavedHeadingPhoneType(row.type)\n })\n\n return {\n create: ops.create.map(mapRow),\n update: ops.update.map(mapRow),\n remove: ops.remove.map(mapRow)\n }\n}\n\n/* Will use later function renderCountryPrefixSelect(\n name: string,\n value: string,\n label: string,\n onChange: (event: Event) => void\n) {\n return html`\n <label class=\"label profile-edit-dialog__phone-prefix-field\" aria-label=${label}>\n <select class=\"phonePrefixSelect\" name=${name} .value=${value} @change=${onChange}>\n ${COUNTRY_PREFIX_OPTIONS.map((option) => html`\n <option value=${option.dialCode}>\n ${countryCodeToFlag(option.iso2)} ${option.dialCode}\n </option>\n `)}\n </select>\n </label>\n `\n} */\n\nfunction renderContactPhoneInput({\n phone\n}: ContactPhoneInputRowProps) {\n const label = 'Phone Number'\n /* const countryCodeLabel = 'Country Calling Code' */\n /* const prefixInputName = 'phone-prefix' */\n const typeLabel = 'Phone Type'\n const inputName = 'phone-value'\n const typeInputName = 'phone-type'\n const splitValue = splitPhoneValue(phone?.value || '')\n let selectedDialCode = splitValue.dialCode\n\n const handleValueInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizePhoneLocalValue(target.value)\n if (phone) {\n applyRowFieldChange(phone, 'value', combinePhoneValue(selectedDialCode, nextValue), rowHasContent)\n }\n }\n /* Leaving here for when we add country code back in\n const handleCountryCodeInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n selectedDialCode = target.value\n\n if (phone) {\n const localNumber = splitPhoneValue(phone.value).localNumber\n applyRowFieldChange(phone, 'value', combinePhoneValue(selectedDialCode, localNumber), rowHasContent)\n }\n } */\n\n const handleTypeInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextType = target.value\n if (phone) {\n applyRowSelectChange(phone, 'type', nextType)\n }\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal profile-edit-dialog__row--contact-point\">\n <div class=\"profile-edit-dialog__field\">\n <label aria-label=${label} class=\"label\">\n <input\n class=\"input\"\n type=\"tel\"\n name=${inputName}\n .value=${splitValue.localNumber}\n required\n data-contact-field=\"value\"\n data-entry-node=${phone?.entryNode || ''}\n data-row-status=${phone?.status || 'n/a'}\n placeholder=\"Phone Number\"\n autocomplete=\"tel-national\"\n inputmode=\"tel\"\n @input=${handleValueInput}\n />\n </label>\n </div>\n <label aria-label=${typeLabel} class=\"label profile-edit-dialog__field-type profile-edit-dialog__field-type--contact-point\">\n <select class=\"input\" name=${typeInputName} id=\"phone-type-select-${inputName}\" @change=${handleTypeInput} .value=${phone?.type || ''}>\n <option value=\"Mobile\">Mobile</option>\n <option value=\"Home\">Home</option>\n <option value=\"Work\">Work</option>\n </select>\n </label>\n </div>\n `\n}\n\nfunction renderContactEmailInputRow({\n email\n}: ContactEmailInputRowProps) {\n const label = 'Email Address'\n const typeLabel = 'Email Type'\n const inputName = 'email-value'\n const typeInputName = 'email-type'\n\n const handleValueInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeEmailValue(target.value)\n if (email) {\n applyRowFieldChange(email, 'value', nextValue, rowHasContent)\n }\n }\n\n const handleTypeInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextType = target.value\n if (email) {\n applyRowSelectChange(email, 'type', nextType)\n }\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal profile-edit-dialog__row--contact-point\">\n <label aria-label=${label} class=\"label profile-edit-dialog__field\">\n <input\n class=\"input\"\n type=\"email\"\n name=${inputName}\n .value=${email?.value || ''}\n required\n data-contact-field=\"value\"\n data-entry-node=${email?.entryNode || ''}\n data-row-status=${email?.status || 'n/a'}\n placeholder=\"Email Address\"\n autocomplete=\"email\"\n inputmode=\"email\"\n @input=${handleValueInput}\n />\n </label>\n <label aria-label=${typeLabel} class=\"label profile-edit-dialog__field-type profile-edit-dialog__field-type--contact-point\">\n <select class=\"input\" name=${typeInputName} id=\"email-type-select-${inputName}\" @change=${handleTypeInput} .value=${email?.type || ''}>\n <option value=\"Personal\">Personal</option>\n <option value=\"Office\">Office</option>\n </select>\n </label>\n </div>\n `\n}\n\nfunction renderContactAddressInput({\n address\n}: ContactAddressInputRowProps) {\n const label = 'Address'\n /* const typeLabel = 'Address Type' */\n /* const typeInputName = 'address-type' */\n /* const addressTypeSelectId = 'address-type-select' */\n const streetAddressName = 'address-street'\n const localityName = 'address-locality'\n const regionName = 'address-region'\n const postalCodeName = 'address-postal'\n const countryName = 'address-country'\n\n\n const handleAddressInput = (field: ContactAddressEditableField) => (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeAddressFieldValue(target.value)\n if (address) {\n applyRowFieldChange(address, field, nextValue, rowHasContent)\n }\n }\n\n /* const handleTypeInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextType = target.value\n if (address) {\n applyRowSelectChange(address, 'type', nextType)\n } \n } */\n\n return html`\n <label aria-label=${`${label} Street`} class=\"label profile-edit-dialog__field profile-edit-dialog__field--row-width\">\n Street Address\n <input\n class=\"input\"\n type=\"text\"\n name=${streetAddressName}\n .value=${address?.streetAddress || ''}\n required\n data-contact-field=\"streetAddress\"\n data-entry-node=${address?.entryNode || ''}\n data-row-status=${address?.status || 'n/a'}\n placeholder=\"Street Address\"\n autocomplete=\"street-address\"\n inputmode=\"text\"\n @change=${handleAddressInput('streetAddress')}\n />\n </label>\n\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal profile-edit-dialog__row--full\">\n <label aria-label=${`${label} Locality`} class=\"label profile-edit-dialog__field\">\n Locality\n <input\n class=\"input\"\n type=\"text\"\n name=${localityName}\n .value=${address?.locality || ''}\n data-contact-field=\"locality\"\n data-entry-node=${address?.entryNode || ''}\n data-row-status=${address?.status || 'n/a'}\n placeholder=\"City / Locality\"\n autocomplete=\"address-level2\"\n inputmode=\"text\"\n @change=${handleAddressInput('locality')}\n />\n </label>\n <label aria-label=${`${label} Postal Code`} class=\"label profile-edit-dialog__field\">\n Postal Code\n <input\n class=\"input\"\n type=\"text\"\n name=${postalCodeName}\n .value=${address?.postalCode || ''}\n data-contact-field=\"postalCode\"\n data-entry-node=${address?.entryNode || ''}\n data-row-status=${address?.status || 'n/a'}\n placeholder=\"Postal Code\"\n autocomplete=\"postal-code\"\n inputmode=\"text\"\n @change=${handleAddressInput('postalCode')}\n />\n </label>\n </div>\n\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal profile-edit-dialog__row--full\">\n <label aria-label=${`${label} Region`} class=\"label profile-edit-dialog__field\">\n Region\n <input\n class=\"input\"\n type=\"text\"\n name=${regionName}\n .value=${address?.region || ''}\n data-contact-field=\"region\"\n data-entry-node=${address?.entryNode || ''}\n data-row-status=${address?.status || 'n/a'}\n placeholder=\"State / Region\"\n inputmode=\"text\"\n @change=${handleAddressInput('region')}\n />\n </label>\n <label aria-label=${`${label} Country`} class=\"label profile-edit-dialog__field\">\n Country\n <input\n class=\"input\"\n type=\"text\"\n name=${countryName}\n .value=${address?.countryName || ''}\n data-contact-field=\"countryName\"\n data-entry-node=${address?.entryNode || ''}\n data-row-status=${address?.status || 'n/a'}\n placeholder=\"Country\"\n autocomplete=\"country-name\"\n inputmode=\"text\"\n @change=${handleAddressInput('countryName')}\n />\n </label>\n </div>\n `\n}\n\nfunction renderHeadingInfoInput(\n store: LiveStore,\n subject: NamedNode,\n basicInfo: ProfileBasicRow,\n phone: ContactPointRow,\n email: ContactPointRow,\n rerender: () => void\n): TemplateResult {\n const imageSrcLabel = 'Profile Photo'\n const recommendedImageToLoad = 'Recommended: Square JPG, PNG. Max 2MB.'\n const nameLabel = 'Full Name'\n const nicknameLabel = 'Nickname'\n const pronounsLabel = 'Pronouns'\n const dateOfBirthLabel = 'DOB'\n const jobTitleLabel = 'Job Title'\n const orgNameLabel = 'Organization Name'\n\n const handleBasicInfoInput = (field: ProfileBasicEditableField) => (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeBasicInputFieldValue(target.value)\n if (basicInfo) {\n applyRowFieldChange(basicInfo, field, nextValue, rowHasContent)\n }\n }\n\n const handleDateOfBirthInput = (e: Event) => {\n const target = e.target as HTMLInputElement\n const nextValue = sanitizeBasicInputFieldValue(target.value)\n if (basicInfo) {\n applyRowFieldChange(basicInfo, 'dateOfBirth', toStorageDateISO(nextValue), rowHasContent)\n }\n }\n const handlePronounsInput = (e: Event) => {\n const target = e.target as HTMLSelectElement\n const nextType = target.value\n if (basicInfo) {\n applyRowSelectChange(basicInfo, 'pronouns', nextType)\n }\n }\n\n const handleUpload = async (e: Event) => {\n const button = e.currentTarget as HTMLButtonElement | null\n const dom = button?.ownerDocument || document\n const fileInput = dom.createElement('input')\n fileInput.type = 'file'\n fileInput.accept = 'image/*'\n\n fileInput.addEventListener('change', async () => {\n const file = fileInput.files?.[0]\n if (!file || !basicInfo) return\n\n try {\n const uploadedUri = await uploadPhotoFile(store, subject, file)\n applyRowFieldChange(basicInfo, 'imageSrc', uploadedUri, rowHasContent)\n rerender()\n } catch (error) {\n console.error('Profile image upload failed', error)\n }\n })\n\n fileInput.click()\n }\n\n /* The handleCameraClick function was generated by AI Model: GPT-5.3-Codex */\n /* Prompt: Write a function handleCameraClick that uses the cameraCaptureControl to\n capture an image and update the profile photo in the heading section. */\n const handleCameraClick = async (e: Event) => {\n e.preventDefault()\n const button = e.currentTarget as HTMLElement | null\n const dom = button?.ownerDocument || document\n const headingPhotoRow = button?.closest('.profile-edit-dialog__row--heading-photo') as HTMLElement | null\n const hostRow = headingPhotoRow?.nextElementSibling as HTMLElement | null\n const frame = hostRow?.querySelector('.profile-edit-dialog__image-camera-capture-frame') as HTMLDivElement | null\n if (!frame || frame.dataset.active === 'true') return\n\n frame.hidden = false\n frame.dataset.active = 'true'\n frame.replaceChildren()\n\n const getImageDoc = () => {\n const docUri = subject.doc().uri\n const lastSlash = docUri.lastIndexOf('/')\n const directoryUri = lastSlash >= 0 ? docUri.slice(0, lastSlash + 1) : docUri\n const randomSuffix =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now()}_${Math.floor(Math.random() * 1e9)}`\n return sym(`${directoryUri}camera_${randomSuffix}.png`)\n }\n\n const onCameraDone = async (imageDoc: NamedNode | null) => {\n frame.replaceChildren()\n frame.hidden = true\n frame.dataset.active = 'false'\n if (imageDoc?.uri && basicInfo) {\n applyRowFieldChange(basicInfo, 'imageSrc', imageDoc.uri, rowHasContent)\n rerender()\n }\n }\n\n try {\n const control = cameraCaptureControl(dom, store as any, getImageDoc, onCameraDone)\n frame.appendChild(control)\n } catch (error) {\n frame.hidden = true\n frame.dataset.active = 'false'\n frame.replaceChildren()\n console.error('Camera control failed to initialize', error)\n }\n }\n\n const handleDelete = async (_e: Event) => {\n if (!basicInfo) return\n applyRowFieldChange(basicInfo, 'imageSrc', '', rowHasContent)\n rerender()\n }\n\n return html`\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--heading-photo\">\n <header class=\"mb-md\" aria-label=\"Profile Image\">\n <div class=\"profile-edit-dialog__image-frame\">\n ${Image(basicInfo.imageSrc, basicInfo.name)}\n <button\n type=\"button\"\n class=\"profile-edit-dialog__image-camera-button flex-center\"\n aria-label=\"Take a photo\"\n title=\"Take a photo\"\n @click=${handleCameraClick}\n >\n ${cameraIcon}\n </button>\n </div>\n </header>\n\n <div class=\"profile-edit-dialog__image-preview\" aria-label=\"Profile Photo Preview\">\n <p class=\"profile-edit-dialog__image-preview-label\"><strong>${imageSrcLabel}</strong></p>\n <p class=\"profile-edit-dialog__image-preview-description\">${recommendedImageToLoad}</p>\n\n <div class=\"profile-edit-dialog__image-preview-actions\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__image-button profile-edit-dialog__image-upload-button flex-center\"\n aria-label=\"Upload new profile photo\"\n title=\"Upload New\"\n @click=${handleUpload}\n >\n Upload New\n </button>\n <button\n type=\"button\"\n class=\"profile-edit-dialog__image-button profile-edit-dialog__image-remove-button flex-center\"\n aria-label=\"Delete profile photo\"\n title=\"Remove\"\n @click=${handleDelete}\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n <div class=\"profile-edit-dialog__image-camera-capture-row\">\n <div class=\"profile-edit-dialog__image-camera-capture-frame\" hidden></div>\n </div>\n <div class=\"profile-edit flex-column gap-lg\">\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal\">\n <label aria-label=${nameLabel} class=\"label profile-edit-dialog__field\">\n ${nameLabel}\n <input\n class=\"input\"\n type=\"text\"\n name=\"name\"\n .value=${basicInfo?.name || ''}\n required\n data-contact-field=\"name\"\n data-entry-node=${basicInfo?.entryNode || ''}\n data-row-status=${basicInfo?.status || 'n/a'}\n placeholder=\"Full Name\"\n autocomplete=\"name\"\n inputmode=\"text\"\n @change=${handleBasicInfoInput('name')}\n />\n </label>\n <label aria-label=${nicknameLabel} class=\"label profile-edit-dialog__field\">\n ${nicknameLabel}\n <input\n class=\"input\"\n type=\"text\"\n name=\"nickname\"\n .value=${basicInfo?.nickname || ''}\n data-contact-field=\"nickname\"\n data-entry-node=${basicInfo?.entryNode || ''}\n data-row-status=${basicInfo?.status || 'n/a'}\n placeholder=\"Nickname\"\n autocomplete=\"nickname\"\n inputmode=\"text\"\n @change=${handleBasicInfoInput('nickname')}\n />\n </label>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal\">\n <label aria-label=${pronounsLabel} class=\"label profile-edit-dialog__field-type profile-edit-dialog__field--stack\">\n ${pronounsLabel}\n <select class=\"input\" name=\"pronouns\" @change=${handlePronounsInput} .value=${basicInfo?.pronouns || ''}>\n <option value=\"He/Him\">He/Him</option>\n <option value=\"She/Her\">She/Her</option>\n <option value=\"They/Them\">They/Them</option>\n </select>\n </label>\n <label aria-label=${dateOfBirthLabel} class=\"label profile-edit-dialog__field\">\n ${dateOfBirthLabel}\n <input\n class=\"input\"\n type=\"date\"\n name=\"profile-date-of-birth\"\n .value=${toStorageDateISO(basicInfo?.dateOfBirth)}\n data-contact-field=\"dateOfBirth\"\n data-entry-node=${basicInfo?.entryNode || ''}\n data-row-status=${basicInfo?.status || 'n/a'}\n autocomplete=\"off\"\n data-lpignore=\"true\"\n data-1p-ignore=\"true\"\n data-bwignore=\"true\"\n @change=${handleDateOfBirthInput}\n />\n </label>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal\">\n <label aria-label=${jobTitleLabel} class=\"label profile-edit-dialog__field\">\n ${jobTitleLabel}\n <input\n class=\"input\"\n type=\"text\"\n name=\"jobTitle\"\n .value=${basicInfo?.jobTitle || ''}\n data-contact-field=\"jobTitle\"\n data-entry-node=${basicInfo?.entryNode || ''}\n data-row-status=${basicInfo?.status || 'n/a'}\n placeholder=\"Job Title\"\n autocomplete=\"organization-title\"\n inputmode=\"text\"\n @change=${handleBasicInfoInput('jobTitle')}\n />\n </label>\n <label aria-label=${orgNameLabel} class=\"label profile-edit-dialog__field\">\n ${orgNameLabel}\n <input\n class=\"input\"\n type=\"text\"\n name=\"orgName\"\n .value=${basicInfo?.orgName || ''}\n data-contact-field=\"orgName\"\n data-entry-node=${basicInfo?.entryNode || ''}\n data-row-status=${basicInfo?.status || 'n/a'}\n placeholder=\"Organization Name\"\n autocomplete=\"organization-name\"\n inputmode=\"text\"\n @change=${handleBasicInfoInput('orgName')}\n />\n </label>\n </div>\n <div class=\"profile-edit-dialog__row profile-edit-dialog__row--equal\">\n <div class=\"profile-edit-dialog__field profile-edit-dialog__field--full\">\n ${renderContactPhoneInput({ phone })}\n </div>\n <div class=\"profile-edit-dialog__field profile-edit-dialog__field--full\">\n ${renderContactEmailInputRow({ email })}\n </div>\n </div>\n </div>\n `\n}\n\nfunction renderHeadingEditTemplate(\n form: HTMLFormElement,\n formState: HeadingFormState,\n store: LiveStore,\n subject: NamedNode,\n viewerMode: ViewerMode\n) {\n const rerender = () => renderHeadingEditTemplate(form, formState, store, subject, viewerMode)\n \n render(html`\n ${renderHeadingInfoInput(store, subject, formState.basicInfo, formState.phone, formState.email, rerender)}\n ${renderContactAddressInput({ address: formState.address })}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n}\n\nfunction createHeadingEditForm(\n store: LiveStore,\n subject: NamedNode,\n profileData: ProfileDetails,\n viewerMode: ViewerMode\n) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form', 'profile-edit-dialog--heading', 'flex-column', 'gap-sm')\n form.autocomplete = 'off'\n form.setAttribute('data-lpignore', 'true')\n form.setAttribute('data-1p-ignore', 'true')\n form.setAttribute('data-bwignore', 'true')\n\n const formState = toFormState(profileData)\n renderHeadingEditTemplate(form, formState, store, subject, viewerMode)\n\n return { form, formState }\n}\n\nfunction validateHeadingDataBeforeSave(formState: HeadingFormState): string | null {\n const basicInfoOps = summarizeRowOps([formState.basicInfo], rowHasContent)\n const phoneOps = summarizeRowOps([formState.phone], rowHasContent)\n const emailOps = summarizeRowOps([formState.email], rowHasContent)\n const addressOps = summarizeRowOps([formState.address], rowHasContent)\n const hasChanges =\n basicInfoOps.create.length > 0 || basicInfoOps.update.length > 0 || basicInfoOps.remove.length > 0 ||\n phoneOps.create.length > 0 || phoneOps.update.length > 0 || phoneOps.remove.length > 0 ||\n emailOps.create.length > 0 || emailOps.update.length > 0 || emailOps.remove.length > 0 ||\n addressOps.create.length > 0 || addressOps.update.length > 0 || addressOps.remove.length > 0\n\n if (!hasChanges) return 'No intro changes detected.'\n return null\n}\n\n\nexport async function createHeadingEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n profileData: ProfileDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = document\n const originalPhotoUri = sanitizeTextValue(toText(profileData.imageSrc || ''))\n const { form, formState } = createHeadingEditForm(store, subject, profileData, viewerMode)\n\n const result = await openInputDialog({\n title: editHeadingDialogTitleText,\n dom,\n form,\n headerAction: { type: 'close' },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n return validateHeadingDataBeforeSave(formState)\n },\n onSave: async () => {\n const phoneOps = summarizeRowOps([formState.phone], rowHasContent)\n const emailOps = summarizeRowOps([formState.email], rowHasContent)\n const plan: HeadingMutationPlan = {\n basicOps: summarizeRowOps([formState.basicInfo], rowHasContent),\n phoneOps: mapPhoneOpsForSave(phoneOps),\n emailOps: mapEmailOpsForSave(emailOps),\n addressOps: summarizeRowOps([formState.address], rowHasContent)\n }\n await processHeadingMutations(store, subject, plan)\n\n const nextPhotoUri = sanitizeTextValue(formState.basicInfo.imageSrc || '')\n if (originalPhotoUri && originalPhotoUri !== nextPhotoUri) {\n try {\n await deletePhotoFile(store, subject, originalPhotoUri)\n } catch (error) {\n console.warn('Profile image file delete failed', error)\n }\n }\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveHeadingUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","import { html, nothing, TemplateResult } from 'lit-html'\nimport '../../styles/HeadingSection.css'\nimport { ProfileDetails } from './types'\nimport { DataBrowserContext } from 'pane-registry'\nimport { NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { createHeadingEditDialog } from './HeadingEditDialog'\nimport { toText } from '../../textUtils'\nimport { toDisplayDateDMY } from './dateHelpers'\nimport { birthdayIcon, editIcon, locationIcon, personInCircleIcon } from '../../icons-svg/profileIcons'\nimport { emailIcon, phoneIcon } from '../../icons-svg/contactIcons'\n\nexport const renderHeadingSection = (\n context: DataBrowserContext,\n subject: NamedNode,\n profileData: ProfileDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) => {\n const { name, pronouns, jobTitle, dateOfBirth, location, primaryPhone, primaryEmail, imageSrc } = profileData\n const isOwner = viewerMode === 'owner'\n \n const phoneValue = toText(primaryPhone?.valueNode).replace(/^tel:/i, '')\n const emailValue = toText(primaryEmail?.valueNode).replace(/^mailto:/i, '')\n const dateOfBirthDisplay = toDisplayDateDMY(toText(dateOfBirth), 'DD-MM-YYYY')\n \n return html`\n <section class=\"profile__section border-lighter\" aria-labelledby=\"profile-name\">\n <div class=\"profile__heading-top\">\n <div class=\"profile__avatar\">\n ${Image(imageSrc, name)}\n </div>\n <div class=\"profile__info\">\n <header class=\"profile__header-bar mb-md\">\n <div class=\"profile__identity\" role=\"group\" aria-label=\"Name and pronouns\">\n <h1 id=\"profile-name\" class=\"profile__name\">${name}</h1>\n <span class=\"profile__pronouns\">${pronouns ? `(${pronouns})` : ''}</span>\n </div>\n ${jobTitle ? html`<div class=\"profile__role-org\">${jobTitle}</div>` : nothing}\n </header>\n </div>\n ${isOwner ? html`\n <div class=\"profile__actions profile__heading-actions\" aria-label=\"Profile actions\">\n <button\n type=\"button\"\n class=\"profile__action-button profile__heading-action-button profile-action-text flex-center\"\n aria-label=\"Add or edit heading information\"\n @click=${(event: Event) => {\n return createHeadingEditDialog(\n event,\n context.session.store,\n subject,\n profileData,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile-section-collapsible__edit-label\">${editIcon} Edit</span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n </div>\n ` : nothing}\n <div class=\"profile__details\">\n <div class=\"profile__meta-row\" role=\"group\" aria-label=\"Additional profile information\">\n ${Line(dateOfBirthDisplay, birthdayIcon, '')}\n ${Line(location, locationIcon, '')}\n </div>\n <div class=\"profile__contact-row\" role=\"group\" aria-label=\"Contact information\">\n ${Line(phoneValue, phoneIcon, '')}\n ${Line(emailValue, emailIcon, '')}\n </div>\n </div>\n </div>\n </section>\n `\n}\n\nconst Line = (value, prefix: TemplateResult | symbol | string = nothing, label: string = '') =>\n value ? html`\n <div class=\"profile__item ${label ? '' : 'profile__item--valueOnly'}\">\n ${label ? html`<span class=\"profile__label\">${label}</span>` : nothing}\n <span class=\"profile__value\">\n ${prefix !== '' && prefix !== nothing ? html`<span class=\"profile__prefix-icon\" aria-hidden=\"true\">${prefix}</span>` : nothing}\n <span class=\"profile__value-text\">${value}</span>\n </span>\n </div>\n ` : nothing\n\nexport const Image = (src, alt) =>\n src\n ? html`\n <img\n class=\"profile__hero\"\n src=${src}\n alt=\"${alt}\"\n width=\"140\"\n height=\"140\"\n loading=\"eager\"\n />\n `\n : html`\n <div class=\"profile__hero-alt flex-center\" role=\"img\" aria-label=\"${alt}\" tabindex=\"0\">\n <span class=\"profile__hero-icon\">${personInCircleIcon}</span>\n </div>\n `\n","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!./BioSection.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!./BioSection.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { LiveStore, NamedNode, literal } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { BioMutationPlan, BioRow } from './types'\nimport { MutationOps } from '../shared/types'\nimport { applyUpdaterPatch, replacePredicateStatements } from '../shared/rdfMutationHelpers'\nimport { saveBioUpdatesFailedPrefixText} from '../../texts'\n// Need to find out if this is really how we should store the data\nasync function mutateBioEntry(store: LiveStore, subject: NamedNode, bioOps: MutationOps<BioRow>) {\n const doc = subject.doc()\n const deletions: any[] = []\n const insertions: any[] = []\n\n const replaceLiteralField = (predicate: NamedNode, value?: string) => {\n const normalized = (value || '').trim()\n const nextObject = normalized ? literal(normalized) : null\n replacePredicateStatements(store, subject, predicate, doc, deletions, insertions, nextObject)\n }\n\n const applyBasics = (bio: BioRow, clearAll = false) => {\n const data = clearAll\n ? {\n description: '',\n }\n : bio\n\n replaceLiteralField(ns.vcard('note'), data.description)\n }\n\n const removeBio = bioOps.remove[0]\n const updateBio = bioOps.update[0]\n const createBio = bioOps.create[0]\n\n const selectedBio = updateBio || createBio || removeBio\n if (selectedBio) {\n applyBasics(selectedBio, Boolean(removeBio && !updateBio && !createBio))\n }\n\n await applyUpdaterPatch(store, deletions, insertions)\n}\n\nexport async function processBioMutations(store: LiveStore, subject: NamedNode, mutationPlan: BioMutationPlan) {\n try {\n await mutateBioEntry(store, subject, mutationPlan)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`${saveBioUpdatesFailedPrefixText} ${message}`)\n }\n} \n","import { openInputDialog } from '../../ui/dialog'\nimport { html, render, TemplateResult } from 'lit-html'\nimport type { BioDetails, BioRow } from './types'\nimport '../../styles/EditDialogs.css'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { processBioMutations } from './mutations'\nimport { ViewerMode } from '../../types'\nimport { applyRowFieldChange, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText } from '../../textUtils'\nimport {\n dialogCancelLabelText,\n dialogSubmitLabelText,\n ownerLoginRequiredDialogMessageText,\n saveBioUpdatesFailedPrefixText\n} from '../../texts'\n\ntype BioFormState = {\n bio: BioRow\n}\n\nfunction rowHasContent(row: BioRow): boolean {\n return hasNonEmptyText(row.description)\n}\n\nfunction toFormState(bioData: BioDetails): BioFormState {\n const row: BioRow = {\n description: sanitizeTextValue(toText(bioData?.description || '')),\n entryNode: toText(bioData?.entryNode || ''),\n status: toText(bioData?.entryNode || '') ? 'existing' as const : 'new' as const\n }\n\n return {\n bio: row\n }\n}\n\nfunction renderBioSection(bioRow: BioRow, onChange: () => void): TemplateResult {\n const descriptionName = 'bio-description'\n const descriptionCounterId = 'bio-description-counter'\n const descriptionMaxLength = 2600\n const descriptionCount = (bioRow?.description || '').length\n\n const handleDescriptionInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement\n const nextValue = sanitizeTextValue(target.value.slice(0, descriptionMaxLength))\n applyRowFieldChange(bioRow, 'description', nextValue, rowHasContent)\n onChange()\n }\n\n return html`\n <section class=\"profile-edit-dialog__section\" aria-label=\"Bio editor\">\n\n <label aria-label=\"Bio description\" class=\"label profile-edit-dialog__bio-field-container\">\n <span class=\"profile-edit-dialog__field-description\">\n You can write about your years of experience, industry, or skills.\n People also talk about their achievements or previous job experiences.\n </span>\n <textarea\n class=\"profile-edit-dialog__textarea\"\n name=${descriptionName}\n rows=\"5\"\n .value=${bioRow?.description || ''}\n maxlength=${descriptionMaxLength}\n aria-describedby=${descriptionCounterId}\n data-contact-field=\"description\"\n data-entry-node=${bioRow?.entryNode || ''}\n data-row-status=${bioRow?.status || 'n/a'}\n placeholder=\"Write a short bio\"\n autocomplete=\"off\"\n @input=${handleDescriptionInput}\n ></textarea>\n <small id=${descriptionCounterId} aria-live=\"polite\">${descriptionCount}/${descriptionMaxLength}</small>\n </label>\n </section>\n `\n}\n\nfunction renderBioEditTemplate(form: HTMLFormElement, formState: BioFormState, viewerMode: ViewerMode) {\n const rerender = () => renderBioEditTemplate(form, formState, viewerMode)\n render(html`\n ${renderBioSection(formState.bio, rerender)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n}\n\nfunction createBioEditForm(bioData: BioDetails, viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n\n const formState = toFormState(bioData)\n renderBioEditTemplate(form, formState, viewerMode)\n\n return { form, formState }\n}\n\nexport async function createBioEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n bioData: BioDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState } = createBioEditForm(bioData, viewerMode)\n\n const result = await openInputDialog({\n title: 'Edit Bio',\n dom,\n form,\n headerAction: { type: 'none' },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n\n const bioOps = summarizeRowOps([formState.bio], rowHasContent)\n const hasChanges = bioOps.create.length > 0 || bioOps.update.length > 0 || bioOps.remove.length > 0\n if (!hasChanges) return 'No bio changes detected.'\n return null\n },\n onSave: async () => {\n const bioOps = summarizeRowOps([formState.bio], rowHasContent)\n await processBioMutations(store, subject, bioOps)\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return `${saveBioUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","import { html } from 'lit-html'\nimport { BioDetails } from './types'\nimport { ViewerMode } from '../../types'\nimport '../../styles/BioSection.css'\nimport { bioHeadingText } from '../../texts'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport {\n scheduleDescriptionOverflowCheck,\n toggleDescription\n} from '../shared/sectionCardHelpers'\nimport { createBioEditDialog } from './BioEditDialog'\nimport { editIcon, plusDarkIcon } from '../../icons-svg/profileIcons'\n\nfunction renderBio(bioData: BioDetails) {\n if (!bioData) return html``\n\n const bioDescriptionId = 'bio-description'\n\n return html`\n ${bioData.description ? html`\n <div class=\"bioDescriptionWrap\">\n <p class=\"bioDescriptionText\" id=${bioDescriptionId}>${bioData.description}</p>\n <button\n type=\"button\"\n class=\"bioDescriptionToggle\"\n aria-controls=${bioDescriptionId}\n aria-expanded=\"false\"\n hidden\n @click=${toggleDescription}\n >\n ...more\n </button>\n </div>\n ` : ''}\n `\n}\n\nfunction hasBioContent(bioData: BioDetails): boolean {\n return Boolean((bioData?.description || '').trim())\n}\n\n\nexport const BioCard = (\n bioData: BioDetails,\n viewerMode: ViewerMode\n) => {\n void viewerMode\n\n return html`\n <article class=\"bioCard\" aria-label=\"Bio\" data-testid=\"bio-card\">\n <section class=\"bioSection\">\n ${renderBio(bioData)}\n </section>\n </article>\n `\n}\n\nfunction renderBioSectionContent(\n store: LiveStore,\n subject: NamedNode,\n bioData: BioDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const bio = BioCard(bioData, viewerMode)\n const bioDetails: BioDetails = bioData\n const isOwner = viewerMode === 'owner'\n \n return html`\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"bio-heading\" tabindex=\"-1\">${bioHeadingText}</h2>\n ${isOwner ? html`\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center\"\n aria-label=\"Edit bio details\"\n @click=${(event: Event) => {\n return createBioEditDialog(\n event,\n store,\n subject,\n bioDetails,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile-section-collapsible__edit-label profile__action-icon\">${editIcon} Edit</span>\n <span class=\"profile-section-collapsible__edit-icon profile__action-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n ` : html``}\n </header>\n <div class=\"profile-section-collapsible__content\">\n ${bio}\n </div>\n `\n}\n\nfunction renderBioSectionDefault(\n store: LiveStore,\n subject: NamedNode,\n bioData: BioDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"bio-heading\" \n data-profile-section=\"bio\"\n class=\"profile__section border-lighter\" \n role=\"region\"\n tabindex=\"-1\"\n >\n ${renderBioSectionContent(store, subject, bioData, viewerMode, onSaved)}\n </section>\n `\n}\n\nfunction renderOwnerEmptyBioContent(\n store: LiveStore,\n subject: NamedNode,\n bioData: BioDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const bioDetails: BioDetails = bioData\n\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty bio section\">\n <h2 id=\"bio-heading\" tabindex=\"-1\">${bioHeadingText}</h2>\n <p class=\"profile__empty-state-message\">\n You haven't added any professional experience yet. Adding work history can boost your Bio.\n </p>\n </div>\n <button\n type=\"button\"\n class=\"profile__action-button--empty\"\n aria-label=\"Add bio details\"\n @click=${(event: Event) => {\n return createBioEditDialog(\n event,\n store,\n subject,\n bioDetails,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile__action-icon\" aria-hidden=\"true\">${plusDarkIcon} Add Bio</span>\n </button>\n\n `\n}\n\nfunction renderOwnerEmptyBioSection(\n store: LiveStore,\n subject: NamedNode,\n bioData: BioDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"bio-heading\" \n data-profile-section=\"bio\"\n class=\"profile__section--empty border-lighter flex-column-center rounded-md gap-lg\" \n role=\"region\"\n tabindex=\"-1\"\n >\n ${renderOwnerEmptyBioContent(store, subject, bioData, viewerMode, onSaved)}\n </section>\n `\n}\n\nexport function renderBioSection(\n store: LiveStore,\n subject: NamedNode,\n bioData: BioDetails,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n scheduleDescriptionOverflowCheck()\n\n const hasBio = hasBioContent(bioData)\n const showOwnerEmptyBio = !hasBio && viewerMode === 'owner'\n const showSection = true\n \n\n return showSection ? html`\n ${showOwnerEmptyBio\n ? renderOwnerEmptyBioSection(store, subject, bioData, viewerMode, onSaved)\n : renderBioSectionDefault(store, subject, bioData, viewerMode, onSaved)}\n ` : ''\n}\n","import { blankNode, LiveStore, NamedNode, Node, st, literal, sym } from 'rdflib'\nimport { ns } from 'solid-ui'\nimport { SocialMutationPlan, SocialRow } from './types'\nimport { MutationOps } from '../shared/types'\nimport { createIdNode } from '../shared/idNodeFactory'\nimport {\n\tapplyUpdaterPatch,\n\tcollectNodeStatements,\n\tfindExistingNode\n} from '../shared/rdfMutationHelpers'\nimport { saveSocialUpdatesFailedPrefixText, updaterUnsupportedStoreErrorMessageText } from '../../texts'\nimport { findSocialAccountOption, getSocialAccountOptions } from './helpers'\nimport { presentSocial } from './selectors'\nimport { expandRdfList } from '../shared/rdfList'\n/* The code below for handling reordering were generated by AI Model: GPT-5.3-Codex. */\n/* Prompt: can you implement on SocialEditDialog add the bentoIcon as the first item \non the row, you should be able to drag this button around and it should allow you \nto change the order of the rows and that should change the order in the mutations \nthat happen for this data. */\n\nconst SOCIAL_ONTOLOGY_NS = 'https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#'\n\nfunction ensureSocialPrefix(store: LiveStore) {\n\tconst anyStore = store as any\n\tif (typeof anyStore.setPrefixForURI === 'function') {\n\t\tanyStore.setPrefixForURI('soc', SOCIAL_ONTOLOGY_NS)\n\t\treturn\n\t}\n\tif (!anyStore.namespaces) {\n\t\tanyStore.namespaces = {}\n\t}\n\tanyStore.namespaces.soc = SOCIAL_ONTOLOGY_NS\n}\n\nfunction isSocialPatchDebugEnabled(): boolean {\n\tconst debugFlag = (globalThis as any)?.__PROFILE_PANE_SOCIAL_DEBUG__\n\treturn debugFlag === true || debugFlag === '1' || debugFlag === 'true'\n}\n\nfunction statementDebugValue(term: any): string {\n\tif (!term) return ''\n\tif (typeof term.toNT === 'function') return term.toNT()\n\tif (typeof term.value === 'string') return term.value\n\treturn String(term)\n}\n\nfunction statementToDebugObject(statement: any) {\n\treturn {\n\t\tsubject: statementDebugValue(statement?.subject),\n\t\tpredicate: statementDebugValue(statement?.predicate),\n\t\tobject: statementDebugValue(statement?.object),\n\t\tgraph: statementDebugValue(statement?.why)\n\t}\n}\nfunction toObjectNode(value?: string): Node | null {\n\tconst normalized = (value || '').trim()\n\tif (!normalized) return null\n\tif (normalized.startsWith('http://') || normalized.startsWith('https://')) {\n\t\treturn sym(normalized)\n\t}\n\treturn literal(normalized)\n}\n\nfunction normalizeValue(value?: unknown): string {\n\tif (typeof value === 'string') return value.trim()\n\tif (value === null || value === undefined) return ''\n\treturn String(value).trim()\n}\n\nfunction toAccountNameFromHomepage(homepage: string, profilePrefix?: string): string {\n\tconst homepageValue = normalizeValue(homepage)\n\tif (!homepageValue) return ''\n\n\tconst prefixValue = normalizeValue(profilePrefix)\n\tif (prefixValue) {\n\t\tlet trimmed = homepageValue\n\t\tconst lowerPrefix = prefixValue.toLowerCase()\n\t\twhile (trimmed.toLowerCase().startsWith(lowerPrefix)) {\n\t\t\ttrimmed = trimmed.slice(prefixValue.length)\n\t\t}\n\t\tif (trimmed) return trimmed\n\n\t\ttry {\n\t\t\tconst homepageUrl = new URL(homepageValue)\n\t\t\tconst prefixUrl = new URL(prefixValue)\n\t\t\tconst normalizeHost = (host: string) => host.toLowerCase().replace(/^www\\./, '')\n\t\t\tconst homepageHost = normalizeHost(homepageUrl.hostname)\n\t\t\tconst prefixHost = normalizeHost(prefixUrl.hostname)\n\t\t\tconst prefixPath = (prefixUrl.pathname || '/').replace(/\\/+$/, '')\n\t\t\tconst homepagePath = homepageUrl.pathname || '/'\n\n\t\t\tif (homepageHost === prefixHost && homepagePath.startsWith(prefixPath)) {\n\t\t\t\tconst remainder = homepagePath.slice(prefixPath.length).replace(/^\\/+/, '')\n\t\t\t\tif (remainder) return remainder\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore URL parsing issues and continue to generic normalization.\n\t\t}\n\t}\n\n\treturn homepageValue\n\t\t.replace(/^https?:\\/\\//i, '')\n\t\t.replace(/^www\\./i, '')\n}\n\nfunction buildSocialStatements(\n\tdoc: NamedNode,\n\tnode: NamedNode,\n\trow: SocialRow,\n\taccountOption?: { classUri: string, label: string, icon: string, userProfilePrefix?: string, homepage?: string }\n) {\n\tconst inserts: any[] = []\n\tif (accountOption?.classUri) {\n\t\tinserts.push(st(node as any, ns.rdf('type'), sym(accountOption.classUri), doc))\n\t}\n\n\tconst normalizedName = normalizeValue(row.name)\n\tconst isOther = normalizedName.toLowerCase() === 'other' || accountOption?.classUri?.endsWith('#OtherAccount')\n\n\tif (isOther) {\n\t\tconst homepageNode = toObjectNode(row.homepage)\n\t\tconst iconNode = toObjectNode(row.icon)\n\t\tif (homepageNode) inserts.push(st(node as any, ns.foaf('homepage'), homepageNode as any, doc))\n\t\tif (iconNode) inserts.push(st(node as any, ns.foaf('icon'), iconNode as any, doc))\n\t\tif (normalizedName && normalizedName.toLowerCase() !== 'other') {\n\t\t\tinserts.push(st(node as any, ns.rdfs('label'), literal(normalizedName), doc))\n\t\t}\n\t\treturn inserts\n\t}\n\n\tconst accountPrefix = accountOption?.userProfilePrefix || accountOption?.homepage\n\tconst accountName = toAccountNameFromHomepage(normalizeValue(row.homepage), accountPrefix)\n\tif (accountName) {\n\t\tinserts.push(st(node as any, ns.foaf('accountName'), literal(accountName), doc))\n\t}\n\n\treturn inserts\n}\n\nfunction statementKey(statement: any): string {\n\treturn `${statement.subject?.toNT?.() || statement.subject?.value} ${statement.predicate?.toNT?.() || statement.predicate?.value} ${statement.object?.toNT?.() || statement.object?.value} ${statement.why?.toNT?.() || statement.why?.value}`\n}\n\nfunction uniqueStatements(statements: any[]): any[] {\n\treturn Array.from(new Map((statements || []).map((statement) => [statementKey(statement), statement])).values())\n}\n\nfunction buildRdfListStatements(doc: NamedNode, items: NamedNode[]) {\n\tif (!items.length) {\n\t\treturn {\n\t\t\thead: ns.rdf('nil') as Node,\n\t\t\tstatements: [] as any[]\n\t\t}\n\t}\n\n\tconst listNodes = items.map(() => blankNode())\n\tconst statements: any[] = []\n\n\titems.forEach((item, index) => {\n\t\tconst current = listNodes[index]\n\t\tconst next = listNodes[index + 1] || ns.rdf('nil')\n\t\tstatements.push(st(current as any, ns.rdf('first'), item as any, doc))\n\t\tstatements.push(st(current as any, ns.rdf('rest'), next as any, doc))\n\t})\n\n\treturn {\n\t\thead: listNodes[0] as Node,\n\t\tstatements\n\t}\n}\n\nfunction isPatchFailure(message: string): boolean {\n\tconst text = (message || '').toLowerCase()\n\treturn text.includes(' on patch ') || text.includes('web error: 400') || text.includes('web error: 405') || text.includes('web error: 501')\n}\n\nfunction sanitizePatchStatements(store: LiveStore, deletions: any[], insertions: any[]) {\n\tconst safeDeletions = Array.from(new Map(\n\t\t(deletions || [])\n\t\t\t.filter((statement) => {\n\t\t\t\tif (!statement || !statement.subject || !statement.predicate || !statement.object) return false\n\t\t\t\tif (store.holds(statement.subject, statement.predicate, statement.object, statement.why)) return true\n\t\t\t\treturn store.statementsMatching(statement.subject, statement.predicate, statement.object, statement.why).length > 0\n\t\t\t})\n\t\t\t.map((statement) => [statementKey(statement), statement])\n\t).values())\n\n\tconst safeInsertions = Array.from(new Map(\n\t\t(insertions || [])\n\t\t\t.filter((statement) => Boolean(statement && statement.subject && statement.predicate && statement.object))\n\t\t\t.map((statement) => [statementKey(statement), statement])\n\t).values())\n\n\treturn { safeDeletions, safeInsertions }\n}\n\nasync function runPutFallback(store: LiveStore, doc: NamedNode, deletions: any[], insertions: any[]) {\n\tconst updater = store.updater as any\n\tconst fetcher = (store as any).fetcher\n\n\tif (!updater || typeof updater.serialize !== 'function' || !fetcher || typeof fetcher.webOperation !== 'function') {\n\t\tthrow new Error('Social updates are not supported by this store updater.')\n\t}\n\n\tconst currentStatements = store.statementsMatching(undefined, undefined, undefined, doc).slice()\n\tconst deletionKeys = new Set((deletions || []).map((statement) => statementKey(statement)))\n\tconst nextStatements = currentStatements.filter((statement) => !deletionKeys.has(statementKey(statement))).concat(insertions || [])\n\n\tconst contentType = 'text/turtle'\n\tconst body = updater.serialize(doc.value, nextStatements, contentType)\n\tconst response = await fetcher.webOperation('PUT', doc.value, {\n\t\tnoMeta: true,\n\t\tcontentType,\n\t\tbody\n\t})\n\n\tif (!response || response.ok !== true) {\n\t\tconst status = response?.status || 'unknown'\n\t\tthrow new Error(`Web error: ${status} on PUT of <${doc.value}>`)\n\t}\n\n\tstore.remove(deletions)\n\tinsertions.forEach((statement) => {\n\t\tstore.add(statement.subject, statement.predicate, statement.object, statement.why)\n\t})\n}\n\nasync function applySocialPatchWithFallback(store: LiveStore, doc: NamedNode, deletions: any[], insertions: any[]) {\n\tif (!store.updater) {\n\t\tthrow new Error(updaterUnsupportedStoreErrorMessageText)\n\t}\n\n\tconst { safeDeletions, safeInsertions } = sanitizePatchStatements(store, deletions, insertions)\n\n\tif (safeDeletions.length === 0 && safeInsertions.length === 0) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tawait applyUpdaterPatch(store, safeDeletions, safeInsertions)\n\t\treturn\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tif (!isPatchFailure(message)) throw error\n\t}\n\n\tawait runPutFallback(store, doc, safeDeletions, safeInsertions)\n}\n\nfunction collectListChainNodes(store: LiveStore, listHead: Node, doc: NamedNode): Node[] {\n\tif (!store.any(listHead as any, ns.rdf('first'), null, doc)) return []\n\n\tconst visited = new Set<string>()\n\tconst nodes: Node[] = []\n\tlet current: Node | null = listHead\n\n\twhile (current) {\n\t\tconst key = `${current.termType}:${current.value}`\n\t\tif (visited.has(key)) break\n\t\tvisited.add(key)\n\t\tnodes.push(current)\n\n\t\tconst rest = store.any(current as any, ns.rdf('rest'), null, doc) as Node | null\n\t\tif (!rest || (rest.termType === 'NamedNode' && rest.value === ns.rdf('nil').value)) {\n\t\t\tbreak\n\t\t}\n\t\tcurrent = rest\n\t}\n\n\treturn nodes\n}\n\nfunction mergeSocialOps(existingRows: SocialRow[], socialOps: MutationOps<SocialRow>): SocialRow[] {\n\tconst removeKeys = new Set(\n\t\tsocialOps.remove\n\t\t\t.map((row) => normalizeValue(row.entryNode))\n\t\t\t.filter(Boolean)\n\t)\n\n\tconst updateByKey = new Map(\n\t\tsocialOps.update\n\t\t\t.map((row) => [normalizeValue(row.entryNode), row] as const)\n\t\t\t.filter(([key]) => Boolean(key))\n\t)\n\n\tconst mergedExisting = existingRows\n\t\t.filter((row) => !removeKeys.has(normalizeValue(row.entryNode)))\n\t\t.map((row) => {\n\t\t\tconst key = normalizeValue(row.entryNode)\n\t\t\treturn updateByKey.get(key) || row\n\t\t})\n\n\tconst creates = socialOps.create.filter((row) => {\n\t\treturn Boolean(normalizeValue(row.name) || normalizeValue(row.homepage) || normalizeValue(row.icon))\n\t})\n\n\treturn [...mergedExisting, ...creates]\n}\n\nfunction rowsFromOrderedInput(orderedRows: SocialRow[]): SocialRow[] {\n\treturn (orderedRows || [])\n\t\t.filter((row) => row.status !== 'deleted')\n\t\t.filter((row) => Boolean(normalizeValue(row.name) || normalizeValue(row.homepage) || normalizeValue(row.icon) || normalizeValue(row.entryNode)))\n\t\t.map((row) => ({\n\t\t\tname: normalizeValue(row.name),\n\t\t\ticon: normalizeValue(row.icon),\n\t\t\thomepage: normalizeValue(row.homepage),\n\t\t\tentryNode: normalizeValue(row.entryNode),\n\t\t\tstatus: row.status\n\t\t}))\n}\n\nasync function mutateSocialEntries(\n\tstore: LiveStore,\n\tsubject: NamedNode,\n\tsocialOps: MutationOps<SocialRow>,\n\torderedRows?: SocialRow[]\n) {\n\tensureSocialPrefix(store)\n\tconst doc = subject.doc()\n\tconst accountOptions = getSocialAccountOptions(store)\n\tconst optionForRow = (row: SocialRow) => findSocialAccountOption(accountOptions, normalizeValue(row.name))\n\n\tconst existingRows: SocialRow[] = presentSocial(subject, store).accounts.map((account) => ({\n\t\tname: normalizeValue(account.name),\n\t\ticon: normalizeValue(account.icon),\n\t\thomepage: normalizeValue(account.homepage),\n\t\tentryNode: account.entryNode.value,\n\t\tstatus: 'existing'\n\t}))\n\n\tconst nextRows = orderedRows && orderedRows.length\n\t\t? rowsFromOrderedInput(orderedRows)\n\t\t: mergeSocialOps(existingRows, socialOps)\n\n\tconst accountObjects = store.each(subject, ns.foaf('account'), null, doc)\n\tconst existingListNodes = uniqueStatements(\n\t\taccountObjects.flatMap((objectNode) => {\n\t\t\treturn collectListChainNodes(store, objectNode, doc)\n\t\t\t\t.flatMap((node) => store.statementsMatching(node as any, null, null, doc))\n\t\t})\n\t)\n\n\tconst existingAccountNodes = Array.from(new Map(\n\t\taccountObjects\n\t\t\t.flatMap((objectNode) => expandRdfList(store, objectNode))\n\t\t\t.filter((node) => node.termType === 'NamedNode')\n\t\t\t.map((node) => [`${node.termType}:${node.value}`, node as NamedNode])\n\t).values())\n\n\tconst rowEntryNodes = nextRows.map((row) => {\n\t\tif (normalizeValue(row.entryNode)) {\n\t\t\tconst existing = findExistingNode(existingAccountNodes as Node[], row.entryNode)\n\t\t\tif (existing && existing.termType === 'NamedNode') return existing as NamedNode\n\t\t}\n\t\treturn createIdNode(doc)\n\t})\n\n\tconst insertions: any[] = []\n\tif (rowEntryNodes.length > 0) {\n\t\tconst rdfList = buildRdfListStatements(doc, rowEntryNodes)\n\t\tinsertions.push(st(subject, ns.foaf('account'), rdfList.head as any, doc))\n\t\tinsertions.push(...rdfList.statements)\n\t}\n\n\tnextRows.forEach((row, index) => {\n\t\tinsertions.push(...buildSocialStatements(doc, rowEntryNodes[index], row, optionForRow(row)))\n\t})\n\n\tconst deletions = uniqueStatements([\n\t\t...store.statementsMatching(subject, ns.foaf('account'), null, doc),\n\t\t...existingListNodes,\n\t\t...existingAccountNodes.flatMap((node) => collectNodeStatements(store, node, doc))\n\t])\n\n\tif (isSocialPatchDebugEnabled()) {\n\t\tconsole.log('[social-mutations] patch payload', {\n\t\t\tsubject: subject.value,\n\t\t\tdoc: doc.value,\n\t\t\tnextRows,\n\t\t\tdeletionsCount: deletions.length,\n\t\t\tinsertionsCount: insertions.length,\n\t\t\tdeletions: deletions.map(statementToDebugObject),\n\t\t\tinsertions: uniqueStatements(insertions).map(statementToDebugObject)\n\t\t})\n\t}\n\n\tawait applySocialPatchWithFallback(store, doc, deletions, uniqueStatements(insertions))\n}\n\nexport async function processSocialMutations(\n\tstore: LiveStore,\n\tsubject: NamedNode,\n\tmutationPlan: SocialMutationPlan,\n\torderedRows?: SocialRow[]\n) {\n\ttry {\n\t\tawait mutateSocialEntries(store, subject, mutationPlan, orderedRows)\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tthrow new Error(`${saveSocialUpdatesFailedPrefixText} ${message}`)\n\t}\n}\n","import { openInputDialog } from '../../ui/dialog'\nimport { html, render } from 'lit-html'\nimport type { Account, SocialRow } from './types'\nimport '../../styles/ContactInfoEditDialog.css'\nimport '../../styles/EditDialogs.css'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { ViewerMode } from '../../types'\nimport { applyRowFieldChange, deleteRow, summarizeRowOps } from '../shared/rowState'\nimport { hasNonEmptyText, sanitizeTextValue, toText } from '../../textUtils'\nimport { MutationOps } from '../shared/types'\nimport { processSocialMutations } from './mutations'\nimport { bentoIcon, trashIcon } from '../../icons-svg/profileIcons'\nimport {\n deleteEntryButtonTitleText,\n dialogCancelLabelText,\n dialogSubmitLabelText,\n editSocialDialogTitleText,\n ownerLoginRequiredDialogMessageText,\n saveSocialUpdatesFailedPrefixText\n} from '../../texts'\nimport { DEFAULT_ICON_URI } from './constants'\nimport { findSocialAccountOption, getSocialAccountOptions, type SocialAccountOption } from './helpers'\n\n/* The code below for handling reordering were generated by AI Model: GPT-5.3-Codex. */\n/* Prompt: can you implement on SocialEditDialog add the bentoIcon as the first item \non the row, you should be able to drag this button around and it should allow you \nto change the order of the rows and that should change the order in the mutations \nthat happen for this data. */\n\ntype SocialFormState = {\n socialAccounts: SocialRow[]\n initialExistingOrder: string[]\n}\n\ntype SocialEditableField = 'name' | 'icon' | 'homepage'\n\ntype SocialRerenderOptions = {\n focusSelector?: string\n}\n\ntype SocialRowInputProps = {\n rows: SocialRow[]\n index: number\n displayIndex: number\n onDelete: () => void\n onChange: () => void\n options: SocialAccountOption[]\n onDragStart: (index: number) => void\n onDragOver: (event: DragEvent) => void\n onDrop: (index: number) => void\n onDragEnd: () => void\n isDropTarget: boolean\n}\n\nfunction sanitizeSocialFieldValue(value: string): string {\n return sanitizeTextValue(value)\n}\n\nfunction sanitizeUrlFieldValue(value: string): string {\n return sanitizeTextValue(value).replace(/\\s+/g, '')\n}\n\nfunction isValidProfileUrl(value: string): boolean {\n const normalized = (value || '').trim()\n if (!normalized) return false\n try {\n const parsed = new URL(normalized)\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\n } catch {\n return false\n }\n}\n\nfunction rowHasContent(row: SocialRow): boolean {\n // A social account is considered meaningful only when a personal profile URL is set.\n return hasNonEmptyText(row.homepage)\n}\n\nfunction toFormState(socialAccounts: Account[]): SocialFormState {\n const rows = (socialAccounts || [])\n .map((account) => ({\n name: sanitizeSocialFieldValue(toText(account.name)),\n icon: sanitizeSocialFieldValue(toText(account.icon)),\n homepage: sanitizeSocialFieldValue(toText(account.homepage)),\n entryNode: toText(account.entryNode),\n status: toText(account.entryNode) ? 'existing' as const : 'new' as const\n }))\n .filter((row) => Boolean(row.name || row.icon || row.homepage || row.entryNode))\n\n return {\n socialAccounts: rows.length\n ? rows\n : [{ name: '', icon: '', homepage: '', entryNode: '', status: 'new' }],\n initialExistingOrder: []\n }\n}\n\nfunction hasOrderChanged(rows: SocialRow[], initialExistingOrder: string[]): boolean {\n const currentExistingOrder = rows\n .filter((row) => row.status !== 'deleted' && Boolean((row.entryNode || '').trim()))\n .map((row) => (row.entryNode || '').trim())\n\n if (currentExistingOrder.length !== initialExistingOrder.length) return true\n\n for (let i = 0; i < currentExistingOrder.length; i++) {\n if (currentExistingOrder[i] !== initialExistingOrder[i]) return true\n }\n\n return false\n}\n\nfunction validateSocialBeforeSave(rows: SocialRow[], initialExistingOrder: string[]): string | null {\n const ops = summarizeRowOps(rows, rowHasContent)\n const hasChanges = ops.create.length > 0 || ops.update.length > 0 || ops.remove.length > 0\n const orderChanged = hasOrderChanged(rows, initialExistingOrder)\n if (!hasChanges && !orderChanged) return 'No social changes detected.'\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n if (!row || row.status === 'deleted') continue\n\n const hasAnyValue = [row.name, row.icon, row.homepage].some(hasNonEmptyText)\n if (!hasAnyValue) continue\n\n if (!hasNonEmptyText(row.name) || !hasNonEmptyText(row.icon)) {\n return `Social account ${i + 1}: please choose an account type from the dropdown.`\n }\n\n if (!hasNonEmptyText(row.homepage)) {\n return `Social account ${i + 1}: please enter your personal profile link.`\n }\n\n if (!isValidProfileUrl(row.homepage || '')) {\n return `Social account ${i + 1}: profile link must be a valid http(s) URL.`\n }\n }\n\n return null\n}\n\nfunction renderSocialAccountInputSelect(\n row: SocialRow,\n rowIndex: number,\n options: SocialAccountOption[],\n onChange: (event: Event) => void\n) {\n const selected = findSocialAccountOption(options, row?.name || '')\n const selectedLabel = selected?.label || ''\n\n return html`\n <select\n class=\"profile-edit-dialog__social-account-select\"\n name=${`social-account-type-${rowIndex}`}\n data-row-index=${String(rowIndex)}\n autocomplete=\"off\"\n @change=${onChange}\n >\n <option value=\"\">Select</option>\n ${options.map((option) => html`\n <option value=${option.label} ?selected=${option.label === selectedLabel}>${option.label}</option>\n `)}\n </select>\n `\n}\n\nfunction renderSocialInputRow({\n rows,\n index,\n displayIndex,\n onDelete,\n onChange,\n options,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n isDropTarget\n}: SocialRowInputProps) {\n const row = rows[index]\n const nameLabel = `Social Account Name ${displayIndex + 1}`\n const homepageLabel = `Social Account Homepage ${displayIndex + 1}`\n\n const handleTextInput = (field: SocialEditableField) => (event: Event) => {\n const target = event.target as HTMLInputElement\n const nextValue = field === 'homepage'\n ? sanitizeUrlFieldValue(target.value)\n : sanitizeSocialFieldValue(target.value)\n if (rows[index]) {\n applyRowFieldChange(rows[index], field, nextValue, rowHasContent)\n onChange()\n }\n }\n\n const handleAccountTypeInput = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const selected = findSocialAccountOption(options, target.value)\n if (!rows[index]) return\n\n if (!selected) {\n applyRowFieldChange(rows[index], 'name', '', rowHasContent)\n applyRowFieldChange(rows[index], 'icon', '', rowHasContent)\n onChange()\n return\n }\n\n applyRowFieldChange(rows[index], 'name', selected.label, rowHasContent)\n applyRowFieldChange(rows[index], 'icon', selected.icon || DEFAULT_ICON_URI, rowHasContent)\n\n onChange()\n }\n\n const handleDelete = (event: Event) => {\n event.preventDefault()\n onDelete()\n }\n\n return html`\n <div\n class=\"profile-edit-dialog__row profile-edit-dialog__row--social ${isDropTarget ? 'profile-edit-dialog__row--drop-target' : ''}\"\n @dragover=${(event: DragEvent) => onDragOver(event)}\n @drop=${() => onDrop(index)}\n >\n <button\n type=\"button\"\n class=\"profile-edit-dialog__drag-handle\"\n aria-label=${`Reorder social account ${displayIndex + 1}`}\n title=\"Drag to reorder\"\n draggable=\"true\"\n @dragstart=${() => onDragStart(index)}\n @dragend=${() => onDragEnd()}\n >\n ${bentoIcon}\n </button>\n <img \n class=\"profile-edit-dialog__social-icon\" \n src=\"${row?.icon || DEFAULT_ICON_URI}\" \n alt=\"${row?.name || 'Social'} icon\"\n width=\"30\"\n height=\"30\"\n loading=\"lazy\"\n />\n <label aria-label=${nameLabel} class=\"label profile-edit-dialog__field profile-edit-dialog__field--social-type\">\n ${renderSocialAccountInputSelect(row, index, options, handleAccountTypeInput)}\n </label>\n <label aria-label=${homepageLabel} class=\"label profile-edit-dialog__field profile-edit-dialog__field--social-url\">\n <input\n class=\"input\"\n type=\"url\"\n name=${`social-homepage-${index}`}\n .value=${row?.homepage || ''}\n data-contact-field=\"homepage\"\n data-entry-node=${row?.entryNode || ''}\n data-row-status=${row?.status || 'n/a'}\n placeholder=\"Profile URL\"\n autocomplete=\"url\"\n inputmode=\"url\"\n required\n @input=${handleTextInput('homepage')}\n />\n <small class=\"profile-edit-dialog__input-help-text\">Paste your full profile URL (for example: https://example.com/username)</small>\n </label>\n <div class=\"profile-edit-dialog__actions profile-edit-dialog__actions--edge\">\n <button\n type=\"button\"\n class=\"profile-edit-dialog__delete-button\"\n aria-label=${`Delete social account ${displayIndex + 1}`}\n title=${deleteEntryButtonTitleText}\n @click=${handleDelete}\n >\n <span class=\"profile-edit-dialog__delete-icon\" aria-hidden=\"true\">${trashIcon}</span>\n </button>\n </div>\n </div>\n `\n}\n\nfunction renderSocialSection(rows: SocialRow[], options: SocialAccountOption[], onRerender: (options?: SocialRerenderOptions) => void) {\n let dragSourceIndex: number | null = null\n let dropTargetIndex: number | null = null\n\n const reorderRows = (from: number, to: number) => {\n if (from === to) return\n const row = rows[from]\n if (!row) return\n rows.splice(from, 1)\n rows.splice(to, 0, row)\n }\n\n const handleDragStart = (index: number) => {\n dragSourceIndex = index\n dropTargetIndex = index\n }\n\n const handleDragOver = (event: DragEvent) => {\n event.preventDefault()\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move'\n }\n }\n\n const handleDrop = (index: number) => {\n if (dragSourceIndex === null) return\n reorderRows(dragSourceIndex, index)\n dragSourceIndex = null\n dropTargetIndex = null\n onRerender()\n }\n\n const handleDragEnd = () => {\n dragSourceIndex = null\n dropTargetIndex = null\n }\n\n const visibleRows = rows\n .map((row, index) => ({ row, index }))\n .filter(({ row }) => row.status !== 'deleted')\n\n return html`\n <section class=\"profile-edit-dialog__section\" aria-label=\"Social Accounts\">\n <fieldset>\n <legend class=\"sr-only\">Social account entries</legend>\n ${visibleRows.map(({ index }, displayIndex) =>\n renderSocialInputRow({\n rows,\n index,\n displayIndex,\n onDelete: () => {\n deleteRow(rows, index)\n onRerender()\n },\n onChange: onRerender,\n options,\n onDragStart: handleDragStart,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n onDragEnd: handleDragEnd,\n isDropTarget: dropTargetIndex === index\n })\n )}\n </fieldset>\n </section>\n `\n}\n\nfunction focusSocialField(form: HTMLFormElement, selector: string): void {\n const nextField = form.querySelector(selector) as HTMLElement | null\n if (!nextField || typeof nextField.focus !== 'function') return\n\n nextField.scrollIntoView({ block: 'start', behavior: 'auto' })\n nextField.focus()\n}\n\nfunction renderSocialEditTemplate(\n form: HTMLFormElement,\n formState: SocialFormState,\n store: LiveStore,\n viewerMode: ViewerMode,\n rerenderOptions: SocialRerenderOptions = {}\n) {\n const rerender = (nextOptions: SocialRerenderOptions = {}) => renderSocialEditTemplate(form, formState, store, viewerMode, nextOptions)\n const socialOptions = getSocialAccountOptions(store)\n render(html`\n ${renderSocialSection(formState.socialAccounts, socialOptions, rerender)}\n ${viewerMode !== 'owner'\n ? html`<p class=\"profile-edit-dialog__login-message\">${ownerLoginRequiredDialogMessageText}</p>`\n : null}\n `, form)\n\n if (rerenderOptions.focusSelector) {\n focusSocialField(form, rerenderOptions.focusSelector)\n }\n}\n\nfunction createSocialEditForm(details: Account[], store: LiveStore, viewerMode: ViewerMode) {\n const form = document.createElement('form')\n form.classList.add('profile__edit-form')\n\n const formState = toFormState(details)\n formState.initialExistingOrder = formState.socialAccounts\n .filter((row) => Boolean((row.entryNode || '').trim()))\n .map((row) => (row.entryNode || '').trim())\n renderSocialEditTemplate(form, formState, store, viewerMode)\n\n const addRow = () => {\n formState.socialAccounts.unshift({\n name: '',\n icon: '',\n homepage: '',\n entryNode: '',\n status: 'new'\n })\n renderSocialEditTemplate(form, formState, store, viewerMode, { focusSelector: '[name=\"social-account-type-0\"]' })\n }\n\n return { form, formState, addRow }\n}\n\nexport async function createSocialEditDialog(\n event: Event,\n store: LiveStore,\n subject: NamedNode,\n socialAccounts: Account[],\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const dom = (event.currentTarget as HTMLElement | null)?.ownerDocument || document\n const { form, formState, addRow } = createSocialEditForm(socialAccounts, store, viewerMode)\n\n const result = await openInputDialog({\n title: editSocialDialogTitleText,\n dom,\n form,\n headerAction: {\n type: 'button',\n label: '+ Add More',\n ariaLabel: 'Add another social account',\n onClick: addRow\n },\n submitLabel: dialogSubmitLabelText,\n cancelLabel: dialogCancelLabelText,\n validate: () => {\n if (viewerMode !== 'owner') {\n return ownerLoginRequiredDialogMessageText\n }\n return validateSocialBeforeSave(formState.socialAccounts, formState.initialExistingOrder)\n },\n onSave: async () => {\n const socialOps = summarizeRowOps(formState.socialAccounts, rowHasContent)\n const plan: MutationOps<SocialRow> = {\n create: socialOps.create,\n update: socialOps.update,\n remove: socialOps.remove\n }\n await processSocialMutations(store, subject, plan, formState.socialAccounts)\n },\n formatSaveError: (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n return message.startsWith(saveSocialUpdatesFailedPrefixText)\n ? message\n : `${saveSocialUpdatesFailedPrefixText} ${message}`\n }\n })\n\n if (!result) return\n\n if (onSaved) {\n await onSaved()\n }\n}\n","import { html, TemplateResult } from 'lit-html'\nimport { Account, SocialPresentation } from './types'\nimport { ViewerMode } from '../../types'\nimport '../../styles/SocialCard.css'\nimport { socialAccountsHeadingText } from '../../texts'\nimport { createSocialEditDialog } from './SocialEditDialog'\nimport { LiveStore, NamedNode } from 'rdflib'\nimport { toggleCollapsibleSection } from '../shared/collapsibleSection'\nimport { addIcon, editIcon, globeIcon } from '../../icons-svg/profileIcons'\n\nconst MAX_VISIBLE_SOCIAL_ACCOUNTS_MOBILE = 10\n\nfunction isRenderableAccount(account: Account): boolean {\n return Boolean(account?.homepage && account?.name && account?.icon)\n}\n\nfunction expandSocialAccounts(event: Event): void {\n const button = event.currentTarget as HTMLButtonElement | null\n const socialCard = button?.closest('.socialCard') as HTMLElement | null\n if (!button || !socialCard) return\n\n socialCard.setAttribute('data-mobile-expanded', 'true')\n button.setAttribute('aria-expanded', 'true')\n button.hidden = true\n}\n\nexport const SocialCard = (\n SocialData: SocialPresentation,\n viewerMode: ViewerMode\n): TemplateResult => {\n void viewerMode\n\n const accounts = (SocialData.accounts || []).filter(isRenderableAccount)\n const hiddenAccountsCount = Math.max(0, accounts.length - MAX_VISIBLE_SOCIAL_ACCOUNTS_MOBILE)\n\n if (accounts.length) {\n\n return html`\n <section\n class=\"socialCard\"\n aria-label=\"Social media\"\n data-testid=\"social-media\"\n data-mobile-expanded=\"${hiddenAccountsCount > 0 ? 'false' : 'true'}\"\n >\n <nav aria-label=\"Social media profiles\">\n <ul class=\"socialList list-reset\" role=\"list\">\n ${accounts.map(account => renderAccount(account))}\n </ul>\n </nav>\n ${hiddenAccountsCount > 0\n ? html`\n <button\n type=\"button\"\n class=\"socialCard__more-button\"\n aria-controls=\"social-media\"\n aria-expanded=\"false\"\n @click=${expandSocialAccounts}\n >\n ${hiddenAccountsCount} more\n </button>\n `\n : html``}\n </section>\n `\n }\n\n return html``\n\n function renderAccount(account: Account) {\n return html`\n <li class=\"socialItem\" role=\"listitem\">\n <a \n href=\"${account.homepage}\" \n target=\"_blank\" \n rel=\"noopener noreferrer\" \n aria-label=\"Visit ${account.name} profile (opens in new tab)\"\n >\n <img \n class=\"socialIcon\" \n src=\"${account.icon}\" \n alt=\"${account.name} icon\"\n width=\"40\"\n height=\"40\"\n loading=\"lazy\"\n />\n </a>\n </li>\n `\n }\n\n}\n\nfunction renderSocialSectionContent(\n socialData: SocialPresentation,\n viewerMode: ViewerMode\n) {\n const hasAccounts = socialData.accounts && socialData.accounts.length > 0\n\n return html`\n ${hasAccounts ? SocialCard(socialData, viewerMode) : html`<p>No social accounts added yet.</p>`}\n `\n}\n\nfunction renderSocialSectionDefault(\n store: LiveStore, \n subject: NamedNode, \n socialData: SocialPresentation, \n viewerMode: ViewerMode, \n onSaved?: () => Promise<void> | void) {\n // const hasAccounts = socialData.accounts && socialData.accounts.length > 0\n const showSection = true\n const isOwner = viewerMode === 'owner'\n\n const handleEdit = (event: Event) => {\n return createSocialEditDialog(\n event,\n store,\n subject,\n socialData.accounts,\n viewerMode,\n onSaved\n )\n }\n return showSection ? html`\n <section \n aria-labelledby=\"social-heading\" \n class=\"profile__section border-lighter profile-section-collapsible profile-section-collapsible--inline-mobile-actions\" \n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"social-heading\" tabindex=\"-1\">${socialAccountsHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n ${isOwner ? html`\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Edit social accounts\"\n @click=${handleEdit}\n >\n <span class=\"profile-section-collapsible__edit-label\">${editIcon} Edit</span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n ` : html``}\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle social accounts section\"\n aria-controls=\"social-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"social-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${renderSocialSectionContent(socialData, viewerMode)}\n </div>\n </section>\n ` : html``\n}\n\nfunction renderOwnerEmptySocialContent(\n _store: LiveStore,\n _subject: NamedNode,\n _socialData: SocialPresentation,\n _viewerMode: ViewerMode,\n _onSaved?: () => Promise<void> | void\n) {\n return html`\n <div class=\"profile__empty-state-content flex-column-center\" role=\"group\" aria-label=\"Empty social accounts section\">\n <div class=\"social__empty-icon-wrapper\">\n <span class=\"social__empty-icon inline-flex-row\">${globeIcon}</span>\n </div>\n <p class=\"profile__empty-state-message social__empty-message\">\n No social media links added yet.\n </p>\n </div>\n `\n}\n\nfunction renderOwnerEmptySocialSection(\n store: LiveStore,\n subject: NamedNode,\n socialData: SocialPresentation,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <section \n aria-labelledby=\"social-heading\" \n data-profile-section=\"social\"\n class=\"profile__section--empty border-lighter flex-column-center rounded-md gap-lg profile-section-collapsible profile-section-collapsible--inline-mobile-actions\" \n role=\"region\"\n tabindex=\"-1\"\n data-expanded=\"false\"\n >\n <header class=\"profile__section-header profile-section-collapsible__header\">\n <h2 id=\"social-heading\" tabindex=\"-1\">${socialAccountsHeadingText}</h2>\n <div class=\"profile-section-collapsible__actions flex-column\">\n <button\n type=\"button\"\n class=\"profile__action-button profile-action-text flex-center profile-section-collapsible__edit-button\"\n aria-label=\"Add social accounts\"\n @click=${(event: Event) => {\n return createSocialEditDialog(\n event,\n store,\n subject,\n socialData.accounts,\n viewerMode,\n onSaved\n )\n }}\n >\n <span class=\"profile-section-collapsible__edit-label profile__add-more-content inline-flex-row\">\n <span class=\"profile__add-more-icon inline-flex-row\" aria-hidden=\"true\">${addIcon}</span>\n Add Account\n </span>\n <span class=\"profile-section-collapsible__edit-icon\" aria-hidden=\"true\">${editIcon}</span>\n </button>\n <button\n type=\"button\"\n class=\"inline-flex-row\"\n aria-label=\"Toggle social accounts section\"\n aria-controls=\"social-panel\"\n aria-expanded=\"false\"\n @click=${toggleCollapsibleSection}\n >\n <span class=\"profile-section-collapsible__chevron\" aria-hidden=\"true\">⌄</span>\n </button>\n </div>\n </header>\n <div id=\"social-panel\" class=\"profile-section-collapsible__content\" aria-hidden=\"true\">\n ${renderOwnerEmptySocialContent(store, subject, socialData, viewerMode, onSaved)}\n </div>\n </section>\n `\n}\n\nexport function renderSocialAccounts(\n store: LiveStore,\n subject: NamedNode,\n socialData: SocialPresentation,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n const safeSocialData: SocialPresentation = socialData || { accounts: [] }\n const hasAccounts = Array.isArray(safeSocialData.accounts) && safeSocialData.accounts.length > 0\n const showOwnerEmptyAccounts = !hasAccounts && viewerMode === 'owner'\n const showSection = true\n \n return showSection ? html`\n ${showOwnerEmptyAccounts\n ? renderOwnerEmptySocialSection(store, subject, safeSocialData, viewerMode, onSaved)\n : renderSocialSectionDefault(store, subject, safeSocialData, viewerMode, onSaved)}\n ` : ''\n}\n","import { html, TemplateResult } from 'lit-html'\nimport { DataBrowserContext } from 'pane-registry'\nimport { NamedNode, LiveStore } from 'rdflib'\nimport { authn } from 'solid-logic'\nimport './styles/ProfileView.css'\nimport { QRCodeCard } from './QRCodeCard'\nimport { ViewerMode } from './types'\nimport { presentProfileViewModel } from './ProfileViewModelPresenter'\nimport { renderContactInfoSection } from './sections/contactInfo/ContactInfoSection'\nimport { renderLanguageSection } from './sections/languages/LanguageSection'\nimport { renderSkillsSection } from './sections/skills/SkillsSection'\nimport { SkillDetails } from './sections/skills/types'\nimport { ContactInfo } from './sections/contactInfo/types'\nimport { LanguageDetails } from './sections/languages/types'\nimport { renderCVSection } from './sections/resume/ResumeSection'\nimport { renderProjectSection } from './sections/projects/ProjectSection'\nimport { renderHeadingSection } from './sections/heading/HeadingSection'\nimport { renderBioSection } from './sections/bio/BioSection'\nimport { renderSocialAccounts } from './sections/social/SocialSection'\n\ntype ProfileViewModelData = Awaited<ReturnType<typeof presentProfileViewModel>>\ntype SocialAccounts = ProfileViewModelData['social']\n\nfunction getViewerMode(subject: NamedNode): ViewerMode {\n let mode: ViewerMode = 'anonymous'\n if (authn.currentUser() && authn.currentUser().sameTerm(subject)) mode = 'owner'\n if (authn.currentUser() && !authn.currentUser().sameTerm(subject)) mode = 'authenticated'\n return mode\n}\n\nfunction renderSidebar(\n store: LiveStore,\n subject: NamedNode,\n accounts: SocialAccounts,\n skills: SkillDetails[],\n languages: LanguageDetails[],\n contactInfo: ContactInfo,\n viewerMode: ViewerMode,\n onSaved?: () => Promise<void> | void\n) {\n return html`\n <aside \n aria-labelledby=\"sidebar-heading\" \n class=\"profile__sidebar p-sm\" \n >\n <h2 id=\"sidebar-heading\" class=\"sr-only\">Sidebar</h2>\n <div aria-label=\"Sidebar Content\" class=\"flex-column gap-md\">\n ${renderSocialAccounts(store, subject, accounts, viewerMode, onSaved)}\n ${renderSkillsSection(store, subject, skills, viewerMode, onSaved)}\n ${renderLanguageSection(store, subject, languages, viewerMode, onSaved)}\n ${renderContactInfoSection(store, subject, contactInfo, viewerMode, onSaved)}\n ${renderQRCode(subject, store)}\n </div>\n </aside>\n `\n}\n\nfunction renderQRCode(subject: NamedNode, store: LiveStore) {\n return html`\n <section class=\"profile__section border-lighter profile__qr-code\" aria-labelledby=\"qr-heading\" tabindex=\"-1\">\n <h2 id=\"qr-heading\" class=\"sr-only\">QR code</h2>\n <div class=\"qrcode-card__frame flex-center\">\n ${QRCodeCard(subject, store)}\n </div>\n </section>\n `\n}\n\nexport async function ProfileView (\n subject: NamedNode,\n context: DataBrowserContext,\n onSaved?: () => Promise<void> | void\n): Promise <TemplateResult> {\n const store = context.session.store as LiveStore\n const viewerMode = getViewerMode(subject)\n\n const viewModel = await presentProfileViewModel(subject, store)\n const profileDetails = viewModel.profileDetails\n const rolesByType = viewModel.cvDetails\n const skills = viewModel.skills\n const languages = viewModel.languages\n const projects = viewModel.projects\n const bioDetails = viewModel.bioDetails\n const accounts = viewModel.social\n const contactInfo = viewModel.contactInfo\n \n return html` \n <div class=\"profile-pane-root\">\n <main\n id=\"main-content\"\n class=\"profile-grid\"\n tabindex=\"-1\"\n > \n <h1 id=\"profile-content-heading\" class=\"sr-only\">Profile for ${profileDetails.name}</h1>\n\n <section\n class=\"profile__main flex-column gap-md p-sm\"\n >\n <h2 id=\"profile-main-heading\" class=\"sr-only\">Main Profile Content</h2>\n\n ${renderHeadingSection(context, subject, profileDetails, viewerMode, onSaved)}\n ${renderBioSection(store, subject, bioDetails, viewerMode, onSaved)}\n ${renderCVSection(store, subject, rolesByType, viewerMode, onSaved)}\n ${renderProjectSection(store, subject, projects, viewerMode, onSaved)}\n \n </section>\n ${renderSidebar(store, subject, accounts, skills, languages, contactInfo, viewerMode, onSaved)}\n </main>\n </div>\n `\n}\n","import { DataBrowserContext } from 'pane-registry'\nimport './styles/CVCard.css'\nimport './styles/ChatWithMe.css'\nimport './styles/ProfileCard.css'\nimport './styles/ProfileView.css'\nimport './styles/QRCodeCard.css'\nimport './styles/SocialCard.css'\nimport './styles/utilities.css'\nimport { NamedNode, LiveStore } from 'rdflib'\nimport { render } from 'lit-html'\nimport { ProfileView } from './ProfileView'\nimport { icons, ns } from 'solid-ui'\nimport * as qrcode from 'qrcode'\nexport {\n addMeToYourFriendsDiv,\n createAddMeToYourFriendsButton,\n saveNewThing,\n checkIfThingExists\n} from './addMeToYourFriends'\n\nasync function loadExtendedProfile(store: LiveStore, subject: NamedNode) {\n const otherProfiles = store.each(\n subject,\n ns.rdfs('seeAlso'),\n null,\n subject.doc()\n ) as Array<NamedNode>\n if (otherProfiles.length > 0) {\n await store.fetcher.load(otherProfiles)\n }\n}\n\n\nconst Pane = {\n global: false,\n icon: icons.iconBase + 'noun_15059.svg',\n name: 'profile',\n label: function (\n subject: NamedNode,\n context: DataBrowserContext\n ): string | null {\n const t = context.session.store.findTypeURIs(subject)\n if (\n t[ns.vcard('Individual').uri] ||\n t[ns.foaf('Person').uri] ||\n t[ns.schema('Person').uri]\n ) {\n return 'Profile'\n }\n return null\n }, \n render: (subject: NamedNode, context: DataBrowserContext): HTMLElement => {\n const target = context.dom.createElement('div')\n const store = context.session.store\n\n const renderWithData = async () => {\n render(await ProfileView(subject, context, renderWithData), target)\n const QRCodeEles = Array.from(target.getElementsByClassName('qrcode-card'))\n if (!QRCodeEles.length) return console.error('QRCode Ele missing')\n for (const QRCodeElement of QRCodeEles as HTMLElement[]) {\n const value = QRCodeElement.getAttribute('data-value')\n if (!value) return console.error('QRCode data-value missing')\n\n const options = {\n type: 'svg',\n color: {\n dark: '#000000',\n light: '#ffffff'\n }\n }\n\n qrcode.toString(value, options, function (error, svg) {\n if (error) {\n console.error('QRcode error!', error)\n } else {\n const imageContainer = QRCodeElement.querySelector('div[role=\"img\"]') as HTMLElement | null\n if (!imageContainer) {\n console.error('QRCode image container missing')\n return\n }\n imageContainer.innerHTML = svg\n imageContainer.style.width = '100%'\n imageContainer.style.height = '100%'\n imageContainer.style.margin = '0'\n }\n })\n }\n }\n\n loadExtendedProfile(store, subject).then(async () => {\n await renderWithData()\n })\n\n return target\n },\n}\n\nexport default Pane\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__5663__","__WEBPACK_EXTERNAL_MODULE__9426__","__WEBPACK_EXTERNAL_MODULE__5491__","___CSS_LOADER_EXPORT___","push","id","cssWithMappingToString","list","toString","map","item","content","needLayer","concat","length","join","i","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","dijkstra","single_source_shortest_paths","graph","s","d","predecessors","costs","closest","u","v","cost_of_s_to_u","adjacent_nodes","cost_of_s_to_u_plus_cost_of_e","cost_of_s_to_v","open","PriorityQueue","make","empty","pop","value","cost","hasOwnProperty","msg","Error","extract_shortest_path_from_predecessor_list","nodes","reverse","find_path","opts","key","T","t","queue","sorter","default_sorter","a","b","sort","shift","canPromise","QRCode","CanvasRenderer","SvgRenderer","renderCanvas","renderFunc","canvas","text","cb","args","slice","call","arguments","argsNum","isLastArgCb","getContext","Promise","resolve","reject","create","e","bind","render","renderToDataURL","_","prototype","then","getSymbolSize","getRowColCoords","version","posCount","Math","floor","size","intervals","ceil","positions","getPositions","coords","pos","posLength","j","Mode","ALPHA_NUM_CHARS","AlphanumericData","mode","ALPHANUMERIC","getBitsLength","getLength","write","bitBuffer","indexOf","put","BitBuffer","buffer","get","index","bufIndex","num","putBit","getLengthInBits","bit","BitMatrix","Uint8Array","reservedBit","set","row","col","reserved","xor","isReserved","ByteData","BYTE","TextEncoder","encode","l","ECLevel","EC_BLOCKS_TABLE","EC_CODEWORDS_TABLE","getBlocksCount","errorCorrectionLevel","L","M","Q","H","getTotalCodewordsCount","isValid","level","from","defaultValue","string","toLowerCase","fromString","Utils","G15_BCH","getBCHDigit","getEncodedBits","mask","EXP_TABLE","LOG_TABLE","x","log","n","exp","mul","y","KanjiData","KANJI","toSJIS","Patterns","PATTERN000","PATTERN001","PATTERN010","PATTERN011","PATTERN100","PATTERN101","PATTERN110","PATTERN111","PenaltyScores","getMaskAt","maskPattern","isNaN","parseInt","getPenaltyN1","points","sameCountCol","sameCountRow","lastCol","lastRow","getPenaltyN2","last","getPenaltyN3","bitsCol","bitsRow","getPenaltyN4","darkCount","modulesCount","abs","applyMask","pattern","getBestMask","setupFormatFunc","numPatterns","Object","keys","bestPattern","lowerPenalty","Infinity","p","penalty","VersionCheck","Regex","NUMERIC","ccBits","MIXED","getCharCountIndicator","getBestModeForData","dataStr","testNumeric","testAlphanumeric","testKanji","NumericData","group","substr","remainingNum","GF","p1","p2","coeff","mod","divident","divisor","result","offset","generateECPolynomial","degree","poly","AlignmentPattern","FinderPattern","MaskPattern","ECCode","ReedSolomonEncoder","Version","FormatInfo","Segments","setupFormatInfo","matrix","bits","createData","segments","forEach","dataTotalCodewordsBits","getSymbolTotalCodewords","remainingByte","totalCodewords","ecTotalCodewords","dataTotalCodewords","ecTotalBlocks","blocksInGroup2","blocksInGroup1","totalCodewordsInGroup1","dataCodewordsInGroup1","dataCodewordsInGroup2","ecCount","rs","dcData","Array","ecData","maxDataSize","dataSize","max","r","createCodewords","createSymbol","isArray","fromArray","estimatedVersion","rawSegments","rawSplit","getBestVersionForData","bestVersion","dataBits","moduleCount","c","setupFinderPattern","setupTimingPattern","setupAlignmentPattern","setupVersionInfo","inc","bitIndex","byteIndex","dark","setupData","options","toSJISFunc","setToSJISFunction","Polynomial","genPoly","initialize","paddedData","remainder","start","buff","numeric","kanji","replace","byte","RegExp","BYTE_KANJI","TEST_KANJI","TEST_NUMERIC","TEST_ALPHANUMERIC","str","test","getStringByteLength","getSegments","regex","exec","getSegmentsFromString","numSegs","alphaNumSegs","byteSegs","kanjiSegs","isKanjiModeEnabled","s1","s2","obj","getSegmentBitsLength","buildSingleSegment","modesHint","bestMode","array","reduce","acc","seg","segs","buildNodes","table","prevNodeIds","nodeGroup","currentNodeIds","node","lastCount","prevNodeId","end","buildGraph","path","optimizedSegs","curr","prevSeg","mergeSegments","toSJISFunction","CODEWORDS_COUNT","digit","f","G18_BCH","getReservedBitsCount","getTotalBitsFromDataArray","totalBits","reservedBits","getCapacity","usableBits","ecl","currentVersion","getBestVersionForMixedData","getBestVersionForDataLength","qrData","canvasEl","document","createElement","getCanvasElement","getOptions","getImageWidth","ctx","image","createImageData","qrToImageData","clearRect","width","height","style","clearCanvas","putImageData","type","rendererOpts","toDataURL","quality","getColorAttrib","color","attrib","alpha","hex","toFixed","svgCmd","cmd","qrcodesize","margin","bg","light","moveBy","newRow","lineLength","qrToPath","viewBox","svgTag","hex2rgba","hexCode","split","apply","hexValue","g","scale","getScale","qrSize","imgData","qr","symbolSize","scaledMargin","palette","posDst","pxColor","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","_i","_index","memo","insert","target","styleTarget","querySelector","window","HTMLIFrameElement","contentDocument","head","getTarget","appendChild","element","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","o","defineProperty","enumerable","globalThis","Function","prop","scriptUrl","importScripts","location","currentScript","tagName","toUpperCase","src","scripts","getElementsByTagName","nc","locals","trustedTypes","createPolicy","createHTML","h","random","createComment","Symbol","iterator","m","$","_$litType$","strings","values","E","for","A","C","WeakMap","P","createTreeWalker","V","N","lastIndex","startsWith","S","constructor","parts","el","currentNode","replaceWith","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","name","ctor","I","z","removeAttribute","textContent","emptyScript","append","innerHTML","_$Co","_$Cl","_$litDirective$","_$AO","_$AT","_$AS","R","_$AV","_$AN","_$AD","_$AM","_$AU","creationScope","importNode","nextSibling","Z","_$AI","_$Cv","_$AH","_$AA","_$AB","isConnected","startNode","endNode","_$AR","O","insertBefore","_$AC","_$AP","setConnected","fill","String","super","toggleAttribute","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","B","litHtmlPolyfillSupport","litHtmlVersions","D","renderBefore","_$litPart$","resumeHeadingText","skillsHeadingText","languagesHeadingText","projectsHeadingText","dialogSubmitLabelText","dialogCancelLabelText","deleteEntryButtonTitleText","ownerLoginRequiredDialogMessageText","saveContactUpdatesFailedPrefixText","saveHeadingUpdatesFailedPrefixText","saveSocialUpdatesFailedPrefixText","saveBioUpdatesFailedPrefixText","updaterUnsupportedStoreErrorMessageText","socialAccountsHeadingText","isNamedNodeLike","Boolean","uri","isStoreLike","any","normalizeEmail","trim","normalizeTelephone","isEmailValue","normalized","isPhoneValue","firstContactValue","store","subject","predicate","kind","candidates","each","isExpectedValue","direct","termType","doc","inDocStatements","statementsMatching","ns","vcard","anyGraphStatements","statement","viaValue","object","arg1","arg2","arg3","resolveQRCodeArgs","utils","label","escapeVCardValue","safeName","safeUrl","email","telephone","vCardLines","vCard","expandRdfList","visited","Set","inner","has","add","collectionElements","elements","flatMap","rdf","items","listNode","listValue","rest","birthdayIcon","locationIcon","checkMarkIcon","plusDarkIcon","plusIcon","searchIcon","trashIcon","bentoIcon","starIcon","addIcon","personInCircleIcon","globeIcon","lighteningIcon","commentIcon","envelopeIcon","pasteIcon","closeIcon","editIcon","deleteIcon","cameraIcon","twoDownArrowsIcon","baseUri","loadDocument","documentSource","documentName","documentURI","finalDocumentUri","sym","holds","parse","FALLBACK_ICON_URI","icons","iconBase","DEFAULT_ICON_URI","svgMarkup","OWL_DISJOINT_UNION_OF","STAR_ICON_REF","ICON_KEY_REF_PREFIX","SOCIAL_ONTOLOGY_URI","SOCIAL_CLASS_BASE","STAR_ICON_URI","cachedSocialOntologyStore","FALLBACK_SOCIAL_OPTIONS","classUri","icon","userProfilePrefix","homepage","ONTOLOGY_ICON_ASSETS","resolveBundledIconAsset","iconValue","marker","markerIndex","lastIndexOf","fileName","normalizeSocialOptionKey","findSocialAccountOption","rawValue","lowerValue","find","option","optionLabelKey","optionClassKey","ensureSocialOntologyLoaded","getSocialAccountOptions","ontologyStore","getSocialOntologyStore","classNodeMap","Map","unionNode","foaf","unionClassNodes","filter","classNode","subclassStatements","rdfs","classNodes","bundledIcon","resolveSocialIcon","seen","normalizedOptions","fallbackOption","nameForAccount","accountNode","accountName","classes","classLabel","iconForAccount","accountIcon","classIcon","homepageForAccount","accountHomepage","anyJS","presentSocial","accountAsObject","ac","entryNode","accountThings","accountNameSet","accounts","accountNameNode","dedupeKey","skillAsText","sk","directName","schema","publicId","solid","presentSkillDetails","publicIdUri","detail","IANA_LANGUAGE_BASE","normalizeText","isRdfListNode","normalizeLanguageCode","languageNameFromCode","code","DisplayNamesCtor","Intl","DisplayNames","localized","of","languageNameFromPublicId","publicIdValue","languageNameFromIanaNode","schemaName","english","lang","firstLiteral","englishOrAnyLiteralValue","localLabel","englishLabelForNode","toStoredPublicIdValue","lan","publicIdNode","languageAsText","nodeName","languageNameFromLanguageNode","presentLanguages","languageObjects","longestList","details","proficiency","anyValue","dedupedByLanguage","educationMembershipType","vcardOrganizationType","localNameFromUri","fragmentMatch","match","nodeToDisplayText","roleTypeFromMembership","membership","roleTypes","local","organizationTypeFromNode","organization","classification","org","classificationText","organizationTypes","getRoles","roles","deduped","memberships","isEducationMembership","orgHomePage","orgNameGiven","publicIdName","roleName","orgType","orgLocation","startDate","endDate","roleDescription","isCurrentRole","roleType","orgName","escoRole","roleText0","title","description","existing","existingIsNamed","nextIsNamed","termValue","term","resolvePointValueNode","expected","objectNode","presentContactInfo","emails","valueNode","selectEmails","phones","phoneNumbers","selectPhones","addresses","streetAddress","locality","region","postalCode","countryName","selectAddresses","getEducation","education","school","communityNodesForSubject","expandedNodes","hasCollectionElements","isListByTriples","linkedProjectNodeFromCommunityNode","candidatePredicates","linked","firstNamedNode","async","presentProjects","profileDoc","fetcher","load","communityNodes","docsToLoad","linkedProjectNode","projectDoc","all","docUrl","requested","previous","clearStaleRequestedState","ensureProjectDocumentsLoaded","projects","communityNode","url","URL","href","normalizeUrlKey","projectNode","toProjectNamedNode","imageUrl","widgets","findImage","findImageFromURI","types","category","categoryValue","project","resolvePointType","isWorkTypeTerm","selectPrimaryPoint","fallbackType","workCandidate","candidate","some","hasWorkType","formatLocation","presentProfile","nickname","dateOfBirth","imageSrc","jobTitle","primaryPhone","primaryEmail","primaryAddressEntryNode","primaryAddressType","primaryStreetAddress","primaryLocality","primaryRegion","primaryPostalCode","primaryCountryName","primaryAddress","address","pronouns","them","pronounsAsText","presentProfileViewModel","profileDetails","contactInfo","skills","languages","xIsCurrent","xEnd","yEnd","localeCompare","xStart","sortEducation","presentEducation","bioDetails","presentBio","social","cvDetails","sortedRoles","presentCV","modalDialog","previousFocus","ensureModalDialog","dom","body","contains","getDialogElements","dialog","headerAction","error","buttons","clearModalError","hidden","setModalError","message","focusInitialDialogTarget","initialInput","container","focusable","querySelectorAll","isDisabled","hasAttribute","hiddenByAttr","findInitialContentFocusTarget","focus","HTMLInputElement","HTMLTextAreaElement","select","firstButton","openModal","activeElement","showModal","openDialogElement","finish","close","closeDialogElement","oncancel","headerActionButton","onclick","closeModal","requestCancel","cancelBtn","click","event","preventDefault","resolvedHeaderAction","closeButton","actionButton","className","ariaLabel","onClick","btn","primary","classList","cancel","beforeClose","openInputDialog","submitLabel","cancelLabel","submitProxy","tabIndex","form","handleSubmit","saveButton","validate","validationMessage","onSave","fallback","formatSaveError","FormData","collectFormValues","finally","normalizeNodeId","applyUpdaterPatch","deletions","insertions","safeDeletions","why","safeInsertions","_uri","ok","collectNodeStatements","replacePredicateStatements","nextObject","st","collectLinkedNodeStatements","sourceNode","linkedNodes","linkedStatements","linkedNode","linkStatements","findExistingNode","normalizedEntryNode","lastIssuedTimestamp","createIdNode","now","Date","timestampId","buildPhoneStatements","phone","normalizedValue","inserts","buildEmailStatements","buildAddressStatements","processContactInfoMutations","mutationPlan","phoneOps","existingPhoneNodes","existingNode","matchingLinkStatement","mutatePhoneEntries","emailOps","existingEmailNodes","mutateEmailEntries","addressOps","existingAddressNodes","mutateAddressEntries","DEFAULT_DIAL_CODE","COUNTRY_DIAL_OPTIONS","iso2","dialCode","NON_USER_FACING_ISO2","normalizeDialCode","rawDialCode","COUNTRY_DIAL_OPTIONS_ASC","source","findIndex","codeA","Number","codeB","PREFERRED_ISO_BY_DIAL_CODE","COUNTRY_PREFIX_OPTIONS","preferredIso","DIAL_CODES_DESC","splitPhoneValue","raw","localNumber","matchedDialCode","normalizedDialCode","fallbackLocalNumber","combinePhoneValue","trimmed","toText","nested","toTypeLabel","hashParts","slashParts","sanitizeTextValue","hasNonEmptyText","normalizePhoneTypeForEdit","normalizePhoneTypeForContactInfoEdit","normalizeEmailTypeForEdit","normalizeEmailTypeForContactInfoEdit","deleteRow","rows","status","applyRowSelectChange","field","nextValue","summarizeRowOps","rowHasContent","applyRowFieldChange","hasContent","sanitizeEmailValue","sanitizePhoneLocalValue","sanitizeAddressFieldValue","sanitizeBasicInputFieldValue","phoneIcon","emailIcon","isContactPointRow","renderContactInfoPhoneSection","onAddRow","visiblePhones","unshift","focusSelector","displayIndex","onDelete","phoneRow","typeLabel","inputName","typeInputName","splitValue","selectedDialCode","nextType","renderContactPhoneInputRow","renderContactInfoEmailSection","visibleEmails","emailRow","renderContactEmailInputRow","renderContactInfoAddressSection","visibleAddresses","addressRow","streetAddressName","localityName","regionName","postalCodeName","handleAddressInput","renderContactAddressInputRow","renderContactInfoEditTemplate","formState","viewerMode","rerender","nextOptions","selector","nextField","scrollIntoView","block","behavior","focusContactInfoField","createContactInfoEditForm","toFormState","createContactInfoEditDialog","onSaved","currentTarget","ownerDocument","validateContactInfoBeforeSave","plan","descriptionResizeBound","toDateValue","date","scheduleDescriptionOverflowCheck","requestAnimationFrame","wrap","toggle","textEl","button","isOverflowing","scrollHeight","clientHeight","updateDescriptionOverflow","toggleDescription","stopPropagation","stopImmediatePropagation","descriptionId","getElementById","isExpanded","formatMonthYear","year","month","monthIndex","toMonthDateTime","toggleCollapsibleSection","section","panel","nextExpanded","normalizeContactValue","resolveContactValue","point","directValue","storedValue","renderPhones","phoneValue","phoneType","renderPhone","renderEmails","emailValue","emailType","renderEmail","renderAddresses","fullAddress","localityRegionPostal","renderAddress","renderOwnerEmptyContactInfoSection","renderContactInfoSection","safeContactInfo","hasAnyContactInfo","renderContactInfoSectionDefault","LANGUAGE_IANA_NS","buildLanguageStatements","languageRows","entryNodes","statements","rdfList","listNodes","blankNode","current","next","buildRdfListStatements","literal","statementKey","toNT","runUpdateWithDavFallback","sanitizePatchStatements","includes","isPatchFailure","updateDav","davError","isMissingGetRecordError","serialize","webOperation","currentStatements","deletionKeys","nextStatements","contentType","response","noMeta","runPutFallback","mutateLanguageEntries","languageOps","orderedRows","registerPrefix","setPrefixForURI","namespaces","anyStore","ensureLanguagePrefix","existingRows","nextRows","rowsFromOrderedInput","byEntryNode","delete","mergeLanguageOps","listObjects","existingListHeads","existingListNodes","listHead","collectListChainNodes","existingLanguageNodes","bnode","existingPublicIdNodes","sanitizeLanguageFieldValue","normalizeSuggestionKey","preferredBindingValue","binding","fetchLanguageSuggestions","queryTerm","fetch","params","URLSearchParams","query","format","headers","Accept","payload","json","bindings","results","subjectValue","buildLanguagePublicId","matchLanguageSuggestion","suggestions","exact","suggestion","normalizedKey","validateLanguagesBeforeSave","initialExistingOrder","ops","hasChanges","orderChanged","currentExistingOrder","hasOrderChanged","updateLanguagesSubmitEnabled","submitButton","disabled","hasInvalidLanguageSelection","renderLanguageSection","suggestionByIndex","onSearch","dragSourceIndex","dropTargetIndex","handleDragStart","handleDragOver","dataTransfer","dropEffect","handleDrop","to","reorderRows","handleDragEnd","visibleRows","onChange","onDragStart","onDragOver","onDrop","onDragEnd","isDropTarget","proficiencyLabel","languageName","proficiencyInputName","proficiencySelectId","datalistId","hasSelectionIssue","handleLanguageInput","matchedSuggestion","renderLanguageInputRow","renderLanguageEditTemplate","formStateWithSearch","searchSeqByIndex","searchTimerByIndex","clearTimeout","seq","setTimeout","focusLanguageField","createLanguageEditForm","addRow","createLanguageEditDialog","processLanguageMutations","renderLanguages","asList","language","renderLan","renderOwnerEmptyLanguagesSection","safeLanguages","hasLanguages","hasLanguageLinks","renderLanguagesSectionDefault","ESCO_SKILL_BASE_URI","SKILL_PREFIX_BASE_URI","collectSkillLinkStatementsByEntryValue","buildSkillsStatements","skill","suffix","normalizeSkillPublicIdUri","mutateSkillsEntries","skillOps","ensureSkillPrefix","existingSkillNodes","collectLinkedPublicIdStatements","skillNode","linkedPublicIdStatements","processSkillsMutations","normalizeSkillPublicId","sanitizeSkillFieldValue","fetchEscoSkillSuggestions","buildEscoSkillSearchUrl","_embedded","searchHit","preferredLabel","en","toSkillLabel","matchSkillSuggestion","updateSkillsSubmitEnabled","hasInvalidSkillSelection","renderSkillsSection","handleSearch","onSkillSearch","skillName","renderSkillInputRow","renderSkillsEditTemplate","rowIndex","focusSkillField","createSkillsEditForm","createSkillsEditDialog","validateSkillsBeforeSave","renderSkillsSectionDefault","hasSkills","strCase","charAt","substring","strToUpperCase","removeRow","renderSkillItem","renderOwnerEmptySkillsSection","asXsdDateLiteral","dateLike","dateOnly","xsd","buildOrganizationStatements","membershipNode","resumeData","organizationNode","organizationClassNode","prefixed","prefix","roleTypeNode","buildResumeStatements","includeMembershipLink","normalizedRoleType","todayIso","toISOString","startIso","endIso","membershipTypeForRole","startDateLiteral","endDateLiteral","processResumeMutations","resumeOps","existingResumeNodes","resume","linkedOrganizations","migratedNode","mutateResumeEntries","sanitizeResumeFieldValue","parseYearMonthFromDateText","dateText","isoYearMonth","fallbackYear","renderResumeSection","visibleResumeRows","resumeRow","experienceHeadingId","titleName","organizationName","organizationTypeName","organizationTypeSelectId","companyUrlName","orgLocationName","descriptionName","descriptionCounterId","descriptionMaxLength","descriptionCount","startMonthLabel","startMonthInputName","startMonthSelectId","startYearLabel","startYearInputName","startYearSelectId","startDateParts","startMonthValue","startYearText","endMonthLabel","endMonthInputName","endMonthSelectId","endDateText","endYearLabel","endYearInputName","endYearSelectId","endDateParts","endMonthValue","endYearParsedText","isCurrentRoleId","currentYear","getFullYear","baseYearOptions","yearOptions","monthOptions","renderMonthOptions","selectedMonth","emptyLabel","renderYearOptions","selectedYear","handleResumeInput","buildDateLiteral","nextStartDate","nextEndDate","checked","formRoot","endMonthSelect","endYearSelect","emptyOption","renderResumeInputRow","createResumeEditForm","role","preserveState","renderState","dialogScrollTop","scrollTop","descriptionScrollTop","activeId","activeName","captureResumeDialogRenderState","renderResumeEditTemplate","state","escapedId","CSS","escape","escapedName","nextActive","preventScroll","restoreResumeDialogRenderState","focusResumeField","createResumeEditDialog","validation","validateResumeBeforeSave","alertDialog","renderRoles","roleTitleId","rolePeriodId","roleOrgId","roleDescriptionId","ariaDescribedBy","renderRole","renderResumeSectionDefault","resumeDetails","hasResume","cv","cvData","renderOwnerEmptyResumeSection","renderOwnerEmptyResumeContent","toProjectUrlNode","normalizeProjectUrlKey","parsed","hash","processProjectsMutations","projectOps","existingLinks","existingByUrl","linkNode","removeLink","link","addLink","entryKey","urlKey","newLink","seenCreateUrlKeys","mutateProjectEntries","sanitizeProjectFieldValue","isValidProjectUrl","protocol","pathname","renderProjectInputRow","navigator","clipboard","readText","pasteWebIdIntoRow","renderProjectsEditTemplate","createProjectsEditForm","createProjectsEditDialog","dialogPromise","modalButtons","previousButtonsDisplay","display","toggleProjectsMobileList","toProjectRow","renderProject","normalizedCategory","categoryModifier","categoryLabel","altText","renderProjectImage","removePlan","renderOwnerEmptyProjectSection","projectData","projectDetails","renderOwnerEmptyProjectsContent","renderProjectSectionContent","renderProjectSectionDefault","hasProjects","hiddenProjectsCount","findOpWithExistingEntry","existingNodes","op","findCreateOp","mutateBasicProfileEntry","basicOps","replaceLiteralField","applyBasics","basic","clearAll","replacePhotoField","removeBasic","updateBasic","createBasic","selectedBasic","processHeadingMutations","removePhone","updatePhone","createPhone","mutatePhoneEntry","removeEmail","updateEmail","createEmail","mutateEmailEntry","removeAddress","updateAddress","createAddress","mutateAddressEntry","normalizeDmy","dmyMatch","day","toStorageDateISO","mimeMap","extMap","fromEntries","entries","extension","mime","filename","ext","retakeIcon","cameraCaptureControl","getImageDoc","doneCallback","div","destination","imageBlob","player","setButtonVisible","visible","main","textAlign","actionBar","cancelButton","_event","stopVideo","retakeButton","displayPlayer","shutterButton","canvasWidth","canvasHeight","controlStyle","context","drawImage","toBlob","blob","console","debug","sendButton","continueButton","mediaDevices","getUserMedia","constraints","stream","srcObject","catch","err","_resp","alert","saveBlob","video","facingMode","ideal","getVideoTracks","track","stop","isAddressRow","isProfileBasicRow","normalizePronounsValue","mapEmailOpsForSave","mapRow","mapPhoneOpsForSave","renderHeadingInfoInput","basicInfo","nameLabel","nicknameLabel","pronounsLabel","jobTitleLabel","orgNameLabel","handleBasicInfoInput","Image","headingPhotoRow","hostRow","nextElementSibling","frame","dataset","active","replaceChildren","docUri","lastSlash","directoryUri","randomSuffix","crypto","randomUUID","onCameraDone","imageDoc","control","fileInput","accept","file","files","uploadedUri","detectedContentType","subjectDirectoryUri","candidateUri","arrayBuffer","statusText","uploadPhotoFile","_e","renderContactPhoneInput","renderHeadingEditTemplate","renderContactAddressInput","createHeadingEditForm","profileData","autocomplete","normalizedEmailType","normalizedPhoneType","createHeadingEditDialog","originalPhotoUri","basicInfoOps","validateHeadingDataBeforeSave","nextPhotoUri","photoUri","deletePhotoFile","warn","renderHeadingSection","isOwner","dateOfBirthDisplay","emptyFallback","isoMatch","toDisplayDateDMY","session","Line","alt","mutateBioEntry","bioOps","bio","removeBio","updateBio","createBio","selectedBio","renderBioEditTemplate","bioRow","renderBioSection","createBioEditForm","bioData","createBioEditDialog","processBioMutations","BioCard","bioDescriptionId","renderBio","renderBioSectionDefault","renderBioSectionContent","renderOwnerEmptyBioSection","renderOwnerEmptyBioContent","hasBio","hasBioContent","SOCIAL_ONTOLOGY_NS","statementDebugValue","statementToDebugObject","toObjectNode","normalizeValue","buildSocialStatements","accountOption","normalizedName","homepageNode","iconNode","accountPrefix","profilePrefix","homepageValue","prefixValue","lowerPrefix","homepageUrl","prefixUrl","normalizeHost","homepageHost","hostname","prefixHost","prefixPath","homepagePath","toAccountNameFromHomepage","uniqueStatements","applySocialPatchWithFallback","mutateSocialEntries","socialOps","soc","ensureSocialPrefix","accountOptions","account","removeKeys","updateByKey","mergeSocialOps","accountObjects","existingAccountNodes","rowEntryNodes","optionForRow","debugFlag","__PROFILE_PANE_SOCIAL_DEBUG__","isSocialPatchDebugEnabled","deletionsCount","insertionsCount","sanitizeSocialFieldValue","isValidProfileUrl","validateSocialBeforeSave","renderSocialInputRow","homepageLabel","selected","selectedLabel","renderSocialAccountInputSelect","renderSocialSection","onRerender","renderSocialEditTemplate","rerenderOptions","socialOptions","socialAccounts","focusSocialField","createSocialEditForm","createSocialEditDialog","processSocialMutations","isRenderableAccount","expandSocialAccounts","socialCard","SocialData","hiddenAccountsCount","renderAccount","renderSocialSectionDefault","socialData","hasAccounts","renderSocialSectionContent","renderOwnerEmptySocialSection","renderSidebar","safeSocialData","renderSocialAccounts","safeSkills","renderQRCode","authn","currentUser","sameTerm","getViewerMode","viewModel","rolesByType","renderCVSection","renderProjectSection","Pane","global","findTypeURIs","renderWithData","QRCodeEles","getElementsByClassName","QRCodeElement","svg","imageContainer","otherProfiles","loadExtendedProfile"],"sourceRoot":""}
|