solid-panes 4.2.4-test.6 → 4.2.4-test.7

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.
@@ -1033,7 +1033,11 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1033
1033
  background-color: var(--color-info-bg) !important;
1034
1034
  }
1035
1035
 
1036
- .contactPane .detailSection {
1036
+ .contactPane .detailSection,
1037
+ .contactPane .addressBookSection {
1038
+ display: flex;
1039
+ flex-direction: column;
1040
+ align-items: stretch;
1037
1041
  flex: 1 1 0; /* allow it to grow but not force wrap */
1038
1042
  min-width: 300px;
1039
1043
  box-sizing: border-box;
@@ -1041,6 +1045,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1041
1045
  }
1042
1046
 
1043
1047
  .contactPane .detailsSectionContent {
1048
+ flex: 1 1 auto;
1044
1049
  min-height: 200px;
1045
1050
  padding: var(--spacing-lg);
1046
1051
  max-width: 900px;
@@ -1178,10 +1183,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1178
1183
  .contactPane .group-loading {
1179
1184
  }
1180
1185
 
1181
- .contactPane .hidden {
1182
- display: none;
1183
- }
1184
-
1185
1186
  /* ── Mint new address book ───────────────────────────────────── */
1186
1187
 
1187
1188
  .contactPane .claimSuccess {
@@ -1220,12 +1221,95 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1220
1221
  }
1221
1222
  }
1222
1223
 
1223
- @media (max-width: 500px) {
1224
+ .contactPane.contactPane--narrow .addressBook-grid {
1225
+ flex-direction: column !important;
1226
+ flex-wrap: wrap !important;
1227
+ }
1228
+
1229
+ .contactPane.contactPane--narrow .addressBookSection,
1230
+ .contactPane.contactPane--narrow .detailSection {
1231
+ flex: 1 1 100% !important;
1232
+ max-width: 100% !important;
1233
+ min-width: 0 !important;
1234
+ width: 100% !important;
1235
+ }
1236
+
1237
+ @media (max-width: 1000px) {
1238
+ /* Stack sidebar + details vertically on narrow screens */
1239
+ .contactPane {
1240
+ min-height: auto !important;
1241
+ }
1242
+
1243
+ .contactPane .addressBook-grid {
1244
+ flex-direction: column !important;
1245
+ flex-wrap: nowrap !important;
1246
+ min-height: auto !important;
1247
+ height: auto !important;
1248
+ }
1249
+
1250
+ .contactPane .addressBookSection,
1251
+ .contactPane .detailSection {
1252
+ order: initial !important;
1253
+ flex: none !important;
1254
+ width: 100% !important;
1255
+ max-width: 100% !important;
1256
+ min-width: 0 !important;
1257
+ }
1258
+
1224
1259
  .contactPane .addressBookSection {
1225
- max-width: 485px;
1260
+ max-height: 60vh !important;
1261
+ min-height: auto !important;
1262
+ overflow-y: auto !important;
1263
+ padding-bottom: var(--spacing-lg) !important;
1264
+ }
1265
+
1266
+ .contactPane .detailSection {
1267
+ max-height: none !important;
1268
+ min-height: auto !important;
1269
+ overflow-y: visible !important;
1270
+ }
1271
+
1272
+ .contactPane .detailsSectionContent {
1273
+ display: flex !important;
1274
+ flex-direction: column !important;
1275
+ justify-content: flex-start !important;
1276
+ align-items: stretch !important;
1277
+ min-height: auto !important;
1278
+ height: auto !important;
1279
+ overflow-y: visible !important;
1280
+ }
1281
+
1282
+ .contactPane .detailSection > .detailsSectionContent {
1283
+ padding-top: var(--spacing-sm) !important;
1284
+ box-sizing: border-box !important;
1285
+ }
1286
+
1287
+ /* Small-screen larger text and spacing */
1288
+ .contactPane,
1289
+ .contactPane * {
1290
+ font-size: 2rem !important;
1291
+ }
1292
+
1293
+ .contactPane .actionButton,
1294
+ .contactPane .searchInput,
1295
+ .contactPane .flatButton,
1296
+ .contactPane .buttonSection button,
1297
+ .contactPane .groupButtonsList button {
1298
+ min-height: calc(var(--min-touch-target) + 0.5em) !important;
1299
+ font-size: 2rem !important;
1300
+ padding: 1em 1em !important;
1301
+ }
1302
+
1303
+ .contactPane .group-membership-item .group-membership-toolbar > img.hoverControlHide, .contactPane .group-membership-item .group-membership-toolbar > [data-testid="deleteButtonWithCheck"],
1304
+ .individualPane .hoverControl img.hoverControlHide,
1305
+ .individualPane .hoverControl [data-testid="deleteButtonWithCheck"] {
1306
+ display: inline-flex !important;
1307
+ visibility: visible !important;
1308
+ opacity: 1 !important;
1226
1309
  }
1227
1310
  }
1228
1311
 
1312
+
1229
1313
  /* Card Section Background */
1230
1314
  .contactPane .section-bg {
1231
1315
  background: var(--color-section-bg);
@@ -1235,67 +1319,19 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1235
1319
  border-radius: 0 !important;
1236
1320
  }
1237
1321
 
1238
- /* Primary Button */
1239
- .contactPane .btn-primary {
1240
- min-height: var(--min-touch-target);
1241
- padding: var(--spacing-sm) var(--spacing-md);
1242
- border: 1px solid var(--color-primary);
1243
- border-radius: var(--border-radius-base);
1244
- background: var(--color-primary);
1245
- color: var(--color-background);
1246
- font-weight: 600;
1247
- cursor: pointer;
1248
- transition: all var(--animation-duration) ease;
1249
- }
1250
-
1251
- .contactPane .btn-primary:hover {
1252
- background: color-mix(in srgb, var(--color-primary) 90%, black);
1253
- box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);
1254
- }
1255
-
1256
- .contactPane .btn-primary:active {
1257
- box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);
1258
- }
1259
-
1260
- .contactPane .btn-primary:disabled {
1261
- opacity: var(--opacity-disabled, 0.6);
1262
- cursor: not-allowed;
1263
- transform: none;
1264
- }
1265
-
1266
- /* Secondary button */
1267
- .contactPane .btn-secondary {
1268
- min-height: var(--min-touch-target);
1269
- padding: var(--spacing-sm) var(--spacing-md);
1270
- border: var(--border-width-thin) solid var(--color-secondary);
1271
- border-radius: var(--border-radius-base);
1272
- background: var(--color-secondary);
1273
- color: var(--color-background);
1274
- font-weight: var(--font-weight-bold);
1275
- cursor: pointer;
1276
- transition: all var(--animation-duration) ease;
1277
- text-decoration: none;
1278
- display: inline-flex;
1279
- align-items: center;
1280
- justify-content: center;
1281
- }
1282
-
1283
- .contactPane .btn-secondary:hover {
1284
- background: color-mix(in srgb, var(--color-secondary) 85%, black);
1285
- }
1286
-
1287
- .contactPane .btn-secondary:disabled {
1288
- opacity: var(--opacity-disabled);
1289
- cursor: not-allowed;
1322
+ /* Keep detail section content anchored at top */
1323
+ .contactPane .detailSection {
1324
+ display: flex;
1325
+ flex-direction: column;
1326
+ justify-content: flex-start;
1327
+ align-items: stretch;
1290
1328
  }
1291
1329
 
1292
- /* Action Button Focus - used by ChatWithMe, ProfileCard */
1293
- .contactPane .action-button-focus:focus,
1294
- .contactPane .action-button-focus:focus-visible {
1295
- outline: 3px solid var(--color-primary) !important;
1296
- outline-offset: 2px !important;
1297
- box-shadow: 0 0 0 2px var(--color-background), 0 0 0 5px rgba(124, 77, 255, 0.25) !important;
1298
- z-index: 1;
1330
+ .contactPane .detailsSectionContent {
1331
+ display: flex;
1332
+ flex-direction: column;
1333
+ justify-content: flex-start;
1334
+ align-items: stretch;
1299
1335
  }
1300
1336
 
1301
1337
  /* ── Button section: horizontal scrollable row ──────────────── */
@@ -1415,34 +1451,37 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1415
1451
  position: relative;
1416
1452
  }
1417
1453
 
1418
- .contactPane .webidControl .personaRow--webid td > div[style*="position: relative"],
1419
- .contactPane .detailsSectionContent .groupButtonsList li > div[style*="position: relative"],
1420
- .contactPane .detailsSectionContent .contact-toolbar > div[style*="position: relative"],
1421
- .contactPane .detailsSectionContent .group-membership-toolbar > div[style*="position: relative"] {
1422
- position: absolute !important;
1423
- top: 0 !important;
1424
- left: 0 !important;
1425
- right: 0;
1426
- bottom: 0;
1427
- width: 100%;
1428
- height: 100%;
1429
- display: flex;
1430
- align-items: center;
1431
- justify-content: center;
1432
- background: rgba(0, 0, 0, 0.3);
1433
- z-index: 1000;
1454
+ .contactPane .webidControl div[style*="position: relative"]:has(> div[style*="display: grid"]) {
1455
+ position: static !important;
1434
1456
  }
1457
+
1458
+
1435
1459
  .contactPane .webidControl .personaRow--webid td > div[style*="position: relative"] > div,
1436
1460
  .contactPane .detailsSectionContent .groupButtonsList li > div[style*="position: relative"] > div,
1437
- .contactPane .detailsSectionContent .contact-toolbar > div[style*="position: relative"] > div,
1438
- .contactPane .detailsSectionContent .group-membership-toolbar > div[style*="position: relative"] > div {
1439
- position: relative !important;
1440
- top: auto !important;
1441
- background: var(--color-background);
1442
- border-radius: var(--border-radius-full);
1443
- padding: var(--spacing-lg);
1444
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2);
1445
- z-index: 1001;
1461
+ .contactPane .detailsSectionContent .contact-toolbar > div[style*="position: relative"] > div {
1462
+ position: absolute !important;
1463
+ top: 0 !important;
1464
+ right: 0 !important;
1465
+ left: auto !important;
1466
+ z-index: 9999 !important;
1467
+ display: grid !important;
1468
+ pointer-events: auto !important;
1469
+ opacity: 1 !important;
1470
+ visibility: visible !important;
1471
+ padding: var(--spacing-btn) !important;
1472
+ min-width: 12em !important;
1473
+ background: var(--color-background) !important;
1474
+ border: var(--border-width-sm) solid var(--color-primary) !important;
1475
+ border-radius: var(--border-radius-base) !important;
1476
+ box-shadow: var(--box-shadow-popup) !important;
1477
+ grid-template-columns: auto auto !important;
1478
+ gap: var(--spacing-xxs) !important;
1479
+ }
1480
+
1481
+ .contactPane .detailsSectionContent .contact-toolbar > div[style*="position: relative"] > div > button:has(> img[src\$=".svg"]),
1482
+ .contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*="position: relative"] > div > button:has(> img[src\$=".svg"]),
1483
+ .contactPane .webidControl .personaRow--webid td > div[style*="position: relative"] > div > button:has(> img[src\$=".svg"]) {
1484
+ background-color: transparent !important;
1446
1485
  }
1447
1486
 
1448
1487
  /* Selected state for All contacts button */
@@ -1565,271 +1604,23 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Focus indicator for keyboard naviga
1565
1604
 
1566
1605
  .contactPane .personLi--error {
1567
1606
  opacity: 0.5;
1568
- }`, "",{"version":3,"sources":["webpack://./src/styles/contactsPane.css"],"names":[],"mappings":"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","sourcesContent":["/* Focus indicator for keyboard navigation */\n.contactPane table tr[tabindex=\"0\"]:focus {\n outline: var(--focus-ring-width) solid var(--color-primary);\n outline-offset: 2px;\n background: var(--color-info-bg);\n}\n/* contactsPane styles — extracted from inline styles in contactsPane.js */\n/* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */\n\n/* ── Layout: Three-column browser ────────────────────────────── */\n\n.contactPane .peopleSection .selected {\n background-color: var(--color-info-bg) !important;\n}\n\n.contactPane .detailSection {\n flex: 1 1 0; /* allow it to grow but not force wrap */\n min-width: 300px;\n box-sizing: border-box;\n background: var(--color-section-bg);\n}\n\n.contactPane .detailsSectionContent {\n min-height: 200px;\n padding: var(--spacing-lg);\n max-width: 900px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.contactPane .detailsSectionContent--wide {\n max-width: 900px;\n}\n\n.contactPane .cardFooter {\n display: flex;\n flex-wrap: nowrap; /* keep buttons inline */\n align-items: center; /* vertical centering if varied heights */\n gap: var(--spacing-xs);\n padding-top: var(--spacing-md);\n margin-top: var(--spacing-md);\n}\n\n.contactPane .detailsSectionContent {\n margin: 0;\n}\n\n/* ── Contact type chooser ───────────────────────────────────── */\n\n.contactPane .contactTypeChooser {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n max-width: 360px;\n}\n\n.contactPane .contactTypeChooser h3 {\n margin: 0 0 var(--spacing-xs) 0;\n font-size: var(--font-size-lg);\n}\n\n.contactPane .contactTypeSelect {\n height: var(--min-touch-target);\n border: 1px solid var(--color-border-pale);\n border-radius: var(--border-radius-base);\n padding: 0 var(--spacing-sm);\n font-size: var(--font-size-sm);\n background: var(--color-section-bg);\n}\n\n/* ── Search ──────────────────────────────────────────────────── */\n\n.contactPane .allGroupsButton {\n border-radius: var(--border-radius-full) !important;\n /* existing styles */\n}\n/* wrapper to position clear icon/button */\n.contactPane .searchDiv {\n position: relative;\n}\n\n.contactPane .searchInput {\n height: var(--min-touch-target);\n border: 1px solid var(--color-border-pale);\n background-color: var(--color-section-bg);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 24 24' width='20' height='20'%3E%3Cpath d='M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99c.41.41 1.09.41 1.5 0s.41-1.09 0-1.5l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 8px center;\n background-size: 20px 20px;\n border-radius: var(--border-radius-base);\n padding: 0 var(--spacing-sm) 0 34px;\n font-size: var(--font-size-base);\n width: 100%;\n box-sizing: border-box;\n}\n\n/* clear button inside search input */\n.contactPane .searchClearButton {\n position: absolute;\n right: var(--spacing-sm);\n top: 50%;\n transform: translateY(-50%);\n border: none;\n background: transparent;\n font-size: var(--font-size-base);\n line-height: 1;\n padding: 0;\n cursor: pointer;\n color: var(--color-text-muted);\n /* visibility is controlled via the generic `.hidden` utility class */\n display: block;\n}\n.contactPane .searchClearButton.hidden {\n display: none;\n}\n.contactPane .searchClearButton:hover {\n color: var(--color-text);\n}\n\n/* ── Contact toolbar (top-right link + delete) ──────────────── */\n\n.contactPane .contact-toolbar {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-xs) 0;\n}\n\n.contactPane .contact-toolbar a img {\n width: 1.3em;\n height: 1em;\n margin: 0;\n}\n\n/* ── \"All\" groups button ─────────────────────────────────────── */\n\n.contactPane .allGroupsButton {\n margin-left: var(--spacing-md);\n font-size: var(--font-size-base);\n}\n\n.contactPane .allGroupsButton--loading {\n background-color: var(--color-primary);\n}\n\n.contactPane .allGroupsButton--active {\n background-color: var(--color-primary);\n color: var(--color-background);\n}\n\n.contactPane .allGroupsButton--loaded {\n background-color: var(--color-primary);\n}\n\n/* ── Selection & visibility states ───────────────────────────── */\n\n.contactPane .group-loading {\n}\n\n.contactPane .hidden {\n display: none;\n}\n\n/* ── Mint new address book ───────────────────────────────────── */\n\n.contactPane .claimSuccess {\n font-size: var(--font-size-xl);\n}\n\n.contactPane {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\n.contactPane .addressBook-grid {\n display: flex;\n flex-wrap: nowrap; /* keep sections side-by-side */\n flex: 1;\n min-width: 50%;\n align-items: stretch;\n width: 100%;\n box-sizing: border-box;\n overflow-x: auto; /* allow horizontal scroll if needed */\n}\n\n.contactPane .addressBookSection {\n flex: 1 1 350px;\n max-width: 485px;\n box-sizing: border-box;\n}\n\n@media ((min-width: 500px) and (max-width: 900px)) {\n .contactPane .addressBookSection {\n max-width: 900px;\n }\n .contactPane .addressBookSection section {\n max-width: 485px;\n }\n}\n\n@media (max-width: 500px) {\n .contactPane .addressBookSection {\n max-width: 485px;\n }\n}\n\n/* Card Section Background */\n.contactPane .section-bg {\n background: var(--color-section-bg);\n padding: var(--spacing-md);\n box-sizing: border-box;\n border: none !important;\n border-radius: 0 !important;\n}\n\n/* Primary Button */\n.contactPane .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: var(--color-background);\n font-weight: 600;\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n}\n\n.contactPane .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.contactPane .btn-primary:active {\n box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);\n}\n\n.contactPane .btn-primary:disabled {\n opacity: var(--opacity-disabled, 0.6);\n cursor: not-allowed;\n transform: none;\n}\n\n/* Secondary button */\n.contactPane .btn-secondary {\n min-height: var(--min-touch-target);\n padding: var(--spacing-sm) var(--spacing-md);\n border: var(--border-width-thin) solid var(--color-secondary);\n border-radius: var(--border-radius-base);\n background: var(--color-secondary);\n color: var(--color-background);\n font-weight: var(--font-weight-bold);\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.contactPane .btn-secondary:hover {\n background: color-mix(in srgb, var(--color-secondary) 85%, black);\n}\n\n.contactPane .btn-secondary:disabled {\n opacity: var(--opacity-disabled);\n cursor: not-allowed;\n}\n\n/* Action Button Focus - used by ChatWithMe, ProfileCard */\n.contactPane .action-button-focus:focus,\n.contactPane .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/* ── Button section: horizontal scrollable row ──────────────── */\n\n.contactPane .buttonSection {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n padding: var(--spacing-sm);\n padding-bottom: 0;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n margin-bottom: 0;\n}\n\n.contactPane .buttonSection::-webkit-scrollbar {\n height: 6px;\n}\n\n.contactPane .buttonSection::-webkit-scrollbar-thumb {\n background: var(--color-border-pale);\n border-radius: var(--border-radius-base);\n}\n\n.contactPane .buttonSection::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.contactPane .buttonSection .selected {\n background: none !important;\n}\n\n.contactPane .groupButtonsList {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--spacing-xs);\n list-style: none;\n}\n\n.contactPane .buttonSection .groupButtonsList {\n margin-left: var(--spacing-xs);\n margin-right: var(--spacing-xs);\n padding-left: 0;\n}\n\n.contactPane .groupButtonsList li {\n flex-shrink: 0;\n}\n\n.contactPane .groupButtonsList button {\n white-space: nowrap;\n flex-shrink: 0;\n min-width: max-content;\n margin-left: 0;\n}\n\n/* Groups list in details section — flexible 2-column grid */\n.contactPane .detailsSectionContent .groupButtonsList {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: var(--spacing-sm);\n list-style: none;\n padding: 0;\n width: 100%;\n box-sizing: border-box;\n}\n\n.contactPane .detailsSectionContent .groupButtonsList li {\n width: 100%;\n aspect-ratio: 1 / 1;\n}\n\n.contactPane .detailsSectionContent .groupButtonsList button {\n width: 100%;\n height: 100%;\n text-align: center;\n border-radius: var(--border-radius-base);\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n@media (max-width: 599px) {\n .contactPane .detailsSectionContent .groupButtonsList {\n grid-template-columns: repeat(2, 1fr);\n gap: var(--spacing-xs);\n }\n\n .contactPane .detailsSectionContent .groupButtonsList button {\n font-size: var(--font-size-sm);\n border-radius: var(--border-radius-base);\n }\n}\n\n@media (min-width: 900px) {\n .contactPane .detailsSectionContent .groupButtonsList {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n.contactPane .detailsSectionContent .newGroupBtn {\n width: 100%;\n box-sizing: border-box;\n margin-top: var(--spacing-sm);\n}\n\n.contactPane .detailsSectionContent h3 {\n font-size: var(--font-size-xl);\n margin-bottom: var(--spacing-sm);\n padding-left: 0;\n}\n\n/* Delete confirmation POPUP — centered overlay in details section */\n.contactPane .detailSection {\n position: relative;\n}\n\n.contactPane .webidControl .personaRow--webid td > div[style*=\"position: relative\"],\n.contactPane .detailsSectionContent .groupButtonsList li > div[style*=\"position: relative\"],\n.contactPane .detailsSectionContent .contact-toolbar > div[style*=\"position: relative\"],\n.contactPane .detailsSectionContent .group-membership-toolbar > div[style*=\"position: relative\"] {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.3);\n z-index: 1000;\n}\n.contactPane .webidControl .personaRow--webid td > div[style*=\"position: relative\"] > div,\n.contactPane .detailsSectionContent .groupButtonsList li > div[style*=\"position: relative\"] > div,\n.contactPane .detailsSectionContent .contact-toolbar > div[style*=\"position: relative\"] > div,\n.contactPane .detailsSectionContent .group-membership-toolbar > div[style*=\"position: relative\"] > div {\n position: relative !important;\n top: auto !important;\n background: var(--color-background);\n border-radius: var(--border-radius-full);\n padding: var(--spacing-lg);\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2);\n z-index: 1001;\n}\n\n/* Selected state for All contacts button */\n.contactPane .allGroupsButton--selected {\n background-color: var(--color-primary);\n color: var(--color-background);\n}\n\n/* ── Header section ──────────────────────────────────────────── */\n\n.contactPane .headerSection {\n background: var(--color-background);\n padding: var(--spacing-sm);\n border-top-left-radius: var(--border-radius-full);\n border-top-right-radius: var(--border-radius-full);\n margin-bottom: 0;\n}\n\n.contactPane .headerSection header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0;\n}\n\n.contactPane .headerSection h2 {\n margin-bottom: 0;\n}\n\n/* ── Dotted horizontal rule ─────────────────────────────────── */\n\n.contactPane .dottedHr {\n border: none;\n border-top: 1px dotted var(--color-text-muted);\n margin: 0;\n}\n\n/* ── Search section ─────────────────────────────────────────── */\n\n.contactPane .searchSection {\n padding: var(--spacing-sm);\n padding-bottom: 0;\n margin-bottom: 0;\n}\n\n/* ── People list section ────────────────────────────────────── */\n\n.contactPane .peopleSection {\n display: flex;\n background: var(--color-background);\n border-top: 1px dotted var(--color-text-muted);\n margin-bottom: 0;\n}\n\n.contactPane .peopleSection ul {\n list-style: none;\n padding: 0;\n margin: 0;\n width: 100%;\n max-height: 70vh;\n overflow-y: auto;\n}\n\n.contactPane .peopleSection li {\n border-top: 1px solid var(--color-border-pale);\n padding: var(--spacing-xs);\n}\n\n/* ── Person list item (addressBookPresenter) ─────────────────── */\n\n.contactPane .personLi-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.contactPane .personLi-avatar {\n width: 45px;\n height: 45px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.contactPane .personLi-avatar .avatar-placeholder {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.contactPane .personLi-avatar img {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n object-fit: cover;\n}\n\n.contactPane .personLi-info {\n flex: 1;\n margin-left: var(--spacing-sm);\n overflow: hidden;\n}\n\n.contactPane .personLi-name {\n font-weight: bold;\n font-size: var(--font-size-base);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.contactPane .personLi-arrow {\n margin-left: auto;\n display: flex;\n align-items: center;\n}\n\n.contactPane .personLi--error {\n opacity: 0.5;\n}"],"sourceRoot":""}]);
1607
+ }`, "",{"version":3,"sources":["webpack://./src/styles/contactsPane.css"],"names":[],"mappings":"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","sourcesContent":["/* Focus indicator for keyboard navigation */\n.contactPane table tr[tabindex=\"0\"]:focus {\n outline: var(--focus-ring-width) solid var(--color-primary);\n outline-offset: 2px;\n background: var(--color-info-bg);\n}\n/* contactsPane styles — extracted from inline styles in contactsPane.js */\n/* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */\n\n/* ── Layout: Three-column browser ────────────────────────────── */\n\n.contactPane .peopleSection .selected {\n background-color: var(--color-info-bg) !important;\n}\n\n.contactPane .detailSection,\n.contactPane .addressBookSection {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n flex: 1 1 0; /* allow it to grow but not force wrap */\n min-width: 300px;\n box-sizing: border-box;\n background: var(--color-section-bg);\n}\n\n.contactPane .detailsSectionContent {\n flex: 1 1 auto;\n min-height: 200px;\n padding: var(--spacing-lg);\n max-width: 900px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.contactPane .detailsSectionContent--wide {\n max-width: 900px;\n}\n\n.contactPane .cardFooter {\n display: flex;\n flex-wrap: nowrap; /* keep buttons inline */\n align-items: center; /* vertical centering if varied heights */\n gap: var(--spacing-xs);\n padding-top: var(--spacing-md);\n margin-top: var(--spacing-md);\n}\n\n.contactPane .detailsSectionContent {\n margin: 0;\n}\n\n/* ── Contact type chooser ───────────────────────────────────── */\n\n.contactPane .contactTypeChooser {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-sm);\n max-width: 360px;\n}\n\n.contactPane .contactTypeChooser h3 {\n margin: 0 0 var(--spacing-xs) 0;\n font-size: var(--font-size-lg);\n}\n\n.contactPane .contactTypeSelect {\n height: var(--min-touch-target);\n border: 1px solid var(--color-border-pale);\n border-radius: var(--border-radius-base);\n padding: 0 var(--spacing-sm);\n font-size: var(--font-size-sm);\n background: var(--color-section-bg);\n}\n\n/* ── Search ──────────────────────────────────────────────────── */\n\n.contactPane .allGroupsButton {\n border-radius: var(--border-radius-full) !important;\n /* existing styles */\n}\n/* wrapper to position clear icon/button */\n.contactPane .searchDiv {\n position: relative;\n}\n\n.contactPane .searchInput {\n height: var(--min-touch-target);\n border: 1px solid var(--color-border-pale);\n background-color: var(--color-section-bg);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 24 24' width='20' height='20'%3E%3Cpath d='M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99c.41.41 1.09.41 1.5 0s.41-1.09 0-1.5l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: 8px center;\n background-size: 20px 20px;\n border-radius: var(--border-radius-base);\n padding: 0 var(--spacing-sm) 0 34px;\n font-size: var(--font-size-base);\n width: 100%;\n box-sizing: border-box;\n}\n\n/* clear button inside search input */\n.contactPane .searchClearButton {\n position: absolute;\n right: var(--spacing-sm);\n top: 50%;\n transform: translateY(-50%);\n border: none;\n background: transparent;\n font-size: var(--font-size-base);\n line-height: 1;\n padding: 0;\n cursor: pointer;\n color: var(--color-text-muted);\n /* visibility is controlled via the generic `.hidden` utility class */\n display: block;\n}\n.contactPane .searchClearButton.hidden {\n display: none;\n}\n.contactPane .searchClearButton:hover {\n color: var(--color-text);\n}\n\n/* ── Contact toolbar (top-right link + delete) ──────────────── */\n\n.contactPane .contact-toolbar {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-xs) 0;\n}\n\n.contactPane .contact-toolbar a img {\n width: 1.3em;\n height: 1em;\n margin: 0;\n}\n\n/* ── \"All\" groups button ─────────────────────────────────────── */\n\n.contactPane .allGroupsButton {\n margin-left: var(--spacing-md);\n font-size: var(--font-size-base);\n}\n\n.contactPane .allGroupsButton--loading {\n background-color: var(--color-primary);\n}\n\n.contactPane .allGroupsButton--active {\n background-color: var(--color-primary);\n color: var(--color-background);\n}\n\n.contactPane .allGroupsButton--loaded {\n background-color: var(--color-primary);\n}\n\n/* ── Selection & visibility states ───────────────────────────── */\n\n.contactPane .group-loading {\n}\n\n/* ── Mint new address book ───────────────────────────────────── */\n\n.contactPane .claimSuccess {\n font-size: var(--font-size-xl);\n}\n\n.contactPane {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n}\n\n.contactPane .addressBook-grid {\n display: flex;\n flex-wrap: nowrap; /* keep sections side-by-side */\n flex: 1;\n min-width: 50%;\n align-items: stretch;\n width: 100%;\n box-sizing: border-box;\n overflow-x: auto; /* allow horizontal scroll if needed */\n}\n\n.contactPane .addressBookSection {\n flex: 1 1 350px;\n max-width: 485px;\n box-sizing: border-box;\n}\n\n@media ((min-width: 500px) and (max-width: 900px)) {\n .contactPane .addressBookSection {\n max-width: 900px;\n }\n .contactPane .addressBookSection section {\n max-width: 485px;\n }\n}\n\n.contactPane.contactPane--narrow .addressBook-grid {\n flex-direction: column !important;\n flex-wrap: wrap !important;\n}\n\n.contactPane.contactPane--narrow .addressBookSection,\n.contactPane.contactPane--narrow .detailSection {\n flex: 1 1 100% !important;\n max-width: 100% !important;\n min-width: 0 !important;\n width: 100% !important;\n}\n\n@media (max-width: 1000px) {\n /* Stack sidebar + details vertically on narrow screens */\n .contactPane {\n min-height: auto !important;\n }\n\n .contactPane .addressBook-grid {\n flex-direction: column !important;\n flex-wrap: nowrap !important;\n min-height: auto !important;\n height: auto !important;\n }\n\n .contactPane .addressBookSection,\n .contactPane .detailSection {\n order: initial !important;\n flex: none !important;\n width: 100% !important;\n max-width: 100% !important;\n min-width: 0 !important;\n }\n\n .contactPane .addressBookSection {\n max-height: 60vh !important;\n min-height: auto !important;\n overflow-y: auto !important;\n padding-bottom: var(--spacing-lg) !important;\n }\n\n .contactPane .detailSection {\n max-height: none !important;\n min-height: auto !important;\n overflow-y: visible !important;\n }\n\n .contactPane .detailsSectionContent {\n display: flex !important;\n flex-direction: column !important;\n justify-content: flex-start !important;\n align-items: stretch !important;\n min-height: auto !important;\n height: auto !important;\n overflow-y: visible !important;\n }\n\n .contactPane .detailSection > .detailsSectionContent {\n padding-top: var(--spacing-sm) !important;\n box-sizing: border-box !important;\n }\n\n /* Small-screen larger text and spacing */\n .contactPane,\n .contactPane * {\n font-size: 2rem !important;\n }\n\n .contactPane .actionButton,\n .contactPane .searchInput,\n .contactPane .flatButton,\n .contactPane .buttonSection button,\n .contactPane .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 .contactPane .group-membership-item .group-membership-toolbar > img.hoverControlHide, .contactPane .group-membership-item .group-membership-toolbar > [data-testid=\"deleteButtonWithCheck\"],\n .individualPane .hoverControl img.hoverControlHide, \n .individualPane .hoverControl [data-testid=\"deleteButtonWithCheck\"] {\n display: inline-flex !important;\n visibility: visible !important;\n opacity: 1 !important;\n }\n}\n\n\n/* Card Section Background */\n.contactPane .section-bg {\n background: var(--color-section-bg);\n padding: var(--spacing-md);\n box-sizing: border-box;\n border: none !important;\n border-radius: 0 !important;\n}\n\n/* Keep detail section content anchored at top */\n.contactPane .detailSection {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: stretch;\n}\n\n.contactPane .detailsSectionContent {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: stretch;\n}\n\n/* ── Button section: horizontal scrollable row ──────────────── */\n\n.contactPane .buttonSection {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n padding: var(--spacing-sm);\n padding-bottom: 0;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: thin;\n margin-bottom: 0;\n}\n\n.contactPane .buttonSection::-webkit-scrollbar {\n height: 6px;\n}\n\n.contactPane .buttonSection::-webkit-scrollbar-thumb {\n background: var(--color-border-pale);\n border-radius: var(--border-radius-base);\n}\n\n.contactPane .buttonSection::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.contactPane .buttonSection .selected {\n background: none !important;\n}\n\n.contactPane .groupButtonsList {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n gap: var(--spacing-xs);\n list-style: none;\n}\n\n.contactPane .buttonSection .groupButtonsList {\n margin-left: var(--spacing-xs);\n margin-right: var(--spacing-xs);\n padding-left: 0;\n}\n\n.contactPane .groupButtonsList li {\n flex-shrink: 0;\n}\n\n.contactPane .groupButtonsList button {\n white-space: nowrap;\n flex-shrink: 0;\n min-width: max-content;\n margin-left: 0;\n}\n\n/* Groups list in details section — flexible 2-column grid */\n.contactPane .detailsSectionContent .groupButtonsList {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: var(--spacing-sm);\n list-style: none;\n padding: 0;\n width: 100%;\n box-sizing: border-box;\n}\n\n.contactPane .detailsSectionContent .groupButtonsList li {\n width: 100%;\n aspect-ratio: 1 / 1;\n}\n\n.contactPane .detailsSectionContent .groupButtonsList button {\n width: 100%;\n height: 100%;\n text-align: center;\n border-radius: var(--border-radius-base);\n word-wrap: break-word;\n overflow-wrap: break-word;\n}\n\n@media (max-width: 599px) {\n .contactPane .detailsSectionContent .groupButtonsList {\n grid-template-columns: repeat(2, 1fr);\n gap: var(--spacing-xs);\n }\n\n .contactPane .detailsSectionContent .groupButtonsList button {\n font-size: var(--font-size-sm);\n border-radius: var(--border-radius-base);\n }\n}\n\n@media (min-width: 900px) {\n .contactPane .detailsSectionContent .groupButtonsList {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n.contactPane .detailsSectionContent .newGroupBtn {\n width: 100%;\n box-sizing: border-box;\n margin-top: var(--spacing-sm);\n}\n\n.contactPane .detailsSectionContent h3 {\n font-size: var(--font-size-xl);\n margin-bottom: var(--spacing-sm);\n padding-left: 0;\n}\n\n/* Delete confirmation POPUP — centered overlay in details section */\n.contactPane .detailSection {\n position: relative;\n}\n\n.contactPane .webidControl div[style*=\"position: relative\"]:has(> div[style*=\"display: grid\"]) {\n position: static !important;\n}\n\n\n.contactPane .webidControl .personaRow--webid td > div[style*=\"position: relative\"] > div,\n.contactPane .detailsSectionContent .groupButtonsList li > div[style*=\"position: relative\"] > div,\n.contactPane .detailsSectionContent .contact-toolbar > div[style*=\"position: relative\"] > div {\n position: absolute !important;\n top: 0 !important;\n right: 0 !important;\n left: auto !important;\n z-index: 9999 !important;\n display: grid !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n visibility: visible !important;\n padding: var(--spacing-btn) !important;\n min-width: 12em !important;\n background: var(--color-background) !important;\n border: var(--border-width-sm) solid var(--color-primary) !important;\n border-radius: var(--border-radius-base) !important;\n box-shadow: var(--box-shadow-popup) !important;\n grid-template-columns: auto auto !important;\n gap: var(--spacing-xxs) !important;\n}\n\n.contactPane .detailsSectionContent .contact-toolbar > div[style*=\"position: relative\"] > div > button:has(> img[src$=\".svg\"]),\n.contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*=\"position: relative\"] > div > button:has(> img[src$=\".svg\"]),\n.contactPane .webidControl .personaRow--webid td > div[style*=\"position: relative\"] > div > button:has(> img[src$=\".svg\"]) {\n background-color: transparent !important;\n}\n\n/* Selected state for All contacts button */\n.contactPane .allGroupsButton--selected {\n background-color: var(--color-primary);\n color: var(--color-background);\n}\n\n/* ── Header section ──────────────────────────────────────────── */\n\n.contactPane .headerSection {\n background: var(--color-background);\n padding: var(--spacing-sm);\n border-top-left-radius: var(--border-radius-full);\n border-top-right-radius: var(--border-radius-full);\n margin-bottom: 0;\n}\n\n.contactPane .headerSection header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0;\n}\n\n.contactPane .headerSection h2 {\n margin-bottom: 0;\n}\n\n/* ── Dotted horizontal rule ─────────────────────────────────── */\n\n.contactPane .dottedHr {\n border: none;\n border-top: 1px dotted var(--color-text-muted);\n margin: 0;\n}\n\n/* ── Search section ─────────────────────────────────────────── */\n\n.contactPane .searchSection {\n padding: var(--spacing-sm);\n padding-bottom: 0;\n margin-bottom: 0;\n}\n\n/* ── People list section ────────────────────────────────────── */\n\n.contactPane .peopleSection {\n display: flex;\n background: var(--color-background);\n border-top: 1px dotted var(--color-text-muted);\n margin-bottom: 0;\n}\n\n.contactPane .peopleSection ul {\n list-style: none;\n padding: 0;\n margin: 0;\n width: 100%;\n max-height: 70vh;\n overflow-y: auto;\n}\n\n.contactPane .peopleSection li {\n border-top: 1px solid var(--color-border-pale);\n padding: var(--spacing-xs);\n}\n\n/* ── Person list item (addressBookPresenter) ─────────────────── */\n\n.contactPane .personLi-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.contactPane .personLi-avatar {\n width: 45px;\n height: 45px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.contactPane .personLi-avatar .avatar-placeholder {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.contactPane .personLi-avatar img {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n object-fit: cover;\n}\n\n.contactPane .personLi-info {\n flex: 1;\n margin-left: var(--spacing-sm);\n overflow: hidden;\n}\n\n.contactPane .personLi-name {\n font-weight: bold;\n font-size: var(--font-size-base);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.contactPane .personLi-arrow {\n margin-left: auto;\n display: flex;\n align-items: center;\n}\n\n.contactPane .personLi--error {\n opacity: 0.5;\n}"],"sourceRoot":""}]);
1569
1608
  // Exports
1570
1609
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
1571
1610
 
1572
1611
 
1573
1612
  /***/ },
1574
1613
 
1575
- /***/ 93
1576
- (module, __nested_webpack_exports__, __nested_webpack_require_35075__) {
1614
+ /***/ 686
1615
+ (module, __nested_webpack_exports__, __nested_webpack_require_37866__) {
1577
1616
 
1578
- /* harmony export */ __nested_webpack_require_35075__.d(__nested_webpack_exports__, {
1617
+ /* harmony export */ __nested_webpack_require_37866__.d(__nested_webpack_exports__, {
1579
1618
  /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1580
1619
  /* harmony export */ });
1581
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_35075__(354);
1582
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_35075__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
1583
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_35075__(314);
1584
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_35075__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
1585
- // Imports
1586
-
1587
-
1588
- 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()));
1589
- // Module
1590
- ___CSS_LOADER_EXPORT___.push([module.id, `/* ── Group Membership Section ──────────────────────────────── */
1591
-
1592
- .contactPane .group-membership-container {
1593
- padding: var(--spacing-sm) 0;
1594
- }
1595
-
1596
- /* Grid wrapper — matches detailsSectionContent groupButtonsList */
1597
- .contactPane .group-pills-wrapper {
1598
- display: grid;
1599
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1600
- gap: var(--spacing-sm);
1601
- list-style: none;
1602
- padding: 0;
1603
- margin: 0;
1604
- width: 100%;
1605
- }
1606
-
1607
- .contactPane .group-pills-wrapper span {
1608
- width: max-content;
1609
- }
1610
-
1611
- /* Each group item: button on top, toolbar below */
1612
- .contactPane .group-membership-item {
1613
- display: flex;
1614
- flex-direction: column;
1615
- align-items: stretch;
1616
- max-width: 256px;
1617
- }
1618
-
1619
- .contactPane .group-membership-item > button {
1620
- width: 100%;
1621
- text-align: center;
1622
- border-radius: var(--border-radius-base);
1623
- word-wrap: break-word;
1624
- overflow-wrap: break-word;
1625
- min-height: var(--min-touch-target);
1626
- }
1627
-
1628
- /* Toolbar with link icon and delete button below each group button */
1629
- .contactPane .group-membership-toolbar {
1630
- display: flex;
1631
- justify-content: flex-end;
1632
- align-items: center;
1633
- gap: var(--spacing-xs);
1634
- padding: var(--spacing-xs) 0 0 0;
1635
- }
1636
-
1637
- .contactPane .group-membership-toolbar a img {
1638
- width: 1.3em;
1639
- height: 1em;
1640
- margin: 0;
1641
- }
1642
-
1643
- @media (max-width: 599px) {
1644
- .contactPane .group-pills-wrapper {
1645
- grid-template-columns: repeat(2, 1fr);
1646
- gap: var(--spacing-xs);
1647
- max-width: 100%;
1648
- }
1649
-
1650
- .contactPane .group-membership-item > button {
1651
- font-size: var(--font-size-sm);
1652
- border-radius: var(--border-radius-base);
1653
- }
1654
- }
1655
-
1656
- @media (min-width: 900px) {
1657
- .contactPane .group-pills-wrapper {
1658
- grid-template-columns: repeat(3, 1fr);
1659
- gap: var(--spacing-sm);
1660
- }
1661
- }
1662
- `, "",{"version":3,"sources":["webpack://./src/styles/groupMembership.css"],"names":[],"mappings":"AAAA,iEAAiE;;AAEjE;EACE,4BAA4B;AAC9B;;AAEA,kEAAkE;AAClE;EACE,aAAa;EACb,2DAA2D;EAC3D,sBAAsB;EACtB,gBAAgB;EAChB,UAAU;EACV,SAAS;EACT,WAAW;AACb;;AAEA;EACE,kBAAkB;AACpB;;AAEA,kDAAkD;AAClD;EACE,aAAa;EACb,sBAAsB;EACtB,oBAAoB;EACpB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,wCAAwC;EACxC,qBAAqB;EACrB,yBAAyB;EACzB,mCAAmC;AACrC;;AAEA,qEAAqE;AACrE;EACE,aAAa;EACb,yBAAyB;EACzB,mBAAmB;EACnB,sBAAsB;EACtB,gCAAgC;AAClC;;AAEA;EACE,YAAY;EACZ,WAAW;EACX,SAAS;AACX;;AAEA;EACE;IACE,qCAAqC;IACrC,sBAAsB;IACtB,eAAe;EACjB;;EAEA;IACE,8BAA8B;IAC9B,wCAAwC;EAC1C;AACF;;AAEA;EACE;IACE,qCAAqC;IACrC,sBAAsB;EACxB;AACF","sourcesContent":["/* ── Group Membership Section ──────────────────────────────── */\n\n.contactPane .group-membership-container {\n padding: var(--spacing-sm) 0;\n}\n\n/* Grid wrapper — matches detailsSectionContent groupButtonsList */\n.contactPane .group-pills-wrapper {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: var(--spacing-sm);\n list-style: none;\n padding: 0;\n margin: 0;\n width: 100%;\n}\n\n.contactPane .group-pills-wrapper span {\n width: max-content;\n}\n\n/* Each group item: button on top, toolbar below */\n.contactPane .group-membership-item {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n max-width: 256px;\n}\n\n.contactPane .group-membership-item > button {\n width: 100%;\n text-align: center;\n border-radius: var(--border-radius-base);\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-height: var(--min-touch-target);\n}\n\n/* Toolbar with link icon and delete button below each group button */\n.contactPane .group-membership-toolbar {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) 0 0 0;\n}\n\n.contactPane .group-membership-toolbar a img {\n width: 1.3em;\n height: 1em;\n margin: 0;\n}\n\n@media (max-width: 599px) {\n .contactPane .group-pills-wrapper {\n grid-template-columns: repeat(2, 1fr);\n gap: var(--spacing-xs);\n max-width: 100%;\n }\n\n .contactPane .group-membership-item > button {\n font-size: var(--font-size-sm);\n border-radius: var(--border-radius-base);\n }\n}\n\n@media (min-width: 900px) {\n .contactPane .group-pills-wrapper {\n grid-template-columns: repeat(3, 1fr);\n gap: var(--spacing-sm);\n }\n}\n"],"sourceRoot":""}]);
1663
- // Exports
1664
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
1665
-
1666
-
1667
- /***/ },
1668
-
1669
- /***/ 479
1670
- (module, __nested_webpack_exports__, __nested_webpack_require_40550__) {
1671
-
1672
- /* harmony export */ __nested_webpack_require_40550__.d(__nested_webpack_exports__, {
1673
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1674
- /* harmony export */ });
1675
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_40550__(354);
1676
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_40550__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
1677
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_40550__(314);
1678
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_40550__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
1679
- // Imports
1680
-
1681
-
1682
- 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()));
1683
- // Module
1684
- ___CSS_LOADER_EXPORT___.push([module.id, `/* individual.js styles — extracted from inline styles */
1685
-
1686
- /* ── Individual pane container ───────────────────────────────── */
1687
-
1688
- .individualPane {
1689
- padding: var(--spacing-xs) var(--spacing-lg) var(--spacing-md) var(--spacing-lg);
1690
- background: var(--color-section-bg);
1691
- border-radius: var(--border-radius-full);
1692
- box-shadow: var(--box-shadow);
1693
- box-sizing: border-box;
1694
- max-width: 100%;
1695
- }`, "",{"version":3,"sources":["webpack://./src/styles/individual.css"],"names":[],"mappings":"AAAA,wDAAwD;;AAExD,mEAAmE;;AAEnE;EACE,gFAAgF;EAChF,mCAAmC;EACnC,wCAAwC;EACxC,6BAA6B;EAC7B,sBAAsB;EACtB,eAAe;AACjB","sourcesContent":["/* individual.js styles — extracted from inline styles */\n\n/* ── Individual pane container ───────────────────────────────── */\n\n.individualPane {\n padding: var(--spacing-xs) var(--spacing-lg) var(--spacing-md) var(--spacing-lg);\n background: var(--color-section-bg);\n border-radius: var(--border-radius-full);\n box-shadow: var(--box-shadow);\n box-sizing: border-box;\n max-width: 100%;\n}"],"sourceRoot":""}]);
1696
- // Exports
1697
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
1698
-
1699
-
1700
- /***/ },
1701
-
1702
- /***/ 546
1703
- (module, __nested_webpack_exports__, __nested_webpack_require_42917__) {
1704
-
1705
- /* harmony export */ __nested_webpack_require_42917__.d(__nested_webpack_exports__, {
1706
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1707
- /* harmony export */ });
1708
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_42917__(354);
1709
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_42917__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
1710
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_42917__(314);
1711
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_42917__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
1712
- // Imports
1713
-
1714
-
1715
- 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()));
1716
- // Module
1717
- ___CSS_LOADER_EXPORT___.push([module.id, `/* CSS for the accessible modal dialogs created by localUtils.js */
1718
-
1719
- /* backdrop / focus trap container */
1720
- .focus-trap {
1721
- position: fixed;
1722
- top: 0;
1723
- left: 0;
1724
- width: 100%;
1725
- height: 100%;
1726
- z-index: 9999;
1727
- background: rgba(0, 0, 0, 0.5);
1728
- display: flex;
1729
- justify-content: center;
1730
- align-items: center;
1731
- }
1732
-
1733
- .focus-trap.hidden {
1734
- display: none;
1735
- }
1736
-
1737
- /* inner dialog box */
1738
- .focus-trap .modal {
1739
- background: var(--color-background);
1740
- padding: var(--spacing-lg);
1741
- border-radius: var(--border-radius-base);
1742
- max-width: 90%;
1743
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
1744
- }
1745
-
1746
- /* button container: center buttons horizontally (uses id in markup) */
1747
- #contacts-modal #modal-buttons {
1748
- margin-top: var(--spacing-md);
1749
- display: flex;
1750
- justify-content: center;
1751
- gap: var(--spacing-sm);
1752
- }
1753
-
1754
- /* buttons themselves use the shared btn-primary rules */
1755
- #contacts-modal .modal button {
1756
- min-height: var(--min-touch-target);
1757
- padding: var(--spacing-sm) var(--spacing-md);
1758
- border: 1px solid var(--color-primary);
1759
- border-radius: var(--border-radius-base);
1760
- font-weight: 600;
1761
- cursor: pointer;
1762
- transition: all var(--animation-duration) ease;
1763
- }
1764
-
1765
- #contacts-modal .modal button.btn-primary {
1766
- background: var(--color-primary);
1767
- color: var(--color-background);
1768
- }
1769
-
1770
- #contacts-modal .modal button.btn-primary:hover {
1771
- background: color-mix(in srgb, var(--color-primary) 90%, black);
1772
- box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);
1773
- }
1774
-
1775
- #contacts-modal .modal button.btn-primary:active {
1776
- box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);
1777
- }
1778
-
1779
- #contacts-modal .modal button:disabled {
1780
- opacity: var(--opacity-disabled, 0.6);
1781
- cursor: not-allowed;
1782
- transform: none;
1783
- }
1784
- `, "",{"version":3,"sources":["webpack://./src/styles/localUtils.css"],"names":[],"mappings":"AAAA,kEAAkE;;AAElE,oCAAoC;AACpC;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,WAAW;EACX,YAAY;EACZ,aAAa;EACb,8BAA8B;EAC9B,aAAa;EACb,uBAAuB;EACvB,mBAAmB;AACrB;;AAEA;EACE,aAAa;AACf;;AAEA,qBAAqB;AACrB;EACE,mCAAmC;EACnC,0BAA0B;EAC1B,wCAAwC;EACxC,cAAc;EACd,yCAAyC;AAC3C;;AAEA,sEAAsE;AACtE;EACE,6BAA6B;EAC7B,aAAa;EACb,uBAAuB;EACvB,sBAAsB;AACxB;;AAEA,wDAAwD;AACxD;EACE,mCAAmC;EACnC,4CAA4C;EAC5C,sCAAsC;EACtC,wCAAwC;EACxC,gBAAgB;EAChB,eAAe;EACf,8CAA8C;AAChD;;AAEA;EACE,gCAAgC;EAChC,8BAA8B;AAChC;;AAEA;EACE,+DAA+D;EAC/D,6CAA6C;AAC/C;;AAEA;EACE,6CAA6C;AAC/C;;AAEA;EACE,qCAAqC;EACrC,mBAAmB;EACnB,eAAe;AACjB","sourcesContent":["/* CSS for the accessible modal dialogs created by localUtils.js */\n\n/* backdrop / focus trap container */\n.focus-trap {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 9999;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.focus-trap.hidden {\n display: none;\n}\n\n/* inner dialog box */\n.focus-trap .modal {\n background: var(--color-background);\n padding: var(--spacing-lg);\n border-radius: var(--border-radius-base);\n max-width: 90%;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);\n}\n\n/* button container: center buttons horizontally (uses id in markup) */\n#contacts-modal #modal-buttons {\n margin-top: var(--spacing-md);\n display: flex;\n justify-content: center;\n gap: var(--spacing-sm);\n}\n\n/* buttons themselves use the shared btn-primary rules */\n#contacts-modal .modal button {\n min-height: var(--min-touch-target);\n padding: var(--spacing-sm) var(--spacing-md);\n border: 1px solid var(--color-primary);\n border-radius: var(--border-radius-base);\n font-weight: 600;\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n}\n\n#contacts-modal .modal button.btn-primary {\n background: var(--color-primary);\n color: var(--color-background);\n}\n\n#contacts-modal .modal button.btn-primary:hover {\n background: color-mix(in srgb, var(--color-primary) 90%, black);\n box-shadow: 0 2px 4px rgba(124, 77, 255, 0.2);\n}\n\n#contacts-modal .modal button.btn-primary:active {\n box-shadow: 0 1px 2px rgba(124, 77, 255, 0.2);\n}\n\n#contacts-modal .modal button:disabled {\n opacity: var(--opacity-disabled, 0.6);\n cursor: not-allowed;\n transform: none;\n}\n"],"sourceRoot":""}]);
1785
- // Exports
1786
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
1787
-
1788
-
1789
- /***/ },
1790
-
1791
- /***/ 715
1792
- (module, __nested_webpack_exports__, __nested_webpack_require_48340__) {
1793
-
1794
- /* harmony export */ __nested_webpack_require_48340__.d(__nested_webpack_exports__, {
1795
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1796
- /* harmony export */ });
1797
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_48340__(354);
1798
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_48340__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
1799
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_48340__(314);
1800
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_48340__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
1801
- // Imports
1802
-
1803
-
1804
- 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()));
1805
- // Module
1806
- ___CSS_LOADER_EXPORT___.push([module.id, `/* mugshotGallery.js styles — extracted from inline styles */
1807
- /* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */
1808
-
1809
- /* ── Mugshot image ───────────────────────────────────────────── */
1810
-
1811
- .contactPane .mugshotImage {
1812
- max-height: 10em;
1813
- border-radius: var(--border-radius-full);
1814
- margin: var(--spacing-sm);
1815
- }
1816
- `, "",{"version":3,"sources":["webpack://./src/styles/mugshotGallery.css"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,qFAAqF;;AAErF,mEAAmE;;AAEnE;EACE,gBAAgB;EAChB,wCAAwC;EACxC,yBAAyB;AAC3B","sourcesContent":["/* mugshotGallery.js styles — extracted from inline styles */\n/* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */\n\n/* ── Mugshot image ───────────────────────────────────────────── */\n\n.contactPane .mugshotImage {\n max-height: 10em;\n border-radius: var(--border-radius-full);\n margin: var(--spacing-sm);\n}\n"],"sourceRoot":""}]);
1817
- // Exports
1818
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
1819
-
1820
-
1821
- /***/ },
1822
-
1823
- /***/ 434
1824
- (module, __nested_webpack_exports__, __nested_webpack_require_50588__) {
1825
-
1826
- /* harmony export */ __nested_webpack_require_50588__.d(__nested_webpack_exports__, {
1827
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1828
- /* harmony export */ });
1829
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_50588__(354);
1830
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_50588__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
1831
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_50588__(314);
1832
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_50588__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
1620
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_37866__(354);
1621
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_37866__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
1622
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_37866__(314);
1623
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_37866__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
1833
1624
  // Imports
1834
1625
 
1835
1626
 
@@ -1849,13 +1640,34 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
1849
1640
  vertical-align: middle;
1850
1641
  }
1851
1642
 
1643
+ .individualPane .hoverControl,
1644
+ .contactPane .hoverControl {
1645
+ position: relative;
1646
+ }
1647
+
1648
+ /* In contactPane, hover controls in table cells may contain a link + delete icon.
1649
+ Make the cell grow and keep the delete icon right-aligned (no overlap). */
1650
+ .contactPane td.hoverControl:has(> a) {
1651
+ width: auto !important;
1652
+ min-width: 4em !important;
1653
+ justify-content: space-between !important;
1654
+ }
1655
+
1656
+ .contactPane td.hoverControl:has(> a) > a {
1657
+ flex: 1 1 auto;
1658
+ min-width: 0;
1659
+ overflow-wrap: anywhere;
1660
+ word-break: break-word;
1661
+ white-space: normal;
1662
+ }
1663
+
1852
1664
  .individualPane .hoverControl:has(> img:first-child),
1853
1665
  .contactPane .hoverControl:has(> img:first-child) {
1854
1666
  background-color: transparent !important;
1855
1667
  border: none !important;
1856
1668
  margin: 0 !important;
1857
1669
  border-radius: 0 !important;
1858
- padding: 0.7em !important;
1670
+ padding: var(--spacing-btn) !important;
1859
1671
  min-height: var(--min-touch-target);
1860
1672
  min-width: var(--min-touch-target);
1861
1673
  cursor: pointer;
@@ -1864,22 +1676,11 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
1864
1676
  justify-content: center;
1865
1677
  }
1866
1678
 
1867
- .individualPane .hoverControlHide,
1868
- .contactPane .hoverControlHide {
1869
- width: 1.5em !important;
1870
- height: 1.5em !important;
1871
- display: block;
1872
- margin-top: 0 !important;
1873
- margin-left: 0 !important;
1874
- margin-right: 0 !important;
1875
- margin-bottom: 0.3em !important;
1876
- }
1877
-
1878
1679
  .individualPane .hoverControl:has(> img:first-child) > span,
1879
1680
  .contactPane .hoverControl:has(> img:first-child) > span {
1880
1681
  display: inline-flex;
1881
1682
  align-items: center;
1882
- margin-left: 0.3em;
1683
+ margin-left: var(--spacing-xxs);
1883
1684
  }
1884
1685
 
1885
1686
  .individualPane div[style*="padding: 0.5em"]:has(> img),
@@ -1890,20 +1691,65 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
1890
1691
 
1891
1692
  .individualPane div[style*="padding: 0.5em"]:has(> img) > span,
1892
1693
  .contactPane div[style*="padding: 0.5em"]:has(> img) > span {
1893
- margin-left: 0.3em;
1694
+ margin-left: var(--spacing-xxs);
1894
1695
  }
1895
1696
 
1896
1697
  .individualPane .hoverControl:has(> img:first-child):hover,
1897
1698
  .contactPane .hoverControl:has(> img:first-child):hover {
1898
- background-color: transparent !important;
1699
+ background-color: var(--color-section-bg) !important;
1899
1700
  }
1900
1701
 
1901
1702
  .individualPane button:has(> img[src\$=".svg"]),
1902
1703
  .contactPane button:has(> img[src\$=".svg"]) {
1903
- background-color: transparent !important;
1704
+ background-color: var(--color-section-bg) !important;
1904
1705
  border: none !important;
1905
1706
  margin: 0 !important;
1906
1707
  border-radius: 0 !important;
1708
+ box-shadow: none !important;
1709
+ transition: background-color 0.2s ease, box-shadow 0.2s ease;
1710
+ }
1711
+
1712
+ /* Ensure certain icon images render at a consistent size and align nicely when adjacent. */
1713
+ img[src\$="red.svg"],
1714
+ img[src\$="go-to-this.png"] {
1715
+ width: 1.2em !important;
1716
+ height: 1.2em !important;
1717
+ max-width: none !important;
1718
+ max-height: none !important;
1719
+ object-fit: contain;
1720
+ display: inline-block;
1721
+ vertical-align: middle;
1722
+ }
1723
+
1724
+ /* If the SVG button is inside a statsLog wrapper, add pink background to the button only. */
1725
+ .individualPane .statsLog button:has(> img[src\$=".svg"]),
1726
+ .contactPane .statsLog button:has(> img[src\$=".svg"]) {
1727
+ background-color: var(--color-info-bg) !important;
1728
+ border: initial !important;
1729
+ margin: initial !important;
1730
+ border-radius: initial !important;
1731
+ }
1732
+
1733
+ /* Hide the “Continue” icon button that Solid-UI sometimes renders below textareas. */
1734
+ .individualPane button:has(> img[title="Continue"]),
1735
+ .contactPane button:has(> img[title="Continue"]) {
1736
+ display: none !important;
1737
+ }
1738
+
1739
+ /* Allow “Continue” buttons inside contactFormContainer to be visible. */
1740
+ .individualPane .contactFormContainer button:has(> img[src\$="noun_1180158.svg"]),
1741
+ .contactPane .contactFormContainer button:has(> img[src\$="noun_1180158.svg"]),
1742
+ .individualPane .contactFormContainer button:has(> img[title="Continue"]),
1743
+ .contactPane .contactFormContainer button:has(> img[title="Continue"]) {
1744
+ display: inline-flex !important;
1745
+ }
1746
+
1747
+ /* Exception: allow “Continue” buttons inside statsLog to remain visible. */
1748
+ .individualPane .statsLog button:has(> img[title="Continue"]),
1749
+ .contactPane .statsLog button:has(> img[title="Continue"]),
1750
+ .individualPane .webidControl button:has(> img[title="Continue"]),
1751
+ .contactPane .webidControl button:has(> img[title="Continue"]){
1752
+ display: inline-flex !important;
1907
1753
  }
1908
1754
 
1909
1755
  .individualPane button,
@@ -1913,25 +1759,49 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
1913
1759
  }
1914
1760
 
1915
1761
  .individualPane input:not([type="color"]),
1916
- .contactPane input:not([type="color"]),
1917
- .individualPane textarea,
1918
- .contactPane textarea,
1919
- .individualPane select,
1920
- .contactPane select {
1921
- max-width: 100%;
1762
+ .contactPane input:not([type="color"]) {
1763
+ width: 99%;
1764
+ max-width: 99%;
1922
1765
  min-width: 0;
1923
- box-sizing: border-box ;
1766
+ box-sizing: border-box;
1924
1767
  font: inherit;
1925
1768
  color: var(--color-text);
1926
1769
  background-color: var(--color-card-bg) !important;
1927
1770
  border: 1px solid var(--color-border-pale);
1771
+ margin-left: 0 !important;
1772
+ margin-right: 0 !important;
1928
1773
  }
1929
1774
 
1930
1775
  .individualPane textarea,
1931
- .contactPane textarea {
1932
- border-color: var(--color-border-pale) !important;
1776
+ .contactPane textarea,
1777
+ .individualPane .formFieldValue textarea,
1778
+ .contactPane .formFieldValue textarea {
1779
+ appearance: none;
1780
+ -webkit-appearance: none;
1781
+ border-radius: var(--border-radius-sm) !important;
1782
+ border: var(--border-width-xthin) solid var(--color-border-accent) !important;
1783
+ width: 99%;
1784
+ max-width: 99%;
1785
+ box-sizing: border-box;
1786
+ font: inherit;
1787
+ color: var(--color-text);
1788
+ background-color: var(--color-card-bg) !important;
1933
1789
  margin: 0 !important;
1934
- padding: 0 !important;
1790
+ margin-top: var(--spacing-xs);
1791
+ margin-left: 0 !important;
1792
+ margin-right: 0 !important;
1793
+ padding: var(--spacing-xs) !important;
1794
+ }
1795
+
1796
+ .individualPane select,
1797
+ .contactPane select {
1798
+ max-width: 99%;
1799
+ min-width: 0;
1800
+ box-sizing: border-box;
1801
+ font: inherit;
1802
+ color: var(--color-text);
1803
+ background-color: var(--color-card-bg) !important;
1804
+ border: 1px solid var(--color-border-pale);
1935
1805
  }
1936
1806
 
1937
1807
  .individualPane input[type="date"],
@@ -1964,7 +1834,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
1964
1834
 
1965
1835
  .individualPane input[type="url"],
1966
1836
  .contactPane input[type="url"] {
1967
- width: 100%;
1837
+ width: 99%;
1968
1838
  }
1969
1839
 
1970
1840
  .individualPane .formFieldValue,
@@ -1994,21 +1864,28 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
1994
1864
  .contactPane .formFieldValue input:not([type="color"]),
1995
1865
  .individualPane .formFieldValue textarea,
1996
1866
  .contactPane .formFieldValue textarea {
1997
- width: 100%;
1998
- max-width: 100%;
1867
+ width: 99% !important;
1868
+ max-width: 99%;
1869
+ }
1870
+
1871
+ /* Email and phone value inputs: do not stretch full width */
1872
+ .individualPane .formFieldName:has(a[href="http://www.w3.org/2006/vcard/ns#value"]) + .formFieldValue input:not([type="color"]),
1873
+ .contactPane .formFieldName:has(a[href="http://www.w3.org/2006/vcard/ns#value"]) + .formFieldValue input:not([type="color"]) {
1874
+ width: 98% !important;
1875
+ max-width: 98%;
1999
1876
  }
2000
1877
 
2001
1878
  .individualPane .formFieldValue select,
2002
1879
  .contactPane .formFieldValue select {
2003
- width: 100%;
1880
+ width: 99%;
2004
1881
  display: inline-block;
2005
1882
  max-width: none !important;
2006
1883
  }
2007
1884
 
2008
1885
  .individualPane select#formSelect,
2009
1886
  .contactPane select#formSelect {
2010
- width: 100%;
2011
- max-width: 97%;
1887
+ width: 99%;
1888
+ max-width: 98%;
2012
1889
  box-sizing: border-box;
2013
1890
  margin-left: 0 !important;
2014
1891
  margin-right: 0 !important;
@@ -2056,7 +1933,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2056
1933
  .individualPane .choiceBox .classifierBox-label,
2057
1934
  .contactPane .choiceBox .classifierBox-label {
2058
1935
  margin-right: 0;
2059
- padding-left: 0.3em;
1936
+ padding-left: var(--spacing-xxs);
2060
1937
  }
2061
1938
 
2062
1939
  .individualPane .choiceBox .choiceBox-selectBox select,
@@ -2069,9 +1946,9 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2069
1946
  .individualPane .classifierBox .classifierBox-label,
2070
1947
  .contactPane .classifierBox .classifierBox-label {
2071
1948
  margin-right: 0;
2072
- padding-left: 0.3em;
1949
+ padding-left: var(--spacing-xxs);
2073
1950
  width: 8em;
2074
- padding: 0.3em;
1951
+ padding: var(--spacing-xxs);
2075
1952
  vertical-align: middle;
2076
1953
  }
2077
1954
 
@@ -2127,27 +2004,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2127
2004
  min-width: 0;
2128
2005
  }
2129
2006
 
2130
- .individualPane textarea,
2131
- .contactPane textarea,
2132
- .individualPane .formFieldValue textarea,
2133
- .contactPane .formFieldValue textarea {
2134
- appearance: none;
2135
- -webkit-appearance: none;
2136
- border-radius: 0.2em !important;
2137
- border: 0.05em solid #88c !important;
2138
- width: 100%;
2139
- box-sizing: border-box;
2140
- margin-top: var(--spacing-xs);
2141
- margin-left: 0 !important;
2142
- margin-right: 0 !important;
2143
- }
2144
-
2145
- /* Add horizontal gap between label and textarea for all label+textarea pairs. */
2146
- .individualPane div:has(> a) + div:has(textarea),
2147
- .contactPane div:has(> a) + div:has(textarea) {
2148
- margin-left: var(--spacing-sm);
2149
- }
2150
-
2151
2007
  /* Center textarea label vertically in flex rows. */
2152
2008
  .individualPane div[style*="display: flex"][style*="flex-direction: row"]:has(textarea),
2153
2009
  .contactPane div[style*="display: flex"][style*="flex-direction: row"]:has(textarea) {
@@ -2188,13 +2044,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2188
2044
  vertical-align: baseline;
2189
2045
  }
2190
2046
 
2191
- .individualPane input:not([type="color"]),
2192
- .contactPane input:not([type="color"]) {
2193
- width: 100%;
2194
- margin-left: 0 !important;
2195
- margin-right: 0 !important;
2196
- }
2197
-
2198
2047
  .individualPane input:disabled,
2199
2048
  .contactPane input:disabled,
2200
2049
  .individualPane textarea:disabled,
@@ -2211,15 +2060,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2211
2060
  .contactPane textarea:read-only {
2212
2061
  background-color: var(--color-background) !important;
2213
2062
  cursor: not-allowed;
2214
- opacity: 0.75;
2215
- border: 0.05em solid var(--color-background) !important;
2216
- }
2217
-
2218
- .individualPane textarea,
2219
- .contactPane textarea,
2220
- .individualPane .formFieldValue textarea,
2221
- .contactPane .formFieldValue textarea {
2222
- padding: var(--spacing-xs) !important;
2063
+ opacity: var(--opacity-input-disabled);
2064
+ border: var(--border-width-xthin) solid var(--color-background) !important;
2223
2065
  }
2224
2066
 
2225
2067
  .contactPane .webidControl table td div.contactPane.namedPane {
@@ -2233,21 +2075,337 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2233
2075
 
2234
2076
  /* selectors that match the old inline-styled markup when no classes can be added */
2235
2077
 
2236
- /* outer container: position relative containing an absolute grid popup */
2237
- .contactPane div[style*="position: relative"] > div[style*="position: absolute"][style*="display: grid"] {
2078
+ /* Delete pop up */
2079
+ /* Remove the intermediate positioned ancestor so the popup anchors to .hoverControl instead */
2080
+ .individualPane div[style*="position: relative"]:has(> div[style*="display: grid"]) {
2081
+ position: static !important;
2082
+ }
2083
+
2084
+ .individualPane div[style*="position: relative"] > div[style*="display: grid"] {
2238
2085
  /* override inline values with theme variables */
2239
- position: absolute;
2240
- top: -1em;
2241
- padding: 0.7em !important;
2086
+ position: absolute !important;
2087
+ top: 0 !important;
2088
+ right: 0 !important;
2089
+ left: auto !important;
2090
+ z-index: 9999 !important;
2091
+ display: grid !important;
2092
+ pointer-events: auto !important;
2093
+ opacity: 1 !important;
2094
+ visibility: visible !important;
2095
+ padding: var(--spacing-btn) !important;
2242
2096
  background: var(--color-background) !important;
2243
- border: 0.1em solid var(--color-primary) !important;
2097
+ border: var(--border-width-sm) solid var(--color-primary) !important;
2244
2098
  border-radius: var(--border-radius-base) !important;
2245
- box-shadow: 0 0.5em 0.9em rgba(0, 0, 0, 0.2) !important;
2246
- display: grid;
2247
- grid-template-columns: auto auto;
2248
- gap: 0.3em;
2249
- z-index: 10;
2250
- }`, "",{"version":3,"sources":["webpack://./src/styles/rdfFormsEnforced.css"],"names":[],"mappings":"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","sourcesContent":["/* Solid-UI form */\n\n/* Vertically center autocomplete input in .formFieldValue */\n.individualPane .formFieldValue > div[style*=\"flex-direction: row\"],\n.contactPane .formFieldValue > div[style*=\"flex-direction: row\"] {\n align-items: center;\n display: flex;\n}\n\n.individualPane .formFieldValue input[data-testid=\"autocomplete-input\"],\n.contactPane .formFieldValue input[data-testid=\"autocomplete-input\"] {\n vertical-align: middle;\n}\n\n.individualPane .hoverControl:has(> img:first-child),\n.contactPane .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.individualPane .hoverControlHide,\n.contactPane .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.individualPane .hoverControl:has(> img:first-child) > span,\n.contactPane .hoverControl:has(> img:first-child) > span {\n display: inline-flex;\n align-items: center;\n margin-left: 0.3em;\n}\n\n.individualPane div[style*=\"padding: 0.5em\"]:has(> img),\n.contactPane div[style*=\"padding: 0.5em\"]:has(> img) {\n display: inline-flex;\n align-items: center;\n}\n\n.individualPane div[style*=\"padding: 0.5em\"]:has(> img) > span,\n.contactPane div[style*=\"padding: 0.5em\"]:has(> img) > span {\n margin-left: 0.3em;\n}\n\n.individualPane .hoverControl:has(> img:first-child):hover,\n.contactPane .hoverControl:has(> img:first-child):hover {\n background-color: transparent !important;\n}\n\n.individualPane button:has(> img[src$=\".svg\"]),\n.contactPane 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.individualPane button,\n.contactPane button {\n min-height: var(--min-touch-target);\n min-width: var(--min-touch-target);\n}\n\n.individualPane input:not([type=\"color\"]),\n.contactPane input:not([type=\"color\"]),\n.individualPane textarea,\n.contactPane textarea,\n.individualPane select,\n.contactPane select {\n max-width: 100%;\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.individualPane textarea,\n.contactPane textarea {\n border-color: var(--color-border-pale) !important;\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.individualPane input[type=\"date\"],\n.contactPane input[type=\"date\"],\n.individualPane input[type=\"month\"],\n.contactPane input[type=\"month\"],\n.individualPane input[type=\"week\"],\n.contactPane input[type=\"week\"],\n.individualPane input[type=\"time\"],\n.contactPane input[type=\"time\"],\n.individualPane input[type=\"datetime-local\"],\n.contactPane input[type=\"datetime-local\"] {\n min-height: var(--min-touch-target);\n}\n\n.individualPane .hoverControl:has(> img:first-child):focus-visible,\n.contactPane .hoverControl:has(> img:first-child):focus-visible,\n.individualPane button:focus-visible,\n.contactPane button:focus-visible,\n.individualPane input:not([type=\"color\"]):focus-visible,\n.contactPane input:not([type=\"color\"]):focus-visible,\n.individualPane textarea:focus-visible,\n.contactPane textarea:focus-visible,\n.individualPane select:focus-visible,\n.contactPane 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.individualPane input[type=\"url\"],\n.contactPane input[type=\"url\"] {\n width: 100%;\n}\n\n.individualPane .formFieldValue,\n.contactPane .formFieldValue {\n min-width: 0;\n margin-bottom: var(--spacing-sm);\n}\n\n.individualPane .formFieldValue table,\n.contactPane .formFieldValue table {\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.individualPane .formFieldValue td,\n.contactPane .formFieldValue td {\n padding: 0 !important;\n vertical-align: middle;\n}\n\n.individualPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.contactPane .formFieldValue table[data-testid=\"autocomplete-table\"] {\n height: 100%;\n}\n\n.individualPane .formFieldValue input:not([type=\"color\"]),\n.contactPane .formFieldValue input:not([type=\"color\"]),\n.individualPane .formFieldValue textarea,\n.contactPane .formFieldValue textarea {\n width: 100%;\n max-width: 100%;\n}\n\n.individualPane .formFieldValue select,\n.contactPane .formFieldValue select {\n width: 100%;\n display: inline-block;\n max-width: none !important;\n}\n\n.individualPane select#formSelect,\n.contactPane 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.individualPane span select,\n.contactPane span select {\n max-width: 96% !important;\n box-sizing: border-box;\n margin: 0 !important;\n}\n\n.individualPane .formFieldValue span select,\n.contactPane .formFieldValue span select {\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.individualPane > div:first-of-type,\n.contactPane > div:first-of-type,\n.individualPane > div:first-of-type > div:first-of-type,\n.contactPane > 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.individualPane > div,\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.individualPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue),\n.contactPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) {\n display: flex;\n align-items: baseline;\n margin-bottom: var(--spacing-sm);\n}\n\n/* for the Resume inside corporation choice */\n/* Add space between classifierBox label and select box */\n.individualPane .choiceBox .classifierBox-label,\n.contactPane .choiceBox .classifierBox-label {\n margin-right: 0;\n padding-left: 0.3em;\n}\n\n.individualPane .choiceBox .choiceBox-selectBox select,\n.contactPane .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.individualPane .classifierBox .classifierBox-label,\n.contactPane .classifierBox .classifierBox-label {\n margin-right: 0;\n padding-left: 0.3em;\n width: 8em;\n padding: 0.3em;\n vertical-align: middle;\n}\n\n.individualPane .classifierBox .classifierBox-selectBox,\n.contactPane .classifierBox .classifierBox-selectBox {\n margin-left: 0 !important;\n}\n\n.individualPane .classifierBox .classifierBox-selectBox select,\n.contactPane .classifierBox .classifierBox-selectBox select {\n margin-left: 0 !important;\n}\n\n.individualPane .formFieldValue > span > select,\n.contactPane .formFieldValue > span > select {\n margin-left: 0 !important;\n}\n\n.individualPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue,\n.contactPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue {\n margin-bottom: 0;\n}\n\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/org#\"]),\n.contactPane :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.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/org#\"]) + .formFieldValue,\n.contactPane :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.individualPane textarea,\n.contactPane textarea,\n.individualPane .formFieldValue textarea,\n.contactPane .formFieldValue textarea {\n appearance: none;\n -webkit-appearance: none;\n border-radius: 0.2em !important;\n border: 0.05em solid #88c !important;\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.individualPane div:has(> a) + div:has(textarea),\n.contactPane div:has(> a) + div:has(textarea) {\n margin-left: var(--spacing-sm);\n}\n\n/* Center textarea label vertically in flex rows. */\n.individualPane div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea),\n.contactPane div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea) {\n align-items: flex-start;\n}\n\n.individualPane div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea) > div:has(> a),\n.contactPane 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/* Keep autocomplete/table-based fields (e.g. Occupation) aligned to label text baseline. */\n.individualPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]),\n.contactPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) {\n align-items: flex-start;\n}\n\n.individualPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) > .formFieldName,\n.contactPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) > .formFieldName {\n padding-top: var(--spacing-xs) !important;\n}\n\n.individualPane .formFieldValue:has(input[data-testid=\"autocomplete-input\"]),\n.contactPane .formFieldValue:has(input[data-testid=\"autocomplete-input\"]) {\n align-self: flex-start;\n}\n\n.individualPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.contactPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.individualPane .formFieldValue input[data-testid=\"autocomplete-input\"],\n.contactPane .formFieldValue input[data-testid=\"autocomplete-input\"] {\n margin: 0 !important;\n}\n\n.individualPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.contactPane .formFieldValue table[data-testid=\"autocomplete-table\"] {\n vertical-align: baseline;\n}\n\n.individualPane input:not([type=\"color\"]),\n.contactPane input:not([type=\"color\"]) {\n width: 100%;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.individualPane input:disabled,\n.contactPane input:disabled,\n.individualPane textarea:disabled,\n.contactPane textarea:disabled,\n.individualPane select:disabled,\n.contactPane select:disabled,\n.individualPane input[readonly],\n.contactPane input[readonly],\n.individualPane textarea[readonly],\n.contactPane textarea[readonly],\n.individualPane input:read-only,\n.contactPane input:read-only,\n.individualPane textarea:read-only,\n.contactPane textarea:read-only {\n background-color: var(--color-background) !important;\n cursor: not-allowed;\n opacity: 0.75;\n border: 0.05em solid var(--color-background) !important;\n}\n\n.individualPane textarea,\n.contactPane textarea,\n.individualPane .formFieldValue textarea,\n.contactPane .formFieldValue textarea {\n padding: var(--spacing-xs) !important;\n}\n\n.contactPane .webidControl table td div.contactPane.namedPane {\n border: none !important;\n}\n\n/* ------------------------------------------------------------------ */\n/* inline popup used for small confirmation flows (like the new confirmDialog) */\n/* apply the class `rdf-inline-modal` on the outer wrapper and give the\n inner box the class `popup` instead of using the old inline styles. */\n\n/* selectors that match the old inline-styled markup when no classes can be added */\n\n/* outer container: position relative containing an absolute grid popup */\n.contactPane div[style*=\"position: relative\"] > div[style*=\"position: absolute\"][style*=\"display: grid\"] {\n /* override inline values with theme variables */\n position: absolute;\n top: -1em;\n padding: 0.7em !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 display: grid;\n grid-template-columns: auto auto;\n gap: 0.3em;\n z-index: 10;\n}"],"sourceRoot":""}]);
2099
+ box-shadow: var(--box-shadow-popup) !important;
2100
+ grid-template-columns: auto auto !important;
2101
+ gap: var(--spacing-xxs) !important;
2102
+ }
2103
+
2104
+ .individualPane .hoverControl img.hoverControlHide,
2105
+ .individualPane .hoverControl [data-testid="deleteButtonWithCheck"] {
2106
+ position: absolute !important;
2107
+ right: var(--spacing-xxxs) !important;
2108
+ width: 1.5em !important;
2109
+ height: 1.5em !important;
2110
+ display: none !important;
2111
+ align-items: center;
2112
+ justify-content: center;
2113
+ margin: 0 !important;
2114
+ float: none !important;
2115
+ z-index: 2 !important;
2116
+ }
2117
+
2118
+ /* Show delete icon only on hover */
2119
+ .individualPane .hoverControl:hover img.hoverControlHide,
2120
+ .individualPane .hoverControl:hover [data-testid="deleteButtonWithCheck"] {
2121
+ display: inline-flex !important;
2122
+ }
2123
+
2124
+ /* If the hoverControl has exactly one div + the delete icon, keep the icon vertically centered but right-aligned */
2125
+ .individualPane .hoverControl:has(> div:nth-child(1):nth-last-child(2)):hover > img.hoverControlHide,
2126
+ .individualPane .hoverControl:has(> div:nth-child(1):nth-last-child(2)):hover > [data-testid="deleteButtonWithCheck"] {
2127
+ top: 50% !important;
2128
+ right: var(--spacing-xxxs) !important;
2129
+ left: auto !important;
2130
+ transform: translateY(-50%) !important;
2131
+ }`, "",{"version":3,"sources":["webpack://./src/styles/contactsRDFFormsEnforced.css"],"names":[],"mappings":"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","sourcesContent":["/* Solid-UI form */\n\n/* Vertically center autocomplete input in .formFieldValue */\n.individualPane .formFieldValue > div[style*=\"flex-direction: row\"],\n.contactPane .formFieldValue > div[style*=\"flex-direction: row\"] {\n align-items: center;\n display: flex;\n}\n\n.individualPane .formFieldValue input[data-testid=\"autocomplete-input\"],\n.contactPane .formFieldValue input[data-testid=\"autocomplete-input\"] {\n vertical-align: middle;\n}\n\n.individualPane .hoverControl,\n.contactPane .hoverControl {\n position: relative;\n}\n\n/* In contactPane, hover controls in table cells may contain a link + delete icon.\n Make the cell grow and keep the delete icon right-aligned (no overlap). */\n.contactPane td.hoverControl:has(> a) {\n width: auto !important;\n min-width: 4em !important;\n justify-content: space-between !important;\n}\n\n.contactPane td.hoverControl:has(> a) > a {\n flex: 1 1 auto;\n min-width: 0;\n overflow-wrap: anywhere;\n word-break: break-word;\n white-space: normal;\n}\n\n.individualPane .hoverControl:has(> img:first-child),\n.contactPane .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: var(--spacing-btn) !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.individualPane .hoverControl:has(> img:first-child) > span,\n.contactPane .hoverControl:has(> img:first-child) > span {\n display: inline-flex;\n align-items: center;\n margin-left: var(--spacing-xxs);\n}\n\n.individualPane div[style*=\"padding: 0.5em\"]:has(> img),\n.contactPane div[style*=\"padding: 0.5em\"]:has(> img) {\n display: inline-flex;\n align-items: center;\n}\n\n.individualPane div[style*=\"padding: 0.5em\"]:has(> img) > span,\n.contactPane div[style*=\"padding: 0.5em\"]:has(> img) > span {\n margin-left: var(--spacing-xxs);\n}\n\n.individualPane .hoverControl:has(> img:first-child):hover,\n.contactPane .hoverControl:has(> img:first-child):hover {\n background-color: var(--color-section-bg) !important;\n}\n\n.individualPane button:has(> img[src$=\".svg\"]),\n.contactPane button:has(> img[src$=\".svg\"]) {\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 transition: background-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n/* Ensure certain icon images render at a consistent size and align nicely when adjacent. */\nimg[src$=\"red.svg\"],\nimg[src$=\"go-to-this.png\"] {\n width: 1.2em !important;\n height: 1.2em !important;\n max-width: none !important;\n max-height: none !important;\n object-fit: contain;\n display: inline-block;\n vertical-align: middle;\n}\n\n/* If the SVG button is inside a statsLog wrapper, add pink background to the button only. */\n.individualPane .statsLog button:has(> img[src$=\".svg\"]),\n.contactPane .statsLog button:has(> img[src$=\".svg\"]) {\n background-color: var(--color-info-bg) !important;\n border: initial !important;\n margin: initial !important;\n border-radius: initial !important;\n}\n\n/* Hide the “Continue” icon button that Solid-UI sometimes renders below textareas. */\n.individualPane button:has(> img[title=\"Continue\"]),\n.contactPane button:has(> img[title=\"Continue\"]) {\n display: none !important;\n}\n\n/* Allow “Continue” buttons inside contactFormContainer to be visible. */\n.individualPane .contactFormContainer button:has(> img[src$=\"noun_1180158.svg\"]),\n.contactPane .contactFormContainer button:has(> img[src$=\"noun_1180158.svg\"]),\n.individualPane .contactFormContainer button:has(> img[title=\"Continue\"]),\n.contactPane .contactFormContainer button:has(> img[title=\"Continue\"]) {\n display: inline-flex !important;\n}\n\n/* Exception: allow “Continue” buttons inside statsLog to remain visible. */\n.individualPane .statsLog button:has(> img[title=\"Continue\"]),\n.contactPane .statsLog button:has(> img[title=\"Continue\"]),\n.individualPane .webidControl button:has(> img[title=\"Continue\"]),\n.contactPane .webidControl button:has(> img[title=\"Continue\"]){\n display: inline-flex !important;\n}\n\n.individualPane button,\n.contactPane button {\n min-height: var(--min-touch-target);\n min-width: var(--min-touch-target);\n}\n\n.individualPane input:not([type=\"color\"]),\n.contactPane input:not([type=\"color\"]) {\n width: 99%;\n max-width: 99%;\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 margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.individualPane textarea,\n.contactPane textarea,\n.individualPane .formFieldValue textarea,\n.contactPane .formFieldValue textarea {\n appearance: none;\n -webkit-appearance: none;\n border-radius: var(--border-radius-sm) !important;\n border: var(--border-width-xthin) solid var(--color-border-accent) !important;\n width: 99%;\n max-width: 99%;\n box-sizing: border-box;\n font: inherit;\n color: var(--color-text);\n background-color: var(--color-card-bg) !important;\n margin: 0 !important;\n margin-top: var(--spacing-xs);\n margin-left: 0 !important;\n margin-right: 0 !important;\n padding: var(--spacing-xs) !important;\n}\n\n.individualPane select,\n.contactPane select {\n max-width: 99%;\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.individualPane input[type=\"date\"],\n.contactPane input[type=\"date\"],\n.individualPane input[type=\"month\"],\n.contactPane input[type=\"month\"],\n.individualPane input[type=\"week\"],\n.contactPane input[type=\"week\"],\n.individualPane input[type=\"time\"],\n.contactPane input[type=\"time\"],\n.individualPane input[type=\"datetime-local\"],\n.contactPane input[type=\"datetime-local\"] {\n min-height: var(--min-touch-target);\n}\n\n.individualPane .hoverControl:has(> img:first-child):focus-visible,\n.contactPane .hoverControl:has(> img:first-child):focus-visible,\n.individualPane button:focus-visible,\n.contactPane button:focus-visible,\n.individualPane input:not([type=\"color\"]):focus-visible,\n.contactPane input:not([type=\"color\"]):focus-visible,\n.individualPane textarea:focus-visible,\n.contactPane textarea:focus-visible,\n.individualPane select:focus-visible,\n.contactPane 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.individualPane input[type=\"url\"],\n.contactPane input[type=\"url\"] {\n width: 99%;\n}\n\n.individualPane .formFieldValue,\n.contactPane .formFieldValue {\n min-width: 0;\n margin-bottom: var(--spacing-sm);\n}\n\n.individualPane .formFieldValue table,\n.contactPane .formFieldValue table {\n margin: 0 !important;\n padding: 0 !important;\n}\n\n.individualPane .formFieldValue td,\n.contactPane .formFieldValue td {\n padding: 0 !important;\n vertical-align: middle;\n}\n\n.individualPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.contactPane .formFieldValue table[data-testid=\"autocomplete-table\"] {\n height: 100%;\n}\n\n.individualPane .formFieldValue input:not([type=\"color\"]),\n.contactPane .formFieldValue input:not([type=\"color\"]),\n.individualPane .formFieldValue textarea,\n.contactPane .formFieldValue textarea {\n width: 99% !important;\n max-width: 99%;\n}\n\n/* Email and phone value inputs: do not stretch full width */\n.individualPane .formFieldName:has(a[href=\"http://www.w3.org/2006/vcard/ns#value\"]) + .formFieldValue input:not([type=\"color\"]),\n.contactPane .formFieldName:has(a[href=\"http://www.w3.org/2006/vcard/ns#value\"]) + .formFieldValue input:not([type=\"color\"]) {\n width: 98% !important;\n max-width: 98%;\n}\n\n.individualPane .formFieldValue select,\n.contactPane .formFieldValue select {\n width: 99%;\n display: inline-block;\n max-width: none !important;\n}\n\n.individualPane select#formSelect,\n.contactPane select#formSelect {\n width: 99%;\n max-width: 98%;\n box-sizing: border-box;\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.individualPane span select,\n.contactPane span select {\n max-width: 96% !important;\n box-sizing: border-box;\n margin: 0 !important;\n}\n\n.individualPane .formFieldValue span select,\n.contactPane .formFieldValue span select {\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.individualPane > div:first-of-type,\n.contactPane > div:first-of-type,\n.individualPane > div:first-of-type > div:first-of-type,\n.contactPane > 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.individualPane > div,\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.individualPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue),\n.contactPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) {\n display: flex;\n align-items: baseline;\n margin-bottom: var(--spacing-sm);\n}\n\n/* for the Resume inside corporation choice */\n/* Add space between classifierBox label and select box */\n.individualPane .choiceBox .classifierBox-label,\n.contactPane .choiceBox .classifierBox-label {\n margin-right: 0;\n padding-left: var(--spacing-xxs);\n}\n\n.individualPane .choiceBox .choiceBox-selectBox select,\n.contactPane .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.individualPane .classifierBox .classifierBox-label,\n.contactPane .classifierBox .classifierBox-label {\n margin-right: 0;\n padding-left: var(--spacing-xxs);\n width: 8em;\n padding: var(--spacing-xxs);\n vertical-align: middle;\n}\n\n.individualPane .classifierBox .classifierBox-selectBox,\n.contactPane .classifierBox .classifierBox-selectBox {\n margin-left: 0 !important;\n}\n\n.individualPane .classifierBox .classifierBox-selectBox select,\n.contactPane .classifierBox .classifierBox-selectBox select {\n margin-left: 0 !important;\n}\n\n.individualPane .formFieldValue > span > select,\n.contactPane .formFieldValue > span > select {\n margin-left: 0 !important;\n}\n\n.individualPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue,\n.contactPane :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) > .formFieldValue {\n margin-bottom: 0;\n}\n\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]),\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]),\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/org#\"]),\n.contactPane :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.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://schema.org/\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/solid/terms#\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://xmlns.com/foaf/0.1/\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]) + .formFieldValue,\n.contactPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/2006/vcard/ns\"]) + .formFieldValue,\n.individualPane :not(.choiceBox) > .formFieldName:has(a[href*=\"http://www.w3.org/ns/org#\"]) + .formFieldValue,\n.contactPane :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/* Center textarea label vertically in flex rows. */\n.individualPane div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea),\n.contactPane div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea) {\n align-items: flex-start;\n}\n\n.individualPane div[style*=\"display: flex\"][style*=\"flex-direction: row\"]:has(textarea) > div:has(> a),\n.contactPane 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/* Keep autocomplete/table-based fields (e.g. Occupation) aligned to label text baseline. */\n.individualPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]),\n.contactPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) {\n align-items: flex-start;\n}\n\n.individualPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) > .formFieldName,\n.contactPane :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) > .formFieldName {\n padding-top: var(--spacing-xs) !important;\n}\n\n.individualPane .formFieldValue:has(input[data-testid=\"autocomplete-input\"]),\n.contactPane .formFieldValue:has(input[data-testid=\"autocomplete-input\"]) {\n align-self: flex-start;\n}\n\n.individualPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.contactPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.individualPane .formFieldValue input[data-testid=\"autocomplete-input\"],\n.contactPane .formFieldValue input[data-testid=\"autocomplete-input\"] {\n margin: 0 !important;\n}\n\n.individualPane .formFieldValue table[data-testid=\"autocomplete-table\"],\n.contactPane .formFieldValue table[data-testid=\"autocomplete-table\"] {\n vertical-align: baseline;\n}\n\n.individualPane input:disabled,\n.contactPane input:disabled,\n.individualPane textarea:disabled,\n.contactPane textarea:disabled,\n.individualPane select:disabled,\n.contactPane select:disabled,\n.individualPane input[readonly],\n.contactPane input[readonly],\n.individualPane textarea[readonly],\n.contactPane textarea[readonly],\n.individualPane input:read-only,\n.contactPane input:read-only,\n.individualPane textarea:read-only,\n.contactPane textarea:read-only {\n background-color: var(--color-background) !important;\n cursor: not-allowed;\n opacity: var(--opacity-input-disabled);\n border: var(--border-width-xthin) solid var(--color-background) !important;\n}\n\n.contactPane .webidControl table td div.contactPane.namedPane {\n border: none !important;\n}\n\n/* ------------------------------------------------------------------ */\n/* inline popup used for small confirmation flows (like the new confirmDialog) */\n/* apply the class `rdf-inline-modal` on the outer wrapper and give the\n inner box the class `popup` instead of using the old inline styles. */\n\n/* selectors that match the old inline-styled markup when no classes can be added */\n\n/* Delete pop up */\n/* Remove the intermediate positioned ancestor so the popup anchors to .hoverControl instead */\n.individualPane div[style*=\"position: relative\"]:has(> div[style*=\"display: grid\"]) {\n position: static !important;\n}\n\n.individualPane div[style*=\"position: relative\"] > div[style*=\"display: grid\"] {\n /* override inline values with theme variables */\n position: absolute !important;\n top: 0 !important;\n right: 0 !important;\n left: auto !important;\n z-index: 9999 !important;\n display: grid !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n visibility: visible !important;\n padding: var(--spacing-btn) !important;\n background: var(--color-background) !important;\n border: var(--border-width-sm) solid var(--color-primary) !important;\n border-radius: var(--border-radius-base) !important;\n box-shadow: var(--box-shadow-popup) !important;\n grid-template-columns: auto auto !important;\n gap: var(--spacing-xxs) !important;\n}\n\n.individualPane .hoverControl img.hoverControlHide,\n.individualPane .hoverControl [data-testid=\"deleteButtonWithCheck\"] {\n position: absolute !important;\n right: var(--spacing-xxxs) !important;\n width: 1.5em !important;\n height: 1.5em !important;\n display: none !important;\n align-items: center;\n justify-content: center;\n margin: 0 !important;\n float: none !important;\n z-index: 2 !important;\n}\n\n/* Show delete icon only on hover */\n.individualPane .hoverControl:hover img.hoverControlHide,\n.individualPane .hoverControl:hover [data-testid=\"deleteButtonWithCheck\"] {\n display: inline-flex !important;\n}\n\n/* If the hoverControl has exactly one div + the delete icon, keep the icon vertically centered but right-aligned */\n.individualPane .hoverControl:has(> div:nth-child(1):nth-last-child(2)):hover > img.hoverControlHide,\n.individualPane .hoverControl:has(> div:nth-child(1):nth-last-child(2)):hover > [data-testid=\"deleteButtonWithCheck\"] {\n top: 50% !important;\n right: var(--spacing-xxxs) !important;\n left: auto !important;\n transform: translateY(-50%) !important;\n}"],"sourceRoot":""}]);
2132
+ // Exports
2133
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2134
+
2135
+
2136
+ /***/ },
2137
+
2138
+ /***/ 93
2139
+ (module, __nested_webpack_exports__, __nested_webpack_require_79190__) {
2140
+
2141
+ /* harmony export */ __nested_webpack_require_79190__.d(__nested_webpack_exports__, {
2142
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2143
+ /* harmony export */ });
2144
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_79190__(354);
2145
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_79190__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2146
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_79190__(314);
2147
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_79190__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2148
+ // Imports
2149
+
2150
+
2151
+ 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()));
2152
+ // Module
2153
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* ── Group Membership Section ──────────────────────────────── */
2154
+
2155
+ .contactPane .group-membership-container {
2156
+ padding: var(--spacing-sm) 0;
2157
+ }
2158
+
2159
+ /* Grid wrapper — matches detailsSectionContent groupButtonsList */
2160
+ .contactPane .group-pills-wrapper {
2161
+ display: grid !important;
2162
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)) !important;
2163
+ gap: var(--spacing-sm) !important;
2164
+ list-style: none;
2165
+ padding: 0;
2166
+ margin: 0;
2167
+ width: 100% !important;
2168
+ }
2169
+
2170
+ .contactPane .group-pills-wrapper span {
2171
+ width: max-content !important;
2172
+ }
2173
+
2174
+ /* Each group item: button on top, toolbar below */
2175
+ .contactPane .group-membership-item {
2176
+ display: flex;
2177
+ flex-direction: column;
2178
+ align-items: stretch;
2179
+ max-width: 256px;
2180
+ }
2181
+
2182
+ .contactPane .group-membership-item > button {
2183
+ width: 100%;
2184
+ text-align: center;
2185
+ border-radius: var(--border-radius-base);
2186
+ word-wrap: break-word;
2187
+ overflow-wrap: break-word;
2188
+ min-height: var(--min-touch-target);
2189
+ }
2190
+
2191
+ /* Toolbar with link icon and delete button below each group button */
2192
+ .contactPane .group-membership-item .group-membership-toolbar {
2193
+ display: flex;
2194
+ justify-content: flex-end;
2195
+ align-items: center;
2196
+ gap: var(--spacing-xs);
2197
+ padding: var(--spacing-xs) 0 0 0;
2198
+ }
2199
+
2200
+ .contactPane .group-membership-item .group-membership-toolbar a img {
2201
+ width: 1.3em;
2202
+ height: 1em;
2203
+ margin: 0;
2204
+ }
2205
+
2206
+ /* Cancel float:right and any absolute positioning injected by solid-ui */
2207
+ .contactPane .group-membership-item .group-membership-toolbar > img.hoverControlHide,
2208
+ .contactPane .group-membership-item .group-membership-toolbar > [data-testid="deleteButtonWithCheck"] {
2209
+ float: none !important;
2210
+ position: static !important;
2211
+ display: inline-flex !important;
2212
+ visibility: hidden !important;
2213
+ margin: 0 !important;
2214
+ }
2215
+
2216
+ .contactPane .group-membership-item .group-membership-toolbar:hover > img.hoverControlHide,
2217
+ .contactPane .group-membership-item .group-membership-toolbar:hover > [data-testid="deleteButtonWithCheck"] {
2218
+ visibility: visible !important;
2219
+ }
2220
+
2221
+ .contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*="position: relative"] {
2222
+ position: absolute !important;
2223
+ top: 0 !important;
2224
+ left: 50% !important;
2225
+ transform: translateX(-50%) !important;
2226
+ width: min(90vw, 440px) !important;
2227
+ min-width: 280px !important;
2228
+ max-width: 90vw !important;
2229
+ display: flex;
2230
+ align-items: center;
2231
+ justify-content: center;
2232
+ z-index: 1000;
2233
+ }
2234
+
2235
+ .contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*="position: relative"] > div {
2236
+ position: relative !important;
2237
+ top: auto !important;
2238
+ min-width: 280px !important;
2239
+ background: var(--color-background);
2240
+ border-radius: var(--border-radius-full);
2241
+ padding: var(--spacing-lg);
2242
+ box-shadow: var(--box-shadow-overlay);
2243
+ z-index: 1001;
2244
+ }
2245
+
2246
+ @media (max-width: 599px) {
2247
+ .contactPane .group-membership-item .group-pills-wrapper {
2248
+ grid-template-columns: repeat(2, 1fr) !important;
2249
+ gap: var(--spacing-xs) !important;
2250
+ max-width: 100% !important;
2251
+ }
2252
+
2253
+ .contactPane .group-membership-item .group-membership-item > button {
2254
+ font-size: var(--font-size-sm) !important;
2255
+ border-radius: var(--border-radius-base) !important;
2256
+ }
2257
+ }
2258
+
2259
+ @media (min-width: 900px) {
2260
+ .contactPane .group-membership-item .group-pills-wrapper {
2261
+ grid-template-columns: repeat(3, 1fr) !important;
2262
+ gap: var(--spacing-sm) !important;
2263
+ }
2264
+ }
2265
+ `, "",{"version":3,"sources":["webpack://./src/styles/groupMembership.css"],"names":[],"mappings":"AAAA,iEAAiE;;AAEjE;EACE,4BAA4B;AAC9B;;AAEA,kEAAkE;AAClE;EACE,wBAAwB;EACxB,sEAAsE;EACtE,iCAAiC;EACjC,gBAAgB;EAChB,UAAU;EACV,SAAS;EACT,sBAAsB;AACxB;;AAEA;EACE,6BAA6B;AAC/B;;AAEA,kDAAkD;AAClD;EACE,aAAa;EACb,sBAAsB;EACtB,oBAAoB;EACpB,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,wCAAwC;EACxC,qBAAqB;EACrB,yBAAyB;EACzB,mCAAmC;AACrC;;AAEA,qEAAqE;AACrE;EACE,aAAa;EACb,yBAAyB;EACzB,mBAAmB;EACnB,sBAAsB;EACtB,gCAAgC;AAClC;;AAEA;EACE,YAAY;EACZ,WAAW;EACX,SAAS;AACX;;AAEA,yEAAyE;AACzE;;EAEE,sBAAsB;EACtB,2BAA2B;EAC3B,+BAA+B;EAC/B,6BAA6B;EAC7B,oBAAoB;AACtB;;AAEA;;EAEE,8BAA8B;AAChC;;AAEA;EACE,6BAA6B;EAC7B,iBAAiB;EACjB,oBAAoB;EACpB,sCAAsC;EACtC,kCAAkC;EAClC,2BAA2B;EAC3B,0BAA0B;EAC1B,aAAa;EACb,mBAAmB;EACnB,uBAAuB;EACvB,aAAa;AACf;;AAEA;EACE,6BAA6B;EAC7B,oBAAoB;EACpB,2BAA2B;EAC3B,mCAAmC;EACnC,wCAAwC;EACxC,0BAA0B;EAC1B,qCAAqC;EACrC,aAAa;AACf;;AAEA;EACE;IACE,gDAAgD;IAChD,iCAAiC;IACjC,0BAA0B;EAC5B;;EAEA;IACE,yCAAyC;IACzC,mDAAmD;EACrD;AACF;;AAEA;EACE;IACE,gDAAgD;IAChD,iCAAiC;EACnC;AACF","sourcesContent":["/* ── Group Membership Section ──────────────────────────────── */\n\n.contactPane .group-membership-container {\n padding: var(--spacing-sm) 0;\n}\n\n/* Grid wrapper — matches detailsSectionContent groupButtonsList */\n.contactPane .group-pills-wrapper {\n display: grid !important;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)) !important;\n gap: var(--spacing-sm) !important;\n list-style: none;\n padding: 0;\n margin: 0;\n width: 100% !important;\n}\n\n.contactPane .group-pills-wrapper span {\n width: max-content !important;\n}\n\n/* Each group item: button on top, toolbar below */\n.contactPane .group-membership-item {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n max-width: 256px;\n}\n\n.contactPane .group-membership-item > button {\n width: 100%;\n text-align: center;\n border-radius: var(--border-radius-base);\n word-wrap: break-word;\n overflow-wrap: break-word;\n min-height: var(--min-touch-target);\n}\n\n/* Toolbar with link icon and delete button below each group button */\n.contactPane .group-membership-item .group-membership-toolbar {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: var(--spacing-xs);\n padding: var(--spacing-xs) 0 0 0;\n}\n\n.contactPane .group-membership-item .group-membership-toolbar a img {\n width: 1.3em;\n height: 1em;\n margin: 0;\n}\n\n/* Cancel float:right and any absolute positioning injected by solid-ui */\n.contactPane .group-membership-item .group-membership-toolbar > img.hoverControlHide,\n.contactPane .group-membership-item .group-membership-toolbar > [data-testid=\"deleteButtonWithCheck\"] {\n float: none !important;\n position: static !important;\n display: inline-flex !important;\n visibility: hidden !important;\n margin: 0 !important;\n}\n\n.contactPane .group-membership-item .group-membership-toolbar:hover > img.hoverControlHide,\n.contactPane .group-membership-item .group-membership-toolbar:hover > [data-testid=\"deleteButtonWithCheck\"] {\n visibility: visible !important;\n}\n\n.contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*=\"position: relative\"] {\n position: absolute !important;\n top: 0 !important;\n left: 50% !important;\n transform: translateX(-50%) !important;\n width: min(90vw, 440px) !important;\n min-width: 280px !important;\n max-width: 90vw !important;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*=\"position: relative\"] > div {\n position: relative !important;\n top: auto !important;\n min-width: 280px !important;\n background: var(--color-background);\n border-radius: var(--border-radius-full);\n padding: var(--spacing-lg);\n box-shadow: var(--box-shadow-overlay);\n z-index: 1001;\n}\n\n@media (max-width: 599px) {\n .contactPane .group-membership-item .group-pills-wrapper {\n grid-template-columns: repeat(2, 1fr) !important;\n gap: var(--spacing-xs) !important;\n max-width: 100% !important;\n }\n\n .contactPane .group-membership-item .group-membership-item > button {\n font-size: var(--font-size-sm) !important;\n border-radius: var(--border-radius-base) !important;\n }\n}\n\n@media (min-width: 900px) {\n .contactPane .group-membership-item .group-pills-wrapper {\n grid-template-columns: repeat(3, 1fr) !important;\n gap: var(--spacing-sm) !important;\n }\n}\n"],"sourceRoot":""}]);
2266
+ // Exports
2267
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2268
+
2269
+
2270
+ /***/ },
2271
+
2272
+ /***/ 479
2273
+ (module, __nested_webpack_exports__, __nested_webpack_require_88538__) {
2274
+
2275
+ /* harmony export */ __nested_webpack_require_88538__.d(__nested_webpack_exports__, {
2276
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2277
+ /* harmony export */ });
2278
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_88538__(354);
2279
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_88538__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2280
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_88538__(314);
2281
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_88538__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2282
+ // Imports
2283
+
2284
+
2285
+ 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()));
2286
+ // Module
2287
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* individual.js styles — extracted from inline styles */
2288
+
2289
+ /* ── Individual pane container ───────────────────────────────── */
2290
+
2291
+ .individualPane {
2292
+ padding: var(--spacing-xs) var(--spacing-lg) var(--spacing-md) var(--spacing-lg);
2293
+ background: var(--color-section-bg);
2294
+ border-radius: var(--border-radius-full);
2295
+ box-shadow: var(--box-shadow);
2296
+ box-sizing: border-box;
2297
+ max-width: 100%;
2298
+ }`, "",{"version":3,"sources":["webpack://./src/styles/individual.css"],"names":[],"mappings":"AAAA,wDAAwD;;AAExD,mEAAmE;;AAEnE;EACE,gFAAgF;EAChF,mCAAmC;EACnC,wCAAwC;EACxC,6BAA6B;EAC7B,sBAAsB;EACtB,eAAe;AACjB","sourcesContent":["/* individual.js styles — extracted from inline styles */\n\n/* ── Individual pane container ───────────────────────────────── */\n\n.individualPane {\n padding: var(--spacing-xs) var(--spacing-lg) var(--spacing-md) var(--spacing-lg);\n background: var(--color-section-bg);\n border-radius: var(--border-radius-full);\n box-shadow: var(--box-shadow);\n box-sizing: border-box;\n max-width: 100%;\n}"],"sourceRoot":""}]);
2299
+ // Exports
2300
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2301
+
2302
+
2303
+ /***/ },
2304
+
2305
+ /***/ 546
2306
+ (module, __nested_webpack_exports__, __nested_webpack_require_90905__) {
2307
+
2308
+ /* harmony export */ __nested_webpack_require_90905__.d(__nested_webpack_exports__, {
2309
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2310
+ /* harmony export */ });
2311
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_90905__(354);
2312
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_90905__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2313
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_90905__(314);
2314
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_90905__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2315
+ // Imports
2316
+
2317
+
2318
+ 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()));
2319
+ // Module
2320
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* CSS for the accessible modal dialogs created by localUtils.js */
2321
+
2322
+ /* backdrop / focus trap container */
2323
+ .focus-trap {
2324
+ position: fixed;
2325
+ top: 0;
2326
+ left: 0;
2327
+ width: 100%;
2328
+ height: 100%;
2329
+ z-index: 9999;
2330
+ background: var(--overlay-bg);
2331
+ display: flex;
2332
+ justify-content: center;
2333
+ align-items: center;
2334
+ }
2335
+
2336
+ /* inner dialog box */
2337
+ .focus-trap .modal {
2338
+ background: var(--color-background);
2339
+ padding: var(--spacing-lg);
2340
+ border-radius: var(--border-radius-base);
2341
+ max-width: 90%;
2342
+ box-shadow: var(--box-shadow-modal);
2343
+ }
2344
+
2345
+ /* button container: center buttons horizontally (uses id in markup) */
2346
+ #contacts-modal #modal-buttons {
2347
+ margin-top: var(--spacing-md);
2348
+ display: flex;
2349
+ justify-content: center;
2350
+ gap: var(--spacing-sm);
2351
+ }
2352
+
2353
+ /* buttons themselves use the shared btn-primary rules */
2354
+ #contacts-modal .modal button {
2355
+ min-height: var(--min-touch-target);
2356
+ padding: var(--spacing-sm) var(--spacing-md);
2357
+ border: 1px solid var(--color-primary);
2358
+ border-radius: var(--border-radius-base);
2359
+ font-weight: 600;
2360
+ cursor: pointer;
2361
+ transition: all var(--animation-duration) ease;
2362
+ }
2363
+
2364
+ #contacts-modal .modal button:disabled {
2365
+ opacity: var(--opacity-disabled);
2366
+ cursor: not-allowed;
2367
+ transform: none;
2368
+ }
2369
+ `, "",{"version":3,"sources":["webpack://./src/styles/localUtils.css"],"names":[],"mappings":"AAAA,kEAAkE;;AAElE,oCAAoC;AACpC;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,WAAW;EACX,YAAY;EACZ,aAAa;EACb,6BAA6B;EAC7B,aAAa;EACb,uBAAuB;EACvB,mBAAmB;AACrB;;AAEA,qBAAqB;AACrB;EACE,mCAAmC;EACnC,0BAA0B;EAC1B,wCAAwC;EACxC,cAAc;EACd,mCAAmC;AACrC;;AAEA,sEAAsE;AACtE;EACE,6BAA6B;EAC7B,aAAa;EACb,uBAAuB;EACvB,sBAAsB;AACxB;;AAEA,wDAAwD;AACxD;EACE,mCAAmC;EACnC,4CAA4C;EAC5C,sCAAsC;EACtC,wCAAwC;EACxC,gBAAgB;EAChB,eAAe;EACf,8CAA8C;AAChD;;AAEA;EACE,gCAAgC;EAChC,mBAAmB;EACnB,eAAe;AACjB","sourcesContent":["/* CSS for the accessible modal dialogs created by localUtils.js */\n\n/* backdrop / focus trap container */\n.focus-trap {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 9999;\n background: var(--overlay-bg);\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n/* inner dialog box */\n.focus-trap .modal {\n background: var(--color-background);\n padding: var(--spacing-lg);\n border-radius: var(--border-radius-base);\n max-width: 90%;\n box-shadow: var(--box-shadow-modal);\n}\n\n/* button container: center buttons horizontally (uses id in markup) */\n#contacts-modal #modal-buttons {\n margin-top: var(--spacing-md);\n display: flex;\n justify-content: center;\n gap: var(--spacing-sm);\n}\n\n/* buttons themselves use the shared btn-primary rules */\n#contacts-modal .modal button {\n min-height: var(--min-touch-target);\n padding: var(--spacing-sm) var(--spacing-md);\n border: 1px solid var(--color-primary);\n border-radius: var(--border-radius-base);\n font-weight: 600;\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n}\n\n#contacts-modal .modal button:disabled {\n opacity: var(--opacity-disabled);\n cursor: not-allowed;\n transform: none;\n}\n"],"sourceRoot":""}]);
2370
+ // Exports
2371
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2372
+
2373
+
2374
+ /***/ },
2375
+
2376
+ /***/ 715
2377
+ (module, __nested_webpack_exports__, __nested_webpack_require_95307__) {
2378
+
2379
+ /* harmony export */ __nested_webpack_require_95307__.d(__nested_webpack_exports__, {
2380
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2381
+ /* harmony export */ });
2382
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_95307__(354);
2383
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_95307__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2384
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_95307__(314);
2385
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_95307__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2386
+ // Imports
2387
+
2388
+
2389
+ 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()));
2390
+ // Module
2391
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* mugshotGallery.js styles — extracted from inline styles */
2392
+ /* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */
2393
+
2394
+ /* ── Mugshot image ───────────────────────────────────────────── */
2395
+
2396
+ .contactPane .mugshotImage {
2397
+ max-height: 10em;
2398
+ border-radius: var(--border-radius-full);
2399
+ margin: var(--spacing-sm);
2400
+ }
2401
+
2402
+ .contactPane button:has(> img[src\$=".svg"]) {
2403
+ background-color: var(--color-section-bg) !important;
2404
+ border: none !important;
2405
+ margin: 0 !important;
2406
+ border-radius: 0 !important;
2407
+ }
2408
+ `, "",{"version":3,"sources":["webpack://./src/styles/mugshotGallery.css"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,qFAAqF;;AAErF,mEAAmE;;AAEnE;EACE,gBAAgB;EAChB,wCAAwC;EACxC,yBAAyB;AAC3B;;AAEA;EACE,oDAAoD;EACpD,uBAAuB;EACvB,oBAAoB;EACpB,2BAA2B;AAC7B","sourcesContent":["/* mugshotGallery.js styles — extracted from inline styles */\n/* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */\n\n/* ── Mugshot image ───────────────────────────────────────────── */\n\n.contactPane .mugshotImage {\n max-height: 10em;\n border-radius: var(--border-radius-full);\n margin: var(--spacing-sm);\n}\n\n.contactPane button:has(> img[src$=\".svg\"]) {\n background-color: var(--color-section-bg) !important;\n border: none !important;\n margin: 0 !important;\n border-radius: 0 !important;\n}\n"],"sourceRoot":""}]);
2251
2409
  // Exports
2252
2410
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2253
2411
 
@@ -2255,15 +2413,15 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Solid-UI form */
2255
2413
  /***/ },
2256
2414
 
2257
2415
  /***/ 295
2258
- (module, __nested_webpack_exports__, __nested_webpack_require_83257__) {
2416
+ (module, __nested_webpack_exports__, __nested_webpack_require_98002__) {
2259
2417
 
2260
- /* harmony export */ __nested_webpack_require_83257__.d(__nested_webpack_exports__, {
2418
+ /* harmony export */ __nested_webpack_require_98002__.d(__nested_webpack_exports__, {
2261
2419
  /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2262
2420
  /* harmony export */ });
2263
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_83257__(354);
2264
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_83257__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2265
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_83257__(314);
2266
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_83257__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2421
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_98002__(354);
2422
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_98002__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2423
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_98002__(314);
2424
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_98002__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2267
2425
  // Imports
2268
2426
 
2269
2427
 
@@ -2305,9 +2463,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* toolsPane.js styles — extracted f
2305
2463
 
2306
2464
  /* ── Load index button states ──────────────────────────────── */
2307
2465
 
2308
- .contactPane .toolsButton--loading {
2309
- }
2310
-
2311
2466
  .contactPane .toolsButton--error {
2312
2467
  background-color: var(--color-error);
2313
2468
  }
@@ -2315,7 +2470,128 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* toolsPane.js styles — extracted f
2315
2470
  .contactPane .toolsButton--success {
2316
2471
  background-color: var(--color-primary);
2317
2472
  }
2318
- `, "",{"version":3,"sources":["webpack://./src/styles/toolsPane.css"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,qFAAqF;;AAErF,mEAAmE;;AAEnE;EACE,8BAA8B;EAC9B,yBAAyB;EACzB,yCAAyC;AAC3C;;AAEA;EACE,0BAA0B;EAC1B,qBAAqB;EACrB,qBAAqB;EACrB,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;AACjB;;AAEA,oEAAoE;;AAEpE;EACE,aAAa;EACb,sBAAsB;EACtB,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,eAAe;EACf,sBAAsB;AACxB;;AAEA,iEAAiE;;AAEjE;AACA;;AAEA;EACE,oCAAoC;AACtC;;AAEA;EACE,sCAAsC;AACxC","sourcesContent":["/* toolsPane.js styles — extracted from inline styles */\n/* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */\n\n/* ── Tools pane table ────────────────────────────────────────── */\n\n.contactPane .statsLog {\n font-size: var(--font-size-lg);\n margin: var(--spacing-md);\n background-color: var(--color-background);\n}\n\n.contactPane .statsLog pre {\n padding: var(--spacing-md);\n white-space: pre-wrap;\n word-wrap: break-word;\n overflow-wrap: break-word;\n overflow: hidden;\n max-width: 100%;\n}\n\n/* ── Tools pane layout ────────────────────────────────────────── */\n\n.contactPane .toolsPane {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n}\n\n.contactPane .toolsButtonsContainer {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-xs);\n}\n\n/* ── Load index button states ──────────────────────────────── */\n\n.contactPane .toolsButton--loading {\n}\n\n.contactPane .toolsButton--error {\n background-color: var(--color-error);\n}\n\n.contactPane .toolsButton--success {\n background-color: var(--color-primary);\n}\n"],"sourceRoot":""}]);
2473
+ `, "",{"version":3,"sources":["webpack://./src/styles/toolsPane.css"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,qFAAqF;;AAErF,mEAAmE;;AAEnE;EACE,8BAA8B;EAC9B,yBAAyB;EACzB,yCAAyC;AAC3C;;AAEA;EACE,0BAA0B;EAC1B,qBAAqB;EACrB,qBAAqB;EACrB,yBAAyB;EACzB,gBAAgB;EAChB,eAAe;AACjB;;AAEA,oEAAoE;;AAEpE;EACE,aAAa;EACb,sBAAsB;EACtB,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,eAAe;EACf,sBAAsB;AACxB;;AAEA,iEAAiE;;AAEjE;EACE,oCAAoC;AACtC;;AAEA;EACE,sCAAsC;AACxC","sourcesContent":["/* toolsPane.js styles — extracted from inline styles */\n/* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */\n\n/* ── Tools pane table ────────────────────────────────────────── */\n\n.contactPane .statsLog {\n font-size: var(--font-size-lg);\n margin: var(--spacing-md);\n background-color: var(--color-background);\n}\n\n.contactPane .statsLog pre {\n padding: var(--spacing-md);\n white-space: pre-wrap;\n word-wrap: break-word;\n overflow-wrap: break-word;\n overflow: hidden;\n max-width: 100%;\n}\n\n/* ── Tools pane layout ────────────────────────────────────────── */\n\n.contactPane .toolsPane {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-xs);\n}\n\n.contactPane .toolsButtonsContainer {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-xs);\n}\n\n/* ── Load index button states ──────────────────────────────── */\n\n.contactPane .toolsButton--error {\n background-color: var(--color-error);\n}\n\n.contactPane .toolsButton--success {\n background-color: var(--color-primary);\n}\n"],"sourceRoot":""}]);
2474
+ // Exports
2475
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2476
+
2477
+
2478
+ /***/ },
2479
+
2480
+ /***/ 92
2481
+ (module, __nested_webpack_exports__, __nested_webpack_require_101903__) {
2482
+
2483
+ /* harmony export */ __nested_webpack_require_101903__.d(__nested_webpack_exports__, {
2484
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2485
+ /* harmony export */ });
2486
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_101903__(354);
2487
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_101903__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2488
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_101903__(314);
2489
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_101903__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2490
+ // Imports
2491
+
2492
+
2493
+ 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()));
2494
+ // Module
2495
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* Shared utility variables for component styles.
2496
+ These are kept here (instead of in dev-global.css) so they can be
2497
+ bundled with component styles and reused consistently across the app.
2498
+ */
2499
+
2500
+ :root {
2501
+ /* Global utility tokens */
2502
+ --opacity-disabled: 0.6;
2503
+ --opacity-input-disabled: 0.75;
2504
+ --font-weight-bold: 700;
2505
+
2506
+ --border-width-xthin: 0.05em;
2507
+ --border-width-sm: 0.1em;
2508
+ --border-width-thin: 1px;
2509
+
2510
+ --border-radius-xs: 0.1em;
2511
+ --border-radius-sm: 0.2em;
2512
+
2513
+ --spacing-xxs: 0.3em;
2514
+ --spacing-xxxs: 0.2em;
2515
+ --spacing-btn: 0.7em;
2516
+
2517
+ --box-shadow-hover: 0 2px 4px rgba(124, 77, 255, 0.2);
2518
+ --box-shadow-active: 0 1px 2px rgba(124, 77, 255, 0.2);
2519
+ --box-shadow-focus: 0 0 0 5px rgba(124, 77, 255, 0.25);
2520
+ --box-shadow-overlay: 0 4px 24px rgba(0, 0, 0, 0.2);
2521
+ --box-shadow-modal: 0 2px 10px rgba(0, 0, 0, 0.3);
2522
+ --box-shadow-popup: 0 0.5em 0.9em rgba(0, 0, 0, 0.2);
2523
+
2524
+ --overlay-bg: rgba(0, 0, 0, 0.5);
2525
+ --overlay-bg-muted: rgba(0, 0, 0, 0.3);
2526
+
2527
+ --color-border-accent: #88c;
2528
+ }
2529
+
2530
+ /* Utility helper classes */
2531
+ .hidden {
2532
+ display: none !important;
2533
+ }
2534
+
2535
+ .btn-primary {
2536
+ min-height: var(--min-touch-target);
2537
+ padding: var(--spacing-sm) var(--spacing-md);
2538
+ border: 1px solid var(--color-primary);
2539
+ border-radius: var(--border-radius-base);
2540
+ background: var(--color-primary);
2541
+ color: var(--color-background);
2542
+ font-weight: 600;
2543
+ cursor: pointer;
2544
+ transition: all var(--animation-duration) ease;
2545
+ }
2546
+
2547
+ .btn-primary:hover {
2548
+ background: color-mix(in srgb, var(--color-primary) 90%, black);
2549
+ box-shadow: var(--box-shadow-hover);
2550
+ }
2551
+
2552
+ .btn-primary:active {
2553
+ box-shadow: var(--box-shadow-active);
2554
+ }
2555
+
2556
+ .btn-primary:disabled {
2557
+ opacity: var(--opacity-disabled);
2558
+ cursor: not-allowed;
2559
+ transform: none;
2560
+ }
2561
+
2562
+ .btn-secondary {
2563
+ min-height: var(--min-touch-target);
2564
+ padding: var(--spacing-sm) var(--spacing-md);
2565
+ border: var(--border-width-thin) solid var(--color-secondary);
2566
+ border-radius: var(--border-radius-base);
2567
+ background: var(--color-secondary);
2568
+ color: var(--color-background);
2569
+ font-weight: var(--font-weight-bold);
2570
+ cursor: pointer;
2571
+ transition: all var(--animation-duration) ease;
2572
+ text-decoration: none;
2573
+ display: inline-flex;
2574
+ align-items: center;
2575
+ justify-content: center;
2576
+ }
2577
+
2578
+ .btn-secondary:hover {
2579
+ background: color-mix(in srgb, var(--color-secondary) 85%, black);
2580
+ }
2581
+
2582
+ .btn-secondary:disabled {
2583
+ opacity: var(--opacity-disabled);
2584
+ cursor: not-allowed;
2585
+ }
2586
+
2587
+ .action-button-focus:focus,
2588
+ .action-button-focus:focus-visible {
2589
+ outline: 3px solid var(--color-primary) !important;
2590
+ outline-offset: 2px !important;
2591
+ box-shadow: 0 0 0 2px var(--color-background), var(--box-shadow-focus) !important;
2592
+ z-index: 1;
2593
+ }
2594
+ `, "",{"version":3,"sources":["webpack://./src/styles/utilities.css"],"names":[],"mappings":"AAAA;;;CAGC;;AAED;EACE,0BAA0B;EAC1B,uBAAuB;EACvB,8BAA8B;EAC9B,uBAAuB;;EAEvB,4BAA4B;EAC5B,wBAAwB;EACxB,wBAAwB;;EAExB,yBAAyB;EACzB,yBAAyB;;EAEzB,oBAAoB;EACpB,qBAAqB;EACrB,oBAAoB;;EAEpB,qDAAqD;EACrD,sDAAsD;EACtD,sDAAsD;EACtD,mDAAmD;EACnD,iDAAiD;EACjD,oDAAoD;;EAEpD,gCAAgC;EAChC,sCAAsC;;EAEtC,2BAA2B;AAC7B;;AAEA,2BAA2B;AAC3B;EACE,wBAAwB;AAC1B;;AAEA;EACE,mCAAmC;EACnC,4CAA4C;EAC5C,sCAAsC;EACtC,wCAAwC;EACxC,gCAAgC;EAChC,8BAA8B;EAC9B,gBAAgB;EAChB,eAAe;EACf,8CAA8C;AAChD;;AAEA;EACE,+DAA+D;EAC/D,mCAAmC;AACrC;;AAEA;EACE,oCAAoC;AACtC;;AAEA;EACE,gCAAgC;EAChC,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,mCAAmC;EACnC,4CAA4C;EAC5C,6DAA6D;EAC7D,wCAAwC;EACxC,kCAAkC;EAClC,8BAA8B;EAC9B,oCAAoC;EACpC,eAAe;EACf,8CAA8C;EAC9C,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,uBAAuB;AACzB;;AAEA;EACE,iEAAiE;AACnE;;AAEA;EACE,gCAAgC;EAChC,mBAAmB;AACrB;;AAEA;;EAEE,kDAAkD;EAClD,8BAA8B;EAC9B,iFAAiF;EACjF,UAAU;AACZ","sourcesContent":["/* Shared utility variables for component styles.\n These are kept here (instead of in dev-global.css) so they can be\n bundled with component styles and reused consistently across the app.\n*/\n\n:root {\n /* Global utility tokens */\n --opacity-disabled: 0.6;\n --opacity-input-disabled: 0.75;\n --font-weight-bold: 700;\n\n --border-width-xthin: 0.05em;\n --border-width-sm: 0.1em;\n --border-width-thin: 1px;\n\n --border-radius-xs: 0.1em;\n --border-radius-sm: 0.2em;\n\n --spacing-xxs: 0.3em;\n --spacing-xxxs: 0.2em;\n --spacing-btn: 0.7em;\n\n --box-shadow-hover: 0 2px 4px rgba(124, 77, 255, 0.2);\n --box-shadow-active: 0 1px 2px rgba(124, 77, 255, 0.2);\n --box-shadow-focus: 0 0 0 5px rgba(124, 77, 255, 0.25);\n --box-shadow-overlay: 0 4px 24px rgba(0, 0, 0, 0.2);\n --box-shadow-modal: 0 2px 10px rgba(0, 0, 0, 0.3);\n --box-shadow-popup: 0 0.5em 0.9em rgba(0, 0, 0, 0.2);\n\n --overlay-bg: rgba(0, 0, 0, 0.5);\n --overlay-bg-muted: rgba(0, 0, 0, 0.3);\n\n --color-border-accent: #88c;\n}\n\n/* Utility helper classes */\n.hidden {\n display: none !important;\n}\n\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: var(--color-background);\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: var(--box-shadow-hover);\n}\n\n.btn-primary:active {\n box-shadow: var(--box-shadow-active);\n}\n\n.btn-primary:disabled {\n opacity: var(--opacity-disabled);\n cursor: not-allowed;\n transform: none;\n}\n\n.btn-secondary {\n min-height: var(--min-touch-target);\n padding: var(--spacing-sm) var(--spacing-md);\n border: var(--border-width-thin) solid var(--color-secondary);\n border-radius: var(--border-radius-base);\n background: var(--color-secondary);\n color: var(--color-background);\n font-weight: var(--font-weight-bold);\n cursor: pointer;\n transition: all var(--animation-duration) ease;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.btn-secondary:hover {\n background: color-mix(in srgb, var(--color-secondary) 85%, black);\n}\n\n.btn-secondary:disabled {\n opacity: var(--opacity-disabled);\n cursor: not-allowed;\n}\n\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), var(--box-shadow-focus) !important;\n z-index: 1;\n}\n"],"sourceRoot":""}]);
2319
2595
  // Exports
2320
2596
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2321
2597
 
@@ -2323,15 +2599,15 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* toolsPane.js styles — extracted f
2323
2599
  /***/ },
2324
2600
 
2325
2601
  /***/ 886
2326
- (module, __nested_webpack_exports__, __nested_webpack_require_87253__) {
2602
+ (module, __nested_webpack_exports__, __nested_webpack_require_109627__) {
2327
2603
 
2328
- /* harmony export */ __nested_webpack_require_87253__.d(__nested_webpack_exports__, {
2604
+ /* harmony export */ __nested_webpack_require_109627__.d(__nested_webpack_exports__, {
2329
2605
  /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
2330
2606
  /* harmony export */ });
2331
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_87253__(354);
2332
- /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_87253__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2333
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_87253__(314);
2334
- /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_87253__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2607
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __nested_webpack_require_109627__(354);
2608
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nested_webpack_require_109627__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
2609
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __nested_webpack_require_109627__(314);
2610
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nested_webpack_require_109627__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
2335
2611
  // Imports
2336
2612
 
2337
2613
 
@@ -2339,7 +2615,7 @@ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBP
2339
2615
  // Module
2340
2616
  ___CSS_LOADER_EXPORT___.push([module.id, `/* ── Named pane (rendered sub-pane) ──────────────────────────── */
2341
2617
  .contactPane .namedPane {
2342
- border: 0.1em solid var(--color-text-muted);
2618
+ border: var(--border-width-sm) solid var(--color-text-muted);
2343
2619
  border-radius: var(--border-radius-base);
2344
2620
  }
2345
2621
 
@@ -2349,8 +2625,15 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ── Named pane (rendered sub-pan
2349
2625
  padding: var(--spacing-xs);
2350
2626
  }
2351
2627
 
2352
- .contactPane .personaRow--webid {
2353
- background-color: var(--color-info-bg);
2628
+ .contactPane .personaRow--webid,
2629
+ .contactPane .personaRow--webid td,
2630
+ .contactPane .personaRow--webid button,
2631
+ .contactPane .personaRow--webid button:hover,
2632
+ .contactPane .personaRow--webid .hoverControl:has(> img:first-child),
2633
+ .contactPane .personaRow--webid .hoverControl:has(> img:first-child):hover,
2634
+ .contactPane .personaRow--webid .personaOpenButton:has(> img:first-child),
2635
+ .contactPane .personaRow--webid .personaOpenButton:has(> img:first-child):hover {
2636
+ background-color: var(--color-info-bg) !important;
2354
2637
  }
2355
2638
 
2356
2639
  /* ── Full-width elements ─────────────────────────────────────── */
@@ -2367,13 +2650,42 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ── Named pane (rendered sub-pan
2367
2650
  border: none;
2368
2651
  }
2369
2652
 
2653
+ /* hoverControl layout overrides are now enforced in contactsRDFFormsEnforced.css */
2654
+
2655
+ /* ── Delete confirmation popup in webidControl ───────────────── */
2656
+
2657
+ /* Remove intermediate positioned ancestor so popup anchors to .hoverControl */
2658
+ .contactPane .webidControl div[style*="position: relative"]:has(> div[style*="display: grid"]) {
2659
+ position: static !important;
2660
+ }
2661
+
2662
+ /* Position the popup absolutely so it never participates in the flex row */
2663
+ .contactPane .webidControl div[style*="position: relative"] > div[style*="display: grid"] {
2664
+ position: absolute !important;
2665
+ top: 0 !important;
2666
+ right: 0 !important;
2667
+ left: auto !important;
2668
+ z-index: 9999 !important;
2669
+ display: grid !important;
2670
+ pointer-events: auto !important;
2671
+ opacity: 1 !important;
2672
+ visibility: visible !important;
2673
+ padding: var(--spacing-btn) !important;
2674
+ min-width: 12em !important;
2675
+ background: var(--color-background) !important;
2676
+ border: var(--border-width-sm) solid var(--color-primary) !important;
2677
+ border-radius: var(--border-radius-base) !important;
2678
+ box-shadow: var(--box-shadow-popup) !important;
2679
+ grid-template-columns: auto auto !important;
2680
+ gap: var(--spacing-xxs) !important;
2681
+ }
2682
+
2370
2683
  /* ── Section heading ─────────────────────────────────────────── */
2371
2684
 
2372
- .contactPane .webidHeading {
2685
+ .contactPane .contactPanedHeading {
2373
2686
  font-size: var(--font-size-lg);
2374
2687
  font-weight: bold;
2375
2688
  color: var(--color-primary);
2376
- padding: var(--spacing-xs);
2377
2689
  margin: var(--spacing-sm) 0;
2378
2690
  }
2379
2691
 
@@ -2388,14 +2700,10 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ── Named pane (rendered sub-pan
2388
2700
 
2389
2701
  /* ── Visibility / display helpers ────────────────────────────── */
2390
2702
 
2391
- .contactPane .hidden {
2392
- display: none;
2393
- }
2394
-
2395
2703
  .contactPane .collapsed {
2396
2704
  visibility: collapse;
2397
2705
  }
2398
- `, "",{"version":3,"sources":["webpack://./src/styles/webidControl.css"],"names":[],"mappings":"AAAA,mEAAmE;AACnE;EACE,2CAA2C;EAC3C,wCAAwC;AAC1C;;AAEA,mEAAmE;;AAEnE;EACE,0BAA0B;AAC5B;;AAEA;EACE,sCAAsC;AACxC;;AAEA,mEAAmE;;AAEnE;EACE,WAAW;AACb;;AAEA,mEAAmE;;AAEnE;EACE,YAAY;EACZ,6BAA6B;EAC7B,YAAY;AACd;;AAEA,mEAAmE;;AAEnE;EACE,8BAA8B;EAC9B,iBAAiB;EACjB,2BAA2B;EAC3B,0BAA0B;EAC1B,2BAA2B;AAC7B;;AAEA,mEAAmE;;AAEnE;EACE,0BAA0B;EAC1B,YAAY;EACZ,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA,mEAAmE;;AAEnE;EACE,aAAa;AACf;;AAEA;EACE,oBAAoB;AACtB","sourcesContent":["/* ── Named pane (rendered sub-pane) ──────────────────────────── */\n.contactPane .namedPane {\n border: 0.1em solid var(--color-text-muted);\n border-radius: var(--border-radius-base);\n}\n\n/* ── Persona row ─────────────────────────────────────────────── */\n\n.contactPane .personaRow {\n padding: var(--spacing-xs);\n}\n\n.contactPane .personaRow--webid {\n background-color: var(--color-info-bg);\n}\n\n/* ── Full-width elements ─────────────────────────────────────── */\n\n.contactPane .fullWidth {\n width: 100%;\n}\n\n/* ── Open/close profile button ───────────────────────────────── */\n\n.contactPane .personaOpenButton {\n float: right;\n background-color: transparent;\n border: none;\n}\n\n/* ── Section heading ─────────────────────────────────────────── */\n\n.contactPane .webidHeading {\n font-size: var(--font-size-lg);\n font-weight: bold;\n color: var(--color-primary);\n padding: var(--spacing-xs);\n margin: var(--spacing-sm) 0;\n}\n\n/* ── Prompt text ─────────────────────────────────────────────── */\n\n.contactPane .webidPrompt {\n padding: var(--spacing-sm);\n border: none;\n font-size: var(--font-size-base);\n white-space: pre-wrap;\n}\n\n/* ── Visibility / display helpers ────────────────────────────── */\n\n.contactPane .hidden {\n display: none;\n}\n\n.contactPane .collapsed {\n visibility: collapse;\n}\n"],"sourceRoot":""}]);
2706
+ `, "",{"version":3,"sources":["webpack://./src/styles/webidControl.css"],"names":[],"mappings":"AAAA,mEAAmE;AACnE;EACE,4DAA4D;EAC5D,wCAAwC;AAC1C;;AAEA,mEAAmE;;AAEnE;EACE,0BAA0B;AAC5B;;AAEA;;;;;;;;EAQE,iDAAiD;AACnD;;AAEA,mEAAmE;;AAEnE;EACE,WAAW;AACb;;AAEA,mEAAmE;;AAEnE;EACE,YAAY;EACZ,6BAA6B;EAC7B,YAAY;AACd;;AAEA,mFAAmF;;AAEnF,mEAAmE;;AAEnE,8EAA8E;AAC9E;EACE,2BAA2B;AAC7B;;AAEA,2EAA2E;AAC3E;EACE,6BAA6B;EAC7B,iBAAiB;EACjB,mBAAmB;EACnB,qBAAqB;EACrB,wBAAwB;EACxB,wBAAwB;EACxB,+BAA+B;EAC/B,qBAAqB;EACrB,8BAA8B;EAC9B,sCAAsC;EACtC,0BAA0B;EAC1B,8CAA8C;EAC9C,oEAAoE;EACpE,mDAAmD;EACnD,8CAA8C;EAC9C,2CAA2C;EAC3C,kCAAkC;AACpC;;AAEA,mEAAmE;;AAEnE;EACE,8BAA8B;EAC9B,iBAAiB;EACjB,2BAA2B;EAC3B,2BAA2B;AAC7B;;AAEA,mEAAmE;;AAEnE;EACE,0BAA0B;EAC1B,YAAY;EACZ,gCAAgC;EAChC,qBAAqB;AACvB;;AAEA,mEAAmE;;AAEnE;EACE,oBAAoB;AACtB","sourcesContent":["/* ── Named pane (rendered sub-pane) ──────────────────────────── */\n.contactPane .namedPane {\n border: var(--border-width-sm) solid var(--color-text-muted);\n border-radius: var(--border-radius-base);\n}\n\n/* ── Persona row ─────────────────────────────────────────────── */\n\n.contactPane .personaRow {\n padding: var(--spacing-xs);\n}\n\n.contactPane .personaRow--webid,\n.contactPane .personaRow--webid td,\n.contactPane .personaRow--webid button,\n.contactPane .personaRow--webid button:hover,\n.contactPane .personaRow--webid .hoverControl:has(> img:first-child),\n.contactPane .personaRow--webid .hoverControl:has(> img:first-child):hover,\n.contactPane .personaRow--webid .personaOpenButton:has(> img:first-child),\n.contactPane .personaRow--webid .personaOpenButton:has(> img:first-child):hover {\n background-color: var(--color-info-bg) !important;\n}\n\n/* ── Full-width elements ─────────────────────────────────────── */\n\n.contactPane .fullWidth {\n width: 100%;\n}\n\n/* ── Open/close profile button ───────────────────────────────── */\n\n.contactPane .personaOpenButton {\n float: right;\n background-color: transparent;\n border: none;\n}\n\n/* hoverControl layout overrides are now enforced in contactsRDFFormsEnforced.css */\n\n/* ── Delete confirmation popup in webidControl ───────────────── */\n\n/* Remove intermediate positioned ancestor so popup anchors to .hoverControl */\n.contactPane .webidControl div[style*=\"position: relative\"]:has(> div[style*=\"display: grid\"]) {\n position: static !important;\n}\n\n/* Position the popup absolutely so it never participates in the flex row */\n.contactPane .webidControl div[style*=\"position: relative\"] > div[style*=\"display: grid\"] {\n position: absolute !important;\n top: 0 !important;\n right: 0 !important;\n left: auto !important;\n z-index: 9999 !important;\n display: grid !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n visibility: visible !important;\n padding: var(--spacing-btn) !important;\n min-width: 12em !important;\n background: var(--color-background) !important;\n border: var(--border-width-sm) solid var(--color-primary) !important;\n border-radius: var(--border-radius-base) !important;\n box-shadow: var(--box-shadow-popup) !important;\n grid-template-columns: auto auto !important;\n gap: var(--spacing-xxs) !important;\n}\n\n/* ── Section heading ─────────────────────────────────────────── */\n\n.contactPane .contactPanedHeading {\n font-size: var(--font-size-lg);\n font-weight: bold;\n color: var(--color-primary);\n margin: var(--spacing-sm) 0;\n}\n\n/* ── Prompt text ─────────────────────────────────────────────── */\n\n.contactPane .webidPrompt {\n padding: var(--spacing-sm);\n border: none;\n font-size: var(--font-size-base);\n white-space: pre-wrap;\n}\n\n/* ── Visibility / display helpers ────────────────────────────── */\n\n.contactPane .collapsed {\n visibility: collapse;\n}\n"],"sourceRoot":""}]);
2399
2707
  // Exports
2400
2708
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
2401
2709
 
@@ -2694,13 +3002,13 @@ module.exports = insertStyleElement;
2694
3002
  /***/ },
2695
3003
 
2696
3004
  /***/ 56
2697
- (module, __unused_webpack_exports, __nested_webpack_require_99110__) {
3005
+ (module, __unused_webpack_exports, __nested_webpack_require_124929__) {
2698
3006
 
2699
3007
 
2700
3008
 
2701
3009
  /* istanbul ignore next */
2702
3010
  function setAttributesWithoutAttributes(styleElement) {
2703
- var nonce = true ? __nested_webpack_require_99110__.nc : 0;
3011
+ var nonce = true ? __nested_webpack_require_124929__.nc : 0;
2704
3012
  if (nonce) {
2705
3013
  styleElement.setAttribute("nonce", nonce);
2706
3014
  }
@@ -2830,7 +3138,7 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__104__;
2830
3138
  /******/ var __webpack_module_cache__ = {};
2831
3139
  /******/
2832
3140
  /******/ // The require function
2833
- /******/ function __nested_webpack_require_102275__(moduleId) {
3141
+ /******/ function __nested_webpack_require_128094__(moduleId) {
2834
3142
  /******/ // Check if module is in cache
2835
3143
  /******/ var cachedModule = __webpack_module_cache__[moduleId];
2836
3144
  /******/ if (cachedModule !== undefined) {
@@ -2844,24 +3152,24 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__104__;
2844
3152
  /******/ };
2845
3153
  /******/
2846
3154
  /******/ // Execute the module function
2847
- /******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_102275__);
3155
+ /******/ __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_128094__);
2848
3156
  /******/
2849
3157
  /******/ // Return the exports of the module
2850
3158
  /******/ return module.exports;
2851
3159
  /******/ }
2852
3160
  /******/
2853
3161
  /******/ // expose the modules object (__webpack_modules__)
2854
- /******/ __nested_webpack_require_102275__.m = __webpack_modules__;
3162
+ /******/ __nested_webpack_require_128094__.m = __webpack_modules__;
2855
3163
  /******/
2856
3164
  /************************************************************************/
2857
3165
  /******/ /* webpack/runtime/compat get default export */
2858
3166
  /******/ (() => {
2859
3167
  /******/ // getDefaultExport function for compatibility with non-harmony modules
2860
- /******/ __nested_webpack_require_102275__.n = (module) => {
3168
+ /******/ __nested_webpack_require_128094__.n = (module) => {
2861
3169
  /******/ var getter = module && module.__esModule ?
2862
3170
  /******/ () => (module['default']) :
2863
3171
  /******/ () => (module);
2864
- /******/ __nested_webpack_require_102275__.d(getter, { a: getter });
3172
+ /******/ __nested_webpack_require_128094__.d(getter, { a: getter });
2865
3173
  /******/ return getter;
2866
3174
  /******/ };
2867
3175
  /******/ })();
@@ -2869,9 +3177,9 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__104__;
2869
3177
  /******/ /* webpack/runtime/define property getters */
2870
3178
  /******/ (() => {
2871
3179
  /******/ // define getter functions for harmony exports
2872
- /******/ __nested_webpack_require_102275__.d = (exports, definition) => {
3180
+ /******/ __nested_webpack_require_128094__.d = (exports, definition) => {
2873
3181
  /******/ for(var key in definition) {
2874
- /******/ if(__nested_webpack_require_102275__.o(definition, key) && !__nested_webpack_require_102275__.o(exports, key)) {
3182
+ /******/ if(__nested_webpack_require_128094__.o(definition, key) && !__nested_webpack_require_128094__.o(exports, key)) {
2875
3183
  /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2876
3184
  /******/ }
2877
3185
  /******/ }
@@ -2880,12 +3188,12 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__104__;
2880
3188
  /******/
2881
3189
  /******/ /* webpack/runtime/hasOwnProperty shorthand */
2882
3190
  /******/ (() => {
2883
- /******/ __nested_webpack_require_102275__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
3191
+ /******/ __nested_webpack_require_128094__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2884
3192
  /******/ })();
2885
3193
  /******/
2886
3194
  /******/ /* webpack/runtime/jsonp chunk loading */
2887
3195
  /******/ (() => {
2888
- /******/ __nested_webpack_require_102275__.b = (typeof document !== 'undefined' && document.baseURI) || self.location.href;
3196
+ /******/ __nested_webpack_require_128094__.b = (typeof document !== 'undefined' && document.baseURI) || self.location.href;
2889
3197
  /******/
2890
3198
  /******/ // object to store loaded and loading chunks
2891
3199
  /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
@@ -2911,45 +3219,45 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__104__;
2911
3219
  /******/
2912
3220
  /******/ /* webpack/runtime/nonce */
2913
3221
  /******/ (() => {
2914
- /******/ __nested_webpack_require_102275__.nc = undefined;
3222
+ /******/ __nested_webpack_require_128094__.nc = undefined;
2915
3223
  /******/ })();
2916
3224
  /******/
2917
3225
  /************************************************************************/
2918
3226
  var __nested_webpack_exports__ = {};
2919
3227
 
2920
3228
  // EXPORTS
2921
- __nested_webpack_require_102275__.d(__nested_webpack_exports__, {
3229
+ __nested_webpack_require_128094__.d(__nested_webpack_exports__, {
2922
3230
  "default": () => (/* binding */ src_contactsPane)
2923
3231
  });
2924
3232
 
2925
3233
  // UNUSED EXPORTS: addPersonToGroup, addWebIDToContacts, getPersonas, groupMembers, removeWebIDFromContacts, saveNewContact, saveNewGroup
2926
3234
 
2927
3235
  // EXTERNAL MODULE: external {"commonjs":"solid-logic","commonjs2":"solid-logic","amd":"solid-logic","root":"SolidLogic"}
2928
- var external_commonjs_solid_logic_commonjs2_solid_logic_amd_solid_logic_root_SolidLogic_ = __nested_webpack_require_102275__(941);
3236
+ var external_commonjs_solid_logic_commonjs2_solid_logic_amd_solid_logic_root_SolidLogic_ = __nested_webpack_require_128094__(941);
2929
3237
  // EXTERNAL MODULE: external {"commonjs":"solid-ui","commonjs2":"solid-ui","amd":"solid-ui","root":"UI"}
2930
- var external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_ = __nested_webpack_require_102275__(104);
3238
+ var external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_ = __nested_webpack_require_128094__(104);
2931
3239
  // EXTERNAL MODULE: external {"commonjs":"rdflib","commonjs2":"rdflib","amd":"rdflib","root":"$rdf"}
2932
- var external_commonjs_rdflib_commonjs2_rdflib_amd_rdflib_root_$rdf_ = __nested_webpack_require_102275__(53);
3240
+ var external_commonjs_rdflib_commonjs2_rdflib_amd_rdflib_root_$rdf_ = __nested_webpack_require_128094__(53);
2933
3241
  // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js
2934
- var injectStylesIntoStyleTag = __nested_webpack_require_102275__(72);
2935
- var injectStylesIntoStyleTag_default = /*#__PURE__*/__nested_webpack_require_102275__.n(injectStylesIntoStyleTag);
3242
+ var injectStylesIntoStyleTag = __nested_webpack_require_128094__(72);
3243
+ var injectStylesIntoStyleTag_default = /*#__PURE__*/__nested_webpack_require_128094__.n(injectStylesIntoStyleTag);
2936
3244
  // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleDomAPI.js
2937
- var styleDomAPI = __nested_webpack_require_102275__(825);
2938
- var styleDomAPI_default = /*#__PURE__*/__nested_webpack_require_102275__.n(styleDomAPI);
3245
+ var styleDomAPI = __nested_webpack_require_128094__(825);
3246
+ var styleDomAPI_default = /*#__PURE__*/__nested_webpack_require_128094__.n(styleDomAPI);
2939
3247
  // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertBySelector.js
2940
- var insertBySelector = __nested_webpack_require_102275__(659);
2941
- var insertBySelector_default = /*#__PURE__*/__nested_webpack_require_102275__.n(insertBySelector);
3248
+ var insertBySelector = __nested_webpack_require_128094__(659);
3249
+ var insertBySelector_default = /*#__PURE__*/__nested_webpack_require_128094__.n(insertBySelector);
2942
3250
  // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js
2943
- var setAttributesWithoutAttributes = __nested_webpack_require_102275__(56);
2944
- var setAttributesWithoutAttributes_default = /*#__PURE__*/__nested_webpack_require_102275__.n(setAttributesWithoutAttributes);
3251
+ var setAttributesWithoutAttributes = __nested_webpack_require_128094__(56);
3252
+ var setAttributesWithoutAttributes_default = /*#__PURE__*/__nested_webpack_require_128094__.n(setAttributesWithoutAttributes);
2945
3253
  // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/insertStyleElement.js
2946
- var insertStyleElement = __nested_webpack_require_102275__(540);
2947
- var insertStyleElement_default = /*#__PURE__*/__nested_webpack_require_102275__.n(insertStyleElement);
3254
+ var insertStyleElement = __nested_webpack_require_128094__(540);
3255
+ var insertStyleElement_default = /*#__PURE__*/__nested_webpack_require_128094__.n(insertStyleElement);
2948
3256
  // EXTERNAL MODULE: ./node_modules/style-loader/dist/runtime/styleTagTransform.js
2949
- var styleTagTransform = __nested_webpack_require_102275__(113);
2950
- var styleTagTransform_default = /*#__PURE__*/__nested_webpack_require_102275__.n(styleTagTransform);
3257
+ var styleTagTransform = __nested_webpack_require_128094__(113);
3258
+ var styleTagTransform_default = /*#__PURE__*/__nested_webpack_require_128094__.n(styleTagTransform);
2951
3259
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/webidControl.css
2952
- var webidControl = __nested_webpack_require_102275__(886);
3260
+ var webidControl = __nested_webpack_require_128094__(886);
2953
3261
  ;// ./src/styles/webidControl.css
2954
3262
 
2955
3263
 
@@ -2978,6 +3286,8 @@ var update = injectStylesIntoStyleTag_default()(webidControl/* default */.A, opt
2978
3286
  /* harmony default export */ const styles_webidControl = (webidControl/* default */.A && webidControl/* default */.A.locals ? webidControl/* default */.A.locals : undefined);
2979
3287
 
2980
3288
  ;// ./src/debug.js
3289
+ /* eslint-disable no-console */
3290
+
2981
3291
  function log (...args) {
2982
3292
  console.log(...args)
2983
3293
  }
@@ -3268,7 +3578,6 @@ async function renderIdControl (person, dataBrowserContext, options) {
3268
3578
 
3269
3579
  async function refreshWebIDTable () {
3270
3580
  const personas = getPersonas(kb, person)
3271
- prompt.classList.toggle('hidden', personas.length > 0)
3272
3581
  utils.syncTableToArrayReOrdered(profileArea, personas, persona => renderPersona(dom, persona, kb))
3273
3582
  }
3274
3583
  async function addOneIdAndRefresh (person, webid) {
@@ -3276,7 +3585,7 @@ async function renderIdControl (person, dataBrowserContext, options) {
3276
3585
  await addWebIDToContacts(person, webid, options.urlType, kb)
3277
3586
  } catch (err) {
3278
3587
  error('Error adding webId ' + webid + ' to ' + person + '. Stack: ' + err)
3279
- div.appendChild(widgets.errorMessageBlock(dom, 'Error adding WebID to profile. If it persists, contact admin.'))
3588
+ div.appendChild(widgets.errorMessageBlock(dom, 'This is not a valid WebID.'))
3280
3589
  }
3281
3590
  await refreshWebIDTable()
3282
3591
  }
@@ -3293,12 +3602,9 @@ async function renderIdControl (person, dataBrowserContext, options) {
3293
3602
  }
3294
3603
 
3295
3604
  const h3 = div.appendChild(dom.createElement('h3'))
3296
- h3.textContent = options.idNoun
3297
- h3.classList.add('webidHeading')
3605
+ h3.textContent = 'Link to a ' + options.idNoun
3606
+ h3.classList.add('contactPanedHeading')
3298
3607
 
3299
- const prompt = div.appendChild(dom.createElement('p'))
3300
- prompt.classList.add('webidPrompt')
3301
- prompt.textContent = options.longPrompt
3302
3608
  const table = div.appendChild(dom.createElement('table'))
3303
3609
  table.classList.add('fullWidth')
3304
3610
 
@@ -3327,7 +3633,7 @@ async function renderIdControl (person, dataBrowserContext, options) {
3327
3633
  }
3328
3634
 
3329
3635
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/localUtils.css
3330
- var localUtils = __nested_webpack_require_102275__(546);
3636
+ var localUtils = __nested_webpack_require_128094__(546);
3331
3637
  ;// ./src/styles/localUtils.css
3332
3638
 
3333
3639
 
@@ -3609,6 +3915,107 @@ function nameFor (x) {
3609
3915
  return name ? name.value : '???'
3610
3916
  }
3611
3917
 
3918
+ /**
3919
+ * Prevent keyboard tabbing into labels/label-like links created by rdflib/solid-ui forms.
3920
+ * @param {HTMLElement} root
3921
+ */
3922
+ function skipLabelsFromTabbing (root) {
3923
+ // Many Solid-UI forms render field labels as focusable links (hrefs).
3924
+ // Make sure keyboard tabbing skips these label links entirely.
3925
+ const selectors = [
3926
+ 'label',
3927
+ '.formFieldName a',
3928
+ '.classifierBox-label a',
3929
+ '.choiceBox-label a',
3930
+ '.label a',
3931
+ // Skip focusable label-like links created by Solid-UI forms, including the vcard note link
3932
+ 'a[href="http://www.w3.org/2006/vcard/ns#note"]',
3933
+ 'a[href$="#note"]',
3934
+ ].join(', ')
3935
+
3936
+ // Some environments have NodeLists without forEach (e.g., older Safari).
3937
+ const nodes = root?.querySelectorAll?.(selectors)
3938
+ if (!nodes) return
3939
+
3940
+ Array.from(nodes).forEach(el => {
3941
+ // Some browsers may return null for tabIndex, and some elements may not
3942
+ // expose tabIndex at all (e.g., SVG elements), so guard before setting.
3943
+ if (typeof el.tabIndex === 'number' && el.tabIndex !== -1) {
3944
+ el.tabIndex = -1
3945
+ }
3946
+ // Ensure those label links are not announced as focusable elements
3947
+ if (el.getAttribute('aria-hidden') !== 'true') {
3948
+ el.setAttribute('aria-hidden', 'true')
3949
+ }
3950
+ })
3951
+ }
3952
+
3953
+ function isAWebID (subject) {
3954
+ const t = localUtils_kb.findTypeURIs(subject.doc())
3955
+ return !!t[localUtils_ns.foaf('PersonalProfileDocument').uri]
3956
+ }
3957
+
3958
+
3959
+ // Make the layout stack vertically when the containing pane gets narrow
3960
+ function setupResponsiveStacking (paneDiv, breakpoint = 900) {
3961
+ function updateFromPane () {
3962
+ const width = paneDiv.getBoundingClientRect().width
3963
+ const isNarrow = width <= breakpoint
3964
+ // Always track viewport fallback even if pane is not in DOM yet
3965
+ const viewportNarrow = (typeof window !== 'undefined' && typeof window.matchMedia === 'function')
3966
+ ? window.matchMedia('(max-width: ' + breakpoint + 'px)').matches
3967
+ : false
3968
+
3969
+ if (width > 0) {
3970
+ paneDiv.classList.toggle('contactPane--narrow', isNarrow)
3971
+ paneDiv.dataset.paneWidth = Math.round(width).toString()
3972
+ paneDiv.dataset.paneNarrow = isNarrow ? 'true' : 'false'
3973
+ } else {
3974
+ // If not inserted yet, apply viewport mode until placed.
3975
+ paneDiv.classList.toggle('contactPane--narrow', viewportNarrow)
3976
+ paneDiv.dataset.paneWidth = '0'
3977
+ paneDiv.dataset.paneNarrow = viewportNarrow ? 'true' : 'false'
3978
+ }
3979
+
3980
+ paneDiv.dataset.viewportNarrow = viewportNarrow ? 'true' : 'false'
3981
+
3982
+ return isNarrow
3983
+ }
3984
+
3985
+ function updateFromViewport () {
3986
+ const isNarrow = (typeof window !== 'undefined' && typeof window.matchMedia === 'function')
3987
+ ? window.matchMedia('(max-width: ' + breakpoint + 'px)').matches
3988
+ : false
3989
+ paneDiv.classList.toggle('contactPane--narrow', isNarrow)
3990
+ paneDiv.dataset.viewportNarrow = isNarrow ? 'true' : 'false'
3991
+ return isNarrow
3992
+ }
3993
+
3994
+ const resizeObserverAvailable = typeof ResizeObserver !== 'undefined'
3995
+ if (resizeObserverAvailable) {
3996
+ const ro = new ResizeObserver(() => updateFromPane())
3997
+ ro.observe(paneDiv)
3998
+ }
3999
+
4000
+ if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {
4001
+ window.addEventListener('resize', () => {
4002
+ updateFromPane()
4003
+ updateFromViewport()
4004
+ })
4005
+ }
4006
+
4007
+ // Initial state
4008
+ function ensureInitialUpdate () {
4009
+ const paneNarrow = updateFromPane()
4010
+ const viewportNarrow = updateFromViewport()
4011
+ // If we are not in the document yet, re-run until connected
4012
+ if (!paneDiv.isConnected) {
4013
+ requestAnimationFrame(ensureInitialUpdate)
4014
+ }
4015
+ }
4016
+
4017
+ ensureInitialUpdate()
4018
+ }
3612
4019
  ;// ./src/contactLogic.js
3613
4020
 
3614
4021
 
@@ -4029,7 +4436,7 @@ function mintNewAddressBook (dataBrowserContext, context) {
4029
4436
  }
4030
4437
 
4031
4438
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/mugshotGallery.css
4032
- var mugshotGallery = __nested_webpack_require_102275__(715);
4439
+ var mugshotGallery = __nested_webpack_require_128094__(715);
4033
4440
  ;// ./src/styles/mugshotGallery.css
4034
4441
 
4035
4442
 
@@ -4395,7 +4802,7 @@ function renderMugshotGallery (dom, subject) {
4395
4802
  }
4396
4803
 
4397
4804
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/groupMembership.css
4398
- var groupMembership = __nested_webpack_require_102275__(93);
4805
+ var groupMembership = __nested_webpack_require_128094__(93);
4399
4806
  ;// ./src/styles/groupMembership.css
4400
4807
 
4401
4808
 
@@ -4981,11 +5388,11 @@ const groupMembershipControl_ns = external_commonjs_solid_ui_commonjs2_solid_ui_
4981
5388
  const groupMembershipControl_kb = external_commonjs_solid_logic_commonjs2_solid_logic_amd_solid_logic_root_SolidLogic_.store
4982
5389
 
4983
5390
  // Groups the person is a member of
4984
- function groupMembershipControl_groupMembership (person) {
4985
- let groups = groupMembershipControl_kb.statementsMatching(null, groupMembershipControl_ns.owl('sameAs'), person).map(st => st.why)
4986
- .concat(groupMembershipControl_kb.each(null, groupMembershipControl_ns.vcard('hasMember'), person))
5391
+ function groupMembershipControl_groupMembership (person, store = groupMembershipControl_kb) {
5392
+ let groups = store.statementsMatching(null, groupMembershipControl_ns.owl('sameAs'), person).map(st => st.why)
5393
+ .concat(store.each(null, groupMembershipControl_ns.vcard('hasMember'), person))
4987
5394
  const strings = new Set(groups.map(group => normalizeGroupUri(group.uri))) // remove dups with normalized URIs
4988
- groups = [...strings].map(uri => groupMembershipControl_kb.sym(uri))
5395
+ groups = [...strings].map(uri => store.sym(uri))
4989
5396
  return groups
4990
5397
  }
4991
5398
 
@@ -5103,9 +5510,21 @@ async function renderGroupMemberships (person, context, ulPeople) {
5103
5510
  return li
5104
5511
  }
5105
5512
 
5106
- function syncGroupPills () {
5107
- const groups = groupMembershipControl_groupMembership(person)
5108
- const pillsWrapper = container.querySelector('.group-pills-wrapper')
5513
+ function syncGroupPills (groups = null) {
5514
+ // Clear previous render so we don't keep appending duplicate headers / lists
5515
+ container.innerHTML = ''
5516
+
5517
+ const header = dom.createElement('h3')
5518
+ header.classList.add('group-membership-header')
5519
+ header.textContent = 'Part of groups'
5520
+ container.appendChild(header)
5521
+
5522
+ const pillsWrapper = dom.createElement('ul')
5523
+ pillsWrapper.classList.add('group-pills-wrapper')
5524
+ container.appendChild(pillsWrapper)
5525
+
5526
+ groups = groups || groupMembershipControl_groupMembership(person, kb)
5527
+
5109
5528
  if (groups.length === 0) {
5110
5529
  pillsWrapper.innerHTML = '<span>Not part of any Address Book group.</span>'
5111
5530
  } else {
@@ -5121,12 +5540,13 @@ async function renderGroupMemberships (person, context, ulPeople) {
5121
5540
  if (!book) {
5122
5541
  book = kb.any(undefined, groupMembershipControl_ns.vcard('includesGroup'))
5123
5542
  if (!book) {
5124
- return // no book => no groups
5543
+ return [] // no book => no groups
5125
5544
  }
5126
5545
  }
5127
5546
  const groupIndex = kb.any(book, groupMembershipControl_ns.vcard('groupIndex'))
5128
5547
  const gs = book ? kb.each(book, groupMembershipControl_ns.vcard('includesGroup'), null, groupIndex) : []
5129
5548
  await kb.fetcher.load(gs)
5549
+ return gs
5130
5550
  }
5131
5551
 
5132
5552
  const { dom } = context
@@ -5135,30 +5555,21 @@ async function renderGroupMemberships (person, context, ulPeople) {
5135
5555
  const container = dom.createElement('div')
5136
5556
  container.classList.add('group-membership-container')
5137
5557
 
5138
- // Header
5139
- const header = dom.createElement('h3')
5140
- header.classList.add('group-membership-header')
5141
- header.textContent = 'Part of groups'
5142
- container.appendChild(header)
5143
-
5144
- const pillsWrapper = dom.createElement('ul')
5145
- pillsWrapper.classList.add('group-pills-wrapper')
5146
- container.appendChild(pillsWrapper)
5147
-
5148
- // find book any group and load all groups
5558
+ // find book any group and load all groups (so membership checks have the data they need)
5149
5559
  await loadGroupsFromBook()
5150
5560
 
5561
+ // renders the Part of Group
5151
5562
  container.refresh = syncGroupPills
5152
5563
  syncGroupPills()
5153
5564
  return container
5154
5565
  }
5155
5566
 
5156
5567
  ;// ./src/ontology/individualAndOrganizationForm.ttl
5157
- const individualAndOrganizationForm_namespaceObject = "# This turtle file defines the forms used in the contacts management\n#\n# Individuals and orgs are in one file as they both\n# share some forms (address etc) and also interactions (roles)\n\n# Forms documentation: https://solidos.github.io/solid-ui/docs/forms-intro.html\n\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix dct: <http://purl.org/dc/terms/>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix prov: <http://www.w3.org/ns/prov#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix : <#>.\n\n\n############# For individual:\n:individualForm a ui:Form ;\n dct:title \"Contact details for a person\" ;\n ui:parts (\n :fullNameField\n :nicknameGroup\n :pronounsGroup\n :roleField\n :orgNameField\n # :addressesComment\n :addresses\n # :emailComment\n :eMails\n # :telephoneComment\n :telephones\n :birthdayField\n # :noteComment\n :noteField \n ) .\n\n :fullNameField\n a ui:SingleLineTextField ;\n ui:label \"Name\";\n ui:maxLength \"128\" ;\n ui:property vcard:fn .\n\n # Nickname\n\n :nicknameGroup a ui:Group; ui:weight 0; \n ui:parts (:nicknameField) .\n\n :nicknameField a ui:SingleLineTextField; \n ui:property foaf:nick;\n ui:label \"Nickname\"@en, \"Nom court\"@fr.\n\n # Pronouns\n\n :pronounsGroup a ui:Group; ui:weight 0; \n ui:parts ( :subjectPronounForm :objectPronounForm :relativePronounForm) .\n\n :subjectPronounForm a ui:SingleLineTextField; ui:property solid:preferredSubjectPronoun;\n ui:label \"He/she/they\" .\n :objectPronounForm a ui:SingleLineTextField; ui:property solid:preferredObjectPronoun;\n ui:label \"Him/her/them\" .\n :relativePronounForm a ui:SingleLineTextField; ui:property solid:preferredRelativePronoun;\n ui:label \"His/hers/theirs\" .\n \n :roleField\n a ui:SingleLineTextField ;\n ui:suppressEmptyUneditable true;\n ui:maxLength \"128\" ;\n ui:property vcard:role .\n\n :orgNameField\n a ui:SingleLineTextField ;\n ui:suppressEmptyUneditable true;\n ui:maxLength \"128\" ;\n ui:property vcard:organization-name .\n\n :addresses a ui:Multiple ;\n dct:title \"Address details\" ;\n ui:part :oneAddress ;\n ui:property vcard:hasAddress .\n\n :oneAddress a ui:Group ;\n ui:parts ( \n :id1409437207443 :id1409437292400 \n :id1409437421996 :id1409437467649 \n :id1409437569420 ). \n\n :id1409437207443\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:street-address .\n\n :id1409437292400\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:locality .\n\n :id1409437421996\n a ui:SingleLineTextField ;\n ui:maxLength \"25\" ;\n ui:property vcard:postal-code .\n\n :id1409437467649\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:region .\n\n :id1409437569420\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:country-name .\n\n\n :eMails a ui:Multiple ;\n ui:part :oneEMail ;\n ui:property vcard:hasEmail .\n\n :oneEMail a ui:Group ; # hint: side by side is good\n ui:part :emailValue, :emailType ;\n ui:parts ( :emailType :emailValue ).\n\n :emailValue\n a ui:EmailField ; ui:label \"email\";\n ui:property vcard:value .\n\n :emailType\n a ui:Classifier ;\n ui:canMintNew \"0\" ;\n ui:category vcard:Type ;\n ui:from vcard:Type ;\n ui:property rdf:type .\n\n :telephones a ui:Multiple ;\n ui:part :onetelephone ;\n ui:property vcard:hasTelephone .\n\n :onetelephone\n a ui:Group ;\n ui:part :telephoneValue, :telephoneType ;\n ui:parts ( :telephoneType :telephoneValue ).\n\n :telephoneValue\n a ui:PhoneField ;\n ui:property vcard:value .\n\n :telephoneType\n a ui:Classifier ;\n ui:canMintNew \"0\" ;\n ui:category vcard:TelephoneType ;\n ui:from vcard:Type ;\n ui:property rdf:type .\n\n :birthdayField a ui:DateField;\n ui:label \"Born\"@en;\n ui:suppressEmptyUneditable true;\n ui:property vcard:bday .\n\n :noteField\n a ui:MultiLineTextField ;\n ui:suppressEmptyUneditable true;\n ui:property vcard:note .\n\n# Ontology additions or interpretations needed for the form to work well\n\n# The ontology file doesn't make them disjoint. This makes the selector be a choice.\nvcard:TelephoneType owl:disjointUnionOf ( vcard:Cell vcard:Home vcard:Work) .\nvcard:Type owl:disjointUnionOf (vcard:Home vcard:Work) . # for email\n\n# Better field labels\nvcard:Cell ui:label \"mobile\"@en . # app will make initial caps if necessary\nvcard:hasAddress ui:label \"address\"@en .\nvcard:bday ui:label \"born\"@en.\nvcard:hasEmail ui:label \"email\"@en .\nvcard:hasTelephone ui:label \"phone\"@en .\nvcard:note ui:label \"notes\"@en .\n\n\n############ For organizations\n\n:organizationForm a ui:Form ; \n dct:title \"Contact details for an organization\";\n ui:parts (\n :OrgClassifier\n :fullNameField\n :homePageURIField\n :addresses\n :eMails\n :telephones\n :noteField ) .\n\n :OrgClassifier a ui:Classifier; \n ui:label \"What sort of organization?\"@en;\n ui:category solid:InterestingOrganization .\n\n :homePageURIField a ui:NamedNodeURIField;\n ui:label \"Homepage\"@en;\n ui:property schema:url .\n\n# Ontology data to drive the :OrgClassifier classifier\n solid: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";
5568
+ const individualAndOrganizationForm_namespaceObject = "# This turtle file defines the forms used in the contacts management\n#\n# Individuals and orgs are in one file as they both\n# share some forms (address etc) and also interactions (roles)\n\n# Forms documentation: https://solidos.github.io/solid-ui/docs/forms-intro.html\n\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.\n@prefix dct: <http://purl.org/dc/terms/>.\n@prefix foaf: <http://xmlns.com/foaf/0.1/>.\n@prefix owl: <http://www.w3.org/2002/07/owl#>.\n@prefix prov: <http://www.w3.org/ns/prov#>.\n@prefix ui: <http://www.w3.org/ns/ui#>.\n@prefix schema: <http://schema.org/>.\n@prefix solid: <http://www.w3.org/ns/solid/terms#>.\n@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.\n@prefix : <#>.\n\n\n############# For individual:\n:individualForm a ui:Form ;\n dct:title \"Contact details for a person\" ;\n ui:parts (\n :fullNameField\n :nicknameGroup\n :pronounsGroup\n :roleField\n :orgNameField\n # :addressesComment\n :addresses\n # :emailComment\n :eMails\n # :telephoneComment\n :telephones\n :birthdayField\n # :noteComment\n :noteField \n ) .\n\n :fullNameField\n a ui:SingleLineTextField ;\n ui:label \"Name\";\n ui:maxLength \"128\" ;\n ui:property vcard:fn .\n\n # Nickname\n\n :nicknameGroup a ui:Group; ui:weight 0; \n ui:parts (:nicknameField) .\n\n :nicknameField a ui:SingleLineTextField; \n ui:property foaf:nick;\n ui:label \"Nickname\"@en, \"Nom court\"@fr.\n\n # Pronouns\n\n :pronounsGroup a ui:Group; ui:weight 0; \n ui:parts ( :subjectPronounForm :objectPronounForm :relativePronounForm) .\n\n :subjectPronounForm a ui:SingleLineTextField; ui:property solid:preferredSubjectPronoun;\n ui:label \"he/she/they\" .\n :objectPronounForm a ui:SingleLineTextField; ui:property solid:preferredObjectPronoun;\n ui:label \"him/her/them\" .\n :relativePronounForm a ui:SingleLineTextField; ui:property solid:preferredRelativePronoun;\n ui:label \"his/hers/theirs\" .\n \n :roleField\n a ui:SingleLineTextField ;\n ui:suppressEmptyUneditable true;\n ui:maxLength \"128\" ;\n ui:property vcard:role .\n\n :orgNameField\n a ui:SingleLineTextField ;\n ui:suppressEmptyUneditable true;\n ui:maxLength \"128\" ;\n ui:property vcard:organization-name .\n\n :addresses a ui:Multiple ;\n dct:title \"Address details\" ;\n ui:part :oneAddress ;\n ui:property vcard:hasAddress .\n\n :oneAddress a ui:Group ;\n ui:parts ( \n :id1409437207443 :id1409437292400 \n :id1409437421996 :id1409437467649 \n :id1409437569420 ). \n\n :id1409437207443\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:street-address .\n\n :id1409437292400\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:locality .\n\n :id1409437421996\n a ui:SingleLineTextField ;\n ui:maxLength \"25\" ;\n ui:property vcard:postal-code .\n\n :id1409437467649\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:region .\n\n :id1409437569420\n a ui:SingleLineTextField ;\n ui:maxLength \"128\" ;\n ui:property vcard:country-name .\n\n\n :eMails a ui:Multiple ;\n ui:part :oneEMail ;\n ui:property vcard:hasEmail .\n\n :oneEMail a ui:Group ; # hint: side by side is good\n ui:part :emailValue, :emailType ;\n ui:parts ( :emailType :emailValue ).\n\n :emailValue\n a ui:EmailField ; ui:label \"email\";\n ui:property vcard:value .\n\n :emailType\n a ui:Classifier ;\n ui:canMintNew \"0\" ;\n ui:category vcard:Type ;\n ui:from vcard:Type ;\n ui:property rdf:type .\n\n :telephones a ui:Multiple ;\n ui:part :onetelephone ;\n ui:property vcard:hasTelephone .\n\n :onetelephone\n a ui:Group ;\n ui:part :telephoneValue, :telephoneType ;\n ui:parts ( :telephoneType :telephoneValue ).\n\n :telephoneValue\n a ui:PhoneField ;\n ui:property vcard:value .\n\n :telephoneType\n a ui:Classifier ;\n ui:canMintNew \"0\" ;\n ui:category vcard:TelephoneType ;\n ui:from vcard:Type ;\n ui:property rdf:type .\n\n :birthdayField a ui:DateField;\n ui:label \"Born\"@en;\n ui:suppressEmptyUneditable true;\n ui:property vcard:bday .\n\n :noteField\n a ui:MultiLineTextField ;\n ui:suppressEmptyUneditable true;\n ui:property vcard:note .\n\n# Ontology additions or interpretations needed for the form to work well\n\n# The ontology file doesn't make them disjoint. This makes the selector be a choice.\nvcard:TelephoneType owl:disjointUnionOf ( vcard:Cell vcard:Home vcard:Work) .\nvcard:Type owl:disjointUnionOf (vcard:Home vcard:Work) . # for email\n\n# Better field labels\nvcard:Cell ui:label \"mobile\"@en . # app will make initial caps if necessary\nvcard:hasAddress ui:label \"address\"@en .\nvcard:bday ui:label \"born\"@en.\nvcard:hasEmail ui:label \"email\"@en .\nvcard:hasTelephone ui:label \"phone\"@en .\nvcard:note ui:label \"notes\"@en .\n\n\n############ For organizations\n\n:organizationForm a ui:Form ; \n dct:title \"Contact details for an organization\";\n ui:parts (\n :OrgClassifier\n :fullNameField\n :homePageURIField\n :addresses\n :eMails\n :telephones\n :noteField ) .\n\n :OrgClassifier a ui:Classifier; \n ui:label \"What sort of organization?\"@en;\n ui:category solid:InterestingOrganization .\n\n :homePageURIField a ui:NamedNodeURIField;\n ui:label \"Homepage\"@en;\n ui:property schema:url .\n\n# Ontology data to drive the :OrgClassifier classifier\n solid: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";
5158
5569
  ;// ./src/ontology/vcard.ttl
5159
5570
  const vcard_namespaceObject = "@prefix : <http://www.w3.org/2006/vcard/ns#> .\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\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 xml: <http://www.w3.org/XML/1998/namespace> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\n:Acquaintance a owl:Class ;\n rdfs:label \"Acquaintance\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Agent a owl:Class ;\n rdfs:label \"Agent\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:BBS a owl:Class ;\n rdfs:label \"BBS\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType ;\n owl:deprecated true .\n\n:Car a owl:Class ;\n rdfs:label \"Car\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType ;\n owl:deprecated true .\n\n:Cell a owl:Class ;\n rdfs:label \"Cell\"@en ;\n rdfs:comment \"Also called mobile telephone\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:Child a owl:Class ;\n rdfs:label \"Child\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Colleague a owl:Class ;\n rdfs:label \"Colleague\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Contact a owl:Class ;\n rdfs:label \"Contact\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Coresident a owl:Class ;\n rdfs:label \"Coresident\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Coworker a owl:Class ;\n rdfs:label \"Coworker\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Crush a owl:Class ;\n rdfs:label \"Crush\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Date a owl:Class ;\n rdfs:label \"Date\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Dom a owl:Class ;\n rdfs:label \"Dom\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Emergency a owl:Class ;\n rdfs:label \"Emergency\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Fax a owl:Class ;\n rdfs:label \"Fax\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:Female a owl:Class ;\n rdfs:label \"Female\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Gender .\n\n:Friend a owl:Class ;\n rdfs:label \"Friend\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Home a owl:Class ;\n rdfs:label \"Home\"@en ;\n rdfs:comment \"This implies that the property is related to an individual's personal life\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type .\n\n:ISDN a owl:Class ;\n rdfs:label \"ISDN\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Internet a owl:Class ;\n rdfs:label \"Internet\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Intl a owl:Class ;\n rdfs:label \"Intl\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Kin a owl:Class ;\n rdfs:label \"Kin\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Label a owl:Class ;\n rdfs:label \"Label\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Male a owl:Class ;\n rdfs:label \"Male\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Gender .\n\n:Me a owl:Class ;\n rdfs:label \"Me\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Met a owl:Class ;\n rdfs:label \"Met\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Modem a owl:Class ;\n rdfs:label \"Modem\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType ;\n owl:deprecated true .\n\n:Msg a owl:Class ;\n rdfs:label \"Msg\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType ;\n owl:deprecated true .\n\n:Muse a owl:Class ;\n rdfs:label \"Muse\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Neighbor a owl:Class ;\n rdfs:label \"Neighbor\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:None a owl:Class ;\n rdfs:label \"None\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Gender .\n\n:Other a owl:Class ;\n rdfs:label \"Other\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Gender .\n\n:PCS a owl:Class ;\n rdfs:label \"PCS\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType ;\n owl:deprecated true .\n\n:Pager a owl:Class ;\n rdfs:label \"Pager\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:Parcel a owl:Class ;\n rdfs:label \"Parcel\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Parent a owl:Class ;\n rdfs:label \"Parent\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Postal a owl:Class ;\n rdfs:label \"Postal\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Pref a owl:Class ;\n rdfs:label \"Pref\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:Sibling a owl:Class ;\n rdfs:label \"Sibling\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Spouse a owl:Class ;\n rdfs:label \"Spouse\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Sweetheart a owl:Class ;\n rdfs:label \"Sweetheart\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :RelatedType .\n\n:Tel a owl:Class ;\n rdfs:label \"Tel\"@en ;\n rdfs:comment \"This class is deprecated. Use the hasTelephone object property.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:Text a owl:Class ;\n rdfs:label \"Text\"@en ;\n rdfs:comment \"Also called sms telephone\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:TextPhone a owl:Class ;\n rdfs:label \"Text phone\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:Unknown a owl:Class ;\n rdfs:label \"Unknown\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Gender .\n\n:Video a owl:Class ;\n rdfs:label \"Video\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:Voice a owl:Class ;\n rdfs:label \"Voice\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :TelephoneType .\n\n:Work a owl:Class ;\n rdfs:label \"Work\"@en ;\n rdfs:comment \"This implies that the property is related to an individual's work place\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type .\n\n:X400 a owl:Class ;\n rdfs:label \"X400\"@en ;\n rdfs:comment \"This class is deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Type ;\n owl:deprecated true .\n\n:adr a owl:ObjectProperty ;\n rdfs:label \"address\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasAddress .\n\n:agent a owl:ObjectProperty ;\n rdfs:label \"agent\"@en ;\n rdfs:comment \"This object property has been deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:anniversary a owl:DatatypeProperty ;\n rdfs:label \"anniversary\"@en ;\n rdfs:comment \"The date of marriage, or equivalent, of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range [ a rdfs:Datatype ;\n owl:unionOf ( xsd:dateTime xsd:gYear ) ] .\n\n:bday a owl:DatatypeProperty ;\n rdfs:label \"birth date\"@en ;\n rdfs:comment \"To specify the birth date of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range [ a rdfs:Datatype ;\n owl:unionOf ( xsd:dateTime xsd:dateTimeStamp xsd:gYear ) ] .\n\n:category a owl:DatatypeProperty ;\n rdfs:label \"category\"@en ;\n rdfs:comment \"The category information about the object, also known as tags\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:class a owl:DatatypeProperty ;\n rdfs:label \"class\"@en ;\n rdfs:comment \"This data property has been deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:email a owl:ObjectProperty ;\n rdfs:label \"email\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasEmail .\n\n:extended-address a owl:DatatypeProperty ;\n rdfs:label \"extended address\"@en ;\n rdfs:comment \"This data property has been deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:geo a owl:ObjectProperty ;\n rdfs:label \"geo\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasGeo .\n\n:hasAdditionalName a owl:ObjectProperty ;\n rdfs:label \"has additional name\"@en ;\n rdfs:comment \"Used to support property parameters for the additional name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasCalendarBusy a owl:ObjectProperty ;\n rdfs:label \"has calendar busy\"@en ;\n rdfs:comment \"To specify the busy time associated with the object. (Was called FBURL in RFC6350)\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasCalendarLink a owl:ObjectProperty ;\n rdfs:label \"has calendar link\"@en ;\n rdfs:comment \"To specify the calendar associated with the object. (Was called CALURI in RFC6350)\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasCalendarRequest a owl:ObjectProperty ;\n rdfs:label \"has calendar request\"@en ;\n rdfs:comment \"To specify the calendar user address to which a scheduling request be sent for the object. (Was called CALADRURI in RFC6350)\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasCategory a owl:ObjectProperty ;\n rdfs:label \"has category\"@en ;\n rdfs:comment \"Used to support property parameters for the category data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasCountryName a owl:ObjectProperty ;\n rdfs:label \"has country name\"@en ;\n rdfs:comment \"Used to support property parameters for the country name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasFN a owl:ObjectProperty ;\n rdfs:label \"has formatted name\"@en ;\n rdfs:comment \"Used to support property parameters for the formatted name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasFamilyName a owl:ObjectProperty ;\n rdfs:label \"has family name\"@en ;\n rdfs:comment \"Used to support property parameters for the family name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasGender a owl:ObjectProperty ;\n rdfs:label \"has gender\"@en ;\n rdfs:comment \"To specify the sex or gender identity of the object. URIs are recommended to enable interoperable sex and gender codes to be used.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasGivenName a owl:ObjectProperty ;\n rdfs:label \"has given name\"@en ;\n rdfs:comment \"Used to support property parameters for the given name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasHonorificPrefix a owl:ObjectProperty ;\n rdfs:label \"has honorific prefix\"@en ;\n rdfs:comment \"Used to support property parameters for the honorific prefix data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasHonorificSuffix a owl:ObjectProperty ;\n rdfs:label \"has honorific suffix\"@en ;\n rdfs:comment \"Used to support property parameters for the honorific suffix data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasInstantMessage a owl:ObjectProperty ;\n rdfs:label \"has messaging\"@en ;\n rdfs:comment \"To specify the instant messaging and presence protocol communications with the object. (Was called IMPP in RFC6350)\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasLanguage a owl:ObjectProperty ;\n rdfs:label \"has language\"@en ;\n rdfs:comment \"Used to support property parameters for the language data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasLocality a owl:ObjectProperty ;\n rdfs:label \"has locality\"@en ;\n rdfs:comment \"Used to support property parameters for the locality data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasNickname a owl:ObjectProperty ;\n rdfs:label \"has nickname\"@en ;\n rdfs:comment \"Used to support property parameters for the nickname data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:seeAlso :nickname .\n\n:hasNote a owl:ObjectProperty ;\n rdfs:label \"has note\"@en ;\n rdfs:comment \"Used to support property parameters for the note data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasOrganizationName a owl:ObjectProperty ;\n rdfs:label \"has organization name\"@en ;\n rdfs:comment \"Used to support property parameters for the organization name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasOrganizationUnit a owl:ObjectProperty ;\n rdfs:label \"has organization unit name\"@en ;\n rdfs:comment \"Used to support property parameters for the organization unit name data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasPostalCode a owl:ObjectProperty ;\n rdfs:label \"has postal code\"@en ;\n rdfs:comment \"Used to support property parameters for the postal code data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasRegion a owl:ObjectProperty ;\n rdfs:label \"has region\"@en ;\n rdfs:comment \"Used to support property parameters for the region data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasRelated a owl:ObjectProperty ;\n rdfs:label \"has related\"@en ;\n rdfs:comment \"To specify a relationship between another entity and the entity represented by this object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasRole a owl:ObjectProperty ;\n rdfs:label \"has role\"@en ;\n rdfs:comment \"Used to support property parameters for the role data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasSource a owl:ObjectProperty ;\n rdfs:label \"has source\"@en ;\n rdfs:comment \"To identify the source of directory information of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasStreetAddress a owl:ObjectProperty ;\n rdfs:label \"has street address\"@en ;\n rdfs:comment \"Used to support property parameters for the street address data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasTitle a owl:ObjectProperty ;\n rdfs:label \"has title\"@en ;\n rdfs:comment \"Used to support property parameters for the title data property\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasUID a owl:ObjectProperty ;\n rdfs:label \"has uid\"@en ;\n rdfs:comment \"To specify a value that represents a globally unique identifier corresponding to the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasValue a owl:ObjectProperty ;\n rdfs:label \"has value\"@en ;\n rdfs:comment \"Used to indicate the resource value of an object property that requires property parameters\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:label a owl:DatatypeProperty ;\n rdfs:label \"label\"@en ;\n rdfs:comment \"This data property has been deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:language a owl:DatatypeProperty ;\n rdfs:label \"language\"@en ;\n rdfs:comment \"To specify the language that may be used for contacting the object. May also be used as a property parameter.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:latitude a owl:DatatypeProperty ;\n rdfs:label \"latitude\"@en ;\n rdfs:comment \"This data property has been deprecated. See hasGeo\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:longitude a owl:DatatypeProperty ;\n rdfs:label \"longitude\"@en ;\n rdfs:comment \"This data property has been deprecated. See hasGeo\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:mailer a owl:DatatypeProperty ;\n rdfs:label \"mailer\"@en ;\n rdfs:comment \"This data property has been deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:note a owl:DatatypeProperty ;\n rdfs:label \"note\"@en ;\n rdfs:comment \"A note associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:org a owl:ObjectProperty ;\n rdfs:label \"organization\"@en ;\n rdfs:comment \"This object property has been mapped. Use the organization-name data property.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :organization-name .\n\n:organization-unit a owl:DatatypeProperty ;\n rdfs:label \"organizational unit name\"@en ;\n rdfs:comment \"To specify the organizational unit name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string ;\n rdfs:subPropertyOf :organization-name .\n\n:post-office-box a owl:DatatypeProperty ;\n rdfs:label \"post office box\"@en ;\n rdfs:comment \"This data property has been deprecated\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:prodid a owl:DatatypeProperty ;\n rdfs:label \"product id\"@en ;\n rdfs:comment \"To specify the identifier for the product that created the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:rev a owl:DatatypeProperty ;\n rdfs:label \"revision\"@en ;\n rdfs:comment \"To specify revision information about the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:dateTime .\n\n:role a owl:DatatypeProperty ;\n rdfs:label \"role\"@en ;\n rdfs:comment \"To specify the function or part played in a particular situation by the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:sort-string a owl:DatatypeProperty ;\n rdfs:label \"sort as\"@en ;\n rdfs:comment \"To specify the string to be used for national-language-specific sorting. Used as a property parameter only.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:title a owl:DatatypeProperty ;\n rdfs:label \"title\"@en ;\n rdfs:comment \"To specify the position or job of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:tz a owl:DatatypeProperty ;\n rdfs:label \"time zone\"@en ;\n rdfs:comment \"To indicate time zone information that is specific to the object. May also be used as a property parameter.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:value a owl:DatatypeProperty ;\n rdfs:label \"value\"@en ;\n rdfs:comment \"Used to indicate the literal value of a data property that requires property parameters\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:Address a owl:Class ;\n rdfs:label \"Address\"@en ;\n rdfs:comment \"To specify the components of the delivery address for the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentClass [ a owl:Class ;\n owl:unionOf ( [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :country-name ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :country-name ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :locality ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :locality ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :postal-code ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :postal-code ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :region ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :region ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :street-address ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :street-address ] ) ] ) ] .\n\n:Email a owl:Class ;\n rdfs:label \"Email\"@en ;\n rdfs:comment \"To specify the electronic mail address for communication with the object the vCard represents. Use the hasEmail object property.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:deprecated true .\n\n:Group a owl:Class ;\n rdfs:label \"Group\"@en ;\n rdfs:comment \"Object representing a group of persons or entities. A group object will usually contain hasMember properties to specify the members of the group.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Kind ;\n owl:disjointWith :Individual,\n :Location,\n :Organization ;\n owl:equivalentClass [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :hasMember ;\n owl:someValuesFrom :Kind ] [ a owl:Restriction ;\n owl:minQualifiedCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onClass :Kind ;\n owl:onProperty :hasMember ] ) ] .\n\n:Individual a owl:Class ;\n rdfs:label \"Individual\"@en ;\n rdfs:comment \"An object representing a single person or entity\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Kind ;\n owl:disjointWith :Location,\n :Organization .\n\n:Name a owl:Class ;\n rdfs:label \"Name\"@en ;\n rdfs:comment \"To specify the components of the name of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentClass [ a owl:Class ;\n owl:unionOf ( [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :additional-name ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:minCardinality \"0\"^^xsd:nonNegativeInteger ;\n owl:onProperty :additional-name ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :family-name ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :family-name ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :given-name ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:maxCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onProperty :given-name ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :honorific-prefix ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:minCardinality \"0\"^^xsd:nonNegativeInteger ;\n owl:onProperty :honorific-prefix ] ) ] [ a owl:Class ;\n owl:intersectionOf ( [ a owl:Restriction ;\n owl:onProperty :honorific-suffix ;\n owl:someValuesFrom xsd:string ] [ a owl:Restriction ;\n owl:minCardinality \"0\"^^xsd:nonNegativeInteger ;\n owl:onProperty :honorific-suffix ] ) ] ) ] .\n\n:VCard a owl:Class ;\n rdfs:label \"VCard\"@en ;\n rdfs:comment \"The vCard class is equivalent to the new Kind class, which is the parent for the four explicit types of vCards (Individual, Organization, Location, Group)\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentClass :Kind .\n\n:fn a owl:DatatypeProperty ;\n rdfs:label \"formatted name\"@en ;\n rdfs:comment \"The formatted text corresponding to the name of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:hasAddress a owl:ObjectProperty ;\n rdfs:label \"has address\"@en ;\n rdfs:comment \"To specify the components of the delivery address for the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range :Address .\n\n:hasEmail a owl:ObjectProperty ;\n rdfs:label \"has email\"@en ;\n rdfs:comment \"To specify the electronic mail address for communication with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range :Email .\n\n:hasGeo a owl:ObjectProperty ;\n rdfs:label \"has geo\"@en ;\n rdfs:comment \"To specify information related to the global positioning of the object. May also be used as a property parameter.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:hasKey a owl:ObjectProperty ;\n rdfs:label \"has key\"@en ;\n rdfs:comment \"To specify a public key or authentication certificate associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :key .\n\n:hasLogo a owl:ObjectProperty ;\n rdfs:label \"has logo\"@en ;\n rdfs:comment \"To specify a graphic image of a logo associated with the object \"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :logo .\n\n:hasName a owl:ObjectProperty ;\n rdfs:label \"has name\"@en ;\n rdfs:comment \"To specify the components of the name of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range :Name ;\n owl:equivalentProperty :n .\n\n:hasPhoto a owl:ObjectProperty ;\n rdfs:label \"has photo\"@en ;\n rdfs:comment \"To specify an image or photograph information that annotates some aspect of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :photo .\n\n:hasSound a owl:ObjectProperty ;\n rdfs:label \"has sound\"@en ;\n rdfs:comment \"To specify a digital sound content information that annotates some aspect of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :sound .\n\n:hasTelephone a owl:ObjectProperty ;\n rdfs:label \"has telephone\"@en ;\n rdfs:comment \"To specify the telephone number for telephony communication with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :tel .\n\n:hasURL a owl:ObjectProperty ;\n rdfs:label \"has url\"@en ;\n rdfs:comment \"To specify a uniform resource locator associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :url .\n\n:key a owl:ObjectProperty ;\n rdfs:label \"key\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasKey .\n\n:logo a owl:ObjectProperty ;\n rdfs:label \"logo\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasLogo .\n\n:n a owl:ObjectProperty ;\n rdfs:label \"name\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasName .\n\n:nickname a owl:DatatypeProperty ;\n rdfs:label \"nickname\"@en ;\n rdfs:comment \"The nick name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:photo a owl:ObjectProperty ;\n rdfs:label \"photo\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasPhoto .\n\n:sound a owl:ObjectProperty ;\n rdfs:label \"sound\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasSound .\n\n:tel a owl:ObjectProperty ;\n rdfs:label \"telephone\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasTelephone .\n\n:url a owl:ObjectProperty ;\n rdfs:label \"url\"@en ;\n rdfs:comment \"This object property has been mapped\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentProperty :hasURL .\n\n:Location a owl:Class ;\n rdfs:label \"Location\"@en ;\n rdfs:comment \"An object representing a named geographical place\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Kind ;\n owl:disjointWith :Organization .\n\n:additional-name a owl:DatatypeProperty ;\n rdfs:label \"additional name\"@en ;\n rdfs:comment \"The additional name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:country-name a owl:DatatypeProperty ;\n rdfs:label \"country name\"@en ;\n rdfs:comment \"The country name associated with the address of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:family-name a owl:DatatypeProperty ;\n rdfs:label \"family name\"@en ;\n rdfs:comment \"The family name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:given-name a owl:DatatypeProperty ;\n rdfs:label \"given name\"@en ;\n rdfs:comment \"The given name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:hasMember a owl:ObjectProperty ;\n rdfs:label \"has member\"@en ;\n rdfs:comment \"To include a member in the group this object represents. (This property can only be used by Group individuals)\"@en ;\n rdfs:domain :Group ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range :Kind .\n\n:honorific-prefix a owl:DatatypeProperty ;\n rdfs:label \"honorific prefix\"@en ;\n rdfs:comment \"The honorific prefix of the name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:honorific-suffix a owl:DatatypeProperty ;\n rdfs:label \"honorific suffix\"@en ;\n rdfs:comment \"The honorific suffix of the name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:locality a owl:DatatypeProperty ;\n rdfs:label \"locality\"@en ;\n rdfs:comment \"The locality (e.g. city or town) associated with the address of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:organization-name a owl:DatatypeProperty ;\n rdfs:label \"organization name\"@en ;\n rdfs:comment \"To specify the organizational name associated with the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:postal-code a owl:DatatypeProperty ;\n rdfs:label \"postal code\"@en ;\n rdfs:comment \"The postal code associated with the address of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:region a owl:DatatypeProperty ;\n rdfs:label \"region\"@en ;\n rdfs:comment \"The region (e.g. state or province) associated with the address of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:street-address a owl:DatatypeProperty ;\n rdfs:label \"street address\"@en ;\n rdfs:comment \"The street address associated with the address of the object\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:range xsd:string .\n\n:Organization a owl:Class ;\n rdfs:label \"Organization\"@en ;\n rdfs:comment \"\"\"An object representing an organization. An organization is a single entity, and might represent a business or government, a department or division within a business or government, a club, an association, or the like.\n\"\"\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n rdfs:subClassOf :Kind .\n\n:Gender a owl:Class ;\n rdfs:label \"Gender\"@en ;\n rdfs:comment \"Used for gender codes. The URI of the gender code must be used as the value for Gender.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:Kind a owl:Class ;\n rdfs:label \"Kind\"@en ;\n rdfs:comment \"The parent class for all objects\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> ;\n owl:equivalentClass [ a owl:Restriction ;\n owl:minQualifiedCardinality \"1\"^^xsd:nonNegativeInteger ;\n owl:onDataRange xsd:string ;\n owl:onProperty :fn ],\n :VCard .\n\n:Type a owl:Class ;\n rdfs:label \"Type\"@en ;\n rdfs:comment \"Used for type codes. The URI of the type code must be used as the value for Type.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:TelephoneType a owl:Class ;\n rdfs:label \"Phone\"@en ;\n rdfs:comment \"Used for telephone type codes. The URI of the telephone type code must be used as the value for the Telephone Type.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n:RelatedType a owl:Class ;\n rdfs:label \"Relation Type\"@en ;\n rdfs:comment \"Used for relation type codes. The URI of the relation type code must be used as the value for the Relation Type.\"@en ;\n rdfs:isDefinedBy <http://www.w3.org/2006/vcard/ns> .\n\n<http://www.w3.org/2006/vcard/ns> a owl:Ontology ;\n rdfs:label \"Ontology for vCard\"@en ;\n rdfs:comment \"Ontology for vCard based on RFC6350\"@en ;\n owl:versionInfo \"Final\"@en .\n\n\n";
5160
5571
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/individual.css
5161
- var individual = __nested_webpack_require_102275__(479);
5572
+ var individual = __nested_webpack_require_128094__(479);
5162
5573
  ;// ./src/styles/individual.css
5163
5574
 
5164
5575
 
@@ -5186,9 +5597,9 @@ var individual_update = injectStylesIntoStyleTag_default()(individual/* default
5186
5597
 
5187
5598
  /* harmony default export */ const styles_individual = (individual/* default */.A && individual/* default */.A.locals ? individual/* default */.A.locals : undefined);
5188
5599
 
5189
- // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/rdfFormsEnforced.css
5190
- var rdfFormsEnforced = __nested_webpack_require_102275__(434);
5191
- ;// ./src/styles/rdfFormsEnforced.css
5600
+ // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/contactsRDFFormsEnforced.css
5601
+ var contactsRDFFormsEnforced = __nested_webpack_require_128094__(686);
5602
+ ;// ./src/styles/contactsRDFFormsEnforced.css
5192
5603
 
5193
5604
 
5194
5605
 
@@ -5200,20 +5611,20 @@ var rdfFormsEnforced = __nested_webpack_require_102275__(434);
5200
5611
 
5201
5612
 
5202
5613
 
5203
- var rdfFormsEnforced_options = {};
5614
+ var contactsRDFFormsEnforced_options = {};
5204
5615
 
5205
- rdfFormsEnforced_options.styleTagTransform = (styleTagTransform_default());
5206
- rdfFormsEnforced_options.setAttributes = (setAttributesWithoutAttributes_default());
5207
- rdfFormsEnforced_options.insert = insertBySelector_default().bind(null, "head");
5208
- rdfFormsEnforced_options.domAPI = (styleDomAPI_default());
5209
- rdfFormsEnforced_options.insertStyleElement = (insertStyleElement_default());
5616
+ contactsRDFFormsEnforced_options.styleTagTransform = (styleTagTransform_default());
5617
+ contactsRDFFormsEnforced_options.setAttributes = (setAttributesWithoutAttributes_default());
5618
+ contactsRDFFormsEnforced_options.insert = insertBySelector_default().bind(null, "head");
5619
+ contactsRDFFormsEnforced_options.domAPI = (styleDomAPI_default());
5620
+ contactsRDFFormsEnforced_options.insertStyleElement = (insertStyleElement_default());
5210
5621
 
5211
- var rdfFormsEnforced_update = injectStylesIntoStyleTag_default()(rdfFormsEnforced/* default */.A, rdfFormsEnforced_options);
5622
+ var contactsRDFFormsEnforced_update = injectStylesIntoStyleTag_default()(contactsRDFFormsEnforced/* default */.A, contactsRDFFormsEnforced_options);
5212
5623
 
5213
5624
 
5214
5625
 
5215
5626
 
5216
- /* harmony default export */ const styles_rdfFormsEnforced = (rdfFormsEnforced/* default */.A && rdfFormsEnforced/* default */.A.locals ? rdfFormsEnforced/* default */.A.locals : undefined);
5627
+ /* harmony default export */ const styles_contactsRDFFormsEnforced = (contactsRDFFormsEnforced/* default */.A && contactsRDFFormsEnforced/* default */.A.locals ? contactsRDFFormsEnforced/* default */.A.locals : undefined);
5217
5628
 
5218
5629
  ;// ./src/rdfFormsHelper.js
5219
5630
 
@@ -5280,6 +5691,7 @@ function loadDocument (
5280
5691
 
5281
5692
 
5282
5693
 
5694
+
5283
5695
  const individual_ns = external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_.ns
5284
5696
  const individual_kb = external_commonjs_solid_logic_commonjs2_solid_logic_amd_solid_logic_root_SolidLogic_.store
5285
5697
 
@@ -5314,38 +5726,44 @@ async function renderIndividual (dom, div, subject, dataBrowserContext) {
5314
5726
  const whichForm = isOrganization ? 'organizationForm' : 'individualForm'
5315
5727
 
5316
5728
  renderForm(div, subject, individualAndOrganizationForm_namespaceObject, formsName, external_commonjs_solid_logic_commonjs2_solid_logic_amd_solid_logic_root_SolidLogic_.store, dom, subject.doc(), whichForm)
5729
+ // Improve keyboard navigation: prevent tabbing into label links created by rdflib/solid-ui forms
5730
+ skipLabelsFromTabbing(div)
5317
5731
 
5318
5732
  // forward list element from context if available; some callers (such as
5319
5733
  // the contacts pane) attach `ulPeople` so that group membership control can
5320
5734
  // refresh the master list when a membership is removed.
5321
- div.appendChild(await renderGroupMemberships(
5322
- subject,
5323
- dataBrowserContext,
5324
- dataBrowserContext.ulPeople
5325
- ))
5735
+ if (!isAWebID(subject)) {
5736
+ div.appendChild(await renderGroupMemberships(
5737
+ subject,
5738
+ dataBrowserContext,
5739
+ dataBrowserContext.ulPeople
5740
+ ))
5741
+ }
5326
5742
 
5327
5743
  if (external_commonjs_solid_logic_commonjs2_solid_logic_amd_solid_logic_root_SolidLogic_.authn.currentUser()) {
5328
5744
  // Allow to attach documents etc to the profile card
5745
+ // creates a
5329
5746
  const h3 = div.appendChild(dom.createElement('h3'))
5330
- h3.textContent = 'Attach a document'
5331
- h3.classList.add('webidHeading')
5747
+ h3.textContent = 'Attach a link to any file'
5748
+ h3.classList.add('contactPanedHeading')
5332
5749
 
5333
5750
  external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_.widgets.attachmentList(dom, subject, div, {
5334
5751
  modify: editable
5335
5752
  // promptIcon: UI.icons.iconBase + 'noun_681601.svg',
5336
- // predicate: UI.ns.vcard('url') // @@@@@@@@@ ,--- no, the vcard ontology structure uses a bnode.
5753
+ // predicate: default <http://www.w3.org/2005/01/wf/flow#attachment>
5337
5754
  })
5338
5755
  }
5339
5756
 
5340
5757
  if (isOrganization) {
5341
5758
  div.appendChild(await renderPublicIdControl(subject, dataBrowserContext))
5342
- } else {
5759
+ } else if (!isAWebID(subject)) {
5760
+ // Only render WebID control for a contact and not. WebID.
5343
5761
  div.appendChild(await renderWebIdControl(subject, dataBrowserContext))
5344
5762
  }
5345
5763
  } // renderIndividual
5346
5764
 
5347
5765
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/toolsPane.css
5348
- var toolsPane = __nested_webpack_require_102275__(295);
5766
+ var toolsPane = __nested_webpack_require_128094__(295);
5349
5767
  ;// ./src/styles/toolsPane.css
5350
5768
 
5351
5769
 
@@ -6189,8 +6607,37 @@ async function fixToOldDataModel (book) {
6189
6607
  }
6190
6608
  */
6191
6609
 
6610
+ // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/utilities.css
6611
+ var utilities = __nested_webpack_require_128094__(92);
6612
+ ;// ./src/styles/utilities.css
6613
+
6614
+
6615
+
6616
+
6617
+
6618
+
6619
+
6620
+
6621
+
6622
+
6623
+
6624
+ var utilities_options = {};
6625
+
6626
+ utilities_options.styleTagTransform = (styleTagTransform_default());
6627
+ utilities_options.setAttributes = (setAttributesWithoutAttributes_default());
6628
+ utilities_options.insert = insertBySelector_default().bind(null, "head");
6629
+ utilities_options.domAPI = (styleDomAPI_default());
6630
+ utilities_options.insertStyleElement = (insertStyleElement_default());
6631
+
6632
+ var utilities_update = injectStylesIntoStyleTag_default()(utilities/* default */.A, utilities_options);
6633
+
6634
+
6635
+
6636
+
6637
+ /* harmony default export */ const styles_utilities = (utilities/* default */.A && utilities/* default */.A.locals ? utilities/* default */.A.locals : undefined);
6638
+
6192
6639
  // EXTERNAL MODULE: ./node_modules/css-loader/dist/cjs.js!./src/styles/contactsPane.css
6193
- var contactsPane = __nested_webpack_require_102275__(903);
6640
+ var contactsPane = __nested_webpack_require_128094__(903);
6194
6641
  ;// ./src/styles/contactsPane.css
6195
6642
 
6196
6643
 
@@ -6243,6 +6690,7 @@ to change its state according to an ontology, comment on it, etc.
6243
6690
 
6244
6691
 
6245
6692
 
6693
+
6246
6694
  const contactsPane_ns = external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_.ns
6247
6695
  const contactsPane_utils = external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_.utils
6248
6696
 
@@ -6292,11 +6740,16 @@ const contactsPane_utils = external_commonjs_solid_ui_commonjs2_solid_ui_amd_sol
6292
6740
  external_commonjs_solid_ui_commonjs2_solid_ui_amd_solid_ui_root_UI_.aclControl.preventBrowserDropEvents(dom) // protect drag and drop
6293
6741
 
6294
6742
  div.setAttribute('class', 'contactPane')
6743
+ // Make the pane stack vertically (sidebar -> details) when narrow
6744
+ // Set breakpoint to 1000 so it triggers at 980 width too.
6745
+ setupResponsiveStacking(div, 1000)
6295
6746
 
6296
6747
  asyncRender().then(
6297
6748
  () => log('Contacts pane rendered for ' + subject),
6298
6749
  err => complain(div, dom, err.message || '' + err)
6299
- )
6750
+ ).catch(err => {
6751
+ complain(div, dom, err.message || '' + err)
6752
+ })
6300
6753
  return div
6301
6754
 
6302
6755
  // Async part of render. Maybe API will later allow render to be async
@@ -6313,11 +6766,12 @@ const contactsPane_utils = external_commonjs_solid_ui_commonjs2_solid_ui_amd_sol
6313
6766
  t[contactsPane_ns.vcard('Organization').uri] ||
6314
6767
  t[contactsPane_ns.schema('Organization').uri]
6315
6768
  ) {
6316
- renderIndividual(dom, div, subject, dataBrowserContext)
6317
- .then(() => log('(individual rendered)'))
6318
- .catch(() => {
6319
- throw new Error('Failed to render contact.')
6320
- })
6769
+ try {
6770
+ await renderIndividual(dom, div, subject, dataBrowserContext)
6771
+ } catch (err) {
6772
+ error('Error rendering contact. Stack: ' + err)
6773
+ throw new Error('Failed to render contact: ' + (err.message || err))
6774
+ }
6321
6775
  /*
6322
6776
  // Render a Group instance
6323
6777
  }
@@ -7310,6 +7764,12 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileCard.css */
7310
7764
  min-width: 0;
7311
7765
  }
7312
7766
 
7767
+ /* Ensure prompt inputs stretch to fit their container */
7768
+ .add-friend-button-container input[type="text"] {
7769
+ width: 100%;
7770
+ box-sizing: border-box;
7771
+ }
7772
+
7313
7773
  .qrCodeSection {
7314
7774
  color: var(--color-text-secondary);
7315
7775
  font-size: 1em;
@@ -7331,7 +7791,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileCard.css */
7331
7791
  padding: 16px;
7332
7792
  background: white;
7333
7793
  }
7334
- `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/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":""}]);
7794
+ `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/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":""}]);
7335
7795
  // Exports
7336
7796
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
7337
7797
 
@@ -7361,10 +7821,12 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileView.css */
7361
7821
  .profile-grid .profileSection {
7362
7822
  width: 100%;
7363
7823
  max-width: 100%;
7824
+ min-width: 0;
7364
7825
  box-sizing: border-box;
7365
7826
  margin-bottom: var(--spacing-md);
7366
7827
  box-sizing: border-box;
7367
7828
  margin-bottom: var(--spacing-md);
7829
+ overflow-wrap: anywhere;
7368
7830
  }
7369
7831
 
7370
7832
  @media (min-width: 900px) {
@@ -7372,7 +7834,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* ProfileView.css */
7372
7834
  margin-bottom: 0;
7373
7835
  }
7374
7836
  }
7375
- `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/styles/ProfileView.css"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,8CAA8C;;AAE9C,gCAAgC;AAChC;EACE,WAAW;EACX,eAAe;EACf,sBAAsB;EACtB,gCAAgC;EAChC,sBAAsB;EACtB,gCAAgC;AAClC;;AAEA;EACE;IACE,gBAAgB;EAClB;AACF","sourcesContent":["/* ProfileView.css */\n/* Uses utilities: .section-bg, .text-center */\n\n/* Horizontal layout for cards */\n.profile-grid .profileSection {\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin-bottom: var(--spacing-md);\n box-sizing: border-box;\n margin-bottom: var(--spacing-md);\n}\n\n@media (min-width: 900px) {\n .profile-grid .profileSection {\n margin-bottom: 0;\n }\n}\n"],"sourceRoot":""}]);
7837
+ `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/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":""}]);
7376
7838
  // Exports
7377
7839
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
7378
7840
 
@@ -7555,7 +8017,83 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* StuffCard.css */
7555
8017
 
7556
8018
  /***/ },
7557
8019
 
7558
- /***/ 2024
8020
+ /***/ 9340
8021
+ (module, __webpack_exports__, __webpack_require__) {
8022
+
8023
+ "use strict";
8024
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8025
+ /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
8026
+ /* harmony export */ });
8027
+ /* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1354);
8028
+ /* harmony import */ var _css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
8029
+ /* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6314);
8030
+ /* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
8031
+ // Imports
8032
+
8033
+
8034
+ var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
8035
+ // Module
8036
+ ___CSS_LOADER_EXPORT___.push([module.id, `.profile-grid .add-friend-button-container,
8037
+ .profile-grid .add-community-button-container {
8038
+ display: inline-flex;
8039
+ align-items: center;
8040
+ gap: var(--spacing-xxs);
8041
+ flex-wrap: wrap;
8042
+ justify-content: flex-start;
8043
+ }
8044
+
8045
+ /* Ensure the button container can shrink properly in narrow layouts */
8046
+ .profile-grid .add-community-button-container {
8047
+ min-width: 0;
8048
+ max-width: 100%;
8049
+ }
8050
+
8051
+ /* Allow any direct children to shrink so no element forces overflow */
8052
+ .profile-grid .add-community-button-container > * {
8053
+ min-width: 0;
8054
+ max-width: 100%;
8055
+ }
8056
+
8057
+ .profile-grid table {
8058
+ margin: 0 !important;
8059
+ }
8060
+
8061
+ .profile-grid td {
8062
+ padding: 0;
8063
+ }
8064
+
8065
+ .profile-grid .add-friend-button-container .span,
8066
+ .profile-grid .add-community-button-container .span {
8067
+ display: inline-flex;
8068
+ align-items: center;
8069
+ }
8070
+
8071
+ .profile-grid .add-friend-button-container > div,
8072
+ .profile-grid .add-community-button-container > div {
8073
+ flex-basis: 100%;
8074
+ }
8075
+
8076
+ /* Prevent the add-community input from overflowing its flex container */
8077
+ .profile-grid .add-community-button-container input {
8078
+ min-width: 0;
8079
+ max-width: 96%;
8080
+ flex: 1 1 0;
8081
+ word-break: break-word;
8082
+ }
8083
+
8084
+ .profile-grid .profile-image {
8085
+ width: var( --profile-image-size);
8086
+ height: var( --profile-image-size);
8087
+ margin: var(--spacing-xxxs);
8088
+ border-radius: var(--spacing-lg);
8089
+ }`, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/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","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}"],"sourceRoot":""}]);
8090
+ // Exports
8091
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
8092
+
8093
+
8094
+ /***/ },
8095
+
8096
+ /***/ 7347
7559
8097
  (module, __webpack_exports__, __webpack_require__) {
7560
8098
 
7561
8099
  "use strict";
@@ -7571,23 +8109,66 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* StuffCard.css */
7571
8109
 
7572
8110
  var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
7573
8111
  // Module
7574
- ___CSS_LOADER_EXPORT___.push([module.id, `/* this overrides a style coming from contacts-pane*/
8112
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* Delete pop up*/
8113
+ /* Make the Solid-UI delete confirmation popup appear near the last click position.
8114
+ Keep the built-in Solid-UI styling (orange border, white background) so it looks like the original.
8115
+ */
8116
+ .profile-grid div[style*="position: relative"] > div[style*="display: grid"] {
8117
+ /* only override positioning; keep styling (border/background/etc) from solid-ui */
8118
+ position: absolute !important;
8119
+ z-index: 9999 !important;
8120
+ top: 0 !important;
8121
+ right: 0 !important;
8122
+ left: auto !important;
8123
+ display: grid !important;
8124
+ pointer-events: auto !important;
8125
+ opacity: 1 !important;
8126
+ visibility: visible !important;
8127
+ padding: 0.7em !important;
8128
+ min-width: 280px !important;
8129
+ max-width: 90vw !important;
8130
+ background: var(--color-background) !important;
8131
+ border: 0.1em solid var(--color-primary) !important;
8132
+ border-radius: var(--border-radius-base) !important;
8133
+ box-shadow: 0 0.5em 0.9em rgba(0, 0, 0, 0.2) !important;
8134
+ grid-template-columns: auto auto !important;
8135
+ gap: 0.3em !important;
8136
+ }
8137
+
8138
+ /* Ensure SVG icons and their buttons inside the Solid-UI delete popup have transparent backgrounds */
8139
+ .profile-grid div[style*="position: relative"] > div[style*="display: grid"] img[src\$=".svg"],
8140
+ .profile-grid div[style*="position: relative"] > div[style*="display: grid"] button {
8141
+ background: transparent !important;
8142
+ }
8143
+
7575
8144
  .profile-form .individualPane {
7576
8145
  box-shadow: none !important;
7577
8146
  }
7578
8147
 
7579
- /* Vertically center autocomplete input in .formFieldValue */
7580
- .profile-form .formFieldValue > div[style*="flex-direction: row"] {
7581
- align-items: center;
7582
- display: flex;
8148
+ .profile-form p {
8149
+ padding: 0 !important;
7583
8150
  }
7584
8151
 
7585
- .profile-form .formFieldValue input[data-testid="autocomplete-input"] {
7586
- vertical-align: middle;
8152
+ .profile-form .mb-md {
8153
+ margin-bottom: 0 !important;
8154
+ }
8155
+
8156
+ .profile-form h2 {
8157
+ margin-bottom: 1em !important;
7587
8158
  }
8159
+
8160
+ .profile-form h3 {
8161
+ color: var(--color-primary) !important;
8162
+ padding: 0 !important;
8163
+ font-size: 1em !important;
8164
+ font-weight: 600 !important;
8165
+ }
8166
+
8167
+ /* Shared form layout rules are imported from rdfFormsCommon.css */
7588
8168
  /* Solid-UI form sizing fixes scoped to Edit CV section */
7589
8169
  .profile-form .hoverControl:not(:has(> img:first-child)) {
7590
8170
  border: 0.1em solid rgb(136, 136, 136) !important;
8171
+ flex-direction: column !important;
7591
8172
  }
7592
8173
 
7593
8174
  .profile-form .hoverControl:has(> img:first-child) {
@@ -7604,40 +8185,107 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* this overrides a style coming from
7604
8185
  justify-content: center;
7605
8186
  }
7606
8187
 
7607
- .profile-form .hoverControlHide {
8188
+ /* Make sure the delete icon floats in the top-right corner of the full hoverControl wrapper */
8189
+ .profile-form .hoverControl,
8190
+ .profile-grid .hoverControl {
8191
+ position: relative !important;
8192
+ }
8193
+
8194
+ .hoverControl > img.hoverControlHide,
8195
+ .hoverControl > [data-testid="deleteButtonWithCheck"] {
8196
+ position: absolute !important;
8197
+ top: 0.2em !important;
8198
+ right: 0.2em !important;
7608
8199
  width: 1.5em !important;
7609
8200
  height: 1.5em !important;
7610
- display: block;
7611
- margin-top: 0 !important;
7612
- margin-left: 0 !important;
7613
- margin-right: 0 !important;
7614
- margin-bottom: 0.3em !important;
8201
+ display: none !important;
8202
+ align-items: center;
8203
+ justify-content: center;
8204
+ margin: 0 !important;
8205
+ float: none !important;
8206
+ transform: none !important;
7615
8207
  }
7616
8208
 
7617
- .profile-form .hoverControl:has(> img:first-child) > span {
7618
- display: inline-flex;
7619
- align-items: center;
7620
- margin-left: 0.3em;
8209
+ /* When icon is 2nd or 3rd child (i.e. sibling elements exist), align it vertically to the previous item */
8210
+ .hoverControl > img.hoverControlHide:nth-child(1),
8211
+ .hoverControl > img.hoverControlHide:nth-child(2),
8212
+ .hoverControl > [data-testid="deleteButtonWithCheck"]:nth-child(1),
8213
+ .hoverControl > [data-testid="deleteButtonWithCheck"]:nth-child(2) {
8214
+ top: 50% !important;
8215
+ transform: translateY(-50%) !important;
8216
+ }
8217
+
8218
+ /* Show the delete icon only when the container is hovered */
8219
+ .profile-grid .hoverControl:hover > img.hoverControlHide,
8220
+ .profile-grid .hoverControl:hover > [data-testid="deleteButtonWithCheck"] {
8221
+ display: inline-flex !important;
8222
+ }
8223
+
8224
+ /* Also show the delete icon when the entire row is hovered */
8225
+ .profile-grid .attachmentTable tr:hover .hoverControl > img.hoverControlHide,
8226
+ .profile-grid .attachmentTable tr:hover .hoverControl > [data-testid="deleteButtonWithCheck"] {
8227
+ display: inline-flex !important;
8228
+ }
8229
+
8230
+ /* Make the hover-control cell easier to hit */
8231
+ .profile-grid .hoverControl {
8232
+ padding: 0.75em !important;
8233
+ min-width: 2.5em !important;
8234
+ min-height: 2.5em !important;
7621
8235
  }
7622
8236
 
7623
- .profile-form div[style*="padding: 0.5em"]:has(> img) {
8237
+ /* When the hoverControl only contains the hidden delete icon, keep it out of layout so it doesn't create empty space */
8238
+ .profile-form .formFieldValue .hoverControl:has(> img.hoverControlHide) {
8239
+ min-width: 0 !important;
8240
+ min-height: 0 !important;
8241
+ width: 0 !important;
8242
+ height: 0 !important;
8243
+ padding: 0 !important;
8244
+ margin: 0 !important;
8245
+ overflow: visible !important;
8246
+ }
8247
+
8248
+ /* Hide delete icon only in autocomplete fields */
8249
+ .profile-grid .formFieldValue:has(input[data-testid="autocomplete-input"]) [data-testid="delete-button"] {
8250
+ display: none !important;
8251
+ }
8252
+
8253
+ /* Keep autocomplete cancel button hidden when the user is not interacting.
8254
+ This avoids the cancel button remaining visible when focus moves away. */
8255
+ .profile-grid .formFieldValue:not(:focus-within) [data-testid="cancel-button"] {
8256
+ display: none !important;
8257
+ }
8258
+
8259
+ .profile-grid .hoverControl:has(> img:first-child) > span {
7624
8260
  display: inline-flex;
7625
8261
  align-items: center;
8262
+ margin-left: 0.3em;
7626
8263
  }
7627
8264
 
7628
- .profile-form div[style*="padding: 0.5em"]:has(> img) > span {
8265
+ .profile-grid div[style*="padding: 0.5em"]:has(> img) > span {
7629
8266
  margin-left: 0.3em;
8267
+ vertical-align: super !important;
7630
8268
  }
7631
8269
 
7632
- .profile-form .hoverControl:has(> img:first-child):hover {
8270
+ .profile-grid .hoverControl:has(> img:first-child):hover {
7633
8271
  background-color: transparent !important;
7634
8272
  }
7635
8273
 
7636
- .profile-form button:has(> img[src\$=".svg"]) {
7637
- background-color: transparent !important;
8274
+ .profile-grid button:has(> img[src\$=".svg"]),
8275
+ .profile-grid .formFieldValue input[type ="color"] {
8276
+ background-color: var(--color-section-bg) !important;
7638
8277
  border: none !important;
7639
8278
  margin: 0 !important;
7640
8279
  border-radius: 0 !important;
8280
+ box-shadow: none !important;
8281
+ padding: 0.5em !important;
8282
+ transition: background-color 0.2s ease, box-shadow 0.2s ease;
8283
+ padding: 0 !important;
8284
+ }
8285
+
8286
+ /* Specific icon button should have no extra padding */
8287
+ .profile-grid button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_1369241.svg"]) {
8288
+ padding: 0 !important;
7641
8289
  }
7642
8290
 
7643
8291
  .profile-form button {
@@ -7645,10 +8293,16 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* this overrides a style coming from
7645
8293
  min-width: var(--min-touch-target);
7646
8294
  }
7647
8295
 
8296
+ .profile-form input:not([type="color"]) {
8297
+ width: 99%;
8298
+ margin-left: 0 !important;
8299
+ margin-right: 0 !important;
8300
+ }
8301
+
7648
8302
  .profile-form input:not([type="color"]),
7649
8303
  .profile-form textarea,
7650
8304
  .profile-form select {
7651
- max-width: 100%;
8305
+ max-width: 96%;
7652
8306
  min-width: 0;
7653
8307
  box-sizing: border-box ;
7654
8308
  font: inherit;
@@ -7683,32 +8337,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* this overrides a style coming from
7683
8337
  width: 100%;
7684
8338
  }
7685
8339
 
7686
- .profile-form .formFieldValue {
7687
- min-width: 0;
7688
- margin-bottom: var(--spacing-sm);
7689
- }
7690
-
7691
- .profile-form .formFieldValue table {
7692
- margin: 0 !important;
7693
- padding: 0 !important;
7694
- }
7695
-
7696
- .profile-form .formFieldValue td {
7697
- padding: 0 !important;
7698
- vertical-align: middle;
7699
- }
7700
-
7701
- .profile-form .formFieldValue table[data-testid="autocomplete-table"] {
7702
- height: 100%;
7703
- }
7704
-
7705
- .profile-form .formFieldValue input:not([type="color"]),
7706
- .profile-form .formFieldValue textarea,
7707
- .profile-form .formFieldValue select {
7708
- width: 100%;
7709
- max-width: 100%;
7710
- }
7711
-
7712
8340
  .profile-form select#formSelect {
7713
8341
  width: 100%;
7714
8342
  max-width: 97%;
@@ -7717,11 +8345,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* this overrides a style coming from
7717
8345
  margin-right: 0 !important;
7718
8346
  }
7719
8347
 
7720
- .profile-form .formFieldValue span select {
7721
- margin-left: 0 !important;
7722
- margin-right: 0 !important;
7723
- }
7724
-
7725
8348
  /* Remove border/padding from the first wrapper div (and its first child wrapper). */
7726
8349
  .profile-form > div:first-of-type,
7727
8350
  .profile-form > div:first-of-type > div:first-of-type {
@@ -7744,7 +8367,6 @@ section[aria-labelledby="edit-profile-contact-heading"] .profile-form > div:firs
7744
8367
  /* Align schema.org, solid terms, FOAF, vCard, and org field labels with their input values. */
7745
8368
  .profile-form :not(.choiceBox):has(> .formFieldName):has(> .formFieldValue) {
7746
8369
  display: flex;
7747
- margin-bottom: var(--spacing-sm);
7748
8370
  }
7749
8371
 
7750
8372
  /* for the Resume inside corporation choice */
@@ -7776,10 +8398,6 @@ section[aria-labelledby="edit-profile-contact-heading"] .profile-form > div:firs
7776
8398
  margin-left: 0 !important;
7777
8399
  }
7778
8400
 
7779
- .profile-form .formFieldValue > span > select {
7780
- margin-left: 0 !important;
7781
- }
7782
-
7783
8401
  /* for the social media */
7784
8402
  /* Add space between classifierBox label and select box */
7785
8403
  section[data-testid="edit-social-section"] .classifierBox-label {
@@ -7826,7 +8444,7 @@ section[data-testid="edit-social-section"] .classifierBox-selectBox select {
7826
8444
  border-width: .05em !important;
7827
8445
  border-color: #88c !important;
7828
8446
  border-radius: 0.2em !important;
7829
- width: 100%;
8447
+ width: 99%;
7830
8448
  box-sizing: border-box;
7831
8449
  margin-top: var(--spacing-xs);
7832
8450
  margin-left: 0 !important;
@@ -7848,33 +8466,11 @@ section[data-testid="edit-social-section"] .classifierBox-selectBox select {
7848
8466
  padding-top: var(--spacing-sm);
7849
8467
  }
7850
8468
 
7851
- /* Keep autocomplete/table-based fields (e.g. Occupation) aligned to label text baseline. */
7852
- .profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid="autocomplete-input"]) {
7853
- align-items: flex-start;
7854
- }
7855
8469
 
7856
8470
  .profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid="autocomplete-input"]) > .formFieldName {
7857
8471
  padding-top: 0.55em !important;
7858
8472
  }
7859
8473
 
7860
- .profile-form .formFieldValue:has(input[data-testid="autocomplete-input"]) {
7861
- align-self: flex-start;
7862
- }
7863
-
7864
- .profile-form .formFieldValue table[data-testid="autocomplete-table"],
7865
- .profile-form .formFieldValue input[data-testid="autocomplete-input"] {
7866
- margin: 0 !important;
7867
- }
7868
-
7869
- .profile-form .formFieldValue table[data-testid="autocomplete-table"] {
7870
- vertical-align: baseline;
7871
- }
7872
-
7873
- .profile-form input:not([type="color"]) {
7874
- width: 100%;
7875
- margin-left: 0 !important;
7876
- margin-right: 0 !important;
7877
- }
7878
8474
 
7879
8475
  .profile-form input:disabled,
7880
8476
  .profile-form textarea:disabled,
@@ -7892,7 +8488,55 @@ section[data-testid="edit-social-section"] .classifierBox-selectBox select {
7892
8488
  .webidControl table td div.contactPane.namedPane {
7893
8489
  border: none !important;
7894
8490
  }
7895
- `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/styles/rdfFormsEnforced.css"],"names":[],"mappings":"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","sourcesContent":["/* this overrides a style coming from contacts-pane*/\n.profile-form .individualPane {\n box-shadow: none !important;\n}\n\n/* Vertically center autocomplete input in .formFieldValue */\n.profile-form .formFieldValue > div[style*=\"flex-direction: row\"] {\n align-items: center;\n display: flex;\n}\n\n.profile-form .formFieldValue input[data-testid=\"autocomplete-input\"] {\n vertical-align: middle;\n}\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}\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.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 min-height: var(--min-touch-target);\n min-width: var(--min-touch-target);\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 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 .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 vertical-align: middle;\n}\n\n.profile-form .formFieldValue table[data-testid=\"autocomplete-table\"] {\n height: 100%;\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 .formFieldValue span select {\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 margin-bottom: var(--spacing-sm);\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.profile-form .formFieldValue > span > 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: 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-left: var(--spacing-xs);\n padding-top: var(--spacing-sm);\n}\n\n/* Keep autocomplete/table-based fields (e.g. Occupation) aligned to label text baseline. */\n.profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) {\n align-items: flex-start;\n}\n\n.profile-form :not(.choiceBox):has(> .formFieldValue input[data-testid=\"autocomplete-input\"]) > .formFieldName {\n padding-top: 0.55em !important;\n}\n\n.profile-form .formFieldValue:has(input[data-testid=\"autocomplete-input\"]) {\n align-self: flex-start;\n}\n\n.profile-form .formFieldValue table[data-testid=\"autocomplete-table\"],\n.profile-form .formFieldValue input[data-testid=\"autocomplete-input\"] {\n margin: 0 !important;\n}\n\n.profile-form .formFieldValue table[data-testid=\"autocomplete-table\"] {\n vertical-align: baseline;\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.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"],"sourceRoot":""}]);
8491
+
8492
+ /* Hide the edit icon used by solid-ui (noun_253504.svg and noun_1180158.svg) when it appears as an <img> */
8493
+ img[src*="noun_253504.svg"],
8494
+ img[src*="noun_1180158.svg"] {
8495
+ display: none !important;
8496
+ width: 0 !important;
8497
+ height: 0 !important;
8498
+ margin: 0 !important;
8499
+ padding: 0 !important;
8500
+ }
8501
+
8502
+ /* Ensure the parent button for that icon doesn't add padding/margin or affect layout */
8503
+ button:has(> img[src*="noun_253504.svg"]),
8504
+ button:has(> img[src*="noun_1180158.svg"]) {
8505
+ display: none !important;
8506
+ padding: 0 !important;
8507
+ margin: 0 !important;
8508
+ border: none !important;
8509
+ background: none !important;
8510
+ width: 0 !important;
8511
+ height: 0 !important;
8512
+ overflow: hidden !important;
8513
+ }
8514
+
8515
+ /* Exceptions: allow these icons (and their buttons) when they're part of the add-friend or add-community flows. */
8516
+ .profile-grid .profileSection .add-friend-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"],
8517
+ .profile-grid .profileSection .add-community-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"],
8518
+ .profile-grid .profileSection .add-friend-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"]),
8519
+ .profile-grid .profileSection .add-community-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_253504.svg"]) {
8520
+ display: inline-flex !important;
8521
+ width: auto !important;
8522
+ height: auto !important;
8523
+ overflow: visible !important;
8524
+ }
8525
+
8526
+
8527
+ /* Exception: allow “Continue” buttons inside add-friend and add-community button containers. */
8528
+ .profile-grid .profileSection .add-friend-button-container button:has(> img[title="Continue"]),
8529
+ .profile-grid .profileSection .add-community-button-container button:has(> img[title="Continue"]),
8530
+ .profile-grid .profileSection .add-friend-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"]),
8531
+ .profile-grid .profileSection .add-community-button-container button:has(> img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"]),
8532
+ .profile-grid .profileSection .add-friend-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"],
8533
+ .profile-grid .profileSection .add-community-button-container img[src="https://solidos.github.io/solid-ui/src/icons/noun_1180158.svg"] {
8534
+ display: inline-flex !important;
8535
+ width: 2em !important;
8536
+ height: 2em !important;
8537
+ overflow: visible !important;
8538
+ }
8539
+ `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/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 display: none !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}\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":""}]);
7896
8540
  // Exports
7897
8541
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
7898
8542
 
@@ -7917,6 +8561,30 @@ var ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_
7917
8561
  // Module
7918
8562
  ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layout, spacing, and responsiveness */
7919
8563
 
8564
+ :root {
8565
+ /* Added for profile-pane (editProfile) layout sizing */
8566
+ --spacing-xxs: 0.4em;
8567
+ --spacing-xxxs: 0.1em;
8568
+ --profile-image-size: 3em;
8569
+ }
8570
+
8571
+ @media (max-width: 1000px) {
8572
+ .profile-grid,
8573
+ .profile-grid * {
8574
+ font-size: 2rem !important;
8575
+ }
8576
+
8577
+ .profile-grid .actionButton,
8578
+ .profile-grid .searchInput,
8579
+ .profile-grid .flatButton,
8580
+ .profile-grid .buttonSection button,
8581
+ .profile-grid .groupButtonsList button {
8582
+ min-height: calc(var(--min-touch-target) + 0.5em) !important;
8583
+ font-size: 2rem !important;
8584
+ padding: 1em 1em !important;
8585
+ }
8586
+ }
8587
+
7920
8588
  .actionButton {
7921
8589
  width: 100%;
7922
8590
  min-width: 180px;
@@ -7931,7 +8599,8 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layou
7931
8599
 
7932
8600
  .profile-grid {
7933
8601
  display: grid;
7934
- grid-template-columns: repeat(auto-fit, minmax(30em, 1fr));
8602
+ /* Allow the grid to shrink below 30em on small viewports to avoid overflow */
8603
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 30em), 1fr));
7935
8604
  gap: var(--spacing-lg);
7936
8605
  background: var(--color-background);
7937
8606
  }
@@ -8124,6 +8793,13 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layou
8124
8793
  box-shadow: none;
8125
8794
  }
8126
8795
 
8796
+ /* Prevent labels from appearing focusable to keyboard users. */
8797
+ label:focus,
8798
+ label:focus-visible {
8799
+ outline: none !important;
8800
+ box-shadow: none !important;
8801
+ }
8802
+
8127
8803
  /* Better focus for text elements */
8128
8804
  .focusable-text:focus {
8129
8805
  background-color: rgba(124, 77, 255, 0.1);
@@ -8244,7 +8920,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, `/* Utility-first CSS classes for layou
8244
8920
  .btn-transparent:hover {
8245
8921
  background-color: transparent;
8246
8922
  }
8247
- `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/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":""}]);
8923
+ `, "",{"version":3,"sources":["webpack://./node_modules/profile-pane/lib/styles/utilities.css"],"names":[],"mappings":"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","sourcesContent":["/* Utility-first CSS classes for layout, spacing, and responsiveness */\n\n:root {\n /* Added for profile-pane (editProfile) layout sizing */\n --spacing-xxs: 0.4em;\n --spacing-xxxs: 0.1em;\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":""}]);
8248
8924
  // Exports
8249
8925
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
8250
8926
 
@@ -9522,20 +10198,19 @@ exports.ChatWithMe = ChatWithMe;
9522
10198
  Object.defineProperty(exports, "__esModule", ({
9523
10199
  value: true
9524
10200
  }));
9525
- exports.extractFriends = exports.FriendList = void 0;
9526
- var _solidUi = __webpack_require__(9426);
10201
+ exports.FriendList = void 0;
9527
10202
  var _litHtml = __webpack_require__(6752);
9528
10203
  __webpack_require__(9480);
10204
+ var _addMeToYourFriends = __webpack_require__(4695);
9529
10205
  const FriendList = (subject, context) => {
9530
- const friends = extractFriends(subject, context);
10206
+ const friends = (0, _addMeToYourFriends.extractFriends)(false, subject, context);
9531
10207
  if (!friends || !friends.textContent?.trim()) return null;
9532
10208
  return (0, _litHtml.html)`
9533
10209
  <section
9534
10210
  class="friendListSection"
9535
- role="region"
9536
- aria-labelledby="friends-section-title"
9537
10211
  data-testid="friend-list"
9538
10212
  >
10213
+ <h2 id="friends-section-title" class="sr-only">Friends</h2>
9539
10214
  <nav aria-label="Friend profiles">
9540
10215
  <ul class="list-reset zebra-stripe" role="list">
9541
10216
  ${friends}
@@ -9545,33 +10220,6 @@ const FriendList = (subject, context) => {
9545
10220
  `;
9546
10221
  };
9547
10222
  exports.FriendList = FriendList;
9548
- const extractFriends = (subject, {
9549
- dom
9550
- }) => {
9551
- const target = dom.createElement('div');
9552
- _solidUi.widgets.attachmentList(dom, subject, target, {
9553
- doc: subject.doc(),
9554
- modify: false,
9555
- predicate: _solidUi.ns.foaf('knows'),
9556
- noun: 'friend'
9557
- });
9558
- if (target.textContent === '') return null;
9559
- // Add 'friendItem' class and unique aria-label to each <li> for accessibility
9560
- target.querySelectorAll('li').forEach((li, idx) => {
9561
- li.classList.add('friendItem');
9562
- // Try to find a link or text to use as a label
9563
- const link = li.querySelector('a');
9564
- if (link && link.textContent) {
9565
- li.setAttribute('aria-label', `Friend: ${link.textContent.trim()}`);
9566
- } else if (li.textContent) {
9567
- li.setAttribute('aria-label', `Friend: ${li.textContent.trim()}`);
9568
- } else {
9569
- li.setAttribute('aria-label', `Friend ${idx + 1}`);
9570
- }
9571
- });
9572
- return target;
9573
- };
9574
- exports.extractFriends = extractFriends;
9575
10223
 
9576
10224
  /***/ },
9577
10225
 
@@ -10231,9 +10879,10 @@ Object.defineProperty(exports, "__esModule", ({
10231
10879
  value: true
10232
10880
  }));
10233
10881
  exports.addMeToYourFriendsDiv = void 0;
10234
- exports.checkIfFriendExists = checkIfFriendExists;
10882
+ exports.checkIfThingExists = checkIfThingExists;
10235
10883
  exports.createAddMeToYourFriendsButton = void 0;
10236
- exports.saveNewFriend = saveNewFriend;
10884
+ exports.extractFriends = extractFriends;
10885
+ exports.saveNewThing = saveNewThing;
10237
10886
  var _litHtml = __webpack_require__(6752);
10238
10887
  var _solidLogic = __webpack_require__(5663);
10239
10888
  var _rdflib = __webpack_require__(5491);
@@ -10270,7 +10919,7 @@ const createAddMeToYourFriendsButton = (subject, context) => {
10270
10919
  });
10271
10920
  function setButtonHandler(event) {
10272
10921
  event.preventDefault();
10273
- saveNewFriend(subject, context).then(() => {
10922
+ saveNewThing(subject, context, _solidUi.ns.foaf('knows')).then(() => {
10274
10923
  (0, _buttonsHelper.clearPreviousMessage)(buttonContainer);
10275
10924
  (0, _buttonsHelper.mention)(buttonContainer, _texts.friendWasAddedSuccesMessage);
10276
10925
  refreshButton();
@@ -10285,7 +10934,7 @@ const createAddMeToYourFriendsButton = (subject, context) => {
10285
10934
  const me = _solidLogic.authn.currentUser();
10286
10935
  const store = context.session.store;
10287
10936
  if (checkIfAnyUserLoggedIn(me)) {
10288
- checkIfFriendExists(store, me, subject).then(friendExists => {
10937
+ checkIfThingExists(store, me, subject, _solidUi.ns.foaf('knows')).then(friendExists => {
10289
10938
  if (friendExists) {
10290
10939
  //logged in and friend exists or friend was just added
10291
10940
  button.innerHTML = _texts.friendExistsAlreadyButtonText.toUpperCase();
@@ -10302,15 +10951,15 @@ const createAddMeToYourFriendsButton = (subject, context) => {
10302
10951
  return button;
10303
10952
  };
10304
10953
  exports.createAddMeToYourFriendsButton = createAddMeToYourFriendsButton;
10305
- async function saveNewFriend(subject, context) {
10954
+ async function saveNewThing(subject, context, predicate) {
10306
10955
  const me = _solidLogic.authn.currentUser();
10307
10956
  const store = context.session.store;
10308
10957
  if (checkIfAnyUserLoggedIn(me)) {
10309
- if (!(await checkIfFriendExists(store, me, subject))) {
10958
+ if (!(await checkIfThingExists(store, me, subject, predicate))) {
10310
10959
  //if friend does not exist, we add her/him
10311
10960
  await store.fetcher.load(me);
10312
10961
  const updater = store.updater;
10313
- const toBeInserted = [(0, _rdflib.st)(me, _solidUi.ns.foaf('knows'), subject, me.doc())];
10962
+ const toBeInserted = [(0, _rdflib.st)(me, predicate, subject, me.doc())];
10314
10963
  try {
10315
10964
  await updater.update([], toBeInserted);
10316
10965
  } catch (error) {
@@ -10324,9 +10973,24 @@ async function saveNewFriend(subject, context) {
10324
10973
  function checkIfAnyUserLoggedIn(me) {
10325
10974
  if (me) return true;else return false;
10326
10975
  }
10327
- async function checkIfFriendExists(store, me, subject) {
10976
+ async function checkIfThingExists(store, me, subject, predicate) {
10328
10977
  await store.fetcher.load(me);
10329
- if (store.whether(me, _solidUi.ns.foaf('knows'), subject, me.doc()) === 0) return false;else return true;
10978
+ if (store.whether(me, predicate, subject, me.doc()) === 0) return false;else return true;
10979
+ }
10980
+ function extractFriends(editable, subject, {
10981
+ dom
10982
+ }) {
10983
+ const target = dom.createElement('div');
10984
+ console.log('Extracting friends for subject:', subject.doc()); // Debug log to check the subject
10985
+ _solidUi.widgets.attachmentList(dom, subject, target, {
10986
+ doc: subject.doc(),
10987
+ modify: editable,
10988
+ predicate: _solidUi.ns.foaf('knows'),
10989
+ noun: 'friend'
10990
+ });
10991
+ if (target.textContent === '') return null;
10992
+ console.log('Extracted friends:', target.innerHTML); // Debug log to check the generated HTML
10993
+ return target;
10330
10994
  }
10331
10995
 
10332
10996
  /***/ },
@@ -10396,7 +11060,7 @@ var _rdfFormsHelper = _interopRequireDefault(__webpack_require__(7824));
10396
11060
  var _texts = __webpack_require__(1363);
10397
11061
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10398
11062
  /* babel-plugin-inline-import '../ontology/resumeForm.ttl' */
10399
- const resumeForm = "@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 :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\xE9tailes de ce r\xF4le\"@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 \"Occupation in ESCO\";\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\xE9but\"@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\xF4le\"@fr, \"Vergangene Rolle\"@de, \"Rol anterior\"@es .\nsolid:CurrentRole a rdfs:Class; rdfs:label \"Current role\"@en, \"R\xF4le actuel\"@fr, \"Momentane Rolle\"@de , \"Rol actual\"@es .\nsolid:FutureRole a rdfs:Class; rdfs:label \"Future role\"@en, \"R\xF4le \xE0 venir\"@fr, \"Zuk\xFCnftige 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\xF3n de investigaci\xF3n\"@es, \n \"\u0645\u0646\u0638\u0645\u0629 \u0627\u0644\u0628\u062D\u062B\"@ar, \"\u0905\u0928\u0941\u0938\u0902\u0927\u093E\u0928 \u0938\u0902\u0917\u0920\u0928\"@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 \"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)\". }";
11063
+ const resumeForm = "@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\xE9tailes de ce r\xF4le\"@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\xE9but\"@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\xF4le\"@fr, \"Vergangene Rolle\"@de, \"Rol anterior\"@es .\nsolid:CurrentRole a rdfs:Class; rdfs:label \"Current role\"@en, \"R\xF4le actuel\"@fr, \"Momentane Rolle\"@de , \"Rol actual\"@es .\nsolid:FutureRole a rdfs:Class; rdfs:label \"Future role\"@en, \"R\xF4le \xE0 venir\"@fr, \"Zuk\xFCnftige 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\xF3n de investigaci\xF3n\"@es, \n \"\u0645\u0646\u0638\u0645\u0629 \u0627\u0644\u0628\u062D\u062B\"@ar, \"\u0905\u0928\u0941\u0938\u0902\u0927\u093E\u0928 \u0938\u0902\u0917\u0920\u0928\"@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)\". }";
10400
11064
  const resumeFormName = 'resumeForm.ttl'; // The name of the form file
10401
11065
 
10402
11066
  function EditCVSection(context, me, editableProfile, store) {
@@ -10412,12 +11076,7 @@ function EditCVSection(context, me, editableProfile, store) {
10412
11076
  heading.textContent = _texts.resumeHeadingText;
10413
11077
  header.appendChild(heading);
10414
11078
  section.appendChild(header);
10415
- if (editableProfile) {
10416
- const comment2 = context.dom.createElement('p');
10417
- comment2.classList.add('p-md');
10418
- comment2.textContent = 'Edit your resume. These will be publicly visible on your profile.';
10419
- section.appendChild(comment2);
10420
- } else {
11079
+ if (!editableProfile) {
10421
11080
  const comment1 = context.dom.createElement('p');
10422
11081
  comment1.classList.add('p-md');
10423
11082
  comment1.textContent = 'Login to add resume information to your profile.';
@@ -10441,7 +11100,14 @@ Object.defineProperty(exports, "__esModule", ({
10441
11100
  exports.EditProfileCommunitiesSection = EditProfileCommunitiesSection;
10442
11101
  var _solidUi = __webpack_require__(9426);
10443
11102
  var _texts = __webpack_require__(1363);
10444
- function EditProfileCommunitiesSection(context, me, editableProfile, profile) {
11103
+ var _solidLogic = __webpack_require__(5663);
11104
+ __webpack_require__(6433);
11105
+ __webpack_require__(8434);
11106
+ var _buttonsHelper = __webpack_require__(4198);
11107
+ var _addMeToYourFriends = __webpack_require__(4695);
11108
+ var _editProfilePresenter = __webpack_require__(6444);
11109
+ const GREEN_PLUS = _solidUi.icons.iconBase + 'noun_34653_green.svg';
11110
+ function EditProfileCommunitiesSection(context, me, editableProfile) {
10445
11111
  const section = context.dom.createElement('section');
10446
11112
  section.setAttribute('aria-labelledby', 'edit-profile-communities-heading');
10447
11113
  section.classList.add('profileSection', 'section-bg');
@@ -10453,31 +11119,43 @@ function EditProfileCommunitiesSection(context, me, editableProfile, profile) {
10453
11119
  heading.textContent = _texts.communitiesHeadingText;
10454
11120
  header.appendChild(heading);
10455
11121
  section.appendChild(header);
10456
- const comment1 = context.dom.createElement('p');
10457
- comment1.id = 'edit-profile-communities-description';
10458
- comment1.classList.add('p-md');
10459
- comment1.textContent = 'These are organizations and projects whose stuff you share';
10460
- section.appendChild(comment1);
10461
- let comment2 = null;
10462
11122
  if (editableProfile) {
10463
- comment2 = context.dom.createElement('p');
10464
- comment2.id = 'edit-profile-communities-help';
10465
- comment2.classList.add('p-md');
10466
- comment2.textContent = 'Drag organizations onto the target below to add organizations.';
10467
- section.appendChild(comment2);
10468
- }
10469
- const attachmentList = _solidUi.widgets.attachmentList(context.dom, me, section, {
10470
- doc: profile,
10471
- modify: !!editableProfile,
10472
- predicate: _solidUi.ns.solid('community'),
10473
- noun: 'community'
10474
- });
10475
- const descriptions = [comment1.id];
10476
- if (comment2?.id) {
10477
- descriptions.push(comment2.id);
11123
+ let plusButtonDiv = context.dom.createElement('div');
11124
+ plusButtonDiv.classList.add('add-community-button-container');
11125
+ createAddButton(plusButtonDiv, context);
11126
+ section.appendChild(plusButtonDiv);
11127
+ }
11128
+ const attachmentOuter = section.appendChild(context.dom.createElement('table'));
11129
+ attachmentOuter.classList.add('edit-community-attachment-outer');
11130
+ const attachmentOne = attachmentOuter.appendChild(context.dom.createElement('tr'));
11131
+ const attachmentRight = attachmentOne.appendChild(context.dom.createElement('td'));
11132
+ const attachmentTable = attachmentRight.appendChild(context.dom.createElement('table'));
11133
+ attachmentTable.classList.add('attachmentTable', 'table', 'table-striped', 'table-hover');
11134
+ attachmentOuter.refresh = (0, _editProfilePresenter.refresh)(context.dom, attachmentTable, me, editableProfile, _solidUi.ns.solid('community')); // Participate in downstream changes
11135
+
11136
+ (0, _editProfilePresenter.refresh)(context.dom, attachmentTable, me, editableProfile, _solidUi.ns.solid('community'));
11137
+ function createAddButton(buttonContainer, context) {
11138
+ const plus = buttonContainer.appendChild(_solidUi.widgets.button(context.dom, GREEN_PLUS, 'Add a project or community', greenButtonHandler));
11139
+ const predicate = _solidUi.ns.solid('community');
11140
+ plus.setAttribute('class', 'add-button');
11141
+ plus.setAttribute('aria-label', 'Add a new community');
11142
+ const span = context.dom.createElement('span');
11143
+ span.textContent = 'Add a community or project'; // for screen readers
11144
+ span.setAttribute('class', 'span');
11145
+ buttonContainer.appendChild(span);
11146
+ async function greenButtonHandler(_event) {
11147
+ const webid = await _solidUi.widgets.askName(context.dom, _solidLogic.store, buttonContainer, predicate, undefined, 'WebID of');
11148
+ if (!webid || !(0, _editProfilePresenter.isAWebID)(webid)) {
11149
+ return; // cancelled by user
11150
+ }
11151
+ return (0, _addMeToYourFriends.saveNewThing)(webid, context, predicate).then(() => {
11152
+ (0, _editProfilePresenter.refresh)(context.dom, attachmentTable, me, editableProfile, predicate); // Update the button state after adding a community
11153
+ }).catch(error => {
11154
+ (0, _buttonsHelper.clearPreviousMessage)(buttonContainer);
11155
+ (0, _buttonsHelper.complain)(buttonContainer, context, error);
11156
+ });
11157
+ }
10478
11158
  }
10479
- attachmentList.setAttribute('aria-describedby', descriptions.join(' '));
10480
- section.appendChild(attachmentList);
10481
11159
  return section;
10482
11160
  }
10483
11161
 
@@ -10551,7 +11229,14 @@ Object.defineProperty(exports, "__esModule", ({
10551
11229
  exports.EditFriendsSection = EditFriendsSection;
10552
11230
  var _solidUi = __webpack_require__(9426);
10553
11231
  var _texts = __webpack_require__(1363);
10554
- function EditFriendsSection(context, me, editableProfile, profile) {
11232
+ var _addMeToYourFriends = __webpack_require__(4695);
11233
+ __webpack_require__(8434);
11234
+ __webpack_require__(6433);
11235
+ var _solidLogic = __webpack_require__(5663);
11236
+ var _buttonsHelper = __webpack_require__(4198);
11237
+ var _editProfilePresenter = __webpack_require__(6444);
11238
+ const GREEN_PLUS = _solidUi.icons.iconBase + 'noun_34653_green.svg';
11239
+ function EditFriendsSection(context, me, editableProfile) {
10555
11240
  const section = context.dom.createElement('section');
10556
11241
  section.setAttribute('aria-labelledby', 'edit-profile-friends-heading');
10557
11242
  section.classList.add('profileSection', 'section-bg');
@@ -10563,31 +11248,59 @@ function EditFriendsSection(context, me, editableProfile, profile) {
10563
11248
  heading.textContent = _texts.friendsHeadingText;
10564
11249
  header.appendChild(heading);
10565
11250
  section.appendChild(header);
10566
- const comment1 = context.dom.createElement('p');
10567
- comment1.id = 'edit-profile-friends-description';
10568
- comment1.classList.add('p-md');
10569
- 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.)';
10570
- section.appendChild(comment1);
10571
- let comment2 = null;
10572
11251
  if (editableProfile) {
10573
- comment2 = context.dom.createElement('p');
10574
- comment2.id = 'edit-profile-friends-help';
10575
- comment2.classList.add('p-md');
10576
- comment2.textContent = 'Drag people onto the target below to add people.';
10577
- section.appendChild(comment2);
10578
- }
10579
- const attachmentList = _solidUi.widgets.attachmentList(context.dom, me, section, {
10580
- doc: profile,
10581
- modify: !!editableProfile,
10582
- predicate: _solidUi.ns.foaf('knows'),
10583
- noun: 'friend'
10584
- });
10585
- const descriptions = [comment1.id];
10586
- if (comment2?.id) {
10587
- descriptions.push(comment2.id);
11252
+ let plusButtonDiv = context.dom.createElement('div');
11253
+ plusButtonDiv.classList.add('add-friend-button-container');
11254
+ createAddButton(plusButtonDiv, context);
11255
+ section.appendChild(plusButtonDiv);
11256
+ }
11257
+ const attachmentOuter = section.appendChild(context.dom.createElement('table'));
11258
+ attachmentOuter.classList.add('edit-friends-attachment-outer');
11259
+ const attachmentOne = attachmentOuter.appendChild(context.dom.createElement('tr'));
11260
+ const attachmentRight = attachmentOne.appendChild(context.dom.createElement('td'));
11261
+ const attachmentTable = attachmentRight.appendChild(context.dom.createElement('table'));
11262
+ attachmentTable.classList.add('attachmentTable', 'table', 'table-striped', 'table-hover');
11263
+ attachmentOuter.refresh = (0, _editProfilePresenter.refresh)(context.dom, attachmentTable, me, editableProfile, _solidUi.ns.foaf('knows')); // Participate in downstream changes
11264
+
11265
+ (0, _editProfilePresenter.refresh)(context.dom, attachmentTable, me, editableProfile, _solidUi.ns.foaf('knows'));
11266
+ function createAddButton(buttonContainer, context) {
11267
+ const plus = buttonContainer.appendChild(_solidUi.widgets.button(context.dom, GREEN_PLUS, 'Add a friend', greenButtonHandler));
11268
+ const predicate = _solidUi.ns.foaf('knows');
11269
+ plus.setAttribute('class', 'add-button');
11270
+ plus.setAttribute('aria-label', 'Add a friend');
11271
+ const span = context.dom.createElement('span');
11272
+ span.textContent = 'Add a friend'; // for screen readers
11273
+ span.setAttribute('class', 'span');
11274
+ buttonContainer.appendChild(span);
11275
+ async function greenButtonHandler(_event) {
11276
+ const webid = await _solidUi.widgets.askName(context.dom, _solidLogic.store, buttonContainer, predicate, undefined, 'WebID of the friend you');
11277
+ if (!webid) {
11278
+ return;
11279
+ }
11280
+ try {
11281
+ new URL(webid);
11282
+ } catch {
11283
+ (0, _buttonsHelper.complain)(buttonContainer, context, 'Not a URL');
11284
+ return;
11285
+ }
11286
+ try {
11287
+ await _solidLogic.store.fetcher.load(_solidLogic.store.sym(webid));
11288
+ } catch {
11289
+ (0, _buttonsHelper.complain)(buttonContainer, context, 'Not a valid WebID');
11290
+ return;
11291
+ }
11292
+ if (!(0, _editProfilePresenter.isAWebID)(_solidLogic.store.sym(webid))) {
11293
+ (0, _buttonsHelper.complain)(buttonContainer, context, 'WebID does not seem to exist');
11294
+ return;
11295
+ }
11296
+ return (0, _addMeToYourFriends.saveNewThing)(webid, context, predicate).then(() => {
11297
+ (0, _editProfilePresenter.refresh)(context.dom, attachmentTable, me, editableProfile, predicate); // Update the button state after adding a friend
11298
+ }).catch(error => {
11299
+ (0, _buttonsHelper.clearPreviousMessage)(buttonContainer);
11300
+ (0, _buttonsHelper.complain)(buttonContainer, context, error);
11301
+ });
11302
+ }
10588
11303
  }
10589
- attachmentList.setAttribute('aria-describedby', descriptions.join(' '));
10590
- section.appendChild(attachmentList);
10591
11304
  return section;
10592
11305
  }
10593
11306
 
@@ -10607,7 +11320,7 @@ var _rdfFormsHelper = _interopRequireDefault(__webpack_require__(7824));
10607
11320
  var _texts = __webpack_require__(1363);
10608
11321
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10609
11322
  /* babel-plugin-inline-import '../ontology/otherPreferencesForm.ttl' */
10610
- const otherPreferencesForm = "@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\".";
11323
+ const otherPreferencesForm = "@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\".";
10611
11324
  const otherPreferencesFormName = 'otherPreferencesForm.ttl'; // The name of the form file
10612
11325
 
10613
11326
  function EditOtherPreferencesSection(context, me, editableProfile, store) {
@@ -10645,9 +11358,10 @@ var _EditFriendsCard = __webpack_require__(8308);
10645
11358
  var _EditSocialCard = __webpack_require__(9410);
10646
11359
  var _EditCommunitiesCard = __webpack_require__(8188);
10647
11360
  __webpack_require__(1930);
10648
- __webpack_require__(855);
11361
+ __webpack_require__(8434);
10649
11362
  var _EditCVCard = __webpack_require__(6016);
10650
11363
  var _EditOtherPreferences = __webpack_require__(7643);
11364
+ var _rdfFormsHelper = __webpack_require__(7824);
10651
11365
  /**
10652
11366
  * Profile Editing App Pane
10653
11367
  *
@@ -10736,10 +11450,13 @@ const editProfileView = {
10736
11450
  main.appendChild((0, _EditOtherPreferences.EditOtherPreferencesSection)(context, me, editableProfile, store));
10737
11451
 
10738
11452
  // People you know Section
10739
- main.appendChild((0, _EditFriendsCard.EditFriendsSection)(context, me, editableProfile, profile));
11453
+ main.appendChild((0, _EditFriendsCard.EditFriendsSection)(context, me, editableProfile));
10740
11454
 
10741
11455
  // Communities you participate in Section
10742
- main.appendChild((0, _EditCommunitiesCard.EditProfileCommunitiesSection)(context, me, editableProfile, profile));
11456
+ main.appendChild((0, _EditCommunitiesCard.EditProfileCommunitiesSection)(context, me, editableProfile));
11457
+
11458
+ // Ensure keyboard navigation skips labels (including those rendered as links).
11459
+ (0, _rdfFormsHelper.skipLabelsFromTabbing)(main);
10743
11460
  main.setAttribute('aria-busy', 'false');
10744
11461
  main.focus();
10745
11462
  }).catch(error => {
@@ -10784,12 +11501,7 @@ function EditSocialSection(context, me, editableProfile, store) {
10784
11501
  heading.textContent = _texts.socialAccountsHeadingText;
10785
11502
  header.appendChild(heading);
10786
11503
  section.appendChild(header);
10787
- if (editableProfile) {
10788
- const comment2 = context.dom.createElement('p');
10789
- comment2.classList.add('p-md');
10790
- comment2.textContent = 'Add links to your social media accounts here. These will be publicly visible on your profile.';
10791
- section.appendChild(comment2);
10792
- } else {
11504
+ if (!editableProfile) {
10793
11505
  const comment1 = context.dom.createElement('p');
10794
11506
  comment1.classList.add('p-md');
10795
11507
  comment1.textContent = 'Login to add social media accounts to your profile.';
@@ -10801,6 +11513,111 @@ function EditSocialSection(context, me, editableProfile, store) {
10801
11513
 
10802
11514
  /***/ },
10803
11515
 
11516
+ /***/ 6444
11517
+ (__unused_webpack_module, exports, __webpack_require__) {
11518
+
11519
+ "use strict";
11520
+
11521
+
11522
+ Object.defineProperty(exports, "__esModule", ({
11523
+ value: true
11524
+ }));
11525
+ exports.isAWebID = isAWebID;
11526
+ exports.refresh = refresh;
11527
+ var _rdflib = __webpack_require__(5491);
11528
+ var _solidLogic = __webpack_require__(5663);
11529
+ var _solidUi = __webpack_require__(9426);
11530
+ function refresh(dom, attachmentTable, me, editableProfile, predicate) {
11531
+ // Keep the RDF terms so downstream Solid-UI helpers (e.g. findImage) can call term.sameTerm().
11532
+ // We still sort by string value so the list order is stable.
11533
+ const friendsList = _solidLogic.store.each(me, predicate);
11534
+ // Ensure profiles are loaded before we render rows, otherwise widgets.findImage / utils.label may return empty.
11535
+ void (async () => {
11536
+ if (_solidLogic.store.fetcher) {
11537
+ await Promise.all(friendsList.map(friend => {
11538
+ if (!_solidLogic.store.holds(friend, null, null, null)) {
11539
+ return _solidLogic.store.fetcher?.load(friend.value).catch(() => undefined);
11540
+ }
11541
+ return Promise.resolve();
11542
+ }));
11543
+ }
11544
+ friendsList.sort((a, b) => a.value > b.value ? 1 : a.value < b.value ? -1 : 0);
11545
+ _solidUi.utils.syncTableToArray(attachmentTable, friendsList, target => createNewRow(dom, attachmentTable, target, me, editableProfile, predicate));
11546
+ })();
11547
+ }
11548
+ function createNewRow(dom, attachmentTable, target, me, editableProfile, predicate) {
11549
+ const theTarget = target;
11550
+ const profileImg = dom.createElement('img');
11551
+ profileImg.classList.add('profile-image');
11552
+ profileImg.src = _solidUi.widgets.findImage((0, _rdflib.sym)(target));
11553
+ profileImg.alt = `Image of ${_solidUi.utils.label((0, _rdflib.sym)(target))}`;
11554
+ const opt = {
11555
+ image: profileImg,
11556
+ title: _solidUi.utils.label((0, _rdflib.sym)(target)),
11557
+ link: true
11558
+ };
11559
+ if (!!editableProfile) {
11560
+ opt.deleteFunction = function () {
11561
+ deleteAttachment(dom, attachmentTable, me, editableProfile, theTarget, predicate);
11562
+ };
11563
+ }
11564
+ return _solidUi.widgets.renderAsRow(dom, predicate, target, opt);
11565
+ }
11566
+ async function deleteAttachment(dom, attachmentTable, me, editableProfile, target, predicate) {
11567
+ if (!_solidLogic.store.updater) {
11568
+ throw new Error('Store has no updater.');
11569
+ }
11570
+
11571
+ // Delete the exact statements in the store so we don't rely on doc() matching
11572
+ const statementsToDelete = _solidLogic.store.statementsMatching(me, predicate, target, null);
11573
+ if (!statementsToDelete.length) {
11574
+ console.warn('No matching statement found to delete for', target.value);
11575
+ refresh(dom, attachmentTable, me, editableProfile, predicate);
11576
+ return;
11577
+ }
11578
+ try {
11579
+ await _solidLogic.store.updater.update(statementsToDelete, []);
11580
+
11581
+ // UpdateManager may mutate store asynchronously, so only remove locally if it still exists
11582
+ if (typeof _solidLogic.store.removeStatements === 'function') {
11583
+ const stillThere = _solidLogic.store.holds(me, predicate, target, null);
11584
+ if (stillThere) {
11585
+ try {
11586
+ _solidLogic.store.removeStatements(statementsToDelete);
11587
+ } catch (e) {
11588
+ // Ignore if already gone
11589
+ }
11590
+ }
11591
+ }
11592
+
11593
+ // Ensure store is up-to-date before re-rendering
11594
+ if (_solidLogic.store.fetcher) await _solidLogic.store.fetcher.load(me.doc());
11595
+ refresh(dom, attachmentTable, me, editableProfile, predicate);
11596
+ } catch (error) {
11597
+ console.error('Error deleting:', error);
11598
+
11599
+ // If update failed, try to keep UI in sync anyway
11600
+ if (typeof _solidLogic.store.removeStatements === 'function') {
11601
+ try {
11602
+ _solidLogic.store.removeStatements(statementsToDelete);
11603
+ } catch (e) {
11604
+ /* ignore */
11605
+ }
11606
+ }
11607
+ if (_solidLogic.store.fetcher) await _solidLogic.store.fetcher.load(me.doc());
11608
+ refresh(dom, attachmentTable, me, editableProfile, predicate);
11609
+ }
11610
+ }
11611
+ function isAWebID(subject) {
11612
+ if (subject && subject.doc) {
11613
+ const t = _solidLogic.store.findTypeURIs(subject.doc());
11614
+ return !!t[_solidUi.ns.foaf('PersonalProfileDocument').uri];
11615
+ }
11616
+ return false;
11617
+ }
11618
+
11619
+ /***/ },
11620
+
10804
11621
  /***/ 2643
10805
11622
  (__unused_webpack_module, exports, __webpack_require__) {
10806
11623
 
@@ -10973,6 +11790,7 @@ Object.defineProperty(exports, "__esModule", ({
10973
11790
  }));
10974
11791
  exports["default"] = renderForm;
10975
11792
  exports.loadDocument = loadDocument;
11793
+ exports.skipLabelsFromTabbing = skipLabelsFromTabbing;
10976
11794
  var _rdflib = __webpack_require__(5491);
10977
11795
  var _solidUi = __webpack_require__(9426);
10978
11796
  const baseUri = 'https://solidos.github.io/profile-pane/src/ontology/';
@@ -10993,8 +11811,112 @@ store, dom, editableProfile, whichForm) {
10993
11811
  _solidUi.widgets.appendForm(dom, div, {}, subject, formThis, editableProfile, (ok, mes) => {
10994
11812
  if (!ok) _solidUi.widgets.errorMessageBlock(dom, mes);
10995
11813
  });
11814
+
11815
+ // Ensure that when a user clicks “Add skill” or “Add language”, the newly
11816
+ // created input receives focus. Solid-UI provides only a generic "Add" button.
11817
+ // We detect the "add" control by the plus icon it uses and focus the last
11818
+ // text input in the surrounding multiple-field container.
11819
+ enableFocusOnAdd(div);
11820
+
11821
+ // Track the last click/tap position so popups (like solid-ui delete confirmations)
11822
+ // can be positioned closer to where the user clicked.
11823
+ let lastClick = {
11824
+ x: 0,
11825
+ y: 0
11826
+ };
11827
+ div.addEventListener('pointerdown', event => {
11828
+ lastClick = {
11829
+ x: event.clientX,
11830
+ y: event.clientY
11831
+ };
11832
+ }, {
11833
+ capture: true
11834
+ });
11835
+
11836
+ // Solid-UI injects a popup DIV (position:absolute, top:-1em) under a relative container.
11837
+ // Detect it and reposition it using last click coordinates.
11838
+ const repositionPopup = popup => {
11839
+ const win = dom.defaultView || window;
11840
+ const padding = 10;
11841
+ const maxWidth = win.innerWidth - padding;
11842
+ const maxHeight = win.innerHeight - padding;
11843
+
11844
+ // Force fixed positioning, then clamp to viewport so it doesn't get cut off.
11845
+ popup.style.position = 'fixed';
11846
+ popup.style.zIndex = '9999';
11847
+ popup.style.pointerEvents = 'auto';
11848
+ popup.style.opacity = '1';
11849
+ popup.style.visibility = 'visible';
11850
+
11851
+ // Use getBoundingClientRect after it is in DOM; if it is 0x0, fall back to default offset.
11852
+ const rect = popup.getBoundingClientRect();
11853
+ const popupWidth = rect.width || 200;
11854
+ const popupHeight = rect.height || 100;
11855
+ const left = Math.min(Math.max(lastClick.x + padding, padding), maxWidth - popupWidth);
11856
+ const top = Math.min(Math.max(lastClick.y + padding, padding), maxHeight - popupHeight);
11857
+ popup.style.left = `${left}px`;
11858
+ popup.style.top = `${top}px`;
11859
+ };
11860
+ const observer = new MutationObserver(mutations => {
11861
+ for (const mutation of mutations) {
11862
+ for (const node of Array.from(mutation.addedNodes)) {
11863
+ if (!(node instanceof HTMLElement)) continue;
11864
+ // Solid-UI popups are divs with inline position:absolute and grid display
11865
+ if (node.style.position === 'absolute' && node.style.display === 'grid' && node.style.top === '-1em') {
11866
+ repositionPopup(node);
11867
+ continue;
11868
+ }
11869
+ // Also handle nested cases where the popup is not the direct added node
11870
+ const popup = node.querySelector('div[style*="position:absolute"][style*="display:grid"][style*="top:-1em"]');
11871
+ if (popup) repositionPopup(popup);
11872
+ }
11873
+ }
11874
+ });
11875
+ observer.observe(div, {
11876
+ childList: true,
11877
+ subtree: true
11878
+ });
10996
11879
  } // renderForm
10997
11880
 
11881
+ function enableFocusOnAdd(root) {
11882
+ const PLUS_ICON = 'noun_19460_green.svg';
11883
+ const isAddButton = el => {
11884
+ const img = el.querySelector('img');
11885
+ const label = el.querySelector('span');
11886
+ return img?.src.includes(PLUS_ICON) && label?.textContent?.trim().toLowerCase().startsWith('add ');
11887
+ };
11888
+ const buttons = Array.from(root.querySelectorAll('div')).filter(isAddButton);
11889
+ buttons.forEach(btn => {
11890
+ btn.addEventListener('click', () => {
11891
+ const scope = function findScope(el) {
11892
+ let cur = el;
11893
+ while (cur && cur !== root) {
11894
+ if (cur.querySelector('input[data-testid="autocomplete-input"]')) return cur;
11895
+ cur = cur.parentElement;
11896
+ }
11897
+ return root;
11898
+ }(btn);
11899
+ const before = new Set(Array.from(scope.querySelectorAll('input[data-testid="autocomplete-input"]')));
11900
+ const start = Date.now();
11901
+ const interval = setInterval(() => {
11902
+ const current = Array.from(scope.querySelectorAll('input[data-testid="autocomplete-input"]'));
11903
+ const newInput = current.find(el => !before.has(el));
11904
+ if (newInput) {
11905
+ // New inputs are usually wrapped in a label/link; make sure focus jumps
11906
+ // straight to the input rather than the label link.
11907
+ skipLabelsFromTabbing(scope);
11908
+ newInput.focus();
11909
+ clearInterval(interval);
11910
+ return;
11911
+ }
11912
+ if (Date.now() - start > 1000) {
11913
+ clearInterval(interval);
11914
+ }
11915
+ }, 50);
11916
+ });
11917
+ });
11918
+ }
11919
+
10998
11920
  // we need to load into the store some additional information about Social Media accounts
10999
11921
  function loadDocument(store, documentSource, documentName, documentURI) {
11000
11922
  const finalDocumentUri = documentURI || baseUri + documentName; // Full URI to the file
@@ -11006,6 +11928,26 @@ function loadDocument(store, documentSource, documentName, documentURI) {
11006
11928
  (0, _rdflib.parse)(documentSource, store, finalDocumentUri, 'text/turtle', () => null); // Load doc directly
11007
11929
  }
11008
11930
  }
11931
+ function skipLabelsFromTabbing(root) {
11932
+ // Many Solid-UI forms render field labels as focusable links (hrefs).
11933
+ // Make sure keyboard tabbing skips these label links entirely.
11934
+ const selectors = ['label', '.formFieldName a', '.classifierBox-label a', '.choiceBox-label a', '.label a',
11935
+ // Skip focusable label-like links created by Solid-UI forms, including the vcard note link
11936
+ 'a[href="http://www.w3.org/2006/vcard/ns#note"]', 'a[href$="#note"]'].join(', ');
11937
+
11938
+ // querySelectorAll<HTMLElement> ensures the elements are typed correctly so we can access tabIndex.
11939
+ const nodes = root?.querySelectorAll(selectors);
11940
+ if (!nodes) return;
11941
+ Array.from(nodes).forEach(el => {
11942
+ if (typeof el.tabIndex === 'number' && el.tabIndex !== -1) {
11943
+ el.tabIndex = -1;
11944
+ }
11945
+ // Ensure those label links are not announced as focusable elements
11946
+ if (el.getAttribute('aria-hidden') !== 'true') {
11947
+ el.setAttribute('aria-hidden', 'true');
11948
+ }
11949
+ });
11950
+ }
11009
11951
 
11010
11952
  /***/ },
11011
11953
 
@@ -31971,7 +32913,57 @@ var update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMP
31971
32913
 
31972
32914
  /***/ },
31973
32915
 
31974
- /***/ 855
32916
+ /***/ 6433
32917
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
32918
+
32919
+ "use strict";
32920
+ __webpack_require__.r(__webpack_exports__);
32921
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
32922
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
32923
+ /* harmony export */ });
32924
+ /* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5072);
32925
+ /* harmony import */ var _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
32926
+ /* harmony import */ var _style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7825);
32927
+ /* harmony import */ var _style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
32928
+ /* harmony import */ var _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7659);
32929
+ /* harmony import */ var _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
32930
+ /* harmony import */ var _style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5056);
32931
+ /* harmony import */ var _style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
32932
+ /* harmony import */ var _style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(540);
32933
+ /* harmony import */ var _style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
32934
+ /* harmony import */ var _style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1113);
32935
+ /* harmony import */ var _style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
32936
+ /* harmony import */ var _css_loader_dist_cjs_js_editProfile_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(9340);
32937
+
32938
+
32939
+
32940
+
32941
+
32942
+
32943
+
32944
+
32945
+
32946
+
32947
+
32948
+ var options = {};
32949
+
32950
+ options.styleTagTransform = (_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
32951
+ options.setAttributes = (_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
32952
+ options.insert = _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
32953
+ options.domAPI = (_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
32954
+ options.insertStyleElement = (_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
32955
+
32956
+ var update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_editProfile_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options);
32957
+
32958
+
32959
+
32960
+
32961
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_editProfile_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _css_loader_dist_cjs_js_editProfile_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _css_loader_dist_cjs_js_editProfile_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined);
32962
+
32963
+
32964
+ /***/ },
32965
+
32966
+ /***/ 8434
31975
32967
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
31976
32968
 
31977
32969
  "use strict";
@@ -31991,7 +32983,7 @@ __webpack_require__.r(__webpack_exports__);
31991
32983
  /* harmony import */ var _style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
31992
32984
  /* harmony import */ var _style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1113);
31993
32985
  /* harmony import */ var _style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
31994
- /* harmony import */ var _css_loader_dist_cjs_js_rdfFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2024);
32986
+ /* harmony import */ var _css_loader_dist_cjs_js_profileRDFFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7347);
31995
32987
 
31996
32988
 
31997
32989
 
@@ -32011,12 +33003,12 @@ options.insert = _style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTE
32011
33003
  options.domAPI = (_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
32012
33004
  options.insertStyleElement = (_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
32013
33005
 
32014
- var update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_rdfFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options);
33006
+ var update = _style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_css_loader_dist_cjs_js_profileRDFFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options);
32015
33007
 
32016
33008
 
32017
33009
 
32018
33010
 
32019
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_rdfFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _css_loader_dist_cjs_js_rdfFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _css_loader_dist_cjs_js_rdfFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined);
33011
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_css_loader_dist_cjs_js_profileRDFFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _css_loader_dist_cjs_js_profileRDFFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _css_loader_dist_cjs_js_profileRDFFormsEnforced_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined);
32020
33012
 
32021
33013
 
32022
33014
  /***/ },
@@ -46614,9 +47606,53 @@ const schedulePane = {
46614
47606
  const showForms = function () {
46615
47607
  clearElement(naviCenter) // Remove refresh button if nec
46616
47608
  const div = naviMain
47609
+
47610
+ // form2 depends on sched:allDay; seed a local default for new polls
47611
+ if (!kb.any(subject, ns.sched('allDay'))) {
47612
+ kb.add(
47613
+ subject,
47614
+ ns.sched('allDay'),
47615
+ external_rdflib_.literal(
47616
+ 'true',
47617
+ undefined,
47618
+ external_rdflib_.sym('http://www.w3.org/2001/XMLSchema#boolean')
47619
+ ),
47620
+ detailsDoc
47621
+ )
47622
+ }
47623
+
46617
47624
  const wizard = true
46618
47625
  let currentSlide = 0
46619
47626
  let gotDoneButton = false
47627
+
47628
+ const hasFormControls = function (container) {
47629
+ return !!container.querySelector('input, select, textarea, button')
47630
+ }
47631
+
47632
+ const asBoolean = function (term, fallback) {
47633
+ if (!term) return fallback
47634
+ const value = (term.value || '').toLowerCase()
47635
+ if (value === 'true' || value === '1') return true
47636
+ if (value === 'false' || value === '0') return false
47637
+ return fallback
47638
+ }
47639
+
47640
+ const renderTimeProposalFallback = function (slide) {
47641
+ const allDayValue = asBoolean(kb.any(subject, ns.sched('allDay')), true)
47642
+ const fallbackForm = kb.sym(
47643
+ formsURI + (allDayValue ? '#AllDayForm2' : '#NotAllDayForm2')
47644
+ )
47645
+ external_UI_.widgets.appendForm(
47646
+ document,
47647
+ slide,
47648
+ {},
47649
+ subject,
47650
+ fallbackForm,
47651
+ detailsDoc,
47652
+ complainIfBad
47653
+ )
47654
+ }
47655
+
46620
47656
  if (wizard) {
46621
47657
  const forms = [form1, form2, form3]
46622
47658
  const slides = []
@@ -46632,6 +47668,12 @@ const schedulePane = {
46632
47668
  detailsDoc,
46633
47669
  complainIfBad
46634
47670
  )
47671
+
47672
+ // Some stores end up with form2's ui:Options unresolved; force a usable input form.
47673
+ if (f === 1 && !hasFormControls(slide)) {
47674
+ renderTimeProposalFallback(slide)
47675
+ }
47676
+
46635
47677
  slides.push(slide)
46636
47678
  }
46637
47679
 
@@ -46939,7 +47981,7 @@ const schedulePane = {
46939
47981
 
46940
47982
  // Read or create empty results file
46941
47983
  function getResults () {
46942
- fetcher.nowOrWhenFetched(resultsDoc.uri, (ok, body, response) => {
47984
+ fetcher.nowOrWhenFetched(resultsDoc.uri, undefined, (ok, body, response) => {
46943
47985
  if (!ok) {
46944
47986
  if (response.status === 404) {
46945
47987
  // / Check explicitly for 404 error
@@ -47025,11 +48067,15 @@ const schedulePane = {
47025
48067
  options.set_x = kb.each(subject, ns.sched('option')) // @@@@@ option -> dtstart in future
47026
48068
  options.set_x = options.set_x.map(function (opt) {
47027
48069
  return kb.any(opt, ns.cal('dtstart'))
48070
+ }).filter(function (time) {
48071
+ return !!time
47028
48072
  })
47029
48073
 
47030
48074
  options.set_y = kb.each(subject, ns.sched('response'))
47031
48075
  options.set_y = options.set_y.map(function (resp) {
47032
48076
  return kb.any(resp, ns.dc('author'))
48077
+ }).filter(function (author) {
48078
+ return !!author
47033
48079
  })
47034
48080
 
47035
48081
  const possibleTimes = kb
@@ -47037,6 +48083,9 @@ const schedulePane = {
47037
48083
  .map(function (opt) {
47038
48084
  return kb.any(opt, ns.cal('dtstart'))
47039
48085
  })
48086
+ .filter(function (time) {
48087
+ return !!time
48088
+ })
47040
48089
 
47041
48090
  const displayTheMatrix = function () {
47042
48091
  const matrix = div.appendChild(
@@ -47112,6 +48161,7 @@ const schedulePane = {
47112
48161
  } // @@ may need that
47113
48162
  const selectOptions = {}
47114
48163
  const predicate = ns.sched('availabilty')
48164
+ if (!x) return
47115
48165
  const cellSubject = dataPointForNT[x.toNT()]
47116
48166
  const selector = external_UI_.widgets.makeSelectForOptions(
47117
48167
  dom,
@@ -47150,19 +48200,22 @@ const schedulePane = {
47150
48200
  const dps = kb.each(myResponse, ns.sched('cell'))
47151
48201
  dps.forEach(function (dataPoint) {
47152
48202
  const time = kb.any(dataPoint, ns.cal('dtstart'))
48203
+ if (!time) return
47153
48204
  dataPointForNT[time.toNT()] = dataPoint
47154
48205
  })
47155
48206
  }
47156
48207
  for (let j = 0; j < possibleTimes.length; j++) {
47157
- if (dataPointForNT[possibleTimes[j].toNT()]) continue
48208
+ const possibleTime = possibleTimes[j]
48209
+ if (!possibleTime) continue
48210
+ if (dataPointForNT[possibleTime.toNT()]) continue
47158
48211
  const dataPoint = external_rdflib_.sym(id + '_' + j)
47159
48212
  insertables.push(
47160
48213
  external_rdflib_.st(myResponse, ns.sched('cell'), dataPoint, doc)
47161
48214
  )
47162
48215
  insertables.push(
47163
- external_rdflib_.st(dataPoint, ns.cal('dtstart'), possibleTimes[j], doc)
48216
+ external_rdflib_.st(dataPoint, ns.cal('dtstart'), possibleTime, doc)
47164
48217
  ) // @@
47165
- dataPointForNT[possibleTimes[j].toNT()] = dataPoint
48218
+ dataPointForNT[possibleTime.toNT()] = dataPoint
47166
48219
  }
47167
48220
  if (insertables.length) {
47168
48221
  kb.updater.update([], insertables, function (
@@ -48971,7 +50024,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error
48971
50024
  //# sourceMappingURL=marked.esm.js.map
48972
50025
 
48973
50026
  ;// ./node_modules/dompurify/dist/purify.es.mjs
48974
- /*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */
50027
+ /*! @license DOMPurify 3.3.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.3/LICENSE */
48975
50028
 
48976
50029
  const {
48977
50030
  entries,
@@ -49278,7 +50331,7 @@ const _createHooksMap = function _createHooksMap() {
49278
50331
  function createDOMPurify() {
49279
50332
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
49280
50333
  const DOMPurify = root => createDOMPurify(root);
49281
- DOMPurify.version = '3.3.1';
50334
+ DOMPurify.version = '3.3.3';
49282
50335
  DOMPurify.removed = [];
49283
50336
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
49284
50337
  // Not running in a browser, provide a factory function
@@ -49573,7 +50626,7 @@ function createDOMPurify() {
49573
50626
  /* Parse profile info */
49574
50627
  if (USE_PROFILES) {
49575
50628
  ALLOWED_TAGS = addToSet({}, purify_es_text);
49576
- ALLOWED_ATTR = [];
50629
+ ALLOWED_ATTR = purify_es_create(null);
49577
50630
  if (USE_PROFILES.html === true) {
49578
50631
  addToSet(ALLOWED_TAGS, html$1);
49579
50632
  addToSet(ALLOWED_ATTR, html);
@@ -49594,6 +50647,13 @@ function createDOMPurify() {
49594
50647
  addToSet(ALLOWED_ATTR, xml);
49595
50648
  }
49596
50649
  }
50650
+ /* Prevent function-based ADD_ATTR / ADD_TAGS from leaking across calls */
50651
+ if (!objectHasOwnProperty(cfg, 'ADD_TAGS')) {
50652
+ EXTRA_ELEMENT_HANDLING.tagCheck = null;
50653
+ }
50654
+ if (!objectHasOwnProperty(cfg, 'ADD_ATTR')) {
50655
+ EXTRA_ELEMENT_HANDLING.attributeCheck = null;
50656
+ }
49597
50657
  /* Merge configuration parameters */
49598
50658
  if (cfg.ADD_TAGS) {
49599
50659
  if (typeof cfg.ADD_TAGS === 'function') {
@@ -49991,6 +51051,10 @@ function createDOMPurify() {
49991
51051
  */
49992
51052
  // eslint-disable-next-line complexity
49993
51053
  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
51054
+ /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */
51055
+ if (FORBID_ATTR[lcName]) {
51056
+ return false;
51057
+ }
49994
51058
  /* Make sure attribute cannot clobber */
49995
51059
  if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
49996
51060
  return false;
@@ -50083,7 +51147,7 @@ function createDOMPurify() {
50083
51147
  value = SANITIZE_NAMED_PROPS_PREFIX + value;
50084
51148
  }
50085
51149
  /* Work around a security issue with comments inside attributes */
50086
- if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|title|textarea)/i, value)) {
51150
+ if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {
50087
51151
  _removeAttribute(name, currentNode);
50088
51152
  continue;
50089
51153
  }