Skip to content

Commit f2af435

Browse files
committed
release: 1.5.1, the theme release
The viewer and leji.org follow the operating system's light or dark mode, a layer may fix its viewer's appearance with viewer.theme.appearance, and leji.org gains a reader's appearance control. A feature now starts as a public request measured against ROADMAP.md, and the collapsed menu button keeps its own language across a press; detail in CHANGELOG.md. Signed-off-by: Vuong Nguyen <vuong@contexing.com>
1 parent 95384f1 commit f2af435

111 files changed

Lines changed: 4443 additions & 589 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
name: Feature request
3+
about: 'A capability Leji does not have yet: the problem, the lived case, the surface'
4+
labels: feature-request
5+
---
6+
7+
**Which surface**: <!-- spec · schemas · SDKs and CLI · MCP server · create-leji · viewer · site -->
8+
9+
**The problem**
10+
11+
<!-- What you cannot do today, stated as the problem rather than the fix you have in mind. -->
12+
13+
**The lived case**
14+
15+
<!-- What a real team does today and where it breaks. Leji specifies proven practice, so a case someone lives carries more weight than an idea in the abstract. -->
16+
17+
**Roadmap fit**
18+
19+
<!-- Which theme in ROADMAP.md this serves, or the theme it would add. -->
20+
21+
<!-- Note: you get an answer normally within 14 days, one of three: accepted (naming the release it targets), not now (naming what would change that), or declined (with the reason, kept on the issue). Acceptance authorizes building toward that release, subject to review and, for anything normative, to the comment periods GOVERNANCE.md sets; it is not a merge and not a guarantee that the change ships. Code follows an accepted request. -->

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- What does this change, and why? Link the issue if there is one. -->
1+
<!-- What does this change, and why? A fix links its issue if there is one. A feature links its accepted feature request; a feature without one is triaged as a request first, and its code waits on the answer. -->
22

33
## Checklist
44

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ jobs:
305305
uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3
306306
with:
307307
# The same goreleaser the release job installs (scripts/release-pins.env).
308-
version: "v2.18.1"
308+
version: "v2.18.2"
309309
workdir: packages/sdk-go
310310
args: check
311311

.github/workflows/release-checks.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ jobs:
183183
uses: goreleaser/goreleaser-action@f06c13b6b1a9625abc9e6e439d9c05a8f2190e94 # v7.2.3
184184
with:
185185
# The same goreleaser the release job installs (scripts/release-pins.env).
186-
version: "v2.18.1"
186+
version: "v2.18.2"
187187
workdir: packages/sdk-go
188188
args: release --clean --skip=publish
189189
env:

.github/workflows/release-finalize.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ on:
1313
release_tag:
1414
description: "Tag the draft release is attached to (the goreleaser/Go tag)"
1515
required: true
16-
default: "packages/sdk-go/v1.5.0"
16+
default: "packages/sdk-go/v1.5.1"
1717

1818
permissions:
1919
contents: write # publish the release

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ jobs:
247247
with:
248248
# The action is pinned by SHA; this input pins the goreleaser it
249249
# installs, and mirrors GORELEASER_VERSION in scripts/release-pins.env.
250-
version: "v2.18.1"
250+
version: "v2.18.2"
251251
workdir: packages/sdk-go
252252
args: release --clean --skip=publish
253253
env:

CHANGELOG.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,23 @@
157157
],
158158
"proposedBy": "Vuong Nguyen",
159159
"approvedBy": "Vuong Nguyen"
160+
},
161+
{
162+
"id": "release-1-5-1",
163+
"date": "2026-09-17",
164+
"type": "added",
165+
"summary": "viewer.theme.appearance, an optional manifest field naming the color scheme the viewer renders in (system, light, or dark), additive on the frozen 1.0 line with the schema $id unchanged; the viewer and leji.org follow the operating system's color scheme; all reference packages to 1.5.1.",
166+
"paths": [
167+
"schemas/",
168+
"templates/",
169+
"packages/sdk/",
170+
"packages/sdk-py/",
171+
"packages/sdk-go/",
172+
"packages/mcp/",
173+
"packages/site/"
174+
],
175+
"proposedBy": "Vuong Nguyen",
176+
"approvedBy": "Vuong Nguyen"
160177
}
161178
]
162179
}

CHANGELOG.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,61 @@
11
# Changelog
22

3+
## 1.5.1 · 2026-09-17
4+
5+
### Added
6+
7+
- **A dark theme for the viewer, following the operating system.** `leji view` and the
8+
exported viewer read `prefers-color-scheme` and paint the brand's dark surfaces when the
9+
reader's system is dark. There is no toggle and no stored choice: one dark stylesheet,
10+
linked with `media="(prefers-color-scheme: dark)"`, re-values the theme tokens and
11+
overrides the stock grounds, rules, tones, and syntax colors that read no token, every
12+
text tone the dark palette declares at 4.5:1 or better on every dark ground.
13+
`viewer.theme.link` governs the light scheme only, because the guard measures an authored
14+
color against the light grounds; the dark scheme's link tone is fixed. The authored
15+
`viewer.theme.primary` keeps its light-scheme role; in dark it colors no text and
16+
diagrams take a fixed palette. Mermaid diagrams take a palette per scheme and re-render
17+
from their authored source when the system scheme changes, with no reload. A reader whose
18+
system is light, on a layer that names no scheme, sees the 1.5.0 viewer unchanged.
19+
Requested in #14 by Daniel Montilla; the feature request on the record is #16.
20+
- **`viewer.theme.appearance`**: an optional manifest field naming which color scheme the
21+
viewer renders in. `system` (the default) follows the reader's operating system, as
22+
above; `light` and `dark` render that scheme on every system. A named scheme is stamped
23+
on the page's root element and in the `color-scheme` meta, which reads `light dark` where
24+
the choice stays the reader's; the dark stylesheet is linked under the dark media query
25+
for `system`, unconditionally for `dark`, and not at all for `light`; the Mermaid
26+
initializer reads the stamp before the system. A layer that sets nothing renders as
27+
`system`, its page differing from 1.5.0's by that stylesheet link, the `color-scheme`
28+
meta, and an inline style block that reads the palette tokens where it restated the same
29+
light colors, and, where the layer names a link tone, that declaration scoped to the
30+
light scheme. Additive schema field, `$id` unchanged; the schema page on leji.org
31+
describes it in six languages. The choice is the layer's: the viewer carries no reader
32+
control.
33+
- **leji.org follows the operating system's color scheme, and the reader may choose.** One
34+
dark palette over the site's role tokens, on the viewer's charcoal grounds, every text
35+
pair at AA; the light and dark palettes ship as their own stylesheets. A control at the
36+
lower right of every page cycles system, light, and dark in the page's language, keeps
37+
the choice in the browser where storage allows, and applies it before the first paint. A
38+
reader whose system is light and has chosen nothing sees the 1.5.0 page with the control
39+
added and the footer's last row clear of its corner.
40+
41+
### Changed
42+
43+
- **A feature starts as a request.** `CONTRIBUTING.md` gains "Before you build": a bug
44+
fix, a correction, or a test for behavior the docs already promise is a direct pull
45+
request; anything that adds behavior, a surface, a dependency, a toolchain path, or a
46+
manifest field opens as a feature request first, answered normally within 14 days with
47+
accepted (naming the release it targets), not now (naming what would change that), or
48+
declined (with the reason kept on the issue). A feature-request issue template and the
49+
pull request template's request line carry the path, and `ROADMAP.md` at the repository
50+
root states the direction requests are measured against, linked from `README.md`,
51+
`CONTRIBUTING.md`, and `GOVERNANCE.md`.
52+
53+
### Fixed
54+
55+
- **The collapsed menu button keeps its own language across a press.** On a translated page
56+
the header script rewrote the button's accessible name in English on every press; the
57+
rendered name now stays, and `aria-expanded` carries the state.
58+
359
## 1.5.0 · 2026-09-14
460

561
### Added

CONTRIBUTING.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
# Contributing
22

3-
The Leji spec is at 1.0, extracted from lived practice; the reference SDKs and tooling are at 1.5.0. The 1.0 spec line is GA and frozen at the v1.3.0 reference-tooling release: schema changes within it are additive only, and breaking changes require a new line per spec/versioning.md.
3+
The Leji spec is at 1.0, extracted from lived practice; the reference SDKs and tooling are at 1.5.1. The 1.0 spec line is GA and frozen at the v1.3.0 reference-tooling release: schema changes within it are additive only, and breaking changes require a new line per spec/versioning.md.
4+
5+
## Before you build
6+
7+
**A direct pull request is welcome** for a bug fix, a typo, a documentation or translation correction, or a test for behavior the docs already promise. Open it whenever you like, and link an issue if one exists.
8+
9+
**Anything else starts as a feature request**: anything that adds behavior, a surface, a dependency, a toolchain path, or a manifest field, in any package or on the site.
10+
11+
**You get an answer normally within 14 days**, one of three:
12+
13+
- **Accepted**, naming the release it targets.
14+
- **Not now**, naming what would change that.
15+
- **Declined**, with the reason, kept on the issue ([Governance](GOVERNANCE.md#how-the-specification-changes)).
16+
17+
**What acceptance means.** It authorizes building toward the named release, subject to review and, for anything normative, to the public comment periods [Governance](GOVERNANCE.md#steward-proposals-and-conflicts-of-interest) sets. It is not a merge, and it is not a guarantee that the change ships. Code follows an accepted request: a feature pull request that arrives without one is triaged as a request first, and its code waits on the answer.
18+
19+
**Why this way.** A request costs you minutes and a declined pull request costs you days. The answer is measured against [ROADMAP.md](ROADMAP.md), so you can read what a request is weighed against before you write anything.
20+
21+
**The steward uses the same door.** The steward's own features start as public feature requests too, and where one touches an area a steward product depends on it is labeled and slowed down, per [Governance](GOVERNANCE.md#steward-proposals-and-conflicts-of-interest).
422

523
## Development setup
624

@@ -22,7 +40,7 @@ Prerequisites: Node 24+, a Python >=3.10 (the Python SDK pins 3.12 via `packages
2240
- `npm run cli:mode` says which is active (version strings can't); `npm run cli:assert -- live|packed`
2341
fails loudly on a mismatch. Full discipline: `docs/practice/testing-cli-adoptions.md`.
2442

25-
- **Spec proposals.** Open an issue first: the problem, the intent, and the lived case behind it. Leji specifies proven practice; proposals grounded in something a real team does carry more weight than ideas in the abstract.
43+
- **Spec proposals.** Open an issue first: the problem, the intent, and the lived case behind it. Leji specifies proven practice; proposals grounded in something a real team does carry more weight than ideas in the abstract. The answer you can expect, and when, is in [Before you build](#before-you-build).
2644
- **Pull requests.** Normative changes (anything under `spec/` or `schemas/`) ride PR review and require a `CHANGELOG.md` entry plus a machine-readable `CHANGELOG.json` entry. Yes, the spec dogfoods itself.
2745
- **Contributor terms.** Every commit needs a DCO sign-off (`git commit -s`); contributions ship under the license for their content type. See [Contributor terms](#contributor-terms).
2846
- **Tooling.** SDK changes need tests and must keep `leji validate` passing against `examples/`. The Node, Python, and Go SDKs (`packages/sdk`, `packages/sdk-py`, `packages/sdk-go`) are behaviorally identical: a behavior change in one rides into all three, pinned by the shared `fixtures/` suite. Behavior develops and proves out fully in the TypeScript SDK first, the canonical implementation, against the LIVE channel ([testing-cli-adoptions](docs/practice/testing-cli-adoptions.md)); the Go and Python ports are made only from settled TypeScript behavior, pinned by the shared fixtures at port time. The Go SDK builds with Go 1.26.6+; `gofmt`, `go vet ./...`, and `go test ./...` must pass.

GOVERNANCE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Full terms, including what a fork may call its binary and what the logo requires
4949

5050
Changes happen by proposal, in the open:
5151

52-
1. Open an issue describing the problem and the intent behind the change, not just a fix.
52+
1. Open an issue describing the problem and the intent behind the change, not just a fix. Tooling and site features take the same first step: a feature request, answered normally within 14 days, as [CONTRIBUTING.md](CONTRIBUTING.md) describes; the roadmap those answers are measured against is [ROADMAP.md](ROADMAP.md).
5353
2. Propose the change as a pull request against `spec/`, and the schemas where the machine-readable surface is affected.
5454
3. Normative changes carry a changelog entry and a version bump under the spec's own [versioning rules](spec/versioning.md).
5555

0 commit comments

Comments
 (0)