diff --git a/.eslintignore b/.eslintignore index 8b9ef749..cbac6563 100644 --- a/.eslintignore +++ b/.eslintignore @@ -15,4 +15,6 @@ vite.config.js !**/*.mjs **/*.tsx **/*.ts -**/*.json \ No newline at end of file +**/*.json +**/dev-dist +**/dist \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 1b106696..d3aafaaa 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,4 +8,5 @@ packages/mini/krill-parser.js packages/xen/tunejs.js paper pnpm-lock.yaml -pnpm-workspace.yaml \ No newline at end of file +pnpm-workspace.yaml +**/dev-dist \ No newline at end of file diff --git a/packages/react/src/components/CodeMirror6.jsx b/packages/react/src/components/CodeMirror6.jsx index 8b05a727..eb02004a 100644 --- a/packages/react/src/components/CodeMirror6.jsx +++ b/packages/react/src/components/CodeMirror6.jsx @@ -49,11 +49,12 @@ const highlightField = StateField.define({ try { for (let e of tr.effects) { if (e.is(setHighlights)) { + const { haps } = e.value; const marks = - e.value + haps .map((hap) => (hap.context.locations || []).map(({ start, end }) => { - const color = hap.context.color || '#FFCA28'; + const color = hap.context.color || e.value.color || '#FFCA28'; let from = tr.newDoc.line(start.line).from + start.column; let to = tr.newDoc.line(end.line).from + end.column; const l = tr.newDoc.length; @@ -79,9 +80,17 @@ const highlightField = StateField.define({ provide: (f) => EditorView.decorations.from(f), }); -const extensions = [javascript(), strudelTheme, highlightField, flashField]; +const extensions = [javascript(), highlightField, flashField]; -export default function CodeMirror({ value, onChange, onViewChanged, onSelectionChange, options, editorDidMount }) { +export default function CodeMirror({ + value, + onChange, + onViewChanged, + onSelectionChange, + theme, + options, + editorDidMount, +}) { const handleOnChange = useCallback( (value) => { onChange?.(value); @@ -106,6 +115,7 @@ export default function CodeMirror({ value, onChange, onViewChanged, onSelection <> <_CodeMirror value={value} + theme={theme || strudelTheme} onChange={handleOnChange} onCreateEditor={handleOnCreateEditor} onUpdate={handleOnUpdate} diff --git a/packages/react/src/components/MiniRepl.jsx b/packages/react/src/components/MiniRepl.jsx index b2c40d79..27d17983 100644 --- a/packages/react/src/components/MiniRepl.jsx +++ b/packages/react/src/components/MiniRepl.jsx @@ -10,10 +10,21 @@ import { Icon } from './Icon'; import styles from './MiniRepl.module.css'; import './style.css'; import { logger } from '@strudel.cycles/core'; +import useEvent from '../hooks/useEvent.mjs'; +import useKeydown from '../hooks/useKeydown.mjs'; const getTime = () => getAudioContext().currentTime; -export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, drawTime, punchcard, canvasHeight = 200 }) { +export function MiniRepl({ + tune, + hideOutsideView = false, + enableKeyboard, + drawTime, + punchcard, + canvasHeight = 200, + theme, + highlightColor, +}) { drawTime = drawTime || (punchcard ? [0, 4] : undefined); const evalOnMount = !!drawTime; const drawContext = useCallback( @@ -61,6 +72,7 @@ export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, drawTi pattern, active: started && !activeCode?.includes('strudel disable-highlighting'), getTime: () => scheduler.now(), + color: highlightColor, }); // keyboard shortcuts @@ -132,7 +144,7 @@ export function MiniRepl({ tune, hideOutsideView = false, enableKeyboard, drawTi {error &&
{error.message}
}
- {show && } + {show && }
{drawTime && ( { - document.addEventListener(name, onTrigger, useCapture); - return () => { - document.removeEventListener(name, onTrigger, useCapture); - }; - }, [onTrigger]); -} - -// TODO: dedupe -function useKeydown(onTrigger) { - useEvent('keydown', onTrigger, true); -} diff --git a/packages/react/src/components/MiniRepl.module.css b/packages/react/src/components/MiniRepl.module.css index cbbb5a3b..257268a8 100644 --- a/packages/react/src/components/MiniRepl.module.css +++ b/packages/react/src/components/MiniRepl.module.css @@ -1,9 +1,9 @@ .container { - @apply rounded-md overflow-hidden bg-[#222222]; + @apply overflow-hidden; } .header { - @apply flex justify-between bg-slate-700 border-t border-slate-500; + @apply flex justify-between bg-lineHighlight border-t border-l border-r border-lineHighlight rounded-t-md overflow-hidden; } .buttons { @@ -11,11 +11,11 @@ } .button { - @apply cursor-pointer w-16 flex items-center justify-center p-1 bg-slate-700 border-r border-slate-500 text-white hover:bg-slate-600; + @apply cursor-pointer w-16 flex items-center justify-center p-1 border-r border-lineHighlight text-foreground hover:bg-background; } .buttonDisabled { - @apply w-16 flex items-center justify-center p-1 bg-slate-600 text-slate-400 cursor-not-allowed; + @apply w-16 flex items-center justify-center p-1 opacity-50 cursor-not-allowed border-r border-lineHighlight; } .error { diff --git a/packages/react/src/components/style.css b/packages/react/src/components/style.css index d3aed9d7..f2db01cc 100644 --- a/packages/react/src/components/style.css +++ b/packages/react/src/components/style.css @@ -5,10 +5,10 @@ font-size: 18px; } -.cm-theme-light { +.cm-theme { width: 100%; } -.cm-line > * { - background: #00000095; +.cm-theme-light { + width: 100%; } diff --git a/packages/react/src/hooks/useEvent.mjs b/packages/react/src/hooks/useEvent.mjs new file mode 100644 index 00000000..f349c6e7 --- /dev/null +++ b/packages/react/src/hooks/useEvent.mjs @@ -0,0 +1,12 @@ +import { useEffect } from 'react'; + +function useEvent(name, onTrigger, useCapture = false) { + useEffect(() => { + document.addEventListener(name, onTrigger, useCapture); + return () => { + document.removeEventListener(name, onTrigger, useCapture); + }; + }, [onTrigger]); +} + +export default useEvent; diff --git a/packages/react/src/hooks/useHighlighting.mjs b/packages/react/src/hooks/useHighlighting.mjs index 1b7a2ced..84262583 100644 --- a/packages/react/src/hooks/useHighlighting.mjs +++ b/packages/react/src/hooks/useHighlighting.mjs @@ -1,7 +1,7 @@ import { useEffect, useRef } from 'react'; import { setHighlights } from '../components/CodeMirror6'; -function useHighlighting({ view, pattern, active, getTime }) { +function useHighlighting({ view, pattern, active, getTime, color }) { const highlights = useRef([]); const lastEnd = useRef(0); useEffect(() => { @@ -19,9 +19,9 @@ function useHighlighting({ view, pattern, active, getTime }) { highlights.current = highlights.current.filter((hap) => hap.whole.end > audioTime); // keep only highlights that are still active const haps = pattern.queryArc(...span).filter((hap) => hap.hasOnset()); highlights.current = highlights.current.concat(haps); // add potential new onsets - view.dispatch({ effects: setHighlights.of(highlights.current) }); // highlight all still active + new active haps + view.dispatch({ effects: setHighlights.of({ haps: highlights.current, color }) }); // highlight all still active + new active haps } catch (err) { - view.dispatch({ effects: setHighlights.of([]) }); + view.dispatch({ effects: setHighlights.of({ haps: [] }) }); } frame = requestAnimationFrame(updateHighlights); }); @@ -30,10 +30,10 @@ function useHighlighting({ view, pattern, active, getTime }) { }; } else { highlights.current = []; - view.dispatch({ effects: setHighlights.of([]) }); + view.dispatch({ effects: setHighlights.of({ haps: [] }) }); } } - }, [pattern, active, view]); + }, [pattern, active, view, color]); } export default useHighlighting; diff --git a/packages/react/src/index.js b/packages/react/src/index.js index e8a4c447..f9eca1cd 100644 --- a/packages/react/src/index.js +++ b/packages/react/src/index.js @@ -1,9 +1,11 @@ // import 'tailwindcss/tailwind.css'; -export { default as CodeMirror, flash } from './components/CodeMirror6'; -export * from './components/MiniRepl'; -export { default as useHighlighting } from './hooks/useHighlighting'; +export { default as CodeMirror, flash } from './components/CodeMirror6'; // !SSR +export * from './components/MiniRepl'; // !SSR +export { default as useHighlighting } from './hooks/useHighlighting'; // !SSR +export { default as useStrudel } from './hooks/useStrudel'; // !SSR export { default as usePostMessage } from './hooks/usePostMessage'; -export { default as useStrudel } from './hooks/useStrudel'; export { default as useKeydown } from './hooks/useKeydown'; +export { default as useEvent } from './hooks/useEvent'; +export { default as strudelTheme } from './themes/strudel-theme'; export { default as cx } from './cx'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 477cb723..9c7090c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -373,6 +373,7 @@ importers: '@types/node': ^18.0.0 '@types/react': ^18.0.26 '@types/react-dom': ^18.0.9 + '@uiw/codemirror-themes-all': ^4.19.8 '@vite-pwa/astro': ^0.0.1 astro: ^1.7.2 canvas: ^2.11.0 @@ -415,6 +416,7 @@ importers: '@types/node': 18.11.18 '@types/react': 18.0.27 '@types/react-dom': 18.0.10 + '@uiw/codemirror-themes-all': 4.19.8 astro: 1.9.2_@types+node@18.11.18 canvas: 2.11.0 fraction.js: 4.2.0 @@ -3994,6 +3996,173 @@ packages: '@codemirror/view': 6.7.3 dev: false + /@uiw/codemirror-theme-abcdef/4.19.8: + resolution: {integrity: sha512-sR7srfMJRGTsAFQYEs+8IogUxUHDsMqNqZ4waIA6rNIvOH9Q1NYFEqTpqf4AeivkNeXm3N1LI+1nQAKhWzWpOA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-androidstudio/4.19.8: + resolution: {integrity: sha512-xhvEPZ1NvihIJVx7MA1Z8A8NwaTbM6mtBsfwM3mKAmzW6K6JcIJftcKe5z5wSPZk4J3S66vq8RYEMOBygSOdEQ==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-atomone/4.19.8: + resolution: {integrity: sha512-enZR8RPiKohyuEU4DOWA7A/xLs/+NsuvZAuGmg5PU43CQITzK1Wqri43/WxkGGsEIztejX439s1QuYxUwCCeUg==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-aura/4.19.8: + resolution: {integrity: sha512-DLoi2XEPNBD6Cxsp3v/nYw7jJ7sDEXET9+C43KZnk1dQ9H5e0HSpZhOkw1xmaCGzoXn9q7HInPa7GgUEMv8NPA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-bbedit/4.19.8: + resolution: {integrity: sha512-1vaVaVhMP2IB7H77W9yvPRhVr+8HGBWPDfFEVWAc7tfeU0xC2MFby05gO/7T6K2JWyj2lXnVw/i+oFNeDdcekQ==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-bespin/4.19.8: + resolution: {integrity: sha512-JyzmgCloEWhduH5GVYzHQ3vPc3zC0YVRiu7lOjgdOVRhr49M6KmwTytmbmqXbaqmSZKFUJqiHjz8VswqcNC4dw==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-darcula/4.19.8: + resolution: {integrity: sha512-fPKyzMqCtBfez2ubC/77AP0BfE+XOio+sy8oRYfX3HqRQEivnnEddQJnTZVz0kKSLYSryQHbOMw/qwgInPvBCA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-dracula/4.19.8: + resolution: {integrity: sha512-YHQJUDnYKrew/YkEPQG3SQFcnKr6MzVbIXxmdKuxlCTrySNFNMK19dKrzY3fwc+Lgpp5r26QLLocTZyCvu1xeA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-duotone/4.19.8: + resolution: {integrity: sha512-SJkjyKxU2Nazv6uEctvRdz62/ZQ8rBP4xtXrjF/zcjOdWmx2ecUAGn/j5Euw5V55Dr74yIQFs0L+GB5UTHCHDA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-eclipse/4.19.8: + resolution: {integrity: sha512-6XXzYFC809e5MWT/NNTqoZ0N9H6P8mXwIEGDfigh33VU1TJPPpO1LCWdf59VcXx/xIY0ctDp7rU7hTy3f3tHkw==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-github/4.19.8: + resolution: {integrity: sha512-RUAzHGkG2G2PXTxsH4KbKVCKqPs/+H6xvhCT3Q4YiPj1W2aGSfPwZZ8cLLCm9dYaIh/+H6L+AcoiUtvADjyKsQ==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-gruvbox-dark/4.19.8: + resolution: {integrity: sha512-EQepnqhfcu7HY2uutigzflZ9OFzDcF9eq4xF53UylD+WZBdwq2qarZMQgBfOXZZKYI3XcTny064fa7Xxklhs1g==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-material/4.19.8: + resolution: {integrity: sha512-dm7FtZkJSZ4AV+9vXxKUDnXLTHaqWnsmn9HOb6AmLiHmHcLFLDgeosSBnA80fwXBhd6QswJI0cEnKHAvcC/vFg==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-noctis-lilac/4.19.8: + resolution: {integrity: sha512-vPH8KOiRgcBK1V7/BN04n8K03cfR4CEmOGZUMKpcLlSZwWRe0+JPk6S2qtjbJ072Fsn1ZrcLRYrqtaAJQNOVnw==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-nord/4.19.8: + resolution: {integrity: sha512-qBqKJI9fa35rFefXqaiw3FCXWSpD+65+Weji3g/AgB0m0+MHG+3rkC+rLZ4PE2QpkcMz6wHj89EMwOW9W1i3cA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-okaidia/4.19.8: + resolution: {integrity: sha512-gxEThgbbfIxKjk7UzD0D8gw5bVpgxDct3e6r9/WegZw7tTvTHMnz9wutGbJp2cYSwdgLHoQJZzZBi6jKhExZSg==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-solarized/4.19.8: + resolution: {integrity: sha512-xHp2i6zWBMw2+kZX0GUYi7pCL3ZL1qWSO8OaleHCkpY3jn+lfLSJOAYYkajvNyu3tPsiKQuAgpCQ6AYFWOr6BQ==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-sublime/4.19.8: + resolution: {integrity: sha512-tapkCty8lwpRw2CAY5bPiK8S2ptdTL4d1X/IkCVyHqbC0B8728iQJu3E4Rrka7yggFx4QGUpyZB9UTIFYURtsw==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-tokyo-night-day/4.19.8: + resolution: {integrity: sha512-HDKp2KDjluubpe+7M31SohWUFCW7wGQIvoD60xr86OkPZDdqsCVUFmna6rqfttV6S2OsgVNJPBzZvOF398Eapg==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-tokyo-night-storm/4.19.8: + resolution: {integrity: sha512-Kp8HIf1H+pgbRx/ZhRsqqN5qfyx3SVVfjnUPGltsdBymqh8QGdr7LC8Tp0P5+Yjb6CqF6Dgx7RnQDj1XZ94rbA==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-tokyo-night/4.19.8: + resolution: {integrity: sha512-LrfB+EgZqBNlMF6Zqk8RrlsfVzKe6Ple7ckvREV6kSuwxncF5FlhzVL3cWgxNfNQ7TJ5ySVSvw4fWOcxIcc1LQ==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-vscode/4.19.8: + resolution: {integrity: sha512-UdUuJfNjG2y88taP5gsEA9AQlhRTURnl+9kl+LOJkQtXavrqp3J8gUAHRhEWxN7k8q8YimsSVcQ4yw0FKAgXQQ==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-theme-xcode/4.19.8: + resolution: {integrity: sha512-VYCRhStYujUNGIkiaZZ1o5OO2Z2edsKkYCCYSy0rwb4G17vT6sd4YDnmJQuF0gzqQkTIdDxSb6aCM9ISkPABlg==} + dependencies: + '@uiw/codemirror-themes': 4.19.8 + dev: false + + /@uiw/codemirror-themes-all/4.19.8: + resolution: {integrity: sha512-0kAWabe46Vkz+gwNfaXvn/0adeUSCTAuZC0d7Nu8ebcr1TjT1fDLFNZIXlwidn40suiXq8FDfZ9euArx3RPg0Q==} + dependencies: + '@uiw/codemirror-theme-abcdef': 4.19.8 + '@uiw/codemirror-theme-androidstudio': 4.19.8 + '@uiw/codemirror-theme-atomone': 4.19.8 + '@uiw/codemirror-theme-aura': 4.19.8 + '@uiw/codemirror-theme-bbedit': 4.19.8 + '@uiw/codemirror-theme-bespin': 4.19.8 + '@uiw/codemirror-theme-darcula': 4.19.8 + '@uiw/codemirror-theme-dracula': 4.19.8 + '@uiw/codemirror-theme-duotone': 4.19.8 + '@uiw/codemirror-theme-eclipse': 4.19.8 + '@uiw/codemirror-theme-github': 4.19.8 + '@uiw/codemirror-theme-gruvbox-dark': 4.19.8 + '@uiw/codemirror-theme-material': 4.19.8 + '@uiw/codemirror-theme-noctis-lilac': 4.19.8 + '@uiw/codemirror-theme-nord': 4.19.8 + '@uiw/codemirror-theme-okaidia': 4.19.8 + '@uiw/codemirror-theme-solarized': 4.19.8 + '@uiw/codemirror-theme-sublime': 4.19.8 + '@uiw/codemirror-theme-tokyo-night': 4.19.8 + '@uiw/codemirror-theme-tokyo-night-day': 4.19.8 + '@uiw/codemirror-theme-tokyo-night-storm': 4.19.8 + '@uiw/codemirror-theme-vscode': 4.19.8 + '@uiw/codemirror-theme-xcode': 4.19.8 + '@uiw/codemirror-themes': 4.19.8 + dev: false + /@uiw/codemirror-themes/4.19.7_a4vbhepr4qhxm5cldqd4jpyase: resolution: {integrity: sha512-M/42RkPI60ItlssmNuEoZO2MQvlY6fRmdX7XRUAhKjxczZoaq8xS6HIvv1whGf2zGsTrwdVTPCm6ls0l17dvPA==} peerDependencies: @@ -4005,6 +4174,14 @@ packages: '@codemirror/view': 6.7.3 dev: false + /@uiw/codemirror-themes/4.19.8: + resolution: {integrity: sha512-k+0molX6YuQZ7vYymS5DEl3NcHxVE4VP4J0nB7RBnzLrhDwT2K8R5ie7J2eH+4bpppIK1ZZdZ6Mie7U48dH5dQ==} + dependencies: + '@codemirror/language': 6.4.0 + '@codemirror/state': 6.2.0 + '@codemirror/view': 6.7.3 + dev: false + /@uiw/react-codemirror/4.19.7_b6o5qp6ml4k7skggixohr5abde: resolution: {integrity: sha512-IHvpYWVSdiaHX0Fk6oY6YyAJigDnyvSpWKNUTRzsMNxB+8/wqZ8lior4TprXH0zyLxW5F1+bTyifFFTeg+X3Sw==} peerDependencies: @@ -10221,6 +10398,17 @@ packages: - supports-color dev: true + /postcss-import/14.1.0: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.1 + dev: false + /postcss-import/14.1.0_postcss@8.4.21: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} @@ -10231,6 +10419,16 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 + dev: true + + /postcss-js/4.0.0: + resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.3.3 + dependencies: + camelcase-css: 2.0.1 + dev: false /postcss-js/4.0.0_postcss@8.4.21: resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} @@ -10240,6 +10438,23 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.21 + dev: true + + /postcss-load-config/3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.6 + yaml: 1.10.2 + dev: false /postcss-load-config/3.1.4_postcss@8.4.21: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -10257,6 +10472,15 @@ packages: postcss: 8.4.21 yaml: 1.10.2 + /postcss-nested/6.0.0: + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss-selector-parser: 6.0.11 + dev: false + /postcss-nested/6.0.0_postcss@8.4.21: resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} @@ -10265,6 +10489,7 @@ packages: dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.11 + dev: true /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -11873,6 +12098,8 @@ packages: resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} engines: {node: '>=12.13.0'} hasBin: true + peerDependencies: + postcss: ^8.0.9 dependencies: arg: 5.0.2 chokidar: 3.5.3 @@ -11889,10 +12116,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.21 - postcss-import: 14.1.0_postcss@8.4.21 - postcss-js: 4.0.0_postcss@8.4.21 - postcss-load-config: 3.1.4_postcss@8.4.21 - postcss-nested: 6.0.0_postcss@8.4.21 + postcss-import: 14.1.0 + postcss-js: 4.0.0 + postcss-load-config: 3.1.4 + postcss-nested: 6.0.0 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 diff --git a/website/package.json b/website/package.json index b07c9f0f..5393d1b8 100644 --- a/website/package.json +++ b/website/package.json @@ -38,6 +38,7 @@ "@types/node": "^18.0.0", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", + "@uiw/codemirror-themes-all": "^4.19.8", "astro": "^1.7.2", "canvas": "^2.11.0", "fraction.js": "^4.2.0", diff --git a/website/src/components/HeadCommon.astro b/website/src/components/HeadCommon.astro index ce00f97e..796f96db 100644 --- a/website/src/components/HeadCommon.astro +++ b/website/src/components/HeadCommon.astro @@ -1,9 +1,12 @@ --- import { pwaInfo } from 'virtual:pwa-info'; import '../styles/index.css'; +import { settings } from '../repl/themes.mjs'; const { BASE_URL } = import.meta.env; const base = BASE_URL; + +const { strudelTheme } = settings; --- @@ -27,4 +30,55 @@ const base = BASE_URL; + + + + {pwaInfo && } + + diff --git a/website/src/components/Header/Header.astro b/website/src/components/Header/Header.astro index 8bb9497d..4055a641 100644 --- a/website/src/components/Header/Header.astro +++ b/website/src/components/Header/Header.astro @@ -19,13 +19,13 @@ const langCode = 'en'; // getLanguageFromURL(currentPage); const sidebar = SIDEBAR[langCode]; --- -