mirror of
https://github.com/arsvendg/Stirling-PDF.git
synced 2026-07-14 10:34:06 +02:00
146 lines
3.4 KiB
TypeScript
146 lines
3.4 KiB
TypeScript
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
import { useState } from "react";
|
|
import { ChatFABWindow } from "@shared/components/ChatFABWindow";
|
|
|
|
const DEMO_MESSAGES = [
|
|
{
|
|
id: 1,
|
|
role: "user" as const,
|
|
text: "Merge the three contracts and redact all SSNs",
|
|
},
|
|
{
|
|
id: 2,
|
|
role: "assistant" as const,
|
|
text: "I'll merge the PDFs first, then run redaction on the combined document. Starting now…",
|
|
},
|
|
{ id: 3, role: "user" as const, text: "Great, also add a watermark" },
|
|
];
|
|
|
|
function MockChat() {
|
|
return (
|
|
<div
|
|
style={{
|
|
display: "flex",
|
|
flexDirection: "column",
|
|
height: "100%",
|
|
fontFamily: "system-ui, sans-serif",
|
|
}}
|
|
>
|
|
<div
|
|
style={{
|
|
padding: "14px 16px 10px",
|
|
borderBottom: "1px solid var(--color-border, #e3e8ee)",
|
|
fontSize: 14,
|
|
fontWeight: 600,
|
|
}}
|
|
>
|
|
Stirling
|
|
</div>
|
|
<div
|
|
style={{
|
|
flex: 1,
|
|
overflowY: "auto",
|
|
padding: "12px 16px",
|
|
display: "flex",
|
|
flexDirection: "column",
|
|
gap: 10,
|
|
}}
|
|
>
|
|
{DEMO_MESSAGES.map((m) => (
|
|
<div
|
|
key={m.id}
|
|
style={{
|
|
alignSelf: m.role === "user" ? "flex-end" : "flex-start",
|
|
maxWidth: "80%",
|
|
background:
|
|
m.role === "user"
|
|
? "#3b82f6"
|
|
: "var(--color-bg-muted, #f3f4f6)",
|
|
color: m.role === "user" ? "#fff" : "inherit",
|
|
borderRadius: 10,
|
|
padding: "8px 12px",
|
|
fontSize: 13,
|
|
}}
|
|
>
|
|
{m.text}
|
|
</div>
|
|
))}
|
|
</div>
|
|
<div
|
|
style={{
|
|
padding: "10px 12px 14px",
|
|
borderTop: "1px solid var(--color-border, #e3e8ee)",
|
|
}}
|
|
>
|
|
<div
|
|
style={{
|
|
background: "var(--color-bg-muted, #f3f4f6)",
|
|
borderRadius: 10,
|
|
padding: "8px 12px",
|
|
fontSize: 13,
|
|
color: "var(--color-text-4, #64748b)",
|
|
}}
|
|
>
|
|
What do you want to do?
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const meta: Meta<typeof ChatFABWindow> = {
|
|
title: "Editor/ChatFAB/ChatFABWindow",
|
|
component: ChatFABWindow,
|
|
parameters: { layout: "centered" },
|
|
decorators: [
|
|
(S) => (
|
|
<div style={{ width: 390, height: 520 }}>
|
|
<S />
|
|
</div>
|
|
),
|
|
],
|
|
argTypes: {
|
|
open: { control: "boolean" },
|
|
},
|
|
};
|
|
export default meta;
|
|
type Story = StoryObj<typeof ChatFABWindow>;
|
|
|
|
export const Closed: Story = {
|
|
args: { open: false, children: <MockChat /> },
|
|
};
|
|
|
|
export const Open: Story = {
|
|
args: { open: true, children: <MockChat /> },
|
|
};
|
|
|
|
export const Toggle: Story = {
|
|
render: () => {
|
|
const [open, setOpen] = useState(false);
|
|
return (
|
|
<div style={{ width: 390, height: 520, position: "relative" }}>
|
|
<ChatFABWindow open={open}>
|
|
<MockChat />
|
|
</ChatFABWindow>
|
|
<button
|
|
type="button"
|
|
onClick={() => setOpen((v) => !v)}
|
|
style={{
|
|
position: "absolute",
|
|
bottom: -48,
|
|
right: 0,
|
|
background: "#3b82f6",
|
|
color: "#fff",
|
|
border: "none",
|
|
borderRadius: 8,
|
|
padding: "8px 16px",
|
|
cursor: "pointer",
|
|
}}
|
|
>
|
|
{open ? "Close panel" : "Open panel"}
|
|
</button>
|
|
</div>
|
|
);
|
|
},
|
|
};
|