msc-viewer

A possibly better way to display the Matrix Spec Changes
git clone git://archive.git.mtrnord.blog/MTRNord/msc-viewer.git
Log | Files | Refs | README | LICENSE

commit c0402eaafbc69db8b9aaa05cf5381aab74353400
parent bbdf3ae4019cd919d3dd9834be827fe7bd609815
Author: MTRNord <mtrnord1@gmail.com>
Date:   Sat, 16 Dec 2023 15:50:39 +0100

Improve styling of the checkboxes

Diffstat:
Asrc/components/Checkbox.astro | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/pages/results.astro | 150+++++++++----------------------------------------------------------------------
2 files changed, 90 insertions(+), 133 deletions(-)

diff --git a/src/components/Checkbox.astro b/src/components/Checkbox.astro @@ -0,0 +1,73 @@ +--- +interface Props { + name: string; + label: string; + checked?: boolean; +} + +const { name, label, checked = false } = Astro.props; +--- + +<label class="form-control"> + <input type="checkbox" name={name} checked={checked} /> + {label} +</label> + +<style lang="scss"> + input[type="checkbox"] { + /* Add if not using autoprefixer */ + -webkit-appearance: none; + appearance: none; + /* For iOS < 15 to remove gradient background */ + background-color: #334155; + /* Not removed via appearance */ + margin: 0; + font: inherit; + color: #94a3b8; + width: 20px; + height: 20px; + border: 1px solid #94a3b8; + border-radius: 4px; + transform: translateY(-0.5px); + + display: grid; + place-content: center; + } + + input[type="checkbox"]::before { + content: ""; + width: 0.65em; + height: 0.65em; + transform: scale(0); + transition: 120ms transform ease-in-out; + box-shadow: inset 1em 1em #94a3b8; + + /* Windows High Contrast Mode */ + background-color: #94a3b8; + + transform-origin: bottom left; + clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); + } + + input[type="checkbox"]:checked::before { + transform: scale(1); + } + + input[type="checkbox"]:focus { + outline: max(2px, 0.15em) solid currentColor; + outline-offset: max(2px, 0.15em); + } + + .form-control { + font-size: 18px; + font-weight: 400; + line-height: normal; + display: grid; + grid-template-columns: 1em auto; + gap: 0.5em; + } + + .form-control + .form-control { + margin-top: 0.25em; + } +</style> diff --git a/src/pages/results.astro b/src/pages/results.astro @@ -3,6 +3,7 @@ import StartLayout from "../layouts/StartLayout.astro"; import { MeiliSearch, type SearchResponse } from "meilisearch"; import Pagination from "../components/Pagination.astro"; import Preview from "../components/Preview.astro"; +import Checkbox from "../components/Checkbox.astro"; interface FilterJson { client_server?: boolean; @@ -108,13 +109,14 @@ function format_date(time: number | undefined): string | undefined { <header> <h1>Matrix Spec Changes</h1> <div id="search"> - <input type="search" name="search" value={query} required /> + <input type="search" name="search" aria-label="Search" value={query} required /> <svg id="search-icon" width="24" height="24" viewBox="0 0 48 48" fill="none" + aria-label="Search" xmlns="http://www.w3.org/2000/svg" > <g clip-path="url(#clip0_2_39)"> @@ -147,143 +149,25 @@ function format_date(time: number | undefined): string | undefined { <div class="filter-section"> <h1>Labels</h1> <div class="filter-options"> - <div class="filter-wrapper"> - <input - type="checkbox" - id="client-server" - name="client-server" - checked={filter_parsed.client_server} - /> - <label for="client-server">Client-Server</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="server-server" - name="server-server" - checked={filter_parsed.server_server} - /> - <label for="server-server">Server-Server</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="application-services" - name="application-services" - checked={filter_parsed.application_services} - /> - <label for="application-services" - >Application Services</label - > - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="e2e" - name="e2e" - checked={filter_parsed.e2e} - /> - <label for="e2e">E2EE</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="kind:core" - name="kind:core" - checked={filter_parsed.kind_core} - /> - <label for="kind:core">kind:core</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="kind:feature" - name="kind:feature" - checked={filter_parsed.kind_feature} - /> - <label for="kind:featurer">kind:feature</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="kind:maintenance" - name="kind:maintenance" - checked={filter_parsed.kind_maintenance} - /> - <label for="kind:maintenance" - >kind:maintenance</label - > - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="needs-implementation" - name="needs-implementation" - checked={filter_parsed.needs_implementation} - /> - <label for="needs-implementation" - >needs-implementation</label - > - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="proposal" - name="proposal" - checked={filter_parsed.proposal} - /> - <label for="proposal">proposal</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="abandoned" - name="abandoned" - checked={filter_parsed.abandoned} - /> - <label for="abandoned">abandoned</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="blocked" - name="blocked" - checked={filter_parsed.blocked} - /> - <label for="blocked">blocked</label> - </div> + <Checkbox name="client-server" label="Client-Server" checked={filter_parsed.client_server} /> + <Checkbox name="server-server" label="Server-Server" checked={filter_parsed.server_server} /> + <Checkbox name="application-services" label="Application Services" checked={filter_parsed.application_services} /> + <Checkbox name="e2e" label="E2EE" checked={filter_parsed.e2e} /> + <Checkbox name="kind:core" label="kind:core" checked={filter_parsed.kind_core} /> + <Checkbox name="kind:feature" label="kind:feature" checked={filter_parsed.kind_feature} /> + <Checkbox name="kind:maintenance" label="kind:maintenance" checked={filter_parsed.kind_maintenance} /> + <Checkbox name="needs-implementation" label="needs-implementation" checked={filter_parsed.needs_implementation} /> + <Checkbox name="proposal" label="proposal" checked={filter_parsed.proposal} /> + <Checkbox name="abandoned" label="abandoned" checked={filter_parsed.abandoned} /> + <Checkbox name="blocked" label="blocked" checked={filter_parsed.blocked} /> </div> </div> <div class="filter-section"> <h1>State</h1> <div class="filter-options"> - <div class="filter-wrapper"> - <input - type="checkbox" - id="merged" - name="merged" - checked={filter_parsed.merged} - /> - <label for="merged">merged</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="closed" - name="closed" - checked={filter_parsed.closed} - /> - <label for="closed">closed</label> - </div> - <div class="filter-wrapper"> - <input - type="checkbox" - id="other" - name="other" - checked={filter_parsed.other} - /> - <label for="other">other</label> - </div> + <Checkbox name="merged" label="merged" checked={filter_parsed.merged} /> + <Checkbox name="closed" label="closed" checked={filter_parsed.closed} /> + <Checkbox name="other" label="other" checked={filter_parsed.other} /> </div> </div>