csr tangled client in solid-js
15

Configure Feed

Select the types of activity you want to include in your feed.

fix language bar details and colors

dawn (May 20, 2026, 8:34 PM +0300) c2db0cba 0a6ebf6b

+830 -110
+6 -1
src/index.css
··· 774 774 775 775 .untangled-language-bar { 776 776 display: flex; 777 + gap: 1px; 777 778 height: 1rem; 778 779 overflow: hidden; 780 + padding: 0; 779 781 border-radius: 0.25rem 0.25rem 0 0; 780 782 transform: scaleY(0.5); 781 783 transform-origin: top; 782 - margin-bottom: -0.5rem; 783 784 transition: transform 150ms; 784 785 cursor: pointer; 785 786 list-style: none; ··· 787 788 788 789 .untangled-language-bar::-webkit-details-marker { 789 790 display: none; 791 + } 792 + 793 + .untangled-language-bar::marker { 794 + content: ''; 790 795 } 791 796 792 797 .untangled-language-bar:hover,
+759
src/lib/language-colors.ts
··· 1 + // Generated from github.com/go-enry/go-enry/v2 v2.9.6 data/colors.go and data/groups.go. 2 + // Source linguist commit: 537297cdae3ab05f8d5dd1c03627a5bd73707b19. 3 + 4 + export const ENRY_LANGUAGE_COLOR_FALLBACK = '#cccccc'; 5 + 6 + export const ENRY_LANGUAGE_COLORS: Record<string, string> = { 7 + '1c enterprise': '#814CCC', 8 + '2-dimensional array': '#38761D', 9 + '4d': '#004289', 10 + 'abap': '#E8274B', 11 + 'abap cds': '#555e25', 12 + 'ags script': '#B9D9FF', 13 + 'aidl': '#34EB6B', 14 + 'al': '#3AA2B5', 15 + 'algol': '#D1E0DB', 16 + 'ampl': '#E6EFBB', 17 + 'antlr': '#9DC3FF', 18 + 'api blueprint': '#2ACCA8', 19 + 'apl': '#5A8164', 20 + 'asp.net': '#9400ff', 21 + 'ats': '#1ac620', 22 + 'actionscript': '#882B0F', 23 + 'ada': '#02f88c', 24 + 'adblock filter list': '#800000', 25 + 'adobe font metrics': '#fa0f00', 26 + 'agda': '#315665', 27 + 'aiken': '#640ff8', 28 + 'alloy': '#64C800', 29 + 'alpine abuild': '#0D597F', 30 + 'altium designer': '#A89663', 31 + 'angelscript': '#C7D7DC', 32 + 'answer set programming': '#A9CC29', 33 + 'ant build system': '#A9157E', 34 + 'antlers': '#ff269e', 35 + 'apacheconf': '#d12127', 36 + 'apex': '#1797c0', 37 + 'apollo guidance computer': '#0B3D91', 38 + 'applescript': '#101F1F', 39 + 'arc': '#aa2afe', 40 + 'asciidoc': '#73a0c5', 41 + 'aspectj': '#a957b0', 42 + 'assembly': '#6E4C13', 43 + 'astro': '#ff5a03', 44 + 'asymptote': '#ff0000', 45 + 'augeas': '#9CC134', 46 + 'autohotkey': '#6594b9', 47 + 'autoit': '#1C3552', 48 + 'avro idl': '#0040FF', 49 + 'awk': '#c30e9b', 50 + 'b (formal method)': '#8aa8c5', 51 + 'b4x': '#00e4ff', 52 + 'basic': '#ff0000', 53 + 'bqn': '#2b7067', 54 + 'ballerina': '#FF5000', 55 + 'batchfile': '#C1F12E', 56 + 'beef': '#a52f4e', 57 + 'berry': '#15A13C', 58 + 'bibtex': '#778899', 59 + 'bicep': '#519aba', 60 + 'bikeshed': '#5562ac', 61 + 'bison': '#6A463F', 62 + 'bitbake': '#00bce4', 63 + 'blade': '#f7523f', 64 + 'blitzbasic': '#00FFAE', 65 + 'blitzmax': '#cd6400', 66 + 'bluespec': '#12223c', 67 + 'bluespec bh': '#12223c', 68 + 'boo': '#d4bec1', 69 + 'boogie': '#c80fa0', 70 + 'brainfuck': '#2F2530', 71 + 'brighterscript': '#66AABB', 72 + 'brightscript': '#662D91', 73 + 'browserslist': '#ffd539', 74 + 'bru': '#F4AA41', 75 + 'buildstream': '#006bff', 76 + 'c': '#555555', 77 + 'c#': '#178600', 78 + 'c++': '#f34b7d', 79 + 'c3': '#2563eb', 80 + 'cap cds': '#0092d1', 81 + 'clips': '#00A300', 82 + 'cmake': '#DA3434', 83 + 'collada': '#F1A42B', 84 + 'cql': '#006091', 85 + 'cson': '#244776', 86 + 'css': '#663399', 87 + 'csv': '#237346', 88 + 'cue': '#5886E1', 89 + 'cweb': '#00007a', 90 + 'cabal config': '#483465', 91 + 'caddyfile': '#22b638', 92 + 'cadence': '#00ef8b', 93 + 'cairo': '#ff4a48', 94 + 'cairo zero': '#ff4a48', 95 + 'cameligo': '#3be133', 96 + 'cangjie': '#00868B', 97 + 'cap\'n proto': '#c42727', 98 + 'carbon': '#222222', 99 + 'ceylon': '#dfa535', 100 + 'chapel': '#8dc63f', 101 + 'chuck': '#3f8000', 102 + 'circom': '#707575', 103 + 'cirru': '#ccccff', 104 + 'clarion': '#db901e', 105 + 'clarity': '#5546ff', 106 + 'classic asp': '#6a40fd', 107 + 'clean': '#3F85AF', 108 + 'click': '#E4E6F3', 109 + 'clojure': '#db5855', 110 + 'closure templates': '#0d948f', 111 + 'cloud firestore security rules': '#FFA000', 112 + 'clue': '#0009b5', 113 + 'codeql': '#140f46', 114 + 'coffeescript': '#244776', 115 + 'coldfusion': '#ed2cd6', 116 + 'coldfusion cfc': '#ed2cd6', 117 + 'common lisp': '#3fb68b', 118 + 'common workflow language': '#B5314C', 119 + 'component pascal': '#B0CE4E', 120 + 'cooklang': '#E15A29', 121 + 'crystal': '#000100', 122 + 'csound': '#1a1a1a', 123 + 'csound document': '#1a1a1a', 124 + 'csound score': '#1a1a1a', 125 + 'cuda': '#3A4E3A', 126 + 'curry': '#531242', 127 + 'cylc': '#00b3fd', 128 + 'cypher': '#34c0eb', 129 + 'cython': '#fedf5b', 130 + 'd': '#ba595e', 131 + 'd2': '#526ee8', 132 + 'dm': '#447265', 133 + 'dafny': '#FFEC25', 134 + 'darcs patch': '#8eff23', 135 + 'dart': '#00B4AB', 136 + 'daslang': '#d3d3d3', 137 + 'dataweave': '#003a52', 138 + 'debian package control file': '#D70751', 139 + 'denizenscript': '#FBEE96', 140 + 'dhall': '#dfafff', 141 + 'directx 3d file': '#aace60', 142 + 'dockerfile': '#384d54', 143 + 'dogescript': '#cca760', 144 + 'dotenv': '#e5d559', 145 + 'dune': '#89421e', 146 + 'dylan': '#6c616e', 147 + 'e': '#ccce35', 148 + 'ecl': '#8a1267', 149 + 'eclipse': '#001d9d', 150 + 'ejs': '#a91e50', 151 + 'eq': '#a78649', 152 + 'earthly': '#2af0ff', 153 + 'easybuild': '#069406', 154 + 'ecere projects': '#913960', 155 + 'ecmarkup': '#eb8131', 156 + 'edge': '#0dffe0', 157 + 'edgeql': '#31A7FF', 158 + 'editorconfig': '#fff1f2', 159 + 'eiffel': '#4d6977', 160 + 'elixir': '#6e4a7e', 161 + 'elm': '#60B5CC', 162 + 'elvish': '#55BB55', 163 + 'elvish transcript': '#55BB55', 164 + 'emacs lisp': '#c065db', 165 + 'emberscript': '#FFF4F3', 166 + 'erlang': '#B83998', 167 + 'euphoria': '#FF790B', 168 + 'f#': '#b845fc', 169 + 'f*': '#572e30', 170 + 'figlet font': '#FFDDBB', 171 + 'firrtl': '#2f632f', 172 + 'flux': '#88ccff', 173 + 'factor': '#636746', 174 + 'fancy': '#7b9db4', 175 + 'fantom': '#14253c', 176 + 'faust': '#c37240', 177 + 'fennel': '#fff3d7', 178 + 'filebench wml': '#F6B900', 179 + 'flatbuffers': '#ed284a', 180 + 'flix': '#d44a45', 181 + 'fluent': '#ffcc33', 182 + 'forth': '#341708', 183 + 'fortran': '#4d41b1', 184 + 'fortran free form': '#4d41b1', 185 + 'freebasic': '#141AC9', 186 + 'freemarker': '#0050b2', 187 + 'frege': '#00cafe', 188 + 'futhark': '#5f021f', 189 + 'g-code': '#D08CF2', 190 + 'gaml': '#FFC766', 191 + 'gams': '#f49a22', 192 + 'gap': '#0000cc', 193 + 'gcc machine description': '#FFCFAB', 194 + 'gdscript': '#355570', 195 + 'gdshader': '#478CBF', 196 + 'gedcom': '#003058', 197 + 'glsl': '#5686a5', 198 + 'gsc': '#FF6800', 199 + 'game maker language': '#71b417', 200 + 'gemfile.lock': '#701516', 201 + 'gemini': '#ff6900', 202 + 'genero 4gl': '#63408e', 203 + 'genero per': '#d8df39', 204 + 'genie': '#fb855d', 205 + 'genshi': '#951531', 206 + 'gentoo ebuild': '#9400ff', 207 + 'gentoo eclass': '#9400ff', 208 + 'gerber image': '#d20b00', 209 + 'gherkin': '#5B2063', 210 + 'git attributes': '#F44D27', 211 + 'git commit': '#F44D27', 212 + 'git config': '#F44D27', 213 + 'git revision list': '#F44D27', 214 + 'gleam': '#ffaff3', 215 + 'glimmer js': '#F5835F', 216 + 'glimmer ts': '#3178c6', 217 + 'glyph': '#c1ac7f', 218 + 'gnuplot': '#f0a9f0', 219 + 'go': '#00ADD8', 220 + 'go checksums': '#00ADD8', 221 + 'go module': '#00ADD8', 222 + 'go template': '#00ADD8', 223 + 'go workspace': '#00ADD8', 224 + 'godot resource': '#355570', 225 + 'golo': '#88562A', 226 + 'gosu': '#82937f', 227 + 'grace': '#615f8b', 228 + 'gradle': '#02303a', 229 + 'gradle kotlin dsl': '#02303a', 230 + 'grammatical framework': '#ff0000', 231 + 'graphql': '#e10098', 232 + 'graphviz (dot)': '#2596be', 233 + 'groovy': '#4298b8', 234 + 'groovy server pages': '#4298b8', 235 + 'haproxy': '#106da9', 236 + 'hcl': '#844FBA', 237 + 'hip': '#4F3A4F', 238 + 'hlsl': '#aace60', 239 + 'hocon': '#9ff8ee', 240 + 'html': '#e34c26', 241 + 'html+ecr': '#2e1052', 242 + 'html+eex': '#6e4a7e', 243 + 'html+erb': '#701516', 244 + 'html+php': '#4f5d95', 245 + 'html+razor': '#512be4', 246 + 'http': '#005C9C', 247 + 'hxml': '#f68712', 248 + 'hack': '#878787', 249 + 'haml': '#ece2a9', 250 + 'handlebars': '#f7931e', 251 + 'harbour': '#0e60e3', 252 + 'hare': '#9d7424', 253 + 'haskell': '#5e5086', 254 + 'haxe': '#df7900', 255 + 'hiveql': '#dce200', 256 + 'holyc': '#ffefaf', 257 + 'hosts file': '#308888', 258 + 'hurl': '#FF0288', 259 + 'hy': '#7790B2', 260 + 'idl': '#a3522f', 261 + 'igor pro': '#0000cc', 262 + 'ini': '#d1dbe0', 263 + 'ispc': '#2D68B1', 264 + 'idris': '#b30000', 265 + 'ignore list': '#000000', 266 + 'imagej macro': '#99AAFF', 267 + 'imba': '#16cec6', 268 + 'inno setup': '#264b99', 269 + 'io': '#a9188d', 270 + 'ioke': '#078193', 271 + 'isabelle': '#FEFE00', 272 + 'isabelle root': '#FEFE00', 273 + 'j': '#9EEDFF', 274 + 'jar manifest': '#b07219', 275 + 'jcl': '#d90e09', 276 + 'jflex': '#DBCA00', 277 + 'json': '#292929', 278 + 'json with comments': '#292929', 279 + 'json5': '#267CB9', 280 + 'jsonld': '#0c479c', 281 + 'jsoniq': '#40d47e', 282 + 'jac': '#FC792D', 283 + 'jai': '#ab8b4b', 284 + 'janet': '#0886a5', 285 + 'jasmin': '#d03600', 286 + 'java': '#b07219', 287 + 'java properties': '#2A6277', 288 + 'java server pages': '#2A6277', 289 + 'java template engine': '#2A6277', 290 + 'javascript': '#f1e05a', 291 + 'javascript+erb': '#f1e05a', 292 + 'jest snapshot': '#15c213', 293 + 'jetbrains mps': '#21D789', 294 + 'jinja': '#a52a22', 295 + 'jison': '#56b3cb', 296 + 'jison lex': '#56b3cb', 297 + 'jolie': '#843179', 298 + 'jsonnet': '#0064bd', 299 + 'julia': '#a270ba', 300 + 'julia repl': '#a270ba', 301 + 'jupyter notebook': '#DA5B0B', 302 + 'just': '#384d54', 303 + 'kcl': '#7ABABF', 304 + 'kdl': '#ffb3b3', 305 + 'kframework': '#4195c5', 306 + 'krl': '#28430A', 307 + 'kaitai struct': '#773b37', 308 + 'kakounescript': '#6f8042', 309 + 'kerboscript': '#41adf0', 310 + 'kicad layout': '#2f4aab', 311 + 'kicad legacy layout': '#2f4aab', 312 + 'kicad schematic': '#2f4aab', 313 + 'kolmafia ash': '#B9D9B9', 314 + 'koka': '#215166', 315 + 'kotlin': '#A97BFF', 316 + 'lfe': '#4C3023', 317 + 'llvm': '#185619', 318 + 'lolcode': '#cc9900', 319 + 'lsl': '#3d9970', 320 + 'labview': '#fede06', 321 + 'lambdapi': '#8027a3', 322 + 'langium': '#2c8c87', 323 + 'lark': '#2980B9', 324 + 'lasso': '#999999', 325 + 'latte': '#f2a542', 326 + 'leo': '#C4FFC2', 327 + 'less': '#1d365d', 328 + 'lex': '#DBCA00', 329 + 'ligolang': '#0e74ff', 330 + 'lilypond': '#9ccc7c', 331 + 'liquid': '#67b8de', 332 + 'liquidsoap': '#990066', 333 + 'literate agda': '#315665', 334 + 'literate coffeescript': '#244776', 335 + 'literate haskell': '#5e5086', 336 + 'livecode script': '#0c5ba5', 337 + 'livescript': '#499886', 338 + 'logtalk': '#295b9a', 339 + 'lookml': '#652B81', 340 + 'lua': '#000080', 341 + 'luau': '#00A2FF', 342 + 'm3u': '#179C7D', 343 + 'matlab': '#e16737', 344 + 'maxscript': '#00a6a6', 345 + 'mdx': '#fcb32c', 346 + 'mlir': '#5EC8DB', 347 + 'mql4': '#62A8D6', 348 + 'mql5': '#4A76B8', 349 + 'mtml': '#b7e1f4', 350 + 'macaulay2': '#d8ffff', 351 + 'makefile': '#427819', 352 + 'mako': '#7e858d', 353 + 'markdown': '#083fa1', 354 + 'marko': '#42bff2', 355 + 'mask': '#f97732', 356 + 'mathematical programming system': '#0530ad', 357 + 'max': '#c4a79c', 358 + 'metta': '#6a5acd', 359 + 'mercury': '#ff2b2b', 360 + 'mermaid': '#ff3670', 361 + 'meson': '#007800', 362 + 'metal': '#8f14e9', 363 + 'miniyaml': '#ff1111', 364 + 'minizinc': '#06a9e6', 365 + 'mint': '#02b046', 366 + 'mirah': '#c7a938', 367 + 'modelica': '#de1d31', 368 + 'modula-2': '#10253f', 369 + 'modula-3': '#223388', 370 + 'mojo': '#ff4c1f', 371 + 'monkey c': '#8D6747', 372 + 'moonbit': '#b92381', 373 + 'moonscript': '#ff4585', 374 + 'motoko': '#fbb03b', 375 + 'motorola 68k assembly': '#005daa', 376 + 'move': '#4a137a', 377 + 'mustache': '#724b3b', 378 + 'ncl': '#28431f', 379 + 'nmodl': '#00356B', 380 + 'npm config': '#cb3837', 381 + 'nwscript': '#111522', 382 + 'nasal': '#1d2c4e', 383 + 'nearley': '#990000', 384 + 'nemerle': '#3d3c6e', 385 + 'netlinx': '#0aa0ff', 386 + 'netlinx+erb': '#747faa', 387 + 'netlogo': '#ff6375', 388 + 'newlisp': '#87AED7', 389 + 'nextflow': '#3ac486', 390 + 'nginx': '#009639', 391 + 'nickel': '#E0C3FC', 392 + 'nim': '#ffc200', 393 + 'nit': '#009917', 394 + 'nix': '#7e7eff', 395 + 'noir': '#2f1f49', 396 + 'nu': '#c9df40', 397 + 'numpy': '#9C8AF9', 398 + 'nunjucks': '#3d8137', 399 + 'nushell': '#4E9906', 400 + 'oasv2-json': '#85ea2d', 401 + 'oasv2-yaml': '#85ea2d', 402 + 'oasv3-json': '#85ea2d', 403 + 'oasv3-yaml': '#85ea2d', 404 + 'ocaml': '#ef7a08', 405 + 'omnet++ msg': '#a0e0a0', 406 + 'omnet++ ned': '#08607c', 407 + 'objectscript': '#424893', 408 + 'objective-c': '#438eff', 409 + 'objective-c++': '#6866fb', 410 + 'objective-j': '#ff0c5a', 411 + 'odin': '#60AFFE', 412 + 'omgrofl': '#cabbff', 413 + 'opal': '#f7ede0', 414 + 'open policy agent': '#7d9199', 415 + 'openapi specification v2': '#85ea2d', 416 + 'openapi specification v3': '#85ea2d', 417 + 'opencl': '#ed2e2d', 418 + 'openedge abl': '#5ce600', 419 + 'openqasm': '#AA70FF', 420 + 'openscad': '#e5cd45', 421 + 'option list': '#476732', 422 + 'org': '#77aa99', 423 + 'overpassql': '#cce2aa', 424 + 'oxygene': '#cdd0e3', 425 + 'oz': '#fab738', 426 + 'p4': '#7055b5', 427 + 'pddl': '#0d00ff', 428 + 'peg.js': '#234d6b', 429 + 'php': '#4F5D95', 430 + 'plsql': '#dad8d8', 431 + 'plpgsql': '#336790', 432 + 'pov-ray sdl': '#6bac65', 433 + 'pact': '#F7A8B8', 434 + 'pan': '#cc0000', 435 + 'papyrus': '#6600cc', 436 + 'parrot': '#f3ca0a', 437 + 'pascal': '#E3F171', 438 + 'pawn': '#dbb284', 439 + 'pep8': '#C76F5B', 440 + 'perl': '#0298c3', 441 + 'picolisp': '#6067af', 442 + 'piglatin': '#fcd7de', 443 + 'pike': '#005390', 444 + 'pip requirements': '#FFD343', 445 + 'pkl': '#6b9543', 446 + 'plantuml': '#fbbd16', 447 + 'pogoscript': '#d80074', 448 + 'polar': '#ae81ff', 449 + 'portugol': '#f8bd00', 450 + 'postcss': '#dc3a0c', 451 + 'postscript': '#da291c', 452 + 'powerbuilder': '#8f0f8d', 453 + 'powershell': '#012456', 454 + 'praat': '#c8506d', 455 + 'prisma': '#0c344b', 456 + 'processing': '#0096D8', 457 + 'procfile': '#3B2F63', 458 + 'prolog': '#74283c', 459 + 'promela': '#de0000', 460 + 'propeller spin': '#7fa2a7', 461 + 'pug': '#a86454', 462 + 'puppet': '#302B6D', 463 + 'purebasic': '#5a6986', 464 + 'purescript': '#1D222D', 465 + 'pyret': '#ee1e10', 466 + 'python': '#3572A5', 467 + 'python console': '#3572A5', 468 + 'python traceback': '#3572A5', 469 + 'q#': '#fed659', 470 + 'qml': '#44a51c', 471 + 'qt script': '#00b841', 472 + 'quake': '#882233', 473 + 'quakec': '#975777', 474 + 'quickbasic': '#008080', 475 + 'r': '#198CE7', 476 + 'raml': '#77d9fb', 477 + 'rascript': '#2C97FA', 478 + 'rbs': '#701516', 479 + 'rdoc': '#701516', 480 + 'rexx': '#d90e09', 481 + 'rmarkdown': '#198ce7', 482 + 'ron': '#a62c00', 483 + 'ros interface': '#22314e', 484 + 'rpgle': '#2BDE21', 485 + 'runoff': '#665a4e', 486 + 'racket': '#3c5caa', 487 + 'ragel': '#9d5200', 488 + 'raku': '#0000fb', 489 + 'rascal': '#fffaa0', 490 + 'rescript': '#ed5051', 491 + 'reason': '#ff5847', 492 + 'reasonligo': '#ff5847', 493 + 'rebol': '#358a5b', 494 + 'record jar': '#0673ba', 495 + 'red': '#f50000', 496 + 'regular expression': '#009a00', 497 + 'ren\'py': '#ff7f7f', 498 + 'rez': '#FFDAB3', 499 + 'ring': '#2D54CB', 500 + 'riot': '#A71E49', 501 + 'robotframework': '#00c0b5', 502 + 'roc': '#7c38f5', 503 + 'rocq prover': '#d0b68c', 504 + 'roff': '#ecdebe', 505 + 'roff manpage': '#ecdebe', 506 + 'rouge': '#cc0088', 507 + 'routeros script': '#DE3941', 508 + 'ruby': '#701516', 509 + 'rust': '#dea584', 510 + 'sas': '#B34936', 511 + 'scss': '#c6538c', 512 + 'sparql': '#0C4597', 513 + 'sqf': '#3F3F3F', 514 + 'sql': '#e38c00', 515 + 'sqlpl': '#e38c00', 516 + 'srecode template': '#348a34', 517 + 'stl': '#373b5e', 518 + 'svg': '#ff9900', 519 + 'sail': '#259dd5', 520 + 'saltstack': '#646464', 521 + 'sass': '#a53b70', 522 + 'scala': '#c22d40', 523 + 'scaml': '#bd181a', 524 + 'scenic': '#fdc700', 525 + 'scheme': '#1e4aec', 526 + 'scilab': '#ca0f21', 527 + 'self': '#0579aa', 528 + 'shaderlab': '#222c37', 529 + 'shell': '#89e051', 530 + 'shellcheck config': '#cecfcb', 531 + 'shen': '#120F14', 532 + 'simple file verification': '#C9BFED', 533 + 'singularity': '#64E6AD', 534 + 'slang': '#1fbec9', 535 + 'slash': '#007eff', 536 + 'slice': '#003fa2', 537 + 'slim': '#2b2b2b', 538 + 'slint': '#2379F4', 539 + 'smpl': '#c94949', 540 + 'smalltalk': '#596706', 541 + 'smarty': '#f0c040', 542 + 'smithy': '#c44536', 543 + 'snakemake': '#419179', 544 + 'solidity': '#AA6746', 545 + 'sourcepawn': '#f69e1d', 546 + 'squirrel': '#800000', 547 + 'stan': '#b2011d', 548 + 'standard ml': '#dc566d', 549 + 'starlark': '#76d275', 550 + 'stata': '#1a5f91', 551 + 'stringtemplate': '#3fb34f', 552 + 'stylus': '#ff6347', 553 + 'subrip text': '#9e0101', 554 + 'sugarss': '#2fcc9f', 555 + 'supercollider': '#46390b', 556 + 'surrealql': '#ff00a0', 557 + 'survex data': '#ffcc99', 558 + 'svelte': '#ff3e00', 559 + 'sway': '#00F58C', 560 + 'sweave': '#198ce7', 561 + 'swift': '#F05138', 562 + 'systemverilog': '#DAE1C2', 563 + 'ti program': '#A0AA87', 564 + 'tl-verilog': '#C40023', 565 + 'tla': '#4b0079', 566 + 'tmdl': '#f0c913', 567 + 'toml': '#9c4221', 568 + 'tsql': '#e38c00', 569 + 'tsv': '#237346', 570 + 'tsx': '#3178c6', 571 + 'txl': '#0178b8', 572 + 'tact': '#48b5ff', 573 + 'talon': '#333333', 574 + 'tcl': '#e4cc98', 575 + 'tex': '#3D6117', 576 + 'teal': '#00B1BC', 577 + 'terra': '#00004c', 578 + 'terraform template': '#7b42bb', 579 + 'textgrid': '#c8506d', 580 + 'textmate properties': '#df66e4', 581 + 'textile': '#ffe7ac', 582 + 'thrift': '#D12127', 583 + 'toit': '#c2c9fb', 584 + 'tor config': '#59316b', 585 + 'tree-sitter query': '#8ea64c', 586 + 'turing': '#cf142b', 587 + 'twig': '#c1d026', 588 + 'typescript': '#3178c6', 589 + 'typespec': '#4A3665', 590 + 'typst': '#239dad', 591 + 'unified parallel c': '#4e3617', 592 + 'unity3d asset': '#222c37', 593 + 'uno': '#9933cc', 594 + 'unrealscript': '#a54c4d', 595 + 'untyped plutus core': '#36adbd', 596 + 'urweb': '#ccccee', 597 + 'v': '#4f87c4', 598 + 'vba': '#867db1', 599 + 'vbscript': '#15dcdc', 600 + 'vcl': '#148AA8', 601 + 'vhdl': '#adb2cb', 602 + 'vala': '#a56de2', 603 + 'valve data format': '#f26025', 604 + 'velocity template language': '#507cff', 605 + 'vento': '#ff0080', 606 + 'verilog': '#b2b7f8', 607 + 'vim help file': '#199f4b', 608 + 'vim script': '#199f4b', 609 + 'vim snippet': '#199f4b', 610 + 'visual basic .net': '#945db7', 611 + 'visual basic 6.0': '#2c6353', 612 + 'volt': '#1F1F1F', 613 + 'vue': '#41b883', 614 + 'vyper': '#9F4CF2', 615 + 'wdl': '#42f1f4', 616 + 'wgsl': '#1a5e9a', 617 + 'web ontology language': '#5b70bd', 618 + 'webassembly': '#04133b', 619 + 'webassembly interface type': '#6250e7', 620 + 'whiley': '#d5c397', 621 + 'wikitext': '#fc5757', 622 + 'windows registry entries': '#52d5ff', 623 + 'witcher script': '#ff0000', 624 + 'wolfram language': '#dd1100', 625 + 'wollok': '#a23738', 626 + 'world of warcraft addon data': '#f7e43f', 627 + 'wren': '#383838', 628 + 'x10': '#4B6BEF', 629 + 'xc': '#99DA07', 630 + 'xml': '#0060ac', 631 + 'xml property list': '#0060ac', 632 + 'xquery': '#5232e7', 633 + 'xslt': '#EB8CEB', 634 + 'xmake': '#22a079', 635 + 'xojo': '#81bd41', 636 + 'xonsh': '#285EEF', 637 + 'xtend': '#24255d', 638 + 'yaml': '#cb171e', 639 + 'yara': '#220000', 640 + 'yasnippet': '#32AB90', 641 + 'yacc': '#4B6C4B', 642 + 'yul': '#794932', 643 + 'zap': '#0d665e', 644 + 'zil': '#dc75e5', 645 + 'zenscript': '#00BCD1', 646 + 'zephir': '#118f9e', 647 + 'zig': '#ec915c', 648 + 'zimpl': '#d67711', 649 + 'zmodel': '#ff7100', 650 + 'crontab': '#ead7ac', 651 + 'ec': '#913960', 652 + 'fish': '#4aae47', 653 + 'hoon': '#00b171', 654 + 'icalendar': '#ec564c', 655 + 'jq': '#c7254e', 656 + 'kvlang': '#1da6e0', 657 + 'mirc script': '#3d57c3', 658 + 'mcfunction': '#E22837', 659 + 'mdsvex': '#5f9ea0', 660 + 'mupad': '#244963', 661 + 'nanorc': '#2d004d', 662 + 'nesc': '#94B0C7', 663 + 'ooc': '#b0b77e', 664 + 'q': '#0040cd', 665 + 'restructuredtext': '#141414', 666 + 'sed': '#64b970', 667 + 'templ': '#66D0DD', 668 + 'vcard': '#ee2647', 669 + 'wisp': '#7582D1', 670 + 'xbase': '#403a40', 671 + }; 672 + 673 + export const ENRY_LANGUAGE_GROUPS: Record<string, string> = { 674 + 'alpine abuild': 'shell', 675 + 'apollo guidance computer': 'assembly', 676 + 'bibtex': 'tex', 677 + 'bison': 'yacc', 678 + 'bluespec bh': 'bluespec', 679 + 'c2hs haskell': 'haskell', 680 + 'cairo': 'cairo', 681 + 'cairo zero': 'cairo', 682 + 'cameligo': 'ligolang', 683 + 'coldfusion cfc': 'coldfusion', 684 + 'cylc': 'ini', 685 + 'eclipse': 'prolog', 686 + 'easybuild': 'python', 687 + 'ecere projects': 'javascript', 688 + 'ecmarkup': 'html', 689 + 'editorconfig': 'ini', 690 + 'elvish transcript': 'elvish', 691 + 'filterscript': 'renderscript', 692 + 'fortran': 'fortran', 693 + 'fortran free form': 'fortran', 694 + 'gentoo ebuild': 'shell', 695 + 'gentoo eclass': 'shell', 696 + 'git config': 'ini', 697 + 'glimmer js': 'javascript', 698 + 'glimmer ts': 'typescript', 699 + 'gradle kotlin dsl': 'gradle', 700 + 'groovy server pages': 'groovy', 701 + 'html+ecr': 'html', 702 + 'html+eex': 'html', 703 + 'html+erb': 'html', 704 + 'html+php': 'html', 705 + 'html+razor': 'html', 706 + 'isabelle root': 'isabelle', 707 + 'jflex': 'lex', 708 + 'json with comments': 'json', 709 + 'java server pages': 'java', 710 + 'java template engine': 'java', 711 + 'javascript+erb': 'javascript', 712 + 'jison': 'yacc', 713 + 'jison lex': 'lex', 714 + 'julia repl': 'julia', 715 + 'lean 4': 'lean', 716 + 'ligolang': 'ligolang', 717 + 'literate agda': 'agda', 718 + 'literate coffeescript': 'coffeescript', 719 + 'literate haskell': 'haskell', 720 + 'm4sugar': 'm4', 721 + 'muf': 'forth', 722 + 'maven pom': 'xml', 723 + 'motorola 68k assembly': 'assembly', 724 + 'npm config': 'ini', 725 + 'numpy': 'python', 726 + 'oasv2-json': 'openapi specification v2', 727 + 'oasv2-yaml': 'openapi specification v2', 728 + 'oasv3-json': 'openapi specification v3', 729 + 'oasv3-yaml': 'openapi specification v3', 730 + 'opencl': 'c', 731 + 'openrc runscript': 'shell', 732 + 'parrot assembly': 'parrot', 733 + 'parrot internal representation': 'parrot', 734 + 'pic': 'roff', 735 + 'postcss': 'css', 736 + 'python console': 'python', 737 + 'python traceback': 'python', 738 + 'rbs': 'ruby', 739 + 'readline config': 'ini', 740 + 'reasonligo': 'ligolang', 741 + 'roff manpage': 'roff', 742 + 'ssh config': 'ini', 743 + 'ston': 'smalltalk', 744 + 'simple file verification': 'checksums', 745 + 'snakemake': 'python', 746 + 'tsx': 'typescript', 747 + 'tcsh': 'shell', 748 + 'terraform template': 'hcl', 749 + 'unified parallel c': 'c', 750 + 'unix assembly': 'assembly', 751 + 'wget config': 'ini', 752 + 'x bitmap': 'c', 753 + 'x pixmap': 'c', 754 + 'xml property list': 'xml', 755 + 'curl config': 'ini', 756 + 'fish': 'shell', 757 + 'nanorc': 'ini', 758 + }; 759 +
+6 -21
src/lib/repo-utils.ts
··· 1 1 import type { IssueComment, PullComment, RepoContext, TreeEntry } from './api'; 2 + import { ENRY_LANGUAGE_COLOR_FALLBACK, ENRY_LANGUAGE_COLORS, ENRY_LANGUAGE_GROUPS } from './language-colors'; 2 3 3 4 const RECENT_REPOS_KEY = 'untangled.recentRepos'; 4 5 ··· 174 175 175 176 export const countLines = (value: string): number => splitCodeLines(value).length; 176 177 177 - export const formatLanguagePercent = (value: number): string => `${value.toFixed(1)}%`; 178 + export const formatLanguagePercent = (value: number): string => 179 + value > 0 && value < 0.05 ? '0.1%' : `${value.toFixed(1)}%`; 178 180 179 181 export const loadRecentRepos = (): RecentRepo[] => { 180 182 try { ··· 219 221 }; 220 222 221 223 export const languageColor = (name: string): string => { 222 - switch (name.toLowerCase()) { 223 - case 'typescript': 224 - return '#3178c6'; 225 - case 'javascript': 226 - return '#f1e05a'; 227 - case 'rust': 228 - return '#dea584'; 229 - case 'go': 230 - return '#00add8'; 231 - case 'python': 232 - return '#3572A5'; 233 - case 'html': 234 - return '#e34c26'; 235 - case 'css': 236 - return '#663399'; 237 - case 'c': 238 - return '#555555'; 239 - default: 240 - return '#94a3b8'; 241 - } 224 + const normalized = name.trim().toLowerCase(); 225 + const group = ENRY_LANGUAGE_GROUPS[normalized]; 226 + return ENRY_LANGUAGE_COLORS[normalized] ?? (group ? ENRY_LANGUAGE_COLORS[group] : undefined) ?? ENRY_LANGUAGE_COLOR_FALLBACK; 242 227 };
+59 -88
src/pages/repo/code.tsx
··· 100 100 </div> 101 101 ); 102 102 103 + const RepoLanguageBar: Component<{ 104 + languages: Array<{ name: string; percentage: number; color?: string }>; 105 + }> = (props) => ( 106 + <Show when={props.languages.length > 0}> 107 + <details class="group -my-4 -m-6 mb-4"> 108 + <summary class="untangled-language-bar"> 109 + <For each={props.languages}> 110 + {(language) => { 111 + const name = language.name || 'Other'; 112 + const color = language.color || languageColor(name); 113 + return ( 114 + <div 115 + class="untangled-language-segment" 116 + title={`${name} ${formatLanguagePercent(language.percentage)}`} 117 + style={{ 118 + width: `${language.percentage}%`, 119 + 'background-color': color, 120 + }} 121 + /> 122 + ); 123 + }} 124 + </For> 125 + </summary> 126 + <div class="px-4 py-2 border-b border-gray-200 dark:border-gray-600 flex items-center gap-4 flex-wrap"> 127 + <For each={props.languages}> 128 + {(language) => { 129 + const name = language.name || 'Other'; 130 + const color = language.color || languageColor(name); 131 + return ( 132 + <div class="flex flex-grow items-center justify-center gap-2 text-xs"> 133 + <div 134 + class="size-2 rounded-full" 135 + style={{ 136 + background: `radial-gradient(circle at 35% 35%, color-mix(in srgb, ${color} 70%, white), ${color} 30%, color-mix(in srgb, ${color} 85%, black))`, 137 + }} 138 + /> 139 + <div> 140 + {name}{' '} 141 + <span class="text-gray-500 dark:text-gray-400"> 142 + {formatLanguagePercent(language.percentage)} 143 + </span> 144 + </div> 145 + </div> 146 + ); 147 + }} 148 + </For> 149 + </div> 150 + </details> 151 + </Show> 152 + ); 153 + 103 154 const LoadingFilePath: Component<{ 104 155 repo: Parameters<typeof treeHref>[0]; 105 156 refName: string; ··· 205 256 return ( 206 257 <> 207 258 <div class="tree"> 208 - <Show when={languages.length > 0}> 209 - <details class="group -my-4 -m-6 mb-4"> 210 - <summary class="untangled-language-bar"> 211 - <For each={languages}> 212 - {(language) => ( 213 - <div 214 - class="untangled-language-segment" 215 - title={`${language.name || 'Other'} ${formatLanguagePercent(language.percentage)}`} 216 - style={{ 217 - width: `${language.percentage}%`, 218 - 'background-color': language.color || languageColor(language.name || 'Other'), 219 - }} 220 - /> 221 - )} 222 - </For> 223 - </summary> 224 - <div class="px-4 py-2 border-b border-gray-200 dark:border-gray-600 flex items-center gap-4 flex-wrap"> 225 - <For each={languages}> 226 - {(language) => { 227 - const color = language.color || languageColor(language.name || 'Other'); 228 - return ( 229 - <div class="flex flex-grow items-center gap-2 text-xs"> 230 - <div 231 - class="size-2 rounded-full" 232 - style={{ 233 - background: `radial-gradient(circle at 35% 35%, color-mix(in srgb, ${color} 70%, white), ${color} 30%, color-mix(in srgb, ${color} 85%, black))`, 234 - }} 235 - /> 236 - <div> 237 - {language.name || 'Other'}{' '} 238 - <span class="text-gray-500 dark:text-gray-400"> 239 - {formatLanguagePercent(language.percentage)} 240 - </span> 241 - </div> 242 - </div> 243 - ); 244 - }} 245 - </For> 246 - </div> 247 - </details> 248 - </Show> 259 + <RepoLanguageBar languages={languages} /> 249 260 250 261 <div class="flex items-center justify-between pb-5 gap-3 flex-wrap"> 251 262 <div class="flex gap-2 items-center"> ··· 556 567 557 568 return ( 558 569 <> 559 - <Show when={languages.length > 0}> 560 - <details class="group"> 561 - <summary class="untangled-language-bar"> 562 - <For each={languages}> 563 - {(language) => ( 564 - <div 565 - class="untangled-language-segment" 566 - title={`${language.name || 'Other'} ${formatLanguagePercent(language.percentage)}`} 567 - style={{ 568 - width: `${language.percentage}%`, 569 - 'background-color': language.color || languageColor(language.name || 'Other'), 570 - }} 571 - /> 572 - )} 573 - </For> 574 - </summary> 575 - <div class="px-4 py-2 border-b border-gray-200 dark:border-gray-600 flex items-center gap-4 flex-wrap"> 576 - <For each={languages}> 577 - {(language) => { 578 - const color = language.color || languageColor(language.name || 'Other'); 579 - return ( 580 - <div class="flex flex-grow items-center gap-2 text-xs"> 581 - <div 582 - class="size-2 rounded-full" 583 - style={{ 584 - background: `radial-gradient(circle at 35% 35%, color-mix(in srgb, ${color} 70%, white), ${color} 30%, color-mix(in srgb, ${color} 85%, black))`, 585 - }} 586 - /> 587 - <div> 588 - {language.name || 'Other'}{' '} 589 - <span class="text-gray-500 dark:text-gray-400"> 590 - {formatLanguagePercent(language.percentage)} 591 - </span> 592 - </div> 593 - </div> 594 - ); 595 - }} 596 - </For> 597 - </div> 598 - </details> 599 - </Show> 570 + <section class="bg-white dark:bg-gray-800 px-6 py-4 rounded relative w-full mx-auto dark:text-white"> 571 + <RepoLanguageBar languages={languages} /> 600 572 601 - <div class="rounded-b bg-white dark:bg-gray-800"> 602 - <div class="flex items-center justify-between gap-4 px-6 py-4"> 573 + <div class="flex items-center justify-between gap-4 pb-5"> 603 574 <div class="flex items-center gap-2"> 604 575 <select 605 576 class="untangled-branch-select min-w-32 rounded border border-gray-300 bg-white px-3 dark:border-gray-700 dark:bg-gray-800 dark:text-white" ··· 651 622 <Download class="size-4" /> 652 623 code 653 624 </a> 654 - </div> 625 + </div> 655 626 656 627 <Show when={isNestedTreePath}> 657 - <div class="px-6"> 628 + <div> 658 629 <PathBreadcrumbs repo={repo} refName={treeRef} path={treePath} withDivider /> 659 630 <Show when={tree.lastCommit}> 660 631 {(commit) => <TreeLatestCommitPanel repo={repo} commit={commit()} />} ··· 662 633 </div> 663 634 </Show> 664 635 665 - <div class={clsx('untangled-repo-overview px-6 py-4', isNestedTreePath && 'untangled-repo-overview--path')}> 636 + <div class={clsx('untangled-repo-overview', isNestedTreePath && 'untangled-repo-overview--path')}> 666 637 <div class="untangled-file-tree-pane min-w-0 pr-0 md:pr-6"> 667 638 <div class="space-y-3"> 668 639 <Show when={parentPath !== null}> ··· 808 779 </div> 809 780 </Show> 810 781 </div> 811 - </div> 782 + </section> 812 783 813 784 <Show when={readmeIsAvailable(tree.readme, sortedFiles) && tree.readme}> 814 785 {(readme) => <ReadmeCard filename={readme().filename} markdown={readme().contents} />}