mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-02-22 02:25:56 +08:00
📝 write doc messenger component
This commit is contained in:
parent
d13ca9aee6
commit
cd94672999
@ -11,13 +11,22 @@ import Messenger from "@site/src/components/Messenger";
|
|||||||
## 命令式问答示例
|
## 命令式问答示例
|
||||||
|
|
||||||
import WeatherSource from "!!raw-loader!../../../../tests/examples/weather.py";
|
import WeatherSource from "!!raw-loader!../../../../tests/examples/weather.py";
|
||||||
|
import WeatherTest from "!!raw-loader!../../../../tests/test_examples/test_weather.py";
|
||||||
|
|
||||||
<CodeBlock className="language-python">{WeatherSource}</CodeBlock>
|
<CodeBlock className="language-python">{WeatherSource}</CodeBlock>
|
||||||
|
|
||||||
<Messenger />
|
<Messenger
|
||||||
|
msgs={[
|
||||||
|
{ position: "right", msg: "/天气" },
|
||||||
|
{ position: "left", msg: "你想查询哪个城市的天气呢?" },
|
||||||
|
{ position: "right", msg: "上海" },
|
||||||
|
{ position: "left", msg: "上海的天气是..." },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
|
||||||
### 测试示例
|
<details>
|
||||||
|
<summary>测试示例</summary>
|
||||||
import WeatherTest from "!!raw-loader!../../../../tests/test_examples/test_weather.py";
|
|
||||||
|
|
||||||
<CodeBlock className="language-python">{WeatherTest}</CodeBlock>
|
<CodeBlock className="language-python">{WeatherTest}</CodeBlock>
|
||||||
|
|
||||||
|
</details>
|
||||||
|
@ -1,16 +1,58 @@
|
|||||||
|
import clsx from "clsx";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
import Logo from "@theme/Logo";
|
||||||
|
|
||||||
|
import styles from "./styles.module.css";
|
||||||
|
|
||||||
export type Message = {
|
export type Message = {
|
||||||
position?: "left" | "right";
|
position?: "left" | "right";
|
||||||
msg: string;
|
msg: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function Messenger() {
|
function MessageBox({
|
||||||
|
msg,
|
||||||
|
isRight,
|
||||||
|
}: {
|
||||||
|
msg: string;
|
||||||
|
isRight: boolean;
|
||||||
|
}): JSX.Element {
|
||||||
return (
|
return (
|
||||||
<div className="block w-full max-w-full rounded shadow-md outline-none no-underline bg-light-nonepress-100 dark:bg-dark-nonepress-100">
|
<div
|
||||||
<header className="flex items-center h-12 px-4 bg-blue-500 text-white">
|
className={clsx(styles.message, {
|
||||||
|
[styles.messageRight]: isRight,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
{isRight ? (
|
||||||
|
<div className={clsx("bg-cyan-600 text-base", styles.messageAvatar)}>
|
||||||
|
<FontAwesomeIcon icon={["fas", "user"]} />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div className={clsx("transparent", styles.messageAvatar)}>
|
||||||
|
<Logo imageClassName="h-full w-full" disabled />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div
|
||||||
|
className={clsx(styles.messageBox, { "order-first": isRight })}
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: msg.replace(/\n/g, "<br/>").replace(/ /g, " "),
|
||||||
|
}}
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Messenger({
|
||||||
|
msgs = [],
|
||||||
|
}: {
|
||||||
|
msgs?: Message[];
|
||||||
|
}): JSX.Element {
|
||||||
|
const isRight = (msg: Message): boolean => msg.position === "right";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="block w-full max-w-full my-4 rounded shadow-md outline-none no-underline bg-light-nonepress-100 dark:bg-dark-nonepress-100">
|
||||||
|
<header className="flex items-center h-12 px-4 bg-blue-500 text-white rounded-t-[inherit]">
|
||||||
<div className="text-left text-base grow">
|
<div className="text-left text-base grow">
|
||||||
<FontAwesomeIcon icon={["fas", "chevron-left"]} />
|
<FontAwesomeIcon icon={["fas", "chevron-left"]} />
|
||||||
</div>
|
</div>
|
||||||
@ -21,6 +63,43 @@ export default function Messenger() {
|
|||||||
<FontAwesomeIcon icon={["fas", "user"]} />
|
<FontAwesomeIcon icon={["fas", "user"]} />
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
<div className="p-3 min-h-[150px]">
|
||||||
|
{msgs.map((msg, i) => (
|
||||||
|
<MessageBox msg={msg.msg} isRight={isRight(msg)} key={i} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="px-3">
|
||||||
|
<div className="flex flex-row items-center">
|
||||||
|
<div className="flex-1 p-1 max-w-full">
|
||||||
|
<input className="w-full rounded bg-light dark:bg-dark" />
|
||||||
|
</div>
|
||||||
|
<div className="flex-initial grow-0 w-fit">
|
||||||
|
<button className="h-7 px-3 rounded-full bg-blue-500 text-white">
|
||||||
|
<span>发送</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-row items-center text-center text-base text-gray-600">
|
||||||
|
<div className="p-1 shrink-0 grow-0 basis-1/6">
|
||||||
|
<FontAwesomeIcon icon={["fas", "microphone"]} />
|
||||||
|
</div>
|
||||||
|
<div className="p-1 shrink-0 grow-0 basis-1/6">
|
||||||
|
<FontAwesomeIcon icon={["fas", "image"]} />
|
||||||
|
</div>
|
||||||
|
<div className="p-1 shrink-0 grow-0 basis-1/6">
|
||||||
|
<FontAwesomeIcon icon={["fas", "camera"]} />
|
||||||
|
</div>
|
||||||
|
<div className="p-1 shrink-0 grow-0 basis-1/6">
|
||||||
|
<FontAwesomeIcon icon={["fas", "wallet"]} />
|
||||||
|
</div>
|
||||||
|
<div className="p-1 shrink-0 grow-0 basis-1/6">
|
||||||
|
<FontAwesomeIcon icon={["fas", "smile-wink"]} />
|
||||||
|
</div>
|
||||||
|
<div className="p-1 shrink-0 grow-0 basis-1/6">
|
||||||
|
<FontAwesomeIcon icon={["fas", "plus-circle"]} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
30
website/src/components/Messenger/styles.module.css
Normal file
30
website/src/components/Messenger/styles.module.css
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
.message {
|
||||||
|
@apply flex flex-row flex-wrap justify-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.messageRight {
|
||||||
|
@apply justify-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message .messageAvatar {
|
||||||
|
@apply relative inline-flex items-center justify-center text-center align-middle h-9 w-9 rounded-full;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message .messageBox {
|
||||||
|
@apply relative w-fit max-w-[55%] px-2 py-[0.375rem] mx-3 my-2 rounded-lg bg-light;
|
||||||
|
}
|
||||||
|
:global(.dark) .message .messageBox {
|
||||||
|
@apply bg-dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message .messageBox::after {
|
||||||
|
content: "";
|
||||||
|
border-bottom: 7px solid;
|
||||||
|
@apply absolute top-0 right-full w-2 h-3 text-light rounded-bl-lg;
|
||||||
|
}
|
||||||
|
:global(.dark) .message .messageBox::after {
|
||||||
|
@apply text-dark;
|
||||||
|
}
|
||||||
|
.message.messageRight .messageBox::after {
|
||||||
|
@apply !left-full !right-auto !rounded-bl-[0] !rounded-br-lg;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user