+1
.gitignore
+1
.gitignore
···
1
+
node_modules
+3
-1
deno.json
+3
-1
deno.json
···
1
1
{
2
2
"imports": {
3
+
"github-colors": "npm:github-colors@^2.2.21",
3
4
"preact": "npm:preact@^10.27.1",
4
5
"preact-render-to-string": "npm:preact-render-to-string@^6.6.1",
5
6
"@takumi-rs/helpers": "npm:@takumi-rs/helpers@^0.29.8",
···
12
13
"compilerOptions": {
13
14
"jsx": "react-jsx",
14
15
"jsxImportSource": "preact"
15
-
}
16
+
},
17
+
"nodeModulesDir": "auto"
16
18
}
+229
-1
deno.lock
+229
-1
deno.lock
···
9
9
"npm:@types/node@*": "22.15.15",
10
10
"npm:@vercel/og@~0.6.2": "0.6.8",
11
11
"npm:@vercel/og@~0.8.5": "0.8.5",
12
+
"npm:github-colors@^2.2.21": "2.2.21",
12
13
"npm:preact-render-to-string@^6.6.1": "6.6.1_preact@10.27.1",
13
14
"npm:preact@^10.27.1": "10.27.1",
14
15
"npm:satori@~0.10.14": "0.10.14",
···
182
183
"satori@0.16.0"
183
184
]
184
185
},
186
+
"add-subtract-date@1.0.16": {
187
+
"integrity": "sha512-pmGFYgOmVhZ7R47PB/h/BLt/f77rVZL3WXvxSUWKSd6RTe7lHu7ZalQUYWJ2RXNIuv9KKZjstyuKnNQqbqtoGw=="
188
+
},
189
+
"ansi-parser@3.2.11": {
190
+
"integrity": "sha512-HeEwCVf/pI9qQUVaTkoDBl9U/QU4RvWJ+Trg1jNSNvDzFsBAId6fHv6VLiC7HzwrOiL8uOEkO5T1eTgpnTFQfQ=="
191
+
},
192
+
"ansi-styles@3.2.1": {
193
+
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
194
+
"dependencies": [
195
+
"color-convert"
196
+
]
197
+
},
198
+
"ansy@1.0.16": {
199
+
"integrity": "sha512-9heIA517JMByr2usiEiobYDJSN71ikQgcFucf4mp4THZG2ZQHNQJjzJIICB1m5JOy3s66HZHTZ5nTHDoliLI9A==",
200
+
"dependencies": [
201
+
"ansi-styles",
202
+
"custom-return",
203
+
"supports-color",
204
+
"ul"
205
+
]
206
+
},
207
+
"argparse@1.0.10": {
208
+
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
209
+
"dependencies": [
210
+
"sprintf-js"
211
+
]
212
+
},
213
+
"assured@1.0.16": {
214
+
"integrity": "sha512-KwttBV8EIJw4/KqRFTJzKELLm9c3d1V9+fefORWv8cJNgKouuCRQ5rvCgjpBwA1AxVwqpR5Y1ePLU5SINJzhQg==",
215
+
"dependencies": [
216
+
"noop6",
217
+
"sliced"
218
+
]
219
+
},
185
220
"base64-js@0.0.8": {
186
221
"integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw=="
187
222
},
223
+
"bug-killer@4.4.4": {
224
+
"integrity": "sha512-O/iJPwIf0Igra3q91s+jGeYhUSdtFUtBMb1JMwvAZLS0We1mIdEuDM4FCjbxFQAF+R6GqpRVgHVQa0utQQxSEA==",
225
+
"dependencies": [
226
+
"ansi-parser",
227
+
"couleurs",
228
+
"daty",
229
+
"deffy",
230
+
"typpy"
231
+
]
232
+
},
188
233
"camelize@1.0.1": {
189
234
"integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ=="
190
235
},
236
+
"class-methods@1.0.13": {
237
+
"integrity": "sha512-iaTvwkDnvbatOhvhCCPe6MKldhbjMPR2pmtet2HrNfYB/5tclL45bPSqEYV1itC7jIlpQsEAT0qK1x0Ym1Zc8Q==",
238
+
"dependencies": [
239
+
"exclude-arr",
240
+
"static-methods",
241
+
"ul"
242
+
]
243
+
},
244
+
"color-convert@1.9.3": {
245
+
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
246
+
"dependencies": [
247
+
"color-name@1.1.3"
248
+
]
249
+
},
250
+
"color-name@1.1.3": {
251
+
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
252
+
},
191
253
"color-name@1.1.4": {
192
254
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
255
+
},
256
+
"couleurs@6.0.12": {
257
+
"integrity": "sha512-3SzCoWk+IWpReIhdrPnFCsjOQq1CyZ1OHWVTlFq/HR94tK6tEzNSbUycYCEhg+ywnznhFACad+YbGAHGmKzeOQ==",
258
+
"dependencies": [
259
+
"ansy",
260
+
"color-convert",
261
+
"iterate-object",
262
+
"typpy"
263
+
]
193
264
},
194
265
"css-background-parser@0.1.0": {
195
266
"integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA=="
···
214
285
"postcss-value-parser"
215
286
]
216
287
},
288
+
"custom-return@1.0.13": {
289
+
"integrity": "sha512-28xNk/Ek+zEhP5grGiNm9+npFJzqhwULzNcBSx4Osh4iuvczTLQqKB7cZoyNql/hpuuWyWBzbeY2+uCH0Qv7UA==",
290
+
"dependencies": [
291
+
"noop6"
292
+
]
293
+
},
294
+
"date-unit-ms@1.1.15": {
295
+
"integrity": "sha512-udyntpYTFNZPX0JiFCWtrzkPM8WEBV4SGfSXYwZUCRxxBVs/jNYkS+zpiyk3ICGwG9GfZeh4WYOd1hDbyKzOLw=="
296
+
},
297
+
"daty@1.2.2": {
298
+
"integrity": "sha512-2Ax1006BgHLtksGfjcMqf9nyEehrQ5j4UZm3mSgpVlscAVmjpGXUSunVSYSC1yeGjiDwx3HkWY49UfLV2q5smQ==",
299
+
"dependencies": [
300
+
"add-subtract-date",
301
+
"class-methods",
302
+
"date-unit-ms",
303
+
"diff-dates",
304
+
"formatoid"
305
+
]
306
+
},
307
+
"days@1.1.1": {
308
+
"integrity": "sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw=="
309
+
},
310
+
"deffy@2.2.5": {
311
+
"integrity": "sha512-6TX2cfIo97eKqWmqgMDAUulCwnveAe3K+4VGsTGPJsL3NtSEnSBFZ3sUXdS4EBhZ8GbdaZBzXQ04ton18dJrug==",
312
+
"dependencies": [
313
+
"typpy"
314
+
]
315
+
},
316
+
"diff-dates@1.0.15": {
317
+
"integrity": "sha512-tmM/uyu+nFMJbrh9E9HSzqwteVJmSYwXNkCKjavW24kXvbjVQGRpcQzp1EgkJzqUYragRUZsnAXaIVaX5zw7Yw==",
318
+
"dependencies": [
319
+
"date-unit-ms"
320
+
]
321
+
},
217
322
"emoji-regex-xs@2.0.1": {
218
323
"integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g=="
219
324
},
···
223
328
"escape-html@1.0.3": {
224
329
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
225
330
},
331
+
"esprima@4.0.1": {
332
+
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
333
+
"bin": true
334
+
},
335
+
"exclude-arr@1.0.12": {
336
+
"integrity": "sha512-uvWXnvXIej85g/JQYdH/IziIfiIa8g3MegneWe92JXERRl7yEDm2ptzUfN80sdHJnsarmXvwv2wFl3rmVeMEvA=="
337
+
},
226
338
"fflate@0.7.4": {
227
339
"integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw=="
228
340
},
341
+
"fillo@1.0.15": {
342
+
"integrity": "sha512-AU9+1s5J2halrmGGe9On+a8TXfbaXsY9JLz/sxPsmcISaqcGn0M9Pt6cQzKPesqdzQdSQ08JJHH5RZR9HdF2Jw=="
343
+
},
344
+
"follow-redirects@1.15.11": {
345
+
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="
346
+
},
347
+
"formatoid@1.2.5": {
348
+
"integrity": "sha512-ADuqDTwrQd0800jF0G6tL3mWwO8aGStjypqvrwkhTnoQc2fD1hc9reGtrMiRmWK7ti1n2NUfy+6WKfJ+AJUsvA==",
349
+
"dependencies": [
350
+
"days",
351
+
"fillo",
352
+
"months",
353
+
"parse-it"
354
+
]
355
+
},
356
+
"function.name@1.0.14": {
357
+
"integrity": "sha512-s99L814NRuLxwF2sJMIcLhkQhueGXb3oKyvorzrUKKwlVB0SBbWrgZt4+EwKAo3ujCXnT7vshmCvXgZA09kCMw==",
358
+
"dependencies": [
359
+
"noop6"
360
+
]
361
+
},
362
+
"github-colors@2.2.21": {
363
+
"integrity": "sha512-afkYdtO1VsMV9mHky+Td3CqIUDHpu0o2ztIJcW1cc7niPi0N9PwMG6MjaPjKp4kYKUL1Qnj/b6L6DQbNIe953Q==",
364
+
"dependencies": [
365
+
"bug-killer",
366
+
"js-yaml",
367
+
"streamp",
368
+
"tinyreq",
369
+
"ul"
370
+
],
371
+
"scripts": true
372
+
},
373
+
"has-flag@1.0.0": {
374
+
"integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA=="
375
+
},
229
376
"hex-rgb@4.3.0": {
230
377
"integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw=="
231
378
},
379
+
"iterate-object@1.3.5": {
380
+
"integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A=="
381
+
},
382
+
"js-yaml@3.14.1": {
383
+
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
384
+
"dependencies": [
385
+
"argparse",
386
+
"esprima"
387
+
],
388
+
"bin": true
389
+
},
232
390
"linebreak@1.1.0": {
233
391
"integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
234
392
"dependencies": [
···
236
394
"unicode-trie"
237
395
]
238
396
},
397
+
"minimist@1.2.8": {
398
+
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
399
+
},
400
+
"mkdirp@0.5.6": {
401
+
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
402
+
"dependencies": [
403
+
"minimist"
404
+
],
405
+
"bin": true
406
+
},
407
+
"months@1.2.0": {
408
+
"integrity": "sha512-zFM7hUpziSYGk2DNObYGWgHdRRxAOgjl8CC1Rbl50p/q0rGDsREfk0nbxxmSIquVi/lEAuUY8nwbwkZ8biNCOQ=="
409
+
},
410
+
"noop6@1.0.10": {
411
+
"integrity": "sha512-WZvuCILZFZHK+WuqCQwxLBGllkBK1ct8s8Mu9FMDbEsBE6/bqNxyFGbX7Xky+6bYFL8X2Ou4Cis4CJyrwXLvQA=="
412
+
},
239
413
"pako@0.2.9": {
240
414
"integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
241
415
},
242
416
"parse-css-color@0.2.1": {
243
417
"integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==",
244
418
"dependencies": [
245
-
"color-name",
419
+
"color-name@1.1.4",
246
420
"hex-rgb"
247
421
]
248
422
},
423
+
"parse-it@1.0.11": {
424
+
"integrity": "sha512-1OWDPQNF7eUxkqPdP4vFu96QnVwQjy2zag5CZcF3Ipd12s1iu8nPpgNBsda0tgZlj04vSrIZ5DQr2bqp5Cn6UQ==",
425
+
"dependencies": [
426
+
"regex-escape"
427
+
]
428
+
},
249
429
"postcss-value-parser@4.2.0": {
250
430
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
251
431
},
···
257
437
},
258
438
"preact@10.27.1": {
259
439
"integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ=="
440
+
},
441
+
"regex-escape@3.4.11": {
442
+
"integrity": "sha512-051l4Hl/0HoJwTvNztrWVjoxLiseSfCrDgWqwR1cnGM/nyQSeIjmvti5zZ7HzOmsXDPaJ2k0iFxQ6/WNpJD5wQ=="
260
443
},
261
444
"satori@0.10.14": {
262
445
"integrity": "sha512-abovcqmwl97WKioxpkfuMeZmndB1TuDFY/R+FymrZyiGP+pMYomvgSzVPnbNMWHHESOPosVHGL352oFbdAnJcA==",
···
321
504
"yoga-layout"
322
505
]
323
506
},
507
+
"sliced@1.0.1": {
508
+
"integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="
509
+
},
510
+
"sprintf-js@1.0.3": {
511
+
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
512
+
},
513
+
"static-methods@1.0.13": {
514
+
"integrity": "sha512-EFiLdwFlgLQuRib6tFOg63H2RcVG2pWIh1/Xm9BtJeHSgcndYFmlDh60XzgUXsrSw/CvWzRTw4RwP7I/4U5Yng=="
515
+
},
516
+
"streamp@2.2.9": {
517
+
"integrity": "sha512-O9sQ0Xhca952frhlM84JEGc9a3IuBFcpsv/PemwBAzSo9Lpq9GpYUwOHVZrmda/tklqqV5hEqKp9XmN3wWpIIw==",
518
+
"dependencies": [
519
+
"mkdirp",
520
+
"ul"
521
+
]
522
+
},
324
523
"string.prototype.codepointat@0.2.1": {
325
524
"integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
326
525
},
526
+
"supports-color@3.2.3": {
527
+
"integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
528
+
"dependencies": [
529
+
"has-flag"
530
+
]
531
+
},
327
532
"tiny-inflate@1.0.3": {
328
533
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
534
+
},
535
+
"tinyreq@3.4.3": {
536
+
"integrity": "sha512-28nKVsWONtEPo0Tlo0cZ24nuLTtcgPKY+89F++cFGXJDhR5GSQ2kThVTIJQ3I8kutxaPCQg5FsDNf8ZSz3dZTg==",
537
+
"dependencies": [
538
+
"assured",
539
+
"follow-redirects",
540
+
"noop6",
541
+
"ul"
542
+
]
543
+
},
544
+
"typpy@2.4.0": {
545
+
"integrity": "sha512-a16Uv5doNtvHzaG4wZCHmXN+l9xxmTMpyODtPz7B3DSTsDVNXilTSJGuNw68sUh0Un4bf+ghRMbEcJCI6r06mQ==",
546
+
"dependencies": [
547
+
"function.name"
548
+
]
549
+
},
550
+
"ul@5.2.16": {
551
+
"integrity": "sha512-v1YrSEsJZpJsywzF/MKgsQwMdOwBlwwmNiUOJh/yX6FHrq7dYjeua1YOhLV0q0KioqEFZC4P7MsKmpEsGdZz3w==",
552
+
"dependencies": [
553
+
"deffy",
554
+
"typpy"
555
+
]
329
556
},
330
557
"undici-types@6.21.0": {
331
558
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
···
359
586
"dependencies": [
360
587
"npm:@takumi-rs/core@~0.29.8",
361
588
"npm:@takumi-rs/helpers@~0.29.8",
589
+
"npm:github-colors@^2.2.21",
362
590
"npm:preact-render-to-string@^6.6.1",
363
591
"npm:preact@^10.27.1"
364
592
]
+1
-1
src/components/Layout.tsx
+1
-1
src/components/Layout.tsx
+83
src/components/RepoCard.tsx
+83
src/components/RepoCard.tsx
···
1
+
import githubColors from "github-colors";
2
+
3
+
interface Language {
4
+
name: string;
5
+
percentage: number;
6
+
size: number;
7
+
}
8
+
1
9
interface RepoCardProps {
2
10
repoName: string;
3
11
ownerHandle: string;
···
5
13
starCount: number;
6
14
createdAt: string;
7
15
avatarSrc?: string;
16
+
languages?: Language[];
8
17
}
9
18
10
19
const RepoCard = ({
···
14
23
starCount,
15
24
createdAt,
16
25
avatarSrc,
26
+
languages,
17
27
}: RepoCardProps) => (
18
28
<div
19
29
style={{
···
123
133
>
124
134
{description || "NO_DESCRIPTION_AVAILABLE"}
125
135
</div>
136
+
137
+
{/* Language breakdown */}
138
+
{languages && languages.length > 0 && (
139
+
<div style={{ marginBottom: "24px", display: "flex", flexDirection: "column" }}>
140
+
<div
141
+
style={{
142
+
fontSize: "12px",
143
+
color: "#06b6d4",
144
+
textTransform: "uppercase",
145
+
letterSpacing: "1px",
146
+
marginBottom: "8px",
147
+
display: "flex",
148
+
}}
149
+
>
150
+
LANGUAGE_BREAKDOWN
151
+
</div>
152
+
153
+
{/* Language bar */}
154
+
<div
155
+
style={{
156
+
display: "flex",
157
+
height: "8px",
158
+
backgroundColor: "#111111",
159
+
borderRadius: "4px",
160
+
overflow: "hidden",
161
+
marginBottom: "12px",
162
+
}}
163
+
>
164
+
{languages.map((lang) => (
165
+
<div
166
+
style={{
167
+
width: `${lang.percentage}%`,
168
+
backgroundColor: githubColors.get(lang.name)?.color || "#888888",
169
+
height: "100%",
170
+
}}
171
+
/>
172
+
))}
173
+
</div>
174
+
175
+
{/* Language legend */}
176
+
<div
177
+
style={{
178
+
display: "flex",
179
+
flexWrap: "wrap",
180
+
gap: "12px",
181
+
}}
182
+
>
183
+
{languages.map((lang) => (
184
+
<div
185
+
style={{
186
+
display: "flex",
187
+
alignItems: "center",
188
+
gap: "6px",
189
+
fontSize: "12px",
190
+
}}
191
+
>
192
+
<div
193
+
style={{
194
+
width: "10px",
195
+
height: "10px",
196
+
borderRadius: "2px",
197
+
backgroundColor: githubColors.get(lang.name)?.color || "#888888",
198
+
}}
199
+
/>
200
+
<span style={{ color: "#94a3b8", display: "flex", gap: "8px" }}>
201
+
<span>{lang.name}</span>
202
+
<span>{lang.percentage.toFixed(1)}%</span>
203
+
</span>
204
+
</div>
205
+
))}
206
+
</div>
207
+
</div>
208
+
)}
126
209
127
210
{/* Footer with star count and date */}
128
211
<div
+1
-1
src/components/SearchPage.tsx
+1
-1
src/components/SearchPage.tsx
+20
src/main.tsx
+20
src/main.tsx
···
288
288
console.error("Error fetching star count:", error);
289
289
}
290
290
291
+
// Fetch language data from knot API
292
+
let languages: Array<{ name: string; percentage: number; size: number }> =
293
+
[];
294
+
if (repoRecord.value.knot) {
295
+
try {
296
+
const languageResponse = await fetch(
297
+
`https://${repoRecord.value.knot}/xrpc/sh.tangled.repo.languages?repo=${repoRecord.did}/${repoRecord.value.name}`
298
+
);
299
+
if (languageResponse.ok) {
300
+
const languageData = await languageResponse.json();
301
+
languages = languageData.languages || [];
302
+
// Sort languages by percentage descending
303
+
languages.sort((a, b) => b.percentage - a.percentage);
304
+
}
305
+
} catch (error) {
306
+
console.error("Error fetching language data:", error);
307
+
}
308
+
}
309
+
291
310
// Set up fonts for Takumi (including emoji font)
292
311
const [fontBuffer, emojiFontBuffer] = await Promise.all([
293
312
fetch(
···
361
380
starCount={starCount}
362
381
createdAt={repoRecord.value.createdAt}
363
382
avatarSrc={avatarSrc}
383
+
languages={languages}
364
384
/>
365
385
);
366
386