{%extends"base.html"%}{%blocktitle%}euler — account{%endblock%}{%blockcontent%}{# The account page: who you are, what you hold, and the two things only you can change (your secrets, your password), and the icon you go by. Five panels, in the order the questions get asked. #}<sectionclass="panel"><divclass="acct-head"><spanclass="acct-glyph"id="acct-glyph">{%include"_icon.html"%}</span><divclass="acct-id"><h1>{{subject.useror'anon'}}</h1>{# The slug is not trivia: it names the system user, home and clone that are yours alone — the thing that makes your keys yours. #}<pclass="acct-sub muted"><code>{{subject.slug}}</code><span>— your system user, home, and clone</span></p></div></div>{# The ladder as a ladder: it is ordered, cumulative, and you are at a point on it — none of which a lone pill says. Rungs at or below yours are lit because you hold them all; the rungs above are what you do not. LADDER is the kernel's own tuple (packages/solver/solver/auth/subject.py), so this cannot drift from the real model. #}<divclass="ladder"role="img"aria-label="profile: {{subject.profile}} — rung {{ladder.index(subject.profile)+1}} of {{ladder|length}}">{%forrunginladder%}{%ifrung==subject.profile%}<spanclass="rung here">{{rung}}</span>{%elifloop.index0<ladder.index(subject.profile)%}<spanclass="rung below">{{rung}}</span>{%else%}<spanclass="rung">{{rung}}</span>{%endif%}{%endfor%}</div><pclass="ladder-note">Commands and pages are gated by this rung. Sweet-talking the shell has been tried; the shell remains unmoved.</p></section><sectionclass="panel"id="icon-panel">{%include"_icon_panel.html"%}</section>{# The per-user credential panel: filled by the per-user service's /account/vault fragment. On a service without that route the placeholder simply stays. Refreshed on load, and again whenever a terminal command reports it changed account state (`user`, `git-identity` → account-changed; `git-sync`, `git-filter` → git-changed, which also moves decrypt access here). This element exists only while /account is the visible pane, so the events reach it only then — the refresh costs nothing when the page is not shown (web-server-guide § The site). #}<sectionclass="panel"id="vault-panel"hx-get="/account/vault"hx-trigger="load, euler:account-changed from:body, euler:git-changed from:body"><h2>Credentials</h2><pclass="muted">Loading your vault…</p></section><sectionclass="panel">{# Folded here, and only here: /password's own page and the shell fragment want the form open, but on the account page a password change is a rare, deliberate act, so it sits closed behind a summary and expands in place. The shared partial's own <h2> is suppressed (password_heading=false) so the summary is the one heading. #}{%setpassword_heading=false%}<detailsclass="fold"id="password-fold"><summaryclass="fold-summary"><spanclass="fold-title">Password</span><spanclass="muted">change your password</span></summary>{# The same form as /password and its fragment — one partial, three renderings. #}{%include"_password_form.html"%}</details></section><scriptsrc="{{asset('/assets/srp.js')}}"defer></script><scriptsrc="{{asset('/assets/password.js')}}"defer></script>{%endblock%}