diff --git a/frontend/bun.lockb b/frontend/bun.lockb
index 1e717ae..a7b9bef 100755
Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ
diff --git a/frontend/package.json b/frontend/package.json
index 4655721..6a371b4 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -25,28 +25,27 @@
"@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-toggle": "^1.1.0",
"@radix-ui/react-toggle-group": "^1.1.0",
- "@tanstack/react-query": "^5.50.1",
- "@tanstack/react-router": "^1.43.12",
- "@tanstack/react-table": "^8.19.2",
+ "@tanstack/react-query": "^5.51.1",
+ "@tanstack/react-router": "^1.45.0",
+ "@tanstack/react-table": "^8.19.3",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"ky": "^1.4.0",
- "lucide-react": "^0.400.0",
- "primereact": "^10.7.0",
+ "lucide-react": "^0.408.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.52.1",
"sonner": "^1.5.0",
- "tailwind-merge": "^2.3.0",
+ "tailwind-merge": "^2.4.0",
"tailwindcss-animate": "^1.0.7",
"zod": "^3.23.8",
"zustand": "^4.5.4"
},
"devDependencies": {
"@biomejs/biome": "1.8.3",
- "@tanstack/react-query-devtools": "^5.50.1",
- "@tanstack/router-devtools": "^1.43.12",
- "@tanstack/router-plugin": "^1.43.12",
+ "@tanstack/react-query-devtools": "^5.51.1",
+ "@tanstack/router-devtools": "^1.45.1",
+ "@tanstack/router-plugin": "^1.45.0",
"@types/node": "^20.14.10",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
@@ -55,7 +54,7 @@
"postcss": "^8.4.39",
"tailwindcss": "^3.4.4",
"typescript": "^5.5.3",
- "vite": "^5.3.1"
+ "vite": "^5.3.3"
},
"prettier": "@it-incubator/prettier-config"
}
diff --git a/frontend/src/components/db-table-view/data-table-prime.tsx b/frontend/src/components/db-table-view/data-table-prime.tsx
deleted file mode 100644
index 8ffb3eb..0000000
--- a/frontend/src/components/db-table-view/data-table-prime.tsx
+++ /dev/null
@@ -1,210 +0,0 @@
-import { cn, isImageUrl, isUrl } from "@/lib/utils";
-import { useTableColumnsQuery, useTableDataQuery } from "@/services/db";
-import { useSettingsStore } from "@/state";
-import { Rows3 } from "lucide-react";
-import { Column } from "primereact/column";
-import { DataTable, type SortOrder } from "primereact/datatable";
-import {
- MultiSelect,
- type MultiSelectChangeEvent,
-} from "primereact/multiselect";
-import { useEffect, useState } from "react";
-
-const headerTemplate = ({
- columnName,
- udt_name,
-}: { udt_name: string; columnName: string }) => (
-
) => {
- const value = item[columnName] as any;
-
- let finalValue = value;
- if (
- formatDates &&
- ["timestamp", "datetime"].includes(udt_name.toLowerCase())
- ) {
- finalValue = new Date(value as string).toLocaleString();
- }
- if (showImagesPreview && typeof value === "string" && isUrl(value)) {
- const isImage = isImageUrl(value);
- return (
-
-
- {value}
- {isImage && (
-

- )}
-
-
- );
- }
- return (
-
- {finalValue}
-
- );
- };
-
-export const DataTablePrime = ({
- tableName,
- dbName,
- offset,
- pageSize,
- onPageSizeChange,
- onPageIndexChange,
-}: {
- tableName: string;
- offset: number;
- dbName: string;
- pageSize: number;
- onPageIndexChange: (pageIndex: number) => void;
- onPageSizeChange: (pageSize: number) => void;
-}) => {
- const formatDates = useSettingsStore.use.formatDates();
- const showImagesPreview = useSettingsStore.use.showImagesPreview();
- const paginationOptions = useSettingsStore.use.paginationOptions();
- const [sorting, setSorting] = useState<
- | {
- sortField?: string;
- sortOrder?: SortOrder;
- }
- | undefined
- >(undefined);
- const { data: columns } = useTableColumnsQuery({ dbName, tableName });
- const [visibleColumns, setVisibleColumns] = useState(columns);
-
- useEffect(() => {
- setVisibleColumns(columns);
- }, [columns]);
-
- const onColumnToggle = (event: MultiSelectChangeEvent) => {
- const selectedColumns = event.value;
- console.log(selectedColumns);
- const orderedSelectedColumns = columns?.filter((col) =>
- selectedColumns.some((sCol: any) => sCol.column_name === col.column_name),
- );
-
- setVisibleColumns(orderedSelectedColumns);
- };
-
- const header = (
-
- );
-
- const { data, isFetching } = useTableDataQuery({
- tableName,
- dbName,
- perPage: pageSize,
- page: Math.floor(offset / pageSize),
- sortDesc: sorting?.sortOrder === -1,
- sortField: sorting?.sortField,
- });
-
- return (
-
-
-
- {tableName}
-
-
- Rows: {data?.count}
-
-
-
- {
- if (e.rows !== pageSize) {
- onPageSizeChange(e.rows);
- } else if (e.first !== offset) {
- onPageIndexChange(e.first);
- }
- }}
- onSort={setSorting}
- sortField={sorting?.sortField}
- sortOrder={sorting?.sortOrder}
- paginator
- totalRecords={data?.count}
- rowsPerPageOptions={paginationOptions}
- stripedRows
- columnResizeMode="expand"
- resizableColumns
- showGridlines
- size="small"
- value={data?.data}
- tableStyle={{ minWidth: "100%" }}
- scrollable
- scrollHeight="flex"
- loading={isFetching}
- removableSort
- stateStorage="local"
- stateKey={`dt-state-${dbName}-${tableName}`}
- >
- {visibleColumns?.map((col) => (
-
- ))}
-
-
-
- );
-};
diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx
index ddc81f6..0df4cb6 100644
--- a/frontend/src/main.tsx
+++ b/frontend/src/main.tsx
@@ -1,10 +1,6 @@
import { RouterProvider, createRouter } from "@tanstack/react-router";
import { StrictMode } from "react";
import ReactDOM from "react-dom/client";
-
-import { PrimeReactProvider } from "primereact/api";
-import Tailwind from "primereact/passthrough/tailwind";
-import { twMerge } from "tailwind-merge";
import "@fontsource/inter/300.css";
import "@fontsource/inter/400.css";
import "@fontsource/inter/500.css";
@@ -13,8 +9,6 @@ import "@fontsource/inter/700.css";
import "@fontsource/inter/800.css";
import "./index.css";
import { Toaster } from "@/components/ui";
-import { datatable } from "@/styles/datatable";
-import { multiselect } from "@/styles/multiselect";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
// Import the generated route tree
@@ -37,12 +31,6 @@ const queryClient = new QueryClient({
},
});
-const PrimeStyles = {
- ...Tailwind,
- datatable,
- multiselect,
-};
-
// Render the app
const rootElement = document.getElementById("root");
if (rootElement && !rootElement.innerHTML) {
@@ -54,20 +42,8 @@ if (rootElement && !rootElement.innerHTML) {
initialIsOpen={false}
buttonPosition={"bottom-left"}
/>
-
-
-
-
+
+
,
);
diff --git a/frontend/src/routes/db/$dbName/tables/$tableName/data.tsx b/frontend/src/routes/db/$dbName/tables/$tableName/data.tsx
index e3a72d8..a46f1e7 100644
--- a/frontend/src/routes/db/$dbName/tables/$tableName/data.tsx
+++ b/frontend/src/routes/db/$dbName/tables/$tableName/data.tsx
@@ -1,5 +1,4 @@
import { DataTable } from "@/components/db-table-view/data-table";
-import { DataTablePrime } from "@/components/db-table-view/data-table-prime";
import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { z } from "zod";
@@ -32,12 +31,12 @@ function TableView() {
return (
-
diff --git a/frontend/src/styles/datatable.tsx b/frontend/src/styles/datatable.tsx
deleted file mode 100644
index 397ecaf..0000000
--- a/frontend/src/styles/datatable.tsx
+++ /dev/null
@@ -1,379 +0,0 @@
-import { cn } from "@/lib/utils";
-import type { DataTablePassThroughOptions } from "primereact/datatable";
-
-const TRANSITIONS = {
- overlay: {
- timeout: 150,
- classNames: {
- enter: "opacity-0 scale-75",
- enterActive:
- "opacity-100 !scale-100 transition-transform transition-opacity duration-150 ease-in",
- exit: "opacity-100",
- exitActive: "!opacity-0 transition-opacity duration-150 ease-linear",
- },
- },
-};
-
-export const datatable: DataTablePassThroughOptions = {
- root: ({ props }) => ({
- className: cn("relative", {
- "flex flex-col h-full": props.scrollable && props.scrollHeight === "flex",
- }),
- }),
- loadingoverlay: {
- className: cn(
- "fixed w-full h-full t-0 l-0 bg-gray-100/40",
- "transition duration-200",
- "absolute flex items-center justify-center z-10",
- "dark:bg-gray-950/40", // Dark Mode
- ),
- },
- loadingicon: "w-8 h-8",
- wrapper: ({ props }) => ({
- className: cn({
- relative: props.scrollable,
- "flex flex-col grow h-full":
- props.scrollable && props.scrollHeight === "flex",
- }),
- }),
- header: ({ props }) => ({
- className: cn(
- "font-bold p-4",
- "dark:border-blue-900/40 dark:text-white/80 dark:bg-gray-900", // Dark Mode
- props.showGridlines
- ? "border-x border-t border-b-0"
- : "border-y border-x-0",
- ),
- }),
- table: "w-full border-spacing-0 text-sm",
- thead: ({ context }) => ({
- className: cn({
- "top-0 z-[1]": context.scrollable,
- }),
- }),
- tbody: ({ props, context }) => ({
- className: cn({
- "sticky z-[1]": props.frozenRow && context.scrollable,
- }),
- }),
- tfoot: ({ context }) => ({
- className: cn({
- "bg-slate-50 bottom-0 z-[1]": context.scrollable,
- }),
- }),
- footer: {
- className: cn(
- "bg-slate-50 text-slate-700 border-t-0 border-b border-x-0 border-gray-300 font-bold p-4",
- "dark:border-blue-900/40 dark:text-white/80 dark:bg-gray-900", // Dark Mode
- ),
- },
- column: {
- headercell: ({ context, props }) => ({
- className: cn(
- "text-left border-0 border-b border-solid font-bold",
- "transition duration-200",
- context?.size === "small"
- ? "p-2"
- : context?.size === "large"
- ? "p-5"
- : "p-4", // Size
- context.sorted
- ? "bg-blue-50 text-blue-700"
- : "bg-muted/50 text-slate-700", // Sort
- context.sorted
- ? "dark:text-white/80 dark:bg-blue-300"
- : "dark:text-white/80 dark:bg-gray-900", // Dark Mode
- {
- "sticky z-[1]": props.frozen || props.frozen === "", // Frozen Columns
- "border-x border-y": context?.showGridlines,
- "overflow-hidden space-nowrap border-y relative bg-clip-padding":
- context.resizable, // Resizable
- },
- ),
- }),
- headercontent: "flex items-center font-medium text-muted-foreground",
- bodycell: ({ props, context }) => ({
- className: cn(
- "text-left border-0 border-b border-solid border-gray-300",
- context?.size === "small"
- ? "p-2"
- : context?.size === "large"
- ? "p-5"
- : "p-4", // Size
- "dark:text-white/80 dark:border-blue-900/40", // Dark Mode
- {
- "sticky bg-inherit": props && (props.frozen || props.frozen === ""), // Frozen Columns
- "border-x border-y": context.showGridlines,
- },
- ),
- }),
- footercell: ({ context }) => ({
- className: cn(
- "text-left border-0 border-b border-solid border-gray-300 font-bold",
- "bg-slate-50 text-slate-700",
- "transition duration-200",
- context?.size === "small"
- ? "p-2"
- : context?.size === "large"
- ? "p-5"
- : "p-4", // Size
- "dark:text-white/80 dark:bg-gray-900 dark:border-blue-900/40", // Dark Mode
- {
- "border-x border-y": context.showGridlines,
- },
- ),
- }),
- sorticon: ({ context }) => ({
- className: cn(
- "ml-2",
- context.sorted
- ? "text-blue-700 dark:text-white/80"
- : "text-slate-700 dark:text-white/70",
- ),
- }),
- sortbadge: {
- className: cn(
- "flex items-center justify-center align-middle",
- "rounded-[50%] w-[1.143rem] leading-[1.143rem] ml-2",
- "text-blue-700 bg-blue-50",
- "dark:text-white/80 dark:bg-blue-400", // Dark Mode
- ),
- },
- columnfilter: "inline-flex items-center ml-auto",
- filteroverlay: {
- className: cn(
- "bg-white text-gray-600 border-0 rounded-md min-w-[12.5rem]",
- "dark:bg-gray-900 dark:border-blue-900/40 dark:text-white/80", //Dark Mode
- ),
- },
- filtermatchmodedropdown: {
- root: "min-[0px]:flex mb-2",
- },
- filterrowitems: "m-0 p-0 py-3 list-none ",
- filterrowitem: ({ context }) => ({
- className: cn(
- "m-0 py-3 px-5 bg-transparent",
- "transition duration-200",
- context?.highlighted
- ? "text-blue-700 bg-blue-100 dark:text-white/80 dark:bg-blue-300"
- : "text-gray-600 bg-transparent dark:text-white/80 dark:bg-transparent",
- ),
- }),
- filteroperator: {
- className: cn(
- "px-5 py-3 border-b border-solid border-gray-300 text-slate-700 bg-slate-50 rounded-t-md",
- "dark:border-blue-900/40 dark:text-white/80 dark:bg-gray-900", // Dark Mode
- ),
- },
- filteroperatordropdown: {
- root: "min-[0px]:flex",
- },
- filterconstraint:
- "p-5 border-b border-solid border-gray-300 dark:border-blue-900/40",
- filteraddrule: "py-3 px-5",
- filteraddrulebutton: {
- root: "justify-center w-full min-[0px]:text-sm",
- label: "flex-auto grow-0",
- icon: "mr-2",
- },
- filterremovebutton: {
- root: "ml-2",
- label: "grow-0",
- },
- filterbuttonbar: "flex items-center justify-between p-5",
- filterclearbutton: {
- root: "w-auto min-[0px]:text-sm border-blue-500 text-blue-500 px-4 py-3",
- },
- filterapplybutton: {
- root: "w-auto min-[0px]:text-sm px-4 py-3",
- },
- filtermenubutton: ({ context }) => ({
- className: cn(
- "inline-flex justify-center items-center cursor-pointer no-underline overflow-hidden relative ml-2",
- "w-8 h-8 rounded-[50%]",
- "transition duration-200",
- "hover:text-slate-700 hover:bg-gray-300/20", // Hover
- "focus:outline-0 focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)]", // Focus
- "dark:text-white/70 dark:hover:text-white/80 dark:bg-gray-900", // Dark Mode
- {
- "bg-blue-50 text-blue-700": context.active,
- },
- ),
- }),
- headerfilterclearbutton: ({ context }) => ({
- className: cn(
- "inline-flex justify-center items-center cursor-pointer no-underline overflow-hidden relative",
- "text-left bg-transparent m-0 p-0 border-none select-none ml-2",
- {
- invisible: !context.hidden,
- },
- ),
- }),
- columnresizer:
- "block absolute top-0 right-0 m-0 w-2 h-full p-0 cursor-col-resize border border-transparent",
- rowreordericon: "cursor-move",
- roweditorinitbutton: {
- className: cn(
- "inline-flex items-center justify-center overflow-hidden relative",
- "text-left cursor-pointer select-none",
- "w-8 h-8 border-0 rounded-[50%]",
- "transition duration-200",
- "text-slate-700 border-transparent",
- "focus:outline-0 focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)]", //Focus
- "hover:text-slate-700 hover:bg-gray-300/20", //Hover
- "dark:text-white/70", // Dark Mode
- ),
- },
- roweditorsavebutton: {
- className: cn(
- "inline-flex items-center justify-center overflow-hidden relative",
- "text-left cursor-pointer select-none",
- "w-8 h-8 border-0 rounded-[50%]",
- "transition duration-200",
- "text-slate-700 border-transparent",
- "focus:outline-0 focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)]", //Focus
- "hover:text-slate-700 hover:bg-gray-300/20", //Hover
- "dark:text-white/70", // Dark Mode
- ),
- },
- roweditorcancelbutton: {
- className: cn(
- "inline-flex items-center justify-center overflow-hidden relative",
- "text-left cursor-pointer select-none",
- "w-8 h-8 border-0 rounded-[50%]",
- "transition duration-200",
- "text-slate-700 border-transparent",
- "focus:outline-0 focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)]", //Focus
- "hover:text-slate-700 hover:bg-gray-300/20", //Hover
- "dark:text-white/70", // Dark Mode
- ),
- },
- radioButton: {
- className: cn(
- "relative inline-flex cursor-pointer select-none align-bottom",
- "w-6 h-6",
- ),
- },
- radioButtonInput: {
- className: cn(
- "w-full h-full top-0 left-0 absolute appearance-none select-none",
- "p-0 m-0 opacity-0 z-[1] rounded-[50%] outline-none",
- "cursor-pointer peer",
- ),
- },
- radioButtonBox: ({ context }) => ({
- className: cn(
- "flex items-center justify-center",
- "h-6 w-6 rounded-full border-2 text-gray-700 transition duration-200 ease-in-out",
- context.checked
- ? "border-blue-500 bg-blue-500 dark:border-blue-400 dark:bg-blue-400 peer-hover:bg-blue-700 peer-hover:border-blue-700"
- : "border-gray-300 bg-white dark:border-blue-900/40 dark:bg-gray-900 peer-hover:border-blue-500",
- {
- "hover:border-blue-500 focus:shadow-input-focus focus:outline-none focus:outline-offset-0 dark:hover:border-blue-400 dark:focus:shadow-[inset_0_0_0_0.2rem_rgba(147,197,253,0.5)]":
- !context.disabled,
- "cursor-default opacity-60": context.disabled,
- },
- ),
- }),
- radioButtonIcon: ({ context }) => ({
- className: cn(
- "transform rounded-full",
- "block h-3 w-3 bg-white transition duration-200 dark:bg-gray-900",
- {
- "backface-hidden scale-10 invisible": context.checked === false,
- "visible scale-100 transform": context.checked === true,
- },
- ),
- }),
- headercheckboxwrapper: {
- className: cn(
- "cursor-pointer inline-flex relative select-none align-bottom",
- "w-6 h-6",
- ),
- },
- headercheckbox: ({ context }) => ({
- className: cn(
- "flex items-center justify-center",
- "border-2 w-6 h-6 text-gray-600 rounded-lg transition-colors duration-200",
- context.checked
- ? "border-blue-500 bg-blue-500 dark:border-blue-400 dark:bg-blue-400"
- : "border-gray-300 bg-white dark:border-blue-900/40 dark:bg-gray-900",
- {
- "hover:border-blue-500 dark:hover:border-blue-400 focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[inset_0_0_0_0.2rem_rgba(147,197,253,0.5)]":
- !context.disabled,
- "cursor-default opacity-60": context.disabled,
- },
- ),
- }),
- headercheckboxicon:
- "w-4 h-4 transition-all duration-200 text-white text-base dark:text-gray-900",
- checkboxwrapper: {
- className: cn(
- "cursor-pointer inline-flex relative select-none align-bottom",
- "w-6 h-6",
- ),
- },
- checkbox: ({ context }) => ({
- className: cn(
- "flex items-center justify-center",
- "border-2 w-6 h-6 text-gray-600 rounded-lg transition-colors duration-200",
- context.checked
- ? "border-blue-500 bg-blue-500 dark:border-blue-400 dark:bg-blue-400"
- : "border-gray-300 bg-white dark:border-blue-900/40 dark:bg-gray-900",
- {
- "hover:border-blue-500 dark:hover:border-blue-400 focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[inset_0_0_0_0.2rem_rgba(147,197,253,0.5)]":
- !context.disabled,
- "cursor-default opacity-60": context.disabled,
- },
- ),
- }),
- checkboxicon:
- "w-4 h-4 transition-all duration-200 text-white text-base dark:text-gray-900",
- transition: TRANSITIONS.overlay,
- },
- bodyrow: ({ context }) => ({
- className: cn(
- context.selected
- ? "bg-blue-50 text-blue-700 dark:bg-blue-300"
- : "bg-white text-foreground dark:bg-gray-900",
- context.stripedRows &&
- (context.index % 2 === 0
- ? "bg-white text-foreground dark:bg-gray-900"
- : "bg-muted/50 text-foreground dark:bg-gray-950"),
- "transition duration-200",
- "focus:outline focus:outline-[0.15rem] focus:outline-blue-200 focus:outline-offset-[-0.15rem]", // Focus
- "dark:text-white/80 dark:focus:outline dark:focus:outline-[0.15rem] dark:focus:outline-blue-300 dark:focus:outline-offset-[-0.15rem]", // Dark Mode
- {
- "cursor-pointer": context.selectable,
- "hover:bg-gray-300/20 hover:text-gray-600":
- context.selectable && !context.selected, // Hover
- },
- ),
- }),
- rowexpansion: "bg-white text-gray-600 dark:bg-gray-900 dark:text-white/80",
- rowgroupheader: {
- className: cn(
- "sticky z-[1]",
- "bg-white text-gray-600",
- "transition duration-200",
- ),
- },
- rowgroupfooter: {
- className: cn(
- "sticky z-[1]",
- "bg-white text-gray-600",
- "transition duration-200",
- ),
- },
- rowgrouptoggler: {
- className: cn(
- "text-left m-0 p-0 cursor-pointer select-none",
- "inline-flex items-center justify-center overflow-hidden relative",
- "w-8 h-8 text-gray-500 border-0 bg-transparent rounded-[50%]",
- "transition duration-200",
- "dark:text-white/70", // Dark Mode
- ),
- },
- rowgrouptogglericon: "inline-block w-4 h-4",
- resizehelper: "absolute hidden w-px z-10 bg-blue-500 dark:bg-blue-300",
-};
diff --git a/frontend/src/styles/multiselect.ts b/frontend/src/styles/multiselect.ts
deleted file mode 100644
index f9c38c8..0000000
--- a/frontend/src/styles/multiselect.ts
+++ /dev/null
@@ -1,165 +0,0 @@
-import { cn } from "@/lib/utils";
-import type { MultiSelectPassThroughOptions } from "primereact/multiselect";
-
-const TRANSITIONS = {
- overlay: {
- timeout: 150,
- classNames: {
- enter: "opacity-0 scale-75",
- enterActive:
- "opacity-100 !scale-100 transition-transform transition-opacity duration-150 ease-in",
- exit: "opacity-100",
- exitActive: "!opacity-0 transition-opacity duration-150 ease-linear",
- },
- },
-};
-
-export const multiselect: MultiSelectPassThroughOptions = {
- root: ({ props }) => ({
- className: cn(
- "inline-flex cursor-pointer select-none",
- "bg-white dark:bg-gray-900 border border-gray-400 dark:border-blue-900/40 transition-colors duration-200 ease-in-out rounded-md",
- "w-full md:w-80",
- {
- "opacity-60 select-none pointer-events-none cursor-default":
- props.disabled,
- },
- ),
- }),
- labelContainer: "overflow-hidden flex flex-auto cursor-pointer",
- label: ({ props }) => ({
- className: cn(
- "block overflow-hidden whitespace-nowrap cursor-pointer overflow-ellipsis",
- "text-gray-800 dark:text-white/80",
- "p-3 transition duration-200",
- {
- "!p-3":
- props.display !== "chip" &&
- (props.value == null || props.value === undefined),
- "!py-1.5 px-3": props.display === "chip" && props.value !== null,
- },
- ),
- }),
- token: {
- className: cn(
- "py-1 px-2 mr-2 bg-gray-300 dark:bg-gray-700 text-gray-700 dark:text-white/80 rounded-full",
- "cursor-default inline-flex items-center",
- ),
- },
- removeTokenIcon: "ml-2",
- trigger: {
- className: cn(
- "flex items-center justify-center shrink-0",
- "bg-transparent text-gray-600 dark:text-white/70 w-12 rounded-tr-lg rounded-br-lg",
- ),
- },
- panel: {
- className: cn(
- "bg-white dark:bg-gray-900 text-gray-700 dark:text-white/80 border-0 rounded-md shadow-lg",
- ),
- },
- header: {
- className: cn(
- "p-3 border-b border-gray-300 dark:border-blue-900/40 text-gray-700 dark:text-white/80 bg-gray-100 dark:bg-gray-800 rounded-t-lg",
- "flex items-center justify-between",
- ),
- },
- headerCheckboxContainer: {
- className: cn(
- "inline-flex cursor-pointer select-none align-bottom relative",
- "mr-2",
- "w-6 h-6",
- ),
- },
- headerCheckbox: {
- root: ({ props }) => ({
- className: cn(
- "asdfasdf flex items-center justify-center [&>div]:shrink-0",
- "border-2 w-6 h-6 text-gray-600 dark:text-white/70 rounded-lg transition-colors duration-200",
- "hover:border-blue-500 focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[0_0_0_0.2rem_rgba(147,197,253,0.5)]",
- {
- "border-gray-300 dark:border-blue-900/40 bg-white dark:bg-gray-900":
- !props?.checked,
- "border-blue-500 bg-blue-500": props?.checked,
- },
- ),
- }),
- },
- headerCheckboxIcon:
- "w-4 h-4 transition-all duration-200 text-white text-base",
- closeButton: {
- className: cn(
- "flex items-center justify-center overflow-hidden relative",
- "w-8 h-8 text-gray-500 dark:text-white/70 border-0 bg-transparent rounded-full transition duration-200 ease-in-out mr-2 last:mr-0",
- "hover:text-gray-700 dark:hover:text-white/80 hover:border-transparent hover:bg-gray-200 dark:hover:bg-gray-800/80 ",
- "focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[0_0_0_0.2rem_rgba(147,197,253,0.5)]",
- ),
- },
- closeIcon: "w-4 h-4 inline-block",
- wrapper: {
- className: cn(
- "max-h-[200px] overflow-auto",
- "bg-white text-gray-700 border-0 rounded-md shadow-lg",
- "dark:bg-gray-900 dark:text-white/80",
- ),
- },
- list: "py-3 list-none m-0",
- item: ({ context }) => ({
- className: cn(
- "cursor-pointer font-normal overflow-hidden relative whitespace-nowrap",
- "m-0 p-3 border-0 transition-shadow duration-200 rounded-none",
- {
- "text-gray-700 hover:text-gray-700 hover:bg-gray-200 dark:text-white/80 dark:hover:bg-gray-800":
- !context?.focused && !context?.selected,
- "bg-gray-300 text-gray-700 dark:text-white/80 dark:bg-gray-800/90 hover:text-gray-700 hover:bg-gray-200 dark:text-white/80 dark:hover:bg-gray-800":
- context?.focused && !context?.selected,
- "bg-blue-100 text-blue-700 dark:bg-blue-400 dark:text-white/80":
- context?.focused && context?.selected,
- "bg-blue-50 text-blue-700 dark:bg-blue-300 dark:text-white/80":
- !context?.focused && context?.selected,
- },
- ),
- }),
- checkboxContainer: {
- className: cn(
- "inline-flex cursor-pointer select-none align-bottom relative",
- "mr-2",
- "w-6 h-6",
- ),
- },
- checkbox: ({ context }) => ({
- className: cn(
- "flex items-center justify-center shrink-0",
- "border-2 w-6 h-6 text-gray-600 dark:text-white/80 rounded-lg transition-colors duration-200",
- "hover:border-blue-500 focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[0_0_0_0.2rem_rgba(147,197,253,0.5)]",
- {
- "border-gray-300 dark:border-blue-900/40 bg-white dark:bg-gray-900":
- !context?.selected,
- "border-blue-500 bg-blue-500": context?.selected,
- },
- ),
- }),
- checkboxIcon: "w-4 h-4 transition-all duration-200 text-white text-base",
- itemGroup: {
- className: cn(
- "m-0 p-3 text-gray-800 bg-white font-bold",
- "dark:bg-gray-900 dark:text-white/80",
- "cursor-auto",
- ),
- },
- filterContainer: "relative",
- filterInput: {
- root: {
- className: cn(
- "pr-7 -mr-7",
- "w-full",
- "font-sans text-base text-gray-700 bg-white py-3 px-3 pr-6 border border-gray-300 transition duration-200 rounded-lg appearance-none",
- "dark:bg-gray-900 dark:border-blue-900/40 dark:hover:border-blue-300 dark:text-white/80",
- "hover:border-blue-500 focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[0_0_0_0.2rem_rgba(147,197,253,0.5)]",
- ),
- },
- },
- filterIcon: "-mt-2 absolute top-1/2 right-2",
- clearIcon: "text-gray-500 right-12 -mt-2 absolute top-1/2",
- transition: TRANSITIONS.overlay,
-};
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js
index 59afa9f..a6dbb40 100644
--- a/frontend/tailwind.config.js
+++ b/frontend/tailwind.config.js
@@ -7,7 +7,6 @@ module.exports = {
"./components/**/*.{ts,tsx}",
"./app/**/*.{ts,tsx}",
"./src/**/*.{ts,tsx}",
- "./node_modules/primereact/**/*.{js,ts,jsx,tsx}",
],
prefix: "",
theme: {