-
({
value: bucket.key,
@@ -322,13 +314,12 @@ export function KnowledgeFilterPanel() {
onValueChange={(values) =>
handleFilterChange("data_sources", values)
}
- placeholder="Select data sources..."
- allOptionLabel="All Data Sources"
+ placeholder="Select sources..."
+ allOptionLabel="All sources"
/>
-
({
@@ -341,13 +332,12 @@ export function KnowledgeFilterPanel() {
onValueChange={(values) =>
handleFilterChange("document_types", values)
}
- placeholder="Select document types..."
- allOptionLabel="All Document Types"
+ placeholder="Select types..."
+ allOptionLabel="All types"
/>
-
({
value: bucket.key,
@@ -362,7 +352,6 @@ export function KnowledgeFilterPanel() {
-
({
@@ -375,33 +364,13 @@ export function KnowledgeFilterPanel() {
onValueChange={(values) =>
handleFilterChange("connector_types", values)
}
- placeholder="Select sources..."
- allOptionLabel="All Sources"
+ placeholder="Select connectors..."
+ allOptionLabel="All connectors"
/>
- {/* All/None buttons */}
-
-
-
-
-
{/* Result Limit Control - exactly like search page */}
-
+
-
- {/* Save Configuration Button */}
-
-
- {!createMode && (
-
- )}
-
+
+ {/* Save Configuration Button */}
+ {createMode && (
+
+ )}
+ {!createMode && (
+
+ )}
+
+
);
diff --git a/frontend/components/ui/button.tsx b/frontend/components/ui/button.tsx
index aff33335..b6728df8 100644
--- a/frontend/components/ui/button.tsx
+++ b/frontend/components/ui/button.tsx
@@ -14,7 +14,7 @@ const buttonVariants = cva(
"border border-input hover:bg-muted hover:text-accent-foreground disabled:bg-muted disabled:!border-none",
primary:
"border bg-background text-secondary-foreground hover:bg-muted hover:shadow-sm",
- warning: "bg-warning text-secondary hover:bg-warning/90",
+ warning: "bg-warning text-warning-foreground hover:bg-warning/90",
secondary:
"border border-muted bg-muted text-secondary-foreground hover:bg-secondary-foreground/5",
ghost:
diff --git a/frontend/components/ui/multi-select.tsx b/frontend/components/ui/multi-select.tsx
index ce45fd27..a70bdaa5 100644
--- a/frontend/components/ui/multi-select.tsx
+++ b/frontend/components/ui/multi-select.tsx
@@ -1,39 +1,39 @@
-"use client"
+"use client";
-import * as React from "react"
-import { ChevronDown, Check } from "lucide-react"
-import { cn } from "@/lib/utils"
-import { Button } from "@/components/ui/button"
+import * as React from "react";
+import { ChevronDown, Check } from "lucide-react";
+import { cn } from "@/lib/utils";
+import { Button } from "@/components/ui/button";
import {
Command,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
-} from "@/components/ui/command"
+} from "@/components/ui/command";
import {
Popover,
PopoverContent,
PopoverTrigger,
-} from "@/components/ui/popover"
-import { ScrollArea } from "@/components/ui/scroll-area"
+} from "@/components/ui/popover";
+import { ScrollArea } from "@/components/ui/scroll-area";
interface Option {
- value: string
- label: string
- count?: number
+ value: string;
+ label: string;
+ count?: number;
}
interface MultiSelectProps {
- options: Option[]
- value: string[]
- onValueChange: (value: string[]) => void
- placeholder?: string
- className?: string
- maxSelection?: number
- searchPlaceholder?: string
- showAllOption?: boolean
- allOptionLabel?: string
+ options: Option[];
+ value: string[];
+ onValueChange: (value: string[]) => void;
+ placeholder?: string;
+ className?: string;
+ maxSelection?: number;
+ searchPlaceholder?: string;
+ showAllOption?: boolean;
+ allOptionLabel?: string;
}
export function MultiSelect({
@@ -43,60 +43,61 @@ export function MultiSelect({
placeholder = "Select items...",
className,
maxSelection,
- searchPlaceholder = "Search...",
+ searchPlaceholder = "Search options...",
showAllOption = true,
- allOptionLabel = "All"
+ allOptionLabel = "All",
}: MultiSelectProps) {
- const [open, setOpen] = React.useState(false)
- const [searchValue, setSearchValue] = React.useState("")
+ const [open, setOpen] = React.useState(false);
+ const [searchValue, setSearchValue] = React.useState("");
- const isAllSelected = value.includes("*")
-
- const filteredOptions = options.filter(option =>
+ const isAllSelected = value.includes("*");
+
+ const filteredOptions = options.filter((option) =>
option.label.toLowerCase().includes(searchValue.toLowerCase())
- )
+ );
const handleSelect = (optionValue: string) => {
if (optionValue === "*") {
// Toggle "All" selection
if (isAllSelected) {
- onValueChange([])
+ onValueChange([]);
} else {
- onValueChange(["*"])
+ onValueChange(["*"]);
}
} else {
- let newValue: string[]
+ let newValue: string[];
if (value.includes(optionValue)) {
// Remove the item
- newValue = value.filter(v => v !== optionValue && v !== "*")
+ newValue = value.filter((v) => v !== optionValue && v !== "*");
} else {
// Add the item and remove "All" if present
- newValue = [...value.filter(v => v !== "*"), optionValue]
-
+ newValue = [...value.filter((v) => v !== "*"), optionValue];
+
// Check max selection limit
if (maxSelection && newValue.length > maxSelection) {
- return
+ return;
}
}
- onValueChange(newValue)
+ onValueChange(newValue);
}
- }
+ };
const getDisplayText = () => {
if (isAllSelected) {
- return allOptionLabel
+ return allOptionLabel;
}
-
+
if (value.length === 0) {
- return placeholder
+ return placeholder;
}
-
+
// Extract the noun from placeholder (e.g., "Select data sources..." -> "data sources")
- const noun = placeholder.toLowerCase().replace('select ', '').replace('...', '')
- return `${value.length} ${noun}`
- }
-
-
+ const noun = placeholder
+ .toLowerCase()
+ .replace("select ", "")
+ .replace("...", "");
+ return `${value.length} ${noun}`;
+ };
return (
@@ -106,17 +107,15 @@ export function MultiSelect({
role="combobox"
aria-expanded={open}
className={cn(
- "w-full justify-between min-h-[40px] h-auto text-left",
+ "w-full justify-between h-8 py-0 text-left",
className
)}
>
-
- {getDisplayText()}
-
+ {getDisplayText()}
-
+
handleSelect("*")}
className="cursor-pointer"
>
+ {allOptionLabel}
- {allOptionLabel}
-
- *
-
)}
{filteredOptions.map((option) => (
@@ -149,20 +145,19 @@ export function MultiSelect({
key={option.value}
onSelect={() => handleSelect(option.value)}
className="cursor-pointer"
- disabled={isAllSelected}
>
-
{option.label}
{option.count !== undefined && (
{option.count}
)}
+
))}
@@ -170,5 +165,5 @@ export function MultiSelect({
- )
-}
\ No newline at end of file
+ );
+}
diff --git a/frontend/components/ui/slider.tsx b/frontend/components/ui/slider.tsx
index 0ca945b1..3f0f0770 100644
--- a/frontend/components/ui/slider.tsx
+++ b/frontend/components/ui/slider.tsx
@@ -17,10 +17,10 @@ const Slider = React.forwardRef<
)}
{...props}
>
-
-
+
+
-
+
))
Slider.displayName = SliderPrimitive.Root.displayName
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 0b79bb00..58d78031 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -28,7 +28,6 @@
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-tooltip": "^1.2.8",
"@tailwindcss/forms": "^0.5.10",
- "@tailwindcss/line-clamp": "^0.4.4",
"@tailwindcss/typography": "^0.5.16",
"@tanstack/react-query": "^5.86.0",
"ag-grid-community": "^34.2.0",
@@ -2318,14 +2317,6 @@
"tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1"
}
},
- "node_modules/@tailwindcss/line-clamp": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz",
- "integrity": "sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g==",
- "peerDependencies": {
- "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1"
- }
- },
"node_modules/@tailwindcss/typography": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index d4bc0a4c..bc9eb72c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -29,7 +29,6 @@
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-tooltip": "^1.2.8",
"@tailwindcss/forms": "^0.5.10",
- "@tailwindcss/line-clamp": "^0.4.4",
"@tailwindcss/typography": "^0.5.16",
"@tanstack/react-query": "^5.86.0",
"ag-grid-community": "^34.2.0",
diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css
index 3d929b8b..150d1c56 100644
--- a/frontend/src/app/globals.css
+++ b/frontend/src/app/globals.css
@@ -25,27 +25,28 @@
--muted-foreground: 240 4% 46%;
--accent: 240 5% 96%;
--accent-foreground: 0 0% 0%;
- --destructive: 0 72% 51%;
- --destructive-foreground: 0 0% 100%;
- --warning: 48, 96%, 89%;
- --warning-foreground: 26, 90%, 37%;
--border: 240 4.8% 95.9%;
--input: 240 6% 90%;
--ring: 0 0% 0%;
--placeholder-foreground: 240 5% 65%;
- --accent-amber: 48, 96%, 89%; /* amber-100 #fef3c7 */
- --accent-amber-foreground: 26, 90%, 37%; /* amber-700 #b45309 */
- --accent-emerald: 149, 80%, 90%; /* emerald-100 #d1fae5 */
- --accent-emerald-foreground: 161, 94%, 30%; /* emerald-600 #059669 */
- --accent-red: 0, 93%, 94%; /* red-100 #fee2e2 */
- --accent-red-foreground: 0, 72%, 51%; /* red-600 #dc2626 */
- --accent-indigo: 226, 100%, 94%; /* indigo-100 #e0e7ff */
- --accent-indigo-foreground: 243, 75%, 59%; /* indigo-600 #4f46e5 */
- --accent-pink: 326, 78%, 95%; /* pink-100 #fce7f3 */
- --accent-pink-foreground: 333, 71%, 51%; /* pink-600 #db2777 */
- --accent-purple: 269, 100%, 95%; /* purple-100 #f3e8ff */
- --accent-purple-foreground: 271, 81%, 56%; /* purple-600 #7c3aed */
+ --accent-amber: 48 96% 89%; /* amber-100 #fef3c7 */
+ --accent-amber-foreground: 26 90% 37%; /* amber-700 #b45309 */
+ --accent-emerald: 149 80% 90%; /* emerald-100 #d1fae5 */
+ --accent-emerald-foreground: 161 94% 30%; /* emerald-600 #059669 */
+ --accent-red: 0 93% 94%; /* red-100 #fee2e2 */
+ --accent-red-foreground: 0 72% 51%; /* red-600 #dc2626 */
+ --accent-indigo: 226 100% 94%; /* indigo-100 #e0e7ff */
+ --accent-indigo-foreground: 243 75% 59%; /* indigo-600 #4f46e5 */
+ --accent-pink: 326 78% 95%; /* pink-100 #fce7f3 */
+ --accent-pink-foreground: 333 71% 51%; /* pink-600 #db2777 */
+ --accent-purple: 269 100% 95%; /* purple-100 #f3e8ff */
+ --accent-purple-foreground: 271 81% 56%; /* purple-600 #7c3aed */
+
+ --destructive: 0 72% 51%; /* red-600 #dc2626 */
+ --destructive-foreground: 0 0% 100%;
+ --warning: 26 90% 37%; /* amber-700 #b45309 */
+ --warning-foreground: 0 0% 100%;
/* Component Colors */
--component-icon: #d8598a;
@@ -71,27 +72,28 @@
--muted-foreground: 240 5% 65%;
--accent: 240 4% 16%;
--accent-foreground: 0 0% 100%;
- --destructive: 0 84% 60%;
- --destructive-foreground: 0 0% 100%;
- --warning: 22, 78%, 26%;
- --warning-foreground: 46, 97%, 65%;
--border: 240 3.7% 15.9%;
--input: 240 5% 34%;
--ring: 0 0% 100%;
--placeholder-foreground: 240 4% 46%;
- --accent-amber: 22, 78%, 26%; /* amber-900 #78350f */
- --accent-amber-foreground: 46, 97%, 65%; /* amber-300 #fcd34d */
- --accent-emerald: 164, 86%, 16%; /* emerald-900 #064e3b */
- --accent-emerald-foreground: 158, 64%, 52%; /* emerald-400 #34d399 */
- --accent-red: 0, 63%, 31%; /* red-900 #7f1d1d */
- --accent-red-foreground: 0, 91%, 71%; /* red-400 #f87171 */
- --accent-indigo: 242, 47%, 34%; /* indigo-900 #312e81 */
- --accent-indigo-foreground: 234, 89%, 74%; /* indigo-400 #818cf8 */
- --accent-pink: 336, 69%, 30%; /* pink-900 #831843 */
- --accent-pink-foreground: 329, 86%, 70%; /* pink-400 #f472b6 */
- --accent-purple: 274, 66%, 32%; /* purple-900 #4c1d95 */
- --accent-purple-foreground: 270, 95%, 75%; /* purple-400 #a78bfa */
+ --accent-amber: 22 78% 26%; /* amber-900 #78350f */
+ --accent-amber-foreground: 46 97% 65%; /* amber-300 #fcd34d */
+ --accent-emerald: 164 86% 16%; /* emerald-900 #064e3b */
+ --accent-emerald-foreground: 158 64% 52%; /* emerald-400 #34d399 */
+ --accent-red: 0 63% 31%; /* red-900 #7f1d1d */
+ --accent-red-foreground: 0 91% 71%; /* red-400 #f87171 */
+ --accent-indigo: 242 47% 34%; /* indigo-900 #312e81 */
+ --accent-indigo-foreground: 234 89% 74%; /* indigo-400 #818cf8 */
+ --accent-pink: 336 69% 30%; /* pink-900 #831843 */
+ --accent-pink-foreground: 329 86% 70%; /* pink-400 #f472b6 */
+ --accent-purple: 274 66% 32%; /* purple-900 #4c1d95 */
+ --accent-purple-foreground: 270 95% 75%; /* purple-400 #a78bfa */
+
+ --destructive: 0 84% 60%; /* red-500 #ef4444 */
+ --destructive-foreground: 0 0% 100%;
+ --warning: 46 97% 65%; /* amber-300 #fcd34d */
+ --warning-foreground: 0 0% 0%;
}
* {
diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts
index d2dca200..a65cef05 100644
--- a/frontend/tailwind.config.ts
+++ b/frontend/tailwind.config.ts
@@ -4,7 +4,6 @@ import tailwindcssTypography from "@tailwindcss/typography";
import { fontFamily } from "tailwindcss/defaultTheme";
import plugin from "tailwindcss/plugin";
import tailwindcssAnimate from "tailwindcss-animate";
-import tailwindcssLineClamp from "@tailwindcss/line-clamp";
const config = {
darkMode: ["class"],
@@ -167,7 +166,6 @@ const config = {
},
plugins: [
tailwindcssAnimate,
- tailwindcssLineClamp,
tailwindcssForms({
strategy: "class",
}),