SidePanel 使用手册
v1.4.3 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
从页面右侧展示详情或辅助内容,支持浮层与内嵌两种形态,让用户保留主页面上下文。
使用选择
用于可打开、关闭的详情或辅助面板,支持浮动与内嵌。一直显示的通知、活动、联系人栏可用页面 aside,不因位置在右侧就使用此组件。
bind:open 控制显示,placement 选择浮动或内嵌,width 可绑定并受最小/最大值限制。
children 是滚动内容;内嵌位移动效按 inlineMotionOwner 指定唯一负责方,避免页面与组件重复移动。
未传 title 时,工具栏标题与面板名称随 LocaleProvider 切换;显式 title(含空字符串)及业务内容保持原样。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
下工具栏替换
优先级:bottomLeading / bottomTrailing Snippet > 对应 actions 数组 > 默认内置。
上工具栏(预览切换 / 上一项 / 下一项 / 标题 / 关闭)不可通过 props 或 snippet 替换。
效果定义
placement="inline" 的默认产品效果以 SidePanel-Demo.svelte(源码参考:playground/demo/SidePanel-Demo.svelte) 为基准,它不是把 SidePanel 放进普通文档流,而是采用浮动停靠布局:
SidePanel 由 fixed layer / rail 承载,始终浮在页面其他元素之上。
页面对指定内容区同步增加右侧
padding-right,把这些内容向左挤压。未参与预留空间的页面区域保持原布局,SidePanel 打开后覆盖在这些区域上方。
面板位移和内容收缩由同一个
inlineActive状态、同一个 helper 和同一轮样式更新驱动,视觉速率保持一致。
因此,“内嵌”表示面板会参与页面可用空间分配,不表示面板进入普通文档流。SidePanel 的视觉层仍是浮层;被挤压范围由页面显式定义。
职责分界
页面如何定义挤压与覆盖
挤压整块主内容:把 header、Table、分页等都放进
data-side-panel-layout,统一消费padding-right。只挤压 Table:只让 Table 外层消费
--snowui-side-panel-layout-space;页面 header、左侧导航等放在该容器外,它们会保持宽度并可能被 SidePanel 覆盖。覆盖悬浮控件:控件不消费 layout-space,且其
z-index低于data-side-panel-layer。控件保持在面板之上:控件不消费 layout-space,并由页面设置高于 layer 的
z-index。这属于页面层级决策,不由 SidePanel 自动修改。
不要让 SidePanel 查询 Table、main 或 header,也不要在组件内部改写兄弟元素宽度。页面必须通过结构和 CSS 明确选择布局作用范围。
动效协调规则
RareUI 的参考实现让面板 x 与主内容 paddingRight 响应同一状态。SnowUI 沿用这套同步结构,但使用自己的 SIDE_PANEL_APPEAR_MOTION / SIDE_PANEL_DISAPPEAR_MOTION:临界阻尼 300 / 34.6410161514 / 1、500ms 轨迹窗口、无回弹,并保证完整退场距离。
默认内嵌集成必须满足:
inlineActive固定为open && placement === "inline"。只调用一次
createSidePanelLayoutMotionStyle(inlineActive, panelWidth, 16),并把结果挂在协调容器上。被挤压区域的
padding-right和 rail 的transform必须直接消费 helper 输出的变量,不得分别定义 duration 或 easing。SidePanel 必须传
inlineMotionOwner="layout",避免组件 transform 与 rail transform 叠加。layer 与 rail 必须常驻 DOM;SidePanel 本体按 presence 挂载和卸载,保证退场完整。
prefers-reduced-motion: reduce时同时关闭内容收缩和 rail 位移 transition。
helper 输出以下页面 bridge 变量:
默认完整写法
高度与视口间距
SidePanel 本身提供高度能力,但页面负责决定它相对于哪个空间定位:
默认内嵌模式不要同时使用组件默认 100dvh - 32px 和 rail 的 top/bottom 高度约束;应让 rail 决定高度,再以 height: 100% 传给 SidePanel。这样高度只有一个事实来源。
内嵌模式样式(公开入口)
布局模型
主布局模型:复合管理布局。定义见 ../../../specs/maintainers/LayoutProtocol.md §12.3(源码参考:specs/maintainers/LayoutProtocol.md)。
示例
浮层背景
默认无遮罩,保留背景记录切换。设置 backdrop="opaque" 使用 10% 黑色遮罩;"blur" 在同一遮罩上增加 var(--size-5)(20px)背景模糊;"transparent" 仅阻挡背景交互。视觉复用 共享的 .snowui-backdrop,淡入淡出复用 Dialog motion token,随 SidePanel presence 卸载。内嵌模式不显示遮罩。点击遮罩遵循 closeOnOutside,关闭按钮和 Escape 行为不变。
遮罩渐隐实现复用 共享 Backdrop(源码参考:components/src/lib/backdrop.md),与 Dialog、ImageViewer 使用同一透明起点和减少动效规则。
SidePanel 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
SidePanel 类型与状态
必填属性:无具名必填属性。
可双向绑定:bind:open、bind:placement、bind:width。
继承声明:Omit<FrameProps, "children" | "width">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
SidePanelPlacement
来源:components/src/lib/side-panel.ts
SidePanelToolbarAction
来源:components/src/lib/side-panel.ts
SidePanelActionRole
来源:components/src/lib/side-panel.ts
DialogBackdrop
来源:components/src/logic/dialog.svelte.ts
ComponentPartsOf
来源:components/src/logic/component-parts.svelte.ts
ConfigurableComponentPartProps
来源:components/src/logic/component-parts.svelte.ts
ComponentPartControlledKey
来源:components/src/logic/component-parts.svelte.ts