kitseed.
组件

Image Lightbox 图片预览

完整看图、放大细节,或按宽度阅读一张长截图。

用于阅读器、媒体列表与附件中的全屏看图。图片与操作保持清楚的层次,缩放后可以拖动到每个边角;长截图使用按宽度显示,保留从头到尾的阅读路径。

安装

pnpm dlx shadcn@4.22.1 add http://127.0.0.1:3040/r/v0.3.0/image-lightbox.json

首次使用请先完成 Registry 与主题接入。

源码与 CSS module 一起安装。预览自身使用独立深色表面,不依赖宿主主题,也不改变页面的字体、主题或永久滚动规则。

Props 与默认行为

属性类型默认值说明
itemsreadonly ImageLightboxItem[]必填每项提供稳定 id、src 与可选 alt;缺失地址显示不可用状态
open / onOpenChangeboolean / (open) => void必填由宿主管理开关
initialIndexnumber0每次打开的初始图片;超出范围时取有效位置
fit"contain" | "width""contain"完整显示,或按可用宽度阅读长截图
loopbooleantrue关闭后首尾停止切换,按钮正确禁用
finalFocusBase UI Popup 的焦点目标打开前的焦点关闭后回到实际触发按钮
keyboardShortcutsbooleantrue内置方向键、+ / =、-;产品自带快捷键系统时设为 false
labelsPartial<ImageLightboxLabels>中文覆盖按钮、加载、失败与读屏文案,包括计数函数
onRetry(item) => void | Promise<void>—宿主刷新地址或重试权限;等待期间禁止重复点击,失败保留错误态
renderAction({ action, disabled, button }) => ReactNode原生提示为现成按钮包装产品快捷键提示,保留事件、ref 与原生禁用语义
refRef<ImageLightboxHandle>—获取弹窗元素、切图/缩放/复位方法及实时可用状态

contain 的缩放范围为 1–4 倍,width 为 0.5–4 倍;按钮每次调整 0.5,捏合连续缩放。百分比相对于当前适配方式,点击比例可复位。重新打开、换图或地址更新时恢复初始视图。

键盘、触控与焦点

左右方向键切图,+ / = 放大,- 缩小。输入、输入法组合与修饰键不会触发内置图片快捷键。Escape 关闭预览;宿主接入快捷键提示时,第一次 Escape 先关闭提示。焦点始终留在模态中,关闭后返回触发位置。

图片画布可通过 Tab 聚焦。聚焦画布后,方向键滚动可溢出的图片,PageUp / PageDown 按页滚动,Home / End 到开头或结尾;工具栏和切图按钮仍可通过 Tab 操作。

双击或触屏双击切换 1 / 2 倍;放大后用拖动、滚轮或滚动条查看细节。触屏单指平移、双指捏合仅作用于图片视口。只在 contain 且 1 倍时识别明确的横向滑动;长图、纵向拖动、取消手势和多指手势不会误翻页。

数据更新与业务边界

重排保留当前 ID;当前项移除后显示原位置的相邻项,移除最后一项时选择前一项;集合清空时通知关闭。旧图片的迟到加载或失败事件不会污染当前图片。

鉴权、私有附件地址、桌面媒体代理和翻译均由宿主提供。组件只消费可呈现地址,不额外抓取、缓存或预加载私有附件。重试回调可以更新 src,组件会重新加载并隔离旧请求结果。

来源与版本

0.3.0 本地候选,提取自 Subtic 的内容图片预览与反馈附件预览。两种预览统一为一套交互;内容媒体映射、反馈权限、重试参数及用户快捷键偏好留在 Subtic。

查看由当前源码生成的类型参考

只展示 Kitseed 自身定义的属性,原生 HTML 与 Base UI 透传属性请参阅对应上游说明。

ImageLightbox

属性类型默认值
itemsreadonly ImageLightboxItem[]—
openboolean—
onOpenChange(open: boolean) => void—
initialIndex?number0
finalFocus?ComponentProps<typeof Dialog.Popup>["finalFocus"]—
loop?booleantrue
fit?"contain" | "width""contain"
keyboardShortcuts?booleantrue
ref?Ref<ImageLightboxHandle>—
labels?Partial<ImageLightboxLabels>—
onRetry?(item: ImageLightboxItem) => void | Promise<void>—
renderAction?(props: { action: ImageLightboxAction; disabled: boolean; button: ReactElement; }) => ReactNode—

本页内容