universe2026-frontend-teardown/2026-10-16

把 GitHub Universe 官网
拆成零件/

githubuniverse.com · 2026 版 · 目标:找出所有"新奇的玩意",以及有没有人复刻过
一句话结论:这个站不是花哨的 WebGL 炫技站,主体是 Next.js + GitHub 自家 Primer Brand 设计系统 + GSAP 的瑞士式排版。 但它藏了 两个真正的 Three.js 场景——其中 hero 那个不是动画,是一个用 2444 个方块拼出来的可玩小游戏。

复刻情况:搜遍 GitHub,没有人提取过 2026 版的新交互(只有 2023 版一个 0 star 的 clone)。 但官方把设计系统和动画系统开源了,可以白嫖一大半。

先纠正三个直觉误判

误判真相
整站是 WebGL 粒子炫技站全站只有 2 个 <canvas>。其余是 DOM + CSS + SVG + GSAP
鼠标滑过满屏方块跟随那是 Tracers:5 个彩色方块沿按钮矩形边框绕圈跑,与鼠标位置无关
源码里搜不到 WebGL 就是没有SSR 的 HTML 里没有 canvas,是客户端 hydration 后才挂载的——只看源码会漏掉

0 · 技术栈实锤

框架Next.js(pages router)+ React 设计系统Primer Brand(GitHub 官方) 动画GSAP(完整核心 + SVG 插件) 3DThree.js r182 / WebGL 2.0 样式CSS Modules + 设计令牌 字体Mona Sans / Mona Sans Mono
canvas #1hero · 1524×422 · grid 94×26 canvas #2页脚 CTA · 984×492 @ y≈10257 页面总高约 10750 px 渲染WebGL 2.0 (OpenGL ES 3.0) 依赖库无 r3f / 无 drei / 无 lottie 彩蛋顶部倒计时条 HeaderCountdown

1 · 头号彩蛋:WebGLSuperMona(hero 里藏的游戏)

01不是动效,是个真游戏

首页 hero 下方那块区域,你看到的是一层浅色点阵。它的 DOM 是:

<div class="Hero_HeroArtwork">
  <div class="WebGLSuperMona_Wrapper"
       style="--grid-x: 94; --grid-x-narrow: 67; --grid-y: 26;">
    <canvas data-engine="three.js r182" width="1524" height="422">

入口按钮文案直接点明了它的用途:play_super-mona_while_you_wait/——"等 Keynote 开始前的空档,来一把 Super Mona"。

从压缩代码里挖出的状态机:

lives: 3, score: 0, superSeconds: 0,
movement: "resting", gameOver: false   // 3 条命 / 分数 / 结束态

配套 UI 组件(全部有独立 CSS 类):HudLivesHeartControlsControlKeyScoreSoundButtonGameOverScoreBoard

操作键位:ArrowLeft ArrowRight KeyA KeyD,带音效开关和结算面板。WebGL 不可用时降级显示 FallbackImage 静帧。

022444 个方块,一次 draw call

关键性能手法是 Three.js 的 InstancedMesh——一块几何体渲染 2444 次,每个实例只传位置/缩放/颜色矩阵:

// 网格配置(宽屏 / 窄屏两套)
{gridX: 94, mona: {x: .5,  y: -.11, scale: .075}}
{gridX: 67, mona: {x: .2,  y: -.05, scale: 1.7 * scale}}   // narrow

// 实例化网格:new InstancedMesh(geometry, material, count)
this.instanceMatrix = new Float32Array(16 * count)

验证:canvas 1524 × 422 ÷ 94 ÷ 26 = 每格 16.2 px 正方形。你在页面上看到的"点阵",每个点就是一个方块。

方块调色板(游戏/高亮态)
#c05200 #583af7 #ae85ff #bba00a #08872b
静默态(点阵底色)
#dde1dd #d9dfdb #e9edec #ffffff
Mona 角色色
#f73678 #ffafc6 #f88580 #e979a1

03四种形态,跟着活动日程自动换

hero 的 artwork 是个状态机,按活动所处阶段切换完全不同的 3D 形态:

阶段artworkhero 主标题
ON_SALE / SOLD_OUTSUPER_MONA ← 现在stay-tuned/
DAY_1 / DAY_2BLOCKS_MONAnow-live/
POST_DAY_1 / POST_EVENTMONA_TESSELLATIONexplore-our-latest-announcements/
POST_POST_DAY_1DUCKY_TESSELLATIONthanks-for-joining-us/

一套 hero 骨架,换 artwork 组件 + 换文案。Rubber Ducky 是 GitHub 另一个吉祥物,所以还藏了个"鸭子镶嵌"形态。

hero 截图

实机截图(无头 Edge + SwiftShader 渲染)。点阵区就是 SuperMona 的 94×26 方块网格,右下角粉色 Mona 是 WebGL 未就绪时的降级静帧,下方是 Play 入口。

2 · Tracers:彩色方块沿按钮边框绕圈

这是最容易被误认成"鼠标跟随"的效果。真实机制:5 个方块沿按钮的矩形周长匀速跑圈,每块延迟 0.15 秒错开,转角处自动旋转 90°。

COLORS = ["#c05200","#583af7","#ae85ff","#bba00a","#08872b"]
DUR    = 3.6s                     // 单块跑完一圈
STAG   = 0.15s                    // 相邻方块的延迟
TOTAL  = 3.6 + 0.15 * 4 = 4.2s    // 整段动画时长

// 沿矩形周长取点(上边 → 右边 → 下边 → 左边)
at(prog):
  o = (prog + W/2) mod 2(W+H)
  o < W        → 上边,rotate 0
  o < W+H      → 右边,rotate 90
  o < 2W+H     → 下边,rotate 0
  否则          → 左边,rotate 90

// 关键:不是匀速,带起停缓动
ease(e) = e - 0.8/(2π) · sin(2πe)

三个工程细节值得抄:

⚠️ 注意:这个效果只在活动直播期间挂在绿色的「Watch now」按钮上。现在活动前,按钮是 Get passes,所以你在页面上看不到它。

复刻验证(同款算法,纯 DOM 实现)

滑动到此处自动播放 · 重播 · 悬停按钮同样触发

3 · 其余四件值得看的小玩意

解码打字机

所有标题(stay-tuned/、october 28–29 / san francisco, CA)都是逐字符"乱码 → 定格":

charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ
  0123456789.!@#$%^&*()_+-=[]{}|/;<>?"

GSAP timeline 驱动,每个字符先随机 2–3 次再落定,配一个闪烁光标元素。减速偏好开启时直接显示终态。

HeaderCountdown

顶部那条绿色横幅是实时倒计时,四段数字逐秒跳动:

universe2026-streams-in/
12 : 10 : 28 : 30

组件拆成 Unit / Value / Separator 三个原子,方便单段做动画。

页脚第二块 3D

页面滚到底(y≈10257)还有一块 WebGLFooterCta,984×492 的独立 Three.js 场景,和 hero 那个互不干扰、懒加载。

拖尾区域标记系统

代码里导出两个类名常量做"区域声明":

trailAnimationArea    // 参与拖尾
trailAnimationIgnore  // 忽略拖尾

hero 插画和 SuperMona 区都挂了 Ignore——因为这两块自己有 WebGL,不让 DOM 层的拖尾干扰。

4 · GitHub 复刻检索结果

结论:没有人提取过这套东西。
gh search code "WebGLSuperMona" → 0 结果
gh search code "SuperMona" → 全是 Haskell 的 supermonad 论文,无关
gh search repos "githubuniverse" → 只有 2023 版 clone(0 star)、历年 workshop 仓库、抽奖活动仓库
gh search code "InstancedMesh repo:primer/brand" → 0 结果
但官方开源了骨架——@primer/react-brand(MIT,114★)
githubuniverse.com 用的就是它。里面能直接白嫖:

官方动画系统 API(这是最值钱的部分)

import {AnimationProvider, Animate} from '@primer/react-brand'

<AnimationProvider animationTrigger="on-visible"
                   visibilityOptions="middle-of-screen"
                   autoStaggerChildren runOnce>
  <Animate animate="scale-in-up"><Card /></Animate>
</AnimationProvider>
14 个预设fade-in · slide-in-up/down/left/right · scale-in-up/down · scale-in-left/right · fill-in-top/right · reveal-in-up 触发方式click / on-visible / immediate 自动错开autoStaggerChildren,步进 staggerDelayIncrement 默认 100ms 视口判定bottom-of-screen / middle-of-screen / about-to-leave / 0–1 数字

没开源的是 WebGL 那一层。Primer Brand 的 Hero 源码里留了一行注释: * WebGL animations.,另一处写着 "will be replaced with a built-in fade effect in the WebGL animations"—— 说明 WebGL 动效是 GitHub 内部实现,官方库只预留了插槽,没放出实现。

活动周边反倒真开源了(真能玩的那种)

仓库是什么★
martinwoodward/octolamp3D 打印 + GitHub 主题智能灯。作者 Martin Woodward 是 GitHub VP,也是 2026 讲者之一820
keith-oak/universe-badgeUniverse 2025 可魔改胸牌(Pimoroni Tufty 2350)固件定制0
thorwebdev/gh-universe-badge同款可魔改胸牌的另一份实现0
esimkowitz/badger个人版胸牌改造3

想要同类效果,这些库可以替代

仓库对应能力★
primer/react-brand整套营销站组件 + 入场动画 + 文字揭示114
Yamatoeth/Three.JS-Animated-ScenesIsometricCubes:等距立方体网格 hero 动画,动态描边 + 相机景深 + 安全 instancing,MIT—
DavidHDev/canvas-ui33 个创意 canvas 组件(粒子揭示/液体/玻璃拟态),注意是 MIT + Commons Clause—
mrdoob/three.js底层库本身,webgl_instancing_performance 官方示例就是方块阵列108k

5 · 如果要搬进 SOFT LAB

效果移植难度建议
Tracers 方块绕边框 很容易 纯 DOM + rAF,无需任何 3D 库。算法已完整解出(本页 demo 就是可跑的复刻)。适合挂在按钮或卡片边框上,做"待机态"小动效。
解码打字机 很容易 不依赖 GSAP,几十行 rAF 就够。跟现有 changelog / 标签体系气质吻合,可直接用在版本号或实验标题上。
方块网格(94×26) 中等 需要 Three.js + InstancedMesh。若只是展示(不做游戏),可以用 Canvas 2D 或 CSS Grid 近似,成本降一个量级。
WebGLSuperMona 游戏 偏重 要复刻得重写:网格物理 + 角色碰撞 + HUD + 音效 + 移动端触控。作为"第五个实验"可以立项,但建议先做静态方块网格探路。
Primer Brand 动画系统 可直接装 MIT 许可,npm i @primer/react-brand。但要评估:它的设计令牌和 SOFT LAB 现有纸色体系是否冲突——大概率只借鉴 API 设计,不直接引入。
三个坑提醒: