From ffec205e011ba873c6ad788f6e1e25fb0e1dfb3c Mon Sep 17 00:00:00 2001 From: kuddev Date: Tue, 22 Sep 2026 21:12:19 +0800 Subject: [PATCH] feat(gpui): add the Fluxion AI sponsor page and Discord link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Settings → Home → Project and support gains a Sponsors row that opens an in-app page (logo on the left, bilingual introduction on the right) with a single sign-up link carrying the project's attribution parameters. Both READMEs add a matching Sponsors table and the community Discord invite. --- README.md | 17 +++ README.zh-CN.md | 17 +++ extra/logo/sponsor_fluxionai.png | Bin 0 -> 43233 bytes nebula_app/src/gpui_shell/settings_pane.rs | 5 + .../src/gpui_shell/settings_pane/about.rs | 36 ++++- .../settings_pane/initialization.rs | 1 + .../src/gpui_shell/settings_pane/sponsor.rs | 132 ++++++++++++++++++ 7 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 extra/logo/sponsor_fluxionai.png create mode 100644 nebula_app/src/gpui_shell/settings_pane/sponsor.rs diff --git a/README.md b/README.md index 83acb9b..8fa89d0 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Stars Forks Last commit + Discord linux.do

@@ -48,6 +49,20 @@ OpenCode, Claude Code, and Codex in split panes

+## 💖 Sponsors + + + + + + +
+ Fluxion AI
+ Fluxion AI +
+ Thanks to Fluxion AI for sponsoring this project! Fluxion AI is one entry point for accessing and managing the world's leading AI models. It serves individual developers, technical teams and enterprises with a unified API; dynamic multi-route scheduling improves availability, and model performance, response time and cost stay transparent. Depending on the model and route, API calls can cost 40%–98% less than official or benchmark prices. Sign up via this link to receive $3 in API credit. +
+ ## One Workspace Pebrel (formerly Nebula) brings local shells, remote hosts, files, and AI command-line @@ -176,6 +191,8 @@ through the explicit `legacy-shell` feature. Email: [fickleheartedkeys@163.com](mailto:fickleheartedkeys@163.com) +Discord: [discord.gg/VFn4rcxmhn](https://discord.gg/VFn4rcxmhn) + ## Acknowledgements Pebrel builds on [Alacritty](https://github.com/alacritty/alacritty), diff --git a/README.zh-CN.md b/README.zh-CN.md index 0f864b1..1aec735 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -27,6 +27,7 @@ Stars Forks 最近提交 + Discord linux.do

@@ -48,6 +49,20 @@ OpenCode、Claude Code 与 Codex 分屏工作流

+## 💖 赞助商 + + + + + + +
+ Fluxion AI
+ Fluxion AI +
+ 感谢 Fluxion AI 赞助本项目!Fluxion AI 是一个入口,接入并管理全球主流 AI 模型:面向个人开发者、技术团队与企业,通过统一 API 接入并管理全球主流 AI 模型;通过多线路动态调度提升可用性,模型表现、响应时间与费用透明可查。根据不同模型与线路,API 调用成本较官方或基准价格可降低 40%—98%。立即访问并注册,即可获得 $3 API 额度。 +
+ ## 一个工作区 Pebrel(原名 Nebula)把本地 Shell、远程主机、文件和 AI 命令行工具放进同一个原生桌面工作区。 @@ -158,6 +173,8 @@ cargo build --release --locked -p nebula --bin pebrel --features gpui-shell 邮箱:[fickleheartedkeys@163.com](mailto:fickleheartedkeys@163.com) +Discord:[discord.gg/VFn4rcxmhn](https://discord.gg/VFn4rcxmhn) + ## 致谢 Pebrel 基于 [Alacritty](https://github.com/alacritty/alacritty)、 diff --git a/extra/logo/sponsor_fluxionai.png b/extra/logo/sponsor_fluxionai.png new file mode 100644 index 0000000000000000000000000000000000000000..4eef0897e1c8d422f1c481d1d31d3fe11b10dfa8 GIT binary patch literal 43233 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, + /// 首页「项目与支持」→ 赞助商:独立页面,不是外链行。切换分区时清掉。 + about_sponsor_open: bool, settings_search_input: Entity, search_origin_section: Option, /// 每项还带着自己的 `values` 表:`SelectState` 只认索引,而从代码侧 @@ -1295,6 +1298,7 @@ impl SettingsPane { .into_any_element(); } match self.active_section { + 0 if self.about_sponsor_open => self.section_sponsor(cx), 0 => self.section_home(window, cx), 1 => self.section_appearance(window, cx), 2 => self.section_profiles(window, cx), @@ -1379,6 +1383,7 @@ impl SettingsPane { .when(!active, |item| item.text_color(muted).hover(|s| s.bg(hover_bg))) .on_click(cx.listener(move |this, _, _, cx| { this.active_section = ix; + this.about_sponsor_open = false; cx.notify(); })) .child( diff --git a/nebula_app/src/gpui_shell/settings_pane/about.rs b/nebula_app/src/gpui_shell/settings_pane/about.rs index 5d2b681..1826d76 100644 --- a/nebula_app/src/gpui_shell/settings_pane/about.rs +++ b/nebula_app/src/gpui_shell/settings_pane/about.rs @@ -8,6 +8,31 @@ impl SettingsPane { url: String, cx: &Context, ) -> gpui::AnyElement { + Self::about_row(id, icon, title, IconName::ExternalLink, cx) + .on_click(move |_, _, cx| cx.open_url(&url)) + .into_any_element() + } + + /// 与外链行同一条骨架,尾标是「进入页面」而不是「离开应用」。 + pub(super) fn about_page_row( + id: &'static str, + icon: IconName, + title: &'static str, + on_click: impl Fn(&gpui::ClickEvent, &mut Window, &mut App) + 'static, + cx: &Context, + ) -> gpui::AnyElement { + Self::about_row(id, icon, title, IconName::ChevronRight, cx) + .on_click(on_click) + .into_any_element() + } + + fn about_row( + id: &'static str, + icon: IconName, + title: &'static str, + trailing: IconName, + cx: &Context, + ) -> gpui::Stateful { let muted = cx.theme().muted_foreground; let hover = cx.theme().list_hover; h_flex() @@ -21,11 +46,9 @@ impl SettingsPane { .rounded_md() .cursor_pointer() .hover(move |row| row.bg(hover)) - .on_click(move |_, _, cx| cx.open_url(&url)) .child(Icon::new(icon).small().text_color(muted)) .child(div().flex_1().min_w_0().child(title)) - .child(Icon::new(IconName::ExternalLink).xsmall().text_color(muted)) - .into_any_element() + .child(Icon::new(trailing).xsmall().text_color(muted)) } pub(super) fn about_value_row( @@ -252,6 +275,13 @@ impl SettingsPane { language.pick("更新内容", "Release notes"), crate::update_check::RELEASES_PAGE.to_owned(), cx, + )) + .child(Self::about_page_row( + "about-sponsors", + IconName::Heart, + language.pick("赞助商", "Sponsors"), + cx.listener(|this, _, _, cx| this.open_sponsor_page(cx)), + cx, )); v_flex().w_full().child(identity).child( diff --git a/nebula_app/src/gpui_shell/settings_pane/initialization.rs b/nebula_app/src/gpui_shell/settings_pane/initialization.rs index d972d16..1ff1abe 100644 --- a/nebula_app/src/gpui_shell/settings_pane/initialization.rs +++ b/nebula_app/src/gpui_shell/settings_pane/initialization.rs @@ -584,6 +584,7 @@ impl SettingsPane { about_update: AboutUpdateState::Idle, about_update_seq: 0, about_last_checked: None, + about_sponsor_open: false, settings_search_input, search_origin_section: None, selects, diff --git a/nebula_app/src/gpui_shell/settings_pane/sponsor.rs b/nebula_app/src/gpui_shell/settings_pane/sponsor.rs new file mode 100644 index 0000000..b603b7c --- /dev/null +++ b/nebula_app/src/gpui_shell/settings_pane/sponsor.rs @@ -0,0 +1,132 @@ +//! 设置首页「项目与支持」下的赞助商页:左侧品牌贴图、右侧介绍与注册链接。 +//! +//! 不做成外链行:外链行一点就跳浏览器,赞助商介绍在应用里就该读得到; +//! 页面只提供一条明确的注册链接,点它才离开应用。 + +use std::sync::{Arc, OnceLock}; + +use super::*; + +/// 注册链接。`source` / `campaign` / `promo` 三个参数是赞助商给本项目的 +/// 专属归因,README 与应用内必须用同一条,不能各写各的。 +pub(super) const SPONSOR_URL: &str = + "https://fluxionai.space/register?source=github&campaign=pebrel&promo=pebrel"; +const SPONSOR_NAME: &str = "Fluxion AI"; +const LOGO_PNG: &[u8] = include_bytes!("../../../../extra/logo/sponsor_fluxionai.png"); +/// 贴图自带白底圆角,深浅主题都读得清品牌字。 +const LOGO_WIDTH: f32 = 188.0; + +/// 贴图只解码一次:RGBA8 → BGRA(gpui 帧通道序),与壁纸 / 文档图同款。 +fn sponsor_logo() -> Option> { + static LOGO: OnceLock>> = OnceLock::new(); + LOGO.get_or_init(|| { + let mut rgba = image::load_from_memory(LOGO_PNG).ok()?.into_rgba8(); + for pixel in rgba.chunks_exact_mut(4) { + pixel.swap(0, 2); + } + Some(Arc::new(RenderImage::new([image::Frame::new(rgba)]))) + }) + .clone() +} + +impl SettingsPane { + pub(super) fn open_sponsor_page(&mut self, cx: &mut Context) { + self.about_sponsor_open = true; + cx.notify(); + } + + pub(super) fn close_sponsor_page(&mut self, cx: &mut Context) { + self.about_sponsor_open = false; + cx.notify(); + } + + pub(super) fn section_sponsor(&mut self, cx: &mut Context) -> gpui::Div { + let language = crate::gpui_shell::config::ui_language(cx); + let theme = cx.theme(); + let muted = theme.muted_foreground; + let ink = theme.foreground; + let link = theme.primary; + let hover = theme.list_hover; + let base_px = self.font_size_px(cx); + + let back = h_flex() + .id("sponsor-back") + .w_auto() + .h(px(32.0)) + .px_2() + .gap_2() + .items_center() + .rounded_md() + .cursor_pointer() + .text_color(muted) + .hover(move |row| row.bg(hover).text_color(ink)) + .on_click(cx.listener(|this, _, _, cx| this.close_sponsor_page(cx))) + .child(Icon::new(IconName::ArrowLeft).small()) + .child(language.pick("返回", "Back")); + + let logo = + div().w(px(LOGO_WIDTH)).flex_shrink_0().when_some(sponsor_logo(), |slot, image| { + slot.child(gpui::StyledImage::object_fit( + img(image).w(px(LOGO_WIDTH)).h(px(LOGO_WIDTH * 276.0 / 376.0)), + gpui::ObjectFit::Contain, + )) + }); + + let register = h_flex() + .id("sponsor-register") + .w_auto() + .mt(px(4.0)) + .gap_1() + .items_center() + .cursor_pointer() + .text_color(link) + .hover(|row| row.underline()) + .on_click(|_, _, cx| cx.open_url(SPONSOR_URL)) + .child(language.pick( + "立即访问并注册,即可获得 $3 API 额度", + "Sign up now to receive $3 in API credit", + )) + .child(Icon::new(IconName::ExternalLink).xsmall()); + + let copy = v_flex() + .flex_1() + .min_w_0() + .gap(px(10.0)) + .child( + div() + .text_size(px(base_px * 1.3)) + .font_weight(gpui::FontWeight::SEMIBOLD) + .text_color(ink) + .child(SPONSOR_NAME), + ) + .child(div().text_color(ink).child(language.pick( + "一个入口,接入并管理全球主流 AI 模型", + "One entry point to access and manage the world's leading AI models", + ))) + .child(div().text_color(muted).line_height(px(base_px * 1.6)).child(language.pick( + "Fluxion AI 面向个人开发者、技术团队与企业,通过统一 API 接入并管理全球主流 AI 模型;\ + 通过多线路动态调度提升可用性,模型表现、响应时间与费用透明可查。\ + 根据不同模型与线路,API 调用成本较官方或基准价格可降低 40%—98%。", + "Fluxion AI serves individual developers, technical teams and enterprises with a \ + unified API for accessing and managing mainstream AI models worldwide. Dynamic \ + multi-route scheduling improves availability, and model performance, response \ + time and cost stay transparent. Depending on the model and route, API calls can \ + cost 40%–98% less than official or benchmark prices.", + ))) + .child(register); + + v_flex() + .w_full() + .gap(px(20.0)) + .child(back) + .child( + div() + .h(px(30.0)) + .text_size(px(base_px * 0.85)) + .font_weight(gpui::FontWeight::SEMIBOLD) + .text_color(muted) + .child(language.pick("赞助商", "Sponsors")), + ) + .child(h_flex().w_full().items_start().gap(px(28.0)).child(logo).child(copy)) + } +}