WIP. A little custom music server
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

migrate to oxfmt

+469 -455
+11
.oxfmtrc.jsonc
··· 1 + { 2 + "$schema": "./node_modules/oxfmt/configuration_schema.json", 3 + "tabWidth": 4, 4 + "useTabs": true, 5 + "printWidth": 120, 6 + "semi": true, 7 + //"experimentalOperatorPosition": "start", 8 + "quoteProps": "preserve", 9 + "objectWrap": "preserve", 10 + "bracketSameLine": false 11 + }
-10
.prettierrc.toml
··· 1 - tabWidth = 4 2 - useTabs = true 3 - printWidth = 120 4 - semi = true 5 - experimentalOperatorPosition = "start" 6 - quoteProps = "consistent" 7 - objectWrap = "preserve" 8 - bracketSameLine = false 9 - 10 - plugins = ['@prettier/plugin-oxc']
+1 -1
backend/src/flac/errors.ts
··· 1 1 import { Data } from "effect"; 2 2 3 - export class FlacError extends Data.TaggedError("FlacError")<{ message: string; cause?: unknown }> {} 3 + export class FlacError extends Data.TaggedError("FlacError")<{ message: string; cause?: unknown }> {}
+10 -2
backend/src/flac/transformers.ts
··· 99 99 // Validate number of fields to prevent DoS 100 100 if (numberOfFields > MAX_VORBIS_FIELDS) { 101 101 return yield* ParseResult.fail( 102 - new ParseResult.Type(ast, uint8Array, `Too many fields: ${numberOfFields} (max ${MAX_VORBIS_FIELDS})`), 102 + new ParseResult.Type( 103 + ast, 104 + uint8Array, 105 + `Too many fields: ${numberOfFields} (max ${MAX_VORBIS_FIELDS})`, 106 + ), 103 107 ); 104 108 } 105 109 ··· 111 115 // Bounds check: ensure we can read field length 112 116 if (cursor + 4 > length) { 113 117 return yield* ParseResult.fail( 114 - new ParseResult.Type(ast, uint8Array, `Buffer too short to read field ${i} length at cursor ${cursor}`), 118 + new ParseResult.Type( 119 + ast, 120 + uint8Array, 121 + `Buffer too short to read field ${i} length at cursor ${cursor}`, 122 + ), 115 123 ); 116 124 } 117 125
+24 -5
bun.lock
··· 3 3 "workspaces": { 4 4 "": { 5 5 "name": "boombox", 6 + "devDependencies": { 7 + "oxfmt": "^0.16.0", 8 + }, 6 9 }, 7 10 "backend": { 8 11 "name": "@boombox/backend", ··· 420 423 421 424 "@oxc-project/types": ["@oxc-project/types@0.74.0", "", {}, "sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ=="], 422 425 426 + "@oxfmt/darwin-arm64": ["@oxfmt/darwin-arm64@0.16.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-I+Unj7wePcUTK7p/YKtgbm4yer6dw7dTlmCJa0UilFZyge5uD4rwCSfSDx3A+a6Z3A60/SqXMbNR2UyidWF4Cg=="], 427 + 428 + "@oxfmt/darwin-x64": ["@oxfmt/darwin-x64@0.16.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-EfiXFKEOV5gXgEatFK89OOoSmd8E9Xq83TcjPLWQNFBO4cgaQsfKmctpgJmJjQnoUwD7nQsm0ruj3ae7Gva8QA=="], 429 + 430 + "@oxfmt/linux-arm64-gnu": ["@oxfmt/linux-arm64-gnu@0.16.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ydcNY9Fn/8TjVswANhdSh+zdgD3tiikNQA68bgXbENHuV3RyYql1qoOM1eGv5xeIVJfkPJme17MKQz3OwMFS4A=="], 431 + 432 + "@oxfmt/linux-arm64-musl": ["@oxfmt/linux-arm64-musl@0.16.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-I9WeYe1/YnrfXgXVaKkZITZzil0G0g9IknS2KJbq1lOnpTw3dwViXZ7XMa2cq6Mv7S+4SoDImb7fLQ59AfVX/w=="], 433 + 434 + "@oxfmt/linux-x64-gnu": ["@oxfmt/linux-x64-gnu@0.16.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Szg9lJtZdN5FoCnNbl3N/2pJv8d056NUmk51m60E2tZV7rvwRTrNC8HPc2sVdb1Ti5ogsicpZDYSWA3cwIrJIQ=="], 435 + 436 + "@oxfmt/linux-x64-musl": ["@oxfmt/linux-x64-musl@0.16.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5koN8nl21ZxOADaMxXHT+mt3YjfXe1nsa23Fanf9aY7B0hcQ6rXYCZ7r5vmpoTtzW/US3aaVcRFZE1cyof+lKw=="], 437 + 438 + "@oxfmt/win32-arm64": ["@oxfmt/win32-arm64@0.16.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Jaesn+FYn+MudSmWJMPGBAa0PhQXo52Z0ZYeNfzbQP7v2GFbZBI3Cb87+K0aHGlpqK3VEJKXeIaASaTWlkgO1Q=="], 439 + 440 + "@oxfmt/win32-x64": ["@oxfmt/win32-x64@0.16.0", "", { "os": "win32", "cpu": "x64" }, "sha512-1obVSlb5blwBKgSsE1mNxvcq1pK9I6aXpZDy5d6jjGdrru33dHrH1ASChrcxwCukkToH2SxwYmnzAto0xeuZlw=="], 441 + 423 442 "@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@1.26.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kTmm1opqyn7iZopWHO3Ml4D/44pA5eknZBepgxCnTaPrW8XgCEUI85Q5AvOOvoNve8NziTYb8ax+CyuGJIgn/Q=="], 424 443 425 444 "@oxlint/darwin-x64": ["@oxlint/darwin-x64@1.26.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-/hMfZ9j7ZzVPRmMm02PHNc6MIMk0QYv5VowZJRIp40YLqLPvFfGNGZBj8e1fDVgZMFEGWDQK3yrt1uBKxXAK4Q=="], ··· 920 939 921 940 "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], 922 941 923 - "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], 942 + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 924 943 925 944 "diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="], 926 945 ··· 1280 1299 1281 1300 "oxc-parser": ["oxc-parser@0.74.0", "", { "dependencies": { "@oxc-project/types": "^0.74.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm64": "0.74.0", "@oxc-parser/binding-darwin-arm64": "0.74.0", "@oxc-parser/binding-darwin-x64": "0.74.0", "@oxc-parser/binding-freebsd-x64": "0.74.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.74.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.74.0", "@oxc-parser/binding-linux-arm64-gnu": "0.74.0", "@oxc-parser/binding-linux-arm64-musl": "0.74.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.74.0", "@oxc-parser/binding-linux-s390x-gnu": "0.74.0", "@oxc-parser/binding-linux-x64-gnu": "0.74.0", "@oxc-parser/binding-linux-x64-musl": "0.74.0", "@oxc-parser/binding-wasm32-wasi": "0.74.0", "@oxc-parser/binding-win32-arm64-msvc": "0.74.0", "@oxc-parser/binding-win32-x64-msvc": "0.74.0" } }, "sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw=="], 1282 1301 1302 + "oxfmt": ["oxfmt@0.16.0", "", { "optionalDependencies": { "@oxfmt/darwin-arm64": "0.16.0", "@oxfmt/darwin-x64": "0.16.0", "@oxfmt/linux-arm64-gnu": "0.16.0", "@oxfmt/linux-arm64-musl": "0.16.0", "@oxfmt/linux-x64-gnu": "0.16.0", "@oxfmt/linux-x64-musl": "0.16.0", "@oxfmt/win32-arm64": "0.16.0", "@oxfmt/win32-x64": "0.16.0" }, "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-uRnnBAN0zH07FXSfvSKbIw+Jrohv4Px2RwNiZOGI4/pvns4sx0+k4WSt+tqwd7bDeoWaXiGmhZgnbK63hi6hVQ=="], 1303 + 1283 1304 "oxlint": ["oxlint@1.26.0", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "1.26.0", "@oxlint/darwin-x64": "1.26.0", "@oxlint/linux-arm64-gnu": "1.26.0", "@oxlint/linux-arm64-musl": "1.26.0", "@oxlint/linux-x64-gnu": "1.26.0", "@oxlint/linux-x64-musl": "1.26.0", "@oxlint/win32-arm64": "1.26.0", "@oxlint/win32-x64": "1.26.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.4.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-KRpL+SMi07JQyggv5ldIF+wt2pnrKm8NLW0B+8bK+0HZsLmH9/qGA+qMWie5Vf7lnlMBllJmsuzHaKFEGY3rIA=="], 1284 1305 1285 1306 "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], ··· 1598 1619 1599 1620 "@modelcontextprotocol/sdk/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], 1600 1621 1622 + "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], 1623 + 1601 1624 "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], 1602 1625 1603 1626 "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], ··· 1648 1671 1649 1672 "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], 1650 1673 1651 - "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 1652 - 1653 1674 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 1654 - 1655 - "node-gyp-build-optional-packages/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], 1656 1675 1657 1676 "parse5-htmlparser2-tree-adapter/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], 1658 1677
+3
package.json
··· 10 10 "dev": "bun --filter '*' dev", 11 11 "db:migrate": "bun --filter @boombox/backend db:migrate", 12 12 "db:gen": "bun --filter @boombox/backend db:gen" 13 + }, 14 + "devDependencies": { 15 + "oxfmt": "^0.16.0" 13 16 } 14 17 }
+1 -3
shared/index.ts
··· 1 - export * from "./types" 2 - 3 - 1 + export * from "./types";
+43 -51
web/src/components/ui/button.tsx
··· 1 - import * as React from "react" 2 - import { Slot } from "@radix-ui/react-slot" 3 - import { cva, type VariantProps } from "class-variance-authority" 1 + import * as React from "react"; 2 + import { Slot } from "@radix-ui/react-slot"; 3 + import { cva, type VariantProps } from "class-variance-authority"; 4 4 5 - import { cn } from "@/lib/utils" 5 + import { cn } from "@/lib/utils"; 6 6 7 7 const buttonVariants = cva( 8 - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", 9 - { 10 - variants: { 11 - variant: { 12 - default: "bg-primary text-primary-foreground hover:bg-primary/90", 13 - destructive: 14 - "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", 15 - outline: 16 - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", 17 - secondary: 18 - "bg-secondary text-secondary-foreground hover:bg-secondary/80", 19 - ghost: 20 - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", 21 - link: "text-primary underline-offset-4 hover:underline", 22 - }, 23 - size: { 24 - default: "h-9 px-4 py-2 has-[>svg]:px-3", 25 - sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", 26 - lg: "h-10 rounded-md px-6 has-[>svg]:px-4", 27 - icon: "size-9", 28 - "icon-sm": "size-8", 29 - "icon-lg": "size-10", 30 - }, 31 - }, 32 - defaultVariants: { 33 - variant: "default", 34 - size: "default", 35 - }, 36 - } 37 - ) 8 + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", 9 + { 10 + variants: { 11 + variant: { 12 + default: "bg-primary text-primary-foreground hover:bg-primary/90", 13 + destructive: 14 + "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", 15 + outline: 16 + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", 17 + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", 18 + ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", 19 + link: "text-primary underline-offset-4 hover:underline", 20 + }, 21 + size: { 22 + default: "h-9 px-4 py-2 has-[>svg]:px-3", 23 + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", 24 + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", 25 + icon: "size-9", 26 + "icon-sm": "size-8", 27 + "icon-lg": "size-10", 28 + }, 29 + }, 30 + defaultVariants: { 31 + variant: "default", 32 + size: "default", 33 + }, 34 + }, 35 + ); 38 36 39 37 function Button({ 40 - className, 41 - variant, 42 - size, 43 - asChild = false, 44 - ...props 38 + className, 39 + variant, 40 + size, 41 + asChild = false, 42 + ...props 45 43 }: React.ComponentProps<"button"> & 46 - VariantProps<typeof buttonVariants> & { 47 - asChild?: boolean 48 - }) { 49 - const Comp = asChild ? Slot : "button" 44 + VariantProps<typeof buttonVariants> & { 45 + asChild?: boolean; 46 + }) { 47 + const Comp = asChild ? Slot : "button"; 50 48 51 - return ( 52 - <Comp 53 - data-slot="button" 54 - className={cn(buttonVariants({ variant, size, className }))} 55 - {...props} 56 - /> 57 - ) 49 + return <Comp data-slot="button" className={cn(buttonVariants({ variant, size, className }))} {...props} />; 58 50 } 59 51 60 - export { Button, buttonVariants } 52 + export { Button, buttonVariants };
+49 -54
web/src/components/ui/slider.tsx
··· 1 - import * as React from "react" 2 - import * as SliderPrimitive from "@radix-ui/react-slider" 1 + import * as React from "react"; 2 + import * as SliderPrimitive from "@radix-ui/react-slider"; 3 3 4 - import { cn } from "@/lib/utils" 4 + import { cn } from "@/lib/utils"; 5 5 6 6 function Slider({ 7 - className, 8 - defaultValue, 9 - value, 10 - min = 0, 11 - max = 100, 12 - ...props 7 + className, 8 + defaultValue, 9 + value, 10 + min = 0, 11 + max = 100, 12 + ...props 13 13 }: React.ComponentProps<typeof SliderPrimitive.Root>) { 14 - const _values = React.useMemo( 15 - () => 16 - Array.isArray(value) 17 - ? value 18 - : Array.isArray(defaultValue) 19 - ? defaultValue 20 - : [min, max], 21 - [value, defaultValue, min, max] 22 - ) 14 + const _values = React.useMemo( 15 + () => (Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max]), 16 + [value, defaultValue, min, max], 17 + ); 23 18 24 - return ( 25 - <SliderPrimitive.Root 26 - data-slot="slider" 27 - defaultValue={defaultValue} 28 - value={value} 29 - min={min} 30 - max={max} 31 - className={cn( 32 - "relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", 33 - className 34 - )} 35 - {...props} 36 - > 37 - <SliderPrimitive.Track 38 - data-slot="slider-track" 39 - className={cn( 40 - "bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5" 41 - )} 42 - > 43 - <SliderPrimitive.Range 44 - data-slot="slider-range" 45 - className={cn( 46 - "bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full" 47 - )} 48 - /> 49 - </SliderPrimitive.Track> 50 - {Array.from({ length: _values.length }, (_, index) => ( 51 - <SliderPrimitive.Thumb 52 - data-slot="slider-thumb" 53 - key={index} 54 - className="border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50" 55 - /> 56 - ))} 57 - </SliderPrimitive.Root> 58 - ) 19 + return ( 20 + <SliderPrimitive.Root 21 + data-slot="slider" 22 + defaultValue={defaultValue} 23 + value={value} 24 + min={min} 25 + max={max} 26 + className={cn( 27 + "relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", 28 + className, 29 + )} 30 + {...props} 31 + > 32 + <SliderPrimitive.Track 33 + data-slot="slider-track" 34 + className={cn( 35 + "bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5", 36 + )} 37 + > 38 + <SliderPrimitive.Range 39 + data-slot="slider-range" 40 + className={cn( 41 + "bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full", 42 + )} 43 + /> 44 + </SliderPrimitive.Track> 45 + {Array.from({ length: _values.length }, (_, index) => ( 46 + <SliderPrimitive.Thumb 47 + data-slot="slider-thumb" 48 + key={index} 49 + className="border-primary ring-ring/50 block size-4 shrink-0 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50" 50 + /> 51 + ))} 52 + </SliderPrimitive.Root> 53 + ); 59 54 } 60 55 61 - export { Slider } 56 + export { Slider };
+321 -323
web/src/routeTree.gen.ts
··· 8 8 // You should NOT make any changes in this file as it will be overwritten. 9 9 // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. 10 10 11 - import { Route as rootRouteImport } from './routes/__root' 12 - import { Route as McpRouteImport } from './routes/mcp' 13 - import { Route as IndexRouteImport } from './routes/index' 14 - import { Route as AlbumIndexRouteImport } from './routes/album/index' 15 - import { Route as DemoTanstackQueryRouteImport } from './routes/demo/tanstack-query' 16 - import { Route as DemoMcpTodosRouteImport } from './routes/demo/mcp-todos' 17 - import { Route as AlbumAlbumIdRouteImport } from './routes/album/$albumId' 18 - import { Route as DemoStartServerFuncsRouteImport } from './routes/demo/start.server-funcs' 19 - import { Route as DemoStartApiRequestRouteImport } from './routes/demo/start.api-request' 20 - import { Route as DemoApiTqTodosRouteImport } from './routes/demo/api.tq-todos' 21 - import { Route as DemoApiNamesRouteImport } from './routes/demo/api.names' 22 - import { Route as DemoApiMcpTodosRouteImport } from './routes/demo/api.mcp-todos' 23 - import { Route as DemoStartSsrIndexRouteImport } from './routes/demo/start.ssr.index' 24 - import { Route as DemoStartSsrSpaModeRouteImport } from './routes/demo/start.ssr.spa-mode' 25 - import { Route as DemoStartSsrFullSsrRouteImport } from './routes/demo/start.ssr.full-ssr' 26 - import { Route as DemoStartSsrDataOnlyRouteImport } from './routes/demo/start.ssr.data-only' 11 + import { Route as rootRouteImport } from "./routes/__root"; 12 + import { Route as McpRouteImport } from "./routes/mcp"; 13 + import { Route as IndexRouteImport } from "./routes/index"; 14 + import { Route as AlbumIndexRouteImport } from "./routes/album/index"; 15 + import { Route as DemoTanstackQueryRouteImport } from "./routes/demo/tanstack-query"; 16 + import { Route as DemoMcpTodosRouteImport } from "./routes/demo/mcp-todos"; 17 + import { Route as AlbumAlbumIdRouteImport } from "./routes/album/$albumId"; 18 + import { Route as DemoStartServerFuncsRouteImport } from "./routes/demo/start.server-funcs"; 19 + import { Route as DemoStartApiRequestRouteImport } from "./routes/demo/start.api-request"; 20 + import { Route as DemoApiTqTodosRouteImport } from "./routes/demo/api.tq-todos"; 21 + import { Route as DemoApiNamesRouteImport } from "./routes/demo/api.names"; 22 + import { Route as DemoApiMcpTodosRouteImport } from "./routes/demo/api.mcp-todos"; 23 + import { Route as DemoStartSsrIndexRouteImport } from "./routes/demo/start.ssr.index"; 24 + import { Route as DemoStartSsrSpaModeRouteImport } from "./routes/demo/start.ssr.spa-mode"; 25 + import { Route as DemoStartSsrFullSsrRouteImport } from "./routes/demo/start.ssr.full-ssr"; 26 + import { Route as DemoStartSsrDataOnlyRouteImport } from "./routes/demo/start.ssr.data-only"; 27 27 28 28 const McpRoute = McpRouteImport.update({ 29 - id: '/mcp', 30 - path: '/mcp', 31 - getParentRoute: () => rootRouteImport, 32 - } as any) 29 + id: "/mcp", 30 + path: "/mcp", 31 + getParentRoute: () => rootRouteImport, 32 + } as any); 33 33 const IndexRoute = IndexRouteImport.update({ 34 - id: '/', 35 - path: '/', 36 - getParentRoute: () => rootRouteImport, 37 - } as any) 34 + id: "/", 35 + path: "/", 36 + getParentRoute: () => rootRouteImport, 37 + } as any); 38 38 const AlbumIndexRoute = AlbumIndexRouteImport.update({ 39 - id: '/album/', 40 - path: '/album/', 41 - getParentRoute: () => rootRouteImport, 42 - } as any) 39 + id: "/album/", 40 + path: "/album/", 41 + getParentRoute: () => rootRouteImport, 42 + } as any); 43 43 const DemoTanstackQueryRoute = DemoTanstackQueryRouteImport.update({ 44 - id: '/demo/tanstack-query', 45 - path: '/demo/tanstack-query', 46 - getParentRoute: () => rootRouteImport, 47 - } as any) 44 + id: "/demo/tanstack-query", 45 + path: "/demo/tanstack-query", 46 + getParentRoute: () => rootRouteImport, 47 + } as any); 48 48 const DemoMcpTodosRoute = DemoMcpTodosRouteImport.update({ 49 - id: '/demo/mcp-todos', 50 - path: '/demo/mcp-todos', 51 - getParentRoute: () => rootRouteImport, 52 - } as any) 49 + id: "/demo/mcp-todos", 50 + path: "/demo/mcp-todos", 51 + getParentRoute: () => rootRouteImport, 52 + } as any); 53 53 const AlbumAlbumIdRoute = AlbumAlbumIdRouteImport.update({ 54 - id: '/album/$albumId', 55 - path: '/album/$albumId', 56 - getParentRoute: () => rootRouteImport, 57 - } as any) 54 + id: "/album/$albumId", 55 + path: "/album/$albumId", 56 + getParentRoute: () => rootRouteImport, 57 + } as any); 58 58 const DemoStartServerFuncsRoute = DemoStartServerFuncsRouteImport.update({ 59 - id: '/demo/start/server-funcs', 60 - path: '/demo/start/server-funcs', 61 - getParentRoute: () => rootRouteImport, 62 - } as any) 59 + id: "/demo/start/server-funcs", 60 + path: "/demo/start/server-funcs", 61 + getParentRoute: () => rootRouteImport, 62 + } as any); 63 63 const DemoStartApiRequestRoute = DemoStartApiRequestRouteImport.update({ 64 - id: '/demo/start/api-request', 65 - path: '/demo/start/api-request', 66 - getParentRoute: () => rootRouteImport, 67 - } as any) 64 + id: "/demo/start/api-request", 65 + path: "/demo/start/api-request", 66 + getParentRoute: () => rootRouteImport, 67 + } as any); 68 68 const DemoApiTqTodosRoute = DemoApiTqTodosRouteImport.update({ 69 - id: '/demo/api/tq-todos', 70 - path: '/demo/api/tq-todos', 71 - getParentRoute: () => rootRouteImport, 72 - } as any) 69 + id: "/demo/api/tq-todos", 70 + path: "/demo/api/tq-todos", 71 + getParentRoute: () => rootRouteImport, 72 + } as any); 73 73 const DemoApiNamesRoute = DemoApiNamesRouteImport.update({ 74 - id: '/demo/api/names', 75 - path: '/demo/api/names', 76 - getParentRoute: () => rootRouteImport, 77 - } as any) 74 + id: "/demo/api/names", 75 + path: "/demo/api/names", 76 + getParentRoute: () => rootRouteImport, 77 + } as any); 78 78 const DemoApiMcpTodosRoute = DemoApiMcpTodosRouteImport.update({ 79 - id: '/demo/api/mcp-todos', 80 - path: '/demo/api/mcp-todos', 81 - getParentRoute: () => rootRouteImport, 82 - } as any) 79 + id: "/demo/api/mcp-todos", 80 + path: "/demo/api/mcp-todos", 81 + getParentRoute: () => rootRouteImport, 82 + } as any); 83 83 const DemoStartSsrIndexRoute = DemoStartSsrIndexRouteImport.update({ 84 - id: '/demo/start/ssr/', 85 - path: '/demo/start/ssr/', 86 - getParentRoute: () => rootRouteImport, 87 - } as any) 84 + id: "/demo/start/ssr/", 85 + path: "/demo/start/ssr/", 86 + getParentRoute: () => rootRouteImport, 87 + } as any); 88 88 const DemoStartSsrSpaModeRoute = DemoStartSsrSpaModeRouteImport.update({ 89 - id: '/demo/start/ssr/spa-mode', 90 - path: '/demo/start/ssr/spa-mode', 91 - getParentRoute: () => rootRouteImport, 92 - } as any) 89 + id: "/demo/start/ssr/spa-mode", 90 + path: "/demo/start/ssr/spa-mode", 91 + getParentRoute: () => rootRouteImport, 92 + } as any); 93 93 const DemoStartSsrFullSsrRoute = DemoStartSsrFullSsrRouteImport.update({ 94 - id: '/demo/start/ssr/full-ssr', 95 - path: '/demo/start/ssr/full-ssr', 96 - getParentRoute: () => rootRouteImport, 97 - } as any) 94 + id: "/demo/start/ssr/full-ssr", 95 + path: "/demo/start/ssr/full-ssr", 96 + getParentRoute: () => rootRouteImport, 97 + } as any); 98 98 const DemoStartSsrDataOnlyRoute = DemoStartSsrDataOnlyRouteImport.update({ 99 - id: '/demo/start/ssr/data-only', 100 - path: '/demo/start/ssr/data-only', 101 - getParentRoute: () => rootRouteImport, 102 - } as any) 99 + id: "/demo/start/ssr/data-only", 100 + path: "/demo/start/ssr/data-only", 101 + getParentRoute: () => rootRouteImport, 102 + } as any); 103 103 104 104 export interface FileRoutesByFullPath { 105 - '/': typeof IndexRoute 106 - '/mcp': typeof McpRoute 107 - '/album/$albumId': typeof AlbumAlbumIdRoute 108 - '/demo/mcp-todos': typeof DemoMcpTodosRoute 109 - '/demo/tanstack-query': typeof DemoTanstackQueryRoute 110 - '/album': typeof AlbumIndexRoute 111 - '/demo/api/mcp-todos': typeof DemoApiMcpTodosRoute 112 - '/demo/api/names': typeof DemoApiNamesRoute 113 - '/demo/api/tq-todos': typeof DemoApiTqTodosRoute 114 - '/demo/start/api-request': typeof DemoStartApiRequestRoute 115 - '/demo/start/server-funcs': typeof DemoStartServerFuncsRoute 116 - '/demo/start/ssr/data-only': typeof DemoStartSsrDataOnlyRoute 117 - '/demo/start/ssr/full-ssr': typeof DemoStartSsrFullSsrRoute 118 - '/demo/start/ssr/spa-mode': typeof DemoStartSsrSpaModeRoute 119 - '/demo/start/ssr': typeof DemoStartSsrIndexRoute 105 + "/": typeof IndexRoute; 106 + "/mcp": typeof McpRoute; 107 + "/album/$albumId": typeof AlbumAlbumIdRoute; 108 + "/demo/mcp-todos": typeof DemoMcpTodosRoute; 109 + "/demo/tanstack-query": typeof DemoTanstackQueryRoute; 110 + "/album": typeof AlbumIndexRoute; 111 + "/demo/api/mcp-todos": typeof DemoApiMcpTodosRoute; 112 + "/demo/api/names": typeof DemoApiNamesRoute; 113 + "/demo/api/tq-todos": typeof DemoApiTqTodosRoute; 114 + "/demo/start/api-request": typeof DemoStartApiRequestRoute; 115 + "/demo/start/server-funcs": typeof DemoStartServerFuncsRoute; 116 + "/demo/start/ssr/data-only": typeof DemoStartSsrDataOnlyRoute; 117 + "/demo/start/ssr/full-ssr": typeof DemoStartSsrFullSsrRoute; 118 + "/demo/start/ssr/spa-mode": typeof DemoStartSsrSpaModeRoute; 119 + "/demo/start/ssr": typeof DemoStartSsrIndexRoute; 120 120 } 121 121 export interface FileRoutesByTo { 122 - '/': typeof IndexRoute 123 - '/mcp': typeof McpRoute 124 - '/album/$albumId': typeof AlbumAlbumIdRoute 125 - '/demo/mcp-todos': typeof DemoMcpTodosRoute 126 - '/demo/tanstack-query': typeof DemoTanstackQueryRoute 127 - '/album': typeof AlbumIndexRoute 128 - '/demo/api/mcp-todos': typeof DemoApiMcpTodosRoute 129 - '/demo/api/names': typeof DemoApiNamesRoute 130 - '/demo/api/tq-todos': typeof DemoApiTqTodosRoute 131 - '/demo/start/api-request': typeof DemoStartApiRequestRoute 132 - '/demo/start/server-funcs': typeof DemoStartServerFuncsRoute 133 - '/demo/start/ssr/data-only': typeof DemoStartSsrDataOnlyRoute 134 - '/demo/start/ssr/full-ssr': typeof DemoStartSsrFullSsrRoute 135 - '/demo/start/ssr/spa-mode': typeof DemoStartSsrSpaModeRoute 136 - '/demo/start/ssr': typeof DemoStartSsrIndexRoute 122 + "/": typeof IndexRoute; 123 + "/mcp": typeof McpRoute; 124 + "/album/$albumId": typeof AlbumAlbumIdRoute; 125 + "/demo/mcp-todos": typeof DemoMcpTodosRoute; 126 + "/demo/tanstack-query": typeof DemoTanstackQueryRoute; 127 + "/album": typeof AlbumIndexRoute; 128 + "/demo/api/mcp-todos": typeof DemoApiMcpTodosRoute; 129 + "/demo/api/names": typeof DemoApiNamesRoute; 130 + "/demo/api/tq-todos": typeof DemoApiTqTodosRoute; 131 + "/demo/start/api-request": typeof DemoStartApiRequestRoute; 132 + "/demo/start/server-funcs": typeof DemoStartServerFuncsRoute; 133 + "/demo/start/ssr/data-only": typeof DemoStartSsrDataOnlyRoute; 134 + "/demo/start/ssr/full-ssr": typeof DemoStartSsrFullSsrRoute; 135 + "/demo/start/ssr/spa-mode": typeof DemoStartSsrSpaModeRoute; 136 + "/demo/start/ssr": typeof DemoStartSsrIndexRoute; 137 137 } 138 138 export interface FileRoutesById { 139 - __root__: typeof rootRouteImport 140 - '/': typeof IndexRoute 141 - '/mcp': typeof McpRoute 142 - '/album/$albumId': typeof AlbumAlbumIdRoute 143 - '/demo/mcp-todos': typeof DemoMcpTodosRoute 144 - '/demo/tanstack-query': typeof DemoTanstackQueryRoute 145 - '/album/': typeof AlbumIndexRoute 146 - '/demo/api/mcp-todos': typeof DemoApiMcpTodosRoute 147 - '/demo/api/names': typeof DemoApiNamesRoute 148 - '/demo/api/tq-todos': typeof DemoApiTqTodosRoute 149 - '/demo/start/api-request': typeof DemoStartApiRequestRoute 150 - '/demo/start/server-funcs': typeof DemoStartServerFuncsRoute 151 - '/demo/start/ssr/data-only': typeof DemoStartSsrDataOnlyRoute 152 - '/demo/start/ssr/full-ssr': typeof DemoStartSsrFullSsrRoute 153 - '/demo/start/ssr/spa-mode': typeof DemoStartSsrSpaModeRoute 154 - '/demo/start/ssr/': typeof DemoStartSsrIndexRoute 139 + __root__: typeof rootRouteImport; 140 + "/": typeof IndexRoute; 141 + "/mcp": typeof McpRoute; 142 + "/album/$albumId": typeof AlbumAlbumIdRoute; 143 + "/demo/mcp-todos": typeof DemoMcpTodosRoute; 144 + "/demo/tanstack-query": typeof DemoTanstackQueryRoute; 145 + "/album/": typeof AlbumIndexRoute; 146 + "/demo/api/mcp-todos": typeof DemoApiMcpTodosRoute; 147 + "/demo/api/names": typeof DemoApiNamesRoute; 148 + "/demo/api/tq-todos": typeof DemoApiTqTodosRoute; 149 + "/demo/start/api-request": typeof DemoStartApiRequestRoute; 150 + "/demo/start/server-funcs": typeof DemoStartServerFuncsRoute; 151 + "/demo/start/ssr/data-only": typeof DemoStartSsrDataOnlyRoute; 152 + "/demo/start/ssr/full-ssr": typeof DemoStartSsrFullSsrRoute; 153 + "/demo/start/ssr/spa-mode": typeof DemoStartSsrSpaModeRoute; 154 + "/demo/start/ssr/": typeof DemoStartSsrIndexRoute; 155 155 } 156 156 export interface FileRouteTypes { 157 - fileRoutesByFullPath: FileRoutesByFullPath 158 - fullPaths: 159 - | '/' 160 - | '/mcp' 161 - | '/album/$albumId' 162 - | '/demo/mcp-todos' 163 - | '/demo/tanstack-query' 164 - | '/album' 165 - | '/demo/api/mcp-todos' 166 - | '/demo/api/names' 167 - | '/demo/api/tq-todos' 168 - | '/demo/start/api-request' 169 - | '/demo/start/server-funcs' 170 - | '/demo/start/ssr/data-only' 171 - | '/demo/start/ssr/full-ssr' 172 - | '/demo/start/ssr/spa-mode' 173 - | '/demo/start/ssr' 174 - fileRoutesByTo: FileRoutesByTo 175 - to: 176 - | '/' 177 - | '/mcp' 178 - | '/album/$albumId' 179 - | '/demo/mcp-todos' 180 - | '/demo/tanstack-query' 181 - | '/album' 182 - | '/demo/api/mcp-todos' 183 - | '/demo/api/names' 184 - | '/demo/api/tq-todos' 185 - | '/demo/start/api-request' 186 - | '/demo/start/server-funcs' 187 - | '/demo/start/ssr/data-only' 188 - | '/demo/start/ssr/full-ssr' 189 - | '/demo/start/ssr/spa-mode' 190 - | '/demo/start/ssr' 191 - id: 192 - | '__root__' 193 - | '/' 194 - | '/mcp' 195 - | '/album/$albumId' 196 - | '/demo/mcp-todos' 197 - | '/demo/tanstack-query' 198 - | '/album/' 199 - | '/demo/api/mcp-todos' 200 - | '/demo/api/names' 201 - | '/demo/api/tq-todos' 202 - | '/demo/start/api-request' 203 - | '/demo/start/server-funcs' 204 - | '/demo/start/ssr/data-only' 205 - | '/demo/start/ssr/full-ssr' 206 - | '/demo/start/ssr/spa-mode' 207 - | '/demo/start/ssr/' 208 - fileRoutesById: FileRoutesById 157 + fileRoutesByFullPath: FileRoutesByFullPath; 158 + fullPaths: 159 + | "/" 160 + | "/mcp" 161 + | "/album/$albumId" 162 + | "/demo/mcp-todos" 163 + | "/demo/tanstack-query" 164 + | "/album" 165 + | "/demo/api/mcp-todos" 166 + | "/demo/api/names" 167 + | "/demo/api/tq-todos" 168 + | "/demo/start/api-request" 169 + | "/demo/start/server-funcs" 170 + | "/demo/start/ssr/data-only" 171 + | "/demo/start/ssr/full-ssr" 172 + | "/demo/start/ssr/spa-mode" 173 + | "/demo/start/ssr"; 174 + fileRoutesByTo: FileRoutesByTo; 175 + to: 176 + | "/" 177 + | "/mcp" 178 + | "/album/$albumId" 179 + | "/demo/mcp-todos" 180 + | "/demo/tanstack-query" 181 + | "/album" 182 + | "/demo/api/mcp-todos" 183 + | "/demo/api/names" 184 + | "/demo/api/tq-todos" 185 + | "/demo/start/api-request" 186 + | "/demo/start/server-funcs" 187 + | "/demo/start/ssr/data-only" 188 + | "/demo/start/ssr/full-ssr" 189 + | "/demo/start/ssr/spa-mode" 190 + | "/demo/start/ssr"; 191 + id: 192 + | "__root__" 193 + | "/" 194 + | "/mcp" 195 + | "/album/$albumId" 196 + | "/demo/mcp-todos" 197 + | "/demo/tanstack-query" 198 + | "/album/" 199 + | "/demo/api/mcp-todos" 200 + | "/demo/api/names" 201 + | "/demo/api/tq-todos" 202 + | "/demo/start/api-request" 203 + | "/demo/start/server-funcs" 204 + | "/demo/start/ssr/data-only" 205 + | "/demo/start/ssr/full-ssr" 206 + | "/demo/start/ssr/spa-mode" 207 + | "/demo/start/ssr/"; 208 + fileRoutesById: FileRoutesById; 209 209 } 210 210 export interface RootRouteChildren { 211 - IndexRoute: typeof IndexRoute 212 - McpRoute: typeof McpRoute 213 - AlbumAlbumIdRoute: typeof AlbumAlbumIdRoute 214 - DemoMcpTodosRoute: typeof DemoMcpTodosRoute 215 - DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute 216 - AlbumIndexRoute: typeof AlbumIndexRoute 217 - DemoApiMcpTodosRoute: typeof DemoApiMcpTodosRoute 218 - DemoApiNamesRoute: typeof DemoApiNamesRoute 219 - DemoApiTqTodosRoute: typeof DemoApiTqTodosRoute 220 - DemoStartApiRequestRoute: typeof DemoStartApiRequestRoute 221 - DemoStartServerFuncsRoute: typeof DemoStartServerFuncsRoute 222 - DemoStartSsrDataOnlyRoute: typeof DemoStartSsrDataOnlyRoute 223 - DemoStartSsrFullSsrRoute: typeof DemoStartSsrFullSsrRoute 224 - DemoStartSsrSpaModeRoute: typeof DemoStartSsrSpaModeRoute 225 - DemoStartSsrIndexRoute: typeof DemoStartSsrIndexRoute 211 + IndexRoute: typeof IndexRoute; 212 + McpRoute: typeof McpRoute; 213 + AlbumAlbumIdRoute: typeof AlbumAlbumIdRoute; 214 + DemoMcpTodosRoute: typeof DemoMcpTodosRoute; 215 + DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute; 216 + AlbumIndexRoute: typeof AlbumIndexRoute; 217 + DemoApiMcpTodosRoute: typeof DemoApiMcpTodosRoute; 218 + DemoApiNamesRoute: typeof DemoApiNamesRoute; 219 + DemoApiTqTodosRoute: typeof DemoApiTqTodosRoute; 220 + DemoStartApiRequestRoute: typeof DemoStartApiRequestRoute; 221 + DemoStartServerFuncsRoute: typeof DemoStartServerFuncsRoute; 222 + DemoStartSsrDataOnlyRoute: typeof DemoStartSsrDataOnlyRoute; 223 + DemoStartSsrFullSsrRoute: typeof DemoStartSsrFullSsrRoute; 224 + DemoStartSsrSpaModeRoute: typeof DemoStartSsrSpaModeRoute; 225 + DemoStartSsrIndexRoute: typeof DemoStartSsrIndexRoute; 226 226 } 227 227 228 - declare module '@tanstack/react-router' { 229 - interface FileRoutesByPath { 230 - '/mcp': { 231 - id: '/mcp' 232 - path: '/mcp' 233 - fullPath: '/mcp' 234 - preLoaderRoute: typeof McpRouteImport 235 - parentRoute: typeof rootRouteImport 236 - } 237 - '/': { 238 - id: '/' 239 - path: '/' 240 - fullPath: '/' 241 - preLoaderRoute: typeof IndexRouteImport 242 - parentRoute: typeof rootRouteImport 243 - } 244 - '/album/': { 245 - id: '/album/' 246 - path: '/album' 247 - fullPath: '/album' 248 - preLoaderRoute: typeof AlbumIndexRouteImport 249 - parentRoute: typeof rootRouteImport 250 - } 251 - '/demo/tanstack-query': { 252 - id: '/demo/tanstack-query' 253 - path: '/demo/tanstack-query' 254 - fullPath: '/demo/tanstack-query' 255 - preLoaderRoute: typeof DemoTanstackQueryRouteImport 256 - parentRoute: typeof rootRouteImport 257 - } 258 - '/demo/mcp-todos': { 259 - id: '/demo/mcp-todos' 260 - path: '/demo/mcp-todos' 261 - fullPath: '/demo/mcp-todos' 262 - preLoaderRoute: typeof DemoMcpTodosRouteImport 263 - parentRoute: typeof rootRouteImport 264 - } 265 - '/album/$albumId': { 266 - id: '/album/$albumId' 267 - path: '/album/$albumId' 268 - fullPath: '/album/$albumId' 269 - preLoaderRoute: typeof AlbumAlbumIdRouteImport 270 - parentRoute: typeof rootRouteImport 271 - } 272 - '/demo/start/server-funcs': { 273 - id: '/demo/start/server-funcs' 274 - path: '/demo/start/server-funcs' 275 - fullPath: '/demo/start/server-funcs' 276 - preLoaderRoute: typeof DemoStartServerFuncsRouteImport 277 - parentRoute: typeof rootRouteImport 278 - } 279 - '/demo/start/api-request': { 280 - id: '/demo/start/api-request' 281 - path: '/demo/start/api-request' 282 - fullPath: '/demo/start/api-request' 283 - preLoaderRoute: typeof DemoStartApiRequestRouteImport 284 - parentRoute: typeof rootRouteImport 285 - } 286 - '/demo/api/tq-todos': { 287 - id: '/demo/api/tq-todos' 288 - path: '/demo/api/tq-todos' 289 - fullPath: '/demo/api/tq-todos' 290 - preLoaderRoute: typeof DemoApiTqTodosRouteImport 291 - parentRoute: typeof rootRouteImport 292 - } 293 - '/demo/api/names': { 294 - id: '/demo/api/names' 295 - path: '/demo/api/names' 296 - fullPath: '/demo/api/names' 297 - preLoaderRoute: typeof DemoApiNamesRouteImport 298 - parentRoute: typeof rootRouteImport 299 - } 300 - '/demo/api/mcp-todos': { 301 - id: '/demo/api/mcp-todos' 302 - path: '/demo/api/mcp-todos' 303 - fullPath: '/demo/api/mcp-todos' 304 - preLoaderRoute: typeof DemoApiMcpTodosRouteImport 305 - parentRoute: typeof rootRouteImport 306 - } 307 - '/demo/start/ssr/': { 308 - id: '/demo/start/ssr/' 309 - path: '/demo/start/ssr' 310 - fullPath: '/demo/start/ssr' 311 - preLoaderRoute: typeof DemoStartSsrIndexRouteImport 312 - parentRoute: typeof rootRouteImport 313 - } 314 - '/demo/start/ssr/spa-mode': { 315 - id: '/demo/start/ssr/spa-mode' 316 - path: '/demo/start/ssr/spa-mode' 317 - fullPath: '/demo/start/ssr/spa-mode' 318 - preLoaderRoute: typeof DemoStartSsrSpaModeRouteImport 319 - parentRoute: typeof rootRouteImport 320 - } 321 - '/demo/start/ssr/full-ssr': { 322 - id: '/demo/start/ssr/full-ssr' 323 - path: '/demo/start/ssr/full-ssr' 324 - fullPath: '/demo/start/ssr/full-ssr' 325 - preLoaderRoute: typeof DemoStartSsrFullSsrRouteImport 326 - parentRoute: typeof rootRouteImport 327 - } 328 - '/demo/start/ssr/data-only': { 329 - id: '/demo/start/ssr/data-only' 330 - path: '/demo/start/ssr/data-only' 331 - fullPath: '/demo/start/ssr/data-only' 332 - preLoaderRoute: typeof DemoStartSsrDataOnlyRouteImport 333 - parentRoute: typeof rootRouteImport 334 - } 335 - } 228 + declare module "@tanstack/react-router" { 229 + interface FileRoutesByPath { 230 + "/mcp": { 231 + id: "/mcp"; 232 + path: "/mcp"; 233 + fullPath: "/mcp"; 234 + preLoaderRoute: typeof McpRouteImport; 235 + parentRoute: typeof rootRouteImport; 236 + }; 237 + "/": { 238 + id: "/"; 239 + path: "/"; 240 + fullPath: "/"; 241 + preLoaderRoute: typeof IndexRouteImport; 242 + parentRoute: typeof rootRouteImport; 243 + }; 244 + "/album/": { 245 + id: "/album/"; 246 + path: "/album"; 247 + fullPath: "/album"; 248 + preLoaderRoute: typeof AlbumIndexRouteImport; 249 + parentRoute: typeof rootRouteImport; 250 + }; 251 + "/demo/tanstack-query": { 252 + id: "/demo/tanstack-query"; 253 + path: "/demo/tanstack-query"; 254 + fullPath: "/demo/tanstack-query"; 255 + preLoaderRoute: typeof DemoTanstackQueryRouteImport; 256 + parentRoute: typeof rootRouteImport; 257 + }; 258 + "/demo/mcp-todos": { 259 + id: "/demo/mcp-todos"; 260 + path: "/demo/mcp-todos"; 261 + fullPath: "/demo/mcp-todos"; 262 + preLoaderRoute: typeof DemoMcpTodosRouteImport; 263 + parentRoute: typeof rootRouteImport; 264 + }; 265 + "/album/$albumId": { 266 + id: "/album/$albumId"; 267 + path: "/album/$albumId"; 268 + fullPath: "/album/$albumId"; 269 + preLoaderRoute: typeof AlbumAlbumIdRouteImport; 270 + parentRoute: typeof rootRouteImport; 271 + }; 272 + "/demo/start/server-funcs": { 273 + id: "/demo/start/server-funcs"; 274 + path: "/demo/start/server-funcs"; 275 + fullPath: "/demo/start/server-funcs"; 276 + preLoaderRoute: typeof DemoStartServerFuncsRouteImport; 277 + parentRoute: typeof rootRouteImport; 278 + }; 279 + "/demo/start/api-request": { 280 + id: "/demo/start/api-request"; 281 + path: "/demo/start/api-request"; 282 + fullPath: "/demo/start/api-request"; 283 + preLoaderRoute: typeof DemoStartApiRequestRouteImport; 284 + parentRoute: typeof rootRouteImport; 285 + }; 286 + "/demo/api/tq-todos": { 287 + id: "/demo/api/tq-todos"; 288 + path: "/demo/api/tq-todos"; 289 + fullPath: "/demo/api/tq-todos"; 290 + preLoaderRoute: typeof DemoApiTqTodosRouteImport; 291 + parentRoute: typeof rootRouteImport; 292 + }; 293 + "/demo/api/names": { 294 + id: "/demo/api/names"; 295 + path: "/demo/api/names"; 296 + fullPath: "/demo/api/names"; 297 + preLoaderRoute: typeof DemoApiNamesRouteImport; 298 + parentRoute: typeof rootRouteImport; 299 + }; 300 + "/demo/api/mcp-todos": { 301 + id: "/demo/api/mcp-todos"; 302 + path: "/demo/api/mcp-todos"; 303 + fullPath: "/demo/api/mcp-todos"; 304 + preLoaderRoute: typeof DemoApiMcpTodosRouteImport; 305 + parentRoute: typeof rootRouteImport; 306 + }; 307 + "/demo/start/ssr/": { 308 + id: "/demo/start/ssr/"; 309 + path: "/demo/start/ssr"; 310 + fullPath: "/demo/start/ssr"; 311 + preLoaderRoute: typeof DemoStartSsrIndexRouteImport; 312 + parentRoute: typeof rootRouteImport; 313 + }; 314 + "/demo/start/ssr/spa-mode": { 315 + id: "/demo/start/ssr/spa-mode"; 316 + path: "/demo/start/ssr/spa-mode"; 317 + fullPath: "/demo/start/ssr/spa-mode"; 318 + preLoaderRoute: typeof DemoStartSsrSpaModeRouteImport; 319 + parentRoute: typeof rootRouteImport; 320 + }; 321 + "/demo/start/ssr/full-ssr": { 322 + id: "/demo/start/ssr/full-ssr"; 323 + path: "/demo/start/ssr/full-ssr"; 324 + fullPath: "/demo/start/ssr/full-ssr"; 325 + preLoaderRoute: typeof DemoStartSsrFullSsrRouteImport; 326 + parentRoute: typeof rootRouteImport; 327 + }; 328 + "/demo/start/ssr/data-only": { 329 + id: "/demo/start/ssr/data-only"; 330 + path: "/demo/start/ssr/data-only"; 331 + fullPath: "/demo/start/ssr/data-only"; 332 + preLoaderRoute: typeof DemoStartSsrDataOnlyRouteImport; 333 + parentRoute: typeof rootRouteImport; 334 + }; 335 + } 336 336 } 337 337 338 338 const rootRouteChildren: RootRouteChildren = { 339 - IndexRoute: IndexRoute, 340 - McpRoute: McpRoute, 341 - AlbumAlbumIdRoute: AlbumAlbumIdRoute, 342 - DemoMcpTodosRoute: DemoMcpTodosRoute, 343 - DemoTanstackQueryRoute: DemoTanstackQueryRoute, 344 - AlbumIndexRoute: AlbumIndexRoute, 345 - DemoApiMcpTodosRoute: DemoApiMcpTodosRoute, 346 - DemoApiNamesRoute: DemoApiNamesRoute, 347 - DemoApiTqTodosRoute: DemoApiTqTodosRoute, 348 - DemoStartApiRequestRoute: DemoStartApiRequestRoute, 349 - DemoStartServerFuncsRoute: DemoStartServerFuncsRoute, 350 - DemoStartSsrDataOnlyRoute: DemoStartSsrDataOnlyRoute, 351 - DemoStartSsrFullSsrRoute: DemoStartSsrFullSsrRoute, 352 - DemoStartSsrSpaModeRoute: DemoStartSsrSpaModeRoute, 353 - DemoStartSsrIndexRoute: DemoStartSsrIndexRoute, 354 - } 355 - export const routeTree = rootRouteImport 356 - ._addFileChildren(rootRouteChildren) 357 - ._addFileTypes<FileRouteTypes>() 339 + IndexRoute: IndexRoute, 340 + McpRoute: McpRoute, 341 + AlbumAlbumIdRoute: AlbumAlbumIdRoute, 342 + DemoMcpTodosRoute: DemoMcpTodosRoute, 343 + DemoTanstackQueryRoute: DemoTanstackQueryRoute, 344 + AlbumIndexRoute: AlbumIndexRoute, 345 + DemoApiMcpTodosRoute: DemoApiMcpTodosRoute, 346 + DemoApiNamesRoute: DemoApiNamesRoute, 347 + DemoApiTqTodosRoute: DemoApiTqTodosRoute, 348 + DemoStartApiRequestRoute: DemoStartApiRequestRoute, 349 + DemoStartServerFuncsRoute: DemoStartServerFuncsRoute, 350 + DemoStartSsrDataOnlyRoute: DemoStartSsrDataOnlyRoute, 351 + DemoStartSsrFullSsrRoute: DemoStartSsrFullSsrRoute, 352 + DemoStartSsrSpaModeRoute: DemoStartSsrSpaModeRoute, 353 + DemoStartSsrIndexRoute: DemoStartSsrIndexRoute, 354 + }; 355 + export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>(); 358 356 359 - import type { getRouter } from './router.tsx' 360 - import type { createStart } from '@tanstack/react-start' 361 - declare module '@tanstack/react-start' { 362 - interface Register { 363 - ssr: true 364 - router: Awaited<ReturnType<typeof getRouter>> 365 - } 357 + import type { getRouter } from "./router.tsx"; 358 + import type { createStart } from "@tanstack/react-start"; 359 + declare module "@tanstack/react-start" { 360 + interface Register { 361 + ssr: true; 362 + router: Awaited<ReturnType<typeof getRouter>>; 363 + } 366 364 }
+6 -6
web/src/routes/album/index.tsx
··· 17 17 }); 18 18 19 19 return ( 20 - <div className="container"> 21 - <div className="grid lg:grid-cols-6 grid-cols-1"> 22 - {albums?.map((album) => ( 23 - <AlbumCard album={album} key={album.id} /> 24 - ))} 25 - </div> 20 + <div className="container"> 21 + <div className="grid lg:grid-cols-6 grid-cols-1"> 22 + {albums?.map((album) => ( 23 + <AlbumCard album={album} key={album.id} /> 24 + ))} 25 + </div> 26 26 </div> 27 27 ); 28 28 }