Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ The first palette change since 1.0. Everything below was made in `themes/_src/va
- **ANSI blue and cyan.** Blue is now a warm gray `#9C948E` (was `#8B8178`, Lc 36 → 45 — `ls`, `grep`, `man` output on black is readable again) and cyan is the terracotta already used for functions, `#C08868` (was `#9A8B7A`). The two former slots were near-identical warm grays (ΔE2000 5.2, indistinguishable under CVD); every pair among the eight normal slots is now ≥ ΔE2000 10 (min 13.6). Bright slots follow: `#A89A8C→#B2AAA3`, `#B8A898→#CEA284`. Black/red/green/yellow/magenta unchanged. Kitty, iTerm2, Alacritty (normal + dim) and Windows Terminal files updated to match.
- **`themes/_snapshot/`** stays as the immutable v1.2.0 reference; the pipeline test now checks structural coverage — every snapshot colour key, tokenColors rule (name/scope/fontStyle) and semantic selector is still present and styled the same, additions allowed — rather than hex equality.

### Added — Alone Roman variant

- **`Alone Roman`** (`themes/alone-roman-color-theme.json`): the Standard palette with the italic channel removed. `base.yaml` now routes every syntax italic through two tokens — `style.italic` (tokenColors `fontStyle`) and `style.semanticItalic` (semantic `italic:`) — which Alone / Soft / Focused bind to `italic` / `true` and Roman to `""` / `false`. Markdown `*emphasis*` stays italic in every variant (document formatting, not syntax styling). Two hexes differ from Standard so the pairs Standard separates by italics stay separable on colour alone under red-green CVD: strings `#9A8B60 → #9C8B4A` (vs functions, protan/deutan ΔE2000 5.5) and `*.defaultLibrary` `#B08C50 → #AA884C` (vs types, 5.4). The verifier runs every check on Roman like any other variant; the L\* ladder reference stays Standard.

### Added — Scope coverage (all variants, no new hexes)

New `tokenColors` rules and `semanticTokenColors` selectors in `themes/_src/base.yaml`, each bound to an existing role token so every variant inherits it and key parity holds:
Expand Down
24 changes: 10 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ Six warm variants for bracket colorization, ordered by perceptual lightness so *
- **Alone** — The standard theme
- **Alone Soft** — Dimmer variant for extreme dark adaptation
- **Alone Focused** — Minimal UI for maximum focus
- **Alone Roman** — Standard palette, no italics (astigmatism / italic-averse)

### From VSIX (Recommended for Manual Install)

Expand All @@ -157,7 +158,7 @@ cp -r alone ~/.vscode/extensions/

## Theme Variants

**Alone** is the headline family member — a **mesopic**-light theme tuned for the intermediate range where both rod and cone receptors contribute, typical of a dim-but-not-dark room. The two siblings below are positioned around it; further along the dark-adaptation continuum, the family has room to grow (see [Future Plans](CHANGELOG.md#future-plans)).
**Alone** is the headline family member — a **mesopic**-light theme tuned for the intermediate range where both rod and cone receptors contribute, typical of a dim-but-not-dark room. The three siblings below are positioned around it; further along the dark-adaptation continuum, the family has room to grow (see [Future Plans](CHANGELOG.md#future-plans)).

### Alone (Standard) — _mesopic_

Expand All @@ -171,6 +172,10 @@ For **extreme dark adaptation**. All syntax colors reduced ~20% brightness, back

For **maximum concentration**. UI chrome is muted—activity bar badges dimmed, sidebar de-emphasized, borders hidden. Syntax highlighting unchanged. Your code takes center stage.

### Alone Roman

The Standard palette with **no italics** — for astigmatic readers who find slanted monospace edges fringe, or anyone who simply dislikes italic code. Every rule that Standard sets in italic (comments, strings, docstrings, regex, decorators, interfaces, type parameters, namespaces, `*.defaultLibrary`, `*.async`, `this`/`self`) is upright here; the only italic left is Markdown `*emphasis*`, which is the document's own formatting. Bold keywords/escapes/errors are unchanged. Two hexes differ from Standard so the pairs that Standard tells apart with italics stay separable on colour alone under red-green colour-vision deficiency: strings `#9A8B60 → #9C8B4A` and `*.defaultLibrary` `#B08C50 → #AA884C` (both verified ΔE2000 ≥ 5 after protan/deutan simulation). What you give up is the italic-only distinctions — interfaces look like classes, library calls like local ones, async like sync.

---

## Extension Compatibility
Expand Down Expand Up @@ -373,37 +378,28 @@ Computed against the editor background (`#0C0A09`) using the WCAG 2.x contrast f

### Italic Fringing Tradeoff

Italics provide cheap differentiation (strings, comments, interfaces, type parameters, `defaultLibrary`, regex) within the warm palette. But slanted edges in a monospace font can _increase_ fringing for astigmatic readers. If italics give you trouble, drop them via VS Code's `editor.tokenColorCustomizations`:
Italics provide cheap differentiation (strings, comments, interfaces, type parameters, `defaultLibrary`, regex) within the warm palette. But slanted edges in a monospace font can _increase_ fringing for astigmatic readers. If italics give you trouble, pick **Alone Roman** — the same palette with the italic channel removed and two hexes adjusted so nothing that italics used to separate collapses. If you want to keep Soft or Focused and only drop a few italics, VS Code's per-theme overrides still work:

```jsonc
"editor.tokenColorCustomizations": {
"[Alone]": {
"textMateRules": [
{ "scope": ["comment", "string", "markup.italic"], "settings": { "fontStyle": "" } }
]
},
"[Alone Soft]": {
"textMateRules": [
{ "scope": ["comment", "string", "markup.italic"], "settings": { "fontStyle": "" } }
{ "scope": ["comment", "string"], "settings": { "fontStyle": "" } }
]
}
},
"editor.semanticTokenColorCustomizations": {
"[Alone][Alone Soft][Alone Focused]": {
"[Alone Soft]": {
"enabled": true,
"rules": {
"interface": { "italic": false },
"typeParameter": { "italic": false },
"namespace": { "italic": false },
"module": { "italic": false },
"*.defaultLibrary": { "italic": false }
}
}
}
```

You keep the palette and the science; you just trade the font-style channel back for sharper edges.

---

## FAQ
Expand Down Expand Up @@ -437,7 +433,7 @@ The shipped `themes/*.json` files are **generated**. Don't edit them directly
The source of truth lives under `themes/_src/`:

- **`themes/_src/base.yaml`** — the structural skeleton. Every key the variants share (shape, scopes, font styles, and any hex that happens to be identical across all variants) lives here as a literal. Every leaf that varies across variants is written as `${token.name}`.
- **`themes/_src/variants/<name>.yaml`** — per-variant bindings: `display`, `filename`, a `verify` block (which wavelength band the variant should pass and whether it's the "standard" used for the L\* ladder / README WCAG checks), and a `tokens:` block supplying the hex/alpha values for that variant's `${token.name}` references.
- **`themes/_src/variants/<name>.yaml`** — per-variant bindings: `display`, `filename`, a `verify` block (which wavelength band the variant should pass and whether it's the "standard" used for the L\* ladder / README WCAG checks), and a `tokens:` block supplying the hex/alpha values for that variant's `${token.name}` references — plus the two font-style tokens `style.italic` (`italic` or `""`) and `style.semanticItalic` (`true`/`false`) that Alone Roman binds to "off".

The scripts:

Expand Down
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@
"label": "Alone Focused",
"uiTheme": "vs-dark",
"path": "./themes/alone-focused-color-theme.json"
},
{
"label": "Alone Roman",
"uiTheme": "vs-dark",
"path": "./themes/alone-roman-color-theme.json"
}
]
},
Expand Down
74 changes: 37 additions & 37 deletions themes/_src/base.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,52 +16,52 @@ semanticTokenColors:
variable.declaration: ${semanticTokenColors.variable.declaration}
variable.defaultLibrary:
foreground: ${semanticTokenColors.variable.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
parameter: ${semanticTokenColors.parameter}
property: ${semanticTokenColors.property}
property.readonly: ${semanticTokenColors.property.readonly}
property.declaration: ${semanticTokenColors.property.declaration}
property.defaultLibrary:
foreground: ${semanticTokenColors.property.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
function: ${semanticTokenColors.function}
function.declaration: ${semanticTokenColors.function.declaration}
function.defaultLibrary:
foreground: ${semanticTokenColors.function.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
method: ${semanticTokenColors.method}
method.declaration: ${semanticTokenColors.method.declaration}
method.defaultLibrary:
foreground: ${semanticTokenColors.method.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
class: ${semanticTokenColors.class}
class.declaration: ${semanticTokenColors.class.declaration}
class.defaultLibrary:
foreground: ${semanticTokenColors.class.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
interface:
foreground: ${semanticTokenColors.interface.foreground}
italic: true
italic: ${style.semanticItalic}
interface.declaration:
foreground: ${semanticTokenColors.interface.declaration.foreground}
italic: true
italic: ${style.semanticItalic}
enum: ${semanticTokenColors.enum}
enumMember: ${semanticTokenColors.enumMember}
struct: ${semanticTokenColors.struct}
type: ${semanticTokenColors.type}
type.declaration: ${semanticTokenColors.type.declaration}
type.defaultLibrary:
foreground: ${semanticTokenColors.type.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
typeParameter:
foreground: ${semanticTokenColors.typeParameter.foreground}
italic: true
italic: ${style.semanticItalic}
namespace:
foreground: ${semanticTokenColors.namespace.foreground}
italic: true
italic: ${style.semanticItalic}
module:
foreground: ${semanticTokenColors.module.foreground}
italic: true
italic: ${style.semanticItalic}
macro: ${semanticTokenColors.macro}
decorator: ${semanticTokenColors.decorator}
label: ${semanticTokenColors.label}
Expand All @@ -70,47 +70,47 @@ semanticTokenColors:
bold: true
comment:
foreground: ${semanticTokenColors.comment.foreground}
italic: true
italic: ${style.semanticItalic}
string:
foreground: ${semanticTokenColors.string.foreground}
italic: true
italic: ${style.semanticItalic}
number: ${semanticTokenColors.number}
regexp:
foreground: ${semanticTokenColors.regexp.foreground}
italic: true
italic: ${style.semanticItalic}
operator: ${semanticTokenColors.operator}
"*.deprecated":
strikethrough: true
foreground: ${semanticTokenColors.*.deprecated.foreground}
"*.modification":
foreground: ${semanticTokenColors.*.modification.foreground}
"*.async":
italic: true
italic: ${style.semanticItalic}
# ── Coverage additions (2.0.0): every selector below is bound to an existing
# role token so all variants inherit it and key parity is unaffected. ──
selfParameter:
foreground: ${tokenColors.special_variables_this_self_super.settings.foreground}
italic: true
italic: ${style.semanticItalic}
clsParameter:
foreground: ${tokenColors.special_variables_this_self_super.settings.foreground}
italic: true
italic: ${style.semanticItalic}
magicFunction:
foreground: ${tokenColors.python_magic_methods.settings.foreground}
italic: true
italic: ${style.semanticItalic}
builtinConstant: ${tokenColors.boolean_null_constants.settings.foreground}
boolean: ${tokenColors.boolean_null_constants.settings.foreground}
builtinType:
foreground: ${semanticTokenColors.type.defaultLibrary.foreground}
italic: true
italic: ${style.semanticItalic}
lifetime:
foreground: ${tokenColors.rust_lifetime.settings.foreground}
italic: true
italic: ${style.semanticItalic}
attribute:
foreground: ${tokenColors.rust_attributes.settings.foreground}
italic: true
italic: ${style.semanticItalic}
derive:
foreground: ${tokenColors.rust_attributes.settings.foreground}
italic: true
italic: ${style.semanticItalic}
formatSpecifier: ${tokenColors.python_f_string_braces.settings.foreground}
escapeSequence:
foreground: ${tokenColors.escape_characters.settings.foreground}
Expand All @@ -124,15 +124,15 @@ tokenColors:
- string.comment
settings:
foreground: ${tokenColors.comments.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Documentation Comments
scope:
- comment.block.documentation
- comment.block.javadoc
- comment.block.documentation punctuation
settings:
foreground: ${tokenColors.documentation_comments.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Strings
scope:
- string
Expand All @@ -141,7 +141,7 @@ tokenColors:
- punctuation.definition.string
settings:
foreground: ${tokenColors.strings.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Template String Expressions
scope:
- string.template punctuation.definition.template-expression
Expand All @@ -156,7 +156,7 @@ tokenColors:
- punctuation.definition.character-class.regexp
settings:
foreground: ${tokenColors.regular_expressions.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Escape Characters
scope:
- constant.character.escape
Expand Down Expand Up @@ -313,7 +313,7 @@ tokenColors:
- variable.language.special
settings:
foreground: ${tokenColors.special_variables_this_self_super.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Types & Classes
scope:
- entity.name.type
Expand Down Expand Up @@ -361,7 +361,7 @@ tokenColors:
- punctuation.decorator
settings:
foreground: ${tokenColors.decorators_annotations.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Punctuation
scope:
- punctuation
Expand Down Expand Up @@ -401,7 +401,7 @@ tokenColors:
- meta.attribute-with-value string
settings:
foreground: ${tokenColors.html_attribute_values.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: HTML Entities
scope:
- constant.character.entity
Expand Down Expand Up @@ -480,7 +480,7 @@ tokenColors:
- string.quoted.double.json
settings:
foreground: ${tokenColors.json_string_values.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: YAML Keys
scope:
- entity.name.tag.yaml
Expand All @@ -493,7 +493,7 @@ tokenColors:
- string.quoted.double.yaml
settings:
foreground: ${tokenColors.yaml_values.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: YAML Anchors & Aliases
scope:
- entity.name.type.anchor.yaml
Expand Down Expand Up @@ -547,14 +547,14 @@ tokenColors:
- punctuation.definition.quote.begin.markdown
settings:
foreground: ${tokenColors.markdown_block_quote.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Python Docstrings
scope:
- string.quoted.docstring.multi.python
- string.quoted.docstring.single.python
settings:
foreground: ${tokenColors.python_docstrings.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Python F-string Braces
scope:
- constant.character.format.placeholder.other.python
Expand All @@ -565,7 +565,7 @@ tokenColors:
- support.function.magic.python
settings:
foreground: ${tokenColors.python_magic_methods.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Python Builtins
scope:
- support.function.builtin.python
Expand All @@ -578,7 +578,7 @@ tokenColors:
- entity.name.type.lifetime.rust
settings:
foreground: ${tokenColors.rust_lifetime.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Rust Macros
scope:
- entity.name.function.macro.rust
Expand All @@ -591,7 +591,7 @@ tokenColors:
- meta.attribute.rust
settings:
foreground: ${tokenColors.rust_attributes.settings.foreground}
fontStyle: italic
fontStyle: ${style.italic}
- name: Go Package Names
scope:
- entity.name.package.go
Expand Down Expand Up @@ -732,7 +732,7 @@ tokenColors:
- support.variable.object.process
settings:
foreground: ${semanticTokenColors.variable.defaultLibrary.foreground}
fontStyle: italic
fontStyle: ${style.italic}
colors:
foreground: ${colors.foreground}
disabledForeground: ${colors.disabledForeground}
Expand Down
3 changes: 3 additions & 0 deletions themes/_src/variants/alone-focused.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ filename: alone-focused-color-theme.json
verify:
wavelengthBand: warm
tokens:
# Font-style channel. Roman binds these to "" / false.
style.italic: italic
style.semanticItalic: true
name: Alone Focused
semanticTokenColors.variable: "#C8B89A"
semanticTokenColors.variable.readonly: "#C8B89A"
Expand Down
Loading
Loading