= (
onClick={props.onClose}
class="text-gray-400 hover:text-gray-600 text-sm"
>
- ✕
+
diff --git a/src/components/journal/ErrorPopup.tsx b/src/components/journal/ErrorPopup.tsx
index 73c2558..81291dd 100644
--- a/src/components/journal/ErrorPopup.tsx
+++ b/src/components/journal/ErrorPopup.tsx
@@ -3,6 +3,7 @@
* the journal input area. Toggled by clicking the truncated error text.
*/
import { Component, Show } from "solid-js";
+import { TbOutlineX } from "solid-icons/tb";
interface ErrorPopupProps {
message: string | null;
@@ -21,7 +22,7 @@ export const ErrorPopup: Component = (props) => {
class="text-red-400 hover:text-red-600 text-xs leading-none ml-2 shrink-0"
title="关闭"
>
- ✕
+
diff --git a/src/components/journal/InviteDialog.tsx b/src/components/journal/InviteDialog.tsx
index 1d79427..49b0993 100644
--- a/src/components/journal/InviteDialog.tsx
+++ b/src/components/journal/InviteDialog.tsx
@@ -2,6 +2,7 @@
* InviteDialog — input player name, copy invite link
*/
import { Component, createSignal } from "solid-js";
+import { TbOutlineX } from "solid-icons/tb";
import { useJournalStream } from "../stores/journalStream";
interface InviteDialogProps {
@@ -51,7 +52,7 @@ export const InviteDialog: Component = (props) => {
onClick={props.onClose}
class="text-gray-400 hover:text-gray-600 text-sm"
>
- ✕
+
diff --git a/src/components/journal/JournalHeader.tsx b/src/components/journal/JournalHeader.tsx
index 7ec593f..ee2fb87 100644
--- a/src/components/journal/JournalHeader.tsx
+++ b/src/components/journal/JournalHeader.tsx
@@ -2,6 +2,10 @@
* JournalHeader — status dot, player name, session dropdown, leave & close
*/
import { Component, Show } from "solid-js";
+import {
+ TbOutlineArrowLeft,
+ TbOutlineLayoutSidebarRightCollapse,
+} from "solid-icons/tb";
import { useJournalStream, leaveSession } from "../stores/journalStream";
import { SessionDropdown } from "./SessionDropdown";
@@ -70,7 +74,7 @@ export const JournalHeader: Component = (props) => {
class="text-xs text-gray-400 hover:text-blue-500 px-1"
title="返回会话列表"
>
- ←
+
diff --git a/src/components/journal/SessionDropdown.tsx b/src/components/journal/SessionDropdown.tsx
index d97ead4..6e04e56 100644
--- a/src/components/journal/SessionDropdown.tsx
+++ b/src/components/journal/SessionDropdown.tsx
@@ -2,6 +2,11 @@
* SessionDropdown — session switcher for the journal header (GM only)
*/
import { Component, createSignal, For, Show } from "solid-js";
+import {
+ TbOutlineCheck,
+ TbOutlineChevronDown,
+ TbOutlineTrash,
+} from "solid-icons/tb";
import {
sessions,
joinSession,
@@ -46,7 +51,7 @@ export const SessionDropdown: Component = (props) => {
class="text-[10px] text-gray-400 hover:text-gray-600 truncate leading-tight cursor-pointer text-left"
>
{stream.sessionName || stream.sessionId}{" "}
- ▾
+
= (props) => {
>
{meta.name || id}
- ✓
+
)}
diff --git a/src/components/journal/StreamMessage.tsx b/src/components/journal/StreamMessage.tsx
index f6919af..b16b8b1 100644
--- a/src/components/journal/StreamMessage.tsx
+++ b/src/components/journal/StreamMessage.tsx
@@ -3,6 +3,7 @@
*/
import { Component, Show, createMemo } from "solid-js";
+import { TbOutlineArrowBackUp } from "solid-icons/tb";
import type { StreamMessage as StreamMessageType } from "./registry";
import { getMessageType } from "./registry";
import { revertLatest, useJournalStream } from "../stores/journalStream";
@@ -47,7 +48,7 @@ export const StreamMessageCard: Component<{
class="text-xs text-gray-300 hover:text-red-500 ml-auto px-0.5 leading-none"
title="撤回此消息"
>
- ×
+
({
render: (p) => (
- 🙋
+
意图
{p.description}
@@ -58,7 +59,7 @@ registerMessageType
({
render: (p) => (
- ✅
+
裁决
re: {p.intentId}
diff --git a/src/components/journal/types/link.tsx b/src/components/journal/types/link.tsx
index c3960fa..80b757c 100644
--- a/src/components/journal/types/link.tsx
+++ b/src/components/journal/types/link.tsx
@@ -6,6 +6,7 @@
*/
import { Component } from "solid-js";
+import { TbOutlineFileText } from "solid-icons/tb";
import { useNavigateWithParams } from "../../useNavigateWithParams";
import { z } from "zod";
import { registerMessageType } from "../registry";
@@ -69,7 +70,7 @@ const RevealLink: Component
= (p) => {
return (
-
📄
+
({
return (
- 🎲
+
- {p.notation} →{" "}
+ {p.notation}{" "}
+ {" "}
{result.total}
diff --git a/src/components/journal/types/var.tsx b/src/components/journal/types/var.tsx
index 6e21eac..976e616 100644
--- a/src/components/journal/types/var.tsx
+++ b/src/components/journal/types/var.tsx
@@ -10,6 +10,7 @@
*/
import { z } from "zod";
+import { TbOutlineHash } from "solid-icons/tb";
import { registerMessageType } from "../registry";
import { journalSetState } from "../../stores/journalStream";
import { produce } from "solid-js/store";
@@ -35,7 +36,7 @@ registerMessageType
({
render: (p) => {
return (
- 🔢
+
{p.key} = {p.value}
diff --git a/src/components/md-deck/CardList.tsx b/src/components/md-deck/CardList.tsx
index ca79821..c404107 100644
--- a/src/components/md-deck/CardList.tsx
+++ b/src/components/md-deck/CardList.tsx
@@ -1,4 +1,5 @@
import { For, Show, createEffect, createSignal, on } from "solid-js";
+import { TbOutlineChevronLeft, TbOutlineChevronRight } from "solid-icons/tb";
import type { DeckStore } from "./hooks/deckStore";
export interface CardListProps {
@@ -67,7 +68,7 @@ export function CardList(props: CardListProps) {
disabled={page() === 0}
class="px-2 py-1 rounded text-sm text-gray-600 hover:bg-gray-100 disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer"
>
- ‹
+
{page() + 1} / {totalPages()}
@@ -77,7 +78,7 @@ export function CardList(props: CardListProps) {
disabled={page() >= totalPages() - 1}
class="px-2 py-1 rounded text-sm text-gray-600 hover:bg-gray-100 disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer"
>
- ›
+
diff --git a/src/components/md-deck/DeckHeader.tsx b/src/components/md-deck/DeckHeader.tsx
index d7ba752..8f9b3b0 100644
--- a/src/components/md-deck/DeckHeader.tsx
+++ b/src/components/md-deck/DeckHeader.tsx
@@ -1,5 +1,11 @@
import { Show, createSignal, onMount } from "solid-js";
import { Portal } from "solid-js/web";
+import {
+ TbOutlineCheck,
+ TbOutlineCopy,
+ TbOutlineDownload,
+ TbOutlinePencil,
+} from "solid-icons/tb";
import type { DeckStore } from "./hooks/deckStore";
export interface DeckHeaderProps {
@@ -43,7 +49,15 @@ export function DeckHeader(props: DeckHeaderProps) {
: "bg-gray-100 text-gray-600 hover:bg-gray-200"
}`}
>
- {store.state.isEditing ? "✓ 编辑中" : "✏️ 编辑"}
+ {store.state.isEditing ? (
+ <>
+ 编辑中
+ >
+ ) : (
+ <>
+ 编辑
+ >
+ )}
{/* 导出 PDF 按钮 */}
@@ -51,7 +65,7 @@ export function DeckHeader(props: DeckHeaderProps) {
onClick={() => store.actions.exportDeck()}
class="px-2 py-1 rounded text-xs font-medium transition-colors cursor-pointer bg-green-100 text-green-600 hover:bg-green-200"
>
- 📥 导出 PDF
+ 导出 PDF
{/* 复制代码按钮 */}
@@ -59,7 +73,7 @@ export function DeckHeader(props: DeckHeaderProps) {
onClick={handleCopy}
class="px-2 py-1 rounded text-xs font-medium transition-colors cursor-pointer bg-purple-100 text-purple-600 hover:bg-purple-200"
>
- 📋 复制代码
+ 复制代码
diff --git a/src/components/md-deck/PltPreview.tsx b/src/components/md-deck/PltPreview.tsx
index 35be583..2d98f22 100644
--- a/src/components/md-deck/PltPreview.tsx
+++ b/src/components/md-deck/PltPreview.tsx
@@ -1,5 +1,6 @@
import { createSignal, For, Show, createMemo } from "solid-js";
import { Portal } from "solid-js/web";
+import { TbOutlineDownload } from "solid-icons/tb";
import { parsePlt, extractCutPaths } from "../../plotcutter/parser";
import { generateTravelPaths, travelPathsToSvg } from "../../plotcutter/layout";
import type { CardPath } from "../../plotcutter/types";
@@ -115,7 +116,7 @@ export function PltPreview(props: PltPreviewProps) {
class="bg-blue-600 hover:bg-blue-700 text-white px-3 py-1.5 rounded text-sm font-medium cursor-pointer flex items-center gap-1"
disabled={parsedData().cardPaths.length === 0}
>
- 📥 下载 PLT
+ 下载 PLT
- 📥
+
导出 PDF
void;
}
-const ORIENTATIONS = [
- { value: "n" as const, label: "↑ 北" },
- { value: "e" as const, label: "→ 东" },
- { value: "s" as const, label: "↓ 南" },
- { value: "w" as const, label: "← 西" },
+const ORIENTATIONS: {
+ value: "n" | "e" | "s" | "w";
+ label: string;
+ icon: IconTypes;
+}[] = [
+ { value: "n", label: "北", icon: TbOutlineArrowUp },
+ { value: "e", label: "东", icon: TbOutlineArrowRight },
+ { value: "s", label: "南", icon: TbOutlineArrowDown },
+ { value: "w", label: "西", icon: TbOutlineArrowLeft },
];
-const ALIGNS: { value: Align | ""; icon: string }[] = [
- { value: "", icon: alignCenterIcon },
- { value: "l", icon: alignLeftIcon },
- { value: "c", icon: alignCenterIcon },
- { value: "r", icon: alignRightIcon },
- { value: "tl", icon: "↖" },
- { value: "tc", icon: "↑" },
- { value: "tr", icon: "↗" },
- { value: "bl", icon: "↙" },
- { value: "bc", icon: "↓" },
- { value: "br", icon: "↘" },
+const ALIGNS: { value: Align | ""; icon: IconTypes }[] = [
+ { value: "", icon: TbOutlineAlignCenter },
+ { value: "l", icon: TbOutlineAlignLeft },
+ { value: "c", icon: TbOutlineAlignCenter },
+ { value: "r", icon: TbOutlineAlignRight },
+ { value: "tl", icon: TbOutlineArrowUpLeft },
+ { value: "tc", icon: TbOutlineArrowUp },
+ { value: "tr", icon: TbOutlineArrowUpRight },
+ { value: "bl", icon: TbOutlineArrowDownLeft },
+ { value: "bc", icon: TbOutlineArrowDown },
+ { value: "br", icon: TbOutlineArrowDownRight },
];
const FONT_PRESETS = [3, 5, 8, 12] as const;
-function orientChar(v: string) {
+function orientIcon(v: string): IconTypes {
switch (v) {
case "n":
- return "↑";
+ return TbOutlineArrowUp;
case "e":
- return "→";
+ return TbOutlineArrowRight;
case "s":
- return "↓";
+ return TbOutlineArrowDown;
case "w":
- return "←";
+ return TbOutlineArrowLeft;
default:
- return "↑";
+ return TbOutlineArrowUp;
}
}
-function alignIcon(v: string): import("solid-js").JSX.Element {
+function alignIcon(v: string): IconTypes {
switch (v) {
case "tl":
- return "↖";
+ return TbOutlineArrowUpLeft;
case "tc":
- return "↑";
+ return TbOutlineArrowUp;
case "tr":
- return "↗";
+ return TbOutlineArrowUpRight;
case "bl":
- return "↙";
+ return TbOutlineArrowDownLeft;
case "bc":
- return "↓";
+ return TbOutlineArrowDown;
case "br":
- return "↘";
+ return TbOutlineArrowDownRight;
case "l":
- return
;
+ return TbOutlineAlignLeft;
case "r":
- return
;
+ return TbOutlineAlignRight;
default:
- return (
-
- );
+ return TbOutlineAlignCenter;
}
}
@@ -125,7 +144,7 @@ export function LayerRow(props: LayerRowProps) {
class="cursor-grab text-gray-400 hover:text-gray-600 text-sm px-0.5 select-none shrink-0"
title="拖动排序"
>
- ⠿
+
- {props.layer.visible ? "👁" : "👁🗨"}
+ {props.layer.visible ? (
+
+ ) : (
+
+ )}
@@ -162,6 +185,10 @@ export function LayerRow(props: LayerRowProps) {
onClick={() => props.onUpdateOrientation(o.value)}
class="block w-full text-left px-3 py-1.5 text-sm hover:bg-gray-100 cursor-pointer whitespace-nowrap"
>
+ {" "}
{o.label}
)}
@@ -187,13 +214,11 @@ export function LayerRow(props: LayerRowProps) {
onClick={() => props.onUpdateAlign(o.value || undefined)}
class="flex items-center gap-2 w-full px-3 py-1.5 text-sm hover:bg-gray-100 cursor-pointer whitespace-nowrap"
>
- {o.icon.endsWith(".png") ? (
-
- ) : (
-
- {o.icon}
-
- )}
+
)}
@@ -260,19 +285,19 @@ export function LayerRow(props: LayerRowProps) {
class={`shrink-0 w-5 h-5 text-xs rounded cursor-pointer flex items-center justify-center text-red-400 hover:text-red-600 hover:bg-red-50 transition-opacity ${props.hovered ? "opacity-100" : "opacity-0"}`}
title="删除图层"
>
- ✕
+
);
}
function DropdownButton(props: {
- icon: import("solid-js").JSX.Element;
+ icon: IconTypes;
visible: boolean;
open: boolean;
onToggle: () => void;
title: string;
- children: import("solid-js").JSX.Element;
+ children: JSX.Element;
}) {
return (
@@ -284,7 +309,7 @@ function DropdownButton(props: {
class={`w-7 h-7 rounded cursor-pointer flex items-center justify-center bg-gray-200 hover:bg-gray-300 ${!props.visible ? "invisible pointer-events-none" : ""}`}
title={props.title}
>
- {props.icon}
+
{props.open && (
{
class="text-blue-600 hover:text-blue-800 cursor-pointer"
title={rollDetail() || "掷骰子"}
>
- 🎲
+
- 📋 复制
+ 复制
diff --git a/src/components/md-table.tsx b/src/components/md-table.tsx
index b611161..081c2f5 100644
--- a/src/components/md-table.tsx
+++ b/src/components/md-table.tsx
@@ -7,6 +7,7 @@ import {
createMemo,
createResource,
} from "solid-js";
+import { TbOutlineDice5 } from "solid-icons/tb";
import { parseMarkdown } from "../markdown";
import { parseCSVString, CSV, processVariables } from "./utils/csv-loader";
import { resolveContentRef } from "./utils/resolve-content";
@@ -210,7 +211,7 @@ customElement(
class="text-gray-500 hover:text-gray-700 shrink-0 cursor-pointer"
title="随机切换"
>
- 🎲
+
('md-yarn-spinner', {start: 'start'}, (props, { el
rounded-bl-md transition-colors cursor-pointer"
title="重新开始"
>
- 🔄
+
advance()}
@@ -90,7 +95,7 @@ customElement<{start: string}>('md-yarn-spinner', {start: 'start'}, (props, { el
transition-colors cursor-pointer"
title="继续"
>
- ⏩
+
@@ -104,7 +109,7 @@ customElement<{start: string}>('md-yarn-spinner', {start: 'start'}, (props, { el
class="option-button text-left px-4 py-2 bg-blue-50 hover:bg-blue-100
rounded border border-blue-200 transition-colors cursor-pointer"
>
- → {option.text}
+
{option.text}
)}
diff --git a/src/doc-entries/journal-gm.md b/src/doc-entries/journal-gm.md
index 03146e0..78f2139 100644
--- a/src/doc-entries/journal-gm.md
+++ b/src/doc-entries/journal-gm.md
@@ -1,16 +1,16 @@
---
tag: journal-gm
-icon: 🎭
+icon: gm
title: 主持人指南
---
作为 GM 创建会话、管理玩家、使用命令与玩家互动。
-点击顶部导航栏的 📋 按钮打开 Journal 面板。
+点击顶部导航栏的剪贴板按钮打开 Journal 面板。
## 快速开始
-1. 点击顶部导航栏的 📋 按钮打开 Journal 面板
+1. 点击顶部导航栏的剪贴板按钮打开 Journal 面板
2. 输入你的名字,选择"主持人"角色,点击"加入"
3. 连接成功后,你可以创建新会话或选择已有会话
diff --git a/src/doc-entries/journal-link.md b/src/doc-entries/journal-link.md
index de17a18..3b0ab20 100644
--- a/src/doc-entries/journal-link.md
+++ b/src/doc-entries/journal-link.md
@@ -1,6 +1,6 @@
---
tag: journal-link
-icon: 🔗
+icon: link
title: 链接命令
---
diff --git a/src/doc-entries/journal-player.md b/src/doc-entries/journal-player.md
index a7e5802..ba67ca9 100644
--- a/src/doc-entries/journal-player.md
+++ b/src/doc-entries/journal-player.md
@@ -1,6 +1,6 @@
---
tag: journal-player
-icon: 🎲
+icon: player
title: 玩家指南
---
@@ -19,7 +19,7 @@ GM 会发送一个包含 `?session=xxx&player=你的名字&autojoin=1` 的链接
### 手动加入
-1. 点击顶部导航栏的 📋 按钮打开 Journal 面板
+1. 点击顶部导航栏的剪贴板按钮打开 Journal 面板
2. 输入你的名字
3. 选择"玩家"角色
4. 点击"加入"
diff --git a/src/doc-entries/journal-roll.md b/src/doc-entries/journal-roll.md
index c9da05b..fec957e 100644
--- a/src/doc-entries/journal-roll.md
+++ b/src/doc-entries/journal-roll.md
@@ -1,6 +1,6 @@
---
tag: journal-roll
-icon: 🎲
+icon: roll
title: 掷骰与火花表命令
---
diff --git a/src/doc-entries/journal-set.md b/src/doc-entries/journal-set.md
index f81309d..d51e4e1 100644
--- a/src/doc-entries/journal-set.md
+++ b/src/doc-entries/journal-set.md
@@ -1,6 +1,6 @@
---
tag: journal-set
-icon: 🔢
+icon: set
title: 变量系统
description: 在文档中声明变量和标签,通过 /set 命令设置变量值,自动计算派生变量和标签效果。
syntax: '```yaml role=declare'
diff --git a/src/doc-entries/journal-spark.md b/src/doc-entries/journal-spark.md
index dbb4fd1..c61de33 100644
--- a/src/doc-entries/journal-spark.md
+++ b/src/doc-entries/journal-spark.md
@@ -1,6 +1,6 @@
---
tag: journal-spark
-icon: 🎰
+icon: spark
title: 火花表
---
diff --git a/src/doc-entries/md-bg.md b/src/doc-entries/md-bg.md
index b59dbc9..d0fe264 100644
--- a/src/doc-entries/md-bg.md
+++ b/src/doc-entries/md-bg.md
@@ -1,6 +1,6 @@
---
tag: md-bg
-icon: 🖼️
+icon: background
title: 背景组件
---
diff --git a/src/doc-entries/md-border.md b/src/doc-entries/md-border.md
index 48eb7c7..4325a3f 100644
--- a/src/doc-entries/md-border.md
+++ b/src/doc-entries/md-border.md
@@ -1,6 +1,6 @@
---
tag: md-border
-icon: 🖼️
+icon: border
title: 边框组件
---
diff --git a/src/doc-entries/md-deck.md b/src/doc-entries/md-deck.md
index 5656020..426b3fc 100644
--- a/src/doc-entries/md-deck.md
+++ b/src/doc-entries/md-deck.md
@@ -1,6 +1,6 @@
---
tag: md-deck
-icon: 🃏
+icon: deck
title: 卡牌组件
---
diff --git a/src/doc-entries/md-dice.md b/src/doc-entries/md-dice.md
index f6ebca6..c30c696 100644
--- a/src/doc-entries/md-dice.md
+++ b/src/doc-entries/md-dice.md
@@ -1,6 +1,6 @@
---
tag: md-dice
-icon: 🎲
+icon: dice
title: 骰子组件
---
@@ -23,7 +23,7 @@ title: 骰子组件
:md-dice[2d20k1+5]{key="advantage"}
```
-点击 🎲 图标执行投掷,显示结果;点击文字重置为原始公式。
+点击骰子图标执行投掷,显示结果;点击文字重置为原始公式。
## 属性
diff --git a/src/doc-entries/md-embed.md b/src/doc-entries/md-embed.md
index a866f99..6ca394a 100644
--- a/src/doc-entries/md-embed.md
+++ b/src/doc-entries/md-embed.md
@@ -1,6 +1,6 @@
---
tag: md-embed
-icon: 📄
+icon: embed
title: 嵌入组件
---
diff --git a/src/doc-entries/md-font.md b/src/doc-entries/md-font.md
index 9c873ba..c5a6405 100644
--- a/src/doc-entries/md-font.md
+++ b/src/doc-entries/md-font.md
@@ -1,6 +1,6 @@
---
tag: md-font
-icon: 🔤
+icon: font
title: 字体组件
---
diff --git a/src/doc-entries/md-link.md b/src/doc-entries/md-link.md
index 35bb853..22bb1e1 100644
--- a/src/doc-entries/md-link.md
+++ b/src/doc-entries/md-link.md
@@ -1,6 +1,6 @@
---
tag: md-link
-icon: 🔗
+icon: link
title: 链接组件
---
diff --git a/src/doc-entries/md-pins.md b/src/doc-entries/md-pins.md
index e87ec23..82487a9 100644
--- a/src/doc-entries/md-pins.md
+++ b/src/doc-entries/md-pins.md
@@ -1,6 +1,6 @@
---
tag: md-pins
-icon: 📍
+icon: pins
title: 标记组件
---
@@ -27,7 +27,7 @@ title: 标记组件
## 复制坐标
-非 `fixed` 模式下,图片右上角会显示 📋 复制按钮,点击可将所有标记的坐标复制到剪贴板,方便粘贴回文档的 `pins` 属性中。
+非 `fixed` 模式下,图片右上角会显示复制按钮,点击可将所有标记的坐标复制到剪贴板,方便粘贴回文档的 `pins` 属性中。
## 属性
diff --git a/src/doc-entries/md-table.md b/src/doc-entries/md-table.md
index 871d6b7..011e448 100644
--- a/src/doc-entries/md-table.md
+++ b/src/doc-entries/md-table.md
@@ -1,6 +1,6 @@
---
tag: md-table
-icon: 📊
+icon: table
title: 表格组件
---
@@ -38,7 +38,7 @@ B,另一段描述,第二章]{}
## 随机抽取
-当 `roll=true` 时,表格顶部显示 🎲 随机按钮:
+当 `roll=true` 时,表格顶部显示骰子随机按钮:
- 普通随机:从所有行中均匀随机选取
- **加权随机**:当 `label` 列全部为整数或整数范围格式(如 `1-3`)时,以 label 值为权重进行加权随机抽取
diff --git a/src/doc-entries/md-yarn-spinner.md b/src/doc-entries/md-yarn-spinner.md
index 047747e..be5681a 100644
--- a/src/doc-entries/md-yarn-spinner.md
+++ b/src/doc-entries/md-yarn-spinner.md
@@ -1,6 +1,6 @@
---
tag: md-yarn-spinner
-icon: 🧶
+icon: yarn
title: 叙事线组件
---
@@ -19,8 +19,8 @@ Yarn Spinner 是用于游戏对话系统的格式,支持选项、条件分支
- **对话历史**:上半部分显示已进行的对话,说话者以蓝色粗体显示,命令以灰色斜体显示
- **当前选项**:下半部分显示可选的对话选项,点击选项推进剧情
-- **⏩ 继续**:点击右上角继续按钮推进到下一段对话
-- **🔄 重新开始**:点击右上角重启按钮从头开始对话
+- **继续**:点击右上角继续按钮推进到下一段对话
+- **重新开始**:点击右上角重启按钮从头开始对话
## 属性