fix: build
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user