营销软件 · 新资源

Sprout Social Seeds 设计系统.

通过完整的编辑审核队列,检查 Seeds 实际公开的颜色、间距、产品字体排印和边框令牌;队列支持混合选择、筛选后的空状态和撤销操作。

OpenDesign 指南6 个章节38 条参考条目原始应用指南
01

Sprout Social Seeds 设计系统界面预览

选择可见帖子,检查混合选择状态,并在筛选后的批量更改后恢复或撤销操作。

准备一小组待审核的编辑内容打开完整示例
原生 Seeds 令牌 CSS,搭配完整原创的 HTML/JavaScript 队列行为。· 实现参考
02

Sprout Social Seeds 设计系统设计参考

实际安装的 Seeds 配色 2.5.0、间距 0.8.1、字体排版 3.8.0 和边框 1.7.1 CSS 导出项。

产品研究配色参考

来源
名称 / 规则值 / 配置用途
--color-neutral-0#ffffff 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-neutral-100#f3f4f4 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-neutral-200#dee1e1 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-neutral-700#515e5f 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-neutral-900#273333 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-blue-0#e9f4ff 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-blue-300#a1c2f8 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-blue-700#205bc3 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-green-100#d7f4d7 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。
--color-green-900#006b40 实际发布的配色令牌。它们在此原创队列中的操作和状态映射由应用自行决定。

完整的固定间距比例

来源
名称 / 规则值 / 配置用途
--space-size--00px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--1002px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--2004px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--3008px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--35012px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--40016px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--45024px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--50032px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。
--space-size--60040px实际的 CSS 像素令牌。该软件包还提供以 18px 为基准的 rem 等值;请勿假设它们是按 16px 换算的。

产品字体与易读的内容密度

来源
名称 / 规则值 / 配置用途
--typography-familysystem-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--10011px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--20013px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--30016px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--40018px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--50021px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--60024px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-font-size--70032px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-line-height--30024px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。
--typography-line-height--50029.333333333333332px已发布的字体排版软件包数值。产品示例使用系统字体系列,而非用于营销的 Proxima Nova 字体。

形状与边框比例

来源
名称 / 规则值 / 配置用途
--border-radius-4004px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-radius-5006px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-radius-6008px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-radius-80012px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-radius-90024px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-radius-1000999999px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-width-5001px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-width-6002px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
--border-width-7003px实际的边框软件包数值;原创卡片采用 8px 圆角和 1px 边框。
03

Sprout Social Seeds 设计系统完整指南

实用指南,介绍如何为真实界面选择、应用和评审此系统。

DESIGN-sprout-seeds.md

完整指导、实现起点和源代码链接。

下载指南

Sprout Social Seeds 设计系统产品令牌与运行时范围

使用产品基础样式

Seeds 将产品字体排版与品牌字体排版区分开来。此队列使用公开字体排版软件包中的实际系统字体系列令牌,以及已发布的配色、间距和边框令牌。它不会加载营销字体后再声称复现了产品系统。设置中固定了软件包版本,以便参考内容与示例保持可比。

摘自本 OpenDesign 指南

区分令牌与组件

加载 Seeds 令牌软件包会公开变量,但不会生成帖子编辑器或 React 组件树。本示例中的卡片、选择逻辑和本地审核操作均为原创 OpenDesign 代码。本页面特意将其称为基于令牌的实现。Seeds 原生 React 组件需要通过官方组件资源进行集成,并有各自的集成要求。

Sprout Social Seeds 设计系统配色、间距与字体参考

使用准确的令牌名称

参考内容包含实际导出的名称,例如对应 12px 的 --space-size--350 和对应 8px 的 --border-radius-600。不能通过比例标签乘算来推测这些名称。CSS 会直接导入令牌文件并使用其中的变量,因此读者可以将渲染值追溯到固定版本的发行包,而不是猜测配色。

留意 rem 基准值

间距软件包同时提供像素和 rem 形式。例如,16px 的间距步长也表示为 0.8888888888888888rem,反映了 18px 的基准值。本示例使用像素令牌形式,以明确呈现预期间距。若直接将这些 rem 值用于 16px 的根字号,内容密度会发生变化,而非保持原样。

Sprout Social Seeds 设计系统编辑卡片与审核场景

让每张卡片在交互前就有用

每张卡片都包含一个渠道、一种状态、一个原创标题和一段完整的简短帖子。次级展开区提供审核标准。内容为虚构的练习素材,工作区也未连接任何社交账号。因此,卡片可以呈现可信的任务场景,同时不会暗示用户可以访问真实帖子或分析数据。

让品牌强调色不影响阅读

蓝色用于标示原创队列中的审核操作,绿色则搭配“待审核”状态文字。这些角色分配是应用层面的决定,使用的是真实配色条目。状态始终以文字明示,因此其含义不依赖颜色辨识。边框和间距用于区分三条帖子,同时保留易读内容,不以装饰性占位内容取而代之。

Sprout Social Seeds 设计系统可见项选择与混合状态

让批量选择始终对应当前视图

“选择可见帖子”仅作用于筛选后的记录。多个可见卡片中只选择一个时,批量复选框会进入原生的不确定状态。更改筛选条件会清除选择,避免后续操作修改隐藏的记录。可见数量会同时显示当前显示的记录数和已选数量。

  • 批量选择仅作用于可见记录。
  • 混合选择使用原生的 indeterminate 属性。
  • 更改筛选条件会清除选择。
  • 操作状态根据已选草稿记录计算。

仅在操作有实际意义时启用

Sprout Social Seeds 设计系统:筛选后的空状态与撤销

让空队列仍可恢复

在“草稿”视图中将所有可见草稿标记为待审核后,结果自然会变为空。空状态会说明这些记录仍然存在,并提供“显示所有帖子”选项。对于已知的本地结果,不会显示加载动画,也不会虚构网络错误。没有匹配项与没有记录这两种情况会明确区分。

撤销最近一次实际更改

应用只会为最近一次审核操作中被修改的记录保存先前状态。撤销会恢复这些状态、重新渲染当前视图,并将焦点移回筛选器。它不会重置无关记录,也不会假装撤回已发布的社交媒体帖子。后续批量操作会替换唯一可用的撤销操作,与“撤销上次更改”的标签一致。

Sprout Social Seeds 设计系统:完整可运行的队列与检查

使用全部四类令牌分发包

源代码会在原有组合样式表之前导入颜色、间距、排版和边框 CSS。请将完整的 main.js、seeds.css 和 HTML 外壳一并保存。预览使用相同的公开令牌值和应用代码打包,不依赖远程字体或后端。安装命令中列出了确切的包版本。

  1. 安装四个固定版本的 Seeds 令牌包。
  2. 保存提供的入口文件、CSS 和根 HTML。
  3. 更改筛选条件前,先测试混合选择。
  4. 批量审核后,验证筛选结果为空时的恢复方式和撤销功能。

测试多种状态组合

选择一篇帖子,确认批量复选框显示混合状态。切换到“草稿”,确认选择已清除。选中可见草稿,将其标记为待审核,然后检查空结果。撤销后确认两篇草稿恢复,再显示所有帖子。在手机屏幕宽度下,卡片会变为单列布局,同时标签和审核控件仍可访问。

Sprout Social Seeds 设计系统:组件示例

main.js — 完整的编辑队列

原始数据、筛选、混合选择、批量更改和撤销。

javascript
import '@sproutsocial/seeds-color/dist/seeds-color.css';
import '@sproutsocial/seeds-space/dist/seeds-space.css';
import '@sproutsocial/seeds-typography/dist/seeds-typography.css';
import '@sproutsocial/seeds-border/dist/seeds-border.css';
import './seeds.css';
let items=[{id:'p1',title:'A clearer first step',channel:'Team updates',copy:'A useful guide starts with the task someone needs to complete. This week, we are revisiting the first step in our workshop toolkit.',status:'Draft'},{id:'p2',title:'Room for different perspectives',channel:'Community notes',copy:'Good workshop preparation creates more than an agenda. It gives people time to think and more than one way to contribute.',status:'Draft'},{id:'p3',title:'From notes to next actions',channel:'Team updates',copy:'Close a conversation with a decision, an owner and a date to look again. Keep open questions visible alongside the agreed next step.',status:'Ready for review'}];let chosen=new Set(),previous=null;
document.querySelector('#root').innerHTML=`<main><header><div><p class="eyebrow">OpenDesign · Editorial practice</p><h1>A small queue, ready for a closer look</h1><p>Prepare original sample posts for review. This workspace does not connect to social accounts or publish content.</p></div><span class="badge">3 sample posts</span></header><section class="filters" aria-label="Queue controls"><label>Status <select id="filter"><option>All posts</option><option>Draft</option><option>Ready for review</option></select></label><label class="select-all"><input type="checkbox" id="all">Select visible posts</label><button id="review" disabled>Mark ready for review</button></section><p id="count" role="status"></p><div id="posts"></div><section id="empty" hidden><h2>No posts in this view</h2><p>Your sample posts remain available in the full queue.</p><button id="clear">Show all posts</button></section><div id="notice" hidden><p id="message" role="status"></p><button id="undo">Undo last change</button></div><footer>Uses the published Seeds color, space, typography and border token packages. The post cards, selection model and local review action are original OpenDesign code, not Sprout Social’s application or native React components.</footer></main>`;
function visible(){let value=document.querySelector('#filter').value;return items.filter(x=>value==='All posts'||x.status===value)}
function updateSelection(){let rows=visible(),selected=rows.filter(x=>chosen.has(x.id));const all=document.querySelector('#all');all.checked=rows.length>0&&selected.length===rows.length;all.indeterminate=selected.length>0&&selected.length<rows.length;all.disabled=!rows.length;document.querySelector('#review').disabled=!selected.some(x=>x.status==='Draft');document.querySelector('#count').textContent=`${rows.length} posts shown · ${selected.length} selected`;}
function render(){let rows=visible();chosen=new Set([...chosen].filter(id=>rows.some(x=>x.id===id)));const root=document.querySelector('#posts');root.replaceChildren(...rows.map(x=>{let a=document.createElement('article');a.innerHTML=`<div class="post-head"><label><input type="checkbox" data-id="${x.id}" aria-label="Select ${x.title}" ${chosen.has(x.id)?'checked':''}><span class="channel">${x.channel}</span></label><span class="status ${x.status==='Draft'?'draft':'ready'}">${x.status}</span></div><h2>${x.title}</h2><p class="copy">${x.copy}</p><details><summary>Review checklist</summary><ul><li>The first sentence makes the subject clear.</li><li>The wording describes a real next step.</li><li>The post does not promise an unavailable feature.</li></ul></details>`;a.querySelector('input').onchange=e=>{e.target.checked?chosen.add(x.id):chosen.delete(x.id);updateSelection()};return a}));document.querySelector('#empty').hidden=rows.length>0;updateSelection();}
document.querySelector('#filter').onchange=()=>{chosen.clear();render()};document.querySelector('#all').onchange=e=>{chosen=new Set(e.target.checked?visible().map(x=>x.id):[]);render()};document.querySelector('#review').onclick=()=>{let changed=items.filter(x=>chosen.has(x.id)&&x.status==='Draft');if(!changed.length)return;previous=changed.map(x=>({id:x.id,status:x.status}));changed.forEach(x=>x.status='Ready for review');chosen.clear();render();document.querySelector('#notice').hidden=false;document.querySelector('#message').textContent=`${changed.length} ${changed.length===1?'post marked':'posts marked'} ready for review locally. Nothing was published.`;};document.querySelector('#undo').onclick=()=>{previous?.forEach(p=>{items.find(x=>x.id===p.id).status=p.status});previous=null;render();document.querySelector('#notice').hidden=true;document.querySelector('#filter').focus()};document.querySelector('#clear').onclick=()=>{document.querySelector('#filter').value='All posts';render();document.querySelector('#filter').focus()};render();

代码参考

  • 这不代表存在社交媒体 API、发布操作或原生 React 组件。

seeds.css — 使用真实令牌构建布局

完整的响应式布局使用已安装的 CSS 变量。

css
*{box-sizing:border-box}body{margin:0;font:var(--typography-font-size--300)/var(--typography-line-height--300) var(--typography-family);color:var(--color-neutral-900);background:var(--color-neutral-100)}main{max-width:1160px;padding:var(--space-size--500);margin:auto}header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;margin-bottom:32px}h1{font-size:var(--typography-font-size--700);line-height:var(--typography-line-height--700);margin:8px 0 16px;max-width:24ch}header p:last-child{max-width:64ch}.eyebrow,.badge{font-size:13px;font-weight:600}.badge{white-space:nowrap;background:var(--color-green-100);color:var(--color-green-900);padding:8px 12px;border-radius:var(--border-radius-400)}.filters{display:flex;align-items:center;gap:24px;flex-wrap:wrap;padding:24px;background:white;border:1px solid var(--color-neutral-200);border-radius:var(--border-radius-600)}label{display:flex;align-items:center;gap:8px}select,button{font:inherit;border:1px solid var(--color-neutral-600);border-radius:var(--border-radius-400);padding:8px 12px;min-height:40px}select{background:white;color:var(--color-neutral-900);max-width:100%}button{background:var(--color-blue-700);color:white;border-color:var(--color-blue-700);font-weight:600;cursor:pointer}button:disabled{opacity:.5;cursor:default}input{width:18px;height:18px;accent-color:var(--color-blue-700);flex-shrink:0}#count{font-size:13px;color:var(--color-neutral-700);margin:24px 0 16px}#posts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}article{display:flex;flex-direction:column;border:1px solid var(--color-neutral-200);border-radius:var(--border-radius-600);padding:24px;background:white;min-width:0}.post-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}.channel,.status{font-size:13px}.status{padding:2px 8px;border-radius:4px}.draft{background:var(--color-neutral-100)}.ready{background:var(--color-green-100);color:var(--color-green-900)}h2{font-size:21px;line-height:29.333px;margin:24px 0 16px}.copy{min-height:144px}details{border-top:1px solid var(--color-neutral-200);padding-top:16px;margin-top:auto;font-size:13px;line-height:1.6}summary{cursor:pointer;font-weight:600}details ul{padding-left:20px}details li{margin:8px 0}#notice{display:flex;justify-content:space-between;align-items:center;gap:24px;background:var(--color-blue-0);border:1px solid var(--color-blue-300);border-radius:8px;padding:16px 24px;margin-top:24px}#notice p{margin:0}#empty{background:white;padding:24px;border-radius:8px}#empty h2{margin-top:0}footer{font-size:13px;line-height:1.6;border-top:1px solid var(--color-neutral-200);margin-top:32px;padding-top:24px}:focus-visible{outline:3px solid var(--color-blue-700);outline-offset:3px}[hidden]{display:none!important}@media(max-width:850px){#posts{grid-template-columns:1fr}.copy{min-height:0}header{flex-wrap:wrap}#notice{flex-wrap:wrap}}@media(max-width:480px){main{padding:16px}.filters,article{padding:16px}.filters>label:first-child{flex-wrap:wrap}h1{font-size:24px;line-height:32px}.filters{gap:16px}.eyebrow{overflow-wrap:anywhere}}

代码参考

  • 调色板与用途之间的对应关系是本应用自行设定的。

index.html — 完整的应用外壳

本地应用的根元素和入口。

html
<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Editorial review queue</title></head><body><div id="root"></div><script type="module" src="/src/main.js"></script></body></html>

代码参考

  • 用此文件替换根目录中的 Vite index.html。
04

Sprout Social Seeds 设计系统:AI Agent 配置指南

实现起点

这些是公开的令牌包。上文提供的完整审核应用为原创代码。

sh
npm create vite@latest seeds-review -- --template vanilla
cd seeds-review
npm install
npm install @sproutsocial/[email protected] @sproutsocial/[email protected] @sproutsocial/[email protected] @sproutsocial/[email protected]
# Save index.html at root; main.js and seeds.css in src.
npm run dev

适用于你项目的提示词

Agent 提示词
使用固定版本的公开 Seeds 令牌 CSS 构建上文提供的编辑队列。保留真实的令牌名称、系统产品字体排版、仅针对可见项的选择、原生混合状态、仅批量更新草稿、空状态恢复功能以及单步撤销。保留原始示例内容,不得暗示已连接社交账号或执行了发布操作。
05

Sprout Social Seeds 设计系统:来源与范围

这是一个使用已发布 Seeds 令牌包构建的原创 OpenDesign 应用。卡片和审核工作流均为原创 HTML/JavaScript,并非 Seeds 原生 React 组件。应用未连接任何社交账号,也不会发布任何内容。