mirror of
https://github.com/supabase/supabase.git
synced 2026-10-10 20:05:06 +03:00
This PR preps the monorepo for a migration to Tailwind v4: - Bump all Tailwind dependencies and libraries to the latest possible version, while still compatible with Tailwind 3. - Cleans up obsolete Tailwind 3 specific options and configs. - Cleans up unused CSS files and fixes the CSS imports. - Migrates all `important` uses in `@apply` lines to using the `!` prefix. - Move `typography.css` to the `config` package and import it from the apps. - Migrated all occurrences of `flex-grow`, `flex-shrink`, `overflow-clip` and `overflow-ellipsis` since they're deprecated and will be removed in Tailwind 4. - Make the default theme object typesafe in the `ui` package. - Migrate all `bg-opacity`, `border-opacity`, `ring-opacity` and `divider-opacity` to the new format where they're declared as part of the property color. - Bump and unify all imports of `postcss` dependency.
180 lines
4.9 KiB
TypeScript
180 lines
4.9 KiB
TypeScript
'use client'
|
|
|
|
import { ExternalLink } from 'lucide-react'
|
|
import { useState } from 'react'
|
|
import {
|
|
AccordionContent_Shadcn_ as AccordionContent,
|
|
AccordionItem_Shadcn_ as AccordionItem,
|
|
AccordionTrigger_Shadcn_ as AccordionTrigger,
|
|
Button,
|
|
} from 'ui'
|
|
|
|
import { RestartProjectDialog } from './RestartProjectDialog'
|
|
import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown'
|
|
import { useTrack } from '@/lib/telemetry/track'
|
|
|
|
interface StepTriggerProps {
|
|
number: number
|
|
title: string
|
|
}
|
|
|
|
function StepTrigger({ number, title }: StepTriggerProps) {
|
|
return (
|
|
<AccordionTrigger className="py-3 hover:no-underline">
|
|
<div className="flex items-center gap-2.5">
|
|
<span className="shrink-0 w-6 h-6 border border-button-hover text-foreground font-mono tabular-nums bg-button rounded-md text-xs font-medium flex items-center justify-center">
|
|
{number}
|
|
</span>
|
|
<span className="text-sm font-medium text-foreground text-left">{title}</span>
|
|
</div>
|
|
</AccordionTrigger>
|
|
)
|
|
}
|
|
|
|
interface RestartDatabaseTroubleshootingSectionProps {
|
|
number: number
|
|
errorType: string
|
|
/** Override the restart handler. If not provided, opens the restart dialog internally. */
|
|
onRestartProject?: () => void
|
|
}
|
|
|
|
export function RestartDatabaseTroubleshootingSection({
|
|
number,
|
|
errorType,
|
|
onRestartProject,
|
|
}: RestartDatabaseTroubleshootingSectionProps) {
|
|
const track = useTrack()
|
|
const [showDialog, setShowDialog] = useState(false)
|
|
|
|
const handleClick = () => {
|
|
track('inline_error_troubleshooter_action_clicked', {
|
|
errorType,
|
|
ctaType: 'restart_db',
|
|
})
|
|
if (onRestartProject) {
|
|
onRestartProject()
|
|
} else {
|
|
setShowDialog(true)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<AccordionItem
|
|
value={`step-${number}`}
|
|
className="border-b border-default last:border-b-0 px-3 py-2"
|
|
>
|
|
<StepTrigger number={number} title="Try restarting your project" />
|
|
<AccordionContent className="pt-1">
|
|
<div className="px-2">
|
|
<p className="text-sm text-foreground-light mb-3">
|
|
Restarting your project can help resolve timeout errors or stale connections.
|
|
</p>
|
|
<Button type="default" size="tiny" onClick={handleClick}>
|
|
Restart project
|
|
</Button>
|
|
</div>
|
|
</AccordionContent>
|
|
</AccordionItem>
|
|
|
|
<RestartProjectDialog
|
|
visible={showDialog}
|
|
onClose={() => setShowDialog(false)}
|
|
restartType="database"
|
|
/>
|
|
</>
|
|
)
|
|
}
|
|
|
|
interface TroubleshootingGuideSectionProps {
|
|
number: number
|
|
errorType: string
|
|
href: string
|
|
title?: string
|
|
description?: string
|
|
}
|
|
|
|
export function TroubleshootingGuideSection({
|
|
number,
|
|
errorType,
|
|
href,
|
|
title = 'Try our troubleshooting guide',
|
|
description,
|
|
}: TroubleshootingGuideSectionProps) {
|
|
const track = useTrack()
|
|
|
|
return (
|
|
<AccordionItem
|
|
value={`step-${number}`}
|
|
className="border-b border-default last:border-b-0 px-3 py-2"
|
|
>
|
|
<StepTrigger number={number} title={title} />
|
|
<AccordionContent className="pt-1">
|
|
<div className="px-2">
|
|
{description && <p className="text-sm text-foreground-light mb-3">{description}</p>}
|
|
<Button
|
|
asChild
|
|
type="default"
|
|
size="tiny"
|
|
onClick={() =>
|
|
track('inline_error_troubleshooter_action_clicked', {
|
|
errorType,
|
|
ctaType: 'troubleshooting_guide',
|
|
})
|
|
}
|
|
iconRight={<ExternalLink />}
|
|
>
|
|
<a href={href} target="_blank" rel="noopener noreferrer">
|
|
View troubleshooting guide
|
|
</a>
|
|
</Button>
|
|
</div>
|
|
</AccordionContent>
|
|
</AccordionItem>
|
|
)
|
|
}
|
|
|
|
interface FixWithAITroubleshootingSectionProps {
|
|
number: number
|
|
errorType: string
|
|
description?: string
|
|
onDebugWithAI?: (prompt: string) => void
|
|
buildPrompt: () => string
|
|
}
|
|
|
|
export function FixWithAITroubleshootingSection({
|
|
number,
|
|
errorType,
|
|
description = 'Let our AI assistant help diagnose and suggest solutions.',
|
|
onDebugWithAI,
|
|
buildPrompt,
|
|
}: FixWithAITroubleshootingSectionProps) {
|
|
const track = useTrack()
|
|
|
|
return (
|
|
<AccordionItem
|
|
value={`step-${number}`}
|
|
className="border-b border-default last:border-b-0 px-3 py-2"
|
|
>
|
|
<StepTrigger number={number} title="Debug with AI" />
|
|
<AccordionContent className="pt-1">
|
|
<div className="px-2">
|
|
<p className="text-sm text-foreground-light mb-3">{description}</p>
|
|
<AiAssistantDropdown
|
|
label="Debug with AI"
|
|
buildPrompt={buildPrompt}
|
|
onOpenAssistant={() => {
|
|
track('inline_error_troubleshooter_action_clicked', {
|
|
errorType,
|
|
ctaType: 'ask_ai',
|
|
})
|
|
onDebugWithAI?.(buildPrompt())
|
|
}}
|
|
size="tiny"
|
|
/>
|
|
</div>
|
|
</AccordionContent>
|
|
</AccordionItem>
|
|
)
|
|
}
|