Openstatus www.openstatus.dev

Add pagination to changelog/blog main page (#926)

* added pagination functionality to changelog/blog

* import cleanup

* changed pagination fuctionality and ui

* Update page.tsx

some cleanup

* list-pagination adjustments and moved button and pagination to @openstatus/ui

* list pagination adjustments

* Pagination Compnent changed a tag to next Link tag

* fix wrangler toml file

* some dependency cleanup

* changed web dir pagination a tag to Link tag

* chore: small stuff

* fix: lint

* fix: biome

---------

Co-authored-by: Maximilian Kaske <maximilian@kaske.org>

authored by

Skye
Maximilian Kaske
and committed by
GitHub
7cef4a1e 2cd8f2b6

+394 -44
+3 -4
apps/web/src/app/(content)/_components/pagination.tsx
··· 5 5 import { Button } from "@openstatus/ui/src/components/button"; 6 6 7 7 export function Pagination({ 8 - // biome-ignore lint/correctness/noUnusedVariables: <explanation> 9 8 prev, 10 9 next, 11 10 }: { ··· 15 14 return ( 16 15 <div className="mx-auto flex w-full max-w-prose items-center justify-between"> 17 16 <div /> 18 - {/* {prev ? ( 17 + {prev ? ( 19 18 <div className="w-1/2 flex-1 text-left"> 20 19 <Button asChild variant="link"> 21 20 <Link href={`/changelog/${prev.slug}`} className="group"> 22 - <ChevronLeft className="text-muted-foreground group-hover:text-foreground mr-2 h-4 w-4" /> 21 + <ChevronLeft className="mr-2 h-4 w-4 text-muted-foreground group-hover:text-foreground" /> 23 22 <span className="truncate">{prev.title}</span> 24 23 </Link> 25 24 </Button> 26 25 </div> 27 26 ) : ( 28 27 <div /> 29 - )} */} 28 + )} 30 29 {next ? ( 31 30 <div className="w-1/2 flex-1 text-right"> 32 31 <Button asChild variant="link">
+60 -12
apps/web/src/app/(content)/blog/page.tsx
··· 1 - import { allPosts } from "contentlayer/generated"; 2 - import { Rss } from "lucide-react"; 3 - import type { Metadata } from "next"; 4 - import Link from "next/link"; 5 - 6 - import { Button } from "@openstatus/ui/src/components/button"; 7 - 8 1 import { 9 2 defaultMetadata, 10 3 ogMetadata, ··· 12 5 } from "@/app/shared-metadata"; 13 6 import { Timeline } from "@/components/content/timeline"; 14 7 import { Shell } from "@/components/dashboard/shell"; 8 + import { 9 + Button, 10 + Pagination, 11 + PaginationContent, 12 + PaginationLink, 13 + } from "@openstatus/ui"; 14 + import { allPosts } from "contentlayer/generated"; 15 + import { Rss } from "lucide-react"; 16 + import type { Metadata } from "next"; 17 + import Link from "next/link"; 18 + import { z } from "zod"; 15 19 16 20 export const metadata: Metadata = { 17 21 ...defaultMetadata, ··· 26 30 }, 27 31 }; 28 32 29 - export default async function Post() { 30 - const posts = allPosts.sort( 31 - (a, b) => 32 - new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime(), 33 - ); 33 + const searchParamsSchema = z.object({ 34 + page: z 35 + .string() 36 + .optional() 37 + .transform((val) => Number.parseInt(val || "1", 10)), 38 + }); 39 + 40 + const ITEMS_PER_PAGE = 10; 41 + 42 + export default function Post({ 43 + searchParams, 44 + }: { 45 + searchParams: { [key: string]: string | string[] | undefined }; 46 + }) { 47 + const search = searchParamsSchema.safeParse(searchParams); 48 + 49 + const page = search.data?.page; 50 + const current = !page ? 1 : page; 51 + const total = Math.ceil(allPosts.length / ITEMS_PER_PAGE); 52 + 53 + const posts = allPosts 54 + .sort( 55 + (a, b) => 56 + new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime(), 57 + ) 58 + .slice((current - 1) * ITEMS_PER_PAGE, current * ITEMS_PER_PAGE); 34 59 35 60 return ( 36 61 <Shell> ··· 64 89 </div> 65 90 </Timeline.Article> 66 91 ))} 92 + {current && total && ( 93 + <div className="grid grid-cols-1 gap-4 md:grid-cols-5 md:gap-6"> 94 + <div className="row-span-2" /> 95 + <div className="w-full md:order-2 md:col-span-4"> 96 + <Pagination> 97 + <PaginationContent> 98 + {Array.from({ length: total }).map((_, index) => { 99 + return ( 100 + <PaginationLink 101 + // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 102 + key={index} 103 + href={`?page=${index + 1}`} 104 + isActive={current === index + 1} 105 + > 106 + {index + 1} 107 + </PaginationLink> 108 + ); 109 + })} 110 + </PaginationContent> 111 + </Pagination> 112 + </div> 113 + </div> 114 + )} 67 115 </Timeline> 68 116 </Shell> 69 117 );
+1 -1
apps/web/src/app/(content)/changelog/[slug]/page.tsx
··· 95 95 <Shell className="flex flex-col gap-8 sm:py-8 md:gap-12 md:py-12"> 96 96 <ChangelogCard post={post} /> 97 97 <Separator className="mx-auto max-w-prose" /> 98 - <Pagination {...{ next, prev }} /> 98 + <Pagination {...{ prev, next }} /> 99 99 </Shell> 100 100 </> 101 101 );
+59 -11
apps/web/src/app/(content)/changelog/page.tsx
··· 1 - import { allChangelogs } from "contentlayer/generated"; 2 - import { Rss } from "lucide-react"; 3 - import type { Metadata } from "next"; 4 - 5 - import { Button } from "@openstatus/ui/src/components/button"; 6 - 7 1 import { 8 2 defaultMetadata, 9 3 ogMetadata, ··· 12 6 import { Mdx } from "@/components/content/mdx"; 13 7 import { Timeline } from "@/components/content/timeline"; 14 8 import { Shell } from "@/components/dashboard/shell"; 9 + import { 10 + Button, 11 + Pagination, 12 + PaginationContent, 13 + PaginationLink, 14 + } from "@openstatus/ui"; 15 + import { allChangelogs } from "contentlayer/generated"; 16 + import { Rss } from "lucide-react"; 17 + import type { Metadata } from "next"; 18 + import { z } from "zod"; 15 19 16 20 export const metadata: Metadata = { 17 21 ...defaultMetadata, ··· 26 30 }, 27 31 }; 28 32 29 - export default async function Changelog() { 30 - const changelogs = allChangelogs.sort( 31 - (a, b) => 32 - new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime(), 33 - ); 33 + const searchParamsSchema = z.object({ 34 + page: z 35 + .string() 36 + .optional() 37 + .transform((val) => Number.parseInt(val || "1", 10)), 38 + }); 39 + 40 + const ITEMS_PER_PAGE = 10; 41 + 42 + export default function ChangelogClient({ 43 + searchParams, 44 + }: { 45 + searchParams: { [key: string]: string | string[] | undefined }; 46 + }) { 47 + const search = searchParamsSchema.safeParse(searchParams); 48 + 49 + const page = search.data?.page; 50 + const current = !page ? 1 : page; 51 + const total = Math.ceil(allChangelogs.length / ITEMS_PER_PAGE); 52 + 53 + const changelogs = allChangelogs 54 + .sort( 55 + (a, b) => 56 + new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime(), 57 + ) 58 + .slice((current - 1) * ITEMS_PER_PAGE, current * ITEMS_PER_PAGE); 34 59 35 60 return ( 36 61 <Shell> ··· 57 82 <Mdx code={changelog.body.code} /> 58 83 </Timeline.Article> 59 84 ))} 85 + {current && total && ( 86 + <div className="grid grid-cols-1 gap-4 md:grid-cols-5 md:gap-6"> 87 + <div className="row-span-2" /> 88 + <div className="w-full md:order-2 md:col-span-4"> 89 + <Pagination> 90 + <PaginationContent> 91 + {Array.from({ length: total }).map((_, index) => { 92 + return ( 93 + <PaginationLink 94 + // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 95 + key={index} 96 + href={`?page=${index + 1}`} 97 + isActive={current === index + 1} 98 + > 99 + {index + 1} 100 + </PaginationLink> 101 + ); 102 + })} 103 + </PaginationContent> 104 + </Pagination> 105 + </div> 106 + </div> 107 + )} 60 108 </Timeline> 61 109 </Shell> 62 110 );
+1
packages/ui/package.json
··· 50 50 "date-fns": "2.30.0", 51 51 "lucide-react": "0.279.0", 52 52 "luxon": "3.3.0", 53 + "next": "14.2.4", 53 54 "react": "18.3.1", 54 55 "react-day-picker": "8.8.2", 55 56 "react-hook-form": "7.47.0",
+118
packages/ui/src/components/pagination.tsx
··· 1 + import * as React from "react"; 2 + import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react"; 3 + import Link from "next/link"; 4 + 5 + import { cn } from "@/lib/utils"; 6 + import { ButtonProps, buttonVariants } from "./button"; 7 + 8 + const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => ( 9 + <nav 10 + role="navigation" 11 + aria-label="pagination" 12 + className={cn("mx-auto flex w-full justify-center", className)} 13 + {...props} 14 + /> 15 + ); 16 + Pagination.displayName = "Pagination"; 17 + 18 + const PaginationContent = React.forwardRef< 19 + HTMLUListElement, 20 + React.ComponentProps<"ul"> 21 + >(({ className, ...props }, ref) => ( 22 + <ul 23 + ref={ref} 24 + className={cn("flex flex-row items-center gap-1", className)} 25 + {...props} 26 + /> 27 + )); 28 + PaginationContent.displayName = "PaginationContent"; 29 + 30 + const PaginationItem = React.forwardRef< 31 + HTMLLIElement, 32 + React.ComponentProps<"li"> 33 + >(({ className, ...props }, ref) => ( 34 + <li ref={ref} className={cn("", className)} {...props} /> 35 + )); 36 + PaginationItem.displayName = "PaginationItem"; 37 + 38 + type PaginationLinkProps = { 39 + isActive?: boolean; 40 + } & Pick<ButtonProps, "size"> & 41 + React.ComponentProps<typeof Link>; 42 + 43 + const PaginationLink = ({ 44 + className, 45 + isActive, 46 + size = "icon", 47 + ...props 48 + }: PaginationLinkProps) => ( 49 + <Link 50 + aria-current={isActive ? "page" : undefined} 51 + className={cn( 52 + buttonVariants({ 53 + variant: isActive ? "outline" : "ghost", 54 + size, 55 + }), 56 + className 57 + )} 58 + {...props} 59 + /> 60 + ); 61 + PaginationLink.displayName = "PaginationLink"; 62 + 63 + const PaginationPrevious = ({ 64 + className, 65 + ...props 66 + }: React.ComponentProps<typeof PaginationLink>) => ( 67 + <PaginationLink 68 + aria-label="Go to previous page" 69 + size="default" 70 + className={cn("gap-1 pl-2.5", className)} 71 + {...props} 72 + > 73 + <ChevronLeft className="h-4 w-4" /> 74 + <span>Prev</span> 75 + </PaginationLink> 76 + ); 77 + PaginationPrevious.displayName = "PaginationPrevious"; 78 + 79 + const PaginationNext = ({ 80 + className, 81 + ...props 82 + }: React.ComponentProps<typeof PaginationLink>) => ( 83 + <PaginationLink 84 + aria-label="Go to next page" 85 + size="default" 86 + className={cn("gap-1 pr-2.5", className)} 87 + {...props} 88 + > 89 + <span>Next</span> 90 + <ChevronRight className="h-4 w-4" /> 91 + </PaginationLink> 92 + ); 93 + PaginationNext.displayName = "PaginationNext"; 94 + 95 + const PaginationEllipsis = ({ 96 + className, 97 + ...props 98 + }: React.ComponentProps<"span">) => ( 99 + <span 100 + aria-hidden 101 + className={cn("flex h-9 w-9 items-center justify-center", className)} 102 + {...props} 103 + > 104 + <MoreHorizontal className="h-4 w-4" /> 105 + <span className="sr-only">More pages</span> 106 + </span> 107 + ); 108 + PaginationEllipsis.displayName = "PaginationEllipsis"; 109 + 110 + export { 111 + Pagination, 112 + PaginationContent, 113 + PaginationEllipsis, 114 + PaginationItem, 115 + PaginationLink, 116 + PaginationNext, 117 + PaginationPrevious, 118 + };
+1
packages/ui/src/index.tsx
··· 18 18 export * from "./components/input-with-addons"; 19 19 export * from "./components/input"; 20 20 export * from "./components/label"; 21 + export * from "./components/pagination"; 21 22 export * from "./components/popover"; 22 23 export * from "./components/progress"; 23 24 export * from "./components/radio-group";
+151 -16
pnpm-lock.yaml
··· 192 192 version: link:../../packages/utils 193 193 '@scalar/hono-api-reference': 194 194 specifier: 0.5.131 195 - version: 0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2) 195 + version: 0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2) 196 196 '@t3-oss/env-core': 197 197 specifier: 0.7.1 198 198 version: 0.7.1(typescript@5.5.2)(zod@3.23.8) ··· 653 653 version: 0.1.13 654 654 next-auth: 655 655 specifier: 5.0.0-beta.17 656 - version: 5.0.0-beta.17(next@14.2.4(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) 656 + version: 5.0.0-beta.17(next@14.2.8(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) 657 657 typescript: 658 658 specifier: 5.5.2 659 659 version: 5.5.2 ··· 1078 1078 luxon: 1079 1079 specifier: 3.3.0 1080 1080 version: 3.3.0 1081 + next: 1082 + specifier: 14.2.4 1083 + version: 14.2.4(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 1081 1084 next-themes: 1082 1085 specifier: 0.2.1 1083 1086 version: 0.2.1(next@14.2.4(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ··· 3343 3346 '@next/env@14.2.4': 3344 3347 resolution: {integrity: sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==} 3345 3348 3349 + '@next/env@14.2.8': 3350 + resolution: {integrity: sha512-L44a+ynqkolyNBnYfF8VoCiSrjSZWgEHYKkKLGcs/a80qh7AkfVUD/MduVPgdsWZ31tgROR+yJRA0PZjSVBXWQ==} 3351 + 3346 3352 '@next/swc-darwin-arm64@14.2.4': 3347 3353 resolution: {integrity: sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==} 3354 + engines: {node: '>= 10'} 3355 + cpu: [arm64] 3356 + os: [darwin] 3357 + 3358 + '@next/swc-darwin-arm64@14.2.8': 3359 + resolution: {integrity: sha512-1VrQlG8OzdyvvGZhGJFnaNE2P10Jjy/2FopnqbY0nSa/gr8If3iINxvOEW3cmVeoAYkmW0RsBazQecA2dBFOSw==} 3348 3360 engines: {node: '>= 10'} 3349 3361 cpu: [arm64] 3350 3362 os: [darwin] ··· 3355 3367 cpu: [x64] 3356 3368 os: [darwin] 3357 3369 3370 + '@next/swc-darwin-x64@14.2.8': 3371 + resolution: {integrity: sha512-87t3I86rNRSOJB1gXIUzaQWWSWrkWPDyZGsR0Z7JAPtLeX3uUOW2fHxl7dNWD2BZvbvftctTQjgtfpp7nMtmWg==} 3372 + engines: {node: '>= 10'} 3373 + cpu: [x64] 3374 + os: [darwin] 3375 + 3358 3376 '@next/swc-linux-arm64-gnu@14.2.4': 3359 3377 resolution: {integrity: sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==} 3360 3378 engines: {node: '>= 10'} 3361 3379 cpu: [arm64] 3362 3380 os: [linux] 3363 3381 3382 + '@next/swc-linux-arm64-gnu@14.2.8': 3383 + resolution: {integrity: sha512-ta2sfVzbOpTbgBrF9HM5m+U58dv6QPuwU4n5EX4LLyCJGKc433Z0D9h9gay/HSOjLEXJ2fJYrMP5JYYbHdxhtw==} 3384 + engines: {node: '>= 10'} 3385 + cpu: [arm64] 3386 + os: [linux] 3387 + 3364 3388 '@next/swc-linux-arm64-musl@14.2.4': 3365 3389 resolution: {integrity: sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==} 3390 + engines: {node: '>= 10'} 3391 + cpu: [arm64] 3392 + os: [linux] 3393 + 3394 + '@next/swc-linux-arm64-musl@14.2.8': 3395 + resolution: {integrity: sha512-+IoLTPK6Z5uIgDhgeWnQF5/o5GBN7+zyUNrs4Bes1W3g9++YELb8y0unFybS8s87ntAKMDl6jeQ+mD7oNwp/Ng==} 3366 3396 engines: {node: '>= 10'} 3367 3397 cpu: [arm64] 3368 3398 os: [linux] ··· 3373 3403 cpu: [x64] 3374 3404 os: [linux] 3375 3405 3406 + '@next/swc-linux-x64-gnu@14.2.8': 3407 + resolution: {integrity: sha512-pO+hVXC+mvzUOQJJRG4RX4wJsRJ5BkURSf6dD6EjUXAX4Ml9es1WsEfkaZ4lcpmFzFvY47IkDaffks/GdCn9ag==} 3408 + engines: {node: '>= 10'} 3409 + cpu: [x64] 3410 + os: [linux] 3411 + 3376 3412 '@next/swc-linux-x64-musl@14.2.4': 3377 3413 resolution: {integrity: sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==} 3378 3414 engines: {node: '>= 10'} 3379 3415 cpu: [x64] 3380 3416 os: [linux] 3381 3417 3418 + '@next/swc-linux-x64-musl@14.2.8': 3419 + resolution: {integrity: sha512-bCat9izctychCtf3uL1nqHq31N5e1VxvdyNcBQflkudPMLbxVnlrw45Vi87K+lt1CwrtVayHqzo4ie0Szcpwzg==} 3420 + engines: {node: '>= 10'} 3421 + cpu: [x64] 3422 + os: [linux] 3423 + 3382 3424 '@next/swc-win32-arm64-msvc@14.2.4': 3383 3425 resolution: {integrity: sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==} 3384 3426 engines: {node: '>= 10'} 3385 3427 cpu: [arm64] 3386 3428 os: [win32] 3387 3429 3430 + '@next/swc-win32-arm64-msvc@14.2.8': 3431 + resolution: {integrity: sha512-gbxfUaSPV7EyUobpavida2Hwi62GhSJaSg7iBjmBWoxkxlmETOD7U4tWt763cGIsyE6jM7IoNavq0BXqwdW2QA==} 3432 + engines: {node: '>= 10'} 3433 + cpu: [arm64] 3434 + os: [win32] 3435 + 3388 3436 '@next/swc-win32-ia32-msvc@14.2.4': 3389 3437 resolution: {integrity: sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==} 3390 3438 engines: {node: '>= 10'} 3391 3439 cpu: [ia32] 3392 3440 os: [win32] 3393 3441 3442 + '@next/swc-win32-ia32-msvc@14.2.8': 3443 + resolution: {integrity: sha512-PUXzEzjTTlUh3b5VAn1nlpwvujTnuCMMwbiCnaTazoVlN1nA3kWjlmp42IfURA2N/nyrlVEw7pURa/o4Qxj1cw==} 3444 + engines: {node: '>= 10'} 3445 + cpu: [ia32] 3446 + os: [win32] 3447 + 3394 3448 '@next/swc-win32-x64-msvc@14.2.4': 3395 3449 resolution: {integrity: sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==} 3450 + engines: {node: '>= 10'} 3451 + cpu: [x64] 3452 + os: [win32] 3453 + 3454 + '@next/swc-win32-x64-msvc@14.2.8': 3455 + resolution: {integrity: sha512-EnPKv0ttq02E9/1KZ/8Dn7kuutv6hy1CKc0HlNcvzOQcm4/SQtvfws5gY0zrG9tuupd3HfC2L/zcTrnBhpjTuQ==} 3396 3456 engines: {node: '>= 10'} 3397 3457 cpu: [x64] 3398 3458 os: [win32] ··· 7180 7240 7181 7241 inflight@1.0.6: 7182 7242 resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 7183 - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 7184 7243 7185 7244 inherits@2.0.4: 7186 7245 resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ··· 8240 8299 sass: 8241 8300 optional: true 8242 8301 8302 + next@14.2.8: 8303 + resolution: {integrity: sha512-EyEyJZ89r8C5FPlS/401AiF3O8jeMtHIE+bLom9MwcdWJJFBgRl+MR/2VgO0v5bI6tQORNY0a0DR5sjpFNrjbg==} 8304 + engines: {node: '>=18.17.0'} 8305 + hasBin: true 8306 + peerDependencies: 8307 + '@opentelemetry/api': ^1.1.0 8308 + '@playwright/test': ^1.41.2 8309 + react: ^18.2.0 8310 + react-dom: ^18.2.0 8311 + sass: ^1.3.0 8312 + peerDependenciesMeta: 8313 + '@opentelemetry/api': 8314 + optional: true 8315 + '@playwright/test': 8316 + optional: true 8317 + sass: 8318 + optional: true 8319 + 8243 8320 no-case@2.3.2: 8244 8321 resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} 8245 8322 ··· 9131 9208 9132 9209 rimraf@3.0.2: 9133 9210 resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 9134 - deprecated: Rimraf versions prior to v4 are no longer supported 9135 9211 hasBin: true 9136 9212 9137 9213 rollup-plugin-inject@3.0.2: ··· 12587 12663 dependencies: 12588 12664 tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)) 12589 12665 12666 + '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))': 12667 + dependencies: 12668 + tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)) 12669 + 12590 12670 '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))': 12591 12671 dependencies: 12592 12672 tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)) ··· 12874 12954 12875 12955 '@next/env@14.2.4': {} 12876 12956 12957 + '@next/env@14.2.8': {} 12958 + 12877 12959 '@next/swc-darwin-arm64@14.2.4': 12878 12960 optional: true 12879 12961 12962 + '@next/swc-darwin-arm64@14.2.8': 12963 + optional: true 12964 + 12880 12965 '@next/swc-darwin-x64@14.2.4': 12966 + optional: true 12967 + 12968 + '@next/swc-darwin-x64@14.2.8': 12881 12969 optional: true 12882 12970 12883 12971 '@next/swc-linux-arm64-gnu@14.2.4': 12884 12972 optional: true 12885 12973 12974 + '@next/swc-linux-arm64-gnu@14.2.8': 12975 + optional: true 12976 + 12886 12977 '@next/swc-linux-arm64-musl@14.2.4': 12887 12978 optional: true 12888 12979 12980 + '@next/swc-linux-arm64-musl@14.2.8': 12981 + optional: true 12982 + 12889 12983 '@next/swc-linux-x64-gnu@14.2.4': 12890 12984 optional: true 12891 12985 12986 + '@next/swc-linux-x64-gnu@14.2.8': 12987 + optional: true 12988 + 12892 12989 '@next/swc-linux-x64-musl@14.2.4': 12893 12990 optional: true 12894 12991 12992 + '@next/swc-linux-x64-musl@14.2.8': 12993 + optional: true 12994 + 12895 12995 '@next/swc-win32-arm64-msvc@14.2.4': 12896 12996 optional: true 12897 12997 12998 + '@next/swc-win32-arm64-msvc@14.2.8': 12999 + optional: true 13000 + 12898 13001 '@next/swc-win32-ia32-msvc@14.2.4': 13002 + optional: true 13003 + 13004 + '@next/swc-win32-ia32-msvc@14.2.8': 12899 13005 optional: true 12900 13006 12901 13007 '@next/swc-win32-x64-msvc@14.2.4': 13008 + optional: true 13009 + 13010 + '@next/swc-win32-x64-msvc@14.2.8': 12902 13011 optional: true 12903 13012 12904 13013 '@nodelib/fs.scandir@2.1.5': ··· 14123 14232 optionalDependencies: 14124 14233 rollup: 2.78.0 14125 14234 14126 - '@scalar/api-client@2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2)': 14235 + '@scalar/api-client@2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2)': 14127 14236 dependencies: 14128 - '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2))) 14237 + '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2))) 14129 14238 '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.5.2)) 14130 14239 '@scalar/components': 0.12.28(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(typescript@5.5.2) 14131 14240 '@scalar/draggable': 0.1.4(typescript@5.5.2) ··· 14161 14270 - typescript 14162 14271 - vitest 14163 14272 14164 - '@scalar/api-reference@1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2)': 14273 + '@scalar/api-reference@1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2)': 14165 14274 dependencies: 14166 14275 '@floating-ui/vue': 1.1.1(vue@3.4.31(typescript@5.5.2)) 14167 14276 '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.5.2)) 14168 - '@scalar/api-client': 2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2) 14277 + '@scalar/api-client': 2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2) 14169 14278 '@scalar/components': 0.12.28(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(typescript@5.5.2) 14170 14279 '@scalar/oas-utils': 0.2.26(typescript@5.5.2) 14171 14280 '@scalar/openapi-parser': 0.7.2 ··· 14250 14359 transitivePeerDependencies: 14251 14360 - typescript 14252 14361 14253 - '@scalar/hono-api-reference@0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2)': 14362 + '@scalar/hono-api-reference@0.5.131(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2)': 14254 14363 dependencies: 14255 - '@scalar/api-reference': 1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))(typescript@5.5.2) 14364 + '@scalar/api-reference': 1.24.70(postcss@8.4.38)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.24.8))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)))(typescript@5.5.2) 14256 14365 hono: 4.5.3 14257 14366 transitivePeerDependencies: 14258 14367 - '@jest/globals' ··· 19038 19147 next: 14.2.4(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 19039 19148 react: 18.3.1 19040 19149 19041 - next-auth@5.0.0-beta.17(next@14.2.4(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): 19150 + next-auth@5.0.0-beta.17(next@14.2.8(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): 19042 19151 dependencies: 19043 19152 '@auth/core': 0.30.0 19044 - next: 14.2.4(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 19153 + next: 14.2.8(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 19045 19154 react: 18.3.1 19046 19155 19047 19156 next-contentlayer@0.3.4(contentlayer@0.3.4(esbuild@0.21.3))(esbuild@0.21.3)(next@14.2.4(@opentelemetry/api@1.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): ··· 19081 19190 '@next/env': 14.2.4 19082 19191 '@swc/helpers': 0.5.5 19083 19192 busboy: 1.6.0 19084 - caniuse-lite: 1.0.30001612 19193 + caniuse-lite: 1.0.30001641 19085 19194 graceful-fs: 4.2.11 19086 19195 postcss: 8.4.31 19087 19196 react: 18.3.1 ··· 19107 19216 '@next/env': 14.2.4 19108 19217 '@swc/helpers': 0.5.5 19109 19218 busboy: 1.6.0 19110 - caniuse-lite: 1.0.30001612 19219 + caniuse-lite: 1.0.30001641 19111 19220 graceful-fs: 4.2.11 19112 19221 postcss: 8.4.31 19113 19222 react: 18.2.0 ··· 19133 19242 '@next/env': 14.2.4 19134 19243 '@swc/helpers': 0.5.5 19135 19244 busboy: 1.6.0 19136 - caniuse-lite: 1.0.30001612 19245 + caniuse-lite: 1.0.30001641 19137 19246 graceful-fs: 4.2.11 19138 19247 postcss: 8.4.31 19139 19248 react: 18.3.1 ··· 19149 19258 '@next/swc-win32-arm64-msvc': 14.2.4 19150 19259 '@next/swc-win32-ia32-msvc': 14.2.4 19151 19260 '@next/swc-win32-x64-msvc': 14.2.4 19261 + '@opentelemetry/api': 1.8.0 19262 + transitivePeerDependencies: 19263 + - '@babel/core' 19264 + - babel-plugin-macros 19265 + 19266 + next@14.2.8(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 19267 + dependencies: 19268 + '@next/env': 14.2.8 19269 + '@swc/helpers': 0.5.5 19270 + busboy: 1.6.0 19271 + caniuse-lite: 1.0.30001641 19272 + graceful-fs: 4.2.11 19273 + postcss: 8.4.31 19274 + react: 18.3.1 19275 + react-dom: 18.3.1(react@18.3.1) 19276 + styled-jsx: 5.1.1(react@18.3.1) 19277 + optionalDependencies: 19278 + '@next/swc-darwin-arm64': 14.2.8 19279 + '@next/swc-darwin-x64': 14.2.8 19280 + '@next/swc-linux-arm64-gnu': 14.2.8 19281 + '@next/swc-linux-arm64-musl': 14.2.8 19282 + '@next/swc-linux-x64-gnu': 14.2.8 19283 + '@next/swc-linux-x64-musl': 14.2.8 19284 + '@next/swc-win32-arm64-msvc': 14.2.8 19285 + '@next/swc-win32-ia32-msvc': 14.2.8 19286 + '@next/swc-win32-x64-msvc': 14.2.8 19152 19287 '@opentelemetry/api': 1.8.0 19153 19288 transitivePeerDependencies: 19154 19289 - '@babel/core' ··· 19579 19714 postcss@8.4.31: 19580 19715 dependencies: 19581 19716 nanoid: 3.3.7 19582 - picocolors: 1.0.0 19717 + picocolors: 1.0.1 19583 19718 source-map-js: 1.2.0 19584 19719 19585 19720 postcss@8.4.38: