服务市场 · 新资源

Thumbtack Thumbprint 设计系统.

使用 Thumbprint 文档中记录的 v2 基础组件,构建服务发现界面:紧凑的服务提供方卡片、清晰易读的对比详情、明确的选择状态,以及常驻的候选清单。

OpenDesign 指南8 个章节37 条参考条目原始应用指南
01

Thumbtack Thumbprint 设计系统界面预览

筛选虚构的园艺服务、收藏服务商,并查看本地候选清单。

比较服务商并整理候选清单打开完整示例
对选定 Thumbprint v2 基础构件的原创 HTML 解读。 · 实现参考
02

Thumbtack Thumbprint 设计系统设计参考

Thumbprint 公开的 v2 JavaScript 令牌参考;数值读取于 2026 年 10 月。示例中的数值尺寸已换算为 CSS 像素。

基础颜色与应用角色

来源
名称 / 规则值 / 配置用途
tpV2ColorGray50#f5f6f6 克制的候选清单界面表面。
tpV2ColorGray200#dddee1 卡片边界与分隔线。
tpV2ColorGray600#595c61 白色背景上的次要信息。
tpV2ColorGray900#2b2d2f 正文。
tpV2ColorBlue50#f0faff 选中控件的界面表面。
tpV2ColorBlue100#e0f4fe 原创小屋插图填充色。
tpV2ColorBlue600#009fd9 参考基础色;不用于小号白色文字。
tpV2ColorBlue700#0175A3 应用操作色,搭配白色文字。
tpV2ColorBlue800#066286 焦点轮廓与插图描边。
tpV2ColorGreen50#eefbf4 可用状态标签的界面表面。
tpV2ColorGreen200#b0eacb 装饰性花园插图。
tpV2ColorGreen700#126a4b 可用状态文字。

间距与圆角

来源
名称 / 规则值 / 配置用途
tpV2SpaceXxsmall4数值,单位为像素;用于布局间距。
tpV2SpaceXsmall8数值,单位为像素;用于布局间距。
tpV2SpaceSmall12数值,单位为像素;用于布局间距。
tpV2SpaceMedium16数值,单位为像素;用于布局间距。
tpV2SpaceLarge20数值,单位为像素;用于布局间距。
tpV2SpaceXlarge24数值,单位为像素;用于布局间距。
tpV2SpaceXxlarge32数值,单位为像素;用于布局间距。
tpV2CornerRadiusXsmall4数值,单位为像素;示例中控件使用 Medium,卡片使用 Large。
tpV2CornerRadiusSmall6数值,单位为像素;示例中控件使用 Medium,卡片使用 Large。
tpV2CornerRadiusMedium8数值,单位为像素;示例中控件使用 Medium,卡片使用 Large。
tpV2CornerRadiusLarge12数值,单位为像素;示例中控件使用 Medium,卡片使用 Large。
tpV2CornerRadiusXlarge16数值,单位为像素;示例中控件使用 Medium,卡片使用 Large。
tpV2CornerRadiusSides9999数值,单位为像素;示例中控件使用 Medium,卡片使用 Large。

响应式字号与布局

来源
名称 / 规则值 / 配置用途
tpV2BreakpointSmall481px小型布局断点。
tpV2BreakpointMedium700px示例在此断点切换为两栏布局。
tpV2BreakpointLarge1025px大型布局断点。
tpV2BreakpointSplitViewSmall769px仅适用于分栏视图的断点,并非 Medium 的同义词。
tpV2BreakpointSplitViewMedium1060px更宽的分栏视图断点。
tpV2FontTitle2Size28小屏幕标题字号,单位为像素。
tpV2FontTitle2ResponsiveSize36大屏幕标题字号,单位为像素。
tpV2FontTitle2LineHeight1.1无单位的标题行高;独立于语义化标题层级。
tpV2FontText1Size16正文文字字号。
tpV2FontText1LineHeight1.4正文行高倍数。
tpV2FontWeightRegular400常规正文文字。
tpV2FontWeightBold700使用后备字体时的强调样式。
03

Thumbtack Thumbprint 设计系统完整指南

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

DESIGN-thumbtack-thumbprint.md

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

下载指南

Thumbtack Thumbprint 设计系统:选择令牌代际

区分 v1 与 v2

Thumbprint 提供两个令牌代际。v2 导出项以 tpV2 开头,并包含新的灰色色阶、响应式标题值和更多中间字重。组件若在 v1 路径下记录,并不能证明它使用了这些 v2 数值。在替换共享样式之前,请记录产品当前使用的软件包和令牌代际。

摘自本 OpenDesign 指南

将此示例用作布局构成参考

此示例直接将公开的基础组件应用于原创的 HTML。它不会封装 ServiceCard,也不声称功能与 Thumbtack 应用完全一致。原生实现应从文档中说明的软件包 API 入手,并且只有在定义好加载、错误和权限约定后,才替换为真实服务数据。

Thumbtack Thumbprint 设计系统颜色角色与选择状态

区分操作、选择与可用状态

主要操作使用 Blue700,已保存控件使用 Blue50,可用时间文本使用 Green700 搭配 Green50。服务提供者名称使用 Gray900,辅助详情使用 Gray600。这些映射是基于文档所述基础组件做出的应用层选择,并非虚构的语义令牌名称。

避免仅用颜色表示候选清单状态

已保存的服务提供者不仅会改变按钮色调,还会更新按钮标签和 aria-pressed 状态。可用时间始终以文字描述。筛选可以隐藏已保存的服务提供者,但不会将其从候选清单中删除;清单仍保持可见,让用户了解二者的区别。

Thumbtack Thumbprint 设计系统排版与内容

注意不同版本的字体差异

公开的排版指南列出了 400 和 700 两种字重的 Rise,以及较早的响应式标题字号阶梯。v2 令牌页面则包含不同的字号和非整数权重。不要将两者混合,臆造出一个统一的默认规范。此预览使用系统字体回退,字号明确参考 v2 阶梯,并且不会重新分发 Rise。

撰写有助于比较的详情

每位服务提供者都包含服务类别、简短描述和易读的可用时间标签。目录有意省略了虚构的评价数量、评分和价格。在真实的交易平台中,这些数据必须有可靠的来源和单位;装饰性星级只会带来虚假的信任感,而非有用的信息。

Thumbtack Thumbprint 设计系统卡片、间距与响应式布局

将比较信息放在一起

服务提供者卡片使用 24px 内边距、16px 内部间距和 12px 圆角。姓名首字母仅作装饰;相邻的标题才是无障碍名称。卡片不会将整个界面表面变成嵌套链接。保存操作保留为独立按钮,避免将来添加个人资料链接时吞并选择行为。

在窄屏上将候选清单移至下方

Thumbtack Thumbprint 设计系统筛选与候选清单状态

让筛选条件与已保存状态彼此独立

类别选择框和可用时间复选框会筛选三条预设记录。选择“园艺养护”和“本周有空”会得到空结果,并显示重置操作。先前保存的记录仍保留在候选清单中,因为筛选不等于删除。此规则在源码中清晰可见,无需后端即可验证。

让确认操作给出真实反馈

候选清单为空时,查看操作会说明接下来该怎么做。清单非空时,会报告其中的条目数,并明确说明操作仅在本地进行。更改已保存的项目会清除该反馈,避免过时的确认信息与当前清单不符。此示例不会声称已联系专业人士。

Thumbtack Thumbprint 设计系统键盘操作与无障碍选择

使用原生语义实现控件

带标签的选择框用于选择类别,带标签的复选框用于设置布尔条件。每个保存按钮都有针对具体服务提供者的无障碍名称和 aria-pressed 属性。结果数量使用礼貌式实时区域;查看反馈使用状态语义。键盘焦点无论是否悬停都清晰可见。

使用实际标题并保持高度灵活

示例中的服务提供者名称使用 h2 元素,而非加粗的 span。姓名首字母和原创装饰性 SVG 不会出现在无障碍树中。长名称和长描述应当自动换行,且不能将操作挤出屏幕;放大文本时应使用高度灵活的行布局,而不是截断文本。

Thumbtack Thumbprint 设计系统完整实现

运行并检查完整示例

将 HTML 示例保存为 index.html,并通过服务器提供该文件所在文件夹。示例内含 CSS 和 JavaScript,无需安装软件包,也不依赖网络。三条记录和选择 Set 均明确写出,因此可以直接调整行为,无需逆向分析生成的构建包。

  1. 保存完整的 HTML 文件。
  2. 在本地运行并在浏览器中打开。
  3. 筛选出空结果,然后重置。
  4. 保存两家服务商,查看候选清单,然后移除一家。

有意升级到原生组件

迁移到 React 库时,请查看当前使用版本对应的 ServiceCard、Button 和字体文档,确认准确的版本。若符合产品需求,可保留此示例中的状态模型,但要用经过验证的 API 替换原始标记。不要将 v2 的取值直接套用到 v1 组件上,除非已完成视觉和键盘回归检查。

Thumbtack Thumbprint 设计系统 AI Agent 交接与评审

为 AI Agent 设定明确的任务范围

请使用选定版本的 Thumbprint,设计一个家居服务对比页面,并明确标注来源网址及仅供本地使用的虚构记录。保留筛选与选择之间的区别。将完整示例作为行为参考,并说明预期使用原生 React 组件还是独立的 HTML。

检查异常路径

  • 筛选时,已保存的状态仍会保留。
  • 更改候选清单后,旧的确认状态会清除。
  • 不会虚构评分或联系结果。

Thumbtack Thumbprint 设计系统组件示例

完整的家居项目候选清单

独立且完整的 HTML/CSS/JavaScript 示例,包含筛选、选中状态、空状态恢复和本地查看功能。

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Home project shortlist</title><style>
:root{--ink:#2b2d2f;--muted:#595c61;--line:#dddee1;--soft:#f5f6f6;--action:#0175a3;--selected:#f0faff}*{box-sizing:border-box}body{margin:0;padding:32px;font:400 16px/1.4 system-ui,sans-serif;color:var(--ink);background:white}h1{font-size:36px;line-height:1.05;letter-spacing:-.02em;margin:12px 0}h2{font-size:22px;margin:0 0 8px}p{margin:8px 0 20px}.eyebrow,.meta{font-size:14px;color:var(--muted)}header{display:grid;grid-template-columns:1fr 180px;gap:32px;align-items:center;border-bottom:1px solid var(--line);padding-bottom:24px}svg{width:180px;height:120px}.filters{display:flex;gap:24px;align-items:center;flex-wrap:wrap;margin:24px 0}select,button{font:inherit;border:1px solid var(--line);border-radius:8px;min-height:44px;padding:10px 16px;background:white;color:var(--ink)}label{display:flex;align-items:center;gap:8px}input{accent-color:var(--action);width:18px;height:18px}main{display:grid;grid-template-columns:2fr 1fr;gap:24px}.cards{display:grid;gap:16px}.card{padding:24px;border:1px solid var(--line);border-radius:12px;display:grid;grid-template-columns:48px 1fr auto;gap:16px;align-items:start}.avatar{display:grid;place-items:center;border-radius:50%;height:48px;background:var(--selected);color:var(--action);font-weight:700}.card p{margin:4px 0 12px}.card button[aria-pressed=true]{background:var(--selected);border-color:var(--action);color:var(--action)}.badge{display:inline-block;background:#eefbf4;color:#126a4b;padding:4px 8px;border-radius:6px;font-size:14px}aside{align-self:start;border:1px solid var(--line);border-radius:12px;padding:24px;background:var(--soft)}aside ul{padding-left:20px}aside li{margin:12px 0}.primary{background:var(--action);color:white;border-color:var(--action)}button{cursor:pointer}button:hover{border-color:var(--action)}button:focus-visible,select:focus-visible,input:focus-visible{outline:3px solid #066286;outline-offset:3px}#notice{font-size:14px;color:#126a4b}footer{font-size:12px;color:var(--muted);margin-top:24px}#empty{padding:24px;border:1px dashed var(--line);border-radius:12px}[hidden]{display:none!important}@media(max-width:699px){body{padding:20px}header{grid-template-columns:1fr}header svg{display:none}h1{font-size:28px}main{grid-template-columns:1fr}.card{grid-template-columns:40px 1fr;padding:16px}.avatar{height:40px}.card button{grid-column:2;justify-self:start}}
</style><body><header><div><span class="eyebrow">HOME PROJECT / FICTIONAL DIRECTORY</span><h1>Find the right help for home</h1><p>Compare the details, then build a shortlist for a garden project.</p></div><svg viewBox="0 0 180 120" aria-hidden="true"><path d="M20 66 84 16l64 50v45H20z" fill="#e0f4fe"/><path d="m9 68 75-58 75 58" fill="none" stroke="#0175a3" stroke-width="5"/><path d="M65 110V70h38v40" fill="#fff" stroke="#066286" stroke-width="3"/><circle cx="146" cy="80" r="24" fill="#b0eacb"/><path d="M146 80v35" stroke="#126a4b" stroke-width="4"/></svg></header><div class="filters"><label>Project type <select id="category"><option value="all">All garden services</option><option value="design">Garden design</option><option value="care">Garden care</option></select></label><label><input id="available" type="checkbox">Available this week</label><span id="count" class="meta" aria-live="polite"></span></div><main><section aria-label="Service providers"><div id="cards" class="cards"></div><div id="empty" hidden><h2>No matching services</h2><p>Try a different project type or include later availability.</p><button id="reset">Reset filters</button></div></section><aside><h2>Project shortlist</h2><p class="meta">Saved only while this preview is open.</p><ul id="saved"></ul><p id="savedEmpty">Save a provider to compare your options.</p><button class="primary" id="review">Review shortlist</button><p id="notice" role="status"></p></aside></main><footer>Original HTML study using documented Thumbprint v2 primitives. System font fallback; no Thumbtack service, ratings or contact request.</footer><script>
const providers=[{id:'fern',name:'Fern & Field',type:'design',description:'Planting plans for small outdoor spaces.',timing:'This week',available:true,initials:'FF'},{id:'grove',name:'Grove Garden Care',type:'care',description:'Seasonal pruning, planting and routine care.',timing:'Next week',available:false,initials:'GG'},{id:'yard',name:'Yard Workshop',type:'design',description:'Practical layouts for shared courtyards.',timing:'This week',available:true,initials:'YW'}];const chosen=new Set();const $=id=>document.getElementById(id);
function render(){const shown=providers.filter(p=>($('category').value==='all'||p.type===$('category').value)&&(!$('available').checked||p.available));$('cards').replaceChildren(...shown.map(p=>{const card=document.createElement('article');card.className='card';card.innerHTML=`<span class="avatar" aria-hidden="true">${p.initials}</span><div><h2>${p.name}</h2><p>${p.description}</p><span class="badge">${p.timing}</span></div><button aria-pressed="${chosen.has(p.id)}" aria-label="${chosen.has(p.id)?'Remove':'Save'} ${p.name}">${chosen.has(p.id)?'Saved':'Save'}</button>`;card.querySelector('button').onclick=()=>{chosen.has(p.id)?chosen.delete(p.id):chosen.add(p.id);$('notice').textContent='';render()};return card}));$('count').textContent=`${shown.length} of ${providers.length} sample providers`;$('empty').hidden=shown.length>0;$('saved').replaceChildren(...providers.filter(p=>chosen.has(p.id)).map(p=>{const li=document.createElement('li');li.textContent=p.name;return li}));$('savedEmpty').hidden=chosen.size>0;}
$('category').onchange=render;$('available').onchange=render;$('reset').onclick=()=>{$('category').value='all';$('available').checked=false;render()};$('review').onclick=()=>{$('notice').textContent=chosen.size?`Shortlist ready: ${chosen.size} provider${chosen.size===1?'':'s'}. No contact request has been sent.`:'Save at least one provider first.'};render();
</script></body></html>

代码参考

  • 另存为 index.html。此示例未使用原生 Thumbprint 组件运行时。
04

Thumbtack Thumbprint 设计系统 AI Agent 设置

实现起点

无需软件包或 API 凭据。此示例是本地应用研究。

sh
# Save the complete HTML example as index.html
python3 -m http.server 8080
# Open http://localhost:8080

适用于你项目的提示词

Agent 提示词
使用本指南中的 Thumbprint v2 取值构建服务对比页面。筛选时保留本地候选清单,包含空状态恢复界面,并确保查看反馈与所选项目同步。使用虚构记录和原生语义化 HTML,除非明确选择经过验证的 Thumbprint React 软件包。不要混用 v1 组件假设与 v2 令牌名称。
05

Thumbtack Thumbprint 设计系统来源与范围

一份关于 Thumbprint 的 OpenDesign 应用指南。此处的工作示例是原创的 HTML,使用选定的 v2 取值,并非原生 Thumbtack React 库。公开的字体指南描述的是旧版比例;本页将其与 v2 令牌参考分开说明。所有服务商均为虚构。