diff --git a/app/[host]/database/[database]/@nav/loading.tsx b/app/[host]/database/[database]/@nav/loading.tsx index 02abe70f..86cd9f27 100644 --- a/app/[host]/database/[database]/@nav/loading.tsx +++ b/app/[host]/database/[database]/@nav/loading.tsx @@ -1,5 +1,5 @@ -import { MultiLineSkeleton } from '@/components/skeleton' +import { ListSkeleton } from '@/components/skeleton' export default function Loading() { - return + return } diff --git a/app/[host]/database/[database]/@nav/nav.tsx b/app/[host]/database/[database]/@nav/nav.tsx index a559f59e..0add9bd8 100644 --- a/app/[host]/database/[database]/@nav/nav.tsx +++ b/app/[host]/database/[database]/@nav/nav.tsx @@ -6,6 +6,7 @@ import { ErrorAlert } from '@/components/error-alert' import { fetchData } from '@/lib/clickhouse' import { cn } from '@/lib/utils' +import { cache } from 'react' import { listDatabases } from '../../queries' import { DatabaseBreadcrumb } from './breadcrumb' @@ -21,25 +22,32 @@ interface DatabaseCount { count: number } +export const getListDatabaseCached = cache(async () => { + return fetchData({ + query: listDatabases, + clickhouse_settings: { + use_query_cache: 1, + query_cache_system_table_handling: 'save', + query_cache_ttl: 300, + }, + }) +}) + +export const preload = async (host: number) => { + void (await getListDatabaseCached()) +} + export async function Nav({ host, database, collapsible }: Props) { + preload(host) let databases: DatabaseCount[] = [] try { - // List database names and number of tables - const data = (await fetchData({ - query: listDatabases, - clickhouse_settings: { - use_query_cache: 1, - query_cache_system_table_handling: 'save', - query_cache_ttl: 300, - }, - })) satisfies { data: DatabaseCount[] } - - databases = data.data + const data = await getListDatabaseCached() + databases = data.data as DatabaseCount[] } catch (e: any) { return ( @@ -93,8 +101,8 @@ function Sidebar({ isCollapsed?: boolean }) { return ( -
-
+
+
{databases.map((db) => ( -
+
- {db.name} - ({db.count}) + + {db.name} + + {db.count}
))} @@ -118,3 +133,15 @@ function Sidebar({
) } + +const Count = ({ children }: { children: React.ReactNode }) => ( + + {children} + +) diff --git a/app/[host]/database/[database]/layout.tsx b/app/[host]/database/[database]/layout.tsx index 87923d7c..73611d19 100644 --- a/app/[host]/database/[database]/layout.tsx +++ b/app/[host]/database/[database]/layout.tsx @@ -3,7 +3,6 @@ import { ResizablePanel, ResizablePanelGroup, } from '@/components/resizable' -import { cn } from '@/lib/utils' type Params = Promise<{ host: number @@ -23,22 +22,21 @@ export default async function TableListPage({ nav, children }: TableListProps) { return ( -
{nav}
+ {nav}
- -
{children}
+ + {children}
) diff --git a/app/[host]/database/[database]/page.tsx b/app/[host]/database/[database]/page.tsx index fdfbe64c..393fb100 100644 --- a/app/[host]/database/[database]/page.tsx +++ b/app/[host]/database/[database]/page.tsx @@ -43,9 +43,12 @@ export default async function TableListPage({ params }: TableListProps) { ], table: [ ColumnFormat.Link, - { href: `/${host}/database/${database}/[table]` }, + { + href: `/${host}/database/${database}/[table]`, + className: 'truncate max-w-48', + }, ], - engine: ColumnFormat.ColoredBadge, + engine: [ColumnFormat.ColoredBadge, { className: 'truncate max-w-40' }], readable_compressed: ColumnFormat.BackgroundBar, readable_uncompressed: ColumnFormat.BackgroundBar, readable_total_rows: ColumnFormat.BackgroundBar, diff --git a/app/globals.css b/app/globals.css index 8546df2b..f45f9072 100644 --- a/app/globals.css +++ b/app/globals.css @@ -43,6 +43,15 @@ --chart-orange-600: 20.5, 90.2%, 48.2%; --chart-indigo-300: 230, 94%, 82%; --chart-yellow: 45 100% 60%; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + } .dark { @@ -70,5 +79,13 @@ --chart-3: 30 80% 55%; --chart-4: 280 65% 60%; --chart-5: 340 75% 55%; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; } } diff --git a/components/data-table/cells/colored-badge-format.cy.tsx b/components/data-table/cells/colored-badge-format.cy.tsx index 5a669e25..8799ce9c 100644 --- a/components/data-table/cells/colored-badge-format.cy.tsx +++ b/components/data-table/cells/colored-badge-format.cy.tsx @@ -25,8 +25,28 @@ describe('', () => { cy.get('span').should('not.exist') }) - it('applies additional className', () => { - cy.mount() - cy.get('span').should('have.class', 'extra-class') + describe('options.className', () => { + it('applies custom className from options', () => { + cy.mount( + + ) + cy.get('span').should('have.class', 'extra-class') + }) + + it('applies className from options with override', () => { + cy.mount( + + ) + cy.get('span') + .should('not.have.class', 'w-5') + .and('not.have.class', 'w-10') + .and('have.class', 'w-15') + }) }) }) diff --git a/components/data-table/cells/colored-badge-format.tsx b/components/data-table/cells/colored-badge-format.tsx index d253cab3..e59c8c3d 100644 --- a/components/data-table/cells/colored-badge-format.tsx +++ b/components/data-table/cells/colored-badge-format.tsx @@ -1,13 +1,17 @@ import { cn } from '@/lib/utils' +export interface ColoredBadgeOptions { + className?: string +} + interface ColoredBadgeFormatProps { value: any - className?: string + options?: ColoredBadgeOptions } export function ColoredBadgeFormat({ value, - className, + options, }: ColoredBadgeFormatProps) { if (!value || value === '') { return @@ -36,9 +40,9 @@ export function ColoredBadgeFormat({ return ( {value} diff --git a/components/data-table/cells/link-format.cy.tsx b/components/data-table/cells/link-format.cy.tsx index 5fdfc491..8e8efe0e 100644 --- a/components/data-table/cells/link-format.cy.tsx +++ b/components/data-table/cells/link-format.cy.tsx @@ -75,4 +75,62 @@ describe('', () => { cy.get('a').should('have.attr', 'href', 'https://duyet.net/item/789') cy.contains('Non-string Href').should('be.visible') }) + + describe('options.className', () => { + it('applies custom className from options', () => { + const row = { index: 0 } as Row + const data = [{ id: '123' }] + const value = 'Custom Class' + const options = { + href: '/item/[id]', + className: 'custom-class text-red-500', + } + + cy.mount( + + ) + + cy.get('a') + .should('have.class', 'custom-class') + .and('have.class', 'text-red-500') + }) + + it('merges custom className with default classes', () => { + const row = { index: 0 } as Row + const data = [{ id: '123' }] + const value = 'Merged Classes' + const options = { + href: '/item/[id]', + className: 'custom-class', + } + + cy.mount( + + ) + + cy.get('a') + .should('have.class', 'group') + .and('have.class', 'flex') + .and('have.class', 'custom-class') + }) + + it('applies custom className from options with override', () => { + const row = { index: 0 } as Row + const data = [{ id: '123' }] + const value = 'Custom Class' + const options = { + href: '/item/[id]', + className: 'text-red-300 text-red-400 text-red-500', + } + + cy.mount( + + ) + + cy.get('a') + .should('not.have.class', 'text-red-300') + .and('not.have.class', 'text-red-400') + .and('have.class', 'text-red-500') + }) + }) }) diff --git a/components/data-table/cells/link-format.tsx b/components/data-table/cells/link-format.tsx index de371cf9..adca58f5 100644 --- a/components/data-table/cells/link-format.tsx +++ b/components/data-table/cells/link-format.tsx @@ -1,3 +1,4 @@ +import { cn } from '@/lib/utils' import { ArrowRightIcon } from '@radix-ui/react-icons' import { Row, RowData } from '@tanstack/react-table' import Link, { LinkProps } from 'next/link' @@ -9,14 +10,14 @@ interface LinkFormatProps< row: Row data: TData[] value: TValue - options?: LinkProps + options?: LinkProps & { className?: string } } export function LinkFormat< TData extends RowData, TValue extends React.ReactNode, >({ row, data, value, options }: LinkFormatProps) { - let href = options?.href + let { href, className, ...rest } = options ?? {} // No href provided, return value as is if (!href) return value @@ -43,8 +44,12 @@ export function LinkFormat< } return ( - - {value} + + {value} ) diff --git a/components/data-table/format-cell.tsx b/components/data-table/format-cell.tsx index c2ae88d4..f50e397a 100644 --- a/components/data-table/format-cell.tsx +++ b/components/data-table/format-cell.tsx @@ -20,7 +20,10 @@ import { CodeToggleFormat, type CodeToggleOptions, } from './cells/code-toggle-format' -import { ColoredBadgeFormat } from './cells/colored-badge-format' +import { + ColoredBadgeFormat, + ColoredBadgeOptions, +} from './cells/colored-badge-format' import { DurationFormat } from './cells/duration-format' import { HoverCardFormat, @@ -55,7 +58,12 @@ export const formatCell = < ) case ColumnFormat.ColoredBadge: - return + return ( + + ) case ColumnFormat.Code: return {value as string} diff --git a/components/skeleton.tsx b/components/skeleton.tsx index 51e55516..3a36bd9f 100644 --- a/components/skeleton.tsx +++ b/components/skeleton.tsx @@ -74,3 +74,19 @@ export function MultiLineSkeleton({
) } + +export function ListSkeleton({ + nrows = 4, + className = 'w-[500px]', +}: { + nrows?: number + className?: string +}) { + return ( +
+ {Array.from({ length: nrows }).map((_, i) => ( + + ))} +
+ ) +} diff --git a/package.json b/package.json index 938f8c1e..6c84148a 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-tabs": "^1.1.1", "@radix-ui/react-toast": "^1.2.2", - "@radix-ui/react-tooltip": "^1.1.3", + "@radix-ui/react-tooltip": "^1.1.4", "@tanstack/react-table": "^8.20.5", "@tremor/react": "^3.18.3", "@uiw/react-heat-map": "^2.2.1", diff --git a/tailwind.config.js b/tailwind.config.js index 57f1c836..66f8b1b4 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -7,152 +7,162 @@ module.exports = { './node_modules/@tremor/**/*.{js,ts,jsx,tsx}', // Tremor module ], theme: { - container: { - center: true, - padding: '2rem', - screens: { - '2xl': '1400px', - }, - }, - extend: { - colors: { - border: 'hsl(var(--border))', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: 'hsl(var(--primary-foreground))', - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: 'hsl(var(--secondary-foreground))', - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))', - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: 'hsl(var(--muted-foreground))', - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: 'hsl(var(--accent-foreground))', - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: 'hsl(var(--popover-foreground))', - }, - card: { - DEFAULT: 'hsl(var(--card))', - foreground: 'hsl(var(--card-foreground))', - }, - // light mode - tremor: { - brand: { - faint: '#FFECB3', // lighter yellow - muted: '#FFD54F', // medium yellow - subtle: '#FFC107', // standard yellow - DEFAULT: '#FFCC00', // ClickHouse yellow - emphasis: '#FFB300', // darker yellow - inverted: '#ffffff', // white - }, - background: { - muted: '#f9fafb', // gray-50 - subtle: '#f3f4f6', // gray-100 - DEFAULT: '#ffffff', // white - emphasis: '#374151', // gray-700 - }, - border: { - DEFAULT: '#e5e7eb', // gray-200 - }, - ring: { - DEFAULT: '#e5e7eb', // gray-200 - }, - content: { - subtle: '#9ca3af', // gray-400 - DEFAULT: '#6b7280', // gray-500 - emphasis: '#374151', // gray-700 - strong: '#111827', // gray-900 - inverted: '#ffffff', // white - }, - }, - // dark mode - 'dark-tremor': { - brand: { - faint: '#0B1229', // custom - muted: '#172554', // blue-950 - subtle: '#1e40af', // blue-800 - DEFAULT: '#3b82f6', // blue-500 - emphasis: '#60a5fa', // blue-400 - inverted: '#030712', // gray-950 - }, - background: { - muted: '#131A2B', // custom - subtle: '#1f2937', // gray-800 - DEFAULT: '#111827', // gray-900 - emphasis: '#d1d5db', // gray-300 - }, - border: { - DEFAULT: '#1f2937', // gray-800 - }, - ring: { - DEFAULT: '#1f2937', // gray-800 - }, - content: { - subtle: '#4b5563', // gray-600 - DEFAULT: '#6b7280', // gray-500 - emphasis: '#e5e7eb', // gray-200 - strong: '#f9fafb', // gray-50 - inverted: '#000000', // black - }, - }, - }, - boxShadow: { - // light - 'tremor-input': '0 1px 2px 0 rgb(0 0 0 / 0.05)', - 'tremor-card': - '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', - 'tremor-dropdown': - '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', - // dark - 'dark-tremor-input': '0 1px 2px 0 rgb(0 0 0 / 0.05)', - 'dark-tremor-card': - '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', - 'dark-tremor-dropdown': - '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)', - 'tremor-small': '0.375rem', - 'tremor-default': '0.5rem', - 'tremor-full': '9999px', - }, - fontSize: { - 'tremor-label': ['0.75rem'], - 'tremor-default': ['0.875rem', { lineHeight: '1.25rem' }], - 'tremor-title': ['1.125rem', { lineHeight: '1.75rem' }], - 'tremor-metric': ['1.875rem', { lineHeight: '2.25rem' }], - }, - keyframes: { - 'accordion-down': { - from: { height: 0 }, - to: { height: 'var(--radix-accordion-content-height)' }, - }, - 'accordion-up': { - from: { height: 'var(--radix-accordion-content-height)' }, - to: { height: 0 }, - }, - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out', - }, - }, + container: { + center: 'true', + padding: '2rem', + screens: { + '2xl': '1400px' + } + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))' + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))' + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))' + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))' + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))' + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))' + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))' + }, + tremor: { + brand: { + faint: '#FFECB3', + muted: '#FFD54F', + subtle: '#FFC107', + DEFAULT: '#FFCC00', + emphasis: '#FFB300', + inverted: '#ffffff' + }, + background: { + muted: '#f9fafb', + subtle: '#f3f4f6', + DEFAULT: '#ffffff', + emphasis: '#374151' + }, + border: { + DEFAULT: '#e5e7eb' + }, + ring: { + DEFAULT: '#e5e7eb' + }, + content: { + subtle: '#9ca3af', + DEFAULT: '#6b7280', + emphasis: '#374151', + strong: '#111827', + inverted: '#ffffff' + } + }, + 'dark-tremor': { + brand: { + faint: '#0B1229', + muted: '#172554', + subtle: '#1e40af', + DEFAULT: '#3b82f6', + emphasis: '#60a5fa', + inverted: '#030712' + }, + background: { + muted: '#131A2B', + subtle: '#1f2937', + DEFAULT: '#111827', + emphasis: '#d1d5db' + }, + border: { + DEFAULT: '#1f2937' + }, + ring: { + DEFAULT: '#1f2937' + }, + content: { + subtle: '#4b5563', + DEFAULT: '#6b7280', + emphasis: '#e5e7eb', + strong: '#f9fafb', + inverted: '#000000' + } + }, + sidebar: { + DEFAULT: 'hsl(var(--sidebar-background))', + foreground: 'hsl(var(--sidebar-foreground))', + primary: 'hsl(var(--sidebar-primary))', + 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))', + accent: 'hsl(var(--sidebar-accent))', + 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))', + border: 'hsl(var(--sidebar-border))', + ring: 'hsl(var(--sidebar-ring))' + } + }, + boxShadow: { + 'tremor-input': '0 1px 2px 0 rgb(0 0 0 / 0.05)', + 'tremor-card': '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', + 'tremor-dropdown': '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', + 'dark-tremor-input': '0 1px 2px 0 rgb(0 0 0 / 0.05)', + 'dark-tremor-card': '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', + 'dark-tremor-dropdown': '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)' + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + 'tremor-small': '0.375rem', + 'tremor-default': '0.5rem', + 'tremor-full': '9999px' + }, + fontSize: { + 'tremor-label': ['0.75rem'], + 'tremor-default': ['0.875rem', { lineHeight: '1.25rem' }], + 'tremor-title': ['1.125rem', { lineHeight: '1.75rem' }], + 'tremor-metric': ['1.875rem', { lineHeight: '2.25rem' }] + }, + keyframes: { + 'accordion-down': { + from: { + height: '0' + }, + to: { + height: 'var(--radix-accordion-content-height)' + } + }, + 'accordion-up': { + from: { + height: 'var(--radix-accordion-content-height)' + }, + to: { + height: '0' + } + } + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out' + } + } }, safelist: [ { diff --git a/types/column-format.ts b/types/column-format.ts index 5f83fc39..54f1a673 100644 --- a/types/column-format.ts +++ b/types/column-format.ts @@ -4,6 +4,7 @@ import { type Action } from '@/components/data-table/cells/actions/types' import { type BackgroundBarOptions } from '@/components/data-table/cells/background-bar-format' import { type CodeDialogOptions } from '@/components/data-table/cells/code-dialog-format' import { type CodeToggleOptions } from '@/components/data-table/cells/code-toggle-format' +import { type ColoredBadgeOptions } from '@/components/data-table/cells/colored-badge-format' import { type HoverCardOptions } from '@/components/data-table/cells/hover-card-format' import { type TextFormatOptions } from '@/components/data-table/cells/text-format' @@ -28,8 +29,9 @@ export enum ColumnFormat { export type ColumnFormatWithArgs = | [ColumnFormat.Action, Action[]] - | [ColumnFormat.Link, LinkProps] + | [ColumnFormat.Link, LinkProps & { className?: string }] | [ColumnFormat.Text, TextFormatOptions] + | [ColumnFormat.ColoredBadge, ColoredBadgeOptions] | [ColumnFormat.HoverCard, HoverCardOptions] | [ColumnFormat.CodeDialog, CodeDialogOptions] | [ColumnFormat.CodeToggle, CodeToggleOptions] diff --git a/yarn.lock b/yarn.lock index ffaa70c8..259a2d05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1195,6 +1195,16 @@ dependencies: "@radix-ui/react-primitive" "2.0.0" +"@radix-ui/react-avatar@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz#5848d2ed5f34d18b36fc7e2d227c41fca8600ea1" + integrity sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw== + dependencies: + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-avatar@latest": version "1.1.1" resolved "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz" @@ -1219,7 +1229,7 @@ "@radix-ui/react-use-previous" "1.1.0" "@radix-ui/react-use-size" "1.1.0" -"@radix-ui/react-collapsible@1.1.1", "@radix-ui/react-collapsible@^1.1.1", "@radix-ui/react-collapsible@latest": +"@radix-ui/react-collapsible@1.1.1", "@radix-ui/react-collapsible@latest": version "1.1.1" resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz" integrity sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg== @@ -1233,6 +1243,20 @@ "@radix-ui/react-use-controllable-state" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" +"@radix-ui/react-collapsible@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz#1382cc9ec48f8b473c14f3779d317f0cdf6da5e9" + integrity sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-collection@1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz" @@ -1270,7 +1294,7 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== -"@radix-ui/react-dialog@1.1.2", "@radix-ui/react-dialog@^1.1.2", "@radix-ui/react-dialog@latest": +"@radix-ui/react-dialog@1.1.2", "@radix-ui/react-dialog@latest": version "1.1.2" resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz" integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA== @@ -1290,6 +1314,26 @@ aria-hidden "^1.1.1" react-remove-scroll "2.6.0" +"@radix-ui/react-dialog@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz#d9345575211d6f2d13e209e84aec9a8584b54d6c" + integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + "@radix-ui/react-direction@1.1.0", "@radix-ui/react-direction@latest": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz" @@ -1306,7 +1350,20 @@ "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown" "1.1.0" -"@radix-ui/react-dropdown-menu@^2.1.2", "@radix-ui/react-dropdown-menu@latest": +"@radix-ui/react-dropdown-menu@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz#acc49577130e3c875ef0133bd1e271ea3392d924" + integrity sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-menu" "2.1.2" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-dropdown-menu@latest": version "2.1.2" resolved "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz" integrity sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA== @@ -1560,13 +1617,20 @@ aria-hidden "^1.1.1" react-remove-scroll "2.6.0" -"@radix-ui/react-separator@1.1.0", "@radix-ui/react-separator@^1.1.0", "@radix-ui/react-separator@latest": +"@radix-ui/react-separator@1.1.0", "@radix-ui/react-separator@latest": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz" integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== dependencies: "@radix-ui/react-primitive" "2.0.0" +"@radix-ui/react-separator@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" + integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slider@latest": version "1.2.1" resolved "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.1.tgz" @@ -1678,7 +1742,7 @@ "@radix-ui/react-separator" "1.1.0" "@radix-ui/react-toggle-group" "1.1.0" -"@radix-ui/react-tooltip@^1.1.3": +"@radix-ui/react-tooltip@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.4.tgz#152d8485859b80d395d6b3229f676fef3cec56b3" integrity sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw== @@ -2807,7 +2871,7 @@ cjs-module-lexer@^1.0.0: class-variance-authority@^0.7.0: version "0.7.0" - resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz" + resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== dependencies: clsx "2.0.0"