this repo has no description
1{{ define "title" }}good first issues{{ end }} 2 3{{ define "extrameta" }} 4 <meta name="description" content="Discover beginner-friendly good first issues across open source projects on Tangled. Perfect for new contributors looking to get started with open source development." /> 5 <meta name="keywords" content="good first issues, beginner issues, open source contribution, first time contributor, beginner friendly, open source projects" /> 6 7 <meta property="og:title" content="good first issues · tangled" /> 8 <meta property="og:type" content="website" /> 9 <meta property="og:url" content="https://tangled.org/goodfirstissues" /> 10 <meta property="og:description" content="Find beginner-friendly issues across all repositories to get started with open source contributions on Tangled." /> 11 12 <meta name="twitter:card" content="summary" /> 13 <meta name="twitter:title" content="good first issues · tangled" /> 14 <meta name="twitter:description" content="Find beginner-friendly issues to get started with open source contributions." /> 15 16 <!-- structured data for good first issues page --> 17 <script type="application/ld+json"> 18 { 19 "@context": "https://schema.org", 20 "@type": "CollectionPage", 21 "name": "Good First Issues", 22 "description": "A curated collection of beginner-friendly issues across open source projects", 23 "url": "https://tangled.org/goodfirstissues", 24 "isPartOf": { 25 "@type": "WebSite", 26 "name": "Tangled", 27 "url": "https://tangled.org" 28 } 29 } 30 </script> 31{{ end }} 32 33{{ define "canonical" }}https://tangled.org/goodfirstissues{{ end }} 34 35{{ define "content" }} 36<div class="grid grid-cols-10"> 37 <header class="col-span-full md:col-span-10 px-6 py-2 text-center flex flex-col items-center justify-center py-8"> 38 <h1 class="scale-150 dark:text-white mb-4"> 39 {{ template "labels/fragments/label" (dict "def" .GfiLabel "val" "" "withPrefix" true) }} 40 </h1> 41 <p class="text-gray-600 dark:text-gray-400 mb-2"> 42 Find beginner-friendly issues across all repositories to get started with open source contributions. 43 </p> 44 </header> 45 46 <div class="col-span-full md:col-span-10 space-y-6"> 47 {{ if eq (len .RepoGroups) 0 }} 48 <div class="bg-white dark:bg-gray-800 drop-shadow-sm rounded p-6 md:px-10"> 49 <div class="text-center py-16"> 50 <div class="text-gray-500 dark:text-gray-400 mb-4"> 51 {{ i "circle-dot" "w-16 h-16 mx-auto" }} 52 </div> 53 <h3 class="text-xl font-medium text-gray-900 dark:text-white mb-2">No good first issues available</h3> 54 <p class="text-gray-600 dark:text-gray-400 mb-3 max-w-md mx-auto"> 55 There are currently no open issues labeled as "good-first-issue" across all repositories. 56 </p> 57 <p class="text-gray-500 dark:text-gray-500 text-sm max-w-md mx-auto"> 58 Repository maintainers can add the "good-first-issue" label to beginner-friendly issues to help newcomers get started. 59 </p> 60 </div> 61 </div> 62 {{ else }} 63 {{ range .RepoGroups }} 64 <div class="mb-4 gap-1 flex flex-col drop-shadow-sm rounded bg-white dark:bg-gray-800"> 65 <div class="flex px-6 pt-4 flex-row gap-1 items-center justify-between flex-wrap"> 66 <div class="font-medium dark:text-white flex items-center justify-between"> 67 <div class="flex items-center min-w-0 flex-1 mr-2"> 68 {{ if .Repo.Source }} 69 {{ i "git-fork" "w-4 h-4 mr-1.5 shrink-0" }} 70 {{ else }} 71 {{ i "book-marked" "w-4 h-4 mr-1.5 shrink-0" }} 72 {{ end }} 73 {{ $repoOwner := resolve .Repo.Did }} 74 <a href="/{{ $repoOwner }}/{{ .Repo.Name }}" class="truncate min-w-0">{{ $repoOwner }}/{{ .Repo.Name }}</a> 75 </div> 76 </div> 77 78 79 {{ if .Repo.RepoStats }} 80 <div class="text-gray-400 text-sm font-mono inline-flex gap-4"> 81 {{ with .Repo.RepoStats.Language }} 82 <div class="flex gap-2 items-center text-sm"> 83 {{ template "repo/fragments/colorBall" (dict "color" (langColor .)) }} 84 <span>{{ . }}</span> 85 </div> 86 {{ end }} 87 {{ with .Repo.RepoStats.StarCount }} 88 <div class="flex gap-1 items-center text-sm"> 89 {{ i "star" "w-3 h-3 fill-current" }} 90 <span>{{ . }}</span> 91 </div> 92 {{ end }} 93 {{ with .Repo.RepoStats.IssueCount.Open }} 94 <div class="flex gap-1 items-center text-sm"> 95 {{ i "circle-dot" "w-3 h-3" }} 96 <span>{{ . }}</span> 97 </div> 98 {{ end }} 99 {{ with .Repo.RepoStats.PullCount.Open }} 100 <div class="flex gap-1 items-center text-sm"> 101 {{ i "git-pull-request" "w-3 h-3" }} 102 <span>{{ . }}</span> 103 </div> 104 {{ end }} 105 </div> 106 {{ end }} 107 </div> 108 109 {{ with .Repo.Description }} 110 <div class="pl-6 pb-2 text-gray-600 dark:text-gray-300 text-sm line-clamp-2"> 111 {{ . | description }} 112 </div> 113 {{ end }} 114 115 {{ if gt (len .Issues) 0 }} 116 <div class="grid grid-cols-1 rounded-b border-b border-t border-gray-200 dark:border-gray-900 divide-y divide-gray-200 dark:divide-gray-900"> 117 {{ range .Issues }} 118 <a href="/{{ resolve .Repo.Did }}/{{ .Repo.Name }}/issues/{{ .IssueId }}" class="no-underline hover:no-underline hover:bg-gray-100/25 hover:dark:bg-gray-700/25"> 119 <div class="py-2 px-6"> 120 <div class="flex-grow min-w-0 w-full"> 121 <div class="flex text-sm items-center justify-between w-full"> 122 <div class="flex items-center gap-2 min-w-0 flex-1 pr-2"> 123 <span class="truncate text-sm text-gray-800 dark:text-gray-200"> 124 <span class="text-gray-500 dark:text-gray-400">#{{ .IssueId }}</span> 125 {{ .Title | description }} 126 </span> 127 </div> 128 <div class="flex-shrink-0 flex items-center gap-2 text-gray-500 dark:text-gray-400"> 129 <span> 130 <div class="inline-flex items-center gap-1"> 131 {{ i "message-square" "w-3 h-3" }} 132 {{ len .Comments }} 133 </div> 134 </span> 135 <span class="before:content-['·'] before:select-none"></span> 136 <span class="text-sm"> 137 {{ template "repo/fragments/shortTimeAgo" .Created }} 138 </span> 139 <div class="hidden md:inline-flex md:gap-1"> 140 {{ $labelState := .Labels }} 141 {{ range $k, $d := $.LabelDefs }} 142 {{ range $v, $s := $labelState.GetValSet $d.AtUri.String }} 143 {{ template "labels/fragments/label" (dict "def" $d "val" $v "withPrefix" true) }} 144 {{ end }} 145 {{ end }} 146 </div> 147 </div> 148 </div> 149 </div> 150 </div> 151 </a> 152 {{ end }} 153 </div> 154 {{ end }} 155 </div> 156 {{ end }} 157 158 {{ if or (gt .Page.Offset 0) (eq (len .RepoGroups) .Page.Limit) }} 159 <div class="flex justify-center mt-8"> 160 <div class="flex gap-2"> 161 {{ if gt .Page.Offset 0 }} 162 {{ $prev := .Page.Previous }} 163 <a 164 class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700" 165 hx-boost="true" 166 href="/goodfirstissues?offset={{ $prev.Offset }}&limit={{ $prev.Limit }}" 167 > 168 {{ i "chevron-left" "w-4 h-4" }} 169 previous 170 </a> 171 {{ else }} 172 <div></div> 173 {{ end }} 174 175 {{ if eq (len .RepoGroups) .Page.Limit }} 176 {{ $next := .Page.Next }} 177 <a 178 class="btn flex items-center gap-2 no-underline hover:no-underline dark:text-white dark:hover:bg-gray-700" 179 hx-boost="true" 180 href="/goodfirstissues?offset={{ $next.Offset }}&limit={{ $next.Limit }}" 181 > 182 next 183 {{ i "chevron-right" "w-4 h-4" }} 184 </a> 185 {{ end }} 186 </div> 187 </div> 188 {{ end }} 189 {{ end }} 190 </div> 191</div> 192{{ end }}