ui: centralize panel primitives

This commit is contained in:
Marco Allegretti 2026-01-29 17:31:40 +01:00
parent c7791611a5
commit f566583412
5 changed files with 77 additions and 161 deletions

View file

@ -200,6 +200,71 @@
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
} }
:where(.panels, .proposal-panels) {
display: grid;
gap: 1rem;
}
.panel {
padding: 0;
overflow: hidden;
}
:where(.panel > summary, .panel-summary) {
list-style: none;
cursor: pointer;
display: flex;
justify-content: space-between;
gap: 1rem;
user-select: none;
}
.panel > summary {
padding: 1rem 1.25rem;
align-items: baseline;
border-bottom: 1px solid var(--color-border);
}
.panel > summary.panel-summary {
padding: 1rem 1.1rem;
align-items: center;
border-bottom: none;
}
:where(.panel > summary, .panel-summary)::-webkit-details-marker {
display: none;
}
.panel[open] > summary {
background: rgba(255, 255, 255, 0.03);
}
.panel-title {
font-weight: 700;
letter-spacing: -0.01em;
}
.panel-meta {
color: var(--color-text-muted);
font-size: 0.875rem;
}
.panel-hint {
color: var(--color-text-muted);
font-size: 0.8125rem;
}
.panel-body {
border-top: 1px solid var(--color-border);
padding: 1rem 1.1rem 1.1rem;
}
.panel-actions {
margin-top: 0.75rem;
display: flex;
justify-content: flex-end;
}
.ui-page-title h1 { .ui-page-title h1 {
font-size: 2rem; font-size: 2rem;
font-weight: 700; font-weight: 700;
@ -423,5 +488,14 @@
.ui-actions { .ui-actions {
justify-content: flex-start; justify-content: flex-start;
} }
:where(.panel > summary, .panel-summary) {
flex-direction: column;
align-items: flex-start;
}
.panel-actions {
justify-content: flex-start;
}
} }
</style> </style>

View file

@ -457,62 +457,10 @@ const { slug } = Astro.params;
text-transform: uppercase; text-transform: uppercase;
} }
.panels {
display: grid;
gap: 1rem;
}
.panel {
overflow: hidden;
}
.panel summary {
cursor: pointer;
list-style: none;
padding: 1rem 1.25rem;
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 1rem;
border-bottom: 1px solid var(--color-border);
}
.panel summary::-webkit-details-marker {
display: none;
}
.panel[open] summary {
background: rgba(255, 255, 255, 0.03);
}
.panel-hint {
color: var(--color-text-muted);
font-size: 0.8125rem;
}
.panel-body {
padding: 1rem 1.25rem 1.25rem;
}
.panel-actions {
margin-top: 0.75rem;
display: flex;
justify-content: flex-end;
}
@media (max-width: 640px) { @media (max-width: 640px) {
.hero-title h1 { .hero-title h1 {
font-size: 1.75rem; font-size: 1.75rem;
} }
.panel summary {
flex-direction: column;
align-items: flex-start;
}
.panel-actions {
justify-content: flex-start;
}
} }
.edit-modal { .edit-modal {

View file

@ -311,41 +311,6 @@ import { API_BASE as apiBase } from '../lib/api';
text-transform: uppercase; text-transform: uppercase;
} }
.panels {
display: grid;
gap: 1rem;
}
.panel {
padding: 0;
overflow: hidden;
}
.panel-summary {
list-style: none;
cursor: pointer;
padding: 1rem 1.1rem;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
user-select: none;
}
.panel-summary::-webkit-details-marker {
display: none;
}
.panel-title {
font-weight: 700;
letter-spacing: -0.01em;
}
.panel-body {
border-top: 1px solid var(--color-border);
padding: 0.9rem 1.1rem 1.1rem;
}
.panel-content { .panel-content {
min-height: 72px; min-height: 72px;
} }

View file

@ -400,41 +400,6 @@ import DelegationGraph from '../components/voting/DelegationGraph.astro';
color: var(--color-text-muted); color: var(--color-text-muted);
} }
.panel {
padding: 0;
overflow: hidden;
}
.panel-summary {
list-style: none;
cursor: pointer;
padding: 1rem 1.1rem;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
user-select: none;
}
.panel-summary::-webkit-details-marker {
display: none;
}
.panel-title {
font-weight: 700;
letter-spacing: -0.01em;
}
.panel-meta {
color: var(--color-text-muted);
font-size: 0.875rem;
}
.panel-body {
border-top: 1px solid var(--color-border);
padding: 1rem 1.1rem 1.1rem;
}
@media (max-width: 640px) { @media (max-width: 640px) {
.delegate-card { .delegate-card {
flex-direction: column; flex-direction: column;

View file

@ -4,6 +4,7 @@ import Layout from '../../layouts/Layout.astro';
import { API_BASE as apiBase } from '../../lib/api'; import { API_BASE as apiBase } from '../../lib/api';
import VotingResultsChart from '../../components/voting/VotingResultsChart.astro'; import VotingResultsChart from '../../components/voting/VotingResultsChart.astro';
const { id } = Astro.params; const { id } = Astro.params;
const proposalId = id ?? '';
--- ---
<Layout title="Proposal"> <Layout title="Proposal">
@ -13,13 +14,13 @@ const { id } = Astro.params;
<div class="state-card ui-card"><p class="loading">Loading proposal…</p></div> <div class="state-card ui-card"><p class="loading">Loading proposal…</p></div>
</div> </div>
<div id="results-chart-host" class="results-chart-host" aria-hidden="true"> <div id="results-chart-host" class="results-chart-host" aria-hidden="true">
<VotingResultsChart proposalId={id} apiBase={apiBase} /> <VotingResultsChart proposalId={proposalId} apiBase={apiBase} />
</div> </div>
</div> </div>
</section> </section>
</Layout> </Layout>
<script define:vars={{ id, apiBase }}> <script define:vars={{ id: proposalId, apiBase }}>
const token = localStorage.getItem('token'); const token = localStorage.getItem('token');
let currentProposal = null; let currentProposal = null;
let selectedOptions = new Set(); let selectedOptions = new Set();
@ -604,43 +605,6 @@ const { id } = Astro.params;
margin-top: 0.5rem; margin-top: 0.5rem;
} }
.proposal-panels {
display: grid;
gap: 1rem;
}
.panel {
overflow: hidden;
}
.panel summary {
cursor: pointer;
list-style: none;
padding: 1rem 1.25rem;
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 1rem;
border-bottom: 1px solid var(--color-border);
}
.panel summary::-webkit-details-marker {
display: none;
}
.panel[open] summary {
background: rgba(255, 255, 255, 0.03);
}
.panel-hint {
color: var(--color-text-muted);
font-size: 0.8125rem;
}
.panel-body {
padding: 1rem 1.25rem 1.25rem;
}
.author-actions-row { .author-actions-row {
display: flex; display: flex;
gap: 0.5rem; gap: 0.5rem;