bi-components-library 1.0.31 → 1.0.32
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/dist/bi-components-library.css +1 -1
- package/dist/index.es.js +94 -94
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/components/Button/index.tsx","../src/components/Card/index.tsx","../src/components/AppModal/index.tsx","../src/components/PageTable/index.tsx","../src/components/XcIcon/index.tsx","../src/components/EmptyAndSpin/index.tsx","../src/components/BackButton/index.tsx","../src/components/LinkButton/index.tsx","../src/components/AdvancedTable/index.tsx","../src/components/RichTextEditor/exclusionLogic.ts","../src/components/RichTextEditor/validation.ts","../src/components/RichTextEditor/placeholders.ts","../src/components/RichTextEditor/htmlGenerator.ts","../src/components/RichTextEditor/hooks.ts","../node_modules/.pnpm/dayjs@1.11.18/node_modules/dayjs/dayjs.min.js","../node_modules/.pnpm/dayjs@1.11.18/node_modules/dayjs/locale/zh-cn.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/.pnpm/rc-picker@4.11.3_dayjs@1.11.18_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/rc-picker/es/locale/common.js","../node_modules/.pnpm/rc-picker@4.11.3_dayjs@1.11.18_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/rc-picker/es/locale/zh_CN.js","../node_modules/.pnpm/antd@5.27.4_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/antd/es/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@5.27.4_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/antd/es/date-picker/locale/zh_CN.js","../src/components/RichTextEditor/DatePickerPortal.tsx","../src/components/RichTextEditor/index.tsx","../src/assets/autoLoading.png","../src/components/VirtualTable/AutoLoadControl.tsx","../src/components/VirtualTable/PaginationFooter.tsx","../src/components/VirtualTable/index.tsx","../src/components/DynamicInput/index.tsx","../src/components/DynamicTextArea/index.tsx","../src/components/VideoCard/index.tsx","../src/components/Waterfall/index.tsx","../src/theme.ts"],"sourcesContent":["import React from \"react\";\nimport { Button as AntButton, type ButtonProps as AntButtonProps } from \"antd\";\n\nexport type ButtonVariant = \"primary\" | \"ghost\" | \"dashed\" | \"link\" | \"text\";\n\nexport interface ButtonProps extends Omit<AntButtonProps, 'type' | 'ghost' | 'variant'> {\n /** 视觉风格 */\n variant?: ButtonVariant;\n /** 是否加载中 */\n loading?: boolean;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<ButtonProps> & { __docgenInfo?: DocgenInfo };\n\n/** 基础按钮,用于触发操作 */\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"primary\",\n loading = false,\n children,\n ...rest\n}) => {\n // 将自定义 variant 映射到 antd 的 type\n const getAntdType = (variant: ButtonVariant): AntButtonProps['type'] => {\n switch (variant) {\n case \"primary\":\n return \"primary\";\n case \"ghost\":\n return \"default\";\n case \"dashed\":\n return \"dashed\";\n case \"link\":\n return \"link\";\n case \"text\":\n return \"text\";\n default:\n return \"primary\";\n }\n };\n\n return (\n <AntButton\n {...rest}\n type={getAntdType(variant)}\n loading={loading}\n ghost={variant === \"ghost\"}\n >\n {children}\n </AntButton>\n );\n};\n\n// 手动添加 docgen 信息\n(Button as ComponentWithDocgen).__docgenInfo = {\n displayName: \"Button\",\n description: \"基础按钮,用于触发操作\",\n props: {\n variant: {\n name: \"variant\",\n required: false,\n description: \"视觉风格\",\n type: { name: \"ButtonVariant\", raw: '\"primary\" | \"ghost\" | \"dashed\" | \"link\" | \"text\"' },\n defaultValue: { value: '\"primary\"' }\n },\n loading: {\n name: \"loading\",\n required: false,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"按钮内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"按钮大小\",\n type: { name: \"ButtonSize\", raw: '\"small\" | \"middle\" | \"large\"' }\n },\n disabled: {\n name: \"disabled\",\n required: false,\n description: \"是否禁用\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"(event: MouseEvent) => void\" }\n }\n }\n};\n","import React from \"react\";\nimport { Card as AntCard, type CardProps as AntCardProps } from \"antd\";\n\nexport interface CardProps extends Omit<AntCardProps, 'title'> {\n /** 标题 */\n title?: React.ReactNode;\n /** 内容区域 */\n children?: React.ReactNode;\n /** 是否显示边框 */\n bordered?: boolean;\n /** 是否可悬停 */\n hoverable?: boolean;\n /** 卡片大小 */\n size?: \"default\" | \"small\";\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<CardProps> & { __docgenInfo?: DocgenInfo };\n\n/** 卡片容器,用于分组内容 */\nexport const Card: React.FC<CardProps> = ({ \n title, \n children, \n bordered = true,\n hoverable = false,\n size = \"default\",\n ...rest \n}) => (\n <AntCard\n {...rest}\n title={title}\n bordered={bordered}\n hoverable={hoverable}\n size={size}\n >\n {children}\n </AntCard>\n);\n\n// 手动添加 docgen 信息\n(Card as ComponentWithDocgen).__docgenInfo = {\n displayName: \"Card\",\n description: \"卡片容器,用于分组内容\",\n props: {\n title: {\n name: \"title\",\n required: false,\n description: \"标题\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"内容区域\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n bordered: {\n name: \"bordered\",\n required: false,\n description: \"是否显示边框\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n hoverable: {\n name: \"hoverable\",\n required: false,\n description: \"是否可悬停\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"卡片大小\",\n type: { name: \"CardSize\", raw: '\"default\" | \"small\"' },\n defaultValue: { value: '\"default\"' }\n },\n loading: {\n name: \"loading\",\n required: false,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n actions: {\n name: \"actions\",\n required: false,\n description: \"卡片操作组\",\n type: { name: \"ReactNode[]\", raw: \"React.ReactNode[]\" }\n }\n }\n};\n","import React from \"react\";\nimport { Modal, type ModalProps } from \"antd\";\n\nexport interface AppModalProps extends ModalProps {\n /** 是否显示默认的确定和取消按钮 */\n showDefaultFooter?: boolean;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<AppModalProps> & { __docgenInfo?: DocgenInfo };\n\n/** 应用级模态框组件,基于 Ant Design Modal 封装 */\nexport const AppModal: React.FC<AppModalProps> = ({ \n showDefaultFooter = true,\n ...props \n}) => {\n const footer = props.footer !== undefined \n ? props.footer \n : showDefaultFooter \n ? (_: React.ReactNode, { OkBtn, CancelBtn }: { OkBtn: React.ComponentType<Record<string, unknown>>; CancelBtn: React.ComponentType<Record<string, unknown>> }) => (\n <>\n <OkBtn />\n <CancelBtn />\n </>\n )\n : null;\n\n return (\n <Modal\n {...props}\n footer={footer}\n />\n );\n};\n\n// 手动添加 docgen 信息\n(AppModal as ComponentWithDocgen).__docgenInfo = {\n displayName: \"AppModal\",\n description: \"应用级模态框组件,基于 Ant Design Modal 封装\",\n props: {\n showDefaultFooter: {\n name: \"showDefaultFooter\",\n required: false,\n description: \"是否显示默认的确定和取消按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n title: {\n name: \"title\",\n required: false,\n description: \"模态框标题\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n open: {\n name: \"open\",\n required: false,\n description: \"是否显示模态框\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n onCancel: {\n name: \"onCancel\",\n required: false,\n description: \"取消按钮点击事件\",\n type: { name: \"function\", raw: \"(e: React.MouseEvent<HTMLElement>) => void\" }\n },\n onOk: {\n name: \"onOk\",\n required: false,\n description: \"确定按钮点击事件\",\n type: { name: \"function\", raw: \"(e: React.MouseEvent<HTMLElement>) => void\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"模态框内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n width: {\n name: \"width\",\n required: false,\n description: \"模态框宽度\",\n type: { name: \"string | number\", raw: \"string | number\" }\n },\n centered: {\n name: \"centered\",\n required: false,\n description: \"是否居中显示\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n maskClosable: {\n name: \"maskClosable\",\n required: false,\n description: \"点击蒙层是否允许关闭\",\n type: { name: \"boolean\", raw: \"boolean\" }\n }\n }\n};\n","import React from \"react\";\nimport { Table, type TableProps } from \"antd\";\n\nexport interface PageTableProps extends TableProps<Record<string, unknown>> {\n /** 水平滚动宽度 */\n scrollX?: number;\n /** 是否显示分页器 */\n showPagination?: boolean;\n /** 默认页面大小 */\n defaultPageSize?: number;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<PageTableProps> & { __docgenInfo?: DocgenInfo };\n\n/** 页面级表格组件,高度铺满容器,自动滚动 */\nexport const PageTable: React.FC<PageTableProps> = ({\n scrollX,\n showPagination = true,\n defaultPageSize = 10,\n ...props\n}) => {\n return (\n <Table\n {...props}\n scroll={{ \n x: scrollX || 'max-content', \n y: '50vh' \n }}\n pagination={showPagination ? {\n hideOnSinglePage: true,\n showSizeChanger: true,\n showQuickJumper: true,\n defaultPageSize,\n ...props.pagination,\n } : false}\n />\n );\n};\n\n// 手动添加 docgen 信息\n(PageTable as ComponentWithDocgen).__docgenInfo = {\n displayName: \"PageTable\",\n description: \"页面级表格组件,高度铺满容器,自动滚动\",\n props: {\n scrollX: {\n name: \"scrollX\",\n required: false,\n description: \"水平滚动宽度\",\n type: { name: \"number\", raw: \"number\" }\n },\n showPagination: {\n name: \"showPagination\",\n required: false,\n description: \"是否显示分页器\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n defaultPageSize: {\n name: \"defaultPageSize\",\n required: false,\n description: \"默认页面大小\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"10\" }\n },\n columns: {\n name: \"columns\",\n required: false,\n description: \"表格列配置\",\n type: { name: \"ColumnType[]\", raw: \"ColumnType<any>[]\" }\n },\n dataSource: {\n name: \"dataSource\",\n required: false,\n description: \"数据源\",\n type: { name: \"any[]\", raw: \"any[]\" }\n },\n loading: {\n name: \"loading\",\n required: false,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n rowKey: {\n name: \"rowKey\",\n required: false,\n description: \"行数据的 Key\",\n type: { name: \"string | function\", raw: \"string | ((record: any) => string)\" }\n }\n }\n};\n","import React from \"react\";\nimport { createFromIconfontCN } from '@ant-design/icons';\n\nconst IconFont = createFromIconfontCN({\n scriptUrl: ['https://at.alicdn.com/t/c/font_4968458_eh91gfr4j9e.js'],\n});\n\nexport interface XcIconProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 图标名称 */\n name: string;\n /** 图标大小 */\n size?: number | string;\n /** 图标颜色 */\n color?: string;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<XcIconProps> & { __docgenInfo?: DocgenInfo };\n\n/** 自定义图标组件,基于 iconfont */\nexport const XcIcon: React.FC<XcIconProps> = ({ \n name, \n size, \n color, \n style,\n ...props \n}) => {\n const iconStyle = {\n fontSize: size,\n color,\n ...style,\n };\n\n return (\n <IconFont \n {...props} \n type={name} \n style={iconStyle}\n />\n );\n};\n\n// 手动添加 docgen 信息\n(XcIcon as ComponentWithDocgen).__docgenInfo = {\n displayName: \"XcIcon\",\n description: \"自定义图标组件,基于 iconfont\",\n props: {\n name: {\n name: \"name\",\n required: true,\n description: \"图标名称\",\n type: { name: \"string\", raw: \"string\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"图标大小\",\n type: { name: \"number | string\", raw: \"number | string\" }\n },\n color: {\n name: \"color\",\n required: false,\n description: \"图标颜色\",\n type: { name: \"string\", raw: \"string\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n style: {\n name: \"style\",\n required: false,\n description: \"自定义样式\",\n type: { name: \"CSSProperties\", raw: \"React.CSSProperties\" }\n }\n }\n};\n","import React from \"react\";\nimport { Empty, Flex, Spin } from \"antd\";\n\nexport interface EmptyAndSpinProps {\n /** 是否加载中 */\n loading: boolean;\n /** 空状态描述 */\n description?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 空状态额外内容 */\n emptyChildren?: React.ReactNode;\n /** 加载中提示文字 */\n loadingText?: string;\n /** 空状态图片 */\n emptyImage?: string;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<EmptyAndSpinProps> & { __docgenInfo?: DocgenInfo };\n\n/** 空状态和加载状态组合组件 */\nexport const EmptyAndSpin: React.FC<EmptyAndSpinProps> = ({ \n loading, \n description = \"暂无数据\", \n className, \n emptyChildren,\n loadingText,\n emptyImage\n}) => {\n if (loading) {\n return (\n <Flex\n className={`pt-10 w-full ${className || ''}`}\n align=\"center\"\n justify=\"center\"\n vertical\n >\n <Spin size=\"large\" />\n {loadingText && <div className=\"mt-4 text-gray-500\">{loadingText}</div>}\n </Flex>\n );\n }\n\n return (\n <Flex\n className={`pt-10 w-full ${className || ''}`}\n align=\"center\"\n justify=\"center\"\n >\n <Empty\n image={emptyImage}\n description={description}\n imageStyle={{ height: 180 }}\n >\n {emptyChildren}\n </Empty>\n </Flex>\n );\n};\n\n// 手动添加 docgen 信息\n(EmptyAndSpin as ComponentWithDocgen).__docgenInfo = {\n displayName: \"EmptyAndSpin\",\n description: \"空状态和加载状态组合组件\",\n props: {\n loading: {\n name: \"loading\",\n required: true,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n description: {\n name: \"description\",\n required: false,\n description: \"空状态描述\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" },\n defaultValue: { value: '\"暂无数据\"' }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n emptyChildren: {\n name: \"emptyChildren\",\n required: false,\n description: \"空状态额外内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n loadingText: {\n name: \"loadingText\",\n required: false,\n description: \"加载中提示文字\",\n type: { name: \"string\", raw: \"string\" }\n },\n emptyImage: {\n name: \"emptyImage\",\n required: false,\n description: \"空状态图片\",\n type: { name: \"string\", raw: \"string\" }\n }\n }\n};\n","import React from \"react\";\nimport { Button } from \"antd\";\nimport { LeftOutlined } from '@ant-design/icons';\n\nexport interface BackButtonProps {\n /** 点击事件 */\n onClick?: () => void;\n /** 是否显示文字 */\n showText?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 按钮大小 */\n size?: \"small\" | \"middle\" | \"large\";\n /** 按钮类型 */\n type?: \"primary\" | \"default\" | \"dashed\" | \"link\" | \"text\";\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<BackButtonProps> & { __docgenInfo?: DocgenInfo };\n\n/** 返回按钮组件 */\nexport const BackButton: React.FC<BackButtonProps> = ({ \n onClick, \n showText = false,\n className,\n size = \"small\",\n type = \"default\"\n}) => {\n return (\n <Button\n size={size}\n type={type}\n icon={<LeftOutlined />}\n className={`cursor-pointer ${className || ''}`}\n onClick={onClick}\n >\n {showText && \"返回\"}\n </Button>\n );\n};\n\n// 手动添加 docgen 信息\n(BackButton as ComponentWithDocgen).__docgenInfo = {\n displayName: \"BackButton\",\n description: \"返回按钮组件\",\n props: {\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n showText: {\n name: \"showText\",\n required: false,\n description: \"是否显示文字\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"按钮大小\",\n type: { name: \"ButtonSize\", raw: '\"small\" | \"middle\" | \"large\"' },\n defaultValue: { value: '\"small\"' }\n },\n type: {\n name: \"type\",\n required: false,\n description: \"按钮类型\",\n type: { name: \"ButtonType\", raw: '\"primary\" | \"default\" | \"dashed\" | \"link\" | \"text\"' },\n defaultValue: { value: '\"default\"' }\n }\n }\n};\n","import React from \"react\";\nimport { Button, type ButtonProps } from \"antd\";\n\nexport interface LinkButtonProps extends ButtonProps {\n /** 是否去除默认内边距 */\n removePadding?: boolean;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<LinkButtonProps> & { __docgenInfo?: DocgenInfo };\n\n/** 链接样式按钮组件,适用于表格操作列 */\nexport const LinkButton: React.FC<LinkButtonProps> = ({ \n removePadding = true,\n className,\n ...props \n}) => {\n const linkClassName = removePadding \n ? `px-0 h-auto ${className || ''}` \n : className;\n\n return (\n <Button \n type=\"link\" \n {...props} \n className={linkClassName}\n >\n {props.children}\n </Button>\n );\n};\n\n// 手动添加 docgen 信息\n(LinkButton as ComponentWithDocgen).__docgenInfo = {\n displayName: \"LinkButton\",\n description: \"链接样式按钮组件,适用于表格操作列\",\n props: {\n removePadding: {\n name: \"removePadding\",\n required: false,\n description: \"是否去除默认内边距\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"按钮内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"(event: React.MouseEvent<HTMLButtonElement>) => void\" }\n },\n disabled: {\n name: \"disabled\",\n required: false,\n description: \"是否禁用\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n }\n }\n};\n","import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { Table, Input, Select, Button, Space, Form, Card } from \"antd\";\nimport { SearchOutlined, ReloadOutlined } from \"@ant-design/icons\";\nimport type { TableProps, TablePaginationConfig } from \"antd\";\nimport type { ColumnType } from \"antd/es/table\";\n\nconst { Option } = Select;\n\n// 搜索字段配置\nexport interface SearchFieldConfig {\n /** 字段名 */\n key: string;\n /** 字段标签 */\n label: string;\n /** 搜索类型 */\n type: 'input' | 'select';\n /** 选择器选项(当type为select时使用) */\n options?: Array<{ label: string; value: string | number }>;\n /** 占位符 */\n placeholder?: string;\n /** 默认值 */\n defaultValue?: unknown;\n}\n\n// 列配置扩展\nexport interface AdvancedColumnType<T = Record<string, unknown>> extends ColumnType<T> {\n /** 是否支持排序 */\n sortable?: boolean;\n /** 自定义渲染函数 */\n render?: (value: unknown, record: T, index: number) => React.ReactNode;\n}\n\n// 请求参数\nexport interface RequestParams {\n /** 页码 */\n page: number;\n /** 每页大小 */\n pageSize: number;\n /** 排序字段 */\n sortField?: string;\n /** 排序方向 */\n sortOrder?: 'ascend' | 'descend';\n /** 搜索参数 */\n searchParams?: Record<string, unknown>;\n}\n\n// 请求响应\nexport interface RequestResponse<T = Record<string, unknown>> {\n /** 数据列表 */\n data: T[];\n /** 总数 */\n total: number;\n /** 是否成功 */\n success: boolean;\n /** 错误信息 */\n message?: string;\n}\n\n// 组件属性\nexport interface AdvancedTableProps<T = Record<string, unknown>> extends Omit<TableProps<T>, 'dataSource' | 'loading' | 'pagination'> {\n /** 列配置 */\n columns: AdvancedColumnType<T>[];\n /** 异步请求函数 */\n request?: (params: RequestParams) => Promise<RequestResponse<T>>;\n /** 搜索字段配置 */\n searchFields?: SearchFieldConfig[];\n /** 是否显示搜索区域 */\n showSearch?: boolean;\n /** 是否显示刷新按钮 */\n showRefresh?: boolean;\n /** 默认页面大小 */\n defaultPageSize?: number;\n /** 页面大小选项 */\n pageSizeOptions?: string[];\n /** 是否自动加载 */\n autoLoad?: boolean;\n /** 请求参数(外部控制) */\n externalParams?: Record<string, unknown>;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<AdvancedTableProps> & { __docgenInfo?: DocgenInfo };\n\n/** 高阶表格组件,支持异步请求、搜索、排序等功能 */\nexport const AdvancedTable: React.FC<AdvancedTableProps> = ({\n columns,\n request,\n searchFields = [],\n showSearch = true,\n showRefresh = true,\n defaultPageSize = 10,\n pageSizeOptions = ['10', '20', '50', '100'],\n autoLoad = true,\n externalParams = {},\n ...tableProps\n}) => {\n // 状态管理\n const [dataSource, setDataSource] = useState<Record<string, unknown>[]>([]);\n const [loading, setLoading] = useState(false);\n const [pagination, setPagination] = useState({\n current: 1,\n pageSize: defaultPageSize,\n total: 0,\n });\n const [searchParams, setSearchParams] = useState<Record<string, unknown>>({});\n const [sortInfo, setSortInfo] = useState<{\n field?: string;\n order?: 'ascend' | 'descend';\n }>({});\n\n // 搜索表单\n const [form] = Form.useForm();\n \n // 使用 ref 来避免依赖问题\n const paginationRef = useRef(pagination);\n paginationRef.current = pagination;\n // 使用 ref 来避免 externalParams 的依赖问题\n const externalParamsRef = useRef(externalParams);\n externalParamsRef.current = externalParams;\n\n // 使用 ref 来跟踪是否已经初始化\n const initializedRef = useRef(false);\n\n // 处理列配置\n const processedColumns = useMemo(() => {\n return columns.map((col) => {\n const { sortable, render, ...restCol } = col;\n \n return {\n ...restCol,\n sorter: sortable ? true : undefined,\n render: render || ((value: unknown) => value as React.ReactNode),\n };\n });\n }, [columns]);\n\n // 加载数据\n const loadData = useCallback(async (params: Partial<RequestParams> = {}) => {\n if (!request) return;\n\n setLoading(true);\n try {\n const requestParams: RequestParams = {\n page: paginationRef.current.current,\n pageSize: paginationRef.current.pageSize,\n sortField: sortInfo.field,\n sortOrder: sortInfo.order,\n searchParams: { ...searchParams, ...externalParamsRef.current },\n ...params,\n };\n\n const response = await request(requestParams);\n \n if (response.success) {\n setDataSource(response.data);\n setPagination(prev => ({\n ...prev,\n total: response.total,\n current: requestParams.page || prev.current,\n }));\n }\n } catch (error) {\n console.error('加载数据失败:', error);\n } finally {\n setLoading(false);\n }\n }, [request, sortInfo, searchParams]);\n\n // 搜索处理\n const handleSearch = useCallback((values: Record<string, unknown>) => {\n setSearchParams(values);\n setPagination(prev => ({ ...prev, current: 1 }));\n }, []);\n\n // 重置搜索\n const handleReset = useCallback(() => {\n form.resetFields();\n setSearchParams({});\n setPagination(prev => ({ ...prev, current: 1 }));\n }, [form]);\n\n // 刷新数据\n const handleRefresh = useCallback(() => {\n loadData();\n }, [loadData]);\n\n // 分页变化\n const handleTableChange = useCallback((pagination: TablePaginationConfig, _filters: unknown, sorter: unknown) => {\n const newPagination = {\n current: pagination.current || 1,\n pageSize: pagination.pageSize || defaultPageSize,\n total: pagination.total || 0,\n };\n \n const newSortInfo = {\n field: (sorter as { field?: string })?.field,\n order: (sorter as { order?: 'ascend' | 'descend' })?.order,\n };\n\n setPagination(newPagination);\n setSortInfo(newSortInfo);\n }, [defaultPageSize]);\n\n // 初始加载和外部参数变化时重新加载\n useEffect(() => {\n const hasExternalParams = Object.keys(externalParams).length > 0;\n\n // 如果是自动加载且未初始化,或者是外部参数变化\n if ((autoLoad && !initializedRef.current) || hasExternalParams) {\n loadData();\n initializedRef.current = true;\n }\n }, [autoLoad, externalParams, loadData]);\n\n return (\n <div>\n {/* 搜索区域 */}\n {showSearch && searchFields.length > 0 && (\n <Card size=\"small\" style={{ marginBottom: 16 }}>\n <Form\n form={form}\n layout=\"inline\"\n onFinish={handleSearch}\n initialValues={searchFields.reduce((acc, field) => {\n if (field.defaultValue !== undefined) {\n acc[field.key] = field.defaultValue;\n }\n return acc;\n }, {} as Record<string, unknown>)}\n >\n {searchFields.map((field) => (\n <Form.Item key={field.key} name={field.key} label={field.label}>\n {field.type === 'input' ? (\n <Input\n placeholder={field.placeholder || `请输入${field.label}`}\n style={{ width: 200 }}\n />\n ) : (\n <Select\n placeholder={field.placeholder || `请选择${field.label}`}\n style={{ width: 200 }}\n allowClear\n >\n {field.options?.map((option) => (\n <Option key={option.value} value={option.value}>\n {option.label}\n </Option>\n ))}\n </Select>\n )}\n </Form.Item>\n ))}\n \n <Form.Item>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\" icon={<SearchOutlined />}>\n 查询\n </Button>\n <Button onClick={handleReset}>重置</Button>\n {showRefresh && (\n <Button icon={<ReloadOutlined />} onClick={handleRefresh}>\n 刷新\n </Button>\n )}\n </Space>\n </Form.Item>\n </Form>\n </Card>\n )}\n\n {/* 表格 */}\n <Table\n {...tableProps}\n columns={processedColumns}\n dataSource={dataSource}\n loading={loading}\n pagination={{\n ...pagination,\n showSizeChanger: true,\n showQuickJumper: true,\n showTotal: (total, range) => `第 ${range[0]}-${range[1]} 条/共 ${total} 条`,\n pageSizeOptions,\n }}\n onChange={handleTableChange}\n scroll={{ x: 'max-content', y: '50vh' }}\n />\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(AdvancedTable as ComponentWithDocgen).__docgenInfo = {\n displayName: \"AdvancedTable\",\n description: \"高阶表格组件,支持异步请求、搜索、排序等功能\",\n props: {\n columns: {\n name: \"columns\",\n required: true,\n description: \"列配置\",\n type: { name: \"AdvancedColumnType[]\", raw: \"AdvancedColumnType<any>[]\" }\n },\n request: {\n name: \"request\",\n required: false,\n description: \"异步请求函数\",\n type: { name: \"function\", raw: \"(params: RequestParams) => Promise<RequestResponse>\" }\n },\n searchFields: {\n name: \"searchFields\",\n required: false,\n description: \"搜索字段配置\",\n type: { name: \"SearchFieldConfig[]\", raw: \"SearchFieldConfig[]\" },\n defaultValue: { value: \"[]\" }\n },\n showSearch: {\n name: \"showSearch\",\n required: false,\n description: \"是否显示搜索区域\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n showRefresh: {\n name: \"showRefresh\",\n required: false,\n description: \"是否显示刷新按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n defaultPageSize: {\n name: \"defaultPageSize\",\n required: false,\n description: \"默认页面大小\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"10\" }\n },\n pageSizeOptions: {\n name: \"pageSizeOptions\",\n required: false,\n description: \"页面大小选项\",\n type: { name: \"string[]\", raw: \"string[]\" },\n defaultValue: { value: '[\"10\", \"20\", \"50\", \"100\"]' }\n },\n autoLoad: {\n name: \"autoLoad\",\n required: false,\n description: \"是否自动加载\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n externalParams: {\n name: \"externalParams\",\n required: false,\n description: \"外部请求参数\",\n type: { name: \"Record<string, any>\", raw: \"Record<string, any>\" },\n defaultValue: { value: \"{}\" }\n }\n }\n};\n","import type React from 'react';\nimport type { InputNode, NodeType } from './types';\n\n/**\n * 检查互斥逻辑\n */\nexport function checkExclusionStates(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>\n): void {\n if (!editorRef.current) return;\n\n // 1. 从 config 中动态识别所有的 exclusionGroup(排除 separator)\n const exclusionGroups = new Set<string>();\n const groupNodes: Record<string, Array<{ type: NodeType; key?: string; exclusionGroup: string }>> = {};\n \n for (const node of config) {\n if (node.exclusionGroup && node.exclusionGroup !== 'separator') {\n exclusionGroups.add(node.exclusionGroup);\n if (!groupNodes[node.exclusionGroup]) {\n groupNodes[node.exclusionGroup] = [];\n }\n groupNodes[node.exclusionGroup].push({\n type: node.type,\n key: node.key,\n exclusionGroup: node.exclusionGroup,\n });\n }\n }\n\n // 2. 检查每个互斥组是否有值\n const groupHasValue: Record<string, boolean> = {};\n \n for (const groupName of exclusionGroups) {\n groupHasValue[groupName] = false;\n \n for (const groupNode of groupNodes[groupName]) {\n if (groupNode.type === 'upload' && groupNode.key) {\n // 检查文件是否上传\n if (files[groupNode.key] !== null && files[groupNode.key] !== undefined) {\n groupHasValue[groupName] = true;\n break;\n }\n } else if (groupNode.type === 'variable' && groupNode.key) {\n // 检查文本是否输入\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${groupNode.key}\"]`\n );\n if (variableEl) {\n const text = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n groupHasValue[groupName] = true;\n break;\n }\n }\n }\n }\n }\n\n // 3. 检查是否存在 separator,用于判断是否应该应用互斥逻辑\n const hasSeparator = config.some(node => node.exclusionGroup === 'separator');\n \n // 4. 找出有值的组(按 config 顺序,只取第一个有值的组)\n const groupsWithValue = Object.keys(groupHasValue).filter(\n (groupName) => groupHasValue[groupName]\n );\n const hasAnyValue = groupsWithValue.length > 0;\n \n // 找出第一个有值的组(按 config 中的顺序)\n let firstGroupWithValue: string | null = null;\n if (hasAnyValue && hasSeparator) {\n // 只有当存在 separator 时,才需要找出第一个有值的组(用于互斥逻辑)\n // 按照 config 的顺序找到第一个有值的组\n for (const node of config) {\n if (node.exclusionGroup && \n node.exclusionGroup !== 'separator' && \n groupHasValue[node.exclusionGroup]) {\n firstGroupWithValue = node.exclusionGroup;\n break;\n }\n }\n }\n\n // 5. 处理每个互斥组的显示/隐藏\n for (const groupName of exclusionGroups) {\n // 选择所有带有该 data-group 的元素(包括 wrapper 和独立节点)\n const groupElements = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-group=\"${groupName}\"]`\n );\n \n if (hasSeparator && hasAnyValue && firstGroupWithValue) {\n // 只有当存在 separator 时,才应用互斥逻辑:只显示第一个有值的组,隐藏其他所有组\n if (groupName === firstGroupWithValue) {\n groupElements.forEach((el) => {\n // 根据元素类型设置正确的 display 值\n if (el.classList.contains('required-upload-group')) {\n el.style.setProperty('display', 'inline-flex', 'important');\n } else if (el.classList.contains('exclusion-wrapper')) {\n el.style.setProperty('display', 'inline-block', 'important');\n } else {\n // 对于其他元素(如 variable-chip, upload-chip),使用 inline-block\n el.style.setProperty('display', 'inline-block', 'important');\n }\n });\n } else {\n groupElements.forEach((el) => {\n el.style.display = \"none\";\n el.style.setProperty('display', 'none', 'important');\n });\n }\n } else {\n // 如果没有 separator,或者都没有值,显示所有组\n groupElements.forEach((el) => {\n // 根据元素类型设置正确的 display 值\n if (el.classList.contains('required-upload-group')) {\n el.style.setProperty('display', 'inline-flex', 'important');\n } else if (el.classList.contains('exclusion-wrapper')) {\n el.style.setProperty('display', 'inline-block', 'important');\n } else {\n // 对于其他元素(如 variable-chip, upload-chip),使用 inline-block\n el.style.setProperty('display', 'inline-block', 'important');\n }\n });\n }\n }\n\n // 6. 处理 separator:有值时隐藏,没有值时显示\n const separatorGroups = editorRef.current.querySelectorAll<HTMLElement>(\n '[data-group=\"separator\"]'\n );\n separatorGroups.forEach((el) => {\n el.style.display = hasAnyValue ? \"none\" : \"inline\";\n });\n}\n\n","import type React from 'react';\nimport type { InputNode } from './types';\n\n/**\n * 校验必填字段\n */\nexport function validateRequiredFields(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setIsFormValid: (valid: boolean) => void\n): void {\n if (!editorRef.current) {\n setIsFormValid(false);\n return;\n }\n\n // 从 config 中找出所有必填字段(支持两种格式:旧格式text节点+variable/upload,新格式直接required属性)\n const requiredFields: Array<{ exclusionGroup: string; key?: string; type: 'variable' | 'upload' | 'select' | 'textarea' | 'richtext' | 'datepicker'; isMultiVariable?: boolean; minCount?: number; __index?: number }> = [];\n \n for (let i = 0; i < config.length; i++) {\n const node = config[i];\n \n // 新格式:直接检查 variable、upload 或 multi-variable 节点的 required 属性\n if (\n (node.type === 'variable' || node.type === 'upload' || node.type === 'multi-variable' || node.type === 'select' || node.type === 'textarea' || node.type === 'richtext' || node.type === 'datepicker') &&\n node.required &&\n node.key\n ) {\n requiredFields.push({\n exclusionGroup: node.exclusionGroup || '',\n key: node.key,\n type: node.type === 'multi-variable' ? 'variable' : node.type,\n isMultiVariable: node.type === 'multi-variable',\n minCount: node.type === 'multi-variable' ? node.minCount : undefined,\n __index: i,\n });\n continue;\n }\n \n // 旧格式:检查是否是必填图标(text 类型,且 className 包含 rte-text-required)\n if (\n node.type === 'text' &&\n node.className?.includes('rte-text-required')\n ) {\n // 如果有 exclusionGroup,找到同一个 exclusionGroup 中的节点\n if (node.exclusionGroup) {\n for (let j = i + 1; j < config.length; j++) {\n const nextNode = config[j];\n if (\n nextNode.exclusionGroup === node.exclusionGroup &&\n (nextNode.type === 'variable' || nextNode.type === 'upload' || nextNode.type === 'select' || nextNode.type === 'textarea' || nextNode.type === 'richtext' || nextNode.type === 'datepicker') &&\n nextNode.key\n ) {\n requiredFields.push({\n exclusionGroup: node.exclusionGroup,\n key: nextNode.key,\n type: nextNode.type,\n __index: j,\n });\n break;\n }\n }\n } else {\n // 如果没有 exclusionGroup,找到紧跟着的下一个可输入节点(variable/upload/select/textarea/richtext/datepicker)\n for (let j = i + 1; j < config.length; j++) {\n const nextNode = config[j];\n if (\n (nextNode.type === 'variable' || nextNode.type === 'upload' || nextNode.type === 'select' || nextNode.type === 'textarea' || nextNode.type === 'richtext' || nextNode.type === 'datepicker') &&\n nextNode.key\n ) {\n requiredFields.push({\n exclusionGroup: nextNode.exclusionGroup || '',\n key: nextNode.key,\n type: nextNode.type,\n __index: j,\n });\n break;\n }\n }\n }\n }\n }\n\n // 检查是否有 separator,用于判断必填字段是否互斥\n const hasSeparator = config.some(node => node.exclusionGroup === 'separator');\n \n // 用于存储互斥字段组(通过 separator 分隔的字段组)\n const mutuallyExclusiveGroups: Array<Array<typeof requiredFields[0]>> = [];\n \n if (hasSeparator && requiredFields.length > 1) {\n // 找到所有 separator 的位置\n const separatorIndices: number[] = [];\n config.forEach((node, index) => {\n if (node.exclusionGroup === 'separator') {\n separatorIndices.push(index);\n }\n });\n \n // 对于每个 separator,仅取最靠近的前后必填字段组成互斥组\n for (const separatorIndex of separatorIndices) {\n // 找到 separator 前最近的必填字段\n const beforeCandidates = requiredFields\n .filter(field => typeof field.__index === 'number' && field.__index < separatorIndex)\n .sort((a, b) => (b.__index ?? 0) - (a.__index ?? 0));\n const beforeField = beforeCandidates[0];\n \n // 找到 separator 后最近的必填字段\n const afterCandidates = requiredFields\n .filter(field => typeof field.__index === 'number' && field.__index > separatorIndex)\n .sort((a, b) => (a.__index ?? 0) - (b.__index ?? 0));\n const afterField = afterCandidates[0];\n \n if (beforeField && afterField) {\n mutuallyExclusiveGroups.push([beforeField, afterField]);\n }\n }\n }\n\n // 如果没有必填字段,检查是否是默认输入框状态\n if (requiredFields.length === 0) {\n // 如果是默认输入框状态(config 为空),需要检查编辑器内容是否为空\n if (config.length === 0) {\n if (!editorRef.current) {\n setIsFormValid(false);\n return;\n }\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n setIsFormValid(textContent.length > 0);\n return;\n }\n // 如果不是默认状态,且没有必填字段,默认有效\n setIsFormValid(true);\n return;\n }\n\n // 动态检查当前显示的必填字段\n const visibleRequiredFields = requiredFields.filter(field => {\n if (!editorRef.current) return false;\n \n // 先尝试通过 data-group 查找\n if (field.exclusionGroup) {\n const groupElements = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-group=\"${field.exclusionGroup}\"]`\n );\n if (groupElements.length > 0) {\n // 如果找到了 group 元素,检查是否隐藏\n return groupElements[0].style.display !== 'none';\n }\n }\n \n // 如果找不到 group 元素,直接检查字段本身是否存在\n if (field.type === 'upload' && field.key) {\n const uploadEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"upload\"][data-key=\"${field.key}\"]`\n );\n if (uploadEl) {\n // 检查字段本身或其父元素是否隐藏\n const parent = (uploadEl.closest('[data-group]') as HTMLElement) || uploadEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'variable' && field.key) {\n if (field.isMultiVariable) {\n const multiVariableEls = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${field.key}\"]`\n );\n if (multiVariableEls.length > 0) {\n const firstEl = multiVariableEls[0];\n const parent = (firstEl.closest('[data-group]') as HTMLElement) || firstEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else {\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${field.key}\"]`\n );\n if (variableEl) {\n const parent = (variableEl.closest('[data-group]') as HTMLElement) || variableEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n }\n } else if (field.type === 'select' && field.key) {\n const selectEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"select\"][data-key=\"${field.key}\"]`\n );\n if (selectEl) {\n const parent = (selectEl.closest('[data-group]') as HTMLElement) || selectEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'textarea' && field.key) {\n const textareaEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"textarea\"][data-key=\"${field.key}\"]`\n );\n if (textareaEl) {\n const parent = (textareaEl.closest('[data-group]') as HTMLElement) || textareaEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'richtext' && field.key) {\n const richtextEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"richtext\"][data-key=\"${field.key}\"]`\n );\n if (richtextEl) {\n const parent = (richtextEl.closest('[data-group]') as HTMLElement) || richtextEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'datepicker' && field.key) {\n const dpEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"datepicker\"][data-key=\"${field.key}\"]`\n );\n if (dpEl) {\n const parent = (dpEl.closest('[data-group]') as HTMLElement) || dpEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n }\n \n // 如果找不到字段元素,认为不可见\n return false;\n });\n\n // 如果没有可见的必填字段,默认有效\n if (visibleRequiredFields.length === 0) {\n setIsFormValid(true);\n return;\n }\n\n // 将必填字段分为互斥组和非互斥字段\n const mutuallyExclusiveFieldKeys = new Set<string>();\n mutuallyExclusiveGroups.forEach(group => {\n group.forEach(field => {\n if (field.key) {\n mutuallyExclusiveFieldKeys.add(field.key);\n }\n });\n });\n \n const nonExclusiveFields = visibleRequiredFields.filter(field => \n !field.key || !mutuallyExclusiveFieldKeys.has(field.key)\n );\n \n // 验证互斥字段组:每个互斥组至少填写一个即可\n // 如果没有互斥组,默认为 true\n let allMutuallyExclusiveGroupsValid = mutuallyExclusiveGroups.length === 0 ? true : true;\n for (const group of mutuallyExclusiveGroups) {\n const visibleGroupFields = group.filter(field => {\n // 检查字段是否可见(使用与 visibleRequiredFields 相同的逻辑)\n if (!editorRef.current) return false;\n if (field.exclusionGroup) {\n const groupElements = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-group=\"${field.exclusionGroup}\"]`\n );\n if (groupElements.length > 0) {\n return groupElements[0].style.display !== 'none';\n }\n }\n return true;\n });\n \n // 如果互斥组没有可见字段,认为这个组是有效的(因为用户无法填写)\n if (visibleGroupFields.length === 0) {\n continue;\n }\n \n let hasAnyValid = false;\n for (const field of visibleGroupFields) {\n if (field.type === 'upload' && field.key) {\n if (files[field.key] !== null && files[field.key] !== undefined) {\n hasAnyValid = true;\n break;\n }\n } else if (field.type === 'variable' && field.key) {\n if (field.isMultiVariable) {\n const multiVariableEls = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${field.key}\"]`\n );\n let filledCount = 0;\n for (const el of Array.from(multiVariableEls)) {\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (el.classList.contains('show-placeholder')) {\n continue;\n }\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n filledCount += 1;\n }\n }\n const need = field.minCount && field.minCount > 0 ? field.minCount : 1;\n if (filledCount >= need) {\n hasAnyValid = true;\n break;\n }\n } else {\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${field.key}\"]`\n );\n if (variableEl) {\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (variableEl.classList.contains('show-placeholder')) {\n continue;\n }\n const text = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n }\n } else if (field.type === 'select' && field.key) {\n const selectEl = editorRef.current.querySelector<HTMLSelectElement>(\n `[data-type=\"select\"][data-key=\"${field.key}\"]`\n );\n if (selectEl) {\n const val = (selectEl.value || \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n } else if (field.type === 'textarea' && field.key) {\n const textareaEl = editorRef.current.querySelector<HTMLTextAreaElement>(\n `[data-type=\"textarea\"][data-key=\"${field.key}\"]`\n );\n if (textareaEl) {\n const val = (textareaEl.value || \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n } else if (field.type === 'richtext' && field.key) {\n const richtextEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"richtext\"][data-key=\"${field.key}\"]`\n );\n if (richtextEl) {\n const val = (richtextEl.textContent || \"\").replace(/[\\u200B]/g, \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n } else if (field.type === 'datepicker' && field.key) {\n const dpEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"datepicker\"][data-key=\"${field.key}\"]`\n );\n if (dpEl) {\n const val = (dpEl.getAttribute('data-value') || \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n }\n }\n \n if (!hasAnyValid) {\n allMutuallyExclusiveGroupsValid = false;\n break;\n }\n }\n \n // 验证非互斥字段:所有字段都必须填写\n let allNonExclusiveFieldsValid = true;\n for (const field of nonExclusiveFields) {\n if (field.type === 'upload' && field.key) {\n if (files[field.key] === null || files[field.key] === undefined) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'variable' && field.key) {\n if (field.isMultiVariable) {\n // multi-variable 类型:检查所有相关输入框,至少满足 minCount(默认1)\n const multiVariableEls = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${field.key}\"]`\n );\n let filledCount = 0;\n for (const el of Array.from(multiVariableEls)) {\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (el.classList.contains('show-placeholder')) {\n continue;\n }\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n filledCount += 1;\n }\n }\n const need = field.minCount && field.minCount > 0 ? field.minCount : 1;\n if (filledCount < need) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else {\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${field.key}\"]`\n );\n if (!variableEl) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (variableEl.classList.contains('show-placeholder')) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n const text = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n }\n } else if (field.type === 'select' && field.key) {\n const selectEl = editorRef.current.querySelector<HTMLSelectElement>(\n `[data-type=\"select\"][data-key=\"${field.key}\"]`\n );\n if (!selectEl || (selectEl.value || \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'textarea' && field.key) {\n const textareaEl = editorRef.current.querySelector<HTMLTextAreaElement>(\n `[data-type=\"textarea\"][data-key=\"${field.key}\"]`\n );\n if (!textareaEl || (textareaEl.value || \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'richtext' && field.key) {\n const richtextEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"richtext\"][data-key=\"${field.key}\"]`\n );\n if (!richtextEl || (richtextEl.textContent || \"\").replace(/[\\u200B]/g, \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'datepicker' && field.key) {\n const dpEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"datepicker\"][data-key=\"${field.key}\"]`\n );\n if (!dpEl || (dpEl.getAttribute('data-value') || \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n }\n }\n \n // 合并验证结果:互斥组和非互斥字段都必须通过验证\n setIsFormValid(allMutuallyExclusiveGroupsValid && allNonExclusiveFieldsValid);\n}\n\n","import type React from 'react';\n\n/**\n * 更新占位符与零宽字符\n */\nexport function updatePlaceholders(\n editorRef: React.RefObject<HTMLDivElement | null>,\n forceActiveElement?: HTMLElement\n): void {\n if (!editorRef.current) return;\n\n const chips =\n editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n chips.forEach((el) => {\n const rawText = el.innerText.replace(/\\n/g, \"\");\n const cleanText = rawText.replace(/\\u200B/g, \"\");\n\n if (!cleanText) {\n // 如果实际上没有内容,则强制显示零宽字符以保持高度\n if (rawText !== \"\\u200B\") {\n el.innerText = \"\\u200B\";\n }\n el.classList.add(\"show-placeholder\");\n } else {\n // 如果有内容,移除 placeholder 样式\n el.classList.remove(\"show-placeholder\");\n }\n });\n\n if (forceActiveElement) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(forceActiveElement);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n}\n\n","import type React from 'react';\nimport type { InputNode } from './types';\n\n/**\n * 初始化编辑器内容\n * @param editorRef 编辑器引用\n * @param config 配置\n * @param files 文件\n * @param lockStructure 是否锁定结构\n * @param variableValues 变量值\n * @param multiVariableCounts 多输入框计数\n * @param hideButtons 隐藏按钮\n */\nexport function initializeEditorContent(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n lockStructure: boolean,\n variableValues: Record<string, string>,\n multiVariableCounts: Record<string, number> = {},\n hideButtons?: 'hideAgent' | 'hideTagClose'\n): void {\n if (!editorRef.current) return;\n\n let html = \"\";\n let i = 0;\n\n while (i < config.length) {\n const node = config[i];\n const nextNode = i + 1 < config.length ? config[i + 1] : null;\n \n // 检查是否是必填图标\n const isRequiredIcon = node.type === \"text\" && \n (node.text?.includes(\"icon-bitian\") || node.className === \"rte-text-required\");\n \n if (isRequiredIcon && nextNode) {\n // 检查必填图标后跟上传按钮的组合 (fileInput)\n const isNextUpload = nextNode.type === \"upload\" && \n nextNode.exclusionGroup === \"fileInput\" &&\n node.exclusionGroup === \"fileInput\" &&\n node.exclusionGroup === nextNode.exclusionGroup;\n\n // 检查必填图标后跟 variable 的组合 (textInput)\n const isNextVariable = nextNode.type === \"variable\" && \n nextNode.exclusionGroup === \"textInput\" &&\n node.exclusionGroup === \"textInput\" &&\n node.exclusionGroup === nextNode.exclusionGroup;\n\n // 如果是必填图标+上传按钮的组合,将它们包裹在一起\n if (isNextUpload) {\n const groupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n const wrapperStart = `<span ${groupAttr} class=\"exclusion-wrapper required-upload-group\">`;\n const wrapperEnd = `</span>`;\n\n // 生成必填图标 HTML\n let requiredIconHtml = \"\";\n if (node.className) {\n requiredIconHtml = `<span class=\"${node.className}\">${node.text ?? \"\"}</span>`;\n } else {\n requiredIconHtml = node.text ?? \"\";\n }\n\n // 生成上传按钮 HTML\n const uploadNode = nextNode;\n const hasFile = files[uploadNode.key!] !== null && files[uploadNode.key!] !== undefined;\n const fileObj = hasFile ? (files[uploadNode.key!] as File) : null;\n const fileName = hasFile ? files[uploadNode.key!]?.name : uploadNode.text;\n const showRemoveBtn = hasFile ? \"\" : \"hidden\";\n const showInfoIcon = uploadNode.tooltip && !hasFile ? \"\" : \"hidden\";\n const hasFileClass = hasFile ? \"has-file\" : \"\";\n // 当有文件时,为 upload-label 添加 data-file-name 属性用于 tooltip\n const fileNameAttr = hasFile && fileName \n ? ` data-file-name=\"${fileName.replace(/\"/g, '"')}\"`\n : \"\";\n \n let uploadIcon = \"\";\n if (hasFile && fileObj) {\n if (fileObj.type?.startsWith(\"image/\")) {\n const url = URL.createObjectURL(fileObj);\n uploadIcon = `<img class=\"upload-icon-img upload-icon-preview\" src=\"${url}\" alt=\"preview\" />`;\n } else {\n uploadIcon = \"<i class='iconfont icon-exlwenjian'></i>\";\n }\n }\n \n const uploadHtml = `<span contenteditable=\"false\" data-type=\"upload\" data-key=\"${uploadNode.key}\" class=\"upload-chip\"><span class=\"upload-inner-wrapper ${hasFileClass}\"><span class=\"upload-icon\">${uploadIcon}</span><span class=\"upload-label\"${fileNameAttr}>${fileName || uploadNode.text}</span>${uploadNode.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi upload-info-icon ${showInfoIcon}\" data-upload-key=\"${uploadNode.key}\" data-tooltip=\"${uploadNode.tooltip}\" title=\"提示\"></i>` : \"\"}<span class=\"file-remove-btn ${showRemoveBtn}\" title=\"移除文件\">×</span></span></span>`;\n\n // 直接连接,CSS 会确保它们作为一个整体换行\n html += wrapperStart + requiredIconHtml + uploadHtml + wrapperEnd;\n i += 2; // 跳过两个节点\n continue;\n }\n\n // 如果是必填图标+variable 的组合,将它们包裹在一起\n if (isNextVariable) {\n const groupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n const wrapperStart = `<span ${groupAttr} class=\"exclusion-wrapper required-upload-group\">`;\n const wrapperEnd = `</span>`;\n\n // 生成必填图标 HTML\n let requiredIconHtml = \"\";\n if (node.className) {\n requiredIconHtml = `<span class=\"${node.className}\">${node.text ?? \"\"}</span>`;\n } else {\n requiredIconHtml = node.text ?? \"\";\n }\n\n // 生成 variable HTML\n const variableNode = nextNode;\n // 优先使用保存的值,如果没有则使用配置中的初始值\n const savedValue = variableNode.key ? variableValues[variableNode.key] : undefined;\n const initialText = savedValue || variableNode.text || \"\";\n const isPlaceholder = !initialText;\n const displayText = isPlaceholder ? \"\\u200B\" : initialText;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n const variableGroupAttr = variableNode.exclusionGroup\n ? ` data-group=\"${variableNode.exclusionGroup}\"`\n : \"\";\n\n const tooltipAttr = variableNode.tooltip \n ? ` data-tooltip=\"${variableNode.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${variableNode.key || ''}\"`\n : '';\n // 只有在没有值且有 tooltip 配置时才显示叹号图标\n const showInfoIcon = variableNode.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${\n variableNode.key\n }\" data-placeholder=\"${\n variableNode.placeholder || \"\"\n }\"${variableGroupAttr}${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${variableNode.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${variableNode.key}\" data-tooltip=\"${variableNode.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n\n // 直接连接,CSS 会确保它们作为一个整体换行\n html += wrapperStart + requiredIconHtml + variableHtml + wrapperEnd;\n i += 2; // 跳过两个节点\n continue;\n }\n }\n\n // 普通节点的处理\n const groupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n const wrapperStart = node.exclusionGroup\n ? `<span ${groupAttr} class=\"exclusion-wrapper\">`\n : \"\";\n const wrapperEnd = node.exclusionGroup ? `</span>` : \"\";\n\n let nodeHtml = \"\";\n\n // TAG: 评价分析 Chip\n if (node.type === \"tag\") {\n // 如果 hideButtons 为 'hideTagClose',隐藏关闭按钮\n const shouldHideTagClose = hideButtons === 'hideTagClose';\n const closeBtnHtml = (lockStructure || shouldHideTagClose)\n ? \"\" \n : `<span class=\"tag-close-btn\" title=\"Clear (ESC)\"><svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></span>`;\n const lockedAttr = lockStructure ? ' data-locked=\"true\"' : '';\n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-tag-key=\"${node.key || ''}\"`\n : '';\n nodeHtml = `<span contenteditable=\"false\" class=\"tag-node group\"${lockedAttr}${tooltipAttr}><span class=\"tag-label\">${node.text}</span>${closeBtnHtml}</span>`;\n }\n // TEXT: 普通文本\n else if (node.type === \"text\") {\n const lockedAttr = lockStructure ? ' data-locked=\"true\" contenteditable=\"false\"' : ' contenteditable=\"false\"';\n const rawText = node.text ?? \"\";\n const textWithBreak = rawText.replace(/\\n/g, \"<br/>\");\n if (node.className) {\n nodeHtml = `<span class=\"${node.className}\"${lockedAttr}>${textWithBreak}</span>`;\n } else {\n nodeHtml = lockStructure \n ? `<span${lockedAttr}>${textWithBreak}</span>`\n : `<span contenteditable=\"false\">${textWithBreak}</span>`;\n }\n }\n // VARIABLE: 内联输入块\n else if (node.type === \"variable\" && node.key) {\n // 优先使用保存的值,如果没有则使用配置中的初始值\n const savedValue = variableValues[node.key];\n const initialText = savedValue || node.text || \"\";\n const isPlaceholder = !initialText;\n const displayText = isPlaceholder ? \"\\u200B\" : initialText;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n const groupAttr = node.exclusionGroup\n ? ` data-group=\"${node.exclusionGroup}\"`\n : \"\";\n\n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${node.key || ''}\"`\n : '';\n // 只有在没有值且有 tooltip 配置时才显示叹号图标\n const showInfoIcon = node.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${\n node.key\n }\" data-placeholder=\"${\n node.placeholder || \"\"\n }\"${groupAttr}${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${node.key}\" data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n\n // 如果是必填项,自动添加必填图标并包裹\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${variableHtml}</span>`;\n } else {\n nodeHtml = variableHtml;\n }\n }\n // UPLOAD: 上传按钮\n else if (node.type === \"upload\" && node.key) {\n const hasFile = files[node.key] !== null && files[node.key] !== undefined;\n const fileObj = hasFile ? (files[node.key] as File) : null;\n const fileName = hasFile ? files[node.key]?.name : node.text;\n const showRemoveBtn = hasFile ? \"\" : \"hidden\";\n // 只有在没有文件且有 tooltip 配置时才显示叹号图标\n const showInfoIcon = node.tooltip && !hasFile ? \"\" : \"hidden\";\n const hasFileClass = hasFile ? \"has-file\" : \"\";\n // 当有文件时,为 upload-label 添加 data-file-name 属性用于 tooltip\n const fileNameAttr = hasFile && fileName \n ? ` data-file-name=\"${fileName.replace(/\"/g, '"')}\"`\n : \"\";\n \n let uploadIcon = \"\";\n if (hasFile && fileObj) {\n if (fileObj.type?.startsWith(\"image/\")) {\n const url = URL.createObjectURL(fileObj);\n uploadIcon = `<img class=\"upload-icon-img upload-icon-preview\" src=\"${url}\" alt=\"preview\" />`;\n } else {\n uploadIcon = \"<i class='iconfont icon-exlwenjian'></i>\";\n }\n }\n const uploadHtml = `<span contenteditable=\"false\" data-type=\"upload\" data-key=\"${node.key}\" class=\"upload-chip\"><span class=\"upload-inner-wrapper ${hasFileClass}\"><span class=\"upload-icon\">${uploadIcon}</span><span class=\"upload-label\"${fileNameAttr}>${fileName || node.text}</span>${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi upload-info-icon ${showInfoIcon}\" data-upload-key=\"${node.key}\" data-tooltip=\"${node.tooltip}\" title=\"提示\"></i>` : \"\"}<span class=\"file-remove-btn ${showRemoveBtn}\" title=\"移除文件\">×</span></span></span>`;\n\n // 如果是必填项,自动添加必填图标并包裹\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${uploadHtml}</span>`;\n } else {\n nodeHtml = uploadHtml;\n }\n }\n // SELECT: 下拉选择\n else if (node.type === \"select\" && node.key) {\n const savedValue = variableValues[node.key] || node.defaultValue || \"\";\n const optionsHtml = (node.options || []).map(opt => {\n const selected = savedValue === opt.value ? \"selected\" : \"\";\n return `<option value=\"${opt.value}\" ${selected}>${opt.label}</option>`;\n }).join(\"\");\n \n const placeholderOption = node.placeholder\n ? `<option value=\"\" ${savedValue ? \"\" : \"selected\"} disabled hidden>${node.placeholder}</option>`\n : \"\";\n \n const selectHtml = `<select data-type=\"select\" data-key=\"${node.key}\" class=\"rte-select\">${placeholderOption}${optionsHtml}</select>`;\n \n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${selectHtml}</span>`;\n } else {\n nodeHtml = selectHtml;\n }\n }\n // TEXTAREA: 长文本输入\n else if (node.type === \"textarea\" && node.key) {\n const savedValue = variableValues[node.key] || \"\";\n const maxHeight = node.maxHeight || 252;\n const expandable = node.expandable !== false;\n const placeholderAttr = node.placeholder ? ` placeholder=\"${node.placeholder}\"` : \"\";\n const textareaHtml = `<textarea data-type=\"textarea\" data-key=\"${node.key}\" class=\"rte-textarea\" data-max-height=\"${maxHeight}\" style=\"max-height:${maxHeight}px;\"${placeholderAttr}>${savedValue}</textarea>`;\n const toggleBtn = expandable\n ? `<button type=\"button\" class=\"rte-textarea-toggle\" data-key=\"${node.key}\" data-expanded=\"false\">展开</button>`\n : \"\";\n const wrapper = `<div class=\"rte-textarea-wrapper\" data-key=\"${node.key}\">${textareaHtml}${toggleBtn}</div>`;\n \n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${wrapper}</span>`;\n } else {\n nodeHtml = wrapper;\n }\n }\n // RICHTEXT: 富文本块(contenteditable)\n else if (node.type === \"richtext\" && node.key) {\n const savedValue = variableValues[node.key] || node.text || \"\";\n const minHeight = node.minHeight || 140;\n const placeholderAttr = node.placeholder ? ` data-placeholder=\"${node.placeholder}\"` : \"\";\n const expandable = node.expandable !== false;\n const richContent = savedValue;\n const richHtml = `<div contenteditable=\"true\" data-type=\"richtext\" data-key=\"${node.key}\" class=\"rte-richtext\"${placeholderAttr} style=\"min-height:${minHeight}px;\">${richContent}</div>`;\n const toggleBtn = expandable\n ? `<button type=\"button\" class=\"rte-richtext-toggle\" data-key=\"${node.key}\" data-expanded=\"false\">展开</button>`\n : \"\";\n const wrapper = `<div class=\"rte-richtext-wrapper\" data-key=\"${node.key}\">${richHtml}${toggleBtn}</div>`;\n const container = `<div class=\"rte-richtext-container\" data-key=\"${node.key}\">${wrapper}</div>`;\n \n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<div ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group rte-richtext-required\">${requiredIconHtml}${container}</div>`;\n } else {\n nodeHtml = container;\n }\n }\n // DATEPICKER: 时间选择\n else if (node.type === \"datepicker\" && node.key) {\n const savedValue = variableValues[node.key] || \"\";\n const placeholderAttr = node.placeholder ? ` data-placeholder=\"${node.placeholder}\"` : \"\";\n const limitRangeAttr = node.limitRange ? ` data-limit-range=\"${node.limitRange}\"` : \"\";\n const disableFutureAttr = node.disableFuture ? ` data-disable-future=\"true\"` : \"\";\n const pickerHost = `<div data-type=\"datepicker\" data-key=\"${node.key}\" data-value=\"${savedValue}\" class=\"rte-datepicker-host\"${placeholderAttr}${limitRangeAttr}${disableFutureAttr}></div>`;\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${pickerHost}</span>`;\n } else {\n nodeHtml = pickerHost;\n }\n }\n // MULTI-VARIABLE: 多输入框(动态添加)\n else if (node.type === \"multi-variable\" && node.key) {\n const maxCount = node.maxCount || 9;\n const count = multiVariableCounts[node.key] || 1;\n const actualCount = Math.min(count, maxCount);\n \n // 如果是必填项,红色星号只和第一个输入框包裹在一起\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n \n let multiVariableHtml = \"\";\n for (let idx = 0; idx < actualCount; idx++) {\n const itemKey = `${node.key}_${idx}`;\n const savedValue = variableValues[itemKey] || \"\";\n const isPlaceholder = !savedValue;\n const displayText = isPlaceholder ? \"\\u200B\" : savedValue;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n \n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${node.key || ''}\"`\n : '';\n const showInfoIcon = node.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${itemKey}\" data-multi-key=\"${node.key}\" data-index=\"${idx}\" data-placeholder=\"${node.placeholder || \"\"}\"${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${node.key}\" data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n \n if (idx === 0) {\n // 第一个输入框和必填星号包裹在一起\n multiVariableHtml += `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group required-multi-first\">${requiredIconHtml}${variableHtml}</span>`;\n } else {\n // 其他输入框直接添加,可以自由换行\n multiVariableHtml += variableHtml;\n }\n }\n nodeHtml = multiVariableHtml;\n } else {\n // 非必填项,所有输入框直接添加\n let multiVariableHtml = \"\";\n for (let idx = 0; idx < actualCount; idx++) {\n const itemKey = `${node.key}_${idx}`;\n const savedValue = variableValues[itemKey] || \"\";\n const isPlaceholder = !savedValue;\n const displayText = isPlaceholder ? \"\\u200B\" : savedValue;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n \n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${node.key || ''}\"`\n : '';\n const showInfoIcon = node.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${itemKey}\" data-multi-key=\"${node.key}\" data-index=\"${idx}\" data-placeholder=\"${node.placeholder || \"\"}\"${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${node.key}\" data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n multiVariableHtml += variableHtml;\n }\n nodeHtml = multiVariableHtml;\n }\n }\n\n html += wrapperStart + nodeHtml + wrapperEnd;\n i++;\n }\n\n if (editorRef.current) {\n editorRef.current.innerHTML = html;\n \n // 更新占位符,确保有内容的 variable 不显示 placeholder\n setTimeout(() => {\n if (!editorRef.current) return;\n const chips = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n chips.forEach((el) => {\n const rawText = el.innerText.replace(/\\n/g, \"\");\n const cleanText = rawText.replace(/\\u200B/g, \"\");\n if (!cleanText) {\n if (rawText !== \"\\u200B\") {\n el.innerText = \"\\u200B\";\n }\n el.classList.add(\"show-placeholder\");\n } else {\n el.classList.remove(\"show-placeholder\");\n }\n });\n }, 0);\n }\n}\n\n","import { useEffect, useCallback, useRef } from 'react';\nimport type React from 'react';\nimport type { InputNode } from './types';\nimport { initializeEditorContent as initEditorContent } from './htmlGenerator';\nimport { checkExclusionStates } from './exclusionLogic';\nimport { validateRequiredFields } from './validation';\n\n/**\n * 初始化编辑器内容的 hook\n */\nexport function useInitializeEditorContent(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n lockStructure: boolean,\n multiVariableCounts: Record<string, number> = {},\n savedCursorRef?: React.MutableRefObject<{ key: string; offset: number } | null>,\n lockedMultiVariables?: Set<string>,\n hideButtons?: 'hideAgent' | 'hideTagClose'\n) {\n const initializeEditorContent = useCallback(() => {\n if (!editorRef.current) return;\n \n // 如果 config 为空,清空编辑器内容,回到纯文本模式\n if (config.length === 0) {\n editorRef.current.innerHTML = \"\";\n // 重置编辑器高度,避免退出智能体后高度异常\n editorRef.current.style.height = 'auto';\n editorRef.current.style.minHeight = '';\n return;\n }\n\n // 检查是否有临时保存的 variableValues(用于删除操作时的数据恢复或智能体切换时的数据恢复)\n let variableValues: Record<string, string> = {};\n const editorElement = editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> };\n const tempValues = editorElement.__tempVariableValues;\n if (tempValues) {\n variableValues = tempValues;\n // 延迟清除临时值,确保在多次调用时(如 files 和 multiVariableCounts 更新时)仍能读取到\n // 使用 setTimeout 确保在下一个事件循环中清除\n setTimeout(() => {\n if (editorRef.current) {\n const el = editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> };\n if (el.__tempVariableValues === tempValues) {\n delete el.__tempVariableValues;\n }\n }\n }, 100);\n } else {\n // 在重新生成 HTML 之前,先保存当前值(variable/select/textarea)\n const existingVariables = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n existingVariables.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n const existingSelects = editorRef.current.querySelectorAll<HTMLSelectElement>('[data-type=\"select\"]');\n existingSelects.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const existingTextareas = editorRef.current.querySelectorAll<HTMLTextAreaElement>('[data-type=\"textarea\"]');\n existingTextareas.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.replace(/[\\u200B]/g, \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const existingRichtexts = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"richtext\"]');\n existingRichtexts.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = (el.textContent || \"\").replace(/[\\u200B]/g, \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const existingDatepickers = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"datepicker\"]');\n existingDatepickers.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = (el.getAttribute('data-value') || \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n }\n\n initEditorContent(editorRef, config, files, lockStructure, variableValues, multiVariableCounts, hideButtons);\n \n // 在 HTML 重新生成后,恢复光标位置\n if (savedCursorRef?.current) {\n const { key, offset } = savedCursorRef.current;\n setTimeout(() => {\n if (!editorRef.current) return;\n \n const targetVariable = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"]`\n );\n \n if (targetVariable) {\n try {\n const range = document.createRange();\n const walker = document.createTreeWalker(\n targetVariable,\n NodeFilter.SHOW_TEXT,\n null\n );\n \n let currentOffset = 0;\n let targetNode: Node | null = null;\n let targetOffset = 0;\n \n while (walker.nextNode()) {\n const node = walker.currentNode;\n const nodeLength = node.textContent?.length || 0;\n \n if (currentOffset + nodeLength >= offset) {\n targetNode = node;\n targetOffset = offset - currentOffset;\n break;\n }\n \n currentOffset += nodeLength;\n }\n \n if (targetNode) {\n range.setStart(targetNode, Math.min(targetOffset, targetNode.textContent?.length || 0));\n range.collapse(true);\n \n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n targetVariable.focus();\n }\n } else {\n // 如果找不到文本节点,将光标放在末尾\n range.selectNodeContents(targetVariable);\n range.collapse(false);\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n targetVariable.focus();\n }\n }\n } catch {\n // 如果恢复失败,将光标移动到当前输入框的末尾\n const range = document.createRange();\n range.selectNodeContents(targetVariable);\n range.collapse(false);\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n targetVariable.focus();\n }\n }\n \n // 清除保存的光标信息\n savedCursorRef.current = null;\n }\n }, 0);\n }\n \n // 恢复 multi-variable 的锁定状态\n if (lockedMultiVariables && lockedMultiVariables.size > 0) {\n setTimeout(() => {\n if (!editorRef.current) return;\n \n lockedMultiVariables.forEach((multiKey) => {\n const allInputs = editorRef.current!.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${multiKey}\"]`\n );\n \n // 检查所有输入框是否都有值\n let allHaveValues = true;\n allInputs.forEach((el) => {\n const val = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (!val) {\n allHaveValues = false;\n }\n });\n \n if (allHaveValues && allInputs.length > 0) {\n // 设置所有输入框为不可编辑\n allInputs.forEach((el) => {\n el.setAttribute('contenteditable', 'false');\n el.classList.add('multi-variable-locked');\n });\n \n // 查找容器并添加删除按钮\n const container = allInputs[0].closest('.required-upload-group') || allInputs[0].parentElement;\n if (container && !container.querySelector('.multi-variable-close-btn')) {\n const closeBtn = document.createElement('span');\n closeBtn.className = 'multi-variable-close-btn';\n closeBtn.setAttribute('contenteditable', 'false');\n closeBtn.setAttribute('title', '删除');\n closeBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>';\n closeBtn.setAttribute('data-multi-key', multiKey);\n container.appendChild(closeBtn);\n }\n }\n });\n }, 0);\n }\n }, [config, files, lockStructure, editorRef, multiVariableCounts, savedCursorRef, lockedMultiVariables, hideButtons]);\n\n useEffect(() => {\n initializeEditorContent();\n }, [initializeEditorContent]);\n}\n\n/**\n * 绑定上传按钮叹号图标的 Tooltip\n */\nexport function useUploadInfoTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'upload' | 'upload-preview' } | null) => void\n) {\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 使用事件委托,在父元素上绑定事件,避免每次 DOM 更新后重新绑定\n const handleMouseOver = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.upload-info-icon') as HTMLElement | null;\n if (target && target.classList.contains('upload-info-icon')) {\n const key = target.dataset.uploadKey;\n if (key) {\n setPopoverVisible({ key, anchorEl: target, type: 'upload' });\n }\n return;\n }\n\n const uploadChip = (e.target as HTMLElement)?.closest('[data-type=\"upload\"]') as HTMLElement | null;\n if (uploadChip) {\n const key = uploadChip.dataset.key;\n if (key) {\n const file = files[key];\n if (file && file.type && file.type.startsWith('image/')) {\n setPopoverVisible({ key, anchorEl: uploadChip, type: 'upload-preview' });\n }\n }\n }\n };\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.upload-info-icon') as HTMLElement | null;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n // 只有当鼠标离开 upload-info-icon 且没有进入 tooltip 时才隐藏\n if (target && target.classList.contains('upload-info-icon')) {\n // 检查 relatedTarget 是否还在 editor 内部\n if (!relatedTarget || !editor.contains(relatedTarget)) {\n setPopoverVisible(null);\n } else {\n // 如果 relatedTarget 不是 upload-info-icon,也隐藏\n const relatedIcon = relatedTarget.closest('.upload-info-icon') as HTMLElement | null;\n if (!relatedIcon) {\n setPopoverVisible(null);\n }\n }\n return;\n }\n\n const uploadChip = (e.target as HTMLElement)?.closest('[data-type=\"upload\"]') as HTMLElement | null;\n if (uploadChip) {\n const related = relatedTarget as HTMLElement | null;\n if (related && uploadChip.contains(related)) {\n return;\n }\n setPopoverVisible(null);\n }\n };\n\n editor.addEventListener(\"mouseover\", handleMouseOver, true);\n editor.addEventListener(\"mouseout\", handleMouseOut, true);\n\n return () => {\n editor.removeEventListener(\"mouseover\", handleMouseOver, true);\n editor.removeEventListener(\"mouseout\", handleMouseOut, true);\n };\n }, [config, files, editorRef, setPopoverVisible]);\n}\n\n/**\n * 绑定 tag 节点的 Tooltip\n */\nexport function useTagTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'tag' } | null) => void,\n hideButtons?: 'hideAgent' | 'hideTagClose'\n) {\n useEffect(() => {\n if (!editorRef.current) return;\n\n const handleMouseEnter = (e: MouseEvent) => {\n // 如果 hideButtons 为 'hideTagClose',不显示 tooltip\n if (hideButtons === 'hideTagClose') {\n return;\n }\n const target = e.currentTarget as HTMLElement;\n const tooltip = target.dataset.tooltip;\n const key = target.dataset.tagKey || '';\n if (tooltip) {\n setPopoverVisible({ key, anchorEl: target, type: 'tag' });\n }\n };\n\n const handleMouseLeave = () => {\n setPopoverVisible(null);\n };\n\n // 使用 requestAnimationFrame 确保在 DOM 更新完成后再绑定事件\n let rafId: number;\n const bindEvents = () => {\n if (!editorRef.current) return;\n\n const tagNodes = editorRef.current.querySelectorAll<HTMLElement>(\n \".tag-node[data-tooltip]\"\n );\n\n tagNodes.forEach((tagNode) => {\n tagNode.addEventListener(\"mouseenter\", handleMouseEnter);\n tagNode.addEventListener(\"mouseleave\", handleMouseLeave);\n });\n };\n\n rafId = requestAnimationFrame(() => {\n rafId = requestAnimationFrame(bindEvents);\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n // 清理所有事件监听器\n if (editorRef.current) {\n const tagNodes = editorRef.current.querySelectorAll<HTMLElement>(\n \".tag-node[data-tooltip]\"\n );\n tagNodes.forEach((tagNode) => {\n tagNode.removeEventListener(\"mouseenter\", handleMouseEnter);\n tagNode.removeEventListener(\"mouseleave\", handleMouseLeave);\n });\n }\n };\n }, [config, editorRef, setPopoverVisible, hideButtons]);\n}\n\n/**\n * 绑定 variable 节点叹号图标的 Tooltip\n */\nexport function useVariableTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'variable' } | null) => void\n) {\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 使用事件委托,在父元素上绑定事件,避免每次 DOM 更新后重新绑定\n const handleMouseOver = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.variable-info-icon') as HTMLElement | null;\n if (target && target.classList.contains('variable-info-icon')) {\n const key = target.dataset.variableKey;\n if (key) {\n setPopoverVisible({ key, anchorEl: target, type: 'variable' });\n }\n }\n };\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.variable-info-icon') as HTMLElement | null;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n // 只有当鼠标离开 variable-info-icon 且没有进入 tooltip 时才隐藏\n if (target && target.classList.contains('variable-info-icon')) {\n // 检查 relatedTarget 是否还在 editor 内部\n if (!relatedTarget || !editor.contains(relatedTarget)) {\n setPopoverVisible(null);\n } else {\n // 如果 relatedTarget 不是 variable-info-icon,也隐藏\n const relatedIcon = relatedTarget.closest('.variable-info-icon') as HTMLElement | null;\n if (!relatedIcon) {\n setPopoverVisible(null);\n }\n }\n }\n };\n\n editor.addEventListener(\"mouseover\", handleMouseOver, true);\n editor.addEventListener(\"mouseout\", handleMouseOut, true);\n\n return () => {\n editor.removeEventListener(\"mouseover\", handleMouseOver, true);\n editor.removeEventListener(\"mouseout\", handleMouseOut, true);\n };\n }, [config, editorRef, setPopoverVisible]);\n}\n\n/**\n * 绑定上传文件 label 的 Tooltip(当文件名超长时)\n */\nexport function useUploadLabelTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'upload-label' } | null) => void\n) {\n useEffect(() => {\n if (!editorRef.current) return;\n\n const handleMouseEnter = (e: MouseEvent) => {\n const target = e.currentTarget as HTMLElement;\n const fileName = target.dataset.fileName;\n if (fileName) {\n setPopoverVisible({ key: '', anchorEl: target, type: 'upload-label' });\n }\n };\n\n const handleMouseLeave = () => {\n setPopoverVisible(null);\n };\n\n // 使用 requestAnimationFrame 确保在 DOM 更新完成后再绑定事件\n let rafId: number;\n const bindEvents = () => {\n if (!editorRef.current) return;\n\n const uploadLabels = editorRef.current.querySelectorAll<HTMLElement>(\n \".upload-label[data-file-name]\"\n );\n\n uploadLabels.forEach((label) => {\n label.addEventListener(\"mouseenter\", handleMouseEnter);\n label.addEventListener(\"mouseleave\", handleMouseLeave);\n });\n };\n\n rafId = requestAnimationFrame(() => {\n rafId = requestAnimationFrame(bindEvents);\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n // 清理所有事件监听器\n if (editorRef.current) {\n const uploadLabels = editorRef.current.querySelectorAll<HTMLElement>(\n \".upload-label[data-file-name]\"\n );\n uploadLabels.forEach((label) => {\n label.removeEventListener(\"mouseenter\", handleMouseEnter);\n label.removeEventListener(\"mouseleave\", handleMouseLeave);\n });\n }\n };\n }, [config, files, editorRef, setPopoverVisible]);\n}\n\n/**\n * 检查互斥逻辑和验证必填字段\n */\nexport function useExclusionAndValidation(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setIsFormValid: (valid: boolean) => void\n) {\n useEffect(() => {\n // 延迟执行验证,确保 HTML 已经生成(特别是 select 的 defaultValue)\n const timer = setTimeout(() => {\n checkExclusionStates(editorRef, config, files);\n validateRequiredFields(editorRef, config, files, setIsFormValid);\n }, 0);\n \n return () => clearTimeout(timer);\n }, [files, config, editorRef, setIsFormValid]);\n}\n\n/**\n * 监听选择变化,确保光标只能在 variable 内部(仅在点击时,不影响文本选择)\n */\nexport function useSelectionControl(\n editorRef: React.RefObject<HTMLDivElement | null>,\n isDraggingRef: React.RefObject<boolean>\n) {\n // 必须在 hook 顶层使用 useRef,不能在 useEffect 内部\n const datePickerInteractionRef = useRef<number>(0);\n\n useEffect(() => {\n if (!editorRef.current) return;\n\n let isMouseDown = false;\n let lastClickTime = 0;\n\n const isDatePickerTarget = (el: EventTarget | null) => {\n if (!(el instanceof HTMLElement)) return false;\n return Boolean(\n el.closest('.rte-datepicker-wrapper') ||\n el.closest('.rte-datepicker-host') ||\n el.closest('.ant-picker') ||\n el.closest('.ant-picker-dropdown')\n );\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n isMouseDown = true;\n if (isDatePickerTarget(e.target)) {\n datePickerInteractionRef.current = Date.now();\n console.log('[SelectionCtrl] mousedown on datepicker target');\n }\n };\n\n const handleMouseUp = () => {\n isMouseDown = false;\n lastClickTime = Date.now();\n };\n\n let isComposing = false; // 标记是否正在输入(中文输入法等)\n let lastInputTime = 0;\n\n const handleCompositionStart = () => {\n isComposing = true;\n };\n\n const handleCompositionEnd = () => {\n isComposing = false;\n lastInputTime = Date.now();\n };\n\n const handleInput = () => {\n lastInputTime = Date.now();\n };\n\n const handleFocusIn = (e: FocusEvent) => {\n if (isDatePickerTarget(e.target)) {\n datePickerInteractionRef.current = Date.now();\n console.log('[SelectionCtrl] focusin datepicker target');\n }\n };\n\n const handleSelectionChange = () => {\n // 如果最近与 DatePicker 交互(点击/聚焦),在短时间窗口内完全不干预\n if (Date.now() - datePickerInteractionRef.current < 800) {\n console.log('[SelectionCtrl] skip selectionchange due to recent datepicker interaction');\n return;\n }\n\n // 1. 检查 activeElement 是否是 DatePicker 的相关元素\n // 如果当前聚焦的是 DatePicker 的 input 或 dropdown,直接返回,不进行任何光标干预\n const activeEl = document.activeElement;\n if (activeEl) {\n if (activeEl.closest('.rte-datepicker-wrapper') || \n activeEl.closest('.rte-datepicker-host') || \n activeEl.closest('.ant-picker-dropdown') || // Antd dropdown\n (activeEl.tagName === 'INPUT' && activeEl.closest('.ant-picker')) // Antd picker input\n ) {\n console.log('[SelectionCtrl] activeElement is datepicker; skip');\n return;\n }\n }\n\n if (!editorRef.current) return;\n \n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n // 如果正在拖动,不干扰\n if (isDraggingRef.current) {\n return;\n }\n\n // 如果鼠标正在按下,不干扰(用户可能在选择文本)\n if (isMouseDown) {\n return;\n }\n\n // 如果正在输入(中文输入法等),不干扰\n if (isComposing) {\n return;\n }\n\n // 如果刚刚输入过(500ms 内),不干扰,避免在连续输入时干扰光标\n if (Date.now() - lastInputTime < 500) {\n return;\n }\n\n // 如果选择范围不是单个光标(有文本被选中),不干扰\n const range = selection.getRangeAt(0);\n if (!range.collapsed) {\n // 检查选中的内容是否在编辑器内部\n const isInEditor = editorRef.current.contains(range.commonAncestorContainer);\n if (!isInEditor) {\n // 如果选择在编辑器外部,不处理(避免影响外部输入框)\n return;\n }\n return;\n }\n\n const anchor = selection.anchorNode;\n if (!anchor) return;\n\n // 检查光标是否在编辑器内部\n if (!editorRef.current.contains(anchor)) {\n // 光标在编辑器外部,不处理(避免影响外部输入框)\n return;\n }\n\n // 检查光标是否在 DatePicker 内部(防止点击 DatePicker 时光标被强制移回)\n let isInDatePicker = false;\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n const el = anchor as HTMLElement;\n if (el.closest('[data-type=\"datepicker\"]') || el.closest('.rte-datepicker-wrapper') || el.closest('.rte-datepicker-host')) {\n isInDatePicker = true;\n }\n } else if (anchor.parentElement) {\n const el = anchor.parentElement;\n if (el.closest('[data-type=\"datepicker\"]') || el.closest('.rte-datepicker-wrapper') || el.closest('.rte-datepicker-host')) {\n isInDatePicker = true;\n }\n }\n \n if (isInDatePicker) {\n return;\n }\n\n // 检查光标是否在 variable 内部\n let variableNode: HTMLElement | null = null;\n \n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableNode = (anchor as HTMLElement).closest('[data-type=\"variable\"]');\n } else if (anchor.nodeType === Node.TEXT_NODE && (anchor as Text).parentElement) {\n variableNode = (anchor as Text).parentElement!.closest('[data-type=\"variable\"]');\n }\n\n // 如果光标不在 variable 内部,且是点击操作(不是拖动),移动到最近的 variable\n if (!variableNode) {\n // 只在点击后短时间内(500ms)才移动光标,避免干扰其他操作\n if (Date.now() - lastClickTime > 500) {\n return;\n }\n\n const variables = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n if (variables.length > 0) {\n // 找到最近的 variable(优先选择第一个可见的)\n let targetVariable: HTMLElement | null = null;\n for (const variable of Array.from(variables)) {\n if (variable.style.display !== 'none') {\n targetVariable = variable;\n break;\n }\n }\n // 如果所有 variable 都隐藏,使用第一个\n if (!targetVariable && variables.length > 0) {\n targetVariable = variables[0];\n }\n \n if (targetVariable) {\n const newRange = document.createRange();\n newRange.selectNodeContents(targetVariable);\n newRange.collapse(false); // 移动到末尾\n selection.removeAllRanges();\n selection.addRange(newRange);\n targetVariable.focus();\n } else {\n // 如果没有 variable,清除选择\n selection.removeAllRanges();\n }\n } else {\n // 如果没有 variable,清除选择\n selection.removeAllRanges();\n }\n }\n };\n\n // 在编辑器上监听输入事件\n const editor = editorRef.current;\n if (editor) {\n editor.addEventListener('compositionstart', handleCompositionStart);\n editor.addEventListener('compositionend', handleCompositionEnd);\n editor.addEventListener('input', handleInput);\n }\n\n document.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('focusin', handleFocusIn);\n document.addEventListener('selectionchange', handleSelectionChange);\n \n return () => {\n // 使用最新的 editorRef.current,因为 editor 可能在 cleanup 时已经改变\n const currentEditor = editorRef.current;\n if (currentEditor) {\n currentEditor.removeEventListener('compositionstart', handleCompositionStart);\n currentEditor.removeEventListener('compositionend', handleCompositionEnd);\n currentEditor.removeEventListener('input', handleInput);\n }\n document.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('focusin', handleFocusIn);\n document.removeEventListener('selectionchange', handleSelectionChange);\n };\n }, [editorRef, isDraggingRef]);\n}\n\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh_cn=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=_(e),d={name:\"zh-cn\",weekdays:\"星期日_星期一_星期二_星期三_星期四_星期五_星期六\".split(\"_\"),weekdaysShort:\"周日_周一_周二_周三_周四_周五_周六\".split(\"_\"),weekdaysMin:\"日_一_二_三_四_五_六\".split(\"_\"),months:\"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),ordinal:function(e,_){return\"W\"===_?e+\"周\":e+\"日\"},weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"YYYY/MM/DD\",LL:\"YYYY年M月D日\",LLL:\"YYYY年M月D日Ah点mm分\",LLLL:\"YYYY年M月D日ddddAh点mm分\",l:\"YYYY/M/D\",ll:\"YYYY年M月D日\",lll:\"YYYY年M月D日 HH:mm\",llll:\"YYYY年M月D日dddd HH:mm\"},relativeTime:{future:\"%s内\",past:\"%s前\",s:\"几秒\",m:\"1 分钟\",mm:\"%d 分钟\",h:\"1 小时\",hh:\"%d 小时\",d:\"1 天\",dd:\"%d 天\",M:\"1 个月\",MM:\"%d 个月\",y:\"1 年\",yy:\"%d 年\"},meridiem:function(e,_){var t=100*e+_;return t<600?\"凌晨\":t<900?\"早上\":t<1100?\"上午\":t<1300?\"中午\":t<1800?\"下午\":\"晚上\"}};return t.default.locale(d,null,!0),d}));","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nexport { _objectSpread2 as default };","export var commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport { commonLocale } from \"./common\";\nvar locale = _objectSpread(_objectSpread({}, commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nexport default locale;","const locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nexport default locale;","import CalendarLocale from \"rc-picker/es/locale/zh_CN\";\nimport TimePickerLocale from '../../time-picker/locale/zh_CN';\n// 统一合并为完整的 Locale\nconst locale = {\n lang: Object.assign({\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周']\n }, CalendarLocale),\n timePickerLocale: Object.assign({}, TimePickerLocale)\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nexport default locale;","/* eslint-disable react-refresh/only-export-components */\nimport React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DatePicker } from 'antd';\nimport dayjs, { Dayjs } from 'dayjs';\nimport 'dayjs/locale/zh-cn';\nimport zhCN from 'antd/es/date-picker/locale/zh_CN';\n\n// 使用中文本地化\ndayjs.locale('zh-cn');\n\nconst { RangePicker } = DatePicker;\n\ninterface DatePickerPortalProps {\n host: HTMLElement;\n onChange: (key: string, value: string) => void;\n}\n\nconst DatePickerPortal: React.FC<DatePickerPortalProps> = ({ host, onChange }) => {\n const key = host.dataset.key;\n const initialValueStr = host.dataset.value;\n const placeholderStr = host.dataset.placeholder;\n const limitRange = host.dataset.limitRange ? parseInt(host.dataset.limitRange, 10) : undefined;\n const disableFuture = host.dataset.disableFuture === 'true';\n\n const [dates, setDates] = useState<[Dayjs | null, Dayjs | null] | null>(() => {\n if (!initialValueStr) return null;\n const parts = initialValueStr.split(',');\n if (parts.length === 2 && parts[0] && parts[1]) {\n return [dayjs(parts[0]), dayjs(parts[1])];\n }\n return null;\n });\n\n const [hackValue, setHackValue] = useState<[Dayjs | null, Dayjs | null] | null>(null);\n\n const disabledDate = (current: Dayjs) => {\n if (!current) return false;\n \n // Future check\n if (disableFuture && current.isAfter(dayjs(), 'day')) {\n return true;\n }\n\n if (!limitRange || !hackValue || !hackValue[0]) {\n return false;\n }\n \n // Range check\n const diff = Math.abs(current.diff(hackValue[0], 'days'));\n return diff > limitRange;\n };\n\n const onCalendarChange = (val: [Dayjs | null, Dayjs | null] | null) => {\n console.log('[DatePicker] onCalendarChange', val?.map(d => d?.format('YYYY-MM-DD') || null));\n setHackValue(val);\n };\n\n const onChangeHandler = (val: [Dayjs | null, Dayjs | null] | null) => {\n console.log('[DatePicker] onChange', val?.map(d => d?.format('YYYY-MM-DD') || null));\n setDates(val);\n setHackValue(null); // Clear hack value on complete selection\n \n if (val && val[0] && val[1]) {\n const str = `${val[0].format('YYYY-MM-DD')},${val[1].format('YYYY-MM-DD')}`;\n host.setAttribute('data-value', str);\n onChange(key!, str);\n } else {\n host.setAttribute('data-value', \"\");\n onChange(key!, \"\");\n }\n };\n\n const onOpenChange = (open: boolean) => {\n console.log('[DatePicker] onOpenChange', open);\n if (open) {\n setHackValue(dates);\n } else {\n setHackValue(null);\n }\n };\n\n return createPortal(\n <div className=\"rte-datepicker-wrapper\" contentEditable={false} style={{ display: 'inline-block', verticalAlign: 'middle', width: '240px' }}>\n <RangePicker\n value={dates}\n disabledDate={disabledDate}\n onCalendarChange={onCalendarChange}\n onChange={onChangeHandler}\n onOpenChange={onOpenChange}\n placeholder={[placeholderStr || '开始日期', placeholderStr || '结束日期']}\n style={{ width: '100%' }}\n size=\"small\"\n allowClear\n locale={zhCN}\n getPopupContainer={() => document.body}\n popupClassName=\"rte-datepicker-dropdown\"\n />\n </div>,\n host\n );\n};\n\nexport const useDatePickerPortals = (editorRef: React.RefObject<HTMLDivElement | null>) => {\n const [portals, setPortals] = useState<React.ReactElement[]>([]);\n \n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n const updatePortals = () => {\n const hosts = editor.querySelectorAll('.rte-datepicker-host');\n \n const newPortals: React.ReactElement[] = [];\n hosts.forEach((host) => {\n const key = host.getAttribute('data-key');\n if (key) {\n newPortals.push(\n <DatePickerPortal \n key={`datepicker-${key}`} \n host={host as HTMLElement} \n onChange={() => {\n // 触发 input 事件以更新验证状态\n if (editorRef.current) {\n const event = new Event('input', { bubbles: true });\n editorRef.current.dispatchEvent(event);\n }\n }} \n />\n );\n }\n });\n \n setPortals(newPortals);\n };\n\n // Initial update\n updatePortals();\n\n // Observe changes\n const observer = new MutationObserver((mutations) => {\n let shouldUpdate = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check if any added nodes contain datepicker host\n // or removed nodes contained datepicker host\n // For simplicity, just update if childList changes on editor or its subtrees\n // But we want to avoid loop if Portal modifies DOM.\n // Portal renders into host. host is inside editor.\n // So we need to ignore mutations inside .rte-datepicker-host\n \n let relevantChange = false;\n // Check added nodes\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (el.classList?.contains('rte-datepicker-host') || el.querySelector?.('.rte-datepicker-host')) {\n relevantChange = true;\n }\n }\n });\n // Check removed nodes\n mutation.removedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (el.classList?.contains('rte-datepicker-host') || el.querySelector?.('.rte-datepicker-host')) {\n relevantChange = true;\n }\n }\n });\n \n if (relevantChange) {\n shouldUpdate = true;\n break;\n }\n }\n }\n \n if (shouldUpdate) {\n updatePortals();\n }\n });\n\n observer.observe(editor, { childList: true, subtree: true });\n\n return () => observer.disconnect();\n }, [editorRef]); // Re-run if editorRef changes (unlikely)\n\n return portals;\n};\n\n\n","import React, {\n useRef,\n useState,\n useEffect,\n useLayoutEffect,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Tooltip, Dropdown } from \"antd\";\nimport \"./index.css\";\nimport type { StructuredInputProps, InputNode } from \"./types\";\nimport { checkExclusionStates } from \"./exclusionLogic\";\nimport { validateRequiredFields } from \"./validation\";\nimport { updatePlaceholders } from \"./placeholders\";\nimport {\n useInitializeEditorContent,\n useUploadInfoTooltip,\n useTagTooltip,\n useUploadLabelTooltip,\n useVariableTooltip,\n useExclusionAndValidation,\n useSelectionControl,\n} from \"./hooks\";\nimport { useDatePickerPortals } from \"./DatePickerPortal\";\n\n// 重新导出类型,保持向后兼容\nexport type { NodeType, InputNode, AgentOption, StructuredInputProps } from \"./types\";\n\nexport const RichTextEditor: React.FC<StructuredInputProps> = ({\n config,\n onSend,\n isProcessing = false,\n disabled = false,\n width,\n lockStructure = false,\n agentOptions = [],\n onAgentSelect,\n onAgentExit,\n loading = false,\n placeholder,\n border,\n background = 'transparent',\n hideButtons,\n}) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [files, setFiles] = useState<Record<string, File | null>>({});\n const [activeFileKey, setActiveFileKey] = useState<string | null>(null);\n const [popoverVisible, setPopoverVisible] = useState<{\n key: string;\n anchorEl: HTMLElement | null;\n type?: 'upload' | 'tag' | 'upload-label' | 'variable' | 'upload-preview';\n } | null>(null);\n const isDraggingRef = useRef<boolean>(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n const [isFormValid, setIsFormValid] = useState<boolean>(false);\n // 保存光标位置信息,用于在重新生成 HTML 后恢复光标\n const savedCursorRef = useRef<{ key: string; offset: number } | null>(null);\n // 编辑器是否为空(用于显示 placeholder)\n const [isEmpty, setIsEmpty] = useState<boolean>(true);\n \n // 管理 multi-variable 类型的输入框数量\n const [multiVariableCounts, setMultiVariableCounts] = useState<Record<string, number>>(() => {\n const counts: Record<string, number> = {};\n config.forEach(node => {\n if (node.type === 'multi-variable' && node.key) {\n counts[node.key] = 1; // 默认初始化为1\n }\n });\n return counts;\n });\n \n // 保存每个智能体的状态(通过第一个 tag 的 text 来标识)\n const agentStatesRef = useRef<Record<string, {\n variableValues: Record<string, string>;\n files: Record<string, File | null>;\n multiVariableCounts: Record<string, number>;\n }>>({});\n \n // 使用 ref 来保存当前的 files 和 multiVariableCounts,以便在保存状态时使用最新值\n const filesRef = useRef<Record<string, File | null>>({});\n const multiVariableCountsRef = useRef<Record<string, number>>({});\n \n // 同步 ref 和 state\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n \n useEffect(() => {\n multiVariableCountsRef.current = multiVariableCounts;\n }, [multiVariableCounts]);\n \n // 获取当前智能体的标识(第一个 tag 节点的 text)\n const getAgentId = useCallback((config: InputNode[]): string | null => {\n const firstTag = config.find(node => node.type === 'tag');\n return firstTag?.text || null;\n }, []);\n\n // 当 config 变化时,保存当前状态并恢复新状态\n const prevConfigRef = useRef<InputNode[]>(config);\n const pendingRestoreRef = useRef<{\n variableValues: Record<string, string>;\n files: Record<string, File | null>;\n multiVariableCounts: Record<string, number>;\n } | null>(null);\n \n useEffect(() => {\n const prevAgentId = getAgentId(prevConfigRef.current);\n const currentAgentId = getAgentId(config);\n \n // 如果切换了智能体,保存之前的状态\n if (prevAgentId && prevAgentId !== currentAgentId && editorRef.current) {\n // 收集所有 variable/select/textarea 的值\n const variableValues: Record<string, string> = {};\n const variableElements = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n variableElements.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n const selectElements = editorRef.current.querySelectorAll<HTMLSelectElement>('[data-type=\"select\"]');\n selectElements.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const textareaElements = editorRef.current.querySelectorAll<HTMLTextAreaElement>('[data-type=\"textarea\"]');\n textareaElements.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.replace(/[\\u200B]/g, \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n \n // 保存状态\n agentStatesRef.current[prevAgentId] = {\n variableValues,\n files: { ...filesRef.current },\n multiVariableCounts: { ...multiVariableCountsRef.current },\n };\n }\n \n // 恢复新智能体的状态\n if (currentAgentId && agentStatesRef.current[currentAgentId]) {\n const savedState = agentStatesRef.current[currentAgentId];\n // 保存到 pendingRestoreRef,在 useLayoutEffect 中恢复\n pendingRestoreRef.current = savedState;\n // 恢复文件\n setFiles(savedState.files);\n // 恢复 multi-variable 数量\n setMultiVariableCounts(savedState.multiVariableCounts);\n } else if (currentAgentId) {\n // 如果没有保存的状态,重置为新配置的默认值\n pendingRestoreRef.current = null;\n const counts: Record<string, number> = {};\n config.forEach(node => {\n if (node.type === 'multi-variable' && node.key) {\n counts[node.key] = 1;\n }\n });\n setMultiVariableCounts(counts);\n setFiles({});\n } else {\n // 如果没有 tag(默认输入框状态),重置所有状态\n pendingRestoreRef.current = null;\n setMultiVariableCounts({});\n setFiles({});\n }\n \n // 更新 prevConfigRef\n prevConfigRef.current = config;\n }, [config, getAgentId]);\n \n // 使用 useLayoutEffect 确保在 DOM 更新前设置 __tempVariableValues\n // 这个 effect 会在每次渲染后执行,确保在 useInitializeEditorContent 执行时 __tempVariableValues 已经设置好\n useLayoutEffect(() => {\n if (pendingRestoreRef.current && editorRef.current) {\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = pendingRestoreRef.current.variableValues;\n // 延迟清除,确保 useInitializeEditorContent 已经读取了值\n // 使用 setTimeout 确保在下一个事件循环中清除,此时 useInitializeEditorContent 应该已经读取了值\n setTimeout(() => {\n if (pendingRestoreRef.current) {\n pendingRestoreRef.current = null;\n }\n }, 0);\n }\n });\n\n // 使用自定义 hooks\n useInitializeEditorContent(editorRef, config, files, lockStructure, multiVariableCounts, savedCursorRef, undefined, hideButtons);\n useUploadInfoTooltip(editorRef, config, files, setPopoverVisible);\n useTagTooltip(editorRef, config, setPopoverVisible, hideButtons);\n useUploadLabelTooltip(editorRef, config, files, setPopoverVisible);\n useVariableTooltip(editorRef, config, setPopoverVisible);\n useExclusionAndValidation(editorRef, config, files, setIsFormValid);\n useSelectionControl(editorRef, isDraggingRef);\n\n // 渲染 DatePicker Portal\n const datePickerPortals = useDatePickerPortals(editorRef);\n\n // 检查编辑器是否为空(仅在 config 为空时检查)\n useEffect(() => {\n // 如果 config 不为空,不显示 placeholder\n if (config.length > 0) {\n setIsEmpty(false);\n return;\n }\n\n const checkEmpty = () => {\n if (!editorRef.current) {\n setIsEmpty(true);\n return;\n }\n \n // 获取所有文本内容(排除零宽空格)\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n \n // 检查是否有任何 variable 或 upload 有内容\n const variables = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n const uploads = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"upload\"]');\n \n let hasContent = false;\n \n // 检查 variable 是否有内容\n variables.forEach((el) => {\n const content = el.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n if (content) {\n hasContent = true;\n }\n });\n \n // 检查 upload 是否有文件\n uploads.forEach((el) => {\n const hasFile = el.querySelector('.upload-inner-wrapper.has-file');\n if (hasFile) {\n hasContent = true;\n }\n });\n \n // 只有当 config 为空且编辑器没有任何内容时,才显示 placeholder\n const isEditorEmpty = !textContent && !hasContent;\n setIsEmpty(isEditorEmpty);\n \n // 在默认状态下,如果编辑器为空,禁用发送按钮\n if (config.length === 0) {\n setIsFormValid(!isEditorEmpty);\n }\n };\n\n // 初始检查\n checkEmpty();\n\n // 监听编辑器内容变化\n const observer = new MutationObserver(checkEmpty);\n if (editorRef.current) {\n observer.observe(editorRef.current, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n\n return () => {\n observer.disconnect();\n };\n }, [config]);\n\n\n /**\n * 处理粘贴事件\n * @param e 粘贴事件\n */\n const handlePaste = (e: React.ClipboardEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n e.preventDefault();\n const text = e.clipboardData.getData(\"text/plain\");\n \n // 检查当前焦点是否在 multi-variable 类型的输入框中\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n if (anchor) {\n let variableEl: HTMLElement | null = null;\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableEl = (anchor as HTMLElement).closest('[data-type=\"variable\"]');\n } else if (anchor.nodeType === Node.TEXT_NODE && (anchor as Text).parentElement) {\n variableEl = (anchor as Text).parentElement!.closest('[data-type=\"variable\"]');\n }\n \n if (variableEl) {\n const multiKey = variableEl.dataset.multiKey;\n if (multiKey) {\n // 是 multi-variable 类型,分割粘贴的内容\n // 支持多种分隔符:空格、顿号(、)、逗号(,)、中文逗号(,)、换行符等\n const separatorRegex = /[、,,\\s\\n\\r\\t]+/;\n const values = text.split(separatorRegex).map(v => v.trim()).filter(v => v.length > 0);\n \n console.log('[Paste Event] 粘贴的内容:', text);\n console.log('[Paste Event] 拆分后的值:', values);\n \n if (values.length > 1) {\n // 批量粘贴:填充到多个输入框\n const currentIndex = parseInt(variableEl.dataset.index || \"0\", 10);\n const maxCount = (() => {\n const node = config.find(n => n.type === 'multi-variable' && n.key === multiKey);\n return node?.maxCount || 9;\n })();\n \n // 确保有足够的输入框\n const currentCount = multiVariableCounts[multiKey] || 1;\n const neededCount = Math.min(currentIndex + values.length, maxCount);\n if (neededCount > currentCount) {\n setMultiVariableCounts(prev => ({\n ...prev,\n [multiKey]: neededCount\n }));\n }\n \n // 收集所有现有的值,准备重新生成HTML\n const allValues: string[] = [];\n for (let i = 0; i < currentCount; i++) {\n const key = `${multiKey}_${i}`;\n const el = editorRef.current!.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"][data-multi-key=\"${multiKey}\"]`\n );\n if (el) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n allValues.push(text);\n }\n }\n \n // 在 currentIndex 位置,用拆分后的值替换原来的值\n allValues.splice(currentIndex, 1, ...values.slice(0, maxCount - currentIndex));\n \n // 确保不超过 maxCount,并且如果最后一个值不为空,添加一个空框\n const finalValues = allValues.slice(0, maxCount);\n if (finalValues.length > 0 && finalValues[finalValues.length - 1] !== \"\") {\n if (finalValues.length < maxCount) {\n finalValues.push(\"\");\n }\n }\n const finalCount = Math.max(finalValues.length, 1);\n \n // 保存 variableValues\n const variableValues: Record<string, string> = {};\n finalValues.forEach((val, idx) => {\n if (val) {\n variableValues[`${multiKey}_${idx}`] = val;\n }\n });\n \n // 保存其他 variable 的值\n const allVariables = editorRef.current!.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"]'\n );\n allVariables.forEach((el) => {\n const key = el.dataset.key;\n const elMultiKey = el.dataset.multiKey;\n if (key && elMultiKey !== multiKey) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n \n // 临时保存 variableValues,用于重新生成 HTML\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = variableValues;\n \n // 更新 multiVariableCounts,这会触发重新渲染\n setMultiVariableCounts(prev => ({\n ...prev,\n [multiKey]: finalCount\n }));\n \n console.log('[Paste Event] 粘贴完成,已填充到多个输入框,值:', finalValues);\n return;\n } else if (values.length === 1) {\n // 单个值,直接粘贴,但需要检查粘贴后的内容是否包含分隔符\n // 如果包含分隔符,在失去焦点时自动拆分\n console.log('[Paste Event] 粘贴单个值,将在失去焦点时检查是否需要拆分');\n }\n }\n }\n }\n }\n \n // 普通粘贴:使用 execCommand\n document.execCommand(\"insertText\", false, text);\n // 触发 input 逻辑更新 placeholder\n handleInput();\n \n // 如果是 multi-variable 类型,粘贴后检查是否需要拆分\n setTimeout(() => {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n if (anchor) {\n let variableEl: HTMLElement | null = null;\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableEl = (anchor as HTMLElement).closest('[data-type=\"variable\"][data-multi-key]');\n } else if (anchor.nodeType === Node.TEXT_NODE && (anchor as Text).parentElement) {\n variableEl = (anchor as Text).parentElement!.closest('[data-type=\"variable\"][data-multi-key]');\n }\n \n if (variableEl) {\n const content = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n const separatorRegex = /[、,,\\s]+/;\n if (separatorRegex.test(content)) {\n console.log('[Paste Event] 粘贴后检测到分隔符,内容:', content);\n console.log('[Paste Event] 提示:失去焦点后将自动拆分');\n }\n }\n }\n }\n }, 0);\n };\n\n /**\n * 处理文件变化事件\n * @param e 文件变化事件\n */\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files[0] && activeFileKey) {\n const file = e.target.files[0];\n const key = activeFileKey;\n setFiles((prev) => ({ ...prev, [key]: file }));\n }\n if (e.target) e.target.value = \"\";\n setActiveFileKey(null);\n };\n\n /**\n * 处理删除文件\n * @param key 文件键\n */\n const handleRemoveFile = (key: string) => {\n setFiles((prev) => {\n const next = { ...prev };\n delete next[key];\n return next;\n });\n };\n\n /**\n * 处理鼠标按下事件\n * @param e 鼠标按下事件\n */\n const handleMouseDown = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // 如果点击的是 DatePicker,直接返回,不触发其他逻辑\n if (target.closest('.rte-datepicker-wrapper') || target.closest('.rte-datepicker-host')) {\n return;\n }\n \n // 优先处理 tag 关闭按钮点击(在 mousedown 时直接处理,确保能捕获到)\n const tagCloseBtn = target.closest(\".tag-close-btn\");\n if (tagCloseBtn) {\n e.preventDefault();\n e.stopPropagation();\n // 如果锁定结构,不允许删除 tag\n if (lockStructure) {\n return;\n }\n // 清除 tooltip 状态\n setPopoverVisible(null);\n // 调用退出智能体的回调\n if (onAgentExit) {\n onAgentExit();\n } else {\n // 如果没有提供回调,则清空编辑器\n if (editorRef.current) {\n editorRef.current.innerHTML = \"\";\n // 重置编辑器高度,避免退出智能体后高度异常\n editorRef.current.style.height = 'auto';\n editorRef.current.style.minHeight = '';\n editorRef.current.focus();\n }\n }\n return;\n }\n \n // 如果锁定结构,检查是否点击的是 text 或 tag 节点\n if (lockStructure) {\n const tagNode = target.closest<HTMLElement>('.tag-node');\n const textNode = target.closest<HTMLElement>('[data-type=\"text\"]');\n \n // 如果点击的是 tag 或 text 节点,阻止设置光标\n if (tagNode || textNode) {\n e.preventDefault();\n e.stopPropagation();\n // 清除可能已经设置的光标\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n return;\n }\n }\n \n // 如果点击的是 variable 元素,完全让浏览器处理,不进行任何干扰\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n // 不阻止默认行为,不记录位置,让浏览器完全处理文本选择\n // 不设置 isDraggingRef,这样 handleEditorClick 也不会干扰\n return;\n }\n \n // 记录鼠标按下位置(用于检测拖动)\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n isDraggingRef.current = false;\n \n // 处理文件删除按钮\n if (target.closest(\".file-remove-btn\")) {\n // 这些按钮需要阻止默认行为,实际处理在 handleEditorClick 中\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n /**\n * 处理鼠标移动事件\n * @param e 鼠标移动事件\n */\n const handleMouseMove = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n \n // 如果是在 variable 元素内,不干扰,让浏览器处理\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n return;\n }\n \n // 检测是否在拖动\n if (mouseDownPosRef.current) {\n const deltaX = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const deltaY = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过 3px,认为是拖动\n if (deltaX > 3 || deltaY > 3) {\n isDraggingRef.current = true;\n }\n }\n };\n\n /**\n * 处理鼠标抬起事件\n * @param e 鼠标抬起事件\n */\n const handleMouseUp = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n \n // 如果是在 variable 元素上,让浏览器处理,不干扰\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n // 重置拖动状态,但不做其他处理\n mouseDownPosRef.current = null;\n isDraggingRef.current = false;\n return;\n }\n \n // 重置拖动状态\n mouseDownPosRef.current = null;\n isDraggingRef.current = false;\n };\n\n const handleEditorClick = (e: React.MouseEvent) => {\n // 如果禁用,不处理任何点击事件\n if (disabled) {\n return;\n }\n\n const target = e.target as HTMLElement;\n\n // 如果点击的是 DatePicker,直接返回,不触发其他逻辑\n const datepickerHost = target.closest<HTMLElement>('[data-type=\"datepicker\"]');\n if (datepickerHost) {\n return;\n }\n\n // tag 关闭按钮已在 handleMouseDown 中处理,这里不再重复处理\n // 但为了兼容性,如果 handleMouseDown 没有处理,这里也处理一次\n const tagCloseBtn = target.closest(\".tag-close-btn\");\n if (tagCloseBtn) {\n // 如果已经在 handleMouseDown 中处理过,这里不再重复处理\n // 但为了确保事件被正确处理,这里也检查一次\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // 如果 config 为空,编辑器是纯文本模式,不处理其他特殊逻辑\n if (config.length === 0) {\n return;\n }\n\n // 辅助:切换富文本全屏时,强制隐藏/恢复其他节点,避免样式被覆盖时仍可见\n const toggleRichtextFullscreenVisibility = (hostEl: HTMLElement, expanded: boolean) => {\n if (!editorRef.current) return;\n const children = Array.from(editorRef.current.children) as HTMLElement[];\n children.forEach((child) => {\n if (child === hostEl) return;\n if (expanded) {\n if (child.dataset.prevDisplay === undefined) {\n child.dataset.prevDisplay = child.style.display || \"\";\n }\n child.style.setProperty(\"display\", \"none\", \"important\");\n } else {\n if (child.dataset.prevDisplay !== undefined) {\n const prev = child.dataset.prevDisplay;\n if (prev) {\n child.style.display = prev;\n } else {\n child.style.removeProperty(\"display\");\n }\n delete child.dataset.prevDisplay;\n } else {\n child.style.removeProperty(\"display\");\n }\n }\n });\n };\n\n // textarea 展开/收起\n const textareaToggle = target.closest<HTMLElement>('.rte-textarea-toggle');\n if (textareaToggle) {\n e.preventDefault();\n e.stopPropagation();\n const wrapper = textareaToggle.closest<HTMLElement>('.rte-textarea-wrapper');\n const textarea = wrapper?.querySelector<HTMLTextAreaElement>('[data-type=\"textarea\"]');\n const expanded = textareaToggle.getAttribute('data-expanded') === 'true';\n const next = !expanded;\n textareaToggle.setAttribute('data-expanded', String(next));\n textareaToggle.textContent = next ? '收起' : '展开';\n if (wrapper) {\n wrapper.classList.toggle('rte-textarea-expanded', next);\n }\n const requiredWrapper = wrapper?.closest<HTMLElement>('.rte-textarea-required');\n if (requiredWrapper) {\n requiredWrapper.classList.toggle('rte-textarea-overlay', next);\n } else if (wrapper) {\n wrapper.classList.toggle('rte-textarea-overlay', next);\n }\n if (textarea) {\n if (next) {\n textarea.classList.add('rte-textarea-expanded');\n textarea.style.maxHeight = 'none';\n textarea.style.height = '100%';\n } else {\n textarea.classList.remove('rte-textarea-expanded');\n const maxHeight = textarea.dataset.maxHeight || '252';\n textarea.style.maxHeight = `${maxHeight}px`;\n textarea.style.height = 'auto';\n }\n }\n if (editorRef.current) {\n if (next) {\n editorRef.current.classList.add('rte-overlay-active');\n } else {\n editorRef.current.classList.remove('rte-overlay-active');\n }\n }\n return;\n }\n\n // richtext 展开/收起\n const richtextToggle = target.closest<HTMLElement>('.rte-richtext-toggle');\n if (richtextToggle) {\n e.preventDefault();\n e.stopPropagation();\n const wrapper = richtextToggle.closest<HTMLElement>('.rte-richtext-wrapper');\n const rich = wrapper?.querySelector<HTMLElement>('[data-type=\"richtext\"]');\n const expanded = richtextToggle.getAttribute('data-expanded') === 'true';\n const next = !expanded;\n const updateToggle = (el: HTMLElement, isExpanded: boolean) => {\n el.setAttribute('data-expanded', String(isExpanded));\n el.innerHTML = isExpanded\n ? `<i class=\"iconfont icon-shouqi1\"></i><span class=\"rte-richtext-toggle-label\">收起</span>`\n : `<i class=\"iconfont icon-zhankai2\"></i><span class=\"rte-richtext-toggle-label\">展开</span>`;\n };\n updateToggle(richtextToggle, next);\n const requiredWrapper = wrapper?.closest<HTMLElement>('.rte-richtext-required');\n if (requiredWrapper) {\n requiredWrapper.classList.toggle('rte-richtext-expanded', next);\n } else if (wrapper) {\n wrapper.classList.toggle('rte-richtext-expanded', next);\n }\n const host = wrapper?.closest<HTMLElement>('.exclusion-wrapper') || wrapper?.parentElement;\n if (rich) {\n if (next) {\n rich.style.height = '100%';\n rich.style.overflow = 'auto';\n } else {\n rich.style.height = '';\n rich.style.overflow = '';\n }\n }\n // 全屏覆盖:隐藏其他节点,仅保留 richtext host,固定编辑区高度 252px\n if (host) {\n host.classList.toggle('rte-richtext-host-expanded', next);\n toggleRichtextFullscreenVisibility(host, next);\n }\n if (editorRef.current) {\n editorRef.current.classList.toggle('rte-richtext-fullscreen-active', next);\n }\n return;\n }\n\n // 检查是否点击的是 text 节点,无论 lockStructure 是否为 true,都阻止\n const textNode = target.closest<HTMLElement>('[data-type=\"text\"]');\n if (textNode) {\n e.preventDefault();\n e.stopPropagation();\n // 清除可能已经设置的光标\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n return;\n }\n\n // 如果锁定结构,检查是否点击的是 tag 节点\n if (lockStructure) {\n const tagNode = target.closest<HTMLElement>('.tag-node');\n \n // 如果点击的是 tag 节点,阻止设置光标\n if (tagNode) {\n e.preventDefault();\n e.stopPropagation();\n // 清除可能已经设置的光标\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n return;\n }\n }\n\n // 如果点击的是 variable 元素\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n // 如果是拖动操作,不处理\n if (isDraggingRef.current) {\n return;\n }\n \n // 让浏览器正常处理点击事件,设置光标位置\n // 不调用 updatePlaceholders 并传入 variableChip,因为这会重置光标位置到末尾\n // 只在需要时更新占位符(不重置光标位置)\n setTimeout(() => {\n const selection = window.getSelection();\n \n // 如果有文本被选中,说明是拖动选择,不干扰\n if (selection && !selection.isCollapsed) {\n return;\n }\n \n // 只更新占位符,不重置光标位置\n updatePlaceholders(editorRef);\n }, 10);\n return;\n }\n\n\n // 删除文件\n const removeBtn = target.closest(\".file-remove-btn\");\n if (removeBtn) {\n e.preventDefault();\n e.stopPropagation();\n const uploadChip = removeBtn.closest<HTMLElement>('[data-type=\"upload\"]');\n const key = uploadChip?.dataset.key;\n if (key) handleRemoveFile(key);\n return;\n }\n\n // 选择文件\n const uploadChip = target.closest<HTMLElement>('[data-type=\"upload\"]');\n if (uploadChip) {\n const key = uploadChip.dataset.key;\n if (key) {\n setActiveFileKey(key);\n fileInputRef.current?.click();\n }\n return;\n }\n };\n\n /**\n * 处理双击事件\n * @param e 双击事件\n * @returns void\n */\n const handleDoubleClick = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n \n if (variableChip) {\n // 双击全选 variable 元素内的文本\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n const textContent = variableChip.textContent || \"\";\n const cleanText = textContent.replace(/\\u200B/g, \"\");\n \n // 如果有实际内容,全选(排除零宽字符)\n if (cleanText) {\n // 找到第一个非零宽字符的位置\n let startOffset = 0;\n let endOffset = textContent.length;\n \n // 如果以零宽字符开头,跳过它\n if (textContent.startsWith(\"\\u200B\")) {\n startOffset = 1;\n }\n \n // 如果以零宽字符结尾,排除它\n if (textContent.endsWith(\"\\u200B\") && textContent.length > 1) {\n endOffset = textContent.length - 1;\n }\n \n // 选择文本节点\n const textNode = variableChip.firstChild;\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\n range.setStart(textNode, startOffset);\n range.setEnd(textNode, endOffset);\n } else {\n // 如果没有文本节点,选择整个元素内容\n range.selectNodeContents(variableChip);\n }\n } else {\n // 只有零宽字符,不选择,只设置光标\n range.selectNodeContents(variableChip);\n range.collapse(true);\n }\n \n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n };\n\n /**\n * 处理输入事件\n */\n const handleInput = () => {\n // 如果 config 为空,编辑器是纯文本模式,需要更新 isEmpty 和 isFormValid 状态\n if (config.length === 0) {\n // 检查编辑器内容是否为空\n if (editorRef.current) {\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n const isEditorEmpty = !textContent;\n setIsEmpty(isEditorEmpty);\n setIsFormValid(!isEditorEmpty);\n }\n return;\n }\n \n updatePlaceholders(editorRef);\n \n // 更新 variable-info-icon 的显示/隐藏状态\n if (editorRef.current) {\n const variableChips = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n variableChips.forEach((chip) => {\n const infoIcon = chip.querySelector<HTMLElement>('.variable-info-icon');\n if (infoIcon) {\n // 获取所有文本节点,排除图标\n let hasText = false;\n const walker = document.createTreeWalker(\n chip,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n // 排除图标内的文本节点\n if (infoIcon.contains(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n );\n \n while (walker.nextNode()) {\n const text = walker.currentNode.textContent?.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n hasText = true;\n break;\n }\n }\n \n if (hasText) {\n infoIcon.classList.add('hidden');\n } else {\n infoIcon.classList.remove('hidden');\n }\n }\n });\n }\n \n checkExclusionStates(editorRef, config, files);\n validateRequiredFields(editorRef, config, files, setIsFormValid);\n \n // 检测 multi-variable 类型的输入,当有值时自动添加新的输入框\n if (!editorRef.current) return;\n \n const multiVariableNodes = config.filter(node => node.type === 'multi-variable' && node.key);\n \n multiVariableNodes.forEach(node => {\n if (!node.key) return;\n const maxCount = node.maxCount || 9;\n const currentCount = multiVariableCounts[node.key] || 1;\n \n // 收集所有输入框的值\n const values: string[] = [];\n for (let i = 0; i < currentCount; i++) {\n const key = `${node.key}_${i}`;\n const el = editorRef.current!.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"][data-multi-key=\"${node.key}\"]`\n );\n if (el) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n values.push(text);\n }\n }\n \n // 检查最后一个输入框是否为空(是否已经有一个空框)\n const lastValue = values[values.length - 1] || \"\";\n const hasEmptyBox = lastValue === \"\";\n \n // 检测是否有空的输入框(除了最后一个)\n let hasEmptyInMiddle = false;\n let emptyIndex = -1;\n for (let i = 0; i < values.length - 1; i++) {\n if (values[i] === \"\") {\n hasEmptyInMiddle = true;\n emptyIndex = i;\n break;\n }\n }\n \n // 如果中间有空框,删除它并前移数据\n if (hasEmptyInMiddle && emptyIndex >= 0) {\n // 保存当前光标位置信息(如果光标在受影响的输入框中)\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const container = range.startContainer;\n const currentVariableEl = container.nodeType === Node.ELEMENT_NODE\n ? (container as HTMLElement).closest('[data-type=\"variable\"][data-multi-key]')\n : container.parentElement?.closest('[data-type=\"variable\"][data-multi-key]');\n \n if (currentVariableEl) {\n const key = (currentVariableEl as HTMLElement).dataset.key;\n if (key) {\n // 计算光标在当前输入框中的偏移量\n const rangeBefore = document.createRange();\n rangeBefore.setStartBefore(currentVariableEl);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n const offset = rangeBefore.toString().length;\n \n // 保存光标信息\n savedCursorRef.current = { key, offset };\n }\n }\n }\n \n // 前移数据:将 emptyIndex 之后的数据前移一位\n const newValues = [...values];\n for (let i = emptyIndex; i < newValues.length - 1; i++) {\n newValues[i] = newValues[i + 1];\n }\n newValues.pop(); // 移除最后一个\n \n // 更新 variableValues,用于在重新生成 HTML 时恢复数据\n const variableValues: Record<string, string> = {};\n newValues.forEach((val, idx) => {\n if (val) {\n variableValues[`${node.key}_${idx}`] = val;\n }\n });\n \n // 如果已经有一个空框,不再添加新的空框,直接使用当前数量减1\n // 如果最后一个不为空,说明删除后需要保留一个空框\n const finalCount = hasEmptyBox \n ? Math.max(newValues.length, 1) // 已经有一个空框,不再添加\n : Math.max(newValues.length + 1, 1); // 没有空框,添加一个\n \n // 保存所有其他 variable 的值\n const allVariables = editorRef.current!.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"]'\n );\n allVariables.forEach((el) => {\n const key = el.dataset.key;\n const multiKey = el.dataset.multiKey;\n if (key && multiKey !== node.key) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n \n // 临时保存 variableValues,用于在重新生成 HTML 时使用\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = variableValues;\n \n setMultiVariableCounts(prev => ({\n ...prev,\n [node.key!]: finalCount\n }));\n \n return; // 处理完这个节点后返回,避免继续处理添加逻辑\n }\n \n // 检查最后一个输入框是否有值,如果有值且数量未达上限,则添加新输入框\n // 只有当最后一个输入框有值且没有空框时,才添加新的空框\n if (!hasEmptyBox) {\n const lastIndex = currentCount - 1;\n const lastKey = `${node.key}_${lastIndex}`;\n const lastVariableEl = editorRef.current!.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${lastKey}\"][data-multi-key=\"${node.key}\"]`\n );\n \n if (lastVariableEl) {\n const text = lastVariableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n // 如果最后一个输入框有值,且当前数量小于最大数量,则增加一个输入框\n if (text.length > 0 && currentCount < maxCount) {\n // 保存当前光标位置信息\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const container = range.startContainer;\n const currentVariableEl = container.nodeType === Node.ELEMENT_NODE\n ? (container as HTMLElement).closest('[data-type=\"variable\"][data-multi-key]')\n : container.parentElement?.closest('[data-type=\"variable\"][data-multi-key]');\n \n if (currentVariableEl) {\n const key = (currentVariableEl as HTMLElement).dataset.key;\n if (key) {\n // 计算光标在当前输入框中的偏移量\n const rangeBefore = document.createRange();\n rangeBefore.setStartBefore(currentVariableEl);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n const offset = rangeBefore.toString().length;\n \n // 保存光标信息\n savedCursorRef.current = { key, offset };\n }\n }\n }\n \n setMultiVariableCounts(prev => ({\n ...prev,\n [node.key!]: currentCount + 1\n }));\n }\n }\n }\n \n });\n };\n\n /**\n * 处理失去焦点事件\n */\n // 直接在 multi-variable 输入框上监听 blur 事件,避免污染外部输入框\n // 同时处理编辑器容器的 blur 事件(用于验证和占位符更新)\n useLayoutEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n \n // 存储所有绑定的事件监听器,用于清理\n const listeners = new Map<HTMLElement, (e: FocusEvent) => void>();\n \n // 处理编辑器容器的 blur 事件(用于验证和占位符更新)\n const handleEditorBlur = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n \n // 如果失去焦点的元素不在编辑器内,不处理(避免影响外部输入框)\n if (!target || !editorRef.current || !editorRef.current.contains(target)) {\n return;\n }\n \n // 如果焦点仍在编辑器内部,不处理\n if (relatedTarget && editorRef.current.contains(relatedTarget)) {\n return;\n }\n \n // 延迟处理,避免立即影响焦点\n setTimeout(() => {\n if (!editorRef.current) return;\n \n // 如果是默认输入框状态,需要检查内容并更新按钮状态\n if (config.length === 0) {\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n setIsFormValid(textContent.length > 0);\n return;\n }\n \n updatePlaceholders(editorRef);\n checkExclusionStates(editorRef, config, files);\n validateRequiredFields(editorRef, config, files, setIsFormValid);\n }, 0);\n };\n \n // 在编辑器容器上绑定 blur 事件(使用捕获阶段,确保最早处理)\n editor.addEventListener('blur', handleEditorBlur, true);\n \n // 查找所有 multi-variable 输入框并直接绑定事件\n const bindBlurEvents = () => {\n if (!editorRef.current) return;\n \n // 先清理旧的事件监听器\n listeners.forEach((handler, element) => {\n element.removeEventListener('blur', handler, false);\n });\n listeners.clear();\n \n const multiVariableInputs = editorRef.current.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"][data-multi-key]'\n );\n \n const handleBlurEvent = (e: FocusEvent) => {\n // 立即阻止事件冒泡,避免影响外部输入框\n e.stopPropagation();\n e.stopImmediatePropagation();\n \n const target = e.target as HTMLElement;\n if (!target || !editorRef.current) return;\n \n // 严格检查:确保 target 在编辑器内部\n if (!editorRef.current.contains(target)) {\n return;\n }\n \n // 确保 target 就是 multi-variable 输入框本身或其子元素\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"][data-multi-key]');\n if (!variableChip || !editorRef.current.contains(variableChip)) {\n return;\n }\n \n // 确保 variableChip 就是被绑定的元素之一\n let isBoundElement = false;\n listeners.forEach((_, element) => {\n if (element === variableChip || element.contains(target)) {\n isBoundElement = true;\n }\n });\n if (!isBoundElement) {\n return;\n }\n \n const multiKey = variableChip.dataset.multiKey;\n const currentKey = variableChip.dataset.key;\n const index = variableChip.dataset.index;\n \n if (!multiKey || !currentKey || index === undefined) return;\n \n // 检查是否真的失去了焦点\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n const isReallyBlurred = !relatedTarget || !editorRef.current.contains(relatedTarget);\n \n if (!isReallyBlurred) {\n return;\n }\n \n const content = variableChip.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n \n console.log('[Blur Event] 失去焦点的 multi-variable 输入框:', {\n multiKey,\n currentKey,\n index,\n content\n });\n \n // 支持多种分隔符:空格、顿号(、)、逗号(,)、中文逗号(,)\n const separatorRegex = /[、,,\\s]+/;\n \n if (separatorRegex.test(content)) {\n const parts = content.split(separatorRegex).map((p: string) => p.trim()).filter((p: string) => p.length > 0);\n \n console.log('[Blur Event] 拆分前的内容:', content);\n console.log('[Blur Event] 拆分后的部分:', parts);\n \n const maxCount = 9;\n const validParts = parts.slice(0, maxCount);\n \n console.log('[Blur Event] 有效的部分(最多9个):', validParts);\n \n if (validParts.length > 1) {\n const node = config.find(n => n.type === 'multi-variable' && n.key === multiKey);\n if (node) {\n const currentCount = multiVariableCounts[multiKey] || 1;\n const currentIndex = parseInt(index, 10);\n const maxAllowed = node.maxCount || 9;\n \n // 收集所有现有的值\n const allValues: string[] = [];\n for (let i = 0; i < currentCount; i++) {\n const key = `${multiKey}_${i}`;\n const el = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"][data-multi-key=\"${multiKey}\"]`\n );\n if (el) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n allValues.push(text);\n }\n }\n \n console.log('[Blur Event] 拆分前的所有值:', allValues);\n console.log('[Blur Event] 当前索引:', currentIndex);\n console.log('[Blur Event] 要插入的值:', validParts);\n \n allValues.splice(currentIndex, 1, ...validParts);\n \n const finalValues = allValues.slice(0, maxAllowed);\n \n console.log('[Blur Event] 拆分后的所有值:', finalValues);\n \n if (finalValues.length > 0 && finalValues[finalValues.length - 1] !== \"\") {\n if (finalValues.length < maxAllowed) {\n finalValues.push(\"\");\n }\n }\n const finalCount = Math.max(finalValues.length, 1);\n \n // 保存 variableValues\n const variableValues: Record<string, string> = {};\n finalValues.forEach((val, idx) => {\n if (val) {\n variableValues[`${multiKey}_${idx}`] = val;\n }\n });\n \n // 保存其他 variable 的值\n const allVariables = editorRef.current.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"]'\n );\n allVariables.forEach((el) => {\n const key = el.dataset.key;\n const elMultiKey = el.dataset.multiKey;\n if (key && elMultiKey !== multiKey) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n \n // 临时保存 variableValues\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = variableValues;\n \n // 更新 multiVariableCounts\n setMultiVariableCounts(prev => ({\n ...prev,\n [multiKey]: finalCount\n }));\n }\n }\n }\n };\n \n // 为每个 multi-variable 输入框绑定 blur 事件(使用冒泡阶段,不是捕获阶段)\n multiVariableInputs.forEach((input) => {\n input.addEventListener('blur', handleBlurEvent, false);\n listeners.set(input, handleBlurEvent);\n });\n };\n \n // 延迟绑定,确保 DOM 已经渲染\n const timeoutId = setTimeout(() => {\n bindBlurEvents();\n }, 0);\n \n return () => {\n clearTimeout(timeoutId);\n // 清理编辑器容器的 blur 事件\n editor.removeEventListener('blur', handleEditorBlur, true);\n // 清理所有事件监听器\n listeners.forEach((handler, element) => {\n element.removeEventListener('blur', handler, false);\n });\n listeners.clear();\n };\n }, [config, multiVariableCounts, files]);\n \n\n /**\n * 处理键盘事件\n * @param e 键盘事件\n * @returns void\n */\n const handleKeyDown = (e: React.KeyboardEvent) => {\n // 如果禁用,阻止所有键盘操作\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n // 检查光标是否在 text 节点上,无论 lockStructure 是否为 true,都阻止\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n \n let textNode: HTMLElement | null = null;\n \n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n textNode = (anchor as HTMLElement).closest('[data-type=\"text\"]');\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n textNode = (anchor as Text).parentElement!.closest('[data-type=\"text\"]');\n }\n }\n \n // 如果光标在 text 节点上,阻止所有键盘操作\n if (textNode) {\n e.preventDefault();\n e.stopPropagation();\n // 将光标移动到最近的 variable 或 upload 节点\n if (editorRef.current) {\n const variableOrUpload = editorRef.current.querySelector<HTMLElement>(\n '[data-type=\"variable\"], [data-type=\"upload\"]'\n );\n if (variableOrUpload) {\n variableOrUpload.focus();\n }\n }\n return;\n }\n }\n\n // 如果锁定结构,检查光标是否在 tag 节点上\n if (lockStructure && selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n let tagNode: HTMLElement | null = null;\n \n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n tagNode = (anchor as HTMLElement).closest('.tag-node');\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n tagNode = (anchor as Text).parentElement!.closest('.tag-node');\n }\n }\n \n // 如果光标在 tag 节点上,阻止所有键盘操作\n if (tagNode) {\n e.preventDefault();\n e.stopPropagation();\n // 将光标移动到最近的 variable 或 upload 节点\n if (editorRef.current) {\n const variableOrUpload = editorRef.current.querySelector<HTMLElement>(\n '[data-type=\"variable\"], [data-type=\"upload\"]'\n );\n if (variableOrUpload) {\n variableOrUpload.focus();\n }\n }\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n if (e.key === \"Escape\" && editorRef.current) {\n // 如果锁定结构,不允许清空内容\n if (lockStructure) {\n e.preventDefault();\n return;\n }\n editorRef.current.innerHTML = \"\";\n editorRef.current.focus();\n }\n\n // 保护 variable 芯片,不让 Backspace 把整个块删掉,但允许删除选中的内容\n if (e.key === \"Backspace\") {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const anchor = selection.anchorNode;\n\n // 如果锁定结构,检查是否在 tag 或 text 节点中\n if (lockStructure) {\n let tagEl: HTMLElement | null = null;\n let textEl: HTMLElement | null = null;\n \n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n tagEl = (anchor as HTMLElement).closest('.tag-node');\n textEl = (anchor as HTMLElement).closest('[data-type=\"text\"]');\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n tagEl = (anchor as Text).parentElement!.closest('.tag-node');\n textEl = (anchor as Text).parentElement!.closest('[data-type=\"text\"]');\n }\n }\n\n // 如果在 tag 或 text 节点中,且光标在开头,阻止删除\n if ((tagEl || textEl) && range.collapsed && range.startOffset === 0) {\n e.preventDefault();\n return;\n }\n }\n\n let variableEl: HTMLElement | null = null;\n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableEl = (anchor as HTMLElement).closest(\n '[data-type=\"variable\"]'\n );\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n variableEl = (anchor as Text).parentElement!.closest(\n '[data-type=\"variable\"]'\n );\n }\n }\n\n if (variableEl) {\n // 如果有选区(即不是光标状态),允许浏览器默认行为进行删除\n if (!range.collapsed) {\n return; \n }\n\n // 光标状态下的特殊处理\n const textContent = variableEl.innerText;\n // 检查是否只剩下零宽字符或者空字符串\n const isEffectiveEmpty = textContent === \"\\u200B\" || textContent === \"\";\n\n // 1. 已经是空的时候,禁止删除 variable 节点本身\n if (isEffectiveEmpty) {\n e.preventDefault();\n return;\n }\n // 2. 光标在最前面时,禁止删除(防止合并到上一个节点)\n if (range.startOffset === 0) {\n e.preventDefault();\n return;\n }\n // 3. 仅剩一个零宽字符且光标在它后面时,禁止删除\n if (\n textContent.startsWith(\"\\u200B\") &&\n range.startOffset === 1\n ) {\n e.preventDefault();\n return;\n }\n }\n }\n }\n };\n\n /**\n * 发送数据\n * 收集结构化数据 + 拼接 Prompt\n * @returns void\n */\n const handleSend = () => {\n if (isProcessing || disabled || loading || !isFormValid || !editorRef.current) return;\n\n // 如果是默认输入框状态(config 为空),直接传递文本内容\n if (config.length === 0) {\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n if (!textContent) return;\n onSend(textContent, textContent);\n return;\n }\n\n const root = editorRef.current;\n let fullPrompt = \"\";\n const dataPayload: Record<string, unknown> = {};\n\n const traverse = (node: Node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if ((el.style as CSSStyleDeclaration).display === \"none\") return;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n fullPrompt += (node.textContent || \"\").replace(/\\u200B/g, \"\");\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const type = el.dataset.type;\n const key = el.dataset.key;\n\n if (type === \"variable\" && key) {\n // 获取文本内容,排除图标\n let textContent = \"\";\n const walker = document.createTreeWalker(\n el,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n // 排除图标内的文本节点\n const infoIcon = el.querySelector('.variable-info-icon');\n if (infoIcon && infoIcon.contains(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n );\n \n while (walker.nextNode()) {\n textContent += walker.currentNode.textContent || \"\";\n }\n \n const val = textContent.replace(/[\\u200B\\n]/g, \"\").trim();\n if (val) {\n const multiKey = el.dataset.multiKey;\n if (multiKey) {\n // multi-variable 类型:收集所有值到数组中\n if (!dataPayload[multiKey] || !Array.isArray(dataPayload[multiKey])) {\n dataPayload[multiKey] = [];\n }\n const currentArray = dataPayload[multiKey] as string[];\n currentArray.push(val);\n // 在 fullPrompt 中添加值,使用空格分隔(不用逗号)\n if (currentArray.length > 1) {\n fullPrompt += \" \";\n }\n fullPrompt += val;\n } else {\n // 普通 variable 类型\n dataPayload[key] = val;\n fullPrompt += val;\n }\n }\n } else if (type === \"select\" && key) {\n const selectEl = el as HTMLSelectElement;\n const val = (selectEl.value || \"\").trim();\n if (val) {\n dataPayload[key] = val;\n const selectedOption = selectEl.selectedOptions?.[0];\n fullPrompt += selectedOption?.textContent || val;\n }\n } else if (type === \"textarea\" && key) {\n const textareaEl = el as HTMLTextAreaElement;\n const val = (textareaEl.value || \"\").replace(/\\u200B/g, \"\").trim();\n if (val) {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n } else if (type === \"richtext\" && key) {\n const richEl = el as HTMLElement;\n const val = (richEl.textContent || \"\").replace(/\\u200B/g, \"\").trim();\n if (val) {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n } else if (type === \"datepicker\" && key) {\n const dpEl = el as HTMLElement;\n const val = (dpEl.getAttribute(\"data-value\") || \"\").trim();\n if (val) {\n // 如果包含逗号,尝试分割为数组\n if (val.includes(\",\")) {\n const parts = val.split(\",\");\n if (parts.length === 2) {\n dataPayload[key] = parts;\n fullPrompt += `[${parts[0]}, ${parts[1]}]`;\n } else {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n } else {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n }\n } else if (type === \"upload\" && key) {\n dataPayload[key] = files[key] ?? null;\n if (files[key]) {\n fullPrompt += ` [附带文件: ${files[key]?.name}] `;\n }\n } else {\n if (el.classList.contains(\"tag-close-btn\")) return;\n if (el.classList.contains(\"file-remove-btn\")) return;\n\n if (\n el.getAttribute(\"contenteditable\") === \"false\" &&\n !type &&\n el.classList.contains(\"tag-node\")\n ) {\n fullPrompt += el.innerText;\n } else {\n el.childNodes.forEach(traverse);\n }\n }\n }\n };\n\n root.childNodes.forEach(traverse);\n fullPrompt = fullPrompt.trim();\n if (!fullPrompt) return;\n\n // 将数据转换为 FormData\n const formData = new FormData();\n \n // 添加 fullPrompt\n formData.append('fullPrompt', fullPrompt);\n \n // 遍历 dataPayload,将数据添加到 FormData\n Object.keys(dataPayload).forEach((key) => {\n const value = dataPayload[key];\n \n if (value === null || value === undefined) {\n return;\n }\n \n // 如果是文件对象\n if (value instanceof File) {\n formData.append(key, value);\n }\n // 如果是数组\n else if (Array.isArray(value)) {\n // 检查是否是 multi-variable 类型(通过检查 config 中是否有对应的 multi-variable 节点)\n const isMultiVariable = config.some(\n node => node.type === 'multi-variable' && node.key === key\n );\n \n if (isMultiVariable) {\n // multi-variable 类型:使用同一个 key 多次 append,形成多个值\n value.forEach((item) => {\n if (item !== null && item !== undefined && item !== '') {\n // 使用同一个 key,多次 append\n formData.append(key, String(item));\n }\n });\n } else {\n // 其他数组类型(如文件数组),使用 key[index] 格式\n value.forEach((item, index) => {\n if (item !== null && item !== undefined) {\n // 如果是文件数组\n if (item instanceof File) {\n formData.append(`${key}[${index}]`, item);\n }\n // 如果是字符串数组\n else if (typeof item === 'string') {\n formData.append(`${key}[${index}]`, item);\n }\n // 其他类型转为字符串\n else {\n formData.append(`${key}[${index}]`, String(item));\n }\n }\n });\n }\n }\n // 如果是字符串\n else if (typeof value === 'string') {\n formData.append(key, value);\n }\n // 其他类型转为字符串\n else {\n formData.append(key, String(value));\n }\n });\n \n\n onSend(formData, fullPrompt);\n };\n\n // 计算容器样式\n const containerStyle: React.CSSProperties = {\n ...(width ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(border ? { border } : {}),\n ...(background ? { background } : {}),\n };\n\n return (\n <div \n className=\"rich-text-editor\" \n style={containerStyle}\n data-disabled={disabled}\n >\n <div\n ref={editorRef}\n className={`rte-editor ${config.length === 0 ? 'rte-editor-default' : ''} ${isEmpty && placeholder ? 'rte-editor-empty' : ''}`}\n contentEditable={config.length === 0 ? true : false}\n suppressContentEditableWarning\n data-placeholder={placeholder}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onClick={handleEditorClick}\n onDoubleClick={handleDoubleClick}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n // 完全移除 onBlur,避免影响外部输入框\n // 使用 useLayoutEffect 中的事件监听器来处理 blur 事件\n />\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"rte-file-input\"\n accept=\".csv,.xlsx,.xls,.txt,.pdf,image/*\"\n onChange={handleFileChange}\n />\n\n <div className=\"rich-text-editor-footer\">\n <div className=\"rich-text-editor-footer-left\">\n <div className=\"rich-text-editor-brand\">\n <div className=\"rte-brand-badge\">\n <img src=\"https://oospublic.sealseek.cn/file/website/ball.png\" alt=\"\" />\n <span className=\"rte-brand-text\">SealSeek 1.0</span>\n </div>\n {hideButtons !== 'hideAgent' && (\n <Dropdown\n placement=\"top\"\n menu={{\n items: agentOptions.map((agent) => ({\n key: agent.key,\n label: (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {agent.icon && <i className={agent.icon} />}\n <span>{agent.label}</span>\n </div>\n ),\n onClick: () => {\n onAgentSelect?.(agent);\n },\n })),\n }}\n trigger={[\"click\"]}\n disabled={disabled || isProcessing}\n >\n <div className=\"rte-agent-badge\" style={{ cursor: agentOptions.length > 0 ? \"pointer\" : \"default\" }}>\n <i className=\"iconfont icon-zhinengti\" />\n <span className=\"rte-agent-text\">智能体</span>\n </div>\n </Dropdown>\n )}\n </div>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {/* 显示 points */}\n {(() => {\n // 从 config 中找到第一个 tag 节点,获取 agent 的 label\n const tagNode = config.find(node => node.type === 'tag');\n if (!tagNode || !tagNode.text) return null;\n \n // 在 agentOptions 中找到对应的 agent\n const currentAgent = agentOptions.find(agent => agent.label === tagNode.text);\n // 只要有 points 就显示(可以是数字、字符串或其他类型)\n if (!currentAgent || currentAgent.points === undefined || currentAgent.points === null) {\n return null;\n }\n \n return (\n <div className=\"rte-points-badge\">\n <i className=\"iconfont icon-jifen\" style={{ marginRight:'4px'}}/>\n <span style={{fontSize:'16px'}}>-{String(currentAgent.points)}</span>\n </div>\n );\n })()}\n \n <button\n type=\"button\"\n onClick={handleSend}\n disabled={isProcessing || disabled || loading || !isFormValid}\n className=\"rich-text-editor-send-button\"\n >\n {(isProcessing || loading) ? (\n <span className=\"rte-send-spinner\" />\n ) : (<i className=\"iconfont icon-fasong\" />\n )}\n </button>\n </div>\n </div>\n\n {popoverVisible?.anchorEl && (() => {\n // 检查 anchorEl 是否还在 DOM 中\n if (!document.body.contains(popoverVisible.anchorEl)) {\n return null;\n }\n \n let tooltipContent: React.ReactNode = \"\";\n let overlayStyle: React.CSSProperties | undefined = {\n background: \"var(--neutral-800, #262626)\",\n };\n \n if (popoverVisible.type === 'upload') {\n const uploadNode = config.find(\n (n) => n.type === \"upload\" && n.key === popoverVisible.key\n );\n tooltipContent = uploadNode?.tooltip || \"\";\n } else if (popoverVisible.type === 'tag') {\n // 从 DOM 元素的 data-tooltip 属性获取\n const tooltip = popoverVisible.anchorEl.dataset.tooltip;\n tooltipContent = tooltip || \"\";\n } else if (popoverVisible.type === 'upload-label') {\n // 从 DOM 元素的 data-file-name 属性获取完整文件名\n const fileName = popoverVisible.anchorEl.dataset.fileName;\n tooltipContent = fileName || \"\";\n } else if (popoverVisible.type === 'variable') {\n // 从 DOM 元素的 data-tooltip 属性获取\n const tooltip = popoverVisible.anchorEl.dataset.tooltip;\n tooltipContent = tooltip || \"\";\n } else if (popoverVisible.type === 'upload-preview') {\n const file = files[popoverVisible.key];\n if (file && file.type && file.type.startsWith('image/')) {\n const url = URL.createObjectURL(file);\n tooltipContent = (\n <div style={{ width: 120, height: 120, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <img src={url} style={{ maxWidth: 120, maxHeight: 120, objectFit: \"contain\" }} />\n </div>\n );\n overlayStyle = {\n background: \"#fff\",\n padding: 4,\n };\n // 延迟释放对象 URL,避免内存泄漏\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } else {\n tooltipContent = \"\";\n }\n }\n \n if (!tooltipContent) return null;\n\n const titleColor = popoverVisible.type === 'upload-preview' ? '#0A0A0A' : '#fff';\n\n return createPortal(\n <Tooltip\n arrow={false}\n title={\n <div style={{ maxWidth: \"200px\", fontSize: \"12px\", color: titleColor }}>\n {tooltipContent}\n </div>\n }\n open={true}\n placement=\"top\"\n getPopupContainer={() => document.body}\n overlayInnerStyle={overlayStyle}\n >\n <div\n style={{\n position: \"fixed\",\n left: `${popoverVisible.anchorEl.getBoundingClientRect().left}px`,\n top: `${popoverVisible.anchorEl.getBoundingClientRect().top}px`,\n width: `${popoverVisible.anchorEl.offsetWidth}px`,\n height: `${popoverVisible.anchorEl.offsetHeight}px`,\n pointerEvents: \"none\",\n }}\n />\n </Tooltip>,\n document.body\n );\n })()}\n \n {/* 渲染 DatePicker Portals */}\n {datePickerPortals}\n </div>\n );\n};\n\n// 手动添加 docgen 信息\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<\n string,\n {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }\n >;\n};\n\ntype ComponentWithDocgen = React.FC<StructuredInputProps> & {\n __docgenInfo?: DocgenInfo;\n};\n\n(RichTextEditor as ComponentWithDocgen).__docgenInfo = {\n displayName: \"RichTextEditor\",\n description:\n \"结构化富文本输入组件,支持标签、变量输入块、文件上传以及互斥显示逻辑。\",\n props: {\n config: {\n name: \"config\",\n required: true,\n description: \"结构化输入配置节点数组\",\n type: { name: \"InputNode[]\", raw: \"InputNode[]\" },\n },\n onSend: {\n name: \"onSend\",\n required: true,\n description: \"点击发送按钮时的回调,返回数据与拼接后的 Prompt\",\n type: {\n name: \"function\",\n raw: \"(data: Record<string, any>, fullPrompt: string) => void\",\n },\n },\n isProcessing: {\n name: \"isProcessing\",\n required: false,\n description: \"是否处于处理状态(禁用输入与发送)\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" },\n },\n },\n};\n\nexport default RichTextEditor;","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFSSURBVHgB3ZTtccIwDIaVXv83I2SDZgSP0BHMBG0naEZhA2boBGQDswHdQJUOGRxjO0Z8HPDe6eJzJD2W4gjgEYSIn2xwK6EIFHqBGysJpMP3ZB0oRbEtmal1NtIxl4OWWsoxEsvqofJ0rgTNASOYq+7SXKDsuYvAcgkq/PWwBLQWqIfdjeRStaBUc4qzgLi9/BzJNmS/sh6bpvmrTfSFacU3scWy1mQryWdSnXiFE8QVUJINLTuyhWzzz/1OZmTN9hEckqtfUOwIGlGCpVRjE+94JFqpMtTeVzO8/UmPxpZU8Qa7aln8Tb9pfwla4WHWrjPvvbbnTBsX7PmLs83EDAH0BxSw1G31+/1FoDg/vPcXR+wocQS1apj4+P92FfhOoLyuBfYlmPgYnGoCjWADzAkzUyJ430awLmphPaxWQVU22BuuApPkHaanjcXSN3t6/QNjTMSJWDcs1QAAAABJRU5ErkJggg==\"","import { Select, Progress } from \"antd\";\nimport autoLoadIcon from \"../../assets/autoLoading.png\";\nimport React from \"react\";\n\ninterface LoadingProgress {\n currentPage: number;\n totalPages: number;\n percentage: number;\n}\n\ninterface AutoLoadControlProps {\n /** 自定义加载图标 */\n loadIcon?: React.ReactNode;\n /** 是否正在加载 */\n autoLoading: boolean;\n /** 批量加载页数 */\n batchSize: number;\n /** 加载进度信息 */\n loadingProgress?: LoadingProgress;\n /** 是否禁用自动加载 */\n disabled: boolean;\n /** 批量页数变更回调 */\n onBatchSizeChange: (size: number) => void;\n /** 加载下一页回调 */\n onLoadNextPage: () => void;\n /** 开始自动加载回调 */\n onStartAutoLoad: () => void;\n /** 停止加载回调 */\n onStopLoad: () => void;\n}\n\nconst BATCH_SIZE_OPTIONS = [\n { label: \"5页\", value: 5 },\n { label: \"10页\", value: 10 },\n { label: \"15页\", value: 15 },\n { label: \"30页\", value: 30 },\n];\n\nexport const AutoLoadControl = ({\n autoLoading,\n batchSize,\n loadingProgress,\n loadIcon,\n onBatchSizeChange,\n onLoadNextPage,\n onStartAutoLoad,\n onStopLoad,\n}: AutoLoadControlProps) => {\n if (autoLoading && loadingProgress) {\n return (\n <div className=\"auto_load_progress\">\n {loadIcon ? (\n loadIcon\n ) : (\n <img src={autoLoadIcon} alt=\"自动加载\" width={14} height={14} />\n )}\n <span>\n 正在加载第{loadingProgress.currentPage}/{loadingProgress.totalPages}页\n </span>\n <Progress\n percent={loadingProgress.percentage}\n type=\"line\"\n size={[160, 8]}\n />\n <span onClick={onStopLoad} className={\"auto_load_stop_btn\"}>\n 停止加载\n </span>\n </div>\n );\n }\n\n return (\n <div className={\"auto_load_container\"}>\n <div\n onClick={onLoadNextPage}\n className=\"auto_load_next_btn\"\n style={{\n backgroundColor: autoLoading ? \"#f5f5f5\" : \"#2563eb\",\n }}\n >\n 加载下一页\n </div>\n\n {/* 自动加载组合按钮:左侧触发区 + 右侧下拉选择器 */}\n <div\n className={\"right_control_wrap\"}\n style={{\n backgroundColor: autoLoading ? \"#f5f5f5\" : \"#2563eb\",\n }}\n >\n <div\n className={\"auto_load_btn\"}\n onClick={autoLoading ? undefined : onStartAutoLoad}\n >\n {loadIcon ? (\n loadIcon\n ) : (\n <img src={autoLoadIcon} alt=\"自动加载\" width={14} height={14} />\n )}\n <span>自动加载</span>\n </div>\n <Select\n value={batchSize}\n onChange={onBatchSizeChange}\n options={BATCH_SIZE_OPTIONS}\n disabled={autoLoading}\n size=\"small\"\n className=\"auto_load_select\"\n popupMatchSelectWidth={84}\n />\n </div>\n </div>\n );\n};\n\nexport default AutoLoadControl;\n","import { Pagination } from \"antd\";\nimport { InfoCircleOutlined } from \"@ant-design/icons\";\nimport { useMemo, useState } from \"react\";\nimport { AutoLoadControl } from \"./AutoLoadControl\";\nimport \"./index.css\";\n\nexport interface PaginationFooterProps {\n current: number;\n pageSize: number;\n total: number;\n loadedCount: number;\n cachedPages: number[];\n loadIcon?: React.ReactNode;\n loading: boolean;\n onChange: (page: number) => void;\n // 自动加载相关\n autoLoading?: boolean;\n loadingProgress?: {\n currentPage: number;\n totalPages: number;\n percentage: number;\n };\n onLoadNextPage?: () => void;\n onStartAutoLoad?: (loadNextPages: number[]) => void;\n onStopLoading?: () => void;\n}\n\nexport const PaginationFooter = ({\n current,\n loadIcon,\n pageSize,\n total,\n cachedPages,\n loadedCount,\n autoLoading = false,\n loadingProgress,\n onChange,\n onLoadNextPage,\n onStartAutoLoad,\n onStopLoading,\n}: PaginationFooterProps) => {\n const [batchSize, setBatchSize] = useState(5);\n const totalPages = Math.ceil(total / pageSize);\n\n const hideAutoLoadControl = useMemo(() => {\n return cachedPages.length >= totalPages;\n }, [cachedPages, totalPages]);\n\n // 计算下一次需要加载的页面数组\n const calculateNextPagesToLoad = () => {\n const unloadPages = Array.from(\n { length: totalPages },\n (_, i) => i + 1\n ).filter((page) => !cachedPages.includes(page));\n return unloadPages.slice(0, batchSize);\n };\n\n // 自定义分页器的itemRender,为未加载的页码添加右下角红点+灰色样式\n const itemRender = (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => {\n const isLoaded = cachedPages.includes(page);\n if (\n type === \"prev\" ||\n type === \"next\" ||\n type === \"jump-prev\" ||\n type === \"jump-next\"\n ) {\n return <div className=\"pageBox\">{originalElement}</div>;\n }\n return (\n <div\n className=\"pageBox\"\n style={{\n backgroundColor: current === page ? \"#2563EB\" : \"#f5f5f5\",\n color: current === page ? \"#fff\" : isLoaded ? \"#171717\" : \"#a3a3a3\",\n }}\n >\n {page}\n {!isLoaded && <span className=\"unload_spot\" />}\n </div>\n );\n };\n\n return (\n <div className={\"pagination_footer\"}>\n <div className=\"pagination_leftWrap\">\n {/* 已加载数据统计 - 始终显示 */}\n <span className={\"pagination_total\"}>\n <InfoCircleOutlined\n style={{ color: \"#2563EB\", marginRight: \"4px\" }}\n />\n 已加载: {loadedCount}/{total}条数据\n </span>\n\n {!hideAutoLoadControl && (\n <AutoLoadControl\n loadIcon={loadIcon ? loadIcon : undefined}\n autoLoading={autoLoading}\n batchSize={batchSize}\n loadingProgress={loadingProgress}\n disabled={!onLoadNextPage || !onStartAutoLoad}\n onBatchSizeChange={setBatchSize}\n onLoadNextPage={() => onLoadNextPage?.()}\n onStartAutoLoad={() => {\n const nextPages = calculateNextPagesToLoad();\n onStartAutoLoad?.(nextPages);\n }}\n onStopLoad={() => onStopLoading?.()}\n />\n )}\n </div>\n\n {/* 右侧:分页器(无快速跳转输入框) */}\n <Pagination\n current={current}\n pageSize={pageSize}\n total={total}\n onChange={(page) => onChange(page)}\n showSizeChanger={false}\n showQuickJumper={false}\n showTotal={(_, __) => \"\"}\n itemRender={itemRender}\n />\n </div>\n );\n};\n","import React, { useCallback, useRef } from \"react\";\nimport { Table } from \"antd\";\nimport type { TableProps } from \"antd\";\nimport { PaginationFooter } from \"./PaginationFooter\";\n\nexport interface VirtualTableProps<T> extends TableProps<T> {\n /*基础参数*/\n loading: boolean;\n total: number;\n current: number;\n pageSize: number;\n cachedPages: number[];\n dataSource: T[];\n onChangePage: (page: number) => void;\n /*自动加载*/\n autoLoading: boolean;\n loadingProgress: {\n percentage: number;\n currentPage: number;\n totalPages: number;\n };\n onLoadNextPage?: () => void;\n onStartAutoLoad?: (loadNextPages: number[]) => void;\n onStopLoading?: () => void;\n}\n\ntype DocgenInfo = {\n description?: string;\n displayName?: string;\n methods?: {\n name: string;\n description?: string;\n params?: {\n name: string;\n type: string;\n description?: string;\n }[];\n returns?: { type: string; description?: string };\n }[];\n props?: {\n [key: string]: {\n defaultValue?: any;\n description?: string;\n name: string;\n required?: boolean;\n type: { name: string; raw: string };\n };\n };\n};\n\ntype ComponentWithDocgen<T> = React.FC<VirtualTableProps<T>> & {\n __docgenInfo?: DocgenInfo;\n};\n\nexport const VirtualTable = <T,>(props: VirtualTableProps<T>) => {\n const {\n loading,\n autoLoading,\n loadingProgress,\n columns = [],\n dataSource = [],\n total,\n current,\n pageSize,\n cachedPages,\n onChangePage,\n onLoadNextPage,\n onStartAutoLoad,\n onStopLoading,\n ...restProps\n } = props;\n const tableRef = useRef<any>(null);\n\n const handleChangePage = useCallback(\n (page: number) => {\n onChangePage(page);\n if (!cachedPages.includes(page)) return;\n tableRef.current?.scrollTo({\n key: `${(page - 1) * pageSize + 1}`,\n });\n },\n [current]\n );\n\n return (\n <div className=\"flex flex-col\">\n <Table\n ref={tableRef}\n {...restProps}\n columns={columns}\n dataSource={dataSource}\n pagination={false}\n virtual\n />\n <PaginationFooter\n loading={loading}\n autoLoading={autoLoading}\n loadingProgress={loadingProgress}\n current={current}\n pageSize={pageSize}\n total={total}\n loadedCount={dataSource.length}\n cachedPages={cachedPages}\n onChange={handleChangePage}\n onLoadNextPage={onLoadNextPage}\n onStartAutoLoad={onStartAutoLoad}\n onStopLoading={onStopLoading}\n />\n </div>\n );\n};\n\n// VirtualTable组件的DocgenInfo,确保类型与默认值正确显示\n(VirtualTable as ComponentWithDocgen<any>).__docgenInfo = {\n displayName: \"VirtualTable\",\n description: \"虚拟滚动表格组件,支持分页、数据缓存和自动加载功能。\",\n props: {\n // 基础参数\n loading: {\n description: \"加载状态\",\n name: \"loading\",\n required: true,\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" },\n },\n total: {\n description: \"总数据条数\",\n name: \"total\",\n required: true,\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"0\" },\n },\n current: {\n description: \"当前页码\",\n name: \"current\",\n required: true,\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"1\" },\n },\n pageSize: {\n description: \"每页数据条数\",\n name: \"pageSize\",\n required: true,\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"10\" },\n },\n cachedPages: {\n description: \"已缓存的页码数组\",\n name: \"cachedPages\",\n required: true,\n type: { name: \"number[]\", raw: \"number[]\" },\n defaultValue: { value: \"[]\" },\n },\n dataSource: {\n description: \"数据源\",\n name: \"dataSource\",\n required: true,\n type: { name: \"Array<T>\", raw: \"Array<T>\" },\n defaultValue: { value: \"[]\" },\n },\n onChangePage: {\n description: \"页码变更回调函数\",\n name: \"onChangePage\",\n required: true,\n type: { name: \"function\", raw: \"function(page: number): void\" },\n defaultValue: { value: \"-\" },\n },\n // 自动加载相关\n autoLoading: {\n description: \"是否正在自动加载\",\n name: \"autoLoading\",\n required: true,\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" },\n },\n loadingProgress: {\n description: \"加载进度信息\",\n name: \"loadingProgress\",\n required: true,\n type: {\n name: \"object\",\n raw: \"{percentage: 0, currentPage: 1, totalPages: 5}\",\n },\n defaultValue: {\n value: \"-\",\n },\n },\n onLoadNextPage: {\n description: \"加载下一页回调函数\",\n name: \"onLoadNextPage\",\n required: false,\n type: { name: \"function\", raw: \"function(page: number): void\" },\n defaultValue: { value: \"-\" },\n },\n onStartAutoLoad: {\n description: \"开始自动加载回调函数\",\n name: \"onStartAutoLoad\",\n required: false,\n type: {\n name: \"function\",\n raw: \"function(loadNextPages: number[]): void\",\n },\n defaultValue: { value: \"-\" },\n },\n onStopLoading: {\n description: \"停止加载回调函数\",\n name: \"onStopLoading\",\n required: false,\n type: { name: \"function\", raw: \"function(): void\" },\n defaultValue: { value: \"-\" },\n },\n columns: {\n description: \"表格列配置\",\n name: \"columns\",\n required: true,\n type: { name: \"Array<object>\", raw: \"Array<object>\" },\n defaultValue: { value: \"[]\" },\n },\n },\n};\n\n// 添加默认导出\nexport default VirtualTable;\n","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Input } from \"antd\";\n\nexport interface DynamicInputProps {\n /** 动态展示的文案数组 */\n texts: string[];\n /** 输入框占位符 */\n placeholder?: string;\n /** 动画速度(毫秒) */\n animationSpeed?: number;\n /** 是否自动播放动画 */\n autoPlay?: boolean;\n /** 输入框值 */\n value?: string;\n /** 输入框变化回调 */\n onChange?: (value: string) => void;\n /** 其他 Input 属性 */\n [key: string]: unknown;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<DynamicInputProps> & { __docgenInfo?: DocgenInfo };\n\n/** 动态文案输入框组件,支持流式文字动画效果 */\nexport const DynamicInput: React.FC<DynamicInputProps> = ({\n texts = [],\n placeholder = \"请输入内容\",\n animationSpeed = 100,\n autoPlay = true,\n value,\n onChange,\n ...inputProps\n}) => {\n const [currentText, setCurrentText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [isTyping, setIsTyping] = useState(false);\n \n const animationRef = useRef<number | undefined>(undefined);\n const typingRef = useRef<number | undefined>(undefined);\n const textsRef = useRef(texts);\n const currentIndexRef = useRef(currentIndex);\n const isFocusedRef = useRef(isFocused);\n const currentTextRef = useRef(currentText);\n\n // 更新 refs\n useEffect(() => {\n textsRef.current = texts;\n currentIndexRef.current = currentIndex;\n isFocusedRef.current = isFocused;\n currentTextRef.current = currentText;\n });\n\n // 打字机效果\n const typeText = useCallback((text: string, callback?: () => void) => {\n let index = 0;\n setIsTyping(true);\n \n const typeChar = () => {\n if (index < text.length) {\n setCurrentText(text.slice(0, index + 1));\n index++;\n typingRef.current = window.setTimeout(typeChar, animationSpeed);\n } else {\n setIsTyping(false);\n callback?.();\n }\n };\n \n typeChar();\n }, [animationSpeed]);\n\n // 删除文字效果\n const deleteText = useCallback((callback?: () => void) => {\n let index = currentTextRef.current.length;\n \n const deleteChar = () => {\n if (index > 0) {\n setCurrentText(currentTextRef.current.slice(0, index - 1));\n index--;\n typingRef.current = window.setTimeout(deleteChar, animationSpeed / 2);\n } else {\n callback?.();\n }\n };\n \n deleteChar();\n }, [animationSpeed]);\n\n // 循环播放动画\n const playAnimation = useCallback(() => {\n if (textsRef.current.length === 0 || isFocusedRef.current) return;\n \n setIsAnimating(true);\n \n const currentTextItem = textsRef.current[currentIndexRef.current];\n \n // 如果当前有文字,先删除\n if (currentTextRef.current) {\n deleteText(() => {\n // 删除完成后,开始输入新文字\n typeText(currentTextItem, () => {\n // 输入完成后,等待一段时间再继续\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length);\n setIsAnimating(false);\n }, 2000);\n });\n });\n } else {\n // 直接输入新文字\n typeText(currentTextItem, () => {\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length);\n setIsAnimating(false);\n }, 2000);\n });\n }\n }, [deleteText, typeText]);\n\n // 开始动画\n useEffect(() => {\n if (autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n \n return () => {\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n };\n }, [currentIndex, isFocused, autoPlay, texts.length, playAnimation]);\n\n // 当索引变化时重新播放动画\n useEffect(() => {\n if (!isAnimating && autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n }, [currentIndex, isAnimating, autoPlay, texts.length, isFocused, playAnimation]);\n\n // 处理焦点事件\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n // 清除所有动画\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n setIsAnimating(false);\n setIsTyping(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inputProps as any).onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n // 如果输入框为空,重新开始动画\n if (!value && texts.length > 0) {\n setCurrentText(\"\");\n setCurrentIndex(0);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inputProps as any).onBlur?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inputProps as any).onChange?.(e);\n };\n\n // 获取显示的占位符文本\n const getPlaceholderText = () => {\n if (isFocused || value) {\n return placeholder;\n }\n return currentText || placeholder;\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <Input\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {...(inputProps as any)}\n value={value}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={getPlaceholderText()}\n style={{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(inputProps as any).style,\n position: \"relative\",\n zIndex: 1,\n }}\n />\n \n {/* 动态文字覆盖层 */}\n {!isFocused && !value && currentText && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: 11,\n paddingRight: 11,\n color: \"#bfbfbf\",\n pointerEvents: \"none\",\n zIndex: 2,\n fontSize: 14,\n fontFamily: \"inherit\",\n }}\n >\n <span>{currentText}</span>\n {/* 光标效果 */}\n {isTyping && (\n <span\n style={{\n display: \"inline-block\",\n width: 1,\n height: \"1.2em\",\n backgroundColor: \"#1890ff\",\n marginLeft: 2,\n animation: \"blink 1s infinite\",\n }}\n />\n )}\n </div>\n )}\n \n {/* 添加光标闪烁动画 */}\n <style>\n {`\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `}\n </style>\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(DynamicInput as ComponentWithDocgen).__docgenInfo = {\n displayName: \"DynamicInput\",\n description: \"动态文案输入框组件,支持流式文字动画效果\",\n props: {\n texts: {\n name: \"texts\",\n required: true,\n description: \"动态展示的文案数组\",\n type: { name: \"string[]\", raw: \"string[]\" }\n },\n placeholder: {\n name: \"placeholder\",\n required: false,\n description: \"输入框占位符\",\n type: { name: \"string\", raw: \"string\" },\n defaultValue: { value: '\"请输入内容\"' }\n },\n animationSpeed: {\n name: \"animationSpeed\",\n required: false,\n description: \"动画速度(毫秒)\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"100\" }\n },\n autoPlay: {\n name: \"autoPlay\",\n required: false,\n description: \"是否自动播放动画\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n value: {\n name: \"value\",\n required: false,\n description: \"输入框值\",\n type: { name: \"string\", raw: \"string\" }\n },\n onChange: {\n name: \"onChange\",\n required: false,\n description: \"输入框变化回调\",\n type: { name: \"function\", raw: \"(value: string) => void\" }\n }\n }\n};","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Button } from \"antd\";\nimport { SendOutlined } from \"@ant-design/icons\";\n\n/**\n * DynamicTextArea 组件的属性接口\n * 支持受控和非受控两种模式,具有动态文案动画效果\n */\nexport interface DynamicTextAreaProps {\n /** 动态展示的文案数组,会循环播放打字机效果 */\n texts: string[];\n /** 输入框占位符文本 */\n placeholder?: string;\n /** 打字机动画的速度,单位毫秒,数值越小速度越快 */\n animationSpeed?: number;\n /** 是否自动播放动态文案动画 */\n autoPlay?: boolean;\n /** 输入框的值,用于受控模式 */\n value?: string;\n /** 输入框值变化时的回调函数,用于受控模式 */\n onChange?: (value: string) => void;\n /** 点击提交按钮时的回调函数 */\n onSubmit?: (value: string) => void;\n /** 最大输入字符数限制 */\n maxLength?: number;\n /** 是否在底部显示字数统计 */\n showCount?: boolean;\n /** 提交按钮的文本内容 */\n submitText?: string;\n /** 是否禁用整个组件 */\n disabled?: boolean;\n /** 文本域的行数,影响初始高度 */\n rows?: number;\n /** 自定义样式对象 */\n style?: React.CSSProperties;\n /** 其他原生 textarea 属性 */\n [key: string]: unknown;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<DynamicTextAreaProps> & { __docgenInfo?: DocgenInfo };\n\n/**\n * 动态文案文本域组件\n * \n * 功能特性:\n * 1. 支持受控和非受控两种模式\n * 2. 动态文案打字机效果,循环播放预设文案\n * 3. 内置提交按钮,位于文本框右下角\n * 4. 支持字数限制和字数统计显示\n * 5. 支持键盘快捷键提交(Ctrl+Enter 或 Cmd+Enter)\n * 6. 智能占位符显示,避免与动态文案重叠\n * \n * @param props - 组件属性\n * @returns JSX 元素\n */\nexport const DynamicTextArea: React.FC<DynamicTextAreaProps> = ({\n texts = [], // 动态文案数组,默认为空数组\n placeholder = \"请输入内容\", // 占位符文本\n animationSpeed = 100, // 打字机动画速度,毫秒\n autoPlay = true, // 是否自动播放动画\n value = \"\", // 受控模式的值\n onChange, // 受控模式的变化回调\n onSubmit, // 提交回调\n maxLength = 500, // 最大字符数限制\n showCount = true, // 是否显示字数统计\n submitText = \"发送\", // 提交按钮文本\n disabled = false, // 是否禁用组件\n rows = 4, // 文本域行数\n style, // 自定义样式\n ...otherProps // 其他原生属性\n}) => {\n // ==================== 状态管理 ====================\n \n /** 当前显示的动态文案内容 */\n const [currentText, setCurrentText] = useState(\"\");\n \n /** 当前播放的文案在数组中的索引 */\n const [currentIndex, setCurrentIndex] = useState(0);\n \n /** 是否正在播放动画(用于控制动画循环) */\n const [isAnimating, setIsAnimating] = useState(false);\n \n /** 文本域是否获得焦点 */\n const [isFocused, setIsFocused] = useState(false);\n \n /** 是否正在打字(用于显示光标效果) */\n const [isTyping, setIsTyping] = useState(false);\n \n /** 非受控模式下的内部状态值 */\n const [internalValue, setInternalValue] = useState(value || \"\");\n \n // ==================== Refs 引用 ====================\n \n /** 动画定时器引用,用于清除动画 */\n const animationRef = useRef<number | undefined>(undefined);\n \n /** 打字机效果定时器引用,用于清除打字动画 */\n const typingRef = useRef<number | undefined>(undefined);\n \n /** 文案数组的引用,避免闭包问题 */\n const textsRef = useRef(texts);\n \n /** 当前索引的引用,避免闭包问题 */\n const currentIndexRef = useRef(currentIndex);\n \n /** 焦点状态的引用,避免闭包问题 */\n const isFocusedRef = useRef(isFocused);\n \n /** 当前文案的引用,避免闭包问题 */\n const currentTextRef = useRef(currentText);\n \n /** 文本域 DOM 元素的引用 */\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // ==================== 副作用更新 ====================\n \n /**\n * 更新所有 refs 的值,确保在回调函数中能获取到最新的状态\n * 这是为了避免闭包陷阱,确保动画函数能访问到最新的状态值\n */\n useEffect(() => {\n textsRef.current = texts;\n currentIndexRef.current = currentIndex;\n isFocusedRef.current = isFocused;\n currentTextRef.current = currentText;\n });\n\n // ==================== 动画效果函数 ====================\n \n /**\n * 打字机效果函数\n * 逐字符显示文本,模拟真实的打字过程\n * \n * @param text - 要显示的完整文本\n * @param callback - 打字完成后的回调函数\n */\n const typeText = useCallback((text: string, callback?: () => void) => {\n let index = 0; // 当前显示的字符索引\n setIsTyping(true); // 开始打字状态,显示光标\n \n const typeChar = () => {\n if (index < text.length) {\n // 显示从开始到当前索引的字符\n setCurrentText(text.slice(0, index + 1));\n index++;\n // 设置定时器,继续下一个字符\n typingRef.current = window.setTimeout(typeChar, animationSpeed);\n } else {\n // 打字完成\n setIsTyping(false); // 隐藏光标\n callback?.(); // 执行完成回调\n }\n };\n \n typeChar(); // 开始打字\n }, [animationSpeed]);\n\n /**\n * 删除文字效果函数\n * 逐字符删除文本,模拟删除过程\n * \n * @param callback - 删除完成后的回调函数\n */\n const deleteText = useCallback((callback?: () => void) => {\n let index = currentTextRef.current.length; // 从最后一个字符开始删除\n \n const deleteChar = () => {\n if (index > 0) {\n // 删除一个字符\n setCurrentText(currentTextRef.current.slice(0, index - 1));\n index--;\n // 设置定时器,继续删除下一个字符(删除速度比打字快一倍)\n typingRef.current = window.setTimeout(deleteChar, animationSpeed / 2);\n } else {\n // 删除完成\n callback?.(); // 执行完成回调\n }\n };\n \n deleteChar(); // 开始删除\n }, [animationSpeed]);\n\n /**\n * 循环播放动画函数\n * 控制整个动画流程:删除当前文案 -> 输入新文案 -> 等待 -> 循环\n * \n * 动画流程:\n * 1. 检查是否有文案且未获得焦点\n * 2. 如果有当前文案,先删除\n * 3. 删除完成后,输入新的文案\n * 4. 输入完成后,等待2秒\n * 5. 切换到下一个文案,重新开始循环\n */\n const playAnimation = useCallback(() => {\n // 如果没有文案或已获得焦点,则不播放动画\n if (textsRef.current.length === 0 || isFocusedRef.current) return;\n \n setIsAnimating(true); // 标记正在播放动画\n \n const currentTextItem = textsRef.current[currentIndexRef.current]; // 获取当前要显示的文案\n \n // 如果当前有文案,先删除再输入新文案\n if (currentTextRef.current) {\n deleteText(() => {\n // 删除完成后的回调:开始输入新文案\n typeText(currentTextItem, () => {\n // 输入完成后的回调:等待2秒后切换到下一个文案\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length); // 循环到下一个文案\n setIsAnimating(false); // 标记动画结束\n }, 2000); // 等待2秒\n });\n });\n } else {\n // 如果当前没有文案,直接输入新文案\n typeText(currentTextItem, () => {\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length); // 循环到下一个文案\n setIsAnimating(false); // 标记动画结束\n }, 2000); // 等待2秒\n });\n }\n }, [deleteText, typeText]);\n\n // 开始动画\n useEffect(() => {\n if (autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n \n return () => {\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n };\n }, [currentIndex, isFocused, autoPlay, texts.length, playAnimation]);\n\n // 当索引变化时重新播放动画\n useEffect(() => {\n if (!isAnimating && autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n }, [currentIndex, isAnimating, autoPlay, texts.length, isFocused, playAnimation]);\n\n // 处理焦点事件\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n // 清除所有动画\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n setIsAnimating(false);\n setIsTyping(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n // 如果输入框为空,重新开始动画\n if (!value && texts.length > 0) {\n setCurrentText(\"\");\n setCurrentIndex(0);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onBlur?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n if (maxLength && newValue.length > maxLength) {\n return; // 超过最大长度时不更新\n }\n \n // 如果是受控模式,调用外部 onChange\n if (onChange) {\n onChange(newValue);\n } else {\n // 非受控模式,更新内部状态\n setInternalValue(newValue);\n }\n \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onChange?.(e);\n };\n\n const handleSubmit = () => {\n const currentValue = onChange ? value : internalValue;\n if (currentValue.trim() && !disabled) {\n onSubmit?.(currentValue);\n // 非受控模式下,提交后清空内部状态\n if (!onChange) {\n setInternalValue(\"\");\n }\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Ctrl+Enter 或 Cmd+Enter 提交\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onKeyDown?.(e);\n };\n\n const currentValue = onChange ? value : internalValue;\n const isSubmitDisabled = disabled || !currentValue.trim() || (maxLength ? currentValue.length > maxLength : false);\n\n return (\n <div style={{ position: \"relative\", ...style }}>\n <div style={{ position: \"relative\" }}>\n <textarea\n ref={textareaRef}\n value={onChange ? value : internalValue}\n onChange={handleChange}\n onFocus={(e) => {\n e.target.style.borderColor = \"#1890ff\";\n e.target.style.boxShadow = \"0 0 0 2px rgba(24, 144, 255, 0.2)\";\n handleFocus(e);\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"#d9d9d9\";\n e.target.style.boxShadow = \"none\";\n handleBlur(e);\n }}\n onKeyDown={handleKeyDown}\n placeholder={isFocused || currentValue ? placeholder : \"\"} // 只在聚焦或有值时显示 placeholder\n maxLength={maxLength}\n rows={rows}\n disabled={disabled}\n style={{\n width: \"100%\",\n minHeight: `${rows * 24 + 16}px`,\n padding: \"8px 60px 8px 12px\", // 右侧留出按钮空间\n border: \"1px solid #d9d9d9\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n fontFamily: \"inherit\",\n resize: \"vertical\",\n outline: \"none\",\n transition: \"border-color 0.3s, box-shadow 0.3s\",\n backgroundColor: \"#fff\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(otherProps as any).style,\n }}\n {...otherProps}\n />\n \n {/* 动态文字覆盖层 - 只在未聚焦且无值时显示 */}\n {!isFocused && !currentValue && currentText && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"flex-start\",\n paddingTop: 8,\n paddingLeft: 12,\n paddingRight: 12,\n color: \"#bfbfbf\",\n pointerEvents: \"none\",\n zIndex: 2,\n fontSize: 14,\n fontFamily: \"inherit\",\n lineHeight: \"1.5\",\n }}\n >\n <span>{currentText}</span>\n {/* 光标效果 */}\n {isTyping && (\n <span\n style={{\n display: \"inline-block\",\n width: 1,\n height: \"1.2em\",\n backgroundColor: \"#1890ff\",\n marginLeft: 2,\n animation: \"blink 1s infinite\",\n }}\n />\n )}\n </div>\n )}\n \n {/* 提交按钮 */}\n <div\n style={{\n position: \"absolute\",\n bottom: 8,\n right: 8,\n zIndex: 3,\n }}\n >\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<SendOutlined />}\n onClick={handleSubmit}\n disabled={isSubmitDisabled}\n style={{\n borderRadius: 6,\n minWidth: 32,\n height: 32,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {submitText}\n </Button>\n </div>\n </div>\n \n {/* 字数统计 */}\n {showCount && (\n <div\n style={{\n marginTop: 4,\n textAlign: \"right\",\n fontSize: \"12px\",\n color: \"#999\",\n }}\n >\n {currentValue.length}/{maxLength}\n </div>\n )}\n \n {/* 添加光标闪烁动画 */}\n <style>\n {`\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `}\n </style>\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(DynamicTextArea as ComponentWithDocgen).__docgenInfo = {\n displayName: \"DynamicTextArea\",\n description: \"动态文案文本域组件,支持流式文字动画效果\",\n props: {\n texts: {\n name: \"texts\",\n required: true,\n description: \"动态展示的文案数组\",\n type: { name: \"string[]\", raw: \"string[]\" }\n },\n placeholder: {\n name: \"placeholder\",\n required: false,\n description: \"输入框占位符\",\n type: { name: \"string\", raw: \"string\" },\n defaultValue: { value: '\"请输入内容\"' }\n },\n animationSpeed: {\n name: \"animationSpeed\",\n required: false,\n description: \"动画速度(毫秒)\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"100\" }\n },\n autoPlay: {\n name: \"autoPlay\",\n required: false,\n description: \"是否自动播放动画\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n value: {\n name: \"value\",\n required: false,\n description: \"输入框值\",\n type: { name: \"string\", raw: \"string\" }\n },\n onChange: {\n name: \"onChange\",\n required: false,\n description: \"输入框变化回调\",\n type: { name: \"function\", raw: \"(value: string) => void\" }\n },\n onSubmit: {\n name: \"onSubmit\",\n required: false,\n description: \"提交回调\",\n type: { name: \"function\", raw: \"(value: string) => void\" }\n },\n maxLength: {\n name: \"maxLength\",\n required: false,\n description: \"最大输入字数\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"500\" }\n },\n showCount: {\n name: \"showCount\",\n required: false,\n description: \"是否显示字数统计\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n submitText: {\n name: \"submitText\",\n required: false,\n description: \"提交按钮文本\",\n type: { name: \"string\", raw: \"string\" },\n defaultValue: { value: '\"发送\"' }\n },\n disabled: {\n name: \"disabled\",\n required: false,\n description: \"是否禁用提交按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n rows: {\n name: \"rows\",\n required: false,\n description: \"文本域行数\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"4\" }\n }\n }\n};","import React, { useRef, useState, useCallback } from \"react\";\nimport { Card as AntCard, type CardProps as AntCardProps } from \"antd\";\nimport { PlayCircleOutlined, PauseCircleOutlined } from \"@ant-design/icons\";\nimport \"./index.css\";\n\nexport interface VideoCardProps extends Omit<AntCardProps, 'title' | 'children'> {\n /** 视频源地址 */\n src: string;\n /** 视频海报图片 */\n poster?: string;\n /** 卡片宽度 */\n width?: number | string;\n /** 卡片高度 */\n height?: number | string;\n /** 视频宽度 */\n videoWidth?: number | string;\n /** 视频高度 */\n videoHeight?: number | string;\n /** 是否显示播放按钮 */\n showPlayButton?: boolean;\n /** 是否自动播放(鼠标悬浮时) */\n autoPlayOnHover?: boolean;\n /** 点击事件 */\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n /** 视频加载完成事件 */\n onVideoLoaded?: () => void;\n /** 视频播放事件 */\n onVideoPlay?: () => void;\n /** 视频暂停事件 */\n onVideoPause?: () => void;\n /** 视频结束事件 */\n onVideoEnded?: () => void;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<VideoCardProps> & { __docgenInfo?: DocgenInfo };\n\n/** 视频卡片组件,支持鼠标悬浮播放控制 */\nexport const VideoCard: React.FC<VideoCardProps> = ({\n src,\n poster,\n width = 300,\n height,\n videoWidth, // 参数保留但不使用,由CSS控制\n videoHeight, // 参数保留但不使用,由CSS控制\n showPlayButton = true,\n autoPlayOnHover = true,\n onClick,\n onVideoLoaded,\n onVideoPlay,\n onVideoPause,\n onVideoEnded,\n className,\n style,\n ...rest\n}) => {\n // 忽略videoWidth和videoHeight,video尺寸完全由CSS控制\n void videoWidth;\n void videoHeight;\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // 播放视频\n const playVideo = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.play();\n setIsPlaying(true);\n onVideoPlay?.();\n }\n }, [onVideoPlay]);\n\n // 暂停视频\n const pauseVideo = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.pause();\n setIsPlaying(false);\n onVideoPause?.();\n }\n }, [onVideoPause]);\n\n // 切换播放状态\n const togglePlay = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (isPlaying) {\n pauseVideo();\n } else {\n playVideo();\n }\n }, [isPlaying, playVideo, pauseVideo]);\n\n // 鼠标进入\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n if (autoPlayOnHover && !isPlaying) {\n playVideo();\n }\n }, [autoPlayOnHover, isPlaying, playVideo]);\n\n // 鼠标离开\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n if (autoPlayOnHover && isPlaying) {\n pauseVideo();\n }\n }, [autoPlayOnHover, isPlaying, pauseVideo]);\n\n // 视频加载完成\n const handleVideoLoaded = useCallback(() => {\n setIsLoaded(true);\n onVideoLoaded?.();\n }, [onVideoLoaded]);\n\n // 视频播放事件\n const handleVideoPlay = useCallback(() => {\n setIsPlaying(true);\n onVideoPlay?.();\n }, [onVideoPlay]);\n\n // 视频暂停事件\n const handleVideoPause = useCallback(() => {\n setIsPlaying(false);\n onVideoPause?.();\n }, [onVideoPause]);\n\n // 视频结束事件\n const handleVideoEnded = useCallback(() => {\n setIsPlaying(false);\n onVideoEnded?.();\n }, [onVideoEnded]);\n\n // 卡片点击事件\n const handleCardClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n }, [onClick]);\n\n return (\n <AntCard\n {...rest}\n className={`video-card ${className || ''}`}\n style={{\n width,\n height,\n padding: 0,\n overflow: 'hidden',\n cursor: onClick ? 'pointer' : 'default',\n border: 'none',\n borderRadius: 0,\n ...style\n }}\n bordered={false}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleCardClick}\n >\n <div className=\"video-card-container\">\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n preload=\"metadata\"\n onLoadedData={handleVideoLoaded}\n onPlay={handleVideoPlay}\n onPause={handleVideoPause}\n onEnded={handleVideoEnded}\n muted={true}\n loop={true}\n />\n \n {/* 播放/暂停按钮 */}\n {showPlayButton && (\n <div \n className={`video-play-button ${isHovered ? 'hovered' : ''}`}\n onClick={togglePlay}\n >\n {isPlaying ? (\n <PauseCircleOutlined className=\"play-icon\" />\n ) : (\n <PlayCircleOutlined className=\"play-icon\" />\n )}\n </div>\n )}\n\n {/* 加载遮罩 */}\n {!isLoaded && (\n <div className=\"video-loading-mask\">\n <div className=\"loading-spinner\" />\n </div>\n )}\n </div>\n </AntCard>\n );\n};\n\n// 手动添加 docgen 信息\n(VideoCard as ComponentWithDocgen).__docgenInfo = {\n displayName: \"VideoCard\",\n description: \"视频卡片组件,支持鼠标悬浮播放控制\",\n props: {\n src: {\n name: \"src\",\n required: true,\n description: \"视频源地址\",\n type: { name: \"string\", raw: \"string\" }\n },\n poster: {\n name: \"poster\",\n required: false,\n description: \"视频海报图片\",\n type: { name: \"string\", raw: \"string\" }\n },\n width: {\n name: \"width\",\n required: false,\n description: \"卡片宽度\",\n type: { name: \"number | string\", raw: \"number | string\" },\n defaultValue: { value: \"300\" }\n },\n height: {\n name: \"height\",\n required: false,\n description: \"卡片高度\",\n type: { name: \"number | string\", raw: \"number | string\" }\n },\n videoWidth: {\n name: \"videoWidth\",\n required: false,\n description: \"视频宽度\",\n type: { name: \"number | string\", raw: \"number | string\" },\n defaultValue: { value: '\"100%\"' }\n },\n videoHeight: {\n name: \"videoHeight\",\n required: false,\n description: \"视频高度\",\n type: { name: \"number | string\", raw: \"number | string\" },\n defaultValue: { value: '\"100%\"' }\n },\n showPlayButton: {\n name: \"showPlayButton\",\n required: false,\n description: \"是否显示播放按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n autoPlayOnHover: {\n name: \"autoPlayOnHover\",\n required: false,\n description: \"是否自动播放(鼠标悬浮时)\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"(event: React.MouseEvent<HTMLDivElement>) => void\" }\n },\n onVideoLoaded: {\n name: \"onVideoLoaded\",\n required: false,\n description: \"视频加载完成事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n onVideoPlay: {\n name: \"onVideoPlay\",\n required: false,\n description: \"视频播放事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n onVideoPause: {\n name: \"onVideoPause\",\n required: false,\n description: \"视频暂停事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n onVideoEnded: {\n name: \"onVideoEnded\",\n required: false,\n description: \"视频结束事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义样式类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n style: {\n name: \"style\",\n required: false,\n description: \"自定义样式\",\n type: { name: \"CSSProperties\", raw: \"React.CSSProperties\" }\n }\n }\n};\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { VideoCard } from \"../VideoCard\";\nimport \"./index.css\";\n\nexport interface WaterfallItem {\n /** 媒体资源地址 */\n url: string;\n /** 媒体类型,不传则自动根据后缀判断 */\n type?: 'image' | 'video';\n /** 视频海报图(仅视频有效) */\n poster?: string;\n /** 唯一标识 */\n id?: string | number;\n /** 点击回调 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: (item: any) => void;\n /** 其他自定义数据 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport interface WaterfallProps {\n /** 媒体资源数组 */\n items: WaterfallItem[];\n /** 列数(默认会根据屏幕宽度自动响应) */\n columns?: number;\n /** 间隔大小 */\n gap?: number;\n /** 是否启用响应式布局 */\n responsive?: boolean;\n /** 响应式断点配置 */\n breakpoints?: {\n xs?: number; // < 576px\n sm?: number; // >= 576px\n md?: number; // >= 768px\n lg?: number; // >= 992px\n xl?: number; // >= 1200px\n xxl?: number; // >= 1600px\n };\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击回调 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: (item: any) => void;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<WaterfallProps> & { __docgenInfo?: DocgenInfo };\n\n// 判断是否为视频 URL\nconst isVideoUrl = (url: string): boolean => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.wmv', '.flv', '.mkv'];\n return videoExtensions.some(ext => url.toLowerCase().includes(ext));\n};\n\n// 获取媒体类型\nconst getMediaType = (item: WaterfallItem): 'image' | 'video' => {\n if (item.type) return item.type;\n if (isVideoUrl(item.url)) return 'video';\n return 'image';\n};\n\n/** 瀑布流布局组件,支持图片和视频混合展示 */\nexport const Waterfall: React.FC<WaterfallProps> = ({\n items,\n columns,\n gap = 0,\n responsive = true,\n breakpoints = {\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n xxl: 6\n },\n className,\n style,\n onClick\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [columnCount, setColumnCount] = useState<number>(columns || breakpoints.md || 3);\n const itemRefs = useRef<Map<string | number, HTMLDivElement>>(new Map());\n\n // 计算当前应该显示的列数\n const calculateColumns = useCallback(() => {\n if (!responsive || columns) {\n return columns || breakpoints.md || 3;\n }\n\n const width = window.innerWidth;\n \n if (width < 576) return breakpoints.xs || 1;\n if (width < 768) return breakpoints.sm || 2;\n if (width < 992) return breakpoints.md || 3;\n if (width < 1200) return breakpoints.lg || 4;\n if (width < 1600) return breakpoints.xl || 5;\n return breakpoints.xxl || 6;\n }, [responsive, columns, breakpoints]);\n\n // 布局计算\n const calculateLayout = useCallback(() => {\n if (!containerRef.current) return;\n\n const cols = columnCount;\n const container = containerRef.current;\n const containerWidth = container.offsetWidth;\n const columnWidth = (containerWidth - gap * (cols - 1)) / cols;\n \n // 初始化每列的高度\n const heights = new Array(cols).fill(0);\n\n // 为每个元素计算位置\n items.forEach((item, index) => {\n const key = item.id || index;\n const element = itemRefs.current.get(key);\n \n if (!element) return;\n\n // 找到最短的列\n const minHeight = Math.min(...heights);\n const columnIndex = heights.indexOf(minHeight);\n\n // 计算位置\n const left = columnIndex * (columnWidth + gap);\n const top = heights[columnIndex];\n\n // 设置元素位置和宽度\n element.style.position = 'absolute';\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.style.width = `${columnWidth}px`;\n\n // 更新列高度\n heights[columnIndex] += element.offsetHeight + gap;\n });\n\n // 设置容器高度\n const maxHeight = Math.max(...heights);\n container.style.height = `${maxHeight}px`;\n }, [items, columnCount, gap]);\n\n // 处理窗口大小变化\n useEffect(() => {\n const handleResize = () => {\n const newColumns = calculateColumns();\n if (newColumns !== columnCount) {\n setColumnCount(newColumns);\n }\n };\n\n if (responsive) {\n window.addEventListener('resize', handleResize);\n handleResize();\n \n return () => window.removeEventListener('resize', handleResize);\n }\n }, [responsive, calculateColumns, columnCount]);\n\n // 重新计算布局\n useEffect(() => {\n // 等待所有图片和视频加载完成后再计算布局\n const timer = setTimeout(() => {\n calculateLayout();\n }, 100);\n\n return () => clearTimeout(timer);\n }, [items, columnCount, calculateLayout]);\n\n // 图片加载完成后重新计算布局\n const handleImageLoad = useCallback(() => {\n calculateLayout();\n }, [calculateLayout]);\n\n // 处理项目点击\n const handleItemClick = useCallback((item: WaterfallItem) => {\n // 优先调用组件级别的 onClick\n if (onClick) {\n onClick(item);\n }\n // 然后调用 item 级别的 onClick\n item.onClick?.(item);\n }, [onClick]);\n\n return (\n <div\n ref={containerRef}\n className={`waterfall-container ${className || ''}`}\n style={{\n position: 'relative',\n width: '100%',\n ...style\n }}\n >\n {items.map((item, index) => {\n const key = item.id || index;\n const mediaType = getMediaType(item);\n\n return (\n <div\n key={key}\n ref={el => {\n if (el) {\n itemRefs.current.set(key, el);\n } else {\n itemRefs.current.delete(key);\n }\n }}\n className=\"waterfall-item\"\n >\n {mediaType === 'video' ? (\n <div style={{ \n width: '100%', \n position: 'relative', \n paddingBottom: '56.25%',\n cursor: (onClick || item.onClick) ? 'pointer' : 'default'\n }}>\n <div style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }}>\n <VideoCard\n src={item.url}\n poster={item.poster}\n width=\"100%\"\n height=\"100%\"\n onClick={() => handleItemClick(item)}\n onVideoLoaded={handleImageLoad}\n autoPlayOnHover={true}\n showPlayButton={false}\n />\n </div>\n </div>\n ) : (\n <div \n className=\"waterfall-image-wrapper\"\n onClick={() => handleItemClick(item)}\n style={{ cursor: (onClick || item.onClick) ? 'pointer' : 'default' }}\n >\n <img\n src={item.url}\n alt={`瀑布流图片 ${index + 1}`}\n className=\"waterfall-image\"\n onLoad={handleImageLoad}\n onError={handleImageLoad}\n style={{ display: 'block', width: '100%', height: 'auto' }}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(Waterfall as ComponentWithDocgen).__docgenInfo = {\n displayName: \"Waterfall\",\n description: \"瀑布流布局组件,支持图片和视频混合展示\",\n props: {\n items: {\n name: \"items\",\n required: true,\n description: \"媒体资源数组\",\n type: { name: \"WaterfallItem[]\", raw: \"WaterfallItem[]\" }\n },\n columns: {\n name: \"columns\",\n required: false,\n description: \"列数(默认会根据屏幕宽度自动响应)\",\n type: { name: \"number\", raw: \"number\" }\n },\n gap: {\n name: \"gap\",\n required: false,\n description: \"间隔大小\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"0\" }\n },\n responsive: {\n name: \"responsive\",\n required: false,\n description: \"是否启用响应式布局\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n breakpoints: {\n name: \"breakpoints\",\n required: false,\n description: \"响应式断点配置\",\n type: { name: \"object\", raw: \"{ xs?: number; sm?: number; md?: number; lg?: number; xl?: number; xxl?: number; }\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n style: {\n name: \"style\",\n required: false,\n description: \"自定义样式\",\n type: { name: \"CSSProperties\", raw: \"React.CSSProperties\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击回调\",\n type: { name: \"function\", raw: \"(item: any) => void\" }\n }\n }\n};\n\n","import { theme } from 'antd';\n\n// 明亮主题配置\nexport const lightTheme = {\n algorithm: theme.defaultAlgorithm,\n token: {\n // 主色\n colorPrimary: '#3b82f6',\n colorSuccess: '#10b981',\n colorWarning: '#f59e0b',\n colorError: '#ef4444',\n colorInfo: '#3b82f6',\n \n // 背景色\n colorBgBase: '#ffffff',\n colorBgContainer: '#ffffff',\n colorBgElevated: '#ffffff',\n colorBgLayout: '#f8fafc',\n \n // 文字色\n colorTextBase: '#1e293b',\n colorText: '#1e293b',\n colorTextSecondary: '#64748b',\n colorTextTertiary: '#94a3b8',\n colorTextQuaternary: '#cbd5e1',\n \n // 边框色\n colorBorder: '#e2e8f0',\n colorBorderSecondary: '#f1f5f9',\n \n // 阴影\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n \n // 圆角\n borderRadius: 8,\n borderRadiusLG: 12,\n borderRadiusSM: 6,\n \n // 字体\n fontFamily: 'Inter, system-ui, Arial, sans-serif',\n fontSize: 14,\n fontSizeLG: 16,\n fontSizeSM: 12,\n \n // 间距\n padding: 16,\n paddingLG: 24,\n paddingSM: 12,\n paddingXS: 8,\n \n // 高度\n controlHeight: 32,\n controlHeightLG: 40,\n controlHeightSM: 24,\n },\n components: {\n Button: {\n borderRadius: 8,\n controlHeight: 32,\n fontWeight: 500,\n },\n Card: {\n borderRadiusLG: 12,\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n },\n Input: {\n borderRadius: 8,\n controlHeight: 32,\n },\n Table: {\n borderRadiusLG: 8,\n headerBg: '#f8fafc',\n headerColor: '#374151',\n },\n },\n};\n\nexport default lightTheme;\n"],"names":["Button","variant","loading","children","rest","jsx","AntButton","Card","title","bordered","hoverable","size","AntCard","AppModal","showDefaultFooter","props","footer","_","OkBtn","CancelBtn","jsxs","Fragment","Modal","PageTable","scrollX","showPagination","defaultPageSize","Table","IconFont","createFromIconfontCN","XcIcon","name","color","style","iconStyle","EmptyAndSpin","description","className","emptyChildren","loadingText","emptyImage","Flex","Spin","Empty","BackButton","onClick","showText","type","LeftOutlined","LinkButton","removePadding","linkClassName","Option","Select","AdvancedTable","columns","request","searchFields","showSearch","showRefresh","pageSizeOptions","autoLoad","externalParams","tableProps","dataSource","setDataSource","useState","setLoading","pagination","setPagination","searchParams","setSearchParams","sortInfo","setSortInfo","form","Form","paginationRef","useRef","externalParamsRef","initializedRef","processedColumns","useMemo","col","sortable","render","restCol","value","loadData","useCallback","params","requestParams","response","prev","error","handleSearch","values","handleReset","handleRefresh","handleTableChange","_filters","sorter","newPagination","newSortInfo","useEffect","hasExternalParams","acc","field","Input","option","Space","SearchOutlined","ReloadOutlined","total","range","checkExclusionStates","editorRef","config","files","exclusionGroups","groupNodes","node","groupHasValue","groupName","groupNode","variableEl","hasSeparator","hasAnyValue","firstGroupWithValue","groupElements","el","validateRequiredFields","setIsFormValid","requiredFields","j","nextNode","mutuallyExclusiveGroups","separatorIndices","index","separatorIndex","beforeField","a","b","afterField","textContent","visibleRequiredFields","uploadEl","parent","multiVariableEls","firstEl","selectEl","textareaEl","richtextEl","dpEl","mutuallyExclusiveFieldKeys","group","nonExclusiveFields","allMutuallyExclusiveGroupsValid","visibleGroupFields","hasAnyValid","filledCount","need","allNonExclusiveFieldsValid","updatePlaceholders","forceActiveElement","rawText","initializeEditorContent","lockStructure","variableValues","multiVariableCounts","hideButtons","html","i","isNextUpload","isNextVariable","wrapperStart","wrapperEnd","requiredIconHtml","uploadNode","hasFile","fileObj","fileName","showRemoveBtn","showInfoIcon","hasFileClass","fileNameAttr","uploadIcon","uploadHtml","variableNode","initialText","isPlaceholder","displayText","placeholderClass","variableGroupAttr","tooltipAttr","variableHtml","groupAttr","nodeHtml","closeBtnHtml","lockedAttr","textWithBreak","savedValue","optionsHtml","opt","selected","placeholderOption","selectHtml","maxHeight","expandable","placeholderAttr","textareaHtml","toggleBtn","wrapper","minHeight","richContent","richHtml","container","limitRangeAttr","disableFutureAttr","pickerHost","maxCount","count","actualCount","wrapperGroupAttr","multiVariableHtml","idx","itemKey","useInitializeEditorContent","savedCursorRef","lockedMultiVariables","tempValues","key","text","val","initEditorContent","offset","targetVariable","walker","currentOffset","targetNode","targetOffset","nodeLength","selection","useUploadInfoTooltip","setPopoverVisible","editor","handleMouseOver","e","target","uploadChip","file","handleMouseOut","relatedTarget","related","useTagTooltip","handleMouseEnter","tooltip","handleMouseLeave","rafId","bindEvents","tagNode","useVariableTooltip","useUploadLabelTooltip","label","useExclusionAndValidation","timer","useSelectionControl","isDraggingRef","datePickerInteractionRef","isMouseDown","lastClickTime","isDatePickerTarget","handleMouseDown","handleMouseUp","isComposing","lastInputTime","handleCompositionStart","handleCompositionEnd","handleInput","handleFocusIn","handleSelectionChange","activeEl","anchor","isInDatePicker","variables","variable","newRange","currentEditor","t","module","this","n","r","s","u","o","c","f","h","d","l","$","y","M","m","v","g","D","p","S","w","O","k","require$$0","_typeof","toPrimitive","toPropertyKey","_defineProperty","ownKeys","_objectSpread2","defineProperty","commonLocale","locale","_objectSpread","CalendarLocale","TimePickerLocale","dayjs","RangePicker","DatePicker","DatePickerPortal","host","onChange","initialValueStr","placeholderStr","limitRange","disableFuture","dates","setDates","parts","hackValue","setHackValue","createPortal","current","str","open","zhCN","useDatePickerPortals","portals","setPortals","updatePortals","hosts","newPortals","event","observer","mutations","shouldUpdate","mutation","relevantChange","RichTextEditor","onSend","isProcessing","disabled","width","agentOptions","onAgentSelect","onAgentExit","placeholder","border","background","fileInputRef","setFiles","activeFileKey","setActiveFileKey","popoverVisible","mouseDownPosRef","isFormValid","isEmpty","setIsEmpty","setMultiVariableCounts","counts","agentStatesRef","filesRef","multiVariableCountsRef","getAgentId","prevConfigRef","pendingRestoreRef","prevAgentId","currentAgentId","savedState","useLayoutEffect","datePickerPortals","checkEmpty","uploads","hasContent","isEditorEmpty","handlePaste","multiKey","separatorRegex","currentIndex","currentCount","neededCount","allValues","finalValues","finalCount","elMultiKey","content","handleFileChange","handleRemoveFile","next","textNode","handleMouseMove","deltaX","deltaY","handleEditorClick","toggleRichtextFullscreenVisibility","hostEl","expanded","child","textareaToggle","textarea","requiredWrapper","richtextToggle","rich","isExpanded","removeBtn","handleDoubleClick","variableChip","startOffset","endOffset","chip","infoIcon","hasText","hasEmptyBox","hasEmptyInMiddle","emptyIndex","currentVariableEl","rangeBefore","newValues","lastIndex","lastKey","lastVariableEl","listeners","handleEditorBlur","bindBlurEvents","handler","element","multiVariableInputs","handleBlurEvent","isBoundElement","currentKey","validParts","maxAllowed","input","timeoutId","handleKeyDown","variableOrUpload","handleSend","tagEl","textEl","root","fullPrompt","dataPayload","traverse","currentArray","selectedOption","formData","item","containerStyle","Dropdown","agent","currentAgent","tooltipContent","overlayStyle","url","titleColor","Tooltip","autoLoadIcon","BATCH_SIZE_OPTIONS","AutoLoadControl","autoLoading","batchSize","loadingProgress","loadIcon","onBatchSizeChange","onLoadNextPage","onStartAutoLoad","onStopLoad","Progress","PaginationFooter","pageSize","cachedPages","loadedCount","onStopLoading","setBatchSize","totalPages","hideAutoLoadControl","calculateNextPagesToLoad","page","InfoCircleOutlined","nextPages","Pagination","__","originalElement","isLoaded","VirtualTable","onChangePage","restProps","tableRef","handleChangePage","DynamicInput","texts","animationSpeed","autoPlay","inputProps","currentText","setCurrentText","setCurrentIndex","isAnimating","setIsAnimating","isFocused","setIsFocused","isTyping","setIsTyping","animationRef","typingRef","textsRef","currentIndexRef","isFocusedRef","currentTextRef","typeText","callback","typeChar","deleteText","deleteChar","playAnimation","currentTextItem","DynamicTextArea","onSubmit","maxLength","showCount","submitText","rows","otherProps","internalValue","setInternalValue","textareaRef","handleFocus","handleBlur","handleChange","newValue","handleSubmit","currentValue","isSubmitDisabled","SendOutlined","VideoCard","src","poster","height","videoWidth","videoHeight","showPlayButton","autoPlayOnHover","onVideoLoaded","onVideoPlay","onVideoPause","onVideoEnded","videoRef","isPlaying","setIsPlaying","isHovered","setIsHovered","setIsLoaded","playVideo","pauseVideo","togglePlay","handleVideoLoaded","handleVideoPlay","handleVideoPause","handleVideoEnded","handleCardClick","PauseCircleOutlined","PlayCircleOutlined","isVideoUrl","ext","getMediaType","Waterfall","items","gap","responsive","breakpoints","containerRef","columnCount","setColumnCount","itemRefs","calculateColumns","calculateLayout","cols","columnWidth","heights","columnIndex","left","top","handleResize","newColumns","handleImageLoad","handleItemClick","mediaType","lightTheme","theme"],"mappings":"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","x_google_ignoreList":[14,15,16,17,18,19,20,21,22,23,24]}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/components/Button/index.tsx","../src/components/Card/index.tsx","../src/components/AppModal/index.tsx","../src/components/PageTable/index.tsx","../src/components/XcIcon/index.tsx","../src/components/EmptyAndSpin/index.tsx","../src/components/BackButton/index.tsx","../src/components/LinkButton/index.tsx","../src/components/AdvancedTable/index.tsx","../src/components/RichTextEditor/exclusionLogic.ts","../src/components/RichTextEditor/validation.ts","../src/components/RichTextEditor/placeholders.ts","../src/components/RichTextEditor/htmlGenerator.ts","../src/components/RichTextEditor/hooks.ts","../node_modules/.pnpm/dayjs@1.11.18/node_modules/dayjs/dayjs.min.js","../node_modules/.pnpm/dayjs@1.11.18/node_modules/dayjs/locale/zh-cn.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/.pnpm/@babel+runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/.pnpm/rc-picker@4.11.3_dayjs@1.11.18_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/rc-picker/es/locale/common.js","../node_modules/.pnpm/rc-picker@4.11.3_dayjs@1.11.18_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/rc-picker/es/locale/zh_CN.js","../node_modules/.pnpm/antd@5.27.4_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/antd/es/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@5.27.4_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/antd/es/date-picker/locale/zh_CN.js","../src/components/RichTextEditor/DatePickerPortal.tsx","../src/components/RichTextEditor/index.tsx","../src/assets/autoLoading.png","../src/components/VirtualTable/AutoLoadControl.tsx","../src/components/VirtualTable/PaginationFooter.tsx","../src/components/VirtualTable/index.tsx","../src/components/DynamicInput/index.tsx","../src/components/DynamicTextArea/index.tsx","../src/components/VideoCard/index.tsx","../src/components/Waterfall/index.tsx","../src/theme.ts"],"sourcesContent":["import React from \"react\";\nimport { Button as AntButton, type ButtonProps as AntButtonProps } from \"antd\";\n\nexport type ButtonVariant = \"primary\" | \"ghost\" | \"dashed\" | \"link\" | \"text\";\n\nexport interface ButtonProps extends Omit<AntButtonProps, 'type' | 'ghost' | 'variant'> {\n /** 视觉风格 */\n variant?: ButtonVariant;\n /** 是否加载中 */\n loading?: boolean;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<ButtonProps> & { __docgenInfo?: DocgenInfo };\n\n/** 基础按钮,用于触发操作 */\nexport const Button: React.FC<ButtonProps> = ({\n variant = \"primary\",\n loading = false,\n children,\n ...rest\n}) => {\n // 将自定义 variant 映射到 antd 的 type\n const getAntdType = (variant: ButtonVariant): AntButtonProps['type'] => {\n switch (variant) {\n case \"primary\":\n return \"primary\";\n case \"ghost\":\n return \"default\";\n case \"dashed\":\n return \"dashed\";\n case \"link\":\n return \"link\";\n case \"text\":\n return \"text\";\n default:\n return \"primary\";\n }\n };\n\n return (\n <AntButton\n {...rest}\n type={getAntdType(variant)}\n loading={loading}\n ghost={variant === \"ghost\"}\n >\n {children}\n </AntButton>\n );\n};\n\n// 手动添加 docgen 信息\n(Button as ComponentWithDocgen).__docgenInfo = {\n displayName: \"Button\",\n description: \"基础按钮,用于触发操作\",\n props: {\n variant: {\n name: \"variant\",\n required: false,\n description: \"视觉风格\",\n type: { name: \"ButtonVariant\", raw: '\"primary\" | \"ghost\" | \"dashed\" | \"link\" | \"text\"' },\n defaultValue: { value: '\"primary\"' }\n },\n loading: {\n name: \"loading\",\n required: false,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"按钮内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"按钮大小\",\n type: { name: \"ButtonSize\", raw: '\"small\" | \"middle\" | \"large\"' }\n },\n disabled: {\n name: \"disabled\",\n required: false,\n description: \"是否禁用\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"(event: MouseEvent) => void\" }\n }\n }\n};\n","import React from \"react\";\nimport { Card as AntCard, type CardProps as AntCardProps } from \"antd\";\n\nexport interface CardProps extends Omit<AntCardProps, 'title'> {\n /** 标题 */\n title?: React.ReactNode;\n /** 内容区域 */\n children?: React.ReactNode;\n /** 是否显示边框 */\n bordered?: boolean;\n /** 是否可悬停 */\n hoverable?: boolean;\n /** 卡片大小 */\n size?: \"default\" | \"small\";\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<CardProps> & { __docgenInfo?: DocgenInfo };\n\n/** 卡片容器,用于分组内容 */\nexport const Card: React.FC<CardProps> = ({ \n title, \n children, \n bordered = true,\n hoverable = false,\n size = \"default\",\n ...rest \n}) => (\n <AntCard\n {...rest}\n title={title}\n bordered={bordered}\n hoverable={hoverable}\n size={size}\n >\n {children}\n </AntCard>\n);\n\n// 手动添加 docgen 信息\n(Card as ComponentWithDocgen).__docgenInfo = {\n displayName: \"Card\",\n description: \"卡片容器,用于分组内容\",\n props: {\n title: {\n name: \"title\",\n required: false,\n description: \"标题\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"内容区域\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n bordered: {\n name: \"bordered\",\n required: false,\n description: \"是否显示边框\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n hoverable: {\n name: \"hoverable\",\n required: false,\n description: \"是否可悬停\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"卡片大小\",\n type: { name: \"CardSize\", raw: '\"default\" | \"small\"' },\n defaultValue: { value: '\"default\"' }\n },\n loading: {\n name: \"loading\",\n required: false,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n actions: {\n name: \"actions\",\n required: false,\n description: \"卡片操作组\",\n type: { name: \"ReactNode[]\", raw: \"React.ReactNode[]\" }\n }\n }\n};\n","import React from \"react\";\nimport { Modal, type ModalProps } from \"antd\";\n\nexport interface AppModalProps extends ModalProps {\n /** 是否显示默认的确定和取消按钮 */\n showDefaultFooter?: boolean;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<AppModalProps> & { __docgenInfo?: DocgenInfo };\n\n/** 应用级模态框组件,基于 Ant Design Modal 封装 */\nexport const AppModal: React.FC<AppModalProps> = ({ \n showDefaultFooter = true,\n ...props \n}) => {\n const footer = props.footer !== undefined \n ? props.footer \n : showDefaultFooter \n ? (_: React.ReactNode, { OkBtn, CancelBtn }: { OkBtn: React.ComponentType<Record<string, unknown>>; CancelBtn: React.ComponentType<Record<string, unknown>> }) => (\n <>\n <OkBtn />\n <CancelBtn />\n </>\n )\n : null;\n\n return (\n <Modal\n {...props}\n footer={footer}\n />\n );\n};\n\n// 手动添加 docgen 信息\n(AppModal as ComponentWithDocgen).__docgenInfo = {\n displayName: \"AppModal\",\n description: \"应用级模态框组件,基于 Ant Design Modal 封装\",\n props: {\n showDefaultFooter: {\n name: \"showDefaultFooter\",\n required: false,\n description: \"是否显示默认的确定和取消按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n title: {\n name: \"title\",\n required: false,\n description: \"模态框标题\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n open: {\n name: \"open\",\n required: false,\n description: \"是否显示模态框\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n onCancel: {\n name: \"onCancel\",\n required: false,\n description: \"取消按钮点击事件\",\n type: { name: \"function\", raw: \"(e: React.MouseEvent<HTMLElement>) => void\" }\n },\n onOk: {\n name: \"onOk\",\n required: false,\n description: \"确定按钮点击事件\",\n type: { name: \"function\", raw: \"(e: React.MouseEvent<HTMLElement>) => void\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"模态框内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n width: {\n name: \"width\",\n required: false,\n description: \"模态框宽度\",\n type: { name: \"string | number\", raw: \"string | number\" }\n },\n centered: {\n name: \"centered\",\n required: false,\n description: \"是否居中显示\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n maskClosable: {\n name: \"maskClosable\",\n required: false,\n description: \"点击蒙层是否允许关闭\",\n type: { name: \"boolean\", raw: \"boolean\" }\n }\n }\n};\n","import React from \"react\";\nimport { Table, type TableProps } from \"antd\";\n\nexport interface PageTableProps extends TableProps<Record<string, unknown>> {\n /** 水平滚动宽度 */\n scrollX?: number;\n /** 是否显示分页器 */\n showPagination?: boolean;\n /** 默认页面大小 */\n defaultPageSize?: number;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<PageTableProps> & { __docgenInfo?: DocgenInfo };\n\n/** 页面级表格组件,高度铺满容器,自动滚动 */\nexport const PageTable: React.FC<PageTableProps> = ({\n scrollX,\n showPagination = true,\n defaultPageSize = 10,\n ...props\n}) => {\n return (\n <Table\n {...props}\n scroll={{ \n x: scrollX || 'max-content', \n y: '50vh' \n }}\n pagination={showPagination ? {\n hideOnSinglePage: true,\n showSizeChanger: true,\n showQuickJumper: true,\n defaultPageSize,\n ...props.pagination,\n } : false}\n />\n );\n};\n\n// 手动添加 docgen 信息\n(PageTable as ComponentWithDocgen).__docgenInfo = {\n displayName: \"PageTable\",\n description: \"页面级表格组件,高度铺满容器,自动滚动\",\n props: {\n scrollX: {\n name: \"scrollX\",\n required: false,\n description: \"水平滚动宽度\",\n type: { name: \"number\", raw: \"number\" }\n },\n showPagination: {\n name: \"showPagination\",\n required: false,\n description: \"是否显示分页器\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n defaultPageSize: {\n name: \"defaultPageSize\",\n required: false,\n description: \"默认页面大小\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"10\" }\n },\n columns: {\n name: \"columns\",\n required: false,\n description: \"表格列配置\",\n type: { name: \"ColumnType[]\", raw: \"ColumnType<any>[]\" }\n },\n dataSource: {\n name: \"dataSource\",\n required: false,\n description: \"数据源\",\n type: { name: \"any[]\", raw: \"any[]\" }\n },\n loading: {\n name: \"loading\",\n required: false,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n rowKey: {\n name: \"rowKey\",\n required: false,\n description: \"行数据的 Key\",\n type: { name: \"string | function\", raw: \"string | ((record: any) => string)\" }\n }\n }\n};\n","import React from \"react\";\nimport { createFromIconfontCN } from '@ant-design/icons';\n\nconst IconFont = createFromIconfontCN({\n scriptUrl: ['https://at.alicdn.com/t/c/font_4968458_eh91gfr4j9e.js'],\n});\n\nexport interface XcIconProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 图标名称 */\n name: string;\n /** 图标大小 */\n size?: number | string;\n /** 图标颜色 */\n color?: string;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<XcIconProps> & { __docgenInfo?: DocgenInfo };\n\n/** 自定义图标组件,基于 iconfont */\nexport const XcIcon: React.FC<XcIconProps> = ({ \n name, \n size, \n color, \n style,\n ...props \n}) => {\n const iconStyle = {\n fontSize: size,\n color,\n ...style,\n };\n\n return (\n <IconFont \n {...props} \n type={name} \n style={iconStyle}\n />\n );\n};\n\n// 手动添加 docgen 信息\n(XcIcon as ComponentWithDocgen).__docgenInfo = {\n displayName: \"XcIcon\",\n description: \"自定义图标组件,基于 iconfont\",\n props: {\n name: {\n name: \"name\",\n required: true,\n description: \"图标名称\",\n type: { name: \"string\", raw: \"string\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"图标大小\",\n type: { name: \"number | string\", raw: \"number | string\" }\n },\n color: {\n name: \"color\",\n required: false,\n description: \"图标颜色\",\n type: { name: \"string\", raw: \"string\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n style: {\n name: \"style\",\n required: false,\n description: \"自定义样式\",\n type: { name: \"CSSProperties\", raw: \"React.CSSProperties\" }\n }\n }\n};\n","import React from \"react\";\nimport { Empty, Flex, Spin } from \"antd\";\n\nexport interface EmptyAndSpinProps {\n /** 是否加载中 */\n loading: boolean;\n /** 空状态描述 */\n description?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 空状态额外内容 */\n emptyChildren?: React.ReactNode;\n /** 加载中提示文字 */\n loadingText?: string;\n /** 空状态图片 */\n emptyImage?: string;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<EmptyAndSpinProps> & { __docgenInfo?: DocgenInfo };\n\n/** 空状态和加载状态组合组件 */\nexport const EmptyAndSpin: React.FC<EmptyAndSpinProps> = ({ \n loading, \n description = \"暂无数据\", \n className, \n emptyChildren,\n loadingText,\n emptyImage\n}) => {\n if (loading) {\n return (\n <Flex\n className={`pt-10 w-full ${className || ''}`}\n align=\"center\"\n justify=\"center\"\n vertical\n >\n <Spin size=\"large\" />\n {loadingText && <div className=\"mt-4 text-gray-500\">{loadingText}</div>}\n </Flex>\n );\n }\n\n return (\n <Flex\n className={`pt-10 w-full ${className || ''}`}\n align=\"center\"\n justify=\"center\"\n >\n <Empty\n image={emptyImage}\n description={description}\n imageStyle={{ height: 180 }}\n >\n {emptyChildren}\n </Empty>\n </Flex>\n );\n};\n\n// 手动添加 docgen 信息\n(EmptyAndSpin as ComponentWithDocgen).__docgenInfo = {\n displayName: \"EmptyAndSpin\",\n description: \"空状态和加载状态组合组件\",\n props: {\n loading: {\n name: \"loading\",\n required: true,\n description: \"是否加载中\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n description: {\n name: \"description\",\n required: false,\n description: \"空状态描述\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" },\n defaultValue: { value: '\"暂无数据\"' }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n emptyChildren: {\n name: \"emptyChildren\",\n required: false,\n description: \"空状态额外内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n loadingText: {\n name: \"loadingText\",\n required: false,\n description: \"加载中提示文字\",\n type: { name: \"string\", raw: \"string\" }\n },\n emptyImage: {\n name: \"emptyImage\",\n required: false,\n description: \"空状态图片\",\n type: { name: \"string\", raw: \"string\" }\n }\n }\n};\n","import React from \"react\";\nimport { Button } from \"antd\";\nimport { LeftOutlined } from '@ant-design/icons';\n\nexport interface BackButtonProps {\n /** 点击事件 */\n onClick?: () => void;\n /** 是否显示文字 */\n showText?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 按钮大小 */\n size?: \"small\" | \"middle\" | \"large\";\n /** 按钮类型 */\n type?: \"primary\" | \"default\" | \"dashed\" | \"link\" | \"text\";\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<BackButtonProps> & { __docgenInfo?: DocgenInfo };\n\n/** 返回按钮组件 */\nexport const BackButton: React.FC<BackButtonProps> = ({ \n onClick, \n showText = false,\n className,\n size = \"small\",\n type = \"default\"\n}) => {\n return (\n <Button\n size={size}\n type={type}\n icon={<LeftOutlined />}\n className={`cursor-pointer ${className || ''}`}\n onClick={onClick}\n >\n {showText && \"返回\"}\n </Button>\n );\n};\n\n// 手动添加 docgen 信息\n(BackButton as ComponentWithDocgen).__docgenInfo = {\n displayName: \"BackButton\",\n description: \"返回按钮组件\",\n props: {\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n showText: {\n name: \"showText\",\n required: false,\n description: \"是否显示文字\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n size: {\n name: \"size\",\n required: false,\n description: \"按钮大小\",\n type: { name: \"ButtonSize\", raw: '\"small\" | \"middle\" | \"large\"' },\n defaultValue: { value: '\"small\"' }\n },\n type: {\n name: \"type\",\n required: false,\n description: \"按钮类型\",\n type: { name: \"ButtonType\", raw: '\"primary\" | \"default\" | \"dashed\" | \"link\" | \"text\"' },\n defaultValue: { value: '\"default\"' }\n }\n }\n};\n","import React from \"react\";\nimport { Button, type ButtonProps } from \"antd\";\n\nexport interface LinkButtonProps extends ButtonProps {\n /** 是否去除默认内边距 */\n removePadding?: boolean;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<LinkButtonProps> & { __docgenInfo?: DocgenInfo };\n\n/** 链接样式按钮组件,适用于表格操作列 */\nexport const LinkButton: React.FC<LinkButtonProps> = ({ \n removePadding = true,\n className,\n ...props \n}) => {\n const linkClassName = removePadding \n ? `px-0 h-auto ${className || ''}` \n : className;\n\n return (\n <Button \n type=\"link\" \n {...props} \n className={linkClassName}\n >\n {props.children}\n </Button>\n );\n};\n\n// 手动添加 docgen 信息\n(LinkButton as ComponentWithDocgen).__docgenInfo = {\n displayName: \"LinkButton\",\n description: \"链接样式按钮组件,适用于表格操作列\",\n props: {\n removePadding: {\n name: \"removePadding\",\n required: false,\n description: \"是否去除默认内边距\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n children: {\n name: \"children\",\n required: false,\n description: \"按钮内容\",\n type: { name: \"ReactNode\", raw: \"React.ReactNode\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"(event: React.MouseEvent<HTMLButtonElement>) => void\" }\n },\n disabled: {\n name: \"disabled\",\n required: false,\n description: \"是否禁用\",\n type: { name: \"boolean\", raw: \"boolean\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n }\n }\n};\n","import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { Table, Input, Select, Button, Space, Form, Card } from \"antd\";\nimport { SearchOutlined, ReloadOutlined } from \"@ant-design/icons\";\nimport type { TableProps, TablePaginationConfig } from \"antd\";\nimport type { ColumnType } from \"antd/es/table\";\n\nconst { Option } = Select;\n\n// 搜索字段配置\nexport interface SearchFieldConfig {\n /** 字段名 */\n key: string;\n /** 字段标签 */\n label: string;\n /** 搜索类型 */\n type: 'input' | 'select';\n /** 选择器选项(当type为select时使用) */\n options?: Array<{ label: string; value: string | number }>;\n /** 占位符 */\n placeholder?: string;\n /** 默认值 */\n defaultValue?: unknown;\n}\n\n// 列配置扩展\nexport interface AdvancedColumnType<T = Record<string, unknown>> extends ColumnType<T> {\n /** 是否支持排序 */\n sortable?: boolean;\n /** 自定义渲染函数 */\n render?: (value: unknown, record: T, index: number) => React.ReactNode;\n}\n\n// 请求参数\nexport interface RequestParams {\n /** 页码 */\n page: number;\n /** 每页大小 */\n pageSize: number;\n /** 排序字段 */\n sortField?: string;\n /** 排序方向 */\n sortOrder?: 'ascend' | 'descend';\n /** 搜索参数 */\n searchParams?: Record<string, unknown>;\n}\n\n// 请求响应\nexport interface RequestResponse<T = Record<string, unknown>> {\n /** 数据列表 */\n data: T[];\n /** 总数 */\n total: number;\n /** 是否成功 */\n success: boolean;\n /** 错误信息 */\n message?: string;\n}\n\n// 组件属性\nexport interface AdvancedTableProps<T = Record<string, unknown>> extends Omit<TableProps<T>, 'dataSource' | 'loading' | 'pagination'> {\n /** 列配置 */\n columns: AdvancedColumnType<T>[];\n /** 异步请求函数 */\n request?: (params: RequestParams) => Promise<RequestResponse<T>>;\n /** 搜索字段配置 */\n searchFields?: SearchFieldConfig[];\n /** 是否显示搜索区域 */\n showSearch?: boolean;\n /** 是否显示刷新按钮 */\n showRefresh?: boolean;\n /** 默认页面大小 */\n defaultPageSize?: number;\n /** 页面大小选项 */\n pageSizeOptions?: string[];\n /** 是否自动加载 */\n autoLoad?: boolean;\n /** 请求参数(外部控制) */\n externalParams?: Record<string, unknown>;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<AdvancedTableProps> & { __docgenInfo?: DocgenInfo };\n\n/** 高阶表格组件,支持异步请求、搜索、排序等功能 */\nexport const AdvancedTable: React.FC<AdvancedTableProps> = ({\n columns,\n request,\n searchFields = [],\n showSearch = true,\n showRefresh = true,\n defaultPageSize = 10,\n pageSizeOptions = ['10', '20', '50', '100'],\n autoLoad = true,\n externalParams = {},\n ...tableProps\n}) => {\n // 状态管理\n const [dataSource, setDataSource] = useState<Record<string, unknown>[]>([]);\n const [loading, setLoading] = useState(false);\n const [pagination, setPagination] = useState({\n current: 1,\n pageSize: defaultPageSize,\n total: 0,\n });\n const [searchParams, setSearchParams] = useState<Record<string, unknown>>({});\n const [sortInfo, setSortInfo] = useState<{\n field?: string;\n order?: 'ascend' | 'descend';\n }>({});\n\n // 搜索表单\n const [form] = Form.useForm();\n \n // 使用 ref 来避免依赖问题\n const paginationRef = useRef(pagination);\n paginationRef.current = pagination;\n // 使用 ref 来避免 externalParams 的依赖问题\n const externalParamsRef = useRef(externalParams);\n externalParamsRef.current = externalParams;\n\n // 使用 ref 来跟踪是否已经初始化\n const initializedRef = useRef(false);\n\n // 处理列配置\n const processedColumns = useMemo(() => {\n return columns.map((col) => {\n const { sortable, render, ...restCol } = col;\n \n return {\n ...restCol,\n sorter: sortable ? true : undefined,\n render: render || ((value: unknown) => value as React.ReactNode),\n };\n });\n }, [columns]);\n\n // 加载数据\n const loadData = useCallback(async (params: Partial<RequestParams> = {}) => {\n if (!request) return;\n\n setLoading(true);\n try {\n const requestParams: RequestParams = {\n page: paginationRef.current.current,\n pageSize: paginationRef.current.pageSize,\n sortField: sortInfo.field,\n sortOrder: sortInfo.order,\n searchParams: { ...searchParams, ...externalParamsRef.current },\n ...params,\n };\n\n const response = await request(requestParams);\n \n if (response.success) {\n setDataSource(response.data);\n setPagination(prev => ({\n ...prev,\n total: response.total,\n current: requestParams.page || prev.current,\n }));\n }\n } catch (error) {\n console.error('加载数据失败:', error);\n } finally {\n setLoading(false);\n }\n }, [request, sortInfo, searchParams]);\n\n // 搜索处理\n const handleSearch = useCallback((values: Record<string, unknown>) => {\n setSearchParams(values);\n setPagination(prev => ({ ...prev, current: 1 }));\n }, []);\n\n // 重置搜索\n const handleReset = useCallback(() => {\n form.resetFields();\n setSearchParams({});\n setPagination(prev => ({ ...prev, current: 1 }));\n }, [form]);\n\n // 刷新数据\n const handleRefresh = useCallback(() => {\n loadData();\n }, [loadData]);\n\n // 分页变化\n const handleTableChange = useCallback((pagination: TablePaginationConfig, _filters: unknown, sorter: unknown) => {\n const newPagination = {\n current: pagination.current || 1,\n pageSize: pagination.pageSize || defaultPageSize,\n total: pagination.total || 0,\n };\n \n const newSortInfo = {\n field: (sorter as { field?: string })?.field,\n order: (sorter as { order?: 'ascend' | 'descend' })?.order,\n };\n\n setPagination(newPagination);\n setSortInfo(newSortInfo);\n }, [defaultPageSize]);\n\n // 初始加载和外部参数变化时重新加载\n useEffect(() => {\n const hasExternalParams = Object.keys(externalParams).length > 0;\n\n // 如果是自动加载且未初始化,或者是外部参数变化\n if ((autoLoad && !initializedRef.current) || hasExternalParams) {\n loadData();\n initializedRef.current = true;\n }\n }, [autoLoad, externalParams, loadData]);\n\n return (\n <div>\n {/* 搜索区域 */}\n {showSearch && searchFields.length > 0 && (\n <Card size=\"small\" style={{ marginBottom: 16 }}>\n <Form\n form={form}\n layout=\"inline\"\n onFinish={handleSearch}\n initialValues={searchFields.reduce((acc, field) => {\n if (field.defaultValue !== undefined) {\n acc[field.key] = field.defaultValue;\n }\n return acc;\n }, {} as Record<string, unknown>)}\n >\n {searchFields.map((field) => (\n <Form.Item key={field.key} name={field.key} label={field.label}>\n {field.type === 'input' ? (\n <Input\n placeholder={field.placeholder || `请输入${field.label}`}\n style={{ width: 200 }}\n />\n ) : (\n <Select\n placeholder={field.placeholder || `请选择${field.label}`}\n style={{ width: 200 }}\n allowClear\n >\n {field.options?.map((option) => (\n <Option key={option.value} value={option.value}>\n {option.label}\n </Option>\n ))}\n </Select>\n )}\n </Form.Item>\n ))}\n \n <Form.Item>\n <Space>\n <Button type=\"primary\" htmlType=\"submit\" icon={<SearchOutlined />}>\n 查询\n </Button>\n <Button onClick={handleReset}>重置</Button>\n {showRefresh && (\n <Button icon={<ReloadOutlined />} onClick={handleRefresh}>\n 刷新\n </Button>\n )}\n </Space>\n </Form.Item>\n </Form>\n </Card>\n )}\n\n {/* 表格 */}\n <Table\n {...tableProps}\n columns={processedColumns}\n dataSource={dataSource}\n loading={loading}\n pagination={{\n ...pagination,\n showSizeChanger: true,\n showQuickJumper: true,\n showTotal: (total, range) => `第 ${range[0]}-${range[1]} 条/共 ${total} 条`,\n pageSizeOptions,\n }}\n onChange={handleTableChange}\n scroll={{ x: 'max-content', y: '50vh' }}\n />\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(AdvancedTable as ComponentWithDocgen).__docgenInfo = {\n displayName: \"AdvancedTable\",\n description: \"高阶表格组件,支持异步请求、搜索、排序等功能\",\n props: {\n columns: {\n name: \"columns\",\n required: true,\n description: \"列配置\",\n type: { name: \"AdvancedColumnType[]\", raw: \"AdvancedColumnType<any>[]\" }\n },\n request: {\n name: \"request\",\n required: false,\n description: \"异步请求函数\",\n type: { name: \"function\", raw: \"(params: RequestParams) => Promise<RequestResponse>\" }\n },\n searchFields: {\n name: \"searchFields\",\n required: false,\n description: \"搜索字段配置\",\n type: { name: \"SearchFieldConfig[]\", raw: \"SearchFieldConfig[]\" },\n defaultValue: { value: \"[]\" }\n },\n showSearch: {\n name: \"showSearch\",\n required: false,\n description: \"是否显示搜索区域\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n showRefresh: {\n name: \"showRefresh\",\n required: false,\n description: \"是否显示刷新按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n defaultPageSize: {\n name: \"defaultPageSize\",\n required: false,\n description: \"默认页面大小\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"10\" }\n },\n pageSizeOptions: {\n name: \"pageSizeOptions\",\n required: false,\n description: \"页面大小选项\",\n type: { name: \"string[]\", raw: \"string[]\" },\n defaultValue: { value: '[\"10\", \"20\", \"50\", \"100\"]' }\n },\n autoLoad: {\n name: \"autoLoad\",\n required: false,\n description: \"是否自动加载\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n externalParams: {\n name: \"externalParams\",\n required: false,\n description: \"外部请求参数\",\n type: { name: \"Record<string, any>\", raw: \"Record<string, any>\" },\n defaultValue: { value: \"{}\" }\n }\n }\n};\n","import type React from 'react';\nimport type { InputNode, NodeType } from './types';\n\n/**\n * 检查互斥逻辑\n */\nexport function checkExclusionStates(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>\n): void {\n if (!editorRef.current) return;\n\n // 1. 从 config 中动态识别所有的 exclusionGroup(排除 separator)\n const exclusionGroups = new Set<string>();\n const groupNodes: Record<string, Array<{ type: NodeType; key?: string; exclusionGroup: string }>> = {};\n \n for (const node of config) {\n if (node.exclusionGroup && node.exclusionGroup !== 'separator') {\n exclusionGroups.add(node.exclusionGroup);\n if (!groupNodes[node.exclusionGroup]) {\n groupNodes[node.exclusionGroup] = [];\n }\n groupNodes[node.exclusionGroup].push({\n type: node.type,\n key: node.key,\n exclusionGroup: node.exclusionGroup,\n });\n }\n }\n\n // 2. 检查每个互斥组是否有值\n const groupHasValue: Record<string, boolean> = {};\n \n for (const groupName of exclusionGroups) {\n groupHasValue[groupName] = false;\n \n for (const groupNode of groupNodes[groupName]) {\n if (groupNode.type === 'upload' && groupNode.key) {\n // 检查文件是否上传\n if (files[groupNode.key] !== null && files[groupNode.key] !== undefined) {\n groupHasValue[groupName] = true;\n break;\n }\n } else if (groupNode.type === 'variable' && groupNode.key) {\n // 检查文本是否输入\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${groupNode.key}\"]`\n );\n if (variableEl) {\n const text = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n groupHasValue[groupName] = true;\n break;\n }\n }\n }\n }\n }\n\n // 3. 检查是否存在 separator,用于判断是否应该应用互斥逻辑\n const hasSeparator = config.some(node => node.exclusionGroup === 'separator');\n \n // 4. 找出有值的组(按 config 顺序,只取第一个有值的组)\n const groupsWithValue = Object.keys(groupHasValue).filter(\n (groupName) => groupHasValue[groupName]\n );\n const hasAnyValue = groupsWithValue.length > 0;\n \n // 找出第一个有值的组(按 config 中的顺序)\n let firstGroupWithValue: string | null = null;\n if (hasAnyValue && hasSeparator) {\n // 只有当存在 separator 时,才需要找出第一个有值的组(用于互斥逻辑)\n // 按照 config 的顺序找到第一个有值的组\n for (const node of config) {\n if (node.exclusionGroup && \n node.exclusionGroup !== 'separator' && \n groupHasValue[node.exclusionGroup]) {\n firstGroupWithValue = node.exclusionGroup;\n break;\n }\n }\n }\n\n // 5. 处理每个互斥组的显示/隐藏\n for (const groupName of exclusionGroups) {\n // 选择所有带有该 data-group 的元素(包括 wrapper 和独立节点)\n const groupElements = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-group=\"${groupName}\"]`\n );\n \n if (hasSeparator && hasAnyValue && firstGroupWithValue) {\n // 只有当存在 separator 时,才应用互斥逻辑:只显示第一个有值的组,隐藏其他所有组\n if (groupName === firstGroupWithValue) {\n groupElements.forEach((el) => {\n // 根据元素类型设置正确的 display 值\n if (el.classList.contains('required-upload-group')) {\n el.style.setProperty('display', 'inline-flex', 'important');\n } else if (el.classList.contains('exclusion-wrapper')) {\n el.style.setProperty('display', 'inline-block', 'important');\n } else {\n // 对于其他元素(如 variable-chip, upload-chip),使用 inline-block\n el.style.setProperty('display', 'inline-block', 'important');\n }\n });\n } else {\n groupElements.forEach((el) => {\n el.style.display = \"none\";\n el.style.setProperty('display', 'none', 'important');\n });\n }\n } else {\n // 如果没有 separator,或者都没有值,显示所有组\n groupElements.forEach((el) => {\n // 根据元素类型设置正确的 display 值\n if (el.classList.contains('required-upload-group')) {\n el.style.setProperty('display', 'inline-flex', 'important');\n } else if (el.classList.contains('exclusion-wrapper')) {\n el.style.setProperty('display', 'inline-block', 'important');\n } else {\n // 对于其他元素(如 variable-chip, upload-chip),使用 inline-block\n el.style.setProperty('display', 'inline-block', 'important');\n }\n });\n }\n }\n\n // 6. 处理 separator:有值时隐藏,没有值时显示\n const separatorGroups = editorRef.current.querySelectorAll<HTMLElement>(\n '[data-group=\"separator\"]'\n );\n separatorGroups.forEach((el) => {\n el.style.display = hasAnyValue ? \"none\" : \"inline\";\n });\n}\n\n","import type React from 'react';\nimport type { InputNode } from './types';\n\n/**\n * 校验必填字段\n */\nexport function validateRequiredFields(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setIsFormValid: (valid: boolean) => void\n): void {\n if (!editorRef.current) {\n setIsFormValid(false);\n return;\n }\n\n // 从 config 中找出所有必填字段(支持两种格式:旧格式text节点+variable/upload,新格式直接required属性)\n const requiredFields: Array<{ exclusionGroup: string; key?: string; type: 'variable' | 'upload' | 'select' | 'textarea' | 'richtext' | 'datepicker'; isMultiVariable?: boolean; minCount?: number; __index?: number }> = [];\n \n for (let i = 0; i < config.length; i++) {\n const node = config[i];\n \n // 新格式:直接检查 variable、upload 或 multi-variable 节点的 required 属性\n if (\n (node.type === 'variable' || node.type === 'upload' || node.type === 'multi-variable' || node.type === 'select' || node.type === 'textarea' || node.type === 'richtext' || node.type === 'datepicker') &&\n node.required &&\n node.key\n ) {\n requiredFields.push({\n exclusionGroup: node.exclusionGroup || '',\n key: node.key,\n type: node.type === 'multi-variable' ? 'variable' : node.type,\n isMultiVariable: node.type === 'multi-variable',\n minCount: node.type === 'multi-variable' ? node.minCount : undefined,\n __index: i,\n });\n continue;\n }\n \n // 旧格式:检查是否是必填图标(text 类型,且 className 包含 rte-text-required)\n if (\n node.type === 'text' &&\n node.className?.includes('rte-text-required')\n ) {\n // 如果有 exclusionGroup,找到同一个 exclusionGroup 中的节点\n if (node.exclusionGroup) {\n for (let j = i + 1; j < config.length; j++) {\n const nextNode = config[j];\n if (\n nextNode.exclusionGroup === node.exclusionGroup &&\n (nextNode.type === 'variable' || nextNode.type === 'upload' || nextNode.type === 'select' || nextNode.type === 'textarea' || nextNode.type === 'richtext' || nextNode.type === 'datepicker') &&\n nextNode.key\n ) {\n requiredFields.push({\n exclusionGroup: node.exclusionGroup,\n key: nextNode.key,\n type: nextNode.type,\n __index: j,\n });\n break;\n }\n }\n } else {\n // 如果没有 exclusionGroup,找到紧跟着的下一个可输入节点(variable/upload/select/textarea/richtext/datepicker)\n for (let j = i + 1; j < config.length; j++) {\n const nextNode = config[j];\n if (\n (nextNode.type === 'variable' || nextNode.type === 'upload' || nextNode.type === 'select' || nextNode.type === 'textarea' || nextNode.type === 'richtext' || nextNode.type === 'datepicker') &&\n nextNode.key\n ) {\n requiredFields.push({\n exclusionGroup: nextNode.exclusionGroup || '',\n key: nextNode.key,\n type: nextNode.type,\n __index: j,\n });\n break;\n }\n }\n }\n }\n }\n\n // 检查是否有 separator,用于判断必填字段是否互斥\n const hasSeparator = config.some(node => node.exclusionGroup === 'separator');\n \n // 用于存储互斥字段组(通过 separator 分隔的字段组)\n const mutuallyExclusiveGroups: Array<Array<typeof requiredFields[0]>> = [];\n \n if (hasSeparator && requiredFields.length > 1) {\n // 找到所有 separator 的位置\n const separatorIndices: number[] = [];\n config.forEach((node, index) => {\n if (node.exclusionGroup === 'separator') {\n separatorIndices.push(index);\n }\n });\n \n // 对于每个 separator,仅取最靠近的前后必填字段组成互斥组\n for (const separatorIndex of separatorIndices) {\n // 找到 separator 前最近的必填字段\n const beforeCandidates = requiredFields\n .filter(field => typeof field.__index === 'number' && field.__index < separatorIndex)\n .sort((a, b) => (b.__index ?? 0) - (a.__index ?? 0));\n const beforeField = beforeCandidates[0];\n \n // 找到 separator 后最近的必填字段\n const afterCandidates = requiredFields\n .filter(field => typeof field.__index === 'number' && field.__index > separatorIndex)\n .sort((a, b) => (a.__index ?? 0) - (b.__index ?? 0));\n const afterField = afterCandidates[0];\n \n if (beforeField && afterField) {\n mutuallyExclusiveGroups.push([beforeField, afterField]);\n }\n }\n }\n\n // 如果没有必填字段,检查是否是默认输入框状态\n if (requiredFields.length === 0) {\n // 如果是默认输入框状态(config 为空),需要检查编辑器内容是否为空\n if (config.length === 0) {\n if (!editorRef.current) {\n setIsFormValid(false);\n return;\n }\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n setIsFormValid(textContent.length > 0);\n return;\n }\n // 如果不是默认状态,且没有必填字段,默认有效\n setIsFormValid(true);\n return;\n }\n\n // 动态检查当前显示的必填字段\n const visibleRequiredFields = requiredFields.filter(field => {\n if (!editorRef.current) return false;\n \n // 先尝试通过 data-group 查找\n if (field.exclusionGroup) {\n const groupElements = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-group=\"${field.exclusionGroup}\"]`\n );\n if (groupElements.length > 0) {\n // 如果找到了 group 元素,检查是否隐藏\n return groupElements[0].style.display !== 'none';\n }\n }\n \n // 如果找不到 group 元素,直接检查字段本身是否存在\n if (field.type === 'upload' && field.key) {\n const uploadEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"upload\"][data-key=\"${field.key}\"]`\n );\n if (uploadEl) {\n // 检查字段本身或其父元素是否隐藏\n const parent = (uploadEl.closest('[data-group]') as HTMLElement) || uploadEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'variable' && field.key) {\n if (field.isMultiVariable) {\n const multiVariableEls = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${field.key}\"]`\n );\n if (multiVariableEls.length > 0) {\n const firstEl = multiVariableEls[0];\n const parent = (firstEl.closest('[data-group]') as HTMLElement) || firstEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else {\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${field.key}\"]`\n );\n if (variableEl) {\n const parent = (variableEl.closest('[data-group]') as HTMLElement) || variableEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n }\n } else if (field.type === 'select' && field.key) {\n const selectEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"select\"][data-key=\"${field.key}\"]`\n );\n if (selectEl) {\n const parent = (selectEl.closest('[data-group]') as HTMLElement) || selectEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'textarea' && field.key) {\n const textareaEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"textarea\"][data-key=\"${field.key}\"]`\n );\n if (textareaEl) {\n const parent = (textareaEl.closest('[data-group]') as HTMLElement) || textareaEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'richtext' && field.key) {\n const richtextEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"richtext\"][data-key=\"${field.key}\"]`\n );\n if (richtextEl) {\n const parent = (richtextEl.closest('[data-group]') as HTMLElement) || richtextEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n } else if (field.type === 'datepicker' && field.key) {\n const dpEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"datepicker\"][data-key=\"${field.key}\"]`\n );\n if (dpEl) {\n const parent = (dpEl.closest('[data-group]') as HTMLElement) || dpEl.parentElement;\n return parent ? (parent as HTMLElement).style.display !== 'none' : true;\n }\n }\n \n // 如果找不到字段元素,认为不可见\n return false;\n });\n\n // 如果没有可见的必填字段,默认有效\n if (visibleRequiredFields.length === 0) {\n setIsFormValid(true);\n return;\n }\n\n // 将必填字段分为互斥组和非互斥字段\n const mutuallyExclusiveFieldKeys = new Set<string>();\n mutuallyExclusiveGroups.forEach(group => {\n group.forEach(field => {\n if (field.key) {\n mutuallyExclusiveFieldKeys.add(field.key);\n }\n });\n });\n \n const nonExclusiveFields = visibleRequiredFields.filter(field => \n !field.key || !mutuallyExclusiveFieldKeys.has(field.key)\n );\n \n // 验证互斥字段组:每个互斥组至少填写一个即可\n // 如果没有互斥组,默认为 true\n let allMutuallyExclusiveGroupsValid = mutuallyExclusiveGroups.length === 0 ? true : true;\n for (const group of mutuallyExclusiveGroups) {\n const visibleGroupFields = group.filter(field => {\n // 检查字段是否可见(使用与 visibleRequiredFields 相同的逻辑)\n if (!editorRef.current) return false;\n if (field.exclusionGroup) {\n const groupElements = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-group=\"${field.exclusionGroup}\"]`\n );\n if (groupElements.length > 0) {\n return groupElements[0].style.display !== 'none';\n }\n }\n return true;\n });\n \n // 如果互斥组没有可见字段,认为这个组是有效的(因为用户无法填写)\n if (visibleGroupFields.length === 0) {\n continue;\n }\n \n let hasAnyValid = false;\n for (const field of visibleGroupFields) {\n if (field.type === 'upload' && field.key) {\n if (files[field.key] !== null && files[field.key] !== undefined) {\n hasAnyValid = true;\n break;\n }\n } else if (field.type === 'variable' && field.key) {\n if (field.isMultiVariable) {\n const multiVariableEls = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${field.key}\"]`\n );\n let filledCount = 0;\n for (const el of Array.from(multiVariableEls)) {\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (el.classList.contains('show-placeholder')) {\n continue;\n }\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n filledCount += 1;\n }\n }\n const need = field.minCount && field.minCount > 0 ? field.minCount : 1;\n if (filledCount >= need) {\n hasAnyValid = true;\n break;\n }\n } else {\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${field.key}\"]`\n );\n if (variableEl) {\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (variableEl.classList.contains('show-placeholder')) {\n continue;\n }\n const text = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n }\n } else if (field.type === 'select' && field.key) {\n const selectEl = editorRef.current.querySelector<HTMLSelectElement>(\n `[data-type=\"select\"][data-key=\"${field.key}\"]`\n );\n if (selectEl) {\n const val = (selectEl.value || \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n } else if (field.type === 'textarea' && field.key) {\n const textareaEl = editorRef.current.querySelector<HTMLTextAreaElement>(\n `[data-type=\"textarea\"][data-key=\"${field.key}\"]`\n );\n if (textareaEl) {\n const val = (textareaEl.value || \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n } else if (field.type === 'richtext' && field.key) {\n const richtextEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"richtext\"][data-key=\"${field.key}\"]`\n );\n if (richtextEl) {\n const val = (richtextEl.textContent || \"\").replace(/[\\u200B]/g, \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n } else if (field.type === 'datepicker' && field.key) {\n const dpEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"datepicker\"][data-key=\"${field.key}\"]`\n );\n if (dpEl) {\n const val = (dpEl.getAttribute('data-value') || \"\").trim();\n if (val.length > 0) {\n hasAnyValid = true;\n break;\n }\n }\n }\n }\n \n if (!hasAnyValid) {\n allMutuallyExclusiveGroupsValid = false;\n break;\n }\n }\n \n // 验证非互斥字段:所有字段都必须填写\n let allNonExclusiveFieldsValid = true;\n for (const field of nonExclusiveFields) {\n if (field.type === 'upload' && field.key) {\n if (files[field.key] === null || files[field.key] === undefined) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'variable' && field.key) {\n if (field.isMultiVariable) {\n // multi-variable 类型:检查所有相关输入框,至少满足 minCount(默认1)\n const multiVariableEls = editorRef.current.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${field.key}\"]`\n );\n let filledCount = 0;\n for (const el of Array.from(multiVariableEls)) {\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (el.classList.contains('show-placeholder')) {\n continue;\n }\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length > 0) {\n filledCount += 1;\n }\n }\n const need = field.minCount && field.minCount > 0 ? field.minCount : 1;\n if (filledCount < need) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else {\n const variableEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${field.key}\"]`\n );\n if (!variableEl) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n // 检查是否有 show-placeholder 类,如果有则说明是空的\n if (variableEl.classList.contains('show-placeholder')) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n const text = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text.length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n }\n } else if (field.type === 'select' && field.key) {\n const selectEl = editorRef.current.querySelector<HTMLSelectElement>(\n `[data-type=\"select\"][data-key=\"${field.key}\"]`\n );\n if (!selectEl || (selectEl.value || \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'textarea' && field.key) {\n const textareaEl = editorRef.current.querySelector<HTMLTextAreaElement>(\n `[data-type=\"textarea\"][data-key=\"${field.key}\"]`\n );\n if (!textareaEl || (textareaEl.value || \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'richtext' && field.key) {\n const richtextEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"richtext\"][data-key=\"${field.key}\"]`\n );\n if (!richtextEl || (richtextEl.textContent || \"\").replace(/[\\u200B]/g, \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n } else if (field.type === 'datepicker' && field.key) {\n const dpEl = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"datepicker\"][data-key=\"${field.key}\"]`\n );\n if (!dpEl || (dpEl.getAttribute('data-value') || \"\").trim().length === 0) {\n allNonExclusiveFieldsValid = false;\n break;\n }\n }\n }\n \n // 合并验证结果:互斥组和非互斥字段都必须通过验证\n setIsFormValid(allMutuallyExclusiveGroupsValid && allNonExclusiveFieldsValid);\n}\n\n","import type React from 'react';\n\n/**\n * 更新占位符与零宽字符\n */\nexport function updatePlaceholders(\n editorRef: React.RefObject<HTMLDivElement | null>,\n forceActiveElement?: HTMLElement\n): void {\n if (!editorRef.current) return;\n\n const chips =\n editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n chips.forEach((el) => {\n const rawText = el.innerText.replace(/\\n/g, \"\");\n const cleanText = rawText.replace(/\\u200B/g, \"\");\n\n if (!cleanText) {\n // 如果实际上没有内容,则强制显示零宽字符以保持高度\n if (rawText !== \"\\u200B\") {\n el.innerText = \"\\u200B\";\n }\n el.classList.add(\"show-placeholder\");\n } else {\n // 如果有内容,移除 placeholder 样式\n el.classList.remove(\"show-placeholder\");\n }\n });\n\n if (forceActiveElement) {\n const range = document.createRange();\n const selection = window.getSelection();\n range.selectNodeContents(forceActiveElement);\n range.collapse(false);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n}\n\n","import type React from 'react';\nimport type { InputNode } from './types';\n\n/**\n * 初始化编辑器内容\n * @param editorRef 编辑器引用\n * @param config 配置\n * @param files 文件\n * @param lockStructure 是否锁定结构\n * @param variableValues 变量值\n * @param multiVariableCounts 多输入框计数\n * @param hideButtons 隐藏按钮\n */\nexport function initializeEditorContent(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n lockStructure: boolean,\n variableValues: Record<string, string>,\n multiVariableCounts: Record<string, number> = {},\n hideButtons?: 'hideAgent' | 'hideTagClose'\n): void {\n if (!editorRef.current) return;\n\n let html = \"\";\n let i = 0;\n\n while (i < config.length) {\n const node = config[i];\n const nextNode = i + 1 < config.length ? config[i + 1] : null;\n \n // 检查是否是必填图标\n const isRequiredIcon = node.type === \"text\" && \n (node.text?.includes(\"icon-bitian\") || node.className === \"rte-text-required\");\n \n if (isRequiredIcon && nextNode) {\n // 检查必填图标后跟上传按钮的组合 (fileInput)\n const isNextUpload = nextNode.type === \"upload\" && \n nextNode.exclusionGroup === \"fileInput\" &&\n node.exclusionGroup === \"fileInput\" &&\n node.exclusionGroup === nextNode.exclusionGroup;\n\n // 检查必填图标后跟 variable 的组合 (textInput)\n const isNextVariable = nextNode.type === \"variable\" && \n nextNode.exclusionGroup === \"textInput\" &&\n node.exclusionGroup === \"textInput\" &&\n node.exclusionGroup === nextNode.exclusionGroup;\n\n // 如果是必填图标+上传按钮的组合,将它们包裹在一起\n if (isNextUpload) {\n const groupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n const wrapperStart = `<span ${groupAttr} class=\"exclusion-wrapper required-upload-group\">`;\n const wrapperEnd = `</span>`;\n\n // 生成必填图标 HTML\n let requiredIconHtml = \"\";\n if (node.className) {\n requiredIconHtml = `<span class=\"${node.className}\">${node.text ?? \"\"}</span>`;\n } else {\n requiredIconHtml = node.text ?? \"\";\n }\n\n // 生成上传按钮 HTML\n const uploadNode = nextNode;\n const hasFile = files[uploadNode.key!] !== null && files[uploadNode.key!] !== undefined;\n const fileObj = hasFile ? (files[uploadNode.key!] as File) : null;\n const fileName = hasFile ? files[uploadNode.key!]?.name : uploadNode.text;\n const showRemoveBtn = hasFile ? \"\" : \"hidden\";\n const showInfoIcon = uploadNode.tooltip && !hasFile ? \"\" : \"hidden\";\n const hasFileClass = hasFile ? \"has-file\" : \"\";\n // 当有文件时,为 upload-label 添加 data-file-name 属性用于 tooltip\n const fileNameAttr = hasFile && fileName \n ? ` data-file-name=\"${fileName.replace(/\"/g, '"')}\"`\n : \"\";\n \n let uploadIcon = \"\";\n if (hasFile && fileObj) {\n if (fileObj.type?.startsWith(\"image/\")) {\n const url = URL.createObjectURL(fileObj);\n uploadIcon = `<img class=\"upload-icon-img upload-icon-preview\" src=\"${url}\" alt=\"preview\" />`;\n } else {\n uploadIcon = \"<i class='iconfont icon-exlwenjian'></i>\";\n }\n }\n \n const uploadHtml = `<span contenteditable=\"false\" data-type=\"upload\" data-key=\"${uploadNode.key}\" class=\"upload-chip\"><span class=\"upload-inner-wrapper ${hasFileClass}\"><span class=\"upload-icon\">${uploadIcon}</span><span class=\"upload-label\"${fileNameAttr}>${fileName || uploadNode.text}</span>${uploadNode.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi upload-info-icon ${showInfoIcon}\" data-upload-key=\"${uploadNode.key}\" data-tooltip=\"${uploadNode.tooltip}\" title=\"提示\"></i>` : \"\"}<span class=\"file-remove-btn ${showRemoveBtn}\" title=\"移除文件\">×</span></span></span>`;\n\n // 直接连接,CSS 会确保它们作为一个整体换行\n html += wrapperStart + requiredIconHtml + uploadHtml + wrapperEnd;\n i += 2; // 跳过两个节点\n continue;\n }\n\n // 如果是必填图标+variable 的组合,将它们包裹在一起\n if (isNextVariable) {\n const groupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n const wrapperStart = `<span ${groupAttr} class=\"exclusion-wrapper required-upload-group\">`;\n const wrapperEnd = `</span>`;\n\n // 生成必填图标 HTML\n let requiredIconHtml = \"\";\n if (node.className) {\n requiredIconHtml = `<span class=\"${node.className}\">${node.text ?? \"\"}</span>`;\n } else {\n requiredIconHtml = node.text ?? \"\";\n }\n\n // 生成 variable HTML\n const variableNode = nextNode;\n // 优先使用保存的值,如果没有则使用配置中的初始值\n const savedValue = variableNode.key ? variableValues[variableNode.key] : undefined;\n const initialText = savedValue || variableNode.text || \"\";\n const isPlaceholder = !initialText;\n const displayText = isPlaceholder ? \"\\u200B\" : initialText;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n const variableGroupAttr = variableNode.exclusionGroup\n ? ` data-group=\"${variableNode.exclusionGroup}\"`\n : \"\";\n\n const tooltipAttr = variableNode.tooltip \n ? ` data-tooltip=\"${variableNode.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${variableNode.key || ''}\"`\n : '';\n // 只有在没有值且有 tooltip 配置时才显示叹号图标\n const showInfoIcon = variableNode.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${\n variableNode.key\n }\" data-placeholder=\"${\n variableNode.placeholder || \"\"\n }\"${variableGroupAttr}${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${variableNode.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${variableNode.key}\" data-tooltip=\"${variableNode.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n\n // 直接连接,CSS 会确保它们作为一个整体换行\n html += wrapperStart + requiredIconHtml + variableHtml + wrapperEnd;\n i += 2; // 跳过两个节点\n continue;\n }\n }\n\n // 普通节点的处理\n const groupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n const wrapperStart = node.exclusionGroup\n ? `<span ${groupAttr} class=\"exclusion-wrapper\">`\n : \"\";\n const wrapperEnd = node.exclusionGroup ? `</span>` : \"\";\n\n let nodeHtml = \"\";\n\n // TAG: 评价分析 Chip\n if (node.type === \"tag\") {\n // 如果 hideButtons 为 'hideTagClose',隐藏关闭按钮\n const shouldHideTagClose = hideButtons === 'hideTagClose';\n const closeBtnHtml = (lockStructure || shouldHideTagClose)\n ? \"\" \n : `<span class=\"tag-close-btn\" title=\"Clear (ESC)\"><svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></span>`;\n const lockedAttr = lockStructure ? ' data-locked=\"true\"' : '';\n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-tag-key=\"${node.key || ''}\"`\n : '';\n nodeHtml = `<span contenteditable=\"false\" class=\"tag-node group\"${lockedAttr}${tooltipAttr}><span class=\"tag-label\">${node.text}</span>${closeBtnHtml}</span>`;\n }\n // TEXT: 普通文本\n else if (node.type === \"text\") {\n const lockedAttr = lockStructure ? ' data-locked=\"true\" contenteditable=\"false\"' : ' contenteditable=\"false\"';\n const rawText = node.text ?? \"\";\n const textWithBreak = rawText.replace(/\\n/g, \"<br/>\");\n if (node.className) {\n nodeHtml = `<span class=\"${node.className}\"${lockedAttr}>${textWithBreak}</span>`;\n } else {\n nodeHtml = lockStructure \n ? `<span${lockedAttr}>${textWithBreak}</span>`\n : `<span contenteditable=\"false\">${textWithBreak}</span>`;\n }\n }\n // VARIABLE: 内联输入块\n else if (node.type === \"variable\" && node.key) {\n // 优先使用保存的值,如果没有则使用配置中的初始值\n const savedValue = variableValues[node.key];\n const initialText = savedValue || node.text || \"\";\n const isPlaceholder = !initialText;\n const displayText = isPlaceholder ? \"\\u200B\" : initialText;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n const groupAttr = node.exclusionGroup\n ? ` data-group=\"${node.exclusionGroup}\"`\n : \"\";\n\n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${node.key || ''}\"`\n : '';\n // 只有在没有值且有 tooltip 配置时才显示叹号图标\n const showInfoIcon = node.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${\n node.key\n }\" data-placeholder=\"${\n node.placeholder || \"\"\n }\"${groupAttr}${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${node.key}\" data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n\n // 如果是必填项,自动添加必填图标并包裹\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${variableHtml}</span>`;\n } else {\n nodeHtml = variableHtml;\n }\n }\n // UPLOAD: 上传按钮\n else if (node.type === \"upload\" && node.key) {\n const hasFile = files[node.key] !== null && files[node.key] !== undefined;\n const fileObj = hasFile ? (files[node.key] as File) : null;\n const fileName = hasFile ? files[node.key]?.name : node.text;\n const showRemoveBtn = hasFile ? \"\" : \"hidden\";\n // 只有在没有文件且有 tooltip 配置时才显示叹号图标\n const showInfoIcon = node.tooltip && !hasFile ? \"\" : \"hidden\";\n const hasFileClass = hasFile ? \"has-file\" : \"\";\n // 当有文件时,为 upload-label 添加 data-file-name 属性用于 tooltip\n const fileNameAttr = hasFile && fileName \n ? ` data-file-name=\"${fileName.replace(/\"/g, '"')}\"`\n : \"\";\n \n let uploadIcon = \"\";\n if (hasFile && fileObj) {\n if (fileObj.type?.startsWith(\"image/\")) {\n const url = URL.createObjectURL(fileObj);\n uploadIcon = `<img class=\"upload-icon-img upload-icon-preview\" src=\"${url}\" alt=\"preview\" />`;\n } else {\n uploadIcon = \"<i class='iconfont icon-exlwenjian'></i>\";\n }\n }\n const uploadHtml = `<span contenteditable=\"false\" data-type=\"upload\" data-key=\"${node.key}\" class=\"upload-chip\"><span class=\"upload-inner-wrapper ${hasFileClass}\"><span class=\"upload-icon\">${uploadIcon}</span><span class=\"upload-label\"${fileNameAttr}>${fileName || node.text}</span>${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi upload-info-icon ${showInfoIcon}\" data-upload-key=\"${node.key}\" data-tooltip=\"${node.tooltip}\" title=\"提示\"></i>` : \"\"}<span class=\"file-remove-btn ${showRemoveBtn}\" title=\"移除文件\">×</span></span></span>`;\n\n // 如果是必填项,自动添加必填图标并包裹\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${uploadHtml}</span>`;\n } else {\n nodeHtml = uploadHtml;\n }\n }\n // SELECT: 下拉选择\n else if (node.type === \"select\" && node.key) {\n const savedValue = variableValues[node.key] || node.defaultValue || \"\";\n const optionsHtml = (node.options || []).map(opt => {\n const selected = savedValue === opt.value ? \"selected\" : \"\";\n return `<option value=\"${opt.value}\" ${selected}>${opt.label}</option>`;\n }).join(\"\");\n \n const placeholderOption = node.placeholder\n ? `<option value=\"\" ${savedValue ? \"\" : \"selected\"} disabled hidden>${node.placeholder}</option>`\n : \"\";\n \n const selectHtml = `<select data-type=\"select\" data-key=\"${node.key}\" class=\"rte-select\">${placeholderOption}${optionsHtml}</select>`;\n \n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${selectHtml}</span>`;\n } else {\n nodeHtml = selectHtml;\n }\n }\n // TEXTAREA: 长文本输入\n else if (node.type === \"textarea\" && node.key) {\n const savedValue = variableValues[node.key] || \"\";\n const maxHeight = node.maxHeight || 252;\n const expandable = node.expandable !== false;\n const placeholderAttr = node.placeholder ? ` placeholder=\"${node.placeholder}\"` : \"\";\n const textareaHtml = `<textarea data-type=\"textarea\" data-key=\"${node.key}\" class=\"rte-textarea\" data-max-height=\"${maxHeight}\" style=\"max-height:${maxHeight}px;\"${placeholderAttr}>${savedValue}</textarea>`;\n const toggleBtn = expandable\n ? `<button type=\"button\" class=\"rte-textarea-toggle\" data-key=\"${node.key}\" data-expanded=\"false\">展开</button>`\n : \"\";\n const wrapper = `<div class=\"rte-textarea-wrapper\" data-key=\"${node.key}\">${textareaHtml}${toggleBtn}</div>`;\n \n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${wrapper}</span>`;\n } else {\n nodeHtml = wrapper;\n }\n }\n // RICHTEXT: 富文本块(contenteditable)\n else if (node.type === \"richtext\" && node.key) {\n const savedValue = variableValues[node.key] || node.text || \"\";\n const minHeight = node.minHeight || 140;\n const placeholderAttr = node.placeholder ? ` data-placeholder=\"${node.placeholder}\"` : \"\";\n const expandable = node.expandable !== false;\n const richContent = savedValue;\n const richHtml = `<div contenteditable=\"true\" data-type=\"richtext\" data-key=\"${node.key}\" class=\"rte-richtext\"${placeholderAttr} style=\"min-height:${minHeight}px;\">${richContent}</div>`;\n const toggleBtn = expandable\n ? `<button type=\"button\" class=\"rte-richtext-toggle\" data-key=\"${node.key}\" data-expanded=\"false\">展开</button>`\n : \"\";\n const wrapper = `<div class=\"rte-richtext-wrapper\" data-key=\"${node.key}\">${richHtml}${toggleBtn}</div>`;\n const container = `<div class=\"rte-richtext-container\" data-key=\"${node.key}\">${wrapper}</div>`;\n \n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<div ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group rte-richtext-required\">${requiredIconHtml}${container}</div>`;\n } else {\n nodeHtml = container;\n }\n }\n // DATEPICKER: 时间选择\n else if (node.type === \"datepicker\" && node.key) {\n const savedValue = variableValues[node.key] || \"\";\n const placeholderAttr = node.placeholder ? ` data-placeholder=\"${node.placeholder}\"` : \"\";\n const limitRangeAttr = node.limitRange ? ` data-limit-range=\"${node.limitRange}\"` : \"\";\n const disableFutureAttr = node.disableFuture ? ` data-disable-future=\"true\"` : \"\";\n const pickerHost = `<div data-type=\"datepicker\" data-key=\"${node.key}\" data-value=\"${savedValue}\" class=\"rte-datepicker-host\"${placeholderAttr}${limitRangeAttr}${disableFutureAttr}></div>`;\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n nodeHtml = `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group\">${requiredIconHtml}${pickerHost}</span>`;\n } else {\n nodeHtml = pickerHost;\n }\n }\n // MULTI-VARIABLE: 多输入框(动态添加)\n else if (node.type === \"multi-variable\" && node.key) {\n const maxCount = node.maxCount || 9;\n const count = multiVariableCounts[node.key] || 1;\n const actualCount = Math.min(count, maxCount);\n \n // 如果是必填项,红色星号只和第一个输入框包裹在一起\n if (node.required) {\n const requiredIconHtml = `<span class=\"rte-text-required\"><i class='iconfont icon-bitian' style='font-size: 10px;'></i></span>`;\n const wrapperGroupAttr = node.exclusionGroup\n ? `data-group=\"${node.exclusionGroup}\"`\n : \"\";\n \n let multiVariableHtml = \"\";\n for (let idx = 0; idx < actualCount; idx++) {\n const itemKey = `${node.key}_${idx}`;\n const savedValue = variableValues[itemKey] || \"\";\n const isPlaceholder = !savedValue;\n const displayText = isPlaceholder ? \"\\u200B\" : savedValue;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n \n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${node.key || ''}\"`\n : '';\n const showInfoIcon = node.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${itemKey}\" data-multi-key=\"${node.key}\" data-index=\"${idx}\" data-placeholder=\"${node.placeholder || \"\"}\"${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${node.key}\" data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n \n if (idx === 0) {\n // 第一个输入框和必填星号包裹在一起\n multiVariableHtml += `<span ${wrapperGroupAttr} class=\"exclusion-wrapper required-upload-group required-multi-first\">${requiredIconHtml}${variableHtml}</span>`;\n } else {\n // 其他输入框直接添加,可以自由换行\n multiVariableHtml += variableHtml;\n }\n }\n nodeHtml = multiVariableHtml;\n } else {\n // 非必填项,所有输入框直接添加\n let multiVariableHtml = \"\";\n for (let idx = 0; idx < actualCount; idx++) {\n const itemKey = `${node.key}_${idx}`;\n const savedValue = variableValues[itemKey] || \"\";\n const isPlaceholder = !savedValue;\n const displayText = isPlaceholder ? \"\\u200B\" : savedValue;\n const placeholderClass = isPlaceholder ? \"show-placeholder\" : \"\";\n \n const tooltipAttr = node.tooltip \n ? ` data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" data-variable-key=\"${node.key || ''}\"`\n : '';\n const showInfoIcon = node.tooltip && isPlaceholder ? \"\" : \"hidden\";\n const variableHtml = `<span contenteditable=\"true\" data-type=\"variable\" data-key=\"${itemKey}\" data-multi-key=\"${node.key}\" data-index=\"${idx}\" data-placeholder=\"${node.placeholder || \"\"}\"${tooltipAttr} class=\"variable-chip ${placeholderClass}\">${displayText}${node.tooltip ? `<i contenteditable=\"false\" class=\"iconfont icon-tishi variable-info-icon ${showInfoIcon}\" data-variable-key=\"${node.key}\" data-tooltip=\"${node.tooltip.replace(/\"/g, '"')}\" title=\"提示\"></i>` : \"\"}</span>`;\n multiVariableHtml += variableHtml;\n }\n nodeHtml = multiVariableHtml;\n }\n }\n\n html += wrapperStart + nodeHtml + wrapperEnd;\n i++;\n }\n\n if (editorRef.current) {\n editorRef.current.innerHTML = html;\n \n // 更新占位符,确保有内容的 variable 不显示 placeholder\n setTimeout(() => {\n if (!editorRef.current) return;\n const chips = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n chips.forEach((el) => {\n const rawText = el.innerText.replace(/\\n/g, \"\");\n const cleanText = rawText.replace(/\\u200B/g, \"\");\n if (!cleanText) {\n if (rawText !== \"\\u200B\") {\n el.innerText = \"\\u200B\";\n }\n el.classList.add(\"show-placeholder\");\n } else {\n el.classList.remove(\"show-placeholder\");\n }\n });\n }, 0);\n }\n}\n\n","import { useEffect, useCallback, useRef } from 'react';\nimport type React from 'react';\nimport type { InputNode } from './types';\nimport { initializeEditorContent as initEditorContent } from './htmlGenerator';\nimport { checkExclusionStates } from './exclusionLogic';\nimport { validateRequiredFields } from './validation';\n\n/**\n * 初始化编辑器内容的 hook\n */\nexport function useInitializeEditorContent(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n lockStructure: boolean,\n multiVariableCounts: Record<string, number> = {},\n savedCursorRef?: React.MutableRefObject<{ key: string; offset: number } | null>,\n lockedMultiVariables?: Set<string>,\n hideButtons?: 'hideAgent' | 'hideTagClose'\n) {\n const initializeEditorContent = useCallback(() => {\n if (!editorRef.current) return;\n \n // 如果 config 为空,清空编辑器内容,回到纯文本模式\n if (config.length === 0) {\n editorRef.current.innerHTML = \"\";\n return;\n }\n\n // 检查是否有临时保存的 variableValues(用于删除操作时的数据恢复或智能体切换时的数据恢复)\n let variableValues: Record<string, string> = {};\n const editorElement = editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> };\n const tempValues = editorElement.__tempVariableValues;\n if (tempValues) {\n variableValues = tempValues;\n // 延迟清除临时值,确保在多次调用时(如 files 和 multiVariableCounts 更新时)仍能读取到\n // 使用 setTimeout 确保在下一个事件循环中清除\n setTimeout(() => {\n if (editorRef.current) {\n const el = editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> };\n if (el.__tempVariableValues === tempValues) {\n delete el.__tempVariableValues;\n }\n }\n }, 100);\n } else {\n // 在重新生成 HTML 之前,先保存当前值(variable/select/textarea)\n const existingVariables = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n existingVariables.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n const existingSelects = editorRef.current.querySelectorAll<HTMLSelectElement>('[data-type=\"select\"]');\n existingSelects.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const existingTextareas = editorRef.current.querySelectorAll<HTMLTextAreaElement>('[data-type=\"textarea\"]');\n existingTextareas.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.replace(/[\\u200B]/g, \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const existingRichtexts = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"richtext\"]');\n existingRichtexts.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = (el.textContent || \"\").replace(/[\\u200B]/g, \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const existingDatepickers = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"datepicker\"]');\n existingDatepickers.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = (el.getAttribute('data-value') || \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n }\n\n initEditorContent(editorRef, config, files, lockStructure, variableValues, multiVariableCounts, hideButtons);\n \n // 在 HTML 重新生成后,恢复光标位置\n if (savedCursorRef?.current) {\n const { key, offset } = savedCursorRef.current;\n setTimeout(() => {\n if (!editorRef.current) return;\n \n const targetVariable = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"]`\n );\n \n if (targetVariable) {\n try {\n const range = document.createRange();\n const walker = document.createTreeWalker(\n targetVariable,\n NodeFilter.SHOW_TEXT,\n null\n );\n \n let currentOffset = 0;\n let targetNode: Node | null = null;\n let targetOffset = 0;\n \n while (walker.nextNode()) {\n const node = walker.currentNode;\n const nodeLength = node.textContent?.length || 0;\n \n if (currentOffset + nodeLength >= offset) {\n targetNode = node;\n targetOffset = offset - currentOffset;\n break;\n }\n \n currentOffset += nodeLength;\n }\n \n if (targetNode) {\n range.setStart(targetNode, Math.min(targetOffset, targetNode.textContent?.length || 0));\n range.collapse(true);\n \n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n targetVariable.focus();\n }\n } else {\n // 如果找不到文本节点,将光标放在末尾\n range.selectNodeContents(targetVariable);\n range.collapse(false);\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n targetVariable.focus();\n }\n }\n } catch {\n // 如果恢复失败,将光标移动到当前输入框的末尾\n const range = document.createRange();\n range.selectNodeContents(targetVariable);\n range.collapse(false);\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n targetVariable.focus();\n }\n }\n \n // 清除保存的光标信息\n savedCursorRef.current = null;\n }\n }, 0);\n }\n \n // 恢复 multi-variable 的锁定状态\n if (lockedMultiVariables && lockedMultiVariables.size > 0) {\n setTimeout(() => {\n if (!editorRef.current) return;\n \n lockedMultiVariables.forEach((multiKey) => {\n const allInputs = editorRef.current!.querySelectorAll<HTMLElement>(\n `[data-type=\"variable\"][data-multi-key=\"${multiKey}\"]`\n );\n \n // 检查所有输入框是否都有值\n let allHaveValues = true;\n allInputs.forEach((el) => {\n const val = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (!val) {\n allHaveValues = false;\n }\n });\n \n if (allHaveValues && allInputs.length > 0) {\n // 设置所有输入框为不可编辑\n allInputs.forEach((el) => {\n el.setAttribute('contenteditable', 'false');\n el.classList.add('multi-variable-locked');\n });\n \n // 查找容器并添加删除按钮\n const container = allInputs[0].closest('.required-upload-group') || allInputs[0].parentElement;\n if (container && !container.querySelector('.multi-variable-close-btn')) {\n const closeBtn = document.createElement('span');\n closeBtn.className = 'multi-variable-close-btn';\n closeBtn.setAttribute('contenteditable', 'false');\n closeBtn.setAttribute('title', '删除');\n closeBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>';\n closeBtn.setAttribute('data-multi-key', multiKey);\n container.appendChild(closeBtn);\n }\n }\n });\n }, 0);\n }\n }, [config, files, lockStructure, editorRef, multiVariableCounts, savedCursorRef, lockedMultiVariables, hideButtons]);\n\n useEffect(() => {\n initializeEditorContent();\n }, [initializeEditorContent]);\n}\n\n/**\n * 绑定上传按钮叹号图标的 Tooltip\n */\nexport function useUploadInfoTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'upload' | 'upload-preview' } | null) => void\n) {\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 使用事件委托,在父元素上绑定事件,避免每次 DOM 更新后重新绑定\n const handleMouseOver = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.upload-info-icon') as HTMLElement | null;\n if (target && target.classList.contains('upload-info-icon')) {\n const key = target.dataset.uploadKey;\n if (key) {\n setPopoverVisible({ key, anchorEl: target, type: 'upload' });\n }\n return;\n }\n\n const uploadChip = (e.target as HTMLElement)?.closest('[data-type=\"upload\"]') as HTMLElement | null;\n if (uploadChip) {\n const key = uploadChip.dataset.key;\n if (key) {\n const file = files[key];\n if (file && file.type && file.type.startsWith('image/')) {\n setPopoverVisible({ key, anchorEl: uploadChip, type: 'upload-preview' });\n }\n }\n }\n };\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.upload-info-icon') as HTMLElement | null;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n // 只有当鼠标离开 upload-info-icon 且没有进入 tooltip 时才隐藏\n if (target && target.classList.contains('upload-info-icon')) {\n // 检查 relatedTarget 是否还在 editor 内部\n if (!relatedTarget || !editor.contains(relatedTarget)) {\n setPopoverVisible(null);\n } else {\n // 如果 relatedTarget 不是 upload-info-icon,也隐藏\n const relatedIcon = relatedTarget.closest('.upload-info-icon') as HTMLElement | null;\n if (!relatedIcon) {\n setPopoverVisible(null);\n }\n }\n return;\n }\n\n const uploadChip = (e.target as HTMLElement)?.closest('[data-type=\"upload\"]') as HTMLElement | null;\n if (uploadChip) {\n const related = relatedTarget as HTMLElement | null;\n if (related && uploadChip.contains(related)) {\n return;\n }\n setPopoverVisible(null);\n }\n };\n\n editor.addEventListener(\"mouseover\", handleMouseOver, true);\n editor.addEventListener(\"mouseout\", handleMouseOut, true);\n\n return () => {\n editor.removeEventListener(\"mouseover\", handleMouseOver, true);\n editor.removeEventListener(\"mouseout\", handleMouseOut, true);\n };\n }, [config, files, editorRef, setPopoverVisible]);\n}\n\n/**\n * 绑定 tag 节点的 Tooltip\n */\nexport function useTagTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'tag' } | null) => void,\n hideButtons?: 'hideAgent' | 'hideTagClose'\n) {\n useEffect(() => {\n if (!editorRef.current) return;\n\n const handleMouseEnter = (e: MouseEvent) => {\n // 如果 hideButtons 为 'hideTagClose',不显示 tooltip\n if (hideButtons === 'hideTagClose') {\n return;\n }\n const target = e.currentTarget as HTMLElement;\n const tooltip = target.dataset.tooltip;\n const key = target.dataset.tagKey || '';\n if (tooltip) {\n setPopoverVisible({ key, anchorEl: target, type: 'tag' });\n }\n };\n\n const handleMouseLeave = () => {\n setPopoverVisible(null);\n };\n\n // 使用 requestAnimationFrame 确保在 DOM 更新完成后再绑定事件\n let rafId: number;\n const bindEvents = () => {\n if (!editorRef.current) return;\n\n const tagNodes = editorRef.current.querySelectorAll<HTMLElement>(\n \".tag-node[data-tooltip]\"\n );\n\n tagNodes.forEach((tagNode) => {\n tagNode.addEventListener(\"mouseenter\", handleMouseEnter);\n tagNode.addEventListener(\"mouseleave\", handleMouseLeave);\n });\n };\n\n rafId = requestAnimationFrame(() => {\n rafId = requestAnimationFrame(bindEvents);\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n // 清理所有事件监听器\n if (editorRef.current) {\n const tagNodes = editorRef.current.querySelectorAll<HTMLElement>(\n \".tag-node[data-tooltip]\"\n );\n tagNodes.forEach((tagNode) => {\n tagNode.removeEventListener(\"mouseenter\", handleMouseEnter);\n tagNode.removeEventListener(\"mouseleave\", handleMouseLeave);\n });\n }\n };\n }, [config, editorRef, setPopoverVisible, hideButtons]);\n}\n\n/**\n * 绑定 variable 节点叹号图标的 Tooltip\n */\nexport function useVariableTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'variable' } | null) => void\n) {\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n // 使用事件委托,在父元素上绑定事件,避免每次 DOM 更新后重新绑定\n const handleMouseOver = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.variable-info-icon') as HTMLElement | null;\n if (target && target.classList.contains('variable-info-icon')) {\n const key = target.dataset.variableKey;\n if (key) {\n setPopoverVisible({ key, anchorEl: target, type: 'variable' });\n }\n }\n };\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = (e.target as HTMLElement)?.closest('.variable-info-icon') as HTMLElement | null;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n // 只有当鼠标离开 variable-info-icon 且没有进入 tooltip 时才隐藏\n if (target && target.classList.contains('variable-info-icon')) {\n // 检查 relatedTarget 是否还在 editor 内部\n if (!relatedTarget || !editor.contains(relatedTarget)) {\n setPopoverVisible(null);\n } else {\n // 如果 relatedTarget 不是 variable-info-icon,也隐藏\n const relatedIcon = relatedTarget.closest('.variable-info-icon') as HTMLElement | null;\n if (!relatedIcon) {\n setPopoverVisible(null);\n }\n }\n }\n };\n\n editor.addEventListener(\"mouseover\", handleMouseOver, true);\n editor.addEventListener(\"mouseout\", handleMouseOut, true);\n\n return () => {\n editor.removeEventListener(\"mouseover\", handleMouseOver, true);\n editor.removeEventListener(\"mouseout\", handleMouseOut, true);\n };\n }, [config, editorRef, setPopoverVisible]);\n}\n\n/**\n * 绑定上传文件 label 的 Tooltip(当文件名超长时)\n */\nexport function useUploadLabelTooltip(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setPopoverVisible: (visible: { key: string; anchorEl: HTMLElement; type: 'upload-label' } | null) => void\n) {\n useEffect(() => {\n if (!editorRef.current) return;\n\n const handleMouseEnter = (e: MouseEvent) => {\n const target = e.currentTarget as HTMLElement;\n const fileName = target.dataset.fileName;\n if (fileName) {\n setPopoverVisible({ key: '', anchorEl: target, type: 'upload-label' });\n }\n };\n\n const handleMouseLeave = () => {\n setPopoverVisible(null);\n };\n\n // 使用 requestAnimationFrame 确保在 DOM 更新完成后再绑定事件\n let rafId: number;\n const bindEvents = () => {\n if (!editorRef.current) return;\n\n const uploadLabels = editorRef.current.querySelectorAll<HTMLElement>(\n \".upload-label[data-file-name]\"\n );\n\n uploadLabels.forEach((label) => {\n label.addEventListener(\"mouseenter\", handleMouseEnter);\n label.addEventListener(\"mouseleave\", handleMouseLeave);\n });\n };\n\n rafId = requestAnimationFrame(() => {\n rafId = requestAnimationFrame(bindEvents);\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n // 清理所有事件监听器\n if (editorRef.current) {\n const uploadLabels = editorRef.current.querySelectorAll<HTMLElement>(\n \".upload-label[data-file-name]\"\n );\n uploadLabels.forEach((label) => {\n label.removeEventListener(\"mouseenter\", handleMouseEnter);\n label.removeEventListener(\"mouseleave\", handleMouseLeave);\n });\n }\n };\n }, [config, files, editorRef, setPopoverVisible]);\n}\n\n/**\n * 检查互斥逻辑和验证必填字段\n */\nexport function useExclusionAndValidation(\n editorRef: React.RefObject<HTMLDivElement | null>,\n config: InputNode[],\n files: Record<string, File | null>,\n setIsFormValid: (valid: boolean) => void\n) {\n useEffect(() => {\n // 延迟执行验证,确保 HTML 已经生成(特别是 select 的 defaultValue)\n const timer = setTimeout(() => {\n checkExclusionStates(editorRef, config, files);\n validateRequiredFields(editorRef, config, files, setIsFormValid);\n }, 0);\n \n return () => clearTimeout(timer);\n }, [files, config, editorRef, setIsFormValid]);\n}\n\n/**\n * 监听选择变化,确保光标只能在 variable 内部(仅在点击时,不影响文本选择)\n */\nexport function useSelectionControl(\n editorRef: React.RefObject<HTMLDivElement | null>,\n isDraggingRef: React.RefObject<boolean>\n) {\n // 必须在 hook 顶层使用 useRef,不能在 useEffect 内部\n const datePickerInteractionRef = useRef<number>(0);\n\n useEffect(() => {\n if (!editorRef.current) return;\n\n let isMouseDown = false;\n let lastClickTime = 0;\n\n const isDatePickerTarget = (el: EventTarget | null) => {\n if (!(el instanceof HTMLElement)) return false;\n return Boolean(\n el.closest('.rte-datepicker-wrapper') ||\n el.closest('.rte-datepicker-host') ||\n el.closest('.ant-picker') ||\n el.closest('.ant-picker-dropdown')\n );\n };\n\n const handleMouseDown = (e: MouseEvent) => {\n isMouseDown = true;\n if (isDatePickerTarget(e.target)) {\n datePickerInteractionRef.current = Date.now();\n console.log('[SelectionCtrl] mousedown on datepicker target');\n }\n };\n\n const handleMouseUp = () => {\n isMouseDown = false;\n lastClickTime = Date.now();\n };\n\n let isComposing = false; // 标记是否正在输入(中文输入法等)\n let lastInputTime = 0;\n\n const handleCompositionStart = () => {\n isComposing = true;\n };\n\n const handleCompositionEnd = () => {\n isComposing = false;\n lastInputTime = Date.now();\n };\n\n const handleInput = () => {\n lastInputTime = Date.now();\n };\n\n const handleFocusIn = (e: FocusEvent) => {\n if (isDatePickerTarget(e.target)) {\n datePickerInteractionRef.current = Date.now();\n console.log('[SelectionCtrl] focusin datepicker target');\n }\n };\n\n const handleSelectionChange = () => {\n // 如果最近与 DatePicker 交互(点击/聚焦),在短时间窗口内完全不干预\n if (Date.now() - datePickerInteractionRef.current < 800) {\n console.log('[SelectionCtrl] skip selectionchange due to recent datepicker interaction');\n return;\n }\n\n // 1. 检查 activeElement 是否是 DatePicker 的相关元素\n // 如果当前聚焦的是 DatePicker 的 input 或 dropdown,直接返回,不进行任何光标干预\n const activeEl = document.activeElement;\n if (activeEl) {\n if (activeEl.closest('.rte-datepicker-wrapper') || \n activeEl.closest('.rte-datepicker-host') || \n activeEl.closest('.ant-picker-dropdown') || // Antd dropdown\n (activeEl.tagName === 'INPUT' && activeEl.closest('.ant-picker')) // Antd picker input\n ) {\n console.log('[SelectionCtrl] activeElement is datepicker; skip');\n return;\n }\n }\n\n if (!editorRef.current) return;\n \n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n // 如果正在拖动,不干扰\n if (isDraggingRef.current) {\n return;\n }\n\n // 如果鼠标正在按下,不干扰(用户可能在选择文本)\n if (isMouseDown) {\n return;\n }\n\n // 如果正在输入(中文输入法等),不干扰\n if (isComposing) {\n return;\n }\n\n // 如果刚刚输入过(500ms 内),不干扰,避免在连续输入时干扰光标\n if (Date.now() - lastInputTime < 500) {\n return;\n }\n\n // 如果选择范围不是单个光标(有文本被选中),不干扰\n const range = selection.getRangeAt(0);\n if (!range.collapsed) {\n // 检查选中的内容是否在编辑器内部\n const isInEditor = editorRef.current.contains(range.commonAncestorContainer);\n if (!isInEditor) {\n // 如果选择在编辑器外部,不处理(避免影响外部输入框)\n return;\n }\n return;\n }\n\n const anchor = selection.anchorNode;\n if (!anchor) return;\n\n // 检查光标是否在编辑器内部\n if (!editorRef.current.contains(anchor)) {\n // 光标在编辑器外部,不处理(避免影响外部输入框)\n return;\n }\n\n // 检查光标是否在 DatePicker 内部(防止点击 DatePicker 时光标被强制移回)\n let isInDatePicker = false;\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n const el = anchor as HTMLElement;\n if (el.closest('[data-type=\"datepicker\"]') || el.closest('.rte-datepicker-wrapper') || el.closest('.rte-datepicker-host')) {\n isInDatePicker = true;\n }\n } else if (anchor.parentElement) {\n const el = anchor.parentElement;\n if (el.closest('[data-type=\"datepicker\"]') || el.closest('.rte-datepicker-wrapper') || el.closest('.rte-datepicker-host')) {\n isInDatePicker = true;\n }\n }\n \n if (isInDatePicker) {\n return;\n }\n\n // 检查光标是否在 variable 内部\n let variableNode: HTMLElement | null = null;\n \n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableNode = (anchor as HTMLElement).closest('[data-type=\"variable\"]');\n } else if (anchor.nodeType === Node.TEXT_NODE && (anchor as Text).parentElement) {\n variableNode = (anchor as Text).parentElement!.closest('[data-type=\"variable\"]');\n }\n\n // 如果光标不在 variable 内部,且是点击操作(不是拖动),移动到最近的 variable\n if (!variableNode) {\n // 只在点击后短时间内(500ms)才移动光标,避免干扰其他操作\n if (Date.now() - lastClickTime > 500) {\n return;\n }\n\n const variables = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n if (variables.length > 0) {\n // 找到最近的 variable(优先选择第一个可见的)\n let targetVariable: HTMLElement | null = null;\n for (const variable of Array.from(variables)) {\n if (variable.style.display !== 'none') {\n targetVariable = variable;\n break;\n }\n }\n // 如果所有 variable 都隐藏,使用第一个\n if (!targetVariable && variables.length > 0) {\n targetVariable = variables[0];\n }\n \n if (targetVariable) {\n const newRange = document.createRange();\n newRange.selectNodeContents(targetVariable);\n newRange.collapse(false); // 移动到末尾\n selection.removeAllRanges();\n selection.addRange(newRange);\n targetVariable.focus();\n } else {\n // 如果没有 variable,清除选择\n selection.removeAllRanges();\n }\n } else {\n // 如果没有 variable,清除选择\n selection.removeAllRanges();\n }\n }\n };\n\n // 在编辑器上监听输入事件\n const editor = editorRef.current;\n if (editor) {\n editor.addEventListener('compositionstart', handleCompositionStart);\n editor.addEventListener('compositionend', handleCompositionEnd);\n editor.addEventListener('input', handleInput);\n }\n\n document.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('focusin', handleFocusIn);\n document.addEventListener('selectionchange', handleSelectionChange);\n \n return () => {\n // 使用最新的 editorRef.current,因为 editor 可能在 cleanup 时已经改变\n const currentEditor = editorRef.current;\n if (currentEditor) {\n currentEditor.removeEventListener('compositionstart', handleCompositionStart);\n currentEditor.removeEventListener('compositionend', handleCompositionEnd);\n currentEditor.removeEventListener('input', handleInput);\n }\n document.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('focusin', handleFocusIn);\n document.removeEventListener('selectionchange', handleSelectionChange);\n };\n }, [editorRef, isDraggingRef]);\n}\n\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,_){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=_(require(\"dayjs\")):\"function\"==typeof define&&define.amd?define([\"dayjs\"],_):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh_cn=_(e.dayjs)}(this,(function(e){\"use strict\";function _(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=_(e),d={name:\"zh-cn\",weekdays:\"星期日_星期一_星期二_星期三_星期四_星期五_星期六\".split(\"_\"),weekdaysShort:\"周日_周一_周二_周三_周四_周五_周六\".split(\"_\"),weekdaysMin:\"日_一_二_三_四_五_六\".split(\"_\"),months:\"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),ordinal:function(e,_){return\"W\"===_?e+\"周\":e+\"日\"},weekStart:1,yearStart:4,formats:{LT:\"HH:mm\",LTS:\"HH:mm:ss\",L:\"YYYY/MM/DD\",LL:\"YYYY年M月D日\",LLL:\"YYYY年M月D日Ah点mm分\",LLLL:\"YYYY年M月D日ddddAh点mm分\",l:\"YYYY/M/D\",ll:\"YYYY年M月D日\",lll:\"YYYY年M月D日 HH:mm\",llll:\"YYYY年M月D日dddd HH:mm\"},relativeTime:{future:\"%s内\",past:\"%s前\",s:\"几秒\",m:\"1 分钟\",mm:\"%d 分钟\",h:\"1 小时\",hh:\"%d 小时\",d:\"1 天\",dd:\"%d 天\",M:\"1 个月\",MM:\"%d 个月\",y:\"1 年\",yy:\"%d 年\"},meridiem:function(e,_){var t=100*e+_;return t<600?\"凌晨\":t<900?\"早上\":t<1100?\"上午\":t<1300?\"中午\":t<1800?\"下午\":\"晚上\"}};return t.default.locale(d,null,!0),d}));","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nexport { _objectSpread2 as default };","export var commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport { commonLocale } from \"./common\";\nvar locale = _objectSpread(_objectSpread({}, commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nexport default locale;","const locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nexport default locale;","import CalendarLocale from \"rc-picker/es/locale/zh_CN\";\nimport TimePickerLocale from '../../time-picker/locale/zh_CN';\n// 统一合并为完整的 Locale\nconst locale = {\n lang: Object.assign({\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周']\n }, CalendarLocale),\n timePickerLocale: Object.assign({}, TimePickerLocale)\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nexport default locale;","/* eslint-disable react-refresh/only-export-components */\nimport React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DatePicker } from 'antd';\nimport dayjs, { Dayjs } from 'dayjs';\nimport 'dayjs/locale/zh-cn';\nimport zhCN from 'antd/es/date-picker/locale/zh_CN';\n\n// 使用中文本地化\ndayjs.locale('zh-cn');\n\nconst { RangePicker } = DatePicker;\n\ninterface DatePickerPortalProps {\n host: HTMLElement;\n onChange: (key: string, value: string) => void;\n}\n\nconst DatePickerPortal: React.FC<DatePickerPortalProps> = ({ host, onChange }) => {\n const key = host.dataset.key;\n const initialValueStr = host.dataset.value;\n const placeholderStr = host.dataset.placeholder;\n const limitRange = host.dataset.limitRange ? parseInt(host.dataset.limitRange, 10) : undefined;\n const disableFuture = host.dataset.disableFuture === 'true';\n\n const [dates, setDates] = useState<[Dayjs | null, Dayjs | null] | null>(() => {\n if (!initialValueStr) return null;\n const parts = initialValueStr.split(',');\n if (parts.length === 2 && parts[0] && parts[1]) {\n return [dayjs(parts[0]), dayjs(parts[1])];\n }\n return null;\n });\n\n const [hackValue, setHackValue] = useState<[Dayjs | null, Dayjs | null] | null>(null);\n\n const disabledDate = (current: Dayjs) => {\n if (!current) return false;\n \n // Future check\n if (disableFuture && current.isAfter(dayjs(), 'day')) {\n return true;\n }\n\n if (!limitRange || !hackValue || !hackValue[0]) {\n return false;\n }\n \n // Range check\n const diff = Math.abs(current.diff(hackValue[0], 'days'));\n return diff > limitRange;\n };\n\n const onCalendarChange = (val: [Dayjs | null, Dayjs | null] | null) => {\n console.log('[DatePicker] onCalendarChange', val?.map(d => d?.format('YYYY-MM-DD') || null));\n setHackValue(val);\n };\n\n const onChangeHandler = (val: [Dayjs | null, Dayjs | null] | null) => {\n console.log('[DatePicker] onChange', val?.map(d => d?.format('YYYY-MM-DD') || null));\n setDates(val);\n setHackValue(null); // Clear hack value on complete selection\n \n if (val && val[0] && val[1]) {\n const str = `${val[0].format('YYYY-MM-DD')},${val[1].format('YYYY-MM-DD')}`;\n host.setAttribute('data-value', str);\n onChange(key!, str);\n } else {\n host.setAttribute('data-value', \"\");\n onChange(key!, \"\");\n }\n };\n\n const onOpenChange = (open: boolean) => {\n console.log('[DatePicker] onOpenChange', open);\n if (open) {\n setHackValue(dates);\n } else {\n setHackValue(null);\n }\n };\n\n return createPortal(\n <div className=\"rte-datepicker-wrapper\" contentEditable={false} style={{ display: 'inline-block', verticalAlign: 'middle', width: '240px' }}>\n <RangePicker\n value={dates}\n disabledDate={disabledDate}\n onCalendarChange={onCalendarChange}\n onChange={onChangeHandler}\n onOpenChange={onOpenChange}\n placeholder={[placeholderStr || '开始日期', placeholderStr || '结束日期']}\n style={{ width: '100%' }}\n size=\"small\"\n allowClear\n locale={zhCN}\n getPopupContainer={() => document.body}\n popupClassName=\"rte-datepicker-dropdown\"\n />\n </div>,\n host\n );\n};\n\nexport const useDatePickerPortals = (editorRef: React.RefObject<HTMLDivElement | null>) => {\n const [portals, setPortals] = useState<React.ReactElement[]>([]);\n \n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n const updatePortals = () => {\n const hosts = editor.querySelectorAll('.rte-datepicker-host');\n \n const newPortals: React.ReactElement[] = [];\n hosts.forEach((host) => {\n const key = host.getAttribute('data-key');\n if (key) {\n newPortals.push(\n <DatePickerPortal \n key={`datepicker-${key}`} \n host={host as HTMLElement} \n onChange={() => {\n // 触发 input 事件以更新验证状态\n if (editorRef.current) {\n const event = new Event('input', { bubbles: true });\n editorRef.current.dispatchEvent(event);\n }\n }} \n />\n );\n }\n });\n \n setPortals(newPortals);\n };\n\n // Initial update\n updatePortals();\n\n // Observe changes\n const observer = new MutationObserver((mutations) => {\n let shouldUpdate = false;\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n // Check if any added nodes contain datepicker host\n // or removed nodes contained datepicker host\n // For simplicity, just update if childList changes on editor or its subtrees\n // But we want to avoid loop if Portal modifies DOM.\n // Portal renders into host. host is inside editor.\n // So we need to ignore mutations inside .rte-datepicker-host\n \n let relevantChange = false;\n // Check added nodes\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (el.classList?.contains('rte-datepicker-host') || el.querySelector?.('.rte-datepicker-host')) {\n relevantChange = true;\n }\n }\n });\n // Check removed nodes\n mutation.removedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (el.classList?.contains('rte-datepicker-host') || el.querySelector?.('.rte-datepicker-host')) {\n relevantChange = true;\n }\n }\n });\n \n if (relevantChange) {\n shouldUpdate = true;\n break;\n }\n }\n }\n \n if (shouldUpdate) {\n updatePortals();\n }\n });\n\n observer.observe(editor, { childList: true, subtree: true });\n\n return () => observer.disconnect();\n }, [editorRef]); // Re-run if editorRef changes (unlikely)\n\n return portals;\n};\n\n\n","import React, {\n useRef,\n useState,\n useEffect,\n useLayoutEffect,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Tooltip, Dropdown } from \"antd\";\nimport \"./index.css\";\nimport type { StructuredInputProps, InputNode } from \"./types\";\nimport { checkExclusionStates } from \"./exclusionLogic\";\nimport { validateRequiredFields } from \"./validation\";\nimport { updatePlaceholders } from \"./placeholders\";\nimport {\n useInitializeEditorContent,\n useUploadInfoTooltip,\n useTagTooltip,\n useUploadLabelTooltip,\n useVariableTooltip,\n useExclusionAndValidation,\n useSelectionControl,\n} from \"./hooks\";\nimport { useDatePickerPortals } from \"./DatePickerPortal\";\n\n// 重新导出类型,保持向后兼容\nexport type { NodeType, InputNode, AgentOption, StructuredInputProps } from \"./types\";\n\nexport const RichTextEditor: React.FC<StructuredInputProps> = ({\n config,\n onSend,\n isProcessing = false,\n disabled = false,\n width,\n lockStructure = false,\n agentOptions = [],\n onAgentSelect,\n onAgentExit,\n loading = false,\n placeholder,\n border,\n background = 'transparent',\n hideButtons,\n}) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [files, setFiles] = useState<Record<string, File | null>>({});\n const [activeFileKey, setActiveFileKey] = useState<string | null>(null);\n const [popoverVisible, setPopoverVisible] = useState<{\n key: string;\n anchorEl: HTMLElement | null;\n type?: 'upload' | 'tag' | 'upload-label' | 'variable' | 'upload-preview';\n } | null>(null);\n const isDraggingRef = useRef<boolean>(false);\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n const [isFormValid, setIsFormValid] = useState<boolean>(false);\n // 保存光标位置信息,用于在重新生成 HTML 后恢复光标\n const savedCursorRef = useRef<{ key: string; offset: number } | null>(null);\n // 编辑器是否为空(用于显示 placeholder)\n const [isEmpty, setIsEmpty] = useState<boolean>(true);\n \n // 管理 multi-variable 类型的输入框数量\n const [multiVariableCounts, setMultiVariableCounts] = useState<Record<string, number>>(() => {\n const counts: Record<string, number> = {};\n config.forEach(node => {\n if (node.type === 'multi-variable' && node.key) {\n counts[node.key] = 1; // 默认初始化为1\n }\n });\n return counts;\n });\n \n // 保存每个智能体的状态(通过第一个 tag 的 text 来标识)\n const agentStatesRef = useRef<Record<string, {\n variableValues: Record<string, string>;\n files: Record<string, File | null>;\n multiVariableCounts: Record<string, number>;\n }>>({});\n \n // 使用 ref 来保存当前的 files 和 multiVariableCounts,以便在保存状态时使用最新值\n const filesRef = useRef<Record<string, File | null>>({});\n const multiVariableCountsRef = useRef<Record<string, number>>({});\n \n // 同步 ref 和 state\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n \n useEffect(() => {\n multiVariableCountsRef.current = multiVariableCounts;\n }, [multiVariableCounts]);\n \n // 获取当前智能体的标识(第一个 tag 节点的 text)\n const getAgentId = useCallback((config: InputNode[]): string | null => {\n const firstTag = config.find(node => node.type === 'tag');\n return firstTag?.text || null;\n }, []);\n\n // 当 config 变化时,保存当前状态并恢复新状态\n const prevConfigRef = useRef<InputNode[]>(config);\n const pendingRestoreRef = useRef<{\n variableValues: Record<string, string>;\n files: Record<string, File | null>;\n multiVariableCounts: Record<string, number>;\n } | null>(null);\n \n useEffect(() => {\n const prevAgentId = getAgentId(prevConfigRef.current);\n const currentAgentId = getAgentId(config);\n \n // 如果切换了智能体,保存之前的状态\n if (prevAgentId && prevAgentId !== currentAgentId && editorRef.current) {\n // 收集所有 variable/select/textarea 的值\n const variableValues: Record<string, string> = {};\n const variableElements = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n variableElements.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n const selectElements = editorRef.current.querySelectorAll<HTMLSelectElement>('[data-type=\"select\"]');\n selectElements.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n const textareaElements = editorRef.current.querySelectorAll<HTMLTextAreaElement>('[data-type=\"textarea\"]');\n textareaElements.forEach((el) => {\n const key = el.dataset.key;\n if (key) {\n const val = el.value.replace(/[\\u200B]/g, \"\").trim();\n if (val) {\n variableValues[key] = val;\n }\n }\n });\n \n // 保存状态\n agentStatesRef.current[prevAgentId] = {\n variableValues,\n files: { ...filesRef.current },\n multiVariableCounts: { ...multiVariableCountsRef.current },\n };\n }\n \n // 恢复新智能体的状态\n if (currentAgentId && agentStatesRef.current[currentAgentId]) {\n const savedState = agentStatesRef.current[currentAgentId];\n // 保存到 pendingRestoreRef,在 useLayoutEffect 中恢复\n pendingRestoreRef.current = savedState;\n // 恢复文件\n setFiles(savedState.files);\n // 恢复 multi-variable 数量\n setMultiVariableCounts(savedState.multiVariableCounts);\n } else if (currentAgentId) {\n // 如果没有保存的状态,重置为新配置的默认值\n pendingRestoreRef.current = null;\n const counts: Record<string, number> = {};\n config.forEach(node => {\n if (node.type === 'multi-variable' && node.key) {\n counts[node.key] = 1;\n }\n });\n setMultiVariableCounts(counts);\n setFiles({});\n } else {\n // 如果没有 tag(默认输入框状态),重置所有状态\n pendingRestoreRef.current = null;\n setMultiVariableCounts({});\n setFiles({});\n }\n \n // 更新 prevConfigRef\n prevConfigRef.current = config;\n }, [config, getAgentId]);\n \n // 使用 useLayoutEffect 确保在 DOM 更新前设置 __tempVariableValues\n // 这个 effect 会在每次渲染后执行,确保在 useInitializeEditorContent 执行时 __tempVariableValues 已经设置好\n useLayoutEffect(() => {\n if (pendingRestoreRef.current && editorRef.current) {\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = pendingRestoreRef.current.variableValues;\n // 延迟清除,确保 useInitializeEditorContent 已经读取了值\n // 使用 setTimeout 确保在下一个事件循环中清除,此时 useInitializeEditorContent 应该已经读取了值\n setTimeout(() => {\n if (pendingRestoreRef.current) {\n pendingRestoreRef.current = null;\n }\n }, 0);\n }\n });\n\n // 使用自定义 hooks\n useInitializeEditorContent(editorRef, config, files, lockStructure, multiVariableCounts, savedCursorRef, undefined, hideButtons);\n useUploadInfoTooltip(editorRef, config, files, setPopoverVisible);\n useTagTooltip(editorRef, config, setPopoverVisible, hideButtons);\n useUploadLabelTooltip(editorRef, config, files, setPopoverVisible);\n useVariableTooltip(editorRef, config, setPopoverVisible);\n useExclusionAndValidation(editorRef, config, files, setIsFormValid);\n useSelectionControl(editorRef, isDraggingRef);\n\n // 渲染 DatePicker Portal\n const datePickerPortals = useDatePickerPortals(editorRef);\n\n // 检查编辑器是否为空(仅在 config 为空时检查)\n useEffect(() => {\n // 如果 config 不为空,不显示 placeholder\n if (config.length > 0) {\n setIsEmpty(false);\n return;\n }\n\n const checkEmpty = () => {\n if (!editorRef.current) {\n setIsEmpty(true);\n return;\n }\n \n // 获取所有文本内容(排除零宽空格)\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n \n // 检查是否有任何 variable 或 upload 有内容\n const variables = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n const uploads = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"upload\"]');\n \n let hasContent = false;\n \n // 检查 variable 是否有内容\n variables.forEach((el) => {\n const content = el.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n if (content) {\n hasContent = true;\n }\n });\n \n // 检查 upload 是否有文件\n uploads.forEach((el) => {\n const hasFile = el.querySelector('.upload-inner-wrapper.has-file');\n if (hasFile) {\n hasContent = true;\n }\n });\n \n // 只有当 config 为空且编辑器没有任何内容时,才显示 placeholder\n const isEditorEmpty = !textContent && !hasContent;\n setIsEmpty(isEditorEmpty);\n \n // 在默认状态下,如果编辑器为空,禁用发送按钮\n if (config.length === 0) {\n setIsFormValid(!isEditorEmpty);\n }\n };\n\n // 初始检查\n checkEmpty();\n\n // 监听编辑器内容变化\n const observer = new MutationObserver(checkEmpty);\n if (editorRef.current) {\n observer.observe(editorRef.current, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n\n return () => {\n observer.disconnect();\n };\n }, [config]);\n\n\n /**\n * 处理粘贴事件\n * @param e 粘贴事件\n */\n const handlePaste = (e: React.ClipboardEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n e.preventDefault();\n const text = e.clipboardData.getData(\"text/plain\");\n \n // 检查当前焦点是否在 multi-variable 类型的输入框中\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n if (anchor) {\n let variableEl: HTMLElement | null = null;\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableEl = (anchor as HTMLElement).closest('[data-type=\"variable\"]');\n } else if (anchor.nodeType === Node.TEXT_NODE && (anchor as Text).parentElement) {\n variableEl = (anchor as Text).parentElement!.closest('[data-type=\"variable\"]');\n }\n \n if (variableEl) {\n const multiKey = variableEl.dataset.multiKey;\n if (multiKey) {\n // 是 multi-variable 类型,分割粘贴的内容\n // 支持多种分隔符:空格、顿号(、)、逗号(,)、中文逗号(,)、换行符等\n const separatorRegex = /[、,,\\s\\n\\r\\t]+/;\n const values = text.split(separatorRegex).map(v => v.trim()).filter(v => v.length > 0);\n \n console.log('[Paste Event] 粘贴的内容:', text);\n console.log('[Paste Event] 拆分后的值:', values);\n \n if (values.length > 1) {\n // 批量粘贴:填充到多个输入框\n const currentIndex = parseInt(variableEl.dataset.index || \"0\", 10);\n const maxCount = (() => {\n const node = config.find(n => n.type === 'multi-variable' && n.key === multiKey);\n return node?.maxCount || 9;\n })();\n \n // 确保有足够的输入框\n const currentCount = multiVariableCounts[multiKey] || 1;\n const neededCount = Math.min(currentIndex + values.length, maxCount);\n if (neededCount > currentCount) {\n setMultiVariableCounts(prev => ({\n ...prev,\n [multiKey]: neededCount\n }));\n }\n \n // 收集所有现有的值,准备重新生成HTML\n const allValues: string[] = [];\n for (let i = 0; i < currentCount; i++) {\n const key = `${multiKey}_${i}`;\n const el = editorRef.current!.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"][data-multi-key=\"${multiKey}\"]`\n );\n if (el) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n allValues.push(text);\n }\n }\n \n // 在 currentIndex 位置,用拆分后的值替换原来的值\n allValues.splice(currentIndex, 1, ...values.slice(0, maxCount - currentIndex));\n \n // 确保不超过 maxCount,并且如果最后一个值不为空,添加一个空框\n const finalValues = allValues.slice(0, maxCount);\n if (finalValues.length > 0 && finalValues[finalValues.length - 1] !== \"\") {\n if (finalValues.length < maxCount) {\n finalValues.push(\"\");\n }\n }\n const finalCount = Math.max(finalValues.length, 1);\n \n // 保存 variableValues\n const variableValues: Record<string, string> = {};\n finalValues.forEach((val, idx) => {\n if (val) {\n variableValues[`${multiKey}_${idx}`] = val;\n }\n });\n \n // 保存其他 variable 的值\n const allVariables = editorRef.current!.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"]'\n );\n allVariables.forEach((el) => {\n const key = el.dataset.key;\n const elMultiKey = el.dataset.multiKey;\n if (key && elMultiKey !== multiKey) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n \n // 临时保存 variableValues,用于重新生成 HTML\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = variableValues;\n \n // 更新 multiVariableCounts,这会触发重新渲染\n setMultiVariableCounts(prev => ({\n ...prev,\n [multiKey]: finalCount\n }));\n \n console.log('[Paste Event] 粘贴完成,已填充到多个输入框,值:', finalValues);\n return;\n } else if (values.length === 1) {\n // 单个值,直接粘贴,但需要检查粘贴后的内容是否包含分隔符\n // 如果包含分隔符,在失去焦点时自动拆分\n console.log('[Paste Event] 粘贴单个值,将在失去焦点时检查是否需要拆分');\n }\n }\n }\n }\n }\n \n // 普通粘贴:使用 execCommand\n document.execCommand(\"insertText\", false, text);\n // 触发 input 逻辑更新 placeholder\n handleInput();\n \n // 如果是 multi-variable 类型,粘贴后检查是否需要拆分\n setTimeout(() => {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n if (anchor) {\n let variableEl: HTMLElement | null = null;\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableEl = (anchor as HTMLElement).closest('[data-type=\"variable\"][data-multi-key]');\n } else if (anchor.nodeType === Node.TEXT_NODE && (anchor as Text).parentElement) {\n variableEl = (anchor as Text).parentElement!.closest('[data-type=\"variable\"][data-multi-key]');\n }\n \n if (variableEl) {\n const content = variableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n const separatorRegex = /[、,,\\s]+/;\n if (separatorRegex.test(content)) {\n console.log('[Paste Event] 粘贴后检测到分隔符,内容:', content);\n console.log('[Paste Event] 提示:失去焦点后将自动拆分');\n }\n }\n }\n }\n }, 0);\n };\n\n /**\n * 处理文件变化事件\n * @param e 文件变化事件\n */\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files[0] && activeFileKey) {\n const file = e.target.files[0];\n const key = activeFileKey;\n setFiles((prev) => ({ ...prev, [key]: file }));\n }\n if (e.target) e.target.value = \"\";\n setActiveFileKey(null);\n };\n\n /**\n * 处理删除文件\n * @param key 文件键\n */\n const handleRemoveFile = (key: string) => {\n setFiles((prev) => {\n const next = { ...prev };\n delete next[key];\n return next;\n });\n };\n\n /**\n * 处理鼠标按下事件\n * @param e 鼠标按下事件\n */\n const handleMouseDown = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // 如果点击的是 DatePicker,直接返回,不触发其他逻辑\n if (target.closest('.rte-datepicker-wrapper') || target.closest('.rte-datepicker-host')) {\n return;\n }\n \n // 优先处理 tag 关闭按钮点击(在 mousedown 时直接处理,确保能捕获到)\n const tagCloseBtn = target.closest(\".tag-close-btn\");\n if (tagCloseBtn) {\n e.preventDefault();\n e.stopPropagation();\n // 如果锁定结构,不允许删除 tag\n if (lockStructure) {\n return;\n }\n // 清除 tooltip 状态\n setPopoverVisible(null);\n // 调用退出智能体的回调\n if (onAgentExit) {\n onAgentExit();\n } else {\n // 如果没有提供回调,则清空编辑器\n if (editorRef.current) {\n editorRef.current.innerHTML = \"\";\n editorRef.current.focus();\n }\n }\n return;\n }\n \n // 如果锁定结构,检查是否点击的是 text 或 tag 节点\n if (lockStructure) {\n const tagNode = target.closest<HTMLElement>('.tag-node');\n const textNode = target.closest<HTMLElement>('[data-type=\"text\"]');\n \n // 如果点击的是 tag 或 text 节点,阻止设置光标\n if (tagNode || textNode) {\n e.preventDefault();\n e.stopPropagation();\n // 清除可能已经设置的光标\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n return;\n }\n }\n \n // 如果点击的是 variable 元素,完全让浏览器处理,不进行任何干扰\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n // 不阻止默认行为,不记录位置,让浏览器完全处理文本选择\n // 不设置 isDraggingRef,这样 handleEditorClick 也不会干扰\n return;\n }\n \n // 记录鼠标按下位置(用于检测拖动)\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n isDraggingRef.current = false;\n \n // 处理文件删除按钮\n if (target.closest(\".file-remove-btn\")) {\n // 这些按钮需要阻止默认行为,实际处理在 handleEditorClick 中\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n /**\n * 处理鼠标移动事件\n * @param e 鼠标移动事件\n */\n const handleMouseMove = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n \n // 如果是在 variable 元素内,不干扰,让浏览器处理\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n return;\n }\n \n // 检测是否在拖动\n if (mouseDownPosRef.current) {\n const deltaX = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const deltaY = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过 3px,认为是拖动\n if (deltaX > 3 || deltaY > 3) {\n isDraggingRef.current = true;\n }\n }\n };\n\n /**\n * 处理鼠标抬起事件\n * @param e 鼠标抬起事件\n */\n const handleMouseUp = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n \n // 如果是在 variable 元素上,让浏览器处理,不干扰\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n // 重置拖动状态,但不做其他处理\n mouseDownPosRef.current = null;\n isDraggingRef.current = false;\n return;\n }\n \n // 重置拖动状态\n mouseDownPosRef.current = null;\n isDraggingRef.current = false;\n };\n\n const handleEditorClick = (e: React.MouseEvent) => {\n // 如果禁用,不处理任何点击事件\n if (disabled) {\n return;\n }\n\n const target = e.target as HTMLElement;\n\n // 如果点击的是 DatePicker,直接返回,不触发其他逻辑\n const datepickerHost = target.closest<HTMLElement>('[data-type=\"datepicker\"]');\n if (datepickerHost) {\n return;\n }\n\n // tag 关闭按钮已在 handleMouseDown 中处理,这里不再重复处理\n // 但为了兼容性,如果 handleMouseDown 没有处理,这里也处理一次\n const tagCloseBtn = target.closest(\".tag-close-btn\");\n if (tagCloseBtn) {\n // 如果已经在 handleMouseDown 中处理过,这里不再重复处理\n // 但为了确保事件被正确处理,这里也检查一次\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // 如果 config 为空,编辑器是纯文本模式,不处理其他特殊逻辑\n if (config.length === 0) {\n return;\n }\n\n // 辅助:切换富文本全屏时,强制隐藏/恢复其他节点,避免样式被覆盖时仍可见\n const toggleRichtextFullscreenVisibility = (hostEl: HTMLElement, expanded: boolean) => {\n if (!editorRef.current) return;\n const children = Array.from(editorRef.current.children) as HTMLElement[];\n children.forEach((child) => {\n if (child === hostEl) return;\n if (expanded) {\n if (child.dataset.prevDisplay === undefined) {\n child.dataset.prevDisplay = child.style.display || \"\";\n }\n child.style.setProperty(\"display\", \"none\", \"important\");\n } else {\n if (child.dataset.prevDisplay !== undefined) {\n const prev = child.dataset.prevDisplay;\n if (prev) {\n child.style.display = prev;\n } else {\n child.style.removeProperty(\"display\");\n }\n delete child.dataset.prevDisplay;\n } else {\n child.style.removeProperty(\"display\");\n }\n }\n });\n };\n\n // textarea 展开/收起\n const textareaToggle = target.closest<HTMLElement>('.rte-textarea-toggle');\n if (textareaToggle) {\n e.preventDefault();\n e.stopPropagation();\n const wrapper = textareaToggle.closest<HTMLElement>('.rte-textarea-wrapper');\n const textarea = wrapper?.querySelector<HTMLTextAreaElement>('[data-type=\"textarea\"]');\n const expanded = textareaToggle.getAttribute('data-expanded') === 'true';\n const next = !expanded;\n textareaToggle.setAttribute('data-expanded', String(next));\n textareaToggle.textContent = next ? '收起' : '展开';\n if (wrapper) {\n wrapper.classList.toggle('rte-textarea-expanded', next);\n }\n const requiredWrapper = wrapper?.closest<HTMLElement>('.rte-textarea-required');\n if (requiredWrapper) {\n requiredWrapper.classList.toggle('rte-textarea-overlay', next);\n } else if (wrapper) {\n wrapper.classList.toggle('rte-textarea-overlay', next);\n }\n if (textarea) {\n if (next) {\n textarea.classList.add('rte-textarea-expanded');\n textarea.style.maxHeight = 'none';\n textarea.style.height = '100%';\n } else {\n textarea.classList.remove('rte-textarea-expanded');\n const maxHeight = textarea.dataset.maxHeight || '252';\n textarea.style.maxHeight = `${maxHeight}px`;\n textarea.style.height = 'auto';\n }\n }\n if (editorRef.current) {\n if (next) {\n editorRef.current.classList.add('rte-overlay-active');\n } else {\n editorRef.current.classList.remove('rte-overlay-active');\n }\n }\n return;\n }\n\n // richtext 展开/收起\n const richtextToggle = target.closest<HTMLElement>('.rte-richtext-toggle');\n if (richtextToggle) {\n e.preventDefault();\n e.stopPropagation();\n const wrapper = richtextToggle.closest<HTMLElement>('.rte-richtext-wrapper');\n const rich = wrapper?.querySelector<HTMLElement>('[data-type=\"richtext\"]');\n const expanded = richtextToggle.getAttribute('data-expanded') === 'true';\n const next = !expanded;\n const updateToggle = (el: HTMLElement, isExpanded: boolean) => {\n el.setAttribute('data-expanded', String(isExpanded));\n el.innerHTML = isExpanded\n ? `<i class=\"iconfont icon-shouqi1\"></i><span class=\"rte-richtext-toggle-label\">收起</span>`\n : `<i class=\"iconfont icon-zhankai2\"></i><span class=\"rte-richtext-toggle-label\">展开</span>`;\n };\n updateToggle(richtextToggle, next);\n const requiredWrapper = wrapper?.closest<HTMLElement>('.rte-richtext-required');\n if (requiredWrapper) {\n requiredWrapper.classList.toggle('rte-richtext-expanded', next);\n } else if (wrapper) {\n wrapper.classList.toggle('rte-richtext-expanded', next);\n }\n const host = wrapper?.closest<HTMLElement>('.exclusion-wrapper') || wrapper?.parentElement;\n if (rich) {\n if (next) {\n rich.style.height = '100%';\n rich.style.overflow = 'auto';\n } else {\n rich.style.height = '';\n rich.style.overflow = '';\n }\n }\n // 全屏覆盖:隐藏其他节点,仅保留 richtext host,固定编辑区高度 252px\n if (host) {\n host.classList.toggle('rte-richtext-host-expanded', next);\n toggleRichtextFullscreenVisibility(host, next);\n }\n if (editorRef.current) {\n editorRef.current.classList.toggle('rte-richtext-fullscreen-active', next);\n }\n return;\n }\n\n // 检查是否点击的是 text 节点,无论 lockStructure 是否为 true,都阻止\n const textNode = target.closest<HTMLElement>('[data-type=\"text\"]');\n if (textNode) {\n e.preventDefault();\n e.stopPropagation();\n // 清除可能已经设置的光标\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n return;\n }\n\n // 如果锁定结构,检查是否点击的是 tag 节点\n if (lockStructure) {\n const tagNode = target.closest<HTMLElement>('.tag-node');\n \n // 如果点击的是 tag 节点,阻止设置光标\n if (tagNode) {\n e.preventDefault();\n e.stopPropagation();\n // 清除可能已经设置的光标\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n return;\n }\n }\n\n // 如果点击的是 variable 元素\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n if (variableChip) {\n // 如果是拖动操作,不处理\n if (isDraggingRef.current) {\n return;\n }\n \n // 让浏览器正常处理点击事件,设置光标位置\n // 不调用 updatePlaceholders 并传入 variableChip,因为这会重置光标位置到末尾\n // 只在需要时更新占位符(不重置光标位置)\n setTimeout(() => {\n const selection = window.getSelection();\n \n // 如果有文本被选中,说明是拖动选择,不干扰\n if (selection && !selection.isCollapsed) {\n return;\n }\n \n // 只更新占位符,不重置光标位置\n updatePlaceholders(editorRef);\n }, 10);\n return;\n }\n\n\n // 删除文件\n const removeBtn = target.closest(\".file-remove-btn\");\n if (removeBtn) {\n e.preventDefault();\n e.stopPropagation();\n const uploadChip = removeBtn.closest<HTMLElement>('[data-type=\"upload\"]');\n const key = uploadChip?.dataset.key;\n if (key) handleRemoveFile(key);\n return;\n }\n\n // 选择文件\n const uploadChip = target.closest<HTMLElement>('[data-type=\"upload\"]');\n if (uploadChip) {\n const key = uploadChip.dataset.key;\n if (key) {\n setActiveFileKey(key);\n fileInputRef.current?.click();\n }\n return;\n }\n };\n\n /**\n * 处理双击事件\n * @param e 双击事件\n * @returns void\n */\n const handleDoubleClick = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"]');\n \n if (variableChip) {\n // 双击全选 variable 元素内的文本\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n const textContent = variableChip.textContent || \"\";\n const cleanText = textContent.replace(/\\u200B/g, \"\");\n \n // 如果有实际内容,全选(排除零宽字符)\n if (cleanText) {\n // 找到第一个非零宽字符的位置\n let startOffset = 0;\n let endOffset = textContent.length;\n \n // 如果以零宽字符开头,跳过它\n if (textContent.startsWith(\"\\u200B\")) {\n startOffset = 1;\n }\n \n // 如果以零宽字符结尾,排除它\n if (textContent.endsWith(\"\\u200B\") && textContent.length > 1) {\n endOffset = textContent.length - 1;\n }\n \n // 选择文本节点\n const textNode = variableChip.firstChild;\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\n range.setStart(textNode, startOffset);\n range.setEnd(textNode, endOffset);\n } else {\n // 如果没有文本节点,选择整个元素内容\n range.selectNodeContents(variableChip);\n }\n } else {\n // 只有零宽字符,不选择,只设置光标\n range.selectNodeContents(variableChip);\n range.collapse(true);\n }\n \n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n };\n\n /**\n * 处理输入事件\n */\n const handleInput = () => {\n // 如果 config 为空,编辑器是纯文本模式,需要更新 isEmpty 和 isFormValid 状态\n if (config.length === 0) {\n // 检查编辑器内容是否为空\n if (editorRef.current) {\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n const isEditorEmpty = !textContent;\n setIsEmpty(isEditorEmpty);\n setIsFormValid(!isEditorEmpty);\n }\n return;\n }\n \n updatePlaceholders(editorRef);\n \n // 更新 variable-info-icon 的显示/隐藏状态\n if (editorRef.current) {\n const variableChips = editorRef.current.querySelectorAll<HTMLElement>('[data-type=\"variable\"]');\n variableChips.forEach((chip) => {\n const infoIcon = chip.querySelector<HTMLElement>('.variable-info-icon');\n if (infoIcon) {\n // 获取所有文本节点,排除图标\n let hasText = false;\n const walker = document.createTreeWalker(\n chip,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n // 排除图标内的文本节点\n if (infoIcon.contains(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n );\n \n while (walker.nextNode()) {\n const text = walker.currentNode.textContent?.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n hasText = true;\n break;\n }\n }\n \n if (hasText) {\n infoIcon.classList.add('hidden');\n } else {\n infoIcon.classList.remove('hidden');\n }\n }\n });\n }\n \n checkExclusionStates(editorRef, config, files);\n validateRequiredFields(editorRef, config, files, setIsFormValid);\n \n // 检测 multi-variable 类型的输入,当有值时自动添加新的输入框\n if (!editorRef.current) return;\n \n const multiVariableNodes = config.filter(node => node.type === 'multi-variable' && node.key);\n \n multiVariableNodes.forEach(node => {\n if (!node.key) return;\n const maxCount = node.maxCount || 9;\n const currentCount = multiVariableCounts[node.key] || 1;\n \n // 收集所有输入框的值\n const values: string[] = [];\n for (let i = 0; i < currentCount; i++) {\n const key = `${node.key}_${i}`;\n const el = editorRef.current!.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"][data-multi-key=\"${node.key}\"]`\n );\n if (el) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n values.push(text);\n }\n }\n \n // 检查最后一个输入框是否为空(是否已经有一个空框)\n const lastValue = values[values.length - 1] || \"\";\n const hasEmptyBox = lastValue === \"\";\n \n // 检测是否有空的输入框(除了最后一个)\n let hasEmptyInMiddle = false;\n let emptyIndex = -1;\n for (let i = 0; i < values.length - 1; i++) {\n if (values[i] === \"\") {\n hasEmptyInMiddle = true;\n emptyIndex = i;\n break;\n }\n }\n \n // 如果中间有空框,删除它并前移数据\n if (hasEmptyInMiddle && emptyIndex >= 0) {\n // 保存当前光标位置信息(如果光标在受影响的输入框中)\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const container = range.startContainer;\n const currentVariableEl = container.nodeType === Node.ELEMENT_NODE\n ? (container as HTMLElement).closest('[data-type=\"variable\"][data-multi-key]')\n : container.parentElement?.closest('[data-type=\"variable\"][data-multi-key]');\n \n if (currentVariableEl) {\n const key = (currentVariableEl as HTMLElement).dataset.key;\n if (key) {\n // 计算光标在当前输入框中的偏移量\n const rangeBefore = document.createRange();\n rangeBefore.setStartBefore(currentVariableEl);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n const offset = rangeBefore.toString().length;\n \n // 保存光标信息\n savedCursorRef.current = { key, offset };\n }\n }\n }\n \n // 前移数据:将 emptyIndex 之后的数据前移一位\n const newValues = [...values];\n for (let i = emptyIndex; i < newValues.length - 1; i++) {\n newValues[i] = newValues[i + 1];\n }\n newValues.pop(); // 移除最后一个\n \n // 更新 variableValues,用于在重新生成 HTML 时恢复数据\n const variableValues: Record<string, string> = {};\n newValues.forEach((val, idx) => {\n if (val) {\n variableValues[`${node.key}_${idx}`] = val;\n }\n });\n \n // 如果已经有一个空框,不再添加新的空框,直接使用当前数量减1\n // 如果最后一个不为空,说明删除后需要保留一个空框\n const finalCount = hasEmptyBox \n ? Math.max(newValues.length, 1) // 已经有一个空框,不再添加\n : Math.max(newValues.length + 1, 1); // 没有空框,添加一个\n \n // 保存所有其他 variable 的值\n const allVariables = editorRef.current!.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"]'\n );\n allVariables.forEach((el) => {\n const key = el.dataset.key;\n const multiKey = el.dataset.multiKey;\n if (key && multiKey !== node.key) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n \n // 临时保存 variableValues,用于在重新生成 HTML 时使用\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = variableValues;\n \n setMultiVariableCounts(prev => ({\n ...prev,\n [node.key!]: finalCount\n }));\n \n return; // 处理完这个节点后返回,避免继续处理添加逻辑\n }\n \n // 检查最后一个输入框是否有值,如果有值且数量未达上限,则添加新输入框\n // 只有当最后一个输入框有值且没有空框时,才添加新的空框\n if (!hasEmptyBox) {\n const lastIndex = currentCount - 1;\n const lastKey = `${node.key}_${lastIndex}`;\n const lastVariableEl = editorRef.current!.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${lastKey}\"][data-multi-key=\"${node.key}\"]`\n );\n \n if (lastVariableEl) {\n const text = lastVariableEl.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n // 如果最后一个输入框有值,且当前数量小于最大数量,则增加一个输入框\n if (text.length > 0 && currentCount < maxCount) {\n // 保存当前光标位置信息\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const container = range.startContainer;\n const currentVariableEl = container.nodeType === Node.ELEMENT_NODE\n ? (container as HTMLElement).closest('[data-type=\"variable\"][data-multi-key]')\n : container.parentElement?.closest('[data-type=\"variable\"][data-multi-key]');\n \n if (currentVariableEl) {\n const key = (currentVariableEl as HTMLElement).dataset.key;\n if (key) {\n // 计算光标在当前输入框中的偏移量\n const rangeBefore = document.createRange();\n rangeBefore.setStartBefore(currentVariableEl);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n const offset = rangeBefore.toString().length;\n \n // 保存光标信息\n savedCursorRef.current = { key, offset };\n }\n }\n }\n \n setMultiVariableCounts(prev => ({\n ...prev,\n [node.key!]: currentCount + 1\n }));\n }\n }\n }\n \n });\n };\n\n /**\n * 处理失去焦点事件\n */\n // 直接在 multi-variable 输入框上监听 blur 事件,避免污染外部输入框\n // 同时处理编辑器容器的 blur 事件(用于验证和占位符更新)\n useLayoutEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n \n // 存储所有绑定的事件监听器,用于清理\n const listeners = new Map<HTMLElement, (e: FocusEvent) => void>();\n \n // 处理编辑器容器的 blur 事件(用于验证和占位符更新)\n const handleEditorBlur = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n \n // 如果失去焦点的元素不在编辑器内,不处理(避免影响外部输入框)\n if (!target || !editorRef.current || !editorRef.current.contains(target)) {\n return;\n }\n \n // 如果焦点仍在编辑器内部,不处理\n if (relatedTarget && editorRef.current.contains(relatedTarget)) {\n return;\n }\n \n // 延迟处理,避免立即影响焦点\n setTimeout(() => {\n if (!editorRef.current) return;\n \n // 如果是默认输入框状态,需要检查内容并更新按钮状态\n if (config.length === 0) {\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n setIsFormValid(textContent.length > 0);\n return;\n }\n \n updatePlaceholders(editorRef);\n checkExclusionStates(editorRef, config, files);\n validateRequiredFields(editorRef, config, files, setIsFormValid);\n }, 0);\n };\n \n // 在编辑器容器上绑定 blur 事件(使用捕获阶段,确保最早处理)\n editor.addEventListener('blur', handleEditorBlur, true);\n \n // 查找所有 multi-variable 输入框并直接绑定事件\n const bindBlurEvents = () => {\n if (!editorRef.current) return;\n \n // 先清理旧的事件监听器\n listeners.forEach((handler, element) => {\n element.removeEventListener('blur', handler, false);\n });\n listeners.clear();\n \n const multiVariableInputs = editorRef.current.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"][data-multi-key]'\n );\n \n const handleBlurEvent = (e: FocusEvent) => {\n // 立即阻止事件冒泡,避免影响外部输入框\n e.stopPropagation();\n e.stopImmediatePropagation();\n \n const target = e.target as HTMLElement;\n if (!target || !editorRef.current) return;\n \n // 严格检查:确保 target 在编辑器内部\n if (!editorRef.current.contains(target)) {\n return;\n }\n \n // 确保 target 就是 multi-variable 输入框本身或其子元素\n const variableChip = target.closest<HTMLElement>('[data-type=\"variable\"][data-multi-key]');\n if (!variableChip || !editorRef.current.contains(variableChip)) {\n return;\n }\n \n // 确保 variableChip 就是被绑定的元素之一\n let isBoundElement = false;\n listeners.forEach((_, element) => {\n if (element === variableChip || element.contains(target)) {\n isBoundElement = true;\n }\n });\n if (!isBoundElement) {\n return;\n }\n \n const multiKey = variableChip.dataset.multiKey;\n const currentKey = variableChip.dataset.key;\n const index = variableChip.dataset.index;\n \n if (!multiKey || !currentKey || index === undefined) return;\n \n // 检查是否真的失去了焦点\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n const isReallyBlurred = !relatedTarget || !editorRef.current.contains(relatedTarget);\n \n if (!isReallyBlurred) {\n return;\n }\n \n const content = variableChip.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n \n console.log('[Blur Event] 失去焦点的 multi-variable 输入框:', {\n multiKey,\n currentKey,\n index,\n content\n });\n \n // 支持多种分隔符:空格、顿号(、)、逗号(,)、中文逗号(,)\n const separatorRegex = /[、,,\\s]+/;\n \n if (separatorRegex.test(content)) {\n const parts = content.split(separatorRegex).map((p: string) => p.trim()).filter((p: string) => p.length > 0);\n \n console.log('[Blur Event] 拆分前的内容:', content);\n console.log('[Blur Event] 拆分后的部分:', parts);\n \n const maxCount = 9;\n const validParts = parts.slice(0, maxCount);\n \n console.log('[Blur Event] 有效的部分(最多9个):', validParts);\n \n if (validParts.length > 1) {\n const node = config.find(n => n.type === 'multi-variable' && n.key === multiKey);\n if (node) {\n const currentCount = multiVariableCounts[multiKey] || 1;\n const currentIndex = parseInt(index, 10);\n const maxAllowed = node.maxCount || 9;\n \n // 收集所有现有的值\n const allValues: string[] = [];\n for (let i = 0; i < currentCount; i++) {\n const key = `${multiKey}_${i}`;\n const el = editorRef.current.querySelector<HTMLElement>(\n `[data-type=\"variable\"][data-key=\"${key}\"][data-multi-key=\"${multiKey}\"]`\n );\n if (el) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n allValues.push(text);\n }\n }\n \n console.log('[Blur Event] 拆分前的所有值:', allValues);\n console.log('[Blur Event] 当前索引:', currentIndex);\n console.log('[Blur Event] 要插入的值:', validParts);\n \n allValues.splice(currentIndex, 1, ...validParts);\n \n const finalValues = allValues.slice(0, maxAllowed);\n \n console.log('[Blur Event] 拆分后的所有值:', finalValues);\n \n if (finalValues.length > 0 && finalValues[finalValues.length - 1] !== \"\") {\n if (finalValues.length < maxAllowed) {\n finalValues.push(\"\");\n }\n }\n const finalCount = Math.max(finalValues.length, 1);\n \n // 保存 variableValues\n const variableValues: Record<string, string> = {};\n finalValues.forEach((val, idx) => {\n if (val) {\n variableValues[`${multiKey}_${idx}`] = val;\n }\n });\n \n // 保存其他 variable 的值\n const allVariables = editorRef.current.querySelectorAll<HTMLElement>(\n '[data-type=\"variable\"]'\n );\n allVariables.forEach((el) => {\n const key = el.dataset.key;\n const elMultiKey = el.dataset.multiKey;\n if (key && elMultiKey !== multiKey) {\n const text = el.innerText.replace(/[\\u200B\\n]/g, \"\").trim();\n if (text) {\n variableValues[key] = text;\n }\n }\n });\n \n // 临时保存 variableValues\n (editorRef.current as HTMLDivElement & { __tempVariableValues?: Record<string, string> }).__tempVariableValues = variableValues;\n \n // 更新 multiVariableCounts\n setMultiVariableCounts(prev => ({\n ...prev,\n [multiKey]: finalCount\n }));\n }\n }\n }\n };\n \n // 为每个 multi-variable 输入框绑定 blur 事件(使用冒泡阶段,不是捕获阶段)\n multiVariableInputs.forEach((input) => {\n input.addEventListener('blur', handleBlurEvent, false);\n listeners.set(input, handleBlurEvent);\n });\n };\n \n // 延迟绑定,确保 DOM 已经渲染\n const timeoutId = setTimeout(() => {\n bindBlurEvents();\n }, 0);\n \n return () => {\n clearTimeout(timeoutId);\n // 清理编辑器容器的 blur 事件\n editor.removeEventListener('blur', handleEditorBlur, true);\n // 清理所有事件监听器\n listeners.forEach((handler, element) => {\n element.removeEventListener('blur', handler, false);\n });\n listeners.clear();\n };\n }, [config, multiVariableCounts, files]);\n \n\n /**\n * 处理键盘事件\n * @param e 键盘事件\n * @returns void\n */\n const handleKeyDown = (e: React.KeyboardEvent) => {\n // 如果禁用,阻止所有键盘操作\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n // 检查光标是否在 text 节点上,无论 lockStructure 是否为 true,都阻止\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n \n let textNode: HTMLElement | null = null;\n \n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n textNode = (anchor as HTMLElement).closest('[data-type=\"text\"]');\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n textNode = (anchor as Text).parentElement!.closest('[data-type=\"text\"]');\n }\n }\n \n // 如果光标在 text 节点上,阻止所有键盘操作\n if (textNode) {\n e.preventDefault();\n e.stopPropagation();\n // 将光标移动到最近的 variable 或 upload 节点\n if (editorRef.current) {\n const variableOrUpload = editorRef.current.querySelector<HTMLElement>(\n '[data-type=\"variable\"], [data-type=\"upload\"]'\n );\n if (variableOrUpload) {\n variableOrUpload.focus();\n }\n }\n return;\n }\n }\n\n // 如果锁定结构,检查光标是否在 tag 节点上\n if (lockStructure && selection && selection.rangeCount > 0) {\n const anchor = selection.anchorNode;\n let tagNode: HTMLElement | null = null;\n \n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n tagNode = (anchor as HTMLElement).closest('.tag-node');\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n tagNode = (anchor as Text).parentElement!.closest('.tag-node');\n }\n }\n \n // 如果光标在 tag 节点上,阻止所有键盘操作\n if (tagNode) {\n e.preventDefault();\n e.stopPropagation();\n // 将光标移动到最近的 variable 或 upload 节点\n if (editorRef.current) {\n const variableOrUpload = editorRef.current.querySelector<HTMLElement>(\n '[data-type=\"variable\"], [data-type=\"upload\"]'\n );\n if (variableOrUpload) {\n variableOrUpload.focus();\n }\n }\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n if (e.key === \"Escape\" && editorRef.current) {\n // 如果锁定结构,不允许清空内容\n if (lockStructure) {\n e.preventDefault();\n return;\n }\n editorRef.current.innerHTML = \"\";\n editorRef.current.focus();\n }\n\n // 保护 variable 芯片,不让 Backspace 把整个块删掉,但允许删除选中的内容\n if (e.key === \"Backspace\") {\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const anchor = selection.anchorNode;\n\n // 如果锁定结构,检查是否在 tag 或 text 节点中\n if (lockStructure) {\n let tagEl: HTMLElement | null = null;\n let textEl: HTMLElement | null = null;\n \n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n tagEl = (anchor as HTMLElement).closest('.tag-node');\n textEl = (anchor as HTMLElement).closest('[data-type=\"text\"]');\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n tagEl = (anchor as Text).parentElement!.closest('.tag-node');\n textEl = (anchor as Text).parentElement!.closest('[data-type=\"text\"]');\n }\n }\n\n // 如果在 tag 或 text 节点中,且光标在开头,阻止删除\n if ((tagEl || textEl) && range.collapsed && range.startOffset === 0) {\n e.preventDefault();\n return;\n }\n }\n\n let variableEl: HTMLElement | null = null;\n if (anchor) {\n if (anchor.nodeType === Node.ELEMENT_NODE) {\n variableEl = (anchor as HTMLElement).closest(\n '[data-type=\"variable\"]'\n );\n } else if (\n anchor.nodeType === Node.TEXT_NODE &&\n (anchor as Text).parentElement\n ) {\n variableEl = (anchor as Text).parentElement!.closest(\n '[data-type=\"variable\"]'\n );\n }\n }\n\n if (variableEl) {\n // 如果有选区(即不是光标状态),允许浏览器默认行为进行删除\n if (!range.collapsed) {\n return; \n }\n\n // 光标状态下的特殊处理\n const textContent = variableEl.innerText;\n // 检查是否只剩下零宽字符或者空字符串\n const isEffectiveEmpty = textContent === \"\\u200B\" || textContent === \"\";\n\n // 1. 已经是空的时候,禁止删除 variable 节点本身\n if (isEffectiveEmpty) {\n e.preventDefault();\n return;\n }\n // 2. 光标在最前面时,禁止删除(防止合并到上一个节点)\n if (range.startOffset === 0) {\n e.preventDefault();\n return;\n }\n // 3. 仅剩一个零宽字符且光标在它后面时,禁止删除\n if (\n textContent.startsWith(\"\\u200B\") &&\n range.startOffset === 1\n ) {\n e.preventDefault();\n return;\n }\n }\n }\n }\n };\n\n /**\n * 发送数据\n * 收集结构化数据 + 拼接 Prompt\n * @returns void\n */\n const handleSend = () => {\n if (isProcessing || disabled || loading || !isFormValid || !editorRef.current) return;\n\n // 如果是默认输入框状态(config 为空),直接传递文本内容\n if (config.length === 0) {\n const textContent = editorRef.current.textContent?.replace(/[\\u200B\\n]/g, \"\").trim() || \"\";\n if (!textContent) return;\n onSend(textContent, textContent);\n return;\n }\n\n const root = editorRef.current;\n let fullPrompt = \"\";\n const dataPayload: Record<string, unknown> = {};\n\n const traverse = (node: Node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if ((el.style as CSSStyleDeclaration).display === \"none\") return;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n fullPrompt += (node.textContent || \"\").replace(/\\u200B/g, \"\");\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const type = el.dataset.type;\n const key = el.dataset.key;\n\n if (type === \"variable\" && key) {\n // 获取文本内容,排除图标\n let textContent = \"\";\n const walker = document.createTreeWalker(\n el,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n // 排除图标内的文本节点\n const infoIcon = el.querySelector('.variable-info-icon');\n if (infoIcon && infoIcon.contains(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n );\n \n while (walker.nextNode()) {\n textContent += walker.currentNode.textContent || \"\";\n }\n \n const val = textContent.replace(/[\\u200B\\n]/g, \"\").trim();\n if (val) {\n const multiKey = el.dataset.multiKey;\n if (multiKey) {\n // multi-variable 类型:收集所有值到数组中\n if (!dataPayload[multiKey] || !Array.isArray(dataPayload[multiKey])) {\n dataPayload[multiKey] = [];\n }\n const currentArray = dataPayload[multiKey] as string[];\n currentArray.push(val);\n // 在 fullPrompt 中添加值,使用空格分隔(不用逗号)\n if (currentArray.length > 1) {\n fullPrompt += \" \";\n }\n fullPrompt += val;\n } else {\n // 普通 variable 类型\n dataPayload[key] = val;\n fullPrompt += val;\n }\n }\n } else if (type === \"select\" && key) {\n const selectEl = el as HTMLSelectElement;\n const val = (selectEl.value || \"\").trim();\n if (val) {\n dataPayload[key] = val;\n const selectedOption = selectEl.selectedOptions?.[0];\n fullPrompt += selectedOption?.textContent || val;\n }\n } else if (type === \"textarea\" && key) {\n const textareaEl = el as HTMLTextAreaElement;\n const val = (textareaEl.value || \"\").replace(/\\u200B/g, \"\").trim();\n if (val) {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n } else if (type === \"richtext\" && key) {\n const richEl = el as HTMLElement;\n const val = (richEl.textContent || \"\").replace(/\\u200B/g, \"\").trim();\n if (val) {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n } else if (type === \"datepicker\" && key) {\n const dpEl = el as HTMLElement;\n const val = (dpEl.getAttribute(\"data-value\") || \"\").trim();\n if (val) {\n // 如果包含逗号,尝试分割为数组\n if (val.includes(\",\")) {\n const parts = val.split(\",\");\n if (parts.length === 2) {\n dataPayload[key] = parts;\n fullPrompt += `[${parts[0]}, ${parts[1]}]`;\n } else {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n } else {\n dataPayload[key] = val;\n fullPrompt += val;\n }\n }\n } else if (type === \"upload\" && key) {\n dataPayload[key] = files[key] ?? null;\n if (files[key]) {\n fullPrompt += ` [附带文件: ${files[key]?.name}] `;\n }\n } else {\n if (el.classList.contains(\"tag-close-btn\")) return;\n if (el.classList.contains(\"file-remove-btn\")) return;\n\n if (\n el.getAttribute(\"contenteditable\") === \"false\" &&\n !type &&\n el.classList.contains(\"tag-node\")\n ) {\n fullPrompt += el.innerText;\n } else {\n el.childNodes.forEach(traverse);\n }\n }\n }\n };\n\n root.childNodes.forEach(traverse);\n fullPrompt = fullPrompt.trim();\n if (!fullPrompt) return;\n\n // 将数据转换为 FormData\n const formData = new FormData();\n \n // 添加 fullPrompt\n formData.append('fullPrompt', fullPrompt);\n \n // 遍历 dataPayload,将数据添加到 FormData\n Object.keys(dataPayload).forEach((key) => {\n const value = dataPayload[key];\n \n if (value === null || value === undefined) {\n return;\n }\n \n // 如果是文件对象\n if (value instanceof File) {\n formData.append(key, value);\n }\n // 如果是数组\n else if (Array.isArray(value)) {\n // 检查是否是 multi-variable 类型(通过检查 config 中是否有对应的 multi-variable 节点)\n const isMultiVariable = config.some(\n node => node.type === 'multi-variable' && node.key === key\n );\n \n if (isMultiVariable) {\n // multi-variable 类型:使用同一个 key 多次 append,形成多个值\n value.forEach((item) => {\n if (item !== null && item !== undefined && item !== '') {\n // 使用同一个 key,多次 append\n formData.append(key, String(item));\n }\n });\n } else {\n // 其他数组类型(如文件数组),使用 key[index] 格式\n value.forEach((item, index) => {\n if (item !== null && item !== undefined) {\n // 如果是文件数组\n if (item instanceof File) {\n formData.append(`${key}[${index}]`, item);\n }\n // 如果是字符串数组\n else if (typeof item === 'string') {\n formData.append(`${key}[${index}]`, item);\n }\n // 其他类型转为字符串\n else {\n formData.append(`${key}[${index}]`, String(item));\n }\n }\n });\n }\n }\n // 如果是字符串\n else if (typeof value === 'string') {\n formData.append(key, value);\n }\n // 其他类型转为字符串\n else {\n formData.append(key, String(value));\n }\n });\n \n\n onSend(formData, fullPrompt);\n };\n\n // 计算容器样式\n const containerStyle: React.CSSProperties = {\n ...(width ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(border ? { border } : {}),\n ...(background ? { background } : {}),\n };\n\n return (\n <div \n className=\"rich-text-editor\" \n style={containerStyle}\n data-disabled={disabled}\n >\n <div\n ref={editorRef}\n className={`rte-editor ${config.length === 0 ? 'rte-editor-default' : ''} ${isEmpty && placeholder ? 'rte-editor-empty' : ''}`}\n contentEditable={config.length === 0 ? true : false}\n suppressContentEditableWarning\n data-placeholder={placeholder}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onClick={handleEditorClick}\n onDoubleClick={handleDoubleClick}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n // 完全移除 onBlur,避免影响外部输入框\n // 使用 useLayoutEffect 中的事件监听器来处理 blur 事件\n />\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"rte-file-input\"\n accept=\".csv,.xlsx,.xls,.txt,.pdf,image/*\"\n onChange={handleFileChange}\n />\n\n <div className=\"rich-text-editor-footer\">\n <div className=\"rich-text-editor-footer-left\">\n <div className=\"rich-text-editor-brand\">\n <div className=\"rte-brand-badge\">\n <img src=\"https://oospublic.sealseek.cn/file/website/ball.png\" alt=\"\" />\n <span className=\"rte-brand-text\">SealSeek 1.0</span>\n </div>\n {hideButtons !== 'hideAgent' && (\n <Dropdown\n placement=\"top\"\n menu={{\n items: agentOptions.map((agent) => ({\n key: agent.key,\n label: (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {agent.icon && <i className={agent.icon} />}\n <span>{agent.label}</span>\n </div>\n ),\n onClick: () => {\n onAgentSelect?.(agent);\n },\n })),\n }}\n trigger={[\"click\"]}\n disabled={disabled || isProcessing}\n >\n <div className=\"rte-agent-badge\" style={{ cursor: agentOptions.length > 0 ? \"pointer\" : \"default\" }}>\n <i className=\"iconfont icon-zhinengti\" />\n <span className=\"rte-agent-text\">智能体</span>\n </div>\n </Dropdown>\n )}\n </div>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n {/* 显示 points */}\n {(() => {\n // 从 config 中找到第一个 tag 节点,获取 agent 的 label\n const tagNode = config.find(node => node.type === 'tag');\n if (!tagNode || !tagNode.text) return null;\n \n // 在 agentOptions 中找到对应的 agent\n const currentAgent = agentOptions.find(agent => agent.label === tagNode.text);\n // 只要有 points 就显示(可以是数字、字符串或其他类型)\n if (!currentAgent || currentAgent.points === undefined || currentAgent.points === null) {\n return null;\n }\n \n return (\n <div className=\"rte-points-badge\">\n <i className=\"iconfont icon-jifen\" style={{ marginRight:'4px'}}/>\n <span style={{fontSize:'16px'}}>-{String(currentAgent.points)}</span>\n </div>\n );\n })()}\n \n <button\n type=\"button\"\n onClick={handleSend}\n disabled={isProcessing || disabled || loading || !isFormValid}\n className=\"rich-text-editor-send-button\"\n >\n {(isProcessing || loading) ? (\n <span className=\"rte-send-spinner\" />\n ) : (<i className=\"iconfont icon-fasong\" />\n )}\n </button>\n </div>\n </div>\n\n {popoverVisible?.anchorEl && (() => {\n // 检查 anchorEl 是否还在 DOM 中\n if (!document.body.contains(popoverVisible.anchorEl)) {\n return null;\n }\n \n let tooltipContent: React.ReactNode = \"\";\n let overlayStyle: React.CSSProperties | undefined = {\n background: \"var(--neutral-800, #262626)\",\n };\n \n if (popoverVisible.type === 'upload') {\n const uploadNode = config.find(\n (n) => n.type === \"upload\" && n.key === popoverVisible.key\n );\n tooltipContent = uploadNode?.tooltip || \"\";\n } else if (popoverVisible.type === 'tag') {\n // 从 DOM 元素的 data-tooltip 属性获取\n const tooltip = popoverVisible.anchorEl.dataset.tooltip;\n tooltipContent = tooltip || \"\";\n } else if (popoverVisible.type === 'upload-label') {\n // 从 DOM 元素的 data-file-name 属性获取完整文件名\n const fileName = popoverVisible.anchorEl.dataset.fileName;\n tooltipContent = fileName || \"\";\n } else if (popoverVisible.type === 'variable') {\n // 从 DOM 元素的 data-tooltip 属性获取\n const tooltip = popoverVisible.anchorEl.dataset.tooltip;\n tooltipContent = tooltip || \"\";\n } else if (popoverVisible.type === 'upload-preview') {\n const file = files[popoverVisible.key];\n if (file && file.type && file.type.startsWith('image/')) {\n const url = URL.createObjectURL(file);\n tooltipContent = (\n <div style={{ width: 120, height: 120, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <img src={url} style={{ maxWidth: 120, maxHeight: 120, objectFit: \"contain\" }} />\n </div>\n );\n overlayStyle = {\n background: \"#fff\",\n padding: 4,\n };\n // 延迟释放对象 URL,避免内存泄漏\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } else {\n tooltipContent = \"\";\n }\n }\n \n if (!tooltipContent) return null;\n\n const titleColor = popoverVisible.type === 'upload-preview' ? '#0A0A0A' : '#fff';\n\n return createPortal(\n <Tooltip\n arrow={false}\n title={\n <div style={{ maxWidth: \"200px\", fontSize: \"12px\", color: titleColor }}>\n {tooltipContent}\n </div>\n }\n open={true}\n placement=\"top\"\n getPopupContainer={() => document.body}\n overlayInnerStyle={overlayStyle}\n >\n <div\n style={{\n position: \"fixed\",\n left: `${popoverVisible.anchorEl.getBoundingClientRect().left}px`,\n top: `${popoverVisible.anchorEl.getBoundingClientRect().top}px`,\n width: `${popoverVisible.anchorEl.offsetWidth}px`,\n height: `${popoverVisible.anchorEl.offsetHeight}px`,\n pointerEvents: \"none\",\n }}\n />\n </Tooltip>,\n document.body\n );\n })()}\n \n {/* 渲染 DatePicker Portals */}\n {datePickerPortals}\n </div>\n );\n};\n\n// 手动添加 docgen 信息\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<\n string,\n {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }\n >;\n};\n\ntype ComponentWithDocgen = React.FC<StructuredInputProps> & {\n __docgenInfo?: DocgenInfo;\n};\n\n(RichTextEditor as ComponentWithDocgen).__docgenInfo = {\n displayName: \"RichTextEditor\",\n description:\n \"结构化富文本输入组件,支持标签、变量输入块、文件上传以及互斥显示逻辑。\",\n props: {\n config: {\n name: \"config\",\n required: true,\n description: \"结构化输入配置节点数组\",\n type: { name: \"InputNode[]\", raw: \"InputNode[]\" },\n },\n onSend: {\n name: \"onSend\",\n required: true,\n description: \"点击发送按钮时的回调,返回数据与拼接后的 Prompt\",\n type: {\n name: \"function\",\n raw: \"(data: Record<string, any>, fullPrompt: string) => void\",\n },\n },\n isProcessing: {\n name: \"isProcessing\",\n required: false,\n description: \"是否处于处理状态(禁用输入与发送)\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" },\n },\n },\n};\n\nexport default RichTextEditor;","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFSSURBVHgB3ZTtccIwDIaVXv83I2SDZgSP0BHMBG0naEZhA2boBGQDswHdQJUOGRxjO0Z8HPDe6eJzJD2W4gjgEYSIn2xwK6EIFHqBGysJpMP3ZB0oRbEtmal1NtIxl4OWWsoxEsvqofJ0rgTNASOYq+7SXKDsuYvAcgkq/PWwBLQWqIfdjeRStaBUc4qzgLi9/BzJNmS/sh6bpvmrTfSFacU3scWy1mQryWdSnXiFE8QVUJINLTuyhWzzz/1OZmTN9hEckqtfUOwIGlGCpVRjE+94JFqpMtTeVzO8/UmPxpZU8Qa7aln8Tb9pfwla4WHWrjPvvbbnTBsX7PmLs83EDAH0BxSw1G31+/1FoDg/vPcXR+wocQS1apj4+P92FfhOoLyuBfYlmPgYnGoCjWADzAkzUyJ430awLmphPaxWQVU22BuuApPkHaanjcXSN3t6/QNjTMSJWDcs1QAAAABJRU5ErkJggg==\"","import { Select, Progress } from \"antd\";\nimport autoLoadIcon from \"../../assets/autoLoading.png\";\nimport React from \"react\";\n\ninterface LoadingProgress {\n currentPage: number;\n totalPages: number;\n percentage: number;\n}\n\ninterface AutoLoadControlProps {\n /** 自定义加载图标 */\n loadIcon?: React.ReactNode;\n /** 是否正在加载 */\n autoLoading: boolean;\n /** 批量加载页数 */\n batchSize: number;\n /** 加载进度信息 */\n loadingProgress?: LoadingProgress;\n /** 是否禁用自动加载 */\n disabled: boolean;\n /** 批量页数变更回调 */\n onBatchSizeChange: (size: number) => void;\n /** 加载下一页回调 */\n onLoadNextPage: () => void;\n /** 开始自动加载回调 */\n onStartAutoLoad: () => void;\n /** 停止加载回调 */\n onStopLoad: () => void;\n}\n\nconst BATCH_SIZE_OPTIONS = [\n { label: \"5页\", value: 5 },\n { label: \"10页\", value: 10 },\n { label: \"15页\", value: 15 },\n { label: \"30页\", value: 30 },\n];\n\nexport const AutoLoadControl = ({\n autoLoading,\n batchSize,\n loadingProgress,\n loadIcon,\n onBatchSizeChange,\n onLoadNextPage,\n onStartAutoLoad,\n onStopLoad,\n}: AutoLoadControlProps) => {\n if (autoLoading && loadingProgress) {\n return (\n <div className=\"auto_load_progress\">\n {loadIcon ? (\n loadIcon\n ) : (\n <img src={autoLoadIcon} alt=\"自动加载\" width={14} height={14} />\n )}\n <span>\n 正在加载第{loadingProgress.currentPage}/{loadingProgress.totalPages}页\n </span>\n <Progress\n percent={loadingProgress.percentage}\n type=\"line\"\n size={[160, 8]}\n />\n <span onClick={onStopLoad} className={\"auto_load_stop_btn\"}>\n 停止加载\n </span>\n </div>\n );\n }\n\n return (\n <div className={\"auto_load_container\"}>\n <div\n onClick={onLoadNextPage}\n className=\"auto_load_next_btn\"\n style={{\n backgroundColor: autoLoading ? \"#f5f5f5\" : \"#2563eb\",\n }}\n >\n 加载下一页\n </div>\n\n {/* 自动加载组合按钮:左侧触发区 + 右侧下拉选择器 */}\n <div\n className={\"right_control_wrap\"}\n style={{\n backgroundColor: autoLoading ? \"#f5f5f5\" : \"#2563eb\",\n }}\n >\n <div\n className={\"auto_load_btn\"}\n onClick={autoLoading ? undefined : onStartAutoLoad}\n >\n {loadIcon ? (\n loadIcon\n ) : (\n <img src={autoLoadIcon} alt=\"自动加载\" width={14} height={14} />\n )}\n <span>自动加载</span>\n </div>\n <Select\n value={batchSize}\n onChange={onBatchSizeChange}\n options={BATCH_SIZE_OPTIONS}\n disabled={autoLoading}\n size=\"small\"\n className=\"auto_load_select\"\n popupMatchSelectWidth={84}\n />\n </div>\n </div>\n );\n};\n\nexport default AutoLoadControl;\n","import { Pagination } from \"antd\";\nimport { InfoCircleOutlined } from \"@ant-design/icons\";\nimport { useMemo, useState } from \"react\";\nimport { AutoLoadControl } from \"./AutoLoadControl\";\nimport \"./index.css\";\n\nexport interface PaginationFooterProps {\n current: number;\n pageSize: number;\n total: number;\n loadedCount: number;\n cachedPages: number[];\n loadIcon?: React.ReactNode;\n loading: boolean;\n onChange: (page: number) => void;\n // 自动加载相关\n autoLoading?: boolean;\n loadingProgress?: {\n currentPage: number;\n totalPages: number;\n percentage: number;\n };\n onLoadNextPage?: () => void;\n onStartAutoLoad?: (loadNextPages: number[]) => void;\n onStopLoading?: () => void;\n}\n\nexport const PaginationFooter = ({\n current,\n loadIcon,\n pageSize,\n total,\n cachedPages,\n loadedCount,\n autoLoading = false,\n loadingProgress,\n onChange,\n onLoadNextPage,\n onStartAutoLoad,\n onStopLoading,\n}: PaginationFooterProps) => {\n const [batchSize, setBatchSize] = useState(5);\n const totalPages = Math.ceil(total / pageSize);\n\n const hideAutoLoadControl = useMemo(() => {\n return cachedPages.length >= totalPages;\n }, [cachedPages, totalPages]);\n\n // 计算下一次需要加载的页面数组\n const calculateNextPagesToLoad = () => {\n const unloadPages = Array.from(\n { length: totalPages },\n (_, i) => i + 1\n ).filter((page) => !cachedPages.includes(page));\n return unloadPages.slice(0, batchSize);\n };\n\n // 自定义分页器的itemRender,为未加载的页码添加右下角红点+灰色样式\n const itemRender = (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => {\n const isLoaded = cachedPages.includes(page);\n if (\n type === \"prev\" ||\n type === \"next\" ||\n type === \"jump-prev\" ||\n type === \"jump-next\"\n ) {\n return <div className=\"pageBox\">{originalElement}</div>;\n }\n return (\n <div\n className=\"pageBox\"\n style={{\n backgroundColor: current === page ? \"#2563EB\" : \"#f5f5f5\",\n color: current === page ? \"#fff\" : isLoaded ? \"#171717\" : \"#a3a3a3\",\n }}\n >\n {page}\n {!isLoaded && <span className=\"unload_spot\" />}\n </div>\n );\n };\n\n return (\n <div className={\"pagination_footer\"}>\n <div className=\"pagination_leftWrap\">\n {/* 已加载数据统计 - 始终显示 */}\n <span className={\"pagination_total\"}>\n <InfoCircleOutlined\n style={{ color: \"#2563EB\", marginRight: \"4px\" }}\n />\n 已加载: {loadedCount}/{total}条数据\n </span>\n\n {!hideAutoLoadControl && (\n <AutoLoadControl\n loadIcon={loadIcon ? loadIcon : undefined}\n autoLoading={autoLoading}\n batchSize={batchSize}\n loadingProgress={loadingProgress}\n disabled={!onLoadNextPage || !onStartAutoLoad}\n onBatchSizeChange={setBatchSize}\n onLoadNextPage={() => onLoadNextPage?.()}\n onStartAutoLoad={() => {\n const nextPages = calculateNextPagesToLoad();\n onStartAutoLoad?.(nextPages);\n }}\n onStopLoad={() => onStopLoading?.()}\n />\n )}\n </div>\n\n {/* 右侧:分页器(无快速跳转输入框) */}\n <Pagination\n current={current}\n pageSize={pageSize}\n total={total}\n onChange={(page) => onChange(page)}\n showSizeChanger={false}\n showQuickJumper={false}\n showTotal={(_, __) => \"\"}\n itemRender={itemRender}\n />\n </div>\n );\n};\n","import React, { useCallback, useRef } from \"react\";\nimport { Table } from \"antd\";\nimport type { TableProps } from \"antd\";\nimport { PaginationFooter } from \"./PaginationFooter\";\n\nexport interface VirtualTableProps<T> extends TableProps<T> {\n /*基础参数*/\n loading: boolean;\n total: number;\n current: number;\n pageSize: number;\n cachedPages: number[];\n dataSource: T[];\n onChangePage: (page: number) => void;\n /*自动加载*/\n autoLoading: boolean;\n loadingProgress: {\n percentage: number;\n currentPage: number;\n totalPages: number;\n };\n onLoadNextPage?: () => void;\n onStartAutoLoad?: (loadNextPages: number[]) => void;\n onStopLoading?: () => void;\n}\n\ntype DocgenInfo = {\n description?: string;\n displayName?: string;\n methods?: {\n name: string;\n description?: string;\n params?: {\n name: string;\n type: string;\n description?: string;\n }[];\n returns?: { type: string; description?: string };\n }[];\n props?: {\n [key: string]: {\n defaultValue?: any;\n description?: string;\n name: string;\n required?: boolean;\n type: { name: string; raw: string };\n };\n };\n};\n\ntype ComponentWithDocgen<T> = React.FC<VirtualTableProps<T>> & {\n __docgenInfo?: DocgenInfo;\n};\n\nexport const VirtualTable = <T,>(props: VirtualTableProps<T>) => {\n const {\n loading,\n autoLoading,\n loadingProgress,\n columns = [],\n dataSource = [],\n total,\n current,\n pageSize,\n cachedPages,\n onChangePage,\n onLoadNextPage,\n onStartAutoLoad,\n onStopLoading,\n ...restProps\n } = props;\n const tableRef = useRef<any>(null);\n\n const handleChangePage = useCallback(\n (page: number) => {\n onChangePage(page);\n if (!cachedPages.includes(page)) return;\n tableRef.current?.scrollTo({\n key: `${(page - 1) * pageSize + 1}`,\n });\n },\n [current]\n );\n\n return (\n <div className=\"flex flex-col\">\n <Table\n ref={tableRef}\n {...restProps}\n columns={columns}\n dataSource={dataSource}\n pagination={false}\n virtual\n />\n <PaginationFooter\n loading={loading}\n autoLoading={autoLoading}\n loadingProgress={loadingProgress}\n current={current}\n pageSize={pageSize}\n total={total}\n loadedCount={dataSource.length}\n cachedPages={cachedPages}\n onChange={handleChangePage}\n onLoadNextPage={onLoadNextPage}\n onStartAutoLoad={onStartAutoLoad}\n onStopLoading={onStopLoading}\n />\n </div>\n );\n};\n\n// VirtualTable组件的DocgenInfo,确保类型与默认值正确显示\n(VirtualTable as ComponentWithDocgen<any>).__docgenInfo = {\n displayName: \"VirtualTable\",\n description: \"虚拟滚动表格组件,支持分页、数据缓存和自动加载功能。\",\n props: {\n // 基础参数\n loading: {\n description: \"加载状态\",\n name: \"loading\",\n required: true,\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" },\n },\n total: {\n description: \"总数据条数\",\n name: \"total\",\n required: true,\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"0\" },\n },\n current: {\n description: \"当前页码\",\n name: \"current\",\n required: true,\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"1\" },\n },\n pageSize: {\n description: \"每页数据条数\",\n name: \"pageSize\",\n required: true,\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"10\" },\n },\n cachedPages: {\n description: \"已缓存的页码数组\",\n name: \"cachedPages\",\n required: true,\n type: { name: \"number[]\", raw: \"number[]\" },\n defaultValue: { value: \"[]\" },\n },\n dataSource: {\n description: \"数据源\",\n name: \"dataSource\",\n required: true,\n type: { name: \"Array<T>\", raw: \"Array<T>\" },\n defaultValue: { value: \"[]\" },\n },\n onChangePage: {\n description: \"页码变更回调函数\",\n name: \"onChangePage\",\n required: true,\n type: { name: \"function\", raw: \"function(page: number): void\" },\n defaultValue: { value: \"-\" },\n },\n // 自动加载相关\n autoLoading: {\n description: \"是否正在自动加载\",\n name: \"autoLoading\",\n required: true,\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" },\n },\n loadingProgress: {\n description: \"加载进度信息\",\n name: \"loadingProgress\",\n required: true,\n type: {\n name: \"object\",\n raw: \"{percentage: 0, currentPage: 1, totalPages: 5}\",\n },\n defaultValue: {\n value: \"-\",\n },\n },\n onLoadNextPage: {\n description: \"加载下一页回调函数\",\n name: \"onLoadNextPage\",\n required: false,\n type: { name: \"function\", raw: \"function(page: number): void\" },\n defaultValue: { value: \"-\" },\n },\n onStartAutoLoad: {\n description: \"开始自动加载回调函数\",\n name: \"onStartAutoLoad\",\n required: false,\n type: {\n name: \"function\",\n raw: \"function(loadNextPages: number[]): void\",\n },\n defaultValue: { value: \"-\" },\n },\n onStopLoading: {\n description: \"停止加载回调函数\",\n name: \"onStopLoading\",\n required: false,\n type: { name: \"function\", raw: \"function(): void\" },\n defaultValue: { value: \"-\" },\n },\n columns: {\n description: \"表格列配置\",\n name: \"columns\",\n required: true,\n type: { name: \"Array<object>\", raw: \"Array<object>\" },\n defaultValue: { value: \"[]\" },\n },\n },\n};\n\n// 添加默认导出\nexport default VirtualTable;\n","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Input } from \"antd\";\n\nexport interface DynamicInputProps {\n /** 动态展示的文案数组 */\n texts: string[];\n /** 输入框占位符 */\n placeholder?: string;\n /** 动画速度(毫秒) */\n animationSpeed?: number;\n /** 是否自动播放动画 */\n autoPlay?: boolean;\n /** 输入框值 */\n value?: string;\n /** 输入框变化回调 */\n onChange?: (value: string) => void;\n /** 其他 Input 属性 */\n [key: string]: unknown;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<DynamicInputProps> & { __docgenInfo?: DocgenInfo };\n\n/** 动态文案输入框组件,支持流式文字动画效果 */\nexport const DynamicInput: React.FC<DynamicInputProps> = ({\n texts = [],\n placeholder = \"请输入内容\",\n animationSpeed = 100,\n autoPlay = true,\n value,\n onChange,\n ...inputProps\n}) => {\n const [currentText, setCurrentText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [isTyping, setIsTyping] = useState(false);\n \n const animationRef = useRef<number | undefined>(undefined);\n const typingRef = useRef<number | undefined>(undefined);\n const textsRef = useRef(texts);\n const currentIndexRef = useRef(currentIndex);\n const isFocusedRef = useRef(isFocused);\n const currentTextRef = useRef(currentText);\n\n // 更新 refs\n useEffect(() => {\n textsRef.current = texts;\n currentIndexRef.current = currentIndex;\n isFocusedRef.current = isFocused;\n currentTextRef.current = currentText;\n });\n\n // 打字机效果\n const typeText = useCallback((text: string, callback?: () => void) => {\n let index = 0;\n setIsTyping(true);\n \n const typeChar = () => {\n if (index < text.length) {\n setCurrentText(text.slice(0, index + 1));\n index++;\n typingRef.current = window.setTimeout(typeChar, animationSpeed);\n } else {\n setIsTyping(false);\n callback?.();\n }\n };\n \n typeChar();\n }, [animationSpeed]);\n\n // 删除文字效果\n const deleteText = useCallback((callback?: () => void) => {\n let index = currentTextRef.current.length;\n \n const deleteChar = () => {\n if (index > 0) {\n setCurrentText(currentTextRef.current.slice(0, index - 1));\n index--;\n typingRef.current = window.setTimeout(deleteChar, animationSpeed / 2);\n } else {\n callback?.();\n }\n };\n \n deleteChar();\n }, [animationSpeed]);\n\n // 循环播放动画\n const playAnimation = useCallback(() => {\n if (textsRef.current.length === 0 || isFocusedRef.current) return;\n \n setIsAnimating(true);\n \n const currentTextItem = textsRef.current[currentIndexRef.current];\n \n // 如果当前有文字,先删除\n if (currentTextRef.current) {\n deleteText(() => {\n // 删除完成后,开始输入新文字\n typeText(currentTextItem, () => {\n // 输入完成后,等待一段时间再继续\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length);\n setIsAnimating(false);\n }, 2000);\n });\n });\n } else {\n // 直接输入新文字\n typeText(currentTextItem, () => {\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length);\n setIsAnimating(false);\n }, 2000);\n });\n }\n }, [deleteText, typeText]);\n\n // 开始动画\n useEffect(() => {\n if (autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n \n return () => {\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n };\n }, [currentIndex, isFocused, autoPlay, texts.length, playAnimation]);\n\n // 当索引变化时重新播放动画\n useEffect(() => {\n if (!isAnimating && autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n }, [currentIndex, isAnimating, autoPlay, texts.length, isFocused, playAnimation]);\n\n // 处理焦点事件\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true);\n // 清除所有动画\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n setIsAnimating(false);\n setIsTyping(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inputProps as any).onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false);\n // 如果输入框为空,重新开始动画\n if (!value && texts.length > 0) {\n setCurrentText(\"\");\n setCurrentIndex(0);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inputProps as any).onBlur?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inputProps as any).onChange?.(e);\n };\n\n // 获取显示的占位符文本\n const getPlaceholderText = () => {\n if (isFocused || value) {\n return placeholder;\n }\n return currentText || placeholder;\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <Input\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {...(inputProps as any)}\n value={value}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={getPlaceholderText()}\n style={{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(inputProps as any).style,\n position: \"relative\",\n zIndex: 1,\n }}\n />\n \n {/* 动态文字覆盖层 */}\n {!isFocused && !value && currentText && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n paddingLeft: 11,\n paddingRight: 11,\n color: \"#bfbfbf\",\n pointerEvents: \"none\",\n zIndex: 2,\n fontSize: 14,\n fontFamily: \"inherit\",\n }}\n >\n <span>{currentText}</span>\n {/* 光标效果 */}\n {isTyping && (\n <span\n style={{\n display: \"inline-block\",\n width: 1,\n height: \"1.2em\",\n backgroundColor: \"#1890ff\",\n marginLeft: 2,\n animation: \"blink 1s infinite\",\n }}\n />\n )}\n </div>\n )}\n \n {/* 添加光标闪烁动画 */}\n <style>\n {`\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `}\n </style>\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(DynamicInput as ComponentWithDocgen).__docgenInfo = {\n displayName: \"DynamicInput\",\n description: \"动态文案输入框组件,支持流式文字动画效果\",\n props: {\n texts: {\n name: \"texts\",\n required: true,\n description: \"动态展示的文案数组\",\n type: { name: \"string[]\", raw: \"string[]\" }\n },\n placeholder: {\n name: \"placeholder\",\n required: false,\n description: \"输入框占位符\",\n type: { name: \"string\", raw: \"string\" },\n defaultValue: { value: '\"请输入内容\"' }\n },\n animationSpeed: {\n name: \"animationSpeed\",\n required: false,\n description: \"动画速度(毫秒)\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"100\" }\n },\n autoPlay: {\n name: \"autoPlay\",\n required: false,\n description: \"是否自动播放动画\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n value: {\n name: \"value\",\n required: false,\n description: \"输入框值\",\n type: { name: \"string\", raw: \"string\" }\n },\n onChange: {\n name: \"onChange\",\n required: false,\n description: \"输入框变化回调\",\n type: { name: \"function\", raw: \"(value: string) => void\" }\n }\n }\n};","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport { Button } from \"antd\";\nimport { SendOutlined } from \"@ant-design/icons\";\n\n/**\n * DynamicTextArea 组件的属性接口\n * 支持受控和非受控两种模式,具有动态文案动画效果\n */\nexport interface DynamicTextAreaProps {\n /** 动态展示的文案数组,会循环播放打字机效果 */\n texts: string[];\n /** 输入框占位符文本 */\n placeholder?: string;\n /** 打字机动画的速度,单位毫秒,数值越小速度越快 */\n animationSpeed?: number;\n /** 是否自动播放动态文案动画 */\n autoPlay?: boolean;\n /** 输入框的值,用于受控模式 */\n value?: string;\n /** 输入框值变化时的回调函数,用于受控模式 */\n onChange?: (value: string) => void;\n /** 点击提交按钮时的回调函数 */\n onSubmit?: (value: string) => void;\n /** 最大输入字符数限制 */\n maxLength?: number;\n /** 是否在底部显示字数统计 */\n showCount?: boolean;\n /** 提交按钮的文本内容 */\n submitText?: string;\n /** 是否禁用整个组件 */\n disabled?: boolean;\n /** 文本域的行数,影响初始高度 */\n rows?: number;\n /** 自定义样式对象 */\n style?: React.CSSProperties;\n /** 其他原生 textarea 属性 */\n [key: string]: unknown;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<DynamicTextAreaProps> & { __docgenInfo?: DocgenInfo };\n\n/**\n * 动态文案文本域组件\n * \n * 功能特性:\n * 1. 支持受控和非受控两种模式\n * 2. 动态文案打字机效果,循环播放预设文案\n * 3. 内置提交按钮,位于文本框右下角\n * 4. 支持字数限制和字数统计显示\n * 5. 支持键盘快捷键提交(Ctrl+Enter 或 Cmd+Enter)\n * 6. 智能占位符显示,避免与动态文案重叠\n * \n * @param props - 组件属性\n * @returns JSX 元素\n */\nexport const DynamicTextArea: React.FC<DynamicTextAreaProps> = ({\n texts = [], // 动态文案数组,默认为空数组\n placeholder = \"请输入内容\", // 占位符文本\n animationSpeed = 100, // 打字机动画速度,毫秒\n autoPlay = true, // 是否自动播放动画\n value = \"\", // 受控模式的值\n onChange, // 受控模式的变化回调\n onSubmit, // 提交回调\n maxLength = 500, // 最大字符数限制\n showCount = true, // 是否显示字数统计\n submitText = \"发送\", // 提交按钮文本\n disabled = false, // 是否禁用组件\n rows = 4, // 文本域行数\n style, // 自定义样式\n ...otherProps // 其他原生属性\n}) => {\n // ==================== 状态管理 ====================\n \n /** 当前显示的动态文案内容 */\n const [currentText, setCurrentText] = useState(\"\");\n \n /** 当前播放的文案在数组中的索引 */\n const [currentIndex, setCurrentIndex] = useState(0);\n \n /** 是否正在播放动画(用于控制动画循环) */\n const [isAnimating, setIsAnimating] = useState(false);\n \n /** 文本域是否获得焦点 */\n const [isFocused, setIsFocused] = useState(false);\n \n /** 是否正在打字(用于显示光标效果) */\n const [isTyping, setIsTyping] = useState(false);\n \n /** 非受控模式下的内部状态值 */\n const [internalValue, setInternalValue] = useState(value || \"\");\n \n // ==================== Refs 引用 ====================\n \n /** 动画定时器引用,用于清除动画 */\n const animationRef = useRef<number | undefined>(undefined);\n \n /** 打字机效果定时器引用,用于清除打字动画 */\n const typingRef = useRef<number | undefined>(undefined);\n \n /** 文案数组的引用,避免闭包问题 */\n const textsRef = useRef(texts);\n \n /** 当前索引的引用,避免闭包问题 */\n const currentIndexRef = useRef(currentIndex);\n \n /** 焦点状态的引用,避免闭包问题 */\n const isFocusedRef = useRef(isFocused);\n \n /** 当前文案的引用,避免闭包问题 */\n const currentTextRef = useRef(currentText);\n \n /** 文本域 DOM 元素的引用 */\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // ==================== 副作用更新 ====================\n \n /**\n * 更新所有 refs 的值,确保在回调函数中能获取到最新的状态\n * 这是为了避免闭包陷阱,确保动画函数能访问到最新的状态值\n */\n useEffect(() => {\n textsRef.current = texts;\n currentIndexRef.current = currentIndex;\n isFocusedRef.current = isFocused;\n currentTextRef.current = currentText;\n });\n\n // ==================== 动画效果函数 ====================\n \n /**\n * 打字机效果函数\n * 逐字符显示文本,模拟真实的打字过程\n * \n * @param text - 要显示的完整文本\n * @param callback - 打字完成后的回调函数\n */\n const typeText = useCallback((text: string, callback?: () => void) => {\n let index = 0; // 当前显示的字符索引\n setIsTyping(true); // 开始打字状态,显示光标\n \n const typeChar = () => {\n if (index < text.length) {\n // 显示从开始到当前索引的字符\n setCurrentText(text.slice(0, index + 1));\n index++;\n // 设置定时器,继续下一个字符\n typingRef.current = window.setTimeout(typeChar, animationSpeed);\n } else {\n // 打字完成\n setIsTyping(false); // 隐藏光标\n callback?.(); // 执行完成回调\n }\n };\n \n typeChar(); // 开始打字\n }, [animationSpeed]);\n\n /**\n * 删除文字效果函数\n * 逐字符删除文本,模拟删除过程\n * \n * @param callback - 删除完成后的回调函数\n */\n const deleteText = useCallback((callback?: () => void) => {\n let index = currentTextRef.current.length; // 从最后一个字符开始删除\n \n const deleteChar = () => {\n if (index > 0) {\n // 删除一个字符\n setCurrentText(currentTextRef.current.slice(0, index - 1));\n index--;\n // 设置定时器,继续删除下一个字符(删除速度比打字快一倍)\n typingRef.current = window.setTimeout(deleteChar, animationSpeed / 2);\n } else {\n // 删除完成\n callback?.(); // 执行完成回调\n }\n };\n \n deleteChar(); // 开始删除\n }, [animationSpeed]);\n\n /**\n * 循环播放动画函数\n * 控制整个动画流程:删除当前文案 -> 输入新文案 -> 等待 -> 循环\n * \n * 动画流程:\n * 1. 检查是否有文案且未获得焦点\n * 2. 如果有当前文案,先删除\n * 3. 删除完成后,输入新的文案\n * 4. 输入完成后,等待2秒\n * 5. 切换到下一个文案,重新开始循环\n */\n const playAnimation = useCallback(() => {\n // 如果没有文案或已获得焦点,则不播放动画\n if (textsRef.current.length === 0 || isFocusedRef.current) return;\n \n setIsAnimating(true); // 标记正在播放动画\n \n const currentTextItem = textsRef.current[currentIndexRef.current]; // 获取当前要显示的文案\n \n // 如果当前有文案,先删除再输入新文案\n if (currentTextRef.current) {\n deleteText(() => {\n // 删除完成后的回调:开始输入新文案\n typeText(currentTextItem, () => {\n // 输入完成后的回调:等待2秒后切换到下一个文案\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length); // 循环到下一个文案\n setIsAnimating(false); // 标记动画结束\n }, 2000); // 等待2秒\n });\n });\n } else {\n // 如果当前没有文案,直接输入新文案\n typeText(currentTextItem, () => {\n animationRef.current = window.setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % textsRef.current.length); // 循环到下一个文案\n setIsAnimating(false); // 标记动画结束\n }, 2000); // 等待2秒\n });\n }\n }, [deleteText, typeText]);\n\n // 开始动画\n useEffect(() => {\n if (autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n \n return () => {\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n };\n }, [currentIndex, isFocused, autoPlay, texts.length, playAnimation]);\n\n // 当索引变化时重新播放动画\n useEffect(() => {\n if (!isAnimating && autoPlay && texts.length > 0 && !isFocused) {\n playAnimation();\n }\n }, [currentIndex, isAnimating, autoPlay, texts.length, isFocused, playAnimation]);\n\n // 处理焦点事件\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n // 清除所有动画\n if (animationRef.current) {\n window.clearTimeout(animationRef.current);\n }\n if (typingRef.current) {\n window.clearTimeout(typingRef.current);\n }\n setIsAnimating(false);\n setIsTyping(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n // 如果输入框为空,重新开始动画\n if (!value && texts.length > 0) {\n setCurrentText(\"\");\n setCurrentIndex(0);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onBlur?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n if (maxLength && newValue.length > maxLength) {\n return; // 超过最大长度时不更新\n }\n \n // 如果是受控模式,调用外部 onChange\n if (onChange) {\n onChange(newValue);\n } else {\n // 非受控模式,更新内部状态\n setInternalValue(newValue);\n }\n \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onChange?.(e);\n };\n\n const handleSubmit = () => {\n const currentValue = onChange ? value : internalValue;\n if (currentValue.trim() && !disabled) {\n onSubmit?.(currentValue);\n // 非受控模式下,提交后清空内部状态\n if (!onChange) {\n setInternalValue(\"\");\n }\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Ctrl+Enter 或 Cmd+Enter 提交\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (otherProps as any).onKeyDown?.(e);\n };\n\n const currentValue = onChange ? value : internalValue;\n const isSubmitDisabled = disabled || !currentValue.trim() || (maxLength ? currentValue.length > maxLength : false);\n\n return (\n <div style={{ position: \"relative\", ...style }}>\n <div style={{ position: \"relative\" }}>\n <textarea\n ref={textareaRef}\n value={onChange ? value : internalValue}\n onChange={handleChange}\n onFocus={(e) => {\n e.target.style.borderColor = \"#1890ff\";\n e.target.style.boxShadow = \"0 0 0 2px rgba(24, 144, 255, 0.2)\";\n handleFocus(e);\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"#d9d9d9\";\n e.target.style.boxShadow = \"none\";\n handleBlur(e);\n }}\n onKeyDown={handleKeyDown}\n placeholder={isFocused || currentValue ? placeholder : \"\"} // 只在聚焦或有值时显示 placeholder\n maxLength={maxLength}\n rows={rows}\n disabled={disabled}\n style={{\n width: \"100%\",\n minHeight: `${rows * 24 + 16}px`,\n padding: \"8px 60px 8px 12px\", // 右侧留出按钮空间\n border: \"1px solid #d9d9d9\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n fontFamily: \"inherit\",\n resize: \"vertical\",\n outline: \"none\",\n transition: \"border-color 0.3s, box-shadow 0.3s\",\n backgroundColor: \"#fff\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(otherProps as any).style,\n }}\n {...otherProps}\n />\n \n {/* 动态文字覆盖层 - 只在未聚焦且无值时显示 */}\n {!isFocused && !currentValue && currentText && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"flex-start\",\n paddingTop: 8,\n paddingLeft: 12,\n paddingRight: 12,\n color: \"#bfbfbf\",\n pointerEvents: \"none\",\n zIndex: 2,\n fontSize: 14,\n fontFamily: \"inherit\",\n lineHeight: \"1.5\",\n }}\n >\n <span>{currentText}</span>\n {/* 光标效果 */}\n {isTyping && (\n <span\n style={{\n display: \"inline-block\",\n width: 1,\n height: \"1.2em\",\n backgroundColor: \"#1890ff\",\n marginLeft: 2,\n animation: \"blink 1s infinite\",\n }}\n />\n )}\n </div>\n )}\n \n {/* 提交按钮 */}\n <div\n style={{\n position: \"absolute\",\n bottom: 8,\n right: 8,\n zIndex: 3,\n }}\n >\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<SendOutlined />}\n onClick={handleSubmit}\n disabled={isSubmitDisabled}\n style={{\n borderRadius: 6,\n minWidth: 32,\n height: 32,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {submitText}\n </Button>\n </div>\n </div>\n \n {/* 字数统计 */}\n {showCount && (\n <div\n style={{\n marginTop: 4,\n textAlign: \"right\",\n fontSize: \"12px\",\n color: \"#999\",\n }}\n >\n {currentValue.length}/{maxLength}\n </div>\n )}\n \n {/* 添加光标闪烁动画 */}\n <style>\n {`\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n `}\n </style>\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(DynamicTextArea as ComponentWithDocgen).__docgenInfo = {\n displayName: \"DynamicTextArea\",\n description: \"动态文案文本域组件,支持流式文字动画效果\",\n props: {\n texts: {\n name: \"texts\",\n required: true,\n description: \"动态展示的文案数组\",\n type: { name: \"string[]\", raw: \"string[]\" }\n },\n placeholder: {\n name: \"placeholder\",\n required: false,\n description: \"输入框占位符\",\n type: { name: \"string\", raw: \"string\" },\n defaultValue: { value: '\"请输入内容\"' }\n },\n animationSpeed: {\n name: \"animationSpeed\",\n required: false,\n description: \"动画速度(毫秒)\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"100\" }\n },\n autoPlay: {\n name: \"autoPlay\",\n required: false,\n description: \"是否自动播放动画\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n value: {\n name: \"value\",\n required: false,\n description: \"输入框值\",\n type: { name: \"string\", raw: \"string\" }\n },\n onChange: {\n name: \"onChange\",\n required: false,\n description: \"输入框变化回调\",\n type: { name: \"function\", raw: \"(value: string) => void\" }\n },\n onSubmit: {\n name: \"onSubmit\",\n required: false,\n description: \"提交回调\",\n type: { name: \"function\", raw: \"(value: string) => void\" }\n },\n maxLength: {\n name: \"maxLength\",\n required: false,\n description: \"最大输入字数\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"500\" }\n },\n showCount: {\n name: \"showCount\",\n required: false,\n description: \"是否显示字数统计\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n submitText: {\n name: \"submitText\",\n required: false,\n description: \"提交按钮文本\",\n type: { name: \"string\", raw: \"string\" },\n defaultValue: { value: '\"发送\"' }\n },\n disabled: {\n name: \"disabled\",\n required: false,\n description: \"是否禁用提交按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"false\" }\n },\n rows: {\n name: \"rows\",\n required: false,\n description: \"文本域行数\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"4\" }\n }\n }\n};","import React, { useRef, useState, useCallback } from \"react\";\nimport { Card as AntCard, type CardProps as AntCardProps } from \"antd\";\nimport { PlayCircleOutlined, PauseCircleOutlined } from \"@ant-design/icons\";\nimport \"./index.css\";\n\nexport interface VideoCardProps extends Omit<AntCardProps, 'title' | 'children'> {\n /** 视频源地址 */\n src: string;\n /** 视频海报图片 */\n poster?: string;\n /** 卡片宽度 */\n width?: number | string;\n /** 卡片高度 */\n height?: number | string;\n /** 视频宽度 */\n videoWidth?: number | string;\n /** 视频高度 */\n videoHeight?: number | string;\n /** 是否显示播放按钮 */\n showPlayButton?: boolean;\n /** 是否自动播放(鼠标悬浮时) */\n autoPlayOnHover?: boolean;\n /** 点击事件 */\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n /** 视频加载完成事件 */\n onVideoLoaded?: () => void;\n /** 视频播放事件 */\n onVideoPlay?: () => void;\n /** 视频暂停事件 */\n onVideoPause?: () => void;\n /** 视频结束事件 */\n onVideoEnded?: () => void;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<VideoCardProps> & { __docgenInfo?: DocgenInfo };\n\n/** 视频卡片组件,支持鼠标悬浮播放控制 */\nexport const VideoCard: React.FC<VideoCardProps> = ({\n src,\n poster,\n width = 300,\n height,\n videoWidth, // 参数保留但不使用,由CSS控制\n videoHeight, // 参数保留但不使用,由CSS控制\n showPlayButton = true,\n autoPlayOnHover = true,\n onClick,\n onVideoLoaded,\n onVideoPlay,\n onVideoPause,\n onVideoEnded,\n className,\n style,\n ...rest\n}) => {\n // 忽略videoWidth和videoHeight,video尺寸完全由CSS控制\n void videoWidth;\n void videoHeight;\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // 播放视频\n const playVideo = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.play();\n setIsPlaying(true);\n onVideoPlay?.();\n }\n }, [onVideoPlay]);\n\n // 暂停视频\n const pauseVideo = useCallback(() => {\n if (videoRef.current) {\n videoRef.current.pause();\n setIsPlaying(false);\n onVideoPause?.();\n }\n }, [onVideoPause]);\n\n // 切换播放状态\n const togglePlay = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (isPlaying) {\n pauseVideo();\n } else {\n playVideo();\n }\n }, [isPlaying, playVideo, pauseVideo]);\n\n // 鼠标进入\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n if (autoPlayOnHover && !isPlaying) {\n playVideo();\n }\n }, [autoPlayOnHover, isPlaying, playVideo]);\n\n // 鼠标离开\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n if (autoPlayOnHover && isPlaying) {\n pauseVideo();\n }\n }, [autoPlayOnHover, isPlaying, pauseVideo]);\n\n // 视频加载完成\n const handleVideoLoaded = useCallback(() => {\n setIsLoaded(true);\n onVideoLoaded?.();\n }, [onVideoLoaded]);\n\n // 视频播放事件\n const handleVideoPlay = useCallback(() => {\n setIsPlaying(true);\n onVideoPlay?.();\n }, [onVideoPlay]);\n\n // 视频暂停事件\n const handleVideoPause = useCallback(() => {\n setIsPlaying(false);\n onVideoPause?.();\n }, [onVideoPause]);\n\n // 视频结束事件\n const handleVideoEnded = useCallback(() => {\n setIsPlaying(false);\n onVideoEnded?.();\n }, [onVideoEnded]);\n\n // 卡片点击事件\n const handleCardClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n }, [onClick]);\n\n return (\n <AntCard\n {...rest}\n className={`video-card ${className || ''}`}\n style={{\n width,\n height,\n padding: 0,\n overflow: 'hidden',\n cursor: onClick ? 'pointer' : 'default',\n border: 'none',\n borderRadius: 0,\n ...style\n }}\n bordered={false}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleCardClick}\n >\n <div className=\"video-card-container\">\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n preload=\"metadata\"\n onLoadedData={handleVideoLoaded}\n onPlay={handleVideoPlay}\n onPause={handleVideoPause}\n onEnded={handleVideoEnded}\n muted={true}\n loop={true}\n />\n \n {/* 播放/暂停按钮 */}\n {showPlayButton && (\n <div \n className={`video-play-button ${isHovered ? 'hovered' : ''}`}\n onClick={togglePlay}\n >\n {isPlaying ? (\n <PauseCircleOutlined className=\"play-icon\" />\n ) : (\n <PlayCircleOutlined className=\"play-icon\" />\n )}\n </div>\n )}\n\n {/* 加载遮罩 */}\n {!isLoaded && (\n <div className=\"video-loading-mask\">\n <div className=\"loading-spinner\" />\n </div>\n )}\n </div>\n </AntCard>\n );\n};\n\n// 手动添加 docgen 信息\n(VideoCard as ComponentWithDocgen).__docgenInfo = {\n displayName: \"VideoCard\",\n description: \"视频卡片组件,支持鼠标悬浮播放控制\",\n props: {\n src: {\n name: \"src\",\n required: true,\n description: \"视频源地址\",\n type: { name: \"string\", raw: \"string\" }\n },\n poster: {\n name: \"poster\",\n required: false,\n description: \"视频海报图片\",\n type: { name: \"string\", raw: \"string\" }\n },\n width: {\n name: \"width\",\n required: false,\n description: \"卡片宽度\",\n type: { name: \"number | string\", raw: \"number | string\" },\n defaultValue: { value: \"300\" }\n },\n height: {\n name: \"height\",\n required: false,\n description: \"卡片高度\",\n type: { name: \"number | string\", raw: \"number | string\" }\n },\n videoWidth: {\n name: \"videoWidth\",\n required: false,\n description: \"视频宽度\",\n type: { name: \"number | string\", raw: \"number | string\" },\n defaultValue: { value: '\"100%\"' }\n },\n videoHeight: {\n name: \"videoHeight\",\n required: false,\n description: \"视频高度\",\n type: { name: \"number | string\", raw: \"number | string\" },\n defaultValue: { value: '\"100%\"' }\n },\n showPlayButton: {\n name: \"showPlayButton\",\n required: false,\n description: \"是否显示播放按钮\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n autoPlayOnHover: {\n name: \"autoPlayOnHover\",\n required: false,\n description: \"是否自动播放(鼠标悬浮时)\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击事件\",\n type: { name: \"function\", raw: \"(event: React.MouseEvent<HTMLDivElement>) => void\" }\n },\n onVideoLoaded: {\n name: \"onVideoLoaded\",\n required: false,\n description: \"视频加载完成事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n onVideoPlay: {\n name: \"onVideoPlay\",\n required: false,\n description: \"视频播放事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n onVideoPause: {\n name: \"onVideoPause\",\n required: false,\n description: \"视频暂停事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n onVideoEnded: {\n name: \"onVideoEnded\",\n required: false,\n description: \"视频结束事件\",\n type: { name: \"function\", raw: \"() => void\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义样式类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n style: {\n name: \"style\",\n required: false,\n description: \"自定义样式\",\n type: { name: \"CSSProperties\", raw: \"React.CSSProperties\" }\n }\n }\n};\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { VideoCard } from \"../VideoCard\";\nimport \"./index.css\";\n\nexport interface WaterfallItem {\n /** 媒体资源地址 */\n url: string;\n /** 媒体类型,不传则自动根据后缀判断 */\n type?: 'image' | 'video';\n /** 视频海报图(仅视频有效) */\n poster?: string;\n /** 唯一标识 */\n id?: string | number;\n /** 点击回调 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: (item: any) => void;\n /** 其他自定义数据 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport interface WaterfallProps {\n /** 媒体资源数组 */\n items: WaterfallItem[];\n /** 列数(默认会根据屏幕宽度自动响应) */\n columns?: number;\n /** 间隔大小 */\n gap?: number;\n /** 是否启用响应式布局 */\n responsive?: boolean;\n /** 响应式断点配置 */\n breakpoints?: {\n xs?: number; // < 576px\n sm?: number; // >= 576px\n md?: number; // >= 768px\n lg?: number; // >= 992px\n xl?: number; // >= 1200px\n xxl?: number; // >= 1600px\n };\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击回调 */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onClick?: (item: any) => void;\n}\n\ntype DocgenInfo = {\n displayName: string;\n description: string;\n props: Record<string, {\n name: string;\n required: boolean;\n description: string;\n type: { name: string; raw: string };\n defaultValue?: { value: string };\n }>;\n};\n\ntype ComponentWithDocgen = React.FC<WaterfallProps> & { __docgenInfo?: DocgenInfo };\n\n// 判断是否为视频 URL\nconst isVideoUrl = (url: string): boolean => {\n const videoExtensions = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.wmv', '.flv', '.mkv'];\n return videoExtensions.some(ext => url.toLowerCase().includes(ext));\n};\n\n// 获取媒体类型\nconst getMediaType = (item: WaterfallItem): 'image' | 'video' => {\n if (item.type) return item.type;\n if (isVideoUrl(item.url)) return 'video';\n return 'image';\n};\n\n/** 瀑布流布局组件,支持图片和视频混合展示 */\nexport const Waterfall: React.FC<WaterfallProps> = ({\n items,\n columns,\n gap = 0,\n responsive = true,\n breakpoints = {\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n xxl: 6\n },\n className,\n style,\n onClick\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [columnCount, setColumnCount] = useState<number>(columns || breakpoints.md || 3);\n const itemRefs = useRef<Map<string | number, HTMLDivElement>>(new Map());\n\n // 计算当前应该显示的列数\n const calculateColumns = useCallback(() => {\n if (!responsive || columns) {\n return columns || breakpoints.md || 3;\n }\n\n const width = window.innerWidth;\n \n if (width < 576) return breakpoints.xs || 1;\n if (width < 768) return breakpoints.sm || 2;\n if (width < 992) return breakpoints.md || 3;\n if (width < 1200) return breakpoints.lg || 4;\n if (width < 1600) return breakpoints.xl || 5;\n return breakpoints.xxl || 6;\n }, [responsive, columns, breakpoints]);\n\n // 布局计算\n const calculateLayout = useCallback(() => {\n if (!containerRef.current) return;\n\n const cols = columnCount;\n const container = containerRef.current;\n const containerWidth = container.offsetWidth;\n const columnWidth = (containerWidth - gap * (cols - 1)) / cols;\n \n // 初始化每列的高度\n const heights = new Array(cols).fill(0);\n\n // 为每个元素计算位置\n items.forEach((item, index) => {\n const key = item.id || index;\n const element = itemRefs.current.get(key);\n \n if (!element) return;\n\n // 找到最短的列\n const minHeight = Math.min(...heights);\n const columnIndex = heights.indexOf(minHeight);\n\n // 计算位置\n const left = columnIndex * (columnWidth + gap);\n const top = heights[columnIndex];\n\n // 设置元素位置和宽度\n element.style.position = 'absolute';\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n element.style.width = `${columnWidth}px`;\n\n // 更新列高度\n heights[columnIndex] += element.offsetHeight + gap;\n });\n\n // 设置容器高度\n const maxHeight = Math.max(...heights);\n container.style.height = `${maxHeight}px`;\n }, [items, columnCount, gap]);\n\n // 处理窗口大小变化\n useEffect(() => {\n const handleResize = () => {\n const newColumns = calculateColumns();\n if (newColumns !== columnCount) {\n setColumnCount(newColumns);\n }\n };\n\n if (responsive) {\n window.addEventListener('resize', handleResize);\n handleResize();\n \n return () => window.removeEventListener('resize', handleResize);\n }\n }, [responsive, calculateColumns, columnCount]);\n\n // 重新计算布局\n useEffect(() => {\n // 等待所有图片和视频加载完成后再计算布局\n const timer = setTimeout(() => {\n calculateLayout();\n }, 100);\n\n return () => clearTimeout(timer);\n }, [items, columnCount, calculateLayout]);\n\n // 图片加载完成后重新计算布局\n const handleImageLoad = useCallback(() => {\n calculateLayout();\n }, [calculateLayout]);\n\n // 处理项目点击\n const handleItemClick = useCallback((item: WaterfallItem) => {\n // 优先调用组件级别的 onClick\n if (onClick) {\n onClick(item);\n }\n // 然后调用 item 级别的 onClick\n item.onClick?.(item);\n }, [onClick]);\n\n return (\n <div\n ref={containerRef}\n className={`waterfall-container ${className || ''}`}\n style={{\n position: 'relative',\n width: '100%',\n ...style\n }}\n >\n {items.map((item, index) => {\n const key = item.id || index;\n const mediaType = getMediaType(item);\n\n return (\n <div\n key={key}\n ref={el => {\n if (el) {\n itemRefs.current.set(key, el);\n } else {\n itemRefs.current.delete(key);\n }\n }}\n className=\"waterfall-item\"\n >\n {mediaType === 'video' ? (\n <div style={{ \n width: '100%', \n position: 'relative', \n paddingBottom: '56.25%',\n cursor: (onClick || item.onClick) ? 'pointer' : 'default'\n }}>\n <div style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }}>\n <VideoCard\n src={item.url}\n poster={item.poster}\n width=\"100%\"\n height=\"100%\"\n onClick={() => handleItemClick(item)}\n onVideoLoaded={handleImageLoad}\n autoPlayOnHover={true}\n showPlayButton={false}\n />\n </div>\n </div>\n ) : (\n <div \n className=\"waterfall-image-wrapper\"\n onClick={() => handleItemClick(item)}\n style={{ cursor: (onClick || item.onClick) ? 'pointer' : 'default' }}\n >\n <img\n src={item.url}\n alt={`瀑布流图片 ${index + 1}`}\n className=\"waterfall-image\"\n onLoad={handleImageLoad}\n onError={handleImageLoad}\n style={{ display: 'block', width: '100%', height: 'auto' }}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\n// 手动添加 docgen 信息\n(Waterfall as ComponentWithDocgen).__docgenInfo = {\n displayName: \"Waterfall\",\n description: \"瀑布流布局组件,支持图片和视频混合展示\",\n props: {\n items: {\n name: \"items\",\n required: true,\n description: \"媒体资源数组\",\n type: { name: \"WaterfallItem[]\", raw: \"WaterfallItem[]\" }\n },\n columns: {\n name: \"columns\",\n required: false,\n description: \"列数(默认会根据屏幕宽度自动响应)\",\n type: { name: \"number\", raw: \"number\" }\n },\n gap: {\n name: \"gap\",\n required: false,\n description: \"间隔大小\",\n type: { name: \"number\", raw: \"number\" },\n defaultValue: { value: \"0\" }\n },\n responsive: {\n name: \"responsive\",\n required: false,\n description: \"是否启用响应式布局\",\n type: { name: \"boolean\", raw: \"boolean\" },\n defaultValue: { value: \"true\" }\n },\n breakpoints: {\n name: \"breakpoints\",\n required: false,\n description: \"响应式断点配置\",\n type: { name: \"object\", raw: \"{ xs?: number; sm?: number; md?: number; lg?: number; xl?: number; xxl?: number; }\" }\n },\n className: {\n name: \"className\",\n required: false,\n description: \"自定义类名\",\n type: { name: \"string\", raw: \"string\" }\n },\n style: {\n name: \"style\",\n required: false,\n description: \"自定义样式\",\n type: { name: \"CSSProperties\", raw: \"React.CSSProperties\" }\n },\n onClick: {\n name: \"onClick\",\n required: false,\n description: \"点击回调\",\n type: { name: \"function\", raw: \"(item: any) => void\" }\n }\n }\n};\n\n","import { theme } from 'antd';\n\n// 明亮主题配置\nexport const lightTheme = {\n algorithm: theme.defaultAlgorithm,\n token: {\n // 主色\n colorPrimary: '#3b82f6',\n colorSuccess: '#10b981',\n colorWarning: '#f59e0b',\n colorError: '#ef4444',\n colorInfo: '#3b82f6',\n \n // 背景色\n colorBgBase: '#ffffff',\n colorBgContainer: '#ffffff',\n colorBgElevated: '#ffffff',\n colorBgLayout: '#f8fafc',\n \n // 文字色\n colorTextBase: '#1e293b',\n colorText: '#1e293b',\n colorTextSecondary: '#64748b',\n colorTextTertiary: '#94a3b8',\n colorTextQuaternary: '#cbd5e1',\n \n // 边框色\n colorBorder: '#e2e8f0',\n colorBorderSecondary: '#f1f5f9',\n \n // 阴影\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n boxShadowSecondary: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n \n // 圆角\n borderRadius: 8,\n borderRadiusLG: 12,\n borderRadiusSM: 6,\n \n // 字体\n fontFamily: 'Inter, system-ui, Arial, sans-serif',\n fontSize: 14,\n fontSizeLG: 16,\n fontSizeSM: 12,\n \n // 间距\n padding: 16,\n paddingLG: 24,\n paddingSM: 12,\n paddingXS: 8,\n \n // 高度\n controlHeight: 32,\n controlHeightLG: 40,\n controlHeightSM: 24,\n },\n components: {\n Button: {\n borderRadius: 8,\n controlHeight: 32,\n fontWeight: 500,\n },\n Card: {\n borderRadiusLG: 12,\n boxShadow: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',\n },\n Input: {\n borderRadius: 8,\n controlHeight: 32,\n },\n Table: {\n borderRadiusLG: 8,\n headerBg: '#f8fafc',\n headerColor: '#374151',\n },\n },\n};\n\nexport default lightTheme;\n"],"names":["Button","variant","loading","children","rest","jsx","AntButton","Card","title","bordered","hoverable","size","AntCard","AppModal","showDefaultFooter","props","footer","_","OkBtn","CancelBtn","jsxs","Fragment","Modal","PageTable","scrollX","showPagination","defaultPageSize","Table","IconFont","createFromIconfontCN","XcIcon","name","color","style","iconStyle","EmptyAndSpin","description","className","emptyChildren","loadingText","emptyImage","Flex","Spin","Empty","BackButton","onClick","showText","type","LeftOutlined","LinkButton","removePadding","linkClassName","Option","Select","AdvancedTable","columns","request","searchFields","showSearch","showRefresh","pageSizeOptions","autoLoad","externalParams","tableProps","dataSource","setDataSource","useState","setLoading","pagination","setPagination","searchParams","setSearchParams","sortInfo","setSortInfo","form","Form","paginationRef","useRef","externalParamsRef","initializedRef","processedColumns","useMemo","col","sortable","render","restCol","value","loadData","useCallback","params","requestParams","response","prev","error","handleSearch","values","handleReset","handleRefresh","handleTableChange","_filters","sorter","newPagination","newSortInfo","useEffect","hasExternalParams","acc","field","Input","option","Space","SearchOutlined","ReloadOutlined","total","range","checkExclusionStates","editorRef","config","files","exclusionGroups","groupNodes","node","groupHasValue","groupName","groupNode","variableEl","hasSeparator","hasAnyValue","firstGroupWithValue","groupElements","el","validateRequiredFields","setIsFormValid","requiredFields","j","nextNode","mutuallyExclusiveGroups","separatorIndices","index","separatorIndex","beforeField","a","b","afterField","textContent","visibleRequiredFields","uploadEl","parent","multiVariableEls","firstEl","selectEl","textareaEl","richtextEl","dpEl","mutuallyExclusiveFieldKeys","group","nonExclusiveFields","allMutuallyExclusiveGroupsValid","visibleGroupFields","hasAnyValid","filledCount","need","allNonExclusiveFieldsValid","updatePlaceholders","forceActiveElement","rawText","initializeEditorContent","lockStructure","variableValues","multiVariableCounts","hideButtons","html","i","isNextUpload","isNextVariable","wrapperStart","wrapperEnd","requiredIconHtml","uploadNode","hasFile","fileObj","fileName","showRemoveBtn","showInfoIcon","hasFileClass","fileNameAttr","uploadIcon","uploadHtml","variableNode","initialText","isPlaceholder","displayText","placeholderClass","variableGroupAttr","tooltipAttr","variableHtml","groupAttr","nodeHtml","closeBtnHtml","lockedAttr","textWithBreak","savedValue","optionsHtml","opt","selected","placeholderOption","selectHtml","maxHeight","expandable","placeholderAttr","textareaHtml","toggleBtn","wrapper","minHeight","richContent","richHtml","container","limitRangeAttr","disableFutureAttr","pickerHost","maxCount","count","actualCount","wrapperGroupAttr","multiVariableHtml","idx","itemKey","useInitializeEditorContent","savedCursorRef","lockedMultiVariables","tempValues","key","text","val","initEditorContent","offset","targetVariable","walker","currentOffset","targetNode","targetOffset","nodeLength","selection","useUploadInfoTooltip","setPopoverVisible","editor","handleMouseOver","e","target","uploadChip","file","handleMouseOut","relatedTarget","related","useTagTooltip","handleMouseEnter","tooltip","handleMouseLeave","rafId","bindEvents","tagNode","useVariableTooltip","useUploadLabelTooltip","label","useExclusionAndValidation","timer","useSelectionControl","isDraggingRef","datePickerInteractionRef","isMouseDown","lastClickTime","isDatePickerTarget","handleMouseDown","handleMouseUp","isComposing","lastInputTime","handleCompositionStart","handleCompositionEnd","handleInput","handleFocusIn","handleSelectionChange","activeEl","anchor","isInDatePicker","variables","variable","newRange","currentEditor","t","module","this","n","r","s","u","o","c","f","h","d","l","$","y","M","m","v","g","D","p","S","w","O","k","require$$0","_typeof","toPrimitive","toPropertyKey","_defineProperty","ownKeys","_objectSpread2","defineProperty","commonLocale","locale","_objectSpread","CalendarLocale","TimePickerLocale","dayjs","RangePicker","DatePicker","DatePickerPortal","host","onChange","initialValueStr","placeholderStr","limitRange","disableFuture","dates","setDates","parts","hackValue","setHackValue","createPortal","current","str","open","zhCN","useDatePickerPortals","portals","setPortals","updatePortals","hosts","newPortals","event","observer","mutations","shouldUpdate","mutation","relevantChange","RichTextEditor","onSend","isProcessing","disabled","width","agentOptions","onAgentSelect","onAgentExit","placeholder","border","background","fileInputRef","setFiles","activeFileKey","setActiveFileKey","popoverVisible","mouseDownPosRef","isFormValid","isEmpty","setIsEmpty","setMultiVariableCounts","counts","agentStatesRef","filesRef","multiVariableCountsRef","getAgentId","prevConfigRef","pendingRestoreRef","prevAgentId","currentAgentId","savedState","useLayoutEffect","datePickerPortals","checkEmpty","uploads","hasContent","isEditorEmpty","handlePaste","multiKey","separatorRegex","currentIndex","currentCount","neededCount","allValues","finalValues","finalCount","elMultiKey","content","handleFileChange","handleRemoveFile","next","textNode","handleMouseMove","deltaX","deltaY","handleEditorClick","toggleRichtextFullscreenVisibility","hostEl","expanded","child","textareaToggle","textarea","requiredWrapper","richtextToggle","rich","isExpanded","removeBtn","handleDoubleClick","variableChip","startOffset","endOffset","chip","infoIcon","hasText","hasEmptyBox","hasEmptyInMiddle","emptyIndex","currentVariableEl","rangeBefore","newValues","lastIndex","lastKey","lastVariableEl","listeners","handleEditorBlur","bindBlurEvents","handler","element","multiVariableInputs","handleBlurEvent","isBoundElement","currentKey","validParts","maxAllowed","input","timeoutId","handleKeyDown","variableOrUpload","handleSend","tagEl","textEl","root","fullPrompt","dataPayload","traverse","currentArray","selectedOption","formData","item","containerStyle","Dropdown","agent","currentAgent","tooltipContent","overlayStyle","url","titleColor","Tooltip","autoLoadIcon","BATCH_SIZE_OPTIONS","AutoLoadControl","autoLoading","batchSize","loadingProgress","loadIcon","onBatchSizeChange","onLoadNextPage","onStartAutoLoad","onStopLoad","Progress","PaginationFooter","pageSize","cachedPages","loadedCount","onStopLoading","setBatchSize","totalPages","hideAutoLoadControl","calculateNextPagesToLoad","page","InfoCircleOutlined","nextPages","Pagination","__","originalElement","isLoaded","VirtualTable","onChangePage","restProps","tableRef","handleChangePage","DynamicInput","texts","animationSpeed","autoPlay","inputProps","currentText","setCurrentText","setCurrentIndex","isAnimating","setIsAnimating","isFocused","setIsFocused","isTyping","setIsTyping","animationRef","typingRef","textsRef","currentIndexRef","isFocusedRef","currentTextRef","typeText","callback","typeChar","deleteText","deleteChar","playAnimation","currentTextItem","DynamicTextArea","onSubmit","maxLength","showCount","submitText","rows","otherProps","internalValue","setInternalValue","textareaRef","handleFocus","handleBlur","handleChange","newValue","handleSubmit","currentValue","isSubmitDisabled","SendOutlined","VideoCard","src","poster","height","videoWidth","videoHeight","showPlayButton","autoPlayOnHover","onVideoLoaded","onVideoPlay","onVideoPause","onVideoEnded","videoRef","isPlaying","setIsPlaying","isHovered","setIsHovered","setIsLoaded","playVideo","pauseVideo","togglePlay","handleVideoLoaded","handleVideoPlay","handleVideoPause","handleVideoEnded","handleCardClick","PauseCircleOutlined","PlayCircleOutlined","isVideoUrl","ext","getMediaType","Waterfall","items","gap","responsive","breakpoints","containerRef","columnCount","setColumnCount","itemRefs","calculateColumns","calculateLayout","cols","columnWidth","heights","columnIndex","left","top","handleResize","newColumns","handleImageLoad","handleItemClick","mediaType","lightTheme","theme"],"mappings":"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","x_google_ignoreList":[14,15,16,17,18,19,20,21,22,23,24]}
|