移到回收站?
文档仍可在回收站中恢复。
将「设计规范.md」移到回收站,不会影响已分享的副本。
保存工作区
为下次打开保留当前布局。
保留已打开的文档、侧栏布局与当前外观设置。
发布前预览
检查内容,确认后再继续。
现代设计规范:让材质、排版和交互保持一致。
从按钮和菜单到完整的工作区,以清楚的层级承载内容,让操作自然出现。
文档详情
设计规范 · 今天更新
所有者:设计团队
可见范围:仅工作区成员
<div class="demo-row"> <button class="icen-btn" data-icen-modal-open="demo-modal-sm">小号对话框</button> <button class="icen-btn" data-icen-modal-open="demo-modal-md">默认对话框</button> <button class="icen-btn" data-icen-modal-open="demo-modal-lg">大号对话框</button> <button class="icen-btn" data-icen-modal-open="demo-sheet-right">右侧 Sheet</button></div><div class="icen-modal-backdrop" data-icen-modal="demo-modal-sm" hidden> <div class="icen-modal icen-modal--sm"> <div class="icen-modal-header"> <div> <h3 class="icen-modal-title">移到回收站?</h3> <p class="icen-modal-description">文档仍可在回收站中恢复。</p> </div> <button class="icen-modal-close" data-icen-modal-close aria-label="关闭"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" focusable="false" class="icen-symbol" aria-hidden="true"><path d="M6 6l8 8M14 6l-8 8"></path></svg></button> </div> <div class="icen-modal-body"> <p>将「设计规范.md」移到回收站,不会影响已分享的副本。</p> </div> <div class="icen-modal-footer"> <button class="icen-btn icen-btn-sm" data-icen-modal-close>取消</button> <button class="icen-btn icen-btn-sm icen-btn-primary" data-icen-modal-close data-demo-modal-action="已移到回收站(演示)">移到回收站</button> </div> </div></div><div class="icen-modal-backdrop" data-icen-modal="demo-modal-md" hidden> <div class="icen-modal"> <div class="icen-modal-header"> <div> <h3 class="icen-modal-title">保存工作区</h3> <p class="icen-modal-description">为下次打开保留当前布局。</p> </div> <button class="icen-modal-close" data-icen-modal-close aria-label="关闭"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" focusable="false" class="icen-symbol" aria-hidden="true"><path d="M6 6l8 8M14 6l-8 8"></path></svg></button> </div> <div class="icen-modal-body"> <label class="icen-form-label" for="modal-workspace-name">工作区名称</label><div class="icen-input-wrap"><input class="icen-input" id="modal-workspace-name" value="设计工作区" autofocus required maxlength="40" /></div> <p>保留已打开的文档、侧栏布局与当前外观设置。</p> </div> <div class="icen-modal-footer"> <button class="icen-btn icen-btn-sm" data-icen-modal-close>取消</button> <button class="icen-btn icen-btn-sm icen-btn-primary" data-icen-modal-close data-demo-modal-action="工作区已保存(演示)">保存</button> </div> </div></div><div class="icen-modal-backdrop" data-icen-modal="demo-modal-lg" hidden> <div class="icen-modal icen-modal--lg"> <div class="icen-modal-header"> <div> <h3 class="icen-modal-title">发布前预览</h3> <p class="icen-modal-description">检查内容,确认后再继续。</p> </div> <button class="icen-modal-close" data-icen-modal-close aria-label="关闭"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" focusable="false" class="icen-symbol" aria-hidden="true"><path d="M6 6l8 8M14 6l-8 8"></path></svg></button> </div> <div class="icen-modal-body"> <p>现代设计规范:让材质、排版和交互保持一致。</p> <p>从按钮和菜单到完整的工作区,以清楚的层级承载内容,让操作自然出现。</p> </div> <div class="icen-modal-footer"> <button class="icen-btn icen-btn-sm" data-icen-modal-close>关闭</button> </div> </div></div><div class="icen-modal-backdrop" data-icen-modal="demo-sheet-right" hidden> <div class="icen-modal icen-modal--sheet-right"> <div class="icen-modal-header"> <div> <h3 class="icen-modal-title">文档详情</h3> <p class="icen-modal-description">设计规范 · 今天更新</p> </div> <button class="icen-modal-close" data-icen-modal-close aria-label="关闭"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" focusable="false" class="icen-symbol" aria-hidden="true"><path d="M6 6l8 8M14 6l-8 8"></path></svg></button> </div> <div class="icen-modal-body"> <p>所有者:设计团队</p> <p>可见范围:仅工作区成员</p> </div> <div class="icen-modal-footer"> <button class="icen-btn icen-btn-sm" data-icen-modal-close>关闭</button> </div> </div></div>
特性
- 契约:
data-icen-modal声明 +behaviors/modal接管行为 - 焦点:焦点陷阱圈在框内,关闭后还原到触发元素
- 关闭:Esc / 遮罩点击;打开期间页面滚动锁定
- Sheet:四向贴边滑入的抽屉变体
接口
- 初始化
initModal()(kit 一行入口可直接命名导入)- 导出
-
openModalcloseModal - 事件
-
icen:modal-closeicen:modal-opendetail 契约见IcenEventMap - 类型
dist/behaviors/modal.d.mts(随 npm 包发布,含全部 JSDoc 约束)
安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import '@icen.ai/ui/kit/modal';
也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add modal
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/modal.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import { initModal, openModal, closeModal } from '@icen.ai/ui/kit/modal';import '@icen.ai/ui/kit/input'; // 本页输入型示例const dispose = initModal(); // 页面卸载时 dispose(),恢复门户与滚动锁openModal('confirm'); // 编程打开(可传 { initialFocus } 控制初始焦点)closeModal('confirm'); // 编程关闭;开合均派 icen:modal-open / icen:modal-close