···2626 const [agent, setAgent] = useState<OAuthUserAgent | null>(null);
2727 const [loading, setLoading] = useState(true);
2828 const [error, setError] = useState<string | null>(null);
2929+ const [designOpen, setDesignOpen] = useState(false);
29303031 useEffect(() => {
3132 (async () => {
···103104 ) : (
104105 <Dashboard agent={agent} onLogout={handleLogout} />
105106 )}
107107+ <div className="design-link">
108108+ <a
109109+ href="#"
110110+ onClick={(e) => {
111111+ e.preventDefault();
112112+ setDesignOpen(!designOpen);
113113+ }}
114114+ >
115115+ design decisions [{designOpen ? "hide" : "show"}]
116116+ </a>
117117+ </div>
118118+ {designOpen && <DesignDecisions />}
106119 <footer className="footer">
107120 <a href="https://tangled.org/l4.pm/atvouch" target="_blank" rel="noopener noreferrer">
108121 source
···543556 </>
544557 )}
545558 </aside>
559559+ );
560560+}
561561+562562+interface DesignDecision {
563563+ id: string;
564564+ title: string;
565565+ explanation: string;
566566+}
567567+568568+const DESIGN_DECISIONS: DesignDecision[] = [
569569+ {
570570+ id: "no-counters",
571571+ title: "(1) no counters on people",
572572+ explanation:
573573+ "because remote vouches can be created by anyone for any reason, you can't trust them at all. " +
574574+ "this is also why trust decisions must always be made in the context of the current logged in user (you) " +
575575+ "so that vouch chains can be located and shown to you specifically.",
576576+ },
577577+ {
578578+ id: "no-text",
579579+ title: "(2) no text on vouches",
580580+ explanation:
581581+ "generally moderation reasons, plus i wouldn't want to implement some kind of block just for this " +
582582+ "proof of concept. having singular vouch units pointing to people is enough from an actual usability " +
583583+ "standpoint of the project.",
584584+ },
585585+ {
586586+ id: "max-3-levels",
587587+ title: "(3) routing from a max of 3 levels",
588588+ explanation:
589589+ "this was made back when the demo was microcosm based, but now i could increase that to 4 or 5. " +
590590+ "past 5 though i think the graphs would become very meaningless if more people actually used this, " +
591591+ "so i'll leave at 3 and reconsider if anyone wants to bump that up.",
592592+ },
593593+ {
594594+ id: "explicit-type",
595595+ title: "(4) you must explicitly type to vouch",
596596+ explanation:
597597+ "there were buttons to let you vouch anyone to create mutual vouches, removed it though because " +
598598+ "adding the friction to vouch is very intentional from a design perspective. at least to make you " +
599599+ "think more carefully of who you vouch, at least that's the intent.",
600600+ },
601601+];
602602+603603+function DesignDecisions() {
604604+ return (
605605+ <div className="design-decisions">
606606+ <div className="design-decisions-list">
607607+ {DESIGN_DECISIONS.map((d) => (
608608+ <div key={d.id} className="design-decision-item">
609609+ <h3>{d.title}</h3>
610610+ <p>{d.explanation}</p>
611611+ </div>
612612+ ))}
613613+ </div>
614614+ </div>
546615 );
547616}
548617