diff --git a/.astro/settings.json b/.astro/settings.json new file mode 100644 index 000000000..bf82959bd --- /dev/null +++ b/.astro/settings.json @@ -0,0 +1,5 @@ +{ + "devToolbar": { + "enabled": false + } +} \ No newline at end of file diff --git a/packages/codemirror/themes.mjs b/packages/codemirror/themes.mjs index 1a523b391..dd561d30b 100644 --- a/packages/codemirror/themes.mjs +++ b/packages/codemirror/themes.mjs @@ -198,6 +198,7 @@ export function activateTheme(name) { const themeSettings = settings[name] || settings.strudelTheme; // set css variables themeStyle.innerHTML = `:root { + color-scheme: ${themeSettings.light ? 'light' : 'dark'}; ${Object.entries(themeSettings) // important to override fallback .map(([key, value]) => `--${key}: ${value} !important;`) diff --git a/packages/codemirror/themes/CutiePi.mjs b/packages/codemirror/themes/CutiePi.mjs index 64b38eaa7..f535a2dad 100644 --- a/packages/codemirror/themes/CutiePi.mjs +++ b/packages/codemirror/themes/CutiePi.mjs @@ -17,13 +17,15 @@ export const settings = { background: 'white', lineBackground: 'transparent', foreground: deepPurple, + muted: deepPurple + '50', caret: '#797977', selection: yellowPink, selectionMatch: '#2B323D', - gutterBackground: grey, + gutterBackground: pinkAccent, gutterForeground: lightGrey, gutterBorder: 'transparent', lineHighlight: pinkAccent, + light: true, }; export default createTheme({ diff --git a/packages/codemirror/themes/algoboy.mjs b/packages/codemirror/themes/algoboy.mjs index 049ed596d..5eb90ff79 100644 --- a/packages/codemirror/themes/algoboy.mjs +++ b/packages/codemirror/themes/algoboy.mjs @@ -31,6 +31,7 @@ const palette = palettes['Sour Watermelon B']; export const settings = { background: palette[3], foreground: palette[1], + muted: palette[1] + '50', caret: palette[0], selection: palette[0], selectionMatch: palette[1], diff --git a/packages/codemirror/themes/androidstudio.mjs b/packages/codemirror/themes/androidstudio.mjs index 77c16c331..35b5b7464 100644 --- a/packages/codemirror/themes/androidstudio.mjs +++ b/packages/codemirror/themes/androidstudio.mjs @@ -8,6 +8,7 @@ export const settings = { background: '#282b2e', lineBackground: '#282b2e99', foreground: '#a9b7c6', + muted: '#a9b7c650', caret: '#00FF00', selection: '#343739', selectionMatch: '#343739', @@ -19,6 +20,7 @@ export default createTheme({ settings: { background: '#282b2e', foreground: '#a9b7c6', + muted: '#a9b7c650', caret: '#00FF00', selection: '#4e5254', selectionMatch: '#4e5254', diff --git a/packages/codemirror/themes/archBtw.mjs b/packages/codemirror/themes/archBtw.mjs index 87546569c..3bc5684ea 100644 --- a/packages/codemirror/themes/archBtw.mjs +++ b/packages/codemirror/themes/archBtw.mjs @@ -12,6 +12,7 @@ export const settings = { background: hex[0], lineBackground: 'transparent', foreground: hex[1], + muted: hex[2], selection: hex[2], selectionMatch: hex[0], gutterBackground: hex[0], diff --git a/packages/codemirror/themes/atomone.mjs b/packages/codemirror/themes/atomone.mjs index ab9cd3607..bc7a3254a 100644 --- a/packages/codemirror/themes/atomone.mjs +++ b/packages/codemirror/themes/atomone.mjs @@ -11,6 +11,7 @@ export const settings = { background: '#272C35', lineBackground: '#272C3599', foreground: 'hsl(220, 14%, 71%)', + muted: 'hsl(220, 14%, 41%)', caret: '#797977', selection: '#ffffff30', selectionMatch: '#2B323D', @@ -25,6 +26,7 @@ export default createTheme({ settings: { background: '#272C35', foreground: '#9d9b97', + muted: 'hsl(220, 14%, 41%)', caret: '#797977', selection: '#3d4c64', selectionMatch: '#3d4c64', diff --git a/packages/codemirror/themes/aura.mjs b/packages/codemirror/themes/aura.mjs index b42a5839b..08bb5ea24 100644 --- a/packages/codemirror/themes/aura.mjs +++ b/packages/codemirror/themes/aura.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#21202e', lineBackground: '#21202e99', foreground: '#edecee', + muted: '#edecee50', caret: '#a277ff', selection: '#3d375e7f', selectionMatch: '#3d375e7f', @@ -18,6 +19,7 @@ export default createTheme({ settings: { background: '#21202e', foreground: '#edecee', + muted: '#edecee50', caret: '#a277ff', selection: '#5a51898f', selectionMatch: '#5a51898f', diff --git a/packages/codemirror/themes/bbedit.mjs b/packages/codemirror/themes/bbedit.mjs index 535bf9eaa..0555ac1a4 100644 --- a/packages/codemirror/themes/bbedit.mjs +++ b/packages/codemirror/themes/bbedit.mjs @@ -6,6 +6,7 @@ export const settings = { background: '#FFFFFF', lineBackground: '#FFFFFF99', foreground: '#000000', + muted: '#00000050', caret: '#FBAC52', selection: '#FFD420', selectionMatch: '#FFD420', @@ -20,6 +21,7 @@ export default createTheme({ settings: { background: '#FFFFFF', foreground: '#000000', + muted: '#00000050', caret: '#FBAC52', selection: '#FFD420', selectionMatch: '#FFD420', diff --git a/packages/codemirror/themes/blackscreen.mjs b/packages/codemirror/themes/blackscreen.mjs index 2c45df11b..462dc200b 100644 --- a/packages/codemirror/themes/blackscreen.mjs +++ b/packages/codemirror/themes/blackscreen.mjs @@ -2,7 +2,8 @@ import { tags as t } from '@lezer/highlight'; import { createTheme } from './theme-helper.mjs'; export const settings = { background: 'black', - foreground: 'white', // whats that? + foreground: 'white', + muted: '#ffffff50', caret: 'white', selection: '#ffffff20', selectionMatch: '#036dd626', diff --git a/packages/codemirror/themes/bluescreen.mjs b/packages/codemirror/themes/bluescreen.mjs index 97d165c9d..a3b9648d8 100644 --- a/packages/codemirror/themes/bluescreen.mjs +++ b/packages/codemirror/themes/bluescreen.mjs @@ -3,7 +3,8 @@ import { createTheme } from './theme-helper.mjs'; export const settings = { background: '#051DB5', lineBackground: '#051DB550', - foreground: 'white', // whats that? + foreground: 'white', + muted: '#ffffff50', caret: 'white', selection: 'rgba(128, 203, 196, 0.5)', selectionMatch: '#036dd626', diff --git a/packages/codemirror/themes/bluescreenlight.mjs b/packages/codemirror/themes/bluescreenlight.mjs index 031a3da33..7e10659fa 100644 --- a/packages/codemirror/themes/bluescreenlight.mjs +++ b/packages/codemirror/themes/bluescreenlight.mjs @@ -11,6 +11,7 @@ export const settings = { background: hex[0], lineBackground: 'transparent', foreground: hex[2], + muted: hex[3], selection: hex[3], selectionMatch: hex[0], gutterBackground: hex[0], diff --git a/packages/codemirror/themes/darcula.mjs b/packages/codemirror/themes/darcula.mjs index ead66e663..ee510764b 100644 --- a/packages/codemirror/themes/darcula.mjs +++ b/packages/codemirror/themes/darcula.mjs @@ -9,6 +9,7 @@ export const settings = { background: '#242424', lineBackground: '#24242499', foreground: '#f8f8f2', + muted: '#f8f8f250', caret: '#FFFFFF', selection: 'rgba(255, 255, 255, 0.1)', selectionMatch: 'rgba(255, 255, 255, 0.2)', @@ -23,6 +24,7 @@ export default createTheme({ settings: { background: '#242424', foreground: '#f8f8f2', + muted: '#f8f8f250', caret: '#FFFFFF', selection: 'rgba(255, 255, 255, 0.1)', selectionMatch: 'rgba(255, 255, 255, 0.2)', diff --git a/packages/codemirror/themes/dracula.mjs b/packages/codemirror/themes/dracula.mjs index bdd9617de..514b63719 100644 --- a/packages/codemirror/themes/dracula.mjs +++ b/packages/codemirror/themes/dracula.mjs @@ -11,6 +11,7 @@ export const settings = { background: '#282a36', lineBackground: '#282a3699', foreground: '#f8f8f2', + muted: '#f8f8f250', caret: '#f8f8f0', selection: 'rgba(255, 255, 255, 0.1)', selectionMatch: 'rgba(255, 255, 255, 0.2)', @@ -27,6 +28,7 @@ export default createTheme({ settings: { background: '#282a36', foreground: '#f8f8f2', + muted: '#f8f8f250', caret: '#f8f8f0', selection: 'rgba(255, 255, 255, 0.1)', selectionMatch: 'rgba(255, 255, 255, 0.2)', diff --git a/packages/codemirror/themes/duotoneDark.mjs b/packages/codemirror/themes/duotoneDark.mjs index f54973e85..72e07cd66 100644 --- a/packages/codemirror/themes/duotoneDark.mjs +++ b/packages/codemirror/themes/duotoneDark.mjs @@ -10,6 +10,7 @@ export const settings = { background: '#2a2734', lineBackground: '#2a273499', foreground: '#eeebff', + muted: '#eeebff50', caret: '#ffad5c', selection: 'rgba(255, 255, 255, 0.1)', gutterBackground: '#2a2734', @@ -22,6 +23,7 @@ export default createTheme({ settings: { background: '#2a2734', foreground: '#6c6783', + muted: '#eeebff50', caret: '#ffad5c', selection: '#9a86fd', selectionMatch: '#9a86fd', diff --git a/packages/codemirror/themes/eclipse.mjs b/packages/codemirror/themes/eclipse.mjs index 8082b59da..8c3671eb7 100644 --- a/packages/codemirror/themes/eclipse.mjs +++ b/packages/codemirror/themes/eclipse.mjs @@ -6,6 +6,7 @@ export const settings = { background: '#fff', lineBackground: '#ffffff99', foreground: '#000', + muted: '#00000050', caret: '#FFFFFF', selection: '#d7d4f0', selectionMatch: '#d7d4f0', @@ -20,6 +21,7 @@ export default createTheme({ settings: { background: '#fff', foreground: '#000', + muted: '#00000050', caret: '#FFFFFF', selection: '#d7d4f0', selectionMatch: '#d7d4f0', diff --git a/packages/codemirror/themes/fruitDaw.mjs b/packages/codemirror/themes/fruitDaw.mjs index c9e557796..68b7857e7 100644 --- a/packages/codemirror/themes/fruitDaw.mjs +++ b/packages/codemirror/themes/fruitDaw.mjs @@ -23,6 +23,7 @@ export const settings = { background: hex[0], lineBackground: 'transparent', foreground: hex[10], + muted: hex[7], selection: hex[8], selectionMatch: hex[0], gutterBackground: hex[3], diff --git a/packages/codemirror/themes/githubDark.mjs b/packages/codemirror/themes/githubDark.mjs index 477e7d7b8..3b11eac38 100644 --- a/packages/codemirror/themes/githubDark.mjs +++ b/packages/codemirror/themes/githubDark.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#0d1117', lineBackground: '#0d111799', foreground: '#c9d1d9', + muted: '#c9d1d950', caret: '#c9d1d9', selection: '#003d73', selectionMatch: '#003d73', @@ -16,6 +17,7 @@ export default createTheme({ settings: { background: '#0d1117', foreground: '#c9d1d9', + muted: '#c9d1d950', caret: '#c9d1d9', selection: '#003d73', selectionMatch: '#003d73', diff --git a/packages/codemirror/themes/githubLight.mjs b/packages/codemirror/themes/githubLight.mjs index 2ccec93b6..26b1d5725 100644 --- a/packages/codemirror/themes/githubLight.mjs +++ b/packages/codemirror/themes/githubLight.mjs @@ -6,6 +6,7 @@ export const settings = { background: '#fff', lineBackground: '#ffffff99', foreground: '#24292e', + muted: '#24292e50', selection: '#BBDFFF', selectionMatch: '#BBDFFF', gutterBackground: '#fff', @@ -17,6 +18,7 @@ export default createTheme({ settings: { background: '#fff', foreground: '#24292e', + muted: '#24292e50', selection: '#BBDFFF', selectionMatch: '#BBDFFF', gutterBackground: '#fff', diff --git a/packages/codemirror/themes/green-text.mjs b/packages/codemirror/themes/green-text.mjs index 08c7a4bbe..7d3a47fb2 100644 --- a/packages/codemirror/themes/green-text.mjs +++ b/packages/codemirror/themes/green-text.mjs @@ -13,6 +13,7 @@ export const settings = { background: hex[0], lineBackground: 'transparent', foreground: hex[2], + muted: hex[2] + '50', selection: hex[4], selectionMatch: hex[0], gutterBackground: hex[0], diff --git a/packages/codemirror/themes/gruvboxDark.mjs b/packages/codemirror/themes/gruvboxDark.mjs index 67d8bffc1..2cc9274e1 100644 --- a/packages/codemirror/themes/gruvboxDark.mjs +++ b/packages/codemirror/themes/gruvboxDark.mjs @@ -10,6 +10,7 @@ export const settings = { background: '#282828', lineBackground: '#28282899', foreground: '#ebdbb2', + muted: '#ebdbb250', caret: '#ebdbb2', selection: '#bdae93', selectionMatch: '#bdae93', @@ -23,6 +24,7 @@ export default createTheme({ settings: { background: '#282828', foreground: '#ebdbb2', + muted: '#ebdbb250', caret: '#ebdbb2', selection: '#b99d555c', selectionMatch: '#b99d555c', diff --git a/packages/codemirror/themes/gruvboxLight.mjs b/packages/codemirror/themes/gruvboxLight.mjs index 5d4b4ec01..8e529b21d 100644 --- a/packages/codemirror/themes/gruvboxLight.mjs +++ b/packages/codemirror/themes/gruvboxLight.mjs @@ -11,6 +11,7 @@ export const settings = { background: '#fbf1c7', lineBackground: '#fbf1c799', foreground: '#3c3836', + muted: '#3c383650', caret: '#af3a03', selection: '#ebdbb2', selectionMatch: '#bdae93', @@ -25,6 +26,7 @@ export default createTheme({ settings: { background: '#fbf1c7', foreground: '#3c3836', + muted: '#3c383650', caret: '#af3a03', selection: '#bdae9391', selectionMatch: '#bdae9391', diff --git a/packages/codemirror/themes/materialDark.mjs b/packages/codemirror/themes/materialDark.mjs index f13412885..0c4ef0545 100644 --- a/packages/codemirror/themes/materialDark.mjs +++ b/packages/codemirror/themes/materialDark.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#212121', lineBackground: '#21212199', foreground: '#bdbdbd', + muted: '#bdbdbd50', caret: '#a0a4ae', selection: '#d7d4f0', selectionMatch: '#d7d4f0', @@ -19,6 +20,7 @@ export default createTheme({ settings: { background: '#212121', foreground: '#bdbdbd', + muted: '#bdbdbd50', caret: '#a0a4ae', selection: '#d7d4f063', selectionMatch: '#d7d4f063', diff --git a/packages/codemirror/themes/materialLight.mjs b/packages/codemirror/themes/materialLight.mjs index d2598c649..798842bf2 100644 --- a/packages/codemirror/themes/materialLight.mjs +++ b/packages/codemirror/themes/materialLight.mjs @@ -5,7 +5,8 @@ export const settings = { light: true, background: '#FAFAFA', lineBackground: '#FAFAFA99', - foreground: '#90A4AE', + foreground: '#6182B8', + muted: '#6182B850', caret: '#272727', selection: '#80CBC440', selectionMatch: '#FAFAFA', @@ -19,6 +20,7 @@ export default createTheme({ settings: { background: '#FAFAFA', foreground: '#90A4AE', + muted: '#6182B850', caret: '#272727', selection: '#80CBC440', selectionMatch: '#80CBC440', diff --git a/packages/codemirror/themes/monokai.mjs b/packages/codemirror/themes/monokai.mjs index 294b946b5..926e38219 100644 --- a/packages/codemirror/themes/monokai.mjs +++ b/packages/codemirror/themes/monokai.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#272822', lineBackground: '#27282299', foreground: '#FFFFFF', + muted: '#FFFFFF50', caret: '#FFFFFF', selection: '#49483E', selectionMatch: '#49483E', @@ -18,6 +19,7 @@ export default createTheme({ settings: { background: '#272822', foreground: '#FFFFFF', + muted: '#FFFFFF50', caret: '#FFFFFF', selection: '#49483E', selectionMatch: '#49483E', diff --git a/packages/codemirror/themes/noctisLilac.mjs b/packages/codemirror/themes/noctisLilac.mjs index b11c6b40b..398043394 100644 --- a/packages/codemirror/themes/noctisLilac.mjs +++ b/packages/codemirror/themes/noctisLilac.mjs @@ -6,6 +6,7 @@ export const settings = { background: '#f2f1f8', lineBackground: '#f2f1f899', foreground: '#0c006b', + muted: '#0c006b50', caret: '#5c49e9', selection: '#d5d1f2', selectionMatch: '#d5d1f2', @@ -19,6 +20,7 @@ export default createTheme({ settings: { background: '#f2f1f8', foreground: '#0c006b', + muted: '#0c006b50', caret: '#5c49e9', selection: '#d5d1f2', selectionMatch: '#d5d1f2', diff --git a/packages/codemirror/themes/nord.mjs b/packages/codemirror/themes/nord.mjs index ce96bca57..efa4b6bf5 100644 --- a/packages/codemirror/themes/nord.mjs +++ b/packages/codemirror/themes/nord.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#2e3440', lineBackground: '#2e344099', foreground: '#FFFFFF', + muted: '#FFFFFF50', caret: '#FFFFFF', selection: '#3b4252', selectionMatch: '#e5e9f0', @@ -20,6 +21,7 @@ export default createTheme({ settings: { background: '#2e3440', foreground: '#FFFFFF', + muted: '#FFFFFF50', caret: '#FFFFFF', selection: '#00000073', selectionMatch: '#00000073', diff --git a/packages/codemirror/themes/red-text.mjs b/packages/codemirror/themes/red-text.mjs index 44dda5dc0..5ba9d2152 100644 --- a/packages/codemirror/themes/red-text.mjs +++ b/packages/codemirror/themes/red-text.mjs @@ -13,6 +13,7 @@ export const settings = { background: hex[0], lineBackground: 'transparent', foreground: hex[2], + muted: hex[2] + '50', selection: hex[4], selectionMatch: hex[0], gutterBackground: hex[0], diff --git a/packages/codemirror/themes/solarizedDark.mjs b/packages/codemirror/themes/solarizedDark.mjs index c6b645f7a..6848b537e 100644 --- a/packages/codemirror/themes/solarizedDark.mjs +++ b/packages/codemirror/themes/solarizedDark.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#002b36', lineBackground: '#002b3699', foreground: '#93a1a1', + muted: '#93a1a150', caret: '#839496', selection: '#173541', selectionMatch: '#aafe661a', @@ -45,6 +46,7 @@ export default createTheme({ settings: { background: c.background, foreground: c.foreground, + muted: c.muted, caret: c.cursor, selection: c.selection, selectionMatch: c.selection, diff --git a/packages/codemirror/themes/solarizedLight.mjs b/packages/codemirror/themes/solarizedLight.mjs index b6828ff6c..0a0c61a12 100644 --- a/packages/codemirror/themes/solarizedLight.mjs +++ b/packages/codemirror/themes/solarizedLight.mjs @@ -8,6 +8,7 @@ export const settings = { background: '#fdf6e3', lineBackground: '#fdf6e399', foreground: '#657b83', + muted: '#657b8350', caret: '#586e75', selection: '#dfd9c8', selectionMatch: '#dfd9c8', @@ -19,6 +20,7 @@ export const settings = { const c = { background: '#FDF6E3', foreground: '#657B83', + muted: '#657b8350', selection: '#EEE8D5', selectionMatch: '#EEE8D5', cursor: '#657B83', diff --git a/packages/codemirror/themes/sonic-pink.mjs b/packages/codemirror/themes/sonic-pink.mjs index 5a19555ab..19c5e5e87 100644 --- a/packages/codemirror/themes/sonic-pink.mjs +++ b/packages/codemirror/themes/sonic-pink.mjs @@ -13,6 +13,7 @@ export const settings = { background: '#000000', lineBackground: 'transparent', foreground: hex[4], + muted: hex[6], selection: hex[6], gutterBackground: hex[0], gutterForeground: hex[5], diff --git a/packages/codemirror/themes/strudel-theme.mjs b/packages/codemirror/themes/strudel-theme.mjs index 7c4a3a919..58c675638 100644 --- a/packages/codemirror/themes/strudel-theme.mjs +++ b/packages/codemirror/themes/strudel-theme.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#222', lineBackground: '#22222299', foreground: '#fff', + muted: '#8a919966', caret: '#ffcc00', selection: 'rgba(128, 203, 196, 0.5)', selectionMatch: '#036dd626', diff --git a/packages/codemirror/themes/sublime.mjs b/packages/codemirror/themes/sublime.mjs index 068b9bac9..111f1e505 100644 --- a/packages/codemirror/themes/sublime.mjs +++ b/packages/codemirror/themes/sublime.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#303841', lineBackground: '#30384199', foreground: '#FFFFFF', + muted: '#FFFFFF50', caret: '#FBAC52', selection: '#4C5964', selectionMatch: '#3A546E', @@ -18,6 +19,7 @@ export default createTheme({ settings: { background: '#303841', foreground: '#FFFFFF', + muted: '#FFFFFF50', caret: '#FBAC52', selection: '#4C5964', selectionMatch: '#3A546E', diff --git a/packages/codemirror/themes/teletext.mjs b/packages/codemirror/themes/teletext.mjs index 7857cb133..280eda979 100644 --- a/packages/codemirror/themes/teletext.mjs +++ b/packages/codemirror/themes/teletext.mjs @@ -9,7 +9,8 @@ let colorD = '#f8fc55'; export const settings = { background: '#000000', - foreground: colorA, // whats that? + foreground: colorA, + muted: colorA + '50', caret: colorC, selection: colorD, selectionMatch: colorA, diff --git a/packages/codemirror/themes/tokioNightStorm.mjs b/packages/codemirror/themes/tokioNightStorm.mjs index be973d52f..ab940da01 100644 --- a/packages/codemirror/themes/tokioNightStorm.mjs +++ b/packages/codemirror/themes/tokioNightStorm.mjs @@ -4,7 +4,8 @@ import { createTheme } from './theme-helper.mjs'; export const settings = { background: '#24283b', lineBackground: '#24283b99', - foreground: '#7982a9', + foreground: '#f9f2f9', + muted: '#f9f2f950', caret: '#c0caf5', selection: '#6f7bb630', selectionMatch: '#1f2335', @@ -18,7 +19,8 @@ export default createTheme({ theme: 'dark', settings: { background: '#24283b', - foreground: '#7982a9', + foreground: '#f9f2f9', + muted: '#f9f2f950', caret: '#c0caf5', selection: '#6f7bb630', selectionMatch: '#343b5f', diff --git a/packages/codemirror/themes/tokyoNight.mjs b/packages/codemirror/themes/tokyoNight.mjs index c325b4ad7..29a656676 100644 --- a/packages/codemirror/themes/tokyoNight.mjs +++ b/packages/codemirror/themes/tokyoNight.mjs @@ -4,7 +4,8 @@ import { createTheme } from './theme-helper.mjs'; export const settings = { background: '#1a1b26', lineBackground: '#1a1b2699', - foreground: '#787c99', + foreground: '#f8fcf9', + muted: '#f8fcf950', caret: '#c0caf5', selection: '#515c7e40', selectionMatch: '#16161e', @@ -18,7 +19,8 @@ export default createTheme({ theme: 'dark', settings: { background: '#1a1b26', - foreground: '#787c99', + foreground: '#f8fcf9', + muted: '#f8fcf950', caret: '#c0caf5', selection: '#515c7e40', selectionMatch: '#16161e', diff --git a/packages/codemirror/themes/tokyoNightDay.mjs b/packages/codemirror/themes/tokyoNightDay.mjs index 1cd58a412..a8f5f75b0 100644 --- a/packages/codemirror/themes/tokyoNightDay.mjs +++ b/packages/codemirror/themes/tokyoNightDay.mjs @@ -6,6 +6,7 @@ export const settings = { background: '#e1e2e7', lineBackground: '#e1e2e799', foreground: '#3760bf', + muted: '#3760bf50', caret: '#3760bf', selection: '#99a7df', selectionMatch: '#99a7df', @@ -20,6 +21,7 @@ export default createTheme({ settings: { background: '#e1e2e7', foreground: '#3760bf', + muted: '#3760bf50', caret: '#3760bf', selection: '#99a7df', selectionMatch: '#99a7df', diff --git a/packages/codemirror/themes/vscodeDark.mjs b/packages/codemirror/themes/vscodeDark.mjs index 703790fd5..9ccc4d078 100644 --- a/packages/codemirror/themes/vscodeDark.mjs +++ b/packages/codemirror/themes/vscodeDark.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#1e1e1e', lineBackground: '#1e1e1e99', foreground: '#fff', + muted: '#ffffff50', caret: '#c6c6c6', selection: '#6199ff2f', selectionMatch: '#72a1ff59', @@ -19,6 +20,7 @@ export default createTheme({ settings: { background: '#1e1e1e', foreground: '#fff', + muted: '#ffffff50', caret: '#c6c6c6', selection: '#6199ff2f', selectionMatch: '#72a1ff59', diff --git a/packages/codemirror/themes/vscodeLight.mjs b/packages/codemirror/themes/vscodeLight.mjs index 9a7345114..71817e8a6 100644 --- a/packages/codemirror/themes/vscodeLight.mjs +++ b/packages/codemirror/themes/vscodeLight.mjs @@ -5,6 +5,7 @@ export const settings = { background: '#ffffff', lineBackground: '#ffffff50', foreground: '#383a42', + muted: '#383a4250', caret: '#000', selection: '#add6ff', selectionMatch: '#a8ac94', @@ -20,6 +21,7 @@ export default createTheme({ settings: { background: '#ffffff', foreground: '#383a42', + muted: '#383a4250', caret: '#000', selection: '#add6ff', selectionMatch: '#a8ac94', diff --git a/packages/codemirror/themes/whitescreen.mjs b/packages/codemirror/themes/whitescreen.mjs index a2937c380..fa034fb80 100644 --- a/packages/codemirror/themes/whitescreen.mjs +++ b/packages/codemirror/themes/whitescreen.mjs @@ -2,7 +2,8 @@ import { tags as t } from '@lezer/highlight'; import { createTheme } from './theme-helper.mjs'; export const settings = { background: 'white', - foreground: 'black', // whats that? + foreground: 'black', + muted: '#00000050', caret: 'black', selection: 'rgba(128, 203, 196, 0.5)', selectionMatch: '#ffffff26', diff --git a/packages/codemirror/themes/xcodeLight.mjs b/packages/codemirror/themes/xcodeLight.mjs index 8977c133e..b2c857988 100644 --- a/packages/codemirror/themes/xcodeLight.mjs +++ b/packages/codemirror/themes/xcodeLight.mjs @@ -6,6 +6,7 @@ export const settings = { background: '#fff', lineBackground: '#ffffff99', foreground: '#3D3D3D', + muted: '#3D3D3D50', selection: '#BBDFFF', selectionMatch: '#BBDFFF', gutterBackground: '#fff', @@ -18,6 +19,7 @@ export default createTheme({ settings: { background: '#fff', foreground: '#3D3D3D', + muted: '#3D3D3D50', selection: '#BBDFFF', selectionMatch: '#BBDFFF', gutterBackground: '#fff', diff --git a/packages/core/controls.mjs b/packages/core/controls.mjs index 834d963c3..a5a1c0a12 100644 --- a/packages/core/controls.mjs +++ b/packages/core/controls.mjs @@ -3046,6 +3046,7 @@ registerSubControls('lfo', [ ['skew', 'sk'], ['curve', 'cu'], ['sync', 's'], + ['retrig', 'rt'], ['fxi'], ]); registerSubControls('env', [ @@ -3132,13 +3133,14 @@ Pattern.prototype.modulate = function (type, config, idPat) { * @param {string | Pattern} [config.control] Node to modulate. Aliases: c * @param {string | Pattern} [config.subControl] Sub-control name to append to the control key. Aliases: sc * @param {number | Pattern} [config.rate] Modulation rate. Aliases: r + * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s * @param {number | Pattern} [config.depth] Relative modulation depth. Aliases: dep, dr * @param {number | Pattern} [config.depthabs] Absolute modulation depth. Aliases: da * @param {number | Pattern} [config.dcoffset] DC offset / bias for the waveform. Aliases: dc * @param {number | Pattern} [config.shape] Shape index. Aliases: sh * @param {number | Pattern} [config.skew] Skew amount. Aliases: sk * @param {number | Pattern} [config.curve] Exponential curve amount. Aliases: cu - * @param {number | Pattern} [config.sync] Tempo-synced modulation rate. Aliases: s + * @param {number | Pattern} [config.retrig] If > 0.5, the LFO will retrigger on each event. Aliases: rt * @param {number | Pattern} [config.fxi] FX index to target * @param {string | Pattern} id ID to use for this modulator * @returns Pattern diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index b7a047bfc..df9990982 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1055,91 +1055,88 @@ function _composeOp(a, b, func) { return func(a, b); } -// Make composers -(function () { - // pattern composers - const composers = { - set: [(a, b) => b], - keep: [(a) => a], - keepif: [(a, b) => (b ? a : undefined)], +// pattern composers +const COMPOSERS = { + set: [(a, b) => b], + keep: [(a) => a], + keepif: [(a, b) => (b ? a : undefined)], - // numerical functions - /** - * - * Assumes a pattern of numbers. Adds the given number to each item in the pattern. - * @name add - * @memberof Pattern - * @tags math - * @example - * // Here, the triad 0, 2, 4 is shifted by different amounts - * n("0 2 4".add("<0 3 4 0>")).scale("C:major") - * // Without add, the equivalent would be: - * // n("<[0 2 4] [3 5 7] [4 6 8] [0 2 4]>").scale("C:major") - * @example - * // You can also use add with notes: - * note("c3 e3 g3".add("<0 5 7 0>")) - * // Behind the scenes, the notes are converted to midi numbers: - * // note("48 52 55".add("<0 5 7 0>")) - */ - add: [numeralArgs((a, b) => a + b)], // support string concatenation - /** - * - * Like add, but the given numbers are subtracted. - * @name sub - * @memberof Pattern - * @tags math - * @example - * n("0 2 4".sub("<0 1 2 3>")).scale("C4:minor") - * // See add for more information. - */ - sub: [numeralArgs((a, b) => a - b)], - /** - * - * Multiplies each number by the given factor. - * @name mul - * @memberof Pattern - * @tags math - * @example - * "<1 1.5 [1.66, <2 2.33>]>*4".mul(150).freq() - */ - mul: [numeralArgs((a, b) => a * b)], - /** - * - * Divides each number by the given factor. - * @name div - * @memberof Pattern - * @tags math - */ - div: [numeralArgs((a, b) => a / b)], - mod: [numeralArgs(_mod)], - pow: [numeralArgs(Math.pow)], - log2: [numeralArgs(Math.log2)], - band: [numeralArgs((a, b) => a & b)], - bor: [numeralArgs((a, b) => a | b)], - bxor: [numeralArgs((a, b) => a ^ b)], - blshift: [numeralArgs((a, b) => a << b)], - brshift: [numeralArgs((a, b) => a >> b)], + // numerical functions + /** + * + * Assumes a pattern of numbers. Adds the given number to each item in the pattern. + * @name add + * @memberof Pattern + * @tags math + * @example + * // Here, the triad 0, 2, 4 is shifted by different amounts + * n("0 2 4".add("<0 3 4 0>")).scale("C:major") + * // Without add, the equivalent would be: + * // n("<[0 2 4] [3 5 7] [4 6 8] [0 2 4]>").scale("C:major") + * @example + * // You can also use add with notes: + * note("c3 e3 g3".add("<0 5 7 0>")) + * // Behind the scenes, the notes are converted to midi numbers: + * // note("48 52 55".add("<0 5 7 0>")) + */ + add: [numeralArgs((a, b) => a + b)], // support string concatenation + /** + * + * Like add, but the given numbers are subtracted. + * @name sub + * @memberof Pattern + * @tags math + * @example + * n("0 2 4".sub("<0 1 2 3>")).scale("C4:minor") + * // See add for more information. + */ + sub: [numeralArgs((a, b) => a - b)], + /** + * + * Multiplies each number by the given factor. + * @name mul + * @memberof Pattern + * @tags math + * @example + * "<1 1.5 [1.66, <2 2.33>]>*4".mul(150).freq() + */ + mul: [numeralArgs((a, b) => a * b)], + /** + * + * Divides each number by the given factor. + * @name div + * @memberof Pattern + * @tags math + */ + div: [numeralArgs((a, b) => a / b)], + mod: [numeralArgs(_mod)], + pow: [numeralArgs(Math.pow)], + log2: [numeralArgs(Math.log2)], + band: [numeralArgs((a, b) => a & b)], + bor: [numeralArgs((a, b) => a | b)], + bxor: [numeralArgs((a, b) => a ^ b)], + blshift: [numeralArgs((a, b) => a << b)], + brshift: [numeralArgs((a, b) => a >> b)], - // TODO - force numerical comparison if both look like numbers? - lt: [(a, b) => a < b], - gt: [(a, b) => a > b], - lte: [(a, b) => a <= b], - gte: [(a, b) => a >= b], - eq: [(a, b) => a == b], - eqt: [(a, b) => a === b], - ne: [(a, b) => a != b], - net: [(a, b) => a !== b], - and: [(a, b) => a && b], - or: [(a, b) => a || b], + // TODO - force numerical comparison if both look like numbers? + lt: [(a, b) => a < b], + gt: [(a, b) => a > b], + lte: [(a, b) => a <= b], + gte: [(a, b) => a >= b], + eq: [(a, b) => a == b], + eqt: [(a, b) => a === b], + ne: [(a, b) => a != b], + net: [(a, b) => a !== b], + and: [(a, b) => a && b], + or: [(a, b) => a || b], - // bitwise ops - func: [(a, b) => b(a)], - }; - - const hows = ['In', 'Out', 'Mix', 'Squeeze', 'SqueezeOut', 'Reset', 'Restart', 'Poly']; + // bitwise ops + func: [(a, b) => b(a)], +}; +const _setupAlignments = () => { // generate methods to do what and how - for (const [what, [op, preprocess]] of Object.entries(composers)) { + for (const [what, [op, preprocess]] of Object.entries(COMPOSERS)) { // make plain version, e.g. pat._add(value) adds that plain value // to all the values in pat Pattern.prototype['_' + what] = function (value) { @@ -1148,16 +1145,18 @@ function _composeOp(a, b, func) { // make patternified monster version Object.defineProperty(Pattern.prototype, what, { + // Set to configurable so we can update if the default alignment changes + configurable: true, // a getter that returns a function, so 'pat' can be // accessed by closures that are methods of that function.. get: function () { const pat = this; // wrap the 'in' function as default behaviour - const wrapper = (...other) => pat[what]['in'](...other); + const wrapper = (...other) => pat[what][DEFAULT_ALIGNMENT](...other); // add methods to that function for each behaviour - for (const how of hows) { + for (const how of ALIGNMENTS) { wrapper[how.toLowerCase()] = function (...other) { var howpat = pat; other = sequence(other); @@ -1182,15 +1181,23 @@ function _composeOp(a, b, func) { return wrapper; }, }); - - // Default op to 'set', e.g. pat.squeeze(pat2) = pat.set.squeeze(pat2) - for (const how of hows) { - Pattern.prototype[how.toLowerCase()] = function (...args) { - return this.set[how.toLowerCase()](args); - }; - } } +}; +let DEFAULT_ALIGNMENT = 'in'; +const ALIGNMENTS = ['In', 'Out', 'Mix', 'Squeeze', 'SqueezeOut', 'Reset', 'Restart', 'Poly']; +const ALIGNMENT_KEYS = ALIGNMENTS.map((how) => how.toLowerCase()); + +// Make composers +(function () { + _setupAlignments(); + + // Default op to 'set', e.g. pat.squeeze(pat2) = pat.set.squeeze(pat2) + for (const how of ALIGNMENTS) { + Pattern.prototype[how.toLowerCase()] = function (...args) { + return this.set[how.toLowerCase()](args); + }; + } // binary composers /** * Applies the given structure to the pattern: @@ -1249,6 +1256,27 @@ function _composeOp(a, b, func) { }; })(); +/** + * Sets the default method of combining events from two patterns (aka [alignment](https://strudel.cc/technical-manual/alignment/)) in Strudel. + * The default method is 'in', meaning that patterns to the left will (typically) dictate the event timings when combined with patterns to the right. + * By changing alignment to 'out', the opposite will happen. With 'mix', they will combine their event timings. + * + * Note that we say the _default_ method, because alignments can also be set explicitly with calls like + * 'add.mix', 'set.squeeze', etc. + * + * @param {string} method Default join method to use. Options: 'in', 'out', 'mix', 'squeeze', 'squeezeout', 'reset', 'restart', 'poly' + * @example + * setDefaultJoin('mix') // also try 'in', 'out', 'squeeze', etc. + * s("saw").vel("1 0.5").note("F A C E").delay("0 0.2 0.3") + */ +export const setDefaultJoin = (alignment) => { + alignment = alignment?.toLowerCase(); + if (DEFAULT_ALIGNMENT !== alignment && ALIGNMENT_KEYS.includes(alignment)) { + DEFAULT_ALIGNMENT = alignment; + _setupAlignments(); + } +}; + // aliases export const polyrhythm = stack; export const pr = stack; diff --git a/packages/superdough/modulators.mjs b/packages/superdough/modulators.mjs index 05674baa0..76fc4c7fd 100644 --- a/packages/superdough/modulators.mjs +++ b/packages/superdough/modulators.mjs @@ -98,6 +98,7 @@ export const connectLFO = (id, params, nodeTracker) => { fxi = 'main', depth = 1, depthabs, + retrig = 0, ...filteredParams } = params; const { targetParams, paramName } = getTargetParamsForControl(control, nodeTracker[fxi], subControl); @@ -109,7 +110,7 @@ export const connectLFO = (id, params, nodeTracker) => { const modParams = { ...filteredParams, frequency: sync !== undefined ? sync * cps : rate, - time: cycle / cps, + time: retrig > 0.5 ? 0 : cycle / cps, depth: depthValue, min, max, diff --git a/test/__snapshots__/examples.test.mjs.snap b/test/__snapshots__/examples.test.mjs.snap index 284f18557..4d2675308 100644 --- a/test/__snapshots__/examples.test.mjs.snap +++ b/test/__snapshots__/examples.test.mjs.snap @@ -10874,6 +10874,35 @@ exports[`runs examples > example "seqPLoop" example index 0 1`] = ` ] `; +exports[`runs examples > example "setDefaultJoin" example index 0 1`] = ` +[ + "[ 0/1 → 1/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 1/4 → 1/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 1/3 → 1/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 1/2 → 2/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 2/3 → 3/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 3/4 → 1/1 | s:saw velocity:0.5 note:E delay:0.3 ]", + "[ 1/1 → 5/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 5/4 → 4/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 4/3 → 3/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 3/2 → 5/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 5/3 → 7/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 7/4 → 2/1 | s:saw velocity:0.5 note:E delay:0.3 ]", + "[ 2/1 → 9/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 9/4 → 7/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 7/3 → 5/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 5/2 → 8/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 8/3 → 11/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 11/4 → 3/1 | s:saw velocity:0.5 note:E delay:0.3 ]", + "[ 3/1 → 13/4 | s:saw velocity:1 note:F delay:0 ]", + "[ 13/4 → 10/3 | s:saw velocity:1 note:A delay:0 ]", + "[ 10/3 → 7/2 | s:saw velocity:1 note:A delay:0.2 ]", + "[ 7/2 → 11/3 | s:saw velocity:0.5 note:C delay:0.2 ]", + "[ 11/3 → 15/4 | s:saw velocity:0.5 note:C delay:0.3 ]", + "[ 15/4 → 4/1 | s:saw velocity:0.5 note:E delay:0.3 ]", +] +`; + exports[`runs examples > example "setGainCurve" example index 0 1`] = ` [ "[ 0/1 → 1/4 | s:bd gain:0.5 ]", diff --git a/vitest.setup.mjs b/vitest.setup.mjs index ea965df6d..7b582a458 100644 --- a/vitest.setup.mjs +++ b/vitest.setup.mjs @@ -1,7 +1,9 @@ import { afterEach } from 'vitest'; import { useRNG } from './packages/core/signal.mjs'; +import { setDefaultJoin } from './packages/core/pattern.mjs'; afterEach(() => { // Avoid bleed between tests useRNG('legacy'); + setDefaultJoin('in'); }); diff --git a/website/src/components/HeadCommon.astro b/website/src/components/HeadCommon.astro index fe8d34bb2..550222e44 100644 --- a/website/src/components/HeadCommon.astro +++ b/website/src/components/HeadCommon.astro @@ -33,6 +33,7 @@ const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL