ui: expand landing modularity section

This commit is contained in:
Marco Allegretti 2026-02-02 12:26:05 +01:00
parent 5525e45ed6
commit dfa8c88c3d

View file

@ -113,8 +113,8 @@ import PublicLayout from '../layouts/PublicLayout.astro';
<p>Every moderation action is logged with reasons. Cryptographic audit trail ensures accountability.</p> <p>Every moderation action is logged with reasons. Cryptographic audit trail ensures accountability.</p>
</div> </div>
<div class="capability ui-card ui-card-pad-lg"> <div class="capability ui-card ui-card-pad-lg">
<h4>Privacy-Preserving Voting</h4> <h4>Permissioned Results</h4>
<p>Separate civic and voting identities. Participate publicly while voting privately.</p> <p>Configure who can view voting results details while keeping participation accessible.</p>
</div> </div>
<div class="capability ui-card ui-card-pad-lg"> <div class="capability ui-card ui-card-pad-lg">
<h4>Federation Ready</h4> <h4>Federation Ready</h4>
@ -129,13 +129,29 @@ import PublicLayout from '../layouts/PublicLayout.astro';
<div class="section-container"> <div class="section-container">
<h2>Modular governance, explained</h2> <h2>Modular governance, explained</h2>
<p class="section-intro"> <p class="section-intro">
Likwid is built from composable modules. Communities enable what they need: voting methods, delegation rules, moderation tools, and integrations. Likwid is built from composable governance modules. Communities assemble what they need: voting methods, delegation rules, deliberation structure, moderation policy, federation, and more.
</p> </p>
<div class="modularity-notes">
<div class="modularity-note ui-card ui-card-pad-lg">
<h4>Governance plugins</h4>
<p>
Governance is not a single flowchart. In Likwid, the core platform provides identities, communities, proposals, and data integrity.
Plugins define how decisions move, how moderation is logged, what voting method is used, and what integrations run.
</p>
</div>
<div class="modularity-note ui-card ui-card-pad-lg">
<h4>Per-community configuration</h4>
<p>
One community can enable liquid delegation and Schulze voting, another can use quadratic voting with a stricter deliberation lifecycle.
The platform stays consistent; behavior is configured by enabled modules.
</p>
</div>
</div>
<div class="diagram-grid"> <div class="diagram-grid">
<div class="diagram-card ui-card ui-card-pad-lg"> <div class="diagram-card ui-card ui-card-pad-lg">
<div class="diagram-header"> <div class="diagram-header">
<h4>Liquid delegation</h4> <h4>Liquid delegation</h4>
<p>Delegate by trust network. Vote directly anytime to override your delegation.</p> <p>Delegate through a trust network. Vote directly anytime to override your delegation.</p>
</div> </div>
<svg class="diagram" viewBox="0 0 560 220" role="img" aria-label="Liquid delegation diagram"> <svg class="diagram" viewBox="0 0 560 220" role="img" aria-label="Liquid delegation diagram">
<defs> <defs>
@ -191,29 +207,268 @@ import PublicLayout from '../layouts/PublicLayout.astro';
<text x="280" y="106" text-anchor="middle" font-size="12" fill="var(--color-text)">Core platform</text> <text x="280" y="106" text-anchor="middle" font-size="12" fill="var(--color-text)">Core platform</text>
<text x="280" y="126" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">users • proposals • data</text> <text x="280" y="126" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">users • proposals • data</text>
<rect x="70" y="54" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" /> <rect x="70" y="44" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="130" y="77" text-anchor="middle" font-size="11" fill="var(--color-text)">Voting plugins</text> <text x="130" y="67" text-anchor="middle" font-size="11" fill="var(--color-text)">Voting</text>
<rect x="70" y="86" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="130" y="109" text-anchor="middle" font-size="11" fill="var(--color-text)">Deliberation</text>
<rect x="70" y="128" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" /> <rect x="70" y="128" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="130" y="151" text-anchor="middle" font-size="11" fill="var(--color-text)">Delegation</text> <text x="130" y="151" text-anchor="middle" font-size="11" fill="var(--color-text)">Delegation</text>
<rect x="370" y="54" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" /> <rect x="370" y="44" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="430" y="77" text-anchor="middle" font-size="11" fill="var(--color-text)">Moderation</text> <text x="430" y="67" text-anchor="middle" font-size="11" fill="var(--color-text)">Moderation</text>
<rect x="370" y="86" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="430" y="109" text-anchor="middle" font-size="11" fill="var(--color-text)">Workflows</text>
<rect x="370" y="128" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" /> <rect x="370" y="128" width="120" height="36" rx="12" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="430" y="151" text-anchor="middle" font-size="11" fill="var(--color-text)">Integrations</text> <text x="430" y="151" text-anchor="middle" font-size="11" fill="var(--color-text)">Federation</text>
<path d="M 190 72 L 210 92" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" /> <path d="M 190 62 L 210 92" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" />
<path d="M 190 104 L 210 104" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" />
<path d="M 190 146 L 210 128" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" /> <path d="M 190 146 L 210 128" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" />
<path d="M 370 92 L 350 92" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" /> <path d="M 370 62 L 350 92" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" />
<path d="M 370 104 L 350 104" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" />
<path d="M 370 128 L 350 128" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" /> <path d="M 370 128 L 350 128" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow2)" fill="none" />
<text x="280" y="186" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">Per-community configuration decides what is enabled.</text> <text x="280" y="186" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">Per-community configuration decides what is enabled.</text>
</svg> </svg>
<div class="diagram-footer"> <div class="diagram-footer">
<a href="/features" class="diagram-link">See the modules →</a> Built-in modules cover deliberation, workflows, moderation, exports, analytics, and federation.
<a href="#plugin-catalog" class="diagram-link">Browse the catalog ↓</a>
</div> </div>
</div> </div>
<div class="diagram-card ui-card ui-card-pad-lg">
<div class="diagram-header">
<h4>Voting systems as plugins</h4>
<p>Select the tally that matches the decision. The method is a module—swap it without changing the rest of the platform.</p>
</div>
<svg class="diagram" viewBox="0 0 560 220" role="img" aria-label="Voting plugins diagram">
<defs>
<marker id="arrow3" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" fill="var(--color-border-hover)" />
</marker>
</defs>
<rect x="24" y="24" width="512" height="172" rx="18" fill="rgba(255,255,255,0.02)" stroke="var(--color-border)" />
<rect x="56" y="78" width="144" height="64" rx="14" fill="var(--color-surface)" stroke="var(--color-border-hover)" />
<text x="128" y="106" text-anchor="middle" font-size="12" fill="var(--color-text)">Proposal</text>
<text x="128" y="126" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">options • deadline</text>
<rect x="220" y="62" width="120" height="96" rx="14" fill="var(--color-bg-alt)" stroke="var(--color-border)" />
<text x="280" y="92" text-anchor="middle" font-size="11" fill="var(--color-text)">Voting plugin</text>
<text x="280" y="112" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">tally method</text>
<text x="280" y="136" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">validation</text>
<rect x="360" y="78" width="144" height="64" rx="14" fill="var(--color-surface)" stroke="var(--color-border-hover)" />
<text x="432" y="106" text-anchor="middle" font-size="12" fill="var(--color-text)">Results</text>
<text x="432" y="126" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">winner • breakdown</text>
<path d="M 200 110 L 220 110" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow3)" fill="none" />
<path d="M 340 110 L 360 110" stroke="var(--color-border-hover)" stroke-width="2" marker-end="url(#arrow3)" fill="none" />
<rect x="56" y="44" width="144" height="26" rx="10" fill="rgba(255,255,255,0.02)" stroke="var(--color-border)" />
<text x="128" y="62" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">delegation resolved before tally</text>
<text x="280" y="186" text-anchor="middle" font-size="10" fill="var(--color-text-muted)">Methods: Approval • Ranked Choice • Schulze • STAR • Quadratic</text>
</svg>
<div class="diagram-footer">
Voting methods are pluggable: choose the right method for elections, prioritization, budgets, or multi-option decisions.
</div>
</div>
</div>
<div class="modularity-panels">
<section class="modularity-panel ui-card ui-card-pad-lg" id="plugin-catalog">
<h3>Built-in governance plugin catalog</h3>
<p class="panel-intro">
These modules ship with Likwid. Some are core/global, others can be enabled per community.
</p>
<div class="plugin-grid">
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">proposal_lifecycle</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-recommended">Core</span>
<span class="ui-pill ui-pill-core">Global</span>
</div>
</div>
<p>Proposal lifecycle with versioning, diffs, and forks</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">decision_workflows</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-recommended">Core</span>
<span class="ui-pill ui-pill-core">Global</span>
</div>
</div>
<p>Composable decision-making workflows with configurable phases</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">moderation_ledger</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-recommended">Core</span>
<span class="ui-pill ui-pill-core">Global</span>
</div>
</div>
<p>Immutable, cryptographically-chained log of all moderation decisions</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">structured_deliberation</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Community</span>
<span class="ui-pill ui-pill-core">Default</span>
</div>
</div>
<p>Pro/con arguments and collaborative summaries</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">self_moderation_rules</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Community</span>
<span class="ui-pill ui-pill-core">Default</span>
</div>
</div>
<p>Community-configurable moderation rules with escalation</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">conflict_resolution</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Community</span>
<span class="ui-pill ui-pill-core">Default</span>
</div>
</div>
<p>Structured conflict resolution with mediation</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">comment_notifications</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Community</span>
<span class="ui-pill ui-pill-core">Default</span>
</div>
</div>
<p>Sends proposal authors a notification when someone comments</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">public_data_export</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Community</span>
<span class="ui-pill ui-pill-core">Default</span>
</div>
</div>
<p>Privacy-aware CSV/JSON data exports</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">governance_analytics</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Community</span>
<span class="ui-pill ui-pill-core">Default</span>
</div>
</div>
<p>Aggregate governance analytics and health metrics</p>
</div>
<div class="plugin-item">
<div class="plugin-head">
<code class="plugin-code">federation</code>
<div class="plugin-badges">
<span class="ui-pill ui-pill-core">Global</span>
<span class="ui-pill ui-pill-core">Optional</span>
</div>
</div>
<p>Multi-community federation and cross-instance collaboration</p>
</div>
</div>
<div class="panel-footer">
<a href="/features" class="diagram-link">Full feature breakdown →</a>
</div>
</section>
<section class="modularity-panel ui-card ui-card-pad-lg" id="voting-methods">
<h3>Voting methods at a glance</h3>
<p class="panel-intro">Voting is a plugin: choose the tally that fits the decision.</p>
<div class="methods-grid">
<div class="method-mini">
<h4>Schulze</h4>
<p>Consensus-seeking elections with many candidates (Condorcet).</p>
</div>
<div class="method-mini">
<h4>STAR</h4>
<p>Score + runoff: captures intensity and broad support.</p>
</div>
<div class="method-mini">
<h4>Quadratic</h4>
<p>Prioritization and budgeting: reveals preference intensity.</p>
</div>
<div class="method-mini">
<h4>Ranked choice</h4>
<p>Simple single-winner elections with transfers.</p>
</div>
<div class="method-mini">
<h4>Approval</h4>
<p>Fast, robust decisions: choose all acceptable options.</p>
</div>
</div>
<div class="panel-footer">
<a href="/features#voting" class="diagram-link">Learn how each method works →</a>
</div>
</section>
<section class="modularity-panel ui-card ui-card-pad-lg" id="module-bundles">
<h3>Example module bundles</h3>
<p class="panel-intro">Different organizations enable different governance “stacks”.</p>
<div class="bundle-grid">
<div class="bundle-item">
<h4>Open source project</h4>
<div class="bundle-pills">
<span class="ui-pill ui-pill-core">structured_deliberation</span>
<span class="ui-pill ui-pill-core">comment_notifications</span>
<span class="ui-pill ui-pill-core">conflict_resolution</span>
<span class="ui-pill ui-pill-core">schulze</span>
</div>
<p>Strong deliberation + consensus elections for maintainers and roadmap decisions.</p>
</div>
<div class="bundle-item">
<h4>Member association / NGO</h4>
<div class="bundle-pills">
<span class="ui-pill ui-pill-core">decision_workflows</span>
<span class="ui-pill ui-pill-core">public_data_export</span>
<span class="ui-pill ui-pill-core">approval</span>
<span class="ui-pill ui-pill-core">ranked_choice</span>
</div>
<p>Clear phases, exports for record-keeping, and simple member-friendly voting.</p>
</div>
<div class="bundle-item">
<h4>Federated network</h4>
<div class="bundle-pills">
<span class="ui-pill ui-pill-core">federation</span>
<span class="ui-pill ui-pill-core">governance_analytics</span>
<span class="ui-pill ui-pill-core">moderation_ledger</span>
<span class="ui-pill ui-pill-core">quadratic</span>
</div>
<p>Cross-community coordination, visibility into governance health, and prioritization across chapters.</p>
</div>
</div>
</section>
</div> </div>
</div> </div>
</section> </section>
@ -451,15 +706,39 @@ import PublicLayout from '../layouts/PublicLayout.astro';
} }
/* Process Flow Section */ /* Process Flow Section */
.diagram-grid { .modularity-notes {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
gap: 1.5rem;
margin: 2rem 0;
}
@media (max-width: 900px) {
.modularity-notes {
grid-template-columns: 1fr;
}
}
.modularity-note h4 {
margin: 0 0 0.5rem;
font-size: 1.125rem;
}
.modularity-note p {
margin: 0;
color: var(--color-text-muted);
line-height: 1.6;
}
.diagram-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem; gap: 2rem;
} }
@media (max-width: 900px) { @media (max-width: 900px) {
.diagram-grid { .diagram-grid {
grid-template-columns: 1fr; gap: 1.5rem;
} }
} }
@ -492,6 +771,150 @@ import PublicLayout from '../layouts/PublicLayout.astro';
font-weight: 500; font-weight: 500;
} }
.modularity-panels {
display: grid;
gap: 1.5rem;
margin-top: 2rem;
}
.modularity-panel h3 {
margin: 0 0 0.75rem;
font-size: 1.25rem;
}
.panel-intro {
margin: 0 0 1.25rem;
color: var(--color-text-muted);
line-height: 1.6;
}
.panel-footer {
margin-top: 1.25rem;
}
.plugin-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
@media (max-width: 900px) {
.plugin-grid {
grid-template-columns: 1fr;
}
}
.plugin-item {
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
padding: 1rem;
background: rgba(255, 255, 255, 0.02);
}
.plugin-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 0.75rem;
margin-bottom: 0.5rem;
}
.plugin-code {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 0.875rem;
color: var(--color-text);
}
.plugin-badges {
display: flex;
gap: 0.35rem;
flex-wrap: wrap;
justify-content: flex-end;
}
.plugin-item p {
margin: 0;
color: var(--color-text-muted);
font-size: 0.9375rem;
line-height: 1.5;
}
.methods-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 1rem;
}
@media (max-width: 900px) {
.methods-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 520px) {
.methods-grid {
grid-template-columns: 1fr;
}
}
.method-mini {
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
padding: 1rem;
background: rgba(255, 255, 255, 0.02);
}
.method-mini h4 {
margin: 0 0 0.5rem;
font-size: 1rem;
color: var(--color-primary);
}
.method-mini p {
margin: 0;
color: var(--color-text-muted);
font-size: 0.875rem;
line-height: 1.5;
}
.bundle-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
@media (max-width: 900px) {
.bundle-grid {
grid-template-columns: 1fr;
}
}
.bundle-item {
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
padding: 1rem;
background: rgba(255, 255, 255, 0.02);
}
.bundle-item h4 {
margin: 0 0 0.75rem;
font-size: 1rem;
}
.bundle-pills {
display: flex;
gap: 0.35rem;
flex-wrap: wrap;
margin-bottom: 0.75rem;
}
.bundle-item p {
margin: 0;
color: var(--color-text-muted);
font-size: 0.9375rem;
line-height: 1.5;
}
/* Technical Section */ /* Technical Section */
.tech-grid { .tech-grid {
display: grid; display: grid;