拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Coze Studio 画布交互模式切换组件 mouse-pad-selector 的设计与实现解析

Coze Studio 画布交互模式切换组件 mouse-pad-selector 的设计与实现解析【免费下载链接】coze-studioAn AI agent development platform with all-in-one visual tools, simplifying agent creation, debugging, and deployment like never before. Coze your way to AI Agent creation.项目地址: https://gitcode.com/GitHub_Trending/co/coze-studiocoze-common/mouse-pad-selector是 Coze Studio 前端 monorepo 中的一个通用画布模式切换组件用于在鼠标模式Mouse与触摸板模式Pad之间切换画布的交互行为。本文以该组件的 READMEfrontend/packages/components/mouse-pad-selector/README.md为骨架结合其完整源码、持久化工具函数及在 workflow 编辑器工具栏中的真实接入方式完整讲清它的 API 设计、状态管理机制与本地开发流程。一、组件定位解决什么问题README 对该组件的一句话定义是通用的画布模式切换组件支持画布模式切换成鼠标或者触摸板模式。在可视化编排类应用中同一块画布往往要同时服务两类用户鼠标模式面向使用鼠标滚轮缩放画布的用户滚轮滚动即缩放触摸板模式Pad 模式面向 MacBook 等触控板设备用户触控板的双指滚动更适合平移画布双指捏合才做缩放。组件的职责就是提供一个带下拉弹层的切换 UI并把选中的交互类型以受控组件controlled component的形式交给业务方处理。它本身不做画布行为适配行为适配由业务侧的画布引擎完成——这一点在第五节接入示例中会看到。README 同时列出了该组件的工程特性这些也是仓库中可核实的配置事实eslint ts —— 见 eslint.config.js 与 tsconfig.jsonesm bundle / [x] umd bundle —— 从 package.json 看包入口直接指向源码main: src/index.tsxbuild脚本当前为exit 0空构建说明该包在 monorepo 内部以源码形式被工作区直接消费storybook —— 见 stories/demo.stories.tsxStorybook 版本锁定在 7.6.x二、核心 APIInteractiveType 与 MousePadSelector组件的公共出口在 src/index.tsx只导出了三类东西MousePadSelector组件及其 Props 类型、InteractiveType枚举以及GuidingPopover引导组件和getPreferInteractiveType/setPreferInteractiveType两个持久化工具函数。2.1 InteractiveType 枚举定义于 src/mouse-pad-selector.tsxexport enum InteractiveType { Mouse MOUSE, Pad PAD, }注意枚举值是大写字符串MOUSE/PAD这意味着它可以直接序列化进 localStorage也可以与外部画布引擎的同名类型字符串做兼容匹配业务侧正是这样用的见第五节。2.2 MousePadSelectorPropsexport interface MousePadSelectorProps { value: InteractiveType; // 当前选中的交互模式受控 onChange: (value: InteractiveType) void; // 用户切换时的回调 onPopupVisibleChange?: (visible: boolean) void; // 弹层显隐变化可用于联动隐藏 Tooltip containerStyle?: CSSProperties; // 触发容器样式 iconStyle?: CSSProperties; // 图标样式 arrowStyle?: CSSProperties; // 下拉箭头样式 }组件通过React.forwardRef暴露根div引用mouse-pad-selector.tsx业务方拿到 ref 后可将弹层定位锚点、引导气泡定位等操作直接绑定到触发元素上。2.3 触发器与弹层结构从源码结构看MousePadSelector的渲染结构分为两层触发器一个由当前图标 下拉箭头组成的div点击时通过setVisible(!visible)切换弹层mouse-pad-selector.tsx#L152-L176。当前选中 Mouse 时显示鼠标图标选中 Pad 时显示触控板图标。弹层基于coze-arch/bot-semi的Popover配置triggercustom完全由组件内部 state 控制显隐、positiontopLeft、closeOnEsc、spacing{20}。弹层内容包含一个标题i18n keyworkflow_interactive_mode和两个可选项IteractiveItem分别对应鼠标模式workflow_mouse_friendly与触摸板模式workflow_pad_friendly_desc并带有data-testidworkflow.detail.toolbar.interactive.mouse / .pad供 e2e 测试定位。onPopupVisibleChange的用途在真实接入中很典型弹层打开时隐藏外层的 Tooltip避免两者视觉重叠见第五节Tooltip的display: showInteractivePanel ? none : block逻辑。三、首次使用引导GuidingPopoversrc/with-guiding-popover.tsx 导出了GuidingPopover它用 children 包裹触发元素在用户第一次进入画布时弹出一块说明气泡解释两种模式各自的适用场景并提供知道了按钮。它的显隐逻辑完全由 localStorage 驱动const [visible, setVisible] useState(() needShowGuidingPopover());其中needShowGuidingPopover()读取 key 为show_workflow_interactive_type_guide的存储项未标记为true时判定需要展示点击知道了后执行hideGuidingPopover()写入标记此后不再展示。源码中有一条注释说明了设计取舍The gotIt method is not exposed to the upper layer first, and it needs to be used later before being exposed——即知道了的持久化目前只在组件内部完成未对上层暴露。GuidingPopoverProps的所有文案字段buttonText、mainTitle、mouseOptionTitle、mouseOptionDesc、padOptionTitle、padOptionDesc均为可选缺省值来自 i18n 文案workflow_interactive_mode_popover_title、guidance_got_it等业务方可以直接GuidingPopover.../GuidingPopover零配置使用也可以传入自定义文案做多语言/场景化定制。四、本地持久化偏好记忆的实现细节src/constants.ts 与 src/utils.ts 共同实现了记住用户上次选择的能力export const CACHE_KEY workflow_prefer_interactive_type; export const SHOW_KEY show_workflow_interactive_type_guide; export const IS_MAC_OS /(Macintosh|MacIntel|MacPPC|Mac68K|iPad)/.test( navigator.userAgent, );export const getPreferInteractiveType () { const data localStorage.getItem(CACHE_KEY) as string; if ( data [InteractiveType.Mouse, InteractiveType.Pad].includes(data as InteractiveType) ) { return data; } return IS_MAC_OS ? InteractiveType.Pad : InteractiveType.Mouse; }; export const setPreferInteractiveType (type: InteractiveType) { localStorage.setItem(CACHE_KEY, type); };三个值得注意的工程细节缓存值校验读取后先做includes白名单校验localStorage 被污染或残留脏数据时安全降级平台感知的默认值无缓存时通过 UA 正则判断是否为 macOS/iOS 设备——是则默认 Pad 模式触控板是 Mac 的主输入设备否则默认 Mouse 模式。这是一个按设备先验推断默认交互方式的合理启发式职责边界组件库只负责读偏好/写偏好不自动写入——写入动作由业务方在onChange中显式调用setPreferInteractiveType完成保持组件本身无副作用。五、实战接入workflow 编辑器工具栏该组件在 Coze Studio 工作流编辑器中的真实接入点位于 frontend/packages/workflow/playground/src/components/toolbar/components/interactive.tsx它清晰展示了组件只管 UI行为交给画布引擎的分层方式export const Interactive () { const tools usePlaygroundTools(); const [interactiveType, setInteractiveType] useStateInteractiveType( () getPreferInteractiveType() as InteractiveType, ); const [showInteractivePanel, setShowInteractivePanel] useState(false); const mousePadTooltip I18n.t( interactiveType InteractiveType.Mouse ? workflow_mouse_friendly : workflow_pad_friendly, ); useEffect(() { tools.setMouseScrollDelta(zoom zoom / 20); // 鼠标滚轮缩放缓速 // 初始化时读取缓存偏好应用到画布 const preferInteractiveType getPreferInteractiveType(); tools.setInteractiveType(preferInteractiveType as IdeInteractiveType); }, []); return ( GuidingPopover Tooltip content{mousePadTooltip} style{{ display: showInteractivePanel ? none : block }} div classNameworkflow-toolbar-interactive contenteditable="false">【免费下载链接】coze-studioAn AI agent development platform with all-in-one visual tools, simplifying agent creation, debugging, and deployment like never before. Coze your way to AI Agent creation.项目地址: https://gitcode.com/GitHub_Trending/co/coze-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门