@mxmweb/rtext 1.0.3 → 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.
@@ -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-outline-style:solid;--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}.absolute{position:absolute}.relative{position:relative}.mb-4{margin-bottom:calc(var(--spacing)*4)}.contents{display:contents}.flex{display:flex}.hidden{display:none}.list-item{display:list-item}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.flex-shrink{flex-shrink: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}.border{border-style:var(--tw-border-style);border-width:1px}.bg-gray-200{background-color:var(--color-gray-200)}.py-10{padding-block:calc(var(--spacing)*10)}.italic{font-style:italic}.underline{text-decoration-line:underline}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}
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}
@@ -0,0 +1,86 @@
1
+ import { default as React } from 'react';
2
+ import { RenderElementProps, RenderLeafProps } from 'slate-react';
3
+ export declare enum DataType {
4
+ SLATE = "slate",
5
+ MARKDOWN = "markdown",
6
+ HTML = "html",
7
+ TEXT = "text"
8
+ }
9
+ export interface DataSource {
10
+ type: DataType;
11
+ content: any;
12
+ }
13
+ export interface UnifiedRichTextProps {
14
+ /** 数据源 */
15
+ dataSource: {
16
+ type: DataType;
17
+ content?: any;
18
+ };
19
+ /** 是否处于编辑模式 */
20
+ isEditing?: boolean;
21
+ /** 占位符文本 */
22
+ placeholder?: string;
23
+ /** 组件尺寸 */
24
+ size?: 'sm' | 'md';
25
+ /** 主题样式 */
26
+ theme?: {
27
+ primaryColor?: string;
28
+ secondaryColor?: string;
29
+ backgroundColor?: string;
30
+ textColor?: string;
31
+ borderColor?: string;
32
+ disabledBackground?: string;
33
+ borderRadius?: string;
34
+ padding?: string;
35
+ margin?: string;
36
+ minHeight?: string;
37
+ };
38
+ /** 内容变化回调 */
39
+ onChange?: (content: any, type: DataType) => void;
40
+ /** 聚焦回调 */
41
+ onFocus?: () => void;
42
+ /** 失焦回调 */
43
+ onBlur?: () => void;
44
+ /** 自定义渲染元素 */
45
+ renderElement?: (props: RenderElementProps) => JSX.Element;
46
+ /** 自定义渲染叶子节点 */
47
+ renderLeaf?: (props: RenderLeafProps) => JSX.Element;
48
+ /** 自定义样式 */
49
+ className?: string;
50
+ /** 自定义样式对象 */
51
+ style?: React.CSSProperties;
52
+ /** 样式配置 */
53
+ styles?: {
54
+ /** 字间距 */
55
+ letterSpacing?: string;
56
+ /** 行间距 */
57
+ lineHeight?: string;
58
+ /** 蓝框背景样式 */
59
+ templateField?: {
60
+ backgroundColor?: string;
61
+ borderColor?: string;
62
+ borderRadius?: string;
63
+ padding?: string;
64
+ margin?: string;
65
+ fontSize?: string;
66
+ fontWeight?: string;
67
+ minWidth?: string;
68
+ maxWidth?: string;
69
+ /** 文字颜色 */
70
+ textColor?: string;
71
+ };
72
+ /** 文本样式 */
73
+ text?: {
74
+ fontSize?: string;
75
+ lineHeight?: string;
76
+ color?: string;
77
+ };
78
+ };
79
+ }
80
+ /**
81
+ * 统一富文本组件
82
+ * 支持编辑和渲染模式,通过dataSource和dataType判断数据源
83
+ */
84
+ declare const UnifiedRichText: React.FC<UnifiedRichTextProps>;
85
+ export default UnifiedRichText;
86
+ export { UnifiedRichText };
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+ import { TemplateElement } from '../types';
3
+ declare const TemplateField: React.ForwardRefExoticComponent<{
4
+ element: TemplateElement;
5
+ attributes: any;
6
+ children: React.ReactNode;
7
+ styles?: any;
8
+ onTemplateChange?: (id: string, value: string) => void;
9
+ } & React.RefAttributes<HTMLSpanElement>>;
10
+ export default TemplateField;
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ interface TemplateLeaf {
3
+ type: 'template';
4
+ id: string;
5
+ placeholder: string;
6
+ value: string;
7
+ style?: string;
8
+ }
9
+ declare const TemplateLeaf: React.ForwardRefExoticComponent<{
10
+ leaf: TemplateLeaf;
11
+ attributes: any;
12
+ children: React.ReactNode;
13
+ styles?: any;
14
+ onTemplateChange?: (id: string, value: string) => void;
15
+ } & React.RefAttributes<HTMLSpanElement>>;
16
+ export default TemplateLeaf;
@@ -0,0 +1,2 @@
1
+ export declare const renderElement: (props: any) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const renderLeaf: (props: any) => any;
@@ -0,0 +1,4 @@
1
+ export declare const RichTextContainer: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components/dist/types').Substitute<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
2
+ theme?: any;
3
+ $size?: "sm" | "md";
4
+ }>> & string;
package/core/types.d.ts CHANGED
@@ -154,7 +154,47 @@ export interface LinkElement extends BaseElement {
154
154
  type: 'link';
155
155
  url: string;
156
156
  }
157
- export type CustomElement = ParagraphElement | HeadingOneElement | HeadingTwoElement | HeadingThreeElement | ListElement | ListItemElement | TableElement | TableRowElement | TableCellElement | ImageElement | CodeBlockElement | BlockQuoteElement | LinkElement;
157
+ /**
158
+ * 模版输入字段元素类型
159
+ * 用于在富文本中插入可编辑的模版输入框
160
+ */
161
+ export interface TemplateInputElement extends BaseElement {
162
+ type: 'template-input';
163
+ /** 输入框的占位符文本 */
164
+ placeholder?: string;
165
+ /** 输入框的默认值 */
166
+ defaultValue?: string;
167
+ /** 输入框的当前值 */
168
+ value?: string;
169
+ /** 是否处于编辑状态 */
170
+ isEditing?: boolean;
171
+ /** 输入框的样式类型 */
172
+ style?: 'blue' | 'green' | 'purple' | 'custom';
173
+ /** 自定义样式 */
174
+ customStyle?: {
175
+ backgroundColor?: string;
176
+ borderColor?: string;
177
+ textColor?: string;
178
+ };
179
+ }
180
+ /**
181
+ * 模版元素类型
182
+ * 用于在富文本中插入可编辑的模版输入块
183
+ */
184
+ export interface TemplateElement extends BaseElement {
185
+ type: 'template';
186
+ /** 占位符文本 */
187
+ placeholder: string;
188
+ /** 当前值 */
189
+ value: string;
190
+ /** 样式类型 */
191
+ style: 'blue' | 'green' | 'purple';
192
+ /** 字段标识 */
193
+ fieldId: string;
194
+ /** 是否处于编辑状态 */
195
+ isEditing?: boolean;
196
+ }
197
+ export type CustomElement = ParagraphElement | HeadingOneElement | HeadingTwoElement | HeadingThreeElement | ListElement | ListItemElement | TableElement | TableRowElement | TableCellElement | ImageElement | CodeBlockElement | BlockQuoteElement | LinkElement | TemplateInputElement | TemplateElement;
158
198
  declare module 'slate' {
159
199
  interface CustomTypes {
160
200
  Editor: BaseEditor & ReactEditor;
package/demo.md ADDED
@@ -0,0 +1,60 @@
1
+ 电压和电池容量是描述电池性能的两个不同但相关的参数,它们分别表示:
2
+
3
+ ------
4
+
5
+ ### 🔋 一、电压(Voltage, 单位:V)
6
+
7
+ 电压是电池**推动电流流动的“力”**。它主要取决于:
8
+
9
+ - **电池的化学体系**(比如锂电池通常是 3.6V~3.7V,铅酸电池是 2V/单格);
10
+ - **串联的电芯数量**(比如 3 节锂电池串联就是 11.1V);
11
+ - **电池的状态**(充满时电压高,放电时电压下降);
12
+
13
+ 🔹 举例:
14
+
15
+ - 一节锂电池标称电压为 **3.7V**,满电约 **4.2V**,用光约 **3.0V**;
16
+ - 2 节串联就是 **7.4V**,3 节就是 **11.1V**。
17
+
18
+ ------
19
+
20
+ ### 🔋 二、电池容量(Capacity, 单位:mAh 或 Ah)
21
+
22
+ 容量代表电池**能储存多少电荷**,通常写作 **mAh(毫安时)** 或 **Ah(安时)**。
23
+
24
+ - 表示电池可以以**多少电流持续放电多长时间**;
25
+ - 举例:一个 3000mAh 的电池,理论上可以:
26
+ - 放电 3 小时(如果以 1A 放电);
27
+ - 或放电 1 小时(如果以 3A 放电);
28
+
29
+ ------
30
+
31
+ ### ⚖️ 三、二者关系:能量(Wh)是关键
32
+
33
+ 它们的联系体现在电池总能量(电量)上:
34
+
35
+ ```
36
+ 电池能量(Wh)= 电压(V) × 容量(Ah)
37
+ ```
38
+
39
+ 🔸 例如:
40
+
41
+ | 电池 | 电压 | 容量 | 总能量(Wh) |
42
+ | ------- | ---- | ----------------- | ------------------ |
43
+ | A型电池 | 3.7V | 3000mAh(=3Ah) | 3.7 × 3 = 11.1Wh |
44
+ | B型电池 | 7.4V | 1500mAh(=1.5Ah) | 7.4 × 1.5 = 11.1Wh |
45
+
46
+ 这两个电池的**容量不同、电压不同**,但**总能量一样**。
47
+
48
+ ------
49
+
50
+ ### 🧭 总结
51
+
52
+ | 项目 | 含义 | 单位 | 说明 |
53
+ | ---- | ---------------- | ---- | ------------------------------- |
54
+ | 电压 | 推动电流的“压力” | V | 决定设备工作电压是否匹配 |
55
+ | 容量 | 储存电能的“多少” | mAh | 表示电池能用多久 |
56
+ | 能量 | 实际输出的电力 | Wh | 电压 × 容量,最能说明“续航能力” |
57
+
58
+ ------
59
+
60
+ 如你正在选购或设计电池设备(如无人机、电动车、UPS 等),可以告诉我你的需求,我可以帮你计算推荐规格。