Rowboat 设计语言全解:从 Token 系统到 Spaces 多人流的实现规范
Rowboat 设计语言全解从 Token 系统到 Spaces 多人流的实现规范【免费下载链接】rowboatOpen-source AI coworker, with memory项目地址: https://gitcode.com/GitHub_Trending/rowb/rowboat导读Rowboat 是一个开源 AI 协作者Open-source AI coworker, with memory它的桌面端界面由apps/x/apps/renderer渲染层实现而 DESIGN_LANGUAGE.md 正是这套界面的视觉语言规范书。本文以该文档为主体完整讲解 Rowboat 的色彩、字体、间距、圆角、层级、图标与组件规格并落地到其 Token 系统Tailwind v4 shadcn variables的真实实现中同时深入解读其中最具特色的部分——Spaces 多人流如何刻意打破全局安静基调、形成一套--stream-*专属方言。读完本文你将掌握如何把一份设计语言直接映射为src/App.css中的 CSS 变量并理解 Rowboat 中助手对话与团队空间两种表面的设计分工。1. 设计语言概述安静、原生、macOS 风格Rowboat 的设计语言可以用一句话概括一个安静、macOS 原生感的表面。具体表现为纯白画布canvas一块无暖色灰的侧栏rail近黑的墨色ink慷慨的留白8–24px 的柔和圆角用发丝线边框替代阴影阴影只留给悬浮物全系统字体唯一强调色是蓝色且只用于链接、焦点和开关这套语言被明确定义为可以直接应用到现有的 Token 系统上——即 src/App.css 中的 Tailwind v4 shadcn 变量其 live styleguide 工件渲染了该文件中的每一个 token 与组件。几个关键的设计决策值得先讲清楚黑色是主操作色不是蓝色。主按钮Primary使用黑底白字蓝色仅用于链接、开关开启态、焦点环和Learn more类弱强调。密度来自克制而非压缩。行高、间距按 Base-4 缩放体系展开靠留白建立层级而不是把字号和 padding 压小。层级靠数值差不靠边框。侧栏与画布之间没有可见边框#F4F4F4与#FFFFFF的明度差本身就是边界对应源码注释中的 value shift is the border见 src/App.css 附近的--sidebar-border: transparent。2. 色彩系统全部 Token 与明暗双主题对照所有颜色采用浅色主题优先斜杠后为暗色主题值。暗色主题遵循同样的逻辑侧栏比画布更深、抬升表面比画布更浅、墨色阶梯被压缩。2.1 背景与表面Backgrounds surfacesTokenLightDark用途bg/canvas#FFFFFF#212121主内容聊天表面、设置内容、右侧面板bg/sidebar#F4F4F4#171717应用侧栏、设置导航栏bg/raised#FFFFFF#2A2A2A弹层、菜单、composer、对话框、设置分组卡片。浅色下与 canvas 相同——分离靠发丝线 阴影暗色下提升一级变亮bg/inset#EBEBEB#303030凹陷字段搜索输入框、分段控件轨道bg/code#F1F1F1#2E2E2E行内代码片、路径片段bg/hoverrgba(0,0,0,.05)rgba(255,255,255,.06)行、图标按钮、列表项上的悬停水洗bg/selectedrgba(0,0,0,.06)rgba(255,255,255,.09)选中导航行胶囊、激活分段片bg/bubble#0D0D0D#303030用户消息气泡反白墨色文字分层规则canvas 是地板。侧栏在它旁边不是叠在它上面深一级。任何悬浮物弹层、composer、滚动到底按钮用bg/raised 发丝线描边 柔和阴影。任何凹陷物输入框用bg/inset且无边框。绝不在卡片上叠卡片。2.2 墨色InkTokenLightDark用途ink/primary#0D0D0D#ECECEC正文、行标签、标题ink/secondary#5D5D5D#A6A6A6默认图标色、Worked for 43s、活跃元信息ink/tertiary#8F8F8F#8A8A8A占位符、描述、区块标签Projects、Recents、时间戳、快捷键提示ink/faint#B4B4B4#666666禁用行Commit or push、禁用文本ink/inverse#FFFFFF#0D0D0D气泡 / 主按钮上的文字2.3 强调色与语义色Accent semanticTokenLightDark用途accent/blue#3478F6#5B94FF链接、文件链接、开关开启、焦点环、Learn more。绝不用在按钮上——主操作是黑色semantic/success#1EA446#3DCB70DiffN、成功状态semantic/danger#E5484D#F2555ADiff-N、破坏性操作、提醒点semantic/git#8B5CF6#A78BFA聊天行旁的分支/Agent 活动字形在 src/App.css 的实现中这些语义色被映射为--rowboat-link、--rowboat-success、--rowboat-git、--rowboat-attention等扩展 token见 src/App.css并被activity-view.tsx、bg-tasks-view.tsx等组件引用例如 git 活动字形使用var(--rowboat-git)并在焦点/脉冲动画中通过color-mix(in oklab, var(--rowboat-git) 45%, transparent)派生透明度见 src/App.css 附近。2.4 边框BordersTokenLightDark用途border/hairlinergba(0,0,0,.07)rgba(255,255,255,.08)卡片描边、分隔线、弹层描边、Worked for 规则线border/controlrgba(0,0,0,.12)rgba(255,255,255,.14)描边按钮、下拉触发器ring/focus#3478F6 3px 25% 光晕#5B94FF相同仅键盘焦点3. 字体排印系统字体即品牌身份系统字体就是身份。不要为 UI 加载 webfont。--font-ui: -apple-system, BlinkMacSystemFont, SF Pro Text, Segoe UI, Inter, ui-sans-serif, system-ui, sans-serif; --font-mono: ui-monospace, SF Mono, JetBrains Mono, Menlo, Consolas, monospace;这两组字体栈已完整落在 src/App.css 的theme inline中--font-sans/--font-mono而 body 的font-family也直接采用系统优先、Inter 兜底的写法src/App.css。字号阶梯角色字号/行高字重字距用途Display28/34600-0.015em设置页标题GeneralTitle20/26600-0.01em对话框标题Headline15/206000区块小标题Permissions、弹层头部EnvironmentBody16/264000聊天正文。1.6 行高是承重墙——它让回答读起来平静UI14/20400强调时 5000侧栏行、按钮、设置行标题、顶栏标题Small13/184000描述、时间戳、区块标签、键盘快捷键Mono13/204000行内代码片Mono small12/164000设置行中的路径数字排版diff 徽章、快捷键和任何数字列使用font-variant-numeric: tabular-nums等宽数字。区块标签不做大写——用句首大小写sentence case 三级墨色而不是小型大写字母。这一规则在源码中已有落地src/App.css 等多处都声明了font-variant-numeric: tabular-nums。4. 间距、圆角与关键尺寸Base-4 间距刻度2, 4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64。圆角 TokenToken值用途r/xs6px行内代码片、文件类型徽章r/sm8px按钮、导航行选中胶囊、弹层行r/md10px输入框、下拉触发器、次级片r/lg14px设置分组卡片r/xl18px弹层、菜单r/2xl24pxComposer、用户气泡r/full999px发送按钮、头像、开关、拖拽手柄、滚动到底按钮在实现中shadcn 的半径体系由--radius: 0.625rem10px基准推导radius-xl calc(var(--radius) 4px) 18px 匹配弹层radius-2xl calc(var(--radius) 8px) 24px 匹配 composer见 src/App.css 的theme inline派生链。关键尺寸指标侧栏宽 300px。行高 36px圆角 8内边距0 10px图标–标签间距 10px图标 18px。区块标签13px 三级墨色上方24px/ 下方8px左内边距 10px 与行标签对齐。嵌套聊天行缩进 28px。顶栏高 52px内边距0 16px标题 14/500与图标间距 8px。聊天列最大宽 820px 居中内边距0 24px消息之间 28px。用户气泡内边距10px 16px圆角 22px单行时读作胶囊形最大宽 75%右对齐。Composer最大宽 800px圆角 24内边距14px 16px 12px两行输入行 控件行发送按钮为 36px 圆形。弹层宽约 320px圆角 18内边距 8px行高 40px行圆角 8行内边距0 10px图标–标签间距 10px。设置页内容最大 720–1000px页标题下方 32px分组卡片圆角 14 发丝线边框行内边距16px 20px最小高 64px标题/描述间距 4px行间发丝线可选卡片内靠内边距即可分离。按钮高度 28sm/ 32默认/ 36lg水平内边距 12–14图标按钮 32×32。开关40×24旋钮 20px内缩 2px。5. 层级与阴影阴影只给三种悬浮物日常分隔靠边框阴影只为三种悬浮物保留--shadow-popover: 0 0 0 1px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.10), 0 4px 12px rgba(0,0,0,.05); --shadow-composer: 0 0 0 1px rgba(0,0,0,.06), 0 8px 24px rgba(0,0,0,.06); --shadow-float: 0 0 0 1px rgba(0,0,0,.06), 0 4px 16px rgba(0,0,0,.12); /* scroll-to-bottom */暗色主题几何不变描边环变为rgba(255,255,255,.08)模糊色加深至rgba(0,0,0,.4–.5)。设置卡片和环境面板的相邻元素不加阴影——只有发丝线。这在实现中对应 src/App.css 的--rowboat-shadow与--rowboat-shadow-soft它们分别被弹层类如box-shadow: var(--rowboat-shadow)和 composer 类--rowboat-shadow-soft消费浅色与暗色两套值完整存在。6. 图标与细节规范图标Lucide1.5px 描边圆形端点/连接。导航与弹层行中 18px行内消息操作 16px顶栏中 20px。默认色ink/secondary行被选中时ink/primary。消息操作复制 / 反馈 / 分享16px 图标ink/tertiary悬停变ink/secondarybg/hover水洗28px 命中区出现在最后一条助手消息下方。拖拽手柄36×5px 胶囊#D9D9D9/#4A4A4A居中。键盘快捷键13pxink/tertiary使用真实 macOS 符号⌘⇧⌥⌃行内右对齐。Diff 徽章13px 等宽数字N成功绿 /-N危险红6px 间距。文件链接inline-flex6px 间距14px 文件类型徽章蓝色圆角 4 方块9px 700 白色TSaccent/blue链接文字。悬停下划线。头像28px 圆形bg/bubble填充11px/600 白色首字母。活动字形14px git-branch 图标semantic/git色置于有 Agent 活动的聊天行右缘semantic/danger圆点变体表示需要关注。7. 组件规格按钮变体配方Primarybg/bubble填充ink/inverse文字14/500圆角 8高 32水平内边距 14。悬停85% 不透明度。发送按钮即其 36px 圆形形态Secondarybg/inset填充白底#F0F0F0ink/primary文字 14/500圆角 8高 32无边框。悬停变深 4%。Change、ViewOutline / dropdownbg/raised填充border/control圆角 10高 32右侧 16pxink/tertiarychevron。Cursor ⌄、Auto detect ⌄Ghost文字 14/400ink/secondary 可选图标透明圆角 8。悬停bg/hover。Share、Ask for approvalIcon32×32圆角 8图标 18pxink/secondary。悬停bg/hoverFloating circle36pxbg/raisedshadow-float图标 18pxink/secondary。滚动到底输入控件搜索 / 文本字段bg/inset圆角 10高 32水平内边距 1014px 文字占位符ink/tertiary前置 16px 图标。静止无边框焦点 强调色焦点环。开关40×24 轨道。关闭rgba(0,0,0,.16)/ 暗色rgba(255,255,255,.2)。开启accent/blue。白色旋钮 20px180ms。分段控件文字选项为 28px 高圆角 7 的片选中bg/selectedink/primary500未选中ink/tertiary400。Bottom | Right模型选择器ghost 文字按钮——名称 14/500ink/primary 变体 14/400ink/tertiary chevron。5.6 TerraMedium⌄聊天用户消息按 §3 的气泡无内联时间戳。日期分隔居中Small/tertiaryThu, Jun 25 at 2:38 PM。助手消息无气泡Body 16/26 直接铺在 canvas 上占满整列宽。正文排版有序列表 8px 间距、嵌套空心圆无序列表、行内代码作片bg/code圆角 6mono 13内边距2px 6px、链接accent/blue无下划线悬停下划线。工作披露Worked for 43s › UI/ink/secondary 发丝线规则线填充该行其余部分下方 16px 到正文。弹层 / 菜单Environment、Outputsbg/raised圆角 18shadow-popover内边距 8。头部行Headline 15/600 尾部 18px 图标按钮。行高 40 圆角 818px 图标ink/secondaryUI 标签尾部值/chevronink/tertiary。禁用行全部ink/faint。区块之间用 8px 间距分隔而非分隔线。面板列表Review / Terminal / Browser…行高 48图标 18 UI 标签 右对齐快捷键 Small/tertiary圆角 8悬停bg/hover。无边框。设置页页标题 Display下方 32px。区块小标题 Headline下方 12px。分组卡片bg/raised圆角 14发丝线边框内部行16px 20px。行左列标题 UI/500 描述 Small/tertiary间距 4px最长约 60 字符右列控件垂直居中。路径用 Mono-smallink/tertiary。侧栏栏体bg/sidebar与 canvas 之间无可见边框明度差即边框。红绿灯内缩16px。应用字标行15/600 chevron尾部图标按钮。导航行按 §3 指标。底行头像 名称 UI/500 尾部帮助图标12px 内边距固定。8. Spaces——多人流的方言设计这是整套设计语言中最有辨识度的部分。设计文档给出了明确的分工逻辑助手聊天是对话所以它有气泡。Space 是许多声音的记录所以它借用经典团队聊天的解剖结构——并且刻意借用团队聊天的对比度这是打破应用安静声音的唯一表面因为响亮粗重的名字、饱和的磁贴、细碎的提及正是让多人流可扫读的东西。这套方言通过--stream-*token 限定在流内生效避免污染全局--stream-link#1264A3/ 暗色#1D9BD1——一种青偏海军蓝的墨色用于链接、提及片、回复计数。应用全局的蓝色在其他地方保持不变。--stream-mention-washrgba(29,155,209,.13)/ 暗色.2——提及片背景。--stream-you-wash--stream-you-ink琥珀色水洗用于here/ 广播。这些 token 在 src/App.css浅色与 src/App.css暗色中真实存在并在 src/styles/spaces.css、message-row.tsx、thread-pane.tsx、unread-badge.tsx等 Spaces 组件中被消费。例如 message-row.tsx 中提及/回复链接的悬停态同时使用--rowboat-wash与--stream-link被提及的行则使用active:bg-[var(--stream-mention-wash)]。两种表面的对照助手聊天Spaces 流消息形态用户气泡 / 助手正文全宽署名行无气泡身份隐含你 vs. Agent36px 头像 名字15/800粗重 12px 三级时间戳头像圆形近方形磁贴圆角 4–6、饱和填充给人圆形保留给 AI密度Body 15/26间距 28Body 15/22行分组操作最后一条消息下方的图标行浮动悬停工具栏行右上角Spaces 的几何实现集中在 src/styles/spaces.css 顶部--spaces-avatar: 36px、--spaces-gutter: 20px、--spaces-control: 32px、--spaces-reaction: 28px、--spaces-header: 56px、--spaces-radius: 8px并注释说明几何在这里颜色跟随主题。解剖规则Anatomy rules行紧凑的 6px 垂直内边距悬停时全出血edge-to-edgebg/hover色带无圆角内缩。沟槽 36px 头像 12px 间距。分组同一作者 5 分钟内连续消息去掉头像/名字沟槽仅在悬停时显示时间戳11 三级、等宽数字。提及name是一个片——--stream-link文字叠在提及水洗上圆角 4内边距1px 3px字重 500。广播here和提及你的用琥珀水洗。提及是引用而非链接——无下划线。链接--stream-link不是应用全局蓝无下划线悬停下划线。悬停工具栏bg/raised 阴影内描边环shadow-soft圆角 1028px 图标按钮16px 图标ink/secondary——反应、回复到线程、分享、更多。行悬停时出现浮动在行右上角。对应 spaces.css 的实现visibility: hidden; opacity: 0起步:hover/:focus-within时淡入。反应带边框的胶囊——白色bg/canvas 可见control边框全圆角emoji 13 计数 11 等宽数字。你已反应 开关开启态--stream-link边框 提及水洗 蓝色计数。尾部 ghost 添加反应按钮在行悬停时出现。线程摘要迷你头像磁贴 N replies--stream-link粗体 13 三级元信息。静止无边框悬停抬升bg/raised 发丝线圆角 8——与常规卡片相反的反转处理。日分隔发丝线 居中带边框日期片——bg/canvas全圆角12/700。流比助手聊天的纯居中文字需要更强的断裂感。未读标记semantic/danger发丝线 同样红色的 New 11/500右对齐。状态已编辑 (edited) 12 三级后缀发送中 60% 不透明度失败 危险图标 重试 ghost。在场保持semantic/success圆点于头像角落输入中 ink/tertiary三点脉冲。文件/图片发丝线卡片圆角 10——文件类型徽章按 §5、名称 14/500、元信息 13 三级。图片裁剪到圆角 10 并带发丝线环。房间里的 Agentrowboat 保持助手身份——圆形墨黑头像运行时名字旁带semantic/git活动字形。它的正文像任何成员一样渲染无气泡。这些规则中的人/ AI 头像区分在组件层可见atoms.tsx中尺寸为xl的头像使用rounded-md近方形而非圆形见 atoms.tsx与设计文档人用方形磁贴、AI 用圆形的约定一致。9. 动效规范悬停水洗120ms ease-out。弹层/菜单160mscubic-bezier(0.2, 0, 0, 1)自锚点角落淡入 缩放 0.98→1。开关旋钮180ms 同曲线。工作披露展开200ms 高度 淡入。尊重prefers-reduced-motion以上全部折叠为仅透明度变化。实现层面spaces.css 已提供prefers-reduced-motion降级示例关闭消息操作与 composer 的 transition。10. 落地到 Rowboat三步替换src/App.css设计文档给出了应用这套语言到 src/App.css 的三步操作替换:root/.dark的 token 值把 body 字体栈切到系统字体把--radius设为 10px。下游的一切shadcn 组件、--rowboat-*扩展都会自动继承。浅色主题完整 Token 块:root { --radius: 0.625rem; /* 10px */ --background: #ffffff; --foreground: #0d0d0d; --card: #ffffff; --card-foreground: #0d0d0d; --popover: #ffffff; --popover-foreground: #0d0d0d; --primary: #0d0d0d; /* black actions, per the language */ --primary-foreground: #ffffff; --secondary: #f0f0f0; /* Change/View chips */ --secondary-foreground: #0d0d0d; --muted: #f1f1f1; /* code chips, quiet fills */ --muted-foreground: #8f8f8f; /* ink/tertiary */ --accent: rgba(0, 0, 0, 0.05); /* hover wash */ --accent-foreground: #0d0d0d; --destructive: #e5484d; --border: rgba(0, 0, 0, 0.07); /* hairline */ --input: rgba(0, 0, 0, 0.12); /* control borders */ --ring: #3478f6; --sidebar: #f4f4f4; --sidebar-foreground: #0d0d0d; --sidebar-primary: #0d0d0d; --sidebar-primary-foreground: #ffffff; --sidebar-accent: rgba(0, 0, 0, 0.06); /* selected pill */ --sidebar-accent-foreground: #0d0d0d; --sidebar-border: transparent; /* value shift is the border */ --sidebar-ring: #3478f6; --scrollbar-track: transparent; --scrollbar-thumb: rgba(0, 0, 0, 0.18); --scrollbar-thumb-hover: rgba(0, 0, 0, 0.3); --card-surface: #ffffff; --rowboat-panel: #f4f4f4; --rowboat-raised: #ffffff; --rowboat-wash: #ebebeb; /* inset fields */ --rowboat-hairline: rgba(0, 0, 0, 0.12); --rowboat-command: #0d0d0d; --rowboat-attention: #e5484d; --rowboat-shadow: 0 0 0 1px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.10), 0 4px 12px rgba(0,0,0,.05); --rowboat-shadow-soft: 0 0 0 1px rgba(0,0,0,.06), 0 8px 24px rgba(0,0,0,.06); /* Language extensions */ --rowboat-link: #3478f6; --rowboat-success: #1ea446; --rowboat-git: #8b5cf6; --rowboat-bubble: #0d0d0d; --rowboat-bubble-foreground: #ffffff; --rowboat-ink-secondary: #5d5d5d; }暗色主题完整 Token 块.dark { --background: #212121; --foreground: #ececec; --card: #2a2a2a; --card-foreground: #ececec; --popover: #2a2a2a; --popover-foreground: #ececec; --primary: #ececec; --primary-foreground: #0d0d0d; --secondary: #303030; --secondary-foreground: #ececec; --muted: #2e2e2e; --muted-foreground: #8a8a8a; --accent: rgba(255, 255, 255, 0.06); --accent-foreground: #ececec; --destructive: #f2555a; --border: rgba(255, 255, 255, 0.08); --input: rgba(255, 255, 255, 0.14); --ring: #5b94ff; --sidebar: #171717; --sidebar-foreground: #ececec; --sidebar-primary: #ececec; --sidebar-primary-foreground: #0d0d0d; --sidebar-accent: rgba(255, 255, 255, 0.09); --sidebar-accent-foreground: #ececec; --sidebar-border: transparent; --sidebar-ring: #5b94ff; --scrollbar-track: transparent; --scrollbar-thumb: rgba(255, 255, 255, 0.18); --scrollbar-thumb-hover: rgba(255, 255, 255, 0.3); --card-surface: #2a2a2a; --rowboat-panel: #171717; --rowboat-raised: #2a2a2a; --rowboat-wash: #303030; --rowboat-hairline: rgba(255, 255, 255, 0.14); --rowboat-command: #ececec; --rowboat-attention: #f2555a; --rowboat-shadow: 0 0 0 1px rgba(255,255,255,.08), 0 12px 32px rgba(0,0,0,.45), 0 4px 12px rgba(0,0,0,.3); --rowboat-shadow-soft: 0 0 0 1px rgba(255,255,255,.08), 0 8px 24px rgba(0,0,0,.35); --rowboat-link: #5b94ff; --rowboat-success: #3dcb70; --rowboat-git: #a78bfa; --rowboat-bubble: #303030; --rowboat-bubble-foreground: #ececec; --rowboat-ink-secondary: #a6a6a6; }字体栈body { font-family: -apple-system, BlinkMacSystemFont, SF Pro Text, Segoe UI, Inter, ui-sans-serif, system-ui, sans-serif; /* drop the Inter cv feature-settings — SF Pro doesnt need them */ }迁移清单Migration checklist把 token 块粘贴覆盖当前 src/App.css 中约 1120–1213 行的:root/.dark。注意其中的var(--bg-color, …)Monkeytype 风格主题间接层要么去掉要么把这些值移入 fallback。替换 body 字体栈系统优先Inter 兜底。--radius: 0.625rem—— shadcn 的radius-xl18px即匹配弹层radius-2xl24px匹配 composer。侧栏移除右边框--sidebar-border: transparent依靠#F4F4F4/#FFFFFF的明度差。按钮主按钮保持黑白已是--primary确保不存在蓝色按钮——蓝色只用于链接/开关/焦点。聊天用户气泡用--rowboat-bubble圆角 22助手消息为全宽正文 16/26行内代码片用--muted圆角 6。滚动条透明轨道上的细覆盖式 thumb见上文值。阴影只在弹层/菜单--rowboat-shadow、composer--rowboat-shadow-soft、浮动圆形按钮。卡片用发丝线边框无阴影。对照仓库现状可以确认这套规范已基本落地当前 src/App.css 的:root块约 1167–1190 行与.dark块约 1232–1250 行已经实现了文档中的--rowboat-*与--stream-*全部 token--radius-sm/md/lg/xl/2xl/3xl/4xl也按--radius基准派生Spaces 组件进一步通过 src/styles/spaces.css 与 src/styles/space-composer.css 承载几何尺寸形成颜色跟主题、几何在样式表的分层结构。如果你要在自己的 Tailwind v4 shadcn 项目里复刻这套语言直接按迁移清单执行即可组件层无需改动。总结Rowboat 设计语言的核心哲学可以收敛为三条黑色是操作色蓝色只做强调边框负责日常分隔阴影只留给三种悬浮物密度来自克制。而在 Spaces 多人流中这套安静语言被刻意打破——用--stream-*专属 token 限定了更高对比的团队聊天方言让人与 AI、对话与记录在同一个应用中各得其所。配合 DESIGN_LANGUAGE.md 原文与 src/App.css、src/styles/spaces.css 的实现你可以直接把这套规范复用到任何 Tailwind v4 shadcn 项目或者反过来用这套规范检验 Rowboat 界面的每一次改动是否符合其设计初衷。【免费下载链接】rowboatOpen-source AI coworker, with memory项目地址: https://gitcode.com/GitHub_Trending/rowb/rowboat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考