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.
- package/lib/FriendList.d.ts +0 -1
- package/lib/FriendList.d.ts.map +1 -1
- package/lib/FriendList.js +5 -33
- package/lib/SocialPresenter.js +1 -1
- package/lib/addMeToYourFriends.d.ts +4 -3
- package/lib/addMeToYourFriends.d.ts.map +1 -1
- package/lib/addMeToYourFriends.js +25 -9
- package/lib/editProfilePane/EditCVCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditCVCard.js +2 -7
- package/lib/editProfilePane/EditCommunitiesCard.d.ts +3 -1
- package/lib/editProfilePane/EditCommunitiesCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditCommunitiesCard.js +58 -23
- package/lib/editProfilePane/EditFriendsCard.d.ts +3 -1
- package/lib/editProfilePane/EditFriendsCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditFriendsCard.js +58 -23
- package/lib/editProfilePane/EditOtherPreferences.js +1 -1
- package/lib/editProfilePane/EditProfileView.d.ts +1 -1
- package/lib/editProfilePane/EditProfileView.d.ts.map +1 -1
- package/lib/editProfilePane/EditProfileView.js +7 -3
- package/lib/editProfilePane/EditSocialCard.d.ts.map +1 -1
- package/lib/editProfilePane/EditSocialCard.js +2 -7
- package/lib/editProfilePane/editProfilePresenter.d.ts +4 -0
- package/lib/editProfilePane/editProfilePresenter.d.ts.map +1 -0
- package/lib/editProfilePane/editProfilePresenter.js +108 -0
- package/lib/profile-pane.js +1005 -340
- package/lib/profile-pane.js.map +1 -1
- package/lib/profile-pane.min.js +45 -46
- package/lib/profile-pane.min.js.map +1 -1
- package/lib/rdfFormsHelper.d.ts +1 -0
- package/lib/rdfFormsHelper.d.ts.map +1 -1
- package/lib/rdfFormsHelper.js +125 -0
- package/lib/styles/ProfileCard.css +6 -0
- package/lib/styles/ProfileView.css +3 -5
- package/lib/styles/editProfile.css +62 -0
- package/lib/styles/profileRDFFormsEnforced.css +427 -0
- package/lib/styles/utilities.css +30 -1
- package/lib/texts.d.ts +5 -5
- package/lib/texts.d.ts.map +1 -1
- package/lib/texts.js +5 -5
- package/package.json +9 -6
- package/lib/styles/rdfFormsEnforced.css +0 -186
package/lib/profile-pane.js
CHANGED
|
@@ -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
|
|
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
|
-
/***/
|
|
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, `/*
|
|
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
|
-
|
|
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
|
-
|
|
511
|
-
|
|
512
|
-
margin
|
|
513
|
-
|
|
514
|
-
|
|
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
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
736
|
+
.profile-grid .hoverControl:has(> img:first-child):hover {
|
|
533
737
|
background-color: transparent !important;
|
|
534
738
|
}
|
|
535
739
|
|
|
536
|
-
.profile-
|
|
537
|
-
|
|
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:
|
|
771
|
+
max-width: 96%;
|
|
551
772
|
min-width: 0;
|
|
552
773
|
box-sizing: border-box ;
|
|
553
|
-
|
|
554
|
-
|
|
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
|
|
562
|
-
|
|
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
|
|
567
|
-
|
|
568
|
-
|
|
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 .
|
|
572
|
-
|
|
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
|
|
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
|
-
|
|
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-
|
|
931
|
+
padding-left: var(--spacing-xs);
|
|
932
|
+
padding-top: var(--spacing-sm);
|
|
655
933
|
}
|
|
656
934
|
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
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
|
-
|
|
664
|
-
.
|
|
665
|
-
|
|
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
|
-
/*
|
|
669
|
-
.
|
|
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
|
-
|
|
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
|
|
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 = '
|
|
4839
|
-
const otherPreferencesHeadingText = 'Other
|
|
4840
|
-
const communitiesHeadingText = '
|
|
5196
|
+
const yourContactInformationHeading = 'Your profile';
|
|
5197
|
+
const otherPreferencesHeadingText = 'Other preferences';
|
|
5198
|
+
const communitiesHeadingText = 'Your communities';
|
|
4841
5199
|
const resumeHeadingText = 'Resume';
|
|
4842
|
-
const socialAccountsHeadingText = 'Social
|
|
4843
|
-
const sharedItemsHeadingText = 'Shared
|
|
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
|
-
|
|
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
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6063
|
-
|
|
6064
|
-
|
|
6065
|
-
|
|
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
|
|
6069
|
-
|
|
6070
|
-
|
|
6071
|
-
|
|
6072
|
-
|
|
6073
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
6076
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6140
|
-
|
|
6141
|
-
|
|
6142
|
-
|
|
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
|
|
6146
|
-
|
|
6147
|
-
|
|
6148
|
-
|
|
6149
|
-
|
|
6150
|
-
|
|
6151
|
-
|
|
6152
|
-
|
|
6153
|
-
|
|
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
|
|
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
|
|
7002
|
+
main.appendChild(EditFriendsSection(context, me, editableProfile));
|
|
6340
7003
|
// Communities you participate in Section
|
|
6341
|
-
main.appendChild(EditProfileCommunitiesSection(context, me, editableProfile
|
|
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 => {
|