profile-pane 3.1.3 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/lib/FriendList.d.ts +0 -1
  2. package/lib/FriendList.d.ts.map +1 -1
  3. package/lib/FriendList.js +5 -33
  4. package/lib/SocialPresenter.js +1 -1
  5. package/lib/addMeToYourFriends.d.ts +4 -3
  6. package/lib/addMeToYourFriends.d.ts.map +1 -1
  7. package/lib/addMeToYourFriends.js +25 -9
  8. package/lib/editProfilePane/EditCVCard.d.ts.map +1 -1
  9. package/lib/editProfilePane/EditCVCard.js +2 -7
  10. package/lib/editProfilePane/EditCommunitiesCard.d.ts +3 -1
  11. package/lib/editProfilePane/EditCommunitiesCard.d.ts.map +1 -1
  12. package/lib/editProfilePane/EditCommunitiesCard.js +58 -23
  13. package/lib/editProfilePane/EditFriendsCard.d.ts +3 -1
  14. package/lib/editProfilePane/EditFriendsCard.d.ts.map +1 -1
  15. package/lib/editProfilePane/EditFriendsCard.js +58 -23
  16. package/lib/editProfilePane/EditOtherPreferences.js +1 -1
  17. package/lib/editProfilePane/EditProfileView.d.ts +1 -1
  18. package/lib/editProfilePane/EditProfileView.d.ts.map +1 -1
  19. package/lib/editProfilePane/EditProfileView.js +7 -3
  20. package/lib/editProfilePane/EditSocialCard.d.ts.map +1 -1
  21. package/lib/editProfilePane/EditSocialCard.js +2 -7
  22. package/lib/editProfilePane/editProfilePresenter.d.ts +4 -0
  23. package/lib/editProfilePane/editProfilePresenter.d.ts.map +1 -0
  24. package/lib/editProfilePane/editProfilePresenter.js +108 -0
  25. package/lib/profile-pane.js +1005 -340
  26. package/lib/profile-pane.js.map +1 -1
  27. package/lib/profile-pane.min.js +45 -46
  28. package/lib/profile-pane.min.js.map +1 -1
  29. package/lib/rdfFormsHelper.d.ts +1 -0
  30. package/lib/rdfFormsHelper.d.ts.map +1 -1
  31. package/lib/rdfFormsHelper.js +125 -0
  32. package/lib/styles/ProfileCard.css +6 -0
  33. package/lib/styles/ProfileView.css +3 -5
  34. package/lib/styles/editProfile.css +62 -0
  35. package/lib/styles/profileRDFFormsEnforced.css +427 -0
  36. package/lib/styles/utilities.css +30 -1
  37. package/lib/texts.d.ts +5 -5
  38. package/lib/texts.d.ts.map +1 -1
  39. package/lib/texts.js +5 -5
  40. package/package.json +9 -6
  41. package/lib/styles/rdfFormsEnforced.css +0 -186
@@ -222,6 +222,12 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileCard.css */
222
222
  min-width: 0;
223
223
  }
224
224
 
225
+ /* Ensure prompt inputs stretch to fit their container */
226
+ .add-friend-button-container input[type="text"] {
227
+ width: 100%;
228
+ box-sizing: border-box;
229
+ }
230
+
225
231
  .qrCodeSection {
226
232
  color: var(--color-text-secondary);
227
233
  font-size: 1em;
@@ -243,7 +249,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileCard.css */
243
249
  padding: 16px;
244
250
  background: white;
245
251
  }
246
- `, "",{"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;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.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":""}]);
252
+ `, "",{"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":""}]);
247
253
  // Exports
248
254
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
249
255
 
@@ -269,26 +275,24 @@ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBP
269
275
  ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileView.css */
270
276
  /* Uses utilities: .section-bg, .text-center */
271
277
 
272
- .profileSection {
273
-
274
- }
275
-
276
278
  /* Horizontal layout for cards */
277
279
  .profile-grid .profileSection {
278
280
  width: 100%;
279
281
  max-width: 100%;
282
+ min-width: 0;
280
283
  box-sizing: border-box;
281
284
  margin-bottom: var(--spacing-md);
282
285
  box-sizing: border-box;
283
286
  margin-bottom: var(--spacing-md);
287
+ overflow-wrap: anywhere;
284
288
  }
285
289
 
286
290
  @media (min-width: 900px) {
287
- .profileSection {
291
+ .profile-grid .profileSection {
288
292
  margin-bottom: 0;
289
293
  }
290
294
  }
291
- `, "",{"version":3,"sources":["webpack://./src/styles/ProfileView.css"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,8CAA8C;;AAE9C;;AAEA;;AAEA,gCAAgC;AAChC;EACE,WAAW;EACX,eAAe;EACf,sBAAsB;EACtB,gCAAgC;EAChC,sBAAsB;EACtB,gCAAgC;AAClC;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF","sourcesContent":["/* ProfileView.css */\n/* Uses utilities: .section-bg, .text-center */\n\n.profileSection {\n \n}\n\n/* Horizontal layout for cards */\n.profile-grid .profileSection {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin-bottom: var(--spacing-md);\n box-sizing: border-box;\n margin-bottom: var(--spacing-md);\n}\n\n@media (min-width: 900px) {\n .profileSection {\n margin-bottom: 0;\n }\n}\n"],"sourceRoot":""}]);
295
+ `, "",{"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":""}]);
292
296
  // Exports
293
297
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
294
298
 
@@ -471,7 +475,91 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* StuffCard.css */
471
475
 
472
476
  /***/ },
473
477
 
474
- /***/ 9053
478
+ /***/ 5179
479
+ (module, __webpack_exports__, __webpack_require__) {
480
+
481
+ "use strict";
482
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
483
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
484
+ /* harmony export */ });
485
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1354);
486
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
487
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6314);
488
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
489
+ // Imports
490
+
491
+
492
+ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
493
+ // Module
494
+ ___CSS_LOADER_EXPORT___.push([module.id, `.profile-grid .add-friend-button-container,
495
+ .profile-grid .add-community-button-container {
496
+ display: inline-flex;
497
+ align-items: center;
498
+ gap: var(--spacing-xxs);
499
+ flex-wrap: wrap;
500
+ justify-content: flex-start;
501
+ }
502
+
503
+ /* Ensure the button container can shrink properly in narrow layouts */
504
+ .profile-grid .add-community-button-container {
505
+ min-width: 0;
506
+ max-width: 100%;
507
+ }
508
+
509
+ /* Allow any direct children to shrink so no element forces overflow */
510
+ .profile-grid .add-community-button-container > * {
511
+ min-width: 0;
512
+ max-width: 100%;
513
+ }
514
+
515
+ .profile-grid table {
516
+ margin: 0 !important;
517
+ }
518
+
519
+ .profile-grid td {
520
+ padding: 0;
521
+ }
522
+
523
+ .profile-grid .add-friend-button-container .span,
524
+ .profile-grid .add-community-button-container .span {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ }
528
+
529
+ .profile-grid .add-friend-button-container > div,
530
+ .profile-grid .add-community-button-container > div {
531
+ flex-basis: 100%;
532
+ }
533
+
534
+ /* Prevent the add-community input from overflowing its flex container */
535
+ .profile-grid .add-community-button-container input {
536
+ min-width: 0;
537
+ max-width: 96%;
538
+ flex: 1 1 0;
539
+ word-break: break-word;
540
+ }
541
+
542
+ .profile-grid .profile-image {
543
+ width: var( --profile-image-size);
544
+ height: var( --profile-image-size);
545
+ margin: var(--spacing-xxxs);
546
+ border-radius: var(--spacing-lg);
547
+ }
548
+
549
+ .profile-grid .default-profile-image {
550
+ width: 140%;
551
+ height: 140%;
552
+ object-fit: cover;
553
+ margin-left: -0.6em;
554
+ border-radius: var(--spacing-lg);
555
+ }`, "",{"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":""}]);
556
+ // Exports
557
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
558
+
559
+
560
+ /***/ },
561
+
562
+ /***/ 6776
475
563
  (module, __webpack_exports__, __webpack_require__) {
476
564
 
477
565
  "use strict";
@@ -487,9 +575,66 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* StuffCard.css */
487
575
 
488
576
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
489
577
  // Module
490
- ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form sizing fixes scoped to Edit CV section */
578
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* Delete pop up*/
579
+ /* Make the Solid-UI delete confirmation popup appear near the last click position.
580
+ Keep the built-in Solid-UI styling (orange border, white background) so it looks like the original.
581
+ */
582
+ .profile-grid div[style*="position: relative"] > div[style*="display: grid"] {
583
+ /* only override positioning; keep styling (border/background/etc) from solid-ui */
584
+ position: absolute !important;
585
+ z-index: 9999 !important;
586
+ top: 0 !important;
587
+ right: 0 !important;
588
+ left: auto !important;
589
+ display: grid !important;
590
+ pointer-events: auto !important;
591
+ opacity: 1 !important;
592
+ visibility: visible !important;
593
+ padding: 0.7em !important;
594
+ min-width: 280px !important;
595
+ max-width: 90vw !important;
596
+ background: var(--color-background) !important;
597
+ border: 0.1em solid var(--color-primary) !important;
598
+ border-radius: var(--border-radius-base) !important;
599
+ box-shadow: 0 0.5em 0.9em rgba(0, 0, 0, 0.2) !important;
600
+ grid-template-columns: auto auto !important;
601
+ gap: 0.3em !important;
602
+ }
603
+
604
+ /* Ensure SVG icons and their buttons inside the Solid-UI delete popup have transparent backgrounds */
605
+ .profile-grid div[style*="position: relative"] > div[style*="display: grid"] img[src\$=".svg"],
606
+ .profile-grid div[style*="position: relative"] > div[style*="display: grid"] button {
607
+ background: transparent !important;
608
+ }
609
+
610
+ .profile-form .individualPane {
611
+ box-shadow: none !important;
612
+ }
613
+
614
+ .profile-form p {
615
+ padding: 0 !important;
616
+ }
617
+
618
+ .profile-form .mb-md {
619
+ margin-bottom: 0 !important;
620
+ }
621
+
622
+ .profile-form h2 {
623
+ margin-bottom: 1em !important;
624
+ }
625
+
626
+ .profile-form h3 {
627
+ color: var(--color-primary) !important;
628
+ padding: 0 !important;
629
+ font-size: 1em !important;
630
+ font-weight: 600 !important;
631
+ }
632
+
633
+ /* Shared form layout rules are imported from rdfFormsCommon.css */
634
+ /* Solid-UI form sizing fixes scoped to Edit CV section */
491
635
  .profile-form .hoverControl:not(:has(> img:first-child)) {
492
636
  border: 0.1em solid rgb(136, 136, 136) !important;
637
+ flex-direction: column !important;
493
638
  }
494
639
 
495
640
  .profile-form .hoverControl:has(> img:first-child) {
@@ -498,85 +643,164 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form sizing fixes scoped t
498
643
  margin: 0 !important;
499
644
  border-radius: 0 !important;
500
645
  padding: 0.7em !important;
646
+ min-height: var(--min-touch-target);
647
+ min-width: var(--min-touch-target);
501
648
  cursor: pointer;
502
649
  display: inline-flex;
503
650
  align-items: center;
504
651
  justify-content: center;
505
652
  }
506
653
 
507
- .profile-form .hoverControlHide {
654
+ /* Make sure the delete icon floats in the top-right corner of the full hoverControl wrapper */
655
+ .profile-form .hoverControl,
656
+ .profile-grid .hoverControl {
657
+ position: relative !important;
658
+ }
659
+
660
+ .hoverControl > img.hoverControlHide,
661
+ .hoverControl > [data-testid="deleteButtonWithCheck"] {
662
+ position: absolute !important;
663
+ top: 0.2em !important;
664
+ right: 0.2em !important;
508
665
  width: 1.5em !important;
509
666
  height: 1.5em !important;
510
- display: block;
511
- margin-top: 0 !important;
512
- margin-left: 0 !important;
513
- margin-right: 0 !important;
514
- margin-bottom: 0.3em !important;
667
+ align-items: center;
668
+ justify-content: center;
669
+ margin: 0 !important;
670
+ float: none !important;
671
+ transform: none !important;
515
672
  }
516
673
 
517
- .profile-form .hoverControl:has(> img:first-child) > span {
518
- display: inline-flex;
519
- align-items: center;
520
- margin-left: 0.3em;
674
+ /* When icon is 2nd or 3rd child (i.e. sibling elements exist), align it vertically to the previous item */
675
+ .hoverControl > img.hoverControlHide:nth-child(1),
676
+ .hoverControl > img.hoverControlHide:nth-child(2),
677
+ .hoverControl > [data-testid="deleteButtonWithCheck"]:nth-child(1),
678
+ .hoverControl > [data-testid="deleteButtonWithCheck"]:nth-child(2) {
679
+ top: 50% !important;
680
+ transform: translateY(-50%) !important;
681
+ display: inline-flex !important;
682
+ }
683
+
684
+ /* Show the delete icon only when the container is hovered */
685
+ .profile-grid .hoverControl:hover > img.hoverControlHide,
686
+ .profile-grid .hoverControl:hover > [data-testid="deleteButtonWithCheck"] {
687
+ display: inline-flex !important;
521
688
  }
522
689
 
523
- .profile-form div[style*="padding: 0.5em"]:has(> img) {
690
+ /* Also show the delete icon when the entire row is hovered */
691
+ .profile-grid .attachmentTable tr:hover .hoverControl > img.hoverControlHide,
692
+ .profile-grid .attachmentTable tr:hover .hoverControl > [data-testid="deleteButtonWithCheck"] {
693
+ display: inline-flex !important;
694
+ }
695
+
696
+ /* Make the hover-control cell easier to hit */
697
+ .profile-grid .hoverControl {
698
+ padding: 0.75em !important;
699
+ min-width: 2.5em !important;
700
+ min-height: 2.5em !important;
701
+ }
702
+
703
+ /* When the hoverControl only contains the hidden delete icon, keep it out of layout so it doesn't create empty space */
704
+ .profile-form .formFieldValue .hoverControl:has(> img.hoverControlHide) {
705
+ min-width: 0 !important;
706
+ min-height: 0 !important;
707
+ width: 0 !important;
708
+ height: 0 !important;
709
+ padding: 0 !important;
710
+ margin: 0 !important;
711
+ overflow: visible !important;
712
+ }
713
+
714
+ /* Hide delete icon only in autocomplete fields */
715
+ .profile-grid .formFieldValue:has(input[data-testid="autocomplete-input"]) [data-testid="delete-button"] {
716
+ display: none !important;
717
+ }
718
+
719
+ /* Keep autocomplete cancel button hidden when the user is not interacting.
720
+ This avoids the cancel button remaining visible when focus moves away. */
721
+ .profile-grid .formFieldValue:not(:focus-within) [data-testid="cancel-button"] {
722
+ display: none !important;
723
+ }
724
+
725
+ .profile-grid .hoverControl:has(> img:first-child) > span {
524
726
  display: inline-flex;
525
727
  align-items: center;
728
+ margin-left: 0.3em;
526
729
  }
527
730
 
528
- .profile-form div[style*="padding: 0.5em"]:has(> img) > span {
731
+ .profile-grid div[style*="padding: 0.5em"]:has(> img) > span {
529
732
  margin-left: 0.3em;
733
+ vertical-align: super !important;
530
734
  }
531
735
 
532
- .profile-form .hoverControl:has(> img:first-child):hover {
736
+ .profile-grid .hoverControl:has(> img:first-child):hover {
533
737
  background-color: transparent !important;
534
738
  }
535
739
 
536
- .profile-form button:has(> img[src\$=".svg"]) {
537
- background-color: transparent !important;
740
+ .profile-grid button:has(> img[src\$=".svg"]),
741
+ .profile-grid .formFieldValue input[type ="color"] {
742
+ background-color: var(--color-section-bg) !important;
538
743
  border: none !important;
539
744
  margin: 0 !important;
540
745
  border-radius: 0 !important;
746
+ box-shadow: none !important;
747
+ padding: 0.5em !important;
748
+ transition: background-color 0.2s ease, box-shadow 0.2s ease;
749
+ padding: 0 !important;
750
+ }
751
+
752
+ /* Specific icon button should have no extra padding */
753
+ .profile-grid button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_1369241.svg"]) {
754
+ padding: 0 !important;
541
755
  }
542
756
 
543
757
  .profile-form button {
758
+ min-height: var(--min-touch-target);
759
+ min-width: var(--min-touch-target);
760
+ }
544
761
 
762
+ .profile-form input:not([type="color"]) {
763
+ width: 99%;
764
+ margin-left: 0 !important;
765
+ margin-right: 0 !important;
545
766
  }
546
767
 
547
768
  .profile-form input:not([type="color"]),
548
769
  .profile-form textarea,
549
770
  .profile-form select {
550
- max-width: 100%;
771
+ max-width: 96%;
551
772
  min-width: 0;
552
773
  box-sizing: border-box ;
553
- background-color: #eef !important;
554
- border: .05em solid #88c
555
- }
556
-
557
- .profile-form input[type="url"] {
558
- width: 100%;
774
+ font: inherit;
775
+ color: var(--color-text);
776
+ background-color: var(--color-card-bg) !important;
777
+ border: 1px solid var(--color-border-pale);
559
778
  }
560
779
 
561
- .profile-form .formFieldValue {
562
- min-width: 0;
563
- margin-bottom: var(--spacing-sm);
780
+ .profile-form textarea {
781
+ border-color: var(--color-border-pale) !important;
564
782
  }
565
783
 
566
- .profile-form .formFieldValue table {
567
- margin: 0 !important;
568
- padding: 0 !important;
784
+ .profile-form input[type="date"],
785
+ .profile-form input[type="month"],
786
+ .profile-form input[type="week"],
787
+ .profile-form input[type="time"],
788
+ .profile-form input[type="datetime-local"] {
789
+ min-height: var(--min-touch-target);
569
790
  }
570
791
 
571
- .profile-form .formFieldValue td {
572
- padding: 0 !important;
792
+ .profile-form .hoverControl:has(> img:first-child):focus-visible,
793
+ .profile-form button:focus-visible,
794
+ .profile-form input:not([type="color"]):focus-visible,
795
+ .profile-form textarea:focus-visible,
796
+ .profile-form select:focus-visible {
797
+ outline: var(--focus-ring-width) solid var(--color-primary) !important;
798
+ outline-offset: 2px;
799
+ box-shadow: 0 0 0 1px var(--color-background);
573
800
  }
574
801
 
575
- .profile-form .formFieldValue input:not([type="color"]),
576
- .profile-form .formFieldValue textarea,
577
- .profile-form .formFieldValue select {
802
+ .profile-form input[type="url"] {
578
803
  width: 100%;
579
- max-width: 100%;
580
804
  }
581
805
 
582
806
  .profile-form select#formSelect {
@@ -587,11 +811,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form sizing fixes scoped t
587
811
  margin-right: 0 !important;
588
812
  }
589
813
 
590
- .profile-form span select {
591
- max-width: 96% !important;
592
- box-sizing: border-box;
593
- }
594
-
595
814
  /* Remove border/padding from the first wrapper div (and its first child wrapper). */
596
815
  .profile-form > div:first-of-type,
597
816
  .profile-form > div:first-of-type > div:first-of-type {
@@ -612,6 +831,54 @@ section[aria-labelledby="edit-profile-contact-heading"] .profile-form > div:firs
612
831
  }
613
832
 
614
833
  /* Align schema.org, solid terms, FOAF, vCard, and org field labels with their input values. */
834
+ .profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) {
835
+ display: flex;
836
+ }
837
+
838
+ /* for the Resume inside corporation choice */
839
+ /* Add space between classifierBox label and select box */
840
+ .profile-form .choiceBox .classifierBox-label {
841
+ /* Optional: ensure label doesn't have extra margin */
842
+ margin-right: 0;
843
+ padding-left: 0.3em;
844
+ }
845
+ .profile-form .choiceBox .choiceBox-selectBox select {
846
+ margin-left: 2.1em !important;
847
+ }
848
+
849
+ /* for the Resume orga details */
850
+ /* Add space between classifierBox label and select box */
851
+ .profile-form .classifierBox .classifierBox-label {
852
+ /* Match .formFieldName for alignment */
853
+ margin-right: 0;
854
+ padding-left: 0.3em;
855
+ width: 8em;
856
+ padding: 0.3em;
857
+ vertical-align: middle;
858
+ }
859
+ .profile-form .classifierBox .classifierBox-selectBox {
860
+ margin-left: 0 !important;
861
+ }
862
+
863
+ .profile-form .classifierBox .classifierBox-selectBox select {
864
+ margin-left: 0 !important;
865
+ }
866
+
867
+ /* for the social media */
868
+ /* Add space between classifierBox label and select box */
869
+ section[data-testid="edit-social-section"] .classifierBox-label {
870
+ /* Optional: ensure label doesn't have extra margin */
871
+ margin-right: 0;
872
+ padding-left: 0.3em;
873
+ }
874
+ section[data-testid="edit-social-section"] .classifierBox-selectBox select {
875
+ margin-left: 0.7em !important;
876
+ }
877
+
878
+ .profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue {
879
+ margin-bottom: 0;
880
+ }
881
+
615
882
  .profile-form :not(.choiceBox) > .formFieldName:has(a[href*="http://schema.org/"]),
616
883
  .profile-form :not(.choiceBox) > .formFieldName:has(a[href*="http://www.w3.org/ns/solid/terms#"]),
617
884
  .profile-form :not(.choiceBox) > .formFieldName:has(a[href*="http://xmlns.com/foaf/0.1/"]),
@@ -630,10 +897,20 @@ section[aria-labelledby="edit-profile-contact-heading"] .profile-form > div:firs
630
897
  display: inline-flex;
631
898
  align-items: center;
632
899
  vertical-align: middle;
900
+ flex: 1;
901
+ min-width: 0;
633
902
  }
634
903
 
635
- .profile-form textarea {
636
- width: 100%;
904
+ .profile-form textarea,
905
+ .profile-form .formFieldValue textarea {
906
+ appearance: none;
907
+ -webkit-appearance: none;
908
+ border: .05em solid #88c !important;
909
+ border-style: solid !important;
910
+ border-width: .05em !important;
911
+ border-color: #88c !important;
912
+ border-radius: 0.2em !important;
913
+ width: 99%;
637
914
  box-sizing: border-box;
638
915
  margin-top: var(--spacing-xs);
639
916
  margin-left: 0 !important;
@@ -651,29 +928,81 @@ section[aria-labelledby="edit-profile-contact-heading"] .profile-form > div:firs
651
928
  }
652
929
 
653
930
  .profile-form div[style*="display: flex"][style*="flex-direction: row"]:has(textarea) > div:has(> a) {
654
- padding-top: var(--spacing-xs);
931
+ padding-left: var(--spacing-xs);
932
+ padding-top: var(--spacing-sm);
655
933
  }
656
934
 
657
- .profile-form input:not([type="color"]) {
658
- width: 100%;
659
- margin-left: 0 !important;
660
- margin-right: 0 !important;
935
+
936
+ .profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid="autocomplete-input"]) > .formFieldName {
937
+ padding-top: 0.55em !important;
661
938
  }
662
939
 
663
- /* Remove padding from table cells within webidControl */
664
- .webidControl table td {
665
- padding: 0 !important;
940
+
941
+ .profile-form input:disabled,
942
+ .profile-form textarea:disabled,
943
+ .profile-form select:disabled,
944
+ .profile-form input[readonly],
945
+ .profile-form textarea[readonly],
946
+ .profile-form input:read-only,
947
+ .profile-form textarea:read-only {
948
+ background-color: var(--color-background) !important;
949
+ cursor: not-allowed;
950
+ opacity: 0.75;
951
+ border: 0.05em solid white !important;
952
+ }
953
+
954
+ .webidControl table td div.contactPane.namedPane {
955
+ border: none !important;
666
956
  }
667
957
 
668
- /* Remove padding from contactPane divs inside webidControl table cells */
669
- .webidControl table td div.contactPane.namedPane.fullWidth.individualPane {
958
+ /* Hide the edit icon used by solid-ui (noun_253504.svg and noun_1180158.svg) when it appears as an <img> */
959
+ img[src*="noun_253504.svg"],
960
+ img[src*="noun_1180158.svg"] {
961
+ display: none !important;
962
+ width: 0 !important;
963
+ height: 0 !important;
964
+ margin: 0 !important;
670
965
  padding: 0 !important;
671
966
  }
672
967
 
673
- .webidControl table td div.contactPane.namedPane {
968
+ /* Ensure the parent button for that icon doesn't add padding/margin or affect layout */
969
+ button:has(> img[src*="noun_253504.svg"]),
970
+ button:has(> img[src*="noun_1180158.svg"]) {
971
+ display: none !important;
972
+ padding: 0 !important;
973
+ margin: 0 !important;
674
974
  border: none !important;
975
+ background: none !important;
976
+ width: 0 !important;
977
+ height: 0 !important;
978
+ overflow: hidden !important;
979
+ }
980
+
981
+ /* Exceptions: allow these icons (and their buttons) when they're part of the add-friend or add-community flows. */
982
+ .profile-grid .profileSection .add-friend-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"],
983
+ .profile-grid .profileSection .add-community-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"],
984
+ .profile-grid .profileSection .add-friend-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"]),
985
+ .profile-grid .profileSection .add-community-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"]) {
986
+ display: inline-flex !important;
987
+ width: auto !important;
988
+ height: auto !important;
989
+ overflow: visible !important;
990
+ }
991
+
992
+
993
+ /* Exception: allow “Continue” buttons inside add-friend and add-community button containers. */
994
+ .profile-grid .profileSection .add-friend-button-container button:has(> img[title="Continue"]),
995
+ .profile-grid .profileSection .add-community-button-container button:has(> img[title="Continue"]),
996
+ .profile-grid .profileSection .add-friend-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"]),
997
+ .profile-grid .profileSection .add-community-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"]),
998
+ .profile-grid .profileSection .add-friend-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"],
999
+ .profile-grid .profileSection .add-community-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"] {
1000
+ display: inline-flex !important;
1001
+ width: 2em !important;
1002
+ height: 2em !important;
1003
+ overflow: visible !important;
675
1004
  }
676
- `, "",{"version":3,"sources":["webpack://./src/styles/rdfFormsEnforced.css"],"names":[],"mappings":"AAAA,yDAAyD;AACzD;EACE,iDAAiD;AACnD;;AAEA;EACE,wCAAwC;EACxC,uBAAuB;EACvB,oBAAoB;EACpB,2BAA2B;EAC3B,yBAAyB;EACzB,eAAe;EACf,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;AACzB;;AAEA;EACE,uBAAuB;EACvB,wBAAwB;EACxB,cAAc;EACd,wBAAwB;EACxB,yBAAyB;EACzB,0BAA0B;EAC1B,+BAA+B;AACjC;;AAEA;EACE,oBAAoB;EACpB,mBAAmB;EACnB,kBAAkB;AACpB;;AAEA;EACE,oBAAoB;EACpB,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,wCAAwC;AAC1C;;AAEA;EACE,wCAAwC;EACxC,uBAAuB;EACvB,oBAAoB;EACpB,2BAA2B;AAC7B;;AAEA;;AAEA;;AAEA;;;EAGE,eAAe;EACf,YAAY;EACZ,uBAAuB;EACvB,iCAAiC;EACjC;AACF;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,YAAY;EACZ,gCAAgC;AAClC;;AAEA;EACE,oBAAoB;EACpB,qBAAqB;AACvB;;AAEA;EACE,qBAAqB;AACvB;;AAEA;;;EAGE,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,WAAW;EACX,cAAc;EACd,sBAAsB;EACtB,yBAAyB;EACzB,0BAA0B;AAC5B;;AAEA;EACE,yBAAyB;EACzB,sBAAsB;AACxB;;AAEA,oFAAoF;AACpF;;EAEE,uBAAuB;EACvB,qBAAqB;AACvB;;AAEA,0FAA0F;AAC1F;EACE,uBAAuB;EACvB,qBAAqB;AACvB;;AAEA,sEAAsE;AACtE;EACE,uBAAuB;EACvB,qBAAqB;AACvB;;AAEA,8FAA8F;AAC9F;;;;;EAKE,oBAAoB;EACpB,mBAAmB;EACnB,sBAAsB;AACxB;;AAEA;;;;;EAKE,oBAAoB;EACpB,mBAAmB;EACnB,sBAAsB;AACxB;;AAEA;EACE,WAAW;EACX,sBAAsB;EACtB,6BAA6B;EAC7B,yBAAyB;EACzB,0BAA0B;AAC5B;;AAEA,gFAAgF;AAChF;EACE,8BAA8B;AAChC;;AAEA,mDAAmD;AACnD;EACE,uBAAuB;AACzB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,WAAW;EACX,yBAAyB;EACzB,0BAA0B;AAC5B;;AAEA,wDAAwD;AACxD;EACE,qBAAqB;AACvB;;AAEA,yEAAyE;AACzE;EACE,qBAAqB;AACvB;;AAEA;EACE,uBAAuB;AACzB","sourcesContent":["/* 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}\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 cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.profile-form .hoverControlHide {\n width: 1.5em !important;\n height: 1.5em !important;\n display: block;\n margin-top: 0 !important;\n margin-left: 0 !important;\n margin-right: 0 !important;\n margin-bottom: 0.3em !important;\n}\n\n.profile-form .hoverControl:has(> img:first-child) > span {\n display: inline-flex;\n align-items: center;\n margin-left: 0.3em;\n}\n\n.profile-form div[style*=\"padding: 0.5em\"]:has(> img) {\n display: inline-flex;\n align-items: center;\n}\n\n.profile-form div[style*=\"padding: 0.5em\"]:has(> img) > span {\n margin-left: 0.3em;\n}\n\n.profile-form .hoverControl:has(> img:first-child):hover {\n background-color: transparent !important;\n}\n\n.profile-form button:has(> img[src$=\".svg\"]) {\n background-color: transparent !important;\n border: none !important;\n margin: 0 !important;\n border-radius: 0 !important;\n}\n\n.profile-form button {\n\n}\n\n.profile-form input:not([type=\"color\"]),\n.profile-form textarea,\n.profile-form select {\n max-width: 100%;\n min-width: 0;\n box-sizing: border-box ;\n background-color: #eef !important;\n border: .05em solid #88c\n}\n\n.profile-form input[type=\"url\"] {\n width: 100%;\n}\n\n.profile-form .formFieldValue {\n min-width: 0;\n margin-bottom: var(--spacing-sm);\n}\n\n.profile-form .formFieldValue table {\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.profile-form .formFieldValue td {\n padding: 0 !important;\n}\n\n.profile-form .formFieldValue input:not([type=\"color\"]),\n.profile-form .formFieldValue textarea,\n.profile-form .formFieldValue select {\n width: 100%;\n max-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.profile-form span select {\n max-width: 96% !important;\n box-sizing: border-box;\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) > .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}\n\n.profile-form textarea {\n width: 100%;\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-top: var(--spacing-xs);\n}\n\n.profile-form input:not([type=\"color\"]) {\n width: 100%;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n/* Remove padding from table cells within webidControl */\n.webidControl table td {\n padding: 0 !important;\n}\n\n/* Remove padding from contactPane divs inside webidControl table cells */\n.webidControl table td div.contactPane.namedPane.fullWidth.individualPane {\n padding: 0 !important;\n}\n\n.webidControl table td div.contactPane.namedPane {\n border: none !important;\n}\n"],"sourceRoot":""}]);
1005
+ `, "",{"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.hoverControl > img.hoverControlHide,\n.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.hoverControl > img.hoverControlHide:nth-child(1),\n.hoverControl > img.hoverControlHide:nth-child(2),\n.hoverControl > [data-testid=\"deleteButtonWithCheck\"]:nth-child(1),\n.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 */\nsection[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}\nsection[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> */\nimg[src*=\"noun_253504.svg\"],\nimg[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 */\nbutton:has(> img[src*=\"noun_253504.svg\"]),\nbutton: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":""}]);
677
1006
  // Exports
678
1007
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
679
1008
 
@@ -698,6 +1027,27 @@ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBP
698
1027
  // Module
699
1028
  ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layout, spacing, and responsiveness */
700
1029
 
1030
+ :root {
1031
+ --profile-image-size: 3em;
1032
+ }
1033
+
1034
+ @media (max-width: 1000px) {
1035
+ .profile-grid,
1036
+ .profile-grid * {
1037
+ font-size: 2rem !important;
1038
+ }
1039
+
1040
+ .profile-grid .actionButton,
1041
+ .profile-grid .searchInput,
1042
+ .profile-grid .flatButton,
1043
+ .profile-grid .buttonSection button,
1044
+ .profile-grid .groupButtonsList button {
1045
+ min-height: calc(var(--min-touch-target) + 0.5em) !important;
1046
+ font-size: 2rem !important;
1047
+ padding: 1em 1em !important;
1048
+ }
1049
+ }
1050
+
701
1051
  .actionButton {
702
1052
  width: 100%;
703
1053
  min-width: 180px;
@@ -712,7 +1062,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layou
712
1062
 
713
1063
  .profile-grid {
714
1064
  display: grid;
715
- grid-template-columns: repeat(auto-fit, minmax(30em, 1fr));
1065
+ /* Allow the grid to shrink below 30em on small viewports to avoid overflow */
1066
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 30em), 1fr));
716
1067
  gap: var(--spacing-lg);
717
1068
  background: var(--color-background);
718
1069
  }
@@ -905,6 +1256,13 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layou
905
1256
  box-shadow: none;
906
1257
  }
907
1258
 
1259
+ /* Prevent labels from appearing focusable to keyboard users. */
1260
+ label:focus,
1261
+ label:focus-visible {
1262
+ outline: none !important;
1263
+ box-shadow: none !important;
1264
+ }
1265
+
908
1266
  /* Better focus for text elements */
909
1267
  .focusable-text:focus {
910
1268
  background-color: rgba(124, 77, 255, 0.1);
@@ -1025,7 +1383,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layou
1025
1383
  .btn-transparent:hover {
1026
1384
  background-color: transparent;
1027
1385
  }
1028
- `, "",{"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.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 grid-template-columns: repeat(auto-fit, minmax(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/* 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":""}]);
1386
+ `, "",{"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":""}]);
1029
1387
  // Exports
1030
1388
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
1031
1389
 
@@ -4835,12 +5193,12 @@ const logInToChatWithMeButtonText = 'Login to chat with me';
4835
5193
  const friendExistsAlreadyButtonText = 'Already part of friends';
4836
5194
  const chatWithMeButtonText = 'Chat with me';
4837
5195
  // Profile & Edit profile texts
4838
- const yourContactInformationHeading = 'Contact Information';
4839
- const otherPreferencesHeadingText = 'Other Preferences';
4840
- const communitiesHeadingText = 'Communities You Participate In';
5196
+ const yourContactInformationHeading = 'Your profile';
5197
+ const otherPreferencesHeadingText = 'Other preferences';
5198
+ const communitiesHeadingText = 'Your communities';
4841
5199
  const resumeHeadingText = 'Resume';
4842
- const socialAccountsHeadingText = 'Social Accounts';
4843
- const sharedItemsHeadingText = 'Shared Items';
5200
+ const socialAccountsHeadingText = 'Social accounts';
5201
+ const sharedItemsHeadingText = 'Shared items';
4844
5202
  const friendsHeadingText = 'Friends';
4845
5203
  const contactHeadingText = 'Contact';
4846
5204
 
@@ -4969,79 +5327,176 @@ const ChatWithMe_ChatWithMe = (subject, context) => {
4969
5327
  return b ` ${async_replace_h(chatContainer())} `;
4970
5328
  };
4971
5329
 
4972
- ;// ./src/FriendList.ts
5330
+ // EXTERNAL MODULE: external "rdflib"
5331
+ var external_rdflib_ = __webpack_require__(5491);
5332
+ ;// ./src/addMeToYourFriends.ts
4973
5333
 
4974
5334
 
4975
5335
 
4976
- const FriendList_FriendList = (subject, context) => {
4977
- var _a;
4978
- const friends = extractFriends(subject, context);
4979
- if (!friends || !((_a = friends.textContent) === null || _a === void 0 ? void 0 : _a.trim()))
4980
- return null;
4981
- return b `
4982
- <section
4983
- class="friendListSection"
4984
- role="region"
4985
- aria-labelledby="friends-section-title"
4986
- data-testid="friend-list"
4987
- >
4988
- <nav aria-label="Friend profiles">
4989
- <ul class="list-reset zebra-stripe" role="list">
4990
- ${friends}
4991
- </ul>
4992
- </nav>
4993
- </section>
4994
- `;
4995
- };
4996
- const extractFriends = (subject, { dom }) => {
4997
- const target = dom.createElement('div');
4998
- external_UI_.widgets.attachmentList(dom, subject, target, {
4999
- doc: subject.doc(),
5000
- modify: false,
5001
- predicate: external_UI_.ns.foaf('knows'),
5002
- noun: 'friend',
5003
- });
5004
- if (target.textContent === '')
5005
- return null;
5006
- // Add 'friendItem' class and unique aria-label to each <li> for accessibility
5007
- target.querySelectorAll('li').forEach((li, idx) => {
5008
- li.classList.add('friendItem');
5009
- // Try to find a link or text to use as a label
5010
- const link = li.querySelector('a');
5011
- if (link && link.textContent) {
5012
- li.setAttribute('aria-label', `Friend: ${link.textContent.trim()}`);
5013
- }
5014
- else if (li.textContent) {
5015
- li.setAttribute('aria-label', `Friend: ${li.textContent.trim()}`);
5016
- }
5017
- else {
5018
- li.setAttribute('aria-label', `Friend ${idx + 1}`);
5019
- }
5020
- });
5021
- return target;
5022
- };
5023
5336
 
5024
- // EXTERNAL MODULE: ./node_modules/validate-color/lib/index.js
5025
- var lib = __webpack_require__(6077);
5026
- ;// ./src/presenter.ts
5027
5337
 
5028
5338
 
5029
5339
 
5030
- function pronounsAsText(subject) {
5031
- let pronouns = external_SolidLogic_.store.anyJS(subject, external_UI_.ns.solid('preferredSubjectPronoun')) || '';
5032
- if (pronouns) {
5033
- const them = external_SolidLogic_.store.anyJS(subject, external_UI_.ns.solid('preferredObjectPronoun'));
5034
- if (them) {
5035
- pronouns += '/' + them;
5036
- const their = external_SolidLogic_.store.anyJS(subject, external_UI_.ns.solid('preferredRelativePronoun'));
5037
- if (their) {
5038
- pronouns += '/' + their;
5039
- }
5040
- }
5041
- pronouns = ' (' + pronouns + ') ';
5042
- }
5043
- return pronouns || '';
5044
- }
5340
+ let buttonContainer = document.createElement('section');
5341
+ const addMeToYourFriendsDiv = (subject, context) => {
5342
+ buttonContainer = context.dom.createElement('section');
5343
+ buttonContainer.setAttribute('class', 'buttonSubSection text-truncate text-center section-centered');
5344
+ buttonContainer.setAttribute('aria-labelledby', 'add-me-to-your-friends-button-section');
5345
+ buttonContainer.setAttribute('data-testid', 'button');
5346
+ // Add a visually hidden heading for accessibility
5347
+ const heading = context.dom.createElement('h3');
5348
+ heading.setAttribute('id', 'add-me-to-your-friends-button-section');
5349
+ heading.setAttribute('class', 'sr-only');
5350
+ heading.textContent = 'Add me to your friends actions';
5351
+ buttonContainer.appendChild(heading);
5352
+ const button = createAddMeToYourFriendsButton(subject, context);
5353
+ button.classList.add('actionButton', 'btn-primary', 'action-button-focus');
5354
+ buttonContainer.appendChild(button);
5355
+ return b `${buttonContainer}`;
5356
+ };
5357
+ const createAddMeToYourFriendsButton = (subject, context) => {
5358
+ const me = external_SolidLogic_.authn.currentUser();
5359
+ let label = addMeToYourFriends_checkIfAnyUserLoggedIn(me) ? addMeToYourFriendsButtonText.toUpperCase() : logInAddMeToYourFriendsButtonText.toUpperCase();
5360
+ const button = external_UI_.widgets.button(context.dom, undefined, label, setButtonHandler, //sets an onclick event listener
5361
+ {
5362
+ needsBorder: true,
5363
+ });
5364
+ function setButtonHandler(event) {
5365
+ event.preventDefault();
5366
+ saveNewThing(subject, context, external_UI_.ns.foaf('knows'))
5367
+ .then(() => {
5368
+ clearPreviousMessage(buttonContainer);
5369
+ mention(buttonContainer, friendWasAddedSuccesMessage);
5370
+ refreshButton();
5371
+ })
5372
+ .catch((error) => {
5373
+ clearPreviousMessage(buttonContainer);
5374
+ //else UI.widgets.complain(buttonContainer, message); //displays an error message at the top of the window
5375
+ complain(buttonContainer, context, error);
5376
+ });
5377
+ }
5378
+ button.refresh = refreshButton();
5379
+ function refreshButton() {
5380
+ const me = external_SolidLogic_.authn.currentUser();
5381
+ const store = context.session.store;
5382
+ if (addMeToYourFriends_checkIfAnyUserLoggedIn(me)) {
5383
+ checkIfThingExists(store, me, subject, external_UI_.ns.foaf('knows')).then((friendExists) => {
5384
+ if (friendExists) {
5385
+ //logged in and friend exists or friend was just added
5386
+ button.innerHTML = friendExistsAlreadyButtonText.toUpperCase();
5387
+ }
5388
+ else {
5389
+ //logged in and friend does not exist yet
5390
+ button.innerHTML = addMeToYourFriendsButtonText.toUpperCase();
5391
+ }
5392
+ });
5393
+ }
5394
+ else {
5395
+ //not logged in
5396
+ button.innerHTML = logInAddMeToYourFriendsButtonText.toUpperCase();
5397
+ }
5398
+ }
5399
+ return button;
5400
+ };
5401
+ async function saveNewThing(subject, context, predicate) {
5402
+ const me = external_SolidLogic_.authn.currentUser();
5403
+ const store = context.session.store;
5404
+ if (addMeToYourFriends_checkIfAnyUserLoggedIn(me)) {
5405
+ if (!(await checkIfThingExists(store, me, subject, predicate))) {
5406
+ //if friend does not exist, we add her/him
5407
+ await store.fetcher.load(me);
5408
+ const updater = store.updater;
5409
+ const toBeInserted = [(0,external_rdflib_.st)(me, predicate, subject, me.doc())];
5410
+ try {
5411
+ await updater.update([], toBeInserted);
5412
+ }
5413
+ catch (error) {
5414
+ let errorMessage = error;
5415
+ if (errorMessage.toString().includes('Unauthenticated'))
5416
+ errorMessage = userNotLoggedInErrorMessage;
5417
+ throw new Error(errorMessage);
5418
+ }
5419
+ }
5420
+ else
5421
+ throw new Error(friendExistsMessage);
5422
+ }
5423
+ else
5424
+ throw new Error(userNotLoggedInErrorMessage);
5425
+ }
5426
+ function addMeToYourFriends_checkIfAnyUserLoggedIn(me) {
5427
+ if (me)
5428
+ return true;
5429
+ else
5430
+ return false;
5431
+ }
5432
+ async function checkIfThingExists(store, me, subject, predicate) {
5433
+ await store.fetcher.load(me);
5434
+ if (store.whether(me, predicate, subject, me.doc()) === 0)
5435
+ return false;
5436
+ else
5437
+ return true;
5438
+ }
5439
+ function extractFriends(editable, subject, { dom }) {
5440
+ const target = dom.createElement('div');
5441
+ console.log('Extracting friends for subject:', subject.doc()); // Debug log to check the subject
5442
+ external_UI_.widgets.attachmentList(dom, subject, target, {
5443
+ doc: subject.doc(),
5444
+ modify: editable,
5445
+ predicate: external_UI_.ns.foaf('knows'),
5446
+ noun: 'friend',
5447
+ });
5448
+ if (target.textContent === '')
5449
+ return null;
5450
+ console.log('Extracted friends:', target.innerHTML); // Debug log to check the generated HTML
5451
+ return target;
5452
+ }
5453
+
5454
+
5455
+ ;// ./src/FriendList.ts
5456
+
5457
+
5458
+
5459
+ const FriendList_FriendList = (subject, context) => {
5460
+ var _a;
5461
+ const friends = extractFriends(false, subject, context);
5462
+ if (!friends || !((_a = friends.textContent) === null || _a === void 0 ? void 0 : _a.trim()))
5463
+ return null;
5464
+ return b `
5465
+ <section
5466
+ class="friendListSection"
5467
+ data-testid="friend-list"
5468
+ >
5469
+ <h2 id="friends-section-title" class="sr-only">Friends</h2>
5470
+ <nav aria-label="Friend profiles">
5471
+ <ul class="list-reset zebra-stripe" role="list">
5472
+ ${friends}
5473
+ </ul>
5474
+ </nav>
5475
+ </section>
5476
+ `;
5477
+ };
5478
+
5479
+ // EXTERNAL MODULE: ./node_modules/validate-color/lib/index.js
5480
+ var lib = __webpack_require__(6077);
5481
+ ;// ./src/presenter.ts
5482
+
5483
+
5484
+
5485
+ function pronounsAsText(subject) {
5486
+ let pronouns = external_SolidLogic_.store.anyJS(subject, external_UI_.ns.solid('preferredSubjectPronoun')) || '';
5487
+ if (pronouns) {
5488
+ const them = external_SolidLogic_.store.anyJS(subject, external_UI_.ns.solid('preferredObjectPronoun'));
5489
+ if (them) {
5490
+ pronouns += '/' + them;
5491
+ const their = external_SolidLogic_.store.anyJS(subject, external_UI_.ns.solid('preferredRelativePronoun'));
5492
+ if (their) {
5493
+ pronouns += '/' + their;
5494
+ }
5495
+ }
5496
+ pronouns = ' (' + pronouns + ') ';
5497
+ }
5498
+ return pronouns || '';
5499
+ }
5045
5500
  const presentProfile = (subject, store) => {
5046
5501
  const name = external_UI_.utils.label(subject);
5047
5502
  const imageSrc = external_UI_.widgets.findImage(subject);
@@ -5087,8 +5542,6 @@ function validColorOrDefault(color, fallback) {
5087
5542
  return color && (0,lib.validateHTMLColorHex)(color) ? color : fallback;
5088
5543
  }
5089
5544
 
5090
- // EXTERNAL MODULE: external "rdflib"
5091
- var external_rdflib_ = __webpack_require__(5491);
5092
5545
  ;// ./src/CVPresenter.ts
5093
5546
 
5094
5547
 
@@ -5204,7 +5657,7 @@ function presentCV(subject, store) {
5204
5657
  }
5205
5658
 
5206
5659
  ;// ./src/ontology/socialMedia.ttl
5207
- const socialMedia_namespaceObject = "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix org: <http://www.w3.org/ns/org#>.\n@prefix : <#>.\n\n########### ATTENTION - we cannot rename this ontology file name without migrating existing data on existing accounts\n\n########### Social Media - other accounts\n#\n# Twitter, linked In, Orkid, Mastodon, Matrix, Bluesky, Instagram, Facebook, Github,\n# Snapchat, TikTok, etc\n\n:this\n <http://purl.org/dc/elements/1.1/title> \"Social media form\" ;\n a ui:Form ;\n ui:parts (\n :SocialsForm\n ).\n\n:SocialsForm a ui:Multiple;\n ui:label \"online account\";\n ui:property foaf:account; # the triple is created with the foaf:acccounts predicate\n ui:ordered true; # Allow user to order occounts most important first.\n ui:part :AccountsForm.\n\n:AccountsForm a ui:Group; \n ui:weight 1; \n ui:parts ( \n :AccountField \n :AccountIdField ).\n\n:AccountField a ui:Classifier; \n ui:label \"Choose account\"@en;\n ui:multiple false ; \n ui:category foaf:Account. # the accounts are described by the foaf:Account predicate\n\n# this is what is needed to make a dropdown box\nfoaf:Account a rdfs:Class;\n rdfs:label \"Online Account Provider\";\n owl:disjointUnionOf ( \n :BlueSkyAccount :DiggAccount :FacebookAccount :GithubAccount :InstagramAccount\n :LinkedInAccount :MastodonAccount :MatrixAccount :MediumAccount :NostrAccount \n :OrcidAccount :PinterestAccount :RedditAccount :SnapchatAccount :StravaAccount \n :TiktokAccount :TumblrAccount :TwitterAccount :OtherAccount) .\n\n:AccountIdField a ui:Options; \n ui:dependingOn rdf:type; \n ui:case\n [ ui:for :BlueSkyAccount; ui:use :BlueSkyIdField ],\n [ ui:for :DiggAccount; ui:use :DiggIdField],\n [ ui:for :FacebookAccount; ui:use :FacebookIdField ],\n [ ui:for :GithubAccount; ui:use :GithubIdField ],\n [ ui:for :InstagramAccount; ui:use :InstagramIdField ],\n [ ui:for :LinkedInAccount; ui:use :LinkedInIdField ],\n [ ui:for :MastodonAccount; ui:use :MastodonIdField ],\n [ ui:for :MatrixAccount; ui:use :MatrixIdField ],\n [ ui:for :MediumAccount; ui:use :MediumIdField ],\n [ ui:for :NostrAccount; ui:use :NostrIdField ],\n [ ui:for :OrcidAccount; ui:use :OrcidIdField ],\n [ ui:for :PinterestAccount; ui:use :PinterestIdField ],\n [ ui:for :RedditAccount; ui:use :RedditIdField ],\n [ ui:for :StravaAccount; ui:use :StravaIdField ],\n [ ui:for :SnapchatAccount; ui:use :SnapchatIdField ],\n [ ui:for :TiktokAccount; ui:use :TiktokIdField ],\n [ ui:for :TumblrAccount; ui:use :TumblrIdField ],\n [ ui:for :TwitterAccount; ui:use :TwitterIdField ],\n [ ui:for :OtherAccount; ui:use :OtherIdForm ] .\n\n:BlueSkyAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Bluesky\";\n foaf:userProfilePrefix \"https://bsky.app/profile/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/bluesky-1.svg>;\n foaf:homepage <https://bsky.app/> .\n\n:DiggAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Digg\";\n foaf:userProfilePrefix \"https://www.digg.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/digg-icon.svg>;\n foaf:homepage <https://www.digg.com/> .\n\n:FacebookAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Facebook\";\n foaf:userProfilePrefix \"https://www.facebook.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/facebook-2020-2-1.svg>;\n foaf:homepage <https://www.facebook.com/> .\n\n:GithubAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Github\";\n foaf:userProfilePrefix \"https://www.github.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/github-icon.svg>;\n foaf:homepage <https://github.com/> .\n\n:InstagramAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Instagram\";\n foaf:userProfilePrefix \"https://www.instagram.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/instagram-2016-5.svg>;\n foaf:homepage <https://www.instagram.com/> .\n\n:LinkedInAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"LinkedIn\";\n foaf:userProfilePrefix \"https://www.linkedin.com/in/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/linkedin-icon.svg>;\n foaf:homepage <https://linkedin.com/> .\n\n:MastodonAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Mastodon\" ;\n foaf:userProfilePrefix \"https://mastodon.social/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/mastodon-2.svg>;\n foaf:homepage <https://joinmastodon.org/> .\n\n:MatrixAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Matrix\" ;\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/matrix-logo-black.svg> ;\n foaf:userProfilePrefix \"https://matrix.to/#/\" ;\n foaf:homepage <https://matrix.org/> .\n\n:MediumAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Medium\";\n foaf:userProfilePrefix \"https://medium.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/medium-logo-wordmark-black.svg>;\n foaf:homepage <https://medium.com/> .\n\n:NostrAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Nostr\";\n foaf:userProfilePrefix \"https://primal.net/p/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/nostr-icon-purple-on-white.svg>;\n foaf:homepage <https://nostr.net/> .\n\n:OrcidAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"ORCiD\";\n foaf:userProfilePrefix \"https://orcid.org/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/ORCID-1.svg>;\n foaf:homepage <https://orcid.org/> .\n\n:PinterestAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Pinterest\";\n foaf:userProfilePrefix \"https://pin.it/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/pinterest-2-1.svg>;\n foaf:homepage <https://pinterest.com/> .\n\n:RedditAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Reddit\";\n foaf:userProfilePrefix \"https://www.reddit.com/user/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/reddit-4.svg>;\n foaf:homepage <https://reddit.com/> .\n\n:SnapchatAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Snapchat\";\n foaf:userProfilePrefix \"https://www.snapchat.com/add/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/snapchat-1.svg>;\n foaf:homepage <https://www.snapchat.com/> .\n\n:StravaAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Strava\";\n foaf:userProfilePrefix \"https://www.strava.com/athletes/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/strava-2.svg>;\n foaf:homepage <https://strava.com/> .\n\n:TiktokAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"TikTok\";\n foaf:userProfilePrefix \"https://www.tiktok.com/@\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/tiktok-icon-2.svg>;\n foaf:homepage <https://www.tiktok.com/> .\n\n:TumblrAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Tumblr\";\n foaf:userProfilePrefix \"https://www.tumblr.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/tumblr-icon.svg>;\n foaf:homepage <https://www.tumblr.com/> .\n\n:TwitterAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"X\";\n foaf:userProfilePrefix \"https://x.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/x-2.svg>;\n foaf:homepage <https://x.com/> .\n\n:OtherAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Other\" ;\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/noun_1689339.svg> .\n\n:BlueSkyIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-](.[a-z0-9A-Z_-])*\".\n\n:DiggIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-](.[a-z0-9A-Z_-])*\".\n\n:FacebookIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:GithubIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:InstagramIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:LinkedInIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:MastodonIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:MatrixIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:MediumIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:NostrIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:OrcidIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:PinterestIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:RedditIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:StravaIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:SnapchatIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n:TiktokIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n:TumblrIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n:TwitterIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n# an unknown online account needs more info\n\n:OtherIdForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :OtherIdField \n :OtherIconField \n :OtherLabelField ).\n\n:OtherIdField\n a ui:NamedNodeURIField ;\n ui:label \"Account link\";\n ui:maxLength \"200\" ;\n ui:property foaf:homepage.\n\n:OtherIconField\n a ui:NamedNodeURIField ;\n ui:label \"Icon link\";\n ui:maxLength \"200\" ;\n ui:property foaf:icon.\n\n:OtherLabelField\n a ui:SingleLineTextField ;\n ui:label \"Name\";\n ui:maxLength \"200\" ;\n ui:property rdfs:label.\n\n# ends\n";
5660
+ const socialMedia_namespaceObject = "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix org: <http://www.w3.org/ns/org#>.\n@prefix : <#>.\n\n########### ATTENTION - we cannot rename this ontology file name without migrating existing data on existing accounts\n\n########### Social Media - other accounts\n#\n# Twitter, linked In, Orkid, Mastodon, Matrix, Bluesky, Instagram, Facebook, Github,\n# Snapchat, TikTok, etc\n\n:this\n <http://purl.org/dc/elements/1.1/title> \"Social media form\" ;\n a ui:Form ;\n ui:parts (\n :SocialsForm\n ).\n\n:SocialsForm a ui:Multiple;\n ui:label \"online account\";\n ui:property foaf:account; # the triple is created with the foaf:acccounts predicate\n ui:ordered true; # Allow user to order occounts most important first.\n ui:part :AccountsForm.\n\n:AccountsForm a ui:Group; \n ui:weight 1; \n ui:parts ( \n :AccountField \n :AccountIdField ).\n\n:AccountField a ui:Classifier; \n ui:label \"Account\"@en;\n ui:multiple false ; \n ui:category foaf:Account. # the accounts are described by the foaf:Account predicate\n\n# this is what is needed to make a dropdown box\nfoaf:Account a rdfs:Class;\n rdfs:label \"Online Account Provider\";\n owl:disjointUnionOf ( \n :BlueSkyAccount :DiggAccount :FacebookAccount :GithubAccount :InstagramAccount\n :LinkedInAccount :MastodonAccount :MatrixAccount :MediumAccount :NostrAccount \n :OrcidAccount :PinterestAccount :RedditAccount :SnapchatAccount :StravaAccount \n :TiktokAccount :TumblrAccount :TwitterAccount :OtherAccount) .\n\n:AccountIdField a ui:Options; \n ui:dependingOn rdf:type; \n ui:case\n [ ui:for :BlueSkyAccount; ui:use :BlueSkyIdField ],\n [ ui:for :DiggAccount; ui:use :DiggIdField],\n [ ui:for :FacebookAccount; ui:use :FacebookIdField ],\n [ ui:for :GithubAccount; ui:use :GithubIdField ],\n [ ui:for :InstagramAccount; ui:use :InstagramIdField ],\n [ ui:for :LinkedInAccount; ui:use :LinkedInIdField ],\n [ ui:for :MastodonAccount; ui:use :MastodonIdField ],\n [ ui:for :MatrixAccount; ui:use :MatrixIdField ],\n [ ui:for :MediumAccount; ui:use :MediumIdField ],\n [ ui:for :NostrAccount; ui:use :NostrIdField ],\n [ ui:for :OrcidAccount; ui:use :OrcidIdField ],\n [ ui:for :PinterestAccount; ui:use :PinterestIdField ],\n [ ui:for :RedditAccount; ui:use :RedditIdField ],\n [ ui:for :StravaAccount; ui:use :StravaIdField ],\n [ ui:for :SnapchatAccount; ui:use :SnapchatIdField ],\n [ ui:for :TiktokAccount; ui:use :TiktokIdField ],\n [ ui:for :TumblrAccount; ui:use :TumblrIdField ],\n [ ui:for :TwitterAccount; ui:use :TwitterIdField ],\n [ ui:for :OtherAccount; ui:use :OtherIdForm ] .\n\n:BlueSkyAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Bluesky\";\n foaf:userProfilePrefix \"https://bsky.app/profile/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/bluesky-1.svg>;\n foaf:homepage <https://bsky.app/> .\n\n:DiggAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Digg\";\n foaf:userProfilePrefix \"https://www.digg.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/digg-icon.svg>;\n foaf:homepage <https://www.digg.com/> .\n\n:FacebookAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Facebook\";\n foaf:userProfilePrefix \"https://www.facebook.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/facebook-2020-2-1.svg>;\n foaf:homepage <https://www.facebook.com/> .\n\n:GithubAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Github\";\n foaf:userProfilePrefix \"https://www.github.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/github-icon.svg>;\n foaf:homepage <https://github.com/> .\n\n:InstagramAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Instagram\";\n foaf:userProfilePrefix \"https://www.instagram.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/instagram-2016-5.svg>;\n foaf:homepage <https://www.instagram.com/> .\n\n:LinkedInAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"LinkedIn\";\n foaf:userProfilePrefix \"https://www.linkedin.com/in/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/linkedin-icon.svg>;\n foaf:homepage <https://linkedin.com/> .\n\n:MastodonAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Mastodon\" ;\n foaf:userProfilePrefix \"https://mastodon.social/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/mastodon-2.svg>;\n foaf:homepage <https://joinmastodon.org/> .\n\n:MatrixAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Matrix\" ;\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/matrix-logo-black.svg> ;\n foaf:userProfilePrefix \"https://matrix.to/#/\" ;\n foaf:homepage <https://matrix.org/> .\n\n:MediumAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Medium\";\n foaf:userProfilePrefix \"https://medium.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/medium-logo-wordmark-black.svg>;\n foaf:homepage <https://medium.com/> .\n\n:NostrAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Nostr\";\n foaf:userProfilePrefix \"https://primal.net/p/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/nostr-icon-purple-on-white.svg>;\n foaf:homepage <https://nostr.net/> .\n\n:OrcidAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"ORCiD\";\n foaf:userProfilePrefix \"https://orcid.org/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/ORCID-1.svg>;\n foaf:homepage <https://orcid.org/> .\n\n:PinterestAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Pinterest\";\n foaf:userProfilePrefix \"https://pin.it/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/pinterest-2-1.svg>;\n foaf:homepage <https://pinterest.com/> .\n\n:RedditAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Reddit\";\n foaf:userProfilePrefix \"https://www.reddit.com/user/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/reddit-4.svg>;\n foaf:homepage <https://reddit.com/> .\n\n:SnapchatAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Snapchat\";\n foaf:userProfilePrefix \"https://www.snapchat.com/add/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/snapchat-1.svg>;\n foaf:homepage <https://www.snapchat.com/> .\n\n:StravaAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Strava\";\n foaf:userProfilePrefix \"https://www.strava.com/athletes/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/strava-2.svg>;\n foaf:homepage <https://strava.com/> .\n\n:TiktokAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"TikTok\";\n foaf:userProfilePrefix \"https://www.tiktok.com/@\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/tiktok-icon-2.svg>;\n foaf:homepage <https://www.tiktok.com/> .\n\n:TumblrAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Tumblr\";\n foaf:userProfilePrefix \"https://www.tumblr.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/tumblr-icon.svg>;\n foaf:homepage <https://www.tumblr.com/> .\n\n:TwitterAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"X\";\n foaf:userProfilePrefix \"https://x.com/\";\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/social/x-2.svg>;\n foaf:homepage <https://x.com/> .\n\n:OtherAccount rdfs:subClassOf foaf:Account ;\n rdfs:label \"Other\" ;\n foaf:icon <https://solidos.github.io/solid-ui/src/icons/noun_1689339.svg> .\n\n:BlueSkyIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-](.[a-z0-9A-Z_-])*\".\n\n:DiggIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-](.[a-z0-9A-Z_-])*\".\n\n:FacebookIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:GithubIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:InstagramIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:LinkedInIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:MastodonIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:MatrixIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:MediumIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:NostrIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*(.[a-z0-9A-Z_-])*\".\n\n:OrcidIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:PinterestIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:RedditIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:StravaIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"[a-z0-9A-Z_-]*\".\n\n:SnapchatIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n:TiktokIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n:TumblrIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n:TwitterIdField\n a ui:SingleLineTextField ;\n ui:label \"Username\";\n ui:maxLength \"200\" ;\n ui:property foaf:accountName ; \n ui:pattern \"@[a-z0-9A-Z_-]*\".\n\n# an unknown online account needs more info\n\n:OtherIdForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :OtherIdField \n :OtherIconField \n :OtherLabelField ).\n\n:OtherIdField\n a ui:NamedNodeURIField ;\n ui:label \"Account link\";\n ui:maxLength \"200\" ;\n ui:property foaf:homepage.\n\n:OtherIconField\n a ui:NamedNodeURIField ;\n ui:label \"Icon link\";\n ui:maxLength \"200\" ;\n ui:property foaf:icon.\n\n:OtherLabelField\n a ui:SingleLineTextField ;\n ui:label \"Name\";\n ui:maxLength \"200\" ;\n ui:property rdfs:label.\n\n# ends\n";
5208
5661
  ;// ./src/rdfFormsHelper.ts
5209
5662
 
5210
5663
 
@@ -5222,7 +5675,101 @@ store, dom, editableProfile, whichForm) {
5222
5675
  if (!ok)
5223
5676
  external_UI_.widgets.errorMessageBlock(dom, mes);
5224
5677
  });
5678
+ // Ensure that when a user clicks “Add skill” or “Add language”, the newly
5679
+ // created input receives focus. Solid-UI provides only a generic "Add" button.
5680
+ // We detect the "add" control by the plus icon it uses and focus the last
5681
+ // text input in the surrounding multiple-field container.
5682
+ enableFocusOnAdd(div);
5683
+ // Track the last click/tap position so popups (like solid-ui delete confirmations)
5684
+ // can be positioned closer to where the user clicked.
5685
+ let lastClick = { x: 0, y: 0 };
5686
+ div.addEventListener('pointerdown', (event) => {
5687
+ lastClick = { x: event.clientX, y: event.clientY };
5688
+ }, { capture: true });
5689
+ // Solid-UI injects a popup DIV (position:absolute, top:-1em) under a relative container.
5690
+ // Detect it and reposition it using last click coordinates.
5691
+ const repositionPopup = (popup) => {
5692
+ const win = dom.defaultView || window;
5693
+ const padding = 10;
5694
+ const maxWidth = win.innerWidth - padding;
5695
+ const maxHeight = win.innerHeight - padding;
5696
+ // Force fixed positioning, then clamp to viewport so it doesn't get cut off.
5697
+ popup.style.position = 'fixed';
5698
+ popup.style.zIndex = '9999';
5699
+ popup.style.pointerEvents = 'auto';
5700
+ popup.style.opacity = '1';
5701
+ popup.style.visibility = 'visible';
5702
+ // Use getBoundingClientRect after it is in DOM; if it is 0x0, fall back to default offset.
5703
+ const rect = popup.getBoundingClientRect();
5704
+ const popupWidth = rect.width || 200;
5705
+ const popupHeight = rect.height || 100;
5706
+ const left = Math.min(Math.max(lastClick.x + padding, padding), maxWidth - popupWidth);
5707
+ const top = Math.min(Math.max(lastClick.y + padding, padding), maxHeight - popupHeight);
5708
+ popup.style.left = `${left}px`;
5709
+ popup.style.top = `${top}px`;
5710
+ };
5711
+ const observer = new MutationObserver((mutations) => {
5712
+ for (const mutation of mutations) {
5713
+ for (const node of Array.from(mutation.addedNodes)) {
5714
+ if (!(node instanceof HTMLElement))
5715
+ continue;
5716
+ // Solid-UI popups are divs with inline position:absolute and grid display
5717
+ if (node.style.position === 'absolute' &&
5718
+ node.style.display === 'grid' &&
5719
+ node.style.top === '-1em') {
5720
+ repositionPopup(node);
5721
+ continue;
5722
+ }
5723
+ // Also handle nested cases where the popup is not the direct added node
5724
+ const popup = node.querySelector('div[style*="position:absolute"][style*="display:grid"][style*="top:-1em"]');
5725
+ if (popup)
5726
+ repositionPopup(popup);
5727
+ }
5728
+ }
5729
+ });
5730
+ observer.observe(div, { childList: true, subtree: true });
5225
5731
  } // renderForm
5732
+ function enableFocusOnAdd(root) {
5733
+ const PLUS_ICON = 'noun_19460_green.svg';
5734
+ const isAddButton = (el) => {
5735
+ var _a;
5736
+ const img = el.querySelector('img');
5737
+ const label = el.querySelector('span');
5738
+ return ((img === null || img === void 0 ? void 0 : img.src.includes(PLUS_ICON)) &&
5739
+ ((_a = label === null || label === void 0 ? void 0 : label.textContent) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase().startsWith('add ')));
5740
+ };
5741
+ const buttons = Array.from(root.querySelectorAll('div')).filter(isAddButton);
5742
+ buttons.forEach((btn) => {
5743
+ btn.addEventListener('click', () => {
5744
+ const scope = (function findScope(el) {
5745
+ let cur = el;
5746
+ while (cur && cur !== root) {
5747
+ if (cur.querySelector('input[data-testid="autocomplete-input"]'))
5748
+ return cur;
5749
+ cur = cur.parentElement;
5750
+ }
5751
+ return root;
5752
+ })(btn);
5753
+ const before = new Set(Array.from(scope.querySelectorAll('input[data-testid="autocomplete-input"]')));
5754
+ const start = Date.now();
5755
+ const interval = setInterval(() => {
5756
+ const current = Array.from(scope.querySelectorAll('input[data-testid="autocomplete-input"]'));
5757
+ const newInput = current.find((el) => !before.has(el));
5758
+ if (newInput) {
5759
+ // New inputs are usually wrapped in a label/link; make sure focus jumps
5760
+ // straight to the input rather than the label link.
5761
+ skipLabelsFromTabbing(scope);
5762
+ newInput.focus();
5763
+ clearInterval(interval);
5764
+ return;
5765
+ }
5766
+ if (Date.now() - start > 1000) {
5767
+ clearInterval(interval);
5768
+ }
5769
+ }, 50);
5770
+ });
5771
+ });
5772
+ }
5226
5773
  // we need to load into the store some additional information about Social Media accounts
5227
5774
  function loadDocument(store, documentSource, documentName, documentURI) {
5228
5775
  const finalDocumentUri = documentURI || baseUri + documentName; // Full URI to the file
@@ -5233,6 +5780,33 @@ function loadDocument(store, documentSource, documentName, documentURI) {
5233
5780
  (0,external_rdflib_.parse)(documentSource, store, finalDocumentUri, 'text/turtle', () => null); // Load doc directly
5234
5781
  }
5235
5782
  }
5783
+ function skipLabelsFromTabbing(root) {
5784
+ // Many Solid-UI forms render field labels as focusable links (hrefs).
5785
+ // Make sure keyboard tabbing skips these label links entirely.
5786
+ const selectors = [
5787
+ 'label',
5788
+ '.formFieldName a',
5789
+ '.classifierBox-label a',
5790
+ '.choiceBox-label a',
5791
+ '.label a',
5792
+ // Skip focusable label-like links created by Solid-UI forms, including the vcard note link
5793
+ 'a[href="http://www.w3.org/2006/vcard/ns#note"]',
5794
+ 'a[href$="#note"]',
5795
+ ].join(', ');
5796
+ // querySelectorAll<HTMLElement> ensures the elements are typed correctly so we can access tabIndex.
5797
+ const nodes = root === null || root === void 0 ? void 0 : root.querySelectorAll(selectors);
5798
+ if (!nodes)
5799
+ return;
5800
+ Array.from(nodes).forEach(el => {
5801
+ if (typeof el.tabIndex === 'number' && el.tabIndex !== -1) {
5802
+ el.tabIndex = -1;
5803
+ }
5804
+ // Ensure those label links are not announced as focusable elements
5805
+ if (el.getAttribute('aria-hidden') !== 'true') {
5806
+ el.setAttribute('aria-hidden', 'true');
5807
+ }
5808
+ });
5809
+ }
5236
5810
 
5237
5811
  ;// ./src/SocialPresenter.ts
5238
5812
 
@@ -5380,115 +5954,6 @@ async function presentStuff(subject) {
5380
5954
  return { stuff };
5381
5955
  }
5382
5956
 
5383
- ;// ./src/addMeToYourFriends.ts
5384
-
5385
-
5386
-
5387
-
5388
-
5389
-
5390
-
5391
- let buttonContainer = document.createElement('section');
5392
- const addMeToYourFriendsDiv = (subject, context) => {
5393
- buttonContainer = context.dom.createElement('section');
5394
- buttonContainer.setAttribute('class', 'buttonSubSection text-truncate text-center section-centered');
5395
- buttonContainer.setAttribute('aria-labelledby', 'add-me-to-your-friends-button-section');
5396
- buttonContainer.setAttribute('data-testid', 'button');
5397
- // Add a visually hidden heading for accessibility
5398
- const heading = context.dom.createElement('h3');
5399
- heading.setAttribute('id', 'add-me-to-your-friends-button-section');
5400
- heading.setAttribute('class', 'sr-only');
5401
- heading.textContent = 'Add me to your friends actions';
5402
- buttonContainer.appendChild(heading);
5403
- const button = createAddMeToYourFriendsButton(subject, context);
5404
- button.classList.add('actionButton', 'btn-primary', 'action-button-focus');
5405
- buttonContainer.appendChild(button);
5406
- return b `${buttonContainer}`;
5407
- };
5408
- const createAddMeToYourFriendsButton = (subject, context) => {
5409
- const me = external_SolidLogic_.authn.currentUser();
5410
- let label = addMeToYourFriends_checkIfAnyUserLoggedIn(me) ? addMeToYourFriendsButtonText.toUpperCase() : logInAddMeToYourFriendsButtonText.toUpperCase();
5411
- const button = external_UI_.widgets.button(context.dom, undefined, label, setButtonHandler, //sets an onclick event listener
5412
- {
5413
- needsBorder: true,
5414
- });
5415
- function setButtonHandler(event) {
5416
- event.preventDefault();
5417
- saveNewFriend(subject, context)
5418
- .then(() => {
5419
- clearPreviousMessage(buttonContainer);
5420
- mention(buttonContainer, friendWasAddedSuccesMessage);
5421
- refreshButton();
5422
- })
5423
- .catch((error) => {
5424
- clearPreviousMessage(buttonContainer);
5425
- //else UI.widgets.complain(buttonContainer, message); //displays an error message at the top of the window
5426
- complain(buttonContainer, context, error);
5427
- });
5428
- }
5429
- button.refresh = refreshButton();
5430
- function refreshButton() {
5431
- const me = external_SolidLogic_.authn.currentUser();
5432
- const store = context.session.store;
5433
- if (addMeToYourFriends_checkIfAnyUserLoggedIn(me)) {
5434
- checkIfFriendExists(store, me, subject).then((friendExists) => {
5435
- if (friendExists) {
5436
- //logged in and friend exists or friend was just added
5437
- button.innerHTML = friendExistsAlreadyButtonText.toUpperCase();
5438
- }
5439
- else {
5440
- //logged in and friend does not exist yet
5441
- button.innerHTML = addMeToYourFriendsButtonText.toUpperCase();
5442
- }
5443
- });
5444
- }
5445
- else {
5446
- //not logged in
5447
- button.innerHTML = logInAddMeToYourFriendsButtonText.toUpperCase();
5448
- }
5449
- }
5450
- return button;
5451
- };
5452
- async function saveNewFriend(subject, context) {
5453
- const me = external_SolidLogic_.authn.currentUser();
5454
- const store = context.session.store;
5455
- if (addMeToYourFriends_checkIfAnyUserLoggedIn(me)) {
5456
- if (!(await checkIfFriendExists(store, me, subject))) {
5457
- //if friend does not exist, we add her/him
5458
- await store.fetcher.load(me);
5459
- const updater = store.updater;
5460
- const toBeInserted = [(0,external_rdflib_.st)(me, external_UI_.ns.foaf('knows'), subject, me.doc())];
5461
- try {
5462
- await updater.update([], toBeInserted);
5463
- }
5464
- catch (error) {
5465
- let errorMessage = error;
5466
- if (errorMessage.toString().includes('Unauthenticated'))
5467
- errorMessage = userNotLoggedInErrorMessage;
5468
- throw new Error(errorMessage);
5469
- }
5470
- }
5471
- else
5472
- throw new Error(friendExistsMessage);
5473
- }
5474
- else
5475
- throw new Error(userNotLoggedInErrorMessage);
5476
- }
5477
- function addMeToYourFriends_checkIfAnyUserLoggedIn(me) {
5478
- if (me)
5479
- return true;
5480
- else
5481
- return false;
5482
- }
5483
- async function checkIfFriendExists(store, me, subject) {
5484
- await store.fetcher.load(me);
5485
- if (store.whether(me, external_UI_.ns.foaf('knows'), subject, me.doc()) === 0)
5486
- return false;
5487
- else
5488
- return true;
5489
- }
5490
-
5491
-
5492
5957
  ;// ./src/QRCodeCard.ts
5493
5958
 
5494
5959
 
@@ -6037,10 +6502,179 @@ function paneDiv(context, subject, paneName) {
6037
6502
  return container;
6038
6503
  }
6039
6504
 
6505
+ // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/profileRDFFormsEnforced.css
6506
+ var profileRDFFormsEnforced = __webpack_require__(6776);
6507
+ ;// ./src/styles/profileRDFFormsEnforced.css
6508
+
6509
+
6510
+
6511
+
6512
+
6513
+
6514
+
6515
+
6516
+
6517
+
6518
+
6519
+ var profileRDFFormsEnforced_options = {};
6520
+
6521
+ profileRDFFormsEnforced_options.styleTagTransform = (styleTagTransform_default());
6522
+ profileRDFFormsEnforced_options.setAttributes = (setAttributesWithoutAttributes_default());
6523
+ profileRDFFormsEnforced_options.insert = insertBySelector_default().bind(null, "head");
6524
+ profileRDFFormsEnforced_options.domAPI = (styleDomAPI_default());
6525
+ profileRDFFormsEnforced_options.insertStyleElement = (insertStyleElement_default());
6526
+
6527
+ var profileRDFFormsEnforced_update = injectStylesIntoStyleTag_default()(profileRDFFormsEnforced/* default */.A, profileRDFFormsEnforced_options);
6528
+
6529
+
6530
+
6531
+
6532
+ /* harmony default export */ const styles_profileRDFFormsEnforced = (profileRDFFormsEnforced/* default */.A && profileRDFFormsEnforced/* default */.A.locals ? profileRDFFormsEnforced/* default */.A.locals : undefined);
6533
+
6534
+ // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/editProfile.css
6535
+ var editProfile = __webpack_require__(5179);
6536
+ ;// ./src/styles/editProfile.css
6537
+
6538
+
6539
+
6540
+
6541
+
6542
+
6543
+
6544
+
6545
+
6546
+
6547
+
6548
+ var editProfile_options = {};
6549
+
6550
+ editProfile_options.styleTagTransform = (styleTagTransform_default());
6551
+ editProfile_options.setAttributes = (setAttributesWithoutAttributes_default());
6552
+ editProfile_options.insert = insertBySelector_default().bind(null, "head");
6553
+ editProfile_options.domAPI = (styleDomAPI_default());
6554
+ editProfile_options.insertStyleElement = (insertStyleElement_default());
6555
+
6556
+ var editProfile_update = injectStylesIntoStyleTag_default()(editProfile/* default */.A, editProfile_options);
6557
+
6558
+
6559
+
6560
+
6561
+ /* harmony default export */ const styles_editProfile = (editProfile/* default */.A && editProfile/* default */.A.locals ? editProfile/* default */.A.locals : undefined);
6562
+
6563
+ ;// ./src/editProfilePane/editProfilePresenter.ts
6564
+
6565
+
6566
+
6567
+ const editProfilePresenter_DEFAULT_ICON_URI = external_UI_.icons.iconBase + 'noun_10636_grey.svg'; // grey disc
6568
+ function refresh(dom, attachmentTable, me, editableProfile, predicate) {
6569
+ // Keep the RDF terms so downstream Solid-UI helpers (e.g. findImage) can call term.sameTerm().
6570
+ // We still sort by string value so the list order is stable.
6571
+ const friendsList = external_SolidLogic_.store.each(me, predicate);
6572
+ // Ensure profiles are loaded before we render rows, otherwise widgets.findImage / utils.label may return empty.
6573
+ void (async () => {
6574
+ if (external_SolidLogic_.store.fetcher) {
6575
+ await Promise.all(friendsList.map((friend) => {
6576
+ var _a;
6577
+ if (!external_SolidLogic_.store.holds(friend, null, null, null)) {
6578
+ return (_a = external_SolidLogic_.store.fetcher) === null || _a === void 0 ? void 0 : _a.load(friend.value).catch(() => undefined);
6579
+ }
6580
+ return Promise.resolve();
6581
+ }));
6582
+ }
6583
+ friendsList.sort((a, b) => (a.value > b.value ? 1 : a.value < b.value ? -1 : 0));
6584
+ external_UI_.utils.syncTableToArray(attachmentTable, friendsList, (target) => createNewRow(dom, attachmentTable, target, me, editableProfile, predicate));
6585
+ })();
6586
+ }
6587
+ function createNewRow(dom, attachmentTable, target, me, editableProfile, predicate) {
6588
+ const theTarget = target;
6589
+ const profileImg = dom.createElement('img');
6590
+ profileImg.src = getProfileImg((0,external_rdflib_.sym)(target), profileImg);
6591
+ profileImg.alt = `Image of ${external_UI_.utils.label((0,external_rdflib_.sym)(target))}`;
6592
+ const opt = {
6593
+ image: profileImg,
6594
+ title: external_UI_.utils.label((0,external_rdflib_.sym)(target)),
6595
+ link: true
6596
+ };
6597
+ if (!!editableProfile) {
6598
+ opt.deleteFunction = function () {
6599
+ deleteAttachment(dom, attachmentTable, me, editableProfile, theTarget, predicate);
6600
+ };
6601
+ }
6602
+ return external_UI_.widgets.renderAsRow(dom, predicate, target, opt);
6603
+ }
6604
+ function getProfileImg(subject, profileImg) {
6605
+ const img = external_UI_.widgets.findImage(subject);
6606
+ if (img) {
6607
+ profileImg.classList.add('profile-image');
6608
+ return img;
6609
+ }
6610
+ profileImg.classList.add('default-profile-image');
6611
+ return editProfilePresenter_DEFAULT_ICON_URI;
6612
+ }
6613
+ async function deleteAttachment(dom, attachmentTable, me, editableProfile, target, predicate) {
6614
+ if (!external_SolidLogic_.store.updater) {
6615
+ throw new Error('Store has no updater.');
6616
+ }
6617
+ // Delete the exact statements in the store so we don't rely on doc() matching
6618
+ const statementsToDelete = external_SolidLogic_.store.statementsMatching(me, predicate, target, null);
6619
+ if (!statementsToDelete.length) {
6620
+ console.warn('No matching statement found to delete for', target.value);
6621
+ refresh(dom, attachmentTable, me, editableProfile, predicate);
6622
+ return;
6623
+ }
6624
+ try {
6625
+ await external_SolidLogic_.store.updater.update(statementsToDelete, []);
6626
+ // UpdateManager may mutate store asynchronously, so only remove locally if it still exists
6627
+ if (typeof external_SolidLogic_.store.removeStatements === 'function') {
6628
+ const stillThere = external_SolidLogic_.store.holds(me, predicate, target, null);
6629
+ if (stillThere) {
6630
+ try {
6631
+ external_SolidLogic_.store.removeStatements(statementsToDelete);
6632
+ }
6633
+ catch (e) {
6634
+ // Ignore if already gone
6635
+ }
6636
+ }
6637
+ }
6638
+ // Ensure store is up-to-date before re-rendering
6639
+ if (external_SolidLogic_.store.fetcher)
6640
+ await external_SolidLogic_.store.fetcher.load(me.doc());
6641
+ refresh(dom, attachmentTable, me, editableProfile, predicate);
6642
+ }
6643
+ catch (error) {
6644
+ console.error('Error deleting:', error);
6645
+ // If update failed, try to keep UI in sync anyway
6646
+ if (typeof external_SolidLogic_.store.removeStatements === 'function') {
6647
+ try {
6648
+ external_SolidLogic_.store.removeStatements(statementsToDelete);
6649
+ }
6650
+ catch (e) {
6651
+ /* ignore */
6652
+ }
6653
+ }
6654
+ if (external_SolidLogic_.store.fetcher)
6655
+ await external_SolidLogic_.store.fetcher.load(me.doc());
6656
+ refresh(dom, attachmentTable, me, editableProfile, predicate);
6657
+ }
6658
+ }
6659
+ function isAWebID(subject) {
6660
+ if (subject && subject.doc) {
6661
+ const t = external_SolidLogic_.store.findTypeURIs(subject.doc());
6662
+ return !!t[external_UI_.ns.foaf('PersonalProfileDocument').uri];
6663
+ }
6664
+ return false;
6665
+ }
6666
+
6040
6667
  ;// ./src/editProfilePane/EditFriendsCard.ts
6041
6668
 
6042
6669
 
6043
- function EditFriendsSection(context, me, editableProfile, profile) {
6670
+
6671
+
6672
+
6673
+
6674
+
6675
+
6676
+ const GREEN_PLUS = external_UI_.icons.iconBase + 'noun_34653_green.svg';
6677
+ function EditFriendsSection(context, me, editableProfile) {
6044
6678
  const section = context.dom.createElement('section');
6045
6679
  section.setAttribute('aria-labelledby', 'edit-profile-friends-heading');
6046
6680
  section.classList.add('profileSection', 'section-bg');
@@ -6052,31 +6686,62 @@ function EditFriendsSection(context, me, editableProfile, profile) {
6052
6686
  heading.textContent = friendsHeadingText;
6053
6687
  header.appendChild(heading);
6054
6688
  section.appendChild(header);
6055
- const comment1 = context.dom.createElement('p');
6056
- comment1.id = 'edit-profile-friends-description';
6057
- comment1.classList.add('p-md');
6058
- comment1.textContent = 'This is your public social network. Only put people here to whom you are happy to be publicly connected. (You can always keep private track of friends and family in your contacts.)';
6059
- section.appendChild(comment1);
6060
- let comment2 = null;
6061
6689
  if (editableProfile) {
6062
- comment2 = context.dom.createElement('p');
6063
- comment2.id = 'edit-profile-friends-help';
6064
- comment2.classList.add('p-md');
6065
- comment2.textContent = 'Drag people onto the target below to add people.';
6066
- section.appendChild(comment2);
6690
+ let plusButtonDiv = context.dom.createElement('div');
6691
+ plusButtonDiv.classList.add('add-friend-button-container');
6692
+ createAddButton(plusButtonDiv, context);
6693
+ section.appendChild(plusButtonDiv);
6067
6694
  }
6068
- const attachmentList = external_UI_.widgets.attachmentList(context.dom, me, section, {
6069
- doc: profile,
6070
- modify: !!editableProfile,
6071
- predicate: external_UI_.ns.foaf('knows'),
6072
- noun: 'friend'
6073
- });
6074
- const descriptions = [comment1.id];
6075
- if (comment2 === null || comment2 === void 0 ? void 0 : comment2.id) {
6076
- descriptions.push(comment2.id);
6695
+ const attachmentOuter = section.appendChild(context.dom.createElement('table'));
6696
+ attachmentOuter.classList.add('edit-friends-attachment-outer');
6697
+ const attachmentOne = attachmentOuter.appendChild(context.dom.createElement('tr'));
6698
+ const attachmentRight = attachmentOne.appendChild(context.dom.createElement('td'));
6699
+ const attachmentTable = attachmentRight.appendChild(context.dom.createElement('table'));
6700
+ attachmentTable.classList.add('attachmentTable', 'table', 'table-striped', 'table-hover');
6701
+ attachmentOuter.refresh = refresh(context.dom, attachmentTable, me, editableProfile, external_UI_.ns.foaf('knows')); // Participate in downstream changes
6702
+ refresh(context.dom, attachmentTable, me, editableProfile, external_UI_.ns.foaf('knows'));
6703
+ function createAddButton(buttonContainer, context) {
6704
+ const plus = buttonContainer.appendChild(external_UI_.widgets.button(context.dom, GREEN_PLUS, 'Add a friend', greenButtonHandler));
6705
+ const predicate = external_UI_.ns.foaf('knows');
6706
+ plus.setAttribute('class', 'add-button');
6707
+ plus.setAttribute('aria-label', 'Add a friend');
6708
+ const span = context.dom.createElement('span');
6709
+ span.textContent = 'Add a friend'; // for screen readers
6710
+ span.setAttribute('class', 'span');
6711
+ buttonContainer.appendChild(span);
6712
+ async function greenButtonHandler(_event) {
6713
+ const webid = await external_UI_.widgets.askName(context.dom, external_SolidLogic_.store, buttonContainer, predicate, undefined, 'WebID of the friend you');
6714
+ if (!webid) {
6715
+ return;
6716
+ }
6717
+ try {
6718
+ new URL(webid);
6719
+ }
6720
+ catch {
6721
+ complain(buttonContainer, context, 'Not a URL');
6722
+ return;
6723
+ }
6724
+ try {
6725
+ await external_SolidLogic_.store.fetcher.load(external_SolidLogic_.store.sym(webid));
6726
+ }
6727
+ catch {
6728
+ complain(buttonContainer, context, 'Not a valid WebID');
6729
+ return;
6730
+ }
6731
+ if (!isAWebID(external_SolidLogic_.store.sym(webid))) {
6732
+ complain(buttonContainer, context, 'WebID does not seem to exist');
6733
+ return;
6734
+ }
6735
+ return saveNewThing(webid, context, predicate)
6736
+ .then(() => {
6737
+ refresh(context.dom, attachmentTable, me, editableProfile, predicate); // Update the button state after adding a friend
6738
+ })
6739
+ .catch((error) => {
6740
+ clearPreviousMessage(buttonContainer);
6741
+ complain(buttonContainer, context, error);
6742
+ });
6743
+ }
6077
6744
  }
6078
- attachmentList.setAttribute('aria-describedby', descriptions.join(' '));
6079
- section.appendChild(attachmentList);
6080
6745
  return section;
6081
6746
  }
6082
6747
 
@@ -6098,13 +6763,7 @@ function EditSocialSection(context, me, editableProfile, store) {
6098
6763
  heading.textContent = socialAccountsHeadingText;
6099
6764
  header.appendChild(heading);
6100
6765
  section.appendChild(header);
6101
- if (editableProfile) {
6102
- const comment2 = context.dom.createElement('p');
6103
- comment2.classList.add('p-md');
6104
- comment2.textContent = 'Add links to your social media accounts here. These will be publicly visible on your profile.';
6105
- section.appendChild(comment2);
6106
- }
6107
- else {
6766
+ if (!editableProfile) {
6108
6767
  const comment1 = context.dom.createElement('p');
6109
6768
  comment1.classList.add('p-md');
6110
6769
  comment1.textContent = 'Login to add social media accounts to your profile.';
@@ -6117,7 +6776,14 @@ function EditSocialSection(context, me, editableProfile, store) {
6117
6776
  ;// ./src/editProfilePane/EditCommunitiesCard.ts
6118
6777
 
6119
6778
 
6120
- function EditProfileCommunitiesSection(context, me, editableProfile, profile) {
6779
+
6780
+
6781
+
6782
+
6783
+
6784
+
6785
+ const EditCommunitiesCard_GREEN_PLUS = external_UI_.icons.iconBase + 'noun_34653_green.svg';
6786
+ function EditProfileCommunitiesSection(context, me, editableProfile) {
6121
6787
  const section = context.dom.createElement('section');
6122
6788
  section.setAttribute('aria-labelledby', 'edit-profile-communities-heading');
6123
6789
  section.classList.add('profileSection', 'section-bg');
@@ -6129,65 +6795,67 @@ function EditProfileCommunitiesSection(context, me, editableProfile, profile) {
6129
6795
  heading.textContent = communitiesHeadingText;
6130
6796
  header.appendChild(heading);
6131
6797
  section.appendChild(header);
6132
- const comment1 = context.dom.createElement('p');
6133
- comment1.id = 'edit-profile-communities-description';
6134
- comment1.classList.add('p-md');
6135
- comment1.textContent = 'These are organizations and projects whose stuff you share';
6136
- section.appendChild(comment1);
6137
- let comment2 = null;
6138
6798
  if (editableProfile) {
6139
- comment2 = context.dom.createElement('p');
6140
- comment2.id = 'edit-profile-communities-help';
6141
- comment2.classList.add('p-md');
6142
- comment2.textContent = 'Drag organizations onto the target below to add organizations.';
6143
- section.appendChild(comment2);
6799
+ let plusButtonDiv = context.dom.createElement('div');
6800
+ plusButtonDiv.classList.add('add-community-button-container');
6801
+ createAddButton(plusButtonDiv, context);
6802
+ section.appendChild(plusButtonDiv);
6144
6803
  }
6145
- const attachmentList = external_UI_.widgets.attachmentList(context.dom, me, section, {
6146
- doc: profile,
6147
- modify: !!editableProfile,
6148
- predicate: external_UI_.ns.solid('community'),
6149
- noun: 'community'
6150
- });
6151
- const descriptions = [comment1.id];
6152
- if (comment2 === null || comment2 === void 0 ? void 0 : comment2.id) {
6153
- descriptions.push(comment2.id);
6804
+ const attachmentOuter = section.appendChild(context.dom.createElement('table'));
6805
+ attachmentOuter.classList.add('edit-community-attachment-outer');
6806
+ const attachmentOne = attachmentOuter.appendChild(context.dom.createElement('tr'));
6807
+ const attachmentRight = attachmentOne.appendChild(context.dom.createElement('td'));
6808
+ const attachmentTable = attachmentRight.appendChild(context.dom.createElement('table'));
6809
+ attachmentTable.classList.add('attachmentTable', 'table', 'table-striped', 'table-hover');
6810
+ attachmentOuter.refresh = refresh(context.dom, attachmentTable, me, editableProfile, external_UI_.ns.solid('community')); // Participate in downstream changes
6811
+ refresh(context.dom, attachmentTable, me, editableProfile, external_UI_.ns.solid('community'));
6812
+ function createAddButton(buttonContainer, context) {
6813
+ const plus = buttonContainer.appendChild(external_UI_.widgets.button(context.dom, EditCommunitiesCard_GREEN_PLUS, 'Add a project or community', greenButtonHandler));
6814
+ const predicate = external_UI_.ns.solid('community');
6815
+ plus.setAttribute('class', 'add-button');
6816
+ plus.setAttribute('aria-label', 'Add a new community');
6817
+ const span = context.dom.createElement('span');
6818
+ span.textContent = 'Add a community or project'; // for screen readers
6819
+ span.setAttribute('class', 'span');
6820
+ buttonContainer.appendChild(span);
6821
+ async function greenButtonHandler(_event) {
6822
+ const webid = await external_UI_.widgets.askName(context.dom, external_SolidLogic_.store, buttonContainer, predicate, undefined, 'WebID of');
6823
+ if (!webid) {
6824
+ return;
6825
+ }
6826
+ try {
6827
+ new URL(webid);
6828
+ }
6829
+ catch {
6830
+ complain(buttonContainer, context, 'Not a URL');
6831
+ return;
6832
+ }
6833
+ try {
6834
+ await external_SolidLogic_.store.fetcher.load(external_SolidLogic_.store.sym(webid));
6835
+ }
6836
+ catch {
6837
+ complain(buttonContainer, context, 'Not a valid WebID');
6838
+ return;
6839
+ }
6840
+ if (!isAWebID(external_SolidLogic_.store.sym(webid))) {
6841
+ complain(buttonContainer, context, 'WebID does not seem to exist');
6842
+ return;
6843
+ }
6844
+ return saveNewThing(webid, context, predicate)
6845
+ .then(() => {
6846
+ refresh(context.dom, attachmentTable, me, editableProfile, predicate); // Update the button state after adding a community
6847
+ })
6848
+ .catch((error) => {
6849
+ clearPreviousMessage(buttonContainer);
6850
+ complain(buttonContainer, context, error);
6851
+ });
6852
+ }
6154
6853
  }
6155
- attachmentList.setAttribute('aria-describedby', descriptions.join(' '));
6156
- section.appendChild(attachmentList);
6157
6854
  return section;
6158
6855
  }
6159
6856
 
6160
- // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/rdfFormsEnforced.css
6161
- var rdfFormsEnforced = __webpack_require__(9053);
6162
- ;// ./src/styles/rdfFormsEnforced.css
6163
-
6164
-
6165
-
6166
-
6167
-
6168
-
6169
-
6170
-
6171
-
6172
-
6173
-
6174
- var rdfFormsEnforced_options = {};
6175
-
6176
- rdfFormsEnforced_options.styleTagTransform = (styleTagTransform_default());
6177
- rdfFormsEnforced_options.setAttributes = (setAttributesWithoutAttributes_default());
6178
- rdfFormsEnforced_options.insert = insertBySelector_default().bind(null, "head");
6179
- rdfFormsEnforced_options.domAPI = (styleDomAPI_default());
6180
- rdfFormsEnforced_options.insertStyleElement = (insertStyleElement_default());
6181
-
6182
- var rdfFormsEnforced_update = injectStylesIntoStyleTag_default()(rdfFormsEnforced/* default */.A, rdfFormsEnforced_options);
6183
-
6184
-
6185
-
6186
-
6187
- /* harmony default export */ const styles_rdfFormsEnforced = (rdfFormsEnforced/* default */.A && rdfFormsEnforced/* default */.A.locals ? rdfFormsEnforced/* default */.A.locals : undefined);
6188
-
6189
6857
  ;// ./src/ontology/resumeForm.ttl
6190
- const resumeForm_namespaceObject = "@prefix os: <http://www.w3.org/2000/10/swap/os#> .\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix org: <http://www.w3.org/ns/org#>.\n@prefix esco: <http://data.europa.eu/esco/model#>.\n@prefix wd: <http://www.wikidata.org/entity/>.\n@prefix wdt: <http://www.wikidata.org/prop/direct/>.\n\n@prefix : <#>.\n\n:this\n <http://purl.org/dc/elements/1.1/title> \"Resume form\" ;\n a ui:Form ;\n ui:parts (\n :CVGroup\n :SkillsHeading :SkillsForm\n :LanguagesHeading :LanguagesForm\n ).\n\n# Curriculum Vitae: membership of organizations\n\n:CVGroup a ui:Group; \n ui:weight 1; \n ui:parts ( \n :CVPrompt \n :involvementWithOrganizationsForm \n ).\n\n:CVPrompt a ui:Comment; ui:contents \"What organizations have you been involved with?\" .\n\n:involvementWithOrganizationsForm a ui:Multiple;\n ui:label \"Involvement with organization\";\n ui:property org:member; \n ui:reverse true; # link back from role to member\n ui:ordered false; # Allow user to order CV secions rather than force date order? No.\n ui:part :RoleMembershipForm.\n\norg:member owl:inverse [ ui:label \"Involvement with organization\" ]. # timelimited involvement\n\n# This is a big important form for one of a series of roles in the list.\n\n:RoleMembershipForm a ui:Group; \n ui:weight 3; \n ui:parts ( \n :MembershipFormHeading \n :roleNameField\n :escoOccupationField \n :orgField \n :RoleClassifier \n :RoleDatesForm \n :RoleDescriptionForm).\n\n:MembershipFormHeading a ui:Heading; \n ui:contents \"Details of the role\"@en, \"Détailes de ce rôle\"@fr .\n\n:roleNameField a ui:SingleLineTextField; \n ui:property vcard:role .\n\n:escoOccupationField a ui:AutocompleteField;\n ui:label \"Occupation\";\n ui:property org:role;\n ui:dataSource :ESCO_Occupation_DataSource;\n ui:targetClass schema:Occupation .\n\n :ESCO_Occupation_DataSource a ui:DataSource;\n schema:name \"ESCO\";\n ui:targetClass schema:Occupation ;\n schema:logo <https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif>;\n ui:searchByNameURI \"https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)\".\n\n:orgField a ui:Choice; \n ui:label \"Organization\"@en, \"Organization\"@fr;\n ui:canMintNew true; \n ui:use :OrganizationCreationForm ;\n ui:property org:organization;\n ui:from vcard:Organization .\n\nvcard:Organization ui:creationForm :OrganizationCreationForm .\n\n###### eposodes in one's career - Roles\n\n:RoleClassifier a ui:Classifier; \n ui:label \"What sort of role?\"@en;\n ui:category solid:Role .\n\n:RoleDatesForm a ui:Options; \n ui:dependingOn rdf:type; \n ui:case\n [ ui:for solid:PastRole; ui:use :TwoDateForm ],\n [ ui:for solid:CurrentRole; ui:use :StartDateForm ],\n [ ui:for solid:FutureRole; ui:use :StartDateForm ].\n\n :TwoDateForm a ui:Group; \n ui:weight 0; \n ui:parts ( :StartDateForm :EndDateForm ) .\n :StartDateForm a ui:DateField; \n ui:label \"Start\"@en,\"Début\"@fr;\n ui:property schema:startDate .\n :EndDateForm a ui:DateField; \n ui:label \"End\"@en,\"Fin\"@fr;\n ui:property schema:endDate .\n\nsolid:Role a rdfs:Class;\n owl:disjointUnionOf ( solid:PastRole solid:CurrentRole solid:FutureRole ) ;\n owl:oneOf ( solid:CurrentRole solid:PastRole solid:FutureRole ). # Future Role too?\n\nsolid:PastRole a rdfs:Class; rdfs:label \"Former role\"@en, \"Ancien rôle\"@fr, \"Vergangene Rolle\"@de, \"Rol anterior\"@es .\nsolid:CurrentRole a rdfs:Class; rdfs:label \"Current role\"@en, \"Rôle actuel\"@fr, \"Momentane Rolle\"@de , \"Rol actual\"@es .\nsolid:FutureRole a rdfs:Class; rdfs:label \"Future role\"@en, \"Rôle à venir\"@fr, \"Zukünftige Rolle\"@de, \"Rol futuro\"@es .\n\n:RoleDescriptionForm a ui:MultiLineTextField; \n ui:property schema:description;\n ui:label \"Describe your role\" .\n\n###### Organizations\n\n:OrganizationCreationForm a ui:Form; \n schema:name \"Form for editing an organization using public data\" ;\n ui:parts ( \n :OrgClassifier \n :OrgSwitch \n :OrganizationNameField \n :homePageURIField ) .\n\n:OrgClassifier a ui:Classifier; \n ui:label \"Type of organization?\"@en;\n ui:category solid:InterestingOrganization .\n\n:OrgSwitch a ui:Options; \n ui:dependingOn rdf:type;\n ui:case\n [ ui:for schema:Corporation; ui:use :CorporationForm ],\n [ ui:for schema:GovernmentOrganization; ui:use :GovernmentOrganizationForm ],\n [ ui:for schema:PerformingGroup; ui:use :PerformingGroupForm ],\n [ ui:for schema:Project; ui:use :ProjectForm ],\n [ ui:for schema:NGO; ui:use :NGOForm ],\n [ ui:for schema:EducationalOrganization; ui:use :EducationalOrganizationForm ],\n [ ui:for schema:ResearchOrganization; ui:use :ResearchOrganizationForm ],\n [ ui:for schema:SportsOrganization; ui:use :SportsOrganizationForm ].\n\n:OrganizationNameField\n a ui:SingleLineTextField ;\n ui:label \"Name\";\n ui:maxLength \"200\" ;\n ui:property schema:name .\n\n:homePageURIField a ui:NamedNodeURIField;\n ui:label \"Homepage\"@en;\n ui:property schema:uri .\n\n# Ontology data to drive the :OrgClassifier classifier\nsolid:InterestingOrganization owl:disjointUnionOf (\n # Airline - a Corporation\n # Consortium - a Corporation or a NGO\n schema:Corporation\n schema:EducationalOrganization\n schema:ResearchOrganization # Proposed. https://github.com/schemaorg/schemaorg/issues/2877\n # FundingScheme - eh?\n schema:GovernmentOrganization\n # LibrarySystem\n # LocalBusiness - Corporation\n # MedicalOrganization - a Corporation or a NGO\n schema:NGO\n # NewsMediaOrganization - a Corporation or a NGO\n schema:PerformingGroup # a band\n schema:Project # like Solid\n schema:SportsOrganization) .\n\n# This until the schema.org ontology adopts it\nschema:ResearchOrganization a rdfs:Class; \n rdfs:label \"Research Organization\"@en, \"Organization de Recherche\"@fr ,\"organización de investigación\"@es, \n \"منظمة البحث\"@ar, \"अनुसंधान संगठन\"@hi, \"Forschungsorganisation\"@de, \"shirika la utafiti\"@sw .\n\n##### Depending on the type of org, chose a different form\n\n#### Corporation\n:CorporationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :CorporationPrompt \n :CorporationAutocomplete ) .\n\n :CorporationPrompt a ui:Comment; ui:contents \"Corporation details\".\n\n :CorporationAutocomplete a ui:AutocompleteField; \n ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q6881511>; # Enterprise\n ui:property solid:publicId; \n ui:dataSource :WikidataInstancesByName.\n\n :WikidataInstancesByName a ui:DataSource ;\n schema:name \"Wikidata instances by name\";\n ui:endpoint \"https://query.wikidata.org/sparql\" ;\n ui:searchByNameQuery \"\"\"SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\n ?subject wdt:P31 ?klass .\n ?subject rdfs:label ?name.\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit) \"\"\" ;\n\n # Note this form of the query is very experimental\n ui:searchByName [ ui:construct { ?subject schema:name ?name } ;\n ui:where { ?klass wdt:P279 ?targetClass .\n ?subject wdt:P31 ?klass; rdfs:label ?name .\n };\n ].\n\n#### Gouvernment\n:GovernmentOrganizationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :GovernmentOrganizationPrompt \n :GovernmentOrganizationAutocomplete ) .\n\n :GovernmentOrganizationPrompt a ui:Comment; ui:contents \"Government organization details\".\n\n :GovernmentOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q327333>; # GovernmentOrganization\n ui:property solid:publicId; \n ui:dataSource :WikidataInstancesByName.\n\n#### Educational\n:EducationalOrganizationForm a ui:Group; \n ui:weight 1; \n ui:parts ( \n :EducationalOrganizationPrompt \n :EducationalOrganizationAutocomplete ) .\n\n :EducationalOrganizationPrompt a ui:Comment; ui:contents \"Educational organization details\".\n\n :EducationalOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q2385804>; # EducationalOrganization\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Research Group\n:ResearchOrganizationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :ResearchOrganizationPrompt \n :ResearchOrganizationAutocomplete ) .\n\n :ResearchOrganizationPrompt a ui:Comment; ui:contents \"Research organizationd details\".\n\n :ResearchOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q31855>; # research institute\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### NGO\n:NGOForm a ui:Group; ui:weight 0; \n ui:parts ( \n :NGOPrompt \n :NGOAutocomplete ) .\n\n :NGOPrompt a ui:Comment; ui:contents \"NGO details\".\n\n :NGOAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q163740>; # Non-profit org\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Performing group\n:PerformingGroupForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :PerformingGroupPrompt \n :PerformingGroupAutocomplete ) .\n\n :PerformingGroupPrompt a ui:Comment; ui:contents \"Performing group details\".\n\n :PerformingGroupAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q32178211>; # Music Org\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Project\n:ProjectForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :ProjectPrompt \n :ProjectAutocomplete ) . # :ProjectAutocomplete - no: supress, as not in WD\n\n :ProjectPrompt a ui:Comment; ui:contents \"Project details\".\n\n :ProjectAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q170584>; # Project\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Sports Organization\n:SportsOrganizationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :SportsOrganizationPrompt \n :SportsOrganizationAutocomplete ) .\n\n:SportsOrganizationPrompt a ui:Comment; ui:contents \"Sports organization details\".\n\n:SportsOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q4438121>; # SportsOrganization\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#################### Skills\n\n:SkillsHeading a ui:Heading; \n ui:contents \"Add your skills\" .\n\n:SkillsForm a ui:Multiple;\n ui:label \"Skills\";\n ui:property schema:skills;\n ui:ordered false; # Allow reader to order skills\n ui:part :SkillForm.\n\n:SkillForm a ui:Group; ui:weight 1; ui:parts ( :escoSkillField ).\n\n :escoSkillField a ui:AutocompleteField;\n ui:label \"Find in ESCO\";\n ui:property solid:publicId;\n ui:dataSource :ESCO_Skill_DataSource;\n ui:targetClass schema:Skill .\n\n :ESCO_Skill_DataSource a ui:DataSource;\n schema:name \"ESCO skill\";\n ui:targetClass esco:Skill ;\n schema:logo <https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif>;\n ui:searchByNameURI \"https://ec.europa.eu/esco/api/search?language=$(language)&limit=$(limit)&type=skill&text=$(name)\".\n\n#################### Languages\n\n:LanguagesHeading a ui:Heading; ui:contents \"Add your languages\" .\n\n:LanguagesForm a ui:Multiple;\n ui:label \"Languages\";\n ui:property schema:knowsLanguage; \n ui:ordered true; # Allow user to order languages most important first.\n ui:part :LanguageForm.\n\n:LanguageForm a ui:Group; ui:weight 1; ui:parts ( :WikidataLanguageField ).\n\n :WikidataLanguageField a ui:AutocompleteField;\n ui:label \"Language\";\n ui:property solid:publicId; \n ui:dataSource :WikidataLanguageDataSource;\n ui:targetClass schema:Language .\n\n :WikidataLanguageDataSource\n schema:name \"Find in wikidata\";\n ui:endpoint \"https://query.wikidata.org/sparql\" ;\n ui:objectURIBase <https://www.w3.org/ns/iana/language-code/>;\n # Add this to any literal string returned as ?subject\n ui:searchByNameQuery \"\"\"SELECT ?item ?subject ?name\n WHERE\n { ?item wdt:P305 ?subject .\n OPTIONAL {?item rdfs:label ?name}\n OPTIONAL {?item wdt:P1705 ?name}\n FILTER regex(?name, \"$(name)\", \"i\")\n FILTER regex(?subject, \"^..$\", \"i\")\n }\"\"\" .\n # Note we restrict code to two-letter codes with the second regex, so as to limit the deluge of languages\n # Hope there are not any important ones which have three-letter codes.\n # Omitted: SERVICE wikibase:label { bd:serviceParam wikibase:language \"$(languages)\". }";
6858
+ const resumeForm_namespaceObject = "@prefix os: <http://www.w3.org/2000/10/swap/os#> .\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix org: <http://www.w3.org/ns/org#>.\n@prefix esco: <http://data.europa.eu/esco/model#>.\n@prefix wd: <http://www.wikidata.org/entity/>.\n@prefix wdt: <http://www.wikidata.org/prop/direct/>.\n\n@prefix : <#>.\n\n:this\n <http://purl.org/dc/elements/1.1/title> \"Resume form\" ;\n a ui:Form ;\n ui:parts (\n :CVGroup\n :SkillsHeading :SkillsForm\n :LanguagesHeading :LanguagesForm\n ).\n\n# Curriculum Vitae: membership of organizations\n\n:CVGroup a ui:Group; \n ui:weight 1; \n ui:parts ( \n :ResumeHeading \n :involvementWithOrganizationsForm \n ).\n\n:ResumeHeading a ui:Heading; \n ui:contents \"Add your work experience\" .\n\n:involvementWithOrganizationsForm a ui:Multiple;\n ui:label \"work experience\";\n ui:property org:member; \n ui:reverse true; # link back from role to member\n ui:ordered false; # Allow user to order CV secions rather than force date order? No.\n ui:part :RoleMembershipForm.\n\norg:member owl:inverse [ ui:label \"Work experience\" ]. # timelimited involvement\n\n# This is a big important form for one of a series of roles in the list.\n\n:RoleMembershipForm a ui:Group; \n ui:weight 3; \n ui:parts ( \n :MembershipFormHeading\n :RoleClassifier \n :roleNameField\n :escoOccupationField \n :orgField \n :RoleDatesForm \n :RoleDescriptionForm).\n\n:MembershipFormHeading a ui:Heading; \n ui:contents \"Details of the role\"@en, \"Détailes de ce rôle\"@fr .\n\n:roleNameField a ui:SingleLineTextField;\n ui:label \"Job title\";\n ui:property vcard:role .\n\n:escoOccupationField a ui:AutocompleteField;\n ui:label \"Find in occupation catalog\";\n ui:property org:role;\n ui:dataSource :ESCO_Occupation_DataSource;\n ui:targetClass schema:Occupation .\n\n :ESCO_Occupation_DataSource a ui:DataSource;\n schema:name \"ESCO\";\n ui:targetClass schema:Occupation ;\n schema:logo <https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif>;\n ui:searchByNameURI \"https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)\".\n\n:orgField a ui:Choice; \n ui:label \"For organization\"@en, \"Pour l'organisation\"@fr;\n ui:canMintNew true; \n ui:use :OrganizationCreationForm ;\n ui:property org:organization;\n ui:from vcard:Organization .\n\nvcard:Organization ui:creationForm :OrganizationCreationForm .\n\n###### eposodes in one's career - Roles\n\n:RoleClassifier a ui:Classifier; \n ui:label \"Job type\"@en;\n ui:category solid:Role .\n\n:RoleDatesForm a ui:Options; \n ui:dependingOn rdf:type; \n ui:case\n [ ui:for solid:PastRole; ui:use :TwoDateForm ],\n [ ui:for solid:CurrentRole; ui:use :StartDateForm ],\n [ ui:for solid:FutureRole; ui:use :StartDateForm ].\n\n :TwoDateForm a ui:Group; \n ui:weight 0; \n ui:parts ( :StartDateForm :EndDateForm ) .\n :StartDateForm a ui:DateField; \n ui:label \"Start\"@en,\"Début\"@fr;\n ui:property schema:startDate .\n :EndDateForm a ui:DateField; \n ui:label \"End\"@en,\"Fin\"@fr;\n ui:property schema:endDate .\n\nsolid:Role a rdfs:Class;\n owl:disjointUnionOf ( solid:PastRole solid:CurrentRole solid:FutureRole ) ;\n owl:oneOf ( solid:CurrentRole solid:PastRole solid:FutureRole ). # Future Role too?\n\nsolid:PastRole a rdfs:Class; rdfs:label \"Former role\"@en, \"Ancien rôle\"@fr, \"Vergangene Rolle\"@de, \"Rol anterior\"@es .\nsolid:CurrentRole a rdfs:Class; rdfs:label \"Current role\"@en, \"Rôle actuel\"@fr, \"Momentane Rolle\"@de , \"Rol actual\"@es .\nsolid:FutureRole a rdfs:Class; rdfs:label \"Future role\"@en, \"Rôle à venir\"@fr, \"Zukünftige Rolle\"@de, \"Rol futuro\"@es .\n\n:RoleDescriptionForm a ui:MultiLineTextField; \n ui:property schema:description;\n ui:label \"Describe your role\" .\n\n###### Organizations\n\n:OrganizationCreationForm a ui:Form; \n schema:name \"Form for editing an organization using public data\" ;\n ui:parts ( \n :OrgClassifier \n :OrganizationNameField\n :OrgSwitch\n :homePageURIField ) .\n\n:OrgClassifier a ui:Classifier; \n ui:label \"Type\"@en;\n ui:category solid:InterestingOrganization .\n\n:OrgSwitch a ui:Options; \n ui:dependingOn rdf:type;\n ui:case\n [ ui:for schema:Corporation; ui:use :CorporationForm ],\n [ ui:for schema:GovernmentOrganization; ui:use :GovernmentOrganizationForm ],\n [ ui:for schema:PerformingGroup; ui:use :PerformingGroupForm ],\n [ ui:for schema:Project; ui:use :ProjectForm ],\n [ ui:for schema:NGO; ui:use :NGOForm ],\n [ ui:for schema:EducationalOrganization; ui:use :EducationalOrganizationForm ],\n [ ui:for schema:ResearchOrganization; ui:use :ResearchOrganizationForm ],\n [ ui:for schema:SportsOrganization; ui:use :SportsOrganizationForm ].\n\n:OrganizationNameField a ui:SingleLineTextField ;\n ui:label \"Name\";\n ui:maxLength \"200\" ;\n ui:property schema:name .\n\n:homePageURIField a ui:NamedNodeURIField;\n ui:label \"Homepage\"@en;\n ui:property schema:uri .\n\n# Ontology data to drive the :OrgClassifier classifier\nsolid:InterestingOrganization owl:disjointUnionOf (\n # Airline - a Corporation\n # Consortium - a Corporation or a NGO\n schema:Corporation\n schema:EducationalOrganization\n schema:ResearchOrganization # Proposed. https://github.com/schemaorg/schemaorg/issues/2877\n # FundingScheme - eh?\n schema:GovernmentOrganization\n # LibrarySystem\n # LocalBusiness - Corporation\n # MedicalOrganization - a Corporation or a NGO\n schema:NGO\n # NewsMediaOrganization - a Corporation or a NGO\n schema:PerformingGroup # a band\n schema:Project # like Solid\n schema:SportsOrganization) .\n\n# This until the schema.org ontology adopts it\nschema:ResearchOrganization a rdfs:Class; \n rdfs:label \"Research Organization\"@en, \"Organization de Recherche\"@fr ,\"organización de investigación\"@es, \n \"منظمة البحث\"@ar, \"अनुसंधान संगठन\"@hi, \"Forschungsorganisation\"@de, \"shirika la utafiti\"@sw .\n\n##### Depending on the type of org, chose a different form\n\n#### Corporation\n:CorporationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :CorporationAutocomplete ) .\n\n :CorporationAutocomplete a ui:AutocompleteField; \n ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q6881511>; # Enterprise\n ui:property solid:publicId; \n ui:dataSource :WikidataInstancesByName.\n\n :WikidataInstancesByName a ui:DataSource ;\n schema:name \"Wikidata instances by name\";\n ui:endpoint \"https://query.wikidata.org/sparql\" ;\n ui:searchByNameQuery \"\"\"SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\n ?subject wdt:P31 ?klass .\n ?subject rdfs:label ?name.\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit) \"\"\" ;\n\n # Note this form of the query is very experimental\n ui:searchByName [ ui:construct { ?subject schema:name ?name } ;\n ui:where { ?klass wdt:P279 ?targetClass .\n ?subject wdt:P31 ?klass; rdfs:label ?name .\n };\n ].\n\n#### Gouvernment\n:GovernmentOrganizationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :GovernmentOrganizationAutocomplete ) .\n\n :GovernmentOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q327333>; # GovernmentOrganization\n ui:property solid:publicId; \n ui:dataSource :WikidataInstancesByName.\n\n#### Educational\n:EducationalOrganizationForm a ui:Group; \n ui:weight 1; \n ui:parts ( \n :EducationalOrganizationAutocomplete ) .\n\n :EducationalOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q2385804>; # EducationalOrganization\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Research Group\n:ResearchOrganizationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :ResearchOrganizationAutocomplete ) .\n\n :ResearchOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q31855>; # research institute\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### NGO\n:NGOForm a ui:Group; ui:weight 0; \n ui:parts ( \n :NGOAutocomplete ) .\n\n :NGOAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q163740>; # Non-profit org\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Performing group\n:PerformingGroupForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :PerformingGroupAutocomplete ) .\n\n :PerformingGroupAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q32178211>; # Music Org\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Project\n:ProjectForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :ProjectAutocomplete ) . # :ProjectAutocomplete - no: supress, as not in WD\n\n :ProjectAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q170584>; # Project\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#### Sports Organization\n :SportsOrganizationForm a ui:Group; \n ui:weight 0; \n ui:parts ( \n :SportsOrganizationAutocomplete ) .\n\n :SportsOrganizationAutocomplete\n a ui:AutocompleteField; ui:label \"Find in wikidata\";\n ui:targetClass <http://www.wikidata.org/entity/Q4438121>; # SportsOrganization\n ui:property solid:publicId; ui:dataSource :WikidataInstancesByName.\n\n#################### Skills\n\n:SkillsHeading a ui:Heading; \n ui:contents \"Add your skills\" .\n\n:SkillsForm a ui:Multiple;\n ui:label \"skill\";\n ui:property schema:skills;\n ui:ordered false; # Allow reader to order skills\n ui:part :SkillForm.\n\n:SkillForm a ui:Group; ui:weight 1; ui:parts ( :escoSkillField ).\n\n :escoSkillField a ui:AutocompleteField;\n ui:label \"Find in skills catalog\";\n ui:property solid:publicId;\n ui:dataSource :ESCO_Skill_DataSource;\n ui:targetClass schema:Skill .\n\n :ESCO_Skill_DataSource a ui:DataSource;\n schema:name \"ESCO skill\";\n ui:targetClass esco:Skill ;\n schema:logo <https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif>;\n ui:searchByNameURI \"https://ec.europa.eu/esco/api/search?language=$(language)&limit=$(limit)&type=skill&text=$(name)\".\n\n#################### Languages\n\n:LanguagesHeading a ui:Heading; ui:contents \"Add your languages\" .\n\n:LanguagesForm a ui:Multiple;\n ui:label \"language\";\n ui:property schema:knowsLanguage; \n ui:ordered true; # Allow user to order languages most important first.\n ui:part :LanguageForm.\n\n:LanguageForm a ui:Group; ui:weight 1; ui:parts ( :WikidataLanguageField ).\n\n :WikidataLanguageField a ui:AutocompleteField;\n ui:label \"Language\";\n ui:property solid:publicId; \n ui:dataSource :WikidataLanguageDataSource;\n ui:targetClass schema:Language .\n\n :WikidataLanguageDataSource\n schema:name \"Find in wikidata\";\n ui:endpoint \"https://query.wikidata.org/sparql\" ;\n ui:objectURIBase <https://www.w3.org/ns/iana/language-code/>;\n # Add this to any literal string returned as ?subject\n ui:searchByNameQuery \"\"\"SELECT ?item ?subject ?name\n WHERE\n { ?item wdt:P305 ?subject .\n OPTIONAL {?item rdfs:label ?name}\n OPTIONAL {?item wdt:P1705 ?name}\n FILTER regex(?name, \"$(name)\", \"i\")\n FILTER regex(?subject, \"^..$\", \"i\")\n }\"\"\" .\n # Note we restrict code to two-letter codes with the second regex, so as to limit the deluge of languages\n # Hope there are not any important ones which have three-letter codes.\n # Omitted: SERVICE wikibase:label { bd:serviceParam wikibase:language \"$(languages)\". }";
6191
6859
  ;// ./src/editProfilePane/EditCVCard.ts
6192
6860
 
6193
6861
 
@@ -6206,13 +6874,7 @@ function EditCVSection(context, me, editableProfile, store) {
6206
6874
  heading.textContent = resumeHeadingText;
6207
6875
  header.appendChild(heading);
6208
6876
  section.appendChild(header);
6209
- if (editableProfile) {
6210
- const comment2 = context.dom.createElement('p');
6211
- comment2.classList.add('p-md');
6212
- comment2.textContent = 'Edit your resume. These will be publicly visible on your profile.';
6213
- section.appendChild(comment2);
6214
- }
6215
- else {
6877
+ if (!editableProfile) {
6216
6878
  const comment1 = context.dom.createElement('p');
6217
6879
  comment1.classList.add('p-md');
6218
6880
  comment1.textContent = 'Login to add resume information to your profile.';
@@ -6223,7 +6885,7 @@ function EditCVSection(context, me, editableProfile, store) {
6223
6885
  }
6224
6886
 
6225
6887
  ;// ./src/ontology/otherPreferencesForm.ttl
6226
- const otherPreferencesForm_namespaceObject = "@prefix os: <http://www.w3.org/2000/10/swap/os#> .\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix wd: <http://www.wikidata.org/entity/>.\n@prefix wdt: <http://www.wikidata.org/prop/direct/>.\n\n@prefix : <#>.\n\n\n:this\n <http://purl.org/dc/elements/1.1/title> \"Other preferences form\" ;\n a ui:Form ;\n ui:parts (\n :styleGroup\n :nicknameGroup\n :pronounsGroup\n ).\n\n:styleGroup a ui:Group; ui:weight 0; \n ui:parts ( :styleHeading :backgroundColor :highlightColor ).\n\n:styleHeading a ui:Heading; ui:contents \"The style of your public profile.\".\n\n:backgroundColor a ui:ColorField; ui:property solid:profileBackgroundColor;\n ui:label \"Background color\"; ui:default \"#ffffff\".\n:highlightColor a ui:ColorField; ui:property solid:profileHighlightColor;\n ui:label \"Highlight color\"; ui:default \"#000000\".\n\n# Nickname\n\n:nicknameGroup a ui:Group; ui:weight 0; \n ui:parts ( :nicknameHeading :nicknameField) .\n\n:nicknameHeading a ui:Heading; ui:contents \"What is your nickname?\" .\n\n:nicknameField a ui:SingleLineTextField; \n ui:property foaf:nick;\n ui:label \"Nickname\"@en, \"Nom court\"@fr.\n\n# Pronouns\n\n:pronounsGroup a ui:Group; ui:weight 0; \n ui:parts ( :pronounsHeading :subjectPronounForm :objectPronounForm :relativePronounForm) .\n\n:pronounsHeading a ui:Heading; ui:contents \"What are your pronouns?\" .\n\n:subjectPronounForm a ui:SingleLineTextField; ui:property solid:preferredSubjectPronoun;\n ui:size 10; ui:label \"he/she/they...\" .\n:objectPronounForm a ui:SingleLineTextField; ui:property solid:preferredObjectPronoun;\n ui:size 10; ui:label \"him/her/them...\" .\n:relativePronounForm a ui:SingleLineTextField; ui:property solid:preferredRelativePronoun;\n ui:size 10; ui:label \"his/hers/theirs...\" .";
6888
+ const otherPreferencesForm_namespaceObject = "@prefix os: <http://www.w3.org/2000/10/swap/os#> .\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix wd: <http://www.wikidata.org/entity/>.\n@prefix wdt: <http://www.wikidata.org/prop/direct/>.\n\n@prefix : <#>.\n\n\n:this\n <http://purl.org/dc/elements/1.1/title> \"Other preferences form\" ;\n a ui:Form ;\n ui:parts (\n :styleGroup\n ).\n\n:styleGroup a ui:Group; ui:weight 0; \n ui:parts ( :styleHeading :backgroundColor :highlightColor ).\n\n:styleHeading a ui:Heading; ui:contents \"The style of your public profile\".\n\n:backgroundColor a ui:ColorField; ui:property solid:profileBackgroundColor;\n ui:label \"Background color\"; ui:default \"#ffffff\".\n:highlightColor a ui:ColorField; ui:property solid:profileHighlightColor;\n ui:label \"Highlight color\"; ui:default \"#000000\".";
6227
6889
  ;// ./src/editProfilePane/EditOtherPreferences.ts
6228
6890
 
6229
6891
 
@@ -6265,6 +6927,7 @@ function EditOtherPreferencesSection(context, me, editableProfile, store) {
6265
6927
 
6266
6928
 
6267
6929
 
6930
+
6268
6931
  const editProfileView = {
6269
6932
  global: true,
6270
6933
  icon: external_UI_.icons.iconBase + 'noun_492246.svg',
@@ -6336,9 +6999,11 @@ const editProfileView = {
6336
6999
  // Other preferences Section
6337
7000
  main.appendChild(EditOtherPreferencesSection(context, me, editableProfile, store));
6338
7001
  // People you know Section
6339
- main.appendChild(EditFriendsSection(context, me, editableProfile, profile));
7002
+ main.appendChild(EditFriendsSection(context, me, editableProfile));
6340
7003
  // Communities you participate in Section
6341
- main.appendChild(EditProfileCommunitiesSection(context, me, editableProfile, profile));
7004
+ main.appendChild(EditProfileCommunitiesSection(context, me, editableProfile));
7005
+ // Ensure keyboard navigation skips labels (including those rendered as links).
7006
+ skipLabelsFromTabbing(main);
6342
7007
  main.setAttribute('aria-busy', 'false');
6343
7008
  main.focus();
6344
7009
  }).catch(error => {