fix: theme switching causing constant color transitions, too much shadow on codeblocks in light theme

This commit is contained in:
Oleksandr 2026-02-17 19:02:00 +02:00
parent 8848037c63
commit 5d43f69d69
Signed by: Xanazf
GPG key ID: 821EEC32761AC17C
52 changed files with 8088 additions and 3601 deletions

6521
.pnp.cjs generated

File diff suppressed because one or more lines are too long

1678
.pnp.loader.mjs generated

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,16 @@
{ {
"$schema": "https://biomejs.dev/schemas/2.3.14/schema.json", "$schema": "https://biomejs.dev/schemas/2.4.1/schema.json",
"files": {
"includes": ["**", "!!**/dist", "!**/node_modules", "!**/.yarn"]
},
"formatter": { "formatter": {
"enabled": true, "enabled": true,
"formatWithErrors": true, "formatWithErrors": true,
"indentStyle": "space", "indentStyle": "space",
"indentWidth": 2, "indentWidth": 2,
"lineEnding": "lf", "lineEnding": "lf",
"lineWidth": 66, "lineWidth": 80,
"attributePosition": "multiline" "attributePosition": "auto"
}, },
"plugins": [], "plugins": [],
"linter": { "linter": {
@ -25,6 +28,14 @@
} }
} }
}, },
"html": {
"formatter": {
"enabled": true,
"indentScriptAndStyle": true,
"lineWidth": 80
},
"experimentalFullSupportEnabled": true
},
"javascript": { "javascript": {
"formatter": { "formatter": {
"jsxQuoteStyle": "double", "jsxQuoteStyle": "double",
@ -51,6 +62,15 @@
"cssModules": true "cssModules": true
} }
}, },
"json": {
"formatter": {
"enabled": true,
"lineWidth": 80,
"lineEnding": "lf",
"indentStyle": "space",
"indentWidth": 2
}
},
"overrides": [ "overrides": [
{ {
"includes": ["**/*.ts", "**/*.tsx"], "includes": ["**/*.ts", "**/*.tsx"],
@ -75,21 +95,6 @@
} }
} }
} }
},
{
"includes": ["*.astro"],
"linter": {
"rules": {
"correctness": {
"noUnusedImports": "off",
"noUnusedVariables": "off"
},
"style": {
"useConst": "off",
"useImportType": "off"
}
}
}
} }
] ]
} }

58
injectQtdocs.ts Normal file
View file

@ -0,0 +1,58 @@
import fs from "fs";
import path from "path";
import { JSDOM } from "jsdom";
const QT_DOCS_PATH = "./public/docs/qt";
const QT_DOCS_WEIGHT = 0.5;
async function processQtDocs(dir: string) {
const files = fs.readdirSync(dir);
for (const file of files) {
const fullPath = path.join(dir, file);
if (fs.lstatSync(fullPath).isDirectory()) {
await processQtDocs(fullPath);
continue;
}
if (file.endsWith(".html")) {
const html = fs.readFileSync(fullPath, "utf8");
const dom = new JSDOM(html);
const { document } = dom.window;
// remove common Qt doc noise selectors
const noiseSelectors = [
".sidebar",
"nav",
".header",
".footer",
".heading",
".toc",
".navigationbar",
];
noiseSelectors.forEach(selector => {
document
.querySelectorAll(selector)
.forEach(el => el.remove());
});
// inject pagefind meta
const metaSource = document.createElement("meta");
metaSource.setAttribute("data-pagefind-meta", "source:Qt");
document.head.appendChild(metaSource);
// lower weight for qt docs
const metaWeight = document.createElement("meta");
metaWeight.setAttribute(
"data-pagefind-weight",
QT_DOCS_WEIGHT.toString()
);
document.head.appendChild(metaWeight);
fs.writeFileSync(fullPath, dom.serialize());
}
}
}
processQtDocs(QT_DOCS_PATH).catch(console.error);

View file

@ -24,6 +24,7 @@
"astro-icon": "^1.1.5", "astro-icon": "^1.1.5",
"hast-util-from-html": "^2.0.3", "hast-util-from-html": "^2.0.3",
"hastscript": "^9.0.1", "hastscript": "^9.0.1",
"jsdom": "^28.1.0",
"rehype": "^13.0.2", "rehype": "^13.0.2",
"remark-github-blockquote-alert": "^2.0.1", "remark-github-blockquote-alert": "^2.0.1",
"solid-js": "^1.9.11", "solid-js": "^1.9.11",
@ -37,6 +38,7 @@
"@biomejs/biome": "^2.3.15", "@biomejs/biome": "^2.3.15",
"@types/babel__core": "^7.20.5", "@types/babel__core": "^7.20.5",
"@types/hast": "^3.0.4", "@types/hast": "^3.0.4",
"@types/jsdom": "^27.0.0",
"@types/mdast": "^4.0.4", "@types/mdast": "^4.0.4",
"@types/node": "^25.2.3", "@types/node": "^25.2.3",
"@types/unist": "^3.0.3", "@types/unist": "^3.0.3",

View file

@ -1,14 +1,11 @@
--- ---
import "@styles/components/accordion.css"; import "@styles/components/accordion.css";
--- ---
<details class=`accordion ${Astro.props.class ?? ""}` {...Astro.props}>
<summary> <details class={`accordion ${Astro.props.class ?? ""}`} {...Astro.props}>
<slot name="header"/> <summary><slot name="header" /></summary>
</summary>
<div class="accordion-container"> <div class="accordion-container">
<div> <div><slot /></div>
<slot/>
</div>
</div> </div>
</details> </details>
<script> <script>
@ -16,7 +13,9 @@ import "@styles/components/accordion.css";
document.querySelectorAll(".accordion").forEach(element => { document.querySelectorAll(".accordion").forEach(element => {
const accordion = element as HTMLDetailsElement; const accordion = element as HTMLDetailsElement;
const summary = accordion.querySelector("summary")!; const summary = accordion.querySelector("summary")!;
const body = accordion.querySelector(".accordion-container") as HTMLDivElement; const body = accordion.querySelector(
".accordion-container"
) as HTMLDivElement;
summary.addEventListener("click", event => { summary.addEventListener("click", event => {
if ((event.target as Element).tagName === "A") return; if ((event.target as Element).tagName === "A") return;

View file

@ -1,4 +1,5 @@
--- ---
const production = import.meta.env.PRODUCTION; const production = import.meta.env.PRODUCTION;
--- ---
{production && <script is:inline defer data-domain="quickshell.outfoxxed.me" src="https://z.outfoxxed.me/z.js"></script>} {production && <script is:inline defer data-domain="quickshell.outfoxxed.me" src="https://z.outfoxxed.me/z.js"></script>}

View file

@ -9,13 +9,13 @@ export interface Props {
const { badgeText, withIcon = true, badgeIconName } = Astro.props; const { badgeText, withIcon = true, badgeIconName } = Astro.props;
--- ---
<span class="badge"> <span class="badge">
{withIcon && {withIcon &&
( (
badgeIconName ? badgeIconName ?
<Icon name={badgeIconName}/> <Icon name={badgeIconName}/>
: <Icon name={"flag"}/> : <Icon name={"flag"}/>
) )}
}
<span class="badge-text">{badgeText}</span> <span class="badge-text">{badgeText}</span>
</span> </span>

View file

@ -7,9 +7,10 @@ interface Props {
} }
const { title } = Astro.props; const { title } = Astro.props;
--- ---
<Accordion class="docs-collapsible"> <Accordion class="docs-collapsible">
<div slot="header"> <div slot="header">
<Fragment set:html={collapsibleMarker}/> <Fragment set :html={collapsibleMarker} />
{title} {title}
</div> </div>
<slot /> <slot />

View file

@ -10,6 +10,7 @@ interface Props {
const props = Astro.props; const props = Astro.props;
--- ---
<footer class=`${props.class ?? ""}`> <footer class=`${props.class ?? ""}`>
<div class="credits"> <div class="credits">
<p class="hint">Brought to you by:</p> <p class="hint">Brought to you by:</p>

View file

@ -14,16 +14,15 @@ interface Props {
const { title, headings, type } = Astro.props; const { title, headings, type } = Astro.props;
--- ---
<div class="header"> <div class="header">
<div class="header-item header-left"> <div class="header-item header-left">
<Nav mobile={true}/> <Nav mobile={true} />
<h3 class="header-title"> <h3 class="header-title"><a href="/">Quickshell</a></h3>
<a href="/">Quickshell</a>
</h3>
</div> </div>
<div class="header-item header-right"> <div class="header-item header-right">
<Search/> <Search />
<ThemeToggle /> <ThemeToggle />
<TOC title={title} headings={headings} type={type} mobile={true}/> <TOC title={title} headings={headings} type={type} mobile={true} />
</div> </div>
</div> </div>

View file

@ -55,17 +55,19 @@ FloatingWindow {
\`\`\`` \`\`\``
); );
--- ---
<ul class="featurelist"> <ul class="featurelist">
<li class="featurelist-item hot-reloading left"> <li class="featurelist-item hot-reloading left">
<section class="feature-text"> <section class="feature-text">
<h3 class="feature-title">See your changes in real time</h3> <h3 class="feature-title">See your changes in real time</h3>
<span class="feature-subtitle"> <span class="feature-subtitle">
Quickshell loads changes as soon as they're saved, letting you iterate as fast as you can type. Quickshell loads changes as soon as they're saved, letting you iterate
as fast as you can type.
</span> </span>
</section> </section>
<section class="feature-showcase"> <section class="feature-showcase">
<video preload="metadata" controls={false} autoplay loop> <video preload="metadata" controls={false} autoplay loop>
<source src="/assets/simple-shell-livereload.mp4" type="video/mp4"/> <source src="/assets/simple-shell-livereload.mp4" type="video/mp4">
</video> </video>
</section> </section>
</li> </li>
@ -73,46 +75,69 @@ FloatingWindow {
<section class="feature-text"> <section class="feature-text">
<h3 class="feature-title">Easy to use language</h3> <h3 class="feature-title">Easy to use language</h3>
<span class="feature-subtitle"> <span class="feature-subtitle">
Quickshell is configured in QML, a simple language designed for creating flexible user interfaces. Quickshell is configured in QML, a simple language designed for creating
It also has LSP support. flexible user interfaces. It also has LSP support.
</span> </span>
</section> </section>
<section class="feature-showcase" id="qml-showcase"> <section class="feature-showcase" id="qml-showcase">
<div class="showcase-desktop"> <div class="showcase-desktop"><Fragment set :html={codeDesktop} /></div>
<Fragment set:html={codeDesktop}/> <div class="showcase-mobile"><Fragment set :html={codeMobile} /></div>
</div>
<div class="showcase-mobile">
<Fragment set:html={codeMobile}/>
</div>
</section> </section>
</li> </li>
<li class="featurelist-item cloud-li left"> <li class="featurelist-item cloud-li left">
<section class="feature-text"> <section class="feature-text">
<h3 class="feature-title">Extensive integrations</h3> <h3 class="feature-title">Extensive integrations</h3>
<span class="feature-subtitle"> <span class="feature-subtitle">
Quickshell comes with a large set of integrations, with new ones arriving all the time. Quickshell comes with a large set of integrations, with new ones
arriving all the time.
</span> </span>
</section> </section>
<section class="feature-showcase cloud"> <section class="feature-showcase cloud">
<section class="feature-cloud"> <section class="feature-cloud">
<div class="cloud-center"> <div class="cloud-center">
<img src="/favicon.svg" alt="Quickshell" /> <img src="/favicon.svg" alt="Quickshell">
</div> </div>
<div class="cloud-items-wrapper"> <div class="cloud-items-wrapper">
<span class="cloud-item wayland"> <span class="cloud-item wayland">
<div><img class="feature-icon" src="/assets/logos/wayland.svg" alt="Wayland" /></div> <div>
<img
class="feature-icon"
src="/assets/logos/wayland.svg"
alt="Wayland"
>
</div>
</span> </span>
<span class="cloud-item hyprland"> <span class="cloud-item hyprland">
<div><img class="feature-icon" src="/assets/logos/hyprland.svg" alt="Hyprland" /></div> <div>
<img
class="feature-icon"
src="/assets/logos/hyprland.svg"
alt="Hyprland"
>
</div>
</span> </span>
<span class="cloud-item pipewire"> <span class="cloud-item pipewire">
<div><img class="feature-icon" src="/assets/logos/pipewire.svg" alt="Pipewire" /></div> <div>
<img
class="feature-icon"
src="/assets/logos/pipewire.svg"
alt="Pipewire"
>
</div>
</span> </span>
<span class="cloud-item x-org"> <span class="cloud-item x-org">
<div><img class="feature-icon" src="/assets/logos/xorg.svg" alt="X.Org" /></div> <div>
<img
class="feature-icon"
src="/assets/logos/xorg.svg"
alt="X.Org"
>
</div>
</span> </span>
<span class="cloud-item sway"> <span class="cloud-item sway">
<div><img class="feature-icon" src="/assets/logos/sway.svg" alt="Sway" /></div> <div>
<img class="feature-icon" src="/assets/logos/sway.svg" alt="Sway">
</div>
</span> </span>
</div> </div>
</section> </section>

View file

@ -2,16 +2,17 @@
import { Icon } from "astro-icon/components"; import { Icon } from "astro-icon/components";
import MarqueeContent from "./MarqueeContent.astro"; import MarqueeContent from "./MarqueeContent.astro";
--- ---
<div class="marquee"> <div class="marquee">
<div class="marquee-scroll"> <div class="marquee-scroll">
<div id="marquee-scroll-left" class="marquee-scroll-arrow"> <div id="marquee-scroll-left" class="marquee-scroll-arrow">
<div><Icon name="caret-left"/></div> <div><Icon name="caret-left" /></div>
</div> </div>
<div id="marquee-scroll-right" class="marquee-scroll-arrow"> <div id="marquee-scroll-right" class="marquee-scroll-arrow">
<div><Icon name="caret-right"/></div> <div><Icon name="caret-right" /></div>
</div> </div>
</div> </div>
<MarqueeContent/> <MarqueeContent />
</div> </div>
<script src="@config/styling/marquee.ts"/> <script src="@config/styling/marquee.ts" />

View file

@ -34,7 +34,13 @@ const videos = [
}, },
]; ];
--- ---
<div id="marquee-content" class="marquee-content" data-scroll="0" data-media-index="0">
<div
id="marquee-content"
class="marquee-content"
data-scroll="0"
data-media-index="0"
>
{videos.map(({ author, source, installable, path }, index) => { {videos.map(({ author, source, installable, path }, index) => {
return ( return (
<div class=`marquee-item`> <div class=`marquee-item`>

View file

@ -2,6 +2,7 @@
import "@pagefind/default-ui/css/ui.css"; import "@pagefind/default-ui/css/ui.css";
import magnifierIcon from "@icons/magnifier.svg?raw"; import magnifierIcon from "@icons/magnifier.svg?raw";
--- ---
<site-search class="search-wrapper"> <site-search class="search-wrapper">
<button <button
data-open-modal data-open-modal
@ -10,58 +11,60 @@ import magnifierIcon from "@icons/magnifier.svg?raw";
aria-keyshortcuts="Control+K" aria-keyshortcuts="Control+K"
class="search-button" class="search-button"
> >
<Fragment set:html={magnifierIcon}/> <Fragment set :html={magnifierIcon} />
<span class="search-label" aria-hidden="true">Search</span> <span class="search-label" aria-hidden="true">Search</span>
<kbd class="search-kbd"> <kbd class="search-kbd"> <kbd>Ctrl</kbd><kbd>K</kbd> </kbd>
<kbd>Ctrl</kbd><kbd>K</kbd>
</kbd>
</button> </button>
<dialog aria-label="Search" class="search-dialog"> <dialog aria-label="Search" class="search-dialog">
<div class="dialog-frame"> <div class="dialog-frame">
<button data-close-modal class="search-cancel"> <button data-close-modal class="search-cancel">Cancel</button>
Cancel
</button>
<div class="search-container"> <div class="search-container">
<div id="qs_search"/> <div id="qs_search" />
</div> </div>
</div> </div>
</dialog> </dialog>
</site-search> </site-search>
{ {/**
/**
* NOTE: YOINKED FROM STARLIGHT * NOTE: YOINKED FROM STARLIGHT
* This is intentionally inlined to avoid briefly showing an invalid shortcut. * This is intentionally inlined to avoid briefly showing an invalid shortcut.
* Purposely using the deprecated `navigator.platform` property to detect Apple devices, as the * Purposely using the deprecated `navigator.platform` property to detect Apple devices, as the
* user agent is spoofed by some browsers when opening the devtools. * user agent is spoofed by some browsers when opening the devtools.
*/ */}
}
<script is:inline> <script is:inline>
(() => { (() => {
const openBtn = document.querySelector('button[data-open-modal]'); const openBtn = document.querySelector("button[data-open-modal]");
const shortcut = openBtn?.querySelector('kbd'); const shortcut = openBtn?.querySelector("kbd");
if (!openBtn || !(shortcut instanceof HTMLElement)) return; if (!openBtn || !(shortcut instanceof HTMLElement)) return;
const platformKey = shortcut.querySelector('kbd'); const platformKey = shortcut.querySelector("kbd");
if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) { if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
platformKey.textContent = '⌘'; platformKey.textContent = "⌘";
openBtn.setAttribute('aria-keyshortcuts', 'Meta+K'); openBtn.setAttribute("aria-keyshortcuts", "Meta+K");
} }
shortcut.style.display = ''; shortcut.style.display = "";
})(); })();
</script> </script>
<script> <script>
import { getQMLTypeLinkObject, getQMLTypeLink, getIconForLink } from '@src/config/io/helpers'; import {
getQMLTypeLinkObject,
getQMLTypeLink,
getIconForLink,
} from "@src/config/io/helpers";
class SiteSearch extends HTMLElement { class SiteSearch extends HTMLElement {
constructor() { constructor() {
super(); super();
const openBtn = this.querySelector<HTMLButtonElement>('button[data-open-modal]')!; const openBtn = this.querySelector<HTMLButtonElement>(
const closeBtn = this.querySelector<HTMLButtonElement>('button[data-close-modal]')!; "button[data-open-modal]"
const dialog = this.querySelector('dialog')!; )!;
const dialogFrame = this.querySelector('.dialog-frame')!; const closeBtn = this.querySelector<HTMLButtonElement>(
"button[data-close-modal]"
)!;
const dialog = this.querySelector("dialog")!;
const dialogFrame = this.querySelector(".dialog-frame")!;
/** Close the modal if a user clicks on a link or outside of the modal. */ /** Close the modal if a user clicks on a link or outside of the modal. */
const onClick = (event: MouseEvent) => { const onClick = (event: MouseEvent) => {
const isLink = 'href' in (event.target || {}); const isLink = "href" in (event.target || {});
if ( if (
isLink || isLink ||
(document.body.contains(event.target as Node) && (document.body.contains(event.target as Node) &&
@ -73,71 +76,89 @@ import { getQMLTypeLinkObject, getQMLTypeLink, getIconForLink } from '@src/confi
const openModal = (event?: MouseEvent) => { const openModal = (event?: MouseEvent) => {
dialog.showModal(); dialog.showModal();
document.body.toggleAttribute('data-search-modal-open', true); document.body.toggleAttribute("data-search-modal-open", true);
this.querySelector('input')?.focus(); this.querySelector("input")?.focus();
event?.stopPropagation(); event?.stopPropagation();
window.addEventListener('click', onClick); window.addEventListener("click", onClick);
}; };
const closeModal = () => dialog.close(); const closeModal = () => dialog.close();
openBtn.addEventListener('click', openModal); openBtn.addEventListener("click", openModal);
openBtn.disabled = false; openBtn.disabled = false;
closeBtn.addEventListener('click', closeModal); closeBtn.addEventListener("click", closeModal);
dialog.addEventListener('close', () => { dialog.addEventListener("close", () => {
document.body.toggleAttribute('data-search-modal-open', false); document.body.toggleAttribute("data-search-modal-open", false);
window.removeEventListener('click', onClick); window.removeEventListener("click", onClick);
}); });
// Listen for `ctrl + k` and `cmd + k` keyboard shortcuts. // Listen for `ctrl + k` and `cmd + k` keyboard shortcuts.
window.addEventListener('keydown', (e) => { window.addEventListener("keydown", e => {
if ((e.metaKey === true || e.ctrlKey === true) && e.key === 'k') { if ((e.metaKey === true || e.ctrlKey === true) && e.key === "k") {
dialog.open ? closeModal() : openModal(); dialog.open ? closeModal() : openModal();
e.preventDefault(); e.preventDefault();
} }
}); });
const processExcerpt = (sub_resultExcerpt:string):string => { const processExcerpt = (sub_resultExcerpt: string): string => {
const linkRegex = /TYPE99(\w+.)99TYPE/g; const linkRegex = /TYPE99(\w+.)99TYPE/g;
let excerpt = sub_resultExcerpt; let excerpt = sub_resultExcerpt;
const match = [...excerpt.matchAll(linkRegex)]; const match = [...excerpt.matchAll(linkRegex)];
if (match.length > 0){ if (match.length > 0) {
for (const matching of match) { for (const matching of match) {
const linkObject = getQMLTypeLinkObject(matching[1]); const linkObject = getQMLTypeLinkObject(matching[1]);
const link = getQMLTypeLink("NOVERSION", linkObject); const link = getQMLTypeLink("NOVERSION", linkObject);
const icon = linkObject.mtype ? getIconForLink(linkObject.mtype, false) : null; const icon = linkObject.mtype
? getIconForLink(linkObject.mtype, false)
: null;
// for signal // for signal
const bracketString = getIconForLink("func", false) const bracketString = getIconForLink("func", false);
const newLink = `<span class="type${linkObject.mtype}-link typedata-link">${icon ? icon : ""}<a href=${link}>${linkObject.mname || linkObject.name}</a>${linkObject.mtype === "signal" ? bracketString : ""}</span>`; const newLink = `<span class="type${linkObject.mtype}-link typedata-link">${icon ? icon : ""}<a href=${link}>${linkObject.mname || linkObject.name}</a>${linkObject.mtype === "signal" ? bracketString : ""}</span>`;
excerpt = excerpt.replace(matching[0], newLink) excerpt = excerpt.replace(matching[0], newLink);
} }
} }
return excerpt return excerpt;
} };
const formatURL = (path: string) => path; const formatURL = (path: string) => path;
window.addEventListener('DOMContentLoaded', () => { window.addEventListener("DOMContentLoaded", () => {
const onIdle = window.requestIdleCallback || ((cb) => setTimeout(cb, 1)); const onIdle = window.requestIdleCallback || (cb => setTimeout(cb, 1));
onIdle(async () => { onIdle(async () => {
// @ts-expect-error — Missing types for @pagefind/default-ui package. const { PagefindUI } = await import(
const { PagefindUI } = await import('@pagefind/default-ui'); //@ts-expect-error — Missing types for @pagefind/default-ui package.
"@pagefind/default-ui"
);
new PagefindUI({ new PagefindUI({
element: '#qs_search', element: "#qs_search",
baseUrl: import.meta.env.BASE_URL, baseUrl: import.meta.env.BASE_URL,
bundlePath: import.meta.env.BASE_URL.replace(/\/$/, '') + '/pagefind/', bundlePath:
import.meta.env.BASE_URL.replace(/\/$/, "") + "/pagefind/",
showImages: false, showImages: false,
showSubResults: true, showSubResults: true,
processResult: (result: { url: string; excerpt:string; sub_results: Array<{ url: string, excerpt:string }> }) => { processResult: (result: {
url: string;
excerpt: string;
meta: {
source: string;
};
extra_class: string;
sub_results: Array<{
url: string;
excerpt: string;
}>;
}) => {
if (result.meta.source === "Qt Framework") {
result.extra_class = "qt-result-badge";
}
result.url = formatURL(result.url); result.url = formatURL(result.url);
result.excerpt = processExcerpt(result.excerpt) result.excerpt = processExcerpt(result.excerpt);
result.sub_results = result.sub_results.map((sub_result) => { result.sub_results = result.sub_results.map(sub_result => {
sub_result.url = formatURL(sub_result.url); sub_result.url = formatURL(sub_result.url);
sub_result.excerpt = processExcerpt(sub_result.excerpt) sub_result.excerpt = processExcerpt(sub_result.excerpt);
return sub_result; return sub_result;
}); });
}, },
@ -146,5 +167,5 @@ import { getQMLTypeLinkObject, getQMLTypeLink, getIconForLink } from '@src/confi
}); });
} }
} }
customElements.define('site-search', SiteSearch); customElements.define("site-search", SiteSearch);
</script> </script>

View file

@ -21,12 +21,13 @@ const { title, headings, type, mobile } = Astro.props;
const types: TypeTOC | null = type const types: TypeTOC | null = type
? { ? {
properties: Object.keys(type.properties ?? {}), properties: Object.keys(type.properties ?? {}),
functions: (type.functions ?? []).map((f:QuickshellFunction) => f.name), functions: (type.functions ?? []).map((f: QuickshellFunction) => f.name),
signals: Object.keys(type.signals ?? {}), signals: Object.keys(type.signals ?? {}),
variants: Object.keys(type.variants ?? {}), variants: Object.keys(type.variants ?? {}),
} }
: null; : null;
--- ---
{((headings?.length ?? 0) != 0 || types) && {((headings?.length ?? 0) != 0 || types) &&
<div id="toc" aria-mobile={mobile} class=`toc-wrapper${mobile ? "-mobile":""}`> <div id="toc" aria-mobile={mobile} class=`toc-wrapper${mobile ? "-mobile":""}`>
<TableOfContents <TableOfContents
@ -36,5 +37,4 @@ const types: TypeTOC | null = type
mobile={mobile} mobile={mobile}
client:idle client:idle
/> />
</div> </div>}
}

View file

@ -10,6 +10,7 @@ interface Props {
const { title, link, current, showIcon } = Astro.props; const { title, link, current, showIcon } = Astro.props;
--- ---
<a class=`nav-component nav-item nav-link ${current ? "nav-current" : ""}` href={link}> <a class=`nav-component nav-item nav-link ${current ? "nav-current" : ""}` href={link}>
{ showIcon ? ( { showIcon ? (
<div> <div>

View file

@ -9,6 +9,7 @@ interface Props {
} }
const { title, link, current } = Astro.props; const { title, link, current } = Astro.props;
--- ---
<Accordion class=`nav-component nav-collapsible ${current ? "nav-current" : ""}` {...(current ? { open: "_" } : {})}> <Accordion class=`nav-component nav-collapsible ${current ? "nav-current" : ""}` {...(current ? { open: "_" } : {})}>
<div slot="header"> <div slot="header">
<a class=`nav-link ${current ? "nav-current" : ""}` href={link}>{title}</a> <a class=`nav-link ${current ? "nav-current" : ""}` href={link}>{title}</a>
@ -16,5 +17,5 @@ const { title, link, current } = Astro.props;
<Fragment set:html={navMarker}/> <Fragment set:html={navMarker}/>
</div> </div>
</div> </div>
<slot> <slot />
</Accordion> </Accordion>

View file

@ -17,9 +17,7 @@ const modules = versions.versions.find(
version => version.name === versionName version => version.name === versionName
)?.modules; )?.modules;
const currentPath = Astro.url.pathname const currentPath = Astro.url.pathname.split("/").filter(s => s !== "");
.split("/")
.filter(s => s !== "");
const guidePages = await getGuideCollection(versionName ?? ""); const guidePages = await getGuideCollection(versionName ?? "");
@ -40,18 +38,14 @@ function mkTree(
title, title,
link, link,
current: currentPath[pathIdx] === slug, current: currentPath[pathIdx] === slug,
entries: entries?.map(entry => entries: entries?.map(entry => mkTree(link, pathIdx + 1, entry)),
mkTree(link, pathIdx + 1, entry)
),
}; };
} }
function genGuideNav(base: string): NavTree[] | undefined { function genGuideNav(base: string): NavTree[] | undefined {
const pages = guidePages const pages = guidePages
.filter( .filter(
page => page => page.id.match(`^${base}[^/]*$`) !== null && page.id !== "index"
page.id.match(`^${base}[^/]*$`) !== null &&
page.id !== "index"
) )
.sort((a, b) => a.data.index - b.data.index) .sort((a, b) => a.data.index - b.data.index)
.map(page => ({ .map(page => ({
@ -98,6 +92,7 @@ if (versionName) {
}; };
} }
--- ---
<nav class="navtree"> <nav class="navtree">
<Link <Link
title="About" title="About"
@ -109,9 +104,9 @@ if (versionName) {
link="/changelog" link="/changelog"
current={currentPath.length === 1 && currentPath[0] === "changelog"} current={currentPath.length === 1 && currentPath[0] === "changelog"}
/> />
{ versionedEntries && <Tree {...versionsTree as TreeEntry}/>} {versionedEntries && <Tree {...versionsTree as TreeEntry}/>}
<hr/> <hr>
{ versionedEntries && ( {versionedEntries && (
<Tree {...versionedEntries.guide}/> <Tree {...versionedEntries.guide}/>
<Tree {...versionedEntries.types}/> <Tree {...versionedEntries.types}/>
<Link <Link
@ -125,7 +120,7 @@ if (versionName) {
showIcon={true} showIcon={true}
/> />
)} )}
{ !versionedEntries && versions.versions.map(version => ( {!versionedEntries && versions.versions.map(version => (
<Link <Link
title={`Quickshell Documentation (${version.name})`} title={`Quickshell Documentation (${version.name})`}
link={`/docs/${version.name}/guide`} link={`/docs/${version.name}/guide`}

View file

@ -14,6 +14,7 @@ interface Props extends TreeEntry {}
const { title, link, entries, current } = Astro.props; const { title, link, entries, current } = Astro.props;
--- ---
<NavCollapsible title={title} link={link} current={current ?? false}> <NavCollapsible title={title} link={link} current={current ?? false}>
{entries?.map(entry => entry.entries ? ( {entries?.map(entry => entry.entries ? (
<Self {...entry}/> <Self {...entry}/>

View file

@ -8,6 +8,7 @@ export interface Props {
const { mobile } = Astro.props; const { mobile } = Astro.props;
--- ---
<aside class=`nav-wrapper${mobile ? "-mobile" : ""} id="nav"`> <aside class=`nav-wrapper${mobile ? "-mobile" : ""} id="nav"`>
{ mobile ? ( { mobile ? (
<SidebarWrapper client:load> <SidebarWrapper client:load>

View file

@ -1,8 +1,5 @@
--- ---
import type { import type { QMLTypeLinkObject, QuickshellFunction } from "@config/_types";
QMLTypeLinkObject,
QuickshellFunction,
} from "@config/_types";
import { getQMLTypeLink } from "@config/io/helpers"; import { getQMLTypeLink } from "@config/io/helpers";
import { Tag } from "@icons"; import { Tag } from "@icons";
import TypeDetails from "./TypeDetails.astro"; import TypeDetails from "./TypeDetails.astro";
@ -15,9 +12,9 @@ export interface Props {
const { funcData } = Astro.props; const { funcData } = Astro.props;
const { version } = Astro.params; const { version } = Astro.params;
--- ---
<ul class="typedata typefuncs"> <ul class="typedata typefuncs">
{ {funcData.map((item:QuickshellFunction) => {
funcData.map(item => {
const functionParams = item.params.length > 0 ? item.params.map((funcparam,index) => `${funcparam.name}${index !== item.params.length -1 ? ", ":""}`) : undefined const functionParams = item.params.length > 0 ? item.params.map((funcparam,index) => `${funcparam.name}${index !== item.params.length -1 ? ", ":""}`) : undefined
const retTypeLink = getQMLTypeLink(version!, item.ret as unknown as QMLTypeLinkObject) const retTypeLink = getQMLTypeLink(version!, item.ret as unknown as QMLTypeLinkObject)
let genericType:string|undefined; let genericType:string|undefined;
@ -57,6 +54,5 @@ const { version } = Astro.params;
<TypeDetails markdown={item.details} /> <TypeDetails markdown={item.details} />
</li> </li>
) )
}) })}
}
</ul> </ul>

View file

@ -3,6 +3,7 @@ import { getQMLTypeLink } from "@config/io/helpers";
import type { import type {
QMLTypeLinkObject, QMLTypeLinkObject,
QuickshellProps, QuickshellProps,
QuickshellInstance,
} from "@config/_types"; } from "@config/_types";
import { Tag } from "@icons"; import { Tag } from "@icons";
import TypeTitle from "./TypeTitle.astro"; import TypeTitle from "./TypeTitle.astro";
@ -16,13 +17,14 @@ export interface Props {
const { props } = Astro.props; const { props } = Astro.props;
const { version } = Astro.params; const { version } = Astro.params;
--- ---
<ul class="typedata typeprops"> <ul class="typedata typeprops">
{ {Object.keys(props).map((name) => {
Object.entries(props).map(([name, propData]) => { const propData:QuickshellInstance = props[name];
let typeLink:string; let typeLink: string;
let linkText:string; let linkText: string;
let genericType:string|undefined; let genericType: string|undefined;
let genericTypeLink:string|undefined; let genericTypeLink: string|undefined;
const gadget = propData.type.gadget; const gadget = propData.type.gadget;
if (gadget) { if (gadget) {
typeLink = "#" typeLink = "#"
@ -39,7 +41,7 @@ const { version } = Astro.params;
<li id={ name } class="typedata-root typeprop-root"> <li id={ name } class="typedata-root typeprop-root">
<TypeTitle <TypeTitle
typekind="prop" typekind="prop"
typename={name} typename={ name }
typelink={typeLink} typelink={typeLink}
typelink_text={linkText} typelink_text={linkText}
typename_generic={genericType} typename_generic={genericType}
@ -66,6 +68,5 @@ const { version } = Astro.params;
<TypeDetails markdown={propData.details} /> <TypeDetails markdown={propData.details} />
</li> </li>
) )
}) })}
}
</ul> </ul>

View file

@ -12,17 +12,25 @@ export interface Props {
const { signals } = Astro.props; const { signals } = Astro.props;
const { version } = Astro.params; const { version } = Astro.params;
--- ---
<ul class="typedata typesignals"> <ul class="typedata typesignals">
{ {(Object.entries(signals) as [
Object.entries(signals).map(([name, signalData]) => { keyof QuickshellSignal,
const paramKeys = signalData.params.length > 0 ? signalData.params.map((param,index) => `${param.name}${index !== signalData.params.length -1 ? ", ":""}`) : [] QuickshellSignal[keyof QuickshellSignal],
][]).map(([name, signalData]) => {
const paramKeys = signalData.params.length > 0
? signalData.params.map((param,index) => `${param.name}${
index !== signalData.params.length -1
? ", "
:""
}`): []
let genericType:string|undefined; let genericType:string|undefined;
let genericTypeLink:string|undefined; let genericTypeLink:string|undefined;
return ( return (
<li id={ name } class="typedata-root typesignal-root"> <li id={ name.toString() } class="typedata-root typesignal-root">
<TypeTitle <TypeTitle
typekind="signal" typekind="signal"
typename={name} typename={ name.toString() }
typelink="/docs/configuration/qml-overview#-signals" typelink="/docs/configuration/qml-overview#-signals"
typelink_text="" typelink_text=""
typename_generic={genericType} typename_generic={genericType}
@ -50,6 +58,5 @@ const { version } = Astro.params;
<TypeDetails markdown={signalData.details} /> <TypeDetails markdown={signalData.details} />
</li> </li>
) )
}) })}
}
</ul> </ul>

View file

@ -8,10 +8,9 @@ export interface Props {
const { markdown } = Astro.props; const { markdown } = Astro.props;
const { version } = Astro.params; const { version } = Astro.params;
const html = markdown const html = markdown ? await processMarkdown(version!, markdown) : null;
? await processMarkdown(version!, markdown)
: null;
--- ---
<section class="typedata-details"> <section class="typedata-details">
{html ? <div class="typedata-detailsdata" set:html={html} /> : <em>No details provided</em>} {html ? <div class="typedata-detailsdata" set:html={html} /> : <em>No details provided</em>}
</section> </section>

View file

@ -31,14 +31,17 @@ const iconSelector: { [key: string]: string } = {
variant: "fourdiamonds", variant: "fourdiamonds",
}; };
--- ---
<div class={`typedata-title type${typekind}-title`}> <div class={`typedata-title type${typekind}-title`}>
<section class={`typedata-name type${typekind}-name`}> <section class={`typedata-name type${typekind}-name`}>
{typekind !== "func" && <Icon name={iconSelector[typekind]}/>} {typekind !== "func" && <Icon name={iconSelector[typekind]}/>}
<span>{ typename }{ (typekind === "func" || typekind === "signal") ? <span
>{typename}
{(typekind === "func" || typekind === "signal") ?
(<span>(</span><span class="typedata-param">{typedata_params}</span><span>)</span>) (<span>(</span><span class="typedata-param">{typedata_params}</span><span>)</span>)
:""} :""}
</span> </span>
{ typekind !== "variant" && {typekind !== "variant" &&
<span class=`type-datatype ${typekind === "signal" && "typesignal-doclink"}`>{typekind !== "signal" &&":"}&nbsp; <span class=`type-datatype ${typekind === "signal" && "typesignal-doclink"}`>{typekind !== "signal" &&":"}&nbsp;
<a href={typelink}>{ typelink_text }</a> <a href={typelink}>{ typelink_text }</a>
{typename_generic && {typename_generic &&
@ -46,12 +49,11 @@ const iconSelector: { [key: string]: string } = {
<span class="type-generic"><span class="type-datatype">&lt;</span><a href={typelink_generic}>{typename_generic}</a><span class="type-datatype">&gt;</span></span> <span class="type-generic"><span class="type-datatype">&lt;</span><a href={typelink_generic}>{typename_generic}</a><span class="type-datatype">&gt;</span></span>
) )
} }
</span> </span>}
}
</section> </section>
<section class="type-badges"> <section class="type-badges">
{badges && badges.length > 0 ? ( {badges && badges.length > 0 ? (
badges.map(badgeText => <Badge badgeText={badgeText}/>) badges.map((badgeText:string) => <Badge badgeText={badgeText}/>)
) : null} ) : null}
</section> </section>
</div> </div>

View file

@ -9,17 +9,20 @@ export interface Props {
const { variants } = Astro.props; const { variants } = Astro.props;
--- ---
<ul class="typedata typevariants"> <ul class="typedata typevariants">
{ {(Object.entries(variants) as [
Object.entries(variants).map(([name, variantData]) => { keyof QuickshellVariant,
QuickshellVariant[keyof QuickshellVariant],
][]).map(([name, variantData]) => {
const paramKeys = variantData.params && variantData.params.length > 0 const paramKeys = variantData.params && variantData.params.length > 0
? variantData.params.map(param => param.name) ? variantData.params.map(param => param.name)
: []; : [];
return ( return (
<li id={ name } class="typedata-root typevariant-root"> <li id={ name.toString() } class="typedata-root typevariant-root">
<TypeTitle <TypeTitle
typekind="variant" typekind="variant"
typename={name} typename={ name.toString() }
typelink="" typelink=""
typelink_text="" typelink_text=""
/> />
@ -36,7 +39,5 @@ const { variants } = Astro.props;
<TypeDetails markdown={variantData.details} /> <TypeDetails markdown={variantData.details} />
</li> </li>
) )
}) })}
}
</ul> </ul>

View file

@ -12,30 +12,48 @@ interface Props {
const { title, description } = Astro.props; const { title, description } = Astro.props;
--- ---
<meta charset="UTF-8" /> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content={Astro.generator} /> <meta name="generator" content={Astro.generator}>
<link rel="canonical" href={Astro.url} /> <link rel="canonical" href={Astro.url}>
<link rel="sitemap" href="/sitemap-index.xml" /> <link rel="sitemap" href="/sitemap-index.xml">
<title>{title}</title> <title>{title}</title>
<meta name="description" content={description} /> <meta name="description" content={description}>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg">
<script is:inline>
const theme = (() => {
if (typeof localStorage !== "undefined" && localStorage.getItem("theme")) {
return localStorage.getItem("theme");
}
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
return "dark";
}
return "light";
})();
if (theme === "dark") {
document.documentElement.classList.add("dark");
} else {
document.documentElement.classList.remove("dark");
}
</script>
<!-- Open Graph Meta Tags --> <!-- Open Graph Meta Tags -->
<meta name="og:type" content="website" /> <meta name="og:type" content="website">
<meta name="og:site_name" content="quickshell" /> <meta name="og:site_name" content="quickshell">
<meta name="og:url" content={Astro.url} /> <meta name="og:url" content={Astro.url}>
<meta name="og:title" content={title} /> <meta name="og:title" content={title}>
<meta name="og:description" content={description} /> <meta name="og:description" content={description}>
<!-- <meta name="og:image" content={image} /> --> <!-- <meta name="og:image" content={image} /> -->
<!-- Twitter Meta Tags --> <!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image">
<meta name="twitter:domain" content="quickshell.outfoxxed.me" /> <meta name="twitter:domain" content="quickshell.outfoxxed.me">
<meta name="twitter:url" content={Astro.url} /> <meta name="twitter:url" content={Astro.url}>
<meta name="twitter:title" content={title} /> <meta name="twitter:title" content={title}>
<meta name="twitter:description" content={description} /> <meta name="twitter:description" content={description}>
<!-- <meta name="twitter:image" content={image} /> --> <!-- <meta name="twitter:image" content={image} /> -->
<Analytics/> <Analytics />

View file

@ -46,9 +46,11 @@ const remarkParseAtTypes: RemarkPlugin<[]> =
}; };
const groups = args.pop() as Capture; const groups = args.pop() as Capture;
const pathp = (groups.path ?? "").split('.').filter(Boolean); const pathp = (groups.path ?? "")
let type = (pathp.length >= 1 ? pathp.pop() : ""); .split(".")
let module = pathp.join('_'); .filter(Boolean);
let type = pathp.length >= 1 ? pathp.pop() : "";
let module = pathp.join("_");
if (module) { if (module) {
const isQs = module.startsWith("Quickshell"); const isQs = module.startsWith("Quickshell");
@ -68,9 +70,11 @@ const remarkParseAtTypes: RemarkPlugin<[]> =
} }
}); });
return root; return root;
}; };
const rehypeRewriteTypelinks: RehypePlugin<[]> = () => (root: Html.Root): Html.Root => { const rehypeRewriteTypelinks: RehypePlugin<[]> =
() =>
(root: Html.Root): Html.Root => {
visit( visit(
root as Unist.Parent, root as Unist.Parent,
"text", "text",
@ -83,7 +87,10 @@ const rehypeRewriteTypelinks: RehypePlugin<[]> = () => (root: Html.Root): Html.R
changed = true; changed = true;
const linkObject = getQMLTypeLinkObject(match); const linkObject = getQMLTypeLinkObject(match);
const link = getQMLTypeLink(currentVersion, linkObject); const link = getQMLTypeLink(
currentVersion,
linkObject
);
const icon = const icon =
linkObject.mtype && linkObject.mtype !== "func" linkObject.mtype && linkObject.mtype !== "func"
? getIconForLink(linkObject.mtype, false) ? getIconForLink(linkObject.mtype, false)
@ -104,11 +111,11 @@ const rehypeRewriteTypelinks: RehypePlugin<[]> = () => (root: Html.Root): Html.R
parent.children.splice(index, 1, ...fragment.children); parent.children.splice(index, 1, ...fragment.children);
return SKIP; return SKIP;
} }
}); }
);
return root; return root;
}; };
const rehypeRewriteVersionedDoclinks: RehypePlugin<[]> = const rehypeRewriteVersionedDoclinks: RehypePlugin<[]> =
() => () =>
(root: Html.Root): Html.Root => { (root: Html.Root): Html.Root => {

View file

@ -21,13 +21,23 @@ export const getCurrentTheme = (): ThemeProps => {
return { theme: systemTheme, system: systemTheme }; return { theme: systemTheme, system: systemTheme };
}; };
export const updateTheme = () => { export const updateTheme = (transition = true) => {
const theme = getCurrentTheme(); const theme = getCurrentTheme();
const toggle = document.getElementById( const toggle = document.getElementById(
"theme-manual-toggle" "theme-manual-toggle"
) as HTMLInputElement; ) as HTMLInputElement;
if (transition) {
document.documentElement.classList.add("changing-theme"); document.documentElement.classList.add("changing-theme");
document.documentElement.style.setProperty(
"--theme-transition",
"0.3s var(--ease-in-out)"
);
} else {
document.documentElement.style.removeProperty(
"--theme-transition"
);
}
if (theme.theme === "dark") { if (theme.theme === "dark") {
document.documentElement.classList.add("dark"); document.documentElement.classList.add("dark");
@ -37,11 +47,15 @@ export const updateTheme = () => {
if (toggle) toggle.checked = false; if (toggle) toggle.checked = false;
} }
if (transition) {
requestAnimationFrame(() => { requestAnimationFrame(() => {
requestAnimationFrame(() => { requestAnimationFrame(() => {
document.documentElement.classList.remove("changing-theme"); document.documentElement.classList.remove(
"changing-theme"
);
}); });
}); });
}
}; };
export const initTheme = () => { export const initTheme = () => {
@ -58,11 +72,11 @@ export const initTheme = () => {
window window
.matchMedia("(prefers-color-scheme: dark)") .matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", updateTheme); .addEventListener("change", () => updateTheme());
window.addEventListener("storage", updateTheme); window.addEventListener("storage", () => updateTheme());
// initial sync // initial sync
updateTheme(); updateTheme(false);
}; };
// auto-init on client // auto-init on client

39
src/env.d.ts vendored
View file

@ -1,13 +1,46 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" /> /// <reference types="astro/client" />
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro-icon/empty-types" />
declare module "astro-icon/components" {
export const Icon: typeof import("astro-icon/components").Icon;
}
interface ImportMetaEnv { interface ImportMetaEnv {
readonly VERSION_FILE_PATH: string; readonly VERSION_FILE_PATH: string;
readonly BASE_URL: string; readonly BASE_URL: string;
readonly PRODUCTION?: string; readonly PRODUCTION: string | undefined;
} }
interface ImportMeta { interface ImportMeta {
readonly env: ImportMetaEnv; readonly env: ImportMetaEnv;
} }
export type { ImportMeta }; // fix astro-breadcrumbs
declare module "astro-breadcrumbs" {
interface BreadcrumbsProps {
indexText?: string;
mainText?: string;
crumbs: {
text: string;
href: string;
}[];
linkTextFormat?: string;
truncated?: boolean;
case?:
| "lower"
| "upper"
| "capitalize"
| "title"
| "original";
// Add other props you use here
}
export const Breadcrumbs: (props: BreadcrumbsProps) => any;
export default Breadcrumbs;
}
// fix for "?raw" imports
declare module "*?raw" {
const content: string;
export default content;
}

View file

@ -21,7 +21,7 @@ const { title, description } = Astro.props;
class="theme-toggle-input" class="theme-toggle-input"
style="display: none;" style="display: none;"
aria-label="Toggle theme (light/dark)" aria-label="Toggle theme (light/dark)"
/> >
<!--<Header />--> <!--<Header />-->
<slot /> <slot />
<script> <script>
@ -30,4 +30,3 @@ const { title, description } = Astro.props;
</script> </script>
</body> </body>
</html> </html>

View file

@ -17,7 +17,7 @@ interface Props {
} }
const { title, description, headings, type } = Astro.props; const { title, description, headings, type } = Astro.props;
let url = Astro.url.pathname.split("/").filter(s => s !== ""); let url = Astro.url.pathname.split("/").filter((s: string) => s !== "");
const breadcrumbs = [ const breadcrumbs = [
{ {
@ -57,13 +57,19 @@ for (const segment of url) {
class="theme-toggle-input" class="theme-toggle-input"
aria-label="Toggle theme (light/dark)" aria-label="Toggle theme (light/dark)"
style="display: none;" style="display: none;"
/> >
<Header title={title} headings={headings} type={type}/> <Header title={title} headings={headings} type={type} />
<div class="docslayout-root"> <div class="docslayout-root">
<Nav mobile={false}/> <Nav mobile={false} />
<div class="docslayout-inner" data-pagefind-body> <div class="docslayout-inner" data-pagefind-body>
<Breadcrumbs crumbs={breadcrumbs} linkTextFormat="sentence" truncated={true} data-pagefind-ignore> <Breadcrumbs
crumbs={breadcrumbs}
linkTextFormat="sentence"
truncated={true}
data-pagefind-ignore
>
<svg <svg
<!-- @ts-expect-error -->
slot="index" slot="index"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="1em" width="1em"
@ -74,25 +80,27 @@ for (const segment of url) {
<path <path
fill="currentColor" fill="currentColor"
d="m219.31 108.68l-80-80a16 16 0 0 0-22.62 0l-80 80A15.87 15.87 0 0 0 32 120v96a8 8 0 0 0 8 8h64a8 8 0 0 0 8-8v-56h32v56a8 8 0 0 0 8 8h64a8 8 0 0 0 8-8v-96a15.87 15.87 0 0 0-4.69-11.32M208 208h-48v-56a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v56H48v-88l80-80l80 80Z" d="m219.31 108.68l-80-80a16 16 0 0 0-22.62 0l-80 80A15.87 15.87 0 0 0 32 120v96a8 8 0 0 0 8 8h64a8 8 0 0 0 8-8v-56h32v56a8 8 0 0 0 8 8h64a8 8 0 0 0 8-8v-96a15.87 15.87 0 0 0-4.69-11.32M208 208h-48v-56a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v56H48v-88l80-80l80 80Z"
></path></svg ></path>
> </svg>
<svg <svg
<!-- @ts-expect-error -->
slot="separator" slot="separator"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="1em" width="1em"
height="1em" height="1em"
viewBox="0 0 256 256" viewBox="0 0 256 256"
><path >
<path
fill="currentColor" fill="currentColor"
d="m181.66 133.66l-80 80a8 8 0 0 1-11.32-11.32L164.69 128L90.34 53.66a8 8 0 0 1 11.32-11.32l80 80a8 8 0 0 1 0 11.32" d="m181.66 133.66l-80 80a8 8 0 0 1-11.32-11.32L164.69 128L90.34 53.66a8 8 0 0 1 11.32-11.32l80 80a8 8 0 0 1 0 11.32"
></path></svg ></path>
> </svg>
</Breadcrumbs> </Breadcrumbs>
<slot/> <slot />
</div> </div>
<slot name="alongside-content"/> <slot name="alongside-content" />
</div> </div>
<Footer/> <Footer />
<script> <script>
import "@config/styling/animations_helper.ts"; import "@config/styling/animations_helper.ts";
import "@config/styling/theme_persistence.ts"; import "@config/styling/theme_persistence.ts";
@ -101,32 +109,32 @@ for (const segment of url) {
</html> </html>
<script> <script>
// FIXME: need to make this work properly, or fold into the markdown processor // FIXME: need to make this work properly, or fold into the markdown processor
let headings = document.getElementsByClassName("heading") let headings = document.getElementsByClassName("heading");
if (headings.length > 0) { if (headings.length > 0) {
//@ts-expect-error //@ts-expect-error
for (const heading of headings) { for (const heading of headings) {
let button = heading.querySelector("h2") let button = heading.querySelector("h2");
if (button) { if (button) {
button.onclick = () => { button.onclick = () => {
let link = window.location.href.split("#")[0]; let link = window.location.href.split("#")[0];
link += `#${button.textContent?.trimEnd().replaceAll(" ", "-").toLowerCase()}`; link += `#${button.textContent?.trimEnd().replaceAll(" ", "-").toLowerCase()}`;
window.location.href = link window.location.href = link;
navigator.clipboard.writeText(link); navigator.clipboard.writeText(link);
heading.classList.toggle("copied") heading.classList.toggle("copied");
setTimeout(() => heading.classList.remove("copied"), 1000); setTimeout(() => heading.classList.remove("copied"), 1000);
};
} }
} let spanButton = heading.querySelector("span");
let spanButton = heading.querySelector("span")
if (spanButton) { if (spanButton) {
spanButton.onclick = () => { spanButton.onclick = () => {
let link = window.location.href.split("#")[0]; let link = window.location.href.split("#")[0];
link += `#${spanButton.textContent?.trim().replaceAll(" ", "-").toLowerCase()}`; link += `#${spanButton.textContent?.trim().replaceAll(" ", "-").toLowerCase()}`;
window.location.href = link window.location.href = link;
navigator.clipboard.writeText(link); navigator.clipboard.writeText(link);
spanButton.classList.toggle("copied") spanButton.classList.toggle("copied");
setTimeout(() => heading.classList.remove("copied"), 1000); setTimeout(() => heading.classList.remove("copied"), 1000);
};
} }
} }
} }
}
</script> </script>

View file

@ -11,13 +11,20 @@ export interface Props {
const { title, description, headings } = Astro.props; const { title, description, headings } = Astro.props;
--- ---
<DocsLayout title={title} description={description} headings={headings}> <DocsLayout title={title} description={description} headings={headings}>
<div class="docs"> <div class="docs">
<div class="docs-content"> <div class="docs-content">
<hr/> <hr>
<h1>{title}</h1> <h1>{title}</h1>
<slot/> <slot />
</div> </div>
</div> </div>
<TOC slot="alongside-content" mobile={false} title={title} headings={headings} data-pagefind-ignore/> <TOC
slot="alongside-content"
mobile={false}
title={title}
headings={headings}
data-pagefind-ignore
/>
</DocsLayout> </DocsLayout>

View file

@ -15,6 +15,7 @@ const {
frontmatter: { title, description }, frontmatter: { title, description },
} = Astro.props; } = Astro.props;
--- ---
<GuideLayout title={title} description={description ?? ""} headings={headings}> <GuideLayout title={title} description={description ?? ""} headings={headings}>
<slot/> <slot />
</GuideLayout> </GuideLayout>

View file

@ -10,10 +10,7 @@ const versionsMd = await Promise.all(
.filter(version => version.changelog) .filter(version => version.changelog)
.map(async version => ({ .map(async version => ({
version, version,
changelog: await processMarkdown( changelog: await processMarkdown(version.name, version.changelog ?? ""),
version.name,
version.changelog ?? ""
),
})) }))
); );
@ -23,6 +20,7 @@ const headings = versionsMd.map(({ version }) => ({
depth: 1, depth: 1,
})); }));
--- ---
<GuideLayout title="Changelog" description="" headings={headings}> <GuideLayout title="Changelog" description="" headings={headings}>
{versionsMd.map(({ version, changelog }) => ( {versionsMd.map(({ version, changelog }) => (
<div style="display: flex; justify-content: space-between"> <div style="display: flex; justify-content: space-between">

View file

@ -34,6 +34,7 @@ const { headings, Content } = await render(page);
// const html = await processMarkdown(version.name, page.body!); // const html = await processMarkdown(version.name, page.body!);
--- ---
<GuideLayout title={page.data.title} description="" headings={headings}> <GuideLayout title={page.data.title} description="" headings={headings}>
<Content/> <Content />
</GuideLayout> </GuideLayout>

View file

@ -11,6 +11,7 @@ export async function getStaticPaths() {
const { version } = Astro.props; const { version } = Astro.props;
--- ---
<DocsLayout title="Quickshell Docs" description="Quickshell Documentation"> <DocsLayout title="Quickshell Docs" description="Quickshell Documentation">
<h2>Docs</h2> <h2>Docs</h2>
<div class="root-nav"> <div class="root-nav">

View file

@ -9,6 +9,15 @@ import Functions from "@components/type/Functions.astro";
import Signals from "@components/type/Signals.astro"; import Signals from "@components/type/Signals.astro";
import Variants from "@components/type/Variants.astro"; import Variants from "@components/type/Variants.astro";
import Badge from "@components/Badge.astro"; import Badge from "@components/Badge.astro";
import type { ModuleData, TypeData } from "@_types";
interface Props {
version: {
name: string;
};
module: ModuleData;
type: TypeData;
}
export async function getStaticPaths() { export async function getStaticPaths() {
return (await getVersionsData()).versions.flatMap(version => { return (await getVersionsData()).versions.flatMap(version => {
@ -27,18 +36,21 @@ export async function getStaticPaths() {
const { version, module, type } = Astro.props; const { version, module, type } = Astro.props;
const superLink = type.super const superLink = type.super ? getQMLTypeLink(version.name, type.super) : null;
? getQMLTypeLink(version.name, type.super)
: null;
const details = type.details const details = type.details
? await processMarkdown(version.name, type.details) ? await processMarkdown(version.name, type.details)
: null; : null;
--- ---
<DocsLayout title={`${module.name} - ${type.name}`} description={type.description ?? ""} type={type}>
<DocsLayout
title={`${module.name} - ${type.name}`}
description={type.description ?? ""}
type={type}
>
<div class="docs"> <div class="docs">
<div class="docs-content typedocs-content"> <div class="docs-content typedocs-content">
<hr /> <hr>
<section class="typedocs-title"> <section class="typedocs-title">
<h2 class="typedocs-title-text" data-pagefind-weight="10"> <h2 class="typedocs-title-text" data-pagefind-weight="10">
{type.name}: {type.name}:
@ -51,11 +63,10 @@ const details = type.details
</a> </a>
):( ):(
<span class="type-datatype" data-pagefind-ignore>{type.name}</span> <span class="type-datatype" data-pagefind-ignore>{type.name}</span>
) )}
}
</h2> </h2>
{type.flags && ( {type.flags && (
<div class="type-flags" data-pagefind-ignore>{type.flags.map(flag => ( <div class="type-flags" data-pagefind-ignore>{type.flags.map((flag:string) => (
<Badge badgeText={flag}/> <Badge badgeText={flag}/>
))}</div> ))}</div>
)} )}
@ -65,23 +76,23 @@ const details = type.details
<subheading class="typedocs-subheading"> <subheading class="typedocs-subheading">
{details ? <span class="parsedMD" set:html={details}/> : (<span class="toparse">{type.description}</span>)} {details ? <span class="parsedMD" set:html={details}/> : (<span class="toparse">{type.description}</span>)}
</subheading> </subheading>
{ Object.keys(type.properties ?? {}).length != 0 && ( {Object.keys(type.properties ?? {}).length != 0 && (
<h2>Properties <a href={`/docs/${version.name}/guide/qml-language#properties`}>[?]</a></h2> <h2>Properties <a href={`/docs/${version.name}/guide/qml-language#properties`}>[?]</a></h2>
<Properties props={type.properties!}/> <Properties props={type.properties!}/>
)} )}
{ (type.functions?.length ?? 0) != 0 && ( {(type.functions?.length ?? 0) != 0 && (
<h2>Functions <a href={`/docs/${version.name}/guide/qml-language#functions`}>[?]</a></h2> <h2>Functions <a href={`/docs/${version.name}/guide/qml-language#functions`}>[?]</a></h2>
<Functions <Functions
funcData={type.functions!} funcData={type.functions!}
/> />
)} )}
{ Object.keys(type.signals ?? {}).length != 0 && ( {Object.keys(type.signals ?? {}).length != 0 && (
<h2>Signals <a href={`/docs/${version.name}/guide/qml-language#signals`}>[?]</a></h2> <h2>Signals <a href={`/docs/${version.name}/guide/qml-language#signals`}>[?]</a></h2>
<Signals <Signals
signals={type.signals!} signals={type.signals!}
/> />
)} )}
{ Object.keys(type.variants ?? {}).length != 0 && ( {Object.keys(type.variants ?? {}).length != 0 && (
<h2>Variants</h2> <h2>Variants</h2>
<Variants <Variants
variants={type.variants!} variants={type.variants!}
@ -89,7 +100,6 @@ const details = type.details
)} )}
</section> </section>
</div> </div>
<TOC mobile={false} type={type} data-pagefind-ignore/> <TOC mobile={false} type={type} data-pagefind-ignore />
</div> </div>
</DocsLayout> </DocsLayout>

View file

@ -2,6 +2,7 @@
import DocsLayout from "@layouts/DocsLayout.astro"; import DocsLayout from "@layouts/DocsLayout.astro";
import { getVersionsData } from "@config/io/generateTypeData"; import { getVersionsData } from "@config/io/generateTypeData";
import { processMarkdown } from "@src/config/io/markdown"; import { processMarkdown } from "@src/config/io/markdown";
import type { TypeData } from "@_types";
export async function getStaticPaths() { export async function getStaticPaths() {
return (await getVersionsData()).versions.flatMap(version => { return (await getVersionsData()).versions.flatMap(version => {
@ -23,12 +24,12 @@ const details = module.details
description="Quickshell Type Documentation" description="Quickshell Type Documentation"
> >
<div class="docs-content"> <div class="docs-content">
<hr /> <hr>
<h2 class="typedocs-title">{module.name} Definitions</h2> <h2 class="typedocs-title">{module.name} Definitions</h2>
<section> <section>
<span>{module.description}</span> <span>{module.description}</span>
<div class="root-nav" data-pagefind-ignore> <div class="root-nav" data-pagefind-ignore>
{module.types.map(type => {module.types.map((type: TypeData) =>
( (
<div class="root-nav-entry"> <div class="root-nav-entry">
<a class="root-nav-link" href={`/docs/${version.name}/types/${module.name}/${type.name}`}> <a class="root-nav-link" href={`/docs/${version.name}/types/${module.name}/${type.name}`}>

View file

@ -1,6 +1,7 @@
--- ---
import DocsLayout from "@layouts/DocsLayout.astro"; import DocsLayout from "@layouts/DocsLayout.astro";
import { getVersionsData } from "@config/io/generateTypeData"; import { getVersionsData } from "@config/io/generateTypeData";
import type { ModuleData } from "@_types";
export async function getStaticPaths() { export async function getStaticPaths() {
return (await getVersionsData()).versions.map(version => ({ return (await getVersionsData()).versions.map(version => ({
@ -11,14 +12,18 @@ export async function getStaticPaths() {
const { version } = Astro.props; const { version } = Astro.props;
--- ---
<DocsLayout title="Quickshell Module Listing" description="Quickshell Type Documentation">
<DocsLayout
title="Quickshell Module Listing"
description="Quickshell Type Documentation"
>
<div class="docs-content"> <div class="docs-content">
<hr/> <hr>
<h2>Module Listing</h2> <h2>Module Listing</h2>
<section> <section>
<span>All modules included with Quickshell</span> <span>All modules included with Quickshell</span>
<div class="root-nav" data-pagefind-ignore> <div class="root-nav" data-pagefind-ignore>
{version.modules.map(module => ( {version.modules.map((module: ModuleData) => (
<div class="root-nav-entry"> <div class="root-nav-entry">
<a class="root-nav-link" href={`/docs/${version.name}/types/${module.name}`}> <a class="root-nav-link" href={`/docs/${version.name}/types/${module.name}`}>
{module.name} {module.name}

View file

@ -8,42 +8,52 @@ const defaultVersion = (await getVersionsData()).default;
const title = "Quickshell"; const title = "Quickshell";
--- ---
<BaseLayout title={title} description="A fully user customizable desktop shell" image="/quickshell.png">
<BaseLayout
title={title}
description="A fully user customizable desktop shell"
image="/quickshell.png"
>
<!--<a class="main-page-banner" href="/changelog"> <!--<a class="main-page-banner" href="/changelog">
Quickshell 0.2.1 has been released! | 2025-10-11 Quickshell 0.2.1 has been released! | 2025-10-11
</a>--> </a>-->
<div class="main-page_hero" data-pagefind-ignore> <div class="main-page_hero" data-pagefind-ignore>
<div class="titlebox"> <div class="titlebox">
<img src="/favicon.svg" alt="Quickshell"/> <img src="/favicon.svg" alt="Quickshell">
<h1 class="gradient-text">Quickshell</h1> <h1 class="gradient-text">Quickshell</h1>
</div> </div>
<section class="main-page_hero-text"> <section class="main-page_hero-text">
<h2>building blocks for your desktop</h2> <h2>building blocks for your desktop</h2>
</section> </section>
<Marquee/> <Marquee />
<section class="about"> <section class="about">
<div class="about-txt"> <div class="about-txt">
<p> <p>
Quickshell is a toolkit for building status bars, widgets, lockscreens, Quickshell is a toolkit for building status bars, widgets,
and other desktop components using QtQuick. It can be used alongside your lockscreens, and other desktop components using QtQuick. It can be
wayland compositor or window manager to build a complete desktop environment. used alongside your wayland compositor or window manager to build a
complete desktop environment.
<br class="about-break"> <br class="about-break">
<br class="about-break"> <br class="about-break">
<a href="/about">More information</a> <a href="/about">More information</a>
</p> </p>
</div> </div>
<div class="about-buttons"> <div class="about-buttons">
<a href={`/docs/${defaultVersion}/guide/install-setup`} class="main-page_link-card"> <a
href={`/docs/${defaultVersion}/guide/install-setup`}
class="main-page_link-card"
>
<h3>Install</h3> <h3>Install</h3>
</a> </a>
<a href={`/docs/${defaultVersion}/types`} class="main-page_link-card main-page_bluecard"> <a
href={`/docs/${defaultVersion}/types`}
class="main-page_link-card main-page_bluecard"
>
<h3>Documentation</h3> <h3>Documentation</h3>
</a> </a>
</div> </div>
</section> </section>
<section class="featurelist-section"> <section class="featurelist-section"><FeatureList /></section>
<FeatureList/>
</section>
</div> </div>
<Footer class="frontpage-footer"/> <Footer class="frontpage-footer" />
</BaseLayout> </BaseLayout>

View file

@ -1,7 +1,6 @@
html { html {
font-family: font-family:
"Rubik Variable", Inter, system-ui, Avenir, Helvetica, Arial, "Rubik Variable", Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
sans-serif;
font-size: 14px; font-size: 14px;
line-height: 1.272; line-height: 1.272;
font-weight: 400; font-weight: 400;

View file

@ -86,9 +86,10 @@ pre {
} }
&.shiki { &.shiki {
box-shadow: var(--shadow-xl); box-shadow: var(--shadow-md);
&:hover .copy-button { &:hover .copy-button {
transition: background-color var(--theme-transition);
background-color: hsla(var(--blue) 85 35 / 0.07); background-color: hsla(var(--blue) 85 35 / 0.07);
} }
} }

View file

@ -78,5 +78,5 @@ html {
--ease-out: cubic-bezier(0, 0, 0.2, 1); --ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
--theme-transition: 0.3s var(--ease-in-out); --theme-transition: 0s var(--ease-in-out);
} }

View file

@ -32,11 +32,9 @@
} }
html:not(.dark):not(:has(input#theme-manual-toggle:checked)) > .dim-content-toc, html:not(.dark):not(:has(input#theme-manual-toggle:checked)) > .dim-content-toc,
html:not(.dark):not(:has(input#theme-manual-toggle:checked))
html:not(.dark):not(:has(input#theme-manual-toggle:checked)) > .dim-content-nav { > .dim-content-nav {
background-color: #909090; background-color: #909090;
} }
.docs-content { .docs-content {

View file

@ -42,11 +42,7 @@
.fade { .fade {
mask-image: linear-gradient(to right, #000 80%, transparent); mask-image: linear-gradient(to right, #000 80%, transparent);
-webkit-mask-image: linear-gradient( -webkit-mask-image: linear-gradient(to right, #000 80%, transparent);
to right,
#000 80%,
transparent
);
} }
.nav-collapsible { .nav-collapsible {

View file

@ -4,47 +4,20 @@
} }
#qs_search { #qs_search {
--search-result-spacing: calc( --search-result-spacing: calc(1.25rem * var(--pagefind-ui-scale));
1.25rem * --search-result-pad-inline-start: calc(3.75rem * var(--pagefind-ui-scale));
var(--pagefind-ui-scale) --search-result-pad-inline-end: calc(1.25rem * var(--pagefind-ui-scale));
); --search-result-pad-block: calc(0.9375rem * var(--pagefind-ui-scale));
--search-result-pad-inline-start: calc( --search-result-nested-pad-block: calc(0.625rem * var(--pagefind-ui-scale));
3.75rem *
var(--pagefind-ui-scale)
);
--search-result-pad-inline-end: calc(
1.25rem *
var(--pagefind-ui-scale)
);
--search-result-pad-block: calc(
0.9375rem *
var(--pagefind-ui-scale)
);
--search-result-nested-pad-block: calc(
0.625rem *
var(--pagefind-ui-scale)
);
--search-corners: calc(0.3125rem * var(--pagefind-ui-scale)); --search-corners: calc(0.3125rem * var(--pagefind-ui-scale));
--search-page-icon-size: calc( --search-page-icon-size: calc(1.875rem * var(--pagefind-ui-scale));
1.875rem *
var(--pagefind-ui-scale)
);
--search-page-icon-inline-start: calc( --search-page-icon-inline-start: calc(
( (var(--search-result-pad-inline-start) - var(--search-page-icon-size)) /
var(--search-result-pad-inline-start) -
var(--search-page-icon-size)
) /
2 2
); );
--search-tree-diagram-size: calc( --search-tree-diagram-size: calc(2.5rem * var(--pagefind-ui-scale));
2.5rem *
var(--pagefind-ui-scale)
);
--search-tree-diagram-inline-start: calc( --search-tree-diagram-inline-start: calc(
( (var(--search-result-pad-inline-start) - var(--search-tree-diagram-size)) /
var(--search-result-pad-inline-start) -
var(--search-tree-diagram-size)
) /
2 2
); );
} }
@ -57,12 +30,7 @@
#qs_search #qs_search
.pagefind-ui--reset .pagefind-ui--reset
*:where( *:where(:not(html, iframe, canvas, img, svg, video):not(svg *, symbol *)) {
:not(html, iframe, canvas, img, svg, video):not(
svg *,
symbol *
)
) {
outline: unset; outline: unset;
} }
@ -119,18 +87,14 @@
} }
#qs_search #qs_search
.pagefind-ui__result-title:not( .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)),
:where(.pagefind-ui__result-nested *)
),
#qs_search .pagefind-ui__result-nested { #qs_search .pagefind-ui__result-nested {
position: relative; position: relative;
background-color: hsl(0deg 0% 10%); background-color: hsl(0deg 0% 10%);
} }
#qs_search #qs_search
.pagefind-ui__result-title:not( .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):hover,
:where(.pagefind-ui__result-nested *)
):hover,
#qs_search #qs_search
.pagefind-ui__result-title:not( .pagefind-ui__result-title:not(
:where(.pagefind-ui__result-nested *) :where(.pagefind-ui__result-nested *)
@ -161,17 +125,12 @@
border-radius: 0 0 var(--search-corners) var(--search-corners); border-radius: 0 0 var(--search-corners) var(--search-corners);
} }
#qs_search #qs_search .pagefind-ui__result-inner > .pagefind-ui__result-title {
.pagefind-ui__result-inner padding: var(--search-result-pad-block) var(--search-result-pad-inline-end);
> .pagefind-ui__result-title {
padding: var(--search-result-pad-block)
var(--search-result-pad-inline-end);
padding-inline-start: var(--search-result-pad-inline-start); padding-inline-start: var(--search-result-pad-inline-start);
} }
#qs_search #qs_search .pagefind-ui__result-inner > .pagefind-ui__result-title::before {
.pagefind-ui__result-inner
> .pagefind-ui__result-title::before {
content: ""; content: "";
position: absolute; position: absolute;
inset-block: 0; inset-block: 0;
@ -199,9 +158,7 @@
text-decoration: none; text-decoration: none;
} }
#qs_search #qs_search .pagefind-ui__result-nested .pagefind-ui__result-link::before {
.pagefind-ui__result-nested
.pagefind-ui__result-link::before {
content: unset; content: unset;
} }
@ -236,9 +193,7 @@
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
#qs_search #qs_search .pagefind-ui__result-inner > .pagefind-ui__result-excerpt {
.pagefind-ui__result-inner
> .pagefind-ui__result-excerpt {
display: inline-block; display: inline-block;
position: relative; position: relative;
background: hsl(0deg 0% 10%); background: hsl(0deg 0% 10%);
@ -273,18 +228,8 @@
site-search { site-search {
--shadow-lg: --shadow-lg:
0px 25px 7px hsl(0deg, 0%, 0%, 0.03), 0px 25px 7px hsl(0deg, 0%, 0%, 0.03),
0px 16px 6px hsl(0deg, 0%, 0%, 0.1), 0px 9px 5px hsl( 0px 16px 6px hsl(0deg, 0%, 0%, 0.1), 0px 9px 5px hsl(223deg, 13%, 10%, 0.33),
223deg, 0px 4px 4px hsl(0deg, 0%, 0%, 0.75), 0px 4px 2px hsl(0deg, 0%, 0%, 0.25);
13%,
10%,
0.33
),
0px 4px 4px hsl(0deg, 0%, 0%, 0.75), 0px 4px 2px hsl(
0deg,
0%,
0%,
0.25
);
display: contents; display: contents;
} }
@ -433,8 +378,7 @@ button[data-close-modal] {
} }
html.dark button[data-open-modal], html.dark button[data-open-modal],
html:has(input#theme-manual-toggle:checked) html:has(input#theme-manual-toggle:checked) button[data-open-modal] {
button[data-open-modal] {
background-color: hsla(var(--blue) 15% 15% / 0.5); background-color: hsla(var(--blue) 15% 15% / 0.5);
color: hsl(var(--blue) 40% 65%); color: hsl(var(--blue) 40% 65%);

View file

@ -1,9 +1,8 @@
{ {
"extends": "astro/tsconfigs/strict", "extends": "astro/tsconfigs/strict",
"include": ["src/**/*", "**/**.d.ts", "pagefind.ts"],
"compilerOptions": { "compilerOptions": {
"lib": [ "lib": ["es2023"],
"es2023"
],
"plugins": [ "plugins": [
{ {
"name": "@astrojs/ts-plugin" "name": "@astrojs/ts-plugin"
@ -12,38 +11,25 @@
"jsx": "preserve", "jsx": "preserve",
"jsxImportSource": "solid-js", "jsxImportSource": "solid-js",
"verbatimModuleSyntax": true, "verbatimModuleSyntax": true,
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"strict": true,
"skipLibCheck": true,
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@*": [ "@*": ["./*"],
"./*" "@/*": ["./src/*"],
], "@config/*": ["./src/config/*"],
"@/*": [ "@icons": ["./src/components/icons.tsx"],
"./src/*" "@icons/*": ["./src/icons/*"],
], "@components/*": ["./src/components/*"],
"@config/*": [ "@layouts/*": ["./src/layouts/*"],
"./src/config/*" "@styles/*": ["./src/styles/*"],
], "@_types": ["./src/config/_types/index.ts"],
"@icons": [ "@_types/*": ["./src/config/_types/*"]
"./src/components/icons.tsx" },
], "types": ["astro/client"]
"@icons/*": [
"./src/icons/*"
],
"@components/*": [
"./src/components/*"
],
"@layouts/*": [
"./src/layouts/*"
],
"@styles/*": [
"./src/styles/*"
],
"@_types": [
"./src/config/_types/index.ts"
],
"@_types/*": [
"./src/config/_types/*"
]
}
} }
} }

355
yarn.lock
View file

@ -5,6 +5,13 @@ __metadata:
version: 8 version: 8
cacheKey: 10c0 cacheKey: 10c0
"@acemir/cssom@npm:^0.9.31":
version: 0.9.31
resolution: "@acemir/cssom@npm:0.9.31"
checksum: 10c0/cbfff98812642104ec3b37de1ad3a53f216ddc437e7b9276a23f46f2453844ea3c3f46c200bc4656a2f747fb26567560b3cc5183d549d119a758926551b5f566
languageName: node
linkType: hard
"@antfu/install-pkg@npm:^1.0.0": "@antfu/install-pkg@npm:^1.0.0":
version: 1.1.0 version: 1.1.0
resolution: "@antfu/install-pkg@npm:1.1.0" resolution: "@antfu/install-pkg@npm:1.1.0"
@ -22,6 +29,39 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@asamuzakjp/css-color@npm:^4.1.2":
version: 4.1.2
resolution: "@asamuzakjp/css-color@npm:4.1.2"
dependencies:
"@csstools/css-calc": "npm:^3.0.0"
"@csstools/css-color-parser": "npm:^4.0.1"
"@csstools/css-parser-algorithms": "npm:^4.0.0"
"@csstools/css-tokenizer": "npm:^4.0.0"
lru-cache: "npm:^11.2.5"
checksum: 10c0/e432fdef978b37654a2ca31169a149b9173e708f70c82612acb123a36dbc7dd99913c48cbf2edd6fe3652cc627d4bc94bf87571463da0b788f15b973d4ce5b0f
languageName: node
linkType: hard
"@asamuzakjp/dom-selector@npm:^6.8.1":
version: 6.8.1
resolution: "@asamuzakjp/dom-selector@npm:6.8.1"
dependencies:
"@asamuzakjp/nwsapi": "npm:^2.3.9"
bidi-js: "npm:^1.0.3"
css-tree: "npm:^3.1.0"
is-potential-custom-element-name: "npm:^1.0.1"
lru-cache: "npm:^11.2.6"
checksum: 10c0/635de2c3b11971c07e2d491fd2833d2499bafbab05b616f5d38041031718879c404456644f60c45e9ba4ca2423e5bb48bf3c46179b0c58a0ea68eaae8c61e85f
languageName: node
linkType: hard
"@asamuzakjp/nwsapi@npm:^2.3.9":
version: 2.3.9
resolution: "@asamuzakjp/nwsapi@npm:2.3.9"
checksum: 10c0/869b81382e775499c96c45c6dbe0d0766a6da04bcf0abb79f5333535c4e19946851acaa43398f896e2ecc5a1de9cf3db7cf8c4b1afac1ee3d15e21584546d74d
languageName: node
linkType: hard
"@astrojs/check@npm:0.9.6": "@astrojs/check@npm:0.9.6":
version: 0.9.6 version: 0.9.6
resolution: "@astrojs/check@npm:0.9.6" resolution: "@astrojs/check@npm:0.9.6"
@ -673,6 +713,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@bramus/specificity@npm:^2.4.2":
version: 2.4.2
resolution: "@bramus/specificity@npm:2.4.2"
dependencies:
css-tree: "npm:^3.0.0"
bin:
specificity: bin/cli.js
checksum: 10c0/c5f4e04e0bca0d2202598207a5eb0733c8109d12a68a329caa26373bec598d99db5bb785b8865fefa00fc01b08c6068138807ceb11a948fe15e904ed6cf4ba72
languageName: node
linkType: hard
"@capsizecss/unpack@npm:^4.0.0": "@capsizecss/unpack@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "@capsizecss/unpack@npm:4.0.0" resolution: "@capsizecss/unpack@npm:4.0.0"
@ -682,6 +733,59 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@csstools/color-helpers@npm:^6.0.1":
version: 6.0.1
resolution: "@csstools/color-helpers@npm:6.0.1"
checksum: 10c0/866844267d5aa5a02fe9d54f6db6fc18f6306595edb03664cc8ef15c99d3e6f3b42eb1a413c98bafa5b2dc0d8e0193da9b3bcc9d6a04f5de74cbd44935e74b3c
languageName: node
linkType: hard
"@csstools/css-calc@npm:^3.0.0":
version: 3.1.1
resolution: "@csstools/css-calc@npm:3.1.1"
peerDependencies:
"@csstools/css-parser-algorithms": ^4.0.0
"@csstools/css-tokenizer": ^4.0.0
checksum: 10c0/6efcc016d988edf66e54c7bad03e352d61752cbd1b56c7557fd013868aab23505052ded8f912cd4034e216943ea1e04c957d81012489e3eddc14a57b386510ef
languageName: node
linkType: hard
"@csstools/css-color-parser@npm:^4.0.1":
version: 4.0.1
resolution: "@csstools/css-color-parser@npm:4.0.1"
dependencies:
"@csstools/color-helpers": "npm:^6.0.1"
"@csstools/css-calc": "npm:^3.0.0"
peerDependencies:
"@csstools/css-parser-algorithms": ^4.0.0
"@csstools/css-tokenizer": ^4.0.0
checksum: 10c0/c46be5b9f5c0ef3cd25b47a71bd2a4d1c4856b123ecba4abe8eaa0688d3fc47f58fa67ea281d6b9efca4b9fdfa88fb045c51d0f9b8c612a56bd546d38260b138
languageName: node
linkType: hard
"@csstools/css-parser-algorithms@npm:^4.0.0":
version: 4.0.0
resolution: "@csstools/css-parser-algorithms@npm:4.0.0"
peerDependencies:
"@csstools/css-tokenizer": ^4.0.0
checksum: 10c0/94558c2428d6ef0ddef542e86e0a8376aa1263a12a59770abb13ba50d7b83086822c75433f32aa2e7fef00555e1cc88292f9ca5bce79aed232bb3fed73b1528d
languageName: node
linkType: hard
"@csstools/css-syntax-patches-for-csstree@npm:^1.0.26":
version: 1.0.27
resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.0.27"
checksum: 10c0/ef3f2a639109758c0f3c04520465800ca4c830174bd6f7979795083877c82ace51ab8353857b06a818cb6c0de6d4dc88f84a86fc3b021be47f11a0f1c4b74e7e
languageName: node
linkType: hard
"@csstools/css-tokenizer@npm:^4.0.0":
version: 4.0.0
resolution: "@csstools/css-tokenizer@npm:4.0.0"
checksum: 10c0/669cf3d0f9c8e1ffdf8c9955ad8beba0c8cfe03197fe29a4fcbd9ee6f7a18856cfa42c62670021a75183d9ab37f5d14a866e6a9df753a6c07f59e36797a9ea9f
languageName: node
linkType: hard
"@emmetio/abbreviation@npm:^2.3.3": "@emmetio/abbreviation@npm:^2.3.3":
version: 2.3.3 version: 2.3.3
resolution: "@emmetio/abbreviation@npm:2.3.3" resolution: "@emmetio/abbreviation@npm:2.3.3"
@ -1113,6 +1217,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@exodus/bytes@npm:^1.11.0, @exodus/bytes@npm:^1.6.0":
version: 1.14.1
resolution: "@exodus/bytes@npm:1.14.1"
peerDependencies:
"@noble/hashes": ^1.8.0 || ^2.0.0
peerDependenciesMeta:
"@noble/hashes":
optional: true
checksum: 10c0/486dad30992a8c81058b6b59341ee934c10a7e8016b440770de0f86d2e270950c5d37fc6724ea017295b8654c7564abf6a21cc49bed569d74721b545f571e416
languageName: node
linkType: hard
"@fontsource-variable/rubik@npm:^5.2.8": "@fontsource-variable/rubik@npm:^5.2.8":
version: 5.2.8 version: 5.2.8
resolution: "@fontsource-variable/rubik@npm:5.2.8" resolution: "@fontsource-variable/rubik@npm:5.2.8"
@ -1914,6 +2030,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/jsdom@npm:^27.0.0":
version: 27.0.0
resolution: "@types/jsdom@npm:27.0.0"
dependencies:
"@types/node": "npm:*"
"@types/tough-cookie": "npm:*"
parse5: "npm:^7.0.0"
checksum: 10c0/1ec7ff7177e1f7266e51279f07f3cd013e1713766b01eebceac783061675b31c672a47b0a508dcbaf040f7f22d90405858378c6c5358991989fbe8b95adde354
languageName: node
linkType: hard
"@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.4": "@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.4":
version: 4.0.4 version: 4.0.4
resolution: "@types/mdast@npm:4.0.4" resolution: "@types/mdast@npm:4.0.4"
@ -1988,6 +2115,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/tough-cookie@npm:*":
version: 4.0.5
resolution: "@types/tough-cookie@npm:4.0.5"
checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473
languageName: node
linkType: hard
"@types/unist@npm:*, @types/unist@npm:^3.0.0, @types/unist@npm:^3.0.3": "@types/unist@npm:*, @types/unist@npm:^3.0.0, @types/unist@npm:^3.0.3":
version: 3.0.3 version: 3.0.3
resolution: "@types/unist@npm:3.0.3" resolution: "@types/unist@npm:3.0.3"
@ -2435,6 +2569,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"bidi-js@npm:^1.0.3":
version: 1.0.3
resolution: "bidi-js@npm:1.0.3"
dependencies:
require-from-string: "npm:^2.0.2"
checksum: 10c0/fdddea4aa4120a34285486f2267526cd9298b6e8b773ad25e765d4f104b6d7437ab4ba542e6939e3ac834a7570bcf121ee2cf6d3ae7cd7082c4b5bedc8f271e1
languageName: node
linkType: hard
"boolbase@npm:^1.0.0": "boolbase@npm:^1.0.0":
version: 1.0.0 version: 1.0.0
resolution: "boolbase@npm:1.0.0" resolution: "boolbase@npm:1.0.0"
@ -2798,7 +2941,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"css-tree@npm:^3.0.1, css-tree@npm:^3.1.0": "css-tree@npm:^3.0.0, css-tree@npm:^3.0.1, css-tree@npm:^3.1.0":
version: 3.1.0 version: 3.1.0
resolution: "css-tree@npm:3.1.0" resolution: "css-tree@npm:3.1.0"
dependencies: dependencies:
@ -2843,6 +2986,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"cssstyle@npm:^6.0.1":
version: 6.0.1
resolution: "cssstyle@npm:6.0.1"
dependencies:
"@asamuzakjp/css-color": "npm:^4.1.2"
"@csstools/css-syntax-patches-for-csstree": "npm:^1.0.26"
css-tree: "npm:^3.1.0"
lru-cache: "npm:^11.2.5"
checksum: 10c0/92a8581bad4ce9f77d22761f1aabe72829f4457ac709f4fe1a5b45b431ba165368cd7f849b00454ee31cf0a4c838be583107883f14b6d546802cf3c76a88ca41
languageName: node
linkType: hard
"csstype@npm:^3.1.0": "csstype@npm:^3.1.0":
version: 3.2.3 version: 3.2.3
resolution: "csstype@npm:3.2.3" resolution: "csstype@npm:3.2.3"
@ -2850,6 +3005,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"data-urls@npm:^7.0.0":
version: 7.0.0
resolution: "data-urls@npm:7.0.0"
dependencies:
whatwg-mimetype: "npm:^5.0.0"
whatwg-url: "npm:^16.0.0"
checksum: 10c0/08d88ef50d8966a070ffdaa703e1e4b29f01bb2da364dfbc1612b1c2a4caa8045802c9532d81347b21781100132addb36a585071c8323b12cce97973961dee9f
languageName: node
linkType: hard
"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3":
version: 4.4.3 version: 4.4.3
resolution: "debug@npm:4.4.3" resolution: "debug@npm:4.4.3"
@ -2862,6 +3027,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"decimal.js@npm:^10.6.0":
version: 10.6.0
resolution: "decimal.js@npm:10.6.0"
checksum: 10c0/07d69fbcc54167a340d2d97de95f546f9ff1f69d2b45a02fd7a5292412df3cd9eb7e23065e532a318f5474a2e1bccf8392fdf0443ef467f97f3bf8cb0477e5aa
languageName: node
linkType: hard
"decode-named-character-reference@npm:^1.0.0": "decode-named-character-reference@npm:^1.0.0":
version: 1.2.0 version: 1.2.0
resolution: "decode-named-character-reference@npm:1.2.0" resolution: "decode-named-character-reference@npm:1.2.0"
@ -4059,6 +4231,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"html-encoding-sniffer@npm:^6.0.0":
version: 6.0.0
resolution: "html-encoding-sniffer@npm:6.0.0"
dependencies:
"@exodus/bytes": "npm:^1.6.0"
checksum: 10c0/66dc3f6f5539cc3beb814fcbfae7eacf4ec38cf824d6e1425b72039b51a40f4456bd8541ba66f4f4fe09cdf885ab5cd5bae6ec6339d6895a930b2fdb83c53025
languageName: node
linkType: hard
"html-entities@npm:2.3.3": "html-entities@npm:2.3.3":
version: 2.3.3 version: 2.3.3
resolution: "html-entities@npm:2.3.3" resolution: "html-entities@npm:2.3.3"
@ -4106,7 +4287,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"http-proxy-agent@npm:^7.0.0": "http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2":
version: 7.0.2 version: 7.0.2
resolution: "http-proxy-agent@npm:7.0.2" resolution: "http-proxy-agent@npm:7.0.2"
dependencies: dependencies:
@ -4116,7 +4297,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"https-proxy-agent@npm:^7.0.1": "https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6":
version: 7.0.6 version: 7.0.6
resolution: "https-proxy-agent@npm:7.0.6" resolution: "https-proxy-agent@npm:7.0.6"
dependencies: dependencies:
@ -4242,6 +4423,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"is-potential-custom-element-name@npm:^1.0.1":
version: 1.0.1
resolution: "is-potential-custom-element-name@npm:1.0.1"
checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9
languageName: node
linkType: hard
"is-what@npm:^4.1.8": "is-what@npm:^4.1.8":
version: 4.1.16 version: 4.1.16
resolution: "is-what@npm:4.1.16" resolution: "is-what@npm:4.1.16"
@ -4292,6 +4480,40 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"jsdom@npm:^28.1.0":
version: 28.1.0
resolution: "jsdom@npm:28.1.0"
dependencies:
"@acemir/cssom": "npm:^0.9.31"
"@asamuzakjp/dom-selector": "npm:^6.8.1"
"@bramus/specificity": "npm:^2.4.2"
"@exodus/bytes": "npm:^1.11.0"
cssstyle: "npm:^6.0.1"
data-urls: "npm:^7.0.0"
decimal.js: "npm:^10.6.0"
html-encoding-sniffer: "npm:^6.0.0"
http-proxy-agent: "npm:^7.0.2"
https-proxy-agent: "npm:^7.0.6"
is-potential-custom-element-name: "npm:^1.0.1"
parse5: "npm:^8.0.0"
saxes: "npm:^6.0.0"
symbol-tree: "npm:^3.2.4"
tough-cookie: "npm:^6.0.0"
undici: "npm:^7.21.0"
w3c-xmlserializer: "npm:^5.0.0"
webidl-conversions: "npm:^8.0.1"
whatwg-mimetype: "npm:^5.0.0"
whatwg-url: "npm:^16.0.0"
xml-name-validator: "npm:^5.0.0"
peerDependencies:
canvas: ^3.0.0
peerDependenciesMeta:
canvas:
optional: true
checksum: 10c0/341ecb4005be2dab3247dacc349a20285d7991b5cee3382301fcd69a4294b705b4147e7d9ae1ddfab466ba4b3aace97ded4f7b070de285262221cb2782965b25
languageName: node
linkType: hard
"jsesc@npm:^3.0.2": "jsesc@npm:^3.0.2":
version: 3.1.0 version: 3.1.0
resolution: "jsesc@npm:3.1.0" resolution: "jsesc@npm:3.1.0"
@ -4387,7 +4609,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.0, lru-cache@npm:^11.2.1": "lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.0, lru-cache@npm:^11.2.1, lru-cache@npm:^11.2.5, lru-cache@npm:^11.2.6":
version: 11.2.6 version: 11.2.6
resolution: "lru-cache@npm:11.2.6" resolution: "lru-cache@npm:11.2.6"
checksum: 10c0/73bbffb298760e71b2bfe8ebc16a311c6a60ceddbba919cfedfd8635c2d125fbfb5a39b71818200e67973b11f8d59c5a9e31d6f90722e340e90393663a66e5cd checksum: 10c0/73bbffb298760e71b2bfe8ebc16a311c6a60ceddbba919cfedfd8635c2d125fbfb5a39b71818200e67973b11f8d59c5a9e31d6f90722e340e90393663a66e5cd
@ -5609,6 +5831,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"parse5@npm:^8.0.0":
version: 8.0.0
resolution: "parse5@npm:8.0.0"
dependencies:
entities: "npm:^6.0.0"
checksum: 10c0/8279892dcd77b2f2229707f60eb039e303adf0288812b2a8fd5acf506a4d432da833c6c5d07a6554bef722c2367a81ef4a1f7e9336564379a7dba3e798bf16b3
languageName: node
linkType: hard
"path-browserify@npm:^1.0.1": "path-browserify@npm:^1.0.1":
version: 1.0.1 version: 1.0.1
resolution: "path-browserify@npm:1.0.1" resolution: "path-browserify@npm:1.0.1"
@ -5782,6 +6013,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"punycode@npm:^2.3.1":
version: 2.3.1
resolution: "punycode@npm:2.3.1"
checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9
languageName: node
linkType: hard
"quansync@npm:^0.2.11": "quansync@npm:^0.2.11":
version: 0.2.11 version: 0.2.11
resolution: "quansync@npm:0.2.11" resolution: "quansync@npm:0.2.11"
@ -5808,6 +6046,7 @@ __metadata:
"@shikijs/rehype": "npm:^3.22.0" "@shikijs/rehype": "npm:^3.22.0"
"@types/babel__core": "npm:^7.20.5" "@types/babel__core": "npm:^7.20.5"
"@types/hast": "npm:^3.0.4" "@types/hast": "npm:^3.0.4"
"@types/jsdom": "npm:^27.0.0"
"@types/mdast": "npm:^4.0.4" "@types/mdast": "npm:^4.0.4"
"@types/node": "npm:^25.2.3" "@types/node": "npm:^25.2.3"
"@types/unist": "npm:^3.0.3" "@types/unist": "npm:^3.0.3"
@ -5817,6 +6056,7 @@ __metadata:
baseline-browser-mapping: "npm:^2.9.19" baseline-browser-mapping: "npm:^2.9.19"
hast-util-from-html: "npm:^2.0.3" hast-util-from-html: "npm:^2.0.3"
hastscript: "npm:^9.0.1" hastscript: "npm:^9.0.1"
jsdom: "npm:^28.1.0"
jsonc-parser: "npm:^3.3.1" jsonc-parser: "npm:^3.3.1"
pagefind: "npm:^1.4.0" pagefind: "npm:^1.4.0"
rehype: "npm:^13.0.2" rehype: "npm:^13.0.2"
@ -6281,6 +6521,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"saxes@npm:^6.0.0":
version: 6.0.0
resolution: "saxes@npm:6.0.0"
dependencies:
xmlchars: "npm:^2.2.0"
checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74
languageName: node
linkType: hard
"semver@npm:^6.3.1": "semver@npm:^6.3.1":
version: 6.3.1 version: 6.3.1
resolution: "semver@npm:6.3.1" resolution: "semver@npm:6.3.1"
@ -6643,6 +6892,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"symbol-tree@npm:^3.2.4":
version: 3.2.4
resolution: "symbol-tree@npm:3.2.4"
checksum: 10c0/dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509
languageName: node
linkType: hard
"tar@npm:^6.2.1": "tar@npm:^6.2.1":
version: 6.2.1 version: 6.2.1
resolution: "tar@npm:6.2.1" resolution: "tar@npm:6.2.1"
@ -6694,6 +6950,42 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tldts-core@npm:^7.0.23":
version: 7.0.23
resolution: "tldts-core@npm:7.0.23"
checksum: 10c0/b3d936a75b5f65614c356a58ef37563681c6224187dcce9f57aac76d92aae83b1a6fe6ab910f77472b35456bc145a8441cb3e572b4850be43cb4f3465e0610ec
languageName: node
linkType: hard
"tldts@npm:^7.0.5":
version: 7.0.23
resolution: "tldts@npm:7.0.23"
dependencies:
tldts-core: "npm:^7.0.23"
bin:
tldts: bin/cli.js
checksum: 10c0/492874770afaade724a10f8a97cce511d74bed07735c7f1100b7957254d7a5bbbc18becaf5cd049f9d7b0feeb945a64af64d5a300dfb851a4ac57cf3a5998afc
languageName: node
linkType: hard
"tough-cookie@npm:^6.0.0":
version: 6.0.0
resolution: "tough-cookie@npm:6.0.0"
dependencies:
tldts: "npm:^7.0.5"
checksum: 10c0/7b17a461e9c2ac0d0bea13ab57b93b4346d0b8c00db174c963af1e46e4ea8d04148d2a55f2358fc857db0c0c65208a98e319d0c60693e32e0c559a9d9cf20cb5
languageName: node
linkType: hard
"tr46@npm:^6.0.0":
version: 6.0.0
resolution: "tr46@npm:6.0.0"
dependencies:
punycode: "npm:^2.3.1"
checksum: 10c0/83130df2f649228aa91c17754b66248030a3af34911d713b5ea417066fa338aa4bc8668d06bd98aa21a2210f43fc0a3db8b9099e7747fb5830e40e39a6a1058e
languageName: node
linkType: hard
"trim-lines@npm:^3.0.0": "trim-lines@npm:^3.0.0":
version: 3.0.1 version: 3.0.1
resolution: "trim-lines@npm:3.0.1" resolution: "trim-lines@npm:3.0.1"
@ -6823,6 +7115,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"undici@npm:^7.21.0":
version: 7.22.0
resolution: "undici@npm:7.22.0"
checksum: 10c0/09777c06f3f18f761f03e3a4c9c04fd9fcca8ad02ccea43602ee4adf73fcba082806f1afb637f6ea714ef6279c5323c25b16d435814c63db720f63bfc20d316b
languageName: node
linkType: hard
"unified@npm:^10.0.0": "unified@npm:^10.0.0":
version: 10.1.2 version: 10.1.2
resolution: "unified@npm:10.1.2" resolution: "unified@npm:10.1.2"
@ -7527,6 +7826,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"w3c-xmlserializer@npm:^5.0.0":
version: 5.0.0
resolution: "w3c-xmlserializer@npm:5.0.0"
dependencies:
xml-name-validator: "npm:^5.0.0"
checksum: 10c0/8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b
languageName: node
linkType: hard
"web-namespaces@npm:^2.0.0": "web-namespaces@npm:^2.0.0":
version: 2.0.1 version: 2.0.1
resolution: "web-namespaces@npm:2.0.1" resolution: "web-namespaces@npm:2.0.1"
@ -7534,6 +7842,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"webidl-conversions@npm:^8.0.1":
version: 8.0.1
resolution: "webidl-conversions@npm:8.0.1"
checksum: 10c0/3f6f327ca5fa0c065ed8ed0ef3b72f33623376e68f958e9b7bd0df49fdb0b908139ac2338d19fb45bd0e05595bda96cb6d1622222a8b413daa38a17aacc4dd46
languageName: node
linkType: hard
"whatwg-encoding@npm:^3.1.1": "whatwg-encoding@npm:^3.1.1":
version: 3.1.1 version: 3.1.1
resolution: "whatwg-encoding@npm:3.1.1" resolution: "whatwg-encoding@npm:3.1.1"
@ -7550,6 +7865,24 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"whatwg-mimetype@npm:^5.0.0":
version: 5.0.0
resolution: "whatwg-mimetype@npm:5.0.0"
checksum: 10c0/eead164fe73a00dd82f817af6fc0bd22e9c273e1d55bf4bc6bdf2da7ad8127fca82ef00ea6a37892f5f5641f8e34128e09508f92126086baba126b9e0d57feb4
languageName: node
linkType: hard
"whatwg-url@npm:^16.0.0":
version: 16.0.0
resolution: "whatwg-url@npm:16.0.0"
dependencies:
"@exodus/bytes": "npm:^1.11.0"
tr46: "npm:^6.0.0"
webidl-conversions: "npm:^8.0.1"
checksum: 10c0/9b8cb392be244d0e9687ffe543f9ea63b7aa051a98547ea362a38d182d89bfbd96e13e7ed3f40df1f7566bb7c3581f6c081ddea950cf5382532716ce33000ff4
languageName: node
linkType: hard
"which-pm-runs@npm:^1.1.0": "which-pm-runs@npm:^1.1.0":
version: 1.1.0 version: 1.1.0
resolution: "which-pm-runs@npm:1.1.0" resolution: "which-pm-runs@npm:1.1.0"
@ -7606,6 +7939,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"xml-name-validator@npm:^5.0.0":
version: 5.0.0
resolution: "xml-name-validator@npm:5.0.0"
checksum: 10c0/3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5
languageName: node
linkType: hard
"xmlchars@npm:^2.2.0":
version: 2.2.0
resolution: "xmlchars@npm:2.2.0"
checksum: 10c0/b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593
languageName: node
linkType: hard
"xxhash-wasm@npm:^1.1.0": "xxhash-wasm@npm:^1.1.0":
version: 1.1.0 version: 1.1.0
resolution: "xxhash-wasm@npm:1.1.0" resolution: "xxhash-wasm@npm:1.1.0"