跳转到内容

FileUpload 文件上传 ​

选择文件、拖放文件,并列出已选与已上传的文件。

用法 ​

投放区自身就是一个大按钮,隐藏输入是必备部件,缺少它无法选择文件

把文件拖到这里或者用下面的按钮挑一个

组件结构 ​

加粗的是必需部件。

data-scope="file-upload":root · label · dropzone · trigger · hidden-input · list · item · item-name · item-size-text · item-preview · item-progress · item-delete-trigger · clear-trigger

示例 ​

限制与拒收 ​

accept / maxFiles / maxFileSize 越界的当场被拒绝,file-reject 逐个报告理由

只收图片,最多 3 张单张不超过 512 KB

受控 ​

传入 files 后由宿主决定,组件自身不再落值,只发 files-change 报告意图

选进来的文件由外部数组保管
宿主持有 0 个文件

禁用 ​

disabled 把投放区、触发器与隐藏输入一并关停,拖拽进入也不再接收

当前不接受上传

预置列表 ​

defaultFiles 给出挂载时已存在的文件,之后列表照常由组件自行保管,删除与清空都照常

已经带了两份进来再拖几份也收,最多 4 份
合同正文.txt54 B
交付说明.md34 B

选择整个目录 ​

directory 使隐藏输入改为接收目录,选中目录下的文件一次性全部进入,数量上限要随之放开

挑一个目录,里面的文件全收

缩略图墙 ​

item-preview 是一个空方框,作者可放置任意内容;放入的图片会被裁为方格,一行排几张由外层网格决定

把图片拖进来,最多 6 张

宿主自定义的准入 ​

组件只管理 accept 与大小数量这几条通用规则,其他规则由宿主在受控列表中再筛一遍:这里同名文件只保留最先到达的一份

同名文件只留最先来的那份

上传生命周期 ​

提供一个 upload 实现后组件即为上传器:接收即开始上传(auto-upload 可关闭为手动),进度、成败与返回地址都在每条的传输快照中,失败可一键重试

拖进来或点击选择,收下即开传

试试选一个文件名带「坏」字的文件,看失败与重试。

列表项上的下载 ​

条目中放置什么由作者决定:一条普通的 a[download] 就是下载入口;需要自行接管时换为按钮,在处理器中自行获取

放几份文件进来,每条后面就带上下载口

服务器附件回显 ​

remote-files 承载编辑表单中已存在的附件:与本地文件同列渲染(allFiles 远程在前)、占用 max-files 名额,删除经 remote-files-change 由宿主落库

拖进来或点击选择
合同扫描件.pdf373 KB查看
报价单.xlsx50 KB查看

剩余名额与新选文件共享;删除服务器附件只改 remote-files,落库由宿主决定。

设计指引 ​

何时使用 ​

  • 需要用户提交文件的场景。
  • 需要预览、限制类型与大小,或选择整个目录。

何时不用 ​

  • 只展示已有附件、不允许新增时,使用列表。

特性 ​

  • 超出 maxFiles / maxFileSize / minFileSize 的文件立即被拒绝,onFileReject 逐个报告原因。
  • autoUpload 决定选择后立即上传还是等待提交。
  • remoteFiles 回显服务器上已有的附件,与本次新选的文件并列在同一个列表中。
  • 上传生命周期(完成、失败)各有回调;宿主还可以插入自定义的准入判断。

组合 ​

最佳实践 ​

  • 在界面上说明允许的类型与大小上限,不等用户选择后才拒绝。
  • 拒绝时说明是哪个文件、原因是什么。

反模式 ​

  • 只在前端校验,不在后端校验。
  • 上传中不显示进度也不能取消。

API 参考 ​

产物 ​

层值
自定义元素<xh-file-upload>
Vue 组件XhFileUploadClearTrigger XhFileUploadDropzone XhFileUploadHiddenInput XhFileUploadItem XhFileUploadItemDeleteTrigger XhFileUploadItemName XhFileUploadItemPreview XhFileUploadItemProgress XhFileUploadItemSizeText XhFileUploadLabel XhFileUploadList XhFileUploadRoot XhFileUploadTrigger
组合式函数useFileUpload
状态机fileUploadMachine
皮肤@xihan-ui/styles/file-upload.css

Props ​

属性类型必填说明
acceptstring | string[]允许的类型,写法与原生 input 的 accept 一致: 接受 'image/*' 这类通配、'.png' 这类扩展名、'application/pdf' 这类精确 MIME, 逗号分隔的整串或数组两种形态均可(属性只能表达整串,数组需通过 property)。
maxFilesnumber最多保留的文件数,默认 1。提供 Infinity 即不限。
maxFileSizenumber单个文件的字节上限,默认不限。
minFileSizenumber单个文件的字节下限,默认 0(拦截 0 字节的空文件可设为 1)。
disabledboolean
invalidboolean校验失败标注;只作用于样式与 data-invalid,不阻断接收文件。
namestring表单字段名;提供后隐藏输入才参与提交。
filesFile[]已选文件。提供即受控:cell 直读 prop,写入只发 onFilesChange 不落内部值。
defaultFilesFile[]
allowDropboolean是否接受拖拽投放,默认 true。关闭后投放区不再拦截默认行为,也不再输出 data-dragging。
directoryboolean选择目录而不是文件(隐藏输入带 webkitdirectory)。
capture'user' | 'environment'移动端直接调用摄像头 / 麦克风采集。
remoteFilesFileUploadRemoteFile[]服务器已有附件(编辑表单回显)。提供即受控:cell 直读 prop,删改只发 onRemoteFilesChange 不落内部值。条目计入 maxFiles 总量,与本地文件一起渲染。
defaultRemoteFilesFileUploadRemoteFile[]
upload(request: FileUploadRequest) => Promise<FileUploadResult | undefined | void> | FileUploadResult | undefined | void每个文件的传输实现。提供后组件才是上传器:接受的文件按 autoUpload 自动开始传输, 进度、成败与返回地址都记入该文件的传输快照。未提供时保持纯选择器。
autoUploadboolean接受后即自动开始传输,默认 true;关闭后由 api.startUpload 逐个开始。
translationsPartial<FileUploadTranslations>
onFilesChange(details: FileUploadFilesChangeDetails) => void列表变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。
onFileAccept(details: FileUploadFileAcceptDetails) => void本次接受了哪些文件。受控与否都发出:宿主据此发起上传。
onFileReject(details: FileUploadFileRejectDetails) => void本次拒绝了哪些文件及各自的原因。
onRemoteFilesChange(details: FileUploadRemoteFilesChangeDetails) => void远程附件列表变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。
onUploadComplete(details: FileUploadCompleteDetails) => void单个文件传输完成(upload 的 Promise 兑现)。
onUploadError(details: FileUploadErrorDetails) => void单个文件传输失败(upload 的 Promise 拒绝);中止不视为失败,不发出。

FileUploadRemoteFile ​

remoteFiles 的元素。

字段类型必填说明
idstring是稳定标识(通常是服务端主键),删除与去重都以它为准。
namestring是
sizenumber字节数;未提供时不显示大小。
typestringMIME 类型。
urlstring

事件 ​

自定义元素将载荷放在 detail;Vue 使用同名 emit。

事件载荷说明
files-changeFileUploadFilesChangeDetails列表变化;detail 为 { files: File[] }
remote-files-changeFileUploadRemoteFilesChangeDetails远程附件列表变化;detail 为 { files: FileUploadRemoteFile[] }
upload-completeFileUploadCompleteDetails单个文件传输完成;detail 为 { file, url? }
upload-errorFileUploadErrorDetails单个文件传输失败;detail 为 { file, error }
file-acceptFileUploadFileAcceptDetails本次接受了哪些文件;detail 为 { files: File[] }
file-rejectFileUploadFileRejectDetails本次拒绝了哪些文件及各自的原因;detail 为 { files: { file, reasons }[] }

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhFileUploadRootdefaultFileUploadRootSlotProps

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhFileUploadItemfileFileUploadFile该行显示哪个文件(本地或远程附件)。
XhFileUploadItemindexnumber | string改用下标从 allFiles(远程在前、本地在后)中取文件,兼收字符串。
XhFileUploadRootchildrenSlotChildren<FileUploadRootSlotProps>

状态 ​

公开状态写入 data-state。

部件取值
itemuploadOf(file)?.status
item-progressuploadOf(file)?.status

以下名称仅用于内部状态机。

状态:idle · dragging

事件:FILES.SET · FILES.ADD · FILE.DELETE · FILES.CLEAR · PICKER.OPEN · DRAG.OVER · DRAG.LEAVE · DROP · UPLOAD.START · REMOTE.DELETE · FORM.RESET · PRESS.START · PRESS.END

判据:canChange · canDrop

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
acceptedFilesFile[]
remoteFilesFileUploadRemoteFile[]服务器已有附件。
allFilesFileUploadFile[]渲染顺序的完整列表:远程在前、本地在后。
draggingboolean有内容正悬停在投放区上方。
disabledboolean
invalidboolean
emptyboolean没有任何文件。清空按钮据此写 data-empty,空列表据此显示占位。
maxFilesnumber生效的数量上限(已按默认值与非法值归一)。
getFileSizeText(file: FileUploadFile) => string字节数格式化为可读形式,供作者渲染 item-size-text;远程附件未报大小时为空串。
uploadOf(file: FileUploadFile) => FileUploadSnapshot | null该条目的传输快照:远程附件恒为 done;本地文件未配置 upload 时为 null, 已配置而尚未开始传输时为 idle。
startUpload(file: File) => void手动开始传输(autoUpload 关闭时)或失败后重试;不在列表中或传输中的文件调用无效。
setFiles(files: File[]) => void
addFiles(files: File[]) => void
deleteFile(file: FileUploadFile) => void本地文件按引用移除(传输中会中止),远程附件按 id 移除。
clear() => void清空整份列表(本地与远程一起)。
openFilePicker() => void
getRootProps() => T['element']
getLabelProps() => T['label']
getDropzoneProps() => T['element']
getTriggerProps() => T['button']
getHiddenInputProps() => T['input']
getListProps() => T['element']
getItemProps(props: FileUploadItemProps) => T['element']
getItemNameProps(props: FileUploadItemProps) => T['element']
getItemSizeTextProps(props: FileUploadItemProps) => T['element']
getItemPreviewProps(props: FileUploadItemProps) => T['element']
getItemProgressProps(props: FileUploadItemProps) => T['element']该条目的传输进度条,纯装饰;进度比例写在私有槽上供皮肤计算宽度。
getItemDeleteTriggerProps(props: FileUploadItemProps) => T['button']
getClearTriggerProps() => T['button']

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
Tab / Shift+Tabfocus outside / inside the component投放区、选择按钮、每条的删除按钮与清空按钮各占一个 Tab 位;禁用时投放区退出 Tab 序列,几个原生按钮带 disabled 本就不可聚焦
Enter / Spacefocus on dropzone打开系统文件选择框。投放区是 div,浏览器不会替它把这两个键合成成一次点击,连接层自己接管(并拦下空格滚屏)
Enter / Spacefocus on trigger打开系统文件选择框(原生 button 的默认激活)
Enter / Spacefocus on item-delete-trigger把这一条从列表里删掉(原生 button 的默认激活)
Enter / Spacefocus on clear-trigger清空整份列表(原生 button 的默认激活);列表为空时按钮照常在位、可聚焦,激活是空操作
Enter / Spaceheld on trigger / item-delete-trigger / clear-trigger, not disabled按住期间该按钮投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下(选择钮打开系统文件框即失焦),删除钮随文件离开列表时一并撤下

ARIA ​

以下属性由 connect 生成。

部件属性值
dropzonearia-disabled'true' | 'false'
dropzonearia-labellabel.dropzone
dropzonearia-labelledbylabel 部件的 id
dropzonerole'button'
listrole'list'
itemrole'listitem'
item-previewaria-hidden'true'
item-progressaria-hidden'true'
item-delete-triggeraria-labellabel.deleteItem(file)
clear-triggeraria-labellabel.clearTrigger

样式参考 ​

皮肤 ​

@xihan-ui/styles/file-upload.css 使用 [data-scope="file-upload"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides。

forced-colors: active 下另有一套规则:颜色交给系统,边框与状态标记改用系统色关键字。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-disabled''(条件成立时才出现)
rootdata-dragging''(条件成立时才出现)
rootdata-empty''(条件成立时才出现)
rootdata-invalid''(条件成立时才出现)
labeldata-disabled''(条件成立时才出现)
dropzonedata-disabled''(条件成立时才出现)
dropzonedata-dragging''(条件成立时才出现)
dropzonedata-invalid''(条件成立时才出现)
triggerdata-disabled''(条件成立时才出现)
triggerdata-pressed''(条件成立时才出现)
listdata-disabled''(条件成立时才出现)
listdata-empty''(条件成立时才出现)
itemdata-disabled''(条件成立时才出现)
itemdata-file-namefile.name
itemdata-file-sizeundefined | String(file.size) | String(file.size)
itemdata-remote''(条件成立时才出现)
itemdata-stateuploadOf(file)?.status
item-namedata-disabled''(条件成立时才出现)
item-size-textdata-disabled''(条件成立时才出现)
item-size-textdata-file-sizeundefined | String(file.size) | String(file.size)
item-previewdata-disabled''(条件成立时才出现)
item-previewdata-file-type(isRemote(file) ? file.type ?? '' : file.type) || 'un…
item-progressdata-disabled''(条件成立时才出现)
item-progressdata-stateuploadOf(file)?.status
item-delete-triggerdata-disabled''(条件成立时才出现)
item-delete-triggerdata-pressed''(条件成立时才出现)
clear-triggerdata-disabled''(条件成立时才出现)
clear-triggerdata-empty''(条件成立时才出现)
clear-triggerdata-pressed''(条件成立时才出现)

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-file-upload-clear-bg-activeclear-triggerbackgroundis(:active, [data-pressed])
not(:disabled)
pressed
--xh-bg-subtle-activefile-upload 的 clear-trigger 部件 background 覆盖槽。
--xh-file-upload-clear-bg-hoverclear-triggerbackgroundhover
not(:disabled)
--xh-bg-subtle-hoverfile-upload 的 clear-trigger 部件 background 覆盖槽。
--xh-file-upload-clear-fgclear-triggercolordefault--xh-fg-mutedfile-upload 的 clear-trigger 部件 color 覆盖槽。
--xh-file-upload-clear-fg-hoverclear-triggercolorhover
not(:disabled)
--xh-fg-defaultfile-upload 的 clear-trigger 部件 color 覆盖槽。
--xh-file-upload-clear-font-sizeclear-triggerfont-sizedefault--xh-text-caption-sizefile-upload 的 clear-trigger 部件 font-size 覆盖槽。
--xh-file-upload-clear-gapclear-triggergapdefault--xh-control-gap-smfile-upload 的 clear-trigger 部件 gap 覆盖槽。
--xh-file-upload-clear-hclear-triggerblock-sizedefault--xh-control-h-smfile-upload 的 clear-trigger 部件 block-size 覆盖槽。
--xh-file-upload-clear-pxclear-triggerpadding-inlinedefault--xh-control-px-smfile-upload 的 clear-trigger 部件 padding-inline 覆盖槽。
--xh-file-upload-clear-radiusclear-triggerborder-radiusdefault--xh-shape-controlfile-upload 的 clear-trigger 部件 border-radius 覆盖槽。
--xh-file-upload-delete-bg-activeitem-delete-triggerbackgroundis(:active, [data-pressed])
not(:disabled)
pressed
--xh-bg-subtle-activefile-upload 的 item-delete-trigger 部件 background 覆盖槽。
--xh-file-upload-delete-bg-hoveritem-delete-triggerbackgroundhover
not(:disabled)
--xh-bg-subtle-hoverfile-upload 的 item-delete-trigger 部件 background 覆盖槽。
--xh-file-upload-delete-fgitem-delete-triggercolordefault--xh-fg-mutedfile-upload 的 item-delete-trigger 部件 color 覆盖槽。
--xh-file-upload-delete-fg-hoveritem-delete-triggercolorhover
not(:disabled)
--xh-fg-danger-hoverfile-upload 的 item-delete-trigger 部件 color 覆盖槽。
--xh-file-upload-delete-radiusitem-delete-triggerborder-radiusdefault--xh-shape-controlfile-upload 的 item-delete-trigger 部件 border-radius 覆盖槽。
--xh-file-upload-delete-sizeitem-delete-triggerblock-size
inline-size
default--xh-control-action-sizefile-upload 的 item-delete-trigger 部件 block-size、inline-size 覆盖槽。
--xh-file-upload-dropzone-bgdropzonebackgrounddefaulttransparentfile-upload 的 dropzone 部件 background 覆盖槽。
--xh-file-upload-dropzone-bg-disableddropzonebackgrounddisabled--xh-bg-subtlefile-upload 的 dropzone 部件 background 覆盖槽。
--xh-file-upload-dropzone-bg-draggingdropzonebackgrounddragging--xh-bg-subtlefile-upload 的 dropzone 部件 background 覆盖槽。
--xh-file-upload-dropzone-bg-hoverdropzonebackgrounddisabled
dragging
hover
invalid
not([data-disabled], [data-invalid], [data-dragging])
--xh-bg-subtlefile-upload 的 dropzone 部件 background 覆盖槽。
--xh-file-upload-dropzone-borderdropzoneborderdefault--xh-border-controlfile-upload 的 dropzone 部件 border 覆盖槽。
--xh-file-upload-dropzone-border-draggingdropzoneborder-colordragging--xh-bg-brandfile-upload 的 dropzone 部件 border-color 覆盖槽。
--xh-file-upload-dropzone-border-focusdropzoneborder-colordisabled
dragging
focus-visible
invalid
not([data-disabled], [data-invalid], [data-dragging])
--xh-_tonefile-upload 的 dropzone 部件 border-color 覆盖槽。
--xh-file-upload-dropzone-border-hoverdropzoneborder-colordisabled
dragging
hover
invalid
not([data-disabled], [data-invalid], [data-dragging])
--xh-border-control-hoverfile-upload 的 dropzone 部件 border-color 覆盖槽。
--xh-file-upload-dropzone-border-invaliddropzoneborder-colorinvalid--xh-border-invalidfile-upload 的 dropzone 部件 border-color 覆盖槽。
--xh-file-upload-dropzone-fgdropzonecolordefault--xh-fg-mutedfile-upload 的 dropzone 部件 color 覆盖槽。
--xh-file-upload-dropzone-font-sizedropzonefont-sizedefault--xh-text-body-sizefile-upload 的 dropzone 部件 font-size 覆盖槽。
--xh-file-upload-dropzone-gapdropzonegapdefault--xh-space-2file-upload 的 dropzone 部件 gap 覆盖槽。
--xh-file-upload-dropzone-min-hdropzonemin-block-sizedefault8remfile-upload 的 dropzone 部件 min-block-size 覆盖槽。
--xh-file-upload-dropzone-pxdropzonepadding-inlinedefault--xh-space-4file-upload 的 dropzone 部件 padding-inline 覆盖槽。
--xh-file-upload-dropzone-pydropzonepadding-blockdefault--xh-space-5file-upload 的 dropzone 部件 padding-block 覆盖槽。
--xh-file-upload-dropzone-radiusdropzoneborder-radiusdefault--xh-shape-surfacefile-upload 的 dropzone 部件 border-radius 覆盖槽。
--xh-file-upload-gaprootgapdefault--xh-space-3file-upload 的 root 部件 gap 覆盖槽。
--xh-file-upload-icon-sizeroot--xh-icon-sizedefault--xh-glyph-size-textfile-upload 的 root 部件 --xh-icon-size 覆盖槽。
--xh-file-upload-item-bgitembackgrounddefault--xh-bg-surfacefile-upload 的 item 部件 background 覆盖槽。
--xh-file-upload-item-borderitemborderdefault--xh-border-defaultfile-upload 的 item 部件 border 覆盖槽。
--xh-file-upload-item-border-erroritemborder-colorstate=error--xh-border-invalidfile-upload 的 item 部件 border-color 覆盖槽。
--xh-file-upload-item-fgitemcolordefault--xh-fg-defaultfile-upload 的 item 部件 color 覆盖槽。
--xh-file-upload-item-fg-doneitembackground-colorstate=done--xh-fg-successfile-upload 的 item 部件 background-color 覆盖槽。
--xh-file-upload-item-fg-erroritemcolorstate=error--xh-fg-dangerfile-upload 的 item 部件 color 覆盖槽。
--xh-file-upload-item-font-sizeitemfont-sizedefault--xh-text-body-sizefile-upload 的 item 部件 font-size 覆盖槽。
--xh-file-upload-item-gaplistgapdefault--xh-space-2file-upload 的 list 部件 gap 覆盖槽。
--xh-file-upload-item-inner-gapitemgapdefault--xh-control-gap-mdfile-upload 的 item 部件 gap 覆盖槽。
--xh-file-upload-item-mark-sizeitemblock-size
inline-size
state=done
state=error
--xh-control-indicator-sizefile-upload 的 item 部件 block-size、inline-size 覆盖槽。
--xh-file-upload-item-name-min-witem-namemin-inline-sizedefault--xh-control-min-wfile-upload 的 item-name 部件 min-inline-size 覆盖槽。
--xh-file-upload-item-progress-fillitem-progressbackgroundstate=uploading--xh-bg-brandfile-upload 的 item-progress 部件 background 覆盖槽。
--xh-file-upload-item-progress-hitem-progressblock-sizedefault--xh-stroke-thickfile-upload 的 item-progress 部件 block-size 覆盖槽。
--xh-file-upload-item-progress-radiusitem-progressborder-radiusdefault--xh-shape-pillfile-upload 的 item-progress 部件 border-radius 覆盖槽。
--xh-file-upload-item-progress-trackitem-progressbackgrounddefault--xh-bg-subtlefile-upload 的 item-progress 部件 background 覆盖槽。
--xh-file-upload-item-progress-witem-progressinline-sizedefault--xh-control-h-mdfile-upload 的 item-progress 部件 inline-size 覆盖槽。
--xh-file-upload-item-pxitempadding-inlinedefault--xh-space-3file-upload 的 item 部件 padding-inline 覆盖槽。
--xh-file-upload-item-pyitempadding-blockdefault--xh-space-2file-upload 的 item 部件 padding-block 覆盖槽。
--xh-file-upload-item-radiusitemborder-radiusdefault--xh-shape-controlfile-upload 的 item 部件 border-radius 覆盖槽。
--xh-file-upload-label-fglabelcolordefault--xh-fg-defaultfile-upload 的 label 部件 color 覆盖槽。
--xh-file-upload-label-fg-disabledlabelcolordisabled--xh-fg-subtlefile-upload 的 label 部件 color 覆盖槽。
--xh-file-upload-label-font-sizelabelfont-sizedefault--xh-text-label-sizefile-upload 的 label 部件 font-size 覆盖槽。
--xh-file-upload-label-font-weightlabelfont-weightdefault--xh-text-label-weightfile-upload 的 label 部件 font-weight 覆盖槽。
--xh-file-upload-list-max-hlistmax-block-sizedefault--xh-viewport-h-mdfile-upload 的 list 部件 max-block-size 覆盖槽。
--xh-file-upload-preview-bgitem-previewbackgrounddefault--xh-bg-subtlefile-upload 的 item-preview 部件 background 覆盖槽。
--xh-file-upload-preview-fgitem-previewcolordefault--xh-fg-mutedfile-upload 的 item-preview 部件 color 覆盖槽。
--xh-file-upload-preview-fg-imageitem-previewcolorfile-type=image/--xh-fg-brandfile-upload 的 item-preview 部件 color 覆盖槽。
--xh-file-upload-preview-radiusitem-previewborder-radiusdefault--xh-shape-controlfile-upload 的 item-preview 部件 border-radius 覆盖槽。
--xh-file-upload-preview-sizeitem-previewblock-size
inline-size
default--xh-control-h-mdfile-upload 的 item-preview 部件 block-size、inline-size 覆盖槽。
--xh-file-upload-size-fgitem-size-textcolordefault--xh-fg-subtlefile-upload 的 item-size-text 部件 color 覆盖槽。
--xh-file-upload-size-font-sizeitem-size-textfont-sizedefault--xh-text-caption-sizefile-upload 的 item-size-text 部件 font-size 覆盖槽。
--xh-file-upload-trigger-bgtriggerbackgrounddefault--xh-bg-surfacefile-upload 的 trigger 部件 background 覆盖槽。
--xh-file-upload-trigger-bg-activetriggerbackgroundis(:active, [data-pressed])
not(:disabled)
pressed
--xh-bg-subtle-activefile-upload 的 trigger 部件 background 覆盖槽。
--xh-file-upload-trigger-bg-hovertriggerbackgroundhover
not(:disabled)
--xh-bg-subtle-hoverfile-upload 的 trigger 部件 background 覆盖槽。
--xh-file-upload-trigger-bordertriggerborderdefault--xh-border-controlfile-upload 的 trigger 部件 border 覆盖槽。
--xh-file-upload-trigger-fgtriggercolordefault--xh-fg-defaultfile-upload 的 trigger 部件 color 覆盖槽。
--xh-file-upload-trigger-font-sizetriggerfont-sizedefault--xh-text-body-sizefile-upload 的 trigger 部件 font-size 覆盖槽。
--xh-file-upload-trigger-gaptriggergapdefault--xh-control-gap-mdfile-upload 的 trigger 部件 gap 覆盖槽。
--xh-file-upload-trigger-htriggerblock-sizedefault--xh-control-h-mdfile-upload 的 trigger 部件 block-size 覆盖槽。
--xh-file-upload-trigger-pxtriggerpadding-inlinedefault--xh-control-px-mdfile-upload 的 trigger 部件 padding-inline 覆盖槽。
--xh-file-upload-trigger-radiustriggerborder-radiusdefault--xh-shape-controlfile-upload 的 trigger 部件 border-radius 覆盖槽。
--xh-file-upload-trigger-shadow-hovertriggerbox-shadowhover
not(:disabled)
--xh-elevation-raisedfile-upload 的 trigger 部件 box-shadow 覆盖槽。

动效 ​

动效角色:按压 · 状态 · 指示与换位(见动效规范)。

background-color · border-color · box-shadow · scale · translate 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

系统开启减弱动效时由令牌层统一收敛,皮肤不另作判断。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像;另有按 dir 分支的规则。

Released under The MIT License