diff --git a/src/shared/components/InfoTooltip.tsx b/src/shared/components/InfoTooltip.tsx
new file mode 100644
index 0000000000..9f62de5b16
--- /dev/null
+++ b/src/shared/components/InfoTooltip.tsx
@@ -0,0 +1,34 @@
+"use client";
+
+import { cn } from "@/shared/utils/cn";
+
+interface InfoTooltipProps {
+ text: string;
+ className?: string;
+}
+
+export default function InfoTooltip({ text, className }: InfoTooltipProps) {
+ return (
+
+
+ info
+
+
+ {text}
+
+
+ );
+}
diff --git a/src/shared/components/PresetSlider.tsx b/src/shared/components/PresetSlider.tsx
new file mode 100644
index 0000000000..17ffe35471
--- /dev/null
+++ b/src/shared/components/PresetSlider.tsx
@@ -0,0 +1,64 @@
+"use client";
+
+import { cn } from "@/shared/utils/cn";
+
+interface PresetSliderProps {
+ value: number;
+ onChange: (value: number) => void;
+ presets: { label: string; value: number }[];
+ min?: number;
+ max?: number;
+ step?: number;
+ className?: string;
+}
+
+export default function PresetSlider({
+ value,
+ onChange,
+ presets,
+ min = 0,
+ max = 100,
+ step = 1,
+ className,
+}: PresetSliderProps) {
+ return (
+
+
+ {presets.map((preset) => (
+
+ ))}
+
+
onChange(Number(e.target.value))}
+ className={cn(
+ "w-full h-1.5 rounded-full appearance-none cursor-pointer",
+ "bg-black/10 dark:bg-white/10",
+ "accent-primary"
+ )}
+ />
+
+ {min}
+ {value}
+ {max}
+
+
+ );
+}
diff --git a/src/shared/components/index.tsx b/src/shared/components/index.tsx
index 1039804883..e1a90df42a 100644
--- a/src/shared/components/index.tsx
+++ b/src/shared/components/index.tsx
@@ -33,6 +33,8 @@ export { default as NotificationToast } from "./NotificationToast";
export { default as FilterBar } from "./FilterBar";
export { default as ColumnToggle } from "./ColumnToggle";
export { default as DataTable } from "./DataTable";
+export { default as InfoTooltip } from "./InfoTooltip";
+export { default as PresetSlider } from "./PresetSlider";
// Layouts
export * from "./layouts";