···
56
56
<Route path="/zen" element={<ZenPage />} />
57
57
<Route path="/methodology" element={<ScoringMethodology />} />
58
58
59
59
-
{/* Omnifeed Routes - Now Public */}
59
59
+
{/* Omnifeed Routes - Temporarily Commented Out */}
60
60
+
{/*
60
61
<Route
61
62
path="/omnifeed/:username"
62
63
element={<CollectionsFeed />}
···
65
66
path="/omnifeed"
66
67
element={<CollectionsFeed />}
67
68
/>
69
69
+
*/}
68
70
69
71
{/* Handle both DIDs and regular usernames */}
70
72
<Route path="/:username" element={<UserProfile />} />
···
1
1
.login-container {
2
2
display: flex;
3
3
+
flex-direction: column;
3
4
justify-content: center;
4
5
align-items: center;
5
5
-
min-height: 70vh;
6
6
+
min-height: calc(100vh - 150px);
6
7
padding: 2rem;
8
8
+
box-sizing: border-box;
7
9
}
8
10
9
11
.login-card {
10
12
background-color: var(--navbar-bg);
11
11
-
border: 5px solid var(--card-border);
13
13
+
border: 1px solid var(--card-border);
12
14
border-radius: 12px;
13
13
-
box-shadow: none;
14
14
-
padding: 40px;
15
15
+
box-shadow: var(--card-shadow, 0 2px 8px rgba(0,0,0,0.1));
16
16
+
padding: 30px 40px;
15
17
width: 100%;
16
18
max-width: 450px;
17
19
text-align: center;
18
20
display: flex;
19
21
flex-direction: column;
22
22
+
gap: 15px;
20
23
transition: background-color 0.3s ease, border-color 0.3s ease;
21
24
}
22
25
23
23
-
.login-card h2 {
24
24
-
color: var(--text-color);
25
25
-
margin-bottom: 1.5rem;
26
26
-
font-size: 1.8rem;
27
27
-
gap: 15px;
28
28
-
align-items: center;
26
26
+
.login-card h1 {
27
27
+
color: var(--button-bg);
28
28
+
font-size: 2em;
29
29
+
margin-bottom: 10px;
30
30
+
text-align: center;
29
31
}
30
32
31
33
.login-card p {
32
32
-
color: var(--secondary-text-color);
33
33
-
margin-bottom: 1.5rem;
34
34
+
color: var(--text);
35
35
+
margin-bottom: 20px;
36
36
+
line-height: 1.5;
37
37
+
text-align: center;
34
38
}
35
39
36
40
.login-error {
···
44
48
.login-form {
45
49
display: flex;
46
50
flex-direction: column;
47
47
-
gap: 1.5rem;
48
48
-
margin-bottom: 1.5rem;
51
51
+
gap: 15px;
52
52
+
width: 100%;
53
53
+
}
54
54
+
55
55
+
.login-input-field {
56
56
+
border: 2px solid var(--card-border);
57
57
+
border-radius: 6px;
58
58
+
padding: 10px 12px;
59
59
+
font-size: 1em;
60
60
+
background-color: var(--navbar-bg);
61
61
+
color: var(--text);
62
62
+
transition: all 0.3s ease;
63
63
+
font-family: inherit;
64
64
+
text-align: center;
65
65
+
width: auto;
66
66
+
max-width: 100%;
67
67
+
}
68
68
+
69
69
+
.login-input-field:hover,
70
70
+
.login-input-field:focus {
71
71
+
border-color: var(--button-bg);
72
72
+
background-color: var(--background);
73
73
+
outline: none;
74
74
+
}
75
75
+
76
76
+
.login-submit-button {
77
77
+
background: var(--button-bg);
78
78
+
color: var(--button-text);
79
79
+
border: none;
80
80
+
border-radius: 6px;
81
81
+
padding: 10px 20px;
82
82
+
font-weight: 700;
83
83
+
font-size: 1em;
84
84
+
cursor: pointer;
85
85
+
transition: background-color 0.3s ease;
86
86
+
width: fit-content;
87
87
+
margin: 10px auto 0;
49
88
}
50
89
51
51
-
.login-info {
52
52
-
border-top: 1px solid var(--border-color);
53
53
-
padding-top: 1.5rem;
54
54
-
margin-top: 1rem;
90
90
+
.login-submit-button:hover {
91
91
+
background: var(--button-hover-bg, #0056b3);
55
92
}
56
93
57
57
-
.login-info p {
58
58
-
font-size: 0.9rem;
59
59
-
color: var(--secondary-text-color);
94
94
+
.login-submit-button:disabled {
95
95
+
background-color: var(--button-disabled-bg, #cccccc);
96
96
+
cursor: not-allowed;
97
97
+
opacity: 0.7;
98
98
+
}
99
99
+
100
100
+
.login-status-message,
101
101
+
.login-error-message {
102
102
+
text-align: center;
103
103
+
margin-top: 10px;
104
104
+
font-size: 0.9em;
105
105
+
}
106
106
+
107
107
+
.login-error-message {
108
108
+
color: var(--error-text, #721c24);
109
109
+
background-color: var(--error-bg, #f8d7da);
110
110
+
padding: 10px;
111
111
+
border-radius: 4px;
112
112
+
border: 1px solid var(--error-border, #f5c6cb);
113
113
+
}
114
114
+
115
115
+
.dark-mode .login-error-message {
116
116
+
color: var(--error-text-dark, #f5c6cb);
117
117
+
background-color: var(--error-bg-dark, #4d1f24);
118
118
+
border-color: var(--error-border-dark, #721c24);
119
119
+
}
120
120
+
121
121
+
.login-privacy-note {
122
122
+
font-size: 0.85em;
123
123
+
color: var(--text-muted, #6c757d);
124
124
+
margin-top: 20px;
125
125
+
text-align: center;
126
126
+
}
127
127
+
128
128
+
.login-status p {
129
129
+
font-size: 1.1em;
130
130
+
color: var(--text-muted, var(--text));
60
131
}
···
10
10
const location = useLocation();
11
11
12
12
const queryParams = new URLSearchParams(location.search);
13
13
-
const returnUrl = queryParams.get('returnUrl') || '/';
13
13
+
const returnUrl = queryParams.get('returnUrl') || '/verifier';
14
14
15
15
useEffect(() => {
16
16
if (isAuthenticated) {
17
17
console.log('Already authenticated, redirecting from Login page to:', returnUrl);
18
18
-
navigate(returnUrl);
18
18
+
navigate(returnUrl, { replace: true });
19
19
}
20
20
}, [isAuthenticated, navigate, returnUrl]);
21
21
···
30
30
};
31
31
32
32
if (isAuthenticated) {
33
33
-
return <div>Redirecting...</div>;
33
33
+
return (
34
34
+
<div className="login-container login-status">
35
35
+
<p>Already logged in. Redirecting...</p>
36
36
+
</div>
37
37
+
);
34
38
}
35
39
36
40
return (
37
41
<div className="login-container">
38
38
-
<h1>Login to Cred Blue</h1>
39
39
-
<p>Enter your Bluesky handle (e.g., yourname.bsky.social) or leave blank to use bsky.social.</p>
40
40
-
<form onSubmit={handleSubmit}>
41
41
-
<input
42
42
-
type="text"
43
43
-
value={handle}
44
44
-
onChange={handleInputChange}
45
45
-
placeholder="yourname.bsky.social (optional)"
46
46
-
aria-label="Bluesky Handle (optional)"
47
47
-
/>
48
48
-
{loading && <p>Processing...</p>}
49
49
-
{error && <p className="error-message">Login failed: {error}</p>}
50
50
-
<button type="submit" disabled={loading}>
51
51
-
{loading ? 'Processing...' : 'Login with Bluesky'}
52
52
-
</button>
53
53
-
</form>
54
54
-
<p className="privacy-note">
55
55
-
We use official Bluesky authentication. We don't see or store your password.
56
56
-
</p>
42
42
+
<div className="login-card">
43
43
+
<h1>Login to Cred Blue</h1>
44
44
+
<p>Enter your Bluesky handle (e.g., yourname.bsky.social) or leave blank to use bsky.social.</p>
45
45
+
<form onSubmit={handleSubmit} className="login-form">
46
46
+
<input
47
47
+
type="text"
48
48
+
value={handle}
49
49
+
onChange={handleInputChange}
50
50
+
placeholder="yourname.bsky.social (optional)"
51
51
+
aria-label="Bluesky Handle (optional)"
52
52
+
className="login-input-field"
53
53
+
disabled={loading}
54
54
+
/>
55
55
+
{loading && <p className="login-status-message">Processing...</p>}
56
56
+
{error && <p className="login-error-message">Login failed: {error}</p>}
57
57
+
<button
58
58
+
type="submit"
59
59
+
disabled={loading}
60
60
+
className="login-submit-button"
61
61
+
>
62
62
+
{loading ? 'Processing...' : 'Login with Bluesky'}
63
63
+
</button>
64
64
+
</form>
65
65
+
<p className="login-privacy-note">
66
66
+
We use official Bluesky authentication. We don't see or store your password.
67
67
+
</p>
68
68
+
</div>
57
69
</div>
58
70
);
59
71
};
···
19
19
if (isAuthenticated) {
20
20
console.log('(LoginCallback) Authentication successful, redirecting...');
21
21
// TODO: Implement state parsing for returnUrl if needed
22
22
-
const returnUrl = '/'; // Default redirect
23
23
-
navigate(returnUrl);
22
22
+
const returnUrl = '/verifier'; // Changed redirect target
23
23
+
navigate(returnUrl, { replace: true }); // Use replace to avoid callback in history
24
24
} else {
25
25
// If not authenticated after loading, something went wrong
26
26
console.error('(LoginCallback) Authentication failed after loading.');
···
131
131
items: [
132
132
{ title: "library", path: "/resources" },
133
133
{ title: "alt text rating", path: "/alt-text" },
134
134
-
{ title: "omnifeed", path: "/omnifeed" },
134
134
+
// { title: "omnifeed", path: "/omnifeed" }, // Temporarily removed
135
135
{ title: "verifier", path: "/verifier" }
136
136
]
137
137
};
···
24
24
margin-bottom: 20px;
25
25
}
26
26
27
27
-
.verifier-container h2 {
28
28
-
font-size: 1.5em; /* Adjust */
29
29
-
margin-top: 0px; /* Space between sections */
30
30
-
border-bottom: 1px solid var(--card-border); /* Separator */
27
27
+
/* Apply consistent styles ONLY to h2 elements within verifier sections */
28
28
+
.verifier-section h2 {
29
29
+
color: var(--button-bg);
30
30
+
font-size: 1.5em;
31
31
+
text-align: left;
32
32
+
margin-top: 0;
33
33
+
margin-bottom: 15px;
31
34
padding-bottom: 10px;
32
32
-
}
33
33
-
34
34
-
.verifier-intro-text,
35
35
-
.verifier-section p {
36
36
-
color: var(--text);
37
37
-
line-height: 1.6;
38
38
-
margin-bottom: 0px;
39
39
-
text-align: left;
35
35
+
border-bottom: 1px solid var(--card-border);
40
36
}
41
37
42
38
.verifier-page-header {
···
90
86
/* Form Styles */
91
87
.verifier-section {
92
88
background: var(--navbar-bg);
93
93
-
border: 1px solid var(--card-border);
89
89
+
/* border: 1px solid var(--card-border); */ /* Remove border to match alt-card */
94
90
border-radius: 12px;
95
95
-
padding: 20px;
91
91
+
padding: 40px 30px; /* Increase padding to match alt-card */
96
92
margin-bottom: 20px;
97
93
}
98
94
···
245
241
}
246
242
.verifier-list-header h2 {
247
243
margin: 0;
248
248
-
border: none; /* Remove border inherited from h2 general style */
249
244
padding: 0;
245
245
+
border-bottom: none; /* Explicitly remove border here */
250
246
}
251
247
252
248
.verifier-list,
···
346
342
font-weight: bold;
347
343
}
348
344
349
349
-
350
345
/* Official Verifier Status */
346
346
+
/*
351
347
.verifier-official-verifier-tooltip {
352
352
-
/* Remove old styles for this if they existed, or repurpose if needed */
348
348
+
...
353
349
}
350
350
+
*/
354
351
355
355
-
/* New Tooltip Styles */
356
356
-
.verifier-tooltip-container {
357
357
-
position: relative;
358
358
-
display: inline-block;
359
359
-
margin-left: 5px; /* Keep spacing */
360
360
-
}
361
361
-
362
362
-
.verifier-tooltip-icon {
363
363
-
display: inline-block;
364
364
-
background-color: var(--card-border); /* Use a subtle background */
365
365
-
color: var(--text-muted, var(--text));
366
366
-
border-radius: 50%;
367
367
-
width: 1.4em; /* Adjust size */
368
368
-
height: 1.4em;
369
369
-
line-height: 1.4em; /* Center text vertically */
370
370
-
text-align: center;
371
371
-
font-size: 0.8em;
372
372
-
font-weight: bold;
373
373
-
cursor: help;
374
374
-
transition: background-color 0.3s ease, color 0.3s ease;
375
375
-
}
376
376
-
377
377
-
.verifier-tooltip-icon:hover {
378
378
-
background-color: var(--button-bg); /* Use button color on hover */
379
379
-
color: var(--button-text);
380
380
-
}
381
381
-
382
382
-
.verifier-tooltip-text {
383
383
-
visibility: hidden;
384
384
-
opacity: 0;
385
385
-
width: auto; /* Allow content to determine width */
386
386
-
max-width: 250px; /* Keep a max width */
387
387
-
background-color: var(--tooltip-bg, #333);
388
388
-
color: var(--tooltip-text, #fff);
389
389
-
text-align: center;
390
390
-
border-radius: 6px;
391
391
-
padding: 8px 12px;
392
392
-
position: absolute;
393
393
-
z-index: 10;
394
394
-
bottom: 135%;
395
395
-
left: 50%; /* Position the left edge at the center */
396
396
-
transform: translateX(-50%); /* Shift element left by half its own width */
397
397
-
transition: opacity 0.3s ease, visibility 0.3s ease;
398
398
-
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
352
352
+
/* Add Style for Description Paragraph */
353
353
+
.verifier-section-description {
399
354
font-size: 0.9em;
400
400
-
line-height: 1.4;
401
401
-
}
402
402
-
403
403
-
/* Tooltip arrow */
404
404
-
.verifier-tooltip-text::after {
405
405
-
content: "";
406
406
-
position: absolute;
407
407
-
top: 100%;
408
408
-
left: 50%;
409
409
-
transform: translateX(-50%); /* Center the arrow */
410
410
-
border-width: 5px;
411
411
-
border-style: solid;
412
412
-
border-color: var(--tooltip-bg, #333) transparent transparent transparent;
413
413
-
}
414
414
-
415
415
-
/* Media Query for smaller screens */
416
416
-
@media (max-width: 480px) {
417
417
-
.verifier-tooltip-text {
418
418
-
max-width: 85vw; /* Limit width relative to viewport */
419
419
-
left: 50%; /* Keep centered relative to icon */
420
420
-
transform: translateX(-50%); /* Keep centering transform */
421
421
-
}
422
422
-
.verifier-tooltip-text::after {
423
423
-
left: 50%; /* Keep arrow centered */
424
424
-
transform: translateX(-50%); /* Keep centering transform */
425
425
-
}
426
426
-
}
427
427
-
428
428
-
.verifier-tooltip-container:hover .verifier-tooltip-text {
429
429
-
visibility: visible;
430
430
-
opacity: 1;
431
431
-
}
432
432
-
433
433
-
/* Dark mode tooltip adjustments */
434
434
-
.dark-mode .verifier-tooltip-icon {
435
435
-
background-color: var(--card-border-dark, #555); /* Adjust dark variable */
436
436
-
color: var(--text-muted-dark, var(--text));
437
437
-
}
438
438
-
.dark-mode .verifier-tooltip-icon:hover {
439
439
-
background-color: var(--button-bg); /* Keep button colors */
440
440
-
color: var(--button-text);
441
441
-
}
442
442
-
.dark-mode .verifier-tooltip-text {
443
443
-
background-color: var(--tooltip-bg-dark, #eee);
444
444
-
color: var(--tooltip-text-dark, #333);
445
445
-
}
446
446
-
.dark-mode .verifier-tooltip-text::after {
447
447
-
border-top-color: var(--tooltip-bg-dark, #eee); /* Match dark background */
355
355
+
color: var(--text-muted, #6c757d);
356
356
+
margin-top: -5px; /* Adjust to position nicely below header */
357
357
+
margin-bottom: 15px; /* Space before the list */
358
358
+
text-align: left;
448
359
}
449
360
450
361
.verifier-official-verifier-note {
···
714
714
715
715
<div className="verifier-section">
716
716
<div style={{display: 'flex', alignItems: 'center', marginBottom: '10px'}}>
717
717
-
<h2 style={{ display: 'inline-block', marginRight: '8px', marginBottom: 0, border: 'none', padding: 0 }}>Your Official Verifications</h2>
718
718
-
<div className="verifier-tooltip-container">
719
719
-
<span className="verifier-tooltip-icon">(?)</span>
720
720
-
<span className="verifier-tooltip-text">
721
721
-
{trustedVerifiersTooltip}
722
722
-
</span>
723
723
-
</div>
724
724
-
</div>
725
725
-
<div>
717
717
+
<h2 style={{ display: 'inline-block', marginRight: '0px', marginBottom: '0', border: 'none', padding: '0' }}>Your Official Verifications</h2>
718
718
+
</div>
719
719
+
<p className="verifier-section-description">
720
720
+
Checking if any of Bluesky's Trusted Verifiers have created a verification record for your username.
721
721
+
</p>
722
722
+
<div>
726
723
{TRUSTED_VERIFIERS.map(verifierId => {
727
724
const status = officialVerifiersStatus[verifierId] || 'idle';
728
725
let message = '...'; let icon = '⏳'; let statusClass = 'verifier-idle-status';
···
775
772
</div>
776
773
777
774
<div className="verifier-section">
775
775
+
<div className="verifier-list-header">
776
776
+
<h2>Accounts You've Verified</h2>
777
777
+
<button onClick={fetchVerifications} disabled={isAnyOperationInProgress} className="verifier-action-button verifier-refresh-button">Refresh List</button>
778
778
+
</div>
778
779
779
780
{revokeStatusMessage && (
780
781
<div className={`verifier-status-box ${revokeStatusMessage.includes('failed') ? 'verifier-status-box-error' : 'verifier-status-box-success'}`}>