From 6e827f1da3bf471db506b61df93a952d09836852 Mon Sep 17 00:00:00 2001 From: Katia Bulatova Date: Wed, 8 Jul 2026 15:11:40 +0200 Subject: [PATCH] chore: Tailwind CSS v4 migration (#4139) Migrates the webapp from Tailwind CSS 3.4 to 4.x. --- .server-changes/tailwind-v4-migration.md | 6 + .server-changes/theme-color-tokens.md | 6 + apps/webapp/app/components/AskAI.tsx | 16 +- .../app/components/BackgroundWrapper.tsx | 6 +- .../app/components/BlankStatePanels.tsx | 2 +- .../app/components/DefinitionTooltip.tsx | 4 +- apps/webapp/app/components/Feedback.tsx | 2 +- apps/webapp/app/components/GitMetadata.tsx | 6 +- apps/webapp/app/components/ListPagination.tsx | 6 +- .../webapp/app/components/LoginPageLayout.tsx | 2 +- .../app/components/ProductHuntBanner.tsx | 2 +- .../app/components/UserProfilePhoto.tsx | 2 +- apps/webapp/app/components/WarmStarts.tsx | 6 +- .../components/admin/FeatureFlagsDialog.tsx | 12 +- .../admin/backOffice/MaxProjectsSection.tsx | 2 +- .../admin/backOffice/RateLimitSection.tsx | 2 +- .../app/components/billing/FreePlanUsage.tsx | 9 +- .../app/components/billing/UsageBar.tsx | 2 +- .../app/components/code/AIQueryInput.tsx | 6 +- .../app/components/code/ChartConfigPanel.tsx | 8 +- apps/webapp/app/components/code/CodeBlock.tsx | 58 +- .../webapp/app/components/code/InlineCode.tsx | 2 +- .../app/components/code/QueryResultsChart.tsx | 10 +- .../webapp/app/components/code/TSQLEditor.tsx | 4 +- .../app/components/code/TSQLResultsTable.tsx | 28 +- .../app/components/code/codeMirrorTheme.ts | 61 +- apps/webapp/app/components/code/shikiTheme.ts | 72 +- .../components/dashboard-agent/AgentChart.tsx | 4 +- .../DashboardAgentComposer.tsx | 4 +- .../DashboardAgentContextBanner.tsx | 2 +- .../dashboard-agent/DashboardAgentHeader.tsx | 4 +- .../dashboard-agent/DashboardAgentHistory.tsx | 10 +- .../DashboardAgentMessages.tsx | 2 +- .../DashboardAgentSuggestedPrompts.tsx | 2 +- .../dashboard-agent/RunDiagnosisCard.tsx | 10 +- .../dashboardAgentLauncher.tsx | 4 +- .../environments/RegenerateApiKeyModal.tsx | 2 +- .../errors/ConfigureErrorAlerts.tsx | 2 +- .../integrations/VercelBuildSettings.tsx | 4 +- .../integrations/VercelOnboardingModal.tsx | 6 +- .../app/components/layout/AppLayout.tsx | 8 +- .../app/components/logs/LogDetailView.tsx | 2 +- .../app/components/logs/LogsLevelFilter.tsx | 6 +- apps/webapp/app/components/logs/LogsTable.tsx | 6 +- .../app/components/metrics/BigNumber.tsx | 2 +- .../app/components/metrics/QueryWidget.tsx | 4 +- .../metrics/SaveToDashboardDialog.tsx | 8 +- .../app/components/metrics/ScopeFilter.tsx | 2 +- .../app/components/metrics/TitleWidget.tsx | 4 +- .../components/navigation/AccountSideMenu.tsx | 2 +- .../navigation/DashboardDialogs.tsx | 14 +- .../components/navigation/DashboardList.tsx | 2 +- .../navigation/EnvironmentSelector.tsx | 12 +- .../navigation/HelpAndFeedbackPopover.tsx | 6 +- .../navigation/NotificationCard.tsx | 6 +- .../navigation/NotificationPanel.tsx | 4 +- .../OrganizationSettingsSideMenu.tsx | 2 +- .../app/components/navigation/SideMenu.tsx | 42 +- .../components/navigation/SideMenuHeader.tsx | 4 +- .../components/navigation/SideMenuItem.tsx | 12 +- .../components/navigation/SideMenuSection.tsx | 4 +- .../onboarding/TechnologyPicker.tsx | 16 +- .../components/primitives/AnimatingArrow.tsx | 10 +- .../components/primitives/AppliedFilter.tsx | 6 +- .../app/components/primitives/Avatar.tsx | 4 +- .../app/components/primitives/Badge.tsx | 6 +- .../app/components/primitives/Buttons.tsx | 22 +- .../app/components/primitives/Calendar.tsx | 20 +- .../app/components/primitives/Callout.tsx | 40 +- .../app/components/primitives/Checkbox.tsx | 16 +- .../primitives/CheckboxIndicator.tsx | 2 +- .../app/components/primitives/ClientTabs.tsx | 14 +- .../components/primitives/ClipboardField.tsx | 20 +- .../app/components/primitives/CopyButton.tsx | 4 +- .../components/primitives/CopyableText.tsx | 4 +- .../app/components/primitives/DateField.tsx | 14 +- .../components/primitives/DateTimePicker.tsx | 8 +- .../app/components/primitives/DetailCell.tsx | 4 +- .../app/components/primitives/Dialog.tsx | 6 +- .../webapp/app/components/primitives/Icon.tsx | 2 +- .../app/components/primitives/Input.tsx | 20 +- .../primitives/InputNumberStepper.tsx | 14 +- .../app/components/primitives/InputOTP.tsx | 6 +- .../primitives/LoadingBarDivider.tsx | 2 +- .../app/components/primitives/PageHeader.tsx | 2 +- .../app/components/primitives/Pagination.tsx | 9 +- .../app/components/primitives/Popover.tsx | 24 +- .../app/components/primitives/RadioButton.tsx | 20 +- .../app/components/primitives/Resizable.tsx | 8 +- .../app/components/primitives/SearchInput.tsx | 2 +- .../primitives/SegmentedControl.tsx | 10 +- .../app/components/primitives/Select.tsx | 26 +- .../app/components/primitives/Sheet.tsx | 4 +- .../app/components/primitives/SheetV3.tsx | 2 +- .../app/components/primitives/ShortcutKey.tsx | 10 +- .../components/primitives/SimpleSelect.tsx | 12 +- .../app/components/primitives/Slider.tsx | 6 +- .../app/components/primitives/StepNumber.tsx | 2 +- .../app/components/primitives/Switch.tsx | 14 +- .../app/components/primitives/Table.tsx | 50 +- .../webapp/app/components/primitives/Tabs.tsx | 13 +- .../app/components/primitives/TextArea.tsx | 2 +- .../app/components/primitives/Tooltip.tsx | 2 +- .../primitives/TreeView/TreeView.tsx | 2 +- .../components/primitives/UsageSparkline.tsx | 15 +- .../primitives/charts/BigNumberCard.tsx | 6 +- .../components/primitives/charts/Chart.tsx | 8 +- .../components/primitives/charts/ChartBar.tsx | 22 +- .../primitives/charts/ChartBlankState.tsx | 2 +- .../primitives/charts/ChartCard.tsx | 2 +- .../primitives/charts/ChartLegendCompound.tsx | 10 +- .../primitives/charts/ChartLine.tsx | 8 +- .../primitives/charts/ChartLoading.tsx | 20 +- .../primitives/charts/ChartRoot.tsx | 2 +- .../primitives/charts/ChartZoom.tsx | 10 +- .../primitives/charts/statusColors.ts | 19 +- .../app/components/query/QueryEditor.tsx | 23 +- .../webapp/app/components/run/RunTimeline.tsx | 22 +- .../app/components/runs/v3/AIFilterInput.tsx | 6 +- .../app/components/runs/v3/BatchFilters.tsx | 8 +- .../components/runs/v3/DeploymentStatus.tsx | 4 +- .../components/runs/v3/PromptSpanDetails.tsx | 8 +- .../components/runs/v3/ReplayRunDialog.tsx | 6 +- .../app/components/runs/v3/RunFilters.tsx | 10 +- .../runs/v3/RunStatusCellTooltip.tsx | 2 +- apps/webapp/app/components/runs/v3/RunTag.tsx | 18 +- .../components/runs/v3/ScheduleFilters.tsx | 4 +- .../app/components/runs/v3/SharedFilters.tsx | 8 +- .../runs/v3/SpanHorizontalTimeline.tsx | 10 +- .../app/components/runs/v3/SpanTitle.tsx | 12 +- .../runs/v3/TaskRunAttemptStatus.tsx | 10 +- .../app/components/runs/v3/TaskRunStatus.tsx | 55 +- .../app/components/runs/v3/TaskRunsTable.tsx | 30 +- .../components/runs/v3/TaskTriggerSource.tsx | 14 +- .../runs/v3/WaitpointTokenFilters.tsx | 16 +- .../runs/v3/agent/AgentMessageView.tsx | 18 +- .../components/runs/v3/ai/AIChatMessages.tsx | 14 +- .../runs/v3/ai/AIEmbedSpanDetails.tsx | 4 +- .../components/runs/v3/ai/AIModelSummary.tsx | 2 +- .../components/runs/v3/ai/AISpanDetails.tsx | 10 +- .../runs/v3/ai/AIToolCallSpanDetails.tsx | 2 +- .../runs/v3/ai/AIToolsInventory.tsx | 2 +- .../components/runs/v3/ai/SpanMetricRow.tsx | 2 +- .../app/components/scheduled/timezones.tsx | 2 +- .../schedules/ScheduleInspector.tsx | 2 +- .../components/sessions/v1/SessionFilters.tsx | 8 +- .../components/sessions/v1/SessionsTable.tsx | 6 +- apps/webapp/app/hooks/useThemeColor.ts | 32 + apps/webapp/app/root.tsx | 4 +- .../route.tsx | 2 +- .../route.tsx | 49 +- .../route.tsx | 10 +- .../route.tsx | 22 +- .../route.tsx | 8 +- .../route.tsx | 2 +- .../route.tsx | 2 +- .../route.tsx | 8 +- .../route.tsx | 6 +- .../route.tsx | 2 +- .../route.tsx | 4 +- .../route.tsx | 2 +- .../route.tsx | 14 +- .../route.tsx | 2 +- .../route.tsx | 2 +- .../route.tsx | 10 +- .../route.tsx | 6 +- .../route.tsx | 16 +- .../route.tsx | 21 +- .../route.tsx | 16 +- .../route.tsx | 30 +- .../route.tsx | 34 +- .../route.tsx | 25 +- .../AITabContent.tsx | 2 +- .../QueryHelpSidebar.tsx | 10 +- .../QueryHistoryPopover.tsx | 8 +- .../TRQLGuideContent.tsx | 4 +- .../TableSchemaContent.tsx | 4 +- .../route.tsx | 6 +- .../route.tsx | 10 +- .../route.tsx | 26 +- .../route.tsx | 26 +- .../route.tsx | 2 +- .../route.tsx | 10 +- .../route.tsx | 6 +- .../AIPayloadTabContent.tsx | 30 +- .../TestSidebarTabs.tsx | 8 +- .../route.tsx | 20 +- .../route.tsx | 2 +- .../route.tsx | 18 +- ...zationSlug.settings.integrations.slack.tsx | 2 +- .../route.tsx | 2 +- .../route.tsx | 24 +- .../route.tsx | 4 +- .../route.tsx | 6 +- .../route.tsx | 4 +- .../route.tsx | 8 +- .../route.tsx | 4 +- .../webapp/app/routes/_app.orgs.new/route.tsx | 4 +- .../app/routes/_app.timezones/route.tsx | 6 +- .../route.tsx | 2 +- .../app/routes/account.security/route.tsx | 2 +- .../app/routes/account.tokens/route.tsx | 2 +- .../webapp/app/routes/admin.feature-flags.tsx | 12 +- .../app/routes/admin.llm-models.$modelId.tsx | 14 +- .../app/routes/admin.llm-models._index.tsx | 4 +- .../admin.llm-models.missing.$model.tsx | 15 +- .../app/routes/admin.llm-models.new.tsx | 12 +- .../webapp/app/routes/admin.notifications.tsx | 18 +- .../app/routes/confirm-basic-details.tsx | 8 +- apps/webapp/app/routes/invites.tsx | 6 +- apps/webapp/app/routes/login._index/route.tsx | 10 +- .../webapp/app/routes/resources.incidents.tsx | 6 +- .../route.tsx | 18 +- .../route.tsx | 8 +- ...ectParam.env.$envParam.runs.bulkaction.tsx | 2 +- .../route.tsx | 2 +- ...cts.$projectParam.env.$envParam.vercel.tsx | 2 +- .../route.tsx | 4 +- ...ctParam.schedules.new.natural-language.tsx | 2 +- ...ces.orgs.$organizationSlug.select-plan.tsx | 14 +- .../app/routes/storybook.agent-ui/route.tsx | 2 +- .../routes/storybook.animated-panel/route.tsx | 2 +- .../app/routes/storybook.buttons/route.tsx | 10 +- .../app/routes/storybook.charts/route.tsx | 2 +- .../routes/storybook.detail-cell/route.tsx | 6 +- .../routes/storybook.page-header/route.tsx | 2 +- .../app/routes/storybook.popover/route.tsx | 4 +- .../app/routes/storybook.spinner/route.tsx | 10 +- .../app/routes/storybook.streamdown/route.tsx | 4 +- .../app/routes/storybook.table/route.tsx | 2 +- .../storybook.tabs.$tabNumber/route.tsx | 2 +- .../app/routes/storybook.tabs/route.tsx | 18 +- .../app/routes/storybook.timeline/route.tsx | 10 +- .../app/routes/storybook.tree-view/route.tsx | 2 +- .../routes/storybook.tsql-editor/route.tsx | 6 +- .../routes/storybook.unordered-list/route.tsx | 2 +- apps/webapp/app/routes/storybook/route.tsx | 2 +- .../app/routes/unsubscribe.$userId.$token.tsx | 2 +- apps/webapp/app/routes/vercel.onboarding.tsx | 12 +- apps/webapp/app/tailwind.css | 604 +++++++-- apps/webapp/app/utils/cn.ts | 74 +- apps/webapp/package.json | 24 +- apps/webapp/postcss.config.js | 6 +- apps/webapp/remix.config.js | 4 +- apps/webapp/tailwind.config.js | 385 ------ pnpm-lock.yaml | 1150 ++++++----------- 246 files changed, 2109 insertions(+), 2478 deletions(-) create mode 100644 .server-changes/tailwind-v4-migration.md create mode 100644 .server-changes/theme-color-tokens.md create mode 100644 apps/webapp/app/hooks/useThemeColor.ts delete mode 100644 apps/webapp/tailwind.config.js diff --git a/.server-changes/tailwind-v4-migration.md b/.server-changes/tailwind-v4-migration.md new file mode 100644 index 000000000..c1675ff21 --- /dev/null +++ b/.server-changes/tailwind-v4-migration.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: improvement +--- + +Migrated the webapp to Tailwind CSS v4 with a CSS-first `@theme`. Semantic color tokens are now CSS variables overridable per theme (multi-theme support). Tailwind runs through `@tailwindcss/postcss`; plugins replaced or upgraded to v4-compatible versions. diff --git a/.server-changes/theme-color-tokens.md b/.server-changes/theme-color-tokens.md new file mode 100644 index 000000000..1766a74d2 --- /dev/null +++ b/.server-changes/theme-color-tokens.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: improvement +--- + +Replaced raw charcoal-* Tailwind classes with semantic theme tokens (surfaces, borders, text) across the dashboard. Adds surface/border/text tokens to the themable layer so future themes only override CSS variables. diff --git a/apps/webapp/app/components/AskAI.tsx b/apps/webapp/app/components/AskAI.tsx index bf76654cc..d62ffa5b3 100644 --- a/apps/webapp/app/components/AskAI.tsx +++ b/apps/webapp/app/components/AskAI.tsx @@ -173,7 +173,7 @@ function AskAIDialog({ initialQuery, isOpen, onOpenChange, closeAskAI }: AskAIDi return ( - +
Ask AI @@ -226,7 +226,7 @@ function ChatMessages({ ]; return ( -
+
{conversation.length === 0 ? ( ( onExampleClick(question)} variants={{ hidden: { @@ -468,7 +468,7 @@ function ChatInterface({ initialQuery }: { initialQuery?: string }) { error={error} addFeedback={addFeedback} /> -
+
} variant="primary/large" - className="size-10 min-w-10 rounded-full group-disabled/button:border-charcoal-550 group-disabled/button:bg-charcoal-600" + className="size-10 min-w-10 rounded-full group-disabled/button:border-border-brighter group-disabled/button:bg-surface-control" /> )}
@@ -531,11 +531,11 @@ function GradientSpinnerBackground({ }) { return (
{children} diff --git a/apps/webapp/app/components/BackgroundWrapper.tsx b/apps/webapp/app/components/BackgroundWrapper.tsx index aaf06d56a..c13983a12 100644 --- a/apps/webapp/app/components/BackgroundWrapper.tsx +++ b/apps/webapp/app/components/BackgroundWrapper.tsx @@ -7,7 +7,7 @@ export function BackgroundWrapper({ children }: { children: ReactNode }) { return (
diff --git a/apps/webapp/app/components/DefinitionTooltip.tsx b/apps/webapp/app/components/DefinitionTooltip.tsx index d91cce92c..13505e2d5 100644 --- a/apps/webapp/app/components/DefinitionTooltip.tsx +++ b/apps/webapp/app/components/DefinitionTooltip.tsx @@ -17,11 +17,11 @@ export function DefinitionTip({ - + {children} - + {title} {typeof content === "string" ? ( {content} diff --git a/apps/webapp/app/components/Feedback.tsx b/apps/webapp/app/components/Feedback.tsx index 683f39d34..ebd61180d 100644 --- a/apps/webapp/app/components/Feedback.tsx +++ b/apps/webapp/app/components/Feedback.tsx @@ -84,7 +84,7 @@ export function Feedback({ button, defaultValue = "bug", onOpenChange }: Feedbac Contact us
- + How can we help? We read every message and will respond as quickly as we can. diff --git a/apps/webapp/app/components/GitMetadata.tsx b/apps/webapp/app/components/GitMetadata.tsx index fb53ee6bf..3057de104 100644 --- a/apps/webapp/app/components/GitMetadata.tsx +++ b/apps/webapp/app/components/GitMetadata.tsx @@ -28,7 +28,7 @@ export function GitMetadataBranch({ leadingIconClassName="group-hover/table-row:text-text-bright" iconSpacing="gap-x-1" to={git.branchUrl} - className="pl-1 duration-0 [&_span]:duration-0 [&_span]:group-hover/table-row:text-text-bright" + className="pl-1 duration-0 [&_span]:duration-0 group-hover/table-row:[&_span]:text-text-bright" > {git.branchName} @@ -52,7 +52,7 @@ export function GitMetadataCommit({ LeadingIcon={} leadingIconClassName="group-hover/table-row:text-text-bright" iconSpacing="gap-x-1" - className="pl-1 duration-0 [&_span]:duration-0 [&_span]:group-hover/table-row:text-text-bright" + className="pl-1 duration-0 [&_span]:duration-0 group-hover/table-row:[&_span]:text-text-bright" > {`${git.shortSha} / ${git.commitMessage}`} @@ -78,7 +78,7 @@ export function GitMetadataPullRequest({ LeadingIcon={} leadingIconClassName="group-hover/table-row:text-text-bright" iconSpacing="gap-x-1" - className="pl-1 duration-0 [&_span]:duration-0 [&_span]:group-hover/table-row:text-text-bright" + className="pl-1 duration-0 [&_span]:duration-0 group-hover/table-row:[&_span]:text-text-bright" > #{git.pullRequestNumber} {git.pullRequestTitle} diff --git a/apps/webapp/app/components/ListPagination.tsx b/apps/webapp/app/components/ListPagination.tsx index 6e2633067..32d73d683 100644 --- a/apps/webapp/app/components/ListPagination.tsx +++ b/apps/webapp/app/components/ListPagination.tsx @@ -23,7 +23,7 @@ export function ListPagination({ list, className }: { list: List; className?: st
@@ -41,7 +41,7 @@ function PreviousButton({ cursor }: { cursor?: string }) { variant={"secondary/small"} LeadingIcon={ChevronLeftIcon} className={cn( - "flex items-center rounded-r-none border-r-0 pl-2 pr-[0.5625rem]", + "flex items-center rounded-r-none border-r-0 pl-2 pr-2.25", !path && "cursor-not-allowed opacity-50" )} onClick={(e) => !path && e.preventDefault()} @@ -63,7 +63,7 @@ function NextButton({ cursor }: { cursor?: string }) { variant={"secondary/small"} TrailingIcon={ChevronRightIcon} className={cn( - "flex items-center rounded-l-none border-l-0 pl-[0.5625rem] pr-2", + "flex items-center rounded-l-none border-l-0 pl-2.25 pr-2", !path && "cursor-not-allowed opacity-50" )} onClick={(e) => !path && e.preventDefault()} diff --git a/apps/webapp/app/components/LoginPageLayout.tsx b/apps/webapp/app/components/LoginPageLayout.tsx index 7c4a39b15..e48489fd9 100644 --- a/apps/webapp/app/components/LoginPageLayout.tsx +++ b/apps/webapp/app/components/LoginPageLayout.tsx @@ -68,7 +68,7 @@ export function LoginPageLayout({ children }: { children: React.ReactNode }) {
Trusted by developers at -
+
diff --git a/apps/webapp/app/components/ProductHuntBanner.tsx b/apps/webapp/app/components/ProductHuntBanner.tsx index b85893836..abb5a1463 100644 --- a/apps/webapp/app/components/ProductHuntBanner.tsx +++ b/apps/webapp/app/components/ProductHuntBanner.tsx @@ -14,7 +14,7 @@ export function ProductHuntBanner() { Vote for us today only! diff --git a/apps/webapp/app/components/UserProfilePhoto.tsx b/apps/webapp/app/components/UserProfilePhoto.tsx index 99febd1c2..4676594db 100644 --- a/apps/webapp/app/components/UserProfilePhoto.tsx +++ b/apps/webapp/app/components/UserProfilePhoto.tsx @@ -26,6 +26,6 @@ export function UserAvatar({ />
) : ( - + ); } diff --git a/apps/webapp/app/components/WarmStarts.tsx b/apps/webapp/app/components/WarmStarts.tsx index 07a894b9e..50ffeee79 100644 --- a/apps/webapp/app/components/WarmStarts.tsx +++ b/apps/webapp/app/components/WarmStarts.tsx @@ -30,7 +30,7 @@ export function WarmStartIconWithTooltip({ }) { return ( } content={} /> @@ -42,14 +42,14 @@ function WarmStartTooltipContent() {
- + A cold start happens when we need to boot up a new machine for your run to execute. This takes longer than a warm start.
- + A warm start happens when we can reuse a machine from a run that recently finished. This takes less time than a cold start. diff --git a/apps/webapp/app/components/admin/FeatureFlagsDialog.tsx b/apps/webapp/app/components/admin/FeatureFlagsDialog.tsx index b1050e60f..887103700 100644 --- a/apps/webapp/app/components/admin/FeatureFlagsDialog.tsx +++ b/apps/webapp/app/components/admin/FeatureFlagsDialog.tsx @@ -166,14 +166,14 @@ export function FeatureFlagsDialog({ return (
{key}
-
global: {globalDisplay}
+
global: {globalDisplay}
- +
); } @@ -187,7 +187,7 @@ export function FeatureFlagsDialog({ "flex items-center justify-between rounded-md border px-3 py-2.5", isOverridden ? "border-indigo-500/20 bg-indigo-500/5" - : "border-transparent bg-charcoal-750" + : "border-transparent bg-background-hover" )} >
@@ -199,7 +199,7 @@ export function FeatureFlagsDialog({ > {key}
-
global: {globalDisplay}
+
global: {globalDisplay}
@@ -283,7 +283,7 @@ export function FeatureFlagsDialog({ Preview JSON -
+            
               {jsonPreview}
             
diff --git a/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx b/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx index 8aa4b5c93..6b0185e33 100644 --- a/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx +++ b/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx @@ -42,7 +42,7 @@ export function MaxProjectsSection({ }, [savedJustNow, hasFieldErrors]); return ( -
+
Maximum projects {!isEditing && ( diff --git a/apps/webapp/app/components/admin/backOffice/RateLimitSection.tsx b/apps/webapp/app/components/admin/backOffice/RateLimitSection.tsx index efbd162df..09d51e69f 100644 --- a/apps/webapp/app/components/admin/backOffice/RateLimitSection.tsx +++ b/apps/webapp/app/components/admin/backOffice/RateLimitSection.tsx @@ -94,7 +94,7 @@ export function RateLimitSection({ }; return ( -
+
{title} {!isEditing && ( diff --git a/apps/webapp/app/components/billing/FreePlanUsage.tsx b/apps/webapp/app/components/billing/FreePlanUsage.tsx index 9f51754a1..4add40087 100644 --- a/apps/webapp/app/components/billing/FreePlanUsage.tsx +++ b/apps/webapp/app/components/billing/FreePlanUsage.tsx @@ -1,15 +1,20 @@ import { ArrowUpCircleIcon } from "@heroicons/react/24/outline"; import { Link } from "@remix-run/react"; import { motion, useMotionValue, useTransform } from "framer-motion"; +import { useThemeColor } from "~/hooks/useThemeColor"; import { cn } from "~/utils/cn"; export function FreePlanUsage({ to, percentage }: { to: string; percentage: number }) { const cappedPercentage = Math.min(percentage, 1); const widthProgress = useMotionValue(cappedPercentage * 100); + // Resolved to concrete colors - framer-motion can't interpolate var() strings + const successColor = useThemeColor("--color-success", "#28bf5c"); + const warningColor = useThemeColor("--color-warning", "#f59e0b"); + const errorColor = useThemeColor("--color-error", "#e11d48"); const color = useTransform( widthProgress, [0, 74, 75, 95, 100], - ["#22C55E", "#22C55E", "#F59E0B", "#F43F5E", "#F43F5E"] + [successColor, successColor, warningColor, errorColor, errorColor] ); const hasHitLimit = cappedPercentage >= 1; @@ -17,7 +22,7 @@ export function FreePlanUsage({ to, percentage }: { to: string; percentage: numb return (
diff --git a/apps/webapp/app/components/billing/UsageBar.tsx b/apps/webapp/app/components/billing/UsageBar.tsx index e570a029e..493464922 100644 --- a/apps/webapp/app/components/billing/UsageBar.tsx +++ b/apps/webapp/app/components/billing/UsageBar.tsx @@ -110,7 +110,7 @@ function Legend({ text, value, position, percentage, tooltipContent }: LegendPro return (
setPrompt(e.target.value)} disabled={isLoading} rows={8} - className="m-0 min-h-10 w-full resize-none border-0 bg-background-bright px-3 py-2.5 text-sm text-text-bright scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600 file:border-0 file:bg-transparent file:text-base file:font-medium placeholder:text-text-dimmed focus:border-0 focus:outline-none focus:ring-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50" + className="m-0 min-h-10 w-full resize-none border-0 bg-background-bright px-3 py-2.5 text-sm text-text-bright scrollbar-thin scrollbar-track-transparent scrollbar-thumb-surface-control file:border-0 file:bg-transparent file:text-base file:font-medium placeholder:text-text-dimmed focus:border-0 focus:outline-hidden focus:ring-0 focus-visible:outline-hidden focus-visible:ring-0 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50" onKeyDown={(e) => { if (e.key === "Enter" && !e.shiftKey && prompt.trim() && !isLoading) { e.preventDefault(); @@ -342,7 +342,7 @@ export function AIQueryInput({ className="overflow-hidden" >
-
+
{isLoading ? ( @@ -390,7 +390,7 @@ export function AIQueryInput({ )}
-
+
{thinking}

}> {thinking}
diff --git a/apps/webapp/app/components/code/ChartConfigPanel.tsx b/apps/webapp/app/components/code/ChartConfigPanel.tsx index 1b61e46a7..1c915c2a4 100644 --- a/apps/webapp/app/components/code/ChartConfigPanel.tsx +++ b/apps/webapp/app/components/code/ChartConfigPanel.tsx @@ -381,7 +381,7 @@ export function ChartConfigPanel({ columns, config, onChange, className }: Chart } updateConfig(updates); }} - className="rounded p-1 text-text-dimmed hover:bg-charcoal-700 hover:text-text-bright" + className="rounded p-1 text-text-dimmed hover:bg-background-raised hover:text-text-bright" title="Remove series" > @@ -406,7 +406,7 @@ export function ChartConfigPanel({ columns, config, onChange, className }: Chart }); } }} - className="flex items-center gap-1 self-start rounded px-1 py-0.5 text-xs text-text-dimmed hover:bg-charcoal-700 hover:text-text-bright" + className="flex items-center gap-1 self-start rounded px-1 py-0.5 text-xs text-text-dimmed hover:bg-background-raised hover:text-text-bright" > Add series @@ -568,7 +568,7 @@ function SeriesColorPicker({
@@ -1110,7 +1110,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({ return (
@@ -1165,7 +1165,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({ return (
@@ -1219,7 +1219,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({ className={cn( "absolute right-0 top-0 h-full w-0.5 cursor-col-resize touch-none select-none", "opacity-0 group-hover/header:opacity-100", - "bg-charcoal-600 hover:bg-indigo-500", + "bg-surface-control hover:bg-indigo-500", header.column.getIsResizing() && "bg-indigo-500 opacity-100" )} /> @@ -1249,7 +1249,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({ height: `${rowVirtualizer.getTotalSize()}px`, position: "relative", }} - className="divide-y divide-charcoal-700 bg-background-bright after:absolute after:bottom-0 after:left-0 after:right-0 after:z-[1] after:h-px after:bg-grid-bright" + className="divide-y divide-grid-bright bg-background-bright after:absolute after:bottom-0 after:left-0 after:right-0 after:z-1 after:h-px after:bg-grid-bright" > {rowVirtualizer.getVirtualItems().map((virtualRow) => { const row = tableRows[virtualRow.index]; @@ -1257,7 +1257,7 @@ export const TSQLResultsTable = memo(function TSQLResultsTable({ +
{block.title ? ( -
+
{block.title}
) : null} diff --git a/apps/webapp/app/components/dashboard-agent/DashboardAgentComposer.tsx b/apps/webapp/app/components/dashboard-agent/DashboardAgentComposer.tsx index 6f6813461..308a87eba 100644 --- a/apps/webapp/app/components/dashboard-agent/DashboardAgentComposer.tsx +++ b/apps/webapp/app/components/dashboard-agent/DashboardAgentComposer.tsx @@ -20,7 +20,7 @@ export function DashboardAgentComposer({ return (
-
+