fix: build

This commit is contained in:
Carlos Florêncio
2026-01-10 23:17:23 +00:00
parent e768e63ba4
commit ec0b97ebfb
10 changed files with 141 additions and 43 deletions
+71
View File
@@ -0,0 +1,71 @@
@font-face {
font-family: 'Figtree';
font-style: normal;
font-weight: 300 900;
font-display: swap;
src: url('/fonts/figtree/figtree-300-normal.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Figtree';
font-style: normal;
font-weight: 300 900;
font-display: swap;
src: url('/fonts/figtree/figtree-300-normal.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Geist';
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url('/fonts/geist/geist-100-normal.woff2') format('woff2');
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
font-family: 'Geist';
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url('/fonts/geist/geist-100-normal.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Geist';
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url('/fonts/geist/geist-100-normal.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Geist Mono';
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url('/fonts/geist-mono/geist-mono-100-normal.woff2') format('woff2');
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
font-family: 'Geist Mono';
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url('/fonts/geist-mono/geist-mono-100-normal.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'Geist Mono';
font-style: normal;
font-weight: 100 900;
font-display: swap;
src: url('/fonts/geist-mono/geist-mono-100-normal.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
+6
View File
@@ -1,6 +1,7 @@
@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
@import "./fonts.css";
@custom-variant dark (&:is(.dark *));
@@ -48,6 +49,11 @@
}
:root {
--font-geist-sans: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
--font-sans: "Figtree", "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI",
sans-serif;
--font-geist-mono: "Geist Mono", ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
+2 -17
View File
@@ -1,20 +1,7 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono, Figtree } from "next/font/google";
import "./globals.css";
import { ThemeProvider } from "@/components/theme-provider";
const figtree = Figtree({subsets:['latin'],variable:'--font-sans'});
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Kandev - AI Kanban",
description: "AI-powered kanban board for developers",
@@ -26,10 +13,8 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
<html lang="en" className={figtree.variable} suppressHydrationWarning>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<html lang="en" suppressHydrationWarning>
<body className="antialiased font-sans">
<ThemeProvider>{children}</ThemeProvider>
</body>
</html>
@@ -19,7 +19,7 @@ import {
DialogTitle,
} from '@/components/ui/dialog';
import { SETTINGS_DATA } from '@/lib/settings/dummy-data';
import type { Environment, EnvironmentType, BaseDocker } from '@/lib/settings/types';
import type { Environment, EnvironmentType, BaseDocker, AgentType } from '@/lib/settings/types';
export default function EnvironmentEditPage({ params }: { params: Promise<{ id: string }> }) {
const { id } = use(params);
@@ -91,7 +91,7 @@ export default function EnvironmentEditPage({ params }: { params: Promise<{ id:
});
};
const handleToggleAgent = (agentId: string) => {
const handleToggleAgent = (agentId: AgentType) => {
const installed = environment.installedAgents || [];
if (installed.includes(agentId)) {
setEnvironment({
@@ -287,8 +287,8 @@ export default function EnvironmentEditPage({ params }: { params: Promise<{ id:
>
<input
type="checkbox"
checked={(environment.installedAgents || []).includes(agent.id)}
onChange={() => handleToggleAgent(agent.id)}
checked={(environment.installedAgents || []).includes(agent.agent)}
onChange={() => handleToggleAgent(agent.agent)}
className="h-4 w-4"
/>
<div className="flex-1">
+6 -3
View File
@@ -116,9 +116,12 @@ export default function IntegrationsPage() {
<div className="flex items-center justify-between gap-3">
<div className="flex items-center gap-3 flex-1">
<div className="p-2 bg-muted rounded-lg">
{React.cloneElement(integration.icon as React.ReactElement, {
className: 'h-5 w-5',
})}
{React.isValidElement(integration.icon)
? React.cloneElement(
integration.icon as React.ReactElement<{ className?: string }>,
{ className: 'h-5 w-5' }
)
: integration.icon}
</div>
<div className="flex-1 min-w-0">
<div className="flex items-center gap-2">
+50 -17
View File
@@ -1,6 +1,7 @@
'use client';
import { FormEvent, useMemo, useState } from 'react';
import type { CSSProperties } from 'react';
import { FormEvent, useEffect, useMemo, useState } from 'react';
import Link from 'next/link';
import { DiffModeEnum, DiffView } from '@git-diff-view/react';
import '@git-diff-view/react/styles/diff-view.css';
@@ -324,15 +325,13 @@ function buildDiffData(filePath: string) {
}
export default function TaskPage() {
const defaultHorizontalLayout = getLocalStorage<[number, number]>(
'task-layout-horizontal',
[75, 25]
);
const defaultRightLayout = getLocalStorage<[number, number]>('task-layout-right', [55, 45]);
const defaultDiffMode = getLocalStorage<'unified' | 'split'>(
'task-diff-view-mode',
'unified'
);
const defaultHorizontalLayout: [number, number] = [75, 25];
const defaultRightLayout: [number, number] = [55, 45];
const defaultDiffMode: 'unified' | 'split' = 'unified';
const [horizontalLayout, setHorizontalLayout] = useState(defaultHorizontalLayout);
const [rightLayout, setRightLayout] = useState(defaultRightLayout);
const [horizontalSeed, setHorizontalSeed] = useState(0);
const [rightSeed, setRightSeed] = useState(0);
const [selectedAgent, setSelectedAgent] = useState(AGENTS[0].id);
const [chats, setChats] = useState<ChatSession[]>(INITIAL_CHATS);
const [leftTab, setLeftTab] = useState('chat');
@@ -362,6 +361,29 @@ export default function TaskPage() {
? DIFF_SAMPLES[selectedDiffPath]?.newContent ?? ''
: '';
useEffect(() => {
const storedHorizontal = getLocalStorage('task-layout-horizontal', defaultHorizontalLayout);
const storedRight = getLocalStorage('task-layout-right', defaultRightLayout);
const storedDiffMode = getLocalStorage('task-diff-view-mode', defaultDiffMode);
if (
storedHorizontal[0] !== defaultHorizontalLayout[0] ||
storedHorizontal[1] !== defaultHorizontalLayout[1]
) {
setHorizontalLayout(storedHorizontal);
setHorizontalSeed((value) => value + 1);
}
if (storedRight[0] !== defaultRightLayout[0] || storedRight[1] !== defaultRightLayout[1]) {
setRightLayout(storedRight);
setRightSeed((value) => value + 1);
}
if (storedDiffMode !== defaultDiffMode) {
setDiffViewMode(storedDiffMode);
}
}, []);
const handleSubmit = (event: FormEvent) => {
event.preventDefault();
const trimmed = messageInput.trim();
@@ -480,7 +502,10 @@ export default function TaskPage() {
</TabsContent>
<TabsContent value="files" className="mt-3 flex-1 min-h-0">
<div className="flex-1 min-h-0 overflow-y-auto rounded-lg bg-background h-full">
<SidebarProvider className="h-full w-full" style={{ "--sidebar-width": "100%" }}>
<SidebarProvider
className="h-full w-full"
style={{ "--sidebar-width": "100%" } as CSSProperties}
>
<Sidebar collapsible="none" className="h-full w-full">
<SidebarContent>
<SidebarGroup>
@@ -675,11 +700,15 @@ export default function TaskPage() {
<div className="flex-1 min-h-0 px-4 pb-4">
<ResizablePanelGroup
key={horizontalSeed}
direction="horizontal"
className="h-full"
onLayout={(sizes) => setLocalStorage('task-layout-horizontal', sizes)}
onLayout={(sizes) => {
setHorizontalLayout(sizes as [number, number]);
setLocalStorage('task-layout-horizontal', sizes);
}}
>
<ResizablePanel defaultSize={defaultHorizontalLayout[0]} minSize={55}>
<ResizablePanel defaultSize={horizontalLayout[0]} minSize={55}>
<div className="h-full min-h-0 bg-card p-4 flex flex-col rounded-lg border border-border/70 border-r-0 mr-[5px]">
<Tabs
value={leftTab}
@@ -953,7 +982,7 @@ export default function TaskPage() {
</div>
</ResizablePanel>
<ResizableHandle className="w-px" />
<ResizablePanel defaultSize={defaultHorizontalLayout[1]} minSize={20}>
<ResizablePanel defaultSize={horizontalLayout[1]} minSize={20}>
{isBottomCollapsed ? (
<div className="h-full min-h-0 flex flex-col gap-1">
<div className="flex-1 min-h-0">{topFilesPanel}</div>
@@ -997,15 +1026,19 @@ export default function TaskPage() {
</div>
) : (
<ResizablePanelGroup
key={rightSeed}
direction="vertical"
className="h-full"
onLayout={(sizes) => setLocalStorage('task-layout-right', sizes)}
onLayout={(sizes) => {
setRightLayout(sizes as [number, number]);
setLocalStorage('task-layout-right', sizes);
}}
>
<ResizablePanel defaultSize={defaultRightLayout[0]} minSize={30}>
<ResizablePanel defaultSize={rightLayout[0]} minSize={30}>
{topFilesPanel}
</ResizablePanel>
<ResizableHandle className="h-px" />
<ResizablePanel defaultSize={defaultRightLayout[1]} minSize={20}>
<ResizablePanel defaultSize={rightLayout[1]} minSize={20}>
<div className="h-full min-h-0 bg-card p-4 flex flex-col rounded-lg border border-border/70 border-l-0 mt-[5px]">
<Tabs
value={terminalTabValue}
+2 -2
View File
@@ -4,8 +4,8 @@
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"build": "NODE_ENV=production next build",
"start": "NODE_ENV=production next start",
"lint": "eslint"
},
"dependencies": {
Binary file not shown.