1// async data fetching with full type safety
2import { createContext, useContext } from 'react'
3 
4interface ApiResponse<T> {
5 data: T
6 status: number
7 ok: boolean
8}
9 
10async function request<T>(
11 url: string,
12 options?: RequestInit
13): Promise<ApiResponse<T>> {
14 const res = await fetch(url, options)
15 const data = await res.json() as T
16 return { data, status: res.status, ok: res.ok }
17}
18 
19const BASE = 'https://api.vesper.dev'
20const TIMEOUT = 5_000

主题工作台

HearthCode

先选 Ember 或 Moss,直接看真实主题预览,然后装到你正在用的地方。

去 Forge 调一个自己的主色

多载体

同一套色彩语言,装在你工作的每个地方

语义体系只有一套:注释永远退后,控制流永远前倾。换载体不换语义。

VS Code 与 VSX 编辑器

方向 × 版本2 × 2
1// async data fetching with full type safety
2import { createContext, useContext } from 'react'
3 
4interface ApiResponse<T> {
5 data: T
6 status: number
7 ok: boolean
8}
9 
10async function request<T>(
11 url: string,
12 options?: RequestInit
13): Promise<ApiResponse<T>> {
14 const res = await fetch(url, options)
15 const data = await res.json() as T
16 return { data, status: res.status, ok: res.ok }
17}
18 
19const BASE = 'https://api.vesper.dev'
20const TIMEOUT = 5_000

Ember 与 Moss 各配深浅两版,发布于 VS Code Marketplace 与 Open VSX,同一份生成管线产出。

在 VS Code 安装

Obsidian

方向Moss

设计笔记 · Moss

让颜色成为阅读秩序

安静的正文保持稳定节奏,链接、强调与代码只在需要时前移。

注释退后,结构前倾。
#色彩语言

Obsidian 主题采用 Moss 方向,深浅双版,笔记和长文阅读用同一套语义体系。

获取 Obsidian 主题

这个网站本身

正文对比预算≥ 4.5:1
HEARTH / TOKEN LAB审计通过

色彩契约

每种语义,都有明确位置

正文稳定,关键动作清晰前倾;同一组 token 同时约束界面和代码。

站点全部颜色由主题 token 派生,正文对比度预算由提交时的审计强制执行——你现在看到的就是校准结果。

Ember 目前发布于 VS Code 生态与本网站;Obsidian 主题为 Moss 方向。

校准管线

颜色不是挑出来的,是校准出来的

每个发布主题都经过同一条管线:显式的色彩契约、感知空间里的联合求解、逐项审计,再加上对 Forge 全输入空间的扫描。

  1. 声明契约

    每个方向先把规则写成契约:关键色对的最小 ΔE、各信号带允许的色相区间。

    7组关键色对

    ΔE 下限≥ 8–10信号带14
  2. 联合求解

    邻位色在感知色彩空间里联合求解分离度,浅色版还要逐角色满足最低对比度。

    1.28分离中值目标 · Light

    Dark 中值1.05角色对比下限≥ 2.2–5
  3. 审计闸门

    发布主题逐项对照契约复测,审计不过就不能提交。

    4个发布主题

    issues0warnings0
  4. 全域扫描

    Forge 的整个输入空间按色相 × 饱和度网格扫描,每个点都要通过发布同款的质量闸门。

    48个网格点

    色相步长15°饱和度带60–100

以上数字直接读取自契约与审计的源文件,随每次校准自动更新。