contacts-pane 3.0.2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +53 -1
  2. package/dist/contactsPane.js +6487 -763
  3. package/dist/contactsPane.js.map +1 -1
  4. package/dist/contactsPane.min.js +2 -0
  5. package/dist/contactsPane.min.js.map +1 -0
  6. package/dist/styles/contactsPane.css +602 -0
  7. package/dist/styles/contactsRDFFormsEnforced.css +513 -0
  8. package/dist/styles/groupMembership.css +115 -0
  9. package/dist/styles/individual.css +12 -0
  10. package/dist/styles/localUtils.css +49 -0
  11. package/dist/styles/mugshotGallery.css +17 -0
  12. package/dist/styles/toolsPane.css +43 -0
  13. package/dist/styles/utilities.css +69 -0
  14. package/dist/styles/webidControl.css +90 -0
  15. package/package.json +23 -17
  16. package/dist/autocompleteBar.d.ts +0 -3
  17. package/dist/autocompleteBar.d.ts.map +0 -1
  18. package/dist/autocompleteBar.js +0 -90
  19. package/dist/autocompleteBar.js.map +0 -1
  20. package/dist/autocompleteField.d.ts +0 -20
  21. package/dist/autocompleteField.d.ts.map +0 -1
  22. package/dist/autocompleteField.js +0 -165
  23. package/dist/autocompleteField.js.map +0 -1
  24. package/dist/autocompletePicker.d.ts +0 -15
  25. package/dist/autocompletePicker.d.ts.map +0 -1
  26. package/dist/autocompletePicker.js +0 -253
  27. package/dist/autocompletePicker.js.map +0 -1
  28. package/dist/contactLogic.js +0 -223
  29. package/dist/contactLogic.js.map +0 -1
  30. package/dist/groupMembershipControl.js +0 -107
  31. package/dist/groupMembershipControl.js.map +0 -1
  32. package/dist/individual.js +0 -115
  33. package/dist/individual.js.map +0 -1
  34. package/dist/mintNewAddressBook.js +0 -145
  35. package/dist/mintNewAddressBook.js.map +0 -1
  36. package/dist/mugshotGallery.js +0 -264
  37. package/dist/mugshotGallery.js.map +0 -1
  38. package/dist/publicData.d.ts +0 -82
  39. package/dist/publicData.d.ts.map +0 -1
  40. package/dist/publicData.js +0 -421
  41. package/dist/publicData.js.map +0 -1
  42. package/dist/toolsPane.js +0 -671
  43. package/dist/toolsPane.js.map +0 -1
  44. package/dist/webidControl.js +0 -320
  45. package/dist/webidControl.js.map +0 -1
@@ -0,0 +1,602 @@
1
+ /* Focus indicator for keyboard navigation */
2
+ .contactPane table tr[tabindex="0"]:focus {
3
+ outline: var(--focus-ring-width) solid var(--color-primary);
4
+ outline-offset: 2px;
5
+ background: var(--color-info-bg);
6
+ }
7
+ /* contactsPane styles — extracted from inline styles in contactsPane.js */
8
+ /* Uses CSS custom properties from the global stylesheet (dev-global.css / mashlib) */
9
+
10
+ /* ── Layout: Three-column browser ────────────────────────────── */
11
+
12
+ .contactPane .peopleSection .selected {
13
+ background-color: var(--color-info-bg) !important;
14
+ }
15
+
16
+ .contactPane .detailSection,
17
+ .contactPane .addressBookSection {
18
+ display: flex;
19
+ flex-direction: column;
20
+ align-items: stretch;
21
+ flex: 1 1 0; /* allow it to grow but not force wrap */
22
+ min-width: 300px;
23
+ box-sizing: border-box;
24
+ background: var(--color-section-bg);
25
+ }
26
+
27
+ .contactPane .detailsSectionContent {
28
+ flex: 1 1 auto;
29
+ min-height: 200px;
30
+ padding: var(--spacing-lg);
31
+ max-width: 900px;
32
+ width: 100%;
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ .contactPane .detailsSectionContent--wide {
37
+ max-width: 900px;
38
+ }
39
+
40
+ .contactPane .cardFooter {
41
+ display: flex;
42
+ flex-wrap: nowrap; /* keep buttons inline */
43
+ align-items: center; /* vertical centering if varied heights */
44
+ gap: var(--spacing-xs);
45
+ padding-top: var(--spacing-md);
46
+ margin-top: var(--spacing-md);
47
+ }
48
+
49
+ .contactPane .detailsSectionContent {
50
+ margin: 0;
51
+ }
52
+
53
+ /* ── Contact type chooser ───────────────────────────────────── */
54
+
55
+ .contactPane .contactTypeChooser {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: var(--spacing-sm);
59
+ max-width: 360px;
60
+ }
61
+
62
+ .contactPane .contactTypeChooser h3 {
63
+ margin: 0 0 var(--spacing-xs) 0;
64
+ font-size: var(--font-size-lg);
65
+ }
66
+
67
+ .contactPane .contactTypeSelect {
68
+ height: var(--min-touch-target);
69
+ border: 1px solid var(--color-border-pale);
70
+ border-radius: var(--border-radius-base);
71
+ padding: 0 var(--spacing-sm);
72
+ font-size: var(--font-size-sm);
73
+ background: var(--color-section-bg);
74
+ }
75
+
76
+ /* ── Search ──────────────────────────────────────────────────── */
77
+
78
+ .contactPane .allGroupsButton {
79
+ border-radius: var(--border-radius-full) !important;
80
+ /* existing styles */
81
+ }
82
+ /* wrapper to position clear icon/button */
83
+ .contactPane .searchDiv {
84
+ position: relative;
85
+ }
86
+
87
+ .contactPane .searchInput {
88
+ height: var(--min-touch-target);
89
+ border: 1px solid var(--color-border-pale);
90
+ background-color: var(--color-section-bg);
91
+ 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");
92
+ background-repeat: no-repeat;
93
+ background-position: 8px center;
94
+ background-size: 20px 20px;
95
+ border-radius: var(--border-radius-base);
96
+ padding: 0 var(--spacing-sm) 0 34px;
97
+ font-size: var(--font-size-base);
98
+ width: 100%;
99
+ box-sizing: border-box;
100
+ }
101
+
102
+ /* clear button inside search input */
103
+ .contactPane .searchClearButton {
104
+ position: absolute;
105
+ right: var(--spacing-sm);
106
+ top: 50%;
107
+ transform: translateY(-50%);
108
+ border: none;
109
+ background: transparent;
110
+ font-size: var(--font-size-base);
111
+ line-height: 1;
112
+ padding: 0;
113
+ cursor: pointer;
114
+ color: var(--color-text-muted);
115
+ /* visibility is controlled via the generic `.hidden` utility class */
116
+ display: block;
117
+ }
118
+ .contactPane .searchClearButton.hidden {
119
+ display: none;
120
+ }
121
+ .contactPane .searchClearButton:hover {
122
+ color: var(--color-text);
123
+ }
124
+
125
+ /* ── Contact toolbar (top-right link + delete) ──────────────── */
126
+
127
+ .contactPane .contact-toolbar {
128
+ display: flex;
129
+ align-items: center;
130
+ gap: var(--spacing-sm);
131
+ padding: var(--spacing-xs) 0;
132
+ }
133
+
134
+ .contactPane .contact-toolbar a {
135
+ margin: 0.3em;
136
+ }
137
+
138
+ .contactPane .contact-toolbar a img {
139
+ width: 1.3em;
140
+ height: 1em;
141
+ margin: 0;
142
+ }
143
+
144
+ .contact-toolbar .deleteButton {
145
+ margin-left: auto; /* keeps delete icon on the right */
146
+ margin-right: 0.2em;
147
+ width: 1em;
148
+ height: 1em;
149
+ float: none; /* important: prevents overlap behavior */
150
+ }
151
+
152
+ /* ── "All" groups button ─────────────────────────────────────── */
153
+
154
+ .contactPane .allGroupsButton {
155
+ margin-left: var(--spacing-md);
156
+ font-size: var(--font-size-base);
157
+ }
158
+
159
+ .contactPane .allGroupsButton--loading {
160
+ background-color: var(--color-primary);
161
+ }
162
+
163
+ .contactPane .allGroupsButton--active {
164
+ background-color: var(--color-primary);
165
+ color: var(--color-background);
166
+ }
167
+
168
+ .contactPane .allGroupsButton--loaded {
169
+ background-color: var(--color-primary);
170
+ }
171
+
172
+ /* ── Selection & visibility states ───────────────────────────── */
173
+
174
+ .contactPane .group-loading {
175
+ }
176
+
177
+ /* ── Mint new address book ───────────────────────────────────── */
178
+
179
+ .contactPane .claimSuccess {
180
+ font-size: var(--font-size-xl);
181
+ }
182
+
183
+ .contactPane {
184
+ display: flex;
185
+ flex-direction: column;
186
+ min-height: 100vh;
187
+ }
188
+
189
+ .contactPane .addressBook-grid {
190
+ display: flex;
191
+ flex-wrap: nowrap; /* keep sections side-by-side */
192
+ flex: 1;
193
+ min-width: 50%;
194
+ align-items: stretch;
195
+ width: 100%;
196
+ box-sizing: border-box;
197
+ overflow-x: auto; /* allow horizontal scroll if needed */
198
+ }
199
+
200
+ @media ((min-width: 500px) and (max-width: 900px)) {
201
+ .contactPane .addressBookSection {
202
+ max-width: 900px;
203
+ }
204
+ .contactPane .addressBookSection section {
205
+ max-width: 485px;
206
+ }
207
+ }
208
+
209
+ .contactPane .contactPane--narrow .addressBook-grid {
210
+ flex-direction: column !important;
211
+ flex-wrap: wrap !important;
212
+ }
213
+
214
+ .contactPane .contactPane--narrow .addressBookSection,
215
+ .contactPane .contactPane--narrow .detailSection {
216
+ flex: 1 1 100% !important;
217
+ max-width: 100% !important;
218
+ min-width: 0 !important;
219
+ width: 100% !important;
220
+ }
221
+
222
+ @media (max-width: 1000px) {
223
+ /* Stack sidebar + details vertically on narrow screens */
224
+ .contactPane {
225
+ min-height: auto !important;
226
+ }
227
+
228
+ .contactPane .addressBook-grid {
229
+ flex-direction: column !important;
230
+ flex-wrap: nowrap !important;
231
+ min-height: auto !important;
232
+ height: auto !important;
233
+ }
234
+
235
+ .contactPane .addressBookSection,
236
+ .contactPane .detailSection {
237
+ order: initial !important;
238
+ flex: none !important;
239
+ width: 100% !important;
240
+ max-width: 100% !important;
241
+ min-width: 0 !important;
242
+ }
243
+
244
+ .contactPane .addressBookSection {
245
+ max-height: 60vh !important;
246
+ min-height: auto !important;
247
+ overflow-y: auto !important;
248
+ padding-bottom: var(--spacing-lg) !important;
249
+ }
250
+
251
+ .contactPane .detailSection {
252
+ max-height: none !important;
253
+ min-height: auto !important;
254
+ overflow-y: visible !important;
255
+ }
256
+
257
+ .contactPane .detailsSectionContent {
258
+ display: flex !important;
259
+ flex-direction: column !important;
260
+ justify-content: flex-start !important;
261
+ align-items: stretch !important;
262
+ min-height: auto !important;
263
+ height: auto !important;
264
+ overflow-y: visible !important;
265
+ }
266
+
267
+ .contactPane .detailSection > .detailsSectionContent {
268
+ padding-top: var(--spacing-sm) !important;
269
+ box-sizing: border-box !important;
270
+ }
271
+
272
+ /* Small-screen larger text and spacing */
273
+ .contactPane,
274
+ .contactPane * {
275
+ font-size: 2rem !important;
276
+ }
277
+
278
+ .contactPane .actionButton,
279
+ .contactPane .searchInput,
280
+ .contactPane .flatButton,
281
+ .contactPane .buttonSection button,
282
+ .contactPane .groupButtonsList button {
283
+ min-height: calc(var(--min-touch-target) + 0.5em) !important;
284
+ font-size: 2rem !important;
285
+ padding: 1em 1em !important;
286
+ }
287
+
288
+ .contactPane .group-membership-item .group-membership-toolbar > img.hoverControlHide, .contactPane .group-membership-item .group-membership-toolbar > [data-testid="deleteButtonWithCheck"],
289
+ .individualPane .hoverControl img.hoverControlHide,
290
+ .individualPane .hoverControl [data-testid="deleteButtonWithCheck"] {
291
+ display: inline-flex !important;
292
+ visibility: visible !important;
293
+ opacity: 1 !important;
294
+ }
295
+ }
296
+
297
+
298
+ /* Card Section Background */
299
+ .contactPane .section-bg {
300
+ background: var(--color-section-bg);
301
+ padding: var(--spacing-md);
302
+ box-sizing: border-box;
303
+ border: none !important;
304
+ border-radius: 0 !important;
305
+ }
306
+
307
+ /* Keep detail section content anchored at top */
308
+ .contactPane .detailSection {
309
+ display: flex;
310
+ flex-direction: column;
311
+ justify-content: flex-start;
312
+ align-items: stretch;
313
+ }
314
+
315
+ .contactPane .detailsSectionContent {
316
+ display: flex;
317
+ flex-direction: column;
318
+ justify-content: flex-start;
319
+ align-items: stretch;
320
+ }
321
+
322
+ /* ── Button section: horizontal scrollable row ──────────────── */
323
+
324
+ .contactPane .buttonSection {
325
+ display: flex;
326
+ flex-wrap: nowrap;
327
+ align-items: center;
328
+ padding: var(--spacing-sm);
329
+ padding-bottom: 0;
330
+ overflow-x: auto;
331
+ overflow-y: hidden;
332
+ -webkit-overflow-scrolling: touch;
333
+ scrollbar-width: thin;
334
+ margin-bottom: 0;
335
+ }
336
+
337
+ .contactPane .buttonSection::-webkit-scrollbar {
338
+ height: 6px;
339
+ }
340
+
341
+ .contactPane .buttonSection::-webkit-scrollbar-thumb {
342
+ background: var(--color-border-pale);
343
+ border-radius: var(--border-radius-base);
344
+ }
345
+
346
+ .contactPane .buttonSection::-webkit-scrollbar-track {
347
+ background: transparent;
348
+ }
349
+
350
+ .contactPane .buttonSection .selected {
351
+ background: none !important;
352
+ }
353
+
354
+ .contactPane .groupButtonsList {
355
+ display: flex;
356
+ flex-wrap: nowrap;
357
+ align-items: center;
358
+ gap: var(--spacing-xs);
359
+ list-style: none;
360
+ }
361
+
362
+ .contactPane .buttonSection .groupButtonsList {
363
+ margin-left: var(--spacing-xs);
364
+ margin-right: var(--spacing-xs);
365
+ padding-left: 0;
366
+ }
367
+
368
+ .contactPane .groupButtonsList li {
369
+ flex-shrink: 0;
370
+ }
371
+
372
+ .contactPane .groupButtonsList button {
373
+ white-space: nowrap;
374
+ flex-shrink: 0;
375
+ min-width: max-content;
376
+ margin-left: 0;
377
+ }
378
+
379
+ /* Groups list in details section — flexible 2-column grid */
380
+ .contactPane .detailsSectionContent .groupButtonsList {
381
+ display: grid;
382
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
383
+ gap: var(--spacing-sm);
384
+ list-style: none;
385
+ padding: 0;
386
+ width: 100%;
387
+ box-sizing: border-box;
388
+ }
389
+
390
+ .contactPane .detailsSectionContent .groupButtonsList li {
391
+ width: 100%;
392
+ aspect-ratio: auto;
393
+ display: flex;
394
+ flex-direction: column;
395
+ align-items: stretch;
396
+ gap: var(--spacing-xs);
397
+ }
398
+
399
+ .contactPane .detailsSectionContent .groupButtonsList button {
400
+ width: 100%;
401
+ height: auto;
402
+ text-align: center;
403
+ border-radius: var(--border-radius-base);
404
+ word-wrap: break-word;
405
+ overflow-wrap: break-word;
406
+ }
407
+
408
+ .contactPane .detailsSectionContent .groupButtonsList li > img.hoverControlHide,
409
+ .contactPane .detailsSectionContent .groupButtonsList li > img[data-testid="deleteButtonWithCheck"] {
410
+ display: block;
411
+ align-self: flex-end;
412
+ float: none !important;
413
+ margin: 0 !important;
414
+ }
415
+
416
+ @media (max-width: 599px) {
417
+ .contactPane .detailsSectionContent .groupButtonsList {
418
+ grid-template-columns: repeat(2, 1fr);
419
+ gap: var(--spacing-xs);
420
+ }
421
+
422
+ .contactPane .detailsSectionContent .groupButtonsList button {
423
+ font-size: var(--font-size-sm);
424
+ border-radius: var(--border-radius-base);
425
+ }
426
+ }
427
+
428
+ @media (min-width: 900px) {
429
+ .contactPane .detailsSectionContent .groupButtonsList {
430
+ grid-template-columns: repeat(3, 1fr);
431
+ }
432
+ }
433
+
434
+ .contactPane .detailsSectionContent .newGroupBtn {
435
+ width: 100%;
436
+ box-sizing: border-box;
437
+ margin-top: var(--spacing-sm);
438
+ }
439
+
440
+ .contactPane .detailsSectionContent h3 {
441
+ font-size: var(--font-size-xl);
442
+ margin-bottom: var(--spacing-sm);
443
+ padding-left: 0;
444
+ }
445
+
446
+ /* Delete confirmation POPUP — centered overlay in details section */
447
+ .contactPane .detailSection {
448
+ position: relative;
449
+ }
450
+
451
+ .contactPane .webidControl div[style*="position: relative"]:has(> div[style*="display: grid"]) {
452
+ position: static !important;
453
+ }
454
+
455
+
456
+ .contactPane .webidControl .personaRow--webid td > div[style*="position: relative"] > div,
457
+ .contactPane .detailsSectionContent .groupButtonsList li > div[style*="position: relative"] > div,
458
+ .contactPane .detailsSectionContent .contact-toolbar > div[style*="position: relative"] > div {
459
+ position: absolute !important;
460
+ left: auto !important;
461
+ z-index: 9999 !important;
462
+ display: grid !important;
463
+ pointer-events: auto !important;
464
+ opacity: 1 !important;
465
+ visibility: visible !important;
466
+ padding: var(--spacing-btn) !important;
467
+ min-width: 12em !important;
468
+ background: var(--color-background) !important;
469
+ border: var(--border-width-sm) solid var(--color-primary) !important;
470
+ border-radius: var(--border-radius-base) !important;
471
+ box-shadow: var(--box-shadow-popup) !important;
472
+ grid-template-columns: auto auto !important;
473
+ gap: var(--spacing-xxs) !important;
474
+ }
475
+
476
+ .contactPane .detailsSectionContent .contact-toolbar > div[style*="position: relative"] > div > button:has(> img[src$=".svg"]),
477
+ .contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar > div[style*="position: relative"] > div > button:has(> img[src$=".svg"]),
478
+ .contactPane .webidControl .personaRow--webid td > div[style*="position: relative"] > div > button:has(> img[src$=".svg"]) {
479
+ background-color: transparent !important;
480
+ }
481
+
482
+ /* Selected state for All contacts button */
483
+ .contactPane .allGroupsButton--selected {
484
+ background-color: var(--color-primary);
485
+ color: var(--color-background);
486
+ }
487
+
488
+ /* ── Header section ──────────────────────────────────────────── */
489
+
490
+ .contactPane .headerSection {
491
+ background: var(--color-background);
492
+ padding: var(--spacing-sm);
493
+ border-top-left-radius: var(--border-radius-full);
494
+ border-top-right-radius: var(--border-radius-full);
495
+ margin-bottom: 0;
496
+ }
497
+
498
+ .contactPane .headerSection header {
499
+ display: flex;
500
+ align-items: center;
501
+ justify-content: space-between;
502
+ margin-bottom: 0;
503
+ }
504
+
505
+ .contactPane .headerSection h2 {
506
+ margin-bottom: 0;
507
+ }
508
+
509
+ /* ── Dotted horizontal rule ─────────────────────────────────── */
510
+
511
+ .contactPane .dottedHr {
512
+ border: none;
513
+ border-top: 1px dotted var(--color-text-muted);
514
+ margin: 0;
515
+ }
516
+
517
+ /* ── Search section ─────────────────────────────────────────── */
518
+
519
+ .contactPane .searchSection {
520
+ padding: var(--spacing-sm);
521
+ padding-bottom: 0;
522
+ margin-bottom: 0;
523
+ }
524
+
525
+ /* ── People list section ────────────────────────────────────── */
526
+
527
+ .contactPane .peopleSection {
528
+ display: flex;
529
+ background: var(--color-background);
530
+ border-top: 1px dotted var(--color-text-muted);
531
+ margin-bottom: 0;
532
+ }
533
+
534
+ .contactPane .peopleSection ul {
535
+ list-style: none;
536
+ padding: 0;
537
+ margin: 0;
538
+ width: 100%;
539
+ max-height: 70vh;
540
+ overflow-y: auto;
541
+ }
542
+
543
+ .contactPane .peopleSection li {
544
+ border-top: 1px solid var(--color-border-pale);
545
+ padding: var(--spacing-xs);
546
+ }
547
+
548
+ /* ── Person list item (addressBookPresenter) ─────────────────── */
549
+
550
+ .contactPane .personLi-row {
551
+ display: flex;
552
+ align-items: center;
553
+ justify-content: space-between;
554
+ }
555
+
556
+ .contactPane .personLi-avatar {
557
+ width: 45px;
558
+ height: 45px;
559
+ flex-shrink: 0;
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ }
564
+
565
+ .contactPane .personLi-avatar .avatar-placeholder {
566
+ width: 36px;
567
+ height: 36px;
568
+ display: flex;
569
+ align-items: center;
570
+ justify-content: center;
571
+ }
572
+
573
+ .contactPane .personLi-avatar img {
574
+ width: 40px;
575
+ height: 40px;
576
+ border-radius: 50%;
577
+ object-fit: cover;
578
+ }
579
+
580
+ .contactPane .personLi-info {
581
+ flex: 1;
582
+ margin-left: var(--spacing-sm);
583
+ overflow: hidden;
584
+ }
585
+
586
+ .contactPane .personLi-name {
587
+ font-weight: bold;
588
+ font-size: var(--font-size-base);
589
+ white-space: nowrap;
590
+ overflow: hidden;
591
+ text-overflow: ellipsis;
592
+ }
593
+
594
+ .contactPane .personLi-arrow {
595
+ margin-left: auto;
596
+ display: flex;
597
+ align-items: center;
598
+ }
599
+
600
+ .contactPane .personLi--error {
601
+ opacity: 0.5;
602
+ }