https://linear.app

页面构成与技术指标

正文

1309

操作候选

48

图片

38

HTML

1238 KB

文案

标题字数
43
摘要字数
64
H1
1
H2
7

动作

主要入口

Sign up

表单
0/ 2 输入
站内链接
70
站外链接
4

安全与页面元信息

HTTPS
HSTS
CSP
nosniff
viewport
图标
JSON-LD
统计

构成

Next.js / Tailwind

脚本
6 ext / 178 inline
Alt
27 missing
语言
en
第三方域

Lighthouse

移动端模拟 · 性能评分

56 / 100

2026-09-05 · 实验室数据,非真实用户体验数据。

查看详情

移动端模拟 · 实验室数据,非真实用户体验数据
2026-09-05T03:58:46.586Z · Lighthouse 13.4.1

性能56/ 100
可访问性81/ 100
最佳实践92/ 100
SEO100/ 100
LCP · 主要内容出现15,604 ms
CLS · 布局偏移0.000
TBT · 主线程阻塞130 ms
FCP · 首次内容绘制8,089 ms
SI · 视觉加载速度8,089 ms

分数会受服务器、网络和测试环境影响,独立于品味/转化评分。诊断保留 Lighthouse 原文。

Browser errors were logged to the console

Errors logged to the console indicate unresolved problems. They can come from network request failures and other browser concerns. Learn more about this errors in console diagnostic audit

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "source": "exception",
      "description": "Error: Minified React error #419; visit https://react.dev/errors/419 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.",
      "sourceLocation": {
        "url": "https://static.linear.app/web/_next/static/chunks/index-GKpBX9i4.js",
        "line": 2,
        "type": "source-location",
        "column": 92,
        "urlProvider": "network"
      }
    },
    {
      "source": "exception",
      "description": "Error: Minified React error #419; visit https://react.dev/errors/419 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.",
      "sourceLocation": {
        "url": "https://static.linear.app/web/_next/static/chunks/index-GKpBX9i4.js",
        "line": 2,
        "type": "source-location",
        "column": 92,
        "urlProvider": "network"
      }
    }
  ],
  "headings": [
    {
      "key": "sourceLocation",
      "label": "Source",
      "valueType": "source-location"
    },
    {
      "key": "description",
      "label": "Description",
      "valueType": "code"
    }
  ]
}

Reduce initial server response time

Root document took 1,120 ms

Keep the server response time for the main document short because all other requests depend on it. Learn more about the Time to First Byte metric.

对应元素与资源
{
  "type": "opportunity",
  "items": [
    {
      "url": "https://linear.app/",
      "responseTime": 1117
    }
  ],
  "headings": [
    {
      "key": "url",
      "label": "URL",
      "valueType": "url"
    },
    {
      "key": "responseTime",
      "label": "Time Spent",
      "valueType": "timespanMs"
    }
  ],
  "overallSavingsMs": 1017
}

Minimize main-thread work

4.1 s

Consider reducing the time spent parsing, compiling and executing JS. You may find delivering smaller JS payloads helps with this. Learn how to minimize main-thread work

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "group": "other",
      "duration": 1702.0480000000318,
      "groupLabel": "Other"
    },
    {
      "group": "scriptEvaluation",
      "duration": 1071.9200000000178,
      "groupLabel": "Script Evaluation"
    },
    {
      "group": "styleLayout",
      "duration": 917.4120000000008,
      "groupLabel": "Style & Layout"
    },
    {
      "group": "paintCompositeRender",
      "duration": 211.06799999999112,
      "groupLabel": "Rendering"
    },
    {
      "group": "parseHTML",
      "duration": 80.512,
      "groupLabel": "Parse HTML & CSS"
    },
    {
      "group": "scriptParseCompile",
      "duration": 53.54000000000007,
      "groupLabel": "Script Parsing & Compilation"
    },
    {
      "group": "garbageCollection",
      "duration": 16.975999999999992,
      "groupLabel": "Garbage Collection"
    }
  ],
  "headings": [
    {
      "key": "groupLabel",
      "label": "Category",
      "valueType": "text"
    },
    {
      "key": "duration",
      "label": "Time Spent",
      "valueType": "ms",
      "granularity": 1
    }
  ],
  "sortedBy": [
    "duration"
  ]
}

Buttons do not have an accessible name

When a button doesn't have an accessible name, screen readers announce it as "button", making it unusable for users who rely on screen readers. Learn how to make buttons more accessible.

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "node": {
        "lhId": "1-0-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,0,DIV,0,HEADER,0,NAV,0,DIV,0,DIV,0,UL,2,LI,0,BUTTON",
        "type": "node",
        "snippet": "<button type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\" aria-controls=\"radix-_R_jqiplei_\" data-state=\"closed\" class=\"TZTsQG_mobileMenuTrigger hCgVwa_reset-button\">",
        "selector": "div > ul.TZTsQG_list > li.TZTsQG_mobileItem > button.TZTsQG_mobileMenuTrigger",
        "nodeLabel": "div > ul.TZTsQG_list > li.TZTsQG_mobileItem > button.TZTsQG_mobileMenuTrigger",
        "explanation": "Fix any of the following:\n  Element does not have inner text that is visible to screen readers\n  aria-label attribute does not exist or is empty\n  aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n  Element has no title attribute\n  Element does not have an implicit (wrapped) <label>\n  Element does not have an explicit <label>\n  Element's default semantics were not overridden with role=\"none\" or role=\"presentation\"",
        "boundingRect": {
          "top": 0,
          "left": 353,
          "right": 417,
          "width": 64,
          "bottom": 64,
          "height": 64
        }
      }
    }
  ],
  "headings": [
    {
      "key": "node",
      "label": "Failing Elements",
      "valueType": "node",
      "subItemsHeading": {
        "key": "relatedNode",
        "valueType": "node"
      }
    }
  ],
  "debugData": {
    "tags": [
      "cat.name-role-value",
      "wcag2a",
      "wcag412",
      "section508",
      "section508.22.a",
      "TTv5",
      "TT6.a",
      "EN-301-549",
      "EN-9.4.1.2",
      "ACT",
      "RGAAv4",
      "RGAA-11.9.1"
    ],
    "type": "debugdata",
    "impact": "critical"
  }
}

Background and foreground colors do not have a sufficient contrast ratio.

Low-contrast text is difficult or impossible for many users to read. Learn how to provide sufficient color contrast.

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "node": {
        "lhId": "1-1-P",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,6,P",
        "type": "node",
        "snippet": "<p class=\"sc-KOGVz igJSCV Fzcv4W_inset Fzcv4W_insetSmall\">",
        "selector": "div._5l06ia_container > main._5l06ia_content > div._7bwwmq_root > p.sc-KOGVz",
        "nodeLabel": "POWERING THE COMPANIES BUILDING THE FUTURE",
        "explanation": "Fix any of the following:\n  Element has insufficient color contrast of 3.45 (foreground color: #62666d, background color: #08090a, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1",
        "boundingRect": {
          "top": 1011,
          "left": 15,
          "right": 396,
          "width": 381,
          "bottom": 1028,
          "height": 17
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-2-DIV",
              "path": "1,HTML,1,BODY,0,DIV",
              "type": "node",
              "snippet": "<div style=\"isolation:isolate;background:inherit\">",
              "selector": "body > div",
              "nodeLabel": "Skip to content →\nLog in\nSign up\nThe product development system for teams and a…",
              "boundingRect": {
                "top": 0,
                "left": 0,
                "right": 412,
                "width": 412,
                "bottom": 5897,
                "height": 5897
              }
            }
          }
        ]
      }
    }
  ],
  "headings": [
    {
      "key": "node",
      "label": "Failing Elements",
      "valueType": "node",
      "subItemsHeading": {
        "key": "relatedNode",
        "valueType": "node"
      }
    }
  ],
  "debugData": {
    "tags": [
      "cat.color",
      "wcag2aa",
      "wcag143",
      "TTv5",
      "TT13.c",
      "EN-301-549",
      "EN-9.1.4.3",
      "ACT",
      "RGAAv4",
      "RGAA-3.2.1"
    ],
    "type": "debugdata",
    "impact": "serious"
  }
}

Heading elements are not in a sequentially-descending order

Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. Learn more about heading order.

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "node": {
        "lhId": "1-3-H3",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,2,DIV,1,DIV,0,DIV,2,DIV,0,DIV,0,DIV,0,H3",
        "type": "node",
        "snippet": "<h3 class=\"sc-KOGVz bFMHeH KFZpfa_titleText\">",
        "selector": "div.KFZpfa_viewBody > div.KFZpfa_body > div.KFZpfa_title > h3.sc-KOGVz",
        "nodeLabel": "Faster app launch",
        "explanation": "Fix any of the following:\n  Heading order invalid",
        "boundingRect": {
          "top": 579,
          "left": 174,
          "right": 489,
          "width": 315,
          "bottom": 592,
          "height": 13
        }
      }
    }
  ],
  "headings": [
    {
      "key": "node",
      "label": "Failing Elements",
      "valueType": "node",
      "subItemsHeading": {
        "key": "relatedNode",
        "valueType": "node"
      }
    }
  ],
  "debugData": {
    "tags": [
      "cat.semantics",
      "best-practice"
    ],
    "type": "debugdata",
    "impact": "moderate"
  }
}

Links do not have a discernible name

Link text (and alternate text for images, when used as links) that is discernible, unique, and focusable improves the navigation experience for screen reader users. Learn how to make links accessible.

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "node": {
        "lhId": "1-4-A",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,4,A",
        "type": "node",
        "snippet": "<a href=\"/customers\" class=\"MR81zG_logosLink I_mUeq_root\" rel=\"noopener\">",
        "selector": "div._5l06ia_container > main._5l06ia_content > div._7bwwmq_root > a.MR81zG_logosLink",
        "nodeLabel": "div._5l06ia_container > main._5l06ia_content > div._7bwwmq_root > a.MR81zG_logosLink",
        "explanation": "Fix all of the following:\n  Element is in tab order and does not have accessible text\n\nFix any of the following:\n  Element does not have text that is visible to screen readers\n  aria-label attribute does not exist or is empty\n  aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n  Element has no title attribute",
        "boundingRect": {
          "top": 945,
          "left": 16,
          "right": 396,
          "width": 380,
          "bottom": 975,
          "height": 30
        }
      }
    }
  ],
  "headings": [
    {
      "key": "node",
      "label": "Failing Elements",
      "valueType": "node",
      "subItemsHeading": {
        "key": "relatedNode",
        "valueType": "node"
      }
    }
  ],
  "debugData": {
    "tags": [
      "cat.name-role-value",
      "wcag2a",
      "wcag244",
      "wcag412",
      "section508",
      "section508.22.a",
      "TTv5",
      "TT6.a",
      "EN-301-549",
      "EN-9.2.4.4",
      "EN-9.4.1.2",
      "ACT",
      "RGAAv4",
      "RGAA-6.2.1"
    ],
    "type": "debugdata",
    "impact": "serious"
  }
}

Touch targets do not have sufficient size or spacing.

Touch targets with sufficient size and spacing help users who may have difficulty targeting small controls to activate the targets. Learn more about touch targets.

对应元素与资源
{
  "type": "table",
  "items": [
    {
      "node": {
        "lhId": "1-5-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,0,DIV,0,BUTTON",
        "type": "node",
        "snippet": "<button type=\"button\" tabindex=\"0\" aria-haspopup=\"menu\" id=\"base-ui-_R_qpaki1lqiplei_\" class=\"Mmx1Wq_switchWorkspaceButton\" aria-expanded=\"false\">",
        "selector": "div.WS84WW_frame > nav.Mmx1Wq_sidebar > div.ImRUSq_root > button#base-ui-_R_qpaki1lqiplei_",
        "nodeLabel": "Linear",
        "explanation": "Fix any of the following:\n  Target has insufficient size (48.5px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 20px instead of at least 24px.",
        "boundingRect": {
          "top": 529,
          "left": 26,
          "right": 75,
          "width": 49,
          "bottom": 543,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-6-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,0,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Pulse",
              "boundingRect": {
                "top": 551,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 565,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-6-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,0,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Pulse",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 551,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 565,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-5-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,0,DIV,0,BUTTON",
              "type": "node",
              "snippet": "<button type=\"button\" tabindex=\"0\" aria-haspopup=\"menu\" id=\"base-ui-_R_qpaki1lqiplei_\" class=\"Mmx1Wq_switchWorkspaceButton\" aria-expanded=\"false\">",
              "selector": "div.WS84WW_frame > nav.Mmx1Wq_sidebar > div.ImRUSq_root > button#base-ui-_R_qpaki1lqiplei_",
              "nodeLabel": "Linear",
              "boundingRect": {
                "top": 529,
                "left": 26,
                "right": 75,
                "width": 49,
                "bottom": 543,
                "height": 14
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-7-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,1,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Inbox",
              "boundingRect": {
                "top": 566,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 580,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-7-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,1,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Inbox",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 566,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 580,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-6-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,0,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Pulse",
              "boundingRect": {
                "top": 551,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 565,
                "height": 14
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-8-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,2,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "My issues",
              "boundingRect": {
                "top": 581,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 595,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-8-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,2,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "My issues",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 581,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 595,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-7-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,1,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Inbox",
              "boundingRect": {
                "top": 566,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 580,
                "height": 14
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-9-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,3,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Reviews",
              "boundingRect": {
                "top": 596,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 610,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-9-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,3,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Reviews",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 596,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 610,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-8-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,0,DIV,2,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "My issues",
              "boundingRect": {
                "top": 581,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 595,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-10-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,3,DIV,0,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Initiatives",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 2px instead of at least 24px.",
        "boundingRect": {
          "top": 630,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 644,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-11-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,2,BUTTON",
              "type": "node",
              "snippet": "<button class=\"Mmx1Wq_navItem Mmx1Wq_collapsible\" tabindex=\"-1\">",
              "selector": "div.WS84WW_frame > nav.Mmx1Wq_sidebar > div > button.Mmx1Wq_navItem",
              "nodeLabel": "Workspace",
              "boundingRect": {
                "top": 618,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 630,
                "height": 12
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-12-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,3,DIV,1,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Projects",
              "boundingRect": {
                "top": 645,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 659,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-12-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,3,DIV,1,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Projects",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 645,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 659,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-10-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,3,DIV,0,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Initiatives",
              "boundingRect": {
                "top": 630,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 644,
                "height": 14
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-13-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,3,DIV,2,BUTTON",
              "type": "node",
              "snippet": "<button data-interactive=\"false\" class=\"Mmx1Wq_navItem\" tabindex=\"-1\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "More",
              "boundingRect": {
                "top": 660,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 674,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-14-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,0,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"true\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Faster app launch",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 2px instead of at least 24px.",
        "boundingRect": {
          "top": 694,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 708,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-15-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,5,BUTTON",
              "type": "node",
              "snippet": "<button class=\"Mmx1Wq_navItem Mmx1Wq_collapsible\" tabindex=\"-1\">",
              "selector": "div.WS84WW_frame > nav.Mmx1Wq_sidebar > div > button.Mmx1Wq_navItem",
              "nodeLabel": "Favorites",
              "boundingRect": {
                "top": 682,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 694,
                "height": 12
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-16-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,1,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Agent tasks",
              "boundingRect": {
                "top": 709,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 723,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-16-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,1,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Agent tasks",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 709,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 723,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-14-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,0,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"true\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Faster app launch",
              "boundingRect": {
                "top": 694,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 708,
                "height": 14
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-17-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,2,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Agent Insights",
              "boundingRect": {
                "top": 724,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 738,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-17-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,2,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "Agent Insights",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 724,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 738,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-16-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,1,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Agent tasks",
              "boundingRect": {
                "top": 709,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 723,
                "height": 14
              }
            }
          },
          {
            "relatedNode": {
              "lhId": "1-18-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,3,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "UI Refresh",
              "boundingRect": {
                "top": 739,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 753,
                "height": 14
              }
            }
          }
        ]
      }
    },
    {
      "node": {
        "lhId": "1-18-BUTTON",
        "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,3,BUTTON",
        "type": "node",
        "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
        "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
        "nodeLabel": "UI Refresh",
        "explanation": "Fix any of the following:\n  Target has insufficient size (104px by 14px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 6px instead of at least 24px.",
        "boundingRect": {
          "top": 739,
          "left": 26,
          "right": 130,
          "width": 104,
          "bottom": 753,
          "height": 14
        }
      },
      "subItems": {
        "type": "subitems",
        "items": [
          {
            "relatedNode": {
              "lhId": "1-17-BUTTON",
              "path": "1,HTML,1,BODY,0,DIV,3,DIV,1,MAIN,1,DIV,0,DIV,8,DIV,0,DIV,3,DIV,0,DIV,1,NAV,2,DIV,6,DIV,2,BUTTON",
              "type": "node",
              "snippet": "<button data-active=\"false\" data-interactive=\"true\" class=\"Mmx1Wq_navItem\">",
              "selector": "nav.Mmx1Wq_sidebar > div > div.Mmx1Wq_navItems > button.Mmx1Wq_navItem",
              "nodeLabel": "Agent Insights",
              "boundingRect": {
                "top": 724,
                "left": 26,
                "right": 130,
                "width": 104,
                "bottom": 738,
                "height": 14
              }
            }
          }
        ]
      }
    }
  ],
  "headings": [
    {
      "key": "node",
      "label": "Failing Elements",
      "valueType": "node",
      "subItemsHeading": {
        "key": "relatedNode",
        "valueType": "node"
      }
    }
  ],
  "debugData": {
    "tags": [
      "cat.sensory-and-visual-cues",
      "wcag22aa",
      "wcag258"
    ],
    "type": "debugdata",
    "impact": "serious"
  }
}

Minify CSS

Est savings of 7 KiB

Minifying CSS files can reduce network payload sizes. Learn how to minify CSS.

对应元素与资源
{
  "type": "opportunity",
  "items": [
    {
      "url": ".cVAQDa { font-size: var(--title-8-size); letter-spacing: var(--title-8-letter-spacing); … } …",
      "totalBytes": 36099,
      "wastedBytes": 7563,
      "wastedPercent": 20.95028089576385
    }
  ],
  "headings": [
    {
      "key": "url",
      "label": "URL",
      "valueType": "url"
    },
    {
      "key": "totalBytes",
      "label": "Transfer Size",
      "valueType": "bytes"
    },
    {
      "key": "wastedBytes",
      "label": "Est Savings",
      "valueType": "bytes"
    }
  ],
  "sortedBy": [
    "wastedBytes"
  ],
  "debugData": {
    "type": "debugdata",
    "metricSavings": {
      "FCP": 0,
      "LCP": 0
    }
  },
  "overallSavingsMs": 0,
  "overallSavingsBytes": 7563
}

Reduce unused CSS

Est savings of 30 KiB

Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. Learn how to reduce unused CSS.

对应元素与资源
{
  "type": "opportunity",
  "items": [
    {
      "url": ".cVAQDa { font-size: var(--title-8-size); letter-spacing: var(--title-8-letter-spacing); … } …",
      "totalBytes": 36099,
      "wastedBytes": 30884,
      "wastedPercent": 85.55464447571664
    }
  ],
  "headings": [
    {
      "key": "url",
      "label": "URL",
      "valueType": "url"
    },
    {
      "key": "totalBytes",
      "label": "Transfer Size",
      "valueType": "bytes"
    },
    {
      "key": "wastedBytes",
      "label": "Est Savings",
      "valueType": "bytes"
    }
  ],
  "sortedBy": [
    "wastedBytes"
  ],
  "debugData": {
    "type": "debugdata",
    "metricSavings": {
      "FCP": 0,
      "LCP": 0
    }
  },
  "overallSavingsMs": 0,
  "overallSavingsBytes": 30884
}
测试环境与原始指标
{
  "finalUrl": "https://linear.app/",
  "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/151.0.0.0 Safari/537.36",
  "formFactor": "mobile",
  "throttlingMethod": "simulate",
  "throttling": {
    "rttMs": 150,
    "throughputKbps": 1638.4,
    "requestLatencyMs": 562.5,
    "uploadThroughputKbps": 675,
    "cpuSlowdownMultiplier": 4,
    "downloadThroughputKbps": 1474.5600000000002
  },
  "metrics": [
    {
      "id": "largest-contentful-paint",
      "unit": "millisecond",
      "value": 15603.540500000006
    },
    {
      "id": "cumulative-layout-shift",
      "unit": "unitless",
      "value": 0
    },
    {
      "id": "total-blocking-time",
      "unit": "millisecond",
      "value": 129.5
    },
    {
      "id": "first-contentful-paint",
      "unit": "millisecond",
      "value": 8089.190500000002
    },
    {
      "id": "speed-index",
      "unit": "millisecond",
      "value": 8089.190500000002
    }
  ]
}

01 / 值得借鉴

好设计,具体好在哪

产品界面就是主要证据

首屏演示直接呈现工作区、任务、评审和状态,支持“产品开发系统”的定位。

层级来自亮度与尺度

大标题、灰色说明和深色产品面板之间的亮度差异明确,强调色只在工作区局部出现。

02 / 下一步

值得继续打磨的地方

  1. 01

    为手机产品演示提供可读细节

    完整桌面界面缩进手机宽度后,任务与侧栏文字很小,展示价值主要停留在轮廓。

    在手机断点展示聚焦任务详情的裁切图,并提供查看完整截图的入口;不要将产品内容替换成虚构 UI。

03 / 设计语言

把气质拆成可复用的参数

色彩

背景

#08090a

文字

#f7f8f8

强调

#e5e5e6

表面

#0f1011

字体与尺度

标题字体
Inter Variable
正文字体
Inter Variable
标题 / 正文
64px / 16px

间距与形状

区块间距
0px
组件内距
12px 16px 16px
卡片圆角
9px
按钮圆角
9999px

参数来自页面元素采样,空值表示未取得;不将单个元素的参数当作全站规范。

04 / 检查依据

观察与实测依据

数据来自同次页面采集;字体、圆角和间距为具体元素采样,不代表全站唯一设计规范。空值为未取得。HTML 为源码体积,不是压缩传输量;脚本数为 DOM 标签数,不是请求数。

品味1 项观察

为手机产品演示提供可读细节

完整桌面界面缩进手机宽度后,任务与侧栏文字很小,展示价值主要停留在轮廓。

在手机断点展示聚焦任务详情的裁切图,并提供查看完整截图的入口;不要将产品内容替换成虚构 UI。

mobile.png: scaled desktop workspace below the hero
链接分享预览

05 / 开始动手

把下一步,交给你的 AI

优化指令用于调整这个页面;设计指令用于借鉴它的视觉语言。「做同款」会附带截图与实施步骤。复制后粘贴到你的代码助手中。

查看完整指令
请基于 https://linear.app 的 2026-09-05T02:31:31.504Z 页面快照优化当前项目。先确认当前实现与快照差异,不要把已变化的内容重新改回旧版。

设计基线
左对齐标题与说明横跨宽画布,下面是一张包含侧栏、任务详情和状态信息的产品演示;手机保留左对齐阅读线。
{
  "colors": [
    {
      "role": "bg",
      "hex": "#08090a"
    },
    {
      "role": "ink",
      "hex": "#f7f8f8"
    },
    {
      "role": "accent",
      "hex": "#e5e5e6"
    },
    {
      "role": "surface",
      "hex": "#0f1011"
    }
  ],
  "fonts": {
    "body": "Inter Variable",
    "display": "Inter Variable",
    "stack": [
      "Inter Variable",
      "Berkeley Mono"
    ]
  },
  "radius": {
    "button": "9999px",
    "card": "9px",
    "field": ""
  },
  "space": {
    "section": "0px",
    "card": "12px 16px 16px"
  },
  "type": {
    "h1": "64px",
    "body": "16px",
    "weight": "510",
    "lineHeight": "24px",
    "letterSpacing": "-1.408px"
  }
}
数据来自同次页面采集;字体、圆角和间距为具体元素采样,不代表全站唯一设计规范。空值为未取得。HTML 为源码体积,不是压缩传输量;脚本数为 DOM 标签数,不是请求数。

执行事项
1. 为手机产品演示提供可读细节
在手机断点展示聚焦任务详情的裁切图,并提供查看完整截图的入口;不要将产品内容替换成虚构 UI。
依据: mobile.png: scaled desktop workspace below the hero

验收
- 在 1440×900 和 390×844 分别核对文字、布局和主要操作“Sign up”。
- 保留已有品牌、登录和业务链路,不从静态截图推断交互故障。
- 只修复有证据的项;涉及安全响应头时先用报告模式验证现有资源及认证兼容性。
- 对比修改前后的截图,并执行相关功能测试。不要声称未经测试的功能已通过。