@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.
Files changed (136) hide show
  1. package/README.md +1 -350
  2. package/TestTemplateDesigner.d.ts +7 -0
  3. package/TestTemplateLeaf.d.ts +3 -0
  4. package/adopters/ChatMessageAdapter.d.ts +32 -0
  5. package/adopters/Markdownit.d.ts +65 -0
  6. package/adopters/PromptTempDesigner.d.ts +54 -0
  7. package/adopters/PromptTempDesignerLeaf.d.ts +54 -0
  8. package/assets/style.css +1 -1
  9. package/core/UnifiedRichText.d.ts +86 -0
  10. package/core/richElements/TemplateField.d.ts +10 -0
  11. package/core/richElements/TemplateLeaf.d.ts +16 -0
  12. package/core/richElements/index.d.ts +2 -0
  13. package/core/richElements/styles.d.ts +4 -0
  14. package/core/types.d.ts +41 -1
  15. package/demo.md +60 -0
  16. package/index.js +4579 -3850
  17. package/lib_enter.d.ts +2 -0
  18. package/package.json +7 -4
  19. package/index.d.ts +0 -2
  20. package/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  21. package/vs/base/common/worker/simpleWorker.nls.de.js +0 -8
  22. package/vs/base/common/worker/simpleWorker.nls.es.js +0 -8
  23. package/vs/base/common/worker/simpleWorker.nls.fr.js +0 -8
  24. package/vs/base/common/worker/simpleWorker.nls.it.js +0 -8
  25. package/vs/base/common/worker/simpleWorker.nls.ja.js +0 -8
  26. package/vs/base/common/worker/simpleWorker.nls.js +0 -8
  27. package/vs/base/common/worker/simpleWorker.nls.ko.js +0 -8
  28. package/vs/base/common/worker/simpleWorker.nls.ru.js +0 -8
  29. package/vs/base/common/worker/simpleWorker.nls.zh-cn.js +0 -8
  30. package/vs/base/common/worker/simpleWorker.nls.zh-tw.js +0 -8
  31. package/vs/base/worker/workerMain.js +0 -27
  32. package/vs/basic-languages/abap/abap.js +0 -10
  33. package/vs/basic-languages/apex/apex.js +0 -10
  34. package/vs/basic-languages/azcli/azcli.js +0 -10
  35. package/vs/basic-languages/bat/bat.js +0 -10
  36. package/vs/basic-languages/bicep/bicep.js +0 -11
  37. package/vs/basic-languages/cameligo/cameligo.js +0 -10
  38. package/vs/basic-languages/clojure/clojure.js +0 -10
  39. package/vs/basic-languages/coffee/coffee.js +0 -10
  40. package/vs/basic-languages/cpp/cpp.js +0 -10
  41. package/vs/basic-languages/csharp/csharp.js +0 -10
  42. package/vs/basic-languages/csp/csp.js +0 -10
  43. package/vs/basic-languages/css/css.js +0 -12
  44. package/vs/basic-languages/cypher/cypher.js +0 -10
  45. package/vs/basic-languages/dart/dart.js +0 -10
  46. package/vs/basic-languages/dockerfile/dockerfile.js +0 -10
  47. package/vs/basic-languages/ecl/ecl.js +0 -10
  48. package/vs/basic-languages/elixir/elixir.js +0 -10
  49. package/vs/basic-languages/flow9/flow9.js +0 -10
  50. package/vs/basic-languages/freemarker2/freemarker2.js +0 -12
  51. package/vs/basic-languages/fsharp/fsharp.js +0 -10
  52. package/vs/basic-languages/go/go.js +0 -10
  53. package/vs/basic-languages/graphql/graphql.js +0 -10
  54. package/vs/basic-languages/handlebars/handlebars.js +0 -10
  55. package/vs/basic-languages/hcl/hcl.js +0 -10
  56. package/vs/basic-languages/html/html.js +0 -10
  57. package/vs/basic-languages/ini/ini.js +0 -10
  58. package/vs/basic-languages/java/java.js +0 -10
  59. package/vs/basic-languages/javascript/javascript.js +0 -10
  60. package/vs/basic-languages/julia/julia.js +0 -10
  61. package/vs/basic-languages/kotlin/kotlin.js +0 -10
  62. package/vs/basic-languages/less/less.js +0 -11
  63. package/vs/basic-languages/lexon/lexon.js +0 -10
  64. package/vs/basic-languages/liquid/liquid.js +0 -10
  65. package/vs/basic-languages/lua/lua.js +0 -10
  66. package/vs/basic-languages/m3/m3.js +0 -10
  67. package/vs/basic-languages/markdown/markdown.js +0 -10
  68. package/vs/basic-languages/mdx/mdx.js +0 -10
  69. package/vs/basic-languages/mips/mips.js +0 -10
  70. package/vs/basic-languages/msdax/msdax.js +0 -10
  71. package/vs/basic-languages/mysql/mysql.js +0 -10
  72. package/vs/basic-languages/objective-c/objective-c.js +0 -10
  73. package/vs/basic-languages/pascal/pascal.js +0 -10
  74. package/vs/basic-languages/pascaligo/pascaligo.js +0 -10
  75. package/vs/basic-languages/perl/perl.js +0 -10
  76. package/vs/basic-languages/pgsql/pgsql.js +0 -10
  77. package/vs/basic-languages/php/php.js +0 -10
  78. package/vs/basic-languages/pla/pla.js +0 -10
  79. package/vs/basic-languages/postiats/postiats.js +0 -10
  80. package/vs/basic-languages/powerquery/powerquery.js +0 -10
  81. package/vs/basic-languages/powershell/powershell.js +0 -10
  82. package/vs/basic-languages/protobuf/protobuf.js +0 -11
  83. package/vs/basic-languages/pug/pug.js +0 -10
  84. package/vs/basic-languages/python/python.js +0 -10
  85. package/vs/basic-languages/qsharp/qsharp.js +0 -10
  86. package/vs/basic-languages/r/r.js +0 -10
  87. package/vs/basic-languages/razor/razor.js +0 -10
  88. package/vs/basic-languages/redis/redis.js +0 -10
  89. package/vs/basic-languages/redshift/redshift.js +0 -10
  90. package/vs/basic-languages/restructuredtext/restructuredtext.js +0 -10
  91. package/vs/basic-languages/ruby/ruby.js +0 -10
  92. package/vs/basic-languages/rust/rust.js +0 -10
  93. package/vs/basic-languages/sb/sb.js +0 -10
  94. package/vs/basic-languages/scala/scala.js +0 -10
  95. package/vs/basic-languages/scheme/scheme.js +0 -10
  96. package/vs/basic-languages/scss/scss.js +0 -12
  97. package/vs/basic-languages/shell/shell.js +0 -10
  98. package/vs/basic-languages/solidity/solidity.js +0 -10
  99. package/vs/basic-languages/sophia/sophia.js +0 -10
  100. package/vs/basic-languages/sparql/sparql.js +0 -10
  101. package/vs/basic-languages/sql/sql.js +0 -10
  102. package/vs/basic-languages/st/st.js +0 -10
  103. package/vs/basic-languages/swift/swift.js +0 -13
  104. package/vs/basic-languages/systemverilog/systemverilog.js +0 -10
  105. package/vs/basic-languages/tcl/tcl.js +0 -10
  106. package/vs/basic-languages/twig/twig.js +0 -10
  107. package/vs/basic-languages/typescript/typescript.js +0 -10
  108. package/vs/basic-languages/vb/vb.js +0 -10
  109. package/vs/basic-languages/wgsl/wgsl.js +0 -307
  110. package/vs/basic-languages/xml/xml.js +0 -10
  111. package/vs/basic-languages/yaml/yaml.js +0 -10
  112. package/vs/editor/editor.main.css +0 -6
  113. package/vs/editor/editor.main.js +0 -745
  114. package/vs/editor/editor.main.js.gz +0 -0
  115. package/vs/editor/editor.main.nls.de.js +0 -31
  116. package/vs/editor/editor.main.nls.es.js +0 -31
  117. package/vs/editor/editor.main.nls.fr.js +0 -29
  118. package/vs/editor/editor.main.nls.it.js +0 -29
  119. package/vs/editor/editor.main.nls.ja.js +0 -31
  120. package/vs/editor/editor.main.nls.js +0 -29
  121. package/vs/editor/editor.main.nls.ko.js +0 -29
  122. package/vs/editor/editor.main.nls.ru.js +0 -31
  123. package/vs/editor/editor.main.nls.zh-cn.js +0 -31
  124. package/vs/editor/editor.main.nls.zh-tw.js +0 -29
  125. package/vs/language/css/cssMode.js +0 -13
  126. package/vs/language/css/cssWorker.js +0 -81
  127. package/vs/language/css/cssWorker.js.gz +0 -0
  128. package/vs/language/html/htmlMode.js +0 -13
  129. package/vs/language/html/htmlWorker.js +0 -453
  130. package/vs/language/json/jsonMode.js +0 -15
  131. package/vs/language/json/jsonWorker.js +0 -36
  132. package/vs/language/typescript/tsMode.js +0 -20
  133. package/vs/language/typescript/tsWorker.js +0 -37016
  134. package/vs/language/typescript/tsWorker.js.gz +0 -0
  135. package/vs/loader.js +0 -11
  136. package/worker/pdf.worker.min.mjs +0 -21
package/README.md CHANGED
@@ -1,350 +1 @@
1
- # @mxmweb/rtext - 统一富文本组件库
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,7 @@
1
+ import { default as React } from 'react';
2
+ /**
3
+ * 模版设计器测试页面
4
+ * 用于测试基于UnifiedRichText的PromptTempDesigner组件
5
+ */
6
+ declare const TestTemplateDesigner: React.FC;
7
+ export default TestTemplateDesigner;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ declare const TestTemplateLeaf: React.FC;
3
+ export default TestTemplateLeaf;
@@ -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}