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 }}