xs-dev 0.24.4 → 0.24.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/toolbox/setup/pico.js +4 -3
- package/docs/astro.config.mjs +2 -3
- package/docs/src/components/Header/LanguageSelect.tsx +41 -43
- package/docs/src/components/Header/Search.tsx +22 -26
- package/docs/src/components/Header/SidebarToggle.tsx +37 -38
- package/docs/src/components/RightSidebar/TableOfContents.tsx +20 -24
- package/docs/src/components/RightSidebar/ThemeToggleButton.tsx +64 -72
- package/docs/tsconfig.json +2 -1
- package/package.json +8 -10
|
@@ -14,6 +14,7 @@ const exec_1 = require("../system/exec");
|
|
|
14
14
|
async function default_1() {
|
|
15
15
|
var _a, _b, _c;
|
|
16
16
|
const OS = (0, os_1.type)().toLowerCase();
|
|
17
|
+
const PICO_BRANCH = '1.5.0';
|
|
17
18
|
const PICO_SDK_REPO = 'https://github.com/raspberrypi/pico-sdk';
|
|
18
19
|
const PICO_EXAMPLES_REPO = 'https://github.com/raspberrypi/pico-examples';
|
|
19
20
|
const PICOTOOL_REPO = 'https://github.com/raspberrypi/picotool';
|
|
@@ -59,7 +60,7 @@ async function default_1() {
|
|
|
59
60
|
// 2. Install the pico sdk, examples, and picotool:
|
|
60
61
|
if (gluegun_1.filesystem.exists(PICO_SDK_DIR) === false) {
|
|
61
62
|
spinner.start('Cloning pico-sdk repo');
|
|
62
|
-
await gluegun_1.system.exec(`git clone --depth 1 --single-branch -b
|
|
63
|
+
await gluegun_1.system.exec(`git clone --depth 1 --single-branch -b ${PICO_BRANCH} ${PICO_SDK_REPO} ${PICO_SDK_DIR}`, {
|
|
63
64
|
stdout: process.stdout,
|
|
64
65
|
});
|
|
65
66
|
await gluegun_1.system.exec(`git submodule update --init`, {
|
|
@@ -70,7 +71,7 @@ async function default_1() {
|
|
|
70
71
|
}
|
|
71
72
|
if (gluegun_1.filesystem.exists(PICO_EXAMPLES_PATH) === false) {
|
|
72
73
|
spinner.start('Cloning pico-exmples repo');
|
|
73
|
-
await gluegun_1.system.exec(`git clone --depth 1 --single-branch -b
|
|
74
|
+
await gluegun_1.system.exec(`git clone --depth 1 --single-branch -b sdk-${PICO_BRANCH} ${PICO_EXAMPLES_REPO} ${PICO_EXAMPLES_PATH}`, { stdout: process.stdout });
|
|
74
75
|
spinner.succeed();
|
|
75
76
|
}
|
|
76
77
|
if (gluegun_1.filesystem.exists(PICOTOOL_PATH) === false) {
|
|
@@ -147,4 +148,4 @@ Then run: xs-dev run --example helloworld --device pico
|
|
|
147
148
|
`);
|
|
148
149
|
}
|
|
149
150
|
exports.default = default_1;
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGljby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3BpY28udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxQ0FBbUQ7QUFDbkQsMkJBQXlDO0FBQ3pDLDJDQUE0RDtBQUM1RCxnRUFBdUM7QUFDdkMsb0NBQTBEO0FBQzFELHdDQUE4RDtBQUM5RCx5Q0FBMkM7QUFDM0MseUNBQWtEO0FBRW5DLEtBQUs7O0lBQ2xCLE1BQU0sRUFBRSxHQUFHLElBQUEsU0FBWSxHQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDdkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFBO0lBQzNCLE1BQU0sYUFBYSxHQUFHLHlDQUF5QyxDQUFBO0lBQy9ELE1BQU0sa0JBQWtCLEdBQUcsOENBQThDLENBQUE7SUFDekUsTUFBTSxhQUFhLEdBQUcseUNBQXlDLENBQUE7SUFDL0QsTUFBTSxTQUFTLEdBQ2IsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsdUJBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLFlBQVksR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUE7SUFDekUsTUFBTSxhQUFhLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sa0JBQWtCLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sV0FBVyxHQUFHLG9CQUFVLENB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
|
package/docs/astro.config.mjs
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { defineConfig } from 'astro/config'
|
|
2
2
|
|
|
3
|
-
import lit from '@astrojs/lit'
|
|
4
|
-
import preact from '@astrojs/preact'
|
|
5
3
|
import tailwind from '@astrojs/tailwind'
|
|
6
4
|
import sitemap from '@astrojs/sitemap'
|
|
5
|
+
import solidJs from "@astrojs/solid-js";
|
|
7
6
|
|
|
8
7
|
// https://astro.build/config
|
|
9
8
|
export default defineConfig({
|
|
10
|
-
integrations: [
|
|
9
|
+
integrations: [solidJs(), tailwind(), sitemap()],
|
|
11
10
|
site: 'https://hipsterbrown.github.io',
|
|
12
11
|
base: '/xs-dev',
|
|
13
12
|
})
|
|
@@ -1,49 +1,47 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import { h } from 'preact';
|
|
1
|
+
import type { Component } from 'solid-js';
|
|
3
2
|
import './LanguageSelect.css';
|
|
4
3
|
import { KNOWN_LANGUAGES, langPathRegex } from '../../languages';
|
|
5
4
|
|
|
6
|
-
const LanguageSelect:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
);
|
|
5
|
+
const LanguageSelect: Component<{ lang: string }> = ({ lang }) => {
|
|
6
|
+
return (
|
|
7
|
+
<div class="language-select-wrapper">
|
|
8
|
+
<svg
|
|
9
|
+
aria-hidden="true"
|
|
10
|
+
role="img"
|
|
11
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
12
|
+
viewBox="0 0 88.6 77.3"
|
|
13
|
+
height="1.2em"
|
|
14
|
+
width="1.2em"
|
|
15
|
+
>
|
|
16
|
+
<path
|
|
17
|
+
fill="currentColor"
|
|
18
|
+
d="M61,24.6h7.9l18.7,51.6h-7.7l-5.4-15.5H54.3l-5.6,15.5h-7.2L61,24.6z M72.6,55l-8-22.8L56.3,55H72.6z"
|
|
19
|
+
/>
|
|
20
|
+
<path
|
|
21
|
+
fill="currentColor"
|
|
22
|
+
d="M53.6,60.6c-10-4-16-9-22-14c0,0,1.3,1.3,0,0c-6,5-20,13-20,13l-4-6c8-5,10-6,19-13c-2.1-1.9-12-13-13-19h8 c4,9,10,14,10,14c10-8,10-19,10-19h8c0,0-1,13-12,24l0,0c5,5,10,9,19,13L53.6,60.6z M1.6,16.6h56v-8h-23v-7h-9v7h-24V16.6z"
|
|
23
|
+
/>
|
|
24
|
+
</svg>
|
|
25
|
+
<select
|
|
26
|
+
class="language-select"
|
|
27
|
+
value={lang}
|
|
28
|
+
onChange={(e) => {
|
|
29
|
+
const newLang = e.currentTarget.value;
|
|
30
|
+
let actualDest = window.location.pathname.replace(langPathRegex, '/');
|
|
31
|
+
if (actualDest == '/') actualDest = `/introduction`;
|
|
32
|
+
window.location.pathname = '/' + newLang + actualDest;
|
|
33
|
+
}}
|
|
34
|
+
>
|
|
35
|
+
{Object.keys(KNOWN_LANGUAGES).map((key) => {
|
|
36
|
+
return (
|
|
37
|
+
<option value={KNOWN_LANGUAGES[key]}>
|
|
38
|
+
{key}
|
|
39
|
+
</option>
|
|
40
|
+
);
|
|
41
|
+
})}
|
|
42
|
+
</select>
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
47
45
|
};
|
|
48
46
|
|
|
49
47
|
export default LanguageSelect;
|
|
@@ -1,34 +1,30 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { h, Fragment } from 'preact'
|
|
3
|
-
import { useEffect, useRef, useState } from 'preact/hooks'
|
|
1
|
+
import { type Component, createSignal, For, onMount } from 'solid-js';
|
|
4
2
|
import Fuse from 'fuse.js'
|
|
5
3
|
import './Search.css'
|
|
6
4
|
|
|
7
|
-
const SearchForm:
|
|
8
|
-
|
|
9
|
-
const [results, setResults] =
|
|
5
|
+
const SearchForm: Component = () => {
|
|
6
|
+
let fuse: null | Fuse<{ url: string, title: string }> = null;
|
|
7
|
+
const [results, setResults] = createSignal([]);
|
|
10
8
|
|
|
11
9
|
const searchContent = (event: SubmitEvent) => {
|
|
12
10
|
event.preventDefault()
|
|
13
|
-
const
|
|
11
|
+
const { search } = Object.fromEntries(
|
|
14
12
|
new FormData(event.currentTarget as HTMLFormElement)
|
|
15
13
|
)
|
|
16
|
-
const result = fuse.
|
|
14
|
+
const result = fuse.search(search as string)
|
|
17
15
|
setResults(result.map(({ item }) => item))
|
|
18
16
|
}
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
fetch('/xs-dev/search-index.json')
|
|
18
|
+
onMount(async () => {
|
|
19
|
+
const content = await fetch('/xs-dev/search-index.json')
|
|
22
20
|
.then((res) => res.json())
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
})
|
|
27
|
-
}, [])
|
|
21
|
+
const options = { keys: ['title', 'description', 'content'] }
|
|
22
|
+
fuse = new Fuse(content, options)
|
|
23
|
+
})
|
|
28
24
|
|
|
29
25
|
return (
|
|
30
26
|
<div class="flex flex-column SearchContainer">
|
|
31
|
-
<form method="
|
|
27
|
+
<form method="get" id="search-form" onSubmit={searchContent}>
|
|
32
28
|
<div role="search" class="flex flex-row">
|
|
33
29
|
<input
|
|
34
30
|
type="search"
|
|
@@ -44,19 +40,19 @@ const SearchForm: FunctionalComponent = () => {
|
|
|
44
40
|
</div>
|
|
45
41
|
</form>
|
|
46
42
|
<ul
|
|
47
|
-
|
|
48
|
-
results.length > 0 ? 'has-results' : undefined
|
|
49
|
-
}`}
|
|
43
|
+
classList={{ 'SearchContainer-list': true, 'has-results': results().length > 0 }}
|
|
50
44
|
aria-live="assertive"
|
|
51
45
|
aria-atomic="true"
|
|
52
46
|
>
|
|
53
|
-
{results
|
|
54
|
-
|
|
55
|
-
<
|
|
56
|
-
{result.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
47
|
+
<For each={results()}>
|
|
48
|
+
{(result) => (
|
|
49
|
+
<li class="SearchContainer-list_item">
|
|
50
|
+
<a href={result.url} class="SearchContainer-link">
|
|
51
|
+
{result.title}
|
|
52
|
+
</a>
|
|
53
|
+
</li>
|
|
54
|
+
)}
|
|
55
|
+
</For>
|
|
60
56
|
</ul>
|
|
61
57
|
</div>
|
|
62
58
|
)
|
|
@@ -1,44 +1,43 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { h, Fragment } from 'preact';
|
|
3
|
-
import { useState, useEffect } from 'preact/hooks';
|
|
1
|
+
import { type Component, createSignal, createEffect } from 'solid-js';
|
|
4
2
|
|
|
5
|
-
const MenuToggle:
|
|
6
|
-
|
|
3
|
+
const MenuToggle: Component = () => {
|
|
4
|
+
const [sidebarShown, setSidebarShown] = createSignal(false);
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
createEffect(() => {
|
|
7
|
+
const [body] = document.getElementsByTagName('body');
|
|
8
|
+
const showSidebar = sidebarShown();
|
|
9
|
+
if (showSidebar) {
|
|
10
|
+
body.classList.add('mobile-sidebar-toggle');
|
|
11
|
+
} else {
|
|
12
|
+
body.classList.remove('mobile-sidebar-toggle');
|
|
13
|
+
}
|
|
14
|
+
});
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
16
|
+
return (
|
|
17
|
+
<button
|
|
18
|
+
type="button"
|
|
19
|
+
aria-pressed={sidebarShown() ? 'true' : 'false'}
|
|
20
|
+
id="menu-toggle"
|
|
21
|
+
onClick={() => setSidebarShown(current => !current)}
|
|
22
|
+
>
|
|
23
|
+
<svg
|
|
24
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
25
|
+
width="1em"
|
|
26
|
+
height="1em"
|
|
27
|
+
fill="none"
|
|
28
|
+
viewBox="0 0 24 24"
|
|
29
|
+
stroke="currentColor"
|
|
30
|
+
>
|
|
31
|
+
<path
|
|
32
|
+
stroke-linecap="round"
|
|
33
|
+
stroke-linejoin="round"
|
|
34
|
+
stroke-width="2"
|
|
35
|
+
d="M4 6h16M4 12h16M4 18h16"
|
|
36
|
+
/>
|
|
37
|
+
</svg>
|
|
38
|
+
<span class="sr-only">Toggle sidebar</span>
|
|
39
|
+
</button>
|
|
40
|
+
);
|
|
42
41
|
};
|
|
43
42
|
|
|
44
43
|
export default MenuToggle;
|
|
@@ -1,39 +1,36 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { h, Fragment } from 'preact'
|
|
3
|
-
import { useState, useEffect, useRef } from 'preact/hooks'
|
|
1
|
+
import { type Component, createSignal, onMount, onCleanup } from 'solid-js';
|
|
4
2
|
import type { MarkdownHeading } from 'astro'
|
|
5
3
|
|
|
6
|
-
const TableOfContents:
|
|
4
|
+
const TableOfContents: Component<{ headings: MarkdownHeading[] }> = ({
|
|
7
5
|
headings = [],
|
|
8
6
|
}) => {
|
|
9
|
-
|
|
10
|
-
const [activeId] =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
7
|
+
let itemOffsets = []
|
|
8
|
+
const [activeId] = createSignal<string>(undefined)
|
|
9
|
+
const getItemOffsets = () => {
|
|
10
|
+
const titles = document.querySelectorAll('article :is(h1, h2, h3, h4)')
|
|
11
|
+
itemOffsets = Array.from(titles).map((title) => ({
|
|
12
|
+
id: title.id,
|
|
13
|
+
topOffset: title.getBoundingClientRect().top + window.scrollY,
|
|
14
|
+
}))
|
|
15
|
+
}
|
|
16
|
+
onMount(() => {
|
|
21
17
|
getItemOffsets()
|
|
22
18
|
window.addEventListener('resize', getItemOffsets)
|
|
19
|
+
})
|
|
23
20
|
|
|
24
|
-
|
|
21
|
+
onCleanup(() => {
|
|
22
|
+
if (typeof window !== 'undefined' && 'removeEventListener' in window) {
|
|
25
23
|
window.removeEventListener('resize', getItemOffsets)
|
|
26
24
|
}
|
|
27
|
-
}
|
|
25
|
+
})
|
|
28
26
|
|
|
29
27
|
return (
|
|
30
28
|
<>
|
|
31
29
|
<h2 class="heading">On this page</h2>
|
|
32
30
|
<ul>
|
|
33
31
|
<li
|
|
34
|
-
class={`header-link depth-2 ${
|
|
35
|
-
|
|
36
|
-
}`.trim()}
|
|
32
|
+
class={`header-link depth-2 ${activeId() === 'overview' ? 'active' : ''
|
|
33
|
+
}`.trim()}
|
|
37
34
|
>
|
|
38
35
|
<a href="#overview">Overview</a>
|
|
39
36
|
</li>
|
|
@@ -41,9 +38,8 @@ const TableOfContents: FunctionalComponent<{ headings: MarkdownHeading[] }> = ({
|
|
|
41
38
|
.filter(({ depth }) => depth > 1 && depth < 4)
|
|
42
39
|
.map((header) => (
|
|
43
40
|
<li
|
|
44
|
-
class={`header-link depth-${header.depth} ${
|
|
45
|
-
|
|
46
|
-
}`.trim()}
|
|
41
|
+
class={`header-link depth-${header.depth} ${activeId() === header.slug ? 'active' : ''
|
|
42
|
+
}`.trim()}
|
|
47
43
|
>
|
|
48
44
|
<a href={`#${header.slug}`}>{header.text}</a>
|
|
49
45
|
</li>
|
|
@@ -1,83 +1,75 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { h, Fragment } from 'preact';
|
|
3
|
-
import { useState, useEffect } from 'preact/hooks';
|
|
1
|
+
import { type Component, createSignal, createEffect } from 'solid-js';
|
|
4
2
|
import './ThemeToggleButton.css';
|
|
5
3
|
|
|
6
|
-
const themes = ['light', 'dark'];
|
|
4
|
+
const themes = ['light', 'dark'] as const;
|
|
7
5
|
|
|
8
6
|
const icons = [
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
7
|
+
<svg
|
|
8
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
9
|
+
width="20"
|
|
10
|
+
height="20"
|
|
11
|
+
viewBox="0 0 20 20"
|
|
12
|
+
fill="currentColor"
|
|
13
|
+
>
|
|
14
|
+
<path
|
|
15
|
+
fill-rule="evenodd"
|
|
16
|
+
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
|
|
17
|
+
clip-rule="evenodd"
|
|
18
|
+
/>
|
|
19
|
+
</svg>,
|
|
20
|
+
<svg
|
|
21
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
22
|
+
width="20"
|
|
23
|
+
height="20"
|
|
24
|
+
viewBox="0 0 20 20"
|
|
25
|
+
fill="currentColor"
|
|
26
|
+
>
|
|
27
|
+
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z" />
|
|
28
|
+
</svg>,
|
|
31
29
|
];
|
|
32
30
|
|
|
33
|
-
const ThemeToggle:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
42
|
-
return 'dark';
|
|
43
|
-
}
|
|
44
|
-
return 'light';
|
|
45
|
-
});
|
|
31
|
+
const ThemeToggle: Component = () => {
|
|
32
|
+
let [theme, setTheme] = createSignal('light');
|
|
33
|
+
if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
|
|
34
|
+
[theme, setTheme] = createSignal(localStorage.getItem('theme'))
|
|
35
|
+
} else if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
36
|
+
[theme, setTheme] = createSignal('dark')
|
|
37
|
+
}
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
39
|
+
createEffect(() => {
|
|
40
|
+
const root = document.documentElement;
|
|
41
|
+
if (theme() === 'light') {
|
|
42
|
+
root.classList.remove('theme-dark');
|
|
43
|
+
} else {
|
|
44
|
+
root.classList.add('theme-dark');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
55
47
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
48
|
+
return (
|
|
49
|
+
<div class="theme-toggle">
|
|
50
|
+
{themes.map((t, i) => {
|
|
51
|
+
const icon = icons[i];
|
|
52
|
+
const checked = t === theme();
|
|
53
|
+
return (
|
|
54
|
+
<label class={checked ? ' checked' : ''}>
|
|
55
|
+
{icon}
|
|
56
|
+
<input
|
|
57
|
+
type="radio"
|
|
58
|
+
name="theme-toggle"
|
|
59
|
+
checked={checked}
|
|
60
|
+
value={t}
|
|
61
|
+
title={`Use ${t} theme`}
|
|
62
|
+
aria-label={`Use ${t} theme`}
|
|
63
|
+
onChange={() => {
|
|
64
|
+
localStorage.setItem('theme', t);
|
|
65
|
+
setTheme(t);
|
|
66
|
+
}}
|
|
67
|
+
/>
|
|
68
|
+
</label>
|
|
69
|
+
);
|
|
70
|
+
})}
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
81
73
|
};
|
|
82
74
|
|
|
83
75
|
export default ThemeToggle;
|
package/docs/tsconfig.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xs-dev",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.6",
|
|
4
4
|
"description": "CLI for automating the setup and usage of Moddable XS tools",
|
|
5
5
|
"types": "build/types/types.d.ts",
|
|
6
6
|
"bin": {
|
|
@@ -46,17 +46,18 @@
|
|
|
46
46
|
"gluegun": "^5.1.2",
|
|
47
47
|
"serialport": "^10.3.0",
|
|
48
48
|
"serve-handler": "^6.1.3",
|
|
49
|
+
"solid-js": "^1.4.3",
|
|
49
50
|
"tar-fs": "^2.1.1",
|
|
50
51
|
"unzip-stream": "^0.3.1",
|
|
51
52
|
"usb": "^2.2.0",
|
|
52
53
|
"windows-shortcuts": "^0.1.6"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
|
-
"@astrojs/
|
|
56
|
-
"@astrojs/
|
|
57
|
-
"@astrojs/
|
|
58
|
-
"@astrojs/
|
|
59
|
-
"@
|
|
56
|
+
"@astrojs/mdx": "^0.16.2",
|
|
57
|
+
"@astrojs/sitemap": "^1.2.1",
|
|
58
|
+
"@astrojs/solid-js": "^2.1.0",
|
|
59
|
+
"@astrojs/tailwind": "^3.1.1",
|
|
60
|
+
"@babel/core": ">=7.20.12 <8.0.0",
|
|
60
61
|
"@changesets/cli": "^2.19.0",
|
|
61
62
|
"@release-it/conventional-changelog": "^5.1.1",
|
|
62
63
|
"@types/jest": "^27.4.0",
|
|
@@ -67,7 +68,7 @@
|
|
|
67
68
|
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
|
68
69
|
"@typescript-eslint/parser": "^4.33.0",
|
|
69
70
|
"@webcomponents/template-shadowroot": "^0.1.0",
|
|
70
|
-
"astro": "^2.
|
|
71
|
+
"astro": "^2.1.5",
|
|
71
72
|
"eslint": "^7.32.0",
|
|
72
73
|
"eslint-config-prettier": "^8.3.0",
|
|
73
74
|
"eslint-config-standard-with-typescript": "^21.0.1",
|
|
@@ -76,9 +77,6 @@
|
|
|
76
77
|
"eslint-plugin-promise": "^5.2.0",
|
|
77
78
|
"fuse.js": "^6.6.2",
|
|
78
79
|
"jest": "^27.4.7",
|
|
79
|
-
"lit": "^2.2.5",
|
|
80
|
-
"preact": "^10.7.3",
|
|
81
|
-
"preact-render-to-string": "^5.2.0",
|
|
82
80
|
"prettier": "^2.5.1",
|
|
83
81
|
"release-it": "^15.6.0",
|
|
84
82
|
"rollup": "^2.78.1",
|