···
1
1
+
// src/components/Resources/ResourceLoader.jsx
1
2
import React from 'react';
2
3
3
4
const ResourceLoader = () => {
···
1
1
/* src/components/Resources/Resources.css */
2
2
3
3
.resources-page {
4
4
+
margin: 20px auto 20px;
4
5
max-width: 1200px;
5
5
-
margin: 0 auto;
6
6
padding: 20px;
7
7
-
font-family: sans-serif;
7
7
+
}
8
8
+
9
9
+
.resources-page .alt-card {
10
10
+
text-align: left;
11
11
+
background: var(--navbar-bg);
12
12
+
border-radius: 12px;
13
13
+
border: 5px solid var(--card-border);
14
14
+
padding: 1.7rem;
15
15
+
transition: background-color 0.3s ease, border-color 0.3s ease;
8
16
}
9
17
10
18
.resources-header {
11
11
-
display: flex;
12
12
-
justify-content: space-between;
13
13
-
align-items: center;
14
14
-
margin-bottom: 20px;
19
19
+
margin-bottom: 1.5rem;
15
20
}
16
21
17
17
-
.resources-title h1 {
18
18
-
font-size: 2rem;
19
19
-
margin-bottom: 8px;
20
20
-
color: #0066cc;
22
22
+
.resources-header h1 {
23
23
+
font-size: 1.5rem;
24
24
+
font-weight: bold;
25
25
+
margin-bottom: 0.5rem;
26
26
+
color: var(--button-bg);
21
27
}
22
28
23
23
-
.resources-title p {
24
24
-
font-size: 1rem;
25
25
-
color: #666;
29
29
+
.resources-page ul {
30
30
+
list-style: none;
31
31
+
text-align: center;
32
32
+
margin: 0px auto;
33
33
+
padding: 0px;
34
34
+
width: 100%;
35
35
+
opacity: 0.5;
36
36
+
}
37
37
+
38
38
+
.resources-description {
39
39
+
color: var(--text);
40
40
+
line-height: 1.5;
41
41
+
opacity: 0.8;
42
42
+
transition: color 0.3s ease;
43
43
+
margin-top: 1rem;
44
44
+
}
45
45
+
46
46
+
.resources-disclaimer {
47
47
+
background-color: var(--card-border);
48
48
+
border-left: 4px solid #ffd700;
49
49
+
padding: 12px 16px;
50
50
+
margin-bottom: 24px;
51
51
+
border-radius: 4px;
52
52
+
}
53
53
+
54
54
+
.resources-disclaimer p {
26
55
margin: 0;
56
56
+
font-size: 0.9rem;
57
57
+
color: var(--text);
27
58
}
28
59
29
60
.share-button-container {
30
30
-
margin-left: 20px;
61
61
+
margin-top: 1rem;
31
62
}
32
63
33
64
.share-button {
34
34
-
background-color: #0066cc;
35
35
-
color: white;
65
65
+
background-color: var(--button-bg);
66
66
+
color: var(--button-text);
36
67
padding: 10px 16px;
37
68
border: none;
38
69
border-radius: 20px;
39
70
font-size: 0.9rem;
40
71
font-weight: 600;
41
72
cursor: pointer;
42
42
-
display: flex;
73
73
+
display: inline-flex;
43
74
align-items: center;
44
75
transition: background-color 0.3s ease;
45
76
}
46
77
47
78
.share-button:hover {
48
48
-
background-color: #0055aa;
49
49
-
}
50
50
-
51
51
-
.resources-disclaimer {
52
52
-
background-color: #f8f9fa;
53
53
-
border-left: 4px solid #ffd700;
54
54
-
padding: 12px 16px;
55
55
-
margin-bottom: 24px;
56
56
-
border-radius: 4px;
57
57
-
}
58
58
-
59
59
-
.resources-disclaimer p {
60
60
-
margin: 0;
61
61
-
font-size: 0.9rem;
62
62
-
color: #555;
79
79
+
opacity: 0.8;
63
80
}
64
81
65
82
.resources-filters {
···
74
91
width: 100%;
75
92
padding: 12px 16px;
76
93
font-size: 1rem;
77
77
-
border: 1px solid #ddd;
94
94
+
border: 1px solid var(--card-border);
78
95
border-radius: 8px;
79
96
box-sizing: border-box;
97
97
+
background-color: var(--navbar-bg);
98
98
+
color: var(--text);
99
99
+
transition: border-color 0.3s ease;
100
100
+
}
101
101
+
102
102
+
.search-input:focus {
103
103
+
border-color: var(--button-bg);
104
104
+
outline: none;
80
105
}
81
106
82
107
.filter-options {
···
94
119
}
95
120
96
121
.category-filter {
97
97
-
background-color: #f0f0f0;
122
122
+
background-color: var(--card-border);
123
123
+
color: var(--text);
98
124
border: none;
99
125
padding: 8px 16px;
100
126
border-radius: 16px;
···
104
130
}
105
131
106
132
.category-filter:hover {
107
107
-
background-color: #e0e0e0;
133
133
+
background: var(--button-bg);
134
134
+
color: var(--button-text);
108
135
}
109
136
110
137
.category-filter.active {
111
111
-
background-color: #0066cc;
112
112
-
color: white;
138
138
+
background: var(--button-bg);
139
139
+
color: var(--button-text);
113
140
}
114
141
115
142
.quality-select {
116
143
padding: 8px 16px;
117
117
-
border: 1px solid #ddd;
144
144
+
border: 1px solid var(--card-border);
118
145
border-radius: 8px;
119
146
font-size: 0.9rem;
147
147
+
background-color: var(--navbar-bg);
148
148
+
color: var(--text);
120
149
}
121
150
122
151
.featured-section,
···
126
155
127
156
.featured-section h2,
128
157
.all-resources-section h2 {
129
129
-
font-size: 1.5rem;
158
158
+
font-size: 1.3rem;
130
159
margin-bottom: 16px;
131
131
-
color: #333;
132
132
-
border-bottom: 2px solid #eee;
160
160
+
color: var(--button-bg);
161
161
+
border-bottom: 2px solid var(--card-border);
133
162
padding-bottom: 8px;
134
163
}
135
164
···
140
169
}
141
170
142
171
.resource-card {
143
143
-
border: 1px solid #eee;
172
172
+
border: 1px solid var(--card-border);
144
173
border-radius: 8px;
145
174
overflow: hidden;
146
175
transition: transform 0.2s ease, box-shadow 0.2s ease;
147
176
text-decoration: none;
148
177
color: inherit;
149
149
-
background-color: white;
178
178
+
background-color: var(--navbar-bg);
150
179
height: 100%;
151
180
display: flex;
152
181
flex-direction: column;
···
155
184
.resource-card:hover {
156
185
transform: translateY(-4px);
157
186
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
187
187
+
background-color: var(--card-border);
158
188
}
159
189
160
190
.resource-content {
···
167
197
.resource-name {
168
198
font-size: 1.1rem;
169
199
margin: 0 0 8px 0;
170
170
-
color: #0066cc;
200
200
+
color: var(--button-bg);
171
201
}
172
202
173
203
.resource-description {
174
204
font-size: 0.9rem;
175
175
-
color: #555;
205
205
+
color: var(--text);
176
206
margin: 0 0 16px 0;
177
207
flex-grow: 1;
208
208
+
opacity: 0.8;
178
209
}
179
210
180
211
.resource-meta {
···
186
217
187
218
.resource-category {
188
219
font-size: 0.8rem;
189
189
-
background-color: #f0f0f0;
220
220
+
background-color: var(--card-border);
190
221
padding: 4px 8px;
191
222
border-radius: 4px;
192
192
-
color: #666;
223
223
+
color: var(--text);
193
224
}
194
225
195
226
.resource-quality {
···
206
237
}
207
238
208
239
.quality-star.empty {
209
209
-
color: #ddd;
240
240
+
color: var(--card-border);
210
241
}
211
242
212
243
.no-results {
213
244
text-align: center;
214
245
padding: 40px;
215
215
-
color: #666;
246
246
+
color: var(--text);
247
247
+
opacity: 0.7;
216
248
}
217
249
218
250
/* Resource Loader */
···
226
258
}
227
259
228
260
.loader-spinner {
229
229
-
border: 4px solid rgba(0, 0, 0, 0.1);
230
230
-
border-left-color: #0066cc;
261
261
+
border: 4px solid var(--card-border);
262
262
+
border-left-color: var(--button-bg);
231
263
border-radius: 50%;
232
264
width: 40px;
233
265
height: 40px;
234
266
animation: spin 1s linear infinite;
235
267
margin-bottom: 16px;
268
268
+
transition: border-color 0.3s ease;
269
269
+
}
270
270
+
271
271
+
.resource-loader p {
272
272
+
color: var(--text);
273
273
+
opacity: 0.8;
236
274
}
237
275
238
276
@keyframes spin {
···
242
280
243
281
/* Responsive adjustments */
244
282
@media (max-width: 768px) {
283
283
+
.resources-page {
284
284
+
padding: 10px;
285
285
+
}
286
286
+
287
287
+
.resources-page .alt-card {
288
288
+
padding: 1rem;
289
289
+
}
290
290
+
245
291
.resources-header {
246
292
flex-direction: column;
247
293
align-items: flex-start;
248
294
}
249
295
250
296
.share-button-container {
251
251
-
margin: 16px 0 0 0;
297
297
+
margin-top: 16px;
252
298
}
253
299
254
300
.filter-options {
···
256
302
align-items: flex-start;
257
303
}
258
304
305
305
+
.category-filters {
306
306
+
margin-bottom: 12px;
307
307
+
width: 100%;
308
308
+
justify-content: flex-start;
309
309
+
}
310
310
+
259
311
.quality-filter {
260
312
width: 100%;
261
261
-
margin-top: 12px;
262
313
}
263
314
264
315
.quality-select {
···
266
317
}
267
318
268
319
.resources-grid {
269
269
-
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
320
320
+
grid-template-columns: 1fr;
321
321
+
}
322
322
+
}
323
323
+
324
324
+
@media (max-width: 480px) {
325
325
+
.resources-page {
326
326
+
max-width: 100%;
327
327
+
}
328
328
+
329
329
+
.category-filters {
330
330
+
display: flex;
331
331
+
flex-wrap: wrap;
332
332
+
}
333
333
+
334
334
+
.category-filter {
335
335
+
margin-bottom: 8px;
336
336
+
width: calc(50% - 8px);
337
337
+
text-align: center;
270
338
}
271
339
}
···
349
349
return (
350
350
<>
351
351
<main className="resources-page">
352
352
+
<div className="alt-card">
352
353
<div className="resources-header">
353
353
-
<div className="resources-title">
354
354
-
<h1>Bluesky Resources</h1>
355
355
-
<p>A curated collection of third-party tools, services, and guides for the Bluesky ecosystem</p>
356
356
-
</div>
354
354
+
<h1>Bluesky Resources</h1>
355
355
+
<ul>
356
356
+
<li>Find tools to enhance your Bluesky experience.</li>
357
357
+
<li>Discover analytics, feeds, clients, and more.</li>
358
358
+
<li>Explore community-built solutions.</li>
359
359
+
</ul>
360
360
+
<p className="resources-description">A curated collection of third-party tools, services, and guides for the Bluesky ecosystem</p>
357
361
358
362
<div className="share-button-container">
359
363
<button
···
441
445
</div>
442
446
</>
443
447
)}
448
448
+
</div>
444
449
</main>
445
450
</>
446
451
);