chore(ui): update tailwind (#9049)

Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
This commit is contained in:
Mislav Lukach 2025-06-10 20:20:04 +02:00 committed by GitHub
parent dca9c7bdc6
commit b7da65d373
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
30 changed files with 3049 additions and 2591 deletions

18
frontend/hero.ts Normal file
View File

@ -0,0 +1,18 @@
import { heroui } from "@heroui/react";
export default heroui({
defaultTheme: "dark",
layout: {
radius: {
small: "5px",
large: "20px",
},
},
themes: {
dark: {
colors: {
primary: "#4465DB",
},
},
},
});

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
"node": ">=20.0.0" "node": ">=20.0.0"
}, },
"dependencies": { "dependencies": {
"@heroui/react": "2.7.8", "@heroui/react": "^2.8.0-beta.7",
"@microlink/react-json-view": "^1.26.2", "@microlink/react-json-view": "^1.26.2",
"@monaco-editor/react": "^4.7.0-rc.0", "@monaco-editor/react": "^4.7.0-rc.0",
"@react-router/node": "^7.6.1", "@react-router/node": "^7.6.1",
@ -16,6 +16,8 @@
"@reduxjs/toolkit": "^2.8.2", "@reduxjs/toolkit": "^2.8.2",
"@stripe/react-stripe-js": "^3.7.0", "@stripe/react-stripe-js": "^3.7.0",
"@stripe/stripe-js": "^7.3.0", "@stripe/stripe-js": "^7.3.0",
"@tailwindcss/postcss": "^4.1.8",
"@tailwindcss/vite": "^4.1.8",
"@tanstack/react-query": "^5.77.2", "@tanstack/react-query": "^5.77.2",
"@vitejs/plugin-react": "^4.4.0", "@vitejs/plugin-react": "^4.4.0",
"@xterm/addon-fit": "^0.10.0", "@xterm/addon-fit": "^0.10.0",
@ -23,7 +25,7 @@
"axios": "^1.9.0", "axios": "^1.9.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"eslint-config-airbnb-typescript": "^18.0.0", "eslint-config-airbnb-typescript": "^18.0.0",
"framer-motion": "^12.14.0", "framer-motion": "^12.16.0",
"i18next": "^25.2.1", "i18next": "^25.2.1",
"i18next-browser-languagedetector": "^8.1.0", "i18next-browser-languagedetector": "^8.1.0",
"i18next-http-backend": "^3.0.2", "i18next-http-backend": "^3.0.2",
@ -115,10 +117,9 @@
"jsdom": "^26.1.0", "jsdom": "^26.1.0",
"lint-staged": "^16.0.0", "lint-staged": "^16.0.0",
"msw": "^2.6.6", "msw": "^2.6.6",
"postcss": "^8.5.2",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"stripe": "^18.1.1", "stripe": "^18.1.1",
"tailwindcss": "^3.4.17", "tailwindcss": "^4.1.8",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"vite-plugin-svgr": "^4.2.0", "vite-plugin-svgr": "^4.2.0",
"vite-tsconfig-paths": "^5.1.4", "vite-tsconfig-paths": "^5.1.4",

View File

@ -1,6 +1,5 @@
export default { export default {
plugins: { plugins: {
tailwindcss: {}, "@tailwindcss/postcss": {},
autoprefixer: {},
}, },
} };

View File

@ -132,7 +132,7 @@ export function ChatInput({
maxRows={maxRows} maxRows={maxRows}
data-dragging-over={isDraggingOver} data-dragging-over={isDraggingOver}
className={cn( className={cn(
"grow text-sm self-center placeholder:text-neutral-400 text-white resize-none outline-none ring-0", "grow text-sm self-center placeholder:text-neutral-400 text-white resize-none outline-hidden ring-0",
"transition-all duration-200 ease-in-out", "transition-all duration-200 ease-in-out",
isDraggingOver isDraggingOver
? "bg-neutral-600/50 rounded-lg px-2" ? "bg-neutral-600/50 rounded-lg px-2"

View File

@ -114,7 +114,7 @@ export function ExpandableMessage({
{t(I18nKey.STATUS$ERROR_LLM_OUT_OF_CREDITS)} {t(I18nKey.STATUS$ERROR_LLM_OUT_OF_CREDITS)}
</div> </div>
<Link <Link
className="mt-2 mb-2 w-full h-10 rounded flex items-center justify-center gap-2 bg-primary text-[#0D0F11]" className="mt-2 mb-2 w-full h-10 rounded-sm flex items-center justify-center gap-2 bg-primary text-[#0D0F11]"
to="/settings/billing" to="/settings/billing"
> >
{t(I18nKey.BILLING$CLICK_TO_TOP_UP)} {t(I18nKey.BILLING$CLICK_TO_TOP_UP)}

View File

@ -101,7 +101,7 @@ export function FeedbackForm({ onClose, polarity }: FeedbackFormProps) {
name="email" name="email"
type="email" type="email"
placeholder={t(I18nKey.FEEDBACK$EMAIL_PLACEHOLDER)} placeholder={t(I18nKey.FEEDBACK$EMAIL_PLACEHOLDER)}
className="bg-[#27272A] px-3 py-[10px] rounded" className="bg-[#27272A] px-3 py-[10px] rounded-sm"
/> />
</label> </label>

View File

@ -6,7 +6,7 @@ export function BranchErrorState() {
return ( return (
<div <div
data-testid="branch-dropdown-error" data-testid="branch-dropdown-error"
className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded text-red-500" className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded-sm text-red-500"
> >
<span className="text-sm">{t("HOME$FAILED_TO_LOAD_BRANCHES")}</span> <span className="text-sm">{t("HOME$FAILED_TO_LOAD_BRANCHES")}</span>
</div> </div>

View File

@ -7,7 +7,7 @@ export function BranchLoadingState() {
return ( return (
<div <div
data-testid="branch-dropdown-loading" data-testid="branch-dropdown-loading"
className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded" className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded-sm"
> >
<Spinner size="sm" /> <Spinner size="sm" />
<span className="text-sm">{t("HOME$LOADING_BRANCHES")}</span> <span className="text-sm">{t("HOME$LOADING_BRANCHES")}</span>

View File

@ -6,7 +6,7 @@ export function RepositoryErrorState() {
return ( return (
<div <div
data-testid="repo-dropdown-error" data-testid="repo-dropdown-error"
className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded text-red-500" className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded-sm text-red-500"
> >
<span className="text-sm">{t("HOME$FAILED_TO_LOAD_REPOSITORIES")}</span> <span className="text-sm">{t("HOME$FAILED_TO_LOAD_REPOSITORIES")}</span>
</div> </div>

View File

@ -7,7 +7,7 @@ export function RepositoryLoadingState() {
return ( return (
<div <div
data-testid="repo-dropdown-loading" data-testid="repo-dropdown-loading"
className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded" className="flex items-center gap-2 max-w-[500px] h-10 px-3 bg-tertiary border border-[#717888] rounded-sm"
> >
<Spinner size="sm" /> <Spinner size="sm" />
<span className="text-sm">{t("HOME$LOADING_REPOSITORIES")}</span> <span className="text-sm">{t("HOME$LOADING_REPOSITORIES")}</span>

View File

@ -12,7 +12,7 @@ export function Thumbnail({ src, size = "small" }: ThumbnailProps) {
alt="" alt=""
src={src} src={src}
className={cn( className={cn(
"rounded object-cover", "rounded-sm object-cover",
size === "small" && "w-[62px] h-[62px]", size === "small" && "w-[62px] h-[62px]",
size === "large" && "w-[100px] h-[100px]", size === "large" && "w-[100px] h-[100px]",
)} )}

View File

@ -43,7 +43,7 @@ export function PaymentForm() {
> >
<div <div
className={cn( className={cn(
"flex items-center justify-between w-[680px] bg-[#7F7445] rounded px-3 py-2", "flex items-center justify-between w-[680px] bg-[#7F7445] rounded-sm px-3 py-2",
"text-[28px] leading-8 -tracking-[0.02em] font-bold", "text-[28px] leading-8 -tracking-[0.02em] font-bold",
)} )}
> >

View File

@ -32,7 +32,7 @@ export function BrandButton({
type={type} type={type}
onClick={onClick} onClick={onClick}
className={cn( className={cn(
"w-fit p-2 text-sm rounded disabled:opacity-30 disabled:cursor-not-allowed hover:opacity-80", "w-fit p-2 text-sm rounded-sm disabled:opacity-30 disabled:cursor-not-allowed hover:opacity-80",
variant === "primary" && "bg-primary text-[#0D0F11]", variant === "primary" && "bg-primary text-[#0D0F11]",
variant === "secondary" && "border border-primary text-primary", variant === "secondary" && "border border-primary text-primary",
variant === "danger" && "bg-red-600 text-white hover:bg-red-700", variant === "danger" && "bg-red-600 text-white hover:bg-red-700",

View File

@ -69,7 +69,7 @@ export function MCPJsonEditor({ mcpConfig, onChange }: MCPJsonEditorProps) {
{t(I18nKey.SETTINGS$MCP_CONFIG_DESCRIPTION)} {t(I18nKey.SETTINGS$MCP_CONFIG_DESCRIPTION)}
</div> </div>
<textarea <textarea
className="w-full h-64 p-2 text-sm font-mono bg-base-tertiary rounded-md focus:border-blue-500 focus:outline-none" className="w-full h-64 p-2 text-sm font-mono bg-base-tertiary rounded-md focus:border-blue-500 focus:outline-hidden"
value={configText} value={configText}
onChange={handleTextChange} onChange={handleTextChange}
spellCheck="false" spellCheck="false"

View File

@ -158,7 +158,7 @@ export function SecretForm({
required required
className={cn( className={cn(
"resize-none", "resize-none",
"bg-tertiary border border-[#717888] rounded p-2 placeholder:italic placeholder:text-tertiary-alt", "bg-tertiary border border-[#717888] rounded-sm p-2 placeholder:italic placeholder:text-tertiary-alt",
"disabled:bg-[#2D2F36] disabled:border-[#2D2F36] disabled:cursor-not-allowed", "disabled:bg-[#2D2F36] disabled:border-[#2D2F36] disabled:cursor-not-allowed",
)} )}
rows={8} rows={8}
@ -177,7 +177,7 @@ export function SecretForm({
defaultValue={secretDescription} defaultValue={secretDescription}
className={cn( className={cn(
"resize-none", "resize-none",
"bg-tertiary border border-[#717888] rounded p-2 placeholder:italic placeholder:text-tertiary-alt", "bg-tertiary border border-[#717888] rounded-sm p-2 placeholder:italic placeholder:text-tertiary-alt",
"disabled:bg-[#2D2F36] disabled:border-[#2D2F36] disabled:cursor-not-allowed", "disabled:bg-[#2D2F36] disabled:border-[#2D2F36] disabled:cursor-not-allowed",
)} )}
/> />

View File

@ -63,7 +63,7 @@ export function SettingsDropdownInput({
inputProps={{ inputProps={{
classNames: { classNames: {
inputWrapper: inputWrapper:
"bg-tertiary border border-[#717888] h-10 w-full rounded p-2 placeholder:italic", "bg-tertiary border border-[#717888] h-10 w-full rounded-sm p-2 placeholder:italic",
}, },
}} }}
defaultFilter={defaultFilter} defaultFilter={defaultFilter}

View File

@ -62,7 +62,7 @@ export function SettingsInput({
required={required} required={required}
pattern={pattern} pattern={pattern}
className={cn( className={cn(
"bg-tertiary border border-[#717888] h-10 w-full rounded p-2 placeholder:italic placeholder:text-tertiary-alt", "bg-tertiary border border-[#717888] h-10 w-full rounded-sm p-2 placeholder:italic placeholder:text-tertiary-alt",
"disabled:bg-[#2D2F36] disabled:border-[#2D2F36] disabled:cursor-not-allowed", "disabled:bg-[#2D2F36] disabled:border-[#2D2F36] disabled:cursor-not-allowed",
)} )}
/> />

View File

@ -16,7 +16,7 @@ export function ReplaySuggestionBox({ onChange }: ReplaySuggestionBoxProps) {
htmlFor="import-trajectory" htmlFor="import-trajectory"
className="w-full flex justify-center" className="w-full flex justify-center"
> >
<span className="border-2 border-dashed border-neutral-600 rounded px-2 py-1 cursor-pointer"> <span className="border-2 border-dashed border-neutral-600 rounded-sm px-2 py-1 cursor-pointer">
{t(I18nKey.LANDING$UPLOAD_TRAJECTORY)} {t(I18nKey.LANDING$UPLOAD_TRAJECTORY)}
</span> </span>
<input <input

View File

@ -18,7 +18,7 @@ export function EditorActionButton({
onClick={onClick} onClick={onClick}
disabled={disabled} disabled={disabled}
className={cn( className={cn(
"text-sm py-0.5 rounded w-20", "text-sm py-0.5 rounded-sm w-20",
"hover:bg-tertiary disabled:opacity-50 disabled:cursor-not-allowed", "hover:bg-tertiary disabled:opacity-50 disabled:cursor-not-allowed",
className, className,
)} )}

View File

@ -31,7 +31,7 @@ export function ModalButton({
disabled={disabled} disabled={disabled}
onClick={onClick} onClick={onClick}
className={clsx( className={clsx(
variant === "default" && "text-sm font-[500] py-[10px] rounded", variant === "default" && "text-sm font-[500] py-[10px] rounded-sm",
variant === "text-like" && "text-xs leading-4 font-normal", variant === "text-like" && "text-xs leading-4 font-normal",
icon && "flex items-center justify-center gap-2", icon && "flex items-center justify-center gap-2",
disabled && "opacity-50 cursor-not-allowed", disabled && "opacity-50 cursor-not-allowed",

View File

@ -36,7 +36,7 @@ export function CustomInput({
required={required} required={required}
defaultValue={defaultValue} defaultValue={defaultValue}
type={type} type={type}
className="bg-[#27272A] text-xs py-[10px] px-3 rounded" className="bg-[#27272A] text-xs py-[10px] px-3 rounded-sm"
/> />
</label> </label>
); );

View File

@ -16,7 +16,7 @@ export function ErrorToast({ id, error }: ErrorToastProps) {
<button <button
type="button" type="button"
onClick={() => toast.dismiss(id)} onClick={() => toast.dismiss(id)}
className="bg-neutral-500 px-1 rounded h-full" className="bg-neutral-500 px-1 rounded-sm h-full"
> >
{t(I18nKey.ERROR_TOAST$CLOSE_BUTTON_LABEL)} {t(I18nKey.ERROR_TOAST$CLOSE_BUTTON_LABEL)}
</button> </button>

View File

@ -269,19 +269,19 @@ function SecurityInvariant() {
<hr className="border-t border-neutral-600 my-2" /> <hr className="border-t border-neutral-600 my-2" />
<ul className="space-y-2"> <ul className="space-y-2">
<div <div
className={`cursor-pointer p-2 rounded ${activeSection === "logs" && "bg-neutral-600"}`} className={`cursor-pointer p-2 rounded-sm ${activeSection === "logs" && "bg-neutral-600"}`}
onClick={() => setActiveSection("logs")} onClick={() => setActiveSection("logs")}
> >
{t(I18nKey.INVARIANT$LOG_LABEL)} {t(I18nKey.INVARIANT$LOG_LABEL)}
</div> </div>
<div <div
className={`cursor-pointer p-2 rounded ${activeSection === "policy" && "bg-neutral-600"}`} className={`cursor-pointer p-2 rounded-sm ${activeSection === "policy" && "bg-neutral-600"}`}
onClick={() => setActiveSection("policy")} onClick={() => setActiveSection("policy")}
> >
{t(I18nKey.INVARIANT$POLICY_LABEL)} {t(I18nKey.INVARIANT$POLICY_LABEL)}
</div> </div>
<div <div
className={`cursor-pointer p-2 rounded ${activeSection === "settings" && "bg-neutral-600"}`} className={`cursor-pointer p-2 rounded-sm ${activeSection === "settings" && "bg-neutral-600"}`}
onClick={() => setActiveSection("settings")} onClick={() => setActiveSection("settings")}
> >
{t(I18nKey.INVARIANT$SETTINGS_LABEL)} {t(I18nKey.INVARIANT$SETTINGS_LABEL)}

View File

@ -92,7 +92,7 @@ export function ModelSelector({
inputProps={{ inputProps={{
classNames: { classNames: {
inputWrapper: inputWrapper:
"bg-tertiary border border-[#717888] h-10 w-full rounded p-2 placeholder:italic", "bg-tertiary border border-[#717888] h-10 w-full rounded-sm p-2 placeholder:italic",
}, },
}} }}
> >
@ -142,7 +142,7 @@ export function ModelSelector({
inputProps={{ inputProps={{
classNames: { classNames: {
inputWrapper: inputWrapper:
"bg-tertiary border border-[#717888] h-10 w-full rounded p-2 placeholder:italic", "bg-tertiary border border-[#717888] h-10 w-full rounded-sm p-2 placeholder:italic",
}, },
}} }}
> >

View File

@ -41,11 +41,11 @@ function EmailInputSection({
type="email" type="email"
value={email} value={email}
onChange={onEmailChange} onChange={onEmailChange}
className={`text-base text-white p-2 bg-base-tertiary rounded border ${ className={`text-base text-white p-2 bg-base-tertiary rounded-sm border ${
isEmailChanged && !isEmailValid isEmailChanged && !isEmailValid
? "border-red-500" ? "border-red-500"
: "border-tertiary" : "border-tertiary"
} flex-grow focus:outline-none focus:border-transparent focus:ring-0`} } flex-grow focus:outline-hidden focus:border-transparent focus:ring-0`}
placeholder={t("SETTINGS$USER_EMAIL_LOADING")} placeholder={t("SETTINGS$USER_EMAIL_LOADING")}
data-testid="email-input" data-testid="email-input"
/> />
@ -65,7 +65,7 @@ function EmailInputSection({
type="button" type="button"
onClick={onSaveEmail} onClick={onSaveEmail}
disabled={!isEmailChanged || isSaving || !isEmailValid} disabled={!isEmailChanged || isSaving || !isEmailValid}
className="px-4 py-2 rounded bg-primary text-white hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed disabled:text-[#0D0F11]" className="px-4 py-2 rounded-sm bg-primary text-white hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed disabled:text-[#0D0F11]"
data-testid="save-email-button" data-testid="save-email-button"
> >
{isSaving ? t("SETTINGS$SAVING") : t("SETTINGS$SAVE")} {isSaving ? t("SETTINGS$SAVING") : t("SETTINGS$SAVE")}
@ -76,7 +76,7 @@ function EmailInputSection({
type="button" type="button"
onClick={onResendVerification} onClick={onResendVerification}
disabled={isResendingVerification} disabled={isResendingVerification}
className="px-4 py-2 rounded bg-primary text-white hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed disabled:text-[#0D0F11]" className="px-4 py-2 rounded-sm bg-primary text-white hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed disabled:text-[#0D0F11]"
data-testid="resend-verification-button" data-testid="resend-verification-button"
> >
{isResendingVerification {isResendingVerification
@ -96,7 +96,7 @@ function VerificationAlert() {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div <div
className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mt-4" className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded-sm mt-4"
role="alert" role="alert"
> >
<p className="font-bold">{t("SETTINGS$EMAIL_VERIFICATION_REQUIRED")}</p> <p className="font-bold">{t("SETTINGS$EMAIL_VERIFICATION_REQUIRED")}</p>
@ -205,7 +205,7 @@ function UserSettingsScreen() {
<div data-testid="user-settings-screen" className="flex flex-col h-full"> <div data-testid="user-settings-screen" className="flex flex-col h-full">
<div className="p-9 flex flex-col gap-6"> <div className="p-9 flex flex-col gap-6">
{isLoading ? ( {isLoading ? (
<div className="animate-pulse h-8 w-64 bg-tertiary rounded" /> <div className="animate-pulse h-8 w-64 bg-tertiary rounded-sm" />
) : ( ) : (
<EmailInputSection <EmailInputSection
email={email} email={email}

View File

@ -76,7 +76,7 @@ function VSCodeTab() {
<button <button
type="button" type="button"
onClick={handleOpenInNewTab} onClick={handleOpenInNewTab}
className="px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors" className="px-4 py-2 bg-primary text-white rounded-sm hover:bg-primary-dark transition-colors"
> >
{t("VSCODE$OPEN_IN_NEW_TAB")} {t("VSCODE$OPEN_IN_NEW_TAB")}
</button> </button>

View File

@ -1,9 +1,12 @@
@tailwind base; @import "tailwindcss";
@tailwind components;
@tailwind utilities; @plugin '../hero.ts';
@config "../tailwind.config.js";
@source '../node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}';
.button-base { .button-base {
@apply bg-tertiary border border-neutral-600 rounded; @apply bg-tertiary border border-neutral-600 rounded-xs;
} }
.skeleton { .skeleton {

View File

@ -2,10 +2,6 @@
import { heroui } from "@heroui/react"; import { heroui } from "@heroui/react";
import typography from "@tailwindcss/typography"; import typography from "@tailwindcss/typography";
export default { export default {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}",
],
theme: { theme: {
extend: { extend: {
colors: { colors: {
@ -24,24 +20,5 @@ export default {
}, },
}, },
darkMode: "class", darkMode: "class",
plugins: [ plugins: [typography],
heroui({
defaultTheme: "dark",
layout: {
radius: {
small: "5px",
large: "20px",
},
},
themes: {
dark: {
colors: {
primary: "#4465DB",
logo: "#CFB755",
},
},
},
}),
typography,
],
}; };

View File

@ -5,6 +5,7 @@ import viteTsconfigPaths from "vite-tsconfig-paths";
import svgr from "vite-plugin-svgr"; import svgr from "vite-plugin-svgr";
import { reactRouter } from "@react-router/dev/vite"; import { reactRouter } from "@react-router/dev/vite";
import { configDefaults } from "vitest/config"; import { configDefaults } from "vitest/config";
import tailwindcss from "@tailwindcss/vite";
export default defineConfig(({ mode }) => { export default defineConfig(({ mode }) => {
const { const {
@ -28,6 +29,7 @@ export default defineConfig(({ mode }) => {
!process.env.VITEST && reactRouter(), !process.env.VITEST && reactRouter(),
viteTsconfigPaths(), viteTsconfigPaths(),
svgr(), svgr(),
tailwindcss(),
], ],
server: { server: {
port: FE_PORT, port: FE_PORT,
@ -54,7 +56,7 @@ export default defineConfig(({ mode }) => {
}, },
}, },
watch: { watch: {
ignored: ['**/node_modules/**', '**/.git/**'], ignored: ["**/node_modules/**", "**/.git/**"],
}, },
}, },
ssr: { ssr: {