Openstatus www.openstatus.dev

chore: replace tremor with shadcn charts (#1130)

authored by

Maximilian Kaske and committed by
GitHub
97bd5dec 5d70ab7a

+305 -449
-1
apps/web/next.config.js
··· 31 31 // "@libsql/hrana-client", 32 32 // "better-sqlite3" 33 33 ], 34 - optimizePackageImports: ["@tremor/react"], 35 34 /** 36 35 * The default stale revalidate time for SWR requests is 1year. 37 36 * We can't rely on the default because the status pages will always return the
-3
apps/web/package.json
··· 13 13 "@auth/core": "0.34.1", 14 14 "@auth/drizzle-adapter": "1.7.0", 15 15 "@google-cloud/tasks": "4.0.1", 16 - "@headlessui/react": "1.7.17", 17 16 "@hookform/resolvers": "3.3.1", 18 17 "@libsql/client": "0.14.0", 19 18 "@openstatus/analytics": "workspace:*", ··· 43 42 "@tanstack/react-query": "5.59.0", 44 43 "@tanstack/react-query-devtools": "5.59.0", 45 44 "@tanstack/react-table": "8.10.3", 46 - "@tremor/react": "3.17.4", 47 45 "@trpc/client": "11.0.0-rc.553", 48 46 "@trpc/next": "11.0.0-rc.553", 49 47 "@trpc/react-query": "11.0.0-rc.553", ··· 93 91 "@content-collections/core": "0.7.3", 94 92 "@content-collections/mdx": "0.2.0", 95 93 "@content-collections/next": "0.2.3", 96 - "@headlessui/tailwindcss": "0.2.0", 97 94 "@openstatus/tsconfig": "workspace:*", 98 95 "@types/node": "20.14.8", 99 96 "@types/react": "18.3.3",
+8 -1
apps/web/src/app/status-page/[domain]/monitors/page.tsx
··· 89 89 </Button> 90 90 </div> 91 91 {group ? ( 92 - <SimpleChart data={group.data} region="ams" /> 92 + <SimpleChart 93 + data={group.data.map((d) => ({ 94 + timestamp: d.timestamp, 95 + // REMINDER: select first region as default 96 + // TODO: we could create an average of all regions instead 97 + latency: d[monitor.regions?.[0]], 98 + }))} 99 + /> 93 100 ) : ( 94 101 <p>missing data</p> 95 102 )}
+18 -11
apps/web/src/components/data-table/single-region/columns.tsx
··· 9 9 import { DataTableColumnHeader } from "./data-table-column-header"; 10 10 11 11 export interface RegionWithMetrics { 12 - data: (Partial<Record<Region, string>> & { timestamp: string })[]; 12 + data: (Partial<Record<Region, number>> & { timestamp: string })[]; 13 13 metrics?: ResponseTimeMetricsByRegion; 14 14 region: Region; 15 15 } ··· 40 40 cell: ({ row }) => { 41 41 const data = row.getValue("data") as RegionWithMetrics["data"]; 42 42 const region = row.getValue("region") as Region; 43 - return <SimpleChart data={data} region={region} />; 43 + return ( 44 + <SimpleChart 45 + data={data.map((d) => ({ 46 + timestamp: d.timestamp, 47 + latency: d[region], 48 + }))} 49 + /> 50 + ); 44 51 }, 45 52 meta: { 46 53 headerClassName: "min-w-[300px] w-full", ··· 55 62 cell: ({ row }) => { 56 63 const p50 = row.getValue("p50") as number; 57 64 return ( 58 - <div className="whitespace-nowrap"> 59 - <span className="font-mono">{formatNumber(p50)}</span>{" "} 60 - <span className="font-normal text-muted-foreground text-xs">ms</span> 65 + <div className="whitespace-nowrap font-mono"> 66 + <span>{formatNumber(p50)}</span> 67 + <span className="text-muted-foreground text-xs">ms</span> 61 68 </div> 62 69 ); 63 70 }, ··· 71 78 cell: ({ row }) => { 72 79 const p95 = row.getValue("p95") as number; 73 80 return ( 74 - <div className="whitespace-nowrap"> 75 - <span className="font-mono">{formatNumber(p95)}</span>{" "} 76 - <span className="font-normal text-muted-foreground text-xs">ms</span> 81 + <div className="whitespace-nowrap font-mono"> 82 + <span>{formatNumber(p95)}</span> 83 + <span className="text-muted-foreground text-xs">ms</span> 77 84 </div> 78 85 ); 79 86 }, ··· 87 94 cell: ({ row }) => { 88 95 const p99 = row.getValue("p99") as number; 89 96 return ( 90 - <div className="whitespace-nowrap"> 91 - <span className="font-mono">{formatNumber(p99)}</span>{" "} 92 - <span className="font-normal text-muted-foreground text-xs">ms</span> 97 + <div className="whitespace-nowrap font-mono"> 98 + <span>{formatNumber(p99)}</span> 99 + <span className="text-muted-foreground text-xs">ms</span> 93 100 </div> 94 101 ); 95 102 },
+133 -83
apps/web/src/components/monitor-charts/chart.tsx
··· 1 1 "use client"; 2 2 3 - import type { CustomTooltipProps, EventProps } from "@tremor/react"; 4 - import { LineChart } from "@tremor/react"; 5 - import { useState } from "react"; 6 - 7 - import { cn } from "@/lib/utils"; 8 3 import type { Region } from "@openstatus/db/src/schema/constants"; 9 - import { dataFormatter, regionFormatter } from "./utils"; 4 + import { 5 + ChartContainer, 6 + ChartLegend, 7 + ChartLegendContent, 8 + ChartTooltip, 9 + ChartTooltipContent, 10 + } from "@openstatus/ui"; 11 + import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; 12 + import { regionFormatter } from "./utils"; 10 13 11 14 interface ChartProps { 12 15 data: { timestamp: string; [key: string]: string | number }[]; ··· 14 17 } 15 18 16 19 export function Chart({ data, regions }: ChartProps) { 17 - const [value, setValue] = useState<EventProps | null>(null); 18 20 return ( 19 - <LineChart 20 - data={data} 21 - yAxisWidth={64} 22 - index="timestamp" 23 - categories={regions} 24 - colors={[ 25 - "blue", 26 - "amber", 27 - "cyan", 28 - "yellow", 29 - "red", 30 - "lime", 31 - "green", 32 - "purple", 33 - "indigo", 34 - "orange", 35 - "sky", 36 - "rose", 37 - "violet", 38 - "teal", 39 - "fuchsia", 40 - "pink", 41 - "emerald", 42 - ]} 43 - onValueChange={setValue} 44 - valueFormatter={dataFormatter} 45 - curveType="monotone" 46 - intervalType="equidistantPreserveStart" 47 - customTooltip={(props) => customTooltip({ ...props, value })} 48 - showAnimation={true} 49 - /> 21 + <ChartContainer config={chartConfig}> 22 + <LineChart 23 + accessibilityLayer 24 + data={data} 25 + margin={{ 26 + left: 12, 27 + right: 12, 28 + }} 29 + > 30 + <ChartLegend 31 + content={<ChartLegendContent className="flex-wrap" />} 32 + verticalAlign="top" 33 + /> 34 + <YAxis 35 + tickLine={false} 36 + axisLine={false} 37 + scale="sqrt" 38 + domain={([dataMin, dataMax]) => { 39 + const min = Math.max(Math.abs(dataMin) - 25, 0); 40 + const max = dataMax + 100; 41 + return [min, max]; 42 + }} 43 + /> 44 + <XAxis 45 + dataKey="timestamp" 46 + tickLine={false} 47 + tickFormatter={(value) => { 48 + return new Date(value).toLocaleDateString("en-US", { 49 + day: "numeric", 50 + month: "short", 51 + hour: "numeric", 52 + minute: "numeric", 53 + }); 54 + }} 55 + /> 56 + <CartesianGrid vertical={false} /> 57 + <ChartTooltip 58 + cursor={false} 59 + defaultIndex={10} 60 + content={ 61 + <ChartTooltipContent 62 + indicator="line" 63 + labelFormatter={(value) => { 64 + return new Date(value).toLocaleDateString("en-US", { 65 + day: "numeric", 66 + month: "short", 67 + hour: "numeric", 68 + minute: "numeric", 69 + }); 70 + }} 71 + formatter={(value, name) => ( 72 + <> 73 + <div 74 + className="w-1 h-full shrink-0 rounded-[2px] bg-[--color-bg] self-center" 75 + style={ 76 + { 77 + "--color-bg": `var(--color-${name})`, 78 + } as React.CSSProperties 79 + } 80 + /> 81 + {/* {chartConfig[name as keyof typeof chartConfig]?.label || name} */} 82 + {regionFormatter(name as Region)} 83 + <div className="ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground"> 84 + {value} 85 + <span className="font-normal text-muted-foreground"> 86 + ms 87 + </span> 88 + </div> 89 + </> 90 + )} 91 + /> 92 + } 93 + /> 94 + {regions.map((region) => { 95 + return ( 96 + <Line 97 + key={region} 98 + dataKey={region} 99 + type="monotone" 100 + stroke={`var(--color-${region})`} 101 + strokeWidth={2} 102 + dot={false} 103 + /> 104 + ); 105 + })} 106 + </LineChart> 107 + </ChartContainer> 50 108 ); 51 109 } 52 110 53 - const customTooltip = ({ 54 - payload, 55 - active, 56 - label, 57 - value, 58 - }: CustomTooltipProps & { value: EventProps }) => { 59 - if (!active || !payload) return null; 60 - return ( 61 - <div className="rounded-tremor-default border border-tremor-border bg-tremor-background p-2 text-tremor-default shadow-tremor-dropdown dark:border-dark-tremor-border dark:bg-dark-tremor-background dark:text-dark-tremor-default"> 62 - <div className="flex flex-col gap-2"> 63 - <p className="text-tremor-content dark:text-dark-tremor-content"> 64 - {label} 65 - </p> 66 - {payload 67 - .filter((category) => category.type !== undefined) // tremor adds additional data to the payload, we don't want that 68 - .map((category, idx) => { 69 - const isActive = value 70 - ? value.categoryClicked === category.dataKey 71 - : true; 72 - return ( 73 - <div 74 - // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 75 - key={idx} 76 - className={cn("flex flex-1 gap-2", !isActive && "opacity-60")} 77 - > 78 - <div 79 - className={cn( 80 - "flex w-1 flex-col rounded", 81 - `bg-${category.color}-500`, 82 - )} 83 - /> 84 - <div className="flex w-full justify-between gap-2"> 85 - <p className="shrink-0 text-tremor-content dark:text-dark-tremor-content"> 86 - {regionFormatter(category.dataKey as Region)} 87 - </p> 88 - <p className="font-medium font-mono text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis"> 89 - {dataFormatter(category.value as number)} 90 - </p> 91 - </div> 92 - </div> 93 - ); 94 - })} 95 - </div> 96 - </div> 97 - ); 111 + // basic tailwindcss 500 colors in hsl format 112 + const chartConfig: Record<Region, { label: string; color: string }> = { 113 + ams: { label: "AMS", color: "hsl(217.2 91.2% 59.8%)" }, 114 + arn: { label: "ARN", color: "hsl(238.7 83.5% 66.7%)" }, 115 + atl: { label: "ATL", color: "hsl(258.3 89.5% 66.3%)" }, 116 + bog: { label: "BOG", color: "hsl(270.7 91% 65.1%)" }, 117 + bom: { label: "BOM", color: "hsl(292.2 84.1% 60.6%)" }, 118 + bos: { label: "BOS", color: "hsl(330.4 81.2% 60.4%)" }, 119 + cdg: { label: "CDG", color: "hsl(349.7 89.2% 60.2%)" }, 120 + den: { label: "DEN", color: "hsl(215.4 16.3% 46.9%)" }, 121 + dfw: { label: "DFW", color: "hsl(220 8.9% 46.1%)" }, 122 + ewr: { label: "EWR", color: "hsl(240 3.8% 46.1%)" }, 123 + eze: { label: "EZE", color: "hsl(0 0% 45.1%)" }, 124 + fra: { label: "FRA", color: "hsl(25 5.3% 44.7%)" }, 125 + gdl: { label: "GDL", color: "hsl(0 84.2% 60.2%)" }, 126 + gig: { label: "GIG", color: "hsl(24.6 95% 53.1%)" }, 127 + gru: { label: "GRU", color: "hsl(37.7 92.1% 50.2%)" }, 128 + hkg: { label: "HKG", color: "hsl(45.4 93.4% 47.5%)" }, 129 + iad: { label: "IAD", color: "hsl(83.7 80.5% 44.3%)" }, 130 + jnb: { label: "JNB", color: "hsl(142.1 70.6% 45.3%)" }, 131 + lax: { label: "LAX", color: "hsl(160.1 84.1% 39.4%)" }, 132 + lhr: { label: "LHR", color: "hsl(173.4 80.4% 40%)" }, 133 + mad: { label: "MAD", color: "hsl(188.7 94.5% 42.7%)" }, 134 + mia: { label: "MIA", color: "hsl(198.6 88.7% 48.4%)" }, 135 + nrt: { label: "NRT", color: "hsl(217.2 91.2% 59.8%)" }, 136 + ord: { label: "ORD", color: "hsl(238.7 83.5% 66.7%)" }, 137 + otp: { label: "OTP", color: "hsl(258.3 89.5% 66.3%)" }, 138 + phx: { label: "PHX", color: "hsl(270.7 91% 65.1%)" }, 139 + qro: { label: "QRO", color: "hsl(292.2 84.1% 60.6%)" }, 140 + scl: { label: "SCL", color: "hsl(330.4 81.2% 60.4%)" }, 141 + sjc: { label: "SJC", color: "hsl(349.7 89.2% 60.2%)" }, 142 + sea: { label: "SEA", color: "hsl(215.4 16.3% 46.9%)" }, 143 + sin: { label: "SIN", color: "hsl(220 8.9% 46.1%)" }, 144 + syd: { label: "SYD", color: "hsl(240 3.8% 46.1%)" }, 145 + waw: { label: "WAW", color: "hsl(0 0% 45.1%)" }, 146 + yul: { label: "YUL", color: "hsl(25 5.3% 44.7%)" }, 147 + yyz: { label: "YYZ", color: "hsl(0 84.2% 60.2%)" }, 98 148 };
+7 -2
apps/web/src/components/monitor-charts/region-table.tsx
··· 18 18 regions: Region[]; 19 19 data: { 20 20 regions: Region[]; 21 - data: (Partial<Record<Region, string>> & { timestamp: string })[]; 21 + data: (Partial<Record<Region, number>> & { timestamp: string })[]; 22 22 }; 23 23 metricsByRegion: ResponseTimeMetricsByRegion[]; 24 24 caption?: string; ··· 60 60 </p> 61 61 </TableCell> 62 62 <TableCell> 63 - <SimpleChart data={data.data} region={region} /> 63 + <SimpleChart 64 + data={data.data.map((d) => ({ 65 + timestamp: d.timestamp, 66 + latency: d[region], 67 + }))} 68 + /> 64 69 </TableCell> 65 70 <TableCell className="text-right font-medium"> 66 71 {formatNumber(metrics?.p50Latency)}
+6 -1
apps/web/src/components/monitor-charts/simple-chart-wrapper.tsx
··· 21 21 <div className="w-24"> 22 22 <p className="font-mono">{region}</p> 23 23 </div> 24 - <SimpleChart data={group.data} region={region} /> 24 + <SimpleChart 25 + data={group.data.map((d) => ({ 26 + timestamp: d.timestamp, 27 + latency: d[region], 28 + }))} 29 + /> 25 30 </div> 26 31 ); 27 32 }
+69 -60
apps/web/src/components/monitor-charts/simple-chart.tsx
··· 1 1 "use client"; 2 2 3 - import type { CustomTooltipProps } from "@tremor/react"; 4 - import { LineChart } from "@tremor/react"; 3 + import { Line, LineChart, XAxis } from "recharts"; 4 + 5 + import { 6 + ChartContainer, 7 + ChartTooltip, 8 + ChartTooltipContent, 9 + } from "@openstatus/ui"; 5 10 6 - import { cn } from "@/lib/utils"; 7 - import { dataFormatter } from "./utils"; 11 + const chartConfig = { 12 + latency: { 13 + label: "Latency", 14 + color: "hsl(var(--status-operational))", 15 + }, 16 + }; 8 17 9 18 export interface SimpleChartProps { 10 - data: { timestamp: string; [key: string]: string }[]; 11 - region: string; 19 + data: { timestamp: string; latency: number | undefined }[]; 12 20 } 13 21 14 22 // TODO: allow click to open `./details` intercepting route 15 - export function SimpleChart({ data, region }: SimpleChartProps) { 23 + export function SimpleChart({ data }: SimpleChartProps) { 16 24 return ( 17 - <LineChart 18 - data={data} 19 - index="timestamp" 20 - categories={[region]} 21 - colors={["green"]} 22 - className="h-20 w-full" // cannot take parent height 23 - valueFormatter={dataFormatter} 24 - curveType="monotone" 25 - autoMinValue 26 - showAnimation 27 - noDataText="" 28 - showXAxis={false} 29 - showYAxis={false} 30 - showGridLines={false} 31 - showLegend={false} 32 - customTooltip={customTooltip} 33 - // FEATURE: it would be nice, if on click, the tooltip would be open 34 - // onValueChange={(v) => setValue(v)} 35 - /> 25 + <ChartContainer config={chartConfig} className="h-20 w-full"> 26 + <LineChart 27 + accessibilityLayer 28 + data={data} 29 + margin={{ 30 + left: 12, 31 + right: 12, 32 + }} 33 + > 34 + <XAxis dataKey="timestamp" hide /> 35 + <ChartTooltip 36 + cursor={false} 37 + content={ 38 + <ChartTooltipContent 39 + indicator="line" 40 + labelFormatter={(value) => { 41 + return new Date(value).toLocaleDateString("en-US", { 42 + day: "numeric", 43 + month: "short", 44 + hour: "numeric", 45 + minute: "numeric", 46 + }); 47 + }} 48 + formatter={(value, name) => ( 49 + <> 50 + <div 51 + className="w-1 h-full shrink-0 rounded-[2px] bg-[--color-bg] self-center" 52 + style={ 53 + { 54 + "--color-bg": `var(--color-${name})`, 55 + } as React.CSSProperties 56 + } 57 + /> 58 + {chartConfig[name as keyof typeof chartConfig]?.label || name} 59 + <div className="ml-auto flex items-baseline gap-0.5 font-mono font-medium tabular-nums text-foreground"> 60 + {value} 61 + <span className="font-normal text-muted-foreground"> 62 + ms 63 + </span> 64 + </div> 65 + </> 66 + )} 67 + /> 68 + } 69 + /> 70 + <Line 71 + dataKey="latency" 72 + type="monotone" 73 + stroke="var(--color-latency)" 74 + strokeWidth={2} 75 + dot={false} 76 + /> 77 + </LineChart> 78 + </ChartContainer> 36 79 ); 37 80 } 38 - 39 - const customTooltip = ({ payload, active, label }: CustomTooltipProps) => { 40 - if (!active || !payload) return null; 41 - const data = payload?.[0]; // BUG: when onValueChange is set, payload is duplicated 42 - if (!data) return null; 43 - 44 - return ( 45 - <div className="rounded-tremor-default border border-tremor-border bg-tremor-background p-2 text-tremor-default shadow-tremor-dropdown dark:border-dark-tremor-border dark:bg-dark-tremor-background dark:text-dark-tremor-default"> 46 - <div className="flex flex-col gap-3"> 47 - {[data].map((category, idx) => { 48 - return ( 49 - // biome-ignore lint/suspicious/noArrayIndexKey: <explanation> 50 - <div key={idx} className="flex flex-1 gap-2"> 51 - <div 52 - className={cn( 53 - "flex w-1 flex-col rounded", 54 - `bg-${category.color}-500`, 55 - )} 56 - /> 57 - <div className="flex flex-col gap-1"> 58 - <p className="text-tremor-content dark:text-dark-tremor-content"> 59 - {label} 60 - </p> 61 - <p className="font-medium font-mono text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis"> 62 - {dataFormatter(category.value as number)} 63 - </p> 64 - </div> 65 - </div> 66 - ); 67 - })} 68 - </div> 69 - </div> 70 - ); 71 - };
+1 -1
apps/web/src/components/monitor-charts/utils.tsx
··· 48 48 } 49 49 return acc; 50 50 }, 51 - [] as (Partial<Record<Region, string>> & { timestamp: string })[], 51 + [] as (Partial<Record<Region, number>> & { timestamp: string })[], 52 52 ); 53 53 54 54 // regions are sorted by the flag utf-8 code
-131
apps/web/tailwind.config.ts
··· 1 1 // eslint-disable-next-line @typescript-eslint/no-var-requires 2 2 const { fontFamily } = require("tailwindcss/defaultTheme"); 3 3 4 - /** 5 - * TODO: is there a way to merge `tremor` with `shadcn`? At least the colors 6 - */ 7 - 8 4 /** @type {import('tailwindcss').Config} */ 9 5 module.exports = { 10 6 darkMode: ["class"], 11 7 content: [ 12 8 "src/**/*.{ts,tsx}", 13 - /* tremor */ 14 - "./node_modules/@tremor/**/*.{js,ts,jsx,tsx}", 15 9 // our vercel integration 16 10 "../../packages/integrations/**/*.{ts,tsx}", 17 11 "../../packages/ui/**/*.{ts,tsx}", ··· 19 13 "./node_modules/@openstatus/react/**/*.{js,ts,jsx,tsx}", 20 14 ], 21 15 theme: { 22 - /* Tremor */ 23 - transparent: "transparent", 24 - current: "currentColor", 25 - /* */ 26 16 container: { 27 17 center: true, 28 18 padding: "2rem", ··· 84 74 DEFAULT: "hsl(var(--status-monitoring))", 85 75 }, 86 76 }, 87 - /* Tremor */ 88 - // light mode 89 - tremor: { 90 - brand: { 91 - faint: "#eff6ff", // blue-50 92 - muted: "#bfdbfe", // blue-200 93 - subtle: "#60a5fa", // blue-400 94 - DEFAULT: "#3b82f6", // blue-500 95 - emphasis: "#1d4ed8", // blue-700 96 - inverted: "#ffffff", // white 97 - }, 98 - background: { 99 - muted: "#f9fafb", // gray-50 100 - subtle: "#f3f4f6", // gray-100 101 - DEFAULT: "#ffffff", // white 102 - emphasis: "#374151", // gray-700 103 - }, 104 - border: { 105 - DEFAULT: "#e5e7eb", // gray-200 106 - }, 107 - ring: { 108 - DEFAULT: "#e5e7eb", // gray-200 109 - }, 110 - content: { 111 - subtle: "#9ca3af", // gray-400 112 - DEFAULT: "#6b7280", // gray-500 113 - emphasis: "#374151", // gray-700 114 - strong: "#111827", // gray-900 115 - inverted: "#ffffff", // white 116 - }, 117 - }, 118 - // dark mode 119 - "dark-tremor": { 120 - brand: { 121 - faint: "#0B1229", // custom 122 - muted: "#172554", // blue-950 123 - subtle: "#1e40af", // blue-800 124 - DEFAULT: "#3b82f6", // blue-500 125 - emphasis: "#60a5fa", // blue-400 126 - inverted: "#030712", // gray-950 127 - }, 128 - background: { 129 - muted: "#131A2B", // custom 130 - subtle: "#1f2937", // gray-800 131 - DEFAULT: "#111827", // gray-900 132 - emphasis: "#d1d5db", // gray-300 133 - }, 134 - border: { 135 - DEFAULT: "#1f2937", // gray-800 136 - }, 137 - ring: { 138 - DEFAULT: "#1f2937", // gray-800 139 - }, 140 - content: { 141 - subtle: "#4b5563", // gray-600 142 - DEFAULT: "#6b7280", // gray-600 143 - emphasis: "#e5e7eb", // gray-200 144 - strong: "#f9fafb", // gray-50 145 - inverted: "#000000", // black 146 - }, 147 - }, 148 - /* */ 149 77 }, 150 78 borderRadius: { 151 79 lg: "var(--radius)", 152 80 md: "calc(var(--radius) - 2px)", 153 81 sm: "calc(var(--radius) - 4px)", 154 - /* Tremor */ 155 - "tremor-small": "0.375rem", 156 - "tremor-default": "0.5rem", 157 - "tremor-full": "9999px", 158 - /* */ 159 82 }, 160 - /* Tremor */ 161 - boxShadow: { 162 - // light 163 - "tremor-input": "0 1px 2px 0 rgb(0 0 0 / 0.05)", 164 - "tremor-card": 165 - "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", 166 - "tremor-dropdown": 167 - "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", 168 - // dark 169 - "dark-tremor-input": "0 1px 2px 0 rgb(0 0 0 / 0.05)", 170 - "dark-tremor-card": 171 - "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", 172 - "dark-tremor-dropdown": 173 - "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", 174 - }, 175 - fontSize: { 176 - "tremor-label": ["0.75rem"], 177 - "tremor-default": ["0.875rem", { lineHeight: "1.25rem" }], 178 - "tremor-title": ["1.125rem", { lineHeight: "1.75rem" }], 179 - "tremor-metric": ["1.875rem", { lineHeight: "2.25rem" }], 180 - }, 181 - /* */ 182 83 fontFamily: { 183 84 sans: ["var(--font-sans)", ...fontFamily.sans], 184 85 cal: ["var(--font-calsans)"], ··· 199 100 }, 200 101 }, 201 102 }, 202 - /* Tremor */ 203 - safelist: [ 204 - { 205 - pattern: 206 - /^(bg-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, 207 - variants: ["hover", "ui-selected"], 208 - }, 209 - { 210 - pattern: 211 - /^(text-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, 212 - variants: ["hover", "ui-selected"], 213 - }, 214 - { 215 - pattern: 216 - /^(border-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, 217 - variants: ["hover", "ui-selected"], 218 - }, 219 - { 220 - pattern: 221 - /^(ring-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, 222 - }, 223 - { 224 - pattern: 225 - /^(stroke-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, 226 - }, 227 - { 228 - pattern: 229 - /^(fill-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, 230 - }, 231 - ], 232 - /* */ 233 103 plugins: [ 234 104 require("tailwindcss-animate"), 235 105 require("@tailwindcss/container-queries"), 236 106 require("@tailwindcss/typography"), 237 - require("@headlessui/tailwindcss"), 238 107 ], 239 108 };
+63 -155
pnpm-lock.yaml
··· 162 162 version: link:../../packages/utils 163 163 '@scalar/hono-api-reference': 164 164 specifier: 0.5.131 165 - version: 0.5.131(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2) 165 + version: 0.5.131(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2) 166 166 '@t3-oss/env-core': 167 167 specifier: 0.7.1 168 168 version: 0.7.1(typescript@5.7.2)(zod@3.23.8) ··· 212 212 '@google-cloud/tasks': 213 213 specifier: 4.0.1 214 214 version: 4.0.1(encoding@0.1.13) 215 - '@headlessui/react': 216 - specifier: 1.7.17 217 - version: 1.7.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 218 215 '@hookform/resolvers': 219 216 specifier: 3.3.1 220 217 version: 3.3.1(react-hook-form@7.47.0(react@18.3.1)) ··· 302 299 '@tanstack/react-table': 303 300 specifier: 8.10.3 304 301 version: 8.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 305 - '@tremor/react': 306 - specifier: 3.17.4 307 - version: 3.17.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2))) 308 302 '@trpc/client': 309 303 specifier: 11.0.0-rc.553 310 304 version: 11.0.0-rc.553(@trpc/server@11.0.0-rc.553) ··· 447 441 '@content-collections/next': 448 442 specifier: 0.2.3 449 443 version: 0.2.3(@content-collections/core@0.7.3(typescript@5.5.2))(next@14.2.15(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) 450 - '@headlessui/tailwindcss': 451 - specifier: 0.2.0 452 - version: 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2))) 453 444 '@openstatus/tsconfig': 454 445 specifier: workspace:* 455 446 version: link:../../packages/tsconfig ··· 3023 3014 '@floating-ui/dom@1.6.7': 3024 3015 resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} 3025 3016 3026 - '@floating-ui/react-dom@1.3.0': 3027 - resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} 3028 - peerDependencies: 3029 - react: '>=16.8.0' 3030 - react-dom: '>=16.8.0' 3031 - 3032 3017 '@floating-ui/react-dom@2.0.2': 3033 3018 resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} 3034 - peerDependencies: 3035 - react: '>=16.8.0' 3036 - react-dom: '>=16.8.0' 3037 - 3038 - '@floating-ui/react@0.19.2': 3039 - resolution: {integrity: sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==} 3040 3019 peerDependencies: 3041 3020 react: '>=16.8.0' 3042 3021 react-dom: '>=16.8.0' ··· 3063 3042 engines: {node: '>=6'} 3064 3043 hasBin: true 3065 3044 3066 - '@headlessui/react@1.7.17': 3067 - resolution: {integrity: sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==} 3068 - engines: {node: '>=10'} 3069 - peerDependencies: 3070 - react: ^16 || ^17 || ^18 3071 - react-dom: ^16 || ^17 || ^18 3072 - 3073 - '@headlessui/react@1.7.19': 3074 - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} 3075 - engines: {node: '>=10'} 3076 - peerDependencies: 3077 - react: ^16 || ^17 || ^18 3078 - react-dom: ^16 || ^17 || ^18 3079 - 3080 3045 '@headlessui/tailwindcss@0.2.0': 3081 3046 resolution: {integrity: sha512-fpL830Fln1SykOCboExsWr3JIVeQKieLJ3XytLe/tt1A0XzqUthOftDmjcCYLW62w7mQI7wXcoPXr3tZ9QfGxw==} 3082 - engines: {node: '>=10'} 3083 - peerDependencies: 3084 - tailwindcss: ^3.0 3085 - 3086 - '@headlessui/tailwindcss@0.2.1': 3087 - resolution: {integrity: sha512-2+5+NZ+RzMyrVeCZOxdbvkUSssSxGvcUxphkIfSVLpRiKsj+/63T2TOL9dBYMXVfj/CGr6hMxSRInzXv6YY7sA==} 3088 3047 engines: {node: '>=10'} 3089 3048 peerDependencies: 3090 3049 tailwindcss: ^3.0 ··· 5225 5184 react: '>=16' 5226 5185 react-dom: '>=16' 5227 5186 5228 - '@tanstack/react-virtual@3.0.2': 5229 - resolution: {integrity: sha512-9XbRLPKgnhMwwmuQMnJMv+5a9sitGNCSEtf/AZXzmJdesYk7XsjYHaEDny+IrJzvPNwZliIIDwCRiaUqR3zzCA==} 5230 - peerDependencies: 5231 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 5232 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 5233 - 5234 5187 '@tanstack/table-core@8.10.3': 5235 5188 resolution: {integrity: sha512-hJ55YfJlWbfzRROfcyA/kC1aZr/shsLA8XNAwN8jXylhYWGLnPmiJJISrUfj4dMMWRiFi0xBlnlC7MLH+zSrcw==} 5236 5189 engines: {node: '>=12'} 5237 - 5238 - '@tanstack/virtual-core@3.0.0': 5239 - resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} 5240 5190 5241 5191 '@tanstack/virtual-core@3.8.3': 5242 5192 resolution: {integrity: sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==} ··· 5284 5234 '@tootallnate/quickjs-emscripten@0.23.0': 5285 5235 resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} 5286 5236 5287 - '@tremor/react@3.17.4': 5288 - resolution: {integrity: sha512-teItTLbZglXJwakW8XYtRfIXZvp1Y6HKsaD9MC8cJqXG3vf1n6D9aPz3OKyWmDkBYE1Yjo/PTmEHKQIwN+2suQ==} 5289 - peerDependencies: 5290 - react: ^18.0.0 5291 - react-dom: '>=16.6.0' 5292 - 5293 5237 '@trpc/client@11.0.0-rc.553': 5294 5238 resolution: {integrity: sha512-ICgziilbuAslRgHIVJZ162KaHQRpHXA1C1LPRsNpxPa9aStPF7eThAjn4V3JmDyJsuDLQgAmqLVRImlLPMYR5Q==} 5295 5239 peerDependencies: ··· 6495 6439 date-fns@2.30.0: 6496 6440 resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} 6497 6441 engines: {node: '>=0.11'} 6498 - 6499 - date-fns@3.6.0: 6500 - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} 6501 6442 6502 6443 debug@2.6.9: 6503 6444 resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} ··· 9376 9317 resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 9377 9318 hasBin: true 9378 9319 9379 - react-day-picker@8.10.1: 9380 - resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} 9381 - peerDependencies: 9382 - date-fns: ^2.28.0 || ^3.0.0 9383 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 9384 - 9385 9320 react-day-picker@8.8.2: 9386 9321 resolution: {integrity: sha512-sK5M5PNZaLiszmACUKUpVu1eX3eFDVV+WLdWQ3BxTPbEC9jhuawmlgpbSXX5dIIQQwJpZ4wwP5+vsMVOwa1IRw==} 9387 9322 peerDependencies: ··· 9466 9401 react: '>=16.6.0' 9467 9402 react-dom: '>=16.6.0' 9468 9403 9469 - react-transition-state@2.1.1: 9470 - resolution: {integrity: sha512-kQx5g1FVu9knoz1T1WkapjUgFz08qQ/g1OmuWGi3/AoEFfS0kStxrPlZx81urjCXdz2d+1DqLpU6TyLW/Ro04Q==} 9471 - peerDependencies: 9472 - react: '>=16.8.0' 9473 - react-dom: '>=16.8.0' 9474 - 9475 9404 react-tweet@3.1.1: 9476 9405 resolution: {integrity: sha512-8GQLa5y0G56kvGQkN7OiaKkjFAhWYVdyFq62ioY2qVtpMrjchVU+3KnqneCyp0+BemOQZkg6WWp/qoCNeEMH6A==} 9477 9406 peerDependencies: ··· 10163 10092 resolution: {integrity: sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ==} 10164 10093 peerDependencies: 10165 10094 react: ^16.11.0 || ^17.0.0 || ^18.0.0 10166 - 10167 - tabbable@6.2.0: 10168 - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 10169 10095 10170 10096 tailwind-merge@1.14.0: 10171 10097 resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} ··· 13439 13365 dependencies: 13440 13366 '@floating-ui/core': 1.6.4 13441 13367 '@floating-ui/utils': 0.2.4 13442 - 13443 - '@floating-ui/react-dom@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 13444 - dependencies: 13445 - '@floating-ui/dom': 1.5.3 13446 - react: 18.3.1 13447 - react-dom: 18.3.1(react@18.3.1) 13448 13368 13449 13369 '@floating-ui/react-dom@2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 13450 13370 dependencies: ··· 13452 13372 react: 18.3.1 13453 13373 react-dom: 18.3.1(react@18.3.1) 13454 13374 13455 - '@floating-ui/react@0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 13456 - dependencies: 13457 - '@floating-ui/react-dom': 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 13458 - aria-hidden: 1.2.3 13459 - react: 18.3.1 13460 - react-dom: 18.3.1(react@18.3.1) 13461 - tabbable: 6.2.0 13462 - 13463 13375 '@floating-ui/utils@0.1.6': {} 13464 13376 13465 13377 '@floating-ui/utils@0.2.4': {} ··· 13492 13404 protobufjs: 7.2.5 13493 13405 yargs: 17.7.2 13494 13406 13495 - '@headlessui/react@1.7.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 13496 - dependencies: 13497 - client-only: 0.0.1 13498 - react: 18.3.1 13499 - react-dom: 18.3.1(react@18.3.1) 13500 - 13501 - '@headlessui/react@1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 13502 - dependencies: 13503 - '@tanstack/react-virtual': 3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 13504 - client-only: 0.0.1 13505 - react: 18.3.1 13506 - react-dom: 18.3.1(react@18.3.1) 13507 - 13508 - '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))': 13509 - dependencies: 13510 - tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)) 13511 - 13512 - '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.7.2)))': 13513 - dependencies: 13514 - tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.7.2)) 13515 - 13516 - '@headlessui/tailwindcss@0.2.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))': 13407 + '@headlessui/tailwindcss@0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2)))': 13517 13408 dependencies: 13518 - tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)) 13409 + tailwindcss: 3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2)) 13519 13410 13520 13411 '@headlessui/vue@1.7.22(vue@3.4.31(typescript@5.7.2))': 13521 13412 dependencies: ··· 15215 15106 '@rollup/rollup-win32-x64-msvc@4.27.4': 15216 15107 optional: true 15217 15108 15218 - '@scalar/api-client@2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2)': 15109 + '@scalar/api-client@2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2)': 15219 15110 dependencies: 15220 - '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.7.2))) 15111 + '@headlessui/tailwindcss': 0.2.0(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2))) 15221 15112 '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.7.2)) 15222 15113 '@scalar/components': 0.12.28(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(typescript@5.7.2) 15223 15114 '@scalar/draggable': 0.1.4(typescript@5.7.2) ··· 15253 15144 - typescript 15254 15145 - vitest 15255 15146 15256 - '@scalar/api-reference@1.24.70(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2)': 15147 + '@scalar/api-reference@1.24.70(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2)': 15257 15148 dependencies: 15258 15149 '@floating-ui/vue': 1.1.1(vue@3.4.31(typescript@5.7.2)) 15259 15150 '@headlessui/vue': 1.7.22(vue@3.4.31(typescript@5.7.2)) 15260 - '@scalar/api-client': 2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2) 15151 + '@scalar/api-client': 2.0.45(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2) 15261 15152 '@scalar/components': 0.12.28(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(bufferutil@4.0.8)(utf-8-validate@6.0.4))(typescript@5.7.2) 15262 15153 '@scalar/oas-utils': 0.2.26(typescript@5.7.2) 15263 15154 '@scalar/openapi-parser': 0.7.2 ··· 15342 15233 transitivePeerDependencies: 15343 15234 - typescript 15344 15235 15345 - '@scalar/hono-api-reference@0.5.131(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2)': 15236 + '@scalar/hono-api-reference@0.5.131(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2)': 15346 15237 dependencies: 15347 - '@scalar/api-reference': 1.24.70(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2) 15238 + '@scalar/api-reference': 1.24.70(postcss@8.4.49)(storybook@8.2.1(@babel/preset-env@7.24.8(@babel/core@7.26.0))(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.7.2)))(typescript@5.7.2) 15348 15239 hono: 4.5.3 15349 15240 transitivePeerDependencies: 15350 15241 - '@jest/globals' ··· 16108 15999 react: 18.3.1 16109 16000 react-dom: 18.3.1(react@18.3.1) 16110 16001 16111 - '@tanstack/react-virtual@3.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': 16112 - dependencies: 16113 - '@tanstack/virtual-core': 3.0.0 16114 - react: 18.3.1 16115 - react-dom: 18.3.1(react@18.3.1) 16116 - 16117 16002 '@tanstack/table-core@8.10.3': {} 16118 - 16119 - '@tanstack/virtual-core@3.0.0': {} 16120 16003 16121 16004 '@tanstack/virtual-core@3.8.3': {} 16122 16005 ··· 16155 16038 16156 16039 '@tootallnate/quickjs-emscripten@0.23.0': {} 16157 16040 16158 - '@tremor/react@3.17.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2)))': 16159 - dependencies: 16160 - '@floating-ui/react': 0.19.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 16161 - '@headlessui/react': 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 16162 - '@headlessui/tailwindcss': 0.2.1(tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.14.8)(typescript@5.5.2))) 16163 - date-fns: 3.6.0 16164 - react: 18.3.1 16165 - react-day-picker: 8.10.1(date-fns@3.6.0)(react@18.3.1) 16166 - react-dom: 18.3.1(react@18.3.1) 16167 - react-transition-state: 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 16168 - recharts: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 16169 - tailwind-merge: 1.14.0 16170 - transitivePeerDependencies: 16171 - - tailwindcss 16172 - 16173 16041 '@trpc/client@11.0.0-rc.553(@trpc/server@11.0.0-rc.553)': 16174 16042 dependencies: 16175 16043 '@trpc/server': 11.0.0-rc.553 ··· 17573 17441 date-fns@2.30.0: 17574 17442 dependencies: 17575 17443 '@babel/runtime': 7.23.2 17576 - 17577 - date-fns@3.6.0: {} 17578 17444 17579 17445 debug@2.6.9: 17580 17446 dependencies: ··· 20945 20811 postcss: 8.4.38 20946 20812 ts-node: 10.9.2(@types/node@20.8.0)(typescript@5.5.2) 20947 20813 20814 + postcss-load-config@4.0.1(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2)): 20815 + dependencies: 20816 + lilconfig: 2.1.0 20817 + yaml: 2.3.3 20818 + optionalDependencies: 20819 + postcss: 8.4.38 20820 + ts-node: 10.9.2(@types/node@20.8.0)(typescript@5.7.2) 20821 + 20948 20822 postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)): 20949 20823 dependencies: 20950 20824 lilconfig: 2.1.0 ··· 21219 21093 minimist: 1.2.8 21220 21094 strip-json-comments: 2.0.1 21221 21095 21222 - react-day-picker@8.10.1(date-fns@3.6.0)(react@18.3.1): 21223 - dependencies: 21224 - date-fns: 3.6.0 21225 - react: 18.3.1 21226 - 21227 21096 react-day-picker@8.8.2(date-fns@2.30.0)(react@18.3.1): 21228 21097 dependencies: 21229 21098 date-fns: 2.30.0 ··· 21326 21195 dom-helpers: 5.2.1 21327 21196 loose-envify: 1.4.0 21328 21197 prop-types: 15.8.1 21329 - react: 18.3.1 21330 - react-dom: 18.3.1(react@18.3.1) 21331 - 21332 - react-transition-state@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 21333 - dependencies: 21334 21198 react: 18.3.1 21335 21199 react-dom: 18.3.1(react@18.3.1) 21336 21200 ··· 22284 22148 react: 18.3.1 22285 22149 use-sync-external-store: 1.2.0(react@18.3.1) 22286 22150 22287 - tabbable@6.2.0: {} 22288 - 22289 22151 tailwind-merge@1.14.0: {} 22290 22152 22291 22153 tailwind-merge@2.4.0: {} ··· 22424 22286 postcss-import: 15.1.0(postcss@8.4.38) 22425 22287 postcss-js: 4.0.1(postcss@8.4.38) 22426 22288 postcss-load-config: 4.0.1(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.5.2)) 22289 + postcss-nested: 6.0.1(postcss@8.4.38) 22290 + postcss-selector-parser: 6.0.13 22291 + resolve: 1.22.8 22292 + sucrase: 3.34.0 22293 + transitivePeerDependencies: 22294 + - ts-node 22295 + 22296 + tailwindcss@3.4.3(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2)): 22297 + dependencies: 22298 + '@alloc/quick-lru': 5.2.0 22299 + arg: 5.0.2 22300 + chokidar: 3.5.3 22301 + didyoumean: 1.2.2 22302 + dlv: 1.1.3 22303 + fast-glob: 3.3.1 22304 + glob-parent: 6.0.2 22305 + is-glob: 4.0.3 22306 + jiti: 1.21.0 22307 + lilconfig: 2.1.0 22308 + micromatch: 4.0.5 22309 + normalize-path: 3.0.0 22310 + object-hash: 3.0.0 22311 + picocolors: 1.0.0 22312 + postcss: 8.4.38 22313 + postcss-import: 15.1.0(postcss@8.4.38) 22314 + postcss-js: 4.0.1(postcss@8.4.38) 22315 + postcss-load-config: 4.0.1(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2)) 22427 22316 postcss-nested: 6.0.1(postcss@8.4.38) 22428 22317 postcss-selector-parser: 6.0.13 22429 22318 resolve: 1.22.8 ··· 22628 22517 typescript: 5.5.2 22629 22518 v8-compile-cache-lib: 3.0.1 22630 22519 yn: 3.1.1 22520 + 22521 + ts-node@10.9.2(@types/node@20.8.0)(typescript@5.7.2): 22522 + dependencies: 22523 + '@cspotcode/source-map-support': 0.8.1 22524 + '@tsconfig/node10': 1.0.11 22525 + '@tsconfig/node12': 1.0.11 22526 + '@tsconfig/node14': 1.0.3 22527 + '@tsconfig/node16': 1.0.4 22528 + '@types/node': 20.8.0 22529 + acorn: 8.11.3 22530 + acorn-walk: 8.3.2 22531 + arg: 4.1.3 22532 + create-require: 1.1.1 22533 + diff: 4.0.2 22534 + make-error: 1.3.6 22535 + typescript: 5.7.2 22536 + v8-compile-cache-lib: 3.0.1 22537 + yn: 3.1.1 22538 + optional: true 22631 22539 22632 22540 tsconfck@3.1.4(typescript@5.7.2): 22633 22541 optionalDependencies: