;
+
+export const Default: Story = {};
+
+export const WithCloseButton: Story = {
+ args: {
+ onClose: () => {
+ console.warn("close");
+ },
+ },
+};
diff --git a/frontend/packages/ui/src/lib/product/PanelTitle.tsx b/frontend/packages/ui/src/lib/product/PanelTitle.tsx
new file mode 100644
index 0000000000..c3fa9910af
--- /dev/null
+++ b/frontend/packages/ui/src/lib/product/PanelTitle.tsx
@@ -0,0 +1,40 @@
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+// Copyright (c) KALEIDOS INC
+
+import { type ComponentPropsWithRef, memo } from "react";
+import clsx from "clsx";
+import { IconButton } from "../buttons/IconButton";
+import styles from "./PanelTitle.module.scss";
+
+export interface PanelTitleProps extends ComponentPropsWithRef<"div"> {
+ /** Title text displayed in the panel header */
+ text: string;
+ /** When provided, renders a close (×) button that calls this handler */
+ onClose?: () => void;
+}
+
+function PanelTitleInner({
+ text,
+ onClose,
+ className,
+ ...rest
+}: PanelTitleProps) {
+ return (
+
+ {text}
+ {onClose != null && (
+
+ )}
+
+ );
+}
+
+export const PanelTitle = memo(PanelTitleInner);