|
6 | 6 | import { ChevronRight } from "@lucide/svelte"; |
7 | 7 | import type { GitHubRelease } from "$lib/server/github-cache"; |
8 | 8 | import type { CategorizedPackage } from "$lib/server/package-discoverer"; |
9 | | - import type { Prettify } from "$lib/types"; |
| 9 | + import { type PackageSettings, type Prettify, releasesTypes } from "$lib/types"; |
10 | 10 | import { cn } from "$lib/utils"; |
11 | 11 | import { Badge } from "$lib/components/ui/badge"; |
12 | 12 | import * as Card from "$lib/components/ui/card"; |
13 | 13 | import { Checkbox } from "$lib/components/ui/checkbox"; |
14 | 14 | import { Label } from "$lib/components/ui/label"; |
15 | 15 | import { Separator } from "$lib/components/ui/separator"; |
| 16 | + import * as ToggleGroup from "$lib/components/ui/toggle-group"; |
| 17 | + import { DEFAULT_SETTINGS } from "./settings.svelte"; |
16 | 18 |
|
17 | 19 | type CleanRelease = { cleanName: string; cleanVersion: string } & GitHubRelease; |
18 | 20 |
|
|
41 | 43 | | undefined |
42 | 44 | >; |
43 | 45 | }; |
44 | | - showPrereleases?: boolean; |
| 46 | + settings?: PackageSettings; |
45 | 47 | headless?: boolean; |
46 | 48 | class?: ClassValue; |
47 | 49 | }; |
48 | 50 | let { |
49 | 51 | packageName = "", |
50 | 52 | allPackages = [], |
51 | | - showPrereleases = $bindable(true), |
52 | 53 | otherReleases = {}, |
| 54 | + settings = $bindable(DEFAULT_SETTINGS), |
53 | 55 | headless = false, |
54 | 56 | class: className |
55 | 57 | }: Props = $props(); |
|
222 | 224 | </Card.Content> |
223 | 225 | </Card.Root> |
224 | 226 | {#if headless} |
225 | | - <Separator class="my-4" /> |
| 227 | + <Separator class="my-4 rounded-full data-[orientation=horizontal]:h-1" /> |
| 228 | + <h3 class="mb-6 text-xl font-semibold tracking-tight text-primary">Visibility settings</h3> |
226 | 229 | {/if} |
227 | 230 | <div |
228 | 231 | class={[ |
229 | | - "flex items-center gap-2", |
| 232 | + "flex flex-col gap-2", |
230 | 233 | !headless && "-mt-2 rounded-b-xl border-x border-b bg-card px-4 pt-5 pb-2.5" |
231 | 234 | ]} |
232 | 235 | > |
233 | | - <Checkbox |
234 | | - id="beta-releases-{id}" |
235 | | - aria-labelledby="beta-releases-label-{id}" |
236 | | - bind:checked={showPrereleases} |
237 | | - /> |
238 | | - <Label |
239 | | - id="beta-releases-label-{id}" |
240 | | - for="beta-releases-{id}" |
241 | | - class="text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" |
242 | | - > |
243 | | - Show {packageName} prereleases |
244 | | - </Label> |
| 236 | + <!-- Prereleases toggle --> |
| 237 | + <div class="flex items-center gap-2"> |
| 238 | + <Checkbox |
| 239 | + id="beta-releases-{id}" |
| 240 | + aria-labelledby="beta-releases-label-{id}" |
| 241 | + bind:checked={ |
| 242 | + () => settings.showPrereleases ?? DEFAULT_SETTINGS.showPrereleases, |
| 243 | + newState => (settings.showPrereleases = newState) |
| 244 | + } |
| 245 | + /> |
| 246 | + <Label |
| 247 | + id="beta-releases-label-{id}" |
| 248 | + for="beta-releases-{id}" |
| 249 | + class="text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" |
| 250 | + > |
| 251 | + Show {packageName} prereleases |
| 252 | + </Label> |
| 253 | + </div> |
| 254 | + |
| 255 | + <Separator class="mt-0.5" /> |
| 256 | + |
| 257 | + <!-- Version filtering --> |
| 258 | + <div class="flex items-center gap-2"> |
| 259 | + <span class="text-sm leading-none font-medium text-nowrap">Show release types:</span> |
| 260 | + <ToggleGroup.Root |
| 261 | + type="single" |
| 262 | + bind:value={ |
| 263 | + () => settings.releasesType ?? DEFAULT_SETTINGS.releasesType, |
| 264 | + newType => { |
| 265 | + // don't take in account deselections, naturally always leaving something selected |
| 266 | + if (newType) settings.releasesType = newType; |
| 267 | + } |
| 268 | + } |
| 269 | + size="sm" |
| 270 | + class="w-full" |
| 271 | + > |
| 272 | + {#each releasesTypes as releaseType (releaseType.toLowerCase())} |
| 273 | + <ToggleGroup.Item value={releaseType.toLowerCase()} class="h-auto py-0.5"> |
| 274 | + {releaseType} |
| 275 | + </ToggleGroup.Item> |
| 276 | + {/each} |
| 277 | + </ToggleGroup.Root> |
| 278 | + </div> |
245 | 279 | </div> |
246 | 280 | </div> |
0 commit comments