rewrite DocsCollapsible
now with disabled js support and less broken animations
This commit is contained in:
parent
22b8e154f3
commit
45fc2eed5a
55
src/components/Accordion.astro
Normal file
55
src/components/Accordion.astro
Normal file
|
@ -0,0 +1,55 @@
|
|||
---
|
||||
import "@styles/components/accordion.css"
|
||||
---
|
||||
<details class=`accordion ${Astro.props.class ?? ""}` {...Astro.props}>
|
||||
<summary>
|
||||
<slot name="header"/>
|
||||
</summary>
|
||||
<div class="accordion-container">
|
||||
<div>
|
||||
<slot/>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
document.querySelectorAll(".accordion").forEach(element => {
|
||||
const accordion = element as HTMLDetailsElement;
|
||||
const summary = accordion.querySelector("summary")!;
|
||||
const body = accordion.querySelector(".accordion-container") as HTMLDivElement;
|
||||
|
||||
summary.addEventListener("click", event => {
|
||||
event.preventDefault();
|
||||
body.classList.toggle("animate", true);
|
||||
|
||||
if (!accordion.open || accordion.classList.contains("closing")) {
|
||||
accordion.classList.toggle("closing", false);
|
||||
body.style.setProperty("--height", "0px");
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
accordion.open = true;
|
||||
body.style.setProperty("--height", body.scrollHeight + "px");
|
||||
});
|
||||
} else {
|
||||
body.style.setProperty("--height", body.scrollHeight + "px");
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
accordion.classList.toggle("closing", true);
|
||||
body.style.setProperty("--height", "0px");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
body.addEventListener("transitionend", event => {
|
||||
if ((event as TransitionEvent).propertyName == "max-height") {
|
||||
body.classList.toggle("animate", false);
|
||||
|
||||
if (accordion.classList.contains("closing")) {
|
||||
accordion.classList.toggle("closing", false);
|
||||
accordion.open = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
16
src/components/Collapsible.astro
Normal file
16
src/components/Collapsible.astro
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
import Accordion from "./Accordion.astro"
|
||||
import collapsibleMarker from "@icons/collapsible-marker.svg?raw"
|
||||
|
||||
interface Props {
|
||||
title: string
|
||||
}
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
<Accordion class="docs-collapsible">
|
||||
<div slot="header">
|
||||
<Fragment set:html={collapsibleMarker}/>
|
||||
{title}
|
||||
</div>
|
||||
<slot>
|
||||
</Accordion>
|
|
@ -1,18 +0,0 @@
|
|||
import { Collapsible } from "@ark-ui/solid";
|
||||
import type { Component, JSX } from "solid-js";
|
||||
import { CaretCircleRight } from "@icons";
|
||||
|
||||
export const DocsCollapsible: Component<{
|
||||
title: string;
|
||||
children: JSX.Element;
|
||||
}> = props => {
|
||||
return (
|
||||
<Collapsible.Root>
|
||||
<Collapsible.Trigger>
|
||||
<CaretCircleRight />
|
||||
{props.title}
|
||||
</Collapsible.Trigger>
|
||||
<Collapsible.Content>{props.children}</Collapsible.Content>
|
||||
</Collapsible.Root>
|
||||
);
|
||||
};
|
2
src/icons/collapsible-marker.svg
Normal file
2
src/icons/collapsible-marker.svg
Normal file
|
@ -0,0 +1,2 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><path fill="currentColor" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m0 192a88 88 0 1 1 88-88a88.1 88.1 0 0 1-88 88m29.66-93.66a8 8 0 0 1 0 11.32l-40 40a8 8 0 0 1-11.32-11.32L140.69 128l-34.35-34.34a8 8 0 0 1 11.32-11.32Z"/></svg>
|
||||
|
After Width: | Height: | Size: 335 B |
|
@ -3,7 +3,7 @@ layout: "@layouts/ConfigLayout.astro"
|
|||
title: "Introduction"
|
||||
---
|
||||
|
||||
import { DocsCollapsible } from "@components/Collapsible.tsx";
|
||||
import Collapsible from "@components/Collapsible.astro";
|
||||
import MD_Title from "@components/MD_Title.tsx"
|
||||
|
||||
# {frontmatter.title}
|
||||
|
@ -35,7 +35,7 @@ The shell root is not a visual element but instead contains all of the visual
|
|||
and non visual objects in your shell. You can have multiple different shells
|
||||
with shared components and different shell roots.
|
||||
|
||||
<DocsCollapsible title="Shell search paths and manifests" client:visible>
|
||||
<Collapsible title="Shell search paths and manifests">
|
||||
Quickshell can be launched with configurations in locations other than the default one.
|
||||
|
||||
The `-p` or `--path` option will launch the shell root at the given path.
|
||||
|
@ -68,7 +68,7 @@ myconf4 = ~/.config/quickshell/myconf
|
|||
You can use `quickshell --current` to print the current values of any of these
|
||||
options and what set them.
|
||||
|
||||
</DocsCollapsible>
|
||||
</Collapsible>
|
||||
|
||||
## <MD_Title titleVar={2}> Creating Windows </MD_Title>
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ layout: "@layouts/ConfigLayout.astro"
|
|||
title: "QML Overview"
|
||||
---
|
||||
import MD_Title from "@components/MD_Title.tsx"
|
||||
import { DocsCollapsible } from "@components/Collapsible.tsx";
|
||||
import Collapsible from "@components/Collapsible.astro";
|
||||
|
||||
# {frontmatter.title}
|
||||
|
||||
|
@ -140,7 +140,7 @@ import QtQuick.Layouts 6.0 as L
|
|||
import "jsfile.js" as JsFile
|
||||
```
|
||||
|
||||
<DocsCollapsible title="When no module version" client:visible>
|
||||
<Collapsible title="When no module version">
|
||||
|
||||
By default, when no module version is requested, the QML engine will pick
|
||||
the latest available version of the module. Requesting a specific version
|
||||
|
@ -151,7 +151,7 @@ While Qt's types usually don't majorly change across versions, quickshell's
|
|||
are much more likely to break. To put off dealing with the breakage we suggest
|
||||
specifying a version at least when importing quickshell modules.
|
||||
|
||||
</DocsCollapsible>
|
||||
</Collapsible>
|
||||
|
||||
<span class="small">
|
||||
[Qt Documentation: Import
|
||||
|
@ -321,14 +321,14 @@ the object a name it can be referred to throughout the current file. The id must
|
|||
}
|
||||
```
|
||||
|
||||
<DocsCollapsible title="The `id` property compared to normal properties" client:visible>
|
||||
<Collapsible title="The `id` property compared to normal properties">
|
||||
|
||||
The `id` property isn't really a property, and doesn't do anything other than
|
||||
expose the object to the current file. It is only called a property because it
|
||||
uses very similar syntax to one, and is the only exception to standard property
|
||||
definition rules. The name `id` is always reserved for the id property.
|
||||
|
||||
</DocsCollapsible>
|
||||
</Collapsible>
|
||||
|
||||
##### <MD_Title titleVar={5}> Property access scopes </MD_Title>
|
||||
|
||||
|
|
17
src/styles/components/accordion.css
Normal file
17
src/styles/components/accordion.css
Normal file
|
@ -0,0 +1,17 @@
|
|||
.accordion {
|
||||
& summary {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
& .accordion-container {
|
||||
/* fixes jumps due to margins on inline items */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
& .accordion-container.animate {
|
||||
/* this somehow breaks if both min AND max aren't animated */
|
||||
transition: min-height 0.3s ease, max-height 0.3s ease;
|
||||
min-height: var(--height);
|
||||
max-height: var(--height);
|
||||
}
|
||||
}
|
|
@ -57,26 +57,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
@keyframes rotateIn90 {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rotateOut90 {
|
||||
from {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes percentToFifty {
|
||||
from {
|
||||
--percent: 0%;
|
||||
|
|
|
@ -142,3 +142,41 @@ ul {
|
|||
min-width: 33.8rem;
|
||||
}
|
||||
}
|
||||
|
||||
.docs-collapsible {
|
||||
background-color: hsl(var(--white) 40 50 / 0.1);
|
||||
border-radius: 0.618rem;
|
||||
overflow: hidden;
|
||||
|
||||
& summary {
|
||||
padding: 1.2rem;
|
||||
user-select: none;
|
||||
|
||||
& > div {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 0.1em;
|
||||
font-size: 1.117rem;
|
||||
font-weight: 500;
|
||||
|
||||
& svg {
|
||||
transition: transform 0.3s ease;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& .accordion-container > div {
|
||||
padding: 0 1.2rem;
|
||||
|
||||
& p:first-child {
|
||||
padding-top: 0;
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.docs-collapsible[open]:not(.closing) > summary > div > svg {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue