Skip to content

feat(pi.obsidian-theme): add the Obsidian dark theme - #55

Merged
vastsa merged 2 commits into
vastsa:mainfrom
ily55421:feat/pi.obsidian-theme
Sep 20, 2026
Merged

vastsa merged 2 commits into
vastsa:mainfrom
ily55421:feat/pi.obsidian-theme

Conversation

@ily55421

@ily55421 ily55421 commented Sep 20, 2026 •

Copy link
Copy Markdown

What this adds

A new community theme plugin, pi.obsidian-theme 3.0.0 — a deep blue-teal global theme for PI-Desktop, tuned for long reading sessions.

Styling only. It contributes one global theme (CSS) plus a small bilingual info panel; there is no agent tool, no command beyond "open the info panel", and no background work.

Why it looks the way it does

The palette was tuned against a measured reference screenshot rather than by eye, and two plausible-but-wrong theories were discarded along the way:

  • Hue, not lightness, was the problem. The earlier canvas had a blue-minus-red lead of 7 — effectively grey — while the reference sits at 21–24. Every surface now carries a real blue lead (measured 23 across the rendered frame).
  • There is no gradient mechanism. A band scan showed the reference panels are essentially flat (drift −0.11…−0.23 pts). Hierarchy is therefore carried by real 1px hairlines (#2A4054 / #1C2B3A, which rise 1.0–2.8 pts off their neighbours) and by a solid cyan-teal selection fill (#1B4F53, +3.6 pts over a plain row). A 13% accent wash measured as nothing and was dropped.

Elevation ladder: #091219 inset, #0F1B26 app, #12202C rails, #0E1A25 reading column, #182835 cards, #1B2C3B fields, #1E3040 raised, #223648 hover.

Text scale: #F2F7FA titles, #C4D2DD body (11.3:1, down from 17:1), #8FA3B4 secondary, #6A7E8F hints. Accent #5CD0B8 is reserved for selection, primary actions and focus. No pure black, no pure white.

Permissions

Permission Why
ui.panel Bilingual info panel (palette reference + elevation preview)
ui.theme Contribute the global theme

No network, filesystem, clipboard, shell or agent access. The stylesheet contains no @import, no @font-face and no external URL — its only reference is an inline data: SVG noise tile, so host sanitization has nothing to strip.

Contents

File Purpose
manifest.json Identity, permissions, contributes.themes
main.js Registers the single "open panel" command
themes/obsidian.css The theme
renderer/ Info panel + the shared appearance adapter copied from plugins/shared/appearance/
.gitattributes Pins eol=lf so packed bytes match source on every platform

Verification

  • python3 scripts/pack_plugin.py plugins/pi.obsidian-theme → packages/pi.obsidian-theme-3.0.0.piplug, sha256 e03fd14a…7fd32e, 61705 bytes; catalog shasum matches the packed file.
  • python3 scripts/rebuild_catalog.py → catalog grew from 25 to 26 plugins; only the new entry changed.
  • python3 scripts/security_audit.py plugins/pi.obsidian-theme --check-packages → zero blockers for this plugin. The one manual-review signal is appearance.js:182 (setInterval in the shared appearance adapter), which every plugin in this repo carries.
  • node --test tests/obsidian-theme.test.mjs → 5/5 pass.
  • node --test tests/*.test.mjs tests/*.test.js plugins/*/test/*.test.mjs (the CI command, run on an LF checkout) → 385/397 pass. The 11 failures reproduce identically on unmodified main at 09c832f (380/392): gitlens / terminal integration tests that need a real repo and a native PTY, plus deps-audit scanner tests. Same failing set before and after, so this PR adds 5 passing tests and no regressions.
  • The tests workflow reports action_required on this PR — GitHub's first-time-contributor approval gate, not a code failure. The only red check is Vercel ("Authorization required to deploy"), which cannot deploy a fork PR.

Checklist

  • Unique id, semantic version
  • README explains what / why / permissions
  • pack_plugin.py succeeds
  • rebuild_catalog.py updated catalog.json
  • Package sha256 in catalog matches the .piplug
  • No secrets in source or package
  • security_audit.py --check-packages has zero blockers for this plugin
  • Plugin test added; panel-chrome coverage assertion raised 19 → 20

I have not been able to test via Load dev plugin on this machine, so the panel and the theme picker entry have not been visually confirmed inside the app — the CSS itself is the same sheet that was iterated against screenshots.

A deep blue-teal global theme tuned against a measured reference screenshot.
The decisive finding was hue, not lightness: the previous canvas had a
blue-minus-red lead of 7 (grey) while the reference sits at 21-24, so every
surface is now blue-dominant. A band scan also disproved the gradient theory:
the reference panels are flat (drift -0.11..-0.23 pts), so hierarchy is carried
by real 1px hairlines (#2A4054 / #1C2B3A) and a solid cyan-teal selection fill
(#1B4F53, +3.6 pts over a plain row) instead of a wash that measured as nothing.

Elevation ladder: #091219 inset, #0F1B26 app, #12202C rails, #0E1A25 reading
column, #182835 cards, #1B2C3B fields, #1E3040 raised, #223648 hover. Text:
#F2F7FA titles, #C4D2DD body (11.3:1), #8FA3B4 secondary, #6A7E8F hints.
Accent #5CD0B8 is reserved for selection, primary actions and focus.

Styling only: one global theme (CSS) plus a bilingual info panel. Permissions
are limited to ui.panel and ui.theme, with no network, filesystem, clipboard,
shell or agent access. The sheet carries no @import, no @font-face and no
external URL: its only reference is an inline data: SVG noise tile.

Also registers the plugin in both marketplace README tables and raises the
panel-chrome coverage assertion from 19 to 20 panel plugins.
@vercel

vercel Bot commented Sep 20, 2026

Copy link
Copy Markdown

@511373265 is attempting to deploy a commit to the vastsa's projects Team on Vercel.

A member of the Team first needs to authorize it.

@vastsa
vastsa merged commit 9fed241 into vastsa:main Sep 20, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants