@schemx/vant 0.1.11-alpha.20260616152026.eac77d3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/utils/index.ts","../src/components/Cell/index.vue","../src/components/Input/types.ts","../src/components/Input/index.vue","../src/renderers/InputRenderer/index.vue","../src/renderers/TextRenderer/index.vue","../src/renderers/TextAreaRenderer/index.vue","../src/renderers/CheckboxRenderer/index.vue","../src/renderers/CheckboxRenderer/index.ts","../src/renderers/DateRenderer/index.vue","../src/renderers/CalendarRenderer/index.vue","../src/renderers/NumberRenderer/index.vue","../src/renderers/PickerRenderer/index.vue","../src/renderers/PickerRenderer/index.ts","../src/renderers/RadioRenderer/index.vue","../src/renderers/RadioRenderer/index.ts","../src/renderers/RateRenderer/index.vue","../src/renderers/SliderRenderer/index.vue","../src/renderers/StepperRenderer/index.vue","../src/renderers/SwitchRenderer/index.vue","../src/renderers/UploadRenderer/index.vue","../../../node_modules/.pnpm/es-toolkit@1.47.0/node_modules/es-toolkit/dist/object/omitBy.mjs","../src/renderers/CascaderRenderer/index.vue","../src/renderers/SelectorRenderer/Selector.vue","../src/renderers/SelectorRenderer/index.vue","../src/renderers/SelectorRenderer/index.ts","../src/renderers/SelectPickerRenderer/index.vue","../src/renderers/SelectPickerRenderer/index.ts","../src/renderers/SensitiveInputRenderer/types.ts","../src/renderers/SensitiveInputRenderer/index.vue","../src/renderers/index.ts","../src/renderers/defaultRenderers.ts"],"sourcesContent":["/**\n * Vant 渲染器工具函数\n *\n * 提供渲染器组件中常用的属性提取、树形数据查找、文件名解析等工具。\n *\n * @module utils\n */\n\n/**\n * 从 attrs 对象中获取指定属性值,不存在时返回默认值。\n *\n * 用于从 Vue 组件的 `attrs` 中安全地提取透传属性,\n * 常见场景如获取 `align`、`rightIcon` 等 Vant Field 的配置。\n *\n * @param attrs - Vue 组件的 attrs 对象\n * @param key - 属性名\n * @param defaultValue - 默认值\n *\n * @returns 属性值或默认值\n *\n * @example\n * getFieldProps(attrs, \"align\", \"right\")\n * getFieldProps(attrs, \"rightIcon\", \"arrow\")\n */\nexport function getFieldProps<T extends Record<string, any>>(\n attrs: T,\n key: keyof T,\n defaultValue: T[typeof key] = undefined as T[typeof key]\n): T[typeof key] {\n return attrs?.[key] ?? defaultValue\n}\n\n/**\n * 判断值是否应按空值展示。\n */\nexport function isEmptyDisplayValue(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0)\n )\n}\n\n/**\n * 获取只读态展示值。\n *\n * 只在值为空时回退到 readonlyPlaceholder,保留 0、false 等有效值。\n */\nexport function getReadonlyDisplayValue<T>(\n value: T,\n readonlyPlaceholder = \"-\"\n): T | string {\n return isEmptyDisplayValue(value) ? readonlyPlaceholder : value\n}\n\nexport type RendererMode = \"editable\" | \"disabled\" | \"readonly\"\n\n/**\n * 解析渲染器当前呈现模式。\n *\n * disabled/readonly 仍会阻止交互。\n */\nexport function resolveRendererMode(options: {\n disabled?: boolean\n readonly?: boolean\n}): RendererMode {\n if (options.disabled) return \"disabled\"\n if (options.readonly) return \"readonly\"\n\n return \"editable\"\n}\n\n/**\n * 判断当前状态是否允许用户交互。\n */\nexport function isRendererInteractive(mode: RendererMode): boolean {\n return mode === \"editable\"\n}\n\n/**\n * 树形查找结果\n */\nexport interface FindTreeItemResult {\n /** 匹配节点 */\n node: Record<string, any> | null\n /** 从根到匹配节点的 label 路径 */\n labels: string[]\n /** 从根到匹配节点的 value 路径 */\n values: any[]\n}\n\n/**\n * 在树形数据中查找指定值的节点,返回匹配节点及其路径信息。\n *\n * 支持自定义字段名映射,适用于 Cascader、Picker 等树形选择组件。\n *\n * @param tree - 树形数据数组\n * @param targetValue - 要查找的目标值\n * @param options - 字段名配置\n * @param options.labelKey - label 字段名,默认 `\"label\"`\n * @param options.valueKey - value 字段名,默认 `\"value\"`\n * @param options.childrenKey - children 字段名,默认 `\"children\"`\n *\n * @returns 查找结果,包含匹配节点、label 路径和 value 路径\n *\n * @example\n * const result = findTreeItem(options, \"guangzhou\", {\n * labelKey: \"text\",\n * valueKey: \"value\",\n * childrenKey: \"children\",\n * })\n * // result.labels => [\"广东\", \"广州\"]\n * // result.values => [\"guangdong\", \"guangzhou\"]\n */\nexport function findTreeItem(\n tree: any[],\n targetValue: any,\n options: {\n labelKey?: string\n valueKey?: string\n childrenKey?: string\n } = {}\n): FindTreeItemResult {\n const { labelKey = \"label\", valueKey = \"value\", childrenKey = \"children\" } = options\n const result: FindTreeItemResult = { node: null, labels: [], values: [] }\n\n if (!Array.isArray(tree) || targetValue === undefined || targetValue === null) {\n return result\n }\n\n const search = (\n nodes: any[],\n labels: string[],\n values: any[]\n ): FindTreeItemResult | null => {\n for (const node of nodes) {\n const currentLabels = [...labels, node[labelKey]]\n const currentValues = [...values, node[valueKey]]\n\n if (node[valueKey] === targetValue) {\n return { node, labels: currentLabels, values: currentValues }\n }\n\n if (Array.isArray(node[childrenKey]) && node[childrenKey].length > 0) {\n const found = search(node[childrenKey], currentLabels, currentValues)\n\n if (found) return found\n }\n }\n\n return null\n }\n\n return search(tree, [], []) || result\n}\n\n/**\n * 从 URL 或文件路径中提取文件名。\n *\n * 去除查询参数和 hash 后,取最后一段路径作为文件名。\n * 用于上传组件中生成文件的唯一标识。\n *\n * @param url - 文件 URL 或路径\n *\n * @returns 文件名字符串,无法解析时返回原始输入或时间戳\n *\n * @example\n * getFileName(\"https://cdn.example.com/uploads/photo.jpg?t=123\")\n * // => \"photo.jpg\"\n *\n * getFileName(\"blob:http://localhost:3000/abc-def\")\n * // => \"abc-def\"\n */\nexport function getFileName(url: string | undefined | null): string {\n if (!url) return String(Date.now())\n\n try {\n const cleanUrl = url.split(\"?\")[0].split(\"#\")[0]\n const parts = cleanUrl.split(\"/\")\n const fileName = parts[parts.length - 1]\n\n return fileName || String(Date.now())\n } catch {\n return String(Date.now())\n }\n}\n","<script setup lang=\"ts\">\n /**\n * 单元格展示组件\n *\n * 统一处理 disabled、readonly 状态下的 Cell 展示,不依赖第三方 UI 组件。\n *\n * @module components/Cell\n */\n import { computed, useSlots } from \"vue\"\n\n import { isEmptyDisplayValue } from \"@/utils\"\n\n type CellAlign = \"left\" | \"right\" | \"center\"\n type CellAffixValue = string | number\n\n interface Props {\n value?: string | number | boolean\n placeholder?: string\n readonlyPlaceholder?: string\n disabled?: boolean\n readonly?: boolean\n isLink?: boolean\n align?: CellAlign | \"top\"\n className?: string\n customClass?: string\n prefix?: CellAffixValue\n suffix?: CellAffixValue\n }\n\n defineOptions({\n name: \"SchemxCell\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<Props>(), {\n value: \"\",\n placeholder: \"\",\n readonlyPlaceholder: \"-\",\n disabled: false,\n readonly: false,\n isLink: true,\n align: \"right\",\n className: \"\",\n customClass: \"\",\n prefix: \"\",\n suffix: \"\",\n })\n\n const emit = defineEmits<{\n click: [event?: MouseEvent]\n }>()\n\n const slots = useSlots()\n\n const isDisabled = computed(() => props.disabled)\n const isReadonly = computed(() => props.readonly)\n\n const isEditable = computed(() => !props.readonly && !props.disabled)\n\n const rootClass = computed(() => {\n return [\n \"schemx-cell\",\n props.className,\n isEditable.value && \"schemx-cell--clickable\",\n isDisabled.value && \"schemx-cell--disabled\",\n isReadonly.value && \"schemx-cell--readonly\",\n !props.value && \"schemx-cell--placeholder\",\n ]\n })\n\n const customClass = computed(() =>\n [\"schemx-cell__value\", `schemx-cell__value--${valueAlign.value}`, props.customClass]\n .filter(Boolean)\n .join(\" \")\n )\n\n const cellValue = computed(() => {\n if (isEmptyDisplayValue(props.value)) {\n return isReadonly.value ? props.readonlyPlaceholder : props.placeholder\n }\n\n return props.value.toString()\n })\n\n const valueAlign = computed<CellAlign>(() => {\n return props.align === \"top\" ? \"right\" : props.align\n })\n\n const hasPrefix = computed(\n () => Boolean(slots.prefix) || !isEmptyDisplayValue(props.prefix)\n )\n const hasSuffix = computed(\n () => Boolean(slots.suffix) || !isEmptyDisplayValue(props.suffix)\n )\n\n const handleClick = (event?: MouseEvent): void => {\n if (!isEditable.value) return\n\n emit(\"click\", event)\n }\n\n const handleKeydown = (event: KeyboardEvent): void => {\n if (event.key !== \"Enter\" && event.key !== \" \") return\n\n event.preventDefault()\n handleClick()\n }\n</script>\n\n<template>\n <div\n :class=\"rootClass\"\n :role=\"isEditable ? 'button' : undefined\"\n :tabindex=\"isEditable ? 0 : undefined\"\n :aria-disabled=\"!isEditable ? 'true' : undefined\"\n @click=\"handleClick\"\n @keydown=\"handleKeydown\"\n >\n <span v-if=\"hasPrefix\" class=\"schemx-cell__prefix\">\n <slot name=\"prefix\">{{ props.prefix }}</slot>\n </span>\n\n <span :class=\"customClass\">\n <slot>{{ cellValue }}</slot>\n </span>\n\n <span v-if=\"hasSuffix\" class=\"schemx-cell__suffix\">\n <slot name=\"suffix\">{{ props.suffix }}</slot>\n </span>\n\n <span\n v-if=\"isEditable && props.isLink\"\n class=\"schemx-cell__arrow\"\n aria-hidden=\"true\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n .schemx-cell {\n display: flex;\n align-items: center;\n gap: 6px;\n box-sizing: border-box;\n width: 100%;\n color: var(--schemx-cell-text-color, #323233);\n font-size: var(--schemx-cell-font-size, 14px);\n line-height: var(--schemx-cell-line-height, 24px);\n background: transparent;\n border: 0;\n outline: none;\n cursor: default;\n }\n\n .schemx-cell--clickable {\n cursor: pointer;\n }\n\n .schemx-cell--clickable:active {\n opacity: 0.72;\n }\n\n .schemx-cell--clickable:focus-visible {\n border-radius: 4px;\n outline: 2px solid var(--schemx-cell-focus-color, #1989fa);\n outline-offset: 2px;\n }\n\n .schemx-cell--disabled {\n color: var(--schemx-cell-disabled-color, #c8c9cc);\n cursor: not-allowed;\n }\n\n .schemx-cell--placeholder {\n color: var(--schemx-text-color-placeholder);\n }\n\n .schemx-cell__prefix,\n .schemx-cell__suffix {\n flex: none;\n color: inherit;\n }\n\n .schemx-cell__value {\n flex: 1 1 auto;\n min-width: 0;\n color: inherit;\n word-break: break-word;\n }\n\n .schemx-cell__value--left {\n text-align: left;\n }\n\n .schemx-cell__value--right {\n text-align: right;\n }\n\n .schemx-cell__value--center {\n text-align: center;\n }\n\n .schemx-cell__arrow {\n flex: none;\n width: 8px;\n height: 8px;\n border-top: 1px solid currentColor;\n border-right: 1px solid currentColor;\n color: var(--schemx-cell-arrow-color, #969799);\n transform: rotate(45deg);\n }\n</style>\n","/**\n * 输入组件类型定义\n *\n * @module components/Input/types\n */\n\nimport type { FieldProps, FieldAutosizeConfig } from \"vant\"\n\nimport type { SchemxBaseComponentProps } from \"@schemx/vue\"\n\nexport type InputValue = FieldProps[\"modelValue\"]\n\n/**\n * 输入组件 Props\n *\n * 定义输入组件的所有可配置属性。\n */\nexport interface SchemxInputProps\n extends\n Omit<SchemxBaseComponentProps, \"onChange\" | \"onBlur\" | \"value\" | \"onUpdate:value\"> {\n /** 当前值 */\n value?: InputValue\n /** 值变化回调 */\n onChange?: (value: string) => void\n /** 失焦回调 */\n onBlur?: (event: FocusEvent) => void\n /** 聚焦回调 */\n onFocus?: (event: FocusEvent) => void\n /** 输入类型 */\n type?: FieldProps[\"type\"]\n /** 是否只读 */\n readonly?: boolean\n /** 是否禁用 */\n disabled?: boolean\n /** 是否自动聚焦 */\n autofocus?: boolean\n /** 最大输入长度 */\n maxlength?: number | string\n /** 最小值(数字类型) */\n min?: number\n /** 最大值(数字类型) */\n max?: number\n /** 文本域默认行数 */\n rows?: number | string\n /** 文本域自适应高度配置 */\n autosize?: boolean | FieldAutosizeConfig\n /** 自定义格式化函数 */\n formatter?: FieldProps[\"formatter\"]\n /** 格式化触发时机 */\n formatTrigger?: FieldProps[\"formatTrigger\"]\n /** 是否可清除 */\n clearable?: FieldProps[\"clearable\"]\n /** 清除图标名称 */\n clearIcon?: FieldProps[\"clearIcon\"]\n /** 清除按钮触发方式 */\n clearTrigger?: FieldProps[\"clearTrigger\"]\n /** 左侧图标名称 */\n leftIcon?: FieldProps[\"leftIcon\"]\n /** 右侧图标名称 */\n rightIcon?: FieldProps[\"rightIcon\"]\n /** 是否显示字数统计 */\n showWordLimit?: FieldProps[\"showWordLimit\"]\n /** 自定义 CSS 类名 */\n className?: string\n /** 只读时的占位文本 */\n readonlyPlaceholder?: string\n /** 自动完成属性 */\n autocomplete?: string\n /** 自动大写属性 */\n autocapitalize?: string\n /** 自动纠正属性 */\n autocorrect?: string\n /** 回车键类型提示 */\n enterkeyhint?: FieldProps[\"enterkeyhint\"]\n /** 拼写检查 */\n spellcheck?: boolean | null\n /** 输入模式 */\n inputmode?: FieldProps[\"inputmode\"]\n /** 文本对齐方式 */\n align?: \"left\" | \"right\" | \"center\"\n}\n\n/** @deprecated 请使用 SchemxInputProps。 */\nexport type InputRendererProps = SchemxInputProps\n\n/**\n * 格式化数字输入\n *\n * @param value - 输入值\n * @param allowDot - 是否允许小数点\n * @param allowMinus - 是否允许负号\n * @returns 格式化后的值\n */\nexport function formatNumber(value: string, allowDot = true, allowMinus = true): string {\n if (allowDot) {\n value = value.replace(/[^-0-9.]/g, \"\")\n // 只保留第一个小数点\n const dotIndex = value.indexOf(\".\")\n\n if (dotIndex !== -1) {\n value = value.slice(0, dotIndex + 1) + value.slice(dotIndex + 1).replace(/\\./g, \"\")\n }\n } else {\n value = value.replace(/[^-0-9]/g, \"\")\n }\n\n if (allowMinus) {\n // 负号只能在开头\n const minusIndex = value.indexOf(\"-\")\n\n if (minusIndex > 0) {\n value = value.replace(/-/g, \"\")\n } else if (minusIndex === 0) {\n value = \"-\" + value.slice(1).replace(/-/g, \"\")\n }\n } else {\n value = value.replace(/-/g, \"\")\n }\n\n return value\n}\n\n/**\n * 获取字符串长度(考虑 emoji 等特殊字符)\n *\n * @param str - 字符串\n * @returns 字符串长度\n */\nexport function getStringLength(str: string): number {\n return [...String(str)].length\n}\n\n/**\n * 截取字符串\n *\n * @param str - 字符串\n * @param maxLength - 最大长度\n * @returns 截取后的字符串\n */\nexport function cutString(str: string, maxLength: number): string {\n return [...String(str)].slice(0, maxLength).join(\"\")\n}\n","<template>\n <div :class=\"classNames('schemx-input', props.className)\" @click=\"handleClickRoot\">\n <Field\n ref=\"fieldRef\"\n v-model=\"internalValue\"\n :type=\"fieldType\"\n :placeholder=\"computedPlaceholder\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :autofocus=\"props.autofocus\"\n :maxlength=\"props.maxlength\"\n :rows=\"props.rows !== undefined ? +props.rows : undefined\"\n :autosize=\"computedAutosize\"\n :formatter=\"fieldFormatter\"\n :format-trigger=\"props.formatTrigger\"\n :clearable=\"props.clearable\"\n :clear-icon=\"props.clearIcon\"\n :clear-trigger=\"props.clearTrigger\"\n :left-icon=\"props.leftIcon || ($slots['left-icon'] ? undefined : undefined)\"\n :right-icon=\"props.rightIcon || ($slots['right-icon'] ? undefined : undefined)\"\n :show-word-limit=\"props.showWordLimit\"\n :autocomplete=\"props.autocomplete\"\n :autocapitalize=\"props.autocapitalize\"\n :autocorrect=\"props.autocorrect\"\n :enterkeyhint=\"props.enterkeyhint\"\n :spellcheck=\"props.spellcheck ?? undefined\"\n :inputmode=\"computedInputmode\"\n :input-align=\"props.align\"\n @update:model-value=\"handleUpdateModelValue\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @clear=\"handleClear\"\n @keypress=\"handleKeypress\"\n @click-input=\"handleClickInput\"\n @click-left-icon=\"handleClickLeftIcon\"\n @click-right-icon=\"handleClickRightIcon\"\n >\n <template v-if=\"$slots['left-icon']\" #left-icon>\n <slot name=\"left-icon\" />\n </template>\n <template v-if=\"$slots['right-icon']\" #right-icon>\n <slot name=\"right-icon\" />\n </template>\n <template v-if=\"$slots.button\" #button>\n <slot name=\"button\" />\n </template>\n <template v-if=\"$slots.extra\" #extra>\n <slot name=\"extra\" />\n </template>\n </Field>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 输入组件 - 基于 Vant Field 实现\n *\n * @module components/Input\n */\n import { computed, ref, watch } from \"vue\"\n\n import { Field } from \"vant\"\n\n import classNames from \"classnames\"\n\n import { formatNumber } from \"./types\"\n\n import type { SchemxInputProps } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"SchemxInput\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<SchemxInputProps>(), {\n value: \"\",\n onChange: undefined,\n onBlur: undefined,\n onFocus: undefined,\n type: \"text\",\n placeholder: \"\",\n disabled: false,\n readonly: false,\n autofocus: false,\n maxlength: undefined,\n min: undefined,\n max: undefined,\n rows: undefined,\n autosize: false,\n formatter: undefined,\n formatTrigger: \"onChange\",\n clearable: false,\n clearIcon: \"clear\",\n clearTrigger: \"focus\",\n leftIcon: \"\",\n rightIcon: \"\",\n showWordLimit: false,\n autocomplete: undefined,\n autocapitalize: undefined,\n autocorrect: undefined,\n enterkeyhint: undefined,\n spellcheck: null,\n inputmode: undefined,\n align: \"left\",\n className: \"\",\n readonlyPlaceholder: \"-\",\n })\n\n const emit = defineEmits<{\n \"update:value\": [value: string]\n change: [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n clear: [event: TouchEvent | MouseEvent]\n keypress: [event: KeyboardEvent]\n \"click-input\": [event: MouseEvent]\n \"click-left-icon\": [event: MouseEvent | KeyboardEvent]\n \"click-right-icon\": [event: MouseEvent | KeyboardEvent]\n }>()\n\n const fieldRef = ref<InstanceType<typeof Field> | null>(null)\n\n /** 内部值 - 用于 v-model 绑定 */\n const internalValue = ref(String(props.value ?? \"\"))\n\n /** 计算 placeholder */\n const computedPlaceholder = computed(() => {\n if (props.readonly) {\n return props.readonlyPlaceholder\n }\n\n return props.placeholder || \"\"\n })\n\n /** 计算 Field 组件的 type */\n const fieldType = computed(() => {\n const { type } = props\n\n if (type === \"textarea\") {\n return \"textarea\"\n }\n\n if (type === \"password\") {\n return \"password\"\n }\n\n if (type === \"number\") {\n return \"number\"\n }\n\n if (type === \"digit\") {\n return \"digit\"\n }\n\n return \"text\"\n })\n\n /** 计算 inputmode */\n const computedInputmode = computed(() => {\n if (props.inputmode) return props.inputmode\n const { type } = props\n if (type === \"number\") return \"decimal\"\n if (type === \"digit\") return \"numeric\"\n\n return undefined\n })\n\n /** 计算 autosize 配置 */\n const computedAutosize = computed(() => {\n if (props.type !== \"textarea\") return false\n return props.autosize\n })\n\n /** Field 组件的 formatter */\n const fieldFormatter = computed(() => {\n // 对于 number/digit 类型,使用内置的格式化\n if (props.type === \"number\" || props.type === \"digit\") {\n const isNumber = props.type === \"number\"\n return (value: string) => formatNumber(value, isNumber, isNumber)\n }\n\n // 否则使用用户提供的 formatter\n return props.formatter\n })\n\n /** 处理值更新 */\n const handleUpdateModelValue = (value: string): void => {\n let processedValue = value\n\n // 数字类型在 blur 时处理 min/max,这里不处理\n // 由 handleBlur 统一处理\n\n props.onChange?.(processedValue)\n emit(\"update:value\", processedValue)\n emit(\"change\", processedValue)\n }\n\n /** 聚焦事件 */\n const handleFocus = (event: FocusEvent): void => {\n props.onFocus?.(event)\n emit(\"focus\", event)\n }\n\n /** 失焦事件 */\n const handleBlur = (event: FocusEvent): void => {\n // 数字类型在 blur 时处理 min/max\n if ((props.type === \"number\" || props.type === \"digit\") && internalValue.value !== \"\") {\n const { min, max } = props\n const numValue = parseFloat(internalValue.value)\n\n if (!isNaN(numValue)) {\n const clampedValue = Math.min(\n Math.max(numValue, min ?? -Infinity),\n max ?? Infinity\n )\n\n if (numValue !== clampedValue) {\n const stringValue = String(clampedValue)\n internalValue.value = stringValue\n props.onChange?.(stringValue)\n emit(\"update:value\", stringValue)\n emit(\"change\", stringValue)\n }\n }\n }\n\n props.onBlur?.(event)\n emit(\"blur\", event)\n }\n\n /** 键盘事件 */\n const handleKeypress = (event: KeyboardEvent): void => {\n emit(\"keypress\", event)\n }\n\n /** 点击输入框 */\n const handleClickInput = (event: MouseEvent): void => {\n emit(\"click-input\", event)\n }\n\n /** 点击左侧图标 */\n const handleClickLeftIcon = (event: MouseEvent | KeyboardEvent): void => {\n emit(\"click-left-icon\", event)\n }\n\n /** 点击右侧图标 */\n const handleClickRightIcon = (event: MouseEvent | KeyboardEvent): void => {\n emit(\"click-right-icon\", event)\n }\n\n /** 清除按钮点击 */\n const handleClear = (event: TouchEvent | MouseEvent): void => {\n props.onChange?.(\"\")\n emit(\"update:value\", \"\")\n emit(\"clear\", event)\n }\n\n /** 点击非交互展示区域时聚焦输入框 */\n const handleClickRoot = (event: MouseEvent): void => {\n if (props.disabled) return\n\n const target = event.target as Element\n\n if (!(target instanceof Element)) return\n\n const interactiveSelector = [\n \"input\",\n \"textarea\",\n \"button\",\n \"a\",\n \"select\",\n \"option\",\n \"label\",\n \"[role='button']\",\n \"[tabindex]\",\n \"[contenteditable='true']\",\n \".van-field__clear\",\n \".van-field__button\",\n \".van-field__left-icon\",\n \".van-field__right-icon\",\n ].join(\",\")\n\n if (target.closest(interactiveSelector)) return\n\n focus()\n }\n\n /** 聚焦方法 */\n const focus = (): void => {\n const input = fieldRef.value?.$el?.querySelector?.(\"input, textarea\") as\n | HTMLInputElement\n | HTMLTextAreaElement\n | null\n input?.focus?.()\n }\n\n /** 失焦方法 */\n const blur = (): void => {\n const input = fieldRef.value?.$el?.querySelector?.(\"input, textarea\") as\n | HTMLInputElement\n | HTMLTextAreaElement\n | null\n input?.blur?.()\n }\n\n defineExpose({\n focus,\n blur,\n get inputRef() {\n // Field 组件通过 ref 可以获取到 input 元素\n return fieldRef.value?.$el?.querySelector?.(\"input, textarea\") || null\n },\n })\n\n // 监听外部值变化,同步内部值\n watch(\n () => props.value,\n (newVal) => {\n const stringVal = String(newVal ?? \"\")\n if (stringVal !== internalValue.value) {\n internalValue.value = stringVal\n }\n }\n )\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-input-renderer', props.className]\">\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <SchemxInput v-else ref=\"inputRef\" v-bind=\"inputProps\" v-model:value=\"inputValue\">\n <template v-if=\"$slots['left-icon']\" #left-icon>\n <slot name=\"left-icon\" />\n </template>\n <template v-if=\"$slots['right-icon']\" #right-icon>\n <slot name=\"right-icon\" />\n </template>\n <template v-if=\"$slots.button\" #button>\n <slot name=\"button\" />\n </template>\n <template v-if=\"$slots.extra\" #extra>\n <slot name=\"extra\" />\n </template>\n </SchemxInput>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from \"vue\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import SchemxInput from \"@/components/Input\"\n\n import type { InputRendererProps, InputValue } from \"./types\"\n\n defineOptions({\n name: \"InputRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<InputRendererProps>(), {\n value: \"\",\n onChange: undefined,\n onBlur: undefined,\n onFocus: undefined,\n type: \"text\",\n placeholder: \"\",\n disabled: false,\n readonly: false,\n autofocus: false,\n maxlength: undefined,\n min: undefined,\n max: undefined,\n rows: undefined,\n autosize: false,\n formatter: undefined,\n formatTrigger: \"onChange\",\n clearable: false,\n clearIcon: \"clear\",\n clearTrigger: \"focus\",\n leftIcon: \"\",\n rightIcon: \"\",\n showWordLimit: false,\n autocomplete: undefined,\n autocapitalize: undefined,\n autocorrect: undefined,\n enterkeyhint: undefined,\n spellcheck: null,\n inputmode: undefined,\n align: \"left\",\n className: \"\",\n readonlyPlaceholder: \"-\",\n })\n\n const inputValue = defineModel<InputValue>(\"value\")\n const inputRef = ref<InstanceType<typeof SchemxInput> | null>(null)\n\n const modelValue = computed(() => String(inputValue.value ?? props.value ?? \"\"))\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const inputProps = computed(() => {\n const { value: _value, ...rest } = props\n\n return rest\n })\n\n defineExpose({\n focus: () => inputRef.value?.focus?.(),\n blur: () => inputRef.value?.blur?.(),\n })\n</script>\n","<template>\n <div\n :class=\"\n classNames('schemx-renderer', 'schemx-text-renderer', props.className, {\n 'schemx-renderer-readonly': readonly,\n 'schemx-renderer-disabled': disabled,\n })\n \"\n >\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"textValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <SchemxInput\n v-else\n ref=\"inputRef\"\n v-model:value=\"textValue\"\n :type=\"inputType\"\n :placeholder=\"props.placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n :align=\"props.align\"\n :maxlength=\"props.maxlength\"\n :min=\"props.min\"\n :max=\"props.max\"\n :formatter=\"props.formatter\"\n :format-trigger=\"props.formatTrigger\"\n :autocomplete=\"props.autocomplete\"\n :autofocus=\"props.autofocus\"\n :clearable=\"props.clearable\"\n :clear-icon=\"props.clearIcon\"\n :clear-trigger=\"props.clearTrigger\"\n :left-icon=\"props.leftIcon\"\n :right-icon=\"isPasswordMode || props.readonly ? '' : props.rightIcon\"\n :show-word-limit=\"props.showWordLimit && !props.readonly && !props.disabled\"\n @change=\"props.onChange\"\n @blur=\"props.onBlur\"\n @focus=\"props.onFocus\"\n >\n <template v-if=\"slots['left-icon']\" #left-icon>\n <slot name=\"left-icon\" />\n </template>\n\n <template #right-icon>\n <Icon\n v-if=\"isPasswordMode && !props.readonly\"\n :name=\"passwordIcon\"\n class=\"schemx-text-renderer__password-icon\"\n @click=\"handleTogglePassword\"\n />\n <slot v-else-if=\"slots['right-icon']\" name=\"right-icon\" />\n </template>\n\n <template v-if=\"slots.button\" #button>\n <slot name=\"button\" />\n </template>\n <template v-if=\"slots.extra\" #extra>\n <slot name=\"extra\" />\n </template>\n </SchemxInput>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 文本输入渲染器组件\n *\n * 基于 InputRenderer 实现,支持密码可见性切换。\n *\n * @module renderers/TextRenderer\n */\n import { computed, ref, useSlots } from \"vue\"\n\n import { Icon } from \"vant\"\n\n import classNames from \"classnames\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import SchemxInput from \"@/components/Input\"\n\n import type { TextRendererProps } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"TextRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<TextRendererProps>(), {\n className: \"\",\n placeholder: undefined,\n readonlyPlaceholder: \"-\",\n readonly: false,\n disabled: false,\n value: \"\",\n align: \"right\",\n clearable: false,\n clearIcon: \"clear\",\n clearTrigger: \"focus\",\n leftIcon: \"\",\n rightIcon: \"\",\n showWordLimit: false,\n })\n\n const textValue = defineModel<string>(\"value\")\n\n const slots = useSlots()\n\n const inputRef = ref<InstanceType<typeof SchemxInput> | null>(null)\n const passwordVisible = ref(false)\n\n /** 判断是否为密码模式 */\n const isPasswordMode = computed(() => props.type === \"password\")\n\n /** 计算实际的输入类型 */\n const inputType = computed(() => {\n if (isPasswordMode.value) {\n return passwordVisible.value ? \"text\" : \"password\"\n }\n\n return props.type || \"text\"\n })\n\n /** 密码可见性图标 */\n const passwordIcon = computed(() => {\n return passwordVisible.value ? \"eye-o\" : \"closed-eye\"\n })\n\n /** 切换密码可见性 */\n const handleTogglePassword = (): void => {\n passwordVisible.value = !passwordVisible.value\n }\n\n defineExpose({\n focus: () => inputRef.value?.focus?.(),\n blur: () => inputRef.value?.blur?.(),\n })\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-textarea-renderer', props.className]\">\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"textAreaValue\"\n :placeholder=\"props.placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <SchemxInput\n v-else\n ref=\"inputRef\"\n v-model:value=\"textAreaValue\"\n type=\"textarea\"\n :placeholder=\"props.placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n :align=\"props.align\"\n :rows=\"computedRows\"\n :autosize=\"computedAutosize\"\n :maxlength=\"props.maxlength\"\n :show-word-limit=\"props.showWordLimit && !props.readonly && !props.disabled\"\n @change=\"props.onChange\"\n @blur=\"props.onBlur\"\n @focus=\"props.onFocus\"\n >\n <template v-if=\"slots['left-icon']\" #left-icon>\n <slot name=\"left-icon\" />\n </template>\n <template v-if=\"slots['right-icon']\" #right-icon>\n <slot name=\"right-icon\" />\n </template>\n <template v-if=\"slots.button\" #button>\n <slot name=\"button\" />\n </template>\n <template v-if=\"slots.extra\" #extra>\n <slot name=\"extra\" />\n </template>\n </SchemxInput>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 文本域输入渲染器组件\n *\n * 基于 InputRenderer 实现,支持自适应高度。\n *\n * @module renderers/TextAreaRenderer\n */\n import { computed, ref, useSlots } from \"vue\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import SchemxInput from \"@/components/Input\"\n\n import type { TextAreaAutosize, TextAreaRendererProps } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"TextAreaRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<TextAreaRendererProps>(), {\n className: \"\",\n autosize: () => ({ minRows: 2, maxRows: 6 }),\n autoSize: undefined,\n rows: undefined,\n placeholder: undefined,\n readonlyPlaceholder: \"-\",\n readonly: false,\n disabled: false,\n value: \"\",\n onFocus: undefined,\n align: \"left\",\n showWordLimit: false,\n })\n\n const textAreaValue = defineModel<string>(\"value\")\n\n const slots = useSlots()\n\n const inputRef = ref<InstanceType<typeof SchemxInput> | null>(null)\n\n /** 兼容 autoSize 和 autosize */\n const computedAutosize = computed<boolean | TextAreaAutosize>(() => {\n return (props.autoSize ?? props.autosize ?? { minRows: 2, maxRows: 6 }) as\n | boolean\n | TextAreaAutosize\n })\n\n /** 计算行数 */\n const computedRows = computed(() => {\n if (props.rows !== undefined) {\n return props.rows\n }\n\n const autosize = computedAutosize.value\n\n if (typeof autosize === \"object\" && autosize.minRows) {\n return autosize.minRows\n }\n\n return 2\n })\n\n defineExpose({\n focus: () => inputRef.value?.focus?.(),\n blur: () => inputRef.value?.blur?.(),\n })\n</script>\n","<template>\n <div\n :class=\"[\n 'schemx-renderer',\n 'schemx-checkbox-renderer',\n className,\n { 'schemx-renderer-readonly': props.readonly },\n ]\"\n >\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"fieldValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n\n <CheckboxGroup\n v-else\n v-bind=\"checkProps\"\n :disabled=\"disabled\"\n :model-value=\"modelValue\"\n @update:model-value=\"handleChange\"\n >\n <Checkbox\n v-for=\"option in options\"\n :key=\"option[valueName]\"\n :name=\"option[valueName]\"\n :disabled=\"disabled || option[disabledName]\"\n v-bind=\"option\"\n >\n {{ option[labelName] }}\n </Checkbox>\n </CheckboxGroup>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 复选框渲染器组件\n *\n * 基于 Vant Checkbox 组件实现多选功能。\n *\n * @module renderers/CheckboxRenderer\n */\n import { computed, useAttrs } from \"vue\"\n\n import { Checkbox, CheckboxGroup } from \"vant\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { getFieldProps } from \"@/utils\"\n\n import type { CheckboxRendererProps, CheckboxValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"CheckboxRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<CheckboxRendererProps>(), {\n value: () => [],\n onChange: () => {},\n options: () => [],\n fieldNames: () => ({}),\n className: \"\",\n view: false,\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n })\n\n const attrs = useAttrs() as Record<string, any>\n\n const checkboxValue = defineModel<CheckboxValue>(\"value\")\n\n const labelName = computed(() => props.fieldNames?.label || \"label\")\n const valueName = computed(() => props.fieldNames?.value || \"value\")\n const disabledName = computed(() => props.fieldNames?.disabled || \"disabled\")\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const contentAlign = computed(() => getFieldProps(attrs, \"align\", \"right\"))\n\n const modelValue = computed(() => {\n const value = checkboxValue.value ?? props.value\n\n if (!value) return []\n\n return typeof value === \"string\" ? (value as string).split(\",\") : value\n })\n\n const fieldValue = computed(() => {\n return modelValue.value?.map((v: any) => getOption(v, labelName.value)).join(\"、\")\n })\n\n const checkProps = computed(() => {\n const { value, className, formItemProps, ...rest } = props\n\n const style = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px 12px\",\n justifyContent: contentAlign.value,\n ...(attrs?.style || {}),\n }\n\n return { ...attrs, ...rest, style }\n })\n\n const handleChange = (value: CheckboxValue): void => {\n if (props.readonly || props.disabled) return\n checkboxValue.value = value\n props.onChange?.(value)\n }\n\n /**\n * 获取选项的指定字段值\n */\n const getOption = (v: any, key: string): any => {\n const option = props.options.find((option) => option[valueName.value] === v)\n\n return option ? option[key] : v\n }\n</script>\n","/**\n * 复选框渲染器统一导出\n *\n * @module renderers/CheckboxRenderer\n */\nimport { WithRemoteOptions } from \"@schemx/vue\"\n\nimport CheckboxRendererComponent from \"./index.vue\"\n\nexport default WithRemoteOptions(CheckboxRendererComponent)\nexport type { CheckboxOption, CheckboxRendererProps, CheckboxValue } from \"./types\"\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-date-renderer', props.className]\">\n <SchemxCell\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n :content-align=\"align\"\n :value=\"fieldValue\"\n @click=\"handleClick\"\n />\n\n <Popup\n v-if=\"!props.readonly && !props.disabled\"\n v-model:show=\"showPicker\"\n :class=\"classNames('schemx-date-popup-renderer', props.popupClassName)\"\n v-bind=\"popupProps\"\n safe-area-inset-bottom\n >\n <DatePicker\n :model-value=\"modelValue\"\n v-bind=\"datePickerProps\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n />\n </Popup>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 日期选择渲染器组件\n *\n * 支持 date、time、datetime、dateTime 类型,\n * 使用 Vant DatePicker + Popup + Cell 组合实现。\n *\n * @module renderers/DateRenderer\n */\n import { computed, ref, useAttrs } from \"vue\"\n\n import { DatePicker, type FieldTextAlign, Popup } from \"vant\"\n\n import classNames from \"classnames\"\n import dayjs from \"dayjs\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { getFieldProps } from \"@/utils\"\n\n import type { DateRendererProps, DateValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"DateRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<DateRendererProps>(), {\n value: \"\",\n onConfirm: () => {},\n format: \"YYYY-MM-DD\",\n className: \"\",\n popupClassName: \"\",\n onChange: () => {},\n placeholder: undefined,\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n })\n\n const attrs = useAttrs()\n\n const dateValue = defineModel<DateValue>(\"value\")\n\n const showPicker = ref(false)\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const align = computed(\n () => getFieldProps(props, \"contentAlign\", \"right\") as FieldTextAlign\n )\n\n const title = computed(() => props.title || placeholder.value)\n\n const datePickerProps = computed(() => {\n const {\n value: _value,\n onChange: _onChange,\n onConfirm: _onConfirm,\n onClose: _onClose,\n format: _format,\n className: _className,\n popupClassName: _popupClassName,\n readonlyPlaceholder: _readonlyPlaceholder,\n contentAlign: _contentAlign,\n formItemProps: _formItemProps,\n popupProps: _popupProps,\n title: _title,\n ...rest\n } = props\n\n return { ...attrs, ...rest, title: title.value }\n })\n\n const popupProps = computed(() => ({\n round: true,\n position: \"bottom\" as const,\n safeAreaInsetBottom: true,\n teleport: \"body\",\n ...props.popupProps,\n }))\n\n /**\n * 获取值的函数\n *\n * 支持 String, Array, Date 三种类型。\n */\n const getValue = (value: string | string[] | Date | null | undefined): string => {\n if (!value) return \"\"\n\n let dateValue: dayjs.Dayjs\n\n if (typeof value === \"string\") {\n dateValue = dayjs(value)\n } else if (Array.isArray(value)) {\n if (value.length === 0) return \"\"\n dateValue = dayjs(value.join(\"-\"))\n } else if (value instanceof Date) {\n dateValue = dayjs(value)\n } else {\n dateValue = dayjs(value)\n }\n\n const formatStr = typeof props.format === \"string\" ? props.format : \"YYYY-MM-DD\"\n\n return dateValue.format(formatStr)\n }\n\n const fieldValue = computed(() => {\n return getValue(dateValue.value)\n })\n\n const modelValue = computed(() => {\n const value = getValue(dateValue.value) || new Date().toISOString()\n const dateParts = dayjs(value).format(\"YYYY-MM-DD\").split(\"-\")\n\n return dateParts\n })\n\n const handleConfirm = ({ selectedValues }: { selectedValues: string[] }): void => {\n const formattedValue = getValue(selectedValues)\n dateValue.value = formattedValue\n props.onConfirm?.(formattedValue)\n props.onChange?.(formattedValue)\n showPicker.value = false\n }\n\n const handleCancel = (): void => {\n showPicker.value = false\n }\n\n const handleClick = (): void => {\n if (props.readonly || props.disabled) return\n showPicker.value = true\n }\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-calendar-renderer', props.className]\">\n <SchemxCell\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"isReadonly\"\n :disabled=\"props.disabled\"\n :value=\"modelValue\"\n :content-align=\"align\"\n @click=\"handleClick\"\n />\n\n <Calendar\n v-if=\"!isReadonly && !props.disabled\"\n v-bind=\"calendarProps\"\n v-model:show=\"showCalendar\"\n @confirm=\"handleConfirm\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 日历选择器渲染器组件\n *\n * 使用 Vant Calendar + Cell 组合实现。\n *\n * @module renderers/CalendarRenderer\n */\n import { computed, ref, useAttrs } from \"vue\"\n\n import { Calendar } from \"vant\"\n import type { FieldTextAlign } from \"vant\"\n\n import classNames from \"classnames\"\n import dayjs from \"dayjs\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { getFieldProps } from \"@/utils\"\n\n import type { CalendarRendererProps, CalendarValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"CalendarRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<CalendarRendererProps>(), {\n value: \"\",\n onConfirm: () => {},\n className: \"\",\n placeholder: \"\",\n onChange: () => {},\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n type: \"single\",\n format: \"YYYY-MM-DD\",\n separator: \" - \",\n safeAreaInsetBottom: true,\n })\n\n const attrs = useAttrs()\n\n const calendarValue = defineModel<CalendarValue>(\"value\")\n\n const showCalendar = ref(false)\n\n const minSelectableDate = new Date(1970, 0, 1)\n const maxSelectableDate = dayjs().add(10, \"year\").toDate()\n\n const placeholder = computed(() => props?.placeholder || \"请选择\")\n\n const align = computed(\n () => getFieldProps(props, \"contentAlign\", \"right\") as FieldTextAlign\n )\n\n const title = computed(() => props.title || placeholder.value)\n const isReadonly = computed(() => props.readonly || Boolean(props.view))\n\n // 剔除 Schemx 契约字段,避免内部事件和表单元信息透传给 Vant 组件。\n const calendarProps = computed(() => {\n const {\n value: _value,\n onChange: _onChange,\n onConfirm: _onConfirm,\n className: _className,\n popupClassName: _popupClassName,\n format: _format,\n separator: _separator,\n contentAlign: _contentAlign,\n type: _type,\n formItemProps: _formItemProps,\n minDate = minSelectableDate,\n maxDate = maxSelectableDate,\n ...rest\n } = props\n\n return {\n ...attrs,\n ...rest,\n class: classNames(\"schemx-calendar-popup-renderer\", props.popupClassName),\n minDate,\n maxDate,\n safeAreaInsetBottom: true,\n teleport: \"body\",\n title: title.value,\n }\n })\n\n const modelValue = computed(() => {\n const value = getValue(calendarValue.value)\n\n return Array.isArray(value) ? value.join(props.separator) : value\n })\n\n /**\n * 获取值的函数\n *\n * 支持 String, Array, Date 三种类型。\n */\n const getValue = (value: CalendarValue | null | undefined): string | string[] => {\n if (!value) return \"\"\n\n if (Array.isArray(value)) {\n return value.map((i) => dayjs(i).format(props.format))\n } else {\n return dayjs(value).format(props.format)\n }\n }\n\n const handleConfirm = (date: Date | Date[]): void => {\n if (isReadonly.value || props.disabled) return\n\n const value = getValue(date as any)\n\n calendarValue.value = date\n props.onConfirm?.(value)\n props.onChange?.(value)\n showCalendar.value = false\n }\n\n const handleClick = (): void => {\n if (isReadonly.value || props.disabled) return\n showCalendar.value = true\n }\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-number-renderer', props.className]\">\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"numberValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <SchemxInput\n v-else\n ref=\"inputRef\"\n v-model:value=\"numberValue\"\n :type=\"props.type\"\n :placeholder=\"props.placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n :align=\"props.align\"\n :min=\"props.min\"\n :max=\"props.max\"\n :maxlength=\"props.maxlength\"\n :clearable=\"props.clearable\"\n @change=\"handleChange\"\n @blur=\"props.onBlur\"\n @focus=\"props.onFocus\"\n >\n <template v-if=\"slots['left-icon']\" #left-icon>\n <slot name=\"left-icon\" />\n </template>\n <template v-if=\"slots['right-icon']\" #right-icon>\n <slot name=\"right-icon\" />\n </template>\n <template v-if=\"slots.button\" #button>\n <slot name=\"button\" />\n </template>\n <template v-if=\"slots.extra\" #extra>\n <slot name=\"extra\" />\n </template>\n </SchemxInput>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 数字输入渲染器组件\n *\n * 支持 number、digit 类型,基于 InputRenderer 实现。\n *\n * @module renderers/NumberRenderer\n */\n import { computed, ref, useSlots } from \"vue\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import SchemxInput from \"@/components/Input\"\n\n import type { NumberRendererProps, NumberValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"NumberRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<NumberRendererProps>(), {\n className: \"\",\n type: \"number\",\n placeholder: undefined,\n readonlyPlaceholder: \"-\",\n readonly: false,\n disabled: false,\n value: \"\",\n align: \"right\",\n clearable: false,\n min: undefined,\n max: undefined,\n })\n\n const slots = useSlots()\n\n const numberValue = defineModel<NumberValue>(\"value\")\n\n const inputRef = ref<InstanceType<typeof SchemxInput> | null>(null)\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n /**\n * 处理值变化\n *\n * 保持字符串形式,让 InputRenderer 处理格式化。\n */\n const handleChange = (value: string): void => {\n if (value === \"\" || value === null || value === undefined) {\n numberValue.value = \"\"\n props.onChange?.(\"\")\n\n return\n }\n\n numberValue.value = value\n props.onChange?.(value)\n }\n\n defineExpose({\n focus: () => (inputRef.value as any)?.focus?.(),\n blur: () => (inputRef.value as any)?.blur?.(),\n })\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-picker-renderer', props.className]\">\n <SchemxCell\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n :value=\"fieldValue\"\n @click=\"handleClick\"\n />\n\n <Popup\n v-if=\"!props.readonly && !props.disabled\"\n v-model:show=\"showPicker\"\n :class=\"classNames('schemx-picker-popup-renderer', props.popupClassName)\"\n v-bind=\"popupProps\"\n safe-area-inset-bottom\n >\n <Picker\n :model-value=\"modelValue\"\n :columns=\"columns\"\n :columns-field-names=\"fieldNames\"\n v-bind=\"pickerProps\"\n @confirm=\"handleConfirm\"\n @cancel=\"handleCancel\"\n >\n <template #empty>\n <div class=\"schemx-picker-empty\">No data</div>\n </template>\n </Picker>\n </Popup>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 选择渲染器组件\n *\n * 使用 Vant Picker + Popup + Cell 组合实现。\n *\n * @module renderers/PickerRenderer\n */\n import { computed, ref, useAttrs } from \"vue\"\n\n import { Picker, Popup } from \"vant\"\n import type { PickerConfirmEventParams } from \"vant\"\n\n import classNames from \"classnames\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { findTreeItem } from \"@/utils\"\n\n import type { PickerFieldNames, PickerRendererProps, PickerValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"PickerRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<PickerRendererProps>(), {\n separator: \" - \",\n value: undefined,\n showAllLevels: false,\n emitPath: false,\n onConfirm: () => {},\n className: \"\",\n popupClassName: \"\",\n onChange: () => {},\n readonlyPlaceholder: \"-\",\n readonly: false,\n disabled: false,\n title: \"\",\n options: () => [],\n fieldNames: () => ({ text: \"text\", value: \"value\", children: \"children\" }),\n })\n\n const attrs = useAttrs()\n\n const pickerValue = defineModel<PickerValue>(\"value\")\n\n const showPicker = ref(false)\n\n const placeholder = computed(() => props?.placeholder || \"请选择\")\n\n const title = computed(() => props.title || placeholder.value)\n\n const pickerProps = computed(() => {\n const {\n value: _value,\n onChange: _onChange,\n onConfirm: _onConfirm,\n className: _className,\n popupClassName: _popupClassName,\n readonlyPlaceholder: _readonlyPlaceholder,\n separator: _separator,\n showAllLevels: _showAllLevels,\n emitPath: _emitPath,\n options: _options,\n columns: _columns,\n columnsFieldNames: _columnsFieldNames,\n fieldNames: _fieldNames,\n contentAlign: _contentAlign,\n formItemProps: _formItemProps,\n popupProps: _popupProps,\n title: _title,\n ...rest\n } = props\n\n return { ...attrs, ...rest, title: title.value }\n })\n\n const popupProps = computed(() => ({\n round: true,\n position: \"bottom\" as const,\n safeAreaInsetBottom: true,\n teleport: \"body\",\n ...props.popupProps,\n }))\n\n /** 数据源 */\n const columns = computed(() => {\n if (Array.isArray(props.options) && props.options?.length > 0) {\n return props.options\n }\n\n return props?.columns || []\n })\n\n /** 获取字段名 */\n const fieldNames = computed<PickerFieldNames>(\n () => props?.columnsFieldNames || props?.fieldNames\n )\n\n /** 获取字段值 */\n const fieldValue = computed(() => {\n const result = findTreeItem(columns.value, pickerValue.value, {\n labelKey: fieldNames.value?.text,\n valueKey: fieldNames.value?.value,\n childrenKey: fieldNames.value?.children,\n })\n\n const label = props.showAllLevels ? result?.labels : result?.labels.slice(-1)\n\n return result.labels.length\n ? label?.join(props.separator)\n : pickerValue.value?.toString()\n })\n\n const modelValue = computed(() => {\n if (\n pickerValue.value === undefined ||\n pickerValue.value === null ||\n pickerValue.value === \"\"\n ) {\n return []\n }\n\n return Array.isArray(pickerValue.value) ? pickerValue.value : [pickerValue.value]\n })\n\n /** 处理确认 */\n const handleConfirm = (values: PickerConfirmEventParams): void => {\n const value = props.emitPath\n ? values.selectedValues\n : values.selectedValues[values.selectedValues.length - 1]\n\n pickerValue.value = value\n\n props.onConfirm?.(value, values)\n props.onChange?.(value, values)\n showPicker.value = false\n }\n\n /** 处理取消 */\n const handleCancel = (): void => {\n showPicker.value = false\n }\n\n /** 处理点击 */\n const handleClick = (): void => {\n if (props.readonly || props.disabled) return\n showPicker.value = true\n }\n</script>\n","/**\n * 选择渲染器统一导出\n *\n * @module renderers/PickerRenderer\n */\nimport { WithRemoteOptions } from \"@schemx/vue\"\n\nimport PickerRendererComponent from \"./index.vue\"\n\nexport default WithRemoteOptions(PickerRendererComponent)\nexport type { PickerRendererProps, PickerFieldNames, PickerValue } from \"./types\"\n","<template>\n <div\n :class=\"[\n 'schemx-renderer',\n 'schemx-radio-renderer',\n className,\n { 'schemx-renderer-readonly': props.readonly },\n ]\"\n :style=\"{ textAlign: contentAlign }\"\n >\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"fieldValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <RadioGroup\n v-else\n v-bind=\"radioProps\"\n :model-value=\"radioValue\"\n @update:model-value=\"handleChange\"\n >\n <Radio\n v-for=\"option in options\"\n :key=\"option[valueName]\"\n :name=\"option[valueName]\"\n :disabled=\"disabled || option[disabledName]\"\n v-bind=\"option\"\n >\n {{ option[labelName] }}\n </Radio>\n </RadioGroup>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 单选框渲染器组件\n *\n * 基于 Vant Radio 组件实现单选功能。\n *\n * @module renderers/RadioRenderer\n */\n import { computed, useAttrs } from \"vue\"\n\n import { Radio, RadioGroup } from \"vant\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { getFieldProps } from \"@/utils\"\n\n import type { RadioRendererProps, RadioValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"RadioRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<RadioRendererProps>(), {\n value: undefined,\n onChange: () => {},\n options: () => [],\n className: \"\",\n fieldNames: () => ({}),\n view: false,\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n })\n\n const attrs = useAttrs() as Record<string, any>\n\n const radioValue = defineModel<RadioValue>(\"value\")\n\n const labelName = computed(() => props.fieldNames?.label || \"label\")\n const valueName = computed(() => props.fieldNames?.value || \"value\")\n const disabledName = computed(() => props.fieldNames?.disabled || \"disabled\")\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const contentAlign = computed(() => getFieldProps(attrs, \"align\", \"right\"))\n\n const fieldValue = computed(() => {\n return getOption(radioValue.value ?? props.value, labelName.value)\n })\n\n const radioProps = computed(() => {\n const { value, className, formItemProps, ...rest } = props\n const style = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px 12px\",\n justifyContent: contentAlign.value,\n ...(attrs?.style || {}),\n }\n\n return { ...attrs, ...rest, style }\n })\n\n const handleChange = (value: RadioValue): void => {\n if (props.readonly || props.disabled) return\n\n radioValue.value = value\n props.onChange?.(value)\n }\n\n /**\n * 获取选项的指定字段值\n */\n const getOption = (v: any, key: string): any => {\n const option = props.options.find((option) => option[valueName.value] === v)\n\n return option ? option[key] : v\n }\n</script>\n","/**\n * 单选框渲染器统一导出\n *\n * @module renderers/RadioRenderer\n */\nimport { WithRemoteOptions } from \"@schemx/vue\"\n\nimport RadioRendererComponent from \"./index.vue\"\n\nexport default WithRemoteOptions(RadioRendererComponent)\nexport type { RadioOption, RadioRendererProps, RadioValue } from \"./types\"\n","<template>\n <div\n :class=\"[\n 'schemx-renderer',\n 'schemx-rate-renderer',\n className,\n {\n 'schemx-rate-renderer__readonly': props.readonly,\n 'schemx-rate-renderer__disabled': props.disabled,\n },\n ]\"\n >\n <Rate\n v-bind=\"rateProps\"\n :model-value=\"rateValue\"\n :count=\"count\"\n :allow-half=\"allowHalf\"\n :disabled=\"props.disabled\"\n @update:model-value=\"handleChange\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 评分渲染器组件\n *\n * 基于 Vant Rate 组件实现评分功能。\n *\n * @module renderers/RateRenderer\n */\n import { computed, useAttrs } from \"vue\"\n\n import { Rate } from \"vant\"\n\n import type { RateRendererProps, RateValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"RateRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<RateRendererProps>(), {\n value: 0,\n count: 5,\n allowHalf: false,\n className: \"\",\n onChange: () => {},\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n })\n\n const attrs = useAttrs()\n\n const rateValue = defineModel<RateValue>(\"value\")\n\n const rateProps = computed(() => {\n const {\n value: _value,\n onChange: _onChange,\n className: _className,\n formItemProps: _formItemProps,\n ...rest\n } = props\n\n return { ...attrs, rest }\n })\n\n const handleChange = (value: RateValue): void => {\n if (props.disabled || props.readonly) return\n\n rateValue.value = value\n props.onChange?.(value)\n }\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-slider-renderer', props.className]\">\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"displayValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <Slider\n v-else\n v-bind=\"sliderProps\"\n :model-value=\"sliderValue\"\n @update:model-value=\"handleChange\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 滑块渲染器组件\n *\n * 基于 Vant Slider 实现滑块功能。\n *\n * @module renderers/SliderRenderer\n */\n import { computed, useAttrs } from \"vue\"\n\n import { Slider } from \"vant\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n\n import type { SliderRendererProps, SliderValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"SliderRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<SliderRendererProps>(), {\n value: 0,\n min: 0,\n max: 100,\n step: 1,\n range: false,\n className: \"\",\n onChange: () => {},\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n button: true,\n })\n\n const attrs = useAttrs()\n\n const sliderValue = defineModel<SliderValue>(\"value\")\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const displayValue = computed(() => {\n return Array.isArray(sliderValue.value)\n ? sliderValue.value.join(\" - \")\n : sliderValue.value\n })\n\n const sliderProps = computed(() => {\n const { value, className, formItemProps, ...rest } = props\n\n return { ...attrs, ...rest }\n })\n\n /**\n * 处理值变化事件\n */\n const handleChange = (value: SliderValue): void => {\n if (props.readonly || props.disabled) return\n sliderValue.value = value\n props.onChange?.(value)\n }\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-stepper-renderer', props.className]\">\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"stepperValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <Stepper\n v-else\n v-bind=\"stepperProps\"\n :model-value=\"stepperValue\"\n @update:model-value=\"handleChange\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 步进器渲染器组件\n *\n * 基于 Vant Stepper 实现数值调节功能。\n *\n * @module renderers/StepperRenderer\n */\n import { computed, useAttrs } from \"vue\"\n\n import { Stepper } from \"vant\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n\n import type { StepperRendererProps, StepperValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"StepperRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<StepperRendererProps>(), {\n value: 0,\n min: undefined,\n max: undefined,\n step: 1,\n integer: false,\n decimalLength: undefined,\n className: \"\",\n onChange: () => {},\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n allowEmpty: false,\n })\n\n const attrs = useAttrs()\n\n const stepperValue = defineModel<StepperValue>(\"value\")\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const stepperProps = computed(() => {\n const { value, className, formItemProps, ...rest } = props\n\n return { ...attrs, ...rest }\n })\n\n /**\n * 处理值变化事件\n */\n const handleChange = (value: StepperValue): void => {\n if (props.readonly || props.disabled) return\n stepperValue.value = value\n props.onChange?.(value)\n }\n</script>\n","<template>\n <div\n :class=\"['schemx-renderer', 'schemx-switch-renderer', props.className]\"\n :style=\"{ justifyContent: contentAlign }\"\n >\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"fieldValue\"\n :placeholder=\"props.placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n <Switch\n v-else\n size=\"22px\"\n v-bind=\"attrs\"\n :model-value=\"switchValue\"\n :loading=\"switchLoading\"\n :disabled=\"disabled\"\n @update:model-value=\"handleChange\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 开关渲染器组件\n *\n * 基于 Vant Switch 封装,支持自定义开关状态文本、\n * 异步值更新、只读/禁用状态继承等能力。\n *\n * @module renderers/SwitchRenderer\n */\n import { computed, ref, useAttrs } from \"vue\"\n\n import { Switch } from \"vant\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { getFieldProps } from \"@/utils\"\n\n import type { SwitchRendererProps, SwitchValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"SwitchRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<SwitchRendererProps>(), {\n value: false,\n onChange: () => {},\n className: \"\",\n activeText: undefined,\n activeValue: true,\n inactiveValue: false,\n inactiveText: undefined,\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n })\n\n const attrs = useAttrs()\n\n const switchValue = defineModel<SwitchValue>(\"value\")\n\n const switchLoading = ref(false)\n\n const contentAlign = computed(\n () =>\n getFieldProps(attrs as Record<string, any>, \"align\", \"right\") as\n | \"left\"\n | \"center\"\n | \"right\"\n )\n\n const fieldValue = computed(() => {\n return (switchValue.value ?? props.value) === props.activeValue\n ? props.activeText\n : props.inactiveText\n })\n\n /**\n * 处理开关值变化\n */\n const handleChange = async (value: SwitchValue): Promise<void> => {\n if (props.readonly || props.disabled) return\n\n try {\n switchLoading.value = true\n\n const nextValue = await props.onChange?.(value)\n\n switchValue.value = nextValue ?? value\n\n switchLoading.value = false\n } catch (error) {\n switchLoading.value = false\n }\n }\n</script>\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-upload-renderer', props.className]\">\n <Uploader\n v-bind=\"$attrs\"\n ref=\"uploadRef\"\n result-type=\"file\"\n :multiple=\"true\"\n :class=\"rootClass\"\n :model-value=\"innerFileList\"\n :show-upload=\"showUploadComputed\"\n :deletable=\"deletableComputed\"\n :disabled=\"disabledComputed\"\n :readonly=\"uploaderReadonlyComputed\"\n :before-read=\"handleBeforeRead\"\n :after-read=\"afterRead\"\n :accept=\"accept\"\n @delete=\"onDelete\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 上传渲染器组件\n *\n * 基于 Vant Uploader 封装,支持自定义上传函数、文件状态管理、\n * 只读/禁用状态继承等能力。\n *\n * @module renderers/UploadRenderer\n */\n import { computed, ref, useAttrs, watch } from \"vue\"\n\n import { Uploader } from \"vant\"\n\n import { useFieldContext } from \"@schemx/vue\"\n import classNames from \"classnames\"\n\n import { getFileName } from \"@/utils\"\n\n import type { UploadFile, UploadRendererProps, UploadValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"UploadRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<UploadRendererProps>(), {\n value: () => [],\n accept: \"*\",\n onChange: () => {},\n className: \"\",\n showUpload: true,\n disableUpload: false,\n deletable: true,\n view: false,\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n uploader: () => Promise.resolve({}),\n propsHttp: () => ({\n res: \"data\",\n url: \"link\",\n name: \"originalName\",\n }),\n })\n\n const attrs = useAttrs()\n const uploadAttrs = attrs as Record<string, any>\n\n const uploadValue = defineModel<UploadValue>(\"value\")\n\n const field = useFieldContext()\n\n const uploadRef = ref<InstanceType<typeof Uploader> | null>(null)\n\n /** 内部上传中的文件列表(status 为 uploading 的文件) */\n const uploadingFiles = ref<UploadFile[]>([])\n\n const httpRes = Object.assign({}, props.propsHttp, {\n res: \"data\",\n url: \"link\",\n name: \"originalName\",\n })\n\n /**\n * 将外部值标准化为文件对象\n */\n const normalizeFile = (item: any): UploadFile | null => {\n if (!item) return null\n const url = item?.url || item\n\n return {\n ...(typeof item === \"string\" ? {} : item),\n url,\n uid: item?.uid || getFileName(url),\n status: item?.status || \"done\",\n }\n }\n\n /**\n * 合并 props.value 和上传中的文件,去重\n */\n const innerFileList = computed(() => {\n const propsFiles = (\n Array.isArray(uploadValue.value) ? uploadValue.value : [uploadValue.value]\n )\n .filter(Boolean)\n .map(normalizeFile)\n .filter(Boolean) as UploadFile[]\n\n const fileMap = new Map<string, UploadFile>()\n\n propsFiles.forEach((file) => {\n if (file.uid) {\n fileMap.set(file.uid, file)\n }\n })\n\n uploadingFiles.value.forEach((file) => {\n if (file.uid) {\n fileMap.set(file.uid, file)\n }\n })\n\n return Array.from(fileMap.values())\n })\n\n // 监听外部 value 变化,清理已完成上传的文件\n watch(\n () => uploadValue.value,\n (newVal) => {\n if (!newVal || (Array.isArray(newVal) && newVal.length === 0)) {\n uploadingFiles.value = []\n }\n },\n { deep: true }\n )\n\n const viewComputed = computed(() => props.view)\n const readonlyComputed = computed(() => props.readonly)\n const disabledComputed = computed(() => props.disabled)\n const deletableComputed = computed(() =>\n viewComputed.value || readonlyComputed.value ? false : props.deletable\n )\n const showUploadComputed = computed(() =>\n viewComputed.value || readonlyComputed.value ? false : props.showUpload\n )\n const uploaderReadonlyComputed = computed(\n () => viewComputed.value || readonlyComputed.value\n )\n\n const rootClass = computed(() =>\n classNames(\"schemx-renderer\", \"schemx-upload-renderer\", props.className)\n )\n\n /**\n * 重置操作标志\n */\n const resetFieldPending = () => {\n const isPending = uploadingFiles.value.some((i) => i.status === \"uploading\")\n\n if (!isPending) {\n // field.setPending(false)\n }\n }\n\n /**\n * 上传成功\n */\n const onSuccess = (res: any, file: UploadFile): void => {\n const index = uploadingFiles.value.findIndex((i) => i.uid === file.uid)\n\n if (index === -1) return\n\n const completedFile: UploadFile = {\n ...uploadingFiles.value[index],\n url: res[httpRes.res][httpRes.url],\n name: res[httpRes.res][httpRes.name],\n status: \"done\",\n message: \"上传成功\",\n }\n\n uploadingFiles.value = uploadingFiles.value.filter((i) => i.uid !== file.uid)\n\n const currentDoneFiles = (Array.isArray(uploadValue.value) ? uploadValue.value : [])\n .filter(Boolean)\n .map(normalizeFile)\n .filter(Boolean) as UploadFile[]\n\n const nextFiles = [...currentDoneFiles, completedFile]\n\n uploadValue.value = nextFiles\n props.onChange?.(nextFiles)\n\n resetFieldPending()\n }\n\n /**\n * 上传失败\n */\n const onFail = (_error: Error, file: UploadFile): void => {\n const index = uploadingFiles.value.findIndex((i) => i.uid === file.uid)\n\n if (index === -1) return\n\n uploadingFiles.value[index] = {\n ...uploadingFiles.value[index],\n status: \"failed\",\n message: \"上传失败\",\n }\n\n resetFieldPending()\n }\n\n const handleBeforeRead = (\n file: File | File[]\n ): boolean | Promise<File | File[] | undefined> | undefined => {\n if (uploadAttrs.beforeRead) {\n return uploadAttrs.beforeRead(file)\n }\n\n return true\n }\n\n const afterRead = async (files: any | any[]): Promise<void> => {\n try {\n if (uploadAttrs.afterRead) {\n return uploadAttrs.afterRead(files)\n }\n\n const _fileList = Array.isArray(files) ? files : [files]\n\n field.setPending(true, \"文件上传中\")\n\n const uploadList = _fileList.map((item) => {\n const newItem: UploadFile = {\n ...item,\n url: item.objectUrl,\n uid: getFileName(item.objectUrl),\n status: \"uploading\" as const,\n message: \"上传中...\",\n }\n\n if (!newItem.file) {\n throw \"file is undefined\"\n }\n\n props\n .uploader?.(newItem.file)\n .then((res) => {\n onSuccess(res, newItem)\n })\n .catch((error) => {\n onFail(error, newItem)\n })\n\n return newItem\n })\n\n uploadingFiles.value = [...uploadingFiles.value, ...uploadList]\n } catch (error: any) {\n console.error(\"Upload failed:\", error.message || \"上传失败\")\n }\n }\n\n const onDelete = (file: UploadFile, detail: { index: number }): void => {\n if (uploadAttrs.onDelete) {\n return uploadAttrs.onDelete(file, detail)\n }\n\n if (file.status === \"uploading\" || file.status === \"failed\") {\n uploadingFiles.value = uploadingFiles.value.filter((i) => i.uid !== file.uid)\n\n return\n }\n\n const currentFiles = (Array.isArray(uploadValue.value) ? uploadValue.value : [])\n .filter(Boolean)\n .map(normalizeFile)\n .filter((i) => i && i.uid !== file.uid) as UploadFile[]\n\n uploadValue.value = currentFiles\n props.onChange?.(currentFiles)\n }\n</script>\n","//#region src/object/omitBy.ts\n/**\n* Creates a new object composed of the properties that do not satisfy the predicate function.\n*\n* This function takes an object and a predicate function, and returns a new object that\n* includes only the properties for which the predicate function returns false.\n*\n* @template T - The type of object.\n* @param {T} obj - The object to omit properties from.\n* @param {(value: T[string], key: keyof T) => boolean} shouldOmit - A predicate function that determines\n* whether a property should be omitted. It takes the property's key and value as arguments and returns `true`\n* if the property should be omitted, and `false` otherwise.\n* @returns {Partial<T>} A new object with the properties that do not satisfy the predicate function.\n*\n* @example\n* const obj = { a: 1, b: 'omit', c: 3 };\n* const shouldOmit = (value) => typeof value === 'string';\n* const result = omitBy(obj, shouldOmit);\n* // result will be { a: 1, c: 3 }\n*/\nfunction omitBy(obj, shouldOmit) {\n\tconst result = {};\n\tconst keys = Object.keys(obj);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tconst value = obj[key];\n\t\tif (!shouldOmit(value, key)) result[key] = value;\n\t}\n\treturn result;\n}\n//#endregion\nexport { omitBy };\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-cascader-renderer', props.className]\">\n <SchemxCell\n :value=\"fieldValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n @click=\"handleClick\"\n />\n\n <Popup\n v-if=\"!props.readonly && !props.disabled\"\n v-model:show=\"showCascader\"\n :class=\"classNames('schemx-cascader-popup-renderer', props.popupClassName)\"\n v-bind=\"popupProps\"\n safe-area-inset-bottom\n >\n <Cascader\n v-bind=\"cascaderProps\"\n :model-value=\"cascaderValue\"\n @finish=\"handleConfirm\"\n @close=\"handleClose\"\n />\n </Popup>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 级联选择器渲染器组件\n *\n * 使用 Vant Cascader + Popup + Cell 组合实现。\n * 通过 popupProps 透传 Popup 原生属性与事件,避免命名冲突。\n *\n * @module renderers/CascaderRenderer\n */\n import { computed, ref, useAttrs } from \"vue\"\n\n import { Cascader, Popup } from \"vant\"\n import type { PopupProps } from \"vant\"\n\n import classNames from \"classnames\"\n import { omitBy } from \"es-toolkit\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { findTreeItem } from \"@/utils\"\n\n import type { CascaderFieldNames, CascaderRendererProps, CascaderValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"CascaderRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<CascaderRendererProps>(), {\n value: () => [],\n onConfirm: undefined,\n className: \"\",\n showAllLevels: true,\n emitPath: true,\n fieldNames: () => ({ text: \"label\", value: \"value\", children: \"children\" }),\n separator: \" - \",\n placeholder: undefined,\n readonlyPlaceholder: \"-\",\n readonly: false,\n disabled: false,\n onChange: undefined,\n options: () => [],\n title: undefined,\n popupProps: () => ({}) as PopupProps,\n popupClassName: \"\",\n })\n\n const attrs = useAttrs()\n\n const cascaderModel = defineModel<CascaderValue>(\"value\")\n\n const showCascader = ref(false)\n\n // ==================== 计算属性 ====================\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const fieldNames = computed<CascaderFieldNames>(() => props.fieldNames)\n const title = computed(() => props.title ?? placeholder.value)\n\n const cascaderProps = computed(() => {\n const {\n value: _value,\n onChange: _onChange,\n onConfirm: _onConfirm,\n className: _className,\n readonlyPlaceholder: _readonlyPlaceholder,\n showAllLevels: _showAllLevels,\n emitPath: _emitPath,\n separator: _separator,\n contentAlign: _contentAlign,\n placeholder: _placeholder,\n formItemProps: _formItemProps,\n popupProps: _popupProps,\n title: _title,\n ...rest\n } = props\n\n return { ...attrs, ...rest, placeholder: placeholder.value, title: title.value }\n })\n\n /** 数据源:优先使用 props.options,回退到 attrs.columns */\n const columns = computed(() => {\n if (Array.isArray(props.options) && props.options.length > 0) {\n return props.options\n }\n\n return []\n })\n\n /**\n * 级联选择器内部值\n *\n * Vant Cascader 仅接受叶子节点值,取路径最后一项。\n */\n const cascaderValue = computed(() => {\n if (!Array.isArray(cascaderModel.value) || cascaderModel.value.length === 0) {\n return undefined\n }\n\n return cascaderModel.value[cascaderModel.value.length - 1]\n })\n\n /**\n * Cell 展示文本\n *\n * 通过 findTreeItem 将 value 路径反向映射为 label 路径,\n * 支持 showAllLevels 控制显示全部层级或仅末级。\n */\n const fieldValue = computed(() => {\n const targetValue = Array.isArray(cascaderModel.value)\n ? cascaderModel.value[cascaderModel.value.length - 1]\n : cascaderModel.value\n\n const result = findTreeItem(columns.value, targetValue, {\n labelKey: fieldNames.value.text,\n valueKey: fieldNames.value.value,\n childrenKey: fieldNames.value.children,\n })\n\n if (!result.labels.length) return \"\"\n\n const labels = props.showAllLevels ? result.labels : result.labels.slice(-1)\n\n return labels.join(props.separator)\n })\n\n const popupProps = computed((): Partial<Omit<PopupProps, \"show\">> => {\n return {\n round: true,\n position: \"bottom\",\n safeAreaInsetBottom: true,\n teleport: \"body\",\n ...omitBy(props.popupProps as PopupProps, (_, key) => key === \"show\"),\n }\n })\n\n // ==================== 事件处理 ====================\n\n const handleClick = (): void => {\n if (props.readonly || props.disabled) return\n showCascader.value = true\n }\n\n const handleConfirm = (data: { selectedOptions: any[]; value: any }): void => {\n if (props.readonly || props.disabled) return\n\n const valueKey = fieldNames.value.value || \"value\"\n const valuePath = data.selectedOptions.map((i) => i[valueKey])\n const value = props.emitPath ? valuePath : [data.value]\n\n cascaderModel.value = value\n props.onConfirm?.(value)\n props.onChange?.(value)\n showCascader.value = false\n }\n\n const handleClose = (): void => {\n showCascader.value = false\n // onClose 由 watch(showCascader) 统一触发,避免重复\n }\n</script>\n","<template>\n <div class=\"selector\">\n <div\n v-for=\"item in options\"\n :key=\"item[valueKey]\"\n :class=\"optionClass(item)\"\n @click=\"handleClick(item)\"\n >\n <slot name=\"item\" :item=\"item\">\n {{ item[labelKey] }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 选择器子组件\n *\n * 提供选项列表渲染和选择交互功能。\n *\n * @module renderers/SelectorRenderer/Selector\n */\n import { computed } from \"vue\"\n\n import type { SelectorOption, SelectorProps, SelectValue } from \"./types\"\n\n import \"./selector.scss\"\n\n defineOptions({\n name: \"SSelector\",\n })\n\n const props = withDefaults(defineProps<SelectorProps>(), {\n modelValue: () => [],\n options: () => [],\n multiple: false,\n fieldNames: () => ({ label: \"label\", value: \"value\", disabled: \"disabled\" }),\n disabled: false,\n })\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: SelectValue]\n change: [value: SelectValue, option: SelectorOption]\n }>()\n\n const labelKey = computed(() => props.fieldNames?.label || \"label\")\n const valueKey = computed(() => props.fieldNames?.value || \"value\")\n const disabledKey = computed(() => props.fieldNames?.disabled || \"disabled\")\n\n const selectedValues = computed(() => {\n if (props.multiple) {\n return Array.isArray(props.modelValue) ? props.modelValue : []\n }\n\n return props.modelValue === undefined || props.modelValue === null\n ? []\n : [props.modelValue]\n })\n\n const options = computed(() => (Array.isArray(props.options) ? props.options : []))\n\n /**\n * 判断选项是否选中\n */\n const isSelected = (option: SelectorOption): boolean => {\n return selectedValues.value.includes(option?.[valueKey.value])\n }\n\n /**\n * 处理选项点击\n */\n const handleClick = (option: SelectorOption): void => {\n if (props.disabled || option?.[disabledKey.value]) return\n\n const value = option?.[valueKey.value]\n\n if (props.multiple) {\n const next = selectedValues.value.includes(value)\n ? selectedValues.value.filter((item) => item !== value)\n : [...selectedValues.value, value]\n\n emit(\"update:modelValue\", next)\n emit(\"change\", next, option)\n\n return\n }\n\n emit(\"update:modelValue\", value)\n emit(\"change\", value, option)\n }\n\n /**\n * 计算选项类名\n */\n const optionClass = (item: SelectorOption): Record<string, boolean> => ({\n option: true,\n active: isSelected(item),\n disabled: props.disabled || !!item?.[disabledKey.value],\n })\n</script>\n","<template>\n <div\n :class=\"[\n 'schemx-renderer',\n 'schemx-selector-renderer',\n className,\n {\n 'schemx-renderer-readonly': readonly,\n },\n ]\"\n >\n <SchemxCell\n v-if=\"props.readonly\"\n :value=\"fieldValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n />\n\n <Selector\n v-else\n v-bind=\"selectorProps\"\n :options=\"options\"\n :field-names=\"fieldNames\"\n :disabled=\"props.disabled\"\n :model-value=\"selectorValue\"\n :style=\"{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px 12px',\n justifyContent: contentAlign,\n ...(attrs?.style || {}),\n }\"\n @update:model-value=\"handleChange\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 选择组渲染器组件\n *\n * 基于 Selector 子组件实现选择功能。\n *\n * @module renderers/SelectorRenderer\n */\n import { computed, useAttrs } from \"vue\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import { getFieldProps } from \"@/utils\"\n\n import Selector from \"./Selector.vue\"\n\n import type { SelectorOption, SelectorRendererProps, SelectValue } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"SelectorRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<SelectorRendererProps>(), {\n value: undefined,\n onChange: () => {},\n options: () => [],\n className: \"\",\n fieldNames: () => ({}),\n view: false,\n readonly: false,\n readonlyPlaceholder: \"-\",\n disabled: false,\n })\n\n const attrs = useAttrs() as Record<string, any>\n\n const selectorValue = defineModel<SelectValue>(\"value\")\n\n const labelName = computed(() => props.fieldNames?.label || \"label\")\n const valueName = computed(() => props.fieldNames?.value || \"value\")\n\n const contentAlign = computed(() => getFieldProps(attrs, \"align\", \"right\"))\n\n const fieldValue = computed(() => {\n return getOption(selectorValue.value ?? props.value, labelName.value)\n })\n\n const selectorProps = computed(() => {\n const { value, className: _className, formItemProps: _formItemProps, ...rest } = props\n\n return { ...attrs, rest }\n })\n\n const handleChange = (value: SelectValue): void => {\n if (props.readonly || props.disabled) return\n selectorValue.value = value\n props.onChange?.(value)\n }\n\n /**\n * 获取选项的指定字段值\n */\n const getOption = (v: any, key: string): any => {\n const option = props.options.find(\n (option: SelectorOption) => option[valueName.value] === v\n )\n\n return option ? option[key] : v\n }\n</script>\n","/**\n * 选择组渲染器统一导出\n *\n * @module renderers/SelectorRenderer\n */\nimport { WithRemoteOptions } from \"@schemx/vue\"\n\nimport SelectorRendererComponent from \"./index.vue\"\n\nexport default WithRemoteOptions(SelectorRendererComponent)\nexport type { SelectorOption, SelectorProps, SelectorRendererProps, SelectValue } from \"./types\"\n","<template>\n <div :class=\"['schemx-renderer', 'schemx-select-picker-renderer', props.className]\">\n <SchemxCell\n :value=\"fieldValue\"\n :placeholder=\"placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"isReadonly\"\n :disabled=\"props.disabled\"\n @click=\"handleClick\"\n />\n\n <Popup\n v-if=\"!isReadonly && !props.disabled\"\n v-model:show=\"showPicker\"\n :class=\"classNames('schemx-select-picker-popup-renderer', props.popupClassName)\"\n v-bind=\"popupProps\"\n safe-area-inset-bottom\n @close=\"handleClose\"\n >\n <div class=\"schemx-select-picker\">\n <div class=\"schemx-select-picker-actions\">\n <div class=\"schemx-select-picker-title\">\n {{ props.title || placeholder }}\n </div>\n </div>\n\n <div class=\"schemx-select-picker-options\">\n <template v-if=\"columns.length\">\n <CheckboxGroup\n v-if=\"type === 'checkbox'\"\n :model-value=\"checkboxValue\"\n @update:model-value=\"handleCheckboxChange\"\n >\n <Checkbox\n v-for=\"option in columns\"\n :key=\"option[valueName]\"\n shape=\"square\"\n :name=\"option[valueName]\"\n :disabled=\"disabled || option[disabledName]\"\n v-bind=\"option\"\n >\n {{ option[labelName] }}\n </Checkbox>\n </CheckboxGroup>\n\n <RadioGroup\n v-else\n :model-value=\"radioValue\"\n @update:model-value=\"handleRadioChange\"\n >\n <Radio\n v-for=\"option in columns\"\n :key=\"option[valueName]\"\n :name=\"option[valueName]\"\n :disabled=\"disabled || option[disabledName]\"\n v-bind=\"option\"\n >\n {{ option[labelName] }}\n </Radio>\n </RadioGroup>\n </template>\n\n <div v-else class=\"schemx-select-picker-empty\">No data</div>\n </div>\n\n <div class=\"schemx-select-picker-footer\">\n <Button type=\"primary\" block @click=\"handleConfirm\">确认</Button>\n </div>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n /**\n * 弹窗选择渲染器组件\n *\n * 使用 Vant Cell + Popup + Checkbox/Radio 组合实现单选/多选弹窗。\n *\n * @module renderers/SelectPickerRenderer\n */\n import { computed, ref } from \"vue\"\n\n import { Button, Checkbox, CheckboxGroup, Popup, Radio, RadioGroup } from \"vant\"\n \nimport classNames from \"classnames\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n \nimport type {\n SelectPickerConfirmEventParams,\n SelectPickerOption,\n SelectPickerRendererProps,\n SelectPickerValue,\n } from \"./types\"\n\n import \"./index.scss\"\n\n defineOptions({\n name: \"SelectPickerRendererComponent\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<SelectPickerRendererProps>(), {\n value: undefined,\n onChange: () => {},\n onConfirm: () => {},\n className: \"\",\n popupClassName: \"\",\n readonlyPlaceholder: \"-\",\n readonly: false,\n disabled: false,\n title: \"\",\n options: () => [],\n columns: () => [],\n fieldNames: () => ({}),\n type: \"checkbox\",\n })\n\n const selectPickerValue = defineModel<SelectPickerValue>(\"value\")\n const pendingValue = ref<SelectPickerValue>()\n const showPicker = ref(false)\n\n const placeholder = computed(() => props.placeholder || \"请选择\")\n\n const type = computed(() => props.type || \"checkbox\")\n const labelName = computed(() => props.fieldNames?.label || \"label\")\n const valueName = computed(() => props.fieldNames?.value || \"value\")\n const disabledName = computed(() => props.fieldNames?.disabled || \"disabled\")\n const isReadonly = computed(() => props.readonly || Boolean(props.view))\n\n const popupProps = computed((): SelectPickerRendererProps[\"popupProps\"] => ({\n round: true,\n position: \"bottom\" as const,\n safeAreaInsetBottom: true,\n teleport: \"body\",\n closeable: true,\n closeIconPosition: \"top-right\",\n ...props.popupProps,\n }))\n\n const columns = computed<SelectPickerOption[]>(() => {\n if (Array.isArray(props.options) && props.options.length > 0) return props.options\n\n return props.columns || []\n })\n\n const normalizeValue = (value: SelectPickerValue | undefined): SelectPickerValue => {\n if (type.value === \"checkbox\") return Array.isArray(value) ? value : []\n\n return value ?? \"\"\n }\n\n const displayValue = computed<SelectPickerValue>(() =>\n normalizeValue(selectPickerValue.value ?? props.value)\n )\n\n const activeValue = computed<SelectPickerValue>(() =>\n normalizeValue(pendingValue.value ?? displayValue.value)\n )\n\n const checkboxValue = computed(() =>\n Array.isArray(activeValue.value) ? activeValue.value : []\n )\n\n const radioValue = computed(() =>\n Array.isArray(activeValue.value) ? \"\" : activeValue.value\n )\n\n const getOption = (value: unknown): SelectPickerOption | undefined => {\n return columns.value.find((option) => option[valueName.value] === value)\n }\n\n const getOptionLabel = (value: unknown): string => {\n const option = getOption(value)\n\n return String(option?.[labelName.value] ?? value ?? \"\")\n }\n\n const fieldValue = computed(() => {\n const value = displayValue.value\n\n if (Array.isArray(value)) {\n return value\n .map((item) => getOptionLabel(item))\n .filter(Boolean)\n .join(\"、\")\n }\n\n return getOptionLabel(value)\n })\n\n const selectedItems = computed<SelectPickerOption | SelectPickerOption[]>(() => {\n const value = activeValue.value\n\n if (Array.isArray(value)) {\n return value.map((item) => getOption(item)).filter(Boolean) as SelectPickerOption[]\n }\n\n return getOption(value) || {}\n })\n\n const handleClick = (): void => {\n if (isReadonly.value || props.disabled) return\n\n pendingValue.value = displayValue.value\n showPicker.value = true\n }\n\n const handleCheckboxChange = (value: SelectPickerValue): void => {\n pendingValue.value = value\n }\n\n const handleRadioChange = (value: SelectPickerValue): void => {\n pendingValue.value = value\n }\n\n const handleClose = (): void => {\n pendingValue.value = undefined\n showPicker.value = false\n }\n\n const handleConfirm = (): void => {\n if (isReadonly.value || props.disabled) return\n\n const value = activeValue.value\n const detail: SelectPickerConfirmEventParams = {\n value,\n selectedItems: selectedItems.value,\n }\n\n selectPickerValue.value = value\n props.onChange(value, detail)\n props.onConfirm(value, detail)\n pendingValue.value = undefined\n showPicker.value = false\n }\n</script>\n","/**\n * @module renderers/SelectPickerRenderer\n */\nimport { WithRemoteOptions } from \"@schemx/vue\"\n\nimport SelectPickerRendererComponent from \"./index.vue\"\n\nexport default WithRemoteOptions(SelectPickerRendererComponent)\n\nexport type {\n SelectPickerFieldNames,\n SelectPickerOption,\n SelectPickerRendererProps,\n SelectPickerValue,\n} from \"./types\"\n","/**\n * 脱敏输入渲染器类型定义\n *\n * @module renderers/SensitiveInputRenderer/types\n */\n\nimport type { SchemxInputProps } from \"@/components/Input\"\n\nexport type SensitiveInputValue = string\n\nexport type SensitiveMaskFormatter = (\n value: string,\n ctx: {\n placeholder: string\n readonlyPlaceholder: string\n }\n) => string\n\nexport interface SensitiveInputRendererProps extends Omit<\n SchemxInputProps,\n \"type\" | \"value\" | \"onChange\"\n> {\n /** 当前真实值 */\n value?: SensitiveInputValue\n /** 值变化回调,始终回传真实值 */\n onChange?: (value: string) => void\n /** 完整值格式化,展示完整值和输入时使用 */\n formatter?: (value: string) => string\n /** 脱敏值格式化,仅用于默认展示态 */\n maskFormatter?: SensitiveMaskFormatter\n /** 默认是否显示完整值 */\n defaultRevealed?: boolean\n /** 受控显示状态 */\n revealed?: boolean\n /** 显示状态变化回调 */\n onRevealChange?: (revealed: boolean) => void\n /** 是否允许显示完整值 */\n revealable?: boolean\n /** 显示按钮文案 */\n revealText?: string\n /** 隐藏按钮文案 */\n hideText?: string\n /** 显示按钮图标 */\n revealIcon?: string\n /** 隐藏按钮图标 */\n hideIcon?: string\n /** 展开后是否自动聚焦输入框 */\n focusOnReveal?: boolean\n /** 输入框失焦后是否自动恢复脱敏态 */\n hideOnBlur?: boolean\n /** 只读时是否允许查看完整值 */\n revealWhenReadonly?: boolean\n}\n\nexport function defaultMaskFormatter(value: string): string {\n const chars = [...value]\n const length = chars.length\n\n if (length <= 0) return \"\"\n if (length <= 2) return \"*\".repeat(length)\n if (length <= 6) return `${chars[0]}****${chars[length - 1]}`\n\n return `${chars.slice(0, 3).join(\"\")}****${chars.slice(-4).join(\"\")}`\n}\n","<template>\n <div :class=\"['schemx-sensitive-input', props.className]\">\n <SchemxInput\n v-if=\"showInput\"\n ref=\"inputRef\"\n v-bind=\"inputProps\"\n :value=\"formattedValue\"\n :on-change=\"handleInputChange\"\n :on-blur=\"handleInputBlur\"\n >\n <template #button>\n <button\n v-if=\"canReveal\"\n type=\"button\"\n class=\"schemx-sensitive-input__toggle\"\n data-testid=\"sensitive-toggle\"\n :aria-label=\"hideAriaLabel\"\n @click.stop=\"toggleReveal\"\n >\n <Icon v-if=\"props.hideIcon\" :name=\"props.hideIcon\" />\n <span>{{ props.hideText }}</span>\n </button>\n </template>\n </SchemxInput>\n\n <SchemxCell\n v-else\n :value=\"displayValue\"\n :placeholder=\"props.placeholder\"\n :readonly-placeholder=\"props.readonlyPlaceholder\"\n :readonly=\"props.readonly\"\n :disabled=\"props.disabled\"\n :is-link=\"false\"\n :align=\"props.align\"\n >\n <template #suffix>\n <button\n v-if=\"canReveal\"\n type=\"button\"\n class=\"schemx-sensitive-input__toggle\"\n data-testid=\"sensitive-toggle\"\n :aria-label=\"showAriaLabel\"\n @click.stop=\"toggleReveal\"\n >\n <Icon v-if=\"props.revealIcon\" :name=\"props.revealIcon\" />\n <span>{{ props.revealText }}</span>\n </button>\n </template>\n </SchemxCell>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, ref } from \"vue\"\n\n import { Icon } from \"vant\"\n\n import SchemxCell from \"@/components/Cell/index.vue\"\n import SchemxInput from \"@/components/Input\"\n import { isEmptyDisplayValue } from \"@/utils\"\n\n import { defaultMaskFormatter } from \"./types\"\n\n import type { SensitiveInputRendererProps } from \"./types\"\n\n defineOptions({\n name: \"SensitiveInput\",\n inheritAttrs: false,\n })\n\n const props = withDefaults(defineProps<SensitiveInputRendererProps>(), {\n value: \"\",\n onChange: undefined,\n onBlur: undefined,\n onFocus: undefined,\n formatter: undefined,\n maskFormatter: defaultMaskFormatter,\n defaultRevealed: false,\n revealed: undefined,\n onRevealChange: undefined,\n revealable: true,\n revealText: \"显示\",\n hideText: \"隐藏\",\n revealIcon: \"eye-o\",\n hideIcon: \"closed-eye\",\n focusOnReveal: true,\n hideOnBlur: false,\n revealWhenReadonly: false,\n placeholder: \"\",\n readonlyPlaceholder: \"-\",\n disabled: false,\n readonly: false,\n align: \"right\",\n className: \"\",\n })\n\n const emit = defineEmits<{\n \"update:value\": [value: string]\n \"update:revealed\": [revealed: boolean]\n change: [value: string]\n \"reveal-change\": [revealed: boolean]\n blur: [event: FocusEvent]\n }>()\n\n const inputRef = ref<InstanceType<typeof SchemxInput> | null>(null)\n const innerRevealed = ref(props.defaultRevealed)\n\n const rawValue = computed(() => String(props.value ?? \"\"))\n const isRevealed = computed(() => props.revealed ?? innerRevealed.value)\n const canReveal = computed(() => {\n if (!props.revealable || props.disabled) return false\n if (props.readonly && !props.revealWhenReadonly) return false\n\n return !isEmptyDisplayValue(rawValue.value)\n })\n\n const formattedValue = computed(() => {\n if (isEmptyDisplayValue(rawValue.value)) return \"\"\n\n return props.formatter ? props.formatter(rawValue.value) : rawValue.value\n })\n\n const maskedValue = computed(() => {\n if (isEmptyDisplayValue(rawValue.value)) return \"\"\n\n return props.maskFormatter(rawValue.value, {\n placeholder: props.placeholder,\n readonlyPlaceholder: props.readonlyPlaceholder,\n })\n })\n\n const displayValue = computed(() =>\n isRevealed.value && props.readonly ? formattedValue.value : maskedValue.value\n )\n\n const showInput = computed(() => isRevealed.value && !props.readonly && !props.disabled)\n\n const inputProps = computed(() => {\n const {\n value: _value,\n onChange: _onChange,\n revealed: _revealed,\n onRevealChange: _onRevealChange,\n defaultRevealed: _defaultRevealed,\n revealable: _revealable,\n revealText: _revealText,\n hideText: _hideText,\n revealIcon: _revealIcon,\n hideIcon: _hideIcon,\n focusOnReveal: _focusOnReveal,\n hideOnBlur: _hideOnBlur,\n revealWhenReadonly: _revealWhenReadonly,\n maskFormatter: _maskFormatter,\n ...rest\n } = props\n\n return rest\n })\n\n const showAriaLabel = computed(() => props.revealText || \"显示完整内容\")\n const hideAriaLabel = computed(() => props.hideText || \"隐藏完整内容\")\n\n const setRevealed = (next: boolean) => {\n if (props.revealed === undefined) {\n innerRevealed.value = next\n }\n\n props.onRevealChange?.(next)\n emit(\"update:revealed\", next)\n emit(\"reveal-change\", next)\n }\n\n const toggleReveal = () => {\n if (!canReveal.value) return\n\n const next = !isRevealed.value\n setRevealed(next)\n\n if (next && props.focusOnReveal && !props.readonly) {\n nextTick(() => inputRef.value?.focus?.())\n }\n }\n\n const handleInputChange = (value: string) => {\n props.onChange?.(value)\n emit(\"update:value\", value)\n emit(\"change\", value)\n }\n\n const handleInputBlur = (event: FocusEvent) => {\n props.onBlur?.(event)\n emit(\"blur\", event)\n\n if (props.hideOnBlur) {\n setRevealed(false)\n }\n }\n\n defineExpose({\n focus: () => inputRef.value?.focus?.(),\n blur: () => inputRef.value?.blur?.(),\n })\n</script>\n\n<style lang=\"scss\">\n .schemx-sensitive-input {\n width: 100%;\n }\n\n .schemx-sensitive-input__toggle {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n border: 0;\n padding: 0;\n color: var(--schemx-sensitive-input-action-color, #1989fa);\n font: inherit;\n line-height: inherit;\n background: transparent;\n cursor: pointer;\n }\n\n .schemx-sensitive-input__toggle:focus-visible {\n border-radius: 4px;\n outline: 2px solid var(--schemx-sensitive-input-focus-color, #1989fa);\n outline-offset: 2px;\n }\n</style>\n","export { default as InputRenderer } from \"./InputRenderer\"\nexport { default as TextRenderer } from \"./TextRenderer\"\nexport { default as TextAreaRenderer } from \"./TextAreaRenderer\"\nexport { default as CheckboxRenderer } from \"./CheckboxRenderer\"\nexport { default as DateRenderer } from \"./DateRenderer\"\nexport { default as CalendarRenderer } from \"./CalendarRenderer\"\nexport { default as NumberRenderer } from \"./NumberRenderer\"\nexport { default as PickerRenderer } from \"./PickerRenderer\"\nexport { default as RadioRenderer } from \"./RadioRenderer\"\nexport { default as RateRenderer } from \"./RateRenderer\"\nexport { default as SliderRenderer } from \"./SliderRenderer\"\nexport { default as StepperRenderer } from \"./StepperRenderer\"\nexport { default as SwitchRenderer } from \"./SwitchRenderer\"\nexport { default as UploadRenderer } from \"./UploadRenderer\"\nexport { default as CascaderRenderer } from \"./CascaderRenderer\"\nexport { default as SelectorRenderer } from \"./SelectorRenderer\"\nexport { default as SelectPickerRenderer } from \"./SelectPickerRenderer\"\nexport { default as SensitiveInputRenderer } from \"./SensitiveInputRenderer\"\n\nexport type { InputRendererProps, InputValue } from \"./InputRenderer\"\nexport type { TextRendererProps, TextValue } from \"./TextRenderer\"\nexport type {\n TextAreaRendererProps,\n TextAreaAutosize,\n TextAreaValue,\n} from \"./TextAreaRenderer\"\nexport type {\n CheckboxRendererProps,\n CheckboxOption,\n CheckboxValue,\n} from \"./CheckboxRenderer\"\nexport type { DateRendererProps, DateValue } from \"./DateRenderer\"\nexport type { CalendarRendererProps, CalendarValue } from \"./CalendarRenderer\"\nexport type { NumberRendererProps, NumberValue } from \"./NumberRenderer\"\nexport type { PickerRendererProps, PickerFieldNames, PickerValue } from \"./PickerRenderer\"\nexport type { RadioRendererProps, RadioOption, RadioValue } from \"./RadioRenderer\"\nexport type { RateRendererProps, RateValue } from \"./RateRenderer\"\nexport type { SliderRendererProps, SliderValue } from \"./SliderRenderer\"\nexport type { StepperRendererProps, StepperValue } from \"./StepperRenderer\"\nexport type { SwitchRendererProps, SwitchValue } from \"./SwitchRenderer\"\nexport type { UploadRendererProps, UploadFile, UploadValue } from \"./UploadRenderer\"\nexport type {\n CascaderRendererProps,\n CascaderFieldNames,\n CascaderValue,\n} from \"./CascaderRenderer\"\nexport type {\n SelectorRendererProps,\n SelectorOption,\n SelectorProps,\n SelectValue,\n} from \"./SelectorRenderer\"\nexport type {\n SelectPickerFieldNames,\n SelectPickerOption,\n SelectPickerRendererProps,\n SelectPickerValue,\n} from \"./SelectPickerRenderer\"\nexport type {\n SensitiveInputRendererProps,\n SensitiveInputValue,\n} from \"./SensitiveInputRenderer\"\n\n/**\n * 默认渲染器类型列表\n */\nexport const DEFAULT_RENDERER_TYPES = [\n \"input\",\n \"text\",\n \"textarea\",\n \"number\",\n \"switch\",\n \"radio\",\n \"checkbox\",\n \"date\",\n \"calendar\",\n \"picker\",\n \"selectPicker\",\n \"selector\",\n \"sensitiveInput\",\n \"rate\",\n \"slider\",\n \"stepper\",\n \"upload\",\n \"cascader\",\n] as const\n","/**\n * Vant 默认渲染器注册\n *\n * 导入 @schemx/vue 的全局 rendererRegistry 实例,\n * 将所有 Vant 渲染器注册进去。\n *\n * @module renderers/defaultRenderers\n */\n\nimport { rendererRegistry } from \"@schemx/vue\"\n\nimport {\n CalendarRenderer,\n CascaderRenderer,\n CheckboxRenderer,\n DateRenderer,\n InputRenderer,\n NumberRenderer,\n PickerRenderer,\n RadioRenderer,\n RateRenderer,\n SelectorRenderer,\n SensitiveInputRenderer,\n SelectPickerRenderer,\n SliderRenderer,\n StepperRenderer,\n SwitchRenderer,\n TextAreaRenderer,\n TextRenderer,\n UploadRenderer,\n} from \"../renderers\"\n\nrendererRegistry.registerAll({\n input: InputRenderer,\n text: TextRenderer,\n textarea: TextAreaRenderer,\n number: NumberRenderer,\n switch: SwitchRenderer,\n radio: RadioRenderer,\n checkbox: CheckboxRenderer,\n date: DateRenderer,\n calendar: CalendarRenderer,\n picker: PickerRenderer,\n selectPicker: SelectPickerRenderer,\n selector: SelectorRenderer,\n sensitiveInput: SensitiveInputRenderer,\n rate: RateRenderer,\n slider: SliderRenderer,\n stepper: StepperRenderer,\n upload: UploadRenderer,\n cascader: CascaderRenderer,\n})\n"],"names":["_createElementBlock","_openBlock","_hoisted_2","_renderSlot","_createTextVNode","_toDisplayString","_createElementVNode","_hoisted_3","_hoisted_4","_normalizeClass","_unref","_createVNode","$slots","_useModel","_createBlock","SchemxCell","_mergeProps","SchemxInput","option","_Fragment","_renderList","CheckboxRendererComponent","dateValue","PickerRendererComponent","RadioRendererComponent","_hoisted_1","Selector","SelectorRendererComponent","SelectPickerRendererComponent","InputRenderer","TextRenderer","TextAreaRenderer","NumberRenderer","SwitchRenderer","DateRenderer","CalendarRenderer","SensitiveInputRenderer","RateRenderer","SliderRenderer","StepperRenderer","UploadRenderer","CascaderRenderer"],"mappings":"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","x_google_ignoreList":[21]}
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .schemx-cell{display:flex;align-items:center;gap:6px;box-sizing:border-box;width:100%;color:var(--schemx-cell-text-color, #323233);font-size:var(--schemx-cell-font-size, 14px);line-height:var(--schemx-cell-line-height, 24px);background:transparent;border:0;outline:none;cursor:default}.schemx-cell--clickable{cursor:pointer}.schemx-cell--clickable:active{opacity:.72}.schemx-cell--clickable:focus-visible{border-radius:4px;outline:2px solid var(--schemx-cell-focus-color, #1989fa);outline-offset:2px}.schemx-cell--disabled{color:var(--schemx-cell-disabled-color, #c8c9cc);cursor:not-allowed}.schemx-cell--placeholder{color:var(--schemx-text-color-placeholder)}.schemx-cell__prefix,.schemx-cell__suffix{flex:none;color:inherit}.schemx-cell__value{flex:1 1 auto;min-width:0;color:inherit;word-break:break-word}.schemx-cell__value--left{text-align:left}.schemx-cell__value--right{text-align:right}.schemx-cell__value--center{text-align:center}.schemx-cell__arrow{flex:none;width:8px;height:8px;border-top:1px solid currentColor;border-right:1px solid currentColor;color:var(--schemx-cell-arrow-color, #969799);transform:rotate(45deg)}.schemx-input{display:flex;flex-direction:column;width:100%;font-size:var(--van-field-font-size, var(--van-font-size-md, 14px))}.schemx-input .van-field{padding:0}.schemx-text-renderer{display:flex;align-items:center;width:100%;padding:0}.schemx-text-renderer .schema-input{flex:1;min-width:0}.schemx-text-renderer__password-icon{color:var(--van-field-icon-color, #969799);font-size:18px;cursor:pointer}.schemx-text-renderer__password-icon:active{opacity:.7}.schemx-textarea-renderer{padding:0}.schemx-textarea-renderer .van-field__value .van-field__body{flex:1}.schemx-textarea-renderer .van-field__value .van-field__word-limit{--van-field-word-limit-color: #999999}.schemx-date-popup-renderer{height:45vh;border-radius:var(--van-popup-round-radius) var(--van-popup-round-radius) 0 0}.schemx-date-renderer .van-field{padding-inline:0}.schemx-calendar-popup-renderer{--van-calendar-popup-height: min(65vh, calc(80dvh - 96px) );border-radius:var(--van-popup-round-radius) var(--van-popup-round-radius) 0 0}.schemx-calendar-popup-renderer .van-calendar__body{height:calc(100% - 250px);flex:none}.schemx-calendar-popup-renderer .van-calendar__confirm{--van-calendar-confirm-button-height: 40px;border-radius:var(--schemx-border-radius-md)}.schemx-number-renderer{padding:0}.schemx-number-renderer .van-field__value .van-field__body{flex:1}.schemx-picker-popup-renderer{height:45%;border-radius:var(--van-popup-round-radius) var(--van-popup-round-radius) 0 0}.schemx-picker-renderer .van-field{padding-inline:0}.schemx-picker-renderer .van-field:after{display:none}.schemx-picker-empty{padding:40px 0;text-align:center;color:var(--van-text-color-3, #c8c9cc);font-size:14px}.schemx-rate-renderer__readonly{pointer-events:none}.schemx-slider-renderer__readonly{display:flex;align-items:center;min-height:24px}.schemx-slider-renderer__readonly-value{font-size:14px;font-weight:500}.schemx-slider-renderer .van-slider{margin:16px 0}.schemx-slider-renderer .van-slider__bar{background:linear-gradient(135deg,#667eea,#764ba2)}.schemx-slider-renderer .van-slider__button{border:2px solid #fff;box-shadow:0 2px 8px #00000026}.schemx-stepper-renderer__readonly{display:flex;align-items:center;min-height:28px}.schemx-stepper-renderer__readonly-value{font-size:14px;font-weight:500}.schemx-stepper-renderer .van-stepper__minus,.schemx-stepper-renderer .van-stepper__plus{border-radius:4px}.schemx-stepper-renderer .van-stepper__input{text-align:center;font-weight:500}.schemx-switch-renderer{display:flex;align-items:center}.schemx-upload-renderer .van-uploader__wrapper{justify-content:var(--schemx-content-align)}.schemx-cascader-popup-renderer{border-radius:var(--van-popup-round-radius) var(--van-popup-round-radius) 0 0}.schemx-cascader-renderer .van-field{padding-inline:0}.selector{display:flex;flex-wrap:wrap;gap:12px}.option{position:relative;min-width:70px;padding:4px 14px;border-radius:8px;background:#f3f4f6;color:#333;font-size:14px;text-align:center;line-height:20px;box-sizing:border-box;cursor:pointer}.option.active{background:#eaf2ff;color:#2f6bff}.schemx-select-picker-renderer .van-field{padding-inline:0}.schemx-select-picker-renderer .van-field:after{display:none}.schemx-select-picker-popup-renderer{max-height:65vh;border-radius:var(--van-popup-round-radius) var(--van-popup-round-radius) 0 0}.schemx-select-picker-popup-renderer .schemx-select-picker{position:relative;display:flex;flex-direction:column;height:50vh}.schemx-select-picker-popup-renderer .schemx-select-picker .schemx-select-picker-actions{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--van-border-color, #ebedf0)}.schemx-select-picker-popup-renderer .schemx-select-picker .schemx-select-picker-actions .schemx-select-picker-title{padding:var(--schemx-padding-md);text-align:center;font-size:16px;font-weight:500;line-height:24px}.schemx-select-picker-popup-renderer .schemx-select-picker .schemx-select-picker-options{min-height:calc(100% - 195px);overflow-y:auto;padding:var(--schemx-padding-xs) var(--schemx-padding-md);-webkit-overflow-scrolling:touch}.schemx-select-picker-popup-renderer .schemx-select-picker .schemx-select-picker-footer{flex-shrink:0;border-top:1px solid var(--van-border-color, #ebedf0);padding:var(--schemx-padding-sm) var(--schemx-padding-md) var(--schemx-padding-md)}.schemx-select-picker-popup-renderer .schemx-select-picker .schemx-select-picker-footer .van-button{--van-button-default-height: 40px;border-radius:var(--schemx-border-radius-md)}.schemx-select-picker-popup-renderer .schemx-select-picker .schemx-select-picker-empty{padding:40px 0;text-align:center;color:var(--van-text-color-3, #c8c9cc);font-size:14px}.schemx-select-picker-popup-renderer .schemx-select-picker .van-checkbox-group{display:flex;flex-direction:column;gap:10px}.schemx-select-picker-popup-renderer .schemx-select-picker .van-checkbox-group .van-radio,.schemx-select-picker-popup-renderer .schemx-select-picker .van-checkbox-group .van-checkbox{padding:10px 0;justify-content:space-between;flex-direction:row-reverse}.schemx-select-picker-popup-renderer .schemx-select-picker .van-checkbox-group .van-icon-success{display:flex;align-items:center;border:2px solid #e5e6eb}.schemx-select-picker-popup-renderer .schemx-select-picker .van-checkbox-group .van-checkbox__icon--checked .van-icon-success{border:2px solid var(--van-checkbox-checked-icon-color)}.schemx-sensitive-input{width:100%}.schemx-sensitive-input__toggle{display:inline-flex;align-items:center;gap:4px;border:0;padding:0;color:var(--schemx-sensitive-input-action-color, #1989fa);font:inherit;line-height:inherit;background:transparent;cursor:pointer}.schemx-sensitive-input__toggle:focus-visible{border-radius:4px;outline:2px solid var(--schemx-sensitive-input-focus-color, #1989fa);outline-offset:2px}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "type": "module",
3
+ "name": "@schemx/vant",
4
+ "version": "0.1.11-alpha.20260616152026.eac77d3",
5
+ "description": "基于 Vant 组件库的 schemx 渲染器适配包",
6
+ "keywords": [
7
+ "schemx",
8
+ "vant",
9
+ "vue",
10
+ "vue3",
11
+ "form",
12
+ "dynamic-form",
13
+ "json-schema"
14
+ ],
15
+ "homepage": "https://github.com/Jiohon/schemx/tree/main/packages/vant#readme",
16
+ "bugs": {
17
+ "url": "https://github.com/Jiohon/schemx/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/Jiohon/schemx.git",
22
+ "directory": "packages/vant"
23
+ },
24
+ "main": "./dist/index.cjs",
25
+ "module": "./dist/index.mjs",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "import": {
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.mjs"
32
+ },
33
+ "require": {
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.cjs"
36
+ }
37
+ }
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md"
42
+ ],
43
+ "peerDependencies": {
44
+ "vant": "^4.0.0",
45
+ "vue": "^3.0.0"
46
+ },
47
+ "dependencies": {
48
+ "classnames": "^2.5.1",
49
+ "dayjs": "^1.11.19",
50
+ "es-toolkit": "^1.47.0",
51
+ "@schemx/core": "0.1.23",
52
+ "@schemx/vue": "0.1.20"
53
+ },
54
+ "license": "MIT",
55
+ "devDependencies": {
56
+ "@vue/test-utils": "^2.4.6",
57
+ "vant": "^4.9.0",
58
+ "vue": "^3.4.0"
59
+ },
60
+ "scripts": {
61
+ "build": "vite build",
62
+ "test": "vitest run --passWithNoTests",
63
+ "lint": "eslint \"src/**/*.{ts,tsx,vue,js,jsx}\""
64
+ }
65
+ }