@mxmweb/rtext 1.0.1 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -350
- package/TestTemplateDesigner.d.ts +7 -0
- package/TestTemplateLeaf.d.ts +3 -0
- package/adopters/ChatMessageAdapter.d.ts +32 -0
- package/adopters/Markdownit.d.ts +65 -0
- package/adopters/PromptTempDesigner.d.ts +54 -0
- package/adopters/PromptTempDesignerLeaf.d.ts +54 -0
- package/assets/style.css +1 -1
- package/core/UnifiedRichText.d.ts +86 -0
- package/core/richElements/TemplateField.d.ts +10 -0
- package/core/richElements/TemplateLeaf.d.ts +16 -0
- package/core/richElements/index.d.ts +2 -0
- package/core/richElements/styles.d.ts +4 -0
- package/core/types.d.ts +41 -1
- package/demo.md +60 -0
- package/index.js +4579 -3850
- package/lib_enter.d.ts +2 -0
- package/package.json +7 -4
- package/index.d.ts +0 -2
- package/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/vs/base/common/worker/simpleWorker.nls.de.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.es.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.fr.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.it.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.ja.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.ko.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.ru.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.zh-cn.js +0 -8
- package/vs/base/common/worker/simpleWorker.nls.zh-tw.js +0 -8
- package/vs/base/worker/workerMain.js +0 -27
- package/vs/basic-languages/abap/abap.js +0 -10
- package/vs/basic-languages/apex/apex.js +0 -10
- package/vs/basic-languages/azcli/azcli.js +0 -10
- package/vs/basic-languages/bat/bat.js +0 -10
- package/vs/basic-languages/bicep/bicep.js +0 -11
- package/vs/basic-languages/cameligo/cameligo.js +0 -10
- package/vs/basic-languages/clojure/clojure.js +0 -10
- package/vs/basic-languages/coffee/coffee.js +0 -10
- package/vs/basic-languages/cpp/cpp.js +0 -10
- package/vs/basic-languages/csharp/csharp.js +0 -10
- package/vs/basic-languages/csp/csp.js +0 -10
- package/vs/basic-languages/css/css.js +0 -12
- package/vs/basic-languages/cypher/cypher.js +0 -10
- package/vs/basic-languages/dart/dart.js +0 -10
- package/vs/basic-languages/dockerfile/dockerfile.js +0 -10
- package/vs/basic-languages/ecl/ecl.js +0 -10
- package/vs/basic-languages/elixir/elixir.js +0 -10
- package/vs/basic-languages/flow9/flow9.js +0 -10
- package/vs/basic-languages/freemarker2/freemarker2.js +0 -12
- package/vs/basic-languages/fsharp/fsharp.js +0 -10
- package/vs/basic-languages/go/go.js +0 -10
- package/vs/basic-languages/graphql/graphql.js +0 -10
- package/vs/basic-languages/handlebars/handlebars.js +0 -10
- package/vs/basic-languages/hcl/hcl.js +0 -10
- package/vs/basic-languages/html/html.js +0 -10
- package/vs/basic-languages/ini/ini.js +0 -10
- package/vs/basic-languages/java/java.js +0 -10
- package/vs/basic-languages/javascript/javascript.js +0 -10
- package/vs/basic-languages/julia/julia.js +0 -10
- package/vs/basic-languages/kotlin/kotlin.js +0 -10
- package/vs/basic-languages/less/less.js +0 -11
- package/vs/basic-languages/lexon/lexon.js +0 -10
- package/vs/basic-languages/liquid/liquid.js +0 -10
- package/vs/basic-languages/lua/lua.js +0 -10
- package/vs/basic-languages/m3/m3.js +0 -10
- package/vs/basic-languages/markdown/markdown.js +0 -10
- package/vs/basic-languages/mdx/mdx.js +0 -10
- package/vs/basic-languages/mips/mips.js +0 -10
- package/vs/basic-languages/msdax/msdax.js +0 -10
- package/vs/basic-languages/mysql/mysql.js +0 -10
- package/vs/basic-languages/objective-c/objective-c.js +0 -10
- package/vs/basic-languages/pascal/pascal.js +0 -10
- package/vs/basic-languages/pascaligo/pascaligo.js +0 -10
- package/vs/basic-languages/perl/perl.js +0 -10
- package/vs/basic-languages/pgsql/pgsql.js +0 -10
- package/vs/basic-languages/php/php.js +0 -10
- package/vs/basic-languages/pla/pla.js +0 -10
- package/vs/basic-languages/postiats/postiats.js +0 -10
- package/vs/basic-languages/powerquery/powerquery.js +0 -10
- package/vs/basic-languages/powershell/powershell.js +0 -10
- package/vs/basic-languages/protobuf/protobuf.js +0 -11
- package/vs/basic-languages/pug/pug.js +0 -10
- package/vs/basic-languages/python/python.js +0 -10
- package/vs/basic-languages/qsharp/qsharp.js +0 -10
- package/vs/basic-languages/r/r.js +0 -10
- package/vs/basic-languages/razor/razor.js +0 -10
- package/vs/basic-languages/redis/redis.js +0 -10
- package/vs/basic-languages/redshift/redshift.js +0 -10
- package/vs/basic-languages/restructuredtext/restructuredtext.js +0 -10
- package/vs/basic-languages/ruby/ruby.js +0 -10
- package/vs/basic-languages/rust/rust.js +0 -10
- package/vs/basic-languages/sb/sb.js +0 -10
- package/vs/basic-languages/scala/scala.js +0 -10
- package/vs/basic-languages/scheme/scheme.js +0 -10
- package/vs/basic-languages/scss/scss.js +0 -12
- package/vs/basic-languages/shell/shell.js +0 -10
- package/vs/basic-languages/solidity/solidity.js +0 -10
- package/vs/basic-languages/sophia/sophia.js +0 -10
- package/vs/basic-languages/sparql/sparql.js +0 -10
- package/vs/basic-languages/sql/sql.js +0 -10
- package/vs/basic-languages/st/st.js +0 -10
- package/vs/basic-languages/swift/swift.js +0 -13
- package/vs/basic-languages/systemverilog/systemverilog.js +0 -10
- package/vs/basic-languages/tcl/tcl.js +0 -10
- package/vs/basic-languages/twig/twig.js +0 -10
- package/vs/basic-languages/typescript/typescript.js +0 -10
- package/vs/basic-languages/vb/vb.js +0 -10
- package/vs/basic-languages/wgsl/wgsl.js +0 -307
- package/vs/basic-languages/xml/xml.js +0 -10
- package/vs/basic-languages/yaml/yaml.js +0 -10
- package/vs/editor/editor.main.css +0 -6
- package/vs/editor/editor.main.js +0 -745
- package/vs/editor/editor.main.js.gz +0 -0
- package/vs/editor/editor.main.nls.de.js +0 -31
- package/vs/editor/editor.main.nls.es.js +0 -31
- package/vs/editor/editor.main.nls.fr.js +0 -29
- package/vs/editor/editor.main.nls.it.js +0 -29
- package/vs/editor/editor.main.nls.ja.js +0 -31
- package/vs/editor/editor.main.nls.js +0 -29
- package/vs/editor/editor.main.nls.ko.js +0 -29
- package/vs/editor/editor.main.nls.ru.js +0 -31
- package/vs/editor/editor.main.nls.zh-cn.js +0 -31
- package/vs/editor/editor.main.nls.zh-tw.js +0 -29
- package/vs/language/css/cssMode.js +0 -13
- package/vs/language/css/cssWorker.js +0 -81
- package/vs/language/css/cssWorker.js.gz +0 -0
- package/vs/language/html/htmlMode.js +0 -13
- package/vs/language/html/htmlWorker.js +0 -453
- package/vs/language/json/jsonMode.js +0 -15
- package/vs/language/json/jsonWorker.js +0 -36
- package/vs/language/typescript/tsMode.js +0 -20
- package/vs/language/typescript/tsWorker.js +0 -37016
- package/vs/language/typescript/tsWorker.js.gz +0 -0
- package/vs/loader.js +0 -11
- package/worker/pdf.worker.min.mjs +0 -21
package/README.md
CHANGED
|
@@ -1,350 +1 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
一个基于 slate.js 的统一富文本组件库,提供强大的富文本编辑和渲染功能,支持多种数据格式和虚拟滚动。
|
|
4
|
-
|
|
5
|
-
## 🚀 特性
|
|
6
|
-
|
|
7
|
-
- 📝 **统一富文本组件** - 支持编辑和渲染模式
|
|
8
|
-
- 🎨 **多种数据格式** - 支持 Slate、Markdown、HTML、Text 格式
|
|
9
|
-
- ⚡ **虚拟滚动** - 高性能大数据渲染
|
|
10
|
-
- 📦 **分段加载** - 支持动态内容加载
|
|
11
|
-
- 🎯 **主题定制** - 灵活的主题配置系统
|
|
12
|
-
- 📱 **响应式设计** - 支持不同尺寸和屏幕
|
|
13
|
-
- 🔧 **TypeScript** - 完整的类型支持
|
|
14
|
-
- 🎪 **代码块复制** - 一键复制代码内容
|
|
15
|
-
|
|
16
|
-
## 📦 安装
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install @mxmweb/rtext
|
|
20
|
-
# 或
|
|
21
|
-
yarn add @mxmweb/rtext
|
|
22
|
-
# 或
|
|
23
|
-
pnpm add @mxmweb/rtext
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## 🎯 核心组件
|
|
27
|
-
|
|
28
|
-
### UnifiedRichText - 统一富文本组件
|
|
29
|
-
|
|
30
|
-
核心的富文本组件,支持多种数据格式的编辑和渲染。
|
|
31
|
-
|
|
32
|
-
```tsx
|
|
33
|
-
import { UnifiedRichText, DataType } from '@mxmweb/rtext';
|
|
34
|
-
|
|
35
|
-
// 基本使用
|
|
36
|
-
<UnifiedRichText
|
|
37
|
-
dataSource={{
|
|
38
|
-
type: DataType.MARKDOWN,
|
|
39
|
-
content: '# Hello World\n\nThis is **bold** text.'
|
|
40
|
-
}}
|
|
41
|
-
isEditing={false}
|
|
42
|
-
theme={{
|
|
43
|
-
primaryColor: '#007bff',
|
|
44
|
-
backgroundColor: '#ffffff'
|
|
45
|
-
}}
|
|
46
|
-
/>
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
#### Props
|
|
50
|
-
|
|
51
|
-
| 属性 | 类型 | 默认值 | 说明 |
|
|
52
|
-
|------|------|--------|------|
|
|
53
|
-
| `dataSource` | `DataSource` | - | 数据源对象 |
|
|
54
|
-
| `isEditing` | `boolean` | `false` | 是否编辑模式 |
|
|
55
|
-
| `placeholder` | `string` | `'开始输入...'` | 占位符文本 |
|
|
56
|
-
| `size` | `'sm' \| 'md'` | `'md'` | 组件尺寸 |
|
|
57
|
-
| `theme` | `Theme` | `{}` | 主题配置 |
|
|
58
|
-
| `onChange` | `(content, type) => void` | - | 内容变化回调 |
|
|
59
|
-
| `onFocus` | `() => void` | - | 焦点回调 |
|
|
60
|
-
| `onBlur` | `() => void` | - | 失焦回调 |
|
|
61
|
-
|
|
62
|
-
### Markdownit - 高级 Markdown 渲染组件
|
|
63
|
-
|
|
64
|
-
基于 UnifiedRichText 的高级组件,提供虚拟滚动和分段加载功能。
|
|
65
|
-
|
|
66
|
-
```tsx
|
|
67
|
-
import { Markdownit } from '@mxmweb/rtext';
|
|
68
|
-
|
|
69
|
-
// 基本使用
|
|
70
|
-
<Markdownit
|
|
71
|
-
dataSource={{
|
|
72
|
-
type: DataType.MARKDOWN,
|
|
73
|
-
content: '# 标题\n\n内容...'
|
|
74
|
-
}}
|
|
75
|
-
enableVirtualScroll={true}
|
|
76
|
-
size="md"
|
|
77
|
-
theme={{
|
|
78
|
-
primaryColor: '#007bff',
|
|
79
|
-
backgroundColor: '#ffffff'
|
|
80
|
-
}}
|
|
81
|
-
/>
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
#### Props
|
|
85
|
-
|
|
86
|
-
| 属性 | 类型 | 默认值 | 说明 |
|
|
87
|
-
|------|------|--------|------|
|
|
88
|
-
| `dataSource` | `DataSource \| SegmentData[]` | - | 数据源 |
|
|
89
|
-
| `enableVirtualScroll` | `boolean` | `false` | 启用虚拟滚动 |
|
|
90
|
-
| `itemHeight` | `number` | `200` | 虚拟滚动项高度 |
|
|
91
|
-
| `preloadCount` | `number` | `5` | 预加载项数量 |
|
|
92
|
-
| `enableSegmentedLoading` | `boolean` | `false` | 启用分段加载 |
|
|
93
|
-
| `onLoadMore` | `(lastSegmentId) => Promise<SegmentData[]>` | - | 加载更多回调 |
|
|
94
|
-
| `isLoadingMore` | `boolean` | `false` | 是否正在加载 |
|
|
95
|
-
| `size` | `'sm' \| 'md'` | `'sm'` | 组件尺寸 |
|
|
96
|
-
| `theme` | `Theme` | `{}` | 主题配置 |
|
|
97
|
-
| `onChange` | `(content, type) => void` | - | 内容变化回调 |
|
|
98
|
-
| `onScroll` | `(scrollTop, scrollHeight) => void` | - | 滚动回调 |
|
|
99
|
-
| `onSegmentClick` | `(segmentId, segment) => void` | - | 分段点击回调 |
|
|
100
|
-
|
|
101
|
-
## 📚 数据类型
|
|
102
|
-
|
|
103
|
-
### DataType 枚举
|
|
104
|
-
|
|
105
|
-
```tsx
|
|
106
|
-
enum DataType {
|
|
107
|
-
SLATE = 'slate', // Slate.js 格式
|
|
108
|
-
MARKDOWN = 'markdown', // Markdown 格式
|
|
109
|
-
HTML = 'html', // HTML 格式
|
|
110
|
-
TEXT = 'text' // 纯文本格式
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### DataSource 接口
|
|
115
|
-
|
|
116
|
-
```tsx
|
|
117
|
-
interface DataSource {
|
|
118
|
-
type: DataType;
|
|
119
|
-
content: any;
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### SegmentData 接口
|
|
124
|
-
|
|
125
|
-
```tsx
|
|
126
|
-
interface SegmentData {
|
|
127
|
-
id: string;
|
|
128
|
-
content: string | CustomElement[];
|
|
129
|
-
type: DataType;
|
|
130
|
-
timestamp?: number;
|
|
131
|
-
metadata?: Record<string, any>;
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## 🎨 主题配置
|
|
136
|
-
|
|
137
|
-
### Theme 接口
|
|
138
|
-
|
|
139
|
-
```tsx
|
|
140
|
-
interface Theme {
|
|
141
|
-
primaryColor?: string; // 主色调
|
|
142
|
-
secondaryColor?: string; // 次要色调
|
|
143
|
-
backgroundColor?: string; // 背景色
|
|
144
|
-
textColor?: string; // 文本色
|
|
145
|
-
borderColor?: string; // 边框色
|
|
146
|
-
disabledBackground?: string; // 禁用背景色
|
|
147
|
-
hoverBackground?: string; // 悬停背景色
|
|
148
|
-
borderRadius?: string; // 圆角
|
|
149
|
-
padding?: string; // 内边距
|
|
150
|
-
margin?: string; // 外边距
|
|
151
|
-
minHeight?: string; // 最小高度
|
|
152
|
-
scrollbarTrack?: string; // 滚动条轨道色
|
|
153
|
-
scrollbarThumb?: string; // 滚动条滑块色
|
|
154
|
-
scrollbarThumbHover?: string; // 滚动条滑块悬停色
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## 🔧 高级功能
|
|
159
|
-
|
|
160
|
-
### 虚拟滚动
|
|
161
|
-
|
|
162
|
-
对于大量数据的渲染,启用虚拟滚动可以显著提升性能:
|
|
163
|
-
|
|
164
|
-
```tsx
|
|
165
|
-
<Markdownit
|
|
166
|
-
dataSource={largeDataArray}
|
|
167
|
-
enableVirtualScroll={true}
|
|
168
|
-
itemHeight={200}
|
|
169
|
-
preloadCount={5}
|
|
170
|
-
/>
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### 分段加载
|
|
174
|
-
|
|
175
|
-
支持动态加载内容,适用于聊天记录等场景:
|
|
176
|
-
|
|
177
|
-
```tsx
|
|
178
|
-
<Markdownit
|
|
179
|
-
dataSource={segments}
|
|
180
|
-
enableSegmentedLoading={true}
|
|
181
|
-
onLoadMore={async (lastSegmentId) => {
|
|
182
|
-
// 加载更多数据
|
|
183
|
-
return await fetchMoreData(lastSegmentId);
|
|
184
|
-
}}
|
|
185
|
-
isLoadingMore={loading}
|
|
186
|
-
/>
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### 代码块复制
|
|
190
|
-
|
|
191
|
-
代码块自动支持复制功能,点击右上角的复制按钮即可复制代码内容。
|
|
192
|
-
|
|
193
|
-
### 响应式表格
|
|
194
|
-
|
|
195
|
-
表格支持横向滚动,当内容超出容器宽度时自动显示滚动条。
|
|
196
|
-
|
|
197
|
-
## 📁 目录结构
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
src/
|
|
201
|
-
├── core/ # 核心组件
|
|
202
|
-
│ ├── UnifiedRichText.tsx # 统一富文本组件
|
|
203
|
-
│ ├── richElements/ # 富文本元素渲染
|
|
204
|
-
│ │ ├── index.tsx # 元素渲染逻辑
|
|
205
|
-
│ │ └── styles.tsx # 样式定义
|
|
206
|
-
│ ├── converters/ # 数据转换器
|
|
207
|
-
│ │ ├── slateConverters.ts
|
|
208
|
-
│ │ └── deserializers.ts
|
|
209
|
-
│ ├── types.ts # 类型定义
|
|
210
|
-
│ ├── utils.ts # 工具函数
|
|
211
|
-
│ └── events.ts # 事件处理
|
|
212
|
-
├── adopters/ # 业务适配器
|
|
213
|
-
│ └── Markdownit.tsx # Markdown 渲染组件
|
|
214
|
-
└── types/ # 全局类型定义
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
## 🚀 快速开始
|
|
218
|
-
|
|
219
|
-
### 1. 基本渲染
|
|
220
|
-
|
|
221
|
-
```tsx
|
|
222
|
-
import { Markdownit, DataType } from '@mxmweb/rtext';
|
|
223
|
-
|
|
224
|
-
function App() {
|
|
225
|
-
const markdownContent = `
|
|
226
|
-
# 欢迎使用
|
|
227
|
-
|
|
228
|
-
这是一个 **Markdown** 内容示例。
|
|
229
|
-
|
|
230
|
-
## 功能特性
|
|
231
|
-
|
|
232
|
-
- ✅ 支持 Markdown 语法
|
|
233
|
-
- ✅ 代码高亮
|
|
234
|
-
- ✅ 表格渲染
|
|
235
|
-
- ✅ 图片显示
|
|
236
|
-
|
|
237
|
-
\`\`\`javascript
|
|
238
|
-
console.log('Hello World!');
|
|
239
|
-
\`\`\`
|
|
240
|
-
`;
|
|
241
|
-
|
|
242
|
-
return (
|
|
243
|
-
<Markdownit
|
|
244
|
-
dataSource={{
|
|
245
|
-
type: DataType.MARKDOWN,
|
|
246
|
-
content: markdownContent
|
|
247
|
-
}}
|
|
248
|
-
size="md"
|
|
249
|
-
theme={{
|
|
250
|
-
primaryColor: '#007bff',
|
|
251
|
-
backgroundColor: '#ffffff'
|
|
252
|
-
}}
|
|
253
|
-
/>
|
|
254
|
-
);
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### 2. 编辑模式
|
|
259
|
-
|
|
260
|
-
```tsx
|
|
261
|
-
import { UnifiedRichText, DataType } from '@mxmweb/rtext';
|
|
262
|
-
|
|
263
|
-
function Editor() {
|
|
264
|
-
const [content, setContent] = useState({
|
|
265
|
-
type: DataType.SLATE,
|
|
266
|
-
content: [{ type: 'paragraph', children: [{ text: '' }] }]
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
return (
|
|
270
|
-
<UnifiedRichText
|
|
271
|
-
dataSource={content}
|
|
272
|
-
isEditing={true}
|
|
273
|
-
onChange={(newContent, type) => {
|
|
274
|
-
setContent({ type, content: newContent });
|
|
275
|
-
}}
|
|
276
|
-
placeholder="开始编写..."
|
|
277
|
-
/>
|
|
278
|
-
);
|
|
279
|
-
}
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
### 3. 虚拟滚动
|
|
283
|
-
|
|
284
|
-
```tsx
|
|
285
|
-
function VirtualScrollExample() {
|
|
286
|
-
const segments = [
|
|
287
|
-
{ id: '1', content: '# 第一段\n内容...', type: DataType.MARKDOWN },
|
|
288
|
-
{ id: '2', content: '# 第二段\n内容...', type: DataType.MARKDOWN },
|
|
289
|
-
// ... 更多数据
|
|
290
|
-
];
|
|
291
|
-
|
|
292
|
-
return (
|
|
293
|
-
<Markdownit
|
|
294
|
-
dataSource={segments}
|
|
295
|
-
enableVirtualScroll={true}
|
|
296
|
-
itemHeight={200}
|
|
297
|
-
height="600px"
|
|
298
|
-
onScroll={(scrollTop, scrollHeight) => {
|
|
299
|
-
console.log('滚动位置:', scrollTop);
|
|
300
|
-
}}
|
|
301
|
-
/>
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
## 🔧 开发指南
|
|
307
|
-
|
|
308
|
-
### 环境要求
|
|
309
|
-
|
|
310
|
-
- Node.js >= 18
|
|
311
|
-
- React >= 18
|
|
312
|
-
- TypeScript >= 4.9
|
|
313
|
-
|
|
314
|
-
### 本地开发
|
|
315
|
-
|
|
316
|
-
```bash
|
|
317
|
-
# 克隆仓库
|
|
318
|
-
git clone <repository-url>
|
|
319
|
-
cd base/slate
|
|
320
|
-
|
|
321
|
-
# 安装依赖
|
|
322
|
-
pnpm install
|
|
323
|
-
|
|
324
|
-
# 启动开发服务器
|
|
325
|
-
pnpm dev
|
|
326
|
-
|
|
327
|
-
# 构建
|
|
328
|
-
pnpm build
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
### 代码规范
|
|
332
|
-
|
|
333
|
-
- 使用 TypeScript 编写代码
|
|
334
|
-
- 遵循 ESLint 和 Prettier 配置
|
|
335
|
-
- 编写清晰的组件文档
|
|
336
|
-
- 添加必要的类型定义
|
|
337
|
-
|
|
338
|
-
## 📄 许可证
|
|
339
|
-
|
|
340
|
-
MIT
|
|
341
|
-
|
|
342
|
-
## 🤝 贡献
|
|
343
|
-
|
|
344
|
-
欢迎提交 Issue 和 Pull Request!
|
|
345
|
-
|
|
346
|
-
在提交代码前,请确保:
|
|
347
|
-
1. 代码符合项目规范
|
|
348
|
-
2. 添加了必要的测试
|
|
349
|
-
3. 更新了相关文档
|
|
350
|
-
4. 提交信息符合规范
|
|
1
|
+
# 工具库架构初始化
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { AdapterProps, CustomElement } from '../core/types';
|
|
3
|
+
export interface ChatMessageAdapterProps extends AdapterProps {
|
|
4
|
+
/** 消息内容 */
|
|
5
|
+
content: string | CustomElement[];
|
|
6
|
+
/** 是否为用户消息 */
|
|
7
|
+
isUser?: boolean;
|
|
8
|
+
/** 用户头像 */
|
|
9
|
+
userAvatar?: string;
|
|
10
|
+
/** AI头像 */
|
|
11
|
+
aiAvatar?: string;
|
|
12
|
+
/** 用户名 */
|
|
13
|
+
userName?: string;
|
|
14
|
+
/** AI名称 */
|
|
15
|
+
aiName?: string;
|
|
16
|
+
/** 消息时间 */
|
|
17
|
+
timestamp?: string;
|
|
18
|
+
/** 是否显示时间 */
|
|
19
|
+
showTime?: boolean;
|
|
20
|
+
/** 是否支持Markdown */
|
|
21
|
+
supportMarkdown?: boolean;
|
|
22
|
+
/** 消息状态 */
|
|
23
|
+
status?: 'sending' | 'sent' | 'error';
|
|
24
|
+
/** 错误信息 */
|
|
25
|
+
errorMessage?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 聊天消息适配器
|
|
29
|
+
* 用于聊天对话框中的富文本渲染,支持用户和AI消息的不同样式
|
|
30
|
+
*/
|
|
31
|
+
declare const ChatMessageAdapter: React.FC<ChatMessageAdapterProps>;
|
|
32
|
+
export default ChatMessageAdapter;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { DataType, DataSource } from '../core/UnifiedRichText';
|
|
3
|
+
import { CustomElement } from '../core/types';
|
|
4
|
+
export interface SegmentData {
|
|
5
|
+
id: string;
|
|
6
|
+
content: string | CustomElement[];
|
|
7
|
+
type: DataType;
|
|
8
|
+
timestamp?: number;
|
|
9
|
+
metadata?: Record<string, any>;
|
|
10
|
+
}
|
|
11
|
+
export interface MarkdownitProps {
|
|
12
|
+
/** 数据源 - 可以是单个数据或分段数据数组 */
|
|
13
|
+
dataSource: DataSource | SegmentData[];
|
|
14
|
+
/** 是否启用虚拟滚动 */
|
|
15
|
+
enableVirtualScroll?: boolean;
|
|
16
|
+
/** 虚拟滚动项高度 */
|
|
17
|
+
itemHeight?: number;
|
|
18
|
+
/** 预加载项数量 */
|
|
19
|
+
preloadCount?: number;
|
|
20
|
+
/** 是否启用分段加载 */
|
|
21
|
+
enableSegmentedLoading?: boolean;
|
|
22
|
+
/** 分段加载回调 */
|
|
23
|
+
onLoadMore?: (lastSegmentId: string) => Promise<SegmentData[]>;
|
|
24
|
+
/** 是否正在加载更多 */
|
|
25
|
+
isLoadingMore?: boolean;
|
|
26
|
+
/** 尺寸大小 */
|
|
27
|
+
size?: 'sm' | 'md';
|
|
28
|
+
/** 主题样式 */
|
|
29
|
+
theme?: {
|
|
30
|
+
primaryColor?: string;
|
|
31
|
+
secondaryColor?: string;
|
|
32
|
+
backgroundColor?: string;
|
|
33
|
+
textColor?: string;
|
|
34
|
+
borderColor?: string;
|
|
35
|
+
disabledBackground?: string;
|
|
36
|
+
hoverBackground?: string;
|
|
37
|
+
borderRadius?: string;
|
|
38
|
+
padding?: string;
|
|
39
|
+
scrollbarTrack?: string;
|
|
40
|
+
scrollbarThumb?: string;
|
|
41
|
+
scrollbarThumbHover?: string;
|
|
42
|
+
};
|
|
43
|
+
/** 内容变化回调 */
|
|
44
|
+
onChange?: (content: any, type: DataType) => void;
|
|
45
|
+
/** 滚动回调 */
|
|
46
|
+
onScroll?: (scrollTop: number, scrollHeight: number) => void;
|
|
47
|
+
/** 滚动到顶部回调 */
|
|
48
|
+
onScrollToTop?: () => void;
|
|
49
|
+
/** 滚动到底部回调 */
|
|
50
|
+
onScrollToBottom?: () => void;
|
|
51
|
+
/** 分段点击回调 */
|
|
52
|
+
onSegmentClick?: (segmentId: string, segment: SegmentData) => void;
|
|
53
|
+
/** 自定义样式 */
|
|
54
|
+
className?: string;
|
|
55
|
+
/** 自定义样式对象 */
|
|
56
|
+
style?: React.CSSProperties;
|
|
57
|
+
/** 容器高度 */
|
|
58
|
+
height?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Markdownit 富文本渲染组件
|
|
62
|
+
* 支持多种数据格式、虚拟滚动和分段加载
|
|
63
|
+
*/
|
|
64
|
+
declare const Markdownit: React.FC<MarkdownitProps>;
|
|
65
|
+
export default Markdownit;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
interface PromptTempDesignerProps {
|
|
3
|
+
/** 包含template标签的原始数据 */
|
|
4
|
+
data: string;
|
|
5
|
+
/** 模版内容变化回调 */
|
|
6
|
+
onChange?: (template: string) => void;
|
|
7
|
+
/** 主题样式 */
|
|
8
|
+
theme?: {
|
|
9
|
+
primaryColor?: string;
|
|
10
|
+
secondaryColor?: string;
|
|
11
|
+
backgroundColor?: string;
|
|
12
|
+
textColor?: string;
|
|
13
|
+
borderColor?: string;
|
|
14
|
+
borderRadius?: string;
|
|
15
|
+
padding?: string;
|
|
16
|
+
margin?: string;
|
|
17
|
+
};
|
|
18
|
+
/** 样式配置 */
|
|
19
|
+
styles?: {
|
|
20
|
+
/** 字间距 */
|
|
21
|
+
letterSpacing?: string;
|
|
22
|
+
/** 行间距 */
|
|
23
|
+
lineHeight?: string;
|
|
24
|
+
/** 蓝框背景样式 */
|
|
25
|
+
templateField?: {
|
|
26
|
+
backgroundColor?: string;
|
|
27
|
+
borderColor?: string;
|
|
28
|
+
borderRadius?: string;
|
|
29
|
+
padding?: string;
|
|
30
|
+
margin?: string;
|
|
31
|
+
fontSize?: string;
|
|
32
|
+
fontWeight?: string;
|
|
33
|
+
minWidth?: string;
|
|
34
|
+
maxWidth?: string;
|
|
35
|
+
/** 文字颜色 */
|
|
36
|
+
textColor?: string;
|
|
37
|
+
};
|
|
38
|
+
/** 文本样式 */
|
|
39
|
+
text?: {
|
|
40
|
+
fontSize?: string;
|
|
41
|
+
lineHeight?: string;
|
|
42
|
+
color?: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/** 获取数据的回调函数 */
|
|
46
|
+
onGetData?: (getData: (format: 'pure_string' | 'string' | 'markdown' | 'html') => string) => void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 模版设计器组件
|
|
50
|
+
* 基于UnifiedRichText核心组件实现可编辑的模版字段
|
|
51
|
+
* 支持解析包含<template>标签的字符串数据
|
|
52
|
+
*/
|
|
53
|
+
declare const PromptTempDesigner: React.FC<PromptTempDesignerProps>;
|
|
54
|
+
export default PromptTempDesigner;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
interface PromptTempDesignerLeafProps {
|
|
3
|
+
/** 包含template标签的原始数据 */
|
|
4
|
+
data: string;
|
|
5
|
+
/** 模版内容变化回调 */
|
|
6
|
+
onChange?: (template: string) => void;
|
|
7
|
+
/** 主题样式 */
|
|
8
|
+
theme?: {
|
|
9
|
+
primaryColor?: string;
|
|
10
|
+
secondaryColor?: string;
|
|
11
|
+
backgroundColor?: string;
|
|
12
|
+
textColor?: string;
|
|
13
|
+
borderColor?: string;
|
|
14
|
+
borderRadius?: string;
|
|
15
|
+
padding?: string;
|
|
16
|
+
margin?: string;
|
|
17
|
+
};
|
|
18
|
+
/** 样式配置 */
|
|
19
|
+
styles?: {
|
|
20
|
+
/** 字间距 */
|
|
21
|
+
letterSpacing?: string;
|
|
22
|
+
/** 行间距 */
|
|
23
|
+
lineHeight?: string;
|
|
24
|
+
/** 蓝框背景样式 */
|
|
25
|
+
templateField?: {
|
|
26
|
+
backgroundColor?: string;
|
|
27
|
+
borderColor?: string;
|
|
28
|
+
borderRadius?: string;
|
|
29
|
+
padding?: string;
|
|
30
|
+
margin?: string;
|
|
31
|
+
fontSize?: string;
|
|
32
|
+
fontWeight?: string;
|
|
33
|
+
minWidth?: string;
|
|
34
|
+
/** 文字颜色 */
|
|
35
|
+
textColor?: string;
|
|
36
|
+
};
|
|
37
|
+
/** 文本样式 */
|
|
38
|
+
text?: {
|
|
39
|
+
fontSize?: string;
|
|
40
|
+
lineHeight?: string;
|
|
41
|
+
color?: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/** 获取数据的回调函数 */
|
|
45
|
+
onGetData?: (getData: (format: 'pure_string' | 'string' | 'markdown' | 'html') => string) => void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 模版设计器组件(Leaf方案)
|
|
49
|
+
* 基于UnifiedRichText核心组件实现可编辑的模版字段
|
|
50
|
+
* 支持解析包含<template>标签的字符串数据
|
|
51
|
+
* 使用Leaf方案,更好的背景色和宽度控制
|
|
52
|
+
*/
|
|
53
|
+
declare const PromptTempDesignerLeaf: React.FC<PromptTempDesignerLeafProps>;
|
|
54
|
+
export default PromptTempDesignerLeaf;
|
package/assets/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--spacing:.25rem;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.end-1{inset-inline-end:calc(var(--spacing)*1)}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.container\!{width:100%!important}@media (min-width:40rem){.container\!{max-width:40rem!important}}@media (min-width:48rem){.container\!{max-width:48rem!important}}@media (min-width:64rem){.container\!{max-width:64rem!important}}@media (min-width:80rem){.container\!{max-width:80rem!important}}@media (min-width:96rem){.container\!{max-width:96rem!important}}.mb-4{margin-bottom:calc(var(--spacing)*4)}.block{display:block}.block\!{display:block!important}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.flex-shrink,.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.bg-gray-200{background-color:var(--color-gray-200)}.mask-repeat{-webkit-mask-repeat:repeat;mask-repeat:repeat}.py-10{padding-block:calc(var(--spacing)*10)}.text-justify{text-align:justify}.break-all{word-break:break-all}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.proportional-nums{--tw-numeric-spacing:proportional-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.slashed-zero{--tw-slashed-zero:slashed-zero;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.stacked-fractions{--tw-numeric-fraction:stacked-fractions;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}@media (hover:hover){.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}}*{margin:0;padding:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
|
|
1
|
+
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-gray-50:oklch(98.5% .002 247.839);--color-gray-200:oklch(92.8% .006 264.531);--spacing:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.static{position:static}.sticky{position:sticky}.isolate{isolation:isolate}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mb-4{margin-bottom:calc(var(--spacing)*4)}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.list-item{display:list-item}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.flex-shrink,.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.border{border-style:var(--tw-border-style);border-width:1px}.italic{font-style:italic}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}}*{margin:0;padding:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
|