···1515 command: |
1616 go mod download
1717 go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2
1818+ go generate ./...
18191920 - name: Run Linter
2021 environment:
+1
.tangled/workflows/tests.yml
···1414 CGO_ENABLED: 1
1515 command: |
1616 go mod download
1717+ go generate ./...
17181819 - name: Run Tests
1920 environment:
+51
pkg/appview/templates/components/card-grid.html
···11+{{ define "card-grid" }}
22+{{/*
33+ Card grid component - displays repository cards in a responsive grid
44+55+ Required:
66+ - .Repositories: []db.RepoCardData - list of repositories to display
77+88+ Optional:
99+ - .Columns: int - number of columns on xl screens (3 or 4, default 3)
1010+ - .EmptyMessage: string - message when no repositories (default: "No repositories found.")
1111+ - .EmptyIcon: string - lucide icon name for empty state
1212+ - .EmptySubtext: string - secondary text for empty state
1313+ - .LoadMoreURL: string - URL for Load More button (HTMX)
1414+ - .TargetID: string - HTMX target ID for Load More
1515+ - .HasMore: bool - whether to show Load More button
1616+*/}}
1717+{{ if .Repositories }}
1818+<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3{{ if eq .Columns 4 }} xl:grid-cols-4{{ end }} gap-6">
1919+ {{ range .Repositories }}
2020+ {{ template "repo-card" . }}
2121+ {{ end }}
2222+</div>
2323+{{ if and .HasMore .LoadMoreURL }}
2424+<div class="mt-6 text-center">
2525+ <button
2626+ class="btn btn-outline"
2727+ hx-get="{{ .LoadMoreURL }}"
2828+ hx-trigger="click"
2929+ hx-target="#{{ .TargetID }}"
3030+ hx-swap="beforeend"
3131+ >
3232+ Load More
3333+ </button>
3434+</div>
3535+{{ end }}
3636+{{ else }}
3737+<div class="py-12 text-center">
3838+ {{ if .EmptyIcon }}
3939+ <div class="text-base-content/60 mb-4">
4040+ <i data-lucide="{{ .EmptyIcon }}" class="size-12 mx-auto mb-4"></i>
4141+ <p class="text-lg">{{ or .EmptyMessage "No repositories found." }}</p>
4242+ </div>
4343+ {{ if .EmptySubtext }}
4444+ <p class="text-base-content/40 text-sm">{{ .EmptySubtext }}</p>
4545+ {{ end }}
4646+ {{ else }}
4747+ <p class="text-base-content/60">{{ or .EmptyMessage "No repositories found." }}</p>
4848+ {{ end }}
4949+</div>
5050+{{ end }}
5151+{{ end }}
···8989 <p>If you are located in the European Economic Area (EEA), you have the following rights:</p>
90909191 <h3 class="text-lg font-medium mt-4">Right to Access</h3>
9292- <p>You may request a copy of all personal data we store about you. This includes:</p>
9292+ <p>You may export a copy of all personal data we store about you via the "Export Data" button in your account settings. This export includes:</p>
9393 <ul class="list-disc list-inside space-y-1 ml-4">
9494 <li>Layer records associated with your DID on our PDS</li>
9595- <li>Server logs containing your handle, DID, IP address, or actions (if retained)</li>
9695 <li>OAuth tokens, web UI sessions, and device tokens</li>
9796 <li>Cached PDS data</li>
9897 <li>List of registered devices (credential helper)</li>
9998 </ul>
9999+ <p class="mt-2">For data not included in the self-service export (such as server logs), contact us and we will respond within 30 days.</p>
100100 <p class="text-base-content/70 text-sm mt-2">Note: Data stored on your own PDS is already under your control and accessible to you directly.</p>
101101102102 <h3 class="text-lg font-medium mt-6">Right to Erasure ("Right to be Forgotten")</h3>
···156156 <p>If you are a California resident, you have the following rights under the California Consumer Privacy Act:</p>
157157158158 <h3 class="text-lg font-medium mt-4">Right to Know</h3>
159159- <p>You may request disclosure of:</p>
159159+ <p>You may export a copy of your personal data via the "Export Data" button in your account settings. You may also request disclosure of:</p>
160160 <ul class="list-disc list-inside space-y-1 ml-4">
161161 <li>The categories of personal information we collect</li>
162162 <li>The purposes for which we use your personal information</li>
163163 <li>The categories of third parties with whom we share your personal information</li>
164164 </ul>
165165+ <p class="mt-2">For data not included in the self-service export (such as server logs), contact us and we will respond within 30 days.</p>
165166166167 <h3 class="text-lg font-medium mt-6">Right to Delete</h3>
167168 <p>You may delete your personal information via the account settings page, subject to the same technical limitations described in the GDPR section above. For data not accessible through self-service, we will respond to requests within 45 days, except where retention is necessary for:</p>
···305306 <h3 class="text-lg font-medium mt-4">Self-Service (via Settings)</h3>
306307 <p>Most data management can be done directly through your account settings at {{ .RegistryURL }}:</p>
307308 <ul class="list-disc list-inside space-y-1 ml-4">
309309+ <li><strong>Export your data:</strong> Use the "Export Data" button in settings to download a copy of all personal data we store about you.</li>
308310 <li><strong>Delete your data:</strong> Use the "Delete Account" button in settings. This will remove your layer records, cached data, and authentication tokens. You may also choose to have us delete <code class="bg-base-200 px-1.5 py-0.5 rounded text-sm font-mono">io.atcr.*</code> records from your PDS (requires active OAuth session).</li>
309311 <li><strong>Revoke device tokens:</strong> Manage and revoke credential helper devices in settings.</li>
310312 <li><strong>Update your data:</strong> Corrections happen through normal use of the service.</li>
+2-8
pkg/appview/templates/pages/user.html
···5353 <div class="text-center text-base-content/60 py-12">
5454 <p>This user hasn't set up their ATCR profile yet.</p>
5555 </div>
5656- {{ else if .Repositories }}
5757- <div class="w-full grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
5858- {{ range .Repositories }}
5959- {{ template "repo-card" . }}
6060- {{ end }}
6161- </div>
6256 {{ else }}
6363- <div class="text-center text-base-content/60 py-12">
6464- <p>No images yet.</p>
5757+ <div class="w-full">
5858+ {{ template "card-grid" (dict "Repositories" .Repositories "EmptyMessage" "No images yet.") }}
6559 </div>
6660 {{ end }}
6761 </div>