Search interface for Tangled running on a Slice

language colors ✨

+1
.gitignore
··· 1 + node_modules
+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
··· 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
··· 3 3 const Layout = ({ 4 4 children, 5 5 head, 6 - title = "TANGLED://SEARCH_v1.2.1", 6 + title = "TANGLED://SEARCH_v1.3.0", 7 7 }: { 8 8 children: ComponentChildren; 9 9 head?: ComponentChildren;
+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
··· 23 23 TANGLED<span class="text-pink-400">.SH</span> 24 24 </h1> 25 25 <div class="text-green-400 text-xs sm:text-sm font-light"> 26 - REPO_SEARCH v1.2.1 // AT_PROTOCOL_INTERFACE 26 + REPO_SEARCH v1.3.0 // AT_PROTOCOL_INTERFACE 27 27 </div> 28 28 </div> 29 29
+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