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

GPUI Base 原语组件全览:基于 GPUI 的无样式行为层组件目录与实战指南

GPUI Base 原语组件全览基于 GPUI 的无样式行为层组件目录与实战指南【免费下载链接】gpui-kitRust GUI components for building fantastic cross-platform desktop application by using GPUI.项目地址: https://gitcode.com/GitHub_Trending/gp/gpui-kitGPUI Basegpui-base是 GPUI Component 框架中专门面向“自建设计系统”的行为与基础设施层。本文以 website/base/primitives/index.md 的原语目录Primitive catalog为骨架逐一解读 39 个原语组件的行为契约与组合方式并结合 crates/base 的源码与可运行示例说明如何在应用中安装、初始化和组装这些“只提供行为、不预设外观”的组件。读完本文你将掌握 GPUI Base 原语层的设计原则、每个原语组件的公开 API 与最小组合用法并能直接运行内置 showcase 进行本地验证。什么是 GPUI Base 原语PrimitivesGPUI Base 原语是一组只提供行为behavior而不规定外观呈现presentation的 GPUI 组件。目录页的原话是GPUI Base primitives provide behavior without prescribing presentation。这意味着每个原语组件负责交互行为、焦点管理、无障碍语义、状态与事件而布局、尺寸、颜色、圆角、阴影、动效等视觉决策全部交给应用层或gpui-component上层实现。这种分层方式参考了 shadcn 生态的抽象思想gpui-base之于 GPUI相当于 Base UI 之于 HTML Tailwind CSS而gpui-component则是类似 shadcn 的“开箱即用”成品层见 crates/base/README.md。因此想快速搭建完整桌面应用用gpui-component自带完整视觉语言想拥有自己的组件源码与视觉风格、只复用稳定行为用gpui-base。gpui-base不依赖gpui-component依赖方向永远是从高层指向地基所以应用可以在使用gpui-component的同时按需直接依赖gpui-base构建自定义组件。无样式是显式契约Button::new(save)默认没有 padding、背景、圆角与尺寸——这不是功能缺失而是 API 契约。设计原则在 crates/base/README.md 中明确列出行为属于地基点击处理、键盘激活、受控状态、焦点、无障碍角色与基础设施呈现属于应用布局、尺寸、颜色、间距、圆角、边框、阴影、变体与动效应用拥有自己的组件地基控件可自由组合与修改无需采纳固定视觉语言语义 API 优先主题暴露primary、surface、destructive等语义 token而不是堆砌组件专属字段GPUI 原生组合控件实现Styled、ParentElement等 GPUI 接口与 GPUI 的 fluent builder API 无缝协作。例如给按钮加上应用外观只需链式调用 GPUI 标准样式 APIuse gpui_kit::prelude::*; use gpui_kit::{Context, IntoElement, Render, Window, px, rgb}; use gpui_kit::base::Button; struct SaveButton; impl Render for SaveButton { fn render(mut self, _: mut Window, _: mut ContextSelf) - impl IntoElement { Button::new(save) .px_3() .py_2() .rounded(px(6.)) .bg(rgb(0x2563eb)) .text_color(rgb(0xffffff)) .accessibility_label(Save document) .on_click(|_, _, _| println!(save)) .child(Save) } }安装与初始化依赖配置通过gpui-kit引入gpui-base。gpui-kit固定了gpui-base所针对的 GPUI 版本并重新导出为gpui_kit::gpui与gpui_kit::platformgpui-base本身始终位于gpui_kit::base。如果只想使用地基层可关闭默认特性跳过带样式的上层[dependencies] gpui-kit { version 0.6, default-features false }可选特性只有一个inspector默认关闭用于在gpui与gpui_macros中启用 inspector 支持。初始化在创建窗口或使用地基控件之前调用一次gpui_kit::base::init(cx)它会安装基础层所需的全局主题与焦点陷阱focus trap基础设施use gpui_kit::*; fn main() { gpui_kit::application().run(|cx| { gpui_kit::base::init(cx); // Create windows and views after initialization. }); }如果应用已经调用过gpui_kit::init(cx)则不要再重复调用base::init(cx)——高层初始化器已经包含基础层初始化。从 crates/base/src/lib.rs 可以看到init依次初始化了Theme、GlobalState、dialog、focus_trap、popover、sheet、combobox、color_picker、select、number_input、input、tree、text等全局基础设施。运行原语 showcase目录页说明页面顶部的实时示例由crates/base/examples构建同时也能作为原生 GPUI 应用运行。示例包名为gpui-base-examples入口见 crates/base/examples/native/Cargo.toml共享实现位于 crates/base/examples/showcase/mod.rs每个组件一个独立文件放在crates/base/examples/showcase/components/下。运行单个原语的本地演示cargo run -p gpui-base-examples -- button cargo run -p gpui-base-examples -- select cargo run -p gpui-base-examples -- tree其中button、select等参数即组件文件名。运行动效演示cargo run -p gpui-base-examples --bin motion原生入口与 WASM 预览编译的是同一份showcase源码native通过#[path]引入共享实现因此原生行为与浏览器预览保持一致。工程验证命令在仓库根目录执行cargo check -p gpui-base cargo test -p gpui-base cargo fmt --check cargo clippy -p gpui-base -- --deny warnings原语目录39 个组件的行为契约目录页列出了完整的用户可见原语清单。以下按功能族分组每个条目继承原文档的语义描述并结合 crates/base/src/lib.rs 的导出清单补充可组合部件。显示/收纳类Disclosure原语行为契约Accordion由可独立设置样式的 header、trigger、panel 部件组合成的显示组disclosure groupCollapsible可组合区域显示/隐藏内容不规定 trigger 样式TabsTab 列表与可访问的 tab 控件受控选中Toggle受控两态可按压控件用于格式开关等持久选择Toggle Group将一组 toggle 协调为单选或多选组Radio受控单选条目具备选中与禁用语义Radio Group组合 radio 条目提供单选键盘导航以 Accordion 为例源码 crates/base/src/accordion.rs 中Accordion根部件通过div().id(id)建立有状态元素渲染时挂载Role::Group无障碍角色AccordionItem将 trigger 与 panel 连接起来AccordionHeader/AccordionTrigger/AccordionPanel均作为独立部件导出见 lib.rs因此应用可以只给 trigger 加视觉样式而保持 item 行为不变。对话框与浮层类Overlay原语行为契约Alert Dialog用于需要明确决策的操作的模态确认界面Dialog可组合模态界面包含焦点管理、backdrop、title、close 部件Hover Card与指针或键盘触发器关联的延迟浮卡Popover锚定浮层受控或内部管理打开状态Popup低层 trigger 锚定浮层内容宿主Select按钮式选择控件背后是锚定、可键盘导航的浮层Sheet从边缘滑入的模态界面管理关闭与焦点Tooltip与 trigger 关联的延迟定位说明文本这些原语在lib.rs中的导出充分体现了“部件化”设计AlertDialog系列导出AlertDialogBackdrop、AlertDialogAction、AlertDialogCancel、AlertDialogClose、AlertDialogDescription、AlertDialogPopup、AlertDialogTitle、AlertDialogTriggerDialog系列导出DialogBackdrop、DialogClose、DialogDescription、DialogPopup、DialogTitle、DialogTrigger与DialogHandlePopover/Popup依赖positioner模块的Align、Positioner、ResolvedPosition完成锚定计算。以 Select 为例其子页面 website/base/primitives/select.md 强调状态/委托负责条目与选中项激活打开列表、选中关闭列表无障碍上应给受控根节点设置.accessibility_label(...)并给.accessibility_value(...)传入已提交的选中值而非临时的搜索光标根节点暴露展开状态与可访问激活。文本输入与编辑类Text Editing原语行为契约Input单行文本输入支持选择、掩码、校验与数字步进Textarea多行文本域固定行数、换行、自动增长Editor源码编辑器地基高亮、gutter、折叠、装饰与 LSP 钩子OTP Input由共享文本状态驱动的多单元一次性验证码输入Number Input带可复用 increment/decrement/step 行为的数字输入根据 crates/base/README.md 的能力总览三者共享内部InputBaseState编辑引擎但应用应构造用途对应的状态类型InputState、TextareaState、EditorState而不是在共享引擎上切换模式。NumberInput在 lib.rs 中导出Increment、Decrement、NumberStep、StepAction、step_value等可复用步进原语。数据输入与展示类Form Data原语行为契约Calendar状态驱动的日期网格支持选择匹配器matcher与自定义条目渲染Color Picker自建取色 UI 所需的状态与交互基础Checkbox受控三态勾选框指示器可独立设置样式Date Picker感知焦点的日期输入组合日历行为与浮层Link应用自定义样式的可访问类链接控件Slider状态驱动的范围输入track/indicator/thumb 可独立设置样式Switch受控开/关控件track 与 thumb 可独立设置样式Table语义化表格原语组合 header、body、row、cellTree虚拟化层级列表显式展开与选中状态Avatar带可组合回退内容的图片用于人或实体Calendar 在 lib.rs 中导出一套完整状态模型Calendar、CalendarState、CalendarView、CalendarEvent、CalendarItem、CalendarItemKind、CalendarItemState、Date、Matcher、IntervalMatcher、RangeMatcher——选中逻辑通过 matcher 表达渲染交给应用。导航与布局类原语行为契约Nav Stack视图导航栈push、pop、forward、replace带可动画的过渡生命周期Pagination受控分页导航显式当前页与总页数状态Resizable面板组与拖拽手柄构建用户可调的分栏布局Scrollbar无样式滚动条连接 GPUI scroll 或 uniform-list 手柄Button无样式、可访问的可按压控件具备语义状态与键盘激活Resizable在 lib.rs 导出ResizablePanel、ResizablePanelGroup、ResizableState、ResizeHandleRenderer、h_resizable/v_resizable/resizable_panel等构造器Scrollbar支持ScrollHandle、UniformListScrollHandle、ListState、VirtualListScrollHandle以及垂直、水平、双轴三种模式ScrollbarMode。反馈与状态类原语行为契约Progress可组合的 track 与 indicator 部件报告任务完成度Toast受管理的、可动画的临时状态消息栈Toast家族在 lib.rs 导出ToastManager、ToastStack、ToastStackState、ToastMotion、ToastOptions等负责 alert 语义、生命周期、定时器、数量上限、栈几何测量与感知交互的动效。受控状态地基层的统一约定Checkbox、Radio、Switch、Toggle都是受控组件回调报告“下一个值”应用更新自己的状态并在下一次渲染把该值传回。以 Checkbox 为例来自 crates/base/README.md 的完整示例use gpui_kit::prelude::*; use gpui_kit::{Context, IntoElement, Render, Window}; use gpui_kit::base::{Checkbox, CheckboxIndicator}; struct Settings { telemetry: bool, } impl Render for Settings { fn render(mut self, _: mut Window, cx: mut ContextSelf) - impl IntoElement { let checked self.telemetry; let settings cx.entity().downgrade(); Checkbox::new(telemetry) .checked(checked) .accessibility_label(Send anonymous usage data) .on_change(move |state, _, cx| { _ settings.update(cx, |this, cx| { this.telemetry state gpui_kit::base::CheckboxState::Checked; cx.notify(); }); }) .child( CheckboxIndicator::new() .checked(checked) .child(if checked { ✓ } else { }), ) .child(Send anonymous usage data) } }要点受控状态放在父渲染类型或 GPUI entity 中在回调里更新并调用cx.notify()不要在每次渲染时重建持久 entity。语义状态样式状态如何分层Button等控件支持disabled、selected以及通过.styles(...)定义的语义状态样式。每个控件按固定顺序解析最终样式主构建链上直接应用的样式值状态checked、pressed、selected、focused等disabled总是最后解析。语义状态只会覆盖它设置的字段因此不会破坏构建链上的其他样式。若希望在某个状态激活时仍保留某条构建链样式可在该状态内重放Button::new(save) .bg(brand) .styles(|styles| styles.disabled(|style| style.opacity(0.5).bg(brand)))应用还可以为语义状态定义视觉呈现例如Button::new(menu-trigger) .selected(menu_open) .disabled(is_busy) .styles(|styles| { styles .selected(|style| style.bg(rgb(0xe2e8f0))) .disabled(|style| style.opacity(0.5)) }) .child(Menu)从 crates/base/src/button.rs 的源码可以看到这些语义的底层实现disabled决定是否忽略指针与键盘激活selected是应用控制的持久选中呈现状态区别于瞬时active和 Toggle 的pressedstyles接收ButtonStyles构建器track_focus允许传入调用方拥有的焦点句柄on_click统一处理指针、Enter、Space 三种激活路径。控件默认tab_stop: true、tab_index: 0、focusable: true并默认挂载Role::Button无障碍角色。从目录页到实现源码级验证路径原语目录页的每个条目都可以沿以下路径在仓库中找到对应实现与示例关注点仓库路径原语目录文档website/base/primitives/index.md各原语子页面website/base/primitives/如 button.md、select.md公共导出清单crates/base/src/lib.rs组件实现crates/base/src/如 accordion.rs、button.rs可运行 showcase 共享实现crates/base/examples/showcase/components/原生示例包配置crates/base/examples/native/Cargo.toml地基层总览与设计原则crates/base/README.md架构文档docs/ARCHITECTURE.md样式与动效契约docs/STYLING-AND-MOTION.md使用建议与注意事项ElementId 必须稳定在视图内保持ElementId稳定GPUI 才能保留焦点与元素状态例如按钮按下、折叠面板状态。无障碍三要素提供可访问名称accessibility_label、保留键盘激活Enter/Space 由on_click统一处理、暴露禁用状态在消费设计系统中核对 focus、hover、active、selected、disabled、reduced-motion 与高对比度外观。主题 token 不自动生效基础层全局主题Theme::global_mut(cx)中的语义 token如tokens.colors.primary、tokens.radius.md描述设计语义不会自动给无样式控件上样式应用在自己的组件实现中读取并应用这些 tokenuse gpui_kit::{px, rgb}; use gpui_kit::base::Theme; let theme Theme::global_mut(cx); theme.tokens.colors.primary rgb(0x2563eb).into(); theme.tokens.radius.md px(8.);动效按需安装地基控件不会自动安装动画。motion::transition是推荐的值过渡 API支持时长、延迟、自定义缓动、平滑目标反转与 reduced-motion 偏好animation::Transition是面向元素动画的旧版 APIfade/slide/size 组合动画属性与时长由应用按自身视觉语言选择。与gpui-component的关系不要机械地把gpui_component::button::Button的 import 替换为base::Button——前者是完全带样式的成品组件后者要求调用方提供子元素与全部呈现样式。平台支持macOSApple Silicon 与 Intel、Linux x86_64、Windows x86_64WebAssembly 支持取决于所用 API 与 GPUI Web 运行时。结语GPUI Base 原语目录的核心价值在于“行为与呈现分离”的架构决策39 个原语组件覆盖显示收纳、浮层对话框、文本编辑、数据输入、导航布局与状态反馈六类场景全部通过部件化 API 暴露最小可组合单元由应用掌握全部视觉决策。通过 crates/base/examples 的共享 showcase你可以用一条cargo run -p gpui-base-examples -- 组件名命令在原生环境逐个验证每个原语的行为契约再以 crates/base/src/lib.rs 的导出清单为索引深入源码最终把这些稳定行为组合进属于你自己的设计系统。【免费下载链接】gpui-kitRust GUI components for building fantastic cross-platform desktop application by using GPUI.项目地址: https://gitcode.com/GitHub_Trending/gp/gpui-kit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

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

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