forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

Compare changes

Choose any two refs to compare.

Changed files
+57 -119
appview
pages
templates
goodfirstissues
layouts
timeline
state
+4 -3
appview/pages/templates/goodfirstissues/index.html
··· 37 37 {{ else }} 38 38 {{ range .RepoGroups }} 39 39 <div class="mb-4 gap-1 flex flex-col drop-shadow-sm rounded bg-white dark:bg-gray-800"> 40 - <div class="flex px-6 pt-4 flex-row gap-1 items-center justify-between flex-wrap"> 40 + <div class="flex px-6 pt-4 flex-row gap-1 items-center justify-between"> 41 41 <div class="font-medium dark:text-white flex items-center justify-between"> 42 42 <div class="flex items-center min-w-0 flex-1 mr-2"> 43 43 {{ if .Repo.Source }} ··· 103 103 <div class="flex-shrink-0 flex items-center gap-2 text-gray-500 dark:text-gray-400"> 104 104 <span> 105 105 <div class="inline-flex items-center gap-1"> 106 - {{ i "message-square" "w-3 h-3" }} 106 + {{ i "message-square" "w-3 h-3 md:hidden" }} 107 107 {{ len .Comments }} 108 + <span class="hidden md:inline">comment{{ if ne (len .Comments) 1 }}s{{ end }}</span> 108 109 </div> 109 110 </span> 110 111 <span class="before:content-['·'] before:select-none"></span> 111 112 <span class="text-sm"> 112 - {{ template "repo/fragments/shortTimeAgo" .Created }} 113 + {{ template "repo/fragments/time" .Created }} 113 114 </span> 114 115 <div class="hidden md:inline-flex md:gap-1"> 115 116 {{ $labelState := .Labels }}
+12 -13
appview/pages/templates/layouts/base.html
··· 24 24 <title>{{ block "title" . }}{{ end }} · tangled</title> 25 25 {{ block "extrameta" . }}{{ end }} 26 26 </head> 27 - <body class="min-h-screen flex flex-col gap-4 bg-slate-100 dark:bg-gray-900 dark:text-white transition-colors duration-200"> 27 + <body class="min-h-screen grid grid-cols-1 grid-rows-[min-content_auto_min-content] gap-4 bg-slate-100 dark:bg-gray-900 dark:text-white transition-colors duration-200" 28 + style="grid-template-columns: minmax(1rem, 1fr) minmax(auto, 1024px) minmax(1rem, 1fr);"> 28 29 {{ block "topbarLayout" . }} 29 - <header class="w-full bg-white dark:bg-gray-800 col-span-full md:col-span-1 md:col-start-2" style="z-index: 20;"> 30 + <header class="px-1 col-span-full md:col-span-1 md:col-start-2" style="z-index: 20;"> 30 31 31 32 {{ if .LoggedInUser }} 32 33 <div id="upgrade-banner" ··· 40 41 {{ end }} 41 42 42 43 {{ block "mainLayout" . }} 43 - <div class="flex-grow"> 44 - <div class="max-w-screen-lg mx-auto flex flex-col gap-4"> 45 - {{ block "contentLayout" . }} 46 - <main> 44 + <div class="px-1 col-span-full md:col-span-1 md:col-start-2 flex flex-col gap-4"> 45 + {{ block "contentLayout" . }} 46 + <main class="col-span-1 md:col-span-8"> 47 47 {{ block "content" . }}{{ end }} 48 48 </main> 49 - {{ end }} 50 - 51 - {{ block "contentAfterLayout" . }} 52 - <main> 49 + {{ end }} 50 + 51 + {{ block "contentAfterLayout" . }} 52 + <main class="col-span-1 md:col-span-8"> 53 53 {{ block "contentAfter" . }}{{ end }} 54 54 </main> 55 - {{ end }} 56 - </div> 55 + {{ end }} 57 56 </div> 58 57 {{ end }} 59 58 60 59 {{ block "footerLayout" . }} 61 - <footer class="bg-white dark:bg-gray-800 mt-12"> 60 + <footer class="px-1 col-span-full md:col-span-1 md:col-start-2 mt-12"> 62 61 {{ template "layouts/fragments/footer" . }} 63 62 </footer> 64 63 {{ end }}
+34 -87
appview/pages/templates/layouts/fragments/footer.html
··· 1 1 {{ define "layouts/fragments/footer" }} 2 - <div class="w-full p-8"> 3 - <div class="mx-auto px-4"> 4 - <div class="flex flex-col text-gray-600 dark:text-gray-400 gap-8"> 5 - <!-- Desktop layout: grid with 3 columns --> 6 - <div class="hidden lg:grid lg:grid-cols-[1fr_minmax(0,1024px)_1fr] lg:gap-8 lg:items-start"> 7 - <!-- Left section --> 8 - <div> 9 - <a href="/" hx-boost="true" class="flex gap-2 font-semibold italic no-underline hover:no-underline"> 10 - {{ template "fragments/logotypeSmall" }} 11 - </a> 12 - </div> 2 + <div class="w-full p-4 md:p-8 bg-white dark:bg-gray-800 rounded-t drop-shadow-sm"> 3 + <div class="container mx-auto max-w-7xl px-4"> 4 + <div class="flex flex-col lg:flex-row justify-between items-start text-gray-600 dark:text-gray-400 text-sm gap-8"> 5 + <div class="mb-4 md:mb-0"> 6 + <a href="/" hx-boost="true" class="flex gap-2 font-semibold italic no-underline hover:no-underline"> 7 + {{ template "fragments/logotypeSmall" }} 8 + </a> 9 + </div> 13 10 14 - {{ $headerStyle := "text-gray-900 dark:text-gray-200 font-bold text-sm uppercase tracking-wide mb-1" }} 15 - {{ $linkStyle := "text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:underline inline-flex gap-1 items-center" }} 16 - {{ $iconStyle := "w-4 h-4 flex-shrink-0" }} 17 - 18 - <!-- Center section with max-width --> 19 - <div class="grid grid-cols-4 gap-2"> 20 - <div class="flex flex-col gap-1"> 21 - <div class="{{ $headerStyle }}">legal</div> 22 - <a href="/terms" class="{{ $linkStyle }}">{{ i "file-text" $iconStyle }} terms of service</a> 23 - <a href="/privacy" class="{{ $linkStyle }}">{{ i "shield" $iconStyle }} privacy policy</a> 24 - </div> 25 - 26 - <div class="flex flex-col gap-1"> 27 - <div class="{{ $headerStyle }}">resources</div> 28 - <a href="https://blog.tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "book-open" $iconStyle }} blog</a> 29 - <a href="https://tangled.org/@tangled.org/core/tree/master/docs" class="{{ $linkStyle }}">{{ i "book" $iconStyle }} docs</a> 30 - <a href="https://tangled.org/@tangled.org/core" class="{{ $linkStyle }}">{{ i "code" $iconStyle }} source</a> 31 - <a href="https://tangled.org/brand" class="{{ $linkStyle }}">{{ i "paintbrush" $iconStyle }} brand</a> 32 - </div> 33 - 34 - <div class="flex flex-col gap-1"> 35 - <div class="{{ $headerStyle }}">social</div> 36 - <a href="https://chat.tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "message-circle" $iconStyle }} discord</a> 37 - <a href="https://web.libera.chat/#tangled" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "hash" $iconStyle }} irc</a> 38 - <a href="https://bsky.app/profile/tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ template "user/fragments/bluesky" $iconStyle }} bluesky</a> 39 - </div> 40 - 41 - <div class="flex flex-col gap-1"> 42 - <div class="{{ $headerStyle }}">contact</div> 43 - <a href="mailto:team@tangled.org" class="{{ $linkStyle }}">{{ i "mail" "w-4 h-4 flex-shrink-0" }} team@tangled.org</a> 44 - <a href="mailto:security@tangled.org" class="{{ $linkStyle }}">{{ i "shield-check" "w-4 h-4 flex-shrink-0" }} security@tangled.org</a> 45 - </div> 11 + {{ $headerStyle := "text-gray-900 dark:text-gray-200 font-bold text-xs uppercase tracking-wide mb-1" }} 12 + {{ $linkStyle := "text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:underline inline-flex gap-1 items-center" }} 13 + {{ $iconStyle := "w-4 h-4 flex-shrink-0" }} 14 + <div class="grid grid-cols-1 sm:grid-cols-1 md:grid-cols-4 sm:gap-6 md:gap-2 gap-6 flex-1"> 15 + <div class="flex flex-col gap-1"> 16 + <div class="{{ $headerStyle }}">legal</div> 17 + <a href="/terms" class="{{ $linkStyle }}">{{ i "file-text" $iconStyle }} terms of service</a> 18 + <a href="/privacy" class="{{ $linkStyle }}">{{ i "shield" $iconStyle }} privacy policy</a> 46 19 </div> 47 20 48 - <!-- Right section --> 49 - <div class="text-right"> 50 - <div class="text-xs">&copy; 2025 Tangled Labs Oy. All rights reserved.</div> 21 + <div class="flex flex-col gap-1"> 22 + <div class="{{ $headerStyle }}">resources</div> 23 + <a href="https://blog.tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "book-open" $iconStyle }} blog</a> 24 + <a href="https://tangled.org/@tangled.org/core/tree/master/docs" class="{{ $linkStyle }}">{{ i "book" $iconStyle }} docs</a> 25 + <a href="https://tangled.org/@tangled.org/core" class="{{ $linkStyle }}">{{ i "code" $iconStyle }} source</a> 26 + <a href="https://tangled.org/brand" class="{{ $linkStyle }}">{{ i "paintbrush" $iconStyle }} brand</a> 51 27 </div> 52 - </div> 53 28 54 - <!-- Mobile layout: stacked --> 55 - <div class="lg:hidden flex flex-col gap-8"> 56 - {{ $headerStyle := "text-gray-900 dark:text-gray-200 font-bold text-xs uppercase tracking-wide mb-1" }} 57 - {{ $linkStyle := "text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:underline inline-flex gap-1 items-center" }} 58 - {{ $iconStyle := "w-4 h-4 flex-shrink-0" }} 59 - 60 - <div class="mb-4 md:mb-0"> 61 - <a href="/" hx-boost="true" class="flex gap-2 font-semibold italic no-underline hover:no-underline"> 62 - {{ template "fragments/logotypeSmall" }} 63 - </a> 29 + <div class="flex flex-col gap-1"> 30 + <div class="{{ $headerStyle }}">social</div> 31 + <a href="https://chat.tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "message-circle" $iconStyle }} discord</a> 32 + <a href="https://web.libera.chat/#tangled" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "hash" $iconStyle }} irc</a> 33 + <a href="https://bsky.app/profile/tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ template "user/fragments/bluesky" $iconStyle }} bluesky</a> 64 34 </div> 65 35 66 - <div class="grid grid-cols-1 sm:grid-cols-1 md:grid-cols-4 sm:gap-6 md:gap-2 gap-6"> 67 - <div class="flex flex-col gap-1"> 68 - <div class="{{ $headerStyle }}">legal</div> 69 - <a href="/terms" class="{{ $linkStyle }}">{{ i "file-text" $iconStyle }} terms of service</a> 70 - <a href="/privacy" class="{{ $linkStyle }}">{{ i "shield" $iconStyle }} privacy policy</a> 71 - </div> 72 - 73 - <div class="flex flex-col gap-1"> 74 - <div class="{{ $headerStyle }}">resources</div> 75 - <a href="https://blog.tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "book-open" $iconStyle }} blog</a> 76 - <a href="https://tangled.org/@tangled.org/core/tree/master/docs" class="{{ $linkStyle }}">{{ i "book" $iconStyle }} docs</a> 77 - <a href="https://tangled.org/@tangled.org/core" class="{{ $linkStyle }}">{{ i "code" $iconStyle }} source</a> 78 - <a href="https://tangled.org/brand" class="{{ $linkStyle }}">{{ i "paintbrush" $iconStyle }} brand</a> 79 - </div> 80 - 81 - <div class="flex flex-col gap-1"> 82 - <div class="{{ $headerStyle }}">social</div> 83 - <a href="https://chat.tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "message-circle" $iconStyle }} discord</a> 84 - <a href="https://web.libera.chat/#tangled" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ i "hash" $iconStyle }} irc</a> 85 - <a href="https://bsky.app/profile/tangled.org" class="{{ $linkStyle }}" target="_blank" rel="noopener noreferrer">{{ template "user/fragments/bluesky" $iconStyle }} bluesky</a> 86 - </div> 87 - 88 - <div class="flex flex-col gap-1"> 89 - <div class="{{ $headerStyle }}">contact</div> 90 - <a href="mailto:team@tangled.org" class="{{ $linkStyle }}">{{ i "mail" "w-4 h-4 flex-shrink-0" }} team@tangled.org</a> 91 - <a href="mailto:security@tangled.org" class="{{ $linkStyle }}">{{ i "shield-check" "w-4 h-4 flex-shrink-0" }} security@tangled.org</a> 92 - </div> 36 + <div class="flex flex-col gap-1"> 37 + <div class="{{ $headerStyle }}">contact</div> 38 + <a href="mailto:team@tangled.org" class="{{ $linkStyle }}">{{ i "mail" "w-4 h-4 flex-shrink-0" }} team@tangled.org</a> 39 + <a href="mailto:security@tangled.org" class="{{ $linkStyle }}">{{ i "shield-check" "w-4 h-4 flex-shrink-0" }} security@tangled.org</a> 93 40 </div> 41 + </div> 94 42 95 - <div class="text-center"> 96 - <div class="text-xs">&copy; 2025 Tangled Labs Oy. All rights reserved.</div> 97 - </div> 43 + <div class="text-center lg:text-right flex-shrink-0"> 44 + <div class="text-xs">&copy; 2025 Tangled Labs Oy. All rights reserved.</div> 98 45 </div> 99 46 </div> 100 47 </div>
+1 -1
appview/pages/templates/layouts/fragments/topbar.html
··· 1 1 {{ define "layouts/fragments/topbar" }} 2 - <nav class="mx-auto space-x-4 px-6 py-2 rounded-b dark:text-white drop-shadow-sm"> 2 + <nav class="space-x-4 px-6 py-2 rounded-b bg-white dark:bg-gray-800 dark:text-white drop-shadow-sm"> 3 3 <div class="flex justify-between p-0 items-center"> 4 4 <div id="left-items"> 5 5 <a href="/" hx-boost="true" class="text-2xl no-underline hover:no-underline flex items-center gap-2">
+5 -2
appview/pages/templates/timeline/fragments/goodfirstissues.html
··· 6 6 <div class="text-purple-500 dark:text-purple-400">Oct 2025</div> 7 7 <p> 8 8 Make your first contribution to an open-source project this October. 9 - <em>good-first-issue</em> helps new contributors find easy ways to 10 - start contributing to open-source projects. 9 + </p> 10 + <p> 11 + <em>good-first-issue</em> is a collection of issues on open-source projects 12 + that are easy ways for new contributors to give back to the projects 13 + they love. 11 14 </p> 12 15 <span class="flex items-center gap-2 text-purple-500 dark:text-purple-400"> 13 16 Browse issues {{ i "arrow-right" "size-4" }}
+1 -13
appview/state/gfi.go
··· 47 47 repoUris = append(repoUris, rl.RepoAt.String()) 48 48 } 49 49 50 - allIssues, err := db.GetIssuesPaginated( 50 + allIssues, err := db.GetIssues( 51 51 s.db, 52 - pagination.Page{ 53 - Limit: 500, 54 - }, 55 52 db.FilterIn("repo_at", repoUris), 56 53 db.FilterEq("open", 1), 57 54 ) ··· 86 83 } 87 84 88 85 sort.Slice(sortedGroups, func(i, j int) bool { 89 - iIsTangled := sortedGroups[i].Repo.Did == consts.TangledDid 90 - jIsTangled := sortedGroups[j].Repo.Did == consts.TangledDid 91 - 92 - // If one is tangled and the other isn't, non-tangled comes first 93 - if iIsTangled != jIsTangled { 94 - return jIsTangled // true if j is tangled (i should come first) 95 - } 96 - 97 - // Both tangled or both not tangled: sort by name 98 86 return sortedGroups[i].Repo.Name < sortedGroups[j].Repo.Name 99 87 }) 100 88